[linbox] 03/05: Imported Upstream version 1.4.1

Doug Torrance dtorrance-guest at moszumanska.debian.org
Tue Jul 19 19:14:13 UTC 2016


This is an automated email from the git hooks/post-receive script.

dtorrance-guest pushed a commit to branch master
in repository linbox.

commit 2937572400565a72833a796852ebabf0471000c7
Author: Doug Torrance <dtorrance at piedmont.edu>
Date:   Mon Jul 18 10:06:41 2016 -0400

    Imported Upstream version 1.4.1
---
 .gitignore                                         |     82 +
 AUTHORS                                            |      1 +
 CHANGED-INTERFACES                                 |     75 +
 ChangeLog                                          |     22 +-
 HACKING                                            |      4 +
 INSTALL                                            |    370 -
 Makefile.am                                        |     36 +-
 Makefile.in                                        |    983 -
 NEWS                                               |      6 +-
 README                                             |     12 +-
 RELEASE-INSTRUCTIONS                               |     28 +
 TODO                                               |     60 +-
 aclocal.m4                                         |    998 -
 auto-install.sh                                    |     34 +-
 autogen.sh                                         |    200 +
 benchmarks/BenchmarkFile.h                         |    107 +
 benchmarks/BenchmarkFile.inl                       |    198 +
 benchmarks/CSValue.h                               |    153 +
 benchmarks/Makefile.am                             |     84 +-
 benchmarks/Makefile.in                             |    650 -
 benchmarks/README                                  |     95 +
 benchmarks/benchmark-crafixed.C                    |    384 -
 benchmarks/benchmark-example.C                     |    368 +
 benchmarks/benchmark-fgemm.C                       |    955 -
 benchmarks/benchmark-ftrXm.C                       |    823 -
 benchmarks/benchmark-metadata.C                    |     43 +
 benchmarks/benchmark-metadata.h                    |    520 +
 benchmarks/benchmark-order-basis.C                 |    395 +
 benchmarks/benchmark-utils.C                       |    354 +
 benchmarks/benchmark-utils.h                       |    307 +
 benchmarks/benchmark.C                             |   1597 +
 benchmarks/benchmark.doxy                          |      2 +-
 benchmarks/benchmark.h                             |   1338 +-
 benchmarks/benchmark.inl                           |    182 +
 benchmarks/block-coppersmith-benchmark.C           |     93 +
 benchmarks/data/Makefile.am                        |     24 +
 benchmarks/gen-blocks.C                            |    184 +
 benchmarks/invariant-factors-benchmark.C           |    183 +
 benchmarks/matrix/Makefile.am                      |     22 +
 benchmarks/matrix/bibd_12_5_66x792.sms             |   7922 ++
 benchmarks/matrix/bibd_12_5_66x792.sms.gz          |    Bin 0 -> 19387 bytes
 benchmarks/matrix/bibd_13_6_78x1716.sms            |  25742 +++++
 benchmarks/matrix/bibd_13_6_78x1716.sms.gz         |    Bin 0 -> 64275 bytes
 benchmarks/matrix/bibd_14_7_91x3432.sms            |  72074 ++++++++++++
 benchmarks/matrix/bibd_14_7_91x3432.sms.gz         |    Bin 0 -> 176023 bytes
 benchmarks/omp-benchmark.C                         |    320 +
 benchmarks/optimizer.h                             |     85 +
 benchmarks/perfpublisher.sh                        |    169 +
 build-aux/config.guess                             |   1545 -
 build-aux/config.sub                               |   1791 -
 build-aux/install-sh                               |    527 -
 build-aux/ltmain.sh                                |   9655 --
 build-aux/missing                                  |    331 -
 config.h.in                                        |    173 -
 configure                                          |  21334 ----
 configure.ac                                       |    261 +-
 doc/Makefile.am                                    |      4 +-
 doc/Makefile.in                                    |    611 -
 doc/install-1.0.html                               |    164 +
 doc/install-dev.html                               |      6 +-
 doc/mainpage.doxy                                  |     18 +-
 doc/organization/Linbox.draft                      |     60 +
 doc/organization/Makefile.am                       |     24 +
 doc/tex/Makefile.am                                |     38 +
 doc/tutorial.doxy                                  |     22 +-
 doc/tutorial.html                                  |    207 -
 doc/versionning.doxy                               |    141 +
 examples/Makefile.am                               |     61 +-
 examples/Makefile.in                               |    948 -
 examples/Readme                                    |      1 +
 examples/athadet.C                                 |    107 +
 examples/bench-fft.C                               |    249 +
 examples/bench-matpoly-mult.C                      |    495 +
 examples/bigmat.C                                  |     68 +
 examples/blackbox/Makefile.am                      |     44 +
 examples/blackbox/ex-mat0.C                        |     91 +
 examples/blackbox/example.C                        |    166 +
 examples/blackbox/load-det.C                       |     98 +
 examples/blackbox/load-minpoly.C                   |    117 +
 examples/blackbox/load-symmetrize.C                |    103 +
 examples/blackbox/mat.txt                          |      9 +
 examples/blackbox/mat2.txt                         |      6 +
 examples/blackbox/random-rank.C                    |    108 +
 examples/blackbox/smith.C                          |    576 +
 examples/charpoly.C                                |     61 +-
 examples/checksolve.C                              |     22 +-
 examples/data/Makefile.am                          |     23 +
 examples/data/mat.txt                              |      8 +
 examples/data/mat2.txt                             |      6 +
 examples/data/test.matrix                          |     28 +
 examples/data/wikivote                             | 103691 ++++++++++++++++++
 examples/det.C                                     |     19 +-
 examples/dot-product.C                             |     20 +-
 examples/doubledet.C                               |     22 +-
 examples/echelon.C                                 |     29 +-
 examples/fields/Makefile.am                        |      6 +-
 examples/fields/Makefile.in                        |    584 -
 examples/fields/ex-fields-archetype.C              |      4 +-
 examples/fields/ex-fields.C                        |      6 +-
 examples/fields/modular-int.C                      |      6 +-
 examples/find-invariant-factors.C                  |     79 +
 examples/gf3-invariant-factors.C                   |    122 +
 examples/graph-charpoly.C                          |     26 +-
 examples/grid_reduce.C                             |    451 +
 examples/iliopoulos2.C                             |    137 +
 examples/integer-mul.C                             |     71 +
 examples/invariant-factors.C                       |    137 +
 examples/makefile.mpi                              |     66 +
 examples/map-sparse-test.C                         |     55 +
 examples/map-sparse.h                              |    200 +
 examples/map-sparse.inl                            |    594 +
 examples/minpoly.C                                 |     30 +-
 examples/mpidet.C                                  |    101 +
 examples/nullspacebasis.C                          |     68 +
 examples/nullspacebasis_rank.C                     |     91 +
 examples/omp_block_rank.C                          |    574 +
 examples/omp_smithvalence.C                        |    236 +
 examples/poly-smith.C                              |    141 +
 examples/power_rank.C                              |    117 +
 examples/poweroftwo_ranks.C                        |    110 +
 examples/qchar.C                                   |    548 +
 examples/rank.C                                    |     91 +-
 examples/rr.C                                      |     99 +
 examples/samplebb.C                                |    277 +
 examples/smith.C                                   |    149 +-
 examples/smithvalence.C                            |     31 +-
 examples/smithvalence.h                            |    202 +-
 examples/solve.C                                   |    137 +-
 examples/solver/Makefile.am                        |     38 +
 examples/solver/t-rdisolve.C                       |    529 +
 examples/sparseelimdet.C                           |     49 +-
 examples/sparseelimrank.C                          |     48 +-
 examples/test.sh                                   |     32 +
 examples/valence.C                                 |     26 +-
 incremente-versions                                |    115 +
 interfaces/Makefile.in                             |    665 -
 interfaces/driver/Makefile.am                      |      6 +-
 interfaces/driver/Makefile.in                      |    730 -
 interfaces/driver/compile-readme.txt               |      4 +
 interfaces/driver/lb-blackbox-data.h               |      5 +-
 interfaces/driver/lb-blackbox-functor.h            |      2 +-
 interfaces/driver/lb-blackbox-type.h               |      2 +-
 interfaces/driver/lb-blackbox.C                    |      2 +-
 interfaces/driver/lb-charpoly.C                    |      8 +-
 interfaces/driver/lb-det.C                         |      2 +-
 interfaces/driver/lb-domain-data.h                 |      2 +-
 interfaces/driver/lb-domain-functor.h              |      2 +-
 interfaces/driver/lb-domain-type.h                 |     46 +-
 interfaces/driver/lb-solve.C                       |    234 +
 interfaces/driver/lb-vector-data.h                 |      4 +-
 interfaces/driver/lb-vector-functor.h              |      2 +-
 interfaces/driver/lb-vector.C                      |      2 +-
 interfaces/kaapi/Makefile.in                       |    574 -
 interfaces/kaapi/communicate.h                     |     10 +-
 interfaces/maple-old/Makefile.am                   |     37 +
 interfaces/maple-old/Makefile.in.1                 |    232 +
 interfaces/maple-old/Makefile.in.2                 |    372 +
 interfaces/maple-old/README                        |     75 +
 interfaces/maple-old/demonstration.mws             |    291 +
 interfaces/maple-old/lbffpack.mpl                  |    165 +
 interfaces/maple-old/lbmaple-ffpack.C              |    444 +
 interfaces/maple-old/lbmaple.C                     |   1441 +
 interfaces/maple-old/lbmaple.mpl.head              |     11 +
 interfaces/maple-old/lbmaple.mpl.tail              |    377 +
 interfaces/maple/Makefile.am                       |      4 +-
 interfaces/maple/Makefile.in                       |    665 -
 interfaces/maple/lb-maple-path.pl                  |      4 +
 interfaces/maple/lb-maple-path.sh                  |      7 +
 interfaces/maple/lb-maple-utilities.h              |      2 +-
 interfaces/maple/lb-maple.mpl.bak                  |    320 +
 interfaces/maple/linbox-demonstration-good.mw      |   2248 +
 interfaces/maple/linbox-demonstration.mw           |   2248 +
 interfaces/sage/Makefile.am                        |     11 +-
 interfaces/sage/Makefile.in                        |    657 -
 interfaces/sage/linbox-sage.C                      |    136 +-
 interfaces/sage/linbox-sage.h                      |      4 +-
 linbox-config.in                                   |     15 +-
 linbox.pc.in                                       |     14 +
 linbox/Makefile.am                                 |     44 +-
 linbox/Makefile.in                                 |    825 -
 linbox/algorithms/Makefile.am                      |    249 +-
 linbox/algorithms/Makefile.in                      |    880 -
 linbox/algorithms/alt-blackbox-block-container.h   |    104 +
 linbox/algorithms/bbcharpoly.h                     |    148 +-
 linbox/algorithms/bbsolve.h                        |     14 +-
 linbox/algorithms/blackbox-block-container-base.h  |     91 +-
 linbox/algorithms/blackbox-block-container.h       |     24 +-
 linbox/algorithms/blackbox-container-base.h        |     37 +-
 linbox/algorithms/blackbox-container-symmetric.h   |      2 +-
 linbox/algorithms/blackbox-container.h             |     25 +-
 linbox/algorithms/blas-domain-multimod.h           |     94 -
 linbox/algorithms/blas-domain.h                    |    827 -
 linbox/algorithms/blas-domain.inl                  |   1507 -
 linbox/algorithms/block-coppersmith-domain.h       |    875 +
 linbox/algorithms/block-lanczos.h                  |     10 +-
 linbox/algorithms/block-lanczos.inl                |     68 +-
 linbox/algorithms/block-massey-domain.h            |    425 +-
 linbox/algorithms/block-wiedemann.h                |    107 +-
 linbox/algorithms/bm-seq.h                         |    716 -
 linbox/algorithms/charpoly-rational.h              |     76 +-
 linbox/algorithms/cia.h                            |     41 +-
 .../algorithms/classic-rational-reconstruction.h   |     13 +-
 linbox/algorithms/coppersmith-invariant-factors.h  |    193 +
 linbox/algorithms/coppersmith.h                    |    479 +
 linbox/algorithms/cra-domain-omp.h                 |     12 +-
 linbox/algorithms/cra-domain-seq.h                 |     55 +-
 linbox/algorithms/cra-domain.h                     |      9 +-
 linbox/algorithms/cra-early-multip.h               |     81 +-
 linbox/algorithms/cra-early-single.h               |      8 +-
 linbox/algorithms/cra-full-multip-fixed.h          |     16 +-
 linbox/algorithms/cra-full-multip.h                |    311 +-
 linbox/algorithms/cra-givrnsfixed.h                |     68 +-
 linbox/algorithms/cra-mpi.h                        |      4 +-
 linbox/algorithms/cra.doxy                         |      2 +-
 linbox/algorithms/dense-container.h                |     16 +-
 linbox/algorithms/dense-nullspace.h                |     72 +-
 linbox/algorithms/dense-nullspace.inl              |    760 +-
 linbox/algorithms/density.h                        |     85 +
 linbox/algorithms/det-rational.h                   |     43 +-
 linbox/algorithms/diophantine-solver.C             |      4 +-
 linbox/algorithms/diophantine-solver.h             |     11 +-
 linbox/algorithms/diophantine-solver.inl           |      7 +-
 linbox/algorithms/double-det.h                     |     34 +-
 linbox/algorithms/dyadic-to-rational.h             |     51 +-
 linbox/algorithms/echelon-form.h                   |     45 +-
 linbox/algorithms/eliminator.h                     |      7 +-
 linbox/algorithms/eliminator.inl                   |     46 +-
 linbox/algorithms/fast-rational-reconstruction.h   |     65 +-
 linbox/algorithms/gauss.h                          |     53 +-
 linbox/algorithms/gauss/Makefile.in                |    585 -
 linbox/algorithms/gauss/gauss-elim-gf2.inl         |     65 +-
 linbox/algorithms/gauss/gauss-elim.inl             |    203 +-
 linbox/algorithms/gauss/gauss-gf2.inl              |    107 +-
 linbox/algorithms/gauss/gauss-nullspace.inl        |     34 +-
 linbox/algorithms/gauss/gauss-pivot-gf2.inl        |     32 +-
 linbox/algorithms/gauss/gauss-pivot.inl            |     49 +-
 linbox/algorithms/gauss/gauss-solve-gf2.inl        |     23 +-
 linbox/algorithms/gauss/gauss-solve.inl            |     34 +-
 linbox/algorithms/gauss/gauss.inl                  |   1410 +-
 linbox/algorithms/hybrid-det.h                     |    172 +-
 linbox/algorithms/iml.doxy                         |     29 +
 linbox/algorithms/invariant-factors.h              |    271 +
 linbox/algorithms/la-block-lanczos.h               |     27 +-
 linbox/algorithms/la-block-lanczos.inl             |     52 +-
 linbox/algorithms/lanczos.h                        |      7 +-
 linbox/algorithms/lanczos.inl                      |     46 +-
 linbox/algorithms/last-invariant-factor.h          |     94 +-
 linbox/algorithms/lattice.doxy                     |      2 +-
 linbox/algorithms/lattice.h                        |     15 +-
 linbox/algorithms/lattice.inl                      |     13 +-
 linbox/algorithms/lifting-container.h              |    347 +-
 linbox/algorithms/linbox-tags.h                    |     95 -
 linbox/algorithms/massey-domain.h                  |    148 +-
 linbox/algorithms/matpoly-mult.h                   |    508 +-
 linbox/algorithms/matrix-blas3/Makefile.am         |      4 +-
 linbox/algorithms/matrix-blas3/Makefile.in         |    579 -
 linbox/algorithms/matrix-blas3/blas3.doxy          |      2 +-
 linbox/algorithms/matrix-blas3/mul-cra.inl         |    191 +
 linbox/algorithms/matrix-blas3/mul-flint.inl       |    116 +
 linbox/algorithms/matrix-blas3/mul-naive.inl       |     49 +-
 linbox/algorithms/matrix-blas3/mul-toomcook.inl    |    509 +-
 linbox/algorithms/matrix-blas3/mul.h               |     68 +-
 linbox/algorithms/matrix-hom.h                     |    322 +-
 linbox/algorithms/matrix-inverse.h                 |     13 +-
 linbox/algorithms/matrix-rank.h                    |     15 +-
 linbox/algorithms/mg-block-lanczos.h               |     28 +-
 linbox/algorithms/mg-block-lanczos.inl             |    148 +-
 linbox/algorithms/minpoly-integer.h                |     47 +-
 linbox/algorithms/minpoly-rational.h               |     81 +-
 linbox/algorithms/one-invariant-factor.h           |      6 +-
 linbox/algorithms/opencl-environ.h                 |    375 +
 linbox/algorithms/opencl-kernels/Makefile.am       |     34 +
 linbox/algorithms/opencl-kernels/file-list.txt     |     40 +
 .../kernel-axmy-modulus-dp-unroll.cl               |     95 +
 .../opencl-kernels/kernel-axmy-modulus-dp.cl       |     68 +
 .../kernel-axmy-modulus-sp-unroll.cl               |     94 +
 .../opencl-kernels/kernel-axmy-modulus-sp.cl       |     67 +
 .../kernel-axmy-partial-1024-dp-unroll.cl          |     93 +
 .../opencl-kernels/kernel-axmy-partial-1024-dp.cl  |     79 +
 .../kernel-axmy-partial-1024-sp-unroll.cl          |     92 +
 .../opencl-kernels/kernel-axmy-partial-1024-sp.cl  |     78 +
 .../kernel-axmy-partial-16-sp-unroll.cl            |     79 +
 .../opencl-kernels/kernel-axmy-partial-16-sp.cl    |     66 +
 .../kernel-axmy-partial-32-dp-unroll.cl            |     93 +
 .../opencl-kernels/kernel-axmy-partial-32-dp.cl    |     79 +
 .../kernel-axmy-partial-32-sp-unroll.cl            |     92 +
 .../opencl-kernels/kernel-axmy-partial-32-sp.cl    |     78 +
 .../kernel-axmy-partial-8-dp-unroll.cl             |     82 +
 .../opencl-kernels/kernel-axmy-partial-8-dp.cl     |     71 +
 .../kernel-axpy-modulus-dp-unroll.cl               |     95 +
 .../opencl-kernels/kernel-axpy-modulus-dp.cl       |     68 +
 .../kernel-axpy-modulus-sp-unroll.cl               |     94 +
 .../opencl-kernels/kernel-axpy-modulus-sp.cl       |     67 +
 .../kernel-axpy-partial-1024-dp-unroll.cl          |     93 +
 .../opencl-kernels/kernel-axpy-partial-1024-dp.cl  |     79 +
 .../kernel-axpy-partial-1024-sp-unroll.cl          |     92 +
 .../opencl-kernels/kernel-axpy-partial-1024-sp.cl  |     78 +
 .../kernel-axpy-partial-16-sp-unroll.cl            |     79 +
 .../opencl-kernels/kernel-axpy-partial-16-sp.cl    |     66 +
 .../kernel-axpy-partial-32-dp-unroll.cl            |     93 +
 .../opencl-kernels/kernel-axpy-partial-32-dp.cl    |     79 +
 .../kernel-axpy-partial-32-sp-unroll.cl            |     92 +
 .../opencl-kernels/kernel-axpy-partial-32-sp.cl    |     78 +
 .../kernel-axpy-partial-8-dp-unroll.cl             |     82 +
 .../opencl-kernels/kernel-axpy-partial-8-dp.cl     |     71 +
 .../kernel-maxpy-modulus-dp-unroll.cl              |     95 +
 .../opencl-kernels/kernel-maxpy-modulus-dp.cl      |     68 +
 .../kernel-maxpy-modulus-sp-unroll.cl              |     94 +
 .../opencl-kernels/kernel-maxpy-modulus-sp.cl      |     67 +
 .../kernel-maxpy-partial-1024-dp-unroll.cl         |     93 +
 .../opencl-kernels/kernel-maxpy-partial-1024-dp.cl |     79 +
 .../kernel-maxpy-partial-1024-sp-unroll.cl         |     92 +
 .../opencl-kernels/kernel-maxpy-partial-1024-sp.cl |     78 +
 .../kernel-maxpy-partial-16-sp-unroll.cl           |     79 +
 .../opencl-kernels/kernel-maxpy-partial-16-sp.cl   |     66 +
 .../kernel-maxpy-partial-32-dp-unroll.cl           |     93 +
 .../opencl-kernels/kernel-maxpy-partial-32-dp.cl   |     79 +
 .../kernel-maxpy-partial-32-sp-unroll.cl           |     92 +
 .../opencl-kernels/kernel-maxpy-partial-32-sp.cl   |     78 +
 .../kernel-maxpy-partial-8-dp-unroll.cl            |     82 +
 .../opencl-kernels/kernel-maxpy-partial-8-dp.cl    |     71 +
 .../opencl-kernels/kernel-modulus-dp-unroll.cl     |     89 +
 .../algorithms/opencl-kernels/kernel-modulus-dp.cl |     62 +
 .../opencl-kernels/kernel-modulus-sp-unroll.cl     |     88 +
 .../algorithms/opencl-kernels/kernel-modulus-sp.cl |     61 +
 .../kernel-muladd-modulus-dp-unroll.cl             |    109 +
 .../opencl-kernels/kernel-muladd-modulus-dp.cl     |     82 +
 .../kernel-muladd-modulus-sp-unroll.cl             |    108 +
 .../opencl-kernels/kernel-muladd-modulus-sp.cl     |     81 +
 .../kernel-muladd-partial-1024-dp-unroll.cl        |    107 +
 .../kernel-muladd-partial-1024-dp.cl               |     93 +
 .../kernel-muladd-partial-1024-sp-unroll.cl        |    106 +
 .../kernel-muladd-partial-1024-sp.cl               |     92 +
 .../kernel-muladd-partial-16-sp-unroll.cl          |     96 +
 .../opencl-kernels/kernel-muladd-partial-16-sp.cl  |     83 +
 .../kernel-muladd-partial-32-dp-unroll.cl          |    107 +
 .../opencl-kernels/kernel-muladd-partial-32-dp.cl  |     93 +
 .../kernel-muladd-partial-32-sp-unroll.cl          |    106 +
 .../opencl-kernels/kernel-muladd-partial-32-sp.cl  |     92 +
 .../kernel-muladd-partial-8-dp-unroll.cl           |     96 +
 .../opencl-kernels/kernel-muladd-partial-8-dp.cl   |     86 +
 linbox/algorithms/opencl-kernels/kernel-parser.py  |    177 +
 .../kernel-partial-1024-dp-unroll.cl               |     87 +
 .../opencl-kernels/kernel-partial-1024-dp.cl       |     73 +
 .../kernel-partial-1024-sp-unroll.cl               |     86 +
 .../opencl-kernels/kernel-partial-1024-sp.cl       |     72 +
 .../opencl-kernels/kernel-partial-16-sp-unroll.cl  |     74 +
 .../opencl-kernels/kernel-partial-16-sp.cl         |     61 +
 .../opencl-kernels/kernel-partial-32-dp-unroll.cl  |     87 +
 .../opencl-kernels/kernel-partial-32-dp.cl         |     73 +
 .../opencl-kernels/kernel-partial-32-sp-unroll.cl  |     86 +
 .../opencl-kernels/kernel-partial-32-sp.cl         |     72 +
 .../opencl-kernels/kernel-partial-8-dp-unroll.cl   |     77 +
 .../opencl-kernels/kernel-partial-8-dp.cl          |     67 +
 .../opencl-kernels/opencl-domain-kernels.inl       |   2276 +
 linbox/algorithms/opencl-resource-controller.h     |    533 +
 linbox/algorithms/poly-det.h                       |    195 +
 linbox/algorithms/poly-interpolation.h             |    174 +
 linbox/algorithms/polynomial-matrix/Makefile.am    |     39 +
 .../polynomial-matrix/matpoly-add-domain.h         |     91 +
 .../matpoly-mult-fft-multiprecision.inl            |    668 +
 .../matpoly-mult-fft-wordsize-fast.inl             |    314 +
 .../matpoly-mult-fft-wordsize-three-primes.inl     |    291 +
 .../matpoly-mult-fft-wordsize.inl                  |    127 +
 .../polynomial-matrix/matpoly-mult-fft.h           |    120 +
 .../polynomial-matrix/matpoly-mult-kara.h          |    364 +
 .../polynomial-matrix/matpoly-mult-naive.h         |    143 +
 linbox/algorithms/polynomial-matrix/order-basis.h  |    641 +
 .../polynomial-fft-transform-simd.inl              |    817 +
 .../polynomial-matrix/polynomial-fft-transform.h   |    331 +
 .../polynomial-matrix/polynomial-fft-transform.inl |    238 +
 .../polynomial-matrix/polynomial-matrix-domain.h   |    218 +
 linbox/algorithms/polynomial-matrix/simd.h         |    273 +
 linbox/algorithms/rational-cra-early-multip.h      |     77 +-
 linbox/algorithms/rational-cra-early-single.h      |      9 +-
 linbox/algorithms/rational-cra-full-multip.h       |     73 +-
 linbox/algorithms/rational-cra.h                   |     26 +-
 linbox/algorithms/rational-cra2.h                  |    211 +-
 linbox/algorithms/rational-reconstruction-base.h   |     26 +-
 linbox/algorithms/rational-reconstruction.h        |    332 +-
 linbox/algorithms/rational-solver-adaptive.h       |     18 +-
 linbox/algorithms/rational-solver-sn.h             |     50 +-
 linbox/algorithms/rational-solver-sn.inl           |     58 +-
 linbox/algorithms/rational-solver.h                |     20 +-
 linbox/algorithms/rational-solver.inl              |    242 +-
 linbox/algorithms/rational-solver2.h               |     59 +-
 linbox/algorithms/rns.h                            |      6 +-
 linbox/algorithms/rns.inl                          |      4 +-
 linbox/algorithms/short-vector.h                   |     14 +-
 linbox/algorithms/sigma-basis.h                    |    273 +-
 linbox/algorithms/signature.h                      |    111 +-
 linbox/algorithms/smith-form-adaptive.h            |     31 +-
 linbox/algorithms/smith-form-adaptive.inl          |    216 +-
 linbox/algorithms/smith-form-binary.h              |     42 +-
 linbox/algorithms/smith-form-iliopoulos.h          |     76 +-
 linbox/algorithms/smith-form-iliopoulos2.h         |    468 +
 linbox/algorithms/smith-form-kannan-bachem.h       |    358 +
 linbox/algorithms/smith-form-local.h               |     15 +-
 linbox/algorithms/smith-form-local2.inl            |     21 +-
 linbox/algorithms/smith-form-sparseelim-local.h    |    203 +-
 .../algorithms/smith-form-sparseelim-poweroftwo.h  |    371 +-
 linbox/algorithms/smith-form-textbook.h            |    268 +
 linbox/algorithms/toeplitz-det.h                   |     19 +-
 linbox/algorithms/triangular-solve-gf2.h           |     20 +-
 linbox/algorithms/triangular-solve.h               |     19 +-
 linbox/algorithms/varprec-cra-early-multip.h       |    156 +-
 linbox/algorithms/varprec-cra-early-single.h       |     35 +-
 linbox/algorithms/vector-fraction.h                |     63 +-
 linbox/algorithms/whisart_trace.h                  |    139 +-
 linbox/algorithms/wiedemann.h                      |     60 +-
 linbox/algorithms/wiedemann.inl                    |     65 +-
 linbox/blackbox/Makefile.am                        |     43 +-
 linbox/blackbox/Makefile.in                        |    650 -
 linbox/blackbox/apply.h                            |    134 +-
 linbox/blackbox/bb.h                               |     85 +
 linbox/blackbox/blackbox.doxy                      |     21 +-
 linbox/blackbox/blackbox.h                         |     69 +
 linbox/blackbox/blackbox_parallel.h                |    274 +
 linbox/blackbox/blackbox_thread.h                  |    405 +
 linbox/blackbox/block-hankel-inverse.h             |    101 +-
 linbox/blackbox/block-hankel.h                     |    134 +-
 linbox/blackbox/block-toeplitz.h                   |      6 +-
 linbox/blackbox/butterfly.h                        |    478 +-
 linbox/blackbox/butterfly.inl                      |    845 +
 linbox/blackbox/companion.h                        |     70 +-
 linbox/blackbox/compose.h                          |     49 +-
 linbox/blackbox/csf.h                              |    491 +
 linbox/blackbox/csf.inl                            |    215 +
 linbox/blackbox/dense-zero-one.h                   |    405 +
 linbox/blackbox/diagonal-gf2.h                     |     10 +-
 linbox/blackbox/diagonal.h                         |    380 +-
 linbox/blackbox/direct-sum.h                       |     39 +-
 linbox/blackbox/fibb-product.h                     |    418 +
 linbox/blackbox/fibb.h                             |    111 +
 linbox/blackbox/frobenius.h                        |     18 +-
 linbox/blackbox/hilbert.h                          |     54 +-
 linbox/blackbox/inverse.h                          |     32 +-
 linbox/blackbox/jit-matrix.h                       |    132 +-
 linbox/blackbox/lambda-sparse.h                    |     11 +-
 linbox/blackbox/matrix-blackbox.h                  |     14 +-
 linbox/blackbox/moore-penrose.h                    |      6 +-
 linbox/blackbox/ntl-hankel.h                       |     35 +-
 linbox/blackbox/ntl-hankel.inl                     |     70 +-
 linbox/blackbox/ntl-sylvester.h                    |     12 +-
 linbox/blackbox/ntl-sylvester.inl                  |    107 +-
 linbox/blackbox/pascal.h                           |    278 +
 linbox/blackbox/permutation.h                      |    413 +-
 linbox/blackbox/polynomial.h                       |      8 +-
 linbox/blackbox/quad-matrix.h                      |     73 +-
 linbox/blackbox/random-matrix.h                    |     31 +-
 linbox/blackbox/rational-matrix-factory.h          |     51 +-
 linbox/blackbox/scalar-matrix.h                    |    185 +-
 linbox/blackbox/scompose.h                         |      5 +-
 linbox/blackbox/sparse.h                           |    443 -
 linbox/blackbox/sparse.inl                         |     77 -
 linbox/blackbox/sparse1.h                          |    463 -
 linbox/blackbox/squarize.h                         |     12 +-
 linbox/blackbox/submatrix.h                        |     60 +-
 linbox/blackbox/subrowmatrix.h                     |    219 +
 linbox/blackbox/sum.h                              |     19 +-
 linbox/blackbox/toeplitz.h                         |    159 +-
 linbox/blackbox/toeplitz.inl                       |    207 +-
 linbox/blackbox/transpose.h                        |     27 +-
 linbox/blackbox/triangular-fibb.h                  |    322 +
 linbox/blackbox/triplesbb.h                        |    348 -
 linbox/blackbox/zero-one.h                         |     45 +-
 linbox/blackbox/zero-one.inl                       |     84 +-
 linbox/blackbox/zo-gf2.h                           |     10 +-
 linbox/blackbox/zo-gf2.inl                         |     37 +-
 linbox/blackbox/zo.h                               |     42 +-
 linbox/blackbox/zo.inl                             |     18 +-
 linbox/blackbox/zoi.inl                            |    244 +
 linbox/element/Makefile.in                         |    582 -
 linbox/element/abstract.h                          |      3 +-
 linbox/element/envelope.h                          |      3 +-
 linbox/field/Givaro/Makefile.am                    |     42 -
 linbox/field/Givaro/Makefile.in                    |    591 -
 linbox/field/Givaro/givaro-extension.h             |    321 -
 linbox/field/Givaro/givaro-field-gf2.h             |    218 -
 linbox/field/Givaro/givaro-field.h                 |    200 -
 linbox/field/Givaro/givaro-gfq.h                   |    283 -
 linbox/field/Givaro/givaro-montg.h                 |    207 -
 linbox/field/Givaro/givaro-rational.h              |    229 -
 linbox/field/Givaro/givaro-zpz.h                   |    518 -
 linbox/field/Givaro/givaro-zpz.inl                 |    288 -
 linbox/field/Makefile.am                           |     48 +-
 linbox/field/Makefile.in                           |    782 -
 linbox/field/Modular/Makefile.am                   |     44 -
 linbox/field/Modular/Makefile.in                   |    592 -
 linbox/field/Modular/modular-balanced-double.h     |    342 -
 linbox/field/Modular/modular-balanced-float.h      |    336 -
 linbox/field/Modular/modular-balanced-int32.h      |    336 -
 linbox/field/Modular/modular-balanced-int64.h      |    345 -
 linbox/field/Modular/modular-byte.h                |    773 -
 linbox/field/Modular/modular-crooked-double.h      |    616 -
 linbox/field/Modular/modular-double.h              |    381 -
 linbox/field/Modular/modular-float.h               |    335 -
 linbox/field/Modular/modular-int32.h               |    526 -
 linbox/field/Modular/modular-int64.h               |    505 -
 linbox/field/Modular/modular-short.h               |    794 -
 linbox/field/Modular/modular-unsigned.h            |   1102 -
 linbox/field/Modular/modular.inl                   |    771 -
 linbox/field/NTL/Makefile.am                       |     46 -
 linbox/field/NTL/Makefile.in                       |    592 -
 linbox/field/NTL/ntl-GF2E.h                        |    242 -
 linbox/field/NTL/ntl-RR.h                          |    334 -
 linbox/field/NTL/ntl-ZZ.h                          |    771 -
 linbox/field/NTL/ntl-ZZ_p.h                        |    500 -
 linbox/field/NTL/ntl-ZZ_pE.h                       |    419 -
 linbox/field/NTL/ntl-ZZ_pX.h                       |    341 -
 linbox/field/NTL/ntl-lzz_p.h                       |    348 -
 linbox/field/NTL/ntl-lzz_pE.h                      |    268 -
 linbox/field/NTL/ntl-lzz_pX.h                      |    329 -
 linbox/field/PID-double.h                          |    347 -
 linbox/field/PID-integer.h                         |    576 -
 linbox/field/PID-ntl-zz_p.h                        |     93 -
 linbox/field/PIR-modular-int32.h                   |    700 -
 linbox/field/PIR-ntl-ZZ_p.h                        |    905 -
 linbox/field/abstract.h                            |     17 +-
 linbox/field/archetype.h                           |     81 +-
 linbox/field/block-ring.h                          |    622 -
 linbox/field/envelope.h                            |     17 +-
 linbox/field/field-interface.h                     |      2 +-
 linbox/field/field-traits.h                        |     44 +-
 linbox/field/gf2.h                                 |     74 +-
 linbox/field/givaro.h                              |     48 -
 linbox/field/gmp-rational.h                        |     51 +-
 linbox/field/hom.h                                 |    352 +-
 linbox/field/image-field.h                         |     86 +
 linbox/field/integers.doxy                         |      5 +-
 linbox/field/lidia-gfq.h                           |    776 -
 linbox/field/lidia.doxy                            |     29 -
 linbox/field/lidia.h                               |     42 -
 linbox/field/local2_32.h                           |    337 -
 linbox/field/modular-balanced.h                    |     52 -
 linbox/field/modular.doxy                          |     33 -
 linbox/field/modular.h                             |    842 -
 linbox/field/multimod-field.h                      |     63 +-
 linbox/field/ntl.doxy                              |     30 -
 linbox/field/ntl.h                                 |     59 -
 linbox/field/param-fuzzy.h                         |     24 +-
 linbox/field/rebind.h                              |      2 +-
 linbox/field/unparametric.h                        |    337 -
 linbox/integer.h                                   |    199 +-
 linbox/iterators/Makefile.am                       |     26 +
 linbox/iterators/blackbox-symmetric-iterator.h     |     91 +
 linbox/iterators/blackbox-symmetrize-iterator.h    |     84 +
 linbox/linbox-config.h                             |    346 +-
 linbox/linbox-tags.h                               |    139 +
 linbox/matrix/Makefile.am                          |     62 +-
 linbox/matrix/Makefile.in                          |    605 -
 linbox/matrix/abnormal-helpers.h                   |    171 +
 linbox/matrix/abnormal-matrix.h                    |    107 +
 linbox/matrix/blas-matrix-multimod.h               |    218 -
 linbox/matrix/blas-matrix.h                        |   1210 -
 linbox/matrix/blas-matrix.inl                      |   1742 -
 linbox/matrix/blas-submatrix.inl                   |   1085 -
 linbox/matrix/blas-triangularmatrix.inl            |    144 -
 linbox/matrix/dense-matrix.doxy                    |     32 +
 linbox/matrix/dense-matrix.h                       |    190 +
 linbox/matrix/dense-rows-matrix.h                  |    264 -
 linbox/matrix/densematrix/Makefile.am              |     34 +
 linbox/matrix/densematrix/blas-matrix-multimod.h   |    217 +
 linbox/matrix/densematrix/blas-matrix.h            |   1254 +
 linbox/matrix/densematrix/blas-matrix.inl          |   1548 +
 linbox/matrix/densematrix/blas-submatrix.inl       |   1239 +
 linbox/matrix/densematrix/blas-transposed-matrix.h |    106 +
 .../matrix/densematrix/blas-triangularmatrix.inl   |    145 +
 linbox/matrix/factorized-matrix.h                  |     58 +-
 linbox/matrix/factorized-matrix.inl                |    726 +-
 linbox/matrix/grid.h                               |    612 +
 linbox/matrix/matrix-category.h                    |     69 +-
 linbox/matrix/matrix-domain.doxy                   |     32 +
 linbox/matrix/matrix-domain.h                      |   1183 +-
 linbox/matrix/matrix-domain.inl                    |   1183 -
 linbox/matrix/matrix-iterators.doxy                |     45 +
 linbox/matrix/matrix-traits.h                      |     92 +
 linbox/matrix/matrix.doxy                          |     71 +-
 linbox/matrix/matrixdomain/Makefile.am             |     51 +
 linbox/matrix/matrixdomain/apply-domain.h          |    462 +
 linbox/matrix/matrixdomain/blas-matrix-domain.h    |    980 +
 linbox/matrix/matrixdomain/blas-matrix-domain.inl  |   2101 +
 .../matrix/{ => matrixdomain}/matrix-domain-gf2.h  |      0
 linbox/matrix/matrixdomain/matrix-domain.h         |   1245 +
 linbox/matrix/matrixdomain/matrix-domain.inl       |   1200 +
 linbox/matrix/matrixdomain/opencl-domain-factory.h |    750 +
 .../matrix/matrixdomain/opencl-domain-memory.inl   |    333 +
 linbox/matrix/matrixdomain/opencl-domain-util.inl  |    898 +
 linbox/matrix/matrixdomain/opencl-domain.h         |    995 +
 linbox/matrix/matrixdomain/opencl-domain.inl       |   2459 +
 linbox/matrix/matrixdomain/plain-domain.h          |    240 +
 linbox/matrix/permutation-matrix.doxy              |     32 +
 linbox/matrix/permutation-matrix.h                 |      4 +-
 linbox/matrix/permutation-matrix.inl               |      4 +-
 linbox/matrix/plain-matrix.h                       |    203 +
 linbox/matrix/polynomial-matrix.h                  |    687 +
 linbox/matrix/random-matrix.h                      |     22 +-
 linbox/matrix/random-matrix.inl                    |     92 +-
 linbox/matrix/sliced3.doxy                         |     32 +
 linbox/matrix/sliced3.h                            |     44 +
 linbox/matrix/sliced3/Makefile.am                  |     30 +
 linbox/matrix/sliced3/dense-matrix.h               |    524 +
 linbox/matrix/sliced3/dense-sliced.h               |    691 +
 linbox/matrix/sliced3/dense-sliced.inl             |    391 +
 linbox/matrix/sliced3/sliced-domain.h              |    165 +
 linbox/matrix/sliced3/sliced-stepper.h             |     63 +
 linbox/matrix/sliced3/submat-iterator.h            |    125 +
 .../SlicedPolynomialMatrix.h                       |    197 +
 .../SlicedPolynomialMatrix.inl                     |    376 +
 .../SlicedPolynomialMatrixAddSub.h                 |     53 +
 .../SlicedPolynomialMatrixAddSub.inl               |     75 +
 .../SlicedPolynomialMatrixMulKaratsuba.h           |     26 +
 .../SlicedPolynomialMatrixMulKaratsuba.inl         |    258 +
 .../SlicedPolynomialMatrixMulToomCook.h            |     29 +
 .../SlicedPolynomialMatrixMulToomCook.inl          |    188 +
 linbox/matrix/slicedpolynomialmatrix/conversion.h  |     55 +
 .../matrix/slicedpolynomialmatrix/conversion.inl   |    114 +
 linbox/matrix/sparse-formats.h                     |     98 +
 linbox/matrix/sparse-matrix.doxy                   |     32 +
 linbox/matrix/sparse-matrix.h                      |    287 +
 linbox/matrix/sparse.h                             |   1724 -
 linbox/matrix/sparse.inl                           |    983 -
 linbox/matrix/sparsematrix/Makefile.am             |     59 +
 linbox/matrix/sparsematrix/read-write-sparse.h     |    158 +
 linbox/matrix/sparsematrix/read-write-sparse.inl   |    604 +
 .../sparsematrix/sparse-associative-vector.h       |    672 +
 .../sparsematrix/sparse-associative-vector.inl     |    139 +
 .../sparsematrix/sparse-coo-implicit-matrix.h      |    977 +
 linbox/matrix/sparsematrix/sparse-coo-matrix.h     |   1282 +
 linbox/matrix/sparsematrix/sparse-csr-matrix.h     |   1615 +
 linbox/matrix/sparsematrix/sparse-domain.h         |     70 +
 linbox/matrix/sparsematrix/sparse-ell-matrix.h     |   1489 +
 linbox/matrix/sparsematrix/sparse-ellr-matrix.h    |   1542 +
 linbox/matrix/sparsematrix/sparse-generic.h        |    538 +
 linbox/matrix/sparsematrix/sparse-generic.inl      |    100 +
 linbox/matrix/sparsematrix/sparse-hyb-matrix.h     |    923 +
 linbox/matrix/sparsematrix/sparse-map-map-matrix.h |    216 +
 .../matrix/sparsematrix/sparse-map-map-matrix.inl  |    672 +
 .../matrix/sparsematrix/sparse-parallel-vector.h   |    735 +
 .../matrix/sparsematrix/sparse-parallel-vector.inl |    359 +
 .../matrix/sparsematrix/sparse-sequence-vector.h   |    713 +
 .../matrix/sparsematrix/sparse-sequence-vector.inl |    179 +
 linbox/matrix/sparsematrix/sparse-tpl-matrix-omp.h |    415 +
 .../matrix/sparsematrix/sparse-tpl-matrix-omp.inl  |    614 +
 linbox/matrix/sparsematrix/sparse-tpl-matrix.h     |    241 +
 linbox/matrix/sparsematrix/sparse-tpl-matrix.inl   |    253 +
 linbox/matrix/sparsematrix/triples-coord.h         |    200 +
 linbox/matrix/transpose-matrix.h                   |     14 +-
 linbox/randiter/Makefile.am                        |     38 +-
 linbox/randiter/Makefile.in                        |    672 -
 linbox/randiter/abstract.h                         |      2 +-
 linbox/randiter/archetype.h                        |      2 +-
 linbox/randiter/envelope.h                         |      6 +-
 linbox/randiter/generic.h                          |    179 +
 linbox/randiter/gf2.h                              |      4 +-
 linbox/randiter/givaro-poly.h                      |     75 +
 linbox/randiter/gmp-rational.h                     |     24 +-
 linbox/randiter/mersenne-twister.h                 |     14 +-
 linbox/randiter/modular-balanced.h                 |     32 +-
 linbox/randiter/modular-crooked.h                  |      3 +-
 linbox/randiter/modular.h                          |    393 -
 linbox/randiter/multimod-randomprime.h             |     30 +-
 linbox/randiter/nonzero.h                          |    117 -
 linbox/randiter/{ntl-ZZ.h => ntl-zz.h}             |      0
 linbox/randiter/param-fuzzy.h                      |     14 +-
 linbox/randiter/random-fftprime.h                  |    170 +-
 linbox/randiter/random-integer.h                   |    205 -
 linbox/randiter/random-prime.h                     |    106 +-
 linbox/randiter/unparametric.h                     |    207 -
 linbox/ring/Makefile.am                            |     28 +-
 linbox/ring/Makefile.in                            |    586 -
 linbox/ring/gcd32.h                                |    196 +
 linbox/ring/gcd64.h                                |    356 +
 linbox/ring/givaro-poly-mod-poly.h                 |     41 +
 linbox/ring/givaro-poly.h                          |    348 +
 linbox/ring/givaro-polynomial.h                    |    131 +-
 linbox/ring/local-pir-modular.h                    |    174 +
 linbox/ring/local2_32.h                            |    262 +
 linbox/ring/modular.h                              |    156 +
 linbox/ring/modular/Makefile.am                    |     43 +
 linbox/ring/modular/modular-balanced-double.h      |    237 +
 linbox/ring/modular/modular-balanced-float.h       |    232 +
 linbox/ring/modular/modular-balanced-int32.h       |    265 +
 linbox/ring/modular/modular-balanced-int64.h       |    271 +
 linbox/ring/modular/modular-byte.h                 |    388 +
 linbox/ring/modular/modular-double.h               |    242 +
 linbox/ring/modular/modular-float.h                |    214 +
 linbox/ring/modular/modular-int32.h                |    428 +
 linbox/ring/modular/modular-int64.h                |    445 +
 linbox/ring/modular/modular-short.h                |    386 +
 linbox/ring/modular/modular-unsigned.h             |    686 +
 linbox/ring/modular/modular-unsigned.inl           |    828 +
 linbox/ring/ntl.doxy                               |     30 +
 linbox/ring/ntl.h                                  |     60 +
 linbox/ring/ntl/Makefile.am                        |     47 +
 linbox/ring/ntl/ntl-gf2e.h                         |    247 +
 linbox/ring/ntl/ntl-lzz_p.h                        |    379 +
 linbox/ring/ntl/ntl-lzz_pe.h                       |    313 +
 linbox/ring/ntl/ntl-lzz_pex.h                      |    447 +
 linbox/ring/ntl/ntl-lzz_px.h                       |    442 +
 linbox/ring/ntl/ntl-rr.h                           |    356 +
 linbox/ring/ntl/ntl-zz.h                           |    782 +
 linbox/ring/ntl/ntl-zz_p.h                         |    525 +
 linbox/ring/ntl/ntl-zz_pe.h                        |    434 +
 linbox/ring/ntl/ntl-zz_px.h                        |    354 +
 linbox/ring/pid-ntl-zz_p.h                         |     92 +
 linbox/ring/pir-modular-int32.h                    |    713 +
 linbox/ring/pir-ntl-zz_p.h                         |    913 +
 linbox/ring/poweroftwomodular.h                    |     16 +-
 linbox/ring/ring.doxy                              |     31 +-
 linbox/solutions/Makefile.am                       |     35 +-
 linbox/solutions/Makefile.in                       |    599 -
 linbox/solutions/charpoly.h                        |    111 +-
 linbox/solutions/det.h                             |     62 +-
 linbox/solutions/getentry.h                        |    129 +-
 linbox/solutions/getentry.inl                      |    127 +
 linbox/solutions/is-positive-definite.h            |     15 +-
 linbox/solutions/is-positive-semidefinite.h        |      8 +-
 linbox/solutions/methods.h                         |     68 +-
 linbox/solutions/minpoly.h                         |     21 +-
 linbox/solutions/nullspace.h                       |      2 +-
 linbox/solutions/rank.h                            |    643 +-
 linbox/solutions/rank.inl                          |    652 +
 linbox/solutions/smith-form.h                      |     29 +-
 linbox/solutions/solution-tags.h                   |     56 +
 linbox/solutions/solve.h                           |    190 +-
 linbox/solutions/trace.h                           |     72 +-
 linbox/solutions/trace.inl                         |     83 +
 linbox/solutions/valence.h                         |     69 +-
 linbox/switch/Makefile.am                          |     27 -
 linbox/switch/Makefile.in                          |    576 -
 linbox/switch/boolean.h                            |    195 -
 linbox/switch/cekstv-gf2.h                         |    142 -
 linbox/switch/cekstv.h                             |    200 -
 linbox/util/Makefile.am                            |     42 +-
 linbox/util/Makefile.in                            |    800 -
 linbox/util/args-parser.h                          |     41 +
 linbox/util/commentator.h                          |     78 +-
 linbox/util/commentator.inl                        |    111 +-
 linbox/util/debug.C                                |      4 +-
 linbox/util/debug.h                                |     26 +-
 linbox/util/error.C                                |      3 +-
 linbox/util/error.h                                |      5 +-
 linbox/util/field-axpy.h                           |     64 +-
 linbox/util/formats/Makefile.in                    |    579 -
 linbox/util/formats/maple.h                        |     24 +-
 linbox/util/formats/matrix-market.h                |     27 +-
 linbox/util/formats/matrix-stream-readers.h        |     15 +-
 linbox/util/formats/sms.h                          |     13 +-
 linbox/util/formats/sparse-row.h                   |      2 +-
 linbox/util/iml_wrapper.h                          |      4 +-
 linbox/util/matrix-stream.h                        |     21 +-
 linbox/util/matrix-stream.inl                      |     32 +-
 linbox/util/prime-stream.h                         |     12 +-
 linbox/util/timer.h                                |     18 +-
 linbox/util/write-mm.h                             |    111 +
 linbox/vector/Makefile.am                          |      3 +
 linbox/vector/Makefile.in                          |    592 -
 linbox/vector/bit-vector.h                         |     44 +-
 linbox/vector/bit-vector.inl                       |     56 +-
 linbox/vector/blas-vector.h                        |    992 +
 linbox/vector/blas-vector.inl                      |     47 +
 linbox/vector/reverse.h                            |     12 +-
 .../SlicedPolynomialMatrixVectorMulKaratsuba.h     |     27 +
 .../SlicedPolynomialMatrixVectorMulKaratsuba.inl   |    245 +
 .../SlicedPolynomialVector.h                       |    173 +
 .../SlicedPolynomialVector.inl                     |    329 +
 .../SlicedPolynomialVectorAddSub.h                 |     53 +
 .../SlicedPolynomialVectorAddSub.inl               |     75 +
 linbox/vector/stream-gf2.h                         |     17 +-
 linbox/vector/stream.h                             |    201 +-
 linbox/vector/subiterator.h                        |    178 +-
 linbox/vector/subvector.h                          |     37 +-
 linbox/vector/vector-domain-gf2.h                  |     27 +-
 linbox/vector/vector-domain.h                      |    138 +-
 linbox/vector/vector-domain.inl                    |    548 +-
 linbox/vector/vector-traits.h                      |     27 +-
 linbox/vector/vector.h                             |     58 +
 macros/Makefile.am                                 |      4 +-
 macros/Makefile.in                                 |    490 -
 macros/ax_cxx_compile_stdcxx_11.m4                 |    133 +
 macros/debug.m4                                    |     70 +-
 macros/expat-check.m4                              |      4 +-
 macros/fflas-ffpack-check.m4                       |     40 +-
 macros/flint-check.m4                              |    147 +
 macros/fplll-check.m4                              |     13 +-
 macros/givaro-check.m4                             |    144 -
 macros/gmp-check.m4                                |    175 -
 macros/iml-check.m4                                |      4 +-
 macros/lapack-check.m4                             |      8 +-
 macros/libtool.m4                                  |   7995 --
 macros/lidia-check.m4                              |      4 +-
 macros/linbox-benchmark.m4                         |      8 +-
 macros/ltoptions.m4                                |    384 -
 macros/ltsugar.m4                                  |    123 -
 macros/ltversion.m4                                |     23 -
 macros/lt~obsolete.m4                              |     98 -
 macros/m4ri-check.m4                               |      4 +-
 macros/m4rie-check.m4                              |      4 +-
 macros/mpfr-check.m4                               |      4 +-
 macros/ntl-check.m4                                |      4 +-
 macros/ocl-check.m4                                |     95 +
 macros/omp-check.m4                                |     77 +
 macros/saclib-check.m4                             |      3 +-
 macros/sage-check.m4                               |      6 +-
 macros/tinyxml2-check.m4                           |     46 +
 template.h                                         |    131 +
 tests/.gitignore                                   |     64 +
 tests/Makefile.am                                  |    921 +-
 tests/Makefile.in                                  |   2599 -
 tests/benchmark-fields.C                           |     88 +-
 tests/checker.C                                    |    569 +-
 tests/data/Makefile.am                             |      4 +-
 tests/data/Makefile.in                             |    475 -
 tests/data/matrix-market-coordinate.matrix         |      1 +
 tests/data/test.matrix                             |     10 -
 tests/matrix/Makefile.in                           |    474 -
 tests/matrix/invhilb.h                             |      6 +-
 tests/matrix/minmax.h                              |      6 +-
 tests/matrix/randomans.h                           |     17 +-
 tests/matrix/randommat.h                           |      6 +-
 tests/perfpublisher.sh                             |    158 +
 tests/test-PID-integer.C                           |     91 -
 tests/test-bitonic-sort.C                          |      9 +-
 tests/test-blackbox-block-container.C              |    172 +-
 tests/test-blackbox.h                              |    247 +-
 tests/test-blas-domain.C                           |    771 +-
 tests/test-blas-matrix.C                           |    356 +
 tests/test-block-ring.C                            |     12 +-
 tests/test-block-wiedemann.C                       |    190 +
 tests/test-bmseq.C                                 |    233 -
 tests/test-butterfly.C                             |    106 +-
 tests/test-charpoly.C                              |    154 +-
 tests/test-commentator.C                           |     10 +-
 tests/test-common.C                                |     93 -
 tests/test-common.h                                |     99 +-
 tests/test-common.inl                              |     93 +
 tests/test-companion.C                             |     35 +-
 tests/test-cra.C                                   |     35 +-
 tests/test-cradomain.C                             |    132 +-
 tests/test-dense-zero-one.C                        |     75 +-
 tests/test-dense.C                                 |    120 +-
 tests/test-det.C                                   |    118 +-
 tests/test-diagonal.C                              |     86 +-
 tests/test-dif.C                                   |     30 +-
 tests/test-direct-sum.C                            |     24 +-
 tests/test-dyadic-to-rational.C                    |     43 +-
 tests/test-echelon-form.C                          |     70 +-
 tests/test-ffpack.C                                |    332 +-
 tests/test-fibb.C                                  |    313 +
 tests/test-field.h                                 |    501 +-
 tests/test-frobenius.C                             |     22 +-
 tests/test-ftrmm.C                                 |    113 +-
 tests/test-generic.h                               |     11 +-
 tests/test-getentry.C                              |     64 +-
 tests/test-gf2.C                                   |    263 +-
 tests/test-givaro-fields.C                         |    180 -
 tests/test-givaro-zpz.C                            |    190 +
 tests/test-givaro-zpzuns.C                         |    150 +
 tests/test-givaropoly.C                            |     96 +
 tests/test-gmp-rational.C                          |     18 +-
 tests/test-hilbert.C                               |     11 +-
 tests/test-hom.C                                   |      8 +-
 tests/test-image-field.C                           |    117 +
 tests/test-inverse.C                               |     63 +-
 tests/test-isposdef.C                              |     57 +-
 tests/test-ispossemidef.C                          |     49 +-
 tests/test-la-block-lanczos.C                      |     36 +-
 tests/test-last-invariant-factor.C                 |     49 +-
 tests/test-lidia-gfq.C                             |     93 -
 tests/test-matrix-domain.C                         |    155 +-
 tests/test-matrix-domain.h                         |    191 +
 tests/test-matrix-stream.C                         |      9 +-
 tests/test-matrix-utils.h                          |    322 +
 tests/test-mg-block-lanczos.C                      |     33 +-
 tests/test-minpoly.C                               |    252 +-
 tests/test-modular-balanced-double.C               |     63 +-
 tests/test-modular-balanced-float.C                |     61 +-
 tests/test-modular-balanced-int.C                  |    139 +-
 tests/test-modular-byte.C                          |     40 +-
 tests/test-modular-double.C                        |     72 +-
 tests/test-modular-float.C                         |     77 +-
 tests/test-modular-int.C                           |    116 +-
 tests/test-modular-short.C                         |     44 +-
 tests/test-modular.C                               |     65 +-
 tests/test-moore-penrose.C                         |     52 +-
 tests/test-ntl-RR.C                                |     98 -
 tests/test-ntl-ZZ_p.C                              |    118 -
 tests/test-ntl-hankel.C                            |     43 +-
 tests/test-ntl-lzz_p.C                             |     14 +-
 tests/test-ntl-lzz_pe.C                            |     94 +
 tests/test-ntl-lzz_pex.C                           |     90 +
 tests/test-ntl-lzz_px.C                            |     90 +
 tests/test-ntl-rr.C                                |     96 +
 tests/test-ntl-sylvester.C                         |     38 +-
 tests/test-ntl-toeplitz.C                          |     32 +-
 tests/test-ntl-zz_p.C                              |    118 +
 tests/test-nullspace.C                             |    323 +-
 tests/test-opencl-domain.C                         |    891 +
 tests/test-optimization.C                          |      7 +-
 tests/test-order-basis.C                           |    157 +
 tests/test-param-fuzzy.C                           |     18 +-
 tests/test-permutation.C                           |    137 +
 tests/test-plain-domain.C                          |   1632 +
 tests/test-poly-det.C                              |    117 +
 tests/test-qlup.C                                  |    250 +-
 tests/test-quad-matrix.C                           |    139 +
 tests/test-randiter-nonzero.C                      |     29 +-
 tests/test-random-matrix.C                         |     44 +
 tests/test-rank-Int.C                              |     76 +
 tests/test-rank-md.C                               |     83 +
 tests/test-rank-u32.C                              |     80 +
 tests/test-rank.C                                  |    345 -
 tests/test-rank.h                                  |    384 +
 tests/test-rat-charpoly.C                          |     21 +-
 tests/test-rat-minpoly.C                           |     27 +-
 tests/test-rat-solve.C                             |     41 +-
 tests/test-rational-matrix-factory.C               |     16 +-
 tests/test-rational-reconstruction-base.C          |    119 +-
 tests/test-rational-solver-adaptive.C              |     74 +-
 tests/test-rational-solver.C                       |    218 +-
 tests/test-regression.C                            |    125 +
 tests/test-scalar-matrix.C                         |     12 +-
 tests/test-smith-form-adaptive.C                   |     49 +-
 tests/test-smith-form-binary.C                     |     85 +-
 tests/test-smith-form-iliopoulos.C                 |    341 +-
 tests/test-smith-form-kannan-bachem.C              |     74 +
 tests/test-smith-form-local.C                      |    177 +-
 tests/test-smith-form.C                            |     78 +-
 tests/test-solve-nonsingular.C                     |     84 +-
 tests/test-solve.C                                 |    125 +-
 tests/test-sparse-map-map.C                        |    261 +
 tests/test-sparse.C                                |    665 +-
 tests/test-subiterator.C                           |     61 +-
 tests/test-submatrix.C                             |     62 +-
 tests/test-subvector.C                             |    494 +-
 tests/test-sum.C                                   |     68 +-
 tests/test-toeplitz-det.C                          |     24 +-
 tests/test-toom-cook.C                             |    413 +-
 tests/test-trace.C                                 |     85 +-
 tests/test-transpose.C                             |    224 +
 tests/test-triplesbb-omp.C                         |    414 +
 tests/test-triplesbb.C                             |    160 +-
 tests/test-tutorial.C                              |     64 +
 tests/test-unparametric-field.C                    |     98 -
 tests/test-vector-domain.C                         |     56 +-
 tests/test-vector-domain.h                         |     73 +-
 tests/test-zero-one.C                              |     22 +-
 tests/test-zo.C                                    |    137 -
 tests/test_leak.sh                                 |     61 +
 tests/tests.doxy                                   |      4 +-
 951 files changed, 334397 insertions(+), 123871 deletions(-)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..673faa8
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,82 @@
+**/Makefile
+**/Makefile.in
+**/*.log
+**/*.trs
+**/*.o
+**/*.la
+**/*.lo
+**/.libs
+
+tests/test-blas-matrix
+tests/test-charpoly
+tests/test-commentator
+tests/test-cra
+tests/test-det
+tests/test-frobenius
+tests/test-rank-Int
+tests/test-rank-md
+tests/test-rank-u32
+tests/test-rational-solver
+tests/test-rational-solver-adaptive
+tests/test-smith-form-binary
+tests/test-solve
+tests/test-regression
+tests/test-block-wiedemann
+tests/test-cradomain
+tests/test-dyadic-to-rational
+tests/test-givaro-zpz
+tests/test-givaro-zpzuns
+tests/test-isposdef
+tests/test-ispossemidef
+tests/test-modular-balanced-double
+tests/test-modular-balanced-int
+tests/test-moore-penrose
+tests/test-rational-reconstruction-base
+tests/test-smith-form-kannan-bachem
+tests/test-solve-nonsingular
+
+INSTALL
+_configs.sed
+aclocal.m4
+autogen.status
+autom4te.cache/
+build-aux/
+config.h
+config.h.in
+config.log
+config.status
+configure
+doc/Doxyfile
+doc/DoxyfileDev
+examples/charpoly
+examples/checksolve
+examples/det
+examples/dot-product
+examples/doubledet
+examples/echelon
+examples/graph-charpoly
+examples/grid_reduce
+examples/minpoly
+examples/omp_smithvalence
+examples/poweroftwo_ranks
+examples/rank
+examples/smith
+examples/smithvalence
+examples/solve
+examples/sparseelimdet
+examples/sparseelimrank
+examples/valence
+examples/benchmatpolymult
+examples/benchfft
+examples/polysmith
+benchmarks/benchmark-example
+libtool
+linbox-config
+linbox/config.h
+macros/libtool.m4
+macros/ltoptions.m4
+macros/ltsugar.m4
+macros/ltversion.m4
+macros/lt~obsolete.m4
+stamp-h1
+linbox.pc
diff --git a/AUTHORS b/AUTHORS
index b2cbf48..d259730 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,5 +1,6 @@
 The Linbox team:
 
+Brice Boyer <brice.boyer at gmail.com>
 Jean-Guillaume Dumas <Jean-Guillaume.Dumas at imag.fr>
 Mark Giesbrecht <mwg at csd.uwo.ca>
 Pascal Giorgi <Pascal.Giorgi at lirmm.fr>
diff --git a/CHANGED-INTERFACES b/CHANGED-INTERFACES
new file mode 100644
index 0000000..dc362d8
--- /dev/null
+++ b/CHANGED-INTERFACES
@@ -0,0 +1,75 @@
+Author: Hovinen (early 2002), edits by Saunders (2003Jan)
+
+Class names:
+
+	In general: Most class names now follow the Java/Smalltalk
+	MyClass style. Abbreviations have been removed in most cases.
+
+	Field::randIter -> Field::RandIter
+
+	sparsemat* -> SparseMatrix*
+
+	diagonal -> Diagonal
+	hilbert -> Hilbert
+	etc.
+
+	There are two notable exceptions: The wrapper of GMP long
+	integers is "integer", and field elements are represented by
+	"element".
+
+	ParamGivaro::Modular was first renamed LargeModular, since it works
+	over a modulus of arbitrary size. Corresponding SmallGivaro::Modular
+	(word size modulus) and TinyGivaro::Modular (half-word size modulus)
+	were planned.  All of this has become Givaro::Modular<element>, for
+	basic element types of the various sizes, including unsigned 
+	and floating types.  For example Givaro::Modular<uint32>.
+
+Class methods:
+
+	In general: I have standardized everything on the Java
+	studlycaps style, e.g. MyClass::myMethod
+
+	The names Blackbox_archetype::applyin and
+	Blackbox_archetype::applyTransposein have been changed to
+	BlackboxArchetype::applyIn and
+	BlackboxArchetype::applyTransposeIn, respectively.
+
+Header files:
+
+	All header files that previously used '_' to separate words
+	use '-' now as '-' is easier to type.  More generally the 
+	header file named first-second-third.h can be expected to 
+	contain a declaration of class FirstSecondThird.
+
+	The archetype header files have been moved into directories
+	containing objects of those archetypes and are all now named
+	"archetype.h", "abstract.h", and "envelope.h".
+
+	Header files are now installed into a tree matching that of
+	the source code as opposed to a single, flat directory. So,
+	for example, one now includes LinBox/blackbox/archetype.h as
+	opposed to LinBox/blackbox-archetype.h
+
+Miscellanae:
+
+	In the random iterator interface, the operator () has been
+	replaced by a function random accepting a single argument --
+	an element type into which the random element should be
+	placed. This eliminates the potential for memory leaks.
+
+	The blackbox container class now requires that a field be
+	passed, as it no longer retrieves the field from the black
+	box.
+
+        Some terms composed of more than one word are considered to be
+        compound words and do not have internal capitalization, e.g. Blackbox
+        (vs. BlackBox) and minpoly (vs. minPoly).
+
+Frozen design:
+
+	These files are frozen and require team consensus for changes.
+
+	field-archetype.h
+	blackbox-archetype.h
+	element-archetype.h
+	randiter-archetype.h
diff --git a/ChangeLog b/ChangeLog
index fb15abe..f6d60cc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,16 @@
-2011-03-10 bboyer
+2016-02-24 cpernet v1.4.1
+	* update the build system (add pkgconfig file, and a more consistent way
+	of dealing with dependencies)
+	* fix all remaining issues for the integration in SageMath
+
+2016-02-24 cpernet
+	* move almost all finite fields to givaro
+	* cleanup dead code
+	* many bug fixes
+	* change in some parts of the API
+	* improved order basis computations
+
+2011-03-10 briceboyer
         * Implement DublinBox Mother model for dense matrices (BlasM* own, BlasS* share)
 	* Change BlasSubmatrix private members (and add one to make Iterators faster)
 	* Change <> includes to "" so I have no surprise when the compiler looks them in a non expected place
@@ -6,7 +18,7 @@
 	* RawIterators are renamed to Iterators (impossible to pronounce, easy to misspell)
 	* add functions to blas-domain and blas-matrix
 
-2011-24-09 bboyer
+2011-24-09 briceboyer
         * replace DenseMatrix(Base) by Blas(Matrix/Blackbox)
 	* put these classes (and DenseSubmatrix) in a Protected namespace (users will be warned...)
 	* update Blas(Mat/Bb)  interface
@@ -20,7 +32,7 @@
 	* M4RI checks
 	* Ekopath (pathscale) checks
 
-2011-05-11 bboyer
+2011-05-11 briceboyer
         linbox-1.2.0 released:
 	* Many many bug fixes, many memleaks, much code beautify.
 	* Licence/copyright added to (hopefully) every file.
@@ -1420,9 +1432,9 @@ end newBB branch notes
 	* linbox/blackbox/zero-one.inl:  "" ZeroOne class
 	* linbox/field/gf2.h:           "" GF2 class
 	* linbox/field/gf2.inl:
-	* linbox/field/givaro-gfq.h:  "" GivaroGfq class
+	* linbox/field/givaro-gfq.h:  "" Givaro::GFq class
 	* linbox/field/givaro-zpz.h:
-	* linbox/field/givaro-zpz.inl: "" GivaroZpz class
+	* linbox/field/givaro-zpz.inl: "" Givaro::Modular class
 	* linbox/field/gmp-rational.h: "" GMPRationalField class
 	* linbox/field/lidia-gfq.h:   "" LidiaGfq class
 	* linbox/field/modular.h:  "" Modular class
diff --git a/HACKING b/HACKING
new file mode 100644
index 0000000..1f3c364
--- /dev/null
+++ b/HACKING
@@ -0,0 +1,4 @@
+Please go to http://www.linalg.org/developer.html (or ./doc/install-dev.html)
+
+==================
+The Linbox Team
diff --git a/INSTALL b/INSTALL
deleted file mode 100644
index a1e89e1..0000000
--- a/INSTALL
+++ /dev/null
@@ -1,370 +0,0 @@
-Installation Instructions
-*************************
-
-Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation,
-Inc.
-
-   Copying and distribution of this file, with or without modification,
-are permitted in any medium without royalty provided the copyright
-notice and this notice are preserved.  This file is offered as-is,
-without warranty of any kind.
-
-Basic Installation
-==================
-
-   Briefly, the shell commands `./configure; make; make install' should
-configure, build, and install this package.  The following
-more-detailed instructions are generic; see the `README' file for
-instructions specific to this package.  Some packages provide this
-`INSTALL' file but do not implement all of the features documented
-below.  The lack of an optional feature in a given package is not
-necessarily a bug.  More recommendations for GNU packages can be found
-in *note Makefile Conventions: (standards)Makefile Conventions.
-
-   The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation.  It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions.  Finally, it creates a shell script `config.status' that
-you can run in the future to recreate the current configuration, and a
-file `config.log' containing compiler output (useful mainly for
-debugging `configure').
-
-   It can also use an optional file (typically called `config.cache'
-and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring.  Caching is
-disabled by default to prevent problems with accidental use of stale
-cache files.
-
-   If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
-be considered for the next release.  If you are using the cache, and at
-some point `config.cache' contains results you don't want to keep, you
-may remove or edit it.
-
-   The file `configure.ac' (or `configure.in') is used to create
-`configure' by a program called `autoconf'.  You need `configure.ac' if
-you want to change it or regenerate `configure' using a newer version
-of `autoconf'.
-
-   The simplest way to compile this package is:
-
-  1. `cd' to the directory containing the package's source code and type
-     `./configure' to configure the package for your system.
-
-     Running `configure' might take a while.  While running, it prints
-     some messages telling which features it is checking for.
-
-  2. Type `make' to compile the package.
-
-  3. Optionally, type `make check' to run any self-tests that come with
-     the package, generally using the just-built uninstalled binaries.
-
-  4. Type `make install' to install the programs and any data files and
-     documentation.  When installing into a prefix owned by root, it is
-     recommended that the package be configured and built as a regular
-     user, and only the `make install' phase executed with root
-     privileges.
-
-  5. Optionally, type `make installcheck' to repeat any self-tests, but
-     this time using the binaries in their final installed location.
-     This target does not install anything.  Running this target as a
-     regular user, particularly if the prior `make install' required
-     root privileges, verifies that the installation completed
-     correctly.
-
-  6. You can remove the program binaries and object files from the
-     source code directory by typing `make clean'.  To also remove the
-     files that `configure' created (so you can compile the package for
-     a different kind of computer), type `make distclean'.  There is
-     also a `make maintainer-clean' target, but that is intended mainly
-     for the package's developers.  If you use it, you may have to get
-     all sorts of other programs in order to regenerate files that came
-     with the distribution.
-
-  7. Often, you can also type `make uninstall' to remove the installed
-     files again.  In practice, not all packages have tested that
-     uninstallation works correctly, even though it is required by the
-     GNU Coding Standards.
-
-  8. Some packages, particularly those that use Automake, provide `make
-     distcheck', which can by used by developers to test that all other
-     targets like `make install' and `make uninstall' work correctly.
-     This target is generally not run by end users.
-
-Compilers and Options
-=====================
-
-   Some systems require unusual options for compilation or linking that
-the `configure' script does not know about.  Run `./configure --help'
-for details on some of the pertinent environment variables.
-
-   You can give `configure' initial values for configuration parameters
-by setting variables in the command line or in the environment.  Here
-is an example:
-
-     ./configure CC=c99 CFLAGS=-g LIBS=-lposix
-
-   *Note Defining Variables::, for more details.
-
-Compiling For Multiple Architectures
-====================================
-
-   You can compile the package for more than one kind of computer at the
-same time, by placing the object files for each architecture in their
-own directory.  To do this, you can use GNU `make'.  `cd' to the
-directory where you want the object files and executables to go and run
-the `configure' script.  `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'.  This
-is known as a "VPATH" build.
-
-   With a non-GNU `make', it is safer to compile the package for one
-architecture at a time in the source code directory.  After you have
-installed the package for one architecture, use `make distclean' before
-reconfiguring for another architecture.
-
-   On MacOS X 10.5 and later systems, you can create libraries and
-executables that work on multiple system types--known as "fat" or
-"universal" binaries--by specifying multiple `-arch' options to the
-compiler but only a single `-arch' option to the preprocessor.  Like
-this:
-
-     ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
-                 CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
-                 CPP="gcc -E" CXXCPP="g++ -E"
-
-   This is not guaranteed to produce working output in all cases, you
-may have to build one architecture at a time and combine the results
-using the `lipo' tool if you have problems.
-
-Installation Names
-==================
-
-   By default, `make install' installs the package's commands under
-`/usr/local/bin', include files under `/usr/local/include', etc.  You
-can specify an installation prefix other than `/usr/local' by giving
-`configure' the option `--prefix=PREFIX', where PREFIX must be an
-absolute file name.
-
-   You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files.  If you
-pass the option `--exec-prefix=PREFIX' to `configure', the package uses
-PREFIX as the prefix for installing programs and libraries.
-Documentation and other data files still use the regular prefix.
-
-   In addition, if you use an unusual directory layout you can give
-options like `--bindir=DIR' to specify different values for particular
-kinds of files.  Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them.  In general, the
-default for these options is expressed in terms of `${prefix}', so that
-specifying just `--prefix' will affect all of the other directory
-specifications that were not explicitly provided.
-
-   The most portable way to affect installation locations is to pass the
-correct locations to `configure'; however, many packages provide one or
-both of the following shortcuts of passing variable assignments to the
-`make install' command line to change installation locations without
-having to reconfigure or recompile.
-
-   The first method involves providing an override variable for each
-affected directory.  For example, `make install
-prefix=/alternate/directory' will choose an alternate location for all
-directory configuration variables that were expressed in terms of
-`${prefix}'.  Any directories that were specified during `configure',
-but not in terms of `${prefix}', must each be overridden at install
-time for the entire installation to be relocated.  The approach of
-makefile variable overrides for each directory variable is required by
-the GNU Coding Standards, and ideally causes no recompilation.
-However, some platforms have known limitations with the semantics of
-shared libraries that end up requiring recompilation when using this
-method, particularly noticeable in packages that use GNU Libtool.
-
-   The second method involves providing the `DESTDIR' variable.  For
-example, `make install DESTDIR=/alternate/directory' will prepend
-`/alternate/directory' before all installation names.  The approach of
-`DESTDIR' overrides is not required by the GNU Coding Standards, and
-does not work on platforms that have drive letters.  On the other hand,
-it does better at avoiding recompilation issues, and works well even
-when some directory options were not specified in terms of `${prefix}'
-at `configure' time.
-
-Optional Features
-=================
-
-   If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
-   Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System).  The
-`README' should mention any `--enable-' and `--with-' options that the
-package recognizes.
-
-   For packages that use the X Window System, `configure' can usually
-find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
-
-   Some packages offer the ability to configure how verbose the
-execution of `make' will be.  For these packages, running `./configure
---enable-silent-rules' sets the default to minimal output, which can be
-overridden with `make V=1'; while running `./configure
---disable-silent-rules' sets the default to verbose, which can be
-overridden with `make V=0'.
-
-Particular systems
-==================
-
-   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU
-CC is not installed, it is recommended to use the following options in
-order to use an ANSI C compiler:
-
-     ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
-
-and if that doesn't work, install pre-built binaries of GCC for HP-UX.
-
-   HP-UX `make' updates targets which have the same time stamps as
-their prerequisites, which makes it generally unusable when shipped
-generated files such as `configure' are involved.  Use GNU `make'
-instead.
-
-   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
-parse its `<wchar.h>' header file.  The option `-nodtk' can be used as
-a workaround.  If GNU CC is not installed, it is therefore recommended
-to try
-
-     ./configure CC="cc"
-
-and if that doesn't work, try
-
-     ./configure CC="cc -nodtk"
-
-   On Solaris, don't put `/usr/ucb' early in your `PATH'.  This
-directory contains several dysfunctional programs; working variants of
-these programs are available in `/usr/bin'.  So, if you need `/usr/ucb'
-in your `PATH', put it _after_ `/usr/bin'.
-
-   On Haiku, software installed for all users goes in `/boot/common',
-not `/usr/local'.  It is recommended to use the following options:
-
-     ./configure --prefix=/boot/common
-
-Specifying the System Type
-==========================
-
-   There may be some features `configure' cannot figure out
-automatically, but needs to determine by the type of machine the package
-will run on.  Usually, assuming the package is built to be run on the
-_same_ architectures, `configure' can figure that out, but if it prints
-a message saying it cannot guess the machine type, give it the
-`--build=TYPE' option.  TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name which has the form:
-
-     CPU-COMPANY-SYSTEM
-
-where SYSTEM can have one of these forms:
-
-     OS
-     KERNEL-OS
-
-   See the file `config.sub' for the possible values of each field.  If
-`config.sub' isn't included in this package, then this package doesn't
-need to know the machine type.
-
-   If you are _building_ compiler tools for cross-compiling, you should
-use the option `--target=TYPE' to select the type of system they will
-produce code for.
-
-   If you want to _use_ a cross compiler, that generates code for a
-platform different from the build platform, you should specify the
-"host" platform (i.e., that on which the generated programs will
-eventually be run) with `--host=TYPE'.
-
-Sharing Defaults
-================
-
-   If you want to set default values for `configure' scripts to share,
-you can create a site shell script called `config.site' that gives
-default values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists.  Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
-
-Defining Variables
-==================
-
-   Variables not defined in a site shell script can be set in the
-environment passed to `configure'.  However, some packages may run
-configure again during the build, and the customized values of these
-variables may be lost.  In order to avoid this problem, you should set
-them in the `configure' command line, using `VAR=value'.  For example:
-
-     ./configure CC=/usr/local2/bin/gcc
-
-causes the specified `gcc' to be used as the C compiler (unless it is
-overridden in the site shell script).
-
-Unfortunately, this technique does not work for `CONFIG_SHELL' due to
-an Autoconf bug.  Until the bug is fixed you can use this workaround:
-
-     CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
-
-`configure' Invocation
-======================
-
-   `configure' recognizes the following options to control how it
-operates.
-
-`--help'
-`-h'
-     Print a summary of all of the options to `configure', and exit.
-
-`--help=short'
-`--help=recursive'
-     Print a summary of the options unique to this package's
-     `configure', and exit.  The `short' variant lists options used
-     only in the top level, while the `recursive' variant lists options
-     also present in any nested packages.
-
-`--version'
-`-V'
-     Print the version of Autoconf used to generate the `configure'
-     script, and exit.
-
-`--cache-file=FILE'
-     Enable the cache: use and save the results of the tests in FILE,
-     traditionally `config.cache'.  FILE defaults to `/dev/null' to
-     disable caching.
-
-`--config-cache'
-`-C'
-     Alias for `--cache-file=config.cache'.
-
-`--quiet'
-`--silent'
-`-q'
-     Do not print messages saying which checks are being made.  To
-     suppress all normal output, redirect it to `/dev/null' (any error
-     messages will still be shown).
-
-`--srcdir=DIR'
-     Look for the package's source code in directory DIR.  Usually
-     `configure' can determine that directory automatically.
-
-`--prefix=DIR'
-     Use DIR as the installation prefix.  *note Installation Names::
-     for more details, including other options available for fine-tuning
-     the installation locations.
-
-`--no-create'
-`-n'
-     Run the configure checks, but stop before creating any output
-     files.
-
-`configure' also accepts some other, not widely useful, options.  Run
-`configure --help' for more details.
-
diff --git a/Makefile.am b/Makefile.am
index b0641e7..4d4e4d6 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -23,8 +23,12 @@
 
 ACLOCAL_AMFLAGS = -I macros
 
-SUBDIRS=linbox macros tests interfaces doc examples benchmarks
+SUBDIRS=linbox benchmarks macros tests interfaces doc examples
 
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = linbox.pc
+
+#  include_HEADERS=linbox-config.h
 # I intend to pare down the target "check" so as to be a smaller check used
 # at installation time with a focus on confirming that dependencies on
 # other packages and compilation environment are in order.  In contrast, the
@@ -33,7 +37,8 @@ SUBDIRS=linbox macros tests interfaces doc examples benchmarks
 
 #  Fullcheck provides a full check for regression testing purposes.
 fullcheck:
-	(${MAKE} ; cd tests; ${MAKE} fullcheck)
+	(${MAKE} ; cd tests; ${MAKE} fullcheck )
+	${MAKE} examples
 
 docs:doc/linbox-html/index.html
 
@@ -46,11 +51,19 @@ doc/linbox-dev-html/pages.html:
 	(cd doc; ${MAKE} docs_dev)
 
 examples:
-	(  ${MAKE} ; cd examples; ${MAKE} examples)
+	(${MAKE} install; cd examples; ${MAKE} examples; ./test.sh)
 
 benchmarks:
 	(cd benchmarks; ${MAKE} benchmarks)
 
+perfpublisher: benchmarks/perfpublisher tests/perfpublisher
+
+benchmarks/perfpublisher:
+	(cd benchmarks; ${MAKE} perfpublisher)
+
+tests/perfpublisher:
+	(cd tests; ${MAKE} perfpublisher)
+
 .PHONY:examples benchmarks
 
 bin_SCRIPTS=linbox-config
@@ -64,14 +77,19 @@ uninstall-hook:
 		"$(mandir)/man1" \
 		"$(mandir)" \
 		"$(includedir)/linbox/algorithms/gauss" \
+		"$(includedir)/linbox/algorithms/IML" \
+		"$(includedir)/linbox/algorithms/matrix-blas3" \
 		"$(includedir)/linbox/algorithms" \
 		"$(includedir)/linbox/blackbox" \
 		"$(includedir)/linbox/element" \
-		"$(includedir)/linbox/field/Givaro" \
-		"$(includedir)/linbox/field/Modular" \
-		"$(includedir)/linbox/field/NTL" \
+		"$(includedir)/linbox/ring/modular" \
+		"$(includedir)/linbox/ring/ntl" \
 		"$(includedir)/linbox/field/" \
 		"$(includedir)/linbox/kaapi" \
+		"$(includedir)/linbox/matrix/sparsematrix" \
+		"$(includedir)/linbox/matrix/densedatrix" \
+		"$(includedir)/linbox/matrix/matrixdomain" \
+		"$(includedir)/linbox/matrix/sliced3" \
 		"$(includedir)/linbox/matrix" \
 		"$(includedir)/linbox/randiter" \
 		"$(includedir)/linbox/ring" \
@@ -84,7 +102,11 @@ uninstall-hook:
 		"$(datarootdir)/" \
 		"$(includedir)" ) || true
 
-VERSION=1.3.2
+git:
+	git commit -a; git pull; git push
+
+
+VERSION=1.4.1
 
 EXTRA_DIST=auto-install.sh
 #incremente-versions
diff --git a/Makefile.in b/Makefile.in
deleted file mode 100644
index 0839154..0000000
--- a/Makefile.in
+++ /dev/null
@@ -1,983 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-#
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-#/
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = .
-DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in $(srcdir)/config.h.in \
-	$(srcdir)/linbox-config.in $(top_srcdir)/configure AUTHORS \
-	COPYING COPYING.LESSER ChangeLog INSTALL NEWS TODO \
-	build-aux/config.guess build-aux/config.sub \
-	build-aux/install-sh build-aux/ltmain.sh build-aux/missing
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno config.status.lineno
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = config.h
-CONFIG_CLEAN_FILES = linbox-config
-CONFIG_CLEAN_VPATH_FILES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(bindir)"
-SCRIPTS = $(bin_SCRIPTS)
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-dvi-recursive install-exec-recursive \
-	install-html-recursive install-info-recursive \
-	install-pdf-recursive install-ps-recursive install-recursive \
-	installcheck-recursive installdirs-recursive pdf-recursive \
-	ps-recursive uninstall-recursive
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
-  distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
-	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
-	distdir dist dist-all distcheck
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-distdir = $(PACKAGE)-$(VERSION)
-top_distdir = $(distdir)
-am__remove_distdir = \
-  if test -d "$(distdir)"; then \
-    find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
-      && rm -rf "$(distdir)" \
-      || { sleep 5 && rm -rf "$(distdir)"; }; \
-  else :; fi
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-DIST_ARCHIVES = $(distdir).tar.gz
-GZIP_ENV = --best
-distuninstallcheck_listfiles = find . -type f -print
-am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
-  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
-distcleancheck_listfiles = find . -type f -print
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = 1.3.2
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-ACLOCAL_AMFLAGS = -I macros
-SUBDIRS = linbox macros tests interfaces doc examples benchmarks
-bin_SCRIPTS = linbox-config
-EXTRA_DIST = auto-install.sh
-all: config.h
-	$(MAKE) $(AM_MAKEFLAGS) all-recursive
-
-.SUFFIXES:
-am--refresh: Makefile
-	@:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      echo ' cd $(srcdir) && $(AUTOMAKE) --gnu --ignore-deps'; \
-	      $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu --ignore-deps \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    echo ' $(SHELL) ./config.status'; \
-	    $(SHELL) ./config.status;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	$(SHELL) ./config.status --recheck
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	$(am__cd) $(srcdir) && $(AUTOCONF)
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
-$(am__aclocal_m4_deps):
-
-config.h: stamp-h1
-	@if test ! -f $@; then rm -f stamp-h1; else :; fi
-	@if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi
-
-stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
-	@rm -f stamp-h1
-	cd $(top_builddir) && $(SHELL) ./config.status config.h
-$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) 
-	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
-	rm -f stamp-h1
-	touch $@
-
-distclean-hdr:
-	-rm -f config.h stamp-h1
-linbox-config: $(top_builddir)/config.status $(srcdir)/linbox-config.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-install-binSCRIPTS: $(bin_SCRIPTS)
-	@$(NORMAL_INSTALL)
-	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
-	done | \
-	sed -e 'p;s,.*/,,;n' \
-	    -e 'h;s|.*|.|' \
-	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
-	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
-	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
-	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
-	      if (++n[d] == $(am__install_max)) { \
-		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
-	    else { print "f", d "/" $$4, $$1 } } \
-	  END { for (d in files) print "f", d, files[d] }' | \
-	while read type dir files; do \
-	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
-	     test -z "$$files" || { \
-	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
-	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
-	     } \
-	; done
-
-uninstall-binSCRIPTS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
-	files=`for p in $$list; do echo "$$p"; done | \
-	       sed -e 's,.*/,,;$(transform)'`; \
-	dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir)
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool config.lt
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	$(am__remove_distdir)
-	test -d "$(distdir)" || mkdir "$(distdir)"
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    $(am__make_dryrun) \
-	      || test -d "$(distdir)/$$subdir" \
-	      || $(MKDIR_P) "$(distdir)/$$subdir" \
-	      || exit 1; \
-	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-	    $(am__relativize); \
-	    new_distdir=$$reldir; \
-	    dir1=$$subdir; dir2="$(top_distdir)"; \
-	    $(am__relativize); \
-	    new_top_distdir=$$reldir; \
-	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-	    ($(am__cd) $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$new_top_distdir" \
-	        distdir="$$new_distdir" \
-		am__remove_distdir=: \
-		am__skip_length_check=: \
-		am__skip_mode_fix=: \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-	-test -n "$(am__skip_mode_fix)" \
-	|| find "$(distdir)" -type d ! -perm -755 \
-		-exec chmod u+rwx,go+rx {} \; -o \
-	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
-	|| chmod -R a+r "$(distdir)"
-dist-gzip: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__remove_distdir)
-
-dist-bzip2: distdir
-	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
-	$(am__remove_distdir)
-
-dist-lzip: distdir
-	tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
-	$(am__remove_distdir)
-
-dist-lzma: distdir
-	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
-	$(am__remove_distdir)
-
-dist-xz: distdir
-	tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
-	$(am__remove_distdir)
-
-dist-tarZ: distdir
-	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
-	$(am__remove_distdir)
-
-dist-shar: distdir
-	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
-	$(am__remove_distdir)
-
-dist-zip: distdir
-	-rm -f $(distdir).zip
-	zip -rq $(distdir).zip $(distdir)
-	$(am__remove_distdir)
-
-dist dist-all: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__remove_distdir)
-
-# This target untars the dist file and tries a VPATH configuration.  Then
-# it guarantees that the distribution is self-contained by making another
-# tarfile.
-distcheck: dist
-	case '$(DIST_ARCHIVES)' in \
-	*.tar.gz*) \
-	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
-	*.tar.bz2*) \
-	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
-	*.tar.lzma*) \
-	  lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
-	*.tar.lz*) \
-	  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
-	*.tar.xz*) \
-	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
-	*.tar.Z*) \
-	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
-	*.shar.gz*) \
-	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
-	*.zip*) \
-	  unzip $(distdir).zip ;;\
-	esac
-	chmod -R a-w $(distdir); chmod a+w $(distdir)
-	mkdir $(distdir)/_build
-	mkdir $(distdir)/_inst
-	chmod a-w $(distdir)
-	test -d $(distdir)/_build || exit 0; \
-	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
-	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
-	  && am__cwd=`pwd` \
-	  && $(am__cd) $(distdir)/_build \
-	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
-	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
-	    $(DISTCHECK_CONFIGURE_FLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
-	  && $(MAKE) $(AM_MAKEFLAGS) check \
-	  && $(MAKE) $(AM_MAKEFLAGS) install \
-	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
-	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
-	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
-	        distuninstallcheck \
-	  && chmod -R a-w "$$dc_install_base" \
-	  && ({ \
-	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
-	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
-	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
-	  && rm -rf "$$dc_destdir" \
-	  && $(MAKE) $(AM_MAKEFLAGS) dist \
-	  && rm -rf $(DIST_ARCHIVES) \
-	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
-	  && cd "$$am__cwd" \
-	  || exit 1
-	$(am__remove_distdir)
-	@(echo "$(distdir) archives ready for distribution: "; \
-	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
-	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
-distuninstallcheck:
-	@test -n '$(distuninstallcheck_dir)' || { \
-	  echo 'ERROR: trying to run $@ with an empty' \
-	       '$$(distuninstallcheck_dir)' >&2; \
-	  exit 1; \
-	}; \
-	$(am__cd) '$(distuninstallcheck_dir)' || { \
-	  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
-	  exit 1; \
-	}; \
-	test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
-	   || { echo "ERROR: files left after uninstall:" ; \
-	        if test -n "$(DESTDIR)"; then \
-	          echo "  (check DESTDIR support)"; \
-	        fi ; \
-	        $(distuninstallcheck_listfiles) ; \
-	        exit 1; } >&2
-distcleancheck: distclean
-	@if test '$(srcdir)' = . ; then \
-	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
-	  exit 1 ; \
-	fi
-	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
-	  || { echo "ERROR: files left in build directory after distclean:" ; \
-	       $(distcleancheck_listfiles) ; \
-	       exit 1; } >&2
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(SCRIPTS) config.h
-installdirs: installdirs-recursive
-installdirs-am:
-	for dir in "$(DESTDIR)$(bindir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-hdr \
-	distclean-libtool distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am: install-binSCRIPTS
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf $(top_srcdir)/autom4te.cache
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-binSCRIPTS
-	@$(NORMAL_INSTALL)
-	$(MAKE) $(AM_MAKEFLAGS) uninstall-hook
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \
-	ctags-recursive install-am install-strip tags-recursive \
-	uninstall-am
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-	all all-am am--refresh check check-am clean clean-generic \
-	clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \
-	dist-gzip dist-lzip dist-lzma dist-shar dist-tarZ dist-xz \
-	dist-zip distcheck distclean distclean-generic distclean-hdr \
-	distclean-libtool distclean-tags distcleancheck distdir \
-	distuninstallcheck dvi dvi-am html html-am info info-am \
-	install install-am install-binSCRIPTS install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-ps install-ps-am install-strip installcheck \
-	installcheck-am installdirs installdirs-am maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
-	uninstall uninstall-am uninstall-binSCRIPTS uninstall-hook
-
-
-# I intend to pare down the target "check" so as to be a smaller check used
-# at installation time with a focus on confirming that dependencies on
-# other packages and compilation environment are in order.  In contrast, the
-# target "fullcheck" should become as exhaustive as possible to serve
-# developers for regression testing. -bds 2011Feb ...also benchmarks will be.
-
-#  Fullcheck provides a full check for regression testing purposes.
-fullcheck:
-	(${MAKE} ; cd tests; ${MAKE} fullcheck)
-
-docs:doc/linbox-html/index.html
-
-doc/linbox-html/index.html:
-	(cd doc; ${MAKE} docs)
-
-docs_dev:doc/linbox-dev-html/pages.html
-
-doc/linbox-dev-html/pages.html:
-	(cd doc; ${MAKE} docs_dev)
-
-examples:
-	(  ${MAKE} ; cd examples; ${MAKE} examples)
-
-benchmarks:
-	(cd benchmarks; ${MAKE} benchmarks)
-
-.PHONY:examples benchmarks
-
-bundled:
-	sh auto-install.sh
-
-uninstall-hook:
-	(test -d "$(includedir)/linbox" && rmdir  "$(bindir)" \
-		"$(libdir)" \
-		"$(mandir)/man1" \
-		"$(mandir)" \
-		"$(includedir)/linbox/algorithms/gauss" \
-		"$(includedir)/linbox/algorithms" \
-		"$(includedir)/linbox/blackbox" \
-		"$(includedir)/linbox/element" \
-		"$(includedir)/linbox/field/Givaro" \
-		"$(includedir)/linbox/field/Modular" \
-		"$(includedir)/linbox/field/NTL" \
-		"$(includedir)/linbox/field/" \
-		"$(includedir)/linbox/kaapi" \
-		"$(includedir)/linbox/matrix" \
-		"$(includedir)/linbox/randiter" \
-		"$(includedir)/linbox/ring" \
-		"$(includedir)/linbox/solutions" \
-		"$(includedir)/linbox/switch" \
-		"$(includedir)/linbox/util/formats" \
-		"$(includedir)/linbox/util" \
-		"$(includedir)/linbox/vector" \
-		"$(includedir)/linbox" \
-		"$(datarootdir)/" \
-		"$(includedir)" ) || true
-#incremente-versions
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/NEWS b/NEWS
index 5ab6628..14285d7 100644
--- a/NEWS
+++ b/NEWS
@@ -13,13 +13,13 @@ Version 0.1.1, 27 August 2002
 	- Size checking at build time and definition of data types
 	  int8, int16, int32, int64 and unsigned variants, guaranteed
 	  to be of their respective lengths. Specializations of
-	  Modular have been updated to use these types
-	- Performance tweaks to Modular<uint32> specialization of dot
+	  Givaro::Modular have been updated to use these types
+	- Performance tweaks to Givaro::Modular<uint32> specialization of dot
 	  product
 	- New test suites for the commentator and butterfly
 	  preconditioner
 	- Numerous commentator bugfixes and output tweaks
-	- Removed inefficiency in the Modular random iterator
+	- Removed inefficiency in the Givaro::Modular random iterator
 	- Reorganization and simplification of modular, vector domain,
 	  and sparse matrix tests
 	- Enhancements and fixes in the build system
diff --git a/README b/README
index ec17613..b2b4705 100644
--- a/README
+++ b/README
@@ -2,19 +2,21 @@
 
 PURPOSE:
 
-The Linbox library provides functionalities for exact linear algebra.
+The Linbox library provides functionality for exact linear algebra.
 See doc/mainpage.doxy for more info.
 
 INSTALLATION:
 
-See doc/install*html for particulars.
+See doc/install-dev.html for installation from the git lastest version.
+See doc/install-dist.html for installation from a release tarball.
 See INSTALL for generic installation information.
 
 
-AVAILABILITY: from linalg.org
+AVAILABILITY: from linalg.org and from github.com/linbox-team
 
 
-REQUIREMENTS:  GMP, ATLAS (or other cblas, lapack), NTL, Givaro
+REQUIREMENTS:  GMP, ATLAS (or other cblas, lapack), Givaro, fflas-ffpack
+OPTIONAL Dependencies: NTL, IML, FLINT, M4RI, M4RIE 
 See  doc/install*html for details.
 
 This library requires the GNU C++ compiler (gcc-4.3 or newer) or any 
@@ -27,6 +29,6 @@ The linbox website is http://linalg.org
 Corrections, suggestions and comments to : 
 linbox-use at googlegroups.com
  
-Last update : 2009 September
+Last update : 2015 July
  
 
diff --git a/RELEASE-INSTRUCTIONS b/RELEASE-INSTRUCTIONS
new file mode 100644
index 0000000..c2815f6
--- /dev/null
+++ b/RELEASE-INSTRUCTIONS
@@ -0,0 +1,28 @@
+Instructions for making a LinBox release:
+
+1. Run 'svn up ' to make sure you are fully up to date and on the
+   HEAD branch [1]
+2. Update the version number in Makefile.am next to 'VERSION = ', and in configure.in:3
+3. Run 'make distcheck' on your local copy of LinBox. If there are any
+   problems, fix them and commit the fixes to CVS. Usually problems
+   will be things like header files that are not being installed, but
+   should be. Make sure 'make distcheck' runs once without having any
+   errors before moving onto the next step. Also, record all of the
+   changes you make in ChangeLog.
+4. Add a ChangeLog entry for Makefile.am with the text 'New version
+   <version>' where <version> is the version you are releasing.
+5. Make sure everything in your local copy of LinBox is committed. In
+   particular, either commit or eliminate anything from step 1 that
+   was marked modified.
+6. Run 'make dist' (or 'make distcheck') so that the last ChangeLog
+   entry is included in your tarball.
+7. Copy the tarball produced in step 6 to the web server.
+8. Update the LinBox web site with information on the new release --
+   mention it in news.html and update the latest version information
+   in index.html and download.html
+
+[1] Of course, this assumes that you want to release from the head
+    branch. If HEAD represents the development version and you
+    actually want to release from a stable branch, you should use
+      cvs up -dP -r linbox-<version>
+    where <version> is the version identifier in the stable branch
\ No newline at end of file
diff --git a/TODO b/TODO
index ce7456b..621e742 100644
--- a/TODO
+++ b/TODO
@@ -4,7 +4,6 @@ file docs of examples fixed
 file docs of */archetype.h removed
 eliminate */archetype.doxy's ?
 eliminate randiter/randiters.doxy's ?
-resolve modular-balance-int32 vs modular-int32 wierdness (same ifndef, can't coexist?).
 ------- older below -----------
  - Test suite for random iterators
  - Test suite for vector stream
@@ -24,3 +23,62 @@ Before meeting:
 
 ----
  - NoCblasErrorChecks on release version ?
+
+--------------------------------------------
+History
+1) g++-4 compatibility
+---> OK, JGD 21.12.2006
+
+2) full BLAS compatibility with documentations (at least examples of use with ATLAS, GOTO, MAC BLAS)
+---> Goto BLAS checked, Pascal.
+---> MAC blas ?
+---> lapack ?
+---> 2b) wrappers for clapack_dgetrf et clapack_dgetri
+	4 possible solutions:
+		a) remove hybrid rational solver 
+		b) keep it but it works only with ATLAS (thus correct test-smith-form using #ifdef LINBOX_HAVE_ATLAS)
+		c) Add a  --with-lapack option which must find dgetrf AND dgetri in a classical lapack (we thus provide clapack_dgetri and clapack_dgetrf
+		   within config-blas.h) or which finds clapack_dgetri AND clapack_dgetrf (e.g. in ATLAS).
+		d) For this to work directly with Goto: we provide dgetri using dgetrf and dtrtri and dtrsm of Goto. 
+---> OK, JGD 13.01.2007
+---> there remains to implement a dgetri for GotoBLAS in order to enable Zhendong's numerical solver
+
+3) gmp++ must be totally independent of Linbox and Givaro, add in LinBox and Givaro files to handle differences
+---> OK, JGD 21.12.2006
+
+4) Install documentation with simple examples
+
+5) Data in linbox examples
+
+5b) One example for each solution
+
+6) move complicated and large coded solutions to algorithms directory
+
+7) add #else, at least, throwing LinboxError exception to every #ifdef __LINBOX_HAVE_???
+
+8) read/write matrices and vectors efficiently in a coherent manner for formats
+
+9) document matrices and vectors formats (links to web tutorial, provide data examples)
+
+10) uniformly distributed random integers ! (in checks)
+---> OK
+
+11) add irreducibility test in added constructor of Givaro GFq
+
+12) Maple interface and LinBox drivers
+---> OK, 18.01.2007, Pascal.
+
+13) check valence solutions
+
+14) check generic LU ?
+14b) Uniformize different eliminations (generic LU, sparse elim, dense etc.)
+
+15) check blackbox rank when using extension fields
+
+NEW CODE (Algorithms, Solutions, Checks must be provided plus exceptions for non-handled cases)
+16) sigma base, polynomial matrix multiplication, sparse rational solver, block Hankel/Toeplitz blackbox
+16b) Parallel rank
+17) Smith form
+
+18) hybrid determinant
+---> OK, Anna 10.01.2007
diff --git a/aclocal.m4 b/aclocal.m4
deleted file mode 100644
index 77af140..0000000
--- a/aclocal.m4
+++ /dev/null
@@ -1,998 +0,0 @@
-# generated automatically by aclocal 1.11.5 -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
-# Inc.
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-m4_ifndef([AC_AUTOCONF_VERSION],
-  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
-[m4_warning([this file was generated for autoconf 2.69.
-You have another version of autoconf.  It may work, but is not guaranteed to.
-If you have problems, you may need to regenerate the build system entirely.
-To do so, use the procedure documented by the package, typically `autoreconf'.])])
-
-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software
-# Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_AUTOMAKE_VERSION(VERSION)
-# ----------------------------
-# Automake X.Y traces this macro to ensure aclocal.m4 has been
-# generated from the m4 files accompanying Automake X.Y.
-# (This private macro should not be called outside this file.)
-AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.11'
-dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
-dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.11.5], [],
-      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
-])
-
-# _AM_AUTOCONF_VERSION(VERSION)
-# -----------------------------
-# aclocal traces this macro to find the Autoconf version.
-# This is a private macro too.  Using m4_define simplifies
-# the logic in aclocal, which can simply ignore this definition.
-m4_define([_AM_AUTOCONF_VERSION], [])
-
-# AM_SET_CURRENT_AUTOMAKE_VERSION
-# -------------------------------
-# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
-# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
-AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.5])dnl
-m4_ifndef([AC_AUTOCONF_VERSION],
-  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
-
-# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
-
-# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
-# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
-#
-# Of course, Automake must honor this variable whenever it calls a
-# tool from the auxiliary directory.  The problem is that $srcdir (and
-# therefore $ac_aux_dir as well) can be either absolute or relative,
-# depending on how configure is run.  This is pretty annoying, since
-# it makes $ac_aux_dir quite unusable in subdirectories: in the top
-# source directory, any form will work fine, but in subdirectories a
-# relative path needs to be adjusted first.
-#
-# $ac_aux_dir/missing
-#    fails when called from a subdirectory if $ac_aux_dir is relative
-# $top_srcdir/$ac_aux_dir/missing
-#    fails if $ac_aux_dir is absolute,
-#    fails when called from a subdirectory in a VPATH build with
-#          a relative $ac_aux_dir
-#
-# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
-# are both prefixed by $srcdir.  In an in-source build this is usually
-# harmless because $srcdir is `.', but things will broke when you
-# start a VPATH build or use an absolute $srcdir.
-#
-# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
-# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
-#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
-# and then we would define $MISSING as
-#   MISSING="\${SHELL} $am_aux_dir/missing"
-# This will work as long as MISSING is not called from configure, because
-# unfortunately $(top_srcdir) has no meaning in configure.
-# However there are other variables, like CC, which are often used in
-# configure, and could therefore not use this "fixed" $ac_aux_dir.
-#
-# Another solution, used here, is to always expand $ac_aux_dir to an
-# absolute PATH.  The drawback is that using absolute paths prevent a
-# configured tree to be moved without reconfiguration.
-
-AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-])
-
-# AM_CONDITIONAL                                            -*- Autoconf -*-
-
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 9
-
-# AM_CONDITIONAL(NAME, SHELL-CONDITION)
-# -------------------------------------
-# Define a conditional.
-AC_DEFUN([AM_CONDITIONAL],
-[AC_PREREQ(2.52)dnl
- ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
-	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
-AC_SUBST([$1_TRUE])dnl
-AC_SUBST([$1_FALSE])dnl
-_AM_SUBST_NOTMAKE([$1_TRUE])dnl
-_AM_SUBST_NOTMAKE([$1_FALSE])dnl
-m4_define([_AM_COND_VALUE_$1], [$2])dnl
-if $2; then
-  $1_TRUE=
-  $1_FALSE='#'
-else
-  $1_TRUE='#'
-  $1_FALSE=
-fi
-AC_CONFIG_COMMANDS_PRE(
-[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
-  AC_MSG_ERROR([[conditional "$1" was never defined.
-Usually this means the macro was only invoked conditionally.]])
-fi])])
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,
-# 2010, 2011 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 12
-
-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
-# written in clear, in which case automake, when reading aclocal.m4,
-# will think it sees a *use*, and therefore will trigger all it's
-# C support machinery.  Also note that it means that autoscan, seeing
-# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
-
-
-# _AM_DEPENDENCIES(NAME)
-# ----------------------
-# See how the compiler implements dependency checking.
-# NAME is "CC", "CXX", "GCJ", or "OBJC".
-# We try a few techniques and use that to set a single cache variable.
-#
-# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
-# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
-# dependency, and given that the user is not expected to run this macro,
-# just rely on AC_PROG_CC.
-AC_DEFUN([_AM_DEPENDENCIES],
-[AC_REQUIRE([AM_SET_DEPDIR])dnl
-AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
-AC_REQUIRE([AM_MAKE_INCLUDE])dnl
-AC_REQUIRE([AM_DEP_TRACK])dnl
-
-ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
-       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
-       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
-       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
-       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
-                   [depcc="$$1"   am_compiler_list=])
-
-AC_CACHE_CHECK([dependency style of $depcc],
-               [am_cv_$1_dependencies_compiler_type],
-[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_$1_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
-  fi
-  am__universal=false
-  m4_case([$1], [CC],
-    [case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac],
-    [CXX],
-    [case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac])
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_$1_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_$1_dependencies_compiler_type=none
-fi
-])
-AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
-AM_CONDITIONAL([am__fastdep$1], [
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
-])
-
-
-# AM_SET_DEPDIR
-# -------------
-# Choose a directory name for dependency files.
-# This macro is AC_REQUIREd in _AM_DEPENDENCIES
-AC_DEFUN([AM_SET_DEPDIR],
-[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
-])
-
-
-# AM_DEP_TRACK
-# ------------
-AC_DEFUN([AM_DEP_TRACK],
-[AC_ARG_ENABLE(dependency-tracking,
-[  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors])
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-  am__nodep='_no'
-fi
-AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
-AC_SUBST([AMDEPBACKSLASH])dnl
-_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
-AC_SUBST([am__nodep])dnl
-_AM_SUBST_NOTMAKE([am__nodep])dnl
-])
-
-# Generate code to set up dependency tracking.              -*- Autoconf -*-
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-#serial 5
-
-# _AM_OUTPUT_DEPENDENCY_COMMANDS
-# ------------------------------
-AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
-[{
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
-  # are listed without --file.  Let's play safe and only enable the eval
-  # if we detect the quoting.
-  case $CONFIG_FILES in
-  *\'*) eval set x "$CONFIG_FILES" ;;
-  *)   set x $CONFIG_FILES ;;
-  esac
-  shift
-  for mf
-  do
-    # Strip MF so we end up with the name of the file.
-    mf=`echo "$mf" | sed -e 's/:.*$//'`
-    # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
-    # some people rename them; so instead we look at the file content.
-    # Grep'ing the first line is not enough: some people post-process
-    # each Makefile.in and add a new line on top of each file to say so.
-    # Grep'ing the whole file is not good either: AIX grep has a line
-    # limit of 2048, but all sed's we know have understand at least 4000.
-    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-      dirpart=`AS_DIRNAME("$mf")`
-    else
-      continue
-    fi
-    # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
-    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-    test -z "$DEPDIR" && continue
-    am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
-    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
-    # Find all dependency output files, they are included files with
-    # $(DEPDIR) in their names.  We invoke sed twice because it is the
-    # simplest approach to changing $(DEPDIR) to its actual value in the
-    # expansion.
-    for file in `sed -n "
-      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-      # Make sure the directory exists.
-      test -f "$dirpart/$file" && continue
-      fdir=`AS_DIRNAME(["$file"])`
-      AS_MKDIR_P([$dirpart/$fdir])
-      # echo "creating $dirpart/$file"
-      echo '# dummy' > "$dirpart/$file"
-    done
-  done
-}
-])# _AM_OUTPUT_DEPENDENCY_COMMANDS
-
-
-# AM_OUTPUT_DEPENDENCY_COMMANDS
-# -----------------------------
-# This macro should only be invoked once -- use via AC_REQUIRE.
-#
-# This code is only required when automatic dependency tracking
-# is enabled.  FIXME.  This creates each `.P' file that we will
-# need in order to bootstrap the dependency handling code.
-AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
-[AC_CONFIG_COMMANDS([depfiles],
-     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
-     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
-])
-
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 8
-
-# AM_CONFIG_HEADER is obsolete.  It has been replaced by AC_CONFIG_HEADERS.
-AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
-
-# Do all the work for Automake.                             -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 16
-
-# This macro actually does too much.  Some checks are only needed if
-# your package does certain things.  But this isn't really a big deal.
-
-# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
-# AM_INIT_AUTOMAKE([OPTIONS])
-# -----------------------------------------------
-# The call with PACKAGE and VERSION arguments is the old style
-# call (pre autoconf-2.50), which is being phased out.  PACKAGE
-# and VERSION should now be passed to AC_INIT and removed from
-# the call to AM_INIT_AUTOMAKE.
-# We support both call styles for the transition.  After
-# the next Automake release, Autoconf can make the AC_INIT
-# arguments mandatory, and then we can depend on a new Autoconf
-# release and drop the old call support.
-AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.62])dnl
-dnl Autoconf wants to disallow AM_ names.  We explicitly allow
-dnl the ones we care about.
-m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
-AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
-AC_REQUIRE([AC_PROG_INSTALL])dnl
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-AC_SUBST([CYGPATH_W])
-
-# Define the identity of the package.
-dnl Distinguish between old-style and new-style calls.
-m4_ifval([$2],
-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
- AC_SUBST([PACKAGE], [$1])dnl
- AC_SUBST([VERSION], [$2])],
-[_AM_SET_OPTIONS([$1])dnl
-dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
-m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
-  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
-
-_AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
-
-# Some tools Automake needs.
-AC_REQUIRE([AM_SANITY_CHECK])dnl
-AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
-AM_MISSING_PROG(AUTOCONF, autoconf)
-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
-AM_MISSING_PROG(AUTOHEADER, autoheader)
-AM_MISSING_PROG(MAKEINFO, makeinfo)
-AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
-AC_REQUIRE([AM_PROG_MKDIR_P])dnl
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([AC_PROG_MAKE_SET])dnl
-AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
-	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
-			     [_AM_PROG_TAR([v7])])])
-_AM_IF_OPTION([no-dependencies],,
-[AC_PROVIDE_IFELSE([AC_PROG_CC],
-		  [_AM_DEPENDENCIES(CC)],
-		  [define([AC_PROG_CC],
-			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_CXX],
-		  [_AM_DEPENDENCIES(CXX)],
-		  [define([AC_PROG_CXX],
-			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_OBJC],
-		  [_AM_DEPENDENCIES(OBJC)],
-		  [define([AC_PROG_OBJC],
-			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
-])
-_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
-dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
-dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
-dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
-AC_CONFIG_COMMANDS_PRE(dnl
-[m4_provide_if([_AM_COMPILER_EXEEXT],
-  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
-])
-
-dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
-dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
-dnl mangled by Autoconf and run in a shell conditional statement.
-m4_define([_AC_COMPILER_EXEEXT],
-m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
-
-
-# When config.status generates a header, we must update the stamp-h file.
-# This file resides in the same directory as the config header
-# that is generated.  The stamp files are numbered to have different names.
-
-# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
-# loop where config.status creates the headers, so we can generate
-# our stamp files there.
-AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
-[# Compute $1's index in $config_headers.
-_am_arg=$1
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $_am_arg | $_am_arg:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
-
-# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,
-# Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_PROG_INSTALL_SH
-# ------------------
-# Define $install_sh.
-AC_DEFUN([AM_PROG_INSTALL_SH],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-if test x"${install_sh}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
-  *)
-    install_sh="\${SHELL} $am_aux_dir/install-sh"
-  esac
-fi
-AC_SUBST(install_sh)])
-
-# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# Check whether the underlying file-system supports filenames
-# with a leading dot.  For instance MS-DOS doesn't.
-AC_DEFUN([AM_SET_LEADING_DOT],
-[rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
-else
-  am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-AC_SUBST([am__leading_dot])])
-
-# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
-# From Jim Meyering
-
-# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008,
-# 2011 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# AM_MAINTAINER_MODE([DEFAULT-MODE])
-# ----------------------------------
-# Control maintainer-specific portions of Makefiles.
-# Default is to disable them, unless `enable' is passed literally.
-# For symmetry, `disable' may be passed as well.  Anyway, the user
-# can override the default with the --enable/--disable switch.
-AC_DEFUN([AM_MAINTAINER_MODE],
-[m4_case(m4_default([$1], [disable]),
-       [enable], [m4_define([am_maintainer_other], [disable])],
-       [disable], [m4_define([am_maintainer_other], [enable])],
-       [m4_define([am_maintainer_other], [enable])
-        m4_warn([syntax], [unexpected argument to AM@&t at _MAINTAINER_MODE: $1])])
-AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
-  dnl maintainer-mode's default is 'disable' unless 'enable' is passed
-  AC_ARG_ENABLE([maintainer-mode],
-[  --][am_maintainer_other][-maintainer-mode  am_maintainer_other make rules and dependencies not useful
-			  (and sometimes confusing) to the casual installer],
-      [USE_MAINTAINER_MODE=$enableval],
-      [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
-  AC_MSG_RESULT([$USE_MAINTAINER_MODE])
-  AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
-  MAINT=$MAINTAINER_MODE_TRUE
-  AC_SUBST([MAINT])dnl
-]
-)
-
-AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
-
-# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
-
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 6
-
-# AM_MISSING_PROG(NAME, PROGRAM)
-# ------------------------------
-AC_DEFUN([AM_MISSING_PROG],
-[AC_REQUIRE([AM_MISSING_HAS_RUN])
-$1=${$1-"${am_missing_run}$2"}
-AC_SUBST($1)])
-
-
-# AM_MISSING_HAS_RUN
-# ------------------
-# Define MISSING if not defined so far and test if it supports --run.
-# If it does, set am_missing_run to use it, otherwise, to nothing.
-AC_DEFUN([AM_MISSING_HAS_RUN],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([missing])dnl
-if test x"${MISSING+set}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
-  *)
-    MISSING="\${SHELL} $am_aux_dir/missing" ;;
-  esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  AC_MSG_WARN([`missing' script is too old or missing])
-fi
-])
-
-# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,
-# Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_PROG_MKDIR_P
-# ---------------
-# Check for `mkdir -p'.
-AC_DEFUN([AM_PROG_MKDIR_P],
-[AC_PREREQ([2.60])dnl
-AC_REQUIRE([AC_PROG_MKDIR_P])dnl
-dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
-dnl while keeping a definition of mkdir_p for backward compatibility.
-dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
-dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
-dnl Makefile.ins that do not define MKDIR_P, so we do our own
-dnl adjustment using top_builddir (which is defined more often than
-dnl MKDIR_P).
-AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
-case $mkdir_p in
-  [[\\/$]]* | ?:[[\\/]]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-])
-
-# Helper functions for option handling.                     -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software
-# Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# _AM_MANGLE_OPTION(NAME)
-# -----------------------
-AC_DEFUN([_AM_MANGLE_OPTION],
-[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
-
-# _AM_SET_OPTION(NAME)
-# --------------------
-# Set option NAME.  Presently that only means defining a flag for this option.
-AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
-
-# _AM_SET_OPTIONS(OPTIONS)
-# ------------------------
-# OPTIONS is a space-separated list of Automake options.
-AC_DEFUN([_AM_SET_OPTIONS],
-[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
-
-# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
-# -------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-AC_DEFUN([_AM_IF_OPTION],
-[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-
-# Check to make sure that the build environment is sane.    -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# AM_SANITY_CHECK
-# ---------------
-AC_DEFUN([AM_SANITY_CHECK],
-[AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name.  Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
-  *[[\\\"\#\$\&\'\`$am_lf]]*)
-    AC_MSG_ERROR([unsafe absolute working directory name]);;
-esac
-case $srcdir in
-  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
-    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$[*]" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$[*]" != "X $srcdir/configure conftest.file" \
-      && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
-alias in your environment])
-   fi
-
-   test "$[2]" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   AC_MSG_ERROR([newly created file is older than distributed files!
-Check your system clock])
-fi
-AC_MSG_RESULT(yes)])
-
-# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_PROG_INSTALL_STRIP
-# ---------------------
-# One issue with vendor `install' (even GNU) is that you can't
-# specify the program used to strip binaries.  This is especially
-# annoying in cross-compiling environments, where the build's strip
-# is unlikely to handle the host's binaries.
-# Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in `make install-strip', and initialize
-# STRIPPROG with the value of the STRIP variable (set by the user).
-AC_DEFUN([AM_PROG_INSTALL_STRIP],
-[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
-if test "$cross_compiling" != no; then
-  AC_CHECK_TOOL([STRIP], [strip], :)
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-AC_SUBST([INSTALL_STRIP_PROGRAM])])
-
-# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 3
-
-# _AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
-# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
-# This macro is traced by Automake.
-AC_DEFUN([_AM_SUBST_NOTMAKE])
-
-# AM_SUBST_NOTMAKE(VARIABLE)
-# --------------------------
-# Public sister of _AM_SUBST_NOTMAKE.
-AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
-
-# Check how to create a tarball.                            -*- Autoconf -*-
-
-# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# _AM_PROG_TAR(FORMAT)
-# --------------------
-# Check how to create a tarball in format FORMAT.
-# FORMAT should be one of `v7', `ustar', or `pax'.
-#
-# Substitute a variable $(am__tar) that is a command
-# writing to stdout a FORMAT-tarball containing the directory
-# $tardir.
-#     tardir=directory && $(am__tar) > result.tar
-#
-# Substitute a variable $(am__untar) that extract such
-# a tarball read from stdin.
-#     $(am__untar) < result.tar
-AC_DEFUN([_AM_PROG_TAR],
-[# Always define AMTAR for backward compatibility.  Yes, it's still used
-# in the wild :-(  We should find a proper way to deprecate it ...
-AC_SUBST([AMTAR], ['$${TAR-tar}'])
-m4_if([$1], [v7],
-     [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
-     [m4_case([$1], [ustar],, [pax],,
-              [m4_fatal([Unknown tar format])])
-AC_MSG_CHECKING([how to create a $1 tar archive])
-# Loop over all known methods to create a tar archive until one works.
-_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
-_am_tools=${am_cv_prog_tar_$1-$_am_tools}
-# Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of `-'.
-for _am_tool in $_am_tools
-do
-  case $_am_tool in
-  gnutar)
-    for _am_tar in tar gnutar gtar;
-    do
-      AM_RUN_LOG([$_am_tar --version]) && break
-    done
-    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
-    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
-    am__untar="$_am_tar -xf -"
-    ;;
-  plaintar)
-    # Must skip GNU tar: if it does not support --format= it doesn't create
-    # ustar tarball either.
-    (tar --version) >/dev/null 2>&1 && continue
-    am__tar='tar chf - "$$tardir"'
-    am__tar_='tar chf - "$tardir"'
-    am__untar='tar xf -'
-    ;;
-  pax)
-    am__tar='pax -L -x $1 -w "$$tardir"'
-    am__tar_='pax -L -x $1 -w "$tardir"'
-    am__untar='pax -r'
-    ;;
-  cpio)
-    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
-    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
-    am__untar='cpio -i -H $1 -d'
-    ;;
-  none)
-    am__tar=false
-    am__tar_=false
-    am__untar=false
-    ;;
-  esac
-
-  # If the value was cached, stop now.  We just wanted to have am__tar
-  # and am__untar set.
-  test -n "${am_cv_prog_tar_$1}" && break
-
-  # tar/untar a dummy directory, and stop if the command works
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  echo GrepMe > conftest.dir/file
-  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
-  rm -rf conftest.dir
-  if test -s conftest.tar; then
-    AM_RUN_LOG([$am__untar <conftest.tar])
-    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
-  fi
-done
-rm -rf conftest.dir
-
-AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
-AC_MSG_RESULT([$am_cv_prog_tar_$1])])
-AC_SUBST([am__tar])
-AC_SUBST([am__untar])
-]) # _AM_PROG_TAR
-
-m4_include([macros/aclocal-include.m4])
-m4_include([macros/config-header.m4])
-m4_include([macros/debug.m4])
-m4_include([macros/expat-check.m4])
-m4_include([macros/fflas-ffpack-check.m4])
-m4_include([macros/fplll-check.m4])
-m4_include([macros/givaro-check.m4])
-m4_include([macros/gmp-check.m4])
-m4_include([macros/iml-check.m4])
-m4_include([macros/lapack-check.m4])
-m4_include([macros/libtool.m4])
-m4_include([macros/lidia-check.m4])
-m4_include([macros/linbox-benchmark.m4])
-m4_include([macros/linbox-doc.m4])
-m4_include([macros/linbox-misc.m4])
-m4_include([macros/linbox-opt.m4])
-m4_include([macros/ltoptions.m4])
-m4_include([macros/ltsugar.m4])
-m4_include([macros/ltversion.m4])
-m4_include([macros/lt~obsolete.m4])
-m4_include([macros/m4ri-check.m4])
-m4_include([macros/m4rie-check.m4])
-m4_include([macros/maple-check.m4])
-m4_include([macros/mpfr-check.m4])
-m4_include([macros/ntl-check.m4])
-m4_include([macros/saclib-check.m4])
-m4_include([macros/sage-check.m4])
diff --git a/auto-install.sh b/auto-install.sh
index 032a7d6..695c825 100755
--- a/auto-install.sh
+++ b/auto-install.sh
@@ -1,7 +1,7 @@
 #!/bin/bash - 
 
 # Copyright(c) 2011 LinBox
-# Written by BB <bboyer at imag.fr>
+# Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
 # see COPYING for more details.
 
 
@@ -13,12 +13,20 @@
 # TODO : rpath instead of LD_LIBRARY_PATH ?
 
 STABLE_FFLAS=1.6.0
-STABLE_GIVARO=3.7.0
-GIV_TAR=207
-GIV_MD5=208
+STABLE_GIVARO=3.7.2
+GIV_TAR=370
+GIV_MD5=371
+
+
+function decompress {
+#tar xf $1
+gunzip -c $1 | tar xf -
+}
+
+
 
 #switches
-STABLE_VAR="true"
+STABLE_VAR="false"
 DEBUG=""
 DEBUG_VAR=""
 WARNINGS=""
@@ -27,7 +35,7 @@ OPTIM="--enable-optimization"
 OPTIM_VAR=""
 CHECK_VAR=""
 #options
-PREFIX_LOC="/tmp"
+PREFIX_LOC="/usr/local"
 PREFIX_VAR=""
 PREFIX="--prefix=$PREFIX_LOC"
 BLAS=""
@@ -77,7 +85,7 @@ help() {
 	echo
 	echo " * usage :"
 	echo
-	echo " --stable=[yes,no]     : install latest stable versions or latest svn versions."
+	echo " --stable=[yes,no]     : install latest stable versions or latest git versions."
 	echo "                         Default : yes, even if switch ommitted. No argument means yes"
 
 	echo " --prefix=MY/PATH      : install all libraries under MY/PATH."
@@ -355,7 +363,7 @@ fi
 cool
 
 ####################
-#  fectch sources  #
+#  fetch sources  #
 ####################
 
 cd build ;
@@ -384,7 +392,7 @@ if [ "$STABLE_VAR" = "true" ]; then
 	fi
 else
 	OK=0 ;
-	svn co svn://scm.forge.imag.fr/var/lib/gforge/chroot/scmrepos/svn/givaro/trunk 2>&1 >/dev/null && OK=1 
+	git clone https://github.com/linbox-team/givaro.git 2>&1 >/dev/null && OK=1 
 	[ "$OK" = "1" ] &&  cool  || die 
 fi
 
@@ -412,7 +420,7 @@ if [ "$STABLE_VAR" = "true" ]; then
 	fi
 else
 	OK=0 ;
-	svn co svn://linalg.org/fflas-ffpack 2>&1 >/dev/null && OK=1 
+	git clone https://github.com/linbox-team/fflas-ffpack.git 2>&1 >/dev/null && OK=1 
 	[ "$OK" = "1" ] &&  cool  || die
 fi
 
@@ -426,7 +434,7 @@ fi
 OK=0
 if [ "$STABLE_VAR" = "true" ]; then
 	echo -en "${BEG}extracting Givaro..."| tee -a ../auto-install.log
-	tar xzf givaro-$STABLE_GIVARO.tar.gz  && OK=1
+	decompress givaro-$STABLE_GIVARO.tar.gz  && OK=1
 	[ "$OK" = "1" ] &&  cool   || die 
 fi
 
@@ -435,7 +443,7 @@ fi
 OK=0
 if [ "$STABLE_VAR" = "true" ]; then
 	echo -en "${BEG}extracting Fflas-Ffpack..."| tee -a ../auto-install.log
-	tar xzf fflas-ffpack-$STABLE_FFLAS.tar.gz  && OK=1
+	decompress fflas-ffpack-$STABLE_FFLAS.tar.gz  && OK=1
 	[ "$OK" = "1" ] &&  cool   || die
 fi
 
@@ -448,7 +456,7 @@ fi
 if [ "$STABLE_VAR" = "true" ]; then
 	cd givaro-$STABLE_GIVARO || die
 else
-	cd trunk/ || die
+	cd givaro/ || die
 fi
 
 if [ -f Makefile ] ; then
diff --git a/autogen.sh b/autogen.sh
new file mode 100755
index 0000000..f0f6cb4
--- /dev/null
+++ b/autogen.sh
@@ -0,0 +1,200 @@
+#!/bin/sh
+# Copyright (c) LinBox
+#
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the  GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# ========LICENCE========
+#/
+
+# Run this to generate all the initial makefiles, etc.
+
+# Recover command line, with double-quotes
+CMDLINE=""
+for arg in "$@"
+do
+    WHO="`echo $arg | cut -d'=' -f1`"
+    WHAT="`echo $arg | cut -s -d'=' -f2`"
+    if test "x$WHAT" = "x"; then
+    	CMDLINE="$CMDLINE $WHO"
+    else
+	CMDLINE="$CMDLINE $WHO=\"$WHAT\""
+    fi
+done
+
+echo  "$0 $CMDLINE" > autogen.status
+chmod +x autogen.status
+
+# Starts configuring
+srcdir=`dirname $0`
+test -z "$srcdir" && srcdir=.
+
+PKG_NAME="LinBox Library"
+
+(test -f $srcdir/configure.ac \
+	&& test -f $srcdir/linbox/linbox.doxy) || {
+	echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
+	echo " top-level "\`$PKG_NAME\'" directory"
+	exit 1
+}
+
+ORIGDIR=`pwd`
+cd $srcdir
+PROJECT=linbox
+TEST_TYPE=-f
+
+DIE=0
+
+# Defaults
+LIBTOOL=libtool
+LIBTOOLIZE=libtoolize
+
+# Fix OSx problem with GNU libtool
+(uname -a|grep -v Darwin) < /dev/null > /dev/null 2>&1 ||
+{
+echo "....Adding fix for OSX"
+LIBTOOL=glibtool
+LIBTOOLIZE=glibtoolize
+}
+
+
+(autoconf --version) < /dev/null > /dev/null 2>&1 || {
+	echo
+	echo "You must have autoconf installed to compile $PROJECT."
+	echo "Download the appropriate package for your distribution,"
+	echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
+	DIE=1
+}
+
+(automake --version) < /dev/null > /dev/null 2>&1 || {
+	echo
+	echo "You must have automake installed to compile $PROJECT."
+	echo "Download the appropriate package for your distribution,"
+	echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
+	DIE=1
+}
+
+(automake --version) < /dev/null > /dev/null 2>&1 || {
+	echo
+	echo "You must have automake installed to compile $PROJECT."
+	echo "Get ftp://sourceware.cygnus.com/pub/automake/automake-1.4.tar.gz"
+	echo "(or a newer version if it is available)"
+	DIE=1
+}
+
+(grep "^AC_PROG_LIBTOOL" configure.ac >/dev/null) && {
+  ($LIBTOOLIZE --version) < /dev/null > /dev/null 2>&1 || {
+     echo
+     echo "**Error**: You must have \`libtoolize' installed to compile $PROJECT."
+     echo "Download the appropriate package for your distribution,"
+     echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
+     DIE=1
+  }
+}
+
+grep "^AM_GNU_GETTEXT" configure.ac >/dev/null && {
+  grep "sed.*POTFILES" $srcdir/configure.ac >/dev/null || \
+	(gettext --version) < /dev/null > /dev/null 2>&1 || {
+	echo
+	echo "**Error**: You must have \`gettext' installed to compile $PROJECT."
+	echo "Download the appropriate package for your distribution,"
+	echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
+	DIE=1
+  }
+}
+
+if test "$DIE" -eq 1; then
+	exit 1
+fi
+
+
+if test -z "$*"; then
+	echo "I am going to run ./configure with no arguments - if you wish "
+	echo "to pass any to it, please specify them on the $0 command line."
+fi
+
+case $CC in
+	*xlc | *xlc\ * | *lcc | *lcc\ *) am_opt=--include-deps;;
+esac
+
+for coin in `find . -name configure.ac -print`
+do 
+	dr=`dirname $coin`
+	if test -f $dr/NO-AUTO-GEN; then
+		echo skipping $dr -- flagged as no auto-gen
+	else
+		echo processing $dr
+		macrodirs=`sed -n -e 's,AM_ACLOCAL_INCLUDE(\(.*\)),\1,gp' < $coin`
+		( cd $dr
+		aclocalinclude="$ACLOCAL_FLAGS"
+		for k in $macrodirs; do
+			if test -d $k; then
+				aclocalinclude="$aclocalinclude -I $k"
+				##else 
+				##  echo "**Warning**: No such directory \`$k'.  Ignored."
+			fi
+		done
+		if grep "^AM_GNU_GETTEXT" configure.ac >/dev/null; then
+			if grep "sed.*POTFILES" configure.ac >/dev/null; then
+				: do nothing -- we still have an old unmodified configure.ac
+			else
+				echo "Creating $dr/aclocal.m4 ..."
+				test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
+				echo "Running gettextize...  Ignore non-fatal messages."
+				echo "no" | gettextize --force --copy
+				echo "Making $dr/aclocal.m4 writable ..."
+				test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
+			fi
+		fi
+		if grep "^AM_GNOME_GETTEXT" configure.ac >/dev/null; then
+			echo "Creating $dr/aclocal.m4 ..."
+			test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
+			echo "Running gettextize...  Ignore non-fatal messages."
+			echo "no" | gettextize --force --copy
+			echo "Making $dr/aclocal.m4 writable ..."
+			test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
+		fi
+		if grep "^AC_PROG_LIBTOOL" configure.ac >/dev/null; then
+			echo "Running libtoolize..."
+			$LIBTOOLIZE --force --copy
+		fi
+		echo "Running aclocal $aclocalinclude ..."
+		aclocal $aclocalinclude
+		if grep "^AC_CONFIG_HEADERS" configure.ac >/dev/null; then
+			echo "Running autoheader..."
+			autoheader
+		fi
+		echo "Running automake --gnu $am_opt ..."
+		automake -c --add-missing --gnu $am_opt
+		echo "Running autoconf ..."
+		autoconf
+		)
+	fi
+done
+
+conf_flags="--enable-maintainer-mode" 
+#--enable-iso-c
+
+cd "$ORIGDIR"
+
+if test x$NOCONFIGURE = x; then
+	echo Running $srcdir/configure $conf_flags "$@" ...
+	$srcdir/configure $conf_flags "$@" \
+		&& echo "Now type \`make install' to compile $PROJECT"  || exit 1
+else
+	echo Skipping configure process.
+fi
+
diff --git a/benchmarks/BenchmarkFile.h b/benchmarks/BenchmarkFile.h
new file mode 100644
index 0000000..9d2dd98
--- /dev/null
+++ b/benchmarks/BenchmarkFile.h
@@ -0,0 +1,107 @@
+/* Copyright (C) 2013 LinBox
+ * Written by AJS <stachnik at udel.edu>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file   benchmarks/BenchmarkFile.h
+ * @ingroup benchmarks
+ * @brief
+ */
+
+#ifndef __LINBOX_BENCHMARKFILE_H
+#define __LINBOX_BENCHMARKFILE_H
+
+#include <stdlib.h>
+#include <fstream>
+#include <map>
+#include <vector>
+
+namespace LinBox
+{
+
+class BenchmarkFile {
+public:
+        typedef std::map<std::string,CSValue*>::iterator MetadataIterator;
+
+	BenchmarkFile() : numFields_(0) {}
+
+	~BenchmarkFile();
+
+	void write(std::ostream& out);
+
+	void addMetadata(const std::string& key,const CSValue& val);
+
+        MetadataIterator metadataBegin();
+
+	void addDataField(const std::string& fieldName,const CSValue& val);
+
+        void setType(const std::string& fieldName, const std::string& type);
+
+	void pushBackTest();
+
+        static CSDate getDateStamp();
+
+        static std::string getDateFormat();
+
+protected:
+	typedef std::vector<CSValue*> TestLine;
+	typedef std::map<std::string,CSValue*> MetadataMap;
+	typedef std::map<std::string,int> FieldPosMap;
+        typedef std::map<std::string,std::string> TypeMap;
+
+	void printMetadata(std::ostream& out);
+
+	void printFieldTitles(std::ostream& out);
+
+	void printContents(std::ostream& out);
+
+	void printCommaVector(std::ostream& out,const std::vector<CSValue*>& vec);
+
+	void freeTestLine(TestLine& line);
+
+
+	MetadataMap metadata_;
+
+        TypeMap typeMap_;
+
+	int numFields_;
+
+	FieldPosMap fields_;
+
+	TestLine curTest_;
+
+	std::vector<TestLine> allTests_;
+};
+
+}
+
+#include "BenchmarkFile.inl"
+
+#endif // __LINBOX_BENCHMARKFILE_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/BenchmarkFile.inl b/benchmarks/BenchmarkFile.inl
new file mode 100644
index 0000000..c36b788
--- /dev/null
+++ b/benchmarks/BenchmarkFile.inl
@@ -0,0 +1,198 @@
+/* Copyright (C) 2013 LinBox
+ * Written by AJS <stachnik at udel.edu>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file   benchmarks/BenchmarkFile.inl
+ * @ingroup benchmarks
+ * @brief
+ */
+
+#ifndef __LINBOX_BENCHMARKFILE_INL
+#define __LINBOX_BENCHMARKFILE_INL
+
+#include "linbox/util/debug.h"
+
+#include <stdlib.h>
+#include <fstream>
+#include <map>
+
+namespace LinBox
+{
+
+void BenchmarkFile::printCommaVector(std::ostream& out,const std::vector<CSValue*>& vec)
+{
+	bool first=true;
+	for (int i=0;i<vec.size();++i) {
+		if (!first) {
+			out << ", ";
+		} else {
+			first=false;
+		}
+		if (vec[i] == NULL) {
+			out << "-";
+		} else {
+			vec[i]->print(out);
+		}
+	}
+	out << std::endl;
+}
+
+void BenchmarkFile::printMetadata(std::ostream& out)
+{
+	typedef MetadataMap::iterator MapIT;
+
+	for (MapIT it=metadata_.begin();it!=metadata_.end();++it) {
+		out << it->first << ", ";
+		it->second->print(out);
+		out << std::endl;
+	}
+        
+        typedef TypeMap::iterator TypeMapIT;
+
+        if (!(typeMap_.empty())) {
+                out << "types";
+                for (TypeMapIT it=typeMap_.begin();it!=typeMap_.end();++it) {
+                        out << ", (" << it->first << "," << it->second << ")";
+                }
+                out << std::endl;
+        }
+	out << "end, metadata" << std::endl << std::endl;
+}
+
+void BenchmarkFile::printFieldTitles(std::ostream& out)
+{
+	std::vector<CSValue*> fieldVec(numFields_);
+
+	typedef FieldPosMap::iterator MapIT;
+
+	for (MapIT it=fields_.begin();it!=fields_.end();++it) {
+		fieldVec[it->second]=new CSString(it->first);
+	}
+
+	printCommaVector(out,fieldVec);
+
+	for (int i=0;i<fieldVec.size();++i) {delete fieldVec[i];}
+
+}
+
+void BenchmarkFile::printContents(std::ostream& out)
+{
+	for (int i=0;i<allTests_.size();++i) {
+		printCommaVector(out,allTests_[i]);
+	}
+}
+
+void BenchmarkFile::write(std::ostream& out)
+{
+	printMetadata(out);
+	printFieldTitles(out);
+	printContents(out);
+}
+
+void BenchmarkFile::freeTestLine(TestLine& line)
+{
+	for (int i=0;i<line.size();++i) {
+		delete line[i];
+	}
+}
+
+BenchmarkFile::~BenchmarkFile() {
+	for (int i=0;i<allTests_.size();++i) {
+		freeTestLine(allTests_[i]);
+	}
+
+	freeTestLine(curTest_);
+
+	typedef MetadataMap::iterator MapIT;
+	for (MapIT it=metadata_.begin();it!=metadata_.end();++it) {
+		delete it->second;
+	}
+}
+
+BenchmarkFile::MetadataIterator BenchmarkFile::metadataBegin()
+{
+        return metadata_.begin();
+}
+
+void BenchmarkFile::addMetadata(const std::string& key,const CSValue& val)
+{
+	metadata_.insert(std::pair<std::string,CSValue*>(key,val.clone()));
+}
+
+
+void BenchmarkFile::setType(const std::string& fieldName, const std::string& type)
+{
+        typeMap_[fieldName]=type;
+}
+
+void BenchmarkFile::addDataField(const std::string& fieldName,const CSValue& val)
+{
+	typedef FieldPosMap::iterator FieldPosMapIT;
+
+	int fieldPos;
+
+	FieldPosMapIT it = fields_.find(fieldName);
+	if (it==fields_.end()) {
+		fields_.insert(std::pair<std::string,int>(fieldName,numFields_));
+		fieldPos=numFields_;
+		++numFields_;
+		curTest_.resize(numFields_);
+	} else {
+		fieldPos=it->second;
+	}
+
+	curTest_[fieldPos]=val.clone();
+}
+
+void BenchmarkFile::pushBackTest()
+{
+	allTests_.push_back(curTest_);
+	curTest_.clear();
+	curTest_.resize(numFields_);
+}
+
+CSDate BenchmarkFile::getDateStamp()
+{
+        time_t rawTime;
+        struct tm *timeInfo;
+	srand ((unsigned)time (&rawTime));
+        timeInfo=localtime(&rawTime);
+        return CSDate(*timeInfo);
+}
+
+std::string BenchmarkFile::getDateFormat()
+{
+        return "%a %m/%d %H/%M/%S %Y";
+}
+
+
+}
+#endif // __LINBOX_BENCHMARKFILE_INL
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/CSValue.h b/benchmarks/CSValue.h
new file mode 100644
index 0000000..eb50818
--- /dev/null
+++ b/benchmarks/CSValue.h
@@ -0,0 +1,153 @@
+/* Copyright (C) 2013 LinBox
+ * Written by AJS <stachnik at udel.edu>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file   benchmarks/CSValue.h
+ * @ingroup benchmarks
+ * @brief
+ */
+
+#ifndef __LINBOX_CSVALUE_H
+#define __LINBOX_CSVALUE_H
+
+#include <stdlib.h>
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <time.h>
+
+namespace LinBox
+{
+
+class CSValue {
+public:
+	virtual ~CSValue() {}
+
+	virtual void print(std::ostream& out) const =0;
+
+	virtual CSValue* clone() const =0;
+
+	virtual int type() const =0;
+};
+
+#define CSV_STRING_TYPE 1
+#define CSV_INT_TYPE 2
+#define CSV_DOUBLE_TYPE 3
+#define CSV_DATE_TYPE 4
+
+std::ostream& operator<< (std::ostream& out, const CSValue& v)
+{
+	v.print(out);
+        return out;
+}
+
+class CSString : public CSValue {
+public:
+
+	CSString() {}
+
+	CSString(const std::string& e) : elt_(e) {}
+
+	std::string getVal() const {return elt_;}
+
+	void print(std::ostream& out) const {out << elt_;}
+
+	CSValue* clone() const {return new CSString(elt_);}
+
+	int type() const {return CSV_STRING_TYPE;}
+
+protected:
+	std::string elt_;
+};
+
+class CSInt : public CSValue {
+public:
+
+	CSInt() : elt_(0) {}
+
+	CSInt(const int e) : elt_(e) {}
+
+	int getVal() const {return elt_;}
+
+	void print(std::ostream& out) const {out << elt_;}
+
+	CSValue* clone() const {return new CSInt(elt_);}
+
+	int type() const {return CSV_INT_TYPE;}
+
+protected:
+	int elt_;
+};
+
+class CSDouble : public CSValue {
+public:
+
+	CSDouble() : elt_(0.0) {}
+
+	CSDouble(const double e) : elt_(e) {}
+
+	double getVal() const {return elt_;}
+
+	void print(std::ostream& out) const {out << elt_;}
+
+	CSValue* clone() const {return new CSDouble(elt_);}
+
+	int type() const {return CSV_DOUBLE_TYPE;}
+
+protected:
+	double elt_;
+};
+
+class CSDate : public CSValue {
+public:
+
+	CSDate() {}
+
+	CSDate(const struct tm& time) : elt_(time) {}
+
+	struct tm getVal() const {return elt_;}
+
+	void print(std::ostream& out) const {
+                std::string timeStr(asctime(&elt_));
+                timeStr.erase(timeStr.size()-1);
+                out << timeStr;
+        }
+
+	CSValue* clone() const {return new CSDate(elt_);}
+
+	int type() const {return CSV_DATE_TYPE;}
+
+protected:
+	struct tm elt_;
+};
+
+}
+#endif // __LINBOX_CSVALUE_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/Makefile.am b/benchmarks/Makefile.am
index 7041141..cd0ac76 100644
--- a/benchmarks/Makefile.am
+++ b/benchmarks/Makefile.am
@@ -1,5 +1,5 @@
 # Copyright (c) 2011 the LinBox group
-# Brice Boyer <bboyer at imag.fr>
+# Brice Boyer (briceboyer) <boyer.brice at gmail.com>
 # ========LICENCE========
 # This file is part of the library LinBox.
 #
@@ -17,37 +17,57 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 # ========LICENCE========
+#/
 
+SUBDIRS=data matrix
+DEFCPPFLAGS  = @DEFAULT_CFLAGS@   -DDISABLE_COMMENTATOR -DLinBoxSrcOnly
+AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/linbox $(DEFCPPFLAGS)  $(DEPS_CFLAGS)
+LDADD =   $(DEPS_LIBS) $(LDFLAGS)
+LDADD += $(top_builddir)/linbox/liblinbox.la
+pkgincludesubdir=$(pkgincludedir)/benchmarks
 
+noinst_LTLIBRARIES=libbenchmarks.la
+libbenchmarks_la_SOURCES= benchmark.C
+libbenchmarks_la_LDFLAGS=$(LDFLAGS) $(DEPS_LIBS)
+libbenchmarks_la_LIBADD=$(top_builddir)/linbox/liblinbox.la
+#libbenchmarks_la_LIBADD+=$(top_builddir)/linbox/util/.libs/libutil.la
 
 
-AM_CPPFLAGS=-I$(top_srcdir) -I$(top_srcdir)/linbox
+# AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/linbox
+# AM_CPPFLAGS +=  $(NTL_CFLAGS) $(IML_CFLAGS) $(PARFLAGS)
+# AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR -DLinBoxSrcOnly
+# LDADD =  $(NTL_LIBS) $(MPFR_LIBS) $(FPLLL_LIBS) $(LDFLAGS) $(IML_LIBS) $(XML_LIBS) $(PARLIBS)
+#  AM_LDFLAGS=-static $(LDFLAGS)
+ AM_LDFLAGS = .libs/libbenchmarks.la
+#  AM_LDFLAGS = .libs/benchmark.o
 
-#  SAFER_FLAGS=-g -Wall -Wextra -Wno-unused-parameter
 
-AM_CXXFLAGS= @DEFAULT_CFLAGS@ -DLinBoxSrcOnly
-AM_CPPFLAGS+= $(GMP_CFLAGS) $(NTL_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS) $(FFLAS_FFPACK_CFLAGS)
-LDADD= $(NTL_LIBS) $(GIVARO_LIBS) $(LIDIA_LIBS) $(BLAS_LIBS) $(GMP_LIBS)
-AM_LDFLAGS=-static $(LDFLAGS)
+PERFPUBLISHERFILE=benchmarks-report.xml
+
 
 BENCH_BASIC=               \
-		benchmark-fgemm    \
-		benchmark-crafixed \
-		benchmark-ftrXm
-TODO=
+		benchmark-example\
+		benchmark-order-basis
+
+FAILS=    \
+		benchmark-ftrXm \
+		benchmark-ftrXm \
+		benchmark-crafixed
+
+TODO= \
 		benchmark-matmul   \
 		benchmark-spmv     \
 		benchmark-fields
 
 #  BENCH_ALGOS=               \
-TODO=
+TODO= \
 		benchmark-solve    \
 		benchmark-rank     \
 		benchmark-det      \
 		benchmark-nullspace
 
 #  BENCH_FORMS=               \
-TODO=
+TODO= \
 		benchmark-lu
 		benchmark-echelon  \
 		benchmark-hermite  \
@@ -55,18 +75,34 @@ TODO=
 
 EXTRA_PROGRAMS= $(BENCH_BASIC)
 
-EXTRA_DIST= benchmark.h benchmark.doxy
+pkginclude_HEADERS = \
+		     optimizer.h \
+		     benchmark-utils.h \
+		     benchmark-utils.C \
+		     benchmark-metadata.h \
+		     benchmark-metadata.C \
+		     benchmark.h \
+		     benchmark.C \
+		     benchmark.inl
+
+EXTRA_DIST= \
+	    benchmark.doxy
+
+CLEANFILES= $(EXTRA_PROGRAMS) $(PERFPUBLISHERFILE)
 
 benchmarks: ${EXTRA_PROGRAMS}
 
 ### BASE BENCHMARK ###
 
-benchmark_fgemm_SOURCES          = benchmark-fgemm.C
-benchmark_ftrXm_SOURCES          = benchmark-ftrXm.C
+#  benchmark_fgemm_SOURCES         = benchmark-fgemm.C
+
+#  benchmark_ftrXm_SOURCES         = benchmark-ftrXm.C
+
+#  benchmark_crafixed_SOURCES      = benchmark-crafixed.C
+
+benchmark_example_SOURCES       = benchmark-example.C
+benchmark_order_basis_SOURCES       = benchmark-order-basis.C
 
-benchmark_crafixed_SOURCES       = benchmark-crafixed.C
-benchmark_crafixed_CPPFLAGS      = $(IML_CFLAGS) $(AM_CPPFLAGS)
-benchmark_crafixed_LDADD         = $(IML_LIBS) $(LDADD)
 #  benchmark_matmul_SOURCES         = benchmark-matmul.C
 #  benchmark_spmv_SOURCES           = benchmark-spmv.C
 #  benchmark_fields_SOURCES         = benchmark-fields.C
@@ -84,14 +120,20 @@ benchmark_crafixed_LDADD         = $(IML_LIBS) $(LDADD)
 #  benchmark_hermite_SOURCES        = benchmark-hermite.C
 #  benchmark_smith_SOURCES          = benchmark-smith.C
 
+cleanup :
+	(cd data ; make cleanup)
 
 LINBOX=@prefix@
 
 LINBOX_BIN=@bindir@
 
+# Perfpublisher script interaction - AB 2014/12/11
+perfpublisher:
+	+./perfpublisher.sh "$(PERFPUBLISHERFILE)" "$(EXTRA_PROGRAMS)" "$(CXX)"
+
 # for compilation of new benchmarks
 %:%.C
-	$(CXX) $(AM_CXXFLAGS) $(CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.C -o $@ $(LDFLAGS) $(LDADD) $(LOADLIBES) $(top_srcdir)/linbox/.libs/liblinbox.a
+	$(CXX) $(AM_CXXFLAGS) $(CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.C -o $@ $(LDFLAGS) $(LDADD)
 
 %:%.cpp
-	$(CXX)  $(AM_CXXFLAGS) $(CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.cpp -o $@ $(LDFLAGS) $(LDADD) $(LOADLIBES) $(top_srcdir)/linbox/.libs/liblinbox.a
+	$(CXX)  $(AM_CXXFLAGS) $(CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.cpp -o $@ $(LDFLAGS) $(LDADD)
diff --git a/benchmarks/Makefile.in b/benchmarks/Makefile.in
deleted file mode 100644
index 74e6752..0000000
--- a/benchmarks/Makefile.in
+++ /dev/null
@@ -1,650 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2011 the LinBox group
-# Brice Boyer <bboyer at imag.fr>
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-EXTRA_PROGRAMS = $(am__EXEEXT_1)
-subdir = benchmarks
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am__EXEEXT_1 = benchmark-fgemm$(EXEEXT) benchmark-crafixed$(EXEEXT) \
-	benchmark-ftrXm$(EXEEXT)
-am_benchmark_crafixed_OBJECTS =  \
-	benchmark_crafixed-benchmark-crafixed.$(OBJEXT)
-benchmark_crafixed_OBJECTS = $(am_benchmark_crafixed_OBJECTS)
-am__DEPENDENCIES_1 =
-am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-benchmark_crafixed_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_2)
-am_benchmark_fgemm_OBJECTS = benchmark-fgemm.$(OBJEXT)
-benchmark_fgemm_OBJECTS = $(am_benchmark_fgemm_OBJECTS)
-benchmark_fgemm_LDADD = $(LDADD)
-benchmark_fgemm_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_benchmark_ftrXm_OBJECTS = benchmark-ftrXm.$(OBJEXT)
-benchmark_ftrXm_OBJECTS = $(am_benchmark_ftrXm_OBJECTS)
-benchmark_ftrXm_LDADD = $(LDADD)
-benchmark_ftrXm_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = $(benchmark_crafixed_SOURCES) $(benchmark_fgemm_SOURCES) \
-	$(benchmark_ftrXm_SOURCES)
-DIST_SOURCES = $(benchmark_crafixed_SOURCES) \
-	$(benchmark_fgemm_SOURCES) $(benchmark_ftrXm_SOURCES)
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/linbox $(GMP_CFLAGS) \
-	$(NTL_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS) \
-	$(FFLAS_FFPACK_CFLAGS)
-
-#  SAFER_FLAGS=-g -Wall -Wextra -Wno-unused-parameter
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DLinBoxSrcOnly
-LDADD = $(NTL_LIBS) $(GIVARO_LIBS) $(LIDIA_LIBS) $(BLAS_LIBS) $(GMP_LIBS)
-AM_LDFLAGS = -static $(LDFLAGS)
-BENCH_BASIC = \
-		benchmark-fgemm    \
-		benchmark-crafixed \
-		benchmark-ftrXm
-
-TODO = 
-EXTRA_DIST = benchmark.h benchmark.doxy
-
-### BASE BENCHMARK ###
-benchmark_fgemm_SOURCES = benchmark-fgemm.C
-benchmark_ftrXm_SOURCES = benchmark-ftrXm.C
-benchmark_crafixed_SOURCES = benchmark-crafixed.C
-benchmark_crafixed_CPPFLAGS = $(IML_CFLAGS) $(AM_CPPFLAGS)
-benchmark_crafixed_LDADD = $(IML_LIBS) $(LDADD)
-#  benchmark_matmul_SOURCES         = benchmark-matmul.C
-#  benchmark_spmv_SOURCES           = benchmark-spmv.C
-#  benchmark_fields_SOURCES         = benchmark-fields.C
-
-### BENCHMARK ALGOS and SOLUTIONS ###
-#  benchmark_solve_SOURCES          = benchmark-solve.C
-#  benchmark_rank_SOURCES           = benchmark-rank.C
-#  benchmark_det_SOURCES            = benchmark-det.C
-#  benchmark_nullspace_SOURCES      = benchmark-nullspace.C
-
-### BENCHMARK MATRIX FACTORISATIONS ###
-#  benchmark_lu_SOURCES             = benchmark-lu.C
-#  benchmark_echelon_SOURCES        = benchmark-echelon.C
-#  benchmark_hermite_SOURCES        = benchmark-hermite.C
-#  benchmark_smith_SOURCES          = benchmark-smith.C
-LINBOX = @prefix@
-LINBOX_BIN = @bindir@
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .C .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps benchmarks/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps benchmarks/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-benchmark-crafixed$(EXEEXT): $(benchmark_crafixed_OBJECTS) $(benchmark_crafixed_DEPENDENCIES) $(EXTRA_benchmark_crafixed_DEPENDENCIES) 
-	@rm -f benchmark-crafixed$(EXEEXT)
-	$(CXXLINK) $(benchmark_crafixed_OBJECTS) $(benchmark_crafixed_LDADD) $(LIBS)
-benchmark-fgemm$(EXEEXT): $(benchmark_fgemm_OBJECTS) $(benchmark_fgemm_DEPENDENCIES) $(EXTRA_benchmark_fgemm_DEPENDENCIES) 
-	@rm -f benchmark-fgemm$(EXEEXT)
-	$(CXXLINK) $(benchmark_fgemm_OBJECTS) $(benchmark_fgemm_LDADD) $(LIBS)
-benchmark-ftrXm$(EXEEXT): $(benchmark_ftrXm_OBJECTS) $(benchmark_ftrXm_DEPENDENCIES) $(EXTRA_benchmark_ftrXm_DEPENDENCIES) 
-	@rm -f benchmark-ftrXm$(EXEEXT)
-	$(CXXLINK) $(benchmark_ftrXm_OBJECTS) $(benchmark_ftrXm_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-.C.o:
-	$(CXXCOMPILE) -c -o $@ $<
-
-.C.obj:
-	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.C.lo:
-	$(LTCXXCOMPILE) -c -o $@ $<
-
-benchmark_crafixed-benchmark-crafixed.o: benchmark-crafixed.C
-	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(benchmark_crafixed_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o benchmark_crafixed-benchmark-crafixed.o `test -f 'benchmark-crafixed.C' || echo '$(srcdir)/'`benchmark-crafixed.C
-
-benchmark_crafixed-benchmark-crafixed.obj: benchmark-crafixed.C
-	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(benchmark_crafixed_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o benchmark_crafixed-benchmark-crafixed.obj `if test -f 'benchmark-crafixed.C'; then $(CYGPATH_W) 'benchmark-crafixed.C'; else $(CYGPATH_W) '$(srcdir)/benchmark-crafixed.C'; fi`
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool ctags distclean distclean-compile \
-	distclean-generic distclean-libtool distclean-tags distdir dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-man install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am
-
-		benchmark-matmul   \
-		benchmark-spmv     \
-		benchmark-fields
-
-#  BENCH_ALGOS=               \
-#TODO=
-		benchmark-solve    \
-		benchmark-rank     \
-		benchmark-det      \
-		benchmark-nullspace
-
-#  BENCH_FORMS=               \
-#TODO=
-		benchmark-lu
-		benchmark-echelon  \
-		benchmark-hermite  \
-		benchmark-smith
-
-benchmarks: ${EXTRA_PROGRAMS}
-
-# for compilation of new benchmarks
-%:%.C
-	$(CXX) $(AM_CXXFLAGS) $(CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.C -o $@ $(LDFLAGS) $(LDADD) $(LOADLIBES) $(top_srcdir)/linbox/.libs/liblinbox.a
-
-%:%.cpp
-	$(CXX)  $(AM_CXXFLAGS) $(CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.cpp -o $@ $(LDFLAGS) $(LDADD) $(LOADLIBES) $(top_srcdir)/linbox/.libs/liblinbox.a
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/benchmarks/README b/benchmarks/README
new file mode 100644
index 0000000..48b336f
--- /dev/null
+++ b/benchmarks/README
@@ -0,0 +1,95 @@
+These notes stem from a discussion by Johnson, Harrison, Yuhasz, Youse, Stachnik
+, Saunders at UDel June 2013.
+
+It is proposed that experiment data files be csv files containing a metadata sec
+tion followed by a measurement section.  The idea is that (1) each experimental run will make such a file (or add to such a file) and (2) each plot and table generation can then be done from such files as input.
+
+The metadata is a series of key-value pairs ending in one whose key is "end"
+This is followed by a line containing a list of keys (column labels) and then some number of lines recording experiments.  These are lists of values corresponding to the column labels.
+The value "-" denotes "missing" or "undefined".
+When value v in a "k,v" pair is another keyword, it means that k's value is the same as the other keyword's. 
+Blank lines are ignored.
+C++ comment conventions are followed (use of "//" and "/* ... */").
+This is for "commented out" text and should not be confused with values of the keyword "comment".
+
+Metadata reveals key values that are held constant in the experiments.
+The column labels are the keys whose values will vary from experiment to experiment.i
+Experiment data lines record the key values for the column labels of a given experiment.
+
+For example:
+------------------
+comment, exploration of foo parallel and blocked variants
+problem, foo
+date, 2013June21
+author, joe linboxer\, bds
+rowdim, 10000
+//coldim, rowdim
+coldim, 20000
+blockcoldim, blockrowdim
+matrix class, randomMat
+field, Givaro::Modular<double>(101)
+flops formula, (n*nnz)/time 
+comment, no parsing guidance is offered yet for mflops formula
+end, metadata
+time, nnz, blockrowdim, threads, algorithm, comment
+0.001, 10000, 26, 1, block-coppersmith, blockdim is about 2lg(dim) 
+1.1e-5, 10000, 100, 48, block-coppersmith-omp, blockdim is sqrt(dim)
+1.1e-5, 100000, -, 1, matrix-build, -
+...
+------------------
+
+For consistency and particularly for generating reports on data from multiple data files, the following key name conventions should be followed.  Other key names should be used only when one of these does not fit.
+
+-----
+// algorithm properties
+problem - the algorithmic task being measured (eg. solveNonsingular).
+algorithm - a specific implementation of a method to solve the problem
+(eg. solve(Method::Wiedemann) or solve-omp).
+time - the runtime for the experiment task
+flops - the nominal operation count for the task.  The flops formula should be made clear in the metadata.
+blockrowdim - row blocking used
+blockcoldim - col blocking used
+...
+
+// domain of computation properties
+field - arithmetic domain class used (when it is a field) (eg. Givaro::Modular<int>).
+ring - arithmetic domain class used (eg. PID_integer).
+matrix domain - arithmetic domain used (ring or field extended by matrix ops) 
+(eg. BlasMatrixDomain).
+modulus - characteristic of the field or ring (eg. 200000000000003).
+exponent - exponent of the modulus.
+...
+
+// environment-of-computation properties
+date - the date of the experiment(s) (eg. 2013June22).
+author - name or list of names of the person(s) running the experiments.
+computer - computer description (cores, mem, cache, speeds, etc.).
+threads - number of threads used.
+...
+
+// matrix properties (when problem has a key matrix as data)
+matrix class - blackbox template or class (eg. SparseMatrix or BlasMatrix or MatrixDomain::Submatrix).
+matrix constructor - eg. randomMat.  
+// Properties of the constructed instance (depends on matrix class and constructor
+rowdim -
+coldim -
+nnz -
+rank - Pesumably one knows from context whether this is a parameter or computed result.
+det - Pesumably one knows from context whether this is a parameter or computed result.
+...
+-----
+
+Further remarks.
+
+Other shared keywords can be added...
+
+Some keywords, whose values are strings, should have a standardized list of possible values...
+
+For convenience we could have a file of some keyword constants.  
+For example, some keywords which are machine names 
+with corresponding value a description, 
+eg., "hmrg, Dell Poweredge 2650 2-Xeon (3.2GHz)".
+Then a data file's metadata can include "computer, hmrg" for short.
+@ can be the "value of" operator, as in "computer, @hmrg", wherein the value expands to the value of hmrg.
+
+The experiment lines (below metadata and column labels) should be readable by gnuplot (this is a constraint on number and string representations).
diff --git a/benchmarks/benchmark-crafixed.C b/benchmarks/benchmark-crafixed.C
deleted file mode 100644
index b964b06..0000000
--- a/benchmarks/benchmark-crafixed.C
+++ /dev/null
@@ -1,384 +0,0 @@
-
-/* Copyright (C) 2011 LinBox
- * Written by BB <brice.boyer at imag.fr>
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*! @file benchmarks/benchmark-crafixed.C
- * @ingroup benchmarks
- * @brief Benchmarking fixed CRA routines.
- * Here we make benchmarks for CRT (Chinese Remaindering Theorem/Algorithm) in
- * the following case.  Let \f$\mathbf{v}\f$ be a vector of size \f$n\f$ and
- * whose entries have at most \f$l\f$ bits (signed or unsigned).  Suppose that
- * we only know  \f$\mathbf{v} \mod p_i\f$ for many primes \f$p_i\f$. We try
- * and reconstruct  \f$\mathbf{v}\f$ from these residues.
- *
- * We benchmark for one vector or \f$m\f$ repetitions on different vectors.
- *
- * We use the implementations in LinBox, Givaro, IML and NTL (if the latter two
- * are available).
- *
- * @warning this is not a benchmark for one integer to reconstruct or a for BlasMatrix.
- */
-
-#include "benchmarks/benchmark.h"
-#include "linbox/util/debug.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/modular-balanced.h"
-#include "linbox/matrix/random-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
-#include "linbox/algorithms/rns.h"
-
-#include "linbox/algorithms/cra-domain.h"
-#include "linbox/algorithms/cra-early-multip.h"
-#include "linbox/integer.h"
-
-#ifdef __LINBOX_HAVE_IML
-#include "linbox/util/iml_wrapper.h"
-#endif
-
-#define _LB_LOG2 0.69314718055994530941
-
-using Givaro::Timer ;
-using LinBox::integer;
-
-// typedef std::vector<LinBox::integer> Ivect ;
-// typedef std::vector<double>          Fvect ;
-
-struct ReductVect {
-	std::vector<integer>              & _v ;
-
-	ReductVect(std::vector<integer> &v) :
-		_v(v)
-   	{ } ;
-
-	template<typename Field>
-	std::vector<typename Field::Element> &
-	operator()(std::vector<typename Field::Element> & r, const Field & F) const
-	{
-		typedef typename Field::Element          Element;
-		typedef std::vector<Element>               Fvect;
-		typedef typename Fvect::iterator            Iter;
-
-		//! @todo LinBox hom or magic here ?
-		std::vector<integer>::iterator j = _v.begin();
-
-		for (Iter i =  r.begin() ; i !=  r.end() ; ++i,++j) {
-			F.init(*i,*j);
-		}
-		return r ;
-	}
-
-};
-
-struct ReductVectIterator ;
-namespace LinBox
-{
-	template<class Element> struct CRATemporaryVectorTrait<ReductVectIterator ,Element> {
-		typedef typename std::vector<double>::iterator Type_t;
-	};
-}
-
-struct ReductVectIterator  {
-	std::vector<integer>              & _v ;
-	mutable std::vector<double>         _r ;
-
-	ReductVectIterator(std::vector<integer> &v) :
-		_v(v)
-   	{
-		_r.resize(v.size());
-	} ;
-
-	template<typename Iterator, typename Field>
-	Iterator &
-	operator()(Iterator & r, const Field & F) const
-	{
-		typedef typename Field::Element          Element;
-		typedef std::vector<Element>               Fvect;
-		typedef typename Fvect::iterator            Iter;
-
-		//! @todo LinBox hom or magic here ?
-		std::vector<integer>::iterator j = _v.begin();
-		for (std::vector<double>::iterator i = _r.begin() ; i != _r.end() ; ++i,++j) {
-			F.init(*i,*j);
-		}
-		return r= _r.begin() ;
-	}
-
-
-};
-
-template<class Field>
-struct ReductPoint {
-	integer & _v ;
-	typedef typename Field::Element Element;
-	ReductPoint(integer &v) :
-		_v(v)
-   	{} ;
-	Element & operator()(Element & r, const Field & F)
-	{
-		F.init(r,_v);
-		return r ;
-	}
-};
-
-
-
-/*! Bench CRA.
- * @param n size of vector to reconstruct (>1)
- * @param m number of vectors to reconstruct
- * @param l size of the integers
- * @tparam Unsigned use >=0 random integers or not.
- * @param Data collects timings
- */
-template<bool Unsigned>
-int bench_cra(index_t  n, index_t m, index_t l
-	      , LinBox::PlotData<index_t> & Data)
-{
-
-	Timer tim, chrono ;
-	typedef std::vector<LinBox::integer> Ivect ;
-	{ /* LinBox CRA */
-		tim.clear();
-		typedef LinBox::Modular<double> ModularField ;
-		typedef LinBox::FullMultipFixedCRA< ModularField > CRAbase ;
-		unsigned int PrimeSize = 22;
-		double logV = l*_LB_LOG2 ;
-		if (!Unsigned) logV += _LB_LOG2 ;
-		std::cout << "size to reconstruct : " << logV << std::endl;
-		LinBox::RandomPrimeIterator genprime( PrimeSize );
-		for (size_t i = 0 ; i < (size_t) m ; ++i) { // repeat m times
-			// create the vector to reconstruct
-			Ivect V(n),R(n) ;
-			for (Ivect::iterator it = V.begin() ; it != V.end() ; ++it) {
-				integer::random_lessthan<Unsigned>(*it,l) ;
-			}
-#ifdef _LB_DEBUG
-			for (Ivect::iterator it = V.begin() ; it != V.end() ; ++it) {
-				if (naturallog(*it) > logV) {
-					std::cout << *it << " too big (" << naturallog(*it) << ")" << std::endl;
-				}
-			}
-#endif
-
-			LinBox::ChineseRemainder<  CRAbase >  cra( std::pair<size_t,double>(n, logV) );
-			ReductVectIterator iteration(V);
-			chrono.clear(); chrono.start();
-			Ivect::iterator Rit = R.begin();
-			cra(Rit, iteration, genprime);
-			chrono.stop();
-			tim += chrono ;
-			if (!std::equal(R.begin(),R.end(),V.begin())) {
-				std::cerr << "*** LinBox CRA failed " << (Unsigned?"positive":"general") << " ***" << std::endl;
-				std::cerr << R << std::endl << "expecting " << std::endl << V << std::endl;
-			}
-			// else
-			// std::cerr << "ok" << std::endl;
-		}
-		std::cout << "LinBox CRA :" << tim << std::endl;
-	}
-
-	{ /* LinBox Early CRA */
-		tim.clear();
-		typedef LinBox::Modular<double> ModularField ;
-		typedef LinBox::EarlyMultipCRA< ModularField > CRAbase ;
-		unsigned int PrimeSize = 22;
-		LinBox::RandomPrimeIterator genprime( PrimeSize );
-		for (size_t i = 0 ; i < (size_t) m ; ++i) { // repeat m times
-			// create the vector to reconstruct
-			Ivect V(n),R(n) ;
-			for (Ivect::iterator it = V.begin() ; it != V.end() ; ++it) {
-				integer::random_lessthan<Unsigned>(*it,l) ;
-			}
-
-			LinBox::ChineseRemainder<  CRAbase >  cra (4);
-			ReductVect iteration(V);
-			chrono.clear(); chrono.start();
-			// Ivect::iterator Rit = R.begin();
-			cra(R, iteration, genprime);
-			chrono.stop();
-			tim += chrono ;
-			if (!std::equal(R.begin(),R.end(),V.begin())) {
-				std::cerr << "*** LinBox early CRA failed " << (Unsigned?"positive":"general") << " ***" << std::endl;
-				std::cerr << R << std::endl << "expecting " << std::endl << V << std::endl;
-			}
-			// else
-			// std::cerr << "ok" << std::endl;
-		}
-		std::cout << "LinBox early CRA :" << tim << std::endl;
-	}
-
-	{ /*  do givaro crt */
-		// Init RNS
-		typedef LinBox::Modular<double> ModularField ;
-		tim.clear();
-		LinBox::RNS<Unsigned> rns(l) ;
-		chrono.clear() ; chrono.start() ;
-		rns.initCRA();
-		chrono.stop();
-		tim += chrono;
-		for (size_t i = 0 ; i < (size_t) m ; ++i) { // repeat m times
-			Ivect V(n),R(n) ;
-			for (Ivect::iterator it = V.begin() ; it != V.end() ; ++it) {
-				integer::random_lessthan<Unsigned>(*it,l) ;
-			}
-			ReductVect iteration(V);
-			chrono.clear(); chrono.start();
-			rns.cra(R,iteration);
-			chrono.stop();
-			tim += chrono ;
-			if (!std::equal(R.begin(),R.end(),V.begin())) {
-				std::cerr << "*** Givaro CRT failed " << (Unsigned?"positive":"general") << "***" << std::endl;
-				std::cerr << R << std::endl << "expecting " << std::endl << V << std::endl;
-			}
-			// else
-			// std::cerr << "ok" << std::endl;
-
-		}
-		std::cout << "GivCRT :" << tim << std::endl;
-	}
-
-	{ /*  do givaro fixed  */
-		// Init RNS
-		typedef LinBox::Modular<double> ModularField ;
-		tim.clear();
-		LinBox::RNSfixed<Unsigned> rns(l) ;
-		chrono.clear() ; chrono.start() ;
-		rns.initCRA();
-		chrono.stop();
-		tim += chrono;
-		for (size_t i = 0 ; i < (size_t) m ; ++i) { // repeat m times
-			Ivect V(n),R(n) ;
-			for (Ivect::iterator it = V.begin() ; it != V.end() ; ++it) {
-				integer::random_lessthan<Unsigned>(*it,l) ;
-			}
-			ReductVect iteration(V);
-			chrono.clear(); chrono.start();
-			rns.cra(R,iteration);
-			chrono.stop();
-			tim += chrono ;
-			if (!std::equal(R.begin(),R.end(),V.begin())) {
-				std::cerr << "*** givaro fixed failed " << (Unsigned?"positive":"general") << "***" << std::endl;
-				std::cerr << R << std::endl << "expecting " << std::endl << V << std::endl;
-			}
-			// else
-			// std::cerr << "ok" << std::endl;
-
-		}
-		std::cout << "Giv CRT Fixed :" << tim << std::endl;
-	}
-
-#if 1 /*  IML */
-#ifdef __LINBOX_HAVE_IML
-	{ /*  do iml cra */
-		typedef LinBox::Modular<double> ModularField ;
-		tim.clear();
-
-		/* Init RNS */
-		chrono.clear() ; chrono.start() ;
-		long basislen = 0 ;
-		IML::Double primesize;
-		integer product ;
-		primesize = pow(2,22);
-		product = pow((integer)2,l);
-		// mpz_init(maxi); mpz_init(mp_maxInter);
-		// comment les trouver ?
-
-		IML::FiniteField ** RNS = IML::findRNS(primesize,product.get_mpz(),&basislen);
-		IML::FiniteField * liftbasis = RNS[0] ; // findLiftbasisSmall(n, maxi, &basislen);
-		IML::FiniteField * cmbasis   = RNS[1] ; // combBasis(basislen,basis);
-		mpz_t mp_prod ;
-		IML::FiniteField * bdcoeffs = NULL ;
-		IML::Double * Vp = IML_XMALLOC(IML::Double,n*basislen);
-		if (!Unsigned) {
-			mpz_init(mp_prod);
-			IML::basisProd(basislen,liftbasis,mp_prod);
-			bdcoeffs =  IML::repBound(basislen, liftbasis, cmbasis) ;
-		}
-		chrono.stop();
-		tim += chrono;
-
-		/*  loop m times */
-		for (size_t i = 0 ; i < (size_t) m ; ++i) { // repeat m times
-			/*  init result */
-			Ivect V(n),R(n) ;
-			for (Ivect::iterator it = V.begin() ; it != V.end() ; ++it) {
-				integer::random_lessthan<Unsigned>(*it,l) ;
-			}
-			ReductVect iteration(V);
-			for (size_t j = 0 ; j < (size_t)basislen ; ++j) {
-				std::vector<double> G ;
-				iteration(G,ModularField((integer)liftbasis[j]));
-				for (size_t k = 0 ; k < (size_t)n ; ++k)
-					Vp[j+k*basislen] = G[k] ;
-			}
-
-			/*  CRA */
-
-			// fooooooooooooooor
-			if (!Unsigned) {
-				for (size_t j = 0 ; j < (size_t)n ; ++j)
-					IML::ChineseRemainderPos(basislen, liftbasis, cmbasis, Vp+j, R[j].get_mpz());
-			}
-			else {
-				for (size_t j = 0 ; j < (size_t)n ; ++j)
-					IML::ChineseRemainder(basislen, mp_prod, liftbasis, cmbasis, bdcoeffs, Vp+j, R[j].get_mpz()) ;
-
-			}
-			IML_XFREE(cmbasis);
-			IML_XFREE(liftbasis);
-			if (!Unsigned) {
-				mpz_clear(mp_prod);
-				IML_XFREE(bdcoeffs);
-			}
-			/*  END */
-		}
-	}
-#endif // __LINBOX_HAVE_IML
-#endif
-
-	/*  do ntl cra */
-	// Init primes
-	for (size_t i = 0 ; i < (size_t) m ; ++i) { // repeat m times
-	}
-	return EXIT_SUCCESS ;
-}
-
-int main(int ac, char** av)
-{
-	static index_t m = 10 ;
-	static index_t l = 200 ;
-	static index_t n = 10 ;
-	LinBox::PlotData<index_t>  Data(n,m);
-	bench_cra<true>(n,m,l,Data);
-	bench_cra<false>(n,m,l,Data);
-	return EXIT_SUCCESS ;
-}
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/benchmarks/benchmark-example.C b/benchmarks/benchmark-example.C
new file mode 100644
index 0000000..ea3d578
--- /dev/null
+++ b/benchmarks/benchmark-example.C
@@ -0,0 +1,368 @@
+/* Copyright (C) 2011 LinBox
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file benchmarks/benchmark-example.C
+ * @ingroup benchmarks
+ * @brief Benchmarking example
+ * @example benchmark
+ */
+
+#include "benchmarks/benchmark.h"
+#include "linbox/util/error.h"
+#include "fflas-ffpack/fflas-ffpack.h"
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/random-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/solutions/rank.h"
+
+#include <givaro/modular-balanced.h>
+
+
+using namespace LinBox ;
+using Givaro::Timer;
+
+/* compute MegaFLOPS for mat mul (2 m n k) */
+double mm_mflops(size_t m, size_t n, size_t k)
+{
+	return 2*(double)m/100*(double)n/100*(double)k/100 ;
+}
+
+/* Benchmark on a field */
+
+/*! @internal
+ * @brief launches the benchmarks for the square case.
+ * @param F field
+ * @param min min size to bench
+ * @param max max size to bench
+ * @param step step between two sizes
+ * @param Data where data is stored
+ * @param series_nb index of the current series of measures.
+ */
+template<class Field>
+void launch_bench_square(Field & F // const problem
+			 , size_t min, size_t max, size_t step // no negative step
+			 , PlotData & Data
+			)
+{
+	linbox_check(step);
+	linbox_check(min <= max);
+
+	std::ostringstream nam ;
+	F.write(nam);
+	// Data.setCurrentSeriesName(nam.str());
+
+	Data.newSeries(nam.str());
+	Chrono<Timer> TW ;
+
+	typedef typename Field::RandIter Randiter ;
+	Randiter R(F) ;
+	BlasMatrixDomain<Field> BMD(F) ;
+	RandomDenseMatrix<Randiter,Field> RandMat(F,R);
+
+	for ( size_t i = min ; i < max ; i += step ) {
+
+		showAdvanceLinear(i,min,max);
+		size_t ii = i ;
+		BlasMatrix<Field> A (F,ii,ii);
+		BlasMatrix<Field> B (F,ii,ii);
+		BlasMatrix<Field> C (F,ii,ii);
+
+		size_t j = 0 ; // number of repets.
+
+		RandMat.random(A);
+		RandMat.random(B);
+		RandMat.random(C);
+		TW.clear() ;
+		while( Data.keepon(j,TW.time(),false) ) {
+			TW.start() ;
+			BMD.mul(C,A,B) ; // C = AB
+			TW.stop();
+			++j ;
+		}
+		double mflops = computeMFLOPS(TW.times(),mm_mflops(i,i,i));
+
+		Data.setCurrentSeriesEntry(i,mflops,(double)i,TW.time()); // could be i*i*i
+
+	}
+
+	Data.finishSeries();
+}
+
+/* Collects Benchmarks */
+
+
+/*! @brief Benchmark square fgemm Y=AX for several fields.
+ * @param min min size
+ * @param max max size
+ * @param step step of the size between 2 benchmarks
+ * @param charac characteristic of the field.
+ */
+void bench_square( size_t min, size_t max, size_t step, int charac )
+{
+
+	size_t nb = 1 ;// une col de plus (la première)
+	typedef Givaro::Modular<double>          Field0 ; ++nb ;
+	typedef Givaro::Modular<float>           Field1 ; ++nb ;
+	// typedef Givaro::Modular<int32_t>         Field2 ; ++nb ;
+	// typedef Givaro::ModularBalanced<double>  Field3 ; ++nb ;
+	// typedef Givaro::ModularBalanced<float>   Field4 ; ++nb ;
+	// typedef Givaro::ModularBalanced<int32_t> Field5 ; ++nb ;
+	// GivaroZpZ
+
+	///// DATA HARVEST ////
+
+	PlotData  Data;
+	showProgression Show(nb) ;
+
+	Field0 F0(charac) ;
+	// launch_bench_square<Field0>(F0,100,1500,300,Data);
+	launch_bench_square<Field0>(F0,min,max,step,Data);
+	Show.FinishIter();
+
+	if (charac < 2048) {
+		Field1 F1(charac) ;
+		// launch_bench_square(F1,200,1500,200,Data);
+		launch_bench_square(F1,min,max,step,Data);
+		Show.FinishIter();
+	}
+	else {
+		Show.SkipIter();
+	}
+
+
+
+#if 0
+	Field2 F2(charac) ;
+	launch_bench_square(F2,min,max,step,Data);
+	Show.FinishIter();
+
+	Field3 F3(charac) ;
+	launch_bench_square(F3,min,max,step,Data);
+	Show.FinishIter();
+
+	if (charac < 2048) {
+		Field4 F4(charac) ;
+		launch_bench_square(F4,min,max,step,Data);
+		Show.FinishIter();
+	}
+	else {
+		Show.SkipIter();
+	}
+
+	Field5 F5(charac) ;
+	launch_bench_square(F5,min,max,step,Data);
+	Show.FinishIter();
+#endif
+
+	///// PLOT STYLE ////
+	LinBox::PlotStyle Style;
+
+	Style.setTerm(LinBox::PlotStyle::Term::eps);
+	Style.setTitle("BlasMatrixDomain mul","Mflops","dimensions");
+
+	Style.setPlotType(LinBox::PlotStyle::Plot::graph);
+	Style.setLineType(LinBox::PlotStyle::Line::linespoints);
+
+
+	LinBox::PlotGraph Graph(Data,Style);
+	Graph.setOutFilename("bmdmul_square");
+
+	// Graph.plot();
+
+	Graph.print(Tag::Printer::gnuplot);
+
+	Graph.print(Tag::Printer::tex);
+	Graph.print(Tag::Printer::csv);
+
+	return ;
+
+}
+
+template<class Field>
+void launch_bench_rank(const Field &F, const std::string & name
+			 , PlotData & Data
+		       )
+{
+
+	SparseMatrix<Field> Mat(F);
+	std::ifstream mat1 (name);
+	Mat.read(mat1);
+
+	MatrixMetaData mmd (Mat,name);
+
+	// Data.newSeries(name);
+	Chrono<Timer> TW ;
+
+	showAdvanceLinear(1,1,2);
+
+	TW.clear() ;
+	size_t j = 0 ;
+	while( Data.keepon(j,TW.time()) ) {
+		TW.start() ;
+		unsigned long d ;
+		LinBox::rank(d,Mat,Method::Blackbox());
+		TW.stop();
+		++j ;
+	}
+
+	// double mflops = computeMFLOPS(TW.times(),mm_mflops(i,i,i));
+
+	Data.setSeriesEntry("Rank (Blackbox)",name,TW.time(),(double)Mat.size(),TW.time());
+	Data.addCurrentEntryMetaData(mmd);
+	// Data.addCurrentSeriesMetaData(mmd);
+	// Data.addMetaData(mmd);
+
+
+	showAdvanceLinear(2,1,2);
+
+	TW.clear() ;
+	j = 0 ;
+	while( Data.keepon(j,TW.time()) ) {
+		TW.start() ;
+		unsigned long d ;
+		LinBox::rank(d,Mat,Method::SparseElimination());
+		TW.stop();
+		++j ;
+	}
+
+	Data.selectSeries("Rank (SparseElimination)");
+	Data.setCurrentSeriesEntry(name,TW.time(),(double)Mat.size(),TW.time());
+	Data.addCurrentEntryMetaData(mmd);
+
+}
+
+void bench_rank(int carac)
+{
+	typedef Givaro::Modular<double>  Field0 ;
+	Field0 F(carac);
+	int nb = 1;
+
+	//! @bug no gz reader ?
+
+	std::string m1 = "matrix/bibd_12_5_66x792.sms" ; ++nb;
+	std::string m2 = "matrix/bibd_13_6_78x1716.sms" ; ++nb;
+	std::string m3 = "matrix/bibd_14_7_91x3432.sms" ; ++nb;
+
+	PlotData  Data;
+	showProgression Show((size_t)nb) ;
+
+	launch_bench_rank(F,m1,Data);
+	Show.FinishIter();
+
+	launch_bench_rank(F,m2,Data);
+	Show.FinishIter();
+
+	launch_bench_rank(F,m3,Data);
+	Show.FinishIter();
+
+	///// PLOT STYLE ////
+	LinBox::PlotStyle Style;
+	Style.setTerm(LinBox::PlotStyle::Term::eps);
+	Style.setTitle("Rank algorithms","seconds","matrices");
+	Style.setXtics(LinBox::PlotStyle::Options::oblique);
+
+	/* default
+	Style.setPlotType(LinBox::PlotStyle::Plot::histo);
+	Style.setLineType(LinBox::PlotStyle::Line::histogram);
+	*/
+
+
+	LinBox::PlotGraph Graph(Data,Style);
+	Graph.setOutFilename("rank_comparison");
+
+	// Graph.plot();
+
+	Graph.print(Tag::Printer::gnuplot);
+
+	// change style
+	Graph.refStyle().setTerm(LinBox::PlotStyle::Term::png);
+	Graph.print(Tag::Printer::gnuplot);
+
+	Graph.print(Tag::Printer::xml);
+	Graph.print(Tag::Printer::html);
+
+	return;
+}
+
+/*  main */
+
+int main( int ac, char ** av)
+{
+	/*  Argument parsing/setting */
+
+	static size_t       min  = 100;     /*  min size */
+	static size_t       max  = 1500;    /*  max size (not included) */
+	static size_t       step = 300;    /*  step between 2 sizes */
+	// static std::list<int> lst  ;       /*  what bench to start ? */
+	// lst.push_front(1);// ={1,2} vivement le nouveau std...
+	// lst.push_front(2);
+
+	static Argument as[] = {
+		{ 'm', "-m min" , "Set minimal size of matrix to test."    , TYPE_INT , &min },
+		{ 'M', "-M Max" , "Set maximal size."                      , TYPE_INT , &max },
+		{ 's', "-s step", "Sets the gap between two matrix sizes.", TYPE_INT , &step },
+		// { 'l', "-l list", "Only launches a subset of available benchmarks\n - 1: compare to raw blas\n - 2:various square sizes\n - 3:various shapes\n - 4: various parameters (a,b)\n - 5 : various transp. combinations", TYPE_INTLIST, &lst },
+		END_OF_ARGUMENTS
+	};
+
+	parseArguments (ac, av, as);
+
+	if (min >= max) {
+		throw LinBoxError("min value should be smaller than max...");
+	}
+	if (min + step >= max) {
+		std::cout << "Warning : your x axis has only one point. You should have a smaller step." << std::endl;
+	}
+
+	/* square for various fields */
+#if 1
+	{
+		std::cout << " *** Lines plot *** " << std::endl;
+		std::cout << "Benchmark square matrix multiplication via BMD.mul()" << std::endl;
+		bench_square(min,max,step,13);
+	}
+#endif
+
+	/* different sparse matrix   */
+
+	{
+		std::cout << " *** Bar plot *** " << std::endl;
+		std::cout << "Benchmark different matrices on different rank algorithms" << std::endl;
+		bench_rank(13);
+	}
+
+
+
+	return EXIT_SUCCESS ;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/benchmark-fgemm.C b/benchmarks/benchmark-fgemm.C
deleted file mode 100644
index e110c1f..0000000
--- a/benchmarks/benchmark-fgemm.C
+++ /dev/null
@@ -1,955 +0,0 @@
-
-/* Copyright (C) 2011 LinBox
- * Written by BB <brice.boyer at imag.fr>
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*! @file benchmarks/benchmark-fgemm.C
- * @ingroup benchmarks
- * @brief Benchmarking dense matrix multiplication on finite fields.
- * This file benchmarks the FFLAS::fgemm implementation for various fields,
- * shape and parameters. Actually, we use the wrapper member \c mul of LinBox::BlasMatrixDomain.
- * @todo make graphs look better (legends, units,...)
- */
-
-#include "benchmarks/benchmark.h"
-#include "linbox/util/error.h"
-#include "fflas-ffpack/fflas-ffpack.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/modular-balanced.h"
-#include "linbox/matrix/random-matrix.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
-
-#include <iomanip> // setprecision
-
-/* ********************** */
-/*        Outils          */
-/* ********************** */
-
-using Givaro::Timer;
-
-/*! @brief Watches a timer and a number and repet and signals if over.
- *
- * We want at least 2 repetions but not more than maxtime spent on timing.
- *
- * @param repet number of previous repetitions. Should be 0 on the first time
- * \c whatchon is called.
- * @param tim timer to watch
- * @param maxtime maximum time (in seconds) until \c keepon tells stop.
- * @return \c true if we conditions are not met to stop, \c false otherwise.
- * @pre \c tim was clear at the beginning and never started.
- *
- */
-bool keepon(index_t & repet, const Timer & tim, double maxtime=0.2)
-{
-	if (repet<2 || tim.usertime() < maxtime) {
-		++repet ;
-		return true;
-	}
-	return false ;
-}
-
-bool keepon(index_t & repet, const double & tim, double maxtime=0.2)
-{
-	if (repet<2 || tim < maxtime) {
-		++repet ;
-		return true;
-	}
-	return false ;
-}
-
-
-/*! @brief Watches a timer and a number and repet and signals if over.
- *
- * We want at least 2 repetions but not more than maxtime spent on timing.
- *
- * @param repet number of previous repetitions. Should be 0 on the first time \c whatchon is called.
- * @param tim timer to watch
- * @param maxtime maximum time (in seconds) until \c watchon tells stop.
- * @return \c true if we conditions are not met to stop, \c false otherwise.
- * @pre \c tim should have been started previously !
- *
- */
-bool whatchon(index_t & repet, /*  const */Timer & tim, double maxtime=0.5)
-{
-	if (repet<2 || tim.userElapsedTime() < maxtime) {
-		++repet ;
-		return true;
-	}
-	return false ;
-}
-
-void showAdvanceLinear(int curr, int min, int max)
-{
-	std::cout << std::setprecision(4) << "\033[2K" << "\033[30D" << min <<std::flush;
-	std::cout << '<' << curr << '<' << max << " (" << std::flush;
-	std::cout << double(curr-min)/double(max-min)*100 << "%)" << std::flush;
-}
-void showFinish(int curr, int all)
-{
-	std::cout <<  "\033[2K" << "\033[30D" << "finished : " << curr << std::flush;
-	std::cout << '/' << all-1 << std::flush << std::endl;
-}
-void showSkip(int curr, int all)
-{
-	std::cout <<  "\033[2K" << "\033[30D" << "skipped : " << curr << std::flush;
-	std::cout << '/' << all-1 << std::flush << std::endl;
-}
-
-
-double fgemm_mflops(int m, int n, int k)
-{
-	return 2*(double)m/100*(double)n/100*(double)k/100 ;
-}
-
-double compute_mflops(const Timer & t, const double mflo, const int rpt = 1)
-{
-	linbox_check(rpt);
-	return (double) ((mflo*rpt)/t.usertime());
-}
-
-double compute_mflops(const double & t, const double mflo, const int rpt = 1)
-{
-	linbox_check(rpt);
-	return (double) ((mflo*rpt)/t);
-}
-
-/*! @internal
- * @brief launches the benchmarks for the square case.
- * @param F field
- * @param min min size to bench
- * @param max max size to bench
- * @param step step between two sizes
- * @param Data where data is stored
- * @param series_nb index of the current series.
- */
-template<class Field>
-void launch_bench_square(Field & F // const problem
-			 , index_t min, index_t max, int step
-			 , LinBox::PlotData<index_t> & Data
-			 , index_t series_nb)
-{
-	index_t l = 0 ;
-	Timer fgemm_sq_tim ;
-	Timer chrono ;
-	double mflops ;
-	typedef typename Field::Element  Element;
-	typedef typename Field::RandIter Randiter ;
-	Randiter R(F) ;
-	LinBox::BlasMatrixDomain<Field> BMD(F) ;
-	LinBox::RandomDenseMatrix<Randiter,Field> RandMat(F,R);
-	// index_t repet = 3 ;
-	for ( index_t i = min ; i < max ; i += step , ++l ) {
-		showAdvanceLinear(i,min,max);
-		int ii = i ; // sinon, le constructeur le plus proche serait (_Matrix,_Field)... n'impnawak...
-		LinBox::BlasMatrix<Field> A (F,ii,ii);
-		LinBox::BlasMatrix<Field> B (F,ii,ii);
-		LinBox::BlasMatrix<Field> C (F,ii,ii);
-		if (!series_nb)
-			Data.setAbsciName(l,i); // only write abscissa for serie 0
-		index_t j = 0 ; // number of repets.
-
-		RandMat.random(A);
-		RandMat.random(B);
-		RandMat.random(C);
-		fgemm_sq_tim.clear() ;
-		while( keepon(j, fgemm_sq_tim) ) {
-			chrono.clear() ; chrono.start() ;
-			BMD.mul(C,A,B) ; // C = AB
-			chrono.stop();
-			fgemm_sq_tim += chrono ;
-		}
-		if (!j){
-			std::cout << "multiplication did not happen" << std::endl;
-		}
-#ifdef _LB_DEBUG
-		else {
-			std::cout << i << ',' << j << std::endl;
-		}
-#endif
-		mflops = compute_mflops(fgemm_sq_tim,fgemm_mflops(i,i,i),j);
-		Data.setEntry(series_nb,l,mflops);
-
-	}
-	std::ostringstream nam ;
-	nam << '\"' ;
-	F.write(nam);
-	nam << '\"' ;
-	Data.setSerieName(series_nb,nam.str());
-
-}
-
-/*! @internal
- * @brief launches the benchmarks for the square case directly BLAS.
- * @param min min size to bench
- * @param max max size to bench
- * @param step step between two sizes
- * @param Data where data is stored
- * @param series_nb index of the current series.
- */
-template<class Field>
-void launch_bench_blas(Field & F
-		       , index_t min, index_t max, int step
-		       , LinBox::PlotData<index_t> & Data
-		       , index_t series_nb
-		       )
-{
-	// typedef LinBox::Modular<T> Field ;
-	// Field F((int)charact);
-	index_t l = 0 ;
-	Timer fgemm_blas_tim ;
-	Timer chrono ;
-	double mflops ;
-	typedef typename Field::Element  Element ;
-	typedef typename Field::RandIter Randiter;
-	Randiter R(F) ;
-	// LinBox::BlasMatrixDomain<Field> BMD(F) ;
-	// LinBox::RandomDenseMatrix<Randiter,Field> RandMat(F,R);
-	// index_t repet = 3 ;
-	index_t mm = max * max ;
-	Element *  A = new Element[mm] ;
-	Element *  B = new Element[mm] ;
-	Element *  C = new Element[mm] ;
-	// typedef typename LinBox::UnparametricField<T> FloatingDomain ;
-	// FloatingDomain G ;
-
-	for ( index_t i = min ; i < max ; i += step , ++l ) {
-		showAdvanceLinear(i,min,max);
-
-		int ii = i ; // sinon, le constructeur le plus proche serait (_Matrix,_Field)... n'impnawak...
-		index_t mimi = (index_t) ii*ii ;
-		if (!series_nb)
-			Data.setAbsciName(l,i); // only write abscissa for serie 0
-
-		for (index_t j = 0 ; j < mimi ; ++j) R.random(A[j]);
-		for (index_t j = 0 ; j < mimi ; ++j) R.random(B[j]);
-		for (index_t j = 0 ; j < mimi ; ++j) R.random(C[j]);
-
-		index_t j = 0 ;
-		fgemm_blas_tim.clear() ;
-		// double fgemm_blas_tim = 0 ;
-		while(keepon(j,fgemm_blas_tim)) {
-			chrono.clear(); chrono.start() ;
-			FFLAS::fgemm((typename Field::Father_t)F,FFLAS::FflasNoTrans,FFLAS::FflasNoTrans,
-					     ii,ii,ii,
-					     F.one,
-					     A,ii,B,ii,
-					     F.zero,
-					     C,ii) ;
-			chrono.stop() ;
-			fgemm_blas_tim += chrono ;
-		}
-		mflops = compute_mflops(fgemm_blas_tim,fgemm_mflops(i,i,i),j);
-// #ifndef NDEBUG
-		if (i >=950 && i <= 1050 ) {
-			std::cerr << std::endl<< typeid(Field).name() << ' ' << i << ':' << mflops << std::endl;
-			std::cerr << fgemm_blas_tim << std::endl;
-		}
-// #endif
-
-		Data.setEntry(series_nb,l,mflops);
-	}
-
-	delete[] A ;
-	delete[] B ;
-	delete[] C ;
-	std::ostringstream nam ;
-	nam << '\"' ;
-	F.write(nam);
-	nam << '\"' ;
-	Data.setSerieName(series_nb,nam.str());
-
-}
-
-/*! @internal
- * @brief launches the benchmarks for the square case.
- * C= AB
- * @param F field
- * @param m rows in A
- * @param k cols in A
- * @param n cols in C
- * @param Data where data is stored
- * @param point_nb point to be computed
- */
-template<class Field>
-void launch_bench_rectangular(Field & F // const problem
-			      , int m, int k, int n
-			      , LinBox::PlotData<std::string> & Data
-			      , index_t point_nb)
-{
-	Timer fgemm_rect_tim ;
-	Timer chrono ; chrono.clear();
-	double mflops ;
-	typedef typename Field::Element  Element;
-	typedef typename Field::RandIter Randiter ;
-	Randiter R(F) ;
-	LinBox::BlasMatrixDomain<Field> BMD(F) ;
-	LinBox::RandomDenseMatrix<Randiter,Field> RandMat(F,R);
-	// index_t repet = 3 ;
-	LinBox::BlasMatrix<Field> A (F,m,k);
-	LinBox::BlasMatrix<Field> B (F,k,n);
-	LinBox::BlasMatrix<Field> C (F,m,n);
-	index_t j = 0 ;
-	fgemm_rect_tim.clear() ;
-	while (keepon(j,fgemm_rect_tim)) {
-		RandMat.random(A);
-		RandMat.random(B);
-		RandMat.random(C);
-		chrono.clear() ; chrono.start() ;
-		BMD.mul(C,A,B) ; // C = AB
-		chrono.stop();
-		fgemm_rect_tim += chrono ;
-	}
-	if (!j) {
-		std::cout << "multiplication did not happen" << std::endl;
-	}
-#ifdef _LB_DEBUG
-	else {
-		std::cout << point_nb << std::endl;
-	}
-#endif
-	mflops = compute_mflops(fgemm_rect_tim,fgemm_mflops(m,k,n),j);
-	Data.setEntry(0,point_nb,mflops);
-	std::ostringstream nam ;
-	nam << "\"(" << m << ',' << k << ',' << n << ")\"" ;
-	Data.setAbsciName(point_nb,nam.str());
-}
-
-/*! @internal
- * @brief launches the benchmarks for various parameters of a, b.
- * D = aAB+bC and C = aAB+bC ("in place" versions)
- * Are tested the following couples \c (a,b) (where \c p is invertible in \p F. This has
- * to be true when \c a=p.) :
- * - b=0 and a=1,-1,p ;
- * - a=1 and b=1,-1,p ;
- * - a=-1 and id. ;
- * - a=p and id. ;
- * .
- * We call xA = ^tA if tA is true, A otherwise.
- * @param F field
- * @param m rows in xA
- * @param k cols in xA and rows in xB
- * @param n cols in xB
- * @param alpha alpha (not zero)
- * @param beta beta
- * @tparam tA is A transposed ?
- * @tparam tB is B transposed ?
- * @param Data where data is stored
- * @param point_nb point to be computed
- * @param inplace in place or not (ie C is overwritten or not ? default = \c false.
- */
-template<class Field, bool tA, bool tB>
-void launch_bench_scalar(Field & F // const problem
-			 , int m, int k, int n
-			 , const typename Field::Element & alpha, const typename Field::Element & beta
-			 , LinBox::PlotData<std::string> & Data
-			 , index_t point_nb
-			 , bool inplace = false)
-{
-	Timer fgemm_scal_tim ;
-	Timer chrono ;
-	fgemm_scal_tim.clear();
-	double mflops ;
-	typedef typename Field::Element  Element;
-	typedef typename Field::RandIter Randiter ;
-	typedef typename LinBox::BlasMatrix<Field >  Matrix ;
-	typedef typename LinBox::TransposedBlasMatrix<Matrix > TransposedMatrix ;
-	Randiter R(F) ;
-	LinBox::BlasMatrixDomain<Field> BMD(F) ;
-	LinBox::RandomDenseMatrix<Randiter,Field> RandMat(F,R);
-	// index_t repet = 3 ;
-	int mm = tA?k:m ;
-	int kk = tA?m:k ;
-	int nn = tB?k:n ;
-	Matrix A (F,mm,kk);
-	Matrix B (F,kk,nn);
-	Matrix C (F,m,n);
-	Matrix D (F,m,n);
-	TransposedMatrix At(A);
-	TransposedMatrix Bt(B);
-	// LinBox::BlasMatrix<Field > A (mm,kk);
-	// LinBox::BlasMatrix<Field > B (kk,nn);
-	// LinBox::BlasMatrix<Field > C (m,n);
-	// LinBox::BlasMatrix<Field > D (m,n);
-
-
-	// LinBox::TransposedBlasMatrix<LinBox::BlasMatrix<Field > > At(A);
-	// LinBox::TransposedBlasMatrix<LinBox::BlasMatrix<Field > > Bt(B);
-
-	index_t j = 0 ;
-	while (keepon(j,fgemm_scal_tim)) {
-		RandMat.random(A);
-		RandMat.random(B);
-		RandMat.random(C);
-
-		chrono.clear() ; chrono.start();
-
-		if (inplace) {
-			if (tA) {
-				if (tB) {
-					BMD.muladdin(beta,C,alpha,At,Bt) ; // C = alphaAB+beta C
-				}
-				else{
-					BMD.muladdin(beta,C,alpha,At,B) ;
-				}
-			}
-			else {
-				if (tB) {
-					BMD.muladdin(beta,C,alpha,A,Bt) ;
-				}
-				else{
-					BMD.muladdin(beta,C,alpha,A,B) ;
-				}
-
-			}
-		}
-		else {
-			if (tA) {
-				if (tB) {
-					BMD.muladd(D,beta,C,alpha,At,Bt) ; // D = alphaAB+beta C
-				}
-				else{
-					BMD.muladd(D,beta,C,alpha,At,B) ;
-				}
-			}
-			else {
-				if (tB) {
-					BMD.muladd(D,beta,C,alpha,A,Bt) ;
-				}
-				else{
-					BMD.muladd(D,beta,C,alpha,A,B) ;
-				}
-
-			}
-		}
-
-		chrono.stop() ; fgemm_scal_tim += chrono ;
-	}
-	if (!j) {
-		std::cout << "multiplication did not happen" << std::endl;
-	}
-#ifdef _LB_DEBUG
-	else {
-		std::cout << point_nb << std::endl;
-	}
-#endif
-	mflops = compute_mflops(fgemm_scal_tim,fgemm_mflops(m,k,n),j);
-	Data.setEntry(0,point_nb,mflops);
-	std::ostringstream nam ;
-	nam << "\"(" << m << ',' << k << ',' << n << ") ";
-	nam << (inplace?"C":"D") << "=" << alpha << " "  ;
-	nam << (tA?"t":"")<< "A." <<  (tB?"t":"")<< "B+" << beta << " C\"" ;
-	Data.setAbsciName(point_nb,nam.str());
-}
-
-
-/* ********************** */
-/*        Tests           */
-/* ********************** */
-
-/*! Benchmark fgemm Y=AX for several sizes of sqare matrices.
- * @param min min size
- * @param max max size
- * @param step step of the size between 2 benchmarks
- * @param charac characteristic of the field.
- */
-void bench_blas( index_t min, index_t max, int step, int charac )
-{
-	int nb = 1 ;// une col de plus (la première)
-	typedef LinBox::Modular<double>          Field0 ; ++nb ;
-	typedef LinBox::Modular<float>           Field1 ; ++nb ;
-	typedef LinBox::Modular<int32_t>         Field2 ; ++nb ;
-	typedef LinBox::ModularBalanced<double>  Field3 ; ++nb ;
-	typedef LinBox::ModularBalanced<float>   Field4 ; ++nb ;
-	typedef LinBox::ModularBalanced<int32_t> Field5 ; ++nb ;
-	typedef LinBox::UnparametricField<double>Field6 ; ++nb ;
-	typedef LinBox::UnparametricField<float> Field7 ; ++nb ;
-
-	int nb_pts = (int) std::ceil((double)(max-min)/(double)step) ;
-	LinBox::PlotData<index_t>  Data(nb_pts,nb);
-	int it = 0 ;
-
-	Field0 F0(charac) ;
-	launch_bench_blas(F0,min,max,step,Data,it++);
-	showFinish(it,nb);
-	if (charac < 2048) {
-		Field1 F1(charac) ;
-		launch_bench_blas(F1,min,max,step,Data,it++);
-		showFinish(it,nb);
-	}
-	else {
-		showSkip(it,nb);
-	}
-	Field2 F2(charac) ;
-	launch_bench_blas(F2,min,max,step,Data,it++);
-	showFinish(it,nb);
-	Field3 F3(charac) ;
-	launch_bench_blas(F3,min,max,step,Data,it++);
-	showFinish(it,nb);
-	if (charac < 2048) {
-		Field4 F4(charac) ;
-		launch_bench_blas(F4,min,max,step,Data,it++);
-	showFinish(it,nb);
-	}
-	else {
-		showSkip(it,nb);
-	}
-	Field5 F5(charac) ;
-	launch_bench_blas(F5,min,max,step,Data,it++);
-	showFinish(it,nb);
-	Field6 F6(charac) ;
-	launch_bench_blas(F6,min,max,step,Data,it++);
-	showFinish(it,nb);
-	if (charac < 2048) {
-		Field7 F7((float)charac) ;
-		launch_bench_blas(F7,min,max,step,Data,it++);
-		showFinish(it,nb);
-	}
-	else {
-		showSkip(it,nb);
-	}
-
-	linbox_check(it <= nb);
-
-
-	LinBox::PlotStyle Style;
-	// Style.setTerm(LinBox::PlotStyle::pdf);
-	// Style.setTerm(LinBox::PlotStyle::png);
-	// Style.setTerm(LinBox::PlotStyle::svg);
-	Style.setTerm(LinBox::PlotStyle::Term::eps);
-	Style.setTitle("FFLAS::fgemm","Mflops","dimensions");
-	// Style.setType(LinBox::PlotStyle::histogram);
-	// Style.setStyle("set style histogram cluster gap 1");
-	// Style.addStyle("set style fill solid border -1");
-	// Style.addStyle("set boxwidth 0.9");
-
-	Style.setPlotType(LinBox::PlotStyle::Plot::graph);
-	Style.setLineType(LinBox::PlotStyle::Line::linespoints);
-	Style.setUsingSeries(std::pair<index_t,index_t>(2,nb));
-
-	LinBox::PlotGraph<index_t> Graph(Data,Style);
-	Graph.setOutFilename("fgemm_blas");
-
-	// Graph.plot();
-
-	Graph.print_gnuplot();
-
-	Graph.print_latex();
-
-	return ;
-
-}
-
-/*! @brief Benchmark square fgemm Y=AX for several fields.
- * @param min min size
- * @param max max size
- * @param step step of the size between 2 benchmarks
- * @param charac characteristic of the field.
- */
-void bench_square( index_t min, index_t max, int step, int charac )
-{
-
-	int nb = 1 ;// une col de plus (la première)
-	typedef LinBox::Modular<double>          Field0 ; ++nb ;
-	typedef LinBox::Modular<float>           Field1 ; ++nb ;
-	typedef LinBox::Modular<int32_t>         Field2 ; ++nb ;
-	typedef LinBox::ModularBalanced<double>  Field3 ; ++nb ;
-	typedef LinBox::ModularBalanced<float>   Field4 ; ++nb ;
-	typedef LinBox::ModularBalanced<int32_t> Field5 ; ++nb ;
-	// GivaroZpZ
-
-	int nb_pts = (int) std::ceil((double)(max-min)/(double)step) ;
-	LinBox::PlotData<index_t>  Data(nb_pts,nb);
-	int it = 0 ;
-
-	Field0 F0(charac) ;
-	launch_bench_square(F0,min,max,step,Data,it++);
-	showFinish(it,nb);
-	if (charac < 2048) {
-		Field1 F1(charac) ;
-		launch_bench_square(F1,min,max,step,Data,it++);
-		showFinish(it,nb);
-	}
-	else {
-		showSkip(it,nb);
-	}
-	Field2 F2(charac) ;
-	launch_bench_square(F2,min,max,step,Data,it++);
-	showFinish(it,nb);
-	Field3 F3(charac) ;
-	launch_bench_square(F3,min,max,step,Data,it++);
-	showFinish(it,nb);
-	if (charac < 2048) {
-		Field4 F4(charac) ;
-		launch_bench_square(F4,min,max,step,Data,it++);
-	showFinish(it,nb);
-	}
-	else {
-		showSkip(it,nb);
-	}
-	Field5 F5(charac) ;
-	launch_bench_square(F5,min,max,step,Data,it++);
-	showFinish(it,nb);
-	linbox_check(it <= nb);
-
-	LinBox::PlotStyle Style;
-	// Style.setTerm(LinBox::PlotStyle::Term::pdf);
-	// Style.setTerm(LinBox::PlotStyle::Term::png);
-	// Style.setTerm(LinBox::PlotStyle::Term::svg);
-	Style.setTerm(LinBox::PlotStyle::Term::eps);
-	Style.setTitle("BlasMatrixDomain mul","Mflops","dimensions");
-
-	Style.setPlotType(LinBox::PlotStyle::Plot::graph);
-	Style.setLineType(LinBox::PlotStyle::Line::linespoints);
-	Style.setUsingSeries(std::pair<index_t,index_t>(2,nb));
-
-	LinBox::PlotGraph<index_t> Graph(Data,Style);
-	Graph.setOutFilename("bmdmul_square");
-
-	// Graph.plot();
-
-	Graph.print_gnuplot();
-
-	Graph.print_latex();
-
-	return ;
-
-}
-
-/*! @brief Benchmark fgemm Y=AX for several shapes.
- * Let n=k^2.
- * we test the following shapes :
- * - (l,nk,nk), (nk,l,nk), (nk,nk,l) : like vector-product
- * - (kl,nk,n), (nk,kl,n),(nk,n,kl)     : one small rectangular matrix
- * - (kl,n,nk), (n,kl,nk),(n,nk,kl)     : same
- * - (nl,n,n),(n,nl,n),(n,n,nl)         : square (or close to)
- * .
- * @param k parameter.
- * @param charac characteristic of the field.
- * @param l small parameter (ie close to 1)
- */
-void bench_rectangular( index_t k, int charac, index_t l = 2 )
-{
-	int n  = k*k ;
-	int nk = n*k ;
-	int kl = k*l ;
-	int nl = n*l ;
-	typedef LinBox::Modular<double> Field ;
-	Field F(charac) ;
-
-	index_t it = 0 ; index_t nb = 12 ;
-	LinBox::PlotData<std::string>  Data(nb,1);
-	Data.setSerieName(0,"mflops");
-	launch_bench_rectangular(F,l,nk,nk,Data,it++);
-	launch_bench_rectangular(F,nk,l,nk,Data,it++);
-	launch_bench_rectangular(F,nk,nk,l,Data,it++);
-
-	launch_bench_rectangular(F,kl,nk,n,Data,it++);
-	launch_bench_rectangular(F,nk,kl,n,Data,it++);
-	launch_bench_rectangular(F,nk,n,kl,Data,it++);
-
-	launch_bench_rectangular(F,n,nk,kl,Data,it++);
-	launch_bench_rectangular(F,nk,n,kl,Data,it++);
-	launch_bench_rectangular(F,nk,kl,n,Data,it++);
-
-	launch_bench_rectangular(F,nl,n,n,Data,it++);
-	launch_bench_rectangular(F,n,nl,n,Data,it++);
-	launch_bench_rectangular(F,n,n,nl,Data,it++);
-	//!@todo resize if it>nb !!
-
-	linbox_check(it==nb);
-
-	LinBox::PlotStyle Style;
-	Style.setTerm(LinBox::PlotStyle::Term::eps);
-	Style.setTitle("fgemm","x","y");
-	Style.setPlotType(LinBox::PlotStyle::Plot::histo);
-	Style.setXtics(LinBox::PlotStyle::Options::oblique);// make long legends oblique.
-	Style.addPlotType("set style histogram cluster gap 1");
-	Style.addPlotType("set style fill solid border -1");
-	Style.addPlotType("set boxwidth 0.9");
-
-
-	// Style.setType(LinBox::PlotStyle::lines);
-	Style.setUsingSeries(2);
-
-	LinBox::PlotGraph<std::string> Graph(Data,Style);
-	Graph.setOutFilename("fgemm_rect");
-
-	// Graph.plot();
-
-	Graph.print_gnuplot();
-
-	Graph.print_latex();
-
-	return ;
-
-}
-
-/*! @brief Benchmark fgemm \f$D\gets\alpha A B+\beta C\f$ for general \f$\alpha,\beta\f$.
- * @param k parameter.
- * @param charac characteristic of the field.
- * @param inplace "inplace" matmul (ie. C=D is overwritten)
- */
-void bench_scalar( index_t k, int charac, bool inplace )
-{
-	typedef LinBox::Modular<double> Field ;
-	typedef Field::Element Element;
-	typedef Field::RandIter Randiter ;
-	Field F(charac) ;
-
-	index_t it = 0 ; index_t nb = 12 ;
-	LinBox::PlotData<std::string>  Data(nb,1);
-	Data.setSerieName(0,"fgemm");
-
-	Element one, zero, mOne, alpha, beta ;
-	F.init(one,1);
-	F.init(mOne,-1);
-	F.init(zero,0);
-
-
-	Randiter R(F) ;
-	linbox_check(charac >=5) ;
-
-	do { R.random(alpha) ; } // non trivial alpha
-	while (F.areEqual(alpha,one) || F.areEqual(alpha,mOne) || F.areEqual(alpha,zero)) ;
-
-	do { R.random(beta) ; }// non trivial beta
-	while (F.areEqual(beta,one) || F.areEqual(beta,mOne) || F.areEqual(beta,zero)) ;
-
-
-	// D = AB + beta C
-	launch_bench_scalar<Field,0,0>(F,k,k,k,one,zero,Data,it++,inplace);
-	launch_bench_scalar<Field,0,0>(F,k,k,k,one,mOne,Data,it++,inplace);
-	launch_bench_scalar<Field,0,0>(F,k,k,k,one,one ,Data,it++,inplace);
-	launch_bench_scalar<Field,0,0>(F,k,k,k,one,beta,Data,it++,inplace);
-
-	// D = -AB + beta C
-	launch_bench_scalar<Field,0,0>(F,k,k,k,mOne,zero,Data,it++,inplace);
-	launch_bench_scalar<Field,0,0>(F,k,k,k,mOne,mOne,Data,it++,inplace);
-	launch_bench_scalar<Field,0,0>(F,k,k,k,mOne,one ,Data,it++,inplace);
-	launch_bench_scalar<Field,0,0>(F,k,k,k,mOne,beta,Data,it++,inplace);
-
-	// D = alpha AB + beta C
-	launch_bench_scalar<Field,0,0>(F,k,k,k,alpha,zero,Data,it++,inplace);
-	launch_bench_scalar<Field,0,0>(F,k,k,k,alpha,mOne,Data,it++,inplace);
-	launch_bench_scalar<Field,0,0>(F,k,k,k,alpha,one ,Data,it++,inplace);
-	launch_bench_scalar<Field,0,0>(F,k,k,k,alpha,beta,Data,it++,inplace);
-
-
-	linbox_check(it==nb);
-
-	LinBox::PlotStyle Style;
-	Style.setTerm(LinBox::PlotStyle::Term::eps);
-	Style.setTitle("fgemm","x","y");
-	Style.setPlotType(LinBox::PlotStyle::Plot::histo);
-	Style.setXtics(LinBox::PlotStyle::Options::oblique);// make long legends oblique.
-	Style.addPlotType("set style histogram cluster gap 1");
-	Style.addPlotType("set style fill solid border -1");
-	Style.addPlotType("set boxwidth 0.9");
-
-	// Style.setType(LinBox::PlotStyle::lines);
-	Style.setUsingSeries(2);
-
-	LinBox::PlotGraph<std::string> Graph(Data,Style);
-	Graph.setOutFilename("fgemm_scal");
-
-	// Graph.plot();
-
-	Graph.print_gnuplot();
-
-	Graph.print_latex();
-
-	return ;
-
-}
-
-/*! @brief Benchmark fgemm \f$D\gets\alpha A^x B^y+\beta C\f$ for \f$x,y=1,\top\f$ (transpose or not).
- * @param k parameter.
- * @param charac characteristic of the field.
- * @param inplace "inplace" matmul (ie. C=D is overwritten)
- */
-void bench_transpose( index_t k, int charac, bool inplace )
-{
-	typedef LinBox::Modular<double> Field ;
-	typedef Field::Element Element;
-	typedef Field::RandIter Randiter ;
-	Field F(charac) ;
-
-	index_t it = 0 ; index_t nb = 8 ;
-	LinBox::PlotData<std::string>  Data(nb,1);
-	Data.setSerieName(0,"fgemm");
-
-	Element one, zero, mOne, alpha, beta ;
-	F.init(one,1);
-	F.init(mOne,-1);
-	F.init(zero,0);
-
-
-	Randiter R(F) ;
-	linbox_check(charac >=5) ;
-
-	do { R.random(alpha) ; } // non trivial alpha
-	while (F.areEqual(alpha,one) || F.areEqual(alpha,mOne) || F.areEqual(alpha,zero)) ;
-
-	do { R.random(beta) ; }// non trivial beta
-	while (F.areEqual(beta,one) || F.areEqual(beta,mOne) || F.areEqual(beta,zero)) ;
-
-
-	// D = A^xB^y
-	launch_bench_scalar<Field,0,0>(F,k,k,k,one,zero,Data,it++,inplace);
-	launch_bench_scalar<Field,1,0>(F,k,k,k,one,zero,Data,it++,inplace);
-	launch_bench_scalar<Field,0,1>(F,k,k,k,one,zero,Data,it++,inplace);
-	launch_bench_scalar<Field,1,1>(F,k,k,k,one,zero,Data,it++,inplace);
-
-	// D = alpha A^xB^y + beta C
-	launch_bench_scalar<Field,0,0>(F,k,k,k,alpha,beta,Data,it++,inplace);
-	launch_bench_scalar<Field,1,0>(F,k,k,k,alpha,beta,Data,it++,inplace);
-	launch_bench_scalar<Field,0,1>(F,k,k,k,alpha,beta,Data,it++,inplace);
-	launch_bench_scalar<Field,1,1>(F,k,k,k,alpha,beta,Data,it++,inplace);
-
-
-	linbox_check(it==nb);
-
-	LinBox::PlotStyle Style;
-	Style.setTerm(LinBox::PlotStyle::Term::eps);
-	Style.setTitle("fgemm","x","y");
-	Style.setPlotType(LinBox::PlotStyle::Plot::histo);
-	Style.setXtics(LinBox::PlotStyle::Options::oblique);// make long legends oblique.
-	Style.addPlotType("set style histogram cluster gap 1");
-	Style.addPlotType("set style fill solid border -1");
-	Style.addPlotType("set boxwidth 0.9");
-
-	// Style.setType(LinBox::PlotStyle::lines);
-	Style.setUsingSeries(2);
-
-	LinBox::PlotGraph<std::string> Graph(Data,Style);
-	Graph.setOutFilename("fgemm_trans");
-
-	// Graph.plot();
-
-	Graph.print_gnuplot();
-
-	Graph.print_latex();
-
-	return ;
-
-}
-
-
-/*  Benchmark fgemm Y = a AX + b Y for various (a,b) couples */
-
-/*  main */
-
-int main( int ac, char ** av)
-{
-	/*  Argument parsing/setting */
-
-	static index_t       min  = 100;     /*  min size */
-	static index_t       max  = 1500;    /*  max size (not included) */
-	static index_t       step = 100;    /*  step between 2 sizes */
-	static std::list<int> lst  ;       /*  what bench to start ? */
-	lst.push_front(1);// ={1,2} vivement le nouveau std...
-	lst.push_front(2);
-
-	static Argument as[] = {
-		{ 'm', "-m min" , "Set minimal size of matrix to test."    , TYPE_INT , &min },
-		{ 'M', "-M Max" , "Set maximal size."                      , TYPE_INT , &max },
-		{ 's', "-s step", "Sets the gap between two matrix sizes.", TYPE_INT , &step },
-		{ 'l', "-l list", "Only launches a subset of available benchmarks\n - 1: compare to raw blas\n - 2:various square sizes\n - 3:various shapes\n - 4: various parameters (a,b)\n - 5 : various transp. combinations", TYPE_INTLIST, &lst },
-		END_OF_ARGUMENTS
-	};
-
-	LinBox::parseArguments (ac, av, as);
-
-	if (min >= max) {
-		throw LinBox::LinBoxError("min value should be smaller than max...");
-	}
-	if (min + step >= max) {
-		std::cout << "Warning : your x axis has only one point. You should have a smaller step." << std::endl;
-	}
-
-	//! @todo use commentator.
-	lst.unique();
-	lst.sort();
-	if (lst.empty()) {
-		std::cerr << "Warning, you are not benchmarking anything. Please check the -l value." << std::endl;
-	}
-	std::list<int>::iterator it = lst.begin();
-
-	/* against pure blas routine */
-	if (*it == 1) {
-		std::cout << "bench 1 : blas" << std::endl;
-		bench_blas(min,max,step,13);
-		bench_blas(min,max,step,2011);
-		bench_blas(min,max,step,65537);
-		if (++it == lst.end()) return EXIT_SUCCESS ;
-	}
-
-	/* square for various fields */
-	if (*it == 2) {
-		std::cout << "bench 2 : square" << std::endl;
-		bench_square(min,max,step,13);
-		bench_square(min,max,step,2011);
-		bench_square(min,max,step,65537);
-		if (++it == lst.end()) return EXIT_SUCCESS ;
-	}
-
-	/* various shapes. */
-	if (*it == 3) {
-		std::cout << "bench 3 : shapes" << std::endl;
-		int cube = (int) std::pow(max,double(1/3.));
-		bench_rectangular(cube,2011);
-		if (++it == lst.end()) return EXIT_SUCCESS ;
-	}
-
-	/* various parameters */
-	if (*it == 4) {
-		std::cout << "bench 4 : scalars" << std::endl;
-		bench_scalar(max,65537,false);
-		bench_scalar(max,65537,true);
-		if (++it == lst.end()) return EXIT_SUCCESS ;
-	}
-
-	/* various tranpositions */
-	if (*it == 5) {
-		std::cout << "bench 2 : transp" << std::endl;
-		bench_transpose(max,65537,true);
-		bench_transpose(max,65537,true);
-		if (++it != lst.end())  {
-			std::cerr << "*** error *** your list contains (at least) one unknown element : " << *it << '!' << std::endl;
-		}
-	}
-	else {
-		std::cerr << "*** error *** your list contains (at least) one unknown element : " << *it << '!' << std::endl;
-	}
-	return EXIT_SUCCESS ;
-}
-
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
-
diff --git a/benchmarks/benchmark-ftrXm.C b/benchmarks/benchmark-ftrXm.C
deleted file mode 100644
index 99726cf..0000000
--- a/benchmarks/benchmark-ftrXm.C
+++ /dev/null
@@ -1,823 +0,0 @@
-
-/* Copyright (C) 2011 LinBox
- * Written by BB <brice.boyer at imag.fr>
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*! @file benchmarks/benchmark-ftrXm.C
- * @ingroup benchmarks
- * @brief Benchmarking triangular matrix multiplication on finite fields.
- * This file benchmarks the FFLAS::ftrmm, FFLAS::ftrsm implementation for various fields,
- * shape and parameters. Actually, we use the wrapper member \c mul of LinBox::BlasMatrixDomain.
- * @todo ftrmm has an 'alpha' but mul/mulin in BMd don't... That could be useful for \f$\alpha=-1\f$...
- * @todo benchmark ftrsm too here.
- */
-
-#include "benchmarks/benchmark.h"
-#include "linbox/util/error.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/modular-balanced.h"
-#include "fflas-ffpack/ffpack/ffpack.h"
-#include "fflas-ffpack/fflas/fflas.h"
-#include "linbox/matrix/random-matrix.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
-
-#define _LB_LEFT   true
-#define _LB_RITE  false
-
-#define _LB_TRANS  false
-#define _LB_NOTRS  true
-
-#define _LB_UNIT   true
-#define _LB_DIAG   false
-
-#define _LB_TSUP   true
-#define _LB_TLOW   false
-
-using LinBox::Timer ;
-
-/* ********************** */
-/*        Outils          */
-/* ********************** */
-
-/*! @brief Watches a timer and a number and repet and signals if over.
- *
- * We want at least 2 repetions but not more than maxtime spent on timing.
- *
- * @param repet number of previous repetitions. Should be 0 on the first time
- * \c whatchon is called.
- * @param tim timer to watch
- * @param maxtime maximum time (in seconds) until \c watchon tells stop.
- * @return \c true if we conditions are not met to stop, \c false otherwise.
- * @pre \c tim was clear at the beginning and never started.
- *
- */
-bool keepon(index_t & repet, Timer & tim, double maxtime=0.5)
-{
-	if (repet<2 || tim.usertime() < maxtime) {
-		++repet ;
-		return true;
-	}
-	return false ;
-}
-
-/*! @brief Watches a timer and a number and repet and signals if over.
- *
- * We want at least 2 repetions but not more than maxtime spent on timing.
- *
- * @param repet number of previous repetitions. Should be 0 on the first time \c whatchon is called.
- * @param tim timer to watch
- * @param maxtime maximum time (in seconds) until \c watchon tells stop.
- * @return \c true if we conditions are not met to stop, \c false otherwise.
- * @pre \c tim should have been started previously !
- *
- */
-bool whatchon(index_t & repet, Timer & tim, double maxtime=0.5)
-{
-	if (repet<2 || tim.userElapsedTime() < maxtime) {
-		++repet ;
-		return true;
-	}
-	return false ;
-}
-
-
-double ftrmm_mflops(index_t m, index_t n, index_t k)
-{
-	return (double)m*(double)n/1e6*(double)k ;
-}
-
-double compute_mflops(const Timer & t, const double mflo, const int rpt = 1)
-{
-	linbox_check(rpt);
-	return (double) ((mflo*rpt)/t.usertime());
-}
-
-/*! @internal
- * @brief launches the benchmarks for the square case.
- * @param F field
- * @param min min size to bench
- * @param max max size to bench
- * @param step step between two sizes
- * @param Data where data is stored
- * @param series_nb index of the current series.
- */
-template<class Field, bool LeftSide, bool UnitDiag, bool TriSup>
-void launch_bench_square(Field & F // const problem
-			, index_t min, index_t max, int step
-			, LinBox::PlotData<index_t> & Data
-			, index_t series_nb)
-{
-	index_t l = 0 ;
-	Timer fgemm_sq_tim ;
-	Timer chrono ;
-	double mflops ;
-	typedef typename Field::Element  Element;
-	typedef typename Field::RandIter Randiter ;
-	Randiter R(F) ;
-	LinBox::NonzeroRandIter<Field> Rn(F,R);
-	LinBox::BlasMatrixDomain<Field> BMD(F) ;
-	LinBox::RandomDenseMatrix<Randiter,Field> RandMat(F,R);
-	// index_t repet = 3 ;
-	for ( index_t i = min ; i < max ; i += step , ++l ) {
-		int ii = i ; // sinon, le constructeur le plus proche serait (_Matrix,_Field)... n'impnawak...
-		LinBox::TriangularBlasMatrix<Element> A (ii,ii,
-							 (TriSup?LinBox::LinBoxTag::Upper:LinBox::LinBoxTag::Lower),
-							 (UnitDiag?LinBox::LinBoxTag::Unit:LinBox::LinBoxTag::NonUnit));
-		LinBox::BlasMatrix<Element> B (ii,ii);
-		if (!series_nb)
-			Data.setAbsciName(l,i); // only write abscissa for serie 0
-		index_t j = 0 ; // number of repets.
-		fgemm_sq_tim.clear() ;
-		while( keepon(j,fgemm_sq_tim) ) {
-			RandMat.random(A);
-			for (size_t k=0 ; k<(size_t)ii ; ++k) Rn.random(A.refEntry(k,k)) ;
-			RandMat.random(B);
-			chrono.clear() ; chrono.start() ;
-			if(LeftSide)
-				BMD.mulin_right(A,B) ; // B <- AB
-			else
-				BMD.mulin_left(B,A) ;  // B <- BA
-			chrono.stop();
-			fgemm_sq_tim += chrono ;
-		}
-		if (!j){
-			std::cout << "multiplication did not happen" << std::endl;
-		}
-#ifdef _LB_DEBUG
-		else {
-			std::cout << i << ',' << j << std::endl;
-		}
-#endif
-		mflops = compute_mflops(fgemm_sq_tim,ftrmm_mflops(i,i,i),j);
-		Data.setEntry(series_nb,l,mflops);
-	}
-	std::string nam = "\"";
-	if (TriSup)
-		nam += "upper " ;
-	else
-		nam += "lower " ;
-	if (LeftSide)
-		nam += "left " ;
-	else
-		nam += "right " ;
-	if (UnitDiag)
-		nam += "non-" ;
-	nam += "unit\"" ;
-
-	Data.setSerieName(series_nb,nam);
-
-}
-
-/*! @internal
- * @brief launches the benchmarks for the square case directly BLAS.
- * @param min min size to bench
- * @param max max size to bench
- * @param step step between two sizes
- * @param Data where data is stored
- * @param series_nb index of the current series.
- */
-template<class T>
-void launch_bench_blas(index_t min, index_t max, int step
-		       , LinBox::PlotData<index_t> & Data
-		       , index_t series_nb
-		       , index_t charact)
-{
-	typedef LinBox::Modular<T> Field ;
-	Field F((int)charact);
-	index_t l = 0 ;
-	Timer ftrmm_blas_tim ;
-	Timer chrono ;
-	double mflops ;
-	typedef typename Field::Element  Element ;
-	typedef typename Field::RandIter Randiter;
-	Randiter R(F) ;
-	// LinBox::BlasMatrixDomain<Field> BMD(F) ;
-	// LinBox::RandomDenseMatrix<Randiter,Field> RandMat(F,R);
-	// index_t repet = 3 ;
-	index_t mm = max * max ;
-	Element *  A = new Element[mm] ;
-	Element *  B = new Element[mm] ;
-	Element *  C = new Element[mm] ;
-	typedef typename LinBox::UnparametricField<T> FloatingDomain ;
-	FloatingDomain G ;
-
-	for ( index_t i = min ; i < max ; i += step , ++l ) {
-		int ii = i ; // sinon, le constructeur le plus proche serait (_Matrix,_Field)... n'impnawak...
-		index_t mimi = (index_t) ii*ii ;
-		index_t j = 0 ;
-		ftrmm_blas_tim.clear() ;
-		while(keepon(j,ftrmm_blas_tim)) {
-			for (index_t j = 0 ; j < mimi ; ++j) R.random(A[j]);
-			for (index_t j = 0 ; j < mimi ; ++j) R.random(B[j]);
-			for (index_t j = 0 ; j < mimi ; ++j) R.random(C[j]);
-			chrono.clear(); chrono.start() ;
-			FFLAS::ftrmm(G,FFLAS::FflasLeft,FFLAS::FflasUpper,
-					     FFLAS::FflasNoTrans,
-					     FFLAS::FflasUnit,
-					     ii,ii,
-					     1.,
-					     A,ii, B,ii) ;
-			chrono.stop() ;
-			ftrmm_blas_tim += chrono ;
-		}
-		mflops = compute_mflops(ftrmm_blas_tim,ftrmm_mflops(i,i,i),j);
-		Data.setEntry(series_nb,l,mflops);
-	}
-
-	delete[] A ;
-	delete[] B ;
-	delete[] C ;
-	std::ostringstream nam ;
-	nam << '\"' ;
-	G.write(nam);
-	nam << '\"' ;
-	Data.setSerieName(series_nb,nam.str());
-
-}
-
-
-/*! @internal
- * @brief launches the benchmarks for the square case.
- * C= AB
- * @param F field
- * @param m rows in A
- * @param n cols in A
- * @param Data where data is stored
- * @param point_nb point to be computed
- */
-template<class Field, bool LeftSide, bool UnitDiag, bool TriSup>
-void launch_bench_rectangular(Field & F // const problem
-			      , index_t m, index_t n
-			      , LinBox::PlotData<std::string> & Data
-			      , index_t point_nb)
-{
-	Timer ftrmm_rect_tim ;
-	Timer chrono ; chrono.clear();
-	double mflops ;
-	typedef typename Field::Element  Element;
-	typedef typename Field::RandIter Randiter ;
-	typedef typename LinBox::TriangularBlasMatrix<Element> TriangularMatrix ;
-	typedef typename LinBox::BlasMatrix<Element >  Matrix ;
-
-	Randiter R(F) ;
-	LinBox::BlasMatrixDomain<Field> BMD(F) ;
-	LinBox::RandomDenseMatrix<Randiter,Field> RandMat(F,R);
-
-	index_t k = (LeftSide?m:n);
-
-	TriangularMatrix A (k,k,
-			    (TriSup?LinBox::LinBoxTag::Upper:LinBox::LinBoxTag::Lower),
-			    (UnitDiag?LinBox::LinBoxTag::Unit:LinBox::LinBoxTag::NonUnit));
-	Matrix B ((int)m,(int)n);
-
-	index_t j = 0 ;
-	ftrmm_rect_tim.clear() ;
-	while (keepon(j,ftrmm_rect_tim)) {
-		RandMat.random(A);
-		RandMat.random(B);
-		chrono.clear() ; chrono.start() ;
-
-		if(LeftSide)
-			BMD.mulin_right(A,B) ; // B <- AB
-		else
-			BMD.mulin_left(B,A) ;  // B <- BA
-
-		chrono.stop();
-		ftrmm_rect_tim += chrono ;
-	}
-	if (!j) {
-		std::cout << "multiplication did not happen" << std::endl;
-	}
-#ifdef _LB_DEBUG
-	else {
-		std::cout << point_nb << std::endl;
-	}
-#endif
-	mflops = compute_mflops(ftrmm_rect_tim,ftrmm_mflops(m,k,n),(int)j);
-	Data.setEntry(0,point_nb,mflops);
-	std::ostringstream nam ;
-	if (LeftSide)
-		nam << "\"(" << k << ':' << m << ',' << n << ")" ;
-	else
-		nam << "\"(" << m << ',' << n << ':' << k << ")" ;
-	nam << " (" << (UnitDiag?"":"non") << "unit) on ";
-	F.write(nam);
-	nam << '\"' ;
-
-
-	Data.setAbsciName(point_nb,nam.str());
-	return ;
-}
-
-/*! @internal
- * @brief launches the benchmarks for various parameters of a, b.
- * B = aAB or B=aBA with A triangular.
- * @todo We test various parameters \f$alpha\f$.
- * We test A being transposed or not.
- * @param F field
- * @param m rows in B
- * @param n cols in B
- * @param alpha alpha (not zero)
- * @param Data where data is stored
- * @param point_nb point to be computed
- */
-template<class Field, bool LeftSide, bool UnitDiag, bool TriSup, bool tA>
-void launch_bench_scalar(Field & F // const problem
-			 , int m, int n
-			 , const typename Field::Element & alpha //!@warning not used yet.
-			 , LinBox::PlotData<std::string> & Data
-			 , index_t point_nb)
-{
-	Timer ftrmm_scal_tim ;
-	Timer chrono ;
-	ftrmm_scal_tim.clear();
-	double mflops ;
-	typedef typename Field::Element  Element;
-	typedef typename Field::RandIter Randiter ;
-	typedef typename LinBox::BlasMatrix<Element >                    Matrix ;
-	typedef typename LinBox::TriangularBlasMatrix<Element>           TriangularMatrix ;
-	typedef typename LinBox::TransposedBlasMatrix<TriangularMatrix > TransposedTriangular ;
-
-
-	Randiter R(F) ;
-	LinBox::BlasMatrixDomain<Field> BMD(F) ;
-	LinBox::RandomDenseMatrix<Randiter,Field> RandMat(F,R);
-
-	index_t k = (LeftSide?m:n);
-
-	TriangularMatrix A (k,k,
-			    (TriSup?LinBox::LinBoxTag::Upper:LinBox::LinBoxTag::Lower),
-			    (UnitDiag?LinBox::LinBoxTag::Unit:LinBox::LinBoxTag::NonUnit));
-	TransposedTriangular At(A);
-	Matrix B (m,n);
-
-	index_t j = 0 ;
-	while (keepon(j,ftrmm_scal_tim)) {
-		RandMat.random(A);
-		RandMat.random(B);
-
-		chrono.clear() ; chrono.start();
-
-		if (tA) {
-			if(LeftSide)
-				BMD.mulin_right(At,B) ; // B <- AB
-			else
-				BMD.mulin_left(B,At) ;  // B <- BA
-		}
-		else  {
-			if(LeftSide)
-				BMD.mulin_right(A,B) ; // B <- AB
-			else
-				BMD.mulin_left(B,A) ;  // B <- BA
-		}
-
-
-		chrono.stop() ; ftrmm_scal_tim += chrono ;
-	}
-	if (!j) {
-		std::cout << "multiplication did not happen" << std::endl;
-	}
-#ifdef _LB_DEBUG
-	else {
-		std::cout << point_nb << std::endl;
-	}
-#endif
-	mflops = compute_mflops(ftrmm_scal_tim,ftrmm_mflops(m,k,n),(int)j);
-	Data.setEntry(0,point_nb,mflops);
-	std::ostringstream nam ;
-	nam << "\"(" << m << 'x' << n << ") ";
-	nam << "B=" << alpha << " " ;
-	if (LeftSide)
-		nam <<  (tA?"t":"")<< "A.B" ;
-	else
-		nam <<  "B." << (tA?"t":"")<< "A" ;
-	nam << " (" << (UnitDiag?"":"non") << "unit) on ";
-	F.write(nam);
-	nam << '\"' ;
-
-	Data.setAbsciName(point_nb,nam.str());
-}
-
-/* ********************** */
-/*        Tests           */
-/* ********************** */
-
-/*! @brief Benchmark square ftrmm for differenct parameters.
- * @param min min size
- * @param max max size
- * @param step step of the size between 2 benchmarks
- * @param charac characteristic of the field.
- */
-void bench_square( index_t min, index_t max, int step, int charac )
-{
-
-	int nb = 9 ;// une col de plus (la première)
-	typedef LinBox::Modular<double>          Field ; ++nb ;
-
-	int nb_pts = (int) std::ceil((double)(max-min)/(double)step) ;
-	LinBox::PlotData<index_t>  Data(nb_pts,nb);
-	LinBox::PlotStyle Style;
-	int it = 0 ;
-	Field F(charac) ;
-	std::cout << "0.." << std::flush;
-	/* _LB_LEFT,_LB_UNIT,_LB_TSUP */
-	launch_bench_square<Field,true,true,true>(F,min,max,step,Data,it++);
-	std::cout << "1.." << std::flush;
-	launch_bench_square<Field,true,true,false>(F,min,max,step,Data,it++);
-	std::cout << "2.." << std::flush;
-	launch_bench_square<Field,true,false,true>(F,min,max,step,Data,it++);
-	std::cout << "3.." << std::flush;
-	launch_bench_square<Field,true,false,false>(F,min,max,step,Data,it++);
-	std::cout << "4.." << std::flush;
-	launch_bench_square<Field,false,true,true>(F,min,max,step,Data,it++);
-	std::cout << "5.." << std::flush;
-	launch_bench_square<Field,false,true,false>(F,min,max,step,Data,it++);
-	std::cout << "6.." << std::flush;
-	launch_bench_square<Field,false,false,true>(F,min,max,step,Data,it++);
-	std::cout << "7.." << std::flush;
-	launch_bench_square<Field,false,false,false>(F,min,max,step,Data,it++);
-	std::cout << "9!!" << std::endl;
-
-
-
-	linbox_check(it <= nb);
-
-	Style.setTerm(LinBox::PlotStyle::Term::eps);
-	Style.setTitle("ftrmm","x","y");
-
-	Style.setPlotType(LinBox::PlotStyle::Plot::graph);
-	Style.setLineType(LinBox::PlotStyle::Line::linespoints);
-	Style.setUsingSeries(std::pair<index_t,index_t>(2,nb));
-
-	LinBox::PlotGraph<index_t> Graph(Data,Style);
-	Graph.setOutFilename("ftrmm_square");
-
-	// Graph.plot();
-
-	Graph.print_gnuplot();
-
-	Graph.print_latex();
-
-	return ;
-
-}
-
-/*! @brief Benchmark square ftrmm for several fields.
- * @param min min size
- * @param max max size
- * @param step step of the size between 2 benchmarks
- */
-void bench_fields( index_t min, index_t max, int step )
-{
-
-	int nb = 1 ;// une col de plus (la première)
-	typedef LinBox::Modular<float>                 Field0 ; ++nb ;
-	typedef LinBox::Modular<double>                Field1 ; ++nb ;
-	typedef LinBox::ModularBalanced<float>         Field2 ; ++nb ;
-	typedef LinBox::ModularBalanced<double>        Field3 ; ++nb ;
-
-	Field0 F0(2011);
-	Field1 F1(65537);
-	Field2 F2(2011);
-	Field3 F3(65537);
-
-	int nb_pts = (int) std::ceil((double)(max-min)/(double)step) ;
-	LinBox::PlotData<index_t>  Data(nb_pts,nb);
-	LinBox::PlotStyle Style;
-	int it = 0 ;
-	std::cout << "0.." << std::flush;
-	/* _LB_LEFT,_LB_UNIT,_LB_TSUP */
-	launch_bench_square<Field0,true,true,true>(F0,min,max,step,Data,it++);
-	std::cout << "1.." << std::flush;
-	launch_bench_square<Field1,true,true,true>(F1,min,max,step,Data,it++);
-	std::cout << "2.." << std::flush;
-	launch_bench_square<Field2,true,true,true>(F2,min,max,step,Data,it++);
-	std::cout << "3.." << std::flush;
-	launch_bench_square<Field3,true,true,true>(F3,min,max,step,Data,it++);
-	std::cout << "4!!" << std::endl;
-
-
-
-	linbox_check(it <= nb);
-
-	Style.setTerm(LinBox::PlotStyle::Term::eps);
-	Style.setTitle("ftrmm for various fields","x","y");
-
-	Style.setPlotType(LinBox::PlotStyle::Plot::graph);
-	Style.setLineType(LinBox::PlotStyle::Line::linespoints);
-	Style.setUsingSeries(std::pair<index_t,index_t>(2,nb));
-
-	LinBox::PlotGraph<index_t> Graph(Data,Style);
-	Graph.setOutFilename("ftrmm_fields");
-
-	// Graph.plot();
-
-	Graph.print_gnuplot();
-
-	Graph.print_latex();
-
-	return ;
-
-}
-
-
-/*! Benchmark fgemm Y=AX for several sizes of sqare matrices.
- * @param min min size
- * @param max max size
- * @param step step of the size between 2 benchmarks
- */
-void bench_blas( index_t min, index_t max, int step )
-{
-	//!@todo compare to cblas_dgemm instead.
-	typedef LinBox::Modular<double> DoubleField ;
-	typedef LinBox::Modular<float>  FloatField ;
-
-	int nb_pts = (int) std::ceil((double)(max-min)/(double)step) ;
-	int it = 0 ; int nb = 5 ;
-	LinBox::PlotData<index_t>  Data(nb_pts,nb);
-	FloatField F0(13) ;
-	/* _LB_LEFT,_LB_UNIT,_LB_TSUP */
-	launch_bench_square<FloatField,true,true,true>(F0,min,max,step,Data,it++);
-	launch_bench_blas<float>(min,max,step,Data,it++,13);
-
-	DoubleField F1(65537) ;
-	/* _LB_LEFT,_LB_UNIT,_LB_TSUP */
-	launch_bench_square<DoubleField,true,true,true>(F1,min,max,step,Data,it++);
-	launch_bench_blas<double>(min,max,step,Data,it++,65537);
-
-	linbox_check(it+1==nb);
-
-
-	LinBox::PlotStyle Style;
-	Style.setTerm(LinBox::PlotStyle::Term::eps);
-	Style.setTitle("ftrmm","x","y");
-
-	Style.setPlotType(LinBox::PlotStyle::Plot::graph);
-	Style.setLineType(LinBox::PlotStyle::Line::linespoints);
-	Style.setUsingSeries(std::pair<index_t,index_t>(2,nb));
-
-	LinBox::PlotGraph<index_t> Graph(Data,Style);
-	Graph.setOutFilename("ftrmm_blas");
-
-	// Graph.plot();
-
-	Graph.print_gnuplot();
-
-	Graph.print_latex();
-
-	return ;
-
-}
-
-
-/*! @brief Benchmark fgemm Y=AX for several shapes.
- * we test the following shapes :
- *   - (2k,2k):2k, 2k:(2k,2k)
- *   - (k,2k):2k, 2k:(2k,k)
- *   - (4k,2k):2k , 2k:(2k,4k)
- *   .
- * @param k parameter.
- * @param charac characteristic of the field.
- */
-void bench_rectangular( index_t k, int charac )
-{
-	typedef LinBox::Modular<double> Field ;
-	Field F(charac) ;
-
-	index_t it = 0 ; index_t nb = 6 ;
-	LinBox::PlotData<std::string>  Data(nb,1);
-	Data.setSerieName(0,"mflops");
-
-	launch_bench_rectangular<Field,_LB_LEFT,_LB_UNIT,_LB_TSUP>(F,2*k,2*k,Data,it++);
-	launch_bench_rectangular<Field,_LB_RITE,_LB_UNIT,_LB_TSUP>(F,2*k,2*k,Data,it++);
-
-	launch_bench_rectangular<Field,_LB_LEFT,_LB_UNIT,_LB_TSUP>(F,2*k,k,Data,it++);
-	launch_bench_rectangular<Field,_LB_RITE,_LB_UNIT,_LB_TSUP>(F,k,2*k,Data,it++);
-
-	launch_bench_rectangular<Field,_LB_LEFT,_LB_UNIT,_LB_TSUP>(F,2*k,4*k,Data,it++);
-	launch_bench_rectangular<Field,_LB_RITE,_LB_UNIT,_LB_TSUP>(F,4*k,2*k,Data,it++);
-
-	//!@todo resize if it>nb !!
-
-	linbox_check(it==nb);
-
-	LinBox::PlotStyle Style;
-	Style.setTerm(LinBox::PlotStyle::Term::eps);
-	Style.setTitle("ftrmm","x","y");
-	Style.setPlotType(LinBox::PlotStyle::Plot::histo);
-	Style.setXtics(LinBox::PlotStyle::Options::oblique);// make long legends oblique.
-	Style.addPlotType("set style histogram cluster gap 1");
-	Style.addPlotType("set style fill solid border -1");
-	Style.addPlotType("set boxwidth 0.9");
-	//! @todo make long legends oblique.
-
-	// Style.setType(LinBox::PlotStyle::lines);
-	Style.setUsingSeries(2);
-
-	LinBox::PlotGraph<std::string> Graph(Data,Style);
-	Graph.setOutFilename("ftrmm_rect");
-
-	// Graph.plot();
-
-	Graph.print_gnuplot();
-
-	Graph.print_latex();
-
-	return ;
-
-}
-
-/*! @brief Benchmark ftrmm with transpose or alpha parameters on.
- * @param k parameter.
- * @param charac characteristic of the field.
- */
-void bench_transpose( index_t k, int charac)
-{
-	typedef LinBox::Modular<double> Field ;
-	typedef Field::Element Element;
-	typedef Field::RandIter Randiter ;
-	Field F(charac) ;
-
-	index_t it = 0 ; index_t nb = 2 ;
-	LinBox::PlotData<std::string>  Data(nb,1);
-	Data.setSerieName(0,"fgemm");
-
-	Element one, zero, mOne, alpha, beta ;
-	F.init(one,1);
-	F.init(mOne,-1);
-	F.init(zero,0);
-
-
-	Randiter R(F) ;
-	linbox_check(charac >=5) ;
-
-	do { R.random(alpha) ; } // non trivial alpha
-	while (F.areEqual(alpha,one) || F.areEqual(alpha,mOne) || F.areEqual(alpha,zero)) ;
-
-	do { R.random(beta) ; }// non trivial beta
-	while (F.areEqual(beta,one) || F.areEqual(beta,mOne) || F.areEqual(beta,zero)) ;
-
-
-	// D = A^xB^y
-	launch_bench_scalar<Field,true,true,true,true>(F,k,k,one,Data,it++);
-	launch_bench_scalar<Field,true,true,true,false>(F,k,k,one,Data,it++);
-
-	linbox_check(it==nb);
-
-	LinBox::PlotStyle Style;
-	Style.setTerm(LinBox::PlotStyle::Term::eps);
-	Style.setTitle("fgemm","x","y");
-	Style.setPlotType(LinBox::PlotStyle::Plot::histo);
-	Style.setXtics(LinBox::PlotStyle::Options::oblique);// make long legends oblique.
-	Style.addPlotType("set style histogram cluster gap 1");
-	Style.addPlotType("set style fill solid border -1");
-	Style.addPlotType("set boxwidth 0.9");
-
-	// Style.setType(LinBox::PlotStyle::lines);
-	Style.setUsingSeries(2);
-
-	LinBox::PlotGraph<std::string> Graph(Data,Style);
-	Graph.setOutFilename("fgemm_trans");
-
-	// Graph.plot();
-
-	Graph.print_gnuplot();
-
-	Graph.print_latex();
-
-	return ;
-
-}
-
-/*  main */
-
-int main( int ac, char ** av)
-{
-	/*  Argument parsing/setting */
-
-	static index_t  min = 100;     /*  min size */
-	static index_t  max = 2000;    /*  max size (not included) */
-	static index_t step = 200;    /*  step between 2 sizes */
-	static std::list<int> lst  ;       /*  what bench to start ? */
-	lst.push_front(1);// ={1,2} vivement le nouveau std...
-	lst.push_front(2);
-
-	static Argument as[] = {
-		{ 'm', "-m min" , "Set minimal size of matrix to test."    , TYPE_INT , &min },
-		{ 'M', "-M Max" , "Set maximal size."                      , TYPE_INT , &max },
-		{ 's', "-s step", "Sets the gap between two matrix sizes.", TYPE_INT , &step },
-		{ 'l', "-l list", "Only launches a subset of available benchmarks\n - 1: compare to raw blas\n - 2:various square sizes\n - 3:various shapes\n - 4: various parameters (a,b)\n - 5 : various transp. combinations", TYPE_INTLIST, &lst },
-		END_OF_ARGUMENTS
-	};
-
-	parseArguments (ac, av, as);
-
-	if (min >= max) {
-		throw LinBox::LinBoxError("min value should be smaller than max...");
-	}
-	if (min + step >= max) {
-		std::cout << "Warning : your x axis has only one point. You should have a smaller step." << std::endl;
-	}
-
-	//! @todo use commentator.
-	lst.unique();
-	lst.sort();
-
-	bench_square(min,max,step,2011);
-	bench_fields(min,max,step);
-	bench_blas(min,max,step);
-	bench_rectangular(max/2,2011);
-	bench_transpose(max,2011);
-
-#if 0 /*  to be uncommented */
-	if (lst.empty()) {
-		std::cerr << "Warning, you are not benchmarking anything. Please check the -l value." << std::endl;
-	}
-	std::list<int>::iterator it = lst.begin();
-
-	/* against pure blas routine */
-	if (*it == 1) {
-		std::cout << "bench 1 : blas" << std::endl;
-		bench_blas(min,max,step);
-		if (++it == lst.end()) return EXIT_SUCCESS ;
-	}
-
-	/* square for various fields */
-	if (*it == 2) {
-		std::cout << "bench 2 : square" << std::endl;
-		bench_square(min,max,step,13);
-		bench_square(min,max,step,2011);
-		bench_square(min,max,step,65537);
-		if (++it == lst.end()) return EXIT_SUCCESS ;
-	}
-
-	/* various shapes. */
-	if (*it == 3) {
-		std::cout << "bench 3 : shapes" << std::endl;
-		int cube = (int) std::pow(max,double(1/3.));
-		bench_rectangular(cube,2011);
-		if (++it == lst.end()) return EXIT_SUCCESS ;
-	}
-
-	/* various parameters */
-	if (*it == 4) {
-		std::cout << "bench 4 : scalars" << std::endl;
-		bench_scalar(max,65537,false);
-		bench_scalar(max,65537,true);
-		if (++it == lst.end()) return EXIT_SUCCESS ;
-	}
-
-	/* various tranpositions */
-	if (*it == 5) {
-		std::cout << "bench 2 : transp" << std::endl;
-		bench_transpose(max,65537,true);
-		bench_transpose(max,65537,true);
-		if (++it != lst.end())  {
-			std::cerr << "*** error *** your list contains (at least) one unknown element : " << *it << '!' << std::endl;
-		}
-	}
-	else {
-		std::cerr << "*** error *** your list contains (at least) one unknown element : " << *it << '!' << std::endl;
-	}
-#endif
-	return EXIT_SUCCESS ;
-}
-
-#undef _LB_RITE
-#undef _LB_LEFT
-#undef _LB_TSUP
-#undef _LB_TLOW
-#undef _LB_UNIT
-#undef _LB_DIAG
-#undef _LB_TRANS
-#undef _LB_NOTRS
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/benchmarks/benchmark-metadata.C b/benchmarks/benchmark-metadata.C
new file mode 100644
index 0000000..6fe5d5e
--- /dev/null
+++ b/benchmarks/benchmark-metadata.C
@@ -0,0 +1,43 @@
+/* Copyright (C) 2013 LinBox
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file   benchmarks/benchmark-metadata.C
+ * @ingroup benchmarks
+ * @brief   metadata
+  */
+
+#ifndef __LINBOX_benchmarks_benchmark_metadata_C
+#define __LINBOX_benchmarks_benchmark_metadata_C
+
+
+
+#endif // __LINBOX_benchmarks_benchmark_metadata_C
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/benchmark-metadata.h b/benchmarks/benchmark-metadata.h
new file mode 100644
index 0000000..26919fc
--- /dev/null
+++ b/benchmarks/benchmark-metadata.h
@@ -0,0 +1,520 @@
+/* Copyright (C) 2013 LinBox
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file   benchmarks/benchmark-metadata.h
+ * @ingroup benchmarks
+ * @brief   metadata
+  */
+
+#ifndef __LINBOX_benchmarks_benchmark_metadata_H
+#define __LINBOX_benchmarks_benchmark_metadata_H
+
+#include "benchmark-utils.h"
+
+//
+// Metadata
+//
+
+
+namespace LinBox {
+
+	class MetaData ;
+
+	//! This is the general metadata class
+	class MetaData {
+	private :
+		svector_t name ; //!  key/name of the metadata. for instance <matrix id="matrix1"/>
+		std::string _hash ; //! unique id (used to save space)
+		svector_t  keys ;     //! keys
+		svector_t  vals ;     //! values
+		std::vector<MetaData *> metadata ; //! child metadata array
+
+	private :
+
+		//! @internal recursively free memory
+		void clean ()
+		{
+			if (this != NULL) {
+				for (size_t i = 0 ; i < metadata.size() ; ++i) {
+					metadata[i]->clean();
+					delete metadata[i] ;
+					metadata[i] = NULL ;
+				}
+			}
+			return;
+		}
+
+
+		//!  @internal copy all, including metadata children
+		void deep_copy(const MetaData * md)
+		{
+			name = md->getIds();
+			_hash = md->getHash();
+			keys = md->getKeys();
+			vals = md->getVals();
+			size_t md_size = md->getMetaDataSize();
+			if (md_size) {
+				metadata.resize(md_size,NULL);
+				for (size_t i = 0 ; i <md_size ; ++i) {
+					metadata[i] = new MetaData ;
+					metadata[i]->deep_copy(md->getMetaData(i));
+				}
+			}
+
+			return;
+		}
+
+		//!  @internal adds some metadata child
+		void push_back(const MetaData * md)
+		{
+			size_t md_size = getMetaDataSize();
+			metadata.resize(md_size+1,NULL);
+			metadata[md_size] = new MetaData ;
+			metadata[md_size]->deep_copy(md);
+		}
+
+	protected :
+
+		const std::string & getName() const
+		{
+			return name[1] ;
+		}
+
+
+		void setHash(const std::string & myhash)
+		{
+			_hash = myhash ;
+		}
+
+		const svector_t & getIds() const
+		{
+			return name ;
+		}
+
+		const svector_t & getKeys() const
+		{
+			return keys ;
+		}
+
+		const svector_t & getVals() const
+		{
+			return vals ;
+		}
+
+		size_t getMetaDataSize() const
+		{
+			return metadata.size();
+		}
+
+		const MetaData * getMetaData(const size_t & i) const
+		{
+			return metadata[i];
+		}
+
+
+		std::string hasher(const std::string & data)
+		{
+#ifdef HAVE_CXX11
+			std::hash<std::string> my_hasher ;
+			size_t the_hash = my_hasher(data);
+#else
+			std::locale loc;
+			const std::collate<char>& coll = std::use_facet<std::collate<char> >(loc); // const member ?
+			size_t the_hash = coll.hash(data.data(),data.data()+data.length());
+
+#endif
+			return toString(the_hash);
+		}
+
+	public:
+
+		MetaData() :
+			name(2)
+			, _hash("")
+			, keys(0)
+			, vals(0)
+			, metadata(0)
+		{
+			name[0] = "unknown" ;
+			name[1] = name[0] + '_' + randomAlNum(8) ;
+		}
+
+		~MetaData()
+		{
+			clean();
+		}
+
+		MetaData(const MetaData * md)
+		{
+			deep_copy(md);
+		}
+
+		MetaData(const MetaData & md)
+		{
+			deep_copy(&md);
+		}
+
+		template<class T>
+		void changeValue(const std::string & keyword, T& value)
+		{
+			size_t i ;
+		       	bool ok = findKeyword(i, keys.begin(), keys.end(), keyword);
+			if ( !ok )
+				// throw LinBoxError("undefined keyword",keyword);
+				throw LinBoxError("undefined keyword");
+
+			vals[i] = toString(value);
+
+			return;
+		}
+
+		const std::string & getValue(const std::string & keyword)
+		{
+			size_t i ;
+		       	bool ok = findKeyword(i, keys.begin(), keys.end(), keyword);
+			if ( !ok )
+				// throw LinBoxError("undefined keyword",keyword);
+				throw LinBoxError("undefined keyword");
+
+			return vals[i] ;
+		}
+
+		void addValue(const std::string & nom, const std::string & val = "N/A")
+		{
+			keys.push_back(nom);
+			vals.push_back(val);
+			linbox_check(keys.size() == vals.size());
+			return;
+		}
+
+		template <class T>
+		void addValue(const std::string & nom, const T & val )
+		{
+			keys.push_back(nom);
+			vals.push_back(toString(val));
+			linbox_check(keys.size() == vals.size());
+			return;
+		}
+
+		void addMetaData( const MetaData * md)
+		{
+			push_back(md);
+		}
+
+		void setIds (const std::string & key)
+		{
+			name[0] = key ;
+			name[1] = key + "_" + randomAlNum(8) ;
+
+			return;
+		}
+
+#ifdef __LINBOX_HAVE_TINYXML2
+		void writeMetaData(tinyxml2::XMLElement ** data, tinyxml2::XMLDocument & doc) const
+		{
+			//! @warning only one name allowed. Todo : matrix1, matrix2,...
+			using namespace tinyxml2;
+			*data = doc.NewElement( getIds()[0].c_str() );
+			linbox_check(*data);
+			(*data)->SetAttribute("id",getIds()[1].c_str());
+#ifndef NDEBUG
+			(*data)->SetAttribute("hash",getHash().c_str());
+#endif
+
+			for (size_t i = 0 ; i < keys.size() ; ++i  ) {
+				(*data)->SetAttribute(keys[i].c_str(),vals[i].c_str());
+			}
+
+			for (size_t i = 0 ; i < getMetaDataSize() ; ++i  ) {
+				XMLElement * child = NULL ;
+				getMetaData(i)->writeMetaData(&child,doc);
+				(*data)->InsertEndChild( child );
+			}
+
+			return ;
+		}
+#endif
+
+		// should not be too public
+		std::string getLocalString() const
+	       	{
+			std::string res = name[0] + ',' ;
+			for (size_t i = 0 ; i < keys.size() ; ++i)
+				res += keys[i] + '=' + vals[i] + ';';
+			return res ;
+		}
+
+		const std::string & getHash() const
+		{
+			return _hash ;
+		}
+
+
+	}; // MetaData
+
+} // LinBox
+
+//
+// MetaData specialized
+//
+
+#ifdef HAVE_CXX11
+#include <unordered_map>
+#endif
+
+namespace LinBox {
+
+	// class RepresentationMetaData ;
+	class MatrixMetaData ;
+	// class VectorMetaData ;
+	class StorageMetaData ;
+	class GeneratorMetaData ;
+	class FieldMetaData ;
+	// class SolutionMetaData ;
+	class AlgorithmMetaData ;
+	class EnvrironmentMetaData ;
+	class BenchmarkMetaData ;
+
+	//! Field metadata
+	class FieldMetaData : public MetaData {
+	private :
+
+	public :
+		FieldMetaData()
+		{
+			setIds("field");
+			addValue("name");
+			addValue("characteristic");
+
+			hash();
+		}
+		// a general field/ring has no exponent.
+
+		template<class Field>
+		FieldMetaData( const Field & F)
+		{
+#if 0
+			F.getMetaData(this); // this would also print representation
+			also det(A, some_mehtod(), Meta) would do  a dry run and print in Meta.
+#endif
+			setIds("field");
+
+			std::ostringstream a ;
+			F.write(a);
+			addValue("name",a.str());
+			addValue("characteristic", F.characteristic());
+
+			hash();
+		}
+
+		void hash()
+		{
+			std::string data = getLocalString() ;
+			linbox_check(getMetaDataSize() == 0);
+
+			setHash(hasher(data));
+		}
+
+	}; // FieldMetaData
+
+	//! Matrix metadata
+	// what if MetaData changes something in MatrixMetaData and does not update hash ?
+	class MatrixMetaData : public MetaData {
+		void initMetadata()
+		{
+			addValue("rowdim");
+			addValue("coldim");
+			addValue("nbnz");
+			addValue("name");
+
+			FieldMetaData FMD;
+			addMetaData(&FMD);
+		}
+	public:
+		MatrixMetaData()
+		{
+			setIds("matrix");
+			initMetadata() ;
+
+			hash();
+		}
+
+		template<class Matrix>
+		MatrixMetaData(Matrix & M, const std::string nom = "N/A" )
+		{
+			setIds("matrix");
+			// M.getMetaData(this);
+			addValue("rowdim",M.rowdim());
+			addValue("coldim",M.coldim());
+			addValue("nbnz",M.size());
+			addValue("name",nom);
+
+			FieldMetaData FMD(M.field());
+			addMetaData(&FMD);
+
+			hash();
+		}
+
+		void hash()
+	       	{
+			std::string data = getLocalString() ;
+			if (getMetaDataSize() == 1) { // first the field. (@todo search for fields, then search for random generator.)
+				data += getMetaData(0)->getLocalString();
+			}
+			setHash(hasher(data));
+		}
+
+	} ; // MatrixMetaData
+
+	//! Environment metadata;
+	class EnvironmentMetaData : public MetaData {
+		void initMetadata()
+		{
+			// Machine
+			// compiler
+		}
+	public :
+		EnvironmentMetaData()
+		{
+		}
+	}; // EnvironmentMetaData
+
+	//! Benchmark metadata;
+	class BenchmarkMetaData : public MetaData {
+		void initMetadata()
+		{
+			// problem
+			// machine
+		}
+	public :
+		BenchmarkMetaData()
+		{
+		}
+	}; // BenchmarkMetaData
+
+	//! Algorithm metadata;
+	class AlgorithmMetaData : public MetaData {
+		void initMetadata()
+		{
+			// name
+			// method
+		}
+	public :
+		AlgorithmMetaData()
+		{
+		}
+	}; // AlgorithmMetaData
+
+	//! Generator metadata;
+	class GeneratorMetaData : public MetaData {
+		void initMetadata()
+		{
+		}
+	public :
+		GeneratorMetaData()
+		{
+		}
+	}; // GeneratorMetaData
+
+	//! Storage metadata;
+	class StorageMetaData : public MetaData {
+		void initMetadata()
+		{
+		}
+	public :
+		StorageMetaData()
+		{
+		}
+	}; // StorageMetaData
+
+} // LinBox
+
+//
+// typedefs
+//
+
+namespace LinBox {
+	typedef std::vector<MetaData>  mvector_t ;
+} // LinBox
+
+//
+// Metadata Container
+//
+
+namespace LinBox {
+
+	struct MetaDataSeries {
+		mvector_t MetaDataVec ; // vector of metadatas
+		// svector_t PointsIDs ; // vector of points ids
+		smatrix_t MetaDataIDs ; // MetaDataIDs[i] is the list of indexes in PointIDs, corresponding to the points associated with metadatas MetaDataVec[i]. Could use some std::map as well.
+
+	public:
+		MetaDataSeries() :
+			MetaDataVec(0)
+			, MetaDataIDs(0)
+		{};
+		// bool exists(size_t & j, const MetaData & m);
+		// uses hashes to search for metadata.
+		void push_back(const std::string & pointID, const MetaData & pointMD)
+		{
+
+			// size_t j = MetaDataVec.size();
+			// re-hash here ?
+			std::string hsh = pointMD.getHash();
+			size_t i ;
+			bool found = false ;
+			for (i = 0 ; i < MetaDataVec.size() ; ++i)
+				if (hsh == MetaDataVec[i].getHash()) {
+					found = true ;
+					break;
+				}
+			linbox_check((!found) && (i == MetaDataVec.size()));
+
+			if (! found) {
+				MetaDataVec.push_back(pointMD);
+				svector_t used_by(0) ;
+				used_by.push_back(pointID);
+				MetaDataIDs.push_back(used_by) ;
+			}
+			else {
+				MetaDataIDs[i].push_back(pointID);
+			}
+		}
+	};
+
+} // LinBox
+
+#ifdef LinBoxSrcOnly
+#include "benchmarks/benchmark-metadata.C"
+#endif
+
+#endif // __LINBOX_benchmarks_benchmark_metadata_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/benchmark-order-basis.C b/benchmarks/benchmark-order-basis.C
new file mode 100755
index 0000000..5b68e77
--- /dev/null
+++ b/benchmarks/benchmark-order-basis.C
@@ -0,0 +1,395 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+#include <iostream>
+#include <iomanip>
+size_t getPeakRSS( );
+size_t getCurrentRSS( );
+//#define MEMINFO std::right<<std::setw(20)<<"                     ---->   Max Mem: "<<getPeakRSS()/1000000.<<"Mo"
+#define MB(x) ((x)/(double)(1<<20))
+//#define MB(x) ((x)>>20)
+#define MEMINFO std::right<<std::setw(20)<<"                     ---->   Mem: "<<MB(getCurrentRSS())<<" Mo  (Max: "<<MB(getPeakRSS())<<" Mo)"  
+#include "linbox/matrix/polynomial-matrix.h"
+#include "linbox/randiter/random-fftprime.h"
+#include "linbox/randiter/random-prime.h"
+#include "linbox/ring/modular.h"
+#include "linbox/algorithms/polynomial-matrix/polynomial-matrix-domain.h"
+#include "linbox/algorithms/polynomial-matrix/order-basis.h"
+#include "linbox/algorithms/block-coppersmith-domain.h"
+
+/* MEMORY INFO */
+#if defined(__unix__) || defined(__unix) || defined(unix) || (defined(__APPLE__) && defined(__MACH__))
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#if defined(BSD)
+#include <sys/sysctl.h>
+#endif
+#else
+#error "Unable to define getMemorySize( ) for an unknown OS."
+#endif
+
+#if defined(_WIN32)
+#include <windows.h>
+#include <psapi.h>
+
+#elif defined(__unix__) || defined(__unix) || defined(unix) || (defined(__APPLE__) && defined(__MACH__))
+#include <unistd.h>
+#include <sys/resource.h>
+
+#if defined(__APPLE__) && defined(__MACH__)
+#include <mach/mach.h>
+
+#elif (defined(_AIX) || defined(__TOS__AIX__)) || (defined(__sun__) || defined(__sun) || defined(sun) && (defined(__SVR4) || defined(__svr4__)))
+#include <fcntl.h>
+#include <procfs.h>
+
+#elif defined(__linux__) || defined(__linux) || defined(linux) || defined(__gnu_linux__)
+#include <stdio.h>
+
+#endif
+
+#else
+#error "Cannot define getPeakRSS( ) or getCurrentRSS( ) for an unknown OS."
+#endif
+/* END MEMORY INFO */
+
+size_t getPeakRSS( )
+{
+#if defined(_WIN32)
+	/* Windows -------------------------------------------------- */
+	PROCESS_MEMORY_COUNTERS info;
+	GetProcessMemoryInfo( GetCurrentProcess( ), &info, sizeof(info) );
+	return (size_t)info.PeakWorkingSetSize;
+
+#elif (defined(_AIX) || defined(__TOS__AIX__)) || (defined(__sun__) || defined(__sun) || defined(sun) && (defined(__SVR4) || defined(__svr4__)))
+	/* AIX and Solaris ------------------------------------------ */
+	struct psinfo psinfo;
+	int fd = -1;
+	if ( (fd = open( "/proc/self/psinfo", O_RDONLY )) == -1 )
+		return (size_t)0L;		/* Can't open? */
+	if ( read( fd, &psinfo, sizeof(psinfo) ) != sizeof(psinfo) )
+		{
+			close( fd );
+			return (size_t)0L;		/* Can't read? */
+		}
+	close( fd );
+	return (size_t)(psinfo.pr_rssize * 1024L);
+
+#elif defined(__unix__) || defined(__unix) || defined(unix) || (defined(__APPLE__) && defined(__MACH__))
+	/* BSD, Linux, and OSX -------------------------------------- */
+	struct rusage rusage;
+	getrusage( RUSAGE_SELF, &rusage );
+#if defined(__APPLE__) && defined(__MACH__)
+	return (size_t)rusage.ru_maxrss;
+#else
+	return (size_t)(rusage.ru_maxrss * 1024L);
+#endif
+
+#else
+	/* Unknown OS ----------------------------------------------- */
+	return (size_t)0L;			/* Unsupported. */
+#endif
+}
+/**
+ * Returns the current resident set size (physical memory use) measured
+ * in bytes, or zero if the value cannot be determined on this OS.
+ */
+size_t getCurrentRSS( )
+{
+#if defined(_WIN32)
+	/* Windows -------------------------------------------------- */
+	PROCESS_MEMORY_COUNTERS info;
+	GetProcessMemoryInfo( GetCurrentProcess( ), &info, sizeof(info) );
+	return (size_t)info.WorkingSetSize;
+
+#elif defined(__APPLE__) && defined(__MACH__)
+	/* OSX ------------------------------------------------------ */
+	struct mach_task_basic_info info;
+	mach_msg_type_number_t infoCount = MACH_TASK_BASIC_INFO_COUNT;
+	if ( task_info( mach_task_self( ), MACH_TASK_BASIC_INFO,
+		(task_info_t)&info, &infoCount ) != KERN_SUCCESS )
+		return (size_t)0L;		/* Can't access? */
+	return (size_t)info.resident_size;
+
+#elif defined(__linux__) || defined(__linux) || defined(linux) || defined(__gnu_linux__)
+	/* Linux ---------------------------------------------------- */
+	long rss = 0L;
+	FILE* fp = NULL;
+	if ( (fp = fopen( "/proc/self/statm", "r" )) == NULL )
+		return (size_t)0L;		/* Can't open? */
+	if ( fscanf( fp, "%*s%ld", &rss ) != 1 )
+	{
+		fclose( fp );
+		return (size_t)0L;		/* Can't read? */
+	}
+	fclose( fp );
+	return (size_t)rss * (size_t)sysconf( _SC_PAGESIZE);
+
+#else
+	/* AIX, BSD, Solaris, and Unknown OS ------------------------ */
+	return (size_t)0L;			/* Unsupported. */
+#endif
+}
+
+/**
+ * Returns the size of physical memory (RAM) in bytes.
+ */
+size_t getMemorySize( )
+{
+#if defined(_WIN32) && (defined(__CYGWIN__) || defined(__CYGWIN32__))
+	/* Cygwin under Windows. ------------------------------------ */
+	/* New 64-bit MEMORYSTATUSEX isn't available.  Use old 32.bit */
+	MEMORYSTATUS status;
+	status.dwLength = sizeof(status);
+	GlobalMemoryStatus( &status );
+	return (size_t)status.dwTotalPhys;
+
+#elif defined(_WIN32)
+	/* Windows. ------------------------------------------------- */
+	/* Use new 64-bit MEMORYSTATUSEX, not old 32-bit MEMORYSTATUS */
+	MEMORYSTATUSEX status;
+	status.dwLength = sizeof(status);
+	GlobalMemoryStatusEx( &status );
+	return (size_t)status.ullTotalPhys;
+
+#elif defined(__unix__) || defined(__unix) || defined(unix) || (defined(__APPLE__) && defined(__MACH__))
+	/* UNIX variants. ------------------------------------------- */
+	/* Prefer sysctl() over sysconf() except sysctl() HW_REALMEM and HW_PHYSMEM */
+
+#if defined(CTL_HW) && (defined(HW_MEMSIZE) || defined(HW_PHYSMEM64))
+	int mib[2];
+	mib[0] = CTL_HW;
+#if defined(HW_MEMSIZE)
+	mib[1] = HW_MEMSIZE;            /* OSX. --------------------- */
+#elif defined(HW_PHYSMEM64)
+	mib[1] = HW_PHYSMEM64;          /* NetBSD, OpenBSD. --------- */
+#endif
+	int64_t size = 0;               /* 64-bit */
+	size_t len = sizeof( size );
+	if ( sysctl( mib, 2, &size, &len, NULL, 0 ) == 0 )
+		return (size_t)size;
+	return 0L;			/* Failed? */
+
+#elif defined(_SC_AIX_REALMEM)
+	/* AIX. ----------------------------------------------------- */
+	return (size_t)sysconf( _SC_AIX_REALMEM ) * (size_t)1024L;
+
+#elif defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE)
+	/* FreeBSD, Linux, OpenBSD, and Solaris. -------------------- */
+	return (size_t)sysconf( _SC_PHYS_PAGES ) *
+		(size_t)sysconf( _SC_PAGESIZE );
+
+#elif defined(_SC_PHYS_PAGES) && defined(_SC_PAGE_SIZE)
+	/* Legacy. -------------------------------------------------- */
+	return (size_t)sysconf( _SC_PHYS_PAGES ) *
+		(size_t)sysconf( _SC_PAGE_SIZE );
+
+#elif defined(CTL_HW) && (defined(HW_PHYSMEM) || defined(HW_REALMEM))
+	/* DragonFly BSD, FreeBSD, NetBSD, OpenBSD, and OSX. -------- */
+	int mib[2];
+	mib[0] = CTL_HW;
+#if defined(HW_REALMEM)
+	mib[1] = HW_REALMEM;		/* FreeBSD. ----------------- */
+#elif defined(HW_PYSMEM)
+	mib[1] = HW_PHYSMEM;		/* Others. ------------------ */
+#endif
+	unsigned int size = 0;		/* 32-bit */
+	size_t len = sizeof( size );
+	if ( sysctl( mib, 2, &size, &len, NULL, 0 ) == 0 )
+		return (size_t)size;
+	return 0L;			/* Failed? */
+#endif /* sysctl and sysconf variants */
+
+#else
+	return 0L;			/* Unknown OS. */
+#endif
+}
+
+using namespace LinBox;
+using namespace std;
+
+template<typename Field, typename Mat>
+string check_sigma(const Field& F, const Mat& sigma,  Mat& serie, size_t ord){
+	Mat T(F,sigma.rowdim(),serie.coldim(),sigma.size()+serie.size()-1);
+	PolynomialMatrixMulDomain<Field> PMD(F);
+	PMD.mul(T,sigma,serie);
+	MatrixDomain<Field> MD(F);
+	size_t i=0;
+	string msg(".....");
+	bool nul_sigma=true;
+	while(i<ord && MD.isZero(T[i])){
+		if (!MD.isZero(sigma[i])) nul_sigma=false;		
+		i++;
+	}
+	if (i<ord){
+		cout<<"error at degree="<<i<<endl;
+		T[i].write(std::cout, Tag::FileFormat::Plain);
+		cout<<"***"<<endl;
+		cout<<serie<<endl;
+		cout<<sigma<<endl;	
+	}
+	
+	
+	if (i==ord && !nul_sigma)
+		msg+="done";
+	else
+		msg+="error";
+	return msg;
+}
+
+template<typename MatPol>
+bool operator==(const MatPol& A, const MatPol& B){
+	MatrixDomain<typename MatPol::Field> MD(A.field());
+	if (A.size()!=B.size()|| A.rowdim()!= B.rowdim() || A.coldim()!=B.coldim()){
+		cout<<A.size()<<"("<<A.rowdim()<<"x"<<A.coldim()<<") <> "
+		    <<B.size()<<"("<<B.rowdim()<<"x"<<B.coldim()<<") <> "<<endl;
+		return false;
+	}
+	size_t i=0;
+	while (i<A.size() && MD.areEqual(A[i],B[i]))
+		i++;
+
+	if (i<A.size() && A.rowdim()<10 && A.coldim()<10){
+		cout<<"first:"<<endl<<A<<endl;
+		cout<<"second:"<<endl<<B<<endl;
+	}
+
+	return i==A.size();
+}
+ 
+
+template<typename Field, typename RandIter>
+void bench_sigma(const Field& F,  RandIter& Gen, size_t m, size_t n, size_t d, string target) {
+	//typedef typename Field::Element Element;
+	//typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> MatrixP;
+	typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,Field> MatrixP;
+	
+	integer p;
+	F.characteristic(p);
+	size_t memp=length(p)+(p.bitsize()>=26?8:0);
+	size_t data_in=3*m*n*d*memp;
+	size_t data_out=2*m*m*(d+1)*memp;
+	size_t data_comp= 2*m*m*d*(length(uint64_t(m*d)*p*p)+(p.bitsize()>26?8:0));
+	std::cout<<"**************************"<<std::endl;
+	std::cout<<"mem(p)        : "<<memp<<std::endl;
+	std::cout<<"mem(p)        : "<<sizeof(p)<<std::endl;
+	std::cout<<"Projected Memory : "<< MB(data_in+data_out+data_comp)<<"Mo"<<std::endl;
+	std::cout<<"Available memory : "<<MB(getMemorySize())<<std::endl;
+	std::cout<<"**************************"<<std::endl;
+	std::cout<<"**************************"<<std::endl<<std::endl<<std::endl;
+	std::cout<<"[begin ] : "<<MEMINFO<<std::endl; 
+
+	
+	MatrixP Serie(F, m, n, d);	
+	std::cout<<"[initial sequence] : "<<MB(m*n*d*memp)<<"Mo"<<MEMINFO<<std::endl;
+	std::cout<<"--> " <<MB(Serie.realmeminfo())<<std::endl;
+	std::cout<<"--> " <<MB(Serie.meminfo())<<" "<<std::endl;
+	// set the Serie at random
+	for (size_t k=0;k<d;++k)
+		for (size_t i=0;i<m;++i)
+			for (size_t j=0;j<n;++j)
+				Gen.random(Serie.ref(i,j,k));
+	std::cout<<"[initial sequence] : "<<MB(m*n*d*memp)<<"Mo"<<MEMINFO<<std::endl;
+	
+	MatrixP Sigma2(F, m, m, d+1);
+	std::cout<<"[output sigma    ] : "<<MB(m*m*(d+1)*memp)<<"Mo"<<MEMINFO<<std::endl;
+	std::cout<<"--> " <<MB(Sigma2.meminfo())<<std::endl;
+	std::cout<<"--> " <<MB(Sigma2.realmeminfo())<<std::endl;
+		
+	// define the shift
+	vector<size_t> shift(m,0);
+
+	OrderBasis<Field> SB(F);
+	Timer chrono;
+#ifdef BENCH_MBASIS
+	if (target=="ALL"){
+		MatrixP Sigma1(F, m, m, d+1);
+		vector<size_t> shift2(m,0);
+		chrono.start();
+		SB.M_Basis(Sigma1, Serie, d, shift2);
+		chrono.stop();
+		std::cout << "M-Basis       : " <<chrono.usertime()<<" s"<<std::endl;
+	}
+#endif
+	chrono.clear();		
+	chrono.start();
+	SB.PM_Basis(Sigma2, Serie, d, shift);
+	chrono.stop();
+	std::cout << "PM-Basis      : " <<chrono.usertime()<<" s"<<std::endl;
+	chrono.clear();
+
+	// MatrixP Sigma3(F, m, m, d+1);
+	//vector<size_t> shift3(m,0);
+	// chrono.start();
+	// SB.oPM_Basis(Sigma3, Serie, d, shift3);
+	// chrono.stop();
+	// std::cout << "PM-Basis iter : " <<chrono.usertime()<<" s"<<std::endl;
+	std::cout<<endl;
+	std::cout<<"[end] :  "<<MEMINFO<<std::endl;
+}
+
+int main(int argc, char** argv){
+
+	// std::cout<<"Real memory usage: "<<MEMINFO<<std::endl;
+	// const size_t N=32<<20;
+	// double * T= new double[N];
+	// std::cout<<"allocating :"<<((N*sizeof(double))>>20)<<"Mo"<<std::endl;
+	// T[0]=1;
+	// for (size_t i=1;i<N;i++)
+	// 	T[i]=T[i-1];
+	// std::cout<<"Real memory usage: "<<MEMINFO<<std::endl;
+	// delete[] T;
+	// std::cout<<"Real memory usage: "<<MEMINFO<<std::endl;
+	
+	
+	static size_t  m = 64; // matrix dimension
+	static size_t  n = 32; // matrix dimension
+	static size_t  b = 20; // entries bitsize
+	static size_t  d = 32;  // matrix degree
+	static long    seed = time(NULL);
+	static string target="BEST";
+
+	static Argument args[] = {
+		{ 'm', "-m M", "Set row dimension of matrix series to M.", TYPE_INT,     &m },
+		{ 'n', "-n N", "Set column dimension of matrix series to N.", TYPE_INT,     &n },
+		{ 'd', "-d D", "Set degree of  matrix series to D.", TYPE_INT,     &d },
+		{ 'b', "-b B", "Set bitsize of the matrix entries", TYPE_INT, &b },
+		{ 's', "-s s", "Set the random seed to a specific value", TYPE_INT, &seed},
+		{ 't', "-t T", "Set the targeted benchmark {ALL, BEST}.",            TYPE_STR , &target },
+		END_OF_ARGUMENTS
+	};
+
+	parseArguments (argc, argv, args);
+	
+	typedef Givaro::Modular<double>              SmallField;	
+	typedef Givaro::Modular<Givaro::Integer>      LargeField;
+
+	size_t logd=integer((uint64_t)d).bitsize();	
+	
+	std::cout<<"###  matrix series is of size "<<m<<" x "<<n<<" of degree "<<d<<std::endl;
+	if (b < 26){
+		if (logd>b-4){
+			std::cout<<"degree is to large for field bitsize: "<<b<<std::endl;
+			exit(0);
+		}
+		RandomFFTPrime Rd(1<<b,seed);	
+		integer p = Rd.randomPrime(logd+1);
+		std::cout<<"# starting sigma basis computation over Fp[x] with p="<<p<<endl;;		
+		SmallField F(p);
+		typename SmallField::RandIter G(F,0,seed);
+		bench_sigma(F,G,m,n,d,target);
+	}
+	else {
+		RandomPrimeIterator Rd(b,seed);	
+		integer p = Rd.randomPrime();
+		std::cout<<"# starting sigma basis computation over Fp[x] with p="<<p<<endl;;		
+		LargeField F(p);
+		typename LargeField::RandIter G(F,0,seed);
+
+		
+		bench_sigma(F,G,m,n,d,target);
+	}
+	
+	
+	return 0;
+}
+
diff --git a/benchmarks/benchmark-utils.C b/benchmarks/benchmark-utils.C
new file mode 100644
index 0000000..beae238
--- /dev/null
+++ b/benchmarks/benchmark-utils.C
@@ -0,0 +1,354 @@
+/* Copyright (C) 2013 LinBox
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*!@internal
+ * @file   benchmarks/benchmark-utils.C
+ * @ingroup benchmarks
+ * @brief   utils
+  */
+
+#ifndef __LINBOX_benchmarks_benchmark_utils_C
+#define __LINBOX_benchmarks_benchmark_utils_C
+
+#include "linbox/linbox-config.h"
+#include "benchmark-utils.h"
+
+//
+// Terminal progression
+//
+
+namespace LinBox {
+
+	void showAdvanceLinear(size_t curr, size_t min, size_t max)
+	{
+		std::cout << std::setprecision(4) << "\033[2K" << "\033[30D" << min <<std::flush;
+		std::cout << '<' << curr << '<' << max << " (" << std::flush;
+		std::cout << double(curr-min)/double(max-min)*100 << "%)" << std::flush;
+	}
+
+	void showFinish(size_t curr, size_t all)
+	{
+		std::cout <<  "\033[2K" << "\033[30D" << "finished : " << curr << std::flush;
+		std::cout << '/' << all-1 << std::flush << std::endl;
+	}
+
+	void showSkip(size_t curr, size_t all)
+	{
+		std::cout <<  "\033[2K" << "\033[30D" << "skipped : " << curr << std::flush;
+		std::cout << '/' << all-1 << std::flush << std::endl;
+	}
+
+	showProgression::showProgression (size_t tot) :
+		_cur_(0)
+		,_tot_(tot)
+	{}
+
+	//! show an inter has finished
+	void showProgression::FinishIter()
+	{
+		++_cur_ ;
+		showFinish(_cur_,_tot_);
+	}
+
+	//! show an inter has been skipped.
+	void showProgression::SkipIter()
+	{
+		++_cur_ ;
+		showSkip(_cur_,_tot_);
+	}
+
+
+} // LinBox
+
+//
+// MFLOPS helper
+//
+
+namespace LinBox {
+
+	double computeMFLOPS(const double & tim, const double mflo, const size_t rpt)
+	{
+		linbox_check(rpt);
+		// linbox_check(tim != 0.);
+		if (tim == 0.) return NAN ;
+		return (double) ((mflo*(double)rpt)/tim);
+	}
+
+	dvector_t &
+	insertTime(dvector_t & tim3, const double & tps)
+	{
+		linbox_check(tim3.size() == 3);
+		if (tim3[0] > tps) {
+			tim3[2] = tim3[1] ;
+			tim3[1] = tim3[0] ;
+			tim3[0] = tps ;
+		}
+		else if (tim3[1] > tps) {
+			tim3[2] = tim3[1] ;
+			tim3[1] = tps ;
+		}
+		else if (tim3[2] > tps) {
+			tim3[2] = tps ;
+		}
+		return tim3 ;
+	}
+
+	double computeMFLOPS(const dvector_t & tim, const double mflo, Tag::TimeSelect ts )
+	{
+		linbox_check(tim.size());
+		switch (ts) {
+		case (Tag::TimeSelect::average) :
+			{
+				double tps = 0 ;
+				for (size_t i = 0 ; i < tim.size() ; ++i)
+					tps += tim[i] ;
+				return computeMFLOPS(tps,mflo,(size_t)tim.size());
+			}
+		case (Tag::TimeSelect::bestThree) :
+			{
+				if (tim.size() <4)
+					return computeMFLOPS(tim,mflo,Tag::TimeSelect::average);
+
+				dvector_t tps (3);
+				double t1,t2 ;
+				if (tim[0]<tim[1]) {
+					t1 = tim[0];
+					t2 = tim[1];
+				}
+				else {
+					t1 = tim[1];
+					t2 = tim[0];
+				}
+				if (tim[3] < t1) {
+					tps[0] = tim[3] ;
+					tps[1] = t1 ;
+					tps[2] = t2 ;
+				}
+				else if (tim[2] < t1) {
+					tps[0] = t1 ;
+					tps[1] = tim[3] ;
+					tps[2] = t2 ;
+				}
+				else {
+					tps[0] = t1 ;
+					tps[1] = t2;
+					tps[2] = tim[3] ;
+				}
+
+				for (size_t i = 3 ; i < tim.size() ; ++i)
+					insertTime(tps,tim[i]);
+
+				return computeMFLOPS(tim,mflo,Tag::TimeSelect::average);
+
+			}
+		case (Tag::TimeSelect::bestOne) :
+			{
+				double t1 = tim[0] ;
+				for (size_t i = 1 ; i < tim.size() ; ++i)
+					if (tim[i] < t1)
+						t1 = tim[i] ;
+				return computeMFLOPS(t1,mflo,1);
+
+			}
+		case (Tag::TimeSelect::median) :
+			{
+				if (tim.size() == 1)
+					return computeMFLOPS(tim[0],mflo,1) ;
+
+				dvector_t tps (tim);
+				std::sort(tps.begin(),tps.end());
+				size_t mid = (size_t)tps.size()/2 ;
+				double t1 ;
+				if (isOdd((uint64_t)tps.size()))
+					t1 = tps[mid] ;
+				else
+					t1 = (tps[mid-1]+tps[mid])/2;
+				return computeMFLOPS(t1,mflo,1);
+			}
+		case (Tag::TimeSelect::medmean) :
+			{
+				if (tim.size() < 3)
+					return computeMFLOPS(tim,mflo,Tag::TimeSelect::median); ;
+
+				size_t q1 = (size_t)((double)tim.size()/(double)4) ;
+				size_t q3 = (size_t)tim.size()-q1 ;
+				dvector_t tps (tim);
+				std::sort(tps.begin(),tps.end());
+				dvector_t tps2 (tim.begin()+q1,tim.begin()+q3);
+				return computeMFLOPS(tps2,mflo,Tag::TimeSelect::average);
+			}
+
+		default :
+			{
+				throw("not among tags");
+			}
+
+		} // switch(ts)
+	}
+
+}
+
+//
+// String processing
+//
+
+namespace LinBox {
+
+	bool isDigit (const std::string & s)
+	{
+		std::istringstream ss(s);
+		double d = 0.0;
+		ss >> d ; // try to read.
+		ss >> std::ws;  // suppress whitespace
+
+		return (!ss.fail() && ss.eof()) ;
+	}
+
+	bool fortifiedString(const std::string & s)
+	{
+		if (isDigit(s))
+			return true ;
+		linbox_check(!s.empty());
+		return s.front() == '\"' && s.back() ==  '\"' ;
+	}
+
+	std::string unfortifyString(const std::string &s)
+	{
+		std::string t = s ;
+		if (fortifiedString(s)) {
+			t.erase(t.begin());
+			t.pop_back();
+		}
+		return t;
+	}
+
+	std::string fortifyString(const std::string & s)
+	{
+		if (fortifiedString(s))
+			return s ;
+		string r = "\"" ;
+		return r + s + "\"";
+	}
+
+	char randomAlNum()
+	{
+		int c = rand()%62 ;
+		c += 48 ; // c entre 48 et 109
+		if (c < 58) {
+			return (char) c;
+		}
+		else {
+			c += 7 ;
+			if (c < 91) {
+				return (char)c ;
+			}
+			else {
+				c += 6 ;
+				return (char)c;
+			}
+		}
+
+	}
+
+
+	std::string randomAlNum(const size_t & m)
+	{
+		std::string r = "" ;
+		for (size_t i = 0 ; i < m ; ++i)
+			r += randomAlNum();
+		return r ;
+	}
+
+}// LinBox
+
+//
+// Machine information
+//
+
+namespace LinBox {
+
+	//! get ISO time and date
+	std::string getDateTime(const std::string & sep)
+	{
+		std::time_t rawtime;
+		std::tm* timeinfo;
+		char buffer [80];
+
+		std::time(&rawtime);
+		timeinfo = std::gmtime(&rawtime);
+
+		std::string fmt ;
+		std::string date = "%Y-%m-%d" ;
+		std::string time = "%H:%M:%S" ;
+		std::string tz   = "GMT" ;
+
+		fmt = date + sep + time + sep + tz ;
+
+		std::strftime(buffer,80,fmt.c_str(),timeinfo);
+
+		std::string mytime(buffer);
+
+		return mytime;
+	}
+
+	//! get some machine information (not cpu yet)
+	smatrix_t getMachineInformation()
+	{
+		smatrix_t Machine(2);
+		Machine[0].resize(5);
+		Machine[1].resize(5);
+		struct utsname unameData;
+		uname(&unameData);
+		Machine[0][0] = "sysname";
+		Machine[1][0] = unameData.sysname;
+		Machine[0][1] = "nodename";
+		Machine[1][1] = unameData.nodename;
+		Machine[0][2] = "release";
+		Machine[1][2] = unameData.release;
+		Machine[0][3] = "version";
+		Machine[1][3] = unameData.version;
+		Machine[0][4] = "machine";
+		Machine[1][4] = unameData.machine;
+		// Machine[0][5] = "RAM (kb)";
+		// system("cat /proc/meminfo  | grep MemTotal | awk '{print $2}'");
+		// Machine[0][6] = "CPU name";
+		// system("/proc/cpuinfo  | grep 'model name' | awk '{$1=$2=$3=""; print $0}'");
+		// Machine[0][7] = "CPU nb";
+		// system("/proc/cpuinfo  | grep 'model name' | wc -l");
+		// Machine[0][8] = "CPU Ghz";
+		// cpuid ?
+		return Machine ;
+	}
+
+}
+
+#endif // __LINBOX_benchmarks_benchmark_utils_C
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/benchmark-utils.h b/benchmarks/benchmark-utils.h
new file mode 100644
index 0000000..c43db9c
--- /dev/null
+++ b/benchmarks/benchmark-utils.h
@@ -0,0 +1,307 @@
+/* Copyright (C) 2013 LinBox
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file   benchmarks/benchmark-utils.h
+ * @ingroup benchmarks
+ * @brief   utils
+  */
+
+#ifndef __LINBOX_benchmarks_benchmark_utils_H
+#define __LINBOX_benchmarks_benchmark_utils_H
+
+
+/* ********************** */
+/*        Tags            */
+/* ********************** */
+
+// Tags (cf linbox/linbox-tags.h )
+namespace LinBox { namespace Tag {
+
+	//! selection of best times in a series.
+#if HAVE_CXX11
+	enum struct TimeSelect : int32_t
+#else
+				 enum TimeSelect 
+#endif
+					 {
+						 average   = 1, //!< select the average
+						 bestThree = 2, //!< select the average among the three best (supposes order is <)
+						 bestOne   = 3, //!< select the best one (supposes order is <)
+						 median    = 4, //!< median
+						 medmean   = 5  //!< interquartile mean (remove 25% extremes and average the rest)
+					 };
+
+	//! selection of printers
+#if HAVE_CXX11
+	enum struct Printer : int32_t
+#else
+			      enum Printer 
+#endif
+				      {
+					      dat       = 1, //!< print data  raw (format chosen by implementation)
+					      tex       = 2, //!< print latex useable
+					      xml       = 3, //!< print using xml syntax
+					      gnuplot   = 4, //!< print using gnuplot
+					      csv       = 5, //!< coma separated values
+					      html      = 6  //!< coma separated values
+				      };
+
+	} // Tag
+} // LinBox
+
+/* ********************** */
+/*        Outils          */
+/* ********************** */
+
+//
+// typedefs data formats
+//
+
+namespace LinBox {
+
+	//! vector of double
+	typedef std::vector<double>       dvector_t;
+	typedef std::vector<std::string>  svector_t;
+
+	//! matrix of double
+	typedef std::vector<dvector_t>    dmatrix_t;
+	typedef std::vector<svector_t>    smatrix_t;
+
+} // LinBox
+
+//
+// String processing
+//
+
+namespace LinBox {
+
+	/** Check if a string is actually a double.
+	 * @param s string to check
+	 * @return true/false
+	 */
+	bool isDigit (const std::string & s);
+
+	/** Tells is a string has double quotes around.
+	 * @param s string to test
+	 * @return true if s[0] == s[last] == '"'
+	 */
+	bool fortifiedString(const std::string & s);
+
+	/** removes the surrounding quotes.
+	 * @param s removes quotes around if necessary
+	 * @return s without surrounding double quotes if necessary
+	 */
+	std::string unfortifyString(const std::string &s);
+
+	/** adds surrounding quotes.
+	 * @param s add quotes around if necessary
+	 * @return s with surrounding double quotes if necessary
+	 */
+	std::string fortifyString(const std::string & s);
+
+	/** Converts anything to a string
+	 * @param nam to be put in a string.
+	 */
+	template<class T>
+	std::string toString(T & nam)
+	{
+		std::ostringstream nam_ss ;
+		nam_ss << nam ;
+		return nam_ss.str();
+	}
+
+	//! finds keyword betwen begin and end, return true if found and i is the index where it is (possibly correspondig to end)
+	bool findKeyword(size_t & i, const svector_t::const_iterator & begin, const svector_t::const_iterator & end, const std::string & keyword)
+		{
+			svector_t::const_iterator it ;
+			it = std::find(begin, end, keyword);
+			i = (size_t)std::distance(begin, it);
+			return (it != end) ;
+
+		}
+
+	/*! @internal
+	 * @brief random <code>:alnum:</code> \c char.
+	 * [[:alnum:]] characters are in range
+	 *  - num : 48-57
+	 *  - AL  : 67-90
+	 *  - al  : 97-122
+	 *  .
+	 * @return a random alphabetic or numeric char.
+	 */
+	char randomAlNum() ;
+
+	/*! @internal
+	 * @brief random <code>:alnum:</code> \c string.
+	 * @param m size of string
+	 * [[:alnum:]] characters are in range
+	 *  - num : 48-57
+	 *  - AL  : 67-90
+	 *  - al  : 97-122
+	 *  .
+	 * @return a random alphabetic or numeric char.
+	 */
+	std::string randomAlNum(const size_t & m) ;
+}// LinBox
+
+//
+// Machine info
+//
+
+namespace LinBox {
+
+	/*! get ISO time and date
+	 * year-time YYYY-MM-DD 'sep' HH:MM:SS 'sep' (GMT)
+	 * @param sep separation between
+	 */
+	std::string getDateTime( const std::string & sep = " ");
+
+	//! get some machine information (not cpu yet)
+	smatrix_t getMachineInformation();
+
+} // LinBox
+
+//
+// advancement printing on terminal
+//
+
+namespace LinBox {
+
+	/*! show the advancement (on the terminal)
+	 * suppose linear advancement
+	 * @param curr current iteration
+	 * @param min starting iteration
+	 * @param max terminal iteration
+	 */
+	void showAdvanceLinear(size_t curr, size_t min, size_t max);
+
+	/*! tells the current series of measure has completed (on the terminal)
+	 * @param curr current iteration
+	 * @param all number of iterations
+	 */
+	void showFinish(size_t curr, size_t all);
+
+	/*! tells the current series of measure was skipped (on the terminal)
+	 * @param curr current iteration
+	 * @param all number of iterations
+	 */
+	void showSkip(size_t curr, size_t all);
+
+	//! Show progression on the terminal (helper)
+	class showProgression {
+	private :
+		size_t _cur_ ; //!< current iter
+		size_t _tot_ ; //!< max iter
+	public :
+		//! constructor
+		showProgression (size_t tot) ;
+
+		//! show an inter has finished
+		void FinishIter();
+
+		//! show an inter has been skipped.
+		void SkipIter();
+	}; // showProgression
+} // LinBox
+
+//
+// computing megaflops from time (series)/number ops
+//
+
+namespace LinBox {
+
+	/**
+	 * @brief computes the number of megaflops.
+	 * @param tim timer (seconds)
+	 * @param mflo number of operations (1e6 operations)
+	 * @param rpt number of experiences
+	 * @return mflo/(tim*rpt)
+	 */
+	double computeMFLOPS(const double & tim, const double mflo, const size_t rpt = 1);
+
+	/*! @internal @brief inserts a time in a vector of 3 best times.
+	 * @param tim3 ordered form min to max vector of 3 best times
+	 * @param tps inserts that time in \p tim3 if better.
+	 * @return a reference to \p tim3
+	 */
+	dvector_t &
+	insertTime(dvector_t & tim3, const double & tps);
+
+	/**
+	 * @brief computes the number of megaflops.
+	 * @param tim timer (seconds)
+	 * @param mflo number of operations (1e6 operations)
+	 * @param ts number of experiences to select. @see TimeSelect. Default to the best three
+	 * @return mflo/(tim*rpt)
+	 */
+	double computeMFLOPS(const dvector_t & tim, const double mflo, Tag::TimeSelect ts = Tag::TimeSelect::bestThree);
+
+}
+
+//
+// Chrono
+// warning : implem in benchmark.inl
+//
+
+namespace LinBox {
+	template<class MyTimer>
+	class Chrono  {
+	private :
+		MyTimer   _chrono_ ;
+		dvector_t _times_  ;
+		double    _total_  ;
+	public:
+		Chrono()  ;
+
+		~Chrono()  ;
+
+		void clear();
+
+		void start();
+
+		void stop();
+
+		double time() const;
+
+		dvector_t times() const;
+
+
+
+	}; // Chrono
+} // LinBox
+
+
+#ifdef LinBoxSrcOnly
+#include "benchmarks/benchmark-utils.C"
+#endif
+
+#endif // __LINBOX_benchmarks_benchmark_utils_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/benchmark.C b/benchmarks/benchmark.C
new file mode 100644
index 0000000..cb3003d
--- /dev/null
+++ b/benchmarks/benchmark.C
@@ -0,0 +1,1597 @@
+/* Copyright (C) 2013 LinBox
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*!@internal
+ * @file   benchmarks/benchmark.C
+ * @ingroup benchmarks
+ * @brief   utils
+  */
+
+#ifndef __LINBOX_benchmarks_benchmark_C
+#define __LINBOX_benchmarks_benchmark_C
+
+#include "linbox/linbox-config.h"
+
+#include "benchmark.h"
+
+//
+// PlotData
+//
+
+namespace LinBox {
+#ifdef __LINBOX_HAVE_TINYXML2
+	tinyxml2::XMLElement * PlotData::saveData(tinyxml2::XMLDocument & doc)
+	{
+		using namespace tinyxml2;
+		XMLElement * data = doc.NewElement( "data" );
+
+		selectFirstSeries();
+		for (size_t i = 0 ; i < size() ; ++i  ) {
+
+			XMLElement * series = doc.NewElement ( "series" );
+			series->SetAttribute("name",unfortifyString(getCurrentSeriesName()).c_str());
+
+			for (size_t j = 0 ;  j < getCurrentSeriesSize() ; ++j)
+			{
+				XMLElement * point = doc.NewElement ( "point" );
+				point->SetAttribute("x",unfortifyString(getCurrentSeriesEntry(j,Point::Labels() )).c_str());
+				point->SetAttribute("y",getCurrentSeriesEntry(j,Point::Values() ));
+				point->SetAttribute("time",getCurrentSeriesEntry(j,Point::Times() ));
+				point->SetAttribute("xval",getCurrentSeriesEntry(j,Point::Points() ));
+				point->SetAttribute("id",getCurrentSeriesId(j).c_str());
+
+				series->InsertEndChild( point );
+			}
+
+			data->InsertEndChild( series );
+
+			selectNextSeries();
+		}
+
+		return data ;
+	}
+#endif
+
+
+	PlotData::PlotData() :
+		_tableau_      (0)
+		,_series_label_ (0)
+		,_curr_series_  ( )
+		,_time_watch_  ( )
+	{
+	}
+
+	PlotData::~PlotData() {}
+
+	PlotData::PlotData(const PlotData & PD):
+		_tableau_(PD.getTable())
+		,_series_label_(PD.getSeriesLabels())
+		,_curr_series_(PD.getCurrentSeriesNumber())
+		,_time_watch_  (_tableau_[_curr_series_].Points,_tableau_[_curr_series_].Times)
+	{
+	}
+
+	size_t PlotData::selectIndex(const std::string & nom)
+	{
+
+		std::string nomf = fortifyString(nom);
+		size_t j ;
+		bool ok = findKeyword(j,_series_label_.begin() , _series_label_.end() , nomf);
+
+
+		if ( ! ok ) {
+			linbox_check(j ==(size_t)_series_label_.size() );
+			_series_label_.push_back(fortifyString(nom));
+			_tableau_.resize(j+1);
+		}
+
+		initWatch(j);
+
+		return j ;
+	}
+
+	size_t PlotData::getIndex(const std::string & nom) const
+	{
+
+		std::string nomf = fortifyString(nom);
+		size_t j ;
+#ifdef NDEBUG 
+                findKeyword(j,_series_label_.begin() , _series_label_.end() , nomf);
+#else 
+		bool ok = findKeyword(j,_series_label_.begin() , _series_label_.end() , nomf);
+		linbox_check(ok);
+#endif
+
+		return j ;
+	}
+
+	void PlotData::clear()
+	{
+		_tableau_.resize(0);
+		_series_label_.resize(0);
+		_curr_series_ =  0;
+		_time_watch_.clear();
+	}
+
+	void PlotData::merge(const PlotData &PD)
+	{
+		for (size_t i = 0 ; i < (size_t)PD.size() ; ++i) {
+			_tableau_.push_back(PD.getSeries(i));
+			_series_label_.push_back(fortifyString(PD.getSeriesName(i)));
+		}
+		return ;
+	}
+
+	size_t PlotData::size() const
+	{
+		linbox_check(_tableau_.size() == _series_label_.size());
+		return (size_t)_tableau_.size() ;
+	}
+
+	size_t PlotData::getCurrentSeriesNumber() const
+	{
+		return _curr_series_ ;
+	}
+
+	void PlotData::setSeriesName(const size_t & i, const std::string & nom)
+	{
+		linbox_check(i<size());
+		_series_label_[i] = fortifyString(nom) ;
+	}
+
+	const std::string & PlotData::getSeriesName(const size_t & i) const
+	{
+		linbox_check(i<size());
+		return _series_label_[i] ;
+	}
+
+	const std::string & PlotData::getCurrentSeriesName() const
+	{
+		return getSeriesName(_curr_series_) ;
+	}
+
+	void PlotData::setCurrentSeriesName(const std::string & nom)
+	{
+		return setSeriesName(_curr_series_,nom);
+	}
+
+	void PlotData::initWatch ( const size_t & i)
+	{
+		linbox_check(i < size());
+		_curr_series_ = i ;
+		_time_watch_.init(_tableau_[i].Points,_tableau_[i].Times);
+	}
+
+	void PlotData::initCurrentSeriesWatch ()
+	{
+		initWatch(_curr_series_);
+	}
+
+	void PlotData::newSeries(const std::string & nom )
+	{
+
+		size_t old_size = size() ;
+		_curr_series_ = old_size ;
+
+		_tableau_.resize(old_size+1);
+		_series_label_.resize(old_size+1);
+
+		if (nom.empty()) {
+			std::ostringstream emptytitle ;
+			emptytitle << "series." << _curr_series_ ;
+			setCurrentSeriesName(emptytitle.str());
+		}
+		else
+			setCurrentSeriesName(nom);
+
+		initCurrentSeriesWatch();
+
+		return;
+	}
+
+	void PlotData::finishSeries()
+	{
+	}
+
+	const DataSeries & PlotData::getSeries(const size_t  &i) const
+	{
+		linbox_check(i < size());
+		return _tableau_[i] ;
+	}
+
+	const DataSeries & PlotData::selectSeries(const size_t  &i)
+	{
+		initWatch(i);
+		return getSeries(i) ;
+	}
+
+	const DataSeries & PlotData::selectSeries(const std::string & name)
+	{
+		return selectSeries(selectIndex(name));
+	}
+
+	DataSeries & PlotData::refSeries(const size_t  &i)
+	{
+		linbox_check(i < size());
+		return _tableau_[i] ;
+	}
+
+	DataSeries & PlotData::refSeries(const std::string &nom)
+	{
+		return refSeries(getIndex(nom));
+	}
+
+	const DataSeries & PlotData::getCurrentSeries() const
+	{
+		return getSeries(_curr_series_);
+	}
+
+	DataSeries & PlotData::refCurrentSeries()
+	{
+		return refSeries(_curr_series_);
+	}
+
+	size_t PlotData::getSeriesSize(const size_t & i) const
+	{
+		return getSeries(i).size();
+	}
+
+	size_t PlotData::getCurrentSeriesSize() const
+	{
+		return getSeries(_curr_series_).size();
+	}
+
+
+	void PlotData::selectFirstSeries()
+	{
+		selectSeries(0);
+
+		return;
+	}
+
+	bool PlotData::selectNextSeries()
+	{
+		linbox_check(_curr_series_ < size());
+		++_curr_series_ ;
+		if (_curr_series_ < size()) {
+			selectSeries(_curr_series_);
+			return true;
+		}
+		return false;
+	}
+
+	void PlotData::setCurrentSeriesPointLabel(const size_t & j, const std::string & nom)
+	{
+		return setSeriesPointLabel(_curr_series_,j,nom);
+	}
+
+
+	std::string  PlotData::getSeriesLabel(const size_t & i) const
+	{
+		linbox_check(i<size());
+		linbox_check(i<_series_label_.size() );
+		linbox_check(! _series_label_[i].empty()) ;
+
+		return(_series_label_[i]);
+	}
+
+	const svector_t &  PlotData::getSeriesLabels() const
+	{
+		return _series_label_ ;
+	}
+
+
+	void PlotData::setSeriesEntry(const size_t &i, const std::string & nam, const double & val
+				      , const double & xval , const double & yval)
+	{
+		refSeries(i).push_back(fortifyString(nam),val,xval,yval);
+		initWatch(i); //  in case series has changed
+		return ;
+	}
+
+	void PlotData::setSeriesEntry(const std::string & nom, const std::string & nam, const double & val
+				, const double & xval, const double & yval)
+	{
+		selectSeries(nom);
+		return setCurrentSeriesEntry(nam,val,xval,yval);
+	}
+
+	const std::vector<DataSeries > & PlotData::getTable() const
+	{
+		return _tableau_ ;
+	}
+
+	std::vector<DataSeries > & PlotData::refTable()
+	{
+		return _tableau_ ;
+	}
+
+	bool PlotData::keepon(size_t & repet, double tim, bool usePrediction)
+	{
+		return _time_watch_.keepon(repet,tim, usePrediction);
+	}
+
+	void PlotData::load( const std::string & filename)
+	{
+#ifdef __LINBOX_HAVE_TINYXML2
+		using namespace tinyxml2;
+		XMLDocument doc;
+		doc.LoadFile( filename.c_str() );
+		// std::cout << "loaded " << filename << std::endl;
+		linbox_check(!doc.ErrorID());
+
+		XMLElement * bench = doc.FirstChildElement( "benchmark");
+		linbox_check(bench);
+		XMLElement* data = bench -> FirstChildElement( "data" ) ;
+		linbox_check(data);
+		XMLElement* series = data -> FirstChildElement( "series" ) ;
+
+		clear();
+
+		while (series)
+		{
+			newSeries( series->Attribute( "name" ) );
+			XMLElement * points = series->FirstChildElement() ;
+			while (points) {
+				std::string x = points->Attribute( "x" );
+				double      y = points->DoubleAttribute( "y" );
+				double      time = points->DoubleAttribute( "time" );
+				double      xval = points->DoubleAttribute( "xval" );
+				// std::string id   = points->Attribute( "id" );
+
+				setCurrentSeriesEntry(x,y,xval,time);
+
+				// setCurrentSeriesEntryId(id);
+
+				points = points->NextSiblingElement();
+			}
+
+			series = series->NextSiblingElement();
+		}
+#else
+		throw LinBoxError("You need tinyxml2 for loading data");
+#endif
+		// save("toto.xml");
+
+	}
+
+	void PlotData::save( const std::string & filename
+			     , const std::string & title
+			     , const std::string & xtitle
+			     , const std::string & ytitle )
+	{
+#ifdef __LINBOX_HAVE_TINYXML2
+		using namespace tinyxml2;
+		XMLDocument doc;
+
+		doc.InsertEndChild(doc.NewDeclaration());
+
+		XMLElement * benchmark = doc.NewElement( "benchmark" );
+		doc.InsertEndChild(benchmark);
+
+		{ // Benchmark Metadata
+			XMLElement * metadata = doc.NewElement( "metadata" );
+
+			smatrix_t uname = getMachineInformation();
+
+			for (size_t i = 0 ; i < uname[0].size() ; ++i) {
+				metadata->SetAttribute(uname[0][i].c_str(),uname[1][i].c_str());
+			}
+
+			std::string myTime = getDateTime();
+
+			metadata->SetAttribute("time",myTime.c_str());
+
+			benchmark->InsertEndChild(metadata);
+		}
+
+		{ // Legende
+			XMLElement * legende = doc.NewElement( "legende" );
+
+			std::string mytitle = title;
+			if (title.empty())
+				mytitle =filename ;
+			legende->SetAttribute("title",unfortifyString(mytitle).c_str());
+			if (!xtitle.empty())
+				legende->SetAttribute("X",unfortifyString(xtitle).c_str());
+			if (!ytitle.empty())
+				legende->SetAttribute("Y",unfortifyString(ytitle).c_str());
+
+
+			benchmark->InsertEndChild(legende);
+		}
+
+
+		{ // series
+			XMLElement * data = saveData(doc);
+
+			benchmark->InsertEndChild(data);
+		}
+
+		{ // point metadata
+			XMLElement * metapoint = doc.NewElement( "PointMetaData" );
+			for (size_t i = 0 ; i < _meta_data_.MetaDataVec.size() ; ++i)
+			{
+				XMLElement * item = NULL ;
+				_meta_data_.MetaDataVec[i].writeMetaData(&item,doc);
+				std::string pts = "";
+				for (size_t j = 0 ; j < _meta_data_.MetaDataIDs[i].size(); ++j){
+					pts += _meta_data_.MetaDataIDs[i][j] ;
+					if (j+1 < _meta_data_.MetaDataIDs[i].size()  )
+						pts += ',';
+				}
+				item->SetAttribute("used_in",pts.c_str());
+				metapoint->InsertEndChild(item);
+			}
+
+			benchmark->InsertEndChild(metapoint);
+		}
+
+		doc.SaveFile(filename.c_str());
+
+		std::cout << "xml table saved in " << filename << std::endl;
+#else
+		std::cout << "tinyxml2 is not installed, could not save" << std::endl;
+#endif
+
+	}
+
+} // LinBox
+
+
+//
+// PlotStyle
+//
+
+namespace LinBox {
+
+
+	PlotStyle::PlotStyle() :
+		_term_(Term::eps),_plot_type_(Plot::histo),_line_type_(Line::histogram)
+	{
+
+	}
+
+	void PlotStyle::setTitle ( const std::string  &  titre
+				   , const std::string  & titre_y
+				   , const std::string  & titre_x)
+	{
+		_title_   = titre ;
+		_title_x_ = titre_x ;
+		_title_y_ = titre_y ;
+	}
+
+	std::string PlotStyle::getTitle() const
+	{
+		std::string title = "#title\nset title \""  + _title_ + '\"';
+		if (!_title_x_.empty())
+			title +="\nset xlabel \"" + _title_x_ +'\"' ;
+		if (!_title_y_.empty())
+			title +="\nset ylabel \"" + _title_y_ +'\"' ;
+		return title ;
+	}
+
+	std::string PlotStyle::getTitleX() const
+	{
+		return "\nset xlabel \"" + _title_x_ + '\"' ;
+	}
+
+	std::string PlotStyle::PlotStyle::getTitleY() const
+	{
+		return "\nset ylabel \"" + _title_y_ + '\"' ;
+	}
+
+	std::string PlotStyle::getRawTitle(int index) const
+	{
+		switch (index) {
+		case 0 :
+			return _title_ ;
+		case 1 :
+			return _title_x_ ;
+		case 2 :
+			return _title_y_ ;
+		default :
+			return "bad index" ;
+		}
+	}
+
+	void PlotStyle::setTerm( enum Term::Type term)
+	{
+		_term_ = term ;
+	}
+
+	std::string PlotStyle::getTerm() const
+	{
+		std::string term = "#term\nset term " ;
+		switch(_term_) {
+		case (Term::png) :
+			term += "png noenhanced" ;
+			break;
+		case (Term::pdf) :
+			std::cerr << "warning, pdf not really working for now" << std::endl;
+			term += "postscript eps noenhanced color" ;
+			break;
+		case (Term::eps) :
+			term += "postscript eps noenhanced color" ;
+			break;
+		case (Term::epstex) :
+			term += "epslatex color colortext" ;
+			break;
+
+		case (Term::svg) :
+			term += "svg" ;
+			break;
+		case (Term::other) :
+		default :
+			std::cerr  << " *** error ***" << std::endl << "No supported term set" << std::endl;
+			term += "unknown" ;
+		}
+		return term ;
+	}
+
+	std::string PlotStyle::getExt() const
+	{
+		switch(_term_) {
+		case (Term::png) :
+			return ".png" ;
+		case (Term::pdf) :
+#ifndef __LINBOX_HAVE_GHOSTSCRIPT
+			std::cerr << "warning, pdf not available. falling back to eps" << std::endl;
+#endif
+			return ".pdf" ;
+		case (Term::eps) :
+			return ".eps" ;
+		case (Term::epstex) :
+			return ".tex" ;
+		case (Term::svg) :
+			return ".svg" ;
+		default :
+			std::cerr << "unknown extension set" << std::endl;
+			return ".xxx" ;
+		}
+	}
+
+	void PlotStyle::setKeyPos(const std::string & keypos)
+	{
+		_legend_pos_ = keypos ;
+	}
+
+	std::string PlotStyle::getKeyPos() const
+	{
+		std::string lgd ="#legend\nset key " ;
+		if (!_legend_pos_.empty())
+			lgd +=  _legend_pos_ ;
+		else
+			lgd += " under" ;
+		return lgd;
+	}
+
+	void PlotStyle::setXtics ( enum Options::Type opt, const std::string & more )
+	{
+		_xtics_ =  "#xtics\nset xtics ";
+		if (opt == Options::oblique)
+			_xtics_ +=  "nomirror rotate by -45 scale 0 ";
+		else {
+			linbox_check(opt == Options::other);
+			_xtics_ += more ;
+		}
+	}
+
+	const std::string & PlotStyle::getXtics() const
+	{
+		return _xtics_ ;
+	}
+
+	std::string PlotStyle::getOutput(const std::string & basnam) const
+	{
+		std::string setout = "#output\nset output \'" ;
+#ifdef __LINBOX_HAVE_GHOSTSCRIPT
+		if (_term_ == Term::pdf)
+			setout += "| ps2pdf - " ;
+		setout += basnam + getExt() + '\'' ;
+#else
+		setout += basnam + ".eps\'" ;
+#endif
+
+		return setout ;
+	}
+
+	void PlotStyle::setPlotType(enum Plot::Type type)
+	{
+		_plot_type_ = type ;
+		// _plot_extra_ = moreargs ;
+	}
+
+	void PlotStyle::setLineType( enum Line::Type type)
+	{
+		_line_type_ = type ;
+	}
+
+	std::string PlotStyle::getPlotType(const std::string & extraargs) // const
+	{
+		_styleopts_ += "\nset datafile missing \"inf\"" ;
+		std::string mystyle = "#style\nset style data " ;
+		if (_line_type_ != Line::other) {
+			switch (_line_type_) {
+			case (Line::lines) :
+				mystyle += "lines" ;
+				break;
+			case (Line::histogram) :
+				mystyle += "histogram" ;
+				if (extraargs.empty()) // default style
+					mystyle += "\nset style histogram cluster gap 1\nset style fill solid border rgb \"black\"";
+				break;
+			case (Line::points) :
+				mystyle += "points" ;
+				break;
+			case (Line::linespoints) :
+				mystyle += "linespoints" ;
+				break;
+			default :
+				std::cout << __func__ << " : you should have set the LineType when ploting PlotType::graph !" << std::endl;
+				mystyle += "other" ;
+			}
+		}
+		else { // userd defined datastyle
+			return _styleopts_  ;
+		}
+		// some more style args :
+		mystyle += "\n" + _styleopts_ + "\n" + extraargs + "\n";
+		return mystyle ;
+	}
+
+	void PlotStyle::addPlotType(const std::string & style)
+	{
+		_styleopts_ += "\n" + style ;
+	}
+
+	void PlotStyle::setUsingSeries(size_t col, const std::string & moreargs)
+	{
+		linbox_check(col>1);
+		std::ostringstream usingcols ;
+		if (_plot_type_ == Plot::histo) {
+			usingcols << " using " << col << ":xtic(1) title columnheader(" << col << ") "  << moreargs << " ";
+		}
+		else {
+			linbox_check(_plot_type_ == Plot::graph);
+			usingcols << " using 1:" << col << " title columnheader(" << col << ") "  << moreargs << " ";
+		}
+		_usingcols_ = usingcols.str();
+	}
+
+	void PlotStyle::addUsingSeries(size_t col, const std::string & moreargs)
+	{
+		linbox_check(col>2);
+		linbox_check(!_usingcols_.empty()); // we don't add if nothing was set
+		std::ostringstream usingcols ;
+		usingcols << ", \'\' using " ;
+		if (_plot_type_ == Plot::graph)
+			usingcols << "1:" ;
+		usingcols << col << " ti col "  << moreargs << " ";
+		_usingcols_ += usingcols.str();
+	}
+
+	void PlotStyle::setUsingSeries(std::list<size_t> cols, const std::string & moreargs)
+	{
+		linbox_check(!cols.empty());
+		std::list<size_t>::iterator it = cols.begin();
+		// no way to check *it< coldim...
+		std::ostringstream usingcols ;
+		if ( _plot_type_ == Plot::histo ) {
+			usingcols << " using " << *it << ":xtic(1) title columnheader(" << *it << ") " << moreargs << " " ;
+			++it ;
+			for (;it != cols.end();++it) {
+				usingcols << ", \'\' using " << *it << " ti col "  << moreargs << " ";
+			}
+		}
+		else {
+			linbox_check(_plot_type_ == Plot::graph);
+			usingcols << " using 1:" << *it << " title columnheader(" << *it << ") "  << moreargs << " ";
+			++it ;
+			for (;it != cols.end();++it) {
+				usingcols << ", \'\' using 1:" << *it << " ti col "  << moreargs << " ";
+			}
+		}
+
+		_usingcols_ = usingcols.str();
+		return;
+	}
+
+	void PlotStyle::addUsingSeries(std::list<size_t> cols, const std::string & moreargs)
+	{
+		linbox_check(!cols.empty());
+		linbox_check(!_usingcols_.empty()); // we don't add if nothing was set
+		std::list<size_t>::iterator it = cols.begin();
+		std::ostringstream usingcols ;
+		if (_plot_type_ == Plot::histo) {
+			for (;it != cols.end();++it) {
+				usingcols << ", \'\' using " << *it << " ti col "  << moreargs << " ";
+			}
+		}
+		else {
+			linbox_check(_plot_type_ == Plot::graph);
+			for (;it != cols.end();++it) {
+				usingcols << ", \'\' using 1:" << *it << " ti col "  << moreargs << " ";
+
+			}
+		}
+		_usingcols_ += usingcols.str();
+		return;
+	}
+
+	void PlotStyle::setUsingSeries(std::pair<size_t,size_t> cols, const std::string & moreargs)
+	{
+		std::ostringstream usingcols ;
+		if (_plot_type_ == Plot::histo) {
+			usingcols << " using " << cols.first << ":xtic(1) title columnheader(" << cols.first << ") "  << moreargs << " ";
+			usingcols << ", for [i=" << cols.first+1 << ":" << cols.second << "] \'\' using i title columnheader(i) "  << moreargs << " ";
+		}
+		else {
+			linbox_check(_plot_type_ == Plot::graph);
+			usingcols << " using 1:" << cols.first << " title columnheader(" << cols.first << ") "  << moreargs << " ";
+			usingcols << ", for [i=" << cols.first+1 << ":" << cols.second << "] \'\' using 1:i title columnheader(i) "  << moreargs << " ";
+		}
+
+		_usingcols_ = usingcols.str();
+		return;
+
+	}
+
+	void PlotStyle::addUsingSeries(std::pair<size_t,size_t> cols, const std::string & moreargs)
+	{
+		linbox_check(!_usingcols_.empty()); // we don't add if nothing was set
+		std::ostringstream usingcols ;
+		if (_plot_type_ == Plot::histo) {
+			usingcols << ", for i=[" << cols.first << ":" << cols.second << "] \'\' using i title columnheader(i) " << moreargs << " ";
+		}
+		else {
+			usingcols << ", for i=[" << cols.first << ":" << cols.second << "] \'\' using 1:i title columnheader(i) "  << moreargs << " ";
+			linbox_check(_plot_type_ == Plot::graph);
+		}
+
+		_usingcols_ += usingcols.str();
+
+	}
+
+	const std::string & PlotStyle::getUsingSeries() const
+	{
+		return _usingcols_ ;
+	}
+
+} // LinBox
+
+//
+// Curve fitting
+//
+
+namespace LinBox {
+
+	// fit X[nn-1,nn],Y[nn-1,nn] and return evaluation at x.
+	double fit2(const dvector_t & X, const dvector_t & Y, int nn, double x)
+	{
+		size_t n = (size_t) nn;
+		assert(n>0);
+		if ( n==1 ) {
+			if ( X[0]==X[1] ) {
+				// std::cerr << "two of your evaluation points are at the same X" << std::endl;
+				// this is NOT supposed to happen.
+				return (Y[0]+Y[1])/2 ;
+			}
+		}
+		if (X[n]==X[n-1]) // discard the last one.
+			return fit2(X,Y,(int)n-1,x);
+
+		double a = (Y[n-1]-Y[n])/(X[n-1]-X[n]) ;
+		double b = (X[n-1]*Y[n]-X[n]*Y[n-1])/(X[n-1]-X[n]) ;
+		return a*x+b ;
+	}
+
+#ifdef __LINBOX_HAVE_LAPACK
+
+	double fit_lapack3(const dvector_t &X, const dvector_t &Z, double x)
+	{
+
+		dvector_t Y = Z ;
+
+		int n = (int) Z.size();
+		linbox_check((size_t)n == X.size());
+
+		int deg = (int) std::min((int)4,n);
+		dvector_t V((size_t)(deg*n));
+
+		int ldv = deg ;
+
+#if 0 // Clapack (not working)
+		for(size_t i = 0 ; i < (size_t)n; ++i) {
+			for (size_t j = 0 ; j < (size_t)ldv; ++j) {
+				V[i*ldv+j] = std::pow(X[i],j);
+			}
+		}
+
+		clapack_dgels(CblasRowMajor, CblasNoTrans, n, deg, 1, &V[0],
+			      deg, &Y[0], 1);
+
+#endif
+
+#if 1 /* basic least squares */
+		// std::cout << V.size() << std::endl;
+		for(size_t i = 0 ; i < (size_t)n; ++i) {
+			for (size_t j = 0 ; j < (size_t)ldv; ++j) {
+				V[i+j*(size_t)n] = std::pow(X[i],j);
+			}
+		}
+
+		// std::cout << V << std::endl;
+
+		int info;
+		int ldun = 1 ;
+		{
+
+			int lwork = 2*n*deg*4 ;
+			dvector_t work((size_t)lwork);
+			char N[] = "N";
+			dgels_(N, &n, &ldv, &ldun, &(V[0]) , &n, &(Y[0]), &n, &work[0], &lwork, &info);
+		}
+
+#endif
+
+#if 0 /* least squares using SVN and V not nec. full rank */
+		{
+			int lwork = 2*deg+std::max(2*deg,n)*4 ;
+			dvector_t work(lwork);
+			dvector_t s(deg);
+			double rcond = 1e-8 ;
+			int rank ;
+			dgelss_( &n, &ldv, &ldun, &(V[0]) , &n, &(Y[0]), &n, &s[0], &rcond, &rank, &work[0], &lwork, &info);
+		}
+#endif
+
+#if 0 /* weighted least squares */
+		//DGGGLM
+
+		// TODO
+
+#endif
+
+
+		// std::cout << Y << std::endl;
+		// horner eval the poly
+		double res = 0.0;
+
+		for(int i=deg-1; i >= 0; i--) {
+			res = res * x + Y[(size_t)i];
+		}
+		return res;
+	}
+#endif // __LINBOX_HAVE_LAPACK
+
+
+	double fit3(const dvector_t & X, const dvector_t & Y,int n, double x)
+	{
+#ifndef __LINBOX_HAVE_LAPACK /* à la main */
+		linbox_check(n>1);
+		linbox_check((size_t)n< X.size());
+		linbox_check((size_t)n< Y.size());
+		if (n==2) {
+			if (X[1]==X[2])
+				return fit2(X,Y,1,x) ;
+			if (X[0]==X[2]) {
+				return fit2(X,Y,1,x) ;
+			}
+			if (X[0]==X[1]) {
+				dvector_t X1(2); X1[0]=X[1]; X1[2]=X[2];
+				dvector_t Y1(2); Y1[0]=Y[1]; Y1[2]=Y[2];
+				return fit2(X1,Y1,1,x) ;
+			}
+		}
+		if (X[n]==X[n-1]) { // discard last
+			dvector_t X1(X.begin(),X.begin()+(n-1));
+			dvector_t Y1(Y.begin(),Y.begin()+(n-1));
+
+			return fit3(X1,Y1,n-1,x) ;
+		}
+		if (X[n]==X[n-2]) { // discard last
+			dvector_t X1(X.begin(),X.begin()+(n-1));
+			dvector_t Y1(Y.begin(),Y.begin()+(n-1));
+
+			return fit3(X1,Y1,n-1,x) ;
+		}
+		if (X[n-1]==X[n-2]) { // discard last but one
+			dvector_t X1(X.begin(),X.begin()+(n-1));
+			dvector_t Y1(Y.begin(),Y.begin()+(n-1));
+			X1[n-1]=X[n];
+			Y1[n-1]=Y[n];
+
+			return fit3(X1,Y1,n-1,x) ;
+		}
+
+		// todo: use Lagrange ?
+		// std::cout << X[n-2] << ',' << X[n-1] << ',' << X[n] << std::endl;
+		double d  = (-X[n]+X[n-1])*(-X[n]+X[n-2])*(X[n-2]-X[n-1]) ;
+		double a1 = -X[n]*Y[n-2]+X[n-2]*Y[n]+X[n-1]*Y[n-2]-X[n-1]*Y[n]+X[n]*Y[n-1]-X[n-2]*Y[n-1];
+		double a2 = -X[n-2]*X[n-2]*Y[n]+X[n-2]*X[n-2]*Y[n-1]+X[n-1]*X[n-1]*Y[n]-Y[n-2]*X[n-1]*X[n-1]+Y[n-2]*X[n]*X[n]-Y[n-1]*X[n]*X[n];
+		double a3 = X[n-2]*X[n-2]*X[n-1]*Y[n]-X[n-2]*X[n-2]*X[n]*Y[n-1]-X[n-1]*X[n-1]*X[n-2]*Y[n]+Y[n-1]*X[n-2]*X[n]*X[n]+X[n-1]*X[n-1]*X[n]*Y[n-2]-Y[n-2]*X[n-1]*X[n]*X[n];
+
+		// std::cout <<" (("<<a1<<"*x+"<<a2<<")*x+"<<a3<<")/"<<d << std::endl;
+		return ((a1*x+a2)*x+a3)/d ;
+#else // __LINBOX_HAVE_LAPACK
+		int m = min(n,5);
+		dvector_t X1((size_t)m) ;
+		dvector_t Y1((size_t)m) ;
+		for (int i = 0 ; i < m ; ++i) X1[(size_t)i] = X[(size_t)(n-m+i)] ;
+		for (int i = 0 ; i < m ; ++i) Y1[(size_t)i] = Y[(size_t)(n-m+i)] ;
+		return fit_lapack3(X1,Y1,x);
+
+#endif // __LINBOX_HAVE_LAPACK
+	}
+
+} // LinBox
+
+
+//
+//  TimeWatcher
+//
+
+namespace LinBox {
+	TimeWatcher::TimeWatcher (dvector_t & pts, dvector_t & vals) :
+		Points_(&pts)
+		,Values_(&vals)
+		,MaxRepet_(12)
+		,MinRepet_(2)
+		,MaxTime_(0.5)
+		,AbortTime_(10)
+		,aborted_(false)
+	{
+		linbox_check(vals.size() == pts.size());
+	}
+
+	TimeWatcher::TimeWatcher () :
+		Points_(NULL)
+		,Values_(NULL)
+		,MaxRepet_(12)
+		,MinRepet_(2)
+		,MaxTime_(0.5)
+		,AbortTime_(10)
+		,aborted_(false)
+	{
+	}
+
+
+	void TimeWatcher::init(dvector_t & pts, dvector_t & vals)
+	{
+		linbox_check(vals.size() == pts.size());
+		Points_ = &pts ;
+		Values_ = &vals ;
+	}
+
+
+	dvector_t & TimeWatcher::refX()
+	{
+		return *Points_ ;
+	}
+
+	dvector_t & TimeWatcher::refY()
+	{
+		return *Values_ ;
+	}
+
+	// we don't assume that t(0sec) = 0 unless nothing has been computed yet.
+	double TimeWatcher::predict(double x)
+	{
+		size_t Current_ = size();
+		if (Current_ == 0)
+			return 0 ;
+		if (Current_ ==1 )
+			return refX()[Current_-1] ; // unknown. could be known if we suppose t(0)=0
+		if (Current_ == 2 ) {
+			return fit2(refX(),refY(),1,x);
+		}
+		return fit3(refX(),refY(), (int) Current_-1,x);
+	}
+
+	bool TimeWatcher::keepon( size_t & repet, double tim, bool usePrediction )
+	{
+
+		if (aborted_)
+			return false ;
+
+		if (usePrediction) {
+			if (predict(tim) < AbortTime_)
+				return true ;
+			else{
+				aborted_ = true ;
+				return false;
+			}
+		}
+
+		if (repet<MinRepet_ || (tim < MaxTime_ && repet < MaxRepet_) ) {
+			++repet ;
+			return true;
+		}
+		return false ;
+	}
+
+	size_t TimeWatcher::size() const
+	{
+		if (Points_ == NULL || Values_ == NULL) {
+			linbox_check(Values_ == NULL && Points_ == NULL);
+			return  0 ;
+		}
+		linbox_check(Points_->size() == Values_->size());
+		return (size_t)Points_->size();
+	}
+
+	void TimeWatcher::clear()
+	{
+		Points_ = NULL ;
+		Values_ = NULL ;
+	}
+
+} // LinBox
+
+//
+// DataSeries
+//
+
+namespace LinBox {
+
+	DataSeries:: DataSeries() :
+		PointLabels(0)
+		, Points(0)
+		, Times(0)
+		, Values(0)
+		, UID(0)
+	{}
+
+	DataSeries::~DataSeries() {}
+
+#if 0
+	void
+	DataSeries::resize(const size_t & n)
+	{
+		linbox_check(n == Values.size()+1);
+		PointLabels.resize(n);
+		Times.resize(n);
+		Points.resize(n);
+		Values.resize(n);
+		UID.resize(n);
+
+		return;
+	}
+#endif
+
+	size_t
+	DataSeries::size() const
+	{
+		linbox_check(PointLabels.size() == Points.size())
+		linbox_check(Times.size() == Points.size())
+		linbox_check(Times.size() == Values.size())
+		linbox_check(Times.size() == UID.size())
+
+		return (size_t)Values.size();
+	}
+
+	void DataSeries::push_back(const std::string & nam, const double & val, const double & x , const double &y )
+	{
+		linbox_check(PointLabels.size() == Values.size());
+
+		PointLabels.push_back(nam);
+
+		Values.push_back(val);
+
+		if ( std::isnan(x) )
+			Points.push_back((double)Points.size());
+		else
+			Points.push_back(x);
+
+		if ( std::isnan(y))
+			Times.push_back(val);
+		else
+			Times.push_back(y);
+
+		UID.push_back("point_" + randomAlNum(8));
+		return;
+	}
+
+} // LinBox
+
+//
+// PlotGraph
+//
+
+namespace LinBox {
+
+	//!@todo use getUsingSeries in latex/html/csv/xml
+
+
+		void PlotGraph::_randomName()
+		{
+			std::ostringstream unique_filename ;
+			unique_filename << _filename_ << '_' << getDateTime("_") << '_' << randomAlNum(4);
+
+			// std::cout << unique_filename.str() << std::endl;
+
+			_printname_ = unique_filename.str() ;
+
+		}
+
+		const std::string & PlotGraph::getFileName()
+		{
+			if (_printname_.empty())
+				_randomName();
+			return _printname_;
+		}
+
+		void PlotGraph::mergeTwoSeries( svector_t & merge_points
+				     , dmatrix_t & merge_data
+				     , const svector_t & pts
+				     , const dvector_t & dat
+				     , const size_t & idx) const
+		{
+			size_t data_size = (size_t)merge_points.size();
+			linbox_check(data_size == (size_t)merge_data[0].size());
+
+			merge_data[idx].resize(data_size,NAN);
+			typename svector_t::iterator it ;
+
+			for (size_t i = 0 ; i < pts.size() ; ++i) {
+
+				size_t k ;
+			       bool ok = findKeyword(k, merge_points.begin(), merge_points.begin()+data_size,pts[i]);
+
+				if ( ok ){
+					merge_data[idx][k] = dat[i] ;
+				}
+				else {
+					for (size_t j = 0 ; j < idx ; ++j) {
+						merge_data[j].push_back(NAN);
+					}
+
+					merge_data[idx].push_back(dat[i]) ;
+					merge_points.push_back(pts[i]) ;
+				}
+				// std::cout << "..." << std::endl;
+				// std::cout << merge_points << std::endl;
+				// std::cout << merge_data << std::endl;
+				// std::cout << "..." << std::endl;
+			}
+
+			return;
+
+		}
+
+		void PlotGraph::mergeSeries()
+		{
+			_data_. selectFirstSeries();
+			_merge_points_ = _data_.getCurrentSeries( Point::Labels() ) ;
+			_merge_data_[0] = _data_.getCurrentSeries( Point::Values() ) ;
+
+			// std::cout << "merge points " << _merge_points_ << std::endl;
+			// std::cout << "merge data   " << _merge_data_ << std::endl;
+
+			for (size_t i = 1 ; i < _data_.size() ; ++i) {
+				_data_. selectNextSeries() ;
+				// std::cout << "to be merged "  << i << " : "  << std::endl;
+				// std::cout << "new points " << _data_.getCurrentSeriesPointLabel() << std::endl;
+				// std::cout << "new data   " << _data_.getCurrentSeriesValues() << std::endl;
+
+				mergeTwoSeries(_merge_points_,_merge_data_,
+					       _data_. getCurrentSeries( Point::Labels() ), _data_. getCurrentSeries( Point::Values() ),i);
+
+				// std::cout << "result : " << std::endl;
+				// std::cout << "merge points " << _merge_points_ << std::endl;
+				// std::cout << "merge data   " << _merge_data_ << std::endl;
+
+			}
+
+			return ;
+		}
+
+		void PlotGraph::print_csv()
+		{
+			char comma   = ',';
+			char comment = '#';
+			size_t nb_points = (size_t)_merge_points_.size() ;
+			size_t nb_series = (size_t)_data_.size() ;
+
+			std::string unique_filename  = getFileName();
+			std::string DataFileName = unique_filename + ".csv" ;
+			std::ofstream DF(DataFileName.c_str());
+
+			/*  Data file to be plot */
+			DF.precision(2);
+			// metadata
+			DF << comment << fortifyString("title") << comma << fortifyString(_style_.getRawTitle()) << std::endl;
+			DF << comment << fortifyString("date") << fortifyString(getDateTime()) << std::endl;
+			smatrix_t uname = getMachineInformation();
+			for (size_t i = 0 ; i < uname[0].size() ; ++i)
+				DF << comment << fortifyString(uname[0][i]) << comma << fortifyString(uname[1][i]) << std::endl ;
+
+			// data
+			DF << fortifyString(_style_.getRawTitle(1)) << comma ;
+			for (size_t i = 0 ; i < nb_series ; ++i) {
+				DF << _data_.getSeriesLabel(i) ;
+				if (i != nb_series -1)
+					DF << comma ;
+			}
+			DF << std::endl;
+
+			for (size_t j = 0 ; j < nb_points ; ++j) {
+				DF << _merge_points_[j] << comma;
+				for (size_t i = 0 ; i < nb_series ; ++i) {
+					DF  << _merge_data_[i][j] ;
+					if (i != nb_series -1)
+						DF << comma ;
+
+				}
+				DF << std::endl;
+			}
+
+			std::cout << "csv data in " << DataFileName << std::endl;
+
+		}
+
+		void PlotGraph::print_dat()
+		{
+			print_gnuplot(true);
+		}
+
+		void PlotGraph::print_xml()
+		{
+#ifdef __LINBOX_HAVE_TINYXML2
+			std::string unique_filename = getFileName();
+			unique_filename += ".xml" ;
+
+			_data_.save(unique_filename,_style_.getRawTitle(),_style_.getRawTitle(1),_style_.getRawTitle(2));
+
+			load(unique_filename);
+#else
+			std::cout << "tinyxml2 is not installed, could not print" << std::endl;
+			exit(-1);
+#endif
+			return ;
+		}
+
+		void PlotGraph::print_html()
+		{
+
+			std::string comment_in = "<!--";
+			std::string comment_out = "-->";
+			size_t nb_points = (size_t)_merge_points_.size() ;
+			size_t nb_series = (size_t)_data_.size() ;
+
+			std::string unique_filename  = getFileName();
+			std::string DataFileName = unique_filename + ".html" ;
+			std::ofstream DF(DataFileName.c_str());
+
+			/*  Data file to be plot */
+			DF.precision(2);
+			// metadata
+			DF << comment_in << ("date") << (getDateTime()) << std::endl;
+			smatrix_t uname = getMachineInformation();
+			for (size_t i = 0 ; i < uname[0].size() ; ++i)
+				DF << (uname[0][i]) << " : " << (uname[1][i]) << std::endl ;
+			DF << comment_out << std::endl ;
+
+			// data
+			DF << "<table border=\"1\">" << std::endl;
+			DF << "<caption> " <<  (_style_.getRawTitle()) << " (data in " << _style_.getRawTitle(2) << ')'  << " </caption>" << std::endl;
+			DF << "<tr> " << std::endl;
+			DF << "<th> " << _style_.getRawTitle(1) << " </th>";
+			for (size_t i = 0 ; i < nb_series ; ++i) {
+				DF << "<th> " << unfortifyString(_data_.getSeriesLabel(i)) << " </th>";
+			}
+			DF << " </tr>" << std::endl;
+
+			for (size_t j = 0 ; j < nb_points ; ++j) {
+				DF << "<tr> " << std::endl;
+				DF << "<th> " << unfortifyString(_merge_points_[j]) << " </th>";
+				for (size_t i = 0 ; i < nb_series ; ++i) {
+					DF  << "<td> " << _merge_data_[i][j]  << " </td>";
+
+				}
+				DF << std::endl;
+				DF << "</tr>" << std::endl;
+			}
+
+			DF << "</table>" << std::endl;
+			std::cout << "html data in " << DataFileName << std::endl;
+
+
+		}
+
+		void PlotGraph::print_latex()
+		{
+			size_t nb_points = (size_t)_merge_points_.size();
+			size_t nb_series = _data_.size();
+
+			linbox_check(nb_points);
+			linbox_check(nb_series);
+			// srand(time(NULL));
+			// std::ostringstream unique_filename  ;
+			std::string unique_filename = getFileName();
+			unique_filename += ".tex" ;
+			// std::cout << _filename_ << " plot in " << unique_filename << '.'<< std::endl;
+			std::ofstream FN(unique_filename.c_str());
+			//!@todo check FN opened.
+			// begin
+			FN << "%\\usepackage{slashbox}" << std::endl;
+			FN << "\\begin{table}" << std::endl;
+			FN << "\\centering"    << std::endl;
+			// format
+			FN << "\\begin{tabular}{c||" ;
+			for (size_t j = nb_points ; j-- ; )
+				FN << 'c' ;
+			FN << "|}" << std::endl;
+			// top left case
+			std::string series = _style_.getRawTitle(2);
+			std::string points = _style_.getRawTitle(1);
+			if (!points.empty()) {
+				FN << "\\backslashbox{" << points << "}{" << series << "}" ;
+			}
+			else {
+				FN << series ;
+			}
+			// first line
+			for (size_t j = 0 ; j < nb_points ; ++j ) {
+				FN << " & " <<  _merge_points_[j] ;
+			}
+			// lines of data
+			FN << std::endl << "\\hline" << std::endl;
+			FN.precision(2);
+			for (size_t i = 0 ; i < nb_series ; ++i) {
+				FN << _data_.getSeriesLabel(i) ;
+				for (size_t j =  0 ; j < nb_points ; ++j )
+					FN << " & " << _merge_data_[i][j] ;
+				if (i+1 < nb_series )
+					FN << "\\\\" ;
+				FN << std::endl;
+			}
+			// end
+			FN << "\\end{tabular}" << std::endl;
+			FN << "\\caption{" << _style_.getRawTitle() << "}" << std::endl;
+			FN << "\\label{tab:<+" << "label+>}" << std::endl;
+			FN << "\\end{table}" << std::endl ;
+
+			FN.close();
+
+			std::cout << "latex table in " << unique_filename << '.' << std::endl;
+			return ;
+
+		}
+
+		void PlotGraph::print_gnuplot(bool only_data)
+		{
+#ifndef __LINBOX_HAVE_GNUPLOT
+			std::cout << "gnuplot is not available on your system. only the data will be printed" << std::endl;
+#endif
+			size_t nb_points = (size_t)_merge_points_.size() ;
+			size_t nb_series = (size_t)_data_.size() ;
+
+			std::string unique_filename  = getFileName();
+			std::string DataFileName = unique_filename + ".dat" ;
+			std::ofstream DF(DataFileName.c_str());
+
+			/*  Data file to be plot */
+			// DF.precision(_style_.getPrecision());
+			DF.precision(2);
+
+			char comment = '#' ;
+			char comma   = ' ';
+			// metadata
+			DF << comment << ("title") << comma << (_style_.getRawTitle()) << std::endl;
+			DF << comment << ("date") << (getDateTime()) << std::endl;
+			smatrix_t uname = getMachineInformation();
+			for (size_t i = 0 ; i < uname[0].size() ; ++i)
+				DF << comment << (uname[0][i]) << comma << (uname[1][i]) << std::endl ;
+
+
+			DF << "legend " ;
+			for (size_t i = 0 ; i < nb_series ; ++i) {
+				DF << _data_.getSeriesLabel(i) << ' ' ;
+			}
+			DF << std::endl;
+
+			for (size_t j = 0 ; j < nb_points ; ++j) {
+				DF << _merge_points_[j] ;
+				for (size_t i = 0 ; i < nb_series ; ++i) {
+					DF << " " << _merge_data_[i][j] ;
+				}
+				DF << std::endl;
+			}
+
+			if (only_data)
+				std::cout << "data in " << DataFileName << std::endl;
+
+#ifdef __LINBOX_HAVE_GNUPLOT
+			if (!only_data) {
+				std::string PlotFileName = unique_filename + ".gp" ;
+				std::ofstream PF(PlotFileName.c_str());
+
+				/*  Ploting script */
+				PF << "#" << _filename_                    << std::endl;
+				PF << _style_.getTerm()                    << std::endl;
+				PF << _style_.getOutput(unique_filename)   << std::endl;
+				PF << _style_.getTitle()                   << std::endl;
+				PF << _style_.getKeyPos()                  << std::endl;
+				PF << _style_.getXtics()                   << std::endl;
+				PF << _style_.getPlotType()                << std::endl;
+
+				PF << getPlotCommand(DataFileName) << std::endl;
+
+				PF.close();
+
+				std::string command( "gnuplot " ) ;
+				command += PlotFileName ;
+				int err = system( command.c_str() ) ;
+				if (err) {
+					std::cout << "errors have occured. Look at gnuplot output." << std::endl;
+				}
+				else {
+					std::cout << "Output generated as " << unique_filename  + _style_.getExt() << std::endl;
+				}
+			}
+#endif
+
+
+			return;
+		}
+
+
+		void PlotGraph::setData( PlotData & data )
+		{
+			_data_ = data ;
+		}
+
+		PlotData & PlotGraph::refData( PlotData & data)
+		{
+			return data = _data_ ;
+		}
+
+		void PlotGraph::setStyle( PlotStyle & style )
+		{
+			_style_ = style ;
+		}
+
+		PlotStyle & PlotGraph::refStyle( PlotStyle & style)
+		{
+			return style = _style_ ;
+		}
+
+
+		// not implemented yet
+		void PlotGraph::sortSeries() {}
+
+		// not implemented yet
+		void PlotGraph::unique() {}
+
+		PlotGraph::PlotGraph( PlotData & data, PlotStyle & style ) :
+			_data_(data)
+			,_style_(style)
+			,_filename_("")
+			,_printname_("")
+			,_merge_data_(data.size())
+			,_merge_points_(data.getSeries(0).size())
+		{
+			srand((unsigned)time(NULL));
+			mergeSeries();
+		}
+
+		void PlotGraph::setOutFilename( const std::string & filename )
+		{
+			int err = system( "test -d data || ( rm -rf data && mkdir data )" ) ;
+			if (err) {
+				throw LinBoxError("could not create directory data");
+			}
+
+			if ( filename.empty() ) {
+				_filename_ = "./data/plotdata" ;
+				std::cerr << "you should provide a filename. Using " << _filename_ << " as default ."<<std::endl;
+			}
+			else {
+				_filename_ = "./data/" + filename;
+			}
+
+		}
+
+		const std::string & PlotGraph::getUsingSeries() // const
+		{
+			// mutable _style_ ?
+			linbox_check(_merge_points_.size());
+			if (_style_.getUsingSeries().empty()) {
+				_style_.setUsingSeries(std::pair<size_t,size_t>((size_t)2,(size_t)_merge_data_.size()+1));
+			}
+			return _style_.getUsingSeries();
+		}
+
+		std::string PlotGraph::getPlotCommand(const std::string & File) //const
+		{
+			std::string PC = "#plot\nplot \'" + File + "\' ";
+			PC += getUsingSeries() ;
+			return PC ;
+		}
+
+		void PlotGraph::print( Tag::Printer pt ) {
+			switch (pt) {
+			case (Tag::Printer::xml):
+				{
+					print_xml();
+					break;
+				}
+			case (Tag::Printer::csv) :
+				{
+					print_csv();
+					break;
+				}
+			case (Tag::Printer::dat) :
+				{
+					print_dat();
+					break;
+				}
+			case (Tag::Printer::gnuplot) :
+				{
+					print_gnuplot();
+					break;
+				}
+			case (Tag::Printer::tex) :
+				{
+					print_latex();
+					break;
+				}
+			case (Tag::Printer::html) :
+				{
+					print_html();
+					break;
+				}
+			default :
+				{
+					throw LinBoxError("printer unknown");
+				}
+
+			}
+
+			return ;
+		}
+
+		void PlotGraph::save()
+		{
+			return print_xml();
+		}
+
+		void PlotGraph::load(const std::string & filename)
+		{
+			return _data_.load(filename);
+		}
+
+} // LinBox
+
+#endif // __LINBOX_benchmarks_benchmark_C
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/benchmark.doxy b/benchmarks/benchmark.doxy
index d437ef2..ee48fc6 100644
--- a/benchmarks/benchmark.doxy
+++ b/benchmarks/benchmark.doxy
@@ -26,7 +26,7 @@
  * The benchmarks are meant for :
  * - the \e user to guide her through the various choices of
  * algorithms/implementation provided in her particular case.
- * - the \e developper to test her new algorithms against the others or check
+ * - the \e developer to test her new algorithms against the others or check
  * that the newest shiny subroutine she just wrote didn't deteriorate too much
  * the performance of LinBox :) (regression testing purpose).
  * .
diff --git a/benchmarks/benchmark.h b/benchmarks/benchmark.h
index e30843b..206ad8e 100644
--- a/benchmarks/benchmark.h
+++ b/benchmarks/benchmark.h
@@ -1,12 +1,12 @@
 /* Copyright (C) 2011 LinBox
- * Written by BB <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  *
  *
  *
  * ========LICENCE========
  * This file is part of the library LinBox.
  *
-  * LinBox is free software: you can redistribute it and/or modify
+ * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
@@ -39,9 +39,11 @@
  *
  */
 
-#ifndef __LINBOX_benchmark_H
-#define __LINBOX_benchmark_H
+#ifndef __LINBOX_benchmarks_benchmark_H
+#define __LINBOX_benchmarks_benchmark_H
+// here classes TimeWatcher, PlotStyle, PlotData are declared
 
+#include "linbox/linbox-config.h"
 #include <stdlib.h>
 #include "linbox/integer.h"
 #include "linbox/util/debug.h"
@@ -49,31 +51,167 @@
 #include "linbox/util/timer.h"
 #include <string>
 #include <fstream>
+#include <iomanip> // setprecision
 
-typedef uint32_t index_t ;
+#include <sys/utsname.h>
+#include <ctime>
+#ifdef __LINBOX_HAVE_TINYXML2
+#include <tinyxml2.h>
+#endif
+
+#include "benchmark-utils.h"
+#include "benchmark-metadata.h"
+
+
+//
+// TimeWatcher
+//
+
+namespace LinBox {
+	/*! Helper.
+	 * This helper has several functions :
+	 *   - Records the timings
+	 *   - predict the execution time for the next experiment
+	 *   - helps producing enough experiments (but not too much and not too time consuming) for producing a valid measure.
+	 *   .
+	 *   @warning if the timings are too short, this may not be accurate.
+	 *
+	 *   See member function help for more information.
+	 */
+	class TimeWatcher  {
+	private :
+		dvector_t  *    Points_; //!< Points data. If <code>Points_[i] = x</code>, then <code>Values_[i]=f(x)<code>.
+		dvector_t  *    Values_; //!< Time data. See \p Points_ .
+
+		size_t       MaxRepet_; //!< Maximum number of repetitions of timings
+		size_t       MinRepet_; //!< Minimum number of repetitions of timings
+		double         MaxTime_; //!< Maximum time to be spent on repetitions (after MinRepet_ iters have been done)
+		double       AbortTime_; //!< Time to abort a series of computation.
+		bool           aborted_; //!< abort any subsequent computation
+
+
+	public:
+		/*! constructor.
+		 * Inits the time watcher with a pair of points/values
+		 * @param pts vector of points
+		 * @param vals vector of times
+		 */
+		TimeWatcher (dvector_t & pts, dvector_t & vals) ;
+
+		//! Null Constructor. The pointers are intialised to NULL
+		TimeWatcher () ;
+
+		void init(dvector_t & pts, dvector_t & vals);
+
+		//! returns the vector of abscissa (points)
+		dvector_t & refX() ;
+
+		//! returns the vector of ordiantes (values)
+		dvector_t & refY() ;
+
+		/** Prediction for the next experiment time.
+		 * It is assumed that \c predict(0)=0. If Curent_<3, a linear,
+		 * then quadratic fit is done. Other wise, a cubic fit is
+		 * performed.
+		 * @param x the next evaluation point.
+		 * @return f(x) where f tries to fit the points : \f$ f(\mathtt{Data\_}[0][0..\mathtt{Current\_}-1]) \approx  refY()[0..\mathtt{Current\_}-1]\f$
+		 */
+		double predict(double x) ;
+
+		/*! @brief Watches a timer and a number and repet and signals if over.
+		 *
+		 * We want at least 2 repetions but not more than maxtime spent on timing.
+		 *
+		 * @param repet number of previous repetitions. Should be 0 on the first time \c keepon is called.
+		 * @param tim timer to watch
+		 * @param maxtime maximum time (in seconds) until \c watchon tells stop.
+		 * @return \c true if we conditions are not met to stop, \c false otherwise.
+		 * @pre \c tim should have been started previously !
+		 *
+		 */
+		bool keepon(size_t & repet, double tim, bool usePrediction = false) ;
+
+		//! size
+		size_t size() const;
+
+		//! clear the pointers (not the settings)
+		void clear();
+
+	} ; // TimeWatcher
+} // LinBox
+
+//
+// DataSeries
+//
+
+namespace LinBox {
+	/** @brief this structure holds a bunch of timings.
+	 * It collects the points, the time spent at each point and a measure
+	 * (for instance mflops).
+	 * @todo Times and Values could be dmatrix_t (and mergeable)
+	 */
+	struct DataSeries {
+		svector_t   PointLabels ; //!< points abscisa, values for the x axis. Used in legend for the X axis.
+		dvector_t   Points      ; //!< points abscisa, values for the x axis. Used in TimeWatcher (for instance, if PointLabels are the names of sparse matrices, Points would be their number of non zeros, or 1,2,3,... or whatever relevant for predicting time)
+		dvector_t   Times       ; //!< actual computation times.
+		dvector_t   Values      ; //!< actual data to be plotted (for instance mflops)
+		svector_t   UID         ; //!< unique id of a point.
+
+		//! Constructor
+		DataSeries() ;
+
+		~DataSeries() ;
+
+#if 0
+		/** @brief resize
+		 * @param n new size
+		 * @pre the size before was n-1
+		 */
+		void resize(const size_t & n);
+#endif
+
+		//! Size of the series of measurements.
+		size_t size() const;
+
+		//! add some new data.
+		void push_back(const std::string & nam, const double & val, const double & x = NAN, const double &y = NAN);
+
+		// use it but change time
+		// void useMetadata(const MetaData & m) ;
+	}; // DataSeries
+
+} // LinBox
+
+/* ********************** */
+/*    Plot structures     */
+/* ********************** */
 
-namespace LinBox
-{
+//
+// PlotStyle
+//
 
+namespace LinBox {
 
-	/*! @brief Represents a table of values to plot.
+	/*! @brief Represents a table of values to plot (2D).
 	 * list of values are reprensented by vectors.  the table is a vector
 	 * of these vectors.
 	 *
 	 * @warning NaN, inf are used as missing data. More genenally
 	 * we could store data in strings.
-         * @todo Allow for 'speed up against col X' style
+	 * @todo Allow for 'speed up against col X' style
+	 * @todo make depend on PlotData
 	 */
+	//!@todo setUsingSeries(const svector_t &)
 	class PlotStyle {
 	public:
 		//! What format the plot should be in?
-		struct Term
-		{
+		struct Term {
 			//! Term type
 			enum Type {
 				png  = 100, //!< png. Portable Network Graphics file.
 				pdf  = 101, //!< pdf. Portable Document Format actually, this is eps converted to pdf.
 				eps  = 102, //!< eps. Encapsulated PostScript. Cool for inclusion in LaTex files. This is the default.
+				epstex  = 107, //!< epslatex. Encapsulated PostScript. Cool for inclusion in LaTex files with latex formulas.
 				svg  = 103, //!< sgv. Scalable Vector Graphics.
 				tex  = 104, //!< tex. Simple tabular.
 				html = 105, //!< html. HTML table.
@@ -83,18 +221,16 @@ namespace LinBox
 
 		// enum NoType { other = 0 } ;
 		//! What style of graphic : histogram ? graph ?
-		struct Plot
-		{
+		struct Plot {
 			//! Plot type
 			enum Type {
 				histo = 200, //! histogram plot. This is the default. x ticks are evenly spaced, whatever there value and are labelled with their value.
-				graph = 201, //! standard plot. Plots y_i=f(x) with x in the first colum and y_i in ith column. x-ticks are well spaced.
+				graph = 201, //! standard plot. Plots y_i=f(x) with x in the first colum and y_i in ith column. x-ticks are well spaced. This will not work if the X are not numbers (but strings).
 				other = 202  //! other (ie user supplied).
 			} ;
 		};
 
-		struct Line
-		{
+		struct Line {
 			enum Type {
 				lines      = 300,  //! lines.
 				histogram  = 301,  //! histogram (boxes).
@@ -104,8 +240,7 @@ namespace LinBox
 			} ;
 		};
 
-		struct Options
-		{
+		struct Options {
 			enum Type {
 				oblique = 400,
 				other   = 401
@@ -115,149 +250,65 @@ namespace LinBox
 		/*! @brief Constructor.
 		 * By default, creates an histogram representing the data in an eps plot.
 		 */
-		PlotStyle() :
-			_term_(Term::eps),_plot_type_(Plot::histo),_line_type_(Line::histogram)
-		{
-
-		}
+		PlotStyle() ;
 
 		/*! @brief sets the titles in the graph.
 		 * @param titre Title of the graph
 		 * @param titre_y Title of the y-axis (series)
 		 * @param titre_x Title of the x-axis (data points)
 		 */
-		void setTitle ( std::string    titre
-				, std::string  titre_y
-				, std::string  titre_x)
-		{
-			_title_   = titre ;
-			_title_x_ = titre_x ;
-			_title_y_ = titre_y ;
-		}
+		void setTitle ( const std::string  &  titre
+				, const std::string  & titre_y
+				, const std::string  & titre_x);
 
 		/*! @brief Gets the title of the graph.
 		 * @return a gnuplot command to set the title of the graph.
 		 */
-		std::string getTitle()
-		{
-			std::string title = "#title\nset title \""  + _title_ + '\"';
-			if (!_title_x_.empty())
-				title +="\nset xlabel \"" + _title_x_ +'\"' ;
-			if (!_title_y_.empty())
-				title +="\nset ylabel \"" + _title_y_ +'\"' ;
-			return title ;
-		}
+		std::string  getTitle() const ;
 
 		/*! @brief Gets the title of points abscissa.
 		 * @return a gnuplot command to set the title of the abscissa.
 		 */
-		std::string getTitleX()
-		{
-			return "\nset xlabel \"" + _title_x_ + '\"' ;
-		}
+		std::string getTitleX() const ;
 
 		/*! @brief Gets the title of the series.
 		 * @return a gnuplot command to set the title of the ordinate (series).
 		 */
-		std::string getTitleY()
-		{
-			return "\nset ylabel \"" + _title_y_ + '\"' ;
-		}
+		std::string getTitleY() const ;
 
 		/*! @brief get the title string.
 		 * @param index can be (0,1,2)
 		 */
-		std::string getRawTitle(int index=0)
-		{
-			switch (index) {
-			case 0 :
-				return _title_ ;
-			case 1 :
-				return _title_x_ ;
-			case 2 :
-				return _title_y_ ;
-			default :
-				return "bad index" ;
-			}
-		}
+		std::string getRawTitle(int index=0) const ;
 
 		/*! @brief Sets the output format.
 		 * @sa TermType
 		 * @param term type
 		 */
-		void setTerm( enum Term::Type term)
-		{
-			_term_ = term ;
-		}
+		void setTerm( enum Term::Type term) ;
 
-#if 0
-		/*! Set additionnal term features
-		 */
-		void setTermOption(std::string & opts)
-		{
-			_termopts_ = opts;
-		}
-#endif
 
 		/*! @brief Gets the output format.
 		 * @return string for setting the expected output format in gnuplot.
+		 * @warning noenhanced allows underscores while enhanced does subscripts.
+		 * if we add a (no) enhanced option, we'll have to add a safeFormat(std::string) that replaces \c _ with <code>\_</code> .
+		 * This is tricky and can be done at "post production" stage :-)
 		 */
-		std::string getTerm()
-		{
-			std::string term = "#term\nset term " ;
-			switch(_term_) {
-			case (Term::png) :
-				term += "png enhanced" ;
-				break;
-			case (Term::pdf) :
-				std::cerr << "warning, pdf not really working for now" << std::endl;
-				term += "postscript eps enhanced color" ;
-				break;
-			case (Term::eps) :
-				term += "postscript eps enhanced color" ;
-				break;
-			case (Term::svg) :
-				term += "svg" ;
-				break;
-			case (Term::other) :
-			default :
-				std::cerr  << " *** error ***" << std::endl << "No supported term set" << std::endl;
-				term += "unknown" ;
-			}
-			return term ;
-		}
+		std::string getTerm() const ;
 
 		/*! @brief Gets the graph output extension.
 		 * By default, this is ".eps".
 		 * @return a string for this extension, including the sepatating dot.
 		 *
 		 */
-		std::string getExt()
-		{
-			switch(_term_) {
-			case (Term::png) :
-				return ".png" ;
-			case (Term::pdf) :
-#ifndef __LINBOX_HAVE_GHOSTSCRIPT
-				std::cerr << "warning, pdf not available. falling back to eps" << std::endl;
-#endif
-				return ".pdf" ;
-			case (Term::eps) :
-				return ".eps" ;
-			case (Term::svg) :
-				return ".svg" ;
-			default :
-				std::cerr << "unknown extension set" << std::endl;
-				return ".xxx" ;
-			}
-		}
+		std::string getExt() const ;
 
 #if 0
 		/*! @brief gets the style of the graph.
 		 * This is very user-tweakable !!
 		 * @return the style for gnuplot.
 		 */
-		std::string getStyle()
+		const std::string & getStyle()
 		{
 			return "#style\n"+_styleopts_ ;
 		}
@@ -266,7 +317,7 @@ namespace LinBox
 		 * This is very user-tweakable !!
 		 * @param style the style for gnuplot as a gnuplot command.
 		 */
-		void setStyle(std::string style)
+		void setStyle(const std::string & style)
 		{
 			_styleopts_ = style ;
 		}
@@ -274,87 +325,58 @@ namespace LinBox
 
 		/*! @brief sets the legend position.
 		 * @param keypos the arguments to key (where the legend should be put)
-		 * can be : inside, outside,...
+		 * can be :
+		 * <code>
+		 *      set key {on|off} {default}
+		 *              {{inside | outside} | {lmargin | rmargin | tmargin | bmargin} | {at <position>}}
+		 *              {left | right | center} {top | bottom | center}
+		 *              {vertical | horizontal} {Left | Right}
+		 *              {{no}reverse} {{no}invert}
+		 *              {samplen <sample_length>} {spacing <vertical_spacing>}
+		 *              {width <width_increment>}
+		 *              {height <height_increment>}
+		 *              {{no}autotitle {columnheader}}
+		 *              {title "<text>"} {{no}enhanced}
+		 *              {{no}box { {linestyle | ls <line_style>} | {linetype | lt <line_type>} {linewidth | lw <line_width>}}}
+		 * </code>
 		 */
-		void setKeyPos(std::string keypos)
-		{
-			_legend_pos_ = keypos ;
-		}
+		void setKeyPos(const std::string & keypos) ;
 
 
 		/*! @brief Gets the legend position.
 		 * by default, it is "under".
 		 */
-		std::string getKeyPos()
-		{
-			std::string lgd ="#legend\nset key " ;
-			if (!_legend_pos_.empty())
-				lgd +=  _legend_pos_ ;
-			else
-				lgd += " under" ;
-			return lgd;
-		}
+		std::string getKeyPos() const ;
 
 		/*! @brief sets the  position of the labels on the X absciss.
 		 * @param opt
 		 * @param more more stuff
 		 */
-		void setXtics ( enum Options::Type opt, std::string more="")
-		{
-			_xtics_ =  "#xtics\nset xtics ";
-			if (opt == Options::oblique)
-				_xtics_ +=  "nomirror rotate by -45 scale 0 ";
-			else {
-				linbox_check(opt == Options::other);
-				_xtics_ += more ;
-			}
-		}
+		void setXtics ( enum Options::Type opt, const std::string & more="") ;
 
 		/*! @brief Gets the legend position.
 		 * by default, it is 45° inclined (use in on long tics legends).
 		 */
-		std::string getXtics()
-		{
-			return _xtics_ ;
-		}
+		const std::string & getXtics() const ;
 
 		/*! @brief Gets the name of the output graph.
 		 * @param basnam the raw name for the output.
 		 * @return basnam+extenstion.
 		 */
-		std::string getOutput(std::string basnam)
-		{
-			std::string setout = "#output\nset output \'" ;
-#ifdef __LINBOX_HAVE_GHOSTSCRIPT
-			if (_term_ == Term::pdf)
-				setout += "| ps2pdf - " ;
-			setout += basnam + getExt() + '\'' ;
-#else
-			setout += basnam + ".eps\'" ;
-#endif
-
-			return setout ;
-		}
+		std::string getOutput(const std::string & basnam) const ;
 
 		/*! @brief Sets the type of plot.
 		 * @param type the type.
 		 * @sa PlotType
 		 *
 		 */
-		void setPlotType(enum Plot::Type type)
-		{
-			_plot_type_ = type ;
-			// _plot_extra_ = moreargs ;
-		}
+		void setPlotType(enum Plot::Type type) ;
 
 		/*! @brief Sets the way dots are linked.
 		 * @sa LineType
 		 * @param type type
 		 */
-		void setLineType( enum Line::Type type)
-		{
-			_line_type_ = type ;
-		}
+		void setLineType( enum Line::Type type) ;
 
 		/*! @brief Gets the type of plot.
 		 * default is histogram, or if graph is supplied, then the default is linespoints.
@@ -363,162 +385,47 @@ namespace LinBox
 		 * @sa PlotType
 		 *
 		 */
-		std::string getPlotType()
-		{
-			_styleopts_ += "\nset datafile missing \"inf\"" ;
-			std::string mystyle = "#style\nset style data " ;
-			if (_line_type_ != Line::other) {
-				switch (_line_type_) {
-				case (Line::lines) :
-					mystyle += "lines" ;
-					break;
-				case (Line::histogram) :
-					mystyle += "histogram" ;
-					break;
-				case (Line::points) :
-					mystyle += "points" ;
-					break;
-				case (Line::linespoints) :
-					mystyle += "linespoints" ;
-					break;
-				default :
-					std::cout << __func__ << " : you should have set the LineType when ploting PlotType::graph !" << std::endl;
-					mystyle += "other" ;
-				}
-			}
-			else { // userd defined datastyle
-				return _styleopts_  ;
-			}
-			// some more style args :
-			mystyle += "\n" + _styleopts_ + "\n";
-			return mystyle ;
-		}
+		std::string getPlotType(const std::string & extraargs ="") ;
 
 		/*! @brief adds some style line to the graph.
 		 * This is very user-tweakable !!
 		 * @param style a style line for gnuplot as a gnuplot command.
 		 */
-		void addPlotType(std::string style)
-		{
-			_styleopts_ += "\n" + style ;
-		}
+		void addPlotType(const std::string & style) ;
 
 		/*! @brief tells which columns to use.
 		 * @param col a column to use.
 		 * @param moreargs more stuff
 		 */
-		void setUsingSeries(index_t col, std::string moreargs= "")
-		{
-			linbox_check(col>1);
-			std::ostringstream usingcols ;
-			if (_plot_type_ == Plot::histo) {
-				usingcols << " using " << col << ":xtic(1) title columnheader(" << col << ") "  << moreargs << " ";
-			}
-			else {
-				linbox_check(_plot_type_ == Plot::graph);
-				usingcols << " using 1:" << col << " title columnheader(" << col << ") "  << moreargs << " ";
-			}
-			_usingcols_ = usingcols.str();
-		}
+		void setUsingSeries(size_t col, const std::string &  moreargs= "") ;
 
 		/*! @brief adds a column to use
 		 * @param col a  column to use.
 		 * @param moreargs more stuff
 		 * @pre \p _usingcols_ is not empty, ie \c setUsingSeries has already been called.
 		 */
-		void addUsingSeries(index_t col, std::string moreargs= "")
-		{
-			linbox_check(col>2);
-			linbox_check(!_usingcols_.empty());
-			std::ostringstream usingcols ;
-			usingcols << ", \'\' using " ;
-			if (_plot_type_ == Plot::graph)
-				usingcols << "1:" ;
-			usingcols << col << " ti col "  << moreargs << " ";
-			_usingcols_ += usingcols.str();
-		}
+		void addUsingSeries(size_t col, const std::string &  moreargs= "") ;
 
 		/*! @brief tells which columns to use.
 		 * @param cols a list of column to use.
 		 * @param moreargs more stuff
 		 */
-		void setUsingSeries(std::list<index_t> cols, std::string moreargs= "")
-		{
-			linbox_check(!cols.empty());
-			std::list<index_t>::iterator it = cols.begin();
-			// no way to check *it< coldim...
-			std::ostringstream usingcols ;
-			if (_plot_type_ == Plot::histo) {
-				usingcols << " using " << *it << ":xtic(1) title columnheader(" << *it << ") " << moreargs << " " ;
-				++it ;
-				for (;it != cols.end();++it) {
-					usingcols << ", \'\' using " << *it << " ti col "  << moreargs << " ";
-				}
-			}
-			else {
-				linbox_check(_plot_type_ == Plot::graph);
-				usingcols << " using 1:" << *it << " title columnheader(" << *it << ") "  << moreargs << " ";
-				++it ;
-				for (;it != cols.end();++it) {
-					usingcols << ", \'\' using 1:" << *it << " ti col "  << moreargs << " ";
-				}
-			}
-
-			_usingcols_ = usingcols.str();
-			return;
-		}
+		void setUsingSeries(std::list<size_t> cols, const std::string & moreargs= "") ;
 
 		/*! @brief adds a set of columns to use.
 		 * @param cols a list of column to use.
 		 * @param moreargs more stuff
 		 * @pre \p _usingcols_ is not empty, ie \c setUsingSeries has already been called.
 		 */
-		void addUsingSeries(std::list<index_t> cols, std::string moreargs= "")
-		{
-			linbox_check(!cols.empty());
-			linbox_check(!_usingcols_.empty());
-			std::list<index_t>::iterator it = cols.begin();
-			std::ostringstream usingcols ;
-			if (_plot_type_ == Plot::histo) {
-				for (;it != cols.end();++it) {
-					usingcols << ", \'\' using " << *it << " ti col "  << moreargs << " ";
-
-				}
-			}
-			else {
-				linbox_check(_plot_type_ == Plot::graph);
-				for (;it != cols.end();++it) {
-					usingcols << ", \'\' using 1:" << *it << " ti col "  << moreargs << " ";
-
-				}
-			}
-			_usingcols_ += usingcols.str();
-			return;
-		}
+		void addUsingSeries(std::list<size_t> cols, const std::string & moreargs= "") ;
 
 		/*! @brief tells which columns to use.
-		 * @param cols all colums between \c cols.first and \c cols.second
+		 * @param cols all colums between \c cols.first and \c cols.second (included)
 		 * will be used.
 		 * @param moreargs more stuff
 		 *
 		 */
-		void setUsingSeries(std::pair<index_t,index_t> cols, std::string moreargs= "")
-		{
-			std::ostringstream usingcols ;
-			if (_plot_type_ == Plot::histo) {
-				usingcols << " using " << cols.first << ":xtic(1) title columnheader(" << cols.first << ") "  << moreargs << " ";
-				usingcols << ", for [i=" << cols.first+1 << ":" << cols.second << "] \'\' using i title columnheader(i) "  << moreargs << " ";
-			}
-			else {
-				linbox_check(_plot_type_ == Plot::graph);
-				usingcols << " using 1:" << cols.first << " title columnheader(" << cols.first << ") "  << moreargs << " ";
-				usingcols << ", for [i=" << cols.first+1 << ":" << cols.second << "] \'\' using 1:i title columnheader(i) "  << moreargs << " ";
-			}
-
-			_usingcols_ = usingcols.str();
-			return;
-
-		}
+		void setUsingSeries(std::pair<size_t,size_t> cols, const std::string & moreargs= "") ;
 
 		/*! @brief adds contiguous columns to use.
 		 * @param cols all colums between \c cols.first and \c
@@ -528,33 +435,9 @@ namespace LinBox
 		 * already been called.
 		 *
 		 */
-		void addUsingSeries(std::pair<index_t,index_t> cols, std::string moreargs= "")
-		{
-			linbox_check(!_usingcols_.empty());
-			std::ostringstream usingcols ;
-			if (_plot_type_ == Plot::histo) {
-				usingcols << ", for i=[" << cols.first << ":" << cols.second << "] \'\' using i title columnheader(i) " << moreargs << " ";
-			}
-			else {
-				usingcols << ", for i=[" << cols.first << ":" << cols.second << "] \'\' using 1:i title columnheader(i) "  << moreargs << " ";
-				linbox_check(_plot_type_ == Plot::graph);
-			}
-
-			_usingcols_ += usingcols.str();
+		void addUsingSeries(std::pair<size_t,size_t> cols, const std::string & moreargs= "") ;
 
-		}
-
-		/*! @brief Gets the plot command line.
-		 * @param File the name of/path to the data file (with extension)
-		 * @return a gnuplot "plot" command stream.
-		 */
-		std::string getPlotCommand(std::string File)
-		{
-			std::string PC = "#plot\nplot \'" + File + "\' ";
-			PC += _usingcols_ ;
-			return PC ;
-			// "plot './data/fgemm_square_2ex03aS2.dat'  using 1:2 title columnheader(2), for [i=3:5] '' using 1:i title  columnheader(i)"
-		}
+		const std::string & getUsingSeries() const ;
 
 	private :
 		// int                                 _precision_ ;   //!< precision of the output. by default 2.
@@ -579,232 +462,466 @@ namespace LinBox
 		std::string                         _usingcols_ ; //!< columns to be used (gp command)
 
 
-	} ;
+	} ; // PlotStyle
+
+} // LinBox
+
+//
+// PlotData
+//
+
+namespace LinBox {
+
+		struct Point {
+			//! x
+			struct Labels {
+				typedef std::string type;
+			};
+
+			//! y
+			struct Values {
+				typedef double type;
+			} ;
+
+			//! numerical value for x
+			struct Points {
+				typedef double type;
+			};
+
+			//! y time
+			struct Times  {
+				typedef double type;
+			};
+		} ;
 
 	/*! @brief The raw data to plot.
-	 * Represents the series of points and the labels for the points (X)
-	 * axis and the series (Y) axis.  The internal representation is a
+	 * Represents  the labels for the points (X axis) and the values for
+	 * each series of measures (Y axis).
+	 *
+	 * Members that set/get are named as follows :
+	 * - getX(nom,j) return the j'th element of series named nom
+	 * - getX(i,j) return the j'th element of series number i
+	 * - getCurrentSeriesX(j) return the j'th element of current series
+	 * - getCurrentEntryX() return the current element of current series (ie the last one)
+	 * - .
+	 *
+	 * Members are also named as follows :
+	 * - getXXX is a const member
+	 * - selectXXX is non const and may create/update stuff
+	 * - refXXX returns a reference
+	 * - setXXX sets something
+	 *
+	 * @internal The internal representation is a
 	 * vector of vector, each series of point being a vector of double.
-	 * @tparam NAM the X axis is parametered by NAM (string, int, double...)
-	 * @todo write members that permute, add, scale,... data.
+	 *
+	 * @tparam Xkind the X axis is parametrised by \p Xkind (string, int, double...)
+	 * The Y axis is always represented by double.
+	 * @todo put the legend (title, x, y) in there
 	 */
-	template<class NAM>
 	class PlotData {
 	private :
-		std::vector< std::vector< double > >  _tableau_   ;   //!< data. \c _tableau_[i][j] is the \e jth value of serie \e i.
-		index_t                              _nb_points_ ;   //!< number of points in each series. (size of \c _tableau_[0])
-		index_t                              _nb_series_ ;   //!< number of series. (size of \c _tableau_)
-		std::vector< std::string >           _serie_name_;   //!< name for each serie of points
-		std::vector< NAM >                   _absci_name_;   //!< values of the x axis.
+		std::vector<DataSeries >      _tableau_  ;   //!< data. \c _tableau_[i] represents a series of measurements. A data series is augmented only via the \c push_back method. A series may be accessed by its name, its number or it is the current working series.
+		svector_t                  _series_label_ ;   //!< label for each series of measures. Used in the legend of the plots/tables of points.
+		mutable size_t            _curr_series_  ;   //!< index of the current series of measurements.
+		mutable TimeWatcher        _time_watch_  ;   //!< time predictor, helper. See \c TimeWatcher.
+		MetaData                     _plot_data_ ;   //!< information abouth the benchmark
+		MetaDataSeries               _meta_data_ ;   //!< information about each point
+	private:
+
+#ifdef __LINBOX_HAVE_TINYXML2
+		//! @internal data part of the XML output
+		tinyxml2::XMLElement * saveData(tinyxml2::XMLDocument & doc) ;
+#endif
+
+		/** Finds the index of a series by its name.
+		 * @param nom name of the series
+		 * @return its index
+		 */
+		size_t getIndex(const std::string & nom) const ;
+
+		/** Finds the index of a series by its name.
+		 * @param nom name of the series
+		 * @return its index
+		 */
+		size_t selectIndex(const std::string & nom) ;
+
 	public :
+
+		/*! Returns the ith series of measurements.
+		 * @param i ith series to be returned
+		 */
+		const DataSeries & getSeries(const size_t  &i) const ;
+
+		/*! Returns the ith series of measurements.
+		 * @param i ith series to be returned
+		 */
+		const DataSeries & selectSeries(const size_t  &i) ;
+
+		/*! Returns the series of measurements after its name.
+		 * @param nom name of series to be returned
+		 */
+		const DataSeries & selectSeries(const std::string &name) ;
+
+		/*! Returns the current series of measurements.
+		*/
+		const DataSeries & getCurrentSeries() const;
+
+		/*! Returns the ith series of measurements.
+		 * @param i ith series to be returned
+		 */
+		DataSeries & refSeries(const size_t  &i) ;
+
+		/*! Returns the ith series of measurements.
+		 * @param i ith series to be returned
+		 */
+		DataSeries & refSeries(const std::string  & nom) ;
+
+		/*! Returns the current series of measurements.
+		*/
+		DataSeries & refCurrentSeries() ;
+
 		/*! Inits a plot with series of data.
-		 * @param nb_pts number of points in each serie.
+		 * @param nb_pts number of points in each series.
 		 * @param nb_srs number of series of points. Default is 1.
 		 */
-		PlotData(index_t nb_pts, index_t nb_srs=1) :
-			_tableau_(nb_srs),_nb_points_(nb_pts),_nb_series_(nb_srs),_serie_name_(nb_srs),_absci_name_(nb_pts)
+		PlotData() ;
+		/*! destructor.
+		*/
+		~PlotData()  ;
+
+		/*! copy constructor.
+		 * @param PD a PlotData to copy.
+		 */
+		PlotData(const PlotData & PD);
+
+		/** @brief initialize to empty
+		*/
+		void clear() ;
+
+		/*! merges another plot data to the current one.
+		 * (just adds to the end, does not merge series by name yet)
+		 */
+		void merge(const PlotData &PD) ;
+
+		/*! @brief get the number of series.
+		 * @return number of series.
+		 */
+		size_t size() const ;
+
+		/** @brief gets the current series number.
+		*/
+		size_t getCurrentSeriesNumber() const ;
+
+		/*! @brief Sets the name of a series.
+		 * @param i index of the series
+		 * @param nom name of the series
+		 */
+		void setSeriesName(const size_t & i, const std::string & nom) ;
+
+		// ref  Series
+
+		template<class Pt>
+		std::vector<typename Pt::type> & refSeries(const size_t & i,  Pt kind) ;
+
+		template<class Pt>
+		std::vector<typename Pt::type> & refSeries(const std::string & name,  Pt kind)
 		{
-			linbox_check(nb_srs);
-			linbox_check(nb_pts);
-			for (index_t i = 0 ; i < nb_srs ; ++i)
-				_tableau_[i].resize(nb_pts);
+			return refSeries(getIndex(name ), kind );
 		}
 
-		//! destructor.
-		~PlotData() {} ;
+		// get Series
+
+		template<class Pt>
+		const std::vector<typename Pt::type> & getSeries(const size_t & i,  Pt kind) const ;
 
-		//! copy constructor.
-		//! @param PD a PlotData to copy.
-		PlotData(const PlotData<NAM> & PD):
-			_tableau_(PD.getTable()),_nb_points_(PD.getPointsDim()),_nb_series_(PD.getSeriesDim()),_serie_name_(PD.getSerieNames()),_absci_name_(PD.getAbsciNames())
+		template<class Pt>
+		const std::vector<typename Pt::type> & getSeries(const std::string & name,  Pt kind) const
 		{
+			return getSeries(getIndex(name),kind);
+		}
 
+		template<class Pt>
+		const std::vector<typename Pt::type> & getCurrentSeries( Pt kind) const
+		{
+			return getSeries(_curr_series_, kind);
 		}
 
-		/*! @brief get the number of series.
-		 * @return number of series.
-		 */
-		index_t getSeriesDim()
+		template<class Pt>
+		const typename Pt::type & getSeriesEntry(const size_t & i, const size_t & j, Pt kind) const
 		{
-			return _nb_series_ ;
+			linbox_check(j<getSeriesSize(i));
+			return (getSeries(i,kind)[j]) ;
 		}
 
-		/*! @brief get the common number of points in each serie.
-		 * @return number of points.
-		 */
-		index_t getPointsDim()
+		template<class Pt>
+		const typename Pt::type & getSeriesEntry(const std::string & name, const size_t & j, Pt kind) const
 		{
-			return _nb_points_ ;
+			return getSeriesEntry(getIndex(name),j,kind);
 		}
 
-		/*! @brief Sets the name of a serie.
-		 * @param i index of the serie
-		 * @param nom name of the serie
-		 */
-		void setSerieName(index_t i, std::string nom)
+		template<class Pt>
+		const typename Pt::type & getSeriesEntry(const size_t & i,  Pt kind) const
 		{
-			linbox_check(i<_nb_series_);
-			_serie_name_[i] = nom ;
+			return ( getSeries(i,kind).back() ) ;
 		}
 
+		template<class Pt>
+		const typename Pt::type & getSeriesEntry(const std::string & name,  Pt kind) const
+		{
+			return getSeriesEntry(getIndex(name),kind);
+		}
+
+		template<class Pt>
+		const typename Pt::type & getCurrentSeriesEntry(const size_t & j, Pt kind) const
+		{
+			return getSeriesEntry(_curr_series_, j, kind);
+		}
+
+		template<class Pt>
+		const typename Pt::type & getCurrentSeriesEntry( Pt kind) const
+		{
+			return getSeriesEntry(_curr_series_, kind);
+		}
+
+
+		// set Series
+
+		/** Gets the name of a series.
+		 * @param i index of the series
+		 */
+		const std::string &  getSeriesName(const size_t & i) const ;
+
+		/** Gets the name of the current series.
+		*/
+		const std::string &  getCurrentSeriesName() const ;
+
+		/*! @brief Sets the name of the current series.
+		 * @param nom name of the series
+		 */
+		void setCurrentSeriesName(const std::string & nom) ;
+
+		/** Inits the watch on a series
+		 * @param i index of a series
+		 */
+		void initWatch ( const size_t & i) ;
+
+		/** Inits the watch to current series
+		*/
+		void initCurrentSeriesWatch () ;
+
+		/** Creates a new series.
+		 * It is created after the last series.
+		 * \c getCurrentSeries() points to it.
+		 * @param nom name of the new series
+		 */
+		void newSeries(const std::string & nom = "") ;
+
+		/** Finish a series of measurements.
+		 * Nothing is done for the moment.
+		 */
+		void finishSeries() ;
+
+		/** @brief size of a series.
+		 * @param i index of the series
+		 */
+		size_t getSeriesSize(const size_t & i) const ;
+
+		/** @brief size of the current series.
+		*/
+		size_t getCurrentSeriesSize() const ;
+
+		/*! goes to the next series of points
+		*/
+		bool selectNextSeries() ;
+
+		/** selects the first series
+		 */
+		void selectFirstSeries() ;
+
 		/*! @brief Sets the name of a point.
+		 * @param i series number
 		 * @param j index for the the point
 		 * @param nom name of the point
 		 */
-		void setAbsciName(index_t j, NAM nom)
+		template<class T>
+		void setSeriesPointLabel(const size_t & i, const size_t & j, const T & nom)
 		{
-			linbox_check(j<_nb_points_);
-			_absci_name_[j] = nom ;
+			std::string nom_s = fortifyString(toString(nom));
+			linbox_check(j<getSeriesSize(i) );
+			refSeries(i).PointLabels[j] = nom_s ;
+
+			return;
 		}
 
-		/*! @brief gets the name of a serie.
-		 * Defaults to \c "serie.i"
+		/*! @brief Sets the name of a point.
+		 * @param j index for the the point
+		 * @param nom name of the point
+		 */
+		void setCurrentSeriesPointLabel(const size_t & j, const std::string & nom) ;
+
+
+
+		/*! @brief gets the name of a series.
+		 * Defaults to \c "series.i"
 		 * @param i its index.
 		 * @return its name.
 		 */
-		std::string getSerieName(index_t i)
-		{
-			linbox_check(i<_nb_series_);
-			if (_serie_name_[i].empty()) {
-				std::ostringstream emptytitle ;
-				emptytitle << "serie." << i ;
-				return emptytitle.str();
-			}
-			return(_serie_name_[i]);
-		}
+		std::string getSeriesLabel(const size_t & i) const ;
 
-		/*! @brief gets the name of a point.
-		 * @param j its index.
+		/*! @brief gets the name of a series.
+		 * Defaults to \c "series.i"
+		 * @param i its index.
 		 * @return its name.
-		 * @warning no default. \c setAbsciName has to be used beforehands.
 		 */
-		NAM getAbsciName(index_t j)
-		{
-			linbox_check(j<_nb_points_);
-			return(_absci_name_[j]) ;
-		}
+		std::string  getCurrentSeriesLabel() const;
 
 		/*! @brief gets all the names in the series.
 		 * @return a vector of names.
 		 */
-		std::vector<std::string > getSerieNames()
-		{
-			return _serie_name_ ;
-		}
+		const svector_t  & getSeriesLabels() const ;
 
-		/*! @brief gets all the names in the points.
-		 * @return a vector of names.
+
+
+
+
+		/*! @brief sets a new entry.
+		 * @param i index of the series
+		 * @param j index of the point
+		 * @param nam name of the point (eg size of the matrix, name of a sparse matrix,...)
+		 * @param val value to be inserted (eg mflops, sec,...).
+		 * @param xval x value of the point (eg size of the matrix, of a sparse matrix,...)
+		 * @param yval time for this computation (seconds)
 		 */
-		std::vector<NAM > getAbsciNames()
+		void setSeriesEntry(const size_t &i, const std::string & nam, const double & val
+				    , const double & xval = NAN, const double & yval = NAN) ;
+
+		/*! @brief sets a new entry.
+		 * @param name name of the series
+		 * @param j index of the point
+		 * @param nam name of the point (eg size of the matrix, name of a sparse matrix,...)
+		 * @param val value to be inserted (eg mflops, sec,...).
+		 * @param xval x value of the point (eg size of the matrix, of a sparse matrix,...)
+		 * @param yval time for this computation (seconds)
+		 */
+		void setSeriesEntry(const std::string & nom, const std::string & nam, const double & val
+			      , const double & xval = NAN, const double & yval = NAN) ;
+
+		/*! @brief sets a new entry.
+		 * @param j index of the point
+		 * @param nam name of the point (eg size of the matrix, name of a sparse matrix,...)
+		 * @param val value to be inserted (eg mflops, sec,...).
+		 */
+		template<class T>
+		void setCurrentSeriesEntry(const T & nam, const double & val
+					   , const double & xval = NAN, const double & yval = NAN)
 		{
-			return _absci_name_ ;
+			std::string nam_s = fortifyString(toString(nam));
+			return setSeriesEntry(_curr_series_,nam_s,val,xval,yval) ;
 		}
 
-		/*! @brief modifies the number of series.
-		 * @param n the new number of series. Some data will be lost if n is smaller than
-		 * the current size.
+
+
+		/*! gets a reference to the array of data.
+		 * @return a reference to the member \c _tableau_ representing the data.
+		 */
+		const std::vector<DataSeries > & getTable() const ;
+
+		/*! gets a reference to the array of data.
+		 * @return a reference to the member \c _tableau_ representing the data.
+		 */
+		std::vector<DataSeries > & refTable() ;
+
+
+		/** @brief Continue for another time measure ?
+		 * @see TimeWatcher::keepon
+		 * @param repet  current number of repetitions for this new measure
+		 * @param tim    time previously spent on the measures.
+		 * @return true if one more measure can be done
 		 */
-		void resizeSeries( index_t & n)
+		bool keepon(size_t & repet, double tim, bool usePrediction=false) ;
+
+		void load( const std::string & filename) ;
+
+		/** @brief saves the data in XML format.
+		 * @param filename file name
+		 * @param title titles of the data
+		 * @param xtitle legend of the X axis
+		 * @param ytitle legend of the Y axis.
+		 */
+		void save( const std::string & filename
+			   , const std::string & title = ""
+			   , const std::string & xtitle = ""
+			   , const std::string & ytitle = "") ;
+
+		void addCurrentEntryMetaData(const MetaData & m)
 		{
-			if (n<_nb_series_) {
-				std::cerr  << "warning, you are dropping series" << std::endl;
-			}
-			_tableau_.resize(n);
-			return;
+			_meta_data_.push_back(getCurrentEntryId(),m);
 		}
 
-		/*! @brief modifies the number of points.
-		 * @param n the new number of points in every series. Some data
-		 * will be lost if n is smaller than the current size.
+		/** returns the unique ID of the current series last entry
 		 */
-		void resizePoints( index_t & n)
+		const std::string & getCurrentEntryId() const
 		{
-			if (n<_nb_points_) {
-				std::cerr  << "warning, you are dropping points in the series" << std::endl;
-			}
-			for (index_t i = 0 ; i < _nb_series_ ; ++i)
-				_tableau_[i].resize(n);
+			return (getCurrentSeries().UID).back();
 		}
 
-		/*! @brief sets a new entry.
-		 * @param i index of the serie
-		 * @param j index of the point
-		 * @param val value to be inserted.
+		/** @brief returns the unique ID of the current series j'th entry.
+		 * @param j index of the entry.
 		 */
-		void setEntry(index_t i, index_t j, double val)
+		const std::string & getCurrentSeriesId(const size_t & j) const
 		{
-			linbox_check(i<_nb_series_);
-			linbox_check(j<_nb_points_);
-			_tableau_[i][j] = val ;
-			return ;
+			return   (getCurrentSeries().UID[j]);
 		}
 
-		/*! @brief gets a value for an entry.
-		 * @param i index of the serie
-		 * @param j index of the point
-		 * @return val value of point j in serie j.
+		/** @brief returns the unique ID of the i'th series j'th entry.
+		 * @param i index of the series.
+		 * @param j index of the entry.
 		 */
-		double getEntry(index_t i, index_t j)
+		const std::string & getId(const size_t & i, const size_t & j)
 		{
-			linbox_check(i<_nb_series_);
-			linbox_check(j<_nb_points_);
-			return _tableau_[i][j] ;
+			return   (selectSeries(i).UID[j]);
 		}
 
-		/*! gets a reference to the array of data.
-		 * @return a reference to the member \c _tableau_ representing the data.
+		/** @brief returns the unique ID of the i'th series j'th entry.
+		 * @param i index of the series.
+		 * @param j index of the entry.
 		 */
-		std::vector<std::vector< float > > & getTable()
+		const std::string & getId(const std::string & name, const size_t & j)
 		{
-			return _tableau_ ;
+			return   (selectSeries(name).UID[j]);
 		}
 
-	};
+	}; // PlotData
 
-	/*! @brief The graph.
+} // LinBox
+
+//
+// PlotGraph
+//
+
+namespace LinBox {
+
+	/*! @brief The graph (2D).
 	 * This class joins a PlotStyle and a PlotData to build up a graph.  A
 	 * filename should be provided as well, indicating where the output
 	 * graph and scripts will be generated.
 	 *
 	 * @warning the filename will get a random suffix before the extension
 	 * so as not to overwrite files "par inadvertance".
+	 * @warning don't name anything else than a folder "data" in your working directory. You've been warned.
+	 * @todo make depend on PlotStyle (that owns data)
 	 */
-	template<class NAM>
+	//!@todo use getUsingSeries in latex/html/csv/xml
 	class PlotGraph {
 	private :
-		PlotData<NAM>          & _data_ ;   //!< reference to the data points
-		PlotStyle             & _style_ ;   //!< reference to a plotting style
-		std::string         _filename_  ;   //!< name for the output file (without extension). a random \c _XXXXXX suffix will be added to make it unique.
+		PlotData              & _data_ ;   //!< reference to the data points
+		PlotStyle            & _style_ ;   //!< reference to a plotting style
+		std::string         _filename_ ;   //!< name for the output file (without extension). a random \c _XXXXXX suffix will be added to make it unique.
+		std::string        _printname_ ;   //!< name for the output file (without extension) to be printed. a random \c _XXXXXX suffix makes it unique.
+		dmatrix_t         _merge_data_ ;
+		svector_t       _merge_points_ ;
 
-		/*! @internal
-		 * @brief random <code>:alnum:</code> \c char.
-		 * [[:alnum:]] characters are in range
-		 *  - num : 48-57
-		 *  - AL  : 67-90
-		 *  - al  : 97-122
-		 *  .
-		 * @return a random alphabetic or numeric char.
-		 */
-		char _randomAlNum()
-		{
-			int c = rand()%62 ;
-			c += 48 ; // c entre 48 et 109
-			if (c < 58) {
-				return (char) c;
-			}
-			else {
-				c += 7 ;
-				if (c < 91) {
-					return (char)c ;
-				}
-				else {
-					c += 6 ;
-					return (char)c;
-				}
-			}
-
-
-		}
+	private :
 
 		/*! @internal
 		 * @brief Appends random suffix.
@@ -812,51 +929,71 @@ namespace LinBox
 		 * underscore followed by 8 random alnum chars.
 		 * @return the concatenation of \c _filename_ and this suffix.
 		 */
-		std::string _randomName()
-		{
-			std::ostringstream unique_filename ;
-			unique_filename << _filename_ << '_' ;
-			for (index_t i = 8 ; i-- ; ) {
-				unique_filename << _randomAlNum() ;
-			}
-			// std::cout << unique_filename.str() << std::endl;
-			return unique_filename.str() ;
+		void _randomName();
 
-		}
+		//! @internal returns the file name (without extension and uid)
+		const std::string & getFileName()  ;
+
+		//! @bug this supposes the two series have unique measurements for one point.
+		void mergeTwoSeries( svector_t & merge_points
+				     , dmatrix_t & merge_data
+				     , const svector_t & pts
+				     , const dvector_t & dat
+				     , const size_t & idx) const ;
+
+		//! merge all series of points into a vector of absissa points  and a vector of vector of data points
+		void mergeSeries();
+
+		void print_csv();
+
+		void print_dat();
+
+		void print_xml();
+
+		void print_html() ;
+
+		/*! @brief Prints data in a latex tabular.
+		*/
+		void print_latex();
+
+		/*!@brief Plots the data with gnuplot.
+		 * Produces data in a .dat file, creates a .gp gnuplot script and
+		 * outputs a graph calling gnuplot.
+		 * @warning If gnuplot is not available, fall back to the latex method.
+		 */
+		void print_gnuplot(bool only_data=false);
+
+	public :
 
 		/*! @brief Sets a new data structure.
 		 * @param data a reference to a PlotData class.
 		 */
-		void setData( PlotData<NAM> & data )
-		{
-			_data_ = data ;
-		}
+		void setData( PlotData & data );
 
 		/*! @brief Gets the data.
 		 * @param[in,out] data a reference to a PlotData class.
 		 */
-		PlotData<NAM> & refData( PlotData<NAM> & data)
-		{
-			return data = _data_ ;
-		}
+		PlotData & refData( PlotData & data);
 
 		/*! @brief Sets a new style structure.
 		 * @param style a reference to a PlotStyle class.
 		 */
-		void setStyle( PlotStyle & style )
-		{
-			_style_ = style ;
-		}
+		void setStyle( PlotStyle & style ) ;
 
 		/*! @brief Gets the style.
 		 * @param[in,out] style a reference to a PlotStyle class.
 		 */
-		PlotStyle & refStyle( PlotStyle & style)
-		{
-			return style = _style_ ;
-		}
+		PlotStyle & refStyle( PlotStyle & style) ;
 
-	public :
+		PlotStyle & refStyle( )
+		{ return _style_ ; }
+
+
+		// not implemented yet
+		void sortSeries()  ;
+
+		// not implemented yet
+		void unique() ;
 
 		/*! @brief Constructor for the PlotGraph class.
 		 * Plots a series of data according to a style.
@@ -864,180 +1001,101 @@ namespace LinBox
 		 * @param style sets parameters to gnuplot to achieve a nice
 		 * plot.
 		 */
-		PlotGraph( PlotData<NAM> & data, PlotStyle & style ) :
-			_data_(data),_style_(style)
-		{
-			srand((unsigned)time(NULL));
-		}
+		PlotGraph( PlotData & data, PlotStyle & style );
 
 		/*! @brief sets the ouput file name.
 		 * All output is put in a "data" subfolder.
 		 * @warning Since no file is overwritten, this
 		 * directory can rapidly get very populated.
 		 */
-		void setOutFilename( std::string filename )
-		{
-			if ( filename.empty() ) {
-				_filename_ = "./data/plotdata" ;
-				std::cerr << "you should provide a filename. Using " << _filename_ << " as default ."<<std::endl;
-			}
-			else {
-				_filename_ = "./data/" + filename;
-			}
+		void setOutFilename( const std::string & filename ) ;
 
-		} ;
+		const std::string & getUsingSeries() ;
 
-		/*! @brief Prints data in a latex tabular.
+		/*! @brief Gets the plot command line.
+		 * @param File the name of/path to the data file (with extension)
+		 * @return a gnuplot "plot" command stream.
 		 */
-		void print_latex()
-		{
-			index_t nb_points = _data_.getPointsDim();
-			index_t nb_series = _data_.getSeriesDim();
-
-			linbox_check(nb_points);
-			linbox_check(nb_series);
-			// srand(time(NULL));
-			// std::ostringstream unique_filename  ;
-			std::string unique_filename = _randomName();
-			unique_filename += ".tex" ;
-			// std::cout << _filename_ << " plot in " << unique_filename << '.'<< std::endl;
-			std::ofstream FN(unique_filename.c_str());
-			//!@todo check FN opened.
-			// begin
-			FN << "%\\usepackage{slashbox}" << std::endl;
-			FN << "\\begin{table}" << std::endl;
-			FN << "\\centering"    << std::endl;
-			// format
-			FN << "\\begin{tabular}{c||" ;
-			for (index_t j = nb_points ; j-- ; )
-				FN << 'c' ;
-			FN << "|}" << std::endl;
-			// top left case
-			std::string series = _style_.getRawTitle(2);
-			std::string points = _style_.getRawTitle(1);
-			if (!points.empty()) {
-				FN << "\\backslashbox{" << points << "}{" << series << "}" ;
-			}
-			else {
-				FN << series ;
-			}
-			// first line
-			for (index_t j = 0 ; j < nb_points ; ++j ) {
-				FN << " & " <<  _data_.getAbsciName(j) ;
-			}
-			// lines of data
-			FN << std::endl << "\\hline" << std::endl;
-			FN.precision(2);
-			for (index_t i = 0 ; i < nb_series ; ++i) {
-				FN << _data_.getSerieName(i) ;
-				for (index_t j =  0 ; j < nb_points ; ++j )
-					FN << " & " << _data_.getEntry(i,j) ;
-				if (i+1 < nb_series )
-					FN << "\\\\" ;
-				FN << std::endl;
-			}
-			// end
-			FN << "\\end{tabular}" << std::endl;
-			FN << "\\caption{" << _style_.getRawTitle() << "}" << std::endl;
-			FN << "\\label{tab:<+" << "label+>}" << std::endl;
-			FN << "\\end{table}" << std::endl ;
-
-			FN.close();
-
-			std::cout << "latex table in " << unique_filename << '.' << std::endl;
-			return ;
+		std::string getPlotCommand(const std::string & File) ;
 
-		}
+		void print( Tag::Printer pt = Tag::Printer::xml) ;
 
-		/*!@brief Plots the data with gnuplot.
-		 * Produces data in a .dat file, creates a .gp gnuplot script and
-		 * outputs a graph calling gnuplot.
-		 * @warning If gnuplot is not available, fall back to the latex method.
-		 */
-		void print_gnuplot()
-		{
-#ifndef __LINBOX_HAVE_GNUPLOT
-			std::cout << "gnuplot is not available on your system. using latex table as fallback" << std::endl;
-			print_latex();
-#else
-			// srand(time(NULL));
-			index_t nb_points = _data_.getPointsDim() ;
-			index_t nb_series = _data_.getSeriesDim() ;
-
-			std::string unique_filename  = _randomName();
-			std::string DataFileName = unique_filename + ".dat" ;
-			std::string PlotFileName = unique_filename + ".gp" ;
-			std::ofstream DF(DataFileName.c_str());
-			std::ofstream PF(PlotFileName.c_str());
-			/*  Data file to be plot */
-			// DF.precision(_style_.getPrecision());
-			DF.precision(2);
-			DF << "legend " ;
-			for (index_t i = 0 ; i < nb_series ; ++i) {
-				DF << _data_.getSerieName(i) << ' ' ;
-			}
-			DF << std::endl;
-
-			for (index_t j = 0 ; j < nb_points ; ++j) {
-				DF << _data_.getAbsciName(j) ;
-				for (index_t i = 0 ; i < nb_series ; ++i) {
-					DF << " " << _data_.getEntry(i,j) ;
-				}
-				DF << std::endl;
-			}
-
-			/*  Ploting script */
-			PF << "#" << _filename_                    << std::endl;
-			PF << _style_.getTerm()                    << std::endl;
-			PF << _style_.getOutput(unique_filename)   << std::endl;
-			PF << _style_.getTitle()                   << std::endl;
-			PF << _style_.getKeyPos()                  << std::endl;
-			PF << _style_.getXtics()                   << std::endl;
-			PF << _style_.getPlotType()                << std::endl;
-#if 0
-			for (index_t i = 0 ; i < nb_series ; ++i) {
-				PF << "set style line " << _style_.getLineStyle() << std::endl;
-			}
+		void save() ;
+
+		void load(const std::string & filename) ;
+
+	}; // PlotGraph
+
+} // LinBox
+
+//
+// Least Squares
+//
+
+#ifdef __LINBOX_HAVE_LAPACK
+extern "C" {
+#if 1 // from lapack (not clapack)
+
+	void dgels_(char *trans, int *m, int *n, int *nrhs, double *a, int *lda,
+		    double *b, int *ldb, double *work, int *lwork, int *info);
+
+	void dgelsy_(int *m, int *n, int *nrhs, double *a, int *lda,
+		     double *b, int *ldb, int *JPVT, double *RCOND, int *RANK,
+		     double *work, int *lwork, int *info);
+
+	void dgelss_(int *m, int *n, int *nrhs, double *a, int *lda,
+		     double *b, int *ldb, double *s, double *RCOND, int *RANK,
+		     double *work, int *lwork, int *info);
 #endif
-			PF << _style_.getPlotCommand(DataFileName) << std::endl;
+
 #if 0
-			for (index_t i = 0 ; i < nb_series ; ++i) {
-				PF << '\"' << DataFileName << "\" using 1:" << i+2 << " with lines " ;
-				PF << " ls " << i+1 ;
-				PF << " title '" << names[i] << "'";
-				if (i < (nb_series-1))
-					PF << ",\\" << std::endl;
-				else
-					PF << ';' ;
-			}
-			PF << std::endl;
+	int clapack_dgels (const enum CBLAS_ORDER 	Order,
+			   const enum CBLAS_TRANSPOSE 	TA,
+			   int M,
+			   int N,
+			   int NRHS,
+			   double * 	A,
+			   int lda,
+			   double * 	B,
+			   const int 	ldb
+			  );
 #endif
-			PF.close();
+}
+#endif // __LINBOX_HAVE_LAPACK
+
+//
+// Curve fitting
+//
+
+namespace LinBox {
+
+	//! fit X[n-1,n],Y[n-1,n] and return evaluation at x.
+	double fit2(const dvector_t & X, const dvector_t & Y, int n, double x);
+
+#ifdef __LINBOX_HAVE_LAPACK
+	//! fits with a degree 3 polynomial and return evaluation at x.
+	double fit_lapack3(const dvector_t &X, const dvector_t &Z, double x);
+#endif // __LINBOX_HAVE_LAPACK
 
-			std::string command( "gnuplot " ) ;
-			command += PlotFileName ;
-			int err = system( command.c_str() ) ;
-			if (err) {
-				std::cout << "errors have occured. Look at gnuplot output." << std::endl;
-			}
-			else {
-				std::cout << "Output generated as " << unique_filename  + _style_.getExt() << std::endl;
-			}
 
+	//! fit X[n-2,n],Y[n-2,n] and return evaluation at x.
+	double fit3(const dvector_t & X, const dvector_t & Y,int n, double x);
 
+} // LinBox
+
+
+#ifdef LinBoxSrcOnly
+#include "benchmarks/benchmark.C"
 #endif
-		}
 
-	};
+#include "benchmarks/benchmark.inl"
 
-}
-#endif // __LINBOX_benchmark_H
+#endif // __LINBOX_benchmarks_benchmark_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/benchmark.inl b/benchmarks/benchmark.inl
new file mode 100644
index 0000000..4561959
--- /dev/null
+++ b/benchmarks/benchmark.inl
@@ -0,0 +1,182 @@
+/* Copyright (C) 2013 LinBox
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file   benchmarks/benchmark.inl
+ * @ingroup benchmarks
+ * @brief   Common header to ease benchmarking routines.
+ * We provide a class to easily populate and plot files that represent
+ * benchmarks.
+ *
+ * We use <a href="http://www.gnuplot.info/">gnuplot</a> for the plotting part
+ * or LaTeX to provide tables.  A minimum knowledge of \c Gnuplot is a plus but
+ * the \c benchmark-* files should provide enough examples for creating
+ * standard (not too fancy) plots.
+ *
+ * We fall back to plain latex tabulars when gnuplot is not available. We plot
+ * graphs in files whose name is extended by a random 8-char string to avoid
+ * écraser files.
+ *
+ */
+
+#ifndef __LINBOX_benchmarks_benchmark_INL
+#define __LINBOX_benchmarks_benchmark_INL
+
+#include <stdlib.h>
+#include "linbox/integer.h"
+#include "linbox/util/debug.h"
+#include "tests/test-common.h"
+#include "linbox/util/timer.h"
+#include <string>
+#include <fstream>
+
+
+
+
+//
+// Chrono
+//
+
+namespace LinBox {
+
+	template<class MyTimer>
+	Chrono<MyTimer>::Chrono()  :
+		_chrono_(),
+		_times_(0),
+		_total_(0)
+	{
+		_chrono_.clear();
+	}
+
+	template<class MyTimer>
+	Chrono<MyTimer>::~Chrono() {}
+
+	template<class MyTimer>
+	void Chrono<MyTimer>::clear()
+	{
+		_chrono_.clear();
+		_times_.resize(0);
+		_total_ = 0;
+	}
+
+	template<class MyTimer>
+	void Chrono<MyTimer>::start()
+	{
+		_chrono_.start();
+	}
+
+	template<class MyTimer>
+	void Chrono<MyTimer>::stop()
+	{
+		_chrono_.stop();
+		double split = _chrono_.userElapsedTime();
+		_times_.push_back( split );
+		_total_ += split ;
+		_chrono_.clear();
+	}
+
+	template<class MyTimer>
+	double Chrono<MyTimer>::time() const
+	{
+		return _total_ ;
+	}
+
+	template<class MyTimer>
+	dvector_t Chrono<MyTimer>::times() const
+	{
+		return _times_ ;
+	}
+
+
+} // LinBox
+
+//
+// PlotData
+//
+
+namespace LinBox {
+
+	// set Series
+
+		template<>
+		svector_t & PlotData::refSeries(const size_t & i, Point::Labels)
+		{
+			linbox_check(i<size());
+			return (refSeries(i).PointLabels) ;
+		}
+
+		template<>
+		dvector_t & PlotData::refSeries(const size_t & i, Point::Values)
+		{
+			return (refSeries(i).Values) ;
+		}
+
+		template<>
+		dvector_t & PlotData::refSeries(const size_t & i, Point::Points)
+		{
+			return (refSeries(i).Points) ;
+		}
+
+		template<>
+		dvector_t & PlotData::refSeries(const size_t & i, Point::Times)
+		{
+			return (refSeries(i).Times) ;
+		}
+
+	// get Series
+		template<>
+		const svector_t & PlotData::getSeries(const size_t & i, Point::Labels) const
+		{
+			linbox_check(i<size());
+			return (getSeries(i).PointLabels) ;
+		}
+
+		template<>
+		const dvector_t & PlotData::getSeries(const size_t & i, Point::Values) const
+		{
+			return (getSeries(i).Values) ;
+		}
+
+		template<>
+		const dvector_t & PlotData::getSeries(const size_t & i, Point::Points) const
+		{
+			return (getSeries(i).Points) ;
+		}
+
+		template<>
+		const dvector_t & PlotData::getSeries(const size_t & i, Point::Times) const
+		{
+			return (getSeries(i).Times) ;
+		}
+
+} // LinBox
+
+#endif // __LINBOX_benchmarks_benchmark_INL
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/block-coppersmith-benchmark.C b/benchmarks/block-coppersmith-benchmark.C
new file mode 100644
index 0000000..d68deb7
--- /dev/null
+++ b/benchmarks/block-coppersmith-benchmark.C
@@ -0,0 +1,93 @@
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <vector>
+#include <omp.h>
+
+#define __LINBOX_USE_OPENMP 1
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+
+#include "linbox/algorithms/blackbox-block-container.h"
+#include "linbox/algorithms/block-coppersmith-domain.h"
+
+#include "linbox/solutions/det.h"
+
+// Computes the minimal polynomial of a sparse matrix (given in Matrix Market Format)
+// Times BlockCoppersmithDomain using TPL_omp
+
+using namespace LinBox;
+
+typedef Givaro::Modular<double> Field;
+typedef typename Field::Element Element;
+typedef SparseMatrix<Field, SparseMatrixFormat::TPL_omp> SparseMat;
+typedef MatrixDomain<Field> Domain;
+typedef typename Domain::OwnMatrix Block;
+
+void benchmarkBCD(Field& F,
+                  Domain& MD,
+                  SparseMat& M,
+                  Block& U,
+                  Block& V,
+                  std::vector<Block>& gen,
+                  std::vector<size_t>& deg,
+                  int t)
+{
+	BlackboxBlockContainer<Field,SparseMat> blockseq(&M,F,U,V);
+	BlockCoppersmithDomain<Domain,BlackboxBlockContainer<Field,SparseMat> >
+		BCD(MD,&blockseq,t);
+
+	double start=omp_get_wtime();
+	deg=BCD.right_minpoly(gen);
+	double time=omp_get_wtime()-start;
+	std::cout << time << std::endl;
+}
+
+int main(int argc, char** argv)
+{
+	int earlyTerm;
+	int p;
+	std::string uFname,vFname,mFname;
+
+	static Argument args[] = {
+		{ 'p', "-p P", "Set the field GF(p)", TYPE_INT, &p},
+		{ 't', "-t T", "Early term threshold", TYPE_INT, &earlyTerm},
+		{ 'm', "-m M", "Name of file for matrix M", TYPE_STR, &mFname},
+		{ 'u', "-u U", "Name of file for matrix U", TYPE_STR, &uFname},
+		{ 'v', "-v V", "Name of file for matrix V", TYPE_STR, &vFname},
+		END_OF_ARGUMENTS
+	};
+
+	parseArguments(argc,argv,args);
+
+	Field F(p);
+	Domain MD(F);
+	SparseMat M(F);
+	Block U(F),V(F);
+
+	{
+		ifstream iF(mFname);
+		M.read(iF);
+		M.finalize();
+		iF.close();
+	}
+	{
+		ifstream iF(uFname);
+		U.read(iF);
+		iF.close();
+	}
+	{
+		ifstream iF(vFname);
+		V.read(iF);
+		iF.close();
+	}
+
+	std::vector<Block> gen;
+	std::vector<size_t> deg;
+
+	benchmarkBCD(F,MD,M,U,V,gen,deg,earlyTerm);
+
+	return 0;
+}
diff --git a/benchmarks/data/Makefile.am b/benchmarks/data/Makefile.am
new file mode 100644
index 0000000..533cf81
--- /dev/null
+++ b/benchmarks/data/Makefile.am
@@ -0,0 +1,24 @@
+# Copyright (c) 2013 the LinBox group
+# Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the  GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# ========LICENCE========
+#/
+
+
+cleanup :
+	\rm -rf *dat *tex *gp *xml *csv *html *eps
diff --git a/benchmarks/gen-blocks.C b/benchmarks/gen-blocks.C
new file mode 100644
index 0000000..b9055ea
--- /dev/null
+++ b/benchmarks/gen-blocks.C
@@ -0,0 +1,184 @@
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+#include <omp.h>
+#include <time.h>
+#include <set>
+#include <utility>
+#include <sstream>
+
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/blackbox/transpose.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+
+#include "linbox/algorithms/blackbox-block-container.h"
+#include "linbox/algorithms/block-coppersmith-domain.h"
+
+#include "linbox/solutions/det.h"
+#include "linbox/solutions/rank.h"
+#include "linbox/solutions/methods.h"
+
+#include "linbox/algorithms/wiedemann.h"
+
+#include "examples/map-sparse.h"
+
+// Generates random dense matrices U and V and sparse matrix M for use
+// with block-coppersmith-benchmark and invariant-factors-benchmark.
+// Also computes the min-poly and saves that as well
+
+using namespace std;
+using namespace LinBox;
+
+typedef Givaro::Modular<double> Field;
+typedef typename Field::Element Element;
+typedef SparseMatrix<Field> SparseMat;
+typedef MatrixDomain<Field> Domain;
+typedef typename Domain::OwnMatrix Block;
+
+int randRange(int start, int end)
+{
+        double rval = rand();
+        static const double NORMALIZING_CONSTANT = 1.0/(1.0+RAND_MAX);
+        double normedRVal = rval*NORMALIZING_CONSTANT;
+        double rangeSize = end-start;
+        int offset = rangeSize*normedRVal;
+        return start+offset;
+}
+
+void randomBlock(Block& block, Field& field, int q, int m, int n)
+{
+  Element d;
+  for (int i=0;i<m;++i) {
+    for (int j=0;j<n;++j) {
+      field.init(d,randRange(0,q));
+      block.setEntry(i,j,d);
+    }
+  }
+}
+
+void randomNonSingular(Block& block, Field& field, int q, int m, int n)
+{
+  randomBlock(block,field,q,m,n);
+  long unsigned r;
+  long unsigned b=(long unsigned)(m<n?m:n);
+  std::cerr << "starting" << std::endl;
+  while (LinBox::rank(r,block,Method::BlasElimination()) < b) {
+    randomBlock(block,field,q,m,n);
+    std::cerr << "loop" << std::endl;
+  }
+}
+
+std::string fileDesc(int n, int b, double s, int q)
+{
+  std::stringstream ss;
+  ss << "n" << n;
+  ss << "b" << b;
+  int sInt=10000*(s-floor(s));
+  ss << "s" << setfill('0') << setw(4) << sInt << setw(0);
+  ss << "q" << q;
+  ss << ".txt";
+
+  return ss.str();
+}
+
+void computeMinPoly(Domain& MD,
+		    SparseMat& M,
+		    Field& F,
+		    Block& U,
+		    Block& V,
+		    std::vector<Block>& gen,
+		    std::vector<size_t>& deg,
+		    int t)
+{
+  BlackboxBlockContainer<Field,SparseMat> blockseq(&M,F,U,V);
+  BlockCoppersmithDomain<Domain,BlackboxBlockContainer<Field,SparseMat> > BCD(MD,&blockseq,t);
+
+  deg=BCD.right_minpoly(gen);
+}
+
+int main(int argc, char** argv) {
+	int seed=501;
+	int n;
+	int b;
+	int nnz;
+	double sparsity;
+	int t;
+	int q=3;
+
+	srand(seed);
+
+	static Argument args[] = {
+		{ 'n', "-n N", "Set row/col dimension of test matrix n.", TYPE_INT, &n },
+		{ 'b', "-b B", "Set block size b.", TYPE_INT, &b },
+		{ 's', "-s S", "Set the sparsity [0-1).", TYPE_DOUBLE, &sparsity },
+		{ 'q', "-q Q", "Set the field GF(p)", TYPE_INT, &q},
+		{ 't', "-t T", "Early term threshold", TYPE_INT, &t},
+		END_OF_ARGUMENTS
+	};
+
+	parseArguments (argc, argv, args);
+
+	nnz=(int)((((double)(n))*n)*sparsity);
+	std::cout << nnz << std::endl;
+
+	Field F(q);
+	Domain MD(F);
+	SparseMat M(F,n,n);
+	Block U(F,b,n),V(F,n,b);
+
+	std::vector<Block> gen;
+	std::vector<size_t> deg;
+
+	randomNonSingular(U,F,q,b,n);
+	randomNonSingular(V,F,q,n,b);
+
+	std::cerr << "done1" << std::endl;
+	MapSparse<Field> sparse(F,n,n);
+	MapSparse<Field>::generateSparseNonSingular(sparse,nnz,seed);
+	sparse.copy(M);
+	std::cerr << "done2" << std::endl;
+
+	{
+	  ofstream oF("U"+fileDesc(n,b,sparsity,q));
+	  U.write(oF);
+	  oF.close();
+	}
+
+	{
+	  ofstream oF("V"+fileDesc(n,b,sparsity,q));
+	  V.write(oF);
+	  oF.close();
+	}
+
+	{
+	  ofstream oF("M"+fileDesc(n,b,sparsity,q));
+	  M.write(oF);
+	  oF.close();
+	}
+
+	std::cerr << "done3" << std::endl;
+	computeMinPoly(MD,M,F,U,V,gen,deg,t);
+
+	{
+	  ofstream oF("MP"+fileDesc(n,b,sparsity,q));
+	  for (int i=0;i<deg.size()-1;++i) {
+	    oF << deg[i] << " ";
+	  }
+	  if (deg.size() > 0) {
+	    oF << deg[deg.size()-1];
+	  }
+	  oF << std::endl;
+
+	  for (int i=0;i<gen.size();++i) {
+	    oF << gen[i] << std::endl;
+	  }
+	}
+
+	std::cout << fileDesc(n,b,sparsity,q) << std::endl;
+	return 0;
+}
diff --git a/benchmarks/invariant-factors-benchmark.C b/benchmarks/invariant-factors-benchmark.C
new file mode 100644
index 0000000..dcdfe7b
--- /dev/null
+++ b/benchmarks/invariant-factors-benchmark.C
@@ -0,0 +1,183 @@
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <vector>
+#include <omp.h>
+
+#define __LINBOX_USE_OPENMP 1
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+
+#include "linbox/algorithms/blackbox-block-container.h"
+#include "linbox/algorithms/block-coppersmith-domain.h"
+
+#include "linbox/solutions/det.h"
+
+#include <givaro/modular.h>
+#include <givaro/givpoly1.h>
+#include <linbox/ring/givaro-poly.h>
+#include <linbox/algorithms/smith-form-kannan-bachem.h>
+
+// Computes the invariant factors of a sparse matrix (given in Matrix Market Format)
+// Effectively times: TPL_omp, BlockCoppersmithDomain and KannanBachem
+
+using namespace LinBox;
+
+typedef Givaro::Modular<double> Field;
+typedef typename Field::Element Element;
+typedef SparseMatrix<Field, SparseMatrixFormat::TPL_omp> SparseMat;
+typedef MatrixDomain<Field> Domain;
+typedef typename Domain::OwnMatrix Block;
+
+
+typedef Givaro::Modular<int32_t> BaseDom;
+typedef Givaro::Poly1Dom<BaseDom,Givaro::Dense> PolyDom;
+typedef GivaroPoly<PolyDom> Ring;
+typedef MatrixDomain<Ring> PolyMatDom;
+typedef BlasMatrix<Ring> PolyMat;
+
+
+int randRange(int start, int end)
+{
+        double rval = rand();
+        static const double NORMALIZING_CONSTANT = 1.0/(1.0+RAND_MAX);
+        double normedRVal = rval*NORMALIZING_CONSTANT;
+        double rangeSize = end-start;
+        int offset = rangeSize*normedRVal;
+        return start+offset;
+}
+
+
+void benchmarkBCD(Field& F,
+                  Domain& MD,
+                  SparseMat& M,
+                  Block& U,
+                  Block& V,
+                  std::vector<Block>& gen,
+                  std::vector<size_t>& deg,
+                  int t,
+                  int p)
+{
+	BlackboxBlockContainer<Field,SparseMat> blockseq(&M,F,U,V);
+	BlockCoppersmithDomain<Domain,BlackboxBlockContainer<Field,SparseMat> >
+		BCD(MD,&blockseq,t);
+
+	double start=omp_get_wtime();
+	deg=BCD.right_minpoly(gen);
+
+	BaseDom BD(p);
+	PolyDom PD(BD, "x");
+	Ring R(PD);
+	PolyMatDom PMD(R);
+	int b=U.rowdim();
+	int d=gen.size();
+	PolyMat MM(R,b,b);
+	Ring::Element temp;
+	temp.resize(d);
+	for (int i=0;i<b;++i) {
+		for (int j=0;j<b;++j) {
+			for (int k=0;k<d;++k) {
+				temp[k]=gen[k].getEntry(i,j);
+			}
+			MM.setEntry(i,j,temp);
+		}
+	}
+
+	SmithFormKannanBachemDomain<PolyMatDom> SFKB(PMD);
+	BlasVector<Ring> diag(R,b,R.zero);
+	SFKB.solve(diag,MM);
+	PolyDom::Type_t lcoef;
+	for (size_t i=0;i<diag.size();++i) {
+		PD.leadcoef(lcoef, diag[i]);
+		PD.divin(diag[i],lcoef);
+	}
+	double time=omp_get_wtime()-start;
+	std::cout << time << std::endl;
+	for (size_t i=0;i<diag.size();++i) {
+		R.write(std::cout,diag[i]);
+		std::cout << std::endl;
+	}
+
+	testCorrectness(F,p,M,diag[diag.size()-1],PD);
+}
+
+bool testCorrectness(Field& F,
+                     int p,
+                     SparseMat& M,
+                     Ring& minPoly
+                     PolyDom& PD)
+{
+	int n=M.rowdim();
+	Element d,e;
+	F.init(d,0);
+	BlasVector<Element> v(F,n,d),sum(F,n,d),vPrime(F,n,d);
+	for (int i=0;i<n;++i) {
+		F.init(v[i],randRange(0,p));
+	}
+	for (int i=0;i<=PD.degree(minPoly);++i) {
+		PD.getEntry(d,i,minPoly);
+		for (int j=0;j<n;++j) {
+			F.mul(e,d,v[j]);
+			F.addin(sum[j],e);
+		}
+		M.apply(vPrime,v);
+		for (int j=0;j<n;++j) {
+			v[j]=vPrime[j]
+		}
+	}
+	for (int i=0;i<n;++i) {
+		if (!F.isZero(v[i])) {
+			return false;
+		}
+	}
+	return true;
+}
+
+int main(int argc, char** argv)
+{
+	int earlyTerm;
+	int p;
+	std::string uFname,vFname,mFname;
+
+	static Argument args[] = {
+		{ 'p', "-p P", "Set the field GF(p)", TYPE_INT, &p},
+		{ 't', "-t T", "Early term threshold", TYPE_INT, &earlyTerm},
+		{ 'm', "-m M", "Name of file for matrix M", TYPE_STR, &mFname},
+		{ 'u', "-u U", "Name of file for matrix U", TYPE_STR, &uFname},
+		{ 'v', "-v V", "Name of file for matrix V", TYPE_STR, &vFname},
+		END_OF_ARGUMENTS
+	};
+
+	parseArguments(argc,argv,args);
+
+	Field F(p);
+	Domain MD(F);
+	SparseMat M(F);
+	Block U(F),V(F);
+
+	{
+		ifstream iF(mFname);
+		M.read(iF);
+		M.finalize();
+		iF.close();
+	}
+	{
+		ifstream iF(uFname);
+		U.read(iF);
+		iF.close();
+	}
+	{
+		ifstream iF(vFname);
+		V.read(iF);
+		iF.close();
+	}
+
+	std::vector<Block> gen;
+	std::vector<size_t> deg;
+
+	benchmarkBCD(F,MD,M,U,V,gen,deg,earlyTerm,p);
+
+	return 0;
+}
diff --git a/benchmarks/matrix/Makefile.am b/benchmarks/matrix/Makefile.am
new file mode 100644
index 0000000..90cf860
--- /dev/null
+++ b/benchmarks/matrix/Makefile.am
@@ -0,0 +1,22 @@
+# Copyright (c) 2013 the LinBox group
+# Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the  GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# ========LICENCE========
+#/
+
+
diff --git a/benchmarks/matrix/bibd_12_5_66x792.sms b/benchmarks/matrix/bibd_12_5_66x792.sms
new file mode 100644
index 0000000..81bc947
--- /dev/null
+++ b/benchmarks/matrix/bibd_12_5_66x792.sms
@@ -0,0 +1,7922 @@
+66 792 M
+1 1 1
+1 2 1
+1 3 1
+1 4 1
+1 5 1
+1 6 1
+1 7 1
+1 8 1
+1 9 1
+1 10 1
+1 11 1
+1 12 1
+1 13 1
+1 14 1
+1 15 1
+1 16 1
+1 17 1
+1 18 1
+1 19 1
+1 20 1
+1 21 1
+1 22 1
+1 23 1
+1 24 1
+1 25 1
+1 26 1
+1 27 1
+1 28 1
+1 29 1
+1 30 1
+1 31 1
+1 32 1
+1 33 1
+1 34 1
+1 35 1
+1 36 1
+1 37 1
+1 38 1
+1 39 1
+1 40 1
+1 41 1
+1 42 1
+1 43 1
+1 44 1
+1 45 1
+1 46 1
+1 47 1
+1 48 1
+1 49 1
+1 50 1
+1 51 1
+1 52 1
+1 53 1
+1 54 1
+1 55 1
+1 56 1
+1 57 1
+1 58 1
+1 59 1
+1 60 1
+1 61 1
+1 62 1
+1 63 1
+1 64 1
+1 65 1
+1 66 1
+1 67 1
+1 68 1
+1 69 1
+1 70 1
+1 71 1
+1 72 1
+1 73 1
+1 74 1
+1 75 1
+1 76 1
+1 77 1
+1 78 1
+1 79 1
+1 80 1
+1 81 1
+1 82 1
+1 83 1
+1 84 1
+1 85 1
+1 86 1
+1 87 1
+1 88 1
+1 89 1
+1 90 1
+1 91 1
+1 92 1
+1 93 1
+1 94 1
+1 95 1
+1 96 1
+1 97 1
+1 98 1
+1 99 1
+1 100 1
+1 101 1
+1 102 1
+1 103 1
+1 104 1
+1 105 1
+1 106 1
+1 107 1
+1 108 1
+1 109 1
+1 110 1
+1 111 1
+1 112 1
+1 113 1
+1 114 1
+1 115 1
+1 116 1
+1 117 1
+1 118 1
+1 119 1
+1 120 1
+2 1 1
+2 2 1
+2 3 1
+2 4 1
+2 5 1
+2 6 1
+2 7 1
+2 8 1
+2 9 1
+2 10 1
+2 11 1
+2 12 1
+2 13 1
+2 14 1
+2 15 1
+2 16 1
+2 17 1
+2 18 1
+2 19 1
+2 20 1
+2 21 1
+2 22 1
+2 23 1
+2 24 1
+2 25 1
+2 26 1
+2 27 1
+2 28 1
+2 29 1
+2 30 1
+2 31 1
+2 32 1
+2 33 1
+2 34 1
+2 35 1
+2 36 1
+2 121 1
+2 122 1
+2 123 1
+2 124 1
+2 125 1
+2 126 1
+2 127 1
+2 128 1
+2 129 1
+2 130 1
+2 131 1
+2 132 1
+2 133 1
+2 134 1
+2 135 1
+2 136 1
+2 137 1
+2 138 1
+2 139 1
+2 140 1
+2 141 1
+2 142 1
+2 143 1
+2 144 1
+2 145 1
+2 146 1
+2 147 1
+2 148 1
+2 149 1
+2 150 1
+2 151 1
+2 152 1
+2 153 1
+2 154 1
+2 155 1
+2 156 1
+2 157 1
+2 158 1
+2 159 1
+2 160 1
+2 161 1
+2 162 1
+2 163 1
+2 164 1
+2 165 1
+2 166 1
+2 167 1
+2 168 1
+2 169 1
+2 170 1
+2 171 1
+2 172 1
+2 173 1
+2 174 1
+2 175 1
+2 176 1
+2 177 1
+2 178 1
+2 179 1
+2 180 1
+2 181 1
+2 182 1
+2 183 1
+2 184 1
+2 185 1
+2 186 1
+2 187 1
+2 188 1
+2 189 1
+2 190 1
+2 191 1
+2 192 1
+2 193 1
+2 194 1
+2 195 1
+2 196 1
+2 197 1
+2 198 1
+2 199 1
+2 200 1
+2 201 1
+2 202 1
+2 203 1
+2 204 1
+3 1 1
+3 2 1
+3 3 1
+3 4 1
+3 5 1
+3 6 1
+3 7 1
+3 8 1
+3 37 1
+3 38 1
+3 39 1
+3 40 1
+3 41 1
+3 42 1
+3 43 1
+3 44 1
+3 45 1
+3 46 1
+3 47 1
+3 48 1
+3 49 1
+3 50 1
+3 51 1
+3 52 1
+3 53 1
+3 54 1
+3 55 1
+3 56 1
+3 57 1
+3 58 1
+3 59 1
+3 60 1
+3 61 1
+3 62 1
+3 63 1
+3 64 1
+3 121 1
+3 122 1
+3 123 1
+3 124 1
+3 125 1
+3 126 1
+3 127 1
+3 128 1
+3 129 1
+3 130 1
+3 131 1
+3 132 1
+3 133 1
+3 134 1
+3 135 1
+3 136 1
+3 137 1
+3 138 1
+3 139 1
+3 140 1
+3 141 1
+3 142 1
+3 143 1
+3 144 1
+3 145 1
+3 146 1
+3 147 1
+3 148 1
+3 205 1
+3 206 1
+3 207 1
+3 208 1
+3 209 1
+3 210 1
+3 211 1
+3 212 1
+3 213 1
+3 214 1
+3 215 1
+3 216 1
+3 217 1
+3 218 1
+3 219 1
+3 220 1
+3 221 1
+3 222 1
+3 223 1
+3 224 1
+3 225 1
+3 226 1
+3 227 1
+3 228 1
+3 229 1
+3 230 1
+3 231 1
+3 232 1
+3 233 1
+3 234 1
+3 235 1
+3 236 1
+3 237 1
+3 238 1
+3 239 1
+3 240 1
+3 241 1
+3 242 1
+3 243 1
+3 244 1
+3 245 1
+3 246 1
+3 247 1
+3 248 1
+3 249 1
+3 250 1
+3 251 1
+3 252 1
+3 253 1
+3 254 1
+3 255 1
+3 256 1
+3 257 1
+3 258 1
+3 259 1
+3 260 1
+4 1 1
+4 9 1
+4 10 1
+4 11 1
+4 12 1
+4 13 1
+4 14 1
+4 15 1
+4 37 1
+4 38 1
+4 39 1
+4 40 1
+4 41 1
+4 42 1
+4 43 1
+4 65 1
+4 66 1
+4 67 1
+4 68 1
+4 69 1
+4 70 1
+4 71 1
+4 72 1
+4 73 1
+4 74 1
+4 75 1
+4 76 1
+4 77 1
+4 78 1
+4 79 1
+4 80 1
+4 81 1
+4 82 1
+4 83 1
+4 84 1
+4 85 1
+4 121 1
+4 122 1
+4 123 1
+4 124 1
+4 125 1
+4 126 1
+4 127 1
+4 149 1
+4 150 1
+4 151 1
+4 152 1
+4 153 1
+4 154 1
+4 155 1
+4 156 1
+4 157 1
+4 158 1
+4 159 1
+4 160 1
+4 161 1
+4 162 1
+4 163 1
+4 164 1
+4 165 1
+4 166 1
+4 167 1
+4 168 1
+4 169 1
+4 205 1
+4 206 1
+4 207 1
+4 208 1
+4 209 1
+4 210 1
+4 211 1
+4 212 1
+4 213 1
+4 214 1
+4 215 1
+4 216 1
+4 217 1
+4 218 1
+4 219 1
+4 220 1
+4 221 1
+4 222 1
+4 223 1
+4 224 1
+4 225 1
+4 261 1
+4 262 1
+4 263 1
+4 264 1
+4 265 1
+4 266 1
+4 267 1
+4 268 1
+4 269 1
+4 270 1
+4 271 1
+4 272 1
+4 273 1
+4 274 1
+4 275 1
+4 276 1
+4 277 1
+4 278 1
+4 279 1
+4 280 1
+4 281 1
+4 282 1
+4 283 1
+4 284 1
+4 285 1
+4 286 1
+4 287 1
+4 288 1
+4 289 1
+4 290 1
+4 291 1
+4 292 1
+4 293 1
+4 294 1
+4 295 1
+5 2 1
+5 9 1
+5 16 1
+5 17 1
+5 18 1
+5 19 1
+5 20 1
+5 21 1
+5 37 1
+5 44 1
+5 45 1
+5 46 1
+5 47 1
+5 48 1
+5 49 1
+5 65 1
+5 66 1
+5 67 1
+5 68 1
+5 69 1
+5 70 1
+5 86 1
+5 87 1
+5 88 1
+5 89 1
+5 90 1
+5 91 1
+5 92 1
+5 93 1
+5 94 1
+5 95 1
+5 96 1
+5 97 1
+5 98 1
+5 99 1
+5 100 1
+5 121 1
+5 128 1
+5 129 1
+5 130 1
+5 131 1
+5 132 1
+5 133 1
+5 149 1
+5 150 1
+5 151 1
+5 152 1
+5 153 1
+5 154 1
+5 170 1
+5 171 1
+5 172 1
+5 173 1
+5 174 1
+5 175 1
+5 176 1
+5 177 1
+5 178 1
+5 179 1
+5 180 1
+5 181 1
+5 182 1
+5 183 1
+5 184 1
+5 205 1
+5 206 1
+5 207 1
+5 208 1
+5 209 1
+5 210 1
+5 226 1
+5 227 1
+5 228 1
+5 229 1
+5 230 1
+5 231 1
+5 232 1
+5 233 1
+5 234 1
+5 235 1
+5 236 1
+5 237 1
+5 238 1
+5 239 1
+5 240 1
+5 261 1
+5 262 1
+5 263 1
+5 264 1
+5 265 1
+5 266 1
+5 267 1
+5 268 1
+5 269 1
+5 270 1
+5 271 1
+5 272 1
+5 273 1
+5 274 1
+5 275 1
+5 296 1
+5 297 1
+5 298 1
+5 299 1
+5 300 1
+5 301 1
+5 302 1
+5 303 1
+5 304 1
+5 305 1
+5 306 1
+5 307 1
+5 308 1
+5 309 1
+5 310 1
+5 311 1
+5 312 1
+5 313 1
+5 314 1
+5 315 1
+6 3 1
+6 10 1
+6 16 1
+6 22 1
+6 23 1
+6 24 1
+6 25 1
+6 26 1
+6 38 1
+6 44 1
+6 50 1
+6 51 1
+6 52 1
+6 53 1
+6 54 1
+6 65 1
+6 71 1
+6 72 1
+6 73 1
+6 74 1
+6 75 1
+6 86 1
+6 87 1
+6 88 1
+6 89 1
+6 90 1
+6 101 1
+6 102 1
+6 103 1
+6 104 1
+6 105 1
+6 106 1
+6 107 1
+6 108 1
+6 109 1
+6 110 1
+6 122 1
+6 128 1
+6 134 1
+6 135 1
+6 136 1
+6 137 1
+6 138 1
+6 149 1
+6 155 1
+6 156 1
+6 157 1
+6 158 1
+6 159 1
+6 170 1
+6 171 1
+6 172 1
+6 173 1
+6 174 1
+6 185 1
+6 186 1
+6 187 1
+6 188 1
+6 189 1
+6 190 1
+6 191 1
+6 192 1
+6 193 1
+6 194 1
+6 205 1
+6 211 1
+6 212 1
+6 213 1
+6 214 1
+6 215 1
+6 226 1
+6 227 1
+6 228 1
+6 229 1
+6 230 1
+6 241 1
+6 242 1
+6 243 1
+6 244 1
+6 245 1
+6 246 1
+6 247 1
+6 248 1
+6 249 1
+6 250 1
+6 261 1
+6 262 1
+6 263 1
+6 264 1
+6 265 1
+6 276 1
+6 277 1
+6 278 1
+6 279 1
+6 280 1
+6 281 1
+6 282 1
+6 283 1
+6 284 1
+6 285 1
+6 296 1
+6 297 1
+6 298 1
+6 299 1
+6 300 1
+6 301 1
+6 302 1
+6 303 1
+6 304 1
+6 305 1
+6 316 1
+6 317 1
+6 318 1
+6 319 1
+6 320 1
+6 321 1
+6 322 1
+6 323 1
+6 324 1
+6 325 1
+7 4 1
+7 11 1
+7 17 1
+7 22 1
+7 27 1
+7 28 1
+7 29 1
+7 30 1
+7 39 1
+7 45 1
+7 50 1
+7 55 1
+7 56 1
+7 57 1
+7 58 1
+7 66 1
+7 71 1
+7 76 1
+7 77 1
+7 78 1
+7 79 1
+7 86 1
+7 91 1
+7 92 1
+7 93 1
+7 94 1
+7 101 1
+7 102 1
+7 103 1
+7 104 1
+7 111 1
+7 112 1
+7 113 1
+7 114 1
+7 115 1
+7 116 1
+7 123 1
+7 129 1
+7 134 1
+7 139 1
+7 140 1
+7 141 1
+7 142 1
+7 150 1
+7 155 1
+7 160 1
+7 161 1
+7 162 1
+7 163 1
+7 170 1
+7 175 1
+7 176 1
+7 177 1
+7 178 1
+7 185 1
+7 186 1
+7 187 1
+7 188 1
+7 195 1
+7 196 1
+7 197 1
+7 198 1
+7 199 1
+7 200 1
+7 206 1
+7 211 1
+7 216 1
+7 217 1
+7 218 1
+7 219 1
+7 226 1
+7 231 1
+7 232 1
+7 233 1
+7 234 1
+7 241 1
+7 242 1
+7 243 1
+7 244 1
+7 251 1
+7 252 1
+7 253 1
+7 254 1
+7 255 1
+7 256 1
+7 261 1
+7 266 1
+7 267 1
+7 268 1
+7 269 1
+7 276 1
+7 277 1
+7 278 1
+7 279 1
+7 286 1
+7 287 1
+7 288 1
+7 289 1
+7 290 1
+7 291 1
+7 296 1
+7 297 1
+7 298 1
+7 299 1
+7 306 1
+7 307 1
+7 308 1
+7 309 1
+7 310 1
+7 311 1
+7 316 1
+7 317 1
+7 318 1
+7 319 1
+7 320 1
+7 321 1
+7 326 1
+7 327 1
+7 328 1
+7 329 1
+8 5 1
+8 12 1
+8 18 1
+8 23 1
+8 27 1
+8 31 1
+8 32 1
+8 33 1
+8 40 1
+8 46 1
+8 51 1
+8 55 1
+8 59 1
+8 60 1
+8 61 1
+8 67 1
+8 72 1
+8 76 1
+8 80 1
+8 81 1
+8 82 1
+8 87 1
+8 91 1
+8 95 1
+8 96 1
+8 97 1
+8 101 1
+8 105 1
+8 106 1
+8 107 1
+8 111 1
+8 112 1
+8 113 1
+8 117 1
+8 118 1
+8 119 1
+8 124 1
+8 130 1
+8 135 1
+8 139 1
+8 143 1
+8 144 1
+8 145 1
+8 151 1
+8 156 1
+8 160 1
+8 164 1
+8 165 1
+8 166 1
+8 171 1
+8 175 1
+8 179 1
+8 180 1
+8 181 1
+8 185 1
+8 189 1
+8 190 1
+8 191 1
+8 195 1
+8 196 1
+8 197 1
+8 201 1
+8 202 1
+8 203 1
+8 207 1
+8 212 1
+8 216 1
+8 220 1
+8 221 1
+8 222 1
+8 227 1
+8 231 1
+8 235 1
+8 236 1
+8 237 1
+8 241 1
+8 245 1
+8 246 1
+8 247 1
+8 251 1
+8 252 1
+8 253 1
+8 257 1
+8 258 1
+8 259 1
+8 262 1
+8 266 1
+8 270 1
+8 271 1
+8 272 1
+8 276 1
+8 280 1
+8 281 1
+8 282 1
+8 286 1
+8 287 1
+8 288 1
+8 292 1
+8 293 1
+8 294 1
+8 296 1
+8 300 1
+8 301 1
+8 302 1
+8 306 1
+8 307 1
+8 308 1
+8 312 1
+8 313 1
+8 314 1
+8 316 1
+8 317 1
+8 318 1
+8 322 1
+8 323 1
+8 324 1
+8 326 1
+8 327 1
+8 328 1
+8 330 1
+9 6 1
+9 13 1
+9 19 1
+9 24 1
+9 28 1
+9 31 1
+9 34 1
+9 35 1
+9 41 1
+9 47 1
+9 52 1
+9 56 1
+9 59 1
+9 62 1
+9 63 1
+9 68 1
+9 73 1
+9 77 1
+9 80 1
+9 83 1
+9 84 1
+9 88 1
+9 92 1
+9 95 1
+9 98 1
+9 99 1
+9 102 1
+9 105 1
+9 108 1
+9 109 1
+9 111 1
+9 114 1
+9 115 1
+9 117 1
+9 118 1
+9 120 1
+9 125 1
+9 131 1
+9 136 1
+9 140 1
+9 143 1
+9 146 1
+9 147 1
+9 152 1
+9 157 1
+9 161 1
+9 164 1
+9 167 1
+9 168 1
+9 172 1
+9 176 1
+9 179 1
+9 182 1
+9 183 1
+9 186 1
+9 189 1
+9 192 1
+9 193 1
+9 195 1
+9 198 1
+9 199 1
+9 201 1
+9 202 1
+9 204 1
+9 208 1
+9 213 1
+9 217 1
+9 220 1
+9 223 1
+9 224 1
+9 228 1
+9 232 1
+9 235 1
+9 238 1
+9 239 1
+9 242 1
+9 245 1
+9 248 1
+9 249 1
+9 251 1
+9 254 1
+9 255 1
+9 257 1
+9 258 1
+9 260 1
+9 263 1
+9 267 1
+9 270 1
+9 273 1
+9 274 1
+9 277 1
+9 280 1
+9 283 1
+9 284 1
+9 286 1
+9 289 1
+9 290 1
+9 292 1
+9 293 1
+9 295 1
+9 297 1
+9 300 1
+9 303 1
+9 304 1
+9 306 1
+9 309 1
+9 310 1
+9 312 1
+9 313 1
+9 315 1
+9 316 1
+9 319 1
+9 320 1
+9 322 1
+9 323 1
+9 325 1
+9 326 1
+9 327 1
+9 329 1
+9 330 1
+10 7 1
+10 14 1
+10 20 1
+10 25 1
+10 29 1
+10 32 1
+10 34 1
+10 36 1
+10 42 1
+10 48 1
+10 53 1
+10 57 1
+10 60 1
+10 62 1
+10 64 1
+10 69 1
+10 74 1
+10 78 1
+10 81 1
+10 83 1
+10 85 1
+10 89 1
+10 93 1
+10 96 1
+10 98 1
+10 100 1
+10 103 1
+10 106 1
+10 108 1
+10 110 1
+10 112 1
+10 114 1
+10 116 1
+10 117 1
+10 119 1
+10 120 1
+10 126 1
+10 132 1
+10 137 1
+10 141 1
+10 144 1
+10 146 1
+10 148 1
+10 153 1
+10 158 1
+10 162 1
+10 165 1
+10 167 1
+10 169 1
+10 173 1
+10 177 1
+10 180 1
+10 182 1
+10 184 1
+10 187 1
+10 190 1
+10 192 1
+10 194 1
+10 196 1
+10 198 1
+10 200 1
+10 201 1
+10 203 1
+10 204 1
+10 209 1
+10 214 1
+10 218 1
+10 221 1
+10 223 1
+10 225 1
+10 229 1
+10 233 1
+10 236 1
+10 238 1
+10 240 1
+10 243 1
+10 246 1
+10 248 1
+10 250 1
+10 252 1
+10 254 1
+10 256 1
+10 257 1
+10 259 1
+10 260 1
+10 264 1
+10 268 1
+10 271 1
+10 273 1
+10 275 1
+10 278 1
+10 281 1
+10 283 1
+10 285 1
+10 287 1
+10 289 1
+10 291 1
+10 292 1
+10 294 1
+10 295 1
+10 298 1
+10 301 1
+10 303 1
+10 305 1
+10 307 1
+10 309 1
+10 311 1
+10 312 1
+10 314 1
+10 315 1
+10 317 1
+10 319 1
+10 321 1
+10 322 1
+10 324 1
+10 325 1
+10 326 1
+10 328 1
+10 329 1
+10 330 1
+11 8 1
+11 15 1
+11 21 1
+11 26 1
+11 30 1
+11 33 1
+11 35 1
+11 36 1
+11 43 1
+11 49 1
+11 54 1
+11 58 1
+11 61 1
+11 63 1
+11 64 1
+11 70 1
+11 75 1
+11 79 1
+11 82 1
+11 84 1
+11 85 1
+11 90 1
+11 94 1
+11 97 1
+11 99 1
+11 100 1
+11 104 1
+11 107 1
+11 109 1
+11 110 1
+11 113 1
+11 115 1
+11 116 1
+11 118 1
+11 119 1
+11 120 1
+11 127 1
+11 133 1
+11 138 1
+11 142 1
+11 145 1
+11 147 1
+11 148 1
+11 154 1
+11 159 1
+11 163 1
+11 166 1
+11 168 1
+11 169 1
+11 174 1
+11 178 1
+11 181 1
+11 183 1
+11 184 1
+11 188 1
+11 191 1
+11 193 1
+11 194 1
+11 197 1
+11 199 1
+11 200 1
+11 202 1
+11 203 1
+11 204 1
+11 210 1
+11 215 1
+11 219 1
+11 222 1
+11 224 1
+11 225 1
+11 230 1
+11 234 1
+11 237 1
+11 239 1
+11 240 1
+11 244 1
+11 247 1
+11 249 1
+11 250 1
+11 253 1
+11 255 1
+11 256 1
+11 258 1
+11 259 1
+11 260 1
+11 265 1
+11 269 1
+11 272 1
+11 274 1
+11 275 1
+11 279 1
+11 282 1
+11 284 1
+11 285 1
+11 288 1
+11 290 1
+11 291 1
+11 293 1
+11 294 1
+11 295 1
+11 299 1
+11 302 1
+11 304 1
+11 305 1
+11 308 1
+11 310 1
+11 311 1
+11 313 1
+11 314 1
+11 315 1
+11 318 1
+11 320 1
+11 321 1
+11 323 1
+11 324 1
+11 325 1
+11 327 1
+11 328 1
+11 329 1
+11 330 1
+12 1 1
+12 2 1
+12 3 1
+12 4 1
+12 5 1
+12 6 1
+12 7 1
+12 8 1
+12 9 1
+12 10 1
+12 11 1
+12 12 1
+12 13 1
+12 14 1
+12 15 1
+12 16 1
+12 17 1
+12 18 1
+12 19 1
+12 20 1
+12 21 1
+12 22 1
+12 23 1
+12 24 1
+12 25 1
+12 26 1
+12 27 1
+12 28 1
+12 29 1
+12 30 1
+12 31 1
+12 32 1
+12 33 1
+12 34 1
+12 35 1
+12 36 1
+12 331 1
+12 332 1
+12 333 1
+12 334 1
+12 335 1
+12 336 1
+12 337 1
+12 338 1
+12 339 1
+12 340 1
+12 341 1
+12 342 1
+12 343 1
+12 344 1
+12 345 1
+12 346 1
+12 347 1
+12 348 1
+12 349 1
+12 350 1
+12 351 1
+12 352 1
+12 353 1
+12 354 1
+12 355 1
+12 356 1
+12 357 1
+12 358 1
+12 359 1
+12 360 1
+12 361 1
+12 362 1
+12 363 1
+12 364 1
+12 365 1
+12 366 1
+12 367 1
+12 368 1
+12 369 1
+12 370 1
+12 371 1
+12 372 1
+12 373 1
+12 374 1
+12 375 1
+12 376 1
+12 377 1
+12 378 1
+12 379 1
+12 380 1
+12 381 1
+12 382 1
+12 383 1
+12 384 1
+12 385 1
+12 386 1
+12 387 1
+12 388 1
+12 389 1
+12 390 1
+12 391 1
+12 392 1
+12 393 1
+12 394 1
+12 395 1
+12 396 1
+12 397 1
+12 398 1
+12 399 1
+12 400 1
+12 401 1
+12 402 1
+12 403 1
+12 404 1
+12 405 1
+12 406 1
+12 407 1
+12 408 1
+12 409 1
+12 410 1
+12 411 1
+12 412 1
+12 413 1
+12 414 1
+13 1 1
+13 2 1
+13 3 1
+13 4 1
+13 5 1
+13 6 1
+13 7 1
+13 8 1
+13 37 1
+13 38 1
+13 39 1
+13 40 1
+13 41 1
+13 42 1
+13 43 1
+13 44 1
+13 45 1
+13 46 1
+13 47 1
+13 48 1
+13 49 1
+13 50 1
+13 51 1
+13 52 1
+13 53 1
+13 54 1
+13 55 1
+13 56 1
+13 57 1
+13 58 1
+13 59 1
+13 60 1
+13 61 1
+13 62 1
+13 63 1
+13 64 1
+13 331 1
+13 332 1
+13 333 1
+13 334 1
+13 335 1
+13 336 1
+13 337 1
+13 338 1
+13 339 1
+13 340 1
+13 341 1
+13 342 1
+13 343 1
+13 344 1
+13 345 1
+13 346 1
+13 347 1
+13 348 1
+13 349 1
+13 350 1
+13 351 1
+13 352 1
+13 353 1
+13 354 1
+13 355 1
+13 356 1
+13 357 1
+13 358 1
+13 415 1
+13 416 1
+13 417 1
+13 418 1
+13 419 1
+13 420 1
+13 421 1
+13 422 1
+13 423 1
+13 424 1
+13 425 1
+13 426 1
+13 427 1
+13 428 1
+13 429 1
+13 430 1
+13 431 1
+13 432 1
+13 433 1
+13 434 1
+13 435 1
+13 436 1
+13 437 1
+13 438 1
+13 439 1
+13 440 1
+13 441 1
+13 442 1
+13 443 1
+13 444 1
+13 445 1
+13 446 1
+13 447 1
+13 448 1
+13 449 1
+13 450 1
+13 451 1
+13 452 1
+13 453 1
+13 454 1
+13 455 1
+13 456 1
+13 457 1
+13 458 1
+13 459 1
+13 460 1
+13 461 1
+13 462 1
+13 463 1
+13 464 1
+13 465 1
+13 466 1
+13 467 1
+13 468 1
+13 469 1
+13 470 1
+14 1 1
+14 9 1
+14 10 1
+14 11 1
+14 12 1
+14 13 1
+14 14 1
+14 15 1
+14 37 1
+14 38 1
+14 39 1
+14 40 1
+14 41 1
+14 42 1
+14 43 1
+14 65 1
+14 66 1
+14 67 1
+14 68 1
+14 69 1
+14 70 1
+14 71 1
+14 72 1
+14 73 1
+14 74 1
+14 75 1
+14 76 1
+14 77 1
+14 78 1
+14 79 1
+14 80 1
+14 81 1
+14 82 1
+14 83 1
+14 84 1
+14 85 1
+14 331 1
+14 332 1
+14 333 1
+14 334 1
+14 335 1
+14 336 1
+14 337 1
+14 359 1
+14 360 1
+14 361 1
+14 362 1
+14 363 1
+14 364 1
+14 365 1
+14 366 1
+14 367 1
+14 368 1
+14 369 1
+14 370 1
+14 371 1
+14 372 1
+14 373 1
+14 374 1
+14 375 1
+14 376 1
+14 377 1
+14 378 1
+14 379 1
+14 415 1
+14 416 1
+14 417 1
+14 418 1
+14 419 1
+14 420 1
+14 421 1
+14 422 1
+14 423 1
+14 424 1
+14 425 1
+14 426 1
+14 427 1
+14 428 1
+14 429 1
+14 430 1
+14 431 1
+14 432 1
+14 433 1
+14 434 1
+14 435 1
+14 471 1
+14 472 1
+14 473 1
+14 474 1
+14 475 1
+14 476 1
+14 477 1
+14 478 1
+14 479 1
+14 480 1
+14 481 1
+14 482 1
+14 483 1
+14 484 1
+14 485 1
+14 486 1
+14 487 1
+14 488 1
+14 489 1
+14 490 1
+14 491 1
+14 492 1
+14 493 1
+14 494 1
+14 495 1
+14 496 1
+14 497 1
+14 498 1
+14 499 1
+14 500 1
+14 501 1
+14 502 1
+14 503 1
+14 504 1
+14 505 1
+15 2 1
+15 9 1
+15 16 1
+15 17 1
+15 18 1
+15 19 1
+15 20 1
+15 21 1
+15 37 1
+15 44 1
+15 45 1
+15 46 1
+15 47 1
+15 48 1
+15 49 1
+15 65 1
+15 66 1
+15 67 1
+15 68 1
+15 69 1
+15 70 1
+15 86 1
+15 87 1
+15 88 1
+15 89 1
+15 90 1
+15 91 1
+15 92 1
+15 93 1
+15 94 1
+15 95 1
+15 96 1
+15 97 1
+15 98 1
+15 99 1
+15 100 1
+15 331 1
+15 338 1
+15 339 1
+15 340 1
+15 341 1
+15 342 1
+15 343 1
+15 359 1
+15 360 1
+15 361 1
+15 362 1
+15 363 1
+15 364 1
+15 380 1
+15 381 1
+15 382 1
+15 383 1
+15 384 1
+15 385 1
+15 386 1
+15 387 1
+15 388 1
+15 389 1
+15 390 1
+15 391 1
+15 392 1
+15 393 1
+15 394 1
+15 415 1
+15 416 1
+15 417 1
+15 418 1
+15 419 1
+15 420 1
+15 436 1
+15 437 1
+15 438 1
+15 439 1
+15 440 1
+15 441 1
+15 442 1
+15 443 1
+15 444 1
+15 445 1
+15 446 1
+15 447 1
+15 448 1
+15 449 1
+15 450 1
+15 471 1
+15 472 1
+15 473 1
+15 474 1
+15 475 1
+15 476 1
+15 477 1
+15 478 1
+15 479 1
+15 480 1
+15 481 1
+15 482 1
+15 483 1
+15 484 1
+15 485 1
+15 506 1
+15 507 1
+15 508 1
+15 509 1
+15 510 1
+15 511 1
+15 512 1
+15 513 1
+15 514 1
+15 515 1
+15 516 1
+15 517 1
+15 518 1
+15 519 1
+15 520 1
+15 521 1
+15 522 1
+15 523 1
+15 524 1
+15 525 1
+16 3 1
+16 10 1
+16 16 1
+16 22 1
+16 23 1
+16 24 1
+16 25 1
+16 26 1
+16 38 1
+16 44 1
+16 50 1
+16 51 1
+16 52 1
+16 53 1
+16 54 1
+16 65 1
+16 71 1
+16 72 1
+16 73 1
+16 74 1
+16 75 1
+16 86 1
+16 87 1
+16 88 1
+16 89 1
+16 90 1
+16 101 1
+16 102 1
+16 103 1
+16 104 1
+16 105 1
+16 106 1
+16 107 1
+16 108 1
+16 109 1
+16 110 1
+16 332 1
+16 338 1
+16 344 1
+16 345 1
+16 346 1
+16 347 1
+16 348 1
+16 359 1
+16 365 1
+16 366 1
+16 367 1
+16 368 1
+16 369 1
+16 380 1
+16 381 1
+16 382 1
+16 383 1
+16 384 1
+16 395 1
+16 396 1
+16 397 1
+16 398 1
+16 399 1
+16 400 1
+16 401 1
+16 402 1
+16 403 1
+16 404 1
+16 415 1
+16 421 1
+16 422 1
+16 423 1
+16 424 1
+16 425 1
+16 436 1
+16 437 1
+16 438 1
+16 439 1
+16 440 1
+16 451 1
+16 452 1
+16 453 1
+16 454 1
+16 455 1
+16 456 1
+16 457 1
+16 458 1
+16 459 1
+16 460 1
+16 471 1
+16 472 1
+16 473 1
+16 474 1
+16 475 1
+16 486 1
+16 487 1
+16 488 1
+16 489 1
+16 490 1
+16 491 1
+16 492 1
+16 493 1
+16 494 1
+16 495 1
+16 506 1
+16 507 1
+16 508 1
+16 509 1
+16 510 1
+16 511 1
+16 512 1
+16 513 1
+16 514 1
+16 515 1
+16 526 1
+16 527 1
+16 528 1
+16 529 1
+16 530 1
+16 531 1
+16 532 1
+16 533 1
+16 534 1
+16 535 1
+17 4 1
+17 11 1
+17 17 1
+17 22 1
+17 27 1
+17 28 1
+17 29 1
+17 30 1
+17 39 1
+17 45 1
+17 50 1
+17 55 1
+17 56 1
+17 57 1
+17 58 1
+17 66 1
+17 71 1
+17 76 1
+17 77 1
+17 78 1
+17 79 1
+17 86 1
+17 91 1
+17 92 1
+17 93 1
+17 94 1
+17 101 1
+17 102 1
+17 103 1
+17 104 1
+17 111 1
+17 112 1
+17 113 1
+17 114 1
+17 115 1
+17 116 1
+17 333 1
+17 339 1
+17 344 1
+17 349 1
+17 350 1
+17 351 1
+17 352 1
+17 360 1
+17 365 1
+17 370 1
+17 371 1
+17 372 1
+17 373 1
+17 380 1
+17 385 1
+17 386 1
+17 387 1
+17 388 1
+17 395 1
+17 396 1
+17 397 1
+17 398 1
+17 405 1
+17 406 1
+17 407 1
+17 408 1
+17 409 1
+17 410 1
+17 416 1
+17 421 1
+17 426 1
+17 427 1
+17 428 1
+17 429 1
+17 436 1
+17 441 1
+17 442 1
+17 443 1
+17 444 1
+17 451 1
+17 452 1
+17 453 1
+17 454 1
+17 461 1
+17 462 1
+17 463 1
+17 464 1
+17 465 1
+17 466 1
+17 471 1
+17 476 1
+17 477 1
+17 478 1
+17 479 1
+17 486 1
+17 487 1
+17 488 1
+17 489 1
+17 496 1
+17 497 1
+17 498 1
+17 499 1
+17 500 1
+17 501 1
+17 506 1
+17 507 1
+17 508 1
+17 509 1
+17 516 1
+17 517 1
+17 518 1
+17 519 1
+17 520 1
+17 521 1
+17 526 1
+17 527 1
+17 528 1
+17 529 1
+17 530 1
+17 531 1
+17 536 1
+17 537 1
+17 538 1
+17 539 1
+18 5 1
+18 12 1
+18 18 1
+18 23 1
+18 27 1
+18 31 1
+18 32 1
+18 33 1
+18 40 1
+18 46 1
+18 51 1
+18 55 1
+18 59 1
+18 60 1
+18 61 1
+18 67 1
+18 72 1
+18 76 1
+18 80 1
+18 81 1
+18 82 1
+18 87 1
+18 91 1
+18 95 1
+18 96 1
+18 97 1
+18 101 1
+18 105 1
+18 106 1
+18 107 1
+18 111 1
+18 112 1
+18 113 1
+18 117 1
+18 118 1
+18 119 1
+18 334 1
+18 340 1
+18 345 1
+18 349 1
+18 353 1
+18 354 1
+18 355 1
+18 361 1
+18 366 1
+18 370 1
+18 374 1
+18 375 1
+18 376 1
+18 381 1
+18 385 1
+18 389 1
+18 390 1
+18 391 1
+18 395 1
+18 399 1
+18 400 1
+18 401 1
+18 405 1
+18 406 1
+18 407 1
+18 411 1
+18 412 1
+18 413 1
+18 417 1
+18 422 1
+18 426 1
+18 430 1
+18 431 1
+18 432 1
+18 437 1
+18 441 1
+18 445 1
+18 446 1
+18 447 1
+18 451 1
+18 455 1
+18 456 1
+18 457 1
+18 461 1
+18 462 1
+18 463 1
+18 467 1
+18 468 1
+18 469 1
+18 472 1
+18 476 1
+18 480 1
+18 481 1
+18 482 1
+18 486 1
+18 490 1
+18 491 1
+18 492 1
+18 496 1
+18 497 1
+18 498 1
+18 502 1
+18 503 1
+18 504 1
+18 506 1
+18 510 1
+18 511 1
+18 512 1
+18 516 1
+18 517 1
+18 518 1
+18 522 1
+18 523 1
+18 524 1
+18 526 1
+18 527 1
+18 528 1
+18 532 1
+18 533 1
+18 534 1
+18 536 1
+18 537 1
+18 538 1
+18 540 1
+19 6 1
+19 13 1
+19 19 1
+19 24 1
+19 28 1
+19 31 1
+19 34 1
+19 35 1
+19 41 1
+19 47 1
+19 52 1
+19 56 1
+19 59 1
+19 62 1
+19 63 1
+19 68 1
+19 73 1
+19 77 1
+19 80 1
+19 83 1
+19 84 1
+19 88 1
+19 92 1
+19 95 1
+19 98 1
+19 99 1
+19 102 1
+19 105 1
+19 108 1
+19 109 1
+19 111 1
+19 114 1
+19 115 1
+19 117 1
+19 118 1
+19 120 1
+19 335 1
+19 341 1
+19 346 1
+19 350 1
+19 353 1
+19 356 1
+19 357 1
+19 362 1
+19 367 1
+19 371 1
+19 374 1
+19 377 1
+19 378 1
+19 382 1
+19 386 1
+19 389 1
+19 392 1
+19 393 1
+19 396 1
+19 399 1
+19 402 1
+19 403 1
+19 405 1
+19 408 1
+19 409 1
+19 411 1
+19 412 1
+19 414 1
+19 418 1
+19 423 1
+19 427 1
+19 430 1
+19 433 1
+19 434 1
+19 438 1
+19 442 1
+19 445 1
+19 448 1
+19 449 1
+19 452 1
+19 455 1
+19 458 1
+19 459 1
+19 461 1
+19 464 1
+19 465 1
+19 467 1
+19 468 1
+19 470 1
+19 473 1
+19 477 1
+19 480 1
+19 483 1
+19 484 1
+19 487 1
+19 490 1
+19 493 1
+19 494 1
+19 496 1
+19 499 1
+19 500 1
+19 502 1
+19 503 1
+19 505 1
+19 507 1
+19 510 1
+19 513 1
+19 514 1
+19 516 1
+19 519 1
+19 520 1
+19 522 1
+19 523 1
+19 525 1
+19 526 1
+19 529 1
+19 530 1
+19 532 1
+19 533 1
+19 535 1
+19 536 1
+19 537 1
+19 539 1
+19 540 1
+20 7 1
+20 14 1
+20 20 1
+20 25 1
+20 29 1
+20 32 1
+20 34 1
+20 36 1
+20 42 1
+20 48 1
+20 53 1
+20 57 1
+20 60 1
+20 62 1
+20 64 1
+20 69 1
+20 74 1
+20 78 1
+20 81 1
+20 83 1
+20 85 1
+20 89 1
+20 93 1
+20 96 1
+20 98 1
+20 100 1
+20 103 1
+20 106 1
+20 108 1
+20 110 1
+20 112 1
+20 114 1
+20 116 1
+20 117 1
+20 119 1
+20 120 1
+20 336 1
+20 342 1
+20 347 1
+20 351 1
+20 354 1
+20 356 1
+20 358 1
+20 363 1
+20 368 1
+20 372 1
+20 375 1
+20 377 1
+20 379 1
+20 383 1
+20 387 1
+20 390 1
+20 392 1
+20 394 1
+20 397 1
+20 400 1
+20 402 1
+20 404 1
+20 406 1
+20 408 1
+20 410 1
+20 411 1
+20 413 1
+20 414 1
+20 419 1
+20 424 1
+20 428 1
+20 431 1
+20 433 1
+20 435 1
+20 439 1
+20 443 1
+20 446 1
+20 448 1
+20 450 1
+20 453 1
+20 456 1
+20 458 1
+20 460 1
+20 462 1
+20 464 1
+20 466 1
+20 467 1
+20 469 1
+20 470 1
+20 474 1
+20 478 1
+20 481 1
+20 483 1
+20 485 1
+20 488 1
+20 491 1
+20 493 1
+20 495 1
+20 497 1
+20 499 1
+20 501 1
+20 502 1
+20 504 1
+20 505 1
+20 508 1
+20 511 1
+20 513 1
+20 515 1
+20 517 1
+20 519 1
+20 521 1
+20 522 1
+20 524 1
+20 525 1
+20 527 1
+20 529 1
+20 531 1
+20 532 1
+20 534 1
+20 535 1
+20 536 1
+20 538 1
+20 539 1
+20 540 1
+21 8 1
+21 15 1
+21 21 1
+21 26 1
+21 30 1
+21 33 1
+21 35 1
+21 36 1
+21 43 1
+21 49 1
+21 54 1
+21 58 1
+21 61 1
+21 63 1
+21 64 1
+21 70 1
+21 75 1
+21 79 1
+21 82 1
+21 84 1
+21 85 1
+21 90 1
+21 94 1
+21 97 1
+21 99 1
+21 100 1
+21 104 1
+21 107 1
+21 109 1
+21 110 1
+21 113 1
+21 115 1
+21 116 1
+21 118 1
+21 119 1
+21 120 1
+21 337 1
+21 343 1
+21 348 1
+21 352 1
+21 355 1
+21 357 1
+21 358 1
+21 364 1
+21 369 1
+21 373 1
+21 376 1
+21 378 1
+21 379 1
+21 384 1
+21 388 1
+21 391 1
+21 393 1
+21 394 1
+21 398 1
+21 401 1
+21 403 1
+21 404 1
+21 407 1
+21 409 1
+21 410 1
+21 412 1
+21 413 1
+21 414 1
+21 420 1
+21 425 1
+21 429 1
+21 432 1
+21 434 1
+21 435 1
+21 440 1
+21 444 1
+21 447 1
+21 449 1
+21 450 1
+21 454 1
+21 457 1
+21 459 1
+21 460 1
+21 463 1
+21 465 1
+21 466 1
+21 468 1
+21 469 1
+21 470 1
+21 475 1
+21 479 1
+21 482 1
+21 484 1
+21 485 1
+21 489 1
+21 492 1
+21 494 1
+21 495 1
+21 498 1
+21 500 1
+21 501 1
+21 503 1
+21 504 1
+21 505 1
+21 509 1
+21 512 1
+21 514 1
+21 515 1
+21 518 1
+21 520 1
+21 521 1
+21 523 1
+21 524 1
+21 525 1
+21 528 1
+21 530 1
+21 531 1
+21 533 1
+21 534 1
+21 535 1
+21 537 1
+21 538 1
+21 539 1
+21 540 1
+22 1 1
+22 2 1
+22 3 1
+22 4 1
+22 5 1
+22 6 1
+22 7 1
+22 8 1
+22 121 1
+22 122 1
+22 123 1
+22 124 1
+22 125 1
+22 126 1
+22 127 1
+22 128 1
+22 129 1
+22 130 1
+22 131 1
+22 132 1
+22 133 1
+22 134 1
+22 135 1
+22 136 1
+22 137 1
+22 138 1
+22 139 1
+22 140 1
+22 141 1
+22 142 1
+22 143 1
+22 144 1
+22 145 1
+22 146 1
+22 147 1
+22 148 1
+22 331 1
+22 332 1
+22 333 1
+22 334 1
+22 335 1
+22 336 1
+22 337 1
+22 338 1
+22 339 1
+22 340 1
+22 341 1
+22 342 1
+22 343 1
+22 344 1
+22 345 1
+22 346 1
+22 347 1
+22 348 1
+22 349 1
+22 350 1
+22 351 1
+22 352 1
+22 353 1
+22 354 1
+22 355 1
+22 356 1
+22 357 1
+22 358 1
+22 541 1
+22 542 1
+22 543 1
+22 544 1
+22 545 1
+22 546 1
+22 547 1
+22 548 1
+22 549 1
+22 550 1
+22 551 1
+22 552 1
+22 553 1
+22 554 1
+22 555 1
+22 556 1
+22 557 1
+22 558 1
+22 559 1
+22 560 1
+22 561 1
+22 562 1
+22 563 1
+22 564 1
+22 565 1
+22 566 1
+22 567 1
+22 568 1
+22 569 1
+22 570 1
+22 571 1
+22 572 1
+22 573 1
+22 574 1
+22 575 1
+22 576 1
+22 577 1
+22 578 1
+22 579 1
+22 580 1
+22 581 1
+22 582 1
+22 583 1
+22 584 1
+22 585 1
+22 586 1
+22 587 1
+22 588 1
+22 589 1
+22 590 1
+22 591 1
+22 592 1
+22 593 1
+22 594 1
+22 595 1
+22 596 1
+23 1 1
+23 9 1
+23 10 1
+23 11 1
+23 12 1
+23 13 1
+23 14 1
+23 15 1
+23 121 1
+23 122 1
+23 123 1
+23 124 1
+23 125 1
+23 126 1
+23 127 1
+23 149 1
+23 150 1
+23 151 1
+23 152 1
+23 153 1
+23 154 1
+23 155 1
+23 156 1
+23 157 1
+23 158 1
+23 159 1
+23 160 1
+23 161 1
+23 162 1
+23 163 1
+23 164 1
+23 165 1
+23 166 1
+23 167 1
+23 168 1
+23 169 1
+23 331 1
+23 332 1
+23 333 1
+23 334 1
+23 335 1
+23 336 1
+23 337 1
+23 359 1
+23 360 1
+23 361 1
+23 362 1
+23 363 1
+23 364 1
+23 365 1
+23 366 1
+23 367 1
+23 368 1
+23 369 1
+23 370 1
+23 371 1
+23 372 1
+23 373 1
+23 374 1
+23 375 1
+23 376 1
+23 377 1
+23 378 1
+23 379 1
+23 541 1
+23 542 1
+23 543 1
+23 544 1
+23 545 1
+23 546 1
+23 547 1
+23 548 1
+23 549 1
+23 550 1
+23 551 1
+23 552 1
+23 553 1
+23 554 1
+23 555 1
+23 556 1
+23 557 1
+23 558 1
+23 559 1
+23 560 1
+23 561 1
+23 597 1
+23 598 1
+23 599 1
+23 600 1
+23 601 1
+23 602 1
+23 603 1
+23 604 1
+23 605 1
+23 606 1
+23 607 1
+23 608 1
+23 609 1
+23 610 1
+23 611 1
+23 612 1
+23 613 1
+23 614 1
+23 615 1
+23 616 1
+23 617 1
+23 618 1
+23 619 1
+23 620 1
+23 621 1
+23 622 1
+23 623 1
+23 624 1
+23 625 1
+23 626 1
+23 627 1
+23 628 1
+23 629 1
+23 630 1
+23 631 1
+24 2 1
+24 9 1
+24 16 1
+24 17 1
+24 18 1
+24 19 1
+24 20 1
+24 21 1
+24 121 1
+24 128 1
+24 129 1
+24 130 1
+24 131 1
+24 132 1
+24 133 1
+24 149 1
+24 150 1
+24 151 1
+24 152 1
+24 153 1
+24 154 1
+24 170 1
+24 171 1
+24 172 1
+24 173 1
+24 174 1
+24 175 1
+24 176 1
+24 177 1
+24 178 1
+24 179 1
+24 180 1
+24 181 1
+24 182 1
+24 183 1
+24 184 1
+24 331 1
+24 338 1
+24 339 1
+24 340 1
+24 341 1
+24 342 1
+24 343 1
+24 359 1
+24 360 1
+24 361 1
+24 362 1
+24 363 1
+24 364 1
+24 380 1
+24 381 1
+24 382 1
+24 383 1
+24 384 1
+24 385 1
+24 386 1
+24 387 1
+24 388 1
+24 389 1
+24 390 1
+24 391 1
+24 392 1
+24 393 1
+24 394 1
+24 541 1
+24 542 1
+24 543 1
+24 544 1
+24 545 1
+24 546 1
+24 562 1
+24 563 1
+24 564 1
+24 565 1
+24 566 1
+24 567 1
+24 568 1
+24 569 1
+24 570 1
+24 571 1
+24 572 1
+24 573 1
+24 574 1
+24 575 1
+24 576 1
+24 597 1
+24 598 1
+24 599 1
+24 600 1
+24 601 1
+24 602 1
+24 603 1
+24 604 1
+24 605 1
+24 606 1
+24 607 1
+24 608 1
+24 609 1
+24 610 1
+24 611 1
+24 632 1
+24 633 1
+24 634 1
+24 635 1
+24 636 1
+24 637 1
+24 638 1
+24 639 1
+24 640 1
+24 641 1
+24 642 1
+24 643 1
+24 644 1
+24 645 1
+24 646 1
+24 647 1
+24 648 1
+24 649 1
+24 650 1
+24 651 1
+25 3 1
+25 10 1
+25 16 1
+25 22 1
+25 23 1
+25 24 1
+25 25 1
+25 26 1
+25 122 1
+25 128 1
+25 134 1
+25 135 1
+25 136 1
+25 137 1
+25 138 1
+25 149 1
+25 155 1
+25 156 1
+25 157 1
+25 158 1
+25 159 1
+25 170 1
+25 171 1
+25 172 1
+25 173 1
+25 174 1
+25 185 1
+25 186 1
+25 187 1
+25 188 1
+25 189 1
+25 190 1
+25 191 1
+25 192 1
+25 193 1
+25 194 1
+25 332 1
+25 338 1
+25 344 1
+25 345 1
+25 346 1
+25 347 1
+25 348 1
+25 359 1
+25 365 1
+25 366 1
+25 367 1
+25 368 1
+25 369 1
+25 380 1
+25 381 1
+25 382 1
+25 383 1
+25 384 1
+25 395 1
+25 396 1
+25 397 1
+25 398 1
+25 399 1
+25 400 1
+25 401 1
+25 402 1
+25 403 1
+25 404 1
+25 541 1
+25 547 1
+25 548 1
+25 549 1
+25 550 1
+25 551 1
+25 562 1
+25 563 1
+25 564 1
+25 565 1
+25 566 1
+25 577 1
+25 578 1
+25 579 1
+25 580 1
+25 581 1
+25 582 1
+25 583 1
+25 584 1
+25 585 1
+25 586 1
+25 597 1
+25 598 1
+25 599 1
+25 600 1
+25 601 1
+25 612 1
+25 613 1
+25 614 1
+25 615 1
+25 616 1
+25 617 1
+25 618 1
+25 619 1
+25 620 1
+25 621 1
+25 632 1
+25 633 1
+25 634 1
+25 635 1
+25 636 1
+25 637 1
+25 638 1
+25 639 1
+25 640 1
+25 641 1
+25 652 1
+25 653 1
+25 654 1
+25 655 1
+25 656 1
+25 657 1
+25 658 1
+25 659 1
+25 660 1
+25 661 1
+26 4 1
+26 11 1
+26 17 1
+26 22 1
+26 27 1
+26 28 1
+26 29 1
+26 30 1
+26 123 1
+26 129 1
+26 134 1
+26 139 1
+26 140 1
+26 141 1
+26 142 1
+26 150 1
+26 155 1
+26 160 1
+26 161 1
+26 162 1
+26 163 1
+26 170 1
+26 175 1
+26 176 1
+26 177 1
+26 178 1
+26 185 1
+26 186 1
+26 187 1
+26 188 1
+26 195 1
+26 196 1
+26 197 1
+26 198 1
+26 199 1
+26 200 1
+26 333 1
+26 339 1
+26 344 1
+26 349 1
+26 350 1
+26 351 1
+26 352 1
+26 360 1
+26 365 1
+26 370 1
+26 371 1
+26 372 1
+26 373 1
+26 380 1
+26 385 1
+26 386 1
+26 387 1
+26 388 1
+26 395 1
+26 396 1
+26 397 1
+26 398 1
+26 405 1
+26 406 1
+26 407 1
+26 408 1
+26 409 1
+26 410 1
+26 542 1
+26 547 1
+26 552 1
+26 553 1
+26 554 1
+26 555 1
+26 562 1
+26 567 1
+26 568 1
+26 569 1
+26 570 1
+26 577 1
+26 578 1
+26 579 1
+26 580 1
+26 587 1
+26 588 1
+26 589 1
+26 590 1
+26 591 1
+26 592 1
+26 597 1
+26 602 1
+26 603 1
+26 604 1
+26 605 1
+26 612 1
+26 613 1
+26 614 1
+26 615 1
+26 622 1
+26 623 1
+26 624 1
+26 625 1
+26 626 1
+26 627 1
+26 632 1
+26 633 1
+26 634 1
+26 635 1
+26 642 1
+26 643 1
+26 644 1
+26 645 1
+26 646 1
+26 647 1
+26 652 1
+26 653 1
+26 654 1
+26 655 1
+26 656 1
+26 657 1
+26 662 1
+26 663 1
+26 664 1
+26 665 1
+27 5 1
+27 12 1
+27 18 1
+27 23 1
+27 27 1
+27 31 1
+27 32 1
+27 33 1
+27 124 1
+27 130 1
+27 135 1
+27 139 1
+27 143 1
+27 144 1
+27 145 1
+27 151 1
+27 156 1
+27 160 1
+27 164 1
+27 165 1
+27 166 1
+27 171 1
+27 175 1
+27 179 1
+27 180 1
+27 181 1
+27 185 1
+27 189 1
+27 190 1
+27 191 1
+27 195 1
+27 196 1
+27 197 1
+27 201 1
+27 202 1
+27 203 1
+27 334 1
+27 340 1
+27 345 1
+27 349 1
+27 353 1
+27 354 1
+27 355 1
+27 361 1
+27 366 1
+27 370 1
+27 374 1
+27 375 1
+27 376 1
+27 381 1
+27 385 1
+27 389 1
+27 390 1
+27 391 1
+27 395 1
+27 399 1
+27 400 1
+27 401 1
+27 405 1
+27 406 1
+27 407 1
+27 411 1
+27 412 1
+27 413 1
+27 543 1
+27 548 1
+27 552 1
+27 556 1
+27 557 1
+27 558 1
+27 563 1
+27 567 1
+27 571 1
+27 572 1
+27 573 1
+27 577 1
+27 581 1
+27 582 1
+27 583 1
+27 587 1
+27 588 1
+27 589 1
+27 593 1
+27 594 1
+27 595 1
+27 598 1
+27 602 1
+27 606 1
+27 607 1
+27 608 1
+27 612 1
+27 616 1
+27 617 1
+27 618 1
+27 622 1
+27 623 1
+27 624 1
+27 628 1
+27 629 1
+27 630 1
+27 632 1
+27 636 1
+27 637 1
+27 638 1
+27 642 1
+27 643 1
+27 644 1
+27 648 1
+27 649 1
+27 650 1
+27 652 1
+27 653 1
+27 654 1
+27 658 1
+27 659 1
+27 660 1
+27 662 1
+27 663 1
+27 664 1
+27 666 1
+28 6 1
+28 13 1
+28 19 1
+28 24 1
+28 28 1
+28 31 1
+28 34 1
+28 35 1
+28 125 1
+28 131 1
+28 136 1
+28 140 1
+28 143 1
+28 146 1
+28 147 1
+28 152 1
+28 157 1
+28 161 1
+28 164 1
+28 167 1
+28 168 1
+28 172 1
+28 176 1
+28 179 1
+28 182 1
+28 183 1
+28 186 1
+28 189 1
+28 192 1
+28 193 1
+28 195 1
+28 198 1
+28 199 1
+28 201 1
+28 202 1
+28 204 1
+28 335 1
+28 341 1
+28 346 1
+28 350 1
+28 353 1
+28 356 1
+28 357 1
+28 362 1
+28 367 1
+28 371 1
+28 374 1
+28 377 1
+28 378 1
+28 382 1
+28 386 1
+28 389 1
+28 392 1
+28 393 1
+28 396 1
+28 399 1
+28 402 1
+28 403 1
+28 405 1
+28 408 1
+28 409 1
+28 411 1
+28 412 1
+28 414 1
+28 544 1
+28 549 1
+28 553 1
+28 556 1
+28 559 1
+28 560 1
+28 564 1
+28 568 1
+28 571 1
+28 574 1
+28 575 1
+28 578 1
+28 581 1
+28 584 1
+28 585 1
+28 587 1
+28 590 1
+28 591 1
+28 593 1
+28 594 1
+28 596 1
+28 599 1
+28 603 1
+28 606 1
+28 609 1
+28 610 1
+28 613 1
+28 616 1
+28 619 1
+28 620 1
+28 622 1
+28 625 1
+28 626 1
+28 628 1
+28 629 1
+28 631 1
+28 633 1
+28 636 1
+28 639 1
+28 640 1
+28 642 1
+28 645 1
+28 646 1
+28 648 1
+28 649 1
+28 651 1
+28 652 1
+28 655 1
+28 656 1
+28 658 1
+28 659 1
+28 661 1
+28 662 1
+28 663 1
+28 665 1
+28 666 1
+29 7 1
+29 14 1
+29 20 1
+29 25 1
+29 29 1
+29 32 1
+29 34 1
+29 36 1
+29 126 1
+29 132 1
+29 137 1
+29 141 1
+29 144 1
+29 146 1
+29 148 1
+29 153 1
+29 158 1
+29 162 1
+29 165 1
+29 167 1
+29 169 1
+29 173 1
+29 177 1
+29 180 1
+29 182 1
+29 184 1
+29 187 1
+29 190 1
+29 192 1
+29 194 1
+29 196 1
+29 198 1
+29 200 1
+29 201 1
+29 203 1
+29 204 1
+29 336 1
+29 342 1
+29 347 1
+29 351 1
+29 354 1
+29 356 1
+29 358 1
+29 363 1
+29 368 1
+29 372 1
+29 375 1
+29 377 1
+29 379 1
+29 383 1
+29 387 1
+29 390 1
+29 392 1
+29 394 1
+29 397 1
+29 400 1
+29 402 1
+29 404 1
+29 406 1
+29 408 1
+29 410 1
+29 411 1
+29 413 1
+29 414 1
+29 545 1
+29 550 1
+29 554 1
+29 557 1
+29 559 1
+29 561 1
+29 565 1
+29 569 1
+29 572 1
+29 574 1
+29 576 1
+29 579 1
+29 582 1
+29 584 1
+29 586 1
+29 588 1
+29 590 1
+29 592 1
+29 593 1
+29 595 1
+29 596 1
+29 600 1
+29 604 1
+29 607 1
+29 609 1
+29 611 1
+29 614 1
+29 617 1
+29 619 1
+29 621 1
+29 623 1
+29 625 1
+29 627 1
+29 628 1
+29 630 1
+29 631 1
+29 634 1
+29 637 1
+29 639 1
+29 641 1
+29 643 1
+29 645 1
+29 647 1
+29 648 1
+29 650 1
+29 651 1
+29 653 1
+29 655 1
+29 657 1
+29 658 1
+29 660 1
+29 661 1
+29 662 1
+29 664 1
+29 665 1
+29 666 1
+30 8 1
+30 15 1
+30 21 1
+30 26 1
+30 30 1
+30 33 1
+30 35 1
+30 36 1
+30 127 1
+30 133 1
+30 138 1
+30 142 1
+30 145 1
+30 147 1
+30 148 1
+30 154 1
+30 159 1
+30 163 1
+30 166 1
+30 168 1
+30 169 1
+30 174 1
+30 178 1
+30 181 1
+30 183 1
+30 184 1
+30 188 1
+30 191 1
+30 193 1
+30 194 1
+30 197 1
+30 199 1
+30 200 1
+30 202 1
+30 203 1
+30 204 1
+30 337 1
+30 343 1
+30 348 1
+30 352 1
+30 355 1
+30 357 1
+30 358 1
+30 364 1
+30 369 1
+30 373 1
+30 376 1
+30 378 1
+30 379 1
+30 384 1
+30 388 1
+30 391 1
+30 393 1
+30 394 1
+30 398 1
+30 401 1
+30 403 1
+30 404 1
+30 407 1
+30 409 1
+30 410 1
+30 412 1
+30 413 1
+30 414 1
+30 546 1
+30 551 1
+30 555 1
+30 558 1
+30 560 1
+30 561 1
+30 566 1
+30 570 1
+30 573 1
+30 575 1
+30 576 1
+30 580 1
+30 583 1
+30 585 1
+30 586 1
+30 589 1
+30 591 1
+30 592 1
+30 594 1
+30 595 1
+30 596 1
+30 601 1
+30 605 1
+30 608 1
+30 610 1
+30 611 1
+30 615 1
+30 618 1
+30 620 1
+30 621 1
+30 624 1
+30 626 1
+30 627 1
+30 629 1
+30 630 1
+30 631 1
+30 635 1
+30 638 1
+30 640 1
+30 641 1
+30 644 1
+30 646 1
+30 647 1
+30 649 1
+30 650 1
+30 651 1
+30 654 1
+30 656 1
+30 657 1
+30 659 1
+30 660 1
+30 661 1
+30 663 1
+30 664 1
+30 665 1
+30 666 1
+31 1 1
+31 37 1
+31 38 1
+31 39 1
+31 40 1
+31 41 1
+31 42 1
+31 43 1
+31 121 1
+31 122 1
+31 123 1
+31 124 1
+31 125 1
+31 126 1
+31 127 1
+31 205 1
+31 206 1
+31 207 1
+31 208 1
+31 209 1
+31 210 1
+31 211 1
+31 212 1
+31 213 1
+31 214 1
+31 215 1
+31 216 1
+31 217 1
+31 218 1
+31 219 1
+31 220 1
+31 221 1
+31 222 1
+31 223 1
+31 224 1
+31 225 1
+31 331 1
+31 332 1
+31 333 1
+31 334 1
+31 335 1
+31 336 1
+31 337 1
+31 415 1
+31 416 1
+31 417 1
+31 418 1
+31 419 1
+31 420 1
+31 421 1
+31 422 1
+31 423 1
+31 424 1
+31 425 1
+31 426 1
+31 427 1
+31 428 1
+31 429 1
+31 430 1
+31 431 1
+31 432 1
+31 433 1
+31 434 1
+31 435 1
+31 541 1
+31 542 1
+31 543 1
+31 544 1
+31 545 1
+31 546 1
+31 547 1
+31 548 1
+31 549 1
+31 550 1
+31 551 1
+31 552 1
+31 553 1
+31 554 1
+31 555 1
+31 556 1
+31 557 1
+31 558 1
+31 559 1
+31 560 1
+31 561 1
+31 667 1
+31 668 1
+31 669 1
+31 670 1
+31 671 1
+31 672 1
+31 673 1
+31 674 1
+31 675 1
+31 676 1
+31 677 1
+31 678 1
+31 679 1
+31 680 1
+31 681 1
+31 682 1
+31 683 1
+31 684 1
+31 685 1
+31 686 1
+31 687 1
+31 688 1
+31 689 1
+31 690 1
+31 691 1
+31 692 1
+31 693 1
+31 694 1
+31 695 1
+31 696 1
+31 697 1
+31 698 1
+31 699 1
+31 700 1
+31 701 1
+32 2 1
+32 37 1
+32 44 1
+32 45 1
+32 46 1
+32 47 1
+32 48 1
+32 49 1
+32 121 1
+32 128 1
+32 129 1
+32 130 1
+32 131 1
+32 132 1
+32 133 1
+32 205 1
+32 206 1
+32 207 1
+32 208 1
+32 209 1
+32 210 1
+32 226 1
+32 227 1
+32 228 1
+32 229 1
+32 230 1
+32 231 1
+32 232 1
+32 233 1
+32 234 1
+32 235 1
+32 236 1
+32 237 1
+32 238 1
+32 239 1
+32 240 1
+32 331 1
+32 338 1
+32 339 1
+32 340 1
+32 341 1
+32 342 1
+32 343 1
+32 415 1
+32 416 1
+32 417 1
+32 418 1
+32 419 1
+32 420 1
+32 436 1
+32 437 1
+32 438 1
+32 439 1
+32 440 1
+32 441 1
+32 442 1
+32 443 1
+32 444 1
+32 445 1
+32 446 1
+32 447 1
+32 448 1
+32 449 1
+32 450 1
+32 541 1
+32 542 1
+32 543 1
+32 544 1
+32 545 1
+32 546 1
+32 562 1
+32 563 1
+32 564 1
+32 565 1
+32 566 1
+32 567 1
+32 568 1
+32 569 1
+32 570 1
+32 571 1
+32 572 1
+32 573 1
+32 574 1
+32 575 1
+32 576 1
+32 667 1
+32 668 1
+32 669 1
+32 670 1
+32 671 1
+32 672 1
+32 673 1
+32 674 1
+32 675 1
+32 676 1
+32 677 1
+32 678 1
+32 679 1
+32 680 1
+32 681 1
+32 702 1
+32 703 1
+32 704 1
+32 705 1
+32 706 1
+32 707 1
+32 708 1
+32 709 1
+32 710 1
+32 711 1
+32 712 1
+32 713 1
+32 714 1
+32 715 1
+32 716 1
+32 717 1
+32 718 1
+32 719 1
+32 720 1
+32 721 1
+33 3 1
+33 38 1
+33 44 1
+33 50 1
+33 51 1
+33 52 1
+33 53 1
+33 54 1
+33 122 1
+33 128 1
+33 134 1
+33 135 1
+33 136 1
+33 137 1
+33 138 1
+33 205 1
+33 211 1
+33 212 1
+33 213 1
+33 214 1
+33 215 1
+33 226 1
+33 227 1
+33 228 1
+33 229 1
+33 230 1
+33 241 1
+33 242 1
+33 243 1
+33 244 1
+33 245 1
+33 246 1
+33 247 1
+33 248 1
+33 249 1
+33 250 1
+33 332 1
+33 338 1
+33 344 1
+33 345 1
+33 346 1
+33 347 1
+33 348 1
+33 415 1
+33 421 1
+33 422 1
+33 423 1
+33 424 1
+33 425 1
+33 436 1
+33 437 1
+33 438 1
+33 439 1
+33 440 1
+33 451 1
+33 452 1
+33 453 1
+33 454 1
+33 455 1
+33 456 1
+33 457 1
+33 458 1
+33 459 1
+33 460 1
+33 541 1
+33 547 1
+33 548 1
+33 549 1
+33 550 1
+33 551 1
+33 562 1
+33 563 1
+33 564 1
+33 565 1
+33 566 1
+33 577 1
+33 578 1
+33 579 1
+33 580 1
+33 581 1
+33 582 1
+33 583 1
+33 584 1
+33 585 1
+33 586 1
+33 667 1
+33 668 1
+33 669 1
+33 670 1
+33 671 1
+33 682 1
+33 683 1
+33 684 1
+33 685 1
+33 686 1
+33 687 1
+33 688 1
+33 689 1
+33 690 1
+33 691 1
+33 702 1
+33 703 1
+33 704 1
+33 705 1
+33 706 1
+33 707 1
+33 708 1
+33 709 1
+33 710 1
+33 711 1
+33 722 1
+33 723 1
+33 724 1
+33 725 1
+33 726 1
+33 727 1
+33 728 1
+33 729 1
+33 730 1
+33 731 1
+34 4 1
+34 39 1
+34 45 1
+34 50 1
+34 55 1
+34 56 1
+34 57 1
+34 58 1
+34 123 1
+34 129 1
+34 134 1
+34 139 1
+34 140 1
+34 141 1
+34 142 1
+34 206 1
+34 211 1
+34 216 1
+34 217 1
+34 218 1
+34 219 1
+34 226 1
+34 231 1
+34 232 1
+34 233 1
+34 234 1
+34 241 1
+34 242 1
+34 243 1
+34 244 1
+34 251 1
+34 252 1
+34 253 1
+34 254 1
+34 255 1
+34 256 1
+34 333 1
+34 339 1
+34 344 1
+34 349 1
+34 350 1
+34 351 1
+34 352 1
+34 416 1
+34 421 1
+34 426 1
+34 427 1
+34 428 1
+34 429 1
+34 436 1
+34 441 1
+34 442 1
+34 443 1
+34 444 1
+34 451 1
+34 452 1
+34 453 1
+34 454 1
+34 461 1
+34 462 1
+34 463 1
+34 464 1
+34 465 1
+34 466 1
+34 542 1
+34 547 1
+34 552 1
+34 553 1
+34 554 1
+34 555 1
+34 562 1
+34 567 1
+34 568 1
+34 569 1
+34 570 1
+34 577 1
+34 578 1
+34 579 1
+34 580 1
+34 587 1
+34 588 1
+34 589 1
+34 590 1
+34 591 1
+34 592 1
+34 667 1
+34 672 1
+34 673 1
+34 674 1
+34 675 1
+34 682 1
+34 683 1
+34 684 1
+34 685 1
+34 692 1
+34 693 1
+34 694 1
+34 695 1
+34 696 1
+34 697 1
+34 702 1
+34 703 1
+34 704 1
+34 705 1
+34 712 1
+34 713 1
+34 714 1
+34 715 1
+34 716 1
+34 717 1
+34 722 1
+34 723 1
+34 724 1
+34 725 1
+34 726 1
+34 727 1
+34 732 1
+34 733 1
+34 734 1
+34 735 1
+35 5 1
+35 40 1
+35 46 1
+35 51 1
+35 55 1
+35 59 1
+35 60 1
+35 61 1
+35 124 1
+35 130 1
+35 135 1
+35 139 1
+35 143 1
+35 144 1
+35 145 1
+35 207 1
+35 212 1
+35 216 1
+35 220 1
+35 221 1
+35 222 1
+35 227 1
+35 231 1
+35 235 1
+35 236 1
+35 237 1
+35 241 1
+35 245 1
+35 246 1
+35 247 1
+35 251 1
+35 252 1
+35 253 1
+35 257 1
+35 258 1
+35 259 1
+35 334 1
+35 340 1
+35 345 1
+35 349 1
+35 353 1
+35 354 1
+35 355 1
+35 417 1
+35 422 1
+35 426 1
+35 430 1
+35 431 1
+35 432 1
+35 437 1
+35 441 1
+35 445 1
+35 446 1
+35 447 1
+35 451 1
+35 455 1
+35 456 1
+35 457 1
+35 461 1
+35 462 1
+35 463 1
+35 467 1
+35 468 1
+35 469 1
+35 543 1
+35 548 1
+35 552 1
+35 556 1
+35 557 1
+35 558 1
+35 563 1
+35 567 1
+35 571 1
+35 572 1
+35 573 1
+35 577 1
+35 581 1
+35 582 1
+35 583 1
+35 587 1
+35 588 1
+35 589 1
+35 593 1
+35 594 1
+35 595 1
+35 668 1
+35 672 1
+35 676 1
+35 677 1
+35 678 1
+35 682 1
+35 686 1
+35 687 1
+35 688 1
+35 692 1
+35 693 1
+35 694 1
+35 698 1
+35 699 1
+35 700 1
+35 702 1
+35 706 1
+35 707 1
+35 708 1
+35 712 1
+35 713 1
+35 714 1
+35 718 1
+35 719 1
+35 720 1
+35 722 1
+35 723 1
+35 724 1
+35 728 1
+35 729 1
+35 730 1
+35 732 1
+35 733 1
+35 734 1
+35 736 1
+36 6 1
+36 41 1
+36 47 1
+36 52 1
+36 56 1
+36 59 1
+36 62 1
+36 63 1
+36 125 1
+36 131 1
+36 136 1
+36 140 1
+36 143 1
+36 146 1
+36 147 1
+36 208 1
+36 213 1
+36 217 1
+36 220 1
+36 223 1
+36 224 1
+36 228 1
+36 232 1
+36 235 1
+36 238 1
+36 239 1
+36 242 1
+36 245 1
+36 248 1
+36 249 1
+36 251 1
+36 254 1
+36 255 1
+36 257 1
+36 258 1
+36 260 1
+36 335 1
+36 341 1
+36 346 1
+36 350 1
+36 353 1
+36 356 1
+36 357 1
+36 418 1
+36 423 1
+36 427 1
+36 430 1
+36 433 1
+36 434 1
+36 438 1
+36 442 1
+36 445 1
+36 448 1
+36 449 1
+36 452 1
+36 455 1
+36 458 1
+36 459 1
+36 461 1
+36 464 1
+36 465 1
+36 467 1
+36 468 1
+36 470 1
+36 544 1
+36 549 1
+36 553 1
+36 556 1
+36 559 1
+36 560 1
+36 564 1
+36 568 1
+36 571 1
+36 574 1
+36 575 1
+36 578 1
+36 581 1
+36 584 1
+36 585 1
+36 587 1
+36 590 1
+36 591 1
+36 593 1
+36 594 1
+36 596 1
+36 669 1
+36 673 1
+36 676 1
+36 679 1
+36 680 1
+36 683 1
+36 686 1
+36 689 1
+36 690 1
+36 692 1
+36 695 1
+36 696 1
+36 698 1
+36 699 1
+36 701 1
+36 703 1
+36 706 1
+36 709 1
+36 710 1
+36 712 1
+36 715 1
+36 716 1
+36 718 1
+36 719 1
+36 721 1
+36 722 1
+36 725 1
+36 726 1
+36 728 1
+36 729 1
+36 731 1
+36 732 1
+36 733 1
+36 735 1
+36 736 1
+37 7 1
+37 42 1
+37 48 1
+37 53 1
+37 57 1
+37 60 1
+37 62 1
+37 64 1
+37 126 1
+37 132 1
+37 137 1
+37 141 1
+37 144 1
+37 146 1
+37 148 1
+37 209 1
+37 214 1
+37 218 1
+37 221 1
+37 223 1
+37 225 1
+37 229 1
+37 233 1
+37 236 1
+37 238 1
+37 240 1
+37 243 1
+37 246 1
+37 248 1
+37 250 1
+37 252 1
+37 254 1
+37 256 1
+37 257 1
+37 259 1
+37 260 1
+37 336 1
+37 342 1
+37 347 1
+37 351 1
+37 354 1
+37 356 1
+37 358 1
+37 419 1
+37 424 1
+37 428 1
+37 431 1
+37 433 1
+37 435 1
+37 439 1
+37 443 1
+37 446 1
+37 448 1
+37 450 1
+37 453 1
+37 456 1
+37 458 1
+37 460 1
+37 462 1
+37 464 1
+37 466 1
+37 467 1
+37 469 1
+37 470 1
+37 545 1
+37 550 1
+37 554 1
+37 557 1
+37 559 1
+37 561 1
+37 565 1
+37 569 1
+37 572 1
+37 574 1
+37 576 1
+37 579 1
+37 582 1
+37 584 1
+37 586 1
+37 588 1
+37 590 1
+37 592 1
+37 593 1
+37 595 1
+37 596 1
+37 670 1
+37 674 1
+37 677 1
+37 679 1
+37 681 1
+37 684 1
+37 687 1
+37 689 1
+37 691 1
+37 693 1
+37 695 1
+37 697 1
+37 698 1
+37 700 1
+37 701 1
+37 704 1
+37 707 1
+37 709 1
+37 711 1
+37 713 1
+37 715 1
+37 717 1
+37 718 1
+37 720 1
+37 721 1
+37 723 1
+37 725 1
+37 727 1
+37 728 1
+37 730 1
+37 731 1
+37 732 1
+37 734 1
+37 735 1
+37 736 1
+38 8 1
+38 43 1
+38 49 1
+38 54 1
+38 58 1
+38 61 1
+38 63 1
+38 64 1
+38 127 1
+38 133 1
+38 138 1
+38 142 1
+38 145 1
+38 147 1
+38 148 1
+38 210 1
+38 215 1
+38 219 1
+38 222 1
+38 224 1
+38 225 1
+38 230 1
+38 234 1
+38 237 1
+38 239 1
+38 240 1
+38 244 1
+38 247 1
+38 249 1
+38 250 1
+38 253 1
+38 255 1
+38 256 1
+38 258 1
+38 259 1
+38 260 1
+38 337 1
+38 343 1
+38 348 1
+38 352 1
+38 355 1
+38 357 1
+38 358 1
+38 420 1
+38 425 1
+38 429 1
+38 432 1
+38 434 1
+38 435 1
+38 440 1
+38 444 1
+38 447 1
+38 449 1
+38 450 1
+38 454 1
+38 457 1
+38 459 1
+38 460 1
+38 463 1
+38 465 1
+38 466 1
+38 468 1
+38 469 1
+38 470 1
+38 546 1
+38 551 1
+38 555 1
+38 558 1
+38 560 1
+38 561 1
+38 566 1
+38 570 1
+38 573 1
+38 575 1
+38 576 1
+38 580 1
+38 583 1
+38 585 1
+38 586 1
+38 589 1
+38 591 1
+38 592 1
+38 594 1
+38 595 1
+38 596 1
+38 671 1
+38 675 1
+38 678 1
+38 680 1
+38 681 1
+38 685 1
+38 688 1
+38 690 1
+38 691 1
+38 694 1
+38 696 1
+38 697 1
+38 699 1
+38 700 1
+38 701 1
+38 705 1
+38 708 1
+38 710 1
+38 711 1
+38 714 1
+38 716 1
+38 717 1
+38 719 1
+38 720 1
+38 721 1
+38 724 1
+38 726 1
+38 727 1
+38 729 1
+38 730 1
+38 731 1
+38 733 1
+38 734 1
+38 735 1
+38 736 1
+39 9 1
+39 37 1
+39 65 1
+39 66 1
+39 67 1
+39 68 1
+39 69 1
+39 70 1
+39 121 1
+39 149 1
+39 150 1
+39 151 1
+39 152 1
+39 153 1
+39 154 1
+39 205 1
+39 206 1
+39 207 1
+39 208 1
+39 209 1
+39 210 1
+39 261 1
+39 262 1
+39 263 1
+39 264 1
+39 265 1
+39 266 1
+39 267 1
+39 268 1
+39 269 1
+39 270 1
+39 271 1
+39 272 1
+39 273 1
+39 274 1
+39 275 1
+39 331 1
+39 359 1
+39 360 1
+39 361 1
+39 362 1
+39 363 1
+39 364 1
+39 415 1
+39 416 1
+39 417 1
+39 418 1
+39 419 1
+39 420 1
+39 471 1
+39 472 1
+39 473 1
+39 474 1
+39 475 1
+39 476 1
+39 477 1
+39 478 1
+39 479 1
+39 480 1
+39 481 1
+39 482 1
+39 483 1
+39 484 1
+39 485 1
+39 541 1
+39 542 1
+39 543 1
+39 544 1
+39 545 1
+39 546 1
+39 597 1
+39 598 1
+39 599 1
+39 600 1
+39 601 1
+39 602 1
+39 603 1
+39 604 1
+39 605 1
+39 606 1
+39 607 1
+39 608 1
+39 609 1
+39 610 1
+39 611 1
+39 667 1
+39 668 1
+39 669 1
+39 670 1
+39 671 1
+39 672 1
+39 673 1
+39 674 1
+39 675 1
+39 676 1
+39 677 1
+39 678 1
+39 679 1
+39 680 1
+39 681 1
+39 737 1
+39 738 1
+39 739 1
+39 740 1
+39 741 1
+39 742 1
+39 743 1
+39 744 1
+39 745 1
+39 746 1
+39 747 1
+39 748 1
+39 749 1
+39 750 1
+39 751 1
+39 752 1
+39 753 1
+39 754 1
+39 755 1
+39 756 1
+40 10 1
+40 38 1
+40 65 1
+40 71 1
+40 72 1
+40 73 1
+40 74 1
+40 75 1
+40 122 1
+40 149 1
+40 155 1
+40 156 1
+40 157 1
+40 158 1
+40 159 1
+40 205 1
+40 211 1
+40 212 1
+40 213 1
+40 214 1
+40 215 1
+40 261 1
+40 262 1
+40 263 1
+40 264 1
+40 265 1
+40 276 1
+40 277 1
+40 278 1
+40 279 1
+40 280 1
+40 281 1
+40 282 1
+40 283 1
+40 284 1
+40 285 1
+40 332 1
+40 359 1
+40 365 1
+40 366 1
+40 367 1
+40 368 1
+40 369 1
+40 415 1
+40 421 1
+40 422 1
+40 423 1
+40 424 1
+40 425 1
+40 471 1
+40 472 1
+40 473 1
+40 474 1
+40 475 1
+40 486 1
+40 487 1
+40 488 1
+40 489 1
+40 490 1
+40 491 1
+40 492 1
+40 493 1
+40 494 1
+40 495 1
+40 541 1
+40 547 1
+40 548 1
+40 549 1
+40 550 1
+40 551 1
+40 597 1
+40 598 1
+40 599 1
+40 600 1
+40 601 1
+40 612 1
+40 613 1
+40 614 1
+40 615 1
+40 616 1
+40 617 1
+40 618 1
+40 619 1
+40 620 1
+40 621 1
+40 667 1
+40 668 1
+40 669 1
+40 670 1
+40 671 1
+40 682 1
+40 683 1
+40 684 1
+40 685 1
+40 686 1
+40 687 1
+40 688 1
+40 689 1
+40 690 1
+40 691 1
+40 737 1
+40 738 1
+40 739 1
+40 740 1
+40 741 1
+40 742 1
+40 743 1
+40 744 1
+40 745 1
+40 746 1
+40 757 1
+40 758 1
+40 759 1
+40 760 1
+40 761 1
+40 762 1
+40 763 1
+40 764 1
+40 765 1
+40 766 1
+41 11 1
+41 39 1
+41 66 1
+41 71 1
+41 76 1
+41 77 1
+41 78 1
+41 79 1
+41 123 1
+41 150 1
+41 155 1
+41 160 1
+41 161 1
+41 162 1
+41 163 1
+41 206 1
+41 211 1
+41 216 1
+41 217 1
+41 218 1
+41 219 1
+41 261 1
+41 266 1
+41 267 1
+41 268 1
+41 269 1
+41 276 1
+41 277 1
+41 278 1
+41 279 1
+41 286 1
+41 287 1
+41 288 1
+41 289 1
+41 290 1
+41 291 1
+41 333 1
+41 360 1
+41 365 1
+41 370 1
+41 371 1
+41 372 1
+41 373 1
+41 416 1
+41 421 1
+41 426 1
+41 427 1
+41 428 1
+41 429 1
+41 471 1
+41 476 1
+41 477 1
+41 478 1
+41 479 1
+41 486 1
+41 487 1
+41 488 1
+41 489 1
+41 496 1
+41 497 1
+41 498 1
+41 499 1
+41 500 1
+41 501 1
+41 542 1
+41 547 1
+41 552 1
+41 553 1
+41 554 1
+41 555 1
+41 597 1
+41 602 1
+41 603 1
+41 604 1
+41 605 1
+41 612 1
+41 613 1
+41 614 1
+41 615 1
+41 622 1
+41 623 1
+41 624 1
+41 625 1
+41 626 1
+41 627 1
+41 667 1
+41 672 1
+41 673 1
+41 674 1
+41 675 1
+41 682 1
+41 683 1
+41 684 1
+41 685 1
+41 692 1
+41 693 1
+41 694 1
+41 695 1
+41 696 1
+41 697 1
+41 737 1
+41 738 1
+41 739 1
+41 740 1
+41 747 1
+41 748 1
+41 749 1
+41 750 1
+41 751 1
+41 752 1
+41 757 1
+41 758 1
+41 759 1
+41 760 1
+41 761 1
+41 762 1
+41 767 1
+41 768 1
+41 769 1
+41 770 1
+42 12 1
+42 40 1
+42 67 1
+42 72 1
+42 76 1
+42 80 1
+42 81 1
+42 82 1
+42 124 1
+42 151 1
+42 156 1
+42 160 1
+42 164 1
+42 165 1
+42 166 1
+42 207 1
+42 212 1
+42 216 1
+42 220 1
+42 221 1
+42 222 1
+42 262 1
+42 266 1
+42 270 1
+42 271 1
+42 272 1
+42 276 1
+42 280 1
+42 281 1
+42 282 1
+42 286 1
+42 287 1
+42 288 1
+42 292 1
+42 293 1
+42 294 1
+42 334 1
+42 361 1
+42 366 1
+42 370 1
+42 374 1
+42 375 1
+42 376 1
+42 417 1
+42 422 1
+42 426 1
+42 430 1
+42 431 1
+42 432 1
+42 472 1
+42 476 1
+42 480 1
+42 481 1
+42 482 1
+42 486 1
+42 490 1
+42 491 1
+42 492 1
+42 496 1
+42 497 1
+42 498 1
+42 502 1
+42 503 1
+42 504 1
+42 543 1
+42 548 1
+42 552 1
+42 556 1
+42 557 1
+42 558 1
+42 598 1
+42 602 1
+42 606 1
+42 607 1
+42 608 1
+42 612 1
+42 616 1
+42 617 1
+42 618 1
+42 622 1
+42 623 1
+42 624 1
+42 628 1
+42 629 1
+42 630 1
+42 668 1
+42 672 1
+42 676 1
+42 677 1
+42 678 1
+42 682 1
+42 686 1
+42 687 1
+42 688 1
+42 692 1
+42 693 1
+42 694 1
+42 698 1
+42 699 1
+42 700 1
+42 737 1
+42 741 1
+42 742 1
+42 743 1
+42 747 1
+42 748 1
+42 749 1
+42 753 1
+42 754 1
+42 755 1
+42 757 1
+42 758 1
+42 759 1
+42 763 1
+42 764 1
+42 765 1
+42 767 1
+42 768 1
+42 769 1
+42 771 1
+43 13 1
+43 41 1
+43 68 1
+43 73 1
+43 77 1
+43 80 1
+43 83 1
+43 84 1
+43 125 1
+43 152 1
+43 157 1
+43 161 1
+43 164 1
+43 167 1
+43 168 1
+43 208 1
+43 213 1
+43 217 1
+43 220 1
+43 223 1
+43 224 1
+43 263 1
+43 267 1
+43 270 1
+43 273 1
+43 274 1
+43 277 1
+43 280 1
+43 283 1
+43 284 1
+43 286 1
+43 289 1
+43 290 1
+43 292 1
+43 293 1
+43 295 1
+43 335 1
+43 362 1
+43 367 1
+43 371 1
+43 374 1
+43 377 1
+43 378 1
+43 418 1
+43 423 1
+43 427 1
+43 430 1
+43 433 1
+43 434 1
+43 473 1
+43 477 1
+43 480 1
+43 483 1
+43 484 1
+43 487 1
+43 490 1
+43 493 1
+43 494 1
+43 496 1
+43 499 1
+43 500 1
+43 502 1
+43 503 1
+43 505 1
+43 544 1
+43 549 1
+43 553 1
+43 556 1
+43 559 1
+43 560 1
+43 599 1
+43 603 1
+43 606 1
+43 609 1
+43 610 1
+43 613 1
+43 616 1
+43 619 1
+43 620 1
+43 622 1
+43 625 1
+43 626 1
+43 628 1
+43 629 1
+43 631 1
+43 669 1
+43 673 1
+43 676 1
+43 679 1
+43 680 1
+43 683 1
+43 686 1
+43 689 1
+43 690 1
+43 692 1
+43 695 1
+43 696 1
+43 698 1
+43 699 1
+43 701 1
+43 738 1
+43 741 1
+43 744 1
+43 745 1
+43 747 1
+43 750 1
+43 751 1
+43 753 1
+43 754 1
+43 756 1
+43 757 1
+43 760 1
+43 761 1
+43 763 1
+43 764 1
+43 766 1
+43 767 1
+43 768 1
+43 770 1
+43 771 1
+44 14 1
+44 42 1
+44 69 1
+44 74 1
+44 78 1
+44 81 1
+44 83 1
+44 85 1
+44 126 1
+44 153 1
+44 158 1
+44 162 1
+44 165 1
+44 167 1
+44 169 1
+44 209 1
+44 214 1
+44 218 1
+44 221 1
+44 223 1
+44 225 1
+44 264 1
+44 268 1
+44 271 1
+44 273 1
+44 275 1
+44 278 1
+44 281 1
+44 283 1
+44 285 1
+44 287 1
+44 289 1
+44 291 1
+44 292 1
+44 294 1
+44 295 1
+44 336 1
+44 363 1
+44 368 1
+44 372 1
+44 375 1
+44 377 1
+44 379 1
+44 419 1
+44 424 1
+44 428 1
+44 431 1
+44 433 1
+44 435 1
+44 474 1
+44 478 1
+44 481 1
+44 483 1
+44 485 1
+44 488 1
+44 491 1
+44 493 1
+44 495 1
+44 497 1
+44 499 1
+44 501 1
+44 502 1
+44 504 1
+44 505 1
+44 545 1
+44 550 1
+44 554 1
+44 557 1
+44 559 1
+44 561 1
+44 600 1
+44 604 1
+44 607 1
+44 609 1
+44 611 1
+44 614 1
+44 617 1
+44 619 1
+44 621 1
+44 623 1
+44 625 1
+44 627 1
+44 628 1
+44 630 1
+44 631 1
+44 670 1
+44 674 1
+44 677 1
+44 679 1
+44 681 1
+44 684 1
+44 687 1
+44 689 1
+44 691 1
+44 693 1
+44 695 1
+44 697 1
+44 698 1
+44 700 1
+44 701 1
+44 739 1
+44 742 1
+44 744 1
+44 746 1
+44 748 1
+44 750 1
+44 752 1
+44 753 1
+44 755 1
+44 756 1
+44 758 1
+44 760 1
+44 762 1
+44 763 1
+44 765 1
+44 766 1
+44 767 1
+44 769 1
+44 770 1
+44 771 1
+45 15 1
+45 43 1
+45 70 1
+45 75 1
+45 79 1
+45 82 1
+45 84 1
+45 85 1
+45 127 1
+45 154 1
+45 159 1
+45 163 1
+45 166 1
+45 168 1
+45 169 1
+45 210 1
+45 215 1
+45 219 1
+45 222 1
+45 224 1
+45 225 1
+45 265 1
+45 269 1
+45 272 1
+45 274 1
+45 275 1
+45 279 1
+45 282 1
+45 284 1
+45 285 1
+45 288 1
+45 290 1
+45 291 1
+45 293 1
+45 294 1
+45 295 1
+45 337 1
+45 364 1
+45 369 1
+45 373 1
+45 376 1
+45 378 1
+45 379 1
+45 420 1
+45 425 1
+45 429 1
+45 432 1
+45 434 1
+45 435 1
+45 475 1
+45 479 1
+45 482 1
+45 484 1
+45 485 1
+45 489 1
+45 492 1
+45 494 1
+45 495 1
+45 498 1
+45 500 1
+45 501 1
+45 503 1
+45 504 1
+45 505 1
+45 546 1
+45 551 1
+45 555 1
+45 558 1
+45 560 1
+45 561 1
+45 601 1
+45 605 1
+45 608 1
+45 610 1
+45 611 1
+45 615 1
+45 618 1
+45 620 1
+45 621 1
+45 624 1
+45 626 1
+45 627 1
+45 629 1
+45 630 1
+45 631 1
+45 671 1
+45 675 1
+45 678 1
+45 680 1
+45 681 1
+45 685 1
+45 688 1
+45 690 1
+45 691 1
+45 694 1
+45 696 1
+45 697 1
+45 699 1
+45 700 1
+45 701 1
+45 740 1
+45 743 1
+45 745 1
+45 746 1
+45 749 1
+45 751 1
+45 752 1
+45 754 1
+45 755 1
+45 756 1
+45 759 1
+45 761 1
+45 762 1
+45 764 1
+45 765 1
+45 766 1
+45 768 1
+45 769 1
+45 770 1
+45 771 1
+46 16 1
+46 44 1
+46 65 1
+46 86 1
+46 87 1
+46 88 1
+46 89 1
+46 90 1
+46 128 1
+46 149 1
+46 170 1
+46 171 1
+46 172 1
+46 173 1
+46 174 1
+46 205 1
+46 226 1
+46 227 1
+46 228 1
+46 229 1
+46 230 1
+46 261 1
+46 262 1
+46 263 1
+46 264 1
+46 265 1
+46 296 1
+46 297 1
+46 298 1
+46 299 1
+46 300 1
+46 301 1
+46 302 1
+46 303 1
+46 304 1
+46 305 1
+46 338 1
+46 359 1
+46 380 1
+46 381 1
+46 382 1
+46 383 1
+46 384 1
+46 415 1
+46 436 1
+46 437 1
+46 438 1
+46 439 1
+46 440 1
+46 471 1
+46 472 1
+46 473 1
+46 474 1
+46 475 1
+46 506 1
+46 507 1
+46 508 1
+46 509 1
+46 510 1
+46 511 1
+46 512 1
+46 513 1
+46 514 1
+46 515 1
+46 541 1
+46 562 1
+46 563 1
+46 564 1
+46 565 1
+46 566 1
+46 597 1
+46 598 1
+46 599 1
+46 600 1
+46 601 1
+46 632 1
+46 633 1
+46 634 1
+46 635 1
+46 636 1
+46 637 1
+46 638 1
+46 639 1
+46 640 1
+46 641 1
+46 667 1
+46 668 1
+46 669 1
+46 670 1
+46 671 1
+46 702 1
+46 703 1
+46 704 1
+46 705 1
+46 706 1
+46 707 1
+46 708 1
+46 709 1
+46 710 1
+46 711 1
+46 737 1
+46 738 1
+46 739 1
+46 740 1
+46 741 1
+46 742 1
+46 743 1
+46 744 1
+46 745 1
+46 746 1
+46 772 1
+46 773 1
+46 774 1
+46 775 1
+46 776 1
+46 777 1
+46 778 1
+46 779 1
+46 780 1
+46 781 1
+47 17 1
+47 45 1
+47 66 1
+47 86 1
+47 91 1
+47 92 1
+47 93 1
+47 94 1
+47 129 1
+47 150 1
+47 170 1
+47 175 1
+47 176 1
+47 177 1
+47 178 1
+47 206 1
+47 226 1
+47 231 1
+47 232 1
+47 233 1
+47 234 1
+47 261 1
+47 266 1
+47 267 1
+47 268 1
+47 269 1
+47 296 1
+47 297 1
+47 298 1
+47 299 1
+47 306 1
+47 307 1
+47 308 1
+47 309 1
+47 310 1
+47 311 1
+47 339 1
+47 360 1
+47 380 1
+47 385 1
+47 386 1
+47 387 1
+47 388 1
+47 416 1
+47 436 1
+47 441 1
+47 442 1
+47 443 1
+47 444 1
+47 471 1
+47 476 1
+47 477 1
+47 478 1
+47 479 1
+47 506 1
+47 507 1
+47 508 1
+47 509 1
+47 516 1
+47 517 1
+47 518 1
+47 519 1
+47 520 1
+47 521 1
+47 542 1
+47 562 1
+47 567 1
+47 568 1
+47 569 1
+47 570 1
+47 597 1
+47 602 1
+47 603 1
+47 604 1
+47 605 1
+47 632 1
+47 633 1
+47 634 1
+47 635 1
+47 642 1
+47 643 1
+47 644 1
+47 645 1
+47 646 1
+47 647 1
+47 667 1
+47 672 1
+47 673 1
+47 674 1
+47 675 1
+47 702 1
+47 703 1
+47 704 1
+47 705 1
+47 712 1
+47 713 1
+47 714 1
+47 715 1
+47 716 1
+47 717 1
+47 737 1
+47 738 1
+47 739 1
+47 740 1
+47 747 1
+47 748 1
+47 749 1
+47 750 1
+47 751 1
+47 752 1
+47 772 1
+47 773 1
+47 774 1
+47 775 1
+47 776 1
+47 777 1
+47 782 1
+47 783 1
+47 784 1
+47 785 1
+48 18 1
+48 46 1
+48 67 1
+48 87 1
+48 91 1
+48 95 1
+48 96 1
+48 97 1
+48 130 1
+48 151 1
+48 171 1
+48 175 1
+48 179 1
+48 180 1
+48 181 1
+48 207 1
+48 227 1
+48 231 1
+48 235 1
+48 236 1
+48 237 1
+48 262 1
+48 266 1
+48 270 1
+48 271 1
+48 272 1
+48 296 1
+48 300 1
+48 301 1
+48 302 1
+48 306 1
+48 307 1
+48 308 1
+48 312 1
+48 313 1
+48 314 1
+48 340 1
+48 361 1
+48 381 1
+48 385 1
+48 389 1
+48 390 1
+48 391 1
+48 417 1
+48 437 1
+48 441 1
+48 445 1
+48 446 1
+48 447 1
+48 472 1
+48 476 1
+48 480 1
+48 481 1
+48 482 1
+48 506 1
+48 510 1
+48 511 1
+48 512 1
+48 516 1
+48 517 1
+48 518 1
+48 522 1
+48 523 1
+48 524 1
+48 543 1
+48 563 1
+48 567 1
+48 571 1
+48 572 1
+48 573 1
+48 598 1
+48 602 1
+48 606 1
+48 607 1
+48 608 1
+48 632 1
+48 636 1
+48 637 1
+48 638 1
+48 642 1
+48 643 1
+48 644 1
+48 648 1
+48 649 1
+48 650 1
+48 668 1
+48 672 1
+48 676 1
+48 677 1
+48 678 1
+48 702 1
+48 706 1
+48 707 1
+48 708 1
+48 712 1
+48 713 1
+48 714 1
+48 718 1
+48 719 1
+48 720 1
+48 737 1
+48 741 1
+48 742 1
+48 743 1
+48 747 1
+48 748 1
+48 749 1
+48 753 1
+48 754 1
+48 755 1
+48 772 1
+48 773 1
+48 774 1
+48 778 1
+48 779 1
+48 780 1
+48 782 1
+48 783 1
+48 784 1
+48 786 1
+49 19 1
+49 47 1
+49 68 1
+49 88 1
+49 92 1
+49 95 1
+49 98 1
+49 99 1
+49 131 1
+49 152 1
+49 172 1
+49 176 1
+49 179 1
+49 182 1
+49 183 1
+49 208 1
+49 228 1
+49 232 1
+49 235 1
+49 238 1
+49 239 1
+49 263 1
+49 267 1
+49 270 1
+49 273 1
+49 274 1
+49 297 1
+49 300 1
+49 303 1
+49 304 1
+49 306 1
+49 309 1
+49 310 1
+49 312 1
+49 313 1
+49 315 1
+49 341 1
+49 362 1
+49 382 1
+49 386 1
+49 389 1
+49 392 1
+49 393 1
+49 418 1
+49 438 1
+49 442 1
+49 445 1
+49 448 1
+49 449 1
+49 473 1
+49 477 1
+49 480 1
+49 483 1
+49 484 1
+49 507 1
+49 510 1
+49 513 1
+49 514 1
+49 516 1
+49 519 1
+49 520 1
+49 522 1
+49 523 1
+49 525 1
+49 544 1
+49 564 1
+49 568 1
+49 571 1
+49 574 1
+49 575 1
+49 599 1
+49 603 1
+49 606 1
+49 609 1
+49 610 1
+49 633 1
+49 636 1
+49 639 1
+49 640 1
+49 642 1
+49 645 1
+49 646 1
+49 648 1
+49 649 1
+49 651 1
+49 669 1
+49 673 1
+49 676 1
+49 679 1
+49 680 1
+49 703 1
+49 706 1
+49 709 1
+49 710 1
+49 712 1
+49 715 1
+49 716 1
+49 718 1
+49 719 1
+49 721 1
+49 738 1
+49 741 1
+49 744 1
+49 745 1
+49 747 1
+49 750 1
+49 751 1
+49 753 1
+49 754 1
+49 756 1
+49 772 1
+49 775 1
+49 776 1
+49 778 1
+49 779 1
+49 781 1
+49 782 1
+49 783 1
+49 785 1
+49 786 1
+50 20 1
+50 48 1
+50 69 1
+50 89 1
+50 93 1
+50 96 1
+50 98 1
+50 100 1
+50 132 1
+50 153 1
+50 173 1
+50 177 1
+50 180 1
+50 182 1
+50 184 1
+50 209 1
+50 229 1
+50 233 1
+50 236 1
+50 238 1
+50 240 1
+50 264 1
+50 268 1
+50 271 1
+50 273 1
+50 275 1
+50 298 1
+50 301 1
+50 303 1
+50 305 1
+50 307 1
+50 309 1
+50 311 1
+50 312 1
+50 314 1
+50 315 1
+50 342 1
+50 363 1
+50 383 1
+50 387 1
+50 390 1
+50 392 1
+50 394 1
+50 419 1
+50 439 1
+50 443 1
+50 446 1
+50 448 1
+50 450 1
+50 474 1
+50 478 1
+50 481 1
+50 483 1
+50 485 1
+50 508 1
+50 511 1
+50 513 1
+50 515 1
+50 517 1
+50 519 1
+50 521 1
+50 522 1
+50 524 1
+50 525 1
+50 545 1
+50 565 1
+50 569 1
+50 572 1
+50 574 1
+50 576 1
+50 600 1
+50 604 1
+50 607 1
+50 609 1
+50 611 1
+50 634 1
+50 637 1
+50 639 1
+50 641 1
+50 643 1
+50 645 1
+50 647 1
+50 648 1
+50 650 1
+50 651 1
+50 670 1
+50 674 1
+50 677 1
+50 679 1
+50 681 1
+50 704 1
+50 707 1
+50 709 1
+50 711 1
+50 713 1
+50 715 1
+50 717 1
+50 718 1
+50 720 1
+50 721 1
+50 739 1
+50 742 1
+50 744 1
+50 746 1
+50 748 1
+50 750 1
+50 752 1
+50 753 1
+50 755 1
+50 756 1
+50 773 1
+50 775 1
+50 777 1
+50 778 1
+50 780 1
+50 781 1
+50 782 1
+50 784 1
+50 785 1
+50 786 1
+51 21 1
+51 49 1
+51 70 1
+51 90 1
+51 94 1
+51 97 1
+51 99 1
+51 100 1
+51 133 1
+51 154 1
+51 174 1
+51 178 1
+51 181 1
+51 183 1
+51 184 1
+51 210 1
+51 230 1
+51 234 1
+51 237 1
+51 239 1
+51 240 1
+51 265 1
+51 269 1
+51 272 1
+51 274 1
+51 275 1
+51 299 1
+51 302 1
+51 304 1
+51 305 1
+51 308 1
+51 310 1
+51 311 1
+51 313 1
+51 314 1
+51 315 1
+51 343 1
+51 364 1
+51 384 1
+51 388 1
+51 391 1
+51 393 1
+51 394 1
+51 420 1
+51 440 1
+51 444 1
+51 447 1
+51 449 1
+51 450 1
+51 475 1
+51 479 1
+51 482 1
+51 484 1
+51 485 1
+51 509 1
+51 512 1
+51 514 1
+51 515 1
+51 518 1
+51 520 1
+51 521 1
+51 523 1
+51 524 1
+51 525 1
+51 546 1
+51 566 1
+51 570 1
+51 573 1
+51 575 1
+51 576 1
+51 601 1
+51 605 1
+51 608 1
+51 610 1
+51 611 1
+51 635 1
+51 638 1
+51 640 1
+51 641 1
+51 644 1
+51 646 1
+51 647 1
+51 649 1
+51 650 1
+51 651 1
+51 671 1
+51 675 1
+51 678 1
+51 680 1
+51 681 1
+51 705 1
+51 708 1
+51 710 1
+51 711 1
+51 714 1
+51 716 1
+51 717 1
+51 719 1
+51 720 1
+51 721 1
+51 740 1
+51 743 1
+51 745 1
+51 746 1
+51 749 1
+51 751 1
+51 752 1
+51 754 1
+51 755 1
+51 756 1
+51 774 1
+51 776 1
+51 777 1
+51 779 1
+51 780 1
+51 781 1
+51 783 1
+51 784 1
+51 785 1
+51 786 1
+52 22 1
+52 50 1
+52 71 1
+52 86 1
+52 101 1
+52 102 1
+52 103 1
+52 104 1
+52 134 1
+52 155 1
+52 170 1
+52 185 1
+52 186 1
+52 187 1
+52 188 1
+52 211 1
+52 226 1
+52 241 1
+52 242 1
+52 243 1
+52 244 1
+52 261 1
+52 276 1
+52 277 1
+52 278 1
+52 279 1
+52 296 1
+52 297 1
+52 298 1
+52 299 1
+52 316 1
+52 317 1
+52 318 1
+52 319 1
+52 320 1
+52 321 1
+52 344 1
+52 365 1
+52 380 1
+52 395 1
+52 396 1
+52 397 1
+52 398 1
+52 421 1
+52 436 1
+52 451 1
+52 452 1
+52 453 1
+52 454 1
+52 471 1
+52 486 1
+52 487 1
+52 488 1
+52 489 1
+52 506 1
+52 507 1
+52 508 1
+52 509 1
+52 526 1
+52 527 1
+52 528 1
+52 529 1
+52 530 1
+52 531 1
+52 547 1
+52 562 1
+52 577 1
+52 578 1
+52 579 1
+52 580 1
+52 597 1
+52 612 1
+52 613 1
+52 614 1
+52 615 1
+52 632 1
+52 633 1
+52 634 1
+52 635 1
+52 652 1
+52 653 1
+52 654 1
+52 655 1
+52 656 1
+52 657 1
+52 667 1
+52 682 1
+52 683 1
+52 684 1
+52 685 1
+52 702 1
+52 703 1
+52 704 1
+52 705 1
+52 722 1
+52 723 1
+52 724 1
+52 725 1
+52 726 1
+52 727 1
+52 737 1
+52 738 1
+52 739 1
+52 740 1
+52 757 1
+52 758 1
+52 759 1
+52 760 1
+52 761 1
+52 762 1
+52 772 1
+52 773 1
+52 774 1
+52 775 1
+52 776 1
+52 777 1
+52 787 1
+52 788 1
+52 789 1
+52 790 1
+53 23 1
+53 51 1
+53 72 1
+53 87 1
+53 101 1
+53 105 1
+53 106 1
+53 107 1
+53 135 1
+53 156 1
+53 171 1
+53 185 1
+53 189 1
+53 190 1
+53 191 1
+53 212 1
+53 227 1
+53 241 1
+53 245 1
+53 246 1
+53 247 1
+53 262 1
+53 276 1
+53 280 1
+53 281 1
+53 282 1
+53 296 1
+53 300 1
+53 301 1
+53 302 1
+53 316 1
+53 317 1
+53 318 1
+53 322 1
+53 323 1
+53 324 1
+53 345 1
+53 366 1
+53 381 1
+53 395 1
+53 399 1
+53 400 1
+53 401 1
+53 422 1
+53 437 1
+53 451 1
+53 455 1
+53 456 1
+53 457 1
+53 472 1
+53 486 1
+53 490 1
+53 491 1
+53 492 1
+53 506 1
+53 510 1
+53 511 1
+53 512 1
+53 526 1
+53 527 1
+53 528 1
+53 532 1
+53 533 1
+53 534 1
+53 548 1
+53 563 1
+53 577 1
+53 581 1
+53 582 1
+53 583 1
+53 598 1
+53 612 1
+53 616 1
+53 617 1
+53 618 1
+53 632 1
+53 636 1
+53 637 1
+53 638 1
+53 652 1
+53 653 1
+53 654 1
+53 658 1
+53 659 1
+53 660 1
+53 668 1
+53 682 1
+53 686 1
+53 687 1
+53 688 1
+53 702 1
+53 706 1
+53 707 1
+53 708 1
+53 722 1
+53 723 1
+53 724 1
+53 728 1
+53 729 1
+53 730 1
+53 737 1
+53 741 1
+53 742 1
+53 743 1
+53 757 1
+53 758 1
+53 759 1
+53 763 1
+53 764 1
+53 765 1
+53 772 1
+53 773 1
+53 774 1
+53 778 1
+53 779 1
+53 780 1
+53 787 1
+53 788 1
+53 789 1
+53 791 1
+54 24 1
+54 52 1
+54 73 1
+54 88 1
+54 102 1
+54 105 1
+54 108 1
+54 109 1
+54 136 1
+54 157 1
+54 172 1
+54 186 1
+54 189 1
+54 192 1
+54 193 1
+54 213 1
+54 228 1
+54 242 1
+54 245 1
+54 248 1
+54 249 1
+54 263 1
+54 277 1
+54 280 1
+54 283 1
+54 284 1
+54 297 1
+54 300 1
+54 303 1
+54 304 1
+54 316 1
+54 319 1
+54 320 1
+54 322 1
+54 323 1
+54 325 1
+54 346 1
+54 367 1
+54 382 1
+54 396 1
+54 399 1
+54 402 1
+54 403 1
+54 423 1
+54 438 1
+54 452 1
+54 455 1
+54 458 1
+54 459 1
+54 473 1
+54 487 1
+54 490 1
+54 493 1
+54 494 1
+54 507 1
+54 510 1
+54 513 1
+54 514 1
+54 526 1
+54 529 1
+54 530 1
+54 532 1
+54 533 1
+54 535 1
+54 549 1
+54 564 1
+54 578 1
+54 581 1
+54 584 1
+54 585 1
+54 599 1
+54 613 1
+54 616 1
+54 619 1
+54 620 1
+54 633 1
+54 636 1
+54 639 1
+54 640 1
+54 652 1
+54 655 1
+54 656 1
+54 658 1
+54 659 1
+54 661 1
+54 669 1
+54 683 1
+54 686 1
+54 689 1
+54 690 1
+54 703 1
+54 706 1
+54 709 1
+54 710 1
+54 722 1
+54 725 1
+54 726 1
+54 728 1
+54 729 1
+54 731 1
+54 738 1
+54 741 1
+54 744 1
+54 745 1
+54 757 1
+54 760 1
+54 761 1
+54 763 1
+54 764 1
+54 766 1
+54 772 1
+54 775 1
+54 776 1
+54 778 1
+54 779 1
+54 781 1
+54 787 1
+54 788 1
+54 790 1
+54 791 1
+55 25 1
+55 53 1
+55 74 1
+55 89 1
+55 103 1
+55 106 1
+55 108 1
+55 110 1
+55 137 1
+55 158 1
+55 173 1
+55 187 1
+55 190 1
+55 192 1
+55 194 1
+55 214 1
+55 229 1
+55 243 1
+55 246 1
+55 248 1
+55 250 1
+55 264 1
+55 278 1
+55 281 1
+55 283 1
+55 285 1
+55 298 1
+55 301 1
+55 303 1
+55 305 1
+55 317 1
+55 319 1
+55 321 1
+55 322 1
+55 324 1
+55 325 1
+55 347 1
+55 368 1
+55 383 1
+55 397 1
+55 400 1
+55 402 1
+55 404 1
+55 424 1
+55 439 1
+55 453 1
+55 456 1
+55 458 1
+55 460 1
+55 474 1
+55 488 1
+55 491 1
+55 493 1
+55 495 1
+55 508 1
+55 511 1
+55 513 1
+55 515 1
+55 527 1
+55 529 1
+55 531 1
+55 532 1
+55 534 1
+55 535 1
+55 550 1
+55 565 1
+55 579 1
+55 582 1
+55 584 1
+55 586 1
+55 600 1
+55 614 1
+55 617 1
+55 619 1
+55 621 1
+55 634 1
+55 637 1
+55 639 1
+55 641 1
+55 653 1
+55 655 1
+55 657 1
+55 658 1
+55 660 1
+55 661 1
+55 670 1
+55 684 1
+55 687 1
+55 689 1
+55 691 1
+55 704 1
+55 707 1
+55 709 1
+55 711 1
+55 723 1
+55 725 1
+55 727 1
+55 728 1
+55 730 1
+55 731 1
+55 739 1
+55 742 1
+55 744 1
+55 746 1
+55 758 1
+55 760 1
+55 762 1
+55 763 1
+55 765 1
+55 766 1
+55 773 1
+55 775 1
+55 777 1
+55 778 1
+55 780 1
+55 781 1
+55 787 1
+55 789 1
+55 790 1
+55 791 1
+56 26 1
+56 54 1
+56 75 1
+56 90 1
+56 104 1
+56 107 1
+56 109 1
+56 110 1
+56 138 1
+56 159 1
+56 174 1
+56 188 1
+56 191 1
+56 193 1
+56 194 1
+56 215 1
+56 230 1
+56 244 1
+56 247 1
+56 249 1
+56 250 1
+56 265 1
+56 279 1
+56 282 1
+56 284 1
+56 285 1
+56 299 1
+56 302 1
+56 304 1
+56 305 1
+56 318 1
+56 320 1
+56 321 1
+56 323 1
+56 324 1
+56 325 1
+56 348 1
+56 369 1
+56 384 1
+56 398 1
+56 401 1
+56 403 1
+56 404 1
+56 425 1
+56 440 1
+56 454 1
+56 457 1
+56 459 1
+56 460 1
+56 475 1
+56 489 1
+56 492 1
+56 494 1
+56 495 1
+56 509 1
+56 512 1
+56 514 1
+56 515 1
+56 528 1
+56 530 1
+56 531 1
+56 533 1
+56 534 1
+56 535 1
+56 551 1
+56 566 1
+56 580 1
+56 583 1
+56 585 1
+56 586 1
+56 601 1
+56 615 1
+56 618 1
+56 620 1
+56 621 1
+56 635 1
+56 638 1
+56 640 1
+56 641 1
+56 654 1
+56 656 1
+56 657 1
+56 659 1
+56 660 1
+56 661 1
+56 671 1
+56 685 1
+56 688 1
+56 690 1
+56 691 1
+56 705 1
+56 708 1
+56 710 1
+56 711 1
+56 724 1
+56 726 1
+56 727 1
+56 729 1
+56 730 1
+56 731 1
+56 740 1
+56 743 1
+56 745 1
+56 746 1
+56 759 1
+56 761 1
+56 762 1
+56 764 1
+56 765 1
+56 766 1
+56 774 1
+56 776 1
+56 777 1
+56 779 1
+56 780 1
+56 781 1
+56 788 1
+56 789 1
+56 790 1
+56 791 1
+57 27 1
+57 55 1
+57 76 1
+57 91 1
+57 101 1
+57 111 1
+57 112 1
+57 113 1
+57 139 1
+57 160 1
+57 175 1
+57 185 1
+57 195 1
+57 196 1
+57 197 1
+57 216 1
+57 231 1
+57 241 1
+57 251 1
+57 252 1
+57 253 1
+57 266 1
+57 276 1
+57 286 1
+57 287 1
+57 288 1
+57 296 1
+57 306 1
+57 307 1
+57 308 1
+57 316 1
+57 317 1
+57 318 1
+57 326 1
+57 327 1
+57 328 1
+57 349 1
+57 370 1
+57 385 1
+57 395 1
+57 405 1
+57 406 1
+57 407 1
+57 426 1
+57 441 1
+57 451 1
+57 461 1
+57 462 1
+57 463 1
+57 476 1
+57 486 1
+57 496 1
+57 497 1
+57 498 1
+57 506 1
+57 516 1
+57 517 1
+57 518 1
+57 526 1
+57 527 1
+57 528 1
+57 536 1
+57 537 1
+57 538 1
+57 552 1
+57 567 1
+57 577 1
+57 587 1
+57 588 1
+57 589 1
+57 602 1
+57 612 1
+57 622 1
+57 623 1
+57 624 1
+57 632 1
+57 642 1
+57 643 1
+57 644 1
+57 652 1
+57 653 1
+57 654 1
+57 662 1
+57 663 1
+57 664 1
+57 672 1
+57 682 1
+57 692 1
+57 693 1
+57 694 1
+57 702 1
+57 712 1
+57 713 1
+57 714 1
+57 722 1
+57 723 1
+57 724 1
+57 732 1
+57 733 1
+57 734 1
+57 737 1
+57 747 1
+57 748 1
+57 749 1
+57 757 1
+57 758 1
+57 759 1
+57 767 1
+57 768 1
+57 769 1
+57 772 1
+57 773 1
+57 774 1
+57 782 1
+57 783 1
+57 784 1
+57 787 1
+57 788 1
+57 789 1
+57 792 1
+58 28 1
+58 56 1
+58 77 1
+58 92 1
+58 102 1
+58 111 1
+58 114 1
+58 115 1
+58 140 1
+58 161 1
+58 176 1
+58 186 1
+58 195 1
+58 198 1
+58 199 1
+58 217 1
+58 232 1
+58 242 1
+58 251 1
+58 254 1
+58 255 1
+58 267 1
+58 277 1
+58 286 1
+58 289 1
+58 290 1
+58 297 1
+58 306 1
+58 309 1
+58 310 1
+58 316 1
+58 319 1
+58 320 1
+58 326 1
+58 327 1
+58 329 1
+58 350 1
+58 371 1
+58 386 1
+58 396 1
+58 405 1
+58 408 1
+58 409 1
+58 427 1
+58 442 1
+58 452 1
+58 461 1
+58 464 1
+58 465 1
+58 477 1
+58 487 1
+58 496 1
+58 499 1
+58 500 1
+58 507 1
+58 516 1
+58 519 1
+58 520 1
+58 526 1
+58 529 1
+58 530 1
+58 536 1
+58 537 1
+58 539 1
+58 553 1
+58 568 1
+58 578 1
+58 587 1
+58 590 1
+58 591 1
+58 603 1
+58 613 1
+58 622 1
+58 625 1
+58 626 1
+58 633 1
+58 642 1
+58 645 1
+58 646 1
+58 652 1
+58 655 1
+58 656 1
+58 662 1
+58 663 1
+58 665 1
+58 673 1
+58 683 1
+58 692 1
+58 695 1
+58 696 1
+58 703 1
+58 712 1
+58 715 1
+58 716 1
+58 722 1
+58 725 1
+58 726 1
+58 732 1
+58 733 1
+58 735 1
+58 738 1
+58 747 1
+58 750 1
+58 751 1
+58 757 1
+58 760 1
+58 761 1
+58 767 1
+58 768 1
+58 770 1
+58 772 1
+58 775 1
+58 776 1
+58 782 1
+58 783 1
+58 785 1
+58 787 1
+58 788 1
+58 790 1
+58 792 1
+59 29 1
+59 57 1
+59 78 1
+59 93 1
+59 103 1
+59 112 1
+59 114 1
+59 116 1
+59 141 1
+59 162 1
+59 177 1
+59 187 1
+59 196 1
+59 198 1
+59 200 1
+59 218 1
+59 233 1
+59 243 1
+59 252 1
+59 254 1
+59 256 1
+59 268 1
+59 278 1
+59 287 1
+59 289 1
+59 291 1
+59 298 1
+59 307 1
+59 309 1
+59 311 1
+59 317 1
+59 319 1
+59 321 1
+59 326 1
+59 328 1
+59 329 1
+59 351 1
+59 372 1
+59 387 1
+59 397 1
+59 406 1
+59 408 1
+59 410 1
+59 428 1
+59 443 1
+59 453 1
+59 462 1
+59 464 1
+59 466 1
+59 478 1
+59 488 1
+59 497 1
+59 499 1
+59 501 1
+59 508 1
+59 517 1
+59 519 1
+59 521 1
+59 527 1
+59 529 1
+59 531 1
+59 536 1
+59 538 1
+59 539 1
+59 554 1
+59 569 1
+59 579 1
+59 588 1
+59 590 1
+59 592 1
+59 604 1
+59 614 1
+59 623 1
+59 625 1
+59 627 1
+59 634 1
+59 643 1
+59 645 1
+59 647 1
+59 653 1
+59 655 1
+59 657 1
+59 662 1
+59 664 1
+59 665 1
+59 674 1
+59 684 1
+59 693 1
+59 695 1
+59 697 1
+59 704 1
+59 713 1
+59 715 1
+59 717 1
+59 723 1
+59 725 1
+59 727 1
+59 732 1
+59 734 1
+59 735 1
+59 739 1
+59 748 1
+59 750 1
+59 752 1
+59 758 1
+59 760 1
+59 762 1
+59 767 1
+59 769 1
+59 770 1
+59 773 1
+59 775 1
+59 777 1
+59 782 1
+59 784 1
+59 785 1
+59 787 1
+59 789 1
+59 790 1
+59 792 1
+60 30 1
+60 58 1
+60 79 1
+60 94 1
+60 104 1
+60 113 1
+60 115 1
+60 116 1
+60 142 1
+60 163 1
+60 178 1
+60 188 1
+60 197 1
+60 199 1
+60 200 1
+60 219 1
+60 234 1
+60 244 1
+60 253 1
+60 255 1
+60 256 1
+60 269 1
+60 279 1
+60 288 1
+60 290 1
+60 291 1
+60 299 1
+60 308 1
+60 310 1
+60 311 1
+60 318 1
+60 320 1
+60 321 1
+60 327 1
+60 328 1
+60 329 1
+60 352 1
+60 373 1
+60 388 1
+60 398 1
+60 407 1
+60 409 1
+60 410 1
+60 429 1
+60 444 1
+60 454 1
+60 463 1
+60 465 1
+60 466 1
+60 479 1
+60 489 1
+60 498 1
+60 500 1
+60 501 1
+60 509 1
+60 518 1
+60 520 1
+60 521 1
+60 528 1
+60 530 1
+60 531 1
+60 537 1
+60 538 1
+60 539 1
+60 555 1
+60 570 1
+60 580 1
+60 589 1
+60 591 1
+60 592 1
+60 605 1
+60 615 1
+60 624 1
+60 626 1
+60 627 1
+60 635 1
+60 644 1
+60 646 1
+60 647 1
+60 654 1
+60 656 1
+60 657 1
+60 663 1
+60 664 1
+60 665 1
+60 675 1
+60 685 1
+60 694 1
+60 696 1
+60 697 1
+60 705 1
+60 714 1
+60 716 1
+60 717 1
+60 724 1
+60 726 1
+60 727 1
+60 733 1
+60 734 1
+60 735 1
+60 740 1
+60 749 1
+60 751 1
+60 752 1
+60 759 1
+60 761 1
+60 762 1
+60 768 1
+60 769 1
+60 770 1
+60 774 1
+60 776 1
+60 777 1
+60 783 1
+60 784 1
+60 785 1
+60 788 1
+60 789 1
+60 790 1
+60 792 1
+61 31 1
+61 59 1
+61 80 1
+61 95 1
+61 105 1
+61 111 1
+61 117 1
+61 118 1
+61 143 1
+61 164 1
+61 179 1
+61 189 1
+61 195 1
+61 201 1
+61 202 1
+61 220 1
+61 235 1
+61 245 1
+61 251 1
+61 257 1
+61 258 1
+61 270 1
+61 280 1
+61 286 1
+61 292 1
+61 293 1
+61 300 1
+61 306 1
+61 312 1
+61 313 1
+61 316 1
+61 322 1
+61 323 1
+61 326 1
+61 327 1
+61 330 1
+61 353 1
+61 374 1
+61 389 1
+61 399 1
+61 405 1
+61 411 1
+61 412 1
+61 430 1
+61 445 1
+61 455 1
+61 461 1
+61 467 1
+61 468 1
+61 480 1
+61 490 1
+61 496 1
+61 502 1
+61 503 1
+61 510 1
+61 516 1
+61 522 1
+61 523 1
+61 526 1
+61 532 1
+61 533 1
+61 536 1
+61 537 1
+61 540 1
+61 556 1
+61 571 1
+61 581 1
+61 587 1
+61 593 1
+61 594 1
+61 606 1
+61 616 1
+61 622 1
+61 628 1
+61 629 1
+61 636 1
+61 642 1
+61 648 1
+61 649 1
+61 652 1
+61 658 1
+61 659 1
+61 662 1
+61 663 1
+61 666 1
+61 676 1
+61 686 1
+61 692 1
+61 698 1
+61 699 1
+61 706 1
+61 712 1
+61 718 1
+61 719 1
+61 722 1
+61 728 1
+61 729 1
+61 732 1
+61 733 1
+61 736 1
+61 741 1
+61 747 1
+61 753 1
+61 754 1
+61 757 1
+61 763 1
+61 764 1
+61 767 1
+61 768 1
+61 771 1
+61 772 1
+61 778 1
+61 779 1
+61 782 1
+61 783 1
+61 786 1
+61 787 1
+61 788 1
+61 791 1
+61 792 1
+62 32 1
+62 60 1
+62 81 1
+62 96 1
+62 106 1
+62 112 1
+62 117 1
+62 119 1
+62 144 1
+62 165 1
+62 180 1
+62 190 1
+62 196 1
+62 201 1
+62 203 1
+62 221 1
+62 236 1
+62 246 1
+62 252 1
+62 257 1
+62 259 1
+62 271 1
+62 281 1
+62 287 1
+62 292 1
+62 294 1
+62 301 1
+62 307 1
+62 312 1
+62 314 1
+62 317 1
+62 322 1
+62 324 1
+62 326 1
+62 328 1
+62 330 1
+62 354 1
+62 375 1
+62 390 1
+62 400 1
+62 406 1
+62 411 1
+62 413 1
+62 431 1
+62 446 1
+62 456 1
+62 462 1
+62 467 1
+62 469 1
+62 481 1
+62 491 1
+62 497 1
+62 502 1
+62 504 1
+62 511 1
+62 517 1
+62 522 1
+62 524 1
+62 527 1
+62 532 1
+62 534 1
+62 536 1
+62 538 1
+62 540 1
+62 557 1
+62 572 1
+62 582 1
+62 588 1
+62 593 1
+62 595 1
+62 607 1
+62 617 1
+62 623 1
+62 628 1
+62 630 1
+62 637 1
+62 643 1
+62 648 1
+62 650 1
+62 653 1
+62 658 1
+62 660 1
+62 662 1
+62 664 1
+62 666 1
+62 677 1
+62 687 1
+62 693 1
+62 698 1
+62 700 1
+62 707 1
+62 713 1
+62 718 1
+62 720 1
+62 723 1
+62 728 1
+62 730 1
+62 732 1
+62 734 1
+62 736 1
+62 742 1
+62 748 1
+62 753 1
+62 755 1
+62 758 1
+62 763 1
+62 765 1
+62 767 1
+62 769 1
+62 771 1
+62 773 1
+62 778 1
+62 780 1
+62 782 1
+62 784 1
+62 786 1
+62 787 1
+62 789 1
+62 791 1
+62 792 1
+63 33 1
+63 61 1
+63 82 1
+63 97 1
+63 107 1
+63 113 1
+63 118 1
+63 119 1
+63 145 1
+63 166 1
+63 181 1
+63 191 1
+63 197 1
+63 202 1
+63 203 1
+63 222 1
+63 237 1
+63 247 1
+63 253 1
+63 258 1
+63 259 1
+63 272 1
+63 282 1
+63 288 1
+63 293 1
+63 294 1
+63 302 1
+63 308 1
+63 313 1
+63 314 1
+63 318 1
+63 323 1
+63 324 1
+63 327 1
+63 328 1
+63 330 1
+63 355 1
+63 376 1
+63 391 1
+63 401 1
+63 407 1
+63 412 1
+63 413 1
+63 432 1
+63 447 1
+63 457 1
+63 463 1
+63 468 1
+63 469 1
+63 482 1
+63 492 1
+63 498 1
+63 503 1
+63 504 1
+63 512 1
+63 518 1
+63 523 1
+63 524 1
+63 528 1
+63 533 1
+63 534 1
+63 537 1
+63 538 1
+63 540 1
+63 558 1
+63 573 1
+63 583 1
+63 589 1
+63 594 1
+63 595 1
+63 608 1
+63 618 1
+63 624 1
+63 629 1
+63 630 1
+63 638 1
+63 644 1
+63 649 1
+63 650 1
+63 654 1
+63 659 1
+63 660 1
+63 663 1
+63 664 1
+63 666 1
+63 678 1
+63 688 1
+63 694 1
+63 699 1
+63 700 1
+63 708 1
+63 714 1
+63 719 1
+63 720 1
+63 724 1
+63 729 1
+63 730 1
+63 733 1
+63 734 1
+63 736 1
+63 743 1
+63 749 1
+63 754 1
+63 755 1
+63 759 1
+63 764 1
+63 765 1
+63 768 1
+63 769 1
+63 771 1
+63 774 1
+63 779 1
+63 780 1
+63 783 1
+63 784 1
+63 786 1
+63 788 1
+63 789 1
+63 791 1
+63 792 1
+64 34 1
+64 62 1
+64 83 1
+64 98 1
+64 108 1
+64 114 1
+64 117 1
+64 120 1
+64 146 1
+64 167 1
+64 182 1
+64 192 1
+64 198 1
+64 201 1
+64 204 1
+64 223 1
+64 238 1
+64 248 1
+64 254 1
+64 257 1
+64 260 1
+64 273 1
+64 283 1
+64 289 1
+64 292 1
+64 295 1
+64 303 1
+64 309 1
+64 312 1
+64 315 1
+64 319 1
+64 322 1
+64 325 1
+64 326 1
+64 329 1
+64 330 1
+64 356 1
+64 377 1
+64 392 1
+64 402 1
+64 408 1
+64 411 1
+64 414 1
+64 433 1
+64 448 1
+64 458 1
+64 464 1
+64 467 1
+64 470 1
+64 483 1
+64 493 1
+64 499 1
+64 502 1
+64 505 1
+64 513 1
+64 519 1
+64 522 1
+64 525 1
+64 529 1
+64 532 1
+64 535 1
+64 536 1
+64 539 1
+64 540 1
+64 559 1
+64 574 1
+64 584 1
+64 590 1
+64 593 1
+64 596 1
+64 609 1
+64 619 1
+64 625 1
+64 628 1
+64 631 1
+64 639 1
+64 645 1
+64 648 1
+64 651 1
+64 655 1
+64 658 1
+64 661 1
+64 662 1
+64 665 1
+64 666 1
+64 679 1
+64 689 1
+64 695 1
+64 698 1
+64 701 1
+64 709 1
+64 715 1
+64 718 1
+64 721 1
+64 725 1
+64 728 1
+64 731 1
+64 732 1
+64 735 1
+64 736 1
+64 744 1
+64 750 1
+64 753 1
+64 756 1
+64 760 1
+64 763 1
+64 766 1
+64 767 1
+64 770 1
+64 771 1
+64 775 1
+64 778 1
+64 781 1
+64 782 1
+64 785 1
+64 786 1
+64 787 1
+64 790 1
+64 791 1
+64 792 1
+65 35 1
+65 63 1
+65 84 1
+65 99 1
+65 109 1
+65 115 1
+65 118 1
+65 120 1
+65 147 1
+65 168 1
+65 183 1
+65 193 1
+65 199 1
+65 202 1
+65 204 1
+65 224 1
+65 239 1
+65 249 1
+65 255 1
+65 258 1
+65 260 1
+65 274 1
+65 284 1
+65 290 1
+65 293 1
+65 295 1
+65 304 1
+65 310 1
+65 313 1
+65 315 1
+65 320 1
+65 323 1
+65 325 1
+65 327 1
+65 329 1
+65 330 1
+65 357 1
+65 378 1
+65 393 1
+65 403 1
+65 409 1
+65 412 1
+65 414 1
+65 434 1
+65 449 1
+65 459 1
+65 465 1
+65 468 1
+65 470 1
+65 484 1
+65 494 1
+65 500 1
+65 503 1
+65 505 1
+65 514 1
+65 520 1
+65 523 1
+65 525 1
+65 530 1
+65 533 1
+65 535 1
+65 537 1
+65 539 1
+65 540 1
+65 560 1
+65 575 1
+65 585 1
+65 591 1
+65 594 1
+65 596 1
+65 610 1
+65 620 1
+65 626 1
+65 629 1
+65 631 1
+65 640 1
+65 646 1
+65 649 1
+65 651 1
+65 656 1
+65 659 1
+65 661 1
+65 663 1
+65 665 1
+65 666 1
+65 680 1
+65 690 1
+65 696 1
+65 699 1
+65 701 1
+65 710 1
+65 716 1
+65 719 1
+65 721 1
+65 726 1
+65 729 1
+65 731 1
+65 733 1
+65 735 1
+65 736 1
+65 745 1
+65 751 1
+65 754 1
+65 756 1
+65 761 1
+65 764 1
+65 766 1
+65 768 1
+65 770 1
+65 771 1
+65 776 1
+65 779 1
+65 781 1
+65 783 1
+65 785 1
+65 786 1
+65 788 1
+65 790 1
+65 791 1
+65 792 1
+66 36 1
+66 64 1
+66 85 1
+66 100 1
+66 110 1
+66 116 1
+66 119 1
+66 120 1
+66 148 1
+66 169 1
+66 184 1
+66 194 1
+66 200 1
+66 203 1
+66 204 1
+66 225 1
+66 240 1
+66 250 1
+66 256 1
+66 259 1
+66 260 1
+66 275 1
+66 285 1
+66 291 1
+66 294 1
+66 295 1
+66 305 1
+66 311 1
+66 314 1
+66 315 1
+66 321 1
+66 324 1
+66 325 1
+66 328 1
+66 329 1
+66 330 1
+66 358 1
+66 379 1
+66 394 1
+66 404 1
+66 410 1
+66 413 1
+66 414 1
+66 435 1
+66 450 1
+66 460 1
+66 466 1
+66 469 1
+66 470 1
+66 485 1
+66 495 1
+66 501 1
+66 504 1
+66 505 1
+66 515 1
+66 521 1
+66 524 1
+66 525 1
+66 531 1
+66 534 1
+66 535 1
+66 538 1
+66 539 1
+66 540 1
+66 561 1
+66 576 1
+66 586 1
+66 592 1
+66 595 1
+66 596 1
+66 611 1
+66 621 1
+66 627 1
+66 630 1
+66 631 1
+66 641 1
+66 647 1
+66 650 1
+66 651 1
+66 657 1
+66 660 1
+66 661 1
+66 664 1
+66 665 1
+66 666 1
+66 681 1
+66 691 1
+66 697 1
+66 700 1
+66 701 1
+66 711 1
+66 717 1
+66 720 1
+66 721 1
+66 727 1
+66 730 1
+66 731 1
+66 734 1
+66 735 1
+66 736 1
+66 746 1
+66 752 1
+66 755 1
+66 756 1
+66 762 1
+66 765 1
+66 766 1
+66 769 1
+66 770 1
+66 771 1
+66 777 1
+66 780 1
+66 781 1
+66 784 1
+66 785 1
+66 786 1
+66 789 1
+66 790 1
+66 791 1
+66 792 1
+0 0 0
diff --git a/benchmarks/matrix/bibd_12_5_66x792.sms.gz b/benchmarks/matrix/bibd_12_5_66x792.sms.gz
new file mode 100644
index 0000000..7069158
Binary files /dev/null and b/benchmarks/matrix/bibd_12_5_66x792.sms.gz differ
diff --git a/benchmarks/matrix/bibd_13_6_78x1716.sms b/benchmarks/matrix/bibd_13_6_78x1716.sms
new file mode 100644
index 0000000..e94826d
--- /dev/null
+++ b/benchmarks/matrix/bibd_13_6_78x1716.sms
@@ -0,0 +1,25742 @@
+78 1716 M
+1 1 1
+1 2 1
+1 3 1
+1 4 1
+1 5 1
+1 6 1
+1 7 1
+1 8 1
+1 9 1
+1 10 1
+1 11 1
+1 12 1
+1 13 1
+1 14 1
+1 15 1
+1 16 1
+1 17 1
+1 18 1
+1 19 1
+1 20 1
+1 21 1
+1 22 1
+1 23 1
+1 24 1
+1 25 1
+1 26 1
+1 27 1
+1 28 1
+1 29 1
+1 30 1
+1 31 1
+1 32 1
+1 33 1
+1 34 1
+1 35 1
+1 36 1
+1 37 1
+1 38 1
+1 39 1
+1 40 1
+1 41 1
+1 42 1
+1 43 1
+1 44 1
+1 45 1
+1 46 1
+1 47 1
+1 48 1
+1 49 1
+1 50 1
+1 51 1
+1 52 1
+1 53 1
+1 54 1
+1 55 1
+1 56 1
+1 57 1
+1 58 1
+1 59 1
+1 60 1
+1 61 1
+1 62 1
+1 63 1
+1 64 1
+1 65 1
+1 66 1
+1 67 1
+1 68 1
+1 69 1
+1 70 1
+1 71 1
+1 72 1
+1 73 1
+1 74 1
+1 75 1
+1 76 1
+1 77 1
+1 78 1
+1 79 1
+1 80 1
+1 81 1
+1 82 1
+1 83 1
+1 84 1
+1 85 1
+1 86 1
+1 87 1
+1 88 1
+1 89 1
+1 90 1
+1 91 1
+1 92 1
+1 93 1
+1 94 1
+1 95 1
+1 96 1
+1 97 1
+1 98 1
+1 99 1
+1 100 1
+1 101 1
+1 102 1
+1 103 1
+1 104 1
+1 105 1
+1 106 1
+1 107 1
+1 108 1
+1 109 1
+1 110 1
+1 111 1
+1 112 1
+1 113 1
+1 114 1
+1 115 1
+1 116 1
+1 117 1
+1 118 1
+1 119 1
+1 120 1
+1 121 1
+1 122 1
+1 123 1
+1 124 1
+1 125 1
+1 126 1
+1 127 1
+1 128 1
+1 129 1
+1 130 1
+1 131 1
+1 132 1
+1 133 1
+1 134 1
+1 135 1
+1 136 1
+1 137 1
+1 138 1
+1 139 1
+1 140 1
+1 141 1
+1 142 1
+1 143 1
+1 144 1
+1 145 1
+1 146 1
+1 147 1
+1 148 1
+1 149 1
+1 150 1
+1 151 1
+1 152 1
+1 153 1
+1 154 1
+1 155 1
+1 156 1
+1 157 1
+1 158 1
+1 159 1
+1 160 1
+1 161 1
+1 162 1
+1 163 1
+1 164 1
+1 165 1
+1 166 1
+1 167 1
+1 168 1
+1 169 1
+1 170 1
+1 171 1
+1 172 1
+1 173 1
+1 174 1
+1 175 1
+1 176 1
+1 177 1
+1 178 1
+1 179 1
+1 180 1
+1 181 1
+1 182 1
+1 183 1
+1 184 1
+1 185 1
+1 186 1
+1 187 1
+1 188 1
+1 189 1
+1 190 1
+1 191 1
+1 192 1
+1 193 1
+1 194 1
+1 195 1
+1 196 1
+1 197 1
+1 198 1
+1 199 1
+1 200 1
+1 201 1
+1 202 1
+1 203 1
+1 204 1
+1 205 1
+1 206 1
+1 207 1
+1 208 1
+1 209 1
+1 210 1
+1 211 1
+1 212 1
+1 213 1
+1 214 1
+1 215 1
+1 216 1
+1 217 1
+1 218 1
+1 219 1
+1 220 1
+1 221 1
+1 222 1
+1 223 1
+1 224 1
+1 225 1
+1 226 1
+1 227 1
+1 228 1
+1 229 1
+1 230 1
+1 231 1
+1 232 1
+1 233 1
+1 234 1
+1 235 1
+1 236 1
+1 237 1
+1 238 1
+1 239 1
+1 240 1
+1 241 1
+1 242 1
+1 243 1
+1 244 1
+1 245 1
+1 246 1
+1 247 1
+1 248 1
+1 249 1
+1 250 1
+1 251 1
+1 252 1
+1 253 1
+1 254 1
+1 255 1
+1 256 1
+1 257 1
+1 258 1
+1 259 1
+1 260 1
+1 261 1
+1 262 1
+1 263 1
+1 264 1
+1 265 1
+1 266 1
+1 267 1
+1 268 1
+1 269 1
+1 270 1
+1 271 1
+1 272 1
+1 273 1
+1 274 1
+1 275 1
+1 276 1
+1 277 1
+1 278 1
+1 279 1
+1 280 1
+1 281 1
+1 282 1
+1 283 1
+1 284 1
+1 285 1
+1 286 1
+1 287 1
+1 288 1
+1 289 1
+1 290 1
+1 291 1
+1 292 1
+1 293 1
+1 294 1
+1 295 1
+1 296 1
+1 297 1
+1 298 1
+1 299 1
+1 300 1
+1 301 1
+1 302 1
+1 303 1
+1 304 1
+1 305 1
+1 306 1
+1 307 1
+1 308 1
+1 309 1
+1 310 1
+1 311 1
+1 312 1
+1 313 1
+1 314 1
+1 315 1
+1 316 1
+1 317 1
+1 318 1
+1 319 1
+1 320 1
+1 321 1
+1 322 1
+1 323 1
+1 324 1
+1 325 1
+1 326 1
+1 327 1
+1 328 1
+1 329 1
+1 330 1
+2 1 1
+2 2 1
+2 3 1
+2 4 1
+2 5 1
+2 6 1
+2 7 1
+2 8 1
+2 9 1
+2 10 1
+2 11 1
+2 12 1
+2 13 1
+2 14 1
+2 15 1
+2 16 1
+2 17 1
+2 18 1
+2 19 1
+2 20 1
+2 21 1
+2 22 1
+2 23 1
+2 24 1
+2 25 1
+2 26 1
+2 27 1
+2 28 1
+2 29 1
+2 30 1
+2 31 1
+2 32 1
+2 33 1
+2 34 1
+2 35 1
+2 36 1
+2 37 1
+2 38 1
+2 39 1
+2 40 1
+2 41 1
+2 42 1
+2 43 1
+2 44 1
+2 45 1
+2 46 1
+2 47 1
+2 48 1
+2 49 1
+2 50 1
+2 51 1
+2 52 1
+2 53 1
+2 54 1
+2 55 1
+2 56 1
+2 57 1
+2 58 1
+2 59 1
+2 60 1
+2 61 1
+2 62 1
+2 63 1
+2 64 1
+2 65 1
+2 66 1
+2 67 1
+2 68 1
+2 69 1
+2 70 1
+2 71 1
+2 72 1
+2 73 1
+2 74 1
+2 75 1
+2 76 1
+2 77 1
+2 78 1
+2 79 1
+2 80 1
+2 81 1
+2 82 1
+2 83 1
+2 84 1
+2 85 1
+2 86 1
+2 87 1
+2 88 1
+2 89 1
+2 90 1
+2 91 1
+2 92 1
+2 93 1
+2 94 1
+2 95 1
+2 96 1
+2 97 1
+2 98 1
+2 99 1
+2 100 1
+2 101 1
+2 102 1
+2 103 1
+2 104 1
+2 105 1
+2 106 1
+2 107 1
+2 108 1
+2 109 1
+2 110 1
+2 111 1
+2 112 1
+2 113 1
+2 114 1
+2 115 1
+2 116 1
+2 117 1
+2 118 1
+2 119 1
+2 120 1
+2 331 1
+2 332 1
+2 333 1
+2 334 1
+2 335 1
+2 336 1
+2 337 1
+2 338 1
+2 339 1
+2 340 1
+2 341 1
+2 342 1
+2 343 1
+2 344 1
+2 345 1
+2 346 1
+2 347 1
+2 348 1
+2 349 1
+2 350 1
+2 351 1
+2 352 1
+2 353 1
+2 354 1
+2 355 1
+2 356 1
+2 357 1
+2 358 1
+2 359 1
+2 360 1
+2 361 1
+2 362 1
+2 363 1
+2 364 1
+2 365 1
+2 366 1
+2 367 1
+2 368 1
+2 369 1
+2 370 1
+2 371 1
+2 372 1
+2 373 1
+2 374 1
+2 375 1
+2 376 1
+2 377 1
+2 378 1
+2 379 1
+2 380 1
+2 381 1
+2 382 1
+2 383 1
+2 384 1
+2 385 1
+2 386 1
+2 387 1
+2 388 1
+2 389 1
+2 390 1
+2 391 1
+2 392 1
+2 393 1
+2 394 1
+2 395 1
+2 396 1
+2 397 1
+2 398 1
+2 399 1
+2 400 1
+2 401 1
+2 402 1
+2 403 1
+2 404 1
+2 405 1
+2 406 1
+2 407 1
+2 408 1
+2 409 1
+2 410 1
+2 411 1
+2 412 1
+2 413 1
+2 414 1
+2 415 1
+2 416 1
+2 417 1
+2 418 1
+2 419 1
+2 420 1
+2 421 1
+2 422 1
+2 423 1
+2 424 1
+2 425 1
+2 426 1
+2 427 1
+2 428 1
+2 429 1
+2 430 1
+2 431 1
+2 432 1
+2 433 1
+2 434 1
+2 435 1
+2 436 1
+2 437 1
+2 438 1
+2 439 1
+2 440 1
+2 441 1
+2 442 1
+2 443 1
+2 444 1
+2 445 1
+2 446 1
+2 447 1
+2 448 1
+2 449 1
+2 450 1
+2 451 1
+2 452 1
+2 453 1
+2 454 1
+2 455 1
+2 456 1
+2 457 1
+2 458 1
+2 459 1
+2 460 1
+2 461 1
+2 462 1
+2 463 1
+2 464 1
+2 465 1
+2 466 1
+2 467 1
+2 468 1
+2 469 1
+2 470 1
+2 471 1
+2 472 1
+2 473 1
+2 474 1
+2 475 1
+2 476 1
+2 477 1
+2 478 1
+2 479 1
+2 480 1
+2 481 1
+2 482 1
+2 483 1
+2 484 1
+2 485 1
+2 486 1
+2 487 1
+2 488 1
+2 489 1
+2 490 1
+2 491 1
+2 492 1
+2 493 1
+2 494 1
+2 495 1
+2 496 1
+2 497 1
+2 498 1
+2 499 1
+2 500 1
+2 501 1
+2 502 1
+2 503 1
+2 504 1
+2 505 1
+2 506 1
+2 507 1
+2 508 1
+2 509 1
+2 510 1
+2 511 1
+2 512 1
+2 513 1
+2 514 1
+2 515 1
+2 516 1
+2 517 1
+2 518 1
+2 519 1
+2 520 1
+2 521 1
+2 522 1
+2 523 1
+2 524 1
+2 525 1
+2 526 1
+2 527 1
+2 528 1
+2 529 1
+2 530 1
+2 531 1
+2 532 1
+2 533 1
+2 534 1
+2 535 1
+2 536 1
+2 537 1
+2 538 1
+2 539 1
+2 540 1
+3 1 1
+3 2 1
+3 3 1
+3 4 1
+3 5 1
+3 6 1
+3 7 1
+3 8 1
+3 9 1
+3 10 1
+3 11 1
+3 12 1
+3 13 1
+3 14 1
+3 15 1
+3 16 1
+3 17 1
+3 18 1
+3 19 1
+3 20 1
+3 21 1
+3 22 1
+3 23 1
+3 24 1
+3 25 1
+3 26 1
+3 27 1
+3 28 1
+3 29 1
+3 30 1
+3 31 1
+3 32 1
+3 33 1
+3 34 1
+3 35 1
+3 36 1
+3 121 1
+3 122 1
+3 123 1
+3 124 1
+3 125 1
+3 126 1
+3 127 1
+3 128 1
+3 129 1
+3 130 1
+3 131 1
+3 132 1
+3 133 1
+3 134 1
+3 135 1
+3 136 1
+3 137 1
+3 138 1
+3 139 1
+3 140 1
+3 141 1
+3 142 1
+3 143 1
+3 144 1
+3 145 1
+3 146 1
+3 147 1
+3 148 1
+3 149 1
+3 150 1
+3 151 1
+3 152 1
+3 153 1
+3 154 1
+3 155 1
+3 156 1
+3 157 1
+3 158 1
+3 159 1
+3 160 1
+3 161 1
+3 162 1
+3 163 1
+3 164 1
+3 165 1
+3 166 1
+3 167 1
+3 168 1
+3 169 1
+3 170 1
+3 171 1
+3 172 1
+3 173 1
+3 174 1
+3 175 1
+3 176 1
+3 177 1
+3 178 1
+3 179 1
+3 180 1
+3 181 1
+3 182 1
+3 183 1
+3 184 1
+3 185 1
+3 186 1
+3 187 1
+3 188 1
+3 189 1
+3 190 1
+3 191 1
+3 192 1
+3 193 1
+3 194 1
+3 195 1
+3 196 1
+3 197 1
+3 198 1
+3 199 1
+3 200 1
+3 201 1
+3 202 1
+3 203 1
+3 204 1
+3 331 1
+3 332 1
+3 333 1
+3 334 1
+3 335 1
+3 336 1
+3 337 1
+3 338 1
+3 339 1
+3 340 1
+3 341 1
+3 342 1
+3 343 1
+3 344 1
+3 345 1
+3 346 1
+3 347 1
+3 348 1
+3 349 1
+3 350 1
+3 351 1
+3 352 1
+3 353 1
+3 354 1
+3 355 1
+3 356 1
+3 357 1
+3 358 1
+3 359 1
+3 360 1
+3 361 1
+3 362 1
+3 363 1
+3 364 1
+3 365 1
+3 366 1
+3 367 1
+3 368 1
+3 369 1
+3 370 1
+3 371 1
+3 372 1
+3 373 1
+3 374 1
+3 375 1
+3 376 1
+3 377 1
+3 378 1
+3 379 1
+3 380 1
+3 381 1
+3 382 1
+3 383 1
+3 384 1
+3 385 1
+3 386 1
+3 387 1
+3 388 1
+3 389 1
+3 390 1
+3 391 1
+3 392 1
+3 393 1
+3 394 1
+3 395 1
+3 396 1
+3 397 1
+3 398 1
+3 399 1
+3 400 1
+3 401 1
+3 402 1
+3 403 1
+3 404 1
+3 405 1
+3 406 1
+3 407 1
+3 408 1
+3 409 1
+3 410 1
+3 411 1
+3 412 1
+3 413 1
+3 414 1
+3 541 1
+3 542 1
+3 543 1
+3 544 1
+3 545 1
+3 546 1
+3 547 1
+3 548 1
+3 549 1
+3 550 1
+3 551 1
+3 552 1
+3 553 1
+3 554 1
+3 555 1
+3 556 1
+3 557 1
+3 558 1
+3 559 1
+3 560 1
+3 561 1
+3 562 1
+3 563 1
+3 564 1
+3 565 1
+3 566 1
+3 567 1
+3 568 1
+3 569 1
+3 570 1
+3 571 1
+3 572 1
+3 573 1
+3 574 1
+3 575 1
+3 576 1
+3 577 1
+3 578 1
+3 579 1
+3 580 1
+3 581 1
+3 582 1
+3 583 1
+3 584 1
+3 585 1
+3 586 1
+3 587 1
+3 588 1
+3 589 1
+3 590 1
+3 591 1
+3 592 1
+3 593 1
+3 594 1
+3 595 1
+3 596 1
+3 597 1
+3 598 1
+3 599 1
+3 600 1
+3 601 1
+3 602 1
+3 603 1
+3 604 1
+3 605 1
+3 606 1
+3 607 1
+3 608 1
+3 609 1
+3 610 1
+3 611 1
+3 612 1
+3 613 1
+3 614 1
+3 615 1
+3 616 1
+3 617 1
+3 618 1
+3 619 1
+3 620 1
+3 621 1
+3 622 1
+3 623 1
+3 624 1
+3 625 1
+3 626 1
+3 627 1
+3 628 1
+3 629 1
+3 630 1
+3 631 1
+3 632 1
+3 633 1
+3 634 1
+3 635 1
+3 636 1
+3 637 1
+3 638 1
+3 639 1
+3 640 1
+3 641 1
+3 642 1
+3 643 1
+3 644 1
+3 645 1
+3 646 1
+3 647 1
+3 648 1
+3 649 1
+3 650 1
+3 651 1
+3 652 1
+3 653 1
+3 654 1
+3 655 1
+3 656 1
+3 657 1
+3 658 1
+3 659 1
+3 660 1
+3 661 1
+3 662 1
+3 663 1
+3 664 1
+3 665 1
+3 666 1
+4 1 1
+4 2 1
+4 3 1
+4 4 1
+4 5 1
+4 6 1
+4 7 1
+4 8 1
+4 37 1
+4 38 1
+4 39 1
+4 40 1
+4 41 1
+4 42 1
+4 43 1
+4 44 1
+4 45 1
+4 46 1
+4 47 1
+4 48 1
+4 49 1
+4 50 1
+4 51 1
+4 52 1
+4 53 1
+4 54 1
+4 55 1
+4 56 1
+4 57 1
+4 58 1
+4 59 1
+4 60 1
+4 61 1
+4 62 1
+4 63 1
+4 64 1
+4 121 1
+4 122 1
+4 123 1
+4 124 1
+4 125 1
+4 126 1
+4 127 1
+4 128 1
+4 129 1
+4 130 1
+4 131 1
+4 132 1
+4 133 1
+4 134 1
+4 135 1
+4 136 1
+4 137 1
+4 138 1
+4 139 1
+4 140 1
+4 141 1
+4 142 1
+4 143 1
+4 144 1
+4 145 1
+4 146 1
+4 147 1
+4 148 1
+4 205 1
+4 206 1
+4 207 1
+4 208 1
+4 209 1
+4 210 1
+4 211 1
+4 212 1
+4 213 1
+4 214 1
+4 215 1
+4 216 1
+4 217 1
+4 218 1
+4 219 1
+4 220 1
+4 221 1
+4 222 1
+4 223 1
+4 224 1
+4 225 1
+4 226 1
+4 227 1
+4 228 1
+4 229 1
+4 230 1
+4 231 1
+4 232 1
+4 233 1
+4 234 1
+4 235 1
+4 236 1
+4 237 1
+4 238 1
+4 239 1
+4 240 1
+4 241 1
+4 242 1
+4 243 1
+4 244 1
+4 245 1
+4 246 1
+4 247 1
+4 248 1
+4 249 1
+4 250 1
+4 251 1
+4 252 1
+4 253 1
+4 254 1
+4 255 1
+4 256 1
+4 257 1
+4 258 1
+4 259 1
+4 260 1
+4 331 1
+4 332 1
+4 333 1
+4 334 1
+4 335 1
+4 336 1
+4 337 1
+4 338 1
+4 339 1
+4 340 1
+4 341 1
+4 342 1
+4 343 1
+4 344 1
+4 345 1
+4 346 1
+4 347 1
+4 348 1
+4 349 1
+4 350 1
+4 351 1
+4 352 1
+4 353 1
+4 354 1
+4 355 1
+4 356 1
+4 357 1
+4 358 1
+4 415 1
+4 416 1
+4 417 1
+4 418 1
+4 419 1
+4 420 1
+4 421 1
+4 422 1
+4 423 1
+4 424 1
+4 425 1
+4 426 1
+4 427 1
+4 428 1
+4 429 1
+4 430 1
+4 431 1
+4 432 1
+4 433 1
+4 434 1
+4 435 1
+4 436 1
+4 437 1
+4 438 1
+4 439 1
+4 440 1
+4 441 1
+4 442 1
+4 443 1
+4 444 1
+4 445 1
+4 446 1
+4 447 1
+4 448 1
+4 449 1
+4 450 1
+4 451 1
+4 452 1
+4 453 1
+4 454 1
+4 455 1
+4 456 1
+4 457 1
+4 458 1
+4 459 1
+4 460 1
+4 461 1
+4 462 1
+4 463 1
+4 464 1
+4 465 1
+4 466 1
+4 467 1
+4 468 1
+4 469 1
+4 470 1
+4 541 1
+4 542 1
+4 543 1
+4 544 1
+4 545 1
+4 546 1
+4 547 1
+4 548 1
+4 549 1
+4 550 1
+4 551 1
+4 552 1
+4 553 1
+4 554 1
+4 555 1
+4 556 1
+4 557 1
+4 558 1
+4 559 1
+4 560 1
+4 561 1
+4 562 1
+4 563 1
+4 564 1
+4 565 1
+4 566 1
+4 567 1
+4 568 1
+4 569 1
+4 570 1
+4 571 1
+4 572 1
+4 573 1
+4 574 1
+4 575 1
+4 576 1
+4 577 1
+4 578 1
+4 579 1
+4 580 1
+4 581 1
+4 582 1
+4 583 1
+4 584 1
+4 585 1
+4 586 1
+4 587 1
+4 588 1
+4 589 1
+4 590 1
+4 591 1
+4 592 1
+4 593 1
+4 594 1
+4 595 1
+4 596 1
+4 667 1
+4 668 1
+4 669 1
+4 670 1
+4 671 1
+4 672 1
+4 673 1
+4 674 1
+4 675 1
+4 676 1
+4 677 1
+4 678 1
+4 679 1
+4 680 1
+4 681 1
+4 682 1
+4 683 1
+4 684 1
+4 685 1
+4 686 1
+4 687 1
+4 688 1
+4 689 1
+4 690 1
+4 691 1
+4 692 1
+4 693 1
+4 694 1
+4 695 1
+4 696 1
+4 697 1
+4 698 1
+4 699 1
+4 700 1
+4 701 1
+4 702 1
+4 703 1
+4 704 1
+4 705 1
+4 706 1
+4 707 1
+4 708 1
+4 709 1
+4 710 1
+4 711 1
+4 712 1
+4 713 1
+4 714 1
+4 715 1
+4 716 1
+4 717 1
+4 718 1
+4 719 1
+4 720 1
+4 721 1
+4 722 1
+4 723 1
+4 724 1
+4 725 1
+4 726 1
+4 727 1
+4 728 1
+4 729 1
+4 730 1
+4 731 1
+4 732 1
+4 733 1
+4 734 1
+4 735 1
+4 736 1
+5 1 1
+5 9 1
+5 10 1
+5 11 1
+5 12 1
+5 13 1
+5 14 1
+5 15 1
+5 37 1
+5 38 1
+5 39 1
+5 40 1
+5 41 1
+5 42 1
+5 43 1
+5 65 1
+5 66 1
+5 67 1
+5 68 1
+5 69 1
+5 70 1
+5 71 1
+5 72 1
+5 73 1
+5 74 1
+5 75 1
+5 76 1
+5 77 1
+5 78 1
+5 79 1
+5 80 1
+5 81 1
+5 82 1
+5 83 1
+5 84 1
+5 85 1
+5 121 1
+5 122 1
+5 123 1
+5 124 1
+5 125 1
+5 126 1
+5 127 1
+5 149 1
+5 150 1
+5 151 1
+5 152 1
+5 153 1
+5 154 1
+5 155 1
+5 156 1
+5 157 1
+5 158 1
+5 159 1
+5 160 1
+5 161 1
+5 162 1
+5 163 1
+5 164 1
+5 165 1
+5 166 1
+5 167 1
+5 168 1
+5 169 1
+5 205 1
+5 206 1
+5 207 1
+5 208 1
+5 209 1
+5 210 1
+5 211 1
+5 212 1
+5 213 1
+5 214 1
+5 215 1
+5 216 1
+5 217 1
+5 218 1
+5 219 1
+5 220 1
+5 221 1
+5 222 1
+5 223 1
+5 224 1
+5 225 1
+5 261 1
+5 262 1
+5 263 1
+5 264 1
+5 265 1
+5 266 1
+5 267 1
+5 268 1
+5 269 1
+5 270 1
+5 271 1
+5 272 1
+5 273 1
+5 274 1
+5 275 1
+5 276 1
+5 277 1
+5 278 1
+5 279 1
+5 280 1
+5 281 1
+5 282 1
+5 283 1
+5 284 1
+5 285 1
+5 286 1
+5 287 1
+5 288 1
+5 289 1
+5 290 1
+5 291 1
+5 292 1
+5 293 1
+5 294 1
+5 295 1
+5 331 1
+5 332 1
+5 333 1
+5 334 1
+5 335 1
+5 336 1
+5 337 1
+5 359 1
+5 360 1
+5 361 1
+5 362 1
+5 363 1
+5 364 1
+5 365 1
+5 366 1
+5 367 1
+5 368 1
+5 369 1
+5 370 1
+5 371 1
+5 372 1
+5 373 1
+5 374 1
+5 375 1
+5 376 1
+5 377 1
+5 378 1
+5 379 1
+5 415 1
+5 416 1
+5 417 1
+5 418 1
+5 419 1
+5 420 1
+5 421 1
+5 422 1
+5 423 1
+5 424 1
+5 425 1
+5 426 1
+5 427 1
+5 428 1
+5 429 1
+5 430 1
+5 431 1
+5 432 1
+5 433 1
+5 434 1
+5 435 1
+5 471 1
+5 472 1
+5 473 1
+5 474 1
+5 475 1
+5 476 1
+5 477 1
+5 478 1
+5 479 1
+5 480 1
+5 481 1
+5 482 1
+5 483 1
+5 484 1
+5 485 1
+5 486 1
+5 487 1
+5 488 1
+5 489 1
+5 490 1
+5 491 1
+5 492 1
+5 493 1
+5 494 1
+5 495 1
+5 496 1
+5 497 1
+5 498 1
+5 499 1
+5 500 1
+5 501 1
+5 502 1
+5 503 1
+5 504 1
+5 505 1
+5 541 1
+5 542 1
+5 543 1
+5 544 1
+5 545 1
+5 546 1
+5 547 1
+5 548 1
+5 549 1
+5 550 1
+5 551 1
+5 552 1
+5 553 1
+5 554 1
+5 555 1
+5 556 1
+5 557 1
+5 558 1
+5 559 1
+5 560 1
+5 561 1
+5 597 1
+5 598 1
+5 599 1
+5 600 1
+5 601 1
+5 602 1
+5 603 1
+5 604 1
+5 605 1
+5 606 1
+5 607 1
+5 608 1
+5 609 1
+5 610 1
+5 611 1
+5 612 1
+5 613 1
+5 614 1
+5 615 1
+5 616 1
+5 617 1
+5 618 1
+5 619 1
+5 620 1
+5 621 1
+5 622 1
+5 623 1
+5 624 1
+5 625 1
+5 626 1
+5 627 1
+5 628 1
+5 629 1
+5 630 1
+5 631 1
+5 667 1
+5 668 1
+5 669 1
+5 670 1
+5 671 1
+5 672 1
+5 673 1
+5 674 1
+5 675 1
+5 676 1
+5 677 1
+5 678 1
+5 679 1
+5 680 1
+5 681 1
+5 682 1
+5 683 1
+5 684 1
+5 685 1
+5 686 1
+5 687 1
+5 688 1
+5 689 1
+5 690 1
+5 691 1
+5 692 1
+5 693 1
+5 694 1
+5 695 1
+5 696 1
+5 697 1
+5 698 1
+5 699 1
+5 700 1
+5 701 1
+5 737 1
+5 738 1
+5 739 1
+5 740 1
+5 741 1
+5 742 1
+5 743 1
+5 744 1
+5 745 1
+5 746 1
+5 747 1
+5 748 1
+5 749 1
+5 750 1
+5 751 1
+5 752 1
+5 753 1
+5 754 1
+5 755 1
+5 756 1
+5 757 1
+5 758 1
+5 759 1
+5 760 1
+5 761 1
+5 762 1
+5 763 1
+5 764 1
+5 765 1
+5 766 1
+5 767 1
+5 768 1
+5 769 1
+5 770 1
+5 771 1
+6 2 1
+6 9 1
+6 16 1
+6 17 1
+6 18 1
+6 19 1
+6 20 1
+6 21 1
+6 37 1
+6 44 1
+6 45 1
+6 46 1
+6 47 1
+6 48 1
+6 49 1
+6 65 1
+6 66 1
+6 67 1
+6 68 1
+6 69 1
+6 70 1
+6 86 1
+6 87 1
+6 88 1
+6 89 1
+6 90 1
+6 91 1
+6 92 1
+6 93 1
+6 94 1
+6 95 1
+6 96 1
+6 97 1
+6 98 1
+6 99 1
+6 100 1
+6 121 1
+6 128 1
+6 129 1
+6 130 1
+6 131 1
+6 132 1
+6 133 1
+6 149 1
+6 150 1
+6 151 1
+6 152 1
+6 153 1
+6 154 1
+6 170 1
+6 171 1
+6 172 1
+6 173 1
+6 174 1
+6 175 1
+6 176 1
+6 177 1
+6 178 1
+6 179 1
+6 180 1
+6 181 1
+6 182 1
+6 183 1
+6 184 1
+6 205 1
+6 206 1
+6 207 1
+6 208 1
+6 209 1
+6 210 1
+6 226 1
+6 227 1
+6 228 1
+6 229 1
+6 230 1
+6 231 1
+6 232 1
+6 233 1
+6 234 1
+6 235 1
+6 236 1
+6 237 1
+6 238 1
+6 239 1
+6 240 1
+6 261 1
+6 262 1
+6 263 1
+6 264 1
+6 265 1
+6 266 1
+6 267 1
+6 268 1
+6 269 1
+6 270 1
+6 271 1
+6 272 1
+6 273 1
+6 274 1
+6 275 1
+6 296 1
+6 297 1
+6 298 1
+6 299 1
+6 300 1
+6 301 1
+6 302 1
+6 303 1
+6 304 1
+6 305 1
+6 306 1
+6 307 1
+6 308 1
+6 309 1
+6 310 1
+6 311 1
+6 312 1
+6 313 1
+6 314 1
+6 315 1
+6 331 1
+6 338 1
+6 339 1
+6 340 1
+6 341 1
+6 342 1
+6 343 1
+6 359 1
+6 360 1
+6 361 1
+6 362 1
+6 363 1
+6 364 1
+6 380 1
+6 381 1
+6 382 1
+6 383 1
+6 384 1
+6 385 1
+6 386 1
+6 387 1
+6 388 1
+6 389 1
+6 390 1
+6 391 1
+6 392 1
+6 393 1
+6 394 1
+6 415 1
+6 416 1
+6 417 1
+6 418 1
+6 419 1
+6 420 1
+6 436 1
+6 437 1
+6 438 1
+6 439 1
+6 440 1
+6 441 1
+6 442 1
+6 443 1
+6 444 1
+6 445 1
+6 446 1
+6 447 1
+6 448 1
+6 449 1
+6 450 1
+6 471 1
+6 472 1
+6 473 1
+6 474 1
+6 475 1
+6 476 1
+6 477 1
+6 478 1
+6 479 1
+6 480 1
+6 481 1
+6 482 1
+6 483 1
+6 484 1
+6 485 1
+6 506 1
+6 507 1
+6 508 1
+6 509 1
+6 510 1
+6 511 1
+6 512 1
+6 513 1
+6 514 1
+6 515 1
+6 516 1
+6 517 1
+6 518 1
+6 519 1
+6 520 1
+6 521 1
+6 522 1
+6 523 1
+6 524 1
+6 525 1
+6 541 1
+6 542 1
+6 543 1
+6 544 1
+6 545 1
+6 546 1
+6 562 1
+6 563 1
+6 564 1
+6 565 1
+6 566 1
+6 567 1
+6 568 1
+6 569 1
+6 570 1
+6 571 1
+6 572 1
+6 573 1
+6 574 1
+6 575 1
+6 576 1
+6 597 1
+6 598 1
+6 599 1
+6 600 1
+6 601 1
+6 602 1
+6 603 1
+6 604 1
+6 605 1
+6 606 1
+6 607 1
+6 608 1
+6 609 1
+6 610 1
+6 611 1
+6 632 1
+6 633 1
+6 634 1
+6 635 1
+6 636 1
+6 637 1
+6 638 1
+6 639 1
+6 640 1
+6 641 1
+6 642 1
+6 643 1
+6 644 1
+6 645 1
+6 646 1
+6 647 1
+6 648 1
+6 649 1
+6 650 1
+6 651 1
+6 667 1
+6 668 1
+6 669 1
+6 670 1
+6 671 1
+6 672 1
+6 673 1
+6 674 1
+6 675 1
+6 676 1
+6 677 1
+6 678 1
+6 679 1
+6 680 1
+6 681 1
+6 702 1
+6 703 1
+6 704 1
+6 705 1
+6 706 1
+6 707 1
+6 708 1
+6 709 1
+6 710 1
+6 711 1
+6 712 1
+6 713 1
+6 714 1
+6 715 1
+6 716 1
+6 717 1
+6 718 1
+6 719 1
+6 720 1
+6 721 1
+6 737 1
+6 738 1
+6 739 1
+6 740 1
+6 741 1
+6 742 1
+6 743 1
+6 744 1
+6 745 1
+6 746 1
+6 747 1
+6 748 1
+6 749 1
+6 750 1
+6 751 1
+6 752 1
+6 753 1
+6 754 1
+6 755 1
+6 756 1
+6 772 1
+6 773 1
+6 774 1
+6 775 1
+6 776 1
+6 777 1
+6 778 1
+6 779 1
+6 780 1
+6 781 1
+6 782 1
+6 783 1
+6 784 1
+6 785 1
+6 786 1
+7 3 1
+7 10 1
+7 16 1
+7 22 1
+7 23 1
+7 24 1
+7 25 1
+7 26 1
+7 38 1
+7 44 1
+7 50 1
+7 51 1
+7 52 1
+7 53 1
+7 54 1
+7 65 1
+7 71 1
+7 72 1
+7 73 1
+7 74 1
+7 75 1
+7 86 1
+7 87 1
+7 88 1
+7 89 1
+7 90 1
+7 101 1
+7 102 1
+7 103 1
+7 104 1
+7 105 1
+7 106 1
+7 107 1
+7 108 1
+7 109 1
+7 110 1
+7 122 1
+7 128 1
+7 134 1
+7 135 1
+7 136 1
+7 137 1
+7 138 1
+7 149 1
+7 155 1
+7 156 1
+7 157 1
+7 158 1
+7 159 1
+7 170 1
+7 171 1
+7 172 1
+7 173 1
+7 174 1
+7 185 1
+7 186 1
+7 187 1
+7 188 1
+7 189 1
+7 190 1
+7 191 1
+7 192 1
+7 193 1
+7 194 1
+7 205 1
+7 211 1
+7 212 1
+7 213 1
+7 214 1
+7 215 1
+7 226 1
+7 227 1
+7 228 1
+7 229 1
+7 230 1
+7 241 1
+7 242 1
+7 243 1
+7 244 1
+7 245 1
+7 246 1
+7 247 1
+7 248 1
+7 249 1
+7 250 1
+7 261 1
+7 262 1
+7 263 1
+7 264 1
+7 265 1
+7 276 1
+7 277 1
+7 278 1
+7 279 1
+7 280 1
+7 281 1
+7 282 1
+7 283 1
+7 284 1
+7 285 1
+7 296 1
+7 297 1
+7 298 1
+7 299 1
+7 300 1
+7 301 1
+7 302 1
+7 303 1
+7 304 1
+7 305 1
+7 316 1
+7 317 1
+7 318 1
+7 319 1
+7 320 1
+7 321 1
+7 322 1
+7 323 1
+7 324 1
+7 325 1
+7 332 1
+7 338 1
+7 344 1
+7 345 1
+7 346 1
+7 347 1
+7 348 1
+7 359 1
+7 365 1
+7 366 1
+7 367 1
+7 368 1
+7 369 1
+7 380 1
+7 381 1
+7 382 1
+7 383 1
+7 384 1
+7 395 1
+7 396 1
+7 397 1
+7 398 1
+7 399 1
+7 400 1
+7 401 1
+7 402 1
+7 403 1
+7 404 1
+7 415 1
+7 421 1
+7 422 1
+7 423 1
+7 424 1
+7 425 1
+7 436 1
+7 437 1
+7 438 1
+7 439 1
+7 440 1
+7 451 1
+7 452 1
+7 453 1
+7 454 1
+7 455 1
+7 456 1
+7 457 1
+7 458 1
+7 459 1
+7 460 1
+7 471 1
+7 472 1
+7 473 1
+7 474 1
+7 475 1
+7 486 1
+7 487 1
+7 488 1
+7 489 1
+7 490 1
+7 491 1
+7 492 1
+7 493 1
+7 494 1
+7 495 1
+7 506 1
+7 507 1
+7 508 1
+7 509 1
+7 510 1
+7 511 1
+7 512 1
+7 513 1
+7 514 1
+7 515 1
+7 526 1
+7 527 1
+7 528 1
+7 529 1
+7 530 1
+7 531 1
+7 532 1
+7 533 1
+7 534 1
+7 535 1
+7 541 1
+7 547 1
+7 548 1
+7 549 1
+7 550 1
+7 551 1
+7 562 1
+7 563 1
+7 564 1
+7 565 1
+7 566 1
+7 577 1
+7 578 1
+7 579 1
+7 580 1
+7 581 1
+7 582 1
+7 583 1
+7 584 1
+7 585 1
+7 586 1
+7 597 1
+7 598 1
+7 599 1
+7 600 1
+7 601 1
+7 612 1
+7 613 1
+7 614 1
+7 615 1
+7 616 1
+7 617 1
+7 618 1
+7 619 1
+7 620 1
+7 621 1
+7 632 1
+7 633 1
+7 634 1
+7 635 1
+7 636 1
+7 637 1
+7 638 1
+7 639 1
+7 640 1
+7 641 1
+7 652 1
+7 653 1
+7 654 1
+7 655 1
+7 656 1
+7 657 1
+7 658 1
+7 659 1
+7 660 1
+7 661 1
+7 667 1
+7 668 1
+7 669 1
+7 670 1
+7 671 1
+7 682 1
+7 683 1
+7 684 1
+7 685 1
+7 686 1
+7 687 1
+7 688 1
+7 689 1
+7 690 1
+7 691 1
+7 702 1
+7 703 1
+7 704 1
+7 705 1
+7 706 1
+7 707 1
+7 708 1
+7 709 1
+7 710 1
+7 711 1
+7 722 1
+7 723 1
+7 724 1
+7 725 1
+7 726 1
+7 727 1
+7 728 1
+7 729 1
+7 730 1
+7 731 1
+7 737 1
+7 738 1
+7 739 1
+7 740 1
+7 741 1
+7 742 1
+7 743 1
+7 744 1
+7 745 1
+7 746 1
+7 757 1
+7 758 1
+7 759 1
+7 760 1
+7 761 1
+7 762 1
+7 763 1
+7 764 1
+7 765 1
+7 766 1
+7 772 1
+7 773 1
+7 774 1
+7 775 1
+7 776 1
+7 777 1
+7 778 1
+7 779 1
+7 780 1
+7 781 1
+7 787 1
+7 788 1
+7 789 1
+7 790 1
+7 791 1
+8 4 1
+8 11 1
+8 17 1
+8 22 1
+8 27 1
+8 28 1
+8 29 1
+8 30 1
+8 39 1
+8 45 1
+8 50 1
+8 55 1
+8 56 1
+8 57 1
+8 58 1
+8 66 1
+8 71 1
+8 76 1
+8 77 1
+8 78 1
+8 79 1
+8 86 1
+8 91 1
+8 92 1
+8 93 1
+8 94 1
+8 101 1
+8 102 1
+8 103 1
+8 104 1
+8 111 1
+8 112 1
+8 113 1
+8 114 1
+8 115 1
+8 116 1
+8 123 1
+8 129 1
+8 134 1
+8 139 1
+8 140 1
+8 141 1
+8 142 1
+8 150 1
+8 155 1
+8 160 1
+8 161 1
+8 162 1
+8 163 1
+8 170 1
+8 175 1
+8 176 1
+8 177 1
+8 178 1
+8 185 1
+8 186 1
+8 187 1
+8 188 1
+8 195 1
+8 196 1
+8 197 1
+8 198 1
+8 199 1
+8 200 1
+8 206 1
+8 211 1
+8 216 1
+8 217 1
+8 218 1
+8 219 1
+8 226 1
+8 231 1
+8 232 1
+8 233 1
+8 234 1
+8 241 1
+8 242 1
+8 243 1
+8 244 1
+8 251 1
+8 252 1
+8 253 1
+8 254 1
+8 255 1
+8 256 1
+8 261 1
+8 266 1
+8 267 1
+8 268 1
+8 269 1
+8 276 1
+8 277 1
+8 278 1
+8 279 1
+8 286 1
+8 287 1
+8 288 1
+8 289 1
+8 290 1
+8 291 1
+8 296 1
+8 297 1
+8 298 1
+8 299 1
+8 306 1
+8 307 1
+8 308 1
+8 309 1
+8 310 1
+8 311 1
+8 316 1
+8 317 1
+8 318 1
+8 319 1
+8 320 1
+8 321 1
+8 326 1
+8 327 1
+8 328 1
+8 329 1
+8 333 1
+8 339 1
+8 344 1
+8 349 1
+8 350 1
+8 351 1
+8 352 1
+8 360 1
+8 365 1
+8 370 1
+8 371 1
+8 372 1
+8 373 1
+8 380 1
+8 385 1
+8 386 1
+8 387 1
+8 388 1
+8 395 1
+8 396 1
+8 397 1
+8 398 1
+8 405 1
+8 406 1
+8 407 1
+8 408 1
+8 409 1
+8 410 1
+8 416 1
+8 421 1
+8 426 1
+8 427 1
+8 428 1
+8 429 1
+8 436 1
+8 441 1
+8 442 1
+8 443 1
+8 444 1
+8 451 1
+8 452 1
+8 453 1
+8 454 1
+8 461 1
+8 462 1
+8 463 1
+8 464 1
+8 465 1
+8 466 1
+8 471 1
+8 476 1
+8 477 1
+8 478 1
+8 479 1
+8 486 1
+8 487 1
+8 488 1
+8 489 1
+8 496 1
+8 497 1
+8 498 1
+8 499 1
+8 500 1
+8 501 1
+8 506 1
+8 507 1
+8 508 1
+8 509 1
+8 516 1
+8 517 1
+8 518 1
+8 519 1
+8 520 1
+8 521 1
+8 526 1
+8 527 1
+8 528 1
+8 529 1
+8 530 1
+8 531 1
+8 536 1
+8 537 1
+8 538 1
+8 539 1
+8 542 1
+8 547 1
+8 552 1
+8 553 1
+8 554 1
+8 555 1
+8 562 1
+8 567 1
+8 568 1
+8 569 1
+8 570 1
+8 577 1
+8 578 1
+8 579 1
+8 580 1
+8 587 1
+8 588 1
+8 589 1
+8 590 1
+8 591 1
+8 592 1
+8 597 1
+8 602 1
+8 603 1
+8 604 1
+8 605 1
+8 612 1
+8 613 1
+8 614 1
+8 615 1
+8 622 1
+8 623 1
+8 624 1
+8 625 1
+8 626 1
+8 627 1
+8 632 1
+8 633 1
+8 634 1
+8 635 1
+8 642 1
+8 643 1
+8 644 1
+8 645 1
+8 646 1
+8 647 1
+8 652 1
+8 653 1
+8 654 1
+8 655 1
+8 656 1
+8 657 1
+8 662 1
+8 663 1
+8 664 1
+8 665 1
+8 667 1
+8 672 1
+8 673 1
+8 674 1
+8 675 1
+8 682 1
+8 683 1
+8 684 1
+8 685 1
+8 692 1
+8 693 1
+8 694 1
+8 695 1
+8 696 1
+8 697 1
+8 702 1
+8 703 1
+8 704 1
+8 705 1
+8 712 1
+8 713 1
+8 714 1
+8 715 1
+8 716 1
+8 717 1
+8 722 1
+8 723 1
+8 724 1
+8 725 1
+8 726 1
+8 727 1
+8 732 1
+8 733 1
+8 734 1
+8 735 1
+8 737 1
+8 738 1
+8 739 1
+8 740 1
+8 747 1
+8 748 1
+8 749 1
+8 750 1
+8 751 1
+8 752 1
+8 757 1
+8 758 1
+8 759 1
+8 760 1
+8 761 1
+8 762 1
+8 767 1
+8 768 1
+8 769 1
+8 770 1
+8 772 1
+8 773 1
+8 774 1
+8 775 1
+8 776 1
+8 777 1
+8 782 1
+8 783 1
+8 784 1
+8 785 1
+8 787 1
+8 788 1
+8 789 1
+8 790 1
+8 792 1
+9 5 1
+9 12 1
+9 18 1
+9 23 1
+9 27 1
+9 31 1
+9 32 1
+9 33 1
+9 40 1
+9 46 1
+9 51 1
+9 55 1
+9 59 1
+9 60 1
+9 61 1
+9 67 1
+9 72 1
+9 76 1
+9 80 1
+9 81 1
+9 82 1
+9 87 1
+9 91 1
+9 95 1
+9 96 1
+9 97 1
+9 101 1
+9 105 1
+9 106 1
+9 107 1
+9 111 1
+9 112 1
+9 113 1
+9 117 1
+9 118 1
+9 119 1
+9 124 1
+9 130 1
+9 135 1
+9 139 1
+9 143 1
+9 144 1
+9 145 1
+9 151 1
+9 156 1
+9 160 1
+9 164 1
+9 165 1
+9 166 1
+9 171 1
+9 175 1
+9 179 1
+9 180 1
+9 181 1
+9 185 1
+9 189 1
+9 190 1
+9 191 1
+9 195 1
+9 196 1
+9 197 1
+9 201 1
+9 202 1
+9 203 1
+9 207 1
+9 212 1
+9 216 1
+9 220 1
+9 221 1
+9 222 1
+9 227 1
+9 231 1
+9 235 1
+9 236 1
+9 237 1
+9 241 1
+9 245 1
+9 246 1
+9 247 1
+9 251 1
+9 252 1
+9 253 1
+9 257 1
+9 258 1
+9 259 1
+9 262 1
+9 266 1
+9 270 1
+9 271 1
+9 272 1
+9 276 1
+9 280 1
+9 281 1
+9 282 1
+9 286 1
+9 287 1
+9 288 1
+9 292 1
+9 293 1
+9 294 1
+9 296 1
+9 300 1
+9 301 1
+9 302 1
+9 306 1
+9 307 1
+9 308 1
+9 312 1
+9 313 1
+9 314 1
+9 316 1
+9 317 1
+9 318 1
+9 322 1
+9 323 1
+9 324 1
+9 326 1
+9 327 1
+9 328 1
+9 330 1
+9 334 1
+9 340 1
+9 345 1
+9 349 1
+9 353 1
+9 354 1
+9 355 1
+9 361 1
+9 366 1
+9 370 1
+9 374 1
+9 375 1
+9 376 1
+9 381 1
+9 385 1
+9 389 1
+9 390 1
+9 391 1
+9 395 1
+9 399 1
+9 400 1
+9 401 1
+9 405 1
+9 406 1
+9 407 1
+9 411 1
+9 412 1
+9 413 1
+9 417 1
+9 422 1
+9 426 1
+9 430 1
+9 431 1
+9 432 1
+9 437 1
+9 441 1
+9 445 1
+9 446 1
+9 447 1
+9 451 1
+9 455 1
+9 456 1
+9 457 1
+9 461 1
+9 462 1
+9 463 1
+9 467 1
+9 468 1
+9 469 1
+9 472 1
+9 476 1
+9 480 1
+9 481 1
+9 482 1
+9 486 1
+9 490 1
+9 491 1
+9 492 1
+9 496 1
+9 497 1
+9 498 1
+9 502 1
+9 503 1
+9 504 1
+9 506 1
+9 510 1
+9 511 1
+9 512 1
+9 516 1
+9 517 1
+9 518 1
+9 522 1
+9 523 1
+9 524 1
+9 526 1
+9 527 1
+9 528 1
+9 532 1
+9 533 1
+9 534 1
+9 536 1
+9 537 1
+9 538 1
+9 540 1
+9 543 1
+9 548 1
+9 552 1
+9 556 1
+9 557 1
+9 558 1
+9 563 1
+9 567 1
+9 571 1
+9 572 1
+9 573 1
+9 577 1
+9 581 1
+9 582 1
+9 583 1
+9 587 1
+9 588 1
+9 589 1
+9 593 1
+9 594 1
+9 595 1
+9 598 1
+9 602 1
+9 606 1
+9 607 1
+9 608 1
+9 612 1
+9 616 1
+9 617 1
+9 618 1
+9 622 1
+9 623 1
+9 624 1
+9 628 1
+9 629 1
+9 630 1
+9 632 1
+9 636 1
+9 637 1
+9 638 1
+9 642 1
+9 643 1
+9 644 1
+9 648 1
+9 649 1
+9 650 1
+9 652 1
+9 653 1
+9 654 1
+9 658 1
+9 659 1
+9 660 1
+9 662 1
+9 663 1
+9 664 1
+9 666 1
+9 668 1
+9 672 1
+9 676 1
+9 677 1
+9 678 1
+9 682 1
+9 686 1
+9 687 1
+9 688 1
+9 692 1
+9 693 1
+9 694 1
+9 698 1
+9 699 1
+9 700 1
+9 702 1
+9 706 1
+9 707 1
+9 708 1
+9 712 1
+9 713 1
+9 714 1
+9 718 1
+9 719 1
+9 720 1
+9 722 1
+9 723 1
+9 724 1
+9 728 1
+9 729 1
+9 730 1
+9 732 1
+9 733 1
+9 734 1
+9 736 1
+9 737 1
+9 741 1
+9 742 1
+9 743 1
+9 747 1
+9 748 1
+9 749 1
+9 753 1
+9 754 1
+9 755 1
+9 757 1
+9 758 1
+9 759 1
+9 763 1
+9 764 1
+9 765 1
+9 767 1
+9 768 1
+9 769 1
+9 771 1
+9 772 1
+9 773 1
+9 774 1
+9 778 1
+9 779 1
+9 780 1
+9 782 1
+9 783 1
+9 784 1
+9 786 1
+9 787 1
+9 788 1
+9 789 1
+9 791 1
+9 792 1
+10 6 1
+10 13 1
+10 19 1
+10 24 1
+10 28 1
+10 31 1
+10 34 1
+10 35 1
+10 41 1
+10 47 1
+10 52 1
+10 56 1
+10 59 1
+10 62 1
+10 63 1
+10 68 1
+10 73 1
+10 77 1
+10 80 1
+10 83 1
+10 84 1
+10 88 1
+10 92 1
+10 95 1
+10 98 1
+10 99 1
+10 102 1
+10 105 1
+10 108 1
+10 109 1
+10 111 1
+10 114 1
+10 115 1
+10 117 1
+10 118 1
+10 120 1
+10 125 1
+10 131 1
+10 136 1
+10 140 1
+10 143 1
+10 146 1
+10 147 1
+10 152 1
+10 157 1
+10 161 1
+10 164 1
+10 167 1
+10 168 1
+10 172 1
+10 176 1
+10 179 1
+10 182 1
+10 183 1
+10 186 1
+10 189 1
+10 192 1
+10 193 1
+10 195 1
+10 198 1
+10 199 1
+10 201 1
+10 202 1
+10 204 1
+10 208 1
+10 213 1
+10 217 1
+10 220 1
+10 223 1
+10 224 1
+10 228 1
+10 232 1
+10 235 1
+10 238 1
+10 239 1
+10 242 1
+10 245 1
+10 248 1
+10 249 1
+10 251 1
+10 254 1
+10 255 1
+10 257 1
+10 258 1
+10 260 1
+10 263 1
+10 267 1
+10 270 1
+10 273 1
+10 274 1
+10 277 1
+10 280 1
+10 283 1
+10 284 1
+10 286 1
+10 289 1
+10 290 1
+10 292 1
+10 293 1
+10 295 1
+10 297 1
+10 300 1
+10 303 1
+10 304 1
+10 306 1
+10 309 1
+10 310 1
+10 312 1
+10 313 1
+10 315 1
+10 316 1
+10 319 1
+10 320 1
+10 322 1
+10 323 1
+10 325 1
+10 326 1
+10 327 1
+10 329 1
+10 330 1
+10 335 1
+10 341 1
+10 346 1
+10 350 1
+10 353 1
+10 356 1
+10 357 1
+10 362 1
+10 367 1
+10 371 1
+10 374 1
+10 377 1
+10 378 1
+10 382 1
+10 386 1
+10 389 1
+10 392 1
+10 393 1
+10 396 1
+10 399 1
+10 402 1
+10 403 1
+10 405 1
+10 408 1
+10 409 1
+10 411 1
+10 412 1
+10 414 1
+10 418 1
+10 423 1
+10 427 1
+10 430 1
+10 433 1
+10 434 1
+10 438 1
+10 442 1
+10 445 1
+10 448 1
+10 449 1
+10 452 1
+10 455 1
+10 458 1
+10 459 1
+10 461 1
+10 464 1
+10 465 1
+10 467 1
+10 468 1
+10 470 1
+10 473 1
+10 477 1
+10 480 1
+10 483 1
+10 484 1
+10 487 1
+10 490 1
+10 493 1
+10 494 1
+10 496 1
+10 499 1
+10 500 1
+10 502 1
+10 503 1
+10 505 1
+10 507 1
+10 510 1
+10 513 1
+10 514 1
+10 516 1
+10 519 1
+10 520 1
+10 522 1
+10 523 1
+10 525 1
+10 526 1
+10 529 1
+10 530 1
+10 532 1
+10 533 1
+10 535 1
+10 536 1
+10 537 1
+10 539 1
+10 540 1
+10 544 1
+10 549 1
+10 553 1
+10 556 1
+10 559 1
+10 560 1
+10 564 1
+10 568 1
+10 571 1
+10 574 1
+10 575 1
+10 578 1
+10 581 1
+10 584 1
+10 585 1
+10 587 1
+10 590 1
+10 591 1
+10 593 1
+10 594 1
+10 596 1
+10 599 1
+10 603 1
+10 606 1
+10 609 1
+10 610 1
+10 613 1
+10 616 1
+10 619 1
+10 620 1
+10 622 1
+10 625 1
+10 626 1
+10 628 1
+10 629 1
+10 631 1
+10 633 1
+10 636 1
+10 639 1
+10 640 1
+10 642 1
+10 645 1
+10 646 1
+10 648 1
+10 649 1
+10 651 1
+10 652 1
+10 655 1
+10 656 1
+10 658 1
+10 659 1
+10 661 1
+10 662 1
+10 663 1
+10 665 1
+10 666 1
+10 669 1
+10 673 1
+10 676 1
+10 679 1
+10 680 1
+10 683 1
+10 686 1
+10 689 1
+10 690 1
+10 692 1
+10 695 1
+10 696 1
+10 698 1
+10 699 1
+10 701 1
+10 703 1
+10 706 1
+10 709 1
+10 710 1
+10 712 1
+10 715 1
+10 716 1
+10 718 1
+10 719 1
+10 721 1
+10 722 1
+10 725 1
+10 726 1
+10 728 1
+10 729 1
+10 731 1
+10 732 1
+10 733 1
+10 735 1
+10 736 1
+10 738 1
+10 741 1
+10 744 1
+10 745 1
+10 747 1
+10 750 1
+10 751 1
+10 753 1
+10 754 1
+10 756 1
+10 757 1
+10 760 1
+10 761 1
+10 763 1
+10 764 1
+10 766 1
+10 767 1
+10 768 1
+10 770 1
+10 771 1
+10 772 1
+10 775 1
+10 776 1
+10 778 1
+10 779 1
+10 781 1
+10 782 1
+10 783 1
+10 785 1
+10 786 1
+10 787 1
+10 788 1
+10 790 1
+10 791 1
+10 792 1
+11 7 1
+11 14 1
+11 20 1
+11 25 1
+11 29 1
+11 32 1
+11 34 1
+11 36 1
+11 42 1
+11 48 1
+11 53 1
+11 57 1
+11 60 1
+11 62 1
+11 64 1
+11 69 1
+11 74 1
+11 78 1
+11 81 1
+11 83 1
+11 85 1
+11 89 1
+11 93 1
+11 96 1
+11 98 1
+11 100 1
+11 103 1
+11 106 1
+11 108 1
+11 110 1
+11 112 1
+11 114 1
+11 116 1
+11 117 1
+11 119 1
+11 120 1
+11 126 1
+11 132 1
+11 137 1
+11 141 1
+11 144 1
+11 146 1
+11 148 1
+11 153 1
+11 158 1
+11 162 1
+11 165 1
+11 167 1
+11 169 1
+11 173 1
+11 177 1
+11 180 1
+11 182 1
+11 184 1
+11 187 1
+11 190 1
+11 192 1
+11 194 1
+11 196 1
+11 198 1
+11 200 1
+11 201 1
+11 203 1
+11 204 1
+11 209 1
+11 214 1
+11 218 1
+11 221 1
+11 223 1
+11 225 1
+11 229 1
+11 233 1
+11 236 1
+11 238 1
+11 240 1
+11 243 1
+11 246 1
+11 248 1
+11 250 1
+11 252 1
+11 254 1
+11 256 1
+11 257 1
+11 259 1
+11 260 1
+11 264 1
+11 268 1
+11 271 1
+11 273 1
+11 275 1
+11 278 1
+11 281 1
+11 283 1
+11 285 1
+11 287 1
+11 289 1
+11 291 1
+11 292 1
+11 294 1
+11 295 1
+11 298 1
+11 301 1
+11 303 1
+11 305 1
+11 307 1
+11 309 1
+11 311 1
+11 312 1
+11 314 1
+11 315 1
+11 317 1
+11 319 1
+11 321 1
+11 322 1
+11 324 1
+11 325 1
+11 326 1
+11 328 1
+11 329 1
+11 330 1
+11 336 1
+11 342 1
+11 347 1
+11 351 1
+11 354 1
+11 356 1
+11 358 1
+11 363 1
+11 368 1
+11 372 1
+11 375 1
+11 377 1
+11 379 1
+11 383 1
+11 387 1
+11 390 1
+11 392 1
+11 394 1
+11 397 1
+11 400 1
+11 402 1
+11 404 1
+11 406 1
+11 408 1
+11 410 1
+11 411 1
+11 413 1
+11 414 1
+11 419 1
+11 424 1
+11 428 1
+11 431 1
+11 433 1
+11 435 1
+11 439 1
+11 443 1
+11 446 1
+11 448 1
+11 450 1
+11 453 1
+11 456 1
+11 458 1
+11 460 1
+11 462 1
+11 464 1
+11 466 1
+11 467 1
+11 469 1
+11 470 1
+11 474 1
+11 478 1
+11 481 1
+11 483 1
+11 485 1
+11 488 1
+11 491 1
+11 493 1
+11 495 1
+11 497 1
+11 499 1
+11 501 1
+11 502 1
+11 504 1
+11 505 1
+11 508 1
+11 511 1
+11 513 1
+11 515 1
+11 517 1
+11 519 1
+11 521 1
+11 522 1
+11 524 1
+11 525 1
+11 527 1
+11 529 1
+11 531 1
+11 532 1
+11 534 1
+11 535 1
+11 536 1
+11 538 1
+11 539 1
+11 540 1
+11 545 1
+11 550 1
+11 554 1
+11 557 1
+11 559 1
+11 561 1
+11 565 1
+11 569 1
+11 572 1
+11 574 1
+11 576 1
+11 579 1
+11 582 1
+11 584 1
+11 586 1
+11 588 1
+11 590 1
+11 592 1
+11 593 1
+11 595 1
+11 596 1
+11 600 1
+11 604 1
+11 607 1
+11 609 1
+11 611 1
+11 614 1
+11 617 1
+11 619 1
+11 621 1
+11 623 1
+11 625 1
+11 627 1
+11 628 1
+11 630 1
+11 631 1
+11 634 1
+11 637 1
+11 639 1
+11 641 1
+11 643 1
+11 645 1
+11 647 1
+11 648 1
+11 650 1
+11 651 1
+11 653 1
+11 655 1
+11 657 1
+11 658 1
+11 660 1
+11 661 1
+11 662 1
+11 664 1
+11 665 1
+11 666 1
+11 670 1
+11 674 1
+11 677 1
+11 679 1
+11 681 1
+11 684 1
+11 687 1
+11 689 1
+11 691 1
+11 693 1
+11 695 1
+11 697 1
+11 698 1
+11 700 1
+11 701 1
+11 704 1
+11 707 1
+11 709 1
+11 711 1
+11 713 1
+11 715 1
+11 717 1
+11 718 1
+11 720 1
+11 721 1
+11 723 1
+11 725 1
+11 727 1
+11 728 1
+11 730 1
+11 731 1
+11 732 1
+11 734 1
+11 735 1
+11 736 1
+11 739 1
+11 742 1
+11 744 1
+11 746 1
+11 748 1
+11 750 1
+11 752 1
+11 753 1
+11 755 1
+11 756 1
+11 758 1
+11 760 1
+11 762 1
+11 763 1
+11 765 1
+11 766 1
+11 767 1
+11 769 1
+11 770 1
+11 771 1
+11 773 1
+11 775 1
+11 777 1
+11 778 1
+11 780 1
+11 781 1
+11 782 1
+11 784 1
+11 785 1
+11 786 1
+11 787 1
+11 789 1
+11 790 1
+11 791 1
+11 792 1
+12 8 1
+12 15 1
+12 21 1
+12 26 1
+12 30 1
+12 33 1
+12 35 1
+12 36 1
+12 43 1
+12 49 1
+12 54 1
+12 58 1
+12 61 1
+12 63 1
+12 64 1
+12 70 1
+12 75 1
+12 79 1
+12 82 1
+12 84 1
+12 85 1
+12 90 1
+12 94 1
+12 97 1
+12 99 1
+12 100 1
+12 104 1
+12 107 1
+12 109 1
+12 110 1
+12 113 1
+12 115 1
+12 116 1
+12 118 1
+12 119 1
+12 120 1
+12 127 1
+12 133 1
+12 138 1
+12 142 1
+12 145 1
+12 147 1
+12 148 1
+12 154 1
+12 159 1
+12 163 1
+12 166 1
+12 168 1
+12 169 1
+12 174 1
+12 178 1
+12 181 1
+12 183 1
+12 184 1
+12 188 1
+12 191 1
+12 193 1
+12 194 1
+12 197 1
+12 199 1
+12 200 1
+12 202 1
+12 203 1
+12 204 1
+12 210 1
+12 215 1
+12 219 1
+12 222 1
+12 224 1
+12 225 1
+12 230 1
+12 234 1
+12 237 1
+12 239 1
+12 240 1
+12 244 1
+12 247 1
+12 249 1
+12 250 1
+12 253 1
+12 255 1
+12 256 1
+12 258 1
+12 259 1
+12 260 1
+12 265 1
+12 269 1
+12 272 1
+12 274 1
+12 275 1
+12 279 1
+12 282 1
+12 284 1
+12 285 1
+12 288 1
+12 290 1
+12 291 1
+12 293 1
+12 294 1
+12 295 1
+12 299 1
+12 302 1
+12 304 1
+12 305 1
+12 308 1
+12 310 1
+12 311 1
+12 313 1
+12 314 1
+12 315 1
+12 318 1
+12 320 1
+12 321 1
+12 323 1
+12 324 1
+12 325 1
+12 327 1
+12 328 1
+12 329 1
+12 330 1
+12 337 1
+12 343 1
+12 348 1
+12 352 1
+12 355 1
+12 357 1
+12 358 1
+12 364 1
+12 369 1
+12 373 1
+12 376 1
+12 378 1
+12 379 1
+12 384 1
+12 388 1
+12 391 1
+12 393 1
+12 394 1
+12 398 1
+12 401 1
+12 403 1
+12 404 1
+12 407 1
+12 409 1
+12 410 1
+12 412 1
+12 413 1
+12 414 1
+12 420 1
+12 425 1
+12 429 1
+12 432 1
+12 434 1
+12 435 1
+12 440 1
+12 444 1
+12 447 1
+12 449 1
+12 450 1
+12 454 1
+12 457 1
+12 459 1
+12 460 1
+12 463 1
+12 465 1
+12 466 1
+12 468 1
+12 469 1
+12 470 1
+12 475 1
+12 479 1
+12 482 1
+12 484 1
+12 485 1
+12 489 1
+12 492 1
+12 494 1
+12 495 1
+12 498 1
+12 500 1
+12 501 1
+12 503 1
+12 504 1
+12 505 1
+12 509 1
+12 512 1
+12 514 1
+12 515 1
+12 518 1
+12 520 1
+12 521 1
+12 523 1
+12 524 1
+12 525 1
+12 528 1
+12 530 1
+12 531 1
+12 533 1
+12 534 1
+12 535 1
+12 537 1
+12 538 1
+12 539 1
+12 540 1
+12 546 1
+12 551 1
+12 555 1
+12 558 1
+12 560 1
+12 561 1
+12 566 1
+12 570 1
+12 573 1
+12 575 1
+12 576 1
+12 580 1
+12 583 1
+12 585 1
+12 586 1
+12 589 1
+12 591 1
+12 592 1
+12 594 1
+12 595 1
+12 596 1
+12 601 1
+12 605 1
+12 608 1
+12 610 1
+12 611 1
+12 615 1
+12 618 1
+12 620 1
+12 621 1
+12 624 1
+12 626 1
+12 627 1
+12 629 1
+12 630 1
+12 631 1
+12 635 1
+12 638 1
+12 640 1
+12 641 1
+12 644 1
+12 646 1
+12 647 1
+12 649 1
+12 650 1
+12 651 1
+12 654 1
+12 656 1
+12 657 1
+12 659 1
+12 660 1
+12 661 1
+12 663 1
+12 664 1
+12 665 1
+12 666 1
+12 671 1
+12 675 1
+12 678 1
+12 680 1
+12 681 1
+12 685 1
+12 688 1
+12 690 1
+12 691 1
+12 694 1
+12 696 1
+12 697 1
+12 699 1
+12 700 1
+12 701 1
+12 705 1
+12 708 1
+12 710 1
+12 711 1
+12 714 1
+12 716 1
+12 717 1
+12 719 1
+12 720 1
+12 721 1
+12 724 1
+12 726 1
+12 727 1
+12 729 1
+12 730 1
+12 731 1
+12 733 1
+12 734 1
+12 735 1
+12 736 1
+12 740 1
+12 743 1
+12 745 1
+12 746 1
+12 749 1
+12 751 1
+12 752 1
+12 754 1
+12 755 1
+12 756 1
+12 759 1
+12 761 1
+12 762 1
+12 764 1
+12 765 1
+12 766 1
+12 768 1
+12 769 1
+12 770 1
+12 771 1
+12 774 1
+12 776 1
+12 777 1
+12 779 1
+12 780 1
+12 781 1
+12 783 1
+12 784 1
+12 785 1
+12 786 1
+12 788 1
+12 789 1
+12 790 1
+12 791 1
+12 792 1
+13 1 1
+13 2 1
+13 3 1
+13 4 1
+13 5 1
+13 6 1
+13 7 1
+13 8 1
+13 9 1
+13 10 1
+13 11 1
+13 12 1
+13 13 1
+13 14 1
+13 15 1
+13 16 1
+13 17 1
+13 18 1
+13 19 1
+13 20 1
+13 21 1
+13 22 1
+13 23 1
+13 24 1
+13 25 1
+13 26 1
+13 27 1
+13 28 1
+13 29 1
+13 30 1
+13 31 1
+13 32 1
+13 33 1
+13 34 1
+13 35 1
+13 36 1
+13 37 1
+13 38 1
+13 39 1
+13 40 1
+13 41 1
+13 42 1
+13 43 1
+13 44 1
+13 45 1
+13 46 1
+13 47 1
+13 48 1
+13 49 1
+13 50 1
+13 51 1
+13 52 1
+13 53 1
+13 54 1
+13 55 1
+13 56 1
+13 57 1
+13 58 1
+13 59 1
+13 60 1
+13 61 1
+13 62 1
+13 63 1
+13 64 1
+13 65 1
+13 66 1
+13 67 1
+13 68 1
+13 69 1
+13 70 1
+13 71 1
+13 72 1
+13 73 1
+13 74 1
+13 75 1
+13 76 1
+13 77 1
+13 78 1
+13 79 1
+13 80 1
+13 81 1
+13 82 1
+13 83 1
+13 84 1
+13 85 1
+13 86 1
+13 87 1
+13 88 1
+13 89 1
+13 90 1
+13 91 1
+13 92 1
+13 93 1
+13 94 1
+13 95 1
+13 96 1
+13 97 1
+13 98 1
+13 99 1
+13 100 1
+13 101 1
+13 102 1
+13 103 1
+13 104 1
+13 105 1
+13 106 1
+13 107 1
+13 108 1
+13 109 1
+13 110 1
+13 111 1
+13 112 1
+13 113 1
+13 114 1
+13 115 1
+13 116 1
+13 117 1
+13 118 1
+13 119 1
+13 120 1
+13 793 1
+13 794 1
+13 795 1
+13 796 1
+13 797 1
+13 798 1
+13 799 1
+13 800 1
+13 801 1
+13 802 1
+13 803 1
+13 804 1
+13 805 1
+13 806 1
+13 807 1
+13 808 1
+13 809 1
+13 810 1
+13 811 1
+13 812 1
+13 813 1
+13 814 1
+13 815 1
+13 816 1
+13 817 1
+13 818 1
+13 819 1
+13 820 1
+13 821 1
+13 822 1
+13 823 1
+13 824 1
+13 825 1
+13 826 1
+13 827 1
+13 828 1
+13 829 1
+13 830 1
+13 831 1
+13 832 1
+13 833 1
+13 834 1
+13 835 1
+13 836 1
+13 837 1
+13 838 1
+13 839 1
+13 840 1
+13 841 1
+13 842 1
+13 843 1
+13 844 1
+13 845 1
+13 846 1
+13 847 1
+13 848 1
+13 849 1
+13 850 1
+13 851 1
+13 852 1
+13 853 1
+13 854 1
+13 855 1
+13 856 1
+13 857 1
+13 858 1
+13 859 1
+13 860 1
+13 861 1
+13 862 1
+13 863 1
+13 864 1
+13 865 1
+13 866 1
+13 867 1
+13 868 1
+13 869 1
+13 870 1
+13 871 1
+13 872 1
+13 873 1
+13 874 1
+13 875 1
+13 876 1
+13 877 1
+13 878 1
+13 879 1
+13 880 1
+13 881 1
+13 882 1
+13 883 1
+13 884 1
+13 885 1
+13 886 1
+13 887 1
+13 888 1
+13 889 1
+13 890 1
+13 891 1
+13 892 1
+13 893 1
+13 894 1
+13 895 1
+13 896 1
+13 897 1
+13 898 1
+13 899 1
+13 900 1
+13 901 1
+13 902 1
+13 903 1
+13 904 1
+13 905 1
+13 906 1
+13 907 1
+13 908 1
+13 909 1
+13 910 1
+13 911 1
+13 912 1
+13 913 1
+13 914 1
+13 915 1
+13 916 1
+13 917 1
+13 918 1
+13 919 1
+13 920 1
+13 921 1
+13 922 1
+13 923 1
+13 924 1
+13 925 1
+13 926 1
+13 927 1
+13 928 1
+13 929 1
+13 930 1
+13 931 1
+13 932 1
+13 933 1
+13 934 1
+13 935 1
+13 936 1
+13 937 1
+13 938 1
+13 939 1
+13 940 1
+13 941 1
+13 942 1
+13 943 1
+13 944 1
+13 945 1
+13 946 1
+13 947 1
+13 948 1
+13 949 1
+13 950 1
+13 951 1
+13 952 1
+13 953 1
+13 954 1
+13 955 1
+13 956 1
+13 957 1
+13 958 1
+13 959 1
+13 960 1
+13 961 1
+13 962 1
+13 963 1
+13 964 1
+13 965 1
+13 966 1
+13 967 1
+13 968 1
+13 969 1
+13 970 1
+13 971 1
+13 972 1
+13 973 1
+13 974 1
+13 975 1
+13 976 1
+13 977 1
+13 978 1
+13 979 1
+13 980 1
+13 981 1
+13 982 1
+13 983 1
+13 984 1
+13 985 1
+13 986 1
+13 987 1
+13 988 1
+13 989 1
+13 990 1
+13 991 1
+13 992 1
+13 993 1
+13 994 1
+13 995 1
+13 996 1
+13 997 1
+13 998 1
+13 999 1
+13 1000 1
+13 1001 1
+13 1002 1
+14 1 1
+14 2 1
+14 3 1
+14 4 1
+14 5 1
+14 6 1
+14 7 1
+14 8 1
+14 9 1
+14 10 1
+14 11 1
+14 12 1
+14 13 1
+14 14 1
+14 15 1
+14 16 1
+14 17 1
+14 18 1
+14 19 1
+14 20 1
+14 21 1
+14 22 1
+14 23 1
+14 24 1
+14 25 1
+14 26 1
+14 27 1
+14 28 1
+14 29 1
+14 30 1
+14 31 1
+14 32 1
+14 33 1
+14 34 1
+14 35 1
+14 36 1
+14 121 1
+14 122 1
+14 123 1
+14 124 1
+14 125 1
+14 126 1
+14 127 1
+14 128 1
+14 129 1
+14 130 1
+14 131 1
+14 132 1
+14 133 1
+14 134 1
+14 135 1
+14 136 1
+14 137 1
+14 138 1
+14 139 1
+14 140 1
+14 141 1
+14 142 1
+14 143 1
+14 144 1
+14 145 1
+14 146 1
+14 147 1
+14 148 1
+14 149 1
+14 150 1
+14 151 1
+14 152 1
+14 153 1
+14 154 1
+14 155 1
+14 156 1
+14 157 1
+14 158 1
+14 159 1
+14 160 1
+14 161 1
+14 162 1
+14 163 1
+14 164 1
+14 165 1
+14 166 1
+14 167 1
+14 168 1
+14 169 1
+14 170 1
+14 171 1
+14 172 1
+14 173 1
+14 174 1
+14 175 1
+14 176 1
+14 177 1
+14 178 1
+14 179 1
+14 180 1
+14 181 1
+14 182 1
+14 183 1
+14 184 1
+14 185 1
+14 186 1
+14 187 1
+14 188 1
+14 189 1
+14 190 1
+14 191 1
+14 192 1
+14 193 1
+14 194 1
+14 195 1
+14 196 1
+14 197 1
+14 198 1
+14 199 1
+14 200 1
+14 201 1
+14 202 1
+14 203 1
+14 204 1
+14 793 1
+14 794 1
+14 795 1
+14 796 1
+14 797 1
+14 798 1
+14 799 1
+14 800 1
+14 801 1
+14 802 1
+14 803 1
+14 804 1
+14 805 1
+14 806 1
+14 807 1
+14 808 1
+14 809 1
+14 810 1
+14 811 1
+14 812 1
+14 813 1
+14 814 1
+14 815 1
+14 816 1
+14 817 1
+14 818 1
+14 819 1
+14 820 1
+14 821 1
+14 822 1
+14 823 1
+14 824 1
+14 825 1
+14 826 1
+14 827 1
+14 828 1
+14 829 1
+14 830 1
+14 831 1
+14 832 1
+14 833 1
+14 834 1
+14 835 1
+14 836 1
+14 837 1
+14 838 1
+14 839 1
+14 840 1
+14 841 1
+14 842 1
+14 843 1
+14 844 1
+14 845 1
+14 846 1
+14 847 1
+14 848 1
+14 849 1
+14 850 1
+14 851 1
+14 852 1
+14 853 1
+14 854 1
+14 855 1
+14 856 1
+14 857 1
+14 858 1
+14 859 1
+14 860 1
+14 861 1
+14 862 1
+14 863 1
+14 864 1
+14 865 1
+14 866 1
+14 867 1
+14 868 1
+14 869 1
+14 870 1
+14 871 1
+14 872 1
+14 873 1
+14 874 1
+14 875 1
+14 876 1
+14 1003 1
+14 1004 1
+14 1005 1
+14 1006 1
+14 1007 1
+14 1008 1
+14 1009 1
+14 1010 1
+14 1011 1
+14 1012 1
+14 1013 1
+14 1014 1
+14 1015 1
+14 1016 1
+14 1017 1
+14 1018 1
+14 1019 1
+14 1020 1
+14 1021 1
+14 1022 1
+14 1023 1
+14 1024 1
+14 1025 1
+14 1026 1
+14 1027 1
+14 1028 1
+14 1029 1
+14 1030 1
+14 1031 1
+14 1032 1
+14 1033 1
+14 1034 1
+14 1035 1
+14 1036 1
+14 1037 1
+14 1038 1
+14 1039 1
+14 1040 1
+14 1041 1
+14 1042 1
+14 1043 1
+14 1044 1
+14 1045 1
+14 1046 1
+14 1047 1
+14 1048 1
+14 1049 1
+14 1050 1
+14 1051 1
+14 1052 1
+14 1053 1
+14 1054 1
+14 1055 1
+14 1056 1
+14 1057 1
+14 1058 1
+14 1059 1
+14 1060 1
+14 1061 1
+14 1062 1
+14 1063 1
+14 1064 1
+14 1065 1
+14 1066 1
+14 1067 1
+14 1068 1
+14 1069 1
+14 1070 1
+14 1071 1
+14 1072 1
+14 1073 1
+14 1074 1
+14 1075 1
+14 1076 1
+14 1077 1
+14 1078 1
+14 1079 1
+14 1080 1
+14 1081 1
+14 1082 1
+14 1083 1
+14 1084 1
+14 1085 1
+14 1086 1
+14 1087 1
+14 1088 1
+14 1089 1
+14 1090 1
+14 1091 1
+14 1092 1
+14 1093 1
+14 1094 1
+14 1095 1
+14 1096 1
+14 1097 1
+14 1098 1
+14 1099 1
+14 1100 1
+14 1101 1
+14 1102 1
+14 1103 1
+14 1104 1
+14 1105 1
+14 1106 1
+14 1107 1
+14 1108 1
+14 1109 1
+14 1110 1
+14 1111 1
+14 1112 1
+14 1113 1
+14 1114 1
+14 1115 1
+14 1116 1
+14 1117 1
+14 1118 1
+14 1119 1
+14 1120 1
+14 1121 1
+14 1122 1
+14 1123 1
+14 1124 1
+14 1125 1
+14 1126 1
+14 1127 1
+14 1128 1
+15 1 1
+15 2 1
+15 3 1
+15 4 1
+15 5 1
+15 6 1
+15 7 1
+15 8 1
+15 37 1
+15 38 1
+15 39 1
+15 40 1
+15 41 1
+15 42 1
+15 43 1
+15 44 1
+15 45 1
+15 46 1
+15 47 1
+15 48 1
+15 49 1
+15 50 1
+15 51 1
+15 52 1
+15 53 1
+15 54 1
+15 55 1
+15 56 1
+15 57 1
+15 58 1
+15 59 1
+15 60 1
+15 61 1
+15 62 1
+15 63 1
+15 64 1
+15 121 1
+15 122 1
+15 123 1
+15 124 1
+15 125 1
+15 126 1
+15 127 1
+15 128 1
+15 129 1
+15 130 1
+15 131 1
+15 132 1
+15 133 1
+15 134 1
+15 135 1
+15 136 1
+15 137 1
+15 138 1
+15 139 1
+15 140 1
+15 141 1
+15 142 1
+15 143 1
+15 144 1
+15 145 1
+15 146 1
+15 147 1
+15 148 1
+15 205 1
+15 206 1
+15 207 1
+15 208 1
+15 209 1
+15 210 1
+15 211 1
+15 212 1
+15 213 1
+15 214 1
+15 215 1
+15 216 1
+15 217 1
+15 218 1
+15 219 1
+15 220 1
+15 221 1
+15 222 1
+15 223 1
+15 224 1
+15 225 1
+15 226 1
+15 227 1
+15 228 1
+15 229 1
+15 230 1
+15 231 1
+15 232 1
+15 233 1
+15 234 1
+15 235 1
+15 236 1
+15 237 1
+15 238 1
+15 239 1
+15 240 1
+15 241 1
+15 242 1
+15 243 1
+15 244 1
+15 245 1
+15 246 1
+15 247 1
+15 248 1
+15 249 1
+15 250 1
+15 251 1
+15 252 1
+15 253 1
+15 254 1
+15 255 1
+15 256 1
+15 257 1
+15 258 1
+15 259 1
+15 260 1
+15 793 1
+15 794 1
+15 795 1
+15 796 1
+15 797 1
+15 798 1
+15 799 1
+15 800 1
+15 801 1
+15 802 1
+15 803 1
+15 804 1
+15 805 1
+15 806 1
+15 807 1
+15 808 1
+15 809 1
+15 810 1
+15 811 1
+15 812 1
+15 813 1
+15 814 1
+15 815 1
+15 816 1
+15 817 1
+15 818 1
+15 819 1
+15 820 1
+15 877 1
+15 878 1
+15 879 1
+15 880 1
+15 881 1
+15 882 1
+15 883 1
+15 884 1
+15 885 1
+15 886 1
+15 887 1
+15 888 1
+15 889 1
+15 890 1
+15 891 1
+15 892 1
+15 893 1
+15 894 1
+15 895 1
+15 896 1
+15 897 1
+15 898 1
+15 899 1
+15 900 1
+15 901 1
+15 902 1
+15 903 1
+15 904 1
+15 905 1
+15 906 1
+15 907 1
+15 908 1
+15 909 1
+15 910 1
+15 911 1
+15 912 1
+15 913 1
+15 914 1
+15 915 1
+15 916 1
+15 917 1
+15 918 1
+15 919 1
+15 920 1
+15 921 1
+15 922 1
+15 923 1
+15 924 1
+15 925 1
+15 926 1
+15 927 1
+15 928 1
+15 929 1
+15 930 1
+15 931 1
+15 932 1
+15 1003 1
+15 1004 1
+15 1005 1
+15 1006 1
+15 1007 1
+15 1008 1
+15 1009 1
+15 1010 1
+15 1011 1
+15 1012 1
+15 1013 1
+15 1014 1
+15 1015 1
+15 1016 1
+15 1017 1
+15 1018 1
+15 1019 1
+15 1020 1
+15 1021 1
+15 1022 1
+15 1023 1
+15 1024 1
+15 1025 1
+15 1026 1
+15 1027 1
+15 1028 1
+15 1029 1
+15 1030 1
+15 1031 1
+15 1032 1
+15 1033 1
+15 1034 1
+15 1035 1
+15 1036 1
+15 1037 1
+15 1038 1
+15 1039 1
+15 1040 1
+15 1041 1
+15 1042 1
+15 1043 1
+15 1044 1
+15 1045 1
+15 1046 1
+15 1047 1
+15 1048 1
+15 1049 1
+15 1050 1
+15 1051 1
+15 1052 1
+15 1053 1
+15 1054 1
+15 1055 1
+15 1056 1
+15 1057 1
+15 1058 1
+15 1129 1
+15 1130 1
+15 1131 1
+15 1132 1
+15 1133 1
+15 1134 1
+15 1135 1
+15 1136 1
+15 1137 1
+15 1138 1
+15 1139 1
+15 1140 1
+15 1141 1
+15 1142 1
+15 1143 1
+15 1144 1
+15 1145 1
+15 1146 1
+15 1147 1
+15 1148 1
+15 1149 1
+15 1150 1
+15 1151 1
+15 1152 1
+15 1153 1
+15 1154 1
+15 1155 1
+15 1156 1
+15 1157 1
+15 1158 1
+15 1159 1
+15 1160 1
+15 1161 1
+15 1162 1
+15 1163 1
+15 1164 1
+15 1165 1
+15 1166 1
+15 1167 1
+15 1168 1
+15 1169 1
+15 1170 1
+15 1171 1
+15 1172 1
+15 1173 1
+15 1174 1
+15 1175 1
+15 1176 1
+15 1177 1
+15 1178 1
+15 1179 1
+15 1180 1
+15 1181 1
+15 1182 1
+15 1183 1
+15 1184 1
+15 1185 1
+15 1186 1
+15 1187 1
+15 1188 1
+15 1189 1
+15 1190 1
+15 1191 1
+15 1192 1
+15 1193 1
+15 1194 1
+15 1195 1
+15 1196 1
+15 1197 1
+15 1198 1
+16 1 1
+16 9 1
+16 10 1
+16 11 1
+16 12 1
+16 13 1
+16 14 1
+16 15 1
+16 37 1
+16 38 1
+16 39 1
+16 40 1
+16 41 1
+16 42 1
+16 43 1
+16 65 1
+16 66 1
+16 67 1
+16 68 1
+16 69 1
+16 70 1
+16 71 1
+16 72 1
+16 73 1
+16 74 1
+16 75 1
+16 76 1
+16 77 1
+16 78 1
+16 79 1
+16 80 1
+16 81 1
+16 82 1
+16 83 1
+16 84 1
+16 85 1
+16 121 1
+16 122 1
+16 123 1
+16 124 1
+16 125 1
+16 126 1
+16 127 1
+16 149 1
+16 150 1
+16 151 1
+16 152 1
+16 153 1
+16 154 1
+16 155 1
+16 156 1
+16 157 1
+16 158 1
+16 159 1
+16 160 1
+16 161 1
+16 162 1
+16 163 1
+16 164 1
+16 165 1
+16 166 1
+16 167 1
+16 168 1
+16 169 1
+16 205 1
+16 206 1
+16 207 1
+16 208 1
+16 209 1
+16 210 1
+16 211 1
+16 212 1
+16 213 1
+16 214 1
+16 215 1
+16 216 1
+16 217 1
+16 218 1
+16 219 1
+16 220 1
+16 221 1
+16 222 1
+16 223 1
+16 224 1
+16 225 1
+16 261 1
+16 262 1
+16 263 1
+16 264 1
+16 265 1
+16 266 1
+16 267 1
+16 268 1
+16 269 1
+16 270 1
+16 271 1
+16 272 1
+16 273 1
+16 274 1
+16 275 1
+16 276 1
+16 277 1
+16 278 1
+16 279 1
+16 280 1
+16 281 1
+16 282 1
+16 283 1
+16 284 1
+16 285 1
+16 286 1
+16 287 1
+16 288 1
+16 289 1
+16 290 1
+16 291 1
+16 292 1
+16 293 1
+16 294 1
+16 295 1
+16 793 1
+16 794 1
+16 795 1
+16 796 1
+16 797 1
+16 798 1
+16 799 1
+16 821 1
+16 822 1
+16 823 1
+16 824 1
+16 825 1
+16 826 1
+16 827 1
+16 828 1
+16 829 1
+16 830 1
+16 831 1
+16 832 1
+16 833 1
+16 834 1
+16 835 1
+16 836 1
+16 837 1
+16 838 1
+16 839 1
+16 840 1
+16 841 1
+16 877 1
+16 878 1
+16 879 1
+16 880 1
+16 881 1
+16 882 1
+16 883 1
+16 884 1
+16 885 1
+16 886 1
+16 887 1
+16 888 1
+16 889 1
+16 890 1
+16 891 1
+16 892 1
+16 893 1
+16 894 1
+16 895 1
+16 896 1
+16 897 1
+16 933 1
+16 934 1
+16 935 1
+16 936 1
+16 937 1
+16 938 1
+16 939 1
+16 940 1
+16 941 1
+16 942 1
+16 943 1
+16 944 1
+16 945 1
+16 946 1
+16 947 1
+16 948 1
+16 949 1
+16 950 1
+16 951 1
+16 952 1
+16 953 1
+16 954 1
+16 955 1
+16 956 1
+16 957 1
+16 958 1
+16 959 1
+16 960 1
+16 961 1
+16 962 1
+16 963 1
+16 964 1
+16 965 1
+16 966 1
+16 967 1
+16 1003 1
+16 1004 1
+16 1005 1
+16 1006 1
+16 1007 1
+16 1008 1
+16 1009 1
+16 1010 1
+16 1011 1
+16 1012 1
+16 1013 1
+16 1014 1
+16 1015 1
+16 1016 1
+16 1017 1
+16 1018 1
+16 1019 1
+16 1020 1
+16 1021 1
+16 1022 1
+16 1023 1
+16 1059 1
+16 1060 1
+16 1061 1
+16 1062 1
+16 1063 1
+16 1064 1
+16 1065 1
+16 1066 1
+16 1067 1
+16 1068 1
+16 1069 1
+16 1070 1
+16 1071 1
+16 1072 1
+16 1073 1
+16 1074 1
+16 1075 1
+16 1076 1
+16 1077 1
+16 1078 1
+16 1079 1
+16 1080 1
+16 1081 1
+16 1082 1
+16 1083 1
+16 1084 1
+16 1085 1
+16 1086 1
+16 1087 1
+16 1088 1
+16 1089 1
+16 1090 1
+16 1091 1
+16 1092 1
+16 1093 1
+16 1129 1
+16 1130 1
+16 1131 1
+16 1132 1
+16 1133 1
+16 1134 1
+16 1135 1
+16 1136 1
+16 1137 1
+16 1138 1
+16 1139 1
+16 1140 1
+16 1141 1
+16 1142 1
+16 1143 1
+16 1144 1
+16 1145 1
+16 1146 1
+16 1147 1
+16 1148 1
+16 1149 1
+16 1150 1
+16 1151 1
+16 1152 1
+16 1153 1
+16 1154 1
+16 1155 1
+16 1156 1
+16 1157 1
+16 1158 1
+16 1159 1
+16 1160 1
+16 1161 1
+16 1162 1
+16 1163 1
+16 1199 1
+16 1200 1
+16 1201 1
+16 1202 1
+16 1203 1
+16 1204 1
+16 1205 1
+16 1206 1
+16 1207 1
+16 1208 1
+16 1209 1
+16 1210 1
+16 1211 1
+16 1212 1
+16 1213 1
+16 1214 1
+16 1215 1
+16 1216 1
+16 1217 1
+16 1218 1
+16 1219 1
+16 1220 1
+16 1221 1
+16 1222 1
+16 1223 1
+16 1224 1
+16 1225 1
+16 1226 1
+16 1227 1
+16 1228 1
+16 1229 1
+16 1230 1
+16 1231 1
+16 1232 1
+16 1233 1
+17 2 1
+17 9 1
+17 16 1
+17 17 1
+17 18 1
+17 19 1
+17 20 1
+17 21 1
+17 37 1
+17 44 1
+17 45 1
+17 46 1
+17 47 1
+17 48 1
+17 49 1
+17 65 1
+17 66 1
+17 67 1
+17 68 1
+17 69 1
+17 70 1
+17 86 1
+17 87 1
+17 88 1
+17 89 1
+17 90 1
+17 91 1
+17 92 1
+17 93 1
+17 94 1
+17 95 1
+17 96 1
+17 97 1
+17 98 1
+17 99 1
+17 100 1
+17 121 1
+17 128 1
+17 129 1
+17 130 1
+17 131 1
+17 132 1
+17 133 1
+17 149 1
+17 150 1
+17 151 1
+17 152 1
+17 153 1
+17 154 1
+17 170 1
+17 171 1
+17 172 1
+17 173 1
+17 174 1
+17 175 1
+17 176 1
+17 177 1
+17 178 1
+17 179 1
+17 180 1
+17 181 1
+17 182 1
+17 183 1
+17 184 1
+17 205 1
+17 206 1
+17 207 1
+17 208 1
+17 209 1
+17 210 1
+17 226 1
+17 227 1
+17 228 1
+17 229 1
+17 230 1
+17 231 1
+17 232 1
+17 233 1
+17 234 1
+17 235 1
+17 236 1
+17 237 1
+17 238 1
+17 239 1
+17 240 1
+17 261 1
+17 262 1
+17 263 1
+17 264 1
+17 265 1
+17 266 1
+17 267 1
+17 268 1
+17 269 1
+17 270 1
+17 271 1
+17 272 1
+17 273 1
+17 274 1
+17 275 1
+17 296 1
+17 297 1
+17 298 1
+17 299 1
+17 300 1
+17 301 1
+17 302 1
+17 303 1
+17 304 1
+17 305 1
+17 306 1
+17 307 1
+17 308 1
+17 309 1
+17 310 1
+17 311 1
+17 312 1
+17 313 1
+17 314 1
+17 315 1
+17 793 1
+17 800 1
+17 801 1
+17 802 1
+17 803 1
+17 804 1
+17 805 1
+17 821 1
+17 822 1
+17 823 1
+17 824 1
+17 825 1
+17 826 1
+17 842 1
+17 843 1
+17 844 1
+17 845 1
+17 846 1
+17 847 1
+17 848 1
+17 849 1
+17 850 1
+17 851 1
+17 852 1
+17 853 1
+17 854 1
+17 855 1
+17 856 1
+17 877 1
+17 878 1
+17 879 1
+17 880 1
+17 881 1
+17 882 1
+17 898 1
+17 899 1
+17 900 1
+17 901 1
+17 902 1
+17 903 1
+17 904 1
+17 905 1
+17 906 1
+17 907 1
+17 908 1
+17 909 1
+17 910 1
+17 911 1
+17 912 1
+17 933 1
+17 934 1
+17 935 1
+17 936 1
+17 937 1
+17 938 1
+17 939 1
+17 940 1
+17 941 1
+17 942 1
+17 943 1
+17 944 1
+17 945 1
+17 946 1
+17 947 1
+17 968 1
+17 969 1
+17 970 1
+17 971 1
+17 972 1
+17 973 1
+17 974 1
+17 975 1
+17 976 1
+17 977 1
+17 978 1
+17 979 1
+17 980 1
+17 981 1
+17 982 1
+17 983 1
+17 984 1
+17 985 1
+17 986 1
+17 987 1
+17 1003 1
+17 1004 1
+17 1005 1
+17 1006 1
+17 1007 1
+17 1008 1
+17 1024 1
+17 1025 1
+17 1026 1
+17 1027 1
+17 1028 1
+17 1029 1
+17 1030 1
+17 1031 1
+17 1032 1
+17 1033 1
+17 1034 1
+17 1035 1
+17 1036 1
+17 1037 1
+17 1038 1
+17 1059 1
+17 1060 1
+17 1061 1
+17 1062 1
+17 1063 1
+17 1064 1
+17 1065 1
+17 1066 1
+17 1067 1
+17 1068 1
+17 1069 1
+17 1070 1
+17 1071 1
+17 1072 1
+17 1073 1
+17 1094 1
+17 1095 1
+17 1096 1
+17 1097 1
+17 1098 1
+17 1099 1
+17 1100 1
+17 1101 1
+17 1102 1
+17 1103 1
+17 1104 1
+17 1105 1
+17 1106 1
+17 1107 1
+17 1108 1
+17 1109 1
+17 1110 1
+17 1111 1
+17 1112 1
+17 1113 1
+17 1129 1
+17 1130 1
+17 1131 1
+17 1132 1
+17 1133 1
+17 1134 1
+17 1135 1
+17 1136 1
+17 1137 1
+17 1138 1
+17 1139 1
+17 1140 1
+17 1141 1
+17 1142 1
+17 1143 1
+17 1164 1
+17 1165 1
+17 1166 1
+17 1167 1
+17 1168 1
+17 1169 1
+17 1170 1
+17 1171 1
+17 1172 1
+17 1173 1
+17 1174 1
+17 1175 1
+17 1176 1
+17 1177 1
+17 1178 1
+17 1179 1
+17 1180 1
+17 1181 1
+17 1182 1
+17 1183 1
+17 1199 1
+17 1200 1
+17 1201 1
+17 1202 1
+17 1203 1
+17 1204 1
+17 1205 1
+17 1206 1
+17 1207 1
+17 1208 1
+17 1209 1
+17 1210 1
+17 1211 1
+17 1212 1
+17 1213 1
+17 1214 1
+17 1215 1
+17 1216 1
+17 1217 1
+17 1218 1
+17 1234 1
+17 1235 1
+17 1236 1
+17 1237 1
+17 1238 1
+17 1239 1
+17 1240 1
+17 1241 1
+17 1242 1
+17 1243 1
+17 1244 1
+17 1245 1
+17 1246 1
+17 1247 1
+17 1248 1
+18 3 1
+18 10 1
+18 16 1
+18 22 1
+18 23 1
+18 24 1
+18 25 1
+18 26 1
+18 38 1
+18 44 1
+18 50 1
+18 51 1
+18 52 1
+18 53 1
+18 54 1
+18 65 1
+18 71 1
+18 72 1
+18 73 1
+18 74 1
+18 75 1
+18 86 1
+18 87 1
+18 88 1
+18 89 1
+18 90 1
+18 101 1
+18 102 1
+18 103 1
+18 104 1
+18 105 1
+18 106 1
+18 107 1
+18 108 1
+18 109 1
+18 110 1
+18 122 1
+18 128 1
+18 134 1
+18 135 1
+18 136 1
+18 137 1
+18 138 1
+18 149 1
+18 155 1
+18 156 1
+18 157 1
+18 158 1
+18 159 1
+18 170 1
+18 171 1
+18 172 1
+18 173 1
+18 174 1
+18 185 1
+18 186 1
+18 187 1
+18 188 1
+18 189 1
+18 190 1
+18 191 1
+18 192 1
+18 193 1
+18 194 1
+18 205 1
+18 211 1
+18 212 1
+18 213 1
+18 214 1
+18 215 1
+18 226 1
+18 227 1
+18 228 1
+18 229 1
+18 230 1
+18 241 1
+18 242 1
+18 243 1
+18 244 1
+18 245 1
+18 246 1
+18 247 1
+18 248 1
+18 249 1
+18 250 1
+18 261 1
+18 262 1
+18 263 1
+18 264 1
+18 265 1
+18 276 1
+18 277 1
+18 278 1
+18 279 1
+18 280 1
+18 281 1
+18 282 1
+18 283 1
+18 284 1
+18 285 1
+18 296 1
+18 297 1
+18 298 1
+18 299 1
+18 300 1
+18 301 1
+18 302 1
+18 303 1
+18 304 1
+18 305 1
+18 316 1
+18 317 1
+18 318 1
+18 319 1
+18 320 1
+18 321 1
+18 322 1
+18 323 1
+18 324 1
+18 325 1
+18 794 1
+18 800 1
+18 806 1
+18 807 1
+18 808 1
+18 809 1
+18 810 1
+18 821 1
+18 827 1
+18 828 1
+18 829 1
+18 830 1
+18 831 1
+18 842 1
+18 843 1
+18 844 1
+18 845 1
+18 846 1
+18 857 1
+18 858 1
+18 859 1
+18 860 1
+18 861 1
+18 862 1
+18 863 1
+18 864 1
+18 865 1
+18 866 1
+18 877 1
+18 883 1
+18 884 1
+18 885 1
+18 886 1
+18 887 1
+18 898 1
+18 899 1
+18 900 1
+18 901 1
+18 902 1
+18 913 1
+18 914 1
+18 915 1
+18 916 1
+18 917 1
+18 918 1
+18 919 1
+18 920 1
+18 921 1
+18 922 1
+18 933 1
+18 934 1
+18 935 1
+18 936 1
+18 937 1
+18 948 1
+18 949 1
+18 950 1
+18 951 1
+18 952 1
+18 953 1
+18 954 1
+18 955 1
+18 956 1
+18 957 1
+18 968 1
+18 969 1
+18 970 1
+18 971 1
+18 972 1
+18 973 1
+18 974 1
+18 975 1
+18 976 1
+18 977 1
+18 988 1
+18 989 1
+18 990 1
+18 991 1
+18 992 1
+18 993 1
+18 994 1
+18 995 1
+18 996 1
+18 997 1
+18 1003 1
+18 1009 1
+18 1010 1
+18 1011 1
+18 1012 1
+18 1013 1
+18 1024 1
+18 1025 1
+18 1026 1
+18 1027 1
+18 1028 1
+18 1039 1
+18 1040 1
+18 1041 1
+18 1042 1
+18 1043 1
+18 1044 1
+18 1045 1
+18 1046 1
+18 1047 1
+18 1048 1
+18 1059 1
+18 1060 1
+18 1061 1
+18 1062 1
+18 1063 1
+18 1074 1
+18 1075 1
+18 1076 1
+18 1077 1
+18 1078 1
+18 1079 1
+18 1080 1
+18 1081 1
+18 1082 1
+18 1083 1
+18 1094 1
+18 1095 1
+18 1096 1
+18 1097 1
+18 1098 1
+18 1099 1
+18 1100 1
+18 1101 1
+18 1102 1
+18 1103 1
+18 1114 1
+18 1115 1
+18 1116 1
+18 1117 1
+18 1118 1
+18 1119 1
+18 1120 1
+18 1121 1
+18 1122 1
+18 1123 1
+18 1129 1
+18 1130 1
+18 1131 1
+18 1132 1
+18 1133 1
+18 1144 1
+18 1145 1
+18 1146 1
+18 1147 1
+18 1148 1
+18 1149 1
+18 1150 1
+18 1151 1
+18 1152 1
+18 1153 1
+18 1164 1
+18 1165 1
+18 1166 1
+18 1167 1
+18 1168 1
+18 1169 1
+18 1170 1
+18 1171 1
+18 1172 1
+18 1173 1
+18 1184 1
+18 1185 1
+18 1186 1
+18 1187 1
+18 1188 1
+18 1189 1
+18 1190 1
+18 1191 1
+18 1192 1
+18 1193 1
+18 1199 1
+18 1200 1
+18 1201 1
+18 1202 1
+18 1203 1
+18 1204 1
+18 1205 1
+18 1206 1
+18 1207 1
+18 1208 1
+18 1219 1
+18 1220 1
+18 1221 1
+18 1222 1
+18 1223 1
+18 1224 1
+18 1225 1
+18 1226 1
+18 1227 1
+18 1228 1
+18 1234 1
+18 1235 1
+18 1236 1
+18 1237 1
+18 1238 1
+18 1239 1
+18 1240 1
+18 1241 1
+18 1242 1
+18 1243 1
+18 1249 1
+18 1250 1
+18 1251 1
+18 1252 1
+18 1253 1
+19 4 1
+19 11 1
+19 17 1
+19 22 1
+19 27 1
+19 28 1
+19 29 1
+19 30 1
+19 39 1
+19 45 1
+19 50 1
+19 55 1
+19 56 1
+19 57 1
+19 58 1
+19 66 1
+19 71 1
+19 76 1
+19 77 1
+19 78 1
+19 79 1
+19 86 1
+19 91 1
+19 92 1
+19 93 1
+19 94 1
+19 101 1
+19 102 1
+19 103 1
+19 104 1
+19 111 1
+19 112 1
+19 113 1
+19 114 1
+19 115 1
+19 116 1
+19 123 1
+19 129 1
+19 134 1
+19 139 1
+19 140 1
+19 141 1
+19 142 1
+19 150 1
+19 155 1
+19 160 1
+19 161 1
+19 162 1
+19 163 1
+19 170 1
+19 175 1
+19 176 1
+19 177 1
+19 178 1
+19 185 1
+19 186 1
+19 187 1
+19 188 1
+19 195 1
+19 196 1
+19 197 1
+19 198 1
+19 199 1
+19 200 1
+19 206 1
+19 211 1
+19 216 1
+19 217 1
+19 218 1
+19 219 1
+19 226 1
+19 231 1
+19 232 1
+19 233 1
+19 234 1
+19 241 1
+19 242 1
+19 243 1
+19 244 1
+19 251 1
+19 252 1
+19 253 1
+19 254 1
+19 255 1
+19 256 1
+19 261 1
+19 266 1
+19 267 1
+19 268 1
+19 269 1
+19 276 1
+19 277 1
+19 278 1
+19 279 1
+19 286 1
+19 287 1
+19 288 1
+19 289 1
+19 290 1
+19 291 1
+19 296 1
+19 297 1
+19 298 1
+19 299 1
+19 306 1
+19 307 1
+19 308 1
+19 309 1
+19 310 1
+19 311 1
+19 316 1
+19 317 1
+19 318 1
+19 319 1
+19 320 1
+19 321 1
+19 326 1
+19 327 1
+19 328 1
+19 329 1
+19 795 1
+19 801 1
+19 806 1
+19 811 1
+19 812 1
+19 813 1
+19 814 1
+19 822 1
+19 827 1
+19 832 1
+19 833 1
+19 834 1
+19 835 1
+19 842 1
+19 847 1
+19 848 1
+19 849 1
+19 850 1
+19 857 1
+19 858 1
+19 859 1
+19 860 1
+19 867 1
+19 868 1
+19 869 1
+19 870 1
+19 871 1
+19 872 1
+19 878 1
+19 883 1
+19 888 1
+19 889 1
+19 890 1
+19 891 1
+19 898 1
+19 903 1
+19 904 1
+19 905 1
+19 906 1
+19 913 1
+19 914 1
+19 915 1
+19 916 1
+19 923 1
+19 924 1
+19 925 1
+19 926 1
+19 927 1
+19 928 1
+19 933 1
+19 938 1
+19 939 1
+19 940 1
+19 941 1
+19 948 1
+19 949 1
+19 950 1
+19 951 1
+19 958 1
+19 959 1
+19 960 1
+19 961 1
+19 962 1
+19 963 1
+19 968 1
+19 969 1
+19 970 1
+19 971 1
+19 978 1
+19 979 1
+19 980 1
+19 981 1
+19 982 1
+19 983 1
+19 988 1
+19 989 1
+19 990 1
+19 991 1
+19 992 1
+19 993 1
+19 998 1
+19 999 1
+19 1000 1
+19 1001 1
+19 1004 1
+19 1009 1
+19 1014 1
+19 1015 1
+19 1016 1
+19 1017 1
+19 1024 1
+19 1029 1
+19 1030 1
+19 1031 1
+19 1032 1
+19 1039 1
+19 1040 1
+19 1041 1
+19 1042 1
+19 1049 1
+19 1050 1
+19 1051 1
+19 1052 1
+19 1053 1
+19 1054 1
+19 1059 1
+19 1064 1
+19 1065 1
+19 1066 1
+19 1067 1
+19 1074 1
+19 1075 1
+19 1076 1
+19 1077 1
+19 1084 1
+19 1085 1
+19 1086 1
+19 1087 1
+19 1088 1
+19 1089 1
+19 1094 1
+19 1095 1
+19 1096 1
+19 1097 1
+19 1104 1
+19 1105 1
+19 1106 1
+19 1107 1
+19 1108 1
+19 1109 1
+19 1114 1
+19 1115 1
+19 1116 1
+19 1117 1
+19 1118 1
+19 1119 1
+19 1124 1
+19 1125 1
+19 1126 1
+19 1127 1
+19 1129 1
+19 1134 1
+19 1135 1
+19 1136 1
+19 1137 1
+19 1144 1
+19 1145 1
+19 1146 1
+19 1147 1
+19 1154 1
+19 1155 1
+19 1156 1
+19 1157 1
+19 1158 1
+19 1159 1
+19 1164 1
+19 1165 1
+19 1166 1
+19 1167 1
+19 1174 1
+19 1175 1
+19 1176 1
+19 1177 1
+19 1178 1
+19 1179 1
+19 1184 1
+19 1185 1
+19 1186 1
+19 1187 1
+19 1188 1
+19 1189 1
+19 1194 1
+19 1195 1
+19 1196 1
+19 1197 1
+19 1199 1
+19 1200 1
+19 1201 1
+19 1202 1
+19 1209 1
+19 1210 1
+19 1211 1
+19 1212 1
+19 1213 1
+19 1214 1
+19 1219 1
+19 1220 1
+19 1221 1
+19 1222 1
+19 1223 1
+19 1224 1
+19 1229 1
+19 1230 1
+19 1231 1
+19 1232 1
+19 1234 1
+19 1235 1
+19 1236 1
+19 1237 1
+19 1238 1
+19 1239 1
+19 1244 1
+19 1245 1
+19 1246 1
+19 1247 1
+19 1249 1
+19 1250 1
+19 1251 1
+19 1252 1
+19 1254 1
+20 5 1
+20 12 1
+20 18 1
+20 23 1
+20 27 1
+20 31 1
+20 32 1
+20 33 1
+20 40 1
+20 46 1
+20 51 1
+20 55 1
+20 59 1
+20 60 1
+20 61 1
+20 67 1
+20 72 1
+20 76 1
+20 80 1
+20 81 1
+20 82 1
+20 87 1
+20 91 1
+20 95 1
+20 96 1
+20 97 1
+20 101 1
+20 105 1
+20 106 1
+20 107 1
+20 111 1
+20 112 1
+20 113 1
+20 117 1
+20 118 1
+20 119 1
+20 124 1
+20 130 1
+20 135 1
+20 139 1
+20 143 1
+20 144 1
+20 145 1
+20 151 1
+20 156 1
+20 160 1
+20 164 1
+20 165 1
+20 166 1
+20 171 1
+20 175 1
+20 179 1
+20 180 1
+20 181 1
+20 185 1
+20 189 1
+20 190 1
+20 191 1
+20 195 1
+20 196 1
+20 197 1
+20 201 1
+20 202 1
+20 203 1
+20 207 1
+20 212 1
+20 216 1
+20 220 1
+20 221 1
+20 222 1
+20 227 1
+20 231 1
+20 235 1
+20 236 1
+20 237 1
+20 241 1
+20 245 1
+20 246 1
+20 247 1
+20 251 1
+20 252 1
+20 253 1
+20 257 1
+20 258 1
+20 259 1
+20 262 1
+20 266 1
+20 270 1
+20 271 1
+20 272 1
+20 276 1
+20 280 1
+20 281 1
+20 282 1
+20 286 1
+20 287 1
+20 288 1
+20 292 1
+20 293 1
+20 294 1
+20 296 1
+20 300 1
+20 301 1
+20 302 1
+20 306 1
+20 307 1
+20 308 1
+20 312 1
+20 313 1
+20 314 1
+20 316 1
+20 317 1
+20 318 1
+20 322 1
+20 323 1
+20 324 1
+20 326 1
+20 327 1
+20 328 1
+20 330 1
+20 796 1
+20 802 1
+20 807 1
+20 811 1
+20 815 1
+20 816 1
+20 817 1
+20 823 1
+20 828 1
+20 832 1
+20 836 1
+20 837 1
+20 838 1
+20 843 1
+20 847 1
+20 851 1
+20 852 1
+20 853 1
+20 857 1
+20 861 1
+20 862 1
+20 863 1
+20 867 1
+20 868 1
+20 869 1
+20 873 1
+20 874 1
+20 875 1
+20 879 1
+20 884 1
+20 888 1
+20 892 1
+20 893 1
+20 894 1
+20 899 1
+20 903 1
+20 907 1
+20 908 1
+20 909 1
+20 913 1
+20 917 1
+20 918 1
+20 919 1
+20 923 1
+20 924 1
+20 925 1
+20 929 1
+20 930 1
+20 931 1
+20 934 1
+20 938 1
+20 942 1
+20 943 1
+20 944 1
+20 948 1
+20 952 1
+20 953 1
+20 954 1
+20 958 1
+20 959 1
+20 960 1
+20 964 1
+20 965 1
+20 966 1
+20 968 1
+20 972 1
+20 973 1
+20 974 1
+20 978 1
+20 979 1
+20 980 1
+20 984 1
+20 985 1
+20 986 1
+20 988 1
+20 989 1
+20 990 1
+20 994 1
+20 995 1
+20 996 1
+20 998 1
+20 999 1
+20 1000 1
+20 1002 1
+20 1005 1
+20 1010 1
+20 1014 1
+20 1018 1
+20 1019 1
+20 1020 1
+20 1025 1
+20 1029 1
+20 1033 1
+20 1034 1
+20 1035 1
+20 1039 1
+20 1043 1
+20 1044 1
+20 1045 1
+20 1049 1
+20 1050 1
+20 1051 1
+20 1055 1
+20 1056 1
+20 1057 1
+20 1060 1
+20 1064 1
+20 1068 1
+20 1069 1
+20 1070 1
+20 1074 1
+20 1078 1
+20 1079 1
+20 1080 1
+20 1084 1
+20 1085 1
+20 1086 1
+20 1090 1
+20 1091 1
+20 1092 1
+20 1094 1
+20 1098 1
+20 1099 1
+20 1100 1
+20 1104 1
+20 1105 1
+20 1106 1
+20 1110 1
+20 1111 1
+20 1112 1
+20 1114 1
+20 1115 1
+20 1116 1
+20 1120 1
+20 1121 1
+20 1122 1
+20 1124 1
+20 1125 1
+20 1126 1
+20 1128 1
+20 1130 1
+20 1134 1
+20 1138 1
+20 1139 1
+20 1140 1
+20 1144 1
+20 1148 1
+20 1149 1
+20 1150 1
+20 1154 1
+20 1155 1
+20 1156 1
+20 1160 1
+20 1161 1
+20 1162 1
+20 1164 1
+20 1168 1
+20 1169 1
+20 1170 1
+20 1174 1
+20 1175 1
+20 1176 1
+20 1180 1
+20 1181 1
+20 1182 1
+20 1184 1
+20 1185 1
+20 1186 1
+20 1190 1
+20 1191 1
+20 1192 1
+20 1194 1
+20 1195 1
+20 1196 1
+20 1198 1
+20 1199 1
+20 1203 1
+20 1204 1
+20 1205 1
+20 1209 1
+20 1210 1
+20 1211 1
+20 1215 1
+20 1216 1
+20 1217 1
+20 1219 1
+20 1220 1
+20 1221 1
+20 1225 1
+20 1226 1
+20 1227 1
+20 1229 1
+20 1230 1
+20 1231 1
+20 1233 1
+20 1234 1
+20 1235 1
+20 1236 1
+20 1240 1
+20 1241 1
+20 1242 1
+20 1244 1
+20 1245 1
+20 1246 1
+20 1248 1
+20 1249 1
+20 1250 1
+20 1251 1
+20 1253 1
+20 1254 1
+21 6 1
+21 13 1
+21 19 1
+21 24 1
+21 28 1
+21 31 1
+21 34 1
+21 35 1
+21 41 1
+21 47 1
+21 52 1
+21 56 1
+21 59 1
+21 62 1
+21 63 1
+21 68 1
+21 73 1
+21 77 1
+21 80 1
+21 83 1
+21 84 1
+21 88 1
+21 92 1
+21 95 1
+21 98 1
+21 99 1
+21 102 1
+21 105 1
+21 108 1
+21 109 1
+21 111 1
+21 114 1
+21 115 1
+21 117 1
+21 118 1
+21 120 1
+21 125 1
+21 131 1
+21 136 1
+21 140 1
+21 143 1
+21 146 1
+21 147 1
+21 152 1
+21 157 1
+21 161 1
+21 164 1
+21 167 1
+21 168 1
+21 172 1
+21 176 1
+21 179 1
+21 182 1
+21 183 1
+21 186 1
+21 189 1
+21 192 1
+21 193 1
+21 195 1
+21 198 1
+21 199 1
+21 201 1
+21 202 1
+21 204 1
+21 208 1
+21 213 1
+21 217 1
+21 220 1
+21 223 1
+21 224 1
+21 228 1
+21 232 1
+21 235 1
+21 238 1
+21 239 1
+21 242 1
+21 245 1
+21 248 1
+21 249 1
+21 251 1
+21 254 1
+21 255 1
+21 257 1
+21 258 1
+21 260 1
+21 263 1
+21 267 1
+21 270 1
+21 273 1
+21 274 1
+21 277 1
+21 280 1
+21 283 1
+21 284 1
+21 286 1
+21 289 1
+21 290 1
+21 292 1
+21 293 1
+21 295 1
+21 297 1
+21 300 1
+21 303 1
+21 304 1
+21 306 1
+21 309 1
+21 310 1
+21 312 1
+21 313 1
+21 315 1
+21 316 1
+21 319 1
+21 320 1
+21 322 1
+21 323 1
+21 325 1
+21 326 1
+21 327 1
+21 329 1
+21 330 1
+21 797 1
+21 803 1
+21 808 1
+21 812 1
+21 815 1
+21 818 1
+21 819 1
+21 824 1
+21 829 1
+21 833 1
+21 836 1
+21 839 1
+21 840 1
+21 844 1
+21 848 1
+21 851 1
+21 854 1
+21 855 1
+21 858 1
+21 861 1
+21 864 1
+21 865 1
+21 867 1
+21 870 1
+21 871 1
+21 873 1
+21 874 1
+21 876 1
+21 880 1
+21 885 1
+21 889 1
+21 892 1
+21 895 1
+21 896 1
+21 900 1
+21 904 1
+21 907 1
+21 910 1
+21 911 1
+21 914 1
+21 917 1
+21 920 1
+21 921 1
+21 923 1
+21 926 1
+21 927 1
+21 929 1
+21 930 1
+21 932 1
+21 935 1
+21 939 1
+21 942 1
+21 945 1
+21 946 1
+21 949 1
+21 952 1
+21 955 1
+21 956 1
+21 958 1
+21 961 1
+21 962 1
+21 964 1
+21 965 1
+21 967 1
+21 969 1
+21 972 1
+21 975 1
+21 976 1
+21 978 1
+21 981 1
+21 982 1
+21 984 1
+21 985 1
+21 987 1
+21 988 1
+21 991 1
+21 992 1
+21 994 1
+21 995 1
+21 997 1
+21 998 1
+21 999 1
+21 1001 1
+21 1002 1
+21 1006 1
+21 1011 1
+21 1015 1
+21 1018 1
+21 1021 1
+21 1022 1
+21 1026 1
+21 1030 1
+21 1033 1
+21 1036 1
+21 1037 1
+21 1040 1
+21 1043 1
+21 1046 1
+21 1047 1
+21 1049 1
+21 1052 1
+21 1053 1
+21 1055 1
+21 1056 1
+21 1058 1
+21 1061 1
+21 1065 1
+21 1068 1
+21 1071 1
+21 1072 1
+21 1075 1
+21 1078 1
+21 1081 1
+21 1082 1
+21 1084 1
+21 1087 1
+21 1088 1
+21 1090 1
+21 1091 1
+21 1093 1
+21 1095 1
+21 1098 1
+21 1101 1
+21 1102 1
+21 1104 1
+21 1107 1
+21 1108 1
+21 1110 1
+21 1111 1
+21 1113 1
+21 1114 1
+21 1117 1
+21 1118 1
+21 1120 1
+21 1121 1
+21 1123 1
+21 1124 1
+21 1125 1
+21 1127 1
+21 1128 1
+21 1131 1
+21 1135 1
+21 1138 1
+21 1141 1
+21 1142 1
+21 1145 1
+21 1148 1
+21 1151 1
+21 1152 1
+21 1154 1
+21 1157 1
+21 1158 1
+21 1160 1
+21 1161 1
+21 1163 1
+21 1165 1
+21 1168 1
+21 1171 1
+21 1172 1
+21 1174 1
+21 1177 1
+21 1178 1
+21 1180 1
+21 1181 1
+21 1183 1
+21 1184 1
+21 1187 1
+21 1188 1
+21 1190 1
+21 1191 1
+21 1193 1
+21 1194 1
+21 1195 1
+21 1197 1
+21 1198 1
+21 1200 1
+21 1203 1
+21 1206 1
+21 1207 1
+21 1209 1
+21 1212 1
+21 1213 1
+21 1215 1
+21 1216 1
+21 1218 1
+21 1219 1
+21 1222 1
+21 1223 1
+21 1225 1
+21 1226 1
+21 1228 1
+21 1229 1
+21 1230 1
+21 1232 1
+21 1233 1
+21 1234 1
+21 1237 1
+21 1238 1
+21 1240 1
+21 1241 1
+21 1243 1
+21 1244 1
+21 1245 1
+21 1247 1
+21 1248 1
+21 1249 1
+21 1250 1
+21 1252 1
+21 1253 1
+21 1254 1
+22 7 1
+22 14 1
+22 20 1
+22 25 1
+22 29 1
+22 32 1
+22 34 1
+22 36 1
+22 42 1
+22 48 1
+22 53 1
+22 57 1
+22 60 1
+22 62 1
+22 64 1
+22 69 1
+22 74 1
+22 78 1
+22 81 1
+22 83 1
+22 85 1
+22 89 1
+22 93 1
+22 96 1
+22 98 1
+22 100 1
+22 103 1
+22 106 1
+22 108 1
+22 110 1
+22 112 1
+22 114 1
+22 116 1
+22 117 1
+22 119 1
+22 120 1
+22 126 1
+22 132 1
+22 137 1
+22 141 1
+22 144 1
+22 146 1
+22 148 1
+22 153 1
+22 158 1
+22 162 1
+22 165 1
+22 167 1
+22 169 1
+22 173 1
+22 177 1
+22 180 1
+22 182 1
+22 184 1
+22 187 1
+22 190 1
+22 192 1
+22 194 1
+22 196 1
+22 198 1
+22 200 1
+22 201 1
+22 203 1
+22 204 1
+22 209 1
+22 214 1
+22 218 1
+22 221 1
+22 223 1
+22 225 1
+22 229 1
+22 233 1
+22 236 1
+22 238 1
+22 240 1
+22 243 1
+22 246 1
+22 248 1
+22 250 1
+22 252 1
+22 254 1
+22 256 1
+22 257 1
+22 259 1
+22 260 1
+22 264 1
+22 268 1
+22 271 1
+22 273 1
+22 275 1
+22 278 1
+22 281 1
+22 283 1
+22 285 1
+22 287 1
+22 289 1
+22 291 1
+22 292 1
+22 294 1
+22 295 1
+22 298 1
+22 301 1
+22 303 1
+22 305 1
+22 307 1
+22 309 1
+22 311 1
+22 312 1
+22 314 1
+22 315 1
+22 317 1
+22 319 1
+22 321 1
+22 322 1
+22 324 1
+22 325 1
+22 326 1
+22 328 1
+22 329 1
+22 330 1
+22 798 1
+22 804 1
+22 809 1
+22 813 1
+22 816 1
+22 818 1
+22 820 1
+22 825 1
+22 830 1
+22 834 1
+22 837 1
+22 839 1
+22 841 1
+22 845 1
+22 849 1
+22 852 1
+22 854 1
+22 856 1
+22 859 1
+22 862 1
+22 864 1
+22 866 1
+22 868 1
+22 870 1
+22 872 1
+22 873 1
+22 875 1
+22 876 1
+22 881 1
+22 886 1
+22 890 1
+22 893 1
+22 895 1
+22 897 1
+22 901 1
+22 905 1
+22 908 1
+22 910 1
+22 912 1
+22 915 1
+22 918 1
+22 920 1
+22 922 1
+22 924 1
+22 926 1
+22 928 1
+22 929 1
+22 931 1
+22 932 1
+22 936 1
+22 940 1
+22 943 1
+22 945 1
+22 947 1
+22 950 1
+22 953 1
+22 955 1
+22 957 1
+22 959 1
+22 961 1
+22 963 1
+22 964 1
+22 966 1
+22 967 1
+22 970 1
+22 973 1
+22 975 1
+22 977 1
+22 979 1
+22 981 1
+22 983 1
+22 984 1
+22 986 1
+22 987 1
+22 989 1
+22 991 1
+22 993 1
+22 994 1
+22 996 1
+22 997 1
+22 998 1
+22 1000 1
+22 1001 1
+22 1002 1
+22 1007 1
+22 1012 1
+22 1016 1
+22 1019 1
+22 1021 1
+22 1023 1
+22 1027 1
+22 1031 1
+22 1034 1
+22 1036 1
+22 1038 1
+22 1041 1
+22 1044 1
+22 1046 1
+22 1048 1
+22 1050 1
+22 1052 1
+22 1054 1
+22 1055 1
+22 1057 1
+22 1058 1
+22 1062 1
+22 1066 1
+22 1069 1
+22 1071 1
+22 1073 1
+22 1076 1
+22 1079 1
+22 1081 1
+22 1083 1
+22 1085 1
+22 1087 1
+22 1089 1
+22 1090 1
+22 1092 1
+22 1093 1
+22 1096 1
+22 1099 1
+22 1101 1
+22 1103 1
+22 1105 1
+22 1107 1
+22 1109 1
+22 1110 1
+22 1112 1
+22 1113 1
+22 1115 1
+22 1117 1
+22 1119 1
+22 1120 1
+22 1122 1
+22 1123 1
+22 1124 1
+22 1126 1
+22 1127 1
+22 1128 1
+22 1132 1
+22 1136 1
+22 1139 1
+22 1141 1
+22 1143 1
+22 1146 1
+22 1149 1
+22 1151 1
+22 1153 1
+22 1155 1
+22 1157 1
+22 1159 1
+22 1160 1
+22 1162 1
+22 1163 1
+22 1166 1
+22 1169 1
+22 1171 1
+22 1173 1
+22 1175 1
+22 1177 1
+22 1179 1
+22 1180 1
+22 1182 1
+22 1183 1
+22 1185 1
+22 1187 1
+22 1189 1
+22 1190 1
+22 1192 1
+22 1193 1
+22 1194 1
+22 1196 1
+22 1197 1
+22 1198 1
+22 1201 1
+22 1204 1
+22 1206 1
+22 1208 1
+22 1210 1
+22 1212 1
+22 1214 1
+22 1215 1
+22 1217 1
+22 1218 1
+22 1220 1
+22 1222 1
+22 1224 1
+22 1225 1
+22 1227 1
+22 1228 1
+22 1229 1
+22 1231 1
+22 1232 1
+22 1233 1
+22 1235 1
+22 1237 1
+22 1239 1
+22 1240 1
+22 1242 1
+22 1243 1
+22 1244 1
+22 1246 1
+22 1247 1
+22 1248 1
+22 1249 1
+22 1251 1
+22 1252 1
+22 1253 1
+22 1254 1
+23 8 1
+23 15 1
+23 21 1
+23 26 1
+23 30 1
+23 33 1
+23 35 1
+23 36 1
+23 43 1
+23 49 1
+23 54 1
+23 58 1
+23 61 1
+23 63 1
+23 64 1
+23 70 1
+23 75 1
+23 79 1
+23 82 1
+23 84 1
+23 85 1
+23 90 1
+23 94 1
+23 97 1
+23 99 1
+23 100 1
+23 104 1
+23 107 1
+23 109 1
+23 110 1
+23 113 1
+23 115 1
+23 116 1
+23 118 1
+23 119 1
+23 120 1
+23 127 1
+23 133 1
+23 138 1
+23 142 1
+23 145 1
+23 147 1
+23 148 1
+23 154 1
+23 159 1
+23 163 1
+23 166 1
+23 168 1
+23 169 1
+23 174 1
+23 178 1
+23 181 1
+23 183 1
+23 184 1
+23 188 1
+23 191 1
+23 193 1
+23 194 1
+23 197 1
+23 199 1
+23 200 1
+23 202 1
+23 203 1
+23 204 1
+23 210 1
+23 215 1
+23 219 1
+23 222 1
+23 224 1
+23 225 1
+23 230 1
+23 234 1
+23 237 1
+23 239 1
+23 240 1
+23 244 1
+23 247 1
+23 249 1
+23 250 1
+23 253 1
+23 255 1
+23 256 1
+23 258 1
+23 259 1
+23 260 1
+23 265 1
+23 269 1
+23 272 1
+23 274 1
+23 275 1
+23 279 1
+23 282 1
+23 284 1
+23 285 1
+23 288 1
+23 290 1
+23 291 1
+23 293 1
+23 294 1
+23 295 1
+23 299 1
+23 302 1
+23 304 1
+23 305 1
+23 308 1
+23 310 1
+23 311 1
+23 313 1
+23 314 1
+23 315 1
+23 318 1
+23 320 1
+23 321 1
+23 323 1
+23 324 1
+23 325 1
+23 327 1
+23 328 1
+23 329 1
+23 330 1
+23 799 1
+23 805 1
+23 810 1
+23 814 1
+23 817 1
+23 819 1
+23 820 1
+23 826 1
+23 831 1
+23 835 1
+23 838 1
+23 840 1
+23 841 1
+23 846 1
+23 850 1
+23 853 1
+23 855 1
+23 856 1
+23 860 1
+23 863 1
+23 865 1
+23 866 1
+23 869 1
+23 871 1
+23 872 1
+23 874 1
+23 875 1
+23 876 1
+23 882 1
+23 887 1
+23 891 1
+23 894 1
+23 896 1
+23 897 1
+23 902 1
+23 906 1
+23 909 1
+23 911 1
+23 912 1
+23 916 1
+23 919 1
+23 921 1
+23 922 1
+23 925 1
+23 927 1
+23 928 1
+23 930 1
+23 931 1
+23 932 1
+23 937 1
+23 941 1
+23 944 1
+23 946 1
+23 947 1
+23 951 1
+23 954 1
+23 956 1
+23 957 1
+23 960 1
+23 962 1
+23 963 1
+23 965 1
+23 966 1
+23 967 1
+23 971 1
+23 974 1
+23 976 1
+23 977 1
+23 980 1
+23 982 1
+23 983 1
+23 985 1
+23 986 1
+23 987 1
+23 990 1
+23 992 1
+23 993 1
+23 995 1
+23 996 1
+23 997 1
+23 999 1
+23 1000 1
+23 1001 1
+23 1002 1
+23 1008 1
+23 1013 1
+23 1017 1
+23 1020 1
+23 1022 1
+23 1023 1
+23 1028 1
+23 1032 1
+23 1035 1
+23 1037 1
+23 1038 1
+23 1042 1
+23 1045 1
+23 1047 1
+23 1048 1
+23 1051 1
+23 1053 1
+23 1054 1
+23 1056 1
+23 1057 1
+23 1058 1
+23 1063 1
+23 1067 1
+23 1070 1
+23 1072 1
+23 1073 1
+23 1077 1
+23 1080 1
+23 1082 1
+23 1083 1
+23 1086 1
+23 1088 1
+23 1089 1
+23 1091 1
+23 1092 1
+23 1093 1
+23 1097 1
+23 1100 1
+23 1102 1
+23 1103 1
+23 1106 1
+23 1108 1
+23 1109 1
+23 1111 1
+23 1112 1
+23 1113 1
+23 1116 1
+23 1118 1
+23 1119 1
+23 1121 1
+23 1122 1
+23 1123 1
+23 1125 1
+23 1126 1
+23 1127 1
+23 1128 1
+23 1133 1
+23 1137 1
+23 1140 1
+23 1142 1
+23 1143 1
+23 1147 1
+23 1150 1
+23 1152 1
+23 1153 1
+23 1156 1
+23 1158 1
+23 1159 1
+23 1161 1
+23 1162 1
+23 1163 1
+23 1167 1
+23 1170 1
+23 1172 1
+23 1173 1
+23 1176 1
+23 1178 1
+23 1179 1
+23 1181 1
+23 1182 1
+23 1183 1
+23 1186 1
+23 1188 1
+23 1189 1
+23 1191 1
+23 1192 1
+23 1193 1
+23 1195 1
+23 1196 1
+23 1197 1
+23 1198 1
+23 1202 1
+23 1205 1
+23 1207 1
+23 1208 1
+23 1211 1
+23 1213 1
+23 1214 1
+23 1216 1
+23 1217 1
+23 1218 1
+23 1221 1
+23 1223 1
+23 1224 1
+23 1226 1
+23 1227 1
+23 1228 1
+23 1230 1
+23 1231 1
+23 1232 1
+23 1233 1
+23 1236 1
+23 1238 1
+23 1239 1
+23 1241 1
+23 1242 1
+23 1243 1
+23 1245 1
+23 1246 1
+23 1247 1
+23 1248 1
+23 1250 1
+23 1251 1
+23 1252 1
+23 1253 1
+23 1254 1
+24 1 1
+24 2 1
+24 3 1
+24 4 1
+24 5 1
+24 6 1
+24 7 1
+24 8 1
+24 9 1
+24 10 1
+24 11 1
+24 12 1
+24 13 1
+24 14 1
+24 15 1
+24 16 1
+24 17 1
+24 18 1
+24 19 1
+24 20 1
+24 21 1
+24 22 1
+24 23 1
+24 24 1
+24 25 1
+24 26 1
+24 27 1
+24 28 1
+24 29 1
+24 30 1
+24 31 1
+24 32 1
+24 33 1
+24 34 1
+24 35 1
+24 36 1
+24 331 1
+24 332 1
+24 333 1
+24 334 1
+24 335 1
+24 336 1
+24 337 1
+24 338 1
+24 339 1
+24 340 1
+24 341 1
+24 342 1
+24 343 1
+24 344 1
+24 345 1
+24 346 1
+24 347 1
+24 348 1
+24 349 1
+24 350 1
+24 351 1
+24 352 1
+24 353 1
+24 354 1
+24 355 1
+24 356 1
+24 357 1
+24 358 1
+24 359 1
+24 360 1
+24 361 1
+24 362 1
+24 363 1
+24 364 1
+24 365 1
+24 366 1
+24 367 1
+24 368 1
+24 369 1
+24 370 1
+24 371 1
+24 372 1
+24 373 1
+24 374 1
+24 375 1
+24 376 1
+24 377 1
+24 378 1
+24 379 1
+24 380 1
+24 381 1
+24 382 1
+24 383 1
+24 384 1
+24 385 1
+24 386 1
+24 387 1
+24 388 1
+24 389 1
+24 390 1
+24 391 1
+24 392 1
+24 393 1
+24 394 1
+24 395 1
+24 396 1
+24 397 1
+24 398 1
+24 399 1
+24 400 1
+24 401 1
+24 402 1
+24 403 1
+24 404 1
+24 405 1
+24 406 1
+24 407 1
+24 408 1
+24 409 1
+24 410 1
+24 411 1
+24 412 1
+24 413 1
+24 414 1
+24 793 1
+24 794 1
+24 795 1
+24 796 1
+24 797 1
+24 798 1
+24 799 1
+24 800 1
+24 801 1
+24 802 1
+24 803 1
+24 804 1
+24 805 1
+24 806 1
+24 807 1
+24 808 1
+24 809 1
+24 810 1
+24 811 1
+24 812 1
+24 813 1
+24 814 1
+24 815 1
+24 816 1
+24 817 1
+24 818 1
+24 819 1
+24 820 1
+24 821 1
+24 822 1
+24 823 1
+24 824 1
+24 825 1
+24 826 1
+24 827 1
+24 828 1
+24 829 1
+24 830 1
+24 831 1
+24 832 1
+24 833 1
+24 834 1
+24 835 1
+24 836 1
+24 837 1
+24 838 1
+24 839 1
+24 840 1
+24 841 1
+24 842 1
+24 843 1
+24 844 1
+24 845 1
+24 846 1
+24 847 1
+24 848 1
+24 849 1
+24 850 1
+24 851 1
+24 852 1
+24 853 1
+24 854 1
+24 855 1
+24 856 1
+24 857 1
+24 858 1
+24 859 1
+24 860 1
+24 861 1
+24 862 1
+24 863 1
+24 864 1
+24 865 1
+24 866 1
+24 867 1
+24 868 1
+24 869 1
+24 870 1
+24 871 1
+24 872 1
+24 873 1
+24 874 1
+24 875 1
+24 876 1
+24 1255 1
+24 1256 1
+24 1257 1
+24 1258 1
+24 1259 1
+24 1260 1
+24 1261 1
+24 1262 1
+24 1263 1
+24 1264 1
+24 1265 1
+24 1266 1
+24 1267 1
+24 1268 1
+24 1269 1
+24 1270 1
+24 1271 1
+24 1272 1
+24 1273 1
+24 1274 1
+24 1275 1
+24 1276 1
+24 1277 1
+24 1278 1
+24 1279 1
+24 1280 1
+24 1281 1
+24 1282 1
+24 1283 1
+24 1284 1
+24 1285 1
+24 1286 1
+24 1287 1
+24 1288 1
+24 1289 1
+24 1290 1
+24 1291 1
+24 1292 1
+24 1293 1
+24 1294 1
+24 1295 1
+24 1296 1
+24 1297 1
+24 1298 1
+24 1299 1
+24 1300 1
+24 1301 1
+24 1302 1
+24 1303 1
+24 1304 1
+24 1305 1
+24 1306 1
+24 1307 1
+24 1308 1
+24 1309 1
+24 1310 1
+24 1311 1
+24 1312 1
+24 1313 1
+24 1314 1
+24 1315 1
+24 1316 1
+24 1317 1
+24 1318 1
+24 1319 1
+24 1320 1
+24 1321 1
+24 1322 1
+24 1323 1
+24 1324 1
+24 1325 1
+24 1326 1
+24 1327 1
+24 1328 1
+24 1329 1
+24 1330 1
+24 1331 1
+24 1332 1
+24 1333 1
+24 1334 1
+24 1335 1
+24 1336 1
+24 1337 1
+24 1338 1
+24 1339 1
+24 1340 1
+24 1341 1
+24 1342 1
+24 1343 1
+24 1344 1
+24 1345 1
+24 1346 1
+24 1347 1
+24 1348 1
+24 1349 1
+24 1350 1
+24 1351 1
+24 1352 1
+24 1353 1
+24 1354 1
+24 1355 1
+24 1356 1
+24 1357 1
+24 1358 1
+24 1359 1
+24 1360 1
+24 1361 1
+24 1362 1
+24 1363 1
+24 1364 1
+24 1365 1
+24 1366 1
+24 1367 1
+24 1368 1
+24 1369 1
+24 1370 1
+24 1371 1
+24 1372 1
+24 1373 1
+24 1374 1
+24 1375 1
+24 1376 1
+24 1377 1
+24 1378 1
+24 1379 1
+24 1380 1
+25 1 1
+25 2 1
+25 3 1
+25 4 1
+25 5 1
+25 6 1
+25 7 1
+25 8 1
+25 37 1
+25 38 1
+25 39 1
+25 40 1
+25 41 1
+25 42 1
+25 43 1
+25 44 1
+25 45 1
+25 46 1
+25 47 1
+25 48 1
+25 49 1
+25 50 1
+25 51 1
+25 52 1
+25 53 1
+25 54 1
+25 55 1
+25 56 1
+25 57 1
+25 58 1
+25 59 1
+25 60 1
+25 61 1
+25 62 1
+25 63 1
+25 64 1
+25 331 1
+25 332 1
+25 333 1
+25 334 1
+25 335 1
+25 336 1
+25 337 1
+25 338 1
+25 339 1
+25 340 1
+25 341 1
+25 342 1
+25 343 1
+25 344 1
+25 345 1
+25 346 1
+25 347 1
+25 348 1
+25 349 1
+25 350 1
+25 351 1
+25 352 1
+25 353 1
+25 354 1
+25 355 1
+25 356 1
+25 357 1
+25 358 1
+25 415 1
+25 416 1
+25 417 1
+25 418 1
+25 419 1
+25 420 1
+25 421 1
+25 422 1
+25 423 1
+25 424 1
+25 425 1
+25 426 1
+25 427 1
+25 428 1
+25 429 1
+25 430 1
+25 431 1
+25 432 1
+25 433 1
+25 434 1
+25 435 1
+25 436 1
+25 437 1
+25 438 1
+25 439 1
+25 440 1
+25 441 1
+25 442 1
+25 443 1
+25 444 1
+25 445 1
+25 446 1
+25 447 1
+25 448 1
+25 449 1
+25 450 1
+25 451 1
+25 452 1
+25 453 1
+25 454 1
+25 455 1
+25 456 1
+25 457 1
+25 458 1
+25 459 1
+25 460 1
+25 461 1
+25 462 1
+25 463 1
+25 464 1
+25 465 1
+25 466 1
+25 467 1
+25 468 1
+25 469 1
+25 470 1
+25 793 1
+25 794 1
+25 795 1
+25 796 1
+25 797 1
+25 798 1
+25 799 1
+25 800 1
+25 801 1
+25 802 1
+25 803 1
+25 804 1
+25 805 1
+25 806 1
+25 807 1
+25 808 1
+25 809 1
+25 810 1
+25 811 1
+25 812 1
+25 813 1
+25 814 1
+25 815 1
+25 816 1
+25 817 1
+25 818 1
+25 819 1
+25 820 1
+25 877 1
+25 878 1
+25 879 1
+25 880 1
+25 881 1
+25 882 1
+25 883 1
+25 884 1
+25 885 1
+25 886 1
+25 887 1
+25 888 1
+25 889 1
+25 890 1
+25 891 1
+25 892 1
+25 893 1
+25 894 1
+25 895 1
+25 896 1
+25 897 1
+25 898 1
+25 899 1
+25 900 1
+25 901 1
+25 902 1
+25 903 1
+25 904 1
+25 905 1
+25 906 1
+25 907 1
+25 908 1
+25 909 1
+25 910 1
+25 911 1
+25 912 1
+25 913 1
+25 914 1
+25 915 1
+25 916 1
+25 917 1
+25 918 1
+25 919 1
+25 920 1
+25 921 1
+25 922 1
+25 923 1
+25 924 1
+25 925 1
+25 926 1
+25 927 1
+25 928 1
+25 929 1
+25 930 1
+25 931 1
+25 932 1
+25 1255 1
+25 1256 1
+25 1257 1
+25 1258 1
+25 1259 1
+25 1260 1
+25 1261 1
+25 1262 1
+25 1263 1
+25 1264 1
+25 1265 1
+25 1266 1
+25 1267 1
+25 1268 1
+25 1269 1
+25 1270 1
+25 1271 1
+25 1272 1
+25 1273 1
+25 1274 1
+25 1275 1
+25 1276 1
+25 1277 1
+25 1278 1
+25 1279 1
+25 1280 1
+25 1281 1
+25 1282 1
+25 1283 1
+25 1284 1
+25 1285 1
+25 1286 1
+25 1287 1
+25 1288 1
+25 1289 1
+25 1290 1
+25 1291 1
+25 1292 1
+25 1293 1
+25 1294 1
+25 1295 1
+25 1296 1
+25 1297 1
+25 1298 1
+25 1299 1
+25 1300 1
+25 1301 1
+25 1302 1
+25 1303 1
+25 1304 1
+25 1305 1
+25 1306 1
+25 1307 1
+25 1308 1
+25 1309 1
+25 1310 1
+25 1381 1
+25 1382 1
+25 1383 1
+25 1384 1
+25 1385 1
+25 1386 1
+25 1387 1
+25 1388 1
+25 1389 1
+25 1390 1
+25 1391 1
+25 1392 1
+25 1393 1
+25 1394 1
+25 1395 1
+25 1396 1
+25 1397 1
+25 1398 1
+25 1399 1
+25 1400 1
+25 1401 1
+25 1402 1
+25 1403 1
+25 1404 1
+25 1405 1
+25 1406 1
+25 1407 1
+25 1408 1
+25 1409 1
+25 1410 1
+25 1411 1
+25 1412 1
+25 1413 1
+25 1414 1
+25 1415 1
+25 1416 1
+25 1417 1
+25 1418 1
+25 1419 1
+25 1420 1
+25 1421 1
+25 1422 1
+25 1423 1
+25 1424 1
+25 1425 1
+25 1426 1
+25 1427 1
+25 1428 1
+25 1429 1
+25 1430 1
+25 1431 1
+25 1432 1
+25 1433 1
+25 1434 1
+25 1435 1
+25 1436 1
+25 1437 1
+25 1438 1
+25 1439 1
+25 1440 1
+25 1441 1
+25 1442 1
+25 1443 1
+25 1444 1
+25 1445 1
+25 1446 1
+25 1447 1
+25 1448 1
+25 1449 1
+25 1450 1
+26 1 1
+26 9 1
+26 10 1
+26 11 1
+26 12 1
+26 13 1
+26 14 1
+26 15 1
+26 37 1
+26 38 1
+26 39 1
+26 40 1
+26 41 1
+26 42 1
+26 43 1
+26 65 1
+26 66 1
+26 67 1
+26 68 1
+26 69 1
+26 70 1
+26 71 1
+26 72 1
+26 73 1
+26 74 1
+26 75 1
+26 76 1
+26 77 1
+26 78 1
+26 79 1
+26 80 1
+26 81 1
+26 82 1
+26 83 1
+26 84 1
+26 85 1
+26 331 1
+26 332 1
+26 333 1
+26 334 1
+26 335 1
+26 336 1
+26 337 1
+26 359 1
+26 360 1
+26 361 1
+26 362 1
+26 363 1
+26 364 1
+26 365 1
+26 366 1
+26 367 1
+26 368 1
+26 369 1
+26 370 1
+26 371 1
+26 372 1
+26 373 1
+26 374 1
+26 375 1
+26 376 1
+26 377 1
+26 378 1
+26 379 1
+26 415 1
+26 416 1
+26 417 1
+26 418 1
+26 419 1
+26 420 1
+26 421 1
+26 422 1
+26 423 1
+26 424 1
+26 425 1
+26 426 1
+26 427 1
+26 428 1
+26 429 1
+26 430 1
+26 431 1
+26 432 1
+26 433 1
+26 434 1
+26 435 1
+26 471 1
+26 472 1
+26 473 1
+26 474 1
+26 475 1
+26 476 1
+26 477 1
+26 478 1
+26 479 1
+26 480 1
+26 481 1
+26 482 1
+26 483 1
+26 484 1
+26 485 1
+26 486 1
+26 487 1
+26 488 1
+26 489 1
+26 490 1
+26 491 1
+26 492 1
+26 493 1
+26 494 1
+26 495 1
+26 496 1
+26 497 1
+26 498 1
+26 499 1
+26 500 1
+26 501 1
+26 502 1
+26 503 1
+26 504 1
+26 505 1
+26 793 1
+26 794 1
+26 795 1
+26 796 1
+26 797 1
+26 798 1
+26 799 1
+26 821 1
+26 822 1
+26 823 1
+26 824 1
+26 825 1
+26 826 1
+26 827 1
+26 828 1
+26 829 1
+26 830 1
+26 831 1
+26 832 1
+26 833 1
+26 834 1
+26 835 1
+26 836 1
+26 837 1
+26 838 1
+26 839 1
+26 840 1
+26 841 1
+26 877 1
+26 878 1
+26 879 1
+26 880 1
+26 881 1
+26 882 1
+26 883 1
+26 884 1
+26 885 1
+26 886 1
+26 887 1
+26 888 1
+26 889 1
+26 890 1
+26 891 1
+26 892 1
+26 893 1
+26 894 1
+26 895 1
+26 896 1
+26 897 1
+26 933 1
+26 934 1
+26 935 1
+26 936 1
+26 937 1
+26 938 1
+26 939 1
+26 940 1
+26 941 1
+26 942 1
+26 943 1
+26 944 1
+26 945 1
+26 946 1
+26 947 1
+26 948 1
+26 949 1
+26 950 1
+26 951 1
+26 952 1
+26 953 1
+26 954 1
+26 955 1
+26 956 1
+26 957 1
+26 958 1
+26 959 1
+26 960 1
+26 961 1
+26 962 1
+26 963 1
+26 964 1
+26 965 1
+26 966 1
+26 967 1
+26 1255 1
+26 1256 1
+26 1257 1
+26 1258 1
+26 1259 1
+26 1260 1
+26 1261 1
+26 1262 1
+26 1263 1
+26 1264 1
+26 1265 1
+26 1266 1
+26 1267 1
+26 1268 1
+26 1269 1
+26 1270 1
+26 1271 1
+26 1272 1
+26 1273 1
+26 1274 1
+26 1275 1
+26 1311 1
+26 1312 1
+26 1313 1
+26 1314 1
+26 1315 1
+26 1316 1
+26 1317 1
+26 1318 1
+26 1319 1
+26 1320 1
+26 1321 1
+26 1322 1
+26 1323 1
+26 1324 1
+26 1325 1
+26 1326 1
+26 1327 1
+26 1328 1
+26 1329 1
+26 1330 1
+26 1331 1
+26 1332 1
+26 1333 1
+26 1334 1
+26 1335 1
+26 1336 1
+26 1337 1
+26 1338 1
+26 1339 1
+26 1340 1
+26 1341 1
+26 1342 1
+26 1343 1
+26 1344 1
+26 1345 1
+26 1381 1
+26 1382 1
+26 1383 1
+26 1384 1
+26 1385 1
+26 1386 1
+26 1387 1
+26 1388 1
+26 1389 1
+26 1390 1
+26 1391 1
+26 1392 1
+26 1393 1
+26 1394 1
+26 1395 1
+26 1396 1
+26 1397 1
+26 1398 1
+26 1399 1
+26 1400 1
+26 1401 1
+26 1402 1
+26 1403 1
+26 1404 1
+26 1405 1
+26 1406 1
+26 1407 1
+26 1408 1
+26 1409 1
+26 1410 1
+26 1411 1
+26 1412 1
+26 1413 1
+26 1414 1
+26 1415 1
+26 1451 1
+26 1452 1
+26 1453 1
+26 1454 1
+26 1455 1
+26 1456 1
+26 1457 1
+26 1458 1
+26 1459 1
+26 1460 1
+26 1461 1
+26 1462 1
+26 1463 1
+26 1464 1
+26 1465 1
+26 1466 1
+26 1467 1
+26 1468 1
+26 1469 1
+26 1470 1
+26 1471 1
+26 1472 1
+26 1473 1
+26 1474 1
+26 1475 1
+26 1476 1
+26 1477 1
+26 1478 1
+26 1479 1
+26 1480 1
+26 1481 1
+26 1482 1
+26 1483 1
+26 1484 1
+26 1485 1
+27 2 1
+27 9 1
+27 16 1
+27 17 1
+27 18 1
+27 19 1
+27 20 1
+27 21 1
+27 37 1
+27 44 1
+27 45 1
+27 46 1
+27 47 1
+27 48 1
+27 49 1
+27 65 1
+27 66 1
+27 67 1
+27 68 1
+27 69 1
+27 70 1
+27 86 1
+27 87 1
+27 88 1
+27 89 1
+27 90 1
+27 91 1
+27 92 1
+27 93 1
+27 94 1
+27 95 1
+27 96 1
+27 97 1
+27 98 1
+27 99 1
+27 100 1
+27 331 1
+27 338 1
+27 339 1
+27 340 1
+27 341 1
+27 342 1
+27 343 1
+27 359 1
+27 360 1
+27 361 1
+27 362 1
+27 363 1
+27 364 1
+27 380 1
+27 381 1
+27 382 1
+27 383 1
+27 384 1
+27 385 1
+27 386 1
+27 387 1
+27 388 1
+27 389 1
+27 390 1
+27 391 1
+27 392 1
+27 393 1
+27 394 1
+27 415 1
+27 416 1
+27 417 1
+27 418 1
+27 419 1
+27 420 1
+27 436 1
+27 437 1
+27 438 1
+27 439 1
+27 440 1
+27 441 1
+27 442 1
+27 443 1
+27 444 1
+27 445 1
+27 446 1
+27 447 1
+27 448 1
+27 449 1
+27 450 1
+27 471 1
+27 472 1
+27 473 1
+27 474 1
+27 475 1
+27 476 1
+27 477 1
+27 478 1
+27 479 1
+27 480 1
+27 481 1
+27 482 1
+27 483 1
+27 484 1
+27 485 1
+27 506 1
+27 507 1
+27 508 1
+27 509 1
+27 510 1
+27 511 1
+27 512 1
+27 513 1
+27 514 1
+27 515 1
+27 516 1
+27 517 1
+27 518 1
+27 519 1
+27 520 1
+27 521 1
+27 522 1
+27 523 1
+27 524 1
+27 525 1
+27 793 1
+27 800 1
+27 801 1
+27 802 1
+27 803 1
+27 804 1
+27 805 1
+27 821 1
+27 822 1
+27 823 1
+27 824 1
+27 825 1
+27 826 1
+27 842 1
+27 843 1
+27 844 1
+27 845 1
+27 846 1
+27 847 1
+27 848 1
+27 849 1
+27 850 1
+27 851 1
+27 852 1
+27 853 1
+27 854 1
+27 855 1
+27 856 1
+27 877 1
+27 878 1
+27 879 1
+27 880 1
+27 881 1
+27 882 1
+27 898 1
+27 899 1
+27 900 1
+27 901 1
+27 902 1
+27 903 1
+27 904 1
+27 905 1
+27 906 1
+27 907 1
+27 908 1
+27 909 1
+27 910 1
+27 911 1
+27 912 1
+27 933 1
+27 934 1
+27 935 1
+27 936 1
+27 937 1
+27 938 1
+27 939 1
+27 940 1
+27 941 1
+27 942 1
+27 943 1
+27 944 1
+27 945 1
+27 946 1
+27 947 1
+27 968 1
+27 969 1
+27 970 1
+27 971 1
+27 972 1
+27 973 1
+27 974 1
+27 975 1
+27 976 1
+27 977 1
+27 978 1
+27 979 1
+27 980 1
+27 981 1
+27 982 1
+27 983 1
+27 984 1
+27 985 1
+27 986 1
+27 987 1
+27 1255 1
+27 1256 1
+27 1257 1
+27 1258 1
+27 1259 1
+27 1260 1
+27 1276 1
+27 1277 1
+27 1278 1
+27 1279 1
+27 1280 1
+27 1281 1
+27 1282 1
+27 1283 1
+27 1284 1
+27 1285 1
+27 1286 1
+27 1287 1
+27 1288 1
+27 1289 1
+27 1290 1
+27 1311 1
+27 1312 1
+27 1313 1
+27 1314 1
+27 1315 1
+27 1316 1
+27 1317 1
+27 1318 1
+27 1319 1
+27 1320 1
+27 1321 1
+27 1322 1
+27 1323 1
+27 1324 1
+27 1325 1
+27 1346 1
+27 1347 1
+27 1348 1
+27 1349 1
+27 1350 1
+27 1351 1
+27 1352 1
+27 1353 1
+27 1354 1
+27 1355 1
+27 1356 1
+27 1357 1
+27 1358 1
+27 1359 1
+27 1360 1
+27 1361 1
+27 1362 1
+27 1363 1
+27 1364 1
+27 1365 1
+27 1381 1
+27 1382 1
+27 1383 1
+27 1384 1
+27 1385 1
+27 1386 1
+27 1387 1
+27 1388 1
+27 1389 1
+27 1390 1
+27 1391 1
+27 1392 1
+27 1393 1
+27 1394 1
+27 1395 1
+27 1416 1
+27 1417 1
+27 1418 1
+27 1419 1
+27 1420 1
+27 1421 1
+27 1422 1
+27 1423 1
+27 1424 1
+27 1425 1
+27 1426 1
+27 1427 1
+27 1428 1
+27 1429 1
+27 1430 1
+27 1431 1
+27 1432 1
+27 1433 1
+27 1434 1
+27 1435 1
+27 1451 1
+27 1452 1
+27 1453 1
+27 1454 1
+27 1455 1
+27 1456 1
+27 1457 1
+27 1458 1
+27 1459 1
+27 1460 1
+27 1461 1
+27 1462 1
+27 1463 1
+27 1464 1
+27 1465 1
+27 1466 1
+27 1467 1
+27 1468 1
+27 1469 1
+27 1470 1
+27 1486 1
+27 1487 1
+27 1488 1
+27 1489 1
+27 1490 1
+27 1491 1
+27 1492 1
+27 1493 1
+27 1494 1
+27 1495 1
+27 1496 1
+27 1497 1
+27 1498 1
+27 1499 1
+27 1500 1
+28 3 1
+28 10 1
+28 16 1
+28 22 1
+28 23 1
+28 24 1
+28 25 1
+28 26 1
+28 38 1
+28 44 1
+28 50 1
+28 51 1
+28 52 1
+28 53 1
+28 54 1
+28 65 1
+28 71 1
+28 72 1
+28 73 1
+28 74 1
+28 75 1
+28 86 1
+28 87 1
+28 88 1
+28 89 1
+28 90 1
+28 101 1
+28 102 1
+28 103 1
+28 104 1
+28 105 1
+28 106 1
+28 107 1
+28 108 1
+28 109 1
+28 110 1
+28 332 1
+28 338 1
+28 344 1
+28 345 1
+28 346 1
+28 347 1
+28 348 1
+28 359 1
+28 365 1
+28 366 1
+28 367 1
+28 368 1
+28 369 1
+28 380 1
+28 381 1
+28 382 1
+28 383 1
+28 384 1
+28 395 1
+28 396 1
+28 397 1
+28 398 1
+28 399 1
+28 400 1
+28 401 1
+28 402 1
+28 403 1
+28 404 1
+28 415 1
+28 421 1
+28 422 1
+28 423 1
+28 424 1
+28 425 1
+28 436 1
+28 437 1
+28 438 1
+28 439 1
+28 440 1
+28 451 1
+28 452 1
+28 453 1
+28 454 1
+28 455 1
+28 456 1
+28 457 1
+28 458 1
+28 459 1
+28 460 1
+28 471 1
+28 472 1
+28 473 1
+28 474 1
+28 475 1
+28 486 1
+28 487 1
+28 488 1
+28 489 1
+28 490 1
+28 491 1
+28 492 1
+28 493 1
+28 494 1
+28 495 1
+28 506 1
+28 507 1
+28 508 1
+28 509 1
+28 510 1
+28 511 1
+28 512 1
+28 513 1
+28 514 1
+28 515 1
+28 526 1
+28 527 1
+28 528 1
+28 529 1
+28 530 1
+28 531 1
+28 532 1
+28 533 1
+28 534 1
+28 535 1
+28 794 1
+28 800 1
+28 806 1
+28 807 1
+28 808 1
+28 809 1
+28 810 1
+28 821 1
+28 827 1
+28 828 1
+28 829 1
+28 830 1
+28 831 1
+28 842 1
+28 843 1
+28 844 1
+28 845 1
+28 846 1
+28 857 1
+28 858 1
+28 859 1
+28 860 1
+28 861 1
+28 862 1
+28 863 1
+28 864 1
+28 865 1
+28 866 1
+28 877 1
+28 883 1
+28 884 1
+28 885 1
+28 886 1
+28 887 1
+28 898 1
+28 899 1
+28 900 1
+28 901 1
+28 902 1
+28 913 1
+28 914 1
+28 915 1
+28 916 1
+28 917 1
+28 918 1
+28 919 1
+28 920 1
+28 921 1
+28 922 1
+28 933 1
+28 934 1
+28 935 1
+28 936 1
+28 937 1
+28 948 1
+28 949 1
+28 950 1
+28 951 1
+28 952 1
+28 953 1
+28 954 1
+28 955 1
+28 956 1
+28 957 1
+28 968 1
+28 969 1
+28 970 1
+28 971 1
+28 972 1
+28 973 1
+28 974 1
+28 975 1
+28 976 1
+28 977 1
+28 988 1
+28 989 1
+28 990 1
+28 991 1
+28 992 1
+28 993 1
+28 994 1
+28 995 1
+28 996 1
+28 997 1
+28 1255 1
+28 1261 1
+28 1262 1
+28 1263 1
+28 1264 1
+28 1265 1
+28 1276 1
+28 1277 1
+28 1278 1
+28 1279 1
+28 1280 1
+28 1291 1
+28 1292 1
+28 1293 1
+28 1294 1
+28 1295 1
+28 1296 1
+28 1297 1
+28 1298 1
+28 1299 1
+28 1300 1
+28 1311 1
+28 1312 1
+28 1313 1
+28 1314 1
+28 1315 1
+28 1326 1
+28 1327 1
+28 1328 1
+28 1329 1
+28 1330 1
+28 1331 1
+28 1332 1
+28 1333 1
+28 1334 1
+28 1335 1
+28 1346 1
+28 1347 1
+28 1348 1
+28 1349 1
+28 1350 1
+28 1351 1
+28 1352 1
+28 1353 1
+28 1354 1
+28 1355 1
+28 1366 1
+28 1367 1
+28 1368 1
+28 1369 1
+28 1370 1
+28 1371 1
+28 1372 1
+28 1373 1
+28 1374 1
+28 1375 1
+28 1381 1
+28 1382 1
+28 1383 1
+28 1384 1
+28 1385 1
+28 1396 1
+28 1397 1
+28 1398 1
+28 1399 1
+28 1400 1
+28 1401 1
+28 1402 1
+28 1403 1
+28 1404 1
+28 1405 1
+28 1416 1
+28 1417 1
+28 1418 1
+28 1419 1
+28 1420 1
+28 1421 1
+28 1422 1
+28 1423 1
+28 1424 1
+28 1425 1
+28 1436 1
+28 1437 1
+28 1438 1
+28 1439 1
+28 1440 1
+28 1441 1
+28 1442 1
+28 1443 1
+28 1444 1
+28 1445 1
+28 1451 1
+28 1452 1
+28 1453 1
+28 1454 1
+28 1455 1
+28 1456 1
+28 1457 1
+28 1458 1
+28 1459 1
+28 1460 1
+28 1471 1
+28 1472 1
+28 1473 1
+28 1474 1
+28 1475 1
+28 1476 1
+28 1477 1
+28 1478 1
+28 1479 1
+28 1480 1
+28 1486 1
+28 1487 1
+28 1488 1
+28 1489 1
+28 1490 1
+28 1491 1
+28 1492 1
+28 1493 1
+28 1494 1
+28 1495 1
+28 1501 1
+28 1502 1
+28 1503 1
+28 1504 1
+28 1505 1
+29 4 1
+29 11 1
+29 17 1
+29 22 1
+29 27 1
+29 28 1
+29 29 1
+29 30 1
+29 39 1
+29 45 1
+29 50 1
+29 55 1
+29 56 1
+29 57 1
+29 58 1
+29 66 1
+29 71 1
+29 76 1
+29 77 1
+29 78 1
+29 79 1
+29 86 1
+29 91 1
+29 92 1
+29 93 1
+29 94 1
+29 101 1
+29 102 1
+29 103 1
+29 104 1
+29 111 1
+29 112 1
+29 113 1
+29 114 1
+29 115 1
+29 116 1
+29 333 1
+29 339 1
+29 344 1
+29 349 1
+29 350 1
+29 351 1
+29 352 1
+29 360 1
+29 365 1
+29 370 1
+29 371 1
+29 372 1
+29 373 1
+29 380 1
+29 385 1
+29 386 1
+29 387 1
+29 388 1
+29 395 1
+29 396 1
+29 397 1
+29 398 1
+29 405 1
+29 406 1
+29 407 1
+29 408 1
+29 409 1
+29 410 1
+29 416 1
+29 421 1
+29 426 1
+29 427 1
+29 428 1
+29 429 1
+29 436 1
+29 441 1
+29 442 1
+29 443 1
+29 444 1
+29 451 1
+29 452 1
+29 453 1
+29 454 1
+29 461 1
+29 462 1
+29 463 1
+29 464 1
+29 465 1
+29 466 1
+29 471 1
+29 476 1
+29 477 1
+29 478 1
+29 479 1
+29 486 1
+29 487 1
+29 488 1
+29 489 1
+29 496 1
+29 497 1
+29 498 1
+29 499 1
+29 500 1
+29 501 1
+29 506 1
+29 507 1
+29 508 1
+29 509 1
+29 516 1
+29 517 1
+29 518 1
+29 519 1
+29 520 1
+29 521 1
+29 526 1
+29 527 1
+29 528 1
+29 529 1
+29 530 1
+29 531 1
+29 536 1
+29 537 1
+29 538 1
+29 539 1
+29 795 1
+29 801 1
+29 806 1
+29 811 1
+29 812 1
+29 813 1
+29 814 1
+29 822 1
+29 827 1
+29 832 1
+29 833 1
+29 834 1
+29 835 1
+29 842 1
+29 847 1
+29 848 1
+29 849 1
+29 850 1
+29 857 1
+29 858 1
+29 859 1
+29 860 1
+29 867 1
+29 868 1
+29 869 1
+29 870 1
+29 871 1
+29 872 1
+29 878 1
+29 883 1
+29 888 1
+29 889 1
+29 890 1
+29 891 1
+29 898 1
+29 903 1
+29 904 1
+29 905 1
+29 906 1
+29 913 1
+29 914 1
+29 915 1
+29 916 1
+29 923 1
+29 924 1
+29 925 1
+29 926 1
+29 927 1
+29 928 1
+29 933 1
+29 938 1
+29 939 1
+29 940 1
+29 941 1
+29 948 1
+29 949 1
+29 950 1
+29 951 1
+29 958 1
+29 959 1
+29 960 1
+29 961 1
+29 962 1
+29 963 1
+29 968 1
+29 969 1
+29 970 1
+29 971 1
+29 978 1
+29 979 1
+29 980 1
+29 981 1
+29 982 1
+29 983 1
+29 988 1
+29 989 1
+29 990 1
+29 991 1
+29 992 1
+29 993 1
+29 998 1
+29 999 1
+29 1000 1
+29 1001 1
+29 1256 1
+29 1261 1
+29 1266 1
+29 1267 1
+29 1268 1
+29 1269 1
+29 1276 1
+29 1281 1
+29 1282 1
+29 1283 1
+29 1284 1
+29 1291 1
+29 1292 1
+29 1293 1
+29 1294 1
+29 1301 1
+29 1302 1
+29 1303 1
+29 1304 1
+29 1305 1
+29 1306 1
+29 1311 1
+29 1316 1
+29 1317 1
+29 1318 1
+29 1319 1
+29 1326 1
+29 1327 1
+29 1328 1
+29 1329 1
+29 1336 1
+29 1337 1
+29 1338 1
+29 1339 1
+29 1340 1
+29 1341 1
+29 1346 1
+29 1347 1
+29 1348 1
+29 1349 1
+29 1356 1
+29 1357 1
+29 1358 1
+29 1359 1
+29 1360 1
+29 1361 1
+29 1366 1
+29 1367 1
+29 1368 1
+29 1369 1
+29 1370 1
+29 1371 1
+29 1376 1
+29 1377 1
+29 1378 1
+29 1379 1
+29 1381 1
+29 1386 1
+29 1387 1
+29 1388 1
+29 1389 1
+29 1396 1
+29 1397 1
+29 1398 1
+29 1399 1
+29 1406 1
+29 1407 1
+29 1408 1
+29 1409 1
+29 1410 1
+29 1411 1
+29 1416 1
+29 1417 1
+29 1418 1
+29 1419 1
+29 1426 1
+29 1427 1
+29 1428 1
+29 1429 1
+29 1430 1
+29 1431 1
+29 1436 1
+29 1437 1
+29 1438 1
+29 1439 1
+29 1440 1
+29 1441 1
+29 1446 1
+29 1447 1
+29 1448 1
+29 1449 1
+29 1451 1
+29 1452 1
+29 1453 1
+29 1454 1
+29 1461 1
+29 1462 1
+29 1463 1
+29 1464 1
+29 1465 1
+29 1466 1
+29 1471 1
+29 1472 1
+29 1473 1
+29 1474 1
+29 1475 1
+29 1476 1
+29 1481 1
+29 1482 1
+29 1483 1
+29 1484 1
+29 1486 1
+29 1487 1
+29 1488 1
+29 1489 1
+29 1490 1
+29 1491 1
+29 1496 1
+29 1497 1
+29 1498 1
+29 1499 1
+29 1501 1
+29 1502 1
+29 1503 1
+29 1504 1
+29 1506 1
+30 5 1
+30 12 1
+30 18 1
+30 23 1
+30 27 1
+30 31 1
+30 32 1
+30 33 1
+30 40 1
+30 46 1
+30 51 1
+30 55 1
+30 59 1
+30 60 1
+30 61 1
+30 67 1
+30 72 1
+30 76 1
+30 80 1
+30 81 1
+30 82 1
+30 87 1
+30 91 1
+30 95 1
+30 96 1
+30 97 1
+30 101 1
+30 105 1
+30 106 1
+30 107 1
+30 111 1
+30 112 1
+30 113 1
+30 117 1
+30 118 1
+30 119 1
+30 334 1
+30 340 1
+30 345 1
+30 349 1
+30 353 1
+30 354 1
+30 355 1
+30 361 1
+30 366 1
+30 370 1
+30 374 1
+30 375 1
+30 376 1
+30 381 1
+30 385 1
+30 389 1
+30 390 1
+30 391 1
+30 395 1
+30 399 1
+30 400 1
+30 401 1
+30 405 1
+30 406 1
+30 407 1
+30 411 1
+30 412 1
+30 413 1
+30 417 1
+30 422 1
+30 426 1
+30 430 1
+30 431 1
+30 432 1
+30 437 1
+30 441 1
+30 445 1
+30 446 1
+30 447 1
+30 451 1
+30 455 1
+30 456 1
+30 457 1
+30 461 1
+30 462 1
+30 463 1
+30 467 1
+30 468 1
+30 469 1
+30 472 1
+30 476 1
+30 480 1
+30 481 1
+30 482 1
+30 486 1
+30 490 1
+30 491 1
+30 492 1
+30 496 1
+30 497 1
+30 498 1
+30 502 1
+30 503 1
+30 504 1
+30 506 1
+30 510 1
+30 511 1
+30 512 1
+30 516 1
+30 517 1
+30 518 1
+30 522 1
+30 523 1
+30 524 1
+30 526 1
+30 527 1
+30 528 1
+30 532 1
+30 533 1
+30 534 1
+30 536 1
+30 537 1
+30 538 1
+30 540 1
+30 796 1
+30 802 1
+30 807 1
+30 811 1
+30 815 1
+30 816 1
+30 817 1
+30 823 1
+30 828 1
+30 832 1
+30 836 1
+30 837 1
+30 838 1
+30 843 1
+30 847 1
+30 851 1
+30 852 1
+30 853 1
+30 857 1
+30 861 1
+30 862 1
+30 863 1
+30 867 1
+30 868 1
+30 869 1
+30 873 1
+30 874 1
+30 875 1
+30 879 1
+30 884 1
+30 888 1
+30 892 1
+30 893 1
+30 894 1
+30 899 1
+30 903 1
+30 907 1
+30 908 1
+30 909 1
+30 913 1
+30 917 1
+30 918 1
+30 919 1
+30 923 1
+30 924 1
+30 925 1
+30 929 1
+30 930 1
+30 931 1
+30 934 1
+30 938 1
+30 942 1
+30 943 1
+30 944 1
+30 948 1
+30 952 1
+30 953 1
+30 954 1
+30 958 1
+30 959 1
+30 960 1
+30 964 1
+30 965 1
+30 966 1
+30 968 1
+30 972 1
+30 973 1
+30 974 1
+30 978 1
+30 979 1
+30 980 1
+30 984 1
+30 985 1
+30 986 1
+30 988 1
+30 989 1
+30 990 1
+30 994 1
+30 995 1
+30 996 1
+30 998 1
+30 999 1
+30 1000 1
+30 1002 1
+30 1257 1
+30 1262 1
+30 1266 1
+30 1270 1
+30 1271 1
+30 1272 1
+30 1277 1
+30 1281 1
+30 1285 1
+30 1286 1
+30 1287 1
+30 1291 1
+30 1295 1
+30 1296 1
+30 1297 1
+30 1301 1
+30 1302 1
+30 1303 1
+30 1307 1
+30 1308 1
+30 1309 1
+30 1312 1
+30 1316 1
+30 1320 1
+30 1321 1
+30 1322 1
+30 1326 1
+30 1330 1
+30 1331 1
+30 1332 1
+30 1336 1
+30 1337 1
+30 1338 1
+30 1342 1
+30 1343 1
+30 1344 1
+30 1346 1
+30 1350 1
+30 1351 1
+30 1352 1
+30 1356 1
+30 1357 1
+30 1358 1
+30 1362 1
+30 1363 1
+30 1364 1
+30 1366 1
+30 1367 1
+30 1368 1
+30 1372 1
+30 1373 1
+30 1374 1
+30 1376 1
+30 1377 1
+30 1378 1
+30 1380 1
+30 1382 1
+30 1386 1
+30 1390 1
+30 1391 1
+30 1392 1
+30 1396 1
+30 1400 1
+30 1401 1
+30 1402 1
+30 1406 1
+30 1407 1
+30 1408 1
+30 1412 1
+30 1413 1
+30 1414 1
+30 1416 1
+30 1420 1
+30 1421 1
+30 1422 1
+30 1426 1
+30 1427 1
+30 1428 1
+30 1432 1
+30 1433 1
+30 1434 1
+30 1436 1
+30 1437 1
+30 1438 1
+30 1442 1
+30 1443 1
+30 1444 1
+30 1446 1
+30 1447 1
+30 1448 1
+30 1450 1
+30 1451 1
+30 1455 1
+30 1456 1
+30 1457 1
+30 1461 1
+30 1462 1
+30 1463 1
+30 1467 1
+30 1468 1
+30 1469 1
+30 1471 1
+30 1472 1
+30 1473 1
+30 1477 1
+30 1478 1
+30 1479 1
+30 1481 1
+30 1482 1
+30 1483 1
+30 1485 1
+30 1486 1
+30 1487 1
+30 1488 1
+30 1492 1
+30 1493 1
+30 1494 1
+30 1496 1
+30 1497 1
+30 1498 1
+30 1500 1
+30 1501 1
+30 1502 1
+30 1503 1
+30 1505 1
+30 1506 1
+31 6 1
+31 13 1
+31 19 1
+31 24 1
+31 28 1
+31 31 1
+31 34 1
+31 35 1
+31 41 1
+31 47 1
+31 52 1
+31 56 1
+31 59 1
+31 62 1
+31 63 1
+31 68 1
+31 73 1
+31 77 1
+31 80 1
+31 83 1
+31 84 1
+31 88 1
+31 92 1
+31 95 1
+31 98 1
+31 99 1
+31 102 1
+31 105 1
+31 108 1
+31 109 1
+31 111 1
+31 114 1
+31 115 1
+31 117 1
+31 118 1
+31 120 1
+31 335 1
+31 341 1
+31 346 1
+31 350 1
+31 353 1
+31 356 1
+31 357 1
+31 362 1
+31 367 1
+31 371 1
+31 374 1
+31 377 1
+31 378 1
+31 382 1
+31 386 1
+31 389 1
+31 392 1
+31 393 1
+31 396 1
+31 399 1
+31 402 1
+31 403 1
+31 405 1
+31 408 1
+31 409 1
+31 411 1
+31 412 1
+31 414 1
+31 418 1
+31 423 1
+31 427 1
+31 430 1
+31 433 1
+31 434 1
+31 438 1
+31 442 1
+31 445 1
+31 448 1
+31 449 1
+31 452 1
+31 455 1
+31 458 1
+31 459 1
+31 461 1
+31 464 1
+31 465 1
+31 467 1
+31 468 1
+31 470 1
+31 473 1
+31 477 1
+31 480 1
+31 483 1
+31 484 1
+31 487 1
+31 490 1
+31 493 1
+31 494 1
+31 496 1
+31 499 1
+31 500 1
+31 502 1
+31 503 1
+31 505 1
+31 507 1
+31 510 1
+31 513 1
+31 514 1
+31 516 1
+31 519 1
+31 520 1
+31 522 1
+31 523 1
+31 525 1
+31 526 1
+31 529 1
+31 530 1
+31 532 1
+31 533 1
+31 535 1
+31 536 1
+31 537 1
+31 539 1
+31 540 1
+31 797 1
+31 803 1
+31 808 1
+31 812 1
+31 815 1
+31 818 1
+31 819 1
+31 824 1
+31 829 1
+31 833 1
+31 836 1
+31 839 1
+31 840 1
+31 844 1
+31 848 1
+31 851 1
+31 854 1
+31 855 1
+31 858 1
+31 861 1
+31 864 1
+31 865 1
+31 867 1
+31 870 1
+31 871 1
+31 873 1
+31 874 1
+31 876 1
+31 880 1
+31 885 1
+31 889 1
+31 892 1
+31 895 1
+31 896 1
+31 900 1
+31 904 1
+31 907 1
+31 910 1
+31 911 1
+31 914 1
+31 917 1
+31 920 1
+31 921 1
+31 923 1
+31 926 1
+31 927 1
+31 929 1
+31 930 1
+31 932 1
+31 935 1
+31 939 1
+31 942 1
+31 945 1
+31 946 1
+31 949 1
+31 952 1
+31 955 1
+31 956 1
+31 958 1
+31 961 1
+31 962 1
+31 964 1
+31 965 1
+31 967 1
+31 969 1
+31 972 1
+31 975 1
+31 976 1
+31 978 1
+31 981 1
+31 982 1
+31 984 1
+31 985 1
+31 987 1
+31 988 1
+31 991 1
+31 992 1
+31 994 1
+31 995 1
+31 997 1
+31 998 1
+31 999 1
+31 1001 1
+31 1002 1
+31 1258 1
+31 1263 1
+31 1267 1
+31 1270 1
+31 1273 1
+31 1274 1
+31 1278 1
+31 1282 1
+31 1285 1
+31 1288 1
+31 1289 1
+31 1292 1
+31 1295 1
+31 1298 1
+31 1299 1
+31 1301 1
+31 1304 1
+31 1305 1
+31 1307 1
+31 1308 1
+31 1310 1
+31 1313 1
+31 1317 1
+31 1320 1
+31 1323 1
+31 1324 1
+31 1327 1
+31 1330 1
+31 1333 1
+31 1334 1
+31 1336 1
+31 1339 1
+31 1340 1
+31 1342 1
+31 1343 1
+31 1345 1
+31 1347 1
+31 1350 1
+31 1353 1
+31 1354 1
+31 1356 1
+31 1359 1
+31 1360 1
+31 1362 1
+31 1363 1
+31 1365 1
+31 1366 1
+31 1369 1
+31 1370 1
+31 1372 1
+31 1373 1
+31 1375 1
+31 1376 1
+31 1377 1
+31 1379 1
+31 1380 1
+31 1383 1
+31 1387 1
+31 1390 1
+31 1393 1
+31 1394 1
+31 1397 1
+31 1400 1
+31 1403 1
+31 1404 1
+31 1406 1
+31 1409 1
+31 1410 1
+31 1412 1
+31 1413 1
+31 1415 1
+31 1417 1
+31 1420 1
+31 1423 1
+31 1424 1
+31 1426 1
+31 1429 1
+31 1430 1
+31 1432 1
+31 1433 1
+31 1435 1
+31 1436 1
+31 1439 1
+31 1440 1
+31 1442 1
+31 1443 1
+31 1445 1
+31 1446 1
+31 1447 1
+31 1449 1
+31 1450 1
+31 1452 1
+31 1455 1
+31 1458 1
+31 1459 1
+31 1461 1
+31 1464 1
+31 1465 1
+31 1467 1
+31 1468 1
+31 1470 1
+31 1471 1
+31 1474 1
+31 1475 1
+31 1477 1
+31 1478 1
+31 1480 1
+31 1481 1
+31 1482 1
+31 1484 1
+31 1485 1
+31 1486 1
+31 1489 1
+31 1490 1
+31 1492 1
+31 1493 1
+31 1495 1
+31 1496 1
+31 1497 1
+31 1499 1
+31 1500 1
+31 1501 1
+31 1502 1
+31 1504 1
+31 1505 1
+31 1506 1
+32 7 1
+32 14 1
+32 20 1
+32 25 1
+32 29 1
+32 32 1
+32 34 1
+32 36 1
+32 42 1
+32 48 1
+32 53 1
+32 57 1
+32 60 1
+32 62 1
+32 64 1
+32 69 1
+32 74 1
+32 78 1
+32 81 1
+32 83 1
+32 85 1
+32 89 1
+32 93 1
+32 96 1
+32 98 1
+32 100 1
+32 103 1
+32 106 1
+32 108 1
+32 110 1
+32 112 1
+32 114 1
+32 116 1
+32 117 1
+32 119 1
+32 120 1
+32 336 1
+32 342 1
+32 347 1
+32 351 1
+32 354 1
+32 356 1
+32 358 1
+32 363 1
+32 368 1
+32 372 1
+32 375 1
+32 377 1
+32 379 1
+32 383 1
+32 387 1
+32 390 1
+32 392 1
+32 394 1
+32 397 1
+32 400 1
+32 402 1
+32 404 1
+32 406 1
+32 408 1
+32 410 1
+32 411 1
+32 413 1
+32 414 1
+32 419 1
+32 424 1
+32 428 1
+32 431 1
+32 433 1
+32 435 1
+32 439 1
+32 443 1
+32 446 1
+32 448 1
+32 450 1
+32 453 1
+32 456 1
+32 458 1
+32 460 1
+32 462 1
+32 464 1
+32 466 1
+32 467 1
+32 469 1
+32 470 1
+32 474 1
+32 478 1
+32 481 1
+32 483 1
+32 485 1
+32 488 1
+32 491 1
+32 493 1
+32 495 1
+32 497 1
+32 499 1
+32 501 1
+32 502 1
+32 504 1
+32 505 1
+32 508 1
+32 511 1
+32 513 1
+32 515 1
+32 517 1
+32 519 1
+32 521 1
+32 522 1
+32 524 1
+32 525 1
+32 527 1
+32 529 1
+32 531 1
+32 532 1
+32 534 1
+32 535 1
+32 536 1
+32 538 1
+32 539 1
+32 540 1
+32 798 1
+32 804 1
+32 809 1
+32 813 1
+32 816 1
+32 818 1
+32 820 1
+32 825 1
+32 830 1
+32 834 1
+32 837 1
+32 839 1
+32 841 1
+32 845 1
+32 849 1
+32 852 1
+32 854 1
+32 856 1
+32 859 1
+32 862 1
+32 864 1
+32 866 1
+32 868 1
+32 870 1
+32 872 1
+32 873 1
+32 875 1
+32 876 1
+32 881 1
+32 886 1
+32 890 1
+32 893 1
+32 895 1
+32 897 1
+32 901 1
+32 905 1
+32 908 1
+32 910 1
+32 912 1
+32 915 1
+32 918 1
+32 920 1
+32 922 1
+32 924 1
+32 926 1
+32 928 1
+32 929 1
+32 931 1
+32 932 1
+32 936 1
+32 940 1
+32 943 1
+32 945 1
+32 947 1
+32 950 1
+32 953 1
+32 955 1
+32 957 1
+32 959 1
+32 961 1
+32 963 1
+32 964 1
+32 966 1
+32 967 1
+32 970 1
+32 973 1
+32 975 1
+32 977 1
+32 979 1
+32 981 1
+32 983 1
+32 984 1
+32 986 1
+32 987 1
+32 989 1
+32 991 1
+32 993 1
+32 994 1
+32 996 1
+32 997 1
+32 998 1
+32 1000 1
+32 1001 1
+32 1002 1
+32 1259 1
+32 1264 1
+32 1268 1
+32 1271 1
+32 1273 1
+32 1275 1
+32 1279 1
+32 1283 1
+32 1286 1
+32 1288 1
+32 1290 1
+32 1293 1
+32 1296 1
+32 1298 1
+32 1300 1
+32 1302 1
+32 1304 1
+32 1306 1
+32 1307 1
+32 1309 1
+32 1310 1
+32 1314 1
+32 1318 1
+32 1321 1
+32 1323 1
+32 1325 1
+32 1328 1
+32 1331 1
+32 1333 1
+32 1335 1
+32 1337 1
+32 1339 1
+32 1341 1
+32 1342 1
+32 1344 1
+32 1345 1
+32 1348 1
+32 1351 1
+32 1353 1
+32 1355 1
+32 1357 1
+32 1359 1
+32 1361 1
+32 1362 1
+32 1364 1
+32 1365 1
+32 1367 1
+32 1369 1
+32 1371 1
+32 1372 1
+32 1374 1
+32 1375 1
+32 1376 1
+32 1378 1
+32 1379 1
+32 1380 1
+32 1384 1
+32 1388 1
+32 1391 1
+32 1393 1
+32 1395 1
+32 1398 1
+32 1401 1
+32 1403 1
+32 1405 1
+32 1407 1
+32 1409 1
+32 1411 1
+32 1412 1
+32 1414 1
+32 1415 1
+32 1418 1
+32 1421 1
+32 1423 1
+32 1425 1
+32 1427 1
+32 1429 1
+32 1431 1
+32 1432 1
+32 1434 1
+32 1435 1
+32 1437 1
+32 1439 1
+32 1441 1
+32 1442 1
+32 1444 1
+32 1445 1
+32 1446 1
+32 1448 1
+32 1449 1
+32 1450 1
+32 1453 1
+32 1456 1
+32 1458 1
+32 1460 1
+32 1462 1
+32 1464 1
+32 1466 1
+32 1467 1
+32 1469 1
+32 1470 1
+32 1472 1
+32 1474 1
+32 1476 1
+32 1477 1
+32 1479 1
+32 1480 1
+32 1481 1
+32 1483 1
+32 1484 1
+32 1485 1
+32 1487 1
+32 1489 1
+32 1491 1
+32 1492 1
+32 1494 1
+32 1495 1
+32 1496 1
+32 1498 1
+32 1499 1
+32 1500 1
+32 1501 1
+32 1503 1
+32 1504 1
+32 1505 1
+32 1506 1
+33 8 1
+33 15 1
+33 21 1
+33 26 1
+33 30 1
+33 33 1
+33 35 1
+33 36 1
+33 43 1
+33 49 1
+33 54 1
+33 58 1
+33 61 1
+33 63 1
+33 64 1
+33 70 1
+33 75 1
+33 79 1
+33 82 1
+33 84 1
+33 85 1
+33 90 1
+33 94 1
+33 97 1
+33 99 1
+33 100 1
+33 104 1
+33 107 1
+33 109 1
+33 110 1
+33 113 1
+33 115 1
+33 116 1
+33 118 1
+33 119 1
+33 120 1
+33 337 1
+33 343 1
+33 348 1
+33 352 1
+33 355 1
+33 357 1
+33 358 1
+33 364 1
+33 369 1
+33 373 1
+33 376 1
+33 378 1
+33 379 1
+33 384 1
+33 388 1
+33 391 1
+33 393 1
+33 394 1
+33 398 1
+33 401 1
+33 403 1
+33 404 1
+33 407 1
+33 409 1
+33 410 1
+33 412 1
+33 413 1
+33 414 1
+33 420 1
+33 425 1
+33 429 1
+33 432 1
+33 434 1
+33 435 1
+33 440 1
+33 444 1
+33 447 1
+33 449 1
+33 450 1
+33 454 1
+33 457 1
+33 459 1
+33 460 1
+33 463 1
+33 465 1
+33 466 1
+33 468 1
+33 469 1
+33 470 1
+33 475 1
+33 479 1
+33 482 1
+33 484 1
+33 485 1
+33 489 1
+33 492 1
+33 494 1
+33 495 1
+33 498 1
+33 500 1
+33 501 1
+33 503 1
+33 504 1
+33 505 1
+33 509 1
+33 512 1
+33 514 1
+33 515 1
+33 518 1
+33 520 1
+33 521 1
+33 523 1
+33 524 1
+33 525 1
+33 528 1
+33 530 1
+33 531 1
+33 533 1
+33 534 1
+33 535 1
+33 537 1
+33 538 1
+33 539 1
+33 540 1
+33 799 1
+33 805 1
+33 810 1
+33 814 1
+33 817 1
+33 819 1
+33 820 1
+33 826 1
+33 831 1
+33 835 1
+33 838 1
+33 840 1
+33 841 1
+33 846 1
+33 850 1
+33 853 1
+33 855 1
+33 856 1
+33 860 1
+33 863 1
+33 865 1
+33 866 1
+33 869 1
+33 871 1
+33 872 1
+33 874 1
+33 875 1
+33 876 1
+33 882 1
+33 887 1
+33 891 1
+33 894 1
+33 896 1
+33 897 1
+33 902 1
+33 906 1
+33 909 1
+33 911 1
+33 912 1
+33 916 1
+33 919 1
+33 921 1
+33 922 1
+33 925 1
+33 927 1
+33 928 1
+33 930 1
+33 931 1
+33 932 1
+33 937 1
+33 941 1
+33 944 1
+33 946 1
+33 947 1
+33 951 1
+33 954 1
+33 956 1
+33 957 1
+33 960 1
+33 962 1
+33 963 1
+33 965 1
+33 966 1
+33 967 1
+33 971 1
+33 974 1
+33 976 1
+33 977 1
+33 980 1
+33 982 1
+33 983 1
+33 985 1
+33 986 1
+33 987 1
+33 990 1
+33 992 1
+33 993 1
+33 995 1
+33 996 1
+33 997 1
+33 999 1
+33 1000 1
+33 1001 1
+33 1002 1
+33 1260 1
+33 1265 1
+33 1269 1
+33 1272 1
+33 1274 1
+33 1275 1
+33 1280 1
+33 1284 1
+33 1287 1
+33 1289 1
+33 1290 1
+33 1294 1
+33 1297 1
+33 1299 1
+33 1300 1
+33 1303 1
+33 1305 1
+33 1306 1
+33 1308 1
+33 1309 1
+33 1310 1
+33 1315 1
+33 1319 1
+33 1322 1
+33 1324 1
+33 1325 1
+33 1329 1
+33 1332 1
+33 1334 1
+33 1335 1
+33 1338 1
+33 1340 1
+33 1341 1
+33 1343 1
+33 1344 1
+33 1345 1
+33 1349 1
+33 1352 1
+33 1354 1
+33 1355 1
+33 1358 1
+33 1360 1
+33 1361 1
+33 1363 1
+33 1364 1
+33 1365 1
+33 1368 1
+33 1370 1
+33 1371 1
+33 1373 1
+33 1374 1
+33 1375 1
+33 1377 1
+33 1378 1
+33 1379 1
+33 1380 1
+33 1385 1
+33 1389 1
+33 1392 1
+33 1394 1
+33 1395 1
+33 1399 1
+33 1402 1
+33 1404 1
+33 1405 1
+33 1408 1
+33 1410 1
+33 1411 1
+33 1413 1
+33 1414 1
+33 1415 1
+33 1419 1
+33 1422 1
+33 1424 1
+33 1425 1
+33 1428 1
+33 1430 1
+33 1431 1
+33 1433 1
+33 1434 1
+33 1435 1
+33 1438 1
+33 1440 1
+33 1441 1
+33 1443 1
+33 1444 1
+33 1445 1
+33 1447 1
+33 1448 1
+33 1449 1
+33 1450 1
+33 1454 1
+33 1457 1
+33 1459 1
+33 1460 1
+33 1463 1
+33 1465 1
+33 1466 1
+33 1468 1
+33 1469 1
+33 1470 1
+33 1473 1
+33 1475 1
+33 1476 1
+33 1478 1
+33 1479 1
+33 1480 1
+33 1482 1
+33 1483 1
+33 1484 1
+33 1485 1
+33 1488 1
+33 1490 1
+33 1491 1
+33 1493 1
+33 1494 1
+33 1495 1
+33 1497 1
+33 1498 1
+33 1499 1
+33 1500 1
+33 1502 1
+33 1503 1
+33 1504 1
+33 1505 1
+33 1506 1
+34 1 1
+34 2 1
+34 3 1
+34 4 1
+34 5 1
+34 6 1
+34 7 1
+34 8 1
+34 121 1
+34 122 1
+34 123 1
+34 124 1
+34 125 1
+34 126 1
+34 127 1
+34 128 1
+34 129 1
+34 130 1
+34 131 1
+34 132 1
+34 133 1
+34 134 1
+34 135 1
+34 136 1
+34 137 1
+34 138 1
+34 139 1
+34 140 1
+34 141 1
+34 142 1
+34 143 1
+34 144 1
+34 145 1
+34 146 1
+34 147 1
+34 148 1
+34 331 1
+34 332 1
+34 333 1
+34 334 1
+34 335 1
+34 336 1
+34 337 1
+34 338 1
+34 339 1
+34 340 1
+34 341 1
+34 342 1
+34 343 1
+34 344 1
+34 345 1
+34 346 1
+34 347 1
+34 348 1
+34 349 1
+34 350 1
+34 351 1
+34 352 1
+34 353 1
+34 354 1
+34 355 1
+34 356 1
+34 357 1
+34 358 1
+34 541 1
+34 542 1
+34 543 1
+34 544 1
+34 545 1
+34 546 1
+34 547 1
+34 548 1
+34 549 1
+34 550 1
+34 551 1
+34 552 1
+34 553 1
+34 554 1
+34 555 1
+34 556 1
+34 557 1
+34 558 1
+34 559 1
+34 560 1
+34 561 1
+34 562 1
+34 563 1
+34 564 1
+34 565 1
+34 566 1
+34 567 1
+34 568 1
+34 569 1
+34 570 1
+34 571 1
+34 572 1
+34 573 1
+34 574 1
+34 575 1
+34 576 1
+34 577 1
+34 578 1
+34 579 1
+34 580 1
+34 581 1
+34 582 1
+34 583 1
+34 584 1
+34 585 1
+34 586 1
+34 587 1
+34 588 1
+34 589 1
+34 590 1
+34 591 1
+34 592 1
+34 593 1
+34 594 1
+34 595 1
+34 596 1
+34 793 1
+34 794 1
+34 795 1
+34 796 1
+34 797 1
+34 798 1
+34 799 1
+34 800 1
+34 801 1
+34 802 1
+34 803 1
+34 804 1
+34 805 1
+34 806 1
+34 807 1
+34 808 1
+34 809 1
+34 810 1
+34 811 1
+34 812 1
+34 813 1
+34 814 1
+34 815 1
+34 816 1
+34 817 1
+34 818 1
+34 819 1
+34 820 1
+34 1003 1
+34 1004 1
+34 1005 1
+34 1006 1
+34 1007 1
+34 1008 1
+34 1009 1
+34 1010 1
+34 1011 1
+34 1012 1
+34 1013 1
+34 1014 1
+34 1015 1
+34 1016 1
+34 1017 1
+34 1018 1
+34 1019 1
+34 1020 1
+34 1021 1
+34 1022 1
+34 1023 1
+34 1024 1
+34 1025 1
+34 1026 1
+34 1027 1
+34 1028 1
+34 1029 1
+34 1030 1
+34 1031 1
+34 1032 1
+34 1033 1
+34 1034 1
+34 1035 1
+34 1036 1
+34 1037 1
+34 1038 1
+34 1039 1
+34 1040 1
+34 1041 1
+34 1042 1
+34 1043 1
+34 1044 1
+34 1045 1
+34 1046 1
+34 1047 1
+34 1048 1
+34 1049 1
+34 1050 1
+34 1051 1
+34 1052 1
+34 1053 1
+34 1054 1
+34 1055 1
+34 1056 1
+34 1057 1
+34 1058 1
+34 1255 1
+34 1256 1
+34 1257 1
+34 1258 1
+34 1259 1
+34 1260 1
+34 1261 1
+34 1262 1
+34 1263 1
+34 1264 1
+34 1265 1
+34 1266 1
+34 1267 1
+34 1268 1
+34 1269 1
+34 1270 1
+34 1271 1
+34 1272 1
+34 1273 1
+34 1274 1
+34 1275 1
+34 1276 1
+34 1277 1
+34 1278 1
+34 1279 1
+34 1280 1
+34 1281 1
+34 1282 1
+34 1283 1
+34 1284 1
+34 1285 1
+34 1286 1
+34 1287 1
+34 1288 1
+34 1289 1
+34 1290 1
+34 1291 1
+34 1292 1
+34 1293 1
+34 1294 1
+34 1295 1
+34 1296 1
+34 1297 1
+34 1298 1
+34 1299 1
+34 1300 1
+34 1301 1
+34 1302 1
+34 1303 1
+34 1304 1
+34 1305 1
+34 1306 1
+34 1307 1
+34 1308 1
+34 1309 1
+34 1310 1
+34 1507 1
+34 1508 1
+34 1509 1
+34 1510 1
+34 1511 1
+34 1512 1
+34 1513 1
+34 1514 1
+34 1515 1
+34 1516 1
+34 1517 1
+34 1518 1
+34 1519 1
+34 1520 1
+34 1521 1
+34 1522 1
+34 1523 1
+34 1524 1
+34 1525 1
+34 1526 1
+34 1527 1
+34 1528 1
+34 1529 1
+34 1530 1
+34 1531 1
+34 1532 1
+34 1533 1
+34 1534 1
+34 1535 1
+34 1536 1
+34 1537 1
+34 1538 1
+34 1539 1
+34 1540 1
+34 1541 1
+34 1542 1
+34 1543 1
+34 1544 1
+34 1545 1
+34 1546 1
+34 1547 1
+34 1548 1
+34 1549 1
+34 1550 1
+34 1551 1
+34 1552 1
+34 1553 1
+34 1554 1
+34 1555 1
+34 1556 1
+34 1557 1
+34 1558 1
+34 1559 1
+34 1560 1
+34 1561 1
+34 1562 1
+34 1563 1
+34 1564 1
+34 1565 1
+34 1566 1
+34 1567 1
+34 1568 1
+34 1569 1
+34 1570 1
+34 1571 1
+34 1572 1
+34 1573 1
+34 1574 1
+34 1575 1
+34 1576 1
+35 1 1
+35 9 1
+35 10 1
+35 11 1
+35 12 1
+35 13 1
+35 14 1
+35 15 1
+35 121 1
+35 122 1
+35 123 1
+35 124 1
+35 125 1
+35 126 1
+35 127 1
+35 149 1
+35 150 1
+35 151 1
+35 152 1
+35 153 1
+35 154 1
+35 155 1
+35 156 1
+35 157 1
+35 158 1
+35 159 1
+35 160 1
+35 161 1
+35 162 1
+35 163 1
+35 164 1
+35 165 1
+35 166 1
+35 167 1
+35 168 1
+35 169 1
+35 331 1
+35 332 1
+35 333 1
+35 334 1
+35 335 1
+35 336 1
+35 337 1
+35 359 1
+35 360 1
+35 361 1
+35 362 1
+35 363 1
+35 364 1
+35 365 1
+35 366 1
+35 367 1
+35 368 1
+35 369 1
+35 370 1
+35 371 1
+35 372 1
+35 373 1
+35 374 1
+35 375 1
+35 376 1
+35 377 1
+35 378 1
+35 379 1
+35 541 1
+35 542 1
+35 543 1
+35 544 1
+35 545 1
+35 546 1
+35 547 1
+35 548 1
+35 549 1
+35 550 1
+35 551 1
+35 552 1
+35 553 1
+35 554 1
+35 555 1
+35 556 1
+35 557 1
+35 558 1
+35 559 1
+35 560 1
+35 561 1
+35 597 1
+35 598 1
+35 599 1
+35 600 1
+35 601 1
+35 602 1
+35 603 1
+35 604 1
+35 605 1
+35 606 1
+35 607 1
+35 608 1
+35 609 1
+35 610 1
+35 611 1
+35 612 1
+35 613 1
+35 614 1
+35 615 1
+35 616 1
+35 617 1
+35 618 1
+35 619 1
+35 620 1
+35 621 1
+35 622 1
+35 623 1
+35 624 1
+35 625 1
+35 626 1
+35 627 1
+35 628 1
+35 629 1
+35 630 1
+35 631 1
+35 793 1
+35 794 1
+35 795 1
+35 796 1
+35 797 1
+35 798 1
+35 799 1
+35 821 1
+35 822 1
+35 823 1
+35 824 1
+35 825 1
+35 826 1
+35 827 1
+35 828 1
+35 829 1
+35 830 1
+35 831 1
+35 832 1
+35 833 1
+35 834 1
+35 835 1
+35 836 1
+35 837 1
+35 838 1
+35 839 1
+35 840 1
+35 841 1
+35 1003 1
+35 1004 1
+35 1005 1
+35 1006 1
+35 1007 1
+35 1008 1
+35 1009 1
+35 1010 1
+35 1011 1
+35 1012 1
+35 1013 1
+35 1014 1
+35 1015 1
+35 1016 1
+35 1017 1
+35 1018 1
+35 1019 1
+35 1020 1
+35 1021 1
+35 1022 1
+35 1023 1
+35 1059 1
+35 1060 1
+35 1061 1
+35 1062 1
+35 1063 1
+35 1064 1
+35 1065 1
+35 1066 1
+35 1067 1
+35 1068 1
+35 1069 1
+35 1070 1
+35 1071 1
+35 1072 1
+35 1073 1
+35 1074 1
+35 1075 1
+35 1076 1
+35 1077 1
+35 1078 1
+35 1079 1
+35 1080 1
+35 1081 1
+35 1082 1
+35 1083 1
+35 1084 1
+35 1085 1
+35 1086 1
+35 1087 1
+35 1088 1
+35 1089 1
+35 1090 1
+35 1091 1
+35 1092 1
+35 1093 1
+35 1255 1
+35 1256 1
+35 1257 1
+35 1258 1
+35 1259 1
+35 1260 1
+35 1261 1
+35 1262 1
+35 1263 1
+35 1264 1
+35 1265 1
+35 1266 1
+35 1267 1
+35 1268 1
+35 1269 1
+35 1270 1
+35 1271 1
+35 1272 1
+35 1273 1
+35 1274 1
+35 1275 1
+35 1311 1
+35 1312 1
+35 1313 1
+35 1314 1
+35 1315 1
+35 1316 1
+35 1317 1
+35 1318 1
+35 1319 1
+35 1320 1
+35 1321 1
+35 1322 1
+35 1323 1
+35 1324 1
+35 1325 1
+35 1326 1
+35 1327 1
+35 1328 1
+35 1329 1
+35 1330 1
+35 1331 1
+35 1332 1
+35 1333 1
+35 1334 1
+35 1335 1
+35 1336 1
+35 1337 1
+35 1338 1
+35 1339 1
+35 1340 1
+35 1341 1
+35 1342 1
+35 1343 1
+35 1344 1
+35 1345 1
+35 1507 1
+35 1508 1
+35 1509 1
+35 1510 1
+35 1511 1
+35 1512 1
+35 1513 1
+35 1514 1
+35 1515 1
+35 1516 1
+35 1517 1
+35 1518 1
+35 1519 1
+35 1520 1
+35 1521 1
+35 1522 1
+35 1523 1
+35 1524 1
+35 1525 1
+35 1526 1
+35 1527 1
+35 1528 1
+35 1529 1
+35 1530 1
+35 1531 1
+35 1532 1
+35 1533 1
+35 1534 1
+35 1535 1
+35 1536 1
+35 1537 1
+35 1538 1
+35 1539 1
+35 1540 1
+35 1541 1
+35 1577 1
+35 1578 1
+35 1579 1
+35 1580 1
+35 1581 1
+35 1582 1
+35 1583 1
+35 1584 1
+35 1585 1
+35 1586 1
+35 1587 1
+35 1588 1
+35 1589 1
+35 1590 1
+35 1591 1
+35 1592 1
+35 1593 1
+35 1594 1
+35 1595 1
+35 1596 1
+35 1597 1
+35 1598 1
+35 1599 1
+35 1600 1
+35 1601 1
+35 1602 1
+35 1603 1
+35 1604 1
+35 1605 1
+35 1606 1
+35 1607 1
+35 1608 1
+35 1609 1
+35 1610 1
+35 1611 1
+36 2 1
+36 9 1
+36 16 1
+36 17 1
+36 18 1
+36 19 1
+36 20 1
+36 21 1
+36 121 1
+36 128 1
+36 129 1
+36 130 1
+36 131 1
+36 132 1
+36 133 1
+36 149 1
+36 150 1
+36 151 1
+36 152 1
+36 153 1
+36 154 1
+36 170 1
+36 171 1
+36 172 1
+36 173 1
+36 174 1
+36 175 1
+36 176 1
+36 177 1
+36 178 1
+36 179 1
+36 180 1
+36 181 1
+36 182 1
+36 183 1
+36 184 1
+36 331 1
+36 338 1
+36 339 1
+36 340 1
+36 341 1
+36 342 1
+36 343 1
+36 359 1
+36 360 1
+36 361 1
+36 362 1
+36 363 1
+36 364 1
+36 380 1
+36 381 1
+36 382 1
+36 383 1
+36 384 1
+36 385 1
+36 386 1
+36 387 1
+36 388 1
+36 389 1
+36 390 1
+36 391 1
+36 392 1
+36 393 1
+36 394 1
+36 541 1
+36 542 1
+36 543 1
+36 544 1
+36 545 1
+36 546 1
+36 562 1
+36 563 1
+36 564 1
+36 565 1
+36 566 1
+36 567 1
+36 568 1
+36 569 1
+36 570 1
+36 571 1
+36 572 1
+36 573 1
+36 574 1
+36 575 1
+36 576 1
+36 597 1
+36 598 1
+36 599 1
+36 600 1
+36 601 1
+36 602 1
+36 603 1
+36 604 1
+36 605 1
+36 606 1
+36 607 1
+36 608 1
+36 609 1
+36 610 1
+36 611 1
+36 632 1
+36 633 1
+36 634 1
+36 635 1
+36 636 1
+36 637 1
+36 638 1
+36 639 1
+36 640 1
+36 641 1
+36 642 1
+36 643 1
+36 644 1
+36 645 1
+36 646 1
+36 647 1
+36 648 1
+36 649 1
+36 650 1
+36 651 1
+36 793 1
+36 800 1
+36 801 1
+36 802 1
+36 803 1
+36 804 1
+36 805 1
+36 821 1
+36 822 1
+36 823 1
+36 824 1
+36 825 1
+36 826 1
+36 842 1
+36 843 1
+36 844 1
+36 845 1
+36 846 1
+36 847 1
+36 848 1
+36 849 1
+36 850 1
+36 851 1
+36 852 1
+36 853 1
+36 854 1
+36 855 1
+36 856 1
+36 1003 1
+36 1004 1
+36 1005 1
+36 1006 1
+36 1007 1
+36 1008 1
+36 1024 1
+36 1025 1
+36 1026 1
+36 1027 1
+36 1028 1
+36 1029 1
+36 1030 1
+36 1031 1
+36 1032 1
+36 1033 1
+36 1034 1
+36 1035 1
+36 1036 1
+36 1037 1
+36 1038 1
+36 1059 1
+36 1060 1
+36 1061 1
+36 1062 1
+36 1063 1
+36 1064 1
+36 1065 1
+36 1066 1
+36 1067 1
+36 1068 1
+36 1069 1
+36 1070 1
+36 1071 1
+36 1072 1
+36 1073 1
+36 1094 1
+36 1095 1
+36 1096 1
+36 1097 1
+36 1098 1
+36 1099 1
+36 1100 1
+36 1101 1
+36 1102 1
+36 1103 1
+36 1104 1
+36 1105 1
+36 1106 1
+36 1107 1
+36 1108 1
+36 1109 1
+36 1110 1
+36 1111 1
+36 1112 1
+36 1113 1
+36 1255 1
+36 1256 1
+36 1257 1
+36 1258 1
+36 1259 1
+36 1260 1
+36 1276 1
+36 1277 1
+36 1278 1
+36 1279 1
+36 1280 1
+36 1281 1
+36 1282 1
+36 1283 1
+36 1284 1
+36 1285 1
+36 1286 1
+36 1287 1
+36 1288 1
+36 1289 1
+36 1290 1
+36 1311 1
+36 1312 1
+36 1313 1
+36 1314 1
+36 1315 1
+36 1316 1
+36 1317 1
+36 1318 1
+36 1319 1
+36 1320 1
+36 1321 1
+36 1322 1
+36 1323 1
+36 1324 1
+36 1325 1
+36 1346 1
+36 1347 1
+36 1348 1
+36 1349 1
+36 1350 1
+36 1351 1
+36 1352 1
+36 1353 1
+36 1354 1
+36 1355 1
+36 1356 1
+36 1357 1
+36 1358 1
+36 1359 1
+36 1360 1
+36 1361 1
+36 1362 1
+36 1363 1
+36 1364 1
+36 1365 1
+36 1507 1
+36 1508 1
+36 1509 1
+36 1510 1
+36 1511 1
+36 1512 1
+36 1513 1
+36 1514 1
+36 1515 1
+36 1516 1
+36 1517 1
+36 1518 1
+36 1519 1
+36 1520 1
+36 1521 1
+36 1542 1
+36 1543 1
+36 1544 1
+36 1545 1
+36 1546 1
+36 1547 1
+36 1548 1
+36 1549 1
+36 1550 1
+36 1551 1
+36 1552 1
+36 1553 1
+36 1554 1
+36 1555 1
+36 1556 1
+36 1557 1
+36 1558 1
+36 1559 1
+36 1560 1
+36 1561 1
+36 1577 1
+36 1578 1
+36 1579 1
+36 1580 1
+36 1581 1
+36 1582 1
+36 1583 1
+36 1584 1
+36 1585 1
+36 1586 1
+36 1587 1
+36 1588 1
+36 1589 1
+36 1590 1
+36 1591 1
+36 1592 1
+36 1593 1
+36 1594 1
+36 1595 1
+36 1596 1
+36 1612 1
+36 1613 1
+36 1614 1
+36 1615 1
+36 1616 1
+36 1617 1
+36 1618 1
+36 1619 1
+36 1620 1
+36 1621 1
+36 1622 1
+36 1623 1
+36 1624 1
+36 1625 1
+36 1626 1
+37 3 1
+37 10 1
+37 16 1
+37 22 1
+37 23 1
+37 24 1
+37 25 1
+37 26 1
+37 122 1
+37 128 1
+37 134 1
+37 135 1
+37 136 1
+37 137 1
+37 138 1
+37 149 1
+37 155 1
+37 156 1
+37 157 1
+37 158 1
+37 159 1
+37 170 1
+37 171 1
+37 172 1
+37 173 1
+37 174 1
+37 185 1
+37 186 1
+37 187 1
+37 188 1
+37 189 1
+37 190 1
+37 191 1
+37 192 1
+37 193 1
+37 194 1
+37 332 1
+37 338 1
+37 344 1
+37 345 1
+37 346 1
+37 347 1
+37 348 1
+37 359 1
+37 365 1
+37 366 1
+37 367 1
+37 368 1
+37 369 1
+37 380 1
+37 381 1
+37 382 1
+37 383 1
+37 384 1
+37 395 1
+37 396 1
+37 397 1
+37 398 1
+37 399 1
+37 400 1
+37 401 1
+37 402 1
+37 403 1
+37 404 1
+37 541 1
+37 547 1
+37 548 1
+37 549 1
+37 550 1
+37 551 1
+37 562 1
+37 563 1
+37 564 1
+37 565 1
+37 566 1
+37 577 1
+37 578 1
+37 579 1
+37 580 1
+37 581 1
+37 582 1
+37 583 1
+37 584 1
+37 585 1
+37 586 1
+37 597 1
+37 598 1
+37 599 1
+37 600 1
+37 601 1
+37 612 1
+37 613 1
+37 614 1
+37 615 1
+37 616 1
+37 617 1
+37 618 1
+37 619 1
+37 620 1
+37 621 1
+37 632 1
+37 633 1
+37 634 1
+37 635 1
+37 636 1
+37 637 1
+37 638 1
+37 639 1
+37 640 1
+37 641 1
+37 652 1
+37 653 1
+37 654 1
+37 655 1
+37 656 1
+37 657 1
+37 658 1
+37 659 1
+37 660 1
+37 661 1
+37 794 1
+37 800 1
+37 806 1
+37 807 1
+37 808 1
+37 809 1
+37 810 1
+37 821 1
+37 827 1
+37 828 1
+37 829 1
+37 830 1
+37 831 1
+37 842 1
+37 843 1
+37 844 1
+37 845 1
+37 846 1
+37 857 1
+37 858 1
+37 859 1
+37 860 1
+37 861 1
+37 862 1
+37 863 1
+37 864 1
+37 865 1
+37 866 1
+37 1003 1
+37 1009 1
+37 1010 1
+37 1011 1
+37 1012 1
+37 1013 1
+37 1024 1
+37 1025 1
+37 1026 1
+37 1027 1
+37 1028 1
+37 1039 1
+37 1040 1
+37 1041 1
+37 1042 1
+37 1043 1
+37 1044 1
+37 1045 1
+37 1046 1
+37 1047 1
+37 1048 1
+37 1059 1
+37 1060 1
+37 1061 1
+37 1062 1
+37 1063 1
+37 1074 1
+37 1075 1
+37 1076 1
+37 1077 1
+37 1078 1
+37 1079 1
+37 1080 1
+37 1081 1
+37 1082 1
+37 1083 1
+37 1094 1
+37 1095 1
+37 1096 1
+37 1097 1
+37 1098 1
+37 1099 1
+37 1100 1
+37 1101 1
+37 1102 1
+37 1103 1
+37 1114 1
+37 1115 1
+37 1116 1
+37 1117 1
+37 1118 1
+37 1119 1
+37 1120 1
+37 1121 1
+37 1122 1
+37 1123 1
+37 1255 1
+37 1261 1
+37 1262 1
+37 1263 1
+37 1264 1
+37 1265 1
+37 1276 1
+37 1277 1
+37 1278 1
+37 1279 1
+37 1280 1
+37 1291 1
+37 1292 1
+37 1293 1
+37 1294 1
+37 1295 1
+37 1296 1
+37 1297 1
+37 1298 1
+37 1299 1
+37 1300 1
+37 1311 1
+37 1312 1
+37 1313 1
+37 1314 1
+37 1315 1
+37 1326 1
+37 1327 1
+37 1328 1
+37 1329 1
+37 1330 1
+37 1331 1
+37 1332 1
+37 1333 1
+37 1334 1
+37 1335 1
+37 1346 1
+37 1347 1
+37 1348 1
+37 1349 1
+37 1350 1
+37 1351 1
+37 1352 1
+37 1353 1
+37 1354 1
+37 1355 1
+37 1366 1
+37 1367 1
+37 1368 1
+37 1369 1
+37 1370 1
+37 1371 1
+37 1372 1
+37 1373 1
+37 1374 1
+37 1375 1
+37 1507 1
+37 1508 1
+37 1509 1
+37 1510 1
+37 1511 1
+37 1522 1
+37 1523 1
+37 1524 1
+37 1525 1
+37 1526 1
+37 1527 1
+37 1528 1
+37 1529 1
+37 1530 1
+37 1531 1
+37 1542 1
+37 1543 1
+37 1544 1
+37 1545 1
+37 1546 1
+37 1547 1
+37 1548 1
+37 1549 1
+37 1550 1
+37 1551 1
+37 1562 1
+37 1563 1
+37 1564 1
+37 1565 1
+37 1566 1
+37 1567 1
+37 1568 1
+37 1569 1
+37 1570 1
+37 1571 1
+37 1577 1
+37 1578 1
+37 1579 1
+37 1580 1
+37 1581 1
+37 1582 1
+37 1583 1
+37 1584 1
+37 1585 1
+37 1586 1
+37 1597 1
+37 1598 1
+37 1599 1
+37 1600 1
+37 1601 1
+37 1602 1
+37 1603 1
+37 1604 1
+37 1605 1
+37 1606 1
+37 1612 1
+37 1613 1
+37 1614 1
+37 1615 1
+37 1616 1
+37 1617 1
+37 1618 1
+37 1619 1
+37 1620 1
+37 1621 1
+37 1627 1
+37 1628 1
+37 1629 1
+37 1630 1
+37 1631 1
+38 4 1
+38 11 1
+38 17 1
+38 22 1
+38 27 1
+38 28 1
+38 29 1
+38 30 1
+38 123 1
+38 129 1
+38 134 1
+38 139 1
+38 140 1
+38 141 1
+38 142 1
+38 150 1
+38 155 1
+38 160 1
+38 161 1
+38 162 1
+38 163 1
+38 170 1
+38 175 1
+38 176 1
+38 177 1
+38 178 1
+38 185 1
+38 186 1
+38 187 1
+38 188 1
+38 195 1
+38 196 1
+38 197 1
+38 198 1
+38 199 1
+38 200 1
+38 333 1
+38 339 1
+38 344 1
+38 349 1
+38 350 1
+38 351 1
+38 352 1
+38 360 1
+38 365 1
+38 370 1
+38 371 1
+38 372 1
+38 373 1
+38 380 1
+38 385 1
+38 386 1
+38 387 1
+38 388 1
+38 395 1
+38 396 1
+38 397 1
+38 398 1
+38 405 1
+38 406 1
+38 407 1
+38 408 1
+38 409 1
+38 410 1
+38 542 1
+38 547 1
+38 552 1
+38 553 1
+38 554 1
+38 555 1
+38 562 1
+38 567 1
+38 568 1
+38 569 1
+38 570 1
+38 577 1
+38 578 1
+38 579 1
+38 580 1
+38 587 1
+38 588 1
+38 589 1
+38 590 1
+38 591 1
+38 592 1
+38 597 1
+38 602 1
+38 603 1
+38 604 1
+38 605 1
+38 612 1
+38 613 1
+38 614 1
+38 615 1
+38 622 1
+38 623 1
+38 624 1
+38 625 1
+38 626 1
+38 627 1
+38 632 1
+38 633 1
+38 634 1
+38 635 1
+38 642 1
+38 643 1
+38 644 1
+38 645 1
+38 646 1
+38 647 1
+38 652 1
+38 653 1
+38 654 1
+38 655 1
+38 656 1
+38 657 1
+38 662 1
+38 663 1
+38 664 1
+38 665 1
+38 795 1
+38 801 1
+38 806 1
+38 811 1
+38 812 1
+38 813 1
+38 814 1
+38 822 1
+38 827 1
+38 832 1
+38 833 1
+38 834 1
+38 835 1
+38 842 1
+38 847 1
+38 848 1
+38 849 1
+38 850 1
+38 857 1
+38 858 1
+38 859 1
+38 860 1
+38 867 1
+38 868 1
+38 869 1
+38 870 1
+38 871 1
+38 872 1
+38 1004 1
+38 1009 1
+38 1014 1
+38 1015 1
+38 1016 1
+38 1017 1
+38 1024 1
+38 1029 1
+38 1030 1
+38 1031 1
+38 1032 1
+38 1039 1
+38 1040 1
+38 1041 1
+38 1042 1
+38 1049 1
+38 1050 1
+38 1051 1
+38 1052 1
+38 1053 1
+38 1054 1
+38 1059 1
+38 1064 1
+38 1065 1
+38 1066 1
+38 1067 1
+38 1074 1
+38 1075 1
+38 1076 1
+38 1077 1
+38 1084 1
+38 1085 1
+38 1086 1
+38 1087 1
+38 1088 1
+38 1089 1
+38 1094 1
+38 1095 1
+38 1096 1
+38 1097 1
+38 1104 1
+38 1105 1
+38 1106 1
+38 1107 1
+38 1108 1
+38 1109 1
+38 1114 1
+38 1115 1
+38 1116 1
+38 1117 1
+38 1118 1
+38 1119 1
+38 1124 1
+38 1125 1
+38 1126 1
+38 1127 1
+38 1256 1
+38 1261 1
+38 1266 1
+38 1267 1
+38 1268 1
+38 1269 1
+38 1276 1
+38 1281 1
+38 1282 1
+38 1283 1
+38 1284 1
+38 1291 1
+38 1292 1
+38 1293 1
+38 1294 1
+38 1301 1
+38 1302 1
+38 1303 1
+38 1304 1
+38 1305 1
+38 1306 1
+38 1311 1
+38 1316 1
+38 1317 1
+38 1318 1
+38 1319 1
+38 1326 1
+38 1327 1
+38 1328 1
+38 1329 1
+38 1336 1
+38 1337 1
+38 1338 1
+38 1339 1
+38 1340 1
+38 1341 1
+38 1346 1
+38 1347 1
+38 1348 1
+38 1349 1
+38 1356 1
+38 1357 1
+38 1358 1
+38 1359 1
+38 1360 1
+38 1361 1
+38 1366 1
+38 1367 1
+38 1368 1
+38 1369 1
+38 1370 1
+38 1371 1
+38 1376 1
+38 1377 1
+38 1378 1
+38 1379 1
+38 1507 1
+38 1512 1
+38 1513 1
+38 1514 1
+38 1515 1
+38 1522 1
+38 1523 1
+38 1524 1
+38 1525 1
+38 1532 1
+38 1533 1
+38 1534 1
+38 1535 1
+38 1536 1
+38 1537 1
+38 1542 1
+38 1543 1
+38 1544 1
+38 1545 1
+38 1552 1
+38 1553 1
+38 1554 1
+38 1555 1
+38 1556 1
+38 1557 1
+38 1562 1
+38 1563 1
+38 1564 1
+38 1565 1
+38 1566 1
+38 1567 1
+38 1572 1
+38 1573 1
+38 1574 1
+38 1575 1
+38 1577 1
+38 1578 1
+38 1579 1
+38 1580 1
+38 1587 1
+38 1588 1
+38 1589 1
+38 1590 1
+38 1591 1
+38 1592 1
+38 1597 1
+38 1598 1
+38 1599 1
+38 1600 1
+38 1601 1
+38 1602 1
+38 1607 1
+38 1608 1
+38 1609 1
+38 1610 1
+38 1612 1
+38 1613 1
+38 1614 1
+38 1615 1
+38 1616 1
+38 1617 1
+38 1622 1
+38 1623 1
+38 1624 1
+38 1625 1
+38 1627 1
+38 1628 1
+38 1629 1
+38 1630 1
+38 1632 1
+39 5 1
+39 12 1
+39 18 1
+39 23 1
+39 27 1
+39 31 1
+39 32 1
+39 33 1
+39 124 1
+39 130 1
+39 135 1
+39 139 1
+39 143 1
+39 144 1
+39 145 1
+39 151 1
+39 156 1
+39 160 1
+39 164 1
+39 165 1
+39 166 1
+39 171 1
+39 175 1
+39 179 1
+39 180 1
+39 181 1
+39 185 1
+39 189 1
+39 190 1
+39 191 1
+39 195 1
+39 196 1
+39 197 1
+39 201 1
+39 202 1
+39 203 1
+39 334 1
+39 340 1
+39 345 1
+39 349 1
+39 353 1
+39 354 1
+39 355 1
+39 361 1
+39 366 1
+39 370 1
+39 374 1
+39 375 1
+39 376 1
+39 381 1
+39 385 1
+39 389 1
+39 390 1
+39 391 1
+39 395 1
+39 399 1
+39 400 1
+39 401 1
+39 405 1
+39 406 1
+39 407 1
+39 411 1
+39 412 1
+39 413 1
+39 543 1
+39 548 1
+39 552 1
+39 556 1
+39 557 1
+39 558 1
+39 563 1
+39 567 1
+39 571 1
+39 572 1
+39 573 1
+39 577 1
+39 581 1
+39 582 1
+39 583 1
+39 587 1
+39 588 1
+39 589 1
+39 593 1
+39 594 1
+39 595 1
+39 598 1
+39 602 1
+39 606 1
+39 607 1
+39 608 1
+39 612 1
+39 616 1
+39 617 1
+39 618 1
+39 622 1
+39 623 1
+39 624 1
+39 628 1
+39 629 1
+39 630 1
+39 632 1
+39 636 1
+39 637 1
+39 638 1
+39 642 1
+39 643 1
+39 644 1
+39 648 1
+39 649 1
+39 650 1
+39 652 1
+39 653 1
+39 654 1
+39 658 1
+39 659 1
+39 660 1
+39 662 1
+39 663 1
+39 664 1
+39 666 1
+39 796 1
+39 802 1
+39 807 1
+39 811 1
+39 815 1
+39 816 1
+39 817 1
+39 823 1
+39 828 1
+39 832 1
+39 836 1
+39 837 1
+39 838 1
+39 843 1
+39 847 1
+39 851 1
+39 852 1
+39 853 1
+39 857 1
+39 861 1
+39 862 1
+39 863 1
+39 867 1
+39 868 1
+39 869 1
+39 873 1
+39 874 1
+39 875 1
+39 1005 1
+39 1010 1
+39 1014 1
+39 1018 1
+39 1019 1
+39 1020 1
+39 1025 1
+39 1029 1
+39 1033 1
+39 1034 1
+39 1035 1
+39 1039 1
+39 1043 1
+39 1044 1
+39 1045 1
+39 1049 1
+39 1050 1
+39 1051 1
+39 1055 1
+39 1056 1
+39 1057 1
+39 1060 1
+39 1064 1
+39 1068 1
+39 1069 1
+39 1070 1
+39 1074 1
+39 1078 1
+39 1079 1
+39 1080 1
+39 1084 1
+39 1085 1
+39 1086 1
+39 1090 1
+39 1091 1
+39 1092 1
+39 1094 1
+39 1098 1
+39 1099 1
+39 1100 1
+39 1104 1
+39 1105 1
+39 1106 1
+39 1110 1
+39 1111 1
+39 1112 1
+39 1114 1
+39 1115 1
+39 1116 1
+39 1120 1
+39 1121 1
+39 1122 1
+39 1124 1
+39 1125 1
+39 1126 1
+39 1128 1
+39 1257 1
+39 1262 1
+39 1266 1
+39 1270 1
+39 1271 1
+39 1272 1
+39 1277 1
+39 1281 1
+39 1285 1
+39 1286 1
+39 1287 1
+39 1291 1
+39 1295 1
+39 1296 1
+39 1297 1
+39 1301 1
+39 1302 1
+39 1303 1
+39 1307 1
+39 1308 1
+39 1309 1
+39 1312 1
+39 1316 1
+39 1320 1
+39 1321 1
+39 1322 1
+39 1326 1
+39 1330 1
+39 1331 1
+39 1332 1
+39 1336 1
+39 1337 1
+39 1338 1
+39 1342 1
+39 1343 1
+39 1344 1
+39 1346 1
+39 1350 1
+39 1351 1
+39 1352 1
+39 1356 1
+39 1357 1
+39 1358 1
+39 1362 1
+39 1363 1
+39 1364 1
+39 1366 1
+39 1367 1
+39 1368 1
+39 1372 1
+39 1373 1
+39 1374 1
+39 1376 1
+39 1377 1
+39 1378 1
+39 1380 1
+39 1508 1
+39 1512 1
+39 1516 1
+39 1517 1
+39 1518 1
+39 1522 1
+39 1526 1
+39 1527 1
+39 1528 1
+39 1532 1
+39 1533 1
+39 1534 1
+39 1538 1
+39 1539 1
+39 1540 1
+39 1542 1
+39 1546 1
+39 1547 1
+39 1548 1
+39 1552 1
+39 1553 1
+39 1554 1
+39 1558 1
+39 1559 1
+39 1560 1
+39 1562 1
+39 1563 1
+39 1564 1
+39 1568 1
+39 1569 1
+39 1570 1
+39 1572 1
+39 1573 1
+39 1574 1
+39 1576 1
+39 1577 1
+39 1581 1
+39 1582 1
+39 1583 1
+39 1587 1
+39 1588 1
+39 1589 1
+39 1593 1
+39 1594 1
+39 1595 1
+39 1597 1
+39 1598 1
+39 1599 1
+39 1603 1
+39 1604 1
+39 1605 1
+39 1607 1
+39 1608 1
+39 1609 1
+39 1611 1
+39 1612 1
+39 1613 1
+39 1614 1
+39 1618 1
+39 1619 1
+39 1620 1
+39 1622 1
+39 1623 1
+39 1624 1
+39 1626 1
+39 1627 1
+39 1628 1
+39 1629 1
+39 1631 1
+39 1632 1
+40 6 1
+40 13 1
+40 19 1
+40 24 1
+40 28 1
+40 31 1
+40 34 1
+40 35 1
+40 125 1
+40 131 1
+40 136 1
+40 140 1
+40 143 1
+40 146 1
+40 147 1
+40 152 1
+40 157 1
+40 161 1
+40 164 1
+40 167 1
+40 168 1
+40 172 1
+40 176 1
+40 179 1
+40 182 1
+40 183 1
+40 186 1
+40 189 1
+40 192 1
+40 193 1
+40 195 1
+40 198 1
+40 199 1
+40 201 1
+40 202 1
+40 204 1
+40 335 1
+40 341 1
+40 346 1
+40 350 1
+40 353 1
+40 356 1
+40 357 1
+40 362 1
+40 367 1
+40 371 1
+40 374 1
+40 377 1
+40 378 1
+40 382 1
+40 386 1
+40 389 1
+40 392 1
+40 393 1
+40 396 1
+40 399 1
+40 402 1
+40 403 1
+40 405 1
+40 408 1
+40 409 1
+40 411 1
+40 412 1
+40 414 1
+40 544 1
+40 549 1
+40 553 1
+40 556 1
+40 559 1
+40 560 1
+40 564 1
+40 568 1
+40 571 1
+40 574 1
+40 575 1
+40 578 1
+40 581 1
+40 584 1
+40 585 1
+40 587 1
+40 590 1
+40 591 1
+40 593 1
+40 594 1
+40 596 1
+40 599 1
+40 603 1
+40 606 1
+40 609 1
+40 610 1
+40 613 1
+40 616 1
+40 619 1
+40 620 1
+40 622 1
+40 625 1
+40 626 1
+40 628 1
+40 629 1
+40 631 1
+40 633 1
+40 636 1
+40 639 1
+40 640 1
+40 642 1
+40 645 1
+40 646 1
+40 648 1
+40 649 1
+40 651 1
+40 652 1
+40 655 1
+40 656 1
+40 658 1
+40 659 1
+40 661 1
+40 662 1
+40 663 1
+40 665 1
+40 666 1
+40 797 1
+40 803 1
+40 808 1
+40 812 1
+40 815 1
+40 818 1
+40 819 1
+40 824 1
+40 829 1
+40 833 1
+40 836 1
+40 839 1
+40 840 1
+40 844 1
+40 848 1
+40 851 1
+40 854 1
+40 855 1
+40 858 1
+40 861 1
+40 864 1
+40 865 1
+40 867 1
+40 870 1
+40 871 1
+40 873 1
+40 874 1
+40 876 1
+40 1006 1
+40 1011 1
+40 1015 1
+40 1018 1
+40 1021 1
+40 1022 1
+40 1026 1
+40 1030 1
+40 1033 1
+40 1036 1
+40 1037 1
+40 1040 1
+40 1043 1
+40 1046 1
+40 1047 1
+40 1049 1
+40 1052 1
+40 1053 1
+40 1055 1
+40 1056 1
+40 1058 1
+40 1061 1
+40 1065 1
+40 1068 1
+40 1071 1
+40 1072 1
+40 1075 1
+40 1078 1
+40 1081 1
+40 1082 1
+40 1084 1
+40 1087 1
+40 1088 1
+40 1090 1
+40 1091 1
+40 1093 1
+40 1095 1
+40 1098 1
+40 1101 1
+40 1102 1
+40 1104 1
+40 1107 1
+40 1108 1
+40 1110 1
+40 1111 1
+40 1113 1
+40 1114 1
+40 1117 1
+40 1118 1
+40 1120 1
+40 1121 1
+40 1123 1
+40 1124 1
+40 1125 1
+40 1127 1
+40 1128 1
+40 1258 1
+40 1263 1
+40 1267 1
+40 1270 1
+40 1273 1
+40 1274 1
+40 1278 1
+40 1282 1
+40 1285 1
+40 1288 1
+40 1289 1
+40 1292 1
+40 1295 1
+40 1298 1
+40 1299 1
+40 1301 1
+40 1304 1
+40 1305 1
+40 1307 1
+40 1308 1
+40 1310 1
+40 1313 1
+40 1317 1
+40 1320 1
+40 1323 1
+40 1324 1
+40 1327 1
+40 1330 1
+40 1333 1
+40 1334 1
+40 1336 1
+40 1339 1
+40 1340 1
+40 1342 1
+40 1343 1
+40 1345 1
+40 1347 1
+40 1350 1
+40 1353 1
+40 1354 1
+40 1356 1
+40 1359 1
+40 1360 1
+40 1362 1
+40 1363 1
+40 1365 1
+40 1366 1
+40 1369 1
+40 1370 1
+40 1372 1
+40 1373 1
+40 1375 1
+40 1376 1
+40 1377 1
+40 1379 1
+40 1380 1
+40 1509 1
+40 1513 1
+40 1516 1
+40 1519 1
+40 1520 1
+40 1523 1
+40 1526 1
+40 1529 1
+40 1530 1
+40 1532 1
+40 1535 1
+40 1536 1
+40 1538 1
+40 1539 1
+40 1541 1
+40 1543 1
+40 1546 1
+40 1549 1
+40 1550 1
+40 1552 1
+40 1555 1
+40 1556 1
+40 1558 1
+40 1559 1
+40 1561 1
+40 1562 1
+40 1565 1
+40 1566 1
+40 1568 1
+40 1569 1
+40 1571 1
+40 1572 1
+40 1573 1
+40 1575 1
+40 1576 1
+40 1578 1
+40 1581 1
+40 1584 1
+40 1585 1
+40 1587 1
+40 1590 1
+40 1591 1
+40 1593 1
+40 1594 1
+40 1596 1
+40 1597 1
+40 1600 1
+40 1601 1
+40 1603 1
+40 1604 1
+40 1606 1
+40 1607 1
+40 1608 1
+40 1610 1
+40 1611 1
+40 1612 1
+40 1615 1
+40 1616 1
+40 1618 1
+40 1619 1
+40 1621 1
+40 1622 1
+40 1623 1
+40 1625 1
+40 1626 1
+40 1627 1
+40 1628 1
+40 1630 1
+40 1631 1
+40 1632 1
+41 7 1
+41 14 1
+41 20 1
+41 25 1
+41 29 1
+41 32 1
+41 34 1
+41 36 1
+41 126 1
+41 132 1
+41 137 1
+41 141 1
+41 144 1
+41 146 1
+41 148 1
+41 153 1
+41 158 1
+41 162 1
+41 165 1
+41 167 1
+41 169 1
+41 173 1
+41 177 1
+41 180 1
+41 182 1
+41 184 1
+41 187 1
+41 190 1
+41 192 1
+41 194 1
+41 196 1
+41 198 1
+41 200 1
+41 201 1
+41 203 1
+41 204 1
+41 336 1
+41 342 1
+41 347 1
+41 351 1
+41 354 1
+41 356 1
+41 358 1
+41 363 1
+41 368 1
+41 372 1
+41 375 1
+41 377 1
+41 379 1
+41 383 1
+41 387 1
+41 390 1
+41 392 1
+41 394 1
+41 397 1
+41 400 1
+41 402 1
+41 404 1
+41 406 1
+41 408 1
+41 410 1
+41 411 1
+41 413 1
+41 414 1
+41 545 1
+41 550 1
+41 554 1
+41 557 1
+41 559 1
+41 561 1
+41 565 1
+41 569 1
+41 572 1
+41 574 1
+41 576 1
+41 579 1
+41 582 1
+41 584 1
+41 586 1
+41 588 1
+41 590 1
+41 592 1
+41 593 1
+41 595 1
+41 596 1
+41 600 1
+41 604 1
+41 607 1
+41 609 1
+41 611 1
+41 614 1
+41 617 1
+41 619 1
+41 621 1
+41 623 1
+41 625 1
+41 627 1
+41 628 1
+41 630 1
+41 631 1
+41 634 1
+41 637 1
+41 639 1
+41 641 1
+41 643 1
+41 645 1
+41 647 1
+41 648 1
+41 650 1
+41 651 1
+41 653 1
+41 655 1
+41 657 1
+41 658 1
+41 660 1
+41 661 1
+41 662 1
+41 664 1
+41 665 1
+41 666 1
+41 798 1
+41 804 1
+41 809 1
+41 813 1
+41 816 1
+41 818 1
+41 820 1
+41 825 1
+41 830 1
+41 834 1
+41 837 1
+41 839 1
+41 841 1
+41 845 1
+41 849 1
+41 852 1
+41 854 1
+41 856 1
+41 859 1
+41 862 1
+41 864 1
+41 866 1
+41 868 1
+41 870 1
+41 872 1
+41 873 1
+41 875 1
+41 876 1
+41 1007 1
+41 1012 1
+41 1016 1
+41 1019 1
+41 1021 1
+41 1023 1
+41 1027 1
+41 1031 1
+41 1034 1
+41 1036 1
+41 1038 1
+41 1041 1
+41 1044 1
+41 1046 1
+41 1048 1
+41 1050 1
+41 1052 1
+41 1054 1
+41 1055 1
+41 1057 1
+41 1058 1
+41 1062 1
+41 1066 1
+41 1069 1
+41 1071 1
+41 1073 1
+41 1076 1
+41 1079 1
+41 1081 1
+41 1083 1
+41 1085 1
+41 1087 1
+41 1089 1
+41 1090 1
+41 1092 1
+41 1093 1
+41 1096 1
+41 1099 1
+41 1101 1
+41 1103 1
+41 1105 1
+41 1107 1
+41 1109 1
+41 1110 1
+41 1112 1
+41 1113 1
+41 1115 1
+41 1117 1
+41 1119 1
+41 1120 1
+41 1122 1
+41 1123 1
+41 1124 1
+41 1126 1
+41 1127 1
+41 1128 1
+41 1259 1
+41 1264 1
+41 1268 1
+41 1271 1
+41 1273 1
+41 1275 1
+41 1279 1
+41 1283 1
+41 1286 1
+41 1288 1
+41 1290 1
+41 1293 1
+41 1296 1
+41 1298 1
+41 1300 1
+41 1302 1
+41 1304 1
+41 1306 1
+41 1307 1
+41 1309 1
+41 1310 1
+41 1314 1
+41 1318 1
+41 1321 1
+41 1323 1
+41 1325 1
+41 1328 1
+41 1331 1
+41 1333 1
+41 1335 1
+41 1337 1
+41 1339 1
+41 1341 1
+41 1342 1
+41 1344 1
+41 1345 1
+41 1348 1
+41 1351 1
+41 1353 1
+41 1355 1
+41 1357 1
+41 1359 1
+41 1361 1
+41 1362 1
+41 1364 1
+41 1365 1
+41 1367 1
+41 1369 1
+41 1371 1
+41 1372 1
+41 1374 1
+41 1375 1
+41 1376 1
+41 1378 1
+41 1379 1
+41 1380 1
+41 1510 1
+41 1514 1
+41 1517 1
+41 1519 1
+41 1521 1
+41 1524 1
+41 1527 1
+41 1529 1
+41 1531 1
+41 1533 1
+41 1535 1
+41 1537 1
+41 1538 1
+41 1540 1
+41 1541 1
+41 1544 1
+41 1547 1
+41 1549 1
+41 1551 1
+41 1553 1
+41 1555 1
+41 1557 1
+41 1558 1
+41 1560 1
+41 1561 1
+41 1563 1
+41 1565 1
+41 1567 1
+41 1568 1
+41 1570 1
+41 1571 1
+41 1572 1
+41 1574 1
+41 1575 1
+41 1576 1
+41 1579 1
+41 1582 1
+41 1584 1
+41 1586 1
+41 1588 1
+41 1590 1
+41 1592 1
+41 1593 1
+41 1595 1
+41 1596 1
+41 1598 1
+41 1600 1
+41 1602 1
+41 1603 1
+41 1605 1
+41 1606 1
+41 1607 1
+41 1609 1
+41 1610 1
+41 1611 1
+41 1613 1
+41 1615 1
+41 1617 1
+41 1618 1
+41 1620 1
+41 1621 1
+41 1622 1
+41 1624 1
+41 1625 1
+41 1626 1
+41 1627 1
+41 1629 1
+41 1630 1
+41 1631 1
+41 1632 1
+42 8 1
+42 15 1
+42 21 1
+42 26 1
+42 30 1
+42 33 1
+42 35 1
+42 36 1
+42 127 1
+42 133 1
+42 138 1
+42 142 1
+42 145 1
+42 147 1
+42 148 1
+42 154 1
+42 159 1
+42 163 1
+42 166 1
+42 168 1
+42 169 1
+42 174 1
+42 178 1
+42 181 1
+42 183 1
+42 184 1
+42 188 1
+42 191 1
+42 193 1
+42 194 1
+42 197 1
+42 199 1
+42 200 1
+42 202 1
+42 203 1
+42 204 1
+42 337 1
+42 343 1
+42 348 1
+42 352 1
+42 355 1
+42 357 1
+42 358 1
+42 364 1
+42 369 1
+42 373 1
+42 376 1
+42 378 1
+42 379 1
+42 384 1
+42 388 1
+42 391 1
+42 393 1
+42 394 1
+42 398 1
+42 401 1
+42 403 1
+42 404 1
+42 407 1
+42 409 1
+42 410 1
+42 412 1
+42 413 1
+42 414 1
+42 546 1
+42 551 1
+42 555 1
+42 558 1
+42 560 1
+42 561 1
+42 566 1
+42 570 1
+42 573 1
+42 575 1
+42 576 1
+42 580 1
+42 583 1
+42 585 1
+42 586 1
+42 589 1
+42 591 1
+42 592 1
+42 594 1
+42 595 1
+42 596 1
+42 601 1
+42 605 1
+42 608 1
+42 610 1
+42 611 1
+42 615 1
+42 618 1
+42 620 1
+42 621 1
+42 624 1
+42 626 1
+42 627 1
+42 629 1
+42 630 1
+42 631 1
+42 635 1
+42 638 1
+42 640 1
+42 641 1
+42 644 1
+42 646 1
+42 647 1
+42 649 1
+42 650 1
+42 651 1
+42 654 1
+42 656 1
+42 657 1
+42 659 1
+42 660 1
+42 661 1
+42 663 1
+42 664 1
+42 665 1
+42 666 1
+42 799 1
+42 805 1
+42 810 1
+42 814 1
+42 817 1
+42 819 1
+42 820 1
+42 826 1
+42 831 1
+42 835 1
+42 838 1
+42 840 1
+42 841 1
+42 846 1
+42 850 1
+42 853 1
+42 855 1
+42 856 1
+42 860 1
+42 863 1
+42 865 1
+42 866 1
+42 869 1
+42 871 1
+42 872 1
+42 874 1
+42 875 1
+42 876 1
+42 1008 1
+42 1013 1
+42 1017 1
+42 1020 1
+42 1022 1
+42 1023 1
+42 1028 1
+42 1032 1
+42 1035 1
+42 1037 1
+42 1038 1
+42 1042 1
+42 1045 1
+42 1047 1
+42 1048 1
+42 1051 1
+42 1053 1
+42 1054 1
+42 1056 1
+42 1057 1
+42 1058 1
+42 1063 1
+42 1067 1
+42 1070 1
+42 1072 1
+42 1073 1
+42 1077 1
+42 1080 1
+42 1082 1
+42 1083 1
+42 1086 1
+42 1088 1
+42 1089 1
+42 1091 1
+42 1092 1
+42 1093 1
+42 1097 1
+42 1100 1
+42 1102 1
+42 1103 1
+42 1106 1
+42 1108 1
+42 1109 1
+42 1111 1
+42 1112 1
+42 1113 1
+42 1116 1
+42 1118 1
+42 1119 1
+42 1121 1
+42 1122 1
+42 1123 1
+42 1125 1
+42 1126 1
+42 1127 1
+42 1128 1
+42 1260 1
+42 1265 1
+42 1269 1
+42 1272 1
+42 1274 1
+42 1275 1
+42 1280 1
+42 1284 1
+42 1287 1
+42 1289 1
+42 1290 1
+42 1294 1
+42 1297 1
+42 1299 1
+42 1300 1
+42 1303 1
+42 1305 1
+42 1306 1
+42 1308 1
+42 1309 1
+42 1310 1
+42 1315 1
+42 1319 1
+42 1322 1
+42 1324 1
+42 1325 1
+42 1329 1
+42 1332 1
+42 1334 1
+42 1335 1
+42 1338 1
+42 1340 1
+42 1341 1
+42 1343 1
+42 1344 1
+42 1345 1
+42 1349 1
+42 1352 1
+42 1354 1
+42 1355 1
+42 1358 1
+42 1360 1
+42 1361 1
+42 1363 1
+42 1364 1
+42 1365 1
+42 1368 1
+42 1370 1
+42 1371 1
+42 1373 1
+42 1374 1
+42 1375 1
+42 1377 1
+42 1378 1
+42 1379 1
+42 1380 1
+42 1511 1
+42 1515 1
+42 1518 1
+42 1520 1
+42 1521 1
+42 1525 1
+42 1528 1
+42 1530 1
+42 1531 1
+42 1534 1
+42 1536 1
+42 1537 1
+42 1539 1
+42 1540 1
+42 1541 1
+42 1545 1
+42 1548 1
+42 1550 1
+42 1551 1
+42 1554 1
+42 1556 1
+42 1557 1
+42 1559 1
+42 1560 1
+42 1561 1
+42 1564 1
+42 1566 1
+42 1567 1
+42 1569 1
+42 1570 1
+42 1571 1
+42 1573 1
+42 1574 1
+42 1575 1
+42 1576 1
+42 1580 1
+42 1583 1
+42 1585 1
+42 1586 1
+42 1589 1
+42 1591 1
+42 1592 1
+42 1594 1
+42 1595 1
+42 1596 1
+42 1599 1
+42 1601 1
+42 1602 1
+42 1604 1
+42 1605 1
+42 1606 1
+42 1608 1
+42 1609 1
+42 1610 1
+42 1611 1
+42 1614 1
+42 1616 1
+42 1617 1
+42 1619 1
+42 1620 1
+42 1621 1
+42 1623 1
+42 1624 1
+42 1625 1
+42 1626 1
+42 1628 1
+42 1629 1
+42 1630 1
+42 1631 1
+42 1632 1
+43 1 1
+43 37 1
+43 38 1
+43 39 1
+43 40 1
+43 41 1
+43 42 1
+43 43 1
+43 121 1
+43 122 1
+43 123 1
+43 124 1
+43 125 1
+43 126 1
+43 127 1
+43 205 1
+43 206 1
+43 207 1
+43 208 1
+43 209 1
+43 210 1
+43 211 1
+43 212 1
+43 213 1
+43 214 1
+43 215 1
+43 216 1
+43 217 1
+43 218 1
+43 219 1
+43 220 1
+43 221 1
+43 222 1
+43 223 1
+43 224 1
+43 225 1
+43 331 1
+43 332 1
+43 333 1
+43 334 1
+43 335 1
+43 336 1
+43 337 1
+43 415 1
+43 416 1
+43 417 1
+43 418 1
+43 419 1
+43 420 1
+43 421 1
+43 422 1
+43 423 1
+43 424 1
+43 425 1
+43 426 1
+43 427 1
+43 428 1
+43 429 1
+43 430 1
+43 431 1
+43 432 1
+43 433 1
+43 434 1
+43 435 1
+43 541 1
+43 542 1
+43 543 1
+43 544 1
+43 545 1
+43 546 1
+43 547 1
+43 548 1
+43 549 1
+43 550 1
+43 551 1
+43 552 1
+43 553 1
+43 554 1
+43 555 1
+43 556 1
+43 557 1
+43 558 1
+43 559 1
+43 560 1
+43 561 1
+43 667 1
+43 668 1
+43 669 1
+43 670 1
+43 671 1
+43 672 1
+43 673 1
+43 674 1
+43 675 1
+43 676 1
+43 677 1
+43 678 1
+43 679 1
+43 680 1
+43 681 1
+43 682 1
+43 683 1
+43 684 1
+43 685 1
+43 686 1
+43 687 1
+43 688 1
+43 689 1
+43 690 1
+43 691 1
+43 692 1
+43 693 1
+43 694 1
+43 695 1
+43 696 1
+43 697 1
+43 698 1
+43 699 1
+43 700 1
+43 701 1
+43 793 1
+43 794 1
+43 795 1
+43 796 1
+43 797 1
+43 798 1
+43 799 1
+43 877 1
+43 878 1
+43 879 1
+43 880 1
+43 881 1
+43 882 1
+43 883 1
+43 884 1
+43 885 1
+43 886 1
+43 887 1
+43 888 1
+43 889 1
+43 890 1
+43 891 1
+43 892 1
+43 893 1
+43 894 1
+43 895 1
+43 896 1
+43 897 1
+43 1003 1
+43 1004 1
+43 1005 1
+43 1006 1
+43 1007 1
+43 1008 1
+43 1009 1
+43 1010 1
+43 1011 1
+43 1012 1
+43 1013 1
+43 1014 1
+43 1015 1
+43 1016 1
+43 1017 1
+43 1018 1
+43 1019 1
+43 1020 1
+43 1021 1
+43 1022 1
+43 1023 1
+43 1129 1
+43 1130 1
+43 1131 1
+43 1132 1
+43 1133 1
+43 1134 1
+43 1135 1
+43 1136 1
+43 1137 1
+43 1138 1
+43 1139 1
+43 1140 1
+43 1141 1
+43 1142 1
+43 1143 1
+43 1144 1
+43 1145 1
+43 1146 1
+43 1147 1
+43 1148 1
+43 1149 1
+43 1150 1
+43 1151 1
+43 1152 1
+43 1153 1
+43 1154 1
+43 1155 1
+43 1156 1
+43 1157 1
+43 1158 1
+43 1159 1
+43 1160 1
+43 1161 1
+43 1162 1
+43 1163 1
+43 1255 1
+43 1256 1
+43 1257 1
+43 1258 1
+43 1259 1
+43 1260 1
+43 1261 1
+43 1262 1
+43 1263 1
+43 1264 1
+43 1265 1
+43 1266 1
+43 1267 1
+43 1268 1
+43 1269 1
+43 1270 1
+43 1271 1
+43 1272 1
+43 1273 1
+43 1274 1
+43 1275 1
+43 1381 1
+43 1382 1
+43 1383 1
+43 1384 1
+43 1385 1
+43 1386 1
+43 1387 1
+43 1388 1
+43 1389 1
+43 1390 1
+43 1391 1
+43 1392 1
+43 1393 1
+43 1394 1
+43 1395 1
+43 1396 1
+43 1397 1
+43 1398 1
+43 1399 1
+43 1400 1
+43 1401 1
+43 1402 1
+43 1403 1
+43 1404 1
+43 1405 1
+43 1406 1
+43 1407 1
+43 1408 1
+43 1409 1
+43 1410 1
+43 1411 1
+43 1412 1
+43 1413 1
+43 1414 1
+43 1415 1
+43 1507 1
+43 1508 1
+43 1509 1
+43 1510 1
+43 1511 1
+43 1512 1
+43 1513 1
+43 1514 1
+43 1515 1
+43 1516 1
+43 1517 1
+43 1518 1
+43 1519 1
+43 1520 1
+43 1521 1
+43 1522 1
+43 1523 1
+43 1524 1
+43 1525 1
+43 1526 1
+43 1527 1
+43 1528 1
+43 1529 1
+43 1530 1
+43 1531 1
+43 1532 1
+43 1533 1
+43 1534 1
+43 1535 1
+43 1536 1
+43 1537 1
+43 1538 1
+43 1539 1
+43 1540 1
+43 1541 1
+43 1633 1
+43 1634 1
+43 1635 1
+43 1636 1
+43 1637 1
+43 1638 1
+43 1639 1
+43 1640 1
+43 1641 1
+43 1642 1
+43 1643 1
+43 1644 1
+43 1645 1
+43 1646 1
+43 1647 1
+43 1648 1
+43 1649 1
+43 1650 1
+43 1651 1
+43 1652 1
+43 1653 1
+43 1654 1
+43 1655 1
+43 1656 1
+43 1657 1
+43 1658 1
+43 1659 1
+43 1660 1
+43 1661 1
+43 1662 1
+43 1663 1
+43 1664 1
+43 1665 1
+43 1666 1
+43 1667 1
+44 2 1
+44 37 1
+44 44 1
+44 45 1
+44 46 1
+44 47 1
+44 48 1
+44 49 1
+44 121 1
+44 128 1
+44 129 1
+44 130 1
+44 131 1
+44 132 1
+44 133 1
+44 205 1
+44 206 1
+44 207 1
+44 208 1
+44 209 1
+44 210 1
+44 226 1
+44 227 1
+44 228 1
+44 229 1
+44 230 1
+44 231 1
+44 232 1
+44 233 1
+44 234 1
+44 235 1
+44 236 1
+44 237 1
+44 238 1
+44 239 1
+44 240 1
+44 331 1
+44 338 1
+44 339 1
+44 340 1
+44 341 1
+44 342 1
+44 343 1
+44 415 1
+44 416 1
+44 417 1
+44 418 1
+44 419 1
+44 420 1
+44 436 1
+44 437 1
+44 438 1
+44 439 1
+44 440 1
+44 441 1
+44 442 1
+44 443 1
+44 444 1
+44 445 1
+44 446 1
+44 447 1
+44 448 1
+44 449 1
+44 450 1
+44 541 1
+44 542 1
+44 543 1
+44 544 1
+44 545 1
+44 546 1
+44 562 1
+44 563 1
+44 564 1
+44 565 1
+44 566 1
+44 567 1
+44 568 1
+44 569 1
+44 570 1
+44 571 1
+44 572 1
+44 573 1
+44 574 1
+44 575 1
+44 576 1
+44 667 1
+44 668 1
+44 669 1
+44 670 1
+44 671 1
+44 672 1
+44 673 1
+44 674 1
+44 675 1
+44 676 1
+44 677 1
+44 678 1
+44 679 1
+44 680 1
+44 681 1
+44 702 1
+44 703 1
+44 704 1
+44 705 1
+44 706 1
+44 707 1
+44 708 1
+44 709 1
+44 710 1
+44 711 1
+44 712 1
+44 713 1
+44 714 1
+44 715 1
+44 716 1
+44 717 1
+44 718 1
+44 719 1
+44 720 1
+44 721 1
+44 793 1
+44 800 1
+44 801 1
+44 802 1
+44 803 1
+44 804 1
+44 805 1
+44 877 1
+44 878 1
+44 879 1
+44 880 1
+44 881 1
+44 882 1
+44 898 1
+44 899 1
+44 900 1
+44 901 1
+44 902 1
+44 903 1
+44 904 1
+44 905 1
+44 906 1
+44 907 1
+44 908 1
+44 909 1
+44 910 1
+44 911 1
+44 912 1
+44 1003 1
+44 1004 1
+44 1005 1
+44 1006 1
+44 1007 1
+44 1008 1
+44 1024 1
+44 1025 1
+44 1026 1
+44 1027 1
+44 1028 1
+44 1029 1
+44 1030 1
+44 1031 1
+44 1032 1
+44 1033 1
+44 1034 1
+44 1035 1
+44 1036 1
+44 1037 1
+44 1038 1
+44 1129 1
+44 1130 1
+44 1131 1
+44 1132 1
+44 1133 1
+44 1134 1
+44 1135 1
+44 1136 1
+44 1137 1
+44 1138 1
+44 1139 1
+44 1140 1
+44 1141 1
+44 1142 1
+44 1143 1
+44 1164 1
+44 1165 1
+44 1166 1
+44 1167 1
+44 1168 1
+44 1169 1
+44 1170 1
+44 1171 1
+44 1172 1
+44 1173 1
+44 1174 1
+44 1175 1
+44 1176 1
+44 1177 1
+44 1178 1
+44 1179 1
+44 1180 1
+44 1181 1
+44 1182 1
+44 1183 1
+44 1255 1
+44 1256 1
+44 1257 1
+44 1258 1
+44 1259 1
+44 1260 1
+44 1276 1
+44 1277 1
+44 1278 1
+44 1279 1
+44 1280 1
+44 1281 1
+44 1282 1
+44 1283 1
+44 1284 1
+44 1285 1
+44 1286 1
+44 1287 1
+44 1288 1
+44 1289 1
+44 1290 1
+44 1381 1
+44 1382 1
+44 1383 1
+44 1384 1
+44 1385 1
+44 1386 1
+44 1387 1
+44 1388 1
+44 1389 1
+44 1390 1
+44 1391 1
+44 1392 1
+44 1393 1
+44 1394 1
+44 1395 1
+44 1416 1
+44 1417 1
+44 1418 1
+44 1419 1
+44 1420 1
+44 1421 1
+44 1422 1
+44 1423 1
+44 1424 1
+44 1425 1
+44 1426 1
+44 1427 1
+44 1428 1
+44 1429 1
+44 1430 1
+44 1431 1
+44 1432 1
+44 1433 1
+44 1434 1
+44 1435 1
+44 1507 1
+44 1508 1
+44 1509 1
+44 1510 1
+44 1511 1
+44 1512 1
+44 1513 1
+44 1514 1
+44 1515 1
+44 1516 1
+44 1517 1
+44 1518 1
+44 1519 1
+44 1520 1
+44 1521 1
+44 1542 1
+44 1543 1
+44 1544 1
+44 1545 1
+44 1546 1
+44 1547 1
+44 1548 1
+44 1549 1
+44 1550 1
+44 1551 1
+44 1552 1
+44 1553 1
+44 1554 1
+44 1555 1
+44 1556 1
+44 1557 1
+44 1558 1
+44 1559 1
+44 1560 1
+44 1561 1
+44 1633 1
+44 1634 1
+44 1635 1
+44 1636 1
+44 1637 1
+44 1638 1
+44 1639 1
+44 1640 1
+44 1641 1
+44 1642 1
+44 1643 1
+44 1644 1
+44 1645 1
+44 1646 1
+44 1647 1
+44 1648 1
+44 1649 1
+44 1650 1
+44 1651 1
+44 1652 1
+44 1668 1
+44 1669 1
+44 1670 1
+44 1671 1
+44 1672 1
+44 1673 1
+44 1674 1
+44 1675 1
+44 1676 1
+44 1677 1
+44 1678 1
+44 1679 1
+44 1680 1
+44 1681 1
+44 1682 1
+45 3 1
+45 38 1
+45 44 1
+45 50 1
+45 51 1
+45 52 1
+45 53 1
+45 54 1
+45 122 1
+45 128 1
+45 134 1
+45 135 1
+45 136 1
+45 137 1
+45 138 1
+45 205 1
+45 211 1
+45 212 1
+45 213 1
+45 214 1
+45 215 1
+45 226 1
+45 227 1
+45 228 1
+45 229 1
+45 230 1
+45 241 1
+45 242 1
+45 243 1
+45 244 1
+45 245 1
+45 246 1
+45 247 1
+45 248 1
+45 249 1
+45 250 1
+45 332 1
+45 338 1
+45 344 1
+45 345 1
+45 346 1
+45 347 1
+45 348 1
+45 415 1
+45 421 1
+45 422 1
+45 423 1
+45 424 1
+45 425 1
+45 436 1
+45 437 1
+45 438 1
+45 439 1
+45 440 1
+45 451 1
+45 452 1
+45 453 1
+45 454 1
+45 455 1
+45 456 1
+45 457 1
+45 458 1
+45 459 1
+45 460 1
+45 541 1
+45 547 1
+45 548 1
+45 549 1
+45 550 1
+45 551 1
+45 562 1
+45 563 1
+45 564 1
+45 565 1
+45 566 1
+45 577 1
+45 578 1
+45 579 1
+45 580 1
+45 581 1
+45 582 1
+45 583 1
+45 584 1
+45 585 1
+45 586 1
+45 667 1
+45 668 1
+45 669 1
+45 670 1
+45 671 1
+45 682 1
+45 683 1
+45 684 1
+45 685 1
+45 686 1
+45 687 1
+45 688 1
+45 689 1
+45 690 1
+45 691 1
+45 702 1
+45 703 1
+45 704 1
+45 705 1
+45 706 1
+45 707 1
+45 708 1
+45 709 1
+45 710 1
+45 711 1
+45 722 1
+45 723 1
+45 724 1
+45 725 1
+45 726 1
+45 727 1
+45 728 1
+45 729 1
+45 730 1
+45 731 1
+45 794 1
+45 800 1
+45 806 1
+45 807 1
+45 808 1
+45 809 1
+45 810 1
+45 877 1
+45 883 1
+45 884 1
+45 885 1
+45 886 1
+45 887 1
+45 898 1
+45 899 1
+45 900 1
+45 901 1
+45 902 1
+45 913 1
+45 914 1
+45 915 1
+45 916 1
+45 917 1
+45 918 1
+45 919 1
+45 920 1
+45 921 1
+45 922 1
+45 1003 1
+45 1009 1
+45 1010 1
+45 1011 1
+45 1012 1
+45 1013 1
+45 1024 1
+45 1025 1
+45 1026 1
+45 1027 1
+45 1028 1
+45 1039 1
+45 1040 1
+45 1041 1
+45 1042 1
+45 1043 1
+45 1044 1
+45 1045 1
+45 1046 1
+45 1047 1
+45 1048 1
+45 1129 1
+45 1130 1
+45 1131 1
+45 1132 1
+45 1133 1
+45 1144 1
+45 1145 1
+45 1146 1
+45 1147 1
+45 1148 1
+45 1149 1
+45 1150 1
+45 1151 1
+45 1152 1
+45 1153 1
+45 1164 1
+45 1165 1
+45 1166 1
+45 1167 1
+45 1168 1
+45 1169 1
+45 1170 1
+45 1171 1
+45 1172 1
+45 1173 1
+45 1184 1
+45 1185 1
+45 1186 1
+45 1187 1
+45 1188 1
+45 1189 1
+45 1190 1
+45 1191 1
+45 1192 1
+45 1193 1
+45 1255 1
+45 1261 1
+45 1262 1
+45 1263 1
+45 1264 1
+45 1265 1
+45 1276 1
+45 1277 1
+45 1278 1
+45 1279 1
+45 1280 1
+45 1291 1
+45 1292 1
+45 1293 1
+45 1294 1
+45 1295 1
+45 1296 1
+45 1297 1
+45 1298 1
+45 1299 1
+45 1300 1
+45 1381 1
+45 1382 1
+45 1383 1
+45 1384 1
+45 1385 1
+45 1396 1
+45 1397 1
+45 1398 1
+45 1399 1
+45 1400 1
+45 1401 1
+45 1402 1
+45 1403 1
+45 1404 1
+45 1405 1
+45 1416 1
+45 1417 1
+45 1418 1
+45 1419 1
+45 1420 1
+45 1421 1
+45 1422 1
+45 1423 1
+45 1424 1
+45 1425 1
+45 1436 1
+45 1437 1
+45 1438 1
+45 1439 1
+45 1440 1
+45 1441 1
+45 1442 1
+45 1443 1
+45 1444 1
+45 1445 1
+45 1507 1
+45 1508 1
+45 1509 1
+45 1510 1
+45 1511 1
+45 1522 1
+45 1523 1
+45 1524 1
+45 1525 1
+45 1526 1
+45 1527 1
+45 1528 1
+45 1529 1
+45 1530 1
+45 1531 1
+45 1542 1
+45 1543 1
+45 1544 1
+45 1545 1
+45 1546 1
+45 1547 1
+45 1548 1
+45 1549 1
+45 1550 1
+45 1551 1
+45 1562 1
+45 1563 1
+45 1564 1
+45 1565 1
+45 1566 1
+45 1567 1
+45 1568 1
+45 1569 1
+45 1570 1
+45 1571 1
+45 1633 1
+45 1634 1
+45 1635 1
+45 1636 1
+45 1637 1
+45 1638 1
+45 1639 1
+45 1640 1
+45 1641 1
+45 1642 1
+45 1653 1
+45 1654 1
+45 1655 1
+45 1656 1
+45 1657 1
+45 1658 1
+45 1659 1
+45 1660 1
+45 1661 1
+45 1662 1
+45 1668 1
+45 1669 1
+45 1670 1
+45 1671 1
+45 1672 1
+45 1673 1
+45 1674 1
+45 1675 1
+45 1676 1
+45 1677 1
+45 1683 1
+45 1684 1
+45 1685 1
+45 1686 1
+45 1687 1
+46 4 1
+46 39 1
+46 45 1
+46 50 1
+46 55 1
+46 56 1
+46 57 1
+46 58 1
+46 123 1
+46 129 1
+46 134 1
+46 139 1
+46 140 1
+46 141 1
+46 142 1
+46 206 1
+46 211 1
+46 216 1
+46 217 1
+46 218 1
+46 219 1
+46 226 1
+46 231 1
+46 232 1
+46 233 1
+46 234 1
+46 241 1
+46 242 1
+46 243 1
+46 244 1
+46 251 1
+46 252 1
+46 253 1
+46 254 1
+46 255 1
+46 256 1
+46 333 1
+46 339 1
+46 344 1
+46 349 1
+46 350 1
+46 351 1
+46 352 1
+46 416 1
+46 421 1
+46 426 1
+46 427 1
+46 428 1
+46 429 1
+46 436 1
+46 441 1
+46 442 1
+46 443 1
+46 444 1
+46 451 1
+46 452 1
+46 453 1
+46 454 1
+46 461 1
+46 462 1
+46 463 1
+46 464 1
+46 465 1
+46 466 1
+46 542 1
+46 547 1
+46 552 1
+46 553 1
+46 554 1
+46 555 1
+46 562 1
+46 567 1
+46 568 1
+46 569 1
+46 570 1
+46 577 1
+46 578 1
+46 579 1
+46 580 1
+46 587 1
+46 588 1
+46 589 1
+46 590 1
+46 591 1
+46 592 1
+46 667 1
+46 672 1
+46 673 1
+46 674 1
+46 675 1
+46 682 1
+46 683 1
+46 684 1
+46 685 1
+46 692 1
+46 693 1
+46 694 1
+46 695 1
+46 696 1
+46 697 1
+46 702 1
+46 703 1
+46 704 1
+46 705 1
+46 712 1
+46 713 1
+46 714 1
+46 715 1
+46 716 1
+46 717 1
+46 722 1
+46 723 1
+46 724 1
+46 725 1
+46 726 1
+46 727 1
+46 732 1
+46 733 1
+46 734 1
+46 735 1
+46 795 1
+46 801 1
+46 806 1
+46 811 1
+46 812 1
+46 813 1
+46 814 1
+46 878 1
+46 883 1
+46 888 1
+46 889 1
+46 890 1
+46 891 1
+46 898 1
+46 903 1
+46 904 1
+46 905 1
+46 906 1
+46 913 1
+46 914 1
+46 915 1
+46 916 1
+46 923 1
+46 924 1
+46 925 1
+46 926 1
+46 927 1
+46 928 1
+46 1004 1
+46 1009 1
+46 1014 1
+46 1015 1
+46 1016 1
+46 1017 1
+46 1024 1
+46 1029 1
+46 1030 1
+46 1031 1
+46 1032 1
+46 1039 1
+46 1040 1
+46 1041 1
+46 1042 1
+46 1049 1
+46 1050 1
+46 1051 1
+46 1052 1
+46 1053 1
+46 1054 1
+46 1129 1
+46 1134 1
+46 1135 1
+46 1136 1
+46 1137 1
+46 1144 1
+46 1145 1
+46 1146 1
+46 1147 1
+46 1154 1
+46 1155 1
+46 1156 1
+46 1157 1
+46 1158 1
+46 1159 1
+46 1164 1
+46 1165 1
+46 1166 1
+46 1167 1
+46 1174 1
+46 1175 1
+46 1176 1
+46 1177 1
+46 1178 1
+46 1179 1
+46 1184 1
+46 1185 1
+46 1186 1
+46 1187 1
+46 1188 1
+46 1189 1
+46 1194 1
+46 1195 1
+46 1196 1
+46 1197 1
+46 1256 1
+46 1261 1
+46 1266 1
+46 1267 1
+46 1268 1
+46 1269 1
+46 1276 1
+46 1281 1
+46 1282 1
+46 1283 1
+46 1284 1
+46 1291 1
+46 1292 1
+46 1293 1
+46 1294 1
+46 1301 1
+46 1302 1
+46 1303 1
+46 1304 1
+46 1305 1
+46 1306 1
+46 1381 1
+46 1386 1
+46 1387 1
+46 1388 1
+46 1389 1
+46 1396 1
+46 1397 1
+46 1398 1
+46 1399 1
+46 1406 1
+46 1407 1
+46 1408 1
+46 1409 1
+46 1410 1
+46 1411 1
+46 1416 1
+46 1417 1
+46 1418 1
+46 1419 1
+46 1426 1
+46 1427 1
+46 1428 1
+46 1429 1
+46 1430 1
+46 1431 1
+46 1436 1
+46 1437 1
+46 1438 1
+46 1439 1
+46 1440 1
+46 1441 1
+46 1446 1
+46 1447 1
+46 1448 1
+46 1449 1
+46 1507 1
+46 1512 1
+46 1513 1
+46 1514 1
+46 1515 1
+46 1522 1
+46 1523 1
+46 1524 1
+46 1525 1
+46 1532 1
+46 1533 1
+46 1534 1
+46 1535 1
+46 1536 1
+46 1537 1
+46 1542 1
+46 1543 1
+46 1544 1
+46 1545 1
+46 1552 1
+46 1553 1
+46 1554 1
+46 1555 1
+46 1556 1
+46 1557 1
+46 1562 1
+46 1563 1
+46 1564 1
+46 1565 1
+46 1566 1
+46 1567 1
+46 1572 1
+46 1573 1
+46 1574 1
+46 1575 1
+46 1633 1
+46 1634 1
+46 1635 1
+46 1636 1
+46 1643 1
+46 1644 1
+46 1645 1
+46 1646 1
+46 1647 1
+46 1648 1
+46 1653 1
+46 1654 1
+46 1655 1
+46 1656 1
+46 1657 1
+46 1658 1
+46 1663 1
+46 1664 1
+46 1665 1
+46 1666 1
+46 1668 1
+46 1669 1
+46 1670 1
+46 1671 1
+46 1672 1
+46 1673 1
+46 1678 1
+46 1679 1
+46 1680 1
+46 1681 1
+46 1683 1
+46 1684 1
+46 1685 1
+46 1686 1
+46 1688 1
+47 5 1
+47 40 1
+47 46 1
+47 51 1
+47 55 1
+47 59 1
+47 60 1
+47 61 1
+47 124 1
+47 130 1
+47 135 1
+47 139 1
+47 143 1
+47 144 1
+47 145 1
+47 207 1
+47 212 1
+47 216 1
+47 220 1
+47 221 1
+47 222 1
+47 227 1
+47 231 1
+47 235 1
+47 236 1
+47 237 1
+47 241 1
+47 245 1
+47 246 1
+47 247 1
+47 251 1
+47 252 1
+47 253 1
+47 257 1
+47 258 1
+47 259 1
+47 334 1
+47 340 1
+47 345 1
+47 349 1
+47 353 1
+47 354 1
+47 355 1
+47 417 1
+47 422 1
+47 426 1
+47 430 1
+47 431 1
+47 432 1
+47 437 1
+47 441 1
+47 445 1
+47 446 1
+47 447 1
+47 451 1
+47 455 1
+47 456 1
+47 457 1
+47 461 1
+47 462 1
+47 463 1
+47 467 1
+47 468 1
+47 469 1
+47 543 1
+47 548 1
+47 552 1
+47 556 1
+47 557 1
+47 558 1
+47 563 1
+47 567 1
+47 571 1
+47 572 1
+47 573 1
+47 577 1
+47 581 1
+47 582 1
+47 583 1
+47 587 1
+47 588 1
+47 589 1
+47 593 1
+47 594 1
+47 595 1
+47 668 1
+47 672 1
+47 676 1
+47 677 1
+47 678 1
+47 682 1
+47 686 1
+47 687 1
+47 688 1
+47 692 1
+47 693 1
+47 694 1
+47 698 1
+47 699 1
+47 700 1
+47 702 1
+47 706 1
+47 707 1
+47 708 1
+47 712 1
+47 713 1
+47 714 1
+47 718 1
+47 719 1
+47 720 1
+47 722 1
+47 723 1
+47 724 1
+47 728 1
+47 729 1
+47 730 1
+47 732 1
+47 733 1
+47 734 1
+47 736 1
+47 796 1
+47 802 1
+47 807 1
+47 811 1
+47 815 1
+47 816 1
+47 817 1
+47 879 1
+47 884 1
+47 888 1
+47 892 1
+47 893 1
+47 894 1
+47 899 1
+47 903 1
+47 907 1
+47 908 1
+47 909 1
+47 913 1
+47 917 1
+47 918 1
+47 919 1
+47 923 1
+47 924 1
+47 925 1
+47 929 1
+47 930 1
+47 931 1
+47 1005 1
+47 1010 1
+47 1014 1
+47 1018 1
+47 1019 1
+47 1020 1
+47 1025 1
+47 1029 1
+47 1033 1
+47 1034 1
+47 1035 1
+47 1039 1
+47 1043 1
+47 1044 1
+47 1045 1
+47 1049 1
+47 1050 1
+47 1051 1
+47 1055 1
+47 1056 1
+47 1057 1
+47 1130 1
+47 1134 1
+47 1138 1
+47 1139 1
+47 1140 1
+47 1144 1
+47 1148 1
+47 1149 1
+47 1150 1
+47 1154 1
+47 1155 1
+47 1156 1
+47 1160 1
+47 1161 1
+47 1162 1
+47 1164 1
+47 1168 1
+47 1169 1
+47 1170 1
+47 1174 1
+47 1175 1
+47 1176 1
+47 1180 1
+47 1181 1
+47 1182 1
+47 1184 1
+47 1185 1
+47 1186 1
+47 1190 1
+47 1191 1
+47 1192 1
+47 1194 1
+47 1195 1
+47 1196 1
+47 1198 1
+47 1257 1
+47 1262 1
+47 1266 1
+47 1270 1
+47 1271 1
+47 1272 1
+47 1277 1
+47 1281 1
+47 1285 1
+47 1286 1
+47 1287 1
+47 1291 1
+47 1295 1
+47 1296 1
+47 1297 1
+47 1301 1
+47 1302 1
+47 1303 1
+47 1307 1
+47 1308 1
+47 1309 1
+47 1382 1
+47 1386 1
+47 1390 1
+47 1391 1
+47 1392 1
+47 1396 1
+47 1400 1
+47 1401 1
+47 1402 1
+47 1406 1
+47 1407 1
+47 1408 1
+47 1412 1
+47 1413 1
+47 1414 1
+47 1416 1
+47 1420 1
+47 1421 1
+47 1422 1
+47 1426 1
+47 1427 1
+47 1428 1
+47 1432 1
+47 1433 1
+47 1434 1
+47 1436 1
+47 1437 1
+47 1438 1
+47 1442 1
+47 1443 1
+47 1444 1
+47 1446 1
+47 1447 1
+47 1448 1
+47 1450 1
+47 1508 1
+47 1512 1
+47 1516 1
+47 1517 1
+47 1518 1
+47 1522 1
+47 1526 1
+47 1527 1
+47 1528 1
+47 1532 1
+47 1533 1
+47 1534 1
+47 1538 1
+47 1539 1
+47 1540 1
+47 1542 1
+47 1546 1
+47 1547 1
+47 1548 1
+47 1552 1
+47 1553 1
+47 1554 1
+47 1558 1
+47 1559 1
+47 1560 1
+47 1562 1
+47 1563 1
+47 1564 1
+47 1568 1
+47 1569 1
+47 1570 1
+47 1572 1
+47 1573 1
+47 1574 1
+47 1576 1
+47 1633 1
+47 1637 1
+47 1638 1
+47 1639 1
+47 1643 1
+47 1644 1
+47 1645 1
+47 1649 1
+47 1650 1
+47 1651 1
+47 1653 1
+47 1654 1
+47 1655 1
+47 1659 1
+47 1660 1
+47 1661 1
+47 1663 1
+47 1664 1
+47 1665 1
+47 1667 1
+47 1668 1
+47 1669 1
+47 1670 1
+47 1674 1
+47 1675 1
+47 1676 1
+47 1678 1
+47 1679 1
+47 1680 1
+47 1682 1
+47 1683 1
+47 1684 1
+47 1685 1
+47 1687 1
+47 1688 1
+48 6 1
+48 41 1
+48 47 1
+48 52 1
+48 56 1
+48 59 1
+48 62 1
+48 63 1
+48 125 1
+48 131 1
+48 136 1
+48 140 1
+48 143 1
+48 146 1
+48 147 1
+48 208 1
+48 213 1
+48 217 1
+48 220 1
+48 223 1
+48 224 1
+48 228 1
+48 232 1
+48 235 1
+48 238 1
+48 239 1
+48 242 1
+48 245 1
+48 248 1
+48 249 1
+48 251 1
+48 254 1
+48 255 1
+48 257 1
+48 258 1
+48 260 1
+48 335 1
+48 341 1
+48 346 1
+48 350 1
+48 353 1
+48 356 1
+48 357 1
+48 418 1
+48 423 1
+48 427 1
+48 430 1
+48 433 1
+48 434 1
+48 438 1
+48 442 1
+48 445 1
+48 448 1
+48 449 1
+48 452 1
+48 455 1
+48 458 1
+48 459 1
+48 461 1
+48 464 1
+48 465 1
+48 467 1
+48 468 1
+48 470 1
+48 544 1
+48 549 1
+48 553 1
+48 556 1
+48 559 1
+48 560 1
+48 564 1
+48 568 1
+48 571 1
+48 574 1
+48 575 1
+48 578 1
+48 581 1
+48 584 1
+48 585 1
+48 587 1
+48 590 1
+48 591 1
+48 593 1
+48 594 1
+48 596 1
+48 669 1
+48 673 1
+48 676 1
+48 679 1
+48 680 1
+48 683 1
+48 686 1
+48 689 1
+48 690 1
+48 692 1
+48 695 1
+48 696 1
+48 698 1
+48 699 1
+48 701 1
+48 703 1
+48 706 1
+48 709 1
+48 710 1
+48 712 1
+48 715 1
+48 716 1
+48 718 1
+48 719 1
+48 721 1
+48 722 1
+48 725 1
+48 726 1
+48 728 1
+48 729 1
+48 731 1
+48 732 1
+48 733 1
+48 735 1
+48 736 1
+48 797 1
+48 803 1
+48 808 1
+48 812 1
+48 815 1
+48 818 1
+48 819 1
+48 880 1
+48 885 1
+48 889 1
+48 892 1
+48 895 1
+48 896 1
+48 900 1
+48 904 1
+48 907 1
+48 910 1
+48 911 1
+48 914 1
+48 917 1
+48 920 1
+48 921 1
+48 923 1
+48 926 1
+48 927 1
+48 929 1
+48 930 1
+48 932 1
+48 1006 1
+48 1011 1
+48 1015 1
+48 1018 1
+48 1021 1
+48 1022 1
+48 1026 1
+48 1030 1
+48 1033 1
+48 1036 1
+48 1037 1
+48 1040 1
+48 1043 1
+48 1046 1
+48 1047 1
+48 1049 1
+48 1052 1
+48 1053 1
+48 1055 1
+48 1056 1
+48 1058 1
+48 1131 1
+48 1135 1
+48 1138 1
+48 1141 1
+48 1142 1
+48 1145 1
+48 1148 1
+48 1151 1
+48 1152 1
+48 1154 1
+48 1157 1
+48 1158 1
+48 1160 1
+48 1161 1
+48 1163 1
+48 1165 1
+48 1168 1
+48 1171 1
+48 1172 1
+48 1174 1
+48 1177 1
+48 1178 1
+48 1180 1
+48 1181 1
+48 1183 1
+48 1184 1
+48 1187 1
+48 1188 1
+48 1190 1
+48 1191 1
+48 1193 1
+48 1194 1
+48 1195 1
+48 1197 1
+48 1198 1
+48 1258 1
+48 1263 1
+48 1267 1
+48 1270 1
+48 1273 1
+48 1274 1
+48 1278 1
+48 1282 1
+48 1285 1
+48 1288 1
+48 1289 1
+48 1292 1
+48 1295 1
+48 1298 1
+48 1299 1
+48 1301 1
+48 1304 1
+48 1305 1
+48 1307 1
+48 1308 1
+48 1310 1
+48 1383 1
+48 1387 1
+48 1390 1
+48 1393 1
+48 1394 1
+48 1397 1
+48 1400 1
+48 1403 1
+48 1404 1
+48 1406 1
+48 1409 1
+48 1410 1
+48 1412 1
+48 1413 1
+48 1415 1
+48 1417 1
+48 1420 1
+48 1423 1
+48 1424 1
+48 1426 1
+48 1429 1
+48 1430 1
+48 1432 1
+48 1433 1
+48 1435 1
+48 1436 1
+48 1439 1
+48 1440 1
+48 1442 1
+48 1443 1
+48 1445 1
+48 1446 1
+48 1447 1
+48 1449 1
+48 1450 1
+48 1509 1
+48 1513 1
+48 1516 1
+48 1519 1
+48 1520 1
+48 1523 1
+48 1526 1
+48 1529 1
+48 1530 1
+48 1532 1
+48 1535 1
+48 1536 1
+48 1538 1
+48 1539 1
+48 1541 1
+48 1543 1
+48 1546 1
+48 1549 1
+48 1550 1
+48 1552 1
+48 1555 1
+48 1556 1
+48 1558 1
+48 1559 1
+48 1561 1
+48 1562 1
+48 1565 1
+48 1566 1
+48 1568 1
+48 1569 1
+48 1571 1
+48 1572 1
+48 1573 1
+48 1575 1
+48 1576 1
+48 1634 1
+48 1637 1
+48 1640 1
+48 1641 1
+48 1643 1
+48 1646 1
+48 1647 1
+48 1649 1
+48 1650 1
+48 1652 1
+48 1653 1
+48 1656 1
+48 1657 1
+48 1659 1
+48 1660 1
+48 1662 1
+48 1663 1
+48 1664 1
+48 1666 1
+48 1667 1
+48 1668 1
+48 1671 1
+48 1672 1
+48 1674 1
+48 1675 1
+48 1677 1
+48 1678 1
+48 1679 1
+48 1681 1
+48 1682 1
+48 1683 1
+48 1684 1
+48 1686 1
+48 1687 1
+48 1688 1
+49 7 1
+49 42 1
+49 48 1
+49 53 1
+49 57 1
+49 60 1
+49 62 1
+49 64 1
+49 126 1
+49 132 1
+49 137 1
+49 141 1
+49 144 1
+49 146 1
+49 148 1
+49 209 1
+49 214 1
+49 218 1
+49 221 1
+49 223 1
+49 225 1
+49 229 1
+49 233 1
+49 236 1
+49 238 1
+49 240 1
+49 243 1
+49 246 1
+49 248 1
+49 250 1
+49 252 1
+49 254 1
+49 256 1
+49 257 1
+49 259 1
+49 260 1
+49 336 1
+49 342 1
+49 347 1
+49 351 1
+49 354 1
+49 356 1
+49 358 1
+49 419 1
+49 424 1
+49 428 1
+49 431 1
+49 433 1
+49 435 1
+49 439 1
+49 443 1
+49 446 1
+49 448 1
+49 450 1
+49 453 1
+49 456 1
+49 458 1
+49 460 1
+49 462 1
+49 464 1
+49 466 1
+49 467 1
+49 469 1
+49 470 1
+49 545 1
+49 550 1
+49 554 1
+49 557 1
+49 559 1
+49 561 1
+49 565 1
+49 569 1
+49 572 1
+49 574 1
+49 576 1
+49 579 1
+49 582 1
+49 584 1
+49 586 1
+49 588 1
+49 590 1
+49 592 1
+49 593 1
+49 595 1
+49 596 1
+49 670 1
+49 674 1
+49 677 1
+49 679 1
+49 681 1
+49 684 1
+49 687 1
+49 689 1
+49 691 1
+49 693 1
+49 695 1
+49 697 1
+49 698 1
+49 700 1
+49 701 1
+49 704 1
+49 707 1
+49 709 1
+49 711 1
+49 713 1
+49 715 1
+49 717 1
+49 718 1
+49 720 1
+49 721 1
+49 723 1
+49 725 1
+49 727 1
+49 728 1
+49 730 1
+49 731 1
+49 732 1
+49 734 1
+49 735 1
+49 736 1
+49 798 1
+49 804 1
+49 809 1
+49 813 1
+49 816 1
+49 818 1
+49 820 1
+49 881 1
+49 886 1
+49 890 1
+49 893 1
+49 895 1
+49 897 1
+49 901 1
+49 905 1
+49 908 1
+49 910 1
+49 912 1
+49 915 1
+49 918 1
+49 920 1
+49 922 1
+49 924 1
+49 926 1
+49 928 1
+49 929 1
+49 931 1
+49 932 1
+49 1007 1
+49 1012 1
+49 1016 1
+49 1019 1
+49 1021 1
+49 1023 1
+49 1027 1
+49 1031 1
+49 1034 1
+49 1036 1
+49 1038 1
+49 1041 1
+49 1044 1
+49 1046 1
+49 1048 1
+49 1050 1
+49 1052 1
+49 1054 1
+49 1055 1
+49 1057 1
+49 1058 1
+49 1132 1
+49 1136 1
+49 1139 1
+49 1141 1
+49 1143 1
+49 1146 1
+49 1149 1
+49 1151 1
+49 1153 1
+49 1155 1
+49 1157 1
+49 1159 1
+49 1160 1
+49 1162 1
+49 1163 1
+49 1166 1
+49 1169 1
+49 1171 1
+49 1173 1
+49 1175 1
+49 1177 1
+49 1179 1
+49 1180 1
+49 1182 1
+49 1183 1
+49 1185 1
+49 1187 1
+49 1189 1
+49 1190 1
+49 1192 1
+49 1193 1
+49 1194 1
+49 1196 1
+49 1197 1
+49 1198 1
+49 1259 1
+49 1264 1
+49 1268 1
+49 1271 1
+49 1273 1
+49 1275 1
+49 1279 1
+49 1283 1
+49 1286 1
+49 1288 1
+49 1290 1
+49 1293 1
+49 1296 1
+49 1298 1
+49 1300 1
+49 1302 1
+49 1304 1
+49 1306 1
+49 1307 1
+49 1309 1
+49 1310 1
+49 1384 1
+49 1388 1
+49 1391 1
+49 1393 1
+49 1395 1
+49 1398 1
+49 1401 1
+49 1403 1
+49 1405 1
+49 1407 1
+49 1409 1
+49 1411 1
+49 1412 1
+49 1414 1
+49 1415 1
+49 1418 1
+49 1421 1
+49 1423 1
+49 1425 1
+49 1427 1
+49 1429 1
+49 1431 1
+49 1432 1
+49 1434 1
+49 1435 1
+49 1437 1
+49 1439 1
+49 1441 1
+49 1442 1
+49 1444 1
+49 1445 1
+49 1446 1
+49 1448 1
+49 1449 1
+49 1450 1
+49 1510 1
+49 1514 1
+49 1517 1
+49 1519 1
+49 1521 1
+49 1524 1
+49 1527 1
+49 1529 1
+49 1531 1
+49 1533 1
+49 1535 1
+49 1537 1
+49 1538 1
+49 1540 1
+49 1541 1
+49 1544 1
+49 1547 1
+49 1549 1
+49 1551 1
+49 1553 1
+49 1555 1
+49 1557 1
+49 1558 1
+49 1560 1
+49 1561 1
+49 1563 1
+49 1565 1
+49 1567 1
+49 1568 1
+49 1570 1
+49 1571 1
+49 1572 1
+49 1574 1
+49 1575 1
+49 1576 1
+49 1635 1
+49 1638 1
+49 1640 1
+49 1642 1
+49 1644 1
+49 1646 1
+49 1648 1
+49 1649 1
+49 1651 1
+49 1652 1
+49 1654 1
+49 1656 1
+49 1658 1
+49 1659 1
+49 1661 1
+49 1662 1
+49 1663 1
+49 1665 1
+49 1666 1
+49 1667 1
+49 1669 1
+49 1671 1
+49 1673 1
+49 1674 1
+49 1676 1
+49 1677 1
+49 1678 1
+49 1680 1
+49 1681 1
+49 1682 1
+49 1683 1
+49 1685 1
+49 1686 1
+49 1687 1
+49 1688 1
+50 8 1
+50 43 1
+50 49 1
+50 54 1
+50 58 1
+50 61 1
+50 63 1
+50 64 1
+50 127 1
+50 133 1
+50 138 1
+50 142 1
+50 145 1
+50 147 1
+50 148 1
+50 210 1
+50 215 1
+50 219 1
+50 222 1
+50 224 1
+50 225 1
+50 230 1
+50 234 1
+50 237 1
+50 239 1
+50 240 1
+50 244 1
+50 247 1
+50 249 1
+50 250 1
+50 253 1
+50 255 1
+50 256 1
+50 258 1
+50 259 1
+50 260 1
+50 337 1
+50 343 1
+50 348 1
+50 352 1
+50 355 1
+50 357 1
+50 358 1
+50 420 1
+50 425 1
+50 429 1
+50 432 1
+50 434 1
+50 435 1
+50 440 1
+50 444 1
+50 447 1
+50 449 1
+50 450 1
+50 454 1
+50 457 1
+50 459 1
+50 460 1
+50 463 1
+50 465 1
+50 466 1
+50 468 1
+50 469 1
+50 470 1
+50 546 1
+50 551 1
+50 555 1
+50 558 1
+50 560 1
+50 561 1
+50 566 1
+50 570 1
+50 573 1
+50 575 1
+50 576 1
+50 580 1
+50 583 1
+50 585 1
+50 586 1
+50 589 1
+50 591 1
+50 592 1
+50 594 1
+50 595 1
+50 596 1
+50 671 1
+50 675 1
+50 678 1
+50 680 1
+50 681 1
+50 685 1
+50 688 1
+50 690 1
+50 691 1
+50 694 1
+50 696 1
+50 697 1
+50 699 1
+50 700 1
+50 701 1
+50 705 1
+50 708 1
+50 710 1
+50 711 1
+50 714 1
+50 716 1
+50 717 1
+50 719 1
+50 720 1
+50 721 1
+50 724 1
+50 726 1
+50 727 1
+50 729 1
+50 730 1
+50 731 1
+50 733 1
+50 734 1
+50 735 1
+50 736 1
+50 799 1
+50 805 1
+50 810 1
+50 814 1
+50 817 1
+50 819 1
+50 820 1
+50 882 1
+50 887 1
+50 891 1
+50 894 1
+50 896 1
+50 897 1
+50 902 1
+50 906 1
+50 909 1
+50 911 1
+50 912 1
+50 916 1
+50 919 1
+50 921 1
+50 922 1
+50 925 1
+50 927 1
+50 928 1
+50 930 1
+50 931 1
+50 932 1
+50 1008 1
+50 1013 1
+50 1017 1
+50 1020 1
+50 1022 1
+50 1023 1
+50 1028 1
+50 1032 1
+50 1035 1
+50 1037 1
+50 1038 1
+50 1042 1
+50 1045 1
+50 1047 1
+50 1048 1
+50 1051 1
+50 1053 1
+50 1054 1
+50 1056 1
+50 1057 1
+50 1058 1
+50 1133 1
+50 1137 1
+50 1140 1
+50 1142 1
+50 1143 1
+50 1147 1
+50 1150 1
+50 1152 1
+50 1153 1
+50 1156 1
+50 1158 1
+50 1159 1
+50 1161 1
+50 1162 1
+50 1163 1
+50 1167 1
+50 1170 1
+50 1172 1
+50 1173 1
+50 1176 1
+50 1178 1
+50 1179 1
+50 1181 1
+50 1182 1
+50 1183 1
+50 1186 1
+50 1188 1
+50 1189 1
+50 1191 1
+50 1192 1
+50 1193 1
+50 1195 1
+50 1196 1
+50 1197 1
+50 1198 1
+50 1260 1
+50 1265 1
+50 1269 1
+50 1272 1
+50 1274 1
+50 1275 1
+50 1280 1
+50 1284 1
+50 1287 1
+50 1289 1
+50 1290 1
+50 1294 1
+50 1297 1
+50 1299 1
+50 1300 1
+50 1303 1
+50 1305 1
+50 1306 1
+50 1308 1
+50 1309 1
+50 1310 1
+50 1385 1
+50 1389 1
+50 1392 1
+50 1394 1
+50 1395 1
+50 1399 1
+50 1402 1
+50 1404 1
+50 1405 1
+50 1408 1
+50 1410 1
+50 1411 1
+50 1413 1
+50 1414 1
+50 1415 1
+50 1419 1
+50 1422 1
+50 1424 1
+50 1425 1
+50 1428 1
+50 1430 1
+50 1431 1
+50 1433 1
+50 1434 1
+50 1435 1
+50 1438 1
+50 1440 1
+50 1441 1
+50 1443 1
+50 1444 1
+50 1445 1
+50 1447 1
+50 1448 1
+50 1449 1
+50 1450 1
+50 1511 1
+50 1515 1
+50 1518 1
+50 1520 1
+50 1521 1
+50 1525 1
+50 1528 1
+50 1530 1
+50 1531 1
+50 1534 1
+50 1536 1
+50 1537 1
+50 1539 1
+50 1540 1
+50 1541 1
+50 1545 1
+50 1548 1
+50 1550 1
+50 1551 1
+50 1554 1
+50 1556 1
+50 1557 1
+50 1559 1
+50 1560 1
+50 1561 1
+50 1564 1
+50 1566 1
+50 1567 1
+50 1569 1
+50 1570 1
+50 1571 1
+50 1573 1
+50 1574 1
+50 1575 1
+50 1576 1
+50 1636 1
+50 1639 1
+50 1641 1
+50 1642 1
+50 1645 1
+50 1647 1
+50 1648 1
+50 1650 1
+50 1651 1
+50 1652 1
+50 1655 1
+50 1657 1
+50 1658 1
+50 1660 1
+50 1661 1
+50 1662 1
+50 1664 1
+50 1665 1
+50 1666 1
+50 1667 1
+50 1670 1
+50 1672 1
+50 1673 1
+50 1675 1
+50 1676 1
+50 1677 1
+50 1679 1
+50 1680 1
+50 1681 1
+50 1682 1
+50 1684 1
+50 1685 1
+50 1686 1
+50 1687 1
+50 1688 1
+51 9 1
+51 37 1
+51 65 1
+51 66 1
+51 67 1
+51 68 1
+51 69 1
+51 70 1
+51 121 1
+51 149 1
+51 150 1
+51 151 1
+51 152 1
+51 153 1
+51 154 1
+51 205 1
+51 206 1
+51 207 1
+51 208 1
+51 209 1
+51 210 1
+51 261 1
+51 262 1
+51 263 1
+51 264 1
+51 265 1
+51 266 1
+51 267 1
+51 268 1
+51 269 1
+51 270 1
+51 271 1
+51 272 1
+51 273 1
+51 274 1
+51 275 1
+51 331 1
+51 359 1
+51 360 1
+51 361 1
+51 362 1
+51 363 1
+51 364 1
+51 415 1
+51 416 1
+51 417 1
+51 418 1
+51 419 1
+51 420 1
+51 471 1
+51 472 1
+51 473 1
+51 474 1
+51 475 1
+51 476 1
+51 477 1
+51 478 1
+51 479 1
+51 480 1
+51 481 1
+51 482 1
+51 483 1
+51 484 1
+51 485 1
+51 541 1
+51 542 1
+51 543 1
+51 544 1
+51 545 1
+51 546 1
+51 597 1
+51 598 1
+51 599 1
+51 600 1
+51 601 1
+51 602 1
+51 603 1
+51 604 1
+51 605 1
+51 606 1
+51 607 1
+51 608 1
+51 609 1
+51 610 1
+51 611 1
+51 667 1
+51 668 1
+51 669 1
+51 670 1
+51 671 1
+51 672 1
+51 673 1
+51 674 1
+51 675 1
+51 676 1
+51 677 1
+51 678 1
+51 679 1
+51 680 1
+51 681 1
+51 737 1
+51 738 1
+51 739 1
+51 740 1
+51 741 1
+51 742 1
+51 743 1
+51 744 1
+51 745 1
+51 746 1
+51 747 1
+51 748 1
+51 749 1
+51 750 1
+51 751 1
+51 752 1
+51 753 1
+51 754 1
+51 755 1
+51 756 1
+51 793 1
+51 821 1
+51 822 1
+51 823 1
+51 824 1
+51 825 1
+51 826 1
+51 877 1
+51 878 1
+51 879 1
+51 880 1
+51 881 1
+51 882 1
+51 933 1
+51 934 1
+51 935 1
+51 936 1
+51 937 1
+51 938 1
+51 939 1
+51 940 1
+51 941 1
+51 942 1
+51 943 1
+51 944 1
+51 945 1
+51 946 1
+51 947 1
+51 1003 1
+51 1004 1
+51 1005 1
+51 1006 1
+51 1007 1
+51 1008 1
+51 1059 1
+51 1060 1
+51 1061 1
+51 1062 1
+51 1063 1
+51 1064 1
+51 1065 1
+51 1066 1
+51 1067 1
+51 1068 1
+51 1069 1
+51 1070 1
+51 1071 1
+51 1072 1
+51 1073 1
+51 1129 1
+51 1130 1
+51 1131 1
+51 1132 1
+51 1133 1
+51 1134 1
+51 1135 1
+51 1136 1
+51 1137 1
+51 1138 1
+51 1139 1
+51 1140 1
+51 1141 1
+51 1142 1
+51 1143 1
+51 1199 1
+51 1200 1
+51 1201 1
+51 1202 1
+51 1203 1
+51 1204 1
+51 1205 1
+51 1206 1
+51 1207 1
+51 1208 1
+51 1209 1
+51 1210 1
+51 1211 1
+51 1212 1
+51 1213 1
+51 1214 1
+51 1215 1
+51 1216 1
+51 1217 1
+51 1218 1
+51 1255 1
+51 1256 1
+51 1257 1
+51 1258 1
+51 1259 1
+51 1260 1
+51 1311 1
+51 1312 1
+51 1313 1
+51 1314 1
+51 1315 1
+51 1316 1
+51 1317 1
+51 1318 1
+51 1319 1
+51 1320 1
+51 1321 1
+51 1322 1
+51 1323 1
+51 1324 1
+51 1325 1
+51 1381 1
+51 1382 1
+51 1383 1
+51 1384 1
+51 1385 1
+51 1386 1
+51 1387 1
+51 1388 1
+51 1389 1
+51 1390 1
+51 1391 1
+51 1392 1
+51 1393 1
+51 1394 1
+51 1395 1
+51 1451 1
+51 1452 1
+51 1453 1
+51 1454 1
+51 1455 1
+51 1456 1
+51 1457 1
+51 1458 1
+51 1459 1
+51 1460 1
+51 1461 1
+51 1462 1
+51 1463 1
+51 1464 1
+51 1465 1
+51 1466 1
+51 1467 1
+51 1468 1
+51 1469 1
+51 1470 1
+51 1507 1
+51 1508 1
+51 1509 1
+51 1510 1
+51 1511 1
+51 1512 1
+51 1513 1
+51 1514 1
+51 1515 1
+51 1516 1
+51 1517 1
+51 1518 1
+51 1519 1
+51 1520 1
+51 1521 1
+51 1577 1
+51 1578 1
+51 1579 1
+51 1580 1
+51 1581 1
+51 1582 1
+51 1583 1
+51 1584 1
+51 1585 1
+51 1586 1
+51 1587 1
+51 1588 1
+51 1589 1
+51 1590 1
+51 1591 1
+51 1592 1
+51 1593 1
+51 1594 1
+51 1595 1
+51 1596 1
+51 1633 1
+51 1634 1
+51 1635 1
+51 1636 1
+51 1637 1
+51 1638 1
+51 1639 1
+51 1640 1
+51 1641 1
+51 1642 1
+51 1643 1
+51 1644 1
+51 1645 1
+51 1646 1
+51 1647 1
+51 1648 1
+51 1649 1
+51 1650 1
+51 1651 1
+51 1652 1
+51 1689 1
+51 1690 1
+51 1691 1
+51 1692 1
+51 1693 1
+51 1694 1
+51 1695 1
+51 1696 1
+51 1697 1
+51 1698 1
+51 1699 1
+51 1700 1
+51 1701 1
+51 1702 1
+51 1703 1
+52 10 1
+52 38 1
+52 65 1
+52 71 1
+52 72 1
+52 73 1
+52 74 1
+52 75 1
+52 122 1
+52 149 1
+52 155 1
+52 156 1
+52 157 1
+52 158 1
+52 159 1
+52 205 1
+52 211 1
+52 212 1
+52 213 1
+52 214 1
+52 215 1
+52 261 1
+52 262 1
+52 263 1
+52 264 1
+52 265 1
+52 276 1
+52 277 1
+52 278 1
+52 279 1
+52 280 1
+52 281 1
+52 282 1
+52 283 1
+52 284 1
+52 285 1
+52 332 1
+52 359 1
+52 365 1
+52 366 1
+52 367 1
+52 368 1
+52 369 1
+52 415 1
+52 421 1
+52 422 1
+52 423 1
+52 424 1
+52 425 1
+52 471 1
+52 472 1
+52 473 1
+52 474 1
+52 475 1
+52 486 1
+52 487 1
+52 488 1
+52 489 1
+52 490 1
+52 491 1
+52 492 1
+52 493 1
+52 494 1
+52 495 1
+52 541 1
+52 547 1
+52 548 1
+52 549 1
+52 550 1
+52 551 1
+52 597 1
+52 598 1
+52 599 1
+52 600 1
+52 601 1
+52 612 1
+52 613 1
+52 614 1
+52 615 1
+52 616 1
+52 617 1
+52 618 1
+52 619 1
+52 620 1
+52 621 1
+52 667 1
+52 668 1
+52 669 1
+52 670 1
+52 671 1
+52 682 1
+52 683 1
+52 684 1
+52 685 1
+52 686 1
+52 687 1
+52 688 1
+52 689 1
+52 690 1
+52 691 1
+52 737 1
+52 738 1
+52 739 1
+52 740 1
+52 741 1
+52 742 1
+52 743 1
+52 744 1
+52 745 1
+52 746 1
+52 757 1
+52 758 1
+52 759 1
+52 760 1
+52 761 1
+52 762 1
+52 763 1
+52 764 1
+52 765 1
+52 766 1
+52 794 1
+52 821 1
+52 827 1
+52 828 1
+52 829 1
+52 830 1
+52 831 1
+52 877 1
+52 883 1
+52 884 1
+52 885 1
+52 886 1
+52 887 1
+52 933 1
+52 934 1
+52 935 1
+52 936 1
+52 937 1
+52 948 1
+52 949 1
+52 950 1
+52 951 1
+52 952 1
+52 953 1
+52 954 1
+52 955 1
+52 956 1
+52 957 1
+52 1003 1
+52 1009 1
+52 1010 1
+52 1011 1
+52 1012 1
+52 1013 1
+52 1059 1
+52 1060 1
+52 1061 1
+52 1062 1
+52 1063 1
+52 1074 1
+52 1075 1
+52 1076 1
+52 1077 1
+52 1078 1
+52 1079 1
+52 1080 1
+52 1081 1
+52 1082 1
+52 1083 1
+52 1129 1
+52 1130 1
+52 1131 1
+52 1132 1
+52 1133 1
+52 1144 1
+52 1145 1
+52 1146 1
+52 1147 1
+52 1148 1
+52 1149 1
+52 1150 1
+52 1151 1
+52 1152 1
+52 1153 1
+52 1199 1
+52 1200 1
+52 1201 1
+52 1202 1
+52 1203 1
+52 1204 1
+52 1205 1
+52 1206 1
+52 1207 1
+52 1208 1
+52 1219 1
+52 1220 1
+52 1221 1
+52 1222 1
+52 1223 1
+52 1224 1
+52 1225 1
+52 1226 1
+52 1227 1
+52 1228 1
+52 1255 1
+52 1261 1
+52 1262 1
+52 1263 1
+52 1264 1
+52 1265 1
+52 1311 1
+52 1312 1
+52 1313 1
+52 1314 1
+52 1315 1
+52 1326 1
+52 1327 1
+52 1328 1
+52 1329 1
+52 1330 1
+52 1331 1
+52 1332 1
+52 1333 1
+52 1334 1
+52 1335 1
+52 1381 1
+52 1382 1
+52 1383 1
+52 1384 1
+52 1385 1
+52 1396 1
+52 1397 1
+52 1398 1
+52 1399 1
+52 1400 1
+52 1401 1
+52 1402 1
+52 1403 1
+52 1404 1
+52 1405 1
+52 1451 1
+52 1452 1
+52 1453 1
+52 1454 1
+52 1455 1
+52 1456 1
+52 1457 1
+52 1458 1
+52 1459 1
+52 1460 1
+52 1471 1
+52 1472 1
+52 1473 1
+52 1474 1
+52 1475 1
+52 1476 1
+52 1477 1
+52 1478 1
+52 1479 1
+52 1480 1
+52 1507 1
+52 1508 1
+52 1509 1
+52 1510 1
+52 1511 1
+52 1522 1
+52 1523 1
+52 1524 1
+52 1525 1
+52 1526 1
+52 1527 1
+52 1528 1
+52 1529 1
+52 1530 1
+52 1531 1
+52 1577 1
+52 1578 1
+52 1579 1
+52 1580 1
+52 1581 1
+52 1582 1
+52 1583 1
+52 1584 1
+52 1585 1
+52 1586 1
+52 1597 1
+52 1598 1
+52 1599 1
+52 1600 1
+52 1601 1
+52 1602 1
+52 1603 1
+52 1604 1
+52 1605 1
+52 1606 1
+52 1633 1
+52 1634 1
+52 1635 1
+52 1636 1
+52 1637 1
+52 1638 1
+52 1639 1
+52 1640 1
+52 1641 1
+52 1642 1
+52 1653 1
+52 1654 1
+52 1655 1
+52 1656 1
+52 1657 1
+52 1658 1
+52 1659 1
+52 1660 1
+52 1661 1
+52 1662 1
+52 1689 1
+52 1690 1
+52 1691 1
+52 1692 1
+52 1693 1
+52 1694 1
+52 1695 1
+52 1696 1
+52 1697 1
+52 1698 1
+52 1704 1
+52 1705 1
+52 1706 1
+52 1707 1
+52 1708 1
+53 11 1
+53 39 1
+53 66 1
+53 71 1
+53 76 1
+53 77 1
+53 78 1
+53 79 1
+53 123 1
+53 150 1
+53 155 1
+53 160 1
+53 161 1
+53 162 1
+53 163 1
+53 206 1
+53 211 1
+53 216 1
+53 217 1
+53 218 1
+53 219 1
+53 261 1
+53 266 1
+53 267 1
+53 268 1
+53 269 1
+53 276 1
+53 277 1
+53 278 1
+53 279 1
+53 286 1
+53 287 1
+53 288 1
+53 289 1
+53 290 1
+53 291 1
+53 333 1
+53 360 1
+53 365 1
+53 370 1
+53 371 1
+53 372 1
+53 373 1
+53 416 1
+53 421 1
+53 426 1
+53 427 1
+53 428 1
+53 429 1
+53 471 1
+53 476 1
+53 477 1
+53 478 1
+53 479 1
+53 486 1
+53 487 1
+53 488 1
+53 489 1
+53 496 1
+53 497 1
+53 498 1
+53 499 1
+53 500 1
+53 501 1
+53 542 1
+53 547 1
+53 552 1
+53 553 1
+53 554 1
+53 555 1
+53 597 1
+53 602 1
+53 603 1
+53 604 1
+53 605 1
+53 612 1
+53 613 1
+53 614 1
+53 615 1
+53 622 1
+53 623 1
+53 624 1
+53 625 1
+53 626 1
+53 627 1
+53 667 1
+53 672 1
+53 673 1
+53 674 1
+53 675 1
+53 682 1
+53 683 1
+53 684 1
+53 685 1
+53 692 1
+53 693 1
+53 694 1
+53 695 1
+53 696 1
+53 697 1
+53 737 1
+53 738 1
+53 739 1
+53 740 1
+53 747 1
+53 748 1
+53 749 1
+53 750 1
+53 751 1
+53 752 1
+53 757 1
+53 758 1
+53 759 1
+53 760 1
+53 761 1
+53 762 1
+53 767 1
+53 768 1
+53 769 1
+53 770 1
+53 795 1
+53 822 1
+53 827 1
+53 832 1
+53 833 1
+53 834 1
+53 835 1
+53 878 1
+53 883 1
+53 888 1
+53 889 1
+53 890 1
+53 891 1
+53 933 1
+53 938 1
+53 939 1
+53 940 1
+53 941 1
+53 948 1
+53 949 1
+53 950 1
+53 951 1
+53 958 1
+53 959 1
+53 960 1
+53 961 1
+53 962 1
+53 963 1
+53 1004 1
+53 1009 1
+53 1014 1
+53 1015 1
+53 1016 1
+53 1017 1
+53 1059 1
+53 1064 1
+53 1065 1
+53 1066 1
+53 1067 1
+53 1074 1
+53 1075 1
+53 1076 1
+53 1077 1
+53 1084 1
+53 1085 1
+53 1086 1
+53 1087 1
+53 1088 1
+53 1089 1
+53 1129 1
+53 1134 1
+53 1135 1
+53 1136 1
+53 1137 1
+53 1144 1
+53 1145 1
+53 1146 1
+53 1147 1
+53 1154 1
+53 1155 1
+53 1156 1
+53 1157 1
+53 1158 1
+53 1159 1
+53 1199 1
+53 1200 1
+53 1201 1
+53 1202 1
+53 1209 1
+53 1210 1
+53 1211 1
+53 1212 1
+53 1213 1
+53 1214 1
+53 1219 1
+53 1220 1
+53 1221 1
+53 1222 1
+53 1223 1
+53 1224 1
+53 1229 1
+53 1230 1
+53 1231 1
+53 1232 1
+53 1256 1
+53 1261 1
+53 1266 1
+53 1267 1
+53 1268 1
+53 1269 1
+53 1311 1
+53 1316 1
+53 1317 1
+53 1318 1
+53 1319 1
+53 1326 1
+53 1327 1
+53 1328 1
+53 1329 1
+53 1336 1
+53 1337 1
+53 1338 1
+53 1339 1
+53 1340 1
+53 1341 1
+53 1381 1
+53 1386 1
+53 1387 1
+53 1388 1
+53 1389 1
+53 1396 1
+53 1397 1
+53 1398 1
+53 1399 1
+53 1406 1
+53 1407 1
+53 1408 1
+53 1409 1
+53 1410 1
+53 1411 1
+53 1451 1
+53 1452 1
+53 1453 1
+53 1454 1
+53 1461 1
+53 1462 1
+53 1463 1
+53 1464 1
+53 1465 1
+53 1466 1
+53 1471 1
+53 1472 1
+53 1473 1
+53 1474 1
+53 1475 1
+53 1476 1
+53 1481 1
+53 1482 1
+53 1483 1
+53 1484 1
+53 1507 1
+53 1512 1
+53 1513 1
+53 1514 1
+53 1515 1
+53 1522 1
+53 1523 1
+53 1524 1
+53 1525 1
+53 1532 1
+53 1533 1
+53 1534 1
+53 1535 1
+53 1536 1
+53 1537 1
+53 1577 1
+53 1578 1
+53 1579 1
+53 1580 1
+53 1587 1
+53 1588 1
+53 1589 1
+53 1590 1
+53 1591 1
+53 1592 1
+53 1597 1
+53 1598 1
+53 1599 1
+53 1600 1
+53 1601 1
+53 1602 1
+53 1607 1
+53 1608 1
+53 1609 1
+53 1610 1
+53 1633 1
+53 1634 1
+53 1635 1
+53 1636 1
+53 1643 1
+53 1644 1
+53 1645 1
+53 1646 1
+53 1647 1
+53 1648 1
+53 1653 1
+53 1654 1
+53 1655 1
+53 1656 1
+53 1657 1
+53 1658 1
+53 1663 1
+53 1664 1
+53 1665 1
+53 1666 1
+53 1689 1
+53 1690 1
+53 1691 1
+53 1692 1
+53 1693 1
+53 1694 1
+53 1699 1
+53 1700 1
+53 1701 1
+53 1702 1
+53 1704 1
+53 1705 1
+53 1706 1
+53 1707 1
+53 1709 1
+54 12 1
+54 40 1
+54 67 1
+54 72 1
+54 76 1
+54 80 1
+54 81 1
+54 82 1
+54 124 1
+54 151 1
+54 156 1
+54 160 1
+54 164 1
+54 165 1
+54 166 1
+54 207 1
+54 212 1
+54 216 1
+54 220 1
+54 221 1
+54 222 1
+54 262 1
+54 266 1
+54 270 1
+54 271 1
+54 272 1
+54 276 1
+54 280 1
+54 281 1
+54 282 1
+54 286 1
+54 287 1
+54 288 1
+54 292 1
+54 293 1
+54 294 1
+54 334 1
+54 361 1
+54 366 1
+54 370 1
+54 374 1
+54 375 1
+54 376 1
+54 417 1
+54 422 1
+54 426 1
+54 430 1
+54 431 1
+54 432 1
+54 472 1
+54 476 1
+54 480 1
+54 481 1
+54 482 1
+54 486 1
+54 490 1
+54 491 1
+54 492 1
+54 496 1
+54 497 1
+54 498 1
+54 502 1
+54 503 1
+54 504 1
+54 543 1
+54 548 1
+54 552 1
+54 556 1
+54 557 1
+54 558 1
+54 598 1
+54 602 1
+54 606 1
+54 607 1
+54 608 1
+54 612 1
+54 616 1
+54 617 1
+54 618 1
+54 622 1
+54 623 1
+54 624 1
+54 628 1
+54 629 1
+54 630 1
+54 668 1
+54 672 1
+54 676 1
+54 677 1
+54 678 1
+54 682 1
+54 686 1
+54 687 1
+54 688 1
+54 692 1
+54 693 1
+54 694 1
+54 698 1
+54 699 1
+54 700 1
+54 737 1
+54 741 1
+54 742 1
+54 743 1
+54 747 1
+54 748 1
+54 749 1
+54 753 1
+54 754 1
+54 755 1
+54 757 1
+54 758 1
+54 759 1
+54 763 1
+54 764 1
+54 765 1
+54 767 1
+54 768 1
+54 769 1
+54 771 1
+54 796 1
+54 823 1
+54 828 1
+54 832 1
+54 836 1
+54 837 1
+54 838 1
+54 879 1
+54 884 1
+54 888 1
+54 892 1
+54 893 1
+54 894 1
+54 934 1
+54 938 1
+54 942 1
+54 943 1
+54 944 1
+54 948 1
+54 952 1
+54 953 1
+54 954 1
+54 958 1
+54 959 1
+54 960 1
+54 964 1
+54 965 1
+54 966 1
+54 1005 1
+54 1010 1
+54 1014 1
+54 1018 1
+54 1019 1
+54 1020 1
+54 1060 1
+54 1064 1
+54 1068 1
+54 1069 1
+54 1070 1
+54 1074 1
+54 1078 1
+54 1079 1
+54 1080 1
+54 1084 1
+54 1085 1
+54 1086 1
+54 1090 1
+54 1091 1
+54 1092 1
+54 1130 1
+54 1134 1
+54 1138 1
+54 1139 1
+54 1140 1
+54 1144 1
+54 1148 1
+54 1149 1
+54 1150 1
+54 1154 1
+54 1155 1
+54 1156 1
+54 1160 1
+54 1161 1
+54 1162 1
+54 1199 1
+54 1203 1
+54 1204 1
+54 1205 1
+54 1209 1
+54 1210 1
+54 1211 1
+54 1215 1
+54 1216 1
+54 1217 1
+54 1219 1
+54 1220 1
+54 1221 1
+54 1225 1
+54 1226 1
+54 1227 1
+54 1229 1
+54 1230 1
+54 1231 1
+54 1233 1
+54 1257 1
+54 1262 1
+54 1266 1
+54 1270 1
+54 1271 1
+54 1272 1
+54 1312 1
+54 1316 1
+54 1320 1
+54 1321 1
+54 1322 1
+54 1326 1
+54 1330 1
+54 1331 1
+54 1332 1
+54 1336 1
+54 1337 1
+54 1338 1
+54 1342 1
+54 1343 1
+54 1344 1
+54 1382 1
+54 1386 1
+54 1390 1
+54 1391 1
+54 1392 1
+54 1396 1
+54 1400 1
+54 1401 1
+54 1402 1
+54 1406 1
+54 1407 1
+54 1408 1
+54 1412 1
+54 1413 1
+54 1414 1
+54 1451 1
+54 1455 1
+54 1456 1
+54 1457 1
+54 1461 1
+54 1462 1
+54 1463 1
+54 1467 1
+54 1468 1
+54 1469 1
+54 1471 1
+54 1472 1
+54 1473 1
+54 1477 1
+54 1478 1
+54 1479 1
+54 1481 1
+54 1482 1
+54 1483 1
+54 1485 1
+54 1508 1
+54 1512 1
+54 1516 1
+54 1517 1
+54 1518 1
+54 1522 1
+54 1526 1
+54 1527 1
+54 1528 1
+54 1532 1
+54 1533 1
+54 1534 1
+54 1538 1
+54 1539 1
+54 1540 1
+54 1577 1
+54 1581 1
+54 1582 1
+54 1583 1
+54 1587 1
+54 1588 1
+54 1589 1
+54 1593 1
+54 1594 1
+54 1595 1
+54 1597 1
+54 1598 1
+54 1599 1
+54 1603 1
+54 1604 1
+54 1605 1
+54 1607 1
+54 1608 1
+54 1609 1
+54 1611 1
+54 1633 1
+54 1637 1
+54 1638 1
+54 1639 1
+54 1643 1
+54 1644 1
+54 1645 1
+54 1649 1
+54 1650 1
+54 1651 1
+54 1653 1
+54 1654 1
+54 1655 1
+54 1659 1
+54 1660 1
+54 1661 1
+54 1663 1
+54 1664 1
+54 1665 1
+54 1667 1
+54 1689 1
+54 1690 1
+54 1691 1
+54 1695 1
+54 1696 1
+54 1697 1
+54 1699 1
+54 1700 1
+54 1701 1
+54 1703 1
+54 1704 1
+54 1705 1
+54 1706 1
+54 1708 1
+54 1709 1
+55 13 1
+55 41 1
+55 68 1
+55 73 1
+55 77 1
+55 80 1
+55 83 1
+55 84 1
+55 125 1
+55 152 1
+55 157 1
+55 161 1
+55 164 1
+55 167 1
+55 168 1
+55 208 1
+55 213 1
+55 217 1
+55 220 1
+55 223 1
+55 224 1
+55 263 1
+55 267 1
+55 270 1
+55 273 1
+55 274 1
+55 277 1
+55 280 1
+55 283 1
+55 284 1
+55 286 1
+55 289 1
+55 290 1
+55 292 1
+55 293 1
+55 295 1
+55 335 1
+55 362 1
+55 367 1
+55 371 1
+55 374 1
+55 377 1
+55 378 1
+55 418 1
+55 423 1
+55 427 1
+55 430 1
+55 433 1
+55 434 1
+55 473 1
+55 477 1
+55 480 1
+55 483 1
+55 484 1
+55 487 1
+55 490 1
+55 493 1
+55 494 1
+55 496 1
+55 499 1
+55 500 1
+55 502 1
+55 503 1
+55 505 1
+55 544 1
+55 549 1
+55 553 1
+55 556 1
+55 559 1
+55 560 1
+55 599 1
+55 603 1
+55 606 1
+55 609 1
+55 610 1
+55 613 1
+55 616 1
+55 619 1
+55 620 1
+55 622 1
+55 625 1
+55 626 1
+55 628 1
+55 629 1
+55 631 1
+55 669 1
+55 673 1
+55 676 1
+55 679 1
+55 680 1
+55 683 1
+55 686 1
+55 689 1
+55 690 1
+55 692 1
+55 695 1
+55 696 1
+55 698 1
+55 699 1
+55 701 1
+55 738 1
+55 741 1
+55 744 1
+55 745 1
+55 747 1
+55 750 1
+55 751 1
+55 753 1
+55 754 1
+55 756 1
+55 757 1
+55 760 1
+55 761 1
+55 763 1
+55 764 1
+55 766 1
+55 767 1
+55 768 1
+55 770 1
+55 771 1
+55 797 1
+55 824 1
+55 829 1
+55 833 1
+55 836 1
+55 839 1
+55 840 1
+55 880 1
+55 885 1
+55 889 1
+55 892 1
+55 895 1
+55 896 1
+55 935 1
+55 939 1
+55 942 1
+55 945 1
+55 946 1
+55 949 1
+55 952 1
+55 955 1
+55 956 1
+55 958 1
+55 961 1
+55 962 1
+55 964 1
+55 965 1
+55 967 1
+55 1006 1
+55 1011 1
+55 1015 1
+55 1018 1
+55 1021 1
+55 1022 1
+55 1061 1
+55 1065 1
+55 1068 1
+55 1071 1
+55 1072 1
+55 1075 1
+55 1078 1
+55 1081 1
+55 1082 1
+55 1084 1
+55 1087 1
+55 1088 1
+55 1090 1
+55 1091 1
+55 1093 1
+55 1131 1
+55 1135 1
+55 1138 1
+55 1141 1
+55 1142 1
+55 1145 1
+55 1148 1
+55 1151 1
+55 1152 1
+55 1154 1
+55 1157 1
+55 1158 1
+55 1160 1
+55 1161 1
+55 1163 1
+55 1200 1
+55 1203 1
+55 1206 1
+55 1207 1
+55 1209 1
+55 1212 1
+55 1213 1
+55 1215 1
+55 1216 1
+55 1218 1
+55 1219 1
+55 1222 1
+55 1223 1
+55 1225 1
+55 1226 1
+55 1228 1
+55 1229 1
+55 1230 1
+55 1232 1
+55 1233 1
+55 1258 1
+55 1263 1
+55 1267 1
+55 1270 1
+55 1273 1
+55 1274 1
+55 1313 1
+55 1317 1
+55 1320 1
+55 1323 1
+55 1324 1
+55 1327 1
+55 1330 1
+55 1333 1
+55 1334 1
+55 1336 1
+55 1339 1
+55 1340 1
+55 1342 1
+55 1343 1
+55 1345 1
+55 1383 1
+55 1387 1
+55 1390 1
+55 1393 1
+55 1394 1
+55 1397 1
+55 1400 1
+55 1403 1
+55 1404 1
+55 1406 1
+55 1409 1
+55 1410 1
+55 1412 1
+55 1413 1
+55 1415 1
+55 1452 1
+55 1455 1
+55 1458 1
+55 1459 1
+55 1461 1
+55 1464 1
+55 1465 1
+55 1467 1
+55 1468 1
+55 1470 1
+55 1471 1
+55 1474 1
+55 1475 1
+55 1477 1
+55 1478 1
+55 1480 1
+55 1481 1
+55 1482 1
+55 1484 1
+55 1485 1
+55 1509 1
+55 1513 1
+55 1516 1
+55 1519 1
+55 1520 1
+55 1523 1
+55 1526 1
+55 1529 1
+55 1530 1
+55 1532 1
+55 1535 1
+55 1536 1
+55 1538 1
+55 1539 1
+55 1541 1
+55 1578 1
+55 1581 1
+55 1584 1
+55 1585 1
+55 1587 1
+55 1590 1
+55 1591 1
+55 1593 1
+55 1594 1
+55 1596 1
+55 1597 1
+55 1600 1
+55 1601 1
+55 1603 1
+55 1604 1
+55 1606 1
+55 1607 1
+55 1608 1
+55 1610 1
+55 1611 1
+55 1634 1
+55 1637 1
+55 1640 1
+55 1641 1
+55 1643 1
+55 1646 1
+55 1647 1
+55 1649 1
+55 1650 1
+55 1652 1
+55 1653 1
+55 1656 1
+55 1657 1
+55 1659 1
+55 1660 1
+55 1662 1
+55 1663 1
+55 1664 1
+55 1666 1
+55 1667 1
+55 1689 1
+55 1692 1
+55 1693 1
+55 1695 1
+55 1696 1
+55 1698 1
+55 1699 1
+55 1700 1
+55 1702 1
+55 1703 1
+55 1704 1
+55 1705 1
+55 1707 1
+55 1708 1
+55 1709 1
+56 14 1
+56 42 1
+56 69 1
+56 74 1
+56 78 1
+56 81 1
+56 83 1
+56 85 1
+56 126 1
+56 153 1
+56 158 1
+56 162 1
+56 165 1
+56 167 1
+56 169 1
+56 209 1
+56 214 1
+56 218 1
+56 221 1
+56 223 1
+56 225 1
+56 264 1
+56 268 1
+56 271 1
+56 273 1
+56 275 1
+56 278 1
+56 281 1
+56 283 1
+56 285 1
+56 287 1
+56 289 1
+56 291 1
+56 292 1
+56 294 1
+56 295 1
+56 336 1
+56 363 1
+56 368 1
+56 372 1
+56 375 1
+56 377 1
+56 379 1
+56 419 1
+56 424 1
+56 428 1
+56 431 1
+56 433 1
+56 435 1
+56 474 1
+56 478 1
+56 481 1
+56 483 1
+56 485 1
+56 488 1
+56 491 1
+56 493 1
+56 495 1
+56 497 1
+56 499 1
+56 501 1
+56 502 1
+56 504 1
+56 505 1
+56 545 1
+56 550 1
+56 554 1
+56 557 1
+56 559 1
+56 561 1
+56 600 1
+56 604 1
+56 607 1
+56 609 1
+56 611 1
+56 614 1
+56 617 1
+56 619 1
+56 621 1
+56 623 1
+56 625 1
+56 627 1
+56 628 1
+56 630 1
+56 631 1
+56 670 1
+56 674 1
+56 677 1
+56 679 1
+56 681 1
+56 684 1
+56 687 1
+56 689 1
+56 691 1
+56 693 1
+56 695 1
+56 697 1
+56 698 1
+56 700 1
+56 701 1
+56 739 1
+56 742 1
+56 744 1
+56 746 1
+56 748 1
+56 750 1
+56 752 1
+56 753 1
+56 755 1
+56 756 1
+56 758 1
+56 760 1
+56 762 1
+56 763 1
+56 765 1
+56 766 1
+56 767 1
+56 769 1
+56 770 1
+56 771 1
+56 798 1
+56 825 1
+56 830 1
+56 834 1
+56 837 1
+56 839 1
+56 841 1
+56 881 1
+56 886 1
+56 890 1
+56 893 1
+56 895 1
+56 897 1
+56 936 1
+56 940 1
+56 943 1
+56 945 1
+56 947 1
+56 950 1
+56 953 1
+56 955 1
+56 957 1
+56 959 1
+56 961 1
+56 963 1
+56 964 1
+56 966 1
+56 967 1
+56 1007 1
+56 1012 1
+56 1016 1
+56 1019 1
+56 1021 1
+56 1023 1
+56 1062 1
+56 1066 1
+56 1069 1
+56 1071 1
+56 1073 1
+56 1076 1
+56 1079 1
+56 1081 1
+56 1083 1
+56 1085 1
+56 1087 1
+56 1089 1
+56 1090 1
+56 1092 1
+56 1093 1
+56 1132 1
+56 1136 1
+56 1139 1
+56 1141 1
+56 1143 1
+56 1146 1
+56 1149 1
+56 1151 1
+56 1153 1
+56 1155 1
+56 1157 1
+56 1159 1
+56 1160 1
+56 1162 1
+56 1163 1
+56 1201 1
+56 1204 1
+56 1206 1
+56 1208 1
+56 1210 1
+56 1212 1
+56 1214 1
+56 1215 1
+56 1217 1
+56 1218 1
+56 1220 1
+56 1222 1
+56 1224 1
+56 1225 1
+56 1227 1
+56 1228 1
+56 1229 1
+56 1231 1
+56 1232 1
+56 1233 1
+56 1259 1
+56 1264 1
+56 1268 1
+56 1271 1
+56 1273 1
+56 1275 1
+56 1314 1
+56 1318 1
+56 1321 1
+56 1323 1
+56 1325 1
+56 1328 1
+56 1331 1
+56 1333 1
+56 1335 1
+56 1337 1
+56 1339 1
+56 1341 1
+56 1342 1
+56 1344 1
+56 1345 1
+56 1384 1
+56 1388 1
+56 1391 1
+56 1393 1
+56 1395 1
+56 1398 1
+56 1401 1
+56 1403 1
+56 1405 1
+56 1407 1
+56 1409 1
+56 1411 1
+56 1412 1
+56 1414 1
+56 1415 1
+56 1453 1
+56 1456 1
+56 1458 1
+56 1460 1
+56 1462 1
+56 1464 1
+56 1466 1
+56 1467 1
+56 1469 1
+56 1470 1
+56 1472 1
+56 1474 1
+56 1476 1
+56 1477 1
+56 1479 1
+56 1480 1
+56 1481 1
+56 1483 1
+56 1484 1
+56 1485 1
+56 1510 1
+56 1514 1
+56 1517 1
+56 1519 1
+56 1521 1
+56 1524 1
+56 1527 1
+56 1529 1
+56 1531 1
+56 1533 1
+56 1535 1
+56 1537 1
+56 1538 1
+56 1540 1
+56 1541 1
+56 1579 1
+56 1582 1
+56 1584 1
+56 1586 1
+56 1588 1
+56 1590 1
+56 1592 1
+56 1593 1
+56 1595 1
+56 1596 1
+56 1598 1
+56 1600 1
+56 1602 1
+56 1603 1
+56 1605 1
+56 1606 1
+56 1607 1
+56 1609 1
+56 1610 1
+56 1611 1
+56 1635 1
+56 1638 1
+56 1640 1
+56 1642 1
+56 1644 1
+56 1646 1
+56 1648 1
+56 1649 1
+56 1651 1
+56 1652 1
+56 1654 1
+56 1656 1
+56 1658 1
+56 1659 1
+56 1661 1
+56 1662 1
+56 1663 1
+56 1665 1
+56 1666 1
+56 1667 1
+56 1690 1
+56 1692 1
+56 1694 1
+56 1695 1
+56 1697 1
+56 1698 1
+56 1699 1
+56 1701 1
+56 1702 1
+56 1703 1
+56 1704 1
+56 1706 1
+56 1707 1
+56 1708 1
+56 1709 1
+57 15 1
+57 43 1
+57 70 1
+57 75 1
+57 79 1
+57 82 1
+57 84 1
+57 85 1
+57 127 1
+57 154 1
+57 159 1
+57 163 1
+57 166 1
+57 168 1
+57 169 1
+57 210 1
+57 215 1
+57 219 1
+57 222 1
+57 224 1
+57 225 1
+57 265 1
+57 269 1
+57 272 1
+57 274 1
+57 275 1
+57 279 1
+57 282 1
+57 284 1
+57 285 1
+57 288 1
+57 290 1
+57 291 1
+57 293 1
+57 294 1
+57 295 1
+57 337 1
+57 364 1
+57 369 1
+57 373 1
+57 376 1
+57 378 1
+57 379 1
+57 420 1
+57 425 1
+57 429 1
+57 432 1
+57 434 1
+57 435 1
+57 475 1
+57 479 1
+57 482 1
+57 484 1
+57 485 1
+57 489 1
+57 492 1
+57 494 1
+57 495 1
+57 498 1
+57 500 1
+57 501 1
+57 503 1
+57 504 1
+57 505 1
+57 546 1
+57 551 1
+57 555 1
+57 558 1
+57 560 1
+57 561 1
+57 601 1
+57 605 1
+57 608 1
+57 610 1
+57 611 1
+57 615 1
+57 618 1
+57 620 1
+57 621 1
+57 624 1
+57 626 1
+57 627 1
+57 629 1
+57 630 1
+57 631 1
+57 671 1
+57 675 1
+57 678 1
+57 680 1
+57 681 1
+57 685 1
+57 688 1
+57 690 1
+57 691 1
+57 694 1
+57 696 1
+57 697 1
+57 699 1
+57 700 1
+57 701 1
+57 740 1
+57 743 1
+57 745 1
+57 746 1
+57 749 1
+57 751 1
+57 752 1
+57 754 1
+57 755 1
+57 756 1
+57 759 1
+57 761 1
+57 762 1
+57 764 1
+57 765 1
+57 766 1
+57 768 1
+57 769 1
+57 770 1
+57 771 1
+57 799 1
+57 826 1
+57 831 1
+57 835 1
+57 838 1
+57 840 1
+57 841 1
+57 882 1
+57 887 1
+57 891 1
+57 894 1
+57 896 1
+57 897 1
+57 937 1
+57 941 1
+57 944 1
+57 946 1
+57 947 1
+57 951 1
+57 954 1
+57 956 1
+57 957 1
+57 960 1
+57 962 1
+57 963 1
+57 965 1
+57 966 1
+57 967 1
+57 1008 1
+57 1013 1
+57 1017 1
+57 1020 1
+57 1022 1
+57 1023 1
+57 1063 1
+57 1067 1
+57 1070 1
+57 1072 1
+57 1073 1
+57 1077 1
+57 1080 1
+57 1082 1
+57 1083 1
+57 1086 1
+57 1088 1
+57 1089 1
+57 1091 1
+57 1092 1
+57 1093 1
+57 1133 1
+57 1137 1
+57 1140 1
+57 1142 1
+57 1143 1
+57 1147 1
+57 1150 1
+57 1152 1
+57 1153 1
+57 1156 1
+57 1158 1
+57 1159 1
+57 1161 1
+57 1162 1
+57 1163 1
+57 1202 1
+57 1205 1
+57 1207 1
+57 1208 1
+57 1211 1
+57 1213 1
+57 1214 1
+57 1216 1
+57 1217 1
+57 1218 1
+57 1221 1
+57 1223 1
+57 1224 1
+57 1226 1
+57 1227 1
+57 1228 1
+57 1230 1
+57 1231 1
+57 1232 1
+57 1233 1
+57 1260 1
+57 1265 1
+57 1269 1
+57 1272 1
+57 1274 1
+57 1275 1
+57 1315 1
+57 1319 1
+57 1322 1
+57 1324 1
+57 1325 1
+57 1329 1
+57 1332 1
+57 1334 1
+57 1335 1
+57 1338 1
+57 1340 1
+57 1341 1
+57 1343 1
+57 1344 1
+57 1345 1
+57 1385 1
+57 1389 1
+57 1392 1
+57 1394 1
+57 1395 1
+57 1399 1
+57 1402 1
+57 1404 1
+57 1405 1
+57 1408 1
+57 1410 1
+57 1411 1
+57 1413 1
+57 1414 1
+57 1415 1
+57 1454 1
+57 1457 1
+57 1459 1
+57 1460 1
+57 1463 1
+57 1465 1
+57 1466 1
+57 1468 1
+57 1469 1
+57 1470 1
+57 1473 1
+57 1475 1
+57 1476 1
+57 1478 1
+57 1479 1
+57 1480 1
+57 1482 1
+57 1483 1
+57 1484 1
+57 1485 1
+57 1511 1
+57 1515 1
+57 1518 1
+57 1520 1
+57 1521 1
+57 1525 1
+57 1528 1
+57 1530 1
+57 1531 1
+57 1534 1
+57 1536 1
+57 1537 1
+57 1539 1
+57 1540 1
+57 1541 1
+57 1580 1
+57 1583 1
+57 1585 1
+57 1586 1
+57 1589 1
+57 1591 1
+57 1592 1
+57 1594 1
+57 1595 1
+57 1596 1
+57 1599 1
+57 1601 1
+57 1602 1
+57 1604 1
+57 1605 1
+57 1606 1
+57 1608 1
+57 1609 1
+57 1610 1
+57 1611 1
+57 1636 1
+57 1639 1
+57 1641 1
+57 1642 1
+57 1645 1
+57 1647 1
+57 1648 1
+57 1650 1
+57 1651 1
+57 1652 1
+57 1655 1
+57 1657 1
+57 1658 1
+57 1660 1
+57 1661 1
+57 1662 1
+57 1664 1
+57 1665 1
+57 1666 1
+57 1667 1
+57 1691 1
+57 1693 1
+57 1694 1
+57 1696 1
+57 1697 1
+57 1698 1
+57 1700 1
+57 1701 1
+57 1702 1
+57 1703 1
+57 1705 1
+57 1706 1
+57 1707 1
+57 1708 1
+57 1709 1
+58 16 1
+58 44 1
+58 65 1
+58 86 1
+58 87 1
+58 88 1
+58 89 1
+58 90 1
+58 128 1
+58 149 1
+58 170 1
+58 171 1
+58 172 1
+58 173 1
+58 174 1
+58 205 1
+58 226 1
+58 227 1
+58 228 1
+58 229 1
+58 230 1
+58 261 1
+58 262 1
+58 263 1
+58 264 1
+58 265 1
+58 296 1
+58 297 1
+58 298 1
+58 299 1
+58 300 1
+58 301 1
+58 302 1
+58 303 1
+58 304 1
+58 305 1
+58 338 1
+58 359 1
+58 380 1
+58 381 1
+58 382 1
+58 383 1
+58 384 1
+58 415 1
+58 436 1
+58 437 1
+58 438 1
+58 439 1
+58 440 1
+58 471 1
+58 472 1
+58 473 1
+58 474 1
+58 475 1
+58 506 1
+58 507 1
+58 508 1
+58 509 1
+58 510 1
+58 511 1
+58 512 1
+58 513 1
+58 514 1
+58 515 1
+58 541 1
+58 562 1
+58 563 1
+58 564 1
+58 565 1
+58 566 1
+58 597 1
+58 598 1
+58 599 1
+58 600 1
+58 601 1
+58 632 1
+58 633 1
+58 634 1
+58 635 1
+58 636 1
+58 637 1
+58 638 1
+58 639 1
+58 640 1
+58 641 1
+58 667 1
+58 668 1
+58 669 1
+58 670 1
+58 671 1
+58 702 1
+58 703 1
+58 704 1
+58 705 1
+58 706 1
+58 707 1
+58 708 1
+58 709 1
+58 710 1
+58 711 1
+58 737 1
+58 738 1
+58 739 1
+58 740 1
+58 741 1
+58 742 1
+58 743 1
+58 744 1
+58 745 1
+58 746 1
+58 772 1
+58 773 1
+58 774 1
+58 775 1
+58 776 1
+58 777 1
+58 778 1
+58 779 1
+58 780 1
+58 781 1
+58 800 1
+58 821 1
+58 842 1
+58 843 1
+58 844 1
+58 845 1
+58 846 1
+58 877 1
+58 898 1
+58 899 1
+58 900 1
+58 901 1
+58 902 1
+58 933 1
+58 934 1
+58 935 1
+58 936 1
+58 937 1
+58 968 1
+58 969 1
+58 970 1
+58 971 1
+58 972 1
+58 973 1
+58 974 1
+58 975 1
+58 976 1
+58 977 1
+58 1003 1
+58 1024 1
+58 1025 1
+58 1026 1
+58 1027 1
+58 1028 1
+58 1059 1
+58 1060 1
+58 1061 1
+58 1062 1
+58 1063 1
+58 1094 1
+58 1095 1
+58 1096 1
+58 1097 1
+58 1098 1
+58 1099 1
+58 1100 1
+58 1101 1
+58 1102 1
+58 1103 1
+58 1129 1
+58 1130 1
+58 1131 1
+58 1132 1
+58 1133 1
+58 1164 1
+58 1165 1
+58 1166 1
+58 1167 1
+58 1168 1
+58 1169 1
+58 1170 1
+58 1171 1
+58 1172 1
+58 1173 1
+58 1199 1
+58 1200 1
+58 1201 1
+58 1202 1
+58 1203 1
+58 1204 1
+58 1205 1
+58 1206 1
+58 1207 1
+58 1208 1
+58 1234 1
+58 1235 1
+58 1236 1
+58 1237 1
+58 1238 1
+58 1239 1
+58 1240 1
+58 1241 1
+58 1242 1
+58 1243 1
+58 1255 1
+58 1276 1
+58 1277 1
+58 1278 1
+58 1279 1
+58 1280 1
+58 1311 1
+58 1312 1
+58 1313 1
+58 1314 1
+58 1315 1
+58 1346 1
+58 1347 1
+58 1348 1
+58 1349 1
+58 1350 1
+58 1351 1
+58 1352 1
+58 1353 1
+58 1354 1
+58 1355 1
+58 1381 1
+58 1382 1
+58 1383 1
+58 1384 1
+58 1385 1
+58 1416 1
+58 1417 1
+58 1418 1
+58 1419 1
+58 1420 1
+58 1421 1
+58 1422 1
+58 1423 1
+58 1424 1
+58 1425 1
+58 1451 1
+58 1452 1
+58 1453 1
+58 1454 1
+58 1455 1
+58 1456 1
+58 1457 1
+58 1458 1
+58 1459 1
+58 1460 1
+58 1486 1
+58 1487 1
+58 1488 1
+58 1489 1
+58 1490 1
+58 1491 1
+58 1492 1
+58 1493 1
+58 1494 1
+58 1495 1
+58 1507 1
+58 1508 1
+58 1509 1
+58 1510 1
+58 1511 1
+58 1542 1
+58 1543 1
+58 1544 1
+58 1545 1
+58 1546 1
+58 1547 1
+58 1548 1
+58 1549 1
+58 1550 1
+58 1551 1
+58 1577 1
+58 1578 1
+58 1579 1
+58 1580 1
+58 1581 1
+58 1582 1
+58 1583 1
+58 1584 1
+58 1585 1
+58 1586 1
+58 1612 1
+58 1613 1
+58 1614 1
+58 1615 1
+58 1616 1
+58 1617 1
+58 1618 1
+58 1619 1
+58 1620 1
+58 1621 1
+58 1633 1
+58 1634 1
+58 1635 1
+58 1636 1
+58 1637 1
+58 1638 1
+58 1639 1
+58 1640 1
+58 1641 1
+58 1642 1
+58 1668 1
+58 1669 1
+58 1670 1
+58 1671 1
+58 1672 1
+58 1673 1
+58 1674 1
+58 1675 1
+58 1676 1
+58 1677 1
+58 1689 1
+58 1690 1
+58 1691 1
+58 1692 1
+58 1693 1
+58 1694 1
+58 1695 1
+58 1696 1
+58 1697 1
+58 1698 1
+58 1710 1
+58 1711 1
+58 1712 1
+58 1713 1
+58 1714 1
+59 17 1
+59 45 1
+59 66 1
+59 86 1
+59 91 1
+59 92 1
+59 93 1
+59 94 1
+59 129 1
+59 150 1
+59 170 1
+59 175 1
+59 176 1
+59 177 1
+59 178 1
+59 206 1
+59 226 1
+59 231 1
+59 232 1
+59 233 1
+59 234 1
+59 261 1
+59 266 1
+59 267 1
+59 268 1
+59 269 1
+59 296 1
+59 297 1
+59 298 1
+59 299 1
+59 306 1
+59 307 1
+59 308 1
+59 309 1
+59 310 1
+59 311 1
+59 339 1
+59 360 1
+59 380 1
+59 385 1
+59 386 1
+59 387 1
+59 388 1
+59 416 1
+59 436 1
+59 441 1
+59 442 1
+59 443 1
+59 444 1
+59 471 1
+59 476 1
+59 477 1
+59 478 1
+59 479 1
+59 506 1
+59 507 1
+59 508 1
+59 509 1
+59 516 1
+59 517 1
+59 518 1
+59 519 1
+59 520 1
+59 521 1
+59 542 1
+59 562 1
+59 567 1
+59 568 1
+59 569 1
+59 570 1
+59 597 1
+59 602 1
+59 603 1
+59 604 1
+59 605 1
+59 632 1
+59 633 1
+59 634 1
+59 635 1
+59 642 1
+59 643 1
+59 644 1
+59 645 1
+59 646 1
+59 647 1
+59 667 1
+59 672 1
+59 673 1
+59 674 1
+59 675 1
+59 702 1
+59 703 1
+59 704 1
+59 705 1
+59 712 1
+59 713 1
+59 714 1
+59 715 1
+59 716 1
+59 717 1
+59 737 1
+59 738 1
+59 739 1
+59 740 1
+59 747 1
+59 748 1
+59 749 1
+59 750 1
+59 751 1
+59 752 1
+59 772 1
+59 773 1
+59 774 1
+59 775 1
+59 776 1
+59 777 1
+59 782 1
+59 783 1
+59 784 1
+59 785 1
+59 801 1
+59 822 1
+59 842 1
+59 847 1
+59 848 1
+59 849 1
+59 850 1
+59 878 1
+59 898 1
+59 903 1
+59 904 1
+59 905 1
+59 906 1
+59 933 1
+59 938 1
+59 939 1
+59 940 1
+59 941 1
+59 968 1
+59 969 1
+59 970 1
+59 971 1
+59 978 1
+59 979 1
+59 980 1
+59 981 1
+59 982 1
+59 983 1
+59 1004 1
+59 1024 1
+59 1029 1
+59 1030 1
+59 1031 1
+59 1032 1
+59 1059 1
+59 1064 1
+59 1065 1
+59 1066 1
+59 1067 1
+59 1094 1
+59 1095 1
+59 1096 1
+59 1097 1
+59 1104 1
+59 1105 1
+59 1106 1
+59 1107 1
+59 1108 1
+59 1109 1
+59 1129 1
+59 1134 1
+59 1135 1
+59 1136 1
+59 1137 1
+59 1164 1
+59 1165 1
+59 1166 1
+59 1167 1
+59 1174 1
+59 1175 1
+59 1176 1
+59 1177 1
+59 1178 1
+59 1179 1
+59 1199 1
+59 1200 1
+59 1201 1
+59 1202 1
+59 1209 1
+59 1210 1
+59 1211 1
+59 1212 1
+59 1213 1
+59 1214 1
+59 1234 1
+59 1235 1
+59 1236 1
+59 1237 1
+59 1238 1
+59 1239 1
+59 1244 1
+59 1245 1
+59 1246 1
+59 1247 1
+59 1256 1
+59 1276 1
+59 1281 1
+59 1282 1
+59 1283 1
+59 1284 1
+59 1311 1
+59 1316 1
+59 1317 1
+59 1318 1
+59 1319 1
+59 1346 1
+59 1347 1
+59 1348 1
+59 1349 1
+59 1356 1
+59 1357 1
+59 1358 1
+59 1359 1
+59 1360 1
+59 1361 1
+59 1381 1
+59 1386 1
+59 1387 1
+59 1388 1
+59 1389 1
+59 1416 1
+59 1417 1
+59 1418 1
+59 1419 1
+59 1426 1
+59 1427 1
+59 1428 1
+59 1429 1
+59 1430 1
+59 1431 1
+59 1451 1
+59 1452 1
+59 1453 1
+59 1454 1
+59 1461 1
+59 1462 1
+59 1463 1
+59 1464 1
+59 1465 1
+59 1466 1
+59 1486 1
+59 1487 1
+59 1488 1
+59 1489 1
+59 1490 1
+59 1491 1
+59 1496 1
+59 1497 1
+59 1498 1
+59 1499 1
+59 1507 1
+59 1512 1
+59 1513 1
+59 1514 1
+59 1515 1
+59 1542 1
+59 1543 1
+59 1544 1
+59 1545 1
+59 1552 1
+59 1553 1
+59 1554 1
+59 1555 1
+59 1556 1
+59 1557 1
+59 1577 1
+59 1578 1
+59 1579 1
+59 1580 1
+59 1587 1
+59 1588 1
+59 1589 1
+59 1590 1
+59 1591 1
+59 1592 1
+59 1612 1
+59 1613 1
+59 1614 1
+59 1615 1
+59 1616 1
+59 1617 1
+59 1622 1
+59 1623 1
+59 1624 1
+59 1625 1
+59 1633 1
+59 1634 1
+59 1635 1
+59 1636 1
+59 1643 1
+59 1644 1
+59 1645 1
+59 1646 1
+59 1647 1
+59 1648 1
+59 1668 1
+59 1669 1
+59 1670 1
+59 1671 1
+59 1672 1
+59 1673 1
+59 1678 1
+59 1679 1
+59 1680 1
+59 1681 1
+59 1689 1
+59 1690 1
+59 1691 1
+59 1692 1
+59 1693 1
+59 1694 1
+59 1699 1
+59 1700 1
+59 1701 1
+59 1702 1
+59 1710 1
+59 1711 1
+59 1712 1
+59 1713 1
+59 1715 1
+60 18 1
+60 46 1
+60 67 1
+60 87 1
+60 91 1
+60 95 1
+60 96 1
+60 97 1
+60 130 1
+60 151 1
+60 171 1
+60 175 1
+60 179 1
+60 180 1
+60 181 1
+60 207 1
+60 227 1
+60 231 1
+60 235 1
+60 236 1
+60 237 1
+60 262 1
+60 266 1
+60 270 1
+60 271 1
+60 272 1
+60 296 1
+60 300 1
+60 301 1
+60 302 1
+60 306 1
+60 307 1
+60 308 1
+60 312 1
+60 313 1
+60 314 1
+60 340 1
+60 361 1
+60 381 1
+60 385 1
+60 389 1
+60 390 1
+60 391 1
+60 417 1
+60 437 1
+60 441 1
+60 445 1
+60 446 1
+60 447 1
+60 472 1
+60 476 1
+60 480 1
+60 481 1
+60 482 1
+60 506 1
+60 510 1
+60 511 1
+60 512 1
+60 516 1
+60 517 1
+60 518 1
+60 522 1
+60 523 1
+60 524 1
+60 543 1
+60 563 1
+60 567 1
+60 571 1
+60 572 1
+60 573 1
+60 598 1
+60 602 1
+60 606 1
+60 607 1
+60 608 1
+60 632 1
+60 636 1
+60 637 1
+60 638 1
+60 642 1
+60 643 1
+60 644 1
+60 648 1
+60 649 1
+60 650 1
+60 668 1
+60 672 1
+60 676 1
+60 677 1
+60 678 1
+60 702 1
+60 706 1
+60 707 1
+60 708 1
+60 712 1
+60 713 1
+60 714 1
+60 718 1
+60 719 1
+60 720 1
+60 737 1
+60 741 1
+60 742 1
+60 743 1
+60 747 1
+60 748 1
+60 749 1
+60 753 1
+60 754 1
+60 755 1
+60 772 1
+60 773 1
+60 774 1
+60 778 1
+60 779 1
+60 780 1
+60 782 1
+60 783 1
+60 784 1
+60 786 1
+60 802 1
+60 823 1
+60 843 1
+60 847 1
+60 851 1
+60 852 1
+60 853 1
+60 879 1
+60 899 1
+60 903 1
+60 907 1
+60 908 1
+60 909 1
+60 934 1
+60 938 1
+60 942 1
+60 943 1
+60 944 1
+60 968 1
+60 972 1
+60 973 1
+60 974 1
+60 978 1
+60 979 1
+60 980 1
+60 984 1
+60 985 1
+60 986 1
+60 1005 1
+60 1025 1
+60 1029 1
+60 1033 1
+60 1034 1
+60 1035 1
+60 1060 1
+60 1064 1
+60 1068 1
+60 1069 1
+60 1070 1
+60 1094 1
+60 1098 1
+60 1099 1
+60 1100 1
+60 1104 1
+60 1105 1
+60 1106 1
+60 1110 1
+60 1111 1
+60 1112 1
+60 1130 1
+60 1134 1
+60 1138 1
+60 1139 1
+60 1140 1
+60 1164 1
+60 1168 1
+60 1169 1
+60 1170 1
+60 1174 1
+60 1175 1
+60 1176 1
+60 1180 1
+60 1181 1
+60 1182 1
+60 1199 1
+60 1203 1
+60 1204 1
+60 1205 1
+60 1209 1
+60 1210 1
+60 1211 1
+60 1215 1
+60 1216 1
+60 1217 1
+60 1234 1
+60 1235 1
+60 1236 1
+60 1240 1
+60 1241 1
+60 1242 1
+60 1244 1
+60 1245 1
+60 1246 1
+60 1248 1
+60 1257 1
+60 1277 1
+60 1281 1
+60 1285 1
+60 1286 1
+60 1287 1
+60 1312 1
+60 1316 1
+60 1320 1
+60 1321 1
+60 1322 1
+60 1346 1
+60 1350 1
+60 1351 1
+60 1352 1
+60 1356 1
+60 1357 1
+60 1358 1
+60 1362 1
+60 1363 1
+60 1364 1
+60 1382 1
+60 1386 1
+60 1390 1
+60 1391 1
+60 1392 1
+60 1416 1
+60 1420 1
+60 1421 1
+60 1422 1
+60 1426 1
+60 1427 1
+60 1428 1
+60 1432 1
+60 1433 1
+60 1434 1
+60 1451 1
+60 1455 1
+60 1456 1
+60 1457 1
+60 1461 1
+60 1462 1
+60 1463 1
+60 1467 1
+60 1468 1
+60 1469 1
+60 1486 1
+60 1487 1
+60 1488 1
+60 1492 1
+60 1493 1
+60 1494 1
+60 1496 1
+60 1497 1
+60 1498 1
+60 1500 1
+60 1508 1
+60 1512 1
+60 1516 1
+60 1517 1
+60 1518 1
+60 1542 1
+60 1546 1
+60 1547 1
+60 1548 1
+60 1552 1
+60 1553 1
+60 1554 1
+60 1558 1
+60 1559 1
+60 1560 1
+60 1577 1
+60 1581 1
+60 1582 1
+60 1583 1
+60 1587 1
+60 1588 1
+60 1589 1
+60 1593 1
+60 1594 1
+60 1595 1
+60 1612 1
+60 1613 1
+60 1614 1
+60 1618 1
+60 1619 1
+60 1620 1
+60 1622 1
+60 1623 1
+60 1624 1
+60 1626 1
+60 1633 1
+60 1637 1
+60 1638 1
+60 1639 1
+60 1643 1
+60 1644 1
+60 1645 1
+60 1649 1
+60 1650 1
+60 1651 1
+60 1668 1
+60 1669 1
+60 1670 1
+60 1674 1
+60 1675 1
+60 1676 1
+60 1678 1
+60 1679 1
+60 1680 1
+60 1682 1
+60 1689 1
+60 1690 1
+60 1691 1
+60 1695 1
+60 1696 1
+60 1697 1
+60 1699 1
+60 1700 1
+60 1701 1
+60 1703 1
+60 1710 1
+60 1711 1
+60 1712 1
+60 1714 1
+60 1715 1
+61 19 1
+61 47 1
+61 68 1
+61 88 1
+61 92 1
+61 95 1
+61 98 1
+61 99 1
+61 131 1
+61 152 1
+61 172 1
+61 176 1
+61 179 1
+61 182 1
+61 183 1
+61 208 1
+61 228 1
+61 232 1
+61 235 1
+61 238 1
+61 239 1
+61 263 1
+61 267 1
+61 270 1
+61 273 1
+61 274 1
+61 297 1
+61 300 1
+61 303 1
+61 304 1
+61 306 1
+61 309 1
+61 310 1
+61 312 1
+61 313 1
+61 315 1
+61 341 1
+61 362 1
+61 382 1
+61 386 1
+61 389 1
+61 392 1
+61 393 1
+61 418 1
+61 438 1
+61 442 1
+61 445 1
+61 448 1
+61 449 1
+61 473 1
+61 477 1
+61 480 1
+61 483 1
+61 484 1
+61 507 1
+61 510 1
+61 513 1
+61 514 1
+61 516 1
+61 519 1
+61 520 1
+61 522 1
+61 523 1
+61 525 1
+61 544 1
+61 564 1
+61 568 1
+61 571 1
+61 574 1
+61 575 1
+61 599 1
+61 603 1
+61 606 1
+61 609 1
+61 610 1
+61 633 1
+61 636 1
+61 639 1
+61 640 1
+61 642 1
+61 645 1
+61 646 1
+61 648 1
+61 649 1
+61 651 1
+61 669 1
+61 673 1
+61 676 1
+61 679 1
+61 680 1
+61 703 1
+61 706 1
+61 709 1
+61 710 1
+61 712 1
+61 715 1
+61 716 1
+61 718 1
+61 719 1
+61 721 1
+61 738 1
+61 741 1
+61 744 1
+61 745 1
+61 747 1
+61 750 1
+61 751 1
+61 753 1
+61 754 1
+61 756 1
+61 772 1
+61 775 1
+61 776 1
+61 778 1
+61 779 1
+61 781 1
+61 782 1
+61 783 1
+61 785 1
+61 786 1
+61 803 1
+61 824 1
+61 844 1
+61 848 1
+61 851 1
+61 854 1
+61 855 1
+61 880 1
+61 900 1
+61 904 1
+61 907 1
+61 910 1
+61 911 1
+61 935 1
+61 939 1
+61 942 1
+61 945 1
+61 946 1
+61 969 1
+61 972 1
+61 975 1
+61 976 1
+61 978 1
+61 981 1
+61 982 1
+61 984 1
+61 985 1
+61 987 1
+61 1006 1
+61 1026 1
+61 1030 1
+61 1033 1
+61 1036 1
+61 1037 1
+61 1061 1
+61 1065 1
+61 1068 1
+61 1071 1
+61 1072 1
+61 1095 1
+61 1098 1
+61 1101 1
+61 1102 1
+61 1104 1
+61 1107 1
+61 1108 1
+61 1110 1
+61 1111 1
+61 1113 1
+61 1131 1
+61 1135 1
+61 1138 1
+61 1141 1
+61 1142 1
+61 1165 1
+61 1168 1
+61 1171 1
+61 1172 1
+61 1174 1
+61 1177 1
+61 1178 1
+61 1180 1
+61 1181 1
+61 1183 1
+61 1200 1
+61 1203 1
+61 1206 1
+61 1207 1
+61 1209 1
+61 1212 1
+61 1213 1
+61 1215 1
+61 1216 1
+61 1218 1
+61 1234 1
+61 1237 1
+61 1238 1
+61 1240 1
+61 1241 1
+61 1243 1
+61 1244 1
+61 1245 1
+61 1247 1
+61 1248 1
+61 1258 1
+61 1278 1
+61 1282 1
+61 1285 1
+61 1288 1
+61 1289 1
+61 1313 1
+61 1317 1
+61 1320 1
+61 1323 1
+61 1324 1
+61 1347 1
+61 1350 1
+61 1353 1
+61 1354 1
+61 1356 1
+61 1359 1
+61 1360 1
+61 1362 1
+61 1363 1
+61 1365 1
+61 1383 1
+61 1387 1
+61 1390 1
+61 1393 1
+61 1394 1
+61 1417 1
+61 1420 1
+61 1423 1
+61 1424 1
+61 1426 1
+61 1429 1
+61 1430 1
+61 1432 1
+61 1433 1
+61 1435 1
+61 1452 1
+61 1455 1
+61 1458 1
+61 1459 1
+61 1461 1
+61 1464 1
+61 1465 1
+61 1467 1
+61 1468 1
+61 1470 1
+61 1486 1
+61 1489 1
+61 1490 1
+61 1492 1
+61 1493 1
+61 1495 1
+61 1496 1
+61 1497 1
+61 1499 1
+61 1500 1
+61 1509 1
+61 1513 1
+61 1516 1
+61 1519 1
+61 1520 1
+61 1543 1
+61 1546 1
+61 1549 1
+61 1550 1
+61 1552 1
+61 1555 1
+61 1556 1
+61 1558 1
+61 1559 1
+61 1561 1
+61 1578 1
+61 1581 1
+61 1584 1
+61 1585 1
+61 1587 1
+61 1590 1
+61 1591 1
+61 1593 1
+61 1594 1
+61 1596 1
+61 1612 1
+61 1615 1
+61 1616 1
+61 1618 1
+61 1619 1
+61 1621 1
+61 1622 1
+61 1623 1
+61 1625 1
+61 1626 1
+61 1634 1
+61 1637 1
+61 1640 1
+61 1641 1
+61 1643 1
+61 1646 1
+61 1647 1
+61 1649 1
+61 1650 1
+61 1652 1
+61 1668 1
+61 1671 1
+61 1672 1
+61 1674 1
+61 1675 1
+61 1677 1
+61 1678 1
+61 1679 1
+61 1681 1
+61 1682 1
+61 1689 1
+61 1692 1
+61 1693 1
+61 1695 1
+61 1696 1
+61 1698 1
+61 1699 1
+61 1700 1
+61 1702 1
+61 1703 1
+61 1710 1
+61 1711 1
+61 1713 1
+61 1714 1
+61 1715 1
+62 20 1
+62 48 1
+62 69 1
+62 89 1
+62 93 1
+62 96 1
+62 98 1
+62 100 1
+62 132 1
+62 153 1
+62 173 1
+62 177 1
+62 180 1
+62 182 1
+62 184 1
+62 209 1
+62 229 1
+62 233 1
+62 236 1
+62 238 1
+62 240 1
+62 264 1
+62 268 1
+62 271 1
+62 273 1
+62 275 1
+62 298 1
+62 301 1
+62 303 1
+62 305 1
+62 307 1
+62 309 1
+62 311 1
+62 312 1
+62 314 1
+62 315 1
+62 342 1
+62 363 1
+62 383 1
+62 387 1
+62 390 1
+62 392 1
+62 394 1
+62 419 1
+62 439 1
+62 443 1
+62 446 1
+62 448 1
+62 450 1
+62 474 1
+62 478 1
+62 481 1
+62 483 1
+62 485 1
+62 508 1
+62 511 1
+62 513 1
+62 515 1
+62 517 1
+62 519 1
+62 521 1
+62 522 1
+62 524 1
+62 525 1
+62 545 1
+62 565 1
+62 569 1
+62 572 1
+62 574 1
+62 576 1
+62 600 1
+62 604 1
+62 607 1
+62 609 1
+62 611 1
+62 634 1
+62 637 1
+62 639 1
+62 641 1
+62 643 1
+62 645 1
+62 647 1
+62 648 1
+62 650 1
+62 651 1
+62 670 1
+62 674 1
+62 677 1
+62 679 1
+62 681 1
+62 704 1
+62 707 1
+62 709 1
+62 711 1
+62 713 1
+62 715 1
+62 717 1
+62 718 1
+62 720 1
+62 721 1
+62 739 1
+62 742 1
+62 744 1
+62 746 1
+62 748 1
+62 750 1
+62 752 1
+62 753 1
+62 755 1
+62 756 1
+62 773 1
+62 775 1
+62 777 1
+62 778 1
+62 780 1
+62 781 1
+62 782 1
+62 784 1
+62 785 1
+62 786 1
+62 804 1
+62 825 1
+62 845 1
+62 849 1
+62 852 1
+62 854 1
+62 856 1
+62 881 1
+62 901 1
+62 905 1
+62 908 1
+62 910 1
+62 912 1
+62 936 1
+62 940 1
+62 943 1
+62 945 1
+62 947 1
+62 970 1
+62 973 1
+62 975 1
+62 977 1
+62 979 1
+62 981 1
+62 983 1
+62 984 1
+62 986 1
+62 987 1
+62 1007 1
+62 1027 1
+62 1031 1
+62 1034 1
+62 1036 1
+62 1038 1
+62 1062 1
+62 1066 1
+62 1069 1
+62 1071 1
+62 1073 1
+62 1096 1
+62 1099 1
+62 1101 1
+62 1103 1
+62 1105 1
+62 1107 1
+62 1109 1
+62 1110 1
+62 1112 1
+62 1113 1
+62 1132 1
+62 1136 1
+62 1139 1
+62 1141 1
+62 1143 1
+62 1166 1
+62 1169 1
+62 1171 1
+62 1173 1
+62 1175 1
+62 1177 1
+62 1179 1
+62 1180 1
+62 1182 1
+62 1183 1
+62 1201 1
+62 1204 1
+62 1206 1
+62 1208 1
+62 1210 1
+62 1212 1
+62 1214 1
+62 1215 1
+62 1217 1
+62 1218 1
+62 1235 1
+62 1237 1
+62 1239 1
+62 1240 1
+62 1242 1
+62 1243 1
+62 1244 1
+62 1246 1
+62 1247 1
+62 1248 1
+62 1259 1
+62 1279 1
+62 1283 1
+62 1286 1
+62 1288 1
+62 1290 1
+62 1314 1
+62 1318 1
+62 1321 1
+62 1323 1
+62 1325 1
+62 1348 1
+62 1351 1
+62 1353 1
+62 1355 1
+62 1357 1
+62 1359 1
+62 1361 1
+62 1362 1
+62 1364 1
+62 1365 1
+62 1384 1
+62 1388 1
+62 1391 1
+62 1393 1
+62 1395 1
+62 1418 1
+62 1421 1
+62 1423 1
+62 1425 1
+62 1427 1
+62 1429 1
+62 1431 1
+62 1432 1
+62 1434 1
+62 1435 1
+62 1453 1
+62 1456 1
+62 1458 1
+62 1460 1
+62 1462 1
+62 1464 1
+62 1466 1
+62 1467 1
+62 1469 1
+62 1470 1
+62 1487 1
+62 1489 1
+62 1491 1
+62 1492 1
+62 1494 1
+62 1495 1
+62 1496 1
+62 1498 1
+62 1499 1
+62 1500 1
+62 1510 1
+62 1514 1
+62 1517 1
+62 1519 1
+62 1521 1
+62 1544 1
+62 1547 1
+62 1549 1
+62 1551 1
+62 1553 1
+62 1555 1
+62 1557 1
+62 1558 1
+62 1560 1
+62 1561 1
+62 1579 1
+62 1582 1
+62 1584 1
+62 1586 1
+62 1588 1
+62 1590 1
+62 1592 1
+62 1593 1
+62 1595 1
+62 1596 1
+62 1613 1
+62 1615 1
+62 1617 1
+62 1618 1
+62 1620 1
+62 1621 1
+62 1622 1
+62 1624 1
+62 1625 1
+62 1626 1
+62 1635 1
+62 1638 1
+62 1640 1
+62 1642 1
+62 1644 1
+62 1646 1
+62 1648 1
+62 1649 1
+62 1651 1
+62 1652 1
+62 1669 1
+62 1671 1
+62 1673 1
+62 1674 1
+62 1676 1
+62 1677 1
+62 1678 1
+62 1680 1
+62 1681 1
+62 1682 1
+62 1690 1
+62 1692 1
+62 1694 1
+62 1695 1
+62 1697 1
+62 1698 1
+62 1699 1
+62 1701 1
+62 1702 1
+62 1703 1
+62 1710 1
+62 1712 1
+62 1713 1
+62 1714 1
+62 1715 1
+63 21 1
+63 49 1
+63 70 1
+63 90 1
+63 94 1
+63 97 1
+63 99 1
+63 100 1
+63 133 1
+63 154 1
+63 174 1
+63 178 1
+63 181 1
+63 183 1
+63 184 1
+63 210 1
+63 230 1
+63 234 1
+63 237 1
+63 239 1
+63 240 1
+63 265 1
+63 269 1
+63 272 1
+63 274 1
+63 275 1
+63 299 1
+63 302 1
+63 304 1
+63 305 1
+63 308 1
+63 310 1
+63 311 1
+63 313 1
+63 314 1
+63 315 1
+63 343 1
+63 364 1
+63 384 1
+63 388 1
+63 391 1
+63 393 1
+63 394 1
+63 420 1
+63 440 1
+63 444 1
+63 447 1
+63 449 1
+63 450 1
+63 475 1
+63 479 1
+63 482 1
+63 484 1
+63 485 1
+63 509 1
+63 512 1
+63 514 1
+63 515 1
+63 518 1
+63 520 1
+63 521 1
+63 523 1
+63 524 1
+63 525 1
+63 546 1
+63 566 1
+63 570 1
+63 573 1
+63 575 1
+63 576 1
+63 601 1
+63 605 1
+63 608 1
+63 610 1
+63 611 1
+63 635 1
+63 638 1
+63 640 1
+63 641 1
+63 644 1
+63 646 1
+63 647 1
+63 649 1
+63 650 1
+63 651 1
+63 671 1
+63 675 1
+63 678 1
+63 680 1
+63 681 1
+63 705 1
+63 708 1
+63 710 1
+63 711 1
+63 714 1
+63 716 1
+63 717 1
+63 719 1
+63 720 1
+63 721 1
+63 740 1
+63 743 1
+63 745 1
+63 746 1
+63 749 1
+63 751 1
+63 752 1
+63 754 1
+63 755 1
+63 756 1
+63 774 1
+63 776 1
+63 777 1
+63 779 1
+63 780 1
+63 781 1
+63 783 1
+63 784 1
+63 785 1
+63 786 1
+63 805 1
+63 826 1
+63 846 1
+63 850 1
+63 853 1
+63 855 1
+63 856 1
+63 882 1
+63 902 1
+63 906 1
+63 909 1
+63 911 1
+63 912 1
+63 937 1
+63 941 1
+63 944 1
+63 946 1
+63 947 1
+63 971 1
+63 974 1
+63 976 1
+63 977 1
+63 980 1
+63 982 1
+63 983 1
+63 985 1
+63 986 1
+63 987 1
+63 1008 1
+63 1028 1
+63 1032 1
+63 1035 1
+63 1037 1
+63 1038 1
+63 1063 1
+63 1067 1
+63 1070 1
+63 1072 1
+63 1073 1
+63 1097 1
+63 1100 1
+63 1102 1
+63 1103 1
+63 1106 1
+63 1108 1
+63 1109 1
+63 1111 1
+63 1112 1
+63 1113 1
+63 1133 1
+63 1137 1
+63 1140 1
+63 1142 1
+63 1143 1
+63 1167 1
+63 1170 1
+63 1172 1
+63 1173 1
+63 1176 1
+63 1178 1
+63 1179 1
+63 1181 1
+63 1182 1
+63 1183 1
+63 1202 1
+63 1205 1
+63 1207 1
+63 1208 1
+63 1211 1
+63 1213 1
+63 1214 1
+63 1216 1
+63 1217 1
+63 1218 1
+63 1236 1
+63 1238 1
+63 1239 1
+63 1241 1
+63 1242 1
+63 1243 1
+63 1245 1
+63 1246 1
+63 1247 1
+63 1248 1
+63 1260 1
+63 1280 1
+63 1284 1
+63 1287 1
+63 1289 1
+63 1290 1
+63 1315 1
+63 1319 1
+63 1322 1
+63 1324 1
+63 1325 1
+63 1349 1
+63 1352 1
+63 1354 1
+63 1355 1
+63 1358 1
+63 1360 1
+63 1361 1
+63 1363 1
+63 1364 1
+63 1365 1
+63 1385 1
+63 1389 1
+63 1392 1
+63 1394 1
+63 1395 1
+63 1419 1
+63 1422 1
+63 1424 1
+63 1425 1
+63 1428 1
+63 1430 1
+63 1431 1
+63 1433 1
+63 1434 1
+63 1435 1
+63 1454 1
+63 1457 1
+63 1459 1
+63 1460 1
+63 1463 1
+63 1465 1
+63 1466 1
+63 1468 1
+63 1469 1
+63 1470 1
+63 1488 1
+63 1490 1
+63 1491 1
+63 1493 1
+63 1494 1
+63 1495 1
+63 1497 1
+63 1498 1
+63 1499 1
+63 1500 1
+63 1511 1
+63 1515 1
+63 1518 1
+63 1520 1
+63 1521 1
+63 1545 1
+63 1548 1
+63 1550 1
+63 1551 1
+63 1554 1
+63 1556 1
+63 1557 1
+63 1559 1
+63 1560 1
+63 1561 1
+63 1580 1
+63 1583 1
+63 1585 1
+63 1586 1
+63 1589 1
+63 1591 1
+63 1592 1
+63 1594 1
+63 1595 1
+63 1596 1
+63 1614 1
+63 1616 1
+63 1617 1
+63 1619 1
+63 1620 1
+63 1621 1
+63 1623 1
+63 1624 1
+63 1625 1
+63 1626 1
+63 1636 1
+63 1639 1
+63 1641 1
+63 1642 1
+63 1645 1
+63 1647 1
+63 1648 1
+63 1650 1
+63 1651 1
+63 1652 1
+63 1670 1
+63 1672 1
+63 1673 1
+63 1675 1
+63 1676 1
+63 1677 1
+63 1679 1
+63 1680 1
+63 1681 1
+63 1682 1
+63 1691 1
+63 1693 1
+63 1694 1
+63 1696 1
+63 1697 1
+63 1698 1
+63 1700 1
+63 1701 1
+63 1702 1
+63 1703 1
+63 1711 1
+63 1712 1
+63 1713 1
+63 1714 1
+63 1715 1
+64 22 1
+64 50 1
+64 71 1
+64 86 1
+64 101 1
+64 102 1
+64 103 1
+64 104 1
+64 134 1
+64 155 1
+64 170 1
+64 185 1
+64 186 1
+64 187 1
+64 188 1
+64 211 1
+64 226 1
+64 241 1
+64 242 1
+64 243 1
+64 244 1
+64 261 1
+64 276 1
+64 277 1
+64 278 1
+64 279 1
+64 296 1
+64 297 1
+64 298 1
+64 299 1
+64 316 1
+64 317 1
+64 318 1
+64 319 1
+64 320 1
+64 321 1
+64 344 1
+64 365 1
+64 380 1
+64 395 1
+64 396 1
+64 397 1
+64 398 1
+64 421 1
+64 436 1
+64 451 1
+64 452 1
+64 453 1
+64 454 1
+64 471 1
+64 486 1
+64 487 1
+64 488 1
+64 489 1
+64 506 1
+64 507 1
+64 508 1
+64 509 1
+64 526 1
+64 527 1
+64 528 1
+64 529 1
+64 530 1
+64 531 1
+64 547 1
+64 562 1
+64 577 1
+64 578 1
+64 579 1
+64 580 1
+64 597 1
+64 612 1
+64 613 1
+64 614 1
+64 615 1
+64 632 1
+64 633 1
+64 634 1
+64 635 1
+64 652 1
+64 653 1
+64 654 1
+64 655 1
+64 656 1
+64 657 1
+64 667 1
+64 682 1
+64 683 1
+64 684 1
+64 685 1
+64 702 1
+64 703 1
+64 704 1
+64 705 1
+64 722 1
+64 723 1
+64 724 1
+64 725 1
+64 726 1
+64 727 1
+64 737 1
+64 738 1
+64 739 1
+64 740 1
+64 757 1
+64 758 1
+64 759 1
+64 760 1
+64 761 1
+64 762 1
+64 772 1
+64 773 1
+64 774 1
+64 775 1
+64 776 1
+64 777 1
+64 787 1
+64 788 1
+64 789 1
+64 790 1
+64 806 1
+64 827 1
+64 842 1
+64 857 1
+64 858 1
+64 859 1
+64 860 1
+64 883 1
+64 898 1
+64 913 1
+64 914 1
+64 915 1
+64 916 1
+64 933 1
+64 948 1
+64 949 1
+64 950 1
+64 951 1
+64 968 1
+64 969 1
+64 970 1
+64 971 1
+64 988 1
+64 989 1
+64 990 1
+64 991 1
+64 992 1
+64 993 1
+64 1009 1
+64 1024 1
+64 1039 1
+64 1040 1
+64 1041 1
+64 1042 1
+64 1059 1
+64 1074 1
+64 1075 1
+64 1076 1
+64 1077 1
+64 1094 1
+64 1095 1
+64 1096 1
+64 1097 1
+64 1114 1
+64 1115 1
+64 1116 1
+64 1117 1
+64 1118 1
+64 1119 1
+64 1129 1
+64 1144 1
+64 1145 1
+64 1146 1
+64 1147 1
+64 1164 1
+64 1165 1
+64 1166 1
+64 1167 1
+64 1184 1
+64 1185 1
+64 1186 1
+64 1187 1
+64 1188 1
+64 1189 1
+64 1199 1
+64 1200 1
+64 1201 1
+64 1202 1
+64 1219 1
+64 1220 1
+64 1221 1
+64 1222 1
+64 1223 1
+64 1224 1
+64 1234 1
+64 1235 1
+64 1236 1
+64 1237 1
+64 1238 1
+64 1239 1
+64 1249 1
+64 1250 1
+64 1251 1
+64 1252 1
+64 1261 1
+64 1276 1
+64 1291 1
+64 1292 1
+64 1293 1
+64 1294 1
+64 1311 1
+64 1326 1
+64 1327 1
+64 1328 1
+64 1329 1
+64 1346 1
+64 1347 1
+64 1348 1
+64 1349 1
+64 1366 1
+64 1367 1
+64 1368 1
+64 1369 1
+64 1370 1
+64 1371 1
+64 1381 1
+64 1396 1
+64 1397 1
+64 1398 1
+64 1399 1
+64 1416 1
+64 1417 1
+64 1418 1
+64 1419 1
+64 1436 1
+64 1437 1
+64 1438 1
+64 1439 1
+64 1440 1
+64 1441 1
+64 1451 1
+64 1452 1
+64 1453 1
+64 1454 1
+64 1471 1
+64 1472 1
+64 1473 1
+64 1474 1
+64 1475 1
+64 1476 1
+64 1486 1
+64 1487 1
+64 1488 1
+64 1489 1
+64 1490 1
+64 1491 1
+64 1501 1
+64 1502 1
+64 1503 1
+64 1504 1
+64 1507 1
+64 1522 1
+64 1523 1
+64 1524 1
+64 1525 1
+64 1542 1
+64 1543 1
+64 1544 1
+64 1545 1
+64 1562 1
+64 1563 1
+64 1564 1
+64 1565 1
+64 1566 1
+64 1567 1
+64 1577 1
+64 1578 1
+64 1579 1
+64 1580 1
+64 1597 1
+64 1598 1
+64 1599 1
+64 1600 1
+64 1601 1
+64 1602 1
+64 1612 1
+64 1613 1
+64 1614 1
+64 1615 1
+64 1616 1
+64 1617 1
+64 1627 1
+64 1628 1
+64 1629 1
+64 1630 1
+64 1633 1
+64 1634 1
+64 1635 1
+64 1636 1
+64 1653 1
+64 1654 1
+64 1655 1
+64 1656 1
+64 1657 1
+64 1658 1
+64 1668 1
+64 1669 1
+64 1670 1
+64 1671 1
+64 1672 1
+64 1673 1
+64 1683 1
+64 1684 1
+64 1685 1
+64 1686 1
+64 1689 1
+64 1690 1
+64 1691 1
+64 1692 1
+64 1693 1
+64 1694 1
+64 1704 1
+64 1705 1
+64 1706 1
+64 1707 1
+64 1710 1
+64 1711 1
+64 1712 1
+64 1713 1
+64 1716 1
+65 23 1
+65 51 1
+65 72 1
+65 87 1
+65 101 1
+65 105 1
+65 106 1
+65 107 1
+65 135 1
+65 156 1
+65 171 1
+65 185 1
+65 189 1
+65 190 1
+65 191 1
+65 212 1
+65 227 1
+65 241 1
+65 245 1
+65 246 1
+65 247 1
+65 262 1
+65 276 1
+65 280 1
+65 281 1
+65 282 1
+65 296 1
+65 300 1
+65 301 1
+65 302 1
+65 316 1
+65 317 1
+65 318 1
+65 322 1
+65 323 1
+65 324 1
+65 345 1
+65 366 1
+65 381 1
+65 395 1
+65 399 1
+65 400 1
+65 401 1
+65 422 1
+65 437 1
+65 451 1
+65 455 1
+65 456 1
+65 457 1
+65 472 1
+65 486 1
+65 490 1
+65 491 1
+65 492 1
+65 506 1
+65 510 1
+65 511 1
+65 512 1
+65 526 1
+65 527 1
+65 528 1
+65 532 1
+65 533 1
+65 534 1
+65 548 1
+65 563 1
+65 577 1
+65 581 1
+65 582 1
+65 583 1
+65 598 1
+65 612 1
+65 616 1
+65 617 1
+65 618 1
+65 632 1
+65 636 1
+65 637 1
+65 638 1
+65 652 1
+65 653 1
+65 654 1
+65 658 1
+65 659 1
+65 660 1
+65 668 1
+65 682 1
+65 686 1
+65 687 1
+65 688 1
+65 702 1
+65 706 1
+65 707 1
+65 708 1
+65 722 1
+65 723 1
+65 724 1
+65 728 1
+65 729 1
+65 730 1
+65 737 1
+65 741 1
+65 742 1
+65 743 1
+65 757 1
+65 758 1
+65 759 1
+65 763 1
+65 764 1
+65 765 1
+65 772 1
+65 773 1
+65 774 1
+65 778 1
+65 779 1
+65 780 1
+65 787 1
+65 788 1
+65 789 1
+65 791 1
+65 807 1
+65 828 1
+65 843 1
+65 857 1
+65 861 1
+65 862 1
+65 863 1
+65 884 1
+65 899 1
+65 913 1
+65 917 1
+65 918 1
+65 919 1
+65 934 1
+65 948 1
+65 952 1
+65 953 1
+65 954 1
+65 968 1
+65 972 1
+65 973 1
+65 974 1
+65 988 1
+65 989 1
+65 990 1
+65 994 1
+65 995 1
+65 996 1
+65 1010 1
+65 1025 1
+65 1039 1
+65 1043 1
+65 1044 1
+65 1045 1
+65 1060 1
+65 1074 1
+65 1078 1
+65 1079 1
+65 1080 1
+65 1094 1
+65 1098 1
+65 1099 1
+65 1100 1
+65 1114 1
+65 1115 1
+65 1116 1
+65 1120 1
+65 1121 1
+65 1122 1
+65 1130 1
+65 1144 1
+65 1148 1
+65 1149 1
+65 1150 1
+65 1164 1
+65 1168 1
+65 1169 1
+65 1170 1
+65 1184 1
+65 1185 1
+65 1186 1
+65 1190 1
+65 1191 1
+65 1192 1
+65 1199 1
+65 1203 1
+65 1204 1
+65 1205 1
+65 1219 1
+65 1220 1
+65 1221 1
+65 1225 1
+65 1226 1
+65 1227 1
+65 1234 1
+65 1235 1
+65 1236 1
+65 1240 1
+65 1241 1
+65 1242 1
+65 1249 1
+65 1250 1
+65 1251 1
+65 1253 1
+65 1262 1
+65 1277 1
+65 1291 1
+65 1295 1
+65 1296 1
+65 1297 1
+65 1312 1
+65 1326 1
+65 1330 1
+65 1331 1
+65 1332 1
+65 1346 1
+65 1350 1
+65 1351 1
+65 1352 1
+65 1366 1
+65 1367 1
+65 1368 1
+65 1372 1
+65 1373 1
+65 1374 1
+65 1382 1
+65 1396 1
+65 1400 1
+65 1401 1
+65 1402 1
+65 1416 1
+65 1420 1
+65 1421 1
+65 1422 1
+65 1436 1
+65 1437 1
+65 1438 1
+65 1442 1
+65 1443 1
+65 1444 1
+65 1451 1
+65 1455 1
+65 1456 1
+65 1457 1
+65 1471 1
+65 1472 1
+65 1473 1
+65 1477 1
+65 1478 1
+65 1479 1
+65 1486 1
+65 1487 1
+65 1488 1
+65 1492 1
+65 1493 1
+65 1494 1
+65 1501 1
+65 1502 1
+65 1503 1
+65 1505 1
+65 1508 1
+65 1522 1
+65 1526 1
+65 1527 1
+65 1528 1
+65 1542 1
+65 1546 1
+65 1547 1
+65 1548 1
+65 1562 1
+65 1563 1
+65 1564 1
+65 1568 1
+65 1569 1
+65 1570 1
+65 1577 1
+65 1581 1
+65 1582 1
+65 1583 1
+65 1597 1
+65 1598 1
+65 1599 1
+65 1603 1
+65 1604 1
+65 1605 1
+65 1612 1
+65 1613 1
+65 1614 1
+65 1618 1
+65 1619 1
+65 1620 1
+65 1627 1
+65 1628 1
+65 1629 1
+65 1631 1
+65 1633 1
+65 1637 1
+65 1638 1
+65 1639 1
+65 1653 1
+65 1654 1
+65 1655 1
+65 1659 1
+65 1660 1
+65 1661 1
+65 1668 1
+65 1669 1
+65 1670 1
+65 1674 1
+65 1675 1
+65 1676 1
+65 1683 1
+65 1684 1
+65 1685 1
+65 1687 1
+65 1689 1
+65 1690 1
+65 1691 1
+65 1695 1
+65 1696 1
+65 1697 1
+65 1704 1
+65 1705 1
+65 1706 1
+65 1708 1
+65 1710 1
+65 1711 1
+65 1712 1
+65 1714 1
+65 1716 1
+66 24 1
+66 52 1
+66 73 1
+66 88 1
+66 102 1
+66 105 1
+66 108 1
+66 109 1
+66 136 1
+66 157 1
+66 172 1
+66 186 1
+66 189 1
+66 192 1
+66 193 1
+66 213 1
+66 228 1
+66 242 1
+66 245 1
+66 248 1
+66 249 1
+66 263 1
+66 277 1
+66 280 1
+66 283 1
+66 284 1
+66 297 1
+66 300 1
+66 303 1
+66 304 1
+66 316 1
+66 319 1
+66 320 1
+66 322 1
+66 323 1
+66 325 1
+66 346 1
+66 367 1
+66 382 1
+66 396 1
+66 399 1
+66 402 1
+66 403 1
+66 423 1
+66 438 1
+66 452 1
+66 455 1
+66 458 1
+66 459 1
+66 473 1
+66 487 1
+66 490 1
+66 493 1
+66 494 1
+66 507 1
+66 510 1
+66 513 1
+66 514 1
+66 526 1
+66 529 1
+66 530 1
+66 532 1
+66 533 1
+66 535 1
+66 549 1
+66 564 1
+66 578 1
+66 581 1
+66 584 1
+66 585 1
+66 599 1
+66 613 1
+66 616 1
+66 619 1
+66 620 1
+66 633 1
+66 636 1
+66 639 1
+66 640 1
+66 652 1
+66 655 1
+66 656 1
+66 658 1
+66 659 1
+66 661 1
+66 669 1
+66 683 1
+66 686 1
+66 689 1
+66 690 1
+66 703 1
+66 706 1
+66 709 1
+66 710 1
+66 722 1
+66 725 1
+66 726 1
+66 728 1
+66 729 1
+66 731 1
+66 738 1
+66 741 1
+66 744 1
+66 745 1
+66 757 1
+66 760 1
+66 761 1
+66 763 1
+66 764 1
+66 766 1
+66 772 1
+66 775 1
+66 776 1
+66 778 1
+66 779 1
+66 781 1
+66 787 1
+66 788 1
+66 790 1
+66 791 1
+66 808 1
+66 829 1
+66 844 1
+66 858 1
+66 861 1
+66 864 1
+66 865 1
+66 885 1
+66 900 1
+66 914 1
+66 917 1
+66 920 1
+66 921 1
+66 935 1
+66 949 1
+66 952 1
+66 955 1
+66 956 1
+66 969 1
+66 972 1
+66 975 1
+66 976 1
+66 988 1
+66 991 1
+66 992 1
+66 994 1
+66 995 1
+66 997 1
+66 1011 1
+66 1026 1
+66 1040 1
+66 1043 1
+66 1046 1
+66 1047 1
+66 1061 1
+66 1075 1
+66 1078 1
+66 1081 1
+66 1082 1
+66 1095 1
+66 1098 1
+66 1101 1
+66 1102 1
+66 1114 1
+66 1117 1
+66 1118 1
+66 1120 1
+66 1121 1
+66 1123 1
+66 1131 1
+66 1145 1
+66 1148 1
+66 1151 1
+66 1152 1
+66 1165 1
+66 1168 1
+66 1171 1
+66 1172 1
+66 1184 1
+66 1187 1
+66 1188 1
+66 1190 1
+66 1191 1
+66 1193 1
+66 1200 1
+66 1203 1
+66 1206 1
+66 1207 1
+66 1219 1
+66 1222 1
+66 1223 1
+66 1225 1
+66 1226 1
+66 1228 1
+66 1234 1
+66 1237 1
+66 1238 1
+66 1240 1
+66 1241 1
+66 1243 1
+66 1249 1
+66 1250 1
+66 1252 1
+66 1253 1
+66 1263 1
+66 1278 1
+66 1292 1
+66 1295 1
+66 1298 1
+66 1299 1
+66 1313 1
+66 1327 1
+66 1330 1
+66 1333 1
+66 1334 1
+66 1347 1
+66 1350 1
+66 1353 1
+66 1354 1
+66 1366 1
+66 1369 1
+66 1370 1
+66 1372 1
+66 1373 1
+66 1375 1
+66 1383 1
+66 1397 1
+66 1400 1
+66 1403 1
+66 1404 1
+66 1417 1
+66 1420 1
+66 1423 1
+66 1424 1
+66 1436 1
+66 1439 1
+66 1440 1
+66 1442 1
+66 1443 1
+66 1445 1
+66 1452 1
+66 1455 1
+66 1458 1
+66 1459 1
+66 1471 1
+66 1474 1
+66 1475 1
+66 1477 1
+66 1478 1
+66 1480 1
+66 1486 1
+66 1489 1
+66 1490 1
+66 1492 1
+66 1493 1
+66 1495 1
+66 1501 1
+66 1502 1
+66 1504 1
+66 1505 1
+66 1509 1
+66 1523 1
+66 1526 1
+66 1529 1
+66 1530 1
+66 1543 1
+66 1546 1
+66 1549 1
+66 1550 1
+66 1562 1
+66 1565 1
+66 1566 1
+66 1568 1
+66 1569 1
+66 1571 1
+66 1578 1
+66 1581 1
+66 1584 1
+66 1585 1
+66 1597 1
+66 1600 1
+66 1601 1
+66 1603 1
+66 1604 1
+66 1606 1
+66 1612 1
+66 1615 1
+66 1616 1
+66 1618 1
+66 1619 1
+66 1621 1
+66 1627 1
+66 1628 1
+66 1630 1
+66 1631 1
+66 1634 1
+66 1637 1
+66 1640 1
+66 1641 1
+66 1653 1
+66 1656 1
+66 1657 1
+66 1659 1
+66 1660 1
+66 1662 1
+66 1668 1
+66 1671 1
+66 1672 1
+66 1674 1
+66 1675 1
+66 1677 1
+66 1683 1
+66 1684 1
+66 1686 1
+66 1687 1
+66 1689 1
+66 1692 1
+66 1693 1
+66 1695 1
+66 1696 1
+66 1698 1
+66 1704 1
+66 1705 1
+66 1707 1
+66 1708 1
+66 1710 1
+66 1711 1
+66 1713 1
+66 1714 1
+66 1716 1
+67 25 1
+67 53 1
+67 74 1
+67 89 1
+67 103 1
+67 106 1
+67 108 1
+67 110 1
+67 137 1
+67 158 1
+67 173 1
+67 187 1
+67 190 1
+67 192 1
+67 194 1
+67 214 1
+67 229 1
+67 243 1
+67 246 1
+67 248 1
+67 250 1
+67 264 1
+67 278 1
+67 281 1
+67 283 1
+67 285 1
+67 298 1
+67 301 1
+67 303 1
+67 305 1
+67 317 1
+67 319 1
+67 321 1
+67 322 1
+67 324 1
+67 325 1
+67 347 1
+67 368 1
+67 383 1
+67 397 1
+67 400 1
+67 402 1
+67 404 1
+67 424 1
+67 439 1
+67 453 1
+67 456 1
+67 458 1
+67 460 1
+67 474 1
+67 488 1
+67 491 1
+67 493 1
+67 495 1
+67 508 1
+67 511 1
+67 513 1
+67 515 1
+67 527 1
+67 529 1
+67 531 1
+67 532 1
+67 534 1
+67 535 1
+67 550 1
+67 565 1
+67 579 1
+67 582 1
+67 584 1
+67 586 1
+67 600 1
+67 614 1
+67 617 1
+67 619 1
+67 621 1
+67 634 1
+67 637 1
+67 639 1
+67 641 1
+67 653 1
+67 655 1
+67 657 1
+67 658 1
+67 660 1
+67 661 1
+67 670 1
+67 684 1
+67 687 1
+67 689 1
+67 691 1
+67 704 1
+67 707 1
+67 709 1
+67 711 1
+67 723 1
+67 725 1
+67 727 1
+67 728 1
+67 730 1
+67 731 1
+67 739 1
+67 742 1
+67 744 1
+67 746 1
+67 758 1
+67 760 1
+67 762 1
+67 763 1
+67 765 1
+67 766 1
+67 773 1
+67 775 1
+67 777 1
+67 778 1
+67 780 1
+67 781 1
+67 787 1
+67 789 1
+67 790 1
+67 791 1
+67 809 1
+67 830 1
+67 845 1
+67 859 1
+67 862 1
+67 864 1
+67 866 1
+67 886 1
+67 901 1
+67 915 1
+67 918 1
+67 920 1
+67 922 1
+67 936 1
+67 950 1
+67 953 1
+67 955 1
+67 957 1
+67 970 1
+67 973 1
+67 975 1
+67 977 1
+67 989 1
+67 991 1
+67 993 1
+67 994 1
+67 996 1
+67 997 1
+67 1012 1
+67 1027 1
+67 1041 1
+67 1044 1
+67 1046 1
+67 1048 1
+67 1062 1
+67 1076 1
+67 1079 1
+67 1081 1
+67 1083 1
+67 1096 1
+67 1099 1
+67 1101 1
+67 1103 1
+67 1115 1
+67 1117 1
+67 1119 1
+67 1120 1
+67 1122 1
+67 1123 1
+67 1132 1
+67 1146 1
+67 1149 1
+67 1151 1
+67 1153 1
+67 1166 1
+67 1169 1
+67 1171 1
+67 1173 1
+67 1185 1
+67 1187 1
+67 1189 1
+67 1190 1
+67 1192 1
+67 1193 1
+67 1201 1
+67 1204 1
+67 1206 1
+67 1208 1
+67 1220 1
+67 1222 1
+67 1224 1
+67 1225 1
+67 1227 1
+67 1228 1
+67 1235 1
+67 1237 1
+67 1239 1
+67 1240 1
+67 1242 1
+67 1243 1
+67 1249 1
+67 1251 1
+67 1252 1
+67 1253 1
+67 1264 1
+67 1279 1
+67 1293 1
+67 1296 1
+67 1298 1
+67 1300 1
+67 1314 1
+67 1328 1
+67 1331 1
+67 1333 1
+67 1335 1
+67 1348 1
+67 1351 1
+67 1353 1
+67 1355 1
+67 1367 1
+67 1369 1
+67 1371 1
+67 1372 1
+67 1374 1
+67 1375 1
+67 1384 1
+67 1398 1
+67 1401 1
+67 1403 1
+67 1405 1
+67 1418 1
+67 1421 1
+67 1423 1
+67 1425 1
+67 1437 1
+67 1439 1
+67 1441 1
+67 1442 1
+67 1444 1
+67 1445 1
+67 1453 1
+67 1456 1
+67 1458 1
+67 1460 1
+67 1472 1
+67 1474 1
+67 1476 1
+67 1477 1
+67 1479 1
+67 1480 1
+67 1487 1
+67 1489 1
+67 1491 1
+67 1492 1
+67 1494 1
+67 1495 1
+67 1501 1
+67 1503 1
+67 1504 1
+67 1505 1
+67 1510 1
+67 1524 1
+67 1527 1
+67 1529 1
+67 1531 1
+67 1544 1
+67 1547 1
+67 1549 1
+67 1551 1
+67 1563 1
+67 1565 1
+67 1567 1
+67 1568 1
+67 1570 1
+67 1571 1
+67 1579 1
+67 1582 1
+67 1584 1
+67 1586 1
+67 1598 1
+67 1600 1
+67 1602 1
+67 1603 1
+67 1605 1
+67 1606 1
+67 1613 1
+67 1615 1
+67 1617 1
+67 1618 1
+67 1620 1
+67 1621 1
+67 1627 1
+67 1629 1
+67 1630 1
+67 1631 1
+67 1635 1
+67 1638 1
+67 1640 1
+67 1642 1
+67 1654 1
+67 1656 1
+67 1658 1
+67 1659 1
+67 1661 1
+67 1662 1
+67 1669 1
+67 1671 1
+67 1673 1
+67 1674 1
+67 1676 1
+67 1677 1
+67 1683 1
+67 1685 1
+67 1686 1
+67 1687 1
+67 1690 1
+67 1692 1
+67 1694 1
+67 1695 1
+67 1697 1
+67 1698 1
+67 1704 1
+67 1706 1
+67 1707 1
+67 1708 1
+67 1710 1
+67 1712 1
+67 1713 1
+67 1714 1
+67 1716 1
+68 26 1
+68 54 1
+68 75 1
+68 90 1
+68 104 1
+68 107 1
+68 109 1
+68 110 1
+68 138 1
+68 159 1
+68 174 1
+68 188 1
+68 191 1
+68 193 1
+68 194 1
+68 215 1
+68 230 1
+68 244 1
+68 247 1
+68 249 1
+68 250 1
+68 265 1
+68 279 1
+68 282 1
+68 284 1
+68 285 1
+68 299 1
+68 302 1
+68 304 1
+68 305 1
+68 318 1
+68 320 1
+68 321 1
+68 323 1
+68 324 1
+68 325 1
+68 348 1
+68 369 1
+68 384 1
+68 398 1
+68 401 1
+68 403 1
+68 404 1
+68 425 1
+68 440 1
+68 454 1
+68 457 1
+68 459 1
+68 460 1
+68 475 1
+68 489 1
+68 492 1
+68 494 1
+68 495 1
+68 509 1
+68 512 1
+68 514 1
+68 515 1
+68 528 1
+68 530 1
+68 531 1
+68 533 1
+68 534 1
+68 535 1
+68 551 1
+68 566 1
+68 580 1
+68 583 1
+68 585 1
+68 586 1
+68 601 1
+68 615 1
+68 618 1
+68 620 1
+68 621 1
+68 635 1
+68 638 1
+68 640 1
+68 641 1
+68 654 1
+68 656 1
+68 657 1
+68 659 1
+68 660 1
+68 661 1
+68 671 1
+68 685 1
+68 688 1
+68 690 1
+68 691 1
+68 705 1
+68 708 1
+68 710 1
+68 711 1
+68 724 1
+68 726 1
+68 727 1
+68 729 1
+68 730 1
+68 731 1
+68 740 1
+68 743 1
+68 745 1
+68 746 1
+68 759 1
+68 761 1
+68 762 1
+68 764 1
+68 765 1
+68 766 1
+68 774 1
+68 776 1
+68 777 1
+68 779 1
+68 780 1
+68 781 1
+68 788 1
+68 789 1
+68 790 1
+68 791 1
+68 810 1
+68 831 1
+68 846 1
+68 860 1
+68 863 1
+68 865 1
+68 866 1
+68 887 1
+68 902 1
+68 916 1
+68 919 1
+68 921 1
+68 922 1
+68 937 1
+68 951 1
+68 954 1
+68 956 1
+68 957 1
+68 971 1
+68 974 1
+68 976 1
+68 977 1
+68 990 1
+68 992 1
+68 993 1
+68 995 1
+68 996 1
+68 997 1
+68 1013 1
+68 1028 1
+68 1042 1
+68 1045 1
+68 1047 1
+68 1048 1
+68 1063 1
+68 1077 1
+68 1080 1
+68 1082 1
+68 1083 1
+68 1097 1
+68 1100 1
+68 1102 1
+68 1103 1
+68 1116 1
+68 1118 1
+68 1119 1
+68 1121 1
+68 1122 1
+68 1123 1
+68 1133 1
+68 1147 1
+68 1150 1
+68 1152 1
+68 1153 1
+68 1167 1
+68 1170 1
+68 1172 1
+68 1173 1
+68 1186 1
+68 1188 1
+68 1189 1
+68 1191 1
+68 1192 1
+68 1193 1
+68 1202 1
+68 1205 1
+68 1207 1
+68 1208 1
+68 1221 1
+68 1223 1
+68 1224 1
+68 1226 1
+68 1227 1
+68 1228 1
+68 1236 1
+68 1238 1
+68 1239 1
+68 1241 1
+68 1242 1
+68 1243 1
+68 1250 1
+68 1251 1
+68 1252 1
+68 1253 1
+68 1265 1
+68 1280 1
+68 1294 1
+68 1297 1
+68 1299 1
+68 1300 1
+68 1315 1
+68 1329 1
+68 1332 1
+68 1334 1
+68 1335 1
+68 1349 1
+68 1352 1
+68 1354 1
+68 1355 1
+68 1368 1
+68 1370 1
+68 1371 1
+68 1373 1
+68 1374 1
+68 1375 1
+68 1385 1
+68 1399 1
+68 1402 1
+68 1404 1
+68 1405 1
+68 1419 1
+68 1422 1
+68 1424 1
+68 1425 1
+68 1438 1
+68 1440 1
+68 1441 1
+68 1443 1
+68 1444 1
+68 1445 1
+68 1454 1
+68 1457 1
+68 1459 1
+68 1460 1
+68 1473 1
+68 1475 1
+68 1476 1
+68 1478 1
+68 1479 1
+68 1480 1
+68 1488 1
+68 1490 1
+68 1491 1
+68 1493 1
+68 1494 1
+68 1495 1
+68 1502 1
+68 1503 1
+68 1504 1
+68 1505 1
+68 1511 1
+68 1525 1
+68 1528 1
+68 1530 1
+68 1531 1
+68 1545 1
+68 1548 1
+68 1550 1
+68 1551 1
+68 1564 1
+68 1566 1
+68 1567 1
+68 1569 1
+68 1570 1
+68 1571 1
+68 1580 1
+68 1583 1
+68 1585 1
+68 1586 1
+68 1599 1
+68 1601 1
+68 1602 1
+68 1604 1
+68 1605 1
+68 1606 1
+68 1614 1
+68 1616 1
+68 1617 1
+68 1619 1
+68 1620 1
+68 1621 1
+68 1628 1
+68 1629 1
+68 1630 1
+68 1631 1
+68 1636 1
+68 1639 1
+68 1641 1
+68 1642 1
+68 1655 1
+68 1657 1
+68 1658 1
+68 1660 1
+68 1661 1
+68 1662 1
+68 1670 1
+68 1672 1
+68 1673 1
+68 1675 1
+68 1676 1
+68 1677 1
+68 1684 1
+68 1685 1
+68 1686 1
+68 1687 1
+68 1691 1
+68 1693 1
+68 1694 1
+68 1696 1
+68 1697 1
+68 1698 1
+68 1705 1
+68 1706 1
+68 1707 1
+68 1708 1
+68 1711 1
+68 1712 1
+68 1713 1
+68 1714 1
+68 1716 1
+69 27 1
+69 55 1
+69 76 1
+69 91 1
+69 101 1
+69 111 1
+69 112 1
+69 113 1
+69 139 1
+69 160 1
+69 175 1
+69 185 1
+69 195 1
+69 196 1
+69 197 1
+69 216 1
+69 231 1
+69 241 1
+69 251 1
+69 252 1
+69 253 1
+69 266 1
+69 276 1
+69 286 1
+69 287 1
+69 288 1
+69 296 1
+69 306 1
+69 307 1
+69 308 1
+69 316 1
+69 317 1
+69 318 1
+69 326 1
+69 327 1
+69 328 1
+69 349 1
+69 370 1
+69 385 1
+69 395 1
+69 405 1
+69 406 1
+69 407 1
+69 426 1
+69 441 1
+69 451 1
+69 461 1
+69 462 1
+69 463 1
+69 476 1
+69 486 1
+69 496 1
+69 497 1
+69 498 1
+69 506 1
+69 516 1
+69 517 1
+69 518 1
+69 526 1
+69 527 1
+69 528 1
+69 536 1
+69 537 1
+69 538 1
+69 552 1
+69 567 1
+69 577 1
+69 587 1
+69 588 1
+69 589 1
+69 602 1
+69 612 1
+69 622 1
+69 623 1
+69 624 1
+69 632 1
+69 642 1
+69 643 1
+69 644 1
+69 652 1
+69 653 1
+69 654 1
+69 662 1
+69 663 1
+69 664 1
+69 672 1
+69 682 1
+69 692 1
+69 693 1
+69 694 1
+69 702 1
+69 712 1
+69 713 1
+69 714 1
+69 722 1
+69 723 1
+69 724 1
+69 732 1
+69 733 1
+69 734 1
+69 737 1
+69 747 1
+69 748 1
+69 749 1
+69 757 1
+69 758 1
+69 759 1
+69 767 1
+69 768 1
+69 769 1
+69 772 1
+69 773 1
+69 774 1
+69 782 1
+69 783 1
+69 784 1
+69 787 1
+69 788 1
+69 789 1
+69 792 1
+69 811 1
+69 832 1
+69 847 1
+69 857 1
+69 867 1
+69 868 1
+69 869 1
+69 888 1
+69 903 1
+69 913 1
+69 923 1
+69 924 1
+69 925 1
+69 938 1
+69 948 1
+69 958 1
+69 959 1
+69 960 1
+69 968 1
+69 978 1
+69 979 1
+69 980 1
+69 988 1
+69 989 1
+69 990 1
+69 998 1
+69 999 1
+69 1000 1
+69 1014 1
+69 1029 1
+69 1039 1
+69 1049 1
+69 1050 1
+69 1051 1
+69 1064 1
+69 1074 1
+69 1084 1
+69 1085 1
+69 1086 1
+69 1094 1
+69 1104 1
+69 1105 1
+69 1106 1
+69 1114 1
+69 1115 1
+69 1116 1
+69 1124 1
+69 1125 1
+69 1126 1
+69 1134 1
+69 1144 1
+69 1154 1
+69 1155 1
+69 1156 1
+69 1164 1
+69 1174 1
+69 1175 1
+69 1176 1
+69 1184 1
+69 1185 1
+69 1186 1
+69 1194 1
+69 1195 1
+69 1196 1
+69 1199 1
+69 1209 1
+69 1210 1
+69 1211 1
+69 1219 1
+69 1220 1
+69 1221 1
+69 1229 1
+69 1230 1
+69 1231 1
+69 1234 1
+69 1235 1
+69 1236 1
+69 1244 1
+69 1245 1
+69 1246 1
+69 1249 1
+69 1250 1
+69 1251 1
+69 1254 1
+69 1266 1
+69 1281 1
+69 1291 1
+69 1301 1
+69 1302 1
+69 1303 1
+69 1316 1
+69 1326 1
+69 1336 1
+69 1337 1
+69 1338 1
+69 1346 1
+69 1356 1
+69 1357 1
+69 1358 1
+69 1366 1
+69 1367 1
+69 1368 1
+69 1376 1
+69 1377 1
+69 1378 1
+69 1386 1
+69 1396 1
+69 1406 1
+69 1407 1
+69 1408 1
+69 1416 1
+69 1426 1
+69 1427 1
+69 1428 1
+69 1436 1
+69 1437 1
+69 1438 1
+69 1446 1
+69 1447 1
+69 1448 1
+69 1451 1
+69 1461 1
+69 1462 1
+69 1463 1
+69 1471 1
+69 1472 1
+69 1473 1
+69 1481 1
+69 1482 1
+69 1483 1
+69 1486 1
+69 1487 1
+69 1488 1
+69 1496 1
+69 1497 1
+69 1498 1
+69 1501 1
+69 1502 1
+69 1503 1
+69 1506 1
+69 1512 1
+69 1522 1
+69 1532 1
+69 1533 1
+69 1534 1
+69 1542 1
+69 1552 1
+69 1553 1
+69 1554 1
+69 1562 1
+69 1563 1
+69 1564 1
+69 1572 1
+69 1573 1
+69 1574 1
+69 1577 1
+69 1587 1
+69 1588 1
+69 1589 1
+69 1597 1
+69 1598 1
+69 1599 1
+69 1607 1
+69 1608 1
+69 1609 1
+69 1612 1
+69 1613 1
+69 1614 1
+69 1622 1
+69 1623 1
+69 1624 1
+69 1627 1
+69 1628 1
+69 1629 1
+69 1632 1
+69 1633 1
+69 1643 1
+69 1644 1
+69 1645 1
+69 1653 1
+69 1654 1
+69 1655 1
+69 1663 1
+69 1664 1
+69 1665 1
+69 1668 1
+69 1669 1
+69 1670 1
+69 1678 1
+69 1679 1
+69 1680 1
+69 1683 1
+69 1684 1
+69 1685 1
+69 1688 1
+69 1689 1
+69 1690 1
+69 1691 1
+69 1699 1
+69 1700 1
+69 1701 1
+69 1704 1
+69 1705 1
+69 1706 1
+69 1709 1
+69 1710 1
+69 1711 1
+69 1712 1
+69 1715 1
+69 1716 1
+70 28 1
+70 56 1
+70 77 1
+70 92 1
+70 102 1
+70 111 1
+70 114 1
+70 115 1
+70 140 1
+70 161 1
+70 176 1
+70 186 1
+70 195 1
+70 198 1
+70 199 1
+70 217 1
+70 232 1
+70 242 1
+70 251 1
+70 254 1
+70 255 1
+70 267 1
+70 277 1
+70 286 1
+70 289 1
+70 290 1
+70 297 1
+70 306 1
+70 309 1
+70 310 1
+70 316 1
+70 319 1
+70 320 1
+70 326 1
+70 327 1
+70 329 1
+70 350 1
+70 371 1
+70 386 1
+70 396 1
+70 405 1
+70 408 1
+70 409 1
+70 427 1
+70 442 1
+70 452 1
+70 461 1
+70 464 1
+70 465 1
+70 477 1
+70 487 1
+70 496 1
+70 499 1
+70 500 1
+70 507 1
+70 516 1
+70 519 1
+70 520 1
+70 526 1
+70 529 1
+70 530 1
+70 536 1
+70 537 1
+70 539 1
+70 553 1
+70 568 1
+70 578 1
+70 587 1
+70 590 1
+70 591 1
+70 603 1
+70 613 1
+70 622 1
+70 625 1
+70 626 1
+70 633 1
+70 642 1
+70 645 1
+70 646 1
+70 652 1
+70 655 1
+70 656 1
+70 662 1
+70 663 1
+70 665 1
+70 673 1
+70 683 1
+70 692 1
+70 695 1
+70 696 1
+70 703 1
+70 712 1
+70 715 1
+70 716 1
+70 722 1
+70 725 1
+70 726 1
+70 732 1
+70 733 1
+70 735 1
+70 738 1
+70 747 1
+70 750 1
+70 751 1
+70 757 1
+70 760 1
+70 761 1
+70 767 1
+70 768 1
+70 770 1
+70 772 1
+70 775 1
+70 776 1
+70 782 1
+70 783 1
+70 785 1
+70 787 1
+70 788 1
+70 790 1
+70 792 1
+70 812 1
+70 833 1
+70 848 1
+70 858 1
+70 867 1
+70 870 1
+70 871 1
+70 889 1
+70 904 1
+70 914 1
+70 923 1
+70 926 1
+70 927 1
+70 939 1
+70 949 1
+70 958 1
+70 961 1
+70 962 1
+70 969 1
+70 978 1
+70 981 1
+70 982 1
+70 988 1
+70 991 1
+70 992 1
+70 998 1
+70 999 1
+70 1001 1
+70 1015 1
+70 1030 1
+70 1040 1
+70 1049 1
+70 1052 1
+70 1053 1
+70 1065 1
+70 1075 1
+70 1084 1
+70 1087 1
+70 1088 1
+70 1095 1
+70 1104 1
+70 1107 1
+70 1108 1
+70 1114 1
+70 1117 1
+70 1118 1
+70 1124 1
+70 1125 1
+70 1127 1
+70 1135 1
+70 1145 1
+70 1154 1
+70 1157 1
+70 1158 1
+70 1165 1
+70 1174 1
+70 1177 1
+70 1178 1
+70 1184 1
+70 1187 1
+70 1188 1
+70 1194 1
+70 1195 1
+70 1197 1
+70 1200 1
+70 1209 1
+70 1212 1
+70 1213 1
+70 1219 1
+70 1222 1
+70 1223 1
+70 1229 1
+70 1230 1
+70 1232 1
+70 1234 1
+70 1237 1
+70 1238 1
+70 1244 1
+70 1245 1
+70 1247 1
+70 1249 1
+70 1250 1
+70 1252 1
+70 1254 1
+70 1267 1
+70 1282 1
+70 1292 1
+70 1301 1
+70 1304 1
+70 1305 1
+70 1317 1
+70 1327 1
+70 1336 1
+70 1339 1
+70 1340 1
+70 1347 1
+70 1356 1
+70 1359 1
+70 1360 1
+70 1366 1
+70 1369 1
+70 1370 1
+70 1376 1
+70 1377 1
+70 1379 1
+70 1387 1
+70 1397 1
+70 1406 1
+70 1409 1
+70 1410 1
+70 1417 1
+70 1426 1
+70 1429 1
+70 1430 1
+70 1436 1
+70 1439 1
+70 1440 1
+70 1446 1
+70 1447 1
+70 1449 1
+70 1452 1
+70 1461 1
+70 1464 1
+70 1465 1
+70 1471 1
+70 1474 1
+70 1475 1
+70 1481 1
+70 1482 1
+70 1484 1
+70 1486 1
+70 1489 1
+70 1490 1
+70 1496 1
+70 1497 1
+70 1499 1
+70 1501 1
+70 1502 1
+70 1504 1
+70 1506 1
+70 1513 1
+70 1523 1
+70 1532 1
+70 1535 1
+70 1536 1
+70 1543 1
+70 1552 1
+70 1555 1
+70 1556 1
+70 1562 1
+70 1565 1
+70 1566 1
+70 1572 1
+70 1573 1
+70 1575 1
+70 1578 1
+70 1587 1
+70 1590 1
+70 1591 1
+70 1597 1
+70 1600 1
+70 1601 1
+70 1607 1
+70 1608 1
+70 1610 1
+70 1612 1
+70 1615 1
+70 1616 1
+70 1622 1
+70 1623 1
+70 1625 1
+70 1627 1
+70 1628 1
+70 1630 1
+70 1632 1
+70 1634 1
+70 1643 1
+70 1646 1
+70 1647 1
+70 1653 1
+70 1656 1
+70 1657 1
+70 1663 1
+70 1664 1
+70 1666 1
+70 1668 1
+70 1671 1
+70 1672 1
+70 1678 1
+70 1679 1
+70 1681 1
+70 1683 1
+70 1684 1
+70 1686 1
+70 1688 1
+70 1689 1
+70 1692 1
+70 1693 1
+70 1699 1
+70 1700 1
+70 1702 1
+70 1704 1
+70 1705 1
+70 1707 1
+70 1709 1
+70 1710 1
+70 1711 1
+70 1713 1
+70 1715 1
+70 1716 1
+71 29 1
+71 57 1
+71 78 1
+71 93 1
+71 103 1
+71 112 1
+71 114 1
+71 116 1
+71 141 1
+71 162 1
+71 177 1
+71 187 1
+71 196 1
+71 198 1
+71 200 1
+71 218 1
+71 233 1
+71 243 1
+71 252 1
+71 254 1
+71 256 1
+71 268 1
+71 278 1
+71 287 1
+71 289 1
+71 291 1
+71 298 1
+71 307 1
+71 309 1
+71 311 1
+71 317 1
+71 319 1
+71 321 1
+71 326 1
+71 328 1
+71 329 1
+71 351 1
+71 372 1
+71 387 1
+71 397 1
+71 406 1
+71 408 1
+71 410 1
+71 428 1
+71 443 1
+71 453 1
+71 462 1
+71 464 1
+71 466 1
+71 478 1
+71 488 1
+71 497 1
+71 499 1
+71 501 1
+71 508 1
+71 517 1
+71 519 1
+71 521 1
+71 527 1
+71 529 1
+71 531 1
+71 536 1
+71 538 1
+71 539 1
+71 554 1
+71 569 1
+71 579 1
+71 588 1
+71 590 1
+71 592 1
+71 604 1
+71 614 1
+71 623 1
+71 625 1
+71 627 1
+71 634 1
+71 643 1
+71 645 1
+71 647 1
+71 653 1
+71 655 1
+71 657 1
+71 662 1
+71 664 1
+71 665 1
+71 674 1
+71 684 1
+71 693 1
+71 695 1
+71 697 1
+71 704 1
+71 713 1
+71 715 1
+71 717 1
+71 723 1
+71 725 1
+71 727 1
+71 732 1
+71 734 1
+71 735 1
+71 739 1
+71 748 1
+71 750 1
+71 752 1
+71 758 1
+71 760 1
+71 762 1
+71 767 1
+71 769 1
+71 770 1
+71 773 1
+71 775 1
+71 777 1
+71 782 1
+71 784 1
+71 785 1
+71 787 1
+71 789 1
+71 790 1
+71 792 1
+71 813 1
+71 834 1
+71 849 1
+71 859 1
+71 868 1
+71 870 1
+71 872 1
+71 890 1
+71 905 1
+71 915 1
+71 924 1
+71 926 1
+71 928 1
+71 940 1
+71 950 1
+71 959 1
+71 961 1
+71 963 1
+71 970 1
+71 979 1
+71 981 1
+71 983 1
+71 989 1
+71 991 1
+71 993 1
+71 998 1
+71 1000 1
+71 1001 1
+71 1016 1
+71 1031 1
+71 1041 1
+71 1050 1
+71 1052 1
+71 1054 1
+71 1066 1
+71 1076 1
+71 1085 1
+71 1087 1
+71 1089 1
+71 1096 1
+71 1105 1
+71 1107 1
+71 1109 1
+71 1115 1
+71 1117 1
+71 1119 1
+71 1124 1
+71 1126 1
+71 1127 1
+71 1136 1
+71 1146 1
+71 1155 1
+71 1157 1
+71 1159 1
+71 1166 1
+71 1175 1
+71 1177 1
+71 1179 1
+71 1185 1
+71 1187 1
+71 1189 1
+71 1194 1
+71 1196 1
+71 1197 1
+71 1201 1
+71 1210 1
+71 1212 1
+71 1214 1
+71 1220 1
+71 1222 1
+71 1224 1
+71 1229 1
+71 1231 1
+71 1232 1
+71 1235 1
+71 1237 1
+71 1239 1
+71 1244 1
+71 1246 1
+71 1247 1
+71 1249 1
+71 1251 1
+71 1252 1
+71 1254 1
+71 1268 1
+71 1283 1
+71 1293 1
+71 1302 1
+71 1304 1
+71 1306 1
+71 1318 1
+71 1328 1
+71 1337 1
+71 1339 1
+71 1341 1
+71 1348 1
+71 1357 1
+71 1359 1
+71 1361 1
+71 1367 1
+71 1369 1
+71 1371 1
+71 1376 1
+71 1378 1
+71 1379 1
+71 1388 1
+71 1398 1
+71 1407 1
+71 1409 1
+71 1411 1
+71 1418 1
+71 1427 1
+71 1429 1
+71 1431 1
+71 1437 1
+71 1439 1
+71 1441 1
+71 1446 1
+71 1448 1
+71 1449 1
+71 1453 1
+71 1462 1
+71 1464 1
+71 1466 1
+71 1472 1
+71 1474 1
+71 1476 1
+71 1481 1
+71 1483 1
+71 1484 1
+71 1487 1
+71 1489 1
+71 1491 1
+71 1496 1
+71 1498 1
+71 1499 1
+71 1501 1
+71 1503 1
+71 1504 1
+71 1506 1
+71 1514 1
+71 1524 1
+71 1533 1
+71 1535 1
+71 1537 1
+71 1544 1
+71 1553 1
+71 1555 1
+71 1557 1
+71 1563 1
+71 1565 1
+71 1567 1
+71 1572 1
+71 1574 1
+71 1575 1
+71 1579 1
+71 1588 1
+71 1590 1
+71 1592 1
+71 1598 1
+71 1600 1
+71 1602 1
+71 1607 1
+71 1609 1
+71 1610 1
+71 1613 1
+71 1615 1
+71 1617 1
+71 1622 1
+71 1624 1
+71 1625 1
+71 1627 1
+71 1629 1
+71 1630 1
+71 1632 1
+71 1635 1
+71 1644 1
+71 1646 1
+71 1648 1
+71 1654 1
+71 1656 1
+71 1658 1
+71 1663 1
+71 1665 1
+71 1666 1
+71 1669 1
+71 1671 1
+71 1673 1
+71 1678 1
+71 1680 1
+71 1681 1
+71 1683 1
+71 1685 1
+71 1686 1
+71 1688 1
+71 1690 1
+71 1692 1
+71 1694 1
+71 1699 1
+71 1701 1
+71 1702 1
+71 1704 1
+71 1706 1
+71 1707 1
+71 1709 1
+71 1710 1
+71 1712 1
+71 1713 1
+71 1715 1
+71 1716 1
+72 30 1
+72 58 1
+72 79 1
+72 94 1
+72 104 1
+72 113 1
+72 115 1
+72 116 1
+72 142 1
+72 163 1
+72 178 1
+72 188 1
+72 197 1
+72 199 1
+72 200 1
+72 219 1
+72 234 1
+72 244 1
+72 253 1
+72 255 1
+72 256 1
+72 269 1
+72 279 1
+72 288 1
+72 290 1
+72 291 1
+72 299 1
+72 308 1
+72 310 1
+72 311 1
+72 318 1
+72 320 1
+72 321 1
+72 327 1
+72 328 1
+72 329 1
+72 352 1
+72 373 1
+72 388 1
+72 398 1
+72 407 1
+72 409 1
+72 410 1
+72 429 1
+72 444 1
+72 454 1
+72 463 1
+72 465 1
+72 466 1
+72 479 1
+72 489 1
+72 498 1
+72 500 1
+72 501 1
+72 509 1
+72 518 1
+72 520 1
+72 521 1
+72 528 1
+72 530 1
+72 531 1
+72 537 1
+72 538 1
+72 539 1
+72 555 1
+72 570 1
+72 580 1
+72 589 1
+72 591 1
+72 592 1
+72 605 1
+72 615 1
+72 624 1
+72 626 1
+72 627 1
+72 635 1
+72 644 1
+72 646 1
+72 647 1
+72 654 1
+72 656 1
+72 657 1
+72 663 1
+72 664 1
+72 665 1
+72 675 1
+72 685 1
+72 694 1
+72 696 1
+72 697 1
+72 705 1
+72 714 1
+72 716 1
+72 717 1
+72 724 1
+72 726 1
+72 727 1
+72 733 1
+72 734 1
+72 735 1
+72 740 1
+72 749 1
+72 751 1
+72 752 1
+72 759 1
+72 761 1
+72 762 1
+72 768 1
+72 769 1
+72 770 1
+72 774 1
+72 776 1
+72 777 1
+72 783 1
+72 784 1
+72 785 1
+72 788 1
+72 789 1
+72 790 1
+72 792 1
+72 814 1
+72 835 1
+72 850 1
+72 860 1
+72 869 1
+72 871 1
+72 872 1
+72 891 1
+72 906 1
+72 916 1
+72 925 1
+72 927 1
+72 928 1
+72 941 1
+72 951 1
+72 960 1
+72 962 1
+72 963 1
+72 971 1
+72 980 1
+72 982 1
+72 983 1
+72 990 1
+72 992 1
+72 993 1
+72 999 1
+72 1000 1
+72 1001 1
+72 1017 1
+72 1032 1
+72 1042 1
+72 1051 1
+72 1053 1
+72 1054 1
+72 1067 1
+72 1077 1
+72 1086 1
+72 1088 1
+72 1089 1
+72 1097 1
+72 1106 1
+72 1108 1
+72 1109 1
+72 1116 1
+72 1118 1
+72 1119 1
+72 1125 1
+72 1126 1
+72 1127 1
+72 1137 1
+72 1147 1
+72 1156 1
+72 1158 1
+72 1159 1
+72 1167 1
+72 1176 1
+72 1178 1
+72 1179 1
+72 1186 1
+72 1188 1
+72 1189 1
+72 1195 1
+72 1196 1
+72 1197 1
+72 1202 1
+72 1211 1
+72 1213 1
+72 1214 1
+72 1221 1
+72 1223 1
+72 1224 1
+72 1230 1
+72 1231 1
+72 1232 1
+72 1236 1
+72 1238 1
+72 1239 1
+72 1245 1
+72 1246 1
+72 1247 1
+72 1250 1
+72 1251 1
+72 1252 1
+72 1254 1
+72 1269 1
+72 1284 1
+72 1294 1
+72 1303 1
+72 1305 1
+72 1306 1
+72 1319 1
+72 1329 1
+72 1338 1
+72 1340 1
+72 1341 1
+72 1349 1
+72 1358 1
+72 1360 1
+72 1361 1
+72 1368 1
+72 1370 1
+72 1371 1
+72 1377 1
+72 1378 1
+72 1379 1
+72 1389 1
+72 1399 1
+72 1408 1
+72 1410 1
+72 1411 1
+72 1419 1
+72 1428 1
+72 1430 1
+72 1431 1
+72 1438 1
+72 1440 1
+72 1441 1
+72 1447 1
+72 1448 1
+72 1449 1
+72 1454 1
+72 1463 1
+72 1465 1
+72 1466 1
+72 1473 1
+72 1475 1
+72 1476 1
+72 1482 1
+72 1483 1
+72 1484 1
+72 1488 1
+72 1490 1
+72 1491 1
+72 1497 1
+72 1498 1
+72 1499 1
+72 1502 1
+72 1503 1
+72 1504 1
+72 1506 1
+72 1515 1
+72 1525 1
+72 1534 1
+72 1536 1
+72 1537 1
+72 1545 1
+72 1554 1
+72 1556 1
+72 1557 1
+72 1564 1
+72 1566 1
+72 1567 1
+72 1573 1
+72 1574 1
+72 1575 1
+72 1580 1
+72 1589 1
+72 1591 1
+72 1592 1
+72 1599 1
+72 1601 1
+72 1602 1
+72 1608 1
+72 1609 1
+72 1610 1
+72 1614 1
+72 1616 1
+72 1617 1
+72 1623 1
+72 1624 1
+72 1625 1
+72 1628 1
+72 1629 1
+72 1630 1
+72 1632 1
+72 1636 1
+72 1645 1
+72 1647 1
+72 1648 1
+72 1655 1
+72 1657 1
+72 1658 1
+72 1664 1
+72 1665 1
+72 1666 1
+72 1670 1
+72 1672 1
+72 1673 1
+72 1679 1
+72 1680 1
+72 1681 1
+72 1684 1
+72 1685 1
+72 1686 1
+72 1688 1
+72 1691 1
+72 1693 1
+72 1694 1
+72 1700 1
+72 1701 1
+72 1702 1
+72 1705 1
+72 1706 1
+72 1707 1
+72 1709 1
+72 1711 1
+72 1712 1
+72 1713 1
+72 1715 1
+72 1716 1
+73 31 1
+73 59 1
+73 80 1
+73 95 1
+73 105 1
+73 111 1
+73 117 1
+73 118 1
+73 143 1
+73 164 1
+73 179 1
+73 189 1
+73 195 1
+73 201 1
+73 202 1
+73 220 1
+73 235 1
+73 245 1
+73 251 1
+73 257 1
+73 258 1
+73 270 1
+73 280 1
+73 286 1
+73 292 1
+73 293 1
+73 300 1
+73 306 1
+73 312 1
+73 313 1
+73 316 1
+73 322 1
+73 323 1
+73 326 1
+73 327 1
+73 330 1
+73 353 1
+73 374 1
+73 389 1
+73 399 1
+73 405 1
+73 411 1
+73 412 1
+73 430 1
+73 445 1
+73 455 1
+73 461 1
+73 467 1
+73 468 1
+73 480 1
+73 490 1
+73 496 1
+73 502 1
+73 503 1
+73 510 1
+73 516 1
+73 522 1
+73 523 1
+73 526 1
+73 532 1
+73 533 1
+73 536 1
+73 537 1
+73 540 1
+73 556 1
+73 571 1
+73 581 1
+73 587 1
+73 593 1
+73 594 1
+73 606 1
+73 616 1
+73 622 1
+73 628 1
+73 629 1
+73 636 1
+73 642 1
+73 648 1
+73 649 1
+73 652 1
+73 658 1
+73 659 1
+73 662 1
+73 663 1
+73 666 1
+73 676 1
+73 686 1
+73 692 1
+73 698 1
+73 699 1
+73 706 1
+73 712 1
+73 718 1
+73 719 1
+73 722 1
+73 728 1
+73 729 1
+73 732 1
+73 733 1
+73 736 1
+73 741 1
+73 747 1
+73 753 1
+73 754 1
+73 757 1
+73 763 1
+73 764 1
+73 767 1
+73 768 1
+73 771 1
+73 772 1
+73 778 1
+73 779 1
+73 782 1
+73 783 1
+73 786 1
+73 787 1
+73 788 1
+73 791 1
+73 792 1
+73 815 1
+73 836 1
+73 851 1
+73 861 1
+73 867 1
+73 873 1
+73 874 1
+73 892 1
+73 907 1
+73 917 1
+73 923 1
+73 929 1
+73 930 1
+73 942 1
+73 952 1
+73 958 1
+73 964 1
+73 965 1
+73 972 1
+73 978 1
+73 984 1
+73 985 1
+73 988 1
+73 994 1
+73 995 1
+73 998 1
+73 999 1
+73 1002 1
+73 1018 1
+73 1033 1
+73 1043 1
+73 1049 1
+73 1055 1
+73 1056 1
+73 1068 1
+73 1078 1
+73 1084 1
+73 1090 1
+73 1091 1
+73 1098 1
+73 1104 1
+73 1110 1
+73 1111 1
+73 1114 1
+73 1120 1
+73 1121 1
+73 1124 1
+73 1125 1
+73 1128 1
+73 1138 1
+73 1148 1
+73 1154 1
+73 1160 1
+73 1161 1
+73 1168 1
+73 1174 1
+73 1180 1
+73 1181 1
+73 1184 1
+73 1190 1
+73 1191 1
+73 1194 1
+73 1195 1
+73 1198 1
+73 1203 1
+73 1209 1
+73 1215 1
+73 1216 1
+73 1219 1
+73 1225 1
+73 1226 1
+73 1229 1
+73 1230 1
+73 1233 1
+73 1234 1
+73 1240 1
+73 1241 1
+73 1244 1
+73 1245 1
+73 1248 1
+73 1249 1
+73 1250 1
+73 1253 1
+73 1254 1
+73 1270 1
+73 1285 1
+73 1295 1
+73 1301 1
+73 1307 1
+73 1308 1
+73 1320 1
+73 1330 1
+73 1336 1
+73 1342 1
+73 1343 1
+73 1350 1
+73 1356 1
+73 1362 1
+73 1363 1
+73 1366 1
+73 1372 1
+73 1373 1
+73 1376 1
+73 1377 1
+73 1380 1
+73 1390 1
+73 1400 1
+73 1406 1
+73 1412 1
+73 1413 1
+73 1420 1
+73 1426 1
+73 1432 1
+73 1433 1
+73 1436 1
+73 1442 1
+73 1443 1
+73 1446 1
+73 1447 1
+73 1450 1
+73 1455 1
+73 1461 1
+73 1467 1
+73 1468 1
+73 1471 1
+73 1477 1
+73 1478 1
+73 1481 1
+73 1482 1
+73 1485 1
+73 1486 1
+73 1492 1
+73 1493 1
+73 1496 1
+73 1497 1
+73 1500 1
+73 1501 1
+73 1502 1
+73 1505 1
+73 1506 1
+73 1516 1
+73 1526 1
+73 1532 1
+73 1538 1
+73 1539 1
+73 1546 1
+73 1552 1
+73 1558 1
+73 1559 1
+73 1562 1
+73 1568 1
+73 1569 1
+73 1572 1
+73 1573 1
+73 1576 1
+73 1581 1
+73 1587 1
+73 1593 1
+73 1594 1
+73 1597 1
+73 1603 1
+73 1604 1
+73 1607 1
+73 1608 1
+73 1611 1
+73 1612 1
+73 1618 1
+73 1619 1
+73 1622 1
+73 1623 1
+73 1626 1
+73 1627 1
+73 1628 1
+73 1631 1
+73 1632 1
+73 1637 1
+73 1643 1
+73 1649 1
+73 1650 1
+73 1653 1
+73 1659 1
+73 1660 1
+73 1663 1
+73 1664 1
+73 1667 1
+73 1668 1
+73 1674 1
+73 1675 1
+73 1678 1
+73 1679 1
+73 1682 1
+73 1683 1
+73 1684 1
+73 1687 1
+73 1688 1
+73 1689 1
+73 1695 1
+73 1696 1
+73 1699 1
+73 1700 1
+73 1703 1
+73 1704 1
+73 1705 1
+73 1708 1
+73 1709 1
+73 1710 1
+73 1711 1
+73 1714 1
+73 1715 1
+73 1716 1
+74 32 1
+74 60 1
+74 81 1
+74 96 1
+74 106 1
+74 112 1
+74 117 1
+74 119 1
+74 144 1
+74 165 1
+74 180 1
+74 190 1
+74 196 1
+74 201 1
+74 203 1
+74 221 1
+74 236 1
+74 246 1
+74 252 1
+74 257 1
+74 259 1
+74 271 1
+74 281 1
+74 287 1
+74 292 1
+74 294 1
+74 301 1
+74 307 1
+74 312 1
+74 314 1
+74 317 1
+74 322 1
+74 324 1
+74 326 1
+74 328 1
+74 330 1
+74 354 1
+74 375 1
+74 390 1
+74 400 1
+74 406 1
+74 411 1
+74 413 1
+74 431 1
+74 446 1
+74 456 1
+74 462 1
+74 467 1
+74 469 1
+74 481 1
+74 491 1
+74 497 1
+74 502 1
+74 504 1
+74 511 1
+74 517 1
+74 522 1
+74 524 1
+74 527 1
+74 532 1
+74 534 1
+74 536 1
+74 538 1
+74 540 1
+74 557 1
+74 572 1
+74 582 1
+74 588 1
+74 593 1
+74 595 1
+74 607 1
+74 617 1
+74 623 1
+74 628 1
+74 630 1
+74 637 1
+74 643 1
+74 648 1
+74 650 1
+74 653 1
+74 658 1
+74 660 1
+74 662 1
+74 664 1
+74 666 1
+74 677 1
+74 687 1
+74 693 1
+74 698 1
+74 700 1
+74 707 1
+74 713 1
+74 718 1
+74 720 1
+74 723 1
+74 728 1
+74 730 1
+74 732 1
+74 734 1
+74 736 1
+74 742 1
+74 748 1
+74 753 1
+74 755 1
+74 758 1
+74 763 1
+74 765 1
+74 767 1
+74 769 1
+74 771 1
+74 773 1
+74 778 1
+74 780 1
+74 782 1
+74 784 1
+74 786 1
+74 787 1
+74 789 1
+74 791 1
+74 792 1
+74 816 1
+74 837 1
+74 852 1
+74 862 1
+74 868 1
+74 873 1
+74 875 1
+74 893 1
+74 908 1
+74 918 1
+74 924 1
+74 929 1
+74 931 1
+74 943 1
+74 953 1
+74 959 1
+74 964 1
+74 966 1
+74 973 1
+74 979 1
+74 984 1
+74 986 1
+74 989 1
+74 994 1
+74 996 1
+74 998 1
+74 1000 1
+74 1002 1
+74 1019 1
+74 1034 1
+74 1044 1
+74 1050 1
+74 1055 1
+74 1057 1
+74 1069 1
+74 1079 1
+74 1085 1
+74 1090 1
+74 1092 1
+74 1099 1
+74 1105 1
+74 1110 1
+74 1112 1
+74 1115 1
+74 1120 1
+74 1122 1
+74 1124 1
+74 1126 1
+74 1128 1
+74 1139 1
+74 1149 1
+74 1155 1
+74 1160 1
+74 1162 1
+74 1169 1
+74 1175 1
+74 1180 1
+74 1182 1
+74 1185 1
+74 1190 1
+74 1192 1
+74 1194 1
+74 1196 1
+74 1198 1
+74 1204 1
+74 1210 1
+74 1215 1
+74 1217 1
+74 1220 1
+74 1225 1
+74 1227 1
+74 1229 1
+74 1231 1
+74 1233 1
+74 1235 1
+74 1240 1
+74 1242 1
+74 1244 1
+74 1246 1
+74 1248 1
+74 1249 1
+74 1251 1
+74 1253 1
+74 1254 1
+74 1271 1
+74 1286 1
+74 1296 1
+74 1302 1
+74 1307 1
+74 1309 1
+74 1321 1
+74 1331 1
+74 1337 1
+74 1342 1
+74 1344 1
+74 1351 1
+74 1357 1
+74 1362 1
+74 1364 1
+74 1367 1
+74 1372 1
+74 1374 1
+74 1376 1
+74 1378 1
+74 1380 1
+74 1391 1
+74 1401 1
+74 1407 1
+74 1412 1
+74 1414 1
+74 1421 1
+74 1427 1
+74 1432 1
+74 1434 1
+74 1437 1
+74 1442 1
+74 1444 1
+74 1446 1
+74 1448 1
+74 1450 1
+74 1456 1
+74 1462 1
+74 1467 1
+74 1469 1
+74 1472 1
+74 1477 1
+74 1479 1
+74 1481 1
+74 1483 1
+74 1485 1
+74 1487 1
+74 1492 1
+74 1494 1
+74 1496 1
+74 1498 1
+74 1500 1
+74 1501 1
+74 1503 1
+74 1505 1
+74 1506 1
+74 1517 1
+74 1527 1
+74 1533 1
+74 1538 1
+74 1540 1
+74 1547 1
+74 1553 1
+74 1558 1
+74 1560 1
+74 1563 1
+74 1568 1
+74 1570 1
+74 1572 1
+74 1574 1
+74 1576 1
+74 1582 1
+74 1588 1
+74 1593 1
+74 1595 1
+74 1598 1
+74 1603 1
+74 1605 1
+74 1607 1
+74 1609 1
+74 1611 1
+74 1613 1
+74 1618 1
+74 1620 1
+74 1622 1
+74 1624 1
+74 1626 1
+74 1627 1
+74 1629 1
+74 1631 1
+74 1632 1
+74 1638 1
+74 1644 1
+74 1649 1
+74 1651 1
+74 1654 1
+74 1659 1
+74 1661 1
+74 1663 1
+74 1665 1
+74 1667 1
+74 1669 1
+74 1674 1
+74 1676 1
+74 1678 1
+74 1680 1
+74 1682 1
+74 1683 1
+74 1685 1
+74 1687 1
+74 1688 1
+74 1690 1
+74 1695 1
+74 1697 1
+74 1699 1
+74 1701 1
+74 1703 1
+74 1704 1
+74 1706 1
+74 1708 1
+74 1709 1
+74 1710 1
+74 1712 1
+74 1714 1
+74 1715 1
+74 1716 1
+75 33 1
+75 61 1
+75 82 1
+75 97 1
+75 107 1
+75 113 1
+75 118 1
+75 119 1
+75 145 1
+75 166 1
+75 181 1
+75 191 1
+75 197 1
+75 202 1
+75 203 1
+75 222 1
+75 237 1
+75 247 1
+75 253 1
+75 258 1
+75 259 1
+75 272 1
+75 282 1
+75 288 1
+75 293 1
+75 294 1
+75 302 1
+75 308 1
+75 313 1
+75 314 1
+75 318 1
+75 323 1
+75 324 1
+75 327 1
+75 328 1
+75 330 1
+75 355 1
+75 376 1
+75 391 1
+75 401 1
+75 407 1
+75 412 1
+75 413 1
+75 432 1
+75 447 1
+75 457 1
+75 463 1
+75 468 1
+75 469 1
+75 482 1
+75 492 1
+75 498 1
+75 503 1
+75 504 1
+75 512 1
+75 518 1
+75 523 1
+75 524 1
+75 528 1
+75 533 1
+75 534 1
+75 537 1
+75 538 1
+75 540 1
+75 558 1
+75 573 1
+75 583 1
+75 589 1
+75 594 1
+75 595 1
+75 608 1
+75 618 1
+75 624 1
+75 629 1
+75 630 1
+75 638 1
+75 644 1
+75 649 1
+75 650 1
+75 654 1
+75 659 1
+75 660 1
+75 663 1
+75 664 1
+75 666 1
+75 678 1
+75 688 1
+75 694 1
+75 699 1
+75 700 1
+75 708 1
+75 714 1
+75 719 1
+75 720 1
+75 724 1
+75 729 1
+75 730 1
+75 733 1
+75 734 1
+75 736 1
+75 743 1
+75 749 1
+75 754 1
+75 755 1
+75 759 1
+75 764 1
+75 765 1
+75 768 1
+75 769 1
+75 771 1
+75 774 1
+75 779 1
+75 780 1
+75 783 1
+75 784 1
+75 786 1
+75 788 1
+75 789 1
+75 791 1
+75 792 1
+75 817 1
+75 838 1
+75 853 1
+75 863 1
+75 869 1
+75 874 1
+75 875 1
+75 894 1
+75 909 1
+75 919 1
+75 925 1
+75 930 1
+75 931 1
+75 944 1
+75 954 1
+75 960 1
+75 965 1
+75 966 1
+75 974 1
+75 980 1
+75 985 1
+75 986 1
+75 990 1
+75 995 1
+75 996 1
+75 999 1
+75 1000 1
+75 1002 1
+75 1020 1
+75 1035 1
+75 1045 1
+75 1051 1
+75 1056 1
+75 1057 1
+75 1070 1
+75 1080 1
+75 1086 1
+75 1091 1
+75 1092 1
+75 1100 1
+75 1106 1
+75 1111 1
+75 1112 1
+75 1116 1
+75 1121 1
+75 1122 1
+75 1125 1
+75 1126 1
+75 1128 1
+75 1140 1
+75 1150 1
+75 1156 1
+75 1161 1
+75 1162 1
+75 1170 1
+75 1176 1
+75 1181 1
+75 1182 1
+75 1186 1
+75 1191 1
+75 1192 1
+75 1195 1
+75 1196 1
+75 1198 1
+75 1205 1
+75 1211 1
+75 1216 1
+75 1217 1
+75 1221 1
+75 1226 1
+75 1227 1
+75 1230 1
+75 1231 1
+75 1233 1
+75 1236 1
+75 1241 1
+75 1242 1
+75 1245 1
+75 1246 1
+75 1248 1
+75 1250 1
+75 1251 1
+75 1253 1
+75 1254 1
+75 1272 1
+75 1287 1
+75 1297 1
+75 1303 1
+75 1308 1
+75 1309 1
+75 1322 1
+75 1332 1
+75 1338 1
+75 1343 1
+75 1344 1
+75 1352 1
+75 1358 1
+75 1363 1
+75 1364 1
+75 1368 1
+75 1373 1
+75 1374 1
+75 1377 1
+75 1378 1
+75 1380 1
+75 1392 1
+75 1402 1
+75 1408 1
+75 1413 1
+75 1414 1
+75 1422 1
+75 1428 1
+75 1433 1
+75 1434 1
+75 1438 1
+75 1443 1
+75 1444 1
+75 1447 1
+75 1448 1
+75 1450 1
+75 1457 1
+75 1463 1
+75 1468 1
+75 1469 1
+75 1473 1
+75 1478 1
+75 1479 1
+75 1482 1
+75 1483 1
+75 1485 1
+75 1488 1
+75 1493 1
+75 1494 1
+75 1497 1
+75 1498 1
+75 1500 1
+75 1502 1
+75 1503 1
+75 1505 1
+75 1506 1
+75 1518 1
+75 1528 1
+75 1534 1
+75 1539 1
+75 1540 1
+75 1548 1
+75 1554 1
+75 1559 1
+75 1560 1
+75 1564 1
+75 1569 1
+75 1570 1
+75 1573 1
+75 1574 1
+75 1576 1
+75 1583 1
+75 1589 1
+75 1594 1
+75 1595 1
+75 1599 1
+75 1604 1
+75 1605 1
+75 1608 1
+75 1609 1
+75 1611 1
+75 1614 1
+75 1619 1
+75 1620 1
+75 1623 1
+75 1624 1
+75 1626 1
+75 1628 1
+75 1629 1
+75 1631 1
+75 1632 1
+75 1639 1
+75 1645 1
+75 1650 1
+75 1651 1
+75 1655 1
+75 1660 1
+75 1661 1
+75 1664 1
+75 1665 1
+75 1667 1
+75 1670 1
+75 1675 1
+75 1676 1
+75 1679 1
+75 1680 1
+75 1682 1
+75 1684 1
+75 1685 1
+75 1687 1
+75 1688 1
+75 1691 1
+75 1696 1
+75 1697 1
+75 1700 1
+75 1701 1
+75 1703 1
+75 1705 1
+75 1706 1
+75 1708 1
+75 1709 1
+75 1711 1
+75 1712 1
+75 1714 1
+75 1715 1
+75 1716 1
+76 34 1
+76 62 1
+76 83 1
+76 98 1
+76 108 1
+76 114 1
+76 117 1
+76 120 1
+76 146 1
+76 167 1
+76 182 1
+76 192 1
+76 198 1
+76 201 1
+76 204 1
+76 223 1
+76 238 1
+76 248 1
+76 254 1
+76 257 1
+76 260 1
+76 273 1
+76 283 1
+76 289 1
+76 292 1
+76 295 1
+76 303 1
+76 309 1
+76 312 1
+76 315 1
+76 319 1
+76 322 1
+76 325 1
+76 326 1
+76 329 1
+76 330 1
+76 356 1
+76 377 1
+76 392 1
+76 402 1
+76 408 1
+76 411 1
+76 414 1
+76 433 1
+76 448 1
+76 458 1
+76 464 1
+76 467 1
+76 470 1
+76 483 1
+76 493 1
+76 499 1
+76 502 1
+76 505 1
+76 513 1
+76 519 1
+76 522 1
+76 525 1
+76 529 1
+76 532 1
+76 535 1
+76 536 1
+76 539 1
+76 540 1
+76 559 1
+76 574 1
+76 584 1
+76 590 1
+76 593 1
+76 596 1
+76 609 1
+76 619 1
+76 625 1
+76 628 1
+76 631 1
+76 639 1
+76 645 1
+76 648 1
+76 651 1
+76 655 1
+76 658 1
+76 661 1
+76 662 1
+76 665 1
+76 666 1
+76 679 1
+76 689 1
+76 695 1
+76 698 1
+76 701 1
+76 709 1
+76 715 1
+76 718 1
+76 721 1
+76 725 1
+76 728 1
+76 731 1
+76 732 1
+76 735 1
+76 736 1
+76 744 1
+76 750 1
+76 753 1
+76 756 1
+76 760 1
+76 763 1
+76 766 1
+76 767 1
+76 770 1
+76 771 1
+76 775 1
+76 778 1
+76 781 1
+76 782 1
+76 785 1
+76 786 1
+76 787 1
+76 790 1
+76 791 1
+76 792 1
+76 818 1
+76 839 1
+76 854 1
+76 864 1
+76 870 1
+76 873 1
+76 876 1
+76 895 1
+76 910 1
+76 920 1
+76 926 1
+76 929 1
+76 932 1
+76 945 1
+76 955 1
+76 961 1
+76 964 1
+76 967 1
+76 975 1
+76 981 1
+76 984 1
+76 987 1
+76 991 1
+76 994 1
+76 997 1
+76 998 1
+76 1001 1
+76 1002 1
+76 1021 1
+76 1036 1
+76 1046 1
+76 1052 1
+76 1055 1
+76 1058 1
+76 1071 1
+76 1081 1
+76 1087 1
+76 1090 1
+76 1093 1
+76 1101 1
+76 1107 1
+76 1110 1
+76 1113 1
+76 1117 1
+76 1120 1
+76 1123 1
+76 1124 1
+76 1127 1
+76 1128 1
+76 1141 1
+76 1151 1
+76 1157 1
+76 1160 1
+76 1163 1
+76 1171 1
+76 1177 1
+76 1180 1
+76 1183 1
+76 1187 1
+76 1190 1
+76 1193 1
+76 1194 1
+76 1197 1
+76 1198 1
+76 1206 1
+76 1212 1
+76 1215 1
+76 1218 1
+76 1222 1
+76 1225 1
+76 1228 1
+76 1229 1
+76 1232 1
+76 1233 1
+76 1237 1
+76 1240 1
+76 1243 1
+76 1244 1
+76 1247 1
+76 1248 1
+76 1249 1
+76 1252 1
+76 1253 1
+76 1254 1
+76 1273 1
+76 1288 1
+76 1298 1
+76 1304 1
+76 1307 1
+76 1310 1
+76 1323 1
+76 1333 1
+76 1339 1
+76 1342 1
+76 1345 1
+76 1353 1
+76 1359 1
+76 1362 1
+76 1365 1
+76 1369 1
+76 1372 1
+76 1375 1
+76 1376 1
+76 1379 1
+76 1380 1
+76 1393 1
+76 1403 1
+76 1409 1
+76 1412 1
+76 1415 1
+76 1423 1
+76 1429 1
+76 1432 1
+76 1435 1
+76 1439 1
+76 1442 1
+76 1445 1
+76 1446 1
+76 1449 1
+76 1450 1
+76 1458 1
+76 1464 1
+76 1467 1
+76 1470 1
+76 1474 1
+76 1477 1
+76 1480 1
+76 1481 1
+76 1484 1
+76 1485 1
+76 1489 1
+76 1492 1
+76 1495 1
+76 1496 1
+76 1499 1
+76 1500 1
+76 1501 1
+76 1504 1
+76 1505 1
+76 1506 1
+76 1519 1
+76 1529 1
+76 1535 1
+76 1538 1
+76 1541 1
+76 1549 1
+76 1555 1
+76 1558 1
+76 1561 1
+76 1565 1
+76 1568 1
+76 1571 1
+76 1572 1
+76 1575 1
+76 1576 1
+76 1584 1
+76 1590 1
+76 1593 1
+76 1596 1
+76 1600 1
+76 1603 1
+76 1606 1
+76 1607 1
+76 1610 1
+76 1611 1
+76 1615 1
+76 1618 1
+76 1621 1
+76 1622 1
+76 1625 1
+76 1626 1
+76 1627 1
+76 1630 1
+76 1631 1
+76 1632 1
+76 1640 1
+76 1646 1
+76 1649 1
+76 1652 1
+76 1656 1
+76 1659 1
+76 1662 1
+76 1663 1
+76 1666 1
+76 1667 1
+76 1671 1
+76 1674 1
+76 1677 1
+76 1678 1
+76 1681 1
+76 1682 1
+76 1683 1
+76 1686 1
+76 1687 1
+76 1688 1
+76 1692 1
+76 1695 1
+76 1698 1
+76 1699 1
+76 1702 1
+76 1703 1
+76 1704 1
+76 1707 1
+76 1708 1
+76 1709 1
+76 1710 1
+76 1713 1
+76 1714 1
+76 1715 1
+76 1716 1
+77 35 1
+77 63 1
+77 84 1
+77 99 1
+77 109 1
+77 115 1
+77 118 1
+77 120 1
+77 147 1
+77 168 1
+77 183 1
+77 193 1
+77 199 1
+77 202 1
+77 204 1
+77 224 1
+77 239 1
+77 249 1
+77 255 1
+77 258 1
+77 260 1
+77 274 1
+77 284 1
+77 290 1
+77 293 1
+77 295 1
+77 304 1
+77 310 1
+77 313 1
+77 315 1
+77 320 1
+77 323 1
+77 325 1
+77 327 1
+77 329 1
+77 330 1
+77 357 1
+77 378 1
+77 393 1
+77 403 1
+77 409 1
+77 412 1
+77 414 1
+77 434 1
+77 449 1
+77 459 1
+77 465 1
+77 468 1
+77 470 1
+77 484 1
+77 494 1
+77 500 1
+77 503 1
+77 505 1
+77 514 1
+77 520 1
+77 523 1
+77 525 1
+77 530 1
+77 533 1
+77 535 1
+77 537 1
+77 539 1
+77 540 1
+77 560 1
+77 575 1
+77 585 1
+77 591 1
+77 594 1
+77 596 1
+77 610 1
+77 620 1
+77 626 1
+77 629 1
+77 631 1
+77 640 1
+77 646 1
+77 649 1
+77 651 1
+77 656 1
+77 659 1
+77 661 1
+77 663 1
+77 665 1
+77 666 1
+77 680 1
+77 690 1
+77 696 1
+77 699 1
+77 701 1
+77 710 1
+77 716 1
+77 719 1
+77 721 1
+77 726 1
+77 729 1
+77 731 1
+77 733 1
+77 735 1
+77 736 1
+77 745 1
+77 751 1
+77 754 1
+77 756 1
+77 761 1
+77 764 1
+77 766 1
+77 768 1
+77 770 1
+77 771 1
+77 776 1
+77 779 1
+77 781 1
+77 783 1
+77 785 1
+77 786 1
+77 788 1
+77 790 1
+77 791 1
+77 792 1
+77 819 1
+77 840 1
+77 855 1
+77 865 1
+77 871 1
+77 874 1
+77 876 1
+77 896 1
+77 911 1
+77 921 1
+77 927 1
+77 930 1
+77 932 1
+77 946 1
+77 956 1
+77 962 1
+77 965 1
+77 967 1
+77 976 1
+77 982 1
+77 985 1
+77 987 1
+77 992 1
+77 995 1
+77 997 1
+77 999 1
+77 1001 1
+77 1002 1
+77 1022 1
+77 1037 1
+77 1047 1
+77 1053 1
+77 1056 1
+77 1058 1
+77 1072 1
+77 1082 1
+77 1088 1
+77 1091 1
+77 1093 1
+77 1102 1
+77 1108 1
+77 1111 1
+77 1113 1
+77 1118 1
+77 1121 1
+77 1123 1
+77 1125 1
+77 1127 1
+77 1128 1
+77 1142 1
+77 1152 1
+77 1158 1
+77 1161 1
+77 1163 1
+77 1172 1
+77 1178 1
+77 1181 1
+77 1183 1
+77 1188 1
+77 1191 1
+77 1193 1
+77 1195 1
+77 1197 1
+77 1198 1
+77 1207 1
+77 1213 1
+77 1216 1
+77 1218 1
+77 1223 1
+77 1226 1
+77 1228 1
+77 1230 1
+77 1232 1
+77 1233 1
+77 1238 1
+77 1241 1
+77 1243 1
+77 1245 1
+77 1247 1
+77 1248 1
+77 1250 1
+77 1252 1
+77 1253 1
+77 1254 1
+77 1274 1
+77 1289 1
+77 1299 1
+77 1305 1
+77 1308 1
+77 1310 1
+77 1324 1
+77 1334 1
+77 1340 1
+77 1343 1
+77 1345 1
+77 1354 1
+77 1360 1
+77 1363 1
+77 1365 1
+77 1370 1
+77 1373 1
+77 1375 1
+77 1377 1
+77 1379 1
+77 1380 1
+77 1394 1
+77 1404 1
+77 1410 1
+77 1413 1
+77 1415 1
+77 1424 1
+77 1430 1
+77 1433 1
+77 1435 1
+77 1440 1
+77 1443 1
+77 1445 1
+77 1447 1
+77 1449 1
+77 1450 1
+77 1459 1
+77 1465 1
+77 1468 1
+77 1470 1
+77 1475 1
+77 1478 1
+77 1480 1
+77 1482 1
+77 1484 1
+77 1485 1
+77 1490 1
+77 1493 1
+77 1495 1
+77 1497 1
+77 1499 1
+77 1500 1
+77 1502 1
+77 1504 1
+77 1505 1
+77 1506 1
+77 1520 1
+77 1530 1
+77 1536 1
+77 1539 1
+77 1541 1
+77 1550 1
+77 1556 1
+77 1559 1
+77 1561 1
+77 1566 1
+77 1569 1
+77 1571 1
+77 1573 1
+77 1575 1
+77 1576 1
+77 1585 1
+77 1591 1
+77 1594 1
+77 1596 1
+77 1601 1
+77 1604 1
+77 1606 1
+77 1608 1
+77 1610 1
+77 1611 1
+77 1616 1
+77 1619 1
+77 1621 1
+77 1623 1
+77 1625 1
+77 1626 1
+77 1628 1
+77 1630 1
+77 1631 1
+77 1632 1
+77 1641 1
+77 1647 1
+77 1650 1
+77 1652 1
+77 1657 1
+77 1660 1
+77 1662 1
+77 1664 1
+77 1666 1
+77 1667 1
+77 1672 1
+77 1675 1
+77 1677 1
+77 1679 1
+77 1681 1
+77 1682 1
+77 1684 1
+77 1686 1
+77 1687 1
+77 1688 1
+77 1693 1
+77 1696 1
+77 1698 1
+77 1700 1
+77 1702 1
+77 1703 1
+77 1705 1
+77 1707 1
+77 1708 1
+77 1709 1
+77 1711 1
+77 1713 1
+77 1714 1
+77 1715 1
+77 1716 1
+78 36 1
+78 64 1
+78 85 1
+78 100 1
+78 110 1
+78 116 1
+78 119 1
+78 120 1
+78 148 1
+78 169 1
+78 184 1
+78 194 1
+78 200 1
+78 203 1
+78 204 1
+78 225 1
+78 240 1
+78 250 1
+78 256 1
+78 259 1
+78 260 1
+78 275 1
+78 285 1
+78 291 1
+78 294 1
+78 295 1
+78 305 1
+78 311 1
+78 314 1
+78 315 1
+78 321 1
+78 324 1
+78 325 1
+78 328 1
+78 329 1
+78 330 1
+78 358 1
+78 379 1
+78 394 1
+78 404 1
+78 410 1
+78 413 1
+78 414 1
+78 435 1
+78 450 1
+78 460 1
+78 466 1
+78 469 1
+78 470 1
+78 485 1
+78 495 1
+78 501 1
+78 504 1
+78 505 1
+78 515 1
+78 521 1
+78 524 1
+78 525 1
+78 531 1
+78 534 1
+78 535 1
+78 538 1
+78 539 1
+78 540 1
+78 561 1
+78 576 1
+78 586 1
+78 592 1
+78 595 1
+78 596 1
+78 611 1
+78 621 1
+78 627 1
+78 630 1
+78 631 1
+78 641 1
+78 647 1
+78 650 1
+78 651 1
+78 657 1
+78 660 1
+78 661 1
+78 664 1
+78 665 1
+78 666 1
+78 681 1
+78 691 1
+78 697 1
+78 700 1
+78 701 1
+78 711 1
+78 717 1
+78 720 1
+78 721 1
+78 727 1
+78 730 1
+78 731 1
+78 734 1
+78 735 1
+78 736 1
+78 746 1
+78 752 1
+78 755 1
+78 756 1
+78 762 1
+78 765 1
+78 766 1
+78 769 1
+78 770 1
+78 771 1
+78 777 1
+78 780 1
+78 781 1
+78 784 1
+78 785 1
+78 786 1
+78 789 1
+78 790 1
+78 791 1
+78 792 1
+78 820 1
+78 841 1
+78 856 1
+78 866 1
+78 872 1
+78 875 1
+78 876 1
+78 897 1
+78 912 1
+78 922 1
+78 928 1
+78 931 1
+78 932 1
+78 947 1
+78 957 1
+78 963 1
+78 966 1
+78 967 1
+78 977 1
+78 983 1
+78 986 1
+78 987 1
+78 993 1
+78 996 1
+78 997 1
+78 1000 1
+78 1001 1
+78 1002 1
+78 1023 1
+78 1038 1
+78 1048 1
+78 1054 1
+78 1057 1
+78 1058 1
+78 1073 1
+78 1083 1
+78 1089 1
+78 1092 1
+78 1093 1
+78 1103 1
+78 1109 1
+78 1112 1
+78 1113 1
+78 1119 1
+78 1122 1
+78 1123 1
+78 1126 1
+78 1127 1
+78 1128 1
+78 1143 1
+78 1153 1
+78 1159 1
+78 1162 1
+78 1163 1
+78 1173 1
+78 1179 1
+78 1182 1
+78 1183 1
+78 1189 1
+78 1192 1
+78 1193 1
+78 1196 1
+78 1197 1
+78 1198 1
+78 1208 1
+78 1214 1
+78 1217 1
+78 1218 1
+78 1224 1
+78 1227 1
+78 1228 1
+78 1231 1
+78 1232 1
+78 1233 1
+78 1239 1
+78 1242 1
+78 1243 1
+78 1246 1
+78 1247 1
+78 1248 1
+78 1251 1
+78 1252 1
+78 1253 1
+78 1254 1
+78 1275 1
+78 1290 1
+78 1300 1
+78 1306 1
+78 1309 1
+78 1310 1
+78 1325 1
+78 1335 1
+78 1341 1
+78 1344 1
+78 1345 1
+78 1355 1
+78 1361 1
+78 1364 1
+78 1365 1
+78 1371 1
+78 1374 1
+78 1375 1
+78 1378 1
+78 1379 1
+78 1380 1
+78 1395 1
+78 1405 1
+78 1411 1
+78 1414 1
+78 1415 1
+78 1425 1
+78 1431 1
+78 1434 1
+78 1435 1
+78 1441 1
+78 1444 1
+78 1445 1
+78 1448 1
+78 1449 1
+78 1450 1
+78 1460 1
+78 1466 1
+78 1469 1
+78 1470 1
+78 1476 1
+78 1479 1
+78 1480 1
+78 1483 1
+78 1484 1
+78 1485 1
+78 1491 1
+78 1494 1
+78 1495 1
+78 1498 1
+78 1499 1
+78 1500 1
+78 1503 1
+78 1504 1
+78 1505 1
+78 1506 1
+78 1521 1
+78 1531 1
+78 1537 1
+78 1540 1
+78 1541 1
+78 1551 1
+78 1557 1
+78 1560 1
+78 1561 1
+78 1567 1
+78 1570 1
+78 1571 1
+78 1574 1
+78 1575 1
+78 1576 1
+78 1586 1
+78 1592 1
+78 1595 1
+78 1596 1
+78 1602 1
+78 1605 1
+78 1606 1
+78 1609 1
+78 1610 1
+78 1611 1
+78 1617 1
+78 1620 1
+78 1621 1
+78 1624 1
+78 1625 1
+78 1626 1
+78 1629 1
+78 1630 1
+78 1631 1
+78 1632 1
+78 1642 1
+78 1648 1
+78 1651 1
+78 1652 1
+78 1658 1
+78 1661 1
+78 1662 1
+78 1665 1
+78 1666 1
+78 1667 1
+78 1673 1
+78 1676 1
+78 1677 1
+78 1680 1
+78 1681 1
+78 1682 1
+78 1685 1
+78 1686 1
+78 1687 1
+78 1688 1
+78 1694 1
+78 1697 1
+78 1698 1
+78 1701 1
+78 1702 1
+78 1703 1
+78 1706 1
+78 1707 1
+78 1708 1
+78 1709 1
+78 1712 1
+78 1713 1
+78 1714 1
+78 1715 1
+78 1716 1
+0 0 0
diff --git a/benchmarks/matrix/bibd_13_6_78x1716.sms.gz b/benchmarks/matrix/bibd_13_6_78x1716.sms.gz
new file mode 100644
index 0000000..f12f572
Binary files /dev/null and b/benchmarks/matrix/bibd_13_6_78x1716.sms.gz differ
diff --git a/benchmarks/matrix/bibd_14_7_91x3432.sms b/benchmarks/matrix/bibd_14_7_91x3432.sms
new file mode 100644
index 0000000..d0453e6
--- /dev/null
+++ b/benchmarks/matrix/bibd_14_7_91x3432.sms
@@ -0,0 +1,72074 @@
+91 3432 M
+1 1 1
+1 2 1
+1 3 1
+1 4 1
+1 5 1
+1 6 1
+1 7 1
+1 8 1
+1 9 1
+1 10 1
+1 11 1
+1 12 1
+1 13 1
+1 14 1
+1 15 1
+1 16 1
+1 17 1
+1 18 1
+1 19 1
+1 20 1
+1 21 1
+1 22 1
+1 23 1
+1 24 1
+1 25 1
+1 26 1
+1 27 1
+1 28 1
+1 29 1
+1 30 1
+1 31 1
+1 32 1
+1 33 1
+1 34 1
+1 35 1
+1 36 1
+1 37 1
+1 38 1
+1 39 1
+1 40 1
+1 41 1
+1 42 1
+1 43 1
+1 44 1
+1 45 1
+1 46 1
+1 47 1
+1 48 1
+1 49 1
+1 50 1
+1 51 1
+1 52 1
+1 53 1
+1 54 1
+1 55 1
+1 56 1
+1 57 1
+1 58 1
+1 59 1
+1 60 1
+1 61 1
+1 62 1
+1 63 1
+1 64 1
+1 65 1
+1 66 1
+1 67 1
+1 68 1
+1 69 1
+1 70 1
+1 71 1
+1 72 1
+1 73 1
+1 74 1
+1 75 1
+1 76 1
+1 77 1
+1 78 1
+1 79 1
+1 80 1
+1 81 1
+1 82 1
+1 83 1
+1 84 1
+1 85 1
+1 86 1
+1 87 1
+1 88 1
+1 89 1
+1 90 1
+1 91 1
+1 92 1
+1 93 1
+1 94 1
+1 95 1
+1 96 1
+1 97 1
+1 98 1
+1 99 1
+1 100 1
+1 101 1
+1 102 1
+1 103 1
+1 104 1
+1 105 1
+1 106 1
+1 107 1
+1 108 1
+1 109 1
+1 110 1
+1 111 1
+1 112 1
+1 113 1
+1 114 1
+1 115 1
+1 116 1
+1 117 1
+1 118 1
+1 119 1
+1 120 1
+1 121 1
+1 122 1
+1 123 1
+1 124 1
+1 125 1
+1 126 1
+1 127 1
+1 128 1
+1 129 1
+1 130 1
+1 131 1
+1 132 1
+1 133 1
+1 134 1
+1 135 1
+1 136 1
+1 137 1
+1 138 1
+1 139 1
+1 140 1
+1 141 1
+1 142 1
+1 143 1
+1 144 1
+1 145 1
+1 146 1
+1 147 1
+1 148 1
+1 149 1
+1 150 1
+1 151 1
+1 152 1
+1 153 1
+1 154 1
+1 155 1
+1 156 1
+1 157 1
+1 158 1
+1 159 1
+1 160 1
+1 161 1
+1 162 1
+1 163 1
+1 164 1
+1 165 1
+1 166 1
+1 167 1
+1 168 1
+1 169 1
+1 170 1
+1 171 1
+1 172 1
+1 173 1
+1 174 1
+1 175 1
+1 176 1
+1 177 1
+1 178 1
+1 179 1
+1 180 1
+1 181 1
+1 182 1
+1 183 1
+1 184 1
+1 185 1
+1 186 1
+1 187 1
+1 188 1
+1 189 1
+1 190 1
+1 191 1
+1 192 1
+1 193 1
+1 194 1
+1 195 1
+1 196 1
+1 197 1
+1 198 1
+1 199 1
+1 200 1
+1 201 1
+1 202 1
+1 203 1
+1 204 1
+1 205 1
+1 206 1
+1 207 1
+1 208 1
+1 209 1
+1 210 1
+1 211 1
+1 212 1
+1 213 1
+1 214 1
+1 215 1
+1 216 1
+1 217 1
+1 218 1
+1 219 1
+1 220 1
+1 221 1
+1 222 1
+1 223 1
+1 224 1
+1 225 1
+1 226 1
+1 227 1
+1 228 1
+1 229 1
+1 230 1
+1 231 1
+1 232 1
+1 233 1
+1 234 1
+1 235 1
+1 236 1
+1 237 1
+1 238 1
+1 239 1
+1 240 1
+1 241 1
+1 242 1
+1 243 1
+1 244 1
+1 245 1
+1 246 1
+1 247 1
+1 248 1
+1 249 1
+1 250 1
+1 251 1
+1 252 1
+1 253 1
+1 254 1
+1 255 1
+1 256 1
+1 257 1
+1 258 1
+1 259 1
+1 260 1
+1 261 1
+1 262 1
+1 263 1
+1 264 1
+1 265 1
+1 266 1
+1 267 1
+1 268 1
+1 269 1
+1 270 1
+1 271 1
+1 272 1
+1 273 1
+1 274 1
+1 275 1
+1 276 1
+1 277 1
+1 278 1
+1 279 1
+1 280 1
+1 281 1
+1 282 1
+1 283 1
+1 284 1
+1 285 1
+1 286 1
+1 287 1
+1 288 1
+1 289 1
+1 290 1
+1 291 1
+1 292 1
+1 293 1
+1 294 1
+1 295 1
+1 296 1
+1 297 1
+1 298 1
+1 299 1
+1 300 1
+1 301 1
+1 302 1
+1 303 1
+1 304 1
+1 305 1
+1 306 1
+1 307 1
+1 308 1
+1 309 1
+1 310 1
+1 311 1
+1 312 1
+1 313 1
+1 314 1
+1 315 1
+1 316 1
+1 317 1
+1 318 1
+1 319 1
+1 320 1
+1 321 1
+1 322 1
+1 323 1
+1 324 1
+1 325 1
+1 326 1
+1 327 1
+1 328 1
+1 329 1
+1 330 1
+1 331 1
+1 332 1
+1 333 1
+1 334 1
+1 335 1
+1 336 1
+1 337 1
+1 338 1
+1 339 1
+1 340 1
+1 341 1
+1 342 1
+1 343 1
+1 344 1
+1 345 1
+1 346 1
+1 347 1
+1 348 1
+1 349 1
+1 350 1
+1 351 1
+1 352 1
+1 353 1
+1 354 1
+1 355 1
+1 356 1
+1 357 1
+1 358 1
+1 359 1
+1 360 1
+1 361 1
+1 362 1
+1 363 1
+1 364 1
+1 365 1
+1 366 1
+1 367 1
+1 368 1
+1 369 1
+1 370 1
+1 371 1
+1 372 1
+1 373 1
+1 374 1
+1 375 1
+1 376 1
+1 377 1
+1 378 1
+1 379 1
+1 380 1
+1 381 1
+1 382 1
+1 383 1
+1 384 1
+1 385 1
+1 386 1
+1 387 1
+1 388 1
+1 389 1
+1 390 1
+1 391 1
+1 392 1
+1 393 1
+1 394 1
+1 395 1
+1 396 1
+1 397 1
+1 398 1
+1 399 1
+1 400 1
+1 401 1
+1 402 1
+1 403 1
+1 404 1
+1 405 1
+1 406 1
+1 407 1
+1 408 1
+1 409 1
+1 410 1
+1 411 1
+1 412 1
+1 413 1
+1 414 1
+1 415 1
+1 416 1
+1 417 1
+1 418 1
+1 419 1
+1 420 1
+1 421 1
+1 422 1
+1 423 1
+1 424 1
+1 425 1
+1 426 1
+1 427 1
+1 428 1
+1 429 1
+1 430 1
+1 431 1
+1 432 1
+1 433 1
+1 434 1
+1 435 1
+1 436 1
+1 437 1
+1 438 1
+1 439 1
+1 440 1
+1 441 1
+1 442 1
+1 443 1
+1 444 1
+1 445 1
+1 446 1
+1 447 1
+1 448 1
+1 449 1
+1 450 1
+1 451 1
+1 452 1
+1 453 1
+1 454 1
+1 455 1
+1 456 1
+1 457 1
+1 458 1
+1 459 1
+1 460 1
+1 461 1
+1 462 1
+1 463 1
+1 464 1
+1 465 1
+1 466 1
+1 467 1
+1 468 1
+1 469 1
+1 470 1
+1 471 1
+1 472 1
+1 473 1
+1 474 1
+1 475 1
+1 476 1
+1 477 1
+1 478 1
+1 479 1
+1 480 1
+1 481 1
+1 482 1
+1 483 1
+1 484 1
+1 485 1
+1 486 1
+1 487 1
+1 488 1
+1 489 1
+1 490 1
+1 491 1
+1 492 1
+1 493 1
+1 494 1
+1 495 1
+1 496 1
+1 497 1
+1 498 1
+1 499 1
+1 500 1
+1 501 1
+1 502 1
+1 503 1
+1 504 1
+1 505 1
+1 506 1
+1 507 1
+1 508 1
+1 509 1
+1 510 1
+1 511 1
+1 512 1
+1 513 1
+1 514 1
+1 515 1
+1 516 1
+1 517 1
+1 518 1
+1 519 1
+1 520 1
+1 521 1
+1 522 1
+1 523 1
+1 524 1
+1 525 1
+1 526 1
+1 527 1
+1 528 1
+1 529 1
+1 530 1
+1 531 1
+1 532 1
+1 533 1
+1 534 1
+1 535 1
+1 536 1
+1 537 1
+1 538 1
+1 539 1
+1 540 1
+1 541 1
+1 542 1
+1 543 1
+1 544 1
+1 545 1
+1 546 1
+1 547 1
+1 548 1
+1 549 1
+1 550 1
+1 551 1
+1 552 1
+1 553 1
+1 554 1
+1 555 1
+1 556 1
+1 557 1
+1 558 1
+1 559 1
+1 560 1
+1 561 1
+1 562 1
+1 563 1
+1 564 1
+1 565 1
+1 566 1
+1 567 1
+1 568 1
+1 569 1
+1 570 1
+1 571 1
+1 572 1
+1 573 1
+1 574 1
+1 575 1
+1 576 1
+1 577 1
+1 578 1
+1 579 1
+1 580 1
+1 581 1
+1 582 1
+1 583 1
+1 584 1
+1 585 1
+1 586 1
+1 587 1
+1 588 1
+1 589 1
+1 590 1
+1 591 1
+1 592 1
+1 593 1
+1 594 1
+1 595 1
+1 596 1
+1 597 1
+1 598 1
+1 599 1
+1 600 1
+1 601 1
+1 602 1
+1 603 1
+1 604 1
+1 605 1
+1 606 1
+1 607 1
+1 608 1
+1 609 1
+1 610 1
+1 611 1
+1 612 1
+1 613 1
+1 614 1
+1 615 1
+1 616 1
+1 617 1
+1 618 1
+1 619 1
+1 620 1
+1 621 1
+1 622 1
+1 623 1
+1 624 1
+1 625 1
+1 626 1
+1 627 1
+1 628 1
+1 629 1
+1 630 1
+1 631 1
+1 632 1
+1 633 1
+1 634 1
+1 635 1
+1 636 1
+1 637 1
+1 638 1
+1 639 1
+1 640 1
+1 641 1
+1 642 1
+1 643 1
+1 644 1
+1 645 1
+1 646 1
+1 647 1
+1 648 1
+1 649 1
+1 650 1
+1 651 1
+1 652 1
+1 653 1
+1 654 1
+1 655 1
+1 656 1
+1 657 1
+1 658 1
+1 659 1
+1 660 1
+1 661 1
+1 662 1
+1 663 1
+1 664 1
+1 665 1
+1 666 1
+1 667 1
+1 668 1
+1 669 1
+1 670 1
+1 671 1
+1 672 1
+1 673 1
+1 674 1
+1 675 1
+1 676 1
+1 677 1
+1 678 1
+1 679 1
+1 680 1
+1 681 1
+1 682 1
+1 683 1
+1 684 1
+1 685 1
+1 686 1
+1 687 1
+1 688 1
+1 689 1
+1 690 1
+1 691 1
+1 692 1
+1 693 1
+1 694 1
+1 695 1
+1 696 1
+1 697 1
+1 698 1
+1 699 1
+1 700 1
+1 701 1
+1 702 1
+1 703 1
+1 704 1
+1 705 1
+1 706 1
+1 707 1
+1 708 1
+1 709 1
+1 710 1
+1 711 1
+1 712 1
+1 713 1
+1 714 1
+1 715 1
+1 716 1
+1 717 1
+1 718 1
+1 719 1
+1 720 1
+1 721 1
+1 722 1
+1 723 1
+1 724 1
+1 725 1
+1 726 1
+1 727 1
+1 728 1
+1 729 1
+1 730 1
+1 731 1
+1 732 1
+1 733 1
+1 734 1
+1 735 1
+1 736 1
+1 737 1
+1 738 1
+1 739 1
+1 740 1
+1 741 1
+1 742 1
+1 743 1
+1 744 1
+1 745 1
+1 746 1
+1 747 1
+1 748 1
+1 749 1
+1 750 1
+1 751 1
+1 752 1
+1 753 1
+1 754 1
+1 755 1
+1 756 1
+1 757 1
+1 758 1
+1 759 1
+1 760 1
+1 761 1
+1 762 1
+1 763 1
+1 764 1
+1 765 1
+1 766 1
+1 767 1
+1 768 1
+1 769 1
+1 770 1
+1 771 1
+1 772 1
+1 773 1
+1 774 1
+1 775 1
+1 776 1
+1 777 1
+1 778 1
+1 779 1
+1 780 1
+1 781 1
+1 782 1
+1 783 1
+1 784 1
+1 785 1
+1 786 1
+1 787 1
+1 788 1
+1 789 1
+1 790 1
+1 791 1
+1 792 1
+2 1 1
+2 2 1
+2 3 1
+2 4 1
+2 5 1
+2 6 1
+2 7 1
+2 8 1
+2 9 1
+2 10 1
+2 11 1
+2 12 1
+2 13 1
+2 14 1
+2 15 1
+2 16 1
+2 17 1
+2 18 1
+2 19 1
+2 20 1
+2 21 1
+2 22 1
+2 23 1
+2 24 1
+2 25 1
+2 26 1
+2 27 1
+2 28 1
+2 29 1
+2 30 1
+2 31 1
+2 32 1
+2 33 1
+2 34 1
+2 35 1
+2 36 1
+2 37 1
+2 38 1
+2 39 1
+2 40 1
+2 41 1
+2 42 1
+2 43 1
+2 44 1
+2 45 1
+2 46 1
+2 47 1
+2 48 1
+2 49 1
+2 50 1
+2 51 1
+2 52 1
+2 53 1
+2 54 1
+2 55 1
+2 56 1
+2 57 1
+2 58 1
+2 59 1
+2 60 1
+2 61 1
+2 62 1
+2 63 1
+2 64 1
+2 65 1
+2 66 1
+2 67 1
+2 68 1
+2 69 1
+2 70 1
+2 71 1
+2 72 1
+2 73 1
+2 74 1
+2 75 1
+2 76 1
+2 77 1
+2 78 1
+2 79 1
+2 80 1
+2 81 1
+2 82 1
+2 83 1
+2 84 1
+2 85 1
+2 86 1
+2 87 1
+2 88 1
+2 89 1
+2 90 1
+2 91 1
+2 92 1
+2 93 1
+2 94 1
+2 95 1
+2 96 1
+2 97 1
+2 98 1
+2 99 1
+2 100 1
+2 101 1
+2 102 1
+2 103 1
+2 104 1
+2 105 1
+2 106 1
+2 107 1
+2 108 1
+2 109 1
+2 110 1
+2 111 1
+2 112 1
+2 113 1
+2 114 1
+2 115 1
+2 116 1
+2 117 1
+2 118 1
+2 119 1
+2 120 1
+2 121 1
+2 122 1
+2 123 1
+2 124 1
+2 125 1
+2 126 1
+2 127 1
+2 128 1
+2 129 1
+2 130 1
+2 131 1
+2 132 1
+2 133 1
+2 134 1
+2 135 1
+2 136 1
+2 137 1
+2 138 1
+2 139 1
+2 140 1
+2 141 1
+2 142 1
+2 143 1
+2 144 1
+2 145 1
+2 146 1
+2 147 1
+2 148 1
+2 149 1
+2 150 1
+2 151 1
+2 152 1
+2 153 1
+2 154 1
+2 155 1
+2 156 1
+2 157 1
+2 158 1
+2 159 1
+2 160 1
+2 161 1
+2 162 1
+2 163 1
+2 164 1
+2 165 1
+2 166 1
+2 167 1
+2 168 1
+2 169 1
+2 170 1
+2 171 1
+2 172 1
+2 173 1
+2 174 1
+2 175 1
+2 176 1
+2 177 1
+2 178 1
+2 179 1
+2 180 1
+2 181 1
+2 182 1
+2 183 1
+2 184 1
+2 185 1
+2 186 1
+2 187 1
+2 188 1
+2 189 1
+2 190 1
+2 191 1
+2 192 1
+2 193 1
+2 194 1
+2 195 1
+2 196 1
+2 197 1
+2 198 1
+2 199 1
+2 200 1
+2 201 1
+2 202 1
+2 203 1
+2 204 1
+2 205 1
+2 206 1
+2 207 1
+2 208 1
+2 209 1
+2 210 1
+2 211 1
+2 212 1
+2 213 1
+2 214 1
+2 215 1
+2 216 1
+2 217 1
+2 218 1
+2 219 1
+2 220 1
+2 221 1
+2 222 1
+2 223 1
+2 224 1
+2 225 1
+2 226 1
+2 227 1
+2 228 1
+2 229 1
+2 230 1
+2 231 1
+2 232 1
+2 233 1
+2 234 1
+2 235 1
+2 236 1
+2 237 1
+2 238 1
+2 239 1
+2 240 1
+2 241 1
+2 242 1
+2 243 1
+2 244 1
+2 245 1
+2 246 1
+2 247 1
+2 248 1
+2 249 1
+2 250 1
+2 251 1
+2 252 1
+2 253 1
+2 254 1
+2 255 1
+2 256 1
+2 257 1
+2 258 1
+2 259 1
+2 260 1
+2 261 1
+2 262 1
+2 263 1
+2 264 1
+2 265 1
+2 266 1
+2 267 1
+2 268 1
+2 269 1
+2 270 1
+2 271 1
+2 272 1
+2 273 1
+2 274 1
+2 275 1
+2 276 1
+2 277 1
+2 278 1
+2 279 1
+2 280 1
+2 281 1
+2 282 1
+2 283 1
+2 284 1
+2 285 1
+2 286 1
+2 287 1
+2 288 1
+2 289 1
+2 290 1
+2 291 1
+2 292 1
+2 293 1
+2 294 1
+2 295 1
+2 296 1
+2 297 1
+2 298 1
+2 299 1
+2 300 1
+2 301 1
+2 302 1
+2 303 1
+2 304 1
+2 305 1
+2 306 1
+2 307 1
+2 308 1
+2 309 1
+2 310 1
+2 311 1
+2 312 1
+2 313 1
+2 314 1
+2 315 1
+2 316 1
+2 317 1
+2 318 1
+2 319 1
+2 320 1
+2 321 1
+2 322 1
+2 323 1
+2 324 1
+2 325 1
+2 326 1
+2 327 1
+2 328 1
+2 329 1
+2 330 1
+2 793 1
+2 794 1
+2 795 1
+2 796 1
+2 797 1
+2 798 1
+2 799 1
+2 800 1
+2 801 1
+2 802 1
+2 803 1
+2 804 1
+2 805 1
+2 806 1
+2 807 1
+2 808 1
+2 809 1
+2 810 1
+2 811 1
+2 812 1
+2 813 1
+2 814 1
+2 815 1
+2 816 1
+2 817 1
+2 818 1
+2 819 1
+2 820 1
+2 821 1
+2 822 1
+2 823 1
+2 824 1
+2 825 1
+2 826 1
+2 827 1
+2 828 1
+2 829 1
+2 830 1
+2 831 1
+2 832 1
+2 833 1
+2 834 1
+2 835 1
+2 836 1
+2 837 1
+2 838 1
+2 839 1
+2 840 1
+2 841 1
+2 842 1
+2 843 1
+2 844 1
+2 845 1
+2 846 1
+2 847 1
+2 848 1
+2 849 1
+2 850 1
+2 851 1
+2 852 1
+2 853 1
+2 854 1
+2 855 1
+2 856 1
+2 857 1
+2 858 1
+2 859 1
+2 860 1
+2 861 1
+2 862 1
+2 863 1
+2 864 1
+2 865 1
+2 866 1
+2 867 1
+2 868 1
+2 869 1
+2 870 1
+2 871 1
+2 872 1
+2 873 1
+2 874 1
+2 875 1
+2 876 1
+2 877 1
+2 878 1
+2 879 1
+2 880 1
+2 881 1
+2 882 1
+2 883 1
+2 884 1
+2 885 1
+2 886 1
+2 887 1
+2 888 1
+2 889 1
+2 890 1
+2 891 1
+2 892 1
+2 893 1
+2 894 1
+2 895 1
+2 896 1
+2 897 1
+2 898 1
+2 899 1
+2 900 1
+2 901 1
+2 902 1
+2 903 1
+2 904 1
+2 905 1
+2 906 1
+2 907 1
+2 908 1
+2 909 1
+2 910 1
+2 911 1
+2 912 1
+2 913 1
+2 914 1
+2 915 1
+2 916 1
+2 917 1
+2 918 1
+2 919 1
+2 920 1
+2 921 1
+2 922 1
+2 923 1
+2 924 1
+2 925 1
+2 926 1
+2 927 1
+2 928 1
+2 929 1
+2 930 1
+2 931 1
+2 932 1
+2 933 1
+2 934 1
+2 935 1
+2 936 1
+2 937 1
+2 938 1
+2 939 1
+2 940 1
+2 941 1
+2 942 1
+2 943 1
+2 944 1
+2 945 1
+2 946 1
+2 947 1
+2 948 1
+2 949 1
+2 950 1
+2 951 1
+2 952 1
+2 953 1
+2 954 1
+2 955 1
+2 956 1
+2 957 1
+2 958 1
+2 959 1
+2 960 1
+2 961 1
+2 962 1
+2 963 1
+2 964 1
+2 965 1
+2 966 1
+2 967 1
+2 968 1
+2 969 1
+2 970 1
+2 971 1
+2 972 1
+2 973 1
+2 974 1
+2 975 1
+2 976 1
+2 977 1
+2 978 1
+2 979 1
+2 980 1
+2 981 1
+2 982 1
+2 983 1
+2 984 1
+2 985 1
+2 986 1
+2 987 1
+2 988 1
+2 989 1
+2 990 1
+2 991 1
+2 992 1
+2 993 1
+2 994 1
+2 995 1
+2 996 1
+2 997 1
+2 998 1
+2 999 1
+2 1000 1
+2 1001 1
+2 1002 1
+2 1003 1
+2 1004 1
+2 1005 1
+2 1006 1
+2 1007 1
+2 1008 1
+2 1009 1
+2 1010 1
+2 1011 1
+2 1012 1
+2 1013 1
+2 1014 1
+2 1015 1
+2 1016 1
+2 1017 1
+2 1018 1
+2 1019 1
+2 1020 1
+2 1021 1
+2 1022 1
+2 1023 1
+2 1024 1
+2 1025 1
+2 1026 1
+2 1027 1
+2 1028 1
+2 1029 1
+2 1030 1
+2 1031 1
+2 1032 1
+2 1033 1
+2 1034 1
+2 1035 1
+2 1036 1
+2 1037 1
+2 1038 1
+2 1039 1
+2 1040 1
+2 1041 1
+2 1042 1
+2 1043 1
+2 1044 1
+2 1045 1
+2 1046 1
+2 1047 1
+2 1048 1
+2 1049 1
+2 1050 1
+2 1051 1
+2 1052 1
+2 1053 1
+2 1054 1
+2 1055 1
+2 1056 1
+2 1057 1
+2 1058 1
+2 1059 1
+2 1060 1
+2 1061 1
+2 1062 1
+2 1063 1
+2 1064 1
+2 1065 1
+2 1066 1
+2 1067 1
+2 1068 1
+2 1069 1
+2 1070 1
+2 1071 1
+2 1072 1
+2 1073 1
+2 1074 1
+2 1075 1
+2 1076 1
+2 1077 1
+2 1078 1
+2 1079 1
+2 1080 1
+2 1081 1
+2 1082 1
+2 1083 1
+2 1084 1
+2 1085 1
+2 1086 1
+2 1087 1
+2 1088 1
+2 1089 1
+2 1090 1
+2 1091 1
+2 1092 1
+2 1093 1
+2 1094 1
+2 1095 1
+2 1096 1
+2 1097 1
+2 1098 1
+2 1099 1
+2 1100 1
+2 1101 1
+2 1102 1
+2 1103 1
+2 1104 1
+2 1105 1
+2 1106 1
+2 1107 1
+2 1108 1
+2 1109 1
+2 1110 1
+2 1111 1
+2 1112 1
+2 1113 1
+2 1114 1
+2 1115 1
+2 1116 1
+2 1117 1
+2 1118 1
+2 1119 1
+2 1120 1
+2 1121 1
+2 1122 1
+2 1123 1
+2 1124 1
+2 1125 1
+2 1126 1
+2 1127 1
+2 1128 1
+2 1129 1
+2 1130 1
+2 1131 1
+2 1132 1
+2 1133 1
+2 1134 1
+2 1135 1
+2 1136 1
+2 1137 1
+2 1138 1
+2 1139 1
+2 1140 1
+2 1141 1
+2 1142 1
+2 1143 1
+2 1144 1
+2 1145 1
+2 1146 1
+2 1147 1
+2 1148 1
+2 1149 1
+2 1150 1
+2 1151 1
+2 1152 1
+2 1153 1
+2 1154 1
+2 1155 1
+2 1156 1
+2 1157 1
+2 1158 1
+2 1159 1
+2 1160 1
+2 1161 1
+2 1162 1
+2 1163 1
+2 1164 1
+2 1165 1
+2 1166 1
+2 1167 1
+2 1168 1
+2 1169 1
+2 1170 1
+2 1171 1
+2 1172 1
+2 1173 1
+2 1174 1
+2 1175 1
+2 1176 1
+2 1177 1
+2 1178 1
+2 1179 1
+2 1180 1
+2 1181 1
+2 1182 1
+2 1183 1
+2 1184 1
+2 1185 1
+2 1186 1
+2 1187 1
+2 1188 1
+2 1189 1
+2 1190 1
+2 1191 1
+2 1192 1
+2 1193 1
+2 1194 1
+2 1195 1
+2 1196 1
+2 1197 1
+2 1198 1
+2 1199 1
+2 1200 1
+2 1201 1
+2 1202 1
+2 1203 1
+2 1204 1
+2 1205 1
+2 1206 1
+2 1207 1
+2 1208 1
+2 1209 1
+2 1210 1
+2 1211 1
+2 1212 1
+2 1213 1
+2 1214 1
+2 1215 1
+2 1216 1
+2 1217 1
+2 1218 1
+2 1219 1
+2 1220 1
+2 1221 1
+2 1222 1
+2 1223 1
+2 1224 1
+2 1225 1
+2 1226 1
+2 1227 1
+2 1228 1
+2 1229 1
+2 1230 1
+2 1231 1
+2 1232 1
+2 1233 1
+2 1234 1
+2 1235 1
+2 1236 1
+2 1237 1
+2 1238 1
+2 1239 1
+2 1240 1
+2 1241 1
+2 1242 1
+2 1243 1
+2 1244 1
+2 1245 1
+2 1246 1
+2 1247 1
+2 1248 1
+2 1249 1
+2 1250 1
+2 1251 1
+2 1252 1
+2 1253 1
+2 1254 1
+3 1 1
+3 2 1
+3 3 1
+3 4 1
+3 5 1
+3 6 1
+3 7 1
+3 8 1
+3 9 1
+3 10 1
+3 11 1
+3 12 1
+3 13 1
+3 14 1
+3 15 1
+3 16 1
+3 17 1
+3 18 1
+3 19 1
+3 20 1
+3 21 1
+3 22 1
+3 23 1
+3 24 1
+3 25 1
+3 26 1
+3 27 1
+3 28 1
+3 29 1
+3 30 1
+3 31 1
+3 32 1
+3 33 1
+3 34 1
+3 35 1
+3 36 1
+3 37 1
+3 38 1
+3 39 1
+3 40 1
+3 41 1
+3 42 1
+3 43 1
+3 44 1
+3 45 1
+3 46 1
+3 47 1
+3 48 1
+3 49 1
+3 50 1
+3 51 1
+3 52 1
+3 53 1
+3 54 1
+3 55 1
+3 56 1
+3 57 1
+3 58 1
+3 59 1
+3 60 1
+3 61 1
+3 62 1
+3 63 1
+3 64 1
+3 65 1
+3 66 1
+3 67 1
+3 68 1
+3 69 1
+3 70 1
+3 71 1
+3 72 1
+3 73 1
+3 74 1
+3 75 1
+3 76 1
+3 77 1
+3 78 1
+3 79 1
+3 80 1
+3 81 1
+3 82 1
+3 83 1
+3 84 1
+3 85 1
+3 86 1
+3 87 1
+3 88 1
+3 89 1
+3 90 1
+3 91 1
+3 92 1
+3 93 1
+3 94 1
+3 95 1
+3 96 1
+3 97 1
+3 98 1
+3 99 1
+3 100 1
+3 101 1
+3 102 1
+3 103 1
+3 104 1
+3 105 1
+3 106 1
+3 107 1
+3 108 1
+3 109 1
+3 110 1
+3 111 1
+3 112 1
+3 113 1
+3 114 1
+3 115 1
+3 116 1
+3 117 1
+3 118 1
+3 119 1
+3 120 1
+3 331 1
+3 332 1
+3 333 1
+3 334 1
+3 335 1
+3 336 1
+3 337 1
+3 338 1
+3 339 1
+3 340 1
+3 341 1
+3 342 1
+3 343 1
+3 344 1
+3 345 1
+3 346 1
+3 347 1
+3 348 1
+3 349 1
+3 350 1
+3 351 1
+3 352 1
+3 353 1
+3 354 1
+3 355 1
+3 356 1
+3 357 1
+3 358 1
+3 359 1
+3 360 1
+3 361 1
+3 362 1
+3 363 1
+3 364 1
+3 365 1
+3 366 1
+3 367 1
+3 368 1
+3 369 1
+3 370 1
+3 371 1
+3 372 1
+3 373 1
+3 374 1
+3 375 1
+3 376 1
+3 377 1
+3 378 1
+3 379 1
+3 380 1
+3 381 1
+3 382 1
+3 383 1
+3 384 1
+3 385 1
+3 386 1
+3 387 1
+3 388 1
+3 389 1
+3 390 1
+3 391 1
+3 392 1
+3 393 1
+3 394 1
+3 395 1
+3 396 1
+3 397 1
+3 398 1
+3 399 1
+3 400 1
+3 401 1
+3 402 1
+3 403 1
+3 404 1
+3 405 1
+3 406 1
+3 407 1
+3 408 1
+3 409 1
+3 410 1
+3 411 1
+3 412 1
+3 413 1
+3 414 1
+3 415 1
+3 416 1
+3 417 1
+3 418 1
+3 419 1
+3 420 1
+3 421 1
+3 422 1
+3 423 1
+3 424 1
+3 425 1
+3 426 1
+3 427 1
+3 428 1
+3 429 1
+3 430 1
+3 431 1
+3 432 1
+3 433 1
+3 434 1
+3 435 1
+3 436 1
+3 437 1
+3 438 1
+3 439 1
+3 440 1
+3 441 1
+3 442 1
+3 443 1
+3 444 1
+3 445 1
+3 446 1
+3 447 1
+3 448 1
+3 449 1
+3 450 1
+3 451 1
+3 452 1
+3 453 1
+3 454 1
+3 455 1
+3 456 1
+3 457 1
+3 458 1
+3 459 1
+3 460 1
+3 461 1
+3 462 1
+3 463 1
+3 464 1
+3 465 1
+3 466 1
+3 467 1
+3 468 1
+3 469 1
+3 470 1
+3 471 1
+3 472 1
+3 473 1
+3 474 1
+3 475 1
+3 476 1
+3 477 1
+3 478 1
+3 479 1
+3 480 1
+3 481 1
+3 482 1
+3 483 1
+3 484 1
+3 485 1
+3 486 1
+3 487 1
+3 488 1
+3 489 1
+3 490 1
+3 491 1
+3 492 1
+3 493 1
+3 494 1
+3 495 1
+3 496 1
+3 497 1
+3 498 1
+3 499 1
+3 500 1
+3 501 1
+3 502 1
+3 503 1
+3 504 1
+3 505 1
+3 506 1
+3 507 1
+3 508 1
+3 509 1
+3 510 1
+3 511 1
+3 512 1
+3 513 1
+3 514 1
+3 515 1
+3 516 1
+3 517 1
+3 518 1
+3 519 1
+3 520 1
+3 521 1
+3 522 1
+3 523 1
+3 524 1
+3 525 1
+3 526 1
+3 527 1
+3 528 1
+3 529 1
+3 530 1
+3 531 1
+3 532 1
+3 533 1
+3 534 1
+3 535 1
+3 536 1
+3 537 1
+3 538 1
+3 539 1
+3 540 1
+3 793 1
+3 794 1
+3 795 1
+3 796 1
+3 797 1
+3 798 1
+3 799 1
+3 800 1
+3 801 1
+3 802 1
+3 803 1
+3 804 1
+3 805 1
+3 806 1
+3 807 1
+3 808 1
+3 809 1
+3 810 1
+3 811 1
+3 812 1
+3 813 1
+3 814 1
+3 815 1
+3 816 1
+3 817 1
+3 818 1
+3 819 1
+3 820 1
+3 821 1
+3 822 1
+3 823 1
+3 824 1
+3 825 1
+3 826 1
+3 827 1
+3 828 1
+3 829 1
+3 830 1
+3 831 1
+3 832 1
+3 833 1
+3 834 1
+3 835 1
+3 836 1
+3 837 1
+3 838 1
+3 839 1
+3 840 1
+3 841 1
+3 842 1
+3 843 1
+3 844 1
+3 845 1
+3 846 1
+3 847 1
+3 848 1
+3 849 1
+3 850 1
+3 851 1
+3 852 1
+3 853 1
+3 854 1
+3 855 1
+3 856 1
+3 857 1
+3 858 1
+3 859 1
+3 860 1
+3 861 1
+3 862 1
+3 863 1
+3 864 1
+3 865 1
+3 866 1
+3 867 1
+3 868 1
+3 869 1
+3 870 1
+3 871 1
+3 872 1
+3 873 1
+3 874 1
+3 875 1
+3 876 1
+3 877 1
+3 878 1
+3 879 1
+3 880 1
+3 881 1
+3 882 1
+3 883 1
+3 884 1
+3 885 1
+3 886 1
+3 887 1
+3 888 1
+3 889 1
+3 890 1
+3 891 1
+3 892 1
+3 893 1
+3 894 1
+3 895 1
+3 896 1
+3 897 1
+3 898 1
+3 899 1
+3 900 1
+3 901 1
+3 902 1
+3 903 1
+3 904 1
+3 905 1
+3 906 1
+3 907 1
+3 908 1
+3 909 1
+3 910 1
+3 911 1
+3 912 1
+3 913 1
+3 914 1
+3 915 1
+3 916 1
+3 917 1
+3 918 1
+3 919 1
+3 920 1
+3 921 1
+3 922 1
+3 923 1
+3 924 1
+3 925 1
+3 926 1
+3 927 1
+3 928 1
+3 929 1
+3 930 1
+3 931 1
+3 932 1
+3 933 1
+3 934 1
+3 935 1
+3 936 1
+3 937 1
+3 938 1
+3 939 1
+3 940 1
+3 941 1
+3 942 1
+3 943 1
+3 944 1
+3 945 1
+3 946 1
+3 947 1
+3 948 1
+3 949 1
+3 950 1
+3 951 1
+3 952 1
+3 953 1
+3 954 1
+3 955 1
+3 956 1
+3 957 1
+3 958 1
+3 959 1
+3 960 1
+3 961 1
+3 962 1
+3 963 1
+3 964 1
+3 965 1
+3 966 1
+3 967 1
+3 968 1
+3 969 1
+3 970 1
+3 971 1
+3 972 1
+3 973 1
+3 974 1
+3 975 1
+3 976 1
+3 977 1
+3 978 1
+3 979 1
+3 980 1
+3 981 1
+3 982 1
+3 983 1
+3 984 1
+3 985 1
+3 986 1
+3 987 1
+3 988 1
+3 989 1
+3 990 1
+3 991 1
+3 992 1
+3 993 1
+3 994 1
+3 995 1
+3 996 1
+3 997 1
+3 998 1
+3 999 1
+3 1000 1
+3 1001 1
+3 1002 1
+3 1255 1
+3 1256 1
+3 1257 1
+3 1258 1
+3 1259 1
+3 1260 1
+3 1261 1
+3 1262 1
+3 1263 1
+3 1264 1
+3 1265 1
+3 1266 1
+3 1267 1
+3 1268 1
+3 1269 1
+3 1270 1
+3 1271 1
+3 1272 1
+3 1273 1
+3 1274 1
+3 1275 1
+3 1276 1
+3 1277 1
+3 1278 1
+3 1279 1
+3 1280 1
+3 1281 1
+3 1282 1
+3 1283 1
+3 1284 1
+3 1285 1
+3 1286 1
+3 1287 1
+3 1288 1
+3 1289 1
+3 1290 1
+3 1291 1
+3 1292 1
+3 1293 1
+3 1294 1
+3 1295 1
+3 1296 1
+3 1297 1
+3 1298 1
+3 1299 1
+3 1300 1
+3 1301 1
+3 1302 1
+3 1303 1
+3 1304 1
+3 1305 1
+3 1306 1
+3 1307 1
+3 1308 1
+3 1309 1
+3 1310 1
+3 1311 1
+3 1312 1
+3 1313 1
+3 1314 1
+3 1315 1
+3 1316 1
+3 1317 1
+3 1318 1
+3 1319 1
+3 1320 1
+3 1321 1
+3 1322 1
+3 1323 1
+3 1324 1
+3 1325 1
+3 1326 1
+3 1327 1
+3 1328 1
+3 1329 1
+3 1330 1
+3 1331 1
+3 1332 1
+3 1333 1
+3 1334 1
+3 1335 1
+3 1336 1
+3 1337 1
+3 1338 1
+3 1339 1
+3 1340 1
+3 1341 1
+3 1342 1
+3 1343 1
+3 1344 1
+3 1345 1
+3 1346 1
+3 1347 1
+3 1348 1
+3 1349 1
+3 1350 1
+3 1351 1
+3 1352 1
+3 1353 1
+3 1354 1
+3 1355 1
+3 1356 1
+3 1357 1
+3 1358 1
+3 1359 1
+3 1360 1
+3 1361 1
+3 1362 1
+3 1363 1
+3 1364 1
+3 1365 1
+3 1366 1
+3 1367 1
+3 1368 1
+3 1369 1
+3 1370 1
+3 1371 1
+3 1372 1
+3 1373 1
+3 1374 1
+3 1375 1
+3 1376 1
+3 1377 1
+3 1378 1
+3 1379 1
+3 1380 1
+3 1381 1
+3 1382 1
+3 1383 1
+3 1384 1
+3 1385 1
+3 1386 1
+3 1387 1
+3 1388 1
+3 1389 1
+3 1390 1
+3 1391 1
+3 1392 1
+3 1393 1
+3 1394 1
+3 1395 1
+3 1396 1
+3 1397 1
+3 1398 1
+3 1399 1
+3 1400 1
+3 1401 1
+3 1402 1
+3 1403 1
+3 1404 1
+3 1405 1
+3 1406 1
+3 1407 1
+3 1408 1
+3 1409 1
+3 1410 1
+3 1411 1
+3 1412 1
+3 1413 1
+3 1414 1
+3 1415 1
+3 1416 1
+3 1417 1
+3 1418 1
+3 1419 1
+3 1420 1
+3 1421 1
+3 1422 1
+3 1423 1
+3 1424 1
+3 1425 1
+3 1426 1
+3 1427 1
+3 1428 1
+3 1429 1
+3 1430 1
+3 1431 1
+3 1432 1
+3 1433 1
+3 1434 1
+3 1435 1
+3 1436 1
+3 1437 1
+3 1438 1
+3 1439 1
+3 1440 1
+3 1441 1
+3 1442 1
+3 1443 1
+3 1444 1
+3 1445 1
+3 1446 1
+3 1447 1
+3 1448 1
+3 1449 1
+3 1450 1
+3 1451 1
+3 1452 1
+3 1453 1
+3 1454 1
+3 1455 1
+3 1456 1
+3 1457 1
+3 1458 1
+3 1459 1
+3 1460 1
+3 1461 1
+3 1462 1
+3 1463 1
+3 1464 1
+3 1465 1
+3 1466 1
+3 1467 1
+3 1468 1
+3 1469 1
+3 1470 1
+3 1471 1
+3 1472 1
+3 1473 1
+3 1474 1
+3 1475 1
+3 1476 1
+3 1477 1
+3 1478 1
+3 1479 1
+3 1480 1
+3 1481 1
+3 1482 1
+3 1483 1
+3 1484 1
+3 1485 1
+3 1486 1
+3 1487 1
+3 1488 1
+3 1489 1
+3 1490 1
+3 1491 1
+3 1492 1
+3 1493 1
+3 1494 1
+3 1495 1
+3 1496 1
+3 1497 1
+3 1498 1
+3 1499 1
+3 1500 1
+3 1501 1
+3 1502 1
+3 1503 1
+3 1504 1
+3 1505 1
+3 1506 1
+4 1 1
+4 2 1
+4 3 1
+4 4 1
+4 5 1
+4 6 1
+4 7 1
+4 8 1
+4 9 1
+4 10 1
+4 11 1
+4 12 1
+4 13 1
+4 14 1
+4 15 1
+4 16 1
+4 17 1
+4 18 1
+4 19 1
+4 20 1
+4 21 1
+4 22 1
+4 23 1
+4 24 1
+4 25 1
+4 26 1
+4 27 1
+4 28 1
+4 29 1
+4 30 1
+4 31 1
+4 32 1
+4 33 1
+4 34 1
+4 35 1
+4 36 1
+4 121 1
+4 122 1
+4 123 1
+4 124 1
+4 125 1
+4 126 1
+4 127 1
+4 128 1
+4 129 1
+4 130 1
+4 131 1
+4 132 1
+4 133 1
+4 134 1
+4 135 1
+4 136 1
+4 137 1
+4 138 1
+4 139 1
+4 140 1
+4 141 1
+4 142 1
+4 143 1
+4 144 1
+4 145 1
+4 146 1
+4 147 1
+4 148 1
+4 149 1
+4 150 1
+4 151 1
+4 152 1
+4 153 1
+4 154 1
+4 155 1
+4 156 1
+4 157 1
+4 158 1
+4 159 1
+4 160 1
+4 161 1
+4 162 1
+4 163 1
+4 164 1
+4 165 1
+4 166 1
+4 167 1
+4 168 1
+4 169 1
+4 170 1
+4 171 1
+4 172 1
+4 173 1
+4 174 1
+4 175 1
+4 176 1
+4 177 1
+4 178 1
+4 179 1
+4 180 1
+4 181 1
+4 182 1
+4 183 1
+4 184 1
+4 185 1
+4 186 1
+4 187 1
+4 188 1
+4 189 1
+4 190 1
+4 191 1
+4 192 1
+4 193 1
+4 194 1
+4 195 1
+4 196 1
+4 197 1
+4 198 1
+4 199 1
+4 200 1
+4 201 1
+4 202 1
+4 203 1
+4 204 1
+4 331 1
+4 332 1
+4 333 1
+4 334 1
+4 335 1
+4 336 1
+4 337 1
+4 338 1
+4 339 1
+4 340 1
+4 341 1
+4 342 1
+4 343 1
+4 344 1
+4 345 1
+4 346 1
+4 347 1
+4 348 1
+4 349 1
+4 350 1
+4 351 1
+4 352 1
+4 353 1
+4 354 1
+4 355 1
+4 356 1
+4 357 1
+4 358 1
+4 359 1
+4 360 1
+4 361 1
+4 362 1
+4 363 1
+4 364 1
+4 365 1
+4 366 1
+4 367 1
+4 368 1
+4 369 1
+4 370 1
+4 371 1
+4 372 1
+4 373 1
+4 374 1
+4 375 1
+4 376 1
+4 377 1
+4 378 1
+4 379 1
+4 380 1
+4 381 1
+4 382 1
+4 383 1
+4 384 1
+4 385 1
+4 386 1
+4 387 1
+4 388 1
+4 389 1
+4 390 1
+4 391 1
+4 392 1
+4 393 1
+4 394 1
+4 395 1
+4 396 1
+4 397 1
+4 398 1
+4 399 1
+4 400 1
+4 401 1
+4 402 1
+4 403 1
+4 404 1
+4 405 1
+4 406 1
+4 407 1
+4 408 1
+4 409 1
+4 410 1
+4 411 1
+4 412 1
+4 413 1
+4 414 1
+4 541 1
+4 542 1
+4 543 1
+4 544 1
+4 545 1
+4 546 1
+4 547 1
+4 548 1
+4 549 1
+4 550 1
+4 551 1
+4 552 1
+4 553 1
+4 554 1
+4 555 1
+4 556 1
+4 557 1
+4 558 1
+4 559 1
+4 560 1
+4 561 1
+4 562 1
+4 563 1
+4 564 1
+4 565 1
+4 566 1
+4 567 1
+4 568 1
+4 569 1
+4 570 1
+4 571 1
+4 572 1
+4 573 1
+4 574 1
+4 575 1
+4 576 1
+4 577 1
+4 578 1
+4 579 1
+4 580 1
+4 581 1
+4 582 1
+4 583 1
+4 584 1
+4 585 1
+4 586 1
+4 587 1
+4 588 1
+4 589 1
+4 590 1
+4 591 1
+4 592 1
+4 593 1
+4 594 1
+4 595 1
+4 596 1
+4 597 1
+4 598 1
+4 599 1
+4 600 1
+4 601 1
+4 602 1
+4 603 1
+4 604 1
+4 605 1
+4 606 1
+4 607 1
+4 608 1
+4 609 1
+4 610 1
+4 611 1
+4 612 1
+4 613 1
+4 614 1
+4 615 1
+4 616 1
+4 617 1
+4 618 1
+4 619 1
+4 620 1
+4 621 1
+4 622 1
+4 623 1
+4 624 1
+4 625 1
+4 626 1
+4 627 1
+4 628 1
+4 629 1
+4 630 1
+4 631 1
+4 632 1
+4 633 1
+4 634 1
+4 635 1
+4 636 1
+4 637 1
+4 638 1
+4 639 1
+4 640 1
+4 641 1
+4 642 1
+4 643 1
+4 644 1
+4 645 1
+4 646 1
+4 647 1
+4 648 1
+4 649 1
+4 650 1
+4 651 1
+4 652 1
+4 653 1
+4 654 1
+4 655 1
+4 656 1
+4 657 1
+4 658 1
+4 659 1
+4 660 1
+4 661 1
+4 662 1
+4 663 1
+4 664 1
+4 665 1
+4 666 1
+4 793 1
+4 794 1
+4 795 1
+4 796 1
+4 797 1
+4 798 1
+4 799 1
+4 800 1
+4 801 1
+4 802 1
+4 803 1
+4 804 1
+4 805 1
+4 806 1
+4 807 1
+4 808 1
+4 809 1
+4 810 1
+4 811 1
+4 812 1
+4 813 1
+4 814 1
+4 815 1
+4 816 1
+4 817 1
+4 818 1
+4 819 1
+4 820 1
+4 821 1
+4 822 1
+4 823 1
+4 824 1
+4 825 1
+4 826 1
+4 827 1
+4 828 1
+4 829 1
+4 830 1
+4 831 1
+4 832 1
+4 833 1
+4 834 1
+4 835 1
+4 836 1
+4 837 1
+4 838 1
+4 839 1
+4 840 1
+4 841 1
+4 842 1
+4 843 1
+4 844 1
+4 845 1
+4 846 1
+4 847 1
+4 848 1
+4 849 1
+4 850 1
+4 851 1
+4 852 1
+4 853 1
+4 854 1
+4 855 1
+4 856 1
+4 857 1
+4 858 1
+4 859 1
+4 860 1
+4 861 1
+4 862 1
+4 863 1
+4 864 1
+4 865 1
+4 866 1
+4 867 1
+4 868 1
+4 869 1
+4 870 1
+4 871 1
+4 872 1
+4 873 1
+4 874 1
+4 875 1
+4 876 1
+4 1003 1
+4 1004 1
+4 1005 1
+4 1006 1
+4 1007 1
+4 1008 1
+4 1009 1
+4 1010 1
+4 1011 1
+4 1012 1
+4 1013 1
+4 1014 1
+4 1015 1
+4 1016 1
+4 1017 1
+4 1018 1
+4 1019 1
+4 1020 1
+4 1021 1
+4 1022 1
+4 1023 1
+4 1024 1
+4 1025 1
+4 1026 1
+4 1027 1
+4 1028 1
+4 1029 1
+4 1030 1
+4 1031 1
+4 1032 1
+4 1033 1
+4 1034 1
+4 1035 1
+4 1036 1
+4 1037 1
+4 1038 1
+4 1039 1
+4 1040 1
+4 1041 1
+4 1042 1
+4 1043 1
+4 1044 1
+4 1045 1
+4 1046 1
+4 1047 1
+4 1048 1
+4 1049 1
+4 1050 1
+4 1051 1
+4 1052 1
+4 1053 1
+4 1054 1
+4 1055 1
+4 1056 1
+4 1057 1
+4 1058 1
+4 1059 1
+4 1060 1
+4 1061 1
+4 1062 1
+4 1063 1
+4 1064 1
+4 1065 1
+4 1066 1
+4 1067 1
+4 1068 1
+4 1069 1
+4 1070 1
+4 1071 1
+4 1072 1
+4 1073 1
+4 1074 1
+4 1075 1
+4 1076 1
+4 1077 1
+4 1078 1
+4 1079 1
+4 1080 1
+4 1081 1
+4 1082 1
+4 1083 1
+4 1084 1
+4 1085 1
+4 1086 1
+4 1087 1
+4 1088 1
+4 1089 1
+4 1090 1
+4 1091 1
+4 1092 1
+4 1093 1
+4 1094 1
+4 1095 1
+4 1096 1
+4 1097 1
+4 1098 1
+4 1099 1
+4 1100 1
+4 1101 1
+4 1102 1
+4 1103 1
+4 1104 1
+4 1105 1
+4 1106 1
+4 1107 1
+4 1108 1
+4 1109 1
+4 1110 1
+4 1111 1
+4 1112 1
+4 1113 1
+4 1114 1
+4 1115 1
+4 1116 1
+4 1117 1
+4 1118 1
+4 1119 1
+4 1120 1
+4 1121 1
+4 1122 1
+4 1123 1
+4 1124 1
+4 1125 1
+4 1126 1
+4 1127 1
+4 1128 1
+4 1255 1
+4 1256 1
+4 1257 1
+4 1258 1
+4 1259 1
+4 1260 1
+4 1261 1
+4 1262 1
+4 1263 1
+4 1264 1
+4 1265 1
+4 1266 1
+4 1267 1
+4 1268 1
+4 1269 1
+4 1270 1
+4 1271 1
+4 1272 1
+4 1273 1
+4 1274 1
+4 1275 1
+4 1276 1
+4 1277 1
+4 1278 1
+4 1279 1
+4 1280 1
+4 1281 1
+4 1282 1
+4 1283 1
+4 1284 1
+4 1285 1
+4 1286 1
+4 1287 1
+4 1288 1
+4 1289 1
+4 1290 1
+4 1291 1
+4 1292 1
+4 1293 1
+4 1294 1
+4 1295 1
+4 1296 1
+4 1297 1
+4 1298 1
+4 1299 1
+4 1300 1
+4 1301 1
+4 1302 1
+4 1303 1
+4 1304 1
+4 1305 1
+4 1306 1
+4 1307 1
+4 1308 1
+4 1309 1
+4 1310 1
+4 1311 1
+4 1312 1
+4 1313 1
+4 1314 1
+4 1315 1
+4 1316 1
+4 1317 1
+4 1318 1
+4 1319 1
+4 1320 1
+4 1321 1
+4 1322 1
+4 1323 1
+4 1324 1
+4 1325 1
+4 1326 1
+4 1327 1
+4 1328 1
+4 1329 1
+4 1330 1
+4 1331 1
+4 1332 1
+4 1333 1
+4 1334 1
+4 1335 1
+4 1336 1
+4 1337 1
+4 1338 1
+4 1339 1
+4 1340 1
+4 1341 1
+4 1342 1
+4 1343 1
+4 1344 1
+4 1345 1
+4 1346 1
+4 1347 1
+4 1348 1
+4 1349 1
+4 1350 1
+4 1351 1
+4 1352 1
+4 1353 1
+4 1354 1
+4 1355 1
+4 1356 1
+4 1357 1
+4 1358 1
+4 1359 1
+4 1360 1
+4 1361 1
+4 1362 1
+4 1363 1
+4 1364 1
+4 1365 1
+4 1366 1
+4 1367 1
+4 1368 1
+4 1369 1
+4 1370 1
+4 1371 1
+4 1372 1
+4 1373 1
+4 1374 1
+4 1375 1
+4 1376 1
+4 1377 1
+4 1378 1
+4 1379 1
+4 1380 1
+4 1507 1
+4 1508 1
+4 1509 1
+4 1510 1
+4 1511 1
+4 1512 1
+4 1513 1
+4 1514 1
+4 1515 1
+4 1516 1
+4 1517 1
+4 1518 1
+4 1519 1
+4 1520 1
+4 1521 1
+4 1522 1
+4 1523 1
+4 1524 1
+4 1525 1
+4 1526 1
+4 1527 1
+4 1528 1
+4 1529 1
+4 1530 1
+4 1531 1
+4 1532 1
+4 1533 1
+4 1534 1
+4 1535 1
+4 1536 1
+4 1537 1
+4 1538 1
+4 1539 1
+4 1540 1
+4 1541 1
+4 1542 1
+4 1543 1
+4 1544 1
+4 1545 1
+4 1546 1
+4 1547 1
+4 1548 1
+4 1549 1
+4 1550 1
+4 1551 1
+4 1552 1
+4 1553 1
+4 1554 1
+4 1555 1
+4 1556 1
+4 1557 1
+4 1558 1
+4 1559 1
+4 1560 1
+4 1561 1
+4 1562 1
+4 1563 1
+4 1564 1
+4 1565 1
+4 1566 1
+4 1567 1
+4 1568 1
+4 1569 1
+4 1570 1
+4 1571 1
+4 1572 1
+4 1573 1
+4 1574 1
+4 1575 1
+4 1576 1
+4 1577 1
+4 1578 1
+4 1579 1
+4 1580 1
+4 1581 1
+4 1582 1
+4 1583 1
+4 1584 1
+4 1585 1
+4 1586 1
+4 1587 1
+4 1588 1
+4 1589 1
+4 1590 1
+4 1591 1
+4 1592 1
+4 1593 1
+4 1594 1
+4 1595 1
+4 1596 1
+4 1597 1
+4 1598 1
+4 1599 1
+4 1600 1
+4 1601 1
+4 1602 1
+4 1603 1
+4 1604 1
+4 1605 1
+4 1606 1
+4 1607 1
+4 1608 1
+4 1609 1
+4 1610 1
+4 1611 1
+4 1612 1
+4 1613 1
+4 1614 1
+4 1615 1
+4 1616 1
+4 1617 1
+4 1618 1
+4 1619 1
+4 1620 1
+4 1621 1
+4 1622 1
+4 1623 1
+4 1624 1
+4 1625 1
+4 1626 1
+4 1627 1
+4 1628 1
+4 1629 1
+4 1630 1
+4 1631 1
+4 1632 1
+5 1 1
+5 2 1
+5 3 1
+5 4 1
+5 5 1
+5 6 1
+5 7 1
+5 8 1
+5 37 1
+5 38 1
+5 39 1
+5 40 1
+5 41 1
+5 42 1
+5 43 1
+5 44 1
+5 45 1
+5 46 1
+5 47 1
+5 48 1
+5 49 1
+5 50 1
+5 51 1
+5 52 1
+5 53 1
+5 54 1
+5 55 1
+5 56 1
+5 57 1
+5 58 1
+5 59 1
+5 60 1
+5 61 1
+5 62 1
+5 63 1
+5 64 1
+5 121 1
+5 122 1
+5 123 1
+5 124 1
+5 125 1
+5 126 1
+5 127 1
+5 128 1
+5 129 1
+5 130 1
+5 131 1
+5 132 1
+5 133 1
+5 134 1
+5 135 1
+5 136 1
+5 137 1
+5 138 1
+5 139 1
+5 140 1
+5 141 1
+5 142 1
+5 143 1
+5 144 1
+5 145 1
+5 146 1
+5 147 1
+5 148 1
+5 205 1
+5 206 1
+5 207 1
+5 208 1
+5 209 1
+5 210 1
+5 211 1
+5 212 1
+5 213 1
+5 214 1
+5 215 1
+5 216 1
+5 217 1
+5 218 1
+5 219 1
+5 220 1
+5 221 1
+5 222 1
+5 223 1
+5 224 1
+5 225 1
+5 226 1
+5 227 1
+5 228 1
+5 229 1
+5 230 1
+5 231 1
+5 232 1
+5 233 1
+5 234 1
+5 235 1
+5 236 1
+5 237 1
+5 238 1
+5 239 1
+5 240 1
+5 241 1
+5 242 1
+5 243 1
+5 244 1
+5 245 1
+5 246 1
+5 247 1
+5 248 1
+5 249 1
+5 250 1
+5 251 1
+5 252 1
+5 253 1
+5 254 1
+5 255 1
+5 256 1
+5 257 1
+5 258 1
+5 259 1
+5 260 1
+5 331 1
+5 332 1
+5 333 1
+5 334 1
+5 335 1
+5 336 1
+5 337 1
+5 338 1
+5 339 1
+5 340 1
+5 341 1
+5 342 1
+5 343 1
+5 344 1
+5 345 1
+5 346 1
+5 347 1
+5 348 1
+5 349 1
+5 350 1
+5 351 1
+5 352 1
+5 353 1
+5 354 1
+5 355 1
+5 356 1
+5 357 1
+5 358 1
+5 415 1
+5 416 1
+5 417 1
+5 418 1
+5 419 1
+5 420 1
+5 421 1
+5 422 1
+5 423 1
+5 424 1
+5 425 1
+5 426 1
+5 427 1
+5 428 1
+5 429 1
+5 430 1
+5 431 1
+5 432 1
+5 433 1
+5 434 1
+5 435 1
+5 436 1
+5 437 1
+5 438 1
+5 439 1
+5 440 1
+5 441 1
+5 442 1
+5 443 1
+5 444 1
+5 445 1
+5 446 1
+5 447 1
+5 448 1
+5 449 1
+5 450 1
+5 451 1
+5 452 1
+5 453 1
+5 454 1
+5 455 1
+5 456 1
+5 457 1
+5 458 1
+5 459 1
+5 460 1
+5 461 1
+5 462 1
+5 463 1
+5 464 1
+5 465 1
+5 466 1
+5 467 1
+5 468 1
+5 469 1
+5 470 1
+5 541 1
+5 542 1
+5 543 1
+5 544 1
+5 545 1
+5 546 1
+5 547 1
+5 548 1
+5 549 1
+5 550 1
+5 551 1
+5 552 1
+5 553 1
+5 554 1
+5 555 1
+5 556 1
+5 557 1
+5 558 1
+5 559 1
+5 560 1
+5 561 1
+5 562 1
+5 563 1
+5 564 1
+5 565 1
+5 566 1
+5 567 1
+5 568 1
+5 569 1
+5 570 1
+5 571 1
+5 572 1
+5 573 1
+5 574 1
+5 575 1
+5 576 1
+5 577 1
+5 578 1
+5 579 1
+5 580 1
+5 581 1
+5 582 1
+5 583 1
+5 584 1
+5 585 1
+5 586 1
+5 587 1
+5 588 1
+5 589 1
+5 590 1
+5 591 1
+5 592 1
+5 593 1
+5 594 1
+5 595 1
+5 596 1
+5 667 1
+5 668 1
+5 669 1
+5 670 1
+5 671 1
+5 672 1
+5 673 1
+5 674 1
+5 675 1
+5 676 1
+5 677 1
+5 678 1
+5 679 1
+5 680 1
+5 681 1
+5 682 1
+5 683 1
+5 684 1
+5 685 1
+5 686 1
+5 687 1
+5 688 1
+5 689 1
+5 690 1
+5 691 1
+5 692 1
+5 693 1
+5 694 1
+5 695 1
+5 696 1
+5 697 1
+5 698 1
+5 699 1
+5 700 1
+5 701 1
+5 702 1
+5 703 1
+5 704 1
+5 705 1
+5 706 1
+5 707 1
+5 708 1
+5 709 1
+5 710 1
+5 711 1
+5 712 1
+5 713 1
+5 714 1
+5 715 1
+5 716 1
+5 717 1
+5 718 1
+5 719 1
+5 720 1
+5 721 1
+5 722 1
+5 723 1
+5 724 1
+5 725 1
+5 726 1
+5 727 1
+5 728 1
+5 729 1
+5 730 1
+5 731 1
+5 732 1
+5 733 1
+5 734 1
+5 735 1
+5 736 1
+5 793 1
+5 794 1
+5 795 1
+5 796 1
+5 797 1
+5 798 1
+5 799 1
+5 800 1
+5 801 1
+5 802 1
+5 803 1
+5 804 1
+5 805 1
+5 806 1
+5 807 1
+5 808 1
+5 809 1
+5 810 1
+5 811 1
+5 812 1
+5 813 1
+5 814 1
+5 815 1
+5 816 1
+5 817 1
+5 818 1
+5 819 1
+5 820 1
+5 877 1
+5 878 1
+5 879 1
+5 880 1
+5 881 1
+5 882 1
+5 883 1
+5 884 1
+5 885 1
+5 886 1
+5 887 1
+5 888 1
+5 889 1
+5 890 1
+5 891 1
+5 892 1
+5 893 1
+5 894 1
+5 895 1
+5 896 1
+5 897 1
+5 898 1
+5 899 1
+5 900 1
+5 901 1
+5 902 1
+5 903 1
+5 904 1
+5 905 1
+5 906 1
+5 907 1
+5 908 1
+5 909 1
+5 910 1
+5 911 1
+5 912 1
+5 913 1
+5 914 1
+5 915 1
+5 916 1
+5 917 1
+5 918 1
+5 919 1
+5 920 1
+5 921 1
+5 922 1
+5 923 1
+5 924 1
+5 925 1
+5 926 1
+5 927 1
+5 928 1
+5 929 1
+5 930 1
+5 931 1
+5 932 1
+5 1003 1
+5 1004 1
+5 1005 1
+5 1006 1
+5 1007 1
+5 1008 1
+5 1009 1
+5 1010 1
+5 1011 1
+5 1012 1
+5 1013 1
+5 1014 1
+5 1015 1
+5 1016 1
+5 1017 1
+5 1018 1
+5 1019 1
+5 1020 1
+5 1021 1
+5 1022 1
+5 1023 1
+5 1024 1
+5 1025 1
+5 1026 1
+5 1027 1
+5 1028 1
+5 1029 1
+5 1030 1
+5 1031 1
+5 1032 1
+5 1033 1
+5 1034 1
+5 1035 1
+5 1036 1
+5 1037 1
+5 1038 1
+5 1039 1
+5 1040 1
+5 1041 1
+5 1042 1
+5 1043 1
+5 1044 1
+5 1045 1
+5 1046 1
+5 1047 1
+5 1048 1
+5 1049 1
+5 1050 1
+5 1051 1
+5 1052 1
+5 1053 1
+5 1054 1
+5 1055 1
+5 1056 1
+5 1057 1
+5 1058 1
+5 1129 1
+5 1130 1
+5 1131 1
+5 1132 1
+5 1133 1
+5 1134 1
+5 1135 1
+5 1136 1
+5 1137 1
+5 1138 1
+5 1139 1
+5 1140 1
+5 1141 1
+5 1142 1
+5 1143 1
+5 1144 1
+5 1145 1
+5 1146 1
+5 1147 1
+5 1148 1
+5 1149 1
+5 1150 1
+5 1151 1
+5 1152 1
+5 1153 1
+5 1154 1
+5 1155 1
+5 1156 1
+5 1157 1
+5 1158 1
+5 1159 1
+5 1160 1
+5 1161 1
+5 1162 1
+5 1163 1
+5 1164 1
+5 1165 1
+5 1166 1
+5 1167 1
+5 1168 1
+5 1169 1
+5 1170 1
+5 1171 1
+5 1172 1
+5 1173 1
+5 1174 1
+5 1175 1
+5 1176 1
+5 1177 1
+5 1178 1
+5 1179 1
+5 1180 1
+5 1181 1
+5 1182 1
+5 1183 1
+5 1184 1
+5 1185 1
+5 1186 1
+5 1187 1
+5 1188 1
+5 1189 1
+5 1190 1
+5 1191 1
+5 1192 1
+5 1193 1
+5 1194 1
+5 1195 1
+5 1196 1
+5 1197 1
+5 1198 1
+5 1255 1
+5 1256 1
+5 1257 1
+5 1258 1
+5 1259 1
+5 1260 1
+5 1261 1
+5 1262 1
+5 1263 1
+5 1264 1
+5 1265 1
+5 1266 1
+5 1267 1
+5 1268 1
+5 1269 1
+5 1270 1
+5 1271 1
+5 1272 1
+5 1273 1
+5 1274 1
+5 1275 1
+5 1276 1
+5 1277 1
+5 1278 1
+5 1279 1
+5 1280 1
+5 1281 1
+5 1282 1
+5 1283 1
+5 1284 1
+5 1285 1
+5 1286 1
+5 1287 1
+5 1288 1
+5 1289 1
+5 1290 1
+5 1291 1
+5 1292 1
+5 1293 1
+5 1294 1
+5 1295 1
+5 1296 1
+5 1297 1
+5 1298 1
+5 1299 1
+5 1300 1
+5 1301 1
+5 1302 1
+5 1303 1
+5 1304 1
+5 1305 1
+5 1306 1
+5 1307 1
+5 1308 1
+5 1309 1
+5 1310 1
+5 1381 1
+5 1382 1
+5 1383 1
+5 1384 1
+5 1385 1
+5 1386 1
+5 1387 1
+5 1388 1
+5 1389 1
+5 1390 1
+5 1391 1
+5 1392 1
+5 1393 1
+5 1394 1
+5 1395 1
+5 1396 1
+5 1397 1
+5 1398 1
+5 1399 1
+5 1400 1
+5 1401 1
+5 1402 1
+5 1403 1
+5 1404 1
+5 1405 1
+5 1406 1
+5 1407 1
+5 1408 1
+5 1409 1
+5 1410 1
+5 1411 1
+5 1412 1
+5 1413 1
+5 1414 1
+5 1415 1
+5 1416 1
+5 1417 1
+5 1418 1
+5 1419 1
+5 1420 1
+5 1421 1
+5 1422 1
+5 1423 1
+5 1424 1
+5 1425 1
+5 1426 1
+5 1427 1
+5 1428 1
+5 1429 1
+5 1430 1
+5 1431 1
+5 1432 1
+5 1433 1
+5 1434 1
+5 1435 1
+5 1436 1
+5 1437 1
+5 1438 1
+5 1439 1
+5 1440 1
+5 1441 1
+5 1442 1
+5 1443 1
+5 1444 1
+5 1445 1
+5 1446 1
+5 1447 1
+5 1448 1
+5 1449 1
+5 1450 1
+5 1507 1
+5 1508 1
+5 1509 1
+5 1510 1
+5 1511 1
+5 1512 1
+5 1513 1
+5 1514 1
+5 1515 1
+5 1516 1
+5 1517 1
+5 1518 1
+5 1519 1
+5 1520 1
+5 1521 1
+5 1522 1
+5 1523 1
+5 1524 1
+5 1525 1
+5 1526 1
+5 1527 1
+5 1528 1
+5 1529 1
+5 1530 1
+5 1531 1
+5 1532 1
+5 1533 1
+5 1534 1
+5 1535 1
+5 1536 1
+5 1537 1
+5 1538 1
+5 1539 1
+5 1540 1
+5 1541 1
+5 1542 1
+5 1543 1
+5 1544 1
+5 1545 1
+5 1546 1
+5 1547 1
+5 1548 1
+5 1549 1
+5 1550 1
+5 1551 1
+5 1552 1
+5 1553 1
+5 1554 1
+5 1555 1
+5 1556 1
+5 1557 1
+5 1558 1
+5 1559 1
+5 1560 1
+5 1561 1
+5 1562 1
+5 1563 1
+5 1564 1
+5 1565 1
+5 1566 1
+5 1567 1
+5 1568 1
+5 1569 1
+5 1570 1
+5 1571 1
+5 1572 1
+5 1573 1
+5 1574 1
+5 1575 1
+5 1576 1
+5 1633 1
+5 1634 1
+5 1635 1
+5 1636 1
+5 1637 1
+5 1638 1
+5 1639 1
+5 1640 1
+5 1641 1
+5 1642 1
+5 1643 1
+5 1644 1
+5 1645 1
+5 1646 1
+5 1647 1
+5 1648 1
+5 1649 1
+5 1650 1
+5 1651 1
+5 1652 1
+5 1653 1
+5 1654 1
+5 1655 1
+5 1656 1
+5 1657 1
+5 1658 1
+5 1659 1
+5 1660 1
+5 1661 1
+5 1662 1
+5 1663 1
+5 1664 1
+5 1665 1
+5 1666 1
+5 1667 1
+5 1668 1
+5 1669 1
+5 1670 1
+5 1671 1
+5 1672 1
+5 1673 1
+5 1674 1
+5 1675 1
+5 1676 1
+5 1677 1
+5 1678 1
+5 1679 1
+5 1680 1
+5 1681 1
+5 1682 1
+5 1683 1
+5 1684 1
+5 1685 1
+5 1686 1
+5 1687 1
+5 1688 1
+6 1 1
+6 9 1
+6 10 1
+6 11 1
+6 12 1
+6 13 1
+6 14 1
+6 15 1
+6 37 1
+6 38 1
+6 39 1
+6 40 1
+6 41 1
+6 42 1
+6 43 1
+6 65 1
+6 66 1
+6 67 1
+6 68 1
+6 69 1
+6 70 1
+6 71 1
+6 72 1
+6 73 1
+6 74 1
+6 75 1
+6 76 1
+6 77 1
+6 78 1
+6 79 1
+6 80 1
+6 81 1
+6 82 1
+6 83 1
+6 84 1
+6 85 1
+6 121 1
+6 122 1
+6 123 1
+6 124 1
+6 125 1
+6 126 1
+6 127 1
+6 149 1
+6 150 1
+6 151 1
+6 152 1
+6 153 1
+6 154 1
+6 155 1
+6 156 1
+6 157 1
+6 158 1
+6 159 1
+6 160 1
+6 161 1
+6 162 1
+6 163 1
+6 164 1
+6 165 1
+6 166 1
+6 167 1
+6 168 1
+6 169 1
+6 205 1
+6 206 1
+6 207 1
+6 208 1
+6 209 1
+6 210 1
+6 211 1
+6 212 1
+6 213 1
+6 214 1
+6 215 1
+6 216 1
+6 217 1
+6 218 1
+6 219 1
+6 220 1
+6 221 1
+6 222 1
+6 223 1
+6 224 1
+6 225 1
+6 261 1
+6 262 1
+6 263 1
+6 264 1
+6 265 1
+6 266 1
+6 267 1
+6 268 1
+6 269 1
+6 270 1
+6 271 1
+6 272 1
+6 273 1
+6 274 1
+6 275 1
+6 276 1
+6 277 1
+6 278 1
+6 279 1
+6 280 1
+6 281 1
+6 282 1
+6 283 1
+6 284 1
+6 285 1
+6 286 1
+6 287 1
+6 288 1
+6 289 1
+6 290 1
+6 291 1
+6 292 1
+6 293 1
+6 294 1
+6 295 1
+6 331 1
+6 332 1
+6 333 1
+6 334 1
+6 335 1
+6 336 1
+6 337 1
+6 359 1
+6 360 1
+6 361 1
+6 362 1
+6 363 1
+6 364 1
+6 365 1
+6 366 1
+6 367 1
+6 368 1
+6 369 1
+6 370 1
+6 371 1
+6 372 1
+6 373 1
+6 374 1
+6 375 1
+6 376 1
+6 377 1
+6 378 1
+6 379 1
+6 415 1
+6 416 1
+6 417 1
+6 418 1
+6 419 1
+6 420 1
+6 421 1
+6 422 1
+6 423 1
+6 424 1
+6 425 1
+6 426 1
+6 427 1
+6 428 1
+6 429 1
+6 430 1
+6 431 1
+6 432 1
+6 433 1
+6 434 1
+6 435 1
+6 471 1
+6 472 1
+6 473 1
+6 474 1
+6 475 1
+6 476 1
+6 477 1
+6 478 1
+6 479 1
+6 480 1
+6 481 1
+6 482 1
+6 483 1
+6 484 1
+6 485 1
+6 486 1
+6 487 1
+6 488 1
+6 489 1
+6 490 1
+6 491 1
+6 492 1
+6 493 1
+6 494 1
+6 495 1
+6 496 1
+6 497 1
+6 498 1
+6 499 1
+6 500 1
+6 501 1
+6 502 1
+6 503 1
+6 504 1
+6 505 1
+6 541 1
+6 542 1
+6 543 1
+6 544 1
+6 545 1
+6 546 1
+6 547 1
+6 548 1
+6 549 1
+6 550 1
+6 551 1
+6 552 1
+6 553 1
+6 554 1
+6 555 1
+6 556 1
+6 557 1
+6 558 1
+6 559 1
+6 560 1
+6 561 1
+6 597 1
+6 598 1
+6 599 1
+6 600 1
+6 601 1
+6 602 1
+6 603 1
+6 604 1
+6 605 1
+6 606 1
+6 607 1
+6 608 1
+6 609 1
+6 610 1
+6 611 1
+6 612 1
+6 613 1
+6 614 1
+6 615 1
+6 616 1
+6 617 1
+6 618 1
+6 619 1
+6 620 1
+6 621 1
+6 622 1
+6 623 1
+6 624 1
+6 625 1
+6 626 1
+6 627 1
+6 628 1
+6 629 1
+6 630 1
+6 631 1
+6 667 1
+6 668 1
+6 669 1
+6 670 1
+6 671 1
+6 672 1
+6 673 1
+6 674 1
+6 675 1
+6 676 1
+6 677 1
+6 678 1
+6 679 1
+6 680 1
+6 681 1
+6 682 1
+6 683 1
+6 684 1
+6 685 1
+6 686 1
+6 687 1
+6 688 1
+6 689 1
+6 690 1
+6 691 1
+6 692 1
+6 693 1
+6 694 1
+6 695 1
+6 696 1
+6 697 1
+6 698 1
+6 699 1
+6 700 1
+6 701 1
+6 737 1
+6 738 1
+6 739 1
+6 740 1
+6 741 1
+6 742 1
+6 743 1
+6 744 1
+6 745 1
+6 746 1
+6 747 1
+6 748 1
+6 749 1
+6 750 1
+6 751 1
+6 752 1
+6 753 1
+6 754 1
+6 755 1
+6 756 1
+6 757 1
+6 758 1
+6 759 1
+6 760 1
+6 761 1
+6 762 1
+6 763 1
+6 764 1
+6 765 1
+6 766 1
+6 767 1
+6 768 1
+6 769 1
+6 770 1
+6 771 1
+6 793 1
+6 794 1
+6 795 1
+6 796 1
+6 797 1
+6 798 1
+6 799 1
+6 821 1
+6 822 1
+6 823 1
+6 824 1
+6 825 1
+6 826 1
+6 827 1
+6 828 1
+6 829 1
+6 830 1
+6 831 1
+6 832 1
+6 833 1
+6 834 1
+6 835 1
+6 836 1
+6 837 1
+6 838 1
+6 839 1
+6 840 1
+6 841 1
+6 877 1
+6 878 1
+6 879 1
+6 880 1
+6 881 1
+6 882 1
+6 883 1
+6 884 1
+6 885 1
+6 886 1
+6 887 1
+6 888 1
+6 889 1
+6 890 1
+6 891 1
+6 892 1
+6 893 1
+6 894 1
+6 895 1
+6 896 1
+6 897 1
+6 933 1
+6 934 1
+6 935 1
+6 936 1
+6 937 1
+6 938 1
+6 939 1
+6 940 1
+6 941 1
+6 942 1
+6 943 1
+6 944 1
+6 945 1
+6 946 1
+6 947 1
+6 948 1
+6 949 1
+6 950 1
+6 951 1
+6 952 1
+6 953 1
+6 954 1
+6 955 1
+6 956 1
+6 957 1
+6 958 1
+6 959 1
+6 960 1
+6 961 1
+6 962 1
+6 963 1
+6 964 1
+6 965 1
+6 966 1
+6 967 1
+6 1003 1
+6 1004 1
+6 1005 1
+6 1006 1
+6 1007 1
+6 1008 1
+6 1009 1
+6 1010 1
+6 1011 1
+6 1012 1
+6 1013 1
+6 1014 1
+6 1015 1
+6 1016 1
+6 1017 1
+6 1018 1
+6 1019 1
+6 1020 1
+6 1021 1
+6 1022 1
+6 1023 1
+6 1059 1
+6 1060 1
+6 1061 1
+6 1062 1
+6 1063 1
+6 1064 1
+6 1065 1
+6 1066 1
+6 1067 1
+6 1068 1
+6 1069 1
+6 1070 1
+6 1071 1
+6 1072 1
+6 1073 1
+6 1074 1
+6 1075 1
+6 1076 1
+6 1077 1
+6 1078 1
+6 1079 1
+6 1080 1
+6 1081 1
+6 1082 1
+6 1083 1
+6 1084 1
+6 1085 1
+6 1086 1
+6 1087 1
+6 1088 1
+6 1089 1
+6 1090 1
+6 1091 1
+6 1092 1
+6 1093 1
+6 1129 1
+6 1130 1
+6 1131 1
+6 1132 1
+6 1133 1
+6 1134 1
+6 1135 1
+6 1136 1
+6 1137 1
+6 1138 1
+6 1139 1
+6 1140 1
+6 1141 1
+6 1142 1
+6 1143 1
+6 1144 1
+6 1145 1
+6 1146 1
+6 1147 1
+6 1148 1
+6 1149 1
+6 1150 1
+6 1151 1
+6 1152 1
+6 1153 1
+6 1154 1
+6 1155 1
+6 1156 1
+6 1157 1
+6 1158 1
+6 1159 1
+6 1160 1
+6 1161 1
+6 1162 1
+6 1163 1
+6 1199 1
+6 1200 1
+6 1201 1
+6 1202 1
+6 1203 1
+6 1204 1
+6 1205 1
+6 1206 1
+6 1207 1
+6 1208 1
+6 1209 1
+6 1210 1
+6 1211 1
+6 1212 1
+6 1213 1
+6 1214 1
+6 1215 1
+6 1216 1
+6 1217 1
+6 1218 1
+6 1219 1
+6 1220 1
+6 1221 1
+6 1222 1
+6 1223 1
+6 1224 1
+6 1225 1
+6 1226 1
+6 1227 1
+6 1228 1
+6 1229 1
+6 1230 1
+6 1231 1
+6 1232 1
+6 1233 1
+6 1255 1
+6 1256 1
+6 1257 1
+6 1258 1
+6 1259 1
+6 1260 1
+6 1261 1
+6 1262 1
+6 1263 1
+6 1264 1
+6 1265 1
+6 1266 1
+6 1267 1
+6 1268 1
+6 1269 1
+6 1270 1
+6 1271 1
+6 1272 1
+6 1273 1
+6 1274 1
+6 1275 1
+6 1311 1
+6 1312 1
+6 1313 1
+6 1314 1
+6 1315 1
+6 1316 1
+6 1317 1
+6 1318 1
+6 1319 1
+6 1320 1
+6 1321 1
+6 1322 1
+6 1323 1
+6 1324 1
+6 1325 1
+6 1326 1
+6 1327 1
+6 1328 1
+6 1329 1
+6 1330 1
+6 1331 1
+6 1332 1
+6 1333 1
+6 1334 1
+6 1335 1
+6 1336 1
+6 1337 1
+6 1338 1
+6 1339 1
+6 1340 1
+6 1341 1
+6 1342 1
+6 1343 1
+6 1344 1
+6 1345 1
+6 1381 1
+6 1382 1
+6 1383 1
+6 1384 1
+6 1385 1
+6 1386 1
+6 1387 1
+6 1388 1
+6 1389 1
+6 1390 1
+6 1391 1
+6 1392 1
+6 1393 1
+6 1394 1
+6 1395 1
+6 1396 1
+6 1397 1
+6 1398 1
+6 1399 1
+6 1400 1
+6 1401 1
+6 1402 1
+6 1403 1
+6 1404 1
+6 1405 1
+6 1406 1
+6 1407 1
+6 1408 1
+6 1409 1
+6 1410 1
+6 1411 1
+6 1412 1
+6 1413 1
+6 1414 1
+6 1415 1
+6 1451 1
+6 1452 1
+6 1453 1
+6 1454 1
+6 1455 1
+6 1456 1
+6 1457 1
+6 1458 1
+6 1459 1
+6 1460 1
+6 1461 1
+6 1462 1
+6 1463 1
+6 1464 1
+6 1465 1
+6 1466 1
+6 1467 1
+6 1468 1
+6 1469 1
+6 1470 1
+6 1471 1
+6 1472 1
+6 1473 1
+6 1474 1
+6 1475 1
+6 1476 1
+6 1477 1
+6 1478 1
+6 1479 1
+6 1480 1
+6 1481 1
+6 1482 1
+6 1483 1
+6 1484 1
+6 1485 1
+6 1507 1
+6 1508 1
+6 1509 1
+6 1510 1
+6 1511 1
+6 1512 1
+6 1513 1
+6 1514 1
+6 1515 1
+6 1516 1
+6 1517 1
+6 1518 1
+6 1519 1
+6 1520 1
+6 1521 1
+6 1522 1
+6 1523 1
+6 1524 1
+6 1525 1
+6 1526 1
+6 1527 1
+6 1528 1
+6 1529 1
+6 1530 1
+6 1531 1
+6 1532 1
+6 1533 1
+6 1534 1
+6 1535 1
+6 1536 1
+6 1537 1
+6 1538 1
+6 1539 1
+6 1540 1
+6 1541 1
+6 1577 1
+6 1578 1
+6 1579 1
+6 1580 1
+6 1581 1
+6 1582 1
+6 1583 1
+6 1584 1
+6 1585 1
+6 1586 1
+6 1587 1
+6 1588 1
+6 1589 1
+6 1590 1
+6 1591 1
+6 1592 1
+6 1593 1
+6 1594 1
+6 1595 1
+6 1596 1
+6 1597 1
+6 1598 1
+6 1599 1
+6 1600 1
+6 1601 1
+6 1602 1
+6 1603 1
+6 1604 1
+6 1605 1
+6 1606 1
+6 1607 1
+6 1608 1
+6 1609 1
+6 1610 1
+6 1611 1
+6 1633 1
+6 1634 1
+6 1635 1
+6 1636 1
+6 1637 1
+6 1638 1
+6 1639 1
+6 1640 1
+6 1641 1
+6 1642 1
+6 1643 1
+6 1644 1
+6 1645 1
+6 1646 1
+6 1647 1
+6 1648 1
+6 1649 1
+6 1650 1
+6 1651 1
+6 1652 1
+6 1653 1
+6 1654 1
+6 1655 1
+6 1656 1
+6 1657 1
+6 1658 1
+6 1659 1
+6 1660 1
+6 1661 1
+6 1662 1
+6 1663 1
+6 1664 1
+6 1665 1
+6 1666 1
+6 1667 1
+6 1689 1
+6 1690 1
+6 1691 1
+6 1692 1
+6 1693 1
+6 1694 1
+6 1695 1
+6 1696 1
+6 1697 1
+6 1698 1
+6 1699 1
+6 1700 1
+6 1701 1
+6 1702 1
+6 1703 1
+6 1704 1
+6 1705 1
+6 1706 1
+6 1707 1
+6 1708 1
+6 1709 1
+7 2 1
+7 9 1
+7 16 1
+7 17 1
+7 18 1
+7 19 1
+7 20 1
+7 21 1
+7 37 1
+7 44 1
+7 45 1
+7 46 1
+7 47 1
+7 48 1
+7 49 1
+7 65 1
+7 66 1
+7 67 1
+7 68 1
+7 69 1
+7 70 1
+7 86 1
+7 87 1
+7 88 1
+7 89 1
+7 90 1
+7 91 1
+7 92 1
+7 93 1
+7 94 1
+7 95 1
+7 96 1
+7 97 1
+7 98 1
+7 99 1
+7 100 1
+7 121 1
+7 128 1
+7 129 1
+7 130 1
+7 131 1
+7 132 1
+7 133 1
+7 149 1
+7 150 1
+7 151 1
+7 152 1
+7 153 1
+7 154 1
+7 170 1
+7 171 1
+7 172 1
+7 173 1
+7 174 1
+7 175 1
+7 176 1
+7 177 1
+7 178 1
+7 179 1
+7 180 1
+7 181 1
+7 182 1
+7 183 1
+7 184 1
+7 205 1
+7 206 1
+7 207 1
+7 208 1
+7 209 1
+7 210 1
+7 226 1
+7 227 1
+7 228 1
+7 229 1
+7 230 1
+7 231 1
+7 232 1
+7 233 1
+7 234 1
+7 235 1
+7 236 1
+7 237 1
+7 238 1
+7 239 1
+7 240 1
+7 261 1
+7 262 1
+7 263 1
+7 264 1
+7 265 1
+7 266 1
+7 267 1
+7 268 1
+7 269 1
+7 270 1
+7 271 1
+7 272 1
+7 273 1
+7 274 1
+7 275 1
+7 296 1
+7 297 1
+7 298 1
+7 299 1
+7 300 1
+7 301 1
+7 302 1
+7 303 1
+7 304 1
+7 305 1
+7 306 1
+7 307 1
+7 308 1
+7 309 1
+7 310 1
+7 311 1
+7 312 1
+7 313 1
+7 314 1
+7 315 1
+7 331 1
+7 338 1
+7 339 1
+7 340 1
+7 341 1
+7 342 1
+7 343 1
+7 359 1
+7 360 1
+7 361 1
+7 362 1
+7 363 1
+7 364 1
+7 380 1
+7 381 1
+7 382 1
+7 383 1
+7 384 1
+7 385 1
+7 386 1
+7 387 1
+7 388 1
+7 389 1
+7 390 1
+7 391 1
+7 392 1
+7 393 1
+7 394 1
+7 415 1
+7 416 1
+7 417 1
+7 418 1
+7 419 1
+7 420 1
+7 436 1
+7 437 1
+7 438 1
+7 439 1
+7 440 1
+7 441 1
+7 442 1
+7 443 1
+7 444 1
+7 445 1
+7 446 1
+7 447 1
+7 448 1
+7 449 1
+7 450 1
+7 471 1
+7 472 1
+7 473 1
+7 474 1
+7 475 1
+7 476 1
+7 477 1
+7 478 1
+7 479 1
+7 480 1
+7 481 1
+7 482 1
+7 483 1
+7 484 1
+7 485 1
+7 506 1
+7 507 1
+7 508 1
+7 509 1
+7 510 1
+7 511 1
+7 512 1
+7 513 1
+7 514 1
+7 515 1
+7 516 1
+7 517 1
+7 518 1
+7 519 1
+7 520 1
+7 521 1
+7 522 1
+7 523 1
+7 524 1
+7 525 1
+7 541 1
+7 542 1
+7 543 1
+7 544 1
+7 545 1
+7 546 1
+7 562 1
+7 563 1
+7 564 1
+7 565 1
+7 566 1
+7 567 1
+7 568 1
+7 569 1
+7 570 1
+7 571 1
+7 572 1
+7 573 1
+7 574 1
+7 575 1
+7 576 1
+7 597 1
+7 598 1
+7 599 1
+7 600 1
+7 601 1
+7 602 1
+7 603 1
+7 604 1
+7 605 1
+7 606 1
+7 607 1
+7 608 1
+7 609 1
+7 610 1
+7 611 1
+7 632 1
+7 633 1
+7 634 1
+7 635 1
+7 636 1
+7 637 1
+7 638 1
+7 639 1
+7 640 1
+7 641 1
+7 642 1
+7 643 1
+7 644 1
+7 645 1
+7 646 1
+7 647 1
+7 648 1
+7 649 1
+7 650 1
+7 651 1
+7 667 1
+7 668 1
+7 669 1
+7 670 1
+7 671 1
+7 672 1
+7 673 1
+7 674 1
+7 675 1
+7 676 1
+7 677 1
+7 678 1
+7 679 1
+7 680 1
+7 681 1
+7 702 1
+7 703 1
+7 704 1
+7 705 1
+7 706 1
+7 707 1
+7 708 1
+7 709 1
+7 710 1
+7 711 1
+7 712 1
+7 713 1
+7 714 1
+7 715 1
+7 716 1
+7 717 1
+7 718 1
+7 719 1
+7 720 1
+7 721 1
+7 737 1
+7 738 1
+7 739 1
+7 740 1
+7 741 1
+7 742 1
+7 743 1
+7 744 1
+7 745 1
+7 746 1
+7 747 1
+7 748 1
+7 749 1
+7 750 1
+7 751 1
+7 752 1
+7 753 1
+7 754 1
+7 755 1
+7 756 1
+7 772 1
+7 773 1
+7 774 1
+7 775 1
+7 776 1
+7 777 1
+7 778 1
+7 779 1
+7 780 1
+7 781 1
+7 782 1
+7 783 1
+7 784 1
+7 785 1
+7 786 1
+7 793 1
+7 800 1
+7 801 1
+7 802 1
+7 803 1
+7 804 1
+7 805 1
+7 821 1
+7 822 1
+7 823 1
+7 824 1
+7 825 1
+7 826 1
+7 842 1
+7 843 1
+7 844 1
+7 845 1
+7 846 1
+7 847 1
+7 848 1
+7 849 1
+7 850 1
+7 851 1
+7 852 1
+7 853 1
+7 854 1
+7 855 1
+7 856 1
+7 877 1
+7 878 1
+7 879 1
+7 880 1
+7 881 1
+7 882 1
+7 898 1
+7 899 1
+7 900 1
+7 901 1
+7 902 1
+7 903 1
+7 904 1
+7 905 1
+7 906 1
+7 907 1
+7 908 1
+7 909 1
+7 910 1
+7 911 1
+7 912 1
+7 933 1
+7 934 1
+7 935 1
+7 936 1
+7 937 1
+7 938 1
+7 939 1
+7 940 1
+7 941 1
+7 942 1
+7 943 1
+7 944 1
+7 945 1
+7 946 1
+7 947 1
+7 968 1
+7 969 1
+7 970 1
+7 971 1
+7 972 1
+7 973 1
+7 974 1
+7 975 1
+7 976 1
+7 977 1
+7 978 1
+7 979 1
+7 980 1
+7 981 1
+7 982 1
+7 983 1
+7 984 1
+7 985 1
+7 986 1
+7 987 1
+7 1003 1
+7 1004 1
+7 1005 1
+7 1006 1
+7 1007 1
+7 1008 1
+7 1024 1
+7 1025 1
+7 1026 1
+7 1027 1
+7 1028 1
+7 1029 1
+7 1030 1
+7 1031 1
+7 1032 1
+7 1033 1
+7 1034 1
+7 1035 1
+7 1036 1
+7 1037 1
+7 1038 1
+7 1059 1
+7 1060 1
+7 1061 1
+7 1062 1
+7 1063 1
+7 1064 1
+7 1065 1
+7 1066 1
+7 1067 1
+7 1068 1
+7 1069 1
+7 1070 1
+7 1071 1
+7 1072 1
+7 1073 1
+7 1094 1
+7 1095 1
+7 1096 1
+7 1097 1
+7 1098 1
+7 1099 1
+7 1100 1
+7 1101 1
+7 1102 1
+7 1103 1
+7 1104 1
+7 1105 1
+7 1106 1
+7 1107 1
+7 1108 1
+7 1109 1
+7 1110 1
+7 1111 1
+7 1112 1
+7 1113 1
+7 1129 1
+7 1130 1
+7 1131 1
+7 1132 1
+7 1133 1
+7 1134 1
+7 1135 1
+7 1136 1
+7 1137 1
+7 1138 1
+7 1139 1
+7 1140 1
+7 1141 1
+7 1142 1
+7 1143 1
+7 1164 1
+7 1165 1
+7 1166 1
+7 1167 1
+7 1168 1
+7 1169 1
+7 1170 1
+7 1171 1
+7 1172 1
+7 1173 1
+7 1174 1
+7 1175 1
+7 1176 1
+7 1177 1
+7 1178 1
+7 1179 1
+7 1180 1
+7 1181 1
+7 1182 1
+7 1183 1
+7 1199 1
+7 1200 1
+7 1201 1
+7 1202 1
+7 1203 1
+7 1204 1
+7 1205 1
+7 1206 1
+7 1207 1
+7 1208 1
+7 1209 1
+7 1210 1
+7 1211 1
+7 1212 1
+7 1213 1
+7 1214 1
+7 1215 1
+7 1216 1
+7 1217 1
+7 1218 1
+7 1234 1
+7 1235 1
+7 1236 1
+7 1237 1
+7 1238 1
+7 1239 1
+7 1240 1
+7 1241 1
+7 1242 1
+7 1243 1
+7 1244 1
+7 1245 1
+7 1246 1
+7 1247 1
+7 1248 1
+7 1255 1
+7 1256 1
+7 1257 1
+7 1258 1
+7 1259 1
+7 1260 1
+7 1276 1
+7 1277 1
+7 1278 1
+7 1279 1
+7 1280 1
+7 1281 1
+7 1282 1
+7 1283 1
+7 1284 1
+7 1285 1
+7 1286 1
+7 1287 1
+7 1288 1
+7 1289 1
+7 1290 1
+7 1311 1
+7 1312 1
+7 1313 1
+7 1314 1
+7 1315 1
+7 1316 1
+7 1317 1
+7 1318 1
+7 1319 1
+7 1320 1
+7 1321 1
+7 1322 1
+7 1323 1
+7 1324 1
+7 1325 1
+7 1346 1
+7 1347 1
+7 1348 1
+7 1349 1
+7 1350 1
+7 1351 1
+7 1352 1
+7 1353 1
+7 1354 1
+7 1355 1
+7 1356 1
+7 1357 1
+7 1358 1
+7 1359 1
+7 1360 1
+7 1361 1
+7 1362 1
+7 1363 1
+7 1364 1
+7 1365 1
+7 1381 1
+7 1382 1
+7 1383 1
+7 1384 1
+7 1385 1
+7 1386 1
+7 1387 1
+7 1388 1
+7 1389 1
+7 1390 1
+7 1391 1
+7 1392 1
+7 1393 1
+7 1394 1
+7 1395 1
+7 1416 1
+7 1417 1
+7 1418 1
+7 1419 1
+7 1420 1
+7 1421 1
+7 1422 1
+7 1423 1
+7 1424 1
+7 1425 1
+7 1426 1
+7 1427 1
+7 1428 1
+7 1429 1
+7 1430 1
+7 1431 1
+7 1432 1
+7 1433 1
+7 1434 1
+7 1435 1
+7 1451 1
+7 1452 1
+7 1453 1
+7 1454 1
+7 1455 1
+7 1456 1
+7 1457 1
+7 1458 1
+7 1459 1
+7 1460 1
+7 1461 1
+7 1462 1
+7 1463 1
+7 1464 1
+7 1465 1
+7 1466 1
+7 1467 1
+7 1468 1
+7 1469 1
+7 1470 1
+7 1486 1
+7 1487 1
+7 1488 1
+7 1489 1
+7 1490 1
+7 1491 1
+7 1492 1
+7 1493 1
+7 1494 1
+7 1495 1
+7 1496 1
+7 1497 1
+7 1498 1
+7 1499 1
+7 1500 1
+7 1507 1
+7 1508 1
+7 1509 1
+7 1510 1
+7 1511 1
+7 1512 1
+7 1513 1
+7 1514 1
+7 1515 1
+7 1516 1
+7 1517 1
+7 1518 1
+7 1519 1
+7 1520 1
+7 1521 1
+7 1542 1
+7 1543 1
+7 1544 1
+7 1545 1
+7 1546 1
+7 1547 1
+7 1548 1
+7 1549 1
+7 1550 1
+7 1551 1
+7 1552 1
+7 1553 1
+7 1554 1
+7 1555 1
+7 1556 1
+7 1557 1
+7 1558 1
+7 1559 1
+7 1560 1
+7 1561 1
+7 1577 1
+7 1578 1
+7 1579 1
+7 1580 1
+7 1581 1
+7 1582 1
+7 1583 1
+7 1584 1
+7 1585 1
+7 1586 1
+7 1587 1
+7 1588 1
+7 1589 1
+7 1590 1
+7 1591 1
+7 1592 1
+7 1593 1
+7 1594 1
+7 1595 1
+7 1596 1
+7 1612 1
+7 1613 1
+7 1614 1
+7 1615 1
+7 1616 1
+7 1617 1
+7 1618 1
+7 1619 1
+7 1620 1
+7 1621 1
+7 1622 1
+7 1623 1
+7 1624 1
+7 1625 1
+7 1626 1
+7 1633 1
+7 1634 1
+7 1635 1
+7 1636 1
+7 1637 1
+7 1638 1
+7 1639 1
+7 1640 1
+7 1641 1
+7 1642 1
+7 1643 1
+7 1644 1
+7 1645 1
+7 1646 1
+7 1647 1
+7 1648 1
+7 1649 1
+7 1650 1
+7 1651 1
+7 1652 1
+7 1668 1
+7 1669 1
+7 1670 1
+7 1671 1
+7 1672 1
+7 1673 1
+7 1674 1
+7 1675 1
+7 1676 1
+7 1677 1
+7 1678 1
+7 1679 1
+7 1680 1
+7 1681 1
+7 1682 1
+7 1689 1
+7 1690 1
+7 1691 1
+7 1692 1
+7 1693 1
+7 1694 1
+7 1695 1
+7 1696 1
+7 1697 1
+7 1698 1
+7 1699 1
+7 1700 1
+7 1701 1
+7 1702 1
+7 1703 1
+7 1710 1
+7 1711 1
+7 1712 1
+7 1713 1
+7 1714 1
+7 1715 1
+8 3 1
+8 10 1
+8 16 1
+8 22 1
+8 23 1
+8 24 1
+8 25 1
+8 26 1
+8 38 1
+8 44 1
+8 50 1
+8 51 1
+8 52 1
+8 53 1
+8 54 1
+8 65 1
+8 71 1
+8 72 1
+8 73 1
+8 74 1
+8 75 1
+8 86 1
+8 87 1
+8 88 1
+8 89 1
+8 90 1
+8 101 1
+8 102 1
+8 103 1
+8 104 1
+8 105 1
+8 106 1
+8 107 1
+8 108 1
+8 109 1
+8 110 1
+8 122 1
+8 128 1
+8 134 1
+8 135 1
+8 136 1
+8 137 1
+8 138 1
+8 149 1
+8 155 1
+8 156 1
+8 157 1
+8 158 1
+8 159 1
+8 170 1
+8 171 1
+8 172 1
+8 173 1
+8 174 1
+8 185 1
+8 186 1
+8 187 1
+8 188 1
+8 189 1
+8 190 1
+8 191 1
+8 192 1
+8 193 1
+8 194 1
+8 205 1
+8 211 1
+8 212 1
+8 213 1
+8 214 1
+8 215 1
+8 226 1
+8 227 1
+8 228 1
+8 229 1
+8 230 1
+8 241 1
+8 242 1
+8 243 1
+8 244 1
+8 245 1
+8 246 1
+8 247 1
+8 248 1
+8 249 1
+8 250 1
+8 261 1
+8 262 1
+8 263 1
+8 264 1
+8 265 1
+8 276 1
+8 277 1
+8 278 1
+8 279 1
+8 280 1
+8 281 1
+8 282 1
+8 283 1
+8 284 1
+8 285 1
+8 296 1
+8 297 1
+8 298 1
+8 299 1
+8 300 1
+8 301 1
+8 302 1
+8 303 1
+8 304 1
+8 305 1
+8 316 1
+8 317 1
+8 318 1
+8 319 1
+8 320 1
+8 321 1
+8 322 1
+8 323 1
+8 324 1
+8 325 1
+8 332 1
+8 338 1
+8 344 1
+8 345 1
+8 346 1
+8 347 1
+8 348 1
+8 359 1
+8 365 1
+8 366 1
+8 367 1
+8 368 1
+8 369 1
+8 380 1
+8 381 1
+8 382 1
+8 383 1
+8 384 1
+8 395 1
+8 396 1
+8 397 1
+8 398 1
+8 399 1
+8 400 1
+8 401 1
+8 402 1
+8 403 1
+8 404 1
+8 415 1
+8 421 1
+8 422 1
+8 423 1
+8 424 1
+8 425 1
+8 436 1
+8 437 1
+8 438 1
+8 439 1
+8 440 1
+8 451 1
+8 452 1
+8 453 1
+8 454 1
+8 455 1
+8 456 1
+8 457 1
+8 458 1
+8 459 1
+8 460 1
+8 471 1
+8 472 1
+8 473 1
+8 474 1
+8 475 1
+8 486 1
+8 487 1
+8 488 1
+8 489 1
+8 490 1
+8 491 1
+8 492 1
+8 493 1
+8 494 1
+8 495 1
+8 506 1
+8 507 1
+8 508 1
+8 509 1
+8 510 1
+8 511 1
+8 512 1
+8 513 1
+8 514 1
+8 515 1
+8 526 1
+8 527 1
+8 528 1
+8 529 1
+8 530 1
+8 531 1
+8 532 1
+8 533 1
+8 534 1
+8 535 1
+8 541 1
+8 547 1
+8 548 1
+8 549 1
+8 550 1
+8 551 1
+8 562 1
+8 563 1
+8 564 1
+8 565 1
+8 566 1
+8 577 1
+8 578 1
+8 579 1
+8 580 1
+8 581 1
+8 582 1
+8 583 1
+8 584 1
+8 585 1
+8 586 1
+8 597 1
+8 598 1
+8 599 1
+8 600 1
+8 601 1
+8 612 1
+8 613 1
+8 614 1
+8 615 1
+8 616 1
+8 617 1
+8 618 1
+8 619 1
+8 620 1
+8 621 1
+8 632 1
+8 633 1
+8 634 1
+8 635 1
+8 636 1
+8 637 1
+8 638 1
+8 639 1
+8 640 1
+8 641 1
+8 652 1
+8 653 1
+8 654 1
+8 655 1
+8 656 1
+8 657 1
+8 658 1
+8 659 1
+8 660 1
+8 661 1
+8 667 1
+8 668 1
+8 669 1
+8 670 1
+8 671 1
+8 682 1
+8 683 1
+8 684 1
+8 685 1
+8 686 1
+8 687 1
+8 688 1
+8 689 1
+8 690 1
+8 691 1
+8 702 1
+8 703 1
+8 704 1
+8 705 1
+8 706 1
+8 707 1
+8 708 1
+8 709 1
+8 710 1
+8 711 1
+8 722 1
+8 723 1
+8 724 1
+8 725 1
+8 726 1
+8 727 1
+8 728 1
+8 729 1
+8 730 1
+8 731 1
+8 737 1
+8 738 1
+8 739 1
+8 740 1
+8 741 1
+8 742 1
+8 743 1
+8 744 1
+8 745 1
+8 746 1
+8 757 1
+8 758 1
+8 759 1
+8 760 1
+8 761 1
+8 762 1
+8 763 1
+8 764 1
+8 765 1
+8 766 1
+8 772 1
+8 773 1
+8 774 1
+8 775 1
+8 776 1
+8 777 1
+8 778 1
+8 779 1
+8 780 1
+8 781 1
+8 787 1
+8 788 1
+8 789 1
+8 790 1
+8 791 1
+8 794 1
+8 800 1
+8 806 1
+8 807 1
+8 808 1
+8 809 1
+8 810 1
+8 821 1
+8 827 1
+8 828 1
+8 829 1
+8 830 1
+8 831 1
+8 842 1
+8 843 1
+8 844 1
+8 845 1
+8 846 1
+8 857 1
+8 858 1
+8 859 1
+8 860 1
+8 861 1
+8 862 1
+8 863 1
+8 864 1
+8 865 1
+8 866 1
+8 877 1
+8 883 1
+8 884 1
+8 885 1
+8 886 1
+8 887 1
+8 898 1
+8 899 1
+8 900 1
+8 901 1
+8 902 1
+8 913 1
+8 914 1
+8 915 1
+8 916 1
+8 917 1
+8 918 1
+8 919 1
+8 920 1
+8 921 1
+8 922 1
+8 933 1
+8 934 1
+8 935 1
+8 936 1
+8 937 1
+8 948 1
+8 949 1
+8 950 1
+8 951 1
+8 952 1
+8 953 1
+8 954 1
+8 955 1
+8 956 1
+8 957 1
+8 968 1
+8 969 1
+8 970 1
+8 971 1
+8 972 1
+8 973 1
+8 974 1
+8 975 1
+8 976 1
+8 977 1
+8 988 1
+8 989 1
+8 990 1
+8 991 1
+8 992 1
+8 993 1
+8 994 1
+8 995 1
+8 996 1
+8 997 1
+8 1003 1
+8 1009 1
+8 1010 1
+8 1011 1
+8 1012 1
+8 1013 1
+8 1024 1
+8 1025 1
+8 1026 1
+8 1027 1
+8 1028 1
+8 1039 1
+8 1040 1
+8 1041 1
+8 1042 1
+8 1043 1
+8 1044 1
+8 1045 1
+8 1046 1
+8 1047 1
+8 1048 1
+8 1059 1
+8 1060 1
+8 1061 1
+8 1062 1
+8 1063 1
+8 1074 1
+8 1075 1
+8 1076 1
+8 1077 1
+8 1078 1
+8 1079 1
+8 1080 1
+8 1081 1
+8 1082 1
+8 1083 1
+8 1094 1
+8 1095 1
+8 1096 1
+8 1097 1
+8 1098 1
+8 1099 1
+8 1100 1
+8 1101 1
+8 1102 1
+8 1103 1
+8 1114 1
+8 1115 1
+8 1116 1
+8 1117 1
+8 1118 1
+8 1119 1
+8 1120 1
+8 1121 1
+8 1122 1
+8 1123 1
+8 1129 1
+8 1130 1
+8 1131 1
+8 1132 1
+8 1133 1
+8 1144 1
+8 1145 1
+8 1146 1
+8 1147 1
+8 1148 1
+8 1149 1
+8 1150 1
+8 1151 1
+8 1152 1
+8 1153 1
+8 1164 1
+8 1165 1
+8 1166 1
+8 1167 1
+8 1168 1
+8 1169 1
+8 1170 1
+8 1171 1
+8 1172 1
+8 1173 1
+8 1184 1
+8 1185 1
+8 1186 1
+8 1187 1
+8 1188 1
+8 1189 1
+8 1190 1
+8 1191 1
+8 1192 1
+8 1193 1
+8 1199 1
+8 1200 1
+8 1201 1
+8 1202 1
+8 1203 1
+8 1204 1
+8 1205 1
+8 1206 1
+8 1207 1
+8 1208 1
+8 1219 1
+8 1220 1
+8 1221 1
+8 1222 1
+8 1223 1
+8 1224 1
+8 1225 1
+8 1226 1
+8 1227 1
+8 1228 1
+8 1234 1
+8 1235 1
+8 1236 1
+8 1237 1
+8 1238 1
+8 1239 1
+8 1240 1
+8 1241 1
+8 1242 1
+8 1243 1
+8 1249 1
+8 1250 1
+8 1251 1
+8 1252 1
+8 1253 1
+8 1255 1
+8 1261 1
+8 1262 1
+8 1263 1
+8 1264 1
+8 1265 1
+8 1276 1
+8 1277 1
+8 1278 1
+8 1279 1
+8 1280 1
+8 1291 1
+8 1292 1
+8 1293 1
+8 1294 1
+8 1295 1
+8 1296 1
+8 1297 1
+8 1298 1
+8 1299 1
+8 1300 1
+8 1311 1
+8 1312 1
+8 1313 1
+8 1314 1
+8 1315 1
+8 1326 1
+8 1327 1
+8 1328 1
+8 1329 1
+8 1330 1
+8 1331 1
+8 1332 1
+8 1333 1
+8 1334 1
+8 1335 1
+8 1346 1
+8 1347 1
+8 1348 1
+8 1349 1
+8 1350 1
+8 1351 1
+8 1352 1
+8 1353 1
+8 1354 1
+8 1355 1
+8 1366 1
+8 1367 1
+8 1368 1
+8 1369 1
+8 1370 1
+8 1371 1
+8 1372 1
+8 1373 1
+8 1374 1
+8 1375 1
+8 1381 1
+8 1382 1
+8 1383 1
+8 1384 1
+8 1385 1
+8 1396 1
+8 1397 1
+8 1398 1
+8 1399 1
+8 1400 1
+8 1401 1
+8 1402 1
+8 1403 1
+8 1404 1
+8 1405 1
+8 1416 1
+8 1417 1
+8 1418 1
+8 1419 1
+8 1420 1
+8 1421 1
+8 1422 1
+8 1423 1
+8 1424 1
+8 1425 1
+8 1436 1
+8 1437 1
+8 1438 1
+8 1439 1
+8 1440 1
+8 1441 1
+8 1442 1
+8 1443 1
+8 1444 1
+8 1445 1
+8 1451 1
+8 1452 1
+8 1453 1
+8 1454 1
+8 1455 1
+8 1456 1
+8 1457 1
+8 1458 1
+8 1459 1
+8 1460 1
+8 1471 1
+8 1472 1
+8 1473 1
+8 1474 1
+8 1475 1
+8 1476 1
+8 1477 1
+8 1478 1
+8 1479 1
+8 1480 1
+8 1486 1
+8 1487 1
+8 1488 1
+8 1489 1
+8 1490 1
+8 1491 1
+8 1492 1
+8 1493 1
+8 1494 1
+8 1495 1
+8 1501 1
+8 1502 1
+8 1503 1
+8 1504 1
+8 1505 1
+8 1507 1
+8 1508 1
+8 1509 1
+8 1510 1
+8 1511 1
+8 1522 1
+8 1523 1
+8 1524 1
+8 1525 1
+8 1526 1
+8 1527 1
+8 1528 1
+8 1529 1
+8 1530 1
+8 1531 1
+8 1542 1
+8 1543 1
+8 1544 1
+8 1545 1
+8 1546 1
+8 1547 1
+8 1548 1
+8 1549 1
+8 1550 1
+8 1551 1
+8 1562 1
+8 1563 1
+8 1564 1
+8 1565 1
+8 1566 1
+8 1567 1
+8 1568 1
+8 1569 1
+8 1570 1
+8 1571 1
+8 1577 1
+8 1578 1
+8 1579 1
+8 1580 1
+8 1581 1
+8 1582 1
+8 1583 1
+8 1584 1
+8 1585 1
+8 1586 1
+8 1597 1
+8 1598 1
+8 1599 1
+8 1600 1
+8 1601 1
+8 1602 1
+8 1603 1
+8 1604 1
+8 1605 1
+8 1606 1
+8 1612 1
+8 1613 1
+8 1614 1
+8 1615 1
+8 1616 1
+8 1617 1
+8 1618 1
+8 1619 1
+8 1620 1
+8 1621 1
+8 1627 1
+8 1628 1
+8 1629 1
+8 1630 1
+8 1631 1
+8 1633 1
+8 1634 1
+8 1635 1
+8 1636 1
+8 1637 1
+8 1638 1
+8 1639 1
+8 1640 1
+8 1641 1
+8 1642 1
+8 1653 1
+8 1654 1
+8 1655 1
+8 1656 1
+8 1657 1
+8 1658 1
+8 1659 1
+8 1660 1
+8 1661 1
+8 1662 1
+8 1668 1
+8 1669 1
+8 1670 1
+8 1671 1
+8 1672 1
+8 1673 1
+8 1674 1
+8 1675 1
+8 1676 1
+8 1677 1
+8 1683 1
+8 1684 1
+8 1685 1
+8 1686 1
+8 1687 1
+8 1689 1
+8 1690 1
+8 1691 1
+8 1692 1
+8 1693 1
+8 1694 1
+8 1695 1
+8 1696 1
+8 1697 1
+8 1698 1
+8 1704 1
+8 1705 1
+8 1706 1
+8 1707 1
+8 1708 1
+8 1710 1
+8 1711 1
+8 1712 1
+8 1713 1
+8 1714 1
+8 1716 1
+9 4 1
+9 11 1
+9 17 1
+9 22 1
+9 27 1
+9 28 1
+9 29 1
+9 30 1
+9 39 1
+9 45 1
+9 50 1
+9 55 1
+9 56 1
+9 57 1
+9 58 1
+9 66 1
+9 71 1
+9 76 1
+9 77 1
+9 78 1
+9 79 1
+9 86 1
+9 91 1
+9 92 1
+9 93 1
+9 94 1
+9 101 1
+9 102 1
+9 103 1
+9 104 1
+9 111 1
+9 112 1
+9 113 1
+9 114 1
+9 115 1
+9 116 1
+9 123 1
+9 129 1
+9 134 1
+9 139 1
+9 140 1
+9 141 1
+9 142 1
+9 150 1
+9 155 1
+9 160 1
+9 161 1
+9 162 1
+9 163 1
+9 170 1
+9 175 1
+9 176 1
+9 177 1
+9 178 1
+9 185 1
+9 186 1
+9 187 1
+9 188 1
+9 195 1
+9 196 1
+9 197 1
+9 198 1
+9 199 1
+9 200 1
+9 206 1
+9 211 1
+9 216 1
+9 217 1
+9 218 1
+9 219 1
+9 226 1
+9 231 1
+9 232 1
+9 233 1
+9 234 1
+9 241 1
+9 242 1
+9 243 1
+9 244 1
+9 251 1
+9 252 1
+9 253 1
+9 254 1
+9 255 1
+9 256 1
+9 261 1
+9 266 1
+9 267 1
+9 268 1
+9 269 1
+9 276 1
+9 277 1
+9 278 1
+9 279 1
+9 286 1
+9 287 1
+9 288 1
+9 289 1
+9 290 1
+9 291 1
+9 296 1
+9 297 1
+9 298 1
+9 299 1
+9 306 1
+9 307 1
+9 308 1
+9 309 1
+9 310 1
+9 311 1
+9 316 1
+9 317 1
+9 318 1
+9 319 1
+9 320 1
+9 321 1
+9 326 1
+9 327 1
+9 328 1
+9 329 1
+9 333 1
+9 339 1
+9 344 1
+9 349 1
+9 350 1
+9 351 1
+9 352 1
+9 360 1
+9 365 1
+9 370 1
+9 371 1
+9 372 1
+9 373 1
+9 380 1
+9 385 1
+9 386 1
+9 387 1
+9 388 1
+9 395 1
+9 396 1
+9 397 1
+9 398 1
+9 405 1
+9 406 1
+9 407 1
+9 408 1
+9 409 1
+9 410 1
+9 416 1
+9 421 1
+9 426 1
+9 427 1
+9 428 1
+9 429 1
+9 436 1
+9 441 1
+9 442 1
+9 443 1
+9 444 1
+9 451 1
+9 452 1
+9 453 1
+9 454 1
+9 461 1
+9 462 1
+9 463 1
+9 464 1
+9 465 1
+9 466 1
+9 471 1
+9 476 1
+9 477 1
+9 478 1
+9 479 1
+9 486 1
+9 487 1
+9 488 1
+9 489 1
+9 496 1
+9 497 1
+9 498 1
+9 499 1
+9 500 1
+9 501 1
+9 506 1
+9 507 1
+9 508 1
+9 509 1
+9 516 1
+9 517 1
+9 518 1
+9 519 1
+9 520 1
+9 521 1
+9 526 1
+9 527 1
+9 528 1
+9 529 1
+9 530 1
+9 531 1
+9 536 1
+9 537 1
+9 538 1
+9 539 1
+9 542 1
+9 547 1
+9 552 1
+9 553 1
+9 554 1
+9 555 1
+9 562 1
+9 567 1
+9 568 1
+9 569 1
+9 570 1
+9 577 1
+9 578 1
+9 579 1
+9 580 1
+9 587 1
+9 588 1
+9 589 1
+9 590 1
+9 591 1
+9 592 1
+9 597 1
+9 602 1
+9 603 1
+9 604 1
+9 605 1
+9 612 1
+9 613 1
+9 614 1
+9 615 1
+9 622 1
+9 623 1
+9 624 1
+9 625 1
+9 626 1
+9 627 1
+9 632 1
+9 633 1
+9 634 1
+9 635 1
+9 642 1
+9 643 1
+9 644 1
+9 645 1
+9 646 1
+9 647 1
+9 652 1
+9 653 1
+9 654 1
+9 655 1
+9 656 1
+9 657 1
+9 662 1
+9 663 1
+9 664 1
+9 665 1
+9 667 1
+9 672 1
+9 673 1
+9 674 1
+9 675 1
+9 682 1
+9 683 1
+9 684 1
+9 685 1
+9 692 1
+9 693 1
+9 694 1
+9 695 1
+9 696 1
+9 697 1
+9 702 1
+9 703 1
+9 704 1
+9 705 1
+9 712 1
+9 713 1
+9 714 1
+9 715 1
+9 716 1
+9 717 1
+9 722 1
+9 723 1
+9 724 1
+9 725 1
+9 726 1
+9 727 1
+9 732 1
+9 733 1
+9 734 1
+9 735 1
+9 737 1
+9 738 1
+9 739 1
+9 740 1
+9 747 1
+9 748 1
+9 749 1
+9 750 1
+9 751 1
+9 752 1
+9 757 1
+9 758 1
+9 759 1
+9 760 1
+9 761 1
+9 762 1
+9 767 1
+9 768 1
+9 769 1
+9 770 1
+9 772 1
+9 773 1
+9 774 1
+9 775 1
+9 776 1
+9 777 1
+9 782 1
+9 783 1
+9 784 1
+9 785 1
+9 787 1
+9 788 1
+9 789 1
+9 790 1
+9 792 1
+9 795 1
+9 801 1
+9 806 1
+9 811 1
+9 812 1
+9 813 1
+9 814 1
+9 822 1
+9 827 1
+9 832 1
+9 833 1
+9 834 1
+9 835 1
+9 842 1
+9 847 1
+9 848 1
+9 849 1
+9 850 1
+9 857 1
+9 858 1
+9 859 1
+9 860 1
+9 867 1
+9 868 1
+9 869 1
+9 870 1
+9 871 1
+9 872 1
+9 878 1
+9 883 1
+9 888 1
+9 889 1
+9 890 1
+9 891 1
+9 898 1
+9 903 1
+9 904 1
+9 905 1
+9 906 1
+9 913 1
+9 914 1
+9 915 1
+9 916 1
+9 923 1
+9 924 1
+9 925 1
+9 926 1
+9 927 1
+9 928 1
+9 933 1
+9 938 1
+9 939 1
+9 940 1
+9 941 1
+9 948 1
+9 949 1
+9 950 1
+9 951 1
+9 958 1
+9 959 1
+9 960 1
+9 961 1
+9 962 1
+9 963 1
+9 968 1
+9 969 1
+9 970 1
+9 971 1
+9 978 1
+9 979 1
+9 980 1
+9 981 1
+9 982 1
+9 983 1
+9 988 1
+9 989 1
+9 990 1
+9 991 1
+9 992 1
+9 993 1
+9 998 1
+9 999 1
+9 1000 1
+9 1001 1
+9 1004 1
+9 1009 1
+9 1014 1
+9 1015 1
+9 1016 1
+9 1017 1
+9 1024 1
+9 1029 1
+9 1030 1
+9 1031 1
+9 1032 1
+9 1039 1
+9 1040 1
+9 1041 1
+9 1042 1
+9 1049 1
+9 1050 1
+9 1051 1
+9 1052 1
+9 1053 1
+9 1054 1
+9 1059 1
+9 1064 1
+9 1065 1
+9 1066 1
+9 1067 1
+9 1074 1
+9 1075 1
+9 1076 1
+9 1077 1
+9 1084 1
+9 1085 1
+9 1086 1
+9 1087 1
+9 1088 1
+9 1089 1
+9 1094 1
+9 1095 1
+9 1096 1
+9 1097 1
+9 1104 1
+9 1105 1
+9 1106 1
+9 1107 1
+9 1108 1
+9 1109 1
+9 1114 1
+9 1115 1
+9 1116 1
+9 1117 1
+9 1118 1
+9 1119 1
+9 1124 1
+9 1125 1
+9 1126 1
+9 1127 1
+9 1129 1
+9 1134 1
+9 1135 1
+9 1136 1
+9 1137 1
+9 1144 1
+9 1145 1
+9 1146 1
+9 1147 1
+9 1154 1
+9 1155 1
+9 1156 1
+9 1157 1
+9 1158 1
+9 1159 1
+9 1164 1
+9 1165 1
+9 1166 1
+9 1167 1
+9 1174 1
+9 1175 1
+9 1176 1
+9 1177 1
+9 1178 1
+9 1179 1
+9 1184 1
+9 1185 1
+9 1186 1
+9 1187 1
+9 1188 1
+9 1189 1
+9 1194 1
+9 1195 1
+9 1196 1
+9 1197 1
+9 1199 1
+9 1200 1
+9 1201 1
+9 1202 1
+9 1209 1
+9 1210 1
+9 1211 1
+9 1212 1
+9 1213 1
+9 1214 1
+9 1219 1
+9 1220 1
+9 1221 1
+9 1222 1
+9 1223 1
+9 1224 1
+9 1229 1
+9 1230 1
+9 1231 1
+9 1232 1
+9 1234 1
+9 1235 1
+9 1236 1
+9 1237 1
+9 1238 1
+9 1239 1
+9 1244 1
+9 1245 1
+9 1246 1
+9 1247 1
+9 1249 1
+9 1250 1
+9 1251 1
+9 1252 1
+9 1254 1
+9 1256 1
+9 1261 1
+9 1266 1
+9 1267 1
+9 1268 1
+9 1269 1
+9 1276 1
+9 1281 1
+9 1282 1
+9 1283 1
+9 1284 1
+9 1291 1
+9 1292 1
+9 1293 1
+9 1294 1
+9 1301 1
+9 1302 1
+9 1303 1
+9 1304 1
+9 1305 1
+9 1306 1
+9 1311 1
+9 1316 1
+9 1317 1
+9 1318 1
+9 1319 1
+9 1326 1
+9 1327 1
+9 1328 1
+9 1329 1
+9 1336 1
+9 1337 1
+9 1338 1
+9 1339 1
+9 1340 1
+9 1341 1
+9 1346 1
+9 1347 1
+9 1348 1
+9 1349 1
+9 1356 1
+9 1357 1
+9 1358 1
+9 1359 1
+9 1360 1
+9 1361 1
+9 1366 1
+9 1367 1
+9 1368 1
+9 1369 1
+9 1370 1
+9 1371 1
+9 1376 1
+9 1377 1
+9 1378 1
+9 1379 1
+9 1381 1
+9 1386 1
+9 1387 1
+9 1388 1
+9 1389 1
+9 1396 1
+9 1397 1
+9 1398 1
+9 1399 1
+9 1406 1
+9 1407 1
+9 1408 1
+9 1409 1
+9 1410 1
+9 1411 1
+9 1416 1
+9 1417 1
+9 1418 1
+9 1419 1
+9 1426 1
+9 1427 1
+9 1428 1
+9 1429 1
+9 1430 1
+9 1431 1
+9 1436 1
+9 1437 1
+9 1438 1
+9 1439 1
+9 1440 1
+9 1441 1
+9 1446 1
+9 1447 1
+9 1448 1
+9 1449 1
+9 1451 1
+9 1452 1
+9 1453 1
+9 1454 1
+9 1461 1
+9 1462 1
+9 1463 1
+9 1464 1
+9 1465 1
+9 1466 1
+9 1471 1
+9 1472 1
+9 1473 1
+9 1474 1
+9 1475 1
+9 1476 1
+9 1481 1
+9 1482 1
+9 1483 1
+9 1484 1
+9 1486 1
+9 1487 1
+9 1488 1
+9 1489 1
+9 1490 1
+9 1491 1
+9 1496 1
+9 1497 1
+9 1498 1
+9 1499 1
+9 1501 1
+9 1502 1
+9 1503 1
+9 1504 1
+9 1506 1
+9 1507 1
+9 1512 1
+9 1513 1
+9 1514 1
+9 1515 1
+9 1522 1
+9 1523 1
+9 1524 1
+9 1525 1
+9 1532 1
+9 1533 1
+9 1534 1
+9 1535 1
+9 1536 1
+9 1537 1
+9 1542 1
+9 1543 1
+9 1544 1
+9 1545 1
+9 1552 1
+9 1553 1
+9 1554 1
+9 1555 1
+9 1556 1
+9 1557 1
+9 1562 1
+9 1563 1
+9 1564 1
+9 1565 1
+9 1566 1
+9 1567 1
+9 1572 1
+9 1573 1
+9 1574 1
+9 1575 1
+9 1577 1
+9 1578 1
+9 1579 1
+9 1580 1
+9 1587 1
+9 1588 1
+9 1589 1
+9 1590 1
+9 1591 1
+9 1592 1
+9 1597 1
+9 1598 1
+9 1599 1
+9 1600 1
+9 1601 1
+9 1602 1
+9 1607 1
+9 1608 1
+9 1609 1
+9 1610 1
+9 1612 1
+9 1613 1
+9 1614 1
+9 1615 1
+9 1616 1
+9 1617 1
+9 1622 1
+9 1623 1
+9 1624 1
+9 1625 1
+9 1627 1
+9 1628 1
+9 1629 1
+9 1630 1
+9 1632 1
+9 1633 1
+9 1634 1
+9 1635 1
+9 1636 1
+9 1643 1
+9 1644 1
+9 1645 1
+9 1646 1
+9 1647 1
+9 1648 1
+9 1653 1
+9 1654 1
+9 1655 1
+9 1656 1
+9 1657 1
+9 1658 1
+9 1663 1
+9 1664 1
+9 1665 1
+9 1666 1
+9 1668 1
+9 1669 1
+9 1670 1
+9 1671 1
+9 1672 1
+9 1673 1
+9 1678 1
+9 1679 1
+9 1680 1
+9 1681 1
+9 1683 1
+9 1684 1
+9 1685 1
+9 1686 1
+9 1688 1
+9 1689 1
+9 1690 1
+9 1691 1
+9 1692 1
+9 1693 1
+9 1694 1
+9 1699 1
+9 1700 1
+9 1701 1
+9 1702 1
+9 1704 1
+9 1705 1
+9 1706 1
+9 1707 1
+9 1709 1
+9 1710 1
+9 1711 1
+9 1712 1
+9 1713 1
+9 1715 1
+9 1716 1
+10 5 1
+10 12 1
+10 18 1
+10 23 1
+10 27 1
+10 31 1
+10 32 1
+10 33 1
+10 40 1
+10 46 1
+10 51 1
+10 55 1
+10 59 1
+10 60 1
+10 61 1
+10 67 1
+10 72 1
+10 76 1
+10 80 1
+10 81 1
+10 82 1
+10 87 1
+10 91 1
+10 95 1
+10 96 1
+10 97 1
+10 101 1
+10 105 1
+10 106 1
+10 107 1
+10 111 1
+10 112 1
+10 113 1
+10 117 1
+10 118 1
+10 119 1
+10 124 1
+10 130 1
+10 135 1
+10 139 1
+10 143 1
+10 144 1
+10 145 1
+10 151 1
+10 156 1
+10 160 1
+10 164 1
+10 165 1
+10 166 1
+10 171 1
+10 175 1
+10 179 1
+10 180 1
+10 181 1
+10 185 1
+10 189 1
+10 190 1
+10 191 1
+10 195 1
+10 196 1
+10 197 1
+10 201 1
+10 202 1
+10 203 1
+10 207 1
+10 212 1
+10 216 1
+10 220 1
+10 221 1
+10 222 1
+10 227 1
+10 231 1
+10 235 1
+10 236 1
+10 237 1
+10 241 1
+10 245 1
+10 246 1
+10 247 1
+10 251 1
+10 252 1
+10 253 1
+10 257 1
+10 258 1
+10 259 1
+10 262 1
+10 266 1
+10 270 1
+10 271 1
+10 272 1
+10 276 1
+10 280 1
+10 281 1
+10 282 1
+10 286 1
+10 287 1
+10 288 1
+10 292 1
+10 293 1
+10 294 1
+10 296 1
+10 300 1
+10 301 1
+10 302 1
+10 306 1
+10 307 1
+10 308 1
+10 312 1
+10 313 1
+10 314 1
+10 316 1
+10 317 1
+10 318 1
+10 322 1
+10 323 1
+10 324 1
+10 326 1
+10 327 1
+10 328 1
+10 330 1
+10 334 1
+10 340 1
+10 345 1
+10 349 1
+10 353 1
+10 354 1
+10 355 1
+10 361 1
+10 366 1
+10 370 1
+10 374 1
+10 375 1
+10 376 1
+10 381 1
+10 385 1
+10 389 1
+10 390 1
+10 391 1
+10 395 1
+10 399 1
+10 400 1
+10 401 1
+10 405 1
+10 406 1
+10 407 1
+10 411 1
+10 412 1
+10 413 1
+10 417 1
+10 422 1
+10 426 1
+10 430 1
+10 431 1
+10 432 1
+10 437 1
+10 441 1
+10 445 1
+10 446 1
+10 447 1
+10 451 1
+10 455 1
+10 456 1
+10 457 1
+10 461 1
+10 462 1
+10 463 1
+10 467 1
+10 468 1
+10 469 1
+10 472 1
+10 476 1
+10 480 1
+10 481 1
+10 482 1
+10 486 1
+10 490 1
+10 491 1
+10 492 1
+10 496 1
+10 497 1
+10 498 1
+10 502 1
+10 503 1
+10 504 1
+10 506 1
+10 510 1
+10 511 1
+10 512 1
+10 516 1
+10 517 1
+10 518 1
+10 522 1
+10 523 1
+10 524 1
+10 526 1
+10 527 1
+10 528 1
+10 532 1
+10 533 1
+10 534 1
+10 536 1
+10 537 1
+10 538 1
+10 540 1
+10 543 1
+10 548 1
+10 552 1
+10 556 1
+10 557 1
+10 558 1
+10 563 1
+10 567 1
+10 571 1
+10 572 1
+10 573 1
+10 577 1
+10 581 1
+10 582 1
+10 583 1
+10 587 1
+10 588 1
+10 589 1
+10 593 1
+10 594 1
+10 595 1
+10 598 1
+10 602 1
+10 606 1
+10 607 1
+10 608 1
+10 612 1
+10 616 1
+10 617 1
+10 618 1
+10 622 1
+10 623 1
+10 624 1
+10 628 1
+10 629 1
+10 630 1
+10 632 1
+10 636 1
+10 637 1
+10 638 1
+10 642 1
+10 643 1
+10 644 1
+10 648 1
+10 649 1
+10 650 1
+10 652 1
+10 653 1
+10 654 1
+10 658 1
+10 659 1
+10 660 1
+10 662 1
+10 663 1
+10 664 1
+10 666 1
+10 668 1
+10 672 1
+10 676 1
+10 677 1
+10 678 1
+10 682 1
+10 686 1
+10 687 1
+10 688 1
+10 692 1
+10 693 1
+10 694 1
+10 698 1
+10 699 1
+10 700 1
+10 702 1
+10 706 1
+10 707 1
+10 708 1
+10 712 1
+10 713 1
+10 714 1
+10 718 1
+10 719 1
+10 720 1
+10 722 1
+10 723 1
+10 724 1
+10 728 1
+10 729 1
+10 730 1
+10 732 1
+10 733 1
+10 734 1
+10 736 1
+10 737 1
+10 741 1
+10 742 1
+10 743 1
+10 747 1
+10 748 1
+10 749 1
+10 753 1
+10 754 1
+10 755 1
+10 757 1
+10 758 1
+10 759 1
+10 763 1
+10 764 1
+10 765 1
+10 767 1
+10 768 1
+10 769 1
+10 771 1
+10 772 1
+10 773 1
+10 774 1
+10 778 1
+10 779 1
+10 780 1
+10 782 1
+10 783 1
+10 784 1
+10 786 1
+10 787 1
+10 788 1
+10 789 1
+10 791 1
+10 792 1
+10 796 1
+10 802 1
+10 807 1
+10 811 1
+10 815 1
+10 816 1
+10 817 1
+10 823 1
+10 828 1
+10 832 1
+10 836 1
+10 837 1
+10 838 1
+10 843 1
+10 847 1
+10 851 1
+10 852 1
+10 853 1
+10 857 1
+10 861 1
+10 862 1
+10 863 1
+10 867 1
+10 868 1
+10 869 1
+10 873 1
+10 874 1
+10 875 1
+10 879 1
+10 884 1
+10 888 1
+10 892 1
+10 893 1
+10 894 1
+10 899 1
+10 903 1
+10 907 1
+10 908 1
+10 909 1
+10 913 1
+10 917 1
+10 918 1
+10 919 1
+10 923 1
+10 924 1
+10 925 1
+10 929 1
+10 930 1
+10 931 1
+10 934 1
+10 938 1
+10 942 1
+10 943 1
+10 944 1
+10 948 1
+10 952 1
+10 953 1
+10 954 1
+10 958 1
+10 959 1
+10 960 1
+10 964 1
+10 965 1
+10 966 1
+10 968 1
+10 972 1
+10 973 1
+10 974 1
+10 978 1
+10 979 1
+10 980 1
+10 984 1
+10 985 1
+10 986 1
+10 988 1
+10 989 1
+10 990 1
+10 994 1
+10 995 1
+10 996 1
+10 998 1
+10 999 1
+10 1000 1
+10 1002 1
+10 1005 1
+10 1010 1
+10 1014 1
+10 1018 1
+10 1019 1
+10 1020 1
+10 1025 1
+10 1029 1
+10 1033 1
+10 1034 1
+10 1035 1
+10 1039 1
+10 1043 1
+10 1044 1
+10 1045 1
+10 1049 1
+10 1050 1
+10 1051 1
+10 1055 1
+10 1056 1
+10 1057 1
+10 1060 1
+10 1064 1
+10 1068 1
+10 1069 1
+10 1070 1
+10 1074 1
+10 1078 1
+10 1079 1
+10 1080 1
+10 1084 1
+10 1085 1
+10 1086 1
+10 1090 1
+10 1091 1
+10 1092 1
+10 1094 1
+10 1098 1
+10 1099 1
+10 1100 1
+10 1104 1
+10 1105 1
+10 1106 1
+10 1110 1
+10 1111 1
+10 1112 1
+10 1114 1
+10 1115 1
+10 1116 1
+10 1120 1
+10 1121 1
+10 1122 1
+10 1124 1
+10 1125 1
+10 1126 1
+10 1128 1
+10 1130 1
+10 1134 1
+10 1138 1
+10 1139 1
+10 1140 1
+10 1144 1
+10 1148 1
+10 1149 1
+10 1150 1
+10 1154 1
+10 1155 1
+10 1156 1
+10 1160 1
+10 1161 1
+10 1162 1
+10 1164 1
+10 1168 1
+10 1169 1
+10 1170 1
+10 1174 1
+10 1175 1
+10 1176 1
+10 1180 1
+10 1181 1
+10 1182 1
+10 1184 1
+10 1185 1
+10 1186 1
+10 1190 1
+10 1191 1
+10 1192 1
+10 1194 1
+10 1195 1
+10 1196 1
+10 1198 1
+10 1199 1
+10 1203 1
+10 1204 1
+10 1205 1
+10 1209 1
+10 1210 1
+10 1211 1
+10 1215 1
+10 1216 1
+10 1217 1
+10 1219 1
+10 1220 1
+10 1221 1
+10 1225 1
+10 1226 1
+10 1227 1
+10 1229 1
+10 1230 1
+10 1231 1
+10 1233 1
+10 1234 1
+10 1235 1
+10 1236 1
+10 1240 1
+10 1241 1
+10 1242 1
+10 1244 1
+10 1245 1
+10 1246 1
+10 1248 1
+10 1249 1
+10 1250 1
+10 1251 1
+10 1253 1
+10 1254 1
+10 1257 1
+10 1262 1
+10 1266 1
+10 1270 1
+10 1271 1
+10 1272 1
+10 1277 1
+10 1281 1
+10 1285 1
+10 1286 1
+10 1287 1
+10 1291 1
+10 1295 1
+10 1296 1
+10 1297 1
+10 1301 1
+10 1302 1
+10 1303 1
+10 1307 1
+10 1308 1
+10 1309 1
+10 1312 1
+10 1316 1
+10 1320 1
+10 1321 1
+10 1322 1
+10 1326 1
+10 1330 1
+10 1331 1
+10 1332 1
+10 1336 1
+10 1337 1
+10 1338 1
+10 1342 1
+10 1343 1
+10 1344 1
+10 1346 1
+10 1350 1
+10 1351 1
+10 1352 1
+10 1356 1
+10 1357 1
+10 1358 1
+10 1362 1
+10 1363 1
+10 1364 1
+10 1366 1
+10 1367 1
+10 1368 1
+10 1372 1
+10 1373 1
+10 1374 1
+10 1376 1
+10 1377 1
+10 1378 1
+10 1380 1
+10 1382 1
+10 1386 1
+10 1390 1
+10 1391 1
+10 1392 1
+10 1396 1
+10 1400 1
+10 1401 1
+10 1402 1
+10 1406 1
+10 1407 1
+10 1408 1
+10 1412 1
+10 1413 1
+10 1414 1
+10 1416 1
+10 1420 1
+10 1421 1
+10 1422 1
+10 1426 1
+10 1427 1
+10 1428 1
+10 1432 1
+10 1433 1
+10 1434 1
+10 1436 1
+10 1437 1
+10 1438 1
+10 1442 1
+10 1443 1
+10 1444 1
+10 1446 1
+10 1447 1
+10 1448 1
+10 1450 1
+10 1451 1
+10 1455 1
+10 1456 1
+10 1457 1
+10 1461 1
+10 1462 1
+10 1463 1
+10 1467 1
+10 1468 1
+10 1469 1
+10 1471 1
+10 1472 1
+10 1473 1
+10 1477 1
+10 1478 1
+10 1479 1
+10 1481 1
+10 1482 1
+10 1483 1
+10 1485 1
+10 1486 1
+10 1487 1
+10 1488 1
+10 1492 1
+10 1493 1
+10 1494 1
+10 1496 1
+10 1497 1
+10 1498 1
+10 1500 1
+10 1501 1
+10 1502 1
+10 1503 1
+10 1505 1
+10 1506 1
+10 1508 1
+10 1512 1
+10 1516 1
+10 1517 1
+10 1518 1
+10 1522 1
+10 1526 1
+10 1527 1
+10 1528 1
+10 1532 1
+10 1533 1
+10 1534 1
+10 1538 1
+10 1539 1
+10 1540 1
+10 1542 1
+10 1546 1
+10 1547 1
+10 1548 1
+10 1552 1
+10 1553 1
+10 1554 1
+10 1558 1
+10 1559 1
+10 1560 1
+10 1562 1
+10 1563 1
+10 1564 1
+10 1568 1
+10 1569 1
+10 1570 1
+10 1572 1
+10 1573 1
+10 1574 1
+10 1576 1
+10 1577 1
+10 1581 1
+10 1582 1
+10 1583 1
+10 1587 1
+10 1588 1
+10 1589 1
+10 1593 1
+10 1594 1
+10 1595 1
+10 1597 1
+10 1598 1
+10 1599 1
+10 1603 1
+10 1604 1
+10 1605 1
+10 1607 1
+10 1608 1
+10 1609 1
+10 1611 1
+10 1612 1
+10 1613 1
+10 1614 1
+10 1618 1
+10 1619 1
+10 1620 1
+10 1622 1
+10 1623 1
+10 1624 1
+10 1626 1
+10 1627 1
+10 1628 1
+10 1629 1
+10 1631 1
+10 1632 1
+10 1633 1
+10 1637 1
+10 1638 1
+10 1639 1
+10 1643 1
+10 1644 1
+10 1645 1
+10 1649 1
+10 1650 1
+10 1651 1
+10 1653 1
+10 1654 1
+10 1655 1
+10 1659 1
+10 1660 1
+10 1661 1
+10 1663 1
+10 1664 1
+10 1665 1
+10 1667 1
+10 1668 1
+10 1669 1
+10 1670 1
+10 1674 1
+10 1675 1
+10 1676 1
+10 1678 1
+10 1679 1
+10 1680 1
+10 1682 1
+10 1683 1
+10 1684 1
+10 1685 1
+10 1687 1
+10 1688 1
+10 1689 1
+10 1690 1
+10 1691 1
+10 1695 1
+10 1696 1
+10 1697 1
+10 1699 1
+10 1700 1
+10 1701 1
+10 1703 1
+10 1704 1
+10 1705 1
+10 1706 1
+10 1708 1
+10 1709 1
+10 1710 1
+10 1711 1
+10 1712 1
+10 1714 1
+10 1715 1
+10 1716 1
+11 6 1
+11 13 1
+11 19 1
+11 24 1
+11 28 1
+11 31 1
+11 34 1
+11 35 1
+11 41 1
+11 47 1
+11 52 1
+11 56 1
+11 59 1
+11 62 1
+11 63 1
+11 68 1
+11 73 1
+11 77 1
+11 80 1
+11 83 1
+11 84 1
+11 88 1
+11 92 1
+11 95 1
+11 98 1
+11 99 1
+11 102 1
+11 105 1
+11 108 1
+11 109 1
+11 111 1
+11 114 1
+11 115 1
+11 117 1
+11 118 1
+11 120 1
+11 125 1
+11 131 1
+11 136 1
+11 140 1
+11 143 1
+11 146 1
+11 147 1
+11 152 1
+11 157 1
+11 161 1
+11 164 1
+11 167 1
+11 168 1
+11 172 1
+11 176 1
+11 179 1
+11 182 1
+11 183 1
+11 186 1
+11 189 1
+11 192 1
+11 193 1
+11 195 1
+11 198 1
+11 199 1
+11 201 1
+11 202 1
+11 204 1
+11 208 1
+11 213 1
+11 217 1
+11 220 1
+11 223 1
+11 224 1
+11 228 1
+11 232 1
+11 235 1
+11 238 1
+11 239 1
+11 242 1
+11 245 1
+11 248 1
+11 249 1
+11 251 1
+11 254 1
+11 255 1
+11 257 1
+11 258 1
+11 260 1
+11 263 1
+11 267 1
+11 270 1
+11 273 1
+11 274 1
+11 277 1
+11 280 1
+11 283 1
+11 284 1
+11 286 1
+11 289 1
+11 290 1
+11 292 1
+11 293 1
+11 295 1
+11 297 1
+11 300 1
+11 303 1
+11 304 1
+11 306 1
+11 309 1
+11 310 1
+11 312 1
+11 313 1
+11 315 1
+11 316 1
+11 319 1
+11 320 1
+11 322 1
+11 323 1
+11 325 1
+11 326 1
+11 327 1
+11 329 1
+11 330 1
+11 335 1
+11 341 1
+11 346 1
+11 350 1
+11 353 1
+11 356 1
+11 357 1
+11 362 1
+11 367 1
+11 371 1
+11 374 1
+11 377 1
+11 378 1
+11 382 1
+11 386 1
+11 389 1
+11 392 1
+11 393 1
+11 396 1
+11 399 1
+11 402 1
+11 403 1
+11 405 1
+11 408 1
+11 409 1
+11 411 1
+11 412 1
+11 414 1
+11 418 1
+11 423 1
+11 427 1
+11 430 1
+11 433 1
+11 434 1
+11 438 1
+11 442 1
+11 445 1
+11 448 1
+11 449 1
+11 452 1
+11 455 1
+11 458 1
+11 459 1
+11 461 1
+11 464 1
+11 465 1
+11 467 1
+11 468 1
+11 470 1
+11 473 1
+11 477 1
+11 480 1
+11 483 1
+11 484 1
+11 487 1
+11 490 1
+11 493 1
+11 494 1
+11 496 1
+11 499 1
+11 500 1
+11 502 1
+11 503 1
+11 505 1
+11 507 1
+11 510 1
+11 513 1
+11 514 1
+11 516 1
+11 519 1
+11 520 1
+11 522 1
+11 523 1
+11 525 1
+11 526 1
+11 529 1
+11 530 1
+11 532 1
+11 533 1
+11 535 1
+11 536 1
+11 537 1
+11 539 1
+11 540 1
+11 544 1
+11 549 1
+11 553 1
+11 556 1
+11 559 1
+11 560 1
+11 564 1
+11 568 1
+11 571 1
+11 574 1
+11 575 1
+11 578 1
+11 581 1
+11 584 1
+11 585 1
+11 587 1
+11 590 1
+11 591 1
+11 593 1
+11 594 1
+11 596 1
+11 599 1
+11 603 1
+11 606 1
+11 609 1
+11 610 1
+11 613 1
+11 616 1
+11 619 1
+11 620 1
+11 622 1
+11 625 1
+11 626 1
+11 628 1
+11 629 1
+11 631 1
+11 633 1
+11 636 1
+11 639 1
+11 640 1
+11 642 1
+11 645 1
+11 646 1
+11 648 1
+11 649 1
+11 651 1
+11 652 1
+11 655 1
+11 656 1
+11 658 1
+11 659 1
+11 661 1
+11 662 1
+11 663 1
+11 665 1
+11 666 1
+11 669 1
+11 673 1
+11 676 1
+11 679 1
+11 680 1
+11 683 1
+11 686 1
+11 689 1
+11 690 1
+11 692 1
+11 695 1
+11 696 1
+11 698 1
+11 699 1
+11 701 1
+11 703 1
+11 706 1
+11 709 1
+11 710 1
+11 712 1
+11 715 1
+11 716 1
+11 718 1
+11 719 1
+11 721 1
+11 722 1
+11 725 1
+11 726 1
+11 728 1
+11 729 1
+11 731 1
+11 732 1
+11 733 1
+11 735 1
+11 736 1
+11 738 1
+11 741 1
+11 744 1
+11 745 1
+11 747 1
+11 750 1
+11 751 1
+11 753 1
+11 754 1
+11 756 1
+11 757 1
+11 760 1
+11 761 1
+11 763 1
+11 764 1
+11 766 1
+11 767 1
+11 768 1
+11 770 1
+11 771 1
+11 772 1
+11 775 1
+11 776 1
+11 778 1
+11 779 1
+11 781 1
+11 782 1
+11 783 1
+11 785 1
+11 786 1
+11 787 1
+11 788 1
+11 790 1
+11 791 1
+11 792 1
+11 797 1
+11 803 1
+11 808 1
+11 812 1
+11 815 1
+11 818 1
+11 819 1
+11 824 1
+11 829 1
+11 833 1
+11 836 1
+11 839 1
+11 840 1
+11 844 1
+11 848 1
+11 851 1
+11 854 1
+11 855 1
+11 858 1
+11 861 1
+11 864 1
+11 865 1
+11 867 1
+11 870 1
+11 871 1
+11 873 1
+11 874 1
+11 876 1
+11 880 1
+11 885 1
+11 889 1
+11 892 1
+11 895 1
+11 896 1
+11 900 1
+11 904 1
+11 907 1
+11 910 1
+11 911 1
+11 914 1
+11 917 1
+11 920 1
+11 921 1
+11 923 1
+11 926 1
+11 927 1
+11 929 1
+11 930 1
+11 932 1
+11 935 1
+11 939 1
+11 942 1
+11 945 1
+11 946 1
+11 949 1
+11 952 1
+11 955 1
+11 956 1
+11 958 1
+11 961 1
+11 962 1
+11 964 1
+11 965 1
+11 967 1
+11 969 1
+11 972 1
+11 975 1
+11 976 1
+11 978 1
+11 981 1
+11 982 1
+11 984 1
+11 985 1
+11 987 1
+11 988 1
+11 991 1
+11 992 1
+11 994 1
+11 995 1
+11 997 1
+11 998 1
+11 999 1
+11 1001 1
+11 1002 1
+11 1006 1
+11 1011 1
+11 1015 1
+11 1018 1
+11 1021 1
+11 1022 1
+11 1026 1
+11 1030 1
+11 1033 1
+11 1036 1
+11 1037 1
+11 1040 1
+11 1043 1
+11 1046 1
+11 1047 1
+11 1049 1
+11 1052 1
+11 1053 1
+11 1055 1
+11 1056 1
+11 1058 1
+11 1061 1
+11 1065 1
+11 1068 1
+11 1071 1
+11 1072 1
+11 1075 1
+11 1078 1
+11 1081 1
+11 1082 1
+11 1084 1
+11 1087 1
+11 1088 1
+11 1090 1
+11 1091 1
+11 1093 1
+11 1095 1
+11 1098 1
+11 1101 1
+11 1102 1
+11 1104 1
+11 1107 1
+11 1108 1
+11 1110 1
+11 1111 1
+11 1113 1
+11 1114 1
+11 1117 1
+11 1118 1
+11 1120 1
+11 1121 1
+11 1123 1
+11 1124 1
+11 1125 1
+11 1127 1
+11 1128 1
+11 1131 1
+11 1135 1
+11 1138 1
+11 1141 1
+11 1142 1
+11 1145 1
+11 1148 1
+11 1151 1
+11 1152 1
+11 1154 1
+11 1157 1
+11 1158 1
+11 1160 1
+11 1161 1
+11 1163 1
+11 1165 1
+11 1168 1
+11 1171 1
+11 1172 1
+11 1174 1
+11 1177 1
+11 1178 1
+11 1180 1
+11 1181 1
+11 1183 1
+11 1184 1
+11 1187 1
+11 1188 1
+11 1190 1
+11 1191 1
+11 1193 1
+11 1194 1
+11 1195 1
+11 1197 1
+11 1198 1
+11 1200 1
+11 1203 1
+11 1206 1
+11 1207 1
+11 1209 1
+11 1212 1
+11 1213 1
+11 1215 1
+11 1216 1
+11 1218 1
+11 1219 1
+11 1222 1
+11 1223 1
+11 1225 1
+11 1226 1
+11 1228 1
+11 1229 1
+11 1230 1
+11 1232 1
+11 1233 1
+11 1234 1
+11 1237 1
+11 1238 1
+11 1240 1
+11 1241 1
+11 1243 1
+11 1244 1
+11 1245 1
+11 1247 1
+11 1248 1
+11 1249 1
+11 1250 1
+11 1252 1
+11 1253 1
+11 1254 1
+11 1258 1
+11 1263 1
+11 1267 1
+11 1270 1
+11 1273 1
+11 1274 1
+11 1278 1
+11 1282 1
+11 1285 1
+11 1288 1
+11 1289 1
+11 1292 1
+11 1295 1
+11 1298 1
+11 1299 1
+11 1301 1
+11 1304 1
+11 1305 1
+11 1307 1
+11 1308 1
+11 1310 1
+11 1313 1
+11 1317 1
+11 1320 1
+11 1323 1
+11 1324 1
+11 1327 1
+11 1330 1
+11 1333 1
+11 1334 1
+11 1336 1
+11 1339 1
+11 1340 1
+11 1342 1
+11 1343 1
+11 1345 1
+11 1347 1
+11 1350 1
+11 1353 1
+11 1354 1
+11 1356 1
+11 1359 1
+11 1360 1
+11 1362 1
+11 1363 1
+11 1365 1
+11 1366 1
+11 1369 1
+11 1370 1
+11 1372 1
+11 1373 1
+11 1375 1
+11 1376 1
+11 1377 1
+11 1379 1
+11 1380 1
+11 1383 1
+11 1387 1
+11 1390 1
+11 1393 1
+11 1394 1
+11 1397 1
+11 1400 1
+11 1403 1
+11 1404 1
+11 1406 1
+11 1409 1
+11 1410 1
+11 1412 1
+11 1413 1
+11 1415 1
+11 1417 1
+11 1420 1
+11 1423 1
+11 1424 1
+11 1426 1
+11 1429 1
+11 1430 1
+11 1432 1
+11 1433 1
+11 1435 1
+11 1436 1
+11 1439 1
+11 1440 1
+11 1442 1
+11 1443 1
+11 1445 1
+11 1446 1
+11 1447 1
+11 1449 1
+11 1450 1
+11 1452 1
+11 1455 1
+11 1458 1
+11 1459 1
+11 1461 1
+11 1464 1
+11 1465 1
+11 1467 1
+11 1468 1
+11 1470 1
+11 1471 1
+11 1474 1
+11 1475 1
+11 1477 1
+11 1478 1
+11 1480 1
+11 1481 1
+11 1482 1
+11 1484 1
+11 1485 1
+11 1486 1
+11 1489 1
+11 1490 1
+11 1492 1
+11 1493 1
+11 1495 1
+11 1496 1
+11 1497 1
+11 1499 1
+11 1500 1
+11 1501 1
+11 1502 1
+11 1504 1
+11 1505 1
+11 1506 1
+11 1509 1
+11 1513 1
+11 1516 1
+11 1519 1
+11 1520 1
+11 1523 1
+11 1526 1
+11 1529 1
+11 1530 1
+11 1532 1
+11 1535 1
+11 1536 1
+11 1538 1
+11 1539 1
+11 1541 1
+11 1543 1
+11 1546 1
+11 1549 1
+11 1550 1
+11 1552 1
+11 1555 1
+11 1556 1
+11 1558 1
+11 1559 1
+11 1561 1
+11 1562 1
+11 1565 1
+11 1566 1
+11 1568 1
+11 1569 1
+11 1571 1
+11 1572 1
+11 1573 1
+11 1575 1
+11 1576 1
+11 1578 1
+11 1581 1
+11 1584 1
+11 1585 1
+11 1587 1
+11 1590 1
+11 1591 1
+11 1593 1
+11 1594 1
+11 1596 1
+11 1597 1
+11 1600 1
+11 1601 1
+11 1603 1
+11 1604 1
+11 1606 1
+11 1607 1
+11 1608 1
+11 1610 1
+11 1611 1
+11 1612 1
+11 1615 1
+11 1616 1
+11 1618 1
+11 1619 1
+11 1621 1
+11 1622 1
+11 1623 1
+11 1625 1
+11 1626 1
+11 1627 1
+11 1628 1
+11 1630 1
+11 1631 1
+11 1632 1
+11 1634 1
+11 1637 1
+11 1640 1
+11 1641 1
+11 1643 1
+11 1646 1
+11 1647 1
+11 1649 1
+11 1650 1
+11 1652 1
+11 1653 1
+11 1656 1
+11 1657 1
+11 1659 1
+11 1660 1
+11 1662 1
+11 1663 1
+11 1664 1
+11 1666 1
+11 1667 1
+11 1668 1
+11 1671 1
+11 1672 1
+11 1674 1
+11 1675 1
+11 1677 1
+11 1678 1
+11 1679 1
+11 1681 1
+11 1682 1
+11 1683 1
+11 1684 1
+11 1686 1
+11 1687 1
+11 1688 1
+11 1689 1
+11 1692 1
+11 1693 1
+11 1695 1
+11 1696 1
+11 1698 1
+11 1699 1
+11 1700 1
+11 1702 1
+11 1703 1
+11 1704 1
+11 1705 1
+11 1707 1
+11 1708 1
+11 1709 1
+11 1710 1
+11 1711 1
+11 1713 1
+11 1714 1
+11 1715 1
+11 1716 1
+12 7 1
+12 14 1
+12 20 1
+12 25 1
+12 29 1
+12 32 1
+12 34 1
+12 36 1
+12 42 1
+12 48 1
+12 53 1
+12 57 1
+12 60 1
+12 62 1
+12 64 1
+12 69 1
+12 74 1
+12 78 1
+12 81 1
+12 83 1
+12 85 1
+12 89 1
+12 93 1
+12 96 1
+12 98 1
+12 100 1
+12 103 1
+12 106 1
+12 108 1
+12 110 1
+12 112 1
+12 114 1
+12 116 1
+12 117 1
+12 119 1
+12 120 1
+12 126 1
+12 132 1
+12 137 1
+12 141 1
+12 144 1
+12 146 1
+12 148 1
+12 153 1
+12 158 1
+12 162 1
+12 165 1
+12 167 1
+12 169 1
+12 173 1
+12 177 1
+12 180 1
+12 182 1
+12 184 1
+12 187 1
+12 190 1
+12 192 1
+12 194 1
+12 196 1
+12 198 1
+12 200 1
+12 201 1
+12 203 1
+12 204 1
+12 209 1
+12 214 1
+12 218 1
+12 221 1
+12 223 1
+12 225 1
+12 229 1
+12 233 1
+12 236 1
+12 238 1
+12 240 1
+12 243 1
+12 246 1
+12 248 1
+12 250 1
+12 252 1
+12 254 1
+12 256 1
+12 257 1
+12 259 1
+12 260 1
+12 264 1
+12 268 1
+12 271 1
+12 273 1
+12 275 1
+12 278 1
+12 281 1
+12 283 1
+12 285 1
+12 287 1
+12 289 1
+12 291 1
+12 292 1
+12 294 1
+12 295 1
+12 298 1
+12 301 1
+12 303 1
+12 305 1
+12 307 1
+12 309 1
+12 311 1
+12 312 1
+12 314 1
+12 315 1
+12 317 1
+12 319 1
+12 321 1
+12 322 1
+12 324 1
+12 325 1
+12 326 1
+12 328 1
+12 329 1
+12 330 1
+12 336 1
+12 342 1
+12 347 1
+12 351 1
+12 354 1
+12 356 1
+12 358 1
+12 363 1
+12 368 1
+12 372 1
+12 375 1
+12 377 1
+12 379 1
+12 383 1
+12 387 1
+12 390 1
+12 392 1
+12 394 1
+12 397 1
+12 400 1
+12 402 1
+12 404 1
+12 406 1
+12 408 1
+12 410 1
+12 411 1
+12 413 1
+12 414 1
+12 419 1
+12 424 1
+12 428 1
+12 431 1
+12 433 1
+12 435 1
+12 439 1
+12 443 1
+12 446 1
+12 448 1
+12 450 1
+12 453 1
+12 456 1
+12 458 1
+12 460 1
+12 462 1
+12 464 1
+12 466 1
+12 467 1
+12 469 1
+12 470 1
+12 474 1
+12 478 1
+12 481 1
+12 483 1
+12 485 1
+12 488 1
+12 491 1
+12 493 1
+12 495 1
+12 497 1
+12 499 1
+12 501 1
+12 502 1
+12 504 1
+12 505 1
+12 508 1
+12 511 1
+12 513 1
+12 515 1
+12 517 1
+12 519 1
+12 521 1
+12 522 1
+12 524 1
+12 525 1
+12 527 1
+12 529 1
+12 531 1
+12 532 1
+12 534 1
+12 535 1
+12 536 1
+12 538 1
+12 539 1
+12 540 1
+12 545 1
+12 550 1
+12 554 1
+12 557 1
+12 559 1
+12 561 1
+12 565 1
+12 569 1
+12 572 1
+12 574 1
+12 576 1
+12 579 1
+12 582 1
+12 584 1
+12 586 1
+12 588 1
+12 590 1
+12 592 1
+12 593 1
+12 595 1
+12 596 1
+12 600 1
+12 604 1
+12 607 1
+12 609 1
+12 611 1
+12 614 1
+12 617 1
+12 619 1
+12 621 1
+12 623 1
+12 625 1
+12 627 1
+12 628 1
+12 630 1
+12 631 1
+12 634 1
+12 637 1
+12 639 1
+12 641 1
+12 643 1
+12 645 1
+12 647 1
+12 648 1
+12 650 1
+12 651 1
+12 653 1
+12 655 1
+12 657 1
+12 658 1
+12 660 1
+12 661 1
+12 662 1
+12 664 1
+12 665 1
+12 666 1
+12 670 1
+12 674 1
+12 677 1
+12 679 1
+12 681 1
+12 684 1
+12 687 1
+12 689 1
+12 691 1
+12 693 1
+12 695 1
+12 697 1
+12 698 1
+12 700 1
+12 701 1
+12 704 1
+12 707 1
+12 709 1
+12 711 1
+12 713 1
+12 715 1
+12 717 1
+12 718 1
+12 720 1
+12 721 1
+12 723 1
+12 725 1
+12 727 1
+12 728 1
+12 730 1
+12 731 1
+12 732 1
+12 734 1
+12 735 1
+12 736 1
+12 739 1
+12 742 1
+12 744 1
+12 746 1
+12 748 1
+12 750 1
+12 752 1
+12 753 1
+12 755 1
+12 756 1
+12 758 1
+12 760 1
+12 762 1
+12 763 1
+12 765 1
+12 766 1
+12 767 1
+12 769 1
+12 770 1
+12 771 1
+12 773 1
+12 775 1
+12 777 1
+12 778 1
+12 780 1
+12 781 1
+12 782 1
+12 784 1
+12 785 1
+12 786 1
+12 787 1
+12 789 1
+12 790 1
+12 791 1
+12 792 1
+12 798 1
+12 804 1
+12 809 1
+12 813 1
+12 816 1
+12 818 1
+12 820 1
+12 825 1
+12 830 1
+12 834 1
+12 837 1
+12 839 1
+12 841 1
+12 845 1
+12 849 1
+12 852 1
+12 854 1
+12 856 1
+12 859 1
+12 862 1
+12 864 1
+12 866 1
+12 868 1
+12 870 1
+12 872 1
+12 873 1
+12 875 1
+12 876 1
+12 881 1
+12 886 1
+12 890 1
+12 893 1
+12 895 1
+12 897 1
+12 901 1
+12 905 1
+12 908 1
+12 910 1
+12 912 1
+12 915 1
+12 918 1
+12 920 1
+12 922 1
+12 924 1
+12 926 1
+12 928 1
+12 929 1
+12 931 1
+12 932 1
+12 936 1
+12 940 1
+12 943 1
+12 945 1
+12 947 1
+12 950 1
+12 953 1
+12 955 1
+12 957 1
+12 959 1
+12 961 1
+12 963 1
+12 964 1
+12 966 1
+12 967 1
+12 970 1
+12 973 1
+12 975 1
+12 977 1
+12 979 1
+12 981 1
+12 983 1
+12 984 1
+12 986 1
+12 987 1
+12 989 1
+12 991 1
+12 993 1
+12 994 1
+12 996 1
+12 997 1
+12 998 1
+12 1000 1
+12 1001 1
+12 1002 1
+12 1007 1
+12 1012 1
+12 1016 1
+12 1019 1
+12 1021 1
+12 1023 1
+12 1027 1
+12 1031 1
+12 1034 1
+12 1036 1
+12 1038 1
+12 1041 1
+12 1044 1
+12 1046 1
+12 1048 1
+12 1050 1
+12 1052 1
+12 1054 1
+12 1055 1
+12 1057 1
+12 1058 1
+12 1062 1
+12 1066 1
+12 1069 1
+12 1071 1
+12 1073 1
+12 1076 1
+12 1079 1
+12 1081 1
+12 1083 1
+12 1085 1
+12 1087 1
+12 1089 1
+12 1090 1
+12 1092 1
+12 1093 1
+12 1096 1
+12 1099 1
+12 1101 1
+12 1103 1
+12 1105 1
+12 1107 1
+12 1109 1
+12 1110 1
+12 1112 1
+12 1113 1
+12 1115 1
+12 1117 1
+12 1119 1
+12 1120 1
+12 1122 1
+12 1123 1
+12 1124 1
+12 1126 1
+12 1127 1
+12 1128 1
+12 1132 1
+12 1136 1
+12 1139 1
+12 1141 1
+12 1143 1
+12 1146 1
+12 1149 1
+12 1151 1
+12 1153 1
+12 1155 1
+12 1157 1
+12 1159 1
+12 1160 1
+12 1162 1
+12 1163 1
+12 1166 1
+12 1169 1
+12 1171 1
+12 1173 1
+12 1175 1
+12 1177 1
+12 1179 1
+12 1180 1
+12 1182 1
+12 1183 1
+12 1185 1
+12 1187 1
+12 1189 1
+12 1190 1
+12 1192 1
+12 1193 1
+12 1194 1
+12 1196 1
+12 1197 1
+12 1198 1
+12 1201 1
+12 1204 1
+12 1206 1
+12 1208 1
+12 1210 1
+12 1212 1
+12 1214 1
+12 1215 1
+12 1217 1
+12 1218 1
+12 1220 1
+12 1222 1
+12 1224 1
+12 1225 1
+12 1227 1
+12 1228 1
+12 1229 1
+12 1231 1
+12 1232 1
+12 1233 1
+12 1235 1
+12 1237 1
+12 1239 1
+12 1240 1
+12 1242 1
+12 1243 1
+12 1244 1
+12 1246 1
+12 1247 1
+12 1248 1
+12 1249 1
+12 1251 1
+12 1252 1
+12 1253 1
+12 1254 1
+12 1259 1
+12 1264 1
+12 1268 1
+12 1271 1
+12 1273 1
+12 1275 1
+12 1279 1
+12 1283 1
+12 1286 1
+12 1288 1
+12 1290 1
+12 1293 1
+12 1296 1
+12 1298 1
+12 1300 1
+12 1302 1
+12 1304 1
+12 1306 1
+12 1307 1
+12 1309 1
+12 1310 1
+12 1314 1
+12 1318 1
+12 1321 1
+12 1323 1
+12 1325 1
+12 1328 1
+12 1331 1
+12 1333 1
+12 1335 1
+12 1337 1
+12 1339 1
+12 1341 1
+12 1342 1
+12 1344 1
+12 1345 1
+12 1348 1
+12 1351 1
+12 1353 1
+12 1355 1
+12 1357 1
+12 1359 1
+12 1361 1
+12 1362 1
+12 1364 1
+12 1365 1
+12 1367 1
+12 1369 1
+12 1371 1
+12 1372 1
+12 1374 1
+12 1375 1
+12 1376 1
+12 1378 1
+12 1379 1
+12 1380 1
+12 1384 1
+12 1388 1
+12 1391 1
+12 1393 1
+12 1395 1
+12 1398 1
+12 1401 1
+12 1403 1
+12 1405 1
+12 1407 1
+12 1409 1
+12 1411 1
+12 1412 1
+12 1414 1
+12 1415 1
+12 1418 1
+12 1421 1
+12 1423 1
+12 1425 1
+12 1427 1
+12 1429 1
+12 1431 1
+12 1432 1
+12 1434 1
+12 1435 1
+12 1437 1
+12 1439 1
+12 1441 1
+12 1442 1
+12 1444 1
+12 1445 1
+12 1446 1
+12 1448 1
+12 1449 1
+12 1450 1
+12 1453 1
+12 1456 1
+12 1458 1
+12 1460 1
+12 1462 1
+12 1464 1
+12 1466 1
+12 1467 1
+12 1469 1
+12 1470 1
+12 1472 1
+12 1474 1
+12 1476 1
+12 1477 1
+12 1479 1
+12 1480 1
+12 1481 1
+12 1483 1
+12 1484 1
+12 1485 1
+12 1487 1
+12 1489 1
+12 1491 1
+12 1492 1
+12 1494 1
+12 1495 1
+12 1496 1
+12 1498 1
+12 1499 1
+12 1500 1
+12 1501 1
+12 1503 1
+12 1504 1
+12 1505 1
+12 1506 1
+12 1510 1
+12 1514 1
+12 1517 1
+12 1519 1
+12 1521 1
+12 1524 1
+12 1527 1
+12 1529 1
+12 1531 1
+12 1533 1
+12 1535 1
+12 1537 1
+12 1538 1
+12 1540 1
+12 1541 1
+12 1544 1
+12 1547 1
+12 1549 1
+12 1551 1
+12 1553 1
+12 1555 1
+12 1557 1
+12 1558 1
+12 1560 1
+12 1561 1
+12 1563 1
+12 1565 1
+12 1567 1
+12 1568 1
+12 1570 1
+12 1571 1
+12 1572 1
+12 1574 1
+12 1575 1
+12 1576 1
+12 1579 1
+12 1582 1
+12 1584 1
+12 1586 1
+12 1588 1
+12 1590 1
+12 1592 1
+12 1593 1
+12 1595 1
+12 1596 1
+12 1598 1
+12 1600 1
+12 1602 1
+12 1603 1
+12 1605 1
+12 1606 1
+12 1607 1
+12 1609 1
+12 1610 1
+12 1611 1
+12 1613 1
+12 1615 1
+12 1617 1
+12 1618 1
+12 1620 1
+12 1621 1
+12 1622 1
+12 1624 1
+12 1625 1
+12 1626 1
+12 1627 1
+12 1629 1
+12 1630 1
+12 1631 1
+12 1632 1
+12 1635 1
+12 1638 1
+12 1640 1
+12 1642 1
+12 1644 1
+12 1646 1
+12 1648 1
+12 1649 1
+12 1651 1
+12 1652 1
+12 1654 1
+12 1656 1
+12 1658 1
+12 1659 1
+12 1661 1
+12 1662 1
+12 1663 1
+12 1665 1
+12 1666 1
+12 1667 1
+12 1669 1
+12 1671 1
+12 1673 1
+12 1674 1
+12 1676 1
+12 1677 1
+12 1678 1
+12 1680 1
+12 1681 1
+12 1682 1
+12 1683 1
+12 1685 1
+12 1686 1
+12 1687 1
+12 1688 1
+12 1690 1
+12 1692 1
+12 1694 1
+12 1695 1
+12 1697 1
+12 1698 1
+12 1699 1
+12 1701 1
+12 1702 1
+12 1703 1
+12 1704 1
+12 1706 1
+12 1707 1
+12 1708 1
+12 1709 1
+12 1710 1
+12 1712 1
+12 1713 1
+12 1714 1
+12 1715 1
+12 1716 1
+13 8 1
+13 15 1
+13 21 1
+13 26 1
+13 30 1
+13 33 1
+13 35 1
+13 36 1
+13 43 1
+13 49 1
+13 54 1
+13 58 1
+13 61 1
+13 63 1
+13 64 1
+13 70 1
+13 75 1
+13 79 1
+13 82 1
+13 84 1
+13 85 1
+13 90 1
+13 94 1
+13 97 1
+13 99 1
+13 100 1
+13 104 1
+13 107 1
+13 109 1
+13 110 1
+13 113 1
+13 115 1
+13 116 1
+13 118 1
+13 119 1
+13 120 1
+13 127 1
+13 133 1
+13 138 1
+13 142 1
+13 145 1
+13 147 1
+13 148 1
+13 154 1
+13 159 1
+13 163 1
+13 166 1
+13 168 1
+13 169 1
+13 174 1
+13 178 1
+13 181 1
+13 183 1
+13 184 1
+13 188 1
+13 191 1
+13 193 1
+13 194 1
+13 197 1
+13 199 1
+13 200 1
+13 202 1
+13 203 1
+13 204 1
+13 210 1
+13 215 1
+13 219 1
+13 222 1
+13 224 1
+13 225 1
+13 230 1
+13 234 1
+13 237 1
+13 239 1
+13 240 1
+13 244 1
+13 247 1
+13 249 1
+13 250 1
+13 253 1
+13 255 1
+13 256 1
+13 258 1
+13 259 1
+13 260 1
+13 265 1
+13 269 1
+13 272 1
+13 274 1
+13 275 1
+13 279 1
+13 282 1
+13 284 1
+13 285 1
+13 288 1
+13 290 1
+13 291 1
+13 293 1
+13 294 1
+13 295 1
+13 299 1
+13 302 1
+13 304 1
+13 305 1
+13 308 1
+13 310 1
+13 311 1
+13 313 1
+13 314 1
+13 315 1
+13 318 1
+13 320 1
+13 321 1
+13 323 1
+13 324 1
+13 325 1
+13 327 1
+13 328 1
+13 329 1
+13 330 1
+13 337 1
+13 343 1
+13 348 1
+13 352 1
+13 355 1
+13 357 1
+13 358 1
+13 364 1
+13 369 1
+13 373 1
+13 376 1
+13 378 1
+13 379 1
+13 384 1
+13 388 1
+13 391 1
+13 393 1
+13 394 1
+13 398 1
+13 401 1
+13 403 1
+13 404 1
+13 407 1
+13 409 1
+13 410 1
+13 412 1
+13 413 1
+13 414 1
+13 420 1
+13 425 1
+13 429 1
+13 432 1
+13 434 1
+13 435 1
+13 440 1
+13 444 1
+13 447 1
+13 449 1
+13 450 1
+13 454 1
+13 457 1
+13 459 1
+13 460 1
+13 463 1
+13 465 1
+13 466 1
+13 468 1
+13 469 1
+13 470 1
+13 475 1
+13 479 1
+13 482 1
+13 484 1
+13 485 1
+13 489 1
+13 492 1
+13 494 1
+13 495 1
+13 498 1
+13 500 1
+13 501 1
+13 503 1
+13 504 1
+13 505 1
+13 509 1
+13 512 1
+13 514 1
+13 515 1
+13 518 1
+13 520 1
+13 521 1
+13 523 1
+13 524 1
+13 525 1
+13 528 1
+13 530 1
+13 531 1
+13 533 1
+13 534 1
+13 535 1
+13 537 1
+13 538 1
+13 539 1
+13 540 1
+13 546 1
+13 551 1
+13 555 1
+13 558 1
+13 560 1
+13 561 1
+13 566 1
+13 570 1
+13 573 1
+13 575 1
+13 576 1
+13 580 1
+13 583 1
+13 585 1
+13 586 1
+13 589 1
+13 591 1
+13 592 1
+13 594 1
+13 595 1
+13 596 1
+13 601 1
+13 605 1
+13 608 1
+13 610 1
+13 611 1
+13 615 1
+13 618 1
+13 620 1
+13 621 1
+13 624 1
+13 626 1
+13 627 1
+13 629 1
+13 630 1
+13 631 1
+13 635 1
+13 638 1
+13 640 1
+13 641 1
+13 644 1
+13 646 1
+13 647 1
+13 649 1
+13 650 1
+13 651 1
+13 654 1
+13 656 1
+13 657 1
+13 659 1
+13 660 1
+13 661 1
+13 663 1
+13 664 1
+13 665 1
+13 666 1
+13 671 1
+13 675 1
+13 678 1
+13 680 1
+13 681 1
+13 685 1
+13 688 1
+13 690 1
+13 691 1
+13 694 1
+13 696 1
+13 697 1
+13 699 1
+13 700 1
+13 701 1
+13 705 1
+13 708 1
+13 710 1
+13 711 1
+13 714 1
+13 716 1
+13 717 1
+13 719 1
+13 720 1
+13 721 1
+13 724 1
+13 726 1
+13 727 1
+13 729 1
+13 730 1
+13 731 1
+13 733 1
+13 734 1
+13 735 1
+13 736 1
+13 740 1
+13 743 1
+13 745 1
+13 746 1
+13 749 1
+13 751 1
+13 752 1
+13 754 1
+13 755 1
+13 756 1
+13 759 1
+13 761 1
+13 762 1
+13 764 1
+13 765 1
+13 766 1
+13 768 1
+13 769 1
+13 770 1
+13 771 1
+13 774 1
+13 776 1
+13 777 1
+13 779 1
+13 780 1
+13 781 1
+13 783 1
+13 784 1
+13 785 1
+13 786 1
+13 788 1
+13 789 1
+13 790 1
+13 791 1
+13 792 1
+13 799 1
+13 805 1
+13 810 1
+13 814 1
+13 817 1
+13 819 1
+13 820 1
+13 826 1
+13 831 1
+13 835 1
+13 838 1
+13 840 1
+13 841 1
+13 846 1
+13 850 1
+13 853 1
+13 855 1
+13 856 1
+13 860 1
+13 863 1
+13 865 1
+13 866 1
+13 869 1
+13 871 1
+13 872 1
+13 874 1
+13 875 1
+13 876 1
+13 882 1
+13 887 1
+13 891 1
+13 894 1
+13 896 1
+13 897 1
+13 902 1
+13 906 1
+13 909 1
+13 911 1
+13 912 1
+13 916 1
+13 919 1
+13 921 1
+13 922 1
+13 925 1
+13 927 1
+13 928 1
+13 930 1
+13 931 1
+13 932 1
+13 937 1
+13 941 1
+13 944 1
+13 946 1
+13 947 1
+13 951 1
+13 954 1
+13 956 1
+13 957 1
+13 960 1
+13 962 1
+13 963 1
+13 965 1
+13 966 1
+13 967 1
+13 971 1
+13 974 1
+13 976 1
+13 977 1
+13 980 1
+13 982 1
+13 983 1
+13 985 1
+13 986 1
+13 987 1
+13 990 1
+13 992 1
+13 993 1
+13 995 1
+13 996 1
+13 997 1
+13 999 1
+13 1000 1
+13 1001 1
+13 1002 1
+13 1008 1
+13 1013 1
+13 1017 1
+13 1020 1
+13 1022 1
+13 1023 1
+13 1028 1
+13 1032 1
+13 1035 1
+13 1037 1
+13 1038 1
+13 1042 1
+13 1045 1
+13 1047 1
+13 1048 1
+13 1051 1
+13 1053 1
+13 1054 1
+13 1056 1
+13 1057 1
+13 1058 1
+13 1063 1
+13 1067 1
+13 1070 1
+13 1072 1
+13 1073 1
+13 1077 1
+13 1080 1
+13 1082 1
+13 1083 1
+13 1086 1
+13 1088 1
+13 1089 1
+13 1091 1
+13 1092 1
+13 1093 1
+13 1097 1
+13 1100 1
+13 1102 1
+13 1103 1
+13 1106 1
+13 1108 1
+13 1109 1
+13 1111 1
+13 1112 1
+13 1113 1
+13 1116 1
+13 1118 1
+13 1119 1
+13 1121 1
+13 1122 1
+13 1123 1
+13 1125 1
+13 1126 1
+13 1127 1
+13 1128 1
+13 1133 1
+13 1137 1
+13 1140 1
+13 1142 1
+13 1143 1
+13 1147 1
+13 1150 1
+13 1152 1
+13 1153 1
+13 1156 1
+13 1158 1
+13 1159 1
+13 1161 1
+13 1162 1
+13 1163 1
+13 1167 1
+13 1170 1
+13 1172 1
+13 1173 1
+13 1176 1
+13 1178 1
+13 1179 1
+13 1181 1
+13 1182 1
+13 1183 1
+13 1186 1
+13 1188 1
+13 1189 1
+13 1191 1
+13 1192 1
+13 1193 1
+13 1195 1
+13 1196 1
+13 1197 1
+13 1198 1
+13 1202 1
+13 1205 1
+13 1207 1
+13 1208 1
+13 1211 1
+13 1213 1
+13 1214 1
+13 1216 1
+13 1217 1
+13 1218 1
+13 1221 1
+13 1223 1
+13 1224 1
+13 1226 1
+13 1227 1
+13 1228 1
+13 1230 1
+13 1231 1
+13 1232 1
+13 1233 1
+13 1236 1
+13 1238 1
+13 1239 1
+13 1241 1
+13 1242 1
+13 1243 1
+13 1245 1
+13 1246 1
+13 1247 1
+13 1248 1
+13 1250 1
+13 1251 1
+13 1252 1
+13 1253 1
+13 1254 1
+13 1260 1
+13 1265 1
+13 1269 1
+13 1272 1
+13 1274 1
+13 1275 1
+13 1280 1
+13 1284 1
+13 1287 1
+13 1289 1
+13 1290 1
+13 1294 1
+13 1297 1
+13 1299 1
+13 1300 1
+13 1303 1
+13 1305 1
+13 1306 1
+13 1308 1
+13 1309 1
+13 1310 1
+13 1315 1
+13 1319 1
+13 1322 1
+13 1324 1
+13 1325 1
+13 1329 1
+13 1332 1
+13 1334 1
+13 1335 1
+13 1338 1
+13 1340 1
+13 1341 1
+13 1343 1
+13 1344 1
+13 1345 1
+13 1349 1
+13 1352 1
+13 1354 1
+13 1355 1
+13 1358 1
+13 1360 1
+13 1361 1
+13 1363 1
+13 1364 1
+13 1365 1
+13 1368 1
+13 1370 1
+13 1371 1
+13 1373 1
+13 1374 1
+13 1375 1
+13 1377 1
+13 1378 1
+13 1379 1
+13 1380 1
+13 1385 1
+13 1389 1
+13 1392 1
+13 1394 1
+13 1395 1
+13 1399 1
+13 1402 1
+13 1404 1
+13 1405 1
+13 1408 1
+13 1410 1
+13 1411 1
+13 1413 1
+13 1414 1
+13 1415 1
+13 1419 1
+13 1422 1
+13 1424 1
+13 1425 1
+13 1428 1
+13 1430 1
+13 1431 1
+13 1433 1
+13 1434 1
+13 1435 1
+13 1438 1
+13 1440 1
+13 1441 1
+13 1443 1
+13 1444 1
+13 1445 1
+13 1447 1
+13 1448 1
+13 1449 1
+13 1450 1
+13 1454 1
+13 1457 1
+13 1459 1
+13 1460 1
+13 1463 1
+13 1465 1
+13 1466 1
+13 1468 1
+13 1469 1
+13 1470 1
+13 1473 1
+13 1475 1
+13 1476 1
+13 1478 1
+13 1479 1
+13 1480 1
+13 1482 1
+13 1483 1
+13 1484 1
+13 1485 1
+13 1488 1
+13 1490 1
+13 1491 1
+13 1493 1
+13 1494 1
+13 1495 1
+13 1497 1
+13 1498 1
+13 1499 1
+13 1500 1
+13 1502 1
+13 1503 1
+13 1504 1
+13 1505 1
+13 1506 1
+13 1511 1
+13 1515 1
+13 1518 1
+13 1520 1
+13 1521 1
+13 1525 1
+13 1528 1
+13 1530 1
+13 1531 1
+13 1534 1
+13 1536 1
+13 1537 1
+13 1539 1
+13 1540 1
+13 1541 1
+13 1545 1
+13 1548 1
+13 1550 1
+13 1551 1
+13 1554 1
+13 1556 1
+13 1557 1
+13 1559 1
+13 1560 1
+13 1561 1
+13 1564 1
+13 1566 1
+13 1567 1
+13 1569 1
+13 1570 1
+13 1571 1
+13 1573 1
+13 1574 1
+13 1575 1
+13 1576 1
+13 1580 1
+13 1583 1
+13 1585 1
+13 1586 1
+13 1589 1
+13 1591 1
+13 1592 1
+13 1594 1
+13 1595 1
+13 1596 1
+13 1599 1
+13 1601 1
+13 1602 1
+13 1604 1
+13 1605 1
+13 1606 1
+13 1608 1
+13 1609 1
+13 1610 1
+13 1611 1
+13 1614 1
+13 1616 1
+13 1617 1
+13 1619 1
+13 1620 1
+13 1621 1
+13 1623 1
+13 1624 1
+13 1625 1
+13 1626 1
+13 1628 1
+13 1629 1
+13 1630 1
+13 1631 1
+13 1632 1
+13 1636 1
+13 1639 1
+13 1641 1
+13 1642 1
+13 1645 1
+13 1647 1
+13 1648 1
+13 1650 1
+13 1651 1
+13 1652 1
+13 1655 1
+13 1657 1
+13 1658 1
+13 1660 1
+13 1661 1
+13 1662 1
+13 1664 1
+13 1665 1
+13 1666 1
+13 1667 1
+13 1670 1
+13 1672 1
+13 1673 1
+13 1675 1
+13 1676 1
+13 1677 1
+13 1679 1
+13 1680 1
+13 1681 1
+13 1682 1
+13 1684 1
+13 1685 1
+13 1686 1
+13 1687 1
+13 1688 1
+13 1691 1
+13 1693 1
+13 1694 1
+13 1696 1
+13 1697 1
+13 1698 1
+13 1700 1
+13 1701 1
+13 1702 1
+13 1703 1
+13 1705 1
+13 1706 1
+13 1707 1
+13 1708 1
+13 1709 1
+13 1711 1
+13 1712 1
+13 1713 1
+13 1714 1
+13 1715 1
+13 1716 1
+14 1 1
+14 2 1
+14 3 1
+14 4 1
+14 5 1
+14 6 1
+14 7 1
+14 8 1
+14 9 1
+14 10 1
+14 11 1
+14 12 1
+14 13 1
+14 14 1
+14 15 1
+14 16 1
+14 17 1
+14 18 1
+14 19 1
+14 20 1
+14 21 1
+14 22 1
+14 23 1
+14 24 1
+14 25 1
+14 26 1
+14 27 1
+14 28 1
+14 29 1
+14 30 1
+14 31 1
+14 32 1
+14 33 1
+14 34 1
+14 35 1
+14 36 1
+14 37 1
+14 38 1
+14 39 1
+14 40 1
+14 41 1
+14 42 1
+14 43 1
+14 44 1
+14 45 1
+14 46 1
+14 47 1
+14 48 1
+14 49 1
+14 50 1
+14 51 1
+14 52 1
+14 53 1
+14 54 1
+14 55 1
+14 56 1
+14 57 1
+14 58 1
+14 59 1
+14 60 1
+14 61 1
+14 62 1
+14 63 1
+14 64 1
+14 65 1
+14 66 1
+14 67 1
+14 68 1
+14 69 1
+14 70 1
+14 71 1
+14 72 1
+14 73 1
+14 74 1
+14 75 1
+14 76 1
+14 77 1
+14 78 1
+14 79 1
+14 80 1
+14 81 1
+14 82 1
+14 83 1
+14 84 1
+14 85 1
+14 86 1
+14 87 1
+14 88 1
+14 89 1
+14 90 1
+14 91 1
+14 92 1
+14 93 1
+14 94 1
+14 95 1
+14 96 1
+14 97 1
+14 98 1
+14 99 1
+14 100 1
+14 101 1
+14 102 1
+14 103 1
+14 104 1
+14 105 1
+14 106 1
+14 107 1
+14 108 1
+14 109 1
+14 110 1
+14 111 1
+14 112 1
+14 113 1
+14 114 1
+14 115 1
+14 116 1
+14 117 1
+14 118 1
+14 119 1
+14 120 1
+14 121 1
+14 122 1
+14 123 1
+14 124 1
+14 125 1
+14 126 1
+14 127 1
+14 128 1
+14 129 1
+14 130 1
+14 131 1
+14 132 1
+14 133 1
+14 134 1
+14 135 1
+14 136 1
+14 137 1
+14 138 1
+14 139 1
+14 140 1
+14 141 1
+14 142 1
+14 143 1
+14 144 1
+14 145 1
+14 146 1
+14 147 1
+14 148 1
+14 149 1
+14 150 1
+14 151 1
+14 152 1
+14 153 1
+14 154 1
+14 155 1
+14 156 1
+14 157 1
+14 158 1
+14 159 1
+14 160 1
+14 161 1
+14 162 1
+14 163 1
+14 164 1
+14 165 1
+14 166 1
+14 167 1
+14 168 1
+14 169 1
+14 170 1
+14 171 1
+14 172 1
+14 173 1
+14 174 1
+14 175 1
+14 176 1
+14 177 1
+14 178 1
+14 179 1
+14 180 1
+14 181 1
+14 182 1
+14 183 1
+14 184 1
+14 185 1
+14 186 1
+14 187 1
+14 188 1
+14 189 1
+14 190 1
+14 191 1
+14 192 1
+14 193 1
+14 194 1
+14 195 1
+14 196 1
+14 197 1
+14 198 1
+14 199 1
+14 200 1
+14 201 1
+14 202 1
+14 203 1
+14 204 1
+14 205 1
+14 206 1
+14 207 1
+14 208 1
+14 209 1
+14 210 1
+14 211 1
+14 212 1
+14 213 1
+14 214 1
+14 215 1
+14 216 1
+14 217 1
+14 218 1
+14 219 1
+14 220 1
+14 221 1
+14 222 1
+14 223 1
+14 224 1
+14 225 1
+14 226 1
+14 227 1
+14 228 1
+14 229 1
+14 230 1
+14 231 1
+14 232 1
+14 233 1
+14 234 1
+14 235 1
+14 236 1
+14 237 1
+14 238 1
+14 239 1
+14 240 1
+14 241 1
+14 242 1
+14 243 1
+14 244 1
+14 245 1
+14 246 1
+14 247 1
+14 248 1
+14 249 1
+14 250 1
+14 251 1
+14 252 1
+14 253 1
+14 254 1
+14 255 1
+14 256 1
+14 257 1
+14 258 1
+14 259 1
+14 260 1
+14 261 1
+14 262 1
+14 263 1
+14 264 1
+14 265 1
+14 266 1
+14 267 1
+14 268 1
+14 269 1
+14 270 1
+14 271 1
+14 272 1
+14 273 1
+14 274 1
+14 275 1
+14 276 1
+14 277 1
+14 278 1
+14 279 1
+14 280 1
+14 281 1
+14 282 1
+14 283 1
+14 284 1
+14 285 1
+14 286 1
+14 287 1
+14 288 1
+14 289 1
+14 290 1
+14 291 1
+14 292 1
+14 293 1
+14 294 1
+14 295 1
+14 296 1
+14 297 1
+14 298 1
+14 299 1
+14 300 1
+14 301 1
+14 302 1
+14 303 1
+14 304 1
+14 305 1
+14 306 1
+14 307 1
+14 308 1
+14 309 1
+14 310 1
+14 311 1
+14 312 1
+14 313 1
+14 314 1
+14 315 1
+14 316 1
+14 317 1
+14 318 1
+14 319 1
+14 320 1
+14 321 1
+14 322 1
+14 323 1
+14 324 1
+14 325 1
+14 326 1
+14 327 1
+14 328 1
+14 329 1
+14 330 1
+14 1717 1
+14 1718 1
+14 1719 1
+14 1720 1
+14 1721 1
+14 1722 1
+14 1723 1
+14 1724 1
+14 1725 1
+14 1726 1
+14 1727 1
+14 1728 1
+14 1729 1
+14 1730 1
+14 1731 1
+14 1732 1
+14 1733 1
+14 1734 1
+14 1735 1
+14 1736 1
+14 1737 1
+14 1738 1
+14 1739 1
+14 1740 1
+14 1741 1
+14 1742 1
+14 1743 1
+14 1744 1
+14 1745 1
+14 1746 1
+14 1747 1
+14 1748 1
+14 1749 1
+14 1750 1
+14 1751 1
+14 1752 1
+14 1753 1
+14 1754 1
+14 1755 1
+14 1756 1
+14 1757 1
+14 1758 1
+14 1759 1
+14 1760 1
+14 1761 1
+14 1762 1
+14 1763 1
+14 1764 1
+14 1765 1
+14 1766 1
+14 1767 1
+14 1768 1
+14 1769 1
+14 1770 1
+14 1771 1
+14 1772 1
+14 1773 1
+14 1774 1
+14 1775 1
+14 1776 1
+14 1777 1
+14 1778 1
+14 1779 1
+14 1780 1
+14 1781 1
+14 1782 1
+14 1783 1
+14 1784 1
+14 1785 1
+14 1786 1
+14 1787 1
+14 1788 1
+14 1789 1
+14 1790 1
+14 1791 1
+14 1792 1
+14 1793 1
+14 1794 1
+14 1795 1
+14 1796 1
+14 1797 1
+14 1798 1
+14 1799 1
+14 1800 1
+14 1801 1
+14 1802 1
+14 1803 1
+14 1804 1
+14 1805 1
+14 1806 1
+14 1807 1
+14 1808 1
+14 1809 1
+14 1810 1
+14 1811 1
+14 1812 1
+14 1813 1
+14 1814 1
+14 1815 1
+14 1816 1
+14 1817 1
+14 1818 1
+14 1819 1
+14 1820 1
+14 1821 1
+14 1822 1
+14 1823 1
+14 1824 1
+14 1825 1
+14 1826 1
+14 1827 1
+14 1828 1
+14 1829 1
+14 1830 1
+14 1831 1
+14 1832 1
+14 1833 1
+14 1834 1
+14 1835 1
+14 1836 1
+14 1837 1
+14 1838 1
+14 1839 1
+14 1840 1
+14 1841 1
+14 1842 1
+14 1843 1
+14 1844 1
+14 1845 1
+14 1846 1
+14 1847 1
+14 1848 1
+14 1849 1
+14 1850 1
+14 1851 1
+14 1852 1
+14 1853 1
+14 1854 1
+14 1855 1
+14 1856 1
+14 1857 1
+14 1858 1
+14 1859 1
+14 1860 1
+14 1861 1
+14 1862 1
+14 1863 1
+14 1864 1
+14 1865 1
+14 1866 1
+14 1867 1
+14 1868 1
+14 1869 1
+14 1870 1
+14 1871 1
+14 1872 1
+14 1873 1
+14 1874 1
+14 1875 1
+14 1876 1
+14 1877 1
+14 1878 1
+14 1879 1
+14 1880 1
+14 1881 1
+14 1882 1
+14 1883 1
+14 1884 1
+14 1885 1
+14 1886 1
+14 1887 1
+14 1888 1
+14 1889 1
+14 1890 1
+14 1891 1
+14 1892 1
+14 1893 1
+14 1894 1
+14 1895 1
+14 1896 1
+14 1897 1
+14 1898 1
+14 1899 1
+14 1900 1
+14 1901 1
+14 1902 1
+14 1903 1
+14 1904 1
+14 1905 1
+14 1906 1
+14 1907 1
+14 1908 1
+14 1909 1
+14 1910 1
+14 1911 1
+14 1912 1
+14 1913 1
+14 1914 1
+14 1915 1
+14 1916 1
+14 1917 1
+14 1918 1
+14 1919 1
+14 1920 1
+14 1921 1
+14 1922 1
+14 1923 1
+14 1924 1
+14 1925 1
+14 1926 1
+14 1927 1
+14 1928 1
+14 1929 1
+14 1930 1
+14 1931 1
+14 1932 1
+14 1933 1
+14 1934 1
+14 1935 1
+14 1936 1
+14 1937 1
+14 1938 1
+14 1939 1
+14 1940 1
+14 1941 1
+14 1942 1
+14 1943 1
+14 1944 1
+14 1945 1
+14 1946 1
+14 1947 1
+14 1948 1
+14 1949 1
+14 1950 1
+14 1951 1
+14 1952 1
+14 1953 1
+14 1954 1
+14 1955 1
+14 1956 1
+14 1957 1
+14 1958 1
+14 1959 1
+14 1960 1
+14 1961 1
+14 1962 1
+14 1963 1
+14 1964 1
+14 1965 1
+14 1966 1
+14 1967 1
+14 1968 1
+14 1969 1
+14 1970 1
+14 1971 1
+14 1972 1
+14 1973 1
+14 1974 1
+14 1975 1
+14 1976 1
+14 1977 1
+14 1978 1
+14 1979 1
+14 1980 1
+14 1981 1
+14 1982 1
+14 1983 1
+14 1984 1
+14 1985 1
+14 1986 1
+14 1987 1
+14 1988 1
+14 1989 1
+14 1990 1
+14 1991 1
+14 1992 1
+14 1993 1
+14 1994 1
+14 1995 1
+14 1996 1
+14 1997 1
+14 1998 1
+14 1999 1
+14 2000 1
+14 2001 1
+14 2002 1
+14 2003 1
+14 2004 1
+14 2005 1
+14 2006 1
+14 2007 1
+14 2008 1
+14 2009 1
+14 2010 1
+14 2011 1
+14 2012 1
+14 2013 1
+14 2014 1
+14 2015 1
+14 2016 1
+14 2017 1
+14 2018 1
+14 2019 1
+14 2020 1
+14 2021 1
+14 2022 1
+14 2023 1
+14 2024 1
+14 2025 1
+14 2026 1
+14 2027 1
+14 2028 1
+14 2029 1
+14 2030 1
+14 2031 1
+14 2032 1
+14 2033 1
+14 2034 1
+14 2035 1
+14 2036 1
+14 2037 1
+14 2038 1
+14 2039 1
+14 2040 1
+14 2041 1
+14 2042 1
+14 2043 1
+14 2044 1
+14 2045 1
+14 2046 1
+14 2047 1
+14 2048 1
+14 2049 1
+14 2050 1
+14 2051 1
+14 2052 1
+14 2053 1
+14 2054 1
+14 2055 1
+14 2056 1
+14 2057 1
+14 2058 1
+14 2059 1
+14 2060 1
+14 2061 1
+14 2062 1
+14 2063 1
+14 2064 1
+14 2065 1
+14 2066 1
+14 2067 1
+14 2068 1
+14 2069 1
+14 2070 1
+14 2071 1
+14 2072 1
+14 2073 1
+14 2074 1
+14 2075 1
+14 2076 1
+14 2077 1
+14 2078 1
+14 2079 1
+14 2080 1
+14 2081 1
+14 2082 1
+14 2083 1
+14 2084 1
+14 2085 1
+14 2086 1
+14 2087 1
+14 2088 1
+14 2089 1
+14 2090 1
+14 2091 1
+14 2092 1
+14 2093 1
+14 2094 1
+14 2095 1
+14 2096 1
+14 2097 1
+14 2098 1
+14 2099 1
+14 2100 1
+14 2101 1
+14 2102 1
+14 2103 1
+14 2104 1
+14 2105 1
+14 2106 1
+14 2107 1
+14 2108 1
+14 2109 1
+14 2110 1
+14 2111 1
+14 2112 1
+14 2113 1
+14 2114 1
+14 2115 1
+14 2116 1
+14 2117 1
+14 2118 1
+14 2119 1
+14 2120 1
+14 2121 1
+14 2122 1
+14 2123 1
+14 2124 1
+14 2125 1
+14 2126 1
+14 2127 1
+14 2128 1
+14 2129 1
+14 2130 1
+14 2131 1
+14 2132 1
+14 2133 1
+14 2134 1
+14 2135 1
+14 2136 1
+14 2137 1
+14 2138 1
+14 2139 1
+14 2140 1
+14 2141 1
+14 2142 1
+14 2143 1
+14 2144 1
+14 2145 1
+14 2146 1
+14 2147 1
+14 2148 1
+14 2149 1
+14 2150 1
+14 2151 1
+14 2152 1
+14 2153 1
+14 2154 1
+14 2155 1
+14 2156 1
+14 2157 1
+14 2158 1
+14 2159 1
+14 2160 1
+14 2161 1
+14 2162 1
+14 2163 1
+14 2164 1
+14 2165 1
+14 2166 1
+14 2167 1
+14 2168 1
+14 2169 1
+14 2170 1
+14 2171 1
+14 2172 1
+14 2173 1
+14 2174 1
+14 2175 1
+14 2176 1
+14 2177 1
+14 2178 1
+15 1 1
+15 2 1
+15 3 1
+15 4 1
+15 5 1
+15 6 1
+15 7 1
+15 8 1
+15 9 1
+15 10 1
+15 11 1
+15 12 1
+15 13 1
+15 14 1
+15 15 1
+15 16 1
+15 17 1
+15 18 1
+15 19 1
+15 20 1
+15 21 1
+15 22 1
+15 23 1
+15 24 1
+15 25 1
+15 26 1
+15 27 1
+15 28 1
+15 29 1
+15 30 1
+15 31 1
+15 32 1
+15 33 1
+15 34 1
+15 35 1
+15 36 1
+15 37 1
+15 38 1
+15 39 1
+15 40 1
+15 41 1
+15 42 1
+15 43 1
+15 44 1
+15 45 1
+15 46 1
+15 47 1
+15 48 1
+15 49 1
+15 50 1
+15 51 1
+15 52 1
+15 53 1
+15 54 1
+15 55 1
+15 56 1
+15 57 1
+15 58 1
+15 59 1
+15 60 1
+15 61 1
+15 62 1
+15 63 1
+15 64 1
+15 65 1
+15 66 1
+15 67 1
+15 68 1
+15 69 1
+15 70 1
+15 71 1
+15 72 1
+15 73 1
+15 74 1
+15 75 1
+15 76 1
+15 77 1
+15 78 1
+15 79 1
+15 80 1
+15 81 1
+15 82 1
+15 83 1
+15 84 1
+15 85 1
+15 86 1
+15 87 1
+15 88 1
+15 89 1
+15 90 1
+15 91 1
+15 92 1
+15 93 1
+15 94 1
+15 95 1
+15 96 1
+15 97 1
+15 98 1
+15 99 1
+15 100 1
+15 101 1
+15 102 1
+15 103 1
+15 104 1
+15 105 1
+15 106 1
+15 107 1
+15 108 1
+15 109 1
+15 110 1
+15 111 1
+15 112 1
+15 113 1
+15 114 1
+15 115 1
+15 116 1
+15 117 1
+15 118 1
+15 119 1
+15 120 1
+15 331 1
+15 332 1
+15 333 1
+15 334 1
+15 335 1
+15 336 1
+15 337 1
+15 338 1
+15 339 1
+15 340 1
+15 341 1
+15 342 1
+15 343 1
+15 344 1
+15 345 1
+15 346 1
+15 347 1
+15 348 1
+15 349 1
+15 350 1
+15 351 1
+15 352 1
+15 353 1
+15 354 1
+15 355 1
+15 356 1
+15 357 1
+15 358 1
+15 359 1
+15 360 1
+15 361 1
+15 362 1
+15 363 1
+15 364 1
+15 365 1
+15 366 1
+15 367 1
+15 368 1
+15 369 1
+15 370 1
+15 371 1
+15 372 1
+15 373 1
+15 374 1
+15 375 1
+15 376 1
+15 377 1
+15 378 1
+15 379 1
+15 380 1
+15 381 1
+15 382 1
+15 383 1
+15 384 1
+15 385 1
+15 386 1
+15 387 1
+15 388 1
+15 389 1
+15 390 1
+15 391 1
+15 392 1
+15 393 1
+15 394 1
+15 395 1
+15 396 1
+15 397 1
+15 398 1
+15 399 1
+15 400 1
+15 401 1
+15 402 1
+15 403 1
+15 404 1
+15 405 1
+15 406 1
+15 407 1
+15 408 1
+15 409 1
+15 410 1
+15 411 1
+15 412 1
+15 413 1
+15 414 1
+15 415 1
+15 416 1
+15 417 1
+15 418 1
+15 419 1
+15 420 1
+15 421 1
+15 422 1
+15 423 1
+15 424 1
+15 425 1
+15 426 1
+15 427 1
+15 428 1
+15 429 1
+15 430 1
+15 431 1
+15 432 1
+15 433 1
+15 434 1
+15 435 1
+15 436 1
+15 437 1
+15 438 1
+15 439 1
+15 440 1
+15 441 1
+15 442 1
+15 443 1
+15 444 1
+15 445 1
+15 446 1
+15 447 1
+15 448 1
+15 449 1
+15 450 1
+15 451 1
+15 452 1
+15 453 1
+15 454 1
+15 455 1
+15 456 1
+15 457 1
+15 458 1
+15 459 1
+15 460 1
+15 461 1
+15 462 1
+15 463 1
+15 464 1
+15 465 1
+15 466 1
+15 467 1
+15 468 1
+15 469 1
+15 470 1
+15 471 1
+15 472 1
+15 473 1
+15 474 1
+15 475 1
+15 476 1
+15 477 1
+15 478 1
+15 479 1
+15 480 1
+15 481 1
+15 482 1
+15 483 1
+15 484 1
+15 485 1
+15 486 1
+15 487 1
+15 488 1
+15 489 1
+15 490 1
+15 491 1
+15 492 1
+15 493 1
+15 494 1
+15 495 1
+15 496 1
+15 497 1
+15 498 1
+15 499 1
+15 500 1
+15 501 1
+15 502 1
+15 503 1
+15 504 1
+15 505 1
+15 506 1
+15 507 1
+15 508 1
+15 509 1
+15 510 1
+15 511 1
+15 512 1
+15 513 1
+15 514 1
+15 515 1
+15 516 1
+15 517 1
+15 518 1
+15 519 1
+15 520 1
+15 521 1
+15 522 1
+15 523 1
+15 524 1
+15 525 1
+15 526 1
+15 527 1
+15 528 1
+15 529 1
+15 530 1
+15 531 1
+15 532 1
+15 533 1
+15 534 1
+15 535 1
+15 536 1
+15 537 1
+15 538 1
+15 539 1
+15 540 1
+15 1717 1
+15 1718 1
+15 1719 1
+15 1720 1
+15 1721 1
+15 1722 1
+15 1723 1
+15 1724 1
+15 1725 1
+15 1726 1
+15 1727 1
+15 1728 1
+15 1729 1
+15 1730 1
+15 1731 1
+15 1732 1
+15 1733 1
+15 1734 1
+15 1735 1
+15 1736 1
+15 1737 1
+15 1738 1
+15 1739 1
+15 1740 1
+15 1741 1
+15 1742 1
+15 1743 1
+15 1744 1
+15 1745 1
+15 1746 1
+15 1747 1
+15 1748 1
+15 1749 1
+15 1750 1
+15 1751 1
+15 1752 1
+15 1753 1
+15 1754 1
+15 1755 1
+15 1756 1
+15 1757 1
+15 1758 1
+15 1759 1
+15 1760 1
+15 1761 1
+15 1762 1
+15 1763 1
+15 1764 1
+15 1765 1
+15 1766 1
+15 1767 1
+15 1768 1
+15 1769 1
+15 1770 1
+15 1771 1
+15 1772 1
+15 1773 1
+15 1774 1
+15 1775 1
+15 1776 1
+15 1777 1
+15 1778 1
+15 1779 1
+15 1780 1
+15 1781 1
+15 1782 1
+15 1783 1
+15 1784 1
+15 1785 1
+15 1786 1
+15 1787 1
+15 1788 1
+15 1789 1
+15 1790 1
+15 1791 1
+15 1792 1
+15 1793 1
+15 1794 1
+15 1795 1
+15 1796 1
+15 1797 1
+15 1798 1
+15 1799 1
+15 1800 1
+15 1801 1
+15 1802 1
+15 1803 1
+15 1804 1
+15 1805 1
+15 1806 1
+15 1807 1
+15 1808 1
+15 1809 1
+15 1810 1
+15 1811 1
+15 1812 1
+15 1813 1
+15 1814 1
+15 1815 1
+15 1816 1
+15 1817 1
+15 1818 1
+15 1819 1
+15 1820 1
+15 1821 1
+15 1822 1
+15 1823 1
+15 1824 1
+15 1825 1
+15 1826 1
+15 1827 1
+15 1828 1
+15 1829 1
+15 1830 1
+15 1831 1
+15 1832 1
+15 1833 1
+15 1834 1
+15 1835 1
+15 1836 1
+15 1837 1
+15 1838 1
+15 1839 1
+15 1840 1
+15 1841 1
+15 1842 1
+15 1843 1
+15 1844 1
+15 1845 1
+15 1846 1
+15 1847 1
+15 1848 1
+15 1849 1
+15 1850 1
+15 1851 1
+15 1852 1
+15 1853 1
+15 1854 1
+15 1855 1
+15 1856 1
+15 1857 1
+15 1858 1
+15 1859 1
+15 1860 1
+15 1861 1
+15 1862 1
+15 1863 1
+15 1864 1
+15 1865 1
+15 1866 1
+15 1867 1
+15 1868 1
+15 1869 1
+15 1870 1
+15 1871 1
+15 1872 1
+15 1873 1
+15 1874 1
+15 1875 1
+15 1876 1
+15 1877 1
+15 1878 1
+15 1879 1
+15 1880 1
+15 1881 1
+15 1882 1
+15 1883 1
+15 1884 1
+15 1885 1
+15 1886 1
+15 1887 1
+15 1888 1
+15 1889 1
+15 1890 1
+15 1891 1
+15 1892 1
+15 1893 1
+15 1894 1
+15 1895 1
+15 1896 1
+15 1897 1
+15 1898 1
+15 1899 1
+15 1900 1
+15 1901 1
+15 1902 1
+15 1903 1
+15 1904 1
+15 1905 1
+15 1906 1
+15 1907 1
+15 1908 1
+15 1909 1
+15 1910 1
+15 1911 1
+15 1912 1
+15 1913 1
+15 1914 1
+15 1915 1
+15 1916 1
+15 1917 1
+15 1918 1
+15 1919 1
+15 1920 1
+15 1921 1
+15 1922 1
+15 1923 1
+15 1924 1
+15 1925 1
+15 1926 1
+15 2179 1
+15 2180 1
+15 2181 1
+15 2182 1
+15 2183 1
+15 2184 1
+15 2185 1
+15 2186 1
+15 2187 1
+15 2188 1
+15 2189 1
+15 2190 1
+15 2191 1
+15 2192 1
+15 2193 1
+15 2194 1
+15 2195 1
+15 2196 1
+15 2197 1
+15 2198 1
+15 2199 1
+15 2200 1
+15 2201 1
+15 2202 1
+15 2203 1
+15 2204 1
+15 2205 1
+15 2206 1
+15 2207 1
+15 2208 1
+15 2209 1
+15 2210 1
+15 2211 1
+15 2212 1
+15 2213 1
+15 2214 1
+15 2215 1
+15 2216 1
+15 2217 1
+15 2218 1
+15 2219 1
+15 2220 1
+15 2221 1
+15 2222 1
+15 2223 1
+15 2224 1
+15 2225 1
+15 2226 1
+15 2227 1
+15 2228 1
+15 2229 1
+15 2230 1
+15 2231 1
+15 2232 1
+15 2233 1
+15 2234 1
+15 2235 1
+15 2236 1
+15 2237 1
+15 2238 1
+15 2239 1
+15 2240 1
+15 2241 1
+15 2242 1
+15 2243 1
+15 2244 1
+15 2245 1
+15 2246 1
+15 2247 1
+15 2248 1
+15 2249 1
+15 2250 1
+15 2251 1
+15 2252 1
+15 2253 1
+15 2254 1
+15 2255 1
+15 2256 1
+15 2257 1
+15 2258 1
+15 2259 1
+15 2260 1
+15 2261 1
+15 2262 1
+15 2263 1
+15 2264 1
+15 2265 1
+15 2266 1
+15 2267 1
+15 2268 1
+15 2269 1
+15 2270 1
+15 2271 1
+15 2272 1
+15 2273 1
+15 2274 1
+15 2275 1
+15 2276 1
+15 2277 1
+15 2278 1
+15 2279 1
+15 2280 1
+15 2281 1
+15 2282 1
+15 2283 1
+15 2284 1
+15 2285 1
+15 2286 1
+15 2287 1
+15 2288 1
+15 2289 1
+15 2290 1
+15 2291 1
+15 2292 1
+15 2293 1
+15 2294 1
+15 2295 1
+15 2296 1
+15 2297 1
+15 2298 1
+15 2299 1
+15 2300 1
+15 2301 1
+15 2302 1
+15 2303 1
+15 2304 1
+15 2305 1
+15 2306 1
+15 2307 1
+15 2308 1
+15 2309 1
+15 2310 1
+15 2311 1
+15 2312 1
+15 2313 1
+15 2314 1
+15 2315 1
+15 2316 1
+15 2317 1
+15 2318 1
+15 2319 1
+15 2320 1
+15 2321 1
+15 2322 1
+15 2323 1
+15 2324 1
+15 2325 1
+15 2326 1
+15 2327 1
+15 2328 1
+15 2329 1
+15 2330 1
+15 2331 1
+15 2332 1
+15 2333 1
+15 2334 1
+15 2335 1
+15 2336 1
+15 2337 1
+15 2338 1
+15 2339 1
+15 2340 1
+15 2341 1
+15 2342 1
+15 2343 1
+15 2344 1
+15 2345 1
+15 2346 1
+15 2347 1
+15 2348 1
+15 2349 1
+15 2350 1
+15 2351 1
+15 2352 1
+15 2353 1
+15 2354 1
+15 2355 1
+15 2356 1
+15 2357 1
+15 2358 1
+15 2359 1
+15 2360 1
+15 2361 1
+15 2362 1
+15 2363 1
+15 2364 1
+15 2365 1
+15 2366 1
+15 2367 1
+15 2368 1
+15 2369 1
+15 2370 1
+15 2371 1
+15 2372 1
+15 2373 1
+15 2374 1
+15 2375 1
+15 2376 1
+15 2377 1
+15 2378 1
+15 2379 1
+15 2380 1
+15 2381 1
+15 2382 1
+15 2383 1
+15 2384 1
+15 2385 1
+15 2386 1
+15 2387 1
+15 2388 1
+15 2389 1
+15 2390 1
+15 2391 1
+15 2392 1
+15 2393 1
+15 2394 1
+15 2395 1
+15 2396 1
+15 2397 1
+15 2398 1
+15 2399 1
+15 2400 1
+15 2401 1
+15 2402 1
+15 2403 1
+15 2404 1
+15 2405 1
+15 2406 1
+15 2407 1
+15 2408 1
+15 2409 1
+15 2410 1
+15 2411 1
+15 2412 1
+15 2413 1
+15 2414 1
+15 2415 1
+15 2416 1
+15 2417 1
+15 2418 1
+15 2419 1
+15 2420 1
+15 2421 1
+15 2422 1
+15 2423 1
+15 2424 1
+15 2425 1
+15 2426 1
+15 2427 1
+15 2428 1
+15 2429 1
+15 2430 1
+16 1 1
+16 2 1
+16 3 1
+16 4 1
+16 5 1
+16 6 1
+16 7 1
+16 8 1
+16 9 1
+16 10 1
+16 11 1
+16 12 1
+16 13 1
+16 14 1
+16 15 1
+16 16 1
+16 17 1
+16 18 1
+16 19 1
+16 20 1
+16 21 1
+16 22 1
+16 23 1
+16 24 1
+16 25 1
+16 26 1
+16 27 1
+16 28 1
+16 29 1
+16 30 1
+16 31 1
+16 32 1
+16 33 1
+16 34 1
+16 35 1
+16 36 1
+16 121 1
+16 122 1
+16 123 1
+16 124 1
+16 125 1
+16 126 1
+16 127 1
+16 128 1
+16 129 1
+16 130 1
+16 131 1
+16 132 1
+16 133 1
+16 134 1
+16 135 1
+16 136 1
+16 137 1
+16 138 1
+16 139 1
+16 140 1
+16 141 1
+16 142 1
+16 143 1
+16 144 1
+16 145 1
+16 146 1
+16 147 1
+16 148 1
+16 149 1
+16 150 1
+16 151 1
+16 152 1
+16 153 1
+16 154 1
+16 155 1
+16 156 1
+16 157 1
+16 158 1
+16 159 1
+16 160 1
+16 161 1
+16 162 1
+16 163 1
+16 164 1
+16 165 1
+16 166 1
+16 167 1
+16 168 1
+16 169 1
+16 170 1
+16 171 1
+16 172 1
+16 173 1
+16 174 1
+16 175 1
+16 176 1
+16 177 1
+16 178 1
+16 179 1
+16 180 1
+16 181 1
+16 182 1
+16 183 1
+16 184 1
+16 185 1
+16 186 1
+16 187 1
+16 188 1
+16 189 1
+16 190 1
+16 191 1
+16 192 1
+16 193 1
+16 194 1
+16 195 1
+16 196 1
+16 197 1
+16 198 1
+16 199 1
+16 200 1
+16 201 1
+16 202 1
+16 203 1
+16 204 1
+16 331 1
+16 332 1
+16 333 1
+16 334 1
+16 335 1
+16 336 1
+16 337 1
+16 338 1
+16 339 1
+16 340 1
+16 341 1
+16 342 1
+16 343 1
+16 344 1
+16 345 1
+16 346 1
+16 347 1
+16 348 1
+16 349 1
+16 350 1
+16 351 1
+16 352 1
+16 353 1
+16 354 1
+16 355 1
+16 356 1
+16 357 1
+16 358 1
+16 359 1
+16 360 1
+16 361 1
+16 362 1
+16 363 1
+16 364 1
+16 365 1
+16 366 1
+16 367 1
+16 368 1
+16 369 1
+16 370 1
+16 371 1
+16 372 1
+16 373 1
+16 374 1
+16 375 1
+16 376 1
+16 377 1
+16 378 1
+16 379 1
+16 380 1
+16 381 1
+16 382 1
+16 383 1
+16 384 1
+16 385 1
+16 386 1
+16 387 1
+16 388 1
+16 389 1
+16 390 1
+16 391 1
+16 392 1
+16 393 1
+16 394 1
+16 395 1
+16 396 1
+16 397 1
+16 398 1
+16 399 1
+16 400 1
+16 401 1
+16 402 1
+16 403 1
+16 404 1
+16 405 1
+16 406 1
+16 407 1
+16 408 1
+16 409 1
+16 410 1
+16 411 1
+16 412 1
+16 413 1
+16 414 1
+16 541 1
+16 542 1
+16 543 1
+16 544 1
+16 545 1
+16 546 1
+16 547 1
+16 548 1
+16 549 1
+16 550 1
+16 551 1
+16 552 1
+16 553 1
+16 554 1
+16 555 1
+16 556 1
+16 557 1
+16 558 1
+16 559 1
+16 560 1
+16 561 1
+16 562 1
+16 563 1
+16 564 1
+16 565 1
+16 566 1
+16 567 1
+16 568 1
+16 569 1
+16 570 1
+16 571 1
+16 572 1
+16 573 1
+16 574 1
+16 575 1
+16 576 1
+16 577 1
+16 578 1
+16 579 1
+16 580 1
+16 581 1
+16 582 1
+16 583 1
+16 584 1
+16 585 1
+16 586 1
+16 587 1
+16 588 1
+16 589 1
+16 590 1
+16 591 1
+16 592 1
+16 593 1
+16 594 1
+16 595 1
+16 596 1
+16 597 1
+16 598 1
+16 599 1
+16 600 1
+16 601 1
+16 602 1
+16 603 1
+16 604 1
+16 605 1
+16 606 1
+16 607 1
+16 608 1
+16 609 1
+16 610 1
+16 611 1
+16 612 1
+16 613 1
+16 614 1
+16 615 1
+16 616 1
+16 617 1
+16 618 1
+16 619 1
+16 620 1
+16 621 1
+16 622 1
+16 623 1
+16 624 1
+16 625 1
+16 626 1
+16 627 1
+16 628 1
+16 629 1
+16 630 1
+16 631 1
+16 632 1
+16 633 1
+16 634 1
+16 635 1
+16 636 1
+16 637 1
+16 638 1
+16 639 1
+16 640 1
+16 641 1
+16 642 1
+16 643 1
+16 644 1
+16 645 1
+16 646 1
+16 647 1
+16 648 1
+16 649 1
+16 650 1
+16 651 1
+16 652 1
+16 653 1
+16 654 1
+16 655 1
+16 656 1
+16 657 1
+16 658 1
+16 659 1
+16 660 1
+16 661 1
+16 662 1
+16 663 1
+16 664 1
+16 665 1
+16 666 1
+16 1717 1
+16 1718 1
+16 1719 1
+16 1720 1
+16 1721 1
+16 1722 1
+16 1723 1
+16 1724 1
+16 1725 1
+16 1726 1
+16 1727 1
+16 1728 1
+16 1729 1
+16 1730 1
+16 1731 1
+16 1732 1
+16 1733 1
+16 1734 1
+16 1735 1
+16 1736 1
+16 1737 1
+16 1738 1
+16 1739 1
+16 1740 1
+16 1741 1
+16 1742 1
+16 1743 1
+16 1744 1
+16 1745 1
+16 1746 1
+16 1747 1
+16 1748 1
+16 1749 1
+16 1750 1
+16 1751 1
+16 1752 1
+16 1753 1
+16 1754 1
+16 1755 1
+16 1756 1
+16 1757 1
+16 1758 1
+16 1759 1
+16 1760 1
+16 1761 1
+16 1762 1
+16 1763 1
+16 1764 1
+16 1765 1
+16 1766 1
+16 1767 1
+16 1768 1
+16 1769 1
+16 1770 1
+16 1771 1
+16 1772 1
+16 1773 1
+16 1774 1
+16 1775 1
+16 1776 1
+16 1777 1
+16 1778 1
+16 1779 1
+16 1780 1
+16 1781 1
+16 1782 1
+16 1783 1
+16 1784 1
+16 1785 1
+16 1786 1
+16 1787 1
+16 1788 1
+16 1789 1
+16 1790 1
+16 1791 1
+16 1792 1
+16 1793 1
+16 1794 1
+16 1795 1
+16 1796 1
+16 1797 1
+16 1798 1
+16 1799 1
+16 1800 1
+16 1927 1
+16 1928 1
+16 1929 1
+16 1930 1
+16 1931 1
+16 1932 1
+16 1933 1
+16 1934 1
+16 1935 1
+16 1936 1
+16 1937 1
+16 1938 1
+16 1939 1
+16 1940 1
+16 1941 1
+16 1942 1
+16 1943 1
+16 1944 1
+16 1945 1
+16 1946 1
+16 1947 1
+16 1948 1
+16 1949 1
+16 1950 1
+16 1951 1
+16 1952 1
+16 1953 1
+16 1954 1
+16 1955 1
+16 1956 1
+16 1957 1
+16 1958 1
+16 1959 1
+16 1960 1
+16 1961 1
+16 1962 1
+16 1963 1
+16 1964 1
+16 1965 1
+16 1966 1
+16 1967 1
+16 1968 1
+16 1969 1
+16 1970 1
+16 1971 1
+16 1972 1
+16 1973 1
+16 1974 1
+16 1975 1
+16 1976 1
+16 1977 1
+16 1978 1
+16 1979 1
+16 1980 1
+16 1981 1
+16 1982 1
+16 1983 1
+16 1984 1
+16 1985 1
+16 1986 1
+16 1987 1
+16 1988 1
+16 1989 1
+16 1990 1
+16 1991 1
+16 1992 1
+16 1993 1
+16 1994 1
+16 1995 1
+16 1996 1
+16 1997 1
+16 1998 1
+16 1999 1
+16 2000 1
+16 2001 1
+16 2002 1
+16 2003 1
+16 2004 1
+16 2005 1
+16 2006 1
+16 2007 1
+16 2008 1
+16 2009 1
+16 2010 1
+16 2011 1
+16 2012 1
+16 2013 1
+16 2014 1
+16 2015 1
+16 2016 1
+16 2017 1
+16 2018 1
+16 2019 1
+16 2020 1
+16 2021 1
+16 2022 1
+16 2023 1
+16 2024 1
+16 2025 1
+16 2026 1
+16 2027 1
+16 2028 1
+16 2029 1
+16 2030 1
+16 2031 1
+16 2032 1
+16 2033 1
+16 2034 1
+16 2035 1
+16 2036 1
+16 2037 1
+16 2038 1
+16 2039 1
+16 2040 1
+16 2041 1
+16 2042 1
+16 2043 1
+16 2044 1
+16 2045 1
+16 2046 1
+16 2047 1
+16 2048 1
+16 2049 1
+16 2050 1
+16 2051 1
+16 2052 1
+16 2179 1
+16 2180 1
+16 2181 1
+16 2182 1
+16 2183 1
+16 2184 1
+16 2185 1
+16 2186 1
+16 2187 1
+16 2188 1
+16 2189 1
+16 2190 1
+16 2191 1
+16 2192 1
+16 2193 1
+16 2194 1
+16 2195 1
+16 2196 1
+16 2197 1
+16 2198 1
+16 2199 1
+16 2200 1
+16 2201 1
+16 2202 1
+16 2203 1
+16 2204 1
+16 2205 1
+16 2206 1
+16 2207 1
+16 2208 1
+16 2209 1
+16 2210 1
+16 2211 1
+16 2212 1
+16 2213 1
+16 2214 1
+16 2215 1
+16 2216 1
+16 2217 1
+16 2218 1
+16 2219 1
+16 2220 1
+16 2221 1
+16 2222 1
+16 2223 1
+16 2224 1
+16 2225 1
+16 2226 1
+16 2227 1
+16 2228 1
+16 2229 1
+16 2230 1
+16 2231 1
+16 2232 1
+16 2233 1
+16 2234 1
+16 2235 1
+16 2236 1
+16 2237 1
+16 2238 1
+16 2239 1
+16 2240 1
+16 2241 1
+16 2242 1
+16 2243 1
+16 2244 1
+16 2245 1
+16 2246 1
+16 2247 1
+16 2248 1
+16 2249 1
+16 2250 1
+16 2251 1
+16 2252 1
+16 2253 1
+16 2254 1
+16 2255 1
+16 2256 1
+16 2257 1
+16 2258 1
+16 2259 1
+16 2260 1
+16 2261 1
+16 2262 1
+16 2263 1
+16 2264 1
+16 2265 1
+16 2266 1
+16 2267 1
+16 2268 1
+16 2269 1
+16 2270 1
+16 2271 1
+16 2272 1
+16 2273 1
+16 2274 1
+16 2275 1
+16 2276 1
+16 2277 1
+16 2278 1
+16 2279 1
+16 2280 1
+16 2281 1
+16 2282 1
+16 2283 1
+16 2284 1
+16 2285 1
+16 2286 1
+16 2287 1
+16 2288 1
+16 2289 1
+16 2290 1
+16 2291 1
+16 2292 1
+16 2293 1
+16 2294 1
+16 2295 1
+16 2296 1
+16 2297 1
+16 2298 1
+16 2299 1
+16 2300 1
+16 2301 1
+16 2302 1
+16 2303 1
+16 2304 1
+16 2431 1
+16 2432 1
+16 2433 1
+16 2434 1
+16 2435 1
+16 2436 1
+16 2437 1
+16 2438 1
+16 2439 1
+16 2440 1
+16 2441 1
+16 2442 1
+16 2443 1
+16 2444 1
+16 2445 1
+16 2446 1
+16 2447 1
+16 2448 1
+16 2449 1
+16 2450 1
+16 2451 1
+16 2452 1
+16 2453 1
+16 2454 1
+16 2455 1
+16 2456 1
+16 2457 1
+16 2458 1
+16 2459 1
+16 2460 1
+16 2461 1
+16 2462 1
+16 2463 1
+16 2464 1
+16 2465 1
+16 2466 1
+16 2467 1
+16 2468 1
+16 2469 1
+16 2470 1
+16 2471 1
+16 2472 1
+16 2473 1
+16 2474 1
+16 2475 1
+16 2476 1
+16 2477 1
+16 2478 1
+16 2479 1
+16 2480 1
+16 2481 1
+16 2482 1
+16 2483 1
+16 2484 1
+16 2485 1
+16 2486 1
+16 2487 1
+16 2488 1
+16 2489 1
+16 2490 1
+16 2491 1
+16 2492 1
+16 2493 1
+16 2494 1
+16 2495 1
+16 2496 1
+16 2497 1
+16 2498 1
+16 2499 1
+16 2500 1
+16 2501 1
+16 2502 1
+16 2503 1
+16 2504 1
+16 2505 1
+16 2506 1
+16 2507 1
+16 2508 1
+16 2509 1
+16 2510 1
+16 2511 1
+16 2512 1
+16 2513 1
+16 2514 1
+16 2515 1
+16 2516 1
+16 2517 1
+16 2518 1
+16 2519 1
+16 2520 1
+16 2521 1
+16 2522 1
+16 2523 1
+16 2524 1
+16 2525 1
+16 2526 1
+16 2527 1
+16 2528 1
+16 2529 1
+16 2530 1
+16 2531 1
+16 2532 1
+16 2533 1
+16 2534 1
+16 2535 1
+16 2536 1
+16 2537 1
+16 2538 1
+16 2539 1
+16 2540 1
+16 2541 1
+16 2542 1
+16 2543 1
+16 2544 1
+16 2545 1
+16 2546 1
+16 2547 1
+16 2548 1
+16 2549 1
+16 2550 1
+16 2551 1
+16 2552 1
+16 2553 1
+16 2554 1
+16 2555 1
+16 2556 1
+17 1 1
+17 2 1
+17 3 1
+17 4 1
+17 5 1
+17 6 1
+17 7 1
+17 8 1
+17 37 1
+17 38 1
+17 39 1
+17 40 1
+17 41 1
+17 42 1
+17 43 1
+17 44 1
+17 45 1
+17 46 1
+17 47 1
+17 48 1
+17 49 1
+17 50 1
+17 51 1
+17 52 1
+17 53 1
+17 54 1
+17 55 1
+17 56 1
+17 57 1
+17 58 1
+17 59 1
+17 60 1
+17 61 1
+17 62 1
+17 63 1
+17 64 1
+17 121 1
+17 122 1
+17 123 1
+17 124 1
+17 125 1
+17 126 1
+17 127 1
+17 128 1
+17 129 1
+17 130 1
+17 131 1
+17 132 1
+17 133 1
+17 134 1
+17 135 1
+17 136 1
+17 137 1
+17 138 1
+17 139 1
+17 140 1
+17 141 1
+17 142 1
+17 143 1
+17 144 1
+17 145 1
+17 146 1
+17 147 1
+17 148 1
+17 205 1
+17 206 1
+17 207 1
+17 208 1
+17 209 1
+17 210 1
+17 211 1
+17 212 1
+17 213 1
+17 214 1
+17 215 1
+17 216 1
+17 217 1
+17 218 1
+17 219 1
+17 220 1
+17 221 1
+17 222 1
+17 223 1
+17 224 1
+17 225 1
+17 226 1
+17 227 1
+17 228 1
+17 229 1
+17 230 1
+17 231 1
+17 232 1
+17 233 1
+17 234 1
+17 235 1
+17 236 1
+17 237 1
+17 238 1
+17 239 1
+17 240 1
+17 241 1
+17 242 1
+17 243 1
+17 244 1
+17 245 1
+17 246 1
+17 247 1
+17 248 1
+17 249 1
+17 250 1
+17 251 1
+17 252 1
+17 253 1
+17 254 1
+17 255 1
+17 256 1
+17 257 1
+17 258 1
+17 259 1
+17 260 1
+17 331 1
+17 332 1
+17 333 1
+17 334 1
+17 335 1
+17 336 1
+17 337 1
+17 338 1
+17 339 1
+17 340 1
+17 341 1
+17 342 1
+17 343 1
+17 344 1
+17 345 1
+17 346 1
+17 347 1
+17 348 1
+17 349 1
+17 350 1
+17 351 1
+17 352 1
+17 353 1
+17 354 1
+17 355 1
+17 356 1
+17 357 1
+17 358 1
+17 415 1
+17 416 1
+17 417 1
+17 418 1
+17 419 1
+17 420 1
+17 421 1
+17 422 1
+17 423 1
+17 424 1
+17 425 1
+17 426 1
+17 427 1
+17 428 1
+17 429 1
+17 430 1
+17 431 1
+17 432 1
+17 433 1
+17 434 1
+17 435 1
+17 436 1
+17 437 1
+17 438 1
+17 439 1
+17 440 1
+17 441 1
+17 442 1
+17 443 1
+17 444 1
+17 445 1
+17 446 1
+17 447 1
+17 448 1
+17 449 1
+17 450 1
+17 451 1
+17 452 1
+17 453 1
+17 454 1
+17 455 1
+17 456 1
+17 457 1
+17 458 1
+17 459 1
+17 460 1
+17 461 1
+17 462 1
+17 463 1
+17 464 1
+17 465 1
+17 466 1
+17 467 1
+17 468 1
+17 469 1
+17 470 1
+17 541 1
+17 542 1
+17 543 1
+17 544 1
+17 545 1
+17 546 1
+17 547 1
+17 548 1
+17 549 1
+17 550 1
+17 551 1
+17 552 1
+17 553 1
+17 554 1
+17 555 1
+17 556 1
+17 557 1
+17 558 1
+17 559 1
+17 560 1
+17 561 1
+17 562 1
+17 563 1
+17 564 1
+17 565 1
+17 566 1
+17 567 1
+17 568 1
+17 569 1
+17 570 1
+17 571 1
+17 572 1
+17 573 1
+17 574 1
+17 575 1
+17 576 1
+17 577 1
+17 578 1
+17 579 1
+17 580 1
+17 581 1
+17 582 1
+17 583 1
+17 584 1
+17 585 1
+17 586 1
+17 587 1
+17 588 1
+17 589 1
+17 590 1
+17 591 1
+17 592 1
+17 593 1
+17 594 1
+17 595 1
+17 596 1
+17 667 1
+17 668 1
+17 669 1
+17 670 1
+17 671 1
+17 672 1
+17 673 1
+17 674 1
+17 675 1
+17 676 1
+17 677 1
+17 678 1
+17 679 1
+17 680 1
+17 681 1
+17 682 1
+17 683 1
+17 684 1
+17 685 1
+17 686 1
+17 687 1
+17 688 1
+17 689 1
+17 690 1
+17 691 1
+17 692 1
+17 693 1
+17 694 1
+17 695 1
+17 696 1
+17 697 1
+17 698 1
+17 699 1
+17 700 1
+17 701 1
+17 702 1
+17 703 1
+17 704 1
+17 705 1
+17 706 1
+17 707 1
+17 708 1
+17 709 1
+17 710 1
+17 711 1
+17 712 1
+17 713 1
+17 714 1
+17 715 1
+17 716 1
+17 717 1
+17 718 1
+17 719 1
+17 720 1
+17 721 1
+17 722 1
+17 723 1
+17 724 1
+17 725 1
+17 726 1
+17 727 1
+17 728 1
+17 729 1
+17 730 1
+17 731 1
+17 732 1
+17 733 1
+17 734 1
+17 735 1
+17 736 1
+17 1717 1
+17 1718 1
+17 1719 1
+17 1720 1
+17 1721 1
+17 1722 1
+17 1723 1
+17 1724 1
+17 1725 1
+17 1726 1
+17 1727 1
+17 1728 1
+17 1729 1
+17 1730 1
+17 1731 1
+17 1732 1
+17 1733 1
+17 1734 1
+17 1735 1
+17 1736 1
+17 1737 1
+17 1738 1
+17 1739 1
+17 1740 1
+17 1741 1
+17 1742 1
+17 1743 1
+17 1744 1
+17 1801 1
+17 1802 1
+17 1803 1
+17 1804 1
+17 1805 1
+17 1806 1
+17 1807 1
+17 1808 1
+17 1809 1
+17 1810 1
+17 1811 1
+17 1812 1
+17 1813 1
+17 1814 1
+17 1815 1
+17 1816 1
+17 1817 1
+17 1818 1
+17 1819 1
+17 1820 1
+17 1821 1
+17 1822 1
+17 1823 1
+17 1824 1
+17 1825 1
+17 1826 1
+17 1827 1
+17 1828 1
+17 1829 1
+17 1830 1
+17 1831 1
+17 1832 1
+17 1833 1
+17 1834 1
+17 1835 1
+17 1836 1
+17 1837 1
+17 1838 1
+17 1839 1
+17 1840 1
+17 1841 1
+17 1842 1
+17 1843 1
+17 1844 1
+17 1845 1
+17 1846 1
+17 1847 1
+17 1848 1
+17 1849 1
+17 1850 1
+17 1851 1
+17 1852 1
+17 1853 1
+17 1854 1
+17 1855 1
+17 1856 1
+17 1927 1
+17 1928 1
+17 1929 1
+17 1930 1
+17 1931 1
+17 1932 1
+17 1933 1
+17 1934 1
+17 1935 1
+17 1936 1
+17 1937 1
+17 1938 1
+17 1939 1
+17 1940 1
+17 1941 1
+17 1942 1
+17 1943 1
+17 1944 1
+17 1945 1
+17 1946 1
+17 1947 1
+17 1948 1
+17 1949 1
+17 1950 1
+17 1951 1
+17 1952 1
+17 1953 1
+17 1954 1
+17 1955 1
+17 1956 1
+17 1957 1
+17 1958 1
+17 1959 1
+17 1960 1
+17 1961 1
+17 1962 1
+17 1963 1
+17 1964 1
+17 1965 1
+17 1966 1
+17 1967 1
+17 1968 1
+17 1969 1
+17 1970 1
+17 1971 1
+17 1972 1
+17 1973 1
+17 1974 1
+17 1975 1
+17 1976 1
+17 1977 1
+17 1978 1
+17 1979 1
+17 1980 1
+17 1981 1
+17 1982 1
+17 2053 1
+17 2054 1
+17 2055 1
+17 2056 1
+17 2057 1
+17 2058 1
+17 2059 1
+17 2060 1
+17 2061 1
+17 2062 1
+17 2063 1
+17 2064 1
+17 2065 1
+17 2066 1
+17 2067 1
+17 2068 1
+17 2069 1
+17 2070 1
+17 2071 1
+17 2072 1
+17 2073 1
+17 2074 1
+17 2075 1
+17 2076 1
+17 2077 1
+17 2078 1
+17 2079 1
+17 2080 1
+17 2081 1
+17 2082 1
+17 2083 1
+17 2084 1
+17 2085 1
+17 2086 1
+17 2087 1
+17 2088 1
+17 2089 1
+17 2090 1
+17 2091 1
+17 2092 1
+17 2093 1
+17 2094 1
+17 2095 1
+17 2096 1
+17 2097 1
+17 2098 1
+17 2099 1
+17 2100 1
+17 2101 1
+17 2102 1
+17 2103 1
+17 2104 1
+17 2105 1
+17 2106 1
+17 2107 1
+17 2108 1
+17 2109 1
+17 2110 1
+17 2111 1
+17 2112 1
+17 2113 1
+17 2114 1
+17 2115 1
+17 2116 1
+17 2117 1
+17 2118 1
+17 2119 1
+17 2120 1
+17 2121 1
+17 2122 1
+17 2179 1
+17 2180 1
+17 2181 1
+17 2182 1
+17 2183 1
+17 2184 1
+17 2185 1
+17 2186 1
+17 2187 1
+17 2188 1
+17 2189 1
+17 2190 1
+17 2191 1
+17 2192 1
+17 2193 1
+17 2194 1
+17 2195 1
+17 2196 1
+17 2197 1
+17 2198 1
+17 2199 1
+17 2200 1
+17 2201 1
+17 2202 1
+17 2203 1
+17 2204 1
+17 2205 1
+17 2206 1
+17 2207 1
+17 2208 1
+17 2209 1
+17 2210 1
+17 2211 1
+17 2212 1
+17 2213 1
+17 2214 1
+17 2215 1
+17 2216 1
+17 2217 1
+17 2218 1
+17 2219 1
+17 2220 1
+17 2221 1
+17 2222 1
+17 2223 1
+17 2224 1
+17 2225 1
+17 2226 1
+17 2227 1
+17 2228 1
+17 2229 1
+17 2230 1
+17 2231 1
+17 2232 1
+17 2233 1
+17 2234 1
+17 2305 1
+17 2306 1
+17 2307 1
+17 2308 1
+17 2309 1
+17 2310 1
+17 2311 1
+17 2312 1
+17 2313 1
+17 2314 1
+17 2315 1
+17 2316 1
+17 2317 1
+17 2318 1
+17 2319 1
+17 2320 1
+17 2321 1
+17 2322 1
+17 2323 1
+17 2324 1
+17 2325 1
+17 2326 1
+17 2327 1
+17 2328 1
+17 2329 1
+17 2330 1
+17 2331 1
+17 2332 1
+17 2333 1
+17 2334 1
+17 2335 1
+17 2336 1
+17 2337 1
+17 2338 1
+17 2339 1
+17 2340 1
+17 2341 1
+17 2342 1
+17 2343 1
+17 2344 1
+17 2345 1
+17 2346 1
+17 2347 1
+17 2348 1
+17 2349 1
+17 2350 1
+17 2351 1
+17 2352 1
+17 2353 1
+17 2354 1
+17 2355 1
+17 2356 1
+17 2357 1
+17 2358 1
+17 2359 1
+17 2360 1
+17 2361 1
+17 2362 1
+17 2363 1
+17 2364 1
+17 2365 1
+17 2366 1
+17 2367 1
+17 2368 1
+17 2369 1
+17 2370 1
+17 2371 1
+17 2372 1
+17 2373 1
+17 2374 1
+17 2431 1
+17 2432 1
+17 2433 1
+17 2434 1
+17 2435 1
+17 2436 1
+17 2437 1
+17 2438 1
+17 2439 1
+17 2440 1
+17 2441 1
+17 2442 1
+17 2443 1
+17 2444 1
+17 2445 1
+17 2446 1
+17 2447 1
+17 2448 1
+17 2449 1
+17 2450 1
+17 2451 1
+17 2452 1
+17 2453 1
+17 2454 1
+17 2455 1
+17 2456 1
+17 2457 1
+17 2458 1
+17 2459 1
+17 2460 1
+17 2461 1
+17 2462 1
+17 2463 1
+17 2464 1
+17 2465 1
+17 2466 1
+17 2467 1
+17 2468 1
+17 2469 1
+17 2470 1
+17 2471 1
+17 2472 1
+17 2473 1
+17 2474 1
+17 2475 1
+17 2476 1
+17 2477 1
+17 2478 1
+17 2479 1
+17 2480 1
+17 2481 1
+17 2482 1
+17 2483 1
+17 2484 1
+17 2485 1
+17 2486 1
+17 2487 1
+17 2488 1
+17 2489 1
+17 2490 1
+17 2491 1
+17 2492 1
+17 2493 1
+17 2494 1
+17 2495 1
+17 2496 1
+17 2497 1
+17 2498 1
+17 2499 1
+17 2500 1
+17 2557 1
+17 2558 1
+17 2559 1
+17 2560 1
+17 2561 1
+17 2562 1
+17 2563 1
+17 2564 1
+17 2565 1
+17 2566 1
+17 2567 1
+17 2568 1
+17 2569 1
+17 2570 1
+17 2571 1
+17 2572 1
+17 2573 1
+17 2574 1
+17 2575 1
+17 2576 1
+17 2577 1
+17 2578 1
+17 2579 1
+17 2580 1
+17 2581 1
+17 2582 1
+17 2583 1
+17 2584 1
+17 2585 1
+17 2586 1
+17 2587 1
+17 2588 1
+17 2589 1
+17 2590 1
+17 2591 1
+17 2592 1
+17 2593 1
+17 2594 1
+17 2595 1
+17 2596 1
+17 2597 1
+17 2598 1
+17 2599 1
+17 2600 1
+17 2601 1
+17 2602 1
+17 2603 1
+17 2604 1
+17 2605 1
+17 2606 1
+17 2607 1
+17 2608 1
+17 2609 1
+17 2610 1
+17 2611 1
+17 2612 1
+18 1 1
+18 9 1
+18 10 1
+18 11 1
+18 12 1
+18 13 1
+18 14 1
+18 15 1
+18 37 1
+18 38 1
+18 39 1
+18 40 1
+18 41 1
+18 42 1
+18 43 1
+18 65 1
+18 66 1
+18 67 1
+18 68 1
+18 69 1
+18 70 1
+18 71 1
+18 72 1
+18 73 1
+18 74 1
+18 75 1
+18 76 1
+18 77 1
+18 78 1
+18 79 1
+18 80 1
+18 81 1
+18 82 1
+18 83 1
+18 84 1
+18 85 1
+18 121 1
+18 122 1
+18 123 1
+18 124 1
+18 125 1
+18 126 1
+18 127 1
+18 149 1
+18 150 1
+18 151 1
+18 152 1
+18 153 1
+18 154 1
+18 155 1
+18 156 1
+18 157 1
+18 158 1
+18 159 1
+18 160 1
+18 161 1
+18 162 1
+18 163 1
+18 164 1
+18 165 1
+18 166 1
+18 167 1
+18 168 1
+18 169 1
+18 205 1
+18 206 1
+18 207 1
+18 208 1
+18 209 1
+18 210 1
+18 211 1
+18 212 1
+18 213 1
+18 214 1
+18 215 1
+18 216 1
+18 217 1
+18 218 1
+18 219 1
+18 220 1
+18 221 1
+18 222 1
+18 223 1
+18 224 1
+18 225 1
+18 261 1
+18 262 1
+18 263 1
+18 264 1
+18 265 1
+18 266 1
+18 267 1
+18 268 1
+18 269 1
+18 270 1
+18 271 1
+18 272 1
+18 273 1
+18 274 1
+18 275 1
+18 276 1
+18 277 1
+18 278 1
+18 279 1
+18 280 1
+18 281 1
+18 282 1
+18 283 1
+18 284 1
+18 285 1
+18 286 1
+18 287 1
+18 288 1
+18 289 1
+18 290 1
+18 291 1
+18 292 1
+18 293 1
+18 294 1
+18 295 1
+18 331 1
+18 332 1
+18 333 1
+18 334 1
+18 335 1
+18 336 1
+18 337 1
+18 359 1
+18 360 1
+18 361 1
+18 362 1
+18 363 1
+18 364 1
+18 365 1
+18 366 1
+18 367 1
+18 368 1
+18 369 1
+18 370 1
+18 371 1
+18 372 1
+18 373 1
+18 374 1
+18 375 1
+18 376 1
+18 377 1
+18 378 1
+18 379 1
+18 415 1
+18 416 1
+18 417 1
+18 418 1
+18 419 1
+18 420 1
+18 421 1
+18 422 1
+18 423 1
+18 424 1
+18 425 1
+18 426 1
+18 427 1
+18 428 1
+18 429 1
+18 430 1
+18 431 1
+18 432 1
+18 433 1
+18 434 1
+18 435 1
+18 471 1
+18 472 1
+18 473 1
+18 474 1
+18 475 1
+18 476 1
+18 477 1
+18 478 1
+18 479 1
+18 480 1
+18 481 1
+18 482 1
+18 483 1
+18 484 1
+18 485 1
+18 486 1
+18 487 1
+18 488 1
+18 489 1
+18 490 1
+18 491 1
+18 492 1
+18 493 1
+18 494 1
+18 495 1
+18 496 1
+18 497 1
+18 498 1
+18 499 1
+18 500 1
+18 501 1
+18 502 1
+18 503 1
+18 504 1
+18 505 1
+18 541 1
+18 542 1
+18 543 1
+18 544 1
+18 545 1
+18 546 1
+18 547 1
+18 548 1
+18 549 1
+18 550 1
+18 551 1
+18 552 1
+18 553 1
+18 554 1
+18 555 1
+18 556 1
+18 557 1
+18 558 1
+18 559 1
+18 560 1
+18 561 1
+18 597 1
+18 598 1
+18 599 1
+18 600 1
+18 601 1
+18 602 1
+18 603 1
+18 604 1
+18 605 1
+18 606 1
+18 607 1
+18 608 1
+18 609 1
+18 610 1
+18 611 1
+18 612 1
+18 613 1
+18 614 1
+18 615 1
+18 616 1
+18 617 1
+18 618 1
+18 619 1
+18 620 1
+18 621 1
+18 622 1
+18 623 1
+18 624 1
+18 625 1
+18 626 1
+18 627 1
+18 628 1
+18 629 1
+18 630 1
+18 631 1
+18 667 1
+18 668 1
+18 669 1
+18 670 1
+18 671 1
+18 672 1
+18 673 1
+18 674 1
+18 675 1
+18 676 1
+18 677 1
+18 678 1
+18 679 1
+18 680 1
+18 681 1
+18 682 1
+18 683 1
+18 684 1
+18 685 1
+18 686 1
+18 687 1
+18 688 1
+18 689 1
+18 690 1
+18 691 1
+18 692 1
+18 693 1
+18 694 1
+18 695 1
+18 696 1
+18 697 1
+18 698 1
+18 699 1
+18 700 1
+18 701 1
+18 737 1
+18 738 1
+18 739 1
+18 740 1
+18 741 1
+18 742 1
+18 743 1
+18 744 1
+18 745 1
+18 746 1
+18 747 1
+18 748 1
+18 749 1
+18 750 1
+18 751 1
+18 752 1
+18 753 1
+18 754 1
+18 755 1
+18 756 1
+18 757 1
+18 758 1
+18 759 1
+18 760 1
+18 761 1
+18 762 1
+18 763 1
+18 764 1
+18 765 1
+18 766 1
+18 767 1
+18 768 1
+18 769 1
+18 770 1
+18 771 1
+18 1717 1
+18 1718 1
+18 1719 1
+18 1720 1
+18 1721 1
+18 1722 1
+18 1723 1
+18 1745 1
+18 1746 1
+18 1747 1
+18 1748 1
+18 1749 1
+18 1750 1
+18 1751 1
+18 1752 1
+18 1753 1
+18 1754 1
+18 1755 1
+18 1756 1
+18 1757 1
+18 1758 1
+18 1759 1
+18 1760 1
+18 1761 1
+18 1762 1
+18 1763 1
+18 1764 1
+18 1765 1
+18 1801 1
+18 1802 1
+18 1803 1
+18 1804 1
+18 1805 1
+18 1806 1
+18 1807 1
+18 1808 1
+18 1809 1
+18 1810 1
+18 1811 1
+18 1812 1
+18 1813 1
+18 1814 1
+18 1815 1
+18 1816 1
+18 1817 1
+18 1818 1
+18 1819 1
+18 1820 1
+18 1821 1
+18 1857 1
+18 1858 1
+18 1859 1
+18 1860 1
+18 1861 1
+18 1862 1
+18 1863 1
+18 1864 1
+18 1865 1
+18 1866 1
+18 1867 1
+18 1868 1
+18 1869 1
+18 1870 1
+18 1871 1
+18 1872 1
+18 1873 1
+18 1874 1
+18 1875 1
+18 1876 1
+18 1877 1
+18 1878 1
+18 1879 1
+18 1880 1
+18 1881 1
+18 1882 1
+18 1883 1
+18 1884 1
+18 1885 1
+18 1886 1
+18 1887 1
+18 1888 1
+18 1889 1
+18 1890 1
+18 1891 1
+18 1927 1
+18 1928 1
+18 1929 1
+18 1930 1
+18 1931 1
+18 1932 1
+18 1933 1
+18 1934 1
+18 1935 1
+18 1936 1
+18 1937 1
+18 1938 1
+18 1939 1
+18 1940 1
+18 1941 1
+18 1942 1
+18 1943 1
+18 1944 1
+18 1945 1
+18 1946 1
+18 1947 1
+18 1983 1
+18 1984 1
+18 1985 1
+18 1986 1
+18 1987 1
+18 1988 1
+18 1989 1
+18 1990 1
+18 1991 1
+18 1992 1
+18 1993 1
+18 1994 1
+18 1995 1
+18 1996 1
+18 1997 1
+18 1998 1
+18 1999 1
+18 2000 1
+18 2001 1
+18 2002 1
+18 2003 1
+18 2004 1
+18 2005 1
+18 2006 1
+18 2007 1
+18 2008 1
+18 2009 1
+18 2010 1
+18 2011 1
+18 2012 1
+18 2013 1
+18 2014 1
+18 2015 1
+18 2016 1
+18 2017 1
+18 2053 1
+18 2054 1
+18 2055 1
+18 2056 1
+18 2057 1
+18 2058 1
+18 2059 1
+18 2060 1
+18 2061 1
+18 2062 1
+18 2063 1
+18 2064 1
+18 2065 1
+18 2066 1
+18 2067 1
+18 2068 1
+18 2069 1
+18 2070 1
+18 2071 1
+18 2072 1
+18 2073 1
+18 2074 1
+18 2075 1
+18 2076 1
+18 2077 1
+18 2078 1
+18 2079 1
+18 2080 1
+18 2081 1
+18 2082 1
+18 2083 1
+18 2084 1
+18 2085 1
+18 2086 1
+18 2087 1
+18 2123 1
+18 2124 1
+18 2125 1
+18 2126 1
+18 2127 1
+18 2128 1
+18 2129 1
+18 2130 1
+18 2131 1
+18 2132 1
+18 2133 1
+18 2134 1
+18 2135 1
+18 2136 1
+18 2137 1
+18 2138 1
+18 2139 1
+18 2140 1
+18 2141 1
+18 2142 1
+18 2143 1
+18 2144 1
+18 2145 1
+18 2146 1
+18 2147 1
+18 2148 1
+18 2149 1
+18 2150 1
+18 2151 1
+18 2152 1
+18 2153 1
+18 2154 1
+18 2155 1
+18 2156 1
+18 2157 1
+18 2179 1
+18 2180 1
+18 2181 1
+18 2182 1
+18 2183 1
+18 2184 1
+18 2185 1
+18 2186 1
+18 2187 1
+18 2188 1
+18 2189 1
+18 2190 1
+18 2191 1
+18 2192 1
+18 2193 1
+18 2194 1
+18 2195 1
+18 2196 1
+18 2197 1
+18 2198 1
+18 2199 1
+18 2235 1
+18 2236 1
+18 2237 1
+18 2238 1
+18 2239 1
+18 2240 1
+18 2241 1
+18 2242 1
+18 2243 1
+18 2244 1
+18 2245 1
+18 2246 1
+18 2247 1
+18 2248 1
+18 2249 1
+18 2250 1
+18 2251 1
+18 2252 1
+18 2253 1
+18 2254 1
+18 2255 1
+18 2256 1
+18 2257 1
+18 2258 1
+18 2259 1
+18 2260 1
+18 2261 1
+18 2262 1
+18 2263 1
+18 2264 1
+18 2265 1
+18 2266 1
+18 2267 1
+18 2268 1
+18 2269 1
+18 2305 1
+18 2306 1
+18 2307 1
+18 2308 1
+18 2309 1
+18 2310 1
+18 2311 1
+18 2312 1
+18 2313 1
+18 2314 1
+18 2315 1
+18 2316 1
+18 2317 1
+18 2318 1
+18 2319 1
+18 2320 1
+18 2321 1
+18 2322 1
+18 2323 1
+18 2324 1
+18 2325 1
+18 2326 1
+18 2327 1
+18 2328 1
+18 2329 1
+18 2330 1
+18 2331 1
+18 2332 1
+18 2333 1
+18 2334 1
+18 2335 1
+18 2336 1
+18 2337 1
+18 2338 1
+18 2339 1
+18 2375 1
+18 2376 1
+18 2377 1
+18 2378 1
+18 2379 1
+18 2380 1
+18 2381 1
+18 2382 1
+18 2383 1
+18 2384 1
+18 2385 1
+18 2386 1
+18 2387 1
+18 2388 1
+18 2389 1
+18 2390 1
+18 2391 1
+18 2392 1
+18 2393 1
+18 2394 1
+18 2395 1
+18 2396 1
+18 2397 1
+18 2398 1
+18 2399 1
+18 2400 1
+18 2401 1
+18 2402 1
+18 2403 1
+18 2404 1
+18 2405 1
+18 2406 1
+18 2407 1
+18 2408 1
+18 2409 1
+18 2431 1
+18 2432 1
+18 2433 1
+18 2434 1
+18 2435 1
+18 2436 1
+18 2437 1
+18 2438 1
+18 2439 1
+18 2440 1
+18 2441 1
+18 2442 1
+18 2443 1
+18 2444 1
+18 2445 1
+18 2446 1
+18 2447 1
+18 2448 1
+18 2449 1
+18 2450 1
+18 2451 1
+18 2452 1
+18 2453 1
+18 2454 1
+18 2455 1
+18 2456 1
+18 2457 1
+18 2458 1
+18 2459 1
+18 2460 1
+18 2461 1
+18 2462 1
+18 2463 1
+18 2464 1
+18 2465 1
+18 2501 1
+18 2502 1
+18 2503 1
+18 2504 1
+18 2505 1
+18 2506 1
+18 2507 1
+18 2508 1
+18 2509 1
+18 2510 1
+18 2511 1
+18 2512 1
+18 2513 1
+18 2514 1
+18 2515 1
+18 2516 1
+18 2517 1
+18 2518 1
+18 2519 1
+18 2520 1
+18 2521 1
+18 2522 1
+18 2523 1
+18 2524 1
+18 2525 1
+18 2526 1
+18 2527 1
+18 2528 1
+18 2529 1
+18 2530 1
+18 2531 1
+18 2532 1
+18 2533 1
+18 2534 1
+18 2535 1
+18 2557 1
+18 2558 1
+18 2559 1
+18 2560 1
+18 2561 1
+18 2562 1
+18 2563 1
+18 2564 1
+18 2565 1
+18 2566 1
+18 2567 1
+18 2568 1
+18 2569 1
+18 2570 1
+18 2571 1
+18 2572 1
+18 2573 1
+18 2574 1
+18 2575 1
+18 2576 1
+18 2577 1
+18 2578 1
+18 2579 1
+18 2580 1
+18 2581 1
+18 2582 1
+18 2583 1
+18 2584 1
+18 2585 1
+18 2586 1
+18 2587 1
+18 2588 1
+18 2589 1
+18 2590 1
+18 2591 1
+18 2613 1
+18 2614 1
+18 2615 1
+18 2616 1
+18 2617 1
+18 2618 1
+18 2619 1
+18 2620 1
+18 2621 1
+18 2622 1
+18 2623 1
+18 2624 1
+18 2625 1
+18 2626 1
+18 2627 1
+18 2628 1
+18 2629 1
+18 2630 1
+18 2631 1
+18 2632 1
+18 2633 1
+19 2 1
+19 9 1
+19 16 1
+19 17 1
+19 18 1
+19 19 1
+19 20 1
+19 21 1
+19 37 1
+19 44 1
+19 45 1
+19 46 1
+19 47 1
+19 48 1
+19 49 1
+19 65 1
+19 66 1
+19 67 1
+19 68 1
+19 69 1
+19 70 1
+19 86 1
+19 87 1
+19 88 1
+19 89 1
+19 90 1
+19 91 1
+19 92 1
+19 93 1
+19 94 1
+19 95 1
+19 96 1
+19 97 1
+19 98 1
+19 99 1
+19 100 1
+19 121 1
+19 128 1
+19 129 1
+19 130 1
+19 131 1
+19 132 1
+19 133 1
+19 149 1
+19 150 1
+19 151 1
+19 152 1
+19 153 1
+19 154 1
+19 170 1
+19 171 1
+19 172 1
+19 173 1
+19 174 1
+19 175 1
+19 176 1
+19 177 1
+19 178 1
+19 179 1
+19 180 1
+19 181 1
+19 182 1
+19 183 1
+19 184 1
+19 205 1
+19 206 1
+19 207 1
+19 208 1
+19 209 1
+19 210 1
+19 226 1
+19 227 1
+19 228 1
+19 229 1
+19 230 1
+19 231 1
+19 232 1
+19 233 1
+19 234 1
+19 235 1
+19 236 1
+19 237 1
+19 238 1
+19 239 1
+19 240 1
+19 261 1
+19 262 1
+19 263 1
+19 264 1
+19 265 1
+19 266 1
+19 267 1
+19 268 1
+19 269 1
+19 270 1
+19 271 1
+19 272 1
+19 273 1
+19 274 1
+19 275 1
+19 296 1
+19 297 1
+19 298 1
+19 299 1
+19 300 1
+19 301 1
+19 302 1
+19 303 1
+19 304 1
+19 305 1
+19 306 1
+19 307 1
+19 308 1
+19 309 1
+19 310 1
+19 311 1
+19 312 1
+19 313 1
+19 314 1
+19 315 1
+19 331 1
+19 338 1
+19 339 1
+19 340 1
+19 341 1
+19 342 1
+19 343 1
+19 359 1
+19 360 1
+19 361 1
+19 362 1
+19 363 1
+19 364 1
+19 380 1
+19 381 1
+19 382 1
+19 383 1
+19 384 1
+19 385 1
+19 386 1
+19 387 1
+19 388 1
+19 389 1
+19 390 1
+19 391 1
+19 392 1
+19 393 1
+19 394 1
+19 415 1
+19 416 1
+19 417 1
+19 418 1
+19 419 1
+19 420 1
+19 436 1
+19 437 1
+19 438 1
+19 439 1
+19 440 1
+19 441 1
+19 442 1
+19 443 1
+19 444 1
+19 445 1
+19 446 1
+19 447 1
+19 448 1
+19 449 1
+19 450 1
+19 471 1
+19 472 1
+19 473 1
+19 474 1
+19 475 1
+19 476 1
+19 477 1
+19 478 1
+19 479 1
+19 480 1
+19 481 1
+19 482 1
+19 483 1
+19 484 1
+19 485 1
+19 506 1
+19 507 1
+19 508 1
+19 509 1
+19 510 1
+19 511 1
+19 512 1
+19 513 1
+19 514 1
+19 515 1
+19 516 1
+19 517 1
+19 518 1
+19 519 1
+19 520 1
+19 521 1
+19 522 1
+19 523 1
+19 524 1
+19 525 1
+19 541 1
+19 542 1
+19 543 1
+19 544 1
+19 545 1
+19 546 1
+19 562 1
+19 563 1
+19 564 1
+19 565 1
+19 566 1
+19 567 1
+19 568 1
+19 569 1
+19 570 1
+19 571 1
+19 572 1
+19 573 1
+19 574 1
+19 575 1
+19 576 1
+19 597 1
+19 598 1
+19 599 1
+19 600 1
+19 601 1
+19 602 1
+19 603 1
+19 604 1
+19 605 1
+19 606 1
+19 607 1
+19 608 1
+19 609 1
+19 610 1
+19 611 1
+19 632 1
+19 633 1
+19 634 1
+19 635 1
+19 636 1
+19 637 1
+19 638 1
+19 639 1
+19 640 1
+19 641 1
+19 642 1
+19 643 1
+19 644 1
+19 645 1
+19 646 1
+19 647 1
+19 648 1
+19 649 1
+19 650 1
+19 651 1
+19 667 1
+19 668 1
+19 669 1
+19 670 1
+19 671 1
+19 672 1
+19 673 1
+19 674 1
+19 675 1
+19 676 1
+19 677 1
+19 678 1
+19 679 1
+19 680 1
+19 681 1
+19 702 1
+19 703 1
+19 704 1
+19 705 1
+19 706 1
+19 707 1
+19 708 1
+19 709 1
+19 710 1
+19 711 1
+19 712 1
+19 713 1
+19 714 1
+19 715 1
+19 716 1
+19 717 1
+19 718 1
+19 719 1
+19 720 1
+19 721 1
+19 737 1
+19 738 1
+19 739 1
+19 740 1
+19 741 1
+19 742 1
+19 743 1
+19 744 1
+19 745 1
+19 746 1
+19 747 1
+19 748 1
+19 749 1
+19 750 1
+19 751 1
+19 752 1
+19 753 1
+19 754 1
+19 755 1
+19 756 1
+19 772 1
+19 773 1
+19 774 1
+19 775 1
+19 776 1
+19 777 1
+19 778 1
+19 779 1
+19 780 1
+19 781 1
+19 782 1
+19 783 1
+19 784 1
+19 785 1
+19 786 1
+19 1717 1
+19 1724 1
+19 1725 1
+19 1726 1
+19 1727 1
+19 1728 1
+19 1729 1
+19 1745 1
+19 1746 1
+19 1747 1
+19 1748 1
+19 1749 1
+19 1750 1
+19 1766 1
+19 1767 1
+19 1768 1
+19 1769 1
+19 1770 1
+19 1771 1
+19 1772 1
+19 1773 1
+19 1774 1
+19 1775 1
+19 1776 1
+19 1777 1
+19 1778 1
+19 1779 1
+19 1780 1
+19 1801 1
+19 1802 1
+19 1803 1
+19 1804 1
+19 1805 1
+19 1806 1
+19 1822 1
+19 1823 1
+19 1824 1
+19 1825 1
+19 1826 1
+19 1827 1
+19 1828 1
+19 1829 1
+19 1830 1
+19 1831 1
+19 1832 1
+19 1833 1
+19 1834 1
+19 1835 1
+19 1836 1
+19 1857 1
+19 1858 1
+19 1859 1
+19 1860 1
+19 1861 1
+19 1862 1
+19 1863 1
+19 1864 1
+19 1865 1
+19 1866 1
+19 1867 1
+19 1868 1
+19 1869 1
+19 1870 1
+19 1871 1
+19 1892 1
+19 1893 1
+19 1894 1
+19 1895 1
+19 1896 1
+19 1897 1
+19 1898 1
+19 1899 1
+19 1900 1
+19 1901 1
+19 1902 1
+19 1903 1
+19 1904 1
+19 1905 1
+19 1906 1
+19 1907 1
+19 1908 1
+19 1909 1
+19 1910 1
+19 1911 1
+19 1927 1
+19 1928 1
+19 1929 1
+19 1930 1
+19 1931 1
+19 1932 1
+19 1948 1
+19 1949 1
+19 1950 1
+19 1951 1
+19 1952 1
+19 1953 1
+19 1954 1
+19 1955 1
+19 1956 1
+19 1957 1
+19 1958 1
+19 1959 1
+19 1960 1
+19 1961 1
+19 1962 1
+19 1983 1
+19 1984 1
+19 1985 1
+19 1986 1
+19 1987 1
+19 1988 1
+19 1989 1
+19 1990 1
+19 1991 1
+19 1992 1
+19 1993 1
+19 1994 1
+19 1995 1
+19 1996 1
+19 1997 1
+19 2018 1
+19 2019 1
+19 2020 1
+19 2021 1
+19 2022 1
+19 2023 1
+19 2024 1
+19 2025 1
+19 2026 1
+19 2027 1
+19 2028 1
+19 2029 1
+19 2030 1
+19 2031 1
+19 2032 1
+19 2033 1
+19 2034 1
+19 2035 1
+19 2036 1
+19 2037 1
+19 2053 1
+19 2054 1
+19 2055 1
+19 2056 1
+19 2057 1
+19 2058 1
+19 2059 1
+19 2060 1
+19 2061 1
+19 2062 1
+19 2063 1
+19 2064 1
+19 2065 1
+19 2066 1
+19 2067 1
+19 2088 1
+19 2089 1
+19 2090 1
+19 2091 1
+19 2092 1
+19 2093 1
+19 2094 1
+19 2095 1
+19 2096 1
+19 2097 1
+19 2098 1
+19 2099 1
+19 2100 1
+19 2101 1
+19 2102 1
+19 2103 1
+19 2104 1
+19 2105 1
+19 2106 1
+19 2107 1
+19 2123 1
+19 2124 1
+19 2125 1
+19 2126 1
+19 2127 1
+19 2128 1
+19 2129 1
+19 2130 1
+19 2131 1
+19 2132 1
+19 2133 1
+19 2134 1
+19 2135 1
+19 2136 1
+19 2137 1
+19 2138 1
+19 2139 1
+19 2140 1
+19 2141 1
+19 2142 1
+19 2158 1
+19 2159 1
+19 2160 1
+19 2161 1
+19 2162 1
+19 2163 1
+19 2164 1
+19 2165 1
+19 2166 1
+19 2167 1
+19 2168 1
+19 2169 1
+19 2170 1
+19 2171 1
+19 2172 1
+19 2179 1
+19 2180 1
+19 2181 1
+19 2182 1
+19 2183 1
+19 2184 1
+19 2200 1
+19 2201 1
+19 2202 1
+19 2203 1
+19 2204 1
+19 2205 1
+19 2206 1
+19 2207 1
+19 2208 1
+19 2209 1
+19 2210 1
+19 2211 1
+19 2212 1
+19 2213 1
+19 2214 1
+19 2235 1
+19 2236 1
+19 2237 1
+19 2238 1
+19 2239 1
+19 2240 1
+19 2241 1
+19 2242 1
+19 2243 1
+19 2244 1
+19 2245 1
+19 2246 1
+19 2247 1
+19 2248 1
+19 2249 1
+19 2270 1
+19 2271 1
+19 2272 1
+19 2273 1
+19 2274 1
+19 2275 1
+19 2276 1
+19 2277 1
+19 2278 1
+19 2279 1
+19 2280 1
+19 2281 1
+19 2282 1
+19 2283 1
+19 2284 1
+19 2285 1
+19 2286 1
+19 2287 1
+19 2288 1
+19 2289 1
+19 2305 1
+19 2306 1
+19 2307 1
+19 2308 1
+19 2309 1
+19 2310 1
+19 2311 1
+19 2312 1
+19 2313 1
+19 2314 1
+19 2315 1
+19 2316 1
+19 2317 1
+19 2318 1
+19 2319 1
+19 2340 1
+19 2341 1
+19 2342 1
+19 2343 1
+19 2344 1
+19 2345 1
+19 2346 1
+19 2347 1
+19 2348 1
+19 2349 1
+19 2350 1
+19 2351 1
+19 2352 1
+19 2353 1
+19 2354 1
+19 2355 1
+19 2356 1
+19 2357 1
+19 2358 1
+19 2359 1
+19 2375 1
+19 2376 1
+19 2377 1
+19 2378 1
+19 2379 1
+19 2380 1
+19 2381 1
+19 2382 1
+19 2383 1
+19 2384 1
+19 2385 1
+19 2386 1
+19 2387 1
+19 2388 1
+19 2389 1
+19 2390 1
+19 2391 1
+19 2392 1
+19 2393 1
+19 2394 1
+19 2410 1
+19 2411 1
+19 2412 1
+19 2413 1
+19 2414 1
+19 2415 1
+19 2416 1
+19 2417 1
+19 2418 1
+19 2419 1
+19 2420 1
+19 2421 1
+19 2422 1
+19 2423 1
+19 2424 1
+19 2431 1
+19 2432 1
+19 2433 1
+19 2434 1
+19 2435 1
+19 2436 1
+19 2437 1
+19 2438 1
+19 2439 1
+19 2440 1
+19 2441 1
+19 2442 1
+19 2443 1
+19 2444 1
+19 2445 1
+19 2466 1
+19 2467 1
+19 2468 1
+19 2469 1
+19 2470 1
+19 2471 1
+19 2472 1
+19 2473 1
+19 2474 1
+19 2475 1
+19 2476 1
+19 2477 1
+19 2478 1
+19 2479 1
+19 2480 1
+19 2481 1
+19 2482 1
+19 2483 1
+19 2484 1
+19 2485 1
+19 2501 1
+19 2502 1
+19 2503 1
+19 2504 1
+19 2505 1
+19 2506 1
+19 2507 1
+19 2508 1
+19 2509 1
+19 2510 1
+19 2511 1
+19 2512 1
+19 2513 1
+19 2514 1
+19 2515 1
+19 2516 1
+19 2517 1
+19 2518 1
+19 2519 1
+19 2520 1
+19 2536 1
+19 2537 1
+19 2538 1
+19 2539 1
+19 2540 1
+19 2541 1
+19 2542 1
+19 2543 1
+19 2544 1
+19 2545 1
+19 2546 1
+19 2547 1
+19 2548 1
+19 2549 1
+19 2550 1
+19 2557 1
+19 2558 1
+19 2559 1
+19 2560 1
+19 2561 1
+19 2562 1
+19 2563 1
+19 2564 1
+19 2565 1
+19 2566 1
+19 2567 1
+19 2568 1
+19 2569 1
+19 2570 1
+19 2571 1
+19 2572 1
+19 2573 1
+19 2574 1
+19 2575 1
+19 2576 1
+19 2592 1
+19 2593 1
+19 2594 1
+19 2595 1
+19 2596 1
+19 2597 1
+19 2598 1
+19 2599 1
+19 2600 1
+19 2601 1
+19 2602 1
+19 2603 1
+19 2604 1
+19 2605 1
+19 2606 1
+19 2613 1
+19 2614 1
+19 2615 1
+19 2616 1
+19 2617 1
+19 2618 1
+19 2619 1
+19 2620 1
+19 2621 1
+19 2622 1
+19 2623 1
+19 2624 1
+19 2625 1
+19 2626 1
+19 2627 1
+19 2634 1
+19 2635 1
+19 2636 1
+19 2637 1
+19 2638 1
+19 2639 1
+20 3 1
+20 10 1
+20 16 1
+20 22 1
+20 23 1
+20 24 1
+20 25 1
+20 26 1
+20 38 1
+20 44 1
+20 50 1
+20 51 1
+20 52 1
+20 53 1
+20 54 1
+20 65 1
+20 71 1
+20 72 1
+20 73 1
+20 74 1
+20 75 1
+20 86 1
+20 87 1
+20 88 1
+20 89 1
+20 90 1
+20 101 1
+20 102 1
+20 103 1
+20 104 1
+20 105 1
+20 106 1
+20 107 1
+20 108 1
+20 109 1
+20 110 1
+20 122 1
+20 128 1
+20 134 1
+20 135 1
+20 136 1
+20 137 1
+20 138 1
+20 149 1
+20 155 1
+20 156 1
+20 157 1
+20 158 1
+20 159 1
+20 170 1
+20 171 1
+20 172 1
+20 173 1
+20 174 1
+20 185 1
+20 186 1
+20 187 1
+20 188 1
+20 189 1
+20 190 1
+20 191 1
+20 192 1
+20 193 1
+20 194 1
+20 205 1
+20 211 1
+20 212 1
+20 213 1
+20 214 1
+20 215 1
+20 226 1
+20 227 1
+20 228 1
+20 229 1
+20 230 1
+20 241 1
+20 242 1
+20 243 1
+20 244 1
+20 245 1
+20 246 1
+20 247 1
+20 248 1
+20 249 1
+20 250 1
+20 261 1
+20 262 1
+20 263 1
+20 264 1
+20 265 1
+20 276 1
+20 277 1
+20 278 1
+20 279 1
+20 280 1
+20 281 1
+20 282 1
+20 283 1
+20 284 1
+20 285 1
+20 296 1
+20 297 1
+20 298 1
+20 299 1
+20 300 1
+20 301 1
+20 302 1
+20 303 1
+20 304 1
+20 305 1
+20 316 1
+20 317 1
+20 318 1
+20 319 1
+20 320 1
+20 321 1
+20 322 1
+20 323 1
+20 324 1
+20 325 1
+20 332 1
+20 338 1
+20 344 1
+20 345 1
+20 346 1
+20 347 1
+20 348 1
+20 359 1
+20 365 1
+20 366 1
+20 367 1
+20 368 1
+20 369 1
+20 380 1
+20 381 1
+20 382 1
+20 383 1
+20 384 1
+20 395 1
+20 396 1
+20 397 1
+20 398 1
+20 399 1
+20 400 1
+20 401 1
+20 402 1
+20 403 1
+20 404 1
+20 415 1
+20 421 1
+20 422 1
+20 423 1
+20 424 1
+20 425 1
+20 436 1
+20 437 1
+20 438 1
+20 439 1
+20 440 1
+20 451 1
+20 452 1
+20 453 1
+20 454 1
+20 455 1
+20 456 1
+20 457 1
+20 458 1
+20 459 1
+20 460 1
+20 471 1
+20 472 1
+20 473 1
+20 474 1
+20 475 1
+20 486 1
+20 487 1
+20 488 1
+20 489 1
+20 490 1
+20 491 1
+20 492 1
+20 493 1
+20 494 1
+20 495 1
+20 506 1
+20 507 1
+20 508 1
+20 509 1
+20 510 1
+20 511 1
+20 512 1
+20 513 1
+20 514 1
+20 515 1
+20 526 1
+20 527 1
+20 528 1
+20 529 1
+20 530 1
+20 531 1
+20 532 1
+20 533 1
+20 534 1
+20 535 1
+20 541 1
+20 547 1
+20 548 1
+20 549 1
+20 550 1
+20 551 1
+20 562 1
+20 563 1
+20 564 1
+20 565 1
+20 566 1
+20 577 1
+20 578 1
+20 579 1
+20 580 1
+20 581 1
+20 582 1
+20 583 1
+20 584 1
+20 585 1
+20 586 1
+20 597 1
+20 598 1
+20 599 1
+20 600 1
+20 601 1
+20 612 1
+20 613 1
+20 614 1
+20 615 1
+20 616 1
+20 617 1
+20 618 1
+20 619 1
+20 620 1
+20 621 1
+20 632 1
+20 633 1
+20 634 1
+20 635 1
+20 636 1
+20 637 1
+20 638 1
+20 639 1
+20 640 1
+20 641 1
+20 652 1
+20 653 1
+20 654 1
+20 655 1
+20 656 1
+20 657 1
+20 658 1
+20 659 1
+20 660 1
+20 661 1
+20 667 1
+20 668 1
+20 669 1
+20 670 1
+20 671 1
+20 682 1
+20 683 1
+20 684 1
+20 685 1
+20 686 1
+20 687 1
+20 688 1
+20 689 1
+20 690 1
+20 691 1
+20 702 1
+20 703 1
+20 704 1
+20 705 1
+20 706 1
+20 707 1
+20 708 1
+20 709 1
+20 710 1
+20 711 1
+20 722 1
+20 723 1
+20 724 1
+20 725 1
+20 726 1
+20 727 1
+20 728 1
+20 729 1
+20 730 1
+20 731 1
+20 737 1
+20 738 1
+20 739 1
+20 740 1
+20 741 1
+20 742 1
+20 743 1
+20 744 1
+20 745 1
+20 746 1
+20 757 1
+20 758 1
+20 759 1
+20 760 1
+20 761 1
+20 762 1
+20 763 1
+20 764 1
+20 765 1
+20 766 1
+20 772 1
+20 773 1
+20 774 1
+20 775 1
+20 776 1
+20 777 1
+20 778 1
+20 779 1
+20 780 1
+20 781 1
+20 787 1
+20 788 1
+20 789 1
+20 790 1
+20 791 1
+20 1718 1
+20 1724 1
+20 1730 1
+20 1731 1
+20 1732 1
+20 1733 1
+20 1734 1
+20 1745 1
+20 1751 1
+20 1752 1
+20 1753 1
+20 1754 1
+20 1755 1
+20 1766 1
+20 1767 1
+20 1768 1
+20 1769 1
+20 1770 1
+20 1781 1
+20 1782 1
+20 1783 1
+20 1784 1
+20 1785 1
+20 1786 1
+20 1787 1
+20 1788 1
+20 1789 1
+20 1790 1
+20 1801 1
+20 1807 1
+20 1808 1
+20 1809 1
+20 1810 1
+20 1811 1
+20 1822 1
+20 1823 1
+20 1824 1
+20 1825 1
+20 1826 1
+20 1837 1
+20 1838 1
+20 1839 1
+20 1840 1
+20 1841 1
+20 1842 1
+20 1843 1
+20 1844 1
+20 1845 1
+20 1846 1
+20 1857 1
+20 1858 1
+20 1859 1
+20 1860 1
+20 1861 1
+20 1872 1
+20 1873 1
+20 1874 1
+20 1875 1
+20 1876 1
+20 1877 1
+20 1878 1
+20 1879 1
+20 1880 1
+20 1881 1
+20 1892 1
+20 1893 1
+20 1894 1
+20 1895 1
+20 1896 1
+20 1897 1
+20 1898 1
+20 1899 1
+20 1900 1
+20 1901 1
+20 1912 1
+20 1913 1
+20 1914 1
+20 1915 1
+20 1916 1
+20 1917 1
+20 1918 1
+20 1919 1
+20 1920 1
+20 1921 1
+20 1927 1
+20 1933 1
+20 1934 1
+20 1935 1
+20 1936 1
+20 1937 1
+20 1948 1
+20 1949 1
+20 1950 1
+20 1951 1
+20 1952 1
+20 1963 1
+20 1964 1
+20 1965 1
+20 1966 1
+20 1967 1
+20 1968 1
+20 1969 1
+20 1970 1
+20 1971 1
+20 1972 1
+20 1983 1
+20 1984 1
+20 1985 1
+20 1986 1
+20 1987 1
+20 1998 1
+20 1999 1
+20 2000 1
+20 2001 1
+20 2002 1
+20 2003 1
+20 2004 1
+20 2005 1
+20 2006 1
+20 2007 1
+20 2018 1
+20 2019 1
+20 2020 1
+20 2021 1
+20 2022 1
+20 2023 1
+20 2024 1
+20 2025 1
+20 2026 1
+20 2027 1
+20 2038 1
+20 2039 1
+20 2040 1
+20 2041 1
+20 2042 1
+20 2043 1
+20 2044 1
+20 2045 1
+20 2046 1
+20 2047 1
+20 2053 1
+20 2054 1
+20 2055 1
+20 2056 1
+20 2057 1
+20 2068 1
+20 2069 1
+20 2070 1
+20 2071 1
+20 2072 1
+20 2073 1
+20 2074 1
+20 2075 1
+20 2076 1
+20 2077 1
+20 2088 1
+20 2089 1
+20 2090 1
+20 2091 1
+20 2092 1
+20 2093 1
+20 2094 1
+20 2095 1
+20 2096 1
+20 2097 1
+20 2108 1
+20 2109 1
+20 2110 1
+20 2111 1
+20 2112 1
+20 2113 1
+20 2114 1
+20 2115 1
+20 2116 1
+20 2117 1
+20 2123 1
+20 2124 1
+20 2125 1
+20 2126 1
+20 2127 1
+20 2128 1
+20 2129 1
+20 2130 1
+20 2131 1
+20 2132 1
+20 2143 1
+20 2144 1
+20 2145 1
+20 2146 1
+20 2147 1
+20 2148 1
+20 2149 1
+20 2150 1
+20 2151 1
+20 2152 1
+20 2158 1
+20 2159 1
+20 2160 1
+20 2161 1
+20 2162 1
+20 2163 1
+20 2164 1
+20 2165 1
+20 2166 1
+20 2167 1
+20 2173 1
+20 2174 1
+20 2175 1
+20 2176 1
+20 2177 1
+20 2179 1
+20 2185 1
+20 2186 1
+20 2187 1
+20 2188 1
+20 2189 1
+20 2200 1
+20 2201 1
+20 2202 1
+20 2203 1
+20 2204 1
+20 2215 1
+20 2216 1
+20 2217 1
+20 2218 1
+20 2219 1
+20 2220 1
+20 2221 1
+20 2222 1
+20 2223 1
+20 2224 1
+20 2235 1
+20 2236 1
+20 2237 1
+20 2238 1
+20 2239 1
+20 2250 1
+20 2251 1
+20 2252 1
+20 2253 1
+20 2254 1
+20 2255 1
+20 2256 1
+20 2257 1
+20 2258 1
+20 2259 1
+20 2270 1
+20 2271 1
+20 2272 1
+20 2273 1
+20 2274 1
+20 2275 1
+20 2276 1
+20 2277 1
+20 2278 1
+20 2279 1
+20 2290 1
+20 2291 1
+20 2292 1
+20 2293 1
+20 2294 1
+20 2295 1
+20 2296 1
+20 2297 1
+20 2298 1
+20 2299 1
+20 2305 1
+20 2306 1
+20 2307 1
+20 2308 1
+20 2309 1
+20 2320 1
+20 2321 1
+20 2322 1
+20 2323 1
+20 2324 1
+20 2325 1
+20 2326 1
+20 2327 1
+20 2328 1
+20 2329 1
+20 2340 1
+20 2341 1
+20 2342 1
+20 2343 1
+20 2344 1
+20 2345 1
+20 2346 1
+20 2347 1
+20 2348 1
+20 2349 1
+20 2360 1
+20 2361 1
+20 2362 1
+20 2363 1
+20 2364 1
+20 2365 1
+20 2366 1
+20 2367 1
+20 2368 1
+20 2369 1
+20 2375 1
+20 2376 1
+20 2377 1
+20 2378 1
+20 2379 1
+20 2380 1
+20 2381 1
+20 2382 1
+20 2383 1
+20 2384 1
+20 2395 1
+20 2396 1
+20 2397 1
+20 2398 1
+20 2399 1
+20 2400 1
+20 2401 1
+20 2402 1
+20 2403 1
+20 2404 1
+20 2410 1
+20 2411 1
+20 2412 1
+20 2413 1
+20 2414 1
+20 2415 1
+20 2416 1
+20 2417 1
+20 2418 1
+20 2419 1
+20 2425 1
+20 2426 1
+20 2427 1
+20 2428 1
+20 2429 1
+20 2431 1
+20 2432 1
+20 2433 1
+20 2434 1
+20 2435 1
+20 2446 1
+20 2447 1
+20 2448 1
+20 2449 1
+20 2450 1
+20 2451 1
+20 2452 1
+20 2453 1
+20 2454 1
+20 2455 1
+20 2466 1
+20 2467 1
+20 2468 1
+20 2469 1
+20 2470 1
+20 2471 1
+20 2472 1
+20 2473 1
+20 2474 1
+20 2475 1
+20 2486 1
+20 2487 1
+20 2488 1
+20 2489 1
+20 2490 1
+20 2491 1
+20 2492 1
+20 2493 1
+20 2494 1
+20 2495 1
+20 2501 1
+20 2502 1
+20 2503 1
+20 2504 1
+20 2505 1
+20 2506 1
+20 2507 1
+20 2508 1
+20 2509 1
+20 2510 1
+20 2521 1
+20 2522 1
+20 2523 1
+20 2524 1
+20 2525 1
+20 2526 1
+20 2527 1
+20 2528 1
+20 2529 1
+20 2530 1
+20 2536 1
+20 2537 1
+20 2538 1
+20 2539 1
+20 2540 1
+20 2541 1
+20 2542 1
+20 2543 1
+20 2544 1
+20 2545 1
+20 2551 1
+20 2552 1
+20 2553 1
+20 2554 1
+20 2555 1
+20 2557 1
+20 2558 1
+20 2559 1
+20 2560 1
+20 2561 1
+20 2562 1
+20 2563 1
+20 2564 1
+20 2565 1
+20 2566 1
+20 2577 1
+20 2578 1
+20 2579 1
+20 2580 1
+20 2581 1
+20 2582 1
+20 2583 1
+20 2584 1
+20 2585 1
+20 2586 1
+20 2592 1
+20 2593 1
+20 2594 1
+20 2595 1
+20 2596 1
+20 2597 1
+20 2598 1
+20 2599 1
+20 2600 1
+20 2601 1
+20 2607 1
+20 2608 1
+20 2609 1
+20 2610 1
+20 2611 1
+20 2613 1
+20 2614 1
+20 2615 1
+20 2616 1
+20 2617 1
+20 2618 1
+20 2619 1
+20 2620 1
+20 2621 1
+20 2622 1
+20 2628 1
+20 2629 1
+20 2630 1
+20 2631 1
+20 2632 1
+20 2634 1
+20 2635 1
+20 2636 1
+20 2637 1
+20 2638 1
+20 2640 1
+21 4 1
+21 11 1
+21 17 1
+21 22 1
+21 27 1
+21 28 1
+21 29 1
+21 30 1
+21 39 1
+21 45 1
+21 50 1
+21 55 1
+21 56 1
+21 57 1
+21 58 1
+21 66 1
+21 71 1
+21 76 1
+21 77 1
+21 78 1
+21 79 1
+21 86 1
+21 91 1
+21 92 1
+21 93 1
+21 94 1
+21 101 1
+21 102 1
+21 103 1
+21 104 1
+21 111 1
+21 112 1
+21 113 1
+21 114 1
+21 115 1
+21 116 1
+21 123 1
+21 129 1
+21 134 1
+21 139 1
+21 140 1
+21 141 1
+21 142 1
+21 150 1
+21 155 1
+21 160 1
+21 161 1
+21 162 1
+21 163 1
+21 170 1
+21 175 1
+21 176 1
+21 177 1
+21 178 1
+21 185 1
+21 186 1
+21 187 1
+21 188 1
+21 195 1
+21 196 1
+21 197 1
+21 198 1
+21 199 1
+21 200 1
+21 206 1
+21 211 1
+21 216 1
+21 217 1
+21 218 1
+21 219 1
+21 226 1
+21 231 1
+21 232 1
+21 233 1
+21 234 1
+21 241 1
+21 242 1
+21 243 1
+21 244 1
+21 251 1
+21 252 1
+21 253 1
+21 254 1
+21 255 1
+21 256 1
+21 261 1
+21 266 1
+21 267 1
+21 268 1
+21 269 1
+21 276 1
+21 277 1
+21 278 1
+21 279 1
+21 286 1
+21 287 1
+21 288 1
+21 289 1
+21 290 1
+21 291 1
+21 296 1
+21 297 1
+21 298 1
+21 299 1
+21 306 1
+21 307 1
+21 308 1
+21 309 1
+21 310 1
+21 311 1
+21 316 1
+21 317 1
+21 318 1
+21 319 1
+21 320 1
+21 321 1
+21 326 1
+21 327 1
+21 328 1
+21 329 1
+21 333 1
+21 339 1
+21 344 1
+21 349 1
+21 350 1
+21 351 1
+21 352 1
+21 360 1
+21 365 1
+21 370 1
+21 371 1
+21 372 1
+21 373 1
+21 380 1
+21 385 1
+21 386 1
+21 387 1
+21 388 1
+21 395 1
+21 396 1
+21 397 1
+21 398 1
+21 405 1
+21 406 1
+21 407 1
+21 408 1
+21 409 1
+21 410 1
+21 416 1
+21 421 1
+21 426 1
+21 427 1
+21 428 1
+21 429 1
+21 436 1
+21 441 1
+21 442 1
+21 443 1
+21 444 1
+21 451 1
+21 452 1
+21 453 1
+21 454 1
+21 461 1
+21 462 1
+21 463 1
+21 464 1
+21 465 1
+21 466 1
+21 471 1
+21 476 1
+21 477 1
+21 478 1
+21 479 1
+21 486 1
+21 487 1
+21 488 1
+21 489 1
+21 496 1
+21 497 1
+21 498 1
+21 499 1
+21 500 1
+21 501 1
+21 506 1
+21 507 1
+21 508 1
+21 509 1
+21 516 1
+21 517 1
+21 518 1
+21 519 1
+21 520 1
+21 521 1
+21 526 1
+21 527 1
+21 528 1
+21 529 1
+21 530 1
+21 531 1
+21 536 1
+21 537 1
+21 538 1
+21 539 1
+21 542 1
+21 547 1
+21 552 1
+21 553 1
+21 554 1
+21 555 1
+21 562 1
+21 567 1
+21 568 1
+21 569 1
+21 570 1
+21 577 1
+21 578 1
+21 579 1
+21 580 1
+21 587 1
+21 588 1
+21 589 1
+21 590 1
+21 591 1
+21 592 1
+21 597 1
+21 602 1
+21 603 1
+21 604 1
+21 605 1
+21 612 1
+21 613 1
+21 614 1
+21 615 1
+21 622 1
+21 623 1
+21 624 1
+21 625 1
+21 626 1
+21 627 1
+21 632 1
+21 633 1
+21 634 1
+21 635 1
+21 642 1
+21 643 1
+21 644 1
+21 645 1
+21 646 1
+21 647 1
+21 652 1
+21 653 1
+21 654 1
+21 655 1
+21 656 1
+21 657 1
+21 662 1
+21 663 1
+21 664 1
+21 665 1
+21 667 1
+21 672 1
+21 673 1
+21 674 1
+21 675 1
+21 682 1
+21 683 1
+21 684 1
+21 685 1
+21 692 1
+21 693 1
+21 694 1
+21 695 1
+21 696 1
+21 697 1
+21 702 1
+21 703 1
+21 704 1
+21 705 1
+21 712 1
+21 713 1
+21 714 1
+21 715 1
+21 716 1
+21 717 1
+21 722 1
+21 723 1
+21 724 1
+21 725 1
+21 726 1
+21 727 1
+21 732 1
+21 733 1
+21 734 1
+21 735 1
+21 737 1
+21 738 1
+21 739 1
+21 740 1
+21 747 1
+21 748 1
+21 749 1
+21 750 1
+21 751 1
+21 752 1
+21 757 1
+21 758 1
+21 759 1
+21 760 1
+21 761 1
+21 762 1
+21 767 1
+21 768 1
+21 769 1
+21 770 1
+21 772 1
+21 773 1
+21 774 1
+21 775 1
+21 776 1
+21 777 1
+21 782 1
+21 783 1
+21 784 1
+21 785 1
+21 787 1
+21 788 1
+21 789 1
+21 790 1
+21 792 1
+21 1719 1
+21 1725 1
+21 1730 1
+21 1735 1
+21 1736 1
+21 1737 1
+21 1738 1
+21 1746 1
+21 1751 1
+21 1756 1
+21 1757 1
+21 1758 1
+21 1759 1
+21 1766 1
+21 1771 1
+21 1772 1
+21 1773 1
+21 1774 1
+21 1781 1
+21 1782 1
+21 1783 1
+21 1784 1
+21 1791 1
+21 1792 1
+21 1793 1
+21 1794 1
+21 1795 1
+21 1796 1
+21 1802 1
+21 1807 1
+21 1812 1
+21 1813 1
+21 1814 1
+21 1815 1
+21 1822 1
+21 1827 1
+21 1828 1
+21 1829 1
+21 1830 1
+21 1837 1
+21 1838 1
+21 1839 1
+21 1840 1
+21 1847 1
+21 1848 1
+21 1849 1
+21 1850 1
+21 1851 1
+21 1852 1
+21 1857 1
+21 1862 1
+21 1863 1
+21 1864 1
+21 1865 1
+21 1872 1
+21 1873 1
+21 1874 1
+21 1875 1
+21 1882 1
+21 1883 1
+21 1884 1
+21 1885 1
+21 1886 1
+21 1887 1
+21 1892 1
+21 1893 1
+21 1894 1
+21 1895 1
+21 1902 1
+21 1903 1
+21 1904 1
+21 1905 1
+21 1906 1
+21 1907 1
+21 1912 1
+21 1913 1
+21 1914 1
+21 1915 1
+21 1916 1
+21 1917 1
+21 1922 1
+21 1923 1
+21 1924 1
+21 1925 1
+21 1928 1
+21 1933 1
+21 1938 1
+21 1939 1
+21 1940 1
+21 1941 1
+21 1948 1
+21 1953 1
+21 1954 1
+21 1955 1
+21 1956 1
+21 1963 1
+21 1964 1
+21 1965 1
+21 1966 1
+21 1973 1
+21 1974 1
+21 1975 1
+21 1976 1
+21 1977 1
+21 1978 1
+21 1983 1
+21 1988 1
+21 1989 1
+21 1990 1
+21 1991 1
+21 1998 1
+21 1999 1
+21 2000 1
+21 2001 1
+21 2008 1
+21 2009 1
+21 2010 1
+21 2011 1
+21 2012 1
+21 2013 1
+21 2018 1
+21 2019 1
+21 2020 1
+21 2021 1
+21 2028 1
+21 2029 1
+21 2030 1
+21 2031 1
+21 2032 1
+21 2033 1
+21 2038 1
+21 2039 1
+21 2040 1
+21 2041 1
+21 2042 1
+21 2043 1
+21 2048 1
+21 2049 1
+21 2050 1
+21 2051 1
+21 2053 1
+21 2058 1
+21 2059 1
+21 2060 1
+21 2061 1
+21 2068 1
+21 2069 1
+21 2070 1
+21 2071 1
+21 2078 1
+21 2079 1
+21 2080 1
+21 2081 1
+21 2082 1
+21 2083 1
+21 2088 1
+21 2089 1
+21 2090 1
+21 2091 1
+21 2098 1
+21 2099 1
+21 2100 1
+21 2101 1
+21 2102 1
+21 2103 1
+21 2108 1
+21 2109 1
+21 2110 1
+21 2111 1
+21 2112 1
+21 2113 1
+21 2118 1
+21 2119 1
+21 2120 1
+21 2121 1
+21 2123 1
+21 2124 1
+21 2125 1
+21 2126 1
+21 2133 1
+21 2134 1
+21 2135 1
+21 2136 1
+21 2137 1
+21 2138 1
+21 2143 1
+21 2144 1
+21 2145 1
+21 2146 1
+21 2147 1
+21 2148 1
+21 2153 1
+21 2154 1
+21 2155 1
+21 2156 1
+21 2158 1
+21 2159 1
+21 2160 1
+21 2161 1
+21 2162 1
+21 2163 1
+21 2168 1
+21 2169 1
+21 2170 1
+21 2171 1
+21 2173 1
+21 2174 1
+21 2175 1
+21 2176 1
+21 2178 1
+21 2180 1
+21 2185 1
+21 2190 1
+21 2191 1
+21 2192 1
+21 2193 1
+21 2200 1
+21 2205 1
+21 2206 1
+21 2207 1
+21 2208 1
+21 2215 1
+21 2216 1
+21 2217 1
+21 2218 1
+21 2225 1
+21 2226 1
+21 2227 1
+21 2228 1
+21 2229 1
+21 2230 1
+21 2235 1
+21 2240 1
+21 2241 1
+21 2242 1
+21 2243 1
+21 2250 1
+21 2251 1
+21 2252 1
+21 2253 1
+21 2260 1
+21 2261 1
+21 2262 1
+21 2263 1
+21 2264 1
+21 2265 1
+21 2270 1
+21 2271 1
+21 2272 1
+21 2273 1
+21 2280 1
+21 2281 1
+21 2282 1
+21 2283 1
+21 2284 1
+21 2285 1
+21 2290 1
+21 2291 1
+21 2292 1
+21 2293 1
+21 2294 1
+21 2295 1
+21 2300 1
+21 2301 1
+21 2302 1
+21 2303 1
+21 2305 1
+21 2310 1
+21 2311 1
+21 2312 1
+21 2313 1
+21 2320 1
+21 2321 1
+21 2322 1
+21 2323 1
+21 2330 1
+21 2331 1
+21 2332 1
+21 2333 1
+21 2334 1
+21 2335 1
+21 2340 1
+21 2341 1
+21 2342 1
+21 2343 1
+21 2350 1
+21 2351 1
+21 2352 1
+21 2353 1
+21 2354 1
+21 2355 1
+21 2360 1
+21 2361 1
+21 2362 1
+21 2363 1
+21 2364 1
+21 2365 1
+21 2370 1
+21 2371 1
+21 2372 1
+21 2373 1
+21 2375 1
+21 2376 1
+21 2377 1
+21 2378 1
+21 2385 1
+21 2386 1
+21 2387 1
+21 2388 1
+21 2389 1
+21 2390 1
+21 2395 1
+21 2396 1
+21 2397 1
+21 2398 1
+21 2399 1
+21 2400 1
+21 2405 1
+21 2406 1
+21 2407 1
+21 2408 1
+21 2410 1
+21 2411 1
+21 2412 1
+21 2413 1
+21 2414 1
+21 2415 1
+21 2420 1
+21 2421 1
+21 2422 1
+21 2423 1
+21 2425 1
+21 2426 1
+21 2427 1
+21 2428 1
+21 2430 1
+21 2431 1
+21 2436 1
+21 2437 1
+21 2438 1
+21 2439 1
+21 2446 1
+21 2447 1
+21 2448 1
+21 2449 1
+21 2456 1
+21 2457 1
+21 2458 1
+21 2459 1
+21 2460 1
+21 2461 1
+21 2466 1
+21 2467 1
+21 2468 1
+21 2469 1
+21 2476 1
+21 2477 1
+21 2478 1
+21 2479 1
+21 2480 1
+21 2481 1
+21 2486 1
+21 2487 1
+21 2488 1
+21 2489 1
+21 2490 1
+21 2491 1
+21 2496 1
+21 2497 1
+21 2498 1
+21 2499 1
+21 2501 1
+21 2502 1
+21 2503 1
+21 2504 1
+21 2511 1
+21 2512 1
+21 2513 1
+21 2514 1
+21 2515 1
+21 2516 1
+21 2521 1
+21 2522 1
+21 2523 1
+21 2524 1
+21 2525 1
+21 2526 1
+21 2531 1
+21 2532 1
+21 2533 1
+21 2534 1
+21 2536 1
+21 2537 1
+21 2538 1
+21 2539 1
+21 2540 1
+21 2541 1
+21 2546 1
+21 2547 1
+21 2548 1
+21 2549 1
+21 2551 1
+21 2552 1
+21 2553 1
+21 2554 1
+21 2556 1
+21 2557 1
+21 2558 1
+21 2559 1
+21 2560 1
+21 2567 1
+21 2568 1
+21 2569 1
+21 2570 1
+21 2571 1
+21 2572 1
+21 2577 1
+21 2578 1
+21 2579 1
+21 2580 1
+21 2581 1
+21 2582 1
+21 2587 1
+21 2588 1
+21 2589 1
+21 2590 1
+21 2592 1
+21 2593 1
+21 2594 1
+21 2595 1
+21 2596 1
+21 2597 1
+21 2602 1
+21 2603 1
+21 2604 1
+21 2605 1
+21 2607 1
+21 2608 1
+21 2609 1
+21 2610 1
+21 2612 1
+21 2613 1
+21 2614 1
+21 2615 1
+21 2616 1
+21 2617 1
+21 2618 1
+21 2623 1
+21 2624 1
+21 2625 1
+21 2626 1
+21 2628 1
+21 2629 1
+21 2630 1
+21 2631 1
+21 2633 1
+21 2634 1
+21 2635 1
+21 2636 1
+21 2637 1
+21 2639 1
+21 2640 1
+22 5 1
+22 12 1
+22 18 1
+22 23 1
+22 27 1
+22 31 1
+22 32 1
+22 33 1
+22 40 1
+22 46 1
+22 51 1
+22 55 1
+22 59 1
+22 60 1
+22 61 1
+22 67 1
+22 72 1
+22 76 1
+22 80 1
+22 81 1
+22 82 1
+22 87 1
+22 91 1
+22 95 1
+22 96 1
+22 97 1
+22 101 1
+22 105 1
+22 106 1
+22 107 1
+22 111 1
+22 112 1
+22 113 1
+22 117 1
+22 118 1
+22 119 1
+22 124 1
+22 130 1
+22 135 1
+22 139 1
+22 143 1
+22 144 1
+22 145 1
+22 151 1
+22 156 1
+22 160 1
+22 164 1
+22 165 1
+22 166 1
+22 171 1
+22 175 1
+22 179 1
+22 180 1
+22 181 1
+22 185 1
+22 189 1
+22 190 1
+22 191 1
+22 195 1
+22 196 1
+22 197 1
+22 201 1
+22 202 1
+22 203 1
+22 207 1
+22 212 1
+22 216 1
+22 220 1
+22 221 1
+22 222 1
+22 227 1
+22 231 1
+22 235 1
+22 236 1
+22 237 1
+22 241 1
+22 245 1
+22 246 1
+22 247 1
+22 251 1
+22 252 1
+22 253 1
+22 257 1
+22 258 1
+22 259 1
+22 262 1
+22 266 1
+22 270 1
+22 271 1
+22 272 1
+22 276 1
+22 280 1
+22 281 1
+22 282 1
+22 286 1
+22 287 1
+22 288 1
+22 292 1
+22 293 1
+22 294 1
+22 296 1
+22 300 1
+22 301 1
+22 302 1
+22 306 1
+22 307 1
+22 308 1
+22 312 1
+22 313 1
+22 314 1
+22 316 1
+22 317 1
+22 318 1
+22 322 1
+22 323 1
+22 324 1
+22 326 1
+22 327 1
+22 328 1
+22 330 1
+22 334 1
+22 340 1
+22 345 1
+22 349 1
+22 353 1
+22 354 1
+22 355 1
+22 361 1
+22 366 1
+22 370 1
+22 374 1
+22 375 1
+22 376 1
+22 381 1
+22 385 1
+22 389 1
+22 390 1
+22 391 1
+22 395 1
+22 399 1
+22 400 1
+22 401 1
+22 405 1
+22 406 1
+22 407 1
+22 411 1
+22 412 1
+22 413 1
+22 417 1
+22 422 1
+22 426 1
+22 430 1
+22 431 1
+22 432 1
+22 437 1
+22 441 1
+22 445 1
+22 446 1
+22 447 1
+22 451 1
+22 455 1
+22 456 1
+22 457 1
+22 461 1
+22 462 1
+22 463 1
+22 467 1
+22 468 1
+22 469 1
+22 472 1
+22 476 1
+22 480 1
+22 481 1
+22 482 1
+22 486 1
+22 490 1
+22 491 1
+22 492 1
+22 496 1
+22 497 1
+22 498 1
+22 502 1
+22 503 1
+22 504 1
+22 506 1
+22 510 1
+22 511 1
+22 512 1
+22 516 1
+22 517 1
+22 518 1
+22 522 1
+22 523 1
+22 524 1
+22 526 1
+22 527 1
+22 528 1
+22 532 1
+22 533 1
+22 534 1
+22 536 1
+22 537 1
+22 538 1
+22 540 1
+22 543 1
+22 548 1
+22 552 1
+22 556 1
+22 557 1
+22 558 1
+22 563 1
+22 567 1
+22 571 1
+22 572 1
+22 573 1
+22 577 1
+22 581 1
+22 582 1
+22 583 1
+22 587 1
+22 588 1
+22 589 1
+22 593 1
+22 594 1
+22 595 1
+22 598 1
+22 602 1
+22 606 1
+22 607 1
+22 608 1
+22 612 1
+22 616 1
+22 617 1
+22 618 1
+22 622 1
+22 623 1
+22 624 1
+22 628 1
+22 629 1
+22 630 1
+22 632 1
+22 636 1
+22 637 1
+22 638 1
+22 642 1
+22 643 1
+22 644 1
+22 648 1
+22 649 1
+22 650 1
+22 652 1
+22 653 1
+22 654 1
+22 658 1
+22 659 1
+22 660 1
+22 662 1
+22 663 1
+22 664 1
+22 666 1
+22 668 1
+22 672 1
+22 676 1
+22 677 1
+22 678 1
+22 682 1
+22 686 1
+22 687 1
+22 688 1
+22 692 1
+22 693 1
+22 694 1
+22 698 1
+22 699 1
+22 700 1
+22 702 1
+22 706 1
+22 707 1
+22 708 1
+22 712 1
+22 713 1
+22 714 1
+22 718 1
+22 719 1
+22 720 1
+22 722 1
+22 723 1
+22 724 1
+22 728 1
+22 729 1
+22 730 1
+22 732 1
+22 733 1
+22 734 1
+22 736 1
+22 737 1
+22 741 1
+22 742 1
+22 743 1
+22 747 1
+22 748 1
+22 749 1
+22 753 1
+22 754 1
+22 755 1
+22 757 1
+22 758 1
+22 759 1
+22 763 1
+22 764 1
+22 765 1
+22 767 1
+22 768 1
+22 769 1
+22 771 1
+22 772 1
+22 773 1
+22 774 1
+22 778 1
+22 779 1
+22 780 1
+22 782 1
+22 783 1
+22 784 1
+22 786 1
+22 787 1
+22 788 1
+22 789 1
+22 791 1
+22 792 1
+22 1720 1
+22 1726 1
+22 1731 1
+22 1735 1
+22 1739 1
+22 1740 1
+22 1741 1
+22 1747 1
+22 1752 1
+22 1756 1
+22 1760 1
+22 1761 1
+22 1762 1
+22 1767 1
+22 1771 1
+22 1775 1
+22 1776 1
+22 1777 1
+22 1781 1
+22 1785 1
+22 1786 1
+22 1787 1
+22 1791 1
+22 1792 1
+22 1793 1
+22 1797 1
+22 1798 1
+22 1799 1
+22 1803 1
+22 1808 1
+22 1812 1
+22 1816 1
+22 1817 1
+22 1818 1
+22 1823 1
+22 1827 1
+22 1831 1
+22 1832 1
+22 1833 1
+22 1837 1
+22 1841 1
+22 1842 1
+22 1843 1
+22 1847 1
+22 1848 1
+22 1849 1
+22 1853 1
+22 1854 1
+22 1855 1
+22 1858 1
+22 1862 1
+22 1866 1
+22 1867 1
+22 1868 1
+22 1872 1
+22 1876 1
+22 1877 1
+22 1878 1
+22 1882 1
+22 1883 1
+22 1884 1
+22 1888 1
+22 1889 1
+22 1890 1
+22 1892 1
+22 1896 1
+22 1897 1
+22 1898 1
+22 1902 1
+22 1903 1
+22 1904 1
+22 1908 1
+22 1909 1
+22 1910 1
+22 1912 1
+22 1913 1
+22 1914 1
+22 1918 1
+22 1919 1
+22 1920 1
+22 1922 1
+22 1923 1
+22 1924 1
+22 1926 1
+22 1929 1
+22 1934 1
+22 1938 1
+22 1942 1
+22 1943 1
+22 1944 1
+22 1949 1
+22 1953 1
+22 1957 1
+22 1958 1
+22 1959 1
+22 1963 1
+22 1967 1
+22 1968 1
+22 1969 1
+22 1973 1
+22 1974 1
+22 1975 1
+22 1979 1
+22 1980 1
+22 1981 1
+22 1984 1
+22 1988 1
+22 1992 1
+22 1993 1
+22 1994 1
+22 1998 1
+22 2002 1
+22 2003 1
+22 2004 1
+22 2008 1
+22 2009 1
+22 2010 1
+22 2014 1
+22 2015 1
+22 2016 1
+22 2018 1
+22 2022 1
+22 2023 1
+22 2024 1
+22 2028 1
+22 2029 1
+22 2030 1
+22 2034 1
+22 2035 1
+22 2036 1
+22 2038 1
+22 2039 1
+22 2040 1
+22 2044 1
+22 2045 1
+22 2046 1
+22 2048 1
+22 2049 1
+22 2050 1
+22 2052 1
+22 2054 1
+22 2058 1
+22 2062 1
+22 2063 1
+22 2064 1
+22 2068 1
+22 2072 1
+22 2073 1
+22 2074 1
+22 2078 1
+22 2079 1
+22 2080 1
+22 2084 1
+22 2085 1
+22 2086 1
+22 2088 1
+22 2092 1
+22 2093 1
+22 2094 1
+22 2098 1
+22 2099 1
+22 2100 1
+22 2104 1
+22 2105 1
+22 2106 1
+22 2108 1
+22 2109 1
+22 2110 1
+22 2114 1
+22 2115 1
+22 2116 1
+22 2118 1
+22 2119 1
+22 2120 1
+22 2122 1
+22 2123 1
+22 2127 1
+22 2128 1
+22 2129 1
+22 2133 1
+22 2134 1
+22 2135 1
+22 2139 1
+22 2140 1
+22 2141 1
+22 2143 1
+22 2144 1
+22 2145 1
+22 2149 1
+22 2150 1
+22 2151 1
+22 2153 1
+22 2154 1
+22 2155 1
+22 2157 1
+22 2158 1
+22 2159 1
+22 2160 1
+22 2164 1
+22 2165 1
+22 2166 1
+22 2168 1
+22 2169 1
+22 2170 1
+22 2172 1
+22 2173 1
+22 2174 1
+22 2175 1
+22 2177 1
+22 2178 1
+22 2181 1
+22 2186 1
+22 2190 1
+22 2194 1
+22 2195 1
+22 2196 1
+22 2201 1
+22 2205 1
+22 2209 1
+22 2210 1
+22 2211 1
+22 2215 1
+22 2219 1
+22 2220 1
+22 2221 1
+22 2225 1
+22 2226 1
+22 2227 1
+22 2231 1
+22 2232 1
+22 2233 1
+22 2236 1
+22 2240 1
+22 2244 1
+22 2245 1
+22 2246 1
+22 2250 1
+22 2254 1
+22 2255 1
+22 2256 1
+22 2260 1
+22 2261 1
+22 2262 1
+22 2266 1
+22 2267 1
+22 2268 1
+22 2270 1
+22 2274 1
+22 2275 1
+22 2276 1
+22 2280 1
+22 2281 1
+22 2282 1
+22 2286 1
+22 2287 1
+22 2288 1
+22 2290 1
+22 2291 1
+22 2292 1
+22 2296 1
+22 2297 1
+22 2298 1
+22 2300 1
+22 2301 1
+22 2302 1
+22 2304 1
+22 2306 1
+22 2310 1
+22 2314 1
+22 2315 1
+22 2316 1
+22 2320 1
+22 2324 1
+22 2325 1
+22 2326 1
+22 2330 1
+22 2331 1
+22 2332 1
+22 2336 1
+22 2337 1
+22 2338 1
+22 2340 1
+22 2344 1
+22 2345 1
+22 2346 1
+22 2350 1
+22 2351 1
+22 2352 1
+22 2356 1
+22 2357 1
+22 2358 1
+22 2360 1
+22 2361 1
+22 2362 1
+22 2366 1
+22 2367 1
+22 2368 1
+22 2370 1
+22 2371 1
+22 2372 1
+22 2374 1
+22 2375 1
+22 2379 1
+22 2380 1
+22 2381 1
+22 2385 1
+22 2386 1
+22 2387 1
+22 2391 1
+22 2392 1
+22 2393 1
+22 2395 1
+22 2396 1
+22 2397 1
+22 2401 1
+22 2402 1
+22 2403 1
+22 2405 1
+22 2406 1
+22 2407 1
+22 2409 1
+22 2410 1
+22 2411 1
+22 2412 1
+22 2416 1
+22 2417 1
+22 2418 1
+22 2420 1
+22 2421 1
+22 2422 1
+22 2424 1
+22 2425 1
+22 2426 1
+22 2427 1
+22 2429 1
+22 2430 1
+22 2432 1
+22 2436 1
+22 2440 1
+22 2441 1
+22 2442 1
+22 2446 1
+22 2450 1
+22 2451 1
+22 2452 1
+22 2456 1
+22 2457 1
+22 2458 1
+22 2462 1
+22 2463 1
+22 2464 1
+22 2466 1
+22 2470 1
+22 2471 1
+22 2472 1
+22 2476 1
+22 2477 1
+22 2478 1
+22 2482 1
+22 2483 1
+22 2484 1
+22 2486 1
+22 2487 1
+22 2488 1
+22 2492 1
+22 2493 1
+22 2494 1
+22 2496 1
+22 2497 1
+22 2498 1
+22 2500 1
+22 2501 1
+22 2505 1
+22 2506 1
+22 2507 1
+22 2511 1
+22 2512 1
+22 2513 1
+22 2517 1
+22 2518 1
+22 2519 1
+22 2521 1
+22 2522 1
+22 2523 1
+22 2527 1
+22 2528 1
+22 2529 1
+22 2531 1
+22 2532 1
+22 2533 1
+22 2535 1
+22 2536 1
+22 2537 1
+22 2538 1
+22 2542 1
+22 2543 1
+22 2544 1
+22 2546 1
+22 2547 1
+22 2548 1
+22 2550 1
+22 2551 1
+22 2552 1
+22 2553 1
+22 2555 1
+22 2556 1
+22 2557 1
+22 2561 1
+22 2562 1
+22 2563 1
+22 2567 1
+22 2568 1
+22 2569 1
+22 2573 1
+22 2574 1
+22 2575 1
+22 2577 1
+22 2578 1
+22 2579 1
+22 2583 1
+22 2584 1
+22 2585 1
+22 2587 1
+22 2588 1
+22 2589 1
+22 2591 1
+22 2592 1
+22 2593 1
+22 2594 1
+22 2598 1
+22 2599 1
+22 2600 1
+22 2602 1
+22 2603 1
+22 2604 1
+22 2606 1
+22 2607 1
+22 2608 1
+22 2609 1
+22 2611 1
+22 2612 1
+22 2613 1
+22 2614 1
+22 2615 1
+22 2619 1
+22 2620 1
+22 2621 1
+22 2623 1
+22 2624 1
+22 2625 1
+22 2627 1
+22 2628 1
+22 2629 1
+22 2630 1
+22 2632 1
+22 2633 1
+22 2634 1
+22 2635 1
+22 2636 1
+22 2638 1
+22 2639 1
+22 2640 1
+23 6 1
+23 13 1
+23 19 1
+23 24 1
+23 28 1
+23 31 1
+23 34 1
+23 35 1
+23 41 1
+23 47 1
+23 52 1
+23 56 1
+23 59 1
+23 62 1
+23 63 1
+23 68 1
+23 73 1
+23 77 1
+23 80 1
+23 83 1
+23 84 1
+23 88 1
+23 92 1
+23 95 1
+23 98 1
+23 99 1
+23 102 1
+23 105 1
+23 108 1
+23 109 1
+23 111 1
+23 114 1
+23 115 1
+23 117 1
+23 118 1
+23 120 1
+23 125 1
+23 131 1
+23 136 1
+23 140 1
+23 143 1
+23 146 1
+23 147 1
+23 152 1
+23 157 1
+23 161 1
+23 164 1
+23 167 1
+23 168 1
+23 172 1
+23 176 1
+23 179 1
+23 182 1
+23 183 1
+23 186 1
+23 189 1
+23 192 1
+23 193 1
+23 195 1
+23 198 1
+23 199 1
+23 201 1
+23 202 1
+23 204 1
+23 208 1
+23 213 1
+23 217 1
+23 220 1
+23 223 1
+23 224 1
+23 228 1
+23 232 1
+23 235 1
+23 238 1
+23 239 1
+23 242 1
+23 245 1
+23 248 1
+23 249 1
+23 251 1
+23 254 1
+23 255 1
+23 257 1
+23 258 1
+23 260 1
+23 263 1
+23 267 1
+23 270 1
+23 273 1
+23 274 1
+23 277 1
+23 280 1
+23 283 1
+23 284 1
+23 286 1
+23 289 1
+23 290 1
+23 292 1
+23 293 1
+23 295 1
+23 297 1
+23 300 1
+23 303 1
+23 304 1
+23 306 1
+23 309 1
+23 310 1
+23 312 1
+23 313 1
+23 315 1
+23 316 1
+23 319 1
+23 320 1
+23 322 1
+23 323 1
+23 325 1
+23 326 1
+23 327 1
+23 329 1
+23 330 1
+23 335 1
+23 341 1
+23 346 1
+23 350 1
+23 353 1
+23 356 1
+23 357 1
+23 362 1
+23 367 1
+23 371 1
+23 374 1
+23 377 1
+23 378 1
+23 382 1
+23 386 1
+23 389 1
+23 392 1
+23 393 1
+23 396 1
+23 399 1
+23 402 1
+23 403 1
+23 405 1
+23 408 1
+23 409 1
+23 411 1
+23 412 1
+23 414 1
+23 418 1
+23 423 1
+23 427 1
+23 430 1
+23 433 1
+23 434 1
+23 438 1
+23 442 1
+23 445 1
+23 448 1
+23 449 1
+23 452 1
+23 455 1
+23 458 1
+23 459 1
+23 461 1
+23 464 1
+23 465 1
+23 467 1
+23 468 1
+23 470 1
+23 473 1
+23 477 1
+23 480 1
+23 483 1
+23 484 1
+23 487 1
+23 490 1
+23 493 1
+23 494 1
+23 496 1
+23 499 1
+23 500 1
+23 502 1
+23 503 1
+23 505 1
+23 507 1
+23 510 1
+23 513 1
+23 514 1
+23 516 1
+23 519 1
+23 520 1
+23 522 1
+23 523 1
+23 525 1
+23 526 1
+23 529 1
+23 530 1
+23 532 1
+23 533 1
+23 535 1
+23 536 1
+23 537 1
+23 539 1
+23 540 1
+23 544 1
+23 549 1
+23 553 1
+23 556 1
+23 559 1
+23 560 1
+23 564 1
+23 568 1
+23 571 1
+23 574 1
+23 575 1
+23 578 1
+23 581 1
+23 584 1
+23 585 1
+23 587 1
+23 590 1
+23 591 1
+23 593 1
+23 594 1
+23 596 1
+23 599 1
+23 603 1
+23 606 1
+23 609 1
+23 610 1
+23 613 1
+23 616 1
+23 619 1
+23 620 1
+23 622 1
+23 625 1
+23 626 1
+23 628 1
+23 629 1
+23 631 1
+23 633 1
+23 636 1
+23 639 1
+23 640 1
+23 642 1
+23 645 1
+23 646 1
+23 648 1
+23 649 1
+23 651 1
+23 652 1
+23 655 1
+23 656 1
+23 658 1
+23 659 1
+23 661 1
+23 662 1
+23 663 1
+23 665 1
+23 666 1
+23 669 1
+23 673 1
+23 676 1
+23 679 1
+23 680 1
+23 683 1
+23 686 1
+23 689 1
+23 690 1
+23 692 1
+23 695 1
+23 696 1
+23 698 1
+23 699 1
+23 701 1
+23 703 1
+23 706 1
+23 709 1
+23 710 1
+23 712 1
+23 715 1
+23 716 1
+23 718 1
+23 719 1
+23 721 1
+23 722 1
+23 725 1
+23 726 1
+23 728 1
+23 729 1
+23 731 1
+23 732 1
+23 733 1
+23 735 1
+23 736 1
+23 738 1
+23 741 1
+23 744 1
+23 745 1
+23 747 1
+23 750 1
+23 751 1
+23 753 1
+23 754 1
+23 756 1
+23 757 1
+23 760 1
+23 761 1
+23 763 1
+23 764 1
+23 766 1
+23 767 1
+23 768 1
+23 770 1
+23 771 1
+23 772 1
+23 775 1
+23 776 1
+23 778 1
+23 779 1
+23 781 1
+23 782 1
+23 783 1
+23 785 1
+23 786 1
+23 787 1
+23 788 1
+23 790 1
+23 791 1
+23 792 1
+23 1721 1
+23 1727 1
+23 1732 1
+23 1736 1
+23 1739 1
+23 1742 1
+23 1743 1
+23 1748 1
+23 1753 1
+23 1757 1
+23 1760 1
+23 1763 1
+23 1764 1
+23 1768 1
+23 1772 1
+23 1775 1
+23 1778 1
+23 1779 1
+23 1782 1
+23 1785 1
+23 1788 1
+23 1789 1
+23 1791 1
+23 1794 1
+23 1795 1
+23 1797 1
+23 1798 1
+23 1800 1
+23 1804 1
+23 1809 1
+23 1813 1
+23 1816 1
+23 1819 1
+23 1820 1
+23 1824 1
+23 1828 1
+23 1831 1
+23 1834 1
+23 1835 1
+23 1838 1
+23 1841 1
+23 1844 1
+23 1845 1
+23 1847 1
+23 1850 1
+23 1851 1
+23 1853 1
+23 1854 1
+23 1856 1
+23 1859 1
+23 1863 1
+23 1866 1
+23 1869 1
+23 1870 1
+23 1873 1
+23 1876 1
+23 1879 1
+23 1880 1
+23 1882 1
+23 1885 1
+23 1886 1
+23 1888 1
+23 1889 1
+23 1891 1
+23 1893 1
+23 1896 1
+23 1899 1
+23 1900 1
+23 1902 1
+23 1905 1
+23 1906 1
+23 1908 1
+23 1909 1
+23 1911 1
+23 1912 1
+23 1915 1
+23 1916 1
+23 1918 1
+23 1919 1
+23 1921 1
+23 1922 1
+23 1923 1
+23 1925 1
+23 1926 1
+23 1930 1
+23 1935 1
+23 1939 1
+23 1942 1
+23 1945 1
+23 1946 1
+23 1950 1
+23 1954 1
+23 1957 1
+23 1960 1
+23 1961 1
+23 1964 1
+23 1967 1
+23 1970 1
+23 1971 1
+23 1973 1
+23 1976 1
+23 1977 1
+23 1979 1
+23 1980 1
+23 1982 1
+23 1985 1
+23 1989 1
+23 1992 1
+23 1995 1
+23 1996 1
+23 1999 1
+23 2002 1
+23 2005 1
+23 2006 1
+23 2008 1
+23 2011 1
+23 2012 1
+23 2014 1
+23 2015 1
+23 2017 1
+23 2019 1
+23 2022 1
+23 2025 1
+23 2026 1
+23 2028 1
+23 2031 1
+23 2032 1
+23 2034 1
+23 2035 1
+23 2037 1
+23 2038 1
+23 2041 1
+23 2042 1
+23 2044 1
+23 2045 1
+23 2047 1
+23 2048 1
+23 2049 1
+23 2051 1
+23 2052 1
+23 2055 1
+23 2059 1
+23 2062 1
+23 2065 1
+23 2066 1
+23 2069 1
+23 2072 1
+23 2075 1
+23 2076 1
+23 2078 1
+23 2081 1
+23 2082 1
+23 2084 1
+23 2085 1
+23 2087 1
+23 2089 1
+23 2092 1
+23 2095 1
+23 2096 1
+23 2098 1
+23 2101 1
+23 2102 1
+23 2104 1
+23 2105 1
+23 2107 1
+23 2108 1
+23 2111 1
+23 2112 1
+23 2114 1
+23 2115 1
+23 2117 1
+23 2118 1
+23 2119 1
+23 2121 1
+23 2122 1
+23 2124 1
+23 2127 1
+23 2130 1
+23 2131 1
+23 2133 1
+23 2136 1
+23 2137 1
+23 2139 1
+23 2140 1
+23 2142 1
+23 2143 1
+23 2146 1
+23 2147 1
+23 2149 1
+23 2150 1
+23 2152 1
+23 2153 1
+23 2154 1
+23 2156 1
+23 2157 1
+23 2158 1
+23 2161 1
+23 2162 1
+23 2164 1
+23 2165 1
+23 2167 1
+23 2168 1
+23 2169 1
+23 2171 1
+23 2172 1
+23 2173 1
+23 2174 1
+23 2176 1
+23 2177 1
+23 2178 1
+23 2182 1
+23 2187 1
+23 2191 1
+23 2194 1
+23 2197 1
+23 2198 1
+23 2202 1
+23 2206 1
+23 2209 1
+23 2212 1
+23 2213 1
+23 2216 1
+23 2219 1
+23 2222 1
+23 2223 1
+23 2225 1
+23 2228 1
+23 2229 1
+23 2231 1
+23 2232 1
+23 2234 1
+23 2237 1
+23 2241 1
+23 2244 1
+23 2247 1
+23 2248 1
+23 2251 1
+23 2254 1
+23 2257 1
+23 2258 1
+23 2260 1
+23 2263 1
+23 2264 1
+23 2266 1
+23 2267 1
+23 2269 1
+23 2271 1
+23 2274 1
+23 2277 1
+23 2278 1
+23 2280 1
+23 2283 1
+23 2284 1
+23 2286 1
+23 2287 1
+23 2289 1
+23 2290 1
+23 2293 1
+23 2294 1
+23 2296 1
+23 2297 1
+23 2299 1
+23 2300 1
+23 2301 1
+23 2303 1
+23 2304 1
+23 2307 1
+23 2311 1
+23 2314 1
+23 2317 1
+23 2318 1
+23 2321 1
+23 2324 1
+23 2327 1
+23 2328 1
+23 2330 1
+23 2333 1
+23 2334 1
+23 2336 1
+23 2337 1
+23 2339 1
+23 2341 1
+23 2344 1
+23 2347 1
+23 2348 1
+23 2350 1
+23 2353 1
+23 2354 1
+23 2356 1
+23 2357 1
+23 2359 1
+23 2360 1
+23 2363 1
+23 2364 1
+23 2366 1
+23 2367 1
+23 2369 1
+23 2370 1
+23 2371 1
+23 2373 1
+23 2374 1
+23 2376 1
+23 2379 1
+23 2382 1
+23 2383 1
+23 2385 1
+23 2388 1
+23 2389 1
+23 2391 1
+23 2392 1
+23 2394 1
+23 2395 1
+23 2398 1
+23 2399 1
+23 2401 1
+23 2402 1
+23 2404 1
+23 2405 1
+23 2406 1
+23 2408 1
+23 2409 1
+23 2410 1
+23 2413 1
+23 2414 1
+23 2416 1
+23 2417 1
+23 2419 1
+23 2420 1
+23 2421 1
+23 2423 1
+23 2424 1
+23 2425 1
+23 2426 1
+23 2428 1
+23 2429 1
+23 2430 1
+23 2433 1
+23 2437 1
+23 2440 1
+23 2443 1
+23 2444 1
+23 2447 1
+23 2450 1
+23 2453 1
+23 2454 1
+23 2456 1
+23 2459 1
+23 2460 1
+23 2462 1
+23 2463 1
+23 2465 1
+23 2467 1
+23 2470 1
+23 2473 1
+23 2474 1
+23 2476 1
+23 2479 1
+23 2480 1
+23 2482 1
+23 2483 1
+23 2485 1
+23 2486 1
+23 2489 1
+23 2490 1
+23 2492 1
+23 2493 1
+23 2495 1
+23 2496 1
+23 2497 1
+23 2499 1
+23 2500 1
+23 2502 1
+23 2505 1
+23 2508 1
+23 2509 1
+23 2511 1
+23 2514 1
+23 2515 1
+23 2517 1
+23 2518 1
+23 2520 1
+23 2521 1
+23 2524 1
+23 2525 1
+23 2527 1
+23 2528 1
+23 2530 1
+23 2531 1
+23 2532 1
+23 2534 1
+23 2535 1
+23 2536 1
+23 2539 1
+23 2540 1
+23 2542 1
+23 2543 1
+23 2545 1
+23 2546 1
+23 2547 1
+23 2549 1
+23 2550 1
+23 2551 1
+23 2552 1
+23 2554 1
+23 2555 1
+23 2556 1
+23 2558 1
+23 2561 1
+23 2564 1
+23 2565 1
+23 2567 1
+23 2570 1
+23 2571 1
+23 2573 1
+23 2574 1
+23 2576 1
+23 2577 1
+23 2580 1
+23 2581 1
+23 2583 1
+23 2584 1
+23 2586 1
+23 2587 1
+23 2588 1
+23 2590 1
+23 2591 1
+23 2592 1
+23 2595 1
+23 2596 1
+23 2598 1
+23 2599 1
+23 2601 1
+23 2602 1
+23 2603 1
+23 2605 1
+23 2606 1
+23 2607 1
+23 2608 1
+23 2610 1
+23 2611 1
+23 2612 1
+23 2613 1
+23 2616 1
+23 2617 1
+23 2619 1
+23 2620 1
+23 2622 1
+23 2623 1
+23 2624 1
+23 2626 1
+23 2627 1
+23 2628 1
+23 2629 1
+23 2631 1
+23 2632 1
+23 2633 1
+23 2634 1
+23 2635 1
+23 2637 1
+23 2638 1
+23 2639 1
+23 2640 1
+24 7 1
+24 14 1
+24 20 1
+24 25 1
+24 29 1
+24 32 1
+24 34 1
+24 36 1
+24 42 1
+24 48 1
+24 53 1
+24 57 1
+24 60 1
+24 62 1
+24 64 1
+24 69 1
+24 74 1
+24 78 1
+24 81 1
+24 83 1
+24 85 1
+24 89 1
+24 93 1
+24 96 1
+24 98 1
+24 100 1
+24 103 1
+24 106 1
+24 108 1
+24 110 1
+24 112 1
+24 114 1
+24 116 1
+24 117 1
+24 119 1
+24 120 1
+24 126 1
+24 132 1
+24 137 1
+24 141 1
+24 144 1
+24 146 1
+24 148 1
+24 153 1
+24 158 1
+24 162 1
+24 165 1
+24 167 1
+24 169 1
+24 173 1
+24 177 1
+24 180 1
+24 182 1
+24 184 1
+24 187 1
+24 190 1
+24 192 1
+24 194 1
+24 196 1
+24 198 1
+24 200 1
+24 201 1
+24 203 1
+24 204 1
+24 209 1
+24 214 1
+24 218 1
+24 221 1
+24 223 1
+24 225 1
+24 229 1
+24 233 1
+24 236 1
+24 238 1
+24 240 1
+24 243 1
+24 246 1
+24 248 1
+24 250 1
+24 252 1
+24 254 1
+24 256 1
+24 257 1
+24 259 1
+24 260 1
+24 264 1
+24 268 1
+24 271 1
+24 273 1
+24 275 1
+24 278 1
+24 281 1
+24 283 1
+24 285 1
+24 287 1
+24 289 1
+24 291 1
+24 292 1
+24 294 1
+24 295 1
+24 298 1
+24 301 1
+24 303 1
+24 305 1
+24 307 1
+24 309 1
+24 311 1
+24 312 1
+24 314 1
+24 315 1
+24 317 1
+24 319 1
+24 321 1
+24 322 1
+24 324 1
+24 325 1
+24 326 1
+24 328 1
+24 329 1
+24 330 1
+24 336 1
+24 342 1
+24 347 1
+24 351 1
+24 354 1
+24 356 1
+24 358 1
+24 363 1
+24 368 1
+24 372 1
+24 375 1
+24 377 1
+24 379 1
+24 383 1
+24 387 1
+24 390 1
+24 392 1
+24 394 1
+24 397 1
+24 400 1
+24 402 1
+24 404 1
+24 406 1
+24 408 1
+24 410 1
+24 411 1
+24 413 1
+24 414 1
+24 419 1
+24 424 1
+24 428 1
+24 431 1
+24 433 1
+24 435 1
+24 439 1
+24 443 1
+24 446 1
+24 448 1
+24 450 1
+24 453 1
+24 456 1
+24 458 1
+24 460 1
+24 462 1
+24 464 1
+24 466 1
+24 467 1
+24 469 1
+24 470 1
+24 474 1
+24 478 1
+24 481 1
+24 483 1
+24 485 1
+24 488 1
+24 491 1
+24 493 1
+24 495 1
+24 497 1
+24 499 1
+24 501 1
+24 502 1
+24 504 1
+24 505 1
+24 508 1
+24 511 1
+24 513 1
+24 515 1
+24 517 1
+24 519 1
+24 521 1
+24 522 1
+24 524 1
+24 525 1
+24 527 1
+24 529 1
+24 531 1
+24 532 1
+24 534 1
+24 535 1
+24 536 1
+24 538 1
+24 539 1
+24 540 1
+24 545 1
+24 550 1
+24 554 1
+24 557 1
+24 559 1
+24 561 1
+24 565 1
+24 569 1
+24 572 1
+24 574 1
+24 576 1
+24 579 1
+24 582 1
+24 584 1
+24 586 1
+24 588 1
+24 590 1
+24 592 1
+24 593 1
+24 595 1
+24 596 1
+24 600 1
+24 604 1
+24 607 1
+24 609 1
+24 611 1
+24 614 1
+24 617 1
+24 619 1
+24 621 1
+24 623 1
+24 625 1
+24 627 1
+24 628 1
+24 630 1
+24 631 1
+24 634 1
+24 637 1
+24 639 1
+24 641 1
+24 643 1
+24 645 1
+24 647 1
+24 648 1
+24 650 1
+24 651 1
+24 653 1
+24 655 1
+24 657 1
+24 658 1
+24 660 1
+24 661 1
+24 662 1
+24 664 1
+24 665 1
+24 666 1
+24 670 1
+24 674 1
+24 677 1
+24 679 1
+24 681 1
+24 684 1
+24 687 1
+24 689 1
+24 691 1
+24 693 1
+24 695 1
+24 697 1
+24 698 1
+24 700 1
+24 701 1
+24 704 1
+24 707 1
+24 709 1
+24 711 1
+24 713 1
+24 715 1
+24 717 1
+24 718 1
+24 720 1
+24 721 1
+24 723 1
+24 725 1
+24 727 1
+24 728 1
+24 730 1
+24 731 1
+24 732 1
+24 734 1
+24 735 1
+24 736 1
+24 739 1
+24 742 1
+24 744 1
+24 746 1
+24 748 1
+24 750 1
+24 752 1
+24 753 1
+24 755 1
+24 756 1
+24 758 1
+24 760 1
+24 762 1
+24 763 1
+24 765 1
+24 766 1
+24 767 1
+24 769 1
+24 770 1
+24 771 1
+24 773 1
+24 775 1
+24 777 1
+24 778 1
+24 780 1
+24 781 1
+24 782 1
+24 784 1
+24 785 1
+24 786 1
+24 787 1
+24 789 1
+24 790 1
+24 791 1
+24 792 1
+24 1722 1
+24 1728 1
+24 1733 1
+24 1737 1
+24 1740 1
+24 1742 1
+24 1744 1
+24 1749 1
+24 1754 1
+24 1758 1
+24 1761 1
+24 1763 1
+24 1765 1
+24 1769 1
+24 1773 1
+24 1776 1
+24 1778 1
+24 1780 1
+24 1783 1
+24 1786 1
+24 1788 1
+24 1790 1
+24 1792 1
+24 1794 1
+24 1796 1
+24 1797 1
+24 1799 1
+24 1800 1
+24 1805 1
+24 1810 1
+24 1814 1
+24 1817 1
+24 1819 1
+24 1821 1
+24 1825 1
+24 1829 1
+24 1832 1
+24 1834 1
+24 1836 1
+24 1839 1
+24 1842 1
+24 1844 1
+24 1846 1
+24 1848 1
+24 1850 1
+24 1852 1
+24 1853 1
+24 1855 1
+24 1856 1
+24 1860 1
+24 1864 1
+24 1867 1
+24 1869 1
+24 1871 1
+24 1874 1
+24 1877 1
+24 1879 1
+24 1881 1
+24 1883 1
+24 1885 1
+24 1887 1
+24 1888 1
+24 1890 1
+24 1891 1
+24 1894 1
+24 1897 1
+24 1899 1
+24 1901 1
+24 1903 1
+24 1905 1
+24 1907 1
+24 1908 1
+24 1910 1
+24 1911 1
+24 1913 1
+24 1915 1
+24 1917 1
+24 1918 1
+24 1920 1
+24 1921 1
+24 1922 1
+24 1924 1
+24 1925 1
+24 1926 1
+24 1931 1
+24 1936 1
+24 1940 1
+24 1943 1
+24 1945 1
+24 1947 1
+24 1951 1
+24 1955 1
+24 1958 1
+24 1960 1
+24 1962 1
+24 1965 1
+24 1968 1
+24 1970 1
+24 1972 1
+24 1974 1
+24 1976 1
+24 1978 1
+24 1979 1
+24 1981 1
+24 1982 1
+24 1986 1
+24 1990 1
+24 1993 1
+24 1995 1
+24 1997 1
+24 2000 1
+24 2003 1
+24 2005 1
+24 2007 1
+24 2009 1
+24 2011 1
+24 2013 1
+24 2014 1
+24 2016 1
+24 2017 1
+24 2020 1
+24 2023 1
+24 2025 1
+24 2027 1
+24 2029 1
+24 2031 1
+24 2033 1
+24 2034 1
+24 2036 1
+24 2037 1
+24 2039 1
+24 2041 1
+24 2043 1
+24 2044 1
+24 2046 1
+24 2047 1
+24 2048 1
+24 2050 1
+24 2051 1
+24 2052 1
+24 2056 1
+24 2060 1
+24 2063 1
+24 2065 1
+24 2067 1
+24 2070 1
+24 2073 1
+24 2075 1
+24 2077 1
+24 2079 1
+24 2081 1
+24 2083 1
+24 2084 1
+24 2086 1
+24 2087 1
+24 2090 1
+24 2093 1
+24 2095 1
+24 2097 1
+24 2099 1
+24 2101 1
+24 2103 1
+24 2104 1
+24 2106 1
+24 2107 1
+24 2109 1
+24 2111 1
+24 2113 1
+24 2114 1
+24 2116 1
+24 2117 1
+24 2118 1
+24 2120 1
+24 2121 1
+24 2122 1
+24 2125 1
+24 2128 1
+24 2130 1
+24 2132 1
+24 2134 1
+24 2136 1
+24 2138 1
+24 2139 1
+24 2141 1
+24 2142 1
+24 2144 1
+24 2146 1
+24 2148 1
+24 2149 1
+24 2151 1
+24 2152 1
+24 2153 1
+24 2155 1
+24 2156 1
+24 2157 1
+24 2159 1
+24 2161 1
+24 2163 1
+24 2164 1
+24 2166 1
+24 2167 1
+24 2168 1
+24 2170 1
+24 2171 1
+24 2172 1
+24 2173 1
+24 2175 1
+24 2176 1
+24 2177 1
+24 2178 1
+24 2183 1
+24 2188 1
+24 2192 1
+24 2195 1
+24 2197 1
+24 2199 1
+24 2203 1
+24 2207 1
+24 2210 1
+24 2212 1
+24 2214 1
+24 2217 1
+24 2220 1
+24 2222 1
+24 2224 1
+24 2226 1
+24 2228 1
+24 2230 1
+24 2231 1
+24 2233 1
+24 2234 1
+24 2238 1
+24 2242 1
+24 2245 1
+24 2247 1
+24 2249 1
+24 2252 1
+24 2255 1
+24 2257 1
+24 2259 1
+24 2261 1
+24 2263 1
+24 2265 1
+24 2266 1
+24 2268 1
+24 2269 1
+24 2272 1
+24 2275 1
+24 2277 1
+24 2279 1
+24 2281 1
+24 2283 1
+24 2285 1
+24 2286 1
+24 2288 1
+24 2289 1
+24 2291 1
+24 2293 1
+24 2295 1
+24 2296 1
+24 2298 1
+24 2299 1
+24 2300 1
+24 2302 1
+24 2303 1
+24 2304 1
+24 2308 1
+24 2312 1
+24 2315 1
+24 2317 1
+24 2319 1
+24 2322 1
+24 2325 1
+24 2327 1
+24 2329 1
+24 2331 1
+24 2333 1
+24 2335 1
+24 2336 1
+24 2338 1
+24 2339 1
+24 2342 1
+24 2345 1
+24 2347 1
+24 2349 1
+24 2351 1
+24 2353 1
+24 2355 1
+24 2356 1
+24 2358 1
+24 2359 1
+24 2361 1
+24 2363 1
+24 2365 1
+24 2366 1
+24 2368 1
+24 2369 1
+24 2370 1
+24 2372 1
+24 2373 1
+24 2374 1
+24 2377 1
+24 2380 1
+24 2382 1
+24 2384 1
+24 2386 1
+24 2388 1
+24 2390 1
+24 2391 1
+24 2393 1
+24 2394 1
+24 2396 1
+24 2398 1
+24 2400 1
+24 2401 1
+24 2403 1
+24 2404 1
+24 2405 1
+24 2407 1
+24 2408 1
+24 2409 1
+24 2411 1
+24 2413 1
+24 2415 1
+24 2416 1
+24 2418 1
+24 2419 1
+24 2420 1
+24 2422 1
+24 2423 1
+24 2424 1
+24 2425 1
+24 2427 1
+24 2428 1
+24 2429 1
+24 2430 1
+24 2434 1
+24 2438 1
+24 2441 1
+24 2443 1
+24 2445 1
+24 2448 1
+24 2451 1
+24 2453 1
+24 2455 1
+24 2457 1
+24 2459 1
+24 2461 1
+24 2462 1
+24 2464 1
+24 2465 1
+24 2468 1
+24 2471 1
+24 2473 1
+24 2475 1
+24 2477 1
+24 2479 1
+24 2481 1
+24 2482 1
+24 2484 1
+24 2485 1
+24 2487 1
+24 2489 1
+24 2491 1
+24 2492 1
+24 2494 1
+24 2495 1
+24 2496 1
+24 2498 1
+24 2499 1
+24 2500 1
+24 2503 1
+24 2506 1
+24 2508 1
+24 2510 1
+24 2512 1
+24 2514 1
+24 2516 1
+24 2517 1
+24 2519 1
+24 2520 1
+24 2522 1
+24 2524 1
+24 2526 1
+24 2527 1
+24 2529 1
+24 2530 1
+24 2531 1
+24 2533 1
+24 2534 1
+24 2535 1
+24 2537 1
+24 2539 1
+24 2541 1
+24 2542 1
+24 2544 1
+24 2545 1
+24 2546 1
+24 2548 1
+24 2549 1
+24 2550 1
+24 2551 1
+24 2553 1
+24 2554 1
+24 2555 1
+24 2556 1
+24 2559 1
+24 2562 1
+24 2564 1
+24 2566 1
+24 2568 1
+24 2570 1
+24 2572 1
+24 2573 1
+24 2575 1
+24 2576 1
+24 2578 1
+24 2580 1
+24 2582 1
+24 2583 1
+24 2585 1
+24 2586 1
+24 2587 1
+24 2589 1
+24 2590 1
+24 2591 1
+24 2593 1
+24 2595 1
+24 2597 1
+24 2598 1
+24 2600 1
+24 2601 1
+24 2602 1
+24 2604 1
+24 2605 1
+24 2606 1
+24 2607 1
+24 2609 1
+24 2610 1
+24 2611 1
+24 2612 1
+24 2614 1
+24 2616 1
+24 2618 1
+24 2619 1
+24 2621 1
+24 2622 1
+24 2623 1
+24 2625 1
+24 2626 1
+24 2627 1
+24 2628 1
+24 2630 1
+24 2631 1
+24 2632 1
+24 2633 1
+24 2634 1
+24 2636 1
+24 2637 1
+24 2638 1
+24 2639 1
+24 2640 1
+25 8 1
+25 15 1
+25 21 1
+25 26 1
+25 30 1
+25 33 1
+25 35 1
+25 36 1
+25 43 1
+25 49 1
+25 54 1
+25 58 1
+25 61 1
+25 63 1
+25 64 1
+25 70 1
+25 75 1
+25 79 1
+25 82 1
+25 84 1
+25 85 1
+25 90 1
+25 94 1
+25 97 1
+25 99 1
+25 100 1
+25 104 1
+25 107 1
+25 109 1
+25 110 1
+25 113 1
+25 115 1
+25 116 1
+25 118 1
+25 119 1
+25 120 1
+25 127 1
+25 133 1
+25 138 1
+25 142 1
+25 145 1
+25 147 1
+25 148 1
+25 154 1
+25 159 1
+25 163 1
+25 166 1
+25 168 1
+25 169 1
+25 174 1
+25 178 1
+25 181 1
+25 183 1
+25 184 1
+25 188 1
+25 191 1
+25 193 1
+25 194 1
+25 197 1
+25 199 1
+25 200 1
+25 202 1
+25 203 1
+25 204 1
+25 210 1
+25 215 1
+25 219 1
+25 222 1
+25 224 1
+25 225 1
+25 230 1
+25 234 1
+25 237 1
+25 239 1
+25 240 1
+25 244 1
+25 247 1
+25 249 1
+25 250 1
+25 253 1
+25 255 1
+25 256 1
+25 258 1
+25 259 1
+25 260 1
+25 265 1
+25 269 1
+25 272 1
+25 274 1
+25 275 1
+25 279 1
+25 282 1
+25 284 1
+25 285 1
+25 288 1
+25 290 1
+25 291 1
+25 293 1
+25 294 1
+25 295 1
+25 299 1
+25 302 1
+25 304 1
+25 305 1
+25 308 1
+25 310 1
+25 311 1
+25 313 1
+25 314 1
+25 315 1
+25 318 1
+25 320 1
+25 321 1
+25 323 1
+25 324 1
+25 325 1
+25 327 1
+25 328 1
+25 329 1
+25 330 1
+25 337 1
+25 343 1
+25 348 1
+25 352 1
+25 355 1
+25 357 1
+25 358 1
+25 364 1
+25 369 1
+25 373 1
+25 376 1
+25 378 1
+25 379 1
+25 384 1
+25 388 1
+25 391 1
+25 393 1
+25 394 1
+25 398 1
+25 401 1
+25 403 1
+25 404 1
+25 407 1
+25 409 1
+25 410 1
+25 412 1
+25 413 1
+25 414 1
+25 420 1
+25 425 1
+25 429 1
+25 432 1
+25 434 1
+25 435 1
+25 440 1
+25 444 1
+25 447 1
+25 449 1
+25 450 1
+25 454 1
+25 457 1
+25 459 1
+25 460 1
+25 463 1
+25 465 1
+25 466 1
+25 468 1
+25 469 1
+25 470 1
+25 475 1
+25 479 1
+25 482 1
+25 484 1
+25 485 1
+25 489 1
+25 492 1
+25 494 1
+25 495 1
+25 498 1
+25 500 1
+25 501 1
+25 503 1
+25 504 1
+25 505 1
+25 509 1
+25 512 1
+25 514 1
+25 515 1
+25 518 1
+25 520 1
+25 521 1
+25 523 1
+25 524 1
+25 525 1
+25 528 1
+25 530 1
+25 531 1
+25 533 1
+25 534 1
+25 535 1
+25 537 1
+25 538 1
+25 539 1
+25 540 1
+25 546 1
+25 551 1
+25 555 1
+25 558 1
+25 560 1
+25 561 1
+25 566 1
+25 570 1
+25 573 1
+25 575 1
+25 576 1
+25 580 1
+25 583 1
+25 585 1
+25 586 1
+25 589 1
+25 591 1
+25 592 1
+25 594 1
+25 595 1
+25 596 1
+25 601 1
+25 605 1
+25 608 1
+25 610 1
+25 611 1
+25 615 1
+25 618 1
+25 620 1
+25 621 1
+25 624 1
+25 626 1
+25 627 1
+25 629 1
+25 630 1
+25 631 1
+25 635 1
+25 638 1
+25 640 1
+25 641 1
+25 644 1
+25 646 1
+25 647 1
+25 649 1
+25 650 1
+25 651 1
+25 654 1
+25 656 1
+25 657 1
+25 659 1
+25 660 1
+25 661 1
+25 663 1
+25 664 1
+25 665 1
+25 666 1
+25 671 1
+25 675 1
+25 678 1
+25 680 1
+25 681 1
+25 685 1
+25 688 1
+25 690 1
+25 691 1
+25 694 1
+25 696 1
+25 697 1
+25 699 1
+25 700 1
+25 701 1
+25 705 1
+25 708 1
+25 710 1
+25 711 1
+25 714 1
+25 716 1
+25 717 1
+25 719 1
+25 720 1
+25 721 1
+25 724 1
+25 726 1
+25 727 1
+25 729 1
+25 730 1
+25 731 1
+25 733 1
+25 734 1
+25 735 1
+25 736 1
+25 740 1
+25 743 1
+25 745 1
+25 746 1
+25 749 1
+25 751 1
+25 752 1
+25 754 1
+25 755 1
+25 756 1
+25 759 1
+25 761 1
+25 762 1
+25 764 1
+25 765 1
+25 766 1
+25 768 1
+25 769 1
+25 770 1
+25 771 1
+25 774 1
+25 776 1
+25 777 1
+25 779 1
+25 780 1
+25 781 1
+25 783 1
+25 784 1
+25 785 1
+25 786 1
+25 788 1
+25 789 1
+25 790 1
+25 791 1
+25 792 1
+25 1723 1
+25 1729 1
+25 1734 1
+25 1738 1
+25 1741 1
+25 1743 1
+25 1744 1
+25 1750 1
+25 1755 1
+25 1759 1
+25 1762 1
+25 1764 1
+25 1765 1
+25 1770 1
+25 1774 1
+25 1777 1
+25 1779 1
+25 1780 1
+25 1784 1
+25 1787 1
+25 1789 1
+25 1790 1
+25 1793 1
+25 1795 1
+25 1796 1
+25 1798 1
+25 1799 1
+25 1800 1
+25 1806 1
+25 1811 1
+25 1815 1
+25 1818 1
+25 1820 1
+25 1821 1
+25 1826 1
+25 1830 1
+25 1833 1
+25 1835 1
+25 1836 1
+25 1840 1
+25 1843 1
+25 1845 1
+25 1846 1
+25 1849 1
+25 1851 1
+25 1852 1
+25 1854 1
+25 1855 1
+25 1856 1
+25 1861 1
+25 1865 1
+25 1868 1
+25 1870 1
+25 1871 1
+25 1875 1
+25 1878 1
+25 1880 1
+25 1881 1
+25 1884 1
+25 1886 1
+25 1887 1
+25 1889 1
+25 1890 1
+25 1891 1
+25 1895 1
+25 1898 1
+25 1900 1
+25 1901 1
+25 1904 1
+25 1906 1
+25 1907 1
+25 1909 1
+25 1910 1
+25 1911 1
+25 1914 1
+25 1916 1
+25 1917 1
+25 1919 1
+25 1920 1
+25 1921 1
+25 1923 1
+25 1924 1
+25 1925 1
+25 1926 1
+25 1932 1
+25 1937 1
+25 1941 1
+25 1944 1
+25 1946 1
+25 1947 1
+25 1952 1
+25 1956 1
+25 1959 1
+25 1961 1
+25 1962 1
+25 1966 1
+25 1969 1
+25 1971 1
+25 1972 1
+25 1975 1
+25 1977 1
+25 1978 1
+25 1980 1
+25 1981 1
+25 1982 1
+25 1987 1
+25 1991 1
+25 1994 1
+25 1996 1
+25 1997 1
+25 2001 1
+25 2004 1
+25 2006 1
+25 2007 1
+25 2010 1
+25 2012 1
+25 2013 1
+25 2015 1
+25 2016 1
+25 2017 1
+25 2021 1
+25 2024 1
+25 2026 1
+25 2027 1
+25 2030 1
+25 2032 1
+25 2033 1
+25 2035 1
+25 2036 1
+25 2037 1
+25 2040 1
+25 2042 1
+25 2043 1
+25 2045 1
+25 2046 1
+25 2047 1
+25 2049 1
+25 2050 1
+25 2051 1
+25 2052 1
+25 2057 1
+25 2061 1
+25 2064 1
+25 2066 1
+25 2067 1
+25 2071 1
+25 2074 1
+25 2076 1
+25 2077 1
+25 2080 1
+25 2082 1
+25 2083 1
+25 2085 1
+25 2086 1
+25 2087 1
+25 2091 1
+25 2094 1
+25 2096 1
+25 2097 1
+25 2100 1
+25 2102 1
+25 2103 1
+25 2105 1
+25 2106 1
+25 2107 1
+25 2110 1
+25 2112 1
+25 2113 1
+25 2115 1
+25 2116 1
+25 2117 1
+25 2119 1
+25 2120 1
+25 2121 1
+25 2122 1
+25 2126 1
+25 2129 1
+25 2131 1
+25 2132 1
+25 2135 1
+25 2137 1
+25 2138 1
+25 2140 1
+25 2141 1
+25 2142 1
+25 2145 1
+25 2147 1
+25 2148 1
+25 2150 1
+25 2151 1
+25 2152 1
+25 2154 1
+25 2155 1
+25 2156 1
+25 2157 1
+25 2160 1
+25 2162 1
+25 2163 1
+25 2165 1
+25 2166 1
+25 2167 1
+25 2169 1
+25 2170 1
+25 2171 1
+25 2172 1
+25 2174 1
+25 2175 1
+25 2176 1
+25 2177 1
+25 2178 1
+25 2184 1
+25 2189 1
+25 2193 1
+25 2196 1
+25 2198 1
+25 2199 1
+25 2204 1
+25 2208 1
+25 2211 1
+25 2213 1
+25 2214 1
+25 2218 1
+25 2221 1
+25 2223 1
+25 2224 1
+25 2227 1
+25 2229 1
+25 2230 1
+25 2232 1
+25 2233 1
+25 2234 1
+25 2239 1
+25 2243 1
+25 2246 1
+25 2248 1
+25 2249 1
+25 2253 1
+25 2256 1
+25 2258 1
+25 2259 1
+25 2262 1
+25 2264 1
+25 2265 1
+25 2267 1
+25 2268 1
+25 2269 1
+25 2273 1
+25 2276 1
+25 2278 1
+25 2279 1
+25 2282 1
+25 2284 1
+25 2285 1
+25 2287 1
+25 2288 1
+25 2289 1
+25 2292 1
+25 2294 1
+25 2295 1
+25 2297 1
+25 2298 1
+25 2299 1
+25 2301 1
+25 2302 1
+25 2303 1
+25 2304 1
+25 2309 1
+25 2313 1
+25 2316 1
+25 2318 1
+25 2319 1
+25 2323 1
+25 2326 1
+25 2328 1
+25 2329 1
+25 2332 1
+25 2334 1
+25 2335 1
+25 2337 1
+25 2338 1
+25 2339 1
+25 2343 1
+25 2346 1
+25 2348 1
+25 2349 1
+25 2352 1
+25 2354 1
+25 2355 1
+25 2357 1
+25 2358 1
+25 2359 1
+25 2362 1
+25 2364 1
+25 2365 1
+25 2367 1
+25 2368 1
+25 2369 1
+25 2371 1
+25 2372 1
+25 2373 1
+25 2374 1
+25 2378 1
+25 2381 1
+25 2383 1
+25 2384 1
+25 2387 1
+25 2389 1
+25 2390 1
+25 2392 1
+25 2393 1
+25 2394 1
+25 2397 1
+25 2399 1
+25 2400 1
+25 2402 1
+25 2403 1
+25 2404 1
+25 2406 1
+25 2407 1
+25 2408 1
+25 2409 1
+25 2412 1
+25 2414 1
+25 2415 1
+25 2417 1
+25 2418 1
+25 2419 1
+25 2421 1
+25 2422 1
+25 2423 1
+25 2424 1
+25 2426 1
+25 2427 1
+25 2428 1
+25 2429 1
+25 2430 1
+25 2435 1
+25 2439 1
+25 2442 1
+25 2444 1
+25 2445 1
+25 2449 1
+25 2452 1
+25 2454 1
+25 2455 1
+25 2458 1
+25 2460 1
+25 2461 1
+25 2463 1
+25 2464 1
+25 2465 1
+25 2469 1
+25 2472 1
+25 2474 1
+25 2475 1
+25 2478 1
+25 2480 1
+25 2481 1
+25 2483 1
+25 2484 1
+25 2485 1
+25 2488 1
+25 2490 1
+25 2491 1
+25 2493 1
+25 2494 1
+25 2495 1
+25 2497 1
+25 2498 1
+25 2499 1
+25 2500 1
+25 2504 1
+25 2507 1
+25 2509 1
+25 2510 1
+25 2513 1
+25 2515 1
+25 2516 1
+25 2518 1
+25 2519 1
+25 2520 1
+25 2523 1
+25 2525 1
+25 2526 1
+25 2528 1
+25 2529 1
+25 2530 1
+25 2532 1
+25 2533 1
+25 2534 1
+25 2535 1
+25 2538 1
+25 2540 1
+25 2541 1
+25 2543 1
+25 2544 1
+25 2545 1
+25 2547 1
+25 2548 1
+25 2549 1
+25 2550 1
+25 2552 1
+25 2553 1
+25 2554 1
+25 2555 1
+25 2556 1
+25 2560 1
+25 2563 1
+25 2565 1
+25 2566 1
+25 2569 1
+25 2571 1
+25 2572 1
+25 2574 1
+25 2575 1
+25 2576 1
+25 2579 1
+25 2581 1
+25 2582 1
+25 2584 1
+25 2585 1
+25 2586 1
+25 2588 1
+25 2589 1
+25 2590 1
+25 2591 1
+25 2594 1
+25 2596 1
+25 2597 1
+25 2599 1
+25 2600 1
+25 2601 1
+25 2603 1
+25 2604 1
+25 2605 1
+25 2606 1
+25 2608 1
+25 2609 1
+25 2610 1
+25 2611 1
+25 2612 1
+25 2615 1
+25 2617 1
+25 2618 1
+25 2620 1
+25 2621 1
+25 2622 1
+25 2624 1
+25 2625 1
+25 2626 1
+25 2627 1
+25 2629 1
+25 2630 1
+25 2631 1
+25 2632 1
+25 2633 1
+25 2635 1
+25 2636 1
+25 2637 1
+25 2638 1
+25 2639 1
+25 2640 1
+26 1 1
+26 2 1
+26 3 1
+26 4 1
+26 5 1
+26 6 1
+26 7 1
+26 8 1
+26 9 1
+26 10 1
+26 11 1
+26 12 1
+26 13 1
+26 14 1
+26 15 1
+26 16 1
+26 17 1
+26 18 1
+26 19 1
+26 20 1
+26 21 1
+26 22 1
+26 23 1
+26 24 1
+26 25 1
+26 26 1
+26 27 1
+26 28 1
+26 29 1
+26 30 1
+26 31 1
+26 32 1
+26 33 1
+26 34 1
+26 35 1
+26 36 1
+26 37 1
+26 38 1
+26 39 1
+26 40 1
+26 41 1
+26 42 1
+26 43 1
+26 44 1
+26 45 1
+26 46 1
+26 47 1
+26 48 1
+26 49 1
+26 50 1
+26 51 1
+26 52 1
+26 53 1
+26 54 1
+26 55 1
+26 56 1
+26 57 1
+26 58 1
+26 59 1
+26 60 1
+26 61 1
+26 62 1
+26 63 1
+26 64 1
+26 65 1
+26 66 1
+26 67 1
+26 68 1
+26 69 1
+26 70 1
+26 71 1
+26 72 1
+26 73 1
+26 74 1
+26 75 1
+26 76 1
+26 77 1
+26 78 1
+26 79 1
+26 80 1
+26 81 1
+26 82 1
+26 83 1
+26 84 1
+26 85 1
+26 86 1
+26 87 1
+26 88 1
+26 89 1
+26 90 1
+26 91 1
+26 92 1
+26 93 1
+26 94 1
+26 95 1
+26 96 1
+26 97 1
+26 98 1
+26 99 1
+26 100 1
+26 101 1
+26 102 1
+26 103 1
+26 104 1
+26 105 1
+26 106 1
+26 107 1
+26 108 1
+26 109 1
+26 110 1
+26 111 1
+26 112 1
+26 113 1
+26 114 1
+26 115 1
+26 116 1
+26 117 1
+26 118 1
+26 119 1
+26 120 1
+26 793 1
+26 794 1
+26 795 1
+26 796 1
+26 797 1
+26 798 1
+26 799 1
+26 800 1
+26 801 1
+26 802 1
+26 803 1
+26 804 1
+26 805 1
+26 806 1
+26 807 1
+26 808 1
+26 809 1
+26 810 1
+26 811 1
+26 812 1
+26 813 1
+26 814 1
+26 815 1
+26 816 1
+26 817 1
+26 818 1
+26 819 1
+26 820 1
+26 821 1
+26 822 1
+26 823 1
+26 824 1
+26 825 1
+26 826 1
+26 827 1
+26 828 1
+26 829 1
+26 830 1
+26 831 1
+26 832 1
+26 833 1
+26 834 1
+26 835 1
+26 836 1
+26 837 1
+26 838 1
+26 839 1
+26 840 1
+26 841 1
+26 842 1
+26 843 1
+26 844 1
+26 845 1
+26 846 1
+26 847 1
+26 848 1
+26 849 1
+26 850 1
+26 851 1
+26 852 1
+26 853 1
+26 854 1
+26 855 1
+26 856 1
+26 857 1
+26 858 1
+26 859 1
+26 860 1
+26 861 1
+26 862 1
+26 863 1
+26 864 1
+26 865 1
+26 866 1
+26 867 1
+26 868 1
+26 869 1
+26 870 1
+26 871 1
+26 872 1
+26 873 1
+26 874 1
+26 875 1
+26 876 1
+26 877 1
+26 878 1
+26 879 1
+26 880 1
+26 881 1
+26 882 1
+26 883 1
+26 884 1
+26 885 1
+26 886 1
+26 887 1
+26 888 1
+26 889 1
+26 890 1
+26 891 1
+26 892 1
+26 893 1
+26 894 1
+26 895 1
+26 896 1
+26 897 1
+26 898 1
+26 899 1
+26 900 1
+26 901 1
+26 902 1
+26 903 1
+26 904 1
+26 905 1
+26 906 1
+26 907 1
+26 908 1
+26 909 1
+26 910 1
+26 911 1
+26 912 1
+26 913 1
+26 914 1
+26 915 1
+26 916 1
+26 917 1
+26 918 1
+26 919 1
+26 920 1
+26 921 1
+26 922 1
+26 923 1
+26 924 1
+26 925 1
+26 926 1
+26 927 1
+26 928 1
+26 929 1
+26 930 1
+26 931 1
+26 932 1
+26 933 1
+26 934 1
+26 935 1
+26 936 1
+26 937 1
+26 938 1
+26 939 1
+26 940 1
+26 941 1
+26 942 1
+26 943 1
+26 944 1
+26 945 1
+26 946 1
+26 947 1
+26 948 1
+26 949 1
+26 950 1
+26 951 1
+26 952 1
+26 953 1
+26 954 1
+26 955 1
+26 956 1
+26 957 1
+26 958 1
+26 959 1
+26 960 1
+26 961 1
+26 962 1
+26 963 1
+26 964 1
+26 965 1
+26 966 1
+26 967 1
+26 968 1
+26 969 1
+26 970 1
+26 971 1
+26 972 1
+26 973 1
+26 974 1
+26 975 1
+26 976 1
+26 977 1
+26 978 1
+26 979 1
+26 980 1
+26 981 1
+26 982 1
+26 983 1
+26 984 1
+26 985 1
+26 986 1
+26 987 1
+26 988 1
+26 989 1
+26 990 1
+26 991 1
+26 992 1
+26 993 1
+26 994 1
+26 995 1
+26 996 1
+26 997 1
+26 998 1
+26 999 1
+26 1000 1
+26 1001 1
+26 1002 1
+26 1717 1
+26 1718 1
+26 1719 1
+26 1720 1
+26 1721 1
+26 1722 1
+26 1723 1
+26 1724 1
+26 1725 1
+26 1726 1
+26 1727 1
+26 1728 1
+26 1729 1
+26 1730 1
+26 1731 1
+26 1732 1
+26 1733 1
+26 1734 1
+26 1735 1
+26 1736 1
+26 1737 1
+26 1738 1
+26 1739 1
+26 1740 1
+26 1741 1
+26 1742 1
+26 1743 1
+26 1744 1
+26 1745 1
+26 1746 1
+26 1747 1
+26 1748 1
+26 1749 1
+26 1750 1
+26 1751 1
+26 1752 1
+26 1753 1
+26 1754 1
+26 1755 1
+26 1756 1
+26 1757 1
+26 1758 1
+26 1759 1
+26 1760 1
+26 1761 1
+26 1762 1
+26 1763 1
+26 1764 1
+26 1765 1
+26 1766 1
+26 1767 1
+26 1768 1
+26 1769 1
+26 1770 1
+26 1771 1
+26 1772 1
+26 1773 1
+26 1774 1
+26 1775 1
+26 1776 1
+26 1777 1
+26 1778 1
+26 1779 1
+26 1780 1
+26 1781 1
+26 1782 1
+26 1783 1
+26 1784 1
+26 1785 1
+26 1786 1
+26 1787 1
+26 1788 1
+26 1789 1
+26 1790 1
+26 1791 1
+26 1792 1
+26 1793 1
+26 1794 1
+26 1795 1
+26 1796 1
+26 1797 1
+26 1798 1
+26 1799 1
+26 1800 1
+26 1801 1
+26 1802 1
+26 1803 1
+26 1804 1
+26 1805 1
+26 1806 1
+26 1807 1
+26 1808 1
+26 1809 1
+26 1810 1
+26 1811 1
+26 1812 1
+26 1813 1
+26 1814 1
+26 1815 1
+26 1816 1
+26 1817 1
+26 1818 1
+26 1819 1
+26 1820 1
+26 1821 1
+26 1822 1
+26 1823 1
+26 1824 1
+26 1825 1
+26 1826 1
+26 1827 1
+26 1828 1
+26 1829 1
+26 1830 1
+26 1831 1
+26 1832 1
+26 1833 1
+26 1834 1
+26 1835 1
+26 1836 1
+26 1837 1
+26 1838 1
+26 1839 1
+26 1840 1
+26 1841 1
+26 1842 1
+26 1843 1
+26 1844 1
+26 1845 1
+26 1846 1
+26 1847 1
+26 1848 1
+26 1849 1
+26 1850 1
+26 1851 1
+26 1852 1
+26 1853 1
+26 1854 1
+26 1855 1
+26 1856 1
+26 1857 1
+26 1858 1
+26 1859 1
+26 1860 1
+26 1861 1
+26 1862 1
+26 1863 1
+26 1864 1
+26 1865 1
+26 1866 1
+26 1867 1
+26 1868 1
+26 1869 1
+26 1870 1
+26 1871 1
+26 1872 1
+26 1873 1
+26 1874 1
+26 1875 1
+26 1876 1
+26 1877 1
+26 1878 1
+26 1879 1
+26 1880 1
+26 1881 1
+26 1882 1
+26 1883 1
+26 1884 1
+26 1885 1
+26 1886 1
+26 1887 1
+26 1888 1
+26 1889 1
+26 1890 1
+26 1891 1
+26 1892 1
+26 1893 1
+26 1894 1
+26 1895 1
+26 1896 1
+26 1897 1
+26 1898 1
+26 1899 1
+26 1900 1
+26 1901 1
+26 1902 1
+26 1903 1
+26 1904 1
+26 1905 1
+26 1906 1
+26 1907 1
+26 1908 1
+26 1909 1
+26 1910 1
+26 1911 1
+26 1912 1
+26 1913 1
+26 1914 1
+26 1915 1
+26 1916 1
+26 1917 1
+26 1918 1
+26 1919 1
+26 1920 1
+26 1921 1
+26 1922 1
+26 1923 1
+26 1924 1
+26 1925 1
+26 1926 1
+26 2641 1
+26 2642 1
+26 2643 1
+26 2644 1
+26 2645 1
+26 2646 1
+26 2647 1
+26 2648 1
+26 2649 1
+26 2650 1
+26 2651 1
+26 2652 1
+26 2653 1
+26 2654 1
+26 2655 1
+26 2656 1
+26 2657 1
+26 2658 1
+26 2659 1
+26 2660 1
+26 2661 1
+26 2662 1
+26 2663 1
+26 2664 1
+26 2665 1
+26 2666 1
+26 2667 1
+26 2668 1
+26 2669 1
+26 2670 1
+26 2671 1
+26 2672 1
+26 2673 1
+26 2674 1
+26 2675 1
+26 2676 1
+26 2677 1
+26 2678 1
+26 2679 1
+26 2680 1
+26 2681 1
+26 2682 1
+26 2683 1
+26 2684 1
+26 2685 1
+26 2686 1
+26 2687 1
+26 2688 1
+26 2689 1
+26 2690 1
+26 2691 1
+26 2692 1
+26 2693 1
+26 2694 1
+26 2695 1
+26 2696 1
+26 2697 1
+26 2698 1
+26 2699 1
+26 2700 1
+26 2701 1
+26 2702 1
+26 2703 1
+26 2704 1
+26 2705 1
+26 2706 1
+26 2707 1
+26 2708 1
+26 2709 1
+26 2710 1
+26 2711 1
+26 2712 1
+26 2713 1
+26 2714 1
+26 2715 1
+26 2716 1
+26 2717 1
+26 2718 1
+26 2719 1
+26 2720 1
+26 2721 1
+26 2722 1
+26 2723 1
+26 2724 1
+26 2725 1
+26 2726 1
+26 2727 1
+26 2728 1
+26 2729 1
+26 2730 1
+26 2731 1
+26 2732 1
+26 2733 1
+26 2734 1
+26 2735 1
+26 2736 1
+26 2737 1
+26 2738 1
+26 2739 1
+26 2740 1
+26 2741 1
+26 2742 1
+26 2743 1
+26 2744 1
+26 2745 1
+26 2746 1
+26 2747 1
+26 2748 1
+26 2749 1
+26 2750 1
+26 2751 1
+26 2752 1
+26 2753 1
+26 2754 1
+26 2755 1
+26 2756 1
+26 2757 1
+26 2758 1
+26 2759 1
+26 2760 1
+26 2761 1
+26 2762 1
+26 2763 1
+26 2764 1
+26 2765 1
+26 2766 1
+26 2767 1
+26 2768 1
+26 2769 1
+26 2770 1
+26 2771 1
+26 2772 1
+26 2773 1
+26 2774 1
+26 2775 1
+26 2776 1
+26 2777 1
+26 2778 1
+26 2779 1
+26 2780 1
+26 2781 1
+26 2782 1
+26 2783 1
+26 2784 1
+26 2785 1
+26 2786 1
+26 2787 1
+26 2788 1
+26 2789 1
+26 2790 1
+26 2791 1
+26 2792 1
+26 2793 1
+26 2794 1
+26 2795 1
+26 2796 1
+26 2797 1
+26 2798 1
+26 2799 1
+26 2800 1
+26 2801 1
+26 2802 1
+26 2803 1
+26 2804 1
+26 2805 1
+26 2806 1
+26 2807 1
+26 2808 1
+26 2809 1
+26 2810 1
+26 2811 1
+26 2812 1
+26 2813 1
+26 2814 1
+26 2815 1
+26 2816 1
+26 2817 1
+26 2818 1
+26 2819 1
+26 2820 1
+26 2821 1
+26 2822 1
+26 2823 1
+26 2824 1
+26 2825 1
+26 2826 1
+26 2827 1
+26 2828 1
+26 2829 1
+26 2830 1
+26 2831 1
+26 2832 1
+26 2833 1
+26 2834 1
+26 2835 1
+26 2836 1
+26 2837 1
+26 2838 1
+26 2839 1
+26 2840 1
+26 2841 1
+26 2842 1
+26 2843 1
+26 2844 1
+26 2845 1
+26 2846 1
+26 2847 1
+26 2848 1
+26 2849 1
+26 2850 1
+26 2851 1
+26 2852 1
+26 2853 1
+26 2854 1
+26 2855 1
+26 2856 1
+26 2857 1
+26 2858 1
+26 2859 1
+26 2860 1
+26 2861 1
+26 2862 1
+26 2863 1
+26 2864 1
+26 2865 1
+26 2866 1
+26 2867 1
+26 2868 1
+26 2869 1
+26 2870 1
+26 2871 1
+26 2872 1
+26 2873 1
+26 2874 1
+26 2875 1
+26 2876 1
+26 2877 1
+26 2878 1
+26 2879 1
+26 2880 1
+26 2881 1
+26 2882 1
+26 2883 1
+26 2884 1
+26 2885 1
+26 2886 1
+26 2887 1
+26 2888 1
+26 2889 1
+26 2890 1
+26 2891 1
+26 2892 1
+27 1 1
+27 2 1
+27 3 1
+27 4 1
+27 5 1
+27 6 1
+27 7 1
+27 8 1
+27 9 1
+27 10 1
+27 11 1
+27 12 1
+27 13 1
+27 14 1
+27 15 1
+27 16 1
+27 17 1
+27 18 1
+27 19 1
+27 20 1
+27 21 1
+27 22 1
+27 23 1
+27 24 1
+27 25 1
+27 26 1
+27 27 1
+27 28 1
+27 29 1
+27 30 1
+27 31 1
+27 32 1
+27 33 1
+27 34 1
+27 35 1
+27 36 1
+27 121 1
+27 122 1
+27 123 1
+27 124 1
+27 125 1
+27 126 1
+27 127 1
+27 128 1
+27 129 1
+27 130 1
+27 131 1
+27 132 1
+27 133 1
+27 134 1
+27 135 1
+27 136 1
+27 137 1
+27 138 1
+27 139 1
+27 140 1
+27 141 1
+27 142 1
+27 143 1
+27 144 1
+27 145 1
+27 146 1
+27 147 1
+27 148 1
+27 149 1
+27 150 1
+27 151 1
+27 152 1
+27 153 1
+27 154 1
+27 155 1
+27 156 1
+27 157 1
+27 158 1
+27 159 1
+27 160 1
+27 161 1
+27 162 1
+27 163 1
+27 164 1
+27 165 1
+27 166 1
+27 167 1
+27 168 1
+27 169 1
+27 170 1
+27 171 1
+27 172 1
+27 173 1
+27 174 1
+27 175 1
+27 176 1
+27 177 1
+27 178 1
+27 179 1
+27 180 1
+27 181 1
+27 182 1
+27 183 1
+27 184 1
+27 185 1
+27 186 1
+27 187 1
+27 188 1
+27 189 1
+27 190 1
+27 191 1
+27 192 1
+27 193 1
+27 194 1
+27 195 1
+27 196 1
+27 197 1
+27 198 1
+27 199 1
+27 200 1
+27 201 1
+27 202 1
+27 203 1
+27 204 1
+27 793 1
+27 794 1
+27 795 1
+27 796 1
+27 797 1
+27 798 1
+27 799 1
+27 800 1
+27 801 1
+27 802 1
+27 803 1
+27 804 1
+27 805 1
+27 806 1
+27 807 1
+27 808 1
+27 809 1
+27 810 1
+27 811 1
+27 812 1
+27 813 1
+27 814 1
+27 815 1
+27 816 1
+27 817 1
+27 818 1
+27 819 1
+27 820 1
+27 821 1
+27 822 1
+27 823 1
+27 824 1
+27 825 1
+27 826 1
+27 827 1
+27 828 1
+27 829 1
+27 830 1
+27 831 1
+27 832 1
+27 833 1
+27 834 1
+27 835 1
+27 836 1
+27 837 1
+27 838 1
+27 839 1
+27 840 1
+27 841 1
+27 842 1
+27 843 1
+27 844 1
+27 845 1
+27 846 1
+27 847 1
+27 848 1
+27 849 1
+27 850 1
+27 851 1
+27 852 1
+27 853 1
+27 854 1
+27 855 1
+27 856 1
+27 857 1
+27 858 1
+27 859 1
+27 860 1
+27 861 1
+27 862 1
+27 863 1
+27 864 1
+27 865 1
+27 866 1
+27 867 1
+27 868 1
+27 869 1
+27 870 1
+27 871 1
+27 872 1
+27 873 1
+27 874 1
+27 875 1
+27 876 1
+27 1003 1
+27 1004 1
+27 1005 1
+27 1006 1
+27 1007 1
+27 1008 1
+27 1009 1
+27 1010 1
+27 1011 1
+27 1012 1
+27 1013 1
+27 1014 1
+27 1015 1
+27 1016 1
+27 1017 1
+27 1018 1
+27 1019 1
+27 1020 1
+27 1021 1
+27 1022 1
+27 1023 1
+27 1024 1
+27 1025 1
+27 1026 1
+27 1027 1
+27 1028 1
+27 1029 1
+27 1030 1
+27 1031 1
+27 1032 1
+27 1033 1
+27 1034 1
+27 1035 1
+27 1036 1
+27 1037 1
+27 1038 1
+27 1039 1
+27 1040 1
+27 1041 1
+27 1042 1
+27 1043 1
+27 1044 1
+27 1045 1
+27 1046 1
+27 1047 1
+27 1048 1
+27 1049 1
+27 1050 1
+27 1051 1
+27 1052 1
+27 1053 1
+27 1054 1
+27 1055 1
+27 1056 1
+27 1057 1
+27 1058 1
+27 1059 1
+27 1060 1
+27 1061 1
+27 1062 1
+27 1063 1
+27 1064 1
+27 1065 1
+27 1066 1
+27 1067 1
+27 1068 1
+27 1069 1
+27 1070 1
+27 1071 1
+27 1072 1
+27 1073 1
+27 1074 1
+27 1075 1
+27 1076 1
+27 1077 1
+27 1078 1
+27 1079 1
+27 1080 1
+27 1081 1
+27 1082 1
+27 1083 1
+27 1084 1
+27 1085 1
+27 1086 1
+27 1087 1
+27 1088 1
+27 1089 1
+27 1090 1
+27 1091 1
+27 1092 1
+27 1093 1
+27 1094 1
+27 1095 1
+27 1096 1
+27 1097 1
+27 1098 1
+27 1099 1
+27 1100 1
+27 1101 1
+27 1102 1
+27 1103 1
+27 1104 1
+27 1105 1
+27 1106 1
+27 1107 1
+27 1108 1
+27 1109 1
+27 1110 1
+27 1111 1
+27 1112 1
+27 1113 1
+27 1114 1
+27 1115 1
+27 1116 1
+27 1117 1
+27 1118 1
+27 1119 1
+27 1120 1
+27 1121 1
+27 1122 1
+27 1123 1
+27 1124 1
+27 1125 1
+27 1126 1
+27 1127 1
+27 1128 1
+27 1717 1
+27 1718 1
+27 1719 1
+27 1720 1
+27 1721 1
+27 1722 1
+27 1723 1
+27 1724 1
+27 1725 1
+27 1726 1
+27 1727 1
+27 1728 1
+27 1729 1
+27 1730 1
+27 1731 1
+27 1732 1
+27 1733 1
+27 1734 1
+27 1735 1
+27 1736 1
+27 1737 1
+27 1738 1
+27 1739 1
+27 1740 1
+27 1741 1
+27 1742 1
+27 1743 1
+27 1744 1
+27 1745 1
+27 1746 1
+27 1747 1
+27 1748 1
+27 1749 1
+27 1750 1
+27 1751 1
+27 1752 1
+27 1753 1
+27 1754 1
+27 1755 1
+27 1756 1
+27 1757 1
+27 1758 1
+27 1759 1
+27 1760 1
+27 1761 1
+27 1762 1
+27 1763 1
+27 1764 1
+27 1765 1
+27 1766 1
+27 1767 1
+27 1768 1
+27 1769 1
+27 1770 1
+27 1771 1
+27 1772 1
+27 1773 1
+27 1774 1
+27 1775 1
+27 1776 1
+27 1777 1
+27 1778 1
+27 1779 1
+27 1780 1
+27 1781 1
+27 1782 1
+27 1783 1
+27 1784 1
+27 1785 1
+27 1786 1
+27 1787 1
+27 1788 1
+27 1789 1
+27 1790 1
+27 1791 1
+27 1792 1
+27 1793 1
+27 1794 1
+27 1795 1
+27 1796 1
+27 1797 1
+27 1798 1
+27 1799 1
+27 1800 1
+27 1927 1
+27 1928 1
+27 1929 1
+27 1930 1
+27 1931 1
+27 1932 1
+27 1933 1
+27 1934 1
+27 1935 1
+27 1936 1
+27 1937 1
+27 1938 1
+27 1939 1
+27 1940 1
+27 1941 1
+27 1942 1
+27 1943 1
+27 1944 1
+27 1945 1
+27 1946 1
+27 1947 1
+27 1948 1
+27 1949 1
+27 1950 1
+27 1951 1
+27 1952 1
+27 1953 1
+27 1954 1
+27 1955 1
+27 1956 1
+27 1957 1
+27 1958 1
+27 1959 1
+27 1960 1
+27 1961 1
+27 1962 1
+27 1963 1
+27 1964 1
+27 1965 1
+27 1966 1
+27 1967 1
+27 1968 1
+27 1969 1
+27 1970 1
+27 1971 1
+27 1972 1
+27 1973 1
+27 1974 1
+27 1975 1
+27 1976 1
+27 1977 1
+27 1978 1
+27 1979 1
+27 1980 1
+27 1981 1
+27 1982 1
+27 1983 1
+27 1984 1
+27 1985 1
+27 1986 1
+27 1987 1
+27 1988 1
+27 1989 1
+27 1990 1
+27 1991 1
+27 1992 1
+27 1993 1
+27 1994 1
+27 1995 1
+27 1996 1
+27 1997 1
+27 1998 1
+27 1999 1
+27 2000 1
+27 2001 1
+27 2002 1
+27 2003 1
+27 2004 1
+27 2005 1
+27 2006 1
+27 2007 1
+27 2008 1
+27 2009 1
+27 2010 1
+27 2011 1
+27 2012 1
+27 2013 1
+27 2014 1
+27 2015 1
+27 2016 1
+27 2017 1
+27 2018 1
+27 2019 1
+27 2020 1
+27 2021 1
+27 2022 1
+27 2023 1
+27 2024 1
+27 2025 1
+27 2026 1
+27 2027 1
+27 2028 1
+27 2029 1
+27 2030 1
+27 2031 1
+27 2032 1
+27 2033 1
+27 2034 1
+27 2035 1
+27 2036 1
+27 2037 1
+27 2038 1
+27 2039 1
+27 2040 1
+27 2041 1
+27 2042 1
+27 2043 1
+27 2044 1
+27 2045 1
+27 2046 1
+27 2047 1
+27 2048 1
+27 2049 1
+27 2050 1
+27 2051 1
+27 2052 1
+27 2641 1
+27 2642 1
+27 2643 1
+27 2644 1
+27 2645 1
+27 2646 1
+27 2647 1
+27 2648 1
+27 2649 1
+27 2650 1
+27 2651 1
+27 2652 1
+27 2653 1
+27 2654 1
+27 2655 1
+27 2656 1
+27 2657 1
+27 2658 1
+27 2659 1
+27 2660 1
+27 2661 1
+27 2662 1
+27 2663 1
+27 2664 1
+27 2665 1
+27 2666 1
+27 2667 1
+27 2668 1
+27 2669 1
+27 2670 1
+27 2671 1
+27 2672 1
+27 2673 1
+27 2674 1
+27 2675 1
+27 2676 1
+27 2677 1
+27 2678 1
+27 2679 1
+27 2680 1
+27 2681 1
+27 2682 1
+27 2683 1
+27 2684 1
+27 2685 1
+27 2686 1
+27 2687 1
+27 2688 1
+27 2689 1
+27 2690 1
+27 2691 1
+27 2692 1
+27 2693 1
+27 2694 1
+27 2695 1
+27 2696 1
+27 2697 1
+27 2698 1
+27 2699 1
+27 2700 1
+27 2701 1
+27 2702 1
+27 2703 1
+27 2704 1
+27 2705 1
+27 2706 1
+27 2707 1
+27 2708 1
+27 2709 1
+27 2710 1
+27 2711 1
+27 2712 1
+27 2713 1
+27 2714 1
+27 2715 1
+27 2716 1
+27 2717 1
+27 2718 1
+27 2719 1
+27 2720 1
+27 2721 1
+27 2722 1
+27 2723 1
+27 2724 1
+27 2725 1
+27 2726 1
+27 2727 1
+27 2728 1
+27 2729 1
+27 2730 1
+27 2731 1
+27 2732 1
+27 2733 1
+27 2734 1
+27 2735 1
+27 2736 1
+27 2737 1
+27 2738 1
+27 2739 1
+27 2740 1
+27 2741 1
+27 2742 1
+27 2743 1
+27 2744 1
+27 2745 1
+27 2746 1
+27 2747 1
+27 2748 1
+27 2749 1
+27 2750 1
+27 2751 1
+27 2752 1
+27 2753 1
+27 2754 1
+27 2755 1
+27 2756 1
+27 2757 1
+27 2758 1
+27 2759 1
+27 2760 1
+27 2761 1
+27 2762 1
+27 2763 1
+27 2764 1
+27 2765 1
+27 2766 1
+27 2893 1
+27 2894 1
+27 2895 1
+27 2896 1
+27 2897 1
+27 2898 1
+27 2899 1
+27 2900 1
+27 2901 1
+27 2902 1
+27 2903 1
+27 2904 1
+27 2905 1
+27 2906 1
+27 2907 1
+27 2908 1
+27 2909 1
+27 2910 1
+27 2911 1
+27 2912 1
+27 2913 1
+27 2914 1
+27 2915 1
+27 2916 1
+27 2917 1
+27 2918 1
+27 2919 1
+27 2920 1
+27 2921 1
+27 2922 1
+27 2923 1
+27 2924 1
+27 2925 1
+27 2926 1
+27 2927 1
+27 2928 1
+27 2929 1
+27 2930 1
+27 2931 1
+27 2932 1
+27 2933 1
+27 2934 1
+27 2935 1
+27 2936 1
+27 2937 1
+27 2938 1
+27 2939 1
+27 2940 1
+27 2941 1
+27 2942 1
+27 2943 1
+27 2944 1
+27 2945 1
+27 2946 1
+27 2947 1
+27 2948 1
+27 2949 1
+27 2950 1
+27 2951 1
+27 2952 1
+27 2953 1
+27 2954 1
+27 2955 1
+27 2956 1
+27 2957 1
+27 2958 1
+27 2959 1
+27 2960 1
+27 2961 1
+27 2962 1
+27 2963 1
+27 2964 1
+27 2965 1
+27 2966 1
+27 2967 1
+27 2968 1
+27 2969 1
+27 2970 1
+27 2971 1
+27 2972 1
+27 2973 1
+27 2974 1
+27 2975 1
+27 2976 1
+27 2977 1
+27 2978 1
+27 2979 1
+27 2980 1
+27 2981 1
+27 2982 1
+27 2983 1
+27 2984 1
+27 2985 1
+27 2986 1
+27 2987 1
+27 2988 1
+27 2989 1
+27 2990 1
+27 2991 1
+27 2992 1
+27 2993 1
+27 2994 1
+27 2995 1
+27 2996 1
+27 2997 1
+27 2998 1
+27 2999 1
+27 3000 1
+27 3001 1
+27 3002 1
+27 3003 1
+27 3004 1
+27 3005 1
+27 3006 1
+27 3007 1
+27 3008 1
+27 3009 1
+27 3010 1
+27 3011 1
+27 3012 1
+27 3013 1
+27 3014 1
+27 3015 1
+27 3016 1
+27 3017 1
+27 3018 1
+28 1 1
+28 2 1
+28 3 1
+28 4 1
+28 5 1
+28 6 1
+28 7 1
+28 8 1
+28 37 1
+28 38 1
+28 39 1
+28 40 1
+28 41 1
+28 42 1
+28 43 1
+28 44 1
+28 45 1
+28 46 1
+28 47 1
+28 48 1
+28 49 1
+28 50 1
+28 51 1
+28 52 1
+28 53 1
+28 54 1
+28 55 1
+28 56 1
+28 57 1
+28 58 1
+28 59 1
+28 60 1
+28 61 1
+28 62 1
+28 63 1
+28 64 1
+28 121 1
+28 122 1
+28 123 1
+28 124 1
+28 125 1
+28 126 1
+28 127 1
+28 128 1
+28 129 1
+28 130 1
+28 131 1
+28 132 1
+28 133 1
+28 134 1
+28 135 1
+28 136 1
+28 137 1
+28 138 1
+28 139 1
+28 140 1
+28 141 1
+28 142 1
+28 143 1
+28 144 1
+28 145 1
+28 146 1
+28 147 1
+28 148 1
+28 205 1
+28 206 1
+28 207 1
+28 208 1
+28 209 1
+28 210 1
+28 211 1
+28 212 1
+28 213 1
+28 214 1
+28 215 1
+28 216 1
+28 217 1
+28 218 1
+28 219 1
+28 220 1
+28 221 1
+28 222 1
+28 223 1
+28 224 1
+28 225 1
+28 226 1
+28 227 1
+28 228 1
+28 229 1
+28 230 1
+28 231 1
+28 232 1
+28 233 1
+28 234 1
+28 235 1
+28 236 1
+28 237 1
+28 238 1
+28 239 1
+28 240 1
+28 241 1
+28 242 1
+28 243 1
+28 244 1
+28 245 1
+28 246 1
+28 247 1
+28 248 1
+28 249 1
+28 250 1
+28 251 1
+28 252 1
+28 253 1
+28 254 1
+28 255 1
+28 256 1
+28 257 1
+28 258 1
+28 259 1
+28 260 1
+28 793 1
+28 794 1
+28 795 1
+28 796 1
+28 797 1
+28 798 1
+28 799 1
+28 800 1
+28 801 1
+28 802 1
+28 803 1
+28 804 1
+28 805 1
+28 806 1
+28 807 1
+28 808 1
+28 809 1
+28 810 1
+28 811 1
+28 812 1
+28 813 1
+28 814 1
+28 815 1
+28 816 1
+28 817 1
+28 818 1
+28 819 1
+28 820 1
+28 877 1
+28 878 1
+28 879 1
+28 880 1
+28 881 1
+28 882 1
+28 883 1
+28 884 1
+28 885 1
+28 886 1
+28 887 1
+28 888 1
+28 889 1
+28 890 1
+28 891 1
+28 892 1
+28 893 1
+28 894 1
+28 895 1
+28 896 1
+28 897 1
+28 898 1
+28 899 1
+28 900 1
+28 901 1
+28 902 1
+28 903 1
+28 904 1
+28 905 1
+28 906 1
+28 907 1
+28 908 1
+28 909 1
+28 910 1
+28 911 1
+28 912 1
+28 913 1
+28 914 1
+28 915 1
+28 916 1
+28 917 1
+28 918 1
+28 919 1
+28 920 1
+28 921 1
+28 922 1
+28 923 1
+28 924 1
+28 925 1
+28 926 1
+28 927 1
+28 928 1
+28 929 1
+28 930 1
+28 931 1
+28 932 1
+28 1003 1
+28 1004 1
+28 1005 1
+28 1006 1
+28 1007 1
+28 1008 1
+28 1009 1
+28 1010 1
+28 1011 1
+28 1012 1
+28 1013 1
+28 1014 1
+28 1015 1
+28 1016 1
+28 1017 1
+28 1018 1
+28 1019 1
+28 1020 1
+28 1021 1
+28 1022 1
+28 1023 1
+28 1024 1
+28 1025 1
+28 1026 1
+28 1027 1
+28 1028 1
+28 1029 1
+28 1030 1
+28 1031 1
+28 1032 1
+28 1033 1
+28 1034 1
+28 1035 1
+28 1036 1
+28 1037 1
+28 1038 1
+28 1039 1
+28 1040 1
+28 1041 1
+28 1042 1
+28 1043 1
+28 1044 1
+28 1045 1
+28 1046 1
+28 1047 1
+28 1048 1
+28 1049 1
+28 1050 1
+28 1051 1
+28 1052 1
+28 1053 1
+28 1054 1
+28 1055 1
+28 1056 1
+28 1057 1
+28 1058 1
+28 1129 1
+28 1130 1
+28 1131 1
+28 1132 1
+28 1133 1
+28 1134 1
+28 1135 1
+28 1136 1
+28 1137 1
+28 1138 1
+28 1139 1
+28 1140 1
+28 1141 1
+28 1142 1
+28 1143 1
+28 1144 1
+28 1145 1
+28 1146 1
+28 1147 1
+28 1148 1
+28 1149 1
+28 1150 1
+28 1151 1
+28 1152 1
+28 1153 1
+28 1154 1
+28 1155 1
+28 1156 1
+28 1157 1
+28 1158 1
+28 1159 1
+28 1160 1
+28 1161 1
+28 1162 1
+28 1163 1
+28 1164 1
+28 1165 1
+28 1166 1
+28 1167 1
+28 1168 1
+28 1169 1
+28 1170 1
+28 1171 1
+28 1172 1
+28 1173 1
+28 1174 1
+28 1175 1
+28 1176 1
+28 1177 1
+28 1178 1
+28 1179 1
+28 1180 1
+28 1181 1
+28 1182 1
+28 1183 1
+28 1184 1
+28 1185 1
+28 1186 1
+28 1187 1
+28 1188 1
+28 1189 1
+28 1190 1
+28 1191 1
+28 1192 1
+28 1193 1
+28 1194 1
+28 1195 1
+28 1196 1
+28 1197 1
+28 1198 1
+28 1717 1
+28 1718 1
+28 1719 1
+28 1720 1
+28 1721 1
+28 1722 1
+28 1723 1
+28 1724 1
+28 1725 1
+28 1726 1
+28 1727 1
+28 1728 1
+28 1729 1
+28 1730 1
+28 1731 1
+28 1732 1
+28 1733 1
+28 1734 1
+28 1735 1
+28 1736 1
+28 1737 1
+28 1738 1
+28 1739 1
+28 1740 1
+28 1741 1
+28 1742 1
+28 1743 1
+28 1744 1
+28 1801 1
+28 1802 1
+28 1803 1
+28 1804 1
+28 1805 1
+28 1806 1
+28 1807 1
+28 1808 1
+28 1809 1
+28 1810 1
+28 1811 1
+28 1812 1
+28 1813 1
+28 1814 1
+28 1815 1
+28 1816 1
+28 1817 1
+28 1818 1
+28 1819 1
+28 1820 1
+28 1821 1
+28 1822 1
+28 1823 1
+28 1824 1
+28 1825 1
+28 1826 1
+28 1827 1
+28 1828 1
+28 1829 1
+28 1830 1
+28 1831 1
+28 1832 1
+28 1833 1
+28 1834 1
+28 1835 1
+28 1836 1
+28 1837 1
+28 1838 1
+28 1839 1
+28 1840 1
+28 1841 1
+28 1842 1
+28 1843 1
+28 1844 1
+28 1845 1
+28 1846 1
+28 1847 1
+28 1848 1
+28 1849 1
+28 1850 1
+28 1851 1
+28 1852 1
+28 1853 1
+28 1854 1
+28 1855 1
+28 1856 1
+28 1927 1
+28 1928 1
+28 1929 1
+28 1930 1
+28 1931 1
+28 1932 1
+28 1933 1
+28 1934 1
+28 1935 1
+28 1936 1
+28 1937 1
+28 1938 1
+28 1939 1
+28 1940 1
+28 1941 1
+28 1942 1
+28 1943 1
+28 1944 1
+28 1945 1
+28 1946 1
+28 1947 1
+28 1948 1
+28 1949 1
+28 1950 1
+28 1951 1
+28 1952 1
+28 1953 1
+28 1954 1
+28 1955 1
+28 1956 1
+28 1957 1
+28 1958 1
+28 1959 1
+28 1960 1
+28 1961 1
+28 1962 1
+28 1963 1
+28 1964 1
+28 1965 1
+28 1966 1
+28 1967 1
+28 1968 1
+28 1969 1
+28 1970 1
+28 1971 1
+28 1972 1
+28 1973 1
+28 1974 1
+28 1975 1
+28 1976 1
+28 1977 1
+28 1978 1
+28 1979 1
+28 1980 1
+28 1981 1
+28 1982 1
+28 2053 1
+28 2054 1
+28 2055 1
+28 2056 1
+28 2057 1
+28 2058 1
+28 2059 1
+28 2060 1
+28 2061 1
+28 2062 1
+28 2063 1
+28 2064 1
+28 2065 1
+28 2066 1
+28 2067 1
+28 2068 1
+28 2069 1
+28 2070 1
+28 2071 1
+28 2072 1
+28 2073 1
+28 2074 1
+28 2075 1
+28 2076 1
+28 2077 1
+28 2078 1
+28 2079 1
+28 2080 1
+28 2081 1
+28 2082 1
+28 2083 1
+28 2084 1
+28 2085 1
+28 2086 1
+28 2087 1
+28 2088 1
+28 2089 1
+28 2090 1
+28 2091 1
+28 2092 1
+28 2093 1
+28 2094 1
+28 2095 1
+28 2096 1
+28 2097 1
+28 2098 1
+28 2099 1
+28 2100 1
+28 2101 1
+28 2102 1
+28 2103 1
+28 2104 1
+28 2105 1
+28 2106 1
+28 2107 1
+28 2108 1
+28 2109 1
+28 2110 1
+28 2111 1
+28 2112 1
+28 2113 1
+28 2114 1
+28 2115 1
+28 2116 1
+28 2117 1
+28 2118 1
+28 2119 1
+28 2120 1
+28 2121 1
+28 2122 1
+28 2641 1
+28 2642 1
+28 2643 1
+28 2644 1
+28 2645 1
+28 2646 1
+28 2647 1
+28 2648 1
+28 2649 1
+28 2650 1
+28 2651 1
+28 2652 1
+28 2653 1
+28 2654 1
+28 2655 1
+28 2656 1
+28 2657 1
+28 2658 1
+28 2659 1
+28 2660 1
+28 2661 1
+28 2662 1
+28 2663 1
+28 2664 1
+28 2665 1
+28 2666 1
+28 2667 1
+28 2668 1
+28 2669 1
+28 2670 1
+28 2671 1
+28 2672 1
+28 2673 1
+28 2674 1
+28 2675 1
+28 2676 1
+28 2677 1
+28 2678 1
+28 2679 1
+28 2680 1
+28 2681 1
+28 2682 1
+28 2683 1
+28 2684 1
+28 2685 1
+28 2686 1
+28 2687 1
+28 2688 1
+28 2689 1
+28 2690 1
+28 2691 1
+28 2692 1
+28 2693 1
+28 2694 1
+28 2695 1
+28 2696 1
+28 2767 1
+28 2768 1
+28 2769 1
+28 2770 1
+28 2771 1
+28 2772 1
+28 2773 1
+28 2774 1
+28 2775 1
+28 2776 1
+28 2777 1
+28 2778 1
+28 2779 1
+28 2780 1
+28 2781 1
+28 2782 1
+28 2783 1
+28 2784 1
+28 2785 1
+28 2786 1
+28 2787 1
+28 2788 1
+28 2789 1
+28 2790 1
+28 2791 1
+28 2792 1
+28 2793 1
+28 2794 1
+28 2795 1
+28 2796 1
+28 2797 1
+28 2798 1
+28 2799 1
+28 2800 1
+28 2801 1
+28 2802 1
+28 2803 1
+28 2804 1
+28 2805 1
+28 2806 1
+28 2807 1
+28 2808 1
+28 2809 1
+28 2810 1
+28 2811 1
+28 2812 1
+28 2813 1
+28 2814 1
+28 2815 1
+28 2816 1
+28 2817 1
+28 2818 1
+28 2819 1
+28 2820 1
+28 2821 1
+28 2822 1
+28 2823 1
+28 2824 1
+28 2825 1
+28 2826 1
+28 2827 1
+28 2828 1
+28 2829 1
+28 2830 1
+28 2831 1
+28 2832 1
+28 2833 1
+28 2834 1
+28 2835 1
+28 2836 1
+28 2893 1
+28 2894 1
+28 2895 1
+28 2896 1
+28 2897 1
+28 2898 1
+28 2899 1
+28 2900 1
+28 2901 1
+28 2902 1
+28 2903 1
+28 2904 1
+28 2905 1
+28 2906 1
+28 2907 1
+28 2908 1
+28 2909 1
+28 2910 1
+28 2911 1
+28 2912 1
+28 2913 1
+28 2914 1
+28 2915 1
+28 2916 1
+28 2917 1
+28 2918 1
+28 2919 1
+28 2920 1
+28 2921 1
+28 2922 1
+28 2923 1
+28 2924 1
+28 2925 1
+28 2926 1
+28 2927 1
+28 2928 1
+28 2929 1
+28 2930 1
+28 2931 1
+28 2932 1
+28 2933 1
+28 2934 1
+28 2935 1
+28 2936 1
+28 2937 1
+28 2938 1
+28 2939 1
+28 2940 1
+28 2941 1
+28 2942 1
+28 2943 1
+28 2944 1
+28 2945 1
+28 2946 1
+28 2947 1
+28 2948 1
+28 2949 1
+28 2950 1
+28 2951 1
+28 2952 1
+28 2953 1
+28 2954 1
+28 2955 1
+28 2956 1
+28 2957 1
+28 2958 1
+28 2959 1
+28 2960 1
+28 2961 1
+28 2962 1
+28 3019 1
+28 3020 1
+28 3021 1
+28 3022 1
+28 3023 1
+28 3024 1
+28 3025 1
+28 3026 1
+28 3027 1
+28 3028 1
+28 3029 1
+28 3030 1
+28 3031 1
+28 3032 1
+28 3033 1
+28 3034 1
+28 3035 1
+28 3036 1
+28 3037 1
+28 3038 1
+28 3039 1
+28 3040 1
+28 3041 1
+28 3042 1
+28 3043 1
+28 3044 1
+28 3045 1
+28 3046 1
+28 3047 1
+28 3048 1
+28 3049 1
+28 3050 1
+28 3051 1
+28 3052 1
+28 3053 1
+28 3054 1
+28 3055 1
+28 3056 1
+28 3057 1
+28 3058 1
+28 3059 1
+28 3060 1
+28 3061 1
+28 3062 1
+28 3063 1
+28 3064 1
+28 3065 1
+28 3066 1
+28 3067 1
+28 3068 1
+28 3069 1
+28 3070 1
+28 3071 1
+28 3072 1
+28 3073 1
+28 3074 1
+29 1 1
+29 9 1
+29 10 1
+29 11 1
+29 12 1
+29 13 1
+29 14 1
+29 15 1
+29 37 1
+29 38 1
+29 39 1
+29 40 1
+29 41 1
+29 42 1
+29 43 1
+29 65 1
+29 66 1
+29 67 1
+29 68 1
+29 69 1
+29 70 1
+29 71 1
+29 72 1
+29 73 1
+29 74 1
+29 75 1
+29 76 1
+29 77 1
+29 78 1
+29 79 1
+29 80 1
+29 81 1
+29 82 1
+29 83 1
+29 84 1
+29 85 1
+29 121 1
+29 122 1
+29 123 1
+29 124 1
+29 125 1
+29 126 1
+29 127 1
+29 149 1
+29 150 1
+29 151 1
+29 152 1
+29 153 1
+29 154 1
+29 155 1
+29 156 1
+29 157 1
+29 158 1
+29 159 1
+29 160 1
+29 161 1
+29 162 1
+29 163 1
+29 164 1
+29 165 1
+29 166 1
+29 167 1
+29 168 1
+29 169 1
+29 205 1
+29 206 1
+29 207 1
+29 208 1
+29 209 1
+29 210 1
+29 211 1
+29 212 1
+29 213 1
+29 214 1
+29 215 1
+29 216 1
+29 217 1
+29 218 1
+29 219 1
+29 220 1
+29 221 1
+29 222 1
+29 223 1
+29 224 1
+29 225 1
+29 261 1
+29 262 1
+29 263 1
+29 264 1
+29 265 1
+29 266 1
+29 267 1
+29 268 1
+29 269 1
+29 270 1
+29 271 1
+29 272 1
+29 273 1
+29 274 1
+29 275 1
+29 276 1
+29 277 1
+29 278 1
+29 279 1
+29 280 1
+29 281 1
+29 282 1
+29 283 1
+29 284 1
+29 285 1
+29 286 1
+29 287 1
+29 288 1
+29 289 1
+29 290 1
+29 291 1
+29 292 1
+29 293 1
+29 294 1
+29 295 1
+29 793 1
+29 794 1
+29 795 1
+29 796 1
+29 797 1
+29 798 1
+29 799 1
+29 821 1
+29 822 1
+29 823 1
+29 824 1
+29 825 1
+29 826 1
+29 827 1
+29 828 1
+29 829 1
+29 830 1
+29 831 1
+29 832 1
+29 833 1
+29 834 1
+29 835 1
+29 836 1
+29 837 1
+29 838 1
+29 839 1
+29 840 1
+29 841 1
+29 877 1
+29 878 1
+29 879 1
+29 880 1
+29 881 1
+29 882 1
+29 883 1
+29 884 1
+29 885 1
+29 886 1
+29 887 1
+29 888 1
+29 889 1
+29 890 1
+29 891 1
+29 892 1
+29 893 1
+29 894 1
+29 895 1
+29 896 1
+29 897 1
+29 933 1
+29 934 1
+29 935 1
+29 936 1
+29 937 1
+29 938 1
+29 939 1
+29 940 1
+29 941 1
+29 942 1
+29 943 1
+29 944 1
+29 945 1
+29 946 1
+29 947 1
+29 948 1
+29 949 1
+29 950 1
+29 951 1
+29 952 1
+29 953 1
+29 954 1
+29 955 1
+29 956 1
+29 957 1
+29 958 1
+29 959 1
+29 960 1
+29 961 1
+29 962 1
+29 963 1
+29 964 1
+29 965 1
+29 966 1
+29 967 1
+29 1003 1
+29 1004 1
+29 1005 1
+29 1006 1
+29 1007 1
+29 1008 1
+29 1009 1
+29 1010 1
+29 1011 1
+29 1012 1
+29 1013 1
+29 1014 1
+29 1015 1
+29 1016 1
+29 1017 1
+29 1018 1
+29 1019 1
+29 1020 1
+29 1021 1
+29 1022 1
+29 1023 1
+29 1059 1
+29 1060 1
+29 1061 1
+29 1062 1
+29 1063 1
+29 1064 1
+29 1065 1
+29 1066 1
+29 1067 1
+29 1068 1
+29 1069 1
+29 1070 1
+29 1071 1
+29 1072 1
+29 1073 1
+29 1074 1
+29 1075 1
+29 1076 1
+29 1077 1
+29 1078 1
+29 1079 1
+29 1080 1
+29 1081 1
+29 1082 1
+29 1083 1
+29 1084 1
+29 1085 1
+29 1086 1
+29 1087 1
+29 1088 1
+29 1089 1
+29 1090 1
+29 1091 1
+29 1092 1
+29 1093 1
+29 1129 1
+29 1130 1
+29 1131 1
+29 1132 1
+29 1133 1
+29 1134 1
+29 1135 1
+29 1136 1
+29 1137 1
+29 1138 1
+29 1139 1
+29 1140 1
+29 1141 1
+29 1142 1
+29 1143 1
+29 1144 1
+29 1145 1
+29 1146 1
+29 1147 1
+29 1148 1
+29 1149 1
+29 1150 1
+29 1151 1
+29 1152 1
+29 1153 1
+29 1154 1
+29 1155 1
+29 1156 1
+29 1157 1
+29 1158 1
+29 1159 1
+29 1160 1
+29 1161 1
+29 1162 1
+29 1163 1
+29 1199 1
+29 1200 1
+29 1201 1
+29 1202 1
+29 1203 1
+29 1204 1
+29 1205 1
+29 1206 1
+29 1207 1
+29 1208 1
+29 1209 1
+29 1210 1
+29 1211 1
+29 1212 1
+29 1213 1
+29 1214 1
+29 1215 1
+29 1216 1
+29 1217 1
+29 1218 1
+29 1219 1
+29 1220 1
+29 1221 1
+29 1222 1
+29 1223 1
+29 1224 1
+29 1225 1
+29 1226 1
+29 1227 1
+29 1228 1
+29 1229 1
+29 1230 1
+29 1231 1
+29 1232 1
+29 1233 1
+29 1717 1
+29 1718 1
+29 1719 1
+29 1720 1
+29 1721 1
+29 1722 1
+29 1723 1
+29 1745 1
+29 1746 1
+29 1747 1
+29 1748 1
+29 1749 1
+29 1750 1
+29 1751 1
+29 1752 1
+29 1753 1
+29 1754 1
+29 1755 1
+29 1756 1
+29 1757 1
+29 1758 1
+29 1759 1
+29 1760 1
+29 1761 1
+29 1762 1
+29 1763 1
+29 1764 1
+29 1765 1
+29 1801 1
+29 1802 1
+29 1803 1
+29 1804 1
+29 1805 1
+29 1806 1
+29 1807 1
+29 1808 1
+29 1809 1
+29 1810 1
+29 1811 1
+29 1812 1
+29 1813 1
+29 1814 1
+29 1815 1
+29 1816 1
+29 1817 1
+29 1818 1
+29 1819 1
+29 1820 1
+29 1821 1
+29 1857 1
+29 1858 1
+29 1859 1
+29 1860 1
+29 1861 1
+29 1862 1
+29 1863 1
+29 1864 1
+29 1865 1
+29 1866 1
+29 1867 1
+29 1868 1
+29 1869 1
+29 1870 1
+29 1871 1
+29 1872 1
+29 1873 1
+29 1874 1
+29 1875 1
+29 1876 1
+29 1877 1
+29 1878 1
+29 1879 1
+29 1880 1
+29 1881 1
+29 1882 1
+29 1883 1
+29 1884 1
+29 1885 1
+29 1886 1
+29 1887 1
+29 1888 1
+29 1889 1
+29 1890 1
+29 1891 1
+29 1927 1
+29 1928 1
+29 1929 1
+29 1930 1
+29 1931 1
+29 1932 1
+29 1933 1
+29 1934 1
+29 1935 1
+29 1936 1
+29 1937 1
+29 1938 1
+29 1939 1
+29 1940 1
+29 1941 1
+29 1942 1
+29 1943 1
+29 1944 1
+29 1945 1
+29 1946 1
+29 1947 1
+29 1983 1
+29 1984 1
+29 1985 1
+29 1986 1
+29 1987 1
+29 1988 1
+29 1989 1
+29 1990 1
+29 1991 1
+29 1992 1
+29 1993 1
+29 1994 1
+29 1995 1
+29 1996 1
+29 1997 1
+29 1998 1
+29 1999 1
+29 2000 1
+29 2001 1
+29 2002 1
+29 2003 1
+29 2004 1
+29 2005 1
+29 2006 1
+29 2007 1
+29 2008 1
+29 2009 1
+29 2010 1
+29 2011 1
+29 2012 1
+29 2013 1
+29 2014 1
+29 2015 1
+29 2016 1
+29 2017 1
+29 2053 1
+29 2054 1
+29 2055 1
+29 2056 1
+29 2057 1
+29 2058 1
+29 2059 1
+29 2060 1
+29 2061 1
+29 2062 1
+29 2063 1
+29 2064 1
+29 2065 1
+29 2066 1
+29 2067 1
+29 2068 1
+29 2069 1
+29 2070 1
+29 2071 1
+29 2072 1
+29 2073 1
+29 2074 1
+29 2075 1
+29 2076 1
+29 2077 1
+29 2078 1
+29 2079 1
+29 2080 1
+29 2081 1
+29 2082 1
+29 2083 1
+29 2084 1
+29 2085 1
+29 2086 1
+29 2087 1
+29 2123 1
+29 2124 1
+29 2125 1
+29 2126 1
+29 2127 1
+29 2128 1
+29 2129 1
+29 2130 1
+29 2131 1
+29 2132 1
+29 2133 1
+29 2134 1
+29 2135 1
+29 2136 1
+29 2137 1
+29 2138 1
+29 2139 1
+29 2140 1
+29 2141 1
+29 2142 1
+29 2143 1
+29 2144 1
+29 2145 1
+29 2146 1
+29 2147 1
+29 2148 1
+29 2149 1
+29 2150 1
+29 2151 1
+29 2152 1
+29 2153 1
+29 2154 1
+29 2155 1
+29 2156 1
+29 2157 1
+29 2641 1
+29 2642 1
+29 2643 1
+29 2644 1
+29 2645 1
+29 2646 1
+29 2647 1
+29 2648 1
+29 2649 1
+29 2650 1
+29 2651 1
+29 2652 1
+29 2653 1
+29 2654 1
+29 2655 1
+29 2656 1
+29 2657 1
+29 2658 1
+29 2659 1
+29 2660 1
+29 2661 1
+29 2697 1
+29 2698 1
+29 2699 1
+29 2700 1
+29 2701 1
+29 2702 1
+29 2703 1
+29 2704 1
+29 2705 1
+29 2706 1
+29 2707 1
+29 2708 1
+29 2709 1
+29 2710 1
+29 2711 1
+29 2712 1
+29 2713 1
+29 2714 1
+29 2715 1
+29 2716 1
+29 2717 1
+29 2718 1
+29 2719 1
+29 2720 1
+29 2721 1
+29 2722 1
+29 2723 1
+29 2724 1
+29 2725 1
+29 2726 1
+29 2727 1
+29 2728 1
+29 2729 1
+29 2730 1
+29 2731 1
+29 2767 1
+29 2768 1
+29 2769 1
+29 2770 1
+29 2771 1
+29 2772 1
+29 2773 1
+29 2774 1
+29 2775 1
+29 2776 1
+29 2777 1
+29 2778 1
+29 2779 1
+29 2780 1
+29 2781 1
+29 2782 1
+29 2783 1
+29 2784 1
+29 2785 1
+29 2786 1
+29 2787 1
+29 2788 1
+29 2789 1
+29 2790 1
+29 2791 1
+29 2792 1
+29 2793 1
+29 2794 1
+29 2795 1
+29 2796 1
+29 2797 1
+29 2798 1
+29 2799 1
+29 2800 1
+29 2801 1
+29 2837 1
+29 2838 1
+29 2839 1
+29 2840 1
+29 2841 1
+29 2842 1
+29 2843 1
+29 2844 1
+29 2845 1
+29 2846 1
+29 2847 1
+29 2848 1
+29 2849 1
+29 2850 1
+29 2851 1
+29 2852 1
+29 2853 1
+29 2854 1
+29 2855 1
+29 2856 1
+29 2857 1
+29 2858 1
+29 2859 1
+29 2860 1
+29 2861 1
+29 2862 1
+29 2863 1
+29 2864 1
+29 2865 1
+29 2866 1
+29 2867 1
+29 2868 1
+29 2869 1
+29 2870 1
+29 2871 1
+29 2893 1
+29 2894 1
+29 2895 1
+29 2896 1
+29 2897 1
+29 2898 1
+29 2899 1
+29 2900 1
+29 2901 1
+29 2902 1
+29 2903 1
+29 2904 1
+29 2905 1
+29 2906 1
+29 2907 1
+29 2908 1
+29 2909 1
+29 2910 1
+29 2911 1
+29 2912 1
+29 2913 1
+29 2914 1
+29 2915 1
+29 2916 1
+29 2917 1
+29 2918 1
+29 2919 1
+29 2920 1
+29 2921 1
+29 2922 1
+29 2923 1
+29 2924 1
+29 2925 1
+29 2926 1
+29 2927 1
+29 2963 1
+29 2964 1
+29 2965 1
+29 2966 1
+29 2967 1
+29 2968 1
+29 2969 1
+29 2970 1
+29 2971 1
+29 2972 1
+29 2973 1
+29 2974 1
+29 2975 1
+29 2976 1
+29 2977 1
+29 2978 1
+29 2979 1
+29 2980 1
+29 2981 1
+29 2982 1
+29 2983 1
+29 2984 1
+29 2985 1
+29 2986 1
+29 2987 1
+29 2988 1
+29 2989 1
+29 2990 1
+29 2991 1
+29 2992 1
+29 2993 1
+29 2994 1
+29 2995 1
+29 2996 1
+29 2997 1
+29 3019 1
+29 3020 1
+29 3021 1
+29 3022 1
+29 3023 1
+29 3024 1
+29 3025 1
+29 3026 1
+29 3027 1
+29 3028 1
+29 3029 1
+29 3030 1
+29 3031 1
+29 3032 1
+29 3033 1
+29 3034 1
+29 3035 1
+29 3036 1
+29 3037 1
+29 3038 1
+29 3039 1
+29 3040 1
+29 3041 1
+29 3042 1
+29 3043 1
+29 3044 1
+29 3045 1
+29 3046 1
+29 3047 1
+29 3048 1
+29 3049 1
+29 3050 1
+29 3051 1
+29 3052 1
+29 3053 1
+29 3075 1
+29 3076 1
+29 3077 1
+29 3078 1
+29 3079 1
+29 3080 1
+29 3081 1
+29 3082 1
+29 3083 1
+29 3084 1
+29 3085 1
+29 3086 1
+29 3087 1
+29 3088 1
+29 3089 1
+29 3090 1
+29 3091 1
+29 3092 1
+29 3093 1
+29 3094 1
+29 3095 1
+30 2 1
+30 9 1
+30 16 1
+30 17 1
+30 18 1
+30 19 1
+30 20 1
+30 21 1
+30 37 1
+30 44 1
+30 45 1
+30 46 1
+30 47 1
+30 48 1
+30 49 1
+30 65 1
+30 66 1
+30 67 1
+30 68 1
+30 69 1
+30 70 1
+30 86 1
+30 87 1
+30 88 1
+30 89 1
+30 90 1
+30 91 1
+30 92 1
+30 93 1
+30 94 1
+30 95 1
+30 96 1
+30 97 1
+30 98 1
+30 99 1
+30 100 1
+30 121 1
+30 128 1
+30 129 1
+30 130 1
+30 131 1
+30 132 1
+30 133 1
+30 149 1
+30 150 1
+30 151 1
+30 152 1
+30 153 1
+30 154 1
+30 170 1
+30 171 1
+30 172 1
+30 173 1
+30 174 1
+30 175 1
+30 176 1
+30 177 1
+30 178 1
+30 179 1
+30 180 1
+30 181 1
+30 182 1
+30 183 1
+30 184 1
+30 205 1
+30 206 1
+30 207 1
+30 208 1
+30 209 1
+30 210 1
+30 226 1
+30 227 1
+30 228 1
+30 229 1
+30 230 1
+30 231 1
+30 232 1
+30 233 1
+30 234 1
+30 235 1
+30 236 1
+30 237 1
+30 238 1
+30 239 1
+30 240 1
+30 261 1
+30 262 1
+30 263 1
+30 264 1
+30 265 1
+30 266 1
+30 267 1
+30 268 1
+30 269 1
+30 270 1
+30 271 1
+30 272 1
+30 273 1
+30 274 1
+30 275 1
+30 296 1
+30 297 1
+30 298 1
+30 299 1
+30 300 1
+30 301 1
+30 302 1
+30 303 1
+30 304 1
+30 305 1
+30 306 1
+30 307 1
+30 308 1
+30 309 1
+30 310 1
+30 311 1
+30 312 1
+30 313 1
+30 314 1
+30 315 1
+30 793 1
+30 800 1
+30 801 1
+30 802 1
+30 803 1
+30 804 1
+30 805 1
+30 821 1
+30 822 1
+30 823 1
+30 824 1
+30 825 1
+30 826 1
+30 842 1
+30 843 1
+30 844 1
+30 845 1
+30 846 1
+30 847 1
+30 848 1
+30 849 1
+30 850 1
+30 851 1
+30 852 1
+30 853 1
+30 854 1
+30 855 1
+30 856 1
+30 877 1
+30 878 1
+30 879 1
+30 880 1
+30 881 1
+30 882 1
+30 898 1
+30 899 1
+30 900 1
+30 901 1
+30 902 1
+30 903 1
+30 904 1
+30 905 1
+30 906 1
+30 907 1
+30 908 1
+30 909 1
+30 910 1
+30 911 1
+30 912 1
+30 933 1
+30 934 1
+30 935 1
+30 936 1
+30 937 1
+30 938 1
+30 939 1
+30 940 1
+30 941 1
+30 942 1
+30 943 1
+30 944 1
+30 945 1
+30 946 1
+30 947 1
+30 968 1
+30 969 1
+30 970 1
+30 971 1
+30 972 1
+30 973 1
+30 974 1
+30 975 1
+30 976 1
+30 977 1
+30 978 1
+30 979 1
+30 980 1
+30 981 1
+30 982 1
+30 983 1
+30 984 1
+30 985 1
+30 986 1
+30 987 1
+30 1003 1
+30 1004 1
+30 1005 1
+30 1006 1
+30 1007 1
+30 1008 1
+30 1024 1
+30 1025 1
+30 1026 1
+30 1027 1
+30 1028 1
+30 1029 1
+30 1030 1
+30 1031 1
+30 1032 1
+30 1033 1
+30 1034 1
+30 1035 1
+30 1036 1
+30 1037 1
+30 1038 1
+30 1059 1
+30 1060 1
+30 1061 1
+30 1062 1
+30 1063 1
+30 1064 1
+30 1065 1
+30 1066 1
+30 1067 1
+30 1068 1
+30 1069 1
+30 1070 1
+30 1071 1
+30 1072 1
+30 1073 1
+30 1094 1
+30 1095 1
+30 1096 1
+30 1097 1
+30 1098 1
+30 1099 1
+30 1100 1
+30 1101 1
+30 1102 1
+30 1103 1
+30 1104 1
+30 1105 1
+30 1106 1
+30 1107 1
+30 1108 1
+30 1109 1
+30 1110 1
+30 1111 1
+30 1112 1
+30 1113 1
+30 1129 1
+30 1130 1
+30 1131 1
+30 1132 1
+30 1133 1
+30 1134 1
+30 1135 1
+30 1136 1
+30 1137 1
+30 1138 1
+30 1139 1
+30 1140 1
+30 1141 1
+30 1142 1
+30 1143 1
+30 1164 1
+30 1165 1
+30 1166 1
+30 1167 1
+30 1168 1
+30 1169 1
+30 1170 1
+30 1171 1
+30 1172 1
+30 1173 1
+30 1174 1
+30 1175 1
+30 1176 1
+30 1177 1
+30 1178 1
+30 1179 1
+30 1180 1
+30 1181 1
+30 1182 1
+30 1183 1
+30 1199 1
+30 1200 1
+30 1201 1
+30 1202 1
+30 1203 1
+30 1204 1
+30 1205 1
+30 1206 1
+30 1207 1
+30 1208 1
+30 1209 1
+30 1210 1
+30 1211 1
+30 1212 1
+30 1213 1
+30 1214 1
+30 1215 1
+30 1216 1
+30 1217 1
+30 1218 1
+30 1234 1
+30 1235 1
+30 1236 1
+30 1237 1
+30 1238 1
+30 1239 1
+30 1240 1
+30 1241 1
+30 1242 1
+30 1243 1
+30 1244 1
+30 1245 1
+30 1246 1
+30 1247 1
+30 1248 1
+30 1717 1
+30 1724 1
+30 1725 1
+30 1726 1
+30 1727 1
+30 1728 1
+30 1729 1
+30 1745 1
+30 1746 1
+30 1747 1
+30 1748 1
+30 1749 1
+30 1750 1
+30 1766 1
+30 1767 1
+30 1768 1
+30 1769 1
+30 1770 1
+30 1771 1
+30 1772 1
+30 1773 1
+30 1774 1
+30 1775 1
+30 1776 1
+30 1777 1
+30 1778 1
+30 1779 1
+30 1780 1
+30 1801 1
+30 1802 1
+30 1803 1
+30 1804 1
+30 1805 1
+30 1806 1
+30 1822 1
+30 1823 1
+30 1824 1
+30 1825 1
+30 1826 1
+30 1827 1
+30 1828 1
+30 1829 1
+30 1830 1
+30 1831 1
+30 1832 1
+30 1833 1
+30 1834 1
+30 1835 1
+30 1836 1
+30 1857 1
+30 1858 1
+30 1859 1
+30 1860 1
+30 1861 1
+30 1862 1
+30 1863 1
+30 1864 1
+30 1865 1
+30 1866 1
+30 1867 1
+30 1868 1
+30 1869 1
+30 1870 1
+30 1871 1
+30 1892 1
+30 1893 1
+30 1894 1
+30 1895 1
+30 1896 1
+30 1897 1
+30 1898 1
+30 1899 1
+30 1900 1
+30 1901 1
+30 1902 1
+30 1903 1
+30 1904 1
+30 1905 1
+30 1906 1
+30 1907 1
+30 1908 1
+30 1909 1
+30 1910 1
+30 1911 1
+30 1927 1
+30 1928 1
+30 1929 1
+30 1930 1
+30 1931 1
+30 1932 1
+30 1948 1
+30 1949 1
+30 1950 1
+30 1951 1
+30 1952 1
+30 1953 1
+30 1954 1
+30 1955 1
+30 1956 1
+30 1957 1
+30 1958 1
+30 1959 1
+30 1960 1
+30 1961 1
+30 1962 1
+30 1983 1
+30 1984 1
+30 1985 1
+30 1986 1
+30 1987 1
+30 1988 1
+30 1989 1
+30 1990 1
+30 1991 1
+30 1992 1
+30 1993 1
+30 1994 1
+30 1995 1
+30 1996 1
+30 1997 1
+30 2018 1
+30 2019 1
+30 2020 1
+30 2021 1
+30 2022 1
+30 2023 1
+30 2024 1
+30 2025 1
+30 2026 1
+30 2027 1
+30 2028 1
+30 2029 1
+30 2030 1
+30 2031 1
+30 2032 1
+30 2033 1
+30 2034 1
+30 2035 1
+30 2036 1
+30 2037 1
+30 2053 1
+30 2054 1
+30 2055 1
+30 2056 1
+30 2057 1
+30 2058 1
+30 2059 1
+30 2060 1
+30 2061 1
+30 2062 1
+30 2063 1
+30 2064 1
+30 2065 1
+30 2066 1
+30 2067 1
+30 2088 1
+30 2089 1
+30 2090 1
+30 2091 1
+30 2092 1
+30 2093 1
+30 2094 1
+30 2095 1
+30 2096 1
+30 2097 1
+30 2098 1
+30 2099 1
+30 2100 1
+30 2101 1
+30 2102 1
+30 2103 1
+30 2104 1
+30 2105 1
+30 2106 1
+30 2107 1
+30 2123 1
+30 2124 1
+30 2125 1
+30 2126 1
+30 2127 1
+30 2128 1
+30 2129 1
+30 2130 1
+30 2131 1
+30 2132 1
+30 2133 1
+30 2134 1
+30 2135 1
+30 2136 1
+30 2137 1
+30 2138 1
+30 2139 1
+30 2140 1
+30 2141 1
+30 2142 1
+30 2158 1
+30 2159 1
+30 2160 1
+30 2161 1
+30 2162 1
+30 2163 1
+30 2164 1
+30 2165 1
+30 2166 1
+30 2167 1
+30 2168 1
+30 2169 1
+30 2170 1
+30 2171 1
+30 2172 1
+30 2641 1
+30 2642 1
+30 2643 1
+30 2644 1
+30 2645 1
+30 2646 1
+30 2662 1
+30 2663 1
+30 2664 1
+30 2665 1
+30 2666 1
+30 2667 1
+30 2668 1
+30 2669 1
+30 2670 1
+30 2671 1
+30 2672 1
+30 2673 1
+30 2674 1
+30 2675 1
+30 2676 1
+30 2697 1
+30 2698 1
+30 2699 1
+30 2700 1
+30 2701 1
+30 2702 1
+30 2703 1
+30 2704 1
+30 2705 1
+30 2706 1
+30 2707 1
+30 2708 1
+30 2709 1
+30 2710 1
+30 2711 1
+30 2732 1
+30 2733 1
+30 2734 1
+30 2735 1
+30 2736 1
+30 2737 1
+30 2738 1
+30 2739 1
+30 2740 1
+30 2741 1
+30 2742 1
+30 2743 1
+30 2744 1
+30 2745 1
+30 2746 1
+30 2747 1
+30 2748 1
+30 2749 1
+30 2750 1
+30 2751 1
+30 2767 1
+30 2768 1
+30 2769 1
+30 2770 1
+30 2771 1
+30 2772 1
+30 2773 1
+30 2774 1
+30 2775 1
+30 2776 1
+30 2777 1
+30 2778 1
+30 2779 1
+30 2780 1
+30 2781 1
+30 2802 1
+30 2803 1
+30 2804 1
+30 2805 1
+30 2806 1
+30 2807 1
+30 2808 1
+30 2809 1
+30 2810 1
+30 2811 1
+30 2812 1
+30 2813 1
+30 2814 1
+30 2815 1
+30 2816 1
+30 2817 1
+30 2818 1
+30 2819 1
+30 2820 1
+30 2821 1
+30 2837 1
+30 2838 1
+30 2839 1
+30 2840 1
+30 2841 1
+30 2842 1
+30 2843 1
+30 2844 1
+30 2845 1
+30 2846 1
+30 2847 1
+30 2848 1
+30 2849 1
+30 2850 1
+30 2851 1
+30 2852 1
+30 2853 1
+30 2854 1
+30 2855 1
+30 2856 1
+30 2872 1
+30 2873 1
+30 2874 1
+30 2875 1
+30 2876 1
+30 2877 1
+30 2878 1
+30 2879 1
+30 2880 1
+30 2881 1
+30 2882 1
+30 2883 1
+30 2884 1
+30 2885 1
+30 2886 1
+30 2893 1
+30 2894 1
+30 2895 1
+30 2896 1
+30 2897 1
+30 2898 1
+30 2899 1
+30 2900 1
+30 2901 1
+30 2902 1
+30 2903 1
+30 2904 1
+30 2905 1
+30 2906 1
+30 2907 1
+30 2928 1
+30 2929 1
+30 2930 1
+30 2931 1
+30 2932 1
+30 2933 1
+30 2934 1
+30 2935 1
+30 2936 1
+30 2937 1
+30 2938 1
+30 2939 1
+30 2940 1
+30 2941 1
+30 2942 1
+30 2943 1
+30 2944 1
+30 2945 1
+30 2946 1
+30 2947 1
+30 2963 1
+30 2964 1
+30 2965 1
+30 2966 1
+30 2967 1
+30 2968 1
+30 2969 1
+30 2970 1
+30 2971 1
+30 2972 1
+30 2973 1
+30 2974 1
+30 2975 1
+30 2976 1
+30 2977 1
+30 2978 1
+30 2979 1
+30 2980 1
+30 2981 1
+30 2982 1
+30 2998 1
+30 2999 1
+30 3000 1
+30 3001 1
+30 3002 1
+30 3003 1
+30 3004 1
+30 3005 1
+30 3006 1
+30 3007 1
+30 3008 1
+30 3009 1
+30 3010 1
+30 3011 1
+30 3012 1
+30 3019 1
+30 3020 1
+30 3021 1
+30 3022 1
+30 3023 1
+30 3024 1
+30 3025 1
+30 3026 1
+30 3027 1
+30 3028 1
+30 3029 1
+30 3030 1
+30 3031 1
+30 3032 1
+30 3033 1
+30 3034 1
+30 3035 1
+30 3036 1
+30 3037 1
+30 3038 1
+30 3054 1
+30 3055 1
+30 3056 1
+30 3057 1
+30 3058 1
+30 3059 1
+30 3060 1
+30 3061 1
+30 3062 1
+30 3063 1
+30 3064 1
+30 3065 1
+30 3066 1
+30 3067 1
+30 3068 1
+30 3075 1
+30 3076 1
+30 3077 1
+30 3078 1
+30 3079 1
+30 3080 1
+30 3081 1
+30 3082 1
+30 3083 1
+30 3084 1
+30 3085 1
+30 3086 1
+30 3087 1
+30 3088 1
+30 3089 1
+30 3096 1
+30 3097 1
+30 3098 1
+30 3099 1
+30 3100 1
+30 3101 1
+31 3 1
+31 10 1
+31 16 1
+31 22 1
+31 23 1
+31 24 1
+31 25 1
+31 26 1
+31 38 1
+31 44 1
+31 50 1
+31 51 1
+31 52 1
+31 53 1
+31 54 1
+31 65 1
+31 71 1
+31 72 1
+31 73 1
+31 74 1
+31 75 1
+31 86 1
+31 87 1
+31 88 1
+31 89 1
+31 90 1
+31 101 1
+31 102 1
+31 103 1
+31 104 1
+31 105 1
+31 106 1
+31 107 1
+31 108 1
+31 109 1
+31 110 1
+31 122 1
+31 128 1
+31 134 1
+31 135 1
+31 136 1
+31 137 1
+31 138 1
+31 149 1
+31 155 1
+31 156 1
+31 157 1
+31 158 1
+31 159 1
+31 170 1
+31 171 1
+31 172 1
+31 173 1
+31 174 1
+31 185 1
+31 186 1
+31 187 1
+31 188 1
+31 189 1
+31 190 1
+31 191 1
+31 192 1
+31 193 1
+31 194 1
+31 205 1
+31 211 1
+31 212 1
+31 213 1
+31 214 1
+31 215 1
+31 226 1
+31 227 1
+31 228 1
+31 229 1
+31 230 1
+31 241 1
+31 242 1
+31 243 1
+31 244 1
+31 245 1
+31 246 1
+31 247 1
+31 248 1
+31 249 1
+31 250 1
+31 261 1
+31 262 1
+31 263 1
+31 264 1
+31 265 1
+31 276 1
+31 277 1
+31 278 1
+31 279 1
+31 280 1
+31 281 1
+31 282 1
+31 283 1
+31 284 1
+31 285 1
+31 296 1
+31 297 1
+31 298 1
+31 299 1
+31 300 1
+31 301 1
+31 302 1
+31 303 1
+31 304 1
+31 305 1
+31 316 1
+31 317 1
+31 318 1
+31 319 1
+31 320 1
+31 321 1
+31 322 1
+31 323 1
+31 324 1
+31 325 1
+31 794 1
+31 800 1
+31 806 1
+31 807 1
+31 808 1
+31 809 1
+31 810 1
+31 821 1
+31 827 1
+31 828 1
+31 829 1
+31 830 1
+31 831 1
+31 842 1
+31 843 1
+31 844 1
+31 845 1
+31 846 1
+31 857 1
+31 858 1
+31 859 1
+31 860 1
+31 861 1
+31 862 1
+31 863 1
+31 864 1
+31 865 1
+31 866 1
+31 877 1
+31 883 1
+31 884 1
+31 885 1
+31 886 1
+31 887 1
+31 898 1
+31 899 1
+31 900 1
+31 901 1
+31 902 1
+31 913 1
+31 914 1
+31 915 1
+31 916 1
+31 917 1
+31 918 1
+31 919 1
+31 920 1
+31 921 1
+31 922 1
+31 933 1
+31 934 1
+31 935 1
+31 936 1
+31 937 1
+31 948 1
+31 949 1
+31 950 1
+31 951 1
+31 952 1
+31 953 1
+31 954 1
+31 955 1
+31 956 1
+31 957 1
+31 968 1
+31 969 1
+31 970 1
+31 971 1
+31 972 1
+31 973 1
+31 974 1
+31 975 1
+31 976 1
+31 977 1
+31 988 1
+31 989 1
+31 990 1
+31 991 1
+31 992 1
+31 993 1
+31 994 1
+31 995 1
+31 996 1
+31 997 1
+31 1003 1
+31 1009 1
+31 1010 1
+31 1011 1
+31 1012 1
+31 1013 1
+31 1024 1
+31 1025 1
+31 1026 1
+31 1027 1
+31 1028 1
+31 1039 1
+31 1040 1
+31 1041 1
+31 1042 1
+31 1043 1
+31 1044 1
+31 1045 1
+31 1046 1
+31 1047 1
+31 1048 1
+31 1059 1
+31 1060 1
+31 1061 1
+31 1062 1
+31 1063 1
+31 1074 1
+31 1075 1
+31 1076 1
+31 1077 1
+31 1078 1
+31 1079 1
+31 1080 1
+31 1081 1
+31 1082 1
+31 1083 1
+31 1094 1
+31 1095 1
+31 1096 1
+31 1097 1
+31 1098 1
+31 1099 1
+31 1100 1
+31 1101 1
+31 1102 1
+31 1103 1
+31 1114 1
+31 1115 1
+31 1116 1
+31 1117 1
+31 1118 1
+31 1119 1
+31 1120 1
+31 1121 1
+31 1122 1
+31 1123 1
+31 1129 1
+31 1130 1
+31 1131 1
+31 1132 1
+31 1133 1
+31 1144 1
+31 1145 1
+31 1146 1
+31 1147 1
+31 1148 1
+31 1149 1
+31 1150 1
+31 1151 1
+31 1152 1
+31 1153 1
+31 1164 1
+31 1165 1
+31 1166 1
+31 1167 1
+31 1168 1
+31 1169 1
+31 1170 1
+31 1171 1
+31 1172 1
+31 1173 1
+31 1184 1
+31 1185 1
+31 1186 1
+31 1187 1
+31 1188 1
+31 1189 1
+31 1190 1
+31 1191 1
+31 1192 1
+31 1193 1
+31 1199 1
+31 1200 1
+31 1201 1
+31 1202 1
+31 1203 1
+31 1204 1
+31 1205 1
+31 1206 1
+31 1207 1
+31 1208 1
+31 1219 1
+31 1220 1
+31 1221 1
+31 1222 1
+31 1223 1
+31 1224 1
+31 1225 1
+31 1226 1
+31 1227 1
+31 1228 1
+31 1234 1
+31 1235 1
+31 1236 1
+31 1237 1
+31 1238 1
+31 1239 1
+31 1240 1
+31 1241 1
+31 1242 1
+31 1243 1
+31 1249 1
+31 1250 1
+31 1251 1
+31 1252 1
+31 1253 1
+31 1718 1
+31 1724 1
+31 1730 1
+31 1731 1
+31 1732 1
+31 1733 1
+31 1734 1
+31 1745 1
+31 1751 1
+31 1752 1
+31 1753 1
+31 1754 1
+31 1755 1
+31 1766 1
+31 1767 1
+31 1768 1
+31 1769 1
+31 1770 1
+31 1781 1
+31 1782 1
+31 1783 1
+31 1784 1
+31 1785 1
+31 1786 1
+31 1787 1
+31 1788 1
+31 1789 1
+31 1790 1
+31 1801 1
+31 1807 1
+31 1808 1
+31 1809 1
+31 1810 1
+31 1811 1
+31 1822 1
+31 1823 1
+31 1824 1
+31 1825 1
+31 1826 1
+31 1837 1
+31 1838 1
+31 1839 1
+31 1840 1
+31 1841 1
+31 1842 1
+31 1843 1
+31 1844 1
+31 1845 1
+31 1846 1
+31 1857 1
+31 1858 1
+31 1859 1
+31 1860 1
+31 1861 1
+31 1872 1
+31 1873 1
+31 1874 1
+31 1875 1
+31 1876 1
+31 1877 1
+31 1878 1
+31 1879 1
+31 1880 1
+31 1881 1
+31 1892 1
+31 1893 1
+31 1894 1
+31 1895 1
+31 1896 1
+31 1897 1
+31 1898 1
+31 1899 1
+31 1900 1
+31 1901 1
+31 1912 1
+31 1913 1
+31 1914 1
+31 1915 1
+31 1916 1
+31 1917 1
+31 1918 1
+31 1919 1
+31 1920 1
+31 1921 1
+31 1927 1
+31 1933 1
+31 1934 1
+31 1935 1
+31 1936 1
+31 1937 1
+31 1948 1
+31 1949 1
+31 1950 1
+31 1951 1
+31 1952 1
+31 1963 1
+31 1964 1
+31 1965 1
+31 1966 1
+31 1967 1
+31 1968 1
+31 1969 1
+31 1970 1
+31 1971 1
+31 1972 1
+31 1983 1
+31 1984 1
+31 1985 1
+31 1986 1
+31 1987 1
+31 1998 1
+31 1999 1
+31 2000 1
+31 2001 1
+31 2002 1
+31 2003 1
+31 2004 1
+31 2005 1
+31 2006 1
+31 2007 1
+31 2018 1
+31 2019 1
+31 2020 1
+31 2021 1
+31 2022 1
+31 2023 1
+31 2024 1
+31 2025 1
+31 2026 1
+31 2027 1
+31 2038 1
+31 2039 1
+31 2040 1
+31 2041 1
+31 2042 1
+31 2043 1
+31 2044 1
+31 2045 1
+31 2046 1
+31 2047 1
+31 2053 1
+31 2054 1
+31 2055 1
+31 2056 1
+31 2057 1
+31 2068 1
+31 2069 1
+31 2070 1
+31 2071 1
+31 2072 1
+31 2073 1
+31 2074 1
+31 2075 1
+31 2076 1
+31 2077 1
+31 2088 1
+31 2089 1
+31 2090 1
+31 2091 1
+31 2092 1
+31 2093 1
+31 2094 1
+31 2095 1
+31 2096 1
+31 2097 1
+31 2108 1
+31 2109 1
+31 2110 1
+31 2111 1
+31 2112 1
+31 2113 1
+31 2114 1
+31 2115 1
+31 2116 1
+31 2117 1
+31 2123 1
+31 2124 1
+31 2125 1
+31 2126 1
+31 2127 1
+31 2128 1
+31 2129 1
+31 2130 1
+31 2131 1
+31 2132 1
+31 2143 1
+31 2144 1
+31 2145 1
+31 2146 1
+31 2147 1
+31 2148 1
+31 2149 1
+31 2150 1
+31 2151 1
+31 2152 1
+31 2158 1
+31 2159 1
+31 2160 1
+31 2161 1
+31 2162 1
+31 2163 1
+31 2164 1
+31 2165 1
+31 2166 1
+31 2167 1
+31 2173 1
+31 2174 1
+31 2175 1
+31 2176 1
+31 2177 1
+31 2641 1
+31 2647 1
+31 2648 1
+31 2649 1
+31 2650 1
+31 2651 1
+31 2662 1
+31 2663 1
+31 2664 1
+31 2665 1
+31 2666 1
+31 2677 1
+31 2678 1
+31 2679 1
+31 2680 1
+31 2681 1
+31 2682 1
+31 2683 1
+31 2684 1
+31 2685 1
+31 2686 1
+31 2697 1
+31 2698 1
+31 2699 1
+31 2700 1
+31 2701 1
+31 2712 1
+31 2713 1
+31 2714 1
+31 2715 1
+31 2716 1
+31 2717 1
+31 2718 1
+31 2719 1
+31 2720 1
+31 2721 1
+31 2732 1
+31 2733 1
+31 2734 1
+31 2735 1
+31 2736 1
+31 2737 1
+31 2738 1
+31 2739 1
+31 2740 1
+31 2741 1
+31 2752 1
+31 2753 1
+31 2754 1
+31 2755 1
+31 2756 1
+31 2757 1
+31 2758 1
+31 2759 1
+31 2760 1
+31 2761 1
+31 2767 1
+31 2768 1
+31 2769 1
+31 2770 1
+31 2771 1
+31 2782 1
+31 2783 1
+31 2784 1
+31 2785 1
+31 2786 1
+31 2787 1
+31 2788 1
+31 2789 1
+31 2790 1
+31 2791 1
+31 2802 1
+31 2803 1
+31 2804 1
+31 2805 1
+31 2806 1
+31 2807 1
+31 2808 1
+31 2809 1
+31 2810 1
+31 2811 1
+31 2822 1
+31 2823 1
+31 2824 1
+31 2825 1
+31 2826 1
+31 2827 1
+31 2828 1
+31 2829 1
+31 2830 1
+31 2831 1
+31 2837 1
+31 2838 1
+31 2839 1
+31 2840 1
+31 2841 1
+31 2842 1
+31 2843 1
+31 2844 1
+31 2845 1
+31 2846 1
+31 2857 1
+31 2858 1
+31 2859 1
+31 2860 1
+31 2861 1
+31 2862 1
+31 2863 1
+31 2864 1
+31 2865 1
+31 2866 1
+31 2872 1
+31 2873 1
+31 2874 1
+31 2875 1
+31 2876 1
+31 2877 1
+31 2878 1
+31 2879 1
+31 2880 1
+31 2881 1
+31 2887 1
+31 2888 1
+31 2889 1
+31 2890 1
+31 2891 1
+31 2893 1
+31 2894 1
+31 2895 1
+31 2896 1
+31 2897 1
+31 2908 1
+31 2909 1
+31 2910 1
+31 2911 1
+31 2912 1
+31 2913 1
+31 2914 1
+31 2915 1
+31 2916 1
+31 2917 1
+31 2928 1
+31 2929 1
+31 2930 1
+31 2931 1
+31 2932 1
+31 2933 1
+31 2934 1
+31 2935 1
+31 2936 1
+31 2937 1
+31 2948 1
+31 2949 1
+31 2950 1
+31 2951 1
+31 2952 1
+31 2953 1
+31 2954 1
+31 2955 1
+31 2956 1
+31 2957 1
+31 2963 1
+31 2964 1
+31 2965 1
+31 2966 1
+31 2967 1
+31 2968 1
+31 2969 1
+31 2970 1
+31 2971 1
+31 2972 1
+31 2983 1
+31 2984 1
+31 2985 1
+31 2986 1
+31 2987 1
+31 2988 1
+31 2989 1
+31 2990 1
+31 2991 1
+31 2992 1
+31 2998 1
+31 2999 1
+31 3000 1
+31 3001 1
+31 3002 1
+31 3003 1
+31 3004 1
+31 3005 1
+31 3006 1
+31 3007 1
+31 3013 1
+31 3014 1
+31 3015 1
+31 3016 1
+31 3017 1
+31 3019 1
+31 3020 1
+31 3021 1
+31 3022 1
+31 3023 1
+31 3024 1
+31 3025 1
+31 3026 1
+31 3027 1
+31 3028 1
+31 3039 1
+31 3040 1
+31 3041 1
+31 3042 1
+31 3043 1
+31 3044 1
+31 3045 1
+31 3046 1
+31 3047 1
+31 3048 1
+31 3054 1
+31 3055 1
+31 3056 1
+31 3057 1
+31 3058 1
+31 3059 1
+31 3060 1
+31 3061 1
+31 3062 1
+31 3063 1
+31 3069 1
+31 3070 1
+31 3071 1
+31 3072 1
+31 3073 1
+31 3075 1
+31 3076 1
+31 3077 1
+31 3078 1
+31 3079 1
+31 3080 1
+31 3081 1
+31 3082 1
+31 3083 1
+31 3084 1
+31 3090 1
+31 3091 1
+31 3092 1
+31 3093 1
+31 3094 1
+31 3096 1
+31 3097 1
+31 3098 1
+31 3099 1
+31 3100 1
+31 3102 1
+32 4 1
+32 11 1
+32 17 1
+32 22 1
+32 27 1
+32 28 1
+32 29 1
+32 30 1
+32 39 1
+32 45 1
+32 50 1
+32 55 1
+32 56 1
+32 57 1
+32 58 1
+32 66 1
+32 71 1
+32 76 1
+32 77 1
+32 78 1
+32 79 1
+32 86 1
+32 91 1
+32 92 1
+32 93 1
+32 94 1
+32 101 1
+32 102 1
+32 103 1
+32 104 1
+32 111 1
+32 112 1
+32 113 1
+32 114 1
+32 115 1
+32 116 1
+32 123 1
+32 129 1
+32 134 1
+32 139 1
+32 140 1
+32 141 1
+32 142 1
+32 150 1
+32 155 1
+32 160 1
+32 161 1
+32 162 1
+32 163 1
+32 170 1
+32 175 1
+32 176 1
+32 177 1
+32 178 1
+32 185 1
+32 186 1
+32 187 1
+32 188 1
+32 195 1
+32 196 1
+32 197 1
+32 198 1
+32 199 1
+32 200 1
+32 206 1
+32 211 1
+32 216 1
+32 217 1
+32 218 1
+32 219 1
+32 226 1
+32 231 1
+32 232 1
+32 233 1
+32 234 1
+32 241 1
+32 242 1
+32 243 1
+32 244 1
+32 251 1
+32 252 1
+32 253 1
+32 254 1
+32 255 1
+32 256 1
+32 261 1
+32 266 1
+32 267 1
+32 268 1
+32 269 1
+32 276 1
+32 277 1
+32 278 1
+32 279 1
+32 286 1
+32 287 1
+32 288 1
+32 289 1
+32 290 1
+32 291 1
+32 296 1
+32 297 1
+32 298 1
+32 299 1
+32 306 1
+32 307 1
+32 308 1
+32 309 1
+32 310 1
+32 311 1
+32 316 1
+32 317 1
+32 318 1
+32 319 1
+32 320 1
+32 321 1
+32 326 1
+32 327 1
+32 328 1
+32 329 1
+32 795 1
+32 801 1
+32 806 1
+32 811 1
+32 812 1
+32 813 1
+32 814 1
+32 822 1
+32 827 1
+32 832 1
+32 833 1
+32 834 1
+32 835 1
+32 842 1
+32 847 1
+32 848 1
+32 849 1
+32 850 1
+32 857 1
+32 858 1
+32 859 1
+32 860 1
+32 867 1
+32 868 1
+32 869 1
+32 870 1
+32 871 1
+32 872 1
+32 878 1
+32 883 1
+32 888 1
+32 889 1
+32 890 1
+32 891 1
+32 898 1
+32 903 1
+32 904 1
+32 905 1
+32 906 1
+32 913 1
+32 914 1
+32 915 1
+32 916 1
+32 923 1
+32 924 1
+32 925 1
+32 926 1
+32 927 1
+32 928 1
+32 933 1
+32 938 1
+32 939 1
+32 940 1
+32 941 1
+32 948 1
+32 949 1
+32 950 1
+32 951 1
+32 958 1
+32 959 1
+32 960 1
+32 961 1
+32 962 1
+32 963 1
+32 968 1
+32 969 1
+32 970 1
+32 971 1
+32 978 1
+32 979 1
+32 980 1
+32 981 1
+32 982 1
+32 983 1
+32 988 1
+32 989 1
+32 990 1
+32 991 1
+32 992 1
+32 993 1
+32 998 1
+32 999 1
+32 1000 1
+32 1001 1
+32 1004 1
+32 1009 1
+32 1014 1
+32 1015 1
+32 1016 1
+32 1017 1
+32 1024 1
+32 1029 1
+32 1030 1
+32 1031 1
+32 1032 1
+32 1039 1
+32 1040 1
+32 1041 1
+32 1042 1
+32 1049 1
+32 1050 1
+32 1051 1
+32 1052 1
+32 1053 1
+32 1054 1
+32 1059 1
+32 1064 1
+32 1065 1
+32 1066 1
+32 1067 1
+32 1074 1
+32 1075 1
+32 1076 1
+32 1077 1
+32 1084 1
+32 1085 1
+32 1086 1
+32 1087 1
+32 1088 1
+32 1089 1
+32 1094 1
+32 1095 1
+32 1096 1
+32 1097 1
+32 1104 1
+32 1105 1
+32 1106 1
+32 1107 1
+32 1108 1
+32 1109 1
+32 1114 1
+32 1115 1
+32 1116 1
+32 1117 1
+32 1118 1
+32 1119 1
+32 1124 1
+32 1125 1
+32 1126 1
+32 1127 1
+32 1129 1
+32 1134 1
+32 1135 1
+32 1136 1
+32 1137 1
+32 1144 1
+32 1145 1
+32 1146 1
+32 1147 1
+32 1154 1
+32 1155 1
+32 1156 1
+32 1157 1
+32 1158 1
+32 1159 1
+32 1164 1
+32 1165 1
+32 1166 1
+32 1167 1
+32 1174 1
+32 1175 1
+32 1176 1
+32 1177 1
+32 1178 1
+32 1179 1
+32 1184 1
+32 1185 1
+32 1186 1
+32 1187 1
+32 1188 1
+32 1189 1
+32 1194 1
+32 1195 1
+32 1196 1
+32 1197 1
+32 1199 1
+32 1200 1
+32 1201 1
+32 1202 1
+32 1209 1
+32 1210 1
+32 1211 1
+32 1212 1
+32 1213 1
+32 1214 1
+32 1219 1
+32 1220 1
+32 1221 1
+32 1222 1
+32 1223 1
+32 1224 1
+32 1229 1
+32 1230 1
+32 1231 1
+32 1232 1
+32 1234 1
+32 1235 1
+32 1236 1
+32 1237 1
+32 1238 1
+32 1239 1
+32 1244 1
+32 1245 1
+32 1246 1
+32 1247 1
+32 1249 1
+32 1250 1
+32 1251 1
+32 1252 1
+32 1254 1
+32 1719 1
+32 1725 1
+32 1730 1
+32 1735 1
+32 1736 1
+32 1737 1
+32 1738 1
+32 1746 1
+32 1751 1
+32 1756 1
+32 1757 1
+32 1758 1
+32 1759 1
+32 1766 1
+32 1771 1
+32 1772 1
+32 1773 1
+32 1774 1
+32 1781 1
+32 1782 1
+32 1783 1
+32 1784 1
+32 1791 1
+32 1792 1
+32 1793 1
+32 1794 1
+32 1795 1
+32 1796 1
+32 1802 1
+32 1807 1
+32 1812 1
+32 1813 1
+32 1814 1
+32 1815 1
+32 1822 1
+32 1827 1
+32 1828 1
+32 1829 1
+32 1830 1
+32 1837 1
+32 1838 1
+32 1839 1
+32 1840 1
+32 1847 1
+32 1848 1
+32 1849 1
+32 1850 1
+32 1851 1
+32 1852 1
+32 1857 1
+32 1862 1
+32 1863 1
+32 1864 1
+32 1865 1
+32 1872 1
+32 1873 1
+32 1874 1
+32 1875 1
+32 1882 1
+32 1883 1
+32 1884 1
+32 1885 1
+32 1886 1
+32 1887 1
+32 1892 1
+32 1893 1
+32 1894 1
+32 1895 1
+32 1902 1
+32 1903 1
+32 1904 1
+32 1905 1
+32 1906 1
+32 1907 1
+32 1912 1
+32 1913 1
+32 1914 1
+32 1915 1
+32 1916 1
+32 1917 1
+32 1922 1
+32 1923 1
+32 1924 1
+32 1925 1
+32 1928 1
+32 1933 1
+32 1938 1
+32 1939 1
+32 1940 1
+32 1941 1
+32 1948 1
+32 1953 1
+32 1954 1
+32 1955 1
+32 1956 1
+32 1963 1
+32 1964 1
+32 1965 1
+32 1966 1
+32 1973 1
+32 1974 1
+32 1975 1
+32 1976 1
+32 1977 1
+32 1978 1
+32 1983 1
+32 1988 1
+32 1989 1
+32 1990 1
+32 1991 1
+32 1998 1
+32 1999 1
+32 2000 1
+32 2001 1
+32 2008 1
+32 2009 1
+32 2010 1
+32 2011 1
+32 2012 1
+32 2013 1
+32 2018 1
+32 2019 1
+32 2020 1
+32 2021 1
+32 2028 1
+32 2029 1
+32 2030 1
+32 2031 1
+32 2032 1
+32 2033 1
+32 2038 1
+32 2039 1
+32 2040 1
+32 2041 1
+32 2042 1
+32 2043 1
+32 2048 1
+32 2049 1
+32 2050 1
+32 2051 1
+32 2053 1
+32 2058 1
+32 2059 1
+32 2060 1
+32 2061 1
+32 2068 1
+32 2069 1
+32 2070 1
+32 2071 1
+32 2078 1
+32 2079 1
+32 2080 1
+32 2081 1
+32 2082 1
+32 2083 1
+32 2088 1
+32 2089 1
+32 2090 1
+32 2091 1
+32 2098 1
+32 2099 1
+32 2100 1
+32 2101 1
+32 2102 1
+32 2103 1
+32 2108 1
+32 2109 1
+32 2110 1
+32 2111 1
+32 2112 1
+32 2113 1
+32 2118 1
+32 2119 1
+32 2120 1
+32 2121 1
+32 2123 1
+32 2124 1
+32 2125 1
+32 2126 1
+32 2133 1
+32 2134 1
+32 2135 1
+32 2136 1
+32 2137 1
+32 2138 1
+32 2143 1
+32 2144 1
+32 2145 1
+32 2146 1
+32 2147 1
+32 2148 1
+32 2153 1
+32 2154 1
+32 2155 1
+32 2156 1
+32 2158 1
+32 2159 1
+32 2160 1
+32 2161 1
+32 2162 1
+32 2163 1
+32 2168 1
+32 2169 1
+32 2170 1
+32 2171 1
+32 2173 1
+32 2174 1
+32 2175 1
+32 2176 1
+32 2178 1
+32 2642 1
+32 2647 1
+32 2652 1
+32 2653 1
+32 2654 1
+32 2655 1
+32 2662 1
+32 2667 1
+32 2668 1
+32 2669 1
+32 2670 1
+32 2677 1
+32 2678 1
+32 2679 1
+32 2680 1
+32 2687 1
+32 2688 1
+32 2689 1
+32 2690 1
+32 2691 1
+32 2692 1
+32 2697 1
+32 2702 1
+32 2703 1
+32 2704 1
+32 2705 1
+32 2712 1
+32 2713 1
+32 2714 1
+32 2715 1
+32 2722 1
+32 2723 1
+32 2724 1
+32 2725 1
+32 2726 1
+32 2727 1
+32 2732 1
+32 2733 1
+32 2734 1
+32 2735 1
+32 2742 1
+32 2743 1
+32 2744 1
+32 2745 1
+32 2746 1
+32 2747 1
+32 2752 1
+32 2753 1
+32 2754 1
+32 2755 1
+32 2756 1
+32 2757 1
+32 2762 1
+32 2763 1
+32 2764 1
+32 2765 1
+32 2767 1
+32 2772 1
+32 2773 1
+32 2774 1
+32 2775 1
+32 2782 1
+32 2783 1
+32 2784 1
+32 2785 1
+32 2792 1
+32 2793 1
+32 2794 1
+32 2795 1
+32 2796 1
+32 2797 1
+32 2802 1
+32 2803 1
+32 2804 1
+32 2805 1
+32 2812 1
+32 2813 1
+32 2814 1
+32 2815 1
+32 2816 1
+32 2817 1
+32 2822 1
+32 2823 1
+32 2824 1
+32 2825 1
+32 2826 1
+32 2827 1
+32 2832 1
+32 2833 1
+32 2834 1
+32 2835 1
+32 2837 1
+32 2838 1
+32 2839 1
+32 2840 1
+32 2847 1
+32 2848 1
+32 2849 1
+32 2850 1
+32 2851 1
+32 2852 1
+32 2857 1
+32 2858 1
+32 2859 1
+32 2860 1
+32 2861 1
+32 2862 1
+32 2867 1
+32 2868 1
+32 2869 1
+32 2870 1
+32 2872 1
+32 2873 1
+32 2874 1
+32 2875 1
+32 2876 1
+32 2877 1
+32 2882 1
+32 2883 1
+32 2884 1
+32 2885 1
+32 2887 1
+32 2888 1
+32 2889 1
+32 2890 1
+32 2892 1
+32 2893 1
+32 2898 1
+32 2899 1
+32 2900 1
+32 2901 1
+32 2908 1
+32 2909 1
+32 2910 1
+32 2911 1
+32 2918 1
+32 2919 1
+32 2920 1
+32 2921 1
+32 2922 1
+32 2923 1
+32 2928 1
+32 2929 1
+32 2930 1
+32 2931 1
+32 2938 1
+32 2939 1
+32 2940 1
+32 2941 1
+32 2942 1
+32 2943 1
+32 2948 1
+32 2949 1
+32 2950 1
+32 2951 1
+32 2952 1
+32 2953 1
+32 2958 1
+32 2959 1
+32 2960 1
+32 2961 1
+32 2963 1
+32 2964 1
+32 2965 1
+32 2966 1
+32 2973 1
+32 2974 1
+32 2975 1
+32 2976 1
+32 2977 1
+32 2978 1
+32 2983 1
+32 2984 1
+32 2985 1
+32 2986 1
+32 2987 1
+32 2988 1
+32 2993 1
+32 2994 1
+32 2995 1
+32 2996 1
+32 2998 1
+32 2999 1
+32 3000 1
+32 3001 1
+32 3002 1
+32 3003 1
+32 3008 1
+32 3009 1
+32 3010 1
+32 3011 1
+32 3013 1
+32 3014 1
+32 3015 1
+32 3016 1
+32 3018 1
+32 3019 1
+32 3020 1
+32 3021 1
+32 3022 1
+32 3029 1
+32 3030 1
+32 3031 1
+32 3032 1
+32 3033 1
+32 3034 1
+32 3039 1
+32 3040 1
+32 3041 1
+32 3042 1
+32 3043 1
+32 3044 1
+32 3049 1
+32 3050 1
+32 3051 1
+32 3052 1
+32 3054 1
+32 3055 1
+32 3056 1
+32 3057 1
+32 3058 1
+32 3059 1
+32 3064 1
+32 3065 1
+32 3066 1
+32 3067 1
+32 3069 1
+32 3070 1
+32 3071 1
+32 3072 1
+32 3074 1
+32 3075 1
+32 3076 1
+32 3077 1
+32 3078 1
+32 3079 1
+32 3080 1
+32 3085 1
+32 3086 1
+32 3087 1
+32 3088 1
+32 3090 1
+32 3091 1
+32 3092 1
+32 3093 1
+32 3095 1
+32 3096 1
+32 3097 1
+32 3098 1
+32 3099 1
+32 3101 1
+32 3102 1
+33 5 1
+33 12 1
+33 18 1
+33 23 1
+33 27 1
+33 31 1
+33 32 1
+33 33 1
+33 40 1
+33 46 1
+33 51 1
+33 55 1
+33 59 1
+33 60 1
+33 61 1
+33 67 1
+33 72 1
+33 76 1
+33 80 1
+33 81 1
+33 82 1
+33 87 1
+33 91 1
+33 95 1
+33 96 1
+33 97 1
+33 101 1
+33 105 1
+33 106 1
+33 107 1
+33 111 1
+33 112 1
+33 113 1
+33 117 1
+33 118 1
+33 119 1
+33 124 1
+33 130 1
+33 135 1
+33 139 1
+33 143 1
+33 144 1
+33 145 1
+33 151 1
+33 156 1
+33 160 1
+33 164 1
+33 165 1
+33 166 1
+33 171 1
+33 175 1
+33 179 1
+33 180 1
+33 181 1
+33 185 1
+33 189 1
+33 190 1
+33 191 1
+33 195 1
+33 196 1
+33 197 1
+33 201 1
+33 202 1
+33 203 1
+33 207 1
+33 212 1
+33 216 1
+33 220 1
+33 221 1
+33 222 1
+33 227 1
+33 231 1
+33 235 1
+33 236 1
+33 237 1
+33 241 1
+33 245 1
+33 246 1
+33 247 1
+33 251 1
+33 252 1
+33 253 1
+33 257 1
+33 258 1
+33 259 1
+33 262 1
+33 266 1
+33 270 1
+33 271 1
+33 272 1
+33 276 1
+33 280 1
+33 281 1
+33 282 1
+33 286 1
+33 287 1
+33 288 1
+33 292 1
+33 293 1
+33 294 1
+33 296 1
+33 300 1
+33 301 1
+33 302 1
+33 306 1
+33 307 1
+33 308 1
+33 312 1
+33 313 1
+33 314 1
+33 316 1
+33 317 1
+33 318 1
+33 322 1
+33 323 1
+33 324 1
+33 326 1
+33 327 1
+33 328 1
+33 330 1
+33 796 1
+33 802 1
+33 807 1
+33 811 1
+33 815 1
+33 816 1
+33 817 1
+33 823 1
+33 828 1
+33 832 1
+33 836 1
+33 837 1
+33 838 1
+33 843 1
+33 847 1
+33 851 1
+33 852 1
+33 853 1
+33 857 1
+33 861 1
+33 862 1
+33 863 1
+33 867 1
+33 868 1
+33 869 1
+33 873 1
+33 874 1
+33 875 1
+33 879 1
+33 884 1
+33 888 1
+33 892 1
+33 893 1
+33 894 1
+33 899 1
+33 903 1
+33 907 1
+33 908 1
+33 909 1
+33 913 1
+33 917 1
+33 918 1
+33 919 1
+33 923 1
+33 924 1
+33 925 1
+33 929 1
+33 930 1
+33 931 1
+33 934 1
+33 938 1
+33 942 1
+33 943 1
+33 944 1
+33 948 1
+33 952 1
+33 953 1
+33 954 1
+33 958 1
+33 959 1
+33 960 1
+33 964 1
+33 965 1
+33 966 1
+33 968 1
+33 972 1
+33 973 1
+33 974 1
+33 978 1
+33 979 1
+33 980 1
+33 984 1
+33 985 1
+33 986 1
+33 988 1
+33 989 1
+33 990 1
+33 994 1
+33 995 1
+33 996 1
+33 998 1
+33 999 1
+33 1000 1
+33 1002 1
+33 1005 1
+33 1010 1
+33 1014 1
+33 1018 1
+33 1019 1
+33 1020 1
+33 1025 1
+33 1029 1
+33 1033 1
+33 1034 1
+33 1035 1
+33 1039 1
+33 1043 1
+33 1044 1
+33 1045 1
+33 1049 1
+33 1050 1
+33 1051 1
+33 1055 1
+33 1056 1
+33 1057 1
+33 1060 1
+33 1064 1
+33 1068 1
+33 1069 1
+33 1070 1
+33 1074 1
+33 1078 1
+33 1079 1
+33 1080 1
+33 1084 1
+33 1085 1
+33 1086 1
+33 1090 1
+33 1091 1
+33 1092 1
+33 1094 1
+33 1098 1
+33 1099 1
+33 1100 1
+33 1104 1
+33 1105 1
+33 1106 1
+33 1110 1
+33 1111 1
+33 1112 1
+33 1114 1
+33 1115 1
+33 1116 1
+33 1120 1
+33 1121 1
+33 1122 1
+33 1124 1
+33 1125 1
+33 1126 1
+33 1128 1
+33 1130 1
+33 1134 1
+33 1138 1
+33 1139 1
+33 1140 1
+33 1144 1
+33 1148 1
+33 1149 1
+33 1150 1
+33 1154 1
+33 1155 1
+33 1156 1
+33 1160 1
+33 1161 1
+33 1162 1
+33 1164 1
+33 1168 1
+33 1169 1
+33 1170 1
+33 1174 1
+33 1175 1
+33 1176 1
+33 1180 1
+33 1181 1
+33 1182 1
+33 1184 1
+33 1185 1
+33 1186 1
+33 1190 1
+33 1191 1
+33 1192 1
+33 1194 1
+33 1195 1
+33 1196 1
+33 1198 1
+33 1199 1
+33 1203 1
+33 1204 1
+33 1205 1
+33 1209 1
+33 1210 1
+33 1211 1
+33 1215 1
+33 1216 1
+33 1217 1
+33 1219 1
+33 1220 1
+33 1221 1
+33 1225 1
+33 1226 1
+33 1227 1
+33 1229 1
+33 1230 1
+33 1231 1
+33 1233 1
+33 1234 1
+33 1235 1
+33 1236 1
+33 1240 1
+33 1241 1
+33 1242 1
+33 1244 1
+33 1245 1
+33 1246 1
+33 1248 1
+33 1249 1
+33 1250 1
+33 1251 1
+33 1253 1
+33 1254 1
+33 1720 1
+33 1726 1
+33 1731 1
+33 1735 1
+33 1739 1
+33 1740 1
+33 1741 1
+33 1747 1
+33 1752 1
+33 1756 1
+33 1760 1
+33 1761 1
+33 1762 1
+33 1767 1
+33 1771 1
+33 1775 1
+33 1776 1
+33 1777 1
+33 1781 1
+33 1785 1
+33 1786 1
+33 1787 1
+33 1791 1
+33 1792 1
+33 1793 1
+33 1797 1
+33 1798 1
+33 1799 1
+33 1803 1
+33 1808 1
+33 1812 1
+33 1816 1
+33 1817 1
+33 1818 1
+33 1823 1
+33 1827 1
+33 1831 1
+33 1832 1
+33 1833 1
+33 1837 1
+33 1841 1
+33 1842 1
+33 1843 1
+33 1847 1
+33 1848 1
+33 1849 1
+33 1853 1
+33 1854 1
+33 1855 1
+33 1858 1
+33 1862 1
+33 1866 1
+33 1867 1
+33 1868 1
+33 1872 1
+33 1876 1
+33 1877 1
+33 1878 1
+33 1882 1
+33 1883 1
+33 1884 1
+33 1888 1
+33 1889 1
+33 1890 1
+33 1892 1
+33 1896 1
+33 1897 1
+33 1898 1
+33 1902 1
+33 1903 1
+33 1904 1
+33 1908 1
+33 1909 1
+33 1910 1
+33 1912 1
+33 1913 1
+33 1914 1
+33 1918 1
+33 1919 1
+33 1920 1
+33 1922 1
+33 1923 1
+33 1924 1
+33 1926 1
+33 1929 1
+33 1934 1
+33 1938 1
+33 1942 1
+33 1943 1
+33 1944 1
+33 1949 1
+33 1953 1
+33 1957 1
+33 1958 1
+33 1959 1
+33 1963 1
+33 1967 1
+33 1968 1
+33 1969 1
+33 1973 1
+33 1974 1
+33 1975 1
+33 1979 1
+33 1980 1
+33 1981 1
+33 1984 1
+33 1988 1
+33 1992 1
+33 1993 1
+33 1994 1
+33 1998 1
+33 2002 1
+33 2003 1
+33 2004 1
+33 2008 1
+33 2009 1
+33 2010 1
+33 2014 1
+33 2015 1
+33 2016 1
+33 2018 1
+33 2022 1
+33 2023 1
+33 2024 1
+33 2028 1
+33 2029 1
+33 2030 1
+33 2034 1
+33 2035 1
+33 2036 1
+33 2038 1
+33 2039 1
+33 2040 1
+33 2044 1
+33 2045 1
+33 2046 1
+33 2048 1
+33 2049 1
+33 2050 1
+33 2052 1
+33 2054 1
+33 2058 1
+33 2062 1
+33 2063 1
+33 2064 1
+33 2068 1
+33 2072 1
+33 2073 1
+33 2074 1
+33 2078 1
+33 2079 1
+33 2080 1
+33 2084 1
+33 2085 1
+33 2086 1
+33 2088 1
+33 2092 1
+33 2093 1
+33 2094 1
+33 2098 1
+33 2099 1
+33 2100 1
+33 2104 1
+33 2105 1
+33 2106 1
+33 2108 1
+33 2109 1
+33 2110 1
+33 2114 1
+33 2115 1
+33 2116 1
+33 2118 1
+33 2119 1
+33 2120 1
+33 2122 1
+33 2123 1
+33 2127 1
+33 2128 1
+33 2129 1
+33 2133 1
+33 2134 1
+33 2135 1
+33 2139 1
+33 2140 1
+33 2141 1
+33 2143 1
+33 2144 1
+33 2145 1
+33 2149 1
+33 2150 1
+33 2151 1
+33 2153 1
+33 2154 1
+33 2155 1
+33 2157 1
+33 2158 1
+33 2159 1
+33 2160 1
+33 2164 1
+33 2165 1
+33 2166 1
+33 2168 1
+33 2169 1
+33 2170 1
+33 2172 1
+33 2173 1
+33 2174 1
+33 2175 1
+33 2177 1
+33 2178 1
+33 2643 1
+33 2648 1
+33 2652 1
+33 2656 1
+33 2657 1
+33 2658 1
+33 2663 1
+33 2667 1
+33 2671 1
+33 2672 1
+33 2673 1
+33 2677 1
+33 2681 1
+33 2682 1
+33 2683 1
+33 2687 1
+33 2688 1
+33 2689 1
+33 2693 1
+33 2694 1
+33 2695 1
+33 2698 1
+33 2702 1
+33 2706 1
+33 2707 1
+33 2708 1
+33 2712 1
+33 2716 1
+33 2717 1
+33 2718 1
+33 2722 1
+33 2723 1
+33 2724 1
+33 2728 1
+33 2729 1
+33 2730 1
+33 2732 1
+33 2736 1
+33 2737 1
+33 2738 1
+33 2742 1
+33 2743 1
+33 2744 1
+33 2748 1
+33 2749 1
+33 2750 1
+33 2752 1
+33 2753 1
+33 2754 1
+33 2758 1
+33 2759 1
+33 2760 1
+33 2762 1
+33 2763 1
+33 2764 1
+33 2766 1
+33 2768 1
+33 2772 1
+33 2776 1
+33 2777 1
+33 2778 1
+33 2782 1
+33 2786 1
+33 2787 1
+33 2788 1
+33 2792 1
+33 2793 1
+33 2794 1
+33 2798 1
+33 2799 1
+33 2800 1
+33 2802 1
+33 2806 1
+33 2807 1
+33 2808 1
+33 2812 1
+33 2813 1
+33 2814 1
+33 2818 1
+33 2819 1
+33 2820 1
+33 2822 1
+33 2823 1
+33 2824 1
+33 2828 1
+33 2829 1
+33 2830 1
+33 2832 1
+33 2833 1
+33 2834 1
+33 2836 1
+33 2837 1
+33 2841 1
+33 2842 1
+33 2843 1
+33 2847 1
+33 2848 1
+33 2849 1
+33 2853 1
+33 2854 1
+33 2855 1
+33 2857 1
+33 2858 1
+33 2859 1
+33 2863 1
+33 2864 1
+33 2865 1
+33 2867 1
+33 2868 1
+33 2869 1
+33 2871 1
+33 2872 1
+33 2873 1
+33 2874 1
+33 2878 1
+33 2879 1
+33 2880 1
+33 2882 1
+33 2883 1
+33 2884 1
+33 2886 1
+33 2887 1
+33 2888 1
+33 2889 1
+33 2891 1
+33 2892 1
+33 2894 1
+33 2898 1
+33 2902 1
+33 2903 1
+33 2904 1
+33 2908 1
+33 2912 1
+33 2913 1
+33 2914 1
+33 2918 1
+33 2919 1
+33 2920 1
+33 2924 1
+33 2925 1
+33 2926 1
+33 2928 1
+33 2932 1
+33 2933 1
+33 2934 1
+33 2938 1
+33 2939 1
+33 2940 1
+33 2944 1
+33 2945 1
+33 2946 1
+33 2948 1
+33 2949 1
+33 2950 1
+33 2954 1
+33 2955 1
+33 2956 1
+33 2958 1
+33 2959 1
+33 2960 1
+33 2962 1
+33 2963 1
+33 2967 1
+33 2968 1
+33 2969 1
+33 2973 1
+33 2974 1
+33 2975 1
+33 2979 1
+33 2980 1
+33 2981 1
+33 2983 1
+33 2984 1
+33 2985 1
+33 2989 1
+33 2990 1
+33 2991 1
+33 2993 1
+33 2994 1
+33 2995 1
+33 2997 1
+33 2998 1
+33 2999 1
+33 3000 1
+33 3004 1
+33 3005 1
+33 3006 1
+33 3008 1
+33 3009 1
+33 3010 1
+33 3012 1
+33 3013 1
+33 3014 1
+33 3015 1
+33 3017 1
+33 3018 1
+33 3019 1
+33 3023 1
+33 3024 1
+33 3025 1
+33 3029 1
+33 3030 1
+33 3031 1
+33 3035 1
+33 3036 1
+33 3037 1
+33 3039 1
+33 3040 1
+33 3041 1
+33 3045 1
+33 3046 1
+33 3047 1
+33 3049 1
+33 3050 1
+33 3051 1
+33 3053 1
+33 3054 1
+33 3055 1
+33 3056 1
+33 3060 1
+33 3061 1
+33 3062 1
+33 3064 1
+33 3065 1
+33 3066 1
+33 3068 1
+33 3069 1
+33 3070 1
+33 3071 1
+33 3073 1
+33 3074 1
+33 3075 1
+33 3076 1
+33 3077 1
+33 3081 1
+33 3082 1
+33 3083 1
+33 3085 1
+33 3086 1
+33 3087 1
+33 3089 1
+33 3090 1
+33 3091 1
+33 3092 1
+33 3094 1
+33 3095 1
+33 3096 1
+33 3097 1
+33 3098 1
+33 3100 1
+33 3101 1
+33 3102 1
+34 6 1
+34 13 1
+34 19 1
+34 24 1
+34 28 1
+34 31 1
+34 34 1
+34 35 1
+34 41 1
+34 47 1
+34 52 1
+34 56 1
+34 59 1
+34 62 1
+34 63 1
+34 68 1
+34 73 1
+34 77 1
+34 80 1
+34 83 1
+34 84 1
+34 88 1
+34 92 1
+34 95 1
+34 98 1
+34 99 1
+34 102 1
+34 105 1
+34 108 1
+34 109 1
+34 111 1
+34 114 1
+34 115 1
+34 117 1
+34 118 1
+34 120 1
+34 125 1
+34 131 1
+34 136 1
+34 140 1
+34 143 1
+34 146 1
+34 147 1
+34 152 1
+34 157 1
+34 161 1
+34 164 1
+34 167 1
+34 168 1
+34 172 1
+34 176 1
+34 179 1
+34 182 1
+34 183 1
+34 186 1
+34 189 1
+34 192 1
+34 193 1
+34 195 1
+34 198 1
+34 199 1
+34 201 1
+34 202 1
+34 204 1
+34 208 1
+34 213 1
+34 217 1
+34 220 1
+34 223 1
+34 224 1
+34 228 1
+34 232 1
+34 235 1
+34 238 1
+34 239 1
+34 242 1
+34 245 1
+34 248 1
+34 249 1
+34 251 1
+34 254 1
+34 255 1
+34 257 1
+34 258 1
+34 260 1
+34 263 1
+34 267 1
+34 270 1
+34 273 1
+34 274 1
+34 277 1
+34 280 1
+34 283 1
+34 284 1
+34 286 1
+34 289 1
+34 290 1
+34 292 1
+34 293 1
+34 295 1
+34 297 1
+34 300 1
+34 303 1
+34 304 1
+34 306 1
+34 309 1
+34 310 1
+34 312 1
+34 313 1
+34 315 1
+34 316 1
+34 319 1
+34 320 1
+34 322 1
+34 323 1
+34 325 1
+34 326 1
+34 327 1
+34 329 1
+34 330 1
+34 797 1
+34 803 1
+34 808 1
+34 812 1
+34 815 1
+34 818 1
+34 819 1
+34 824 1
+34 829 1
+34 833 1
+34 836 1
+34 839 1
+34 840 1
+34 844 1
+34 848 1
+34 851 1
+34 854 1
+34 855 1
+34 858 1
+34 861 1
+34 864 1
+34 865 1
+34 867 1
+34 870 1
+34 871 1
+34 873 1
+34 874 1
+34 876 1
+34 880 1
+34 885 1
+34 889 1
+34 892 1
+34 895 1
+34 896 1
+34 900 1
+34 904 1
+34 907 1
+34 910 1
+34 911 1
+34 914 1
+34 917 1
+34 920 1
+34 921 1
+34 923 1
+34 926 1
+34 927 1
+34 929 1
+34 930 1
+34 932 1
+34 935 1
+34 939 1
+34 942 1
+34 945 1
+34 946 1
+34 949 1
+34 952 1
+34 955 1
+34 956 1
+34 958 1
+34 961 1
+34 962 1
+34 964 1
+34 965 1
+34 967 1
+34 969 1
+34 972 1
+34 975 1
+34 976 1
+34 978 1
+34 981 1
+34 982 1
+34 984 1
+34 985 1
+34 987 1
+34 988 1
+34 991 1
+34 992 1
+34 994 1
+34 995 1
+34 997 1
+34 998 1
+34 999 1
+34 1001 1
+34 1002 1
+34 1006 1
+34 1011 1
+34 1015 1
+34 1018 1
+34 1021 1
+34 1022 1
+34 1026 1
+34 1030 1
+34 1033 1
+34 1036 1
+34 1037 1
+34 1040 1
+34 1043 1
+34 1046 1
+34 1047 1
+34 1049 1
+34 1052 1
+34 1053 1
+34 1055 1
+34 1056 1
+34 1058 1
+34 1061 1
+34 1065 1
+34 1068 1
+34 1071 1
+34 1072 1
+34 1075 1
+34 1078 1
+34 1081 1
+34 1082 1
+34 1084 1
+34 1087 1
+34 1088 1
+34 1090 1
+34 1091 1
+34 1093 1
+34 1095 1
+34 1098 1
+34 1101 1
+34 1102 1
+34 1104 1
+34 1107 1
+34 1108 1
+34 1110 1
+34 1111 1
+34 1113 1
+34 1114 1
+34 1117 1
+34 1118 1
+34 1120 1
+34 1121 1
+34 1123 1
+34 1124 1
+34 1125 1
+34 1127 1
+34 1128 1
+34 1131 1
+34 1135 1
+34 1138 1
+34 1141 1
+34 1142 1
+34 1145 1
+34 1148 1
+34 1151 1
+34 1152 1
+34 1154 1
+34 1157 1
+34 1158 1
+34 1160 1
+34 1161 1
+34 1163 1
+34 1165 1
+34 1168 1
+34 1171 1
+34 1172 1
+34 1174 1
+34 1177 1
+34 1178 1
+34 1180 1
+34 1181 1
+34 1183 1
+34 1184 1
+34 1187 1
+34 1188 1
+34 1190 1
+34 1191 1
+34 1193 1
+34 1194 1
+34 1195 1
+34 1197 1
+34 1198 1
+34 1200 1
+34 1203 1
+34 1206 1
+34 1207 1
+34 1209 1
+34 1212 1
+34 1213 1
+34 1215 1
+34 1216 1
+34 1218 1
+34 1219 1
+34 1222 1
+34 1223 1
+34 1225 1
+34 1226 1
+34 1228 1
+34 1229 1
+34 1230 1
+34 1232 1
+34 1233 1
+34 1234 1
+34 1237 1
+34 1238 1
+34 1240 1
+34 1241 1
+34 1243 1
+34 1244 1
+34 1245 1
+34 1247 1
+34 1248 1
+34 1249 1
+34 1250 1
+34 1252 1
+34 1253 1
+34 1254 1
+34 1721 1
+34 1727 1
+34 1732 1
+34 1736 1
+34 1739 1
+34 1742 1
+34 1743 1
+34 1748 1
+34 1753 1
+34 1757 1
+34 1760 1
+34 1763 1
+34 1764 1
+34 1768 1
+34 1772 1
+34 1775 1
+34 1778 1
+34 1779 1
+34 1782 1
+34 1785 1
+34 1788 1
+34 1789 1
+34 1791 1
+34 1794 1
+34 1795 1
+34 1797 1
+34 1798 1
+34 1800 1
+34 1804 1
+34 1809 1
+34 1813 1
+34 1816 1
+34 1819 1
+34 1820 1
+34 1824 1
+34 1828 1
+34 1831 1
+34 1834 1
+34 1835 1
+34 1838 1
+34 1841 1
+34 1844 1
+34 1845 1
+34 1847 1
+34 1850 1
+34 1851 1
+34 1853 1
+34 1854 1
+34 1856 1
+34 1859 1
+34 1863 1
+34 1866 1
+34 1869 1
+34 1870 1
+34 1873 1
+34 1876 1
+34 1879 1
+34 1880 1
+34 1882 1
+34 1885 1
+34 1886 1
+34 1888 1
+34 1889 1
+34 1891 1
+34 1893 1
+34 1896 1
+34 1899 1
+34 1900 1
+34 1902 1
+34 1905 1
+34 1906 1
+34 1908 1
+34 1909 1
+34 1911 1
+34 1912 1
+34 1915 1
+34 1916 1
+34 1918 1
+34 1919 1
+34 1921 1
+34 1922 1
+34 1923 1
+34 1925 1
+34 1926 1
+34 1930 1
+34 1935 1
+34 1939 1
+34 1942 1
+34 1945 1
+34 1946 1
+34 1950 1
+34 1954 1
+34 1957 1
+34 1960 1
+34 1961 1
+34 1964 1
+34 1967 1
+34 1970 1
+34 1971 1
+34 1973 1
+34 1976 1
+34 1977 1
+34 1979 1
+34 1980 1
+34 1982 1
+34 1985 1
+34 1989 1
+34 1992 1
+34 1995 1
+34 1996 1
+34 1999 1
+34 2002 1
+34 2005 1
+34 2006 1
+34 2008 1
+34 2011 1
+34 2012 1
+34 2014 1
+34 2015 1
+34 2017 1
+34 2019 1
+34 2022 1
+34 2025 1
+34 2026 1
+34 2028 1
+34 2031 1
+34 2032 1
+34 2034 1
+34 2035 1
+34 2037 1
+34 2038 1
+34 2041 1
+34 2042 1
+34 2044 1
+34 2045 1
+34 2047 1
+34 2048 1
+34 2049 1
+34 2051 1
+34 2052 1
+34 2055 1
+34 2059 1
+34 2062 1
+34 2065 1
+34 2066 1
+34 2069 1
+34 2072 1
+34 2075 1
+34 2076 1
+34 2078 1
+34 2081 1
+34 2082 1
+34 2084 1
+34 2085 1
+34 2087 1
+34 2089 1
+34 2092 1
+34 2095 1
+34 2096 1
+34 2098 1
+34 2101 1
+34 2102 1
+34 2104 1
+34 2105 1
+34 2107 1
+34 2108 1
+34 2111 1
+34 2112 1
+34 2114 1
+34 2115 1
+34 2117 1
+34 2118 1
+34 2119 1
+34 2121 1
+34 2122 1
+34 2124 1
+34 2127 1
+34 2130 1
+34 2131 1
+34 2133 1
+34 2136 1
+34 2137 1
+34 2139 1
+34 2140 1
+34 2142 1
+34 2143 1
+34 2146 1
+34 2147 1
+34 2149 1
+34 2150 1
+34 2152 1
+34 2153 1
+34 2154 1
+34 2156 1
+34 2157 1
+34 2158 1
+34 2161 1
+34 2162 1
+34 2164 1
+34 2165 1
+34 2167 1
+34 2168 1
+34 2169 1
+34 2171 1
+34 2172 1
+34 2173 1
+34 2174 1
+34 2176 1
+34 2177 1
+34 2178 1
+34 2644 1
+34 2649 1
+34 2653 1
+34 2656 1
+34 2659 1
+34 2660 1
+34 2664 1
+34 2668 1
+34 2671 1
+34 2674 1
+34 2675 1
+34 2678 1
+34 2681 1
+34 2684 1
+34 2685 1
+34 2687 1
+34 2690 1
+34 2691 1
+34 2693 1
+34 2694 1
+34 2696 1
+34 2699 1
+34 2703 1
+34 2706 1
+34 2709 1
+34 2710 1
+34 2713 1
+34 2716 1
+34 2719 1
+34 2720 1
+34 2722 1
+34 2725 1
+34 2726 1
+34 2728 1
+34 2729 1
+34 2731 1
+34 2733 1
+34 2736 1
+34 2739 1
+34 2740 1
+34 2742 1
+34 2745 1
+34 2746 1
+34 2748 1
+34 2749 1
+34 2751 1
+34 2752 1
+34 2755 1
+34 2756 1
+34 2758 1
+34 2759 1
+34 2761 1
+34 2762 1
+34 2763 1
+34 2765 1
+34 2766 1
+34 2769 1
+34 2773 1
+34 2776 1
+34 2779 1
+34 2780 1
+34 2783 1
+34 2786 1
+34 2789 1
+34 2790 1
+34 2792 1
+34 2795 1
+34 2796 1
+34 2798 1
+34 2799 1
+34 2801 1
+34 2803 1
+34 2806 1
+34 2809 1
+34 2810 1
+34 2812 1
+34 2815 1
+34 2816 1
+34 2818 1
+34 2819 1
+34 2821 1
+34 2822 1
+34 2825 1
+34 2826 1
+34 2828 1
+34 2829 1
+34 2831 1
+34 2832 1
+34 2833 1
+34 2835 1
+34 2836 1
+34 2838 1
+34 2841 1
+34 2844 1
+34 2845 1
+34 2847 1
+34 2850 1
+34 2851 1
+34 2853 1
+34 2854 1
+34 2856 1
+34 2857 1
+34 2860 1
+34 2861 1
+34 2863 1
+34 2864 1
+34 2866 1
+34 2867 1
+34 2868 1
+34 2870 1
+34 2871 1
+34 2872 1
+34 2875 1
+34 2876 1
+34 2878 1
+34 2879 1
+34 2881 1
+34 2882 1
+34 2883 1
+34 2885 1
+34 2886 1
+34 2887 1
+34 2888 1
+34 2890 1
+34 2891 1
+34 2892 1
+34 2895 1
+34 2899 1
+34 2902 1
+34 2905 1
+34 2906 1
+34 2909 1
+34 2912 1
+34 2915 1
+34 2916 1
+34 2918 1
+34 2921 1
+34 2922 1
+34 2924 1
+34 2925 1
+34 2927 1
+34 2929 1
+34 2932 1
+34 2935 1
+34 2936 1
+34 2938 1
+34 2941 1
+34 2942 1
+34 2944 1
+34 2945 1
+34 2947 1
+34 2948 1
+34 2951 1
+34 2952 1
+34 2954 1
+34 2955 1
+34 2957 1
+34 2958 1
+34 2959 1
+34 2961 1
+34 2962 1
+34 2964 1
+34 2967 1
+34 2970 1
+34 2971 1
+34 2973 1
+34 2976 1
+34 2977 1
+34 2979 1
+34 2980 1
+34 2982 1
+34 2983 1
+34 2986 1
+34 2987 1
+34 2989 1
+34 2990 1
+34 2992 1
+34 2993 1
+34 2994 1
+34 2996 1
+34 2997 1
+34 2998 1
+34 3001 1
+34 3002 1
+34 3004 1
+34 3005 1
+34 3007 1
+34 3008 1
+34 3009 1
+34 3011 1
+34 3012 1
+34 3013 1
+34 3014 1
+34 3016 1
+34 3017 1
+34 3018 1
+34 3020 1
+34 3023 1
+34 3026 1
+34 3027 1
+34 3029 1
+34 3032 1
+34 3033 1
+34 3035 1
+34 3036 1
+34 3038 1
+34 3039 1
+34 3042 1
+34 3043 1
+34 3045 1
+34 3046 1
+34 3048 1
+34 3049 1
+34 3050 1
+34 3052 1
+34 3053 1
+34 3054 1
+34 3057 1
+34 3058 1
+34 3060 1
+34 3061 1
+34 3063 1
+34 3064 1
+34 3065 1
+34 3067 1
+34 3068 1
+34 3069 1
+34 3070 1
+34 3072 1
+34 3073 1
+34 3074 1
+34 3075 1
+34 3078 1
+34 3079 1
+34 3081 1
+34 3082 1
+34 3084 1
+34 3085 1
+34 3086 1
+34 3088 1
+34 3089 1
+34 3090 1
+34 3091 1
+34 3093 1
+34 3094 1
+34 3095 1
+34 3096 1
+34 3097 1
+34 3099 1
+34 3100 1
+34 3101 1
+34 3102 1
+35 7 1
+35 14 1
+35 20 1
+35 25 1
+35 29 1
+35 32 1
+35 34 1
+35 36 1
+35 42 1
+35 48 1
+35 53 1
+35 57 1
+35 60 1
+35 62 1
+35 64 1
+35 69 1
+35 74 1
+35 78 1
+35 81 1
+35 83 1
+35 85 1
+35 89 1
+35 93 1
+35 96 1
+35 98 1
+35 100 1
+35 103 1
+35 106 1
+35 108 1
+35 110 1
+35 112 1
+35 114 1
+35 116 1
+35 117 1
+35 119 1
+35 120 1
+35 126 1
+35 132 1
+35 137 1
+35 141 1
+35 144 1
+35 146 1
+35 148 1
+35 153 1
+35 158 1
+35 162 1
+35 165 1
+35 167 1
+35 169 1
+35 173 1
+35 177 1
+35 180 1
+35 182 1
+35 184 1
+35 187 1
+35 190 1
+35 192 1
+35 194 1
+35 196 1
+35 198 1
+35 200 1
+35 201 1
+35 203 1
+35 204 1
+35 209 1
+35 214 1
+35 218 1
+35 221 1
+35 223 1
+35 225 1
+35 229 1
+35 233 1
+35 236 1
+35 238 1
+35 240 1
+35 243 1
+35 246 1
+35 248 1
+35 250 1
+35 252 1
+35 254 1
+35 256 1
+35 257 1
+35 259 1
+35 260 1
+35 264 1
+35 268 1
+35 271 1
+35 273 1
+35 275 1
+35 278 1
+35 281 1
+35 283 1
+35 285 1
+35 287 1
+35 289 1
+35 291 1
+35 292 1
+35 294 1
+35 295 1
+35 298 1
+35 301 1
+35 303 1
+35 305 1
+35 307 1
+35 309 1
+35 311 1
+35 312 1
+35 314 1
+35 315 1
+35 317 1
+35 319 1
+35 321 1
+35 322 1
+35 324 1
+35 325 1
+35 326 1
+35 328 1
+35 329 1
+35 330 1
+35 798 1
+35 804 1
+35 809 1
+35 813 1
+35 816 1
+35 818 1
+35 820 1
+35 825 1
+35 830 1
+35 834 1
+35 837 1
+35 839 1
+35 841 1
+35 845 1
+35 849 1
+35 852 1
+35 854 1
+35 856 1
+35 859 1
+35 862 1
+35 864 1
+35 866 1
+35 868 1
+35 870 1
+35 872 1
+35 873 1
+35 875 1
+35 876 1
+35 881 1
+35 886 1
+35 890 1
+35 893 1
+35 895 1
+35 897 1
+35 901 1
+35 905 1
+35 908 1
+35 910 1
+35 912 1
+35 915 1
+35 918 1
+35 920 1
+35 922 1
+35 924 1
+35 926 1
+35 928 1
+35 929 1
+35 931 1
+35 932 1
+35 936 1
+35 940 1
+35 943 1
+35 945 1
+35 947 1
+35 950 1
+35 953 1
+35 955 1
+35 957 1
+35 959 1
+35 961 1
+35 963 1
+35 964 1
+35 966 1
+35 967 1
+35 970 1
+35 973 1
+35 975 1
+35 977 1
+35 979 1
+35 981 1
+35 983 1
+35 984 1
+35 986 1
+35 987 1
+35 989 1
+35 991 1
+35 993 1
+35 994 1
+35 996 1
+35 997 1
+35 998 1
+35 1000 1
+35 1001 1
+35 1002 1
+35 1007 1
+35 1012 1
+35 1016 1
+35 1019 1
+35 1021 1
+35 1023 1
+35 1027 1
+35 1031 1
+35 1034 1
+35 1036 1
+35 1038 1
+35 1041 1
+35 1044 1
+35 1046 1
+35 1048 1
+35 1050 1
+35 1052 1
+35 1054 1
+35 1055 1
+35 1057 1
+35 1058 1
+35 1062 1
+35 1066 1
+35 1069 1
+35 1071 1
+35 1073 1
+35 1076 1
+35 1079 1
+35 1081 1
+35 1083 1
+35 1085 1
+35 1087 1
+35 1089 1
+35 1090 1
+35 1092 1
+35 1093 1
+35 1096 1
+35 1099 1
+35 1101 1
+35 1103 1
+35 1105 1
+35 1107 1
+35 1109 1
+35 1110 1
+35 1112 1
+35 1113 1
+35 1115 1
+35 1117 1
+35 1119 1
+35 1120 1
+35 1122 1
+35 1123 1
+35 1124 1
+35 1126 1
+35 1127 1
+35 1128 1
+35 1132 1
+35 1136 1
+35 1139 1
+35 1141 1
+35 1143 1
+35 1146 1
+35 1149 1
+35 1151 1
+35 1153 1
+35 1155 1
+35 1157 1
+35 1159 1
+35 1160 1
+35 1162 1
+35 1163 1
+35 1166 1
+35 1169 1
+35 1171 1
+35 1173 1
+35 1175 1
+35 1177 1
+35 1179 1
+35 1180 1
+35 1182 1
+35 1183 1
+35 1185 1
+35 1187 1
+35 1189 1
+35 1190 1
+35 1192 1
+35 1193 1
+35 1194 1
+35 1196 1
+35 1197 1
+35 1198 1
+35 1201 1
+35 1204 1
+35 1206 1
+35 1208 1
+35 1210 1
+35 1212 1
+35 1214 1
+35 1215 1
+35 1217 1
+35 1218 1
+35 1220 1
+35 1222 1
+35 1224 1
+35 1225 1
+35 1227 1
+35 1228 1
+35 1229 1
+35 1231 1
+35 1232 1
+35 1233 1
+35 1235 1
+35 1237 1
+35 1239 1
+35 1240 1
+35 1242 1
+35 1243 1
+35 1244 1
+35 1246 1
+35 1247 1
+35 1248 1
+35 1249 1
+35 1251 1
+35 1252 1
+35 1253 1
+35 1254 1
+35 1722 1
+35 1728 1
+35 1733 1
+35 1737 1
+35 1740 1
+35 1742 1
+35 1744 1
+35 1749 1
+35 1754 1
+35 1758 1
+35 1761 1
+35 1763 1
+35 1765 1
+35 1769 1
+35 1773 1
+35 1776 1
+35 1778 1
+35 1780 1
+35 1783 1
+35 1786 1
+35 1788 1
+35 1790 1
+35 1792 1
+35 1794 1
+35 1796 1
+35 1797 1
+35 1799 1
+35 1800 1
+35 1805 1
+35 1810 1
+35 1814 1
+35 1817 1
+35 1819 1
+35 1821 1
+35 1825 1
+35 1829 1
+35 1832 1
+35 1834 1
+35 1836 1
+35 1839 1
+35 1842 1
+35 1844 1
+35 1846 1
+35 1848 1
+35 1850 1
+35 1852 1
+35 1853 1
+35 1855 1
+35 1856 1
+35 1860 1
+35 1864 1
+35 1867 1
+35 1869 1
+35 1871 1
+35 1874 1
+35 1877 1
+35 1879 1
+35 1881 1
+35 1883 1
+35 1885 1
+35 1887 1
+35 1888 1
+35 1890 1
+35 1891 1
+35 1894 1
+35 1897 1
+35 1899 1
+35 1901 1
+35 1903 1
+35 1905 1
+35 1907 1
+35 1908 1
+35 1910 1
+35 1911 1
+35 1913 1
+35 1915 1
+35 1917 1
+35 1918 1
+35 1920 1
+35 1921 1
+35 1922 1
+35 1924 1
+35 1925 1
+35 1926 1
+35 1931 1
+35 1936 1
+35 1940 1
+35 1943 1
+35 1945 1
+35 1947 1
+35 1951 1
+35 1955 1
+35 1958 1
+35 1960 1
+35 1962 1
+35 1965 1
+35 1968 1
+35 1970 1
+35 1972 1
+35 1974 1
+35 1976 1
+35 1978 1
+35 1979 1
+35 1981 1
+35 1982 1
+35 1986 1
+35 1990 1
+35 1993 1
+35 1995 1
+35 1997 1
+35 2000 1
+35 2003 1
+35 2005 1
+35 2007 1
+35 2009 1
+35 2011 1
+35 2013 1
+35 2014 1
+35 2016 1
+35 2017 1
+35 2020 1
+35 2023 1
+35 2025 1
+35 2027 1
+35 2029 1
+35 2031 1
+35 2033 1
+35 2034 1
+35 2036 1
+35 2037 1
+35 2039 1
+35 2041 1
+35 2043 1
+35 2044 1
+35 2046 1
+35 2047 1
+35 2048 1
+35 2050 1
+35 2051 1
+35 2052 1
+35 2056 1
+35 2060 1
+35 2063 1
+35 2065 1
+35 2067 1
+35 2070 1
+35 2073 1
+35 2075 1
+35 2077 1
+35 2079 1
+35 2081 1
+35 2083 1
+35 2084 1
+35 2086 1
+35 2087 1
+35 2090 1
+35 2093 1
+35 2095 1
+35 2097 1
+35 2099 1
+35 2101 1
+35 2103 1
+35 2104 1
+35 2106 1
+35 2107 1
+35 2109 1
+35 2111 1
+35 2113 1
+35 2114 1
+35 2116 1
+35 2117 1
+35 2118 1
+35 2120 1
+35 2121 1
+35 2122 1
+35 2125 1
+35 2128 1
+35 2130 1
+35 2132 1
+35 2134 1
+35 2136 1
+35 2138 1
+35 2139 1
+35 2141 1
+35 2142 1
+35 2144 1
+35 2146 1
+35 2148 1
+35 2149 1
+35 2151 1
+35 2152 1
+35 2153 1
+35 2155 1
+35 2156 1
+35 2157 1
+35 2159 1
+35 2161 1
+35 2163 1
+35 2164 1
+35 2166 1
+35 2167 1
+35 2168 1
+35 2170 1
+35 2171 1
+35 2172 1
+35 2173 1
+35 2175 1
+35 2176 1
+35 2177 1
+35 2178 1
+35 2645 1
+35 2650 1
+35 2654 1
+35 2657 1
+35 2659 1
+35 2661 1
+35 2665 1
+35 2669 1
+35 2672 1
+35 2674 1
+35 2676 1
+35 2679 1
+35 2682 1
+35 2684 1
+35 2686 1
+35 2688 1
+35 2690 1
+35 2692 1
+35 2693 1
+35 2695 1
+35 2696 1
+35 2700 1
+35 2704 1
+35 2707 1
+35 2709 1
+35 2711 1
+35 2714 1
+35 2717 1
+35 2719 1
+35 2721 1
+35 2723 1
+35 2725 1
+35 2727 1
+35 2728 1
+35 2730 1
+35 2731 1
+35 2734 1
+35 2737 1
+35 2739 1
+35 2741 1
+35 2743 1
+35 2745 1
+35 2747 1
+35 2748 1
+35 2750 1
+35 2751 1
+35 2753 1
+35 2755 1
+35 2757 1
+35 2758 1
+35 2760 1
+35 2761 1
+35 2762 1
+35 2764 1
+35 2765 1
+35 2766 1
+35 2770 1
+35 2774 1
+35 2777 1
+35 2779 1
+35 2781 1
+35 2784 1
+35 2787 1
+35 2789 1
+35 2791 1
+35 2793 1
+35 2795 1
+35 2797 1
+35 2798 1
+35 2800 1
+35 2801 1
+35 2804 1
+35 2807 1
+35 2809 1
+35 2811 1
+35 2813 1
+35 2815 1
+35 2817 1
+35 2818 1
+35 2820 1
+35 2821 1
+35 2823 1
+35 2825 1
+35 2827 1
+35 2828 1
+35 2830 1
+35 2831 1
+35 2832 1
+35 2834 1
+35 2835 1
+35 2836 1
+35 2839 1
+35 2842 1
+35 2844 1
+35 2846 1
+35 2848 1
+35 2850 1
+35 2852 1
+35 2853 1
+35 2855 1
+35 2856 1
+35 2858 1
+35 2860 1
+35 2862 1
+35 2863 1
+35 2865 1
+35 2866 1
+35 2867 1
+35 2869 1
+35 2870 1
+35 2871 1
+35 2873 1
+35 2875 1
+35 2877 1
+35 2878 1
+35 2880 1
+35 2881 1
+35 2882 1
+35 2884 1
+35 2885 1
+35 2886 1
+35 2887 1
+35 2889 1
+35 2890 1
+35 2891 1
+35 2892 1
+35 2896 1
+35 2900 1
+35 2903 1
+35 2905 1
+35 2907 1
+35 2910 1
+35 2913 1
+35 2915 1
+35 2917 1
+35 2919 1
+35 2921 1
+35 2923 1
+35 2924 1
+35 2926 1
+35 2927 1
+35 2930 1
+35 2933 1
+35 2935 1
+35 2937 1
+35 2939 1
+35 2941 1
+35 2943 1
+35 2944 1
+35 2946 1
+35 2947 1
+35 2949 1
+35 2951 1
+35 2953 1
+35 2954 1
+35 2956 1
+35 2957 1
+35 2958 1
+35 2960 1
+35 2961 1
+35 2962 1
+35 2965 1
+35 2968 1
+35 2970 1
+35 2972 1
+35 2974 1
+35 2976 1
+35 2978 1
+35 2979 1
+35 2981 1
+35 2982 1
+35 2984 1
+35 2986 1
+35 2988 1
+35 2989 1
+35 2991 1
+35 2992 1
+35 2993 1
+35 2995 1
+35 2996 1
+35 2997 1
+35 2999 1
+35 3001 1
+35 3003 1
+35 3004 1
+35 3006 1
+35 3007 1
+35 3008 1
+35 3010 1
+35 3011 1
+35 3012 1
+35 3013 1
+35 3015 1
+35 3016 1
+35 3017 1
+35 3018 1
+35 3021 1
+35 3024 1
+35 3026 1
+35 3028 1
+35 3030 1
+35 3032 1
+35 3034 1
+35 3035 1
+35 3037 1
+35 3038 1
+35 3040 1
+35 3042 1
+35 3044 1
+35 3045 1
+35 3047 1
+35 3048 1
+35 3049 1
+35 3051 1
+35 3052 1
+35 3053 1
+35 3055 1
+35 3057 1
+35 3059 1
+35 3060 1
+35 3062 1
+35 3063 1
+35 3064 1
+35 3066 1
+35 3067 1
+35 3068 1
+35 3069 1
+35 3071 1
+35 3072 1
+35 3073 1
+35 3074 1
+35 3076 1
+35 3078 1
+35 3080 1
+35 3081 1
+35 3083 1
+35 3084 1
+35 3085 1
+35 3087 1
+35 3088 1
+35 3089 1
+35 3090 1
+35 3092 1
+35 3093 1
+35 3094 1
+35 3095 1
+35 3096 1
+35 3098 1
+35 3099 1
+35 3100 1
+35 3101 1
+35 3102 1
+36 8 1
+36 15 1
+36 21 1
+36 26 1
+36 30 1
+36 33 1
+36 35 1
+36 36 1
+36 43 1
+36 49 1
+36 54 1
+36 58 1
+36 61 1
+36 63 1
+36 64 1
+36 70 1
+36 75 1
+36 79 1
+36 82 1
+36 84 1
+36 85 1
+36 90 1
+36 94 1
+36 97 1
+36 99 1
+36 100 1
+36 104 1
+36 107 1
+36 109 1
+36 110 1
+36 113 1
+36 115 1
+36 116 1
+36 118 1
+36 119 1
+36 120 1
+36 127 1
+36 133 1
+36 138 1
+36 142 1
+36 145 1
+36 147 1
+36 148 1
+36 154 1
+36 159 1
+36 163 1
+36 166 1
+36 168 1
+36 169 1
+36 174 1
+36 178 1
+36 181 1
+36 183 1
+36 184 1
+36 188 1
+36 191 1
+36 193 1
+36 194 1
+36 197 1
+36 199 1
+36 200 1
+36 202 1
+36 203 1
+36 204 1
+36 210 1
+36 215 1
+36 219 1
+36 222 1
+36 224 1
+36 225 1
+36 230 1
+36 234 1
+36 237 1
+36 239 1
+36 240 1
+36 244 1
+36 247 1
+36 249 1
+36 250 1
+36 253 1
+36 255 1
+36 256 1
+36 258 1
+36 259 1
+36 260 1
+36 265 1
+36 269 1
+36 272 1
+36 274 1
+36 275 1
+36 279 1
+36 282 1
+36 284 1
+36 285 1
+36 288 1
+36 290 1
+36 291 1
+36 293 1
+36 294 1
+36 295 1
+36 299 1
+36 302 1
+36 304 1
+36 305 1
+36 308 1
+36 310 1
+36 311 1
+36 313 1
+36 314 1
+36 315 1
+36 318 1
+36 320 1
+36 321 1
+36 323 1
+36 324 1
+36 325 1
+36 327 1
+36 328 1
+36 329 1
+36 330 1
+36 799 1
+36 805 1
+36 810 1
+36 814 1
+36 817 1
+36 819 1
+36 820 1
+36 826 1
+36 831 1
+36 835 1
+36 838 1
+36 840 1
+36 841 1
+36 846 1
+36 850 1
+36 853 1
+36 855 1
+36 856 1
+36 860 1
+36 863 1
+36 865 1
+36 866 1
+36 869 1
+36 871 1
+36 872 1
+36 874 1
+36 875 1
+36 876 1
+36 882 1
+36 887 1
+36 891 1
+36 894 1
+36 896 1
+36 897 1
+36 902 1
+36 906 1
+36 909 1
+36 911 1
+36 912 1
+36 916 1
+36 919 1
+36 921 1
+36 922 1
+36 925 1
+36 927 1
+36 928 1
+36 930 1
+36 931 1
+36 932 1
+36 937 1
+36 941 1
+36 944 1
+36 946 1
+36 947 1
+36 951 1
+36 954 1
+36 956 1
+36 957 1
+36 960 1
+36 962 1
+36 963 1
+36 965 1
+36 966 1
+36 967 1
+36 971 1
+36 974 1
+36 976 1
+36 977 1
+36 980 1
+36 982 1
+36 983 1
+36 985 1
+36 986 1
+36 987 1
+36 990 1
+36 992 1
+36 993 1
+36 995 1
+36 996 1
+36 997 1
+36 999 1
+36 1000 1
+36 1001 1
+36 1002 1
+36 1008 1
+36 1013 1
+36 1017 1
+36 1020 1
+36 1022 1
+36 1023 1
+36 1028 1
+36 1032 1
+36 1035 1
+36 1037 1
+36 1038 1
+36 1042 1
+36 1045 1
+36 1047 1
+36 1048 1
+36 1051 1
+36 1053 1
+36 1054 1
+36 1056 1
+36 1057 1
+36 1058 1
+36 1063 1
+36 1067 1
+36 1070 1
+36 1072 1
+36 1073 1
+36 1077 1
+36 1080 1
+36 1082 1
+36 1083 1
+36 1086 1
+36 1088 1
+36 1089 1
+36 1091 1
+36 1092 1
+36 1093 1
+36 1097 1
+36 1100 1
+36 1102 1
+36 1103 1
+36 1106 1
+36 1108 1
+36 1109 1
+36 1111 1
+36 1112 1
+36 1113 1
+36 1116 1
+36 1118 1
+36 1119 1
+36 1121 1
+36 1122 1
+36 1123 1
+36 1125 1
+36 1126 1
+36 1127 1
+36 1128 1
+36 1133 1
+36 1137 1
+36 1140 1
+36 1142 1
+36 1143 1
+36 1147 1
+36 1150 1
+36 1152 1
+36 1153 1
+36 1156 1
+36 1158 1
+36 1159 1
+36 1161 1
+36 1162 1
+36 1163 1
+36 1167 1
+36 1170 1
+36 1172 1
+36 1173 1
+36 1176 1
+36 1178 1
+36 1179 1
+36 1181 1
+36 1182 1
+36 1183 1
+36 1186 1
+36 1188 1
+36 1189 1
+36 1191 1
+36 1192 1
+36 1193 1
+36 1195 1
+36 1196 1
+36 1197 1
+36 1198 1
+36 1202 1
+36 1205 1
+36 1207 1
+36 1208 1
+36 1211 1
+36 1213 1
+36 1214 1
+36 1216 1
+36 1217 1
+36 1218 1
+36 1221 1
+36 1223 1
+36 1224 1
+36 1226 1
+36 1227 1
+36 1228 1
+36 1230 1
+36 1231 1
+36 1232 1
+36 1233 1
+36 1236 1
+36 1238 1
+36 1239 1
+36 1241 1
+36 1242 1
+36 1243 1
+36 1245 1
+36 1246 1
+36 1247 1
+36 1248 1
+36 1250 1
+36 1251 1
+36 1252 1
+36 1253 1
+36 1254 1
+36 1723 1
+36 1729 1
+36 1734 1
+36 1738 1
+36 1741 1
+36 1743 1
+36 1744 1
+36 1750 1
+36 1755 1
+36 1759 1
+36 1762 1
+36 1764 1
+36 1765 1
+36 1770 1
+36 1774 1
+36 1777 1
+36 1779 1
+36 1780 1
+36 1784 1
+36 1787 1
+36 1789 1
+36 1790 1
+36 1793 1
+36 1795 1
+36 1796 1
+36 1798 1
+36 1799 1
+36 1800 1
+36 1806 1
+36 1811 1
+36 1815 1
+36 1818 1
+36 1820 1
+36 1821 1
+36 1826 1
+36 1830 1
+36 1833 1
+36 1835 1
+36 1836 1
+36 1840 1
+36 1843 1
+36 1845 1
+36 1846 1
+36 1849 1
+36 1851 1
+36 1852 1
+36 1854 1
+36 1855 1
+36 1856 1
+36 1861 1
+36 1865 1
+36 1868 1
+36 1870 1
+36 1871 1
+36 1875 1
+36 1878 1
+36 1880 1
+36 1881 1
+36 1884 1
+36 1886 1
+36 1887 1
+36 1889 1
+36 1890 1
+36 1891 1
+36 1895 1
+36 1898 1
+36 1900 1
+36 1901 1
+36 1904 1
+36 1906 1
+36 1907 1
+36 1909 1
+36 1910 1
+36 1911 1
+36 1914 1
+36 1916 1
+36 1917 1
+36 1919 1
+36 1920 1
+36 1921 1
+36 1923 1
+36 1924 1
+36 1925 1
+36 1926 1
+36 1932 1
+36 1937 1
+36 1941 1
+36 1944 1
+36 1946 1
+36 1947 1
+36 1952 1
+36 1956 1
+36 1959 1
+36 1961 1
+36 1962 1
+36 1966 1
+36 1969 1
+36 1971 1
+36 1972 1
+36 1975 1
+36 1977 1
+36 1978 1
+36 1980 1
+36 1981 1
+36 1982 1
+36 1987 1
+36 1991 1
+36 1994 1
+36 1996 1
+36 1997 1
+36 2001 1
+36 2004 1
+36 2006 1
+36 2007 1
+36 2010 1
+36 2012 1
+36 2013 1
+36 2015 1
+36 2016 1
+36 2017 1
+36 2021 1
+36 2024 1
+36 2026 1
+36 2027 1
+36 2030 1
+36 2032 1
+36 2033 1
+36 2035 1
+36 2036 1
+36 2037 1
+36 2040 1
+36 2042 1
+36 2043 1
+36 2045 1
+36 2046 1
+36 2047 1
+36 2049 1
+36 2050 1
+36 2051 1
+36 2052 1
+36 2057 1
+36 2061 1
+36 2064 1
+36 2066 1
+36 2067 1
+36 2071 1
+36 2074 1
+36 2076 1
+36 2077 1
+36 2080 1
+36 2082 1
+36 2083 1
+36 2085 1
+36 2086 1
+36 2087 1
+36 2091 1
+36 2094 1
+36 2096 1
+36 2097 1
+36 2100 1
+36 2102 1
+36 2103 1
+36 2105 1
+36 2106 1
+36 2107 1
+36 2110 1
+36 2112 1
+36 2113 1
+36 2115 1
+36 2116 1
+36 2117 1
+36 2119 1
+36 2120 1
+36 2121 1
+36 2122 1
+36 2126 1
+36 2129 1
+36 2131 1
+36 2132 1
+36 2135 1
+36 2137 1
+36 2138 1
+36 2140 1
+36 2141 1
+36 2142 1
+36 2145 1
+36 2147 1
+36 2148 1
+36 2150 1
+36 2151 1
+36 2152 1
+36 2154 1
+36 2155 1
+36 2156 1
+36 2157 1
+36 2160 1
+36 2162 1
+36 2163 1
+36 2165 1
+36 2166 1
+36 2167 1
+36 2169 1
+36 2170 1
+36 2171 1
+36 2172 1
+36 2174 1
+36 2175 1
+36 2176 1
+36 2177 1
+36 2178 1
+36 2646 1
+36 2651 1
+36 2655 1
+36 2658 1
+36 2660 1
+36 2661 1
+36 2666 1
+36 2670 1
+36 2673 1
+36 2675 1
+36 2676 1
+36 2680 1
+36 2683 1
+36 2685 1
+36 2686 1
+36 2689 1
+36 2691 1
+36 2692 1
+36 2694 1
+36 2695 1
+36 2696 1
+36 2701 1
+36 2705 1
+36 2708 1
+36 2710 1
+36 2711 1
+36 2715 1
+36 2718 1
+36 2720 1
+36 2721 1
+36 2724 1
+36 2726 1
+36 2727 1
+36 2729 1
+36 2730 1
+36 2731 1
+36 2735 1
+36 2738 1
+36 2740 1
+36 2741 1
+36 2744 1
+36 2746 1
+36 2747 1
+36 2749 1
+36 2750 1
+36 2751 1
+36 2754 1
+36 2756 1
+36 2757 1
+36 2759 1
+36 2760 1
+36 2761 1
+36 2763 1
+36 2764 1
+36 2765 1
+36 2766 1
+36 2771 1
+36 2775 1
+36 2778 1
+36 2780 1
+36 2781 1
+36 2785 1
+36 2788 1
+36 2790 1
+36 2791 1
+36 2794 1
+36 2796 1
+36 2797 1
+36 2799 1
+36 2800 1
+36 2801 1
+36 2805 1
+36 2808 1
+36 2810 1
+36 2811 1
+36 2814 1
+36 2816 1
+36 2817 1
+36 2819 1
+36 2820 1
+36 2821 1
+36 2824 1
+36 2826 1
+36 2827 1
+36 2829 1
+36 2830 1
+36 2831 1
+36 2833 1
+36 2834 1
+36 2835 1
+36 2836 1
+36 2840 1
+36 2843 1
+36 2845 1
+36 2846 1
+36 2849 1
+36 2851 1
+36 2852 1
+36 2854 1
+36 2855 1
+36 2856 1
+36 2859 1
+36 2861 1
+36 2862 1
+36 2864 1
+36 2865 1
+36 2866 1
+36 2868 1
+36 2869 1
+36 2870 1
+36 2871 1
+36 2874 1
+36 2876 1
+36 2877 1
+36 2879 1
+36 2880 1
+36 2881 1
+36 2883 1
+36 2884 1
+36 2885 1
+36 2886 1
+36 2888 1
+36 2889 1
+36 2890 1
+36 2891 1
+36 2892 1
+36 2897 1
+36 2901 1
+36 2904 1
+36 2906 1
+36 2907 1
+36 2911 1
+36 2914 1
+36 2916 1
+36 2917 1
+36 2920 1
+36 2922 1
+36 2923 1
+36 2925 1
+36 2926 1
+36 2927 1
+36 2931 1
+36 2934 1
+36 2936 1
+36 2937 1
+36 2940 1
+36 2942 1
+36 2943 1
+36 2945 1
+36 2946 1
+36 2947 1
+36 2950 1
+36 2952 1
+36 2953 1
+36 2955 1
+36 2956 1
+36 2957 1
+36 2959 1
+36 2960 1
+36 2961 1
+36 2962 1
+36 2966 1
+36 2969 1
+36 2971 1
+36 2972 1
+36 2975 1
+36 2977 1
+36 2978 1
+36 2980 1
+36 2981 1
+36 2982 1
+36 2985 1
+36 2987 1
+36 2988 1
+36 2990 1
+36 2991 1
+36 2992 1
+36 2994 1
+36 2995 1
+36 2996 1
+36 2997 1
+36 3000 1
+36 3002 1
+36 3003 1
+36 3005 1
+36 3006 1
+36 3007 1
+36 3009 1
+36 3010 1
+36 3011 1
+36 3012 1
+36 3014 1
+36 3015 1
+36 3016 1
+36 3017 1
+36 3018 1
+36 3022 1
+36 3025 1
+36 3027 1
+36 3028 1
+36 3031 1
+36 3033 1
+36 3034 1
+36 3036 1
+36 3037 1
+36 3038 1
+36 3041 1
+36 3043 1
+36 3044 1
+36 3046 1
+36 3047 1
+36 3048 1
+36 3050 1
+36 3051 1
+36 3052 1
+36 3053 1
+36 3056 1
+36 3058 1
+36 3059 1
+36 3061 1
+36 3062 1
+36 3063 1
+36 3065 1
+36 3066 1
+36 3067 1
+36 3068 1
+36 3070 1
+36 3071 1
+36 3072 1
+36 3073 1
+36 3074 1
+36 3077 1
+36 3079 1
+36 3080 1
+36 3082 1
+36 3083 1
+36 3084 1
+36 3086 1
+36 3087 1
+36 3088 1
+36 3089 1
+36 3091 1
+36 3092 1
+36 3093 1
+36 3094 1
+36 3095 1
+36 3097 1
+36 3098 1
+36 3099 1
+36 3100 1
+36 3101 1
+36 3102 1
+37 1 1
+37 2 1
+37 3 1
+37 4 1
+37 5 1
+37 6 1
+37 7 1
+37 8 1
+37 9 1
+37 10 1
+37 11 1
+37 12 1
+37 13 1
+37 14 1
+37 15 1
+37 16 1
+37 17 1
+37 18 1
+37 19 1
+37 20 1
+37 21 1
+37 22 1
+37 23 1
+37 24 1
+37 25 1
+37 26 1
+37 27 1
+37 28 1
+37 29 1
+37 30 1
+37 31 1
+37 32 1
+37 33 1
+37 34 1
+37 35 1
+37 36 1
+37 331 1
+37 332 1
+37 333 1
+37 334 1
+37 335 1
+37 336 1
+37 337 1
+37 338 1
+37 339 1
+37 340 1
+37 341 1
+37 342 1
+37 343 1
+37 344 1
+37 345 1
+37 346 1
+37 347 1
+37 348 1
+37 349 1
+37 350 1
+37 351 1
+37 352 1
+37 353 1
+37 354 1
+37 355 1
+37 356 1
+37 357 1
+37 358 1
+37 359 1
+37 360 1
+37 361 1
+37 362 1
+37 363 1
+37 364 1
+37 365 1
+37 366 1
+37 367 1
+37 368 1
+37 369 1
+37 370 1
+37 371 1
+37 372 1
+37 373 1
+37 374 1
+37 375 1
+37 376 1
+37 377 1
+37 378 1
+37 379 1
+37 380 1
+37 381 1
+37 382 1
+37 383 1
+37 384 1
+37 385 1
+37 386 1
+37 387 1
+37 388 1
+37 389 1
+37 390 1
+37 391 1
+37 392 1
+37 393 1
+37 394 1
+37 395 1
+37 396 1
+37 397 1
+37 398 1
+37 399 1
+37 400 1
+37 401 1
+37 402 1
+37 403 1
+37 404 1
+37 405 1
+37 406 1
+37 407 1
+37 408 1
+37 409 1
+37 410 1
+37 411 1
+37 412 1
+37 413 1
+37 414 1
+37 793 1
+37 794 1
+37 795 1
+37 796 1
+37 797 1
+37 798 1
+37 799 1
+37 800 1
+37 801 1
+37 802 1
+37 803 1
+37 804 1
+37 805 1
+37 806 1
+37 807 1
+37 808 1
+37 809 1
+37 810 1
+37 811 1
+37 812 1
+37 813 1
+37 814 1
+37 815 1
+37 816 1
+37 817 1
+37 818 1
+37 819 1
+37 820 1
+37 821 1
+37 822 1
+37 823 1
+37 824 1
+37 825 1
+37 826 1
+37 827 1
+37 828 1
+37 829 1
+37 830 1
+37 831 1
+37 832 1
+37 833 1
+37 834 1
+37 835 1
+37 836 1
+37 837 1
+37 838 1
+37 839 1
+37 840 1
+37 841 1
+37 842 1
+37 843 1
+37 844 1
+37 845 1
+37 846 1
+37 847 1
+37 848 1
+37 849 1
+37 850 1
+37 851 1
+37 852 1
+37 853 1
+37 854 1
+37 855 1
+37 856 1
+37 857 1
+37 858 1
+37 859 1
+37 860 1
+37 861 1
+37 862 1
+37 863 1
+37 864 1
+37 865 1
+37 866 1
+37 867 1
+37 868 1
+37 869 1
+37 870 1
+37 871 1
+37 872 1
+37 873 1
+37 874 1
+37 875 1
+37 876 1
+37 1255 1
+37 1256 1
+37 1257 1
+37 1258 1
+37 1259 1
+37 1260 1
+37 1261 1
+37 1262 1
+37 1263 1
+37 1264 1
+37 1265 1
+37 1266 1
+37 1267 1
+37 1268 1
+37 1269 1
+37 1270 1
+37 1271 1
+37 1272 1
+37 1273 1
+37 1274 1
+37 1275 1
+37 1276 1
+37 1277 1
+37 1278 1
+37 1279 1
+37 1280 1
+37 1281 1
+37 1282 1
+37 1283 1
+37 1284 1
+37 1285 1
+37 1286 1
+37 1287 1
+37 1288 1
+37 1289 1
+37 1290 1
+37 1291 1
+37 1292 1
+37 1293 1
+37 1294 1
+37 1295 1
+37 1296 1
+37 1297 1
+37 1298 1
+37 1299 1
+37 1300 1
+37 1301 1
+37 1302 1
+37 1303 1
+37 1304 1
+37 1305 1
+37 1306 1
+37 1307 1
+37 1308 1
+37 1309 1
+37 1310 1
+37 1311 1
+37 1312 1
+37 1313 1
+37 1314 1
+37 1315 1
+37 1316 1
+37 1317 1
+37 1318 1
+37 1319 1
+37 1320 1
+37 1321 1
+37 1322 1
+37 1323 1
+37 1324 1
+37 1325 1
+37 1326 1
+37 1327 1
+37 1328 1
+37 1329 1
+37 1330 1
+37 1331 1
+37 1332 1
+37 1333 1
+37 1334 1
+37 1335 1
+37 1336 1
+37 1337 1
+37 1338 1
+37 1339 1
+37 1340 1
+37 1341 1
+37 1342 1
+37 1343 1
+37 1344 1
+37 1345 1
+37 1346 1
+37 1347 1
+37 1348 1
+37 1349 1
+37 1350 1
+37 1351 1
+37 1352 1
+37 1353 1
+37 1354 1
+37 1355 1
+37 1356 1
+37 1357 1
+37 1358 1
+37 1359 1
+37 1360 1
+37 1361 1
+37 1362 1
+37 1363 1
+37 1364 1
+37 1365 1
+37 1366 1
+37 1367 1
+37 1368 1
+37 1369 1
+37 1370 1
+37 1371 1
+37 1372 1
+37 1373 1
+37 1374 1
+37 1375 1
+37 1376 1
+37 1377 1
+37 1378 1
+37 1379 1
+37 1380 1
+37 1717 1
+37 1718 1
+37 1719 1
+37 1720 1
+37 1721 1
+37 1722 1
+37 1723 1
+37 1724 1
+37 1725 1
+37 1726 1
+37 1727 1
+37 1728 1
+37 1729 1
+37 1730 1
+37 1731 1
+37 1732 1
+37 1733 1
+37 1734 1
+37 1735 1
+37 1736 1
+37 1737 1
+37 1738 1
+37 1739 1
+37 1740 1
+37 1741 1
+37 1742 1
+37 1743 1
+37 1744 1
+37 1745 1
+37 1746 1
+37 1747 1
+37 1748 1
+37 1749 1
+37 1750 1
+37 1751 1
+37 1752 1
+37 1753 1
+37 1754 1
+37 1755 1
+37 1756 1
+37 1757 1
+37 1758 1
+37 1759 1
+37 1760 1
+37 1761 1
+37 1762 1
+37 1763 1
+37 1764 1
+37 1765 1
+37 1766 1
+37 1767 1
+37 1768 1
+37 1769 1
+37 1770 1
+37 1771 1
+37 1772 1
+37 1773 1
+37 1774 1
+37 1775 1
+37 1776 1
+37 1777 1
+37 1778 1
+37 1779 1
+37 1780 1
+37 1781 1
+37 1782 1
+37 1783 1
+37 1784 1
+37 1785 1
+37 1786 1
+37 1787 1
+37 1788 1
+37 1789 1
+37 1790 1
+37 1791 1
+37 1792 1
+37 1793 1
+37 1794 1
+37 1795 1
+37 1796 1
+37 1797 1
+37 1798 1
+37 1799 1
+37 1800 1
+37 2179 1
+37 2180 1
+37 2181 1
+37 2182 1
+37 2183 1
+37 2184 1
+37 2185 1
+37 2186 1
+37 2187 1
+37 2188 1
+37 2189 1
+37 2190 1
+37 2191 1
+37 2192 1
+37 2193 1
+37 2194 1
+37 2195 1
+37 2196 1
+37 2197 1
+37 2198 1
+37 2199 1
+37 2200 1
+37 2201 1
+37 2202 1
+37 2203 1
+37 2204 1
+37 2205 1
+37 2206 1
+37 2207 1
+37 2208 1
+37 2209 1
+37 2210 1
+37 2211 1
+37 2212 1
+37 2213 1
+37 2214 1
+37 2215 1
+37 2216 1
+37 2217 1
+37 2218 1
+37 2219 1
+37 2220 1
+37 2221 1
+37 2222 1
+37 2223 1
+37 2224 1
+37 2225 1
+37 2226 1
+37 2227 1
+37 2228 1
+37 2229 1
+37 2230 1
+37 2231 1
+37 2232 1
+37 2233 1
+37 2234 1
+37 2235 1
+37 2236 1
+37 2237 1
+37 2238 1
+37 2239 1
+37 2240 1
+37 2241 1
+37 2242 1
+37 2243 1
+37 2244 1
+37 2245 1
+37 2246 1
+37 2247 1
+37 2248 1
+37 2249 1
+37 2250 1
+37 2251 1
+37 2252 1
+37 2253 1
+37 2254 1
+37 2255 1
+37 2256 1
+37 2257 1
+37 2258 1
+37 2259 1
+37 2260 1
+37 2261 1
+37 2262 1
+37 2263 1
+37 2264 1
+37 2265 1
+37 2266 1
+37 2267 1
+37 2268 1
+37 2269 1
+37 2270 1
+37 2271 1
+37 2272 1
+37 2273 1
+37 2274 1
+37 2275 1
+37 2276 1
+37 2277 1
+37 2278 1
+37 2279 1
+37 2280 1
+37 2281 1
+37 2282 1
+37 2283 1
+37 2284 1
+37 2285 1
+37 2286 1
+37 2287 1
+37 2288 1
+37 2289 1
+37 2290 1
+37 2291 1
+37 2292 1
+37 2293 1
+37 2294 1
+37 2295 1
+37 2296 1
+37 2297 1
+37 2298 1
+37 2299 1
+37 2300 1
+37 2301 1
+37 2302 1
+37 2303 1
+37 2304 1
+37 2641 1
+37 2642 1
+37 2643 1
+37 2644 1
+37 2645 1
+37 2646 1
+37 2647 1
+37 2648 1
+37 2649 1
+37 2650 1
+37 2651 1
+37 2652 1
+37 2653 1
+37 2654 1
+37 2655 1
+37 2656 1
+37 2657 1
+37 2658 1
+37 2659 1
+37 2660 1
+37 2661 1
+37 2662 1
+37 2663 1
+37 2664 1
+37 2665 1
+37 2666 1
+37 2667 1
+37 2668 1
+37 2669 1
+37 2670 1
+37 2671 1
+37 2672 1
+37 2673 1
+37 2674 1
+37 2675 1
+37 2676 1
+37 2677 1
+37 2678 1
+37 2679 1
+37 2680 1
+37 2681 1
+37 2682 1
+37 2683 1
+37 2684 1
+37 2685 1
+37 2686 1
+37 2687 1
+37 2688 1
+37 2689 1
+37 2690 1
+37 2691 1
+37 2692 1
+37 2693 1
+37 2694 1
+37 2695 1
+37 2696 1
+37 2697 1
+37 2698 1
+37 2699 1
+37 2700 1
+37 2701 1
+37 2702 1
+37 2703 1
+37 2704 1
+37 2705 1
+37 2706 1
+37 2707 1
+37 2708 1
+37 2709 1
+37 2710 1
+37 2711 1
+37 2712 1
+37 2713 1
+37 2714 1
+37 2715 1
+37 2716 1
+37 2717 1
+37 2718 1
+37 2719 1
+37 2720 1
+37 2721 1
+37 2722 1
+37 2723 1
+37 2724 1
+37 2725 1
+37 2726 1
+37 2727 1
+37 2728 1
+37 2729 1
+37 2730 1
+37 2731 1
+37 2732 1
+37 2733 1
+37 2734 1
+37 2735 1
+37 2736 1
+37 2737 1
+37 2738 1
+37 2739 1
+37 2740 1
+37 2741 1
+37 2742 1
+37 2743 1
+37 2744 1
+37 2745 1
+37 2746 1
+37 2747 1
+37 2748 1
+37 2749 1
+37 2750 1
+37 2751 1
+37 2752 1
+37 2753 1
+37 2754 1
+37 2755 1
+37 2756 1
+37 2757 1
+37 2758 1
+37 2759 1
+37 2760 1
+37 2761 1
+37 2762 1
+37 2763 1
+37 2764 1
+37 2765 1
+37 2766 1
+37 3103 1
+37 3104 1
+37 3105 1
+37 3106 1
+37 3107 1
+37 3108 1
+37 3109 1
+37 3110 1
+37 3111 1
+37 3112 1
+37 3113 1
+37 3114 1
+37 3115 1
+37 3116 1
+37 3117 1
+37 3118 1
+37 3119 1
+37 3120 1
+37 3121 1
+37 3122 1
+37 3123 1
+37 3124 1
+37 3125 1
+37 3126 1
+37 3127 1
+37 3128 1
+37 3129 1
+37 3130 1
+37 3131 1
+37 3132 1
+37 3133 1
+37 3134 1
+37 3135 1
+37 3136 1
+37 3137 1
+37 3138 1
+37 3139 1
+37 3140 1
+37 3141 1
+37 3142 1
+37 3143 1
+37 3144 1
+37 3145 1
+37 3146 1
+37 3147 1
+37 3148 1
+37 3149 1
+37 3150 1
+37 3151 1
+37 3152 1
+37 3153 1
+37 3154 1
+37 3155 1
+37 3156 1
+37 3157 1
+37 3158 1
+37 3159 1
+37 3160 1
+37 3161 1
+37 3162 1
+37 3163 1
+37 3164 1
+37 3165 1
+37 3166 1
+37 3167 1
+37 3168 1
+37 3169 1
+37 3170 1
+37 3171 1
+37 3172 1
+37 3173 1
+37 3174 1
+37 3175 1
+37 3176 1
+37 3177 1
+37 3178 1
+37 3179 1
+37 3180 1
+37 3181 1
+37 3182 1
+37 3183 1
+37 3184 1
+37 3185 1
+37 3186 1
+37 3187 1
+37 3188 1
+37 3189 1
+37 3190 1
+37 3191 1
+37 3192 1
+37 3193 1
+37 3194 1
+37 3195 1
+37 3196 1
+37 3197 1
+37 3198 1
+37 3199 1
+37 3200 1
+37 3201 1
+37 3202 1
+37 3203 1
+37 3204 1
+37 3205 1
+37 3206 1
+37 3207 1
+37 3208 1
+37 3209 1
+37 3210 1
+37 3211 1
+37 3212 1
+37 3213 1
+37 3214 1
+37 3215 1
+37 3216 1
+37 3217 1
+37 3218 1
+37 3219 1
+37 3220 1
+37 3221 1
+37 3222 1
+37 3223 1
+37 3224 1
+37 3225 1
+37 3226 1
+37 3227 1
+37 3228 1
+38 1 1
+38 2 1
+38 3 1
+38 4 1
+38 5 1
+38 6 1
+38 7 1
+38 8 1
+38 37 1
+38 38 1
+38 39 1
+38 40 1
+38 41 1
+38 42 1
+38 43 1
+38 44 1
+38 45 1
+38 46 1
+38 47 1
+38 48 1
+38 49 1
+38 50 1
+38 51 1
+38 52 1
+38 53 1
+38 54 1
+38 55 1
+38 56 1
+38 57 1
+38 58 1
+38 59 1
+38 60 1
+38 61 1
+38 62 1
+38 63 1
+38 64 1
+38 331 1
+38 332 1
+38 333 1
+38 334 1
+38 335 1
+38 336 1
+38 337 1
+38 338 1
+38 339 1
+38 340 1
+38 341 1
+38 342 1
+38 343 1
+38 344 1
+38 345 1
+38 346 1
+38 347 1
+38 348 1
+38 349 1
+38 350 1
+38 351 1
+38 352 1
+38 353 1
+38 354 1
+38 355 1
+38 356 1
+38 357 1
+38 358 1
+38 415 1
+38 416 1
+38 417 1
+38 418 1
+38 419 1
+38 420 1
+38 421 1
+38 422 1
+38 423 1
+38 424 1
+38 425 1
+38 426 1
+38 427 1
+38 428 1
+38 429 1
+38 430 1
+38 431 1
+38 432 1
+38 433 1
+38 434 1
+38 435 1
+38 436 1
+38 437 1
+38 438 1
+38 439 1
+38 440 1
+38 441 1
+38 442 1
+38 443 1
+38 444 1
+38 445 1
+38 446 1
+38 447 1
+38 448 1
+38 449 1
+38 450 1
+38 451 1
+38 452 1
+38 453 1
+38 454 1
+38 455 1
+38 456 1
+38 457 1
+38 458 1
+38 459 1
+38 460 1
+38 461 1
+38 462 1
+38 463 1
+38 464 1
+38 465 1
+38 466 1
+38 467 1
+38 468 1
+38 469 1
+38 470 1
+38 793 1
+38 794 1
+38 795 1
+38 796 1
+38 797 1
+38 798 1
+38 799 1
+38 800 1
+38 801 1
+38 802 1
+38 803 1
+38 804 1
+38 805 1
+38 806 1
+38 807 1
+38 808 1
+38 809 1
+38 810 1
+38 811 1
+38 812 1
+38 813 1
+38 814 1
+38 815 1
+38 816 1
+38 817 1
+38 818 1
+38 819 1
+38 820 1
+38 877 1
+38 878 1
+38 879 1
+38 880 1
+38 881 1
+38 882 1
+38 883 1
+38 884 1
+38 885 1
+38 886 1
+38 887 1
+38 888 1
+38 889 1
+38 890 1
+38 891 1
+38 892 1
+38 893 1
+38 894 1
+38 895 1
+38 896 1
+38 897 1
+38 898 1
+38 899 1
+38 900 1
+38 901 1
+38 902 1
+38 903 1
+38 904 1
+38 905 1
+38 906 1
+38 907 1
+38 908 1
+38 909 1
+38 910 1
+38 911 1
+38 912 1
+38 913 1
+38 914 1
+38 915 1
+38 916 1
+38 917 1
+38 918 1
+38 919 1
+38 920 1
+38 921 1
+38 922 1
+38 923 1
+38 924 1
+38 925 1
+38 926 1
+38 927 1
+38 928 1
+38 929 1
+38 930 1
+38 931 1
+38 932 1
+38 1255 1
+38 1256 1
+38 1257 1
+38 1258 1
+38 1259 1
+38 1260 1
+38 1261 1
+38 1262 1
+38 1263 1
+38 1264 1
+38 1265 1
+38 1266 1
+38 1267 1
+38 1268 1
+38 1269 1
+38 1270 1
+38 1271 1
+38 1272 1
+38 1273 1
+38 1274 1
+38 1275 1
+38 1276 1
+38 1277 1
+38 1278 1
+38 1279 1
+38 1280 1
+38 1281 1
+38 1282 1
+38 1283 1
+38 1284 1
+38 1285 1
+38 1286 1
+38 1287 1
+38 1288 1
+38 1289 1
+38 1290 1
+38 1291 1
+38 1292 1
+38 1293 1
+38 1294 1
+38 1295 1
+38 1296 1
+38 1297 1
+38 1298 1
+38 1299 1
+38 1300 1
+38 1301 1
+38 1302 1
+38 1303 1
+38 1304 1
+38 1305 1
+38 1306 1
+38 1307 1
+38 1308 1
+38 1309 1
+38 1310 1
+38 1381 1
+38 1382 1
+38 1383 1
+38 1384 1
+38 1385 1
+38 1386 1
+38 1387 1
+38 1388 1
+38 1389 1
+38 1390 1
+38 1391 1
+38 1392 1
+38 1393 1
+38 1394 1
+38 1395 1
+38 1396 1
+38 1397 1
+38 1398 1
+38 1399 1
+38 1400 1
+38 1401 1
+38 1402 1
+38 1403 1
+38 1404 1
+38 1405 1
+38 1406 1
+38 1407 1
+38 1408 1
+38 1409 1
+38 1410 1
+38 1411 1
+38 1412 1
+38 1413 1
+38 1414 1
+38 1415 1
+38 1416 1
+38 1417 1
+38 1418 1
+38 1419 1
+38 1420 1
+38 1421 1
+38 1422 1
+38 1423 1
+38 1424 1
+38 1425 1
+38 1426 1
+38 1427 1
+38 1428 1
+38 1429 1
+38 1430 1
+38 1431 1
+38 1432 1
+38 1433 1
+38 1434 1
+38 1435 1
+38 1436 1
+38 1437 1
+38 1438 1
+38 1439 1
+38 1440 1
+38 1441 1
+38 1442 1
+38 1443 1
+38 1444 1
+38 1445 1
+38 1446 1
+38 1447 1
+38 1448 1
+38 1449 1
+38 1450 1
+38 1717 1
+38 1718 1
+38 1719 1
+38 1720 1
+38 1721 1
+38 1722 1
+38 1723 1
+38 1724 1
+38 1725 1
+38 1726 1
+38 1727 1
+38 1728 1
+38 1729 1
+38 1730 1
+38 1731 1
+38 1732 1
+38 1733 1
+38 1734 1
+38 1735 1
+38 1736 1
+38 1737 1
+38 1738 1
+38 1739 1
+38 1740 1
+38 1741 1
+38 1742 1
+38 1743 1
+38 1744 1
+38 1801 1
+38 1802 1
+38 1803 1
+38 1804 1
+38 1805 1
+38 1806 1
+38 1807 1
+38 1808 1
+38 1809 1
+38 1810 1
+38 1811 1
+38 1812 1
+38 1813 1
+38 1814 1
+38 1815 1
+38 1816 1
+38 1817 1
+38 1818 1
+38 1819 1
+38 1820 1
+38 1821 1
+38 1822 1
+38 1823 1
+38 1824 1
+38 1825 1
+38 1826 1
+38 1827 1
+38 1828 1
+38 1829 1
+38 1830 1
+38 1831 1
+38 1832 1
+38 1833 1
+38 1834 1
+38 1835 1
+38 1836 1
+38 1837 1
+38 1838 1
+38 1839 1
+38 1840 1
+38 1841 1
+38 1842 1
+38 1843 1
+38 1844 1
+38 1845 1
+38 1846 1
+38 1847 1
+38 1848 1
+38 1849 1
+38 1850 1
+38 1851 1
+38 1852 1
+38 1853 1
+38 1854 1
+38 1855 1
+38 1856 1
+38 2179 1
+38 2180 1
+38 2181 1
+38 2182 1
+38 2183 1
+38 2184 1
+38 2185 1
+38 2186 1
+38 2187 1
+38 2188 1
+38 2189 1
+38 2190 1
+38 2191 1
+38 2192 1
+38 2193 1
+38 2194 1
+38 2195 1
+38 2196 1
+38 2197 1
+38 2198 1
+38 2199 1
+38 2200 1
+38 2201 1
+38 2202 1
+38 2203 1
+38 2204 1
+38 2205 1
+38 2206 1
+38 2207 1
+38 2208 1
+38 2209 1
+38 2210 1
+38 2211 1
+38 2212 1
+38 2213 1
+38 2214 1
+38 2215 1
+38 2216 1
+38 2217 1
+38 2218 1
+38 2219 1
+38 2220 1
+38 2221 1
+38 2222 1
+38 2223 1
+38 2224 1
+38 2225 1
+38 2226 1
+38 2227 1
+38 2228 1
+38 2229 1
+38 2230 1
+38 2231 1
+38 2232 1
+38 2233 1
+38 2234 1
+38 2305 1
+38 2306 1
+38 2307 1
+38 2308 1
+38 2309 1
+38 2310 1
+38 2311 1
+38 2312 1
+38 2313 1
+38 2314 1
+38 2315 1
+38 2316 1
+38 2317 1
+38 2318 1
+38 2319 1
+38 2320 1
+38 2321 1
+38 2322 1
+38 2323 1
+38 2324 1
+38 2325 1
+38 2326 1
+38 2327 1
+38 2328 1
+38 2329 1
+38 2330 1
+38 2331 1
+38 2332 1
+38 2333 1
+38 2334 1
+38 2335 1
+38 2336 1
+38 2337 1
+38 2338 1
+38 2339 1
+38 2340 1
+38 2341 1
+38 2342 1
+38 2343 1
+38 2344 1
+38 2345 1
+38 2346 1
+38 2347 1
+38 2348 1
+38 2349 1
+38 2350 1
+38 2351 1
+38 2352 1
+38 2353 1
+38 2354 1
+38 2355 1
+38 2356 1
+38 2357 1
+38 2358 1
+38 2359 1
+38 2360 1
+38 2361 1
+38 2362 1
+38 2363 1
+38 2364 1
+38 2365 1
+38 2366 1
+38 2367 1
+38 2368 1
+38 2369 1
+38 2370 1
+38 2371 1
+38 2372 1
+38 2373 1
+38 2374 1
+38 2641 1
+38 2642 1
+38 2643 1
+38 2644 1
+38 2645 1
+38 2646 1
+38 2647 1
+38 2648 1
+38 2649 1
+38 2650 1
+38 2651 1
+38 2652 1
+38 2653 1
+38 2654 1
+38 2655 1
+38 2656 1
+38 2657 1
+38 2658 1
+38 2659 1
+38 2660 1
+38 2661 1
+38 2662 1
+38 2663 1
+38 2664 1
+38 2665 1
+38 2666 1
+38 2667 1
+38 2668 1
+38 2669 1
+38 2670 1
+38 2671 1
+38 2672 1
+38 2673 1
+38 2674 1
+38 2675 1
+38 2676 1
+38 2677 1
+38 2678 1
+38 2679 1
+38 2680 1
+38 2681 1
+38 2682 1
+38 2683 1
+38 2684 1
+38 2685 1
+38 2686 1
+38 2687 1
+38 2688 1
+38 2689 1
+38 2690 1
+38 2691 1
+38 2692 1
+38 2693 1
+38 2694 1
+38 2695 1
+38 2696 1
+38 2767 1
+38 2768 1
+38 2769 1
+38 2770 1
+38 2771 1
+38 2772 1
+38 2773 1
+38 2774 1
+38 2775 1
+38 2776 1
+38 2777 1
+38 2778 1
+38 2779 1
+38 2780 1
+38 2781 1
+38 2782 1
+38 2783 1
+38 2784 1
+38 2785 1
+38 2786 1
+38 2787 1
+38 2788 1
+38 2789 1
+38 2790 1
+38 2791 1
+38 2792 1
+38 2793 1
+38 2794 1
+38 2795 1
+38 2796 1
+38 2797 1
+38 2798 1
+38 2799 1
+38 2800 1
+38 2801 1
+38 2802 1
+38 2803 1
+38 2804 1
+38 2805 1
+38 2806 1
+38 2807 1
+38 2808 1
+38 2809 1
+38 2810 1
+38 2811 1
+38 2812 1
+38 2813 1
+38 2814 1
+38 2815 1
+38 2816 1
+38 2817 1
+38 2818 1
+38 2819 1
+38 2820 1
+38 2821 1
+38 2822 1
+38 2823 1
+38 2824 1
+38 2825 1
+38 2826 1
+38 2827 1
+38 2828 1
+38 2829 1
+38 2830 1
+38 2831 1
+38 2832 1
+38 2833 1
+38 2834 1
+38 2835 1
+38 2836 1
+38 3103 1
+38 3104 1
+38 3105 1
+38 3106 1
+38 3107 1
+38 3108 1
+38 3109 1
+38 3110 1
+38 3111 1
+38 3112 1
+38 3113 1
+38 3114 1
+38 3115 1
+38 3116 1
+38 3117 1
+38 3118 1
+38 3119 1
+38 3120 1
+38 3121 1
+38 3122 1
+38 3123 1
+38 3124 1
+38 3125 1
+38 3126 1
+38 3127 1
+38 3128 1
+38 3129 1
+38 3130 1
+38 3131 1
+38 3132 1
+38 3133 1
+38 3134 1
+38 3135 1
+38 3136 1
+38 3137 1
+38 3138 1
+38 3139 1
+38 3140 1
+38 3141 1
+38 3142 1
+38 3143 1
+38 3144 1
+38 3145 1
+38 3146 1
+38 3147 1
+38 3148 1
+38 3149 1
+38 3150 1
+38 3151 1
+38 3152 1
+38 3153 1
+38 3154 1
+38 3155 1
+38 3156 1
+38 3157 1
+38 3158 1
+38 3159 1
+38 3160 1
+38 3161 1
+38 3162 1
+38 3163 1
+38 3164 1
+38 3165 1
+38 3166 1
+38 3167 1
+38 3168 1
+38 3169 1
+38 3170 1
+38 3171 1
+38 3172 1
+38 3229 1
+38 3230 1
+38 3231 1
+38 3232 1
+38 3233 1
+38 3234 1
+38 3235 1
+38 3236 1
+38 3237 1
+38 3238 1
+38 3239 1
+38 3240 1
+38 3241 1
+38 3242 1
+38 3243 1
+38 3244 1
+38 3245 1
+38 3246 1
+38 3247 1
+38 3248 1
+38 3249 1
+38 3250 1
+38 3251 1
+38 3252 1
+38 3253 1
+38 3254 1
+38 3255 1
+38 3256 1
+38 3257 1
+38 3258 1
+38 3259 1
+38 3260 1
+38 3261 1
+38 3262 1
+38 3263 1
+38 3264 1
+38 3265 1
+38 3266 1
+38 3267 1
+38 3268 1
+38 3269 1
+38 3270 1
+38 3271 1
+38 3272 1
+38 3273 1
+38 3274 1
+38 3275 1
+38 3276 1
+38 3277 1
+38 3278 1
+38 3279 1
+38 3280 1
+38 3281 1
+38 3282 1
+38 3283 1
+38 3284 1
+39 1 1
+39 9 1
+39 10 1
+39 11 1
+39 12 1
+39 13 1
+39 14 1
+39 15 1
+39 37 1
+39 38 1
+39 39 1
+39 40 1
+39 41 1
+39 42 1
+39 43 1
+39 65 1
+39 66 1
+39 67 1
+39 68 1
+39 69 1
+39 70 1
+39 71 1
+39 72 1
+39 73 1
+39 74 1
+39 75 1
+39 76 1
+39 77 1
+39 78 1
+39 79 1
+39 80 1
+39 81 1
+39 82 1
+39 83 1
+39 84 1
+39 85 1
+39 331 1
+39 332 1
+39 333 1
+39 334 1
+39 335 1
+39 336 1
+39 337 1
+39 359 1
+39 360 1
+39 361 1
+39 362 1
+39 363 1
+39 364 1
+39 365 1
+39 366 1
+39 367 1
+39 368 1
+39 369 1
+39 370 1
+39 371 1
+39 372 1
+39 373 1
+39 374 1
+39 375 1
+39 376 1
+39 377 1
+39 378 1
+39 379 1
+39 415 1
+39 416 1
+39 417 1
+39 418 1
+39 419 1
+39 420 1
+39 421 1
+39 422 1
+39 423 1
+39 424 1
+39 425 1
+39 426 1
+39 427 1
+39 428 1
+39 429 1
+39 430 1
+39 431 1
+39 432 1
+39 433 1
+39 434 1
+39 435 1
+39 471 1
+39 472 1
+39 473 1
+39 474 1
+39 475 1
+39 476 1
+39 477 1
+39 478 1
+39 479 1
+39 480 1
+39 481 1
+39 482 1
+39 483 1
+39 484 1
+39 485 1
+39 486 1
+39 487 1
+39 488 1
+39 489 1
+39 490 1
+39 491 1
+39 492 1
+39 493 1
+39 494 1
+39 495 1
+39 496 1
+39 497 1
+39 498 1
+39 499 1
+39 500 1
+39 501 1
+39 502 1
+39 503 1
+39 504 1
+39 505 1
+39 793 1
+39 794 1
+39 795 1
+39 796 1
+39 797 1
+39 798 1
+39 799 1
+39 821 1
+39 822 1
+39 823 1
+39 824 1
+39 825 1
+39 826 1
+39 827 1
+39 828 1
+39 829 1
+39 830 1
+39 831 1
+39 832 1
+39 833 1
+39 834 1
+39 835 1
+39 836 1
+39 837 1
+39 838 1
+39 839 1
+39 840 1
+39 841 1
+39 877 1
+39 878 1
+39 879 1
+39 880 1
+39 881 1
+39 882 1
+39 883 1
+39 884 1
+39 885 1
+39 886 1
+39 887 1
+39 888 1
+39 889 1
+39 890 1
+39 891 1
+39 892 1
+39 893 1
+39 894 1
+39 895 1
+39 896 1
+39 897 1
+39 933 1
+39 934 1
+39 935 1
+39 936 1
+39 937 1
+39 938 1
+39 939 1
+39 940 1
+39 941 1
+39 942 1
+39 943 1
+39 944 1
+39 945 1
+39 946 1
+39 947 1
+39 948 1
+39 949 1
+39 950 1
+39 951 1
+39 952 1
+39 953 1
+39 954 1
+39 955 1
+39 956 1
+39 957 1
+39 958 1
+39 959 1
+39 960 1
+39 961 1
+39 962 1
+39 963 1
+39 964 1
+39 965 1
+39 966 1
+39 967 1
+39 1255 1
+39 1256 1
+39 1257 1
+39 1258 1
+39 1259 1
+39 1260 1
+39 1261 1
+39 1262 1
+39 1263 1
+39 1264 1
+39 1265 1
+39 1266 1
+39 1267 1
+39 1268 1
+39 1269 1
+39 1270 1
+39 1271 1
+39 1272 1
+39 1273 1
+39 1274 1
+39 1275 1
+39 1311 1
+39 1312 1
+39 1313 1
+39 1314 1
+39 1315 1
+39 1316 1
+39 1317 1
+39 1318 1
+39 1319 1
+39 1320 1
+39 1321 1
+39 1322 1
+39 1323 1
+39 1324 1
+39 1325 1
+39 1326 1
+39 1327 1
+39 1328 1
+39 1329 1
+39 1330 1
+39 1331 1
+39 1332 1
+39 1333 1
+39 1334 1
+39 1335 1
+39 1336 1
+39 1337 1
+39 1338 1
+39 1339 1
+39 1340 1
+39 1341 1
+39 1342 1
+39 1343 1
+39 1344 1
+39 1345 1
+39 1381 1
+39 1382 1
+39 1383 1
+39 1384 1
+39 1385 1
+39 1386 1
+39 1387 1
+39 1388 1
+39 1389 1
+39 1390 1
+39 1391 1
+39 1392 1
+39 1393 1
+39 1394 1
+39 1395 1
+39 1396 1
+39 1397 1
+39 1398 1
+39 1399 1
+39 1400 1
+39 1401 1
+39 1402 1
+39 1403 1
+39 1404 1
+39 1405 1
+39 1406 1
+39 1407 1
+39 1408 1
+39 1409 1
+39 1410 1
+39 1411 1
+39 1412 1
+39 1413 1
+39 1414 1
+39 1415 1
+39 1451 1
+39 1452 1
+39 1453 1
+39 1454 1
+39 1455 1
+39 1456 1
+39 1457 1
+39 1458 1
+39 1459 1
+39 1460 1
+39 1461 1
+39 1462 1
+39 1463 1
+39 1464 1
+39 1465 1
+39 1466 1
+39 1467 1
+39 1468 1
+39 1469 1
+39 1470 1
+39 1471 1
+39 1472 1
+39 1473 1
+39 1474 1
+39 1475 1
+39 1476 1
+39 1477 1
+39 1478 1
+39 1479 1
+39 1480 1
+39 1481 1
+39 1482 1
+39 1483 1
+39 1484 1
+39 1485 1
+39 1717 1
+39 1718 1
+39 1719 1
+39 1720 1
+39 1721 1
+39 1722 1
+39 1723 1
+39 1745 1
+39 1746 1
+39 1747 1
+39 1748 1
+39 1749 1
+39 1750 1
+39 1751 1
+39 1752 1
+39 1753 1
+39 1754 1
+39 1755 1
+39 1756 1
+39 1757 1
+39 1758 1
+39 1759 1
+39 1760 1
+39 1761 1
+39 1762 1
+39 1763 1
+39 1764 1
+39 1765 1
+39 1801 1
+39 1802 1
+39 1803 1
+39 1804 1
+39 1805 1
+39 1806 1
+39 1807 1
+39 1808 1
+39 1809 1
+39 1810 1
+39 1811 1
+39 1812 1
+39 1813 1
+39 1814 1
+39 1815 1
+39 1816 1
+39 1817 1
+39 1818 1
+39 1819 1
+39 1820 1
+39 1821 1
+39 1857 1
+39 1858 1
+39 1859 1
+39 1860 1
+39 1861 1
+39 1862 1
+39 1863 1
+39 1864 1
+39 1865 1
+39 1866 1
+39 1867 1
+39 1868 1
+39 1869 1
+39 1870 1
+39 1871 1
+39 1872 1
+39 1873 1
+39 1874 1
+39 1875 1
+39 1876 1
+39 1877 1
+39 1878 1
+39 1879 1
+39 1880 1
+39 1881 1
+39 1882 1
+39 1883 1
+39 1884 1
+39 1885 1
+39 1886 1
+39 1887 1
+39 1888 1
+39 1889 1
+39 1890 1
+39 1891 1
+39 2179 1
+39 2180 1
+39 2181 1
+39 2182 1
+39 2183 1
+39 2184 1
+39 2185 1
+39 2186 1
+39 2187 1
+39 2188 1
+39 2189 1
+39 2190 1
+39 2191 1
+39 2192 1
+39 2193 1
+39 2194 1
+39 2195 1
+39 2196 1
+39 2197 1
+39 2198 1
+39 2199 1
+39 2235 1
+39 2236 1
+39 2237 1
+39 2238 1
+39 2239 1
+39 2240 1
+39 2241 1
+39 2242 1
+39 2243 1
+39 2244 1
+39 2245 1
+39 2246 1
+39 2247 1
+39 2248 1
+39 2249 1
+39 2250 1
+39 2251 1
+39 2252 1
+39 2253 1
+39 2254 1
+39 2255 1
+39 2256 1
+39 2257 1
+39 2258 1
+39 2259 1
+39 2260 1
+39 2261 1
+39 2262 1
+39 2263 1
+39 2264 1
+39 2265 1
+39 2266 1
+39 2267 1
+39 2268 1
+39 2269 1
+39 2305 1
+39 2306 1
+39 2307 1
+39 2308 1
+39 2309 1
+39 2310 1
+39 2311 1
+39 2312 1
+39 2313 1
+39 2314 1
+39 2315 1
+39 2316 1
+39 2317 1
+39 2318 1
+39 2319 1
+39 2320 1
+39 2321 1
+39 2322 1
+39 2323 1
+39 2324 1
+39 2325 1
+39 2326 1
+39 2327 1
+39 2328 1
+39 2329 1
+39 2330 1
+39 2331 1
+39 2332 1
+39 2333 1
+39 2334 1
+39 2335 1
+39 2336 1
+39 2337 1
+39 2338 1
+39 2339 1
+39 2375 1
+39 2376 1
+39 2377 1
+39 2378 1
+39 2379 1
+39 2380 1
+39 2381 1
+39 2382 1
+39 2383 1
+39 2384 1
+39 2385 1
+39 2386 1
+39 2387 1
+39 2388 1
+39 2389 1
+39 2390 1
+39 2391 1
+39 2392 1
+39 2393 1
+39 2394 1
+39 2395 1
+39 2396 1
+39 2397 1
+39 2398 1
+39 2399 1
+39 2400 1
+39 2401 1
+39 2402 1
+39 2403 1
+39 2404 1
+39 2405 1
+39 2406 1
+39 2407 1
+39 2408 1
+39 2409 1
+39 2641 1
+39 2642 1
+39 2643 1
+39 2644 1
+39 2645 1
+39 2646 1
+39 2647 1
+39 2648 1
+39 2649 1
+39 2650 1
+39 2651 1
+39 2652 1
+39 2653 1
+39 2654 1
+39 2655 1
+39 2656 1
+39 2657 1
+39 2658 1
+39 2659 1
+39 2660 1
+39 2661 1
+39 2697 1
+39 2698 1
+39 2699 1
+39 2700 1
+39 2701 1
+39 2702 1
+39 2703 1
+39 2704 1
+39 2705 1
+39 2706 1
+39 2707 1
+39 2708 1
+39 2709 1
+39 2710 1
+39 2711 1
+39 2712 1
+39 2713 1
+39 2714 1
+39 2715 1
+39 2716 1
+39 2717 1
+39 2718 1
+39 2719 1
+39 2720 1
+39 2721 1
+39 2722 1
+39 2723 1
+39 2724 1
+39 2725 1
+39 2726 1
+39 2727 1
+39 2728 1
+39 2729 1
+39 2730 1
+39 2731 1
+39 2767 1
+39 2768 1
+39 2769 1
+39 2770 1
+39 2771 1
+39 2772 1
+39 2773 1
+39 2774 1
+39 2775 1
+39 2776 1
+39 2777 1
+39 2778 1
+39 2779 1
+39 2780 1
+39 2781 1
+39 2782 1
+39 2783 1
+39 2784 1
+39 2785 1
+39 2786 1
+39 2787 1
+39 2788 1
+39 2789 1
+39 2790 1
+39 2791 1
+39 2792 1
+39 2793 1
+39 2794 1
+39 2795 1
+39 2796 1
+39 2797 1
+39 2798 1
+39 2799 1
+39 2800 1
+39 2801 1
+39 2837 1
+39 2838 1
+39 2839 1
+39 2840 1
+39 2841 1
+39 2842 1
+39 2843 1
+39 2844 1
+39 2845 1
+39 2846 1
+39 2847 1
+39 2848 1
+39 2849 1
+39 2850 1
+39 2851 1
+39 2852 1
+39 2853 1
+39 2854 1
+39 2855 1
+39 2856 1
+39 2857 1
+39 2858 1
+39 2859 1
+39 2860 1
+39 2861 1
+39 2862 1
+39 2863 1
+39 2864 1
+39 2865 1
+39 2866 1
+39 2867 1
+39 2868 1
+39 2869 1
+39 2870 1
+39 2871 1
+39 3103 1
+39 3104 1
+39 3105 1
+39 3106 1
+39 3107 1
+39 3108 1
+39 3109 1
+39 3110 1
+39 3111 1
+39 3112 1
+39 3113 1
+39 3114 1
+39 3115 1
+39 3116 1
+39 3117 1
+39 3118 1
+39 3119 1
+39 3120 1
+39 3121 1
+39 3122 1
+39 3123 1
+39 3124 1
+39 3125 1
+39 3126 1
+39 3127 1
+39 3128 1
+39 3129 1
+39 3130 1
+39 3131 1
+39 3132 1
+39 3133 1
+39 3134 1
+39 3135 1
+39 3136 1
+39 3137 1
+39 3173 1
+39 3174 1
+39 3175 1
+39 3176 1
+39 3177 1
+39 3178 1
+39 3179 1
+39 3180 1
+39 3181 1
+39 3182 1
+39 3183 1
+39 3184 1
+39 3185 1
+39 3186 1
+39 3187 1
+39 3188 1
+39 3189 1
+39 3190 1
+39 3191 1
+39 3192 1
+39 3193 1
+39 3194 1
+39 3195 1
+39 3196 1
+39 3197 1
+39 3198 1
+39 3199 1
+39 3200 1
+39 3201 1
+39 3202 1
+39 3203 1
+39 3204 1
+39 3205 1
+39 3206 1
+39 3207 1
+39 3229 1
+39 3230 1
+39 3231 1
+39 3232 1
+39 3233 1
+39 3234 1
+39 3235 1
+39 3236 1
+39 3237 1
+39 3238 1
+39 3239 1
+39 3240 1
+39 3241 1
+39 3242 1
+39 3243 1
+39 3244 1
+39 3245 1
+39 3246 1
+39 3247 1
+39 3248 1
+39 3249 1
+39 3250 1
+39 3251 1
+39 3252 1
+39 3253 1
+39 3254 1
+39 3255 1
+39 3256 1
+39 3257 1
+39 3258 1
+39 3259 1
+39 3260 1
+39 3261 1
+39 3262 1
+39 3263 1
+39 3285 1
+39 3286 1
+39 3287 1
+39 3288 1
+39 3289 1
+39 3290 1
+39 3291 1
+39 3292 1
+39 3293 1
+39 3294 1
+39 3295 1
+39 3296 1
+39 3297 1
+39 3298 1
+39 3299 1
+39 3300 1
+39 3301 1
+39 3302 1
+39 3303 1
+39 3304 1
+39 3305 1
+40 2 1
+40 9 1
+40 16 1
+40 17 1
+40 18 1
+40 19 1
+40 20 1
+40 21 1
+40 37 1
+40 44 1
+40 45 1
+40 46 1
+40 47 1
+40 48 1
+40 49 1
+40 65 1
+40 66 1
+40 67 1
+40 68 1
+40 69 1
+40 70 1
+40 86 1
+40 87 1
+40 88 1
+40 89 1
+40 90 1
+40 91 1
+40 92 1
+40 93 1
+40 94 1
+40 95 1
+40 96 1
+40 97 1
+40 98 1
+40 99 1
+40 100 1
+40 331 1
+40 338 1
+40 339 1
+40 340 1
+40 341 1
+40 342 1
+40 343 1
+40 359 1
+40 360 1
+40 361 1
+40 362 1
+40 363 1
+40 364 1
+40 380 1
+40 381 1
+40 382 1
+40 383 1
+40 384 1
+40 385 1
+40 386 1
+40 387 1
+40 388 1
+40 389 1
+40 390 1
+40 391 1
+40 392 1
+40 393 1
+40 394 1
+40 415 1
+40 416 1
+40 417 1
+40 418 1
+40 419 1
+40 420 1
+40 436 1
+40 437 1
+40 438 1
+40 439 1
+40 440 1
+40 441 1
+40 442 1
+40 443 1
+40 444 1
+40 445 1
+40 446 1
+40 447 1
+40 448 1
+40 449 1
+40 450 1
+40 471 1
+40 472 1
+40 473 1
+40 474 1
+40 475 1
+40 476 1
+40 477 1
+40 478 1
+40 479 1
+40 480 1
+40 481 1
+40 482 1
+40 483 1
+40 484 1
+40 485 1
+40 506 1
+40 507 1
+40 508 1
+40 509 1
+40 510 1
+40 511 1
+40 512 1
+40 513 1
+40 514 1
+40 515 1
+40 516 1
+40 517 1
+40 518 1
+40 519 1
+40 520 1
+40 521 1
+40 522 1
+40 523 1
+40 524 1
+40 525 1
+40 793 1
+40 800 1
+40 801 1
+40 802 1
+40 803 1
+40 804 1
+40 805 1
+40 821 1
+40 822 1
+40 823 1
+40 824 1
+40 825 1
+40 826 1
+40 842 1
+40 843 1
+40 844 1
+40 845 1
+40 846 1
+40 847 1
+40 848 1
+40 849 1
+40 850 1
+40 851 1
+40 852 1
+40 853 1
+40 854 1
+40 855 1
+40 856 1
+40 877 1
+40 878 1
+40 879 1
+40 880 1
+40 881 1
+40 882 1
+40 898 1
+40 899 1
+40 900 1
+40 901 1
+40 902 1
+40 903 1
+40 904 1
+40 905 1
+40 906 1
+40 907 1
+40 908 1
+40 909 1
+40 910 1
+40 911 1
+40 912 1
+40 933 1
+40 934 1
+40 935 1
+40 936 1
+40 937 1
+40 938 1
+40 939 1
+40 940 1
+40 941 1
+40 942 1
+40 943 1
+40 944 1
+40 945 1
+40 946 1
+40 947 1
+40 968 1
+40 969 1
+40 970 1
+40 971 1
+40 972 1
+40 973 1
+40 974 1
+40 975 1
+40 976 1
+40 977 1
+40 978 1
+40 979 1
+40 980 1
+40 981 1
+40 982 1
+40 983 1
+40 984 1
+40 985 1
+40 986 1
+40 987 1
+40 1255 1
+40 1256 1
+40 1257 1
+40 1258 1
+40 1259 1
+40 1260 1
+40 1276 1
+40 1277 1
+40 1278 1
+40 1279 1
+40 1280 1
+40 1281 1
+40 1282 1
+40 1283 1
+40 1284 1
+40 1285 1
+40 1286 1
+40 1287 1
+40 1288 1
+40 1289 1
+40 1290 1
+40 1311 1
+40 1312 1
+40 1313 1
+40 1314 1
+40 1315 1
+40 1316 1
+40 1317 1
+40 1318 1
+40 1319 1
+40 1320 1
+40 1321 1
+40 1322 1
+40 1323 1
+40 1324 1
+40 1325 1
+40 1346 1
+40 1347 1
+40 1348 1
+40 1349 1
+40 1350 1
+40 1351 1
+40 1352 1
+40 1353 1
+40 1354 1
+40 1355 1
+40 1356 1
+40 1357 1
+40 1358 1
+40 1359 1
+40 1360 1
+40 1361 1
+40 1362 1
+40 1363 1
+40 1364 1
+40 1365 1
+40 1381 1
+40 1382 1
+40 1383 1
+40 1384 1
+40 1385 1
+40 1386 1
+40 1387 1
+40 1388 1
+40 1389 1
+40 1390 1
+40 1391 1
+40 1392 1
+40 1393 1
+40 1394 1
+40 1395 1
+40 1416 1
+40 1417 1
+40 1418 1
+40 1419 1
+40 1420 1
+40 1421 1
+40 1422 1
+40 1423 1
+40 1424 1
+40 1425 1
+40 1426 1
+40 1427 1
+40 1428 1
+40 1429 1
+40 1430 1
+40 1431 1
+40 1432 1
+40 1433 1
+40 1434 1
+40 1435 1
+40 1451 1
+40 1452 1
+40 1453 1
+40 1454 1
+40 1455 1
+40 1456 1
+40 1457 1
+40 1458 1
+40 1459 1
+40 1460 1
+40 1461 1
+40 1462 1
+40 1463 1
+40 1464 1
+40 1465 1
+40 1466 1
+40 1467 1
+40 1468 1
+40 1469 1
+40 1470 1
+40 1486 1
+40 1487 1
+40 1488 1
+40 1489 1
+40 1490 1
+40 1491 1
+40 1492 1
+40 1493 1
+40 1494 1
+40 1495 1
+40 1496 1
+40 1497 1
+40 1498 1
+40 1499 1
+40 1500 1
+40 1717 1
+40 1724 1
+40 1725 1
+40 1726 1
+40 1727 1
+40 1728 1
+40 1729 1
+40 1745 1
+40 1746 1
+40 1747 1
+40 1748 1
+40 1749 1
+40 1750 1
+40 1766 1
+40 1767 1
+40 1768 1
+40 1769 1
+40 1770 1
+40 1771 1
+40 1772 1
+40 1773 1
+40 1774 1
+40 1775 1
+40 1776 1
+40 1777 1
+40 1778 1
+40 1779 1
+40 1780 1
+40 1801 1
+40 1802 1
+40 1803 1
+40 1804 1
+40 1805 1
+40 1806 1
+40 1822 1
+40 1823 1
+40 1824 1
+40 1825 1
+40 1826 1
+40 1827 1
+40 1828 1
+40 1829 1
+40 1830 1
+40 1831 1
+40 1832 1
+40 1833 1
+40 1834 1
+40 1835 1
+40 1836 1
+40 1857 1
+40 1858 1
+40 1859 1
+40 1860 1
+40 1861 1
+40 1862 1
+40 1863 1
+40 1864 1
+40 1865 1
+40 1866 1
+40 1867 1
+40 1868 1
+40 1869 1
+40 1870 1
+40 1871 1
+40 1892 1
+40 1893 1
+40 1894 1
+40 1895 1
+40 1896 1
+40 1897 1
+40 1898 1
+40 1899 1
+40 1900 1
+40 1901 1
+40 1902 1
+40 1903 1
+40 1904 1
+40 1905 1
+40 1906 1
+40 1907 1
+40 1908 1
+40 1909 1
+40 1910 1
+40 1911 1
+40 2179 1
+40 2180 1
+40 2181 1
+40 2182 1
+40 2183 1
+40 2184 1
+40 2200 1
+40 2201 1
+40 2202 1
+40 2203 1
+40 2204 1
+40 2205 1
+40 2206 1
+40 2207 1
+40 2208 1
+40 2209 1
+40 2210 1
+40 2211 1
+40 2212 1
+40 2213 1
+40 2214 1
+40 2235 1
+40 2236 1
+40 2237 1
+40 2238 1
+40 2239 1
+40 2240 1
+40 2241 1
+40 2242 1
+40 2243 1
+40 2244 1
+40 2245 1
+40 2246 1
+40 2247 1
+40 2248 1
+40 2249 1
+40 2270 1
+40 2271 1
+40 2272 1
+40 2273 1
+40 2274 1
+40 2275 1
+40 2276 1
+40 2277 1
+40 2278 1
+40 2279 1
+40 2280 1
+40 2281 1
+40 2282 1
+40 2283 1
+40 2284 1
+40 2285 1
+40 2286 1
+40 2287 1
+40 2288 1
+40 2289 1
+40 2305 1
+40 2306 1
+40 2307 1
+40 2308 1
+40 2309 1
+40 2310 1
+40 2311 1
+40 2312 1
+40 2313 1
+40 2314 1
+40 2315 1
+40 2316 1
+40 2317 1
+40 2318 1
+40 2319 1
+40 2340 1
+40 2341 1
+40 2342 1
+40 2343 1
+40 2344 1
+40 2345 1
+40 2346 1
+40 2347 1
+40 2348 1
+40 2349 1
+40 2350 1
+40 2351 1
+40 2352 1
+40 2353 1
+40 2354 1
+40 2355 1
+40 2356 1
+40 2357 1
+40 2358 1
+40 2359 1
+40 2375 1
+40 2376 1
+40 2377 1
+40 2378 1
+40 2379 1
+40 2380 1
+40 2381 1
+40 2382 1
+40 2383 1
+40 2384 1
+40 2385 1
+40 2386 1
+40 2387 1
+40 2388 1
+40 2389 1
+40 2390 1
+40 2391 1
+40 2392 1
+40 2393 1
+40 2394 1
+40 2410 1
+40 2411 1
+40 2412 1
+40 2413 1
+40 2414 1
+40 2415 1
+40 2416 1
+40 2417 1
+40 2418 1
+40 2419 1
+40 2420 1
+40 2421 1
+40 2422 1
+40 2423 1
+40 2424 1
+40 2641 1
+40 2642 1
+40 2643 1
+40 2644 1
+40 2645 1
+40 2646 1
+40 2662 1
+40 2663 1
+40 2664 1
+40 2665 1
+40 2666 1
+40 2667 1
+40 2668 1
+40 2669 1
+40 2670 1
+40 2671 1
+40 2672 1
+40 2673 1
+40 2674 1
+40 2675 1
+40 2676 1
+40 2697 1
+40 2698 1
+40 2699 1
+40 2700 1
+40 2701 1
+40 2702 1
+40 2703 1
+40 2704 1
+40 2705 1
+40 2706 1
+40 2707 1
+40 2708 1
+40 2709 1
+40 2710 1
+40 2711 1
+40 2732 1
+40 2733 1
+40 2734 1
+40 2735 1
+40 2736 1
+40 2737 1
+40 2738 1
+40 2739 1
+40 2740 1
+40 2741 1
+40 2742 1
+40 2743 1
+40 2744 1
+40 2745 1
+40 2746 1
+40 2747 1
+40 2748 1
+40 2749 1
+40 2750 1
+40 2751 1
+40 2767 1
+40 2768 1
+40 2769 1
+40 2770 1
+40 2771 1
+40 2772 1
+40 2773 1
+40 2774 1
+40 2775 1
+40 2776 1
+40 2777 1
+40 2778 1
+40 2779 1
+40 2780 1
+40 2781 1
+40 2802 1
+40 2803 1
+40 2804 1
+40 2805 1
+40 2806 1
+40 2807 1
+40 2808 1
+40 2809 1
+40 2810 1
+40 2811 1
+40 2812 1
+40 2813 1
+40 2814 1
+40 2815 1
+40 2816 1
+40 2817 1
+40 2818 1
+40 2819 1
+40 2820 1
+40 2821 1
+40 2837 1
+40 2838 1
+40 2839 1
+40 2840 1
+40 2841 1
+40 2842 1
+40 2843 1
+40 2844 1
+40 2845 1
+40 2846 1
+40 2847 1
+40 2848 1
+40 2849 1
+40 2850 1
+40 2851 1
+40 2852 1
+40 2853 1
+40 2854 1
+40 2855 1
+40 2856 1
+40 2872 1
+40 2873 1
+40 2874 1
+40 2875 1
+40 2876 1
+40 2877 1
+40 2878 1
+40 2879 1
+40 2880 1
+40 2881 1
+40 2882 1
+40 2883 1
+40 2884 1
+40 2885 1
+40 2886 1
+40 3103 1
+40 3104 1
+40 3105 1
+40 3106 1
+40 3107 1
+40 3108 1
+40 3109 1
+40 3110 1
+40 3111 1
+40 3112 1
+40 3113 1
+40 3114 1
+40 3115 1
+40 3116 1
+40 3117 1
+40 3138 1
+40 3139 1
+40 3140 1
+40 3141 1
+40 3142 1
+40 3143 1
+40 3144 1
+40 3145 1
+40 3146 1
+40 3147 1
+40 3148 1
+40 3149 1
+40 3150 1
+40 3151 1
+40 3152 1
+40 3153 1
+40 3154 1
+40 3155 1
+40 3156 1
+40 3157 1
+40 3173 1
+40 3174 1
+40 3175 1
+40 3176 1
+40 3177 1
+40 3178 1
+40 3179 1
+40 3180 1
+40 3181 1
+40 3182 1
+40 3183 1
+40 3184 1
+40 3185 1
+40 3186 1
+40 3187 1
+40 3188 1
+40 3189 1
+40 3190 1
+40 3191 1
+40 3192 1
+40 3208 1
+40 3209 1
+40 3210 1
+40 3211 1
+40 3212 1
+40 3213 1
+40 3214 1
+40 3215 1
+40 3216 1
+40 3217 1
+40 3218 1
+40 3219 1
+40 3220 1
+40 3221 1
+40 3222 1
+40 3229 1
+40 3230 1
+40 3231 1
+40 3232 1
+40 3233 1
+40 3234 1
+40 3235 1
+40 3236 1
+40 3237 1
+40 3238 1
+40 3239 1
+40 3240 1
+40 3241 1
+40 3242 1
+40 3243 1
+40 3244 1
+40 3245 1
+40 3246 1
+40 3247 1
+40 3248 1
+40 3264 1
+40 3265 1
+40 3266 1
+40 3267 1
+40 3268 1
+40 3269 1
+40 3270 1
+40 3271 1
+40 3272 1
+40 3273 1
+40 3274 1
+40 3275 1
+40 3276 1
+40 3277 1
+40 3278 1
+40 3285 1
+40 3286 1
+40 3287 1
+40 3288 1
+40 3289 1
+40 3290 1
+40 3291 1
+40 3292 1
+40 3293 1
+40 3294 1
+40 3295 1
+40 3296 1
+40 3297 1
+40 3298 1
+40 3299 1
+40 3306 1
+40 3307 1
+40 3308 1
+40 3309 1
+40 3310 1
+40 3311 1
+41 3 1
+41 10 1
+41 16 1
+41 22 1
+41 23 1
+41 24 1
+41 25 1
+41 26 1
+41 38 1
+41 44 1
+41 50 1
+41 51 1
+41 52 1
+41 53 1
+41 54 1
+41 65 1
+41 71 1
+41 72 1
+41 73 1
+41 74 1
+41 75 1
+41 86 1
+41 87 1
+41 88 1
+41 89 1
+41 90 1
+41 101 1
+41 102 1
+41 103 1
+41 104 1
+41 105 1
+41 106 1
+41 107 1
+41 108 1
+41 109 1
+41 110 1
+41 332 1
+41 338 1
+41 344 1
+41 345 1
+41 346 1
+41 347 1
+41 348 1
+41 359 1
+41 365 1
+41 366 1
+41 367 1
+41 368 1
+41 369 1
+41 380 1
+41 381 1
+41 382 1
+41 383 1
+41 384 1
+41 395 1
+41 396 1
+41 397 1
+41 398 1
+41 399 1
+41 400 1
+41 401 1
+41 402 1
+41 403 1
+41 404 1
+41 415 1
+41 421 1
+41 422 1
+41 423 1
+41 424 1
+41 425 1
+41 436 1
+41 437 1
+41 438 1
+41 439 1
+41 440 1
+41 451 1
+41 452 1
+41 453 1
+41 454 1
+41 455 1
+41 456 1
+41 457 1
+41 458 1
+41 459 1
+41 460 1
+41 471 1
+41 472 1
+41 473 1
+41 474 1
+41 475 1
+41 486 1
+41 487 1
+41 488 1
+41 489 1
+41 490 1
+41 491 1
+41 492 1
+41 493 1
+41 494 1
+41 495 1
+41 506 1
+41 507 1
+41 508 1
+41 509 1
+41 510 1
+41 511 1
+41 512 1
+41 513 1
+41 514 1
+41 515 1
+41 526 1
+41 527 1
+41 528 1
+41 529 1
+41 530 1
+41 531 1
+41 532 1
+41 533 1
+41 534 1
+41 535 1
+41 794 1
+41 800 1
+41 806 1
+41 807 1
+41 808 1
+41 809 1
+41 810 1
+41 821 1
+41 827 1
+41 828 1
+41 829 1
+41 830 1
+41 831 1
+41 842 1
+41 843 1
+41 844 1
+41 845 1
+41 846 1
+41 857 1
+41 858 1
+41 859 1
+41 860 1
+41 861 1
+41 862 1
+41 863 1
+41 864 1
+41 865 1
+41 866 1
+41 877 1
+41 883 1
+41 884 1
+41 885 1
+41 886 1
+41 887 1
+41 898 1
+41 899 1
+41 900 1
+41 901 1
+41 902 1
+41 913 1
+41 914 1
+41 915 1
+41 916 1
+41 917 1
+41 918 1
+41 919 1
+41 920 1
+41 921 1
+41 922 1
+41 933 1
+41 934 1
+41 935 1
+41 936 1
+41 937 1
+41 948 1
+41 949 1
+41 950 1
+41 951 1
+41 952 1
+41 953 1
+41 954 1
+41 955 1
+41 956 1
+41 957 1
+41 968 1
+41 969 1
+41 970 1
+41 971 1
+41 972 1
+41 973 1
+41 974 1
+41 975 1
+41 976 1
+41 977 1
+41 988 1
+41 989 1
+41 990 1
+41 991 1
+41 992 1
+41 993 1
+41 994 1
+41 995 1
+41 996 1
+41 997 1
+41 1255 1
+41 1261 1
+41 1262 1
+41 1263 1
+41 1264 1
+41 1265 1
+41 1276 1
+41 1277 1
+41 1278 1
+41 1279 1
+41 1280 1
+41 1291 1
+41 1292 1
+41 1293 1
+41 1294 1
+41 1295 1
+41 1296 1
+41 1297 1
+41 1298 1
+41 1299 1
+41 1300 1
+41 1311 1
+41 1312 1
+41 1313 1
+41 1314 1
+41 1315 1
+41 1326 1
+41 1327 1
+41 1328 1
+41 1329 1
+41 1330 1
+41 1331 1
+41 1332 1
+41 1333 1
+41 1334 1
+41 1335 1
+41 1346 1
+41 1347 1
+41 1348 1
+41 1349 1
+41 1350 1
+41 1351 1
+41 1352 1
+41 1353 1
+41 1354 1
+41 1355 1
+41 1366 1
+41 1367 1
+41 1368 1
+41 1369 1
+41 1370 1
+41 1371 1
+41 1372 1
+41 1373 1
+41 1374 1
+41 1375 1
+41 1381 1
+41 1382 1
+41 1383 1
+41 1384 1
+41 1385 1
+41 1396 1
+41 1397 1
+41 1398 1
+41 1399 1
+41 1400 1
+41 1401 1
+41 1402 1
+41 1403 1
+41 1404 1
+41 1405 1
+41 1416 1
+41 1417 1
+41 1418 1
+41 1419 1
+41 1420 1
+41 1421 1
+41 1422 1
+41 1423 1
+41 1424 1
+41 1425 1
+41 1436 1
+41 1437 1
+41 1438 1
+41 1439 1
+41 1440 1
+41 1441 1
+41 1442 1
+41 1443 1
+41 1444 1
+41 1445 1
+41 1451 1
+41 1452 1
+41 1453 1
+41 1454 1
+41 1455 1
+41 1456 1
+41 1457 1
+41 1458 1
+41 1459 1
+41 1460 1
+41 1471 1
+41 1472 1
+41 1473 1
+41 1474 1
+41 1475 1
+41 1476 1
+41 1477 1
+41 1478 1
+41 1479 1
+41 1480 1
+41 1486 1
+41 1487 1
+41 1488 1
+41 1489 1
+41 1490 1
+41 1491 1
+41 1492 1
+41 1493 1
+41 1494 1
+41 1495 1
+41 1501 1
+41 1502 1
+41 1503 1
+41 1504 1
+41 1505 1
+41 1718 1
+41 1724 1
+41 1730 1
+41 1731 1
+41 1732 1
+41 1733 1
+41 1734 1
+41 1745 1
+41 1751 1
+41 1752 1
+41 1753 1
+41 1754 1
+41 1755 1
+41 1766 1
+41 1767 1
+41 1768 1
+41 1769 1
+41 1770 1
+41 1781 1
+41 1782 1
+41 1783 1
+41 1784 1
+41 1785 1
+41 1786 1
+41 1787 1
+41 1788 1
+41 1789 1
+41 1790 1
+41 1801 1
+41 1807 1
+41 1808 1
+41 1809 1
+41 1810 1
+41 1811 1
+41 1822 1
+41 1823 1
+41 1824 1
+41 1825 1
+41 1826 1
+41 1837 1
+41 1838 1
+41 1839 1
+41 1840 1
+41 1841 1
+41 1842 1
+41 1843 1
+41 1844 1
+41 1845 1
+41 1846 1
+41 1857 1
+41 1858 1
+41 1859 1
+41 1860 1
+41 1861 1
+41 1872 1
+41 1873 1
+41 1874 1
+41 1875 1
+41 1876 1
+41 1877 1
+41 1878 1
+41 1879 1
+41 1880 1
+41 1881 1
+41 1892 1
+41 1893 1
+41 1894 1
+41 1895 1
+41 1896 1
+41 1897 1
+41 1898 1
+41 1899 1
+41 1900 1
+41 1901 1
+41 1912 1
+41 1913 1
+41 1914 1
+41 1915 1
+41 1916 1
+41 1917 1
+41 1918 1
+41 1919 1
+41 1920 1
+41 1921 1
+41 2179 1
+41 2185 1
+41 2186 1
+41 2187 1
+41 2188 1
+41 2189 1
+41 2200 1
+41 2201 1
+41 2202 1
+41 2203 1
+41 2204 1
+41 2215 1
+41 2216 1
+41 2217 1
+41 2218 1
+41 2219 1
+41 2220 1
+41 2221 1
+41 2222 1
+41 2223 1
+41 2224 1
+41 2235 1
+41 2236 1
+41 2237 1
+41 2238 1
+41 2239 1
+41 2250 1
+41 2251 1
+41 2252 1
+41 2253 1
+41 2254 1
+41 2255 1
+41 2256 1
+41 2257 1
+41 2258 1
+41 2259 1
+41 2270 1
+41 2271 1
+41 2272 1
+41 2273 1
+41 2274 1
+41 2275 1
+41 2276 1
+41 2277 1
+41 2278 1
+41 2279 1
+41 2290 1
+41 2291 1
+41 2292 1
+41 2293 1
+41 2294 1
+41 2295 1
+41 2296 1
+41 2297 1
+41 2298 1
+41 2299 1
+41 2305 1
+41 2306 1
+41 2307 1
+41 2308 1
+41 2309 1
+41 2320 1
+41 2321 1
+41 2322 1
+41 2323 1
+41 2324 1
+41 2325 1
+41 2326 1
+41 2327 1
+41 2328 1
+41 2329 1
+41 2340 1
+41 2341 1
+41 2342 1
+41 2343 1
+41 2344 1
+41 2345 1
+41 2346 1
+41 2347 1
+41 2348 1
+41 2349 1
+41 2360 1
+41 2361 1
+41 2362 1
+41 2363 1
+41 2364 1
+41 2365 1
+41 2366 1
+41 2367 1
+41 2368 1
+41 2369 1
+41 2375 1
+41 2376 1
+41 2377 1
+41 2378 1
+41 2379 1
+41 2380 1
+41 2381 1
+41 2382 1
+41 2383 1
+41 2384 1
+41 2395 1
+41 2396 1
+41 2397 1
+41 2398 1
+41 2399 1
+41 2400 1
+41 2401 1
+41 2402 1
+41 2403 1
+41 2404 1
+41 2410 1
+41 2411 1
+41 2412 1
+41 2413 1
+41 2414 1
+41 2415 1
+41 2416 1
+41 2417 1
+41 2418 1
+41 2419 1
+41 2425 1
+41 2426 1
+41 2427 1
+41 2428 1
+41 2429 1
+41 2641 1
+41 2647 1
+41 2648 1
+41 2649 1
+41 2650 1
+41 2651 1
+41 2662 1
+41 2663 1
+41 2664 1
+41 2665 1
+41 2666 1
+41 2677 1
+41 2678 1
+41 2679 1
+41 2680 1
+41 2681 1
+41 2682 1
+41 2683 1
+41 2684 1
+41 2685 1
+41 2686 1
+41 2697 1
+41 2698 1
+41 2699 1
+41 2700 1
+41 2701 1
+41 2712 1
+41 2713 1
+41 2714 1
+41 2715 1
+41 2716 1
+41 2717 1
+41 2718 1
+41 2719 1
+41 2720 1
+41 2721 1
+41 2732 1
+41 2733 1
+41 2734 1
+41 2735 1
+41 2736 1
+41 2737 1
+41 2738 1
+41 2739 1
+41 2740 1
+41 2741 1
+41 2752 1
+41 2753 1
+41 2754 1
+41 2755 1
+41 2756 1
+41 2757 1
+41 2758 1
+41 2759 1
+41 2760 1
+41 2761 1
+41 2767 1
+41 2768 1
+41 2769 1
+41 2770 1
+41 2771 1
+41 2782 1
+41 2783 1
+41 2784 1
+41 2785 1
+41 2786 1
+41 2787 1
+41 2788 1
+41 2789 1
+41 2790 1
+41 2791 1
+41 2802 1
+41 2803 1
+41 2804 1
+41 2805 1
+41 2806 1
+41 2807 1
+41 2808 1
+41 2809 1
+41 2810 1
+41 2811 1
+41 2822 1
+41 2823 1
+41 2824 1
+41 2825 1
+41 2826 1
+41 2827 1
+41 2828 1
+41 2829 1
+41 2830 1
+41 2831 1
+41 2837 1
+41 2838 1
+41 2839 1
+41 2840 1
+41 2841 1
+41 2842 1
+41 2843 1
+41 2844 1
+41 2845 1
+41 2846 1
+41 2857 1
+41 2858 1
+41 2859 1
+41 2860 1
+41 2861 1
+41 2862 1
+41 2863 1
+41 2864 1
+41 2865 1
+41 2866 1
+41 2872 1
+41 2873 1
+41 2874 1
+41 2875 1
+41 2876 1
+41 2877 1
+41 2878 1
+41 2879 1
+41 2880 1
+41 2881 1
+41 2887 1
+41 2888 1
+41 2889 1
+41 2890 1
+41 2891 1
+41 3103 1
+41 3104 1
+41 3105 1
+41 3106 1
+41 3107 1
+41 3118 1
+41 3119 1
+41 3120 1
+41 3121 1
+41 3122 1
+41 3123 1
+41 3124 1
+41 3125 1
+41 3126 1
+41 3127 1
+41 3138 1
+41 3139 1
+41 3140 1
+41 3141 1
+41 3142 1
+41 3143 1
+41 3144 1
+41 3145 1
+41 3146 1
+41 3147 1
+41 3158 1
+41 3159 1
+41 3160 1
+41 3161 1
+41 3162 1
+41 3163 1
+41 3164 1
+41 3165 1
+41 3166 1
+41 3167 1
+41 3173 1
+41 3174 1
+41 3175 1
+41 3176 1
+41 3177 1
+41 3178 1
+41 3179 1
+41 3180 1
+41 3181 1
+41 3182 1
+41 3193 1
+41 3194 1
+41 3195 1
+41 3196 1
+41 3197 1
+41 3198 1
+41 3199 1
+41 3200 1
+41 3201 1
+41 3202 1
+41 3208 1
+41 3209 1
+41 3210 1
+41 3211 1
+41 3212 1
+41 3213 1
+41 3214 1
+41 3215 1
+41 3216 1
+41 3217 1
+41 3223 1
+41 3224 1
+41 3225 1
+41 3226 1
+41 3227 1
+41 3229 1
+41 3230 1
+41 3231 1
+41 3232 1
+41 3233 1
+41 3234 1
+41 3235 1
+41 3236 1
+41 3237 1
+41 3238 1
+41 3249 1
+41 3250 1
+41 3251 1
+41 3252 1
+41 3253 1
+41 3254 1
+41 3255 1
+41 3256 1
+41 3257 1
+41 3258 1
+41 3264 1
+41 3265 1
+41 3266 1
+41 3267 1
+41 3268 1
+41 3269 1
+41 3270 1
+41 3271 1
+41 3272 1
+41 3273 1
+41 3279 1
+41 3280 1
+41 3281 1
+41 3282 1
+41 3283 1
+41 3285 1
+41 3286 1
+41 3287 1
+41 3288 1
+41 3289 1
+41 3290 1
+41 3291 1
+41 3292 1
+41 3293 1
+41 3294 1
+41 3300 1
+41 3301 1
+41 3302 1
+41 3303 1
+41 3304 1
+41 3306 1
+41 3307 1
+41 3308 1
+41 3309 1
+41 3310 1
+41 3312 1
+42 4 1
+42 11 1
+42 17 1
+42 22 1
+42 27 1
+42 28 1
+42 29 1
+42 30 1
+42 39 1
+42 45 1
+42 50 1
+42 55 1
+42 56 1
+42 57 1
+42 58 1
+42 66 1
+42 71 1
+42 76 1
+42 77 1
+42 78 1
+42 79 1
+42 86 1
+42 91 1
+42 92 1
+42 93 1
+42 94 1
+42 101 1
+42 102 1
+42 103 1
+42 104 1
+42 111 1
+42 112 1
+42 113 1
+42 114 1
+42 115 1
+42 116 1
+42 333 1
+42 339 1
+42 344 1
+42 349 1
+42 350 1
+42 351 1
+42 352 1
+42 360 1
+42 365 1
+42 370 1
+42 371 1
+42 372 1
+42 373 1
+42 380 1
+42 385 1
+42 386 1
+42 387 1
+42 388 1
+42 395 1
+42 396 1
+42 397 1
+42 398 1
+42 405 1
+42 406 1
+42 407 1
+42 408 1
+42 409 1
+42 410 1
+42 416 1
+42 421 1
+42 426 1
+42 427 1
+42 428 1
+42 429 1
+42 436 1
+42 441 1
+42 442 1
+42 443 1
+42 444 1
+42 451 1
+42 452 1
+42 453 1
+42 454 1
+42 461 1
+42 462 1
+42 463 1
+42 464 1
+42 465 1
+42 466 1
+42 471 1
+42 476 1
+42 477 1
+42 478 1
+42 479 1
+42 486 1
+42 487 1
+42 488 1
+42 489 1
+42 496 1
+42 497 1
+42 498 1
+42 499 1
+42 500 1
+42 501 1
+42 506 1
+42 507 1
+42 508 1
+42 509 1
+42 516 1
+42 517 1
+42 518 1
+42 519 1
+42 520 1
+42 521 1
+42 526 1
+42 527 1
+42 528 1
+42 529 1
+42 530 1
+42 531 1
+42 536 1
+42 537 1
+42 538 1
+42 539 1
+42 795 1
+42 801 1
+42 806 1
+42 811 1
+42 812 1
+42 813 1
+42 814 1
+42 822 1
+42 827 1
+42 832 1
+42 833 1
+42 834 1
+42 835 1
+42 842 1
+42 847 1
+42 848 1
+42 849 1
+42 850 1
+42 857 1
+42 858 1
+42 859 1
+42 860 1
+42 867 1
+42 868 1
+42 869 1
+42 870 1
+42 871 1
+42 872 1
+42 878 1
+42 883 1
+42 888 1
+42 889 1
+42 890 1
+42 891 1
+42 898 1
+42 903 1
+42 904 1
+42 905 1
+42 906 1
+42 913 1
+42 914 1
+42 915 1
+42 916 1
+42 923 1
+42 924 1
+42 925 1
+42 926 1
+42 927 1
+42 928 1
+42 933 1
+42 938 1
+42 939 1
+42 940 1
+42 941 1
+42 948 1
+42 949 1
+42 950 1
+42 951 1
+42 958 1
+42 959 1
+42 960 1
+42 961 1
+42 962 1
+42 963 1
+42 968 1
+42 969 1
+42 970 1
+42 971 1
+42 978 1
+42 979 1
+42 980 1
+42 981 1
+42 982 1
+42 983 1
+42 988 1
+42 989 1
+42 990 1
+42 991 1
+42 992 1
+42 993 1
+42 998 1
+42 999 1
+42 1000 1
+42 1001 1
+42 1256 1
+42 1261 1
+42 1266 1
+42 1267 1
+42 1268 1
+42 1269 1
+42 1276 1
+42 1281 1
+42 1282 1
+42 1283 1
+42 1284 1
+42 1291 1
+42 1292 1
+42 1293 1
+42 1294 1
+42 1301 1
+42 1302 1
+42 1303 1
+42 1304 1
+42 1305 1
+42 1306 1
+42 1311 1
+42 1316 1
+42 1317 1
+42 1318 1
+42 1319 1
+42 1326 1
+42 1327 1
+42 1328 1
+42 1329 1
+42 1336 1
+42 1337 1
+42 1338 1
+42 1339 1
+42 1340 1
+42 1341 1
+42 1346 1
+42 1347 1
+42 1348 1
+42 1349 1
+42 1356 1
+42 1357 1
+42 1358 1
+42 1359 1
+42 1360 1
+42 1361 1
+42 1366 1
+42 1367 1
+42 1368 1
+42 1369 1
+42 1370 1
+42 1371 1
+42 1376 1
+42 1377 1
+42 1378 1
+42 1379 1
+42 1381 1
+42 1386 1
+42 1387 1
+42 1388 1
+42 1389 1
+42 1396 1
+42 1397 1
+42 1398 1
+42 1399 1
+42 1406 1
+42 1407 1
+42 1408 1
+42 1409 1
+42 1410 1
+42 1411 1
+42 1416 1
+42 1417 1
+42 1418 1
+42 1419 1
+42 1426 1
+42 1427 1
+42 1428 1
+42 1429 1
+42 1430 1
+42 1431 1
+42 1436 1
+42 1437 1
+42 1438 1
+42 1439 1
+42 1440 1
+42 1441 1
+42 1446 1
+42 1447 1
+42 1448 1
+42 1449 1
+42 1451 1
+42 1452 1
+42 1453 1
+42 1454 1
+42 1461 1
+42 1462 1
+42 1463 1
+42 1464 1
+42 1465 1
+42 1466 1
+42 1471 1
+42 1472 1
+42 1473 1
+42 1474 1
+42 1475 1
+42 1476 1
+42 1481 1
+42 1482 1
+42 1483 1
+42 1484 1
+42 1486 1
+42 1487 1
+42 1488 1
+42 1489 1
+42 1490 1
+42 1491 1
+42 1496 1
+42 1497 1
+42 1498 1
+42 1499 1
+42 1501 1
+42 1502 1
+42 1503 1
+42 1504 1
+42 1506 1
+42 1719 1
+42 1725 1
+42 1730 1
+42 1735 1
+42 1736 1
+42 1737 1
+42 1738 1
+42 1746 1
+42 1751 1
+42 1756 1
+42 1757 1
+42 1758 1
+42 1759 1
+42 1766 1
+42 1771 1
+42 1772 1
+42 1773 1
+42 1774 1
+42 1781 1
+42 1782 1
+42 1783 1
+42 1784 1
+42 1791 1
+42 1792 1
+42 1793 1
+42 1794 1
+42 1795 1
+42 1796 1
+42 1802 1
+42 1807 1
+42 1812 1
+42 1813 1
+42 1814 1
+42 1815 1
+42 1822 1
+42 1827 1
+42 1828 1
+42 1829 1
+42 1830 1
+42 1837 1
+42 1838 1
+42 1839 1
+42 1840 1
+42 1847 1
+42 1848 1
+42 1849 1
+42 1850 1
+42 1851 1
+42 1852 1
+42 1857 1
+42 1862 1
+42 1863 1
+42 1864 1
+42 1865 1
+42 1872 1
+42 1873 1
+42 1874 1
+42 1875 1
+42 1882 1
+42 1883 1
+42 1884 1
+42 1885 1
+42 1886 1
+42 1887 1
+42 1892 1
+42 1893 1
+42 1894 1
+42 1895 1
+42 1902 1
+42 1903 1
+42 1904 1
+42 1905 1
+42 1906 1
+42 1907 1
+42 1912 1
+42 1913 1
+42 1914 1
+42 1915 1
+42 1916 1
+42 1917 1
+42 1922 1
+42 1923 1
+42 1924 1
+42 1925 1
+42 2180 1
+42 2185 1
+42 2190 1
+42 2191 1
+42 2192 1
+42 2193 1
+42 2200 1
+42 2205 1
+42 2206 1
+42 2207 1
+42 2208 1
+42 2215 1
+42 2216 1
+42 2217 1
+42 2218 1
+42 2225 1
+42 2226 1
+42 2227 1
+42 2228 1
+42 2229 1
+42 2230 1
+42 2235 1
+42 2240 1
+42 2241 1
+42 2242 1
+42 2243 1
+42 2250 1
+42 2251 1
+42 2252 1
+42 2253 1
+42 2260 1
+42 2261 1
+42 2262 1
+42 2263 1
+42 2264 1
+42 2265 1
+42 2270 1
+42 2271 1
+42 2272 1
+42 2273 1
+42 2280 1
+42 2281 1
+42 2282 1
+42 2283 1
+42 2284 1
+42 2285 1
+42 2290 1
+42 2291 1
+42 2292 1
+42 2293 1
+42 2294 1
+42 2295 1
+42 2300 1
+42 2301 1
+42 2302 1
+42 2303 1
+42 2305 1
+42 2310 1
+42 2311 1
+42 2312 1
+42 2313 1
+42 2320 1
+42 2321 1
+42 2322 1
+42 2323 1
+42 2330 1
+42 2331 1
+42 2332 1
+42 2333 1
+42 2334 1
+42 2335 1
+42 2340 1
+42 2341 1
+42 2342 1
+42 2343 1
+42 2350 1
+42 2351 1
+42 2352 1
+42 2353 1
+42 2354 1
+42 2355 1
+42 2360 1
+42 2361 1
+42 2362 1
+42 2363 1
+42 2364 1
+42 2365 1
+42 2370 1
+42 2371 1
+42 2372 1
+42 2373 1
+42 2375 1
+42 2376 1
+42 2377 1
+42 2378 1
+42 2385 1
+42 2386 1
+42 2387 1
+42 2388 1
+42 2389 1
+42 2390 1
+42 2395 1
+42 2396 1
+42 2397 1
+42 2398 1
+42 2399 1
+42 2400 1
+42 2405 1
+42 2406 1
+42 2407 1
+42 2408 1
+42 2410 1
+42 2411 1
+42 2412 1
+42 2413 1
+42 2414 1
+42 2415 1
+42 2420 1
+42 2421 1
+42 2422 1
+42 2423 1
+42 2425 1
+42 2426 1
+42 2427 1
+42 2428 1
+42 2430 1
+42 2642 1
+42 2647 1
+42 2652 1
+42 2653 1
+42 2654 1
+42 2655 1
+42 2662 1
+42 2667 1
+42 2668 1
+42 2669 1
+42 2670 1
+42 2677 1
+42 2678 1
+42 2679 1
+42 2680 1
+42 2687 1
+42 2688 1
+42 2689 1
+42 2690 1
+42 2691 1
+42 2692 1
+42 2697 1
+42 2702 1
+42 2703 1
+42 2704 1
+42 2705 1
+42 2712 1
+42 2713 1
+42 2714 1
+42 2715 1
+42 2722 1
+42 2723 1
+42 2724 1
+42 2725 1
+42 2726 1
+42 2727 1
+42 2732 1
+42 2733 1
+42 2734 1
+42 2735 1
+42 2742 1
+42 2743 1
+42 2744 1
+42 2745 1
+42 2746 1
+42 2747 1
+42 2752 1
+42 2753 1
+42 2754 1
+42 2755 1
+42 2756 1
+42 2757 1
+42 2762 1
+42 2763 1
+42 2764 1
+42 2765 1
+42 2767 1
+42 2772 1
+42 2773 1
+42 2774 1
+42 2775 1
+42 2782 1
+42 2783 1
+42 2784 1
+42 2785 1
+42 2792 1
+42 2793 1
+42 2794 1
+42 2795 1
+42 2796 1
+42 2797 1
+42 2802 1
+42 2803 1
+42 2804 1
+42 2805 1
+42 2812 1
+42 2813 1
+42 2814 1
+42 2815 1
+42 2816 1
+42 2817 1
+42 2822 1
+42 2823 1
+42 2824 1
+42 2825 1
+42 2826 1
+42 2827 1
+42 2832 1
+42 2833 1
+42 2834 1
+42 2835 1
+42 2837 1
+42 2838 1
+42 2839 1
+42 2840 1
+42 2847 1
+42 2848 1
+42 2849 1
+42 2850 1
+42 2851 1
+42 2852 1
+42 2857 1
+42 2858 1
+42 2859 1
+42 2860 1
+42 2861 1
+42 2862 1
+42 2867 1
+42 2868 1
+42 2869 1
+42 2870 1
+42 2872 1
+42 2873 1
+42 2874 1
+42 2875 1
+42 2876 1
+42 2877 1
+42 2882 1
+42 2883 1
+42 2884 1
+42 2885 1
+42 2887 1
+42 2888 1
+42 2889 1
+42 2890 1
+42 2892 1
+42 3103 1
+42 3108 1
+42 3109 1
+42 3110 1
+42 3111 1
+42 3118 1
+42 3119 1
+42 3120 1
+42 3121 1
+42 3128 1
+42 3129 1
+42 3130 1
+42 3131 1
+42 3132 1
+42 3133 1
+42 3138 1
+42 3139 1
+42 3140 1
+42 3141 1
+42 3148 1
+42 3149 1
+42 3150 1
+42 3151 1
+42 3152 1
+42 3153 1
+42 3158 1
+42 3159 1
+42 3160 1
+42 3161 1
+42 3162 1
+42 3163 1
+42 3168 1
+42 3169 1
+42 3170 1
+42 3171 1
+42 3173 1
+42 3174 1
+42 3175 1
+42 3176 1
+42 3183 1
+42 3184 1
+42 3185 1
+42 3186 1
+42 3187 1
+42 3188 1
+42 3193 1
+42 3194 1
+42 3195 1
+42 3196 1
+42 3197 1
+42 3198 1
+42 3203 1
+42 3204 1
+42 3205 1
+42 3206 1
+42 3208 1
+42 3209 1
+42 3210 1
+42 3211 1
+42 3212 1
+42 3213 1
+42 3218 1
+42 3219 1
+42 3220 1
+42 3221 1
+42 3223 1
+42 3224 1
+42 3225 1
+42 3226 1
+42 3228 1
+42 3229 1
+42 3230 1
+42 3231 1
+42 3232 1
+42 3239 1
+42 3240 1
+42 3241 1
+42 3242 1
+42 3243 1
+42 3244 1
+42 3249 1
+42 3250 1
+42 3251 1
+42 3252 1
+42 3253 1
+42 3254 1
+42 3259 1
+42 3260 1
+42 3261 1
+42 3262 1
+42 3264 1
+42 3265 1
+42 3266 1
+42 3267 1
+42 3268 1
+42 3269 1
+42 3274 1
+42 3275 1
+42 3276 1
+42 3277 1
+42 3279 1
+42 3280 1
+42 3281 1
+42 3282 1
+42 3284 1
+42 3285 1
+42 3286 1
+42 3287 1
+42 3288 1
+42 3289 1
+42 3290 1
+42 3295 1
+42 3296 1
+42 3297 1
+42 3298 1
+42 3300 1
+42 3301 1
+42 3302 1
+42 3303 1
+42 3305 1
+42 3306 1
+42 3307 1
+42 3308 1
+42 3309 1
+42 3311 1
+42 3312 1
+43 5 1
+43 12 1
+43 18 1
+43 23 1
+43 27 1
+43 31 1
+43 32 1
+43 33 1
+43 40 1
+43 46 1
+43 51 1
+43 55 1
+43 59 1
+43 60 1
+43 61 1
+43 67 1
+43 72 1
+43 76 1
+43 80 1
+43 81 1
+43 82 1
+43 87 1
+43 91 1
+43 95 1
+43 96 1
+43 97 1
+43 101 1
+43 105 1
+43 106 1
+43 107 1
+43 111 1
+43 112 1
+43 113 1
+43 117 1
+43 118 1
+43 119 1
+43 334 1
+43 340 1
+43 345 1
+43 349 1
+43 353 1
+43 354 1
+43 355 1
+43 361 1
+43 366 1
+43 370 1
+43 374 1
+43 375 1
+43 376 1
+43 381 1
+43 385 1
+43 389 1
+43 390 1
+43 391 1
+43 395 1
+43 399 1
+43 400 1
+43 401 1
+43 405 1
+43 406 1
+43 407 1
+43 411 1
+43 412 1
+43 413 1
+43 417 1
+43 422 1
+43 426 1
+43 430 1
+43 431 1
+43 432 1
+43 437 1
+43 441 1
+43 445 1
+43 446 1
+43 447 1
+43 451 1
+43 455 1
+43 456 1
+43 457 1
+43 461 1
+43 462 1
+43 463 1
+43 467 1
+43 468 1
+43 469 1
+43 472 1
+43 476 1
+43 480 1
+43 481 1
+43 482 1
+43 486 1
+43 490 1
+43 491 1
+43 492 1
+43 496 1
+43 497 1
+43 498 1
+43 502 1
+43 503 1
+43 504 1
+43 506 1
+43 510 1
+43 511 1
+43 512 1
+43 516 1
+43 517 1
+43 518 1
+43 522 1
+43 523 1
+43 524 1
+43 526 1
+43 527 1
+43 528 1
+43 532 1
+43 533 1
+43 534 1
+43 536 1
+43 537 1
+43 538 1
+43 540 1
+43 796 1
+43 802 1
+43 807 1
+43 811 1
+43 815 1
+43 816 1
+43 817 1
+43 823 1
+43 828 1
+43 832 1
+43 836 1
+43 837 1
+43 838 1
+43 843 1
+43 847 1
+43 851 1
+43 852 1
+43 853 1
+43 857 1
+43 861 1
+43 862 1
+43 863 1
+43 867 1
+43 868 1
+43 869 1
+43 873 1
+43 874 1
+43 875 1
+43 879 1
+43 884 1
+43 888 1
+43 892 1
+43 893 1
+43 894 1
+43 899 1
+43 903 1
+43 907 1
+43 908 1
+43 909 1
+43 913 1
+43 917 1
+43 918 1
+43 919 1
+43 923 1
+43 924 1
+43 925 1
+43 929 1
+43 930 1
+43 931 1
+43 934 1
+43 938 1
+43 942 1
+43 943 1
+43 944 1
+43 948 1
+43 952 1
+43 953 1
+43 954 1
+43 958 1
+43 959 1
+43 960 1
+43 964 1
+43 965 1
+43 966 1
+43 968 1
+43 972 1
+43 973 1
+43 974 1
+43 978 1
+43 979 1
+43 980 1
+43 984 1
+43 985 1
+43 986 1
+43 988 1
+43 989 1
+43 990 1
+43 994 1
+43 995 1
+43 996 1
+43 998 1
+43 999 1
+43 1000 1
+43 1002 1
+43 1257 1
+43 1262 1
+43 1266 1
+43 1270 1
+43 1271 1
+43 1272 1
+43 1277 1
+43 1281 1
+43 1285 1
+43 1286 1
+43 1287 1
+43 1291 1
+43 1295 1
+43 1296 1
+43 1297 1
+43 1301 1
+43 1302 1
+43 1303 1
+43 1307 1
+43 1308 1
+43 1309 1
+43 1312 1
+43 1316 1
+43 1320 1
+43 1321 1
+43 1322 1
+43 1326 1
+43 1330 1
+43 1331 1
+43 1332 1
+43 1336 1
+43 1337 1
+43 1338 1
+43 1342 1
+43 1343 1
+43 1344 1
+43 1346 1
+43 1350 1
+43 1351 1
+43 1352 1
+43 1356 1
+43 1357 1
+43 1358 1
+43 1362 1
+43 1363 1
+43 1364 1
+43 1366 1
+43 1367 1
+43 1368 1
+43 1372 1
+43 1373 1
+43 1374 1
+43 1376 1
+43 1377 1
+43 1378 1
+43 1380 1
+43 1382 1
+43 1386 1
+43 1390 1
+43 1391 1
+43 1392 1
+43 1396 1
+43 1400 1
+43 1401 1
+43 1402 1
+43 1406 1
+43 1407 1
+43 1408 1
+43 1412 1
+43 1413 1
+43 1414 1
+43 1416 1
+43 1420 1
+43 1421 1
+43 1422 1
+43 1426 1
+43 1427 1
+43 1428 1
+43 1432 1
+43 1433 1
+43 1434 1
+43 1436 1
+43 1437 1
+43 1438 1
+43 1442 1
+43 1443 1
+43 1444 1
+43 1446 1
+43 1447 1
+43 1448 1
+43 1450 1
+43 1451 1
+43 1455 1
+43 1456 1
+43 1457 1
+43 1461 1
+43 1462 1
+43 1463 1
+43 1467 1
+43 1468 1
+43 1469 1
+43 1471 1
+43 1472 1
+43 1473 1
+43 1477 1
+43 1478 1
+43 1479 1
+43 1481 1
+43 1482 1
+43 1483 1
+43 1485 1
+43 1486 1
+43 1487 1
+43 1488 1
+43 1492 1
+43 1493 1
+43 1494 1
+43 1496 1
+43 1497 1
+43 1498 1
+43 1500 1
+43 1501 1
+43 1502 1
+43 1503 1
+43 1505 1
+43 1506 1
+43 1720 1
+43 1726 1
+43 1731 1
+43 1735 1
+43 1739 1
+43 1740 1
+43 1741 1
+43 1747 1
+43 1752 1
+43 1756 1
+43 1760 1
+43 1761 1
+43 1762 1
+43 1767 1
+43 1771 1
+43 1775 1
+43 1776 1
+43 1777 1
+43 1781 1
+43 1785 1
+43 1786 1
+43 1787 1
+43 1791 1
+43 1792 1
+43 1793 1
+43 1797 1
+43 1798 1
+43 1799 1
+43 1803 1
+43 1808 1
+43 1812 1
+43 1816 1
+43 1817 1
+43 1818 1
+43 1823 1
+43 1827 1
+43 1831 1
+43 1832 1
+43 1833 1
+43 1837 1
+43 1841 1
+43 1842 1
+43 1843 1
+43 1847 1
+43 1848 1
+43 1849 1
+43 1853 1
+43 1854 1
+43 1855 1
+43 1858 1
+43 1862 1
+43 1866 1
+43 1867 1
+43 1868 1
+43 1872 1
+43 1876 1
+43 1877 1
+43 1878 1
+43 1882 1
+43 1883 1
+43 1884 1
+43 1888 1
+43 1889 1
+43 1890 1
+43 1892 1
+43 1896 1
+43 1897 1
+43 1898 1
+43 1902 1
+43 1903 1
+43 1904 1
+43 1908 1
+43 1909 1
+43 1910 1
+43 1912 1
+43 1913 1
+43 1914 1
+43 1918 1
+43 1919 1
+43 1920 1
+43 1922 1
+43 1923 1
+43 1924 1
+43 1926 1
+43 2181 1
+43 2186 1
+43 2190 1
+43 2194 1
+43 2195 1
+43 2196 1
+43 2201 1
+43 2205 1
+43 2209 1
+43 2210 1
+43 2211 1
+43 2215 1
+43 2219 1
+43 2220 1
+43 2221 1
+43 2225 1
+43 2226 1
+43 2227 1
+43 2231 1
+43 2232 1
+43 2233 1
+43 2236 1
+43 2240 1
+43 2244 1
+43 2245 1
+43 2246 1
+43 2250 1
+43 2254 1
+43 2255 1
+43 2256 1
+43 2260 1
+43 2261 1
+43 2262 1
+43 2266 1
+43 2267 1
+43 2268 1
+43 2270 1
+43 2274 1
+43 2275 1
+43 2276 1
+43 2280 1
+43 2281 1
+43 2282 1
+43 2286 1
+43 2287 1
+43 2288 1
+43 2290 1
+43 2291 1
+43 2292 1
+43 2296 1
+43 2297 1
+43 2298 1
+43 2300 1
+43 2301 1
+43 2302 1
+43 2304 1
+43 2306 1
+43 2310 1
+43 2314 1
+43 2315 1
+43 2316 1
+43 2320 1
+43 2324 1
+43 2325 1
+43 2326 1
+43 2330 1
+43 2331 1
+43 2332 1
+43 2336 1
+43 2337 1
+43 2338 1
+43 2340 1
+43 2344 1
+43 2345 1
+43 2346 1
+43 2350 1
+43 2351 1
+43 2352 1
+43 2356 1
+43 2357 1
+43 2358 1
+43 2360 1
+43 2361 1
+43 2362 1
+43 2366 1
+43 2367 1
+43 2368 1
+43 2370 1
+43 2371 1
+43 2372 1
+43 2374 1
+43 2375 1
+43 2379 1
+43 2380 1
+43 2381 1
+43 2385 1
+43 2386 1
+43 2387 1
+43 2391 1
+43 2392 1
+43 2393 1
+43 2395 1
+43 2396 1
+43 2397 1
+43 2401 1
+43 2402 1
+43 2403 1
+43 2405 1
+43 2406 1
+43 2407 1
+43 2409 1
+43 2410 1
+43 2411 1
+43 2412 1
+43 2416 1
+43 2417 1
+43 2418 1
+43 2420 1
+43 2421 1
+43 2422 1
+43 2424 1
+43 2425 1
+43 2426 1
+43 2427 1
+43 2429 1
+43 2430 1
+43 2643 1
+43 2648 1
+43 2652 1
+43 2656 1
+43 2657 1
+43 2658 1
+43 2663 1
+43 2667 1
+43 2671 1
+43 2672 1
+43 2673 1
+43 2677 1
+43 2681 1
+43 2682 1
+43 2683 1
+43 2687 1
+43 2688 1
+43 2689 1
+43 2693 1
+43 2694 1
+43 2695 1
+43 2698 1
+43 2702 1
+43 2706 1
+43 2707 1
+43 2708 1
+43 2712 1
+43 2716 1
+43 2717 1
+43 2718 1
+43 2722 1
+43 2723 1
+43 2724 1
+43 2728 1
+43 2729 1
+43 2730 1
+43 2732 1
+43 2736 1
+43 2737 1
+43 2738 1
+43 2742 1
+43 2743 1
+43 2744 1
+43 2748 1
+43 2749 1
+43 2750 1
+43 2752 1
+43 2753 1
+43 2754 1
+43 2758 1
+43 2759 1
+43 2760 1
+43 2762 1
+43 2763 1
+43 2764 1
+43 2766 1
+43 2768 1
+43 2772 1
+43 2776 1
+43 2777 1
+43 2778 1
+43 2782 1
+43 2786 1
+43 2787 1
+43 2788 1
+43 2792 1
+43 2793 1
+43 2794 1
+43 2798 1
+43 2799 1
+43 2800 1
+43 2802 1
+43 2806 1
+43 2807 1
+43 2808 1
+43 2812 1
+43 2813 1
+43 2814 1
+43 2818 1
+43 2819 1
+43 2820 1
+43 2822 1
+43 2823 1
+43 2824 1
+43 2828 1
+43 2829 1
+43 2830 1
+43 2832 1
+43 2833 1
+43 2834 1
+43 2836 1
+43 2837 1
+43 2841 1
+43 2842 1
+43 2843 1
+43 2847 1
+43 2848 1
+43 2849 1
+43 2853 1
+43 2854 1
+43 2855 1
+43 2857 1
+43 2858 1
+43 2859 1
+43 2863 1
+43 2864 1
+43 2865 1
+43 2867 1
+43 2868 1
+43 2869 1
+43 2871 1
+43 2872 1
+43 2873 1
+43 2874 1
+43 2878 1
+43 2879 1
+43 2880 1
+43 2882 1
+43 2883 1
+43 2884 1
+43 2886 1
+43 2887 1
+43 2888 1
+43 2889 1
+43 2891 1
+43 2892 1
+43 3104 1
+43 3108 1
+43 3112 1
+43 3113 1
+43 3114 1
+43 3118 1
+43 3122 1
+43 3123 1
+43 3124 1
+43 3128 1
+43 3129 1
+43 3130 1
+43 3134 1
+43 3135 1
+43 3136 1
+43 3138 1
+43 3142 1
+43 3143 1
+43 3144 1
+43 3148 1
+43 3149 1
+43 3150 1
+43 3154 1
+43 3155 1
+43 3156 1
+43 3158 1
+43 3159 1
+43 3160 1
+43 3164 1
+43 3165 1
+43 3166 1
+43 3168 1
+43 3169 1
+43 3170 1
+43 3172 1
+43 3173 1
+43 3177 1
+43 3178 1
+43 3179 1
+43 3183 1
+43 3184 1
+43 3185 1
+43 3189 1
+43 3190 1
+43 3191 1
+43 3193 1
+43 3194 1
+43 3195 1
+43 3199 1
+43 3200 1
+43 3201 1
+43 3203 1
+43 3204 1
+43 3205 1
+43 3207 1
+43 3208 1
+43 3209 1
+43 3210 1
+43 3214 1
+43 3215 1
+43 3216 1
+43 3218 1
+43 3219 1
+43 3220 1
+43 3222 1
+43 3223 1
+43 3224 1
+43 3225 1
+43 3227 1
+43 3228 1
+43 3229 1
+43 3233 1
+43 3234 1
+43 3235 1
+43 3239 1
+43 3240 1
+43 3241 1
+43 3245 1
+43 3246 1
+43 3247 1
+43 3249 1
+43 3250 1
+43 3251 1
+43 3255 1
+43 3256 1
+43 3257 1
+43 3259 1
+43 3260 1
+43 3261 1
+43 3263 1
+43 3264 1
+43 3265 1
+43 3266 1
+43 3270 1
+43 3271 1
+43 3272 1
+43 3274 1
+43 3275 1
+43 3276 1
+43 3278 1
+43 3279 1
+43 3280 1
+43 3281 1
+43 3283 1
+43 3284 1
+43 3285 1
+43 3286 1
+43 3287 1
+43 3291 1
+43 3292 1
+43 3293 1
+43 3295 1
+43 3296 1
+43 3297 1
+43 3299 1
+43 3300 1
+43 3301 1
+43 3302 1
+43 3304 1
+43 3305 1
+43 3306 1
+43 3307 1
+43 3308 1
+43 3310 1
+43 3311 1
+43 3312 1
+44 6 1
+44 13 1
+44 19 1
+44 24 1
+44 28 1
+44 31 1
+44 34 1
+44 35 1
+44 41 1
+44 47 1
+44 52 1
+44 56 1
+44 59 1
+44 62 1
+44 63 1
+44 68 1
+44 73 1
+44 77 1
+44 80 1
+44 83 1
+44 84 1
+44 88 1
+44 92 1
+44 95 1
+44 98 1
+44 99 1
+44 102 1
+44 105 1
+44 108 1
+44 109 1
+44 111 1
+44 114 1
+44 115 1
+44 117 1
+44 118 1
+44 120 1
+44 335 1
+44 341 1
+44 346 1
+44 350 1
+44 353 1
+44 356 1
+44 357 1
+44 362 1
+44 367 1
+44 371 1
+44 374 1
+44 377 1
+44 378 1
+44 382 1
+44 386 1
+44 389 1
+44 392 1
+44 393 1
+44 396 1
+44 399 1
+44 402 1
+44 403 1
+44 405 1
+44 408 1
+44 409 1
+44 411 1
+44 412 1
+44 414 1
+44 418 1
+44 423 1
+44 427 1
+44 430 1
+44 433 1
+44 434 1
+44 438 1
+44 442 1
+44 445 1
+44 448 1
+44 449 1
+44 452 1
+44 455 1
+44 458 1
+44 459 1
+44 461 1
+44 464 1
+44 465 1
+44 467 1
+44 468 1
+44 470 1
+44 473 1
+44 477 1
+44 480 1
+44 483 1
+44 484 1
+44 487 1
+44 490 1
+44 493 1
+44 494 1
+44 496 1
+44 499 1
+44 500 1
+44 502 1
+44 503 1
+44 505 1
+44 507 1
+44 510 1
+44 513 1
+44 514 1
+44 516 1
+44 519 1
+44 520 1
+44 522 1
+44 523 1
+44 525 1
+44 526 1
+44 529 1
+44 530 1
+44 532 1
+44 533 1
+44 535 1
+44 536 1
+44 537 1
+44 539 1
+44 540 1
+44 797 1
+44 803 1
+44 808 1
+44 812 1
+44 815 1
+44 818 1
+44 819 1
+44 824 1
+44 829 1
+44 833 1
+44 836 1
+44 839 1
+44 840 1
+44 844 1
+44 848 1
+44 851 1
+44 854 1
+44 855 1
+44 858 1
+44 861 1
+44 864 1
+44 865 1
+44 867 1
+44 870 1
+44 871 1
+44 873 1
+44 874 1
+44 876 1
+44 880 1
+44 885 1
+44 889 1
+44 892 1
+44 895 1
+44 896 1
+44 900 1
+44 904 1
+44 907 1
+44 910 1
+44 911 1
+44 914 1
+44 917 1
+44 920 1
+44 921 1
+44 923 1
+44 926 1
+44 927 1
+44 929 1
+44 930 1
+44 932 1
+44 935 1
+44 939 1
+44 942 1
+44 945 1
+44 946 1
+44 949 1
+44 952 1
+44 955 1
+44 956 1
+44 958 1
+44 961 1
+44 962 1
+44 964 1
+44 965 1
+44 967 1
+44 969 1
+44 972 1
+44 975 1
+44 976 1
+44 978 1
+44 981 1
+44 982 1
+44 984 1
+44 985 1
+44 987 1
+44 988 1
+44 991 1
+44 992 1
+44 994 1
+44 995 1
+44 997 1
+44 998 1
+44 999 1
+44 1001 1
+44 1002 1
+44 1258 1
+44 1263 1
+44 1267 1
+44 1270 1
+44 1273 1
+44 1274 1
+44 1278 1
+44 1282 1
+44 1285 1
+44 1288 1
+44 1289 1
+44 1292 1
+44 1295 1
+44 1298 1
+44 1299 1
+44 1301 1
+44 1304 1
+44 1305 1
+44 1307 1
+44 1308 1
+44 1310 1
+44 1313 1
+44 1317 1
+44 1320 1
+44 1323 1
+44 1324 1
+44 1327 1
+44 1330 1
+44 1333 1
+44 1334 1
+44 1336 1
+44 1339 1
+44 1340 1
+44 1342 1
+44 1343 1
+44 1345 1
+44 1347 1
+44 1350 1
+44 1353 1
+44 1354 1
+44 1356 1
+44 1359 1
+44 1360 1
+44 1362 1
+44 1363 1
+44 1365 1
+44 1366 1
+44 1369 1
+44 1370 1
+44 1372 1
+44 1373 1
+44 1375 1
+44 1376 1
+44 1377 1
+44 1379 1
+44 1380 1
+44 1383 1
+44 1387 1
+44 1390 1
+44 1393 1
+44 1394 1
+44 1397 1
+44 1400 1
+44 1403 1
+44 1404 1
+44 1406 1
+44 1409 1
+44 1410 1
+44 1412 1
+44 1413 1
+44 1415 1
+44 1417 1
+44 1420 1
+44 1423 1
+44 1424 1
+44 1426 1
+44 1429 1
+44 1430 1
+44 1432 1
+44 1433 1
+44 1435 1
+44 1436 1
+44 1439 1
+44 1440 1
+44 1442 1
+44 1443 1
+44 1445 1
+44 1446 1
+44 1447 1
+44 1449 1
+44 1450 1
+44 1452 1
+44 1455 1
+44 1458 1
+44 1459 1
+44 1461 1
+44 1464 1
+44 1465 1
+44 1467 1
+44 1468 1
+44 1470 1
+44 1471 1
+44 1474 1
+44 1475 1
+44 1477 1
+44 1478 1
+44 1480 1
+44 1481 1
+44 1482 1
+44 1484 1
+44 1485 1
+44 1486 1
+44 1489 1
+44 1490 1
+44 1492 1
+44 1493 1
+44 1495 1
+44 1496 1
+44 1497 1
+44 1499 1
+44 1500 1
+44 1501 1
+44 1502 1
+44 1504 1
+44 1505 1
+44 1506 1
+44 1721 1
+44 1727 1
+44 1732 1
+44 1736 1
+44 1739 1
+44 1742 1
+44 1743 1
+44 1748 1
+44 1753 1
+44 1757 1
+44 1760 1
+44 1763 1
+44 1764 1
+44 1768 1
+44 1772 1
+44 1775 1
+44 1778 1
+44 1779 1
+44 1782 1
+44 1785 1
+44 1788 1
+44 1789 1
+44 1791 1
+44 1794 1
+44 1795 1
+44 1797 1
+44 1798 1
+44 1800 1
+44 1804 1
+44 1809 1
+44 1813 1
+44 1816 1
+44 1819 1
+44 1820 1
+44 1824 1
+44 1828 1
+44 1831 1
+44 1834 1
+44 1835 1
+44 1838 1
+44 1841 1
+44 1844 1
+44 1845 1
+44 1847 1
+44 1850 1
+44 1851 1
+44 1853 1
+44 1854 1
+44 1856 1
+44 1859 1
+44 1863 1
+44 1866 1
+44 1869 1
+44 1870 1
+44 1873 1
+44 1876 1
+44 1879 1
+44 1880 1
+44 1882 1
+44 1885 1
+44 1886 1
+44 1888 1
+44 1889 1
+44 1891 1
+44 1893 1
+44 1896 1
+44 1899 1
+44 1900 1
+44 1902 1
+44 1905 1
+44 1906 1
+44 1908 1
+44 1909 1
+44 1911 1
+44 1912 1
+44 1915 1
+44 1916 1
+44 1918 1
+44 1919 1
+44 1921 1
+44 1922 1
+44 1923 1
+44 1925 1
+44 1926 1
+44 2182 1
+44 2187 1
+44 2191 1
+44 2194 1
+44 2197 1
+44 2198 1
+44 2202 1
+44 2206 1
+44 2209 1
+44 2212 1
+44 2213 1
+44 2216 1
+44 2219 1
+44 2222 1
+44 2223 1
+44 2225 1
+44 2228 1
+44 2229 1
+44 2231 1
+44 2232 1
+44 2234 1
+44 2237 1
+44 2241 1
+44 2244 1
+44 2247 1
+44 2248 1
+44 2251 1
+44 2254 1
+44 2257 1
+44 2258 1
+44 2260 1
+44 2263 1
+44 2264 1
+44 2266 1
+44 2267 1
+44 2269 1
+44 2271 1
+44 2274 1
+44 2277 1
+44 2278 1
+44 2280 1
+44 2283 1
+44 2284 1
+44 2286 1
+44 2287 1
+44 2289 1
+44 2290 1
+44 2293 1
+44 2294 1
+44 2296 1
+44 2297 1
+44 2299 1
+44 2300 1
+44 2301 1
+44 2303 1
+44 2304 1
+44 2307 1
+44 2311 1
+44 2314 1
+44 2317 1
+44 2318 1
+44 2321 1
+44 2324 1
+44 2327 1
+44 2328 1
+44 2330 1
+44 2333 1
+44 2334 1
+44 2336 1
+44 2337 1
+44 2339 1
+44 2341 1
+44 2344 1
+44 2347 1
+44 2348 1
+44 2350 1
+44 2353 1
+44 2354 1
+44 2356 1
+44 2357 1
+44 2359 1
+44 2360 1
+44 2363 1
+44 2364 1
+44 2366 1
+44 2367 1
+44 2369 1
+44 2370 1
+44 2371 1
+44 2373 1
+44 2374 1
+44 2376 1
+44 2379 1
+44 2382 1
+44 2383 1
+44 2385 1
+44 2388 1
+44 2389 1
+44 2391 1
+44 2392 1
+44 2394 1
+44 2395 1
+44 2398 1
+44 2399 1
+44 2401 1
+44 2402 1
+44 2404 1
+44 2405 1
+44 2406 1
+44 2408 1
+44 2409 1
+44 2410 1
+44 2413 1
+44 2414 1
+44 2416 1
+44 2417 1
+44 2419 1
+44 2420 1
+44 2421 1
+44 2423 1
+44 2424 1
+44 2425 1
+44 2426 1
+44 2428 1
+44 2429 1
+44 2430 1
+44 2644 1
+44 2649 1
+44 2653 1
+44 2656 1
+44 2659 1
+44 2660 1
+44 2664 1
+44 2668 1
+44 2671 1
+44 2674 1
+44 2675 1
+44 2678 1
+44 2681 1
+44 2684 1
+44 2685 1
+44 2687 1
+44 2690 1
+44 2691 1
+44 2693 1
+44 2694 1
+44 2696 1
+44 2699 1
+44 2703 1
+44 2706 1
+44 2709 1
+44 2710 1
+44 2713 1
+44 2716 1
+44 2719 1
+44 2720 1
+44 2722 1
+44 2725 1
+44 2726 1
+44 2728 1
+44 2729 1
+44 2731 1
+44 2733 1
+44 2736 1
+44 2739 1
+44 2740 1
+44 2742 1
+44 2745 1
+44 2746 1
+44 2748 1
+44 2749 1
+44 2751 1
+44 2752 1
+44 2755 1
+44 2756 1
+44 2758 1
+44 2759 1
+44 2761 1
+44 2762 1
+44 2763 1
+44 2765 1
+44 2766 1
+44 2769 1
+44 2773 1
+44 2776 1
+44 2779 1
+44 2780 1
+44 2783 1
+44 2786 1
+44 2789 1
+44 2790 1
+44 2792 1
+44 2795 1
+44 2796 1
+44 2798 1
+44 2799 1
+44 2801 1
+44 2803 1
+44 2806 1
+44 2809 1
+44 2810 1
+44 2812 1
+44 2815 1
+44 2816 1
+44 2818 1
+44 2819 1
+44 2821 1
+44 2822 1
+44 2825 1
+44 2826 1
+44 2828 1
+44 2829 1
+44 2831 1
+44 2832 1
+44 2833 1
+44 2835 1
+44 2836 1
+44 2838 1
+44 2841 1
+44 2844 1
+44 2845 1
+44 2847 1
+44 2850 1
+44 2851 1
+44 2853 1
+44 2854 1
+44 2856 1
+44 2857 1
+44 2860 1
+44 2861 1
+44 2863 1
+44 2864 1
+44 2866 1
+44 2867 1
+44 2868 1
+44 2870 1
+44 2871 1
+44 2872 1
+44 2875 1
+44 2876 1
+44 2878 1
+44 2879 1
+44 2881 1
+44 2882 1
+44 2883 1
+44 2885 1
+44 2886 1
+44 2887 1
+44 2888 1
+44 2890 1
+44 2891 1
+44 2892 1
+44 3105 1
+44 3109 1
+44 3112 1
+44 3115 1
+44 3116 1
+44 3119 1
+44 3122 1
+44 3125 1
+44 3126 1
+44 3128 1
+44 3131 1
+44 3132 1
+44 3134 1
+44 3135 1
+44 3137 1
+44 3139 1
+44 3142 1
+44 3145 1
+44 3146 1
+44 3148 1
+44 3151 1
+44 3152 1
+44 3154 1
+44 3155 1
+44 3157 1
+44 3158 1
+44 3161 1
+44 3162 1
+44 3164 1
+44 3165 1
+44 3167 1
+44 3168 1
+44 3169 1
+44 3171 1
+44 3172 1
+44 3174 1
+44 3177 1
+44 3180 1
+44 3181 1
+44 3183 1
+44 3186 1
+44 3187 1
+44 3189 1
+44 3190 1
+44 3192 1
+44 3193 1
+44 3196 1
+44 3197 1
+44 3199 1
+44 3200 1
+44 3202 1
+44 3203 1
+44 3204 1
+44 3206 1
+44 3207 1
+44 3208 1
+44 3211 1
+44 3212 1
+44 3214 1
+44 3215 1
+44 3217 1
+44 3218 1
+44 3219 1
+44 3221 1
+44 3222 1
+44 3223 1
+44 3224 1
+44 3226 1
+44 3227 1
+44 3228 1
+44 3230 1
+44 3233 1
+44 3236 1
+44 3237 1
+44 3239 1
+44 3242 1
+44 3243 1
+44 3245 1
+44 3246 1
+44 3248 1
+44 3249 1
+44 3252 1
+44 3253 1
+44 3255 1
+44 3256 1
+44 3258 1
+44 3259 1
+44 3260 1
+44 3262 1
+44 3263 1
+44 3264 1
+44 3267 1
+44 3268 1
+44 3270 1
+44 3271 1
+44 3273 1
+44 3274 1
+44 3275 1
+44 3277 1
+44 3278 1
+44 3279 1
+44 3280 1
+44 3282 1
+44 3283 1
+44 3284 1
+44 3285 1
+44 3288 1
+44 3289 1
+44 3291 1
+44 3292 1
+44 3294 1
+44 3295 1
+44 3296 1
+44 3298 1
+44 3299 1
+44 3300 1
+44 3301 1
+44 3303 1
+44 3304 1
+44 3305 1
+44 3306 1
+44 3307 1
+44 3309 1
+44 3310 1
+44 3311 1
+44 3312 1
+45 7 1
+45 14 1
+45 20 1
+45 25 1
+45 29 1
+45 32 1
+45 34 1
+45 36 1
+45 42 1
+45 48 1
+45 53 1
+45 57 1
+45 60 1
+45 62 1
+45 64 1
+45 69 1
+45 74 1
+45 78 1
+45 81 1
+45 83 1
+45 85 1
+45 89 1
+45 93 1
+45 96 1
+45 98 1
+45 100 1
+45 103 1
+45 106 1
+45 108 1
+45 110 1
+45 112 1
+45 114 1
+45 116 1
+45 117 1
+45 119 1
+45 120 1
+45 336 1
+45 342 1
+45 347 1
+45 351 1
+45 354 1
+45 356 1
+45 358 1
+45 363 1
+45 368 1
+45 372 1
+45 375 1
+45 377 1
+45 379 1
+45 383 1
+45 387 1
+45 390 1
+45 392 1
+45 394 1
+45 397 1
+45 400 1
+45 402 1
+45 404 1
+45 406 1
+45 408 1
+45 410 1
+45 411 1
+45 413 1
+45 414 1
+45 419 1
+45 424 1
+45 428 1
+45 431 1
+45 433 1
+45 435 1
+45 439 1
+45 443 1
+45 446 1
+45 448 1
+45 450 1
+45 453 1
+45 456 1
+45 458 1
+45 460 1
+45 462 1
+45 464 1
+45 466 1
+45 467 1
+45 469 1
+45 470 1
+45 474 1
+45 478 1
+45 481 1
+45 483 1
+45 485 1
+45 488 1
+45 491 1
+45 493 1
+45 495 1
+45 497 1
+45 499 1
+45 501 1
+45 502 1
+45 504 1
+45 505 1
+45 508 1
+45 511 1
+45 513 1
+45 515 1
+45 517 1
+45 519 1
+45 521 1
+45 522 1
+45 524 1
+45 525 1
+45 527 1
+45 529 1
+45 531 1
+45 532 1
+45 534 1
+45 535 1
+45 536 1
+45 538 1
+45 539 1
+45 540 1
+45 798 1
+45 804 1
+45 809 1
+45 813 1
+45 816 1
+45 818 1
+45 820 1
+45 825 1
+45 830 1
+45 834 1
+45 837 1
+45 839 1
+45 841 1
+45 845 1
+45 849 1
+45 852 1
+45 854 1
+45 856 1
+45 859 1
+45 862 1
+45 864 1
+45 866 1
+45 868 1
+45 870 1
+45 872 1
+45 873 1
+45 875 1
+45 876 1
+45 881 1
+45 886 1
+45 890 1
+45 893 1
+45 895 1
+45 897 1
+45 901 1
+45 905 1
+45 908 1
+45 910 1
+45 912 1
+45 915 1
+45 918 1
+45 920 1
+45 922 1
+45 924 1
+45 926 1
+45 928 1
+45 929 1
+45 931 1
+45 932 1
+45 936 1
+45 940 1
+45 943 1
+45 945 1
+45 947 1
+45 950 1
+45 953 1
+45 955 1
+45 957 1
+45 959 1
+45 961 1
+45 963 1
+45 964 1
+45 966 1
+45 967 1
+45 970 1
+45 973 1
+45 975 1
+45 977 1
+45 979 1
+45 981 1
+45 983 1
+45 984 1
+45 986 1
+45 987 1
+45 989 1
+45 991 1
+45 993 1
+45 994 1
+45 996 1
+45 997 1
+45 998 1
+45 1000 1
+45 1001 1
+45 1002 1
+45 1259 1
+45 1264 1
+45 1268 1
+45 1271 1
+45 1273 1
+45 1275 1
+45 1279 1
+45 1283 1
+45 1286 1
+45 1288 1
+45 1290 1
+45 1293 1
+45 1296 1
+45 1298 1
+45 1300 1
+45 1302 1
+45 1304 1
+45 1306 1
+45 1307 1
+45 1309 1
+45 1310 1
+45 1314 1
+45 1318 1
+45 1321 1
+45 1323 1
+45 1325 1
+45 1328 1
+45 1331 1
+45 1333 1
+45 1335 1
+45 1337 1
+45 1339 1
+45 1341 1
+45 1342 1
+45 1344 1
+45 1345 1
+45 1348 1
+45 1351 1
+45 1353 1
+45 1355 1
+45 1357 1
+45 1359 1
+45 1361 1
+45 1362 1
+45 1364 1
+45 1365 1
+45 1367 1
+45 1369 1
+45 1371 1
+45 1372 1
+45 1374 1
+45 1375 1
+45 1376 1
+45 1378 1
+45 1379 1
+45 1380 1
+45 1384 1
+45 1388 1
+45 1391 1
+45 1393 1
+45 1395 1
+45 1398 1
+45 1401 1
+45 1403 1
+45 1405 1
+45 1407 1
+45 1409 1
+45 1411 1
+45 1412 1
+45 1414 1
+45 1415 1
+45 1418 1
+45 1421 1
+45 1423 1
+45 1425 1
+45 1427 1
+45 1429 1
+45 1431 1
+45 1432 1
+45 1434 1
+45 1435 1
+45 1437 1
+45 1439 1
+45 1441 1
+45 1442 1
+45 1444 1
+45 1445 1
+45 1446 1
+45 1448 1
+45 1449 1
+45 1450 1
+45 1453 1
+45 1456 1
+45 1458 1
+45 1460 1
+45 1462 1
+45 1464 1
+45 1466 1
+45 1467 1
+45 1469 1
+45 1470 1
+45 1472 1
+45 1474 1
+45 1476 1
+45 1477 1
+45 1479 1
+45 1480 1
+45 1481 1
+45 1483 1
+45 1484 1
+45 1485 1
+45 1487 1
+45 1489 1
+45 1491 1
+45 1492 1
+45 1494 1
+45 1495 1
+45 1496 1
+45 1498 1
+45 1499 1
+45 1500 1
+45 1501 1
+45 1503 1
+45 1504 1
+45 1505 1
+45 1506 1
+45 1722 1
+45 1728 1
+45 1733 1
+45 1737 1
+45 1740 1
+45 1742 1
+45 1744 1
+45 1749 1
+45 1754 1
+45 1758 1
+45 1761 1
+45 1763 1
+45 1765 1
+45 1769 1
+45 1773 1
+45 1776 1
+45 1778 1
+45 1780 1
+45 1783 1
+45 1786 1
+45 1788 1
+45 1790 1
+45 1792 1
+45 1794 1
+45 1796 1
+45 1797 1
+45 1799 1
+45 1800 1
+45 1805 1
+45 1810 1
+45 1814 1
+45 1817 1
+45 1819 1
+45 1821 1
+45 1825 1
+45 1829 1
+45 1832 1
+45 1834 1
+45 1836 1
+45 1839 1
+45 1842 1
+45 1844 1
+45 1846 1
+45 1848 1
+45 1850 1
+45 1852 1
+45 1853 1
+45 1855 1
+45 1856 1
+45 1860 1
+45 1864 1
+45 1867 1
+45 1869 1
+45 1871 1
+45 1874 1
+45 1877 1
+45 1879 1
+45 1881 1
+45 1883 1
+45 1885 1
+45 1887 1
+45 1888 1
+45 1890 1
+45 1891 1
+45 1894 1
+45 1897 1
+45 1899 1
+45 1901 1
+45 1903 1
+45 1905 1
+45 1907 1
+45 1908 1
+45 1910 1
+45 1911 1
+45 1913 1
+45 1915 1
+45 1917 1
+45 1918 1
+45 1920 1
+45 1921 1
+45 1922 1
+45 1924 1
+45 1925 1
+45 1926 1
+45 2183 1
+45 2188 1
+45 2192 1
+45 2195 1
+45 2197 1
+45 2199 1
+45 2203 1
+45 2207 1
+45 2210 1
+45 2212 1
+45 2214 1
+45 2217 1
+45 2220 1
+45 2222 1
+45 2224 1
+45 2226 1
+45 2228 1
+45 2230 1
+45 2231 1
+45 2233 1
+45 2234 1
+45 2238 1
+45 2242 1
+45 2245 1
+45 2247 1
+45 2249 1
+45 2252 1
+45 2255 1
+45 2257 1
+45 2259 1
+45 2261 1
+45 2263 1
+45 2265 1
+45 2266 1
+45 2268 1
+45 2269 1
+45 2272 1
+45 2275 1
+45 2277 1
+45 2279 1
+45 2281 1
+45 2283 1
+45 2285 1
+45 2286 1
+45 2288 1
+45 2289 1
+45 2291 1
+45 2293 1
+45 2295 1
+45 2296 1
+45 2298 1
+45 2299 1
+45 2300 1
+45 2302 1
+45 2303 1
+45 2304 1
+45 2308 1
+45 2312 1
+45 2315 1
+45 2317 1
+45 2319 1
+45 2322 1
+45 2325 1
+45 2327 1
+45 2329 1
+45 2331 1
+45 2333 1
+45 2335 1
+45 2336 1
+45 2338 1
+45 2339 1
+45 2342 1
+45 2345 1
+45 2347 1
+45 2349 1
+45 2351 1
+45 2353 1
+45 2355 1
+45 2356 1
+45 2358 1
+45 2359 1
+45 2361 1
+45 2363 1
+45 2365 1
+45 2366 1
+45 2368 1
+45 2369 1
+45 2370 1
+45 2372 1
+45 2373 1
+45 2374 1
+45 2377 1
+45 2380 1
+45 2382 1
+45 2384 1
+45 2386 1
+45 2388 1
+45 2390 1
+45 2391 1
+45 2393 1
+45 2394 1
+45 2396 1
+45 2398 1
+45 2400 1
+45 2401 1
+45 2403 1
+45 2404 1
+45 2405 1
+45 2407 1
+45 2408 1
+45 2409 1
+45 2411 1
+45 2413 1
+45 2415 1
+45 2416 1
+45 2418 1
+45 2419 1
+45 2420 1
+45 2422 1
+45 2423 1
+45 2424 1
+45 2425 1
+45 2427 1
+45 2428 1
+45 2429 1
+45 2430 1
+45 2645 1
+45 2650 1
+45 2654 1
+45 2657 1
+45 2659 1
+45 2661 1
+45 2665 1
+45 2669 1
+45 2672 1
+45 2674 1
+45 2676 1
+45 2679 1
+45 2682 1
+45 2684 1
+45 2686 1
+45 2688 1
+45 2690 1
+45 2692 1
+45 2693 1
+45 2695 1
+45 2696 1
+45 2700 1
+45 2704 1
+45 2707 1
+45 2709 1
+45 2711 1
+45 2714 1
+45 2717 1
+45 2719 1
+45 2721 1
+45 2723 1
+45 2725 1
+45 2727 1
+45 2728 1
+45 2730 1
+45 2731 1
+45 2734 1
+45 2737 1
+45 2739 1
+45 2741 1
+45 2743 1
+45 2745 1
+45 2747 1
+45 2748 1
+45 2750 1
+45 2751 1
+45 2753 1
+45 2755 1
+45 2757 1
+45 2758 1
+45 2760 1
+45 2761 1
+45 2762 1
+45 2764 1
+45 2765 1
+45 2766 1
+45 2770 1
+45 2774 1
+45 2777 1
+45 2779 1
+45 2781 1
+45 2784 1
+45 2787 1
+45 2789 1
+45 2791 1
+45 2793 1
+45 2795 1
+45 2797 1
+45 2798 1
+45 2800 1
+45 2801 1
+45 2804 1
+45 2807 1
+45 2809 1
+45 2811 1
+45 2813 1
+45 2815 1
+45 2817 1
+45 2818 1
+45 2820 1
+45 2821 1
+45 2823 1
+45 2825 1
+45 2827 1
+45 2828 1
+45 2830 1
+45 2831 1
+45 2832 1
+45 2834 1
+45 2835 1
+45 2836 1
+45 2839 1
+45 2842 1
+45 2844 1
+45 2846 1
+45 2848 1
+45 2850 1
+45 2852 1
+45 2853 1
+45 2855 1
+45 2856 1
+45 2858 1
+45 2860 1
+45 2862 1
+45 2863 1
+45 2865 1
+45 2866 1
+45 2867 1
+45 2869 1
+45 2870 1
+45 2871 1
+45 2873 1
+45 2875 1
+45 2877 1
+45 2878 1
+45 2880 1
+45 2881 1
+45 2882 1
+45 2884 1
+45 2885 1
+45 2886 1
+45 2887 1
+45 2889 1
+45 2890 1
+45 2891 1
+45 2892 1
+45 3106 1
+45 3110 1
+45 3113 1
+45 3115 1
+45 3117 1
+45 3120 1
+45 3123 1
+45 3125 1
+45 3127 1
+45 3129 1
+45 3131 1
+45 3133 1
+45 3134 1
+45 3136 1
+45 3137 1
+45 3140 1
+45 3143 1
+45 3145 1
+45 3147 1
+45 3149 1
+45 3151 1
+45 3153 1
+45 3154 1
+45 3156 1
+45 3157 1
+45 3159 1
+45 3161 1
+45 3163 1
+45 3164 1
+45 3166 1
+45 3167 1
+45 3168 1
+45 3170 1
+45 3171 1
+45 3172 1
+45 3175 1
+45 3178 1
+45 3180 1
+45 3182 1
+45 3184 1
+45 3186 1
+45 3188 1
+45 3189 1
+45 3191 1
+45 3192 1
+45 3194 1
+45 3196 1
+45 3198 1
+45 3199 1
+45 3201 1
+45 3202 1
+45 3203 1
+45 3205 1
+45 3206 1
+45 3207 1
+45 3209 1
+45 3211 1
+45 3213 1
+45 3214 1
+45 3216 1
+45 3217 1
+45 3218 1
+45 3220 1
+45 3221 1
+45 3222 1
+45 3223 1
+45 3225 1
+45 3226 1
+45 3227 1
+45 3228 1
+45 3231 1
+45 3234 1
+45 3236 1
+45 3238 1
+45 3240 1
+45 3242 1
+45 3244 1
+45 3245 1
+45 3247 1
+45 3248 1
+45 3250 1
+45 3252 1
+45 3254 1
+45 3255 1
+45 3257 1
+45 3258 1
+45 3259 1
+45 3261 1
+45 3262 1
+45 3263 1
+45 3265 1
+45 3267 1
+45 3269 1
+45 3270 1
+45 3272 1
+45 3273 1
+45 3274 1
+45 3276 1
+45 3277 1
+45 3278 1
+45 3279 1
+45 3281 1
+45 3282 1
+45 3283 1
+45 3284 1
+45 3286 1
+45 3288 1
+45 3290 1
+45 3291 1
+45 3293 1
+45 3294 1
+45 3295 1
+45 3297 1
+45 3298 1
+45 3299 1
+45 3300 1
+45 3302 1
+45 3303 1
+45 3304 1
+45 3305 1
+45 3306 1
+45 3308 1
+45 3309 1
+45 3310 1
+45 3311 1
+45 3312 1
+46 8 1
+46 15 1
+46 21 1
+46 26 1
+46 30 1
+46 33 1
+46 35 1
+46 36 1
+46 43 1
+46 49 1
+46 54 1
+46 58 1
+46 61 1
+46 63 1
+46 64 1
+46 70 1
+46 75 1
+46 79 1
+46 82 1
+46 84 1
+46 85 1
+46 90 1
+46 94 1
+46 97 1
+46 99 1
+46 100 1
+46 104 1
+46 107 1
+46 109 1
+46 110 1
+46 113 1
+46 115 1
+46 116 1
+46 118 1
+46 119 1
+46 120 1
+46 337 1
+46 343 1
+46 348 1
+46 352 1
+46 355 1
+46 357 1
+46 358 1
+46 364 1
+46 369 1
+46 373 1
+46 376 1
+46 378 1
+46 379 1
+46 384 1
+46 388 1
+46 391 1
+46 393 1
+46 394 1
+46 398 1
+46 401 1
+46 403 1
+46 404 1
+46 407 1
+46 409 1
+46 410 1
+46 412 1
+46 413 1
+46 414 1
+46 420 1
+46 425 1
+46 429 1
+46 432 1
+46 434 1
+46 435 1
+46 440 1
+46 444 1
+46 447 1
+46 449 1
+46 450 1
+46 454 1
+46 457 1
+46 459 1
+46 460 1
+46 463 1
+46 465 1
+46 466 1
+46 468 1
+46 469 1
+46 470 1
+46 475 1
+46 479 1
+46 482 1
+46 484 1
+46 485 1
+46 489 1
+46 492 1
+46 494 1
+46 495 1
+46 498 1
+46 500 1
+46 501 1
+46 503 1
+46 504 1
+46 505 1
+46 509 1
+46 512 1
+46 514 1
+46 515 1
+46 518 1
+46 520 1
+46 521 1
+46 523 1
+46 524 1
+46 525 1
+46 528 1
+46 530 1
+46 531 1
+46 533 1
+46 534 1
+46 535 1
+46 537 1
+46 538 1
+46 539 1
+46 540 1
+46 799 1
+46 805 1
+46 810 1
+46 814 1
+46 817 1
+46 819 1
+46 820 1
+46 826 1
+46 831 1
+46 835 1
+46 838 1
+46 840 1
+46 841 1
+46 846 1
+46 850 1
+46 853 1
+46 855 1
+46 856 1
+46 860 1
+46 863 1
+46 865 1
+46 866 1
+46 869 1
+46 871 1
+46 872 1
+46 874 1
+46 875 1
+46 876 1
+46 882 1
+46 887 1
+46 891 1
+46 894 1
+46 896 1
+46 897 1
+46 902 1
+46 906 1
+46 909 1
+46 911 1
+46 912 1
+46 916 1
+46 919 1
+46 921 1
+46 922 1
+46 925 1
+46 927 1
+46 928 1
+46 930 1
+46 931 1
+46 932 1
+46 937 1
+46 941 1
+46 944 1
+46 946 1
+46 947 1
+46 951 1
+46 954 1
+46 956 1
+46 957 1
+46 960 1
+46 962 1
+46 963 1
+46 965 1
+46 966 1
+46 967 1
+46 971 1
+46 974 1
+46 976 1
+46 977 1
+46 980 1
+46 982 1
+46 983 1
+46 985 1
+46 986 1
+46 987 1
+46 990 1
+46 992 1
+46 993 1
+46 995 1
+46 996 1
+46 997 1
+46 999 1
+46 1000 1
+46 1001 1
+46 1002 1
+46 1260 1
+46 1265 1
+46 1269 1
+46 1272 1
+46 1274 1
+46 1275 1
+46 1280 1
+46 1284 1
+46 1287 1
+46 1289 1
+46 1290 1
+46 1294 1
+46 1297 1
+46 1299 1
+46 1300 1
+46 1303 1
+46 1305 1
+46 1306 1
+46 1308 1
+46 1309 1
+46 1310 1
+46 1315 1
+46 1319 1
+46 1322 1
+46 1324 1
+46 1325 1
+46 1329 1
+46 1332 1
+46 1334 1
+46 1335 1
+46 1338 1
+46 1340 1
+46 1341 1
+46 1343 1
+46 1344 1
+46 1345 1
+46 1349 1
+46 1352 1
+46 1354 1
+46 1355 1
+46 1358 1
+46 1360 1
+46 1361 1
+46 1363 1
+46 1364 1
+46 1365 1
+46 1368 1
+46 1370 1
+46 1371 1
+46 1373 1
+46 1374 1
+46 1375 1
+46 1377 1
+46 1378 1
+46 1379 1
+46 1380 1
+46 1385 1
+46 1389 1
+46 1392 1
+46 1394 1
+46 1395 1
+46 1399 1
+46 1402 1
+46 1404 1
+46 1405 1
+46 1408 1
+46 1410 1
+46 1411 1
+46 1413 1
+46 1414 1
+46 1415 1
+46 1419 1
+46 1422 1
+46 1424 1
+46 1425 1
+46 1428 1
+46 1430 1
+46 1431 1
+46 1433 1
+46 1434 1
+46 1435 1
+46 1438 1
+46 1440 1
+46 1441 1
+46 1443 1
+46 1444 1
+46 1445 1
+46 1447 1
+46 1448 1
+46 1449 1
+46 1450 1
+46 1454 1
+46 1457 1
+46 1459 1
+46 1460 1
+46 1463 1
+46 1465 1
+46 1466 1
+46 1468 1
+46 1469 1
+46 1470 1
+46 1473 1
+46 1475 1
+46 1476 1
+46 1478 1
+46 1479 1
+46 1480 1
+46 1482 1
+46 1483 1
+46 1484 1
+46 1485 1
+46 1488 1
+46 1490 1
+46 1491 1
+46 1493 1
+46 1494 1
+46 1495 1
+46 1497 1
+46 1498 1
+46 1499 1
+46 1500 1
+46 1502 1
+46 1503 1
+46 1504 1
+46 1505 1
+46 1506 1
+46 1723 1
+46 1729 1
+46 1734 1
+46 1738 1
+46 1741 1
+46 1743 1
+46 1744 1
+46 1750 1
+46 1755 1
+46 1759 1
+46 1762 1
+46 1764 1
+46 1765 1
+46 1770 1
+46 1774 1
+46 1777 1
+46 1779 1
+46 1780 1
+46 1784 1
+46 1787 1
+46 1789 1
+46 1790 1
+46 1793 1
+46 1795 1
+46 1796 1
+46 1798 1
+46 1799 1
+46 1800 1
+46 1806 1
+46 1811 1
+46 1815 1
+46 1818 1
+46 1820 1
+46 1821 1
+46 1826 1
+46 1830 1
+46 1833 1
+46 1835 1
+46 1836 1
+46 1840 1
+46 1843 1
+46 1845 1
+46 1846 1
+46 1849 1
+46 1851 1
+46 1852 1
+46 1854 1
+46 1855 1
+46 1856 1
+46 1861 1
+46 1865 1
+46 1868 1
+46 1870 1
+46 1871 1
+46 1875 1
+46 1878 1
+46 1880 1
+46 1881 1
+46 1884 1
+46 1886 1
+46 1887 1
+46 1889 1
+46 1890 1
+46 1891 1
+46 1895 1
+46 1898 1
+46 1900 1
+46 1901 1
+46 1904 1
+46 1906 1
+46 1907 1
+46 1909 1
+46 1910 1
+46 1911 1
+46 1914 1
+46 1916 1
+46 1917 1
+46 1919 1
+46 1920 1
+46 1921 1
+46 1923 1
+46 1924 1
+46 1925 1
+46 1926 1
+46 2184 1
+46 2189 1
+46 2193 1
+46 2196 1
+46 2198 1
+46 2199 1
+46 2204 1
+46 2208 1
+46 2211 1
+46 2213 1
+46 2214 1
+46 2218 1
+46 2221 1
+46 2223 1
+46 2224 1
+46 2227 1
+46 2229 1
+46 2230 1
+46 2232 1
+46 2233 1
+46 2234 1
+46 2239 1
+46 2243 1
+46 2246 1
+46 2248 1
+46 2249 1
+46 2253 1
+46 2256 1
+46 2258 1
+46 2259 1
+46 2262 1
+46 2264 1
+46 2265 1
+46 2267 1
+46 2268 1
+46 2269 1
+46 2273 1
+46 2276 1
+46 2278 1
+46 2279 1
+46 2282 1
+46 2284 1
+46 2285 1
+46 2287 1
+46 2288 1
+46 2289 1
+46 2292 1
+46 2294 1
+46 2295 1
+46 2297 1
+46 2298 1
+46 2299 1
+46 2301 1
+46 2302 1
+46 2303 1
+46 2304 1
+46 2309 1
+46 2313 1
+46 2316 1
+46 2318 1
+46 2319 1
+46 2323 1
+46 2326 1
+46 2328 1
+46 2329 1
+46 2332 1
+46 2334 1
+46 2335 1
+46 2337 1
+46 2338 1
+46 2339 1
+46 2343 1
+46 2346 1
+46 2348 1
+46 2349 1
+46 2352 1
+46 2354 1
+46 2355 1
+46 2357 1
+46 2358 1
+46 2359 1
+46 2362 1
+46 2364 1
+46 2365 1
+46 2367 1
+46 2368 1
+46 2369 1
+46 2371 1
+46 2372 1
+46 2373 1
+46 2374 1
+46 2378 1
+46 2381 1
+46 2383 1
+46 2384 1
+46 2387 1
+46 2389 1
+46 2390 1
+46 2392 1
+46 2393 1
+46 2394 1
+46 2397 1
+46 2399 1
+46 2400 1
+46 2402 1
+46 2403 1
+46 2404 1
+46 2406 1
+46 2407 1
+46 2408 1
+46 2409 1
+46 2412 1
+46 2414 1
+46 2415 1
+46 2417 1
+46 2418 1
+46 2419 1
+46 2421 1
+46 2422 1
+46 2423 1
+46 2424 1
+46 2426 1
+46 2427 1
+46 2428 1
+46 2429 1
+46 2430 1
+46 2646 1
+46 2651 1
+46 2655 1
+46 2658 1
+46 2660 1
+46 2661 1
+46 2666 1
+46 2670 1
+46 2673 1
+46 2675 1
+46 2676 1
+46 2680 1
+46 2683 1
+46 2685 1
+46 2686 1
+46 2689 1
+46 2691 1
+46 2692 1
+46 2694 1
+46 2695 1
+46 2696 1
+46 2701 1
+46 2705 1
+46 2708 1
+46 2710 1
+46 2711 1
+46 2715 1
+46 2718 1
+46 2720 1
+46 2721 1
+46 2724 1
+46 2726 1
+46 2727 1
+46 2729 1
+46 2730 1
+46 2731 1
+46 2735 1
+46 2738 1
+46 2740 1
+46 2741 1
+46 2744 1
+46 2746 1
+46 2747 1
+46 2749 1
+46 2750 1
+46 2751 1
+46 2754 1
+46 2756 1
+46 2757 1
+46 2759 1
+46 2760 1
+46 2761 1
+46 2763 1
+46 2764 1
+46 2765 1
+46 2766 1
+46 2771 1
+46 2775 1
+46 2778 1
+46 2780 1
+46 2781 1
+46 2785 1
+46 2788 1
+46 2790 1
+46 2791 1
+46 2794 1
+46 2796 1
+46 2797 1
+46 2799 1
+46 2800 1
+46 2801 1
+46 2805 1
+46 2808 1
+46 2810 1
+46 2811 1
+46 2814 1
+46 2816 1
+46 2817 1
+46 2819 1
+46 2820 1
+46 2821 1
+46 2824 1
+46 2826 1
+46 2827 1
+46 2829 1
+46 2830 1
+46 2831 1
+46 2833 1
+46 2834 1
+46 2835 1
+46 2836 1
+46 2840 1
+46 2843 1
+46 2845 1
+46 2846 1
+46 2849 1
+46 2851 1
+46 2852 1
+46 2854 1
+46 2855 1
+46 2856 1
+46 2859 1
+46 2861 1
+46 2862 1
+46 2864 1
+46 2865 1
+46 2866 1
+46 2868 1
+46 2869 1
+46 2870 1
+46 2871 1
+46 2874 1
+46 2876 1
+46 2877 1
+46 2879 1
+46 2880 1
+46 2881 1
+46 2883 1
+46 2884 1
+46 2885 1
+46 2886 1
+46 2888 1
+46 2889 1
+46 2890 1
+46 2891 1
+46 2892 1
+46 3107 1
+46 3111 1
+46 3114 1
+46 3116 1
+46 3117 1
+46 3121 1
+46 3124 1
+46 3126 1
+46 3127 1
+46 3130 1
+46 3132 1
+46 3133 1
+46 3135 1
+46 3136 1
+46 3137 1
+46 3141 1
+46 3144 1
+46 3146 1
+46 3147 1
+46 3150 1
+46 3152 1
+46 3153 1
+46 3155 1
+46 3156 1
+46 3157 1
+46 3160 1
+46 3162 1
+46 3163 1
+46 3165 1
+46 3166 1
+46 3167 1
+46 3169 1
+46 3170 1
+46 3171 1
+46 3172 1
+46 3176 1
+46 3179 1
+46 3181 1
+46 3182 1
+46 3185 1
+46 3187 1
+46 3188 1
+46 3190 1
+46 3191 1
+46 3192 1
+46 3195 1
+46 3197 1
+46 3198 1
+46 3200 1
+46 3201 1
+46 3202 1
+46 3204 1
+46 3205 1
+46 3206 1
+46 3207 1
+46 3210 1
+46 3212 1
+46 3213 1
+46 3215 1
+46 3216 1
+46 3217 1
+46 3219 1
+46 3220 1
+46 3221 1
+46 3222 1
+46 3224 1
+46 3225 1
+46 3226 1
+46 3227 1
+46 3228 1
+46 3232 1
+46 3235 1
+46 3237 1
+46 3238 1
+46 3241 1
+46 3243 1
+46 3244 1
+46 3246 1
+46 3247 1
+46 3248 1
+46 3251 1
+46 3253 1
+46 3254 1
+46 3256 1
+46 3257 1
+46 3258 1
+46 3260 1
+46 3261 1
+46 3262 1
+46 3263 1
+46 3266 1
+46 3268 1
+46 3269 1
+46 3271 1
+46 3272 1
+46 3273 1
+46 3275 1
+46 3276 1
+46 3277 1
+46 3278 1
+46 3280 1
+46 3281 1
+46 3282 1
+46 3283 1
+46 3284 1
+46 3287 1
+46 3289 1
+46 3290 1
+46 3292 1
+46 3293 1
+46 3294 1
+46 3296 1
+46 3297 1
+46 3298 1
+46 3299 1
+46 3301 1
+46 3302 1
+46 3303 1
+46 3304 1
+46 3305 1
+46 3307 1
+46 3308 1
+46 3309 1
+46 3310 1
+46 3311 1
+46 3312 1
+47 1 1
+47 2 1
+47 3 1
+47 4 1
+47 5 1
+47 6 1
+47 7 1
+47 8 1
+47 121 1
+47 122 1
+47 123 1
+47 124 1
+47 125 1
+47 126 1
+47 127 1
+47 128 1
+47 129 1
+47 130 1
+47 131 1
+47 132 1
+47 133 1
+47 134 1
+47 135 1
+47 136 1
+47 137 1
+47 138 1
+47 139 1
+47 140 1
+47 141 1
+47 142 1
+47 143 1
+47 144 1
+47 145 1
+47 146 1
+47 147 1
+47 148 1
+47 331 1
+47 332 1
+47 333 1
+47 334 1
+47 335 1
+47 336 1
+47 337 1
+47 338 1
+47 339 1
+47 340 1
+47 341 1
+47 342 1
+47 343 1
+47 344 1
+47 345 1
+47 346 1
+47 347 1
+47 348 1
+47 349 1
+47 350 1
+47 351 1
+47 352 1
+47 353 1
+47 354 1
+47 355 1
+47 356 1
+47 357 1
+47 358 1
+47 541 1
+47 542 1
+47 543 1
+47 544 1
+47 545 1
+47 546 1
+47 547 1
+47 548 1
+47 549 1
+47 550 1
+47 551 1
+47 552 1
+47 553 1
+47 554 1
+47 555 1
+47 556 1
+47 557 1
+47 558 1
+47 559 1
+47 560 1
+47 561 1
+47 562 1
+47 563 1
+47 564 1
+47 565 1
+47 566 1
+47 567 1
+47 568 1
+47 569 1
+47 570 1
+47 571 1
+47 572 1
+47 573 1
+47 574 1
+47 575 1
+47 576 1
+47 577 1
+47 578 1
+47 579 1
+47 580 1
+47 581 1
+47 582 1
+47 583 1
+47 584 1
+47 585 1
+47 586 1
+47 587 1
+47 588 1
+47 589 1
+47 590 1
+47 591 1
+47 592 1
+47 593 1
+47 594 1
+47 595 1
+47 596 1
+47 793 1
+47 794 1
+47 795 1
+47 796 1
+47 797 1
+47 798 1
+47 799 1
+47 800 1
+47 801 1
+47 802 1
+47 803 1
+47 804 1
+47 805 1
+47 806 1
+47 807 1
+47 808 1
+47 809 1
+47 810 1
+47 811 1
+47 812 1
+47 813 1
+47 814 1
+47 815 1
+47 816 1
+47 817 1
+47 818 1
+47 819 1
+47 820 1
+47 1003 1
+47 1004 1
+47 1005 1
+47 1006 1
+47 1007 1
+47 1008 1
+47 1009 1
+47 1010 1
+47 1011 1
+47 1012 1
+47 1013 1
+47 1014 1
+47 1015 1
+47 1016 1
+47 1017 1
+47 1018 1
+47 1019 1
+47 1020 1
+47 1021 1
+47 1022 1
+47 1023 1
+47 1024 1
+47 1025 1
+47 1026 1
+47 1027 1
+47 1028 1
+47 1029 1
+47 1030 1
+47 1031 1
+47 1032 1
+47 1033 1
+47 1034 1
+47 1035 1
+47 1036 1
+47 1037 1
+47 1038 1
+47 1039 1
+47 1040 1
+47 1041 1
+47 1042 1
+47 1043 1
+47 1044 1
+47 1045 1
+47 1046 1
+47 1047 1
+47 1048 1
+47 1049 1
+47 1050 1
+47 1051 1
+47 1052 1
+47 1053 1
+47 1054 1
+47 1055 1
+47 1056 1
+47 1057 1
+47 1058 1
+47 1255 1
+47 1256 1
+47 1257 1
+47 1258 1
+47 1259 1
+47 1260 1
+47 1261 1
+47 1262 1
+47 1263 1
+47 1264 1
+47 1265 1
+47 1266 1
+47 1267 1
+47 1268 1
+47 1269 1
+47 1270 1
+47 1271 1
+47 1272 1
+47 1273 1
+47 1274 1
+47 1275 1
+47 1276 1
+47 1277 1
+47 1278 1
+47 1279 1
+47 1280 1
+47 1281 1
+47 1282 1
+47 1283 1
+47 1284 1
+47 1285 1
+47 1286 1
+47 1287 1
+47 1288 1
+47 1289 1
+47 1290 1
+47 1291 1
+47 1292 1
+47 1293 1
+47 1294 1
+47 1295 1
+47 1296 1
+47 1297 1
+47 1298 1
+47 1299 1
+47 1300 1
+47 1301 1
+47 1302 1
+47 1303 1
+47 1304 1
+47 1305 1
+47 1306 1
+47 1307 1
+47 1308 1
+47 1309 1
+47 1310 1
+47 1507 1
+47 1508 1
+47 1509 1
+47 1510 1
+47 1511 1
+47 1512 1
+47 1513 1
+47 1514 1
+47 1515 1
+47 1516 1
+47 1517 1
+47 1518 1
+47 1519 1
+47 1520 1
+47 1521 1
+47 1522 1
+47 1523 1
+47 1524 1
+47 1525 1
+47 1526 1
+47 1527 1
+47 1528 1
+47 1529 1
+47 1530 1
+47 1531 1
+47 1532 1
+47 1533 1
+47 1534 1
+47 1535 1
+47 1536 1
+47 1537 1
+47 1538 1
+47 1539 1
+47 1540 1
+47 1541 1
+47 1542 1
+47 1543 1
+47 1544 1
+47 1545 1
+47 1546 1
+47 1547 1
+47 1548 1
+47 1549 1
+47 1550 1
+47 1551 1
+47 1552 1
+47 1553 1
+47 1554 1
+47 1555 1
+47 1556 1
+47 1557 1
+47 1558 1
+47 1559 1
+47 1560 1
+47 1561 1
+47 1562 1
+47 1563 1
+47 1564 1
+47 1565 1
+47 1566 1
+47 1567 1
+47 1568 1
+47 1569 1
+47 1570 1
+47 1571 1
+47 1572 1
+47 1573 1
+47 1574 1
+47 1575 1
+47 1576 1
+47 1717 1
+47 1718 1
+47 1719 1
+47 1720 1
+47 1721 1
+47 1722 1
+47 1723 1
+47 1724 1
+47 1725 1
+47 1726 1
+47 1727 1
+47 1728 1
+47 1729 1
+47 1730 1
+47 1731 1
+47 1732 1
+47 1733 1
+47 1734 1
+47 1735 1
+47 1736 1
+47 1737 1
+47 1738 1
+47 1739 1
+47 1740 1
+47 1741 1
+47 1742 1
+47 1743 1
+47 1744 1
+47 1927 1
+47 1928 1
+47 1929 1
+47 1930 1
+47 1931 1
+47 1932 1
+47 1933 1
+47 1934 1
+47 1935 1
+47 1936 1
+47 1937 1
+47 1938 1
+47 1939 1
+47 1940 1
+47 1941 1
+47 1942 1
+47 1943 1
+47 1944 1
+47 1945 1
+47 1946 1
+47 1947 1
+47 1948 1
+47 1949 1
+47 1950 1
+47 1951 1
+47 1952 1
+47 1953 1
+47 1954 1
+47 1955 1
+47 1956 1
+47 1957 1
+47 1958 1
+47 1959 1
+47 1960 1
+47 1961 1
+47 1962 1
+47 1963 1
+47 1964 1
+47 1965 1
+47 1966 1
+47 1967 1
+47 1968 1
+47 1969 1
+47 1970 1
+47 1971 1
+47 1972 1
+47 1973 1
+47 1974 1
+47 1975 1
+47 1976 1
+47 1977 1
+47 1978 1
+47 1979 1
+47 1980 1
+47 1981 1
+47 1982 1
+47 2179 1
+47 2180 1
+47 2181 1
+47 2182 1
+47 2183 1
+47 2184 1
+47 2185 1
+47 2186 1
+47 2187 1
+47 2188 1
+47 2189 1
+47 2190 1
+47 2191 1
+47 2192 1
+47 2193 1
+47 2194 1
+47 2195 1
+47 2196 1
+47 2197 1
+47 2198 1
+47 2199 1
+47 2200 1
+47 2201 1
+47 2202 1
+47 2203 1
+47 2204 1
+47 2205 1
+47 2206 1
+47 2207 1
+47 2208 1
+47 2209 1
+47 2210 1
+47 2211 1
+47 2212 1
+47 2213 1
+47 2214 1
+47 2215 1
+47 2216 1
+47 2217 1
+47 2218 1
+47 2219 1
+47 2220 1
+47 2221 1
+47 2222 1
+47 2223 1
+47 2224 1
+47 2225 1
+47 2226 1
+47 2227 1
+47 2228 1
+47 2229 1
+47 2230 1
+47 2231 1
+47 2232 1
+47 2233 1
+47 2234 1
+47 2431 1
+47 2432 1
+47 2433 1
+47 2434 1
+47 2435 1
+47 2436 1
+47 2437 1
+47 2438 1
+47 2439 1
+47 2440 1
+47 2441 1
+47 2442 1
+47 2443 1
+47 2444 1
+47 2445 1
+47 2446 1
+47 2447 1
+47 2448 1
+47 2449 1
+47 2450 1
+47 2451 1
+47 2452 1
+47 2453 1
+47 2454 1
+47 2455 1
+47 2456 1
+47 2457 1
+47 2458 1
+47 2459 1
+47 2460 1
+47 2461 1
+47 2462 1
+47 2463 1
+47 2464 1
+47 2465 1
+47 2466 1
+47 2467 1
+47 2468 1
+47 2469 1
+47 2470 1
+47 2471 1
+47 2472 1
+47 2473 1
+47 2474 1
+47 2475 1
+47 2476 1
+47 2477 1
+47 2478 1
+47 2479 1
+47 2480 1
+47 2481 1
+47 2482 1
+47 2483 1
+47 2484 1
+47 2485 1
+47 2486 1
+47 2487 1
+47 2488 1
+47 2489 1
+47 2490 1
+47 2491 1
+47 2492 1
+47 2493 1
+47 2494 1
+47 2495 1
+47 2496 1
+47 2497 1
+47 2498 1
+47 2499 1
+47 2500 1
+47 2641 1
+47 2642 1
+47 2643 1
+47 2644 1
+47 2645 1
+47 2646 1
+47 2647 1
+47 2648 1
+47 2649 1
+47 2650 1
+47 2651 1
+47 2652 1
+47 2653 1
+47 2654 1
+47 2655 1
+47 2656 1
+47 2657 1
+47 2658 1
+47 2659 1
+47 2660 1
+47 2661 1
+47 2662 1
+47 2663 1
+47 2664 1
+47 2665 1
+47 2666 1
+47 2667 1
+47 2668 1
+47 2669 1
+47 2670 1
+47 2671 1
+47 2672 1
+47 2673 1
+47 2674 1
+47 2675 1
+47 2676 1
+47 2677 1
+47 2678 1
+47 2679 1
+47 2680 1
+47 2681 1
+47 2682 1
+47 2683 1
+47 2684 1
+47 2685 1
+47 2686 1
+47 2687 1
+47 2688 1
+47 2689 1
+47 2690 1
+47 2691 1
+47 2692 1
+47 2693 1
+47 2694 1
+47 2695 1
+47 2696 1
+47 2893 1
+47 2894 1
+47 2895 1
+47 2896 1
+47 2897 1
+47 2898 1
+47 2899 1
+47 2900 1
+47 2901 1
+47 2902 1
+47 2903 1
+47 2904 1
+47 2905 1
+47 2906 1
+47 2907 1
+47 2908 1
+47 2909 1
+47 2910 1
+47 2911 1
+47 2912 1
+47 2913 1
+47 2914 1
+47 2915 1
+47 2916 1
+47 2917 1
+47 2918 1
+47 2919 1
+47 2920 1
+47 2921 1
+47 2922 1
+47 2923 1
+47 2924 1
+47 2925 1
+47 2926 1
+47 2927 1
+47 2928 1
+47 2929 1
+47 2930 1
+47 2931 1
+47 2932 1
+47 2933 1
+47 2934 1
+47 2935 1
+47 2936 1
+47 2937 1
+47 2938 1
+47 2939 1
+47 2940 1
+47 2941 1
+47 2942 1
+47 2943 1
+47 2944 1
+47 2945 1
+47 2946 1
+47 2947 1
+47 2948 1
+47 2949 1
+47 2950 1
+47 2951 1
+47 2952 1
+47 2953 1
+47 2954 1
+47 2955 1
+47 2956 1
+47 2957 1
+47 2958 1
+47 2959 1
+47 2960 1
+47 2961 1
+47 2962 1
+47 3103 1
+47 3104 1
+47 3105 1
+47 3106 1
+47 3107 1
+47 3108 1
+47 3109 1
+47 3110 1
+47 3111 1
+47 3112 1
+47 3113 1
+47 3114 1
+47 3115 1
+47 3116 1
+47 3117 1
+47 3118 1
+47 3119 1
+47 3120 1
+47 3121 1
+47 3122 1
+47 3123 1
+47 3124 1
+47 3125 1
+47 3126 1
+47 3127 1
+47 3128 1
+47 3129 1
+47 3130 1
+47 3131 1
+47 3132 1
+47 3133 1
+47 3134 1
+47 3135 1
+47 3136 1
+47 3137 1
+47 3138 1
+47 3139 1
+47 3140 1
+47 3141 1
+47 3142 1
+47 3143 1
+47 3144 1
+47 3145 1
+47 3146 1
+47 3147 1
+47 3148 1
+47 3149 1
+47 3150 1
+47 3151 1
+47 3152 1
+47 3153 1
+47 3154 1
+47 3155 1
+47 3156 1
+47 3157 1
+47 3158 1
+47 3159 1
+47 3160 1
+47 3161 1
+47 3162 1
+47 3163 1
+47 3164 1
+47 3165 1
+47 3166 1
+47 3167 1
+47 3168 1
+47 3169 1
+47 3170 1
+47 3171 1
+47 3172 1
+47 3313 1
+47 3314 1
+47 3315 1
+47 3316 1
+47 3317 1
+47 3318 1
+47 3319 1
+47 3320 1
+47 3321 1
+47 3322 1
+47 3323 1
+47 3324 1
+47 3325 1
+47 3326 1
+47 3327 1
+47 3328 1
+47 3329 1
+47 3330 1
+47 3331 1
+47 3332 1
+47 3333 1
+47 3334 1
+47 3335 1
+47 3336 1
+47 3337 1
+47 3338 1
+47 3339 1
+47 3340 1
+47 3341 1
+47 3342 1
+47 3343 1
+47 3344 1
+47 3345 1
+47 3346 1
+47 3347 1
+47 3348 1
+47 3349 1
+47 3350 1
+47 3351 1
+47 3352 1
+47 3353 1
+47 3354 1
+47 3355 1
+47 3356 1
+47 3357 1
+47 3358 1
+47 3359 1
+47 3360 1
+47 3361 1
+47 3362 1
+47 3363 1
+47 3364 1
+47 3365 1
+47 3366 1
+47 3367 1
+47 3368 1
+48 1 1
+48 9 1
+48 10 1
+48 11 1
+48 12 1
+48 13 1
+48 14 1
+48 15 1
+48 121 1
+48 122 1
+48 123 1
+48 124 1
+48 125 1
+48 126 1
+48 127 1
+48 149 1
+48 150 1
+48 151 1
+48 152 1
+48 153 1
+48 154 1
+48 155 1
+48 156 1
+48 157 1
+48 158 1
+48 159 1
+48 160 1
+48 161 1
+48 162 1
+48 163 1
+48 164 1
+48 165 1
+48 166 1
+48 167 1
+48 168 1
+48 169 1
+48 331 1
+48 332 1
+48 333 1
+48 334 1
+48 335 1
+48 336 1
+48 337 1
+48 359 1
+48 360 1
+48 361 1
+48 362 1
+48 363 1
+48 364 1
+48 365 1
+48 366 1
+48 367 1
+48 368 1
+48 369 1
+48 370 1
+48 371 1
+48 372 1
+48 373 1
+48 374 1
+48 375 1
+48 376 1
+48 377 1
+48 378 1
+48 379 1
+48 541 1
+48 542 1
+48 543 1
+48 544 1
+48 545 1
+48 546 1
+48 547 1
+48 548 1
+48 549 1
+48 550 1
+48 551 1
+48 552 1
+48 553 1
+48 554 1
+48 555 1
+48 556 1
+48 557 1
+48 558 1
+48 559 1
+48 560 1
+48 561 1
+48 597 1
+48 598 1
+48 599 1
+48 600 1
+48 601 1
+48 602 1
+48 603 1
+48 604 1
+48 605 1
+48 606 1
+48 607 1
+48 608 1
+48 609 1
+48 610 1
+48 611 1
+48 612 1
+48 613 1
+48 614 1
+48 615 1
+48 616 1
+48 617 1
+48 618 1
+48 619 1
+48 620 1
+48 621 1
+48 622 1
+48 623 1
+48 624 1
+48 625 1
+48 626 1
+48 627 1
+48 628 1
+48 629 1
+48 630 1
+48 631 1
+48 793 1
+48 794 1
+48 795 1
+48 796 1
+48 797 1
+48 798 1
+48 799 1
+48 821 1
+48 822 1
+48 823 1
+48 824 1
+48 825 1
+48 826 1
+48 827 1
+48 828 1
+48 829 1
+48 830 1
+48 831 1
+48 832 1
+48 833 1
+48 834 1
+48 835 1
+48 836 1
+48 837 1
+48 838 1
+48 839 1
+48 840 1
+48 841 1
+48 1003 1
+48 1004 1
+48 1005 1
+48 1006 1
+48 1007 1
+48 1008 1
+48 1009 1
+48 1010 1
+48 1011 1
+48 1012 1
+48 1013 1
+48 1014 1
+48 1015 1
+48 1016 1
+48 1017 1
+48 1018 1
+48 1019 1
+48 1020 1
+48 1021 1
+48 1022 1
+48 1023 1
+48 1059 1
+48 1060 1
+48 1061 1
+48 1062 1
+48 1063 1
+48 1064 1
+48 1065 1
+48 1066 1
+48 1067 1
+48 1068 1
+48 1069 1
+48 1070 1
+48 1071 1
+48 1072 1
+48 1073 1
+48 1074 1
+48 1075 1
+48 1076 1
+48 1077 1
+48 1078 1
+48 1079 1
+48 1080 1
+48 1081 1
+48 1082 1
+48 1083 1
+48 1084 1
+48 1085 1
+48 1086 1
+48 1087 1
+48 1088 1
+48 1089 1
+48 1090 1
+48 1091 1
+48 1092 1
+48 1093 1
+48 1255 1
+48 1256 1
+48 1257 1
+48 1258 1
+48 1259 1
+48 1260 1
+48 1261 1
+48 1262 1
+48 1263 1
+48 1264 1
+48 1265 1
+48 1266 1
+48 1267 1
+48 1268 1
+48 1269 1
+48 1270 1
+48 1271 1
+48 1272 1
+48 1273 1
+48 1274 1
+48 1275 1
+48 1311 1
+48 1312 1
+48 1313 1
+48 1314 1
+48 1315 1
+48 1316 1
+48 1317 1
+48 1318 1
+48 1319 1
+48 1320 1
+48 1321 1
+48 1322 1
+48 1323 1
+48 1324 1
+48 1325 1
+48 1326 1
+48 1327 1
+48 1328 1
+48 1329 1
+48 1330 1
+48 1331 1
+48 1332 1
+48 1333 1
+48 1334 1
+48 1335 1
+48 1336 1
+48 1337 1
+48 1338 1
+48 1339 1
+48 1340 1
+48 1341 1
+48 1342 1
+48 1343 1
+48 1344 1
+48 1345 1
+48 1507 1
+48 1508 1
+48 1509 1
+48 1510 1
+48 1511 1
+48 1512 1
+48 1513 1
+48 1514 1
+48 1515 1
+48 1516 1
+48 1517 1
+48 1518 1
+48 1519 1
+48 1520 1
+48 1521 1
+48 1522 1
+48 1523 1
+48 1524 1
+48 1525 1
+48 1526 1
+48 1527 1
+48 1528 1
+48 1529 1
+48 1530 1
+48 1531 1
+48 1532 1
+48 1533 1
+48 1534 1
+48 1535 1
+48 1536 1
+48 1537 1
+48 1538 1
+48 1539 1
+48 1540 1
+48 1541 1
+48 1577 1
+48 1578 1
+48 1579 1
+48 1580 1
+48 1581 1
+48 1582 1
+48 1583 1
+48 1584 1
+48 1585 1
+48 1586 1
+48 1587 1
+48 1588 1
+48 1589 1
+48 1590 1
+48 1591 1
+48 1592 1
+48 1593 1
+48 1594 1
+48 1595 1
+48 1596 1
+48 1597 1
+48 1598 1
+48 1599 1
+48 1600 1
+48 1601 1
+48 1602 1
+48 1603 1
+48 1604 1
+48 1605 1
+48 1606 1
+48 1607 1
+48 1608 1
+48 1609 1
+48 1610 1
+48 1611 1
+48 1717 1
+48 1718 1
+48 1719 1
+48 1720 1
+48 1721 1
+48 1722 1
+48 1723 1
+48 1745 1
+48 1746 1
+48 1747 1
+48 1748 1
+48 1749 1
+48 1750 1
+48 1751 1
+48 1752 1
+48 1753 1
+48 1754 1
+48 1755 1
+48 1756 1
+48 1757 1
+48 1758 1
+48 1759 1
+48 1760 1
+48 1761 1
+48 1762 1
+48 1763 1
+48 1764 1
+48 1765 1
+48 1927 1
+48 1928 1
+48 1929 1
+48 1930 1
+48 1931 1
+48 1932 1
+48 1933 1
+48 1934 1
+48 1935 1
+48 1936 1
+48 1937 1
+48 1938 1
+48 1939 1
+48 1940 1
+48 1941 1
+48 1942 1
+48 1943 1
+48 1944 1
+48 1945 1
+48 1946 1
+48 1947 1
+48 1983 1
+48 1984 1
+48 1985 1
+48 1986 1
+48 1987 1
+48 1988 1
+48 1989 1
+48 1990 1
+48 1991 1
+48 1992 1
+48 1993 1
+48 1994 1
+48 1995 1
+48 1996 1
+48 1997 1
+48 1998 1
+48 1999 1
+48 2000 1
+48 2001 1
+48 2002 1
+48 2003 1
+48 2004 1
+48 2005 1
+48 2006 1
+48 2007 1
+48 2008 1
+48 2009 1
+48 2010 1
+48 2011 1
+48 2012 1
+48 2013 1
+48 2014 1
+48 2015 1
+48 2016 1
+48 2017 1
+48 2179 1
+48 2180 1
+48 2181 1
+48 2182 1
+48 2183 1
+48 2184 1
+48 2185 1
+48 2186 1
+48 2187 1
+48 2188 1
+48 2189 1
+48 2190 1
+48 2191 1
+48 2192 1
+48 2193 1
+48 2194 1
+48 2195 1
+48 2196 1
+48 2197 1
+48 2198 1
+48 2199 1
+48 2235 1
+48 2236 1
+48 2237 1
+48 2238 1
+48 2239 1
+48 2240 1
+48 2241 1
+48 2242 1
+48 2243 1
+48 2244 1
+48 2245 1
+48 2246 1
+48 2247 1
+48 2248 1
+48 2249 1
+48 2250 1
+48 2251 1
+48 2252 1
+48 2253 1
+48 2254 1
+48 2255 1
+48 2256 1
+48 2257 1
+48 2258 1
+48 2259 1
+48 2260 1
+48 2261 1
+48 2262 1
+48 2263 1
+48 2264 1
+48 2265 1
+48 2266 1
+48 2267 1
+48 2268 1
+48 2269 1
+48 2431 1
+48 2432 1
+48 2433 1
+48 2434 1
+48 2435 1
+48 2436 1
+48 2437 1
+48 2438 1
+48 2439 1
+48 2440 1
+48 2441 1
+48 2442 1
+48 2443 1
+48 2444 1
+48 2445 1
+48 2446 1
+48 2447 1
+48 2448 1
+48 2449 1
+48 2450 1
+48 2451 1
+48 2452 1
+48 2453 1
+48 2454 1
+48 2455 1
+48 2456 1
+48 2457 1
+48 2458 1
+48 2459 1
+48 2460 1
+48 2461 1
+48 2462 1
+48 2463 1
+48 2464 1
+48 2465 1
+48 2501 1
+48 2502 1
+48 2503 1
+48 2504 1
+48 2505 1
+48 2506 1
+48 2507 1
+48 2508 1
+48 2509 1
+48 2510 1
+48 2511 1
+48 2512 1
+48 2513 1
+48 2514 1
+48 2515 1
+48 2516 1
+48 2517 1
+48 2518 1
+48 2519 1
+48 2520 1
+48 2521 1
+48 2522 1
+48 2523 1
+48 2524 1
+48 2525 1
+48 2526 1
+48 2527 1
+48 2528 1
+48 2529 1
+48 2530 1
+48 2531 1
+48 2532 1
+48 2533 1
+48 2534 1
+48 2535 1
+48 2641 1
+48 2642 1
+48 2643 1
+48 2644 1
+48 2645 1
+48 2646 1
+48 2647 1
+48 2648 1
+48 2649 1
+48 2650 1
+48 2651 1
+48 2652 1
+48 2653 1
+48 2654 1
+48 2655 1
+48 2656 1
+48 2657 1
+48 2658 1
+48 2659 1
+48 2660 1
+48 2661 1
+48 2697 1
+48 2698 1
+48 2699 1
+48 2700 1
+48 2701 1
+48 2702 1
+48 2703 1
+48 2704 1
+48 2705 1
+48 2706 1
+48 2707 1
+48 2708 1
+48 2709 1
+48 2710 1
+48 2711 1
+48 2712 1
+48 2713 1
+48 2714 1
+48 2715 1
+48 2716 1
+48 2717 1
+48 2718 1
+48 2719 1
+48 2720 1
+48 2721 1
+48 2722 1
+48 2723 1
+48 2724 1
+48 2725 1
+48 2726 1
+48 2727 1
+48 2728 1
+48 2729 1
+48 2730 1
+48 2731 1
+48 2893 1
+48 2894 1
+48 2895 1
+48 2896 1
+48 2897 1
+48 2898 1
+48 2899 1
+48 2900 1
+48 2901 1
+48 2902 1
+48 2903 1
+48 2904 1
+48 2905 1
+48 2906 1
+48 2907 1
+48 2908 1
+48 2909 1
+48 2910 1
+48 2911 1
+48 2912 1
+48 2913 1
+48 2914 1
+48 2915 1
+48 2916 1
+48 2917 1
+48 2918 1
+48 2919 1
+48 2920 1
+48 2921 1
+48 2922 1
+48 2923 1
+48 2924 1
+48 2925 1
+48 2926 1
+48 2927 1
+48 2963 1
+48 2964 1
+48 2965 1
+48 2966 1
+48 2967 1
+48 2968 1
+48 2969 1
+48 2970 1
+48 2971 1
+48 2972 1
+48 2973 1
+48 2974 1
+48 2975 1
+48 2976 1
+48 2977 1
+48 2978 1
+48 2979 1
+48 2980 1
+48 2981 1
+48 2982 1
+48 2983 1
+48 2984 1
+48 2985 1
+48 2986 1
+48 2987 1
+48 2988 1
+48 2989 1
+48 2990 1
+48 2991 1
+48 2992 1
+48 2993 1
+48 2994 1
+48 2995 1
+48 2996 1
+48 2997 1
+48 3103 1
+48 3104 1
+48 3105 1
+48 3106 1
+48 3107 1
+48 3108 1
+48 3109 1
+48 3110 1
+48 3111 1
+48 3112 1
+48 3113 1
+48 3114 1
+48 3115 1
+48 3116 1
+48 3117 1
+48 3118 1
+48 3119 1
+48 3120 1
+48 3121 1
+48 3122 1
+48 3123 1
+48 3124 1
+48 3125 1
+48 3126 1
+48 3127 1
+48 3128 1
+48 3129 1
+48 3130 1
+48 3131 1
+48 3132 1
+48 3133 1
+48 3134 1
+48 3135 1
+48 3136 1
+48 3137 1
+48 3173 1
+48 3174 1
+48 3175 1
+48 3176 1
+48 3177 1
+48 3178 1
+48 3179 1
+48 3180 1
+48 3181 1
+48 3182 1
+48 3183 1
+48 3184 1
+48 3185 1
+48 3186 1
+48 3187 1
+48 3188 1
+48 3189 1
+48 3190 1
+48 3191 1
+48 3192 1
+48 3193 1
+48 3194 1
+48 3195 1
+48 3196 1
+48 3197 1
+48 3198 1
+48 3199 1
+48 3200 1
+48 3201 1
+48 3202 1
+48 3203 1
+48 3204 1
+48 3205 1
+48 3206 1
+48 3207 1
+48 3313 1
+48 3314 1
+48 3315 1
+48 3316 1
+48 3317 1
+48 3318 1
+48 3319 1
+48 3320 1
+48 3321 1
+48 3322 1
+48 3323 1
+48 3324 1
+48 3325 1
+48 3326 1
+48 3327 1
+48 3328 1
+48 3329 1
+48 3330 1
+48 3331 1
+48 3332 1
+48 3333 1
+48 3334 1
+48 3335 1
+48 3336 1
+48 3337 1
+48 3338 1
+48 3339 1
+48 3340 1
+48 3341 1
+48 3342 1
+48 3343 1
+48 3344 1
+48 3345 1
+48 3346 1
+48 3347 1
+48 3369 1
+48 3370 1
+48 3371 1
+48 3372 1
+48 3373 1
+48 3374 1
+48 3375 1
+48 3376 1
+48 3377 1
+48 3378 1
+48 3379 1
+48 3380 1
+48 3381 1
+48 3382 1
+48 3383 1
+48 3384 1
+48 3385 1
+48 3386 1
+48 3387 1
+48 3388 1
+48 3389 1
+49 2 1
+49 9 1
+49 16 1
+49 17 1
+49 18 1
+49 19 1
+49 20 1
+49 21 1
+49 121 1
+49 128 1
+49 129 1
+49 130 1
+49 131 1
+49 132 1
+49 133 1
+49 149 1
+49 150 1
+49 151 1
+49 152 1
+49 153 1
+49 154 1
+49 170 1
+49 171 1
+49 172 1
+49 173 1
+49 174 1
+49 175 1
+49 176 1
+49 177 1
+49 178 1
+49 179 1
+49 180 1
+49 181 1
+49 182 1
+49 183 1
+49 184 1
+49 331 1
+49 338 1
+49 339 1
+49 340 1
+49 341 1
+49 342 1
+49 343 1
+49 359 1
+49 360 1
+49 361 1
+49 362 1
+49 363 1
+49 364 1
+49 380 1
+49 381 1
+49 382 1
+49 383 1
+49 384 1
+49 385 1
+49 386 1
+49 387 1
+49 388 1
+49 389 1
+49 390 1
+49 391 1
+49 392 1
+49 393 1
+49 394 1
+49 541 1
+49 542 1
+49 543 1
+49 544 1
+49 545 1
+49 546 1
+49 562 1
+49 563 1
+49 564 1
+49 565 1
+49 566 1
+49 567 1
+49 568 1
+49 569 1
+49 570 1
+49 571 1
+49 572 1
+49 573 1
+49 574 1
+49 575 1
+49 576 1
+49 597 1
+49 598 1
+49 599 1
+49 600 1
+49 601 1
+49 602 1
+49 603 1
+49 604 1
+49 605 1
+49 606 1
+49 607 1
+49 608 1
+49 609 1
+49 610 1
+49 611 1
+49 632 1
+49 633 1
+49 634 1
+49 635 1
+49 636 1
+49 637 1
+49 638 1
+49 639 1
+49 640 1
+49 641 1
+49 642 1
+49 643 1
+49 644 1
+49 645 1
+49 646 1
+49 647 1
+49 648 1
+49 649 1
+49 650 1
+49 651 1
+49 793 1
+49 800 1
+49 801 1
+49 802 1
+49 803 1
+49 804 1
+49 805 1
+49 821 1
+49 822 1
+49 823 1
+49 824 1
+49 825 1
+49 826 1
+49 842 1
+49 843 1
+49 844 1
+49 845 1
+49 846 1
+49 847 1
+49 848 1
+49 849 1
+49 850 1
+49 851 1
+49 852 1
+49 853 1
+49 854 1
+49 855 1
+49 856 1
+49 1003 1
+49 1004 1
+49 1005 1
+49 1006 1
+49 1007 1
+49 1008 1
+49 1024 1
+49 1025 1
+49 1026 1
+49 1027 1
+49 1028 1
+49 1029 1
+49 1030 1
+49 1031 1
+49 1032 1
+49 1033 1
+49 1034 1
+49 1035 1
+49 1036 1
+49 1037 1
+49 1038 1
+49 1059 1
+49 1060 1
+49 1061 1
+49 1062 1
+49 1063 1
+49 1064 1
+49 1065 1
+49 1066 1
+49 1067 1
+49 1068 1
+49 1069 1
+49 1070 1
+49 1071 1
+49 1072 1
+49 1073 1
+49 1094 1
+49 1095 1
+49 1096 1
+49 1097 1
+49 1098 1
+49 1099 1
+49 1100 1
+49 1101 1
+49 1102 1
+49 1103 1
+49 1104 1
+49 1105 1
+49 1106 1
+49 1107 1
+49 1108 1
+49 1109 1
+49 1110 1
+49 1111 1
+49 1112 1
+49 1113 1
+49 1255 1
+49 1256 1
+49 1257 1
+49 1258 1
+49 1259 1
+49 1260 1
+49 1276 1
+49 1277 1
+49 1278 1
+49 1279 1
+49 1280 1
+49 1281 1
+49 1282 1
+49 1283 1
+49 1284 1
+49 1285 1
+49 1286 1
+49 1287 1
+49 1288 1
+49 1289 1
+49 1290 1
+49 1311 1
+49 1312 1
+49 1313 1
+49 1314 1
+49 1315 1
+49 1316 1
+49 1317 1
+49 1318 1
+49 1319 1
+49 1320 1
+49 1321 1
+49 1322 1
+49 1323 1
+49 1324 1
+49 1325 1
+49 1346 1
+49 1347 1
+49 1348 1
+49 1349 1
+49 1350 1
+49 1351 1
+49 1352 1
+49 1353 1
+49 1354 1
+49 1355 1
+49 1356 1
+49 1357 1
+49 1358 1
+49 1359 1
+49 1360 1
+49 1361 1
+49 1362 1
+49 1363 1
+49 1364 1
+49 1365 1
+49 1507 1
+49 1508 1
+49 1509 1
+49 1510 1
+49 1511 1
+49 1512 1
+49 1513 1
+49 1514 1
+49 1515 1
+49 1516 1
+49 1517 1
+49 1518 1
+49 1519 1
+49 1520 1
+49 1521 1
+49 1542 1
+49 1543 1
+49 1544 1
+49 1545 1
+49 1546 1
+49 1547 1
+49 1548 1
+49 1549 1
+49 1550 1
+49 1551 1
+49 1552 1
+49 1553 1
+49 1554 1
+49 1555 1
+49 1556 1
+49 1557 1
+49 1558 1
+49 1559 1
+49 1560 1
+49 1561 1
+49 1577 1
+49 1578 1
+49 1579 1
+49 1580 1
+49 1581 1
+49 1582 1
+49 1583 1
+49 1584 1
+49 1585 1
+49 1586 1
+49 1587 1
+49 1588 1
+49 1589 1
+49 1590 1
+49 1591 1
+49 1592 1
+49 1593 1
+49 1594 1
+49 1595 1
+49 1596 1
+49 1612 1
+49 1613 1
+49 1614 1
+49 1615 1
+49 1616 1
+49 1617 1
+49 1618 1
+49 1619 1
+49 1620 1
+49 1621 1
+49 1622 1
+49 1623 1
+49 1624 1
+49 1625 1
+49 1626 1
+49 1717 1
+49 1724 1
+49 1725 1
+49 1726 1
+49 1727 1
+49 1728 1
+49 1729 1
+49 1745 1
+49 1746 1
+49 1747 1
+49 1748 1
+49 1749 1
+49 1750 1
+49 1766 1
+49 1767 1
+49 1768 1
+49 1769 1
+49 1770 1
+49 1771 1
+49 1772 1
+49 1773 1
+49 1774 1
+49 1775 1
+49 1776 1
+49 1777 1
+49 1778 1
+49 1779 1
+49 1780 1
+49 1927 1
+49 1928 1
+49 1929 1
+49 1930 1
+49 1931 1
+49 1932 1
+49 1948 1
+49 1949 1
+49 1950 1
+49 1951 1
+49 1952 1
+49 1953 1
+49 1954 1
+49 1955 1
+49 1956 1
+49 1957 1
+49 1958 1
+49 1959 1
+49 1960 1
+49 1961 1
+49 1962 1
+49 1983 1
+49 1984 1
+49 1985 1
+49 1986 1
+49 1987 1
+49 1988 1
+49 1989 1
+49 1990 1
+49 1991 1
+49 1992 1
+49 1993 1
+49 1994 1
+49 1995 1
+49 1996 1
+49 1997 1
+49 2018 1
+49 2019 1
+49 2020 1
+49 2021 1
+49 2022 1
+49 2023 1
+49 2024 1
+49 2025 1
+49 2026 1
+49 2027 1
+49 2028 1
+49 2029 1
+49 2030 1
+49 2031 1
+49 2032 1
+49 2033 1
+49 2034 1
+49 2035 1
+49 2036 1
+49 2037 1
+49 2179 1
+49 2180 1
+49 2181 1
+49 2182 1
+49 2183 1
+49 2184 1
+49 2200 1
+49 2201 1
+49 2202 1
+49 2203 1
+49 2204 1
+49 2205 1
+49 2206 1
+49 2207 1
+49 2208 1
+49 2209 1
+49 2210 1
+49 2211 1
+49 2212 1
+49 2213 1
+49 2214 1
+49 2235 1
+49 2236 1
+49 2237 1
+49 2238 1
+49 2239 1
+49 2240 1
+49 2241 1
+49 2242 1
+49 2243 1
+49 2244 1
+49 2245 1
+49 2246 1
+49 2247 1
+49 2248 1
+49 2249 1
+49 2270 1
+49 2271 1
+49 2272 1
+49 2273 1
+49 2274 1
+49 2275 1
+49 2276 1
+49 2277 1
+49 2278 1
+49 2279 1
+49 2280 1
+49 2281 1
+49 2282 1
+49 2283 1
+49 2284 1
+49 2285 1
+49 2286 1
+49 2287 1
+49 2288 1
+49 2289 1
+49 2431 1
+49 2432 1
+49 2433 1
+49 2434 1
+49 2435 1
+49 2436 1
+49 2437 1
+49 2438 1
+49 2439 1
+49 2440 1
+49 2441 1
+49 2442 1
+49 2443 1
+49 2444 1
+49 2445 1
+49 2466 1
+49 2467 1
+49 2468 1
+49 2469 1
+49 2470 1
+49 2471 1
+49 2472 1
+49 2473 1
+49 2474 1
+49 2475 1
+49 2476 1
+49 2477 1
+49 2478 1
+49 2479 1
+49 2480 1
+49 2481 1
+49 2482 1
+49 2483 1
+49 2484 1
+49 2485 1
+49 2501 1
+49 2502 1
+49 2503 1
+49 2504 1
+49 2505 1
+49 2506 1
+49 2507 1
+49 2508 1
+49 2509 1
+49 2510 1
+49 2511 1
+49 2512 1
+49 2513 1
+49 2514 1
+49 2515 1
+49 2516 1
+49 2517 1
+49 2518 1
+49 2519 1
+49 2520 1
+49 2536 1
+49 2537 1
+49 2538 1
+49 2539 1
+49 2540 1
+49 2541 1
+49 2542 1
+49 2543 1
+49 2544 1
+49 2545 1
+49 2546 1
+49 2547 1
+49 2548 1
+49 2549 1
+49 2550 1
+49 2641 1
+49 2642 1
+49 2643 1
+49 2644 1
+49 2645 1
+49 2646 1
+49 2662 1
+49 2663 1
+49 2664 1
+49 2665 1
+49 2666 1
+49 2667 1
+49 2668 1
+49 2669 1
+49 2670 1
+49 2671 1
+49 2672 1
+49 2673 1
+49 2674 1
+49 2675 1
+49 2676 1
+49 2697 1
+49 2698 1
+49 2699 1
+49 2700 1
+49 2701 1
+49 2702 1
+49 2703 1
+49 2704 1
+49 2705 1
+49 2706 1
+49 2707 1
+49 2708 1
+49 2709 1
+49 2710 1
+49 2711 1
+49 2732 1
+49 2733 1
+49 2734 1
+49 2735 1
+49 2736 1
+49 2737 1
+49 2738 1
+49 2739 1
+49 2740 1
+49 2741 1
+49 2742 1
+49 2743 1
+49 2744 1
+49 2745 1
+49 2746 1
+49 2747 1
+49 2748 1
+49 2749 1
+49 2750 1
+49 2751 1
+49 2893 1
+49 2894 1
+49 2895 1
+49 2896 1
+49 2897 1
+49 2898 1
+49 2899 1
+49 2900 1
+49 2901 1
+49 2902 1
+49 2903 1
+49 2904 1
+49 2905 1
+49 2906 1
+49 2907 1
+49 2928 1
+49 2929 1
+49 2930 1
+49 2931 1
+49 2932 1
+49 2933 1
+49 2934 1
+49 2935 1
+49 2936 1
+49 2937 1
+49 2938 1
+49 2939 1
+49 2940 1
+49 2941 1
+49 2942 1
+49 2943 1
+49 2944 1
+49 2945 1
+49 2946 1
+49 2947 1
+49 2963 1
+49 2964 1
+49 2965 1
+49 2966 1
+49 2967 1
+49 2968 1
+49 2969 1
+49 2970 1
+49 2971 1
+49 2972 1
+49 2973 1
+49 2974 1
+49 2975 1
+49 2976 1
+49 2977 1
+49 2978 1
+49 2979 1
+49 2980 1
+49 2981 1
+49 2982 1
+49 2998 1
+49 2999 1
+49 3000 1
+49 3001 1
+49 3002 1
+49 3003 1
+49 3004 1
+49 3005 1
+49 3006 1
+49 3007 1
+49 3008 1
+49 3009 1
+49 3010 1
+49 3011 1
+49 3012 1
+49 3103 1
+49 3104 1
+49 3105 1
+49 3106 1
+49 3107 1
+49 3108 1
+49 3109 1
+49 3110 1
+49 3111 1
+49 3112 1
+49 3113 1
+49 3114 1
+49 3115 1
+49 3116 1
+49 3117 1
+49 3138 1
+49 3139 1
+49 3140 1
+49 3141 1
+49 3142 1
+49 3143 1
+49 3144 1
+49 3145 1
+49 3146 1
+49 3147 1
+49 3148 1
+49 3149 1
+49 3150 1
+49 3151 1
+49 3152 1
+49 3153 1
+49 3154 1
+49 3155 1
+49 3156 1
+49 3157 1
+49 3173 1
+49 3174 1
+49 3175 1
+49 3176 1
+49 3177 1
+49 3178 1
+49 3179 1
+49 3180 1
+49 3181 1
+49 3182 1
+49 3183 1
+49 3184 1
+49 3185 1
+49 3186 1
+49 3187 1
+49 3188 1
+49 3189 1
+49 3190 1
+49 3191 1
+49 3192 1
+49 3208 1
+49 3209 1
+49 3210 1
+49 3211 1
+49 3212 1
+49 3213 1
+49 3214 1
+49 3215 1
+49 3216 1
+49 3217 1
+49 3218 1
+49 3219 1
+49 3220 1
+49 3221 1
+49 3222 1
+49 3313 1
+49 3314 1
+49 3315 1
+49 3316 1
+49 3317 1
+49 3318 1
+49 3319 1
+49 3320 1
+49 3321 1
+49 3322 1
+49 3323 1
+49 3324 1
+49 3325 1
+49 3326 1
+49 3327 1
+49 3328 1
+49 3329 1
+49 3330 1
+49 3331 1
+49 3332 1
+49 3348 1
+49 3349 1
+49 3350 1
+49 3351 1
+49 3352 1
+49 3353 1
+49 3354 1
+49 3355 1
+49 3356 1
+49 3357 1
+49 3358 1
+49 3359 1
+49 3360 1
+49 3361 1
+49 3362 1
+49 3369 1
+49 3370 1
+49 3371 1
+49 3372 1
+49 3373 1
+49 3374 1
+49 3375 1
+49 3376 1
+49 3377 1
+49 3378 1
+49 3379 1
+49 3380 1
+49 3381 1
+49 3382 1
+49 3383 1
+49 3390 1
+49 3391 1
+49 3392 1
+49 3393 1
+49 3394 1
+49 3395 1
+50 3 1
+50 10 1
+50 16 1
+50 22 1
+50 23 1
+50 24 1
+50 25 1
+50 26 1
+50 122 1
+50 128 1
+50 134 1
+50 135 1
+50 136 1
+50 137 1
+50 138 1
+50 149 1
+50 155 1
+50 156 1
+50 157 1
+50 158 1
+50 159 1
+50 170 1
+50 171 1
+50 172 1
+50 173 1
+50 174 1
+50 185 1
+50 186 1
+50 187 1
+50 188 1
+50 189 1
+50 190 1
+50 191 1
+50 192 1
+50 193 1
+50 194 1
+50 332 1
+50 338 1
+50 344 1
+50 345 1
+50 346 1
+50 347 1
+50 348 1
+50 359 1
+50 365 1
+50 366 1
+50 367 1
+50 368 1
+50 369 1
+50 380 1
+50 381 1
+50 382 1
+50 383 1
+50 384 1
+50 395 1
+50 396 1
+50 397 1
+50 398 1
+50 399 1
+50 400 1
+50 401 1
+50 402 1
+50 403 1
+50 404 1
+50 541 1
+50 547 1
+50 548 1
+50 549 1
+50 550 1
+50 551 1
+50 562 1
+50 563 1
+50 564 1
+50 565 1
+50 566 1
+50 577 1
+50 578 1
+50 579 1
+50 580 1
+50 581 1
+50 582 1
+50 583 1
+50 584 1
+50 585 1
+50 586 1
+50 597 1
+50 598 1
+50 599 1
+50 600 1
+50 601 1
+50 612 1
+50 613 1
+50 614 1
+50 615 1
+50 616 1
+50 617 1
+50 618 1
+50 619 1
+50 620 1
+50 621 1
+50 632 1
+50 633 1
+50 634 1
+50 635 1
+50 636 1
+50 637 1
+50 638 1
+50 639 1
+50 640 1
+50 641 1
+50 652 1
+50 653 1
+50 654 1
+50 655 1
+50 656 1
+50 657 1
+50 658 1
+50 659 1
+50 660 1
+50 661 1
+50 794 1
+50 800 1
+50 806 1
+50 807 1
+50 808 1
+50 809 1
+50 810 1
+50 821 1
+50 827 1
+50 828 1
+50 829 1
+50 830 1
+50 831 1
+50 842 1
+50 843 1
+50 844 1
+50 845 1
+50 846 1
+50 857 1
+50 858 1
+50 859 1
+50 860 1
+50 861 1
+50 862 1
+50 863 1
+50 864 1
+50 865 1
+50 866 1
+50 1003 1
+50 1009 1
+50 1010 1
+50 1011 1
+50 1012 1
+50 1013 1
+50 1024 1
+50 1025 1
+50 1026 1
+50 1027 1
+50 1028 1
+50 1039 1
+50 1040 1
+50 1041 1
+50 1042 1
+50 1043 1
+50 1044 1
+50 1045 1
+50 1046 1
+50 1047 1
+50 1048 1
+50 1059 1
+50 1060 1
+50 1061 1
+50 1062 1
+50 1063 1
+50 1074 1
+50 1075 1
+50 1076 1
+50 1077 1
+50 1078 1
+50 1079 1
+50 1080 1
+50 1081 1
+50 1082 1
+50 1083 1
+50 1094 1
+50 1095 1
+50 1096 1
+50 1097 1
+50 1098 1
+50 1099 1
+50 1100 1
+50 1101 1
+50 1102 1
+50 1103 1
+50 1114 1
+50 1115 1
+50 1116 1
+50 1117 1
+50 1118 1
+50 1119 1
+50 1120 1
+50 1121 1
+50 1122 1
+50 1123 1
+50 1255 1
+50 1261 1
+50 1262 1
+50 1263 1
+50 1264 1
+50 1265 1
+50 1276 1
+50 1277 1
+50 1278 1
+50 1279 1
+50 1280 1
+50 1291 1
+50 1292 1
+50 1293 1
+50 1294 1
+50 1295 1
+50 1296 1
+50 1297 1
+50 1298 1
+50 1299 1
+50 1300 1
+50 1311 1
+50 1312 1
+50 1313 1
+50 1314 1
+50 1315 1
+50 1326 1
+50 1327 1
+50 1328 1
+50 1329 1
+50 1330 1
+50 1331 1
+50 1332 1
+50 1333 1
+50 1334 1
+50 1335 1
+50 1346 1
+50 1347 1
+50 1348 1
+50 1349 1
+50 1350 1
+50 1351 1
+50 1352 1
+50 1353 1
+50 1354 1
+50 1355 1
+50 1366 1
+50 1367 1
+50 1368 1
+50 1369 1
+50 1370 1
+50 1371 1
+50 1372 1
+50 1373 1
+50 1374 1
+50 1375 1
+50 1507 1
+50 1508 1
+50 1509 1
+50 1510 1
+50 1511 1
+50 1522 1
+50 1523 1
+50 1524 1
+50 1525 1
+50 1526 1
+50 1527 1
+50 1528 1
+50 1529 1
+50 1530 1
+50 1531 1
+50 1542 1
+50 1543 1
+50 1544 1
+50 1545 1
+50 1546 1
+50 1547 1
+50 1548 1
+50 1549 1
+50 1550 1
+50 1551 1
+50 1562 1
+50 1563 1
+50 1564 1
+50 1565 1
+50 1566 1
+50 1567 1
+50 1568 1
+50 1569 1
+50 1570 1
+50 1571 1
+50 1577 1
+50 1578 1
+50 1579 1
+50 1580 1
+50 1581 1
+50 1582 1
+50 1583 1
+50 1584 1
+50 1585 1
+50 1586 1
+50 1597 1
+50 1598 1
+50 1599 1
+50 1600 1
+50 1601 1
+50 1602 1
+50 1603 1
+50 1604 1
+50 1605 1
+50 1606 1
+50 1612 1
+50 1613 1
+50 1614 1
+50 1615 1
+50 1616 1
+50 1617 1
+50 1618 1
+50 1619 1
+50 1620 1
+50 1621 1
+50 1627 1
+50 1628 1
+50 1629 1
+50 1630 1
+50 1631 1
+50 1718 1
+50 1724 1
+50 1730 1
+50 1731 1
+50 1732 1
+50 1733 1
+50 1734 1
+50 1745 1
+50 1751 1
+50 1752 1
+50 1753 1
+50 1754 1
+50 1755 1
+50 1766 1
+50 1767 1
+50 1768 1
+50 1769 1
+50 1770 1
+50 1781 1
+50 1782 1
+50 1783 1
+50 1784 1
+50 1785 1
+50 1786 1
+50 1787 1
+50 1788 1
+50 1789 1
+50 1790 1
+50 1927 1
+50 1933 1
+50 1934 1
+50 1935 1
+50 1936 1
+50 1937 1
+50 1948 1
+50 1949 1
+50 1950 1
+50 1951 1
+50 1952 1
+50 1963 1
+50 1964 1
+50 1965 1
+50 1966 1
+50 1967 1
+50 1968 1
+50 1969 1
+50 1970 1
+50 1971 1
+50 1972 1
+50 1983 1
+50 1984 1
+50 1985 1
+50 1986 1
+50 1987 1
+50 1998 1
+50 1999 1
+50 2000 1
+50 2001 1
+50 2002 1
+50 2003 1
+50 2004 1
+50 2005 1
+50 2006 1
+50 2007 1
+50 2018 1
+50 2019 1
+50 2020 1
+50 2021 1
+50 2022 1
+50 2023 1
+50 2024 1
+50 2025 1
+50 2026 1
+50 2027 1
+50 2038 1
+50 2039 1
+50 2040 1
+50 2041 1
+50 2042 1
+50 2043 1
+50 2044 1
+50 2045 1
+50 2046 1
+50 2047 1
+50 2179 1
+50 2185 1
+50 2186 1
+50 2187 1
+50 2188 1
+50 2189 1
+50 2200 1
+50 2201 1
+50 2202 1
+50 2203 1
+50 2204 1
+50 2215 1
+50 2216 1
+50 2217 1
+50 2218 1
+50 2219 1
+50 2220 1
+50 2221 1
+50 2222 1
+50 2223 1
+50 2224 1
+50 2235 1
+50 2236 1
+50 2237 1
+50 2238 1
+50 2239 1
+50 2250 1
+50 2251 1
+50 2252 1
+50 2253 1
+50 2254 1
+50 2255 1
+50 2256 1
+50 2257 1
+50 2258 1
+50 2259 1
+50 2270 1
+50 2271 1
+50 2272 1
+50 2273 1
+50 2274 1
+50 2275 1
+50 2276 1
+50 2277 1
+50 2278 1
+50 2279 1
+50 2290 1
+50 2291 1
+50 2292 1
+50 2293 1
+50 2294 1
+50 2295 1
+50 2296 1
+50 2297 1
+50 2298 1
+50 2299 1
+50 2431 1
+50 2432 1
+50 2433 1
+50 2434 1
+50 2435 1
+50 2446 1
+50 2447 1
+50 2448 1
+50 2449 1
+50 2450 1
+50 2451 1
+50 2452 1
+50 2453 1
+50 2454 1
+50 2455 1
+50 2466 1
+50 2467 1
+50 2468 1
+50 2469 1
+50 2470 1
+50 2471 1
+50 2472 1
+50 2473 1
+50 2474 1
+50 2475 1
+50 2486 1
+50 2487 1
+50 2488 1
+50 2489 1
+50 2490 1
+50 2491 1
+50 2492 1
+50 2493 1
+50 2494 1
+50 2495 1
+50 2501 1
+50 2502 1
+50 2503 1
+50 2504 1
+50 2505 1
+50 2506 1
+50 2507 1
+50 2508 1
+50 2509 1
+50 2510 1
+50 2521 1
+50 2522 1
+50 2523 1
+50 2524 1
+50 2525 1
+50 2526 1
+50 2527 1
+50 2528 1
+50 2529 1
+50 2530 1
+50 2536 1
+50 2537 1
+50 2538 1
+50 2539 1
+50 2540 1
+50 2541 1
+50 2542 1
+50 2543 1
+50 2544 1
+50 2545 1
+50 2551 1
+50 2552 1
+50 2553 1
+50 2554 1
+50 2555 1
+50 2641 1
+50 2647 1
+50 2648 1
+50 2649 1
+50 2650 1
+50 2651 1
+50 2662 1
+50 2663 1
+50 2664 1
+50 2665 1
+50 2666 1
+50 2677 1
+50 2678 1
+50 2679 1
+50 2680 1
+50 2681 1
+50 2682 1
+50 2683 1
+50 2684 1
+50 2685 1
+50 2686 1
+50 2697 1
+50 2698 1
+50 2699 1
+50 2700 1
+50 2701 1
+50 2712 1
+50 2713 1
+50 2714 1
+50 2715 1
+50 2716 1
+50 2717 1
+50 2718 1
+50 2719 1
+50 2720 1
+50 2721 1
+50 2732 1
+50 2733 1
+50 2734 1
+50 2735 1
+50 2736 1
+50 2737 1
+50 2738 1
+50 2739 1
+50 2740 1
+50 2741 1
+50 2752 1
+50 2753 1
+50 2754 1
+50 2755 1
+50 2756 1
+50 2757 1
+50 2758 1
+50 2759 1
+50 2760 1
+50 2761 1
+50 2893 1
+50 2894 1
+50 2895 1
+50 2896 1
+50 2897 1
+50 2908 1
+50 2909 1
+50 2910 1
+50 2911 1
+50 2912 1
+50 2913 1
+50 2914 1
+50 2915 1
+50 2916 1
+50 2917 1
+50 2928 1
+50 2929 1
+50 2930 1
+50 2931 1
+50 2932 1
+50 2933 1
+50 2934 1
+50 2935 1
+50 2936 1
+50 2937 1
+50 2948 1
+50 2949 1
+50 2950 1
+50 2951 1
+50 2952 1
+50 2953 1
+50 2954 1
+50 2955 1
+50 2956 1
+50 2957 1
+50 2963 1
+50 2964 1
+50 2965 1
+50 2966 1
+50 2967 1
+50 2968 1
+50 2969 1
+50 2970 1
+50 2971 1
+50 2972 1
+50 2983 1
+50 2984 1
+50 2985 1
+50 2986 1
+50 2987 1
+50 2988 1
+50 2989 1
+50 2990 1
+50 2991 1
+50 2992 1
+50 2998 1
+50 2999 1
+50 3000 1
+50 3001 1
+50 3002 1
+50 3003 1
+50 3004 1
+50 3005 1
+50 3006 1
+50 3007 1
+50 3013 1
+50 3014 1
+50 3015 1
+50 3016 1
+50 3017 1
+50 3103 1
+50 3104 1
+50 3105 1
+50 3106 1
+50 3107 1
+50 3118 1
+50 3119 1
+50 3120 1
+50 3121 1
+50 3122 1
+50 3123 1
+50 3124 1
+50 3125 1
+50 3126 1
+50 3127 1
+50 3138 1
+50 3139 1
+50 3140 1
+50 3141 1
+50 3142 1
+50 3143 1
+50 3144 1
+50 3145 1
+50 3146 1
+50 3147 1
+50 3158 1
+50 3159 1
+50 3160 1
+50 3161 1
+50 3162 1
+50 3163 1
+50 3164 1
+50 3165 1
+50 3166 1
+50 3167 1
+50 3173 1
+50 3174 1
+50 3175 1
+50 3176 1
+50 3177 1
+50 3178 1
+50 3179 1
+50 3180 1
+50 3181 1
+50 3182 1
+50 3193 1
+50 3194 1
+50 3195 1
+50 3196 1
+50 3197 1
+50 3198 1
+50 3199 1
+50 3200 1
+50 3201 1
+50 3202 1
+50 3208 1
+50 3209 1
+50 3210 1
+50 3211 1
+50 3212 1
+50 3213 1
+50 3214 1
+50 3215 1
+50 3216 1
+50 3217 1
+50 3223 1
+50 3224 1
+50 3225 1
+50 3226 1
+50 3227 1
+50 3313 1
+50 3314 1
+50 3315 1
+50 3316 1
+50 3317 1
+50 3318 1
+50 3319 1
+50 3320 1
+50 3321 1
+50 3322 1
+50 3333 1
+50 3334 1
+50 3335 1
+50 3336 1
+50 3337 1
+50 3338 1
+50 3339 1
+50 3340 1
+50 3341 1
+50 3342 1
+50 3348 1
+50 3349 1
+50 3350 1
+50 3351 1
+50 3352 1
+50 3353 1
+50 3354 1
+50 3355 1
+50 3356 1
+50 3357 1
+50 3363 1
+50 3364 1
+50 3365 1
+50 3366 1
+50 3367 1
+50 3369 1
+50 3370 1
+50 3371 1
+50 3372 1
+50 3373 1
+50 3374 1
+50 3375 1
+50 3376 1
+50 3377 1
+50 3378 1
+50 3384 1
+50 3385 1
+50 3386 1
+50 3387 1
+50 3388 1
+50 3390 1
+50 3391 1
+50 3392 1
+50 3393 1
+50 3394 1
+50 3396 1
+51 4 1
+51 11 1
+51 17 1
+51 22 1
+51 27 1
+51 28 1
+51 29 1
+51 30 1
+51 123 1
+51 129 1
+51 134 1
+51 139 1
+51 140 1
+51 141 1
+51 142 1
+51 150 1
+51 155 1
+51 160 1
+51 161 1
+51 162 1
+51 163 1
+51 170 1
+51 175 1
+51 176 1
+51 177 1
+51 178 1
+51 185 1
+51 186 1
+51 187 1
+51 188 1
+51 195 1
+51 196 1
+51 197 1
+51 198 1
+51 199 1
+51 200 1
+51 333 1
+51 339 1
+51 344 1
+51 349 1
+51 350 1
+51 351 1
+51 352 1
+51 360 1
+51 365 1
+51 370 1
+51 371 1
+51 372 1
+51 373 1
+51 380 1
+51 385 1
+51 386 1
+51 387 1
+51 388 1
+51 395 1
+51 396 1
+51 397 1
+51 398 1
+51 405 1
+51 406 1
+51 407 1
+51 408 1
+51 409 1
+51 410 1
+51 542 1
+51 547 1
+51 552 1
+51 553 1
+51 554 1
+51 555 1
+51 562 1
+51 567 1
+51 568 1
+51 569 1
+51 570 1
+51 577 1
+51 578 1
+51 579 1
+51 580 1
+51 587 1
+51 588 1
+51 589 1
+51 590 1
+51 591 1
+51 592 1
+51 597 1
+51 602 1
+51 603 1
+51 604 1
+51 605 1
+51 612 1
+51 613 1
+51 614 1
+51 615 1
+51 622 1
+51 623 1
+51 624 1
+51 625 1
+51 626 1
+51 627 1
+51 632 1
+51 633 1
+51 634 1
+51 635 1
+51 642 1
+51 643 1
+51 644 1
+51 645 1
+51 646 1
+51 647 1
+51 652 1
+51 653 1
+51 654 1
+51 655 1
+51 656 1
+51 657 1
+51 662 1
+51 663 1
+51 664 1
+51 665 1
+51 795 1
+51 801 1
+51 806 1
+51 811 1
+51 812 1
+51 813 1
+51 814 1
+51 822 1
+51 827 1
+51 832 1
+51 833 1
+51 834 1
+51 835 1
+51 842 1
+51 847 1
+51 848 1
+51 849 1
+51 850 1
+51 857 1
+51 858 1
+51 859 1
+51 860 1
+51 867 1
+51 868 1
+51 869 1
+51 870 1
+51 871 1
+51 872 1
+51 1004 1
+51 1009 1
+51 1014 1
+51 1015 1
+51 1016 1
+51 1017 1
+51 1024 1
+51 1029 1
+51 1030 1
+51 1031 1
+51 1032 1
+51 1039 1
+51 1040 1
+51 1041 1
+51 1042 1
+51 1049 1
+51 1050 1
+51 1051 1
+51 1052 1
+51 1053 1
+51 1054 1
+51 1059 1
+51 1064 1
+51 1065 1
+51 1066 1
+51 1067 1
+51 1074 1
+51 1075 1
+51 1076 1
+51 1077 1
+51 1084 1
+51 1085 1
+51 1086 1
+51 1087 1
+51 1088 1
+51 1089 1
+51 1094 1
+51 1095 1
+51 1096 1
+51 1097 1
+51 1104 1
+51 1105 1
+51 1106 1
+51 1107 1
+51 1108 1
+51 1109 1
+51 1114 1
+51 1115 1
+51 1116 1
+51 1117 1
+51 1118 1
+51 1119 1
+51 1124 1
+51 1125 1
+51 1126 1
+51 1127 1
+51 1256 1
+51 1261 1
+51 1266 1
+51 1267 1
+51 1268 1
+51 1269 1
+51 1276 1
+51 1281 1
+51 1282 1
+51 1283 1
+51 1284 1
+51 1291 1
+51 1292 1
+51 1293 1
+51 1294 1
+51 1301 1
+51 1302 1
+51 1303 1
+51 1304 1
+51 1305 1
+51 1306 1
+51 1311 1
+51 1316 1
+51 1317 1
+51 1318 1
+51 1319 1
+51 1326 1
+51 1327 1
+51 1328 1
+51 1329 1
+51 1336 1
+51 1337 1
+51 1338 1
+51 1339 1
+51 1340 1
+51 1341 1
+51 1346 1
+51 1347 1
+51 1348 1
+51 1349 1
+51 1356 1
+51 1357 1
+51 1358 1
+51 1359 1
+51 1360 1
+51 1361 1
+51 1366 1
+51 1367 1
+51 1368 1
+51 1369 1
+51 1370 1
+51 1371 1
+51 1376 1
+51 1377 1
+51 1378 1
+51 1379 1
+51 1507 1
+51 1512 1
+51 1513 1
+51 1514 1
+51 1515 1
+51 1522 1
+51 1523 1
+51 1524 1
+51 1525 1
+51 1532 1
+51 1533 1
+51 1534 1
+51 1535 1
+51 1536 1
+51 1537 1
+51 1542 1
+51 1543 1
+51 1544 1
+51 1545 1
+51 1552 1
+51 1553 1
+51 1554 1
+51 1555 1
+51 1556 1
+51 1557 1
+51 1562 1
+51 1563 1
+51 1564 1
+51 1565 1
+51 1566 1
+51 1567 1
+51 1572 1
+51 1573 1
+51 1574 1
+51 1575 1
+51 1577 1
+51 1578 1
+51 1579 1
+51 1580 1
+51 1587 1
+51 1588 1
+51 1589 1
+51 1590 1
+51 1591 1
+51 1592 1
+51 1597 1
+51 1598 1
+51 1599 1
+51 1600 1
+51 1601 1
+51 1602 1
+51 1607 1
+51 1608 1
+51 1609 1
+51 1610 1
+51 1612 1
+51 1613 1
+51 1614 1
+51 1615 1
+51 1616 1
+51 1617 1
+51 1622 1
+51 1623 1
+51 1624 1
+51 1625 1
+51 1627 1
+51 1628 1
+51 1629 1
+51 1630 1
+51 1632 1
+51 1719 1
+51 1725 1
+51 1730 1
+51 1735 1
+51 1736 1
+51 1737 1
+51 1738 1
+51 1746 1
+51 1751 1
+51 1756 1
+51 1757 1
+51 1758 1
+51 1759 1
+51 1766 1
+51 1771 1
+51 1772 1
+51 1773 1
+51 1774 1
+51 1781 1
+51 1782 1
+51 1783 1
+51 1784 1
+51 1791 1
+51 1792 1
+51 1793 1
+51 1794 1
+51 1795 1
+51 1796 1
+51 1928 1
+51 1933 1
+51 1938 1
+51 1939 1
+51 1940 1
+51 1941 1
+51 1948 1
+51 1953 1
+51 1954 1
+51 1955 1
+51 1956 1
+51 1963 1
+51 1964 1
+51 1965 1
+51 1966 1
+51 1973 1
+51 1974 1
+51 1975 1
+51 1976 1
+51 1977 1
+51 1978 1
+51 1983 1
+51 1988 1
+51 1989 1
+51 1990 1
+51 1991 1
+51 1998 1
+51 1999 1
+51 2000 1
+51 2001 1
+51 2008 1
+51 2009 1
+51 2010 1
+51 2011 1
+51 2012 1
+51 2013 1
+51 2018 1
+51 2019 1
+51 2020 1
+51 2021 1
+51 2028 1
+51 2029 1
+51 2030 1
+51 2031 1
+51 2032 1
+51 2033 1
+51 2038 1
+51 2039 1
+51 2040 1
+51 2041 1
+51 2042 1
+51 2043 1
+51 2048 1
+51 2049 1
+51 2050 1
+51 2051 1
+51 2180 1
+51 2185 1
+51 2190 1
+51 2191 1
+51 2192 1
+51 2193 1
+51 2200 1
+51 2205 1
+51 2206 1
+51 2207 1
+51 2208 1
+51 2215 1
+51 2216 1
+51 2217 1
+51 2218 1
+51 2225 1
+51 2226 1
+51 2227 1
+51 2228 1
+51 2229 1
+51 2230 1
+51 2235 1
+51 2240 1
+51 2241 1
+51 2242 1
+51 2243 1
+51 2250 1
+51 2251 1
+51 2252 1
+51 2253 1
+51 2260 1
+51 2261 1
+51 2262 1
+51 2263 1
+51 2264 1
+51 2265 1
+51 2270 1
+51 2271 1
+51 2272 1
+51 2273 1
+51 2280 1
+51 2281 1
+51 2282 1
+51 2283 1
+51 2284 1
+51 2285 1
+51 2290 1
+51 2291 1
+51 2292 1
+51 2293 1
+51 2294 1
+51 2295 1
+51 2300 1
+51 2301 1
+51 2302 1
+51 2303 1
+51 2431 1
+51 2436 1
+51 2437 1
+51 2438 1
+51 2439 1
+51 2446 1
+51 2447 1
+51 2448 1
+51 2449 1
+51 2456 1
+51 2457 1
+51 2458 1
+51 2459 1
+51 2460 1
+51 2461 1
+51 2466 1
+51 2467 1
+51 2468 1
+51 2469 1
+51 2476 1
+51 2477 1
+51 2478 1
+51 2479 1
+51 2480 1
+51 2481 1
+51 2486 1
+51 2487 1
+51 2488 1
+51 2489 1
+51 2490 1
+51 2491 1
+51 2496 1
+51 2497 1
+51 2498 1
+51 2499 1
+51 2501 1
+51 2502 1
+51 2503 1
+51 2504 1
+51 2511 1
+51 2512 1
+51 2513 1
+51 2514 1
+51 2515 1
+51 2516 1
+51 2521 1
+51 2522 1
+51 2523 1
+51 2524 1
+51 2525 1
+51 2526 1
+51 2531 1
+51 2532 1
+51 2533 1
+51 2534 1
+51 2536 1
+51 2537 1
+51 2538 1
+51 2539 1
+51 2540 1
+51 2541 1
+51 2546 1
+51 2547 1
+51 2548 1
+51 2549 1
+51 2551 1
+51 2552 1
+51 2553 1
+51 2554 1
+51 2556 1
+51 2642 1
+51 2647 1
+51 2652 1
+51 2653 1
+51 2654 1
+51 2655 1
+51 2662 1
+51 2667 1
+51 2668 1
+51 2669 1
+51 2670 1
+51 2677 1
+51 2678 1
+51 2679 1
+51 2680 1
+51 2687 1
+51 2688 1
+51 2689 1
+51 2690 1
+51 2691 1
+51 2692 1
+51 2697 1
+51 2702 1
+51 2703 1
+51 2704 1
+51 2705 1
+51 2712 1
+51 2713 1
+51 2714 1
+51 2715 1
+51 2722 1
+51 2723 1
+51 2724 1
+51 2725 1
+51 2726 1
+51 2727 1
+51 2732 1
+51 2733 1
+51 2734 1
+51 2735 1
+51 2742 1
+51 2743 1
+51 2744 1
+51 2745 1
+51 2746 1
+51 2747 1
+51 2752 1
+51 2753 1
+51 2754 1
+51 2755 1
+51 2756 1
+51 2757 1
+51 2762 1
+51 2763 1
+51 2764 1
+51 2765 1
+51 2893 1
+51 2898 1
+51 2899 1
+51 2900 1
+51 2901 1
+51 2908 1
+51 2909 1
+51 2910 1
+51 2911 1
+51 2918 1
+51 2919 1
+51 2920 1
+51 2921 1
+51 2922 1
+51 2923 1
+51 2928 1
+51 2929 1
+51 2930 1
+51 2931 1
+51 2938 1
+51 2939 1
+51 2940 1
+51 2941 1
+51 2942 1
+51 2943 1
+51 2948 1
+51 2949 1
+51 2950 1
+51 2951 1
+51 2952 1
+51 2953 1
+51 2958 1
+51 2959 1
+51 2960 1
+51 2961 1
+51 2963 1
+51 2964 1
+51 2965 1
+51 2966 1
+51 2973 1
+51 2974 1
+51 2975 1
+51 2976 1
+51 2977 1
+51 2978 1
+51 2983 1
+51 2984 1
+51 2985 1
+51 2986 1
+51 2987 1
+51 2988 1
+51 2993 1
+51 2994 1
+51 2995 1
+51 2996 1
+51 2998 1
+51 2999 1
+51 3000 1
+51 3001 1
+51 3002 1
+51 3003 1
+51 3008 1
+51 3009 1
+51 3010 1
+51 3011 1
+51 3013 1
+51 3014 1
+51 3015 1
+51 3016 1
+51 3018 1
+51 3103 1
+51 3108 1
+51 3109 1
+51 3110 1
+51 3111 1
+51 3118 1
+51 3119 1
+51 3120 1
+51 3121 1
+51 3128 1
+51 3129 1
+51 3130 1
+51 3131 1
+51 3132 1
+51 3133 1
+51 3138 1
+51 3139 1
+51 3140 1
+51 3141 1
+51 3148 1
+51 3149 1
+51 3150 1
+51 3151 1
+51 3152 1
+51 3153 1
+51 3158 1
+51 3159 1
+51 3160 1
+51 3161 1
+51 3162 1
+51 3163 1
+51 3168 1
+51 3169 1
+51 3170 1
+51 3171 1
+51 3173 1
+51 3174 1
+51 3175 1
+51 3176 1
+51 3183 1
+51 3184 1
+51 3185 1
+51 3186 1
+51 3187 1
+51 3188 1
+51 3193 1
+51 3194 1
+51 3195 1
+51 3196 1
+51 3197 1
+51 3198 1
+51 3203 1
+51 3204 1
+51 3205 1
+51 3206 1
+51 3208 1
+51 3209 1
+51 3210 1
+51 3211 1
+51 3212 1
+51 3213 1
+51 3218 1
+51 3219 1
+51 3220 1
+51 3221 1
+51 3223 1
+51 3224 1
+51 3225 1
+51 3226 1
+51 3228 1
+51 3313 1
+51 3314 1
+51 3315 1
+51 3316 1
+51 3323 1
+51 3324 1
+51 3325 1
+51 3326 1
+51 3327 1
+51 3328 1
+51 3333 1
+51 3334 1
+51 3335 1
+51 3336 1
+51 3337 1
+51 3338 1
+51 3343 1
+51 3344 1
+51 3345 1
+51 3346 1
+51 3348 1
+51 3349 1
+51 3350 1
+51 3351 1
+51 3352 1
+51 3353 1
+51 3358 1
+51 3359 1
+51 3360 1
+51 3361 1
+51 3363 1
+51 3364 1
+51 3365 1
+51 3366 1
+51 3368 1
+51 3369 1
+51 3370 1
+51 3371 1
+51 3372 1
+51 3373 1
+51 3374 1
+51 3379 1
+51 3380 1
+51 3381 1
+51 3382 1
+51 3384 1
+51 3385 1
+51 3386 1
+51 3387 1
+51 3389 1
+51 3390 1
+51 3391 1
+51 3392 1
+51 3393 1
+51 3395 1
+51 3396 1
+52 5 1
+52 12 1
+52 18 1
+52 23 1
+52 27 1
+52 31 1
+52 32 1
+52 33 1
+52 124 1
+52 130 1
+52 135 1
+52 139 1
+52 143 1
+52 144 1
+52 145 1
+52 151 1
+52 156 1
+52 160 1
+52 164 1
+52 165 1
+52 166 1
+52 171 1
+52 175 1
+52 179 1
+52 180 1
+52 181 1
+52 185 1
+52 189 1
+52 190 1
+52 191 1
+52 195 1
+52 196 1
+52 197 1
+52 201 1
+52 202 1
+52 203 1
+52 334 1
+52 340 1
+52 345 1
+52 349 1
+52 353 1
+52 354 1
+52 355 1
+52 361 1
+52 366 1
+52 370 1
+52 374 1
+52 375 1
+52 376 1
+52 381 1
+52 385 1
+52 389 1
+52 390 1
+52 391 1
+52 395 1
+52 399 1
+52 400 1
+52 401 1
+52 405 1
+52 406 1
+52 407 1
+52 411 1
+52 412 1
+52 413 1
+52 543 1
+52 548 1
+52 552 1
+52 556 1
+52 557 1
+52 558 1
+52 563 1
+52 567 1
+52 571 1
+52 572 1
+52 573 1
+52 577 1
+52 581 1
+52 582 1
+52 583 1
+52 587 1
+52 588 1
+52 589 1
+52 593 1
+52 594 1
+52 595 1
+52 598 1
+52 602 1
+52 606 1
+52 607 1
+52 608 1
+52 612 1
+52 616 1
+52 617 1
+52 618 1
+52 622 1
+52 623 1
+52 624 1
+52 628 1
+52 629 1
+52 630 1
+52 632 1
+52 636 1
+52 637 1
+52 638 1
+52 642 1
+52 643 1
+52 644 1
+52 648 1
+52 649 1
+52 650 1
+52 652 1
+52 653 1
+52 654 1
+52 658 1
+52 659 1
+52 660 1
+52 662 1
+52 663 1
+52 664 1
+52 666 1
+52 796 1
+52 802 1
+52 807 1
+52 811 1
+52 815 1
+52 816 1
+52 817 1
+52 823 1
+52 828 1
+52 832 1
+52 836 1
+52 837 1
+52 838 1
+52 843 1
+52 847 1
+52 851 1
+52 852 1
+52 853 1
+52 857 1
+52 861 1
+52 862 1
+52 863 1
+52 867 1
+52 868 1
+52 869 1
+52 873 1
+52 874 1
+52 875 1
+52 1005 1
+52 1010 1
+52 1014 1
+52 1018 1
+52 1019 1
+52 1020 1
+52 1025 1
+52 1029 1
+52 1033 1
+52 1034 1
+52 1035 1
+52 1039 1
+52 1043 1
+52 1044 1
+52 1045 1
+52 1049 1
+52 1050 1
+52 1051 1
+52 1055 1
+52 1056 1
+52 1057 1
+52 1060 1
+52 1064 1
+52 1068 1
+52 1069 1
+52 1070 1
+52 1074 1
+52 1078 1
+52 1079 1
+52 1080 1
+52 1084 1
+52 1085 1
+52 1086 1
+52 1090 1
+52 1091 1
+52 1092 1
+52 1094 1
+52 1098 1
+52 1099 1
+52 1100 1
+52 1104 1
+52 1105 1
+52 1106 1
+52 1110 1
+52 1111 1
+52 1112 1
+52 1114 1
+52 1115 1
+52 1116 1
+52 1120 1
+52 1121 1
+52 1122 1
+52 1124 1
+52 1125 1
+52 1126 1
+52 1128 1
+52 1257 1
+52 1262 1
+52 1266 1
+52 1270 1
+52 1271 1
+52 1272 1
+52 1277 1
+52 1281 1
+52 1285 1
+52 1286 1
+52 1287 1
+52 1291 1
+52 1295 1
+52 1296 1
+52 1297 1
+52 1301 1
+52 1302 1
+52 1303 1
+52 1307 1
+52 1308 1
+52 1309 1
+52 1312 1
+52 1316 1
+52 1320 1
+52 1321 1
+52 1322 1
+52 1326 1
+52 1330 1
+52 1331 1
+52 1332 1
+52 1336 1
+52 1337 1
+52 1338 1
+52 1342 1
+52 1343 1
+52 1344 1
+52 1346 1
+52 1350 1
+52 1351 1
+52 1352 1
+52 1356 1
+52 1357 1
+52 1358 1
+52 1362 1
+52 1363 1
+52 1364 1
+52 1366 1
+52 1367 1
+52 1368 1
+52 1372 1
+52 1373 1
+52 1374 1
+52 1376 1
+52 1377 1
+52 1378 1
+52 1380 1
+52 1508 1
+52 1512 1
+52 1516 1
+52 1517 1
+52 1518 1
+52 1522 1
+52 1526 1
+52 1527 1
+52 1528 1
+52 1532 1
+52 1533 1
+52 1534 1
+52 1538 1
+52 1539 1
+52 1540 1
+52 1542 1
+52 1546 1
+52 1547 1
+52 1548 1
+52 1552 1
+52 1553 1
+52 1554 1
+52 1558 1
+52 1559 1
+52 1560 1
+52 1562 1
+52 1563 1
+52 1564 1
+52 1568 1
+52 1569 1
+52 1570 1
+52 1572 1
+52 1573 1
+52 1574 1
+52 1576 1
+52 1577 1
+52 1581 1
+52 1582 1
+52 1583 1
+52 1587 1
+52 1588 1
+52 1589 1
+52 1593 1
+52 1594 1
+52 1595 1
+52 1597 1
+52 1598 1
+52 1599 1
+52 1603 1
+52 1604 1
+52 1605 1
+52 1607 1
+52 1608 1
+52 1609 1
+52 1611 1
+52 1612 1
+52 1613 1
+52 1614 1
+52 1618 1
+52 1619 1
+52 1620 1
+52 1622 1
+52 1623 1
+52 1624 1
+52 1626 1
+52 1627 1
+52 1628 1
+52 1629 1
+52 1631 1
+52 1632 1
+52 1720 1
+52 1726 1
+52 1731 1
+52 1735 1
+52 1739 1
+52 1740 1
+52 1741 1
+52 1747 1
+52 1752 1
+52 1756 1
+52 1760 1
+52 1761 1
+52 1762 1
+52 1767 1
+52 1771 1
+52 1775 1
+52 1776 1
+52 1777 1
+52 1781 1
+52 1785 1
+52 1786 1
+52 1787 1
+52 1791 1
+52 1792 1
+52 1793 1
+52 1797 1
+52 1798 1
+52 1799 1
+52 1929 1
+52 1934 1
+52 1938 1
+52 1942 1
+52 1943 1
+52 1944 1
+52 1949 1
+52 1953 1
+52 1957 1
+52 1958 1
+52 1959 1
+52 1963 1
+52 1967 1
+52 1968 1
+52 1969 1
+52 1973 1
+52 1974 1
+52 1975 1
+52 1979 1
+52 1980 1
+52 1981 1
+52 1984 1
+52 1988 1
+52 1992 1
+52 1993 1
+52 1994 1
+52 1998 1
+52 2002 1
+52 2003 1
+52 2004 1
+52 2008 1
+52 2009 1
+52 2010 1
+52 2014 1
+52 2015 1
+52 2016 1
+52 2018 1
+52 2022 1
+52 2023 1
+52 2024 1
+52 2028 1
+52 2029 1
+52 2030 1
+52 2034 1
+52 2035 1
+52 2036 1
+52 2038 1
+52 2039 1
+52 2040 1
+52 2044 1
+52 2045 1
+52 2046 1
+52 2048 1
+52 2049 1
+52 2050 1
+52 2052 1
+52 2181 1
+52 2186 1
+52 2190 1
+52 2194 1
+52 2195 1
+52 2196 1
+52 2201 1
+52 2205 1
+52 2209 1
+52 2210 1
+52 2211 1
+52 2215 1
+52 2219 1
+52 2220 1
+52 2221 1
+52 2225 1
+52 2226 1
+52 2227 1
+52 2231 1
+52 2232 1
+52 2233 1
+52 2236 1
+52 2240 1
+52 2244 1
+52 2245 1
+52 2246 1
+52 2250 1
+52 2254 1
+52 2255 1
+52 2256 1
+52 2260 1
+52 2261 1
+52 2262 1
+52 2266 1
+52 2267 1
+52 2268 1
+52 2270 1
+52 2274 1
+52 2275 1
+52 2276 1
+52 2280 1
+52 2281 1
+52 2282 1
+52 2286 1
+52 2287 1
+52 2288 1
+52 2290 1
+52 2291 1
+52 2292 1
+52 2296 1
+52 2297 1
+52 2298 1
+52 2300 1
+52 2301 1
+52 2302 1
+52 2304 1
+52 2432 1
+52 2436 1
+52 2440 1
+52 2441 1
+52 2442 1
+52 2446 1
+52 2450 1
+52 2451 1
+52 2452 1
+52 2456 1
+52 2457 1
+52 2458 1
+52 2462 1
+52 2463 1
+52 2464 1
+52 2466 1
+52 2470 1
+52 2471 1
+52 2472 1
+52 2476 1
+52 2477 1
+52 2478 1
+52 2482 1
+52 2483 1
+52 2484 1
+52 2486 1
+52 2487 1
+52 2488 1
+52 2492 1
+52 2493 1
+52 2494 1
+52 2496 1
+52 2497 1
+52 2498 1
+52 2500 1
+52 2501 1
+52 2505 1
+52 2506 1
+52 2507 1
+52 2511 1
+52 2512 1
+52 2513 1
+52 2517 1
+52 2518 1
+52 2519 1
+52 2521 1
+52 2522 1
+52 2523 1
+52 2527 1
+52 2528 1
+52 2529 1
+52 2531 1
+52 2532 1
+52 2533 1
+52 2535 1
+52 2536 1
+52 2537 1
+52 2538 1
+52 2542 1
+52 2543 1
+52 2544 1
+52 2546 1
+52 2547 1
+52 2548 1
+52 2550 1
+52 2551 1
+52 2552 1
+52 2553 1
+52 2555 1
+52 2556 1
+52 2643 1
+52 2648 1
+52 2652 1
+52 2656 1
+52 2657 1
+52 2658 1
+52 2663 1
+52 2667 1
+52 2671 1
+52 2672 1
+52 2673 1
+52 2677 1
+52 2681 1
+52 2682 1
+52 2683 1
+52 2687 1
+52 2688 1
+52 2689 1
+52 2693 1
+52 2694 1
+52 2695 1
+52 2698 1
+52 2702 1
+52 2706 1
+52 2707 1
+52 2708 1
+52 2712 1
+52 2716 1
+52 2717 1
+52 2718 1
+52 2722 1
+52 2723 1
+52 2724 1
+52 2728 1
+52 2729 1
+52 2730 1
+52 2732 1
+52 2736 1
+52 2737 1
+52 2738 1
+52 2742 1
+52 2743 1
+52 2744 1
+52 2748 1
+52 2749 1
+52 2750 1
+52 2752 1
+52 2753 1
+52 2754 1
+52 2758 1
+52 2759 1
+52 2760 1
+52 2762 1
+52 2763 1
+52 2764 1
+52 2766 1
+52 2894 1
+52 2898 1
+52 2902 1
+52 2903 1
+52 2904 1
+52 2908 1
+52 2912 1
+52 2913 1
+52 2914 1
+52 2918 1
+52 2919 1
+52 2920 1
+52 2924 1
+52 2925 1
+52 2926 1
+52 2928 1
+52 2932 1
+52 2933 1
+52 2934 1
+52 2938 1
+52 2939 1
+52 2940 1
+52 2944 1
+52 2945 1
+52 2946 1
+52 2948 1
+52 2949 1
+52 2950 1
+52 2954 1
+52 2955 1
+52 2956 1
+52 2958 1
+52 2959 1
+52 2960 1
+52 2962 1
+52 2963 1
+52 2967 1
+52 2968 1
+52 2969 1
+52 2973 1
+52 2974 1
+52 2975 1
+52 2979 1
+52 2980 1
+52 2981 1
+52 2983 1
+52 2984 1
+52 2985 1
+52 2989 1
+52 2990 1
+52 2991 1
+52 2993 1
+52 2994 1
+52 2995 1
+52 2997 1
+52 2998 1
+52 2999 1
+52 3000 1
+52 3004 1
+52 3005 1
+52 3006 1
+52 3008 1
+52 3009 1
+52 3010 1
+52 3012 1
+52 3013 1
+52 3014 1
+52 3015 1
+52 3017 1
+52 3018 1
+52 3104 1
+52 3108 1
+52 3112 1
+52 3113 1
+52 3114 1
+52 3118 1
+52 3122 1
+52 3123 1
+52 3124 1
+52 3128 1
+52 3129 1
+52 3130 1
+52 3134 1
+52 3135 1
+52 3136 1
+52 3138 1
+52 3142 1
+52 3143 1
+52 3144 1
+52 3148 1
+52 3149 1
+52 3150 1
+52 3154 1
+52 3155 1
+52 3156 1
+52 3158 1
+52 3159 1
+52 3160 1
+52 3164 1
+52 3165 1
+52 3166 1
+52 3168 1
+52 3169 1
+52 3170 1
+52 3172 1
+52 3173 1
+52 3177 1
+52 3178 1
+52 3179 1
+52 3183 1
+52 3184 1
+52 3185 1
+52 3189 1
+52 3190 1
+52 3191 1
+52 3193 1
+52 3194 1
+52 3195 1
+52 3199 1
+52 3200 1
+52 3201 1
+52 3203 1
+52 3204 1
+52 3205 1
+52 3207 1
+52 3208 1
+52 3209 1
+52 3210 1
+52 3214 1
+52 3215 1
+52 3216 1
+52 3218 1
+52 3219 1
+52 3220 1
+52 3222 1
+52 3223 1
+52 3224 1
+52 3225 1
+52 3227 1
+52 3228 1
+52 3313 1
+52 3317 1
+52 3318 1
+52 3319 1
+52 3323 1
+52 3324 1
+52 3325 1
+52 3329 1
+52 3330 1
+52 3331 1
+52 3333 1
+52 3334 1
+52 3335 1
+52 3339 1
+52 3340 1
+52 3341 1
+52 3343 1
+52 3344 1
+52 3345 1
+52 3347 1
+52 3348 1
+52 3349 1
+52 3350 1
+52 3354 1
+52 3355 1
+52 3356 1
+52 3358 1
+52 3359 1
+52 3360 1
+52 3362 1
+52 3363 1
+52 3364 1
+52 3365 1
+52 3367 1
+52 3368 1
+52 3369 1
+52 3370 1
+52 3371 1
+52 3375 1
+52 3376 1
+52 3377 1
+52 3379 1
+52 3380 1
+52 3381 1
+52 3383 1
+52 3384 1
+52 3385 1
+52 3386 1
+52 3388 1
+52 3389 1
+52 3390 1
+52 3391 1
+52 3392 1
+52 3394 1
+52 3395 1
+52 3396 1
+53 6 1
+53 13 1
+53 19 1
+53 24 1
+53 28 1
+53 31 1
+53 34 1
+53 35 1
+53 125 1
+53 131 1
+53 136 1
+53 140 1
+53 143 1
+53 146 1
+53 147 1
+53 152 1
+53 157 1
+53 161 1
+53 164 1
+53 167 1
+53 168 1
+53 172 1
+53 176 1
+53 179 1
+53 182 1
+53 183 1
+53 186 1
+53 189 1
+53 192 1
+53 193 1
+53 195 1
+53 198 1
+53 199 1
+53 201 1
+53 202 1
+53 204 1
+53 335 1
+53 341 1
+53 346 1
+53 350 1
+53 353 1
+53 356 1
+53 357 1
+53 362 1
+53 367 1
+53 371 1
+53 374 1
+53 377 1
+53 378 1
+53 382 1
+53 386 1
+53 389 1
+53 392 1
+53 393 1
+53 396 1
+53 399 1
+53 402 1
+53 403 1
+53 405 1
+53 408 1
+53 409 1
+53 411 1
+53 412 1
+53 414 1
+53 544 1
+53 549 1
+53 553 1
+53 556 1
+53 559 1
+53 560 1
+53 564 1
+53 568 1
+53 571 1
+53 574 1
+53 575 1
+53 578 1
+53 581 1
+53 584 1
+53 585 1
+53 587 1
+53 590 1
+53 591 1
+53 593 1
+53 594 1
+53 596 1
+53 599 1
+53 603 1
+53 606 1
+53 609 1
+53 610 1
+53 613 1
+53 616 1
+53 619 1
+53 620 1
+53 622 1
+53 625 1
+53 626 1
+53 628 1
+53 629 1
+53 631 1
+53 633 1
+53 636 1
+53 639 1
+53 640 1
+53 642 1
+53 645 1
+53 646 1
+53 648 1
+53 649 1
+53 651 1
+53 652 1
+53 655 1
+53 656 1
+53 658 1
+53 659 1
+53 661 1
+53 662 1
+53 663 1
+53 665 1
+53 666 1
+53 797 1
+53 803 1
+53 808 1
+53 812 1
+53 815 1
+53 818 1
+53 819 1
+53 824 1
+53 829 1
+53 833 1
+53 836 1
+53 839 1
+53 840 1
+53 844 1
+53 848 1
+53 851 1
+53 854 1
+53 855 1
+53 858 1
+53 861 1
+53 864 1
+53 865 1
+53 867 1
+53 870 1
+53 871 1
+53 873 1
+53 874 1
+53 876 1
+53 1006 1
+53 1011 1
+53 1015 1
+53 1018 1
+53 1021 1
+53 1022 1
+53 1026 1
+53 1030 1
+53 1033 1
+53 1036 1
+53 1037 1
+53 1040 1
+53 1043 1
+53 1046 1
+53 1047 1
+53 1049 1
+53 1052 1
+53 1053 1
+53 1055 1
+53 1056 1
+53 1058 1
+53 1061 1
+53 1065 1
+53 1068 1
+53 1071 1
+53 1072 1
+53 1075 1
+53 1078 1
+53 1081 1
+53 1082 1
+53 1084 1
+53 1087 1
+53 1088 1
+53 1090 1
+53 1091 1
+53 1093 1
+53 1095 1
+53 1098 1
+53 1101 1
+53 1102 1
+53 1104 1
+53 1107 1
+53 1108 1
+53 1110 1
+53 1111 1
+53 1113 1
+53 1114 1
+53 1117 1
+53 1118 1
+53 1120 1
+53 1121 1
+53 1123 1
+53 1124 1
+53 1125 1
+53 1127 1
+53 1128 1
+53 1258 1
+53 1263 1
+53 1267 1
+53 1270 1
+53 1273 1
+53 1274 1
+53 1278 1
+53 1282 1
+53 1285 1
+53 1288 1
+53 1289 1
+53 1292 1
+53 1295 1
+53 1298 1
+53 1299 1
+53 1301 1
+53 1304 1
+53 1305 1
+53 1307 1
+53 1308 1
+53 1310 1
+53 1313 1
+53 1317 1
+53 1320 1
+53 1323 1
+53 1324 1
+53 1327 1
+53 1330 1
+53 1333 1
+53 1334 1
+53 1336 1
+53 1339 1
+53 1340 1
+53 1342 1
+53 1343 1
+53 1345 1
+53 1347 1
+53 1350 1
+53 1353 1
+53 1354 1
+53 1356 1
+53 1359 1
+53 1360 1
+53 1362 1
+53 1363 1
+53 1365 1
+53 1366 1
+53 1369 1
+53 1370 1
+53 1372 1
+53 1373 1
+53 1375 1
+53 1376 1
+53 1377 1
+53 1379 1
+53 1380 1
+53 1509 1
+53 1513 1
+53 1516 1
+53 1519 1
+53 1520 1
+53 1523 1
+53 1526 1
+53 1529 1
+53 1530 1
+53 1532 1
+53 1535 1
+53 1536 1
+53 1538 1
+53 1539 1
+53 1541 1
+53 1543 1
+53 1546 1
+53 1549 1
+53 1550 1
+53 1552 1
+53 1555 1
+53 1556 1
+53 1558 1
+53 1559 1
+53 1561 1
+53 1562 1
+53 1565 1
+53 1566 1
+53 1568 1
+53 1569 1
+53 1571 1
+53 1572 1
+53 1573 1
+53 1575 1
+53 1576 1
+53 1578 1
+53 1581 1
+53 1584 1
+53 1585 1
+53 1587 1
+53 1590 1
+53 1591 1
+53 1593 1
+53 1594 1
+53 1596 1
+53 1597 1
+53 1600 1
+53 1601 1
+53 1603 1
+53 1604 1
+53 1606 1
+53 1607 1
+53 1608 1
+53 1610 1
+53 1611 1
+53 1612 1
+53 1615 1
+53 1616 1
+53 1618 1
+53 1619 1
+53 1621 1
+53 1622 1
+53 1623 1
+53 1625 1
+53 1626 1
+53 1627 1
+53 1628 1
+53 1630 1
+53 1631 1
+53 1632 1
+53 1721 1
+53 1727 1
+53 1732 1
+53 1736 1
+53 1739 1
+53 1742 1
+53 1743 1
+53 1748 1
+53 1753 1
+53 1757 1
+53 1760 1
+53 1763 1
+53 1764 1
+53 1768 1
+53 1772 1
+53 1775 1
+53 1778 1
+53 1779 1
+53 1782 1
+53 1785 1
+53 1788 1
+53 1789 1
+53 1791 1
+53 1794 1
+53 1795 1
+53 1797 1
+53 1798 1
+53 1800 1
+53 1930 1
+53 1935 1
+53 1939 1
+53 1942 1
+53 1945 1
+53 1946 1
+53 1950 1
+53 1954 1
+53 1957 1
+53 1960 1
+53 1961 1
+53 1964 1
+53 1967 1
+53 1970 1
+53 1971 1
+53 1973 1
+53 1976 1
+53 1977 1
+53 1979 1
+53 1980 1
+53 1982 1
+53 1985 1
+53 1989 1
+53 1992 1
+53 1995 1
+53 1996 1
+53 1999 1
+53 2002 1
+53 2005 1
+53 2006 1
+53 2008 1
+53 2011 1
+53 2012 1
+53 2014 1
+53 2015 1
+53 2017 1
+53 2019 1
+53 2022 1
+53 2025 1
+53 2026 1
+53 2028 1
+53 2031 1
+53 2032 1
+53 2034 1
+53 2035 1
+53 2037 1
+53 2038 1
+53 2041 1
+53 2042 1
+53 2044 1
+53 2045 1
+53 2047 1
+53 2048 1
+53 2049 1
+53 2051 1
+53 2052 1
+53 2182 1
+53 2187 1
+53 2191 1
+53 2194 1
+53 2197 1
+53 2198 1
+53 2202 1
+53 2206 1
+53 2209 1
+53 2212 1
+53 2213 1
+53 2216 1
+53 2219 1
+53 2222 1
+53 2223 1
+53 2225 1
+53 2228 1
+53 2229 1
+53 2231 1
+53 2232 1
+53 2234 1
+53 2237 1
+53 2241 1
+53 2244 1
+53 2247 1
+53 2248 1
+53 2251 1
+53 2254 1
+53 2257 1
+53 2258 1
+53 2260 1
+53 2263 1
+53 2264 1
+53 2266 1
+53 2267 1
+53 2269 1
+53 2271 1
+53 2274 1
+53 2277 1
+53 2278 1
+53 2280 1
+53 2283 1
+53 2284 1
+53 2286 1
+53 2287 1
+53 2289 1
+53 2290 1
+53 2293 1
+53 2294 1
+53 2296 1
+53 2297 1
+53 2299 1
+53 2300 1
+53 2301 1
+53 2303 1
+53 2304 1
+53 2433 1
+53 2437 1
+53 2440 1
+53 2443 1
+53 2444 1
+53 2447 1
+53 2450 1
+53 2453 1
+53 2454 1
+53 2456 1
+53 2459 1
+53 2460 1
+53 2462 1
+53 2463 1
+53 2465 1
+53 2467 1
+53 2470 1
+53 2473 1
+53 2474 1
+53 2476 1
+53 2479 1
+53 2480 1
+53 2482 1
+53 2483 1
+53 2485 1
+53 2486 1
+53 2489 1
+53 2490 1
+53 2492 1
+53 2493 1
+53 2495 1
+53 2496 1
+53 2497 1
+53 2499 1
+53 2500 1
+53 2502 1
+53 2505 1
+53 2508 1
+53 2509 1
+53 2511 1
+53 2514 1
+53 2515 1
+53 2517 1
+53 2518 1
+53 2520 1
+53 2521 1
+53 2524 1
+53 2525 1
+53 2527 1
+53 2528 1
+53 2530 1
+53 2531 1
+53 2532 1
+53 2534 1
+53 2535 1
+53 2536 1
+53 2539 1
+53 2540 1
+53 2542 1
+53 2543 1
+53 2545 1
+53 2546 1
+53 2547 1
+53 2549 1
+53 2550 1
+53 2551 1
+53 2552 1
+53 2554 1
+53 2555 1
+53 2556 1
+53 2644 1
+53 2649 1
+53 2653 1
+53 2656 1
+53 2659 1
+53 2660 1
+53 2664 1
+53 2668 1
+53 2671 1
+53 2674 1
+53 2675 1
+53 2678 1
+53 2681 1
+53 2684 1
+53 2685 1
+53 2687 1
+53 2690 1
+53 2691 1
+53 2693 1
+53 2694 1
+53 2696 1
+53 2699 1
+53 2703 1
+53 2706 1
+53 2709 1
+53 2710 1
+53 2713 1
+53 2716 1
+53 2719 1
+53 2720 1
+53 2722 1
+53 2725 1
+53 2726 1
+53 2728 1
+53 2729 1
+53 2731 1
+53 2733 1
+53 2736 1
+53 2739 1
+53 2740 1
+53 2742 1
+53 2745 1
+53 2746 1
+53 2748 1
+53 2749 1
+53 2751 1
+53 2752 1
+53 2755 1
+53 2756 1
+53 2758 1
+53 2759 1
+53 2761 1
+53 2762 1
+53 2763 1
+53 2765 1
+53 2766 1
+53 2895 1
+53 2899 1
+53 2902 1
+53 2905 1
+53 2906 1
+53 2909 1
+53 2912 1
+53 2915 1
+53 2916 1
+53 2918 1
+53 2921 1
+53 2922 1
+53 2924 1
+53 2925 1
+53 2927 1
+53 2929 1
+53 2932 1
+53 2935 1
+53 2936 1
+53 2938 1
+53 2941 1
+53 2942 1
+53 2944 1
+53 2945 1
+53 2947 1
+53 2948 1
+53 2951 1
+53 2952 1
+53 2954 1
+53 2955 1
+53 2957 1
+53 2958 1
+53 2959 1
+53 2961 1
+53 2962 1
+53 2964 1
+53 2967 1
+53 2970 1
+53 2971 1
+53 2973 1
+53 2976 1
+53 2977 1
+53 2979 1
+53 2980 1
+53 2982 1
+53 2983 1
+53 2986 1
+53 2987 1
+53 2989 1
+53 2990 1
+53 2992 1
+53 2993 1
+53 2994 1
+53 2996 1
+53 2997 1
+53 2998 1
+53 3001 1
+53 3002 1
+53 3004 1
+53 3005 1
+53 3007 1
+53 3008 1
+53 3009 1
+53 3011 1
+53 3012 1
+53 3013 1
+53 3014 1
+53 3016 1
+53 3017 1
+53 3018 1
+53 3105 1
+53 3109 1
+53 3112 1
+53 3115 1
+53 3116 1
+53 3119 1
+53 3122 1
+53 3125 1
+53 3126 1
+53 3128 1
+53 3131 1
+53 3132 1
+53 3134 1
+53 3135 1
+53 3137 1
+53 3139 1
+53 3142 1
+53 3145 1
+53 3146 1
+53 3148 1
+53 3151 1
+53 3152 1
+53 3154 1
+53 3155 1
+53 3157 1
+53 3158 1
+53 3161 1
+53 3162 1
+53 3164 1
+53 3165 1
+53 3167 1
+53 3168 1
+53 3169 1
+53 3171 1
+53 3172 1
+53 3174 1
+53 3177 1
+53 3180 1
+53 3181 1
+53 3183 1
+53 3186 1
+53 3187 1
+53 3189 1
+53 3190 1
+53 3192 1
+53 3193 1
+53 3196 1
+53 3197 1
+53 3199 1
+53 3200 1
+53 3202 1
+53 3203 1
+53 3204 1
+53 3206 1
+53 3207 1
+53 3208 1
+53 3211 1
+53 3212 1
+53 3214 1
+53 3215 1
+53 3217 1
+53 3218 1
+53 3219 1
+53 3221 1
+53 3222 1
+53 3223 1
+53 3224 1
+53 3226 1
+53 3227 1
+53 3228 1
+53 3314 1
+53 3317 1
+53 3320 1
+53 3321 1
+53 3323 1
+53 3326 1
+53 3327 1
+53 3329 1
+53 3330 1
+53 3332 1
+53 3333 1
+53 3336 1
+53 3337 1
+53 3339 1
+53 3340 1
+53 3342 1
+53 3343 1
+53 3344 1
+53 3346 1
+53 3347 1
+53 3348 1
+53 3351 1
+53 3352 1
+53 3354 1
+53 3355 1
+53 3357 1
+53 3358 1
+53 3359 1
+53 3361 1
+53 3362 1
+53 3363 1
+53 3364 1
+53 3366 1
+53 3367 1
+53 3368 1
+53 3369 1
+53 3372 1
+53 3373 1
+53 3375 1
+53 3376 1
+53 3378 1
+53 3379 1
+53 3380 1
+53 3382 1
+53 3383 1
+53 3384 1
+53 3385 1
+53 3387 1
+53 3388 1
+53 3389 1
+53 3390 1
+53 3391 1
+53 3393 1
+53 3394 1
+53 3395 1
+53 3396 1
+54 7 1
+54 14 1
+54 20 1
+54 25 1
+54 29 1
+54 32 1
+54 34 1
+54 36 1
+54 126 1
+54 132 1
+54 137 1
+54 141 1
+54 144 1
+54 146 1
+54 148 1
+54 153 1
+54 158 1
+54 162 1
+54 165 1
+54 167 1
+54 169 1
+54 173 1
+54 177 1
+54 180 1
+54 182 1
+54 184 1
+54 187 1
+54 190 1
+54 192 1
+54 194 1
+54 196 1
+54 198 1
+54 200 1
+54 201 1
+54 203 1
+54 204 1
+54 336 1
+54 342 1
+54 347 1
+54 351 1
+54 354 1
+54 356 1
+54 358 1
+54 363 1
+54 368 1
+54 372 1
+54 375 1
+54 377 1
+54 379 1
+54 383 1
+54 387 1
+54 390 1
+54 392 1
+54 394 1
+54 397 1
+54 400 1
+54 402 1
+54 404 1
+54 406 1
+54 408 1
+54 410 1
+54 411 1
+54 413 1
+54 414 1
+54 545 1
+54 550 1
+54 554 1
+54 557 1
+54 559 1
+54 561 1
+54 565 1
+54 569 1
+54 572 1
+54 574 1
+54 576 1
+54 579 1
+54 582 1
+54 584 1
+54 586 1
+54 588 1
+54 590 1
+54 592 1
+54 593 1
+54 595 1
+54 596 1
+54 600 1
+54 604 1
+54 607 1
+54 609 1
+54 611 1
+54 614 1
+54 617 1
+54 619 1
+54 621 1
+54 623 1
+54 625 1
+54 627 1
+54 628 1
+54 630 1
+54 631 1
+54 634 1
+54 637 1
+54 639 1
+54 641 1
+54 643 1
+54 645 1
+54 647 1
+54 648 1
+54 650 1
+54 651 1
+54 653 1
+54 655 1
+54 657 1
+54 658 1
+54 660 1
+54 661 1
+54 662 1
+54 664 1
+54 665 1
+54 666 1
+54 798 1
+54 804 1
+54 809 1
+54 813 1
+54 816 1
+54 818 1
+54 820 1
+54 825 1
+54 830 1
+54 834 1
+54 837 1
+54 839 1
+54 841 1
+54 845 1
+54 849 1
+54 852 1
+54 854 1
+54 856 1
+54 859 1
+54 862 1
+54 864 1
+54 866 1
+54 868 1
+54 870 1
+54 872 1
+54 873 1
+54 875 1
+54 876 1
+54 1007 1
+54 1012 1
+54 1016 1
+54 1019 1
+54 1021 1
+54 1023 1
+54 1027 1
+54 1031 1
+54 1034 1
+54 1036 1
+54 1038 1
+54 1041 1
+54 1044 1
+54 1046 1
+54 1048 1
+54 1050 1
+54 1052 1
+54 1054 1
+54 1055 1
+54 1057 1
+54 1058 1
+54 1062 1
+54 1066 1
+54 1069 1
+54 1071 1
+54 1073 1
+54 1076 1
+54 1079 1
+54 1081 1
+54 1083 1
+54 1085 1
+54 1087 1
+54 1089 1
+54 1090 1
+54 1092 1
+54 1093 1
+54 1096 1
+54 1099 1
+54 1101 1
+54 1103 1
+54 1105 1
+54 1107 1
+54 1109 1
+54 1110 1
+54 1112 1
+54 1113 1
+54 1115 1
+54 1117 1
+54 1119 1
+54 1120 1
+54 1122 1
+54 1123 1
+54 1124 1
+54 1126 1
+54 1127 1
+54 1128 1
+54 1259 1
+54 1264 1
+54 1268 1
+54 1271 1
+54 1273 1
+54 1275 1
+54 1279 1
+54 1283 1
+54 1286 1
+54 1288 1
+54 1290 1
+54 1293 1
+54 1296 1
+54 1298 1
+54 1300 1
+54 1302 1
+54 1304 1
+54 1306 1
+54 1307 1
+54 1309 1
+54 1310 1
+54 1314 1
+54 1318 1
+54 1321 1
+54 1323 1
+54 1325 1
+54 1328 1
+54 1331 1
+54 1333 1
+54 1335 1
+54 1337 1
+54 1339 1
+54 1341 1
+54 1342 1
+54 1344 1
+54 1345 1
+54 1348 1
+54 1351 1
+54 1353 1
+54 1355 1
+54 1357 1
+54 1359 1
+54 1361 1
+54 1362 1
+54 1364 1
+54 1365 1
+54 1367 1
+54 1369 1
+54 1371 1
+54 1372 1
+54 1374 1
+54 1375 1
+54 1376 1
+54 1378 1
+54 1379 1
+54 1380 1
+54 1510 1
+54 1514 1
+54 1517 1
+54 1519 1
+54 1521 1
+54 1524 1
+54 1527 1
+54 1529 1
+54 1531 1
+54 1533 1
+54 1535 1
+54 1537 1
+54 1538 1
+54 1540 1
+54 1541 1
+54 1544 1
+54 1547 1
+54 1549 1
+54 1551 1
+54 1553 1
+54 1555 1
+54 1557 1
+54 1558 1
+54 1560 1
+54 1561 1
+54 1563 1
+54 1565 1
+54 1567 1
+54 1568 1
+54 1570 1
+54 1571 1
+54 1572 1
+54 1574 1
+54 1575 1
+54 1576 1
+54 1579 1
+54 1582 1
+54 1584 1
+54 1586 1
+54 1588 1
+54 1590 1
+54 1592 1
+54 1593 1
+54 1595 1
+54 1596 1
+54 1598 1
+54 1600 1
+54 1602 1
+54 1603 1
+54 1605 1
+54 1606 1
+54 1607 1
+54 1609 1
+54 1610 1
+54 1611 1
+54 1613 1
+54 1615 1
+54 1617 1
+54 1618 1
+54 1620 1
+54 1621 1
+54 1622 1
+54 1624 1
+54 1625 1
+54 1626 1
+54 1627 1
+54 1629 1
+54 1630 1
+54 1631 1
+54 1632 1
+54 1722 1
+54 1728 1
+54 1733 1
+54 1737 1
+54 1740 1
+54 1742 1
+54 1744 1
+54 1749 1
+54 1754 1
+54 1758 1
+54 1761 1
+54 1763 1
+54 1765 1
+54 1769 1
+54 1773 1
+54 1776 1
+54 1778 1
+54 1780 1
+54 1783 1
+54 1786 1
+54 1788 1
+54 1790 1
+54 1792 1
+54 1794 1
+54 1796 1
+54 1797 1
+54 1799 1
+54 1800 1
+54 1931 1
+54 1936 1
+54 1940 1
+54 1943 1
+54 1945 1
+54 1947 1
+54 1951 1
+54 1955 1
+54 1958 1
+54 1960 1
+54 1962 1
+54 1965 1
+54 1968 1
+54 1970 1
+54 1972 1
+54 1974 1
+54 1976 1
+54 1978 1
+54 1979 1
+54 1981 1
+54 1982 1
+54 1986 1
+54 1990 1
+54 1993 1
+54 1995 1
+54 1997 1
+54 2000 1
+54 2003 1
+54 2005 1
+54 2007 1
+54 2009 1
+54 2011 1
+54 2013 1
+54 2014 1
+54 2016 1
+54 2017 1
+54 2020 1
+54 2023 1
+54 2025 1
+54 2027 1
+54 2029 1
+54 2031 1
+54 2033 1
+54 2034 1
+54 2036 1
+54 2037 1
+54 2039 1
+54 2041 1
+54 2043 1
+54 2044 1
+54 2046 1
+54 2047 1
+54 2048 1
+54 2050 1
+54 2051 1
+54 2052 1
+54 2183 1
+54 2188 1
+54 2192 1
+54 2195 1
+54 2197 1
+54 2199 1
+54 2203 1
+54 2207 1
+54 2210 1
+54 2212 1
+54 2214 1
+54 2217 1
+54 2220 1
+54 2222 1
+54 2224 1
+54 2226 1
+54 2228 1
+54 2230 1
+54 2231 1
+54 2233 1
+54 2234 1
+54 2238 1
+54 2242 1
+54 2245 1
+54 2247 1
+54 2249 1
+54 2252 1
+54 2255 1
+54 2257 1
+54 2259 1
+54 2261 1
+54 2263 1
+54 2265 1
+54 2266 1
+54 2268 1
+54 2269 1
+54 2272 1
+54 2275 1
+54 2277 1
+54 2279 1
+54 2281 1
+54 2283 1
+54 2285 1
+54 2286 1
+54 2288 1
+54 2289 1
+54 2291 1
+54 2293 1
+54 2295 1
+54 2296 1
+54 2298 1
+54 2299 1
+54 2300 1
+54 2302 1
+54 2303 1
+54 2304 1
+54 2434 1
+54 2438 1
+54 2441 1
+54 2443 1
+54 2445 1
+54 2448 1
+54 2451 1
+54 2453 1
+54 2455 1
+54 2457 1
+54 2459 1
+54 2461 1
+54 2462 1
+54 2464 1
+54 2465 1
+54 2468 1
+54 2471 1
+54 2473 1
+54 2475 1
+54 2477 1
+54 2479 1
+54 2481 1
+54 2482 1
+54 2484 1
+54 2485 1
+54 2487 1
+54 2489 1
+54 2491 1
+54 2492 1
+54 2494 1
+54 2495 1
+54 2496 1
+54 2498 1
+54 2499 1
+54 2500 1
+54 2503 1
+54 2506 1
+54 2508 1
+54 2510 1
+54 2512 1
+54 2514 1
+54 2516 1
+54 2517 1
+54 2519 1
+54 2520 1
+54 2522 1
+54 2524 1
+54 2526 1
+54 2527 1
+54 2529 1
+54 2530 1
+54 2531 1
+54 2533 1
+54 2534 1
+54 2535 1
+54 2537 1
+54 2539 1
+54 2541 1
+54 2542 1
+54 2544 1
+54 2545 1
+54 2546 1
+54 2548 1
+54 2549 1
+54 2550 1
+54 2551 1
+54 2553 1
+54 2554 1
+54 2555 1
+54 2556 1
+54 2645 1
+54 2650 1
+54 2654 1
+54 2657 1
+54 2659 1
+54 2661 1
+54 2665 1
+54 2669 1
+54 2672 1
+54 2674 1
+54 2676 1
+54 2679 1
+54 2682 1
+54 2684 1
+54 2686 1
+54 2688 1
+54 2690 1
+54 2692 1
+54 2693 1
+54 2695 1
+54 2696 1
+54 2700 1
+54 2704 1
+54 2707 1
+54 2709 1
+54 2711 1
+54 2714 1
+54 2717 1
+54 2719 1
+54 2721 1
+54 2723 1
+54 2725 1
+54 2727 1
+54 2728 1
+54 2730 1
+54 2731 1
+54 2734 1
+54 2737 1
+54 2739 1
+54 2741 1
+54 2743 1
+54 2745 1
+54 2747 1
+54 2748 1
+54 2750 1
+54 2751 1
+54 2753 1
+54 2755 1
+54 2757 1
+54 2758 1
+54 2760 1
+54 2761 1
+54 2762 1
+54 2764 1
+54 2765 1
+54 2766 1
+54 2896 1
+54 2900 1
+54 2903 1
+54 2905 1
+54 2907 1
+54 2910 1
+54 2913 1
+54 2915 1
+54 2917 1
+54 2919 1
+54 2921 1
+54 2923 1
+54 2924 1
+54 2926 1
+54 2927 1
+54 2930 1
+54 2933 1
+54 2935 1
+54 2937 1
+54 2939 1
+54 2941 1
+54 2943 1
+54 2944 1
+54 2946 1
+54 2947 1
+54 2949 1
+54 2951 1
+54 2953 1
+54 2954 1
+54 2956 1
+54 2957 1
+54 2958 1
+54 2960 1
+54 2961 1
+54 2962 1
+54 2965 1
+54 2968 1
+54 2970 1
+54 2972 1
+54 2974 1
+54 2976 1
+54 2978 1
+54 2979 1
+54 2981 1
+54 2982 1
+54 2984 1
+54 2986 1
+54 2988 1
+54 2989 1
+54 2991 1
+54 2992 1
+54 2993 1
+54 2995 1
+54 2996 1
+54 2997 1
+54 2999 1
+54 3001 1
+54 3003 1
+54 3004 1
+54 3006 1
+54 3007 1
+54 3008 1
+54 3010 1
+54 3011 1
+54 3012 1
+54 3013 1
+54 3015 1
+54 3016 1
+54 3017 1
+54 3018 1
+54 3106 1
+54 3110 1
+54 3113 1
+54 3115 1
+54 3117 1
+54 3120 1
+54 3123 1
+54 3125 1
+54 3127 1
+54 3129 1
+54 3131 1
+54 3133 1
+54 3134 1
+54 3136 1
+54 3137 1
+54 3140 1
+54 3143 1
+54 3145 1
+54 3147 1
+54 3149 1
+54 3151 1
+54 3153 1
+54 3154 1
+54 3156 1
+54 3157 1
+54 3159 1
+54 3161 1
+54 3163 1
+54 3164 1
+54 3166 1
+54 3167 1
+54 3168 1
+54 3170 1
+54 3171 1
+54 3172 1
+54 3175 1
+54 3178 1
+54 3180 1
+54 3182 1
+54 3184 1
+54 3186 1
+54 3188 1
+54 3189 1
+54 3191 1
+54 3192 1
+54 3194 1
+54 3196 1
+54 3198 1
+54 3199 1
+54 3201 1
+54 3202 1
+54 3203 1
+54 3205 1
+54 3206 1
+54 3207 1
+54 3209 1
+54 3211 1
+54 3213 1
+54 3214 1
+54 3216 1
+54 3217 1
+54 3218 1
+54 3220 1
+54 3221 1
+54 3222 1
+54 3223 1
+54 3225 1
+54 3226 1
+54 3227 1
+54 3228 1
+54 3315 1
+54 3318 1
+54 3320 1
+54 3322 1
+54 3324 1
+54 3326 1
+54 3328 1
+54 3329 1
+54 3331 1
+54 3332 1
+54 3334 1
+54 3336 1
+54 3338 1
+54 3339 1
+54 3341 1
+54 3342 1
+54 3343 1
+54 3345 1
+54 3346 1
+54 3347 1
+54 3349 1
+54 3351 1
+54 3353 1
+54 3354 1
+54 3356 1
+54 3357 1
+54 3358 1
+54 3360 1
+54 3361 1
+54 3362 1
+54 3363 1
+54 3365 1
+54 3366 1
+54 3367 1
+54 3368 1
+54 3370 1
+54 3372 1
+54 3374 1
+54 3375 1
+54 3377 1
+54 3378 1
+54 3379 1
+54 3381 1
+54 3382 1
+54 3383 1
+54 3384 1
+54 3386 1
+54 3387 1
+54 3388 1
+54 3389 1
+54 3390 1
+54 3392 1
+54 3393 1
+54 3394 1
+54 3395 1
+54 3396 1
+55 8 1
+55 15 1
+55 21 1
+55 26 1
+55 30 1
+55 33 1
+55 35 1
+55 36 1
+55 127 1
+55 133 1
+55 138 1
+55 142 1
+55 145 1
+55 147 1
+55 148 1
+55 154 1
+55 159 1
+55 163 1
+55 166 1
+55 168 1
+55 169 1
+55 174 1
+55 178 1
+55 181 1
+55 183 1
+55 184 1
+55 188 1
+55 191 1
+55 193 1
+55 194 1
+55 197 1
+55 199 1
+55 200 1
+55 202 1
+55 203 1
+55 204 1
+55 337 1
+55 343 1
+55 348 1
+55 352 1
+55 355 1
+55 357 1
+55 358 1
+55 364 1
+55 369 1
+55 373 1
+55 376 1
+55 378 1
+55 379 1
+55 384 1
+55 388 1
+55 391 1
+55 393 1
+55 394 1
+55 398 1
+55 401 1
+55 403 1
+55 404 1
+55 407 1
+55 409 1
+55 410 1
+55 412 1
+55 413 1
+55 414 1
+55 546 1
+55 551 1
+55 555 1
+55 558 1
+55 560 1
+55 561 1
+55 566 1
+55 570 1
+55 573 1
+55 575 1
+55 576 1
+55 580 1
+55 583 1
+55 585 1
+55 586 1
+55 589 1
+55 591 1
+55 592 1
+55 594 1
+55 595 1
+55 596 1
+55 601 1
+55 605 1
+55 608 1
+55 610 1
+55 611 1
+55 615 1
+55 618 1
+55 620 1
+55 621 1
+55 624 1
+55 626 1
+55 627 1
+55 629 1
+55 630 1
+55 631 1
+55 635 1
+55 638 1
+55 640 1
+55 641 1
+55 644 1
+55 646 1
+55 647 1
+55 649 1
+55 650 1
+55 651 1
+55 654 1
+55 656 1
+55 657 1
+55 659 1
+55 660 1
+55 661 1
+55 663 1
+55 664 1
+55 665 1
+55 666 1
+55 799 1
+55 805 1
+55 810 1
+55 814 1
+55 817 1
+55 819 1
+55 820 1
+55 826 1
+55 831 1
+55 835 1
+55 838 1
+55 840 1
+55 841 1
+55 846 1
+55 850 1
+55 853 1
+55 855 1
+55 856 1
+55 860 1
+55 863 1
+55 865 1
+55 866 1
+55 869 1
+55 871 1
+55 872 1
+55 874 1
+55 875 1
+55 876 1
+55 1008 1
+55 1013 1
+55 1017 1
+55 1020 1
+55 1022 1
+55 1023 1
+55 1028 1
+55 1032 1
+55 1035 1
+55 1037 1
+55 1038 1
+55 1042 1
+55 1045 1
+55 1047 1
+55 1048 1
+55 1051 1
+55 1053 1
+55 1054 1
+55 1056 1
+55 1057 1
+55 1058 1
+55 1063 1
+55 1067 1
+55 1070 1
+55 1072 1
+55 1073 1
+55 1077 1
+55 1080 1
+55 1082 1
+55 1083 1
+55 1086 1
+55 1088 1
+55 1089 1
+55 1091 1
+55 1092 1
+55 1093 1
+55 1097 1
+55 1100 1
+55 1102 1
+55 1103 1
+55 1106 1
+55 1108 1
+55 1109 1
+55 1111 1
+55 1112 1
+55 1113 1
+55 1116 1
+55 1118 1
+55 1119 1
+55 1121 1
+55 1122 1
+55 1123 1
+55 1125 1
+55 1126 1
+55 1127 1
+55 1128 1
+55 1260 1
+55 1265 1
+55 1269 1
+55 1272 1
+55 1274 1
+55 1275 1
+55 1280 1
+55 1284 1
+55 1287 1
+55 1289 1
+55 1290 1
+55 1294 1
+55 1297 1
+55 1299 1
+55 1300 1
+55 1303 1
+55 1305 1
+55 1306 1
+55 1308 1
+55 1309 1
+55 1310 1
+55 1315 1
+55 1319 1
+55 1322 1
+55 1324 1
+55 1325 1
+55 1329 1
+55 1332 1
+55 1334 1
+55 1335 1
+55 1338 1
+55 1340 1
+55 1341 1
+55 1343 1
+55 1344 1
+55 1345 1
+55 1349 1
+55 1352 1
+55 1354 1
+55 1355 1
+55 1358 1
+55 1360 1
+55 1361 1
+55 1363 1
+55 1364 1
+55 1365 1
+55 1368 1
+55 1370 1
+55 1371 1
+55 1373 1
+55 1374 1
+55 1375 1
+55 1377 1
+55 1378 1
+55 1379 1
+55 1380 1
+55 1511 1
+55 1515 1
+55 1518 1
+55 1520 1
+55 1521 1
+55 1525 1
+55 1528 1
+55 1530 1
+55 1531 1
+55 1534 1
+55 1536 1
+55 1537 1
+55 1539 1
+55 1540 1
+55 1541 1
+55 1545 1
+55 1548 1
+55 1550 1
+55 1551 1
+55 1554 1
+55 1556 1
+55 1557 1
+55 1559 1
+55 1560 1
+55 1561 1
+55 1564 1
+55 1566 1
+55 1567 1
+55 1569 1
+55 1570 1
+55 1571 1
+55 1573 1
+55 1574 1
+55 1575 1
+55 1576 1
+55 1580 1
+55 1583 1
+55 1585 1
+55 1586 1
+55 1589 1
+55 1591 1
+55 1592 1
+55 1594 1
+55 1595 1
+55 1596 1
+55 1599 1
+55 1601 1
+55 1602 1
+55 1604 1
+55 1605 1
+55 1606 1
+55 1608 1
+55 1609 1
+55 1610 1
+55 1611 1
+55 1614 1
+55 1616 1
+55 1617 1
+55 1619 1
+55 1620 1
+55 1621 1
+55 1623 1
+55 1624 1
+55 1625 1
+55 1626 1
+55 1628 1
+55 1629 1
+55 1630 1
+55 1631 1
+55 1632 1
+55 1723 1
+55 1729 1
+55 1734 1
+55 1738 1
+55 1741 1
+55 1743 1
+55 1744 1
+55 1750 1
+55 1755 1
+55 1759 1
+55 1762 1
+55 1764 1
+55 1765 1
+55 1770 1
+55 1774 1
+55 1777 1
+55 1779 1
+55 1780 1
+55 1784 1
+55 1787 1
+55 1789 1
+55 1790 1
+55 1793 1
+55 1795 1
+55 1796 1
+55 1798 1
+55 1799 1
+55 1800 1
+55 1932 1
+55 1937 1
+55 1941 1
+55 1944 1
+55 1946 1
+55 1947 1
+55 1952 1
+55 1956 1
+55 1959 1
+55 1961 1
+55 1962 1
+55 1966 1
+55 1969 1
+55 1971 1
+55 1972 1
+55 1975 1
+55 1977 1
+55 1978 1
+55 1980 1
+55 1981 1
+55 1982 1
+55 1987 1
+55 1991 1
+55 1994 1
+55 1996 1
+55 1997 1
+55 2001 1
+55 2004 1
+55 2006 1
+55 2007 1
+55 2010 1
+55 2012 1
+55 2013 1
+55 2015 1
+55 2016 1
+55 2017 1
+55 2021 1
+55 2024 1
+55 2026 1
+55 2027 1
+55 2030 1
+55 2032 1
+55 2033 1
+55 2035 1
+55 2036 1
+55 2037 1
+55 2040 1
+55 2042 1
+55 2043 1
+55 2045 1
+55 2046 1
+55 2047 1
+55 2049 1
+55 2050 1
+55 2051 1
+55 2052 1
+55 2184 1
+55 2189 1
+55 2193 1
+55 2196 1
+55 2198 1
+55 2199 1
+55 2204 1
+55 2208 1
+55 2211 1
+55 2213 1
+55 2214 1
+55 2218 1
+55 2221 1
+55 2223 1
+55 2224 1
+55 2227 1
+55 2229 1
+55 2230 1
+55 2232 1
+55 2233 1
+55 2234 1
+55 2239 1
+55 2243 1
+55 2246 1
+55 2248 1
+55 2249 1
+55 2253 1
+55 2256 1
+55 2258 1
+55 2259 1
+55 2262 1
+55 2264 1
+55 2265 1
+55 2267 1
+55 2268 1
+55 2269 1
+55 2273 1
+55 2276 1
+55 2278 1
+55 2279 1
+55 2282 1
+55 2284 1
+55 2285 1
+55 2287 1
+55 2288 1
+55 2289 1
+55 2292 1
+55 2294 1
+55 2295 1
+55 2297 1
+55 2298 1
+55 2299 1
+55 2301 1
+55 2302 1
+55 2303 1
+55 2304 1
+55 2435 1
+55 2439 1
+55 2442 1
+55 2444 1
+55 2445 1
+55 2449 1
+55 2452 1
+55 2454 1
+55 2455 1
+55 2458 1
+55 2460 1
+55 2461 1
+55 2463 1
+55 2464 1
+55 2465 1
+55 2469 1
+55 2472 1
+55 2474 1
+55 2475 1
+55 2478 1
+55 2480 1
+55 2481 1
+55 2483 1
+55 2484 1
+55 2485 1
+55 2488 1
+55 2490 1
+55 2491 1
+55 2493 1
+55 2494 1
+55 2495 1
+55 2497 1
+55 2498 1
+55 2499 1
+55 2500 1
+55 2504 1
+55 2507 1
+55 2509 1
+55 2510 1
+55 2513 1
+55 2515 1
+55 2516 1
+55 2518 1
+55 2519 1
+55 2520 1
+55 2523 1
+55 2525 1
+55 2526 1
+55 2528 1
+55 2529 1
+55 2530 1
+55 2532 1
+55 2533 1
+55 2534 1
+55 2535 1
+55 2538 1
+55 2540 1
+55 2541 1
+55 2543 1
+55 2544 1
+55 2545 1
+55 2547 1
+55 2548 1
+55 2549 1
+55 2550 1
+55 2552 1
+55 2553 1
+55 2554 1
+55 2555 1
+55 2556 1
+55 2646 1
+55 2651 1
+55 2655 1
+55 2658 1
+55 2660 1
+55 2661 1
+55 2666 1
+55 2670 1
+55 2673 1
+55 2675 1
+55 2676 1
+55 2680 1
+55 2683 1
+55 2685 1
+55 2686 1
+55 2689 1
+55 2691 1
+55 2692 1
+55 2694 1
+55 2695 1
+55 2696 1
+55 2701 1
+55 2705 1
+55 2708 1
+55 2710 1
+55 2711 1
+55 2715 1
+55 2718 1
+55 2720 1
+55 2721 1
+55 2724 1
+55 2726 1
+55 2727 1
+55 2729 1
+55 2730 1
+55 2731 1
+55 2735 1
+55 2738 1
+55 2740 1
+55 2741 1
+55 2744 1
+55 2746 1
+55 2747 1
+55 2749 1
+55 2750 1
+55 2751 1
+55 2754 1
+55 2756 1
+55 2757 1
+55 2759 1
+55 2760 1
+55 2761 1
+55 2763 1
+55 2764 1
+55 2765 1
+55 2766 1
+55 2897 1
+55 2901 1
+55 2904 1
+55 2906 1
+55 2907 1
+55 2911 1
+55 2914 1
+55 2916 1
+55 2917 1
+55 2920 1
+55 2922 1
+55 2923 1
+55 2925 1
+55 2926 1
+55 2927 1
+55 2931 1
+55 2934 1
+55 2936 1
+55 2937 1
+55 2940 1
+55 2942 1
+55 2943 1
+55 2945 1
+55 2946 1
+55 2947 1
+55 2950 1
+55 2952 1
+55 2953 1
+55 2955 1
+55 2956 1
+55 2957 1
+55 2959 1
+55 2960 1
+55 2961 1
+55 2962 1
+55 2966 1
+55 2969 1
+55 2971 1
+55 2972 1
+55 2975 1
+55 2977 1
+55 2978 1
+55 2980 1
+55 2981 1
+55 2982 1
+55 2985 1
+55 2987 1
+55 2988 1
+55 2990 1
+55 2991 1
+55 2992 1
+55 2994 1
+55 2995 1
+55 2996 1
+55 2997 1
+55 3000 1
+55 3002 1
+55 3003 1
+55 3005 1
+55 3006 1
+55 3007 1
+55 3009 1
+55 3010 1
+55 3011 1
+55 3012 1
+55 3014 1
+55 3015 1
+55 3016 1
+55 3017 1
+55 3018 1
+55 3107 1
+55 3111 1
+55 3114 1
+55 3116 1
+55 3117 1
+55 3121 1
+55 3124 1
+55 3126 1
+55 3127 1
+55 3130 1
+55 3132 1
+55 3133 1
+55 3135 1
+55 3136 1
+55 3137 1
+55 3141 1
+55 3144 1
+55 3146 1
+55 3147 1
+55 3150 1
+55 3152 1
+55 3153 1
+55 3155 1
+55 3156 1
+55 3157 1
+55 3160 1
+55 3162 1
+55 3163 1
+55 3165 1
+55 3166 1
+55 3167 1
+55 3169 1
+55 3170 1
+55 3171 1
+55 3172 1
+55 3176 1
+55 3179 1
+55 3181 1
+55 3182 1
+55 3185 1
+55 3187 1
+55 3188 1
+55 3190 1
+55 3191 1
+55 3192 1
+55 3195 1
+55 3197 1
+55 3198 1
+55 3200 1
+55 3201 1
+55 3202 1
+55 3204 1
+55 3205 1
+55 3206 1
+55 3207 1
+55 3210 1
+55 3212 1
+55 3213 1
+55 3215 1
+55 3216 1
+55 3217 1
+55 3219 1
+55 3220 1
+55 3221 1
+55 3222 1
+55 3224 1
+55 3225 1
+55 3226 1
+55 3227 1
+55 3228 1
+55 3316 1
+55 3319 1
+55 3321 1
+55 3322 1
+55 3325 1
+55 3327 1
+55 3328 1
+55 3330 1
+55 3331 1
+55 3332 1
+55 3335 1
+55 3337 1
+55 3338 1
+55 3340 1
+55 3341 1
+55 3342 1
+55 3344 1
+55 3345 1
+55 3346 1
+55 3347 1
+55 3350 1
+55 3352 1
+55 3353 1
+55 3355 1
+55 3356 1
+55 3357 1
+55 3359 1
+55 3360 1
+55 3361 1
+55 3362 1
+55 3364 1
+55 3365 1
+55 3366 1
+55 3367 1
+55 3368 1
+55 3371 1
+55 3373 1
+55 3374 1
+55 3376 1
+55 3377 1
+55 3378 1
+55 3380 1
+55 3381 1
+55 3382 1
+55 3383 1
+55 3385 1
+55 3386 1
+55 3387 1
+55 3388 1
+55 3389 1
+55 3391 1
+55 3392 1
+55 3393 1
+55 3394 1
+55 3395 1
+55 3396 1
+56 1 1
+56 37 1
+56 38 1
+56 39 1
+56 40 1
+56 41 1
+56 42 1
+56 43 1
+56 121 1
+56 122 1
+56 123 1
+56 124 1
+56 125 1
+56 126 1
+56 127 1
+56 205 1
+56 206 1
+56 207 1
+56 208 1
+56 209 1
+56 210 1
+56 211 1
+56 212 1
+56 213 1
+56 214 1
+56 215 1
+56 216 1
+56 217 1
+56 218 1
+56 219 1
+56 220 1
+56 221 1
+56 222 1
+56 223 1
+56 224 1
+56 225 1
+56 331 1
+56 332 1
+56 333 1
+56 334 1
+56 335 1
+56 336 1
+56 337 1
+56 415 1
+56 416 1
+56 417 1
+56 418 1
+56 419 1
+56 420 1
+56 421 1
+56 422 1
+56 423 1
+56 424 1
+56 425 1
+56 426 1
+56 427 1
+56 428 1
+56 429 1
+56 430 1
+56 431 1
+56 432 1
+56 433 1
+56 434 1
+56 435 1
+56 541 1
+56 542 1
+56 543 1
+56 544 1
+56 545 1
+56 546 1
+56 547 1
+56 548 1
+56 549 1
+56 550 1
+56 551 1
+56 552 1
+56 553 1
+56 554 1
+56 555 1
+56 556 1
+56 557 1
+56 558 1
+56 559 1
+56 560 1
+56 561 1
+56 667 1
+56 668 1
+56 669 1
+56 670 1
+56 671 1
+56 672 1
+56 673 1
+56 674 1
+56 675 1
+56 676 1
+56 677 1
+56 678 1
+56 679 1
+56 680 1
+56 681 1
+56 682 1
+56 683 1
+56 684 1
+56 685 1
+56 686 1
+56 687 1
+56 688 1
+56 689 1
+56 690 1
+56 691 1
+56 692 1
+56 693 1
+56 694 1
+56 695 1
+56 696 1
+56 697 1
+56 698 1
+56 699 1
+56 700 1
+56 701 1
+56 793 1
+56 794 1
+56 795 1
+56 796 1
+56 797 1
+56 798 1
+56 799 1
+56 877 1
+56 878 1
+56 879 1
+56 880 1
+56 881 1
+56 882 1
+56 883 1
+56 884 1
+56 885 1
+56 886 1
+56 887 1
+56 888 1
+56 889 1
+56 890 1
+56 891 1
+56 892 1
+56 893 1
+56 894 1
+56 895 1
+56 896 1
+56 897 1
+56 1003 1
+56 1004 1
+56 1005 1
+56 1006 1
+56 1007 1
+56 1008 1
+56 1009 1
+56 1010 1
+56 1011 1
+56 1012 1
+56 1013 1
+56 1014 1
+56 1015 1
+56 1016 1
+56 1017 1
+56 1018 1
+56 1019 1
+56 1020 1
+56 1021 1
+56 1022 1
+56 1023 1
+56 1129 1
+56 1130 1
+56 1131 1
+56 1132 1
+56 1133 1
+56 1134 1
+56 1135 1
+56 1136 1
+56 1137 1
+56 1138 1
+56 1139 1
+56 1140 1
+56 1141 1
+56 1142 1
+56 1143 1
+56 1144 1
+56 1145 1
+56 1146 1
+56 1147 1
+56 1148 1
+56 1149 1
+56 1150 1
+56 1151 1
+56 1152 1
+56 1153 1
+56 1154 1
+56 1155 1
+56 1156 1
+56 1157 1
+56 1158 1
+56 1159 1
+56 1160 1
+56 1161 1
+56 1162 1
+56 1163 1
+56 1255 1
+56 1256 1
+56 1257 1
+56 1258 1
+56 1259 1
+56 1260 1
+56 1261 1
+56 1262 1
+56 1263 1
+56 1264 1
+56 1265 1
+56 1266 1
+56 1267 1
+56 1268 1
+56 1269 1
+56 1270 1
+56 1271 1
+56 1272 1
+56 1273 1
+56 1274 1
+56 1275 1
+56 1381 1
+56 1382 1
+56 1383 1
+56 1384 1
+56 1385 1
+56 1386 1
+56 1387 1
+56 1388 1
+56 1389 1
+56 1390 1
+56 1391 1
+56 1392 1
+56 1393 1
+56 1394 1
+56 1395 1
+56 1396 1
+56 1397 1
+56 1398 1
+56 1399 1
+56 1400 1
+56 1401 1
+56 1402 1
+56 1403 1
+56 1404 1
+56 1405 1
+56 1406 1
+56 1407 1
+56 1408 1
+56 1409 1
+56 1410 1
+56 1411 1
+56 1412 1
+56 1413 1
+56 1414 1
+56 1415 1
+56 1507 1
+56 1508 1
+56 1509 1
+56 1510 1
+56 1511 1
+56 1512 1
+56 1513 1
+56 1514 1
+56 1515 1
+56 1516 1
+56 1517 1
+56 1518 1
+56 1519 1
+56 1520 1
+56 1521 1
+56 1522 1
+56 1523 1
+56 1524 1
+56 1525 1
+56 1526 1
+56 1527 1
+56 1528 1
+56 1529 1
+56 1530 1
+56 1531 1
+56 1532 1
+56 1533 1
+56 1534 1
+56 1535 1
+56 1536 1
+56 1537 1
+56 1538 1
+56 1539 1
+56 1540 1
+56 1541 1
+56 1633 1
+56 1634 1
+56 1635 1
+56 1636 1
+56 1637 1
+56 1638 1
+56 1639 1
+56 1640 1
+56 1641 1
+56 1642 1
+56 1643 1
+56 1644 1
+56 1645 1
+56 1646 1
+56 1647 1
+56 1648 1
+56 1649 1
+56 1650 1
+56 1651 1
+56 1652 1
+56 1653 1
+56 1654 1
+56 1655 1
+56 1656 1
+56 1657 1
+56 1658 1
+56 1659 1
+56 1660 1
+56 1661 1
+56 1662 1
+56 1663 1
+56 1664 1
+56 1665 1
+56 1666 1
+56 1667 1
+56 1717 1
+56 1718 1
+56 1719 1
+56 1720 1
+56 1721 1
+56 1722 1
+56 1723 1
+56 1801 1
+56 1802 1
+56 1803 1
+56 1804 1
+56 1805 1
+56 1806 1
+56 1807 1
+56 1808 1
+56 1809 1
+56 1810 1
+56 1811 1
+56 1812 1
+56 1813 1
+56 1814 1
+56 1815 1
+56 1816 1
+56 1817 1
+56 1818 1
+56 1819 1
+56 1820 1
+56 1821 1
+56 1927 1
+56 1928 1
+56 1929 1
+56 1930 1
+56 1931 1
+56 1932 1
+56 1933 1
+56 1934 1
+56 1935 1
+56 1936 1
+56 1937 1
+56 1938 1
+56 1939 1
+56 1940 1
+56 1941 1
+56 1942 1
+56 1943 1
+56 1944 1
+56 1945 1
+56 1946 1
+56 1947 1
+56 2053 1
+56 2054 1
+56 2055 1
+56 2056 1
+56 2057 1
+56 2058 1
+56 2059 1
+56 2060 1
+56 2061 1
+56 2062 1
+56 2063 1
+56 2064 1
+56 2065 1
+56 2066 1
+56 2067 1
+56 2068 1
+56 2069 1
+56 2070 1
+56 2071 1
+56 2072 1
+56 2073 1
+56 2074 1
+56 2075 1
+56 2076 1
+56 2077 1
+56 2078 1
+56 2079 1
+56 2080 1
+56 2081 1
+56 2082 1
+56 2083 1
+56 2084 1
+56 2085 1
+56 2086 1
+56 2087 1
+56 2179 1
+56 2180 1
+56 2181 1
+56 2182 1
+56 2183 1
+56 2184 1
+56 2185 1
+56 2186 1
+56 2187 1
+56 2188 1
+56 2189 1
+56 2190 1
+56 2191 1
+56 2192 1
+56 2193 1
+56 2194 1
+56 2195 1
+56 2196 1
+56 2197 1
+56 2198 1
+56 2199 1
+56 2305 1
+56 2306 1
+56 2307 1
+56 2308 1
+56 2309 1
+56 2310 1
+56 2311 1
+56 2312 1
+56 2313 1
+56 2314 1
+56 2315 1
+56 2316 1
+56 2317 1
+56 2318 1
+56 2319 1
+56 2320 1
+56 2321 1
+56 2322 1
+56 2323 1
+56 2324 1
+56 2325 1
+56 2326 1
+56 2327 1
+56 2328 1
+56 2329 1
+56 2330 1
+56 2331 1
+56 2332 1
+56 2333 1
+56 2334 1
+56 2335 1
+56 2336 1
+56 2337 1
+56 2338 1
+56 2339 1
+56 2431 1
+56 2432 1
+56 2433 1
+56 2434 1
+56 2435 1
+56 2436 1
+56 2437 1
+56 2438 1
+56 2439 1
+56 2440 1
+56 2441 1
+56 2442 1
+56 2443 1
+56 2444 1
+56 2445 1
+56 2446 1
+56 2447 1
+56 2448 1
+56 2449 1
+56 2450 1
+56 2451 1
+56 2452 1
+56 2453 1
+56 2454 1
+56 2455 1
+56 2456 1
+56 2457 1
+56 2458 1
+56 2459 1
+56 2460 1
+56 2461 1
+56 2462 1
+56 2463 1
+56 2464 1
+56 2465 1
+56 2557 1
+56 2558 1
+56 2559 1
+56 2560 1
+56 2561 1
+56 2562 1
+56 2563 1
+56 2564 1
+56 2565 1
+56 2566 1
+56 2567 1
+56 2568 1
+56 2569 1
+56 2570 1
+56 2571 1
+56 2572 1
+56 2573 1
+56 2574 1
+56 2575 1
+56 2576 1
+56 2577 1
+56 2578 1
+56 2579 1
+56 2580 1
+56 2581 1
+56 2582 1
+56 2583 1
+56 2584 1
+56 2585 1
+56 2586 1
+56 2587 1
+56 2588 1
+56 2589 1
+56 2590 1
+56 2591 1
+56 2641 1
+56 2642 1
+56 2643 1
+56 2644 1
+56 2645 1
+56 2646 1
+56 2647 1
+56 2648 1
+56 2649 1
+56 2650 1
+56 2651 1
+56 2652 1
+56 2653 1
+56 2654 1
+56 2655 1
+56 2656 1
+56 2657 1
+56 2658 1
+56 2659 1
+56 2660 1
+56 2661 1
+56 2767 1
+56 2768 1
+56 2769 1
+56 2770 1
+56 2771 1
+56 2772 1
+56 2773 1
+56 2774 1
+56 2775 1
+56 2776 1
+56 2777 1
+56 2778 1
+56 2779 1
+56 2780 1
+56 2781 1
+56 2782 1
+56 2783 1
+56 2784 1
+56 2785 1
+56 2786 1
+56 2787 1
+56 2788 1
+56 2789 1
+56 2790 1
+56 2791 1
+56 2792 1
+56 2793 1
+56 2794 1
+56 2795 1
+56 2796 1
+56 2797 1
+56 2798 1
+56 2799 1
+56 2800 1
+56 2801 1
+56 2893 1
+56 2894 1
+56 2895 1
+56 2896 1
+56 2897 1
+56 2898 1
+56 2899 1
+56 2900 1
+56 2901 1
+56 2902 1
+56 2903 1
+56 2904 1
+56 2905 1
+56 2906 1
+56 2907 1
+56 2908 1
+56 2909 1
+56 2910 1
+56 2911 1
+56 2912 1
+56 2913 1
+56 2914 1
+56 2915 1
+56 2916 1
+56 2917 1
+56 2918 1
+56 2919 1
+56 2920 1
+56 2921 1
+56 2922 1
+56 2923 1
+56 2924 1
+56 2925 1
+56 2926 1
+56 2927 1
+56 3019 1
+56 3020 1
+56 3021 1
+56 3022 1
+56 3023 1
+56 3024 1
+56 3025 1
+56 3026 1
+56 3027 1
+56 3028 1
+56 3029 1
+56 3030 1
+56 3031 1
+56 3032 1
+56 3033 1
+56 3034 1
+56 3035 1
+56 3036 1
+56 3037 1
+56 3038 1
+56 3039 1
+56 3040 1
+56 3041 1
+56 3042 1
+56 3043 1
+56 3044 1
+56 3045 1
+56 3046 1
+56 3047 1
+56 3048 1
+56 3049 1
+56 3050 1
+56 3051 1
+56 3052 1
+56 3053 1
+56 3103 1
+56 3104 1
+56 3105 1
+56 3106 1
+56 3107 1
+56 3108 1
+56 3109 1
+56 3110 1
+56 3111 1
+56 3112 1
+56 3113 1
+56 3114 1
+56 3115 1
+56 3116 1
+56 3117 1
+56 3118 1
+56 3119 1
+56 3120 1
+56 3121 1
+56 3122 1
+56 3123 1
+56 3124 1
+56 3125 1
+56 3126 1
+56 3127 1
+56 3128 1
+56 3129 1
+56 3130 1
+56 3131 1
+56 3132 1
+56 3133 1
+56 3134 1
+56 3135 1
+56 3136 1
+56 3137 1
+56 3229 1
+56 3230 1
+56 3231 1
+56 3232 1
+56 3233 1
+56 3234 1
+56 3235 1
+56 3236 1
+56 3237 1
+56 3238 1
+56 3239 1
+56 3240 1
+56 3241 1
+56 3242 1
+56 3243 1
+56 3244 1
+56 3245 1
+56 3246 1
+56 3247 1
+56 3248 1
+56 3249 1
+56 3250 1
+56 3251 1
+56 3252 1
+56 3253 1
+56 3254 1
+56 3255 1
+56 3256 1
+56 3257 1
+56 3258 1
+56 3259 1
+56 3260 1
+56 3261 1
+56 3262 1
+56 3263 1
+56 3313 1
+56 3314 1
+56 3315 1
+56 3316 1
+56 3317 1
+56 3318 1
+56 3319 1
+56 3320 1
+56 3321 1
+56 3322 1
+56 3323 1
+56 3324 1
+56 3325 1
+56 3326 1
+56 3327 1
+56 3328 1
+56 3329 1
+56 3330 1
+56 3331 1
+56 3332 1
+56 3333 1
+56 3334 1
+56 3335 1
+56 3336 1
+56 3337 1
+56 3338 1
+56 3339 1
+56 3340 1
+56 3341 1
+56 3342 1
+56 3343 1
+56 3344 1
+56 3345 1
+56 3346 1
+56 3347 1
+56 3397 1
+56 3398 1
+56 3399 1
+56 3400 1
+56 3401 1
+56 3402 1
+56 3403 1
+56 3404 1
+56 3405 1
+56 3406 1
+56 3407 1
+56 3408 1
+56 3409 1
+56 3410 1
+56 3411 1
+56 3412 1
+56 3413 1
+56 3414 1
+56 3415 1
+56 3416 1
+56 3417 1
+57 2 1
+57 37 1
+57 44 1
+57 45 1
+57 46 1
+57 47 1
+57 48 1
+57 49 1
+57 121 1
+57 128 1
+57 129 1
+57 130 1
+57 131 1
+57 132 1
+57 133 1
+57 205 1
+57 206 1
+57 207 1
+57 208 1
+57 209 1
+57 210 1
+57 226 1
+57 227 1
+57 228 1
+57 229 1
+57 230 1
+57 231 1
+57 232 1
+57 233 1
+57 234 1
+57 235 1
+57 236 1
+57 237 1
+57 238 1
+57 239 1
+57 240 1
+57 331 1
+57 338 1
+57 339 1
+57 340 1
+57 341 1
+57 342 1
+57 343 1
+57 415 1
+57 416 1
+57 417 1
+57 418 1
+57 419 1
+57 420 1
+57 436 1
+57 437 1
+57 438 1
+57 439 1
+57 440 1
+57 441 1
+57 442 1
+57 443 1
+57 444 1
+57 445 1
+57 446 1
+57 447 1
+57 448 1
+57 449 1
+57 450 1
+57 541 1
+57 542 1
+57 543 1
+57 544 1
+57 545 1
+57 546 1
+57 562 1
+57 563 1
+57 564 1
+57 565 1
+57 566 1
+57 567 1
+57 568 1
+57 569 1
+57 570 1
+57 571 1
+57 572 1
+57 573 1
+57 574 1
+57 575 1
+57 576 1
+57 667 1
+57 668 1
+57 669 1
+57 670 1
+57 671 1
+57 672 1
+57 673 1
+57 674 1
+57 675 1
+57 676 1
+57 677 1
+57 678 1
+57 679 1
+57 680 1
+57 681 1
+57 702 1
+57 703 1
+57 704 1
+57 705 1
+57 706 1
+57 707 1
+57 708 1
+57 709 1
+57 710 1
+57 711 1
+57 712 1
+57 713 1
+57 714 1
+57 715 1
+57 716 1
+57 717 1
+57 718 1
+57 719 1
+57 720 1
+57 721 1
+57 793 1
+57 800 1
+57 801 1
+57 802 1
+57 803 1
+57 804 1
+57 805 1
+57 877 1
+57 878 1
+57 879 1
+57 880 1
+57 881 1
+57 882 1
+57 898 1
+57 899 1
+57 900 1
+57 901 1
+57 902 1
+57 903 1
+57 904 1
+57 905 1
+57 906 1
+57 907 1
+57 908 1
+57 909 1
+57 910 1
+57 911 1
+57 912 1
+57 1003 1
+57 1004 1
+57 1005 1
+57 1006 1
+57 1007 1
+57 1008 1
+57 1024 1
+57 1025 1
+57 1026 1
+57 1027 1
+57 1028 1
+57 1029 1
+57 1030 1
+57 1031 1
+57 1032 1
+57 1033 1
+57 1034 1
+57 1035 1
+57 1036 1
+57 1037 1
+57 1038 1
+57 1129 1
+57 1130 1
+57 1131 1
+57 1132 1
+57 1133 1
+57 1134 1
+57 1135 1
+57 1136 1
+57 1137 1
+57 1138 1
+57 1139 1
+57 1140 1
+57 1141 1
+57 1142 1
+57 1143 1
+57 1164 1
+57 1165 1
+57 1166 1
+57 1167 1
+57 1168 1
+57 1169 1
+57 1170 1
+57 1171 1
+57 1172 1
+57 1173 1
+57 1174 1
+57 1175 1
+57 1176 1
+57 1177 1
+57 1178 1
+57 1179 1
+57 1180 1
+57 1181 1
+57 1182 1
+57 1183 1
+57 1255 1
+57 1256 1
+57 1257 1
+57 1258 1
+57 1259 1
+57 1260 1
+57 1276 1
+57 1277 1
+57 1278 1
+57 1279 1
+57 1280 1
+57 1281 1
+57 1282 1
+57 1283 1
+57 1284 1
+57 1285 1
+57 1286 1
+57 1287 1
+57 1288 1
+57 1289 1
+57 1290 1
+57 1381 1
+57 1382 1
+57 1383 1
+57 1384 1
+57 1385 1
+57 1386 1
+57 1387 1
+57 1388 1
+57 1389 1
+57 1390 1
+57 1391 1
+57 1392 1
+57 1393 1
+57 1394 1
+57 1395 1
+57 1416 1
+57 1417 1
+57 1418 1
+57 1419 1
+57 1420 1
+57 1421 1
+57 1422 1
+57 1423 1
+57 1424 1
+57 1425 1
+57 1426 1
+57 1427 1
+57 1428 1
+57 1429 1
+57 1430 1
+57 1431 1
+57 1432 1
+57 1433 1
+57 1434 1
+57 1435 1
+57 1507 1
+57 1508 1
+57 1509 1
+57 1510 1
+57 1511 1
+57 1512 1
+57 1513 1
+57 1514 1
+57 1515 1
+57 1516 1
+57 1517 1
+57 1518 1
+57 1519 1
+57 1520 1
+57 1521 1
+57 1542 1
+57 1543 1
+57 1544 1
+57 1545 1
+57 1546 1
+57 1547 1
+57 1548 1
+57 1549 1
+57 1550 1
+57 1551 1
+57 1552 1
+57 1553 1
+57 1554 1
+57 1555 1
+57 1556 1
+57 1557 1
+57 1558 1
+57 1559 1
+57 1560 1
+57 1561 1
+57 1633 1
+57 1634 1
+57 1635 1
+57 1636 1
+57 1637 1
+57 1638 1
+57 1639 1
+57 1640 1
+57 1641 1
+57 1642 1
+57 1643 1
+57 1644 1
+57 1645 1
+57 1646 1
+57 1647 1
+57 1648 1
+57 1649 1
+57 1650 1
+57 1651 1
+57 1652 1
+57 1668 1
+57 1669 1
+57 1670 1
+57 1671 1
+57 1672 1
+57 1673 1
+57 1674 1
+57 1675 1
+57 1676 1
+57 1677 1
+57 1678 1
+57 1679 1
+57 1680 1
+57 1681 1
+57 1682 1
+57 1717 1
+57 1724 1
+57 1725 1
+57 1726 1
+57 1727 1
+57 1728 1
+57 1729 1
+57 1801 1
+57 1802 1
+57 1803 1
+57 1804 1
+57 1805 1
+57 1806 1
+57 1822 1
+57 1823 1
+57 1824 1
+57 1825 1
+57 1826 1
+57 1827 1
+57 1828 1
+57 1829 1
+57 1830 1
+57 1831 1
+57 1832 1
+57 1833 1
+57 1834 1
+57 1835 1
+57 1836 1
+57 1927 1
+57 1928 1
+57 1929 1
+57 1930 1
+57 1931 1
+57 1932 1
+57 1948 1
+57 1949 1
+57 1950 1
+57 1951 1
+57 1952 1
+57 1953 1
+57 1954 1
+57 1955 1
+57 1956 1
+57 1957 1
+57 1958 1
+57 1959 1
+57 1960 1
+57 1961 1
+57 1962 1
+57 2053 1
+57 2054 1
+57 2055 1
+57 2056 1
+57 2057 1
+57 2058 1
+57 2059 1
+57 2060 1
+57 2061 1
+57 2062 1
+57 2063 1
+57 2064 1
+57 2065 1
+57 2066 1
+57 2067 1
+57 2088 1
+57 2089 1
+57 2090 1
+57 2091 1
+57 2092 1
+57 2093 1
+57 2094 1
+57 2095 1
+57 2096 1
+57 2097 1
+57 2098 1
+57 2099 1
+57 2100 1
+57 2101 1
+57 2102 1
+57 2103 1
+57 2104 1
+57 2105 1
+57 2106 1
+57 2107 1
+57 2179 1
+57 2180 1
+57 2181 1
+57 2182 1
+57 2183 1
+57 2184 1
+57 2200 1
+57 2201 1
+57 2202 1
+57 2203 1
+57 2204 1
+57 2205 1
+57 2206 1
+57 2207 1
+57 2208 1
+57 2209 1
+57 2210 1
+57 2211 1
+57 2212 1
+57 2213 1
+57 2214 1
+57 2305 1
+57 2306 1
+57 2307 1
+57 2308 1
+57 2309 1
+57 2310 1
+57 2311 1
+57 2312 1
+57 2313 1
+57 2314 1
+57 2315 1
+57 2316 1
+57 2317 1
+57 2318 1
+57 2319 1
+57 2340 1
+57 2341 1
+57 2342 1
+57 2343 1
+57 2344 1
+57 2345 1
+57 2346 1
+57 2347 1
+57 2348 1
+57 2349 1
+57 2350 1
+57 2351 1
+57 2352 1
+57 2353 1
+57 2354 1
+57 2355 1
+57 2356 1
+57 2357 1
+57 2358 1
+57 2359 1
+57 2431 1
+57 2432 1
+57 2433 1
+57 2434 1
+57 2435 1
+57 2436 1
+57 2437 1
+57 2438 1
+57 2439 1
+57 2440 1
+57 2441 1
+57 2442 1
+57 2443 1
+57 2444 1
+57 2445 1
+57 2466 1
+57 2467 1
+57 2468 1
+57 2469 1
+57 2470 1
+57 2471 1
+57 2472 1
+57 2473 1
+57 2474 1
+57 2475 1
+57 2476 1
+57 2477 1
+57 2478 1
+57 2479 1
+57 2480 1
+57 2481 1
+57 2482 1
+57 2483 1
+57 2484 1
+57 2485 1
+57 2557 1
+57 2558 1
+57 2559 1
+57 2560 1
+57 2561 1
+57 2562 1
+57 2563 1
+57 2564 1
+57 2565 1
+57 2566 1
+57 2567 1
+57 2568 1
+57 2569 1
+57 2570 1
+57 2571 1
+57 2572 1
+57 2573 1
+57 2574 1
+57 2575 1
+57 2576 1
+57 2592 1
+57 2593 1
+57 2594 1
+57 2595 1
+57 2596 1
+57 2597 1
+57 2598 1
+57 2599 1
+57 2600 1
+57 2601 1
+57 2602 1
+57 2603 1
+57 2604 1
+57 2605 1
+57 2606 1
+57 2641 1
+57 2642 1
+57 2643 1
+57 2644 1
+57 2645 1
+57 2646 1
+57 2662 1
+57 2663 1
+57 2664 1
+57 2665 1
+57 2666 1
+57 2667 1
+57 2668 1
+57 2669 1
+57 2670 1
+57 2671 1
+57 2672 1
+57 2673 1
+57 2674 1
+57 2675 1
+57 2676 1
+57 2767 1
+57 2768 1
+57 2769 1
+57 2770 1
+57 2771 1
+57 2772 1
+57 2773 1
+57 2774 1
+57 2775 1
+57 2776 1
+57 2777 1
+57 2778 1
+57 2779 1
+57 2780 1
+57 2781 1
+57 2802 1
+57 2803 1
+57 2804 1
+57 2805 1
+57 2806 1
+57 2807 1
+57 2808 1
+57 2809 1
+57 2810 1
+57 2811 1
+57 2812 1
+57 2813 1
+57 2814 1
+57 2815 1
+57 2816 1
+57 2817 1
+57 2818 1
+57 2819 1
+57 2820 1
+57 2821 1
+57 2893 1
+57 2894 1
+57 2895 1
+57 2896 1
+57 2897 1
+57 2898 1
+57 2899 1
+57 2900 1
+57 2901 1
+57 2902 1
+57 2903 1
+57 2904 1
+57 2905 1
+57 2906 1
+57 2907 1
+57 2928 1
+57 2929 1
+57 2930 1
+57 2931 1
+57 2932 1
+57 2933 1
+57 2934 1
+57 2935 1
+57 2936 1
+57 2937 1
+57 2938 1
+57 2939 1
+57 2940 1
+57 2941 1
+57 2942 1
+57 2943 1
+57 2944 1
+57 2945 1
+57 2946 1
+57 2947 1
+57 3019 1
+57 3020 1
+57 3021 1
+57 3022 1
+57 3023 1
+57 3024 1
+57 3025 1
+57 3026 1
+57 3027 1
+57 3028 1
+57 3029 1
+57 3030 1
+57 3031 1
+57 3032 1
+57 3033 1
+57 3034 1
+57 3035 1
+57 3036 1
+57 3037 1
+57 3038 1
+57 3054 1
+57 3055 1
+57 3056 1
+57 3057 1
+57 3058 1
+57 3059 1
+57 3060 1
+57 3061 1
+57 3062 1
+57 3063 1
+57 3064 1
+57 3065 1
+57 3066 1
+57 3067 1
+57 3068 1
+57 3103 1
+57 3104 1
+57 3105 1
+57 3106 1
+57 3107 1
+57 3108 1
+57 3109 1
+57 3110 1
+57 3111 1
+57 3112 1
+57 3113 1
+57 3114 1
+57 3115 1
+57 3116 1
+57 3117 1
+57 3138 1
+57 3139 1
+57 3140 1
+57 3141 1
+57 3142 1
+57 3143 1
+57 3144 1
+57 3145 1
+57 3146 1
+57 3147 1
+57 3148 1
+57 3149 1
+57 3150 1
+57 3151 1
+57 3152 1
+57 3153 1
+57 3154 1
+57 3155 1
+57 3156 1
+57 3157 1
+57 3229 1
+57 3230 1
+57 3231 1
+57 3232 1
+57 3233 1
+57 3234 1
+57 3235 1
+57 3236 1
+57 3237 1
+57 3238 1
+57 3239 1
+57 3240 1
+57 3241 1
+57 3242 1
+57 3243 1
+57 3244 1
+57 3245 1
+57 3246 1
+57 3247 1
+57 3248 1
+57 3264 1
+57 3265 1
+57 3266 1
+57 3267 1
+57 3268 1
+57 3269 1
+57 3270 1
+57 3271 1
+57 3272 1
+57 3273 1
+57 3274 1
+57 3275 1
+57 3276 1
+57 3277 1
+57 3278 1
+57 3313 1
+57 3314 1
+57 3315 1
+57 3316 1
+57 3317 1
+57 3318 1
+57 3319 1
+57 3320 1
+57 3321 1
+57 3322 1
+57 3323 1
+57 3324 1
+57 3325 1
+57 3326 1
+57 3327 1
+57 3328 1
+57 3329 1
+57 3330 1
+57 3331 1
+57 3332 1
+57 3348 1
+57 3349 1
+57 3350 1
+57 3351 1
+57 3352 1
+57 3353 1
+57 3354 1
+57 3355 1
+57 3356 1
+57 3357 1
+57 3358 1
+57 3359 1
+57 3360 1
+57 3361 1
+57 3362 1
+57 3397 1
+57 3398 1
+57 3399 1
+57 3400 1
+57 3401 1
+57 3402 1
+57 3403 1
+57 3404 1
+57 3405 1
+57 3406 1
+57 3407 1
+57 3408 1
+57 3409 1
+57 3410 1
+57 3411 1
+57 3418 1
+57 3419 1
+57 3420 1
+57 3421 1
+57 3422 1
+57 3423 1
+58 3 1
+58 38 1
+58 44 1
+58 50 1
+58 51 1
+58 52 1
+58 53 1
+58 54 1
+58 122 1
+58 128 1
+58 134 1
+58 135 1
+58 136 1
+58 137 1
+58 138 1
+58 205 1
+58 211 1
+58 212 1
+58 213 1
+58 214 1
+58 215 1
+58 226 1
+58 227 1
+58 228 1
+58 229 1
+58 230 1
+58 241 1
+58 242 1
+58 243 1
+58 244 1
+58 245 1
+58 246 1
+58 247 1
+58 248 1
+58 249 1
+58 250 1
+58 332 1
+58 338 1
+58 344 1
+58 345 1
+58 346 1
+58 347 1
+58 348 1
+58 415 1
+58 421 1
+58 422 1
+58 423 1
+58 424 1
+58 425 1
+58 436 1
+58 437 1
+58 438 1
+58 439 1
+58 440 1
+58 451 1
+58 452 1
+58 453 1
+58 454 1
+58 455 1
+58 456 1
+58 457 1
+58 458 1
+58 459 1
+58 460 1
+58 541 1
+58 547 1
+58 548 1
+58 549 1
+58 550 1
+58 551 1
+58 562 1
+58 563 1
+58 564 1
+58 565 1
+58 566 1
+58 577 1
+58 578 1
+58 579 1
+58 580 1
+58 581 1
+58 582 1
+58 583 1
+58 584 1
+58 585 1
+58 586 1
+58 667 1
+58 668 1
+58 669 1
+58 670 1
+58 671 1
+58 682 1
+58 683 1
+58 684 1
+58 685 1
+58 686 1
+58 687 1
+58 688 1
+58 689 1
+58 690 1
+58 691 1
+58 702 1
+58 703 1
+58 704 1
+58 705 1
+58 706 1
+58 707 1
+58 708 1
+58 709 1
+58 710 1
+58 711 1
+58 722 1
+58 723 1
+58 724 1
+58 725 1
+58 726 1
+58 727 1
+58 728 1
+58 729 1
+58 730 1
+58 731 1
+58 794 1
+58 800 1
+58 806 1
+58 807 1
+58 808 1
+58 809 1
+58 810 1
+58 877 1
+58 883 1
+58 884 1
+58 885 1
+58 886 1
+58 887 1
+58 898 1
+58 899 1
+58 900 1
+58 901 1
+58 902 1
+58 913 1
+58 914 1
+58 915 1
+58 916 1
+58 917 1
+58 918 1
+58 919 1
+58 920 1
+58 921 1
+58 922 1
+58 1003 1
+58 1009 1
+58 1010 1
+58 1011 1
+58 1012 1
+58 1013 1
+58 1024 1
+58 1025 1
+58 1026 1
+58 1027 1
+58 1028 1
+58 1039 1
+58 1040 1
+58 1041 1
+58 1042 1
+58 1043 1
+58 1044 1
+58 1045 1
+58 1046 1
+58 1047 1
+58 1048 1
+58 1129 1
+58 1130 1
+58 1131 1
+58 1132 1
+58 1133 1
+58 1144 1
+58 1145 1
+58 1146 1
+58 1147 1
+58 1148 1
+58 1149 1
+58 1150 1
+58 1151 1
+58 1152 1
+58 1153 1
+58 1164 1
+58 1165 1
+58 1166 1
+58 1167 1
+58 1168 1
+58 1169 1
+58 1170 1
+58 1171 1
+58 1172 1
+58 1173 1
+58 1184 1
+58 1185 1
+58 1186 1
+58 1187 1
+58 1188 1
+58 1189 1
+58 1190 1
+58 1191 1
+58 1192 1
+58 1193 1
+58 1255 1
+58 1261 1
+58 1262 1
+58 1263 1
+58 1264 1
+58 1265 1
+58 1276 1
+58 1277 1
+58 1278 1
+58 1279 1
+58 1280 1
+58 1291 1
+58 1292 1
+58 1293 1
+58 1294 1
+58 1295 1
+58 1296 1
+58 1297 1
+58 1298 1
+58 1299 1
+58 1300 1
+58 1381 1
+58 1382 1
+58 1383 1
+58 1384 1
+58 1385 1
+58 1396 1
+58 1397 1
+58 1398 1
+58 1399 1
+58 1400 1
+58 1401 1
+58 1402 1
+58 1403 1
+58 1404 1
+58 1405 1
+58 1416 1
+58 1417 1
+58 1418 1
+58 1419 1
+58 1420 1
+58 1421 1
+58 1422 1
+58 1423 1
+58 1424 1
+58 1425 1
+58 1436 1
+58 1437 1
+58 1438 1
+58 1439 1
+58 1440 1
+58 1441 1
+58 1442 1
+58 1443 1
+58 1444 1
+58 1445 1
+58 1507 1
+58 1508 1
+58 1509 1
+58 1510 1
+58 1511 1
+58 1522 1
+58 1523 1
+58 1524 1
+58 1525 1
+58 1526 1
+58 1527 1
+58 1528 1
+58 1529 1
+58 1530 1
+58 1531 1
+58 1542 1
+58 1543 1
+58 1544 1
+58 1545 1
+58 1546 1
+58 1547 1
+58 1548 1
+58 1549 1
+58 1550 1
+58 1551 1
+58 1562 1
+58 1563 1
+58 1564 1
+58 1565 1
+58 1566 1
+58 1567 1
+58 1568 1
+58 1569 1
+58 1570 1
+58 1571 1
+58 1633 1
+58 1634 1
+58 1635 1
+58 1636 1
+58 1637 1
+58 1638 1
+58 1639 1
+58 1640 1
+58 1641 1
+58 1642 1
+58 1653 1
+58 1654 1
+58 1655 1
+58 1656 1
+58 1657 1
+58 1658 1
+58 1659 1
+58 1660 1
+58 1661 1
+58 1662 1
+58 1668 1
+58 1669 1
+58 1670 1
+58 1671 1
+58 1672 1
+58 1673 1
+58 1674 1
+58 1675 1
+58 1676 1
+58 1677 1
+58 1683 1
+58 1684 1
+58 1685 1
+58 1686 1
+58 1687 1
+58 1718 1
+58 1724 1
+58 1730 1
+58 1731 1
+58 1732 1
+58 1733 1
+58 1734 1
+58 1801 1
+58 1807 1
+58 1808 1
+58 1809 1
+58 1810 1
+58 1811 1
+58 1822 1
+58 1823 1
+58 1824 1
+58 1825 1
+58 1826 1
+58 1837 1
+58 1838 1
+58 1839 1
+58 1840 1
+58 1841 1
+58 1842 1
+58 1843 1
+58 1844 1
+58 1845 1
+58 1846 1
+58 1927 1
+58 1933 1
+58 1934 1
+58 1935 1
+58 1936 1
+58 1937 1
+58 1948 1
+58 1949 1
+58 1950 1
+58 1951 1
+58 1952 1
+58 1963 1
+58 1964 1
+58 1965 1
+58 1966 1
+58 1967 1
+58 1968 1
+58 1969 1
+58 1970 1
+58 1971 1
+58 1972 1
+58 2053 1
+58 2054 1
+58 2055 1
+58 2056 1
+58 2057 1
+58 2068 1
+58 2069 1
+58 2070 1
+58 2071 1
+58 2072 1
+58 2073 1
+58 2074 1
+58 2075 1
+58 2076 1
+58 2077 1
+58 2088 1
+58 2089 1
+58 2090 1
+58 2091 1
+58 2092 1
+58 2093 1
+58 2094 1
+58 2095 1
+58 2096 1
+58 2097 1
+58 2108 1
+58 2109 1
+58 2110 1
+58 2111 1
+58 2112 1
+58 2113 1
+58 2114 1
+58 2115 1
+58 2116 1
+58 2117 1
+58 2179 1
+58 2185 1
+58 2186 1
+58 2187 1
+58 2188 1
+58 2189 1
+58 2200 1
+58 2201 1
+58 2202 1
+58 2203 1
+58 2204 1
+58 2215 1
+58 2216 1
+58 2217 1
+58 2218 1
+58 2219 1
+58 2220 1
+58 2221 1
+58 2222 1
+58 2223 1
+58 2224 1
+58 2305 1
+58 2306 1
+58 2307 1
+58 2308 1
+58 2309 1
+58 2320 1
+58 2321 1
+58 2322 1
+58 2323 1
+58 2324 1
+58 2325 1
+58 2326 1
+58 2327 1
+58 2328 1
+58 2329 1
+58 2340 1
+58 2341 1
+58 2342 1
+58 2343 1
+58 2344 1
+58 2345 1
+58 2346 1
+58 2347 1
+58 2348 1
+58 2349 1
+58 2360 1
+58 2361 1
+58 2362 1
+58 2363 1
+58 2364 1
+58 2365 1
+58 2366 1
+58 2367 1
+58 2368 1
+58 2369 1
+58 2431 1
+58 2432 1
+58 2433 1
+58 2434 1
+58 2435 1
+58 2446 1
+58 2447 1
+58 2448 1
+58 2449 1
+58 2450 1
+58 2451 1
+58 2452 1
+58 2453 1
+58 2454 1
+58 2455 1
+58 2466 1
+58 2467 1
+58 2468 1
+58 2469 1
+58 2470 1
+58 2471 1
+58 2472 1
+58 2473 1
+58 2474 1
+58 2475 1
+58 2486 1
+58 2487 1
+58 2488 1
+58 2489 1
+58 2490 1
+58 2491 1
+58 2492 1
+58 2493 1
+58 2494 1
+58 2495 1
+58 2557 1
+58 2558 1
+58 2559 1
+58 2560 1
+58 2561 1
+58 2562 1
+58 2563 1
+58 2564 1
+58 2565 1
+58 2566 1
+58 2577 1
+58 2578 1
+58 2579 1
+58 2580 1
+58 2581 1
+58 2582 1
+58 2583 1
+58 2584 1
+58 2585 1
+58 2586 1
+58 2592 1
+58 2593 1
+58 2594 1
+58 2595 1
+58 2596 1
+58 2597 1
+58 2598 1
+58 2599 1
+58 2600 1
+58 2601 1
+58 2607 1
+58 2608 1
+58 2609 1
+58 2610 1
+58 2611 1
+58 2641 1
+58 2647 1
+58 2648 1
+58 2649 1
+58 2650 1
+58 2651 1
+58 2662 1
+58 2663 1
+58 2664 1
+58 2665 1
+58 2666 1
+58 2677 1
+58 2678 1
+58 2679 1
+58 2680 1
+58 2681 1
+58 2682 1
+58 2683 1
+58 2684 1
+58 2685 1
+58 2686 1
+58 2767 1
+58 2768 1
+58 2769 1
+58 2770 1
+58 2771 1
+58 2782 1
+58 2783 1
+58 2784 1
+58 2785 1
+58 2786 1
+58 2787 1
+58 2788 1
+58 2789 1
+58 2790 1
+58 2791 1
+58 2802 1
+58 2803 1
+58 2804 1
+58 2805 1
+58 2806 1
+58 2807 1
+58 2808 1
+58 2809 1
+58 2810 1
+58 2811 1
+58 2822 1
+58 2823 1
+58 2824 1
+58 2825 1
+58 2826 1
+58 2827 1
+58 2828 1
+58 2829 1
+58 2830 1
+58 2831 1
+58 2893 1
+58 2894 1
+58 2895 1
+58 2896 1
+58 2897 1
+58 2908 1
+58 2909 1
+58 2910 1
+58 2911 1
+58 2912 1
+58 2913 1
+58 2914 1
+58 2915 1
+58 2916 1
+58 2917 1
+58 2928 1
+58 2929 1
+58 2930 1
+58 2931 1
+58 2932 1
+58 2933 1
+58 2934 1
+58 2935 1
+58 2936 1
+58 2937 1
+58 2948 1
+58 2949 1
+58 2950 1
+58 2951 1
+58 2952 1
+58 2953 1
+58 2954 1
+58 2955 1
+58 2956 1
+58 2957 1
+58 3019 1
+58 3020 1
+58 3021 1
+58 3022 1
+58 3023 1
+58 3024 1
+58 3025 1
+58 3026 1
+58 3027 1
+58 3028 1
+58 3039 1
+58 3040 1
+58 3041 1
+58 3042 1
+58 3043 1
+58 3044 1
+58 3045 1
+58 3046 1
+58 3047 1
+58 3048 1
+58 3054 1
+58 3055 1
+58 3056 1
+58 3057 1
+58 3058 1
+58 3059 1
+58 3060 1
+58 3061 1
+58 3062 1
+58 3063 1
+58 3069 1
+58 3070 1
+58 3071 1
+58 3072 1
+58 3073 1
+58 3103 1
+58 3104 1
+58 3105 1
+58 3106 1
+58 3107 1
+58 3118 1
+58 3119 1
+58 3120 1
+58 3121 1
+58 3122 1
+58 3123 1
+58 3124 1
+58 3125 1
+58 3126 1
+58 3127 1
+58 3138 1
+58 3139 1
+58 3140 1
+58 3141 1
+58 3142 1
+58 3143 1
+58 3144 1
+58 3145 1
+58 3146 1
+58 3147 1
+58 3158 1
+58 3159 1
+58 3160 1
+58 3161 1
+58 3162 1
+58 3163 1
+58 3164 1
+58 3165 1
+58 3166 1
+58 3167 1
+58 3229 1
+58 3230 1
+58 3231 1
+58 3232 1
+58 3233 1
+58 3234 1
+58 3235 1
+58 3236 1
+58 3237 1
+58 3238 1
+58 3249 1
+58 3250 1
+58 3251 1
+58 3252 1
+58 3253 1
+58 3254 1
+58 3255 1
+58 3256 1
+58 3257 1
+58 3258 1
+58 3264 1
+58 3265 1
+58 3266 1
+58 3267 1
+58 3268 1
+58 3269 1
+58 3270 1
+58 3271 1
+58 3272 1
+58 3273 1
+58 3279 1
+58 3280 1
+58 3281 1
+58 3282 1
+58 3283 1
+58 3313 1
+58 3314 1
+58 3315 1
+58 3316 1
+58 3317 1
+58 3318 1
+58 3319 1
+58 3320 1
+58 3321 1
+58 3322 1
+58 3333 1
+58 3334 1
+58 3335 1
+58 3336 1
+58 3337 1
+58 3338 1
+58 3339 1
+58 3340 1
+58 3341 1
+58 3342 1
+58 3348 1
+58 3349 1
+58 3350 1
+58 3351 1
+58 3352 1
+58 3353 1
+58 3354 1
+58 3355 1
+58 3356 1
+58 3357 1
+58 3363 1
+58 3364 1
+58 3365 1
+58 3366 1
+58 3367 1
+58 3397 1
+58 3398 1
+58 3399 1
+58 3400 1
+58 3401 1
+58 3402 1
+58 3403 1
+58 3404 1
+58 3405 1
+58 3406 1
+58 3412 1
+58 3413 1
+58 3414 1
+58 3415 1
+58 3416 1
+58 3418 1
+58 3419 1
+58 3420 1
+58 3421 1
+58 3422 1
+58 3424 1
+59 4 1
+59 39 1
+59 45 1
+59 50 1
+59 55 1
+59 56 1
+59 57 1
+59 58 1
+59 123 1
+59 129 1
+59 134 1
+59 139 1
+59 140 1
+59 141 1
+59 142 1
+59 206 1
+59 211 1
+59 216 1
+59 217 1
+59 218 1
+59 219 1
+59 226 1
+59 231 1
+59 232 1
+59 233 1
+59 234 1
+59 241 1
+59 242 1
+59 243 1
+59 244 1
+59 251 1
+59 252 1
+59 253 1
+59 254 1
+59 255 1
+59 256 1
+59 333 1
+59 339 1
+59 344 1
+59 349 1
+59 350 1
+59 351 1
+59 352 1
+59 416 1
+59 421 1
+59 426 1
+59 427 1
+59 428 1
+59 429 1
+59 436 1
+59 441 1
+59 442 1
+59 443 1
+59 444 1
+59 451 1
+59 452 1
+59 453 1
+59 454 1
+59 461 1
+59 462 1
+59 463 1
+59 464 1
+59 465 1
+59 466 1
+59 542 1
+59 547 1
+59 552 1
+59 553 1
+59 554 1
+59 555 1
+59 562 1
+59 567 1
+59 568 1
+59 569 1
+59 570 1
+59 577 1
+59 578 1
+59 579 1
+59 580 1
+59 587 1
+59 588 1
+59 589 1
+59 590 1
+59 591 1
+59 592 1
+59 667 1
+59 672 1
+59 673 1
+59 674 1
+59 675 1
+59 682 1
+59 683 1
+59 684 1
+59 685 1
+59 692 1
+59 693 1
+59 694 1
+59 695 1
+59 696 1
+59 697 1
+59 702 1
+59 703 1
+59 704 1
+59 705 1
+59 712 1
+59 713 1
+59 714 1
+59 715 1
+59 716 1
+59 717 1
+59 722 1
+59 723 1
+59 724 1
+59 725 1
+59 726 1
+59 727 1
+59 732 1
+59 733 1
+59 734 1
+59 735 1
+59 795 1
+59 801 1
+59 806 1
+59 811 1
+59 812 1
+59 813 1
+59 814 1
+59 878 1
+59 883 1
+59 888 1
+59 889 1
+59 890 1
+59 891 1
+59 898 1
+59 903 1
+59 904 1
+59 905 1
+59 906 1
+59 913 1
+59 914 1
+59 915 1
+59 916 1
+59 923 1
+59 924 1
+59 925 1
+59 926 1
+59 927 1
+59 928 1
+59 1004 1
+59 1009 1
+59 1014 1
+59 1015 1
+59 1016 1
+59 1017 1
+59 1024 1
+59 1029 1
+59 1030 1
+59 1031 1
+59 1032 1
+59 1039 1
+59 1040 1
+59 1041 1
+59 1042 1
+59 1049 1
+59 1050 1
+59 1051 1
+59 1052 1
+59 1053 1
+59 1054 1
+59 1129 1
+59 1134 1
+59 1135 1
+59 1136 1
+59 1137 1
+59 1144 1
+59 1145 1
+59 1146 1
+59 1147 1
+59 1154 1
+59 1155 1
+59 1156 1
+59 1157 1
+59 1158 1
+59 1159 1
+59 1164 1
+59 1165 1
+59 1166 1
+59 1167 1
+59 1174 1
+59 1175 1
+59 1176 1
+59 1177 1
+59 1178 1
+59 1179 1
+59 1184 1
+59 1185 1
+59 1186 1
+59 1187 1
+59 1188 1
+59 1189 1
+59 1194 1
+59 1195 1
+59 1196 1
+59 1197 1
+59 1256 1
+59 1261 1
+59 1266 1
+59 1267 1
+59 1268 1
+59 1269 1
+59 1276 1
+59 1281 1
+59 1282 1
+59 1283 1
+59 1284 1
+59 1291 1
+59 1292 1
+59 1293 1
+59 1294 1
+59 1301 1
+59 1302 1
+59 1303 1
+59 1304 1
+59 1305 1
+59 1306 1
+59 1381 1
+59 1386 1
+59 1387 1
+59 1388 1
+59 1389 1
+59 1396 1
+59 1397 1
+59 1398 1
+59 1399 1
+59 1406 1
+59 1407 1
+59 1408 1
+59 1409 1
+59 1410 1
+59 1411 1
+59 1416 1
+59 1417 1
+59 1418 1
+59 1419 1
+59 1426 1
+59 1427 1
+59 1428 1
+59 1429 1
+59 1430 1
+59 1431 1
+59 1436 1
+59 1437 1
+59 1438 1
+59 1439 1
+59 1440 1
+59 1441 1
+59 1446 1
+59 1447 1
+59 1448 1
+59 1449 1
+59 1507 1
+59 1512 1
+59 1513 1
+59 1514 1
+59 1515 1
+59 1522 1
+59 1523 1
+59 1524 1
+59 1525 1
+59 1532 1
+59 1533 1
+59 1534 1
+59 1535 1
+59 1536 1
+59 1537 1
+59 1542 1
+59 1543 1
+59 1544 1
+59 1545 1
+59 1552 1
+59 1553 1
+59 1554 1
+59 1555 1
+59 1556 1
+59 1557 1
+59 1562 1
+59 1563 1
+59 1564 1
+59 1565 1
+59 1566 1
+59 1567 1
+59 1572 1
+59 1573 1
+59 1574 1
+59 1575 1
+59 1633 1
+59 1634 1
+59 1635 1
+59 1636 1
+59 1643 1
+59 1644 1
+59 1645 1
+59 1646 1
+59 1647 1
+59 1648 1
+59 1653 1
+59 1654 1
+59 1655 1
+59 1656 1
+59 1657 1
+59 1658 1
+59 1663 1
+59 1664 1
+59 1665 1
+59 1666 1
+59 1668 1
+59 1669 1
+59 1670 1
+59 1671 1
+59 1672 1
+59 1673 1
+59 1678 1
+59 1679 1
+59 1680 1
+59 1681 1
+59 1683 1
+59 1684 1
+59 1685 1
+59 1686 1
+59 1688 1
+59 1719 1
+59 1725 1
+59 1730 1
+59 1735 1
+59 1736 1
+59 1737 1
+59 1738 1
+59 1802 1
+59 1807 1
+59 1812 1
+59 1813 1
+59 1814 1
+59 1815 1
+59 1822 1
+59 1827 1
+59 1828 1
+59 1829 1
+59 1830 1
+59 1837 1
+59 1838 1
+59 1839 1
+59 1840 1
+59 1847 1
+59 1848 1
+59 1849 1
+59 1850 1
+59 1851 1
+59 1852 1
+59 1928 1
+59 1933 1
+59 1938 1
+59 1939 1
+59 1940 1
+59 1941 1
+59 1948 1
+59 1953 1
+59 1954 1
+59 1955 1
+59 1956 1
+59 1963 1
+59 1964 1
+59 1965 1
+59 1966 1
+59 1973 1
+59 1974 1
+59 1975 1
+59 1976 1
+59 1977 1
+59 1978 1
+59 2053 1
+59 2058 1
+59 2059 1
+59 2060 1
+59 2061 1
+59 2068 1
+59 2069 1
+59 2070 1
+59 2071 1
+59 2078 1
+59 2079 1
+59 2080 1
+59 2081 1
+59 2082 1
+59 2083 1
+59 2088 1
+59 2089 1
+59 2090 1
+59 2091 1
+59 2098 1
+59 2099 1
+59 2100 1
+59 2101 1
+59 2102 1
+59 2103 1
+59 2108 1
+59 2109 1
+59 2110 1
+59 2111 1
+59 2112 1
+59 2113 1
+59 2118 1
+59 2119 1
+59 2120 1
+59 2121 1
+59 2180 1
+59 2185 1
+59 2190 1
+59 2191 1
+59 2192 1
+59 2193 1
+59 2200 1
+59 2205 1
+59 2206 1
+59 2207 1
+59 2208 1
+59 2215 1
+59 2216 1
+59 2217 1
+59 2218 1
+59 2225 1
+59 2226 1
+59 2227 1
+59 2228 1
+59 2229 1
+59 2230 1
+59 2305 1
+59 2310 1
+59 2311 1
+59 2312 1
+59 2313 1
+59 2320 1
+59 2321 1
+59 2322 1
+59 2323 1
+59 2330 1
+59 2331 1
+59 2332 1
+59 2333 1
+59 2334 1
+59 2335 1
+59 2340 1
+59 2341 1
+59 2342 1
+59 2343 1
+59 2350 1
+59 2351 1
+59 2352 1
+59 2353 1
+59 2354 1
+59 2355 1
+59 2360 1
+59 2361 1
+59 2362 1
+59 2363 1
+59 2364 1
+59 2365 1
+59 2370 1
+59 2371 1
+59 2372 1
+59 2373 1
+59 2431 1
+59 2436 1
+59 2437 1
+59 2438 1
+59 2439 1
+59 2446 1
+59 2447 1
+59 2448 1
+59 2449 1
+59 2456 1
+59 2457 1
+59 2458 1
+59 2459 1
+59 2460 1
+59 2461 1
+59 2466 1
+59 2467 1
+59 2468 1
+59 2469 1
+59 2476 1
+59 2477 1
+59 2478 1
+59 2479 1
+59 2480 1
+59 2481 1
+59 2486 1
+59 2487 1
+59 2488 1
+59 2489 1
+59 2490 1
+59 2491 1
+59 2496 1
+59 2497 1
+59 2498 1
+59 2499 1
+59 2557 1
+59 2558 1
+59 2559 1
+59 2560 1
+59 2567 1
+59 2568 1
+59 2569 1
+59 2570 1
+59 2571 1
+59 2572 1
+59 2577 1
+59 2578 1
+59 2579 1
+59 2580 1
+59 2581 1
+59 2582 1
+59 2587 1
+59 2588 1
+59 2589 1
+59 2590 1
+59 2592 1
+59 2593 1
+59 2594 1
+59 2595 1
+59 2596 1
+59 2597 1
+59 2602 1
+59 2603 1
+59 2604 1
+59 2605 1
+59 2607 1
+59 2608 1
+59 2609 1
+59 2610 1
+59 2612 1
+59 2642 1
+59 2647 1
+59 2652 1
+59 2653 1
+59 2654 1
+59 2655 1
+59 2662 1
+59 2667 1
+59 2668 1
+59 2669 1
+59 2670 1
+59 2677 1
+59 2678 1
+59 2679 1
+59 2680 1
+59 2687 1
+59 2688 1
+59 2689 1
+59 2690 1
+59 2691 1
+59 2692 1
+59 2767 1
+59 2772 1
+59 2773 1
+59 2774 1
+59 2775 1
+59 2782 1
+59 2783 1
+59 2784 1
+59 2785 1
+59 2792 1
+59 2793 1
+59 2794 1
+59 2795 1
+59 2796 1
+59 2797 1
+59 2802 1
+59 2803 1
+59 2804 1
+59 2805 1
+59 2812 1
+59 2813 1
+59 2814 1
+59 2815 1
+59 2816 1
+59 2817 1
+59 2822 1
+59 2823 1
+59 2824 1
+59 2825 1
+59 2826 1
+59 2827 1
+59 2832 1
+59 2833 1
+59 2834 1
+59 2835 1
+59 2893 1
+59 2898 1
+59 2899 1
+59 2900 1
+59 2901 1
+59 2908 1
+59 2909 1
+59 2910 1
+59 2911 1
+59 2918 1
+59 2919 1
+59 2920 1
+59 2921 1
+59 2922 1
+59 2923 1
+59 2928 1
+59 2929 1
+59 2930 1
+59 2931 1
+59 2938 1
+59 2939 1
+59 2940 1
+59 2941 1
+59 2942 1
+59 2943 1
+59 2948 1
+59 2949 1
+59 2950 1
+59 2951 1
+59 2952 1
+59 2953 1
+59 2958 1
+59 2959 1
+59 2960 1
+59 2961 1
+59 3019 1
+59 3020 1
+59 3021 1
+59 3022 1
+59 3029 1
+59 3030 1
+59 3031 1
+59 3032 1
+59 3033 1
+59 3034 1
+59 3039 1
+59 3040 1
+59 3041 1
+59 3042 1
+59 3043 1
+59 3044 1
+59 3049 1
+59 3050 1
+59 3051 1
+59 3052 1
+59 3054 1
+59 3055 1
+59 3056 1
+59 3057 1
+59 3058 1
+59 3059 1
+59 3064 1
+59 3065 1
+59 3066 1
+59 3067 1
+59 3069 1
+59 3070 1
+59 3071 1
+59 3072 1
+59 3074 1
+59 3103 1
+59 3108 1
+59 3109 1
+59 3110 1
+59 3111 1
+59 3118 1
+59 3119 1
+59 3120 1
+59 3121 1
+59 3128 1
+59 3129 1
+59 3130 1
+59 3131 1
+59 3132 1
+59 3133 1
+59 3138 1
+59 3139 1
+59 3140 1
+59 3141 1
+59 3148 1
+59 3149 1
+59 3150 1
+59 3151 1
+59 3152 1
+59 3153 1
+59 3158 1
+59 3159 1
+59 3160 1
+59 3161 1
+59 3162 1
+59 3163 1
+59 3168 1
+59 3169 1
+59 3170 1
+59 3171 1
+59 3229 1
+59 3230 1
+59 3231 1
+59 3232 1
+59 3239 1
+59 3240 1
+59 3241 1
+59 3242 1
+59 3243 1
+59 3244 1
+59 3249 1
+59 3250 1
+59 3251 1
+59 3252 1
+59 3253 1
+59 3254 1
+59 3259 1
+59 3260 1
+59 3261 1
+59 3262 1
+59 3264 1
+59 3265 1
+59 3266 1
+59 3267 1
+59 3268 1
+59 3269 1
+59 3274 1
+59 3275 1
+59 3276 1
+59 3277 1
+59 3279 1
+59 3280 1
+59 3281 1
+59 3282 1
+59 3284 1
+59 3313 1
+59 3314 1
+59 3315 1
+59 3316 1
+59 3323 1
+59 3324 1
+59 3325 1
+59 3326 1
+59 3327 1
+59 3328 1
+59 3333 1
+59 3334 1
+59 3335 1
+59 3336 1
+59 3337 1
+59 3338 1
+59 3343 1
+59 3344 1
+59 3345 1
+59 3346 1
+59 3348 1
+59 3349 1
+59 3350 1
+59 3351 1
+59 3352 1
+59 3353 1
+59 3358 1
+59 3359 1
+59 3360 1
+59 3361 1
+59 3363 1
+59 3364 1
+59 3365 1
+59 3366 1
+59 3368 1
+59 3397 1
+59 3398 1
+59 3399 1
+59 3400 1
+59 3401 1
+59 3402 1
+59 3407 1
+59 3408 1
+59 3409 1
+59 3410 1
+59 3412 1
+59 3413 1
+59 3414 1
+59 3415 1
+59 3417 1
+59 3418 1
+59 3419 1
+59 3420 1
+59 3421 1
+59 3423 1
+59 3424 1
+60 5 1
+60 40 1
+60 46 1
+60 51 1
+60 55 1
+60 59 1
+60 60 1
+60 61 1
+60 124 1
+60 130 1
+60 135 1
+60 139 1
+60 143 1
+60 144 1
+60 145 1
+60 207 1
+60 212 1
+60 216 1
+60 220 1
+60 221 1
+60 222 1
+60 227 1
+60 231 1
+60 235 1
+60 236 1
+60 237 1
+60 241 1
+60 245 1
+60 246 1
+60 247 1
+60 251 1
+60 252 1
+60 253 1
+60 257 1
+60 258 1
+60 259 1
+60 334 1
+60 340 1
+60 345 1
+60 349 1
+60 353 1
+60 354 1
+60 355 1
+60 417 1
+60 422 1
+60 426 1
+60 430 1
+60 431 1
+60 432 1
+60 437 1
+60 441 1
+60 445 1
+60 446 1
+60 447 1
+60 451 1
+60 455 1
+60 456 1
+60 457 1
+60 461 1
+60 462 1
+60 463 1
+60 467 1
+60 468 1
+60 469 1
+60 543 1
+60 548 1
+60 552 1
+60 556 1
+60 557 1
+60 558 1
+60 563 1
+60 567 1
+60 571 1
+60 572 1
+60 573 1
+60 577 1
+60 581 1
+60 582 1
+60 583 1
+60 587 1
+60 588 1
+60 589 1
+60 593 1
+60 594 1
+60 595 1
+60 668 1
+60 672 1
+60 676 1
+60 677 1
+60 678 1
+60 682 1
+60 686 1
+60 687 1
+60 688 1
+60 692 1
+60 693 1
+60 694 1
+60 698 1
+60 699 1
+60 700 1
+60 702 1
+60 706 1
+60 707 1
+60 708 1
+60 712 1
+60 713 1
+60 714 1
+60 718 1
+60 719 1
+60 720 1
+60 722 1
+60 723 1
+60 724 1
+60 728 1
+60 729 1
+60 730 1
+60 732 1
+60 733 1
+60 734 1
+60 736 1
+60 796 1
+60 802 1
+60 807 1
+60 811 1
+60 815 1
+60 816 1
+60 817 1
+60 879 1
+60 884 1
+60 888 1
+60 892 1
+60 893 1
+60 894 1
+60 899 1
+60 903 1
+60 907 1
+60 908 1
+60 909 1
+60 913 1
+60 917 1
+60 918 1
+60 919 1
+60 923 1
+60 924 1
+60 925 1
+60 929 1
+60 930 1
+60 931 1
+60 1005 1
+60 1010 1
+60 1014 1
+60 1018 1
+60 1019 1
+60 1020 1
+60 1025 1
+60 1029 1
+60 1033 1
+60 1034 1
+60 1035 1
+60 1039 1
+60 1043 1
+60 1044 1
+60 1045 1
+60 1049 1
+60 1050 1
+60 1051 1
+60 1055 1
+60 1056 1
+60 1057 1
+60 1130 1
+60 1134 1
+60 1138 1
+60 1139 1
+60 1140 1
+60 1144 1
+60 1148 1
+60 1149 1
+60 1150 1
+60 1154 1
+60 1155 1
+60 1156 1
+60 1160 1
+60 1161 1
+60 1162 1
+60 1164 1
+60 1168 1
+60 1169 1
+60 1170 1
+60 1174 1
+60 1175 1
+60 1176 1
+60 1180 1
+60 1181 1
+60 1182 1
+60 1184 1
+60 1185 1
+60 1186 1
+60 1190 1
+60 1191 1
+60 1192 1
+60 1194 1
+60 1195 1
+60 1196 1
+60 1198 1
+60 1257 1
+60 1262 1
+60 1266 1
+60 1270 1
+60 1271 1
+60 1272 1
+60 1277 1
+60 1281 1
+60 1285 1
+60 1286 1
+60 1287 1
+60 1291 1
+60 1295 1
+60 1296 1
+60 1297 1
+60 1301 1
+60 1302 1
+60 1303 1
+60 1307 1
+60 1308 1
+60 1309 1
+60 1382 1
+60 1386 1
+60 1390 1
+60 1391 1
+60 1392 1
+60 1396 1
+60 1400 1
+60 1401 1
+60 1402 1
+60 1406 1
+60 1407 1
+60 1408 1
+60 1412 1
+60 1413 1
+60 1414 1
+60 1416 1
+60 1420 1
+60 1421 1
+60 1422 1
+60 1426 1
+60 1427 1
+60 1428 1
+60 1432 1
+60 1433 1
+60 1434 1
+60 1436 1
+60 1437 1
+60 1438 1
+60 1442 1
+60 1443 1
+60 1444 1
+60 1446 1
+60 1447 1
+60 1448 1
+60 1450 1
+60 1508 1
+60 1512 1
+60 1516 1
+60 1517 1
+60 1518 1
+60 1522 1
+60 1526 1
+60 1527 1
+60 1528 1
+60 1532 1
+60 1533 1
+60 1534 1
+60 1538 1
+60 1539 1
+60 1540 1
+60 1542 1
+60 1546 1
+60 1547 1
+60 1548 1
+60 1552 1
+60 1553 1
+60 1554 1
+60 1558 1
+60 1559 1
+60 1560 1
+60 1562 1
+60 1563 1
+60 1564 1
+60 1568 1
+60 1569 1
+60 1570 1
+60 1572 1
+60 1573 1
+60 1574 1
+60 1576 1
+60 1633 1
+60 1637 1
+60 1638 1
+60 1639 1
+60 1643 1
+60 1644 1
+60 1645 1
+60 1649 1
+60 1650 1
+60 1651 1
+60 1653 1
+60 1654 1
+60 1655 1
+60 1659 1
+60 1660 1
+60 1661 1
+60 1663 1
+60 1664 1
+60 1665 1
+60 1667 1
+60 1668 1
+60 1669 1
+60 1670 1
+60 1674 1
+60 1675 1
+60 1676 1
+60 1678 1
+60 1679 1
+60 1680 1
+60 1682 1
+60 1683 1
+60 1684 1
+60 1685 1
+60 1687 1
+60 1688 1
+60 1720 1
+60 1726 1
+60 1731 1
+60 1735 1
+60 1739 1
+60 1740 1
+60 1741 1
+60 1803 1
+60 1808 1
+60 1812 1
+60 1816 1
+60 1817 1
+60 1818 1
+60 1823 1
+60 1827 1
+60 1831 1
+60 1832 1
+60 1833 1
+60 1837 1
+60 1841 1
+60 1842 1
+60 1843 1
+60 1847 1
+60 1848 1
+60 1849 1
+60 1853 1
+60 1854 1
+60 1855 1
+60 1929 1
+60 1934 1
+60 1938 1
+60 1942 1
+60 1943 1
+60 1944 1
+60 1949 1
+60 1953 1
+60 1957 1
+60 1958 1
+60 1959 1
+60 1963 1
+60 1967 1
+60 1968 1
+60 1969 1
+60 1973 1
+60 1974 1
+60 1975 1
+60 1979 1
+60 1980 1
+60 1981 1
+60 2054 1
+60 2058 1
+60 2062 1
+60 2063 1
+60 2064 1
+60 2068 1
+60 2072 1
+60 2073 1
+60 2074 1
+60 2078 1
+60 2079 1
+60 2080 1
+60 2084 1
+60 2085 1
+60 2086 1
+60 2088 1
+60 2092 1
+60 2093 1
+60 2094 1
+60 2098 1
+60 2099 1
+60 2100 1
+60 2104 1
+60 2105 1
+60 2106 1
+60 2108 1
+60 2109 1
+60 2110 1
+60 2114 1
+60 2115 1
+60 2116 1
+60 2118 1
+60 2119 1
+60 2120 1
+60 2122 1
+60 2181 1
+60 2186 1
+60 2190 1
+60 2194 1
+60 2195 1
+60 2196 1
+60 2201 1
+60 2205 1
+60 2209 1
+60 2210 1
+60 2211 1
+60 2215 1
+60 2219 1
+60 2220 1
+60 2221 1
+60 2225 1
+60 2226 1
+60 2227 1
+60 2231 1
+60 2232 1
+60 2233 1
+60 2306 1
+60 2310 1
+60 2314 1
+60 2315 1
+60 2316 1
+60 2320 1
+60 2324 1
+60 2325 1
+60 2326 1
+60 2330 1
+60 2331 1
+60 2332 1
+60 2336 1
+60 2337 1
+60 2338 1
+60 2340 1
+60 2344 1
+60 2345 1
+60 2346 1
+60 2350 1
+60 2351 1
+60 2352 1
+60 2356 1
+60 2357 1
+60 2358 1
+60 2360 1
+60 2361 1
+60 2362 1
+60 2366 1
+60 2367 1
+60 2368 1
+60 2370 1
+60 2371 1
+60 2372 1
+60 2374 1
+60 2432 1
+60 2436 1
+60 2440 1
+60 2441 1
+60 2442 1
+60 2446 1
+60 2450 1
+60 2451 1
+60 2452 1
+60 2456 1
+60 2457 1
+60 2458 1
+60 2462 1
+60 2463 1
+60 2464 1
+60 2466 1
+60 2470 1
+60 2471 1
+60 2472 1
+60 2476 1
+60 2477 1
+60 2478 1
+60 2482 1
+60 2483 1
+60 2484 1
+60 2486 1
+60 2487 1
+60 2488 1
+60 2492 1
+60 2493 1
+60 2494 1
+60 2496 1
+60 2497 1
+60 2498 1
+60 2500 1
+60 2557 1
+60 2561 1
+60 2562 1
+60 2563 1
+60 2567 1
+60 2568 1
+60 2569 1
+60 2573 1
+60 2574 1
+60 2575 1
+60 2577 1
+60 2578 1
+60 2579 1
+60 2583 1
+60 2584 1
+60 2585 1
+60 2587 1
+60 2588 1
+60 2589 1
+60 2591 1
+60 2592 1
+60 2593 1
+60 2594 1
+60 2598 1
+60 2599 1
+60 2600 1
+60 2602 1
+60 2603 1
+60 2604 1
+60 2606 1
+60 2607 1
+60 2608 1
+60 2609 1
+60 2611 1
+60 2612 1
+60 2643 1
+60 2648 1
+60 2652 1
+60 2656 1
+60 2657 1
+60 2658 1
+60 2663 1
+60 2667 1
+60 2671 1
+60 2672 1
+60 2673 1
+60 2677 1
+60 2681 1
+60 2682 1
+60 2683 1
+60 2687 1
+60 2688 1
+60 2689 1
+60 2693 1
+60 2694 1
+60 2695 1
+60 2768 1
+60 2772 1
+60 2776 1
+60 2777 1
+60 2778 1
+60 2782 1
+60 2786 1
+60 2787 1
+60 2788 1
+60 2792 1
+60 2793 1
+60 2794 1
+60 2798 1
+60 2799 1
+60 2800 1
+60 2802 1
+60 2806 1
+60 2807 1
+60 2808 1
+60 2812 1
+60 2813 1
+60 2814 1
+60 2818 1
+60 2819 1
+60 2820 1
+60 2822 1
+60 2823 1
+60 2824 1
+60 2828 1
+60 2829 1
+60 2830 1
+60 2832 1
+60 2833 1
+60 2834 1
+60 2836 1
+60 2894 1
+60 2898 1
+60 2902 1
+60 2903 1
+60 2904 1
+60 2908 1
+60 2912 1
+60 2913 1
+60 2914 1
+60 2918 1
+60 2919 1
+60 2920 1
+60 2924 1
+60 2925 1
+60 2926 1
+60 2928 1
+60 2932 1
+60 2933 1
+60 2934 1
+60 2938 1
+60 2939 1
+60 2940 1
+60 2944 1
+60 2945 1
+60 2946 1
+60 2948 1
+60 2949 1
+60 2950 1
+60 2954 1
+60 2955 1
+60 2956 1
+60 2958 1
+60 2959 1
+60 2960 1
+60 2962 1
+60 3019 1
+60 3023 1
+60 3024 1
+60 3025 1
+60 3029 1
+60 3030 1
+60 3031 1
+60 3035 1
+60 3036 1
+60 3037 1
+60 3039 1
+60 3040 1
+60 3041 1
+60 3045 1
+60 3046 1
+60 3047 1
+60 3049 1
+60 3050 1
+60 3051 1
+60 3053 1
+60 3054 1
+60 3055 1
+60 3056 1
+60 3060 1
+60 3061 1
+60 3062 1
+60 3064 1
+60 3065 1
+60 3066 1
+60 3068 1
+60 3069 1
+60 3070 1
+60 3071 1
+60 3073 1
+60 3074 1
+60 3104 1
+60 3108 1
+60 3112 1
+60 3113 1
+60 3114 1
+60 3118 1
+60 3122 1
+60 3123 1
+60 3124 1
+60 3128 1
+60 3129 1
+60 3130 1
+60 3134 1
+60 3135 1
+60 3136 1
+60 3138 1
+60 3142 1
+60 3143 1
+60 3144 1
+60 3148 1
+60 3149 1
+60 3150 1
+60 3154 1
+60 3155 1
+60 3156 1
+60 3158 1
+60 3159 1
+60 3160 1
+60 3164 1
+60 3165 1
+60 3166 1
+60 3168 1
+60 3169 1
+60 3170 1
+60 3172 1
+60 3229 1
+60 3233 1
+60 3234 1
+60 3235 1
+60 3239 1
+60 3240 1
+60 3241 1
+60 3245 1
+60 3246 1
+60 3247 1
+60 3249 1
+60 3250 1
+60 3251 1
+60 3255 1
+60 3256 1
+60 3257 1
+60 3259 1
+60 3260 1
+60 3261 1
+60 3263 1
+60 3264 1
+60 3265 1
+60 3266 1
+60 3270 1
+60 3271 1
+60 3272 1
+60 3274 1
+60 3275 1
+60 3276 1
+60 3278 1
+60 3279 1
+60 3280 1
+60 3281 1
+60 3283 1
+60 3284 1
+60 3313 1
+60 3317 1
+60 3318 1
+60 3319 1
+60 3323 1
+60 3324 1
+60 3325 1
+60 3329 1
+60 3330 1
+60 3331 1
+60 3333 1
+60 3334 1
+60 3335 1
+60 3339 1
+60 3340 1
+60 3341 1
+60 3343 1
+60 3344 1
+60 3345 1
+60 3347 1
+60 3348 1
+60 3349 1
+60 3350 1
+60 3354 1
+60 3355 1
+60 3356 1
+60 3358 1
+60 3359 1
+60 3360 1
+60 3362 1
+60 3363 1
+60 3364 1
+60 3365 1
+60 3367 1
+60 3368 1
+60 3397 1
+60 3398 1
+60 3399 1
+60 3403 1
+60 3404 1
+60 3405 1
+60 3407 1
+60 3408 1
+60 3409 1
+60 3411 1
+60 3412 1
+60 3413 1
+60 3414 1
+60 3416 1
+60 3417 1
+60 3418 1
+60 3419 1
+60 3420 1
+60 3422 1
+60 3423 1
+60 3424 1
+61 6 1
+61 41 1
+61 47 1
+61 52 1
+61 56 1
+61 59 1
+61 62 1
+61 63 1
+61 125 1
+61 131 1
+61 136 1
+61 140 1
+61 143 1
+61 146 1
+61 147 1
+61 208 1
+61 213 1
+61 217 1
+61 220 1
+61 223 1
+61 224 1
+61 228 1
+61 232 1
+61 235 1
+61 238 1
+61 239 1
+61 242 1
+61 245 1
+61 248 1
+61 249 1
+61 251 1
+61 254 1
+61 255 1
+61 257 1
+61 258 1
+61 260 1
+61 335 1
+61 341 1
+61 346 1
+61 350 1
+61 353 1
+61 356 1
+61 357 1
+61 418 1
+61 423 1
+61 427 1
+61 430 1
+61 433 1
+61 434 1
+61 438 1
+61 442 1
+61 445 1
+61 448 1
+61 449 1
+61 452 1
+61 455 1
+61 458 1
+61 459 1
+61 461 1
+61 464 1
+61 465 1
+61 467 1
+61 468 1
+61 470 1
+61 544 1
+61 549 1
+61 553 1
+61 556 1
+61 559 1
+61 560 1
+61 564 1
+61 568 1
+61 571 1
+61 574 1
+61 575 1
+61 578 1
+61 581 1
+61 584 1
+61 585 1
+61 587 1
+61 590 1
+61 591 1
+61 593 1
+61 594 1
+61 596 1
+61 669 1
+61 673 1
+61 676 1
+61 679 1
+61 680 1
+61 683 1
+61 686 1
+61 689 1
+61 690 1
+61 692 1
+61 695 1
+61 696 1
+61 698 1
+61 699 1
+61 701 1
+61 703 1
+61 706 1
+61 709 1
+61 710 1
+61 712 1
+61 715 1
+61 716 1
+61 718 1
+61 719 1
+61 721 1
+61 722 1
+61 725 1
+61 726 1
+61 728 1
+61 729 1
+61 731 1
+61 732 1
+61 733 1
+61 735 1
+61 736 1
+61 797 1
+61 803 1
+61 808 1
+61 812 1
+61 815 1
+61 818 1
+61 819 1
+61 880 1
+61 885 1
+61 889 1
+61 892 1
+61 895 1
+61 896 1
+61 900 1
+61 904 1
+61 907 1
+61 910 1
+61 911 1
+61 914 1
+61 917 1
+61 920 1
+61 921 1
+61 923 1
+61 926 1
+61 927 1
+61 929 1
+61 930 1
+61 932 1
+61 1006 1
+61 1011 1
+61 1015 1
+61 1018 1
+61 1021 1
+61 1022 1
+61 1026 1
+61 1030 1
+61 1033 1
+61 1036 1
+61 1037 1
+61 1040 1
+61 1043 1
+61 1046 1
+61 1047 1
+61 1049 1
+61 1052 1
+61 1053 1
+61 1055 1
+61 1056 1
+61 1058 1
+61 1131 1
+61 1135 1
+61 1138 1
+61 1141 1
+61 1142 1
+61 1145 1
+61 1148 1
+61 1151 1
+61 1152 1
+61 1154 1
+61 1157 1
+61 1158 1
+61 1160 1
+61 1161 1
+61 1163 1
+61 1165 1
+61 1168 1
+61 1171 1
+61 1172 1
+61 1174 1
+61 1177 1
+61 1178 1
+61 1180 1
+61 1181 1
+61 1183 1
+61 1184 1
+61 1187 1
+61 1188 1
+61 1190 1
+61 1191 1
+61 1193 1
+61 1194 1
+61 1195 1
+61 1197 1
+61 1198 1
+61 1258 1
+61 1263 1
+61 1267 1
+61 1270 1
+61 1273 1
+61 1274 1
+61 1278 1
+61 1282 1
+61 1285 1
+61 1288 1
+61 1289 1
+61 1292 1
+61 1295 1
+61 1298 1
+61 1299 1
+61 1301 1
+61 1304 1
+61 1305 1
+61 1307 1
+61 1308 1
+61 1310 1
+61 1383 1
+61 1387 1
+61 1390 1
+61 1393 1
+61 1394 1
+61 1397 1
+61 1400 1
+61 1403 1
+61 1404 1
+61 1406 1
+61 1409 1
+61 1410 1
+61 1412 1
+61 1413 1
+61 1415 1
+61 1417 1
+61 1420 1
+61 1423 1
+61 1424 1
+61 1426 1
+61 1429 1
+61 1430 1
+61 1432 1
+61 1433 1
+61 1435 1
+61 1436 1
+61 1439 1
+61 1440 1
+61 1442 1
+61 1443 1
+61 1445 1
+61 1446 1
+61 1447 1
+61 1449 1
+61 1450 1
+61 1509 1
+61 1513 1
+61 1516 1
+61 1519 1
+61 1520 1
+61 1523 1
+61 1526 1
+61 1529 1
+61 1530 1
+61 1532 1
+61 1535 1
+61 1536 1
+61 1538 1
+61 1539 1
+61 1541 1
+61 1543 1
+61 1546 1
+61 1549 1
+61 1550 1
+61 1552 1
+61 1555 1
+61 1556 1
+61 1558 1
+61 1559 1
+61 1561 1
+61 1562 1
+61 1565 1
+61 1566 1
+61 1568 1
+61 1569 1
+61 1571 1
+61 1572 1
+61 1573 1
+61 1575 1
+61 1576 1
+61 1634 1
+61 1637 1
+61 1640 1
+61 1641 1
+61 1643 1
+61 1646 1
+61 1647 1
+61 1649 1
+61 1650 1
+61 1652 1
+61 1653 1
+61 1656 1
+61 1657 1
+61 1659 1
+61 1660 1
+61 1662 1
+61 1663 1
+61 1664 1
+61 1666 1
+61 1667 1
+61 1668 1
+61 1671 1
+61 1672 1
+61 1674 1
+61 1675 1
+61 1677 1
+61 1678 1
+61 1679 1
+61 1681 1
+61 1682 1
+61 1683 1
+61 1684 1
+61 1686 1
+61 1687 1
+61 1688 1
+61 1721 1
+61 1727 1
+61 1732 1
+61 1736 1
+61 1739 1
+61 1742 1
+61 1743 1
+61 1804 1
+61 1809 1
+61 1813 1
+61 1816 1
+61 1819 1
+61 1820 1
+61 1824 1
+61 1828 1
+61 1831 1
+61 1834 1
+61 1835 1
+61 1838 1
+61 1841 1
+61 1844 1
+61 1845 1
+61 1847 1
+61 1850 1
+61 1851 1
+61 1853 1
+61 1854 1
+61 1856 1
+61 1930 1
+61 1935 1
+61 1939 1
+61 1942 1
+61 1945 1
+61 1946 1
+61 1950 1
+61 1954 1
+61 1957 1
+61 1960 1
+61 1961 1
+61 1964 1
+61 1967 1
+61 1970 1
+61 1971 1
+61 1973 1
+61 1976 1
+61 1977 1
+61 1979 1
+61 1980 1
+61 1982 1
+61 2055 1
+61 2059 1
+61 2062 1
+61 2065 1
+61 2066 1
+61 2069 1
+61 2072 1
+61 2075 1
+61 2076 1
+61 2078 1
+61 2081 1
+61 2082 1
+61 2084 1
+61 2085 1
+61 2087 1
+61 2089 1
+61 2092 1
+61 2095 1
+61 2096 1
+61 2098 1
+61 2101 1
+61 2102 1
+61 2104 1
+61 2105 1
+61 2107 1
+61 2108 1
+61 2111 1
+61 2112 1
+61 2114 1
+61 2115 1
+61 2117 1
+61 2118 1
+61 2119 1
+61 2121 1
+61 2122 1
+61 2182 1
+61 2187 1
+61 2191 1
+61 2194 1
+61 2197 1
+61 2198 1
+61 2202 1
+61 2206 1
+61 2209 1
+61 2212 1
+61 2213 1
+61 2216 1
+61 2219 1
+61 2222 1
+61 2223 1
+61 2225 1
+61 2228 1
+61 2229 1
+61 2231 1
+61 2232 1
+61 2234 1
+61 2307 1
+61 2311 1
+61 2314 1
+61 2317 1
+61 2318 1
+61 2321 1
+61 2324 1
+61 2327 1
+61 2328 1
+61 2330 1
+61 2333 1
+61 2334 1
+61 2336 1
+61 2337 1
+61 2339 1
+61 2341 1
+61 2344 1
+61 2347 1
+61 2348 1
+61 2350 1
+61 2353 1
+61 2354 1
+61 2356 1
+61 2357 1
+61 2359 1
+61 2360 1
+61 2363 1
+61 2364 1
+61 2366 1
+61 2367 1
+61 2369 1
+61 2370 1
+61 2371 1
+61 2373 1
+61 2374 1
+61 2433 1
+61 2437 1
+61 2440 1
+61 2443 1
+61 2444 1
+61 2447 1
+61 2450 1
+61 2453 1
+61 2454 1
+61 2456 1
+61 2459 1
+61 2460 1
+61 2462 1
+61 2463 1
+61 2465 1
+61 2467 1
+61 2470 1
+61 2473 1
+61 2474 1
+61 2476 1
+61 2479 1
+61 2480 1
+61 2482 1
+61 2483 1
+61 2485 1
+61 2486 1
+61 2489 1
+61 2490 1
+61 2492 1
+61 2493 1
+61 2495 1
+61 2496 1
+61 2497 1
+61 2499 1
+61 2500 1
+61 2558 1
+61 2561 1
+61 2564 1
+61 2565 1
+61 2567 1
+61 2570 1
+61 2571 1
+61 2573 1
+61 2574 1
+61 2576 1
+61 2577 1
+61 2580 1
+61 2581 1
+61 2583 1
+61 2584 1
+61 2586 1
+61 2587 1
+61 2588 1
+61 2590 1
+61 2591 1
+61 2592 1
+61 2595 1
+61 2596 1
+61 2598 1
+61 2599 1
+61 2601 1
+61 2602 1
+61 2603 1
+61 2605 1
+61 2606 1
+61 2607 1
+61 2608 1
+61 2610 1
+61 2611 1
+61 2612 1
+61 2644 1
+61 2649 1
+61 2653 1
+61 2656 1
+61 2659 1
+61 2660 1
+61 2664 1
+61 2668 1
+61 2671 1
+61 2674 1
+61 2675 1
+61 2678 1
+61 2681 1
+61 2684 1
+61 2685 1
+61 2687 1
+61 2690 1
+61 2691 1
+61 2693 1
+61 2694 1
+61 2696 1
+61 2769 1
+61 2773 1
+61 2776 1
+61 2779 1
+61 2780 1
+61 2783 1
+61 2786 1
+61 2789 1
+61 2790 1
+61 2792 1
+61 2795 1
+61 2796 1
+61 2798 1
+61 2799 1
+61 2801 1
+61 2803 1
+61 2806 1
+61 2809 1
+61 2810 1
+61 2812 1
+61 2815 1
+61 2816 1
+61 2818 1
+61 2819 1
+61 2821 1
+61 2822 1
+61 2825 1
+61 2826 1
+61 2828 1
+61 2829 1
+61 2831 1
+61 2832 1
+61 2833 1
+61 2835 1
+61 2836 1
+61 2895 1
+61 2899 1
+61 2902 1
+61 2905 1
+61 2906 1
+61 2909 1
+61 2912 1
+61 2915 1
+61 2916 1
+61 2918 1
+61 2921 1
+61 2922 1
+61 2924 1
+61 2925 1
+61 2927 1
+61 2929 1
+61 2932 1
+61 2935 1
+61 2936 1
+61 2938 1
+61 2941 1
+61 2942 1
+61 2944 1
+61 2945 1
+61 2947 1
+61 2948 1
+61 2951 1
+61 2952 1
+61 2954 1
+61 2955 1
+61 2957 1
+61 2958 1
+61 2959 1
+61 2961 1
+61 2962 1
+61 3020 1
+61 3023 1
+61 3026 1
+61 3027 1
+61 3029 1
+61 3032 1
+61 3033 1
+61 3035 1
+61 3036 1
+61 3038 1
+61 3039 1
+61 3042 1
+61 3043 1
+61 3045 1
+61 3046 1
+61 3048 1
+61 3049 1
+61 3050 1
+61 3052 1
+61 3053 1
+61 3054 1
+61 3057 1
+61 3058 1
+61 3060 1
+61 3061 1
+61 3063 1
+61 3064 1
+61 3065 1
+61 3067 1
+61 3068 1
+61 3069 1
+61 3070 1
+61 3072 1
+61 3073 1
+61 3074 1
+61 3105 1
+61 3109 1
+61 3112 1
+61 3115 1
+61 3116 1
+61 3119 1
+61 3122 1
+61 3125 1
+61 3126 1
+61 3128 1
+61 3131 1
+61 3132 1
+61 3134 1
+61 3135 1
+61 3137 1
+61 3139 1
+61 3142 1
+61 3145 1
+61 3146 1
+61 3148 1
+61 3151 1
+61 3152 1
+61 3154 1
+61 3155 1
+61 3157 1
+61 3158 1
+61 3161 1
+61 3162 1
+61 3164 1
+61 3165 1
+61 3167 1
+61 3168 1
+61 3169 1
+61 3171 1
+61 3172 1
+61 3230 1
+61 3233 1
+61 3236 1
+61 3237 1
+61 3239 1
+61 3242 1
+61 3243 1
+61 3245 1
+61 3246 1
+61 3248 1
+61 3249 1
+61 3252 1
+61 3253 1
+61 3255 1
+61 3256 1
+61 3258 1
+61 3259 1
+61 3260 1
+61 3262 1
+61 3263 1
+61 3264 1
+61 3267 1
+61 3268 1
+61 3270 1
+61 3271 1
+61 3273 1
+61 3274 1
+61 3275 1
+61 3277 1
+61 3278 1
+61 3279 1
+61 3280 1
+61 3282 1
+61 3283 1
+61 3284 1
+61 3314 1
+61 3317 1
+61 3320 1
+61 3321 1
+61 3323 1
+61 3326 1
+61 3327 1
+61 3329 1
+61 3330 1
+61 3332 1
+61 3333 1
+61 3336 1
+61 3337 1
+61 3339 1
+61 3340 1
+61 3342 1
+61 3343 1
+61 3344 1
+61 3346 1
+61 3347 1
+61 3348 1
+61 3351 1
+61 3352 1
+61 3354 1
+61 3355 1
+61 3357 1
+61 3358 1
+61 3359 1
+61 3361 1
+61 3362 1
+61 3363 1
+61 3364 1
+61 3366 1
+61 3367 1
+61 3368 1
+61 3397 1
+61 3400 1
+61 3401 1
+61 3403 1
+61 3404 1
+61 3406 1
+61 3407 1
+61 3408 1
+61 3410 1
+61 3411 1
+61 3412 1
+61 3413 1
+61 3415 1
+61 3416 1
+61 3417 1
+61 3418 1
+61 3419 1
+61 3421 1
+61 3422 1
+61 3423 1
+61 3424 1
+62 7 1
+62 42 1
+62 48 1
+62 53 1
+62 57 1
+62 60 1
+62 62 1
+62 64 1
+62 126 1
+62 132 1
+62 137 1
+62 141 1
+62 144 1
+62 146 1
+62 148 1
+62 209 1
+62 214 1
+62 218 1
+62 221 1
+62 223 1
+62 225 1
+62 229 1
+62 233 1
+62 236 1
+62 238 1
+62 240 1
+62 243 1
+62 246 1
+62 248 1
+62 250 1
+62 252 1
+62 254 1
+62 256 1
+62 257 1
+62 259 1
+62 260 1
+62 336 1
+62 342 1
+62 347 1
+62 351 1
+62 354 1
+62 356 1
+62 358 1
+62 419 1
+62 424 1
+62 428 1
+62 431 1
+62 433 1
+62 435 1
+62 439 1
+62 443 1
+62 446 1
+62 448 1
+62 450 1
+62 453 1
+62 456 1
+62 458 1
+62 460 1
+62 462 1
+62 464 1
+62 466 1
+62 467 1
+62 469 1
+62 470 1
+62 545 1
+62 550 1
+62 554 1
+62 557 1
+62 559 1
+62 561 1
+62 565 1
+62 569 1
+62 572 1
+62 574 1
+62 576 1
+62 579 1
+62 582 1
+62 584 1
+62 586 1
+62 588 1
+62 590 1
+62 592 1
+62 593 1
+62 595 1
+62 596 1
+62 670 1
+62 674 1
+62 677 1
+62 679 1
+62 681 1
+62 684 1
+62 687 1
+62 689 1
+62 691 1
+62 693 1
+62 695 1
+62 697 1
+62 698 1
+62 700 1
+62 701 1
+62 704 1
+62 707 1
+62 709 1
+62 711 1
+62 713 1
+62 715 1
+62 717 1
+62 718 1
+62 720 1
+62 721 1
+62 723 1
+62 725 1
+62 727 1
+62 728 1
+62 730 1
+62 731 1
+62 732 1
+62 734 1
+62 735 1
+62 736 1
+62 798 1
+62 804 1
+62 809 1
+62 813 1
+62 816 1
+62 818 1
+62 820 1
+62 881 1
+62 886 1
+62 890 1
+62 893 1
+62 895 1
+62 897 1
+62 901 1
+62 905 1
+62 908 1
+62 910 1
+62 912 1
+62 915 1
+62 918 1
+62 920 1
+62 922 1
+62 924 1
+62 926 1
+62 928 1
+62 929 1
+62 931 1
+62 932 1
+62 1007 1
+62 1012 1
+62 1016 1
+62 1019 1
+62 1021 1
+62 1023 1
+62 1027 1
+62 1031 1
+62 1034 1
+62 1036 1
+62 1038 1
+62 1041 1
+62 1044 1
+62 1046 1
+62 1048 1
+62 1050 1
+62 1052 1
+62 1054 1
+62 1055 1
+62 1057 1
+62 1058 1
+62 1132 1
+62 1136 1
+62 1139 1
+62 1141 1
+62 1143 1
+62 1146 1
+62 1149 1
+62 1151 1
+62 1153 1
+62 1155 1
+62 1157 1
+62 1159 1
+62 1160 1
+62 1162 1
+62 1163 1
+62 1166 1
+62 1169 1
+62 1171 1
+62 1173 1
+62 1175 1
+62 1177 1
+62 1179 1
+62 1180 1
+62 1182 1
+62 1183 1
+62 1185 1
+62 1187 1
+62 1189 1
+62 1190 1
+62 1192 1
+62 1193 1
+62 1194 1
+62 1196 1
+62 1197 1
+62 1198 1
+62 1259 1
+62 1264 1
+62 1268 1
+62 1271 1
+62 1273 1
+62 1275 1
+62 1279 1
+62 1283 1
+62 1286 1
+62 1288 1
+62 1290 1
+62 1293 1
+62 1296 1
+62 1298 1
+62 1300 1
+62 1302 1
+62 1304 1
+62 1306 1
+62 1307 1
+62 1309 1
+62 1310 1
+62 1384 1
+62 1388 1
+62 1391 1
+62 1393 1
+62 1395 1
+62 1398 1
+62 1401 1
+62 1403 1
+62 1405 1
+62 1407 1
+62 1409 1
+62 1411 1
+62 1412 1
+62 1414 1
+62 1415 1
+62 1418 1
+62 1421 1
+62 1423 1
+62 1425 1
+62 1427 1
+62 1429 1
+62 1431 1
+62 1432 1
+62 1434 1
+62 1435 1
+62 1437 1
+62 1439 1
+62 1441 1
+62 1442 1
+62 1444 1
+62 1445 1
+62 1446 1
+62 1448 1
+62 1449 1
+62 1450 1
+62 1510 1
+62 1514 1
+62 1517 1
+62 1519 1
+62 1521 1
+62 1524 1
+62 1527 1
+62 1529 1
+62 1531 1
+62 1533 1
+62 1535 1
+62 1537 1
+62 1538 1
+62 1540 1
+62 1541 1
+62 1544 1
+62 1547 1
+62 1549 1
+62 1551 1
+62 1553 1
+62 1555 1
+62 1557 1
+62 1558 1
+62 1560 1
+62 1561 1
+62 1563 1
+62 1565 1
+62 1567 1
+62 1568 1
+62 1570 1
+62 1571 1
+62 1572 1
+62 1574 1
+62 1575 1
+62 1576 1
+62 1635 1
+62 1638 1
+62 1640 1
+62 1642 1
+62 1644 1
+62 1646 1
+62 1648 1
+62 1649 1
+62 1651 1
+62 1652 1
+62 1654 1
+62 1656 1
+62 1658 1
+62 1659 1
+62 1661 1
+62 1662 1
+62 1663 1
+62 1665 1
+62 1666 1
+62 1667 1
+62 1669 1
+62 1671 1
+62 1673 1
+62 1674 1
+62 1676 1
+62 1677 1
+62 1678 1
+62 1680 1
+62 1681 1
+62 1682 1
+62 1683 1
+62 1685 1
+62 1686 1
+62 1687 1
+62 1688 1
+62 1722 1
+62 1728 1
+62 1733 1
+62 1737 1
+62 1740 1
+62 1742 1
+62 1744 1
+62 1805 1
+62 1810 1
+62 1814 1
+62 1817 1
+62 1819 1
+62 1821 1
+62 1825 1
+62 1829 1
+62 1832 1
+62 1834 1
+62 1836 1
+62 1839 1
+62 1842 1
+62 1844 1
+62 1846 1
+62 1848 1
+62 1850 1
+62 1852 1
+62 1853 1
+62 1855 1
+62 1856 1
+62 1931 1
+62 1936 1
+62 1940 1
+62 1943 1
+62 1945 1
+62 1947 1
+62 1951 1
+62 1955 1
+62 1958 1
+62 1960 1
+62 1962 1
+62 1965 1
+62 1968 1
+62 1970 1
+62 1972 1
+62 1974 1
+62 1976 1
+62 1978 1
+62 1979 1
+62 1981 1
+62 1982 1
+62 2056 1
+62 2060 1
+62 2063 1
+62 2065 1
+62 2067 1
+62 2070 1
+62 2073 1
+62 2075 1
+62 2077 1
+62 2079 1
+62 2081 1
+62 2083 1
+62 2084 1
+62 2086 1
+62 2087 1
+62 2090 1
+62 2093 1
+62 2095 1
+62 2097 1
+62 2099 1
+62 2101 1
+62 2103 1
+62 2104 1
+62 2106 1
+62 2107 1
+62 2109 1
+62 2111 1
+62 2113 1
+62 2114 1
+62 2116 1
+62 2117 1
+62 2118 1
+62 2120 1
+62 2121 1
+62 2122 1
+62 2183 1
+62 2188 1
+62 2192 1
+62 2195 1
+62 2197 1
+62 2199 1
+62 2203 1
+62 2207 1
+62 2210 1
+62 2212 1
+62 2214 1
+62 2217 1
+62 2220 1
+62 2222 1
+62 2224 1
+62 2226 1
+62 2228 1
+62 2230 1
+62 2231 1
+62 2233 1
+62 2234 1
+62 2308 1
+62 2312 1
+62 2315 1
+62 2317 1
+62 2319 1
+62 2322 1
+62 2325 1
+62 2327 1
+62 2329 1
+62 2331 1
+62 2333 1
+62 2335 1
+62 2336 1
+62 2338 1
+62 2339 1
+62 2342 1
+62 2345 1
+62 2347 1
+62 2349 1
+62 2351 1
+62 2353 1
+62 2355 1
+62 2356 1
+62 2358 1
+62 2359 1
+62 2361 1
+62 2363 1
+62 2365 1
+62 2366 1
+62 2368 1
+62 2369 1
+62 2370 1
+62 2372 1
+62 2373 1
+62 2374 1
+62 2434 1
+62 2438 1
+62 2441 1
+62 2443 1
+62 2445 1
+62 2448 1
+62 2451 1
+62 2453 1
+62 2455 1
+62 2457 1
+62 2459 1
+62 2461 1
+62 2462 1
+62 2464 1
+62 2465 1
+62 2468 1
+62 2471 1
+62 2473 1
+62 2475 1
+62 2477 1
+62 2479 1
+62 2481 1
+62 2482 1
+62 2484 1
+62 2485 1
+62 2487 1
+62 2489 1
+62 2491 1
+62 2492 1
+62 2494 1
+62 2495 1
+62 2496 1
+62 2498 1
+62 2499 1
+62 2500 1
+62 2559 1
+62 2562 1
+62 2564 1
+62 2566 1
+62 2568 1
+62 2570 1
+62 2572 1
+62 2573 1
+62 2575 1
+62 2576 1
+62 2578 1
+62 2580 1
+62 2582 1
+62 2583 1
+62 2585 1
+62 2586 1
+62 2587 1
+62 2589 1
+62 2590 1
+62 2591 1
+62 2593 1
+62 2595 1
+62 2597 1
+62 2598 1
+62 2600 1
+62 2601 1
+62 2602 1
+62 2604 1
+62 2605 1
+62 2606 1
+62 2607 1
+62 2609 1
+62 2610 1
+62 2611 1
+62 2612 1
+62 2645 1
+62 2650 1
+62 2654 1
+62 2657 1
+62 2659 1
+62 2661 1
+62 2665 1
+62 2669 1
+62 2672 1
+62 2674 1
+62 2676 1
+62 2679 1
+62 2682 1
+62 2684 1
+62 2686 1
+62 2688 1
+62 2690 1
+62 2692 1
+62 2693 1
+62 2695 1
+62 2696 1
+62 2770 1
+62 2774 1
+62 2777 1
+62 2779 1
+62 2781 1
+62 2784 1
+62 2787 1
+62 2789 1
+62 2791 1
+62 2793 1
+62 2795 1
+62 2797 1
+62 2798 1
+62 2800 1
+62 2801 1
+62 2804 1
+62 2807 1
+62 2809 1
+62 2811 1
+62 2813 1
+62 2815 1
+62 2817 1
+62 2818 1
+62 2820 1
+62 2821 1
+62 2823 1
+62 2825 1
+62 2827 1
+62 2828 1
+62 2830 1
+62 2831 1
+62 2832 1
+62 2834 1
+62 2835 1
+62 2836 1
+62 2896 1
+62 2900 1
+62 2903 1
+62 2905 1
+62 2907 1
+62 2910 1
+62 2913 1
+62 2915 1
+62 2917 1
+62 2919 1
+62 2921 1
+62 2923 1
+62 2924 1
+62 2926 1
+62 2927 1
+62 2930 1
+62 2933 1
+62 2935 1
+62 2937 1
+62 2939 1
+62 2941 1
+62 2943 1
+62 2944 1
+62 2946 1
+62 2947 1
+62 2949 1
+62 2951 1
+62 2953 1
+62 2954 1
+62 2956 1
+62 2957 1
+62 2958 1
+62 2960 1
+62 2961 1
+62 2962 1
+62 3021 1
+62 3024 1
+62 3026 1
+62 3028 1
+62 3030 1
+62 3032 1
+62 3034 1
+62 3035 1
+62 3037 1
+62 3038 1
+62 3040 1
+62 3042 1
+62 3044 1
+62 3045 1
+62 3047 1
+62 3048 1
+62 3049 1
+62 3051 1
+62 3052 1
+62 3053 1
+62 3055 1
+62 3057 1
+62 3059 1
+62 3060 1
+62 3062 1
+62 3063 1
+62 3064 1
+62 3066 1
+62 3067 1
+62 3068 1
+62 3069 1
+62 3071 1
+62 3072 1
+62 3073 1
+62 3074 1
+62 3106 1
+62 3110 1
+62 3113 1
+62 3115 1
+62 3117 1
+62 3120 1
+62 3123 1
+62 3125 1
+62 3127 1
+62 3129 1
+62 3131 1
+62 3133 1
+62 3134 1
+62 3136 1
+62 3137 1
+62 3140 1
+62 3143 1
+62 3145 1
+62 3147 1
+62 3149 1
+62 3151 1
+62 3153 1
+62 3154 1
+62 3156 1
+62 3157 1
+62 3159 1
+62 3161 1
+62 3163 1
+62 3164 1
+62 3166 1
+62 3167 1
+62 3168 1
+62 3170 1
+62 3171 1
+62 3172 1
+62 3231 1
+62 3234 1
+62 3236 1
+62 3238 1
+62 3240 1
+62 3242 1
+62 3244 1
+62 3245 1
+62 3247 1
+62 3248 1
+62 3250 1
+62 3252 1
+62 3254 1
+62 3255 1
+62 3257 1
+62 3258 1
+62 3259 1
+62 3261 1
+62 3262 1
+62 3263 1
+62 3265 1
+62 3267 1
+62 3269 1
+62 3270 1
+62 3272 1
+62 3273 1
+62 3274 1
+62 3276 1
+62 3277 1
+62 3278 1
+62 3279 1
+62 3281 1
+62 3282 1
+62 3283 1
+62 3284 1
+62 3315 1
+62 3318 1
+62 3320 1
+62 3322 1
+62 3324 1
+62 3326 1
+62 3328 1
+62 3329 1
+62 3331 1
+62 3332 1
+62 3334 1
+62 3336 1
+62 3338 1
+62 3339 1
+62 3341 1
+62 3342 1
+62 3343 1
+62 3345 1
+62 3346 1
+62 3347 1
+62 3349 1
+62 3351 1
+62 3353 1
+62 3354 1
+62 3356 1
+62 3357 1
+62 3358 1
+62 3360 1
+62 3361 1
+62 3362 1
+62 3363 1
+62 3365 1
+62 3366 1
+62 3367 1
+62 3368 1
+62 3398 1
+62 3400 1
+62 3402 1
+62 3403 1
+62 3405 1
+62 3406 1
+62 3407 1
+62 3409 1
+62 3410 1
+62 3411 1
+62 3412 1
+62 3414 1
+62 3415 1
+62 3416 1
+62 3417 1
+62 3418 1
+62 3420 1
+62 3421 1
+62 3422 1
+62 3423 1
+62 3424 1
+63 8 1
+63 43 1
+63 49 1
+63 54 1
+63 58 1
+63 61 1
+63 63 1
+63 64 1
+63 127 1
+63 133 1
+63 138 1
+63 142 1
+63 145 1
+63 147 1
+63 148 1
+63 210 1
+63 215 1
+63 219 1
+63 222 1
+63 224 1
+63 225 1
+63 230 1
+63 234 1
+63 237 1
+63 239 1
+63 240 1
+63 244 1
+63 247 1
+63 249 1
+63 250 1
+63 253 1
+63 255 1
+63 256 1
+63 258 1
+63 259 1
+63 260 1
+63 337 1
+63 343 1
+63 348 1
+63 352 1
+63 355 1
+63 357 1
+63 358 1
+63 420 1
+63 425 1
+63 429 1
+63 432 1
+63 434 1
+63 435 1
+63 440 1
+63 444 1
+63 447 1
+63 449 1
+63 450 1
+63 454 1
+63 457 1
+63 459 1
+63 460 1
+63 463 1
+63 465 1
+63 466 1
+63 468 1
+63 469 1
+63 470 1
+63 546 1
+63 551 1
+63 555 1
+63 558 1
+63 560 1
+63 561 1
+63 566 1
+63 570 1
+63 573 1
+63 575 1
+63 576 1
+63 580 1
+63 583 1
+63 585 1
+63 586 1
+63 589 1
+63 591 1
+63 592 1
+63 594 1
+63 595 1
+63 596 1
+63 671 1
+63 675 1
+63 678 1
+63 680 1
+63 681 1
+63 685 1
+63 688 1
+63 690 1
+63 691 1
+63 694 1
+63 696 1
+63 697 1
+63 699 1
+63 700 1
+63 701 1
+63 705 1
+63 708 1
+63 710 1
+63 711 1
+63 714 1
+63 716 1
+63 717 1
+63 719 1
+63 720 1
+63 721 1
+63 724 1
+63 726 1
+63 727 1
+63 729 1
+63 730 1
+63 731 1
+63 733 1
+63 734 1
+63 735 1
+63 736 1
+63 799 1
+63 805 1
+63 810 1
+63 814 1
+63 817 1
+63 819 1
+63 820 1
+63 882 1
+63 887 1
+63 891 1
+63 894 1
+63 896 1
+63 897 1
+63 902 1
+63 906 1
+63 909 1
+63 911 1
+63 912 1
+63 916 1
+63 919 1
+63 921 1
+63 922 1
+63 925 1
+63 927 1
+63 928 1
+63 930 1
+63 931 1
+63 932 1
+63 1008 1
+63 1013 1
+63 1017 1
+63 1020 1
+63 1022 1
+63 1023 1
+63 1028 1
+63 1032 1
+63 1035 1
+63 1037 1
+63 1038 1
+63 1042 1
+63 1045 1
+63 1047 1
+63 1048 1
+63 1051 1
+63 1053 1
+63 1054 1
+63 1056 1
+63 1057 1
+63 1058 1
+63 1133 1
+63 1137 1
+63 1140 1
+63 1142 1
+63 1143 1
+63 1147 1
+63 1150 1
+63 1152 1
+63 1153 1
+63 1156 1
+63 1158 1
+63 1159 1
+63 1161 1
+63 1162 1
+63 1163 1
+63 1167 1
+63 1170 1
+63 1172 1
+63 1173 1
+63 1176 1
+63 1178 1
+63 1179 1
+63 1181 1
+63 1182 1
+63 1183 1
+63 1186 1
+63 1188 1
+63 1189 1
+63 1191 1
+63 1192 1
+63 1193 1
+63 1195 1
+63 1196 1
+63 1197 1
+63 1198 1
+63 1260 1
+63 1265 1
+63 1269 1
+63 1272 1
+63 1274 1
+63 1275 1
+63 1280 1
+63 1284 1
+63 1287 1
+63 1289 1
+63 1290 1
+63 1294 1
+63 1297 1
+63 1299 1
+63 1300 1
+63 1303 1
+63 1305 1
+63 1306 1
+63 1308 1
+63 1309 1
+63 1310 1
+63 1385 1
+63 1389 1
+63 1392 1
+63 1394 1
+63 1395 1
+63 1399 1
+63 1402 1
+63 1404 1
+63 1405 1
+63 1408 1
+63 1410 1
+63 1411 1
+63 1413 1
+63 1414 1
+63 1415 1
+63 1419 1
+63 1422 1
+63 1424 1
+63 1425 1
+63 1428 1
+63 1430 1
+63 1431 1
+63 1433 1
+63 1434 1
+63 1435 1
+63 1438 1
+63 1440 1
+63 1441 1
+63 1443 1
+63 1444 1
+63 1445 1
+63 1447 1
+63 1448 1
+63 1449 1
+63 1450 1
+63 1511 1
+63 1515 1
+63 1518 1
+63 1520 1
+63 1521 1
+63 1525 1
+63 1528 1
+63 1530 1
+63 1531 1
+63 1534 1
+63 1536 1
+63 1537 1
+63 1539 1
+63 1540 1
+63 1541 1
+63 1545 1
+63 1548 1
+63 1550 1
+63 1551 1
+63 1554 1
+63 1556 1
+63 1557 1
+63 1559 1
+63 1560 1
+63 1561 1
+63 1564 1
+63 1566 1
+63 1567 1
+63 1569 1
+63 1570 1
+63 1571 1
+63 1573 1
+63 1574 1
+63 1575 1
+63 1576 1
+63 1636 1
+63 1639 1
+63 1641 1
+63 1642 1
+63 1645 1
+63 1647 1
+63 1648 1
+63 1650 1
+63 1651 1
+63 1652 1
+63 1655 1
+63 1657 1
+63 1658 1
+63 1660 1
+63 1661 1
+63 1662 1
+63 1664 1
+63 1665 1
+63 1666 1
+63 1667 1
+63 1670 1
+63 1672 1
+63 1673 1
+63 1675 1
+63 1676 1
+63 1677 1
+63 1679 1
+63 1680 1
+63 1681 1
+63 1682 1
+63 1684 1
+63 1685 1
+63 1686 1
+63 1687 1
+63 1688 1
+63 1723 1
+63 1729 1
+63 1734 1
+63 1738 1
+63 1741 1
+63 1743 1
+63 1744 1
+63 1806 1
+63 1811 1
+63 1815 1
+63 1818 1
+63 1820 1
+63 1821 1
+63 1826 1
+63 1830 1
+63 1833 1
+63 1835 1
+63 1836 1
+63 1840 1
+63 1843 1
+63 1845 1
+63 1846 1
+63 1849 1
+63 1851 1
+63 1852 1
+63 1854 1
+63 1855 1
+63 1856 1
+63 1932 1
+63 1937 1
+63 1941 1
+63 1944 1
+63 1946 1
+63 1947 1
+63 1952 1
+63 1956 1
+63 1959 1
+63 1961 1
+63 1962 1
+63 1966 1
+63 1969 1
+63 1971 1
+63 1972 1
+63 1975 1
+63 1977 1
+63 1978 1
+63 1980 1
+63 1981 1
+63 1982 1
+63 2057 1
+63 2061 1
+63 2064 1
+63 2066 1
+63 2067 1
+63 2071 1
+63 2074 1
+63 2076 1
+63 2077 1
+63 2080 1
+63 2082 1
+63 2083 1
+63 2085 1
+63 2086 1
+63 2087 1
+63 2091 1
+63 2094 1
+63 2096 1
+63 2097 1
+63 2100 1
+63 2102 1
+63 2103 1
+63 2105 1
+63 2106 1
+63 2107 1
+63 2110 1
+63 2112 1
+63 2113 1
+63 2115 1
+63 2116 1
+63 2117 1
+63 2119 1
+63 2120 1
+63 2121 1
+63 2122 1
+63 2184 1
+63 2189 1
+63 2193 1
+63 2196 1
+63 2198 1
+63 2199 1
+63 2204 1
+63 2208 1
+63 2211 1
+63 2213 1
+63 2214 1
+63 2218 1
+63 2221 1
+63 2223 1
+63 2224 1
+63 2227 1
+63 2229 1
+63 2230 1
+63 2232 1
+63 2233 1
+63 2234 1
+63 2309 1
+63 2313 1
+63 2316 1
+63 2318 1
+63 2319 1
+63 2323 1
+63 2326 1
+63 2328 1
+63 2329 1
+63 2332 1
+63 2334 1
+63 2335 1
+63 2337 1
+63 2338 1
+63 2339 1
+63 2343 1
+63 2346 1
+63 2348 1
+63 2349 1
+63 2352 1
+63 2354 1
+63 2355 1
+63 2357 1
+63 2358 1
+63 2359 1
+63 2362 1
+63 2364 1
+63 2365 1
+63 2367 1
+63 2368 1
+63 2369 1
+63 2371 1
+63 2372 1
+63 2373 1
+63 2374 1
+63 2435 1
+63 2439 1
+63 2442 1
+63 2444 1
+63 2445 1
+63 2449 1
+63 2452 1
+63 2454 1
+63 2455 1
+63 2458 1
+63 2460 1
+63 2461 1
+63 2463 1
+63 2464 1
+63 2465 1
+63 2469 1
+63 2472 1
+63 2474 1
+63 2475 1
+63 2478 1
+63 2480 1
+63 2481 1
+63 2483 1
+63 2484 1
+63 2485 1
+63 2488 1
+63 2490 1
+63 2491 1
+63 2493 1
+63 2494 1
+63 2495 1
+63 2497 1
+63 2498 1
+63 2499 1
+63 2500 1
+63 2560 1
+63 2563 1
+63 2565 1
+63 2566 1
+63 2569 1
+63 2571 1
+63 2572 1
+63 2574 1
+63 2575 1
+63 2576 1
+63 2579 1
+63 2581 1
+63 2582 1
+63 2584 1
+63 2585 1
+63 2586 1
+63 2588 1
+63 2589 1
+63 2590 1
+63 2591 1
+63 2594 1
+63 2596 1
+63 2597 1
+63 2599 1
+63 2600 1
+63 2601 1
+63 2603 1
+63 2604 1
+63 2605 1
+63 2606 1
+63 2608 1
+63 2609 1
+63 2610 1
+63 2611 1
+63 2612 1
+63 2646 1
+63 2651 1
+63 2655 1
+63 2658 1
+63 2660 1
+63 2661 1
+63 2666 1
+63 2670 1
+63 2673 1
+63 2675 1
+63 2676 1
+63 2680 1
+63 2683 1
+63 2685 1
+63 2686 1
+63 2689 1
+63 2691 1
+63 2692 1
+63 2694 1
+63 2695 1
+63 2696 1
+63 2771 1
+63 2775 1
+63 2778 1
+63 2780 1
+63 2781 1
+63 2785 1
+63 2788 1
+63 2790 1
+63 2791 1
+63 2794 1
+63 2796 1
+63 2797 1
+63 2799 1
+63 2800 1
+63 2801 1
+63 2805 1
+63 2808 1
+63 2810 1
+63 2811 1
+63 2814 1
+63 2816 1
+63 2817 1
+63 2819 1
+63 2820 1
+63 2821 1
+63 2824 1
+63 2826 1
+63 2827 1
+63 2829 1
+63 2830 1
+63 2831 1
+63 2833 1
+63 2834 1
+63 2835 1
+63 2836 1
+63 2897 1
+63 2901 1
+63 2904 1
+63 2906 1
+63 2907 1
+63 2911 1
+63 2914 1
+63 2916 1
+63 2917 1
+63 2920 1
+63 2922 1
+63 2923 1
+63 2925 1
+63 2926 1
+63 2927 1
+63 2931 1
+63 2934 1
+63 2936 1
+63 2937 1
+63 2940 1
+63 2942 1
+63 2943 1
+63 2945 1
+63 2946 1
+63 2947 1
+63 2950 1
+63 2952 1
+63 2953 1
+63 2955 1
+63 2956 1
+63 2957 1
+63 2959 1
+63 2960 1
+63 2961 1
+63 2962 1
+63 3022 1
+63 3025 1
+63 3027 1
+63 3028 1
+63 3031 1
+63 3033 1
+63 3034 1
+63 3036 1
+63 3037 1
+63 3038 1
+63 3041 1
+63 3043 1
+63 3044 1
+63 3046 1
+63 3047 1
+63 3048 1
+63 3050 1
+63 3051 1
+63 3052 1
+63 3053 1
+63 3056 1
+63 3058 1
+63 3059 1
+63 3061 1
+63 3062 1
+63 3063 1
+63 3065 1
+63 3066 1
+63 3067 1
+63 3068 1
+63 3070 1
+63 3071 1
+63 3072 1
+63 3073 1
+63 3074 1
+63 3107 1
+63 3111 1
+63 3114 1
+63 3116 1
+63 3117 1
+63 3121 1
+63 3124 1
+63 3126 1
+63 3127 1
+63 3130 1
+63 3132 1
+63 3133 1
+63 3135 1
+63 3136 1
+63 3137 1
+63 3141 1
+63 3144 1
+63 3146 1
+63 3147 1
+63 3150 1
+63 3152 1
+63 3153 1
+63 3155 1
+63 3156 1
+63 3157 1
+63 3160 1
+63 3162 1
+63 3163 1
+63 3165 1
+63 3166 1
+63 3167 1
+63 3169 1
+63 3170 1
+63 3171 1
+63 3172 1
+63 3232 1
+63 3235 1
+63 3237 1
+63 3238 1
+63 3241 1
+63 3243 1
+63 3244 1
+63 3246 1
+63 3247 1
+63 3248 1
+63 3251 1
+63 3253 1
+63 3254 1
+63 3256 1
+63 3257 1
+63 3258 1
+63 3260 1
+63 3261 1
+63 3262 1
+63 3263 1
+63 3266 1
+63 3268 1
+63 3269 1
+63 3271 1
+63 3272 1
+63 3273 1
+63 3275 1
+63 3276 1
+63 3277 1
+63 3278 1
+63 3280 1
+63 3281 1
+63 3282 1
+63 3283 1
+63 3284 1
+63 3316 1
+63 3319 1
+63 3321 1
+63 3322 1
+63 3325 1
+63 3327 1
+63 3328 1
+63 3330 1
+63 3331 1
+63 3332 1
+63 3335 1
+63 3337 1
+63 3338 1
+63 3340 1
+63 3341 1
+63 3342 1
+63 3344 1
+63 3345 1
+63 3346 1
+63 3347 1
+63 3350 1
+63 3352 1
+63 3353 1
+63 3355 1
+63 3356 1
+63 3357 1
+63 3359 1
+63 3360 1
+63 3361 1
+63 3362 1
+63 3364 1
+63 3365 1
+63 3366 1
+63 3367 1
+63 3368 1
+63 3399 1
+63 3401 1
+63 3402 1
+63 3404 1
+63 3405 1
+63 3406 1
+63 3408 1
+63 3409 1
+63 3410 1
+63 3411 1
+63 3413 1
+63 3414 1
+63 3415 1
+63 3416 1
+63 3417 1
+63 3419 1
+63 3420 1
+63 3421 1
+63 3422 1
+63 3423 1
+63 3424 1
+64 9 1
+64 37 1
+64 65 1
+64 66 1
+64 67 1
+64 68 1
+64 69 1
+64 70 1
+64 121 1
+64 149 1
+64 150 1
+64 151 1
+64 152 1
+64 153 1
+64 154 1
+64 205 1
+64 206 1
+64 207 1
+64 208 1
+64 209 1
+64 210 1
+64 261 1
+64 262 1
+64 263 1
+64 264 1
+64 265 1
+64 266 1
+64 267 1
+64 268 1
+64 269 1
+64 270 1
+64 271 1
+64 272 1
+64 273 1
+64 274 1
+64 275 1
+64 331 1
+64 359 1
+64 360 1
+64 361 1
+64 362 1
+64 363 1
+64 364 1
+64 415 1
+64 416 1
+64 417 1
+64 418 1
+64 419 1
+64 420 1
+64 471 1
+64 472 1
+64 473 1
+64 474 1
+64 475 1
+64 476 1
+64 477 1
+64 478 1
+64 479 1
+64 480 1
+64 481 1
+64 482 1
+64 483 1
+64 484 1
+64 485 1
+64 541 1
+64 542 1
+64 543 1
+64 544 1
+64 545 1
+64 546 1
+64 597 1
+64 598 1
+64 599 1
+64 600 1
+64 601 1
+64 602 1
+64 603 1
+64 604 1
+64 605 1
+64 606 1
+64 607 1
+64 608 1
+64 609 1
+64 610 1
+64 611 1
+64 667 1
+64 668 1
+64 669 1
+64 670 1
+64 671 1
+64 672 1
+64 673 1
+64 674 1
+64 675 1
+64 676 1
+64 677 1
+64 678 1
+64 679 1
+64 680 1
+64 681 1
+64 737 1
+64 738 1
+64 739 1
+64 740 1
+64 741 1
+64 742 1
+64 743 1
+64 744 1
+64 745 1
+64 746 1
+64 747 1
+64 748 1
+64 749 1
+64 750 1
+64 751 1
+64 752 1
+64 753 1
+64 754 1
+64 755 1
+64 756 1
+64 793 1
+64 821 1
+64 822 1
+64 823 1
+64 824 1
+64 825 1
+64 826 1
+64 877 1
+64 878 1
+64 879 1
+64 880 1
+64 881 1
+64 882 1
+64 933 1
+64 934 1
+64 935 1
+64 936 1
+64 937 1
+64 938 1
+64 939 1
+64 940 1
+64 941 1
+64 942 1
+64 943 1
+64 944 1
+64 945 1
+64 946 1
+64 947 1
+64 1003 1
+64 1004 1
+64 1005 1
+64 1006 1
+64 1007 1
+64 1008 1
+64 1059 1
+64 1060 1
+64 1061 1
+64 1062 1
+64 1063 1
+64 1064 1
+64 1065 1
+64 1066 1
+64 1067 1
+64 1068 1
+64 1069 1
+64 1070 1
+64 1071 1
+64 1072 1
+64 1073 1
+64 1129 1
+64 1130 1
+64 1131 1
+64 1132 1
+64 1133 1
+64 1134 1
+64 1135 1
+64 1136 1
+64 1137 1
+64 1138 1
+64 1139 1
+64 1140 1
+64 1141 1
+64 1142 1
+64 1143 1
+64 1199 1
+64 1200 1
+64 1201 1
+64 1202 1
+64 1203 1
+64 1204 1
+64 1205 1
+64 1206 1
+64 1207 1
+64 1208 1
+64 1209 1
+64 1210 1
+64 1211 1
+64 1212 1
+64 1213 1
+64 1214 1
+64 1215 1
+64 1216 1
+64 1217 1
+64 1218 1
+64 1255 1
+64 1256 1
+64 1257 1
+64 1258 1
+64 1259 1
+64 1260 1
+64 1311 1
+64 1312 1
+64 1313 1
+64 1314 1
+64 1315 1
+64 1316 1
+64 1317 1
+64 1318 1
+64 1319 1
+64 1320 1
+64 1321 1
+64 1322 1
+64 1323 1
+64 1324 1
+64 1325 1
+64 1381 1
+64 1382 1
+64 1383 1
+64 1384 1
+64 1385 1
+64 1386 1
+64 1387 1
+64 1388 1
+64 1389 1
+64 1390 1
+64 1391 1
+64 1392 1
+64 1393 1
+64 1394 1
+64 1395 1
+64 1451 1
+64 1452 1
+64 1453 1
+64 1454 1
+64 1455 1
+64 1456 1
+64 1457 1
+64 1458 1
+64 1459 1
+64 1460 1
+64 1461 1
+64 1462 1
+64 1463 1
+64 1464 1
+64 1465 1
+64 1466 1
+64 1467 1
+64 1468 1
+64 1469 1
+64 1470 1
+64 1507 1
+64 1508 1
+64 1509 1
+64 1510 1
+64 1511 1
+64 1512 1
+64 1513 1
+64 1514 1
+64 1515 1
+64 1516 1
+64 1517 1
+64 1518 1
+64 1519 1
+64 1520 1
+64 1521 1
+64 1577 1
+64 1578 1
+64 1579 1
+64 1580 1
+64 1581 1
+64 1582 1
+64 1583 1
+64 1584 1
+64 1585 1
+64 1586 1
+64 1587 1
+64 1588 1
+64 1589 1
+64 1590 1
+64 1591 1
+64 1592 1
+64 1593 1
+64 1594 1
+64 1595 1
+64 1596 1
+64 1633 1
+64 1634 1
+64 1635 1
+64 1636 1
+64 1637 1
+64 1638 1
+64 1639 1
+64 1640 1
+64 1641 1
+64 1642 1
+64 1643 1
+64 1644 1
+64 1645 1
+64 1646 1
+64 1647 1
+64 1648 1
+64 1649 1
+64 1650 1
+64 1651 1
+64 1652 1
+64 1689 1
+64 1690 1
+64 1691 1
+64 1692 1
+64 1693 1
+64 1694 1
+64 1695 1
+64 1696 1
+64 1697 1
+64 1698 1
+64 1699 1
+64 1700 1
+64 1701 1
+64 1702 1
+64 1703 1
+64 1717 1
+64 1745 1
+64 1746 1
+64 1747 1
+64 1748 1
+64 1749 1
+64 1750 1
+64 1801 1
+64 1802 1
+64 1803 1
+64 1804 1
+64 1805 1
+64 1806 1
+64 1857 1
+64 1858 1
+64 1859 1
+64 1860 1
+64 1861 1
+64 1862 1
+64 1863 1
+64 1864 1
+64 1865 1
+64 1866 1
+64 1867 1
+64 1868 1
+64 1869 1
+64 1870 1
+64 1871 1
+64 1927 1
+64 1928 1
+64 1929 1
+64 1930 1
+64 1931 1
+64 1932 1
+64 1983 1
+64 1984 1
+64 1985 1
+64 1986 1
+64 1987 1
+64 1988 1
+64 1989 1
+64 1990 1
+64 1991 1
+64 1992 1
+64 1993 1
+64 1994 1
+64 1995 1
+64 1996 1
+64 1997 1
+64 2053 1
+64 2054 1
+64 2055 1
+64 2056 1
+64 2057 1
+64 2058 1
+64 2059 1
+64 2060 1
+64 2061 1
+64 2062 1
+64 2063 1
+64 2064 1
+64 2065 1
+64 2066 1
+64 2067 1
+64 2123 1
+64 2124 1
+64 2125 1
+64 2126 1
+64 2127 1
+64 2128 1
+64 2129 1
+64 2130 1
+64 2131 1
+64 2132 1
+64 2133 1
+64 2134 1
+64 2135 1
+64 2136 1
+64 2137 1
+64 2138 1
+64 2139 1
+64 2140 1
+64 2141 1
+64 2142 1
+64 2179 1
+64 2180 1
+64 2181 1
+64 2182 1
+64 2183 1
+64 2184 1
+64 2235 1
+64 2236 1
+64 2237 1
+64 2238 1
+64 2239 1
+64 2240 1
+64 2241 1
+64 2242 1
+64 2243 1
+64 2244 1
+64 2245 1
+64 2246 1
+64 2247 1
+64 2248 1
+64 2249 1
+64 2305 1
+64 2306 1
+64 2307 1
+64 2308 1
+64 2309 1
+64 2310 1
+64 2311 1
+64 2312 1
+64 2313 1
+64 2314 1
+64 2315 1
+64 2316 1
+64 2317 1
+64 2318 1
+64 2319 1
+64 2375 1
+64 2376 1
+64 2377 1
+64 2378 1
+64 2379 1
+64 2380 1
+64 2381 1
+64 2382 1
+64 2383 1
+64 2384 1
+64 2385 1
+64 2386 1
+64 2387 1
+64 2388 1
+64 2389 1
+64 2390 1
+64 2391 1
+64 2392 1
+64 2393 1
+64 2394 1
+64 2431 1
+64 2432 1
+64 2433 1
+64 2434 1
+64 2435 1
+64 2436 1
+64 2437 1
+64 2438 1
+64 2439 1
+64 2440 1
+64 2441 1
+64 2442 1
+64 2443 1
+64 2444 1
+64 2445 1
+64 2501 1
+64 2502 1
+64 2503 1
+64 2504 1
+64 2505 1
+64 2506 1
+64 2507 1
+64 2508 1
+64 2509 1
+64 2510 1
+64 2511 1
+64 2512 1
+64 2513 1
+64 2514 1
+64 2515 1
+64 2516 1
+64 2517 1
+64 2518 1
+64 2519 1
+64 2520 1
+64 2557 1
+64 2558 1
+64 2559 1
+64 2560 1
+64 2561 1
+64 2562 1
+64 2563 1
+64 2564 1
+64 2565 1
+64 2566 1
+64 2567 1
+64 2568 1
+64 2569 1
+64 2570 1
+64 2571 1
+64 2572 1
+64 2573 1
+64 2574 1
+64 2575 1
+64 2576 1
+64 2613 1
+64 2614 1
+64 2615 1
+64 2616 1
+64 2617 1
+64 2618 1
+64 2619 1
+64 2620 1
+64 2621 1
+64 2622 1
+64 2623 1
+64 2624 1
+64 2625 1
+64 2626 1
+64 2627 1
+64 2641 1
+64 2642 1
+64 2643 1
+64 2644 1
+64 2645 1
+64 2646 1
+64 2697 1
+64 2698 1
+64 2699 1
+64 2700 1
+64 2701 1
+64 2702 1
+64 2703 1
+64 2704 1
+64 2705 1
+64 2706 1
+64 2707 1
+64 2708 1
+64 2709 1
+64 2710 1
+64 2711 1
+64 2767 1
+64 2768 1
+64 2769 1
+64 2770 1
+64 2771 1
+64 2772 1
+64 2773 1
+64 2774 1
+64 2775 1
+64 2776 1
+64 2777 1
+64 2778 1
+64 2779 1
+64 2780 1
+64 2781 1
+64 2837 1
+64 2838 1
+64 2839 1
+64 2840 1
+64 2841 1
+64 2842 1
+64 2843 1
+64 2844 1
+64 2845 1
+64 2846 1
+64 2847 1
+64 2848 1
+64 2849 1
+64 2850 1
+64 2851 1
+64 2852 1
+64 2853 1
+64 2854 1
+64 2855 1
+64 2856 1
+64 2893 1
+64 2894 1
+64 2895 1
+64 2896 1
+64 2897 1
+64 2898 1
+64 2899 1
+64 2900 1
+64 2901 1
+64 2902 1
+64 2903 1
+64 2904 1
+64 2905 1
+64 2906 1
+64 2907 1
+64 2963 1
+64 2964 1
+64 2965 1
+64 2966 1
+64 2967 1
+64 2968 1
+64 2969 1
+64 2970 1
+64 2971 1
+64 2972 1
+64 2973 1
+64 2974 1
+64 2975 1
+64 2976 1
+64 2977 1
+64 2978 1
+64 2979 1
+64 2980 1
+64 2981 1
+64 2982 1
+64 3019 1
+64 3020 1
+64 3021 1
+64 3022 1
+64 3023 1
+64 3024 1
+64 3025 1
+64 3026 1
+64 3027 1
+64 3028 1
+64 3029 1
+64 3030 1
+64 3031 1
+64 3032 1
+64 3033 1
+64 3034 1
+64 3035 1
+64 3036 1
+64 3037 1
+64 3038 1
+64 3075 1
+64 3076 1
+64 3077 1
+64 3078 1
+64 3079 1
+64 3080 1
+64 3081 1
+64 3082 1
+64 3083 1
+64 3084 1
+64 3085 1
+64 3086 1
+64 3087 1
+64 3088 1
+64 3089 1
+64 3103 1
+64 3104 1
+64 3105 1
+64 3106 1
+64 3107 1
+64 3108 1
+64 3109 1
+64 3110 1
+64 3111 1
+64 3112 1
+64 3113 1
+64 3114 1
+64 3115 1
+64 3116 1
+64 3117 1
+64 3173 1
+64 3174 1
+64 3175 1
+64 3176 1
+64 3177 1
+64 3178 1
+64 3179 1
+64 3180 1
+64 3181 1
+64 3182 1
+64 3183 1
+64 3184 1
+64 3185 1
+64 3186 1
+64 3187 1
+64 3188 1
+64 3189 1
+64 3190 1
+64 3191 1
+64 3192 1
+64 3229 1
+64 3230 1
+64 3231 1
+64 3232 1
+64 3233 1
+64 3234 1
+64 3235 1
+64 3236 1
+64 3237 1
+64 3238 1
+64 3239 1
+64 3240 1
+64 3241 1
+64 3242 1
+64 3243 1
+64 3244 1
+64 3245 1
+64 3246 1
+64 3247 1
+64 3248 1
+64 3285 1
+64 3286 1
+64 3287 1
+64 3288 1
+64 3289 1
+64 3290 1
+64 3291 1
+64 3292 1
+64 3293 1
+64 3294 1
+64 3295 1
+64 3296 1
+64 3297 1
+64 3298 1
+64 3299 1
+64 3313 1
+64 3314 1
+64 3315 1
+64 3316 1
+64 3317 1
+64 3318 1
+64 3319 1
+64 3320 1
+64 3321 1
+64 3322 1
+64 3323 1
+64 3324 1
+64 3325 1
+64 3326 1
+64 3327 1
+64 3328 1
+64 3329 1
+64 3330 1
+64 3331 1
+64 3332 1
+64 3369 1
+64 3370 1
+64 3371 1
+64 3372 1
+64 3373 1
+64 3374 1
+64 3375 1
+64 3376 1
+64 3377 1
+64 3378 1
+64 3379 1
+64 3380 1
+64 3381 1
+64 3382 1
+64 3383 1
+64 3397 1
+64 3398 1
+64 3399 1
+64 3400 1
+64 3401 1
+64 3402 1
+64 3403 1
+64 3404 1
+64 3405 1
+64 3406 1
+64 3407 1
+64 3408 1
+64 3409 1
+64 3410 1
+64 3411 1
+64 3425 1
+64 3426 1
+64 3427 1
+64 3428 1
+64 3429 1
+64 3430 1
+65 10 1
+65 38 1
+65 65 1
+65 71 1
+65 72 1
+65 73 1
+65 74 1
+65 75 1
+65 122 1
+65 149 1
+65 155 1
+65 156 1
+65 157 1
+65 158 1
+65 159 1
+65 205 1
+65 211 1
+65 212 1
+65 213 1
+65 214 1
+65 215 1
+65 261 1
+65 262 1
+65 263 1
+65 264 1
+65 265 1
+65 276 1
+65 277 1
+65 278 1
+65 279 1
+65 280 1
+65 281 1
+65 282 1
+65 283 1
+65 284 1
+65 285 1
+65 332 1
+65 359 1
+65 365 1
+65 366 1
+65 367 1
+65 368 1
+65 369 1
+65 415 1
+65 421 1
+65 422 1
+65 423 1
+65 424 1
+65 425 1
+65 471 1
+65 472 1
+65 473 1
+65 474 1
+65 475 1
+65 486 1
+65 487 1
+65 488 1
+65 489 1
+65 490 1
+65 491 1
+65 492 1
+65 493 1
+65 494 1
+65 495 1
+65 541 1
+65 547 1
+65 548 1
+65 549 1
+65 550 1
+65 551 1
+65 597 1
+65 598 1
+65 599 1
+65 600 1
+65 601 1
+65 612 1
+65 613 1
+65 614 1
+65 615 1
+65 616 1
+65 617 1
+65 618 1
+65 619 1
+65 620 1
+65 621 1
+65 667 1
+65 668 1
+65 669 1
+65 670 1
+65 671 1
+65 682 1
+65 683 1
+65 684 1
+65 685 1
+65 686 1
+65 687 1
+65 688 1
+65 689 1
+65 690 1
+65 691 1
+65 737 1
+65 738 1
+65 739 1
+65 740 1
+65 741 1
+65 742 1
+65 743 1
+65 744 1
+65 745 1
+65 746 1
+65 757 1
+65 758 1
+65 759 1
+65 760 1
+65 761 1
+65 762 1
+65 763 1
+65 764 1
+65 765 1
+65 766 1
+65 794 1
+65 821 1
+65 827 1
+65 828 1
+65 829 1
+65 830 1
+65 831 1
+65 877 1
+65 883 1
+65 884 1
+65 885 1
+65 886 1
+65 887 1
+65 933 1
+65 934 1
+65 935 1
+65 936 1
+65 937 1
+65 948 1
+65 949 1
+65 950 1
+65 951 1
+65 952 1
+65 953 1
+65 954 1
+65 955 1
+65 956 1
+65 957 1
+65 1003 1
+65 1009 1
+65 1010 1
+65 1011 1
+65 1012 1
+65 1013 1
+65 1059 1
+65 1060 1
+65 1061 1
+65 1062 1
+65 1063 1
+65 1074 1
+65 1075 1
+65 1076 1
+65 1077 1
+65 1078 1
+65 1079 1
+65 1080 1
+65 1081 1
+65 1082 1
+65 1083 1
+65 1129 1
+65 1130 1
+65 1131 1
+65 1132 1
+65 1133 1
+65 1144 1
+65 1145 1
+65 1146 1
+65 1147 1
+65 1148 1
+65 1149 1
+65 1150 1
+65 1151 1
+65 1152 1
+65 1153 1
+65 1199 1
+65 1200 1
+65 1201 1
+65 1202 1
+65 1203 1
+65 1204 1
+65 1205 1
+65 1206 1
+65 1207 1
+65 1208 1
+65 1219 1
+65 1220 1
+65 1221 1
+65 1222 1
+65 1223 1
+65 1224 1
+65 1225 1
+65 1226 1
+65 1227 1
+65 1228 1
+65 1255 1
+65 1261 1
+65 1262 1
+65 1263 1
+65 1264 1
+65 1265 1
+65 1311 1
+65 1312 1
+65 1313 1
+65 1314 1
+65 1315 1
+65 1326 1
+65 1327 1
+65 1328 1
+65 1329 1
+65 1330 1
+65 1331 1
+65 1332 1
+65 1333 1
+65 1334 1
+65 1335 1
+65 1381 1
+65 1382 1
+65 1383 1
+65 1384 1
+65 1385 1
+65 1396 1
+65 1397 1
+65 1398 1
+65 1399 1
+65 1400 1
+65 1401 1
+65 1402 1
+65 1403 1
+65 1404 1
+65 1405 1
+65 1451 1
+65 1452 1
+65 1453 1
+65 1454 1
+65 1455 1
+65 1456 1
+65 1457 1
+65 1458 1
+65 1459 1
+65 1460 1
+65 1471 1
+65 1472 1
+65 1473 1
+65 1474 1
+65 1475 1
+65 1476 1
+65 1477 1
+65 1478 1
+65 1479 1
+65 1480 1
+65 1507 1
+65 1508 1
+65 1509 1
+65 1510 1
+65 1511 1
+65 1522 1
+65 1523 1
+65 1524 1
+65 1525 1
+65 1526 1
+65 1527 1
+65 1528 1
+65 1529 1
+65 1530 1
+65 1531 1
+65 1577 1
+65 1578 1
+65 1579 1
+65 1580 1
+65 1581 1
+65 1582 1
+65 1583 1
+65 1584 1
+65 1585 1
+65 1586 1
+65 1597 1
+65 1598 1
+65 1599 1
+65 1600 1
+65 1601 1
+65 1602 1
+65 1603 1
+65 1604 1
+65 1605 1
+65 1606 1
+65 1633 1
+65 1634 1
+65 1635 1
+65 1636 1
+65 1637 1
+65 1638 1
+65 1639 1
+65 1640 1
+65 1641 1
+65 1642 1
+65 1653 1
+65 1654 1
+65 1655 1
+65 1656 1
+65 1657 1
+65 1658 1
+65 1659 1
+65 1660 1
+65 1661 1
+65 1662 1
+65 1689 1
+65 1690 1
+65 1691 1
+65 1692 1
+65 1693 1
+65 1694 1
+65 1695 1
+65 1696 1
+65 1697 1
+65 1698 1
+65 1704 1
+65 1705 1
+65 1706 1
+65 1707 1
+65 1708 1
+65 1718 1
+65 1745 1
+65 1751 1
+65 1752 1
+65 1753 1
+65 1754 1
+65 1755 1
+65 1801 1
+65 1807 1
+65 1808 1
+65 1809 1
+65 1810 1
+65 1811 1
+65 1857 1
+65 1858 1
+65 1859 1
+65 1860 1
+65 1861 1
+65 1872 1
+65 1873 1
+65 1874 1
+65 1875 1
+65 1876 1
+65 1877 1
+65 1878 1
+65 1879 1
+65 1880 1
+65 1881 1
+65 1927 1
+65 1933 1
+65 1934 1
+65 1935 1
+65 1936 1
+65 1937 1
+65 1983 1
+65 1984 1
+65 1985 1
+65 1986 1
+65 1987 1
+65 1998 1
+65 1999 1
+65 2000 1
+65 2001 1
+65 2002 1
+65 2003 1
+65 2004 1
+65 2005 1
+65 2006 1
+65 2007 1
+65 2053 1
+65 2054 1
+65 2055 1
+65 2056 1
+65 2057 1
+65 2068 1
+65 2069 1
+65 2070 1
+65 2071 1
+65 2072 1
+65 2073 1
+65 2074 1
+65 2075 1
+65 2076 1
+65 2077 1
+65 2123 1
+65 2124 1
+65 2125 1
+65 2126 1
+65 2127 1
+65 2128 1
+65 2129 1
+65 2130 1
+65 2131 1
+65 2132 1
+65 2143 1
+65 2144 1
+65 2145 1
+65 2146 1
+65 2147 1
+65 2148 1
+65 2149 1
+65 2150 1
+65 2151 1
+65 2152 1
+65 2179 1
+65 2185 1
+65 2186 1
+65 2187 1
+65 2188 1
+65 2189 1
+65 2235 1
+65 2236 1
+65 2237 1
+65 2238 1
+65 2239 1
+65 2250 1
+65 2251 1
+65 2252 1
+65 2253 1
+65 2254 1
+65 2255 1
+65 2256 1
+65 2257 1
+65 2258 1
+65 2259 1
+65 2305 1
+65 2306 1
+65 2307 1
+65 2308 1
+65 2309 1
+65 2320 1
+65 2321 1
+65 2322 1
+65 2323 1
+65 2324 1
+65 2325 1
+65 2326 1
+65 2327 1
+65 2328 1
+65 2329 1
+65 2375 1
+65 2376 1
+65 2377 1
+65 2378 1
+65 2379 1
+65 2380 1
+65 2381 1
+65 2382 1
+65 2383 1
+65 2384 1
+65 2395 1
+65 2396 1
+65 2397 1
+65 2398 1
+65 2399 1
+65 2400 1
+65 2401 1
+65 2402 1
+65 2403 1
+65 2404 1
+65 2431 1
+65 2432 1
+65 2433 1
+65 2434 1
+65 2435 1
+65 2446 1
+65 2447 1
+65 2448 1
+65 2449 1
+65 2450 1
+65 2451 1
+65 2452 1
+65 2453 1
+65 2454 1
+65 2455 1
+65 2501 1
+65 2502 1
+65 2503 1
+65 2504 1
+65 2505 1
+65 2506 1
+65 2507 1
+65 2508 1
+65 2509 1
+65 2510 1
+65 2521 1
+65 2522 1
+65 2523 1
+65 2524 1
+65 2525 1
+65 2526 1
+65 2527 1
+65 2528 1
+65 2529 1
+65 2530 1
+65 2557 1
+65 2558 1
+65 2559 1
+65 2560 1
+65 2561 1
+65 2562 1
+65 2563 1
+65 2564 1
+65 2565 1
+65 2566 1
+65 2577 1
+65 2578 1
+65 2579 1
+65 2580 1
+65 2581 1
+65 2582 1
+65 2583 1
+65 2584 1
+65 2585 1
+65 2586 1
+65 2613 1
+65 2614 1
+65 2615 1
+65 2616 1
+65 2617 1
+65 2618 1
+65 2619 1
+65 2620 1
+65 2621 1
+65 2622 1
+65 2628 1
+65 2629 1
+65 2630 1
+65 2631 1
+65 2632 1
+65 2641 1
+65 2647 1
+65 2648 1
+65 2649 1
+65 2650 1
+65 2651 1
+65 2697 1
+65 2698 1
+65 2699 1
+65 2700 1
+65 2701 1
+65 2712 1
+65 2713 1
+65 2714 1
+65 2715 1
+65 2716 1
+65 2717 1
+65 2718 1
+65 2719 1
+65 2720 1
+65 2721 1
+65 2767 1
+65 2768 1
+65 2769 1
+65 2770 1
+65 2771 1
+65 2782 1
+65 2783 1
+65 2784 1
+65 2785 1
+65 2786 1
+65 2787 1
+65 2788 1
+65 2789 1
+65 2790 1
+65 2791 1
+65 2837 1
+65 2838 1
+65 2839 1
+65 2840 1
+65 2841 1
+65 2842 1
+65 2843 1
+65 2844 1
+65 2845 1
+65 2846 1
+65 2857 1
+65 2858 1
+65 2859 1
+65 2860 1
+65 2861 1
+65 2862 1
+65 2863 1
+65 2864 1
+65 2865 1
+65 2866 1
+65 2893 1
+65 2894 1
+65 2895 1
+65 2896 1
+65 2897 1
+65 2908 1
+65 2909 1
+65 2910 1
+65 2911 1
+65 2912 1
+65 2913 1
+65 2914 1
+65 2915 1
+65 2916 1
+65 2917 1
+65 2963 1
+65 2964 1
+65 2965 1
+65 2966 1
+65 2967 1
+65 2968 1
+65 2969 1
+65 2970 1
+65 2971 1
+65 2972 1
+65 2983 1
+65 2984 1
+65 2985 1
+65 2986 1
+65 2987 1
+65 2988 1
+65 2989 1
+65 2990 1
+65 2991 1
+65 2992 1
+65 3019 1
+65 3020 1
+65 3021 1
+65 3022 1
+65 3023 1
+65 3024 1
+65 3025 1
+65 3026 1
+65 3027 1
+65 3028 1
+65 3039 1
+65 3040 1
+65 3041 1
+65 3042 1
+65 3043 1
+65 3044 1
+65 3045 1
+65 3046 1
+65 3047 1
+65 3048 1
+65 3075 1
+65 3076 1
+65 3077 1
+65 3078 1
+65 3079 1
+65 3080 1
+65 3081 1
+65 3082 1
+65 3083 1
+65 3084 1
+65 3090 1
+65 3091 1
+65 3092 1
+65 3093 1
+65 3094 1
+65 3103 1
+65 3104 1
+65 3105 1
+65 3106 1
+65 3107 1
+65 3118 1
+65 3119 1
+65 3120 1
+65 3121 1
+65 3122 1
+65 3123 1
+65 3124 1
+65 3125 1
+65 3126 1
+65 3127 1
+65 3173 1
+65 3174 1
+65 3175 1
+65 3176 1
+65 3177 1
+65 3178 1
+65 3179 1
+65 3180 1
+65 3181 1
+65 3182 1
+65 3193 1
+65 3194 1
+65 3195 1
+65 3196 1
+65 3197 1
+65 3198 1
+65 3199 1
+65 3200 1
+65 3201 1
+65 3202 1
+65 3229 1
+65 3230 1
+65 3231 1
+65 3232 1
+65 3233 1
+65 3234 1
+65 3235 1
+65 3236 1
+65 3237 1
+65 3238 1
+65 3249 1
+65 3250 1
+65 3251 1
+65 3252 1
+65 3253 1
+65 3254 1
+65 3255 1
+65 3256 1
+65 3257 1
+65 3258 1
+65 3285 1
+65 3286 1
+65 3287 1
+65 3288 1
+65 3289 1
+65 3290 1
+65 3291 1
+65 3292 1
+65 3293 1
+65 3294 1
+65 3300 1
+65 3301 1
+65 3302 1
+65 3303 1
+65 3304 1
+65 3313 1
+65 3314 1
+65 3315 1
+65 3316 1
+65 3317 1
+65 3318 1
+65 3319 1
+65 3320 1
+65 3321 1
+65 3322 1
+65 3333 1
+65 3334 1
+65 3335 1
+65 3336 1
+65 3337 1
+65 3338 1
+65 3339 1
+65 3340 1
+65 3341 1
+65 3342 1
+65 3369 1
+65 3370 1
+65 3371 1
+65 3372 1
+65 3373 1
+65 3374 1
+65 3375 1
+65 3376 1
+65 3377 1
+65 3378 1
+65 3384 1
+65 3385 1
+65 3386 1
+65 3387 1
+65 3388 1
+65 3397 1
+65 3398 1
+65 3399 1
+65 3400 1
+65 3401 1
+65 3402 1
+65 3403 1
+65 3404 1
+65 3405 1
+65 3406 1
+65 3412 1
+65 3413 1
+65 3414 1
+65 3415 1
+65 3416 1
+65 3425 1
+65 3426 1
+65 3427 1
+65 3428 1
+65 3429 1
+65 3431 1
+66 11 1
+66 39 1
+66 66 1
+66 71 1
+66 76 1
+66 77 1
+66 78 1
+66 79 1
+66 123 1
+66 150 1
+66 155 1
+66 160 1
+66 161 1
+66 162 1
+66 163 1
+66 206 1
+66 211 1
+66 216 1
+66 217 1
+66 218 1
+66 219 1
+66 261 1
+66 266 1
+66 267 1
+66 268 1
+66 269 1
+66 276 1
+66 277 1
+66 278 1
+66 279 1
+66 286 1
+66 287 1
+66 288 1
+66 289 1
+66 290 1
+66 291 1
+66 333 1
+66 360 1
+66 365 1
+66 370 1
+66 371 1
+66 372 1
+66 373 1
+66 416 1
+66 421 1
+66 426 1
+66 427 1
+66 428 1
+66 429 1
+66 471 1
+66 476 1
+66 477 1
+66 478 1
+66 479 1
+66 486 1
+66 487 1
+66 488 1
+66 489 1
+66 496 1
+66 497 1
+66 498 1
+66 499 1
+66 500 1
+66 501 1
+66 542 1
+66 547 1
+66 552 1
+66 553 1
+66 554 1
+66 555 1
+66 597 1
+66 602 1
+66 603 1
+66 604 1
+66 605 1
+66 612 1
+66 613 1
+66 614 1
+66 615 1
+66 622 1
+66 623 1
+66 624 1
+66 625 1
+66 626 1
+66 627 1
+66 667 1
+66 672 1
+66 673 1
+66 674 1
+66 675 1
+66 682 1
+66 683 1
+66 684 1
+66 685 1
+66 692 1
+66 693 1
+66 694 1
+66 695 1
+66 696 1
+66 697 1
+66 737 1
+66 738 1
+66 739 1
+66 740 1
+66 747 1
+66 748 1
+66 749 1
+66 750 1
+66 751 1
+66 752 1
+66 757 1
+66 758 1
+66 759 1
+66 760 1
+66 761 1
+66 762 1
+66 767 1
+66 768 1
+66 769 1
+66 770 1
+66 795 1
+66 822 1
+66 827 1
+66 832 1
+66 833 1
+66 834 1
+66 835 1
+66 878 1
+66 883 1
+66 888 1
+66 889 1
+66 890 1
+66 891 1
+66 933 1
+66 938 1
+66 939 1
+66 940 1
+66 941 1
+66 948 1
+66 949 1
+66 950 1
+66 951 1
+66 958 1
+66 959 1
+66 960 1
+66 961 1
+66 962 1
+66 963 1
+66 1004 1
+66 1009 1
+66 1014 1
+66 1015 1
+66 1016 1
+66 1017 1
+66 1059 1
+66 1064 1
+66 1065 1
+66 1066 1
+66 1067 1
+66 1074 1
+66 1075 1
+66 1076 1
+66 1077 1
+66 1084 1
+66 1085 1
+66 1086 1
+66 1087 1
+66 1088 1
+66 1089 1
+66 1129 1
+66 1134 1
+66 1135 1
+66 1136 1
+66 1137 1
+66 1144 1
+66 1145 1
+66 1146 1
+66 1147 1
+66 1154 1
+66 1155 1
+66 1156 1
+66 1157 1
+66 1158 1
+66 1159 1
+66 1199 1
+66 1200 1
+66 1201 1
+66 1202 1
+66 1209 1
+66 1210 1
+66 1211 1
+66 1212 1
+66 1213 1
+66 1214 1
+66 1219 1
+66 1220 1
+66 1221 1
+66 1222 1
+66 1223 1
+66 1224 1
+66 1229 1
+66 1230 1
+66 1231 1
+66 1232 1
+66 1256 1
+66 1261 1
+66 1266 1
+66 1267 1
+66 1268 1
+66 1269 1
+66 1311 1
+66 1316 1
+66 1317 1
+66 1318 1
+66 1319 1
+66 1326 1
+66 1327 1
+66 1328 1
+66 1329 1
+66 1336 1
+66 1337 1
+66 1338 1
+66 1339 1
+66 1340 1
+66 1341 1
+66 1381 1
+66 1386 1
+66 1387 1
+66 1388 1
+66 1389 1
+66 1396 1
+66 1397 1
+66 1398 1
+66 1399 1
+66 1406 1
+66 1407 1
+66 1408 1
+66 1409 1
+66 1410 1
+66 1411 1
+66 1451 1
+66 1452 1
+66 1453 1
+66 1454 1
+66 1461 1
+66 1462 1
+66 1463 1
+66 1464 1
+66 1465 1
+66 1466 1
+66 1471 1
+66 1472 1
+66 1473 1
+66 1474 1
+66 1475 1
+66 1476 1
+66 1481 1
+66 1482 1
+66 1483 1
+66 1484 1
+66 1507 1
+66 1512 1
+66 1513 1
+66 1514 1
+66 1515 1
+66 1522 1
+66 1523 1
+66 1524 1
+66 1525 1
+66 1532 1
+66 1533 1
+66 1534 1
+66 1535 1
+66 1536 1
+66 1537 1
+66 1577 1
+66 1578 1
+66 1579 1
+66 1580 1
+66 1587 1
+66 1588 1
+66 1589 1
+66 1590 1
+66 1591 1
+66 1592 1
+66 1597 1
+66 1598 1
+66 1599 1
+66 1600 1
+66 1601 1
+66 1602 1
+66 1607 1
+66 1608 1
+66 1609 1
+66 1610 1
+66 1633 1
+66 1634 1
+66 1635 1
+66 1636 1
+66 1643 1
+66 1644 1
+66 1645 1
+66 1646 1
+66 1647 1
+66 1648 1
+66 1653 1
+66 1654 1
+66 1655 1
+66 1656 1
+66 1657 1
+66 1658 1
+66 1663 1
+66 1664 1
+66 1665 1
+66 1666 1
+66 1689 1
+66 1690 1
+66 1691 1
+66 1692 1
+66 1693 1
+66 1694 1
+66 1699 1
+66 1700 1
+66 1701 1
+66 1702 1
+66 1704 1
+66 1705 1
+66 1706 1
+66 1707 1
+66 1709 1
+66 1719 1
+66 1746 1
+66 1751 1
+66 1756 1
+66 1757 1
+66 1758 1
+66 1759 1
+66 1802 1
+66 1807 1
+66 1812 1
+66 1813 1
+66 1814 1
+66 1815 1
+66 1857 1
+66 1862 1
+66 1863 1
+66 1864 1
+66 1865 1
+66 1872 1
+66 1873 1
+66 1874 1
+66 1875 1
+66 1882 1
+66 1883 1
+66 1884 1
+66 1885 1
+66 1886 1
+66 1887 1
+66 1928 1
+66 1933 1
+66 1938 1
+66 1939 1
+66 1940 1
+66 1941 1
+66 1983 1
+66 1988 1
+66 1989 1
+66 1990 1
+66 1991 1
+66 1998 1
+66 1999 1
+66 2000 1
+66 2001 1
+66 2008 1
+66 2009 1
+66 2010 1
+66 2011 1
+66 2012 1
+66 2013 1
+66 2053 1
+66 2058 1
+66 2059 1
+66 2060 1
+66 2061 1
+66 2068 1
+66 2069 1
+66 2070 1
+66 2071 1
+66 2078 1
+66 2079 1
+66 2080 1
+66 2081 1
+66 2082 1
+66 2083 1
+66 2123 1
+66 2124 1
+66 2125 1
+66 2126 1
+66 2133 1
+66 2134 1
+66 2135 1
+66 2136 1
+66 2137 1
+66 2138 1
+66 2143 1
+66 2144 1
+66 2145 1
+66 2146 1
+66 2147 1
+66 2148 1
+66 2153 1
+66 2154 1
+66 2155 1
+66 2156 1
+66 2180 1
+66 2185 1
+66 2190 1
+66 2191 1
+66 2192 1
+66 2193 1
+66 2235 1
+66 2240 1
+66 2241 1
+66 2242 1
+66 2243 1
+66 2250 1
+66 2251 1
+66 2252 1
+66 2253 1
+66 2260 1
+66 2261 1
+66 2262 1
+66 2263 1
+66 2264 1
+66 2265 1
+66 2305 1
+66 2310 1
+66 2311 1
+66 2312 1
+66 2313 1
+66 2320 1
+66 2321 1
+66 2322 1
+66 2323 1
+66 2330 1
+66 2331 1
+66 2332 1
+66 2333 1
+66 2334 1
+66 2335 1
+66 2375 1
+66 2376 1
+66 2377 1
+66 2378 1
+66 2385 1
+66 2386 1
+66 2387 1
+66 2388 1
+66 2389 1
+66 2390 1
+66 2395 1
+66 2396 1
+66 2397 1
+66 2398 1
+66 2399 1
+66 2400 1
+66 2405 1
+66 2406 1
+66 2407 1
+66 2408 1
+66 2431 1
+66 2436 1
+66 2437 1
+66 2438 1
+66 2439 1
+66 2446 1
+66 2447 1
+66 2448 1
+66 2449 1
+66 2456 1
+66 2457 1
+66 2458 1
+66 2459 1
+66 2460 1
+66 2461 1
+66 2501 1
+66 2502 1
+66 2503 1
+66 2504 1
+66 2511 1
+66 2512 1
+66 2513 1
+66 2514 1
+66 2515 1
+66 2516 1
+66 2521 1
+66 2522 1
+66 2523 1
+66 2524 1
+66 2525 1
+66 2526 1
+66 2531 1
+66 2532 1
+66 2533 1
+66 2534 1
+66 2557 1
+66 2558 1
+66 2559 1
+66 2560 1
+66 2567 1
+66 2568 1
+66 2569 1
+66 2570 1
+66 2571 1
+66 2572 1
+66 2577 1
+66 2578 1
+66 2579 1
+66 2580 1
+66 2581 1
+66 2582 1
+66 2587 1
+66 2588 1
+66 2589 1
+66 2590 1
+66 2613 1
+66 2614 1
+66 2615 1
+66 2616 1
+66 2617 1
+66 2618 1
+66 2623 1
+66 2624 1
+66 2625 1
+66 2626 1
+66 2628 1
+66 2629 1
+66 2630 1
+66 2631 1
+66 2633 1
+66 2642 1
+66 2647 1
+66 2652 1
+66 2653 1
+66 2654 1
+66 2655 1
+66 2697 1
+66 2702 1
+66 2703 1
+66 2704 1
+66 2705 1
+66 2712 1
+66 2713 1
+66 2714 1
+66 2715 1
+66 2722 1
+66 2723 1
+66 2724 1
+66 2725 1
+66 2726 1
+66 2727 1
+66 2767 1
+66 2772 1
+66 2773 1
+66 2774 1
+66 2775 1
+66 2782 1
+66 2783 1
+66 2784 1
+66 2785 1
+66 2792 1
+66 2793 1
+66 2794 1
+66 2795 1
+66 2796 1
+66 2797 1
+66 2837 1
+66 2838 1
+66 2839 1
+66 2840 1
+66 2847 1
+66 2848 1
+66 2849 1
+66 2850 1
+66 2851 1
+66 2852 1
+66 2857 1
+66 2858 1
+66 2859 1
+66 2860 1
+66 2861 1
+66 2862 1
+66 2867 1
+66 2868 1
+66 2869 1
+66 2870 1
+66 2893 1
+66 2898 1
+66 2899 1
+66 2900 1
+66 2901 1
+66 2908 1
+66 2909 1
+66 2910 1
+66 2911 1
+66 2918 1
+66 2919 1
+66 2920 1
+66 2921 1
+66 2922 1
+66 2923 1
+66 2963 1
+66 2964 1
+66 2965 1
+66 2966 1
+66 2973 1
+66 2974 1
+66 2975 1
+66 2976 1
+66 2977 1
+66 2978 1
+66 2983 1
+66 2984 1
+66 2985 1
+66 2986 1
+66 2987 1
+66 2988 1
+66 2993 1
+66 2994 1
+66 2995 1
+66 2996 1
+66 3019 1
+66 3020 1
+66 3021 1
+66 3022 1
+66 3029 1
+66 3030 1
+66 3031 1
+66 3032 1
+66 3033 1
+66 3034 1
+66 3039 1
+66 3040 1
+66 3041 1
+66 3042 1
+66 3043 1
+66 3044 1
+66 3049 1
+66 3050 1
+66 3051 1
+66 3052 1
+66 3075 1
+66 3076 1
+66 3077 1
+66 3078 1
+66 3079 1
+66 3080 1
+66 3085 1
+66 3086 1
+66 3087 1
+66 3088 1
+66 3090 1
+66 3091 1
+66 3092 1
+66 3093 1
+66 3095 1
+66 3103 1
+66 3108 1
+66 3109 1
+66 3110 1
+66 3111 1
+66 3118 1
+66 3119 1
+66 3120 1
+66 3121 1
+66 3128 1
+66 3129 1
+66 3130 1
+66 3131 1
+66 3132 1
+66 3133 1
+66 3173 1
+66 3174 1
+66 3175 1
+66 3176 1
+66 3183 1
+66 3184 1
+66 3185 1
+66 3186 1
+66 3187 1
+66 3188 1
+66 3193 1
+66 3194 1
+66 3195 1
+66 3196 1
+66 3197 1
+66 3198 1
+66 3203 1
+66 3204 1
+66 3205 1
+66 3206 1
+66 3229 1
+66 3230 1
+66 3231 1
+66 3232 1
+66 3239 1
+66 3240 1
+66 3241 1
+66 3242 1
+66 3243 1
+66 3244 1
+66 3249 1
+66 3250 1
+66 3251 1
+66 3252 1
+66 3253 1
+66 3254 1
+66 3259 1
+66 3260 1
+66 3261 1
+66 3262 1
+66 3285 1
+66 3286 1
+66 3287 1
+66 3288 1
+66 3289 1
+66 3290 1
+66 3295 1
+66 3296 1
+66 3297 1
+66 3298 1
+66 3300 1
+66 3301 1
+66 3302 1
+66 3303 1
+66 3305 1
+66 3313 1
+66 3314 1
+66 3315 1
+66 3316 1
+66 3323 1
+66 3324 1
+66 3325 1
+66 3326 1
+66 3327 1
+66 3328 1
+66 3333 1
+66 3334 1
+66 3335 1
+66 3336 1
+66 3337 1
+66 3338 1
+66 3343 1
+66 3344 1
+66 3345 1
+66 3346 1
+66 3369 1
+66 3370 1
+66 3371 1
+66 3372 1
+66 3373 1
+66 3374 1
+66 3379 1
+66 3380 1
+66 3381 1
+66 3382 1
+66 3384 1
+66 3385 1
+66 3386 1
+66 3387 1
+66 3389 1
+66 3397 1
+66 3398 1
+66 3399 1
+66 3400 1
+66 3401 1
+66 3402 1
+66 3407 1
+66 3408 1
+66 3409 1
+66 3410 1
+66 3412 1
+66 3413 1
+66 3414 1
+66 3415 1
+66 3417 1
+66 3425 1
+66 3426 1
+66 3427 1
+66 3428 1
+66 3430 1
+66 3431 1
+67 12 1
+67 40 1
+67 67 1
+67 72 1
+67 76 1
+67 80 1
+67 81 1
+67 82 1
+67 124 1
+67 151 1
+67 156 1
+67 160 1
+67 164 1
+67 165 1
+67 166 1
+67 207 1
+67 212 1
+67 216 1
+67 220 1
+67 221 1
+67 222 1
+67 262 1
+67 266 1
+67 270 1
+67 271 1
+67 272 1
+67 276 1
+67 280 1
+67 281 1
+67 282 1
+67 286 1
+67 287 1
+67 288 1
+67 292 1
+67 293 1
+67 294 1
+67 334 1
+67 361 1
+67 366 1
+67 370 1
+67 374 1
+67 375 1
+67 376 1
+67 417 1
+67 422 1
+67 426 1
+67 430 1
+67 431 1
+67 432 1
+67 472 1
+67 476 1
+67 480 1
+67 481 1
+67 482 1
+67 486 1
+67 490 1
+67 491 1
+67 492 1
+67 496 1
+67 497 1
+67 498 1
+67 502 1
+67 503 1
+67 504 1
+67 543 1
+67 548 1
+67 552 1
+67 556 1
+67 557 1
+67 558 1
+67 598 1
+67 602 1
+67 606 1
+67 607 1
+67 608 1
+67 612 1
+67 616 1
+67 617 1
+67 618 1
+67 622 1
+67 623 1
+67 624 1
+67 628 1
+67 629 1
+67 630 1
+67 668 1
+67 672 1
+67 676 1
+67 677 1
+67 678 1
+67 682 1
+67 686 1
+67 687 1
+67 688 1
+67 692 1
+67 693 1
+67 694 1
+67 698 1
+67 699 1
+67 700 1
+67 737 1
+67 741 1
+67 742 1
+67 743 1
+67 747 1
+67 748 1
+67 749 1
+67 753 1
+67 754 1
+67 755 1
+67 757 1
+67 758 1
+67 759 1
+67 763 1
+67 764 1
+67 765 1
+67 767 1
+67 768 1
+67 769 1
+67 771 1
+67 796 1
+67 823 1
+67 828 1
+67 832 1
+67 836 1
+67 837 1
+67 838 1
+67 879 1
+67 884 1
+67 888 1
+67 892 1
+67 893 1
+67 894 1
+67 934 1
+67 938 1
+67 942 1
+67 943 1
+67 944 1
+67 948 1
+67 952 1
+67 953 1
+67 954 1
+67 958 1
+67 959 1
+67 960 1
+67 964 1
+67 965 1
+67 966 1
+67 1005 1
+67 1010 1
+67 1014 1
+67 1018 1
+67 1019 1
+67 1020 1
+67 1060 1
+67 1064 1
+67 1068 1
+67 1069 1
+67 1070 1
+67 1074 1
+67 1078 1
+67 1079 1
+67 1080 1
+67 1084 1
+67 1085 1
+67 1086 1
+67 1090 1
+67 1091 1
+67 1092 1
+67 1130 1
+67 1134 1
+67 1138 1
+67 1139 1
+67 1140 1
+67 1144 1
+67 1148 1
+67 1149 1
+67 1150 1
+67 1154 1
+67 1155 1
+67 1156 1
+67 1160 1
+67 1161 1
+67 1162 1
+67 1199 1
+67 1203 1
+67 1204 1
+67 1205 1
+67 1209 1
+67 1210 1
+67 1211 1
+67 1215 1
+67 1216 1
+67 1217 1
+67 1219 1
+67 1220 1
+67 1221 1
+67 1225 1
+67 1226 1
+67 1227 1
+67 1229 1
+67 1230 1
+67 1231 1
+67 1233 1
+67 1257 1
+67 1262 1
+67 1266 1
+67 1270 1
+67 1271 1
+67 1272 1
+67 1312 1
+67 1316 1
+67 1320 1
+67 1321 1
+67 1322 1
+67 1326 1
+67 1330 1
+67 1331 1
+67 1332 1
+67 1336 1
+67 1337 1
+67 1338 1
+67 1342 1
+67 1343 1
+67 1344 1
+67 1382 1
+67 1386 1
+67 1390 1
+67 1391 1
+67 1392 1
+67 1396 1
+67 1400 1
+67 1401 1
+67 1402 1
+67 1406 1
+67 1407 1
+67 1408 1
+67 1412 1
+67 1413 1
+67 1414 1
+67 1451 1
+67 1455 1
+67 1456 1
+67 1457 1
+67 1461 1
+67 1462 1
+67 1463 1
+67 1467 1
+67 1468 1
+67 1469 1
+67 1471 1
+67 1472 1
+67 1473 1
+67 1477 1
+67 1478 1
+67 1479 1
+67 1481 1
+67 1482 1
+67 1483 1
+67 1485 1
+67 1508 1
+67 1512 1
+67 1516 1
+67 1517 1
+67 1518 1
+67 1522 1
+67 1526 1
+67 1527 1
+67 1528 1
+67 1532 1
+67 1533 1
+67 1534 1
+67 1538 1
+67 1539 1
+67 1540 1
+67 1577 1
+67 1581 1
+67 1582 1
+67 1583 1
+67 1587 1
+67 1588 1
+67 1589 1
+67 1593 1
+67 1594 1
+67 1595 1
+67 1597 1
+67 1598 1
+67 1599 1
+67 1603 1
+67 1604 1
+67 1605 1
+67 1607 1
+67 1608 1
+67 1609 1
+67 1611 1
+67 1633 1
+67 1637 1
+67 1638 1
+67 1639 1
+67 1643 1
+67 1644 1
+67 1645 1
+67 1649 1
+67 1650 1
+67 1651 1
+67 1653 1
+67 1654 1
+67 1655 1
+67 1659 1
+67 1660 1
+67 1661 1
+67 1663 1
+67 1664 1
+67 1665 1
+67 1667 1
+67 1689 1
+67 1690 1
+67 1691 1
+67 1695 1
+67 1696 1
+67 1697 1
+67 1699 1
+67 1700 1
+67 1701 1
+67 1703 1
+67 1704 1
+67 1705 1
+67 1706 1
+67 1708 1
+67 1709 1
+67 1720 1
+67 1747 1
+67 1752 1
+67 1756 1
+67 1760 1
+67 1761 1
+67 1762 1
+67 1803 1
+67 1808 1
+67 1812 1
+67 1816 1
+67 1817 1
+67 1818 1
+67 1858 1
+67 1862 1
+67 1866 1
+67 1867 1
+67 1868 1
+67 1872 1
+67 1876 1
+67 1877 1
+67 1878 1
+67 1882 1
+67 1883 1
+67 1884 1
+67 1888 1
+67 1889 1
+67 1890 1
+67 1929 1
+67 1934 1
+67 1938 1
+67 1942 1
+67 1943 1
+67 1944 1
+67 1984 1
+67 1988 1
+67 1992 1
+67 1993 1
+67 1994 1
+67 1998 1
+67 2002 1
+67 2003 1
+67 2004 1
+67 2008 1
+67 2009 1
+67 2010 1
+67 2014 1
+67 2015 1
+67 2016 1
+67 2054 1
+67 2058 1
+67 2062 1
+67 2063 1
+67 2064 1
+67 2068 1
+67 2072 1
+67 2073 1
+67 2074 1
+67 2078 1
+67 2079 1
+67 2080 1
+67 2084 1
+67 2085 1
+67 2086 1
+67 2123 1
+67 2127 1
+67 2128 1
+67 2129 1
+67 2133 1
+67 2134 1
+67 2135 1
+67 2139 1
+67 2140 1
+67 2141 1
+67 2143 1
+67 2144 1
+67 2145 1
+67 2149 1
+67 2150 1
+67 2151 1
+67 2153 1
+67 2154 1
+67 2155 1
+67 2157 1
+67 2181 1
+67 2186 1
+67 2190 1
+67 2194 1
+67 2195 1
+67 2196 1
+67 2236 1
+67 2240 1
+67 2244 1
+67 2245 1
+67 2246 1
+67 2250 1
+67 2254 1
+67 2255 1
+67 2256 1
+67 2260 1
+67 2261 1
+67 2262 1
+67 2266 1
+67 2267 1
+67 2268 1
+67 2306 1
+67 2310 1
+67 2314 1
+67 2315 1
+67 2316 1
+67 2320 1
+67 2324 1
+67 2325 1
+67 2326 1
+67 2330 1
+67 2331 1
+67 2332 1
+67 2336 1
+67 2337 1
+67 2338 1
+67 2375 1
+67 2379 1
+67 2380 1
+67 2381 1
+67 2385 1
+67 2386 1
+67 2387 1
+67 2391 1
+67 2392 1
+67 2393 1
+67 2395 1
+67 2396 1
+67 2397 1
+67 2401 1
+67 2402 1
+67 2403 1
+67 2405 1
+67 2406 1
+67 2407 1
+67 2409 1
+67 2432 1
+67 2436 1
+67 2440 1
+67 2441 1
+67 2442 1
+67 2446 1
+67 2450 1
+67 2451 1
+67 2452 1
+67 2456 1
+67 2457 1
+67 2458 1
+67 2462 1
+67 2463 1
+67 2464 1
+67 2501 1
+67 2505 1
+67 2506 1
+67 2507 1
+67 2511 1
+67 2512 1
+67 2513 1
+67 2517 1
+67 2518 1
+67 2519 1
+67 2521 1
+67 2522 1
+67 2523 1
+67 2527 1
+67 2528 1
+67 2529 1
+67 2531 1
+67 2532 1
+67 2533 1
+67 2535 1
+67 2557 1
+67 2561 1
+67 2562 1
+67 2563 1
+67 2567 1
+67 2568 1
+67 2569 1
+67 2573 1
+67 2574 1
+67 2575 1
+67 2577 1
+67 2578 1
+67 2579 1
+67 2583 1
+67 2584 1
+67 2585 1
+67 2587 1
+67 2588 1
+67 2589 1
+67 2591 1
+67 2613 1
+67 2614 1
+67 2615 1
+67 2619 1
+67 2620 1
+67 2621 1
+67 2623 1
+67 2624 1
+67 2625 1
+67 2627 1
+67 2628 1
+67 2629 1
+67 2630 1
+67 2632 1
+67 2633 1
+67 2643 1
+67 2648 1
+67 2652 1
+67 2656 1
+67 2657 1
+67 2658 1
+67 2698 1
+67 2702 1
+67 2706 1
+67 2707 1
+67 2708 1
+67 2712 1
+67 2716 1
+67 2717 1
+67 2718 1
+67 2722 1
+67 2723 1
+67 2724 1
+67 2728 1
+67 2729 1
+67 2730 1
+67 2768 1
+67 2772 1
+67 2776 1
+67 2777 1
+67 2778 1
+67 2782 1
+67 2786 1
+67 2787 1
+67 2788 1
+67 2792 1
+67 2793 1
+67 2794 1
+67 2798 1
+67 2799 1
+67 2800 1
+67 2837 1
+67 2841 1
+67 2842 1
+67 2843 1
+67 2847 1
+67 2848 1
+67 2849 1
+67 2853 1
+67 2854 1
+67 2855 1
+67 2857 1
+67 2858 1
+67 2859 1
+67 2863 1
+67 2864 1
+67 2865 1
+67 2867 1
+67 2868 1
+67 2869 1
+67 2871 1
+67 2894 1
+67 2898 1
+67 2902 1
+67 2903 1
+67 2904 1
+67 2908 1
+67 2912 1
+67 2913 1
+67 2914 1
+67 2918 1
+67 2919 1
+67 2920 1
+67 2924 1
+67 2925 1
+67 2926 1
+67 2963 1
+67 2967 1
+67 2968 1
+67 2969 1
+67 2973 1
+67 2974 1
+67 2975 1
+67 2979 1
+67 2980 1
+67 2981 1
+67 2983 1
+67 2984 1
+67 2985 1
+67 2989 1
+67 2990 1
+67 2991 1
+67 2993 1
+67 2994 1
+67 2995 1
+67 2997 1
+67 3019 1
+67 3023 1
+67 3024 1
+67 3025 1
+67 3029 1
+67 3030 1
+67 3031 1
+67 3035 1
+67 3036 1
+67 3037 1
+67 3039 1
+67 3040 1
+67 3041 1
+67 3045 1
+67 3046 1
+67 3047 1
+67 3049 1
+67 3050 1
+67 3051 1
+67 3053 1
+67 3075 1
+67 3076 1
+67 3077 1
+67 3081 1
+67 3082 1
+67 3083 1
+67 3085 1
+67 3086 1
+67 3087 1
+67 3089 1
+67 3090 1
+67 3091 1
+67 3092 1
+67 3094 1
+67 3095 1
+67 3104 1
+67 3108 1
+67 3112 1
+67 3113 1
+67 3114 1
+67 3118 1
+67 3122 1
+67 3123 1
+67 3124 1
+67 3128 1
+67 3129 1
+67 3130 1
+67 3134 1
+67 3135 1
+67 3136 1
+67 3173 1
+67 3177 1
+67 3178 1
+67 3179 1
+67 3183 1
+67 3184 1
+67 3185 1
+67 3189 1
+67 3190 1
+67 3191 1
+67 3193 1
+67 3194 1
+67 3195 1
+67 3199 1
+67 3200 1
+67 3201 1
+67 3203 1
+67 3204 1
+67 3205 1
+67 3207 1
+67 3229 1
+67 3233 1
+67 3234 1
+67 3235 1
+67 3239 1
+67 3240 1
+67 3241 1
+67 3245 1
+67 3246 1
+67 3247 1
+67 3249 1
+67 3250 1
+67 3251 1
+67 3255 1
+67 3256 1
+67 3257 1
+67 3259 1
+67 3260 1
+67 3261 1
+67 3263 1
+67 3285 1
+67 3286 1
+67 3287 1
+67 3291 1
+67 3292 1
+67 3293 1
+67 3295 1
+67 3296 1
+67 3297 1
+67 3299 1
+67 3300 1
+67 3301 1
+67 3302 1
+67 3304 1
+67 3305 1
+67 3313 1
+67 3317 1
+67 3318 1
+67 3319 1
+67 3323 1
+67 3324 1
+67 3325 1
+67 3329 1
+67 3330 1
+67 3331 1
+67 3333 1
+67 3334 1
+67 3335 1
+67 3339 1
+67 3340 1
+67 3341 1
+67 3343 1
+67 3344 1
+67 3345 1
+67 3347 1
+67 3369 1
+67 3370 1
+67 3371 1
+67 3375 1
+67 3376 1
+67 3377 1
+67 3379 1
+67 3380 1
+67 3381 1
+67 3383 1
+67 3384 1
+67 3385 1
+67 3386 1
+67 3388 1
+67 3389 1
+67 3397 1
+67 3398 1
+67 3399 1
+67 3403 1
+67 3404 1
+67 3405 1
+67 3407 1
+67 3408 1
+67 3409 1
+67 3411 1
+67 3412 1
+67 3413 1
+67 3414 1
+67 3416 1
+67 3417 1
+67 3425 1
+67 3426 1
+67 3427 1
+67 3429 1
+67 3430 1
+67 3431 1
+68 13 1
+68 41 1
+68 68 1
+68 73 1
+68 77 1
+68 80 1
+68 83 1
+68 84 1
+68 125 1
+68 152 1
+68 157 1
+68 161 1
+68 164 1
+68 167 1
+68 168 1
+68 208 1
+68 213 1
+68 217 1
+68 220 1
+68 223 1
+68 224 1
+68 263 1
+68 267 1
+68 270 1
+68 273 1
+68 274 1
+68 277 1
+68 280 1
+68 283 1
+68 284 1
+68 286 1
+68 289 1
+68 290 1
+68 292 1
+68 293 1
+68 295 1
+68 335 1
+68 362 1
+68 367 1
+68 371 1
+68 374 1
+68 377 1
+68 378 1
+68 418 1
+68 423 1
+68 427 1
+68 430 1
+68 433 1
+68 434 1
+68 473 1
+68 477 1
+68 480 1
+68 483 1
+68 484 1
+68 487 1
+68 490 1
+68 493 1
+68 494 1
+68 496 1
+68 499 1
+68 500 1
+68 502 1
+68 503 1
+68 505 1
+68 544 1
+68 549 1
+68 553 1
+68 556 1
+68 559 1
+68 560 1
+68 599 1
+68 603 1
+68 606 1
+68 609 1
+68 610 1
+68 613 1
+68 616 1
+68 619 1
+68 620 1
+68 622 1
+68 625 1
+68 626 1
+68 628 1
+68 629 1
+68 631 1
+68 669 1
+68 673 1
+68 676 1
+68 679 1
+68 680 1
+68 683 1
+68 686 1
+68 689 1
+68 690 1
+68 692 1
+68 695 1
+68 696 1
+68 698 1
+68 699 1
+68 701 1
+68 738 1
+68 741 1
+68 744 1
+68 745 1
+68 747 1
+68 750 1
+68 751 1
+68 753 1
+68 754 1
+68 756 1
+68 757 1
+68 760 1
+68 761 1
+68 763 1
+68 764 1
+68 766 1
+68 767 1
+68 768 1
+68 770 1
+68 771 1
+68 797 1
+68 824 1
+68 829 1
+68 833 1
+68 836 1
+68 839 1
+68 840 1
+68 880 1
+68 885 1
+68 889 1
+68 892 1
+68 895 1
+68 896 1
+68 935 1
+68 939 1
+68 942 1
+68 945 1
+68 946 1
+68 949 1
+68 952 1
+68 955 1
+68 956 1
+68 958 1
+68 961 1
+68 962 1
+68 964 1
+68 965 1
+68 967 1
+68 1006 1
+68 1011 1
+68 1015 1
+68 1018 1
+68 1021 1
+68 1022 1
+68 1061 1
+68 1065 1
+68 1068 1
+68 1071 1
+68 1072 1
+68 1075 1
+68 1078 1
+68 1081 1
+68 1082 1
+68 1084 1
+68 1087 1
+68 1088 1
+68 1090 1
+68 1091 1
+68 1093 1
+68 1131 1
+68 1135 1
+68 1138 1
+68 1141 1
+68 1142 1
+68 1145 1
+68 1148 1
+68 1151 1
+68 1152 1
+68 1154 1
+68 1157 1
+68 1158 1
+68 1160 1
+68 1161 1
+68 1163 1
+68 1200 1
+68 1203 1
+68 1206 1
+68 1207 1
+68 1209 1
+68 1212 1
+68 1213 1
+68 1215 1
+68 1216 1
+68 1218 1
+68 1219 1
+68 1222 1
+68 1223 1
+68 1225 1
+68 1226 1
+68 1228 1
+68 1229 1
+68 1230 1
+68 1232 1
+68 1233 1
+68 1258 1
+68 1263 1
+68 1267 1
+68 1270 1
+68 1273 1
+68 1274 1
+68 1313 1
+68 1317 1
+68 1320 1
+68 1323 1
+68 1324 1
+68 1327 1
+68 1330 1
+68 1333 1
+68 1334 1
+68 1336 1
+68 1339 1
+68 1340 1
+68 1342 1
+68 1343 1
+68 1345 1
+68 1383 1
+68 1387 1
+68 1390 1
+68 1393 1
+68 1394 1
+68 1397 1
+68 1400 1
+68 1403 1
+68 1404 1
+68 1406 1
+68 1409 1
+68 1410 1
+68 1412 1
+68 1413 1
+68 1415 1
+68 1452 1
+68 1455 1
+68 1458 1
+68 1459 1
+68 1461 1
+68 1464 1
+68 1465 1
+68 1467 1
+68 1468 1
+68 1470 1
+68 1471 1
+68 1474 1
+68 1475 1
+68 1477 1
+68 1478 1
+68 1480 1
+68 1481 1
+68 1482 1
+68 1484 1
+68 1485 1
+68 1509 1
+68 1513 1
+68 1516 1
+68 1519 1
+68 1520 1
+68 1523 1
+68 1526 1
+68 1529 1
+68 1530 1
+68 1532 1
+68 1535 1
+68 1536 1
+68 1538 1
+68 1539 1
+68 1541 1
+68 1578 1
+68 1581 1
+68 1584 1
+68 1585 1
+68 1587 1
+68 1590 1
+68 1591 1
+68 1593 1
+68 1594 1
+68 1596 1
+68 1597 1
+68 1600 1
+68 1601 1
+68 1603 1
+68 1604 1
+68 1606 1
+68 1607 1
+68 1608 1
+68 1610 1
+68 1611 1
+68 1634 1
+68 1637 1
+68 1640 1
+68 1641 1
+68 1643 1
+68 1646 1
+68 1647 1
+68 1649 1
+68 1650 1
+68 1652 1
+68 1653 1
+68 1656 1
+68 1657 1
+68 1659 1
+68 1660 1
+68 1662 1
+68 1663 1
+68 1664 1
+68 1666 1
+68 1667 1
+68 1689 1
+68 1692 1
+68 1693 1
+68 1695 1
+68 1696 1
+68 1698 1
+68 1699 1
+68 1700 1
+68 1702 1
+68 1703 1
+68 1704 1
+68 1705 1
+68 1707 1
+68 1708 1
+68 1709 1
+68 1721 1
+68 1748 1
+68 1753 1
+68 1757 1
+68 1760 1
+68 1763 1
+68 1764 1
+68 1804 1
+68 1809 1
+68 1813 1
+68 1816 1
+68 1819 1
+68 1820 1
+68 1859 1
+68 1863 1
+68 1866 1
+68 1869 1
+68 1870 1
+68 1873 1
+68 1876 1
+68 1879 1
+68 1880 1
+68 1882 1
+68 1885 1
+68 1886 1
+68 1888 1
+68 1889 1
+68 1891 1
+68 1930 1
+68 1935 1
+68 1939 1
+68 1942 1
+68 1945 1
+68 1946 1
+68 1985 1
+68 1989 1
+68 1992 1
+68 1995 1
+68 1996 1
+68 1999 1
+68 2002 1
+68 2005 1
+68 2006 1
+68 2008 1
+68 2011 1
+68 2012 1
+68 2014 1
+68 2015 1
+68 2017 1
+68 2055 1
+68 2059 1
+68 2062 1
+68 2065 1
+68 2066 1
+68 2069 1
+68 2072 1
+68 2075 1
+68 2076 1
+68 2078 1
+68 2081 1
+68 2082 1
+68 2084 1
+68 2085 1
+68 2087 1
+68 2124 1
+68 2127 1
+68 2130 1
+68 2131 1
+68 2133 1
+68 2136 1
+68 2137 1
+68 2139 1
+68 2140 1
+68 2142 1
+68 2143 1
+68 2146 1
+68 2147 1
+68 2149 1
+68 2150 1
+68 2152 1
+68 2153 1
+68 2154 1
+68 2156 1
+68 2157 1
+68 2182 1
+68 2187 1
+68 2191 1
+68 2194 1
+68 2197 1
+68 2198 1
+68 2237 1
+68 2241 1
+68 2244 1
+68 2247 1
+68 2248 1
+68 2251 1
+68 2254 1
+68 2257 1
+68 2258 1
+68 2260 1
+68 2263 1
+68 2264 1
+68 2266 1
+68 2267 1
+68 2269 1
+68 2307 1
+68 2311 1
+68 2314 1
+68 2317 1
+68 2318 1
+68 2321 1
+68 2324 1
+68 2327 1
+68 2328 1
+68 2330 1
+68 2333 1
+68 2334 1
+68 2336 1
+68 2337 1
+68 2339 1
+68 2376 1
+68 2379 1
+68 2382 1
+68 2383 1
+68 2385 1
+68 2388 1
+68 2389 1
+68 2391 1
+68 2392 1
+68 2394 1
+68 2395 1
+68 2398 1
+68 2399 1
+68 2401 1
+68 2402 1
+68 2404 1
+68 2405 1
+68 2406 1
+68 2408 1
+68 2409 1
+68 2433 1
+68 2437 1
+68 2440 1
+68 2443 1
+68 2444 1
+68 2447 1
+68 2450 1
+68 2453 1
+68 2454 1
+68 2456 1
+68 2459 1
+68 2460 1
+68 2462 1
+68 2463 1
+68 2465 1
+68 2502 1
+68 2505 1
+68 2508 1
+68 2509 1
+68 2511 1
+68 2514 1
+68 2515 1
+68 2517 1
+68 2518 1
+68 2520 1
+68 2521 1
+68 2524 1
+68 2525 1
+68 2527 1
+68 2528 1
+68 2530 1
+68 2531 1
+68 2532 1
+68 2534 1
+68 2535 1
+68 2558 1
+68 2561 1
+68 2564 1
+68 2565 1
+68 2567 1
+68 2570 1
+68 2571 1
+68 2573 1
+68 2574 1
+68 2576 1
+68 2577 1
+68 2580 1
+68 2581 1
+68 2583 1
+68 2584 1
+68 2586 1
+68 2587 1
+68 2588 1
+68 2590 1
+68 2591 1
+68 2613 1
+68 2616 1
+68 2617 1
+68 2619 1
+68 2620 1
+68 2622 1
+68 2623 1
+68 2624 1
+68 2626 1
+68 2627 1
+68 2628 1
+68 2629 1
+68 2631 1
+68 2632 1
+68 2633 1
+68 2644 1
+68 2649 1
+68 2653 1
+68 2656 1
+68 2659 1
+68 2660 1
+68 2699 1
+68 2703 1
+68 2706 1
+68 2709 1
+68 2710 1
+68 2713 1
+68 2716 1
+68 2719 1
+68 2720 1
+68 2722 1
+68 2725 1
+68 2726 1
+68 2728 1
+68 2729 1
+68 2731 1
+68 2769 1
+68 2773 1
+68 2776 1
+68 2779 1
+68 2780 1
+68 2783 1
+68 2786 1
+68 2789 1
+68 2790 1
+68 2792 1
+68 2795 1
+68 2796 1
+68 2798 1
+68 2799 1
+68 2801 1
+68 2838 1
+68 2841 1
+68 2844 1
+68 2845 1
+68 2847 1
+68 2850 1
+68 2851 1
+68 2853 1
+68 2854 1
+68 2856 1
+68 2857 1
+68 2860 1
+68 2861 1
+68 2863 1
+68 2864 1
+68 2866 1
+68 2867 1
+68 2868 1
+68 2870 1
+68 2871 1
+68 2895 1
+68 2899 1
+68 2902 1
+68 2905 1
+68 2906 1
+68 2909 1
+68 2912 1
+68 2915 1
+68 2916 1
+68 2918 1
+68 2921 1
+68 2922 1
+68 2924 1
+68 2925 1
+68 2927 1
+68 2964 1
+68 2967 1
+68 2970 1
+68 2971 1
+68 2973 1
+68 2976 1
+68 2977 1
+68 2979 1
+68 2980 1
+68 2982 1
+68 2983 1
+68 2986 1
+68 2987 1
+68 2989 1
+68 2990 1
+68 2992 1
+68 2993 1
+68 2994 1
+68 2996 1
+68 2997 1
+68 3020 1
+68 3023 1
+68 3026 1
+68 3027 1
+68 3029 1
+68 3032 1
+68 3033 1
+68 3035 1
+68 3036 1
+68 3038 1
+68 3039 1
+68 3042 1
+68 3043 1
+68 3045 1
+68 3046 1
+68 3048 1
+68 3049 1
+68 3050 1
+68 3052 1
+68 3053 1
+68 3075 1
+68 3078 1
+68 3079 1
+68 3081 1
+68 3082 1
+68 3084 1
+68 3085 1
+68 3086 1
+68 3088 1
+68 3089 1
+68 3090 1
+68 3091 1
+68 3093 1
+68 3094 1
+68 3095 1
+68 3105 1
+68 3109 1
+68 3112 1
+68 3115 1
+68 3116 1
+68 3119 1
+68 3122 1
+68 3125 1
+68 3126 1
+68 3128 1
+68 3131 1
+68 3132 1
+68 3134 1
+68 3135 1
+68 3137 1
+68 3174 1
+68 3177 1
+68 3180 1
+68 3181 1
+68 3183 1
+68 3186 1
+68 3187 1
+68 3189 1
+68 3190 1
+68 3192 1
+68 3193 1
+68 3196 1
+68 3197 1
+68 3199 1
+68 3200 1
+68 3202 1
+68 3203 1
+68 3204 1
+68 3206 1
+68 3207 1
+68 3230 1
+68 3233 1
+68 3236 1
+68 3237 1
+68 3239 1
+68 3242 1
+68 3243 1
+68 3245 1
+68 3246 1
+68 3248 1
+68 3249 1
+68 3252 1
+68 3253 1
+68 3255 1
+68 3256 1
+68 3258 1
+68 3259 1
+68 3260 1
+68 3262 1
+68 3263 1
+68 3285 1
+68 3288 1
+68 3289 1
+68 3291 1
+68 3292 1
+68 3294 1
+68 3295 1
+68 3296 1
+68 3298 1
+68 3299 1
+68 3300 1
+68 3301 1
+68 3303 1
+68 3304 1
+68 3305 1
+68 3314 1
+68 3317 1
+68 3320 1
+68 3321 1
+68 3323 1
+68 3326 1
+68 3327 1
+68 3329 1
+68 3330 1
+68 3332 1
+68 3333 1
+68 3336 1
+68 3337 1
+68 3339 1
+68 3340 1
+68 3342 1
+68 3343 1
+68 3344 1
+68 3346 1
+68 3347 1
+68 3369 1
+68 3372 1
+68 3373 1
+68 3375 1
+68 3376 1
+68 3378 1
+68 3379 1
+68 3380 1
+68 3382 1
+68 3383 1
+68 3384 1
+68 3385 1
+68 3387 1
+68 3388 1
+68 3389 1
+68 3397 1
+68 3400 1
+68 3401 1
+68 3403 1
+68 3404 1
+68 3406 1
+68 3407 1
+68 3408 1
+68 3410 1
+68 3411 1
+68 3412 1
+68 3413 1
+68 3415 1
+68 3416 1
+68 3417 1
+68 3425 1
+68 3426 1
+68 3428 1
+68 3429 1
+68 3430 1
+68 3431 1
+69 14 1
+69 42 1
+69 69 1
+69 74 1
+69 78 1
+69 81 1
+69 83 1
+69 85 1
+69 126 1
+69 153 1
+69 158 1
+69 162 1
+69 165 1
+69 167 1
+69 169 1
+69 209 1
+69 214 1
+69 218 1
+69 221 1
+69 223 1
+69 225 1
+69 264 1
+69 268 1
+69 271 1
+69 273 1
+69 275 1
+69 278 1
+69 281 1
+69 283 1
+69 285 1
+69 287 1
+69 289 1
+69 291 1
+69 292 1
+69 294 1
+69 295 1
+69 336 1
+69 363 1
+69 368 1
+69 372 1
+69 375 1
+69 377 1
+69 379 1
+69 419 1
+69 424 1
+69 428 1
+69 431 1
+69 433 1
+69 435 1
+69 474 1
+69 478 1
+69 481 1
+69 483 1
+69 485 1
+69 488 1
+69 491 1
+69 493 1
+69 495 1
+69 497 1
+69 499 1
+69 501 1
+69 502 1
+69 504 1
+69 505 1
+69 545 1
+69 550 1
+69 554 1
+69 557 1
+69 559 1
+69 561 1
+69 600 1
+69 604 1
+69 607 1
+69 609 1
+69 611 1
+69 614 1
+69 617 1
+69 619 1
+69 621 1
+69 623 1
+69 625 1
+69 627 1
+69 628 1
+69 630 1
+69 631 1
+69 670 1
+69 674 1
+69 677 1
+69 679 1
+69 681 1
+69 684 1
+69 687 1
+69 689 1
+69 691 1
+69 693 1
+69 695 1
+69 697 1
+69 698 1
+69 700 1
+69 701 1
+69 739 1
+69 742 1
+69 744 1
+69 746 1
+69 748 1
+69 750 1
+69 752 1
+69 753 1
+69 755 1
+69 756 1
+69 758 1
+69 760 1
+69 762 1
+69 763 1
+69 765 1
+69 766 1
+69 767 1
+69 769 1
+69 770 1
+69 771 1
+69 798 1
+69 825 1
+69 830 1
+69 834 1
+69 837 1
+69 839 1
+69 841 1
+69 881 1
+69 886 1
+69 890 1
+69 893 1
+69 895 1
+69 897 1
+69 936 1
+69 940 1
+69 943 1
+69 945 1
+69 947 1
+69 950 1
+69 953 1
+69 955 1
+69 957 1
+69 959 1
+69 961 1
+69 963 1
+69 964 1
+69 966 1
+69 967 1
+69 1007 1
+69 1012 1
+69 1016 1
+69 1019 1
+69 1021 1
+69 1023 1
+69 1062 1
+69 1066 1
+69 1069 1
+69 1071 1
+69 1073 1
+69 1076 1
+69 1079 1
+69 1081 1
+69 1083 1
+69 1085 1
+69 1087 1
+69 1089 1
+69 1090 1
+69 1092 1
+69 1093 1
+69 1132 1
+69 1136 1
+69 1139 1
+69 1141 1
+69 1143 1
+69 1146 1
+69 1149 1
+69 1151 1
+69 1153 1
+69 1155 1
+69 1157 1
+69 1159 1
+69 1160 1
+69 1162 1
+69 1163 1
+69 1201 1
+69 1204 1
+69 1206 1
+69 1208 1
+69 1210 1
+69 1212 1
+69 1214 1
+69 1215 1
+69 1217 1
+69 1218 1
+69 1220 1
+69 1222 1
+69 1224 1
+69 1225 1
+69 1227 1
+69 1228 1
+69 1229 1
+69 1231 1
+69 1232 1
+69 1233 1
+69 1259 1
+69 1264 1
+69 1268 1
+69 1271 1
+69 1273 1
+69 1275 1
+69 1314 1
+69 1318 1
+69 1321 1
+69 1323 1
+69 1325 1
+69 1328 1
+69 1331 1
+69 1333 1
+69 1335 1
+69 1337 1
+69 1339 1
+69 1341 1
+69 1342 1
+69 1344 1
+69 1345 1
+69 1384 1
+69 1388 1
+69 1391 1
+69 1393 1
+69 1395 1
+69 1398 1
+69 1401 1
+69 1403 1
+69 1405 1
+69 1407 1
+69 1409 1
+69 1411 1
+69 1412 1
+69 1414 1
+69 1415 1
+69 1453 1
+69 1456 1
+69 1458 1
+69 1460 1
+69 1462 1
+69 1464 1
+69 1466 1
+69 1467 1
+69 1469 1
+69 1470 1
+69 1472 1
+69 1474 1
+69 1476 1
+69 1477 1
+69 1479 1
+69 1480 1
+69 1481 1
+69 1483 1
+69 1484 1
+69 1485 1
+69 1510 1
+69 1514 1
+69 1517 1
+69 1519 1
+69 1521 1
+69 1524 1
+69 1527 1
+69 1529 1
+69 1531 1
+69 1533 1
+69 1535 1
+69 1537 1
+69 1538 1
+69 1540 1
+69 1541 1
+69 1579 1
+69 1582 1
+69 1584 1
+69 1586 1
+69 1588 1
+69 1590 1
+69 1592 1
+69 1593 1
+69 1595 1
+69 1596 1
+69 1598 1
+69 1600 1
+69 1602 1
+69 1603 1
+69 1605 1
+69 1606 1
+69 1607 1
+69 1609 1
+69 1610 1
+69 1611 1
+69 1635 1
+69 1638 1
+69 1640 1
+69 1642 1
+69 1644 1
+69 1646 1
+69 1648 1
+69 1649 1
+69 1651 1
+69 1652 1
+69 1654 1
+69 1656 1
+69 1658 1
+69 1659 1
+69 1661 1
+69 1662 1
+69 1663 1
+69 1665 1
+69 1666 1
+69 1667 1
+69 1690 1
+69 1692 1
+69 1694 1
+69 1695 1
+69 1697 1
+69 1698 1
+69 1699 1
+69 1701 1
+69 1702 1
+69 1703 1
+69 1704 1
+69 1706 1
+69 1707 1
+69 1708 1
+69 1709 1
+69 1722 1
+69 1749 1
+69 1754 1
+69 1758 1
+69 1761 1
+69 1763 1
+69 1765 1
+69 1805 1
+69 1810 1
+69 1814 1
+69 1817 1
+69 1819 1
+69 1821 1
+69 1860 1
+69 1864 1
+69 1867 1
+69 1869 1
+69 1871 1
+69 1874 1
+69 1877 1
+69 1879 1
+69 1881 1
+69 1883 1
+69 1885 1
+69 1887 1
+69 1888 1
+69 1890 1
+69 1891 1
+69 1931 1
+69 1936 1
+69 1940 1
+69 1943 1
+69 1945 1
+69 1947 1
+69 1986 1
+69 1990 1
+69 1993 1
+69 1995 1
+69 1997 1
+69 2000 1
+69 2003 1
+69 2005 1
+69 2007 1
+69 2009 1
+69 2011 1
+69 2013 1
+69 2014 1
+69 2016 1
+69 2017 1
+69 2056 1
+69 2060 1
+69 2063 1
+69 2065 1
+69 2067 1
+69 2070 1
+69 2073 1
+69 2075 1
+69 2077 1
+69 2079 1
+69 2081 1
+69 2083 1
+69 2084 1
+69 2086 1
+69 2087 1
+69 2125 1
+69 2128 1
+69 2130 1
+69 2132 1
+69 2134 1
+69 2136 1
+69 2138 1
+69 2139 1
+69 2141 1
+69 2142 1
+69 2144 1
+69 2146 1
+69 2148 1
+69 2149 1
+69 2151 1
+69 2152 1
+69 2153 1
+69 2155 1
+69 2156 1
+69 2157 1
+69 2183 1
+69 2188 1
+69 2192 1
+69 2195 1
+69 2197 1
+69 2199 1
+69 2238 1
+69 2242 1
+69 2245 1
+69 2247 1
+69 2249 1
+69 2252 1
+69 2255 1
+69 2257 1
+69 2259 1
+69 2261 1
+69 2263 1
+69 2265 1
+69 2266 1
+69 2268 1
+69 2269 1
+69 2308 1
+69 2312 1
+69 2315 1
+69 2317 1
+69 2319 1
+69 2322 1
+69 2325 1
+69 2327 1
+69 2329 1
+69 2331 1
+69 2333 1
+69 2335 1
+69 2336 1
+69 2338 1
+69 2339 1
+69 2377 1
+69 2380 1
+69 2382 1
+69 2384 1
+69 2386 1
+69 2388 1
+69 2390 1
+69 2391 1
+69 2393 1
+69 2394 1
+69 2396 1
+69 2398 1
+69 2400 1
+69 2401 1
+69 2403 1
+69 2404 1
+69 2405 1
+69 2407 1
+69 2408 1
+69 2409 1
+69 2434 1
+69 2438 1
+69 2441 1
+69 2443 1
+69 2445 1
+69 2448 1
+69 2451 1
+69 2453 1
+69 2455 1
+69 2457 1
+69 2459 1
+69 2461 1
+69 2462 1
+69 2464 1
+69 2465 1
+69 2503 1
+69 2506 1
+69 2508 1
+69 2510 1
+69 2512 1
+69 2514 1
+69 2516 1
+69 2517 1
+69 2519 1
+69 2520 1
+69 2522 1
+69 2524 1
+69 2526 1
+69 2527 1
+69 2529 1
+69 2530 1
+69 2531 1
+69 2533 1
+69 2534 1
+69 2535 1
+69 2559 1
+69 2562 1
+69 2564 1
+69 2566 1
+69 2568 1
+69 2570 1
+69 2572 1
+69 2573 1
+69 2575 1
+69 2576 1
+69 2578 1
+69 2580 1
+69 2582 1
+69 2583 1
+69 2585 1
+69 2586 1
+69 2587 1
+69 2589 1
+69 2590 1
+69 2591 1
+69 2614 1
+69 2616 1
+69 2618 1
+69 2619 1
+69 2621 1
+69 2622 1
+69 2623 1
+69 2625 1
+69 2626 1
+69 2627 1
+69 2628 1
+69 2630 1
+69 2631 1
+69 2632 1
+69 2633 1
+69 2645 1
+69 2650 1
+69 2654 1
+69 2657 1
+69 2659 1
+69 2661 1
+69 2700 1
+69 2704 1
+69 2707 1
+69 2709 1
+69 2711 1
+69 2714 1
+69 2717 1
+69 2719 1
+69 2721 1
+69 2723 1
+69 2725 1
+69 2727 1
+69 2728 1
+69 2730 1
+69 2731 1
+69 2770 1
+69 2774 1
+69 2777 1
+69 2779 1
+69 2781 1
+69 2784 1
+69 2787 1
+69 2789 1
+69 2791 1
+69 2793 1
+69 2795 1
+69 2797 1
+69 2798 1
+69 2800 1
+69 2801 1
+69 2839 1
+69 2842 1
+69 2844 1
+69 2846 1
+69 2848 1
+69 2850 1
+69 2852 1
+69 2853 1
+69 2855 1
+69 2856 1
+69 2858 1
+69 2860 1
+69 2862 1
+69 2863 1
+69 2865 1
+69 2866 1
+69 2867 1
+69 2869 1
+69 2870 1
+69 2871 1
+69 2896 1
+69 2900 1
+69 2903 1
+69 2905 1
+69 2907 1
+69 2910 1
+69 2913 1
+69 2915 1
+69 2917 1
+69 2919 1
+69 2921 1
+69 2923 1
+69 2924 1
+69 2926 1
+69 2927 1
+69 2965 1
+69 2968 1
+69 2970 1
+69 2972 1
+69 2974 1
+69 2976 1
+69 2978 1
+69 2979 1
+69 2981 1
+69 2982 1
+69 2984 1
+69 2986 1
+69 2988 1
+69 2989 1
+69 2991 1
+69 2992 1
+69 2993 1
+69 2995 1
+69 2996 1
+69 2997 1
+69 3021 1
+69 3024 1
+69 3026 1
+69 3028 1
+69 3030 1
+69 3032 1
+69 3034 1
+69 3035 1
+69 3037 1
+69 3038 1
+69 3040 1
+69 3042 1
+69 3044 1
+69 3045 1
+69 3047 1
+69 3048 1
+69 3049 1
+69 3051 1
+69 3052 1
+69 3053 1
+69 3076 1
+69 3078 1
+69 3080 1
+69 3081 1
+69 3083 1
+69 3084 1
+69 3085 1
+69 3087 1
+69 3088 1
+69 3089 1
+69 3090 1
+69 3092 1
+69 3093 1
+69 3094 1
+69 3095 1
+69 3106 1
+69 3110 1
+69 3113 1
+69 3115 1
+69 3117 1
+69 3120 1
+69 3123 1
+69 3125 1
+69 3127 1
+69 3129 1
+69 3131 1
+69 3133 1
+69 3134 1
+69 3136 1
+69 3137 1
+69 3175 1
+69 3178 1
+69 3180 1
+69 3182 1
+69 3184 1
+69 3186 1
+69 3188 1
+69 3189 1
+69 3191 1
+69 3192 1
+69 3194 1
+69 3196 1
+69 3198 1
+69 3199 1
+69 3201 1
+69 3202 1
+69 3203 1
+69 3205 1
+69 3206 1
+69 3207 1
+69 3231 1
+69 3234 1
+69 3236 1
+69 3238 1
+69 3240 1
+69 3242 1
+69 3244 1
+69 3245 1
+69 3247 1
+69 3248 1
+69 3250 1
+69 3252 1
+69 3254 1
+69 3255 1
+69 3257 1
+69 3258 1
+69 3259 1
+69 3261 1
+69 3262 1
+69 3263 1
+69 3286 1
+69 3288 1
+69 3290 1
+69 3291 1
+69 3293 1
+69 3294 1
+69 3295 1
+69 3297 1
+69 3298 1
+69 3299 1
+69 3300 1
+69 3302 1
+69 3303 1
+69 3304 1
+69 3305 1
+69 3315 1
+69 3318 1
+69 3320 1
+69 3322 1
+69 3324 1
+69 3326 1
+69 3328 1
+69 3329 1
+69 3331 1
+69 3332 1
+69 3334 1
+69 3336 1
+69 3338 1
+69 3339 1
+69 3341 1
+69 3342 1
+69 3343 1
+69 3345 1
+69 3346 1
+69 3347 1
+69 3370 1
+69 3372 1
+69 3374 1
+69 3375 1
+69 3377 1
+69 3378 1
+69 3379 1
+69 3381 1
+69 3382 1
+69 3383 1
+69 3384 1
+69 3386 1
+69 3387 1
+69 3388 1
+69 3389 1
+69 3398 1
+69 3400 1
+69 3402 1
+69 3403 1
+69 3405 1
+69 3406 1
+69 3407 1
+69 3409 1
+69 3410 1
+69 3411 1
+69 3412 1
+69 3414 1
+69 3415 1
+69 3416 1
+69 3417 1
+69 3425 1
+69 3427 1
+69 3428 1
+69 3429 1
+69 3430 1
+69 3431 1
+70 15 1
+70 43 1
+70 70 1
+70 75 1
+70 79 1
+70 82 1
+70 84 1
+70 85 1
+70 127 1
+70 154 1
+70 159 1
+70 163 1
+70 166 1
+70 168 1
+70 169 1
+70 210 1
+70 215 1
+70 219 1
+70 222 1
+70 224 1
+70 225 1
+70 265 1
+70 269 1
+70 272 1
+70 274 1
+70 275 1
+70 279 1
+70 282 1
+70 284 1
+70 285 1
+70 288 1
+70 290 1
+70 291 1
+70 293 1
+70 294 1
+70 295 1
+70 337 1
+70 364 1
+70 369 1
+70 373 1
+70 376 1
+70 378 1
+70 379 1
+70 420 1
+70 425 1
+70 429 1
+70 432 1
+70 434 1
+70 435 1
+70 475 1
+70 479 1
+70 482 1
+70 484 1
+70 485 1
+70 489 1
+70 492 1
+70 494 1
+70 495 1
+70 498 1
+70 500 1
+70 501 1
+70 503 1
+70 504 1
+70 505 1
+70 546 1
+70 551 1
+70 555 1
+70 558 1
+70 560 1
+70 561 1
+70 601 1
+70 605 1
+70 608 1
+70 610 1
+70 611 1
+70 615 1
+70 618 1
+70 620 1
+70 621 1
+70 624 1
+70 626 1
+70 627 1
+70 629 1
+70 630 1
+70 631 1
+70 671 1
+70 675 1
+70 678 1
+70 680 1
+70 681 1
+70 685 1
+70 688 1
+70 690 1
+70 691 1
+70 694 1
+70 696 1
+70 697 1
+70 699 1
+70 700 1
+70 701 1
+70 740 1
+70 743 1
+70 745 1
+70 746 1
+70 749 1
+70 751 1
+70 752 1
+70 754 1
+70 755 1
+70 756 1
+70 759 1
+70 761 1
+70 762 1
+70 764 1
+70 765 1
+70 766 1
+70 768 1
+70 769 1
+70 770 1
+70 771 1
+70 799 1
+70 826 1
+70 831 1
+70 835 1
+70 838 1
+70 840 1
+70 841 1
+70 882 1
+70 887 1
+70 891 1
+70 894 1
+70 896 1
+70 897 1
+70 937 1
+70 941 1
+70 944 1
+70 946 1
+70 947 1
+70 951 1
+70 954 1
+70 956 1
+70 957 1
+70 960 1
+70 962 1
+70 963 1
+70 965 1
+70 966 1
+70 967 1
+70 1008 1
+70 1013 1
+70 1017 1
+70 1020 1
+70 1022 1
+70 1023 1
+70 1063 1
+70 1067 1
+70 1070 1
+70 1072 1
+70 1073 1
+70 1077 1
+70 1080 1
+70 1082 1
+70 1083 1
+70 1086 1
+70 1088 1
+70 1089 1
+70 1091 1
+70 1092 1
+70 1093 1
+70 1133 1
+70 1137 1
+70 1140 1
+70 1142 1
+70 1143 1
+70 1147 1
+70 1150 1
+70 1152 1
+70 1153 1
+70 1156 1
+70 1158 1
+70 1159 1
+70 1161 1
+70 1162 1
+70 1163 1
+70 1202 1
+70 1205 1
+70 1207 1
+70 1208 1
+70 1211 1
+70 1213 1
+70 1214 1
+70 1216 1
+70 1217 1
+70 1218 1
+70 1221 1
+70 1223 1
+70 1224 1
+70 1226 1
+70 1227 1
+70 1228 1
+70 1230 1
+70 1231 1
+70 1232 1
+70 1233 1
+70 1260 1
+70 1265 1
+70 1269 1
+70 1272 1
+70 1274 1
+70 1275 1
+70 1315 1
+70 1319 1
+70 1322 1
+70 1324 1
+70 1325 1
+70 1329 1
+70 1332 1
+70 1334 1
+70 1335 1
+70 1338 1
+70 1340 1
+70 1341 1
+70 1343 1
+70 1344 1
+70 1345 1
+70 1385 1
+70 1389 1
+70 1392 1
+70 1394 1
+70 1395 1
+70 1399 1
+70 1402 1
+70 1404 1
+70 1405 1
+70 1408 1
+70 1410 1
+70 1411 1
+70 1413 1
+70 1414 1
+70 1415 1
+70 1454 1
+70 1457 1
+70 1459 1
+70 1460 1
+70 1463 1
+70 1465 1
+70 1466 1
+70 1468 1
+70 1469 1
+70 1470 1
+70 1473 1
+70 1475 1
+70 1476 1
+70 1478 1
+70 1479 1
+70 1480 1
+70 1482 1
+70 1483 1
+70 1484 1
+70 1485 1
+70 1511 1
+70 1515 1
+70 1518 1
+70 1520 1
+70 1521 1
+70 1525 1
+70 1528 1
+70 1530 1
+70 1531 1
+70 1534 1
+70 1536 1
+70 1537 1
+70 1539 1
+70 1540 1
+70 1541 1
+70 1580 1
+70 1583 1
+70 1585 1
+70 1586 1
+70 1589 1
+70 1591 1
+70 1592 1
+70 1594 1
+70 1595 1
+70 1596 1
+70 1599 1
+70 1601 1
+70 1602 1
+70 1604 1
+70 1605 1
+70 1606 1
+70 1608 1
+70 1609 1
+70 1610 1
+70 1611 1
+70 1636 1
+70 1639 1
+70 1641 1
+70 1642 1
+70 1645 1
+70 1647 1
+70 1648 1
+70 1650 1
+70 1651 1
+70 1652 1
+70 1655 1
+70 1657 1
+70 1658 1
+70 1660 1
+70 1661 1
+70 1662 1
+70 1664 1
+70 1665 1
+70 1666 1
+70 1667 1
+70 1691 1
+70 1693 1
+70 1694 1
+70 1696 1
+70 1697 1
+70 1698 1
+70 1700 1
+70 1701 1
+70 1702 1
+70 1703 1
+70 1705 1
+70 1706 1
+70 1707 1
+70 1708 1
+70 1709 1
+70 1723 1
+70 1750 1
+70 1755 1
+70 1759 1
+70 1762 1
+70 1764 1
+70 1765 1
+70 1806 1
+70 1811 1
+70 1815 1
+70 1818 1
+70 1820 1
+70 1821 1
+70 1861 1
+70 1865 1
+70 1868 1
+70 1870 1
+70 1871 1
+70 1875 1
+70 1878 1
+70 1880 1
+70 1881 1
+70 1884 1
+70 1886 1
+70 1887 1
+70 1889 1
+70 1890 1
+70 1891 1
+70 1932 1
+70 1937 1
+70 1941 1
+70 1944 1
+70 1946 1
+70 1947 1
+70 1987 1
+70 1991 1
+70 1994 1
+70 1996 1
+70 1997 1
+70 2001 1
+70 2004 1
+70 2006 1
+70 2007 1
+70 2010 1
+70 2012 1
+70 2013 1
+70 2015 1
+70 2016 1
+70 2017 1
+70 2057 1
+70 2061 1
+70 2064 1
+70 2066 1
+70 2067 1
+70 2071 1
+70 2074 1
+70 2076 1
+70 2077 1
+70 2080 1
+70 2082 1
+70 2083 1
+70 2085 1
+70 2086 1
+70 2087 1
+70 2126 1
+70 2129 1
+70 2131 1
+70 2132 1
+70 2135 1
+70 2137 1
+70 2138 1
+70 2140 1
+70 2141 1
+70 2142 1
+70 2145 1
+70 2147 1
+70 2148 1
+70 2150 1
+70 2151 1
+70 2152 1
+70 2154 1
+70 2155 1
+70 2156 1
+70 2157 1
+70 2184 1
+70 2189 1
+70 2193 1
+70 2196 1
+70 2198 1
+70 2199 1
+70 2239 1
+70 2243 1
+70 2246 1
+70 2248 1
+70 2249 1
+70 2253 1
+70 2256 1
+70 2258 1
+70 2259 1
+70 2262 1
+70 2264 1
+70 2265 1
+70 2267 1
+70 2268 1
+70 2269 1
+70 2309 1
+70 2313 1
+70 2316 1
+70 2318 1
+70 2319 1
+70 2323 1
+70 2326 1
+70 2328 1
+70 2329 1
+70 2332 1
+70 2334 1
+70 2335 1
+70 2337 1
+70 2338 1
+70 2339 1
+70 2378 1
+70 2381 1
+70 2383 1
+70 2384 1
+70 2387 1
+70 2389 1
+70 2390 1
+70 2392 1
+70 2393 1
+70 2394 1
+70 2397 1
+70 2399 1
+70 2400 1
+70 2402 1
+70 2403 1
+70 2404 1
+70 2406 1
+70 2407 1
+70 2408 1
+70 2409 1
+70 2435 1
+70 2439 1
+70 2442 1
+70 2444 1
+70 2445 1
+70 2449 1
+70 2452 1
+70 2454 1
+70 2455 1
+70 2458 1
+70 2460 1
+70 2461 1
+70 2463 1
+70 2464 1
+70 2465 1
+70 2504 1
+70 2507 1
+70 2509 1
+70 2510 1
+70 2513 1
+70 2515 1
+70 2516 1
+70 2518 1
+70 2519 1
+70 2520 1
+70 2523 1
+70 2525 1
+70 2526 1
+70 2528 1
+70 2529 1
+70 2530 1
+70 2532 1
+70 2533 1
+70 2534 1
+70 2535 1
+70 2560 1
+70 2563 1
+70 2565 1
+70 2566 1
+70 2569 1
+70 2571 1
+70 2572 1
+70 2574 1
+70 2575 1
+70 2576 1
+70 2579 1
+70 2581 1
+70 2582 1
+70 2584 1
+70 2585 1
+70 2586 1
+70 2588 1
+70 2589 1
+70 2590 1
+70 2591 1
+70 2615 1
+70 2617 1
+70 2618 1
+70 2620 1
+70 2621 1
+70 2622 1
+70 2624 1
+70 2625 1
+70 2626 1
+70 2627 1
+70 2629 1
+70 2630 1
+70 2631 1
+70 2632 1
+70 2633 1
+70 2646 1
+70 2651 1
+70 2655 1
+70 2658 1
+70 2660 1
+70 2661 1
+70 2701 1
+70 2705 1
+70 2708 1
+70 2710 1
+70 2711 1
+70 2715 1
+70 2718 1
+70 2720 1
+70 2721 1
+70 2724 1
+70 2726 1
+70 2727 1
+70 2729 1
+70 2730 1
+70 2731 1
+70 2771 1
+70 2775 1
+70 2778 1
+70 2780 1
+70 2781 1
+70 2785 1
+70 2788 1
+70 2790 1
+70 2791 1
+70 2794 1
+70 2796 1
+70 2797 1
+70 2799 1
+70 2800 1
+70 2801 1
+70 2840 1
+70 2843 1
+70 2845 1
+70 2846 1
+70 2849 1
+70 2851 1
+70 2852 1
+70 2854 1
+70 2855 1
+70 2856 1
+70 2859 1
+70 2861 1
+70 2862 1
+70 2864 1
+70 2865 1
+70 2866 1
+70 2868 1
+70 2869 1
+70 2870 1
+70 2871 1
+70 2897 1
+70 2901 1
+70 2904 1
+70 2906 1
+70 2907 1
+70 2911 1
+70 2914 1
+70 2916 1
+70 2917 1
+70 2920 1
+70 2922 1
+70 2923 1
+70 2925 1
+70 2926 1
+70 2927 1
+70 2966 1
+70 2969 1
+70 2971 1
+70 2972 1
+70 2975 1
+70 2977 1
+70 2978 1
+70 2980 1
+70 2981 1
+70 2982 1
+70 2985 1
+70 2987 1
+70 2988 1
+70 2990 1
+70 2991 1
+70 2992 1
+70 2994 1
+70 2995 1
+70 2996 1
+70 2997 1
+70 3022 1
+70 3025 1
+70 3027 1
+70 3028 1
+70 3031 1
+70 3033 1
+70 3034 1
+70 3036 1
+70 3037 1
+70 3038 1
+70 3041 1
+70 3043 1
+70 3044 1
+70 3046 1
+70 3047 1
+70 3048 1
+70 3050 1
+70 3051 1
+70 3052 1
+70 3053 1
+70 3077 1
+70 3079 1
+70 3080 1
+70 3082 1
+70 3083 1
+70 3084 1
+70 3086 1
+70 3087 1
+70 3088 1
+70 3089 1
+70 3091 1
+70 3092 1
+70 3093 1
+70 3094 1
+70 3095 1
+70 3107 1
+70 3111 1
+70 3114 1
+70 3116 1
+70 3117 1
+70 3121 1
+70 3124 1
+70 3126 1
+70 3127 1
+70 3130 1
+70 3132 1
+70 3133 1
+70 3135 1
+70 3136 1
+70 3137 1
+70 3176 1
+70 3179 1
+70 3181 1
+70 3182 1
+70 3185 1
+70 3187 1
+70 3188 1
+70 3190 1
+70 3191 1
+70 3192 1
+70 3195 1
+70 3197 1
+70 3198 1
+70 3200 1
+70 3201 1
+70 3202 1
+70 3204 1
+70 3205 1
+70 3206 1
+70 3207 1
+70 3232 1
+70 3235 1
+70 3237 1
+70 3238 1
+70 3241 1
+70 3243 1
+70 3244 1
+70 3246 1
+70 3247 1
+70 3248 1
+70 3251 1
+70 3253 1
+70 3254 1
+70 3256 1
+70 3257 1
+70 3258 1
+70 3260 1
+70 3261 1
+70 3262 1
+70 3263 1
+70 3287 1
+70 3289 1
+70 3290 1
+70 3292 1
+70 3293 1
+70 3294 1
+70 3296 1
+70 3297 1
+70 3298 1
+70 3299 1
+70 3301 1
+70 3302 1
+70 3303 1
+70 3304 1
+70 3305 1
+70 3316 1
+70 3319 1
+70 3321 1
+70 3322 1
+70 3325 1
+70 3327 1
+70 3328 1
+70 3330 1
+70 3331 1
+70 3332 1
+70 3335 1
+70 3337 1
+70 3338 1
+70 3340 1
+70 3341 1
+70 3342 1
+70 3344 1
+70 3345 1
+70 3346 1
+70 3347 1
+70 3371 1
+70 3373 1
+70 3374 1
+70 3376 1
+70 3377 1
+70 3378 1
+70 3380 1
+70 3381 1
+70 3382 1
+70 3383 1
+70 3385 1
+70 3386 1
+70 3387 1
+70 3388 1
+70 3389 1
+70 3399 1
+70 3401 1
+70 3402 1
+70 3404 1
+70 3405 1
+70 3406 1
+70 3408 1
+70 3409 1
+70 3410 1
+70 3411 1
+70 3413 1
+70 3414 1
+70 3415 1
+70 3416 1
+70 3417 1
+70 3426 1
+70 3427 1
+70 3428 1
+70 3429 1
+70 3430 1
+70 3431 1
+71 16 1
+71 44 1
+71 65 1
+71 86 1
+71 87 1
+71 88 1
+71 89 1
+71 90 1
+71 128 1
+71 149 1
+71 170 1
+71 171 1
+71 172 1
+71 173 1
+71 174 1
+71 205 1
+71 226 1
+71 227 1
+71 228 1
+71 229 1
+71 230 1
+71 261 1
+71 262 1
+71 263 1
+71 264 1
+71 265 1
+71 296 1
+71 297 1
+71 298 1
+71 299 1
+71 300 1
+71 301 1
+71 302 1
+71 303 1
+71 304 1
+71 305 1
+71 338 1
+71 359 1
+71 380 1
+71 381 1
+71 382 1
+71 383 1
+71 384 1
+71 415 1
+71 436 1
+71 437 1
+71 438 1
+71 439 1
+71 440 1
+71 471 1
+71 472 1
+71 473 1
+71 474 1
+71 475 1
+71 506 1
+71 507 1
+71 508 1
+71 509 1
+71 510 1
+71 511 1
+71 512 1
+71 513 1
+71 514 1
+71 515 1
+71 541 1
+71 562 1
+71 563 1
+71 564 1
+71 565 1
+71 566 1
+71 597 1
+71 598 1
+71 599 1
+71 600 1
+71 601 1
+71 632 1
+71 633 1
+71 634 1
+71 635 1
+71 636 1
+71 637 1
+71 638 1
+71 639 1
+71 640 1
+71 641 1
+71 667 1
+71 668 1
+71 669 1
+71 670 1
+71 671 1
+71 702 1
+71 703 1
+71 704 1
+71 705 1
+71 706 1
+71 707 1
+71 708 1
+71 709 1
+71 710 1
+71 711 1
+71 737 1
+71 738 1
+71 739 1
+71 740 1
+71 741 1
+71 742 1
+71 743 1
+71 744 1
+71 745 1
+71 746 1
+71 772 1
+71 773 1
+71 774 1
+71 775 1
+71 776 1
+71 777 1
+71 778 1
+71 779 1
+71 780 1
+71 781 1
+71 800 1
+71 821 1
+71 842 1
+71 843 1
+71 844 1
+71 845 1
+71 846 1
+71 877 1
+71 898 1
+71 899 1
+71 900 1
+71 901 1
+71 902 1
+71 933 1
+71 934 1
+71 935 1
+71 936 1
+71 937 1
+71 968 1
+71 969 1
+71 970 1
+71 971 1
+71 972 1
+71 973 1
+71 974 1
+71 975 1
+71 976 1
+71 977 1
+71 1003 1
+71 1024 1
+71 1025 1
+71 1026 1
+71 1027 1
+71 1028 1
+71 1059 1
+71 1060 1
+71 1061 1
+71 1062 1
+71 1063 1
+71 1094 1
+71 1095 1
+71 1096 1
+71 1097 1
+71 1098 1
+71 1099 1
+71 1100 1
+71 1101 1
+71 1102 1
+71 1103 1
+71 1129 1
+71 1130 1
+71 1131 1
+71 1132 1
+71 1133 1
+71 1164 1
+71 1165 1
+71 1166 1
+71 1167 1
+71 1168 1
+71 1169 1
+71 1170 1
+71 1171 1
+71 1172 1
+71 1173 1
+71 1199 1
+71 1200 1
+71 1201 1
+71 1202 1
+71 1203 1
+71 1204 1
+71 1205 1
+71 1206 1
+71 1207 1
+71 1208 1
+71 1234 1
+71 1235 1
+71 1236 1
+71 1237 1
+71 1238 1
+71 1239 1
+71 1240 1
+71 1241 1
+71 1242 1
+71 1243 1
+71 1255 1
+71 1276 1
+71 1277 1
+71 1278 1
+71 1279 1
+71 1280 1
+71 1311 1
+71 1312 1
+71 1313 1
+71 1314 1
+71 1315 1
+71 1346 1
+71 1347 1
+71 1348 1
+71 1349 1
+71 1350 1
+71 1351 1
+71 1352 1
+71 1353 1
+71 1354 1
+71 1355 1
+71 1381 1
+71 1382 1
+71 1383 1
+71 1384 1
+71 1385 1
+71 1416 1
+71 1417 1
+71 1418 1
+71 1419 1
+71 1420 1
+71 1421 1
+71 1422 1
+71 1423 1
+71 1424 1
+71 1425 1
+71 1451 1
+71 1452 1
+71 1453 1
+71 1454 1
+71 1455 1
+71 1456 1
+71 1457 1
+71 1458 1
+71 1459 1
+71 1460 1
+71 1486 1
+71 1487 1
+71 1488 1
+71 1489 1
+71 1490 1
+71 1491 1
+71 1492 1
+71 1493 1
+71 1494 1
+71 1495 1
+71 1507 1
+71 1508 1
+71 1509 1
+71 1510 1
+71 1511 1
+71 1542 1
+71 1543 1
+71 1544 1
+71 1545 1
+71 1546 1
+71 1547 1
+71 1548 1
+71 1549 1
+71 1550 1
+71 1551 1
+71 1577 1
+71 1578 1
+71 1579 1
+71 1580 1
+71 1581 1
+71 1582 1
+71 1583 1
+71 1584 1
+71 1585 1
+71 1586 1
+71 1612 1
+71 1613 1
+71 1614 1
+71 1615 1
+71 1616 1
+71 1617 1
+71 1618 1
+71 1619 1
+71 1620 1
+71 1621 1
+71 1633 1
+71 1634 1
+71 1635 1
+71 1636 1
+71 1637 1
+71 1638 1
+71 1639 1
+71 1640 1
+71 1641 1
+71 1642 1
+71 1668 1
+71 1669 1
+71 1670 1
+71 1671 1
+71 1672 1
+71 1673 1
+71 1674 1
+71 1675 1
+71 1676 1
+71 1677 1
+71 1689 1
+71 1690 1
+71 1691 1
+71 1692 1
+71 1693 1
+71 1694 1
+71 1695 1
+71 1696 1
+71 1697 1
+71 1698 1
+71 1710 1
+71 1711 1
+71 1712 1
+71 1713 1
+71 1714 1
+71 1724 1
+71 1745 1
+71 1766 1
+71 1767 1
+71 1768 1
+71 1769 1
+71 1770 1
+71 1801 1
+71 1822 1
+71 1823 1
+71 1824 1
+71 1825 1
+71 1826 1
+71 1857 1
+71 1858 1
+71 1859 1
+71 1860 1
+71 1861 1
+71 1892 1
+71 1893 1
+71 1894 1
+71 1895 1
+71 1896 1
+71 1897 1
+71 1898 1
+71 1899 1
+71 1900 1
+71 1901 1
+71 1927 1
+71 1948 1
+71 1949 1
+71 1950 1
+71 1951 1
+71 1952 1
+71 1983 1
+71 1984 1
+71 1985 1
+71 1986 1
+71 1987 1
+71 2018 1
+71 2019 1
+71 2020 1
+71 2021 1
+71 2022 1
+71 2023 1
+71 2024 1
+71 2025 1
+71 2026 1
+71 2027 1
+71 2053 1
+71 2054 1
+71 2055 1
+71 2056 1
+71 2057 1
+71 2088 1
+71 2089 1
+71 2090 1
+71 2091 1
+71 2092 1
+71 2093 1
+71 2094 1
+71 2095 1
+71 2096 1
+71 2097 1
+71 2123 1
+71 2124 1
+71 2125 1
+71 2126 1
+71 2127 1
+71 2128 1
+71 2129 1
+71 2130 1
+71 2131 1
+71 2132 1
+71 2158 1
+71 2159 1
+71 2160 1
+71 2161 1
+71 2162 1
+71 2163 1
+71 2164 1
+71 2165 1
+71 2166 1
+71 2167 1
+71 2179 1
+71 2200 1
+71 2201 1
+71 2202 1
+71 2203 1
+71 2204 1
+71 2235 1
+71 2236 1
+71 2237 1
+71 2238 1
+71 2239 1
+71 2270 1
+71 2271 1
+71 2272 1
+71 2273 1
+71 2274 1
+71 2275 1
+71 2276 1
+71 2277 1
+71 2278 1
+71 2279 1
+71 2305 1
+71 2306 1
+71 2307 1
+71 2308 1
+71 2309 1
+71 2340 1
+71 2341 1
+71 2342 1
+71 2343 1
+71 2344 1
+71 2345 1
+71 2346 1
+71 2347 1
+71 2348 1
+71 2349 1
+71 2375 1
+71 2376 1
+71 2377 1
+71 2378 1
+71 2379 1
+71 2380 1
+71 2381 1
+71 2382 1
+71 2383 1
+71 2384 1
+71 2410 1
+71 2411 1
+71 2412 1
+71 2413 1
+71 2414 1
+71 2415 1
+71 2416 1
+71 2417 1
+71 2418 1
+71 2419 1
+71 2431 1
+71 2432 1
+71 2433 1
+71 2434 1
+71 2435 1
+71 2466 1
+71 2467 1
+71 2468 1
+71 2469 1
+71 2470 1
+71 2471 1
+71 2472 1
+71 2473 1
+71 2474 1
+71 2475 1
+71 2501 1
+71 2502 1
+71 2503 1
+71 2504 1
+71 2505 1
+71 2506 1
+71 2507 1
+71 2508 1
+71 2509 1
+71 2510 1
+71 2536 1
+71 2537 1
+71 2538 1
+71 2539 1
+71 2540 1
+71 2541 1
+71 2542 1
+71 2543 1
+71 2544 1
+71 2545 1
+71 2557 1
+71 2558 1
+71 2559 1
+71 2560 1
+71 2561 1
+71 2562 1
+71 2563 1
+71 2564 1
+71 2565 1
+71 2566 1
+71 2592 1
+71 2593 1
+71 2594 1
+71 2595 1
+71 2596 1
+71 2597 1
+71 2598 1
+71 2599 1
+71 2600 1
+71 2601 1
+71 2613 1
+71 2614 1
+71 2615 1
+71 2616 1
+71 2617 1
+71 2618 1
+71 2619 1
+71 2620 1
+71 2621 1
+71 2622 1
+71 2634 1
+71 2635 1
+71 2636 1
+71 2637 1
+71 2638 1
+71 2641 1
+71 2662 1
+71 2663 1
+71 2664 1
+71 2665 1
+71 2666 1
+71 2697 1
+71 2698 1
+71 2699 1
+71 2700 1
+71 2701 1
+71 2732 1
+71 2733 1
+71 2734 1
+71 2735 1
+71 2736 1
+71 2737 1
+71 2738 1
+71 2739 1
+71 2740 1
+71 2741 1
+71 2767 1
+71 2768 1
+71 2769 1
+71 2770 1
+71 2771 1
+71 2802 1
+71 2803 1
+71 2804 1
+71 2805 1
+71 2806 1
+71 2807 1
+71 2808 1
+71 2809 1
+71 2810 1
+71 2811 1
+71 2837 1
+71 2838 1
+71 2839 1
+71 2840 1
+71 2841 1
+71 2842 1
+71 2843 1
+71 2844 1
+71 2845 1
+71 2846 1
+71 2872 1
+71 2873 1
+71 2874 1
+71 2875 1
+71 2876 1
+71 2877 1
+71 2878 1
+71 2879 1
+71 2880 1
+71 2881 1
+71 2893 1
+71 2894 1
+71 2895 1
+71 2896 1
+71 2897 1
+71 2928 1
+71 2929 1
+71 2930 1
+71 2931 1
+71 2932 1
+71 2933 1
+71 2934 1
+71 2935 1
+71 2936 1
+71 2937 1
+71 2963 1
+71 2964 1
+71 2965 1
+71 2966 1
+71 2967 1
+71 2968 1
+71 2969 1
+71 2970 1
+71 2971 1
+71 2972 1
+71 2998 1
+71 2999 1
+71 3000 1
+71 3001 1
+71 3002 1
+71 3003 1
+71 3004 1
+71 3005 1
+71 3006 1
+71 3007 1
+71 3019 1
+71 3020 1
+71 3021 1
+71 3022 1
+71 3023 1
+71 3024 1
+71 3025 1
+71 3026 1
+71 3027 1
+71 3028 1
+71 3054 1
+71 3055 1
+71 3056 1
+71 3057 1
+71 3058 1
+71 3059 1
+71 3060 1
+71 3061 1
+71 3062 1
+71 3063 1
+71 3075 1
+71 3076 1
+71 3077 1
+71 3078 1
+71 3079 1
+71 3080 1
+71 3081 1
+71 3082 1
+71 3083 1
+71 3084 1
+71 3096 1
+71 3097 1
+71 3098 1
+71 3099 1
+71 3100 1
+71 3103 1
+71 3104 1
+71 3105 1
+71 3106 1
+71 3107 1
+71 3138 1
+71 3139 1
+71 3140 1
+71 3141 1
+71 3142 1
+71 3143 1
+71 3144 1
+71 3145 1
+71 3146 1
+71 3147 1
+71 3173 1
+71 3174 1
+71 3175 1
+71 3176 1
+71 3177 1
+71 3178 1
+71 3179 1
+71 3180 1
+71 3181 1
+71 3182 1
+71 3208 1
+71 3209 1
+71 3210 1
+71 3211 1
+71 3212 1
+71 3213 1
+71 3214 1
+71 3215 1
+71 3216 1
+71 3217 1
+71 3229 1
+71 3230 1
+71 3231 1
+71 3232 1
+71 3233 1
+71 3234 1
+71 3235 1
+71 3236 1
+71 3237 1
+71 3238 1
+71 3264 1
+71 3265 1
+71 3266 1
+71 3267 1
+71 3268 1
+71 3269 1
+71 3270 1
+71 3271 1
+71 3272 1
+71 3273 1
+71 3285 1
+71 3286 1
+71 3287 1
+71 3288 1
+71 3289 1
+71 3290 1
+71 3291 1
+71 3292 1
+71 3293 1
+71 3294 1
+71 3306 1
+71 3307 1
+71 3308 1
+71 3309 1
+71 3310 1
+71 3313 1
+71 3314 1
+71 3315 1
+71 3316 1
+71 3317 1
+71 3318 1
+71 3319 1
+71 3320 1
+71 3321 1
+71 3322 1
+71 3348 1
+71 3349 1
+71 3350 1
+71 3351 1
+71 3352 1
+71 3353 1
+71 3354 1
+71 3355 1
+71 3356 1
+71 3357 1
+71 3369 1
+71 3370 1
+71 3371 1
+71 3372 1
+71 3373 1
+71 3374 1
+71 3375 1
+71 3376 1
+71 3377 1
+71 3378 1
+71 3390 1
+71 3391 1
+71 3392 1
+71 3393 1
+71 3394 1
+71 3397 1
+71 3398 1
+71 3399 1
+71 3400 1
+71 3401 1
+71 3402 1
+71 3403 1
+71 3404 1
+71 3405 1
+71 3406 1
+71 3418 1
+71 3419 1
+71 3420 1
+71 3421 1
+71 3422 1
+71 3425 1
+71 3426 1
+71 3427 1
+71 3428 1
+71 3429 1
+71 3432 1
+72 17 1
+72 45 1
+72 66 1
+72 86 1
+72 91 1
+72 92 1
+72 93 1
+72 94 1
+72 129 1
+72 150 1
+72 170 1
+72 175 1
+72 176 1
+72 177 1
+72 178 1
+72 206 1
+72 226 1
+72 231 1
+72 232 1
+72 233 1
+72 234 1
+72 261 1
+72 266 1
+72 267 1
+72 268 1
+72 269 1
+72 296 1
+72 297 1
+72 298 1
+72 299 1
+72 306 1
+72 307 1
+72 308 1
+72 309 1
+72 310 1
+72 311 1
+72 339 1
+72 360 1
+72 380 1
+72 385 1
+72 386 1
+72 387 1
+72 388 1
+72 416 1
+72 436 1
+72 441 1
+72 442 1
+72 443 1
+72 444 1
+72 471 1
+72 476 1
+72 477 1
+72 478 1
+72 479 1
+72 506 1
+72 507 1
+72 508 1
+72 509 1
+72 516 1
+72 517 1
+72 518 1
+72 519 1
+72 520 1
+72 521 1
+72 542 1
+72 562 1
+72 567 1
+72 568 1
+72 569 1
+72 570 1
+72 597 1
+72 602 1
+72 603 1
+72 604 1
+72 605 1
+72 632 1
+72 633 1
+72 634 1
+72 635 1
+72 642 1
+72 643 1
+72 644 1
+72 645 1
+72 646 1
+72 647 1
+72 667 1
+72 672 1
+72 673 1
+72 674 1
+72 675 1
+72 702 1
+72 703 1
+72 704 1
+72 705 1
+72 712 1
+72 713 1
+72 714 1
+72 715 1
+72 716 1
+72 717 1
+72 737 1
+72 738 1
+72 739 1
+72 740 1
+72 747 1
+72 748 1
+72 749 1
+72 750 1
+72 751 1
+72 752 1
+72 772 1
+72 773 1
+72 774 1
+72 775 1
+72 776 1
+72 777 1
+72 782 1
+72 783 1
+72 784 1
+72 785 1
+72 801 1
+72 822 1
+72 842 1
+72 847 1
+72 848 1
+72 849 1
+72 850 1
+72 878 1
+72 898 1
+72 903 1
+72 904 1
+72 905 1
+72 906 1
+72 933 1
+72 938 1
+72 939 1
+72 940 1
+72 941 1
+72 968 1
+72 969 1
+72 970 1
+72 971 1
+72 978 1
+72 979 1
+72 980 1
+72 981 1
+72 982 1
+72 983 1
+72 1004 1
+72 1024 1
+72 1029 1
+72 1030 1
+72 1031 1
+72 1032 1
+72 1059 1
+72 1064 1
+72 1065 1
+72 1066 1
+72 1067 1
+72 1094 1
+72 1095 1
+72 1096 1
+72 1097 1
+72 1104 1
+72 1105 1
+72 1106 1
+72 1107 1
+72 1108 1
+72 1109 1
+72 1129 1
+72 1134 1
+72 1135 1
+72 1136 1
+72 1137 1
+72 1164 1
+72 1165 1
+72 1166 1
+72 1167 1
+72 1174 1
+72 1175 1
+72 1176 1
+72 1177 1
+72 1178 1
+72 1179 1
+72 1199 1
+72 1200 1
+72 1201 1
+72 1202 1
+72 1209 1
+72 1210 1
+72 1211 1
+72 1212 1
+72 1213 1
+72 1214 1
+72 1234 1
+72 1235 1
+72 1236 1
+72 1237 1
+72 1238 1
+72 1239 1
+72 1244 1
+72 1245 1
+72 1246 1
+72 1247 1
+72 1256 1
+72 1276 1
+72 1281 1
+72 1282 1
+72 1283 1
+72 1284 1
+72 1311 1
+72 1316 1
+72 1317 1
+72 1318 1
+72 1319 1
+72 1346 1
+72 1347 1
+72 1348 1
+72 1349 1
+72 1356 1
+72 1357 1
+72 1358 1
+72 1359 1
+72 1360 1
+72 1361 1
+72 1381 1
+72 1386 1
+72 1387 1
+72 1388 1
+72 1389 1
+72 1416 1
+72 1417 1
+72 1418 1
+72 1419 1
+72 1426 1
+72 1427 1
+72 1428 1
+72 1429 1
+72 1430 1
+72 1431 1
+72 1451 1
+72 1452 1
+72 1453 1
+72 1454 1
+72 1461 1
+72 1462 1
+72 1463 1
+72 1464 1
+72 1465 1
+72 1466 1
+72 1486 1
+72 1487 1
+72 1488 1
+72 1489 1
+72 1490 1
+72 1491 1
+72 1496 1
+72 1497 1
+72 1498 1
+72 1499 1
+72 1507 1
+72 1512 1
+72 1513 1
+72 1514 1
+72 1515 1
+72 1542 1
+72 1543 1
+72 1544 1
+72 1545 1
+72 1552 1
+72 1553 1
+72 1554 1
+72 1555 1
+72 1556 1
+72 1557 1
+72 1577 1
+72 1578 1
+72 1579 1
+72 1580 1
+72 1587 1
+72 1588 1
+72 1589 1
+72 1590 1
+72 1591 1
+72 1592 1
+72 1612 1
+72 1613 1
+72 1614 1
+72 1615 1
+72 1616 1
+72 1617 1
+72 1622 1
+72 1623 1
+72 1624 1
+72 1625 1
+72 1633 1
+72 1634 1
+72 1635 1
+72 1636 1
+72 1643 1
+72 1644 1
+72 1645 1
+72 1646 1
+72 1647 1
+72 1648 1
+72 1668 1
+72 1669 1
+72 1670 1
+72 1671 1
+72 1672 1
+72 1673 1
+72 1678 1
+72 1679 1
+72 1680 1
+72 1681 1
+72 1689 1
+72 1690 1
+72 1691 1
+72 1692 1
+72 1693 1
+72 1694 1
+72 1699 1
+72 1700 1
+72 1701 1
+72 1702 1
+72 1710 1
+72 1711 1
+72 1712 1
+72 1713 1
+72 1715 1
+72 1725 1
+72 1746 1
+72 1766 1
+72 1771 1
+72 1772 1
+72 1773 1
+72 1774 1
+72 1802 1
+72 1822 1
+72 1827 1
+72 1828 1
+72 1829 1
+72 1830 1
+72 1857 1
+72 1862 1
+72 1863 1
+72 1864 1
+72 1865 1
+72 1892 1
+72 1893 1
+72 1894 1
+72 1895 1
+72 1902 1
+72 1903 1
+72 1904 1
+72 1905 1
+72 1906 1
+72 1907 1
+72 1928 1
+72 1948 1
+72 1953 1
+72 1954 1
+72 1955 1
+72 1956 1
+72 1983 1
+72 1988 1
+72 1989 1
+72 1990 1
+72 1991 1
+72 2018 1
+72 2019 1
+72 2020 1
+72 2021 1
+72 2028 1
+72 2029 1
+72 2030 1
+72 2031 1
+72 2032 1
+72 2033 1
+72 2053 1
+72 2058 1
+72 2059 1
+72 2060 1
+72 2061 1
+72 2088 1
+72 2089 1
+72 2090 1
+72 2091 1
+72 2098 1
+72 2099 1
+72 2100 1
+72 2101 1
+72 2102 1
+72 2103 1
+72 2123 1
+72 2124 1
+72 2125 1
+72 2126 1
+72 2133 1
+72 2134 1
+72 2135 1
+72 2136 1
+72 2137 1
+72 2138 1
+72 2158 1
+72 2159 1
+72 2160 1
+72 2161 1
+72 2162 1
+72 2163 1
+72 2168 1
+72 2169 1
+72 2170 1
+72 2171 1
+72 2180 1
+72 2200 1
+72 2205 1
+72 2206 1
+72 2207 1
+72 2208 1
+72 2235 1
+72 2240 1
+72 2241 1
+72 2242 1
+72 2243 1
+72 2270 1
+72 2271 1
+72 2272 1
+72 2273 1
+72 2280 1
+72 2281 1
+72 2282 1
+72 2283 1
+72 2284 1
+72 2285 1
+72 2305 1
+72 2310 1
+72 2311 1
+72 2312 1
+72 2313 1
+72 2340 1
+72 2341 1
+72 2342 1
+72 2343 1
+72 2350 1
+72 2351 1
+72 2352 1
+72 2353 1
+72 2354 1
+72 2355 1
+72 2375 1
+72 2376 1
+72 2377 1
+72 2378 1
+72 2385 1
+72 2386 1
+72 2387 1
+72 2388 1
+72 2389 1
+72 2390 1
+72 2410 1
+72 2411 1
+72 2412 1
+72 2413 1
+72 2414 1
+72 2415 1
+72 2420 1
+72 2421 1
+72 2422 1
+72 2423 1
+72 2431 1
+72 2436 1
+72 2437 1
+72 2438 1
+72 2439 1
+72 2466 1
+72 2467 1
+72 2468 1
+72 2469 1
+72 2476 1
+72 2477 1
+72 2478 1
+72 2479 1
+72 2480 1
+72 2481 1
+72 2501 1
+72 2502 1
+72 2503 1
+72 2504 1
+72 2511 1
+72 2512 1
+72 2513 1
+72 2514 1
+72 2515 1
+72 2516 1
+72 2536 1
+72 2537 1
+72 2538 1
+72 2539 1
+72 2540 1
+72 2541 1
+72 2546 1
+72 2547 1
+72 2548 1
+72 2549 1
+72 2557 1
+72 2558 1
+72 2559 1
+72 2560 1
+72 2567 1
+72 2568 1
+72 2569 1
+72 2570 1
+72 2571 1
+72 2572 1
+72 2592 1
+72 2593 1
+72 2594 1
+72 2595 1
+72 2596 1
+72 2597 1
+72 2602 1
+72 2603 1
+72 2604 1
+72 2605 1
+72 2613 1
+72 2614 1
+72 2615 1
+72 2616 1
+72 2617 1
+72 2618 1
+72 2623 1
+72 2624 1
+72 2625 1
+72 2626 1
+72 2634 1
+72 2635 1
+72 2636 1
+72 2637 1
+72 2639 1
+72 2642 1
+72 2662 1
+72 2667 1
+72 2668 1
+72 2669 1
+72 2670 1
+72 2697 1
+72 2702 1
+72 2703 1
+72 2704 1
+72 2705 1
+72 2732 1
+72 2733 1
+72 2734 1
+72 2735 1
+72 2742 1
+72 2743 1
+72 2744 1
+72 2745 1
+72 2746 1
+72 2747 1
+72 2767 1
+72 2772 1
+72 2773 1
+72 2774 1
+72 2775 1
+72 2802 1
+72 2803 1
+72 2804 1
+72 2805 1
+72 2812 1
+72 2813 1
+72 2814 1
+72 2815 1
+72 2816 1
+72 2817 1
+72 2837 1
+72 2838 1
+72 2839 1
+72 2840 1
+72 2847 1
+72 2848 1
+72 2849 1
+72 2850 1
+72 2851 1
+72 2852 1
+72 2872 1
+72 2873 1
+72 2874 1
+72 2875 1
+72 2876 1
+72 2877 1
+72 2882 1
+72 2883 1
+72 2884 1
+72 2885 1
+72 2893 1
+72 2898 1
+72 2899 1
+72 2900 1
+72 2901 1
+72 2928 1
+72 2929 1
+72 2930 1
+72 2931 1
+72 2938 1
+72 2939 1
+72 2940 1
+72 2941 1
+72 2942 1
+72 2943 1
+72 2963 1
+72 2964 1
+72 2965 1
+72 2966 1
+72 2973 1
+72 2974 1
+72 2975 1
+72 2976 1
+72 2977 1
+72 2978 1
+72 2998 1
+72 2999 1
+72 3000 1
+72 3001 1
+72 3002 1
+72 3003 1
+72 3008 1
+72 3009 1
+72 3010 1
+72 3011 1
+72 3019 1
+72 3020 1
+72 3021 1
+72 3022 1
+72 3029 1
+72 3030 1
+72 3031 1
+72 3032 1
+72 3033 1
+72 3034 1
+72 3054 1
+72 3055 1
+72 3056 1
+72 3057 1
+72 3058 1
+72 3059 1
+72 3064 1
+72 3065 1
+72 3066 1
+72 3067 1
+72 3075 1
+72 3076 1
+72 3077 1
+72 3078 1
+72 3079 1
+72 3080 1
+72 3085 1
+72 3086 1
+72 3087 1
+72 3088 1
+72 3096 1
+72 3097 1
+72 3098 1
+72 3099 1
+72 3101 1
+72 3103 1
+72 3108 1
+72 3109 1
+72 3110 1
+72 3111 1
+72 3138 1
+72 3139 1
+72 3140 1
+72 3141 1
+72 3148 1
+72 3149 1
+72 3150 1
+72 3151 1
+72 3152 1
+72 3153 1
+72 3173 1
+72 3174 1
+72 3175 1
+72 3176 1
+72 3183 1
+72 3184 1
+72 3185 1
+72 3186 1
+72 3187 1
+72 3188 1
+72 3208 1
+72 3209 1
+72 3210 1
+72 3211 1
+72 3212 1
+72 3213 1
+72 3218 1
+72 3219 1
+72 3220 1
+72 3221 1
+72 3229 1
+72 3230 1
+72 3231 1
+72 3232 1
+72 3239 1
+72 3240 1
+72 3241 1
+72 3242 1
+72 3243 1
+72 3244 1
+72 3264 1
+72 3265 1
+72 3266 1
+72 3267 1
+72 3268 1
+72 3269 1
+72 3274 1
+72 3275 1
+72 3276 1
+72 3277 1
+72 3285 1
+72 3286 1
+72 3287 1
+72 3288 1
+72 3289 1
+72 3290 1
+72 3295 1
+72 3296 1
+72 3297 1
+72 3298 1
+72 3306 1
+72 3307 1
+72 3308 1
+72 3309 1
+72 3311 1
+72 3313 1
+72 3314 1
+72 3315 1
+72 3316 1
+72 3323 1
+72 3324 1
+72 3325 1
+72 3326 1
+72 3327 1
+72 3328 1
+72 3348 1
+72 3349 1
+72 3350 1
+72 3351 1
+72 3352 1
+72 3353 1
+72 3358 1
+72 3359 1
+72 3360 1
+72 3361 1
+72 3369 1
+72 3370 1
+72 3371 1
+72 3372 1
+72 3373 1
+72 3374 1
+72 3379 1
+72 3380 1
+72 3381 1
+72 3382 1
+72 3390 1
+72 3391 1
+72 3392 1
+72 3393 1
+72 3395 1
+72 3397 1
+72 3398 1
+72 3399 1
+72 3400 1
+72 3401 1
+72 3402 1
+72 3407 1
+72 3408 1
+72 3409 1
+72 3410 1
+72 3418 1
+72 3419 1
+72 3420 1
+72 3421 1
+72 3423 1
+72 3425 1
+72 3426 1
+72 3427 1
+72 3428 1
+72 3430 1
+72 3432 1
+73 18 1
+73 46 1
+73 67 1
+73 87 1
+73 91 1
+73 95 1
+73 96 1
+73 97 1
+73 130 1
+73 151 1
+73 171 1
+73 175 1
+73 179 1
+73 180 1
+73 181 1
+73 207 1
+73 227 1
+73 231 1
+73 235 1
+73 236 1
+73 237 1
+73 262 1
+73 266 1
+73 270 1
+73 271 1
+73 272 1
+73 296 1
+73 300 1
+73 301 1
+73 302 1
+73 306 1
+73 307 1
+73 308 1
+73 312 1
+73 313 1
+73 314 1
+73 340 1
+73 361 1
+73 381 1
+73 385 1
+73 389 1
+73 390 1
+73 391 1
+73 417 1
+73 437 1
+73 441 1
+73 445 1
+73 446 1
+73 447 1
+73 472 1
+73 476 1
+73 480 1
+73 481 1
+73 482 1
+73 506 1
+73 510 1
+73 511 1
+73 512 1
+73 516 1
+73 517 1
+73 518 1
+73 522 1
+73 523 1
+73 524 1
+73 543 1
+73 563 1
+73 567 1
+73 571 1
+73 572 1
+73 573 1
+73 598 1
+73 602 1
+73 606 1
+73 607 1
+73 608 1
+73 632 1
+73 636 1
+73 637 1
+73 638 1
+73 642 1
+73 643 1
+73 644 1
+73 648 1
+73 649 1
+73 650 1
+73 668 1
+73 672 1
+73 676 1
+73 677 1
+73 678 1
+73 702 1
+73 706 1
+73 707 1
+73 708 1
+73 712 1
+73 713 1
+73 714 1
+73 718 1
+73 719 1
+73 720 1
+73 737 1
+73 741 1
+73 742 1
+73 743 1
+73 747 1
+73 748 1
+73 749 1
+73 753 1
+73 754 1
+73 755 1
+73 772 1
+73 773 1
+73 774 1
+73 778 1
+73 779 1
+73 780 1
+73 782 1
+73 783 1
+73 784 1
+73 786 1
+73 802 1
+73 823 1
+73 843 1
+73 847 1
+73 851 1
+73 852 1
+73 853 1
+73 879 1
+73 899 1
+73 903 1
+73 907 1
+73 908 1
+73 909 1
+73 934 1
+73 938 1
+73 942 1
+73 943 1
+73 944 1
+73 968 1
+73 972 1
+73 973 1
+73 974 1
+73 978 1
+73 979 1
+73 980 1
+73 984 1
+73 985 1
+73 986 1
+73 1005 1
+73 1025 1
+73 1029 1
+73 1033 1
+73 1034 1
+73 1035 1
+73 1060 1
+73 1064 1
+73 1068 1
+73 1069 1
+73 1070 1
+73 1094 1
+73 1098 1
+73 1099 1
+73 1100 1
+73 1104 1
+73 1105 1
+73 1106 1
+73 1110 1
+73 1111 1
+73 1112 1
+73 1130 1
+73 1134 1
+73 1138 1
+73 1139 1
+73 1140 1
+73 1164 1
+73 1168 1
+73 1169 1
+73 1170 1
+73 1174 1
+73 1175 1
+73 1176 1
+73 1180 1
+73 1181 1
+73 1182 1
+73 1199 1
+73 1203 1
+73 1204 1
+73 1205 1
+73 1209 1
+73 1210 1
+73 1211 1
+73 1215 1
+73 1216 1
+73 1217 1
+73 1234 1
+73 1235 1
+73 1236 1
+73 1240 1
+73 1241 1
+73 1242 1
+73 1244 1
+73 1245 1
+73 1246 1
+73 1248 1
+73 1257 1
+73 1277 1
+73 1281 1
+73 1285 1
+73 1286 1
+73 1287 1
+73 1312 1
+73 1316 1
+73 1320 1
+73 1321 1
+73 1322 1
+73 1346 1
+73 1350 1
+73 1351 1
+73 1352 1
+73 1356 1
+73 1357 1
+73 1358 1
+73 1362 1
+73 1363 1
+73 1364 1
+73 1382 1
+73 1386 1
+73 1390 1
+73 1391 1
+73 1392 1
+73 1416 1
+73 1420 1
+73 1421 1
+73 1422 1
+73 1426 1
+73 1427 1
+73 1428 1
+73 1432 1
+73 1433 1
+73 1434 1
+73 1451 1
+73 1455 1
+73 1456 1
+73 1457 1
+73 1461 1
+73 1462 1
+73 1463 1
+73 1467 1
+73 1468 1
+73 1469 1
+73 1486 1
+73 1487 1
+73 1488 1
+73 1492 1
+73 1493 1
+73 1494 1
+73 1496 1
+73 1497 1
+73 1498 1
+73 1500 1
+73 1508 1
+73 1512 1
+73 1516 1
+73 1517 1
+73 1518 1
+73 1542 1
+73 1546 1
+73 1547 1
+73 1548 1
+73 1552 1
+73 1553 1
+73 1554 1
+73 1558 1
+73 1559 1
+73 1560 1
+73 1577 1
+73 1581 1
+73 1582 1
+73 1583 1
+73 1587 1
+73 1588 1
+73 1589 1
+73 1593 1
+73 1594 1
+73 1595 1
+73 1612 1
+73 1613 1
+73 1614 1
+73 1618 1
+73 1619 1
+73 1620 1
+73 1622 1
+73 1623 1
+73 1624 1
+73 1626 1
+73 1633 1
+73 1637 1
+73 1638 1
+73 1639 1
+73 1643 1
+73 1644 1
+73 1645 1
+73 1649 1
+73 1650 1
+73 1651 1
+73 1668 1
+73 1669 1
+73 1670 1
+73 1674 1
+73 1675 1
+73 1676 1
+73 1678 1
+73 1679 1
+73 1680 1
+73 1682 1
+73 1689 1
+73 1690 1
+73 1691 1
+73 1695 1
+73 1696 1
+73 1697 1
+73 1699 1
+73 1700 1
+73 1701 1
+73 1703 1
+73 1710 1
+73 1711 1
+73 1712 1
+73 1714 1
+73 1715 1
+73 1726 1
+73 1747 1
+73 1767 1
+73 1771 1
+73 1775 1
+73 1776 1
+73 1777 1
+73 1803 1
+73 1823 1
+73 1827 1
+73 1831 1
+73 1832 1
+73 1833 1
+73 1858 1
+73 1862 1
+73 1866 1
+73 1867 1
+73 1868 1
+73 1892 1
+73 1896 1
+73 1897 1
+73 1898 1
+73 1902 1
+73 1903 1
+73 1904 1
+73 1908 1
+73 1909 1
+73 1910 1
+73 1929 1
+73 1949 1
+73 1953 1
+73 1957 1
+73 1958 1
+73 1959 1
+73 1984 1
+73 1988 1
+73 1992 1
+73 1993 1
+73 1994 1
+73 2018 1
+73 2022 1
+73 2023 1
+73 2024 1
+73 2028 1
+73 2029 1
+73 2030 1
+73 2034 1
+73 2035 1
+73 2036 1
+73 2054 1
+73 2058 1
+73 2062 1
+73 2063 1
+73 2064 1
+73 2088 1
+73 2092 1
+73 2093 1
+73 2094 1
+73 2098 1
+73 2099 1
+73 2100 1
+73 2104 1
+73 2105 1
+73 2106 1
+73 2123 1
+73 2127 1
+73 2128 1
+73 2129 1
+73 2133 1
+73 2134 1
+73 2135 1
+73 2139 1
+73 2140 1
+73 2141 1
+73 2158 1
+73 2159 1
+73 2160 1
+73 2164 1
+73 2165 1
+73 2166 1
+73 2168 1
+73 2169 1
+73 2170 1
+73 2172 1
+73 2181 1
+73 2201 1
+73 2205 1
+73 2209 1
+73 2210 1
+73 2211 1
+73 2236 1
+73 2240 1
+73 2244 1
+73 2245 1
+73 2246 1
+73 2270 1
+73 2274 1
+73 2275 1
+73 2276 1
+73 2280 1
+73 2281 1
+73 2282 1
+73 2286 1
+73 2287 1
+73 2288 1
+73 2306 1
+73 2310 1
+73 2314 1
+73 2315 1
+73 2316 1
+73 2340 1
+73 2344 1
+73 2345 1
+73 2346 1
+73 2350 1
+73 2351 1
+73 2352 1
+73 2356 1
+73 2357 1
+73 2358 1
+73 2375 1
+73 2379 1
+73 2380 1
+73 2381 1
+73 2385 1
+73 2386 1
+73 2387 1
+73 2391 1
+73 2392 1
+73 2393 1
+73 2410 1
+73 2411 1
+73 2412 1
+73 2416 1
+73 2417 1
+73 2418 1
+73 2420 1
+73 2421 1
+73 2422 1
+73 2424 1
+73 2432 1
+73 2436 1
+73 2440 1
+73 2441 1
+73 2442 1
+73 2466 1
+73 2470 1
+73 2471 1
+73 2472 1
+73 2476 1
+73 2477 1
+73 2478 1
+73 2482 1
+73 2483 1
+73 2484 1
+73 2501 1
+73 2505 1
+73 2506 1
+73 2507 1
+73 2511 1
+73 2512 1
+73 2513 1
+73 2517 1
+73 2518 1
+73 2519 1
+73 2536 1
+73 2537 1
+73 2538 1
+73 2542 1
+73 2543 1
+73 2544 1
+73 2546 1
+73 2547 1
+73 2548 1
+73 2550 1
+73 2557 1
+73 2561 1
+73 2562 1
+73 2563 1
+73 2567 1
+73 2568 1
+73 2569 1
+73 2573 1
+73 2574 1
+73 2575 1
+73 2592 1
+73 2593 1
+73 2594 1
+73 2598 1
+73 2599 1
+73 2600 1
+73 2602 1
+73 2603 1
+73 2604 1
+73 2606 1
+73 2613 1
+73 2614 1
+73 2615 1
+73 2619 1
+73 2620 1
+73 2621 1
+73 2623 1
+73 2624 1
+73 2625 1
+73 2627 1
+73 2634 1
+73 2635 1
+73 2636 1
+73 2638 1
+73 2639 1
+73 2643 1
+73 2663 1
+73 2667 1
+73 2671 1
+73 2672 1
+73 2673 1
+73 2698 1
+73 2702 1
+73 2706 1
+73 2707 1
+73 2708 1
+73 2732 1
+73 2736 1
+73 2737 1
+73 2738 1
+73 2742 1
+73 2743 1
+73 2744 1
+73 2748 1
+73 2749 1
+73 2750 1
+73 2768 1
+73 2772 1
+73 2776 1
+73 2777 1
+73 2778 1
+73 2802 1
+73 2806 1
+73 2807 1
+73 2808 1
+73 2812 1
+73 2813 1
+73 2814 1
+73 2818 1
+73 2819 1
+73 2820 1
+73 2837 1
+73 2841 1
+73 2842 1
+73 2843 1
+73 2847 1
+73 2848 1
+73 2849 1
+73 2853 1
+73 2854 1
+73 2855 1
+73 2872 1
+73 2873 1
+73 2874 1
+73 2878 1
+73 2879 1
+73 2880 1
+73 2882 1
+73 2883 1
+73 2884 1
+73 2886 1
+73 2894 1
+73 2898 1
+73 2902 1
+73 2903 1
+73 2904 1
+73 2928 1
+73 2932 1
+73 2933 1
+73 2934 1
+73 2938 1
+73 2939 1
+73 2940 1
+73 2944 1
+73 2945 1
+73 2946 1
+73 2963 1
+73 2967 1
+73 2968 1
+73 2969 1
+73 2973 1
+73 2974 1
+73 2975 1
+73 2979 1
+73 2980 1
+73 2981 1
+73 2998 1
+73 2999 1
+73 3000 1
+73 3004 1
+73 3005 1
+73 3006 1
+73 3008 1
+73 3009 1
+73 3010 1
+73 3012 1
+73 3019 1
+73 3023 1
+73 3024 1
+73 3025 1
+73 3029 1
+73 3030 1
+73 3031 1
+73 3035 1
+73 3036 1
+73 3037 1
+73 3054 1
+73 3055 1
+73 3056 1
+73 3060 1
+73 3061 1
+73 3062 1
+73 3064 1
+73 3065 1
+73 3066 1
+73 3068 1
+73 3075 1
+73 3076 1
+73 3077 1
+73 3081 1
+73 3082 1
+73 3083 1
+73 3085 1
+73 3086 1
+73 3087 1
+73 3089 1
+73 3096 1
+73 3097 1
+73 3098 1
+73 3100 1
+73 3101 1
+73 3104 1
+73 3108 1
+73 3112 1
+73 3113 1
+73 3114 1
+73 3138 1
+73 3142 1
+73 3143 1
+73 3144 1
+73 3148 1
+73 3149 1
+73 3150 1
+73 3154 1
+73 3155 1
+73 3156 1
+73 3173 1
+73 3177 1
+73 3178 1
+73 3179 1
+73 3183 1
+73 3184 1
+73 3185 1
+73 3189 1
+73 3190 1
+73 3191 1
+73 3208 1
+73 3209 1
+73 3210 1
+73 3214 1
+73 3215 1
+73 3216 1
+73 3218 1
+73 3219 1
+73 3220 1
+73 3222 1
+73 3229 1
+73 3233 1
+73 3234 1
+73 3235 1
+73 3239 1
+73 3240 1
+73 3241 1
+73 3245 1
+73 3246 1
+73 3247 1
+73 3264 1
+73 3265 1
+73 3266 1
+73 3270 1
+73 3271 1
+73 3272 1
+73 3274 1
+73 3275 1
+73 3276 1
+73 3278 1
+73 3285 1
+73 3286 1
+73 3287 1
+73 3291 1
+73 3292 1
+73 3293 1
+73 3295 1
+73 3296 1
+73 3297 1
+73 3299 1
+73 3306 1
+73 3307 1
+73 3308 1
+73 3310 1
+73 3311 1
+73 3313 1
+73 3317 1
+73 3318 1
+73 3319 1
+73 3323 1
+73 3324 1
+73 3325 1
+73 3329 1
+73 3330 1
+73 3331 1
+73 3348 1
+73 3349 1
+73 3350 1
+73 3354 1
+73 3355 1
+73 3356 1
+73 3358 1
+73 3359 1
+73 3360 1
+73 3362 1
+73 3369 1
+73 3370 1
+73 3371 1
+73 3375 1
+73 3376 1
+73 3377 1
+73 3379 1
+73 3380 1
+73 3381 1
+73 3383 1
+73 3390 1
+73 3391 1
+73 3392 1
+73 3394 1
+73 3395 1
+73 3397 1
+73 3398 1
+73 3399 1
+73 3403 1
+73 3404 1
+73 3405 1
+73 3407 1
+73 3408 1
+73 3409 1
+73 3411 1
+73 3418 1
+73 3419 1
+73 3420 1
+73 3422 1
+73 3423 1
+73 3425 1
+73 3426 1
+73 3427 1
+73 3429 1
+73 3430 1
+73 3432 1
+74 19 1
+74 47 1
+74 68 1
+74 88 1
+74 92 1
+74 95 1
+74 98 1
+74 99 1
+74 131 1
+74 152 1
+74 172 1
+74 176 1
+74 179 1
+74 182 1
+74 183 1
+74 208 1
+74 228 1
+74 232 1
+74 235 1
+74 238 1
+74 239 1
+74 263 1
+74 267 1
+74 270 1
+74 273 1
+74 274 1
+74 297 1
+74 300 1
+74 303 1
+74 304 1
+74 306 1
+74 309 1
+74 310 1
+74 312 1
+74 313 1
+74 315 1
+74 341 1
+74 362 1
+74 382 1
+74 386 1
+74 389 1
+74 392 1
+74 393 1
+74 418 1
+74 438 1
+74 442 1
+74 445 1
+74 448 1
+74 449 1
+74 473 1
+74 477 1
+74 480 1
+74 483 1
+74 484 1
+74 507 1
+74 510 1
+74 513 1
+74 514 1
+74 516 1
+74 519 1
+74 520 1
+74 522 1
+74 523 1
+74 525 1
+74 544 1
+74 564 1
+74 568 1
+74 571 1
+74 574 1
+74 575 1
+74 599 1
+74 603 1
+74 606 1
+74 609 1
+74 610 1
+74 633 1
+74 636 1
+74 639 1
+74 640 1
+74 642 1
+74 645 1
+74 646 1
+74 648 1
+74 649 1
+74 651 1
+74 669 1
+74 673 1
+74 676 1
+74 679 1
+74 680 1
+74 703 1
+74 706 1
+74 709 1
+74 710 1
+74 712 1
+74 715 1
+74 716 1
+74 718 1
+74 719 1
+74 721 1
+74 738 1
+74 741 1
+74 744 1
+74 745 1
+74 747 1
+74 750 1
+74 751 1
+74 753 1
+74 754 1
+74 756 1
+74 772 1
+74 775 1
+74 776 1
+74 778 1
+74 779 1
+74 781 1
+74 782 1
+74 783 1
+74 785 1
+74 786 1
+74 803 1
+74 824 1
+74 844 1
+74 848 1
+74 851 1
+74 854 1
+74 855 1
+74 880 1
+74 900 1
+74 904 1
+74 907 1
+74 910 1
+74 911 1
+74 935 1
+74 939 1
+74 942 1
+74 945 1
+74 946 1
+74 969 1
+74 972 1
+74 975 1
+74 976 1
+74 978 1
+74 981 1
+74 982 1
+74 984 1
+74 985 1
+74 987 1
+74 1006 1
+74 1026 1
+74 1030 1
+74 1033 1
+74 1036 1
+74 1037 1
+74 1061 1
+74 1065 1
+74 1068 1
+74 1071 1
+74 1072 1
+74 1095 1
+74 1098 1
+74 1101 1
+74 1102 1
+74 1104 1
+74 1107 1
+74 1108 1
+74 1110 1
+74 1111 1
+74 1113 1
+74 1131 1
+74 1135 1
+74 1138 1
+74 1141 1
+74 1142 1
+74 1165 1
+74 1168 1
+74 1171 1
+74 1172 1
+74 1174 1
+74 1177 1
+74 1178 1
+74 1180 1
+74 1181 1
+74 1183 1
+74 1200 1
+74 1203 1
+74 1206 1
+74 1207 1
+74 1209 1
+74 1212 1
+74 1213 1
+74 1215 1
+74 1216 1
+74 1218 1
+74 1234 1
+74 1237 1
+74 1238 1
+74 1240 1
+74 1241 1
+74 1243 1
+74 1244 1
+74 1245 1
+74 1247 1
+74 1248 1
+74 1258 1
+74 1278 1
+74 1282 1
+74 1285 1
+74 1288 1
+74 1289 1
+74 1313 1
+74 1317 1
+74 1320 1
+74 1323 1
+74 1324 1
+74 1347 1
+74 1350 1
+74 1353 1
+74 1354 1
+74 1356 1
+74 1359 1
+74 1360 1
+74 1362 1
+74 1363 1
+74 1365 1
+74 1383 1
+74 1387 1
+74 1390 1
+74 1393 1
+74 1394 1
+74 1417 1
+74 1420 1
+74 1423 1
+74 1424 1
+74 1426 1
+74 1429 1
+74 1430 1
+74 1432 1
+74 1433 1
+74 1435 1
+74 1452 1
+74 1455 1
+74 1458 1
+74 1459 1
+74 1461 1
+74 1464 1
+74 1465 1
+74 1467 1
+74 1468 1
+74 1470 1
+74 1486 1
+74 1489 1
+74 1490 1
+74 1492 1
+74 1493 1
+74 1495 1
+74 1496 1
+74 1497 1
+74 1499 1
+74 1500 1
+74 1509 1
+74 1513 1
+74 1516 1
+74 1519 1
+74 1520 1
+74 1543 1
+74 1546 1
+74 1549 1
+74 1550 1
+74 1552 1
+74 1555 1
+74 1556 1
+74 1558 1
+74 1559 1
+74 1561 1
+74 1578 1
+74 1581 1
+74 1584 1
+74 1585 1
+74 1587 1
+74 1590 1
+74 1591 1
+74 1593 1
+74 1594 1
+74 1596 1
+74 1612 1
+74 1615 1
+74 1616 1
+74 1618 1
+74 1619 1
+74 1621 1
+74 1622 1
+74 1623 1
+74 1625 1
+74 1626 1
+74 1634 1
+74 1637 1
+74 1640 1
+74 1641 1
+74 1643 1
+74 1646 1
+74 1647 1
+74 1649 1
+74 1650 1
+74 1652 1
+74 1668 1
+74 1671 1
+74 1672 1
+74 1674 1
+74 1675 1
+74 1677 1
+74 1678 1
+74 1679 1
+74 1681 1
+74 1682 1
+74 1689 1
+74 1692 1
+74 1693 1
+74 1695 1
+74 1696 1
+74 1698 1
+74 1699 1
+74 1700 1
+74 1702 1
+74 1703 1
+74 1710 1
+74 1711 1
+74 1713 1
+74 1714 1
+74 1715 1
+74 1727 1
+74 1748 1
+74 1768 1
+74 1772 1
+74 1775 1
+74 1778 1
+74 1779 1
+74 1804 1
+74 1824 1
+74 1828 1
+74 1831 1
+74 1834 1
+74 1835 1
+74 1859 1
+74 1863 1
+74 1866 1
+74 1869 1
+74 1870 1
+74 1893 1
+74 1896 1
+74 1899 1
+74 1900 1
+74 1902 1
+74 1905 1
+74 1906 1
+74 1908 1
+74 1909 1
+74 1911 1
+74 1930 1
+74 1950 1
+74 1954 1
+74 1957 1
+74 1960 1
+74 1961 1
+74 1985 1
+74 1989 1
+74 1992 1
+74 1995 1
+74 1996 1
+74 2019 1
+74 2022 1
+74 2025 1
+74 2026 1
+74 2028 1
+74 2031 1
+74 2032 1
+74 2034 1
+74 2035 1
+74 2037 1
+74 2055 1
+74 2059 1
+74 2062 1
+74 2065 1
+74 2066 1
+74 2089 1
+74 2092 1
+74 2095 1
+74 2096 1
+74 2098 1
+74 2101 1
+74 2102 1
+74 2104 1
+74 2105 1
+74 2107 1
+74 2124 1
+74 2127 1
+74 2130 1
+74 2131 1
+74 2133 1
+74 2136 1
+74 2137 1
+74 2139 1
+74 2140 1
+74 2142 1
+74 2158 1
+74 2161 1
+74 2162 1
+74 2164 1
+74 2165 1
+74 2167 1
+74 2168 1
+74 2169 1
+74 2171 1
+74 2172 1
+74 2182 1
+74 2202 1
+74 2206 1
+74 2209 1
+74 2212 1
+74 2213 1
+74 2237 1
+74 2241 1
+74 2244 1
+74 2247 1
+74 2248 1
+74 2271 1
+74 2274 1
+74 2277 1
+74 2278 1
+74 2280 1
+74 2283 1
+74 2284 1
+74 2286 1
+74 2287 1
+74 2289 1
+74 2307 1
+74 2311 1
+74 2314 1
+74 2317 1
+74 2318 1
+74 2341 1
+74 2344 1
+74 2347 1
+74 2348 1
+74 2350 1
+74 2353 1
+74 2354 1
+74 2356 1
+74 2357 1
+74 2359 1
+74 2376 1
+74 2379 1
+74 2382 1
+74 2383 1
+74 2385 1
+74 2388 1
+74 2389 1
+74 2391 1
+74 2392 1
+74 2394 1
+74 2410 1
+74 2413 1
+74 2414 1
+74 2416 1
+74 2417 1
+74 2419 1
+74 2420 1
+74 2421 1
+74 2423 1
+74 2424 1
+74 2433 1
+74 2437 1
+74 2440 1
+74 2443 1
+74 2444 1
+74 2467 1
+74 2470 1
+74 2473 1
+74 2474 1
+74 2476 1
+74 2479 1
+74 2480 1
+74 2482 1
+74 2483 1
+74 2485 1
+74 2502 1
+74 2505 1
+74 2508 1
+74 2509 1
+74 2511 1
+74 2514 1
+74 2515 1
+74 2517 1
+74 2518 1
+74 2520 1
+74 2536 1
+74 2539 1
+74 2540 1
+74 2542 1
+74 2543 1
+74 2545 1
+74 2546 1
+74 2547 1
+74 2549 1
+74 2550 1
+74 2558 1
+74 2561 1
+74 2564 1
+74 2565 1
+74 2567 1
+74 2570 1
+74 2571 1
+74 2573 1
+74 2574 1
+74 2576 1
+74 2592 1
+74 2595 1
+74 2596 1
+74 2598 1
+74 2599 1
+74 2601 1
+74 2602 1
+74 2603 1
+74 2605 1
+74 2606 1
+74 2613 1
+74 2616 1
+74 2617 1
+74 2619 1
+74 2620 1
+74 2622 1
+74 2623 1
+74 2624 1
+74 2626 1
+74 2627 1
+74 2634 1
+74 2635 1
+74 2637 1
+74 2638 1
+74 2639 1
+74 2644 1
+74 2664 1
+74 2668 1
+74 2671 1
+74 2674 1
+74 2675 1
+74 2699 1
+74 2703 1
+74 2706 1
+74 2709 1
+74 2710 1
+74 2733 1
+74 2736 1
+74 2739 1
+74 2740 1
+74 2742 1
+74 2745 1
+74 2746 1
+74 2748 1
+74 2749 1
+74 2751 1
+74 2769 1
+74 2773 1
+74 2776 1
+74 2779 1
+74 2780 1
+74 2803 1
+74 2806 1
+74 2809 1
+74 2810 1
+74 2812 1
+74 2815 1
+74 2816 1
+74 2818 1
+74 2819 1
+74 2821 1
+74 2838 1
+74 2841 1
+74 2844 1
+74 2845 1
+74 2847 1
+74 2850 1
+74 2851 1
+74 2853 1
+74 2854 1
+74 2856 1
+74 2872 1
+74 2875 1
+74 2876 1
+74 2878 1
+74 2879 1
+74 2881 1
+74 2882 1
+74 2883 1
+74 2885 1
+74 2886 1
+74 2895 1
+74 2899 1
+74 2902 1
+74 2905 1
+74 2906 1
+74 2929 1
+74 2932 1
+74 2935 1
+74 2936 1
+74 2938 1
+74 2941 1
+74 2942 1
+74 2944 1
+74 2945 1
+74 2947 1
+74 2964 1
+74 2967 1
+74 2970 1
+74 2971 1
+74 2973 1
+74 2976 1
+74 2977 1
+74 2979 1
+74 2980 1
+74 2982 1
+74 2998 1
+74 3001 1
+74 3002 1
+74 3004 1
+74 3005 1
+74 3007 1
+74 3008 1
+74 3009 1
+74 3011 1
+74 3012 1
+74 3020 1
+74 3023 1
+74 3026 1
+74 3027 1
+74 3029 1
+74 3032 1
+74 3033 1
+74 3035 1
+74 3036 1
+74 3038 1
+74 3054 1
+74 3057 1
+74 3058 1
+74 3060 1
+74 3061 1
+74 3063 1
+74 3064 1
+74 3065 1
+74 3067 1
+74 3068 1
+74 3075 1
+74 3078 1
+74 3079 1
+74 3081 1
+74 3082 1
+74 3084 1
+74 3085 1
+74 3086 1
+74 3088 1
+74 3089 1
+74 3096 1
+74 3097 1
+74 3099 1
+74 3100 1
+74 3101 1
+74 3105 1
+74 3109 1
+74 3112 1
+74 3115 1
+74 3116 1
+74 3139 1
+74 3142 1
+74 3145 1
+74 3146 1
+74 3148 1
+74 3151 1
+74 3152 1
+74 3154 1
+74 3155 1
+74 3157 1
+74 3174 1
+74 3177 1
+74 3180 1
+74 3181 1
+74 3183 1
+74 3186 1
+74 3187 1
+74 3189 1
+74 3190 1
+74 3192 1
+74 3208 1
+74 3211 1
+74 3212 1
+74 3214 1
+74 3215 1
+74 3217 1
+74 3218 1
+74 3219 1
+74 3221 1
+74 3222 1
+74 3230 1
+74 3233 1
+74 3236 1
+74 3237 1
+74 3239 1
+74 3242 1
+74 3243 1
+74 3245 1
+74 3246 1
+74 3248 1
+74 3264 1
+74 3267 1
+74 3268 1
+74 3270 1
+74 3271 1
+74 3273 1
+74 3274 1
+74 3275 1
+74 3277 1
+74 3278 1
+74 3285 1
+74 3288 1
+74 3289 1
+74 3291 1
+74 3292 1
+74 3294 1
+74 3295 1
+74 3296 1
+74 3298 1
+74 3299 1
+74 3306 1
+74 3307 1
+74 3309 1
+74 3310 1
+74 3311 1
+74 3314 1
+74 3317 1
+74 3320 1
+74 3321 1
+74 3323 1
+74 3326 1
+74 3327 1
+74 3329 1
+74 3330 1
+74 3332 1
+74 3348 1
+74 3351 1
+74 3352 1
+74 3354 1
+74 3355 1
+74 3357 1
+74 3358 1
+74 3359 1
+74 3361 1
+74 3362 1
+74 3369 1
+74 3372 1
+74 3373 1
+74 3375 1
+74 3376 1
+74 3378 1
+74 3379 1
+74 3380 1
+74 3382 1
+74 3383 1
+74 3390 1
+74 3391 1
+74 3393 1
+74 3394 1
+74 3395 1
+74 3397 1
+74 3400 1
+74 3401 1
+74 3403 1
+74 3404 1
+74 3406 1
+74 3407 1
+74 3408 1
+74 3410 1
+74 3411 1
+74 3418 1
+74 3419 1
+74 3421 1
+74 3422 1
+74 3423 1
+74 3425 1
+74 3426 1
+74 3428 1
+74 3429 1
+74 3430 1
+74 3432 1
+75 20 1
+75 48 1
+75 69 1
+75 89 1
+75 93 1
+75 96 1
+75 98 1
+75 100 1
+75 132 1
+75 153 1
+75 173 1
+75 177 1
+75 180 1
+75 182 1
+75 184 1
+75 209 1
+75 229 1
+75 233 1
+75 236 1
+75 238 1
+75 240 1
+75 264 1
+75 268 1
+75 271 1
+75 273 1
+75 275 1
+75 298 1
+75 301 1
+75 303 1
+75 305 1
+75 307 1
+75 309 1
+75 311 1
+75 312 1
+75 314 1
+75 315 1
+75 342 1
+75 363 1
+75 383 1
+75 387 1
+75 390 1
+75 392 1
+75 394 1
+75 419 1
+75 439 1
+75 443 1
+75 446 1
+75 448 1
+75 450 1
+75 474 1
+75 478 1
+75 481 1
+75 483 1
+75 485 1
+75 508 1
+75 511 1
+75 513 1
+75 515 1
+75 517 1
+75 519 1
+75 521 1
+75 522 1
+75 524 1
+75 525 1
+75 545 1
+75 565 1
+75 569 1
+75 572 1
+75 574 1
+75 576 1
+75 600 1
+75 604 1
+75 607 1
+75 609 1
+75 611 1
+75 634 1
+75 637 1
+75 639 1
+75 641 1
+75 643 1
+75 645 1
+75 647 1
+75 648 1
+75 650 1
+75 651 1
+75 670 1
+75 674 1
+75 677 1
+75 679 1
+75 681 1
+75 704 1
+75 707 1
+75 709 1
+75 711 1
+75 713 1
+75 715 1
+75 717 1
+75 718 1
+75 720 1
+75 721 1
+75 739 1
+75 742 1
+75 744 1
+75 746 1
+75 748 1
+75 750 1
+75 752 1
+75 753 1
+75 755 1
+75 756 1
+75 773 1
+75 775 1
+75 777 1
+75 778 1
+75 780 1
+75 781 1
+75 782 1
+75 784 1
+75 785 1
+75 786 1
+75 804 1
+75 825 1
+75 845 1
+75 849 1
+75 852 1
+75 854 1
+75 856 1
+75 881 1
+75 901 1
+75 905 1
+75 908 1
+75 910 1
+75 912 1
+75 936 1
+75 940 1
+75 943 1
+75 945 1
+75 947 1
+75 970 1
+75 973 1
+75 975 1
+75 977 1
+75 979 1
+75 981 1
+75 983 1
+75 984 1
+75 986 1
+75 987 1
+75 1007 1
+75 1027 1
+75 1031 1
+75 1034 1
+75 1036 1
+75 1038 1
+75 1062 1
+75 1066 1
+75 1069 1
+75 1071 1
+75 1073 1
+75 1096 1
+75 1099 1
+75 1101 1
+75 1103 1
+75 1105 1
+75 1107 1
+75 1109 1
+75 1110 1
+75 1112 1
+75 1113 1
+75 1132 1
+75 1136 1
+75 1139 1
+75 1141 1
+75 1143 1
+75 1166 1
+75 1169 1
+75 1171 1
+75 1173 1
+75 1175 1
+75 1177 1
+75 1179 1
+75 1180 1
+75 1182 1
+75 1183 1
+75 1201 1
+75 1204 1
+75 1206 1
+75 1208 1
+75 1210 1
+75 1212 1
+75 1214 1
+75 1215 1
+75 1217 1
+75 1218 1
+75 1235 1
+75 1237 1
+75 1239 1
+75 1240 1
+75 1242 1
+75 1243 1
+75 1244 1
+75 1246 1
+75 1247 1
+75 1248 1
+75 1259 1
+75 1279 1
+75 1283 1
+75 1286 1
+75 1288 1
+75 1290 1
+75 1314 1
+75 1318 1
+75 1321 1
+75 1323 1
+75 1325 1
+75 1348 1
+75 1351 1
+75 1353 1
+75 1355 1
+75 1357 1
+75 1359 1
+75 1361 1
+75 1362 1
+75 1364 1
+75 1365 1
+75 1384 1
+75 1388 1
+75 1391 1
+75 1393 1
+75 1395 1
+75 1418 1
+75 1421 1
+75 1423 1
+75 1425 1
+75 1427 1
+75 1429 1
+75 1431 1
+75 1432 1
+75 1434 1
+75 1435 1
+75 1453 1
+75 1456 1
+75 1458 1
+75 1460 1
+75 1462 1
+75 1464 1
+75 1466 1
+75 1467 1
+75 1469 1
+75 1470 1
+75 1487 1
+75 1489 1
+75 1491 1
+75 1492 1
+75 1494 1
+75 1495 1
+75 1496 1
+75 1498 1
+75 1499 1
+75 1500 1
+75 1510 1
+75 1514 1
+75 1517 1
+75 1519 1
+75 1521 1
+75 1544 1
+75 1547 1
+75 1549 1
+75 1551 1
+75 1553 1
+75 1555 1
+75 1557 1
+75 1558 1
+75 1560 1
+75 1561 1
+75 1579 1
+75 1582 1
+75 1584 1
+75 1586 1
+75 1588 1
+75 1590 1
+75 1592 1
+75 1593 1
+75 1595 1
+75 1596 1
+75 1613 1
+75 1615 1
+75 1617 1
+75 1618 1
+75 1620 1
+75 1621 1
+75 1622 1
+75 1624 1
+75 1625 1
+75 1626 1
+75 1635 1
+75 1638 1
+75 1640 1
+75 1642 1
+75 1644 1
+75 1646 1
+75 1648 1
+75 1649 1
+75 1651 1
+75 1652 1
+75 1669 1
+75 1671 1
+75 1673 1
+75 1674 1
+75 1676 1
+75 1677 1
+75 1678 1
+75 1680 1
+75 1681 1
+75 1682 1
+75 1690 1
+75 1692 1
+75 1694 1
+75 1695 1
+75 1697 1
+75 1698 1
+75 1699 1
+75 1701 1
+75 1702 1
+75 1703 1
+75 1710 1
+75 1712 1
+75 1713 1
+75 1714 1
+75 1715 1
+75 1728 1
+75 1749 1
+75 1769 1
+75 1773 1
+75 1776 1
+75 1778 1
+75 1780 1
+75 1805 1
+75 1825 1
+75 1829 1
+75 1832 1
+75 1834 1
+75 1836 1
+75 1860 1
+75 1864 1
+75 1867 1
+75 1869 1
+75 1871 1
+75 1894 1
+75 1897 1
+75 1899 1
+75 1901 1
+75 1903 1
+75 1905 1
+75 1907 1
+75 1908 1
+75 1910 1
+75 1911 1
+75 1931 1
+75 1951 1
+75 1955 1
+75 1958 1
+75 1960 1
+75 1962 1
+75 1986 1
+75 1990 1
+75 1993 1
+75 1995 1
+75 1997 1
+75 2020 1
+75 2023 1
+75 2025 1
+75 2027 1
+75 2029 1
+75 2031 1
+75 2033 1
+75 2034 1
+75 2036 1
+75 2037 1
+75 2056 1
+75 2060 1
+75 2063 1
+75 2065 1
+75 2067 1
+75 2090 1
+75 2093 1
+75 2095 1
+75 2097 1
+75 2099 1
+75 2101 1
+75 2103 1
+75 2104 1
+75 2106 1
+75 2107 1
+75 2125 1
+75 2128 1
+75 2130 1
+75 2132 1
+75 2134 1
+75 2136 1
+75 2138 1
+75 2139 1
+75 2141 1
+75 2142 1
+75 2159 1
+75 2161 1
+75 2163 1
+75 2164 1
+75 2166 1
+75 2167 1
+75 2168 1
+75 2170 1
+75 2171 1
+75 2172 1
+75 2183 1
+75 2203 1
+75 2207 1
+75 2210 1
+75 2212 1
+75 2214 1
+75 2238 1
+75 2242 1
+75 2245 1
+75 2247 1
+75 2249 1
+75 2272 1
+75 2275 1
+75 2277 1
+75 2279 1
+75 2281 1
+75 2283 1
+75 2285 1
+75 2286 1
+75 2288 1
+75 2289 1
+75 2308 1
+75 2312 1
+75 2315 1
+75 2317 1
+75 2319 1
+75 2342 1
+75 2345 1
+75 2347 1
+75 2349 1
+75 2351 1
+75 2353 1
+75 2355 1
+75 2356 1
+75 2358 1
+75 2359 1
+75 2377 1
+75 2380 1
+75 2382 1
+75 2384 1
+75 2386 1
+75 2388 1
+75 2390 1
+75 2391 1
+75 2393 1
+75 2394 1
+75 2411 1
+75 2413 1
+75 2415 1
+75 2416 1
+75 2418 1
+75 2419 1
+75 2420 1
+75 2422 1
+75 2423 1
+75 2424 1
+75 2434 1
+75 2438 1
+75 2441 1
+75 2443 1
+75 2445 1
+75 2468 1
+75 2471 1
+75 2473 1
+75 2475 1
+75 2477 1
+75 2479 1
+75 2481 1
+75 2482 1
+75 2484 1
+75 2485 1
+75 2503 1
+75 2506 1
+75 2508 1
+75 2510 1
+75 2512 1
+75 2514 1
+75 2516 1
+75 2517 1
+75 2519 1
+75 2520 1
+75 2537 1
+75 2539 1
+75 2541 1
+75 2542 1
+75 2544 1
+75 2545 1
+75 2546 1
+75 2548 1
+75 2549 1
+75 2550 1
+75 2559 1
+75 2562 1
+75 2564 1
+75 2566 1
+75 2568 1
+75 2570 1
+75 2572 1
+75 2573 1
+75 2575 1
+75 2576 1
+75 2593 1
+75 2595 1
+75 2597 1
+75 2598 1
+75 2600 1
+75 2601 1
+75 2602 1
+75 2604 1
+75 2605 1
+75 2606 1
+75 2614 1
+75 2616 1
+75 2618 1
+75 2619 1
+75 2621 1
+75 2622 1
+75 2623 1
+75 2625 1
+75 2626 1
+75 2627 1
+75 2634 1
+75 2636 1
+75 2637 1
+75 2638 1
+75 2639 1
+75 2645 1
+75 2665 1
+75 2669 1
+75 2672 1
+75 2674 1
+75 2676 1
+75 2700 1
+75 2704 1
+75 2707 1
+75 2709 1
+75 2711 1
+75 2734 1
+75 2737 1
+75 2739 1
+75 2741 1
+75 2743 1
+75 2745 1
+75 2747 1
+75 2748 1
+75 2750 1
+75 2751 1
+75 2770 1
+75 2774 1
+75 2777 1
+75 2779 1
+75 2781 1
+75 2804 1
+75 2807 1
+75 2809 1
+75 2811 1
+75 2813 1
+75 2815 1
+75 2817 1
+75 2818 1
+75 2820 1
+75 2821 1
+75 2839 1
+75 2842 1
+75 2844 1
+75 2846 1
+75 2848 1
+75 2850 1
+75 2852 1
+75 2853 1
+75 2855 1
+75 2856 1
+75 2873 1
+75 2875 1
+75 2877 1
+75 2878 1
+75 2880 1
+75 2881 1
+75 2882 1
+75 2884 1
+75 2885 1
+75 2886 1
+75 2896 1
+75 2900 1
+75 2903 1
+75 2905 1
+75 2907 1
+75 2930 1
+75 2933 1
+75 2935 1
+75 2937 1
+75 2939 1
+75 2941 1
+75 2943 1
+75 2944 1
+75 2946 1
+75 2947 1
+75 2965 1
+75 2968 1
+75 2970 1
+75 2972 1
+75 2974 1
+75 2976 1
+75 2978 1
+75 2979 1
+75 2981 1
+75 2982 1
+75 2999 1
+75 3001 1
+75 3003 1
+75 3004 1
+75 3006 1
+75 3007 1
+75 3008 1
+75 3010 1
+75 3011 1
+75 3012 1
+75 3021 1
+75 3024 1
+75 3026 1
+75 3028 1
+75 3030 1
+75 3032 1
+75 3034 1
+75 3035 1
+75 3037 1
+75 3038 1
+75 3055 1
+75 3057 1
+75 3059 1
+75 3060 1
+75 3062 1
+75 3063 1
+75 3064 1
+75 3066 1
+75 3067 1
+75 3068 1
+75 3076 1
+75 3078 1
+75 3080 1
+75 3081 1
+75 3083 1
+75 3084 1
+75 3085 1
+75 3087 1
+75 3088 1
+75 3089 1
+75 3096 1
+75 3098 1
+75 3099 1
+75 3100 1
+75 3101 1
+75 3106 1
+75 3110 1
+75 3113 1
+75 3115 1
+75 3117 1
+75 3140 1
+75 3143 1
+75 3145 1
+75 3147 1
+75 3149 1
+75 3151 1
+75 3153 1
+75 3154 1
+75 3156 1
+75 3157 1
+75 3175 1
+75 3178 1
+75 3180 1
+75 3182 1
+75 3184 1
+75 3186 1
+75 3188 1
+75 3189 1
+75 3191 1
+75 3192 1
+75 3209 1
+75 3211 1
+75 3213 1
+75 3214 1
+75 3216 1
+75 3217 1
+75 3218 1
+75 3220 1
+75 3221 1
+75 3222 1
+75 3231 1
+75 3234 1
+75 3236 1
+75 3238 1
+75 3240 1
+75 3242 1
+75 3244 1
+75 3245 1
+75 3247 1
+75 3248 1
+75 3265 1
+75 3267 1
+75 3269 1
+75 3270 1
+75 3272 1
+75 3273 1
+75 3274 1
+75 3276 1
+75 3277 1
+75 3278 1
+75 3286 1
+75 3288 1
+75 3290 1
+75 3291 1
+75 3293 1
+75 3294 1
+75 3295 1
+75 3297 1
+75 3298 1
+75 3299 1
+75 3306 1
+75 3308 1
+75 3309 1
+75 3310 1
+75 3311 1
+75 3315 1
+75 3318 1
+75 3320 1
+75 3322 1
+75 3324 1
+75 3326 1
+75 3328 1
+75 3329 1
+75 3331 1
+75 3332 1
+75 3349 1
+75 3351 1
+75 3353 1
+75 3354 1
+75 3356 1
+75 3357 1
+75 3358 1
+75 3360 1
+75 3361 1
+75 3362 1
+75 3370 1
+75 3372 1
+75 3374 1
+75 3375 1
+75 3377 1
+75 3378 1
+75 3379 1
+75 3381 1
+75 3382 1
+75 3383 1
+75 3390 1
+75 3392 1
+75 3393 1
+75 3394 1
+75 3395 1
+75 3398 1
+75 3400 1
+75 3402 1
+75 3403 1
+75 3405 1
+75 3406 1
+75 3407 1
+75 3409 1
+75 3410 1
+75 3411 1
+75 3418 1
+75 3420 1
+75 3421 1
+75 3422 1
+75 3423 1
+75 3425 1
+75 3427 1
+75 3428 1
+75 3429 1
+75 3430 1
+75 3432 1
+76 21 1
+76 49 1
+76 70 1
+76 90 1
+76 94 1
+76 97 1
+76 99 1
+76 100 1
+76 133 1
+76 154 1
+76 174 1
+76 178 1
+76 181 1
+76 183 1
+76 184 1
+76 210 1
+76 230 1
+76 234 1
+76 237 1
+76 239 1
+76 240 1
+76 265 1
+76 269 1
+76 272 1
+76 274 1
+76 275 1
+76 299 1
+76 302 1
+76 304 1
+76 305 1
+76 308 1
+76 310 1
+76 311 1
+76 313 1
+76 314 1
+76 315 1
+76 343 1
+76 364 1
+76 384 1
+76 388 1
+76 391 1
+76 393 1
+76 394 1
+76 420 1
+76 440 1
+76 444 1
+76 447 1
+76 449 1
+76 450 1
+76 475 1
+76 479 1
+76 482 1
+76 484 1
+76 485 1
+76 509 1
+76 512 1
+76 514 1
+76 515 1
+76 518 1
+76 520 1
+76 521 1
+76 523 1
+76 524 1
+76 525 1
+76 546 1
+76 566 1
+76 570 1
+76 573 1
+76 575 1
+76 576 1
+76 601 1
+76 605 1
+76 608 1
+76 610 1
+76 611 1
+76 635 1
+76 638 1
+76 640 1
+76 641 1
+76 644 1
+76 646 1
+76 647 1
+76 649 1
+76 650 1
+76 651 1
+76 671 1
+76 675 1
+76 678 1
+76 680 1
+76 681 1
+76 705 1
+76 708 1
+76 710 1
+76 711 1
+76 714 1
+76 716 1
+76 717 1
+76 719 1
+76 720 1
+76 721 1
+76 740 1
+76 743 1
+76 745 1
+76 746 1
+76 749 1
+76 751 1
+76 752 1
+76 754 1
+76 755 1
+76 756 1
+76 774 1
+76 776 1
+76 777 1
+76 779 1
+76 780 1
+76 781 1
+76 783 1
+76 784 1
+76 785 1
+76 786 1
+76 805 1
+76 826 1
+76 846 1
+76 850 1
+76 853 1
+76 855 1
+76 856 1
+76 882 1
+76 902 1
+76 906 1
+76 909 1
+76 911 1
+76 912 1
+76 937 1
+76 941 1
+76 944 1
+76 946 1
+76 947 1
+76 971 1
+76 974 1
+76 976 1
+76 977 1
+76 980 1
+76 982 1
+76 983 1
+76 985 1
+76 986 1
+76 987 1
+76 1008 1
+76 1028 1
+76 1032 1
+76 1035 1
+76 1037 1
+76 1038 1
+76 1063 1
+76 1067 1
+76 1070 1
+76 1072 1
+76 1073 1
+76 1097 1
+76 1100 1
+76 1102 1
+76 1103 1
+76 1106 1
+76 1108 1
+76 1109 1
+76 1111 1
+76 1112 1
+76 1113 1
+76 1133 1
+76 1137 1
+76 1140 1
+76 1142 1
+76 1143 1
+76 1167 1
+76 1170 1
+76 1172 1
+76 1173 1
+76 1176 1
+76 1178 1
+76 1179 1
+76 1181 1
+76 1182 1
+76 1183 1
+76 1202 1
+76 1205 1
+76 1207 1
+76 1208 1
+76 1211 1
+76 1213 1
+76 1214 1
+76 1216 1
+76 1217 1
+76 1218 1
+76 1236 1
+76 1238 1
+76 1239 1
+76 1241 1
+76 1242 1
+76 1243 1
+76 1245 1
+76 1246 1
+76 1247 1
+76 1248 1
+76 1260 1
+76 1280 1
+76 1284 1
+76 1287 1
+76 1289 1
+76 1290 1
+76 1315 1
+76 1319 1
+76 1322 1
+76 1324 1
+76 1325 1
+76 1349 1
+76 1352 1
+76 1354 1
+76 1355 1
+76 1358 1
+76 1360 1
+76 1361 1
+76 1363 1
+76 1364 1
+76 1365 1
+76 1385 1
+76 1389 1
+76 1392 1
+76 1394 1
+76 1395 1
+76 1419 1
+76 1422 1
+76 1424 1
+76 1425 1
+76 1428 1
+76 1430 1
+76 1431 1
+76 1433 1
+76 1434 1
+76 1435 1
+76 1454 1
+76 1457 1
+76 1459 1
+76 1460 1
+76 1463 1
+76 1465 1
+76 1466 1
+76 1468 1
+76 1469 1
+76 1470 1
+76 1488 1
+76 1490 1
+76 1491 1
+76 1493 1
+76 1494 1
+76 1495 1
+76 1497 1
+76 1498 1
+76 1499 1
+76 1500 1
+76 1511 1
+76 1515 1
+76 1518 1
+76 1520 1
+76 1521 1
+76 1545 1
+76 1548 1
+76 1550 1
+76 1551 1
+76 1554 1
+76 1556 1
+76 1557 1
+76 1559 1
+76 1560 1
+76 1561 1
+76 1580 1
+76 1583 1
+76 1585 1
+76 1586 1
+76 1589 1
+76 1591 1
+76 1592 1
+76 1594 1
+76 1595 1
+76 1596 1
+76 1614 1
+76 1616 1
+76 1617 1
+76 1619 1
+76 1620 1
+76 1621 1
+76 1623 1
+76 1624 1
+76 1625 1
+76 1626 1
+76 1636 1
+76 1639 1
+76 1641 1
+76 1642 1
+76 1645 1
+76 1647 1
+76 1648 1
+76 1650 1
+76 1651 1
+76 1652 1
+76 1670 1
+76 1672 1
+76 1673 1
+76 1675 1
+76 1676 1
+76 1677 1
+76 1679 1
+76 1680 1
+76 1681 1
+76 1682 1
+76 1691 1
+76 1693 1
+76 1694 1
+76 1696 1
+76 1697 1
+76 1698 1
+76 1700 1
+76 1701 1
+76 1702 1
+76 1703 1
+76 1711 1
+76 1712 1
+76 1713 1
+76 1714 1
+76 1715 1
+76 1729 1
+76 1750 1
+76 1770 1
+76 1774 1
+76 1777 1
+76 1779 1
+76 1780 1
+76 1806 1
+76 1826 1
+76 1830 1
+76 1833 1
+76 1835 1
+76 1836 1
+76 1861 1
+76 1865 1
+76 1868 1
+76 1870 1
+76 1871 1
+76 1895 1
+76 1898 1
+76 1900 1
+76 1901 1
+76 1904 1
+76 1906 1
+76 1907 1
+76 1909 1
+76 1910 1
+76 1911 1
+76 1932 1
+76 1952 1
+76 1956 1
+76 1959 1
+76 1961 1
+76 1962 1
+76 1987 1
+76 1991 1
+76 1994 1
+76 1996 1
+76 1997 1
+76 2021 1
+76 2024 1
+76 2026 1
+76 2027 1
+76 2030 1
+76 2032 1
+76 2033 1
+76 2035 1
+76 2036 1
+76 2037 1
+76 2057 1
+76 2061 1
+76 2064 1
+76 2066 1
+76 2067 1
+76 2091 1
+76 2094 1
+76 2096 1
+76 2097 1
+76 2100 1
+76 2102 1
+76 2103 1
+76 2105 1
+76 2106 1
+76 2107 1
+76 2126 1
+76 2129 1
+76 2131 1
+76 2132 1
+76 2135 1
+76 2137 1
+76 2138 1
+76 2140 1
+76 2141 1
+76 2142 1
+76 2160 1
+76 2162 1
+76 2163 1
+76 2165 1
+76 2166 1
+76 2167 1
+76 2169 1
+76 2170 1
+76 2171 1
+76 2172 1
+76 2184 1
+76 2204 1
+76 2208 1
+76 2211 1
+76 2213 1
+76 2214 1
+76 2239 1
+76 2243 1
+76 2246 1
+76 2248 1
+76 2249 1
+76 2273 1
+76 2276 1
+76 2278 1
+76 2279 1
+76 2282 1
+76 2284 1
+76 2285 1
+76 2287 1
+76 2288 1
+76 2289 1
+76 2309 1
+76 2313 1
+76 2316 1
+76 2318 1
+76 2319 1
+76 2343 1
+76 2346 1
+76 2348 1
+76 2349 1
+76 2352 1
+76 2354 1
+76 2355 1
+76 2357 1
+76 2358 1
+76 2359 1
+76 2378 1
+76 2381 1
+76 2383 1
+76 2384 1
+76 2387 1
+76 2389 1
+76 2390 1
+76 2392 1
+76 2393 1
+76 2394 1
+76 2412 1
+76 2414 1
+76 2415 1
+76 2417 1
+76 2418 1
+76 2419 1
+76 2421 1
+76 2422 1
+76 2423 1
+76 2424 1
+76 2435 1
+76 2439 1
+76 2442 1
+76 2444 1
+76 2445 1
+76 2469 1
+76 2472 1
+76 2474 1
+76 2475 1
+76 2478 1
+76 2480 1
+76 2481 1
+76 2483 1
+76 2484 1
+76 2485 1
+76 2504 1
+76 2507 1
+76 2509 1
+76 2510 1
+76 2513 1
+76 2515 1
+76 2516 1
+76 2518 1
+76 2519 1
+76 2520 1
+76 2538 1
+76 2540 1
+76 2541 1
+76 2543 1
+76 2544 1
+76 2545 1
+76 2547 1
+76 2548 1
+76 2549 1
+76 2550 1
+76 2560 1
+76 2563 1
+76 2565 1
+76 2566 1
+76 2569 1
+76 2571 1
+76 2572 1
+76 2574 1
+76 2575 1
+76 2576 1
+76 2594 1
+76 2596 1
+76 2597 1
+76 2599 1
+76 2600 1
+76 2601 1
+76 2603 1
+76 2604 1
+76 2605 1
+76 2606 1
+76 2615 1
+76 2617 1
+76 2618 1
+76 2620 1
+76 2621 1
+76 2622 1
+76 2624 1
+76 2625 1
+76 2626 1
+76 2627 1
+76 2635 1
+76 2636 1
+76 2637 1
+76 2638 1
+76 2639 1
+76 2646 1
+76 2666 1
+76 2670 1
+76 2673 1
+76 2675 1
+76 2676 1
+76 2701 1
+76 2705 1
+76 2708 1
+76 2710 1
+76 2711 1
+76 2735 1
+76 2738 1
+76 2740 1
+76 2741 1
+76 2744 1
+76 2746 1
+76 2747 1
+76 2749 1
+76 2750 1
+76 2751 1
+76 2771 1
+76 2775 1
+76 2778 1
+76 2780 1
+76 2781 1
+76 2805 1
+76 2808 1
+76 2810 1
+76 2811 1
+76 2814 1
+76 2816 1
+76 2817 1
+76 2819 1
+76 2820 1
+76 2821 1
+76 2840 1
+76 2843 1
+76 2845 1
+76 2846 1
+76 2849 1
+76 2851 1
+76 2852 1
+76 2854 1
+76 2855 1
+76 2856 1
+76 2874 1
+76 2876 1
+76 2877 1
+76 2879 1
+76 2880 1
+76 2881 1
+76 2883 1
+76 2884 1
+76 2885 1
+76 2886 1
+76 2897 1
+76 2901 1
+76 2904 1
+76 2906 1
+76 2907 1
+76 2931 1
+76 2934 1
+76 2936 1
+76 2937 1
+76 2940 1
+76 2942 1
+76 2943 1
+76 2945 1
+76 2946 1
+76 2947 1
+76 2966 1
+76 2969 1
+76 2971 1
+76 2972 1
+76 2975 1
+76 2977 1
+76 2978 1
+76 2980 1
+76 2981 1
+76 2982 1
+76 3000 1
+76 3002 1
+76 3003 1
+76 3005 1
+76 3006 1
+76 3007 1
+76 3009 1
+76 3010 1
+76 3011 1
+76 3012 1
+76 3022 1
+76 3025 1
+76 3027 1
+76 3028 1
+76 3031 1
+76 3033 1
+76 3034 1
+76 3036 1
+76 3037 1
+76 3038 1
+76 3056 1
+76 3058 1
+76 3059 1
+76 3061 1
+76 3062 1
+76 3063 1
+76 3065 1
+76 3066 1
+76 3067 1
+76 3068 1
+76 3077 1
+76 3079 1
+76 3080 1
+76 3082 1
+76 3083 1
+76 3084 1
+76 3086 1
+76 3087 1
+76 3088 1
+76 3089 1
+76 3097 1
+76 3098 1
+76 3099 1
+76 3100 1
+76 3101 1
+76 3107 1
+76 3111 1
+76 3114 1
+76 3116 1
+76 3117 1
+76 3141 1
+76 3144 1
+76 3146 1
+76 3147 1
+76 3150 1
+76 3152 1
+76 3153 1
+76 3155 1
+76 3156 1
+76 3157 1
+76 3176 1
+76 3179 1
+76 3181 1
+76 3182 1
+76 3185 1
+76 3187 1
+76 3188 1
+76 3190 1
+76 3191 1
+76 3192 1
+76 3210 1
+76 3212 1
+76 3213 1
+76 3215 1
+76 3216 1
+76 3217 1
+76 3219 1
+76 3220 1
+76 3221 1
+76 3222 1
+76 3232 1
+76 3235 1
+76 3237 1
+76 3238 1
+76 3241 1
+76 3243 1
+76 3244 1
+76 3246 1
+76 3247 1
+76 3248 1
+76 3266 1
+76 3268 1
+76 3269 1
+76 3271 1
+76 3272 1
+76 3273 1
+76 3275 1
+76 3276 1
+76 3277 1
+76 3278 1
+76 3287 1
+76 3289 1
+76 3290 1
+76 3292 1
+76 3293 1
+76 3294 1
+76 3296 1
+76 3297 1
+76 3298 1
+76 3299 1
+76 3307 1
+76 3308 1
+76 3309 1
+76 3310 1
+76 3311 1
+76 3316 1
+76 3319 1
+76 3321 1
+76 3322 1
+76 3325 1
+76 3327 1
+76 3328 1
+76 3330 1
+76 3331 1
+76 3332 1
+76 3350 1
+76 3352 1
+76 3353 1
+76 3355 1
+76 3356 1
+76 3357 1
+76 3359 1
+76 3360 1
+76 3361 1
+76 3362 1
+76 3371 1
+76 3373 1
+76 3374 1
+76 3376 1
+76 3377 1
+76 3378 1
+76 3380 1
+76 3381 1
+76 3382 1
+76 3383 1
+76 3391 1
+76 3392 1
+76 3393 1
+76 3394 1
+76 3395 1
+76 3399 1
+76 3401 1
+76 3402 1
+76 3404 1
+76 3405 1
+76 3406 1
+76 3408 1
+76 3409 1
+76 3410 1
+76 3411 1
+76 3419 1
+76 3420 1
+76 3421 1
+76 3422 1
+76 3423 1
+76 3426 1
+76 3427 1
+76 3428 1
+76 3429 1
+76 3430 1
+76 3432 1
+77 22 1
+77 50 1
+77 71 1
+77 86 1
+77 101 1
+77 102 1
+77 103 1
+77 104 1
+77 134 1
+77 155 1
+77 170 1
+77 185 1
+77 186 1
+77 187 1
+77 188 1
+77 211 1
+77 226 1
+77 241 1
+77 242 1
+77 243 1
+77 244 1
+77 261 1
+77 276 1
+77 277 1
+77 278 1
+77 279 1
+77 296 1
+77 297 1
+77 298 1
+77 299 1
+77 316 1
+77 317 1
+77 318 1
+77 319 1
+77 320 1
+77 321 1
+77 344 1
+77 365 1
+77 380 1
+77 395 1
+77 396 1
+77 397 1
+77 398 1
+77 421 1
+77 436 1
+77 451 1
+77 452 1
+77 453 1
+77 454 1
+77 471 1
+77 486 1
+77 487 1
+77 488 1
+77 489 1
+77 506 1
+77 507 1
+77 508 1
+77 509 1
+77 526 1
+77 527 1
+77 528 1
+77 529 1
+77 530 1
+77 531 1
+77 547 1
+77 562 1
+77 577 1
+77 578 1
+77 579 1
+77 580 1
+77 597 1
+77 612 1
+77 613 1
+77 614 1
+77 615 1
+77 632 1
+77 633 1
+77 634 1
+77 635 1
+77 652 1
+77 653 1
+77 654 1
+77 655 1
+77 656 1
+77 657 1
+77 667 1
+77 682 1
+77 683 1
+77 684 1
+77 685 1
+77 702 1
+77 703 1
+77 704 1
+77 705 1
+77 722 1
+77 723 1
+77 724 1
+77 725 1
+77 726 1
+77 727 1
+77 737 1
+77 738 1
+77 739 1
+77 740 1
+77 757 1
+77 758 1
+77 759 1
+77 760 1
+77 761 1
+77 762 1
+77 772 1
+77 773 1
+77 774 1
+77 775 1
+77 776 1
+77 777 1
+77 787 1
+77 788 1
+77 789 1
+77 790 1
+77 806 1
+77 827 1
+77 842 1
+77 857 1
+77 858 1
+77 859 1
+77 860 1
+77 883 1
+77 898 1
+77 913 1
+77 914 1
+77 915 1
+77 916 1
+77 933 1
+77 948 1
+77 949 1
+77 950 1
+77 951 1
+77 968 1
+77 969 1
+77 970 1
+77 971 1
+77 988 1
+77 989 1
+77 990 1
+77 991 1
+77 992 1
+77 993 1
+77 1009 1
+77 1024 1
+77 1039 1
+77 1040 1
+77 1041 1
+77 1042 1
+77 1059 1
+77 1074 1
+77 1075 1
+77 1076 1
+77 1077 1
+77 1094 1
+77 1095 1
+77 1096 1
+77 1097 1
+77 1114 1
+77 1115 1
+77 1116 1
+77 1117 1
+77 1118 1
+77 1119 1
+77 1129 1
+77 1144 1
+77 1145 1
+77 1146 1
+77 1147 1
+77 1164 1
+77 1165 1
+77 1166 1
+77 1167 1
+77 1184 1
+77 1185 1
+77 1186 1
+77 1187 1
+77 1188 1
+77 1189 1
+77 1199 1
+77 1200 1
+77 1201 1
+77 1202 1
+77 1219 1
+77 1220 1
+77 1221 1
+77 1222 1
+77 1223 1
+77 1224 1
+77 1234 1
+77 1235 1
+77 1236 1
+77 1237 1
+77 1238 1
+77 1239 1
+77 1249 1
+77 1250 1
+77 1251 1
+77 1252 1
+77 1261 1
+77 1276 1
+77 1291 1
+77 1292 1
+77 1293 1
+77 1294 1
+77 1311 1
+77 1326 1
+77 1327 1
+77 1328 1
+77 1329 1
+77 1346 1
+77 1347 1
+77 1348 1
+77 1349 1
+77 1366 1
+77 1367 1
+77 1368 1
+77 1369 1
+77 1370 1
+77 1371 1
+77 1381 1
+77 1396 1
+77 1397 1
+77 1398 1
+77 1399 1
+77 1416 1
+77 1417 1
+77 1418 1
+77 1419 1
+77 1436 1
+77 1437 1
+77 1438 1
+77 1439 1
+77 1440 1
+77 1441 1
+77 1451 1
+77 1452 1
+77 1453 1
+77 1454 1
+77 1471 1
+77 1472 1
+77 1473 1
+77 1474 1
+77 1475 1
+77 1476 1
+77 1486 1
+77 1487 1
+77 1488 1
+77 1489 1
+77 1490 1
+77 1491 1
+77 1501 1
+77 1502 1
+77 1503 1
+77 1504 1
+77 1507 1
+77 1522 1
+77 1523 1
+77 1524 1
+77 1525 1
+77 1542 1
+77 1543 1
+77 1544 1
+77 1545 1
+77 1562 1
+77 1563 1
+77 1564 1
+77 1565 1
+77 1566 1
+77 1567 1
+77 1577 1
+77 1578 1
+77 1579 1
+77 1580 1
+77 1597 1
+77 1598 1
+77 1599 1
+77 1600 1
+77 1601 1
+77 1602 1
+77 1612 1
+77 1613 1
+77 1614 1
+77 1615 1
+77 1616 1
+77 1617 1
+77 1627 1
+77 1628 1
+77 1629 1
+77 1630 1
+77 1633 1
+77 1634 1
+77 1635 1
+77 1636 1
+77 1653 1
+77 1654 1
+77 1655 1
+77 1656 1
+77 1657 1
+77 1658 1
+77 1668 1
+77 1669 1
+77 1670 1
+77 1671 1
+77 1672 1
+77 1673 1
+77 1683 1
+77 1684 1
+77 1685 1
+77 1686 1
+77 1689 1
+77 1690 1
+77 1691 1
+77 1692 1
+77 1693 1
+77 1694 1
+77 1704 1
+77 1705 1
+77 1706 1
+77 1707 1
+77 1710 1
+77 1711 1
+77 1712 1
+77 1713 1
+77 1716 1
+77 1730 1
+77 1751 1
+77 1766 1
+77 1781 1
+77 1782 1
+77 1783 1
+77 1784 1
+77 1807 1
+77 1822 1
+77 1837 1
+77 1838 1
+77 1839 1
+77 1840 1
+77 1857 1
+77 1872 1
+77 1873 1
+77 1874 1
+77 1875 1
+77 1892 1
+77 1893 1
+77 1894 1
+77 1895 1
+77 1912 1
+77 1913 1
+77 1914 1
+77 1915 1
+77 1916 1
+77 1917 1
+77 1933 1
+77 1948 1
+77 1963 1
+77 1964 1
+77 1965 1
+77 1966 1
+77 1983 1
+77 1998 1
+77 1999 1
+77 2000 1
+77 2001 1
+77 2018 1
+77 2019 1
+77 2020 1
+77 2021 1
+77 2038 1
+77 2039 1
+77 2040 1
+77 2041 1
+77 2042 1
+77 2043 1
+77 2053 1
+77 2068 1
+77 2069 1
+77 2070 1
+77 2071 1
+77 2088 1
+77 2089 1
+77 2090 1
+77 2091 1
+77 2108 1
+77 2109 1
+77 2110 1
+77 2111 1
+77 2112 1
+77 2113 1
+77 2123 1
+77 2124 1
+77 2125 1
+77 2126 1
+77 2143 1
+77 2144 1
+77 2145 1
+77 2146 1
+77 2147 1
+77 2148 1
+77 2158 1
+77 2159 1
+77 2160 1
+77 2161 1
+77 2162 1
+77 2163 1
+77 2173 1
+77 2174 1
+77 2175 1
+77 2176 1
+77 2185 1
+77 2200 1
+77 2215 1
+77 2216 1
+77 2217 1
+77 2218 1
+77 2235 1
+77 2250 1
+77 2251 1
+77 2252 1
+77 2253 1
+77 2270 1
+77 2271 1
+77 2272 1
+77 2273 1
+77 2290 1
+77 2291 1
+77 2292 1
+77 2293 1
+77 2294 1
+77 2295 1
+77 2305 1
+77 2320 1
+77 2321 1
+77 2322 1
+77 2323 1
+77 2340 1
+77 2341 1
+77 2342 1
+77 2343 1
+77 2360 1
+77 2361 1
+77 2362 1
+77 2363 1
+77 2364 1
+77 2365 1
+77 2375 1
+77 2376 1
+77 2377 1
+77 2378 1
+77 2395 1
+77 2396 1
+77 2397 1
+77 2398 1
+77 2399 1
+77 2400 1
+77 2410 1
+77 2411 1
+77 2412 1
+77 2413 1
+77 2414 1
+77 2415 1
+77 2425 1
+77 2426 1
+77 2427 1
+77 2428 1
+77 2431 1
+77 2446 1
+77 2447 1
+77 2448 1
+77 2449 1
+77 2466 1
+77 2467 1
+77 2468 1
+77 2469 1
+77 2486 1
+77 2487 1
+77 2488 1
+77 2489 1
+77 2490 1
+77 2491 1
+77 2501 1
+77 2502 1
+77 2503 1
+77 2504 1
+77 2521 1
+77 2522 1
+77 2523 1
+77 2524 1
+77 2525 1
+77 2526 1
+77 2536 1
+77 2537 1
+77 2538 1
+77 2539 1
+77 2540 1
+77 2541 1
+77 2551 1
+77 2552 1
+77 2553 1
+77 2554 1
+77 2557 1
+77 2558 1
+77 2559 1
+77 2560 1
+77 2577 1
+77 2578 1
+77 2579 1
+77 2580 1
+77 2581 1
+77 2582 1
+77 2592 1
+77 2593 1
+77 2594 1
+77 2595 1
+77 2596 1
+77 2597 1
+77 2607 1
+77 2608 1
+77 2609 1
+77 2610 1
+77 2613 1
+77 2614 1
+77 2615 1
+77 2616 1
+77 2617 1
+77 2618 1
+77 2628 1
+77 2629 1
+77 2630 1
+77 2631 1
+77 2634 1
+77 2635 1
+77 2636 1
+77 2637 1
+77 2640 1
+77 2647 1
+77 2662 1
+77 2677 1
+77 2678 1
+77 2679 1
+77 2680 1
+77 2697 1
+77 2712 1
+77 2713 1
+77 2714 1
+77 2715 1
+77 2732 1
+77 2733 1
+77 2734 1
+77 2735 1
+77 2752 1
+77 2753 1
+77 2754 1
+77 2755 1
+77 2756 1
+77 2757 1
+77 2767 1
+77 2782 1
+77 2783 1
+77 2784 1
+77 2785 1
+77 2802 1
+77 2803 1
+77 2804 1
+77 2805 1
+77 2822 1
+77 2823 1
+77 2824 1
+77 2825 1
+77 2826 1
+77 2827 1
+77 2837 1
+77 2838 1
+77 2839 1
+77 2840 1
+77 2857 1
+77 2858 1
+77 2859 1
+77 2860 1
+77 2861 1
+77 2862 1
+77 2872 1
+77 2873 1
+77 2874 1
+77 2875 1
+77 2876 1
+77 2877 1
+77 2887 1
+77 2888 1
+77 2889 1
+77 2890 1
+77 2893 1
+77 2908 1
+77 2909 1
+77 2910 1
+77 2911 1
+77 2928 1
+77 2929 1
+77 2930 1
+77 2931 1
+77 2948 1
+77 2949 1
+77 2950 1
+77 2951 1
+77 2952 1
+77 2953 1
+77 2963 1
+77 2964 1
+77 2965 1
+77 2966 1
+77 2983 1
+77 2984 1
+77 2985 1
+77 2986 1
+77 2987 1
+77 2988 1
+77 2998 1
+77 2999 1
+77 3000 1
+77 3001 1
+77 3002 1
+77 3003 1
+77 3013 1
+77 3014 1
+77 3015 1
+77 3016 1
+77 3019 1
+77 3020 1
+77 3021 1
+77 3022 1
+77 3039 1
+77 3040 1
+77 3041 1
+77 3042 1
+77 3043 1
+77 3044 1
+77 3054 1
+77 3055 1
+77 3056 1
+77 3057 1
+77 3058 1
+77 3059 1
+77 3069 1
+77 3070 1
+77 3071 1
+77 3072 1
+77 3075 1
+77 3076 1
+77 3077 1
+77 3078 1
+77 3079 1
+77 3080 1
+77 3090 1
+77 3091 1
+77 3092 1
+77 3093 1
+77 3096 1
+77 3097 1
+77 3098 1
+77 3099 1
+77 3102 1
+77 3103 1
+77 3118 1
+77 3119 1
+77 3120 1
+77 3121 1
+77 3138 1
+77 3139 1
+77 3140 1
+77 3141 1
+77 3158 1
+77 3159 1
+77 3160 1
+77 3161 1
+77 3162 1
+77 3163 1
+77 3173 1
+77 3174 1
+77 3175 1
+77 3176 1
+77 3193 1
+77 3194 1
+77 3195 1
+77 3196 1
+77 3197 1
+77 3198 1
+77 3208 1
+77 3209 1
+77 3210 1
+77 3211 1
+77 3212 1
+77 3213 1
+77 3223 1
+77 3224 1
+77 3225 1
+77 3226 1
+77 3229 1
+77 3230 1
+77 3231 1
+77 3232 1
+77 3249 1
+77 3250 1
+77 3251 1
+77 3252 1
+77 3253 1
+77 3254 1
+77 3264 1
+77 3265 1
+77 3266 1
+77 3267 1
+77 3268 1
+77 3269 1
+77 3279 1
+77 3280 1
+77 3281 1
+77 3282 1
+77 3285 1
+77 3286 1
+77 3287 1
+77 3288 1
+77 3289 1
+77 3290 1
+77 3300 1
+77 3301 1
+77 3302 1
+77 3303 1
+77 3306 1
+77 3307 1
+77 3308 1
+77 3309 1
+77 3312 1
+77 3313 1
+77 3314 1
+77 3315 1
+77 3316 1
+77 3333 1
+77 3334 1
+77 3335 1
+77 3336 1
+77 3337 1
+77 3338 1
+77 3348 1
+77 3349 1
+77 3350 1
+77 3351 1
+77 3352 1
+77 3353 1
+77 3363 1
+77 3364 1
+77 3365 1
+77 3366 1
+77 3369 1
+77 3370 1
+77 3371 1
+77 3372 1
+77 3373 1
+77 3374 1
+77 3384 1
+77 3385 1
+77 3386 1
+77 3387 1
+77 3390 1
+77 3391 1
+77 3392 1
+77 3393 1
+77 3396 1
+77 3397 1
+77 3398 1
+77 3399 1
+77 3400 1
+77 3401 1
+77 3402 1
+77 3412 1
+77 3413 1
+77 3414 1
+77 3415 1
+77 3418 1
+77 3419 1
+77 3420 1
+77 3421 1
+77 3424 1
+77 3425 1
+77 3426 1
+77 3427 1
+77 3428 1
+77 3431 1
+77 3432 1
+78 23 1
+78 51 1
+78 72 1
+78 87 1
+78 101 1
+78 105 1
+78 106 1
+78 107 1
+78 135 1
+78 156 1
+78 171 1
+78 185 1
+78 189 1
+78 190 1
+78 191 1
+78 212 1
+78 227 1
+78 241 1
+78 245 1
+78 246 1
+78 247 1
+78 262 1
+78 276 1
+78 280 1
+78 281 1
+78 282 1
+78 296 1
+78 300 1
+78 301 1
+78 302 1
+78 316 1
+78 317 1
+78 318 1
+78 322 1
+78 323 1
+78 324 1
+78 345 1
+78 366 1
+78 381 1
+78 395 1
+78 399 1
+78 400 1
+78 401 1
+78 422 1
+78 437 1
+78 451 1
+78 455 1
+78 456 1
+78 457 1
+78 472 1
+78 486 1
+78 490 1
+78 491 1
+78 492 1
+78 506 1
+78 510 1
+78 511 1
+78 512 1
+78 526 1
+78 527 1
+78 528 1
+78 532 1
+78 533 1
+78 534 1
+78 548 1
+78 563 1
+78 577 1
+78 581 1
+78 582 1
+78 583 1
+78 598 1
+78 612 1
+78 616 1
+78 617 1
+78 618 1
+78 632 1
+78 636 1
+78 637 1
+78 638 1
+78 652 1
+78 653 1
+78 654 1
+78 658 1
+78 659 1
+78 660 1
+78 668 1
+78 682 1
+78 686 1
+78 687 1
+78 688 1
+78 702 1
+78 706 1
+78 707 1
+78 708 1
+78 722 1
+78 723 1
+78 724 1
+78 728 1
+78 729 1
+78 730 1
+78 737 1
+78 741 1
+78 742 1
+78 743 1
+78 757 1
+78 758 1
+78 759 1
+78 763 1
+78 764 1
+78 765 1
+78 772 1
+78 773 1
+78 774 1
+78 778 1
+78 779 1
+78 780 1
+78 787 1
+78 788 1
+78 789 1
+78 791 1
+78 807 1
+78 828 1
+78 843 1
+78 857 1
+78 861 1
+78 862 1
+78 863 1
+78 884 1
+78 899 1
+78 913 1
+78 917 1
+78 918 1
+78 919 1
+78 934 1
+78 948 1
+78 952 1
+78 953 1
+78 954 1
+78 968 1
+78 972 1
+78 973 1
+78 974 1
+78 988 1
+78 989 1
+78 990 1
+78 994 1
+78 995 1
+78 996 1
+78 1010 1
+78 1025 1
+78 1039 1
+78 1043 1
+78 1044 1
+78 1045 1
+78 1060 1
+78 1074 1
+78 1078 1
+78 1079 1
+78 1080 1
+78 1094 1
+78 1098 1
+78 1099 1
+78 1100 1
+78 1114 1
+78 1115 1
+78 1116 1
+78 1120 1
+78 1121 1
+78 1122 1
+78 1130 1
+78 1144 1
+78 1148 1
+78 1149 1
+78 1150 1
+78 1164 1
+78 1168 1
+78 1169 1
+78 1170 1
+78 1184 1
+78 1185 1
+78 1186 1
+78 1190 1
+78 1191 1
+78 1192 1
+78 1199 1
+78 1203 1
+78 1204 1
+78 1205 1
+78 1219 1
+78 1220 1
+78 1221 1
+78 1225 1
+78 1226 1
+78 1227 1
+78 1234 1
+78 1235 1
+78 1236 1
+78 1240 1
+78 1241 1
+78 1242 1
+78 1249 1
+78 1250 1
+78 1251 1
+78 1253 1
+78 1262 1
+78 1277 1
+78 1291 1
+78 1295 1
+78 1296 1
+78 1297 1
+78 1312 1
+78 1326 1
+78 1330 1
+78 1331 1
+78 1332 1
+78 1346 1
+78 1350 1
+78 1351 1
+78 1352 1
+78 1366 1
+78 1367 1
+78 1368 1
+78 1372 1
+78 1373 1
+78 1374 1
+78 1382 1
+78 1396 1
+78 1400 1
+78 1401 1
+78 1402 1
+78 1416 1
+78 1420 1
+78 1421 1
+78 1422 1
+78 1436 1
+78 1437 1
+78 1438 1
+78 1442 1
+78 1443 1
+78 1444 1
+78 1451 1
+78 1455 1
+78 1456 1
+78 1457 1
+78 1471 1
+78 1472 1
+78 1473 1
+78 1477 1
+78 1478 1
+78 1479 1
+78 1486 1
+78 1487 1
+78 1488 1
+78 1492 1
+78 1493 1
+78 1494 1
+78 1501 1
+78 1502 1
+78 1503 1
+78 1505 1
+78 1508 1
+78 1522 1
+78 1526 1
+78 1527 1
+78 1528 1
+78 1542 1
+78 1546 1
+78 1547 1
+78 1548 1
+78 1562 1
+78 1563 1
+78 1564 1
+78 1568 1
+78 1569 1
+78 1570 1
+78 1577 1
+78 1581 1
+78 1582 1
+78 1583 1
+78 1597 1
+78 1598 1
+78 1599 1
+78 1603 1
+78 1604 1
+78 1605 1
+78 1612 1
+78 1613 1
+78 1614 1
+78 1618 1
+78 1619 1
+78 1620 1
+78 1627 1
+78 1628 1
+78 1629 1
+78 1631 1
+78 1633 1
+78 1637 1
+78 1638 1
+78 1639 1
+78 1653 1
+78 1654 1
+78 1655 1
+78 1659 1
+78 1660 1
+78 1661 1
+78 1668 1
+78 1669 1
+78 1670 1
+78 1674 1
+78 1675 1
+78 1676 1
+78 1683 1
+78 1684 1
+78 1685 1
+78 1687 1
+78 1689 1
+78 1690 1
+78 1691 1
+78 1695 1
+78 1696 1
+78 1697 1
+78 1704 1
+78 1705 1
+78 1706 1
+78 1708 1
+78 1710 1
+78 1711 1
+78 1712 1
+78 1714 1
+78 1716 1
+78 1731 1
+78 1752 1
+78 1767 1
+78 1781 1
+78 1785 1
+78 1786 1
+78 1787 1
+78 1808 1
+78 1823 1
+78 1837 1
+78 1841 1
+78 1842 1
+78 1843 1
+78 1858 1
+78 1872 1
+78 1876 1
+78 1877 1
+78 1878 1
+78 1892 1
+78 1896 1
+78 1897 1
+78 1898 1
+78 1912 1
+78 1913 1
+78 1914 1
+78 1918 1
+78 1919 1
+78 1920 1
+78 1934 1
+78 1949 1
+78 1963 1
+78 1967 1
+78 1968 1
+78 1969 1
+78 1984 1
+78 1998 1
+78 2002 1
+78 2003 1
+78 2004 1
+78 2018 1
+78 2022 1
+78 2023 1
+78 2024 1
+78 2038 1
+78 2039 1
+78 2040 1
+78 2044 1
+78 2045 1
+78 2046 1
+78 2054 1
+78 2068 1
+78 2072 1
+78 2073 1
+78 2074 1
+78 2088 1
+78 2092 1
+78 2093 1
+78 2094 1
+78 2108 1
+78 2109 1
+78 2110 1
+78 2114 1
+78 2115 1
+78 2116 1
+78 2123 1
+78 2127 1
+78 2128 1
+78 2129 1
+78 2143 1
+78 2144 1
+78 2145 1
+78 2149 1
+78 2150 1
+78 2151 1
+78 2158 1
+78 2159 1
+78 2160 1
+78 2164 1
+78 2165 1
+78 2166 1
+78 2173 1
+78 2174 1
+78 2175 1
+78 2177 1
+78 2186 1
+78 2201 1
+78 2215 1
+78 2219 1
+78 2220 1
+78 2221 1
+78 2236 1
+78 2250 1
+78 2254 1
+78 2255 1
+78 2256 1
+78 2270 1
+78 2274 1
+78 2275 1
+78 2276 1
+78 2290 1
+78 2291 1
+78 2292 1
+78 2296 1
+78 2297 1
+78 2298 1
+78 2306 1
+78 2320 1
+78 2324 1
+78 2325 1
+78 2326 1
+78 2340 1
+78 2344 1
+78 2345 1
+78 2346 1
+78 2360 1
+78 2361 1
+78 2362 1
+78 2366 1
+78 2367 1
+78 2368 1
+78 2375 1
+78 2379 1
+78 2380 1
+78 2381 1
+78 2395 1
+78 2396 1
+78 2397 1
+78 2401 1
+78 2402 1
+78 2403 1
+78 2410 1
+78 2411 1
+78 2412 1
+78 2416 1
+78 2417 1
+78 2418 1
+78 2425 1
+78 2426 1
+78 2427 1
+78 2429 1
+78 2432 1
+78 2446 1
+78 2450 1
+78 2451 1
+78 2452 1
+78 2466 1
+78 2470 1
+78 2471 1
+78 2472 1
+78 2486 1
+78 2487 1
+78 2488 1
+78 2492 1
+78 2493 1
+78 2494 1
+78 2501 1
+78 2505 1
+78 2506 1
+78 2507 1
+78 2521 1
+78 2522 1
+78 2523 1
+78 2527 1
+78 2528 1
+78 2529 1
+78 2536 1
+78 2537 1
+78 2538 1
+78 2542 1
+78 2543 1
+78 2544 1
+78 2551 1
+78 2552 1
+78 2553 1
+78 2555 1
+78 2557 1
+78 2561 1
+78 2562 1
+78 2563 1
+78 2577 1
+78 2578 1
+78 2579 1
+78 2583 1
+78 2584 1
+78 2585 1
+78 2592 1
+78 2593 1
+78 2594 1
+78 2598 1
+78 2599 1
+78 2600 1
+78 2607 1
+78 2608 1
+78 2609 1
+78 2611 1
+78 2613 1
+78 2614 1
+78 2615 1
+78 2619 1
+78 2620 1
+78 2621 1
+78 2628 1
+78 2629 1
+78 2630 1
+78 2632 1
+78 2634 1
+78 2635 1
+78 2636 1
+78 2638 1
+78 2640 1
+78 2648 1
+78 2663 1
+78 2677 1
+78 2681 1
+78 2682 1
+78 2683 1
+78 2698 1
+78 2712 1
+78 2716 1
+78 2717 1
+78 2718 1
+78 2732 1
+78 2736 1
+78 2737 1
+78 2738 1
+78 2752 1
+78 2753 1
+78 2754 1
+78 2758 1
+78 2759 1
+78 2760 1
+78 2768 1
+78 2782 1
+78 2786 1
+78 2787 1
+78 2788 1
+78 2802 1
+78 2806 1
+78 2807 1
+78 2808 1
+78 2822 1
+78 2823 1
+78 2824 1
+78 2828 1
+78 2829 1
+78 2830 1
+78 2837 1
+78 2841 1
+78 2842 1
+78 2843 1
+78 2857 1
+78 2858 1
+78 2859 1
+78 2863 1
+78 2864 1
+78 2865 1
+78 2872 1
+78 2873 1
+78 2874 1
+78 2878 1
+78 2879 1
+78 2880 1
+78 2887 1
+78 2888 1
+78 2889 1
+78 2891 1
+78 2894 1
+78 2908 1
+78 2912 1
+78 2913 1
+78 2914 1
+78 2928 1
+78 2932 1
+78 2933 1
+78 2934 1
+78 2948 1
+78 2949 1
+78 2950 1
+78 2954 1
+78 2955 1
+78 2956 1
+78 2963 1
+78 2967 1
+78 2968 1
+78 2969 1
+78 2983 1
+78 2984 1
+78 2985 1
+78 2989 1
+78 2990 1
+78 2991 1
+78 2998 1
+78 2999 1
+78 3000 1
+78 3004 1
+78 3005 1
+78 3006 1
+78 3013 1
+78 3014 1
+78 3015 1
+78 3017 1
+78 3019 1
+78 3023 1
+78 3024 1
+78 3025 1
+78 3039 1
+78 3040 1
+78 3041 1
+78 3045 1
+78 3046 1
+78 3047 1
+78 3054 1
+78 3055 1
+78 3056 1
+78 3060 1
+78 3061 1
+78 3062 1
+78 3069 1
+78 3070 1
+78 3071 1
+78 3073 1
+78 3075 1
+78 3076 1
+78 3077 1
+78 3081 1
+78 3082 1
+78 3083 1
+78 3090 1
+78 3091 1
+78 3092 1
+78 3094 1
+78 3096 1
+78 3097 1
+78 3098 1
+78 3100 1
+78 3102 1
+78 3104 1
+78 3118 1
+78 3122 1
+78 3123 1
+78 3124 1
+78 3138 1
+78 3142 1
+78 3143 1
+78 3144 1
+78 3158 1
+78 3159 1
+78 3160 1
+78 3164 1
+78 3165 1
+78 3166 1
+78 3173 1
+78 3177 1
+78 3178 1
+78 3179 1
+78 3193 1
+78 3194 1
+78 3195 1
+78 3199 1
+78 3200 1
+78 3201 1
+78 3208 1
+78 3209 1
+78 3210 1
+78 3214 1
+78 3215 1
+78 3216 1
+78 3223 1
+78 3224 1
+78 3225 1
+78 3227 1
+78 3229 1
+78 3233 1
+78 3234 1
+78 3235 1
+78 3249 1
+78 3250 1
+78 3251 1
+78 3255 1
+78 3256 1
+78 3257 1
+78 3264 1
+78 3265 1
+78 3266 1
+78 3270 1
+78 3271 1
+78 3272 1
+78 3279 1
+78 3280 1
+78 3281 1
+78 3283 1
+78 3285 1
+78 3286 1
+78 3287 1
+78 3291 1
+78 3292 1
+78 3293 1
+78 3300 1
+78 3301 1
+78 3302 1
+78 3304 1
+78 3306 1
+78 3307 1
+78 3308 1
+78 3310 1
+78 3312 1
+78 3313 1
+78 3317 1
+78 3318 1
+78 3319 1
+78 3333 1
+78 3334 1
+78 3335 1
+78 3339 1
+78 3340 1
+78 3341 1
+78 3348 1
+78 3349 1
+78 3350 1
+78 3354 1
+78 3355 1
+78 3356 1
+78 3363 1
+78 3364 1
+78 3365 1
+78 3367 1
+78 3369 1
+78 3370 1
+78 3371 1
+78 3375 1
+78 3376 1
+78 3377 1
+78 3384 1
+78 3385 1
+78 3386 1
+78 3388 1
+78 3390 1
+78 3391 1
+78 3392 1
+78 3394 1
+78 3396 1
+78 3397 1
+78 3398 1
+78 3399 1
+78 3403 1
+78 3404 1
+78 3405 1
+78 3412 1
+78 3413 1
+78 3414 1
+78 3416 1
+78 3418 1
+78 3419 1
+78 3420 1
+78 3422 1
+78 3424 1
+78 3425 1
+78 3426 1
+78 3427 1
+78 3429 1
+78 3431 1
+78 3432 1
+79 24 1
+79 52 1
+79 73 1
+79 88 1
+79 102 1
+79 105 1
+79 108 1
+79 109 1
+79 136 1
+79 157 1
+79 172 1
+79 186 1
+79 189 1
+79 192 1
+79 193 1
+79 213 1
+79 228 1
+79 242 1
+79 245 1
+79 248 1
+79 249 1
+79 263 1
+79 277 1
+79 280 1
+79 283 1
+79 284 1
+79 297 1
+79 300 1
+79 303 1
+79 304 1
+79 316 1
+79 319 1
+79 320 1
+79 322 1
+79 323 1
+79 325 1
+79 346 1
+79 367 1
+79 382 1
+79 396 1
+79 399 1
+79 402 1
+79 403 1
+79 423 1
+79 438 1
+79 452 1
+79 455 1
+79 458 1
+79 459 1
+79 473 1
+79 487 1
+79 490 1
+79 493 1
+79 494 1
+79 507 1
+79 510 1
+79 513 1
+79 514 1
+79 526 1
+79 529 1
+79 530 1
+79 532 1
+79 533 1
+79 535 1
+79 549 1
+79 564 1
+79 578 1
+79 581 1
+79 584 1
+79 585 1
+79 599 1
+79 613 1
+79 616 1
+79 619 1
+79 620 1
+79 633 1
+79 636 1
+79 639 1
+79 640 1
+79 652 1
+79 655 1
+79 656 1
+79 658 1
+79 659 1
+79 661 1
+79 669 1
+79 683 1
+79 686 1
+79 689 1
+79 690 1
+79 703 1
+79 706 1
+79 709 1
+79 710 1
+79 722 1
+79 725 1
+79 726 1
+79 728 1
+79 729 1
+79 731 1
+79 738 1
+79 741 1
+79 744 1
+79 745 1
+79 757 1
+79 760 1
+79 761 1
+79 763 1
+79 764 1
+79 766 1
+79 772 1
+79 775 1
+79 776 1
+79 778 1
+79 779 1
+79 781 1
+79 787 1
+79 788 1
+79 790 1
+79 791 1
+79 808 1
+79 829 1
+79 844 1
+79 858 1
+79 861 1
+79 864 1
+79 865 1
+79 885 1
+79 900 1
+79 914 1
+79 917 1
+79 920 1
+79 921 1
+79 935 1
+79 949 1
+79 952 1
+79 955 1
+79 956 1
+79 969 1
+79 972 1
+79 975 1
+79 976 1
+79 988 1
+79 991 1
+79 992 1
+79 994 1
+79 995 1
+79 997 1
+79 1011 1
+79 1026 1
+79 1040 1
+79 1043 1
+79 1046 1
+79 1047 1
+79 1061 1
+79 1075 1
+79 1078 1
+79 1081 1
+79 1082 1
+79 1095 1
+79 1098 1
+79 1101 1
+79 1102 1
+79 1114 1
+79 1117 1
+79 1118 1
+79 1120 1
+79 1121 1
+79 1123 1
+79 1131 1
+79 1145 1
+79 1148 1
+79 1151 1
+79 1152 1
+79 1165 1
+79 1168 1
+79 1171 1
+79 1172 1
+79 1184 1
+79 1187 1
+79 1188 1
+79 1190 1
+79 1191 1
+79 1193 1
+79 1200 1
+79 1203 1
+79 1206 1
+79 1207 1
+79 1219 1
+79 1222 1
+79 1223 1
+79 1225 1
+79 1226 1
+79 1228 1
+79 1234 1
+79 1237 1
+79 1238 1
+79 1240 1
+79 1241 1
+79 1243 1
+79 1249 1
+79 1250 1
+79 1252 1
+79 1253 1
+79 1263 1
+79 1278 1
+79 1292 1
+79 1295 1
+79 1298 1
+79 1299 1
+79 1313 1
+79 1327 1
+79 1330 1
+79 1333 1
+79 1334 1
+79 1347 1
+79 1350 1
+79 1353 1
+79 1354 1
+79 1366 1
+79 1369 1
+79 1370 1
+79 1372 1
+79 1373 1
+79 1375 1
+79 1383 1
+79 1397 1
+79 1400 1
+79 1403 1
+79 1404 1
+79 1417 1
+79 1420 1
+79 1423 1
+79 1424 1
+79 1436 1
+79 1439 1
+79 1440 1
+79 1442 1
+79 1443 1
+79 1445 1
+79 1452 1
+79 1455 1
+79 1458 1
+79 1459 1
+79 1471 1
+79 1474 1
+79 1475 1
+79 1477 1
+79 1478 1
+79 1480 1
+79 1486 1
+79 1489 1
+79 1490 1
+79 1492 1
+79 1493 1
+79 1495 1
+79 1501 1
+79 1502 1
+79 1504 1
+79 1505 1
+79 1509 1
+79 1523 1
+79 1526 1
+79 1529 1
+79 1530 1
+79 1543 1
+79 1546 1
+79 1549 1
+79 1550 1
+79 1562 1
+79 1565 1
+79 1566 1
+79 1568 1
+79 1569 1
+79 1571 1
+79 1578 1
+79 1581 1
+79 1584 1
+79 1585 1
+79 1597 1
+79 1600 1
+79 1601 1
+79 1603 1
+79 1604 1
+79 1606 1
+79 1612 1
+79 1615 1
+79 1616 1
+79 1618 1
+79 1619 1
+79 1621 1
+79 1627 1
+79 1628 1
+79 1630 1
+79 1631 1
+79 1634 1
+79 1637 1
+79 1640 1
+79 1641 1
+79 1653 1
+79 1656 1
+79 1657 1
+79 1659 1
+79 1660 1
+79 1662 1
+79 1668 1
+79 1671 1
+79 1672 1
+79 1674 1
+79 1675 1
+79 1677 1
+79 1683 1
+79 1684 1
+79 1686 1
+79 1687 1
+79 1689 1
+79 1692 1
+79 1693 1
+79 1695 1
+79 1696 1
+79 1698 1
+79 1704 1
+79 1705 1
+79 1707 1
+79 1708 1
+79 1710 1
+79 1711 1
+79 1713 1
+79 1714 1
+79 1716 1
+79 1732 1
+79 1753 1
+79 1768 1
+79 1782 1
+79 1785 1
+79 1788 1
+79 1789 1
+79 1809 1
+79 1824 1
+79 1838 1
+79 1841 1
+79 1844 1
+79 1845 1
+79 1859 1
+79 1873 1
+79 1876 1
+79 1879 1
+79 1880 1
+79 1893 1
+79 1896 1
+79 1899 1
+79 1900 1
+79 1912 1
+79 1915 1
+79 1916 1
+79 1918 1
+79 1919 1
+79 1921 1
+79 1935 1
+79 1950 1
+79 1964 1
+79 1967 1
+79 1970 1
+79 1971 1
+79 1985 1
+79 1999 1
+79 2002 1
+79 2005 1
+79 2006 1
+79 2019 1
+79 2022 1
+79 2025 1
+79 2026 1
+79 2038 1
+79 2041 1
+79 2042 1
+79 2044 1
+79 2045 1
+79 2047 1
+79 2055 1
+79 2069 1
+79 2072 1
+79 2075 1
+79 2076 1
+79 2089 1
+79 2092 1
+79 2095 1
+79 2096 1
+79 2108 1
+79 2111 1
+79 2112 1
+79 2114 1
+79 2115 1
+79 2117 1
+79 2124 1
+79 2127 1
+79 2130 1
+79 2131 1
+79 2143 1
+79 2146 1
+79 2147 1
+79 2149 1
+79 2150 1
+79 2152 1
+79 2158 1
+79 2161 1
+79 2162 1
+79 2164 1
+79 2165 1
+79 2167 1
+79 2173 1
+79 2174 1
+79 2176 1
+79 2177 1
+79 2187 1
+79 2202 1
+79 2216 1
+79 2219 1
+79 2222 1
+79 2223 1
+79 2237 1
+79 2251 1
+79 2254 1
+79 2257 1
+79 2258 1
+79 2271 1
+79 2274 1
+79 2277 1
+79 2278 1
+79 2290 1
+79 2293 1
+79 2294 1
+79 2296 1
+79 2297 1
+79 2299 1
+79 2307 1
+79 2321 1
+79 2324 1
+79 2327 1
+79 2328 1
+79 2341 1
+79 2344 1
+79 2347 1
+79 2348 1
+79 2360 1
+79 2363 1
+79 2364 1
+79 2366 1
+79 2367 1
+79 2369 1
+79 2376 1
+79 2379 1
+79 2382 1
+79 2383 1
+79 2395 1
+79 2398 1
+79 2399 1
+79 2401 1
+79 2402 1
+79 2404 1
+79 2410 1
+79 2413 1
+79 2414 1
+79 2416 1
+79 2417 1
+79 2419 1
+79 2425 1
+79 2426 1
+79 2428 1
+79 2429 1
+79 2433 1
+79 2447 1
+79 2450 1
+79 2453 1
+79 2454 1
+79 2467 1
+79 2470 1
+79 2473 1
+79 2474 1
+79 2486 1
+79 2489 1
+79 2490 1
+79 2492 1
+79 2493 1
+79 2495 1
+79 2502 1
+79 2505 1
+79 2508 1
+79 2509 1
+79 2521 1
+79 2524 1
+79 2525 1
+79 2527 1
+79 2528 1
+79 2530 1
+79 2536 1
+79 2539 1
+79 2540 1
+79 2542 1
+79 2543 1
+79 2545 1
+79 2551 1
+79 2552 1
+79 2554 1
+79 2555 1
+79 2558 1
+79 2561 1
+79 2564 1
+79 2565 1
+79 2577 1
+79 2580 1
+79 2581 1
+79 2583 1
+79 2584 1
+79 2586 1
+79 2592 1
+79 2595 1
+79 2596 1
+79 2598 1
+79 2599 1
+79 2601 1
+79 2607 1
+79 2608 1
+79 2610 1
+79 2611 1
+79 2613 1
+79 2616 1
+79 2617 1
+79 2619 1
+79 2620 1
+79 2622 1
+79 2628 1
+79 2629 1
+79 2631 1
+79 2632 1
+79 2634 1
+79 2635 1
+79 2637 1
+79 2638 1
+79 2640 1
+79 2649 1
+79 2664 1
+79 2678 1
+79 2681 1
+79 2684 1
+79 2685 1
+79 2699 1
+79 2713 1
+79 2716 1
+79 2719 1
+79 2720 1
+79 2733 1
+79 2736 1
+79 2739 1
+79 2740 1
+79 2752 1
+79 2755 1
+79 2756 1
+79 2758 1
+79 2759 1
+79 2761 1
+79 2769 1
+79 2783 1
+79 2786 1
+79 2789 1
+79 2790 1
+79 2803 1
+79 2806 1
+79 2809 1
+79 2810 1
+79 2822 1
+79 2825 1
+79 2826 1
+79 2828 1
+79 2829 1
+79 2831 1
+79 2838 1
+79 2841 1
+79 2844 1
+79 2845 1
+79 2857 1
+79 2860 1
+79 2861 1
+79 2863 1
+79 2864 1
+79 2866 1
+79 2872 1
+79 2875 1
+79 2876 1
+79 2878 1
+79 2879 1
+79 2881 1
+79 2887 1
+79 2888 1
+79 2890 1
+79 2891 1
+79 2895 1
+79 2909 1
+79 2912 1
+79 2915 1
+79 2916 1
+79 2929 1
+79 2932 1
+79 2935 1
+79 2936 1
+79 2948 1
+79 2951 1
+79 2952 1
+79 2954 1
+79 2955 1
+79 2957 1
+79 2964 1
+79 2967 1
+79 2970 1
+79 2971 1
+79 2983 1
+79 2986 1
+79 2987 1
+79 2989 1
+79 2990 1
+79 2992 1
+79 2998 1
+79 3001 1
+79 3002 1
+79 3004 1
+79 3005 1
+79 3007 1
+79 3013 1
+79 3014 1
+79 3016 1
+79 3017 1
+79 3020 1
+79 3023 1
+79 3026 1
+79 3027 1
+79 3039 1
+79 3042 1
+79 3043 1
+79 3045 1
+79 3046 1
+79 3048 1
+79 3054 1
+79 3057 1
+79 3058 1
+79 3060 1
+79 3061 1
+79 3063 1
+79 3069 1
+79 3070 1
+79 3072 1
+79 3073 1
+79 3075 1
+79 3078 1
+79 3079 1
+79 3081 1
+79 3082 1
+79 3084 1
+79 3090 1
+79 3091 1
+79 3093 1
+79 3094 1
+79 3096 1
+79 3097 1
+79 3099 1
+79 3100 1
+79 3102 1
+79 3105 1
+79 3119 1
+79 3122 1
+79 3125 1
+79 3126 1
+79 3139 1
+79 3142 1
+79 3145 1
+79 3146 1
+79 3158 1
+79 3161 1
+79 3162 1
+79 3164 1
+79 3165 1
+79 3167 1
+79 3174 1
+79 3177 1
+79 3180 1
+79 3181 1
+79 3193 1
+79 3196 1
+79 3197 1
+79 3199 1
+79 3200 1
+79 3202 1
+79 3208 1
+79 3211 1
+79 3212 1
+79 3214 1
+79 3215 1
+79 3217 1
+79 3223 1
+79 3224 1
+79 3226 1
+79 3227 1
+79 3230 1
+79 3233 1
+79 3236 1
+79 3237 1
+79 3249 1
+79 3252 1
+79 3253 1
+79 3255 1
+79 3256 1
+79 3258 1
+79 3264 1
+79 3267 1
+79 3268 1
+79 3270 1
+79 3271 1
+79 3273 1
+79 3279 1
+79 3280 1
+79 3282 1
+79 3283 1
+79 3285 1
+79 3288 1
+79 3289 1
+79 3291 1
+79 3292 1
+79 3294 1
+79 3300 1
+79 3301 1
+79 3303 1
+79 3304 1
+79 3306 1
+79 3307 1
+79 3309 1
+79 3310 1
+79 3312 1
+79 3314 1
+79 3317 1
+79 3320 1
+79 3321 1
+79 3333 1
+79 3336 1
+79 3337 1
+79 3339 1
+79 3340 1
+79 3342 1
+79 3348 1
+79 3351 1
+79 3352 1
+79 3354 1
+79 3355 1
+79 3357 1
+79 3363 1
+79 3364 1
+79 3366 1
+79 3367 1
+79 3369 1
+79 3372 1
+79 3373 1
+79 3375 1
+79 3376 1
+79 3378 1
+79 3384 1
+79 3385 1
+79 3387 1
+79 3388 1
+79 3390 1
+79 3391 1
+79 3393 1
+79 3394 1
+79 3396 1
+79 3397 1
+79 3400 1
+79 3401 1
+79 3403 1
+79 3404 1
+79 3406 1
+79 3412 1
+79 3413 1
+79 3415 1
+79 3416 1
+79 3418 1
+79 3419 1
+79 3421 1
+79 3422 1
+79 3424 1
+79 3425 1
+79 3426 1
+79 3428 1
+79 3429 1
+79 3431 1
+79 3432 1
+80 25 1
+80 53 1
+80 74 1
+80 89 1
+80 103 1
+80 106 1
+80 108 1
+80 110 1
+80 137 1
+80 158 1
+80 173 1
+80 187 1
+80 190 1
+80 192 1
+80 194 1
+80 214 1
+80 229 1
+80 243 1
+80 246 1
+80 248 1
+80 250 1
+80 264 1
+80 278 1
+80 281 1
+80 283 1
+80 285 1
+80 298 1
+80 301 1
+80 303 1
+80 305 1
+80 317 1
+80 319 1
+80 321 1
+80 322 1
+80 324 1
+80 325 1
+80 347 1
+80 368 1
+80 383 1
+80 397 1
+80 400 1
+80 402 1
+80 404 1
+80 424 1
+80 439 1
+80 453 1
+80 456 1
+80 458 1
+80 460 1
+80 474 1
+80 488 1
+80 491 1
+80 493 1
+80 495 1
+80 508 1
+80 511 1
+80 513 1
+80 515 1
+80 527 1
+80 529 1
+80 531 1
+80 532 1
+80 534 1
+80 535 1
+80 550 1
+80 565 1
+80 579 1
+80 582 1
+80 584 1
+80 586 1
+80 600 1
+80 614 1
+80 617 1
+80 619 1
+80 621 1
+80 634 1
+80 637 1
+80 639 1
+80 641 1
+80 653 1
+80 655 1
+80 657 1
+80 658 1
+80 660 1
+80 661 1
+80 670 1
+80 684 1
+80 687 1
+80 689 1
+80 691 1
+80 704 1
+80 707 1
+80 709 1
+80 711 1
+80 723 1
+80 725 1
+80 727 1
+80 728 1
+80 730 1
+80 731 1
+80 739 1
+80 742 1
+80 744 1
+80 746 1
+80 758 1
+80 760 1
+80 762 1
+80 763 1
+80 765 1
+80 766 1
+80 773 1
+80 775 1
+80 777 1
+80 778 1
+80 780 1
+80 781 1
+80 787 1
+80 789 1
+80 790 1
+80 791 1
+80 809 1
+80 830 1
+80 845 1
+80 859 1
+80 862 1
+80 864 1
+80 866 1
+80 886 1
+80 901 1
+80 915 1
+80 918 1
+80 920 1
+80 922 1
+80 936 1
+80 950 1
+80 953 1
+80 955 1
+80 957 1
+80 970 1
+80 973 1
+80 975 1
+80 977 1
+80 989 1
+80 991 1
+80 993 1
+80 994 1
+80 996 1
+80 997 1
+80 1012 1
+80 1027 1
+80 1041 1
+80 1044 1
+80 1046 1
+80 1048 1
+80 1062 1
+80 1076 1
+80 1079 1
+80 1081 1
+80 1083 1
+80 1096 1
+80 1099 1
+80 1101 1
+80 1103 1
+80 1115 1
+80 1117 1
+80 1119 1
+80 1120 1
+80 1122 1
+80 1123 1
+80 1132 1
+80 1146 1
+80 1149 1
+80 1151 1
+80 1153 1
+80 1166 1
+80 1169 1
+80 1171 1
+80 1173 1
+80 1185 1
+80 1187 1
+80 1189 1
+80 1190 1
+80 1192 1
+80 1193 1
+80 1201 1
+80 1204 1
+80 1206 1
+80 1208 1
+80 1220 1
+80 1222 1
+80 1224 1
+80 1225 1
+80 1227 1
+80 1228 1
+80 1235 1
+80 1237 1
+80 1239 1
+80 1240 1
+80 1242 1
+80 1243 1
+80 1249 1
+80 1251 1
+80 1252 1
+80 1253 1
+80 1264 1
+80 1279 1
+80 1293 1
+80 1296 1
+80 1298 1
+80 1300 1
+80 1314 1
+80 1328 1
+80 1331 1
+80 1333 1
+80 1335 1
+80 1348 1
+80 1351 1
+80 1353 1
+80 1355 1
+80 1367 1
+80 1369 1
+80 1371 1
+80 1372 1
+80 1374 1
+80 1375 1
+80 1384 1
+80 1398 1
+80 1401 1
+80 1403 1
+80 1405 1
+80 1418 1
+80 1421 1
+80 1423 1
+80 1425 1
+80 1437 1
+80 1439 1
+80 1441 1
+80 1442 1
+80 1444 1
+80 1445 1
+80 1453 1
+80 1456 1
+80 1458 1
+80 1460 1
+80 1472 1
+80 1474 1
+80 1476 1
+80 1477 1
+80 1479 1
+80 1480 1
+80 1487 1
+80 1489 1
+80 1491 1
+80 1492 1
+80 1494 1
+80 1495 1
+80 1501 1
+80 1503 1
+80 1504 1
+80 1505 1
+80 1510 1
+80 1524 1
+80 1527 1
+80 1529 1
+80 1531 1
+80 1544 1
+80 1547 1
+80 1549 1
+80 1551 1
+80 1563 1
+80 1565 1
+80 1567 1
+80 1568 1
+80 1570 1
+80 1571 1
+80 1579 1
+80 1582 1
+80 1584 1
+80 1586 1
+80 1598 1
+80 1600 1
+80 1602 1
+80 1603 1
+80 1605 1
+80 1606 1
+80 1613 1
+80 1615 1
+80 1617 1
+80 1618 1
+80 1620 1
+80 1621 1
+80 1627 1
+80 1629 1
+80 1630 1
+80 1631 1
+80 1635 1
+80 1638 1
+80 1640 1
+80 1642 1
+80 1654 1
+80 1656 1
+80 1658 1
+80 1659 1
+80 1661 1
+80 1662 1
+80 1669 1
+80 1671 1
+80 1673 1
+80 1674 1
+80 1676 1
+80 1677 1
+80 1683 1
+80 1685 1
+80 1686 1
+80 1687 1
+80 1690 1
+80 1692 1
+80 1694 1
+80 1695 1
+80 1697 1
+80 1698 1
+80 1704 1
+80 1706 1
+80 1707 1
+80 1708 1
+80 1710 1
+80 1712 1
+80 1713 1
+80 1714 1
+80 1716 1
+80 1733 1
+80 1754 1
+80 1769 1
+80 1783 1
+80 1786 1
+80 1788 1
+80 1790 1
+80 1810 1
+80 1825 1
+80 1839 1
+80 1842 1
+80 1844 1
+80 1846 1
+80 1860 1
+80 1874 1
+80 1877 1
+80 1879 1
+80 1881 1
+80 1894 1
+80 1897 1
+80 1899 1
+80 1901 1
+80 1913 1
+80 1915 1
+80 1917 1
+80 1918 1
+80 1920 1
+80 1921 1
+80 1936 1
+80 1951 1
+80 1965 1
+80 1968 1
+80 1970 1
+80 1972 1
+80 1986 1
+80 2000 1
+80 2003 1
+80 2005 1
+80 2007 1
+80 2020 1
+80 2023 1
+80 2025 1
+80 2027 1
+80 2039 1
+80 2041 1
+80 2043 1
+80 2044 1
+80 2046 1
+80 2047 1
+80 2056 1
+80 2070 1
+80 2073 1
+80 2075 1
+80 2077 1
+80 2090 1
+80 2093 1
+80 2095 1
+80 2097 1
+80 2109 1
+80 2111 1
+80 2113 1
+80 2114 1
+80 2116 1
+80 2117 1
+80 2125 1
+80 2128 1
+80 2130 1
+80 2132 1
+80 2144 1
+80 2146 1
+80 2148 1
+80 2149 1
+80 2151 1
+80 2152 1
+80 2159 1
+80 2161 1
+80 2163 1
+80 2164 1
+80 2166 1
+80 2167 1
+80 2173 1
+80 2175 1
+80 2176 1
+80 2177 1
+80 2188 1
+80 2203 1
+80 2217 1
+80 2220 1
+80 2222 1
+80 2224 1
+80 2238 1
+80 2252 1
+80 2255 1
+80 2257 1
+80 2259 1
+80 2272 1
+80 2275 1
+80 2277 1
+80 2279 1
+80 2291 1
+80 2293 1
+80 2295 1
+80 2296 1
+80 2298 1
+80 2299 1
+80 2308 1
+80 2322 1
+80 2325 1
+80 2327 1
+80 2329 1
+80 2342 1
+80 2345 1
+80 2347 1
+80 2349 1
+80 2361 1
+80 2363 1
+80 2365 1
+80 2366 1
+80 2368 1
+80 2369 1
+80 2377 1
+80 2380 1
+80 2382 1
+80 2384 1
+80 2396 1
+80 2398 1
+80 2400 1
+80 2401 1
+80 2403 1
+80 2404 1
+80 2411 1
+80 2413 1
+80 2415 1
+80 2416 1
+80 2418 1
+80 2419 1
+80 2425 1
+80 2427 1
+80 2428 1
+80 2429 1
+80 2434 1
+80 2448 1
+80 2451 1
+80 2453 1
+80 2455 1
+80 2468 1
+80 2471 1
+80 2473 1
+80 2475 1
+80 2487 1
+80 2489 1
+80 2491 1
+80 2492 1
+80 2494 1
+80 2495 1
+80 2503 1
+80 2506 1
+80 2508 1
+80 2510 1
+80 2522 1
+80 2524 1
+80 2526 1
+80 2527 1
+80 2529 1
+80 2530 1
+80 2537 1
+80 2539 1
+80 2541 1
+80 2542 1
+80 2544 1
+80 2545 1
+80 2551 1
+80 2553 1
+80 2554 1
+80 2555 1
+80 2559 1
+80 2562 1
+80 2564 1
+80 2566 1
+80 2578 1
+80 2580 1
+80 2582 1
+80 2583 1
+80 2585 1
+80 2586 1
+80 2593 1
+80 2595 1
+80 2597 1
+80 2598 1
+80 2600 1
+80 2601 1
+80 2607 1
+80 2609 1
+80 2610 1
+80 2611 1
+80 2614 1
+80 2616 1
+80 2618 1
+80 2619 1
+80 2621 1
+80 2622 1
+80 2628 1
+80 2630 1
+80 2631 1
+80 2632 1
+80 2634 1
+80 2636 1
+80 2637 1
+80 2638 1
+80 2640 1
+80 2650 1
+80 2665 1
+80 2679 1
+80 2682 1
+80 2684 1
+80 2686 1
+80 2700 1
+80 2714 1
+80 2717 1
+80 2719 1
+80 2721 1
+80 2734 1
+80 2737 1
+80 2739 1
+80 2741 1
+80 2753 1
+80 2755 1
+80 2757 1
+80 2758 1
+80 2760 1
+80 2761 1
+80 2770 1
+80 2784 1
+80 2787 1
+80 2789 1
+80 2791 1
+80 2804 1
+80 2807 1
+80 2809 1
+80 2811 1
+80 2823 1
+80 2825 1
+80 2827 1
+80 2828 1
+80 2830 1
+80 2831 1
+80 2839 1
+80 2842 1
+80 2844 1
+80 2846 1
+80 2858 1
+80 2860 1
+80 2862 1
+80 2863 1
+80 2865 1
+80 2866 1
+80 2873 1
+80 2875 1
+80 2877 1
+80 2878 1
+80 2880 1
+80 2881 1
+80 2887 1
+80 2889 1
+80 2890 1
+80 2891 1
+80 2896 1
+80 2910 1
+80 2913 1
+80 2915 1
+80 2917 1
+80 2930 1
+80 2933 1
+80 2935 1
+80 2937 1
+80 2949 1
+80 2951 1
+80 2953 1
+80 2954 1
+80 2956 1
+80 2957 1
+80 2965 1
+80 2968 1
+80 2970 1
+80 2972 1
+80 2984 1
+80 2986 1
+80 2988 1
+80 2989 1
+80 2991 1
+80 2992 1
+80 2999 1
+80 3001 1
+80 3003 1
+80 3004 1
+80 3006 1
+80 3007 1
+80 3013 1
+80 3015 1
+80 3016 1
+80 3017 1
+80 3021 1
+80 3024 1
+80 3026 1
+80 3028 1
+80 3040 1
+80 3042 1
+80 3044 1
+80 3045 1
+80 3047 1
+80 3048 1
+80 3055 1
+80 3057 1
+80 3059 1
+80 3060 1
+80 3062 1
+80 3063 1
+80 3069 1
+80 3071 1
+80 3072 1
+80 3073 1
+80 3076 1
+80 3078 1
+80 3080 1
+80 3081 1
+80 3083 1
+80 3084 1
+80 3090 1
+80 3092 1
+80 3093 1
+80 3094 1
+80 3096 1
+80 3098 1
+80 3099 1
+80 3100 1
+80 3102 1
+80 3106 1
+80 3120 1
+80 3123 1
+80 3125 1
+80 3127 1
+80 3140 1
+80 3143 1
+80 3145 1
+80 3147 1
+80 3159 1
+80 3161 1
+80 3163 1
+80 3164 1
+80 3166 1
+80 3167 1
+80 3175 1
+80 3178 1
+80 3180 1
+80 3182 1
+80 3194 1
+80 3196 1
+80 3198 1
+80 3199 1
+80 3201 1
+80 3202 1
+80 3209 1
+80 3211 1
+80 3213 1
+80 3214 1
+80 3216 1
+80 3217 1
+80 3223 1
+80 3225 1
+80 3226 1
+80 3227 1
+80 3231 1
+80 3234 1
+80 3236 1
+80 3238 1
+80 3250 1
+80 3252 1
+80 3254 1
+80 3255 1
+80 3257 1
+80 3258 1
+80 3265 1
+80 3267 1
+80 3269 1
+80 3270 1
+80 3272 1
+80 3273 1
+80 3279 1
+80 3281 1
+80 3282 1
+80 3283 1
+80 3286 1
+80 3288 1
+80 3290 1
+80 3291 1
+80 3293 1
+80 3294 1
+80 3300 1
+80 3302 1
+80 3303 1
+80 3304 1
+80 3306 1
+80 3308 1
+80 3309 1
+80 3310 1
+80 3312 1
+80 3315 1
+80 3318 1
+80 3320 1
+80 3322 1
+80 3334 1
+80 3336 1
+80 3338 1
+80 3339 1
+80 3341 1
+80 3342 1
+80 3349 1
+80 3351 1
+80 3353 1
+80 3354 1
+80 3356 1
+80 3357 1
+80 3363 1
+80 3365 1
+80 3366 1
+80 3367 1
+80 3370 1
+80 3372 1
+80 3374 1
+80 3375 1
+80 3377 1
+80 3378 1
+80 3384 1
+80 3386 1
+80 3387 1
+80 3388 1
+80 3390 1
+80 3392 1
+80 3393 1
+80 3394 1
+80 3396 1
+80 3398 1
+80 3400 1
+80 3402 1
+80 3403 1
+80 3405 1
+80 3406 1
+80 3412 1
+80 3414 1
+80 3415 1
+80 3416 1
+80 3418 1
+80 3420 1
+80 3421 1
+80 3422 1
+80 3424 1
+80 3425 1
+80 3427 1
+80 3428 1
+80 3429 1
+80 3431 1
+80 3432 1
+81 26 1
+81 54 1
+81 75 1
+81 90 1
+81 104 1
+81 107 1
+81 109 1
+81 110 1
+81 138 1
+81 159 1
+81 174 1
+81 188 1
+81 191 1
+81 193 1
+81 194 1
+81 215 1
+81 230 1
+81 244 1
+81 247 1
+81 249 1
+81 250 1
+81 265 1
+81 279 1
+81 282 1
+81 284 1
+81 285 1
+81 299 1
+81 302 1
+81 304 1
+81 305 1
+81 318 1
+81 320 1
+81 321 1
+81 323 1
+81 324 1
+81 325 1
+81 348 1
+81 369 1
+81 384 1
+81 398 1
+81 401 1
+81 403 1
+81 404 1
+81 425 1
+81 440 1
+81 454 1
+81 457 1
+81 459 1
+81 460 1
+81 475 1
+81 489 1
+81 492 1
+81 494 1
+81 495 1
+81 509 1
+81 512 1
+81 514 1
+81 515 1
+81 528 1
+81 530 1
+81 531 1
+81 533 1
+81 534 1
+81 535 1
+81 551 1
+81 566 1
+81 580 1
+81 583 1
+81 585 1
+81 586 1
+81 601 1
+81 615 1
+81 618 1
+81 620 1
+81 621 1
+81 635 1
+81 638 1
+81 640 1
+81 641 1
+81 654 1
+81 656 1
+81 657 1
+81 659 1
+81 660 1
+81 661 1
+81 671 1
+81 685 1
+81 688 1
+81 690 1
+81 691 1
+81 705 1
+81 708 1
+81 710 1
+81 711 1
+81 724 1
+81 726 1
+81 727 1
+81 729 1
+81 730 1
+81 731 1
+81 740 1
+81 743 1
+81 745 1
+81 746 1
+81 759 1
+81 761 1
+81 762 1
+81 764 1
+81 765 1
+81 766 1
+81 774 1
+81 776 1
+81 777 1
+81 779 1
+81 780 1
+81 781 1
+81 788 1
+81 789 1
+81 790 1
+81 791 1
+81 810 1
+81 831 1
+81 846 1
+81 860 1
+81 863 1
+81 865 1
+81 866 1
+81 887 1
+81 902 1
+81 916 1
+81 919 1
+81 921 1
+81 922 1
+81 937 1
+81 951 1
+81 954 1
+81 956 1
+81 957 1
+81 971 1
+81 974 1
+81 976 1
+81 977 1
+81 990 1
+81 992 1
+81 993 1
+81 995 1
+81 996 1
+81 997 1
+81 1013 1
+81 1028 1
+81 1042 1
+81 1045 1
+81 1047 1
+81 1048 1
+81 1063 1
+81 1077 1
+81 1080 1
+81 1082 1
+81 1083 1
+81 1097 1
+81 1100 1
+81 1102 1
+81 1103 1
+81 1116 1
+81 1118 1
+81 1119 1
+81 1121 1
+81 1122 1
+81 1123 1
+81 1133 1
+81 1147 1
+81 1150 1
+81 1152 1
+81 1153 1
+81 1167 1
+81 1170 1
+81 1172 1
+81 1173 1
+81 1186 1
+81 1188 1
+81 1189 1
+81 1191 1
+81 1192 1
+81 1193 1
+81 1202 1
+81 1205 1
+81 1207 1
+81 1208 1
+81 1221 1
+81 1223 1
+81 1224 1
+81 1226 1
+81 1227 1
+81 1228 1
+81 1236 1
+81 1238 1
+81 1239 1
+81 1241 1
+81 1242 1
+81 1243 1
+81 1250 1
+81 1251 1
+81 1252 1
+81 1253 1
+81 1265 1
+81 1280 1
+81 1294 1
+81 1297 1
+81 1299 1
+81 1300 1
+81 1315 1
+81 1329 1
+81 1332 1
+81 1334 1
+81 1335 1
+81 1349 1
+81 1352 1
+81 1354 1
+81 1355 1
+81 1368 1
+81 1370 1
+81 1371 1
+81 1373 1
+81 1374 1
+81 1375 1
+81 1385 1
+81 1399 1
+81 1402 1
+81 1404 1
+81 1405 1
+81 1419 1
+81 1422 1
+81 1424 1
+81 1425 1
+81 1438 1
+81 1440 1
+81 1441 1
+81 1443 1
+81 1444 1
+81 1445 1
+81 1454 1
+81 1457 1
+81 1459 1
+81 1460 1
+81 1473 1
+81 1475 1
+81 1476 1
+81 1478 1
+81 1479 1
+81 1480 1
+81 1488 1
+81 1490 1
+81 1491 1
+81 1493 1
+81 1494 1
+81 1495 1
+81 1502 1
+81 1503 1
+81 1504 1
+81 1505 1
+81 1511 1
+81 1525 1
+81 1528 1
+81 1530 1
+81 1531 1
+81 1545 1
+81 1548 1
+81 1550 1
+81 1551 1
+81 1564 1
+81 1566 1
+81 1567 1
+81 1569 1
+81 1570 1
+81 1571 1
+81 1580 1
+81 1583 1
+81 1585 1
+81 1586 1
+81 1599 1
+81 1601 1
+81 1602 1
+81 1604 1
+81 1605 1
+81 1606 1
+81 1614 1
+81 1616 1
+81 1617 1
+81 1619 1
+81 1620 1
+81 1621 1
+81 1628 1
+81 1629 1
+81 1630 1
+81 1631 1
+81 1636 1
+81 1639 1
+81 1641 1
+81 1642 1
+81 1655 1
+81 1657 1
+81 1658 1
+81 1660 1
+81 1661 1
+81 1662 1
+81 1670 1
+81 1672 1
+81 1673 1
+81 1675 1
+81 1676 1
+81 1677 1
+81 1684 1
+81 1685 1
+81 1686 1
+81 1687 1
+81 1691 1
+81 1693 1
+81 1694 1
+81 1696 1
+81 1697 1
+81 1698 1
+81 1705 1
+81 1706 1
+81 1707 1
+81 1708 1
+81 1711 1
+81 1712 1
+81 1713 1
+81 1714 1
+81 1716 1
+81 1734 1
+81 1755 1
+81 1770 1
+81 1784 1
+81 1787 1
+81 1789 1
+81 1790 1
+81 1811 1
+81 1826 1
+81 1840 1
+81 1843 1
+81 1845 1
+81 1846 1
+81 1861 1
+81 1875 1
+81 1878 1
+81 1880 1
+81 1881 1
+81 1895 1
+81 1898 1
+81 1900 1
+81 1901 1
+81 1914 1
+81 1916 1
+81 1917 1
+81 1919 1
+81 1920 1
+81 1921 1
+81 1937 1
+81 1952 1
+81 1966 1
+81 1969 1
+81 1971 1
+81 1972 1
+81 1987 1
+81 2001 1
+81 2004 1
+81 2006 1
+81 2007 1
+81 2021 1
+81 2024 1
+81 2026 1
+81 2027 1
+81 2040 1
+81 2042 1
+81 2043 1
+81 2045 1
+81 2046 1
+81 2047 1
+81 2057 1
+81 2071 1
+81 2074 1
+81 2076 1
+81 2077 1
+81 2091 1
+81 2094 1
+81 2096 1
+81 2097 1
+81 2110 1
+81 2112 1
+81 2113 1
+81 2115 1
+81 2116 1
+81 2117 1
+81 2126 1
+81 2129 1
+81 2131 1
+81 2132 1
+81 2145 1
+81 2147 1
+81 2148 1
+81 2150 1
+81 2151 1
+81 2152 1
+81 2160 1
+81 2162 1
+81 2163 1
+81 2165 1
+81 2166 1
+81 2167 1
+81 2174 1
+81 2175 1
+81 2176 1
+81 2177 1
+81 2189 1
+81 2204 1
+81 2218 1
+81 2221 1
+81 2223 1
+81 2224 1
+81 2239 1
+81 2253 1
+81 2256 1
+81 2258 1
+81 2259 1
+81 2273 1
+81 2276 1
+81 2278 1
+81 2279 1
+81 2292 1
+81 2294 1
+81 2295 1
+81 2297 1
+81 2298 1
+81 2299 1
+81 2309 1
+81 2323 1
+81 2326 1
+81 2328 1
+81 2329 1
+81 2343 1
+81 2346 1
+81 2348 1
+81 2349 1
+81 2362 1
+81 2364 1
+81 2365 1
+81 2367 1
+81 2368 1
+81 2369 1
+81 2378 1
+81 2381 1
+81 2383 1
+81 2384 1
+81 2397 1
+81 2399 1
+81 2400 1
+81 2402 1
+81 2403 1
+81 2404 1
+81 2412 1
+81 2414 1
+81 2415 1
+81 2417 1
+81 2418 1
+81 2419 1
+81 2426 1
+81 2427 1
+81 2428 1
+81 2429 1
+81 2435 1
+81 2449 1
+81 2452 1
+81 2454 1
+81 2455 1
+81 2469 1
+81 2472 1
+81 2474 1
+81 2475 1
+81 2488 1
+81 2490 1
+81 2491 1
+81 2493 1
+81 2494 1
+81 2495 1
+81 2504 1
+81 2507 1
+81 2509 1
+81 2510 1
+81 2523 1
+81 2525 1
+81 2526 1
+81 2528 1
+81 2529 1
+81 2530 1
+81 2538 1
+81 2540 1
+81 2541 1
+81 2543 1
+81 2544 1
+81 2545 1
+81 2552 1
+81 2553 1
+81 2554 1
+81 2555 1
+81 2560 1
+81 2563 1
+81 2565 1
+81 2566 1
+81 2579 1
+81 2581 1
+81 2582 1
+81 2584 1
+81 2585 1
+81 2586 1
+81 2594 1
+81 2596 1
+81 2597 1
+81 2599 1
+81 2600 1
+81 2601 1
+81 2608 1
+81 2609 1
+81 2610 1
+81 2611 1
+81 2615 1
+81 2617 1
+81 2618 1
+81 2620 1
+81 2621 1
+81 2622 1
+81 2629 1
+81 2630 1
+81 2631 1
+81 2632 1
+81 2635 1
+81 2636 1
+81 2637 1
+81 2638 1
+81 2640 1
+81 2651 1
+81 2666 1
+81 2680 1
+81 2683 1
+81 2685 1
+81 2686 1
+81 2701 1
+81 2715 1
+81 2718 1
+81 2720 1
+81 2721 1
+81 2735 1
+81 2738 1
+81 2740 1
+81 2741 1
+81 2754 1
+81 2756 1
+81 2757 1
+81 2759 1
+81 2760 1
+81 2761 1
+81 2771 1
+81 2785 1
+81 2788 1
+81 2790 1
+81 2791 1
+81 2805 1
+81 2808 1
+81 2810 1
+81 2811 1
+81 2824 1
+81 2826 1
+81 2827 1
+81 2829 1
+81 2830 1
+81 2831 1
+81 2840 1
+81 2843 1
+81 2845 1
+81 2846 1
+81 2859 1
+81 2861 1
+81 2862 1
+81 2864 1
+81 2865 1
+81 2866 1
+81 2874 1
+81 2876 1
+81 2877 1
+81 2879 1
+81 2880 1
+81 2881 1
+81 2888 1
+81 2889 1
+81 2890 1
+81 2891 1
+81 2897 1
+81 2911 1
+81 2914 1
+81 2916 1
+81 2917 1
+81 2931 1
+81 2934 1
+81 2936 1
+81 2937 1
+81 2950 1
+81 2952 1
+81 2953 1
+81 2955 1
+81 2956 1
+81 2957 1
+81 2966 1
+81 2969 1
+81 2971 1
+81 2972 1
+81 2985 1
+81 2987 1
+81 2988 1
+81 2990 1
+81 2991 1
+81 2992 1
+81 3000 1
+81 3002 1
+81 3003 1
+81 3005 1
+81 3006 1
+81 3007 1
+81 3014 1
+81 3015 1
+81 3016 1
+81 3017 1
+81 3022 1
+81 3025 1
+81 3027 1
+81 3028 1
+81 3041 1
+81 3043 1
+81 3044 1
+81 3046 1
+81 3047 1
+81 3048 1
+81 3056 1
+81 3058 1
+81 3059 1
+81 3061 1
+81 3062 1
+81 3063 1
+81 3070 1
+81 3071 1
+81 3072 1
+81 3073 1
+81 3077 1
+81 3079 1
+81 3080 1
+81 3082 1
+81 3083 1
+81 3084 1
+81 3091 1
+81 3092 1
+81 3093 1
+81 3094 1
+81 3097 1
+81 3098 1
+81 3099 1
+81 3100 1
+81 3102 1
+81 3107 1
+81 3121 1
+81 3124 1
+81 3126 1
+81 3127 1
+81 3141 1
+81 3144 1
+81 3146 1
+81 3147 1
+81 3160 1
+81 3162 1
+81 3163 1
+81 3165 1
+81 3166 1
+81 3167 1
+81 3176 1
+81 3179 1
+81 3181 1
+81 3182 1
+81 3195 1
+81 3197 1
+81 3198 1
+81 3200 1
+81 3201 1
+81 3202 1
+81 3210 1
+81 3212 1
+81 3213 1
+81 3215 1
+81 3216 1
+81 3217 1
+81 3224 1
+81 3225 1
+81 3226 1
+81 3227 1
+81 3232 1
+81 3235 1
+81 3237 1
+81 3238 1
+81 3251 1
+81 3253 1
+81 3254 1
+81 3256 1
+81 3257 1
+81 3258 1
+81 3266 1
+81 3268 1
+81 3269 1
+81 3271 1
+81 3272 1
+81 3273 1
+81 3280 1
+81 3281 1
+81 3282 1
+81 3283 1
+81 3287 1
+81 3289 1
+81 3290 1
+81 3292 1
+81 3293 1
+81 3294 1
+81 3301 1
+81 3302 1
+81 3303 1
+81 3304 1
+81 3307 1
+81 3308 1
+81 3309 1
+81 3310 1
+81 3312 1
+81 3316 1
+81 3319 1
+81 3321 1
+81 3322 1
+81 3335 1
+81 3337 1
+81 3338 1
+81 3340 1
+81 3341 1
+81 3342 1
+81 3350 1
+81 3352 1
+81 3353 1
+81 3355 1
+81 3356 1
+81 3357 1
+81 3364 1
+81 3365 1
+81 3366 1
+81 3367 1
+81 3371 1
+81 3373 1
+81 3374 1
+81 3376 1
+81 3377 1
+81 3378 1
+81 3385 1
+81 3386 1
+81 3387 1
+81 3388 1
+81 3391 1
+81 3392 1
+81 3393 1
+81 3394 1
+81 3396 1
+81 3399 1
+81 3401 1
+81 3402 1
+81 3404 1
+81 3405 1
+81 3406 1
+81 3413 1
+81 3414 1
+81 3415 1
+81 3416 1
+81 3419 1
+81 3420 1
+81 3421 1
+81 3422 1
+81 3424 1
+81 3426 1
+81 3427 1
+81 3428 1
+81 3429 1
+81 3431 1
+81 3432 1
+82 27 1
+82 55 1
+82 76 1
+82 91 1
+82 101 1
+82 111 1
+82 112 1
+82 113 1
+82 139 1
+82 160 1
+82 175 1
+82 185 1
+82 195 1
+82 196 1
+82 197 1
+82 216 1
+82 231 1
+82 241 1
+82 251 1
+82 252 1
+82 253 1
+82 266 1
+82 276 1
+82 286 1
+82 287 1
+82 288 1
+82 296 1
+82 306 1
+82 307 1
+82 308 1
+82 316 1
+82 317 1
+82 318 1
+82 326 1
+82 327 1
+82 328 1
+82 349 1
+82 370 1
+82 385 1
+82 395 1
+82 405 1
+82 406 1
+82 407 1
+82 426 1
+82 441 1
+82 451 1
+82 461 1
+82 462 1
+82 463 1
+82 476 1
+82 486 1
+82 496 1
+82 497 1
+82 498 1
+82 506 1
+82 516 1
+82 517 1
+82 518 1
+82 526 1
+82 527 1
+82 528 1
+82 536 1
+82 537 1
+82 538 1
+82 552 1
+82 567 1
+82 577 1
+82 587 1
+82 588 1
+82 589 1
+82 602 1
+82 612 1
+82 622 1
+82 623 1
+82 624 1
+82 632 1
+82 642 1
+82 643 1
+82 644 1
+82 652 1
+82 653 1
+82 654 1
+82 662 1
+82 663 1
+82 664 1
+82 672 1
+82 682 1
+82 692 1
+82 693 1
+82 694 1
+82 702 1
+82 712 1
+82 713 1
+82 714 1
+82 722 1
+82 723 1
+82 724 1
+82 732 1
+82 733 1
+82 734 1
+82 737 1
+82 747 1
+82 748 1
+82 749 1
+82 757 1
+82 758 1
+82 759 1
+82 767 1
+82 768 1
+82 769 1
+82 772 1
+82 773 1
+82 774 1
+82 782 1
+82 783 1
+82 784 1
+82 787 1
+82 788 1
+82 789 1
+82 792 1
+82 811 1
+82 832 1
+82 847 1
+82 857 1
+82 867 1
+82 868 1
+82 869 1
+82 888 1
+82 903 1
+82 913 1
+82 923 1
+82 924 1
+82 925 1
+82 938 1
+82 948 1
+82 958 1
+82 959 1
+82 960 1
+82 968 1
+82 978 1
+82 979 1
+82 980 1
+82 988 1
+82 989 1
+82 990 1
+82 998 1
+82 999 1
+82 1000 1
+82 1014 1
+82 1029 1
+82 1039 1
+82 1049 1
+82 1050 1
+82 1051 1
+82 1064 1
+82 1074 1
+82 1084 1
+82 1085 1
+82 1086 1
+82 1094 1
+82 1104 1
+82 1105 1
+82 1106 1
+82 1114 1
+82 1115 1
+82 1116 1
+82 1124 1
+82 1125 1
+82 1126 1
+82 1134 1
+82 1144 1
+82 1154 1
+82 1155 1
+82 1156 1
+82 1164 1
+82 1174 1
+82 1175 1
+82 1176 1
+82 1184 1
+82 1185 1
+82 1186 1
+82 1194 1
+82 1195 1
+82 1196 1
+82 1199 1
+82 1209 1
+82 1210 1
+82 1211 1
+82 1219 1
+82 1220 1
+82 1221 1
+82 1229 1
+82 1230 1
+82 1231 1
+82 1234 1
+82 1235 1
+82 1236 1
+82 1244 1
+82 1245 1
+82 1246 1
+82 1249 1
+82 1250 1
+82 1251 1
+82 1254 1
+82 1266 1
+82 1281 1
+82 1291 1
+82 1301 1
+82 1302 1
+82 1303 1
+82 1316 1
+82 1326 1
+82 1336 1
+82 1337 1
+82 1338 1
+82 1346 1
+82 1356 1
+82 1357 1
+82 1358 1
+82 1366 1
+82 1367 1
+82 1368 1
+82 1376 1
+82 1377 1
+82 1378 1
+82 1386 1
+82 1396 1
+82 1406 1
+82 1407 1
+82 1408 1
+82 1416 1
+82 1426 1
+82 1427 1
+82 1428 1
+82 1436 1
+82 1437 1
+82 1438 1
+82 1446 1
+82 1447 1
+82 1448 1
+82 1451 1
+82 1461 1
+82 1462 1
+82 1463 1
+82 1471 1
+82 1472 1
+82 1473 1
+82 1481 1
+82 1482 1
+82 1483 1
+82 1486 1
+82 1487 1
+82 1488 1
+82 1496 1
+82 1497 1
+82 1498 1
+82 1501 1
+82 1502 1
+82 1503 1
+82 1506 1
+82 1512 1
+82 1522 1
+82 1532 1
+82 1533 1
+82 1534 1
+82 1542 1
+82 1552 1
+82 1553 1
+82 1554 1
+82 1562 1
+82 1563 1
+82 1564 1
+82 1572 1
+82 1573 1
+82 1574 1
+82 1577 1
+82 1587 1
+82 1588 1
+82 1589 1
+82 1597 1
+82 1598 1
+82 1599 1
+82 1607 1
+82 1608 1
+82 1609 1
+82 1612 1
+82 1613 1
+82 1614 1
+82 1622 1
+82 1623 1
+82 1624 1
+82 1627 1
+82 1628 1
+82 1629 1
+82 1632 1
+82 1633 1
+82 1643 1
+82 1644 1
+82 1645 1
+82 1653 1
+82 1654 1
+82 1655 1
+82 1663 1
+82 1664 1
+82 1665 1
+82 1668 1
+82 1669 1
+82 1670 1
+82 1678 1
+82 1679 1
+82 1680 1
+82 1683 1
+82 1684 1
+82 1685 1
+82 1688 1
+82 1689 1
+82 1690 1
+82 1691 1
+82 1699 1
+82 1700 1
+82 1701 1
+82 1704 1
+82 1705 1
+82 1706 1
+82 1709 1
+82 1710 1
+82 1711 1
+82 1712 1
+82 1715 1
+82 1716 1
+82 1735 1
+82 1756 1
+82 1771 1
+82 1781 1
+82 1791 1
+82 1792 1
+82 1793 1
+82 1812 1
+82 1827 1
+82 1837 1
+82 1847 1
+82 1848 1
+82 1849 1
+82 1862 1
+82 1872 1
+82 1882 1
+82 1883 1
+82 1884 1
+82 1892 1
+82 1902 1
+82 1903 1
+82 1904 1
+82 1912 1
+82 1913 1
+82 1914 1
+82 1922 1
+82 1923 1
+82 1924 1
+82 1938 1
+82 1953 1
+82 1963 1
+82 1973 1
+82 1974 1
+82 1975 1
+82 1988 1
+82 1998 1
+82 2008 1
+82 2009 1
+82 2010 1
+82 2018 1
+82 2028 1
+82 2029 1
+82 2030 1
+82 2038 1
+82 2039 1
+82 2040 1
+82 2048 1
+82 2049 1
+82 2050 1
+82 2058 1
+82 2068 1
+82 2078 1
+82 2079 1
+82 2080 1
+82 2088 1
+82 2098 1
+82 2099 1
+82 2100 1
+82 2108 1
+82 2109 1
+82 2110 1
+82 2118 1
+82 2119 1
+82 2120 1
+82 2123 1
+82 2133 1
+82 2134 1
+82 2135 1
+82 2143 1
+82 2144 1
+82 2145 1
+82 2153 1
+82 2154 1
+82 2155 1
+82 2158 1
+82 2159 1
+82 2160 1
+82 2168 1
+82 2169 1
+82 2170 1
+82 2173 1
+82 2174 1
+82 2175 1
+82 2178 1
+82 2190 1
+82 2205 1
+82 2215 1
+82 2225 1
+82 2226 1
+82 2227 1
+82 2240 1
+82 2250 1
+82 2260 1
+82 2261 1
+82 2262 1
+82 2270 1
+82 2280 1
+82 2281 1
+82 2282 1
+82 2290 1
+82 2291 1
+82 2292 1
+82 2300 1
+82 2301 1
+82 2302 1
+82 2310 1
+82 2320 1
+82 2330 1
+82 2331 1
+82 2332 1
+82 2340 1
+82 2350 1
+82 2351 1
+82 2352 1
+82 2360 1
+82 2361 1
+82 2362 1
+82 2370 1
+82 2371 1
+82 2372 1
+82 2375 1
+82 2385 1
+82 2386 1
+82 2387 1
+82 2395 1
+82 2396 1
+82 2397 1
+82 2405 1
+82 2406 1
+82 2407 1
+82 2410 1
+82 2411 1
+82 2412 1
+82 2420 1
+82 2421 1
+82 2422 1
+82 2425 1
+82 2426 1
+82 2427 1
+82 2430 1
+82 2436 1
+82 2446 1
+82 2456 1
+82 2457 1
+82 2458 1
+82 2466 1
+82 2476 1
+82 2477 1
+82 2478 1
+82 2486 1
+82 2487 1
+82 2488 1
+82 2496 1
+82 2497 1
+82 2498 1
+82 2501 1
+82 2511 1
+82 2512 1
+82 2513 1
+82 2521 1
+82 2522 1
+82 2523 1
+82 2531 1
+82 2532 1
+82 2533 1
+82 2536 1
+82 2537 1
+82 2538 1
+82 2546 1
+82 2547 1
+82 2548 1
+82 2551 1
+82 2552 1
+82 2553 1
+82 2556 1
+82 2557 1
+82 2567 1
+82 2568 1
+82 2569 1
+82 2577 1
+82 2578 1
+82 2579 1
+82 2587 1
+82 2588 1
+82 2589 1
+82 2592 1
+82 2593 1
+82 2594 1
+82 2602 1
+82 2603 1
+82 2604 1
+82 2607 1
+82 2608 1
+82 2609 1
+82 2612 1
+82 2613 1
+82 2614 1
+82 2615 1
+82 2623 1
+82 2624 1
+82 2625 1
+82 2628 1
+82 2629 1
+82 2630 1
+82 2633 1
+82 2634 1
+82 2635 1
+82 2636 1
+82 2639 1
+82 2640 1
+82 2652 1
+82 2667 1
+82 2677 1
+82 2687 1
+82 2688 1
+82 2689 1
+82 2702 1
+82 2712 1
+82 2722 1
+82 2723 1
+82 2724 1
+82 2732 1
+82 2742 1
+82 2743 1
+82 2744 1
+82 2752 1
+82 2753 1
+82 2754 1
+82 2762 1
+82 2763 1
+82 2764 1
+82 2772 1
+82 2782 1
+82 2792 1
+82 2793 1
+82 2794 1
+82 2802 1
+82 2812 1
+82 2813 1
+82 2814 1
+82 2822 1
+82 2823 1
+82 2824 1
+82 2832 1
+82 2833 1
+82 2834 1
+82 2837 1
+82 2847 1
+82 2848 1
+82 2849 1
+82 2857 1
+82 2858 1
+82 2859 1
+82 2867 1
+82 2868 1
+82 2869 1
+82 2872 1
+82 2873 1
+82 2874 1
+82 2882 1
+82 2883 1
+82 2884 1
+82 2887 1
+82 2888 1
+82 2889 1
+82 2892 1
+82 2898 1
+82 2908 1
+82 2918 1
+82 2919 1
+82 2920 1
+82 2928 1
+82 2938 1
+82 2939 1
+82 2940 1
+82 2948 1
+82 2949 1
+82 2950 1
+82 2958 1
+82 2959 1
+82 2960 1
+82 2963 1
+82 2973 1
+82 2974 1
+82 2975 1
+82 2983 1
+82 2984 1
+82 2985 1
+82 2993 1
+82 2994 1
+82 2995 1
+82 2998 1
+82 2999 1
+82 3000 1
+82 3008 1
+82 3009 1
+82 3010 1
+82 3013 1
+82 3014 1
+82 3015 1
+82 3018 1
+82 3019 1
+82 3029 1
+82 3030 1
+82 3031 1
+82 3039 1
+82 3040 1
+82 3041 1
+82 3049 1
+82 3050 1
+82 3051 1
+82 3054 1
+82 3055 1
+82 3056 1
+82 3064 1
+82 3065 1
+82 3066 1
+82 3069 1
+82 3070 1
+82 3071 1
+82 3074 1
+82 3075 1
+82 3076 1
+82 3077 1
+82 3085 1
+82 3086 1
+82 3087 1
+82 3090 1
+82 3091 1
+82 3092 1
+82 3095 1
+82 3096 1
+82 3097 1
+82 3098 1
+82 3101 1
+82 3102 1
+82 3108 1
+82 3118 1
+82 3128 1
+82 3129 1
+82 3130 1
+82 3138 1
+82 3148 1
+82 3149 1
+82 3150 1
+82 3158 1
+82 3159 1
+82 3160 1
+82 3168 1
+82 3169 1
+82 3170 1
+82 3173 1
+82 3183 1
+82 3184 1
+82 3185 1
+82 3193 1
+82 3194 1
+82 3195 1
+82 3203 1
+82 3204 1
+82 3205 1
+82 3208 1
+82 3209 1
+82 3210 1
+82 3218 1
+82 3219 1
+82 3220 1
+82 3223 1
+82 3224 1
+82 3225 1
+82 3228 1
+82 3229 1
+82 3239 1
+82 3240 1
+82 3241 1
+82 3249 1
+82 3250 1
+82 3251 1
+82 3259 1
+82 3260 1
+82 3261 1
+82 3264 1
+82 3265 1
+82 3266 1
+82 3274 1
+82 3275 1
+82 3276 1
+82 3279 1
+82 3280 1
+82 3281 1
+82 3284 1
+82 3285 1
+82 3286 1
+82 3287 1
+82 3295 1
+82 3296 1
+82 3297 1
+82 3300 1
+82 3301 1
+82 3302 1
+82 3305 1
+82 3306 1
+82 3307 1
+82 3308 1
+82 3311 1
+82 3312 1
+82 3313 1
+82 3323 1
+82 3324 1
+82 3325 1
+82 3333 1
+82 3334 1
+82 3335 1
+82 3343 1
+82 3344 1
+82 3345 1
+82 3348 1
+82 3349 1
+82 3350 1
+82 3358 1
+82 3359 1
+82 3360 1
+82 3363 1
+82 3364 1
+82 3365 1
+82 3368 1
+82 3369 1
+82 3370 1
+82 3371 1
+82 3379 1
+82 3380 1
+82 3381 1
+82 3384 1
+82 3385 1
+82 3386 1
+82 3389 1
+82 3390 1
+82 3391 1
+82 3392 1
+82 3395 1
+82 3396 1
+82 3397 1
+82 3398 1
+82 3399 1
+82 3407 1
+82 3408 1
+82 3409 1
+82 3412 1
+82 3413 1
+82 3414 1
+82 3417 1
+82 3418 1
+82 3419 1
+82 3420 1
+82 3423 1
+82 3424 1
+82 3425 1
+82 3426 1
+82 3427 1
+82 3430 1
+82 3431 1
+82 3432 1
+83 28 1
+83 56 1
+83 77 1
+83 92 1
+83 102 1
+83 111 1
+83 114 1
+83 115 1
+83 140 1
+83 161 1
+83 176 1
+83 186 1
+83 195 1
+83 198 1
+83 199 1
+83 217 1
+83 232 1
+83 242 1
+83 251 1
+83 254 1
+83 255 1
+83 267 1
+83 277 1
+83 286 1
+83 289 1
+83 290 1
+83 297 1
+83 306 1
+83 309 1
+83 310 1
+83 316 1
+83 319 1
+83 320 1
+83 326 1
+83 327 1
+83 329 1
+83 350 1
+83 371 1
+83 386 1
+83 396 1
+83 405 1
+83 408 1
+83 409 1
+83 427 1
+83 442 1
+83 452 1
+83 461 1
+83 464 1
+83 465 1
+83 477 1
+83 487 1
+83 496 1
+83 499 1
+83 500 1
+83 507 1
+83 516 1
+83 519 1
+83 520 1
+83 526 1
+83 529 1
+83 530 1
+83 536 1
+83 537 1
+83 539 1
+83 553 1
+83 568 1
+83 578 1
+83 587 1
+83 590 1
+83 591 1
+83 603 1
+83 613 1
+83 622 1
+83 625 1
+83 626 1
+83 633 1
+83 642 1
+83 645 1
+83 646 1
+83 652 1
+83 655 1
+83 656 1
+83 662 1
+83 663 1
+83 665 1
+83 673 1
+83 683 1
+83 692 1
+83 695 1
+83 696 1
+83 703 1
+83 712 1
+83 715 1
+83 716 1
+83 722 1
+83 725 1
+83 726 1
+83 732 1
+83 733 1
+83 735 1
+83 738 1
+83 747 1
+83 750 1
+83 751 1
+83 757 1
+83 760 1
+83 761 1
+83 767 1
+83 768 1
+83 770 1
+83 772 1
+83 775 1
+83 776 1
+83 782 1
+83 783 1
+83 785 1
+83 787 1
+83 788 1
+83 790 1
+83 792 1
+83 812 1
+83 833 1
+83 848 1
+83 858 1
+83 867 1
+83 870 1
+83 871 1
+83 889 1
+83 904 1
+83 914 1
+83 923 1
+83 926 1
+83 927 1
+83 939 1
+83 949 1
+83 958 1
+83 961 1
+83 962 1
+83 969 1
+83 978 1
+83 981 1
+83 982 1
+83 988 1
+83 991 1
+83 992 1
+83 998 1
+83 999 1
+83 1001 1
+83 1015 1
+83 1030 1
+83 1040 1
+83 1049 1
+83 1052 1
+83 1053 1
+83 1065 1
+83 1075 1
+83 1084 1
+83 1087 1
+83 1088 1
+83 1095 1
+83 1104 1
+83 1107 1
+83 1108 1
+83 1114 1
+83 1117 1
+83 1118 1
+83 1124 1
+83 1125 1
+83 1127 1
+83 1135 1
+83 1145 1
+83 1154 1
+83 1157 1
+83 1158 1
+83 1165 1
+83 1174 1
+83 1177 1
+83 1178 1
+83 1184 1
+83 1187 1
+83 1188 1
+83 1194 1
+83 1195 1
+83 1197 1
+83 1200 1
+83 1209 1
+83 1212 1
+83 1213 1
+83 1219 1
+83 1222 1
+83 1223 1
+83 1229 1
+83 1230 1
+83 1232 1
+83 1234 1
+83 1237 1
+83 1238 1
+83 1244 1
+83 1245 1
+83 1247 1
+83 1249 1
+83 1250 1
+83 1252 1
+83 1254 1
+83 1267 1
+83 1282 1
+83 1292 1
+83 1301 1
+83 1304 1
+83 1305 1
+83 1317 1
+83 1327 1
+83 1336 1
+83 1339 1
+83 1340 1
+83 1347 1
+83 1356 1
+83 1359 1
+83 1360 1
+83 1366 1
+83 1369 1
+83 1370 1
+83 1376 1
+83 1377 1
+83 1379 1
+83 1387 1
+83 1397 1
+83 1406 1
+83 1409 1
+83 1410 1
+83 1417 1
+83 1426 1
+83 1429 1
+83 1430 1
+83 1436 1
+83 1439 1
+83 1440 1
+83 1446 1
+83 1447 1
+83 1449 1
+83 1452 1
+83 1461 1
+83 1464 1
+83 1465 1
+83 1471 1
+83 1474 1
+83 1475 1
+83 1481 1
+83 1482 1
+83 1484 1
+83 1486 1
+83 1489 1
+83 1490 1
+83 1496 1
+83 1497 1
+83 1499 1
+83 1501 1
+83 1502 1
+83 1504 1
+83 1506 1
+83 1513 1
+83 1523 1
+83 1532 1
+83 1535 1
+83 1536 1
+83 1543 1
+83 1552 1
+83 1555 1
+83 1556 1
+83 1562 1
+83 1565 1
+83 1566 1
+83 1572 1
+83 1573 1
+83 1575 1
+83 1578 1
+83 1587 1
+83 1590 1
+83 1591 1
+83 1597 1
+83 1600 1
+83 1601 1
+83 1607 1
+83 1608 1
+83 1610 1
+83 1612 1
+83 1615 1
+83 1616 1
+83 1622 1
+83 1623 1
+83 1625 1
+83 1627 1
+83 1628 1
+83 1630 1
+83 1632 1
+83 1634 1
+83 1643 1
+83 1646 1
+83 1647 1
+83 1653 1
+83 1656 1
+83 1657 1
+83 1663 1
+83 1664 1
+83 1666 1
+83 1668 1
+83 1671 1
+83 1672 1
+83 1678 1
+83 1679 1
+83 1681 1
+83 1683 1
+83 1684 1
+83 1686 1
+83 1688 1
+83 1689 1
+83 1692 1
+83 1693 1
+83 1699 1
+83 1700 1
+83 1702 1
+83 1704 1
+83 1705 1
+83 1707 1
+83 1709 1
+83 1710 1
+83 1711 1
+83 1713 1
+83 1715 1
+83 1716 1
+83 1736 1
+83 1757 1
+83 1772 1
+83 1782 1
+83 1791 1
+83 1794 1
+83 1795 1
+83 1813 1
+83 1828 1
+83 1838 1
+83 1847 1
+83 1850 1
+83 1851 1
+83 1863 1
+83 1873 1
+83 1882 1
+83 1885 1
+83 1886 1
+83 1893 1
+83 1902 1
+83 1905 1
+83 1906 1
+83 1912 1
+83 1915 1
+83 1916 1
+83 1922 1
+83 1923 1
+83 1925 1
+83 1939 1
+83 1954 1
+83 1964 1
+83 1973 1
+83 1976 1
+83 1977 1
+83 1989 1
+83 1999 1
+83 2008 1
+83 2011 1
+83 2012 1
+83 2019 1
+83 2028 1
+83 2031 1
+83 2032 1
+83 2038 1
+83 2041 1
+83 2042 1
+83 2048 1
+83 2049 1
+83 2051 1
+83 2059 1
+83 2069 1
+83 2078 1
+83 2081 1
+83 2082 1
+83 2089 1
+83 2098 1
+83 2101 1
+83 2102 1
+83 2108 1
+83 2111 1
+83 2112 1
+83 2118 1
+83 2119 1
+83 2121 1
+83 2124 1
+83 2133 1
+83 2136 1
+83 2137 1
+83 2143 1
+83 2146 1
+83 2147 1
+83 2153 1
+83 2154 1
+83 2156 1
+83 2158 1
+83 2161 1
+83 2162 1
+83 2168 1
+83 2169 1
+83 2171 1
+83 2173 1
+83 2174 1
+83 2176 1
+83 2178 1
+83 2191 1
+83 2206 1
+83 2216 1
+83 2225 1
+83 2228 1
+83 2229 1
+83 2241 1
+83 2251 1
+83 2260 1
+83 2263 1
+83 2264 1
+83 2271 1
+83 2280 1
+83 2283 1
+83 2284 1
+83 2290 1
+83 2293 1
+83 2294 1
+83 2300 1
+83 2301 1
+83 2303 1
+83 2311 1
+83 2321 1
+83 2330 1
+83 2333 1
+83 2334 1
+83 2341 1
+83 2350 1
+83 2353 1
+83 2354 1
+83 2360 1
+83 2363 1
+83 2364 1
+83 2370 1
+83 2371 1
+83 2373 1
+83 2376 1
+83 2385 1
+83 2388 1
+83 2389 1
+83 2395 1
+83 2398 1
+83 2399 1
+83 2405 1
+83 2406 1
+83 2408 1
+83 2410 1
+83 2413 1
+83 2414 1
+83 2420 1
+83 2421 1
+83 2423 1
+83 2425 1
+83 2426 1
+83 2428 1
+83 2430 1
+83 2437 1
+83 2447 1
+83 2456 1
+83 2459 1
+83 2460 1
+83 2467 1
+83 2476 1
+83 2479 1
+83 2480 1
+83 2486 1
+83 2489 1
+83 2490 1
+83 2496 1
+83 2497 1
+83 2499 1
+83 2502 1
+83 2511 1
+83 2514 1
+83 2515 1
+83 2521 1
+83 2524 1
+83 2525 1
+83 2531 1
+83 2532 1
+83 2534 1
+83 2536 1
+83 2539 1
+83 2540 1
+83 2546 1
+83 2547 1
+83 2549 1
+83 2551 1
+83 2552 1
+83 2554 1
+83 2556 1
+83 2558 1
+83 2567 1
+83 2570 1
+83 2571 1
+83 2577 1
+83 2580 1
+83 2581 1
+83 2587 1
+83 2588 1
+83 2590 1
+83 2592 1
+83 2595 1
+83 2596 1
+83 2602 1
+83 2603 1
+83 2605 1
+83 2607 1
+83 2608 1
+83 2610 1
+83 2612 1
+83 2613 1
+83 2616 1
+83 2617 1
+83 2623 1
+83 2624 1
+83 2626 1
+83 2628 1
+83 2629 1
+83 2631 1
+83 2633 1
+83 2634 1
+83 2635 1
+83 2637 1
+83 2639 1
+83 2640 1
+83 2653 1
+83 2668 1
+83 2678 1
+83 2687 1
+83 2690 1
+83 2691 1
+83 2703 1
+83 2713 1
+83 2722 1
+83 2725 1
+83 2726 1
+83 2733 1
+83 2742 1
+83 2745 1
+83 2746 1
+83 2752 1
+83 2755 1
+83 2756 1
+83 2762 1
+83 2763 1
+83 2765 1
+83 2773 1
+83 2783 1
+83 2792 1
+83 2795 1
+83 2796 1
+83 2803 1
+83 2812 1
+83 2815 1
+83 2816 1
+83 2822 1
+83 2825 1
+83 2826 1
+83 2832 1
+83 2833 1
+83 2835 1
+83 2838 1
+83 2847 1
+83 2850 1
+83 2851 1
+83 2857 1
+83 2860 1
+83 2861 1
+83 2867 1
+83 2868 1
+83 2870 1
+83 2872 1
+83 2875 1
+83 2876 1
+83 2882 1
+83 2883 1
+83 2885 1
+83 2887 1
+83 2888 1
+83 2890 1
+83 2892 1
+83 2899 1
+83 2909 1
+83 2918 1
+83 2921 1
+83 2922 1
+83 2929 1
+83 2938 1
+83 2941 1
+83 2942 1
+83 2948 1
+83 2951 1
+83 2952 1
+83 2958 1
+83 2959 1
+83 2961 1
+83 2964 1
+83 2973 1
+83 2976 1
+83 2977 1
+83 2983 1
+83 2986 1
+83 2987 1
+83 2993 1
+83 2994 1
+83 2996 1
+83 2998 1
+83 3001 1
+83 3002 1
+83 3008 1
+83 3009 1
+83 3011 1
+83 3013 1
+83 3014 1
+83 3016 1
+83 3018 1
+83 3020 1
+83 3029 1
+83 3032 1
+83 3033 1
+83 3039 1
+83 3042 1
+83 3043 1
+83 3049 1
+83 3050 1
+83 3052 1
+83 3054 1
+83 3057 1
+83 3058 1
+83 3064 1
+83 3065 1
+83 3067 1
+83 3069 1
+83 3070 1
+83 3072 1
+83 3074 1
+83 3075 1
+83 3078 1
+83 3079 1
+83 3085 1
+83 3086 1
+83 3088 1
+83 3090 1
+83 3091 1
+83 3093 1
+83 3095 1
+83 3096 1
+83 3097 1
+83 3099 1
+83 3101 1
+83 3102 1
+83 3109 1
+83 3119 1
+83 3128 1
+83 3131 1
+83 3132 1
+83 3139 1
+83 3148 1
+83 3151 1
+83 3152 1
+83 3158 1
+83 3161 1
+83 3162 1
+83 3168 1
+83 3169 1
+83 3171 1
+83 3174 1
+83 3183 1
+83 3186 1
+83 3187 1
+83 3193 1
+83 3196 1
+83 3197 1
+83 3203 1
+83 3204 1
+83 3206 1
+83 3208 1
+83 3211 1
+83 3212 1
+83 3218 1
+83 3219 1
+83 3221 1
+83 3223 1
+83 3224 1
+83 3226 1
+83 3228 1
+83 3230 1
+83 3239 1
+83 3242 1
+83 3243 1
+83 3249 1
+83 3252 1
+83 3253 1
+83 3259 1
+83 3260 1
+83 3262 1
+83 3264 1
+83 3267 1
+83 3268 1
+83 3274 1
+83 3275 1
+83 3277 1
+83 3279 1
+83 3280 1
+83 3282 1
+83 3284 1
+83 3285 1
+83 3288 1
+83 3289 1
+83 3295 1
+83 3296 1
+83 3298 1
+83 3300 1
+83 3301 1
+83 3303 1
+83 3305 1
+83 3306 1
+83 3307 1
+83 3309 1
+83 3311 1
+83 3312 1
+83 3314 1
+83 3323 1
+83 3326 1
+83 3327 1
+83 3333 1
+83 3336 1
+83 3337 1
+83 3343 1
+83 3344 1
+83 3346 1
+83 3348 1
+83 3351 1
+83 3352 1
+83 3358 1
+83 3359 1
+83 3361 1
+83 3363 1
+83 3364 1
+83 3366 1
+83 3368 1
+83 3369 1
+83 3372 1
+83 3373 1
+83 3379 1
+83 3380 1
+83 3382 1
+83 3384 1
+83 3385 1
+83 3387 1
+83 3389 1
+83 3390 1
+83 3391 1
+83 3393 1
+83 3395 1
+83 3396 1
+83 3397 1
+83 3400 1
+83 3401 1
+83 3407 1
+83 3408 1
+83 3410 1
+83 3412 1
+83 3413 1
+83 3415 1
+83 3417 1
+83 3418 1
+83 3419 1
+83 3421 1
+83 3423 1
+83 3424 1
+83 3425 1
+83 3426 1
+83 3428 1
+83 3430 1
+83 3431 1
+83 3432 1
+84 29 1
+84 57 1
+84 78 1
+84 93 1
+84 103 1
+84 112 1
+84 114 1
+84 116 1
+84 141 1
+84 162 1
+84 177 1
+84 187 1
+84 196 1
+84 198 1
+84 200 1
+84 218 1
+84 233 1
+84 243 1
+84 252 1
+84 254 1
+84 256 1
+84 268 1
+84 278 1
+84 287 1
+84 289 1
+84 291 1
+84 298 1
+84 307 1
+84 309 1
+84 311 1
+84 317 1
+84 319 1
+84 321 1
+84 326 1
+84 328 1
+84 329 1
+84 351 1
+84 372 1
+84 387 1
+84 397 1
+84 406 1
+84 408 1
+84 410 1
+84 428 1
+84 443 1
+84 453 1
+84 462 1
+84 464 1
+84 466 1
+84 478 1
+84 488 1
+84 497 1
+84 499 1
+84 501 1
+84 508 1
+84 517 1
+84 519 1
+84 521 1
+84 527 1
+84 529 1
+84 531 1
+84 536 1
+84 538 1
+84 539 1
+84 554 1
+84 569 1
+84 579 1
+84 588 1
+84 590 1
+84 592 1
+84 604 1
+84 614 1
+84 623 1
+84 625 1
+84 627 1
+84 634 1
+84 643 1
+84 645 1
+84 647 1
+84 653 1
+84 655 1
+84 657 1
+84 662 1
+84 664 1
+84 665 1
+84 674 1
+84 684 1
+84 693 1
+84 695 1
+84 697 1
+84 704 1
+84 713 1
+84 715 1
+84 717 1
+84 723 1
+84 725 1
+84 727 1
+84 732 1
+84 734 1
+84 735 1
+84 739 1
+84 748 1
+84 750 1
+84 752 1
+84 758 1
+84 760 1
+84 762 1
+84 767 1
+84 769 1
+84 770 1
+84 773 1
+84 775 1
+84 777 1
+84 782 1
+84 784 1
+84 785 1
+84 787 1
+84 789 1
+84 790 1
+84 792 1
+84 813 1
+84 834 1
+84 849 1
+84 859 1
+84 868 1
+84 870 1
+84 872 1
+84 890 1
+84 905 1
+84 915 1
+84 924 1
+84 926 1
+84 928 1
+84 940 1
+84 950 1
+84 959 1
+84 961 1
+84 963 1
+84 970 1
+84 979 1
+84 981 1
+84 983 1
+84 989 1
+84 991 1
+84 993 1
+84 998 1
+84 1000 1
+84 1001 1
+84 1016 1
+84 1031 1
+84 1041 1
+84 1050 1
+84 1052 1
+84 1054 1
+84 1066 1
+84 1076 1
+84 1085 1
+84 1087 1
+84 1089 1
+84 1096 1
+84 1105 1
+84 1107 1
+84 1109 1
+84 1115 1
+84 1117 1
+84 1119 1
+84 1124 1
+84 1126 1
+84 1127 1
+84 1136 1
+84 1146 1
+84 1155 1
+84 1157 1
+84 1159 1
+84 1166 1
+84 1175 1
+84 1177 1
+84 1179 1
+84 1185 1
+84 1187 1
+84 1189 1
+84 1194 1
+84 1196 1
+84 1197 1
+84 1201 1
+84 1210 1
+84 1212 1
+84 1214 1
+84 1220 1
+84 1222 1
+84 1224 1
+84 1229 1
+84 1231 1
+84 1232 1
+84 1235 1
+84 1237 1
+84 1239 1
+84 1244 1
+84 1246 1
+84 1247 1
+84 1249 1
+84 1251 1
+84 1252 1
+84 1254 1
+84 1268 1
+84 1283 1
+84 1293 1
+84 1302 1
+84 1304 1
+84 1306 1
+84 1318 1
+84 1328 1
+84 1337 1
+84 1339 1
+84 1341 1
+84 1348 1
+84 1357 1
+84 1359 1
+84 1361 1
+84 1367 1
+84 1369 1
+84 1371 1
+84 1376 1
+84 1378 1
+84 1379 1
+84 1388 1
+84 1398 1
+84 1407 1
+84 1409 1
+84 1411 1
+84 1418 1
+84 1427 1
+84 1429 1
+84 1431 1
+84 1437 1
+84 1439 1
+84 1441 1
+84 1446 1
+84 1448 1
+84 1449 1
+84 1453 1
+84 1462 1
+84 1464 1
+84 1466 1
+84 1472 1
+84 1474 1
+84 1476 1
+84 1481 1
+84 1483 1
+84 1484 1
+84 1487 1
+84 1489 1
+84 1491 1
+84 1496 1
+84 1498 1
+84 1499 1
+84 1501 1
+84 1503 1
+84 1504 1
+84 1506 1
+84 1514 1
+84 1524 1
+84 1533 1
+84 1535 1
+84 1537 1
+84 1544 1
+84 1553 1
+84 1555 1
+84 1557 1
+84 1563 1
+84 1565 1
+84 1567 1
+84 1572 1
+84 1574 1
+84 1575 1
+84 1579 1
+84 1588 1
+84 1590 1
+84 1592 1
+84 1598 1
+84 1600 1
+84 1602 1
+84 1607 1
+84 1609 1
+84 1610 1
+84 1613 1
+84 1615 1
+84 1617 1
+84 1622 1
+84 1624 1
+84 1625 1
+84 1627 1
+84 1629 1
+84 1630 1
+84 1632 1
+84 1635 1
+84 1644 1
+84 1646 1
+84 1648 1
+84 1654 1
+84 1656 1
+84 1658 1
+84 1663 1
+84 1665 1
+84 1666 1
+84 1669 1
+84 1671 1
+84 1673 1
+84 1678 1
+84 1680 1
+84 1681 1
+84 1683 1
+84 1685 1
+84 1686 1
+84 1688 1
+84 1690 1
+84 1692 1
+84 1694 1
+84 1699 1
+84 1701 1
+84 1702 1
+84 1704 1
+84 1706 1
+84 1707 1
+84 1709 1
+84 1710 1
+84 1712 1
+84 1713 1
+84 1715 1
+84 1716 1
+84 1737 1
+84 1758 1
+84 1773 1
+84 1783 1
+84 1792 1
+84 1794 1
+84 1796 1
+84 1814 1
+84 1829 1
+84 1839 1
+84 1848 1
+84 1850 1
+84 1852 1
+84 1864 1
+84 1874 1
+84 1883 1
+84 1885 1
+84 1887 1
+84 1894 1
+84 1903 1
+84 1905 1
+84 1907 1
+84 1913 1
+84 1915 1
+84 1917 1
+84 1922 1
+84 1924 1
+84 1925 1
+84 1940 1
+84 1955 1
+84 1965 1
+84 1974 1
+84 1976 1
+84 1978 1
+84 1990 1
+84 2000 1
+84 2009 1
+84 2011 1
+84 2013 1
+84 2020 1
+84 2029 1
+84 2031 1
+84 2033 1
+84 2039 1
+84 2041 1
+84 2043 1
+84 2048 1
+84 2050 1
+84 2051 1
+84 2060 1
+84 2070 1
+84 2079 1
+84 2081 1
+84 2083 1
+84 2090 1
+84 2099 1
+84 2101 1
+84 2103 1
+84 2109 1
+84 2111 1
+84 2113 1
+84 2118 1
+84 2120 1
+84 2121 1
+84 2125 1
+84 2134 1
+84 2136 1
+84 2138 1
+84 2144 1
+84 2146 1
+84 2148 1
+84 2153 1
+84 2155 1
+84 2156 1
+84 2159 1
+84 2161 1
+84 2163 1
+84 2168 1
+84 2170 1
+84 2171 1
+84 2173 1
+84 2175 1
+84 2176 1
+84 2178 1
+84 2192 1
+84 2207 1
+84 2217 1
+84 2226 1
+84 2228 1
+84 2230 1
+84 2242 1
+84 2252 1
+84 2261 1
+84 2263 1
+84 2265 1
+84 2272 1
+84 2281 1
+84 2283 1
+84 2285 1
+84 2291 1
+84 2293 1
+84 2295 1
+84 2300 1
+84 2302 1
+84 2303 1
+84 2312 1
+84 2322 1
+84 2331 1
+84 2333 1
+84 2335 1
+84 2342 1
+84 2351 1
+84 2353 1
+84 2355 1
+84 2361 1
+84 2363 1
+84 2365 1
+84 2370 1
+84 2372 1
+84 2373 1
+84 2377 1
+84 2386 1
+84 2388 1
+84 2390 1
+84 2396 1
+84 2398 1
+84 2400 1
+84 2405 1
+84 2407 1
+84 2408 1
+84 2411 1
+84 2413 1
+84 2415 1
+84 2420 1
+84 2422 1
+84 2423 1
+84 2425 1
+84 2427 1
+84 2428 1
+84 2430 1
+84 2438 1
+84 2448 1
+84 2457 1
+84 2459 1
+84 2461 1
+84 2468 1
+84 2477 1
+84 2479 1
+84 2481 1
+84 2487 1
+84 2489 1
+84 2491 1
+84 2496 1
+84 2498 1
+84 2499 1
+84 2503 1
+84 2512 1
+84 2514 1
+84 2516 1
+84 2522 1
+84 2524 1
+84 2526 1
+84 2531 1
+84 2533 1
+84 2534 1
+84 2537 1
+84 2539 1
+84 2541 1
+84 2546 1
+84 2548 1
+84 2549 1
+84 2551 1
+84 2553 1
+84 2554 1
+84 2556 1
+84 2559 1
+84 2568 1
+84 2570 1
+84 2572 1
+84 2578 1
+84 2580 1
+84 2582 1
+84 2587 1
+84 2589 1
+84 2590 1
+84 2593 1
+84 2595 1
+84 2597 1
+84 2602 1
+84 2604 1
+84 2605 1
+84 2607 1
+84 2609 1
+84 2610 1
+84 2612 1
+84 2614 1
+84 2616 1
+84 2618 1
+84 2623 1
+84 2625 1
+84 2626 1
+84 2628 1
+84 2630 1
+84 2631 1
+84 2633 1
+84 2634 1
+84 2636 1
+84 2637 1
+84 2639 1
+84 2640 1
+84 2654 1
+84 2669 1
+84 2679 1
+84 2688 1
+84 2690 1
+84 2692 1
+84 2704 1
+84 2714 1
+84 2723 1
+84 2725 1
+84 2727 1
+84 2734 1
+84 2743 1
+84 2745 1
+84 2747 1
+84 2753 1
+84 2755 1
+84 2757 1
+84 2762 1
+84 2764 1
+84 2765 1
+84 2774 1
+84 2784 1
+84 2793 1
+84 2795 1
+84 2797 1
+84 2804 1
+84 2813 1
+84 2815 1
+84 2817 1
+84 2823 1
+84 2825 1
+84 2827 1
+84 2832 1
+84 2834 1
+84 2835 1
+84 2839 1
+84 2848 1
+84 2850 1
+84 2852 1
+84 2858 1
+84 2860 1
+84 2862 1
+84 2867 1
+84 2869 1
+84 2870 1
+84 2873 1
+84 2875 1
+84 2877 1
+84 2882 1
+84 2884 1
+84 2885 1
+84 2887 1
+84 2889 1
+84 2890 1
+84 2892 1
+84 2900 1
+84 2910 1
+84 2919 1
+84 2921 1
+84 2923 1
+84 2930 1
+84 2939 1
+84 2941 1
+84 2943 1
+84 2949 1
+84 2951 1
+84 2953 1
+84 2958 1
+84 2960 1
+84 2961 1
+84 2965 1
+84 2974 1
+84 2976 1
+84 2978 1
+84 2984 1
+84 2986 1
+84 2988 1
+84 2993 1
+84 2995 1
+84 2996 1
+84 2999 1
+84 3001 1
+84 3003 1
+84 3008 1
+84 3010 1
+84 3011 1
+84 3013 1
+84 3015 1
+84 3016 1
+84 3018 1
+84 3021 1
+84 3030 1
+84 3032 1
+84 3034 1
+84 3040 1
+84 3042 1
+84 3044 1
+84 3049 1
+84 3051 1
+84 3052 1
+84 3055 1
+84 3057 1
+84 3059 1
+84 3064 1
+84 3066 1
+84 3067 1
+84 3069 1
+84 3071 1
+84 3072 1
+84 3074 1
+84 3076 1
+84 3078 1
+84 3080 1
+84 3085 1
+84 3087 1
+84 3088 1
+84 3090 1
+84 3092 1
+84 3093 1
+84 3095 1
+84 3096 1
+84 3098 1
+84 3099 1
+84 3101 1
+84 3102 1
+84 3110 1
+84 3120 1
+84 3129 1
+84 3131 1
+84 3133 1
+84 3140 1
+84 3149 1
+84 3151 1
+84 3153 1
+84 3159 1
+84 3161 1
+84 3163 1
+84 3168 1
+84 3170 1
+84 3171 1
+84 3175 1
+84 3184 1
+84 3186 1
+84 3188 1
+84 3194 1
+84 3196 1
+84 3198 1
+84 3203 1
+84 3205 1
+84 3206 1
+84 3209 1
+84 3211 1
+84 3213 1
+84 3218 1
+84 3220 1
+84 3221 1
+84 3223 1
+84 3225 1
+84 3226 1
+84 3228 1
+84 3231 1
+84 3240 1
+84 3242 1
+84 3244 1
+84 3250 1
+84 3252 1
+84 3254 1
+84 3259 1
+84 3261 1
+84 3262 1
+84 3265 1
+84 3267 1
+84 3269 1
+84 3274 1
+84 3276 1
+84 3277 1
+84 3279 1
+84 3281 1
+84 3282 1
+84 3284 1
+84 3286 1
+84 3288 1
+84 3290 1
+84 3295 1
+84 3297 1
+84 3298 1
+84 3300 1
+84 3302 1
+84 3303 1
+84 3305 1
+84 3306 1
+84 3308 1
+84 3309 1
+84 3311 1
+84 3312 1
+84 3315 1
+84 3324 1
+84 3326 1
+84 3328 1
+84 3334 1
+84 3336 1
+84 3338 1
+84 3343 1
+84 3345 1
+84 3346 1
+84 3349 1
+84 3351 1
+84 3353 1
+84 3358 1
+84 3360 1
+84 3361 1
+84 3363 1
+84 3365 1
+84 3366 1
+84 3368 1
+84 3370 1
+84 3372 1
+84 3374 1
+84 3379 1
+84 3381 1
+84 3382 1
+84 3384 1
+84 3386 1
+84 3387 1
+84 3389 1
+84 3390 1
+84 3392 1
+84 3393 1
+84 3395 1
+84 3396 1
+84 3398 1
+84 3400 1
+84 3402 1
+84 3407 1
+84 3409 1
+84 3410 1
+84 3412 1
+84 3414 1
+84 3415 1
+84 3417 1
+84 3418 1
+84 3420 1
+84 3421 1
+84 3423 1
+84 3424 1
+84 3425 1
+84 3427 1
+84 3428 1
+84 3430 1
+84 3431 1
+84 3432 1
+85 30 1
+85 58 1
+85 79 1
+85 94 1
+85 104 1
+85 113 1
+85 115 1
+85 116 1
+85 142 1
+85 163 1
+85 178 1
+85 188 1
+85 197 1
+85 199 1
+85 200 1
+85 219 1
+85 234 1
+85 244 1
+85 253 1
+85 255 1
+85 256 1
+85 269 1
+85 279 1
+85 288 1
+85 290 1
+85 291 1
+85 299 1
+85 308 1
+85 310 1
+85 311 1
+85 318 1
+85 320 1
+85 321 1
+85 327 1
+85 328 1
+85 329 1
+85 352 1
+85 373 1
+85 388 1
+85 398 1
+85 407 1
+85 409 1
+85 410 1
+85 429 1
+85 444 1
+85 454 1
+85 463 1
+85 465 1
+85 466 1
+85 479 1
+85 489 1
+85 498 1
+85 500 1
+85 501 1
+85 509 1
+85 518 1
+85 520 1
+85 521 1
+85 528 1
+85 530 1
+85 531 1
+85 537 1
+85 538 1
+85 539 1
+85 555 1
+85 570 1
+85 580 1
+85 589 1
+85 591 1
+85 592 1
+85 605 1
+85 615 1
+85 624 1
+85 626 1
+85 627 1
+85 635 1
+85 644 1
+85 646 1
+85 647 1
+85 654 1
+85 656 1
+85 657 1
+85 663 1
+85 664 1
+85 665 1
+85 675 1
+85 685 1
+85 694 1
+85 696 1
+85 697 1
+85 705 1
+85 714 1
+85 716 1
+85 717 1
+85 724 1
+85 726 1
+85 727 1
+85 733 1
+85 734 1
+85 735 1
+85 740 1
+85 749 1
+85 751 1
+85 752 1
+85 759 1
+85 761 1
+85 762 1
+85 768 1
+85 769 1
+85 770 1
+85 774 1
+85 776 1
+85 777 1
+85 783 1
+85 784 1
+85 785 1
+85 788 1
+85 789 1
+85 790 1
+85 792 1
+85 814 1
+85 835 1
+85 850 1
+85 860 1
+85 869 1
+85 871 1
+85 872 1
+85 891 1
+85 906 1
+85 916 1
+85 925 1
+85 927 1
+85 928 1
+85 941 1
+85 951 1
+85 960 1
+85 962 1
+85 963 1
+85 971 1
+85 980 1
+85 982 1
+85 983 1
+85 990 1
+85 992 1
+85 993 1
+85 999 1
+85 1000 1
+85 1001 1
+85 1017 1
+85 1032 1
+85 1042 1
+85 1051 1
+85 1053 1
+85 1054 1
+85 1067 1
+85 1077 1
+85 1086 1
+85 1088 1
+85 1089 1
+85 1097 1
+85 1106 1
+85 1108 1
+85 1109 1
+85 1116 1
+85 1118 1
+85 1119 1
+85 1125 1
+85 1126 1
+85 1127 1
+85 1137 1
+85 1147 1
+85 1156 1
+85 1158 1
+85 1159 1
+85 1167 1
+85 1176 1
+85 1178 1
+85 1179 1
+85 1186 1
+85 1188 1
+85 1189 1
+85 1195 1
+85 1196 1
+85 1197 1
+85 1202 1
+85 1211 1
+85 1213 1
+85 1214 1
+85 1221 1
+85 1223 1
+85 1224 1
+85 1230 1
+85 1231 1
+85 1232 1
+85 1236 1
+85 1238 1
+85 1239 1
+85 1245 1
+85 1246 1
+85 1247 1
+85 1250 1
+85 1251 1
+85 1252 1
+85 1254 1
+85 1269 1
+85 1284 1
+85 1294 1
+85 1303 1
+85 1305 1
+85 1306 1
+85 1319 1
+85 1329 1
+85 1338 1
+85 1340 1
+85 1341 1
+85 1349 1
+85 1358 1
+85 1360 1
+85 1361 1
+85 1368 1
+85 1370 1
+85 1371 1
+85 1377 1
+85 1378 1
+85 1379 1
+85 1389 1
+85 1399 1
+85 1408 1
+85 1410 1
+85 1411 1
+85 1419 1
+85 1428 1
+85 1430 1
+85 1431 1
+85 1438 1
+85 1440 1
+85 1441 1
+85 1447 1
+85 1448 1
+85 1449 1
+85 1454 1
+85 1463 1
+85 1465 1
+85 1466 1
+85 1473 1
+85 1475 1
+85 1476 1
+85 1482 1
+85 1483 1
+85 1484 1
+85 1488 1
+85 1490 1
+85 1491 1
+85 1497 1
+85 1498 1
+85 1499 1
+85 1502 1
+85 1503 1
+85 1504 1
+85 1506 1
+85 1515 1
+85 1525 1
+85 1534 1
+85 1536 1
+85 1537 1
+85 1545 1
+85 1554 1
+85 1556 1
+85 1557 1
+85 1564 1
+85 1566 1
+85 1567 1
+85 1573 1
+85 1574 1
+85 1575 1
+85 1580 1
+85 1589 1
+85 1591 1
+85 1592 1
+85 1599 1
+85 1601 1
+85 1602 1
+85 1608 1
+85 1609 1
+85 1610 1
+85 1614 1
+85 1616 1
+85 1617 1
+85 1623 1
+85 1624 1
+85 1625 1
+85 1628 1
+85 1629 1
+85 1630 1
+85 1632 1
+85 1636 1
+85 1645 1
+85 1647 1
+85 1648 1
+85 1655 1
+85 1657 1
+85 1658 1
+85 1664 1
+85 1665 1
+85 1666 1
+85 1670 1
+85 1672 1
+85 1673 1
+85 1679 1
+85 1680 1
+85 1681 1
+85 1684 1
+85 1685 1
+85 1686 1
+85 1688 1
+85 1691 1
+85 1693 1
+85 1694 1
+85 1700 1
+85 1701 1
+85 1702 1
+85 1705 1
+85 1706 1
+85 1707 1
+85 1709 1
+85 1711 1
+85 1712 1
+85 1713 1
+85 1715 1
+85 1716 1
+85 1738 1
+85 1759 1
+85 1774 1
+85 1784 1
+85 1793 1
+85 1795 1
+85 1796 1
+85 1815 1
+85 1830 1
+85 1840 1
+85 1849 1
+85 1851 1
+85 1852 1
+85 1865 1
+85 1875 1
+85 1884 1
+85 1886 1
+85 1887 1
+85 1895 1
+85 1904 1
+85 1906 1
+85 1907 1
+85 1914 1
+85 1916 1
+85 1917 1
+85 1923 1
+85 1924 1
+85 1925 1
+85 1941 1
+85 1956 1
+85 1966 1
+85 1975 1
+85 1977 1
+85 1978 1
+85 1991 1
+85 2001 1
+85 2010 1
+85 2012 1
+85 2013 1
+85 2021 1
+85 2030 1
+85 2032 1
+85 2033 1
+85 2040 1
+85 2042 1
+85 2043 1
+85 2049 1
+85 2050 1
+85 2051 1
+85 2061 1
+85 2071 1
+85 2080 1
+85 2082 1
+85 2083 1
+85 2091 1
+85 2100 1
+85 2102 1
+85 2103 1
+85 2110 1
+85 2112 1
+85 2113 1
+85 2119 1
+85 2120 1
+85 2121 1
+85 2126 1
+85 2135 1
+85 2137 1
+85 2138 1
+85 2145 1
+85 2147 1
+85 2148 1
+85 2154 1
+85 2155 1
+85 2156 1
+85 2160 1
+85 2162 1
+85 2163 1
+85 2169 1
+85 2170 1
+85 2171 1
+85 2174 1
+85 2175 1
+85 2176 1
+85 2178 1
+85 2193 1
+85 2208 1
+85 2218 1
+85 2227 1
+85 2229 1
+85 2230 1
+85 2243 1
+85 2253 1
+85 2262 1
+85 2264 1
+85 2265 1
+85 2273 1
+85 2282 1
+85 2284 1
+85 2285 1
+85 2292 1
+85 2294 1
+85 2295 1
+85 2301 1
+85 2302 1
+85 2303 1
+85 2313 1
+85 2323 1
+85 2332 1
+85 2334 1
+85 2335 1
+85 2343 1
+85 2352 1
+85 2354 1
+85 2355 1
+85 2362 1
+85 2364 1
+85 2365 1
+85 2371 1
+85 2372 1
+85 2373 1
+85 2378 1
+85 2387 1
+85 2389 1
+85 2390 1
+85 2397 1
+85 2399 1
+85 2400 1
+85 2406 1
+85 2407 1
+85 2408 1
+85 2412 1
+85 2414 1
+85 2415 1
+85 2421 1
+85 2422 1
+85 2423 1
+85 2426 1
+85 2427 1
+85 2428 1
+85 2430 1
+85 2439 1
+85 2449 1
+85 2458 1
+85 2460 1
+85 2461 1
+85 2469 1
+85 2478 1
+85 2480 1
+85 2481 1
+85 2488 1
+85 2490 1
+85 2491 1
+85 2497 1
+85 2498 1
+85 2499 1
+85 2504 1
+85 2513 1
+85 2515 1
+85 2516 1
+85 2523 1
+85 2525 1
+85 2526 1
+85 2532 1
+85 2533 1
+85 2534 1
+85 2538 1
+85 2540 1
+85 2541 1
+85 2547 1
+85 2548 1
+85 2549 1
+85 2552 1
+85 2553 1
+85 2554 1
+85 2556 1
+85 2560 1
+85 2569 1
+85 2571 1
+85 2572 1
+85 2579 1
+85 2581 1
+85 2582 1
+85 2588 1
+85 2589 1
+85 2590 1
+85 2594 1
+85 2596 1
+85 2597 1
+85 2603 1
+85 2604 1
+85 2605 1
+85 2608 1
+85 2609 1
+85 2610 1
+85 2612 1
+85 2615 1
+85 2617 1
+85 2618 1
+85 2624 1
+85 2625 1
+85 2626 1
+85 2629 1
+85 2630 1
+85 2631 1
+85 2633 1
+85 2635 1
+85 2636 1
+85 2637 1
+85 2639 1
+85 2640 1
+85 2655 1
+85 2670 1
+85 2680 1
+85 2689 1
+85 2691 1
+85 2692 1
+85 2705 1
+85 2715 1
+85 2724 1
+85 2726 1
+85 2727 1
+85 2735 1
+85 2744 1
+85 2746 1
+85 2747 1
+85 2754 1
+85 2756 1
+85 2757 1
+85 2763 1
+85 2764 1
+85 2765 1
+85 2775 1
+85 2785 1
+85 2794 1
+85 2796 1
+85 2797 1
+85 2805 1
+85 2814 1
+85 2816 1
+85 2817 1
+85 2824 1
+85 2826 1
+85 2827 1
+85 2833 1
+85 2834 1
+85 2835 1
+85 2840 1
+85 2849 1
+85 2851 1
+85 2852 1
+85 2859 1
+85 2861 1
+85 2862 1
+85 2868 1
+85 2869 1
+85 2870 1
+85 2874 1
+85 2876 1
+85 2877 1
+85 2883 1
+85 2884 1
+85 2885 1
+85 2888 1
+85 2889 1
+85 2890 1
+85 2892 1
+85 2901 1
+85 2911 1
+85 2920 1
+85 2922 1
+85 2923 1
+85 2931 1
+85 2940 1
+85 2942 1
+85 2943 1
+85 2950 1
+85 2952 1
+85 2953 1
+85 2959 1
+85 2960 1
+85 2961 1
+85 2966 1
+85 2975 1
+85 2977 1
+85 2978 1
+85 2985 1
+85 2987 1
+85 2988 1
+85 2994 1
+85 2995 1
+85 2996 1
+85 3000 1
+85 3002 1
+85 3003 1
+85 3009 1
+85 3010 1
+85 3011 1
+85 3014 1
+85 3015 1
+85 3016 1
+85 3018 1
+85 3022 1
+85 3031 1
+85 3033 1
+85 3034 1
+85 3041 1
+85 3043 1
+85 3044 1
+85 3050 1
+85 3051 1
+85 3052 1
+85 3056 1
+85 3058 1
+85 3059 1
+85 3065 1
+85 3066 1
+85 3067 1
+85 3070 1
+85 3071 1
+85 3072 1
+85 3074 1
+85 3077 1
+85 3079 1
+85 3080 1
+85 3086 1
+85 3087 1
+85 3088 1
+85 3091 1
+85 3092 1
+85 3093 1
+85 3095 1
+85 3097 1
+85 3098 1
+85 3099 1
+85 3101 1
+85 3102 1
+85 3111 1
+85 3121 1
+85 3130 1
+85 3132 1
+85 3133 1
+85 3141 1
+85 3150 1
+85 3152 1
+85 3153 1
+85 3160 1
+85 3162 1
+85 3163 1
+85 3169 1
+85 3170 1
+85 3171 1
+85 3176 1
+85 3185 1
+85 3187 1
+85 3188 1
+85 3195 1
+85 3197 1
+85 3198 1
+85 3204 1
+85 3205 1
+85 3206 1
+85 3210 1
+85 3212 1
+85 3213 1
+85 3219 1
+85 3220 1
+85 3221 1
+85 3224 1
+85 3225 1
+85 3226 1
+85 3228 1
+85 3232 1
+85 3241 1
+85 3243 1
+85 3244 1
+85 3251 1
+85 3253 1
+85 3254 1
+85 3260 1
+85 3261 1
+85 3262 1
+85 3266 1
+85 3268 1
+85 3269 1
+85 3275 1
+85 3276 1
+85 3277 1
+85 3280 1
+85 3281 1
+85 3282 1
+85 3284 1
+85 3287 1
+85 3289 1
+85 3290 1
+85 3296 1
+85 3297 1
+85 3298 1
+85 3301 1
+85 3302 1
+85 3303 1
+85 3305 1
+85 3307 1
+85 3308 1
+85 3309 1
+85 3311 1
+85 3312 1
+85 3316 1
+85 3325 1
+85 3327 1
+85 3328 1
+85 3335 1
+85 3337 1
+85 3338 1
+85 3344 1
+85 3345 1
+85 3346 1
+85 3350 1
+85 3352 1
+85 3353 1
+85 3359 1
+85 3360 1
+85 3361 1
+85 3364 1
+85 3365 1
+85 3366 1
+85 3368 1
+85 3371 1
+85 3373 1
+85 3374 1
+85 3380 1
+85 3381 1
+85 3382 1
+85 3385 1
+85 3386 1
+85 3387 1
+85 3389 1
+85 3391 1
+85 3392 1
+85 3393 1
+85 3395 1
+85 3396 1
+85 3399 1
+85 3401 1
+85 3402 1
+85 3408 1
+85 3409 1
+85 3410 1
+85 3413 1
+85 3414 1
+85 3415 1
+85 3417 1
+85 3419 1
+85 3420 1
+85 3421 1
+85 3423 1
+85 3424 1
+85 3426 1
+85 3427 1
+85 3428 1
+85 3430 1
+85 3431 1
+85 3432 1
+86 31 1
+86 59 1
+86 80 1
+86 95 1
+86 105 1
+86 111 1
+86 117 1
+86 118 1
+86 143 1
+86 164 1
+86 179 1
+86 189 1
+86 195 1
+86 201 1
+86 202 1
+86 220 1
+86 235 1
+86 245 1
+86 251 1
+86 257 1
+86 258 1
+86 270 1
+86 280 1
+86 286 1
+86 292 1
+86 293 1
+86 300 1
+86 306 1
+86 312 1
+86 313 1
+86 316 1
+86 322 1
+86 323 1
+86 326 1
+86 327 1
+86 330 1
+86 353 1
+86 374 1
+86 389 1
+86 399 1
+86 405 1
+86 411 1
+86 412 1
+86 430 1
+86 445 1
+86 455 1
+86 461 1
+86 467 1
+86 468 1
+86 480 1
+86 490 1
+86 496 1
+86 502 1
+86 503 1
+86 510 1
+86 516 1
+86 522 1
+86 523 1
+86 526 1
+86 532 1
+86 533 1
+86 536 1
+86 537 1
+86 540 1
+86 556 1
+86 571 1
+86 581 1
+86 587 1
+86 593 1
+86 594 1
+86 606 1
+86 616 1
+86 622 1
+86 628 1
+86 629 1
+86 636 1
+86 642 1
+86 648 1
+86 649 1
+86 652 1
+86 658 1
+86 659 1
+86 662 1
+86 663 1
+86 666 1
+86 676 1
+86 686 1
+86 692 1
+86 698 1
+86 699 1
+86 706 1
+86 712 1
+86 718 1
+86 719 1
+86 722 1
+86 728 1
+86 729 1
+86 732 1
+86 733 1
+86 736 1
+86 741 1
+86 747 1
+86 753 1
+86 754 1
+86 757 1
+86 763 1
+86 764 1
+86 767 1
+86 768 1
+86 771 1
+86 772 1
+86 778 1
+86 779 1
+86 782 1
+86 783 1
+86 786 1
+86 787 1
+86 788 1
+86 791 1
+86 792 1
+86 815 1
+86 836 1
+86 851 1
+86 861 1
+86 867 1
+86 873 1
+86 874 1
+86 892 1
+86 907 1
+86 917 1
+86 923 1
+86 929 1
+86 930 1
+86 942 1
+86 952 1
+86 958 1
+86 964 1
+86 965 1
+86 972 1
+86 978 1
+86 984 1
+86 985 1
+86 988 1
+86 994 1
+86 995 1
+86 998 1
+86 999 1
+86 1002 1
+86 1018 1
+86 1033 1
+86 1043 1
+86 1049 1
+86 1055 1
+86 1056 1
+86 1068 1
+86 1078 1
+86 1084 1
+86 1090 1
+86 1091 1
+86 1098 1
+86 1104 1
+86 1110 1
+86 1111 1
+86 1114 1
+86 1120 1
+86 1121 1
+86 1124 1
+86 1125 1
+86 1128 1
+86 1138 1
+86 1148 1
+86 1154 1
+86 1160 1
+86 1161 1
+86 1168 1
+86 1174 1
+86 1180 1
+86 1181 1
+86 1184 1
+86 1190 1
+86 1191 1
+86 1194 1
+86 1195 1
+86 1198 1
+86 1203 1
+86 1209 1
+86 1215 1
+86 1216 1
+86 1219 1
+86 1225 1
+86 1226 1
+86 1229 1
+86 1230 1
+86 1233 1
+86 1234 1
+86 1240 1
+86 1241 1
+86 1244 1
+86 1245 1
+86 1248 1
+86 1249 1
+86 1250 1
+86 1253 1
+86 1254 1
+86 1270 1
+86 1285 1
+86 1295 1
+86 1301 1
+86 1307 1
+86 1308 1
+86 1320 1
+86 1330 1
+86 1336 1
+86 1342 1
+86 1343 1
+86 1350 1
+86 1356 1
+86 1362 1
+86 1363 1
+86 1366 1
+86 1372 1
+86 1373 1
+86 1376 1
+86 1377 1
+86 1380 1
+86 1390 1
+86 1400 1
+86 1406 1
+86 1412 1
+86 1413 1
+86 1420 1
+86 1426 1
+86 1432 1
+86 1433 1
+86 1436 1
+86 1442 1
+86 1443 1
+86 1446 1
+86 1447 1
+86 1450 1
+86 1455 1
+86 1461 1
+86 1467 1
+86 1468 1
+86 1471 1
+86 1477 1
+86 1478 1
+86 1481 1
+86 1482 1
+86 1485 1
+86 1486 1
+86 1492 1
+86 1493 1
+86 1496 1
+86 1497 1
+86 1500 1
+86 1501 1
+86 1502 1
+86 1505 1
+86 1506 1
+86 1516 1
+86 1526 1
+86 1532 1
+86 1538 1
+86 1539 1
+86 1546 1
+86 1552 1
+86 1558 1
+86 1559 1
+86 1562 1
+86 1568 1
+86 1569 1
+86 1572 1
+86 1573 1
+86 1576 1
+86 1581 1
+86 1587 1
+86 1593 1
+86 1594 1
+86 1597 1
+86 1603 1
+86 1604 1
+86 1607 1
+86 1608 1
+86 1611 1
+86 1612 1
+86 1618 1
+86 1619 1
+86 1622 1
+86 1623 1
+86 1626 1
+86 1627 1
+86 1628 1
+86 1631 1
+86 1632 1
+86 1637 1
+86 1643 1
+86 1649 1
+86 1650 1
+86 1653 1
+86 1659 1
+86 1660 1
+86 1663 1
+86 1664 1
+86 1667 1
+86 1668 1
+86 1674 1
+86 1675 1
+86 1678 1
+86 1679 1
+86 1682 1
+86 1683 1
+86 1684 1
+86 1687 1
+86 1688 1
+86 1689 1
+86 1695 1
+86 1696 1
+86 1699 1
+86 1700 1
+86 1703 1
+86 1704 1
+86 1705 1
+86 1708 1
+86 1709 1
+86 1710 1
+86 1711 1
+86 1714 1
+86 1715 1
+86 1716 1
+86 1739 1
+86 1760 1
+86 1775 1
+86 1785 1
+86 1791 1
+86 1797 1
+86 1798 1
+86 1816 1
+86 1831 1
+86 1841 1
+86 1847 1
+86 1853 1
+86 1854 1
+86 1866 1
+86 1876 1
+86 1882 1
+86 1888 1
+86 1889 1
+86 1896 1
+86 1902 1
+86 1908 1
+86 1909 1
+86 1912 1
+86 1918 1
+86 1919 1
+86 1922 1
+86 1923 1
+86 1926 1
+86 1942 1
+86 1957 1
+86 1967 1
+86 1973 1
+86 1979 1
+86 1980 1
+86 1992 1
+86 2002 1
+86 2008 1
+86 2014 1
+86 2015 1
+86 2022 1
+86 2028 1
+86 2034 1
+86 2035 1
+86 2038 1
+86 2044 1
+86 2045 1
+86 2048 1
+86 2049 1
+86 2052 1
+86 2062 1
+86 2072 1
+86 2078 1
+86 2084 1
+86 2085 1
+86 2092 1
+86 2098 1
+86 2104 1
+86 2105 1
+86 2108 1
+86 2114 1
+86 2115 1
+86 2118 1
+86 2119 1
+86 2122 1
+86 2127 1
+86 2133 1
+86 2139 1
+86 2140 1
+86 2143 1
+86 2149 1
+86 2150 1
+86 2153 1
+86 2154 1
+86 2157 1
+86 2158 1
+86 2164 1
+86 2165 1
+86 2168 1
+86 2169 1
+86 2172 1
+86 2173 1
+86 2174 1
+86 2177 1
+86 2178 1
+86 2194 1
+86 2209 1
+86 2219 1
+86 2225 1
+86 2231 1
+86 2232 1
+86 2244 1
+86 2254 1
+86 2260 1
+86 2266 1
+86 2267 1
+86 2274 1
+86 2280 1
+86 2286 1
+86 2287 1
+86 2290 1
+86 2296 1
+86 2297 1
+86 2300 1
+86 2301 1
+86 2304 1
+86 2314 1
+86 2324 1
+86 2330 1
+86 2336 1
+86 2337 1
+86 2344 1
+86 2350 1
+86 2356 1
+86 2357 1
+86 2360 1
+86 2366 1
+86 2367 1
+86 2370 1
+86 2371 1
+86 2374 1
+86 2379 1
+86 2385 1
+86 2391 1
+86 2392 1
+86 2395 1
+86 2401 1
+86 2402 1
+86 2405 1
+86 2406 1
+86 2409 1
+86 2410 1
+86 2416 1
+86 2417 1
+86 2420 1
+86 2421 1
+86 2424 1
+86 2425 1
+86 2426 1
+86 2429 1
+86 2430 1
+86 2440 1
+86 2450 1
+86 2456 1
+86 2462 1
+86 2463 1
+86 2470 1
+86 2476 1
+86 2482 1
+86 2483 1
+86 2486 1
+86 2492 1
+86 2493 1
+86 2496 1
+86 2497 1
+86 2500 1
+86 2505 1
+86 2511 1
+86 2517 1
+86 2518 1
+86 2521 1
+86 2527 1
+86 2528 1
+86 2531 1
+86 2532 1
+86 2535 1
+86 2536 1
+86 2542 1
+86 2543 1
+86 2546 1
+86 2547 1
+86 2550 1
+86 2551 1
+86 2552 1
+86 2555 1
+86 2556 1
+86 2561 1
+86 2567 1
+86 2573 1
+86 2574 1
+86 2577 1
+86 2583 1
+86 2584 1
+86 2587 1
+86 2588 1
+86 2591 1
+86 2592 1
+86 2598 1
+86 2599 1
+86 2602 1
+86 2603 1
+86 2606 1
+86 2607 1
+86 2608 1
+86 2611 1
+86 2612 1
+86 2613 1
+86 2619 1
+86 2620 1
+86 2623 1
+86 2624 1
+86 2627 1
+86 2628 1
+86 2629 1
+86 2632 1
+86 2633 1
+86 2634 1
+86 2635 1
+86 2638 1
+86 2639 1
+86 2640 1
+86 2656 1
+86 2671 1
+86 2681 1
+86 2687 1
+86 2693 1
+86 2694 1
+86 2706 1
+86 2716 1
+86 2722 1
+86 2728 1
+86 2729 1
+86 2736 1
+86 2742 1
+86 2748 1
+86 2749 1
+86 2752 1
+86 2758 1
+86 2759 1
+86 2762 1
+86 2763 1
+86 2766 1
+86 2776 1
+86 2786 1
+86 2792 1
+86 2798 1
+86 2799 1
+86 2806 1
+86 2812 1
+86 2818 1
+86 2819 1
+86 2822 1
+86 2828 1
+86 2829 1
+86 2832 1
+86 2833 1
+86 2836 1
+86 2841 1
+86 2847 1
+86 2853 1
+86 2854 1
+86 2857 1
+86 2863 1
+86 2864 1
+86 2867 1
+86 2868 1
+86 2871 1
+86 2872 1
+86 2878 1
+86 2879 1
+86 2882 1
+86 2883 1
+86 2886 1
+86 2887 1
+86 2888 1
+86 2891 1
+86 2892 1
+86 2902 1
+86 2912 1
+86 2918 1
+86 2924 1
+86 2925 1
+86 2932 1
+86 2938 1
+86 2944 1
+86 2945 1
+86 2948 1
+86 2954 1
+86 2955 1
+86 2958 1
+86 2959 1
+86 2962 1
+86 2967 1
+86 2973 1
+86 2979 1
+86 2980 1
+86 2983 1
+86 2989 1
+86 2990 1
+86 2993 1
+86 2994 1
+86 2997 1
+86 2998 1
+86 3004 1
+86 3005 1
+86 3008 1
+86 3009 1
+86 3012 1
+86 3013 1
+86 3014 1
+86 3017 1
+86 3018 1
+86 3023 1
+86 3029 1
+86 3035 1
+86 3036 1
+86 3039 1
+86 3045 1
+86 3046 1
+86 3049 1
+86 3050 1
+86 3053 1
+86 3054 1
+86 3060 1
+86 3061 1
+86 3064 1
+86 3065 1
+86 3068 1
+86 3069 1
+86 3070 1
+86 3073 1
+86 3074 1
+86 3075 1
+86 3081 1
+86 3082 1
+86 3085 1
+86 3086 1
+86 3089 1
+86 3090 1
+86 3091 1
+86 3094 1
+86 3095 1
+86 3096 1
+86 3097 1
+86 3100 1
+86 3101 1
+86 3102 1
+86 3112 1
+86 3122 1
+86 3128 1
+86 3134 1
+86 3135 1
+86 3142 1
+86 3148 1
+86 3154 1
+86 3155 1
+86 3158 1
+86 3164 1
+86 3165 1
+86 3168 1
+86 3169 1
+86 3172 1
+86 3177 1
+86 3183 1
+86 3189 1
+86 3190 1
+86 3193 1
+86 3199 1
+86 3200 1
+86 3203 1
+86 3204 1
+86 3207 1
+86 3208 1
+86 3214 1
+86 3215 1
+86 3218 1
+86 3219 1
+86 3222 1
+86 3223 1
+86 3224 1
+86 3227 1
+86 3228 1
+86 3233 1
+86 3239 1
+86 3245 1
+86 3246 1
+86 3249 1
+86 3255 1
+86 3256 1
+86 3259 1
+86 3260 1
+86 3263 1
+86 3264 1
+86 3270 1
+86 3271 1
+86 3274 1
+86 3275 1
+86 3278 1
+86 3279 1
+86 3280 1
+86 3283 1
+86 3284 1
+86 3285 1
+86 3291 1
+86 3292 1
+86 3295 1
+86 3296 1
+86 3299 1
+86 3300 1
+86 3301 1
+86 3304 1
+86 3305 1
+86 3306 1
+86 3307 1
+86 3310 1
+86 3311 1
+86 3312 1
+86 3317 1
+86 3323 1
+86 3329 1
+86 3330 1
+86 3333 1
+86 3339 1
+86 3340 1
+86 3343 1
+86 3344 1
+86 3347 1
+86 3348 1
+86 3354 1
+86 3355 1
+86 3358 1
+86 3359 1
+86 3362 1
+86 3363 1
+86 3364 1
+86 3367 1
+86 3368 1
+86 3369 1
+86 3375 1
+86 3376 1
+86 3379 1
+86 3380 1
+86 3383 1
+86 3384 1
+86 3385 1
+86 3388 1
+86 3389 1
+86 3390 1
+86 3391 1
+86 3394 1
+86 3395 1
+86 3396 1
+86 3397 1
+86 3403 1
+86 3404 1
+86 3407 1
+86 3408 1
+86 3411 1
+86 3412 1
+86 3413 1
+86 3416 1
+86 3417 1
+86 3418 1
+86 3419 1
+86 3422 1
+86 3423 1
+86 3424 1
+86 3425 1
+86 3426 1
+86 3429 1
+86 3430 1
+86 3431 1
+86 3432 1
+87 32 1
+87 60 1
+87 81 1
+87 96 1
+87 106 1
+87 112 1
+87 117 1
+87 119 1
+87 144 1
+87 165 1
+87 180 1
+87 190 1
+87 196 1
+87 201 1
+87 203 1
+87 221 1
+87 236 1
+87 246 1
+87 252 1
+87 257 1
+87 259 1
+87 271 1
+87 281 1
+87 287 1
+87 292 1
+87 294 1
+87 301 1
+87 307 1
+87 312 1
+87 314 1
+87 317 1
+87 322 1
+87 324 1
+87 326 1
+87 328 1
+87 330 1
+87 354 1
+87 375 1
+87 390 1
+87 400 1
+87 406 1
+87 411 1
+87 413 1
+87 431 1
+87 446 1
+87 456 1
+87 462 1
+87 467 1
+87 469 1
+87 481 1
+87 491 1
+87 497 1
+87 502 1
+87 504 1
+87 511 1
+87 517 1
+87 522 1
+87 524 1
+87 527 1
+87 532 1
+87 534 1
+87 536 1
+87 538 1
+87 540 1
+87 557 1
+87 572 1
+87 582 1
+87 588 1
+87 593 1
+87 595 1
+87 607 1
+87 617 1
+87 623 1
+87 628 1
+87 630 1
+87 637 1
+87 643 1
+87 648 1
+87 650 1
+87 653 1
+87 658 1
+87 660 1
+87 662 1
+87 664 1
+87 666 1
+87 677 1
+87 687 1
+87 693 1
+87 698 1
+87 700 1
+87 707 1
+87 713 1
+87 718 1
+87 720 1
+87 723 1
+87 728 1
+87 730 1
+87 732 1
+87 734 1
+87 736 1
+87 742 1
+87 748 1
+87 753 1
+87 755 1
+87 758 1
+87 763 1
+87 765 1
+87 767 1
+87 769 1
+87 771 1
+87 773 1
+87 778 1
+87 780 1
+87 782 1
+87 784 1
+87 786 1
+87 787 1
+87 789 1
+87 791 1
+87 792 1
+87 816 1
+87 837 1
+87 852 1
+87 862 1
+87 868 1
+87 873 1
+87 875 1
+87 893 1
+87 908 1
+87 918 1
+87 924 1
+87 929 1
+87 931 1
+87 943 1
+87 953 1
+87 959 1
+87 964 1
+87 966 1
+87 973 1
+87 979 1
+87 984 1
+87 986 1
+87 989 1
+87 994 1
+87 996 1
+87 998 1
+87 1000 1
+87 1002 1
+87 1019 1
+87 1034 1
+87 1044 1
+87 1050 1
+87 1055 1
+87 1057 1
+87 1069 1
+87 1079 1
+87 1085 1
+87 1090 1
+87 1092 1
+87 1099 1
+87 1105 1
+87 1110 1
+87 1112 1
+87 1115 1
+87 1120 1
+87 1122 1
+87 1124 1
+87 1126 1
+87 1128 1
+87 1139 1
+87 1149 1
+87 1155 1
+87 1160 1
+87 1162 1
+87 1169 1
+87 1175 1
+87 1180 1
+87 1182 1
+87 1185 1
+87 1190 1
+87 1192 1
+87 1194 1
+87 1196 1
+87 1198 1
+87 1204 1
+87 1210 1
+87 1215 1
+87 1217 1
+87 1220 1
+87 1225 1
+87 1227 1
+87 1229 1
+87 1231 1
+87 1233 1
+87 1235 1
+87 1240 1
+87 1242 1
+87 1244 1
+87 1246 1
+87 1248 1
+87 1249 1
+87 1251 1
+87 1253 1
+87 1254 1
+87 1271 1
+87 1286 1
+87 1296 1
+87 1302 1
+87 1307 1
+87 1309 1
+87 1321 1
+87 1331 1
+87 1337 1
+87 1342 1
+87 1344 1
+87 1351 1
+87 1357 1
+87 1362 1
+87 1364 1
+87 1367 1
+87 1372 1
+87 1374 1
+87 1376 1
+87 1378 1
+87 1380 1
+87 1391 1
+87 1401 1
+87 1407 1
+87 1412 1
+87 1414 1
+87 1421 1
+87 1427 1
+87 1432 1
+87 1434 1
+87 1437 1
+87 1442 1
+87 1444 1
+87 1446 1
+87 1448 1
+87 1450 1
+87 1456 1
+87 1462 1
+87 1467 1
+87 1469 1
+87 1472 1
+87 1477 1
+87 1479 1
+87 1481 1
+87 1483 1
+87 1485 1
+87 1487 1
+87 1492 1
+87 1494 1
+87 1496 1
+87 1498 1
+87 1500 1
+87 1501 1
+87 1503 1
+87 1505 1
+87 1506 1
+87 1517 1
+87 1527 1
+87 1533 1
+87 1538 1
+87 1540 1
+87 1547 1
+87 1553 1
+87 1558 1
+87 1560 1
+87 1563 1
+87 1568 1
+87 1570 1
+87 1572 1
+87 1574 1
+87 1576 1
+87 1582 1
+87 1588 1
+87 1593 1
+87 1595 1
+87 1598 1
+87 1603 1
+87 1605 1
+87 1607 1
+87 1609 1
+87 1611 1
+87 1613 1
+87 1618 1
+87 1620 1
+87 1622 1
+87 1624 1
+87 1626 1
+87 1627 1
+87 1629 1
+87 1631 1
+87 1632 1
+87 1638 1
+87 1644 1
+87 1649 1
+87 1651 1
+87 1654 1
+87 1659 1
+87 1661 1
+87 1663 1
+87 1665 1
+87 1667 1
+87 1669 1
+87 1674 1
+87 1676 1
+87 1678 1
+87 1680 1
+87 1682 1
+87 1683 1
+87 1685 1
+87 1687 1
+87 1688 1
+87 1690 1
+87 1695 1
+87 1697 1
+87 1699 1
+87 1701 1
+87 1703 1
+87 1704 1
+87 1706 1
+87 1708 1
+87 1709 1
+87 1710 1
+87 1712 1
+87 1714 1
+87 1715 1
+87 1716 1
+87 1740 1
+87 1761 1
+87 1776 1
+87 1786 1
+87 1792 1
+87 1797 1
+87 1799 1
+87 1817 1
+87 1832 1
+87 1842 1
+87 1848 1
+87 1853 1
+87 1855 1
+87 1867 1
+87 1877 1
+87 1883 1
+87 1888 1
+87 1890 1
+87 1897 1
+87 1903 1
+87 1908 1
+87 1910 1
+87 1913 1
+87 1918 1
+87 1920 1
+87 1922 1
+87 1924 1
+87 1926 1
+87 1943 1
+87 1958 1
+87 1968 1
+87 1974 1
+87 1979 1
+87 1981 1
+87 1993 1
+87 2003 1
+87 2009 1
+87 2014 1
+87 2016 1
+87 2023 1
+87 2029 1
+87 2034 1
+87 2036 1
+87 2039 1
+87 2044 1
+87 2046 1
+87 2048 1
+87 2050 1
+87 2052 1
+87 2063 1
+87 2073 1
+87 2079 1
+87 2084 1
+87 2086 1
+87 2093 1
+87 2099 1
+87 2104 1
+87 2106 1
+87 2109 1
+87 2114 1
+87 2116 1
+87 2118 1
+87 2120 1
+87 2122 1
+87 2128 1
+87 2134 1
+87 2139 1
+87 2141 1
+87 2144 1
+87 2149 1
+87 2151 1
+87 2153 1
+87 2155 1
+87 2157 1
+87 2159 1
+87 2164 1
+87 2166 1
+87 2168 1
+87 2170 1
+87 2172 1
+87 2173 1
+87 2175 1
+87 2177 1
+87 2178 1
+87 2195 1
+87 2210 1
+87 2220 1
+87 2226 1
+87 2231 1
+87 2233 1
+87 2245 1
+87 2255 1
+87 2261 1
+87 2266 1
+87 2268 1
+87 2275 1
+87 2281 1
+87 2286 1
+87 2288 1
+87 2291 1
+87 2296 1
+87 2298 1
+87 2300 1
+87 2302 1
+87 2304 1
+87 2315 1
+87 2325 1
+87 2331 1
+87 2336 1
+87 2338 1
+87 2345 1
+87 2351 1
+87 2356 1
+87 2358 1
+87 2361 1
+87 2366 1
+87 2368 1
+87 2370 1
+87 2372 1
+87 2374 1
+87 2380 1
+87 2386 1
+87 2391 1
+87 2393 1
+87 2396 1
+87 2401 1
+87 2403 1
+87 2405 1
+87 2407 1
+87 2409 1
+87 2411 1
+87 2416 1
+87 2418 1
+87 2420 1
+87 2422 1
+87 2424 1
+87 2425 1
+87 2427 1
+87 2429 1
+87 2430 1
+87 2441 1
+87 2451 1
+87 2457 1
+87 2462 1
+87 2464 1
+87 2471 1
+87 2477 1
+87 2482 1
+87 2484 1
+87 2487 1
+87 2492 1
+87 2494 1
+87 2496 1
+87 2498 1
+87 2500 1
+87 2506 1
+87 2512 1
+87 2517 1
+87 2519 1
+87 2522 1
+87 2527 1
+87 2529 1
+87 2531 1
+87 2533 1
+87 2535 1
+87 2537 1
+87 2542 1
+87 2544 1
+87 2546 1
+87 2548 1
+87 2550 1
+87 2551 1
+87 2553 1
+87 2555 1
+87 2556 1
+87 2562 1
+87 2568 1
+87 2573 1
+87 2575 1
+87 2578 1
+87 2583 1
+87 2585 1
+87 2587 1
+87 2589 1
+87 2591 1
+87 2593 1
+87 2598 1
+87 2600 1
+87 2602 1
+87 2604 1
+87 2606 1
+87 2607 1
+87 2609 1
+87 2611 1
+87 2612 1
+87 2614 1
+87 2619 1
+87 2621 1
+87 2623 1
+87 2625 1
+87 2627 1
+87 2628 1
+87 2630 1
+87 2632 1
+87 2633 1
+87 2634 1
+87 2636 1
+87 2638 1
+87 2639 1
+87 2640 1
+87 2657 1
+87 2672 1
+87 2682 1
+87 2688 1
+87 2693 1
+87 2695 1
+87 2707 1
+87 2717 1
+87 2723 1
+87 2728 1
+87 2730 1
+87 2737 1
+87 2743 1
+87 2748 1
+87 2750 1
+87 2753 1
+87 2758 1
+87 2760 1
+87 2762 1
+87 2764 1
+87 2766 1
+87 2777 1
+87 2787 1
+87 2793 1
+87 2798 1
+87 2800 1
+87 2807 1
+87 2813 1
+87 2818 1
+87 2820 1
+87 2823 1
+87 2828 1
+87 2830 1
+87 2832 1
+87 2834 1
+87 2836 1
+87 2842 1
+87 2848 1
+87 2853 1
+87 2855 1
+87 2858 1
+87 2863 1
+87 2865 1
+87 2867 1
+87 2869 1
+87 2871 1
+87 2873 1
+87 2878 1
+87 2880 1
+87 2882 1
+87 2884 1
+87 2886 1
+87 2887 1
+87 2889 1
+87 2891 1
+87 2892 1
+87 2903 1
+87 2913 1
+87 2919 1
+87 2924 1
+87 2926 1
+87 2933 1
+87 2939 1
+87 2944 1
+87 2946 1
+87 2949 1
+87 2954 1
+87 2956 1
+87 2958 1
+87 2960 1
+87 2962 1
+87 2968 1
+87 2974 1
+87 2979 1
+87 2981 1
+87 2984 1
+87 2989 1
+87 2991 1
+87 2993 1
+87 2995 1
+87 2997 1
+87 2999 1
+87 3004 1
+87 3006 1
+87 3008 1
+87 3010 1
+87 3012 1
+87 3013 1
+87 3015 1
+87 3017 1
+87 3018 1
+87 3024 1
+87 3030 1
+87 3035 1
+87 3037 1
+87 3040 1
+87 3045 1
+87 3047 1
+87 3049 1
+87 3051 1
+87 3053 1
+87 3055 1
+87 3060 1
+87 3062 1
+87 3064 1
+87 3066 1
+87 3068 1
+87 3069 1
+87 3071 1
+87 3073 1
+87 3074 1
+87 3076 1
+87 3081 1
+87 3083 1
+87 3085 1
+87 3087 1
+87 3089 1
+87 3090 1
+87 3092 1
+87 3094 1
+87 3095 1
+87 3096 1
+87 3098 1
+87 3100 1
+87 3101 1
+87 3102 1
+87 3113 1
+87 3123 1
+87 3129 1
+87 3134 1
+87 3136 1
+87 3143 1
+87 3149 1
+87 3154 1
+87 3156 1
+87 3159 1
+87 3164 1
+87 3166 1
+87 3168 1
+87 3170 1
+87 3172 1
+87 3178 1
+87 3184 1
+87 3189 1
+87 3191 1
+87 3194 1
+87 3199 1
+87 3201 1
+87 3203 1
+87 3205 1
+87 3207 1
+87 3209 1
+87 3214 1
+87 3216 1
+87 3218 1
+87 3220 1
+87 3222 1
+87 3223 1
+87 3225 1
+87 3227 1
+87 3228 1
+87 3234 1
+87 3240 1
+87 3245 1
+87 3247 1
+87 3250 1
+87 3255 1
+87 3257 1
+87 3259 1
+87 3261 1
+87 3263 1
+87 3265 1
+87 3270 1
+87 3272 1
+87 3274 1
+87 3276 1
+87 3278 1
+87 3279 1
+87 3281 1
+87 3283 1
+87 3284 1
+87 3286 1
+87 3291 1
+87 3293 1
+87 3295 1
+87 3297 1
+87 3299 1
+87 3300 1
+87 3302 1
+87 3304 1
+87 3305 1
+87 3306 1
+87 3308 1
+87 3310 1
+87 3311 1
+87 3312 1
+87 3318 1
+87 3324 1
+87 3329 1
+87 3331 1
+87 3334 1
+87 3339 1
+87 3341 1
+87 3343 1
+87 3345 1
+87 3347 1
+87 3349 1
+87 3354 1
+87 3356 1
+87 3358 1
+87 3360 1
+87 3362 1
+87 3363 1
+87 3365 1
+87 3367 1
+87 3368 1
+87 3370 1
+87 3375 1
+87 3377 1
+87 3379 1
+87 3381 1
+87 3383 1
+87 3384 1
+87 3386 1
+87 3388 1
+87 3389 1
+87 3390 1
+87 3392 1
+87 3394 1
+87 3395 1
+87 3396 1
+87 3398 1
+87 3403 1
+87 3405 1
+87 3407 1
+87 3409 1
+87 3411 1
+87 3412 1
+87 3414 1
+87 3416 1
+87 3417 1
+87 3418 1
+87 3420 1
+87 3422 1
+87 3423 1
+87 3424 1
+87 3425 1
+87 3427 1
+87 3429 1
+87 3430 1
+87 3431 1
+87 3432 1
+88 33 1
+88 61 1
+88 82 1
+88 97 1
+88 107 1
+88 113 1
+88 118 1
+88 119 1
+88 145 1
+88 166 1
+88 181 1
+88 191 1
+88 197 1
+88 202 1
+88 203 1
+88 222 1
+88 237 1
+88 247 1
+88 253 1
+88 258 1
+88 259 1
+88 272 1
+88 282 1
+88 288 1
+88 293 1
+88 294 1
+88 302 1
+88 308 1
+88 313 1
+88 314 1
+88 318 1
+88 323 1
+88 324 1
+88 327 1
+88 328 1
+88 330 1
+88 355 1
+88 376 1
+88 391 1
+88 401 1
+88 407 1
+88 412 1
+88 413 1
+88 432 1
+88 447 1
+88 457 1
+88 463 1
+88 468 1
+88 469 1
+88 482 1
+88 492 1
+88 498 1
+88 503 1
+88 504 1
+88 512 1
+88 518 1
+88 523 1
+88 524 1
+88 528 1
+88 533 1
+88 534 1
+88 537 1
+88 538 1
+88 540 1
+88 558 1
+88 573 1
+88 583 1
+88 589 1
+88 594 1
+88 595 1
+88 608 1
+88 618 1
+88 624 1
+88 629 1
+88 630 1
+88 638 1
+88 644 1
+88 649 1
+88 650 1
+88 654 1
+88 659 1
+88 660 1
+88 663 1
+88 664 1
+88 666 1
+88 678 1
+88 688 1
+88 694 1
+88 699 1
+88 700 1
+88 708 1
+88 714 1
+88 719 1
+88 720 1
+88 724 1
+88 729 1
+88 730 1
+88 733 1
+88 734 1
+88 736 1
+88 743 1
+88 749 1
+88 754 1
+88 755 1
+88 759 1
+88 764 1
+88 765 1
+88 768 1
+88 769 1
+88 771 1
+88 774 1
+88 779 1
+88 780 1
+88 783 1
+88 784 1
+88 786 1
+88 788 1
+88 789 1
+88 791 1
+88 792 1
+88 817 1
+88 838 1
+88 853 1
+88 863 1
+88 869 1
+88 874 1
+88 875 1
+88 894 1
+88 909 1
+88 919 1
+88 925 1
+88 930 1
+88 931 1
+88 944 1
+88 954 1
+88 960 1
+88 965 1
+88 966 1
+88 974 1
+88 980 1
+88 985 1
+88 986 1
+88 990 1
+88 995 1
+88 996 1
+88 999 1
+88 1000 1
+88 1002 1
+88 1020 1
+88 1035 1
+88 1045 1
+88 1051 1
+88 1056 1
+88 1057 1
+88 1070 1
+88 1080 1
+88 1086 1
+88 1091 1
+88 1092 1
+88 1100 1
+88 1106 1
+88 1111 1
+88 1112 1
+88 1116 1
+88 1121 1
+88 1122 1
+88 1125 1
+88 1126 1
+88 1128 1
+88 1140 1
+88 1150 1
+88 1156 1
+88 1161 1
+88 1162 1
+88 1170 1
+88 1176 1
+88 1181 1
+88 1182 1
+88 1186 1
+88 1191 1
+88 1192 1
+88 1195 1
+88 1196 1
+88 1198 1
+88 1205 1
+88 1211 1
+88 1216 1
+88 1217 1
+88 1221 1
+88 1226 1
+88 1227 1
+88 1230 1
+88 1231 1
+88 1233 1
+88 1236 1
+88 1241 1
+88 1242 1
+88 1245 1
+88 1246 1
+88 1248 1
+88 1250 1
+88 1251 1
+88 1253 1
+88 1254 1
+88 1272 1
+88 1287 1
+88 1297 1
+88 1303 1
+88 1308 1
+88 1309 1
+88 1322 1
+88 1332 1
+88 1338 1
+88 1343 1
+88 1344 1
+88 1352 1
+88 1358 1
+88 1363 1
+88 1364 1
+88 1368 1
+88 1373 1
+88 1374 1
+88 1377 1
+88 1378 1
+88 1380 1
+88 1392 1
+88 1402 1
+88 1408 1
+88 1413 1
+88 1414 1
+88 1422 1
+88 1428 1
+88 1433 1
+88 1434 1
+88 1438 1
+88 1443 1
+88 1444 1
+88 1447 1
+88 1448 1
+88 1450 1
+88 1457 1
+88 1463 1
+88 1468 1
+88 1469 1
+88 1473 1
+88 1478 1
+88 1479 1
+88 1482 1
+88 1483 1
+88 1485 1
+88 1488 1
+88 1493 1
+88 1494 1
+88 1497 1
+88 1498 1
+88 1500 1
+88 1502 1
+88 1503 1
+88 1505 1
+88 1506 1
+88 1518 1
+88 1528 1
+88 1534 1
+88 1539 1
+88 1540 1
+88 1548 1
+88 1554 1
+88 1559 1
+88 1560 1
+88 1564 1
+88 1569 1
+88 1570 1
+88 1573 1
+88 1574 1
+88 1576 1
+88 1583 1
+88 1589 1
+88 1594 1
+88 1595 1
+88 1599 1
+88 1604 1
+88 1605 1
+88 1608 1
+88 1609 1
+88 1611 1
+88 1614 1
+88 1619 1
+88 1620 1
+88 1623 1
+88 1624 1
+88 1626 1
+88 1628 1
+88 1629 1
+88 1631 1
+88 1632 1
+88 1639 1
+88 1645 1
+88 1650 1
+88 1651 1
+88 1655 1
+88 1660 1
+88 1661 1
+88 1664 1
+88 1665 1
+88 1667 1
+88 1670 1
+88 1675 1
+88 1676 1
+88 1679 1
+88 1680 1
+88 1682 1
+88 1684 1
+88 1685 1
+88 1687 1
+88 1688 1
+88 1691 1
+88 1696 1
+88 1697 1
+88 1700 1
+88 1701 1
+88 1703 1
+88 1705 1
+88 1706 1
+88 1708 1
+88 1709 1
+88 1711 1
+88 1712 1
+88 1714 1
+88 1715 1
+88 1716 1
+88 1741 1
+88 1762 1
+88 1777 1
+88 1787 1
+88 1793 1
+88 1798 1
+88 1799 1
+88 1818 1
+88 1833 1
+88 1843 1
+88 1849 1
+88 1854 1
+88 1855 1
+88 1868 1
+88 1878 1
+88 1884 1
+88 1889 1
+88 1890 1
+88 1898 1
+88 1904 1
+88 1909 1
+88 1910 1
+88 1914 1
+88 1919 1
+88 1920 1
+88 1923 1
+88 1924 1
+88 1926 1
+88 1944 1
+88 1959 1
+88 1969 1
+88 1975 1
+88 1980 1
+88 1981 1
+88 1994 1
+88 2004 1
+88 2010 1
+88 2015 1
+88 2016 1
+88 2024 1
+88 2030 1
+88 2035 1
+88 2036 1
+88 2040 1
+88 2045 1
+88 2046 1
+88 2049 1
+88 2050 1
+88 2052 1
+88 2064 1
+88 2074 1
+88 2080 1
+88 2085 1
+88 2086 1
+88 2094 1
+88 2100 1
+88 2105 1
+88 2106 1
+88 2110 1
+88 2115 1
+88 2116 1
+88 2119 1
+88 2120 1
+88 2122 1
+88 2129 1
+88 2135 1
+88 2140 1
+88 2141 1
+88 2145 1
+88 2150 1
+88 2151 1
+88 2154 1
+88 2155 1
+88 2157 1
+88 2160 1
+88 2165 1
+88 2166 1
+88 2169 1
+88 2170 1
+88 2172 1
+88 2174 1
+88 2175 1
+88 2177 1
+88 2178 1
+88 2196 1
+88 2211 1
+88 2221 1
+88 2227 1
+88 2232 1
+88 2233 1
+88 2246 1
+88 2256 1
+88 2262 1
+88 2267 1
+88 2268 1
+88 2276 1
+88 2282 1
+88 2287 1
+88 2288 1
+88 2292 1
+88 2297 1
+88 2298 1
+88 2301 1
+88 2302 1
+88 2304 1
+88 2316 1
+88 2326 1
+88 2332 1
+88 2337 1
+88 2338 1
+88 2346 1
+88 2352 1
+88 2357 1
+88 2358 1
+88 2362 1
+88 2367 1
+88 2368 1
+88 2371 1
+88 2372 1
+88 2374 1
+88 2381 1
+88 2387 1
+88 2392 1
+88 2393 1
+88 2397 1
+88 2402 1
+88 2403 1
+88 2406 1
+88 2407 1
+88 2409 1
+88 2412 1
+88 2417 1
+88 2418 1
+88 2421 1
+88 2422 1
+88 2424 1
+88 2426 1
+88 2427 1
+88 2429 1
+88 2430 1
+88 2442 1
+88 2452 1
+88 2458 1
+88 2463 1
+88 2464 1
+88 2472 1
+88 2478 1
+88 2483 1
+88 2484 1
+88 2488 1
+88 2493 1
+88 2494 1
+88 2497 1
+88 2498 1
+88 2500 1
+88 2507 1
+88 2513 1
+88 2518 1
+88 2519 1
+88 2523 1
+88 2528 1
+88 2529 1
+88 2532 1
+88 2533 1
+88 2535 1
+88 2538 1
+88 2543 1
+88 2544 1
+88 2547 1
+88 2548 1
+88 2550 1
+88 2552 1
+88 2553 1
+88 2555 1
+88 2556 1
+88 2563 1
+88 2569 1
+88 2574 1
+88 2575 1
+88 2579 1
+88 2584 1
+88 2585 1
+88 2588 1
+88 2589 1
+88 2591 1
+88 2594 1
+88 2599 1
+88 2600 1
+88 2603 1
+88 2604 1
+88 2606 1
+88 2608 1
+88 2609 1
+88 2611 1
+88 2612 1
+88 2615 1
+88 2620 1
+88 2621 1
+88 2624 1
+88 2625 1
+88 2627 1
+88 2629 1
+88 2630 1
+88 2632 1
+88 2633 1
+88 2635 1
+88 2636 1
+88 2638 1
+88 2639 1
+88 2640 1
+88 2658 1
+88 2673 1
+88 2683 1
+88 2689 1
+88 2694 1
+88 2695 1
+88 2708 1
+88 2718 1
+88 2724 1
+88 2729 1
+88 2730 1
+88 2738 1
+88 2744 1
+88 2749 1
+88 2750 1
+88 2754 1
+88 2759 1
+88 2760 1
+88 2763 1
+88 2764 1
+88 2766 1
+88 2778 1
+88 2788 1
+88 2794 1
+88 2799 1
+88 2800 1
+88 2808 1
+88 2814 1
+88 2819 1
+88 2820 1
+88 2824 1
+88 2829 1
+88 2830 1
+88 2833 1
+88 2834 1
+88 2836 1
+88 2843 1
+88 2849 1
+88 2854 1
+88 2855 1
+88 2859 1
+88 2864 1
+88 2865 1
+88 2868 1
+88 2869 1
+88 2871 1
+88 2874 1
+88 2879 1
+88 2880 1
+88 2883 1
+88 2884 1
+88 2886 1
+88 2888 1
+88 2889 1
+88 2891 1
+88 2892 1
+88 2904 1
+88 2914 1
+88 2920 1
+88 2925 1
+88 2926 1
+88 2934 1
+88 2940 1
+88 2945 1
+88 2946 1
+88 2950 1
+88 2955 1
+88 2956 1
+88 2959 1
+88 2960 1
+88 2962 1
+88 2969 1
+88 2975 1
+88 2980 1
+88 2981 1
+88 2985 1
+88 2990 1
+88 2991 1
+88 2994 1
+88 2995 1
+88 2997 1
+88 3000 1
+88 3005 1
+88 3006 1
+88 3009 1
+88 3010 1
+88 3012 1
+88 3014 1
+88 3015 1
+88 3017 1
+88 3018 1
+88 3025 1
+88 3031 1
+88 3036 1
+88 3037 1
+88 3041 1
+88 3046 1
+88 3047 1
+88 3050 1
+88 3051 1
+88 3053 1
+88 3056 1
+88 3061 1
+88 3062 1
+88 3065 1
+88 3066 1
+88 3068 1
+88 3070 1
+88 3071 1
+88 3073 1
+88 3074 1
+88 3077 1
+88 3082 1
+88 3083 1
+88 3086 1
+88 3087 1
+88 3089 1
+88 3091 1
+88 3092 1
+88 3094 1
+88 3095 1
+88 3097 1
+88 3098 1
+88 3100 1
+88 3101 1
+88 3102 1
+88 3114 1
+88 3124 1
+88 3130 1
+88 3135 1
+88 3136 1
+88 3144 1
+88 3150 1
+88 3155 1
+88 3156 1
+88 3160 1
+88 3165 1
+88 3166 1
+88 3169 1
+88 3170 1
+88 3172 1
+88 3179 1
+88 3185 1
+88 3190 1
+88 3191 1
+88 3195 1
+88 3200 1
+88 3201 1
+88 3204 1
+88 3205 1
+88 3207 1
+88 3210 1
+88 3215 1
+88 3216 1
+88 3219 1
+88 3220 1
+88 3222 1
+88 3224 1
+88 3225 1
+88 3227 1
+88 3228 1
+88 3235 1
+88 3241 1
+88 3246 1
+88 3247 1
+88 3251 1
+88 3256 1
+88 3257 1
+88 3260 1
+88 3261 1
+88 3263 1
+88 3266 1
+88 3271 1
+88 3272 1
+88 3275 1
+88 3276 1
+88 3278 1
+88 3280 1
+88 3281 1
+88 3283 1
+88 3284 1
+88 3287 1
+88 3292 1
+88 3293 1
+88 3296 1
+88 3297 1
+88 3299 1
+88 3301 1
+88 3302 1
+88 3304 1
+88 3305 1
+88 3307 1
+88 3308 1
+88 3310 1
+88 3311 1
+88 3312 1
+88 3319 1
+88 3325 1
+88 3330 1
+88 3331 1
+88 3335 1
+88 3340 1
+88 3341 1
+88 3344 1
+88 3345 1
+88 3347 1
+88 3350 1
+88 3355 1
+88 3356 1
+88 3359 1
+88 3360 1
+88 3362 1
+88 3364 1
+88 3365 1
+88 3367 1
+88 3368 1
+88 3371 1
+88 3376 1
+88 3377 1
+88 3380 1
+88 3381 1
+88 3383 1
+88 3385 1
+88 3386 1
+88 3388 1
+88 3389 1
+88 3391 1
+88 3392 1
+88 3394 1
+88 3395 1
+88 3396 1
+88 3399 1
+88 3404 1
+88 3405 1
+88 3408 1
+88 3409 1
+88 3411 1
+88 3413 1
+88 3414 1
+88 3416 1
+88 3417 1
+88 3419 1
+88 3420 1
+88 3422 1
+88 3423 1
+88 3424 1
+88 3426 1
+88 3427 1
+88 3429 1
+88 3430 1
+88 3431 1
+88 3432 1
+89 34 1
+89 62 1
+89 83 1
+89 98 1
+89 108 1
+89 114 1
+89 117 1
+89 120 1
+89 146 1
+89 167 1
+89 182 1
+89 192 1
+89 198 1
+89 201 1
+89 204 1
+89 223 1
+89 238 1
+89 248 1
+89 254 1
+89 257 1
+89 260 1
+89 273 1
+89 283 1
+89 289 1
+89 292 1
+89 295 1
+89 303 1
+89 309 1
+89 312 1
+89 315 1
+89 319 1
+89 322 1
+89 325 1
+89 326 1
+89 329 1
+89 330 1
+89 356 1
+89 377 1
+89 392 1
+89 402 1
+89 408 1
+89 411 1
+89 414 1
+89 433 1
+89 448 1
+89 458 1
+89 464 1
+89 467 1
+89 470 1
+89 483 1
+89 493 1
+89 499 1
+89 502 1
+89 505 1
+89 513 1
+89 519 1
+89 522 1
+89 525 1
+89 529 1
+89 532 1
+89 535 1
+89 536 1
+89 539 1
+89 540 1
+89 559 1
+89 574 1
+89 584 1
+89 590 1
+89 593 1
+89 596 1
+89 609 1
+89 619 1
+89 625 1
+89 628 1
+89 631 1
+89 639 1
+89 645 1
+89 648 1
+89 651 1
+89 655 1
+89 658 1
+89 661 1
+89 662 1
+89 665 1
+89 666 1
+89 679 1
+89 689 1
+89 695 1
+89 698 1
+89 701 1
+89 709 1
+89 715 1
+89 718 1
+89 721 1
+89 725 1
+89 728 1
+89 731 1
+89 732 1
+89 735 1
+89 736 1
+89 744 1
+89 750 1
+89 753 1
+89 756 1
+89 760 1
+89 763 1
+89 766 1
+89 767 1
+89 770 1
+89 771 1
+89 775 1
+89 778 1
+89 781 1
+89 782 1
+89 785 1
+89 786 1
+89 787 1
+89 790 1
+89 791 1
+89 792 1
+89 818 1
+89 839 1
+89 854 1
+89 864 1
+89 870 1
+89 873 1
+89 876 1
+89 895 1
+89 910 1
+89 920 1
+89 926 1
+89 929 1
+89 932 1
+89 945 1
+89 955 1
+89 961 1
+89 964 1
+89 967 1
+89 975 1
+89 981 1
+89 984 1
+89 987 1
+89 991 1
+89 994 1
+89 997 1
+89 998 1
+89 1001 1
+89 1002 1
+89 1021 1
+89 1036 1
+89 1046 1
+89 1052 1
+89 1055 1
+89 1058 1
+89 1071 1
+89 1081 1
+89 1087 1
+89 1090 1
+89 1093 1
+89 1101 1
+89 1107 1
+89 1110 1
+89 1113 1
+89 1117 1
+89 1120 1
+89 1123 1
+89 1124 1
+89 1127 1
+89 1128 1
+89 1141 1
+89 1151 1
+89 1157 1
+89 1160 1
+89 1163 1
+89 1171 1
+89 1177 1
+89 1180 1
+89 1183 1
+89 1187 1
+89 1190 1
+89 1193 1
+89 1194 1
+89 1197 1
+89 1198 1
+89 1206 1
+89 1212 1
+89 1215 1
+89 1218 1
+89 1222 1
+89 1225 1
+89 1228 1
+89 1229 1
+89 1232 1
+89 1233 1
+89 1237 1
+89 1240 1
+89 1243 1
+89 1244 1
+89 1247 1
+89 1248 1
+89 1249 1
+89 1252 1
+89 1253 1
+89 1254 1
+89 1273 1
+89 1288 1
+89 1298 1
+89 1304 1
+89 1307 1
+89 1310 1
+89 1323 1
+89 1333 1
+89 1339 1
+89 1342 1
+89 1345 1
+89 1353 1
+89 1359 1
+89 1362 1
+89 1365 1
+89 1369 1
+89 1372 1
+89 1375 1
+89 1376 1
+89 1379 1
+89 1380 1
+89 1393 1
+89 1403 1
+89 1409 1
+89 1412 1
+89 1415 1
+89 1423 1
+89 1429 1
+89 1432 1
+89 1435 1
+89 1439 1
+89 1442 1
+89 1445 1
+89 1446 1
+89 1449 1
+89 1450 1
+89 1458 1
+89 1464 1
+89 1467 1
+89 1470 1
+89 1474 1
+89 1477 1
+89 1480 1
+89 1481 1
+89 1484 1
+89 1485 1
+89 1489 1
+89 1492 1
+89 1495 1
+89 1496 1
+89 1499 1
+89 1500 1
+89 1501 1
+89 1504 1
+89 1505 1
+89 1506 1
+89 1519 1
+89 1529 1
+89 1535 1
+89 1538 1
+89 1541 1
+89 1549 1
+89 1555 1
+89 1558 1
+89 1561 1
+89 1565 1
+89 1568 1
+89 1571 1
+89 1572 1
+89 1575 1
+89 1576 1
+89 1584 1
+89 1590 1
+89 1593 1
+89 1596 1
+89 1600 1
+89 1603 1
+89 1606 1
+89 1607 1
+89 1610 1
+89 1611 1
+89 1615 1
+89 1618 1
+89 1621 1
+89 1622 1
+89 1625 1
+89 1626 1
+89 1627 1
+89 1630 1
+89 1631 1
+89 1632 1
+89 1640 1
+89 1646 1
+89 1649 1
+89 1652 1
+89 1656 1
+89 1659 1
+89 1662 1
+89 1663 1
+89 1666 1
+89 1667 1
+89 1671 1
+89 1674 1
+89 1677 1
+89 1678 1
+89 1681 1
+89 1682 1
+89 1683 1
+89 1686 1
+89 1687 1
+89 1688 1
+89 1692 1
+89 1695 1
+89 1698 1
+89 1699 1
+89 1702 1
+89 1703 1
+89 1704 1
+89 1707 1
+89 1708 1
+89 1709 1
+89 1710 1
+89 1713 1
+89 1714 1
+89 1715 1
+89 1716 1
+89 1742 1
+89 1763 1
+89 1778 1
+89 1788 1
+89 1794 1
+89 1797 1
+89 1800 1
+89 1819 1
+89 1834 1
+89 1844 1
+89 1850 1
+89 1853 1
+89 1856 1
+89 1869 1
+89 1879 1
+89 1885 1
+89 1888 1
+89 1891 1
+89 1899 1
+89 1905 1
+89 1908 1
+89 1911 1
+89 1915 1
+89 1918 1
+89 1921 1
+89 1922 1
+89 1925 1
+89 1926 1
+89 1945 1
+89 1960 1
+89 1970 1
+89 1976 1
+89 1979 1
+89 1982 1
+89 1995 1
+89 2005 1
+89 2011 1
+89 2014 1
+89 2017 1
+89 2025 1
+89 2031 1
+89 2034 1
+89 2037 1
+89 2041 1
+89 2044 1
+89 2047 1
+89 2048 1
+89 2051 1
+89 2052 1
+89 2065 1
+89 2075 1
+89 2081 1
+89 2084 1
+89 2087 1
+89 2095 1
+89 2101 1
+89 2104 1
+89 2107 1
+89 2111 1
+89 2114 1
+89 2117 1
+89 2118 1
+89 2121 1
+89 2122 1
+89 2130 1
+89 2136 1
+89 2139 1
+89 2142 1
+89 2146 1
+89 2149 1
+89 2152 1
+89 2153 1
+89 2156 1
+89 2157 1
+89 2161 1
+89 2164 1
+89 2167 1
+89 2168 1
+89 2171 1
+89 2172 1
+89 2173 1
+89 2176 1
+89 2177 1
+89 2178 1
+89 2197 1
+89 2212 1
+89 2222 1
+89 2228 1
+89 2231 1
+89 2234 1
+89 2247 1
+89 2257 1
+89 2263 1
+89 2266 1
+89 2269 1
+89 2277 1
+89 2283 1
+89 2286 1
+89 2289 1
+89 2293 1
+89 2296 1
+89 2299 1
+89 2300 1
+89 2303 1
+89 2304 1
+89 2317 1
+89 2327 1
+89 2333 1
+89 2336 1
+89 2339 1
+89 2347 1
+89 2353 1
+89 2356 1
+89 2359 1
+89 2363 1
+89 2366 1
+89 2369 1
+89 2370 1
+89 2373 1
+89 2374 1
+89 2382 1
+89 2388 1
+89 2391 1
+89 2394 1
+89 2398 1
+89 2401 1
+89 2404 1
+89 2405 1
+89 2408 1
+89 2409 1
+89 2413 1
+89 2416 1
+89 2419 1
+89 2420 1
+89 2423 1
+89 2424 1
+89 2425 1
+89 2428 1
+89 2429 1
+89 2430 1
+89 2443 1
+89 2453 1
+89 2459 1
+89 2462 1
+89 2465 1
+89 2473 1
+89 2479 1
+89 2482 1
+89 2485 1
+89 2489 1
+89 2492 1
+89 2495 1
+89 2496 1
+89 2499 1
+89 2500 1
+89 2508 1
+89 2514 1
+89 2517 1
+89 2520 1
+89 2524 1
+89 2527 1
+89 2530 1
+89 2531 1
+89 2534 1
+89 2535 1
+89 2539 1
+89 2542 1
+89 2545 1
+89 2546 1
+89 2549 1
+89 2550 1
+89 2551 1
+89 2554 1
+89 2555 1
+89 2556 1
+89 2564 1
+89 2570 1
+89 2573 1
+89 2576 1
+89 2580 1
+89 2583 1
+89 2586 1
+89 2587 1
+89 2590 1
+89 2591 1
+89 2595 1
+89 2598 1
+89 2601 1
+89 2602 1
+89 2605 1
+89 2606 1
+89 2607 1
+89 2610 1
+89 2611 1
+89 2612 1
+89 2616 1
+89 2619 1
+89 2622 1
+89 2623 1
+89 2626 1
+89 2627 1
+89 2628 1
+89 2631 1
+89 2632 1
+89 2633 1
+89 2634 1
+89 2637 1
+89 2638 1
+89 2639 1
+89 2640 1
+89 2659 1
+89 2674 1
+89 2684 1
+89 2690 1
+89 2693 1
+89 2696 1
+89 2709 1
+89 2719 1
+89 2725 1
+89 2728 1
+89 2731 1
+89 2739 1
+89 2745 1
+89 2748 1
+89 2751 1
+89 2755 1
+89 2758 1
+89 2761 1
+89 2762 1
+89 2765 1
+89 2766 1
+89 2779 1
+89 2789 1
+89 2795 1
+89 2798 1
+89 2801 1
+89 2809 1
+89 2815 1
+89 2818 1
+89 2821 1
+89 2825 1
+89 2828 1
+89 2831 1
+89 2832 1
+89 2835 1
+89 2836 1
+89 2844 1
+89 2850 1
+89 2853 1
+89 2856 1
+89 2860 1
+89 2863 1
+89 2866 1
+89 2867 1
+89 2870 1
+89 2871 1
+89 2875 1
+89 2878 1
+89 2881 1
+89 2882 1
+89 2885 1
+89 2886 1
+89 2887 1
+89 2890 1
+89 2891 1
+89 2892 1
+89 2905 1
+89 2915 1
+89 2921 1
+89 2924 1
+89 2927 1
+89 2935 1
+89 2941 1
+89 2944 1
+89 2947 1
+89 2951 1
+89 2954 1
+89 2957 1
+89 2958 1
+89 2961 1
+89 2962 1
+89 2970 1
+89 2976 1
+89 2979 1
+89 2982 1
+89 2986 1
+89 2989 1
+89 2992 1
+89 2993 1
+89 2996 1
+89 2997 1
+89 3001 1
+89 3004 1
+89 3007 1
+89 3008 1
+89 3011 1
+89 3012 1
+89 3013 1
+89 3016 1
+89 3017 1
+89 3018 1
+89 3026 1
+89 3032 1
+89 3035 1
+89 3038 1
+89 3042 1
+89 3045 1
+89 3048 1
+89 3049 1
+89 3052 1
+89 3053 1
+89 3057 1
+89 3060 1
+89 3063 1
+89 3064 1
+89 3067 1
+89 3068 1
+89 3069 1
+89 3072 1
+89 3073 1
+89 3074 1
+89 3078 1
+89 3081 1
+89 3084 1
+89 3085 1
+89 3088 1
+89 3089 1
+89 3090 1
+89 3093 1
+89 3094 1
+89 3095 1
+89 3096 1
+89 3099 1
+89 3100 1
+89 3101 1
+89 3102 1
+89 3115 1
+89 3125 1
+89 3131 1
+89 3134 1
+89 3137 1
+89 3145 1
+89 3151 1
+89 3154 1
+89 3157 1
+89 3161 1
+89 3164 1
+89 3167 1
+89 3168 1
+89 3171 1
+89 3172 1
+89 3180 1
+89 3186 1
+89 3189 1
+89 3192 1
+89 3196 1
+89 3199 1
+89 3202 1
+89 3203 1
+89 3206 1
+89 3207 1
+89 3211 1
+89 3214 1
+89 3217 1
+89 3218 1
+89 3221 1
+89 3222 1
+89 3223 1
+89 3226 1
+89 3227 1
+89 3228 1
+89 3236 1
+89 3242 1
+89 3245 1
+89 3248 1
+89 3252 1
+89 3255 1
+89 3258 1
+89 3259 1
+89 3262 1
+89 3263 1
+89 3267 1
+89 3270 1
+89 3273 1
+89 3274 1
+89 3277 1
+89 3278 1
+89 3279 1
+89 3282 1
+89 3283 1
+89 3284 1
+89 3288 1
+89 3291 1
+89 3294 1
+89 3295 1
+89 3298 1
+89 3299 1
+89 3300 1
+89 3303 1
+89 3304 1
+89 3305 1
+89 3306 1
+89 3309 1
+89 3310 1
+89 3311 1
+89 3312 1
+89 3320 1
+89 3326 1
+89 3329 1
+89 3332 1
+89 3336 1
+89 3339 1
+89 3342 1
+89 3343 1
+89 3346 1
+89 3347 1
+89 3351 1
+89 3354 1
+89 3357 1
+89 3358 1
+89 3361 1
+89 3362 1
+89 3363 1
+89 3366 1
+89 3367 1
+89 3368 1
+89 3372 1
+89 3375 1
+89 3378 1
+89 3379 1
+89 3382 1
+89 3383 1
+89 3384 1
+89 3387 1
+89 3388 1
+89 3389 1
+89 3390 1
+89 3393 1
+89 3394 1
+89 3395 1
+89 3396 1
+89 3400 1
+89 3403 1
+89 3406 1
+89 3407 1
+89 3410 1
+89 3411 1
+89 3412 1
+89 3415 1
+89 3416 1
+89 3417 1
+89 3418 1
+89 3421 1
+89 3422 1
+89 3423 1
+89 3424 1
+89 3425 1
+89 3428 1
+89 3429 1
+89 3430 1
+89 3431 1
+89 3432 1
+90 35 1
+90 63 1
+90 84 1
+90 99 1
+90 109 1
+90 115 1
+90 118 1
+90 120 1
+90 147 1
+90 168 1
+90 183 1
+90 193 1
+90 199 1
+90 202 1
+90 204 1
+90 224 1
+90 239 1
+90 249 1
+90 255 1
+90 258 1
+90 260 1
+90 274 1
+90 284 1
+90 290 1
+90 293 1
+90 295 1
+90 304 1
+90 310 1
+90 313 1
+90 315 1
+90 320 1
+90 323 1
+90 325 1
+90 327 1
+90 329 1
+90 330 1
+90 357 1
+90 378 1
+90 393 1
+90 403 1
+90 409 1
+90 412 1
+90 414 1
+90 434 1
+90 449 1
+90 459 1
+90 465 1
+90 468 1
+90 470 1
+90 484 1
+90 494 1
+90 500 1
+90 503 1
+90 505 1
+90 514 1
+90 520 1
+90 523 1
+90 525 1
+90 530 1
+90 533 1
+90 535 1
+90 537 1
+90 539 1
+90 540 1
+90 560 1
+90 575 1
+90 585 1
+90 591 1
+90 594 1
+90 596 1
+90 610 1
+90 620 1
+90 626 1
+90 629 1
+90 631 1
+90 640 1
+90 646 1
+90 649 1
+90 651 1
+90 656 1
+90 659 1
+90 661 1
+90 663 1
+90 665 1
+90 666 1
+90 680 1
+90 690 1
+90 696 1
+90 699 1
+90 701 1
+90 710 1
+90 716 1
+90 719 1
+90 721 1
+90 726 1
+90 729 1
+90 731 1
+90 733 1
+90 735 1
+90 736 1
+90 745 1
+90 751 1
+90 754 1
+90 756 1
+90 761 1
+90 764 1
+90 766 1
+90 768 1
+90 770 1
+90 771 1
+90 776 1
+90 779 1
+90 781 1
+90 783 1
+90 785 1
+90 786 1
+90 788 1
+90 790 1
+90 791 1
+90 792 1
+90 819 1
+90 840 1
+90 855 1
+90 865 1
+90 871 1
+90 874 1
+90 876 1
+90 896 1
+90 911 1
+90 921 1
+90 927 1
+90 930 1
+90 932 1
+90 946 1
+90 956 1
+90 962 1
+90 965 1
+90 967 1
+90 976 1
+90 982 1
+90 985 1
+90 987 1
+90 992 1
+90 995 1
+90 997 1
+90 999 1
+90 1001 1
+90 1002 1
+90 1022 1
+90 1037 1
+90 1047 1
+90 1053 1
+90 1056 1
+90 1058 1
+90 1072 1
+90 1082 1
+90 1088 1
+90 1091 1
+90 1093 1
+90 1102 1
+90 1108 1
+90 1111 1
+90 1113 1
+90 1118 1
+90 1121 1
+90 1123 1
+90 1125 1
+90 1127 1
+90 1128 1
+90 1142 1
+90 1152 1
+90 1158 1
+90 1161 1
+90 1163 1
+90 1172 1
+90 1178 1
+90 1181 1
+90 1183 1
+90 1188 1
+90 1191 1
+90 1193 1
+90 1195 1
+90 1197 1
+90 1198 1
+90 1207 1
+90 1213 1
+90 1216 1
+90 1218 1
+90 1223 1
+90 1226 1
+90 1228 1
+90 1230 1
+90 1232 1
+90 1233 1
+90 1238 1
+90 1241 1
+90 1243 1
+90 1245 1
+90 1247 1
+90 1248 1
+90 1250 1
+90 1252 1
+90 1253 1
+90 1254 1
+90 1274 1
+90 1289 1
+90 1299 1
+90 1305 1
+90 1308 1
+90 1310 1
+90 1324 1
+90 1334 1
+90 1340 1
+90 1343 1
+90 1345 1
+90 1354 1
+90 1360 1
+90 1363 1
+90 1365 1
+90 1370 1
+90 1373 1
+90 1375 1
+90 1377 1
+90 1379 1
+90 1380 1
+90 1394 1
+90 1404 1
+90 1410 1
+90 1413 1
+90 1415 1
+90 1424 1
+90 1430 1
+90 1433 1
+90 1435 1
+90 1440 1
+90 1443 1
+90 1445 1
+90 1447 1
+90 1449 1
+90 1450 1
+90 1459 1
+90 1465 1
+90 1468 1
+90 1470 1
+90 1475 1
+90 1478 1
+90 1480 1
+90 1482 1
+90 1484 1
+90 1485 1
+90 1490 1
+90 1493 1
+90 1495 1
+90 1497 1
+90 1499 1
+90 1500 1
+90 1502 1
+90 1504 1
+90 1505 1
+90 1506 1
+90 1520 1
+90 1530 1
+90 1536 1
+90 1539 1
+90 1541 1
+90 1550 1
+90 1556 1
+90 1559 1
+90 1561 1
+90 1566 1
+90 1569 1
+90 1571 1
+90 1573 1
+90 1575 1
+90 1576 1
+90 1585 1
+90 1591 1
+90 1594 1
+90 1596 1
+90 1601 1
+90 1604 1
+90 1606 1
+90 1608 1
+90 1610 1
+90 1611 1
+90 1616 1
+90 1619 1
+90 1621 1
+90 1623 1
+90 1625 1
+90 1626 1
+90 1628 1
+90 1630 1
+90 1631 1
+90 1632 1
+90 1641 1
+90 1647 1
+90 1650 1
+90 1652 1
+90 1657 1
+90 1660 1
+90 1662 1
+90 1664 1
+90 1666 1
+90 1667 1
+90 1672 1
+90 1675 1
+90 1677 1
+90 1679 1
+90 1681 1
+90 1682 1
+90 1684 1
+90 1686 1
+90 1687 1
+90 1688 1
+90 1693 1
+90 1696 1
+90 1698 1
+90 1700 1
+90 1702 1
+90 1703 1
+90 1705 1
+90 1707 1
+90 1708 1
+90 1709 1
+90 1711 1
+90 1713 1
+90 1714 1
+90 1715 1
+90 1716 1
+90 1743 1
+90 1764 1
+90 1779 1
+90 1789 1
+90 1795 1
+90 1798 1
+90 1800 1
+90 1820 1
+90 1835 1
+90 1845 1
+90 1851 1
+90 1854 1
+90 1856 1
+90 1870 1
+90 1880 1
+90 1886 1
+90 1889 1
+90 1891 1
+90 1900 1
+90 1906 1
+90 1909 1
+90 1911 1
+90 1916 1
+90 1919 1
+90 1921 1
+90 1923 1
+90 1925 1
+90 1926 1
+90 1946 1
+90 1961 1
+90 1971 1
+90 1977 1
+90 1980 1
+90 1982 1
+90 1996 1
+90 2006 1
+90 2012 1
+90 2015 1
+90 2017 1
+90 2026 1
+90 2032 1
+90 2035 1
+90 2037 1
+90 2042 1
+90 2045 1
+90 2047 1
+90 2049 1
+90 2051 1
+90 2052 1
+90 2066 1
+90 2076 1
+90 2082 1
+90 2085 1
+90 2087 1
+90 2096 1
+90 2102 1
+90 2105 1
+90 2107 1
+90 2112 1
+90 2115 1
+90 2117 1
+90 2119 1
+90 2121 1
+90 2122 1
+90 2131 1
+90 2137 1
+90 2140 1
+90 2142 1
+90 2147 1
+90 2150 1
+90 2152 1
+90 2154 1
+90 2156 1
+90 2157 1
+90 2162 1
+90 2165 1
+90 2167 1
+90 2169 1
+90 2171 1
+90 2172 1
+90 2174 1
+90 2176 1
+90 2177 1
+90 2178 1
+90 2198 1
+90 2213 1
+90 2223 1
+90 2229 1
+90 2232 1
+90 2234 1
+90 2248 1
+90 2258 1
+90 2264 1
+90 2267 1
+90 2269 1
+90 2278 1
+90 2284 1
+90 2287 1
+90 2289 1
+90 2294 1
+90 2297 1
+90 2299 1
+90 2301 1
+90 2303 1
+90 2304 1
+90 2318 1
+90 2328 1
+90 2334 1
+90 2337 1
+90 2339 1
+90 2348 1
+90 2354 1
+90 2357 1
+90 2359 1
+90 2364 1
+90 2367 1
+90 2369 1
+90 2371 1
+90 2373 1
+90 2374 1
+90 2383 1
+90 2389 1
+90 2392 1
+90 2394 1
+90 2399 1
+90 2402 1
+90 2404 1
+90 2406 1
+90 2408 1
+90 2409 1
+90 2414 1
+90 2417 1
+90 2419 1
+90 2421 1
+90 2423 1
+90 2424 1
+90 2426 1
+90 2428 1
+90 2429 1
+90 2430 1
+90 2444 1
+90 2454 1
+90 2460 1
+90 2463 1
+90 2465 1
+90 2474 1
+90 2480 1
+90 2483 1
+90 2485 1
+90 2490 1
+90 2493 1
+90 2495 1
+90 2497 1
+90 2499 1
+90 2500 1
+90 2509 1
+90 2515 1
+90 2518 1
+90 2520 1
+90 2525 1
+90 2528 1
+90 2530 1
+90 2532 1
+90 2534 1
+90 2535 1
+90 2540 1
+90 2543 1
+90 2545 1
+90 2547 1
+90 2549 1
+90 2550 1
+90 2552 1
+90 2554 1
+90 2555 1
+90 2556 1
+90 2565 1
+90 2571 1
+90 2574 1
+90 2576 1
+90 2581 1
+90 2584 1
+90 2586 1
+90 2588 1
+90 2590 1
+90 2591 1
+90 2596 1
+90 2599 1
+90 2601 1
+90 2603 1
+90 2605 1
+90 2606 1
+90 2608 1
+90 2610 1
+90 2611 1
+90 2612 1
+90 2617 1
+90 2620 1
+90 2622 1
+90 2624 1
+90 2626 1
+90 2627 1
+90 2629 1
+90 2631 1
+90 2632 1
+90 2633 1
+90 2635 1
+90 2637 1
+90 2638 1
+90 2639 1
+90 2640 1
+90 2660 1
+90 2675 1
+90 2685 1
+90 2691 1
+90 2694 1
+90 2696 1
+90 2710 1
+90 2720 1
+90 2726 1
+90 2729 1
+90 2731 1
+90 2740 1
+90 2746 1
+90 2749 1
+90 2751 1
+90 2756 1
+90 2759 1
+90 2761 1
+90 2763 1
+90 2765 1
+90 2766 1
+90 2780 1
+90 2790 1
+90 2796 1
+90 2799 1
+90 2801 1
+90 2810 1
+90 2816 1
+90 2819 1
+90 2821 1
+90 2826 1
+90 2829 1
+90 2831 1
+90 2833 1
+90 2835 1
+90 2836 1
+90 2845 1
+90 2851 1
+90 2854 1
+90 2856 1
+90 2861 1
+90 2864 1
+90 2866 1
+90 2868 1
+90 2870 1
+90 2871 1
+90 2876 1
+90 2879 1
+90 2881 1
+90 2883 1
+90 2885 1
+90 2886 1
+90 2888 1
+90 2890 1
+90 2891 1
+90 2892 1
+90 2906 1
+90 2916 1
+90 2922 1
+90 2925 1
+90 2927 1
+90 2936 1
+90 2942 1
+90 2945 1
+90 2947 1
+90 2952 1
+90 2955 1
+90 2957 1
+90 2959 1
+90 2961 1
+90 2962 1
+90 2971 1
+90 2977 1
+90 2980 1
+90 2982 1
+90 2987 1
+90 2990 1
+90 2992 1
+90 2994 1
+90 2996 1
+90 2997 1
+90 3002 1
+90 3005 1
+90 3007 1
+90 3009 1
+90 3011 1
+90 3012 1
+90 3014 1
+90 3016 1
+90 3017 1
+90 3018 1
+90 3027 1
+90 3033 1
+90 3036 1
+90 3038 1
+90 3043 1
+90 3046 1
+90 3048 1
+90 3050 1
+90 3052 1
+90 3053 1
+90 3058 1
+90 3061 1
+90 3063 1
+90 3065 1
+90 3067 1
+90 3068 1
+90 3070 1
+90 3072 1
+90 3073 1
+90 3074 1
+90 3079 1
+90 3082 1
+90 3084 1
+90 3086 1
+90 3088 1
+90 3089 1
+90 3091 1
+90 3093 1
+90 3094 1
+90 3095 1
+90 3097 1
+90 3099 1
+90 3100 1
+90 3101 1
+90 3102 1
+90 3116 1
+90 3126 1
+90 3132 1
+90 3135 1
+90 3137 1
+90 3146 1
+90 3152 1
+90 3155 1
+90 3157 1
+90 3162 1
+90 3165 1
+90 3167 1
+90 3169 1
+90 3171 1
+90 3172 1
+90 3181 1
+90 3187 1
+90 3190 1
+90 3192 1
+90 3197 1
+90 3200 1
+90 3202 1
+90 3204 1
+90 3206 1
+90 3207 1
+90 3212 1
+90 3215 1
+90 3217 1
+90 3219 1
+90 3221 1
+90 3222 1
+90 3224 1
+90 3226 1
+90 3227 1
+90 3228 1
+90 3237 1
+90 3243 1
+90 3246 1
+90 3248 1
+90 3253 1
+90 3256 1
+90 3258 1
+90 3260 1
+90 3262 1
+90 3263 1
+90 3268 1
+90 3271 1
+90 3273 1
+90 3275 1
+90 3277 1
+90 3278 1
+90 3280 1
+90 3282 1
+90 3283 1
+90 3284 1
+90 3289 1
+90 3292 1
+90 3294 1
+90 3296 1
+90 3298 1
+90 3299 1
+90 3301 1
+90 3303 1
+90 3304 1
+90 3305 1
+90 3307 1
+90 3309 1
+90 3310 1
+90 3311 1
+90 3312 1
+90 3321 1
+90 3327 1
+90 3330 1
+90 3332 1
+90 3337 1
+90 3340 1
+90 3342 1
+90 3344 1
+90 3346 1
+90 3347 1
+90 3352 1
+90 3355 1
+90 3357 1
+90 3359 1
+90 3361 1
+90 3362 1
+90 3364 1
+90 3366 1
+90 3367 1
+90 3368 1
+90 3373 1
+90 3376 1
+90 3378 1
+90 3380 1
+90 3382 1
+90 3383 1
+90 3385 1
+90 3387 1
+90 3388 1
+90 3389 1
+90 3391 1
+90 3393 1
+90 3394 1
+90 3395 1
+90 3396 1
+90 3401 1
+90 3404 1
+90 3406 1
+90 3408 1
+90 3410 1
+90 3411 1
+90 3413 1
+90 3415 1
+90 3416 1
+90 3417 1
+90 3419 1
+90 3421 1
+90 3422 1
+90 3423 1
+90 3424 1
+90 3426 1
+90 3428 1
+90 3429 1
+90 3430 1
+90 3431 1
+90 3432 1
+91 36 1
+91 64 1
+91 85 1
+91 100 1
+91 110 1
+91 116 1
+91 119 1
+91 120 1
+91 148 1
+91 169 1
+91 184 1
+91 194 1
+91 200 1
+91 203 1
+91 204 1
+91 225 1
+91 240 1
+91 250 1
+91 256 1
+91 259 1
+91 260 1
+91 275 1
+91 285 1
+91 291 1
+91 294 1
+91 295 1
+91 305 1
+91 311 1
+91 314 1
+91 315 1
+91 321 1
+91 324 1
+91 325 1
+91 328 1
+91 329 1
+91 330 1
+91 358 1
+91 379 1
+91 394 1
+91 404 1
+91 410 1
+91 413 1
+91 414 1
+91 435 1
+91 450 1
+91 460 1
+91 466 1
+91 469 1
+91 470 1
+91 485 1
+91 495 1
+91 501 1
+91 504 1
+91 505 1
+91 515 1
+91 521 1
+91 524 1
+91 525 1
+91 531 1
+91 534 1
+91 535 1
+91 538 1
+91 539 1
+91 540 1
+91 561 1
+91 576 1
+91 586 1
+91 592 1
+91 595 1
+91 596 1
+91 611 1
+91 621 1
+91 627 1
+91 630 1
+91 631 1
+91 641 1
+91 647 1
+91 650 1
+91 651 1
+91 657 1
+91 660 1
+91 661 1
+91 664 1
+91 665 1
+91 666 1
+91 681 1
+91 691 1
+91 697 1
+91 700 1
+91 701 1
+91 711 1
+91 717 1
+91 720 1
+91 721 1
+91 727 1
+91 730 1
+91 731 1
+91 734 1
+91 735 1
+91 736 1
+91 746 1
+91 752 1
+91 755 1
+91 756 1
+91 762 1
+91 765 1
+91 766 1
+91 769 1
+91 770 1
+91 771 1
+91 777 1
+91 780 1
+91 781 1
+91 784 1
+91 785 1
+91 786 1
+91 789 1
+91 790 1
+91 791 1
+91 792 1
+91 820 1
+91 841 1
+91 856 1
+91 866 1
+91 872 1
+91 875 1
+91 876 1
+91 897 1
+91 912 1
+91 922 1
+91 928 1
+91 931 1
+91 932 1
+91 947 1
+91 957 1
+91 963 1
+91 966 1
+91 967 1
+91 977 1
+91 983 1
+91 986 1
+91 987 1
+91 993 1
+91 996 1
+91 997 1
+91 1000 1
+91 1001 1
+91 1002 1
+91 1023 1
+91 1038 1
+91 1048 1
+91 1054 1
+91 1057 1
+91 1058 1
+91 1073 1
+91 1083 1
+91 1089 1
+91 1092 1
+91 1093 1
+91 1103 1
+91 1109 1
+91 1112 1
+91 1113 1
+91 1119 1
+91 1122 1
+91 1123 1
+91 1126 1
+91 1127 1
+91 1128 1
+91 1143 1
+91 1153 1
+91 1159 1
+91 1162 1
+91 1163 1
+91 1173 1
+91 1179 1
+91 1182 1
+91 1183 1
+91 1189 1
+91 1192 1
+91 1193 1
+91 1196 1
+91 1197 1
+91 1198 1
+91 1208 1
+91 1214 1
+91 1217 1
+91 1218 1
+91 1224 1
+91 1227 1
+91 1228 1
+91 1231 1
+91 1232 1
+91 1233 1
+91 1239 1
+91 1242 1
+91 1243 1
+91 1246 1
+91 1247 1
+91 1248 1
+91 1251 1
+91 1252 1
+91 1253 1
+91 1254 1
+91 1275 1
+91 1290 1
+91 1300 1
+91 1306 1
+91 1309 1
+91 1310 1
+91 1325 1
+91 1335 1
+91 1341 1
+91 1344 1
+91 1345 1
+91 1355 1
+91 1361 1
+91 1364 1
+91 1365 1
+91 1371 1
+91 1374 1
+91 1375 1
+91 1378 1
+91 1379 1
+91 1380 1
+91 1395 1
+91 1405 1
+91 1411 1
+91 1414 1
+91 1415 1
+91 1425 1
+91 1431 1
+91 1434 1
+91 1435 1
+91 1441 1
+91 1444 1
+91 1445 1
+91 1448 1
+91 1449 1
+91 1450 1
+91 1460 1
+91 1466 1
+91 1469 1
+91 1470 1
+91 1476 1
+91 1479 1
+91 1480 1
+91 1483 1
+91 1484 1
+91 1485 1
+91 1491 1
+91 1494 1
+91 1495 1
+91 1498 1
+91 1499 1
+91 1500 1
+91 1503 1
+91 1504 1
+91 1505 1
+91 1506 1
+91 1521 1
+91 1531 1
+91 1537 1
+91 1540 1
+91 1541 1
+91 1551 1
+91 1557 1
+91 1560 1
+91 1561 1
+91 1567 1
+91 1570 1
+91 1571 1
+91 1574 1
+91 1575 1
+91 1576 1
+91 1586 1
+91 1592 1
+91 1595 1
+91 1596 1
+91 1602 1
+91 1605 1
+91 1606 1
+91 1609 1
+91 1610 1
+91 1611 1
+91 1617 1
+91 1620 1
+91 1621 1
+91 1624 1
+91 1625 1
+91 1626 1
+91 1629 1
+91 1630 1
+91 1631 1
+91 1632 1
+91 1642 1
+91 1648 1
+91 1651 1
+91 1652 1
+91 1658 1
+91 1661 1
+91 1662 1
+91 1665 1
+91 1666 1
+91 1667 1
+91 1673 1
+91 1676 1
+91 1677 1
+91 1680 1
+91 1681 1
+91 1682 1
+91 1685 1
+91 1686 1
+91 1687 1
+91 1688 1
+91 1694 1
+91 1697 1
+91 1698 1
+91 1701 1
+91 1702 1
+91 1703 1
+91 1706 1
+91 1707 1
+91 1708 1
+91 1709 1
+91 1712 1
+91 1713 1
+91 1714 1
+91 1715 1
+91 1716 1
+91 1744 1
+91 1765 1
+91 1780 1
+91 1790 1
+91 1796 1
+91 1799 1
+91 1800 1
+91 1821 1
+91 1836 1
+91 1846 1
+91 1852 1
+91 1855 1
+91 1856 1
+91 1871 1
+91 1881 1
+91 1887 1
+91 1890 1
+91 1891 1
+91 1901 1
+91 1907 1
+91 1910 1
+91 1911 1
+91 1917 1
+91 1920 1
+91 1921 1
+91 1924 1
+91 1925 1
+91 1926 1
+91 1947 1
+91 1962 1
+91 1972 1
+91 1978 1
+91 1981 1
+91 1982 1
+91 1997 1
+91 2007 1
+91 2013 1
+91 2016 1
+91 2017 1
+91 2027 1
+91 2033 1
+91 2036 1
+91 2037 1
+91 2043 1
+91 2046 1
+91 2047 1
+91 2050 1
+91 2051 1
+91 2052 1
+91 2067 1
+91 2077 1
+91 2083 1
+91 2086 1
+91 2087 1
+91 2097 1
+91 2103 1
+91 2106 1
+91 2107 1
+91 2113 1
+91 2116 1
+91 2117 1
+91 2120 1
+91 2121 1
+91 2122 1
+91 2132 1
+91 2138 1
+91 2141 1
+91 2142 1
+91 2148 1
+91 2151 1
+91 2152 1
+91 2155 1
+91 2156 1
+91 2157 1
+91 2163 1
+91 2166 1
+91 2167 1
+91 2170 1
+91 2171 1
+91 2172 1
+91 2175 1
+91 2176 1
+91 2177 1
+91 2178 1
+91 2199 1
+91 2214 1
+91 2224 1
+91 2230 1
+91 2233 1
+91 2234 1
+91 2249 1
+91 2259 1
+91 2265 1
+91 2268 1
+91 2269 1
+91 2279 1
+91 2285 1
+91 2288 1
+91 2289 1
+91 2295 1
+91 2298 1
+91 2299 1
+91 2302 1
+91 2303 1
+91 2304 1
+91 2319 1
+91 2329 1
+91 2335 1
+91 2338 1
+91 2339 1
+91 2349 1
+91 2355 1
+91 2358 1
+91 2359 1
+91 2365 1
+91 2368 1
+91 2369 1
+91 2372 1
+91 2373 1
+91 2374 1
+91 2384 1
+91 2390 1
+91 2393 1
+91 2394 1
+91 2400 1
+91 2403 1
+91 2404 1
+91 2407 1
+91 2408 1
+91 2409 1
+91 2415 1
+91 2418 1
+91 2419 1
+91 2422 1
+91 2423 1
+91 2424 1
+91 2427 1
+91 2428 1
+91 2429 1
+91 2430 1
+91 2445 1
+91 2455 1
+91 2461 1
+91 2464 1
+91 2465 1
+91 2475 1
+91 2481 1
+91 2484 1
+91 2485 1
+91 2491 1
+91 2494 1
+91 2495 1
+91 2498 1
+91 2499 1
+91 2500 1
+91 2510 1
+91 2516 1
+91 2519 1
+91 2520 1
+91 2526 1
+91 2529 1
+91 2530 1
+91 2533 1
+91 2534 1
+91 2535 1
+91 2541 1
+91 2544 1
+91 2545 1
+91 2548 1
+91 2549 1
+91 2550 1
+91 2553 1
+91 2554 1
+91 2555 1
+91 2556 1
+91 2566 1
+91 2572 1
+91 2575 1
+91 2576 1
+91 2582 1
+91 2585 1
+91 2586 1
+91 2589 1
+91 2590 1
+91 2591 1
+91 2597 1
+91 2600 1
+91 2601 1
+91 2604 1
+91 2605 1
+91 2606 1
+91 2609 1
+91 2610 1
+91 2611 1
+91 2612 1
+91 2618 1
+91 2621 1
+91 2622 1
+91 2625 1
+91 2626 1
+91 2627 1
+91 2630 1
+91 2631 1
+91 2632 1
+91 2633 1
+91 2636 1
+91 2637 1
+91 2638 1
+91 2639 1
+91 2640 1
+91 2661 1
+91 2676 1
+91 2686 1
+91 2692 1
+91 2695 1
+91 2696 1
+91 2711 1
+91 2721 1
+91 2727 1
+91 2730 1
+91 2731 1
+91 2741 1
+91 2747 1
+91 2750 1
+91 2751 1
+91 2757 1
+91 2760 1
+91 2761 1
+91 2764 1
+91 2765 1
+91 2766 1
+91 2781 1
+91 2791 1
+91 2797 1
+91 2800 1
+91 2801 1
+91 2811 1
+91 2817 1
+91 2820 1
+91 2821 1
+91 2827 1
+91 2830 1
+91 2831 1
+91 2834 1
+91 2835 1
+91 2836 1
+91 2846 1
+91 2852 1
+91 2855 1
+91 2856 1
+91 2862 1
+91 2865 1
+91 2866 1
+91 2869 1
+91 2870 1
+91 2871 1
+91 2877 1
+91 2880 1
+91 2881 1
+91 2884 1
+91 2885 1
+91 2886 1
+91 2889 1
+91 2890 1
+91 2891 1
+91 2892 1
+91 2907 1
+91 2917 1
+91 2923 1
+91 2926 1
+91 2927 1
+91 2937 1
+91 2943 1
+91 2946 1
+91 2947 1
+91 2953 1
+91 2956 1
+91 2957 1
+91 2960 1
+91 2961 1
+91 2962 1
+91 2972 1
+91 2978 1
+91 2981 1
+91 2982 1
+91 2988 1
+91 2991 1
+91 2992 1
+91 2995 1
+91 2996 1
+91 2997 1
+91 3003 1
+91 3006 1
+91 3007 1
+91 3010 1
+91 3011 1
+91 3012 1
+91 3015 1
+91 3016 1
+91 3017 1
+91 3018 1
+91 3028 1
+91 3034 1
+91 3037 1
+91 3038 1
+91 3044 1
+91 3047 1
+91 3048 1
+91 3051 1
+91 3052 1
+91 3053 1
+91 3059 1
+91 3062 1
+91 3063 1
+91 3066 1
+91 3067 1
+91 3068 1
+91 3071 1
+91 3072 1
+91 3073 1
+91 3074 1
+91 3080 1
+91 3083 1
+91 3084 1
+91 3087 1
+91 3088 1
+91 3089 1
+91 3092 1
+91 3093 1
+91 3094 1
+91 3095 1
+91 3098 1
+91 3099 1
+91 3100 1
+91 3101 1
+91 3102 1
+91 3117 1
+91 3127 1
+91 3133 1
+91 3136 1
+91 3137 1
+91 3147 1
+91 3153 1
+91 3156 1
+91 3157 1
+91 3163 1
+91 3166 1
+91 3167 1
+91 3170 1
+91 3171 1
+91 3172 1
+91 3182 1
+91 3188 1
+91 3191 1
+91 3192 1
+91 3198 1
+91 3201 1
+91 3202 1
+91 3205 1
+91 3206 1
+91 3207 1
+91 3213 1
+91 3216 1
+91 3217 1
+91 3220 1
+91 3221 1
+91 3222 1
+91 3225 1
+91 3226 1
+91 3227 1
+91 3228 1
+91 3238 1
+91 3244 1
+91 3247 1
+91 3248 1
+91 3254 1
+91 3257 1
+91 3258 1
+91 3261 1
+91 3262 1
+91 3263 1
+91 3269 1
+91 3272 1
+91 3273 1
+91 3276 1
+91 3277 1
+91 3278 1
+91 3281 1
+91 3282 1
+91 3283 1
+91 3284 1
+91 3290 1
+91 3293 1
+91 3294 1
+91 3297 1
+91 3298 1
+91 3299 1
+91 3302 1
+91 3303 1
+91 3304 1
+91 3305 1
+91 3308 1
+91 3309 1
+91 3310 1
+91 3311 1
+91 3312 1
+91 3322 1
+91 3328 1
+91 3331 1
+91 3332 1
+91 3338 1
+91 3341 1
+91 3342 1
+91 3345 1
+91 3346 1
+91 3347 1
+91 3353 1
+91 3356 1
+91 3357 1
+91 3360 1
+91 3361 1
+91 3362 1
+91 3365 1
+91 3366 1
+91 3367 1
+91 3368 1
+91 3374 1
+91 3377 1
+91 3378 1
+91 3381 1
+91 3382 1
+91 3383 1
+91 3386 1
+91 3387 1
+91 3388 1
+91 3389 1
+91 3392 1
+91 3393 1
+91 3394 1
+91 3395 1
+91 3396 1
+91 3402 1
+91 3405 1
+91 3406 1
+91 3409 1
+91 3410 1
+91 3411 1
+91 3414 1
+91 3415 1
+91 3416 1
+91 3417 1
+91 3420 1
+91 3421 1
+91 3422 1
+91 3423 1
+91 3424 1
+91 3427 1
+91 3428 1
+91 3429 1
+91 3430 1
+91 3431 1
+91 3432 1
+0 0 0
diff --git a/benchmarks/matrix/bibd_14_7_91x3432.sms.gz b/benchmarks/matrix/bibd_14_7_91x3432.sms.gz
new file mode 100644
index 0000000..a8022a2
Binary files /dev/null and b/benchmarks/matrix/bibd_14_7_91x3432.sms.gz differ
diff --git a/benchmarks/omp-benchmark.C b/benchmarks/omp-benchmark.C
new file mode 100644
index 0000000..7cdf575
--- /dev/null
+++ b/benchmarks/omp-benchmark.C
@@ -0,0 +1,320 @@
+/* Copyright (C) 2013 LinBox
+ * Written by AJS <stachnik at udel.edu>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file   benchmarks/omp-benchmark.C
+ * @ingroup benchmarks
+ * @brief f
+ */
+
+#include "linbox/linbox-config.h"
+
+#include <stdlib.h>
+#include <fstream>
+#include <time.h>
+#include <omp.h>
+
+#include "benchmarks/CSValue.h"
+#include "benchmarks/BenchmarkFile.h"
+
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/vector/blas-vector.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/util/timer.h"
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparsematrix/sparse-tpl-matrix-omp.h"
+#include "linbox/blackbox/transpose.h"
+#include "linbox/vector/vector-domain.h"
+#include "examples/map-sparse.h"
+
+#include "linbox/algorithms/blackbox-block-container.h"
+#include "linbox/algorithms/block-massey-domain.h"
+
+using namespace LinBox;
+
+typedef Givaro::Modular<double> Field;
+typedef TriplesBBOMP<Field> OMPBB;
+typedef TriplesBB<Field> SeqBB;
+typedef SparseMatrix<Field,SparseMatrixFormat::VPV> VPVBB;
+
+int randRange(int start, int end)
+{
+        double rval = rand();
+        static const double NORMALIZING_CONSTANT = 1.0/(1.0+RAND_MAX);
+        double normedRVal = rval*NORMALIZING_CONSTANT;
+        double rangeSize = end-start;
+        int offset = rangeSize*normedRVal;
+        return start+offset;
+}
+
+template<class Blackbox>
+void runBlockWiedemann(BenchmarkFile& of,
+                       typename Blackbox::Field F,
+                       MapSparse<typename Blackbox::Field> matA,
+                       MapSparse<typename Blackbox::Field> matU,
+                       MapSparse<typename Blackbox::Field> matV,
+                       int iters)
+{
+        typedef typename Blackbox::Field Field;
+        typedef BlackboxBlockContainer<Field,Blackbox> BlockContainer;
+        typedef BlasMatrix<Field> Block;
+
+        int m=matA.rowdim();
+        int n=matA.coldim();
+        int p=matU.rowdim();
+        int q=matV.coldim();
+
+        Blackbox A(F,m,n);
+        Block U(F,p,m), V(F,n,q);
+        matU.copy(U);
+        matV.copy(V);
+        matA.copy(A);
+        A.finalize();
+
+        BlockContainer Sequence(&A,F,U,V);
+        BlockMasseyDomain<Field,BlockContainer> MBD(&Sequence);
+        std::vector<Block> minpoly;
+        std::vector<size_t> degree;
+
+        double start = omp_get_wtime();
+        for (int i=0;i<iters;++i) { 
+                MBD.left_minpoly_rec(minpoly,degree);
+        }
+        double time=omp_get_wtime()-start;
+
+        of.addDataField("time",CSDouble(time));
+}
+
+template<class Blackbox>
+void runMMP(BenchmarkFile& of,
+            typename Blackbox::Field F,
+            MapSparse<typename Blackbox::Field> leftMat,
+            MapSparse<typename Blackbox::Field> rightMat,
+            int iters)
+{
+        typedef typename MatrixDomain<typename Blackbox::Field>::OwnMatrix OwnMatrix;
+
+        int m=leftMat.rowdim();
+        int n=leftMat.coldim();
+        int p=rightMat.coldim();
+
+        Blackbox A(F,m,n);
+        OwnMatrix x(F,n,p), y(F,n,p);
+        linbox_check(n==p);
+
+        leftMat.copy(A);
+        rightMat.copy(x);
+        A.finalize();
+
+        double start = omp_get_wtime();
+        for (int i=0;i<iters;++i) {
+                A.applyLeft(y,x);
+                A.applyLeft(x,y);
+        }
+        double time=omp_get_wtime()-start;
+
+        of.addDataField("time",CSDouble(time));
+}
+
+template<class Blackbox>
+void runMVP(BenchmarkFile& of,
+            typename Blackbox::Field F,
+            MapSparse<typename Blackbox::Field> mat,
+            MapSparse<typename Blackbox::Field> vec,
+            int iters)
+{
+        typedef typename Blackbox::Field Field;
+        typedef typename Field::Element Element;
+        typedef typename std::vector<Element> Vector;
+
+        int m=mat.rowdim();
+        int n=mat.coldim();
+
+        Blackbox A(F,m,n);
+        Vector x(n), y(n);
+
+        mat.copy(A);
+        vec.toVector(x);
+        A.finalize();
+
+        double start = omp_get_wtime();
+        for (int i=0;i<iters;++i) {
+                A.apply(y,x);
+                A.apply(x,y);
+        }
+        double time=omp_get_wtime()-start;
+
+        of.addDataField("time",CSDouble(time));
+}
+
+
+void blockWiedemannBenchmark(BenchmarkFile& benchmarkFile,
+                             int n,
+                             int m,
+                             int nnz,
+                             int iters,
+                             int q)
+{
+        benchmarkFile.addMetadata("problem",CSString("Min-poly"));
+
+        Field F(q);
+
+        MapSparse<Field> A(F,n,n);
+        MapSparse<Field> U(F,n,m);
+        MapSparse<Field> V(F,m,n);
+        MapSparse<Field>::generateRandMat(A,nnz,q);
+        MapSparse<Field>::generateDenseRandMat(U,q);
+        MapSparse<Field>::generateDenseRandMat(V,q);
+
+        benchmarkFile.addDataField("algorithm",CSString("Block-Wiedemann Parallel"));
+        runBlockWiedemann<OMPBB>(benchmarkFile,F,A,U,V,iters);
+        benchmarkFile.pushBackTest();
+
+        benchmarkFile.addDataField("algorithm",CSString("Block-Wiedemann Seq"));
+        runBlockWiedemann<SeqBB>(benchmarkFile,F,A,U,V,iters);
+        benchmarkFile.pushBackTest();
+}
+
+
+void MMPBenchmark(BenchmarkFile& benchmarkFile,
+                  int n,
+                  int m,
+                  int nnz,
+                  int iters,
+                  int q)
+{
+        benchmarkFile.addMetadata("problem",CSString("Matrix-Matrix Product"));
+
+        Field F(q);
+
+        MapSparse<Field> A(F,n,n);
+        MapSparse<Field> X(F,n,m);
+        MapSparse<Field>::generateRandMat(A,nnz,q);
+        MapSparse<Field>::generateDenseRandMat(X,q);
+
+        benchmarkFile.addDataField("algorithm",CSString("TriplesBBOMP-applyLeft"));
+        runMMP<OMPBB>(benchmarkFile,F,A,X,iters);
+        benchmarkFile.pushBackTest();
+
+        benchmarkFile.addDataField("algorithm",CSString("TriplesBB-seq-applyLeft"));
+        runMMP<SeqBB>(benchmarkFile,F,A,X,iters);
+        benchmarkFile.pushBackTest();
+}
+
+
+void MVPBenchmark(BenchmarkFile& benchmarkFile,
+                  int n,
+                  int nnz,
+                  int iters,
+                  int q)
+{
+        benchmarkFile.addMetadata("problem",CSString("Matrix-Vector Product"));
+
+        Field F(q);
+
+        MapSparse<Field> A(F,n,n);
+        MapSparse<Field> X(F,n,1);
+        MapSparse<Field>::generateRandMat(A,nnz,q);
+        MapSparse<Field>::generateDenseRandMat(X,q);
+
+        benchmarkFile.addDataField("algorithm",CSString("TriplesBBOMP-apply"));
+        runMVP<OMPBB>(benchmarkFile,F,A,X,iters);
+        benchmarkFile.pushBackTest();
+
+        benchmarkFile.addDataField("algorithm",CSString("TriplesBBOMP-applyLeft"));
+        runMVP<OMPBB>(benchmarkFile,F,A,X,iters);
+        benchmarkFile.pushBackTest();
+
+        benchmarkFile.addDataField("algorithm",CSString("TriplesBB-seq-applyLeft"));
+        runMVP<SeqBB>(benchmarkFile,F,A,X,iters);
+        benchmarkFile.pushBackTest();
+
+        benchmarkFile.addDataField("algorithm",CSString("TriplesBB-seq-apply"));
+        runMVP<SeqBB>(benchmarkFile,F,A,X,iters);
+        benchmarkFile.pushBackTest();
+
+        benchmarkFile.addDataField("algorithm",CSString("SparseMatrix::VPV"));
+        runMVP<VPVBB>(benchmarkFile,F,A,X,iters);
+        benchmarkFile.pushBackTest();
+}
+
+int main(int argc, char **argv)
+{
+        int numThreads=1,n=50000,m=100,nnz=50000,q=65521,iters=1;
+        bool runMMPBenchmarks=false,runMVPBenchmarks=false,runWiedemann=false;
+
+	static Argument args[] = {
+		{ 't', "-t THREADS", "Number of threads", TYPE_INT, &numThreads },
+                { 'n', "-n N", "Dimension of N*N matrix A", TYPE_INT, &n },
+                { 'm', "-m M", "Dimension of N*M matrix X", TYPE_INT, &m },
+                { 'z', "-z NNZ", "Number of non-zero entries", TYPE_INT, &nnz},
+                { 'q', "-q PRIME", "Use field GF(Q) for prime Q", TYPE_INT, &q},
+                { 'i', "-i ITERS", "Number of iterations", TYPE_INT, &iters},
+
+                { 'a', NULL, "Run Matrix-Matrix Benchmarks", TYPE_BOOL,&runMMPBenchmarks},
+                { 'b', NULL, "Run Matrix-Vector Benchmarks", TYPE_BOOL,&runMVPBenchmarks},
+                { 'c', NULL, "Run Block-Wiedemann Benchmarks", TYPE_BOOL,&runWiedemann},
+                END_OF_ARGUMENTS};
+
+	parseArguments (argc, argv, args);
+
+        BenchmarkFile benchmarkFile;
+
+        benchmarkFile.addMetadata("Field-Implementation",CSString("Givaro::Modular<double>"));
+        benchmarkFile.addMetadata("num_threads",CSInt(numThreads));
+        benchmarkFile.addMetadata("N*N Blackbox Dimensions",CSInt(n));
+        benchmarkFile.addMetadata("Fat Vector Dimension",CSInt(m));
+        benchmarkFile.addMetadata("nnz",CSInt(nnz));
+        benchmarkFile.addMetadata("iterations",CSInt(iters));
+        benchmarkFile.addMetadata("date",BenchmarkFile::getDateStamp());
+        benchmarkFile.addMetadata("GF(q)",CSInt(q));
+
+        benchmarkFile.setType("date",BenchmarkFile::getDateFormat());
+        benchmarkFile.setType("time","seconds");
+
+        omp_set_num_threads(numThreads);
+
+        if (runMMPBenchmarks) {
+                MMPBenchmark(benchmarkFile,n,m,nnz,iters,q);
+                benchmarkFile.write(std::cout);
+        }
+        if (runMVPBenchmarks) {
+                MVPBenchmark(benchmarkFile,n,nnz,iters,q);
+                benchmarkFile.write(std::cout);
+        }
+        if (runWiedemann) {
+                blockWiedemannBenchmark(benchmarkFile,n,m,nnz,iters,q);
+                benchmarkFile.write(std::cout);
+        }
+
+        return 0;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/optimizer.h b/benchmarks/optimizer.h
new file mode 100644
index 0000000..9f4d8af
--- /dev/null
+++ b/benchmarks/optimizer.h
@@ -0,0 +1,85 @@
+/* Copyright (C) 2013 LinBox
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file   benchmarks/optimizer.h
+ * @ingroup benchmarks
+ *
+ */
+
+#ifndef __LINBOX_benchmarks_optimizer_H_
+#define __LINBOX_benchmarks_optimizer_H_
+
+namespace LinBox {
+
+	/* optimiser from a graph. */
+
+	/*
+	 *   -----
+	 *   if (a < threshold) then
+	 *        toto()
+	 *   else
+	 *        titi()
+	 *   ----
+	 *
+	 * OR (always better)
+	 *
+	 *   ----
+	 *   toto();
+	 *   ----
+	 */
+
+	// Optimizer opt(Data,Skeleton);
+	// opt.run();
+	// opt.report("file");
+
+	/* optimiser from two timers */
+	// Optimizer opt(class1,class2,Skeleton);
+	// opt.run();
+	// opt.report("file")
+	//
+	// opt.fit()
+	//
+	//
+	class Optimizer {
+
+
+
+		void report(const std::string & filename) ;
+
+		void run() ;
+
+		void fit();
+
+	}
+}
+
+#endif // __LINBOX_benchmarks_optimizer_H_
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/benchmarks/perfpublisher.sh b/benchmarks/perfpublisher.sh
new file mode 100755
index 0000000..8be3168
--- /dev/null
+++ b/benchmarks/perfpublisher.sh
@@ -0,0 +1,169 @@
+#!/bin/bash
+# Script to format benchmarks results into a single xml file.
+# See https://wiki.jenkins-ci.org/display/JENKINS/PerfPublisher+Plugin
+# -----
+# 2014/11/17 - Written by AB <Alexis.Breust at imag.fr>
+
+XMLFILE=$1
+benchmarks=$2
+COMPILER=$3
+
+#=================#
+# Plateform infos #
+#=================#
+
+COMPILERVERSION=$($COMPILER --version 2>&1 | head -1)
+CPUFREQ=$(lscpu | grep "MHz" | rev | cut -f1 -d' ' | rev)
+ARCH=$(uname -m)
+OSNAME=$(uname -s)
+OSVERSION=$(uname -r)
+
+if hash lsb_release 2>/dev/null
+	then DISTRIB=$(lsb_release -ds)
+	else DISTRIB='Unknown distribution'
+fi
+
+#==========#
+# Prologue #
+#==========#
+
+if [[ -f $XMLFILE ]]
+then
+	echo '----> WARNING: File '$XMLFILE' is not empty.'
+	echo '---->          Results will be added to its end.'
+fi
+
+#========#
+# Header #
+#========#
+
+echo '<?xml version="1.0" encoding="UTF-8"?>' >> $XMLFILE
+echo '<report name="benchmarks-report" categ="benchmarks">' >> $XMLFILE
+
+#=======#
+# Start #
+#=======#
+
+echo '<start>' >> $XMLFILE
+echo '<date format="YYYYMMDD" val="'$(date +%Y%m%d)'" />' >> $XMLFILE
+echo '<time format="HHMMSS" val="'$(date +%H%M%S)'" />' >> $XMLFILE
+echo '</start>' >> $XMLFILE
+
+#============#
+# Benchmarks #
+#============#
+
+for benchmark in $benchmarks
+do
+	if [[ ! -f $benchmark ]]
+	then
+		#File does not exist: compile it
+		echo '[Compiling]' $benchmark
+		COMPILESTART=$(date +%s%3N)
+		COMPILELOG=$(make $benchmark 2>&1; echo 'Returned state: '$?)
+		COMPILEEND=$(date +%s%3N)
+		COMPILETIME=$(($COMPILEEND - $COMPILESTART))
+		COMPILECHECK=$(echo $COMPILELOG | grep -o '[^ ]*$')
+		COMPILETIMERELEVANT='true'
+	else
+		#File does exist
+		echo '[Already compiled]' $benchmark
+		COMPILELOG='(Previously compiled)'
+		COMPILETIME='0.0'
+		COMPILECHECK='0'
+		COMPILETIMERELEVANT='false'
+	fi
+	
+	if [[ $COMPILECHECK -ne 0 ]]
+	then
+		#Compilation failure
+		# EXECUTED='no' - keep it to yes so that Jenkins
+		# uses it within its results
+		EXECUTED='yes'
+		PASSED='no'
+		STATE='0'
+		EXECUTIONLOG='(Not executed)'
+		EXECUTIONTIME='0.0'
+		PERFORMANCEFLOPS='0.0'
+		COMPILETIMERELEVANT='false'
+		EXECUTIONTIMERELEVANT='false'
+		PERFORMANCEFLOPSRELEVANT='false'
+		ERRORLOG='Does not compile.'
+		echo '-> Does not compile.'
+	else
+		#Compilation success
+		echo '[Executing]' $benchmark
+		EXECUTED='yes'
+		EXECUTIONLOG=$(./$benchmark 2>&1)
+
+		if [[ ${EXECUTIONLOG,,} != "time:"* ]]
+		then
+			#Execution failure
+			PASSED='no'
+			STATE='0'
+			EXECUTIONTIME='0.0'
+			PERFORMANCEFLOPS='0.0'
+			EXECUTIONTIMERELEVANT='false'
+			PERFORMANCEFLOPSRELEVANT='false'
+			ERRORLOG='Unexpected output.'
+			echo '-> Unexpected output.'
+		else
+			#Execution success
+			PASSED='yes'
+			STATE='100'
+			EXECUTIONTIME=$(echo $EXECUTIONLOG | cut -d' ' -f2)
+			PERFORMANCEFLOPS=$(echo $EXECUTIONLOG | cut -d' ' -f4)
+			EXECUTIONTIMERELEVANT='true'
+			if [[ ${PERFORMANCEFLOPS,,} != "irrelevant" ]]
+			then
+				PERFORMANCEFLOPSRELEVANT='true'
+			else
+				PERFORMANCEFLOPSRELEVANT='false'
+				PERFORMANCEFLOPS='0.0'
+			fi
+			ERRORLOG=''
+		fi
+	fi
+
+	echo '<test name="'$benchmark'" executed="'$EXECUTED'">' >> $XMLFILE
+	echo '<targets><target>BENCHMARK</target></targets>' >> $XMLFILE
+	echo '<platform>' >> $XMLFILE
+	echo '<os>' >> $XMLFILE
+	echo '<name><![CDATA['$OSNAME']]></name>' >> $XMLFILE
+	echo '<version><![CDATA['$OSVERSION']]></version>' >> $XMLFILE
+	echo '<distribution><![CDATA['$DISTRIB']]></distribution>' >> $XMLFILE
+	echo '</os>' >> $XMLFILE
+	echo '<processor arch="'$ARCH'">' >> $XMLFILE
+	echo '<frequency unit="MHz" cpufreq="'$CPUFREQ'" />' >> $XMLFILE
+	echo '</processor>' >> $XMLFILE
+	echo '<compiler name="'$COMPILER'" version="'$COMPILERVERSION'" />' >> $XMLFILE
+	echo '</platform>' >> $XMLFILE
+	echo '<result>' >> $XMLFILE
+	
+	# Logs
+	echo '<success passed="'$PASSED'" state="'$STATE'" />' >> $XMLFILE
+	echo '<errorlog><![CDATA['$ERRORLOG']]></errorlog>' >> $XMLFILE
+	echo '<log name="Compile output"><![CDATA['"$COMPILELOG"']]></log>' >> $XMLFILE
+	echo '<log name="Execution output"><![CDATA['"$benchmark $EXECUTIONLOG"']]></log>' >> $XMLFILE
+	
+	# Times
+	echo '<compiletime unit="ms" mesure="'$COMPILETIME'" isRelevant="'$COMPILETIMERELEVANT'" />' >> $XMLFILE
+	echo '<executiontime unit="s" mesure="'$EXECUTIONTIME'" isRelevant="'$EXECUTIONTIMERELEVANT'" />' >> $XMLFILE
+	echo '<performance unit="GFLOPS" mesure="'$PERFORMANCEFLOPS'" isRelevant="'$PERFORMANCEFLOPSRELEVANT'" />' >> $XMLFILE
+	
+	echo '</result>' >> $XMLFILE
+	echo '</test>' >> $XMLFILE
+done
+
+#========#
+# Footer #
+#========#
+
+echo '</report>' >> $XMLFILE
+
+#==========#
+# Epilogue #
+#==========#
+
+echo 'Results correctly exported to' $XMLFILE
+
diff --git a/build-aux/config.guess b/build-aux/config.guess
deleted file mode 100755
index a3b0d66..0000000
--- a/build-aux/config.guess
+++ /dev/null
@@ -1,1545 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-#   2011, 2012 Free Software Foundation, Inc.
-
-timestamp='2012-02-10'
-
-# This file 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 2 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
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner.  Please send patches (context
-# diff format) to <config-patches at gnu.org> and include a ChangeLog
-# entry.
-#
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
-#
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches at gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help" >&2
-       exit 1 ;;
-    * )
-       break ;;
-  esac
-done
-
-if test $# != 0; then
-  echo "$me: too many arguments$help" >&2
-  exit 1
-fi
-
-trap 'exit 1' 1 2 15
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
-
-set_cc_for_build='
-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
-: ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
-dummy=$tmp/dummy ;
-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
-case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,)    echo "int x;" > $dummy.c ;
-	for c in cc gcc c89 c99 ; do
-	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
-	     CC_FOR_BUILD="$c"; break ;
-	  fi ;
-	done ;
-	if test x"$CC_FOR_BUILD" = x ; then
-	  CC_FOR_BUILD=no_compiler_found ;
-	fi
-	;;
- ,,*)   CC_FOR_BUILD=$CC ;;
- ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
-esac ; set_cc_for_build= ;'
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi at noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
-	PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-case "${UNAME_SYSTEM}" in
-Linux|GNU/*)
-	eval $set_cc_for_build
-	cat <<-EOF > $dummy.c
-	#include <features.h>
-	#ifdef __UCLIBC__
-	# ifdef __UCLIBC_CONFIG_VERSION__
-	LIBC=uclibc __UCLIBC_CONFIG_VERSION__
-	# else
-	LIBC=uclibc
-	# endif
-	#else
-	# ifdef __dietlibc__
-	LIBC=dietlibc
-	# else
-	LIBC=gnu
-	# endif
-	#endif
-	EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
-	;;
-esac
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
-    *:NetBSD:*:*)
-	# NetBSD (nbsd) targets should (where applicable) match one or
-	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
-	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
-	# switched to ELF, *-*-netbsd* would select the old
-	# object file format.  This provides both forward
-	# compatibility and a consistent mechanism for selecting the
-	# object file format.
-	#
-	# Note: NetBSD doesn't particularly care about the vendor
-	# portion of the name.  We always set it to "unknown".
-	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
-	case "${UNAME_MACHINE_ARCH}" in
-	    armeb) machine=armeb-unknown ;;
-	    arm*) machine=arm-unknown ;;
-	    sh3el) machine=shl-unknown ;;
-	    sh3eb) machine=sh-unknown ;;
-	    sh5el) machine=sh5le-unknown ;;
-	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
-	esac
-	# The Operating System including object format, if it has switched
-	# to ELF recently, or will in the future.
-	case "${UNAME_MACHINE_ARCH}" in
-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
-		eval $set_cc_for_build
-		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
-			| grep -q __ELF__
-		then
-		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
-		    # Return netbsd for either.  FIX?
-		    os=netbsd
-		else
-		    os=netbsdelf
-		fi
-		;;
-	    *)
-		os=netbsd
-		;;
-	esac
-	# The OS release
-	# Debian GNU/NetBSD machines have a different userland, and
-	# thus, need a distinct triplet. However, they do not need
-	# kernel version information, so it can be replaced with a
-	# suitable tag, in the style of linux-gnu.
-	case "${UNAME_VERSION}" in
-	    Debian*)
-		release='-gnu'
-		;;
-	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
-		;;
-	esac
-	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
-	# contains redundant information, the shorter form:
-	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
-	exit ;;
-    *:OpenBSD:*:*)
-	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
-	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
-	exit ;;
-    *:ekkoBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
-	exit ;;
-    *:SolidBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
-	exit ;;
-    macppc:MirBSD:*:*)
-	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    *:MirBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    alpha:OSF1:*:*)
-	case $UNAME_RELEASE in
-	*4.0)
-		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
-		;;
-	*5.*)
-		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
-		;;
-	esac
-	# According to Compaq, /usr/sbin/psrinfo has been available on
-	# OSF/1 and Tru64 systems produced since 1995.  I hope that
-	# covers most systems running today.  This code pipes the CPU
-	# types through head -n 1, so we only detect the type of CPU 0.
-	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
-	case "$ALPHA_CPU_TYPE" in
-	    "EV4 (21064)")
-		UNAME_MACHINE="alpha" ;;
-	    "EV4.5 (21064)")
-		UNAME_MACHINE="alpha" ;;
-	    "LCA4 (21066/21068)")
-		UNAME_MACHINE="alpha" ;;
-	    "EV5 (21164)")
-		UNAME_MACHINE="alphaev5" ;;
-	    "EV5.6 (21164A)")
-		UNAME_MACHINE="alphaev56" ;;
-	    "EV5.6 (21164PC)")
-		UNAME_MACHINE="alphapca56" ;;
-	    "EV5.7 (21164PC)")
-		UNAME_MACHINE="alphapca57" ;;
-	    "EV6 (21264)")
-		UNAME_MACHINE="alphaev6" ;;
-	    "EV6.7 (21264A)")
-		UNAME_MACHINE="alphaev67" ;;
-	    "EV6.8CB (21264C)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8AL (21264B)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8CX (21264D)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.9A (21264/EV69A)")
-		UNAME_MACHINE="alphaev69" ;;
-	    "EV7 (21364)")
-		UNAME_MACHINE="alphaev7" ;;
-	    "EV7.9 (21364A)")
-		UNAME_MACHINE="alphaev79" ;;
-	esac
-	# A Pn.n version is a patched version.
-	# A Vn.n version is a released version.
-	# A Tn.n version is a released field test version.
-	# A Xn.n version is an unreleased experimental baselevel.
-	# 1.2 uses "1.2" for uname -r.
-	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
-	exitcode=$?
-	trap '' 0
-	exit $exitcode ;;
-    Alpha\ *:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# Should we change UNAME_MACHINE based on the output of uname instead
-	# of the specific Alpha model?
-	echo alpha-pc-interix
-	exit ;;
-    21064:Windows_NT:50:3)
-	echo alpha-dec-winnt3.5
-	exit ;;
-    Amiga*:UNIX_System_V:4.0:*)
-	echo m68k-unknown-sysv4
-	exit ;;
-    *:[Aa]miga[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-amigaos
-	exit ;;
-    *:[Mm]orph[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-morphos
-	exit ;;
-    *:OS/390:*:*)
-	echo i370-ibm-openedition
-	exit ;;
-    *:z/VM:*:*)
-	echo s390-ibm-zvmoe
-	exit ;;
-    *:OS400:*:*)
-	echo powerpc-ibm-os400
-	exit ;;
-    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
-	echo arm-acorn-riscix${UNAME_RELEASE}
-	exit ;;
-    arm:riscos:*:*|arm:RISCOS:*:*)
-	echo arm-unknown-riscos
-	exit ;;
-    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
-	echo hppa1.1-hitachi-hiuxmpp
-	exit ;;
-    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
-	# akee at wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
-	if test "`(/bin/universe) 2>/dev/null`" = att ; then
-		echo pyramid-pyramid-sysv3
-	else
-		echo pyramid-pyramid-bsd
-	fi
-	exit ;;
-    NILE*:*:*:dcosx)
-	echo pyramid-pyramid-svr4
-	exit ;;
-    DRS?6000:unix:4.0:6*)
-	echo sparc-icl-nx6
-	exit ;;
-    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
-	case `/usr/bin/uname -p` in
-	    sparc) echo sparc-icl-nx7; exit ;;
-	esac ;;
-    s390x:SunOS:*:*)
-	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4H:SunOS:5.*:*)
-	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
-	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
-	echo i386-pc-auroraux${UNAME_RELEASE}
-	exit ;;
-    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
-	eval $set_cc_for_build
-	SUN_ARCH="i386"
-	# If there is a compiler, see if it is configured for 64-bit objects.
-	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
-	# This test works for both compilers.
-	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
-	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
-		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		grep IS_64BIT_ARCH >/dev/null
-	    then
-		SUN_ARCH="x86_64"
-	    fi
-	fi
-	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:6*:*)
-	# According to config.sub, this is the proper way to canonicalize
-	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
-	# it's likely to be more like Solaris than SunOS4.
-	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:*:*)
-	case "`/usr/bin/arch -k`" in
-	    Series*|S4*)
-		UNAME_RELEASE=`uname -v`
-		;;
-	esac
-	# Japanese Language versions have a version number like `4.1.3-JL'.
-	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
-	exit ;;
-    sun3*:SunOS:*:*)
-	echo m68k-sun-sunos${UNAME_RELEASE}
-	exit ;;
-    sun*:*:4.2BSD:*)
-	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
-	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
-	case "`/bin/arch`" in
-	    sun3)
-		echo m68k-sun-sunos${UNAME_RELEASE}
-		;;
-	    sun4)
-		echo sparc-sun-sunos${UNAME_RELEASE}
-		;;
-	esac
-	exit ;;
-    aushp:SunOS:*:*)
-	echo sparc-auspex-sunos${UNAME_RELEASE}
-	exit ;;
-    # The situation for MiNT is a little confusing.  The machine name
-    # can be virtually everything (everything which is not
-    # "atarist" or "atariste" at least should have a processor
-    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
-    # to the lowercase version "mint" (or "freemint").  Finally
-    # the system name "TOS" denotes a system which is actually not
-    # MiNT.  But MiNT is downward compatible to TOS, so this should
-    # be no problem.
-    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-	echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
-	echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-	echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-	echo m68k-milan-mint${UNAME_RELEASE}
-	exit ;;
-    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-	echo m68k-hades-mint${UNAME_RELEASE}
-	exit ;;
-    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-	echo m68k-unknown-mint${UNAME_RELEASE}
-	exit ;;
-    m68k:machten:*:*)
-	echo m68k-apple-machten${UNAME_RELEASE}
-	exit ;;
-    powerpc:machten:*:*)
-	echo powerpc-apple-machten${UNAME_RELEASE}
-	exit ;;
-    RISC*:Mach:*:*)
-	echo mips-dec-mach_bsd4.3
-	exit ;;
-    RISC*:ULTRIX:*:*)
-	echo mips-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    VAX*:ULTRIX*:*:*)
-	echo vax-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    2020:CLIX:*:* | 2430:CLIX:*:*)
-	echo clipper-intergraph-clix${UNAME_RELEASE}
-	exit ;;
-    mips:*:*:UMIPS | mips:*:*:RISCos)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-#ifdef __cplusplus
-#include <stdio.h>  /* for printf() prototype */
-	int main (int argc, char *argv[]) {
-#else
-	int main (argc, argv) int argc; char *argv[]; {
-#endif
-	#if defined (host_mips) && defined (MIPSEB)
-	#if defined (SYSTYPE_SYSV)
-	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_SVR4)
-	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
-	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
-	#endif
-	#endif
-	  exit (-1);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c &&
-	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
-	  SYSTEM_NAME=`$dummy $dummyarg` &&
-	    { echo "$SYSTEM_NAME"; exit; }
-	echo mips-mips-riscos${UNAME_RELEASE}
-	exit ;;
-    Motorola:PowerMAX_OS:*:*)
-	echo powerpc-motorola-powermax
-	exit ;;
-    Motorola:*:4.3:PL8-*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:Power_UNIX:*:*)
-	echo powerpc-harris-powerunix
-	exit ;;
-    m88k:CX/UX:7*:*)
-	echo m88k-harris-cxux7
-	exit ;;
-    m88k:*:4*:R4*)
-	echo m88k-motorola-sysv4
-	exit ;;
-    m88k:*:3*:R3*)
-	echo m88k-motorola-sysv3
-	exit ;;
-    AViiON:dgux:*:*)
-	# DG/UX returns AViiON for all architectures
-	UNAME_PROCESSOR=`/usr/bin/uname -p`
-	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
-	then
-	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
-	       [ ${TARGET_BINARY_INTERFACE}x = x ]
-	    then
-		echo m88k-dg-dgux${UNAME_RELEASE}
-	    else
-		echo m88k-dg-dguxbcs${UNAME_RELEASE}
-	    fi
-	else
-	    echo i586-dg-dgux${UNAME_RELEASE}
-	fi
-	exit ;;
-    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
-	echo m88k-dolphin-sysv3
-	exit ;;
-    M88*:*:R3*:*)
-	# Delta 88k system running SVR3
-	echo m88k-motorola-sysv3
-	exit ;;
-    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
-	echo m88k-tektronix-sysv3
-	exit ;;
-    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
-	echo m68k-tektronix-bsd
-	exit ;;
-    *:IRIX*:*:*)
-	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
-	exit ;;
-    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
-	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
-    i*86:AIX:*:*)
-	echo i386-ibm-aix
-	exit ;;
-    ia64:AIX:*:*)
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:2:3)
-	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
-		eval $set_cc_for_build
-		sed 's/^		//' << EOF >$dummy.c
-		#include <sys/systemcfg.h>
-
-		main()
-			{
-			if (!__power_pc())
-				exit(1);
-			puts("powerpc-ibm-aix3.2.5");
-			exit(0);
-			}
-EOF
-		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
-		then
-			echo "$SYSTEM_NAME"
-		else
-			echo rs6000-ibm-aix3.2.5
-		fi
-	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
-		echo rs6000-ibm-aix3.2.4
-	else
-		echo rs6000-ibm-aix3.2
-	fi
-	exit ;;
-    *:AIX:*:[4567])
-	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
-	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
-		IBM_ARCH=rs6000
-	else
-		IBM_ARCH=powerpc
-	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:*:*)
-	echo rs6000-ibm-aix
-	exit ;;
-    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
-	echo romp-ibm-bsd4.4
-	exit ;;
-    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
-	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
-	exit ;;                             # report: romp-ibm BSD 4.3
-    *:BOSX:*:*)
-	echo rs6000-bull-bosx
-	exit ;;
-    DPX/2?00:B.O.S.:*:*)
-	echo m68k-bull-sysv3
-	exit ;;
-    9000/[34]??:4.3bsd:1.*:*)
-	echo m68k-hp-bsd
-	exit ;;
-    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
-	echo m68k-hp-bsd4.4
-	exit ;;
-    9000/[34678]??:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	case "${UNAME_MACHINE}" in
-	    9000/31? )            HP_ARCH=m68000 ;;
-	    9000/[34]?? )         HP_ARCH=m68k ;;
-	    9000/[678][0-9][0-9])
-		if [ -x /usr/bin/getconf ]; then
-		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
-		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
-		    case "${sc_cpu_version}" in
-		      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
-		      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
-		      532)                      # CPU_PA_RISC2_0
-			case "${sc_kernel_bits}" in
-			  32) HP_ARCH="hppa2.0n" ;;
-			  64) HP_ARCH="hppa2.0w" ;;
-			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
-			esac ;;
-		    esac
-		fi
-		if [ "${HP_ARCH}" = "" ]; then
-		    eval $set_cc_for_build
-		    sed 's/^		//' << EOF >$dummy.c
-
-		#define _HPUX_SOURCE
-		#include <stdlib.h>
-		#include <unistd.h>
-
-		int main ()
-		{
-		#if defined(_SC_KERNEL_BITS)
-		    long bits = sysconf(_SC_KERNEL_BITS);
-		#endif
-		    long cpu  = sysconf (_SC_CPU_VERSION);
-
-		    switch (cpu)
-			{
-			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-			case CPU_PA_RISC2_0:
-		#if defined(_SC_KERNEL_BITS)
-			    switch (bits)
-				{
-				case 64: puts ("hppa2.0w"); break;
-				case 32: puts ("hppa2.0n"); break;
-				default: puts ("hppa2.0"); break;
-				} break;
-		#else  /* !defined(_SC_KERNEL_BITS) */
-			    puts ("hppa2.0"); break;
-		#endif
-			default: puts ("hppa1.0"); break;
-			}
-		    exit (0);
-		}
-EOF
-		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
-		    test -z "$HP_ARCH" && HP_ARCH=hppa
-		fi ;;
-	esac
-	if [ ${HP_ARCH} = "hppa2.0w" ]
-	then
-	    eval $set_cc_for_build
-
-	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
-	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
-	    # generating 64-bit code.  GNU and HP use different nomenclature:
-	    #
-	    # $ CC_FOR_BUILD=cc ./config.guess
-	    # => hppa2.0w-hp-hpux11.23
-	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
-	    # => hppa64-hp-hpux11.23
-
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
-		grep -q __LP64__
-	    then
-		HP_ARCH="hppa2.0w"
-	    else
-		HP_ARCH="hppa64"
-	    fi
-	fi
-	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
-	exit ;;
-    ia64:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	echo ia64-hp-hpux${HPUX_REV}
-	exit ;;
-    3050*:HI-UX:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <unistd.h>
-	int
-	main ()
-	{
-	  long cpu = sysconf (_SC_CPU_VERSION);
-	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
-	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
-	     results, however.  */
-	  if (CPU_IS_PA_RISC (cpu))
-	    {
-	      switch (cpu)
-		{
-		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
-		  default: puts ("hppa-hitachi-hiuxwe2"); break;
-		}
-	    }
-	  else if (CPU_IS_HP_MC68K (cpu))
-	    puts ("m68k-hitachi-hiuxwe2");
-	  else puts ("unknown-hitachi-hiuxwe2");
-	  exit (0);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
-		{ echo "$SYSTEM_NAME"; exit; }
-	echo unknown-hitachi-hiuxwe2
-	exit ;;
-    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
-	echo hppa1.1-hp-bsd
-	exit ;;
-    9000/8??:4.3bsd:*:*)
-	echo hppa1.0-hp-bsd
-	exit ;;
-    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
-	echo hppa1.0-hp-mpeix
-	exit ;;
-    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
-	echo hppa1.1-hp-osf
-	exit ;;
-    hp8??:OSF1:*:*)
-	echo hppa1.0-hp-osf
-	exit ;;
-    i*86:OSF1:*:*)
-	if [ -x /usr/sbin/sysversion ] ; then
-	    echo ${UNAME_MACHINE}-unknown-osf1mk
-	else
-	    echo ${UNAME_MACHINE}-unknown-osf1
-	fi
-	exit ;;
-    parisc*:Lites*:*:*)
-	echo hppa1.1-hp-lites
-	exit ;;
-    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
-	echo c1-convex-bsd
-	exit ;;
-    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
-	echo c34-convex-bsd
-	exit ;;
-    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
-	echo c38-convex-bsd
-	exit ;;
-    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
-	echo c4-convex-bsd
-	exit ;;
-    CRAY*Y-MP:*:*:*)
-	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*[A-Z]90:*:*:*)
-	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
-	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
-	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
-	      -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*TS:*:*:*)
-	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*T3E:*:*:*)
-	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*SV1:*:*:*)
-	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    *:UNICOS/mp:*:*)
-	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
-	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
-	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-	exit ;;
-    5000:UNIX_System_V:4.*:*)
-	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
-	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-	exit ;;
-    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
-	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
-	exit ;;
-    sparc*:BSD/OS:*:*)
-	echo sparc-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:BSD/OS:*:*)
-	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:FreeBSD:*:*)
-	UNAME_PROCESSOR=`/usr/bin/uname -p`
-	case ${UNAME_PROCESSOR} in
-	    amd64)
-		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    *)
-		echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	esac
-	exit ;;
-    i*:CYGWIN*:*)
-	echo ${UNAME_MACHINE}-pc-cygwin
-	exit ;;
-    *:MINGW*:*)
-	echo ${UNAME_MACHINE}-pc-mingw32
-	exit ;;
-    i*:MSYS*:*)
-	echo ${UNAME_MACHINE}-pc-msys
-	exit ;;
-    i*:windows32*:*)
-	# uname -m includes "-pc" on this system.
-	echo ${UNAME_MACHINE}-mingw32
-	exit ;;
-    i*:PW*:*)
-	echo ${UNAME_MACHINE}-pc-pw32
-	exit ;;
-    *:Interix*:*)
-	case ${UNAME_MACHINE} in
-	    x86)
-		echo i586-pc-interix${UNAME_RELEASE}
-		exit ;;
-	    authenticamd | genuineintel | EM64T)
-		echo x86_64-unknown-interix${UNAME_RELEASE}
-		exit ;;
-	    IA64)
-		echo ia64-unknown-interix${UNAME_RELEASE}
-		exit ;;
-	esac ;;
-    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
-	echo i${UNAME_MACHINE}-pc-mks
-	exit ;;
-    8664:Windows_NT:*)
-	echo x86_64-pc-mks
-	exit ;;
-    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
-	# UNAME_MACHINE based on the output of uname instead of i386?
-	echo i586-pc-interix
-	exit ;;
-    i*:UWIN*:*)
-	echo ${UNAME_MACHINE}-pc-uwin
-	exit ;;
-    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
-	echo x86_64-unknown-cygwin
-	exit ;;
-    p*:CYGWIN*:*)
-	echo powerpcle-unknown-cygwin
-	exit ;;
-    prep*:SunOS:5.*:*)
-	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    *:GNU:*:*)
-	# the GNU system
-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-	exit ;;
-    *:GNU/*:*:*)
-	# other systems with GNU libc and userland
-	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
-	exit ;;
-    i*86:Minix:*:*)
-	echo ${UNAME_MACHINE}-pc-minix
-	exit ;;
-    aarch64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    aarch64_be:Linux:*:*)
-	UNAME_MACHINE=aarch64_be
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    alpha:Linux:*:*)
-	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
-	  EV5)   UNAME_MACHINE=alphaev5 ;;
-	  EV56)  UNAME_MACHINE=alphaev56 ;;
-	  PCA56) UNAME_MACHINE=alphapca56 ;;
-	  PCA57) UNAME_MACHINE=alphapca56 ;;
-	  EV6)   UNAME_MACHINE=alphaev6 ;;
-	  EV67)  UNAME_MACHINE=alphaev67 ;;
-	  EV68*) UNAME_MACHINE=alphaev68 ;;
-	esac
-	objdump --private-headers /bin/sh | grep -q ld.so.1
-	if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    arm*:Linux:*:*)
-	eval $set_cc_for_build
-	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
-	    | grep -q __ARM_EABI__
-	then
-	    echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	else
-	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
-		| grep -q __ARM_PCS_VFP
-	    then
-		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
-	    else
-		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
-	    fi
-	fi
-	exit ;;
-    avr32*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    cris:Linux:*:*)
-	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
-	exit ;;
-    crisv32:Linux:*:*)
-	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
-	exit ;;
-    frv:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    hexagon:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    i*86:Linux:*:*)
-	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
-	exit ;;
-    ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    m32r*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    mips:Linux:*:* | mips64:Linux:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#undef CPU
-	#undef ${UNAME_MACHINE}
-	#undef ${UNAME_MACHINE}el
-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=${UNAME_MACHINE}el
-	#else
-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=${UNAME_MACHINE}
-	#else
-	CPU=
-	#endif
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
-	;;
-    or32:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    padre:Linux:*:*)
-	echo sparc-unknown-linux-${LIBC}
-	exit ;;
-    parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-${LIBC}
-	exit ;;
-    parisc:Linux:*:* | hppa:Linux:*:*)
-	# Look for CPU level
-	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-	  PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
-	  PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
-	  *)    echo hppa-unknown-linux-${LIBC} ;;
-	esac
-	exit ;;
-    ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-${LIBC}
-	exit ;;
-    ppc:Linux:*:*)
-	echo powerpc-unknown-linux-${LIBC}
-	exit ;;
-    s390:Linux:*:* | s390x:Linux:*:*)
-	echo ${UNAME_MACHINE}-ibm-linux
-	exit ;;
-    sh64*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    sh*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    tile*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    vax:Linux:*:*)
-	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
-	exit ;;
-    x86_64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    xtensa*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    i*86:DYNIX/ptx:4*:*)
-	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
-	# earlier versions are messed up and put the nodename in both
-	# sysname and nodename.
-	echo i386-sequent-sysv4
-	exit ;;
-    i*86:UNIX_SV:4.2MP:2.*)
-	# Unixware is an offshoot of SVR4, but it has its own version
-	# number series starting with 2...
-	# I am not positive that other SVR4 systems won't match this,
-	# I just have to hope.  -- rms.
-	# Use sysv4.2uw... so that sysv4* matches it.
-	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
-	exit ;;
-    i*86:OS/2:*:*)
-	# If we were able to find `uname', then EMX Unix compatibility
-	# is probably installed.
-	echo ${UNAME_MACHINE}-pc-os2-emx
-	exit ;;
-    i*86:XTS-300:*:STOP)
-	echo ${UNAME_MACHINE}-unknown-stop
-	exit ;;
-    i*86:atheos:*:*)
-	echo ${UNAME_MACHINE}-unknown-atheos
-	exit ;;
-    i*86:syllable:*:*)
-	echo ${UNAME_MACHINE}-pc-syllable
-	exit ;;
-    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
-	echo i386-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    i*86:*DOS:*:*)
-	echo ${UNAME_MACHINE}-pc-msdosdjgpp
-	exit ;;
-    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
-	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
-	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
-		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
-	else
-		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
-	fi
-	exit ;;
-    i*86:*:5:[678]*)
-	# UnixWare 7.x, OpenUNIX and OpenServer 6.
-	case `/bin/uname -X | grep "^Machine"` in
-	    *486*)	     UNAME_MACHINE=i486 ;;
-	    *Pentium)	     UNAME_MACHINE=i586 ;;
-	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
-	esac
-	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
-	exit ;;
-    i*86:*:3.2:*)
-	if test -f /usr/options/cb.name; then
-		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
-		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
-	elif /bin/uname -X 2>/dev/null >/dev/null ; then
-		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
-		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
-		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
-			&& UNAME_MACHINE=i586
-		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
-	else
-		echo ${UNAME_MACHINE}-pc-sysv32
-	fi
-	exit ;;
-    pc:*:*:*)
-	# Left here for compatibility:
-	# uname -m prints for DJGPP always 'pc', but it prints nothing about
-	# the processor, so we play safe by assuming i586.
-	# Note: whatever this is, it MUST be the same as what config.sub
-	# prints for the "djgpp" host, or else GDB configury will decide that
-	# this is a cross-build.
-	echo i586-pc-msdosdjgpp
-	exit ;;
-    Intel:Mach:3*:*)
-	echo i386-pc-mach3
-	exit ;;
-    paragon:*:*:*)
-	echo i860-intel-osf1
-	exit ;;
-    i860:*:4.*:*) # i860-SVR4
-	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
-	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
-	else # Add other i860-SVR4 vendors below as they are discovered.
-	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
-	fi
-	exit ;;
-    mini*:CTIX:SYS*5:*)
-	# "miniframe"
-	echo m68010-convergent-sysv
-	exit ;;
-    mc68k:UNIX:SYSTEM5:3.51m)
-	echo m68k-convergent-sysv
-	exit ;;
-    M680?0:D-NIX:5.3:*)
-	echo m68k-diab-dnix
-	exit ;;
-    M68*:*:R3V[5678]*:*)
-	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
-    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
-	OS_REL=''
-	test -r /etc/.relid \
-	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	  && { echo i486-ncr-sysv4; exit; } ;;
-    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
-	OS_REL='.3'
-	test -r /etc/.relid \
-	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
-	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
-	echo m68k-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    mc68030:UNIX_System_V:4.*:*)
-	echo m68k-atari-sysv4
-	exit ;;
-    TSUNAMI:LynxOS:2.*:*)
-	echo sparc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    rs6000:LynxOS:2.*:*)
-	echo rs6000-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
-	echo powerpc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    SM[BE]S:UNIX_SV:*:*)
-	echo mips-dde-sysv${UNAME_RELEASE}
-	exit ;;
-    RM*:ReliantUNIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    RM*:SINIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    *:SINIX-*:*:*)
-	if uname -p 2>/dev/null >/dev/null ; then
-		UNAME_MACHINE=`(uname -p) 2>/dev/null`
-		echo ${UNAME_MACHINE}-sni-sysv4
-	else
-		echo ns32k-sni-sysv
-	fi
-	exit ;;
-    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-			# says <Richard.M.Bartel at ccMail.Census.GOV>
-	echo i586-unisys-sysv4
-	exit ;;
-    *:UNIX_System_V:4*:FTX*)
-	# From Gerald Hewes <hewes at openmarket.com>.
-	# How about differentiating between stratus architectures? -djm
-	echo hppa1.1-stratus-sysv4
-	exit ;;
-    *:*:*:FTX*)
-	# From seanf at swdc.stratus.com.
-	echo i860-stratus-sysv4
-	exit ;;
-    i*86:VOS:*:*)
-	# From Paul.Green at stratus.com.
-	echo ${UNAME_MACHINE}-stratus-vos
-	exit ;;
-    *:VOS:*:*)
-	# From Paul.Green at stratus.com.
-	echo hppa1.1-stratus-vos
-	exit ;;
-    mc68*:A/UX:*:*)
-	echo m68k-apple-aux${UNAME_RELEASE}
-	exit ;;
-    news*:NEWS-OS:6*:*)
-	echo mips-sony-newsos6
-	exit ;;
-    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
-	if [ -d /usr/nec ]; then
-		echo mips-nec-sysv${UNAME_RELEASE}
-	else
-		echo mips-unknown-sysv${UNAME_RELEASE}
-	fi
-	exit ;;
-    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
-	echo powerpc-be-beos
-	exit ;;
-    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
-	echo powerpc-apple-beos
-	exit ;;
-    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
-	echo i586-pc-beos
-	exit ;;
-    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
-	echo i586-pc-haiku
-	exit ;;
-    SX-4:SUPER-UX:*:*)
-	echo sx4-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-5:SUPER-UX:*:*)
-	echo sx5-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-6:SUPER-UX:*:*)
-	echo sx6-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-7:SUPER-UX:*:*)
-	echo sx7-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-8:SUPER-UX:*:*)
-	echo sx8-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-8R:SUPER-UX:*:*)
-	echo sx8r-nec-superux${UNAME_RELEASE}
-	exit ;;
-    Power*:Rhapsody:*:*)
-	echo powerpc-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Rhapsody:*:*)
-	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Darwin:*:*)
-	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-	case $UNAME_PROCESSOR in
-	    i386)
-		eval $set_cc_for_build
-		if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
-		  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-		      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		      grep IS_64BIT_ARCH >/dev/null
-		  then
-		      UNAME_PROCESSOR="x86_64"
-		  fi
-		fi ;;
-	    unknown) UNAME_PROCESSOR=powerpc ;;
-	esac
-	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
-	exit ;;
-    *:procnto*:*:* | *:QNX:[0123456789]*:*)
-	UNAME_PROCESSOR=`uname -p`
-	if test "$UNAME_PROCESSOR" = "x86"; then
-		UNAME_PROCESSOR=i386
-		UNAME_MACHINE=pc
-	fi
-	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
-	exit ;;
-    *:QNX:*:4*)
-	echo i386-pc-qnx
-	exit ;;
-    NEO-?:NONSTOP_KERNEL:*:*)
-	echo neo-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    NSE-?:NONSTOP_KERNEL:*:*)
-	echo nse-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    NSR-?:NONSTOP_KERNEL:*:*)
-	echo nsr-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    *:NonStop-UX:*:*)
-	echo mips-compaq-nonstopux
-	exit ;;
-    BS2000:POSIX*:*:*)
-	echo bs2000-siemens-sysv
-	exit ;;
-    DS/*:UNIX_System_V:*:*)
-	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
-	exit ;;
-    *:Plan9:*:*)
-	# "uname -m" is not consistent, so use $cputype instead. 386
-	# is converted to i386 for consistency with other x86
-	# operating systems.
-	if test "$cputype" = "386"; then
-	    UNAME_MACHINE=i386
-	else
-	    UNAME_MACHINE="$cputype"
-	fi
-	echo ${UNAME_MACHINE}-unknown-plan9
-	exit ;;
-    *:TOPS-10:*:*)
-	echo pdp10-unknown-tops10
-	exit ;;
-    *:TENEX:*:*)
-	echo pdp10-unknown-tenex
-	exit ;;
-    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
-	echo pdp10-dec-tops20
-	exit ;;
-    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
-	echo pdp10-xkl-tops20
-	exit ;;
-    *:TOPS-20:*:*)
-	echo pdp10-unknown-tops20
-	exit ;;
-    *:ITS:*:*)
-	echo pdp10-unknown-its
-	exit ;;
-    SEI:*:*:SEIUX)
-	echo mips-sei-seiux${UNAME_RELEASE}
-	exit ;;
-    *:DragonFly:*:*)
-	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
-	exit ;;
-    *:*VMS:*:*)
-	UNAME_MACHINE=`(uname -p) 2>/dev/null`
-	case "${UNAME_MACHINE}" in
-	    A*) echo alpha-dec-vms ; exit ;;
-	    I*) echo ia64-dec-vms ; exit ;;
-	    V*) echo vax-dec-vms ; exit ;;
-	esac ;;
-    *:XENIX:*:SysV)
-	echo i386-pc-xenix
-	exit ;;
-    i*86:skyos:*:*)
-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
-	exit ;;
-    i*86:rdos:*:*)
-	echo ${UNAME_MACHINE}-pc-rdos
-	exit ;;
-    i*86:AROS:*:*)
-	echo ${UNAME_MACHINE}-pc-aros
-	exit ;;
-    x86_64:VMkernel:*:*)
-	echo ${UNAME_MACHINE}-unknown-esx
-	exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-	"4"
-#else
-	""
-#endif
-	); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
-	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    c34*)
-	echo c34-convex-bsd
-	exit ;;
-    c38*)
-	echo c38-convex-bsd
-	exit ;;
-    c4*)
-	echo c4-convex-bsd
-	exit ;;
-    esac
-fi
-
-cat >&2 <<EOF
-$0: unable to guess system type
-
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
-
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
-and
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches at gnu.org> in order to provide the needed
-information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
-
-hostinfo               = `(hostinfo) 2>/dev/null`
-/bin/universe          = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch              = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
-
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM  = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
-EOF
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/build-aux/config.sub b/build-aux/config.sub
deleted file mode 100755
index 42adc67..0000000
--- a/build-aux/config.sub
+++ /dev/null
@@ -1,1791 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-#   2011, 2012 Free Software Foundation, Inc.
-
-timestamp='2012-02-10'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# This file 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 2 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
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Please send patches to <config-patches at gnu.org>.  Submit a context
-# diff and a properly formatted GNU ChangeLog entry.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support.  The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches at gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help"
-       exit 1 ;;
-
-    *local*)
-       # First pass through any local machine types.
-       echo $1
-       exit ;;
-
-    * )
-       break ;;
-  esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
-    exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
-    exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
-  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
-  knetbsd*-gnu* | netbsd*-gnu* | \
-  kopensolaris*-gnu* | \
-  storm-chaos* | os2-emx* | rtmk-nova*)
-    os=-$maybe_os
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
-    ;;
-  android-linux)
-    os=-linux-android
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
-    ;;
-  *)
-    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
-    if [ $basic_machine != $1 ]
-    then os=`echo $1 | sed 's/.*-/-/'`
-    else os=; fi
-    ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work.  We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
-	-sun*os*)
-		# Prevent following clause from handling this invalid input.
-		;;
-	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis | -knuth | -cray | -microblaze)
-		os=
-		basic_machine=$1
-		;;
-	-bluegene*)
-		os=-cnk
-		;;
-	-sim | -cisco | -oki | -wec | -winbond)
-		os=
-		basic_machine=$1
-		;;
-	-scout)
-		;;
-	-wrs)
-		os=-vxworks
-		basic_machine=$1
-		;;
-	-chorusos*)
-		os=-chorusos
-		basic_machine=$1
-		;;
-	-chorusrdb)
-		os=-chorusrdb
-		basic_machine=$1
-		;;
-	-hiux*)
-		os=-hiuxwe2
-		;;
-	-sco6)
-		os=-sco5v6
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5)
-		os=-sco3.2v5
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco4)
-		os=-sco3.2v4
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2.[4-9]*)
-		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2v[4-9]*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5v6*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco*)
-		os=-sco3.2v2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-udk*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-isc)
-		os=-isc2.2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-clix*)
-		basic_machine=clipper-intergraph
-		;;
-	-isc*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-lynx*)
-		os=-lynxos
-		;;
-	-ptx*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
-		;;
-	-windowsnt*)
-		os=`echo $os | sed -e 's/windowsnt/winnt/'`
-		;;
-	-psos*)
-		os=-psos
-		;;
-	-mint | -mint[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
-	# Recognize the basic CPU types without company name.
-	# Some are omitted here because they have special meanings below.
-	1750a | 580 \
-	| a29k \
-	| aarch64 | aarch64_be \
-	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
-	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
-	| am33_2.0 \
-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
-        | be32 | be64 \
-	| bfin \
-	| c4x | clipper \
-	| d10v | d30v | dlx | dsp16xx | dvp \
-	| epiphany \
-	| fido | fr30 | frv \
-	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
-	| hexagon \
-	| i370 | i860 | i960 | ia64 \
-	| ip2k | iq2000 \
-	| le32 | le64 \
-	| lm32 \
-	| m32c | m32r | m32rle | m68000 | m68k | m88k \
-	| maxq | mb | microblaze | mcore | mep | metag \
-	| mips | mipsbe | mipseb | mipsel | mipsle \
-	| mips16 \
-	| mips64 | mips64el \
-	| mips64octeon | mips64octeonel \
-	| mips64orion | mips64orionel \
-	| mips64r5900 | mips64r5900el \
-	| mips64vr | mips64vrel \
-	| mips64vr4100 | mips64vr4100el \
-	| mips64vr4300 | mips64vr4300el \
-	| mips64vr5000 | mips64vr5000el \
-	| mips64vr5900 | mips64vr5900el \
-	| mipsisa32 | mipsisa32el \
-	| mipsisa32r2 | mipsisa32r2el \
-	| mipsisa64 | mipsisa64el \
-	| mipsisa64r2 | mipsisa64r2el \
-	| mipsisa64sb1 | mipsisa64sb1el \
-	| mipsisa64sr71k | mipsisa64sr71kel \
-	| mipstx39 | mipstx39el \
-	| mn10200 | mn10300 \
-	| moxie \
-	| mt \
-	| msp430 \
-	| nds32 | nds32le | nds32be \
-	| nios | nios2 \
-	| ns16k | ns32k \
-	| open8 \
-	| or32 \
-	| pdp10 | pdp11 | pj | pjl \
-	| powerpc | powerpc64 | powerpc64le | powerpcle \
-	| pyramid \
-	| rl78 | rx \
-	| score \
-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
-	| sh64 | sh64le \
-	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
-	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-	| spu \
-	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
-	| ubicom32 \
-	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
-	| we32k \
-	| x86 | xc16x | xstormy16 | xtensa \
-	| z8k | z80)
-		basic_machine=$basic_machine-unknown
-		;;
-	c54x)
-		basic_machine=tic54x-unknown
-		;;
-	c55x)
-		basic_machine=tic55x-unknown
-		;;
-	c6x)
-		basic_machine=tic6x-unknown
-		;;
-	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
-		basic_machine=$basic_machine-unknown
-		os=-none
-		;;
-	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
-		;;
-	ms1)
-		basic_machine=mt-unknown
-		;;
-
-	strongarm | thumb | xscale)
-		basic_machine=arm-unknown
-		;;
-	xgate)
-		basic_machine=$basic_machine-unknown
-		os=-none
-		;;
-	xscaleeb)
-		basic_machine=armeb-unknown
-		;;
-
-	xscaleel)
-		basic_machine=armel-unknown
-		;;
-
-	# We use `pc' rather than `unknown'
-	# because (1) that's what they normally are, and
-	# (2) the word "unknown" tends to confuse beginning users.
-	i*86 | x86_64)
-	  basic_machine=$basic_machine-pc
-	  ;;
-	# Object if more than one company name word.
-	*-*-*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-	# Recognize the basic CPU types with company name.
-	580-* \
-	| a29k-* \
-	| aarch64-* | aarch64_be-* \
-	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
-	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
-	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
-	| avr-* | avr32-* \
-	| be32-* | be64-* \
-	| bfin-* | bs2000-* \
-	| c[123]* | c30-* | [cjt]90-* | c4x-* \
-	| clipper-* | craynv-* | cydra-* \
-	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
-	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
-	| h8300-* | h8500-* \
-	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
-	| hexagon-* \
-	| i*86-* | i860-* | i960-* | ia64-* \
-	| ip2k-* | iq2000-* \
-	| le32-* | le64-* \
-	| lm32-* \
-	| m32c-* | m32r-* | m32rle-* \
-	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
-	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
-	| mips16-* \
-	| mips64-* | mips64el-* \
-	| mips64octeon-* | mips64octeonel-* \
-	| mips64orion-* | mips64orionel-* \
-	| mips64r5900-* | mips64r5900el-* \
-	| mips64vr-* | mips64vrel-* \
-	| mips64vr4100-* | mips64vr4100el-* \
-	| mips64vr4300-* | mips64vr4300el-* \
-	| mips64vr5000-* | mips64vr5000el-* \
-	| mips64vr5900-* | mips64vr5900el-* \
-	| mipsisa32-* | mipsisa32el-* \
-	| mipsisa32r2-* | mipsisa32r2el-* \
-	| mipsisa64-* | mipsisa64el-* \
-	| mipsisa64r2-* | mipsisa64r2el-* \
-	| mipsisa64sb1-* | mipsisa64sb1el-* \
-	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
-	| mipstx39-* | mipstx39el-* \
-	| mmix-* \
-	| mt-* \
-	| msp430-* \
-	| nds32-* | nds32le-* | nds32be-* \
-	| nios-* | nios2-* \
-	| none-* | np1-* | ns16k-* | ns32k-* \
-	| open8-* \
-	| orion-* \
-	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
-	| pyramid-* \
-	| rl78-* | romp-* | rs6000-* | rx-* \
-	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
-	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
-	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
-	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
-	| tahoe-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
-	| tile*-* \
-	| tron-* \
-	| ubicom32-* \
-	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
-	| vax-* \
-	| we32k-* \
-	| x86-* | x86_64-* | xc16x-* | xps100-* \
-	| xstormy16-* | xtensa*-* \
-	| ymp-* \
-	| z8k-* | z80-*)
-		;;
-	# Recognize the basic CPU types without company name, with glob match.
-	xtensa*)
-		basic_machine=$basic_machine-unknown
-		;;
-	# Recognize the various machine names and aliases which stand
-	# for a CPU type and a company and sometimes even an OS.
-	386bsd)
-		basic_machine=i386-unknown
-		os=-bsd
-		;;
-	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
-		basic_machine=m68000-att
-		;;
-	3b*)
-		basic_machine=we32k-att
-		;;
-	a29khif)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	abacus)
-		basic_machine=abacus-unknown
-		;;
-	adobe68k)
-		basic_machine=m68010-adobe
-		os=-scout
-		;;
-	alliant | fx80)
-		basic_machine=fx80-alliant
-		;;
-	altos | altos3068)
-		basic_machine=m68k-altos
-		;;
-	am29k)
-		basic_machine=a29k-none
-		os=-bsd
-		;;
-	amd64)
-		basic_machine=x86_64-pc
-		;;
-	amd64-*)
-		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	amdahl)
-		basic_machine=580-amdahl
-		os=-sysv
-		;;
-	amiga | amiga-*)
-		basic_machine=m68k-unknown
-		;;
-	amigaos | amigados)
-		basic_machine=m68k-unknown
-		os=-amigaos
-		;;
-	amigaunix | amix)
-		basic_machine=m68k-unknown
-		os=-sysv4
-		;;
-	apollo68)
-		basic_machine=m68k-apollo
-		os=-sysv
-		;;
-	apollo68bsd)
-		basic_machine=m68k-apollo
-		os=-bsd
-		;;
-	aros)
-		basic_machine=i386-pc
-		os=-aros
-		;;
-	aux)
-		basic_machine=m68k-apple
-		os=-aux
-		;;
-	balance)
-		basic_machine=ns32k-sequent
-		os=-dynix
-		;;
-	blackfin)
-		basic_machine=bfin-unknown
-		os=-linux
-		;;
-	blackfin-*)
-		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	bluegene*)
-		basic_machine=powerpc-ibm
-		os=-cnk
-		;;
-	c54x-*)
-		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c55x-*)
-		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c6x-*)
-		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c90)
-		basic_machine=c90-cray
-		os=-unicos
-		;;
-	cegcc)
-		basic_machine=arm-unknown
-		os=-cegcc
-		;;
-	convex-c1)
-		basic_machine=c1-convex
-		os=-bsd
-		;;
-	convex-c2)
-		basic_machine=c2-convex
-		os=-bsd
-		;;
-	convex-c32)
-		basic_machine=c32-convex
-		os=-bsd
-		;;
-	convex-c34)
-		basic_machine=c34-convex
-		os=-bsd
-		;;
-	convex-c38)
-		basic_machine=c38-convex
-		os=-bsd
-		;;
-	cray | j90)
-		basic_machine=j90-cray
-		os=-unicos
-		;;
-	craynv)
-		basic_machine=craynv-cray
-		os=-unicosmp
-		;;
-	cr16 | cr16-*)
-		basic_machine=cr16-unknown
-		os=-elf
-		;;
-	crds | unos)
-		basic_machine=m68k-crds
-		;;
-	crisv32 | crisv32-* | etraxfs*)
-		basic_machine=crisv32-axis
-		;;
-	cris | cris-* | etrax*)
-		basic_machine=cris-axis
-		;;
-	crx)
-		basic_machine=crx-unknown
-		os=-elf
-		;;
-	da30 | da30-*)
-		basic_machine=m68k-da30
-		;;
-	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
-		basic_machine=mips-dec
-		;;
-	decsystem10* | dec10*)
-		basic_machine=pdp10-dec
-		os=-tops10
-		;;
-	decsystem20* | dec20*)
-		basic_machine=pdp10-dec
-		os=-tops20
-		;;
-	delta | 3300 | motorola-3300 | motorola-delta \
-	      | 3300-motorola | delta-motorola)
-		basic_machine=m68k-motorola
-		;;
-	delta88)
-		basic_machine=m88k-motorola
-		os=-sysv3
-		;;
-	dicos)
-		basic_machine=i686-pc
-		os=-dicos
-		;;
-	djgpp)
-		basic_machine=i586-pc
-		os=-msdosdjgpp
-		;;
-	dpx20 | dpx20-*)
-		basic_machine=rs6000-bull
-		os=-bosx
-		;;
-	dpx2* | dpx2*-bull)
-		basic_machine=m68k-bull
-		os=-sysv3
-		;;
-	ebmon29k)
-		basic_machine=a29k-amd
-		os=-ebmon
-		;;
-	elxsi)
-		basic_machine=elxsi-elxsi
-		os=-bsd
-		;;
-	encore | umax | mmax)
-		basic_machine=ns32k-encore
-		;;
-	es1800 | OSE68k | ose68k | ose | OSE)
-		basic_machine=m68k-ericsson
-		os=-ose
-		;;
-	fx2800)
-		basic_machine=i860-alliant
-		;;
-	genix)
-		basic_machine=ns32k-ns
-		;;
-	gmicro)
-		basic_machine=tron-gmicro
-		os=-sysv
-		;;
-	go32)
-		basic_machine=i386-pc
-		os=-go32
-		;;
-	h3050r* | hiux*)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	h8300hms)
-		basic_machine=h8300-hitachi
-		os=-hms
-		;;
-	h8300xray)
-		basic_machine=h8300-hitachi
-		os=-xray
-		;;
-	h8500hms)
-		basic_machine=h8500-hitachi
-		os=-hms
-		;;
-	harris)
-		basic_machine=m88k-harris
-		os=-sysv3
-		;;
-	hp300-*)
-		basic_machine=m68k-hp
-		;;
-	hp300bsd)
-		basic_machine=m68k-hp
-		os=-bsd
-		;;
-	hp300hpux)
-		basic_machine=m68k-hp
-		os=-hpux
-		;;
-	hp3k9[0-9][0-9] | hp9[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k2[0-9][0-9] | hp9k31[0-9])
-		basic_machine=m68000-hp
-		;;
-	hp9k3[2-9][0-9])
-		basic_machine=m68k-hp
-		;;
-	hp9k6[0-9][0-9] | hp6[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k7[0-79][0-9] | hp7[0-79][0-9])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k78[0-9] | hp78[0-9])
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][13679] | hp8[0-9][13679])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][0-9] | hp8[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hppa-next)
-		os=-nextstep3
-		;;
-	hppaosf)
-		basic_machine=hppa1.1-hp
-		os=-osf
-		;;
-	hppro)
-		basic_machine=hppa1.1-hp
-		os=-proelf
-		;;
-	i370-ibm* | ibm*)
-		basic_machine=i370-ibm
-		;;
-	i*86v32)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv32
-		;;
-	i*86v4*)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv4
-		;;
-	i*86v)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv
-		;;
-	i*86sol2)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-solaris2
-		;;
-	i386mach)
-		basic_machine=i386-mach
-		os=-mach
-		;;
-	i386-vsta | vsta)
-		basic_machine=i386-unknown
-		os=-vsta
-		;;
-	iris | iris4d)
-		basic_machine=mips-sgi
-		case $os in
-		    -irix*)
-			;;
-		    *)
-			os=-irix4
-			;;
-		esac
-		;;
-	isi68 | isi)
-		basic_machine=m68k-isi
-		os=-sysv
-		;;
-	m68knommu)
-		basic_machine=m68k-unknown
-		os=-linux
-		;;
-	m68knommu-*)
-		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	m88k-omron*)
-		basic_machine=m88k-omron
-		;;
-	magnum | m3230)
-		basic_machine=mips-mips
-		os=-sysv
-		;;
-	merlin)
-		basic_machine=ns32k-utek
-		os=-sysv
-		;;
-	microblaze)
-		basic_machine=microblaze-xilinx
-		;;
-	mingw32)
-		basic_machine=i386-pc
-		os=-mingw32
-		;;
-	mingw32ce)
-		basic_machine=arm-unknown
-		os=-mingw32ce
-		;;
-	miniframe)
-		basic_machine=m68000-convergent
-		;;
-	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-	mipsEE* | ee | ps2)
-		basic_machine=mips64r5900el-scei
-		case $os in
-		    -linux*)
-			;;
-		    *)
-			os=-elf
-			;;
-		esac
-		;;
-	iop)
-		basic_machine=mipsel-scei
-		os=-irx
-		;;
-	dvp)
-		basic_machine=dvp-scei
-		os=-elf
-		;;
-	mips3*-*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
-		;;
-	mips3*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
-		;;
-	monitor)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	morphos)
-		basic_machine=powerpc-unknown
-		os=-morphos
-		;;
-	msdos)
-		basic_machine=i386-pc
-		os=-msdos
-		;;
-	ms1-*)
-		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
-		;;
-	msys)
-		basic_machine=i386-pc
-		os=-msys
-		;;
-	mvs)
-		basic_machine=i370-ibm
-		os=-mvs
-		;;
-	nacl)
-		basic_machine=le32-unknown
-		os=-nacl
-		;;
-	ncr3000)
-		basic_machine=i486-ncr
-		os=-sysv4
-		;;
-	netbsd386)
-		basic_machine=i386-unknown
-		os=-netbsd
-		;;
-	netwinder)
-		basic_machine=armv4l-rebel
-		os=-linux
-		;;
-	news | news700 | news800 | news900)
-		basic_machine=m68k-sony
-		os=-newsos
-		;;
-	news1000)
-		basic_machine=m68030-sony
-		os=-newsos
-		;;
-	news-3600 | risc-news)
-		basic_machine=mips-sony
-		os=-newsos
-		;;
-	necv70)
-		basic_machine=v70-nec
-		os=-sysv
-		;;
-	next | m*-next )
-		basic_machine=m68k-next
-		case $os in
-		    -nextstep* )
-			;;
-		    -ns2*)
-		      os=-nextstep2
-			;;
-		    *)
-		      os=-nextstep3
-			;;
-		esac
-		;;
-	nh3000)
-		basic_machine=m68k-harris
-		os=-cxux
-		;;
-	nh[45]000)
-		basic_machine=m88k-harris
-		os=-cxux
-		;;
-	nindy960)
-		basic_machine=i960-intel
-		os=-nindy
-		;;
-	mon960)
-		basic_machine=i960-intel
-		os=-mon960
-		;;
-	nonstopux)
-		basic_machine=mips-compaq
-		os=-nonstopux
-		;;
-	np1)
-		basic_machine=np1-gould
-		;;
-	neo-tandem)
-		basic_machine=neo-tandem
-		;;
-	nse-tandem)
-		basic_machine=nse-tandem
-		;;
-	nsr-tandem)
-		basic_machine=nsr-tandem
-		;;
-	op50n-* | op60c-*)
-		basic_machine=hppa1.1-oki
-		os=-proelf
-		;;
-	openrisc | openrisc-*)
-		basic_machine=or32-unknown
-		;;
-	os400)
-		basic_machine=powerpc-ibm
-		os=-os400
-		;;
-	OSE68000 | ose68000)
-		basic_machine=m68000-ericsson
-		os=-ose
-		;;
-	os68k)
-		basic_machine=m68k-none
-		os=-os68k
-		;;
-	pa-hitachi)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	paragon)
-		basic_machine=i860-intel
-		os=-osf
-		;;
-	parisc)
-		basic_machine=hppa-unknown
-		os=-linux
-		;;
-	parisc-*)
-		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	pbd)
-		basic_machine=sparc-tti
-		;;
-	pbb)
-		basic_machine=m68k-tti
-		;;
-	pc532 | pc532-*)
-		basic_machine=ns32k-pc532
-		;;
-	pc98)
-		basic_machine=i386-pc
-		;;
-	pc98-*)
-		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium | p5 | k5 | k6 | nexgen | viac3)
-		basic_machine=i586-pc
-		;;
-	pentiumpro | p6 | 6x86 | athlon | athlon_*)
-		basic_machine=i686-pc
-		;;
-	pentiumii | pentium2 | pentiumiii | pentium3)
-		basic_machine=i686-pc
-		;;
-	pentium4)
-		basic_machine=i786-pc
-		;;
-	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
-		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumpro-* | p6-* | 6x86-* | athlon-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium4-*)
-		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pn)
-		basic_machine=pn-gould
-		;;
-	power)	basic_machine=power-ibm
-		;;
-	ppc | ppcbe)	basic_machine=powerpc-unknown
-		;;
-	ppc-* | ppcbe-*)
-		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppcle | powerpclittle | ppc-le | powerpc-little)
-		basic_machine=powerpcle-unknown
-		;;
-	ppcle-* | powerpclittle-*)
-		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64)	basic_machine=powerpc64-unknown
-		;;
-	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
-		basic_machine=powerpc64le-unknown
-		;;
-	ppc64le-* | powerpc64little-*)
-		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ps2)
-		basic_machine=i386-ibm
-		;;
-	pw32)
-		basic_machine=i586-unknown
-		os=-pw32
-		;;
-	rdos)
-		basic_machine=i386-pc
-		os=-rdos
-		;;
-	rom68k)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	rm[46]00)
-		basic_machine=mips-siemens
-		;;
-	rtpc | rtpc-*)
-		basic_machine=romp-ibm
-		;;
-	s390 | s390-*)
-		basic_machine=s390-ibm
-		;;
-	s390x | s390x-*)
-		basic_machine=s390x-ibm
-		;;
-	sa29200)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	sb1)
-		basic_machine=mipsisa64sb1-unknown
-		;;
-	sb1el)
-		basic_machine=mipsisa64sb1el-unknown
-		;;
-	sde)
-		basic_machine=mipsisa32-sde
-		os=-elf
-		;;
-	sei)
-		basic_machine=mips-sei
-		os=-seiux
-		;;
-	sequent)
-		basic_machine=i386-sequent
-		;;
-	sh)
-		basic_machine=sh-hitachi
-		os=-hms
-		;;
-	sh5el)
-		basic_machine=sh5le-unknown
-		;;
-	sh64)
-		basic_machine=sh64-unknown
-		;;
-	sparclite-wrs | simso-wrs)
-		basic_machine=sparclite-wrs
-		os=-vxworks
-		;;
-	sps7)
-		basic_machine=m68k-bull
-		os=-sysv2
-		;;
-	spur)
-		basic_machine=spur-unknown
-		;;
-	st2000)
-		basic_machine=m68k-tandem
-		;;
-	stratus)
-		basic_machine=i860-stratus
-		os=-sysv4
-		;;
-	strongarm-* | thumb-*)
-		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	sun2)
-		basic_machine=m68000-sun
-		;;
-	sun2os3)
-		basic_machine=m68000-sun
-		os=-sunos3
-		;;
-	sun2os4)
-		basic_machine=m68000-sun
-		os=-sunos4
-		;;
-	sun3os3)
-		basic_machine=m68k-sun
-		os=-sunos3
-		;;
-	sun3os4)
-		basic_machine=m68k-sun
-		os=-sunos4
-		;;
-	sun4os3)
-		basic_machine=sparc-sun
-		os=-sunos3
-		;;
-	sun4os4)
-		basic_machine=sparc-sun
-		os=-sunos4
-		;;
-	sun4sol2)
-		basic_machine=sparc-sun
-		os=-solaris2
-		;;
-	sun3 | sun3-*)
-		basic_machine=m68k-sun
-		;;
-	sun4)
-		basic_machine=sparc-sun
-		;;
-	sun386 | sun386i | roadrunner)
-		basic_machine=i386-sun
-		;;
-	sv1)
-		basic_machine=sv1-cray
-		os=-unicos
-		;;
-	symmetry)
-		basic_machine=i386-sequent
-		os=-dynix
-		;;
-	t3e)
-		basic_machine=alphaev5-cray
-		os=-unicos
-		;;
-	t90)
-		basic_machine=t90-cray
-		os=-unicos
-		;;
-	tile*)
-		basic_machine=$basic_machine-unknown
-		os=-linux-gnu
-		;;
-	tx39)
-		basic_machine=mipstx39-unknown
-		;;
-	tx39el)
-		basic_machine=mipstx39el-unknown
-		;;
-	toad1)
-		basic_machine=pdp10-xkl
-		os=-tops20
-		;;
-	tower | tower-32)
-		basic_machine=m68k-ncr
-		;;
-	tpf)
-		basic_machine=s390x-ibm
-		os=-tpf
-		;;
-	udi29k)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	ultra3)
-		basic_machine=a29k-nyu
-		os=-sym1
-		;;
-	v810 | necv810)
-		basic_machine=v810-nec
-		os=-none
-		;;
-	vaxv)
-		basic_machine=vax-dec
-		os=-sysv
-		;;
-	vms)
-		basic_machine=vax-dec
-		os=-vms
-		;;
-	vpp*|vx|vx-*)
-		basic_machine=f301-fujitsu
-		;;
-	vxworks960)
-		basic_machine=i960-wrs
-		os=-vxworks
-		;;
-	vxworks68)
-		basic_machine=m68k-wrs
-		os=-vxworks
-		;;
-	vxworks29k)
-		basic_machine=a29k-wrs
-		os=-vxworks
-		;;
-	w65*)
-		basic_machine=w65-wdc
-		os=-none
-		;;
-	w89k-*)
-		basic_machine=hppa1.1-winbond
-		os=-proelf
-		;;
-	xbox)
-		basic_machine=i686-pc
-		os=-mingw32
-		;;
-	xps | xps100)
-		basic_machine=xps100-honeywell
-		;;
-	xscale-* | xscalee[bl]-*)
-		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
-		;;
-	ymp)
-		basic_machine=ymp-cray
-		os=-unicos
-		;;
-	z8k-*-coff)
-		basic_machine=z8k-unknown
-		os=-sim
-		;;
-	z80-*-coff)
-		basic_machine=z80-unknown
-		os=-sim
-		;;
-	none)
-		basic_machine=none-none
-		os=-none
-		;;
-
-# Here we handle the default manufacturer of certain CPU types.  It is in
-# some cases the only manufacturer, in others, it is the most popular.
-	w89k)
-		basic_machine=hppa1.1-winbond
-		;;
-	op50n)
-		basic_machine=hppa1.1-oki
-		;;
-	op60c)
-		basic_machine=hppa1.1-oki
-		;;
-	romp)
-		basic_machine=romp-ibm
-		;;
-	mmix)
-		basic_machine=mmix-knuth
-		;;
-	rs6000)
-		basic_machine=rs6000-ibm
-		;;
-	vax)
-		basic_machine=vax-dec
-		;;
-	pdp10)
-		# there are many clones, so DEC is not a safe bet
-		basic_machine=pdp10-unknown
-		;;
-	pdp11)
-		basic_machine=pdp11-dec
-		;;
-	we32k)
-		basic_machine=we32k-att
-		;;
-	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
-		basic_machine=sh-unknown
-		;;
-	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
-		basic_machine=sparc-sun
-		;;
-	cydra)
-		basic_machine=cydra-cydrome
-		;;
-	orion)
-		basic_machine=orion-highlevel
-		;;
-	orion105)
-		basic_machine=clipper-highlevel
-		;;
-	mac | mpw | mac-mpw)
-		basic_machine=m68k-apple
-		;;
-	pmac | pmac-mpw)
-		basic_machine=powerpc-apple
-		;;
-	*-unknown)
-		# Make sure to match an already-canonicalized machine name.
-		;;
-	*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
-	*-digital*)
-		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
-		;;
-	*-commodore*)
-		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
-		;;
-	*)
-		;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
-	# First match some system type aliases
-	# that might get confused with valid system types.
-	# -solaris* is a basic system type, with this one exception.
-	-auroraux)
-		os=-auroraux
-		;;
-	-solaris1 | -solaris1.*)
-		os=`echo $os | sed -e 's|solaris1|sunos4|'`
-		;;
-	-solaris)
-		os=-solaris2
-		;;
-	-svr4*)
-		os=-sysv4
-		;;
-	-unixware*)
-		os=-sysv4.2uw
-		;;
-	-gnu/linux*)
-		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
-		;;
-	# First accept the basic system types.
-	# The portable systems comes first.
-	# Each alternative MUST END IN A *, to match a version number.
-	# -sysv* is not here because it comes later, after sysvr4.
-	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
-	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
-	      | -sym* | -kopensolaris* \
-	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* | -aros* \
-	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
-	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
-	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -openbsd* | -solidbsd* \
-	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
-	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
-	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
-	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-	      | -chorusos* | -chorusrdb* | -cegcc* \
-	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -linux-android* \
-	      | -linux-newlib* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
-	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
-	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
-	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* | -irx* \
-	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
-	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
-	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
-	# Remember, each alternative MUST END IN *, to match a version number.
-		;;
-	-qnx*)
-		case $basic_machine in
-		    x86-* | i*86-*)
-			;;
-		    *)
-			os=-nto$os
-			;;
-		esac
-		;;
-	-nto-qnx*)
-		;;
-	-nto*)
-		os=`echo $os | sed -e 's|nto|nto-qnx|'`
-		;;
-	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
-	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
-	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
-		;;
-	-mac*)
-		os=`echo $os | sed -e 's|mac|macos|'`
-		;;
-	-linux-dietlibc)
-		os=-linux-dietlibc
-		;;
-	-linux*)
-		os=`echo $os | sed -e 's|linux|linux-gnu|'`
-		;;
-	-sunos5*)
-		os=`echo $os | sed -e 's|sunos5|solaris2|'`
-		;;
-	-sunos6*)
-		os=`echo $os | sed -e 's|sunos6|solaris3|'`
-		;;
-	-opened*)
-		os=-openedition
-		;;
-	-os400*)
-		os=-os400
-		;;
-	-wince*)
-		os=-wince
-		;;
-	-osfrose*)
-		os=-osfrose
-		;;
-	-osf*)
-		os=-osf
-		;;
-	-utek*)
-		os=-bsd
-		;;
-	-dynix*)
-		os=-bsd
-		;;
-	-acis*)
-		os=-aos
-		;;
-	-atheos*)
-		os=-atheos
-		;;
-	-syllable*)
-		os=-syllable
-		;;
-	-386bsd)
-		os=-bsd
-		;;
-	-ctix* | -uts*)
-		os=-sysv
-		;;
-	-nova*)
-		os=-rtmk-nova
-		;;
-	-ns2 )
-		os=-nextstep2
-		;;
-	-nsk*)
-		os=-nsk
-		;;
-	# Preserve the version number of sinix5.
-	-sinix5.*)
-		os=`echo $os | sed -e 's|sinix|sysv|'`
-		;;
-	-sinix*)
-		os=-sysv4
-		;;
-	-tpf*)
-		os=-tpf
-		;;
-	-triton*)
-		os=-sysv3
-		;;
-	-oss*)
-		os=-sysv3
-		;;
-	-svr4)
-		os=-sysv4
-		;;
-	-svr3)
-		os=-sysv3
-		;;
-	-sysvr4)
-		os=-sysv4
-		;;
-	# This must come after -sysvr4.
-	-sysv*)
-		;;
-	-ose*)
-		os=-ose
-		;;
-	-es1800*)
-		os=-ose
-		;;
-	-xenix)
-		os=-xenix
-		;;
-	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-		os=-mint
-		;;
-	-aros*)
-		os=-aros
-		;;
-	-kaos*)
-		os=-kaos
-		;;
-	-zvmoe)
-		os=-zvmoe
-		;;
-	-dicos*)
-		os=-dicos
-		;;
-	-nacl*)
-		;;
-	-none)
-		;;
-	*)
-		# Get rid of the `-' at the beginning of $os.
-		os=`echo $os | sed 's/[^-]*-//'`
-		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
-		exit 1
-		;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system.  Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
-	score-*)
-		os=-elf
-		;;
-	spu-*)
-		os=-elf
-		;;
-	*-acorn)
-		os=-riscix1.2
-		;;
-	arm*-rebel)
-		os=-linux
-		;;
-	arm*-semi)
-		os=-aout
-		;;
-	c4x-* | tic4x-*)
-		os=-coff
-		;;
-	tic54x-*)
-		os=-coff
-		;;
-	tic55x-*)
-		os=-coff
-		;;
-	tic6x-*)
-		os=-coff
-		;;
-	# This must come before the *-dec entry.
-	pdp10-*)
-		os=-tops20
-		;;
-	pdp11-*)
-		os=-none
-		;;
-	*-dec | vax-*)
-		os=-ultrix4.2
-		;;
-	m68*-apollo)
-		os=-domain
-		;;
-	i386-sun)
-		os=-sunos4.0.2
-		;;
-	m68000-sun)
-		os=-sunos3
-		;;
-	m68*-cisco)
-		os=-aout
-		;;
-	mep-*)
-		os=-elf
-		;;
-	mips*-cisco)
-		os=-elf
-		;;
-	mips*-*)
-		os=-elf
-		;;
-	or32-*)
-		os=-coff
-		;;
-	*-tti)	# must be before sparc entry or we get the wrong os.
-		os=-sysv3
-		;;
-	sparc-* | *-sun)
-		os=-sunos4.1.1
-		;;
-	*-be)
-		os=-beos
-		;;
-	*-haiku)
-		os=-haiku
-		;;
-	*-ibm)
-		os=-aix
-		;;
-	*-knuth)
-		os=-mmixware
-		;;
-	*-wec)
-		os=-proelf
-		;;
-	*-winbond)
-		os=-proelf
-		;;
-	*-oki)
-		os=-proelf
-		;;
-	*-hp)
-		os=-hpux
-		;;
-	*-hitachi)
-		os=-hiux
-		;;
-	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
-		os=-sysv
-		;;
-	*-cbm)
-		os=-amigaos
-		;;
-	*-dg)
-		os=-dgux
-		;;
-	*-dolphin)
-		os=-sysv3
-		;;
-	m68k-ccur)
-		os=-rtu
-		;;
-	m88k-omron*)
-		os=-luna
-		;;
-	*-next )
-		os=-nextstep
-		;;
-	*-sequent)
-		os=-ptx
-		;;
-	*-crds)
-		os=-unos
-		;;
-	*-ns)
-		os=-genix
-		;;
-	i370-*)
-		os=-mvs
-		;;
-	*-next)
-		os=-nextstep3
-		;;
-	*-gould)
-		os=-sysv
-		;;
-	*-highlevel)
-		os=-bsd
-		;;
-	*-encore)
-		os=-bsd
-		;;
-	*-sgi)
-		os=-irix
-		;;
-	*-siemens)
-		os=-sysv4
-		;;
-	*-masscomp)
-		os=-rtu
-		;;
-	f30[01]-fujitsu | f700-fujitsu)
-		os=-uxpv
-		;;
-	*-rom68k)
-		os=-coff
-		;;
-	*-*bug)
-		os=-coff
-		;;
-	*-apple)
-		os=-macos
-		;;
-	*-atari*)
-		os=-mint
-		;;
-	*)
-		os=-none
-		;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer.  We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
-	*-unknown)
-		case $os in
-			-riscix*)
-				vendor=acorn
-				;;
-			-sunos*)
-				vendor=sun
-				;;
-			-cnk*|-aix*)
-				vendor=ibm
-				;;
-			-beos*)
-				vendor=be
-				;;
-			-hpux*)
-				vendor=hp
-				;;
-			-mpeix*)
-				vendor=hp
-				;;
-			-hiux*)
-				vendor=hitachi
-				;;
-			-unos*)
-				vendor=crds
-				;;
-			-dgux*)
-				vendor=dg
-				;;
-			-luna*)
-				vendor=omron
-				;;
-			-genix*)
-				vendor=ns
-				;;
-			-mvs* | -opened*)
-				vendor=ibm
-				;;
-			-os400*)
-				vendor=ibm
-				;;
-			-ptx*)
-				vendor=sequent
-				;;
-			-tpf*)
-				vendor=ibm
-				;;
-			-vxsim* | -vxworks* | -windiss*)
-				vendor=wrs
-				;;
-			-aux*)
-				vendor=apple
-				;;
-			-hms*)
-				vendor=hitachi
-				;;
-			-mpw* | -macos*)
-				vendor=apple
-				;;
-			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-				vendor=atari
-				;;
-			-vos*)
-				vendor=stratus
-				;;
-		esac
-		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
-		;;
-esac
-
-echo $basic_machine$os
-exit
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/build-aux/install-sh b/build-aux/install-sh
deleted file mode 100755
index a9244eb..0000000
--- a/build-aux/install-sh
+++ /dev/null
@@ -1,527 +0,0 @@
-#!/bin/sh
-# install - install a program, script, or datafile
-
-scriptversion=2011-01-19.21; # UTC
-
-# This originates from X11R5 (mit/util/scripts/install.sh), which was
-# later released in X11R6 (xc/config/util/install.sh) with the
-# following copyright and license.
-#
-# Copyright (C) 1994 X Consortium
-#
-# 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.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
-# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-# Except as contained in this notice, the name of the X Consortium shall not
-# be used in advertising or otherwise to promote the sale, use or other deal-
-# ings in this Software without prior written authorization from the X Consor-
-# tium.
-#
-#
-# FSF changes to this file are in the public domain.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.
-
-nl='
-'
-IFS=" ""	$nl"
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit=${DOITPROG-}
-if test -z "$doit"; then
-  doit_exec=exec
-else
-  doit_exec=$doit
-fi
-
-# Put in absolute file names if you don't have them in your path;
-# or use environment vars.
-
-chgrpprog=${CHGRPPROG-chgrp}
-chmodprog=${CHMODPROG-chmod}
-chownprog=${CHOWNPROG-chown}
-cmpprog=${CMPPROG-cmp}
-cpprog=${CPPROG-cp}
-mkdirprog=${MKDIRPROG-mkdir}
-mvprog=${MVPROG-mv}
-rmprog=${RMPROG-rm}
-stripprog=${STRIPPROG-strip}
-
-posix_glob='?'
-initialize_posix_glob='
-  test "$posix_glob" != "?" || {
-    if (set -f) 2>/dev/null; then
-      posix_glob=
-    else
-      posix_glob=:
-    fi
-  }
-'
-
-posix_mkdir=
-
-# Desired mode of installed file.
-mode=0755
-
-chgrpcmd=
-chmodcmd=$chmodprog
-chowncmd=
-mvcmd=$mvprog
-rmcmd="$rmprog -f"
-stripcmd=
-
-src=
-dst=
-dir_arg=
-dst_arg=
-
-copy_on_change=false
-no_target_directory=
-
-usage="\
-Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
-   or: $0 [OPTION]... SRCFILES... DIRECTORY
-   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
-   or: $0 [OPTION]... -d DIRECTORIES...
-
-In the 1st form, copy SRCFILE to DSTFILE.
-In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
-In the 4th, create DIRECTORIES.
-
-Options:
-     --help     display this help and exit.
-     --version  display version info and exit.
-
-  -c            (ignored)
-  -C            install only if different (preserve the last data modification time)
-  -d            create directories instead of installing files.
-  -g GROUP      $chgrpprog installed files to GROUP.
-  -m MODE       $chmodprog installed files to MODE.
-  -o USER       $chownprog installed files to USER.
-  -s            $stripprog installed files.
-  -t DIRECTORY  install into DIRECTORY.
-  -T            report an error if DSTFILE is a directory.
-
-Environment variables override the default commands:
-  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
-  RMPROG STRIPPROG
-"
-
-while test $# -ne 0; do
-  case $1 in
-    -c) ;;
-
-    -C) copy_on_change=true;;
-
-    -d) dir_arg=true;;
-
-    -g) chgrpcmd="$chgrpprog $2"
-	shift;;
-
-    --help) echo "$usage"; exit $?;;
-
-    -m) mode=$2
-	case $mode in
-	  *' '* | *'	'* | *'
-'*	  | *'*'* | *'?'* | *'['*)
-	    echo "$0: invalid mode: $mode" >&2
-	    exit 1;;
-	esac
-	shift;;
-
-    -o) chowncmd="$chownprog $2"
-	shift;;
-
-    -s) stripcmd=$stripprog;;
-
-    -t) dst_arg=$2
-	# Protect names problematic for `test' and other utilities.
-	case $dst_arg in
-	  -* | [=\(\)!]) dst_arg=./$dst_arg;;
-	esac
-	shift;;
-
-    -T) no_target_directory=true;;
-
-    --version) echo "$0 $scriptversion"; exit $?;;
-
-    --)	shift
-	break;;
-
-    -*)	echo "$0: invalid option: $1" >&2
-	exit 1;;
-
-    *)  break;;
-  esac
-  shift
-done
-
-if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
-  # When -d is used, all remaining arguments are directories to create.
-  # When -t is used, the destination is already specified.
-  # Otherwise, the last argument is the destination.  Remove it from $@.
-  for arg
-  do
-    if test -n "$dst_arg"; then
-      # $@ is not empty: it contains at least $arg.
-      set fnord "$@" "$dst_arg"
-      shift # fnord
-    fi
-    shift # arg
-    dst_arg=$arg
-    # Protect names problematic for `test' and other utilities.
-    case $dst_arg in
-      -* | [=\(\)!]) dst_arg=./$dst_arg;;
-    esac
-  done
-fi
-
-if test $# -eq 0; then
-  if test -z "$dir_arg"; then
-    echo "$0: no input file specified." >&2
-    exit 1
-  fi
-  # It's OK to call `install-sh -d' without argument.
-  # This can happen when creating conditional directories.
-  exit 0
-fi
-
-if test -z "$dir_arg"; then
-  do_exit='(exit $ret); exit $ret'
-  trap "ret=129; $do_exit" 1
-  trap "ret=130; $do_exit" 2
-  trap "ret=141; $do_exit" 13
-  trap "ret=143; $do_exit" 15
-
-  # Set umask so as not to create temps with too-generous modes.
-  # However, 'strip' requires both read and write access to temps.
-  case $mode in
-    # Optimize common cases.
-    *644) cp_umask=133;;
-    *755) cp_umask=22;;
-
-    *[0-7])
-      if test -z "$stripcmd"; then
-	u_plus_rw=
-      else
-	u_plus_rw='% 200'
-      fi
-      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
-    *)
-      if test -z "$stripcmd"; then
-	u_plus_rw=
-      else
-	u_plus_rw=,u+rw
-      fi
-      cp_umask=$mode$u_plus_rw;;
-  esac
-fi
-
-for src
-do
-  # Protect names problematic for `test' and other utilities.
-  case $src in
-    -* | [=\(\)!]) src=./$src;;
-  esac
-
-  if test -n "$dir_arg"; then
-    dst=$src
-    dstdir=$dst
-    test -d "$dstdir"
-    dstdir_status=$?
-  else
-
-    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
-    # might cause directories to be created, which would be especially bad
-    # if $src (and thus $dsttmp) contains '*'.
-    if test ! -f "$src" && test ! -d "$src"; then
-      echo "$0: $src does not exist." >&2
-      exit 1
-    fi
-
-    if test -z "$dst_arg"; then
-      echo "$0: no destination specified." >&2
-      exit 1
-    fi
-    dst=$dst_arg
-
-    # If destination is a directory, append the input filename; won't work
-    # if double slashes aren't ignored.
-    if test -d "$dst"; then
-      if test -n "$no_target_directory"; then
-	echo "$0: $dst_arg: Is a directory" >&2
-	exit 1
-      fi
-      dstdir=$dst
-      dst=$dstdir/`basename "$src"`
-      dstdir_status=0
-    else
-      # Prefer dirname, but fall back on a substitute if dirname fails.
-      dstdir=`
-	(dirname "$dst") 2>/dev/null ||
-	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	     X"$dst" : 'X\(//\)[^/]' \| \
-	     X"$dst" : 'X\(//\)$' \| \
-	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
-	echo X"$dst" |
-	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)[^/].*/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\).*/{
-		   s//\1/
-		   q
-		 }
-		 s/.*/./; q'
-      `
-
-      test -d "$dstdir"
-      dstdir_status=$?
-    fi
-  fi
-
-  obsolete_mkdir_used=false
-
-  if test $dstdir_status != 0; then
-    case $posix_mkdir in
-      '')
-	# Create intermediate dirs using mode 755 as modified by the umask.
-	# This is like FreeBSD 'install' as of 1997-10-28.
-	umask=`umask`
-	case $stripcmd.$umask in
-	  # Optimize common cases.
-	  *[2367][2367]) mkdir_umask=$umask;;
-	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
-	  *[0-7])
-	    mkdir_umask=`expr $umask + 22 \
-	      - $umask % 100 % 40 + $umask % 20 \
-	      - $umask % 10 % 4 + $umask % 2
-	    `;;
-	  *) mkdir_umask=$umask,go-w;;
-	esac
-
-	# With -d, create the new directory with the user-specified mode.
-	# Otherwise, rely on $mkdir_umask.
-	if test -n "$dir_arg"; then
-	  mkdir_mode=-m$mode
-	else
-	  mkdir_mode=
-	fi
-
-	posix_mkdir=false
-	case $umask in
-	  *[123567][0-7][0-7])
-	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
-	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-	    ;;
-	  *)
-	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-	    if (umask $mkdir_umask &&
-		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
-	    then
-	      if test -z "$dir_arg" || {
-		   # Check for POSIX incompatibilities with -m.
-		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-		   # other-writeable bit of parent directory when it shouldn't.
-		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
-		   case $ls_ld_tmpdir in
-		     d????-?r-*) different_mode=700;;
-		     d????-?--*) different_mode=755;;
-		     *) false;;
-		   esac &&
-		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
-		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
-		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-		   }
-		 }
-	      then posix_mkdir=:
-	      fi
-	      rmdir "$tmpdir/d" "$tmpdir"
-	    else
-	      # Remove any dirs left behind by ancient mkdir implementations.
-	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
-	    fi
-	    trap '' 0;;
-	esac;;
-    esac
-
-    if
-      $posix_mkdir && (
-	umask $mkdir_umask &&
-	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
-      )
-    then :
-    else
-
-      # The umask is ridiculous, or mkdir does not conform to POSIX,
-      # or it failed possibly due to a race condition.  Create the
-      # directory the slow way, step by step, checking for races as we go.
-
-      case $dstdir in
-	/*) prefix='/';;
-	[-=\(\)!]*) prefix='./';;
-	*)  prefix='';;
-      esac
-
-      eval "$initialize_posix_glob"
-
-      oIFS=$IFS
-      IFS=/
-      $posix_glob set -f
-      set fnord $dstdir
-      shift
-      $posix_glob set +f
-      IFS=$oIFS
-
-      prefixes=
-
-      for d
-      do
-	test X"$d" = X && continue
-
-	prefix=$prefix$d
-	if test -d "$prefix"; then
-	  prefixes=
-	else
-	  if $posix_mkdir; then
-	    (umask=$mkdir_umask &&
-	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-	    # Don't fail if two instances are running concurrently.
-	    test -d "$prefix" || exit 1
-	  else
-	    case $prefix in
-	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-	      *) qprefix=$prefix;;
-	    esac
-	    prefixes="$prefixes '$qprefix'"
-	  fi
-	fi
-	prefix=$prefix/
-      done
-
-      if test -n "$prefixes"; then
-	# Don't fail if two instances are running concurrently.
-	(umask $mkdir_umask &&
-	 eval "\$doit_exec \$mkdirprog $prefixes") ||
-	  test -d "$dstdir" || exit 1
-	obsolete_mkdir_used=true
-      fi
-    fi
-  fi
-
-  if test -n "$dir_arg"; then
-    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
-    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
-      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
-  else
-
-    # Make a couple of temp file names in the proper directory.
-    dsttmp=$dstdir/_inst.$$_
-    rmtmp=$dstdir/_rm.$$_
-
-    # Trap to clean up those temp files at exit.
-    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
-
-    # Copy the file name to the temp name.
-    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
-
-    # and set any options; do chmod last to preserve setuid bits.
-    #
-    # If any of these fail, we abort the whole thing.  If we want to
-    # ignore errors from any of these, just make sure not to ignore
-    # errors from the above "$doit $cpprog $src $dsttmp" command.
-    #
-    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
-    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
-    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
-
-    # If -C, don't bother to copy if it wouldn't change the file.
-    if $copy_on_change &&
-       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
-       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
-
-       eval "$initialize_posix_glob" &&
-       $posix_glob set -f &&
-       set X $old && old=:$2:$4:$5:$6 &&
-       set X $new && new=:$2:$4:$5:$6 &&
-       $posix_glob set +f &&
-
-       test "$old" = "$new" &&
-       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
-    then
-      rm -f "$dsttmp"
-    else
-      # Rename the file to the real destination.
-      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
-
-      # The rename failed, perhaps because mv can't rename something else
-      # to itself, or perhaps because mv is so ancient that it does not
-      # support -f.
-      {
-	# Now remove or move aside any old file at destination location.
-	# We try this two ways since rm can't unlink itself on some
-	# systems and the destination file might be busy for other
-	# reasons.  In this case, the final cleanup might fail but the new
-	# file should still install successfully.
-	{
-	  test ! -f "$dst" ||
-	  $doit $rmcmd -f "$dst" 2>/dev/null ||
-	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
-	  } ||
-	  { echo "$0: cannot unlink or rename $dst" >&2
-	    (exit 1); exit 1
-	  }
-	} &&
-
-	# Now rename the file to the real destination.
-	$doit $mvcmd "$dsttmp" "$dst"
-      }
-    fi || exit 1
-
-    trap '' 0
-  fi
-done
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/build-aux/ltmain.sh b/build-aux/ltmain.sh
deleted file mode 100644
index 63ae69d..0000000
--- a/build-aux/ltmain.sh
+++ /dev/null
@@ -1,9655 +0,0 @@
-
-# libtool (GNU libtool) 2.4.2
-# Written by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
-# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
-# This is free software; see the source for copying conditions.  There is NO
-# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-# GNU Libtool 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 2 of the License, or
-# (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool 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
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html,
-# or obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-# Usage: $progname [OPTION]... [MODE-ARG]...
-#
-# Provide generalized library-building support services.
-#
-#       --config             show all configuration variables
-#       --debug              enable verbose shell tracing
-#   -n, --dry-run            display commands without modifying any files
-#       --features           display basic configuration information and exit
-#       --mode=MODE          use operation mode MODE
-#       --preserve-dup-deps  don't remove duplicate dependency libraries
-#       --quiet, --silent    don't print informational messages
-#       --no-quiet, --no-silent
-#                            print informational messages (default)
-#       --no-warn            don't display warning messages
-#       --tag=TAG            use configuration variables from tag TAG
-#   -v, --verbose            print more informational messages than default
-#       --no-verbose         don't print the extra informational messages
-#       --version            print version information
-#   -h, --help, --help-all   print short, long, or detailed help message
-#
-# MODE must be one of the following:
-#
-#         clean              remove files from the build directory
-#         compile            compile a source file into a libtool object
-#         execute            automatically set library path, then run a program
-#         finish             complete the installation of libtool libraries
-#         install            install libraries or executables
-#         link               create a library or an executable
-#         uninstall          remove libraries from an installed directory
-#
-# MODE-ARGS vary depending on the MODE.  When passed as first option,
-# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
-# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
-#
-# When reporting a bug, please describe a test case to reproduce it and
-# include the following information:
-#
-#         host-triplet:	$host
-#         shell:		$SHELL
-#         compiler:		$LTCC
-#         compiler flags:		$LTCFLAGS
-#         linker:		$LD (gnu? $with_gnu_ld)
-#         $progname:	(GNU libtool) 2.4.2
-#         automake:	$automake_version
-#         autoconf:	$autoconf_version
-#
-# Report bugs to <bug-libtool at gnu.org>.
-# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
-# General help using GNU software: <http://www.gnu.org/gethelp/>.
-
-PROGRAM=libtool
-PACKAGE=libtool
-VERSION=2.4.2
-TIMESTAMP=""
-package_revision=1.3337
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
-}
-
-# NLS nuisances: We save the old values to restore during execute mode.
-lt_user_locale=
-lt_safe_locale=
-for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-do
-  eval "if test \"\${$lt_var+set}\" = set; then
-          save_$lt_var=\$$lt_var
-          $lt_var=C
-	  export $lt_var
-	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
-	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
-	fi"
-done
-LC_ALL=C
-LANGUAGE=C
-export LANGUAGE LC_ALL
-
-$lt_unset CDPATH
-
-
-# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
-# is ksh but when the shell is invoked as "sh" and the current value of
-# the _XPG environment variable is not equal to 1 (one), the special
-# positional parameter $0, within a function call, is the name of the
-# function.
-progpath="$0"
-
-
-
-: ${CP="cp -f"}
-test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
-: ${MAKE="make"}
-: ${MKDIR="mkdir"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
-: ${Xsed="$SED -e 1s/^X//"}
-
-# Global variables:
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
-EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
-
-exit_status=$EXIT_SUCCESS
-
-# Make sure IFS has a sensible default
-lt_nl='
-'
-IFS=" 	$lt_nl"
-
-dirname="s,/[^/]*$,,"
-basename="s,^.*/,,"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-    func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
-    if test "X$func_dirname_result" = "X${1}"; then
-      func_dirname_result="${3}"
-    else
-      func_dirname_result="$func_dirname_result${2}"
-    fi
-} # func_dirname may be replaced by extended shell implementation
-
-
-# func_basename file
-func_basename ()
-{
-    func_basename_result=`$ECHO "${1}" | $SED "$basename"`
-} # func_basename may be replaced by extended shell implementation
-
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-    # Extract subdirectory from the argument.
-    func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
-    if test "X$func_dirname_result" = "X${1}"; then
-      func_dirname_result="${3}"
-    else
-      func_dirname_result="$func_dirname_result${2}"
-    fi
-    func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
-} # func_dirname_and_basename may be replaced by extended shell implementation
-
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-    case ${2} in
-      .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-      *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
-    esac
-} # func_stripname may be replaced by extended shell implementation
-
-
-# These SED scripts presuppose an absolute path with a trailing slash.
-pathcar='s,^/\([^/]*\).*$,\1,'
-pathcdr='s,^/[^/]*,,'
-removedotparts=':dotsl
-		s@/\./@/@g
-		t dotsl
-		s,/\.$,/,'
-collapseslashes='s@/\{1,\}@/@g'
-finalslash='s,/*$,/,'
-
-# func_normal_abspath PATH
-# Remove doubled-up and trailing slashes, "." path components,
-# and cancel out any ".." path components in PATH after making
-# it an absolute path.
-#             value returned in "$func_normal_abspath_result"
-func_normal_abspath ()
-{
-  # Start from root dir and reassemble the path.
-  func_normal_abspath_result=
-  func_normal_abspath_tpath=$1
-  func_normal_abspath_altnamespace=
-  case $func_normal_abspath_tpath in
-    "")
-      # Empty path, that just means $cwd.
-      func_stripname '' '/' "`pwd`"
-      func_normal_abspath_result=$func_stripname_result
-      return
-    ;;
-    # The next three entries are used to spot a run of precisely
-    # two leading slashes without using negated character classes;
-    # we take advantage of case's first-match behaviour.
-    ///*)
-      # Unusual form of absolute path, do nothing.
-    ;;
-    //*)
-      # Not necessarily an ordinary path; POSIX reserves leading '//'
-      # and for example Cygwin uses it to access remote file shares
-      # over CIFS/SMB, so we conserve a leading double slash if found.
-      func_normal_abspath_altnamespace=/
-    ;;
-    /*)
-      # Absolute path, do nothing.
-    ;;
-    *)
-      # Relative path, prepend $cwd.
-      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
-    ;;
-  esac
-  # Cancel out all the simple stuff to save iterations.  We also want
-  # the path to end with a slash for ease of parsing, so make sure
-  # there is one (and only one) here.
-  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
-  while :; do
-    # Processed it all yet?
-    if test "$func_normal_abspath_tpath" = / ; then
-      # If we ascended to the root using ".." the result may be empty now.
-      if test -z "$func_normal_abspath_result" ; then
-        func_normal_abspath_result=/
-      fi
-      break
-    fi
-    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$pathcar"`
-    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$pathcdr"`
-    # Figure out what to do with it
-    case $func_normal_abspath_tcomponent in
-      "")
-        # Trailing empty path component, ignore it.
-      ;;
-      ..)
-        # Parent dir; strip last assembled component from result.
-        func_dirname "$func_normal_abspath_result"
-        func_normal_abspath_result=$func_dirname_result
-      ;;
-      *)
-        # Actual path component, append it.
-        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
-      ;;
-    esac
-  done
-  # Restore leading double-slash if one was found on entry.
-  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
-}
-
-# func_relative_path SRCDIR DSTDIR
-# generates a relative path from SRCDIR to DSTDIR, with a trailing
-# slash if non-empty, suitable for immediately appending a filename
-# without needing to append a separator.
-#             value returned in "$func_relative_path_result"
-func_relative_path ()
-{
-  func_relative_path_result=
-  func_normal_abspath "$1"
-  func_relative_path_tlibdir=$func_normal_abspath_result
-  func_normal_abspath "$2"
-  func_relative_path_tbindir=$func_normal_abspath_result
-
-  # Ascend the tree starting from libdir
-  while :; do
-    # check if we have found a prefix of bindir
-    case $func_relative_path_tbindir in
-      $func_relative_path_tlibdir)
-        # found an exact match
-        func_relative_path_tcancelled=
-        break
-        ;;
-      $func_relative_path_tlibdir*)
-        # found a matching prefix
-        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
-        func_relative_path_tcancelled=$func_stripname_result
-        if test -z "$func_relative_path_result"; then
-          func_relative_path_result=.
-        fi
-        break
-        ;;
-      *)
-        func_dirname $func_relative_path_tlibdir
-        func_relative_path_tlibdir=${func_dirname_result}
-        if test "x$func_relative_path_tlibdir" = x ; then
-          # Have to descend all the way to the root!
-          func_relative_path_result=../$func_relative_path_result
-          func_relative_path_tcancelled=$func_relative_path_tbindir
-          break
-        fi
-        func_relative_path_result=../$func_relative_path_result
-        ;;
-    esac
-  done
-
-  # Now calculate path; take care to avoid doubling-up slashes.
-  func_stripname '' '/' "$func_relative_path_result"
-  func_relative_path_result=$func_stripname_result
-  func_stripname '/' '/' "$func_relative_path_tcancelled"
-  if test "x$func_stripname_result" != x ; then
-    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
-  fi
-
-  # Normalisation. If bindir is libdir, return empty string,
-  # else relative path ending with a slash; either way, target
-  # file name can be directly appended.
-  if test ! -z "$func_relative_path_result"; then
-    func_stripname './' '' "$func_relative_path_result/"
-    func_relative_path_result=$func_stripname_result
-  fi
-}
-
-# The name of this program:
-func_dirname_and_basename "$progpath"
-progname=$func_basename_result
-
-# Make sure we have an absolute path for reexecution:
-case $progpath in
-  [\\/]*|[A-Za-z]:\\*) ;;
-  *[\\/]*)
-     progdir=$func_dirname_result
-     progdir=`cd "$progdir" && pwd`
-     progpath="$progdir/$progname"
-     ;;
-  *)
-     save_IFS="$IFS"
-     IFS=${PATH_SEPARATOR-:}
-     for progdir in $PATH; do
-       IFS="$save_IFS"
-       test -x "$progdir/$progname" && break
-     done
-     IFS="$save_IFS"
-     test -n "$progdir" || progdir=`pwd`
-     progpath="$progdir/$progname"
-     ;;
-esac
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed="${SED}"' -e 1s/^X//'
-sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Sed substitution that turns a string into a regex matching for the
-# string literally.
-sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
-
-# Sed substitution that converts a w32 file name or path
-# which contains forward slashes, into one that contains
-# (escaped) backslashes.  A very naive implementation.
-lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-
-# Re-`\' parameter expansions in output of double_quote_subst that were
-# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
-# in input to double_quote_subst, that '$' was protected from expansion.
-# Since each input `\' is now two `\'s, look for any number of runs of
-# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
-bs='\\'
-bs2='\\\\'
-bs4='\\\\\\\\'
-dollar='\$'
-sed_double_backslash="\
-  s/$bs4/&\\
-/g
-  s/^$bs2$dollar/$bs&/
-  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
-  s/\n//g"
-
-# Standard options:
-opt_dry_run=false
-opt_help=false
-opt_quiet=false
-opt_verbose=false
-opt_warning=:
-
-# func_echo arg...
-# Echo program name prefixed message, along with the current mode
-# name if it has been set yet.
-func_echo ()
-{
-    $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
-}
-
-# func_verbose arg...
-# Echo program name prefixed message in verbose mode only.
-func_verbose ()
-{
-    $opt_verbose && func_echo ${1+"$@"}
-
-    # A bug in bash halts the script if the last line of a function
-    # fails when set -e is in force, so we need another command to
-    # work around that:
-    :
-}
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO "$*"
-}
-
-# func_error arg...
-# Echo program name prefixed message to standard error.
-func_error ()
-{
-    $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
-}
-
-# func_warning arg...
-# Echo program name prefixed warning message to standard error.
-func_warning ()
-{
-    $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
-
-    # bash bug again:
-    :
-}
-
-# func_fatal_error arg...
-# Echo program name prefixed message to standard error, and exit.
-func_fatal_error ()
-{
-    func_error ${1+"$@"}
-    exit $EXIT_FAILURE
-}
-
-# func_fatal_help arg...
-# Echo program name prefixed message to standard error, followed by
-# a help hint, and exit.
-func_fatal_help ()
-{
-    func_error ${1+"$@"}
-    func_fatal_error "$help"
-}
-help="Try \`$progname --help' for more information."  ## default
-
-
-# func_grep expression filename
-# Check whether EXPRESSION matches any line of FILENAME, without output.
-func_grep ()
-{
-    $GREP "$1" "$2" >/dev/null 2>&1
-}
-
-
-# func_mkdir_p directory-path
-# Make sure the entire path to DIRECTORY-PATH is available.
-func_mkdir_p ()
-{
-    my_directory_path="$1"
-    my_dir_list=
-
-    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
-
-      # Protect directory names starting with `-'
-      case $my_directory_path in
-        -*) my_directory_path="./$my_directory_path" ;;
-      esac
-
-      # While some portion of DIR does not yet exist...
-      while test ! -d "$my_directory_path"; do
-        # ...make a list in topmost first order.  Use a colon delimited
-	# list incase some portion of path contains whitespace.
-        my_dir_list="$my_directory_path:$my_dir_list"
-
-        # If the last portion added has no slash in it, the list is done
-        case $my_directory_path in */*) ;; *) break ;; esac
-
-        # ...otherwise throw away the child directory and loop
-        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
-      done
-      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
-
-      save_mkdir_p_IFS="$IFS"; IFS=':'
-      for my_dir in $my_dir_list; do
-	IFS="$save_mkdir_p_IFS"
-        # mkdir can fail with a `File exist' error if two processes
-        # try to create one of the directories concurrently.  Don't
-        # stop in that case!
-        $MKDIR "$my_dir" 2>/dev/null || :
-      done
-      IFS="$save_mkdir_p_IFS"
-
-      # Bail out if we (or some other process) failed to create a directory.
-      test -d "$my_directory_path" || \
-        func_fatal_error "Failed to create \`$1'"
-    fi
-}
-
-
-# func_mktempdir [string]
-# Make a temporary directory that won't clash with other running
-# libtool processes, and avoids race conditions if possible.  If
-# given, STRING is the basename for that directory.
-func_mktempdir ()
-{
-    my_template="${TMPDIR-/tmp}/${1-$progname}"
-
-    if test "$opt_dry_run" = ":"; then
-      # Return a directory name, but don't create it in dry-run mode
-      my_tmpdir="${my_template}-$$"
-    else
-
-      # If mktemp works, use that first and foremost
-      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
-
-      if test ! -d "$my_tmpdir"; then
-        # Failing that, at least try and use $RANDOM to avoid a race
-        my_tmpdir="${my_template}-${RANDOM-0}$$"
-
-        save_mktempdir_umask=`umask`
-        umask 0077
-        $MKDIR "$my_tmpdir"
-        umask $save_mktempdir_umask
-      fi
-
-      # If we're not in dry-run mode, bomb out on failure
-      test -d "$my_tmpdir" || \
-        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
-    fi
-
-    $ECHO "$my_tmpdir"
-}
-
-
-# func_quote_for_eval arg
-# Aesthetically quote ARG to be evaled later.
-# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
-# is double-quoted, suitable for a subsequent eval, whereas
-# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
-# which are still active within double quotes backslashified.
-func_quote_for_eval ()
-{
-    case $1 in
-      *[\\\`\"\$]*)
-	func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
-      *)
-        func_quote_for_eval_unquoted_result="$1" ;;
-    esac
-
-    case $func_quote_for_eval_unquoted_result in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting, command substitution and and variable
-      # expansion for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
-        ;;
-      *)
-        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
-    esac
-}
-
-
-# func_quote_for_expand arg
-# Aesthetically quote ARG to be evaled later; same as above,
-# but do not quote variable references.
-func_quote_for_expand ()
-{
-    case $1 in
-      *[\\\`\"]*)
-	my_arg=`$ECHO "$1" | $SED \
-	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
-      *)
-        my_arg="$1" ;;
-    esac
-
-    case $my_arg in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting and command substitution for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        my_arg="\"$my_arg\""
-        ;;
-    esac
-
-    func_quote_for_expand_result="$my_arg"
-}
-
-
-# func_show_eval cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.
-func_show_eval ()
-{
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
-
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
-
-    if ${opt_dry_run-false}; then :; else
-      eval "$my_cmd"
-      my_status=$?
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
-}
-
-
-# func_show_eval_locale cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.  Use the saved locale for evaluation.
-func_show_eval_locale ()
-{
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
-
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
-
-    if ${opt_dry_run-false}; then :; else
-      eval "$lt_user_locale
-	    $my_cmd"
-      my_status=$?
-      eval "$lt_safe_locale"
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
-}
-
-# func_tr_sh
-# Turn $1 into a string suitable for a shell variable name.
-# Result is stored in $func_tr_sh_result.  All characters
-# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
-# if $1 begins with a digit, a '_' is prepended as well.
-func_tr_sh ()
-{
-  case $1 in
-  [0-9]* | *[!a-zA-Z0-9_]*)
-    func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
-    ;;
-  * )
-    func_tr_sh_result=$1
-    ;;
-  esac
-}
-
-
-# func_version
-# Echo version message to standard output and exit.
-func_version ()
-{
-    $opt_debug
-
-    $SED -n '/(C)/!b go
-	:more
-	/\./!{
-	  N
-	  s/\n# / /
-	  b more
-	}
-	:go
-	/^# '$PROGRAM' (GNU /,/# warranty; / {
-        s/^# //
-	s/^# *$//
-        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
-        p
-     }' < "$progpath"
-     exit $?
-}
-
-# func_usage
-# Echo short help message to standard output and exit.
-func_usage ()
-{
-    $opt_debug
-
-    $SED -n '/^# Usage:/,/^#  *.*--help/ {
-        s/^# //
-	s/^# *$//
-	s/\$progname/'$progname'/
-	p
-    }' < "$progpath"
-    echo
-    $ECHO "run \`$progname --help | more' for full usage"
-    exit $?
-}
-
-# func_help [NOEXIT]
-# Echo long help message to standard output and exit,
-# unless 'noexit' is passed as argument.
-func_help ()
-{
-    $opt_debug
-
-    $SED -n '/^# Usage:/,/# Report bugs to/ {
-	:print
-        s/^# //
-	s/^# *$//
-	s*\$progname*'$progname'*
-	s*\$host*'"$host"'*
-	s*\$SHELL*'"$SHELL"'*
-	s*\$LTCC*'"$LTCC"'*
-	s*\$LTCFLAGS*'"$LTCFLAGS"'*
-	s*\$LD*'"$LD"'*
-	s/\$with_gnu_ld/'"$with_gnu_ld"'/
-	s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/
-	s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/
-	p
-	d
-     }
-     /^# .* home page:/b print
-     /^# General help using/b print
-     ' < "$progpath"
-    ret=$?
-    if test -z "$1"; then
-      exit $ret
-    fi
-}
-
-# func_missing_arg argname
-# Echo program name prefixed message to standard error and set global
-# exit_cmd.
-func_missing_arg ()
-{
-    $opt_debug
-
-    func_error "missing argument for $1."
-    exit_cmd=exit
-}
-
-
-# func_split_short_opt shortopt
-# Set func_split_short_opt_name and func_split_short_opt_arg shell
-# variables after splitting SHORTOPT after the 2nd character.
-func_split_short_opt ()
-{
-    my_sed_short_opt='1s/^\(..\).*$/\1/;q'
-    my_sed_short_rest='1s/^..\(.*\)$/\1/;q'
-
-    func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"`
-    func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"`
-} # func_split_short_opt may be replaced by extended shell implementation
-
-
-# func_split_long_opt longopt
-# Set func_split_long_opt_name and func_split_long_opt_arg shell
-# variables after splitting LONGOPT at the `=' sign.
-func_split_long_opt ()
-{
-    my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
-    my_sed_long_arg='1s/^--[^=]*=//'
-
-    func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"`
-    func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"`
-} # func_split_long_opt may be replaced by extended shell implementation
-
-exit_cmd=:
-
-
-
-
-
-magic="%%%MAGIC variable%%%"
-magic_exe="%%%MAGIC EXE variable%%%"
-
-# Global variables.
-nonopt=
-preserve_args=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
-extracted_archives=
-extracted_serial=0
-
-# If this variable is set in any of the actions, the command in it
-# will be execed at the end.  This prevents here-documents from being
-# left over by shells.
-exec_cmd=
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-    eval "${1}=\$${1}\${2}"
-} # func_append may be replaced by extended shell implementation
-
-# func_append_quoted var value
-# Quote VALUE and append to the end of shell variable VAR, separated
-# by a space.
-func_append_quoted ()
-{
-    func_quote_for_eval "${2}"
-    eval "${1}=\$${1}\\ \$func_quote_for_eval_result"
-} # func_append_quoted may be replaced by extended shell implementation
-
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-    func_arith_result=`expr "${@}"`
-} # func_arith may be replaced by extended shell implementation
-
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-    func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len`
-} # func_len may be replaced by extended shell implementation
-
-
-# func_lo2o object
-func_lo2o ()
-{
-    func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
-} # func_lo2o may be replaced by extended shell implementation
-
-
-# func_xform libobj-or-source
-func_xform ()
-{
-    func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
-} # func_xform may be replaced by extended shell implementation
-
-
-# func_fatal_configuration arg...
-# Echo program name prefixed message to standard error, followed by
-# a configuration failure hint, and exit.
-func_fatal_configuration ()
-{
-    func_error ${1+"$@"}
-    func_error "See the $PACKAGE documentation for more information."
-    func_fatal_error "Fatal configuration error."
-}
-
-
-# func_config
-# Display the configuration for all the tags in this script.
-func_config ()
-{
-    re_begincf='^# ### BEGIN LIBTOOL'
-    re_endcf='^# ### END LIBTOOL'
-
-    # Default configuration.
-    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
-
-    # Now print the configurations for the tags.
-    for tagname in $taglist; do
-      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
-    done
-
-    exit $?
-}
-
-# func_features
-# Display the features supported by this script.
-func_features ()
-{
-    echo "host: $host"
-    if test "$build_libtool_libs" = yes; then
-      echo "enable shared libraries"
-    else
-      echo "disable shared libraries"
-    fi
-    if test "$build_old_libs" = yes; then
-      echo "enable static libraries"
-    else
-      echo "disable static libraries"
-    fi
-
-    exit $?
-}
-
-# func_enable_tag tagname
-# Verify that TAGNAME is valid, and either flag an error and exit, or
-# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
-# variable here.
-func_enable_tag ()
-{
-  # Global variable:
-  tagname="$1"
-
-  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
-  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
-  sed_extractcf="/$re_begincf/,/$re_endcf/p"
-
-  # Validate tagname.
-  case $tagname in
-    *[!-_A-Za-z0-9,/]*)
-      func_fatal_error "invalid tag name: $tagname"
-      ;;
-  esac
-
-  # Don't test for the "default" C tag, as we know it's
-  # there but not specially marked.
-  case $tagname in
-    CC) ;;
-    *)
-      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
-	taglist="$taglist $tagname"
-
-	# Evaluate the configuration.  Be careful to quote the path
-	# and the sed script, to avoid splitting on whitespace, but
-	# also don't use non-portable quotes within backquotes within
-	# quotes we have to do it in 2 steps:
-	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
-	eval "$extractedcf"
-      else
-	func_error "ignoring unknown tag $tagname"
-      fi
-      ;;
-  esac
-}
-
-# func_check_version_match
-# Ensure that we are using m4 macros, and libtool script from the same
-# release of libtool.
-func_check_version_match ()
-{
-  if test "$package_revision" != "$macro_revision"; then
-    if test "$VERSION" != "$macro_version"; then
-      if test -z "$macro_version"; then
-        cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from an older release.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
-      else
-        cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
-      fi
-    else
-      cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
-$progname: but the definition of this LT_INIT comes from revision $macro_revision.
-$progname: You should recreate aclocal.m4 with macros from revision $package_revision
-$progname: of $PACKAGE $VERSION and run autoconf again.
-_LT_EOF
-    fi
-
-    exit $EXIT_MISMATCH
-  fi
-}
-
-
-# Shorthand for --mode=foo, only valid as the first argument
-case $1 in
-clean|clea|cle|cl)
-  shift; set dummy --mode clean ${1+"$@"}; shift
-  ;;
-compile|compil|compi|comp|com|co|c)
-  shift; set dummy --mode compile ${1+"$@"}; shift
-  ;;
-execute|execut|execu|exec|exe|ex|e)
-  shift; set dummy --mode execute ${1+"$@"}; shift
-  ;;
-finish|finis|fini|fin|fi|f)
-  shift; set dummy --mode finish ${1+"$@"}; shift
-  ;;
-install|instal|insta|inst|ins|in|i)
-  shift; set dummy --mode install ${1+"$@"}; shift
-  ;;
-link|lin|li|l)
-  shift; set dummy --mode link ${1+"$@"}; shift
-  ;;
-uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
-  shift; set dummy --mode uninstall ${1+"$@"}; shift
-  ;;
-esac
-
-
-
-# Option defaults:
-opt_debug=:
-opt_dry_run=false
-opt_config=false
-opt_preserve_dup_deps=false
-opt_features=false
-opt_finish=false
-opt_help=false
-opt_help_all=false
-opt_silent=:
-opt_warning=:
-opt_verbose=:
-opt_silent=false
-opt_verbose=false
-
-
-# Parse options once, thoroughly.  This comes as soon as possible in the
-# script to make things like `--version' happen as quickly as we can.
-{
-  # this just eases exit handling
-  while test $# -gt 0; do
-    opt="$1"
-    shift
-    case $opt in
-      --debug|-x)	opt_debug='set -x'
-			func_echo "enabling shell trace mode"
-			$opt_debug
-			;;
-      --dry-run|--dryrun|-n)
-			opt_dry_run=:
-			;;
-      --config)
-			opt_config=:
-func_config
-			;;
-      --dlopen|-dlopen)
-			optarg="$1"
-			opt_dlopen="${opt_dlopen+$opt_dlopen
-}$optarg"
-			shift
-			;;
-      --preserve-dup-deps)
-			opt_preserve_dup_deps=:
-			;;
-      --features)
-			opt_features=:
-func_features
-			;;
-      --finish)
-			opt_finish=:
-set dummy --mode finish ${1+"$@"}; shift
-			;;
-      --help)
-			opt_help=:
-			;;
-      --help-all)
-			opt_help_all=:
-opt_help=': help-all'
-			;;
-      --mode)
-			test $# = 0 && func_missing_arg $opt && break
-			optarg="$1"
-			opt_mode="$optarg"
-case $optarg in
-  # Valid mode arguments:
-  clean|compile|execute|finish|install|link|relink|uninstall) ;;
-
-  # Catch anything else as an error
-  *) func_error "invalid argument for $opt"
-     exit_cmd=exit
-     break
-     ;;
-esac
-			shift
-			;;
-      --no-silent|--no-quiet)
-			opt_silent=false
-func_append preserve_args " $opt"
-			;;
-      --no-warning|--no-warn)
-			opt_warning=false
-func_append preserve_args " $opt"
-			;;
-      --no-verbose)
-			opt_verbose=false
-func_append preserve_args " $opt"
-			;;
-      --silent|--quiet)
-			opt_silent=:
-func_append preserve_args " $opt"
-        opt_verbose=false
-			;;
-      --verbose|-v)
-			opt_verbose=:
-func_append preserve_args " $opt"
-opt_silent=false
-			;;
-      --tag)
-			test $# = 0 && func_missing_arg $opt && break
-			optarg="$1"
-			opt_tag="$optarg"
-func_append preserve_args " $opt $optarg"
-func_enable_tag "$optarg"
-			shift
-			;;
-
-      -\?|-h)		func_usage				;;
-      --help)		func_help				;;
-      --version)	func_version				;;
-
-      # Separate optargs to long options:
-      --*=*)
-			func_split_long_opt "$opt"
-			set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
-			shift
-			;;
-
-      # Separate non-argument short options:
-      -\?*|-h*|-n*|-v*)
-			func_split_short_opt "$opt"
-			set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
-			shift
-			;;
-
-      --)		break					;;
-      -*)		func_fatal_help "unrecognized option \`$opt'" ;;
-      *)		set dummy "$opt" ${1+"$@"};	shift; break  ;;
-    esac
-  done
-
-  # Validate options:
-
-  # save first non-option argument
-  if test "$#" -gt 0; then
-    nonopt="$opt"
-    shift
-  fi
-
-  # preserve --debug
-  test "$opt_debug" = : || func_append preserve_args " --debug"
-
-  case $host in
-    *cygwin* | *mingw* | *pw32* | *cegcc*)
-      # don't eliminate duplications in $postdeps and $predeps
-      opt_duplicate_compiler_generated_deps=:
-      ;;
-    *)
-      opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
-      ;;
-  esac
-
-  $opt_help || {
-    # Sanity checks first:
-    func_check_version_match
-
-    if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
-      func_fatal_configuration "not configured to build any kind of library"
-    fi
-
-    # Darwin sucks
-    eval std_shrext=\"$shrext_cmds\"
-
-    # Only execute mode is allowed to have -dlopen flags.
-    if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
-      func_error "unrecognized option \`-dlopen'"
-      $ECHO "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
-
-    # Change the help message to a mode-specific one.
-    generic_help="$help"
-    help="Try \`$progname --help --mode=$opt_mode' for more information."
-  }
-
-
-  # Bail if the options were screwed
-  $exit_cmd $EXIT_FAILURE
-}
-
-
-
-
-## ----------- ##
-##    Main.    ##
-## ----------- ##
-
-# func_lalib_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_lalib_p ()
-{
-    test -f "$1" &&
-      $SED -e 4q "$1" 2>/dev/null \
-        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
-}
-
-# func_lalib_unsafe_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
-# This function implements the same check as func_lalib_p without
-# resorting to external programs.  To this end, it redirects stdin and
-# closes it afterwards, without saving the original file descriptor.
-# As a safety measure, use it only where a negative result would be
-# fatal anyway.  Works if `file' does not exist.
-func_lalib_unsafe_p ()
-{
-    lalib_p=no
-    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
-	for lalib_p_l in 1 2 3 4
-	do
-	    read lalib_p_line
-	    case "$lalib_p_line" in
-		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
-	    esac
-	done
-	exec 0<&5 5<&-
-    fi
-    test "$lalib_p" = yes
-}
-
-# func_ltwrapper_script_p file
-# True iff FILE is a libtool wrapper script
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_script_p ()
-{
-    func_lalib_p "$1"
-}
-
-# func_ltwrapper_executable_p file
-# True iff FILE is a libtool wrapper executable
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_executable_p ()
-{
-    func_ltwrapper_exec_suffix=
-    case $1 in
-    *.exe) ;;
-    *) func_ltwrapper_exec_suffix=.exe ;;
-    esac
-    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
-}
-
-# func_ltwrapper_scriptname file
-# Assumes file is an ltwrapper_executable
-# uses $file to determine the appropriate filename for a
-# temporary ltwrapper_script.
-func_ltwrapper_scriptname ()
-{
-    func_dirname_and_basename "$1" "" "."
-    func_stripname '' '.exe' "$func_basename_result"
-    func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
-}
-
-# func_ltwrapper_p file
-# True iff FILE is a libtool wrapper script or wrapper executable
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_p ()
-{
-    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
-}
-
-
-# func_execute_cmds commands fail_cmd
-# Execute tilde-delimited COMMANDS.
-# If FAIL_CMD is given, eval that upon failure.
-# FAIL_CMD may read-access the current command in variable CMD!
-func_execute_cmds ()
-{
-    $opt_debug
-    save_ifs=$IFS; IFS='~'
-    for cmd in $1; do
-      IFS=$save_ifs
-      eval cmd=\"$cmd\"
-      func_show_eval "$cmd" "${2-:}"
-    done
-    IFS=$save_ifs
-}
-
-
-# func_source file
-# Source FILE, adding directory component if necessary.
-# Note that it is not necessary on cygwin/mingw to append a dot to
-# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
-# behavior happens only for exec(3), not for open(2)!  Also, sourcing
-# `FILE.' does not work on cygwin managed mounts.
-func_source ()
-{
-    $opt_debug
-    case $1 in
-    */* | *\\*)	. "$1" ;;
-    *)		. "./$1" ;;
-    esac
-}
-
-
-# func_resolve_sysroot PATH
-# Replace a leading = in PATH with a sysroot.  Store the result into
-# func_resolve_sysroot_result
-func_resolve_sysroot ()
-{
-  func_resolve_sysroot_result=$1
-  case $func_resolve_sysroot_result in
-  =*)
-    func_stripname '=' '' "$func_resolve_sysroot_result"
-    func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
-    ;;
-  esac
-}
-
-# func_replace_sysroot PATH
-# If PATH begins with the sysroot, replace it with = and
-# store the result into func_replace_sysroot_result.
-func_replace_sysroot ()
-{
-  case "$lt_sysroot:$1" in
-  ?*:"$lt_sysroot"*)
-    func_stripname "$lt_sysroot" '' "$1"
-    func_replace_sysroot_result="=$func_stripname_result"
-    ;;
-  *)
-    # Including no sysroot.
-    func_replace_sysroot_result=$1
-    ;;
-  esac
-}
-
-# func_infer_tag arg
-# Infer tagged configuration to use if any are available and
-# if one wasn't chosen via the "--tag" command line option.
-# Only attempt this if the compiler in the base compile
-# command doesn't match the default compiler.
-# arg is usually of the form 'gcc ...'
-func_infer_tag ()
-{
-    $opt_debug
-    if test -n "$available_tags" && test -z "$tagname"; then
-      CC_quoted=
-      for arg in $CC; do
-	func_append_quoted CC_quoted "$arg"
-      done
-      CC_expanded=`func_echo_all $CC`
-      CC_quoted_expanded=`func_echo_all $CC_quoted`
-      case $@ in
-      # Blanks in the command may have been stripped by the calling shell,
-      # but not from the CC environment variable when configure was run.
-      " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
-      " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
-      # Blanks at the start of $base_compile will cause this to fail
-      # if we don't check for them as well.
-      *)
-	for z in $available_tags; do
-	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
-	    # Evaluate the configuration.
-	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
-	    CC_quoted=
-	    for arg in $CC; do
-	      # Double-quote args containing other shell metacharacters.
-	      func_append_quoted CC_quoted "$arg"
-	    done
-	    CC_expanded=`func_echo_all $CC`
-	    CC_quoted_expanded=`func_echo_all $CC_quoted`
-	    case "$@ " in
-	    " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
-	    " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
-	      # The compiler in the base compile command matches
-	      # the one in the tagged configuration.
-	      # Assume this is the tagged configuration we want.
-	      tagname=$z
-	      break
-	      ;;
-	    esac
-	  fi
-	done
-	# If $tagname still isn't set, then no tagged configuration
-	# was found and let the user know that the "--tag" command
-	# line option must be used.
-	if test -z "$tagname"; then
-	  func_echo "unable to infer tagged configuration"
-	  func_fatal_error "specify a tag with \`--tag'"
-#	else
-#	  func_verbose "using $tagname tagged configuration"
-	fi
-	;;
-      esac
-    fi
-}
-
-
-
-# func_write_libtool_object output_name pic_name nonpic_name
-# Create a libtool object file (analogous to a ".la" file),
-# but don't create it if we're doing a dry run.
-func_write_libtool_object ()
-{
-    write_libobj=${1}
-    if test "$build_libtool_libs" = yes; then
-      write_lobj=\'${2}\'
-    else
-      write_lobj=none
-    fi
-
-    if test "$build_old_libs" = yes; then
-      write_oldobj=\'${3}\'
-    else
-      write_oldobj=none
-    fi
-
-    $opt_dry_run || {
-      cat >${write_libobj}T <<EOF
-# $write_libobj - a libtool object file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# Name of the PIC object.
-pic_object=$write_lobj
-
-# Name of the non-PIC object
-non_pic_object=$write_oldobj
-
-EOF
-      $MV "${write_libobj}T" "${write_libobj}"
-    }
-}
-
-
-##################################################
-# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
-##################################################
-
-# func_convert_core_file_wine_to_w32 ARG
-# Helper function used by file name conversion functions when $build is *nix,
-# and $host is mingw, cygwin, or some other w32 environment. Relies on a
-# correctly configured wine environment available, with the winepath program
-# in $build's $PATH.
-#
-# ARG is the $build file name to be converted to w32 format.
-# Result is available in $func_convert_core_file_wine_to_w32_result, and will
-# be empty on error (or when ARG is empty)
-func_convert_core_file_wine_to_w32 ()
-{
-  $opt_debug
-  func_convert_core_file_wine_to_w32_result="$1"
-  if test -n "$1"; then
-    # Unfortunately, winepath does not exit with a non-zero error code, so we
-    # are forced to check the contents of stdout. On the other hand, if the
-    # command is not found, the shell will set an exit code of 127 and print
-    # *an error message* to stdout. So we must check for both error code of
-    # zero AND non-empty stdout, which explains the odd construction:
-    func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
-    if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
-      func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
-        $SED -e "$lt_sed_naive_backslashify"`
-    else
-      func_convert_core_file_wine_to_w32_result=
-    fi
-  fi
-}
-# end: func_convert_core_file_wine_to_w32
-
-
-# func_convert_core_path_wine_to_w32 ARG
-# Helper function used by path conversion functions when $build is *nix, and
-# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
-# configured wine environment available, with the winepath program in $build's
-# $PATH. Assumes ARG has no leading or trailing path separator characters.
-#
-# ARG is path to be converted from $build format to win32.
-# Result is available in $func_convert_core_path_wine_to_w32_result.
-# Unconvertible file (directory) names in ARG are skipped; if no directory names
-# are convertible, then the result may be empty.
-func_convert_core_path_wine_to_w32 ()
-{
-  $opt_debug
-  # unfortunately, winepath doesn't convert paths, only file names
-  func_convert_core_path_wine_to_w32_result=""
-  if test -n "$1"; then
-    oldIFS=$IFS
-    IFS=:
-    for func_convert_core_path_wine_to_w32_f in $1; do
-      IFS=$oldIFS
-      func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
-      if test -n "$func_convert_core_file_wine_to_w32_result" ; then
-        if test -z "$func_convert_core_path_wine_to_w32_result"; then
-          func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
-        else
-          func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
-        fi
-      fi
-    done
-    IFS=$oldIFS
-  fi
-}
-# end: func_convert_core_path_wine_to_w32
-
-
-# func_cygpath ARGS...
-# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
-# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
-# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
-# (2), returns the Cygwin file name or path in func_cygpath_result (input
-# file name or path is assumed to be in w32 format, as previously converted
-# from $build's *nix or MSYS format). In case (3), returns the w32 file name
-# or path in func_cygpath_result (input file name or path is assumed to be in
-# Cygwin format). Returns an empty string on error.
-#
-# ARGS are passed to cygpath, with the last one being the file name or path to
-# be converted.
-#
-# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
-# environment variable; do not put it in $PATH.
-func_cygpath ()
-{
-  $opt_debug
-  if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
-    func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
-    if test "$?" -ne 0; then
-      # on failure, ensure result is empty
-      func_cygpath_result=
-    fi
-  else
-    func_cygpath_result=
-    func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
-  fi
-}
-#end: func_cygpath
-
-
-# func_convert_core_msys_to_w32 ARG
-# Convert file name or path ARG from MSYS format to w32 format.  Return
-# result in func_convert_core_msys_to_w32_result.
-func_convert_core_msys_to_w32 ()
-{
-  $opt_debug
-  # awkward: cmd appends spaces to result
-  func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
-    $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
-}
-#end: func_convert_core_msys_to_w32
-
-
-# func_convert_file_check ARG1 ARG2
-# Verify that ARG1 (a file name in $build format) was converted to $host
-# format in ARG2. Otherwise, emit an error message, but continue (resetting
-# func_to_host_file_result to ARG1).
-func_convert_file_check ()
-{
-  $opt_debug
-  if test -z "$2" && test -n "$1" ; then
-    func_error "Could not determine host file name corresponding to"
-    func_error "  \`$1'"
-    func_error "Continuing, but uninstalled executables may not work."
-    # Fallback:
-    func_to_host_file_result="$1"
-  fi
-}
-# end func_convert_file_check
-
-
-# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
-# Verify that FROM_PATH (a path in $build format) was converted to $host
-# format in TO_PATH. Otherwise, emit an error message, but continue, resetting
-# func_to_host_file_result to a simplistic fallback value (see below).
-func_convert_path_check ()
-{
-  $opt_debug
-  if test -z "$4" && test -n "$3"; then
-    func_error "Could not determine the host path corresponding to"
-    func_error "  \`$3'"
-    func_error "Continuing, but uninstalled executables may not work."
-    # Fallback.  This is a deliberately simplistic "conversion" and
-    # should not be "improved".  See libtool.info.
-    if test "x$1" != "x$2"; then
-      lt_replace_pathsep_chars="s|$1|$2|g"
-      func_to_host_path_result=`echo "$3" |
-        $SED -e "$lt_replace_pathsep_chars"`
-    else
-      func_to_host_path_result="$3"
-    fi
-  fi
-}
-# end func_convert_path_check
-
-
-# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
-# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
-# and appending REPL if ORIG matches BACKPAT.
-func_convert_path_front_back_pathsep ()
-{
-  $opt_debug
-  case $4 in
-  $1 ) func_to_host_path_result="$3$func_to_host_path_result"
-    ;;
-  esac
-  case $4 in
-  $2 ) func_append func_to_host_path_result "$3"
-    ;;
-  esac
-}
-# end func_convert_path_front_back_pathsep
-
-
-##################################################
-# $build to $host FILE NAME CONVERSION FUNCTIONS #
-##################################################
-# invoked via `$to_host_file_cmd ARG'
-#
-# In each case, ARG is the path to be converted from $build to $host format.
-# Result will be available in $func_to_host_file_result.
-
-
-# func_to_host_file ARG
-# Converts the file name ARG from $build format to $host format. Return result
-# in func_to_host_file_result.
-func_to_host_file ()
-{
-  $opt_debug
-  $to_host_file_cmd "$1"
-}
-# end func_to_host_file
-
-
-# func_to_tool_file ARG LAZY
-# converts the file name ARG from $build format to toolchain format. Return
-# result in func_to_tool_file_result.  If the conversion in use is listed
-# in (the comma separated) LAZY, no conversion takes place.
-func_to_tool_file ()
-{
-  $opt_debug
-  case ,$2, in
-    *,"$to_tool_file_cmd",*)
-      func_to_tool_file_result=$1
-      ;;
-    *)
-      $to_tool_file_cmd "$1"
-      func_to_tool_file_result=$func_to_host_file_result
-      ;;
-  esac
-}
-# end func_to_tool_file
-
-
-# func_convert_file_noop ARG
-# Copy ARG to func_to_host_file_result.
-func_convert_file_noop ()
-{
-  func_to_host_file_result="$1"
-}
-# end func_convert_file_noop
-
-
-# func_convert_file_msys_to_w32 ARG
-# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
-# conversion to w32 is not available inside the cwrapper.  Returns result in
-# func_to_host_file_result.
-func_convert_file_msys_to_w32 ()
-{
-  $opt_debug
-  func_to_host_file_result="$1"
-  if test -n "$1"; then
-    func_convert_core_msys_to_w32 "$1"
-    func_to_host_file_result="$func_convert_core_msys_to_w32_result"
-  fi
-  func_convert_file_check "$1" "$func_to_host_file_result"
-}
-# end func_convert_file_msys_to_w32
-
-
-# func_convert_file_cygwin_to_w32 ARG
-# Convert file name ARG from Cygwin to w32 format.  Returns result in
-# func_to_host_file_result.
-func_convert_file_cygwin_to_w32 ()
-{
-  $opt_debug
-  func_to_host_file_result="$1"
-  if test -n "$1"; then
-    # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
-    # LT_CYGPATH in this case.
-    func_to_host_file_result=`cygpath -m "$1"`
-  fi
-  func_convert_file_check "$1" "$func_to_host_file_result"
-}
-# end func_convert_file_cygwin_to_w32
-
-
-# func_convert_file_nix_to_w32 ARG
-# Convert file name ARG from *nix to w32 format.  Requires a wine environment
-# and a working winepath. Returns result in func_to_host_file_result.
-func_convert_file_nix_to_w32 ()
-{
-  $opt_debug
-  func_to_host_file_result="$1"
-  if test -n "$1"; then
-    func_convert_core_file_wine_to_w32 "$1"
-    func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
-  fi
-  func_convert_file_check "$1" "$func_to_host_file_result"
-}
-# end func_convert_file_nix_to_w32
-
-
-# func_convert_file_msys_to_cygwin ARG
-# Convert file name ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
-# Returns result in func_to_host_file_result.
-func_convert_file_msys_to_cygwin ()
-{
-  $opt_debug
-  func_to_host_file_result="$1"
-  if test -n "$1"; then
-    func_convert_core_msys_to_w32 "$1"
-    func_cygpath -u "$func_convert_core_msys_to_w32_result"
-    func_to_host_file_result="$func_cygpath_result"
-  fi
-  func_convert_file_check "$1" "$func_to_host_file_result"
-}
-# end func_convert_file_msys_to_cygwin
-
-
-# func_convert_file_nix_to_cygwin ARG
-# Convert file name ARG from *nix to Cygwin format.  Requires Cygwin installed
-# in a wine environment, working winepath, and LT_CYGPATH set.  Returns result
-# in func_to_host_file_result.
-func_convert_file_nix_to_cygwin ()
-{
-  $opt_debug
-  func_to_host_file_result="$1"
-  if test -n "$1"; then
-    # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
-    func_convert_core_file_wine_to_w32 "$1"
-    func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
-    func_to_host_file_result="$func_cygpath_result"
-  fi
-  func_convert_file_check "$1" "$func_to_host_file_result"
-}
-# end func_convert_file_nix_to_cygwin
-
-
-#############################################
-# $build to $host PATH CONVERSION FUNCTIONS #
-#############################################
-# invoked via `$to_host_path_cmd ARG'
-#
-# In each case, ARG is the path to be converted from $build to $host format.
-# The result will be available in $func_to_host_path_result.
-#
-# Path separators are also converted from $build format to $host format.  If
-# ARG begins or ends with a path separator character, it is preserved (but
-# converted to $host format) on output.
-#
-# All path conversion functions are named using the following convention:
-#   file name conversion function    : func_convert_file_X_to_Y ()
-#   path conversion function         : func_convert_path_X_to_Y ()
-# where, for any given $build/$host combination the 'X_to_Y' value is the
-# same.  If conversion functions are added for new $build/$host combinations,
-# the two new functions must follow this pattern, or func_init_to_host_path_cmd
-# will break.
-
-
-# func_init_to_host_path_cmd
-# Ensures that function "pointer" variable $to_host_path_cmd is set to the
-# appropriate value, based on the value of $to_host_file_cmd.
-to_host_path_cmd=
-func_init_to_host_path_cmd ()
-{
-  $opt_debug
-  if test -z "$to_host_path_cmd"; then
-    func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
-    to_host_path_cmd="func_convert_path_${func_stripname_result}"
-  fi
-}
-
-
-# func_to_host_path ARG
-# Converts the path ARG from $build format to $host format. Return result
-# in func_to_host_path_result.
-func_to_host_path ()
-{
-  $opt_debug
-  func_init_to_host_path_cmd
-  $to_host_path_cmd "$1"
-}
-# end func_to_host_path
-
-
-# func_convert_path_noop ARG
-# Copy ARG to func_to_host_path_result.
-func_convert_path_noop ()
-{
-  func_to_host_path_result="$1"
-}
-# end func_convert_path_noop
-
-
-# func_convert_path_msys_to_w32 ARG
-# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
-# conversion to w32 is not available inside the cwrapper.  Returns result in
-# func_to_host_path_result.
-func_convert_path_msys_to_w32 ()
-{
-  $opt_debug
-  func_to_host_path_result="$1"
-  if test -n "$1"; then
-    # Remove leading and trailing path separator characters from ARG.  MSYS
-    # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
-    # and winepath ignores them completely.
-    func_stripname : : "$1"
-    func_to_host_path_tmp1=$func_stripname_result
-    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
-    func_to_host_path_result="$func_convert_core_msys_to_w32_result"
-    func_convert_path_check : ";" \
-      "$func_to_host_path_tmp1" "$func_to_host_path_result"
-    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
-  fi
-}
-# end func_convert_path_msys_to_w32
-
-
-# func_convert_path_cygwin_to_w32 ARG
-# Convert path ARG from Cygwin to w32 format.  Returns result in
-# func_to_host_file_result.
-func_convert_path_cygwin_to_w32 ()
-{
-  $opt_debug
-  func_to_host_path_result="$1"
-  if test -n "$1"; then
-    # See func_convert_path_msys_to_w32:
-    func_stripname : : "$1"
-    func_to_host_path_tmp1=$func_stripname_result
-    func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
-    func_convert_path_check : ";" \
-      "$func_to_host_path_tmp1" "$func_to_host_path_result"
-    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
-  fi
-}
-# end func_convert_path_cygwin_to_w32
-
-
-# func_convert_path_nix_to_w32 ARG
-# Convert path ARG from *nix to w32 format.  Requires a wine environment and
-# a working winepath.  Returns result in func_to_host_file_result.
-func_convert_path_nix_to_w32 ()
-{
-  $opt_debug
-  func_to_host_path_result="$1"
-  if test -n "$1"; then
-    # See func_convert_path_msys_to_w32:
-    func_stripname : : "$1"
-    func_to_host_path_tmp1=$func_stripname_result
-    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
-    func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
-    func_convert_path_check : ";" \
-      "$func_to_host_path_tmp1" "$func_to_host_path_result"
-    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
-  fi
-}
-# end func_convert_path_nix_to_w32
-
-
-# func_convert_path_msys_to_cygwin ARG
-# Convert path ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
-# Returns result in func_to_host_file_result.
-func_convert_path_msys_to_cygwin ()
-{
-  $opt_debug
-  func_to_host_path_result="$1"
-  if test -n "$1"; then
-    # See func_convert_path_msys_to_w32:
-    func_stripname : : "$1"
-    func_to_host_path_tmp1=$func_stripname_result
-    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
-    func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
-    func_to_host_path_result="$func_cygpath_result"
-    func_convert_path_check : : \
-      "$func_to_host_path_tmp1" "$func_to_host_path_result"
-    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
-  fi
-}
-# end func_convert_path_msys_to_cygwin
-
-
-# func_convert_path_nix_to_cygwin ARG
-# Convert path ARG from *nix to Cygwin format.  Requires Cygwin installed in a
-# a wine environment, working winepath, and LT_CYGPATH set.  Returns result in
-# func_to_host_file_result.
-func_convert_path_nix_to_cygwin ()
-{
-  $opt_debug
-  func_to_host_path_result="$1"
-  if test -n "$1"; then
-    # Remove leading and trailing path separator characters from
-    # ARG. msys behavior is inconsistent here, cygpath turns them
-    # into '.;' and ';.', and winepath ignores them completely.
-    func_stripname : : "$1"
-    func_to_host_path_tmp1=$func_stripname_result
-    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
-    func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
-    func_to_host_path_result="$func_cygpath_result"
-    func_convert_path_check : : \
-      "$func_to_host_path_tmp1" "$func_to_host_path_result"
-    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
-  fi
-}
-# end func_convert_path_nix_to_cygwin
-
-
-# func_mode_compile arg...
-func_mode_compile ()
-{
-    $opt_debug
-    # Get the compilation command and the source file.
-    base_compile=
-    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
-    suppress_opt=yes
-    suppress_output=
-    arg_mode=normal
-    libobj=
-    later=
-    pie_flag=
-
-    for arg
-    do
-      case $arg_mode in
-      arg  )
-	# do not "continue".  Instead, add this to base_compile
-	lastarg="$arg"
-	arg_mode=normal
-	;;
-
-      target )
-	libobj="$arg"
-	arg_mode=normal
-	continue
-	;;
-
-      normal )
-	# Accept any command-line options.
-	case $arg in
-	-o)
-	  test -n "$libobj" && \
-	    func_fatal_error "you cannot specify \`-o' more than once"
-	  arg_mode=target
-	  continue
-	  ;;
-
-	-pie | -fpie | -fPIE)
-          func_append pie_flag " $arg"
-	  continue
-	  ;;
-
-	-shared | -static | -prefer-pic | -prefer-non-pic)
-	  func_append later " $arg"
-	  continue
-	  ;;
-
-	-no-suppress)
-	  suppress_opt=no
-	  continue
-	  ;;
-
-	-Xcompiler)
-	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
-	  continue      #  The current "srcfile" will either be retained or
-	  ;;            #  replaced later.  I would guess that would be a bug.
-
-	-Wc,*)
-	  func_stripname '-Wc,' '' "$arg"
-	  args=$func_stripname_result
-	  lastarg=
-	  save_ifs="$IFS"; IFS=','
-	  for arg in $args; do
-	    IFS="$save_ifs"
-	    func_append_quoted lastarg "$arg"
-	  done
-	  IFS="$save_ifs"
-	  func_stripname ' ' '' "$lastarg"
-	  lastarg=$func_stripname_result
-
-	  # Add the arguments to base_compile.
-	  func_append base_compile " $lastarg"
-	  continue
-	  ;;
-
-	*)
-	  # Accept the current argument as the source file.
-	  # The previous "srcfile" becomes the current argument.
-	  #
-	  lastarg="$srcfile"
-	  srcfile="$arg"
-	  ;;
-	esac  #  case $arg
-	;;
-      esac    #  case $arg_mode
-
-      # Aesthetically quote the previous argument.
-      func_append_quoted base_compile "$lastarg"
-    done # for arg
-
-    case $arg_mode in
-    arg)
-      func_fatal_error "you must specify an argument for -Xcompile"
-      ;;
-    target)
-      func_fatal_error "you must specify a target with \`-o'"
-      ;;
-    *)
-      # Get the name of the library object.
-      test -z "$libobj" && {
-	func_basename "$srcfile"
-	libobj="$func_basename_result"
-      }
-      ;;
-    esac
-
-    # Recognize several different file suffixes.
-    # If the user specifies -o file.o, it is replaced with file.lo
-    case $libobj in
-    *.[cCFSifmso] | \
-    *.ada | *.adb | *.ads | *.asm | \
-    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
-    *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
-      func_xform "$libobj"
-      libobj=$func_xform_result
-      ;;
-    esac
-
-    case $libobj in
-    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
-    *)
-      func_fatal_error "cannot determine name of library object from \`$libobj'"
-      ;;
-    esac
-
-    func_infer_tag $base_compile
-
-    for arg in $later; do
-      case $arg in
-      -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
-	build_old_libs=no
-	continue
-	;;
-
-      -static)
-	build_libtool_libs=no
-	build_old_libs=yes
-	continue
-	;;
-
-      -prefer-pic)
-	pic_mode=yes
-	continue
-	;;
-
-      -prefer-non-pic)
-	pic_mode=no
-	continue
-	;;
-      esac
-    done
-
-    func_quote_for_eval "$libobj"
-    test "X$libobj" != "X$func_quote_for_eval_result" \
-      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
-      && func_warning "libobj name \`$libobj' may not contain shell special characters."
-    func_dirname_and_basename "$obj" "/" ""
-    objname="$func_basename_result"
-    xdir="$func_dirname_result"
-    lobj=${xdir}$objdir/$objname
-
-    test -z "$base_compile" && \
-      func_fatal_help "you must specify a compilation command"
-
-    # Delete any leftover library objects.
-    if test "$build_old_libs" = yes; then
-      removelist="$obj $lobj $libobj ${libobj}T"
-    else
-      removelist="$lobj $libobj ${libobj}T"
-    fi
-
-    # On Cygwin there's no "real" PIC flag so we must build both object types
-    case $host_os in
-    cygwin* | mingw* | pw32* | os2* | cegcc*)
-      pic_mode=default
-      ;;
-    esac
-    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
-      # non-PIC code in shared libraries is not supported
-      pic_mode=default
-    fi
-
-    # Calculate the filename of the output object if compiler does
-    # not support -o with -c
-    if test "$compiler_c_o" = no; then
-      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
-      lockfile="$output_obj.lock"
-    else
-      output_obj=
-      need_locks=no
-      lockfile=
-    fi
-
-    # Lock this critical section if it is needed
-    # We use this script file to make the link, it avoids creating a new file
-    if test "$need_locks" = yes; then
-      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
-	func_echo "Waiting for $lockfile to be removed"
-	sleep 2
-      done
-    elif test "$need_locks" = warn; then
-      if test -f "$lockfile"; then
-	$ECHO "\
-*** ERROR, $lockfile exists and contains:
-`cat $lockfile 2>/dev/null`
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-      func_append removelist " $output_obj"
-      $ECHO "$srcfile" > "$lockfile"
-    fi
-
-    $opt_dry_run || $RM $removelist
-    func_append removelist " $lockfile"
-    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
-
-    func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
-    srcfile=$func_to_tool_file_result
-    func_quote_for_eval "$srcfile"
-    qsrcfile=$func_quote_for_eval_result
-
-    # Only build a PIC object if we are building libtool libraries.
-    if test "$build_libtool_libs" = yes; then
-      # Without this assignment, base_compile gets emptied.
-      fbsd_hideous_sh_bug=$base_compile
-
-      if test "$pic_mode" != no; then
-	command="$base_compile $qsrcfile $pic_flag"
-      else
-	# Don't build PIC code
-	command="$base_compile $qsrcfile"
-      fi
-
-      func_mkdir_p "$xdir$objdir"
-
-      if test -z "$output_obj"; then
-	# Place PIC objects in $objdir
-	func_append command " -o $lobj"
-      fi
-
-      func_show_eval_locale "$command"	\
-          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
-
-      if test "$need_locks" = warn &&
-	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$ECHO "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-
-      # Just move the object if needed, then go on to compile the next one
-      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
-	func_show_eval '$MV "$output_obj" "$lobj"' \
-	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
-      fi
-
-      # Allow error messages only from the first compilation.
-      if test "$suppress_opt" = yes; then
-	suppress_output=' >/dev/null 2>&1'
-      fi
-    fi
-
-    # Only build a position-dependent object if we build old libraries.
-    if test "$build_old_libs" = yes; then
-      if test "$pic_mode" != yes; then
-	# Don't build PIC code
-	command="$base_compile $qsrcfile$pie_flag"
-      else
-	command="$base_compile $qsrcfile $pic_flag"
-      fi
-      if test "$compiler_c_o" = yes; then
-	func_append command " -o $obj"
-      fi
-
-      # Suppress compiler output if we already did a PIC compilation.
-      func_append command "$suppress_output"
-      func_show_eval_locale "$command" \
-        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
-
-      if test "$need_locks" = warn &&
-	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$ECHO "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-
-      # Just move the object if needed
-      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
-	func_show_eval '$MV "$output_obj" "$obj"' \
-	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
-      fi
-    fi
-
-    $opt_dry_run || {
-      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
-
-      # Unlock the critical section if it was locked
-      if test "$need_locks" != no; then
-	removelist=$lockfile
-        $RM "$lockfile"
-      fi
-    }
-
-    exit $EXIT_SUCCESS
-}
-
-$opt_help || {
-  test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
-}
-
-func_mode_help ()
-{
-    # We need to display help for each of the modes.
-    case $opt_mode in
-      "")
-        # Generic help is extracted from the usage comments
-        # at the start of this file.
-        func_help
-        ;;
-
-      clean)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
-
-Remove files from the build directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, object or program, all the files associated
-with it are deleted. Otherwise, only FILE itself is deleted using RM."
-        ;;
-
-      compile)
-      $ECHO \
-"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
-
-Compile a source file into a libtool library object.
-
-This mode accepts the following additional options:
-
-  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
-  -no-suppress      do not suppress compiler output for multiple passes
-  -prefer-pic       try to build PIC objects only
-  -prefer-non-pic   try to build non-PIC objects only
-  -shared           do not build a \`.o' file suitable for static linking
-  -static           only build a \`.o' file suitable for static linking
-  -Wc,FLAG          pass FLAG directly to the compiler
-
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
-from the given SOURCEFILE.
-
-The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
-        ;;
-
-      execute)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
-
-Automatically set library path, then run a program.
-
-This mode accepts the following additional options:
-
-  -dlopen FILE      add the directory containing FILE to the library path
-
-This mode sets the library path environment variable according to \`-dlopen'
-flags.
-
-If any of the ARGS are libtool executable wrappers, then they are translated
-into their corresponding uninstalled binary, and any of their required library
-directories are added to the library path.
-
-Then, COMMAND is executed, with ARGS as arguments."
-        ;;
-
-      finish)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
-
-Complete the installation of libtool libraries.
-
-Each LIBDIR is a directory that contains libtool libraries.
-
-The commands that this mode executes may require superuser privileges.  Use
-the \`--dry-run' option if you just want to see what would be executed."
-        ;;
-
-      install)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
-
-Install executables or libraries.
-
-INSTALL-COMMAND is the installation command.  The first component should be
-either the \`install' or \`cp' program.
-
-The following components of INSTALL-COMMAND are treated specially:
-
-  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
-
-The rest of the components are interpreted as arguments to that command (only
-BSD-compatible install options are recognized)."
-        ;;
-
-      link)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
-
-Link object files or libraries together to form another library, or to
-create an executable program.
-
-LINK-COMMAND is a command using the C compiler that you would use to create
-a program from several object files.
-
-The following components of LINK-COMMAND are treated specially:
-
-  -all-static       do not do any dynamic linking at all
-  -avoid-version    do not add a version suffix if possible
-  -bindir BINDIR    specify path to binaries directory (for systems where
-                    libraries must be found in the PATH setting at runtime)
-  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
-  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
-  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
-  -export-symbols SYMFILE
-                    try to export only the symbols listed in SYMFILE
-  -export-symbols-regex REGEX
-                    try to export only the symbols matching REGEX
-  -LLIBDIR          search LIBDIR for required installed libraries
-  -lNAME            OUTPUT-FILE requires the installed library libNAME
-  -module           build a library that can dlopened
-  -no-fast-install  disable the fast-install mode
-  -no-install       link a not-installable executable
-  -no-undefined     declare that a library does not refer to external symbols
-  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
-  -objectlist FILE  Use a list of object files found in FILE to specify objects
-  -precious-files-regex REGEX
-                    don't remove output files matching REGEX
-  -release RELEASE  specify package release information
-  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
-  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
-  -shared           only do dynamic linking of libtool libraries
-  -shrext SUFFIX    override the standard shared library file extension
-  -static           do not do any dynamic linking of uninstalled libtool libraries
-  -static-libtool-libs
-                    do not do any dynamic linking of libtool libraries
-  -version-info CURRENT[:REVISION[:AGE]]
-                    specify library version info [each variable defaults to 0]
-  -weak LIBNAME     declare that the target provides the LIBNAME interface
-  -Wc,FLAG
-  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
-  -Wl,FLAG
-  -Xlinker FLAG     pass linker-specific FLAG directly to the linker
-  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
-
-All other options (arguments beginning with \`-') are ignored.
-
-Every other argument is treated as a filename.  Files ending in \`.la' are
-treated as uninstalled libtool libraries, other files are standard or library
-object files.
-
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
-required, except when creating a convenience library.
-
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
-
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
-is created, otherwise an executable program is created."
-        ;;
-
-      uninstall)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
-
-Remove libraries from an installation directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, all the files associated with it are deleted.
-Otherwise, only FILE itself is deleted using RM."
-        ;;
-
-      *)
-        func_fatal_help "invalid operation mode \`$opt_mode'"
-        ;;
-    esac
-
-    echo
-    $ECHO "Try \`$progname --help' for more information about other modes."
-}
-
-# Now that we've collected a possible --mode arg, show help if necessary
-if $opt_help; then
-  if test "$opt_help" = :; then
-    func_mode_help
-  else
-    {
-      func_help noexit
-      for opt_mode in compile link execute install finish uninstall clean; do
-	func_mode_help
-      done
-    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
-    {
-      func_help noexit
-      for opt_mode in compile link execute install finish uninstall clean; do
-	echo
-	func_mode_help
-      done
-    } |
-    sed '1d
-      /^When reporting/,/^Report/{
-	H
-	d
-      }
-      $x
-      /information about other modes/d
-      /more detailed .*MODE/d
-      s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
-  fi
-  exit $?
-fi
-
-
-# func_mode_execute arg...
-func_mode_execute ()
-{
-    $opt_debug
-    # The first argument is the command name.
-    cmd="$nonopt"
-    test -z "$cmd" && \
-      func_fatal_help "you must specify a COMMAND"
-
-    # Handle -dlopen flags immediately.
-    for file in $opt_dlopen; do
-      test -f "$file" \
-	|| func_fatal_help "\`$file' is not a file"
-
-      dir=
-      case $file in
-      *.la)
-	func_resolve_sysroot "$file"
-	file=$func_resolve_sysroot_result
-
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$lib' is not a valid libtool archive"
-
-	# Read the libtool library.
-	dlname=
-	library_names=
-	func_source "$file"
-
-	# Skip this library if it cannot be dlopened.
-	if test -z "$dlname"; then
-	  # Warn if it was a shared library.
-	  test -n "$library_names" && \
-	    func_warning "\`$file' was not linked with \`-export-dynamic'"
-	  continue
-	fi
-
-	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
-
-	if test -f "$dir/$objdir/$dlname"; then
-	  func_append dir "/$objdir"
-	else
-	  if test ! -f "$dir/$dlname"; then
-	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
-	  fi
-	fi
-	;;
-
-      *.lo)
-	# Just add the directory containing the .lo file.
-	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
-	;;
-
-      *)
-	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
-	continue
-	;;
-      esac
-
-      # Get the absolute pathname.
-      absdir=`cd "$dir" && pwd`
-      test -n "$absdir" && dir="$absdir"
-
-      # Now add the directory to shlibpath_var.
-      if eval "test -z \"\$$shlibpath_var\""; then
-	eval "$shlibpath_var=\"\$dir\""
-      else
-	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
-      fi
-    done
-
-    # This variable tells wrapper scripts just to set shlibpath_var
-    # rather than running their programs.
-    libtool_execute_magic="$magic"
-
-    # Check if any of the arguments is a wrapper script.
-    args=
-    for file
-    do
-      case $file in
-      -* | *.la | *.lo ) ;;
-      *)
-	# Do a test to see if this is really a libtool program.
-	if func_ltwrapper_script_p "$file"; then
-	  func_source "$file"
-	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
-	elif func_ltwrapper_executable_p "$file"; then
-	  func_ltwrapper_scriptname "$file"
-	  func_source "$func_ltwrapper_scriptname_result"
-	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
-	fi
-	;;
-      esac
-      # Quote arguments (to preserve shell metacharacters).
-      func_append_quoted args "$file"
-    done
-
-    if test "X$opt_dry_run" = Xfalse; then
-      if test -n "$shlibpath_var"; then
-	# Export the shlibpath_var.
-	eval "export $shlibpath_var"
-      fi
-
-      # Restore saved environment variables
-      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-      do
-	eval "if test \"\${save_$lt_var+set}\" = set; then
-                $lt_var=\$save_$lt_var; export $lt_var
-	      else
-		$lt_unset $lt_var
-	      fi"
-      done
-
-      # Now prepare to actually exec the command.
-      exec_cmd="\$cmd$args"
-    else
-      # Display what would be done.
-      if test -n "$shlibpath_var"; then
-	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
-	echo "export $shlibpath_var"
-      fi
-      $ECHO "$cmd$args"
-      exit $EXIT_SUCCESS
-    fi
-}
-
-test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
-
-
-# func_mode_finish arg...
-func_mode_finish ()
-{
-    $opt_debug
-    libs=
-    libdirs=
-    admincmds=
-
-    for opt in "$nonopt" ${1+"$@"}
-    do
-      if test -d "$opt"; then
-	func_append libdirs " $opt"
-
-      elif test -f "$opt"; then
-	if func_lalib_unsafe_p "$opt"; then
-	  func_append libs " $opt"
-	else
-	  func_warning "\`$opt' is not a valid libtool archive"
-	fi
-
-      else
-	func_fatal_error "invalid argument \`$opt'"
-      fi
-    done
-
-    if test -n "$libs"; then
-      if test -n "$lt_sysroot"; then
-        sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
-        sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
-      else
-        sysroot_cmd=
-      fi
-
-      # Remove sysroot references
-      if $opt_dry_run; then
-        for lib in $libs; do
-          echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
-        done
-      else
-        tmpdir=`func_mktempdir`
-        for lib in $libs; do
-	  sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
-	    > $tmpdir/tmp-la
-	  mv -f $tmpdir/tmp-la $lib
-	done
-        ${RM}r "$tmpdir"
-      fi
-    fi
-
-    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
-      for libdir in $libdirs; do
-	if test -n "$finish_cmds"; then
-	  # Do each command in the finish commands.
-	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
-'"$cmd"'"'
-	fi
-	if test -n "$finish_eval"; then
-	  # Do the single finish_eval.
-	  eval cmds=\"$finish_eval\"
-	  $opt_dry_run || eval "$cmds" || func_append admincmds "
-       $cmds"
-	fi
-      done
-    fi
-
-    # Exit here if they wanted silent mode.
-    $opt_silent && exit $EXIT_SUCCESS
-
-    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
-      echo "----------------------------------------------------------------------"
-      echo "Libraries have been installed in:"
-      for libdir in $libdirs; do
-	$ECHO "   $libdir"
-      done
-      echo
-      echo "If you ever happen to want to link against installed libraries"
-      echo "in a given directory, LIBDIR, you must either use libtool, and"
-      echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
-      echo "flag during linking and do at least one of the following:"
-      if test -n "$shlibpath_var"; then
-	echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
-	echo "     during execution"
-      fi
-      if test -n "$runpath_var"; then
-	echo "   - add LIBDIR to the \`$runpath_var' environment variable"
-	echo "     during linking"
-      fi
-      if test -n "$hardcode_libdir_flag_spec"; then
-	libdir=LIBDIR
-	eval flag=\"$hardcode_libdir_flag_spec\"
-
-	$ECHO "   - use the \`$flag' linker flag"
-      fi
-      if test -n "$admincmds"; then
-	$ECHO "   - have your system administrator run these commands:$admincmds"
-      fi
-      if test -f /etc/ld.so.conf; then
-	echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
-      fi
-      echo
-
-      echo "See any operating system documentation about shared libraries for"
-      case $host in
-	solaris2.[6789]|solaris2.1[0-9])
-	  echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
-	  echo "pages."
-	  ;;
-	*)
-	  echo "more information, such as the ld(1) and ld.so(8) manual pages."
-	  ;;
-      esac
-      echo "----------------------------------------------------------------------"
-    fi
-    exit $EXIT_SUCCESS
-}
-
-test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
-
-
-# func_mode_install arg...
-func_mode_install ()
-{
-    $opt_debug
-    # There may be an optional sh(1) argument at the beginning of
-    # install_prog (especially on Windows NT).
-    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
-       # Allow the use of GNU shtool's install command.
-       case $nonopt in *shtool*) :;; *) false;; esac; then
-      # Aesthetically quote it.
-      func_quote_for_eval "$nonopt"
-      install_prog="$func_quote_for_eval_result "
-      arg=$1
-      shift
-    else
-      install_prog=
-      arg=$nonopt
-    fi
-
-    # The real first argument should be the name of the installation program.
-    # Aesthetically quote it.
-    func_quote_for_eval "$arg"
-    func_append install_prog "$func_quote_for_eval_result"
-    install_shared_prog=$install_prog
-    case " $install_prog " in
-      *[\\\ /]cp\ *) install_cp=: ;;
-      *) install_cp=false ;;
-    esac
-
-    # We need to accept at least all the BSD install flags.
-    dest=
-    files=
-    opts=
-    prev=
-    install_type=
-    isdir=no
-    stripme=
-    no_mode=:
-    for arg
-    do
-      arg2=
-      if test -n "$dest"; then
-	func_append files " $dest"
-	dest=$arg
-	continue
-      fi
-
-      case $arg in
-      -d) isdir=yes ;;
-      -f)
-	if $install_cp; then :; else
-	  prev=$arg
-	fi
-	;;
-      -g | -m | -o)
-	prev=$arg
-	;;
-      -s)
-	stripme=" -s"
-	continue
-	;;
-      -*)
-	;;
-      *)
-	# If the previous option needed an argument, then skip it.
-	if test -n "$prev"; then
-	  if test "x$prev" = x-m && test -n "$install_override_mode"; then
-	    arg2=$install_override_mode
-	    no_mode=false
-	  fi
-	  prev=
-	else
-	  dest=$arg
-	  continue
-	fi
-	;;
-      esac
-
-      # Aesthetically quote the argument.
-      func_quote_for_eval "$arg"
-      func_append install_prog " $func_quote_for_eval_result"
-      if test -n "$arg2"; then
-	func_quote_for_eval "$arg2"
-      fi
-      func_append install_shared_prog " $func_quote_for_eval_result"
-    done
-
-    test -z "$install_prog" && \
-      func_fatal_help "you must specify an install program"
-
-    test -n "$prev" && \
-      func_fatal_help "the \`$prev' option requires an argument"
-
-    if test -n "$install_override_mode" && $no_mode; then
-      if $install_cp; then :; else
-	func_quote_for_eval "$install_override_mode"
-	func_append install_shared_prog " -m $func_quote_for_eval_result"
-      fi
-    fi
-
-    if test -z "$files"; then
-      if test -z "$dest"; then
-	func_fatal_help "no file or destination specified"
-      else
-	func_fatal_help "you must specify a destination"
-      fi
-    fi
-
-    # Strip any trailing slash from the destination.
-    func_stripname '' '/' "$dest"
-    dest=$func_stripname_result
-
-    # Check to see that the destination is a directory.
-    test -d "$dest" && isdir=yes
-    if test "$isdir" = yes; then
-      destdir="$dest"
-      destname=
-    else
-      func_dirname_and_basename "$dest" "" "."
-      destdir="$func_dirname_result"
-      destname="$func_basename_result"
-
-      # Not a directory, so check to see that there is only one file specified.
-      set dummy $files; shift
-      test "$#" -gt 1 && \
-	func_fatal_help "\`$dest' is not a directory"
-    fi
-    case $destdir in
-    [\\/]* | [A-Za-z]:[\\/]*) ;;
-    *)
-      for file in $files; do
-	case $file in
-	*.lo) ;;
-	*)
-	  func_fatal_help "\`$destdir' must be an absolute directory name"
-	  ;;
-	esac
-      done
-      ;;
-    esac
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    staticlibs=
-    future_libdirs=
-    current_libdirs=
-    for file in $files; do
-
-      # Do each installation.
-      case $file in
-      *.$libext)
-	# Do the static libraries later.
-	func_append staticlibs " $file"
-	;;
-
-      *.la)
-	func_resolve_sysroot "$file"
-	file=$func_resolve_sysroot_result
-
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$file' is not a valid libtool archive"
-
-	library_names=
-	old_library=
-	relink_command=
-	func_source "$file"
-
-	# Add the libdir to current_libdirs if it is the destination.
-	if test "X$destdir" = "X$libdir"; then
-	  case "$current_libdirs " in
-	  *" $libdir "*) ;;
-	  *) func_append current_libdirs " $libdir" ;;
-	  esac
-	else
-	  # Note the libdir as a future libdir.
-	  case "$future_libdirs " in
-	  *" $libdir "*) ;;
-	  *) func_append future_libdirs " $libdir" ;;
-	  esac
-	fi
-
-	func_dirname "$file" "/" ""
-	dir="$func_dirname_result"
-	func_append dir "$objdir"
-
-	if test -n "$relink_command"; then
-	  # Determine the prefix the user has applied to our future dir.
-	  inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
-
-	  # Don't allow the user to place us outside of our expected
-	  # location b/c this prevents finding dependent libraries that
-	  # are installed to the same prefix.
-	  # At present, this check doesn't affect windows .dll's that
-	  # are installed into $libdir/../bin (currently, that works fine)
-	  # but it's something to keep an eye on.
-	  test "$inst_prefix_dir" = "$destdir" && \
-	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
-
-	  if test -n "$inst_prefix_dir"; then
-	    # Stick the inst_prefix_dir data into the link command.
-	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
-	  else
-	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
-	  fi
-
-	  func_warning "relinking \`$file'"
-	  func_show_eval "$relink_command" \
-	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
-	fi
-
-	# See the names of the shared library.
-	set dummy $library_names; shift
-	if test -n "$1"; then
-	  realname="$1"
-	  shift
-
-	  srcname="$realname"
-	  test -n "$relink_command" && srcname="$realname"T
-
-	  # Install the shared library and build the symlinks.
-	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
-	      'exit $?'
-	  tstripme="$stripme"
-	  case $host_os in
-	  cygwin* | mingw* | pw32* | cegcc*)
-	    case $realname in
-	    *.dll.a)
-	      tstripme=""
-	      ;;
-	    esac
-	    ;;
-	  esac
-	  if test -n "$tstripme" && test -n "$striplib"; then
-	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
-	  fi
-
-	  if test "$#" -gt 0; then
-	    # Delete the old symlinks, and create new ones.
-	    # Try `ln -sf' first, because the `ln' binary might depend on
-	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
-	    # so we also need to try rm && ln -s.
-	    for linkname
-	    do
-	      test "$linkname" != "$realname" \
-		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
-	    done
-	  fi
-
-	  # Do each command in the postinstall commands.
-	  lib="$destdir/$realname"
-	  func_execute_cmds "$postinstall_cmds" 'exit $?'
-	fi
-
-	# Install the pseudo-library for information purposes.
-	func_basename "$file"
-	name="$func_basename_result"
-	instname="$dir/$name"i
-	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
-
-	# Maybe install the static library, too.
-	test -n "$old_library" && func_append staticlibs " $dir/$old_library"
-	;;
-
-      *.lo)
-	# Install (i.e. copy) a libtool object.
-
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
-	else
-	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
-	fi
-
-	# Deduce the name of the destination old-style object file.
-	case $destfile in
-	*.lo)
-	  func_lo2o "$destfile"
-	  staticdest=$func_lo2o_result
-	  ;;
-	*.$objext)
-	  staticdest="$destfile"
-	  destfile=
-	  ;;
-	*)
-	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
-	  ;;
-	esac
-
-	# Install the libtool object if requested.
-	test -n "$destfile" && \
-	  func_show_eval "$install_prog $file $destfile" 'exit $?'
-
-	# Install the old object if enabled.
-	if test "$build_old_libs" = yes; then
-	  # Deduce the name of the old-style object file.
-	  func_lo2o "$file"
-	  staticobj=$func_lo2o_result
-	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
-	fi
-	exit $EXIT_SUCCESS
-	;;
-
-      *)
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
-	else
-	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
-	fi
-
-	# If the file is missing, and there is a .exe on the end, strip it
-	# because it is most likely a libtool script we actually want to
-	# install
-	stripped_ext=""
-	case $file in
-	  *.exe)
-	    if test ! -f "$file"; then
-	      func_stripname '' '.exe' "$file"
-	      file=$func_stripname_result
-	      stripped_ext=".exe"
-	    fi
-	    ;;
-	esac
-
-	# Do a test to see if this is really a libtool program.
-	case $host in
-	*cygwin* | *mingw*)
-	    if func_ltwrapper_executable_p "$file"; then
-	      func_ltwrapper_scriptname "$file"
-	      wrapper=$func_ltwrapper_scriptname_result
-	    else
-	      func_stripname '' '.exe' "$file"
-	      wrapper=$func_stripname_result
-	    fi
-	    ;;
-	*)
-	    wrapper=$file
-	    ;;
-	esac
-	if func_ltwrapper_script_p "$wrapper"; then
-	  notinst_deplibs=
-	  relink_command=
-
-	  func_source "$wrapper"
-
-	  # Check the variables that should have been set.
-	  test -z "$generated_by_libtool_version" && \
-	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
-
-	  finalize=yes
-	  for lib in $notinst_deplibs; do
-	    # Check to see that each library is installed.
-	    libdir=
-	    if test -f "$lib"; then
-	      func_source "$lib"
-	    fi
-	    libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
-	    if test -n "$libdir" && test ! -f "$libfile"; then
-	      func_warning "\`$lib' has not been installed in \`$libdir'"
-	      finalize=no
-	    fi
-	  done
-
-	  relink_command=
-	  func_source "$wrapper"
-
-	  outputname=
-	  if test "$fast_install" = no && test -n "$relink_command"; then
-	    $opt_dry_run || {
-	      if test "$finalize" = yes; then
-	        tmpdir=`func_mktempdir`
-		func_basename "$file$stripped_ext"
-		file="$func_basename_result"
-	        outputname="$tmpdir/$file"
-	        # Replace the output file specification.
-	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
-
-	        $opt_silent || {
-	          func_quote_for_expand "$relink_command"
-		  eval "func_echo $func_quote_for_expand_result"
-	        }
-	        if eval "$relink_command"; then :
-	          else
-		  func_error "error: relink \`$file' with the above command before installing it"
-		  $opt_dry_run || ${RM}r "$tmpdir"
-		  continue
-	        fi
-	        file="$outputname"
-	      else
-	        func_warning "cannot relink \`$file'"
-	      fi
-	    }
-	  else
-	    # Install the binary that we compiled earlier.
-	    file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
-	  fi
-	fi
-
-	# remove .exe since cygwin /usr/bin/install will append another
-	# one anyway
-	case $install_prog,$host in
-	*/usr/bin/install*,*cygwin*)
-	  case $file:$destfile in
-	  *.exe:*.exe)
-	    # this is ok
-	    ;;
-	  *.exe:*)
-	    destfile=$destfile.exe
-	    ;;
-	  *:*.exe)
-	    func_stripname '' '.exe' "$destfile"
-	    destfile=$func_stripname_result
-	    ;;
-	  esac
-	  ;;
-	esac
-	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
-	$opt_dry_run || if test -n "$outputname"; then
-	  ${RM}r "$tmpdir"
-	fi
-	;;
-      esac
-    done
-
-    for file in $staticlibs; do
-      func_basename "$file"
-      name="$func_basename_result"
-
-      # Set up the ranlib parameters.
-      oldlib="$destdir/$name"
-      func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
-      tool_oldlib=$func_to_tool_file_result
-
-      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
-
-      if test -n "$stripme" && test -n "$old_striplib"; then
-	func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
-      fi
-
-      # Do each command in the postinstall commands.
-      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
-    done
-
-    test -n "$future_libdirs" && \
-      func_warning "remember to run \`$progname --finish$future_libdirs'"
-
-    if test -n "$current_libdirs"; then
-      # Maybe just do a dry run.
-      $opt_dry_run && current_libdirs=" -n$current_libdirs"
-      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
-    else
-      exit $EXIT_SUCCESS
-    fi
-}
-
-test "$opt_mode" = install && func_mode_install ${1+"$@"}
-
-
-# func_generate_dlsyms outputname originator pic_p
-# Extract symbols from dlprefiles and create ${outputname}S.o with
-# a dlpreopen symbol table.
-func_generate_dlsyms ()
-{
-    $opt_debug
-    my_outputname="$1"
-    my_originator="$2"
-    my_pic_p="${3-no}"
-    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
-    my_dlsyms=
-
-    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-      if test -n "$NM" && test -n "$global_symbol_pipe"; then
-	my_dlsyms="${my_outputname}S.c"
-      else
-	func_error "not configured to extract global symbols from dlpreopened files"
-      fi
-    fi
-
-    if test -n "$my_dlsyms"; then
-      case $my_dlsyms in
-      "") ;;
-      *.c)
-	# Discover the nlist of each of the dlfiles.
-	nlist="$output_objdir/${my_outputname}.nm"
-
-	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
-
-	# Parse the name list into a source file.
-	func_verbose "creating $output_objdir/$my_dlsyms"
-
-	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
-/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
-/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
-
-#ifdef __cplusplus
-extern \"C\" {
-#endif
-
-#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
-#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
-#endif
-
-/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
-   relocations are performed -- see ld's documentation on pseudo-relocs.  */
-# define LT_DLSYM_CONST
-#elif defined(__osf__)
-/* This system does not cope well with relocations in const data.  */
-# define LT_DLSYM_CONST
-#else
-# define LT_DLSYM_CONST const
-#endif
-
-/* External symbol declarations for the compiler. */\
-"
-
-	if test "$dlself" = yes; then
-	  func_verbose "generating symbol list for \`$output'"
-
-	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
-
-	  # Add our own program objects to the symbol list.
-	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
-	  for progfile in $progfiles; do
-	    func_to_tool_file "$progfile" func_convert_file_msys_to_w32
-	    func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
-	    $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
-	  done
-
-	  if test -n "$exclude_expsyms"; then
-	    $opt_dry_run || {
-	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
-	      eval '$MV "$nlist"T "$nlist"'
-	    }
-	  fi
-
-	  if test -n "$export_symbols_regex"; then
-	    $opt_dry_run || {
-	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
-	      eval '$MV "$nlist"T "$nlist"'
-	    }
-	  fi
-
-	  # Prepare the list of exported symbols
-	  if test -z "$export_symbols"; then
-	    export_symbols="$output_objdir/$outputname.exp"
-	    $opt_dry_run || {
-	      $RM $export_symbols
-	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
-	      case $host in
-	      *cygwin* | *mingw* | *cegcc* )
-                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
-                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
-	        ;;
-	      esac
-	    }
-	  else
-	    $opt_dry_run || {
-	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
-	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
-	      eval '$MV "$nlist"T "$nlist"'
-	      case $host in
-	        *cygwin* | *mingw* | *cegcc* )
-	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
-	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
-	          ;;
-	      esac
-	    }
-	  fi
-	fi
-
-	for dlprefile in $dlprefiles; do
-	  func_verbose "extracting global C symbols from \`$dlprefile'"
-	  func_basename "$dlprefile"
-	  name="$func_basename_result"
-          case $host in
-	    *cygwin* | *mingw* | *cegcc* )
-	      # if an import library, we need to obtain dlname
-	      if func_win32_import_lib_p "$dlprefile"; then
-	        func_tr_sh "$dlprefile"
-	        eval "curr_lafile=\$libfile_$func_tr_sh_result"
-	        dlprefile_dlbasename=""
-	        if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
-	          # Use subshell, to avoid clobbering current variable values
-	          dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
-	          if test -n "$dlprefile_dlname" ; then
-	            func_basename "$dlprefile_dlname"
-	            dlprefile_dlbasename="$func_basename_result"
-	          else
-	            # no lafile. user explicitly requested -dlpreopen <import library>.
-	            $sharedlib_from_linklib_cmd "$dlprefile"
-	            dlprefile_dlbasename=$sharedlib_from_linklib_result
-	          fi
-	        fi
-	        $opt_dry_run || {
-	          if test -n "$dlprefile_dlbasename" ; then
-	            eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
-	          else
-	            func_warning "Could not compute DLL name from $name"
-	            eval '$ECHO ": $name " >> "$nlist"'
-	          fi
-	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
-	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
-	            $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
-	        }
-	      else # not an import lib
-	        $opt_dry_run || {
-	          eval '$ECHO ": $name " >> "$nlist"'
-	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
-	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
-	        }
-	      fi
-	    ;;
-	    *)
-	      $opt_dry_run || {
-	        eval '$ECHO ": $name " >> "$nlist"'
-	        func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
-	        eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
-	      }
-	    ;;
-          esac
-	done
-
-	$opt_dry_run || {
-	  # Make sure we have at least an empty file.
-	  test -f "$nlist" || : > "$nlist"
-
-	  if test -n "$exclude_expsyms"; then
-	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
-	    $MV "$nlist"T "$nlist"
-	  fi
-
-	  # Try sorting and uniquifying the output.
-	  if $GREP -v "^: " < "$nlist" |
-	      if sort -k 3 </dev/null >/dev/null 2>&1; then
-		sort -k 3
-	      else
-		sort +2
-	      fi |
-	      uniq > "$nlist"S; then
-	    :
-	  else
-	    $GREP -v "^: " < "$nlist" > "$nlist"S
-	  fi
-
-	  if test -f "$nlist"S; then
-	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
-	  else
-	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
-	  fi
-
-	  echo >> "$output_objdir/$my_dlsyms" "\
-
-/* The mapping between symbol names and symbols.  */
-typedef struct {
-  const char *name;
-  void *address;
-} lt_dlsymlist;
-extern LT_DLSYM_CONST lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[];
-LT_DLSYM_CONST lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[] =
-{\
-  { \"$my_originator\", (void *) 0 },"
-
-	  case $need_lib_prefix in
-	  no)
-	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
-	    ;;
-	  *)
-	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
-	    ;;
-	  esac
-	  echo >> "$output_objdir/$my_dlsyms" "\
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt_${my_prefix}_LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif\
-"
-	} # !$opt_dry_run
-
-	pic_flag_for_symtable=
-	case "$compile_command " in
-	*" -static "*) ;;
-	*)
-	  case $host in
-	  # compiling the symbol table file with pic_flag works around
-	  # a FreeBSD bug that causes programs to crash when -lm is
-	  # linked before any other PIC object.  But we must not use
-	  # pic_flag when linking with -static.  The problem exists in
-	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
-	  *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
-	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
-	  *-*-hpux*)
-	    pic_flag_for_symtable=" $pic_flag"  ;;
-	  *)
-	    if test "X$my_pic_p" != Xno; then
-	      pic_flag_for_symtable=" $pic_flag"
-	    fi
-	    ;;
-	  esac
-	  ;;
-	esac
-	symtab_cflags=
-	for arg in $LTCFLAGS; do
-	  case $arg in
-	  -pie | -fpie | -fPIE) ;;
-	  *) func_append symtab_cflags " $arg" ;;
-	  esac
-	done
-
-	# Now compile the dynamic symbol file.
-	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
-
-	# Clean up the generated files.
-	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
-
-	# Transform the symbol file into the correct name.
-	symfileobj="$output_objdir/${my_outputname}S.$objext"
-	case $host in
-	*cygwin* | *mingw* | *cegcc* )
-	  if test -f "$output_objdir/$my_outputname.def"; then
-	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
-	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
-	  else
-	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	  fi
-	  ;;
-	*)
-	  compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	  finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	  ;;
-	esac
-	;;
-      *)
-	func_fatal_error "unknown suffix for \`$my_dlsyms'"
-	;;
-      esac
-    else
-      # We keep going just in case the user didn't refer to
-      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
-      # really was required.
-
-      # Nullify the symbol file.
-      compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
-      finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
-    fi
-}
-
-# func_win32_libid arg
-# return the library type of file 'arg'
-#
-# Need a lot of goo to handle *both* DLLs and import libs
-# Has to be a shell function in order to 'eat' the argument
-# that is supplied when $file_magic_command is called.
-# Despite the name, also deal with 64 bit binaries.
-func_win32_libid ()
-{
-  $opt_debug
-  win32_libid_type="unknown"
-  win32_fileres=`file -L $1 2>/dev/null`
-  case $win32_fileres in
-  *ar\ archive\ import\ library*) # definitely import
-    win32_libid_type="x86 archive import"
-    ;;
-  *ar\ archive*) # could be an import, or static
-    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
-    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
-       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
-      func_to_tool_file "$1" func_convert_file_msys_to_w32
-      win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
-	$SED -n -e '
-	    1,100{
-		/ I /{
-		    s,.*,import,
-		    p
-		    q
-		}
-	    }'`
-      case $win32_nmres in
-      import*)  win32_libid_type="x86 archive import";;
-      *)        win32_libid_type="x86 archive static";;
-      esac
-    fi
-    ;;
-  *DLL*)
-    win32_libid_type="x86 DLL"
-    ;;
-  *executable*) # but shell scripts are "executable" too...
-    case $win32_fileres in
-    *MS\ Windows\ PE\ Intel*)
-      win32_libid_type="x86 DLL"
-      ;;
-    esac
-    ;;
-  esac
-  $ECHO "$win32_libid_type"
-}
-
-# func_cygming_dll_for_implib ARG
-#
-# Platform-specific function to extract the
-# name of the DLL associated with the specified
-# import library ARG.
-# Invoked by eval'ing the libtool variable
-#    $sharedlib_from_linklib_cmd
-# Result is available in the variable
-#    $sharedlib_from_linklib_result
-func_cygming_dll_for_implib ()
-{
-  $opt_debug
-  sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
-}
-
-# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
-#
-# The is the core of a fallback implementation of a
-# platform-specific function to extract the name of the
-# DLL associated with the specified import library LIBNAME.
-#
-# SECTION_NAME is either .idata$6 or .idata$7, depending
-# on the platform and compiler that created the implib.
-#
-# Echos the name of the DLL associated with the
-# specified import library.
-func_cygming_dll_for_implib_fallback_core ()
-{
-  $opt_debug
-  match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
-  $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
-    $SED '/^Contents of section '"$match_literal"':/{
-      # Place marker at beginning of archive member dllname section
-      s/.*/====MARK====/
-      p
-      d
-    }
-    # These lines can sometimes be longer than 43 characters, but
-    # are always uninteresting
-    /:[	 ]*file format pe[i]\{,1\}-/d
-    /^In archive [^:]*:/d
-    # Ensure marker is printed
-    /^====MARK====/p
-    # Remove all lines with less than 43 characters
-    /^.\{43\}/!d
-    # From remaining lines, remove first 43 characters
-    s/^.\{43\}//' |
-    $SED -n '
-      # Join marker and all lines until next marker into a single line
-      /^====MARK====/ b para
-      H
-      $ b para
-      b
-      :para
-      x
-      s/\n//g
-      # Remove the marker
-      s/^====MARK====//
-      # Remove trailing dots and whitespace
-      s/[\. \t]*$//
-      # Print
-      /./p' |
-    # we now have a list, one entry per line, of the stringified
-    # contents of the appropriate section of all members of the
-    # archive which possess that section. Heuristic: eliminate
-    # all those which have a first or second character that is
-    # a '.' (that is, objdump's representation of an unprintable
-    # character.) This should work for all archives with less than
-    # 0x302f exports -- but will fail for DLLs whose name actually
-    # begins with a literal '.' or a single character followed by
-    # a '.'.
-    #
-    # Of those that remain, print the first one.
-    $SED -e '/^\./d;/^.\./d;q'
-}
-
-# func_cygming_gnu_implib_p ARG
-# This predicate returns with zero status (TRUE) if
-# ARG is a GNU/binutils-style import library. Returns
-# with nonzero status (FALSE) otherwise.
-func_cygming_gnu_implib_p ()
-{
-  $opt_debug
-  func_to_tool_file "$1" func_convert_file_msys_to_w32
-  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
-  test -n "$func_cygming_gnu_implib_tmp"
-}
-
-# func_cygming_ms_implib_p ARG
-# This predicate returns with zero status (TRUE) if
-# ARG is an MS-style import library. Returns
-# with nonzero status (FALSE) otherwise.
-func_cygming_ms_implib_p ()
-{
-  $opt_debug
-  func_to_tool_file "$1" func_convert_file_msys_to_w32
-  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
-  test -n "$func_cygming_ms_implib_tmp"
-}
-
-# func_cygming_dll_for_implib_fallback ARG
-# Platform-specific function to extract the
-# name of the DLL associated with the specified
-# import library ARG.
-#
-# This fallback implementation is for use when $DLLTOOL
-# does not support the --identify-strict option.
-# Invoked by eval'ing the libtool variable
-#    $sharedlib_from_linklib_cmd
-# Result is available in the variable
-#    $sharedlib_from_linklib_result
-func_cygming_dll_for_implib_fallback ()
-{
-  $opt_debug
-  if func_cygming_gnu_implib_p "$1" ; then
-    # binutils import library
-    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
-  elif func_cygming_ms_implib_p "$1" ; then
-    # ms-generated import library
-    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
-  else
-    # unknown
-    sharedlib_from_linklib_result=""
-  fi
-}
-
-
-# func_extract_an_archive dir oldlib
-func_extract_an_archive ()
-{
-    $opt_debug
-    f_ex_an_ar_dir="$1"; shift
-    f_ex_an_ar_oldlib="$1"
-    if test "$lock_old_archive_extraction" = yes; then
-      lockfile=$f_ex_an_ar_oldlib.lock
-      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
-	func_echo "Waiting for $lockfile to be removed"
-	sleep 2
-      done
-    fi
-    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
-		   'stat=$?; rm -f "$lockfile"; exit $stat'
-    if test "$lock_old_archive_extraction" = yes; then
-      $opt_dry_run || rm -f "$lockfile"
-    fi
-    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
-     :
-    else
-      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
-    fi
-}
-
-
-# func_extract_archives gentop oldlib ...
-func_extract_archives ()
-{
-    $opt_debug
-    my_gentop="$1"; shift
-    my_oldlibs=${1+"$@"}
-    my_oldobjs=""
-    my_xlib=""
-    my_xabs=""
-    my_xdir=""
-
-    for my_xlib in $my_oldlibs; do
-      # Extract the objects.
-      case $my_xlib in
-	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
-	*) my_xabs=`pwd`"/$my_xlib" ;;
-      esac
-      func_basename "$my_xlib"
-      my_xlib="$func_basename_result"
-      my_xlib_u=$my_xlib
-      while :; do
-        case " $extracted_archives " in
-	*" $my_xlib_u "*)
-	  func_arith $extracted_serial + 1
-	  extracted_serial=$func_arith_result
-	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
-	*) break ;;
-	esac
-      done
-      extracted_archives="$extracted_archives $my_xlib_u"
-      my_xdir="$my_gentop/$my_xlib_u"
-
-      func_mkdir_p "$my_xdir"
-
-      case $host in
-      *-darwin*)
-	func_verbose "Extracting $my_xabs"
-	# Do not bother doing anything if just a dry run
-	$opt_dry_run || {
-	  darwin_orig_dir=`pwd`
-	  cd $my_xdir || exit $?
-	  darwin_archive=$my_xabs
-	  darwin_curdir=`pwd`
-	  darwin_base_archive=`basename "$darwin_archive"`
-	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
-	  if test -n "$darwin_arches"; then
-	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
-	    darwin_arch=
-	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
-	    for darwin_arch in  $darwin_arches ; do
-	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
-	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
-	      cd "$darwin_curdir"
-	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
-	    done # $darwin_arches
-            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
-	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
-	    darwin_file=
-	    darwin_files=
-	    for darwin_file in $darwin_filelist; do
-	      darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
-	      $LIPO -create -output "$darwin_file" $darwin_files
-	    done # $darwin_filelist
-	    $RM -rf unfat-$$
-	    cd "$darwin_orig_dir"
-	  else
-	    cd $darwin_orig_dir
-	    func_extract_an_archive "$my_xdir" "$my_xabs"
-	  fi # $darwin_arches
-	} # !$opt_dry_run
-	;;
-      *)
-        func_extract_an_archive "$my_xdir" "$my_xabs"
-	;;
-      esac
-      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
-    done
-
-    func_extract_archives_result="$my_oldobjs"
-}
-
-
-# func_emit_wrapper [arg=no]
-#
-# Emit a libtool wrapper script on stdout.
-# Don't directly open a file because we may want to
-# incorporate the script contents within a cygwin/mingw
-# wrapper executable.  Must ONLY be called from within
-# func_mode_link because it depends on a number of variables
-# set therein.
-#
-# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
-# variable will take.  If 'yes', then the emitted script
-# will assume that the directory in which it is stored is
-# the $objdir directory.  This is a cygwin/mingw-specific
-# behavior.
-func_emit_wrapper ()
-{
-	func_emit_wrapper_arg1=${1-no}
-
-	$ECHO "\
-#! $SHELL
-
-# $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# The $output program cannot be directly executed until all the libtool
-# libraries that it depends on are installed.
-#
-# This wrapper script should never be moved out of the build directory.
-# If it is, it will not operate correctly.
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-sed_quote_subst='$sed_quote_subst'
-
-# Be Bourne compatible
-if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '\${1+\"\$@\"}'='\"\$@\"'
-  setopt NO_GLOB_SUBST
-else
-  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-relink_command=\"$relink_command\"
-
-# This environment variable determines our operation mode.
-if test \"\$libtool_install_magic\" = \"$magic\"; then
-  # install mode needs the following variables:
-  generated_by_libtool_version='$macro_version'
-  notinst_deplibs='$notinst_deplibs'
-else
-  # When we are sourced in execute mode, \$file and \$ECHO are already set.
-  if test \"\$libtool_execute_magic\" != \"$magic\"; then
-    file=\"\$0\""
-
-    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
-    $ECHO "\
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-\$1
-_LTECHO_EOF'
-}
-    ECHO=\"$qECHO\"
-  fi
-
-# Very basic option parsing. These options are (a) specific to
-# the libtool wrapper, (b) are identical between the wrapper
-# /script/ and the wrapper /executable/ which is used only on
-# windows platforms, and (c) all begin with the string "--lt-"
-# (application programs are unlikely to have options which match
-# this pattern).
-#
-# There are only two supported options: --lt-debug and
-# --lt-dump-script. There is, deliberately, no --lt-help.
-#
-# The first argument to this parsing function should be the
-# script's $0 value, followed by "$@".
-lt_option_debug=
-func_parse_lt_options ()
-{
-  lt_script_arg0=\$0
-  shift
-  for lt_opt
-  do
-    case \"\$lt_opt\" in
-    --lt-debug) lt_option_debug=1 ;;
-    --lt-dump-script)
-        lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
-        test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
-        lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
-        cat \"\$lt_dump_D/\$lt_dump_F\"
-        exit 0
-      ;;
-    --lt-*)
-        \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
-        exit 1
-      ;;
-    esac
-  done
-
-  # Print the debug banner immediately:
-  if test -n \"\$lt_option_debug\"; then
-    echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
-  fi
-}
-
-# Used when --lt-debug. Prints its arguments to stdout
-# (redirection is the responsibility of the caller)
-func_lt_dump_args ()
-{
-  lt_dump_args_N=1;
-  for lt_arg
-  do
-    \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
-    lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
-  done
-}
-
-# Core function for launching the target application
-func_exec_program_core ()
-{
-"
-  case $host in
-  # Backslashes separate directories on plain windows
-  *-*-mingw | *-*-os2* | *-cegcc*)
-    $ECHO "\
-      if test -n \"\$lt_option_debug\"; then
-        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
-        func_lt_dump_args \${1+\"\$@\"} 1>&2
-      fi
-      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
-"
-    ;;
-
-  *)
-    $ECHO "\
-      if test -n \"\$lt_option_debug\"; then
-        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
-        func_lt_dump_args \${1+\"\$@\"} 1>&2
-      fi
-      exec \"\$progdir/\$program\" \${1+\"\$@\"}
-"
-    ;;
-  esac
-  $ECHO "\
-      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
-      exit 1
-}
-
-# A function to encapsulate launching the target application
-# Strips options in the --lt-* namespace from \$@ and
-# launches target application with the remaining arguments.
-func_exec_program ()
-{
-  case \" \$* \" in
-  *\\ --lt-*)
-    for lt_wr_arg
-    do
-      case \$lt_wr_arg in
-      --lt-*) ;;
-      *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
-      esac
-      shift
-    done ;;
-  esac
-  func_exec_program_core \${1+\"\$@\"}
-}
-
-  # Parse options
-  func_parse_lt_options \"\$0\" \${1+\"\$@\"}
-
-  # Find the directory that this script lives in.
-  thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
-  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
-
-  # Follow symbolic links until we get to the real thisdir.
-  file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
-  while test -n \"\$file\"; do
-    destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
-
-    # If there was a directory component, then change thisdir.
-    if test \"x\$destdir\" != \"x\$file\"; then
-      case \"\$destdir\" in
-      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
-      *) thisdir=\"\$thisdir/\$destdir\" ;;
-      esac
-    fi
-
-    file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
-    file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
-  done
-
-  # Usually 'no', except on cygwin/mingw when embedded into
-  # the cwrapper.
-  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
-  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
-    # special case for '.'
-    if test \"\$thisdir\" = \".\"; then
-      thisdir=\`pwd\`
-    fi
-    # remove .libs from thisdir
-    case \"\$thisdir\" in
-    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
-    $objdir )   thisdir=. ;;
-    esac
-  fi
-
-  # Try to get the absolute directory name.
-  absdir=\`cd \"\$thisdir\" && pwd\`
-  test -n \"\$absdir\" && thisdir=\"\$absdir\"
-"
-
-	if test "$fast_install" = yes; then
-	  $ECHO "\
-  program=lt-'$outputname'$exeext
-  progdir=\"\$thisdir/$objdir\"
-
-  if test ! -f \"\$progdir/\$program\" ||
-     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
-       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
-
-    file=\"\$\$-\$program\"
-
-    if test ! -d \"\$progdir\"; then
-      $MKDIR \"\$progdir\"
-    else
-      $RM \"\$progdir/\$file\"
-    fi"
-
-	  $ECHO "\
-
-    # relink executable if necessary
-    if test -n \"\$relink_command\"; then
-      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
-      else
-	$ECHO \"\$relink_command_output\" >&2
-	$RM \"\$progdir/\$file\"
-	exit 1
-      fi
-    fi
-
-    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
-    { $RM \"\$progdir/\$program\";
-      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
-    $RM \"\$progdir/\$file\"
-  fi"
-	else
-	  $ECHO "\
-  program='$outputname'
-  progdir=\"\$thisdir/$objdir\"
-"
-	fi
-
-	$ECHO "\
-
-  if test -f \"\$progdir/\$program\"; then"
-
-	# fixup the dll searchpath if we need to.
-	#
-	# Fix the DLL searchpath if we need to.  Do this before prepending
-	# to shlibpath, because on Windows, both are PATH and uninstalled
-	# libraries must come first.
-	if test -n "$dllsearchpath"; then
-	  $ECHO "\
-    # Add the dll search path components to the executable PATH
-    PATH=$dllsearchpath:\$PATH
-"
-	fi
-
-	# Export our shlibpath_var if we have one.
-	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-	  $ECHO "\
-    # Add our own library path to $shlibpath_var
-    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
-
-    # Some systems cannot cope with colon-terminated $shlibpath_var
-    # The second colon is a workaround for a bug in BeOS R4 sed
-    $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
-
-    export $shlibpath_var
-"
-	fi
-
-	$ECHO "\
-    if test \"\$libtool_execute_magic\" != \"$magic\"; then
-      # Run the actual program with our arguments.
-      func_exec_program \${1+\"\$@\"}
-    fi
-  else
-    # The program doesn't exist.
-    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
-    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
-    \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
-    exit 1
-  fi
-fi\
-"
-}
-
-
-# func_emit_cwrapperexe_src
-# emit the source code for a wrapper executable on stdout
-# Must ONLY be called from within func_mode_link because
-# it depends on a number of variable set therein.
-func_emit_cwrapperexe_src ()
-{
-	cat <<EOF
-
-/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
-   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-
-   The $output program cannot be directly executed until all the libtool
-   libraries that it depends on are installed.
-
-   This wrapper executable should never be moved out of the build directory.
-   If it is, it will not operate correctly.
-*/
-EOF
-	    cat <<"EOF"
-#ifdef _MSC_VER
-# define _CRT_SECURE_NO_DEPRECATE 1
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#ifdef _MSC_VER
-# include <direct.h>
-# include <process.h>
-# include <io.h>
-#else
-# include <unistd.h>
-# include <stdint.h>
-# ifdef __CYGWIN__
-#  include <io.h>
-# endif
-#endif
-#include <malloc.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-
-/* declarations of non-ANSI functions */
-#if defined(__MINGW32__)
-# ifdef __STRICT_ANSI__
-int _putenv (const char *);
-# endif
-#elif defined(__CYGWIN__)
-# ifdef __STRICT_ANSI__
-char *realpath (const char *, char *);
-int putenv (char *);
-int setenv (const char *, const char *, int);
-# endif
-/* #elif defined (other platforms) ... */
-#endif
-
-/* portability defines, excluding path handling macros */
-#if defined(_MSC_VER)
-# define setmode _setmode
-# define stat    _stat
-# define chmod   _chmod
-# define getcwd  _getcwd
-# define putenv  _putenv
-# define S_IXUSR _S_IEXEC
-# ifndef _INTPTR_T_DEFINED
-#  define _INTPTR_T_DEFINED
-#  define intptr_t int
-# endif
-#elif defined(__MINGW32__)
-# define setmode _setmode
-# define stat    _stat
-# define chmod   _chmod
-# define getcwd  _getcwd
-# define putenv  _putenv
-#elif defined(__CYGWIN__)
-# define HAVE_SETENV
-# define FOPEN_WB "wb"
-/* #elif defined (other platforms) ... */
-#endif
-
-#if defined(PATH_MAX)
-# define LT_PATHMAX PATH_MAX
-#elif defined(MAXPATHLEN)
-# define LT_PATHMAX MAXPATHLEN
-#else
-# define LT_PATHMAX 1024
-#endif
-
-#ifndef S_IXOTH
-# define S_IXOTH 0
-#endif
-#ifndef S_IXGRP
-# define S_IXGRP 0
-#endif
-
-/* path handling portability macros */
-#ifndef DIR_SEPARATOR
-# define DIR_SEPARATOR '/'
-# define PATH_SEPARATOR ':'
-#endif
-
-#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
-  defined (__OS2__)
-# define HAVE_DOS_BASED_FILE_SYSTEM
-# define FOPEN_WB "wb"
-# ifndef DIR_SEPARATOR_2
-#  define DIR_SEPARATOR_2 '\\'
-# endif
-# ifndef PATH_SEPARATOR_2
-#  define PATH_SEPARATOR_2 ';'
-# endif
-#endif
-
-#ifndef DIR_SEPARATOR_2
-# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
-#else /* DIR_SEPARATOR_2 */
-# define IS_DIR_SEPARATOR(ch) \
-	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
-#endif /* DIR_SEPARATOR_2 */
-
-#ifndef PATH_SEPARATOR_2
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
-#else /* PATH_SEPARATOR_2 */
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
-#endif /* PATH_SEPARATOR_2 */
-
-#ifndef FOPEN_WB
-# define FOPEN_WB "w"
-#endif
-#ifndef _O_BINARY
-# define _O_BINARY 0
-#endif
-
-#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
-#define XFREE(stale) do { \
-  if (stale) { free ((void *) stale); stale = 0; } \
-} while (0)
-
-#if defined(LT_DEBUGWRAPPER)
-static int lt_debug = 1;
-#else
-static int lt_debug = 0;
-#endif
-
-const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
-
-void *xmalloc (size_t num);
-char *xstrdup (const char *string);
-const char *base_name (const char *name);
-char *find_executable (const char *wrapper);
-char *chase_symlinks (const char *pathspec);
-int make_executable (const char *path);
-int check_executable (const char *path);
-char *strendzap (char *str, const char *pat);
-void lt_debugprintf (const char *file, int line, const char *fmt, ...);
-void lt_fatal (const char *file, int line, const char *message, ...);
-static const char *nonnull (const char *s);
-static const char *nonempty (const char *s);
-void lt_setenv (const char *name, const char *value);
-char *lt_extend_str (const char *orig_value, const char *add, int to_end);
-void lt_update_exe_path (const char *name, const char *value);
-void lt_update_lib_path (const char *name, const char *value);
-char **prepare_spawn (char **argv);
-void lt_dump_script (FILE *f);
-EOF
-
-	    cat <<EOF
-volatile const char * MAGIC_EXE = "$magic_exe";
-const char * LIB_PATH_VARNAME = "$shlibpath_var";
-EOF
-
-	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-              func_to_host_path "$temp_rpath"
-	      cat <<EOF
-const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
-EOF
-	    else
-	      cat <<"EOF"
-const char * LIB_PATH_VALUE   = "";
-EOF
-	    fi
-
-	    if test -n "$dllsearchpath"; then
-              func_to_host_path "$dllsearchpath:"
-	      cat <<EOF
-const char * EXE_PATH_VARNAME = "PATH";
-const char * EXE_PATH_VALUE   = "$func_to_host_path_result";
-EOF
-	    else
-	      cat <<"EOF"
-const char * EXE_PATH_VARNAME = "";
-const char * EXE_PATH_VALUE   = "";
-EOF
-	    fi
-
-	    if test "$fast_install" = yes; then
-	      cat <<EOF
-const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
-EOF
-	    else
-	      cat <<EOF
-const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
-EOF
-	    fi
-
-
-	    cat <<"EOF"
-
-#define LTWRAPPER_OPTION_PREFIX         "--lt-"
-
-static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
-static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
-static const char *debug_opt            = LTWRAPPER_OPTION_PREFIX "debug";
-
-int
-main (int argc, char *argv[])
-{
-  char **newargz;
-  int  newargc;
-  char *tmp_pathspec;
-  char *actual_cwrapper_path;
-  char *actual_cwrapper_name;
-  char *target_name;
-  char *lt_argv_zero;
-  intptr_t rval = 127;
-
-  int i;
-
-  program_name = (char *) xstrdup (base_name (argv[0]));
-  newargz = XMALLOC (char *, argc + 1);
-
-  /* very simple arg parsing; don't want to rely on getopt
-   * also, copy all non cwrapper options to newargz, except
-   * argz[0], which is handled differently
-   */
-  newargc=0;
-  for (i = 1; i < argc; i++)
-    {
-      if (strcmp (argv[i], dumpscript_opt) == 0)
-	{
-EOF
-	    case "$host" in
-	      *mingw* | *cygwin* )
-		# make stdout use "unix" line endings
-		echo "          setmode(1,_O_BINARY);"
-		;;
-	      esac
-
-	    cat <<"EOF"
-	  lt_dump_script (stdout);
-	  return 0;
-	}
-      if (strcmp (argv[i], debug_opt) == 0)
-	{
-          lt_debug = 1;
-          continue;
-	}
-      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
-        {
-          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
-             namespace, but it is not one of the ones we know about and
-             have already dealt with, above (inluding dump-script), then
-             report an error. Otherwise, targets might begin to believe
-             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
-             namespace. The first time any user complains about this, we'll
-             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
-             or a configure.ac-settable value.
-           */
-          lt_fatal (__FILE__, __LINE__,
-		    "unrecognized %s option: '%s'",
-                    ltwrapper_option_prefix, argv[i]);
-        }
-      /* otherwise ... */
-      newargz[++newargc] = xstrdup (argv[i]);
-    }
-  newargz[++newargc] = NULL;
-
-EOF
-	    cat <<EOF
-  /* The GNU banner must be the first non-error debug message */
-  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
-EOF
-	    cat <<"EOF"
-  lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
-  lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
-
-  tmp_pathspec = find_executable (argv[0]);
-  if (tmp_pathspec == NULL)
-    lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
-  lt_debugprintf (__FILE__, __LINE__,
-                  "(main) found exe (before symlink chase) at: %s\n",
-		  tmp_pathspec);
-
-  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
-  lt_debugprintf (__FILE__, __LINE__,
-                  "(main) found exe (after symlink chase) at: %s\n",
-		  actual_cwrapper_path);
-  XFREE (tmp_pathspec);
-
-  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
-  strendzap (actual_cwrapper_path, actual_cwrapper_name);
-
-  /* wrapper name transforms */
-  strendzap (actual_cwrapper_name, ".exe");
-  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
-  XFREE (actual_cwrapper_name);
-  actual_cwrapper_name = tmp_pathspec;
-  tmp_pathspec = 0;
-
-  /* target_name transforms -- use actual target program name; might have lt- prefix */
-  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
-  strendzap (target_name, ".exe");
-  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
-  XFREE (target_name);
-  target_name = tmp_pathspec;
-  tmp_pathspec = 0;
-
-  lt_debugprintf (__FILE__, __LINE__,
-		  "(main) libtool target name: %s\n",
-		  target_name);
-EOF
-
-	    cat <<EOF
-  newargz[0] =
-    XMALLOC (char, (strlen (actual_cwrapper_path) +
-		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
-  strcpy (newargz[0], actual_cwrapper_path);
-  strcat (newargz[0], "$objdir");
-  strcat (newargz[0], "/");
-EOF
-
-	    cat <<"EOF"
-  /* stop here, and copy so we don't have to do this twice */
-  tmp_pathspec = xstrdup (newargz[0]);
-
-  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
-  strcat (newargz[0], actual_cwrapper_name);
-
-  /* DO want the lt- prefix here if it exists, so use target_name */
-  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
-  XFREE (tmp_pathspec);
-  tmp_pathspec = NULL;
-EOF
-
-	    case $host_os in
-	      mingw*)
-	    cat <<"EOF"
-  {
-    char* p;
-    while ((p = strchr (newargz[0], '\\')) != NULL)
-      {
-	*p = '/';
-      }
-    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
-      {
-	*p = '/';
-      }
-  }
-EOF
-	    ;;
-	    esac
-
-	    cat <<"EOF"
-  XFREE (target_name);
-  XFREE (actual_cwrapper_path);
-  XFREE (actual_cwrapper_name);
-
-  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
-  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
-  /* Update the DLL searchpath.  EXE_PATH_VALUE ($dllsearchpath) must
-     be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
-     because on Windows, both *_VARNAMEs are PATH but uninstalled
-     libraries must come first. */
-  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
-  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
-
-  lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
-		  nonnull (lt_argv_zero));
-  for (i = 0; i < newargc; i++)
-    {
-      lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
-		      i, nonnull (newargz[i]));
-    }
-
-EOF
-
-	    case $host_os in
-	      mingw*)
-		cat <<"EOF"
-  /* execv doesn't actually work on mingw as expected on unix */
-  newargz = prepare_spawn (newargz);
-  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
-  if (rval == -1)
-    {
-      /* failed to start process */
-      lt_debugprintf (__FILE__, __LINE__,
-		      "(main) failed to launch target \"%s\": %s\n",
-		      lt_argv_zero, nonnull (strerror (errno)));
-      return 127;
-    }
-  return rval;
-EOF
-		;;
-	      *)
-		cat <<"EOF"
-  execv (lt_argv_zero, newargz);
-  return rval; /* =127, but avoids unused variable warning */
-EOF
-		;;
-	    esac
-
-	    cat <<"EOF"
-}
-
-void *
-xmalloc (size_t num)
-{
-  void *p = (void *) malloc (num);
-  if (!p)
-    lt_fatal (__FILE__, __LINE__, "memory exhausted");
-
-  return p;
-}
-
-char *
-xstrdup (const char *string)
-{
-  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
-			  string) : NULL;
-}
-
-const char *
-base_name (const char *name)
-{
-  const char *base;
-
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  /* Skip over the disk name in MSDOS pathnames. */
-  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
-    name += 2;
-#endif
-
-  for (base = name; *name; name++)
-    if (IS_DIR_SEPARATOR (*name))
-      base = name + 1;
-  return base;
-}
-
-int
-check_executable (const char *path)
-{
-  struct stat st;
-
-  lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
-                  nonempty (path));
-  if ((!path) || (!*path))
-    return 0;
-
-  if ((stat (path, &st) >= 0)
-      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
-    return 1;
-  else
-    return 0;
-}
-
-int
-make_executable (const char *path)
-{
-  int rval = 0;
-  struct stat st;
-
-  lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
-                  nonempty (path));
-  if ((!path) || (!*path))
-    return 0;
-
-  if (stat (path, &st) >= 0)
-    {
-      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
-    }
-  return rval;
-}
-
-/* Searches for the full path of the wrapper.  Returns
-   newly allocated full path name if found, NULL otherwise
-   Does not chase symlinks, even on platforms that support them.
-*/
-char *
-find_executable (const char *wrapper)
-{
-  int has_slash = 0;
-  const char *p;
-  const char *p_next;
-  /* static buffer for getcwd */
-  char tmp[LT_PATHMAX + 1];
-  int tmp_len;
-  char *concat_name;
-
-  lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
-                  nonempty (wrapper));
-
-  if ((wrapper == NULL) || (*wrapper == '\0'))
-    return NULL;
-
-  /* Absolute path? */
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
-    {
-      concat_name = xstrdup (wrapper);
-      if (check_executable (concat_name))
-	return concat_name;
-      XFREE (concat_name);
-    }
-  else
-    {
-#endif
-      if (IS_DIR_SEPARATOR (wrapper[0]))
-	{
-	  concat_name = xstrdup (wrapper);
-	  if (check_executable (concat_name))
-	    return concat_name;
-	  XFREE (concat_name);
-	}
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-    }
-#endif
-
-  for (p = wrapper; *p; p++)
-    if (*p == '/')
-      {
-	has_slash = 1;
-	break;
-      }
-  if (!has_slash)
-    {
-      /* no slashes; search PATH */
-      const char *path = getenv ("PATH");
-      if (path != NULL)
-	{
-	  for (p = path; *p; p = p_next)
-	    {
-	      const char *q;
-	      size_t p_len;
-	      for (q = p; *q; q++)
-		if (IS_PATH_SEPARATOR (*q))
-		  break;
-	      p_len = q - p;
-	      p_next = (*q == '\0' ? q : q + 1);
-	      if (p_len == 0)
-		{
-		  /* empty path: current directory */
-		  if (getcwd (tmp, LT_PATHMAX) == NULL)
-		    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
-                              nonnull (strerror (errno)));
-		  tmp_len = strlen (tmp);
-		  concat_name =
-		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
-		  memcpy (concat_name, tmp, tmp_len);
-		  concat_name[tmp_len] = '/';
-		  strcpy (concat_name + tmp_len + 1, wrapper);
-		}
-	      else
-		{
-		  concat_name =
-		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
-		  memcpy (concat_name, p, p_len);
-		  concat_name[p_len] = '/';
-		  strcpy (concat_name + p_len + 1, wrapper);
-		}
-	      if (check_executable (concat_name))
-		return concat_name;
-	      XFREE (concat_name);
-	    }
-	}
-      /* not found in PATH; assume curdir */
-    }
-  /* Relative path | not found in path: prepend cwd */
-  if (getcwd (tmp, LT_PATHMAX) == NULL)
-    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
-              nonnull (strerror (errno)));
-  tmp_len = strlen (tmp);
-  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
-  memcpy (concat_name, tmp, tmp_len);
-  concat_name[tmp_len] = '/';
-  strcpy (concat_name + tmp_len + 1, wrapper);
-
-  if (check_executable (concat_name))
-    return concat_name;
-  XFREE (concat_name);
-  return NULL;
-}
-
-char *
-chase_symlinks (const char *pathspec)
-{
-#ifndef S_ISLNK
-  return xstrdup (pathspec);
-#else
-  char buf[LT_PATHMAX];
-  struct stat s;
-  char *tmp_pathspec = xstrdup (pathspec);
-  char *p;
-  int has_symlinks = 0;
-  while (strlen (tmp_pathspec) && !has_symlinks)
-    {
-      lt_debugprintf (__FILE__, __LINE__,
-		      "checking path component for symlinks: %s\n",
-		      tmp_pathspec);
-      if (lstat (tmp_pathspec, &s) == 0)
-	{
-	  if (S_ISLNK (s.st_mode) != 0)
-	    {
-	      has_symlinks = 1;
-	      break;
-	    }
-
-	  /* search backwards for last DIR_SEPARATOR */
-	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
-	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
-	    p--;
-	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
-	    {
-	      /* no more DIR_SEPARATORS left */
-	      break;
-	    }
-	  *p = '\0';
-	}
-      else
-	{
-	  lt_fatal (__FILE__, __LINE__,
-		    "error accessing file \"%s\": %s",
-		    tmp_pathspec, nonnull (strerror (errno)));
-	}
-    }
-  XFREE (tmp_pathspec);
-
-  if (!has_symlinks)
-    {
-      return xstrdup (pathspec);
-    }
-
-  tmp_pathspec = realpath (pathspec, buf);
-  if (tmp_pathspec == 0)
-    {
-      lt_fatal (__FILE__, __LINE__,
-		"could not follow symlinks for %s", pathspec);
-    }
-  return xstrdup (tmp_pathspec);
-#endif
-}
-
-char *
-strendzap (char *str, const char *pat)
-{
-  size_t len, patlen;
-
-  assert (str != NULL);
-  assert (pat != NULL);
-
-  len = strlen (str);
-  patlen = strlen (pat);
-
-  if (patlen <= len)
-    {
-      str += len - patlen;
-      if (strcmp (str, pat) == 0)
-	*str = '\0';
-    }
-  return str;
-}
-
-void
-lt_debugprintf (const char *file, int line, const char *fmt, ...)
-{
-  va_list args;
-  if (lt_debug)
-    {
-      (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
-      va_start (args, fmt);
-      (void) vfprintf (stderr, fmt, args);
-      va_end (args);
-    }
-}
-
-static void
-lt_error_core (int exit_status, const char *file,
-	       int line, const char *mode,
-	       const char *message, va_list ap)
-{
-  fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
-  vfprintf (stderr, message, ap);
-  fprintf (stderr, ".\n");
-
-  if (exit_status >= 0)
-    exit (exit_status);
-}
-
-void
-lt_fatal (const char *file, int line, const char *message, ...)
-{
-  va_list ap;
-  va_start (ap, message);
-  lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
-  va_end (ap);
-}
-
-static const char *
-nonnull (const char *s)
-{
-  return s ? s : "(null)";
-}
-
-static const char *
-nonempty (const char *s)
-{
-  return (s && !*s) ? "(empty)" : nonnull (s);
-}
-
-void
-lt_setenv (const char *name, const char *value)
-{
-  lt_debugprintf (__FILE__, __LINE__,
-		  "(lt_setenv) setting '%s' to '%s'\n",
-                  nonnull (name), nonnull (value));
-  {
-#ifdef HAVE_SETENV
-    /* always make a copy, for consistency with !HAVE_SETENV */
-    char *str = xstrdup (value);
-    setenv (name, str, 1);
-#else
-    int len = strlen (name) + 1 + strlen (value) + 1;
-    char *str = XMALLOC (char, len);
-    sprintf (str, "%s=%s", name, value);
-    if (putenv (str) != EXIT_SUCCESS)
-      {
-        XFREE (str);
-      }
-#endif
-  }
-}
-
-char *
-lt_extend_str (const char *orig_value, const char *add, int to_end)
-{
-  char *new_value;
-  if (orig_value && *orig_value)
-    {
-      int orig_value_len = strlen (orig_value);
-      int add_len = strlen (add);
-      new_value = XMALLOC (char, add_len + orig_value_len + 1);
-      if (to_end)
-        {
-          strcpy (new_value, orig_value);
-          strcpy (new_value + orig_value_len, add);
-        }
-      else
-        {
-          strcpy (new_value, add);
-          strcpy (new_value + add_len, orig_value);
-        }
-    }
-  else
-    {
-      new_value = xstrdup (add);
-    }
-  return new_value;
-}
-
-void
-lt_update_exe_path (const char *name, const char *value)
-{
-  lt_debugprintf (__FILE__, __LINE__,
-		  "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
-                  nonnull (name), nonnull (value));
-
-  if (name && *name && value && *value)
-    {
-      char *new_value = lt_extend_str (getenv (name), value, 0);
-      /* some systems can't cope with a ':'-terminated path #' */
-      int len = strlen (new_value);
-      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
-        {
-          new_value[len-1] = '\0';
-        }
-      lt_setenv (name, new_value);
-      XFREE (new_value);
-    }
-}
-
-void
-lt_update_lib_path (const char *name, const char *value)
-{
-  lt_debugprintf (__FILE__, __LINE__,
-		  "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
-                  nonnull (name), nonnull (value));
-
-  if (name && *name && value && *value)
-    {
-      char *new_value = lt_extend_str (getenv (name), value, 0);
-      lt_setenv (name, new_value);
-      XFREE (new_value);
-    }
-}
-
-EOF
-	    case $host_os in
-	      mingw*)
-		cat <<"EOF"
-
-/* Prepares an argument vector before calling spawn().
-   Note that spawn() does not by itself call the command interpreter
-     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
-      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-         GetVersionEx(&v);
-         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
-      }) ? "cmd.exe" : "command.com").
-   Instead it simply concatenates the arguments, separated by ' ', and calls
-   CreateProcess().  We must quote the arguments since Win32 CreateProcess()
-   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
-   special way:
-   - Space and tab are interpreted as delimiters. They are not treated as
-     delimiters if they are surrounded by double quotes: "...".
-   - Unescaped double quotes are removed from the input. Their only effect is
-     that within double quotes, space and tab are treated like normal
-     characters.
-   - Backslashes not followed by double quotes are not special.
-   - But 2*n+1 backslashes followed by a double quote become
-     n backslashes followed by a double quote (n >= 0):
-       \" -> "
-       \\\" -> \"
-       \\\\\" -> \\"
- */
-#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
-#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
-char **
-prepare_spawn (char **argv)
-{
-  size_t argc;
-  char **new_argv;
-  size_t i;
-
-  /* Count number of arguments.  */
-  for (argc = 0; argv[argc] != NULL; argc++)
-    ;
-
-  /* Allocate new argument vector.  */
-  new_argv = XMALLOC (char *, argc + 1);
-
-  /* Put quoted arguments into the new argument vector.  */
-  for (i = 0; i < argc; i++)
-    {
-      const char *string = argv[i];
-
-      if (string[0] == '\0')
-	new_argv[i] = xstrdup ("\"\"");
-      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
-	{
-	  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
-	  size_t length;
-	  unsigned int backslashes;
-	  const char *s;
-	  char *quoted_string;
-	  char *p;
-
-	  length = 0;
-	  backslashes = 0;
-	  if (quote_around)
-	    length++;
-	  for (s = string; *s != '\0'; s++)
-	    {
-	      char c = *s;
-	      if (c == '"')
-		length += backslashes + 1;
-	      length++;
-	      if (c == '\\')
-		backslashes++;
-	      else
-		backslashes = 0;
-	    }
-	  if (quote_around)
-	    length += backslashes + 1;
-
-	  quoted_string = XMALLOC (char, length + 1);
-
-	  p = quoted_string;
-	  backslashes = 0;
-	  if (quote_around)
-	    *p++ = '"';
-	  for (s = string; *s != '\0'; s++)
-	    {
-	      char c = *s;
-	      if (c == '"')
-		{
-		  unsigned int j;
-		  for (j = backslashes + 1; j > 0; j--)
-		    *p++ = '\\';
-		}
-	      *p++ = c;
-	      if (c == '\\')
-		backslashes++;
-	      else
-		backslashes = 0;
-	    }
-	  if (quote_around)
-	    {
-	      unsigned int j;
-	      for (j = backslashes; j > 0; j--)
-		*p++ = '\\';
-	      *p++ = '"';
-	    }
-	  *p = '\0';
-
-	  new_argv[i] = quoted_string;
-	}
-      else
-	new_argv[i] = (char *) string;
-    }
-  new_argv[argc] = NULL;
-
-  return new_argv;
-}
-EOF
-		;;
-	    esac
-
-            cat <<"EOF"
-void lt_dump_script (FILE* f)
-{
-EOF
-	    func_emit_wrapper yes |
-	      $SED -n -e '
-s/^\(.\{79\}\)\(..*\)/\1\
-\2/
-h
-s/\([\\"]\)/\\\1/g
-s/$/\\n/
-s/\([^\n]*\).*/  fputs ("\1", f);/p
-g
-D'
-            cat <<"EOF"
-}
-EOF
-}
-# end: func_emit_cwrapperexe_src
-
-# func_win32_import_lib_p ARG
-# True if ARG is an import lib, as indicated by $file_magic_cmd
-func_win32_import_lib_p ()
-{
-    $opt_debug
-    case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
-    *import*) : ;;
-    *) false ;;
-    esac
-}
-
-# func_mode_link arg...
-func_mode_link ()
-{
-    $opt_debug
-    case $host in
-    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-      # It is impossible to link a dll without this setting, and
-      # we shouldn't force the makefile maintainer to figure out
-      # which system we are compiling for in order to pass an extra
-      # flag for every libtool invocation.
-      # allow_undefined=no
-
-      # FIXME: Unfortunately, there are problems with the above when trying
-      # to make a dll which has undefined symbols, in which case not
-      # even a static library is built.  For now, we need to specify
-      # -no-undefined on the libtool link line when we can be certain
-      # that all symbols are satisfied, otherwise we get a static library.
-      allow_undefined=yes
-      ;;
-    *)
-      allow_undefined=yes
-      ;;
-    esac
-    libtool_args=$nonopt
-    base_compile="$nonopt $@"
-    compile_command=$nonopt
-    finalize_command=$nonopt
-
-    compile_rpath=
-    finalize_rpath=
-    compile_shlibpath=
-    finalize_shlibpath=
-    convenience=
-    old_convenience=
-    deplibs=
-    old_deplibs=
-    compiler_flags=
-    linker_flags=
-    dllsearchpath=
-    lib_search_path=`pwd`
-    inst_prefix_dir=
-    new_inherited_linker_flags=
-
-    avoid_version=no
-    bindir=
-    dlfiles=
-    dlprefiles=
-    dlself=no
-    export_dynamic=no
-    export_symbols=
-    export_symbols_regex=
-    generated=
-    libobjs=
-    ltlibs=
-    module=no
-    no_install=no
-    objs=
-    non_pic_objects=
-    precious_files_regex=
-    prefer_static_libs=no
-    preload=no
-    prev=
-    prevarg=
-    release=
-    rpath=
-    xrpath=
-    perm_rpath=
-    temp_rpath=
-    thread_safe=no
-    vinfo=
-    vinfo_number=no
-    weak_libs=
-    single_module="${wl}-single_module"
-    func_infer_tag $base_compile
-
-    # We need to know -static, to get the right output filenames.
-    for arg
-    do
-      case $arg in
-      -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
-	build_old_libs=no
-	break
-	;;
-      -all-static | -static | -static-libtool-libs)
-	case $arg in
-	-all-static)
-	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
-	    func_warning "complete static linking is impossible in this configuration"
-	  fi
-	  if test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=yes
-	  ;;
-	-static)
-	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=built
-	  ;;
-	-static-libtool-libs)
-	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=yes
-	  ;;
-	esac
-	build_libtool_libs=no
-	build_old_libs=yes
-	break
-	;;
-      esac
-    done
-
-    # See if our shared archives depend on static archives.
-    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
-
-    # Go through the arguments, transforming them on the way.
-    while test "$#" -gt 0; do
-      arg="$1"
-      shift
-      func_quote_for_eval "$arg"
-      qarg=$func_quote_for_eval_unquoted_result
-      func_append libtool_args " $func_quote_for_eval_result"
-
-      # If the previous option needs an argument, assign it.
-      if test -n "$prev"; then
-	case $prev in
-	output)
-	  func_append compile_command " @OUTPUT@"
-	  func_append finalize_command " @OUTPUT@"
-	  ;;
-	esac
-
-	case $prev in
-	bindir)
-	  bindir="$arg"
-	  prev=
-	  continue
-	  ;;
-	dlfiles|dlprefiles)
-	  if test "$preload" = no; then
-	    # Add the symbol object into the linking commands.
-	    func_append compile_command " @SYMFILE@"
-	    func_append finalize_command " @SYMFILE@"
-	    preload=yes
-	  fi
-	  case $arg in
-	  *.la | *.lo) ;;  # We handle these cases below.
-	  force)
-	    if test "$dlself" = no; then
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  self)
-	    if test "$prev" = dlprefiles; then
-	      dlself=yes
-	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
-	      dlself=yes
-	    else
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  *)
-	    if test "$prev" = dlfiles; then
-	      func_append dlfiles " $arg"
-	    else
-	      func_append dlprefiles " $arg"
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  esac
-	  ;;
-	expsyms)
-	  export_symbols="$arg"
-	  test -f "$arg" \
-	    || func_fatal_error "symbol file \`$arg' does not exist"
-	  prev=
-	  continue
-	  ;;
-	expsyms_regex)
-	  export_symbols_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	framework)
-	  case $host in
-	    *-*-darwin*)
-	      case "$deplibs " in
-		*" $qarg.ltframework "*) ;;
-		*) func_append deplibs " $qarg.ltframework" # this is fixed later
-		   ;;
-	      esac
-	      ;;
-	  esac
-	  prev=
-	  continue
-	  ;;
-	inst_prefix)
-	  inst_prefix_dir="$arg"
-	  prev=
-	  continue
-	  ;;
-	objectlist)
-	  if test -f "$arg"; then
-	    save_arg=$arg
-	    moreargs=
-	    for fil in `cat "$save_arg"`
-	    do
-#	      func_append moreargs " $fil"
-	      arg=$fil
-	      # A libtool-controlled object.
-
-	      # Check to see that this really is a libtool object.
-	      if func_lalib_unsafe_p "$arg"; then
-		pic_object=
-		non_pic_object=
-
-		# Read the .lo file
-		func_source "$arg"
-
-		if test -z "$pic_object" ||
-		   test -z "$non_pic_object" ||
-		   test "$pic_object" = none &&
-		   test "$non_pic_object" = none; then
-		  func_fatal_error "cannot find name of object for \`$arg'"
-		fi
-
-		# Extract subdirectory from the argument.
-		func_dirname "$arg" "/" ""
-		xdir="$func_dirname_result"
-
-		if test "$pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  pic_object="$xdir$pic_object"
-
-		  if test "$prev" = dlfiles; then
-		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		      func_append dlfiles " $pic_object"
-		      prev=
-		      continue
-		    else
-		      # If libtool objects are unsupported, then we need to preload.
-		      prev=dlprefiles
-		    fi
-		  fi
-
-		  # CHECK ME:  I think I busted this.  -Ossama
-		  if test "$prev" = dlprefiles; then
-		    # Preload the old-style object.
-		    func_append dlprefiles " $pic_object"
-		    prev=
-		  fi
-
-		  # A PIC object.
-		  func_append libobjs " $pic_object"
-		  arg="$pic_object"
-		fi
-
-		# Non-PIC object.
-		if test "$non_pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  non_pic_object="$xdir$non_pic_object"
-
-		  # A standard non-PIC object
-		  func_append non_pic_objects " $non_pic_object"
-		  if test -z "$pic_object" || test "$pic_object" = none ; then
-		    arg="$non_pic_object"
-		  fi
-		else
-		  # If the PIC object exists, use it instead.
-		  # $xdir was prepended to $pic_object above.
-		  non_pic_object="$pic_object"
-		  func_append non_pic_objects " $non_pic_object"
-		fi
-	      else
-		# Only an error if not doing a dry-run.
-		if $opt_dry_run; then
-		  # Extract subdirectory from the argument.
-		  func_dirname "$arg" "/" ""
-		  xdir="$func_dirname_result"
-
-		  func_lo2o "$arg"
-		  pic_object=$xdir$objdir/$func_lo2o_result
-		  non_pic_object=$xdir$func_lo2o_result
-		  func_append libobjs " $pic_object"
-		  func_append non_pic_objects " $non_pic_object"
-	        else
-		  func_fatal_error "\`$arg' is not a valid libtool object"
-		fi
-	      fi
-	    done
-	  else
-	    func_fatal_error "link input file \`$arg' does not exist"
-	  fi
-	  arg=$save_arg
-	  prev=
-	  continue
-	  ;;
-	precious_regex)
-	  precious_files_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	release)
-	  release="-$arg"
-	  prev=
-	  continue
-	  ;;
-	rpath | xrpath)
-	  # We need an absolute path.
-	  case $arg in
-	  [\\/]* | [A-Za-z]:[\\/]*) ;;
-	  *)
-	    func_fatal_error "only absolute run-paths are allowed"
-	    ;;
-	  esac
-	  if test "$prev" = rpath; then
-	    case "$rpath " in
-	    *" $arg "*) ;;
-	    *) func_append rpath " $arg" ;;
-	    esac
-	  else
-	    case "$xrpath " in
-	    *" $arg "*) ;;
-	    *) func_append xrpath " $arg" ;;
-	    esac
-	  fi
-	  prev=
-	  continue
-	  ;;
-	shrext)
-	  shrext_cmds="$arg"
-	  prev=
-	  continue
-	  ;;
-	weak)
-	  func_append weak_libs " $arg"
-	  prev=
-	  continue
-	  ;;
-	xcclinker)
-	  func_append linker_flags " $qarg"
-	  func_append compiler_flags " $qarg"
-	  prev=
-	  func_append compile_command " $qarg"
-	  func_append finalize_command " $qarg"
-	  continue
-	  ;;
-	xcompiler)
-	  func_append compiler_flags " $qarg"
-	  prev=
-	  func_append compile_command " $qarg"
-	  func_append finalize_command " $qarg"
-	  continue
-	  ;;
-	xlinker)
-	  func_append linker_flags " $qarg"
-	  func_append compiler_flags " $wl$qarg"
-	  prev=
-	  func_append compile_command " $wl$qarg"
-	  func_append finalize_command " $wl$qarg"
-	  continue
-	  ;;
-	*)
-	  eval "$prev=\"\$arg\""
-	  prev=
-	  continue
-	  ;;
-	esac
-      fi # test -n "$prev"
-
-      prevarg="$arg"
-
-      case $arg in
-      -all-static)
-	if test -n "$link_static_flag"; then
-	  # See comment for -static flag below, for more details.
-	  func_append compile_command " $link_static_flag"
-	  func_append finalize_command " $link_static_flag"
-	fi
-	continue
-	;;
-
-      -allow-undefined)
-	# FIXME: remove this flag sometime in the future.
-	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
-	;;
-
-      -avoid-version)
-	avoid_version=yes
-	continue
-	;;
-
-      -bindir)
-	prev=bindir
-	continue
-	;;
-
-      -dlopen)
-	prev=dlfiles
-	continue
-	;;
-
-      -dlpreopen)
-	prev=dlprefiles
-	continue
-	;;
-
-      -export-dynamic)
-	export_dynamic=yes
-	continue
-	;;
-
-      -export-symbols | -export-symbols-regex)
-	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
-	  func_fatal_error "more than one -exported-symbols argument is not allowed"
-	fi
-	if test "X$arg" = "X-export-symbols"; then
-	  prev=expsyms
-	else
-	  prev=expsyms_regex
-	fi
-	continue
-	;;
-
-      -framework)
-	prev=framework
-	continue
-	;;
-
-      -inst-prefix-dir)
-	prev=inst_prefix
-	continue
-	;;
-
-      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
-      # so, if we see these flags be careful not to treat them like -L
-      -L[A-Z][A-Z]*:*)
-	case $with_gcc/$host in
-	no/*-*-irix* | /*-*-irix*)
-	  func_append compile_command " $arg"
-	  func_append finalize_command " $arg"
-	  ;;
-	esac
-	continue
-	;;
-
-      -L*)
-	func_stripname "-L" '' "$arg"
-	if test -z "$func_stripname_result"; then
-	  if test "$#" -gt 0; then
-	    func_fatal_error "require no space between \`-L' and \`$1'"
-	  else
-	    func_fatal_error "need path for \`-L' option"
-	  fi
-	fi
-	func_resolve_sysroot "$func_stripname_result"
-	dir=$func_resolve_sysroot_result
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	*)
-	  absdir=`cd "$dir" && pwd`
-	  test -z "$absdir" && \
-	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
-	  dir="$absdir"
-	  ;;
-	esac
-	case "$deplibs " in
-	*" -L$dir "* | *" $arg "*)
-	  # Will only happen for absolute or sysroot arguments
-	  ;;
-	*)
-	  # Preserve sysroot, but never include relative directories
-	  case $dir in
-	    [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;;
-	    *) func_append deplibs " -L$dir" ;;
-	  esac
-	  func_append lib_search_path " $dir"
-	  ;;
-	esac
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-	  testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$dir:"*) ;;
-	  ::) dllsearchpath=$dir;;
-	  *) func_append dllsearchpath ":$dir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  ::) dllsearchpath=$testbindir;;
-	  *) func_append dllsearchpath ":$testbindir";;
-	  esac
-	  ;;
-	esac
-	continue
-	;;
-
-      -l*)
-	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
-	    # These systems don't actually have a C or math library (as such)
-	    continue
-	    ;;
-	  *-*-os2*)
-	    # These systems don't actually have a C library (as such)
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C and math libraries are in the System framework
-	    func_append deplibs " System.ltframework"
-	    continue
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  esac
-	elif test "X$arg" = "X-lc_r"; then
-	 case $host in
-	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	   # Do not include libc_r directly, use -pthread flag.
-	   continue
-	   ;;
-	 esac
-	fi
-	func_append deplibs " $arg"
-	continue
-	;;
-
-      -module)
-	module=yes
-	continue
-	;;
-
-      # Tru64 UNIX uses -model [arg] to determine the layout of C++
-      # classes, name mangling, and exception handling.
-      # Darwin uses the -arch flag to determine output architecture.
-      -model|-arch|-isysroot|--sysroot)
-	func_append compiler_flags " $arg"
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-	prev=xcompiler
-	continue
-	;;
-
-      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
-      |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
-	func_append compiler_flags " $arg"
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-	case "$new_inherited_linker_flags " in
-	    *" $arg "*) ;;
-	    * ) func_append new_inherited_linker_flags " $arg" ;;
-	esac
-	continue
-	;;
-
-      -multi_module)
-	single_module="${wl}-multi_module"
-	continue
-	;;
-
-      -no-fast-install)
-	fast_install=no
-	continue
-	;;
-
-      -no-install)
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
-	  # The PATH hackery in wrapper scripts is required on Windows
-	  # and Darwin in order for the loader to find any dlls it needs.
-	  func_warning "\`-no-install' is ignored for $host"
-	  func_warning "assuming \`-no-fast-install' instead"
-	  fast_install=no
-	  ;;
-	*) no_install=yes ;;
-	esac
-	continue
-	;;
-
-      -no-undefined)
-	allow_undefined=no
-	continue
-	;;
-
-      -objectlist)
-	prev=objectlist
-	continue
-	;;
-
-      -o) prev=output ;;
-
-      -precious-files-regex)
-	prev=precious_regex
-	continue
-	;;
-
-      -release)
-	prev=release
-	continue
-	;;
-
-      -rpath)
-	prev=rpath
-	continue
-	;;
-
-      -R)
-	prev=xrpath
-	continue
-	;;
-
-      -R*)
-	func_stripname '-R' '' "$arg"
-	dir=$func_stripname_result
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	=*)
-	  func_stripname '=' '' "$dir"
-	  dir=$lt_sysroot$func_stripname_result
-	  ;;
-	*)
-	  func_fatal_error "only absolute run-paths are allowed"
-	  ;;
-	esac
-	case "$xrpath " in
-	*" $dir "*) ;;
-	*) func_append xrpath " $dir" ;;
-	esac
-	continue
-	;;
-
-      -shared)
-	# The effects of -shared are defined in a previous loop.
-	continue
-	;;
-
-      -shrext)
-	prev=shrext
-	continue
-	;;
-
-      -static | -static-libtool-libs)
-	# The effects of -static are defined in a previous loop.
-	# We used to do the same as -all-static on platforms that
-	# didn't have a PIC flag, but the assumption that the effects
-	# would be equivalent was wrong.  It would break on at least
-	# Digital Unix and AIX.
-	continue
-	;;
-
-      -thread-safe)
-	thread_safe=yes
-	continue
-	;;
-
-      -version-info)
-	prev=vinfo
-	continue
-	;;
-
-      -version-number)
-	prev=vinfo
-	vinfo_number=yes
-	continue
-	;;
-
-      -weak)
-        prev=weak
-	continue
-	;;
-
-      -Wc,*)
-	func_stripname '-Wc,' '' "$arg"
-	args=$func_stripname_result
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-          func_quote_for_eval "$flag"
-	  func_append arg " $func_quote_for_eval_result"
-	  func_append compiler_flags " $func_quote_for_eval_result"
-	done
-	IFS="$save_ifs"
-	func_stripname ' ' '' "$arg"
-	arg=$func_stripname_result
-	;;
-
-      -Wl,*)
-	func_stripname '-Wl,' '' "$arg"
-	args=$func_stripname_result
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-          func_quote_for_eval "$flag"
-	  func_append arg " $wl$func_quote_for_eval_result"
-	  func_append compiler_flags " $wl$func_quote_for_eval_result"
-	  func_append linker_flags " $func_quote_for_eval_result"
-	done
-	IFS="$save_ifs"
-	func_stripname ' ' '' "$arg"
-	arg=$func_stripname_result
-	;;
-
-      -Xcompiler)
-	prev=xcompiler
-	continue
-	;;
-
-      -Xlinker)
-	prev=xlinker
-	continue
-	;;
-
-      -XCClinker)
-	prev=xcclinker
-	continue
-	;;
-
-      # -msg_* for osf cc
-      -msg_*)
-	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-
-      # Flags to be passed through unchanged, with rationale:
-      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler
-      # -r[0-9][0-9]*        specify processor for the SGI compiler
-      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
-      # +DA*, +DD*           enable 64-bit mode for the HP compiler
-      # -q*                  compiler args for the IBM compiler
-      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
-      # -F/path              path to uninstalled frameworks, gcc on darwin
-      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
-      # @file                GCC response files
-      # -tp=*                Portland pgcc target processor selection
-      # --sysroot=*          for sysroot support
-      # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
-      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
-      -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
-        func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-        func_append compile_command " $arg"
-        func_append finalize_command " $arg"
-        func_append compiler_flags " $arg"
-        continue
-        ;;
-
-      # Some other compiler flag.
-      -* | +*)
-        func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-
-      *.$objext)
-	# A standard object.
-	func_append objs " $arg"
-	;;
-
-      *.lo)
-	# A libtool-controlled object.
-
-	# Check to see that this really is a libtool object.
-	if func_lalib_unsafe_p "$arg"; then
-	  pic_object=
-	  non_pic_object=
-
-	  # Read the .lo file
-	  func_source "$arg"
-
-	  if test -z "$pic_object" ||
-	     test -z "$non_pic_object" ||
-	     test "$pic_object" = none &&
-	     test "$non_pic_object" = none; then
-	    func_fatal_error "cannot find name of object for \`$arg'"
-	  fi
-
-	  # Extract subdirectory from the argument.
-	  func_dirname "$arg" "/" ""
-	  xdir="$func_dirname_result"
-
-	  if test "$pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    pic_object="$xdir$pic_object"
-
-	    if test "$prev" = dlfiles; then
-	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		func_append dlfiles " $pic_object"
-		prev=
-		continue
-	      else
-		# If libtool objects are unsupported, then we need to preload.
-		prev=dlprefiles
-	      fi
-	    fi
-
-	    # CHECK ME:  I think I busted this.  -Ossama
-	    if test "$prev" = dlprefiles; then
-	      # Preload the old-style object.
-	      func_append dlprefiles " $pic_object"
-	      prev=
-	    fi
-
-	    # A PIC object.
-	    func_append libobjs " $pic_object"
-	    arg="$pic_object"
-	  fi
-
-	  # Non-PIC object.
-	  if test "$non_pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    non_pic_object="$xdir$non_pic_object"
-
-	    # A standard non-PIC object
-	    func_append non_pic_objects " $non_pic_object"
-	    if test -z "$pic_object" || test "$pic_object" = none ; then
-	      arg="$non_pic_object"
-	    fi
-	  else
-	    # If the PIC object exists, use it instead.
-	    # $xdir was prepended to $pic_object above.
-	    non_pic_object="$pic_object"
-	    func_append non_pic_objects " $non_pic_object"
-	  fi
-	else
-	  # Only an error if not doing a dry-run.
-	  if $opt_dry_run; then
-	    # Extract subdirectory from the argument.
-	    func_dirname "$arg" "/" ""
-	    xdir="$func_dirname_result"
-
-	    func_lo2o "$arg"
-	    pic_object=$xdir$objdir/$func_lo2o_result
-	    non_pic_object=$xdir$func_lo2o_result
-	    func_append libobjs " $pic_object"
-	    func_append non_pic_objects " $non_pic_object"
-	  else
-	    func_fatal_error "\`$arg' is not a valid libtool object"
-	  fi
-	fi
-	;;
-
-      *.$libext)
-	# An archive.
-	func_append deplibs " $arg"
-	func_append old_deplibs " $arg"
-	continue
-	;;
-
-      *.la)
-	# A libtool-controlled library.
-
-	func_resolve_sysroot "$arg"
-	if test "$prev" = dlfiles; then
-	  # This library was specified with -dlopen.
-	  func_append dlfiles " $func_resolve_sysroot_result"
-	  prev=
-	elif test "$prev" = dlprefiles; then
-	  # The library was specified with -dlpreopen.
-	  func_append dlprefiles " $func_resolve_sysroot_result"
-	  prev=
-	else
-	  func_append deplibs " $func_resolve_sysroot_result"
-	fi
-	continue
-	;;
-
-      # Some other compiler argument.
-      *)
-	# Unknown arguments in both finalize_command and compile_command need
-	# to be aesthetically quoted because they are evaled later.
-	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-      esac # arg
-
-      # Now actually substitute the argument into the commands.
-      if test -n "$arg"; then
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-      fi
-    done # argument parsing loop
-
-    test -n "$prev" && \
-      func_fatal_help "the \`$prevarg' option requires an argument"
-
-    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
-      eval arg=\"$export_dynamic_flag_spec\"
-      func_append compile_command " $arg"
-      func_append finalize_command " $arg"
-    fi
-
-    oldlibs=
-    # calculate the name of the file, without its directory
-    func_basename "$output"
-    outputname="$func_basename_result"
-    libobjs_save="$libobjs"
-
-    if test -n "$shlibpath_var"; then
-      # get the directories listed in $shlibpath_var
-      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
-    else
-      shlib_search_path=
-    fi
-    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
-    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
-
-    func_dirname "$output" "/" ""
-    output_objdir="$func_dirname_result$objdir"
-    func_to_tool_file "$output_objdir/"
-    tool_output_objdir=$func_to_tool_file_result
-    # Create the object directory.
-    func_mkdir_p "$output_objdir"
-
-    # Determine the type of output
-    case $output in
-    "")
-      func_fatal_help "you must specify an output file"
-      ;;
-    *.$libext) linkmode=oldlib ;;
-    *.lo | *.$objext) linkmode=obj ;;
-    *.la) linkmode=lib ;;
-    *) linkmode=prog ;; # Anything else should be a program.
-    esac
-
-    specialdeplibs=
-
-    libs=
-    # Find all interdependent deplibs by searching for libraries
-    # that are linked more than once (e.g. -la -lb -la)
-    for deplib in $deplibs; do
-      if $opt_preserve_dup_deps ; then
-	case "$libs " in
-	*" $deplib "*) func_append specialdeplibs " $deplib" ;;
-	esac
-      fi
-      func_append libs " $deplib"
-    done
-
-    if test "$linkmode" = lib; then
-      libs="$predeps $libs $compiler_lib_search_path $postdeps"
-
-      # Compute libraries that are listed more than once in $predeps
-      # $postdeps and mark them as special (i.e., whose duplicates are
-      # not to be eliminated).
-      pre_post_deps=
-      if $opt_duplicate_compiler_generated_deps; then
-	for pre_post_dep in $predeps $postdeps; do
-	  case "$pre_post_deps " in
-	  *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;;
-	  esac
-	  func_append pre_post_deps " $pre_post_dep"
-	done
-      fi
-      pre_post_deps=
-    fi
-
-    deplibs=
-    newdependency_libs=
-    newlib_search_path=
-    need_relink=no # whether we're linking any uninstalled libtool libraries
-    notinst_deplibs= # not-installed libtool libraries
-    notinst_path= # paths that contain not-installed libtool libraries
-
-    case $linkmode in
-    lib)
-	passes="conv dlpreopen link"
-	for file in $dlfiles $dlprefiles; do
-	  case $file in
-	  *.la) ;;
-	  *)
-	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
-	    ;;
-	  esac
-	done
-	;;
-    prog)
-	compile_deplibs=
-	finalize_deplibs=
-	alldeplibs=no
-	newdlfiles=
-	newdlprefiles=
-	passes="conv scan dlopen dlpreopen link"
-	;;
-    *)  passes="conv"
-	;;
-    esac
-
-    for pass in $passes; do
-      # The preopen pass in lib mode reverses $deplibs; put it back here
-      # so that -L comes before libs that need it for instance...
-      if test "$linkmode,$pass" = "lib,link"; then
-	## FIXME: Find the place where the list is rebuilt in the wrong
-	##        order, and fix it there properly
-        tmp_deplibs=
-	for deplib in $deplibs; do
-	  tmp_deplibs="$deplib $tmp_deplibs"
-	done
-	deplibs="$tmp_deplibs"
-      fi
-
-      if test "$linkmode,$pass" = "lib,link" ||
-	 test "$linkmode,$pass" = "prog,scan"; then
-	libs="$deplibs"
-	deplibs=
-      fi
-      if test "$linkmode" = prog; then
-	case $pass in
-	dlopen) libs="$dlfiles" ;;
-	dlpreopen) libs="$dlprefiles" ;;
-	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
-	esac
-      fi
-      if test "$linkmode,$pass" = "lib,dlpreopen"; then
-	# Collect and forward deplibs of preopened libtool libs
-	for lib in $dlprefiles; do
-	  # Ignore non-libtool-libs
-	  dependency_libs=
-	  func_resolve_sysroot "$lib"
-	  case $lib in
-	  *.la)	func_source "$func_resolve_sysroot_result" ;;
-	  esac
-
-	  # Collect preopened libtool deplibs, except any this library
-	  # has declared as weak libs
-	  for deplib in $dependency_libs; do
-	    func_basename "$deplib"
-            deplib_base=$func_basename_result
-	    case " $weak_libs " in
-	    *" $deplib_base "*) ;;
-	    *) func_append deplibs " $deplib" ;;
-	    esac
-	  done
-	done
-	libs="$dlprefiles"
-      fi
-      if test "$pass" = dlopen; then
-	# Collect dlpreopened libraries
-	save_deplibs="$deplibs"
-	deplibs=
-      fi
-
-      for deplib in $libs; do
-	lib=
-	found=no
-	case $deplib in
-	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
-        |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
-	  if test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$deplib $compile_deplibs"
-	    finalize_deplibs="$deplib $finalize_deplibs"
-	  else
-	    func_append compiler_flags " $deplib"
-	    if test "$linkmode" = lib ; then
-		case "$new_inherited_linker_flags " in
-		    *" $deplib "*) ;;
-		    * ) func_append new_inherited_linker_flags " $deplib" ;;
-		esac
-	    fi
-	  fi
-	  continue
-	  ;;
-	-l*)
-	  if test "$linkmode" != lib && test "$linkmode" != prog; then
-	    func_warning "\`-l' is ignored for archives/objects"
-	    continue
-	  fi
-	  func_stripname '-l' '' "$deplib"
-	  name=$func_stripname_result
-	  if test "$linkmode" = lib; then
-	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
-	  else
-	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
-	  fi
-	  for searchdir in $searchdirs; do
-	    for search_ext in .la $std_shrext .so .a; do
-	      # Search the libtool library
-	      lib="$searchdir/lib${name}${search_ext}"
-	      if test -f "$lib"; then
-		if test "$search_ext" = ".la"; then
-		  found=yes
-		else
-		  found=no
-		fi
-		break 2
-	      fi
-	    done
-	  done
-	  if test "$found" != yes; then
-	    # deplib doesn't seem to be a libtool library
-	    if test "$linkmode,$pass" = "prog,link"; then
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      deplibs="$deplib $deplibs"
-	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    continue
-	  else # deplib is a libtool library
-	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
-	    # We need to do some special things here, and not later.
-	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	      case " $predeps $postdeps " in
-	      *" $deplib "*)
-		if func_lalib_p "$lib"; then
-		  library_names=
-		  old_library=
-		  func_source "$lib"
-		  for l in $old_library $library_names; do
-		    ll="$l"
-		  done
-		  if test "X$ll" = "X$old_library" ; then # only static version available
-		    found=no
-		    func_dirname "$lib" "" "."
-		    ladir="$func_dirname_result"
-		    lib=$ladir/$old_library
-		    if test "$linkmode,$pass" = "prog,link"; then
-		      compile_deplibs="$deplib $compile_deplibs"
-		      finalize_deplibs="$deplib $finalize_deplibs"
-		    else
-		      deplibs="$deplib $deplibs"
-		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-		    fi
-		    continue
-		  fi
-		fi
-		;;
-	      *) ;;
-	      esac
-	    fi
-	  fi
-	  ;; # -l
-	*.ltframework)
-	  if test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$deplib $compile_deplibs"
-	    finalize_deplibs="$deplib $finalize_deplibs"
-	  else
-	    deplibs="$deplib $deplibs"
-	    if test "$linkmode" = lib ; then
-		case "$new_inherited_linker_flags " in
-		    *" $deplib "*) ;;
-		    * ) func_append new_inherited_linker_flags " $deplib" ;;
-		esac
-	    fi
-	  fi
-	  continue
-	  ;;
-	-L*)
-	  case $linkmode in
-	  lib)
-	    deplibs="$deplib $deplibs"
-	    test "$pass" = conv && continue
-	    newdependency_libs="$deplib $newdependency_libs"
-	    func_stripname '-L' '' "$deplib"
-	    func_resolve_sysroot "$func_stripname_result"
-	    func_append newlib_search_path " $func_resolve_sysroot_result"
-	    ;;
-	  prog)
-	    if test "$pass" = conv; then
-	      deplibs="$deplib $deplibs"
-	      continue
-	    fi
-	    if test "$pass" = scan; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    func_stripname '-L' '' "$deplib"
-	    func_resolve_sysroot "$func_stripname_result"
-	    func_append newlib_search_path " $func_resolve_sysroot_result"
-	    ;;
-	  *)
-	    func_warning "\`-L' is ignored for archives/objects"
-	    ;;
-	  esac # linkmode
-	  continue
-	  ;; # -L
-	-R*)
-	  if test "$pass" = link; then
-	    func_stripname '-R' '' "$deplib"
-	    func_resolve_sysroot "$func_stripname_result"
-	    dir=$func_resolve_sysroot_result
-	    # Make sure the xrpath contains only unique directories.
-	    case "$xrpath " in
-	    *" $dir "*) ;;
-	    *) func_append xrpath " $dir" ;;
-	    esac
-	  fi
-	  deplibs="$deplib $deplibs"
-	  continue
-	  ;;
-	*.la)
-	  func_resolve_sysroot "$deplib"
-	  lib=$func_resolve_sysroot_result
-	  ;;
-	*.$libext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	    continue
-	  fi
-	  case $linkmode in
-	  lib)
-	    # Linking convenience modules into shared libraries is allowed,
-	    # but linking other static libraries is non-portable.
-	    case " $dlpreconveniencelibs " in
-	    *" $deplib "*) ;;
-	    *)
-	      valid_a_lib=no
-	      case $deplibs_check_method in
-		match_pattern*)
-		  set dummy $deplibs_check_method; shift
-		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
-		    | $EGREP "$match_pattern_regex" > /dev/null; then
-		    valid_a_lib=yes
-		  fi
-		;;
-		pass_all)
-		  valid_a_lib=yes
-		;;
-	      esac
-	      if test "$valid_a_lib" != yes; then
-		echo
-		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
-		echo "*** I have the capability to make that library automatically link in when"
-		echo "*** you link to this library.  But I can only do this if you have a"
-		echo "*** shared version of the library, which you do not appear to have"
-		echo "*** because the file extensions .$libext of this argument makes me believe"
-		echo "*** that it is just a static archive that I should not use here."
-	      else
-		echo
-		$ECHO "*** Warning: Linking the shared library $output against the"
-		$ECHO "*** static library $deplib is not portable!"
-		deplibs="$deplib $deplibs"
-	      fi
-	      ;;
-	    esac
-	    continue
-	    ;;
-	  prog)
-	    if test "$pass" != link; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    continue
-	    ;;
-	  esac # linkmode
-	  ;; # *.$libext
-	*.lo | *.$objext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	  elif test "$linkmode" = prog; then
-	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
-	      # If there is no dlopen support or we're linking statically,
-	      # we need to preload.
-	      func_append newdlprefiles " $deplib"
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      func_append newdlfiles " $deplib"
-	    fi
-	  fi
-	  continue
-	  ;;
-	%DEPLIBS%)
-	  alldeplibs=yes
-	  continue
-	  ;;
-	esac # case $deplib
-
-	if test "$found" = yes || test -f "$lib"; then :
-	else
-	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
-	fi
-
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$lib" \
-	  || func_fatal_error "\`$lib' is not a valid libtool archive"
-
-	func_dirname "$lib" "" "."
-	ladir="$func_dirname_result"
-
-	dlname=
-	dlopen=
-	dlpreopen=
-	libdir=
-	library_names=
-	old_library=
-	inherited_linker_flags=
-	# If the library was installed with an old release of libtool,
-	# it will not redefine variables installed, or shouldnotlink
-	installed=yes
-	shouldnotlink=no
-	avoidtemprpath=
-
-
-	# Read the .la file
-	func_source "$lib"
-
-	# Convert "-framework foo" to "foo.ltframework"
-	if test -n "$inherited_linker_flags"; then
-	  tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
-	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
-	    case " $new_inherited_linker_flags " in
-	      *" $tmp_inherited_linker_flag "*) ;;
-	      *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";;
-	    esac
-	  done
-	fi
-	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	if test "$linkmode,$pass" = "lib,link" ||
-	   test "$linkmode,$pass" = "prog,scan" ||
-	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
-	  test -n "$dlopen" && func_append dlfiles " $dlopen"
-	  test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
-	fi
-
-	if test "$pass" = conv; then
-	  # Only check for convenience libraries
-	  deplibs="$lib $deplibs"
-	  if test -z "$libdir"; then
-	    if test -z "$old_library"; then
-	      func_fatal_error "cannot find name of link library for \`$lib'"
-	    fi
-	    # It is a libtool convenience library, so add in its objects.
-	    func_append convenience " $ladir/$objdir/$old_library"
-	    func_append old_convenience " $ladir/$objdir/$old_library"
-	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
-	    func_fatal_error "\`$lib' is not a convenience library"
-	  fi
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    deplibs="$deplib $deplibs"
-	    if $opt_preserve_dup_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
-	      esac
-	    fi
-	    func_append tmp_libs " $deplib"
-	  done
-	  continue
-	fi # $pass = conv
-
-
-	# Get the name of the library we link against.
-	linklib=
-	if test -n "$old_library" &&
-	   { test "$prefer_static_libs" = yes ||
-	     test "$prefer_static_libs,$installed" = "built,no"; }; then
-	  linklib=$old_library
-	else
-	  for l in $old_library $library_names; do
-	    linklib="$l"
-	  done
-	fi
-	if test -z "$linklib"; then
-	  func_fatal_error "cannot find name of link library for \`$lib'"
-	fi
-
-	# This library was specified with -dlopen.
-	if test "$pass" = dlopen; then
-	  if test -z "$libdir"; then
-	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
-	  fi
-	  if test -z "$dlname" ||
-	     test "$dlopen_support" != yes ||
-	     test "$build_libtool_libs" = no; then
-	    # If there is no dlname, no dlopen support or we're linking
-	    # statically, we need to preload.  We also need to preload any
-	    # dependent libraries so libltdl's deplib preloader doesn't
-	    # bomb out in the load deplibs phase.
-	    func_append dlprefiles " $lib $dependency_libs"
-	  else
-	    func_append newdlfiles " $lib"
-	  fi
-	  continue
-	fi # $pass = dlopen
-
-	# We need an absolute path.
-	case $ladir in
-	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
-	*)
-	  abs_ladir=`cd "$ladir" && pwd`
-	  if test -z "$abs_ladir"; then
-	    func_warning "cannot determine absolute directory name of \`$ladir'"
-	    func_warning "passing it literally to the linker, although it might fail"
-	    abs_ladir="$ladir"
-	  fi
-	  ;;
-	esac
-	func_basename "$lib"
-	laname="$func_basename_result"
-
-	# Find the relevant object directory and library name.
-	if test "X$installed" = Xyes; then
-	  if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    func_warning "library \`$lib' was moved."
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    libdir="$abs_ladir"
-	  else
-	    dir="$lt_sysroot$libdir"
-	    absdir="$lt_sysroot$libdir"
-	  fi
-	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
-	else
-	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    # Remove this search path later
-	    func_append notinst_path " $abs_ladir"
-	  else
-	    dir="$ladir/$objdir"
-	    absdir="$abs_ladir/$objdir"
-	    # Remove this search path later
-	    func_append notinst_path " $abs_ladir"
-	  fi
-	fi # $installed = yes
-	func_stripname 'lib' '.la' "$laname"
-	name=$func_stripname_result
-
-	# This library was specified with -dlpreopen.
-	if test "$pass" = dlpreopen; then
-	  if test -z "$libdir" && test "$linkmode" = prog; then
-	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
-	  fi
-	  case "$host" in
-	    # special handling for platforms with PE-DLLs.
-	    *cygwin* | *mingw* | *cegcc* )
-	      # Linker will automatically link against shared library if both
-	      # static and shared are present.  Therefore, ensure we extract
-	      # symbols from the import library if a shared library is present
-	      # (otherwise, the dlopen module name will be incorrect).  We do
-	      # this by putting the import library name into $newdlprefiles.
-	      # We recover the dlopen module name by 'saving' the la file
-	      # name in a special purpose variable, and (later) extracting the
-	      # dlname from the la file.
-	      if test -n "$dlname"; then
-	        func_tr_sh "$dir/$linklib"
-	        eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
-	        func_append newdlprefiles " $dir/$linklib"
-	      else
-	        func_append newdlprefiles " $dir/$old_library"
-	        # Keep a list of preopened convenience libraries to check
-	        # that they are being used correctly in the link pass.
-	        test -z "$libdir" && \
-	          func_append dlpreconveniencelibs " $dir/$old_library"
-	      fi
-	    ;;
-	    * )
-	      # Prefer using a static library (so that no silly _DYNAMIC symbols
-	      # are required to link).
-	      if test -n "$old_library"; then
-	        func_append newdlprefiles " $dir/$old_library"
-	        # Keep a list of preopened convenience libraries to check
-	        # that they are being used correctly in the link pass.
-	        test -z "$libdir" && \
-	          func_append dlpreconveniencelibs " $dir/$old_library"
-	      # Otherwise, use the dlname, so that lt_dlopen finds it.
-	      elif test -n "$dlname"; then
-	        func_append newdlprefiles " $dir/$dlname"
-	      else
-	        func_append newdlprefiles " $dir/$linklib"
-	      fi
-	    ;;
-	  esac
-	fi # $pass = dlpreopen
-
-	if test -z "$libdir"; then
-	  # Link the convenience library
-	  if test "$linkmode" = lib; then
-	    deplibs="$dir/$old_library $deplibs"
-	  elif test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$dir/$old_library $compile_deplibs"
-	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
-	  else
-	    deplibs="$lib $deplibs" # used for prog,scan pass
-	  fi
-	  continue
-	fi
-
-
-	if test "$linkmode" = prog && test "$pass" != link; then
-	  func_append newlib_search_path " $ladir"
-	  deplibs="$lib $deplibs"
-
-	  linkalldeplibs=no
-	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
-	     test "$build_libtool_libs" = no; then
-	    linkalldeplibs=yes
-	  fi
-
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    case $deplib in
-	    -L*) func_stripname '-L' '' "$deplib"
-	         func_resolve_sysroot "$func_stripname_result"
-	         func_append newlib_search_path " $func_resolve_sysroot_result"
-		 ;;
-	    esac
-	    # Need to link against all dependency_libs?
-	    if test "$linkalldeplibs" = yes; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      # Need to hardcode shared library paths
-	      # or/and link against static libraries
-	      newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    if $opt_preserve_dup_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
-	      esac
-	    fi
-	    func_append tmp_libs " $deplib"
-	  done # for deplib
-	  continue
-	fi # $linkmode = prog...
-
-	if test "$linkmode,$pass" = "prog,link"; then
-	  if test -n "$library_names" &&
-	     { { test "$prefer_static_libs" = no ||
-	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
-	       test -z "$old_library"; }; then
-	    # We need to hardcode the library path
-	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
-	      # Make sure the rpath contains only unique directories.
-	      case "$temp_rpath:" in
-	      *"$absdir:"*) ;;
-	      *) func_append temp_rpath "$absdir:" ;;
-	      esac
-	    fi
-
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) func_append compile_rpath " $absdir" ;;
-	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) func_append finalize_rpath " $libdir" ;;
-	      esac
-	      ;;
-	    esac
-	  fi # $linkmode,$pass = prog,link...
-
-	  if test "$alldeplibs" = yes &&
-	     { test "$deplibs_check_method" = pass_all ||
-	       { test "$build_libtool_libs" = yes &&
-		 test -n "$library_names"; }; }; then
-	    # We only need to search for static libraries
-	    continue
-	  fi
-	fi
-
-	link_static=no # Whether the deplib will be linked statically
-	use_static_libs=$prefer_static_libs
-	if test "$use_static_libs" = built && test "$installed" = yes; then
-	  use_static_libs=no
-	fi
-	if test -n "$library_names" &&
-	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
-	  case $host in
-	  *cygwin* | *mingw* | *cegcc*)
-	      # No point in relinking DLLs because paths are not encoded
-	      func_append notinst_deplibs " $lib"
-	      need_relink=no
-	    ;;
-	  *)
-	    if test "$installed" = no; then
-	      func_append notinst_deplibs " $lib"
-	      need_relink=yes
-	    fi
-	    ;;
-	  esac
-	  # This is a shared library
-
-	  # Warn about portability, can't link against -module's on some
-	  # systems (darwin).  Don't bleat about dlopened modules though!
-	  dlopenmodule=""
-	  for dlpremoduletest in $dlprefiles; do
-	    if test "X$dlpremoduletest" = "X$lib"; then
-	      dlopenmodule="$dlpremoduletest"
-	      break
-	    fi
-	  done
-	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
-	    echo
-	    if test "$linkmode" = prog; then
-	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
-	    else
-	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
-	    fi
-	    $ECHO "*** $linklib is not portable!"
-	  fi
-	  if test "$linkmode" = lib &&
-	     test "$hardcode_into_libs" = yes; then
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) func_append compile_rpath " $absdir" ;;
-	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) func_append finalize_rpath " $libdir" ;;
-	      esac
-	      ;;
-	    esac
-	  fi
-
-	  if test -n "$old_archive_from_expsyms_cmds"; then
-	    # figure out the soname
-	    set dummy $library_names
-	    shift
-	    realname="$1"
-	    shift
-	    libname=`eval "\\$ECHO \"$libname_spec\""`
-	    # use dlname if we got it. it's perfectly good, no?
-	    if test -n "$dlname"; then
-	      soname="$dlname"
-	    elif test -n "$soname_spec"; then
-	      # bleh windows
-	      case $host in
-	      *cygwin* | mingw* | *cegcc*)
-	        func_arith $current - $age
-		major=$func_arith_result
-		versuffix="-$major"
-		;;
-	      esac
-	      eval soname=\"$soname_spec\"
-	    else
-	      soname="$realname"
-	    fi
-
-	    # Make a new name for the extract_expsyms_cmds to use
-	    soroot="$soname"
-	    func_basename "$soroot"
-	    soname="$func_basename_result"
-	    func_stripname 'lib' '.dll' "$soname"
-	    newlib=libimp-$func_stripname_result.a
-
-	    # If the library has no export list, then create one now
-	    if test -f "$output_objdir/$soname-def"; then :
-	    else
-	      func_verbose "extracting exported symbol list from \`$soname'"
-	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
-	    fi
-
-	    # Create $newlib
-	    if test -f "$output_objdir/$newlib"; then :; else
-	      func_verbose "generating import library for \`$soname'"
-	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
-	    fi
-	    # make sure the library variables are pointing to the new library
-	    dir=$output_objdir
-	    linklib=$newlib
-	  fi # test -n "$old_archive_from_expsyms_cmds"
-
-	  if test "$linkmode" = prog || test "$opt_mode" != relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    lib_linked=yes
-	    case $hardcode_action in
-	    immediate | unsupported)
-	      if test "$hardcode_direct" = no; then
-		add="$dir/$linklib"
-		case $host in
-		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
-		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
-		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
-		    *-*-unixware7*) add_dir="-L$dir" ;;
-		  *-*-darwin* )
-		    # if the lib is a (non-dlopened) module then we can not
-		    # link against it, someone is ignoring the earlier warnings
-		    if /usr/bin/file -L $add 2> /dev/null |
-			 $GREP ": [^:]* bundle" >/dev/null ; then
-		      if test "X$dlopenmodule" != "X$lib"; then
-			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
-			if test -z "$old_library" ; then
-			  echo
-			  echo "*** And there doesn't seem to be a static archive available"
-			  echo "*** The link will probably fail, sorry"
-			else
-			  add="$dir/$old_library"
-			fi
-		      elif test -n "$old_library"; then
-			add="$dir/$old_library"
-		      fi
-		    fi
-		esac
-	      elif test "$hardcode_minus_L" = no; then
-		case $host in
-		*-*-sunos*) add_shlibpath="$dir" ;;
-		esac
-		add_dir="-L$dir"
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = no; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    relink)
-	      if test "$hardcode_direct" = yes &&
-	         test "$hardcode_direct_absolute" = no; then
-		add="$dir/$linklib"
-	      elif test "$hardcode_minus_L" = yes; then
-		add_dir="-L$absdir"
-		# Try looking first in the location we're being installed to.
-		if test -n "$inst_prefix_dir"; then
-		  case $libdir in
-		    [\\/]*)
-		      func_append add_dir " -L$inst_prefix_dir$libdir"
-		      ;;
-		  esac
-		fi
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = yes; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    *) lib_linked=no ;;
-	    esac
-
-	    if test "$lib_linked" != yes; then
-	      func_fatal_configuration "unsupported hardcode properties"
-	    fi
-
-	    if test -n "$add_shlibpath"; then
-	      case :$compile_shlibpath: in
-	      *":$add_shlibpath:"*) ;;
-	      *) func_append compile_shlibpath "$add_shlibpath:" ;;
-	      esac
-	    fi
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
-	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	      if test "$hardcode_direct" != yes &&
-		 test "$hardcode_minus_L" != yes &&
-		 test "$hardcode_shlibpath_var" = yes; then
-		case :$finalize_shlibpath: in
-		*":$libdir:"*) ;;
-		*) func_append finalize_shlibpath "$libdir:" ;;
-		esac
-	      fi
-	    fi
-	  fi
-
-	  if test "$linkmode" = prog || test "$opt_mode" = relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    # Finalize command for both is simple: just hardcode it.
-	    if test "$hardcode_direct" = yes &&
-	       test "$hardcode_direct_absolute" = no; then
-	      add="$libdir/$linklib"
-	    elif test "$hardcode_minus_L" = yes; then
-	      add_dir="-L$libdir"
-	      add="-l$name"
-	    elif test "$hardcode_shlibpath_var" = yes; then
-	      case :$finalize_shlibpath: in
-	      *":$libdir:"*) ;;
-	      *) func_append finalize_shlibpath "$libdir:" ;;
-	      esac
-	      add="-l$name"
-	    elif test "$hardcode_automatic" = yes; then
-	      if test -n "$inst_prefix_dir" &&
-		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
-		add="$inst_prefix_dir$libdir/$linklib"
-	      else
-		add="$libdir/$linklib"
-	      fi
-	    else
-	      # We cannot seem to hardcode it, guess we'll fake it.
-	      add_dir="-L$libdir"
-	      # Try looking first in the location we're being installed to.
-	      if test -n "$inst_prefix_dir"; then
-		case $libdir in
-		  [\\/]*)
-		    func_append add_dir " -L$inst_prefix_dir$libdir"
-		    ;;
-		esac
-	      fi
-	      add="-l$name"
-	    fi
-
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
-	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	    fi
-	  fi
-	elif test "$linkmode" = prog; then
-	  # Here we assume that one of hardcode_direct or hardcode_minus_L
-	  # is not unsupported.  This is valid on all known static and
-	  # shared platforms.
-	  if test "$hardcode_direct" != unsupported; then
-	    test -n "$old_library" && linklib="$old_library"
-	    compile_deplibs="$dir/$linklib $compile_deplibs"
-	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
-	  else
-	    compile_deplibs="-l$name -L$dir $compile_deplibs"
-	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
-	  fi
-	elif test "$build_libtool_libs" = yes; then
-	  # Not a shared library
-	  if test "$deplibs_check_method" != pass_all; then
-	    # We're trying link a shared library against a static one
-	    # but the system doesn't support it.
-
-	    # Just print a warning and add the library to dependency_libs so
-	    # that the program can be linked against the static library.
-	    echo
-	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
-	    echo "*** I have the capability to make that library automatically link in when"
-	    echo "*** you link to this library.  But I can only do this if you have a"
-	    echo "*** shared version of the library, which you do not appear to have."
-	    if test "$module" = yes; then
-	      echo "*** But as you try to build a module library, libtool will still create "
-	      echo "*** a static module, that should work as long as the dlopening application"
-	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
-	      if test -z "$global_symbol_pipe"; then
-		echo
-		echo "*** However, this would only work if libtool was able to extract symbol"
-		echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
-		echo "*** not find such a program.  So, this module is probably useless."
-		echo "*** \`nm' from GNU binutils and a full rebuild may help."
-	      fi
-	      if test "$build_old_libs" = no; then
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
-	  else
-	    deplibs="$dir/$old_library $deplibs"
-	    link_static=yes
-	  fi
-	fi # link shared/static library?
-
-	if test "$linkmode" = lib; then
-	  if test -n "$dependency_libs" &&
-	     { test "$hardcode_into_libs" != yes ||
-	       test "$build_old_libs" = yes ||
-	       test "$link_static" = yes; }; then
-	    # Extract -R from dependency_libs
-	    temp_deplibs=
-	    for libdir in $dependency_libs; do
-	      case $libdir in
-	      -R*) func_stripname '-R' '' "$libdir"
-	           temp_xrpath=$func_stripname_result
-		   case " $xrpath " in
-		   *" $temp_xrpath "*) ;;
-		   *) func_append xrpath " $temp_xrpath";;
-		   esac;;
-	      *) func_append temp_deplibs " $libdir";;
-	      esac
-	    done
-	    dependency_libs="$temp_deplibs"
-	  fi
-
-	  func_append newlib_search_path " $absdir"
-	  # Link against this library
-	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
-	  # ... and its dependency_libs
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    newdependency_libs="$deplib $newdependency_libs"
-	    case $deplib in
-              -L*) func_stripname '-L' '' "$deplib"
-                   func_resolve_sysroot "$func_stripname_result";;
-              *) func_resolve_sysroot "$deplib" ;;
-            esac
-	    if $opt_preserve_dup_deps ; then
-	      case "$tmp_libs " in
-	      *" $func_resolve_sysroot_result "*)
-                func_append specialdeplibs " $func_resolve_sysroot_result" ;;
-	      esac
-	    fi
-	    func_append tmp_libs " $func_resolve_sysroot_result"
-	  done
-
-	  if test "$link_all_deplibs" != no; then
-	    # Add the search paths of all dependency libraries
-	    for deplib in $dependency_libs; do
-	      path=
-	      case $deplib in
-	      -L*) path="$deplib" ;;
-	      *.la)
-	        func_resolve_sysroot "$deplib"
-	        deplib=$func_resolve_sysroot_result
-	        func_dirname "$deplib" "" "."
-		dir=$func_dirname_result
-		# We need an absolute path.
-		case $dir in
-		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
-		*)
-		  absdir=`cd "$dir" && pwd`
-		  if test -z "$absdir"; then
-		    func_warning "cannot determine absolute directory name of \`$dir'"
-		    absdir="$dir"
-		  fi
-		  ;;
-		esac
-		if $GREP "^installed=no" $deplib > /dev/null; then
-		case $host in
-		*-*-darwin*)
-		  depdepl=
-		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
-		  if test -n "$deplibrary_names" ; then
-		    for tmp in $deplibrary_names ; do
-		      depdepl=$tmp
-		    done
-		    if test -f "$absdir/$objdir/$depdepl" ; then
-		      depdepl="$absdir/$objdir/$depdepl"
-		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
-                      if test -z "$darwin_install_name"; then
-                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
-                      fi
-		      func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
-		      func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}"
-		      path=
-		    fi
-		  fi
-		  ;;
-		*)
-		  path="-L$absdir/$objdir"
-		  ;;
-		esac
-		else
-		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		  test -z "$libdir" && \
-		    func_fatal_error "\`$deplib' is not a valid libtool archive"
-		  test "$absdir" != "$libdir" && \
-		    func_warning "\`$deplib' seems to be moved"
-
-		  path="-L$absdir"
-		fi
-		;;
-	      esac
-	      case " $deplibs " in
-	      *" $path "*) ;;
-	      *) deplibs="$path $deplibs" ;;
-	      esac
-	    done
-	  fi # link_all_deplibs != no
-	fi # linkmode = lib
-      done # for deplib in $libs
-      if test "$pass" = link; then
-	if test "$linkmode" = "prog"; then
-	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
-	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
-	else
-	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	fi
-      fi
-      dependency_libs="$newdependency_libs"
-      if test "$pass" = dlpreopen; then
-	# Link the dlpreopened libraries before other libraries
-	for deplib in $save_deplibs; do
-	  deplibs="$deplib $deplibs"
-	done
-      fi
-      if test "$pass" != dlopen; then
-	if test "$pass" != conv; then
-	  # Make sure lib_search_path contains only unique directories.
-	  lib_search_path=
-	  for dir in $newlib_search_path; do
-	    case "$lib_search_path " in
-	    *" $dir "*) ;;
-	    *) func_append lib_search_path " $dir" ;;
-	    esac
-	  done
-	  newlib_search_path=
-	fi
-
-	if test "$linkmode,$pass" != "prog,link"; then
-	  vars="deplibs"
-	else
-	  vars="compile_deplibs finalize_deplibs"
-	fi
-	for var in $vars dependency_libs; do
-	  # Add libraries to $var in reverse order
-	  eval tmp_libs=\"\$$var\"
-	  new_libs=
-	  for deplib in $tmp_libs; do
-	    # FIXME: Pedantically, this is the right thing to do, so
-	    #        that some nasty dependency loop isn't accidentally
-	    #        broken:
-	    #new_libs="$deplib $new_libs"
-	    # Pragmatically, this seems to cause very few problems in
-	    # practice:
-	    case $deplib in
-	    -L*) new_libs="$deplib $new_libs" ;;
-	    -R*) ;;
-	    *)
-	      # And here is the reason: when a library appears more
-	      # than once as an explicit dependence of a library, or
-	      # is implicitly linked in more than once by the
-	      # compiler, it is considered special, and multiple
-	      # occurrences thereof are not removed.  Compare this
-	      # with having the same library being listed as a
-	      # dependency of multiple other libraries: in this case,
-	      # we know (pedantically, we assume) the library does not
-	      # need to be listed more than once, so we keep only the
-	      # last copy.  This is not always right, but it is rare
-	      # enough that we require users that really mean to play
-	      # such unportable linking tricks to link the library
-	      # using -Wl,-lname, so that libtool does not consider it
-	      # for duplicate removal.
-	      case " $specialdeplibs " in
-	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
-	      *)
-		case " $new_libs " in
-		*" $deplib "*) ;;
-		*) new_libs="$deplib $new_libs" ;;
-		esac
-		;;
-	      esac
-	      ;;
-	    esac
-	  done
-	  tmp_libs=
-	  for deplib in $new_libs; do
-	    case $deplib in
-	    -L*)
-	      case " $tmp_libs " in
-	      *" $deplib "*) ;;
-	      *) func_append tmp_libs " $deplib" ;;
-	      esac
-	      ;;
-	    *) func_append tmp_libs " $deplib" ;;
-	    esac
-	  done
-	  eval $var=\"$tmp_libs\"
-	done # for var
-      fi
-      # Last step: remove runtime libs from dependency_libs
-      # (they stay in deplibs)
-      tmp_libs=
-      for i in $dependency_libs ; do
-	case " $predeps $postdeps $compiler_lib_search_path " in
-	*" $i "*)
-	  i=""
-	  ;;
-	esac
-	if test -n "$i" ; then
-	  func_append tmp_libs " $i"
-	fi
-      done
-      dependency_libs=$tmp_libs
-    done # for pass
-    if test "$linkmode" = prog; then
-      dlfiles="$newdlfiles"
-    fi
-    if test "$linkmode" = prog || test "$linkmode" = lib; then
-      dlprefiles="$newdlprefiles"
-    fi
-
-    case $linkmode in
-    oldlib)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for archives"
-      fi
-
-      case " $deplibs" in
-      *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for archives" ;;
-      esac
-
-      test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for archives"
-
-      test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for archives"
-
-      test -n "$vinfo" && \
-	func_warning "\`-version-info/-version-number' is ignored for archives"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for archives"
-
-      test -n "$export_symbols$export_symbols_regex" && \
-	func_warning "\`-export-symbols' is ignored for archives"
-
-      # Now set the variables for building old libraries.
-      build_libtool_libs=no
-      oldlibs="$output"
-      func_append objs "$old_deplibs"
-      ;;
-
-    lib)
-      # Make sure we only generate libraries of the form `libNAME.la'.
-      case $outputname in
-      lib*)
-	func_stripname 'lib' '.la' "$outputname"
-	name=$func_stripname_result
-	eval shared_ext=\"$shrext_cmds\"
-	eval libname=\"$libname_spec\"
-	;;
-      *)
-	test "$module" = no && \
-	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
-
-	if test "$need_lib_prefix" != no; then
-	  # Add the "lib" prefix for modules if required
-	  func_stripname '' '.la' "$outputname"
-	  name=$func_stripname_result
-	  eval shared_ext=\"$shrext_cmds\"
-	  eval libname=\"$libname_spec\"
-	else
-	  func_stripname '' '.la' "$outputname"
-	  libname=$func_stripname_result
-	fi
-	;;
-      esac
-
-      if test -n "$objs"; then
-	if test "$deplibs_check_method" != pass_all; then
-	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
-	else
-	  echo
-	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
-	  $ECHO "*** objects $objs is not portable!"
-	  func_append libobjs " $objs"
-	fi
-      fi
-
-      test "$dlself" != no && \
-	func_warning "\`-dlopen self' is ignored for libtool libraries"
-
-      set dummy $rpath
-      shift
-      test "$#" -gt 1 && \
-	func_warning "ignoring multiple \`-rpath's for a libtool library"
-
-      install_libdir="$1"
-
-      oldlibs=
-      if test -z "$rpath"; then
-	if test "$build_libtool_libs" = yes; then
-	  # Building a libtool convenience library.
-	  # Some compilers have problems with a `.al' extension so
-	  # convenience libraries should have the same extension an
-	  # archive normally would.
-	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
-	  build_libtool_libs=convenience
-	  build_old_libs=yes
-	fi
-
-	test -n "$vinfo" && \
-	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
-
-	test -n "$release" && \
-	  func_warning "\`-release' is ignored for convenience libraries"
-      else
-
-	# Parse the version information argument.
-	save_ifs="$IFS"; IFS=':'
-	set dummy $vinfo 0 0 0
-	shift
-	IFS="$save_ifs"
-
-	test -n "$7" && \
-	  func_fatal_help "too many parameters to \`-version-info'"
-
-	# convert absolute version numbers to libtool ages
-	# this retains compatibility with .la files and attempts
-	# to make the code below a bit more comprehensible
-
-	case $vinfo_number in
-	yes)
-	  number_major="$1"
-	  number_minor="$2"
-	  number_revision="$3"
-	  #
-	  # There are really only two kinds -- those that
-	  # use the current revision as the major version
-	  # and those that subtract age and use age as
-	  # a minor version.  But, then there is irix
-	  # which has an extra 1 added just for fun
-	  #
-	  case $version_type in
-	  # correct linux to gnu/linux during the next big refactor
-	  darwin|linux|osf|windows|none)
-	    func_arith $number_major + $number_minor
-	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_revision"
-	    ;;
-	  freebsd-aout|freebsd-elf|qnx|sunos)
-	    current="$number_major"
-	    revision="$number_minor"
-	    age="0"
-	    ;;
-	  irix|nonstopux)
-	    func_arith $number_major + $number_minor
-	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_minor"
-	    lt_irix_increment=no
-	    ;;
-	  esac
-	  ;;
-	no)
-	  current="$1"
-	  revision="$2"
-	  age="$3"
-	  ;;
-	esac
-
-	# Check that each of the things are valid numbers.
-	case $current in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "CURRENT \`$current' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	case $revision in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "REVISION \`$revision' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	case $age in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "AGE \`$age' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	if test "$age" -gt "$current"; then
-	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	fi
-
-	# Calculate the version variables.
-	major=
-	versuffix=
-	verstring=
-	case $version_type in
-	none) ;;
-
-	darwin)
-	  # Like Linux, but with the current version available in
-	  # verstring for coding it into the library header
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
-	  # Darwin ld doesn't like 0 for these options...
-	  func_arith $current + 1
-	  minor_current=$func_arith_result
-	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
-	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
-	  ;;
-
-	freebsd-aout)
-	  major=".$current"
-	  versuffix=".$current.$revision";
-	  ;;
-
-	freebsd-elf)
-	  major=".$current"
-	  versuffix=".$current"
-	  ;;
-
-	irix | nonstopux)
-	  if test "X$lt_irix_increment" = "Xno"; then
-	    func_arith $current - $age
-	  else
-	    func_arith $current - $age + 1
-	  fi
-	  major=$func_arith_result
-
-	  case $version_type in
-	    nonstopux) verstring_prefix=nonstopux ;;
-	    *)         verstring_prefix=sgi ;;
-	  esac
-	  verstring="$verstring_prefix$major.$revision"
-
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$revision
-	  while test "$loop" -ne 0; do
-	    func_arith $revision - $loop
-	    iface=$func_arith_result
-	    func_arith $loop - 1
-	    loop=$func_arith_result
-	    verstring="$verstring_prefix$major.$iface:$verstring"
-	  done
-
-	  # Before this point, $major must not contain `.'.
-	  major=.$major
-	  versuffix="$major.$revision"
-	  ;;
-
-	linux) # correct to gnu/linux during the next big refactor
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
-	  ;;
-
-	osf)
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix=".$current.$age.$revision"
-	  verstring="$current.$age.$revision"
-
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$age
-	  while test "$loop" -ne 0; do
-	    func_arith $current - $loop
-	    iface=$func_arith_result
-	    func_arith $loop - 1
-	    loop=$func_arith_result
-	    verstring="$verstring:${iface}.0"
-	  done
-
-	  # Make executables depend on our current version.
-	  func_append verstring ":${current}.0"
-	  ;;
-
-	qnx)
-	  major=".$current"
-	  versuffix=".$current"
-	  ;;
-
-	sunos)
-	  major=".$current"
-	  versuffix=".$current.$revision"
-	  ;;
-
-	windows)
-	  # Use '-' rather than '.', since we only want one
-	  # extension on DOS 8.3 filesystems.
-	  func_arith $current - $age
-	  major=$func_arith_result
-	  versuffix="-$major"
-	  ;;
-
-	*)
-	  func_fatal_configuration "unknown library version type \`$version_type'"
-	  ;;
-	esac
-
-	# Clear the version info if we defaulted, and they specified a release.
-	if test -z "$vinfo" && test -n "$release"; then
-	  major=
-	  case $version_type in
-	  darwin)
-	    # we can't check for "0.0" in archive_cmds due to quoting
-	    # problems, so we reset it completely
-	    verstring=
-	    ;;
-	  *)
-	    verstring="0.0"
-	    ;;
-	  esac
-	  if test "$need_version" = no; then
-	    versuffix=
-	  else
-	    versuffix=".0.0"
-	  fi
-	fi
-
-	# Remove version info from name if versioning should be avoided
-	if test "$avoid_version" = yes && test "$need_version" = no; then
-	  major=
-	  versuffix=
-	  verstring=""
-	fi
-
-	# Check to see if the archive will have undefined symbols.
-	if test "$allow_undefined" = yes; then
-	  if test "$allow_undefined_flag" = unsupported; then
-	    func_warning "undefined symbols not allowed in $host shared libraries"
-	    build_libtool_libs=no
-	    build_old_libs=yes
-	  fi
-	else
-	  # Don't allow undefined symbols.
-	  allow_undefined_flag="$no_undefined_flag"
-	fi
-
-      fi
-
-      func_generate_dlsyms "$libname" "$libname" "yes"
-      func_append libobjs " $symfileobj"
-      test "X$libobjs" = "X " && libobjs=
-
-      if test "$opt_mode" != relink; then
-	# Remove our outputs, but don't remove object files since they
-	# may have been created when compiling PIC objects.
-	removelist=
-	tempremovelist=`$ECHO "$output_objdir/*"`
-	for p in $tempremovelist; do
-	  case $p in
-	    *.$objext | *.gcno)
-	       ;;
-	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
-	       if test "X$precious_files_regex" != "X"; then
-		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
-		 then
-		   continue
-		 fi
-	       fi
-	       func_append removelist " $p"
-	       ;;
-	    *) ;;
-	  esac
-	done
-	test -n "$removelist" && \
-	  func_show_eval "${RM}r \$removelist"
-      fi
-
-      # Now set the variables for building old libraries.
-      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
-	func_append oldlibs " $output_objdir/$libname.$libext"
-
-	# Transform .lo files to .o files.
-	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
-      fi
-
-      # Eliminate all temporary directories.
-      #for path in $notinst_path; do
-      #	lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
-      #	deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
-      #	dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
-      #done
-
-      if test -n "$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	temp_xrpath=
-	for libdir in $xrpath; do
-	  func_replace_sysroot "$libdir"
-	  func_append temp_xrpath " -R$func_replace_sysroot_result"
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) func_append finalize_rpath " $libdir" ;;
-	  esac
-	done
-	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
-	  dependency_libs="$temp_xrpath $dependency_libs"
-	fi
-      fi
-
-      # Make sure dlfiles contains only unique files that won't be dlpreopened
-      old_dlfiles="$dlfiles"
-      dlfiles=
-      for lib in $old_dlfiles; do
-	case " $dlprefiles $dlfiles " in
-	*" $lib "*) ;;
-	*) func_append dlfiles " $lib" ;;
-	esac
-      done
-
-      # Make sure dlprefiles contains only unique files
-      old_dlprefiles="$dlprefiles"
-      dlprefiles=
-      for lib in $old_dlprefiles; do
-	case "$dlprefiles " in
-	*" $lib "*) ;;
-	*) func_append dlprefiles " $lib" ;;
-	esac
-      done
-
-      if test "$build_libtool_libs" = yes; then
-	if test -n "$rpath"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
-	    # these systems don't actually have a c library (as such)!
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C library is in the System framework
-	    func_append deplibs " System.ltframework"
-	    ;;
-	  *-*-netbsd*)
-	    # Don't link with libc until the a.out ld.so is fixed.
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    ;;
-	  *)
-	    # Add libc to deplibs on all other systems if necessary.
-	    if test "$build_libtool_need_lc" = "yes"; then
-	      func_append deplibs " -lc"
-	    fi
-	    ;;
-	  esac
-	fi
-
-	# Transform deplibs into only deplibs that can be linked in shared.
-	name_save=$name
-	libname_save=$libname
-	release_save=$release
-	versuffix_save=$versuffix
-	major_save=$major
-	# I'm not sure if I'm treating the release correctly.  I think
-	# release should show up in the -l (ie -lgmp5) so we don't want to
-	# add it in twice.  Is that correct?
-	release=""
-	versuffix=""
-	major=""
-	newdeplibs=
-	droppeddeps=no
-	case $deplibs_check_method in
-	pass_all)
-	  # Don't check for shared/static.  Everything works.
-	  # This might be a little naive.  We might want to check
-	  # whether the library exists or not.  But this is on
-	  # osf3 & osf4 and I'm not really sure... Just
-	  # implementing what was already the behavior.
-	  newdeplibs=$deplibs
-	  ;;
-	test_compile)
-	  # This code stresses the "libraries are programs" paradigm to its
-	  # limits. Maybe even breaks it.  We compile a program, linking it
-	  # against the deplibs as a proxy for the library.  Then we can check
-	  # whether they linked in statically or dynamically with ldd.
-	  $opt_dry_run || $RM conftest.c
-	  cat > conftest.c <<EOF
-	  int main() { return 0; }
-EOF
-	  $opt_dry_run || $RM conftest
-	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
-	    ldd_output=`ldd conftest`
-	    for i in $deplibs; do
-	      case $i in
-	      -l*)
-		func_stripname -l '' "$i"
-		name=$func_stripname_result
-		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		  case " $predeps $postdeps " in
-		  *" $i "*)
-		    func_append newdeplibs " $i"
-		    i=""
-		    ;;
-		  esac
-		fi
-		if test -n "$i" ; then
-		  libname=`eval "\\$ECHO \"$libname_spec\""`
-		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
-		  set dummy $deplib_matches; shift
-		  deplib_match=$1
-		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		    func_append newdeplibs " $i"
-		  else
-		    droppeddeps=yes
-		    echo
-		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
-		    echo "*** I have the capability to make that library automatically link in when"
-		    echo "*** you link to this library.  But I can only do this if you have a"
-		    echo "*** shared version of the library, which I believe you do not have"
-		    echo "*** because a test_compile did reveal that the linker did not use it for"
-		    echo "*** its dynamic dependency list that programs get resolved with at runtime."
-		  fi
-		fi
-		;;
-	      *)
-		func_append newdeplibs " $i"
-		;;
-	      esac
-	    done
-	  else
-	    # Error occurred in the first compile.  Let's try to salvage
-	    # the situation: Compile a separate program for each library.
-	    for i in $deplibs; do
-	      case $i in
-	      -l*)
-		func_stripname -l '' "$i"
-		name=$func_stripname_result
-		$opt_dry_run || $RM conftest
-		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
-		  ldd_output=`ldd conftest`
-		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		    case " $predeps $postdeps " in
-		    *" $i "*)
-		      func_append newdeplibs " $i"
-		      i=""
-		      ;;
-		    esac
-		  fi
-		  if test -n "$i" ; then
-		    libname=`eval "\\$ECHO \"$libname_spec\""`
-		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
-		    set dummy $deplib_matches; shift
-		    deplib_match=$1
-		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		      func_append newdeplibs " $i"
-		    else
-		      droppeddeps=yes
-		      echo
-		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
-		      echo "*** I have the capability to make that library automatically link in when"
-		      echo "*** you link to this library.  But I can only do this if you have a"
-		      echo "*** shared version of the library, which you do not appear to have"
-		      echo "*** because a test_compile did reveal that the linker did not use this one"
-		      echo "*** as a dynamic dependency that programs can get resolved with at runtime."
-		    fi
-		  fi
-		else
-		  droppeddeps=yes
-		  echo
-		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
-		  echo "*** make it link in!  You will probably need to install it or some"
-		  echo "*** library that it depends on before this library will be fully"
-		  echo "*** functional.  Installing it before continuing would be even better."
-		fi
-		;;
-	      *)
-		func_append newdeplibs " $i"
-		;;
-	      esac
-	    done
-	  fi
-	  ;;
-	file_magic*)
-	  set dummy $deplibs_check_method; shift
-	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    case $a_deplib in
-	    -l*)
-	      func_stripname -l '' "$a_deplib"
-	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  func_append newdeplibs " $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		libname=`eval "\\$ECHO \"$libname_spec\""`
-		if test -n "$file_magic_glob"; then
-		  libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
-		else
-		  libnameglob=$libname
-		fi
-		test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  if test "$want_nocaseglob" = yes; then
-		    shopt -s nocaseglob
-		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
-		    $nocaseglob
-		  else
-		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
-		  fi
-		  for potent_lib in $potential_libs; do
-		      # Follow soft links.
-		      if ls -lLd "$potent_lib" 2>/dev/null |
-			 $GREP " -> " >/dev/null; then
-			continue
-		      fi
-		      # The statement above tries to avoid entering an
-		      # endless loop below, in case of cyclic links.
-		      # We might still enter an endless loop, since a link
-		      # loop can be closed while we follow links,
-		      # but so what?
-		      potlib="$potent_lib"
-		      while test -h "$potlib" 2>/dev/null; do
-			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
-			case $potliblink in
-			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
-			*) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
-			esac
-		      done
-		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
-			 $SED -e 10q |
-			 $EGREP "$file_magic_regex" > /dev/null; then
-			func_append newdeplibs " $a_deplib"
-			a_deplib=""
-			break 2
-		      fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		echo
-		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
-		echo "*** I have the capability to make that library automatically link in when"
-		echo "*** you link to this library.  But I can only do this if you have a"
-		echo "*** shared version of the library, which you do not appear to have"
-		echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
-		else
-		  $ECHO "*** with $libname and none of the candidates passed a file format test"
-		  $ECHO "*** using a file magic. Last file checked: $potlib"
-		fi
-	      fi
-	      ;;
-	    *)
-	      # Add a -L argument.
-	      func_append newdeplibs " $a_deplib"
-	      ;;
-	    esac
-	  done # Gone through all deplibs.
-	  ;;
-	match_pattern*)
-	  set dummy $deplibs_check_method; shift
-	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    case $a_deplib in
-	    -l*)
-	      func_stripname -l '' "$a_deplib"
-	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  func_append newdeplibs " $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		libname=`eval "\\$ECHO \"$libname_spec\""`
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-		  for potent_lib in $potential_libs; do
-		    potlib="$potent_lib" # see symlink-check above in file_magic test
-		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
-		       $EGREP "$match_pattern_regex" > /dev/null; then
-		      func_append newdeplibs " $a_deplib"
-		      a_deplib=""
-		      break 2
-		    fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		echo
-		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
-		echo "*** I have the capability to make that library automatically link in when"
-		echo "*** you link to this library.  But I can only do this if you have a"
-		echo "*** shared version of the library, which you do not appear to have"
-		echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
-		else
-		  $ECHO "*** with $libname and none of the candidates passed a file format test"
-		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
-		fi
-	      fi
-	      ;;
-	    *)
-	      # Add a -L argument.
-	      func_append newdeplibs " $a_deplib"
-	      ;;
-	    esac
-	  done # Gone through all deplibs.
-	  ;;
-	none | unknown | *)
-	  newdeplibs=""
-	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
-	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	    for i in $predeps $postdeps ; do
-	      # can't use Xsed below, because $i might contain '/'
-	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
-	    done
-	  fi
-	  case $tmp_deplibs in
-	  *[!\	\ ]*)
-	    echo
-	    if test "X$deplibs_check_method" = "Xnone"; then
-	      echo "*** Warning: inter-library dependencies are not supported in this platform."
-	    else
-	      echo "*** Warning: inter-library dependencies are not known to be supported."
-	    fi
-	    echo "*** All declared inter-library dependencies are being dropped."
-	    droppeddeps=yes
-	    ;;
-	  esac
-	  ;;
-	esac
-	versuffix=$versuffix_save
-	major=$major_save
-	release=$release_save
-	libname=$libname_save
-	name=$name_save
-
-	case $host in
-	*-*-rhapsody* | *-*-darwin1.[012])
-	  # On Rhapsody replace the C library with the System framework
-	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
-	  ;;
-	esac
-
-	if test "$droppeddeps" = yes; then
-	  if test "$module" = yes; then
-	    echo
-	    echo "*** Warning: libtool could not satisfy all declared inter-library"
-	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
-	    echo "*** a static module, that should work as long as the dlopening"
-	    echo "*** application is linked with the -dlopen flag."
-	    if test -z "$global_symbol_pipe"; then
-	      echo
-	      echo "*** However, this would only work if libtool was able to extract symbol"
-	      echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
-	      echo "*** not find such a program.  So, this module is probably useless."
-	      echo "*** \`nm' from GNU binutils and a full rebuild may help."
-	    fi
-	    if test "$build_old_libs" = no; then
-	      oldlibs="$output_objdir/$libname.$libext"
-	      build_libtool_libs=module
-	      build_old_libs=yes
-	    else
-	      build_libtool_libs=no
-	    fi
-	  else
-	    echo "*** The inter-library dependencies that have been dropped here will be"
-	    echo "*** automatically added whenever a program is linked with this library"
-	    echo "*** or is declared to -dlopen it."
-
-	    if test "$allow_undefined" = no; then
-	      echo
-	      echo "*** Since this library must not contain undefined symbols,"
-	      echo "*** because either the platform does not support them or"
-	      echo "*** it was explicitly requested with -no-undefined,"
-	      echo "*** libtool will only create a static version of it."
-	      if test "$build_old_libs" = no; then
-		oldlibs="$output_objdir/$libname.$libext"
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
-	  fi
-	fi
-	# Done checking deplibs!
-	deplibs=$newdeplibs
-      fi
-      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
-      case $host in
-	*-*-darwin*)
-	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  ;;
-      esac
-
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $deplibs " in
-	  *" -L$path/$objdir "*)
-	    func_append new_libs " -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) func_append new_libs " $deplib" ;;
-	  esac
-	  ;;
-	*) func_append new_libs " $deplib" ;;
-	esac
-      done
-      deplibs="$new_libs"
-
-      # All the library-specific variables (install_libdir is set above).
-      library_names=
-      old_library=
-      dlname=
-
-      # Test again, we may have decided not to build it any more
-      if test "$build_libtool_libs" = yes; then
-	# Remove ${wl} instances when linking with ld.
-	# FIXME: should test the right _cmds variable.
-	case $archive_cmds in
-	  *\$LD\ *) wl= ;;
-        esac
-	if test "$hardcode_into_libs" = yes; then
-	  # Hardcode the library paths
-	  hardcode_libdirs=
-	  dep_rpath=
-	  rpath="$finalize_rpath"
-	  test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
-	  for libdir in $rpath; do
-	    if test -n "$hardcode_libdir_flag_spec"; then
-	      if test -n "$hardcode_libdir_separator"; then
-		func_replace_sysroot "$libdir"
-		libdir=$func_replace_sysroot_result
-		if test -z "$hardcode_libdirs"; then
-		  hardcode_libdirs="$libdir"
-		else
-		  # Just accumulate the unique libdirs.
-		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		    ;;
-		  *)
-		    func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
-		    ;;
-		  esac
-		fi
-	      else
-		eval flag=\"$hardcode_libdir_flag_spec\"
-		func_append dep_rpath " $flag"
-	      fi
-	    elif test -n "$runpath_var"; then
-	      case "$perm_rpath " in
-	      *" $libdir "*) ;;
-	      *) func_append perm_rpath " $libdir" ;;
-	      esac
-	    fi
-	  done
-	  # Substitute the hardcoded libdirs into the rpath.
-	  if test -n "$hardcode_libdir_separator" &&
-	     test -n "$hardcode_libdirs"; then
-	    libdir="$hardcode_libdirs"
-	    eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
-	  fi
-	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
-	    # We should set the runpath_var.
-	    rpath=
-	    for dir in $perm_rpath; do
-	      func_append rpath "$dir:"
-	    done
-	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
-	  fi
-	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
-	fi
-
-	shlibpath="$finalize_shlibpath"
-	test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
-	if test -n "$shlibpath"; then
-	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
-	fi
-
-	# Get the real and link names of the library.
-	eval shared_ext=\"$shrext_cmds\"
-	eval library_names=\"$library_names_spec\"
-	set dummy $library_names
-	shift
-	realname="$1"
-	shift
-
-	if test -n "$soname_spec"; then
-	  eval soname=\"$soname_spec\"
-	else
-	  soname="$realname"
-	fi
-	if test -z "$dlname"; then
-	  dlname=$soname
-	fi
-
-	lib="$output_objdir/$realname"
-	linknames=
-	for link
-	do
-	  func_append linknames " $link"
-	done
-
-	# Use standard objects if they are pic
-	test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
-	test "X$libobjs" = "X " && libobjs=
-
-	delfiles=
-	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
-	  export_symbols="$output_objdir/$libname.uexp"
-	  func_append delfiles " $export_symbols"
-	fi
-
-	orig_export_symbols=
-	case $host_os in
-	cygwin* | mingw* | cegcc*)
-	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
-	    # exporting using user supplied symfile
-	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
-	      # and it's NOT already a .def file. Must figure out
-	      # which of the given symbols are data symbols and tag
-	      # them as such. So, trigger use of export_symbols_cmds.
-	      # export_symbols gets reassigned inside the "prepare
-	      # the list of exported symbols" if statement, so the
-	      # include_expsyms logic still works.
-	      orig_export_symbols="$export_symbols"
-	      export_symbols=
-	      always_export_symbols=yes
-	    fi
-	  fi
-	  ;;
-	esac
-
-	# Prepare the list of exported symbols
-	if test -z "$export_symbols"; then
-	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
-	    func_verbose "generating symbol list for \`$libname.la'"
-	    export_symbols="$output_objdir/$libname.exp"
-	    $opt_dry_run || $RM $export_symbols
-	    cmds=$export_symbols_cmds
-	    save_ifs="$IFS"; IFS='~'
-	    for cmd1 in $cmds; do
-	      IFS="$save_ifs"
-	      # Take the normal branch if the nm_file_list_spec branch
-	      # doesn't work or if tool conversion is not needed.
-	      case $nm_file_list_spec~$to_tool_file_cmd in
-		*~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
-		  try_normal_branch=yes
-		  eval cmd=\"$cmd1\"
-		  func_len " $cmd"
-		  len=$func_len_result
-		  ;;
-		*)
-		  try_normal_branch=no
-		  ;;
-	      esac
-	      if test "$try_normal_branch" = yes \
-		 && { test "$len" -lt "$max_cmd_len" \
-		      || test "$max_cmd_len" -le -1; }
-	      then
-		func_show_eval "$cmd" 'exit $?'
-		skipped_export=false
-	      elif test -n "$nm_file_list_spec"; then
-		func_basename "$output"
-		output_la=$func_basename_result
-		save_libobjs=$libobjs
-		save_output=$output
-		output=${output_objdir}/${output_la}.nm
-		func_to_tool_file "$output"
-		libobjs=$nm_file_list_spec$func_to_tool_file_result
-		func_append delfiles " $output"
-		func_verbose "creating $NM input file list: $output"
-		for obj in $save_libobjs; do
-		  func_to_tool_file "$obj"
-		  $ECHO "$func_to_tool_file_result"
-		done > "$output"
-		eval cmd=\"$cmd1\"
-		func_show_eval "$cmd" 'exit $?'
-		output=$save_output
-		libobjs=$save_libobjs
-		skipped_export=false
-	      else
-		# The command line is too long to execute in one step.
-		func_verbose "using reloadable object file for export list..."
-		skipped_export=:
-		# Break out early, otherwise skipped_export may be
-		# set to false by a later but shorter cmd.
-		break
-	      fi
-	    done
-	    IFS="$save_ifs"
-	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
-	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
-	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
-	    fi
-	  fi
-	fi
-
-	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  tmp_export_symbols="$export_symbols"
-	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
-	  $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
-	fi
-
-	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
-	  # The given exports_symbols file has to be filtered, so filter it.
-	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
-	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	  # 's' commands which not all seds can handle. GNU sed should be fine
-	  # though. Also, the filter scales superlinearly with the number of
-	  # global variables. join(1) would be nice here, but unfortunately
-	  # isn't a blessed tool.
-	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
-	  func_append delfiles " $export_symbols $output_objdir/$libname.filter"
-	  export_symbols=$output_objdir/$libname.def
-	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
-	fi
-
-	tmp_deplibs=
-	for test_deplib in $deplibs; do
-	  case " $convenience " in
-	  *" $test_deplib "*) ;;
-	  *)
-	    func_append tmp_deplibs " $test_deplib"
-	    ;;
-	  esac
-	done
-	deplibs="$tmp_deplibs"
-
-	if test -n "$convenience"; then
-	  if test -n "$whole_archive_flag_spec" &&
-	    test "$compiler_needs_object" = yes &&
-	    test -z "$libobjs"; then
-	    # extract the archives, so we have objects to list.
-	    # TODO: could optimize this to just extract one archive.
-	    whole_archive_flag_spec=
-	  fi
-	  if test -n "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
-	    test "X$libobjs" = "X " && libobjs=
-	  else
-	    gentop="$output_objdir/${outputname}x"
-	    func_append generated " $gentop"
-
-	    func_extract_archives $gentop $convenience
-	    func_append libobjs " $func_extract_archives_result"
-	    test "X$libobjs" = "X " && libobjs=
-	  fi
-	fi
-
-	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
-	  eval flag=\"$thread_safe_flag_spec\"
-	  func_append linker_flags " $flag"
-	fi
-
-	# Make a backup of the uninstalled library when relinking
-	if test "$opt_mode" = relink; then
-	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
-	fi
-
-	# Do each of the archive commands.
-	if test "$module" = yes && test -n "$module_cmds" ; then
-	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	    eval test_cmds=\"$module_expsym_cmds\"
-	    cmds=$module_expsym_cmds
-	  else
-	    eval test_cmds=\"$module_cmds\"
-	    cmds=$module_cmds
-	  fi
-	else
-	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	    eval test_cmds=\"$archive_expsym_cmds\"
-	    cmds=$archive_expsym_cmds
-	  else
-	    eval test_cmds=\"$archive_cmds\"
-	    cmds=$archive_cmds
-	  fi
-	fi
-
-	if test "X$skipped_export" != "X:" &&
-	   func_len " $test_cmds" &&
-	   len=$func_len_result &&
-	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  :
-	else
-	  # The command line is too long to link in one step, link piecewise
-	  # or, if using GNU ld and skipped_export is not :, use a linker
-	  # script.
-
-	  # Save the value of $output and $libobjs because we want to
-	  # use them later.  If we have whole_archive_flag_spec, we
-	  # want to use save_libobjs as it was before
-	  # whole_archive_flag_spec was expanded, because we can't
-	  # assume the linker understands whole_archive_flag_spec.
-	  # This may have to be revisited, in case too many
-	  # convenience libraries get linked in and end up exceeding
-	  # the spec.
-	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	  fi
-	  save_output=$output
-	  func_basename "$output"
-	  output_la=$func_basename_result
-
-	  # Clear the reloadable object creation command queue and
-	  # initialize k to one.
-	  test_cmds=
-	  concat_cmds=
-	  objlist=
-	  last_robj=
-	  k=1
-
-	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
-	    output=${output_objdir}/${output_la}.lnkscript
-	    func_verbose "creating GNU ld script: $output"
-	    echo 'INPUT (' > $output
-	    for obj in $save_libobjs
-	    do
-	      func_to_tool_file "$obj"
-	      $ECHO "$func_to_tool_file_result" >> $output
-	    done
-	    echo ')' >> $output
-	    func_append delfiles " $output"
-	    func_to_tool_file "$output"
-	    output=$func_to_tool_file_result
-	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
-	    output=${output_objdir}/${output_la}.lnk
-	    func_verbose "creating linker input file list: $output"
-	    : > $output
-	    set x $save_libobjs
-	    shift
-	    firstobj=
-	    if test "$compiler_needs_object" = yes; then
-	      firstobj="$1 "
-	      shift
-	    fi
-	    for obj
-	    do
-	      func_to_tool_file "$obj"
-	      $ECHO "$func_to_tool_file_result" >> $output
-	    done
-	    func_append delfiles " $output"
-	    func_to_tool_file "$output"
-	    output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
-	  else
-	    if test -n "$save_libobjs"; then
-	      func_verbose "creating reloadable object files..."
-	      output=$output_objdir/$output_la-${k}.$objext
-	      eval test_cmds=\"$reload_cmds\"
-	      func_len " $test_cmds"
-	      len0=$func_len_result
-	      len=$len0
-
-	      # Loop over the list of objects to be linked.
-	      for obj in $save_libobjs
-	      do
-		func_len " $obj"
-		func_arith $len + $func_len_result
-		len=$func_arith_result
-		if test "X$objlist" = X ||
-		   test "$len" -lt "$max_cmd_len"; then
-		  func_append objlist " $obj"
-		else
-		  # The command $test_cmds is almost too long, add a
-		  # command to the queue.
-		  if test "$k" -eq 1 ; then
-		    # The first file doesn't have a previous command to add.
-		    reload_objs=$objlist
-		    eval concat_cmds=\"$reload_cmds\"
-		  else
-		    # All subsequent reloadable object files will link in
-		    # the last one created.
-		    reload_objs="$objlist $last_robj"
-		    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
-		  fi
-		  last_robj=$output_objdir/$output_la-${k}.$objext
-		  func_arith $k + 1
-		  k=$func_arith_result
-		  output=$output_objdir/$output_la-${k}.$objext
-		  objlist=" $obj"
-		  func_len " $last_robj"
-		  func_arith $len0 + $func_len_result
-		  len=$func_arith_result
-		fi
-	      done
-	      # Handle the remaining objects by creating one last
-	      # reloadable object file.  All subsequent reloadable object
-	      # files will link in the last one created.
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      reload_objs="$objlist $last_robj"
-	      eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
-	      if test -n "$last_robj"; then
-	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
-	      fi
-	      func_append delfiles " $output"
-
-	    else
-	      output=
-	    fi
-
-	    if ${skipped_export-false}; then
-	      func_verbose "generating symbol list for \`$libname.la'"
-	      export_symbols="$output_objdir/$libname.exp"
-	      $opt_dry_run || $RM $export_symbols
-	      libobjs=$output
-	      # Append the command to create the export file.
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
-	      if test -n "$last_robj"; then
-		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
-	      fi
-	    fi
-
-	    test -n "$save_libobjs" &&
-	      func_verbose "creating a temporary reloadable object file: $output"
-
-	    # Loop through the commands generated above and execute them.
-	    save_ifs="$IFS"; IFS='~'
-	    for cmd in $concat_cmds; do
-	      IFS="$save_ifs"
-	      $opt_silent || {
-		  func_quote_for_expand "$cmd"
-		  eval "func_echo $func_quote_for_expand_result"
-	      }
-	      $opt_dry_run || eval "$cmd" || {
-		lt_exit=$?
-
-		# Restore the uninstalled library and exit
-		if test "$opt_mode" = relink; then
-		  ( cd "$output_objdir" && \
-		    $RM "${realname}T" && \
-		    $MV "${realname}U" "$realname" )
-		fi
-
-		exit $lt_exit
-	      }
-	    done
-	    IFS="$save_ifs"
-
-	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
-	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
-	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
-	    fi
-	  fi
-
-          if ${skipped_export-false}; then
-	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	      tmp_export_symbols="$export_symbols"
-	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
-	      $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
-	    fi
-
-	    if test -n "$orig_export_symbols"; then
-	      # The given exports_symbols file has to be filtered, so filter it.
-	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
-	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	      # 's' commands which not all seds can handle. GNU sed should be fine
-	      # though. Also, the filter scales superlinearly with the number of
-	      # global variables. join(1) would be nice here, but unfortunately
-	      # isn't a blessed tool.
-	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
-	      func_append delfiles " $export_symbols $output_objdir/$libname.filter"
-	      export_symbols=$output_objdir/$libname.def
-	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
-	    fi
-	  fi
-
-	  libobjs=$output
-	  # Restore the value of output.
-	  output=$save_output
-
-	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
-	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
-	    test "X$libobjs" = "X " && libobjs=
-	  fi
-	  # Expand the library linking commands again to reset the
-	  # value of $libobjs for piecewise linking.
-
-	  # Do each of the archive commands.
-	  if test "$module" = yes && test -n "$module_cmds" ; then
-	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	      cmds=$module_expsym_cmds
-	    else
-	      cmds=$module_cmds
-	    fi
-	  else
-	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	      cmds=$archive_expsym_cmds
-	    else
-	      cmds=$archive_cmds
-	    fi
-	  fi
-	fi
-
-	if test -n "$delfiles"; then
-	  # Append the command to remove temporary files to $cmds.
-	  eval cmds=\"\$cmds~\$RM $delfiles\"
-	fi
-
-	# Add any objects from preloaded convenience libraries
-	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
-	  func_append generated " $gentop"
-
-	  func_extract_archives $gentop $dlprefiles
-	  func_append libobjs " $func_extract_archives_result"
-	  test "X$libobjs" = "X " && libobjs=
-	fi
-
-	save_ifs="$IFS"; IFS='~'
-	for cmd in $cmds; do
-	  IFS="$save_ifs"
-	  eval cmd=\"$cmd\"
-	  $opt_silent || {
-	    func_quote_for_expand "$cmd"
-	    eval "func_echo $func_quote_for_expand_result"
-	  }
-	  $opt_dry_run || eval "$cmd" || {
-	    lt_exit=$?
-
-	    # Restore the uninstalled library and exit
-	    if test "$opt_mode" = relink; then
-	      ( cd "$output_objdir" && \
-	        $RM "${realname}T" && \
-		$MV "${realname}U" "$realname" )
-	    fi
-
-	    exit $lt_exit
-	  }
-	done
-	IFS="$save_ifs"
-
-	# Restore the uninstalled library and exit
-	if test "$opt_mode" = relink; then
-	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
-
-	  if test -n "$convenience"; then
-	    if test -z "$whole_archive_flag_spec"; then
-	      func_show_eval '${RM}r "$gentop"'
-	    fi
-	  fi
-
-	  exit $EXIT_SUCCESS
-	fi
-
-	# Create links to the real library.
-	for linkname in $linknames; do
-	  if test "$realname" != "$linkname"; then
-	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
-	  fi
-	done
-
-	# If -module or -export-dynamic was specified, set the dlname.
-	if test "$module" = yes || test "$export_dynamic" = yes; then
-	  # On all known operating systems, these are identical.
-	  dlname="$soname"
-	fi
-      fi
-      ;;
-
-    obj)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for objects"
-      fi
-
-      case " $deplibs" in
-      *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for objects" ;;
-      esac
-
-      test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for objects"
-
-      test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for objects"
-
-      test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for objects"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for objects"
-
-      case $output in
-      *.lo)
-	test -n "$objs$old_deplibs" && \
-	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
-
-	libobj=$output
-	func_lo2o "$libobj"
-	obj=$func_lo2o_result
-	;;
-      *)
-	libobj=
-	obj="$output"
-	;;
-      esac
-
-      # Delete the old objects.
-      $opt_dry_run || $RM $obj $libobj
-
-      # Objects from convenience libraries.  This assumes
-      # single-version convenience libraries.  Whenever we create
-      # different ones for PIC/non-PIC, this we'll have to duplicate
-      # the extraction.
-      reload_conv_objs=
-      gentop=
-      # reload_cmds runs $LD directly, so let us get rid of
-      # -Wl from whole_archive_flag_spec and hope we can get by with
-      # turning comma into space..
-      wl=
-
-      if test -n "$convenience"; then
-	if test -n "$whole_archive_flag_spec"; then
-	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
-	  reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
-	else
-	  gentop="$output_objdir/${obj}x"
-	  func_append generated " $gentop"
-
-	  func_extract_archives $gentop $convenience
-	  reload_conv_objs="$reload_objs $func_extract_archives_result"
-	fi
-      fi
-
-      # If we're not building shared, we need to use non_pic_objs
-      test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
-
-      # Create the old-style object.
-      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
-
-      output="$obj"
-      func_execute_cmds "$reload_cmds" 'exit $?'
-
-      # Exit if we aren't doing a library object file.
-      if test -z "$libobj"; then
-	if test -n "$gentop"; then
-	  func_show_eval '${RM}r "$gentop"'
-	fi
-
-	exit $EXIT_SUCCESS
-      fi
-
-      if test "$build_libtool_libs" != yes; then
-	if test -n "$gentop"; then
-	  func_show_eval '${RM}r "$gentop"'
-	fi
-
-	# Create an invalid libtool object if no PIC, so that we don't
-	# accidentally link it into a program.
-	# $show "echo timestamp > $libobj"
-	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
-	exit $EXIT_SUCCESS
-      fi
-
-      if test -n "$pic_flag" || test "$pic_mode" != default; then
-	# Only do commands if we really have different PIC objects.
-	reload_objs="$libobjs $reload_conv_objs"
-	output="$libobj"
-	func_execute_cmds "$reload_cmds" 'exit $?'
-      fi
-
-      if test -n "$gentop"; then
-	func_show_eval '${RM}r "$gentop"'
-      fi
-
-      exit $EXIT_SUCCESS
-      ;;
-
-    prog)
-      case $host in
-	*cygwin*) func_stripname '' '.exe' "$output"
-	          output=$func_stripname_result.exe;;
-      esac
-      test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for programs"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for programs"
-
-      test "$preload" = yes \
-        && test "$dlopen_support" = unknown \
-	&& test "$dlopen_self" = unknown \
-	&& test "$dlopen_self_static" = unknown && \
-	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
-
-      case $host in
-      *-*-rhapsody* | *-*-darwin1.[012])
-	# On Rhapsody replace the C library is the System framework
-	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
-	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
-	;;
-      esac
-
-      case $host in
-      *-*-darwin*)
-	# Don't allow lazy linking, it breaks C++ global constructors
-	# But is supposedly fixed on 10.4 or later (yay!).
-	if test "$tagname" = CXX ; then
-	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
-	    10.[0123])
-	      func_append compile_command " ${wl}-bind_at_load"
-	      func_append finalize_command " ${wl}-bind_at_load"
-	    ;;
-	  esac
-	fi
-	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
-	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	;;
-      esac
-
-
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $compile_deplibs " in
-	  *" -L$path/$objdir "*)
-	    func_append new_libs " -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $compile_deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) func_append new_libs " $deplib" ;;
-	  esac
-	  ;;
-	*) func_append new_libs " $deplib" ;;
-	esac
-      done
-      compile_deplibs="$new_libs"
-
-
-      func_append compile_command " $compile_deplibs"
-      func_append finalize_command " $finalize_deplibs"
-
-      if test -n "$rpath$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	for libdir in $rpath $xrpath; do
-	  # This is the magic to use -rpath.
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) func_append finalize_rpath " $libdir" ;;
-	  esac
-	done
-      fi
-
-      # Now hardcode the library paths
-      rpath=
-      hardcode_libdirs=
-      for libdir in $compile_rpath $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval flag=\"$hardcode_libdir_flag_spec\"
-	    func_append rpath " $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) func_append perm_rpath " $libdir" ;;
-	  esac
-	fi
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$libdir:"*) ;;
-	  ::) dllsearchpath=$libdir;;
-	  *) func_append dllsearchpath ":$libdir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  ::) dllsearchpath=$testbindir;;
-	  *) func_append dllsearchpath ":$testbindir";;
-	  esac
-	  ;;
-	esac
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval rpath=\" $hardcode_libdir_flag_spec\"
-      fi
-      compile_rpath="$rpath"
-
-      rpath=
-      hardcode_libdirs=
-      for libdir in $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval flag=\"$hardcode_libdir_flag_spec\"
-	    func_append rpath " $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$finalize_perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) func_append finalize_perm_rpath " $libdir" ;;
-	  esac
-	fi
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval rpath=\" $hardcode_libdir_flag_spec\"
-      fi
-      finalize_rpath="$rpath"
-
-      if test -n "$libobjs" && test "$build_old_libs" = yes; then
-	# Transform all the library objects into standard objects.
-	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
-	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
-      fi
-
-      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
-
-      # template prelinking step
-      if test -n "$prelink_cmds"; then
-	func_execute_cmds "$prelink_cmds" 'exit $?'
-      fi
-
-      wrappers_required=yes
-      case $host in
-      *cegcc* | *mingw32ce*)
-        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
-        wrappers_required=no
-        ;;
-      *cygwin* | *mingw* )
-        if test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
-        ;;
-      *)
-        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
-        ;;
-      esac
-      if test "$wrappers_required" = no; then
-	# Replace the output file specification.
-	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
-	link_command="$compile_command$compile_rpath"
-
-	# We have no uninstalled library dependencies, so finalize right now.
-	exit_status=0
-	func_show_eval "$link_command" 'exit_status=$?'
-
-	if test -n "$postlink_cmds"; then
-	  func_to_tool_file "$output"
-	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
-	  func_execute_cmds "$postlink_cmds" 'exit $?'
-	fi
-
-	# Delete the generated files.
-	if test -f "$output_objdir/${outputname}S.${objext}"; then
-	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
-	fi
-
-	exit $exit_status
-      fi
-
-      if test -n "$compile_shlibpath$finalize_shlibpath"; then
-	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
-      fi
-      if test -n "$finalize_shlibpath"; then
-	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
-      fi
-
-      compile_var=
-      finalize_var=
-      if test -n "$runpath_var"; then
-	if test -n "$perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $perm_rpath; do
-	    func_append rpath "$dir:"
-	  done
-	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-	if test -n "$finalize_perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $finalize_perm_rpath; do
-	    func_append rpath "$dir:"
-	  done
-	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-      fi
-
-      if test "$no_install" = yes; then
-	# We don't need to create a wrapper script.
-	link_command="$compile_var$compile_command$compile_rpath"
-	# Replace the output file specification.
-	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
-	# Delete the old output file.
-	$opt_dry_run || $RM $output
-	# Link the executable and exit
-	func_show_eval "$link_command" 'exit $?'
-
-	if test -n "$postlink_cmds"; then
-	  func_to_tool_file "$output"
-	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
-	  func_execute_cmds "$postlink_cmds" 'exit $?'
-	fi
-
-	exit $EXIT_SUCCESS
-      fi
-
-      if test "$hardcode_action" = relink; then
-	# Fast installation is not supported
-	link_command="$compile_var$compile_command$compile_rpath"
-	relink_command="$finalize_var$finalize_command$finalize_rpath"
-
-	func_warning "this platform does not like uninstalled shared libraries"
-	func_warning "\`$output' will be relinked during installation"
-      else
-	if test "$fast_install" != no; then
-	  link_command="$finalize_var$compile_command$finalize_rpath"
-	  if test "$fast_install" = yes; then
-	    relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
-	  else
-	    # fast_install is set to needless
-	    relink_command=
-	  fi
-	else
-	  link_command="$compile_var$compile_command$compile_rpath"
-	  relink_command="$finalize_var$finalize_command$finalize_rpath"
-	fi
-      fi
-
-      # Replace the output file specification.
-      link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
-
-      # Delete the old output files.
-      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
-
-      func_show_eval "$link_command" 'exit $?'
-
-      if test -n "$postlink_cmds"; then
-	func_to_tool_file "$output_objdir/$outputname"
-	postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
-	func_execute_cmds "$postlink_cmds" 'exit $?'
-      fi
-
-      # Now create the wrapper script.
-      func_verbose "creating $output"
-
-      # Quote the relink command for shipping.
-      if test -n "$relink_command"; then
-	# Preserve any variables that may affect compiler behavior
-	for var in $variables_saved_for_relink; do
-	  if eval test -z \"\${$var+set}\"; then
-	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
-	  elif eval var_value=\$$var; test -z "$var_value"; then
-	    relink_command="$var=; export $var; $relink_command"
-	  else
-	    func_quote_for_eval "$var_value"
-	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
-	  fi
-	done
-	relink_command="(cd `pwd`; $relink_command)"
-	relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
-      fi
-
-      # Only actually do things if not in dry run mode.
-      $opt_dry_run || {
-	# win32 will think the script is a binary if it has
-	# a .exe suffix, so we strip it off here.
-	case $output in
-	  *.exe) func_stripname '' '.exe' "$output"
-	         output=$func_stripname_result ;;
-	esac
-	# test for cygwin because mv fails w/o .exe extensions
-	case $host in
-	  *cygwin*)
-	    exeext=.exe
-	    func_stripname '' '.exe' "$outputname"
-	    outputname=$func_stripname_result ;;
-	  *) exeext= ;;
-	esac
-	case $host in
-	  *cygwin* | *mingw* )
-	    func_dirname_and_basename "$output" "" "."
-	    output_name=$func_basename_result
-	    output_path=$func_dirname_result
-	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
-	    cwrapper="$output_path/$output_name.exe"
-	    $RM $cwrappersource $cwrapper
-	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
-
-	    func_emit_cwrapperexe_src > $cwrappersource
-
-	    # The wrapper executable is built using the $host compiler,
-	    # because it contains $host paths and files. If cross-
-	    # compiling, it, like the target executable, must be
-	    # executed on the $host or under an emulation environment.
-	    $opt_dry_run || {
-	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
-	      $STRIP $cwrapper
-	    }
-
-	    # Now, create the wrapper script for func_source use:
-	    func_ltwrapper_scriptname $cwrapper
-	    $RM $func_ltwrapper_scriptname_result
-	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
-	    $opt_dry_run || {
-	      # note: this script will not be executed, so do not chmod.
-	      if test "x$build" = "x$host" ; then
-		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
-	      else
-		func_emit_wrapper no > $func_ltwrapper_scriptname_result
-	      fi
-	    }
-	  ;;
-	  * )
-	    $RM $output
-	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
-
-	    func_emit_wrapper no > $output
-	    chmod +x $output
-	  ;;
-	esac
-      }
-      exit $EXIT_SUCCESS
-      ;;
-    esac
-
-    # See if we need to build an old-fashioned archive.
-    for oldlib in $oldlibs; do
-
-      if test "$build_libtool_libs" = convenience; then
-	oldobjs="$libobjs_save $symfileobj"
-	addlibs="$convenience"
-	build_libtool_libs=no
-      else
-	if test "$build_libtool_libs" = module; then
-	  oldobjs="$libobjs_save"
-	  build_libtool_libs=no
-	else
-	  oldobjs="$old_deplibs $non_pic_objects"
-	  if test "$preload" = yes && test -f "$symfileobj"; then
-	    func_append oldobjs " $symfileobj"
-	  fi
-	fi
-	addlibs="$old_convenience"
-      fi
-
-      if test -n "$addlibs"; then
-	gentop="$output_objdir/${outputname}x"
-	func_append generated " $gentop"
-
-	func_extract_archives $gentop $addlibs
-	func_append oldobjs " $func_extract_archives_result"
-      fi
-
-      # Do each command in the archive commands.
-      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
-	cmds=$old_archive_from_new_cmds
-      else
-
-	# Add any objects from preloaded convenience libraries
-	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
-	  func_append generated " $gentop"
-
-	  func_extract_archives $gentop $dlprefiles
-	  func_append oldobjs " $func_extract_archives_result"
-	fi
-
-	# POSIX demands no paths to be encoded in archives.  We have
-	# to avoid creating archives with duplicate basenames if we
-	# might have to extract them afterwards, e.g., when creating a
-	# static archive out of a convenience library, or when linking
-	# the entirety of a libtool archive into another (currently
-	# not supported by libtool).
-	if (for obj in $oldobjs
-	    do
-	      func_basename "$obj"
-	      $ECHO "$func_basename_result"
-	    done | sort | sort -uc >/dev/null 2>&1); then
-	  :
-	else
-	  echo "copying selected object files to avoid basename conflicts..."
-	  gentop="$output_objdir/${outputname}x"
-	  func_append generated " $gentop"
-	  func_mkdir_p "$gentop"
-	  save_oldobjs=$oldobjs
-	  oldobjs=
-	  counter=1
-	  for obj in $save_oldobjs
-	  do
-	    func_basename "$obj"
-	    objbase="$func_basename_result"
-	    case " $oldobjs " in
-	    " ") oldobjs=$obj ;;
-	    *[\ /]"$objbase "*)
-	      while :; do
-		# Make sure we don't pick an alternate name that also
-		# overlaps.
-		newobj=lt$counter-$objbase
-		func_arith $counter + 1
-		counter=$func_arith_result
-		case " $oldobjs " in
-		*[\ /]"$newobj "*) ;;
-		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
-		esac
-	      done
-	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
-	      func_append oldobjs " $gentop/$newobj"
-	      ;;
-	    *) func_append oldobjs " $obj" ;;
-	    esac
-	  done
-	fi
-	func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
-	tool_oldlib=$func_to_tool_file_result
-	eval cmds=\"$old_archive_cmds\"
-
-	func_len " $cmds"
-	len=$func_len_result
-	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  cmds=$old_archive_cmds
-	elif test -n "$archiver_list_spec"; then
-	  func_verbose "using command file archive linking..."
-	  for obj in $oldobjs
-	  do
-	    func_to_tool_file "$obj"
-	    $ECHO "$func_to_tool_file_result"
-	  done > $output_objdir/$libname.libcmd
-	  func_to_tool_file "$output_objdir/$libname.libcmd"
-	  oldobjs=" $archiver_list_spec$func_to_tool_file_result"
-	  cmds=$old_archive_cmds
-	else
-	  # the command line is too long to link in one step, link in parts
-	  func_verbose "using piecewise archive linking..."
-	  save_RANLIB=$RANLIB
-	  RANLIB=:
-	  objlist=
-	  concat_cmds=
-	  save_oldobjs=$oldobjs
-	  oldobjs=
-	  # Is there a better way of finding the last object in the list?
-	  for obj in $save_oldobjs
-	  do
-	    last_oldobj=$obj
-	  done
-	  eval test_cmds=\"$old_archive_cmds\"
-	  func_len " $test_cmds"
-	  len0=$func_len_result
-	  len=$len0
-	  for obj in $save_oldobjs
-	  do
-	    func_len " $obj"
-	    func_arith $len + $func_len_result
-	    len=$func_arith_result
-	    func_append objlist " $obj"
-	    if test "$len" -lt "$max_cmd_len"; then
-	      :
-	    else
-	      # the above command should be used before it gets too long
-	      oldobjs=$objlist
-	      if test "$obj" = "$last_oldobj" ; then
-		RANLIB=$save_RANLIB
-	      fi
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
-	      objlist=
-	      len=$len0
-	    fi
-	  done
-	  RANLIB=$save_RANLIB
-	  oldobjs=$objlist
-	  if test "X$oldobjs" = "X" ; then
-	    eval cmds=\"\$concat_cmds\"
-	  else
-	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
-	  fi
-	fi
-      fi
-      func_execute_cmds "$cmds" 'exit $?'
-    done
-
-    test -n "$generated" && \
-      func_show_eval "${RM}r$generated"
-
-    # Now create the libtool archive.
-    case $output in
-    *.la)
-      old_library=
-      test "$build_old_libs" = yes && old_library="$libname.$libext"
-      func_verbose "creating $output"
-
-      # Preserve any variables that may affect compiler behavior
-      for var in $variables_saved_for_relink; do
-	if eval test -z \"\${$var+set}\"; then
-	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
-	elif eval var_value=\$$var; test -z "$var_value"; then
-	  relink_command="$var=; export $var; $relink_command"
-	else
-	  func_quote_for_eval "$var_value"
-	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
-	fi
-      done
-      # Quote the link command for shipping.
-      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
-      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
-      if test "$hardcode_automatic" = yes ; then
-	relink_command=
-      fi
-
-      # Only create the output if not a dry run.
-      $opt_dry_run || {
-	for installed in no yes; do
-	  if test "$installed" = yes; then
-	    if test -z "$install_libdir"; then
-	      break
-	    fi
-	    output="$output_objdir/$outputname"i
-	    # Replace all uninstalled libtool libraries with the installed ones
-	    newdependency_libs=
-	    for deplib in $dependency_libs; do
-	      case $deplib in
-	      *.la)
-		func_basename "$deplib"
-		name="$func_basename_result"
-		func_resolve_sysroot "$deplib"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$deplib' is not a valid libtool archive"
-		func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
-		;;
-	      -L*)
-		func_stripname -L '' "$deplib"
-		func_replace_sysroot "$func_stripname_result"
-		func_append newdependency_libs " -L$func_replace_sysroot_result"
-		;;
-	      -R*)
-		func_stripname -R '' "$deplib"
-		func_replace_sysroot "$func_stripname_result"
-		func_append newdependency_libs " -R$func_replace_sysroot_result"
-		;;
-	      *) func_append newdependency_libs " $deplib" ;;
-	      esac
-	    done
-	    dependency_libs="$newdependency_libs"
-	    newdlfiles=
-
-	    for lib in $dlfiles; do
-	      case $lib in
-	      *.la)
-	        func_basename "$lib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
-		func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
-		;;
-	      *) func_append newdlfiles " $lib" ;;
-	      esac
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      case $lib in
-	      *.la)
-		# Only pass preopened files to the pseudo-archive (for
-		# eventual linking with the app. that links it) if we
-		# didn't already link the preopened objects directly into
-		# the library:
-		func_basename "$lib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
-		func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
-		;;
-	      esac
-	    done
-	    dlprefiles="$newdlprefiles"
-	  else
-	    newdlfiles=
-	    for lib in $dlfiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      func_append newdlfiles " $abs"
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      func_append newdlprefiles " $abs"
-	    done
-	    dlprefiles="$newdlprefiles"
-	  fi
-	  $RM $output
-	  # place dlname in correct position for cygwin
-	  # In fact, it would be nice if we could use this code for all target
-	  # systems that can't hard-code library paths into their executables
-	  # and that have no shared library path variable independent of PATH,
-	  # but it turns out we can't easily determine that from inspecting
-	  # libtool variables, so we have to hard-code the OSs to which it
-	  # applies here; at the moment, that means platforms that use the PE
-	  # object format with DLL files.  See the long comment at the top of
-	  # tests/bindir.at for full details.
-	  tdlname=$dlname
-	  case $host,$output,$installed,$module,$dlname in
-	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
-	      # If a -bindir argument was supplied, place the dll there.
-	      if test "x$bindir" != x ;
-	      then
-		func_relative_path "$install_libdir" "$bindir"
-		tdlname=$func_relative_path_result$dlname
-	      else
-		# Otherwise fall back on heuristic.
-		tdlname=../bin/$dlname
-	      fi
-	      ;;
-	  esac
-	  $ECHO > $output "\
-# $outputname - a libtool library file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# The name that we can dlopen(3).
-dlname='$tdlname'
-
-# Names of this library.
-library_names='$library_names'
-
-# The name of the static archive.
-old_library='$old_library'
-
-# Linker flags that can not go in dependency_libs.
-inherited_linker_flags='$new_inherited_linker_flags'
-
-# Libraries that this one depends upon.
-dependency_libs='$dependency_libs'
-
-# Names of additional weak libraries provided by this library
-weak_library_names='$weak_libs'
-
-# Version information for $libname.
-current=$current
-age=$age
-revision=$revision
-
-# Is this an already installed library?
-installed=$installed
-
-# Should we warn about portability when linking against -modules?
-shouldnotlink=$module
-
-# Files to dlopen/dlpreopen
-dlopen='$dlfiles'
-dlpreopen='$dlprefiles'
-
-# Directory that this library needs to be installed in:
-libdir='$install_libdir'"
-	  if test "$installed" = no && test "$need_relink" = yes; then
-	    $ECHO >> $output "\
-relink_command=\"$relink_command\""
-	  fi
-	done
-      }
-
-      # Do a symbolic link so that the libtool archive can be found in
-      # LD_LIBRARY_PATH before the program is installed.
-      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
-      ;;
-    esac
-    exit $EXIT_SUCCESS
-}
-
-{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
-    func_mode_link ${1+"$@"}
-
-
-# func_mode_uninstall arg...
-func_mode_uninstall ()
-{
-    $opt_debug
-    RM="$nonopt"
-    files=
-    rmforce=
-    exit_status=0
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    for arg
-    do
-      case $arg in
-      -f) func_append RM " $arg"; rmforce=yes ;;
-      -*) func_append RM " $arg" ;;
-      *) func_append files " $arg" ;;
-      esac
-    done
-
-    test -z "$RM" && \
-      func_fatal_help "you must specify an RM program"
-
-    rmdirs=
-
-    for file in $files; do
-      func_dirname "$file" "" "."
-      dir="$func_dirname_result"
-      if test "X$dir" = X.; then
-	odir="$objdir"
-      else
-	odir="$dir/$objdir"
-      fi
-      func_basename "$file"
-      name="$func_basename_result"
-      test "$opt_mode" = uninstall && odir="$dir"
-
-      # Remember odir for removal later, being careful to avoid duplicates
-      if test "$opt_mode" = clean; then
-	case " $rmdirs " in
-	  *" $odir "*) ;;
-	  *) func_append rmdirs " $odir" ;;
-	esac
-      fi
-
-      # Don't error if the file doesn't exist and rm -f was used.
-      if { test -L "$file"; } >/dev/null 2>&1 ||
-	 { test -h "$file"; } >/dev/null 2>&1 ||
-	 test -f "$file"; then
-	:
-      elif test -d "$file"; then
-	exit_status=1
-	continue
-      elif test "$rmforce" = yes; then
-	continue
-      fi
-
-      rmfiles="$file"
-
-      case $name in
-      *.la)
-	# Possibly a libtool archive, so verify it.
-	if func_lalib_p "$file"; then
-	  func_source $dir/$name
-
-	  # Delete the libtool libraries and symlinks.
-	  for n in $library_names; do
-	    func_append rmfiles " $odir/$n"
-	  done
-	  test -n "$old_library" && func_append rmfiles " $odir/$old_library"
-
-	  case "$opt_mode" in
-	  clean)
-	    case " $library_names " in
-	    *" $dlname "*) ;;
-	    *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;;
-	    esac
-	    test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i"
-	    ;;
-	  uninstall)
-	    if test -n "$library_names"; then
-	      # Do each command in the postuninstall commands.
-	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
-	    fi
-
-	    if test -n "$old_library"; then
-	      # Do each command in the old_postuninstall commands.
-	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
-	    fi
-	    # FIXME: should reinstall the best remaining shared library.
-	    ;;
-	  esac
-	fi
-	;;
-
-      *.lo)
-	# Possibly a libtool object, so verify it.
-	if func_lalib_p "$file"; then
-
-	  # Read the .lo file
-	  func_source $dir/$name
-
-	  # Add PIC object to the list of files to remove.
-	  if test -n "$pic_object" &&
-	     test "$pic_object" != none; then
-	    func_append rmfiles " $dir/$pic_object"
-	  fi
-
-	  # Add non-PIC object to the list of files to remove.
-	  if test -n "$non_pic_object" &&
-	     test "$non_pic_object" != none; then
-	    func_append rmfiles " $dir/$non_pic_object"
-	  fi
-	fi
-	;;
-
-      *)
-	if test "$opt_mode" = clean ; then
-	  noexename=$name
-	  case $file in
-	  *.exe)
-	    func_stripname '' '.exe' "$file"
-	    file=$func_stripname_result
-	    func_stripname '' '.exe' "$name"
-	    noexename=$func_stripname_result
-	    # $file with .exe has already been added to rmfiles,
-	    # add $file without .exe
-	    func_append rmfiles " $file"
-	    ;;
-	  esac
-	  # Do a test to see if this is a libtool program.
-	  if func_ltwrapper_p "$file"; then
-	    if func_ltwrapper_executable_p "$file"; then
-	      func_ltwrapper_scriptname "$file"
-	      relink_command=
-	      func_source $func_ltwrapper_scriptname_result
-	      func_append rmfiles " $func_ltwrapper_scriptname_result"
-	    else
-	      relink_command=
-	      func_source $dir/$noexename
-	    fi
-
-	    # note $name still contains .exe if it was in $file originally
-	    # as does the version of $file that was added into $rmfiles
-	    func_append rmfiles " $odir/$name $odir/${name}S.${objext}"
-	    if test "$fast_install" = yes && test -n "$relink_command"; then
-	      func_append rmfiles " $odir/lt-$name"
-	    fi
-	    if test "X$noexename" != "X$name" ; then
-	      func_append rmfiles " $odir/lt-${noexename}.c"
-	    fi
-	  fi
-	fi
-	;;
-      esac
-      func_show_eval "$RM $rmfiles" 'exit_status=1'
-    done
-
-    # Try to remove the ${objdir}s in the directories where we deleted files
-    for dir in $rmdirs; do
-      if test -d "$dir"; then
-	func_show_eval "rmdir $dir >/dev/null 2>&1"
-      fi
-    done
-
-    exit $exit_status
-}
-
-{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
-    func_mode_uninstall ${1+"$@"}
-
-test -z "$opt_mode" && {
-  help="$generic_help"
-  func_fatal_help "you must specify a MODE"
-}
-
-test -z "$exec_cmd" && \
-  func_fatal_help "invalid operation mode \`$opt_mode'"
-
-if test -n "$exec_cmd"; then
-  eval exec "$exec_cmd"
-  exit $EXIT_FAILURE
-fi
-
-exit $exit_status
-
-
-# The TAGs below are defined such that we never get into a situation
-# in which we disable both kinds of libraries.  Given conflicting
-# choices, we go for a static library, that is the most portable,
-# since we can't tell whether shared libraries were disabled because
-# the user asked for that or because the platform doesn't support
-# them.  This is particularly important on AIX, because we don't
-# support having both static and shared libraries enabled at the same
-# time on that platform, so we default to a shared-only configuration.
-# If a disable-shared tag is given, we'll fallback to a static-only
-# configuration.  But we'll never go from static-only to shared-only.
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
-build_libtool_libs=no
-build_old_libs=yes
-# ### END LIBTOOL TAG CONFIG: disable-shared
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-static
-build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
-# ### END LIBTOOL TAG CONFIG: disable-static
-
-# Local Variables:
-# mode:shell-script
-# sh-indentation:2
-# End:
-# vi:sw=2
-
diff --git a/build-aux/missing b/build-aux/missing
deleted file mode 100755
index 86a8fc3..0000000
--- a/build-aux/missing
+++ /dev/null
@@ -1,331 +0,0 @@
-#! /bin/sh
-# Common stub for a few missing GNU programs while installing.
-
-scriptversion=2012-01-06.13; # UTC
-
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
-# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
-# Originally by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
-
-# 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 2, 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
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-if test $# -eq 0; then
-  echo 1>&2 "Try \`$0 --help' for more information"
-  exit 1
-fi
-
-run=:
-sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
-sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
-
-# In the cases where this matters, `missing' is being run in the
-# srcdir already.
-if test -f configure.ac; then
-  configure_ac=configure.ac
-else
-  configure_ac=configure.in
-fi
-
-msg="missing on your system"
-
-case $1 in
---run)
-  # Try to run requested program, and just exit if it succeeds.
-  run=
-  shift
-  "$@" && exit 0
-  # Exit code 63 means version mismatch.  This often happens
-  # when the user try to use an ancient version of a tool on
-  # a file that requires a minimum version.  In this case we
-  # we should proceed has if the program had been absent, or
-  # if --run hadn't been passed.
-  if test $? = 63; then
-    run=:
-    msg="probably too old"
-  fi
-  ;;
-
-  -h|--h|--he|--hel|--help)
-    echo "\
-$0 [OPTION]... PROGRAM [ARGUMENT]...
-
-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
-error status if there is no known handling for PROGRAM.
-
-Options:
-  -h, --help      display this help and exit
-  -v, --version   output version information and exit
-  --run           try to run the given command, and emulate it if it fails
-
-Supported PROGRAM values:
-  aclocal      touch file \`aclocal.m4'
-  autoconf     touch file \`configure'
-  autoheader   touch file \`config.h.in'
-  autom4te     touch the output file, or create a stub one
-  automake     touch all \`Makefile.in' files
-  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
-  flex         create \`lex.yy.c', if possible, from existing .c
-  help2man     touch the output file
-  lex          create \`lex.yy.c', if possible, from existing .c
-  makeinfo     touch the output file
-  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
-
-Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
-\`g' are ignored when checking the name.
-
-Send bug reports to <bug-automake at gnu.org>."
-    exit $?
-    ;;
-
-  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
-    echo "missing $scriptversion (GNU Automake)"
-    exit $?
-    ;;
-
-  -*)
-    echo 1>&2 "$0: Unknown \`$1' option"
-    echo 1>&2 "Try \`$0 --help' for more information"
-    exit 1
-    ;;
-
-esac
-
-# normalize program name to check for.
-program=`echo "$1" | sed '
-  s/^gnu-//; t
-  s/^gnu//; t
-  s/^g//; t'`
-
-# Now exit if we have it, but it failed.  Also exit now if we
-# don't have it and --version was passed (most likely to detect
-# the program).  This is about non-GNU programs, so use $1 not
-# $program.
-case $1 in
-  lex*|yacc*)
-    # Not GNU programs, they don't have --version.
-    ;;
-
-  *)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
-       # Could not run --version or --help.  This is probably someone
-       # running `$TOOL --version' or `$TOOL --help' to check whether
-       # $TOOL exists and not knowing $TOOL uses missing.
-       exit 1
-    fi
-    ;;
-esac
-
-# If it does not exist, or fails to run (possibly an outdated version),
-# try to emulate it.
-case $program in
-  aclocal*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
-         to install the \`Automake' and \`Perl' packages.  Grab them from
-         any GNU archive site."
-    touch aclocal.m4
-    ;;
-
-  autoconf*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`${configure_ac}'.  You might want to install the
-         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
-         archive site."
-    touch configure
-    ;;
-
-  autoheader*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
-         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
-         from any GNU archive site."
-    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
-    test -z "$files" && files="config.h"
-    touch_files=
-    for f in $files; do
-      case $f in
-      *:*) touch_files="$touch_files "`echo "$f" |
-				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
-      *) touch_files="$touch_files $f.in";;
-      esac
-    done
-    touch $touch_files
-    ;;
-
-  automake*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
-         You might want to install the \`Automake' and \`Perl' packages.
-         Grab them from any GNU archive site."
-    find . -type f -name Makefile.am -print |
-	   sed 's/\.am$/.in/' |
-	   while read f; do touch "$f"; done
-    ;;
-
-  autom4te*)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, but is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.
-         You can get \`$1' as part of \`Autoconf' from any GNU
-         archive site."
-
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -f "$file"; then
-	touch $file
-    else
-	test -z "$file" || exec >$file
-	echo "#! /bin/sh"
-	echo "# Created by GNU Automake missing as a replacement of"
-	echo "#  $ $@"
-	echo "exit 0"
-	chmod +x $file
-	exit 1
-    fi
-    ;;
-
-  bison*|yacc*)
-    echo 1>&2 "\
-WARNING: \`$1' $msg.  You should only need it if
-         you modified a \`.y' file.  You may need the \`Bison' package
-         in order for those modifications to take effect.  You can get
-         \`Bison' from any GNU archive site."
-    rm -f y.tab.c y.tab.h
-    if test $# -ne 1; then
-        eval LASTARG=\${$#}
-	case $LASTARG in
-	*.y)
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" y.tab.c
-	    fi
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" y.tab.h
-	    fi
-	  ;;
-	esac
-    fi
-    if test ! -f y.tab.h; then
-	echo >y.tab.h
-    fi
-    if test ! -f y.tab.c; then
-	echo 'main() { return 0; }' >y.tab.c
-    fi
-    ;;
-
-  lex*|flex*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.l' file.  You may need the \`Flex' package
-         in order for those modifications to take effect.  You can get
-         \`Flex' from any GNU archive site."
-    rm -f lex.yy.c
-    if test $# -ne 1; then
-        eval LASTARG=\${$#}
-	case $LASTARG in
-	*.l)
-	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" lex.yy.c
-	    fi
-	  ;;
-	esac
-    fi
-    if test ! -f lex.yy.c; then
-	echo 'main() { return 0; }' >lex.yy.c
-    fi
-    ;;
-
-  help2man*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-	 you modified a dependency of a manual page.  You may need the
-	 \`Help2man' package in order for those modifications to take
-	 effect.  You can get \`Help2man' from any GNU archive site."
-
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -f "$file"; then
-	touch $file
-    else
-	test -z "$file" || exec >$file
-	echo ".ab help2man is required to generate this page"
-	exit $?
-    fi
-    ;;
-
-  makeinfo*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.texi' or \`.texinfo' file, or any other file
-         indirectly affecting the aspect of the manual.  The spurious
-         call might also be the consequence of using a buggy \`make' (AIX,
-         DU, IRIX).  You might want to install the \`Texinfo' package or
-         the \`GNU make' package.  Grab either from any GNU archive site."
-    # The file to touch is that specified with -o ...
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -z "$file"; then
-      # ... or it is the one specified with @setfilename ...
-      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
-      file=`sed -n '
-	/^@setfilename/{
-	  s/.* \([^ ]*\) *$/\1/
-	  p
-	  q
-	}' $infile`
-      # ... or it is derived from the source name (dir/f.texi becomes f.info)
-      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
-    fi
-    # If the file does not exist, the user really needs makeinfo;
-    # let's fail without touching anything.
-    test -f $file || exit 1
-    touch $file
-    ;;
-
-  *)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, and is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.  Check the \`README' file,
-         it often tells you about the needed prerequisites for installing
-         this package.  You may also peek at any GNU archive site, in case
-         some other package would contain this missing \`$1' program."
-    exit 1
-    ;;
-esac
-
-exit 0
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/config.h.in b/config.h.in
deleted file mode 100644
index 44eb0b5..0000000
--- a/config.h.in
+++ /dev/null
@@ -1,173 +0,0 @@
-/* config.h.in.  Generated from configure.ac by autoheader.  */
-
-/* Define if building universal (internal helper macro) */
-#undef AC_APPLE_UNIVERSAL_BUILD
-
-/* what version of FFLAS-FFPACK is installed */
-#undef FFLAS_FFPACK_VERSION
-
-/* Define if GMP is version 3.xxx */
-#undef GMP_VERSION_3
-
-/* Define that architecture uses big endian storage */
-#undef HAVE_BIG_ENDIAN
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#undef HAVE_DLFCN_H
-
-/* Define if FFLAS-FFPACK is installed */
-#undef HAVE_FFLAS_FFPACK
-
-/* Define to 1 if you have the <float.h> header file. */
-#undef HAVE_FLOAT_H
-
-/* Define if FPLLL is installed */
-#undef HAVE_FPLLL
-
-/* ps2pdf available as external program */
-#undef HAVE_GHOSTSCRIPT
-
-/* Define if GIVARO is installed */
-#undef HAVE_GIVARO
-
-/* Define if GMP is installed */
-#undef HAVE_GMP
-
-/* gnuplot available as external program */
-#undef HAVE_GNUPLOT
-
-/* Define if IML is installed */
-#undef HAVE_IML
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define if LAPACK is available */
-#undef HAVE_LAPACK
-
-/* Define if LIDIA is installed */
-#undef HAVE_LIDIA
-
-/* Define to 1 if you have the <limits.h> header file. */
-#undef HAVE_LIMITS_H
-
-/* Define that architecture uses little endian storage */
-#undef HAVE_LITTLE_ENDIAN
-
-/* Define if M4RI is installed */
-#undef HAVE_M4RI
-
-/* Define if M4RIE is installed */
-#undef HAVE_M4RIE
-
-/* Define if MAPLE is installed */
-#undef HAVE_MAPLE
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define if MPFR is installed */
-#undef HAVE_MPFR
-
-/* Define if NTL is installed */
-#undef HAVE_NTL
-
-/* Define if SACLIB is installed */
-#undef HAVE_SACLIB
-
-/* Define to 1 if you have the <stddef.h> header file. */
-#undef HAVE_STDDEF_H
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/time.h> header file. */
-#undef HAVE_SYS_TIME_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
-   */
-#undef LT_OBJDIR
-
-/* define is the version of Maple have access function to gmp data */
-#undef MAPLE_GMP_ACCESS
-
-/* Name of package */
-#undef PACKAGE
-
-/* Define to the address where bug reports for this package should be sent. */
-#undef PACKAGE_BUGREPORT
-
-/* Define to the full name of this package. */
-#undef PACKAGE_NAME
-
-/* Define to the full name and version of this package. */
-#undef PACKAGE_STRING
-
-/* Define to the one symbol short name of this package. */
-#undef PACKAGE_TARNAME
-
-/* Define to the home page for this package. */
-#undef PACKAGE_URL
-
-/* Define to the version of this package. */
-#undef PACKAGE_VERSION
-
-/* The size of `char', as computed by sizeof. */
-#undef SIZEOF_CHAR
-
-/* The size of `int', as computed by sizeof. */
-#undef SIZEOF_INT
-
-/* The size of `long', as computed by sizeof. */
-#undef SIZEOF_LONG
-
-/* The size of `long long', as computed by sizeof. */
-#undef SIZEOF_LONG_LONG
-
-/* The size of `short', as computed by sizeof. */
-#undef SIZEOF_SHORT
-
-/* The size of `__int64', as computed by sizeof. */
-#undef SIZEOF___INT64
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Version number of package */
-#undef VERSION
-
-/* optimized threshold for switching to strassen matrix multiplication */
-#undef WINOTHRESHOLD
-
-/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
-   significant byte first (like Motorola and SPARC, unlike Intel). */
-#if defined AC_APPLE_UNIVERSAL_BUILD
-# if defined __BIG_ENDIAN__
-#  define WORDS_BIGENDIAN 1
-# endif
-#else
-# ifndef WORDS_BIGENDIAN
-#  undef WORDS_BIGENDIAN
-# endif
-#endif
-
-/* Define if Expat is installed */
-#undef XMLENABLED
diff --git a/configure b/configure
deleted file mode 100755
index 279172c..0000000
--- a/configure
+++ /dev/null
@@ -1,21334 +0,0 @@
-#! /bin/sh
-# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for LinBox 1.3.2.
-#
-# Report bugs to <linbox-use at googlegroups.com>.
-#
-#
-# Copyright (C) 1992-1996, 1998-2012 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. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
-      PATH_SEPARATOR=';'
-  }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-as_myself=
-case $0 in #((
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-  done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-# Use a proper internal environment variable to ensure we don't fall
-  # into an infinite loop, continuously re-executing ourselves.
-  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
-    _as_can_reexec=no; export _as_can_reexec;
-    # We cannot yet assume a decent shell, so we have to provide a
-# neutralization value for shells without unset; and this also
-# works around shells that cannot unset nonexistent variables.
-# Preserve -v and -x to the replacement shell.
-BASH_ENV=/dev/null
-ENV=/dev/null
-(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-case $- in # ((((
-  *v*x* | *x*v* ) as_opts=-vx ;;
-  *v* ) as_opts=-v ;;
-  *x* ) as_opts=-x ;;
-  * ) as_opts= ;;
-esac
-exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
-# Admittedly, this is quite paranoid, since all the known shells bail
-# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
-as_fn_exit 255
-  fi
-  # We don't want this to propagate to other subprocesses.
-          { _as_can_reexec=; unset _as_can_reexec;}
-if test "x$CONFIG_SHELL" = x; then
-  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '\${1+\"\$@\"}'='\"\$@\"'
-  setopt NO_GLOB_SUBST
-else
-  case \`(set -o) 2>/dev/null\` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-"
-  as_required="as_fn_return () { (exit \$1); }
-as_fn_success () { as_fn_return 0; }
-as_fn_failure () { as_fn_return 1; }
-as_fn_ret_success () { return 0; }
-as_fn_ret_failure () { return 1; }
-
-exitcode=0
-as_fn_success || { exitcode=1; echo as_fn_success failed.; }
-as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
-as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
-as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
-
-else
-  exitcode=1; echo positional parameters were not saved.
-fi
-test x\$exitcode = x0 || exit 1
-test -x / || exit 1"
-  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
-  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
-  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
-  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
-test \$(( 1 + 1 )) = 2 || exit 1
-
-  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
-    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
-    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
-    PATH=/empty FPATH=/empty; export PATH FPATH
-    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
-      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1"
-  if (eval "$as_required") 2>/dev/null; then :
-  as_have_required=yes
-else
-  as_have_required=no
-fi
-  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
-
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_found=false
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  as_found=:
-  case $as_dir in #(
-	 /*)
-	   for as_base in sh bash ksh sh5; do
-	     # Try only shells that exist, to save several forks.
-	     as_shell=$as_dir/$as_base
-	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
-		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
-  CONFIG_SHELL=$as_shell as_have_required=yes
-		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
-  break 2
-fi
-fi
-	   done;;
-       esac
-  as_found=false
-done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
-	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
-  CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
-IFS=$as_save_IFS
-
-
-      if test "x$CONFIG_SHELL" != x; then :
-  export CONFIG_SHELL
-             # We cannot yet assume a decent shell, so we have to provide a
-# neutralization value for shells without unset; and this also
-# works around shells that cannot unset nonexistent variables.
-# Preserve -v and -x to the replacement shell.
-BASH_ENV=/dev/null
-ENV=/dev/null
-(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-case $- in # ((((
-  *v*x* | *x*v* ) as_opts=-vx ;;
-  *v* ) as_opts=-v ;;
-  *x* ) as_opts=-x ;;
-  * ) as_opts= ;;
-esac
-exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
-# Admittedly, this is quite paranoid, since all the known shells bail
-# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
-exit 255
-fi
-
-    if test x$as_have_required = xno; then :
-  $as_echo "$0: This script requires a shell more modern than all"
-  $as_echo "$0: the shells that I found on your system."
-  if test x${ZSH_VERSION+set} = xset ; then
-    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
-    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
-  else
-    $as_echo "$0: Please tell bug-autoconf at gnu.org and
-$0: linbox-use at googlegroups.com about your system,
-$0: including any error possibly output before this
-$0: message. Then install a modern shell, or manually run
-$0: the script under such a shell if you do have one."
-  fi
-  exit 1
-fi
-fi
-fi
-SHELL=${CONFIG_SHELL-/bin/sh}
-export SHELL
-# Unset more variables known to interfere with behavior of common tools.
-CLICOLOR_FORCE= GREP_OPTIONS=
-unset CLICOLOR_FORCE GREP_OPTIONS
-
-## --------------------- ##
-## M4sh Shell Functions. ##
-## --------------------- ##
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
-  { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
-  return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
-  set +e
-  as_fn_set_status $1
-  exit $1
-} # as_fn_exit
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || eval $as_mkdir_p || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-
-# as_fn_executable_p FILE
-# -----------------------
-# Test if FILE is an executable regular file.
-as_fn_executable_p ()
-{
-  test -f "$1" && test -x "$1"
-} # as_fn_executable_p
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
-  eval 'as_fn_append ()
-  {
-    eval $1+=\$2
-  }'
-else
-  as_fn_append ()
-  {
-    eval $1=\$$1\$2
-  }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
-  eval 'as_fn_arith ()
-  {
-    as_val=$(( $* ))
-  }'
-else
-  as_fn_arith ()
-  {
-    as_val=`expr "$@" || test $? -eq 1`
-  }
-fi # as_fn_arith
-
-
-# as_fn_error STATUS ERROR [LINENO LOG_FD]
-# ----------------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with STATUS, using 1 if that was 0.
-as_fn_error ()
-{
-  as_status=$1; test $as_status -eq 0 && as_status=1
-  if test "$4"; then
-    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
-  fi
-  $as_echo "$as_me: error: $2" >&2
-  as_fn_exit $as_status
-} # as_fn_error
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-
-  as_lineno_1=$LINENO as_lineno_1a=$LINENO
-  as_lineno_2=$LINENO as_lineno_2a=$LINENO
-  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
-  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
-  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
-  sed -n '
-    p
-    /[$]LINENO/=
-  ' <$as_myself |
-    sed '
-      s/[$]LINENO.*/&-/
-      t lineno
-      b
-      :lineno
-      N
-      :loop
-      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
-      t loop
-      s/-\n.*//
-    ' >$as_me.lineno &&
-  chmod +x "$as_me.lineno" ||
-    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
-
-  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
-  # already done that, so ensure we don't try to do so again and fall
-  # in an infinite loop.  This has already happened in practice.
-  _as_can_reexec=no; export _as_can_reexec
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensitive to this).
-  . "./$as_me.lineno"
-  # Exit status is that of the last command.
-  exit
-}
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
-  case `echo 'xy\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  xy)  ECHO_C='\c';;
-  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
-       ECHO_T='	';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
-  if ln -s conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s='ln -s'
-    # ... but there are two gotchas:
-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -pR'.
-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -pR'
-  elif ln conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s=ln
-  else
-    as_ln_s='cp -pR'
-  fi
-else
-  as_ln_s='cp -pR'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p='mkdir -p "$as_dir"'
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-as_test_x='test -x'
-as_executable_p=as_fn_executable_p
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-
-test -n "$DJDIR" || exec 7<&0 </dev/null
-exec 6>&1
-
-# Name of the host.
-# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
-# so uname gets run too.
-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
-#
-# Initializations.
-#
-ac_default_prefix=/usr/local
-ac_clean_files=
-ac_config_libobj_dir=.
-LIBOBJS=
-cross_compiling=no
-subdirs=
-MFLAGS=
-MAKEFLAGS=
-
-# Identity of this package.
-PACKAGE_NAME='LinBox'
-PACKAGE_TARNAME='linbox'
-PACKAGE_VERSION='1.3.2'
-PACKAGE_STRING='LinBox 1.3.2'
-PACKAGE_BUGREPORT='linbox-use at googlegroups.com'
-PACKAGE_URL='http://www.linalg.org/'
-
-# Factoring default headers for most tests.
-ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#ifdef STDC_HEADERS
-# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-#  include <stdlib.h>
-# endif
-#endif
-#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-#  include <memory.h>
-# endif
-# include <string.h>
-#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-#ifdef HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif"
-
-ac_subst_vars='am__EXEEXT_FALSE
-am__EXEEXT_TRUE
-LTLIBOBJS
-LIBOBJS
-LINBOX_BUILD_DOC_FALSE
-LINBOX_BUILD_DOC_TRUE
-LINBOX_DOC_PATH
-LINBOX_BENCH_PATH
-LINBOX_HAVE_EXPAT_FALSE
-LINBOX_HAVE_EXPAT_TRUE
-EXPAT_LIBS
-EXPAT_CFLAGS
-LINBOX_HAVE_LAPACK_FALSE
-LINBOX_HAVE_LAPACK_TRUE
-LINBOX_HAVE_FFLAS_FFPACK_FALSE
-LINBOX_HAVE_FFLAS_FFPACK_TRUE
-BLAS_CFLAGS
-BLAS_LIBS
-FFLAS_FFPACK_LOC
-FFLAS_FFPACK_LIBS
-FFLAS_FFPACK_CFLAGS
-LINBOX_HAVE_SAGE_FALSE
-LINBOX_HAVE_SAGE_TRUE
-LINBOX_HAVE_MAPLE_FALSE
-LINBOX_HAVE_MAPLE_TRUE
-MAPLE_VERSION
-MAPLE_HOME
-MAPLE_CFLAGS
-MAPLE_LIBS
-LINBOX_HAVE_LIDIA_FALSE
-LINBOX_HAVE_LIDIA_TRUE
-LIDIA_LIBS
-LIDIA_CFLAGS
-LINBOX_HAVE_SACLIB_FALSE
-LINBOX_HAVE_SACLIB_TRUE
-SACLIB_LIBS
-SACLIB_CFLAGS
-LINBOX_HAVE_GIVARO_FALSE
-LINBOX_HAVE_GIVARO_TRUE
-GIVARO_LIBS
-GIVARO_CFLAGS
-LINBOX_HAVE_NTL_FALSE
-LINBOX_HAVE_NTL_TRUE
-NTL_LIBS
-NTL_CFLAGS
-LINBOX_HAVE_FPLLL_FALSE
-LINBOX_HAVE_FPLLL_TRUE
-FPLLL_LIBS
-FPLLL_CFLAGS
-LINBOX_HAVE_MPFR_FALSE
-LINBOX_HAVE_MPFR_TRUE
-MPFR_LIBS
-MPFR_CFLAGS
-LINBOX_HAVE_M4RIE_FALSE
-LINBOX_HAVE_M4RIE_TRUE
-M4RIE_LIBS
-M4RIE_CFLAGS
-LINBOX_HAVE_M4RI_FALSE
-LINBOX_HAVE_M4RI_TRUE
-M4RI_LIBS
-M4RI_CFLAGS
-LINBOX_HAVE_IML_FALSE
-LINBOX_HAVE_IML_TRUE
-IML_LIBS
-IML_CFLAGS
-GMP_VERSION
-GMP_LIBS
-GMP_CFLAGS
-LINBOX_COMPILE_DRIVERS_FALSE
-LINBOX_COMPILE_DRIVERS_TRUE
-OTOOL64
-OTOOL
-LIPO
-NMEDIT
-DSYMUTIL
-MANIFEST_TOOL
-RANLIB
-ac_ct_AR
-AR
-DLLTOOL
-OBJDUMP
-LN_S
-NM
-ac_ct_DUMPBIN
-DUMPBIN
-LD
-FGREP
-SED
-ac_ct_CC
-CFLAGS
-CC
-host_os
-host_vendor
-host_cpu
-host
-build_os
-build_vendor
-build_cpu
-build
-LIBTOOL
-EGREP
-GREP
-CXXCPP
-TESTS_CFLAGS
-DEBUG_CFLAGS
-DEFAULT_CFLAGS
-CCNAM
-OBJEXT
-EXEEXT
-ac_ct_CXX
-CPPFLAGS
-LDFLAGS
-CXXFLAGS
-CXX
-WARN
-PROF
-PROFILE_FALSE
-PROFILE_TRUE
-DBG
-DEBUG_FALSE
-DEBUG_TRUE
-INSIDE_GNOME_COMMON_FALSE
-INSIDE_GNOME_COMMON_TRUE
-am__nodep
-AMDEPBACKSLASH
-AMDEP_FALSE
-AMDEP_TRUE
-MAINT
-MAINTAINER_MODE_FALSE
-MAINTAINER_MODE_TRUE
-RM
-am__untar
-am__tar
-AMTAR
-am__leading_dot
-SET_MAKE
-AWK
-mkdir_p
-MKDIR_P
-INSTALL_STRIP_PROGRAM
-STRIP
-install_sh
-MAKEINFO
-AUTOHEADER
-AUTOMAKE
-AUTOCONF
-ACLOCAL
-VERSION
-PACKAGE
-CYGPATH_W
-am__isrc
-INSTALL_DATA
-INSTALL_SCRIPT
-INSTALL_PROGRAM
-target_alias
-host_alias
-build_alias
-LIBS
-ECHO_T
-ECHO_N
-ECHO_C
-DEFS
-mandir
-localedir
-libdir
-psdir
-pdfdir
-dvidir
-htmldir
-infodir
-docdir
-oldincludedir
-includedir
-localstatedir
-sharedstatedir
-sysconfdir
-datadir
-datarootdir
-libexecdir
-sbindir
-bindir
-program_transform_name
-prefix
-exec_prefix
-PACKAGE_URL
-PACKAGE_BUGREPORT
-PACKAGE_STRING
-PACKAGE_VERSION
-PACKAGE_TARNAME
-PACKAGE_NAME
-PATH_SEPARATOR
-SHELL'
-ac_subst_files=''
-ac_user_opts='
-enable_option_checking
-enable_maintainer_mode
-enable_dependency_tracking
-enable_debug
-enable_profile
-enable_warnings
-enable_shared
-enable_static
-with_pic
-enable_fast_install
-with_gnu_ld
-with_sysroot
-enable_libtool_lock
-with_default
-with_all
-enable_drivers
-with_gmp
-with_iml
-with_m4ri
-with_m4rie
-with_mpfr
-with_fplll
-with_ntl
-with_givaro
-with_saclib
-with_lidia
-with_maple
-enable_sage
-with_fflas_ffpack
-with_expat
-with_benchdir
-with_gnuplot
-with_ghostscript
-enable_optimization
-with_docdir
-with_doxygen
-enable_doc
-'
-      ac_precious_vars='build_alias
-host_alias
-target_alias
-CXX
-CXXFLAGS
-LDFLAGS
-LIBS
-CPPFLAGS
-CCC
-CXXCPP
-CC
-CFLAGS'
-
-
-# Initialize some variables set by options.
-ac_init_help=
-ac_init_version=false
-ac_unrecognized_opts=
-ac_unrecognized_sep=
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-cache_file=/dev/null
-exec_prefix=NONE
-no_create=
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-verbose=
-x_includes=NONE
-x_libraries=NONE
-
-# Installation directory options.
-# These are left unexpanded so users can "make install exec_prefix=/foo"
-# and all the variables that are supposed to be based on exec_prefix
-# by default will actually change.
-# Use braces instead of parens because sh, perl, etc. also accept them.
-# (The list follows the same order as the GNU Coding Standards.)
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datarootdir='${prefix}/share'
-datadir='${datarootdir}'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
-infodir='${datarootdir}/info'
-htmldir='${docdir}'
-dvidir='${docdir}'
-pdfdir='${docdir}'
-psdir='${docdir}'
-libdir='${exec_prefix}/lib'
-localedir='${datarootdir}/locale'
-mandir='${datarootdir}/man'
-
-ac_prev=
-ac_dashdash=
-for ac_option
-do
-  # If the previous option needs an argument, assign it.
-  if test -n "$ac_prev"; then
-    eval $ac_prev=\$ac_option
-    ac_prev=
-    continue
-  fi
-
-  case $ac_option in
-  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
-  *=)   ac_optarg= ;;
-  *)    ac_optarg=yes ;;
-  esac
-
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
-  case $ac_dashdash$ac_option in
-  --)
-    ac_dashdash=yes ;;
-
-  -bindir | --bindir | --bindi | --bind | --bin | --bi)
-    ac_prev=bindir ;;
-  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
-    bindir=$ac_optarg ;;
-
-  -build | --build | --buil | --bui | --bu)
-    ac_prev=build_alias ;;
-  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
-    build_alias=$ac_optarg ;;
-
-  -cache-file | --cache-file | --cache-fil | --cache-fi \
-  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-    ac_prev=cache_file ;;
-  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
-    cache_file=$ac_optarg ;;
-
-  --config-cache | -C)
-    cache_file=config.cache ;;
-
-  -datadir | --datadir | --datadi | --datad)
-    ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=*)
-    datadir=$ac_optarg ;;
-
-  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
-  | --dataroo | --dataro | --datar)
-    ac_prev=datarootdir ;;
-  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
-  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
-    datarootdir=$ac_optarg ;;
-
-  -disable-* | --disable-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid feature name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"enable_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval enable_$ac_useropt=no ;;
-
-  -docdir | --docdir | --docdi | --doc | --do)
-    ac_prev=docdir ;;
-  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
-    docdir=$ac_optarg ;;
-
-  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
-    ac_prev=dvidir ;;
-  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
-    dvidir=$ac_optarg ;;
-
-  -enable-* | --enable-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid feature name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"enable_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval enable_$ac_useropt=\$ac_optarg ;;
-
-  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
-  | --exec | --exe | --ex)
-    ac_prev=exec_prefix ;;
-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
-  | --exec=* | --exe=* | --ex=*)
-    exec_prefix=$ac_optarg ;;
-
-  -gas | --gas | --ga | --g)
-    # Obsolete; use --with-gas.
-    with_gas=yes ;;
-
-  -help | --help | --hel | --he | -h)
-    ac_init_help=long ;;
-  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
-    ac_init_help=recursive ;;
-  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
-    ac_init_help=short ;;
-
-  -host | --host | --hos | --ho)
-    ac_prev=host_alias ;;
-  -host=* | --host=* | --hos=* | --ho=*)
-    host_alias=$ac_optarg ;;
-
-  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
-    ac_prev=htmldir ;;
-  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
-  | --ht=*)
-    htmldir=$ac_optarg ;;
-
-  -includedir | --includedir | --includedi | --included | --include \
-  | --includ | --inclu | --incl | --inc)
-    ac_prev=includedir ;;
-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
-  | --includ=* | --inclu=* | --incl=* | --inc=*)
-    includedir=$ac_optarg ;;
-
-  -infodir | --infodir | --infodi | --infod | --info | --inf)
-    ac_prev=infodir ;;
-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
-    infodir=$ac_optarg ;;
-
-  -libdir | --libdir | --libdi | --libd)
-    ac_prev=libdir ;;
-  -libdir=* | --libdir=* | --libdi=* | --libd=*)
-    libdir=$ac_optarg ;;
-
-  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
-  | --libexe | --libex | --libe)
-    ac_prev=libexecdir ;;
-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
-  | --libexe=* | --libex=* | --libe=*)
-    libexecdir=$ac_optarg ;;
-
-  -localedir | --localedir | --localedi | --localed | --locale)
-    ac_prev=localedir ;;
-  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
-    localedir=$ac_optarg ;;
-
-  -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst | --locals)
-    ac_prev=localstatedir ;;
-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
-    localstatedir=$ac_optarg ;;
-
-  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
-    ac_prev=mandir ;;
-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
-    mandir=$ac_optarg ;;
-
-  -nfp | --nfp | --nf)
-    # Obsolete; use --without-fp.
-    with_fp=no ;;
-
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c | -n)
-    no_create=yes ;;
-
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
-    no_recursion=yes ;;
-
-  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
-  | --oldin | --oldi | --old | --ol | --o)
-    ac_prev=oldincludedir ;;
-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
-    oldincludedir=$ac_optarg ;;
-
-  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-    ac_prev=prefix ;;
-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-    prefix=$ac_optarg ;;
-
-  -program-prefix | --program-prefix | --program-prefi | --program-pref \
-  | --program-pre | --program-pr | --program-p)
-    ac_prev=program_prefix ;;
-  -program-prefix=* | --program-prefix=* | --program-prefi=* \
-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
-    program_prefix=$ac_optarg ;;
-
-  -program-suffix | --program-suffix | --program-suffi | --program-suff \
-  | --program-suf | --program-su | --program-s)
-    ac_prev=program_suffix ;;
-  -program-suffix=* | --program-suffix=* | --program-suffi=* \
-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
-    program_suffix=$ac_optarg ;;
-
-  -program-transform-name | --program-transform-name \
-  | --program-transform-nam | --program-transform-na \
-  | --program-transform-n | --program-transform- \
-  | --program-transform | --program-transfor \
-  | --program-transfo | --program-transf \
-  | --program-trans | --program-tran \
-  | --progr-tra | --program-tr | --program-t)
-    ac_prev=program_transform_name ;;
-  -program-transform-name=* | --program-transform-name=* \
-  | --program-transform-nam=* | --program-transform-na=* \
-  | --program-transform-n=* | --program-transform-=* \
-  | --program-transform=* | --program-transfor=* \
-  | --program-transfo=* | --program-transf=* \
-  | --program-trans=* | --program-tran=* \
-  | --progr-tra=* | --program-tr=* | --program-t=*)
-    program_transform_name=$ac_optarg ;;
-
-  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
-    ac_prev=pdfdir ;;
-  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
-    pdfdir=$ac_optarg ;;
-
-  -psdir | --psdir | --psdi | --psd | --ps)
-    ac_prev=psdir ;;
-  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
-    psdir=$ac_optarg ;;
-
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil)
-    silent=yes ;;
-
-  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
-    ac_prev=sbindir ;;
-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
-  | --sbi=* | --sb=*)
-    sbindir=$ac_optarg ;;
-
-  -sharedstatedir | --sharedstatedir | --sharedstatedi \
-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
-  | --sharedst | --shareds | --shared | --share | --shar \
-  | --sha | --sh)
-    ac_prev=sharedstatedir ;;
-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
-  | --sha=* | --sh=*)
-    sharedstatedir=$ac_optarg ;;
-
-  -site | --site | --sit)
-    ac_prev=site ;;
-  -site=* | --site=* | --sit=*)
-    site=$ac_optarg ;;
-
-  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-    ac_prev=srcdir ;;
-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-    srcdir=$ac_optarg ;;
-
-  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
-  | --syscon | --sysco | --sysc | --sys | --sy)
-    ac_prev=sysconfdir ;;
-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
-    sysconfdir=$ac_optarg ;;
-
-  -target | --target | --targe | --targ | --tar | --ta | --t)
-    ac_prev=target_alias ;;
-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
-    target_alias=$ac_optarg ;;
-
-  -v | -verbose | --verbose | --verbos | --verbo | --verb)
-    verbose=yes ;;
-
-  -version | --version | --versio | --versi | --vers | -V)
-    ac_init_version=: ;;
-
-  -with-* | --with-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid package name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"with_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval with_$ac_useropt=\$ac_optarg ;;
-
-  -without-* | --without-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid package name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"with_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval with_$ac_useropt=no ;;
-
-  --x)
-    # Obsolete; use --with-x.
-    with_x=yes ;;
-
-  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
-  | --x-incl | --x-inc | --x-in | --x-i)
-    ac_prev=x_includes ;;
-  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
-  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
-    x_includes=$ac_optarg ;;
-
-  -x-libraries | --x-libraries | --x-librarie | --x-librari \
-  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
-    ac_prev=x_libraries ;;
-  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
-  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
-    x_libraries=$ac_optarg ;;
-
-  -*) as_fn_error $? "unrecognized option: \`$ac_option'
-Try \`$0 --help' for more information"
-    ;;
-
-  *=*)
-    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
-    # Reject names that are not valid shell variable names.
-    case $ac_envvar in #(
-      '' | [0-9]* | *[!_$as_cr_alnum]* )
-      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
-    esac
-    eval $ac_envvar=\$ac_optarg
-    export $ac_envvar ;;
-
-  *)
-    # FIXME: should be removed in autoconf 3.0.
-    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
-    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
-    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
-    ;;
-
-  esac
-done
-
-if test -n "$ac_prev"; then
-  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
-  as_fn_error $? "missing argument to $ac_option"
-fi
-
-if test -n "$ac_unrecognized_opts"; then
-  case $enable_option_checking in
-    no) ;;
-    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
-    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
-  esac
-fi
-
-# Check all directory arguments for consistency.
-for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
-		datadir sysconfdir sharedstatedir localstatedir includedir \
-		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
-do
-  eval ac_val=\$$ac_var
-  # Remove trailing slashes.
-  case $ac_val in
-    */ )
-      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
-      eval $ac_var=\$ac_val;;
-  esac
-  # Be sure to have absolute directory names.
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* )  continue;;
-    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
-  esac
-  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
-done
-
-# There might be people who depend on the old broken behavior: `$host'
-# used to hold the argument of --host etc.
-# FIXME: To remove some day.
-build=$build_alias
-host=$host_alias
-target=$target_alias
-
-# FIXME: To remove some day.
-if test "x$host_alias" != x; then
-  if test "x$build_alias" = x; then
-    cross_compiling=maybe
-  elif test "x$build_alias" != "x$host_alias"; then
-    cross_compiling=yes
-  fi
-fi
-
-ac_tool_prefix=
-test -n "$host_alias" && ac_tool_prefix=$host_alias-
-
-test "$silent" = yes && exec 6>/dev/null
-
-
-ac_pwd=`pwd` && test -n "$ac_pwd" &&
-ac_ls_di=`ls -di .` &&
-ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
-  as_fn_error $? "working directory cannot be determined"
-test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
-  as_fn_error $? "pwd does not report name of working directory"
-
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
-  ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then the parent directory.
-  ac_confdir=`$as_dirname -- "$as_myself" ||
-$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_myself" : 'X\(//\)[^/]' \| \
-	 X"$as_myself" : 'X\(//\)$' \| \
-	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  srcdir=$ac_confdir
-  if test ! -r "$srcdir/$ac_unique_file"; then
-    srcdir=..
-  fi
-else
-  ac_srcdir_defaulted=no
-fi
-if test ! -r "$srcdir/$ac_unique_file"; then
-  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
-  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
-fi
-ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
-ac_abs_confdir=`(
-	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
-	pwd)`
-# When building in place, set srcdir=.
-if test "$ac_abs_confdir" = "$ac_pwd"; then
-  srcdir=.
-fi
-# Remove unnecessary trailing slashes from srcdir.
-# Double slashes in file names in object file debugging info
-# mess up M-x gdb in Emacs.
-case $srcdir in
-*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
-esac
-for ac_var in $ac_precious_vars; do
-  eval ac_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_env_${ac_var}_value=\$${ac_var}
-  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_cv_env_${ac_var}_value=\$${ac_var}
-done
-
-#
-# 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 LinBox 1.3.2 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.
-
-Configuration:
-  -h, --help              display this help and exit
-      --help=short        display options specific to this package
-      --help=recursive    display the short help of all the included packages
-  -V, --version           display version information and exit
-  -q, --quiet, --silent   do not print \`checking ...' messages
-      --cache-file=FILE   cache test results in FILE [disabled]
-  -C, --config-cache      alias for \`--cache-file=config.cache'
-  -n, --no-create         do not create output files
-      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
-
-Installation directories:
-  --prefix=PREFIX         install architecture-independent files in PREFIX
-                          [$ac_default_prefix]
-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-                          [PREFIX]
-
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
-
-For better control, use the options below.
-
-Fine tuning of the installation directories:
-  --bindir=DIR            user executables [EPREFIX/bin]
-  --sbindir=DIR           system admin executables [EPREFIX/sbin]
-  --libexecdir=DIR        program executables [EPREFIX/libexec]
-  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
-  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
-  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
-  --libdir=DIR            object code libraries [EPREFIX/lib]
-  --includedir=DIR        C header files [PREFIX/include]
-  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
-  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
-  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
-  --infodir=DIR           info documentation [DATAROOTDIR/info]
-  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
-  --mandir=DIR            man documentation [DATAROOTDIR/man]
-  --docdir=DIR            documentation root [DATAROOTDIR/doc/linbox]
-  --htmldir=DIR           html documentation [DOCDIR]
-  --dvidir=DIR            dvi documentation [DOCDIR]
-  --pdfdir=DIR            pdf documentation [DOCDIR]
-  --psdir=DIR             ps documentation [DOCDIR]
-_ACEOF
-
-  cat <<\_ACEOF
-
-Program names:
-  --program-prefix=PREFIX            prepend PREFIX to installed program names
-  --program-suffix=SUFFIX            append SUFFIX to installed program names
-  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
-
-System types:
-  --build=BUILD     configure for building on BUILD [guessed]
-  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
-_ACEOF
-fi
-
-if test -n "$ac_init_help"; then
-  case $ac_init_help in
-     short | recursive ) echo "Configuration of LinBox 1.3.2:";;
-   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]
-  --enable-maintainer-mode  enable make rules and dependencies not useful
-			  (and sometimes confusing) to the casual installer
-  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors
-  --enable-debug          enable debugging options in library
-  --enable-profile        enable profiling options in library
-  --enable-warnings=yes|full|no
-                          enable warnings when compiling the library. If
-                          nothing or yes is given, more aggressive compiler
-                          warnings are passed to the compiler. If full is
-                          given, we become paranoïd about warnings and treat
-                          them as errors.
-  --enable-shared[=PKGS]  build shared libraries [default=yes]
-  --enable-static[=PKGS]  build static libraries [default=yes]
-  --enable-fast-install[=PKGS]
-                          optimize for fast installation [default=yes]
-  --disable-libtool-lock  avoid locking (might break parallel builds)
-  --enable-drivers        Enable the compilation of the drivers
-  --enable-shared         Check for shared compilation (needed by
-                          --with-maple)
-  --enable-sage           Enable the compilation of the SAGE interface
-  --enable-optimization   Enable run time optimization in LinBox code (only
-                          Strassen matrix threshold for now)
-  --enable-doc            Enable building documentation
-
-Optional Packages:
-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
-                          both]
-  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
-  --with-sysroot=DIR Search for dependent libraries within DIR
-                        (or the compiler's sysroot if not specified).
-  --with-default=<path>   Add <path> to the default path for external package
-                          checking. Set as default with /usr and /usr/local.
-  --with-all=<path>|yes|no
-                          Use all external packages. If the argument is no,
-                          you not sure that all libraries are reachable with
-                          the default path. If the argument is yes or <empty>,
-                          that means that all libraries are reachable with the
-                          default path. Otherwise add <path> to default path
-                          and enable all external packages.
-  --with-gmp= <path>|yes  Use GMP library. This library is mandatory for
-                          LinBox compilation. If argument is yes or <empty>
-                          that means the library is reachable with the
-                          standard search path "/usr" or "/usr/local" (set as
-                          default). Otherwise you give the <path> to the
-                          directory which contain the library.
-  --with-iml=<path>|yes   Use IML library. This library is (not yet) mandatory
-                          for LinBox compilation. If argument is yes or
-                          <empty> or <bad> :) that means the library is
-                          reachable with the standard search path (/usr or
-                          /usr/local). Otherwise you give the <path> to the
-                          directory which contains the library.
-  --with-m4ri=<path>|yes  Use M4RI library. This library is (not yet)
-                          mandatory for LinBox compilation. If argument is yes
-                          or <empty> or <bad> that means the library is
-                          reachable with the standard search path (/usr or
-                          /usr/local). Otherwise you give the <path> to the
-                          directory which contains the library.
-
-  --with-m4rie=<path>|yes Use M4RIE library. This library is (not yet)
-                          mandatory for LinBox compilation. If argument is yes
-                          or <empty> or <bad> that means the library is
-                          reachable with the standard search path (/usr or
-                          /usr/local). Otherwise you give the <path> to the
-                          directory which contains the library.
-
-  --with-mpfr=<path>|yes  Use MPFR library. This library is (not yet)
-                          mandatory for LinBox compilation. If argument is yes
-                          or <empty> or <bad> :) that means the library is
-                          reachable with the standard search path (/usr or
-                          /usr/local). Otherwise you give the <path> to the
-                          directory which contains the library.
-  --with-fplll=<path>|yes Use FPLLL library. This library is (not yet)
-                          mandatory for LinBox compilation. If argument is yes
-                          or <empty> or <bad> :) that means the library is
-                          reachable with the standard search path (/usr or
-                          /usr/local). Otherwise you give the <path> to the
-                          directory which contains the library.
-  --with-ntl=<path>|yes|no
-                          Use NTL library. If argument is no, you do not have
-                          the library installed on your machine (set as
-                          default). If argument is yes or <empty> that means
-                          the library is reachable with the standard search
-                          path (/usr or /usr/local). Otherwise you give the
-                          <path> to the directory which contain the library.
-  --with-givaro=<path>|yes
-                          Use Givaro library. This library is mandatory for
-                          LinBox compilation. If argument is yes or <empty>
-                          that means the library is reachable with the
-                          standard search path (/usr or /usr/local). Otherwise
-                          you give the <path> to the directory which contains
-                          the library.
-  --with-saclib=<path>|yes|no
-                          Use Saclib library. If argument is no, you do not
-                          have the library installed on your machine (set as
-                          default). If argument is yes or <empty> that means
-                          the library is reachable with the standard search
-                          path (/usr or /usr/local). Otherwise you give the
-                          <path> to the directory which contain the library.
-  --with-lidia=<path>|yes|no
-                          Use Lidia library. If argument is no, you do not
-                          have the library installed on your machine (set as
-                          default). If argument is yes or <empty> that means
-                          the library is reachable with the standard search
-                          path (/usr or /usr/local). Otherwise you give the
-                          <path> to the directory which contain the library.
-  --with-maple=<path>|yes|no
-                          Use Maple library. If argument is no, you do not
-                          have the library installed on your machine (set as
-                          default). If argument is yes or <empty> that means
-                          the library is well installed and so reachable.
-                          Otherwise you give the <path> to the directory which
-                          contains the Software.
-  --with-fflas-ffpack=<path>|yes
-                          Use Fflas-Ffpack library. This library is mandatory
-                          for LinBox compilation. If argument is yes or
-                          <empty> or <bad> :) that means the library is
-                          reachable with the standard search path (/usr or
-                          /usr/local). Otherwise you give the <path> to the
-                          directory which contains the library. Available at
-                          "http://linalg.org/projects/fflas-ffpack".
-  --with-expat=<path>|yes|no
-                          Use Expat library. If argument is no, you do not
-                          have the library installed on your machine (set as
-                          default). If argument is yes or <empty> that means
-                          the library is reachable with the standard search
-                          path (/usr or /usr/local). Otherwise you give the
-                          <path> to the directory which contain the library.
-  --with-benchdir=<path>  Where the LinBox benchmarks should be performed
-  --with-gnuplot=<path>   Give the path to Gnuplot.
-  --with-ghostscript=<path>
-                          Give the path to ghostscript.
-  --with-docdir=<path>    Where the LinBox documentation should be installed
-  --with-doxygen=<path>   Give the path to Doxygen. Note: --enable-doc needed
-
-Some influential environment variables:
-  CXX         C++ compiler command
-  CXXFLAGS    C++ compiler flags
-  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
-              nonstandard directory <lib dir>
-  LIBS        libraries to pass to the linker, e.g. -l<library>
-  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
-              you have headers in a nonstandard directory <include dir>
-  CXXCPP      C++ preprocessor
-  CC          C compiler command
-  CFLAGS      C compiler flags
-
-Use these variables to override the choices made by `configure' or to help
-it to find libraries and programs with nonstandard names/locations.
-
-Report bugs to <linbox-use at googlegroups.com>.
-LinBox home page: <http://www.linalg.org/>.
-_ACEOF
-ac_status=$?
-fi
-
-if test "$ac_init_help" = "recursive"; then
-  # If there are subdirs, report their specific --help.
-  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d "$ac_dir" ||
-      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
-      continue
-    ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-    cd "$ac_dir" || { ac_status=$?; continue; }
-    # Check for guested configure.
-    if test -f "$ac_srcdir/configure.gnu"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
-    elif test -f "$ac_srcdir/configure"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure" --help=recursive
-    else
-      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
-    fi || ac_status=$?
-    cd "$ac_pwd" || { ac_status=$?; break; }
-  done
-fi
-
-test -n "$ac_init_help" && exit $ac_status
-if $ac_init_version; then
-  cat <<\_ACEOF
-LinBox configure 1.3.2
-generated by GNU Autoconf 2.69
-
-Copyright (C) 2012 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
-
-## ------------------------ ##
-## Autoconf initialization. ##
-## ------------------------ ##
-
-# ac_fn_cxx_try_compile LINENO
-# ----------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext
-  if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_cxx_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_compile
-
-# ac_fn_cxx_try_run LINENO
-# ------------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_cxx_try_run ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-       $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-       ac_retval=$ac_status
-fi
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_run
-
-# ac_fn_cxx_try_cpp LINENO
-# ------------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_cpp ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } > conftest.i && {
-	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
-	 test ! -s conftest.err
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-    ac_retval=1
-fi
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_cpp
-
-# ac_fn_c_try_compile LINENO
-# --------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext
-  if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_compile
-
-# ac_fn_c_try_link LINENO
-# -----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 test -x conftest$ac_exeext
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
-  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
-  # interfere with the next link command; also delete a directory that is
-  # left behind by Apple's compiler.  We do this before executing the actions.
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_link
-
-# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists and can be compiled using the include files in
-# INCLUDES, setting the cache variable VAR accordingly.
-ac_fn_c_check_header_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_header_compile
-
-# ac_fn_c_check_func LINENO FUNC VAR
-# ----------------------------------
-# Tests whether FUNC exists, setting the cache variable VAR accordingly
-ac_fn_c_check_func ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $2 innocuous_$2
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $2 (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $2
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $2 ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined __stub_$2 || defined __stub___$2
-choke me
-#endif
-
-int
-main ()
-{
-return $2 ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_func
-
-# ac_fn_cxx_try_link LINENO
-# -------------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_link ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_cxx_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 test -x conftest$ac_exeext
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
-  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
-  # interfere with the next link command; also delete a directory that is
-  # left behind by Apple's compiler.  We do this before executing the actions.
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_link
-
-# ac_fn_cxx_compute_int LINENO EXPR VAR INCLUDES
-# ----------------------------------------------
-# Tries to find the compile-time value of EXPR in a program that includes
-# INCLUDES, setting VAR accordingly. Returns whether the value could be
-# computed
-ac_fn_cxx_compute_int ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if test "$cross_compiling" = yes; then
-    # Depending upon the size, compute the lo and hi bounds.
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) >= 0)];
-test_array [0] = 0;
-return test_array [0];
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_lo=0 ac_mid=0
-  while :; do
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) <= $ac_mid)];
-test_array [0] = 0;
-return test_array [0];
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_hi=$ac_mid; break
-else
-  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
-			if test $ac_lo -le $ac_mid; then
-			  ac_lo= ac_hi=
-			  break
-			fi
-			as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  done
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) < 0)];
-test_array [0] = 0;
-return test_array [0];
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_hi=-1 ac_mid=-1
-  while :; do
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) >= $ac_mid)];
-test_array [0] = 0;
-return test_array [0];
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_lo=$ac_mid; break
-else
-  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
-			if test $ac_mid -le $ac_hi; then
-			  ac_lo= ac_hi=
-			  break
-			fi
-			as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  done
-else
-  ac_lo= ac_hi=
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-# Binary search between lo and hi bounds.
-while test "x$ac_lo" != "x$ac_hi"; do
-  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) <= $ac_mid)];
-test_array [0] = 0;
-return test_array [0];
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_hi=$ac_mid
-else
-  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-case $ac_lo in #((
-?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
-'') ac_retval=1 ;;
-esac
-  else
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-static long int longval () { return $2; }
-static unsigned long int ulongval () { return $2; }
-#include <stdio.h>
-#include <stdlib.h>
-int
-main ()
-{
-
-  FILE *f = fopen ("conftest.val", "w");
-  if (! f)
-    return 1;
-  if (($2) < 0)
-    {
-      long int i = longval ();
-      if (i != ($2))
-	return 1;
-      fprintf (f, "%ld", i);
-    }
-  else
-    {
-      unsigned long int i = ulongval ();
-      if (i != ($2))
-	return 1;
-      fprintf (f, "%lu", i);
-    }
-  /* Do not output a trailing newline, as this causes \r\n confusion
-     on some platforms.  */
-  return ferror (f) || fclose (f) != 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-  echo >>conftest.val; read $3 <conftest.val; ac_retval=0
-else
-  ac_retval=1
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-rm -f conftest.val
-
-  fi
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_compute_int
-
-# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES
-# ---------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_cxx_check_header_mongrel ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if eval \${$3+:} false; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
-  # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_header_compiler=yes
-else
-  ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <$2>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-  ac_header_preproc=yes
-else
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #((
-  yes:no: )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-    ;;
-  no:yes:* )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( $as_echo "## ------------------------------------------ ##
-## Report this to linbox-use at googlegroups.com ##
-## ------------------------------------------ ##"
-     ) | sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_cxx_check_header_mongrel
-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 LinBox $as_me 1.3.2, which was
-generated by GNU Autoconf 2.69.  Invocation command line was
-
-  $ $0 $@
-
-_ACEOF
-exec 5>>config.log
-{
-cat <<_ASUNAME
-## --------- ##
-## Platform. ##
-## --------- ##
-
-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
-
-/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
-/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
-/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
-
-_ASUNAME
-
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    $as_echo "PATH: $as_dir"
-  done
-IFS=$as_save_IFS
-
-} >&5
-
-cat >&5 <<_ACEOF
-
-
-## ----------- ##
-## Core tests. ##
-## ----------- ##
-
-_ACEOF
-
-
-# Keep a trace of the command line.
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Strip out --silent because we don't want to record it for future runs.
-# Also quote any args containing shell meta-characters.
-# Make two passes to allow for proper duplicate-argument suppression.
-ac_configure_args=
-ac_configure_args0=
-ac_configure_args1=
-ac_must_keep_next=false
-for ac_pass in 1 2
-do
-  for ac_arg
-  do
-    case $ac_arg in
-    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
-    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-    | -silent | --silent | --silen | --sile | --sil)
-      continue ;;
-    *\'*)
-      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    case $ac_pass in
-    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
-    2)
-      as_fn_append ac_configure_args1 " '$ac_arg'"
-      if test $ac_must_keep_next = true; then
-	ac_must_keep_next=false # Got value, back to normal.
-      else
-	case $ac_arg in
-	  *=* | --config-cache | -C | -disable-* | --disable-* \
-	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
-	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
-	  | -with-* | --with-* | -without-* | --without-* | --x)
-	    case "$ac_configure_args0 " in
-	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
-	    esac
-	    ;;
-	  -* ) ac_must_keep_next=true ;;
-	esac
-      fi
-      as_fn_append ac_configure_args " '$ac_arg'"
-      ;;
-    esac
-  done
-done
-{ ac_configure_args0=; unset ac_configure_args0;}
-{ ac_configure_args1=; unset ac_configure_args1;}
-
-# When interrupted or exit'd, cleanup temporary files, and complete
-# config.log.  We remove comments because anyway the quotes in there
-# would cause problems or look ugly.
-# WARNING: Use '\'' to represent an apostrophe within the trap.
-# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
-trap 'exit_status=$?
-  # Save into config.log some information that might help in debugging.
-  {
-    echo
-
-    $as_echo "## ---------------- ##
-## Cache variables. ##
-## ---------------- ##"
-    echo
-    # The following way of writing the cache mishandles newlines in values,
-(
-  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) { eval $ac_var=; unset $ac_var;} ;;
-      esac ;;
-    esac
-  done
-  (set) 2>&1 |
-    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      sed -n \
-	"s/'\''/'\''\\\\'\'''\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
-      ;; #(
-    *)
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-)
-    echo
-
-    $as_echo "## ----------------- ##
-## Output variables. ##
-## ----------------- ##"
-    echo
-    for ac_var in $ac_subst_vars
-    do
-      eval ac_val=\$$ac_var
-      case $ac_val in
-      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-      esac
-      $as_echo "$ac_var='\''$ac_val'\''"
-    done | sort
-    echo
-
-    if test -n "$ac_subst_files"; then
-      $as_echo "## ------------------- ##
-## File substitutions. ##
-## ------------------- ##"
-      echo
-      for ac_var in $ac_subst_files
-      do
-	eval ac_val=\$$ac_var
-	case $ac_val in
-	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-	esac
-	$as_echo "$ac_var='\''$ac_val'\''"
-      done | sort
-      echo
-    fi
-
-    if test -s confdefs.h; then
-      $as_echo "## ----------- ##
-## confdefs.h. ##
-## ----------- ##"
-      echo
-      cat confdefs.h
-      echo
-    fi
-    test "$ac_signal" != 0 &&
-      $as_echo "$as_me: caught signal $ac_signal"
-    $as_echo "$as_me: exit $exit_status"
-  } >&5
-  rm -f core *.core core.conftest.* &&
-    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
-    exit $exit_status
-' 0
-for ac_signal in 1 2 13 15; do
-  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
-done
-ac_signal=0
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -f -r conftest* confdefs.h
-
-$as_echo "/* confdefs.h */" > confdefs.h
-
-# Predefined preprocessor variables.
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
-
-
-# Let the site file select an alternate cache file if it wants to.
-# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
-if test -n "$CONFIG_SITE"; then
-  # We do not want a PATH search for config.site.
-  case $CONFIG_SITE in #((
-    -*)  ac_site_file1=./$CONFIG_SITE;;
-    */*) ac_site_file1=$CONFIG_SITE;;
-    *)   ac_site_file1=./$CONFIG_SITE;;
-  esac
-elif test "x$prefix" != xNONE; then
-  ac_site_file1=$prefix/share/config.site
-  ac_site_file2=$prefix/etc/config.site
-else
-  ac_site_file1=$ac_default_prefix/share/config.site
-  ac_site_file2=$ac_default_prefix/etc/config.site
-fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
-do
-  test "x$ac_site_file" = xNONE && continue
-  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
-    sed 's/^/| /' "$ac_site_file" >&5
-    . "$ac_site_file" \
-      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "failed to load site script $ac_site_file
-See \`config.log' for more details" "$LINENO" 5; }
-  fi
-done
-
-if test -r "$cache_file"; then
-  # Some versions of bash will fail to source /dev/null (special files
-  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
-  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
-    case $cache_file in
-      [\\/]* | ?:[\\/]* ) . "$cache_file";;
-      *)                      . "./$cache_file";;
-    esac
-  fi
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
-  >$cache_file
-fi
-
-# Check that the precious variables saved in the cache have kept the same
-# value.
-ac_cache_corrupted=false
-for ac_var in $ac_precious_vars; do
-  eval ac_old_set=\$ac_cv_env_${ac_var}_set
-  eval ac_new_set=\$ac_env_${ac_var}_set
-  eval ac_old_val=\$ac_cv_env_${ac_var}_value
-  eval ac_new_val=\$ac_env_${ac_var}_value
-  case $ac_old_set,$ac_new_set in
-    set,)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,set)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,);;
-    *)
-      if test "x$ac_old_val" != "x$ac_new_val"; then
-	# differences in whitespace do not lead to failure.
-	ac_old_val_w=`echo x $ac_old_val`
-	ac_new_val_w=`echo x $ac_new_val`
-	if test "$ac_old_val_w" != "$ac_new_val_w"; then
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
-	  ac_cache_corrupted=:
-	else
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
-	  eval $ac_var=\$ac_old_val
-	fi
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
-$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
-$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
-      fi;;
-  esac
-  # Pass precious variables to config.status.
-  if test "$ac_new_set" = set; then
-    case $ac_new_val in
-    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
-    *) ac_arg=$ac_var=$ac_new_val ;;
-    esac
-    case " $ac_configure_args " in
-      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
-      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
-    esac
-  fi
-done
-if $ac_cache_corrupted; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
-fi
-## -------------------- ##
-## Main body of script. ##
-## -------------------- ##
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-ac_aux_dir=
-for ac_dir in build-aux "$srcdir"/build-aux; do
-  if test -f "$ac_dir/install-sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install-sh -c"
-    break
-  elif test -f "$ac_dir/install.sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install.sh -c"
-    break
-  elif test -f "$ac_dir/shtool"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/shtool install -c"
-    break
-  fi
-done
-if test -z "$ac_aux_dir"; then
-  as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5
-fi
-
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
-
-
-am__api_version='1.11'
-
-# Find a good install program.  We prefer a C program (faster),
-# so one script is as good as another.  But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AmigaOS /C/install, which installs bootblocks on floppy discs
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# OS/2's system install, which has a completely different semantic
-# ./install, which can be erroneously created by make from ./install.sh.
-# Reject install programs that cannot install multiple files.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
-$as_echo_n "checking for a BSD-compatible install... " >&6; }
-if test -z "$INSTALL"; then
-if ${ac_cv_path_install+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in #((
-  ./ | .// | /[cC]/* | \
-  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
-  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
-  /usr/ucb/* ) ;;
-  *)
-    # OSF1 and SCO ODT 3.0 have their own names for install.
-    # Don't use installbsd from OSF since it installs stuff as root
-    # by default.
-    for ac_prog in ginstall scoinst install; do
-      for ac_exec_ext in '' $ac_executable_extensions; do
-	if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
-	  if test $ac_prog = install &&
-	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # AIX install.  It has an incompatible calling convention.
-	    :
-	  elif test $ac_prog = install &&
-	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # program-specific install script used by HP pwplus--don't use.
-	    :
-	  else
-	    rm -rf conftest.one conftest.two conftest.dir
-	    echo one > conftest.one
-	    echo two > conftest.two
-	    mkdir conftest.dir
-	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
-	      test -s conftest.one && test -s conftest.two &&
-	      test -s conftest.dir/conftest.one &&
-	      test -s conftest.dir/conftest.two
-	    then
-	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
-	      break 3
-	    fi
-	  fi
-	fi
-      done
-    done
-    ;;
-esac
-
-  done
-IFS=$as_save_IFS
-
-rm -rf conftest.one conftest.two conftest.dir
-
-fi
-  if test "${ac_cv_path_install+set}" = set; then
-    INSTALL=$ac_cv_path_install
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for INSTALL within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    INSTALL=$ac_install_sh
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
-$as_echo "$INSTALL" >&6; }
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
-$as_echo_n "checking whether build environment is sane... " >&6; }
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name.  Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
-  *[\\\"\#\$\&\'\`$am_lf]*)
-    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
-esac
-case $srcdir in
-  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
-    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$*" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$*" != "X $srcdir/configure conftest.file" \
-      && test "$*" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
-alias in your environment" "$LINENO" 5
-   fi
-
-   test "$2" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   as_fn_error $? "newly created file is older than distributed files!
-Check your system clock" "$LINENO" 5
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-test "$program_prefix" != NONE &&
-  program_transform_name="s&^&$program_prefix&;$program_transform_name"
-# Use a double $ so make ignores it.
-test "$program_suffix" != NONE &&
-  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
-# Double any \ or $.
-# By default was `s,x,x', remove it if useless.
-ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
-program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
-
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-
-if test x"${MISSING+set}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
-  *)
-    MISSING="\${SHELL} $am_aux_dir/missing" ;;
-  esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
-$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
-fi
-
-if test x"${install_sh}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
-  *)
-    install_sh="\${SHELL} $am_aux_dir/install-sh"
-  esac
-fi
-
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-if test "$cross_compiling" != no; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_STRIP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
-$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
-if test -z "$MKDIR_P"; then
-  if ${ac_cv_path_mkdir+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in mkdir gmkdir; do
-	 for ac_exec_ext in '' $ac_executable_extensions; do
-	   as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
-	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
-	     'mkdir (GNU coreutils) '* | \
-	     'mkdir (coreutils) '* | \
-	     'mkdir (fileutils) '4.1*)
-	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
-	       break 3;;
-	   esac
-	 done
-       done
-  done
-IFS=$as_save_IFS
-
-fi
-
-  test -d ./--version && rmdir ./--version
-  if test "${ac_cv_path_mkdir+set}" = set; then
-    MKDIR_P="$ac_cv_path_mkdir -p"
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for MKDIR_P within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    MKDIR_P="$ac_install_sh -d"
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
-$as_echo "$MKDIR_P" >&6; }
-
-mkdir_p="$MKDIR_P"
-case $mkdir_p in
-  [\\/$]* | ?:[\\/]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-
-for ac_prog in gawk mawk nawk awk
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AWK+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$AWK"; then
-  ac_cv_prog_AWK="$AWK" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_AWK="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-AWK=$ac_cv_prog_AWK
-if test -n "$AWK"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
-$as_echo "$AWK" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$AWK" && break
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
-set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.make <<\_ACEOF
-SHELL = /bin/sh
-all:
-	@echo '@@@%%%=$(MAKE)=@@@%%%'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
-case `${MAKE-make} -f conftest.make 2>/dev/null` in
-  *@@@%%%=?*=@@@%%%*)
-    eval ac_cv_prog_make_${ac_make}_set=yes;;
-  *)
-    eval ac_cv_prog_make_${ac_make}_set=no;;
-esac
-rm -f conftest.make
-fi
-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-  SET_MAKE=
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-  SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
-else
-  am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  am__isrc=' -I$(srcdir)'
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-
-
-# Define the identity of the package.
- PACKAGE='linbox'
- VERSION='1.3.2'
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE "$PACKAGE"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define VERSION "$VERSION"
-_ACEOF
-
-# Some tools Automake needs.
-
-ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
-
-
-AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
-
-
-AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
-
-
-AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
-
-
-MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
-
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-# Always define AMTAR for backward compatibility.  Yes, it's still used
-# in the wild :-(  We should find a proper way to deprecate it ...
-AMTAR='$${TAR-tar}'
-
-am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
-
-
-
-
-
-ac_config_headers="$ac_config_headers config.h"
-
-
-ac_config_commands="$ac_config_commands linbox/linbox-config.h"
-
-# Extract the first word of "rm", so it can be a program name with args.
-set dummy rm; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_RM+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $RM in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_RM="$RM" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-  test -z "$ac_cv_path_RM" && ac_cv_path_RM="$FALSE"
-  ;;
-esac
-fi
-RM=$ac_cv_path_RM
-if test -n "$RM"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RM" >&5
-$as_echo "$RM" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-RM="$RM -f"
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
-$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
-    # Check whether --enable-maintainer-mode was given.
-if test "${enable_maintainer_mode+set}" = set; then :
-  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
-else
-  USE_MAINTAINER_MODE=no
-fi
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
-$as_echo "$USE_MAINTAINER_MODE" >&6; }
-   if test $USE_MAINTAINER_MODE = yes; then
-  MAINTAINER_MODE_TRUE=
-  MAINTAINER_MODE_FALSE='#'
-else
-  MAINTAINER_MODE_TRUE='#'
-  MAINTAINER_MODE_FALSE=
-fi
-
-  MAINT=$MAINTAINER_MODE_TRUE
-
-
-# Check whether --enable-dependency-tracking was given.
-if test "${enable_dependency_tracking+set}" = set; then :
-  enableval=$enable_dependency_tracking;
-fi
-
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-  am__nodep='_no'
-fi
- if test "x$enable_dependency_tracking" != xno; then
-  AMDEP_TRUE=
-  AMDEP_FALSE='#'
-else
-  AMDEP_TRUE='#'
-  AMDEP_FALSE=
-fi
-
-
-ac_config_commands="$ac_config_commands depfiles"
-
-
-
-
-	 if test x = y; then
-  INSIDE_GNOME_COMMON_TRUE=
-  INSIDE_GNOME_COMMON_FALSE='#'
-else
-  INSIDE_GNOME_COMMON_TRUE='#'
-  INSIDE_GNOME_COMMON_FALSE=
-fi
-
-
-	test -n "$ACLOCAL_FLAGS" && ACLOCAL="$ACLOCAL $ACLOCAL_FLAGS"
-
-	for k in macros ; do ACLOCAL="$ACLOCAL -I $k" ; done
-
-
-# work around to fix the backward compatibility issue of automake 1.10 with 1.9 (pb with MKDIR_P)
-
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-echo "-----------------------------------------------"
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable debugging options in the library" >&5
-$as_echo_n "checking whether to enable debugging options in the library... " >&6; }
-  # Check whether --enable-debug was given.
-if test "${enable_debug+set}" = set; then :
-  enableval=$enable_debug; USE_DEBUG=$enableval
-else
-  USE_DEBUG=no
-fi
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_DEBUG" >&5
-$as_echo "$USE_DEBUG" >&6; }
-   if test $USE_DEBUG = yes; then
-  DEBUG_TRUE=
-  DEBUG_FALSE='#'
-else
-  DEBUG_TRUE='#'
-  DEBUG_FALSE=
-fi
-
-  DBG=$USE_DEBUG
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable profiling everything in the library" >&5
-$as_echo_n "checking whether to enable profiling everything in the library... " >&6; }
-  # Check whether --enable-profile was given.
-if test "${enable_profile+set}" = set; then :
-  enableval=$enable_profile; USE_PROFILE=$enableval
-else
-  USE_PROFILE=no
-fi
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_PROFILE" >&5
-$as_echo "$USE_PROFILE" >&6; }
-   if test $USE_PROFILE = yes; then
-  PROFILE_TRUE=
-  PROFILE_FALSE='#'
-else
-  PROFILE_TRUE='#'
-  PROFILE_FALSE=
-fi
-
-  PROF=$USE_PROFILE
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable warnings when compiling the library" >&5
-$as_echo_n "checking whether to enable warnings when compiling the library... " >&6; }
-  # Check whether --enable-warnings was given.
-if test "${enable_warnings+set}" = set; then :
-  enableval=$enable_warnings; USE_WARNINGS=$enableval
-else
-  USE_WARNINGS=no
-fi
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_WARNINGS" >&5
-$as_echo "$USE_WARNINGS" >&6; }
-    WARN=$USE_WARNINGS
-
-
-echo "-----------------------------------------------"
-
-# CFLAGS=${CFLAGS:-$DEFAULT_CFLAGS}
-# CXXFLAGS=${CXXFLAGS:-$DEFAULT_CXXFLAGS}
-
-######################################################
-# Try and pass different flags according to compiler #
-######################################################
-
-
-# disable default -g -O2 CXXFLAGS
-: ${CXXFLAGS=""}
-
-#set CXX
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-if test -z "$CXX"; then
-  if test -n "$CCC"; then
-    CXX=$CCC
-  else
-    if test -n "$ac_tool_prefix"; then
-  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CXX"; then
-  ac_cv_prog_CXX="$CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CXX=$ac_cv_prog_CXX
-if test -n "$CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
-$as_echo "$CXX" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$CXX" && break
-  done
-fi
-if test -z "$CXX"; then
-  ac_ct_CXX=$CXX
-  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CXX"; then
-  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CXX="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
-if test -n "$ac_ct_CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
-$as_echo "$ac_ct_CXX" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_CXX" && break
-done
-
-  if test "x$ac_ct_CXX" = x; then
-    CXX="g++"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CXX=$ac_ct_CXX
-  fi
-fi
-
-  fi
-fi
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
-  { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    sed '10a\
-... rest of stderr output deleted ...
-         10q' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-  fi
-  rm -f conftest.er1 conftest.err
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-done
-
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5
-$as_echo_n "checking whether the C++ compiler works... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-
-# The possible output files:
-ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
-
-ac_rmfiles=
-for ac_file in $ac_files
-do
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
-  esac
-done
-rm -f $ac_rmfiles
-
-if { { ac_try="$ac_link_default"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link_default") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
-# in a Makefile.  We should not override ac_cv_exeext if it was cached,
-# so that the user can short-circuit this test for compilers unknown to
-# Autoconf.
-for ac_file in $ac_files ''
-do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
-	;;
-    [ab].out )
-	# We found the default executable, but exeext='' is most
-	# certainly right.
-	break;;
-    *.* )
-	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
-	then :; else
-	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	fi
-	# We set ac_cv_exeext here because the later test for it is not
-	# safe: cross compilers may not add the suffix if given an `-o'
-	# argument, so we may need to know it at that point already.
-	# Even if this section looks crufty: it has the advantage of
-	# actually working.
-	break;;
-    * )
-	break;;
-  esac
-done
-test "$ac_cv_exeext" = no && ac_cv_exeext=
-
-else
-  ac_file=''
-fi
-if test -z "$ac_file"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "C++ compiler cannot create executables
-See \`config.log' for more details" "$LINENO" 5; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5
-$as_echo_n "checking for C++ compiler default output file name... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
-ac_exeext=$ac_cv_exeext
-
-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
-if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	  break;;
-    * ) break;;
-  esac
-done
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-rm -f conftest conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-FILE *f = fopen ("conftest.out", "w");
- return ferror (f) || fclose (f) != 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files="$ac_clean_files conftest.out"
-# Check that the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
-if test "$cross_compiling" != yes; then
-  { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-  if { ac_try='./conftest$ac_cv_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then
-    cross_compiling=no
-  else
-    if test "$cross_compiling" = maybe; then
-	cross_compiling=yes
-    else
-	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run C++ compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details" "$LINENO" 5; }
-    fi
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
-
-rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if ${ac_cv_objext+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  for ac_file in conftest.o conftest.obj conftest.*; do
-  test -f "$ac_file" || continue;
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
-    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
-       break;;
-  esac
-done
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
-$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
-if ${ac_cv_cxx_compiler_gnu+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_compiler_gnu=yes
-else
-  ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
-$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
-  GXX=yes
-else
-  GXX=
-fi
-ac_test_CXXFLAGS=${CXXFLAGS+set}
-ac_save_CXXFLAGS=$CXXFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
-$as_echo_n "checking whether $CXX accepts -g... " >&6; }
-if ${ac_cv_prog_cxx_g+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
-   ac_cxx_werror_flag=yes
-   ac_cv_prog_cxx_g=no
-   CXXFLAGS="-g"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_cv_prog_cxx_g=yes
-else
-  CXXFLAGS=""
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-
-else
-  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
-	 CXXFLAGS="-g"
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_cv_prog_cxx_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
-$as_echo "$ac_cv_prog_cxx_g" >&6; }
-if test "$ac_test_CXXFLAGS" = set; then
-  CXXFLAGS=$ac_save_CXXFLAGS
-elif test $ac_cv_prog_cxx_g = yes; then
-  if test "$GXX" = yes; then
-    CXXFLAGS="-g -O2"
-  else
-    CXXFLAGS="-g"
-  fi
-else
-  if test "$GXX" = yes; then
-    CXXFLAGS="-O2"
-  else
-    CXXFLAGS=
-  fi
-fi
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-
-
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for family name of compiler" >&5
-$as_echo_n "checking for family name of compiler... " >&6; }
-
-						if test "$cross_compiling" = yes; then :
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run test program while cross compiling
-See \`config.log' for more details" "$LINENO" 5; }
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-           #ifdef __INTEL_COMPILER
-				int main() { return 0 ; }
-			#else
-			   pas intel
-		   #endif
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: icc" >&5
-$as_echo "icc" >&6; }
-		CCNAM=icc
-
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-		if  test -z "${CCNAM}"; then :
-
-			if test "$cross_compiling" = yes; then :
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run test program while cross compiling
-See \`config.log' for more details" "$LINENO" 5; }
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-				#ifdef __PATHSCALE__
-				   int main() { return !(__PATHCC__ >= 4) ; }
-			   #else
-				   pas ekopath non plus.
-				#endif
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: eko" >&5
-$as_echo "eko" >&6; }
-		CCNAM=eko
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-
-		if  test -z "${CCNAM}"; then :
-
-			if test "$cross_compiling" = yes; then :
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run test program while cross compiling
-See \`config.log' for more details" "$LINENO" 5; }
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-				#ifdef __clang__
-				   int main() { return !(__clang_major >=3) ; }
-			   #else
-				   pas clang non plus.
-				#endif
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: clang" >&5
-$as_echo "clang" >&6; }
-		CCNAM=clang
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-
-		if  test -z "${CCNAM}"; then :
-
-			if test "$cross_compiling" = yes; then :
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run test program while cross compiling
-See \`config.log' for more details" "$LINENO" 5; }
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-				#ifdef __GNUC__
-				   int main() { return !(__GNUC__ >= 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)) ; }
-				#else
-				   pas gcc non plus ???
-				#endif
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
-		CCNOM=gcc
-		if  test -n "${CC}" ; then :
-  CCNOM="`$CC --version 2>&1|  awk 'NR<2{print }'`"
-fi
-		CCNAM=gcc
-
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CCNOM" >&5
-$as_echo "$CCNOM" >&6; }
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-
-
-		if  test -z "${CCNAM}"; then :
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
-				CCNAM=unknown
-
-				echo
-				echo " *** unknow compiler. please file a bug "
-				echo
-
-fi
-
-
-
-
-
-
-TESTS_CFLAGS="-O0"
-DEBUG_CFLAGS="-g"
-
-DEFAULT_CFLAGS=""
-# WARN_CFLAGS="-Wall"
-
-#TODO use -fast for icc, -ipa for eko...
-if test "x$DBG" = "xyes" ; then
-	DEFAULT_CFLAGS="-O0 ${DEFAULT_CFLAGS} " #those are CXXFLAGS
-	DEBUG_CFLAGS="${DEBUG_CFLAGS} -DDEBUG -D_LB_DEBUG"
-else
-	DEFAULT_CFLAGS="-O2 ${DEFAULT_CFLAGS} "
-	DEBUG_CFLAGS="${DEBUG_CFLAGS} -DNDEBUG -U_LB_DEBUG"
-fi
-
-if test "x$PROF" = "xyes" ; then
-	DEFAULT_CFLAGS="${DEFAULT_CFLAGS} -pg"
-fi
-
-if test "x$WARN" = "xyes" -o "x$WARN" = "xfull" ; then
-	case x${CCNAM} in
-		xicc)
-		WARN_CFLAGS="${WARN_CFLAGS} -Wcheck"
-		# DEBUG_CFLAGS="-fast"
-			;;
-		xeko)
-			WARN_CFLAGS="${WARN_CFLAGS} -Wno-unused-parameter"
-			;;
-		xgcc|xclang)
-			WARN_CFLAGS="${WARN_CFLAGS} -Wextra -Wno-unused-parameter"
-			if test "x${WARN}" = "xfull" ; then
-				WARN_CFLAGS="${WARN_CFLAGS} -Wuninitialized -Wconversion -Wcast-qual -ansi -pedantic -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Wno-long-long"
-			fi
-		;;
-		*)
-			echo
-			echo "*******************************************************"
-			echo "unsupported compiler ($CCNAM). Please file a bug."
-			echo "*******************************************************"
-			echo
-			WARN_CFLAGS="${WARN_CFLAGS}"
-	esac
-fi
-
-
-DEFAULT_CFLAGS="${DEFAULT_CFLAGS} ${WARN_CFLAGS} ${DEBUG_CFLAGS}"
-TESTS_CFLAGS="${TESTS_CFLAGS} ${WARN_CFLAGS} ${DEBUG_CFLAGS}"
-
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
-$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
-if test -z "$CXXCPP"; then
-  if ${ac_cv_prog_CXXCPP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-      # Double quotes because CXXCPP needs to be expanded
-    for CXXCPP in "$CXX -E" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-  break
-fi
-
-    done
-    ac_cv_prog_CXXCPP=$CXXCPP
-
-fi
-  CXXCPP=$ac_cv_prog_CXXCPP
-else
-  ac_cv_prog_CXXCPP=$CXXCPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
-$as_echo "$CXXCPP" >&6; }
-ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if ${ac_cv_path_GREP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$GREP"; then
-  ac_path_GREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in grep ggrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-      as_fn_executable_p "$ac_path_GREP" || continue
-# Check for GNU ac_path_GREP and select it if it is found.
-  # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'GREP' >> "conftest.nl"
-    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_GREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_GREP="$ac_path_GREP"
-      ac_path_GREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_GREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_GREP"; then
-    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if ${ac_cv_path_EGREP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
-   then ac_cv_path_EGREP="$GREP -E"
-   else
-     if test -z "$EGREP"; then
-  ac_path_EGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in egrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-      as_fn_executable_p "$ac_path_EGREP" || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
-  # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'EGREP' >> "conftest.nl"
-    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_EGREP="$ac_path_EGREP"
-      ac_path_EGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_EGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_EGREP"; then
-    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_EGREP=$EGREP
-fi
-
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_cv_header_stdc=yes
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      return 2;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-case `pwd` in
-  *\ * | *\	*)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
-$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
-esac
-
-
-
-macro_version='2.4.2'
-macro_revision='1.3337'
-
-
-
-
-
-
-
-
-
-
-
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
-  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
-test "x$ac_build_alias" = x &&
-  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "x$host_alias" = x; then
-  ac_cv_host=$ac_cv_build
-else
-  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
-    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
-case $ac_cv_host in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
-esac
-host=$ac_cv_host
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_host
-shift
-host_cpu=$1
-host_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-host_os=$*
-IFS=$ac_save_IFS
-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
-
-
-# Backslashify metacharacters that are still active within
-# double-quoted strings.
-sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
-ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
-$as_echo_n "checking how to print strings... " >&6; }
-# Test print first, because it will be a builtin if present.
-if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
-   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='print -r --'
-elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='printf %s\n'
-else
-  # Use this function as a fallback that always works.
-  func_fallback_echo ()
-  {
-    eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
-  }
-  ECHO='func_fallback_echo'
-fi
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO ""
-}
-
-case "$ECHO" in
-  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
-$as_echo "printf" >&6; } ;;
-  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
-$as_echo "print -r" >&6; } ;;
-  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
-$as_echo "cat" >&6; } ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
-          if test -n "$ac_tool_prefix"; then
-    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="${ac_tool_prefix}cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  fi
-fi
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_CC="cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
-  fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl.exe
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$CC" && break
-  done
-fi
-if test -z "$CC"; then
-  ac_ct_CC=$CC
-  for ac_prog in cl.exe
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_CC" && break
-done
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-fi
-
-fi
-
-
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5; }
-
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
-  { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    sed '10a\
-... rest of stderr output deleted ...
-         10q' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-  fi
-  rm -f conftest.er1 conftest.err
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if ${ac_cv_c_compiler_gnu+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_compiler_gnu=yes
-else
-  ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
-  GCC=yes
-else
-  GCC=
-fi
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if ${ac_cv_prog_cc_g+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_save_c_werror_flag=$ac_c_werror_flag
-   ac_c_werror_flag=yes
-   ac_cv_prog_cc_g=no
-   CFLAGS="-g"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-else
-  CFLAGS=""
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  ac_c_werror_flag=$ac_save_c_werror_flag
-	 CFLAGS="-g"
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if ${ac_cv_prog_cc_c89+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdarg.h>
-#include <stdio.h>
-struct stat;
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
-     char **p;
-     int i;
-{
-  return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
-  char *s;
-  va_list v;
-  va_start (v,p);
-  s = g (p, va_arg (v,int));
-  va_end (v);
-  return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
-   function prototypes and stuff, but not '\xHH' hex character constants.
-   These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std is added to get
-   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
-   array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std.  */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
-   inside strings and character constants.  */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
-  ;
-  return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
-	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_c89=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
-  test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
-  x)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
-  xno)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
-  *)
-    CC="$CC $ac_cv_prog_cc_c89"
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
-
-fi
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
-$as_echo_n "checking for a sed that does not truncate output... " >&6; }
-if ${ac_cv_path_SED+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
-     for ac_i in 1 2 3 4 5 6 7; do
-       ac_script="$ac_script$as_nl$ac_script"
-     done
-     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
-     { ac_script=; unset ac_script;}
-     if test -z "$SED"; then
-  ac_path_SED_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
-      as_fn_executable_p "$ac_path_SED" || continue
-# Check for GNU ac_path_SED and select it if it is found.
-  # Check for GNU $ac_path_SED
-case `"$ac_path_SED" --version 2>&1` in
-*GNU*)
-  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo '' >> "conftest.nl"
-    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_SED_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_SED="$ac_path_SED"
-      ac_path_SED_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_SED_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_SED"; then
-    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
-  fi
-else
-  ac_cv_path_SED=$SED
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
-$as_echo "$ac_cv_path_SED" >&6; }
- SED="$ac_cv_path_SED"
-  rm -f conftest.sed
-
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
-$as_echo_n "checking for fgrep... " >&6; }
-if ${ac_cv_path_FGREP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
-   then ac_cv_path_FGREP="$GREP -F"
-   else
-     if test -z "$FGREP"; then
-  ac_path_FGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in fgrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
-      as_fn_executable_p "$ac_path_FGREP" || continue
-# Check for GNU ac_path_FGREP and select it if it is found.
-  # Check for GNU $ac_path_FGREP
-case `"$ac_path_FGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'FGREP' >> "conftest.nl"
-    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_FGREP="$ac_path_FGREP"
-      ac_path_FGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_FGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_FGREP"; then
-    as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_FGREP=$FGREP
-fi
-
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
-$as_echo "$ac_cv_path_FGREP" >&6; }
- FGREP="$ac_cv_path_FGREP"
-
-
-test -z "$GREP" && GREP=grep
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | ?:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if ${lt_cv_path_LD+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if ${lt_cv_prog_gnu_ld+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
-$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
-if ${lt_cv_path_NM+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  : ${lt_cv_path_NM=no}
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
-$as_echo "$lt_cv_path_NM" >&6; }
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
-else
-  # Didn't find any BSD compatible name lister, look for dumpbin.
-  if test -n "$DUMPBIN"; then :
-    # Let the user override the test.
-  else
-    if test -n "$ac_tool_prefix"; then
-  for ac_prog in dumpbin "link -dump"
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DUMPBIN+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DUMPBIN"; then
-  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DUMPBIN=$ac_cv_prog_DUMPBIN
-if test -n "$DUMPBIN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
-$as_echo "$DUMPBIN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$DUMPBIN" && break
-  done
-fi
-if test -z "$DUMPBIN"; then
-  ac_ct_DUMPBIN=$DUMPBIN
-  for ac_prog in dumpbin "link -dump"
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DUMPBIN"; then
-  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
-if test -n "$ac_ct_DUMPBIN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
-$as_echo "$ac_ct_DUMPBIN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_DUMPBIN" && break
-done
-
-  if test "x$ac_ct_DUMPBIN" = x; then
-    DUMPBIN=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DUMPBIN=$ac_ct_DUMPBIN
-  fi
-fi
-
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
-    *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
-      ;;
-    *)
-      DUMPBIN=:
-      ;;
-    esac
-  fi
-
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
-  fi
-fi
-test -z "$NM" && NM=nm
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
-$as_echo_n "checking the name lister ($NM) interface... " >&6; }
-if ${lt_cv_nm_interface+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_nm_interface="BSD nm"
-  echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
-  (eval "$ac_compile" 2>conftest.err)
-  cat conftest.err >&5
-  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
-  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
-  cat conftest.err >&5
-  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
-  cat conftest.out >&5
-  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
-    lt_cv_nm_interface="MS dumpbin"
-  fi
-  rm -f conftest*
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
-$as_echo "$lt_cv_nm_interface" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
-$as_echo_n "checking whether ln -s works... " >&6; }
-LN_S=$as_ln_s
-if test "$LN_S" = "ln -s"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
-$as_echo "no, using $LN_S" >&6; }
-fi
-
-# find the maximum length of command line arguments
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
-$as_echo_n "checking the maximum length of command line arguments... " >&6; }
-if ${lt_cv_sys_max_cmd_len+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-    i=0
-  teststring="ABCD"
-
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
-
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
-
-  cygwin* | mingw* | cegcc*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  mint*)
-    # On MiNT this can take a long time and run out of memory.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
-
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
-
-  os2*)
-    # The test takes a long time on OS/2.
-    lt_cv_sys_max_cmd_len=8192
-    ;;
-
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    else
-      # Make teststring a little bigger before we do anything with it.
-      # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
-        teststring=$teststring$teststring
-      done
-      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-      # If test is not a shell built-in, we'll probably end up computing a
-      # maximum length that is only half of the actual maximum length, but
-      # we can't tell.
-      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
-	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
-      do
-        i=`expr $i + 1`
-        teststring=$teststring$teststring
-      done
-      # Only check the string length outside the loop.
-      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
-      teststring=
-      # Add a significant safety factor because C++ compilers can tack on
-      # massive amounts of additional arguments before passing them to the
-      # linker.  It appears as though 1/2 is a usable value.
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    fi
-    ;;
-  esac
-
-fi
-
-if test -n $lt_cv_sys_max_cmd_len ; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
-$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
-$as_echo "none" >&6; }
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-
-
-
-
-
-
-: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
-$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,b/c, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
-$as_echo "$xsi_shell" >&6; }
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
-$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
-$as_echo "$lt_shell_append" >&6; }
-
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  lt_unset=unset
-else
-  lt_unset=false
-fi
-
-
-
-
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  lt_SP2NL='tr \040 \012'
-  lt_NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  lt_SP2NL='tr \100 \n'
-  lt_NL2SP='tr \r\n \100\100'
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
-$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
-if ${lt_cv_to_host_file_cmd+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $host in
-  *-*-mingw* )
-    case $build in
-      *-*-mingw* ) # actually msys
-        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
-        ;;
-      *-*-cygwin* )
-        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
-        ;;
-      * ) # otherwise, assume *nix
-        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
-        ;;
-    esac
-    ;;
-  *-*-cygwin* )
-    case $build in
-      *-*-mingw* ) # actually msys
-        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
-        ;;
-      *-*-cygwin* )
-        lt_cv_to_host_file_cmd=func_convert_file_noop
-        ;;
-      * ) # otherwise, assume *nix
-        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
-        ;;
-    esac
-    ;;
-  * ) # unhandled hosts (and "normal" native builds)
-    lt_cv_to_host_file_cmd=func_convert_file_noop
-    ;;
-esac
-
-fi
-
-to_host_file_cmd=$lt_cv_to_host_file_cmd
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
-$as_echo "$lt_cv_to_host_file_cmd" >&6; }
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
-$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
-if ${lt_cv_to_tool_file_cmd+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  #assume ordinary cross tools, or native build.
-lt_cv_to_tool_file_cmd=func_convert_file_noop
-case $host in
-  *-*-mingw* )
-    case $build in
-      *-*-mingw* ) # actually msys
-        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
-        ;;
-    esac
-    ;;
-esac
-
-fi
-
-to_tool_file_cmd=$lt_cv_to_tool_file_cmd
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
-$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
-$as_echo_n "checking for $LD option to reload object files... " >&6; }
-if ${lt_cv_ld_reload_flag+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_reload_flag='-r'
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
-$as_echo "$lt_cv_ld_reload_flag" >&6; }
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    if test "$GCC" != yes; then
-      reload_cmds=false
-    fi
-    ;;
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
-set dummy ${ac_tool_prefix}objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OBJDUMP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OBJDUMP"; then
-  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OBJDUMP=$ac_cv_prog_OBJDUMP
-if test -n "$OBJDUMP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
-$as_echo "$OBJDUMP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OBJDUMP"; then
-  ac_ct_OBJDUMP=$OBJDUMP
-  # Extract the first word of "objdump", so it can be a program name with args.
-set dummy objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OBJDUMP"; then
-  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_OBJDUMP="objdump"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
-if test -n "$ac_ct_OBJDUMP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
-$as_echo "$ac_ct_OBJDUMP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OBJDUMP" = x; then
-    OBJDUMP="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OBJDUMP=$ac_ct_OBJDUMP
-  fi
-else
-  OBJDUMP="$ac_cv_prog_OBJDUMP"
-fi
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
-$as_echo_n "checking how to recognize dependent libraries... " >&6; }
-if ${lt_cv_deplibs_check_method+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[4-9]*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[45]*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump',
-  # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
-    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-    lt_cv_file_magic_cmd='func_win32_libid'
-  else
-    # Keep this pattern in sync with the one in func_win32_libid.
-    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
-    lt_cv_file_magic_cmd='$OBJDUMP -f'
-  fi
-  ;;
-
-cegcc*)
-  # use the weaker test based on 'objdump'. See mingw*.
-  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
-
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-freebsd* | dragonfly*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
-
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-haiku*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
-
-interix[3-9]*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
-  fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-*nto* | *qnx*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-rdos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-tpf*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
-$as_echo "$lt_cv_deplibs_check_method" >&6; }
-
-file_magic_glob=
-want_nocaseglob=no
-if test "$build" = "$host"; then
-  case $host_os in
-  mingw* | pw32*)
-    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
-      want_nocaseglob=yes
-    else
-      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
-    fi
-    ;;
-  esac
-fi
-
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
-set dummy ${ac_tool_prefix}dlltool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DLLTOOL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DLLTOOL"; then
-  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DLLTOOL=$ac_cv_prog_DLLTOOL
-if test -n "$DLLTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
-$as_echo "$DLLTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_DLLTOOL"; then
-  ac_ct_DLLTOOL=$DLLTOOL
-  # Extract the first word of "dlltool", so it can be a program name with args.
-set dummy dlltool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DLLTOOL"; then
-  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
-if test -n "$ac_ct_DLLTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
-$as_echo "$ac_ct_DLLTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_DLLTOOL" = x; then
-    DLLTOOL="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DLLTOOL=$ac_ct_DLLTOOL
-  fi
-else
-  DLLTOOL="$ac_cv_prog_DLLTOOL"
-fi
-
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
-$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
-if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_sharedlib_from_linklib_cmd='unknown'
-
-case $host_os in
-cygwin* | mingw* | pw32* | cegcc*)
-  # two different shell functions defined in ltmain.sh
-  # decide which to use based on capabilities of $DLLTOOL
-  case `$DLLTOOL --help 2>&1` in
-  *--identify-strict*)
-    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
-    ;;
-  *)
-    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
-    ;;
-  esac
-  ;;
-*)
-  # fallback: assume linklib IS sharedlib
-  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
-  ;;
-esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
-$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
-sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
-test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  for ac_prog in ar
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AR+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$AR"; then
-  ac_cv_prog_AR="$AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-AR=$ac_cv_prog_AR
-if test -n "$AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
-$as_echo "$AR" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$AR" && break
-  done
-fi
-if test -z "$AR"; then
-  ac_ct_AR=$AR
-  for ac_prog in ar
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_AR+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_AR"; then
-  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_AR="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_AR=$ac_cv_prog_ac_ct_AR
-if test -n "$ac_ct_AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
-$as_echo "$ac_ct_AR" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_AR" && break
-done
-
-  if test "x$ac_ct_AR" = x; then
-    AR="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    AR=$ac_ct_AR
-  fi
-fi
-
-: ${AR=ar}
-: ${AR_FLAGS=cru}
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
-$as_echo_n "checking for archiver @FILE support... " >&6; }
-if ${lt_cv_ar_at_file+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ar_at_file=no
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  echo conftest.$ac_objext > conftest.lst
-      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
-      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
-  (eval $lt_ar_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-      if test "$ac_status" -eq 0; then
-	# Ensure the archiver fails upon bogus file names.
-	rm -f conftest.$ac_objext libconftest.a
-	{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
-  (eval $lt_ar_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-	if test "$ac_status" -ne 0; then
-          lt_cv_ar_at_file=@
-        fi
-      fi
-      rm -f conftest.* libconftest.a
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
-$as_echo "$lt_cv_ar_at_file" >&6; }
-
-if test "x$lt_cv_ar_at_file" = xno; then
-  archiver_list_spec=
-else
-  archiver_list_spec=$lt_cv_ar_at_file
-fi
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_STRIP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-test -z "$STRIP" && STRIP=:
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_RANLIB+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
-  ac_ct_RANLIB=$RANLIB
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_RANLIB"; then
-  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_RANLIB="ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_RANLIB" = x; then
-    RANLIB=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    RANLIB=$ac_ct_RANLIB
-  fi
-else
-  RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-test -z "$RANLIB" && RANLIB=:
-
-
-
-
-
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
-fi
-
-case $host_os in
-  darwin*)
-    lock_old_archive_extraction=yes ;;
-  *)
-    lock_old_archive_extraction=no ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
-$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
-if ${lt_cv_sys_global_symbol_pipe+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[BCDEGRST]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[BCDT]'
-  ;;
-cygwin* | mingw* | pw32* | cegcc*)
-  symcode='[ABCDGISTW]'
-  ;;
-hpux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[ABCDEGRST]'
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[BCDEGRST]'
-  ;;
-osf*)
-  symcode='[BCDEGQRST]'
-  ;;
-solaris*)
-  symcode='[BDRT]'
-  ;;
-sco3.2v5*)
-  symcode='[DT]'
-  ;;
-sysv4.2uw2*)
-  symcode='[DT]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[ABDT]'
-  ;;
-sysv4)
-  symcode='[DFNSTU]'
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[ABCDGIRSTW]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
-    # Also find C++ and __fastcall symbols from MSVC++,
-    # which start with @ or ?.
-    lt_cv_sys_global_symbol_pipe="$AWK '"\
-"     {last_section=section; section=\$ 3};"\
-"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
-"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-"     \$ 0!~/External *\|/{next};"\
-"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-"     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-"     ' prfx=^$ac_symprfx"
-  else
-    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-  fi
-  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
-  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
-	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<_LT_EOF > conftest.$ac_ext
-/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
-   relocations are performed -- see ld's documentation on pseudo-relocs.  */
-# define LT_DLSYM_CONST
-#elif defined(__osf__)
-/* This system does not cope well with relocations in const data.  */
-# define LT_DLSYM_CONST
-#else
-# define LT_DLSYM_CONST const
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
-	  cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols.  */
-LT_DLSYM_CONST struct {
-  const char *name;
-  void       *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[] =
-{
-  { "@PROGRAM@", (void *) 0 },
-_LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
-	  cat <<\_LT_EOF >> conftest.$ac_ext
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_globsym_save_LIBS=$LIBS
-	  lt_globsym_save_CFLAGS=$CFLAGS
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS=$lt_globsym_save_LIBS
-	  CFLAGS=$lt_globsym_save_CFLAGS
-	else
-	  echo "cannot find nm_test_func in $nlist" >&5
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&5
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
-    fi
-  else
-    echo "$progname: failed program was:" >&5
-    cat conftest.$ac_ext >&5
-  fi
-  rm -rf conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-
-fi
-
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
-$as_echo "failed" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
-$as_echo "ok" >&6; }
-fi
-
-# Response file support.
-if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-  nm_file_list_spec='@'
-elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
-  nm_file_list_spec='@'
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
-$as_echo_n "checking for sysroot... " >&6; }
-
-# Check whether --with-sysroot was given.
-if test "${with_sysroot+set}" = set; then :
-  withval=$with_sysroot;
-else
-  with_sysroot=no
-fi
-
-
-lt_sysroot=
-case ${with_sysroot} in #(
- yes)
-   if test "$GCC" = yes; then
-     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
-   fi
-   ;; #(
- /*)
-   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
-   ;; #(
- no|'')
-   ;; #(
- *)
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
-$as_echo "${with_sysroot}" >&6; }
-   as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
-   ;;
-esac
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
-$as_echo "${lt_sysroot:-no}" >&6; }
-
-
-
-
-
-
-# Check whether --enable-libtool-lock was given.
-if test "${enable_libtool_lock+set}" = set; then :
-  enableval=$enable_libtool_lock;
-fi
-
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.$ac_objext` in
-      *ELF-32*)
-	HPUX_IA64_MODE="32"
-	;;
-      *ELF-64*)
-	HPUX_IA64_MODE="64"
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -melf32bsmip"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -melf32bmipn32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -melf64bmip"
-	;;
-      esac
-    else
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -32"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -n32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -64"
-	  ;;
-      esac
-    fi
-  fi
-  rm -rf conftest*
-  ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.o` in
-      *32-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_i386_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_i386"
-	    ;;
-	  ppc64-*linux*|powerpc64-*linux*)
-	    LD="${LD-ld} -m elf32ppclinux"
-	    ;;
-	  s390x-*linux*)
-	    LD="${LD-ld} -m elf_s390"
-	    ;;
-	  sparc64-*linux*)
-	    LD="${LD-ld} -m elf32_sparc"
-	    ;;
-	esac
-	;;
-      *64-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_x86_64_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_x86_64"
-	    ;;
-	  ppc*-*linux*|powerpc*-*linux*)
-	    LD="${LD-ld} -m elf64ppc"
-	    ;;
-	  s390*-*linux*|s390*-*tpf*)
-	    LD="${LD-ld} -m elf64_s390"
-	    ;;
-	  sparc*-*linux*)
-	    LD="${LD-ld} -m elf64_sparc"
-	    ;;
-	esac
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
-$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
-if ${lt_cv_cc_needs_belf+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_cc_needs_belf=yes
-else
-  lt_cv_cc_needs_belf=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-     ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
-$as_echo "$lt_cv_cc_needs_belf" >&6; }
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*)
-        case $host in
-        i?86-*-solaris*)
-          LD="${LD-ld} -m elf_x86_64"
-          ;;
-        sparc*-*-solaris*)
-          LD="${LD-ld} -m elf64_sparc"
-          ;;
-        esac
-        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
-        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
-          LD="${LD-ld}_sol2"
-        fi
-        ;;
-      *)
-	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
-	  LD="${LD-ld} -64"
-	fi
-	;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-esac
-
-need_locks="$enable_libtool_lock"
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
-set dummy ${ac_tool_prefix}mt; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$MANIFEST_TOOL"; then
-  ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
-if test -n "$MANIFEST_TOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
-$as_echo "$MANIFEST_TOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
-  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
-  # Extract the first word of "mt", so it can be a program name with args.
-set dummy mt; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_MANIFEST_TOOL"; then
-  ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
-if test -n "$ac_ct_MANIFEST_TOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
-$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_MANIFEST_TOOL" = x; then
-    MANIFEST_TOOL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
-  fi
-else
-  MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
-fi
-
-test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
-$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
-if ${lt_cv_path_mainfest_tool+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_path_mainfest_tool=no
-  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
-  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
-  cat conftest.err >&5
-  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
-    lt_cv_path_mainfest_tool=yes
-  fi
-  rm -f conftest*
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
-$as_echo "$lt_cv_path_mainfest_tool" >&6; }
-if test "x$lt_cv_path_mainfest_tool" != xyes; then
-  MANIFEST_TOOL=:
-fi
-
-
-
-
-
-
-  case $host_os in
-    rhapsody* | darwin*)
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
-set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DSYMUTIL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DSYMUTIL"; then
-  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DSYMUTIL=$ac_cv_prog_DSYMUTIL
-if test -n "$DSYMUTIL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
-$as_echo "$DSYMUTIL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_DSYMUTIL"; then
-  ac_ct_DSYMUTIL=$DSYMUTIL
-  # Extract the first word of "dsymutil", so it can be a program name with args.
-set dummy dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DSYMUTIL"; then
-  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
-if test -n "$ac_ct_DSYMUTIL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
-$as_echo "$ac_ct_DSYMUTIL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_DSYMUTIL" = x; then
-    DSYMUTIL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DSYMUTIL=$ac_ct_DSYMUTIL
-  fi
-else
-  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
-set dummy ${ac_tool_prefix}nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_NMEDIT+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$NMEDIT"; then
-  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-NMEDIT=$ac_cv_prog_NMEDIT
-if test -n "$NMEDIT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
-$as_echo "$NMEDIT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_NMEDIT"; then
-  ac_ct_NMEDIT=$NMEDIT
-  # Extract the first word of "nmedit", so it can be a program name with args.
-set dummy nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_NMEDIT"; then
-  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_NMEDIT="nmedit"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
-if test -n "$ac_ct_NMEDIT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
-$as_echo "$ac_ct_NMEDIT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_NMEDIT" = x; then
-    NMEDIT=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    NMEDIT=$ac_ct_NMEDIT
-  fi
-else
-  NMEDIT="$ac_cv_prog_NMEDIT"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
-set dummy ${ac_tool_prefix}lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_LIPO+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$LIPO"; then
-  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-LIPO=$ac_cv_prog_LIPO
-if test -n "$LIPO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
-$as_echo "$LIPO" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_LIPO"; then
-  ac_ct_LIPO=$LIPO
-  # Extract the first word of "lipo", so it can be a program name with args.
-set dummy lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_LIPO"; then
-  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_LIPO="lipo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
-if test -n "$ac_ct_LIPO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
-$as_echo "$ac_ct_LIPO" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_LIPO" = x; then
-    LIPO=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    LIPO=$ac_ct_LIPO
-  fi
-else
-  LIPO="$ac_cv_prog_LIPO"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OTOOL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OTOOL"; then
-  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL=$ac_cv_prog_OTOOL
-if test -n "$OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
-$as_echo "$OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL"; then
-  ac_ct_OTOOL=$OTOOL
-  # Extract the first word of "otool", so it can be a program name with args.
-set dummy otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OTOOL"; then
-  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_OTOOL="otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
-if test -n "$ac_ct_OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
-$as_echo "$ac_ct_OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OTOOL" = x; then
-    OTOOL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OTOOL=$ac_ct_OTOOL
-  fi
-else
-  OTOOL="$ac_cv_prog_OTOOL"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OTOOL64+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OTOOL64"; then
-  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL64=$ac_cv_prog_OTOOL64
-if test -n "$OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
-$as_echo "$OTOOL64" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL64"; then
-  ac_ct_OTOOL64=$OTOOL64
-  # Extract the first word of "otool64", so it can be a program name with args.
-set dummy otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OTOOL64"; then
-  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_OTOOL64="otool64"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
-if test -n "$ac_ct_OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
-$as_echo "$ac_ct_OTOOL64" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OTOOL64" = x; then
-    OTOOL64=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OTOOL64=$ac_ct_OTOOL64
-  fi
-else
-  OTOOL64="$ac_cv_prog_OTOOL64"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
-$as_echo_n "checking for -single_module linker flag... " >&6; }
-if ${lt_cv_apple_cc_single_mod+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
-	# By default we will add the -single_module flag. You can override
-	# by either setting the environment variable LT_MULTI_MODULE
-	# non-empty at configure time, or by adding -multi_module to the
-	# link flags.
-	rm -rf libconftest.dylib*
-	echo "int foo(void){return 1;}" > conftest.c
-	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&5
-	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
-        _lt_result=$?
-	# If there is a non-empty error log, and "single_module"
-	# appears in it, assume the flag caused a linker warning
-        if test -s conftest.err && $GREP single_module conftest.err; then
-	  cat conftest.err >&5
-	# Otherwise, if the output was created with a 0 exit code from
-	# the compiler, it worked.
-	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
-	  lt_cv_apple_cc_single_mod=yes
-	else
-	  cat conftest.err >&5
-	fi
-	rm -rf libconftest.dylib*
-	rm -f conftest.*
-      fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
-$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
-$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
-if ${lt_cv_ld_exported_symbols_list+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_exported_symbols_list=no
-      save_LDFLAGS=$LDFLAGS
-      echo "_main" > conftest.sym
-      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_ld_exported_symbols_list=yes
-else
-  lt_cv_ld_exported_symbols_list=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-	LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
-$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
-$as_echo_n "checking for -force_load linker flag... " >&6; }
-if ${lt_cv_ld_force_load+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_force_load=no
-      cat > conftest.c << _LT_EOF
-int forced_loaded() { return 2;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
-      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
-      echo "$AR cru libconftest.a conftest.o" >&5
-      $AR cru libconftest.a conftest.o 2>&5
-      echo "$RANLIB libconftest.a" >&5
-      $RANLIB libconftest.a 2>&5
-      cat > conftest.c << _LT_EOF
-int main() { return 0;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
-      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
-      _lt_result=$?
-      if test -s conftest.err && $GREP force_load conftest.err; then
-	cat conftest.err >&5
-      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
-	lt_cv_ld_force_load=yes
-      else
-	cat conftest.err >&5
-      fi
-        rm -f conftest.err libconftest.a conftest conftest.c
-        rm -rf conftest.dSYM
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
-$as_echo "$lt_cv_ld_force_load" >&6; }
-    case $host_os in
-    rhapsody* | darwin1.[012])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-    darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-    darwin*) # darwin 5.x on
-      # if running on 10.5 or later, the deployment target defaults
-      # to the OS version, if on x86, and 10.4, the deployment
-      # target defaults to 10.4. Don't you love it?
-      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[012]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-      esac
-    ;;
-  esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-      _lt_dar_single_mod='$single_module'
-    fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-    else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
-      _lt_dsymutil='~$DSYMUTIL $lib || :'
-    else
-      _lt_dsymutil=
-    fi
-    ;;
-  esac
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
-		  inttypes.h stdint.h unistd.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in dlfcn.h
-do :
-  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
-"
-if test "x$ac_cv_header_dlfcn_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DLFCN_H 1
-_ACEOF
-
-fi
-
-done
-
-
-
-func_stripname_cnf ()
-{
-  case ${2} in
-  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
-  esac
-} # func_stripname_cnf
-
-
-
-
-
-# Set options
-
-
-
-        enable_dlopen=no
-
-
-  enable_win32_dll=no
-
-
-            # Check whether --enable-shared was given.
-if test "${enable_shared+set}" = set; then :
-  enableval=$enable_shared; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_shared=yes
-fi
-
-
-
-
-
-
-
-
-
-  # Check whether --enable-static was given.
-if test "${enable_static+set}" = set; then :
-  enableval=$enable_static; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_static=yes
-fi
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-pic was given.
-if test "${with_pic+set}" = set; then :
-  withval=$with_pic; lt_p=${PACKAGE-default}
-    case $withval in
-    yes|no) pic_mode=$withval ;;
-    *)
-      pic_mode=default
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for lt_pkg in $withval; do
-	IFS="$lt_save_ifs"
-	if test "X$lt_pkg" = "X$lt_p"; then
-	  pic_mode=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  pic_mode=default
-fi
-
-
-test -z "$pic_mode" && pic_mode=default
-
-
-
-
-
-
-
-  # Check whether --enable-fast-install was given.
-if test "${enable_fast_install+set}" = set; then :
-  enableval=$enable_fast_install; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_fast_install=yes
-fi
-
-
-
-
-
-
-
-
-
-
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-test -z "$LN_S" && LN_S="ln -s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
-$as_echo_n "checking for objdir... " >&6; }
-if ${lt_cv_objdir+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
-$as_echo "$lt_cv_objdir" >&6; }
-objdir=$lt_cv_objdir
-
-
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define LT_OBJDIR "$lt_cv_objdir/"
-_ACEOF
-
-
-
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
-$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
-if ${lt_cv_path_MAGIC_CMD+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/${ac_tool_prefix}file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool at gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-
-
-
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
-$as_echo_n "checking for file... " >&6; }
-if ${lt_cv_path_MAGIC_CMD+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool at gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  else
-    MAGIC_CMD=:
-  fi
-fi
-
-  fi
-  ;;
-esac
-
-# Use C for the default configuration in the libtool script
-
-lt_save_CC="$CC"
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-objext=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-
-lt_prog_compiler_no_builtin_flag=
-
-if test "$GCC" = yes; then
-  case $cc_basename in
-  nvcc*)
-    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
-  *)
-    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
-  esac
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
-if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_rtti_exceptions=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="-fno-rtti -fno-exceptions"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_rtti_exceptions=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
-$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
-
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
-    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
-else
-    :
-fi
-
-fi
-
-
-
-
-
-
-  lt_prog_compiler_wl=
-lt_prog_compiler_pic=
-lt_prog_compiler_static=
-
-
-  if test "$GCC" = yes; then
-    lt_prog_compiler_wl='-Wl,'
-    lt_prog_compiler_static='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            lt_prog_compiler_pic='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic='-fno-common'
-      ;;
-
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      lt_prog_compiler_static=
-      ;;
-
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='-fPIC'
-	;;
-      esac
-      ;;
-
-    interix[3-9]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      lt_prog_compiler_can_build_shared=no
-      enable_shared=no
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic='-fPIC -shared'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic=-Kconform_pic
-      fi
-      ;;
-
-    *)
-      lt_prog_compiler_pic='-fPIC'
-      ;;
-    esac
-
-    case $cc_basename in
-    nvcc*) # Cuda Compiler Driver 2.2
-      lt_prog_compiler_wl='-Xlinker '
-      if test -n "$lt_prog_compiler_pic"; then
-        lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
-      fi
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      lt_prog_compiler_wl='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      else
-	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC (with -KPIC) is the default.
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
-      case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
-      ecc*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-KPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      # icc used to be incompatible with GCC.
-      # ICC 10 doesn't accept -KPIC any more.
-      icc* | ifort*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      # Lahey Fortran 8.1.
-      lf95*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='--shared'
-	lt_prog_compiler_static='--static'
-	;;
-      nagfor*)
-	# NAG Fortran compiler
-	lt_prog_compiler_wl='-Wl,-Wl,,'
-	lt_prog_compiler_pic='-PIC'
-	lt_prog_compiler_static='-Bstatic'
-	;;
-      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fpic'
-	lt_prog_compiler_static='-Bstatic'
-        ;;
-      ccc*)
-        lt_prog_compiler_wl='-Wl,'
-        # All Alpha code is PIC.
-        lt_prog_compiler_static='-non_shared'
-        ;;
-      xl* | bgxl* | bgf* | mpixl*)
-	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-qpic'
-	lt_prog_compiler_static='-qstaticlink'
-	;;
-      *)
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
-	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl=''
-	  ;;
-	*Sun\ F* | *Sun*Fortran*)
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl='-Qoption ld '
-	  ;;
-	*Sun\ C*)
-	  # Sun C 5.9
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl='-Wl,'
-	  ;;
-        *Intel*\ [CF]*Compiler*)
-	  lt_prog_compiler_wl='-Wl,'
-	  lt_prog_compiler_pic='-fPIC'
-	  lt_prog_compiler_static='-static'
-	  ;;
-	*Portland\ Group*)
-	  lt_prog_compiler_wl='-Wl,'
-	  lt_prog_compiler_pic='-fpic'
-	  lt_prog_compiler_static='-Bstatic'
-	  ;;
-	esac
-	;;
-      esac
-      ;;
-
-    newsos6)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic='-fPIC -shared'
-      ;;
-
-    osf3* | osf4* | osf5*)
-      lt_prog_compiler_wl='-Wl,'
-      # All OSF/1 code is PIC.
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    rdos*)
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    solaris*)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
-	lt_prog_compiler_wl='-Qoption ld ';;
-      *)
-	lt_prog_compiler_wl='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      lt_prog_compiler_wl='-Qoption ld '
-      lt_prog_compiler_pic='-PIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	lt_prog_compiler_pic='-Kconform_pic'
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    unicos*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_can_build_shared=no
-      ;;
-
-    uts4*)
-      lt_prog_compiler_pic='-pic'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    *)
-      lt_prog_compiler_can_build_shared=no
-      ;;
-    esac
-  fi
-
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic=
-    ;;
-  *)
-    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
-    ;;
-esac
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-if ${lt_cv_prog_compiler_pic+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
-$as_echo "$lt_cv_prog_compiler_pic" >&6; }
-lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
-if ${lt_cv_prog_compiler_pic_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_pic_works=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_pic_works=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
-    case $lt_prog_compiler_pic in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
-     esac
-else
-    lt_prog_compiler_pic=
-     lt_prog_compiler_can_build_shared=no
-fi
-
-fi
-
-
-
-
-
-
-
-
-
-
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if ${lt_cv_prog_compiler_static_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_static_works=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler_static_works=yes
-       fi
-     else
-       lt_cv_prog_compiler_static_works=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
-$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_static_works" = xyes; then
-    :
-else
-    lt_prog_compiler_static=
-fi
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-
-  runpath_var=
-  allow_undefined_flag=
-  always_export_symbols=no
-  archive_cmds=
-  archive_expsym_cmds=
-  compiler_needs_object=no
-  enable_shared_with_static_runtimes=no
-  export_dynamic_flag_spec=
-  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  hardcode_automatic=no
-  hardcode_direct=no
-  hardcode_direct_absolute=no
-  hardcode_libdir_flag_spec=
-  hardcode_libdir_separator=
-  hardcode_minus_L=no
-  hardcode_shlibpath_var=unsupported
-  inherit_rpath=no
-  link_all_deplibs=unknown
-  module_cmds=
-  module_expsym_cmds=
-  old_archive_from_new_cmds=
-  old_archive_from_expsyms_cmds=
-  thread_safe_flag_spec=
-  whole_archive_flag_spec=
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  include_expsyms=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  # Exclude shared library initialization/finalization symbols.
-  extract_expsyms_cmds=
-
-  case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  esac
-
-  ld_shlibs=yes
-
-  # On some targets, GNU ld is compatible enough with the native linker
-  # that we're better off using the native interface for both.
-  lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
-    case $host_os in
-      aix*)
-	# The AIX port of GNU ld has always aspired to compatibility
-	# with the native linker.  However, as the warning in the GNU ld
-	# block says, versions before 2.19.5* couldn't really create working
-	# shared libraries, regardless of the interface used.
-	case `$LD -v 2>&1` in
-	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
-	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
-	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
-	  *)
-	    lt_use_gnu_ld_interface=yes
-	    ;;
-	esac
-	;;
-      *)
-	lt_use_gnu_ld_interface=yes
-	;;
-    esac
-  fi
-
-  if test "$lt_use_gnu_ld_interface" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-    export_dynamic_flag_spec='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      whole_archive_flag_spec=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>&1` in
-      *GNU\ gold*) supports_anon_versioning=yes ;;
-      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[3-9]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.19, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to install binutils
-*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
-*** You will then need to restart the configuration process.
-
-_LT_EOF
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds=''
-        ;;
-      m68k)
-            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_minus_L=yes
-        ;;
-      esac
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	allow_undefined_flag=unsupported
-	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
-      # as there is no search path for DLLs.
-      hardcode_libdir_flag_spec='-L$libdir'
-      export_dynamic_flag_spec='${wl}--export-all-symbols'
-      allow_undefined_flag=unsupported
-      always_export_symbols=no
-      enable_shared_with_static_runtimes=yes
-      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
-      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
-
-      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    haiku*)
-      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      link_all_deplibs=yes
-      ;;
-
-    interix[3-9]*)
-      hardcode_direct=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
-	case $cc_basename in
-	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
-	esac
-      fi
-      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
-      then
-	tmp_addflag=' $pic_flag'
-	tmp_sharedflag='-shared'
-	case $cc_basename,$host_cpu in
-        pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95* | pgfortran*)
-					# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	lf95*)				# Lahey Fortran 8.1
-	  whole_archive_flag_spec=
-	  tmp_sharedflag='--shared' ;;
-	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
-	  tmp_sharedflag='-qmkshrobj'
-	  tmp_addflag= ;;
-	nvcc*)	# Cuda Compiler Driver 2.2
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object=yes
-	  ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object=yes
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	esac
-	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-        if test "x$supports_anon_versioning" = xyes; then
-          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-        fi
-
-	case $cc_basename in
-	xlf* | bgf* | bgxlf* | mpixlf*)
-	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
-	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
-	  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
-	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
-	  fi
-	  ;;
-	esac
-      else
-        ld_shlibs=no
-      fi
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  # For security reasons, it is highly recommended that you always
-	  # use absolute paths for naming shared libraries, and exclude the
-	  # DT_RUNPATH tag from executables and libraries.  But doing so
-	  # requires that you compile everything twice, which is a pain.
-	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  else
-	    ld_shlibs=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-    esac
-
-    if test "$ld_shlibs" = no; then
-      runpath_var=
-      hardcode_libdir_flag_spec=
-      export_dynamic_flag_spec=
-      whole_archive_flag_spec=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      allow_undefined_flag=unsupported
-      always_export_symbols=yes
-      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      hardcode_minus_L=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	hardcode_direct=unsupported
-      fi
-      ;;
-
-    aix[4-9]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
-	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	else
-	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
-	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-	    aix_use_runtimelinking=yes
-	    break
-	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      archive_cmds=''
-      hardcode_direct=yes
-      hardcode_direct_absolute=yes
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      file_list_spec='${wl}-f,'
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[012]|aix4.[012].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	  # We have reworked collect2
-	  :
-	  else
-	  # We have old collect2
-	  hardcode_direct=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  hardcode_minus_L=yes
-	  hardcode_libdir_flag_spec='-L$libdir'
-	  hardcode_libdir_separator=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      export_dynamic_flag_spec='${wl}-bexpall'
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      always_export_symbols=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	allow_undefined_flag='-berok'
-        # Determine the default libpath from the value encoded in an
-        # empty executable.
-        if test "${lt_cv_aix_libpath+set}" = set; then
-  aix_libpath=$lt_cv_aix_libpath
-else
-  if ${lt_cv_aix_libpath_+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-  lt_aix_libpath_sed='
-      /Import File Strings/,/^$/ {
-	  /^0/ {
-	      s/^0  *\([^ ]*\) *$/\1/
-	      p
-	  }
-      }'
-  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  # Check for a 64-bit object if we didn't find anything.
-  if test -z "$lt_cv_aix_libpath_"; then
-    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  if test -z "$lt_cv_aix_libpath_"; then
-    lt_cv_aix_libpath_="/usr/lib:/lib"
-  fi
-
-fi
-
-  aix_libpath=$lt_cv_aix_libpath_
-fi
-
-        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-      else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
-	  allow_undefined_flag="-z nodefs"
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an
-	 # empty executable.
-	 if test "${lt_cv_aix_libpath+set}" = set; then
-  aix_libpath=$lt_cv_aix_libpath
-else
-  if ${lt_cv_aix_libpath_+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-  lt_aix_libpath_sed='
-      /Import File Strings/,/^$/ {
-	  /^0/ {
-	      s/^0  *\([^ ]*\) *$/\1/
-	      p
-	  }
-      }'
-  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  # Check for a 64-bit object if we didn't find anything.
-  if test -z "$lt_cv_aix_libpath_"; then
-    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  if test -z "$lt_cv_aix_libpath_"; then
-    lt_cv_aix_libpath_="/usr/lib:/lib"
-  fi
-
-fi
-
-  aix_libpath=$lt_cv_aix_libpath_
-fi
-
-	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag=' ${wl}-bernotok'
-	  allow_undefined_flag=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
-	    # We only use this code for GNU lds that support --whole-archive.
-	    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	  else
-	    # Exported symbols can be pulled into shared objects from archives
-	    whole_archive_flag_spec='$convenience'
-	  fi
-	  archive_cmds_need_lc=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds=''
-        ;;
-      m68k)
-            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_minus_L=yes
-        ;;
-      esac
-      ;;
-
-    bsdi[45]*)
-      export_dynamic_flag_spec=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      case $cc_basename in
-      cl*)
-	# Native MSVC
-	hardcode_libdir_flag_spec=' '
-	allow_undefined_flag=unsupported
-	always_export_symbols=yes
-	file_list_spec='@'
-	# Tell ltmain to make .lib files, not .a files.
-	libext=lib
-	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
-	# FIXME: Setting linknames here is a bad hack.
-	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	  else
-	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	  fi~
-	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	  linknames='
-	# The linker will not automatically build a static lib if we build a DLL.
-	# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
-	enable_shared_with_static_runtimes=yes
-	exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
-	export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
-	# Don't use ranlib
-	old_postinstall_cmds='chmod 644 $oldlib'
-	postlink_cmds='lt_outputfile="@OUTPUT@"~
-	  lt_tool_outputfile="@TOOL_OUTPUT@"~
-	  case $lt_outputfile in
-	    *.exe|*.EXE) ;;
-	    *)
-	      lt_outputfile="$lt_outputfile.exe"
-	      lt_tool_outputfile="$lt_tool_outputfile.exe"
-	      ;;
-	  esac~
-	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	    $RM "$lt_outputfile.manifest";
-	  fi'
-	;;
-      *)
-	# Assume MSVC wrapper
-	hardcode_libdir_flag_spec=' '
-	allow_undefined_flag=unsupported
-	# Tell ltmain to make .lib files, not .a files.
-	libext=lib
-	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
-	# FIXME: Setting linknames here is a bad hack.
-	archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
-	# The linker will automatically build a .lib file if we build a DLL.
-	old_archive_from_new_cmds='true'
-	# FIXME: Should let the user specify the lib program.
-	old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
-	enable_shared_with_static_runtimes=yes
-	;;
-      esac
-      ;;
-
-    darwin* | rhapsody*)
-
-
-  archive_cmds_need_lc=no
-  hardcode_direct=no
-  hardcode_automatic=yes
-  hardcode_shlibpath_var=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-
-  else
-    whole_archive_flag_spec=''
-  fi
-  link_all_deplibs=yes
-  allow_undefined_flag="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=func_echo_all
-    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-
-  else
-  ld_shlibs=no
-  fi
-
-      ;;
-
-    dgux*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2.*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_direct=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      hardcode_minus_L=yes
-      export_dynamic_flag_spec='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator=:
-	hardcode_direct=yes
-	hardcode_direct_absolute=yes
-	export_dynamic_flag_spec='${wl}-E'
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	hardcode_minus_L=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-
-	  # Older versions of the 11.00 compiler do not understand -b yet
-	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
-$as_echo_n "checking if $CC understands -b... " >&6; }
-if ${lt_cv_prog_compiler__b+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler__b=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS -b"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler__b=yes
-       fi
-     else
-       lt_cv_prog_compiler__b=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
-$as_echo "$lt_cv_prog_compiler__b" >&6; }
-
-if test x"$lt_cv_prog_compiler__b" = xyes; then
-    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-else
-    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-fi
-
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  hardcode_direct=no
-	  hardcode_shlibpath_var=no
-	  ;;
-	*)
-	  hardcode_direct=yes
-	  hardcode_direct_absolute=yes
-	  export_dynamic_flag_spec='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  hardcode_minus_L=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	# Try to use the -exported_symbol ld option, if it does not
-	# work, assume that -exports_file does not work either and
-	# implicitly export all symbols.
-	# This should be the same for all languages, so no per-tag cache variable.
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
-$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
-if ${lt_cv_irix_exported_symbol+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  save_LDFLAGS="$LDFLAGS"
-	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-int foo (void) { return 0; }
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_irix_exported_symbol=yes
-else
-  lt_cv_irix_exported_symbol=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-           LDFLAGS="$save_LDFLAGS"
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
-$as_echo "$lt_cv_irix_exported_symbol" >&6; }
-	if test "$lt_cv_irix_exported_symbol" = yes; then
-          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-	fi
-      else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      inherit_rpath=yes
-      link_all_deplibs=yes
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    newsos6)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_shlibpath_var=no
-      ;;
-
-    *nto* | *qnx*)
-      ;;
-
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	hardcode_direct=yes
-	hardcode_shlibpath_var=no
-	hardcode_direct_absolute=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	  export_dynamic_flag_spec='${wl}-E'
-	else
-	  case $host_os in
-	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     hardcode_libdir_flag_spec='-R$libdir'
-	     ;;
-	   *)
-	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-	fi
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    os2*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_minus_L=yes
-      allow_undefined_flag=unsupported
-      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	hardcode_libdir_flag_spec='-rpath $libdir'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_separator=:
-      ;;
-
-    solaris*)
-      no_undefined_flag=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-      else
-	case `$CC -V 2>&1` in
-	*"Compilers 5.0"*)
-	  wlarc=''
-	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
-	  ;;
-	*)
-	  wlarc='${wl}'
-	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-	  ;;
-	esac
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_shlibpath_var=no
-      case $host_os in
-      solaris2.[0-5] | solaris2.[0-5].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
-	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      link_all_deplibs=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  reload_cmds='$CC -r -o $output$reload_objs'
-	  hardcode_direct=no
-        ;;
-	motorola)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      hardcode_shlibpath_var=no
-      ;;
-
-    sysv4.3*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_shlibpath_var=no
-      export_dynamic_flag_spec='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	hardcode_shlibpath_var=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	ld_shlibs=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag='${wl}-z,text'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      no_undefined_flag='${wl}-z,text'
-      allow_undefined_flag='${wl}-z,nodefs'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-R,$libdir'
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      export_dynamic_flag_spec='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
-
-    *)
-      ld_shlibs=no
-      ;;
-    esac
-
-    if test x$host_vendor = xsni; then
-      case $host in
-      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	export_dynamic_flag_spec='${wl}-Blargedynsym'
-	;;
-      esac
-    fi
-  fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
-$as_echo "$ld_shlibs" >&6; }
-test "$ld_shlibs" = no && can_build_shared=no
-
-with_gnu_ld=$with_gnu_ld
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-if ${lt_cv_archive_cmds_need_lc+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  $RM conftest*
-	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } 2>conftest.err; then
-	  soname=conftest
-	  lib=conftest
-	  libobjs=conftest.$ac_objext
-	  deplibs=
-	  wl=$lt_prog_compiler_wl
-	  pic_flag=$lt_prog_compiler_pic
-	  compiler_flags=-v
-	  linker_flags=-v
-	  verstring=
-	  output_objdir=.
-	  libname=conftest
-	  lt_save_allow_undefined_flag=$allow_undefined_flag
-	  allow_undefined_flag=
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
-  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-	  then
-	    lt_cv_archive_cmds_need_lc=no
-	  else
-	    lt_cv_archive_cmds_need_lc=yes
-	  fi
-	  allow_undefined_flag=$lt_save_allow_undefined_flag
-	else
-	  cat conftest.err 1>&5
-	fi
-	$RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
-$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
-      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
-
-if test "$GCC" = yes; then
-  case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
-  esac
-  case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
-  esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
-  case $lt_search_path_spec in
-  *\;*)
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
-    ;;
-  *)
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
-    ;;
-  esac
-  # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
-  lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
-  for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
-      test -d "$lt_sys_path" && \
-	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
-    fi
-  done
-  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
-  for (lt_i = NF; lt_i > 0; lt_i--) {
-    if ($lt_i != "" && $lt_i != ".") {
-      if ($lt_i == "..") {
-        lt_count++;
-      } else {
-        if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
-        } else {
-          lt_count--;
-        }
-      }
-    }
-  }
-  if (lt_foo != "") { lt_freq[lt_foo]++; }
-  if (lt_freq[lt_foo] == 1) { print lt_foo; }
-}'`
-  # AWK program above erroneously prepends '/' to C:/dos/paths
-  # for these hosts.
-  case $host_os in
-    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
-  esac
-  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[4-9]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[45]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$cc_basename in
-  yes,*)
-    # gcc
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-
-      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    dynamic_linker='Win32 ld.exe'
-    ;;
-
-  *,cl*)
-    # Native MSVC
-    libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
-
-    case $build_os in
-    mingw*)
-      sys_lib_search_path_spec=
-      lt_save_ifs=$IFS
-      IFS=';'
-      for lt_path in $LIB
-      do
-        IFS=$lt_save_ifs
-        # Let DOS variable expansion print the short 8.3 style file name.
-        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
-        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
-      done
-      IFS=$lt_save_ifs
-      # Convert to MSYS style.
-      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
-      ;;
-    cygwin*)
-      # Convert to unix form, then to dos form, then back to unix form
-      # but this time dos style (no spaces!) so that the unix form looks
-      # like /cygdrive/c/PROGRA~1:/cygdr...
-      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
-      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
-      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
-      ;;
-    *)
-      sys_lib_search_path_spec="$LIB"
-      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
-        # It is most probably a Windows format PATH.
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      # FIXME: find the short name or the path components, as spaces are
-      # common. (e.g. "Program Files" -> "PROGRA~1")
-      ;;
-    esac
-
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-    dynamic_linker='Win32 link.exe'
-    ;;
-
-  *)
-    # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    dynamic_linker='Win32 ld.exe'
-    ;;
-  esac
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-
-  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[23].*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  # Handle Gentoo/FreeBSD as it was Linux
-  case $host_vendor in
-    gentoo)
-      version_type=linux ;;
-    *)
-      version_type=freebsd-$objformat ;;
-  esac
-
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-    linux)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-      soname_spec='${libname}${release}${shared_ext}$major'
-      need_lib_prefix=no
-      need_version=no
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2.*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-haiku*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
-  postinstall_cmds='chmod 555 $lib'
-  # or fails outright, so override atomically:
-  install_override_mode=555
-  ;;
-
-interix[3-9]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux # correct to gnu/linux during the next big refactor
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-
-  # Some binutils ld are patched to set DT_RUNPATH
-  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_shlibpath_overrides_runpath=no
-    save_LDFLAGS=$LDFLAGS
-    save_libdir=$libdir
-    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
-	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
-  lt_cv_shlibpath_overrides_runpath=yes
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-    LDFLAGS=$save_LDFLAGS
-    libdir=$save_libdir
-
-fi
-
-  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
-hardcode_action=
-if test -n "$hardcode_libdir_flag_spec" ||
-   test -n "$runpath_var" ||
-   test "X$hardcode_automatic" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$hardcode_direct" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
-     test "$hardcode_minus_L" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action=unsupported
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
-$as_echo "$hardcode_action" >&6; }
-
-if test "$hardcode_action" = relink ||
-   test "$inherit_rpath" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-
-
-
-
-
-
-  if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-    ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-    ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if ${ac_cv_lib_dl_dlopen+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-
-fi
-
-    ;;
-
-  *)
-    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
-if test "x$ac_cv_func_shl_load" = xyes; then :
-  lt_cv_dlopen="shl_load"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
-$as_echo_n "checking for shl_load in -ldld... " >&6; }
-if ${ac_cv_lib_dld_shl_load+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char shl_load ();
-int
-main ()
-{
-return shl_load ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dld_shl_load=yes
-else
-  ac_cv_lib_dld_shl_load=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
-$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
-if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
-  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
-else
-  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
-if test "x$ac_cv_func_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if ${ac_cv_lib_dl_dlopen+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
-$as_echo_n "checking for dlopen in -lsvld... " >&6; }
-if ${ac_cv_lib_svld_dlopen+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsvld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_svld_dlopen=yes
-else
-  ac_cv_lib_svld_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
-$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
-if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
-$as_echo_n "checking for dld_link in -ldld... " >&6; }
-if ${ac_cv_lib_dld_dld_link+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dld_link ();
-int
-main ()
-{
-return dld_link ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dld_dld_link=yes
-else
-  ac_cv_lib_dld_dld_link=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
-$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
-if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
-  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-    ;;
-  esac
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
-$as_echo_n "checking whether a program can dlopen itself... " >&6; }
-if ${lt_cv_dlopen_self+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
-   correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-int fnord () __attribute__((visibility("default")));
-#endif
-
-int fnord () { return 42; }
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else
-        {
-	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
-          else puts (dlerror ());
-	}
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}
-_LT_EOF
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self=no
-  fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
-$as_echo "$lt_cv_dlopen_self" >&6; }
-
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
-$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
-if ${lt_cv_dlopen_self_static+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self_static=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
-   correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-int fnord () __attribute__((visibility("default")));
-#endif
-
-int fnord () { return 42; }
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else
-        {
-	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
-          else puts (dlerror ());
-	}
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}
-_LT_EOF
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self_static=no
-  fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
-$as_echo "$lt_cv_dlopen_self_static" >&6; }
-    fi
-
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
-
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-striplib=
-old_striplib=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
-$as_echo_n "checking whether stripping libraries is possible... " >&6; }
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-  darwin*)
-    if test -n "$STRIP" ; then
-      striplib="$STRIP -x"
-      old_striplib="$STRIP -S"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-    else
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    fi
-    ;;
-  *)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    ;;
-  esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-  # Report which library types will actually be built
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
-$as_echo_n "checking if libtool supports shared libraries... " >&6; }
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
-$as_echo "$can_build_shared" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
-$as_echo_n "checking whether to build shared libraries... " >&6; }
-  test "$can_build_shared" = "no" && enable_shared=no
-
-  # On AIX, shared libraries and static libraries use the same namespace, and
-  # are all built from PIC.
-  case $host_os in
-  aix3*)
-    test "$enable_shared" = yes && enable_static=no
-    if test -n "$RANLIB"; then
-      archive_cmds="$archive_cmds~\$RANLIB \$lib"
-      postinstall_cmds='$RANLIB $lib'
-    fi
-    ;;
-
-  aix[4-9]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
-    fi
-    ;;
-  esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
-$as_echo "$enable_shared" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
-$as_echo_n "checking whether to build static libraries... " >&6; }
-  # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
-$as_echo "$enable_static" >&6; }
-
-
-
-
-fi
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-CC="$lt_save_CC"
-
-      if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
-  ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
-$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
-if test -z "$CXXCPP"; then
-  if ${ac_cv_prog_CXXCPP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-      # Double quotes because CXXCPP needs to be expanded
-    for CXXCPP in "$CXX -E" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-  break
-fi
-
-    done
-    ac_cv_prog_CXXCPP=$CXXCPP
-
-fi
-  CXXCPP=$ac_cv_prog_CXXCPP
-else
-  ac_cv_prog_CXXCPP=$CXXCPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
-$as_echo "$CXXCPP" >&6; }
-ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-else
-  _lt_caught_CXX_error=yes
-fi
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-archive_cmds_need_lc_CXX=no
-allow_undefined_flag_CXX=
-always_export_symbols_CXX=no
-archive_expsym_cmds_CXX=
-compiler_needs_object_CXX=no
-export_dynamic_flag_spec_CXX=
-hardcode_direct_CXX=no
-hardcode_direct_absolute_CXX=no
-hardcode_libdir_flag_spec_CXX=
-hardcode_libdir_separator_CXX=
-hardcode_minus_L_CXX=no
-hardcode_shlibpath_var_CXX=unsupported
-hardcode_automatic_CXX=no
-inherit_rpath_CXX=no
-module_cmds_CXX=
-module_expsym_cmds_CXX=
-link_all_deplibs_CXX=unknown
-old_archive_cmds_CXX=$old_archive_cmds
-reload_flag_CXX=$reload_flag
-reload_cmds_CXX=$reload_cmds
-no_undefined_flag_CXX=
-whole_archive_flag_spec_CXX=
-enable_shared_with_static_runtimes_CXX=no
-
-# Source file extension for C++ test sources.
-ac_ext=cpp
-
-# Object file extension for compiled C++ test sources.
-objext=o
-objext_CXX=$objext
-
-# No sense in running all these tests if we already determined that
-# the CXX compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="int some_variable = 0;"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-
-  # save warnings/boilerplate of simple test code
-  ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-
-  ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC=$CC
-  lt_save_CFLAGS=$CFLAGS
-  lt_save_LD=$LD
-  lt_save_GCC=$GCC
-  GCC=$GXX
-  lt_save_with_gnu_ld=$with_gnu_ld
-  lt_save_path_LD=$lt_cv_path_LD
-  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
-    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
-  else
-    $as_unset lt_cv_prog_gnu_ld
-  fi
-  if test -n "${lt_cv_path_LDCXX+set}"; then
-    lt_cv_path_LD=$lt_cv_path_LDCXX
-  else
-    $as_unset lt_cv_path_LD
-  fi
-  test -z "${LDCXX+set}" || LD=$LDCXX
-  CC=${CXX-"c++"}
-  CFLAGS=$CXXFLAGS
-  compiler=$CC
-  compiler_CXX=$CC
-  for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-
-
-  if test -n "$compiler"; then
-    # We don't want -fno-exception when compiling C++ code, so set the
-    # no_builtin_flag separately
-    if test "$GXX" = yes; then
-      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
-    else
-      lt_prog_compiler_no_builtin_flag_CXX=
-    fi
-
-    if test "$GXX" = yes; then
-      # Set up default GNU C++ configuration
-
-
-
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | ?:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if ${lt_cv_path_LD+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if ${lt_cv_prog_gnu_ld+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
-
-
-
-
-
-
-      # Check if GNU C++ uses GNU ld as the underlying linker, since the
-      # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-
-        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-        export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-
-        # If archive_cmds runs LD, not CC, wlarc should be empty
-        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
-        #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
-
-        # ancient GNU ld didn't support --whole-archive et. al.
-        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
-	  $GREP 'no-whole-archive' > /dev/null; then
-          whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-        else
-          whole_archive_flag_spec_CXX=
-        fi
-      else
-        with_gnu_ld=no
-        wlarc=
-
-        # A generic and very simple default shared library creation
-        # command for GNU C++ for the case where it uses the native
-        # linker, instead of GNU ld.  If possible, this setting should
-        # overridden to take advantage of the native linker features on
-        # the platform it is being used on.
-        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-      fi
-
-      # Commands to make compiler produce verbose output that lists
-      # what "hidden" libraries, object files and flags are used when
-      # linking a shared library.
-      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
-    else
-      GXX=no
-      with_gnu_ld=no
-      wlarc=
-    fi
-
-    # PORTME: fill in a description of your system's C++ link characteristics
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-    ld_shlibs_CXX=yes
-    case $host_os in
-      aix3*)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-        ;;
-      aix[4-9]*)
-        if test "$host_cpu" = ia64; then
-          # On IA64, the linker does run time linking by default, so we don't
-          # have to do anything special.
-          aix_use_runtimelinking=no
-          exp_sym_flag='-Bexport'
-          no_entry_flag=""
-        else
-          aix_use_runtimelinking=no
-
-          # Test if we are trying to use run time linking or normal
-          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
-          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
-	    for ld_flag in $LDFLAGS; do
-	      case $ld_flag in
-	      *-brtl*)
-	        aix_use_runtimelinking=yes
-	        break
-	        ;;
-	      esac
-	    done
-	    ;;
-          esac
-
-          exp_sym_flag='-bexport'
-          no_entry_flag='-bnoentry'
-        fi
-
-        # When large executables or shared objects are built, AIX ld can
-        # have problems creating the table of contents.  If linking a library
-        # or program results in "error TOC overflow" add -mminimal-toc to
-        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-        archive_cmds_CXX=''
-        hardcode_direct_CXX=yes
-        hardcode_direct_absolute_CXX=yes
-        hardcode_libdir_separator_CXX=':'
-        link_all_deplibs_CXX=yes
-        file_list_spec_CXX='${wl}-f,'
-
-        if test "$GXX" = yes; then
-          case $host_os in aix4.[012]|aix4.[012].*)
-          # We only want to do this on AIX 4.2 and lower, the check
-          # below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	    # We have reworked collect2
-	    :
-	  else
-	    # We have old collect2
-	    hardcode_direct_CXX=unsupported
-	    # It fails to find uninstalled libraries when the uninstalled
-	    # path is not listed in the libpath.  Setting hardcode_minus_L
-	    # to unsupported forces relinking
-	    hardcode_minus_L_CXX=yes
-	    hardcode_libdir_flag_spec_CXX='-L$libdir'
-	    hardcode_libdir_separator_CXX=
-	  fi
-          esac
-          shared_flag='-shared'
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag="$shared_flag "'${wl}-G'
-	  fi
-        else
-          # not using gcc
-          if test "$host_cpu" = ia64; then
-	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	  # chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-          else
-	    if test "$aix_use_runtimelinking" = yes; then
-	      shared_flag='${wl}-G'
-	    else
-	      shared_flag='${wl}-bM:SRE'
-	    fi
-          fi
-        fi
-
-        export_dynamic_flag_spec_CXX='${wl}-bexpall'
-        # It seems that -bexpall does not export symbols beginning with
-        # underscore (_), so it is better to generate a list of symbols to
-	# export.
-        always_export_symbols_CXX=yes
-        if test "$aix_use_runtimelinking" = yes; then
-          # Warning - without using the other runtime loading flags (-brtl),
-          # -berok will link without error, but may produce a broken library.
-          allow_undefined_flag_CXX='-berok'
-          # Determine the default libpath from the value encoded in an empty
-          # executable.
-          if test "${lt_cv_aix_libpath+set}" = set; then
-  aix_libpath=$lt_cv_aix_libpath
-else
-  if ${lt_cv_aix_libpath__CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-  lt_aix_libpath_sed='
-      /Import File Strings/,/^$/ {
-	  /^0/ {
-	      s/^0  *\([^ ]*\) *$/\1/
-	      p
-	  }
-      }'
-  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  # Check for a 64-bit object if we didn't find anything.
-  if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
-  fi
-
-fi
-
-  aix_libpath=$lt_cv_aix_libpath__CXX
-fi
-
-          hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
-
-          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-        else
-          if test "$host_cpu" = ia64; then
-	    hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
-	    allow_undefined_flag_CXX="-z nodefs"
-	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-          else
-	    # Determine the default libpath from the value encoded in an
-	    # empty executable.
-	    if test "${lt_cv_aix_libpath+set}" = set; then
-  aix_libpath=$lt_cv_aix_libpath
-else
-  if ${lt_cv_aix_libpath__CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-  lt_aix_libpath_sed='
-      /Import File Strings/,/^$/ {
-	  /^0/ {
-	      s/^0  *\([^ ]*\) *$/\1/
-	      p
-	  }
-      }'
-  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  # Check for a 64-bit object if we didn't find anything.
-  if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
-  fi
-
-fi
-
-  aix_libpath=$lt_cv_aix_libpath__CXX
-fi
-
-	    hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
-	    # Warning - without using the other run time loading flags,
-	    # -berok will link without error, but may produce a broken library.
-	    no_undefined_flag_CXX=' ${wl}-bernotok'
-	    allow_undefined_flag_CXX=' ${wl}-berok'
-	    if test "$with_gnu_ld" = yes; then
-	      # We only use this code for GNU lds that support --whole-archive.
-	      whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    else
-	      # Exported symbols can be pulled into shared objects from archives
-	      whole_archive_flag_spec_CXX='$convenience'
-	    fi
-	    archive_cmds_need_lc_CXX=yes
-	    # This is similar to how AIX traditionally builds its shared
-	    # libraries.
-	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-          fi
-        fi
-        ;;
-
-      beos*)
-	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	  allow_undefined_flag_CXX=unsupported
-	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-	  # support --undefined.  This deserves some investigation.  FIXME
-	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	else
-	  ld_shlibs_CXX=no
-	fi
-	;;
-
-      chorus*)
-        case $cc_basename in
-          *)
-	  # FIXME: insert proper C++ library support
-	  ld_shlibs_CXX=no
-	  ;;
-        esac
-        ;;
-
-      cygwin* | mingw* | pw32* | cegcc*)
-	case $GXX,$cc_basename in
-	,cl* | no,cl*)
-	  # Native MSVC
-	  # hardcode_libdir_flag_spec is actually meaningless, as there is
-	  # no search path for DLLs.
-	  hardcode_libdir_flag_spec_CXX=' '
-	  allow_undefined_flag_CXX=unsupported
-	  always_export_symbols_CXX=yes
-	  file_list_spec_CXX='@'
-	  # Tell ltmain to make .lib files, not .a files.
-	  libext=lib
-	  # Tell ltmain to make .dll files, not .so files.
-	  shrext_cmds=".dll"
-	  # FIXME: Setting linknames here is a bad hack.
-	  archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	  archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	    else
-	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	    fi~
-	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	    linknames='
-	  # The linker will not automatically build a static lib if we build a DLL.
-	  # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
-	  enable_shared_with_static_runtimes_CXX=yes
-	  # Don't use ranlib
-	  old_postinstall_cmds_CXX='chmod 644 $oldlib'
-	  postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
-	    lt_tool_outputfile="@TOOL_OUTPUT@"~
-	    case $lt_outputfile in
-	      *.exe|*.EXE) ;;
-	      *)
-		lt_outputfile="$lt_outputfile.exe"
-		lt_tool_outputfile="$lt_tool_outputfile.exe"
-		;;
-	    esac~
-	    func_to_tool_file "$lt_outputfile"~
-	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	      $RM "$lt_outputfile.manifest";
-	    fi'
-	  ;;
-	*)
-	  # g++
-	  # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
-	  # as there is no search path for DLLs.
-	  hardcode_libdir_flag_spec_CXX='-L$libdir'
-	  export_dynamic_flag_spec_CXX='${wl}--export-all-symbols'
-	  allow_undefined_flag_CXX=unsupported
-	  always_export_symbols_CXX=no
-	  enable_shared_with_static_runtimes_CXX=yes
-
-	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	    # If the export-symbols file already is a .def file (1st line
-	    # is EXPORTS), use it as is; otherwise, prepend...
-	    archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      cp $export_symbols $output_objdir/$soname.def;
-	    else
-	      echo EXPORTS > $output_objdir/$soname.def;
-	      cat $export_symbols >> $output_objdir/$soname.def;
-	    fi~
-	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	  else
-	    ld_shlibs_CXX=no
-	  fi
-	  ;;
-	esac
-	;;
-      darwin* | rhapsody*)
-
-
-  archive_cmds_need_lc_CXX=no
-  hardcode_direct_CXX=no
-  hardcode_automatic_CXX=yes
-  hardcode_shlibpath_var_CXX=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-
-  else
-    whole_archive_flag_spec_CXX=''
-  fi
-  link_all_deplibs_CXX=yes
-  allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=func_echo_all
-    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-       if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-      archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
-    fi
-
-  else
-  ld_shlibs_CXX=no
-  fi
-
-	;;
-
-      dgux*)
-        case $cc_basename in
-          ec++*)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          ghcx*)
-	    # Green Hills C++ Compiler
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-        esac
-        ;;
-
-      freebsd2.*)
-        # C++ shared libraries reported to be fairly broken before
-	# switch to ELF
-        ld_shlibs_CXX=no
-        ;;
-
-      freebsd-elf*)
-        archive_cmds_need_lc_CXX=no
-        ;;
-
-      freebsd* | dragonfly*)
-        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
-        # conventions
-        ld_shlibs_CXX=yes
-        ;;
-
-      gnu*)
-        ;;
-
-      haiku*)
-        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        link_all_deplibs_CXX=yes
-        ;;
-
-      hpux9*)
-        hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
-        hardcode_libdir_separator_CXX=:
-        export_dynamic_flag_spec_CXX='${wl}-E'
-        hardcode_direct_CXX=yes
-        hardcode_minus_L_CXX=yes # Not in the search PATH,
-				             # but as the default
-				             # location of the library.
-
-        case $cc_basename in
-          CC*)
-            # FIXME: insert proper C++ library support
-            ld_shlibs_CXX=no
-            ;;
-          aCC*)
-            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            # Commands to make compiler produce verbose output that lists
-            # what "hidden" libraries, object files and flags are used when
-            # linking a shared library.
-            #
-            # There doesn't appear to be a way to prevent this compiler from
-            # explicitly linking system object files so we need to strip them
-            # from the output so that they don't get included in the library
-            # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-            ;;
-          *)
-            if test "$GXX" = yes; then
-              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            else
-              # FIXME: insert proper C++ library support
-              ld_shlibs_CXX=no
-            fi
-            ;;
-        esac
-        ;;
-
-      hpux10*|hpux11*)
-        if test $with_gnu_ld = no; then
-	  hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
-	  hardcode_libdir_separator_CXX=:
-
-          case $host_cpu in
-            hppa*64*|ia64*)
-              ;;
-            *)
-	      export_dynamic_flag_spec_CXX='${wl}-E'
-              ;;
-          esac
-        fi
-        case $host_cpu in
-          hppa*64*|ia64*)
-            hardcode_direct_CXX=no
-            hardcode_shlibpath_var_CXX=no
-            ;;
-          *)
-            hardcode_direct_CXX=yes
-            hardcode_direct_absolute_CXX=yes
-            hardcode_minus_L_CXX=yes # Not in the search PATH,
-					         # but as the default
-					         # location of the library.
-            ;;
-        esac
-
-        case $cc_basename in
-          CC*)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          aCC*)
-	    case $host_cpu in
-	      hppa*64*)
-	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      ia64*)
-	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      *)
-	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	    esac
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test $with_gnu_ld = no; then
-	        case $host_cpu in
-	          hppa*64*)
-	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          ia64*)
-	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          *)
-	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	        esac
-	      fi
-	    else
-	      # FIXME: insert proper C++ library support
-	      ld_shlibs_CXX=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      interix[3-9]*)
-	hardcode_direct_CXX=no
-	hardcode_shlibpath_var_CXX=no
-	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	export_dynamic_flag_spec_CXX='${wl}-E'
-	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-	# Instead, shared libraries are loaded at an image base (0x10000000 by
-	# default) and relocated if they conflict, which is a slow very memory
-	# consuming and fragmenting process.  To avoid this, we pick a random,
-	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-	archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	;;
-      irix5* | irix6*)
-        case $cc_basename in
-          CC*)
-	    # SGI C++
-	    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test "$with_gnu_ld" = no; then
-	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	      else
-	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
-	      fi
-	    fi
-	    link_all_deplibs_CXX=yes
-	    ;;
-        esac
-        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-        hardcode_libdir_separator_CXX=:
-        inherit_rpath_CXX=yes
-        ;;
-
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	    old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
-	    ;;
-	  icpc* | ecpc* )
-	    # Intel C++
-	    with_gnu_ld=yes
-	    # version 8.0 and above of icpc choke on multiply defined symbols
-	    # if we add $predep_objects and $postdep_objects, however 7.1 and
-	    # earlier do not add the objects themselves.
-	    case `$CC -V 2>&1` in
-	      *"Version 7."*)
-	        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	      *)  # Version 8.0 or newer
-	        tmp_idyn=
-	        case $host_cpu in
-		  ia64*) tmp_idyn=' -i_dynamic';;
-		esac
-	        archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	    esac
-	    archive_cmds_need_lc_CXX=no
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	    whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    ;;
-          pgCC* | pgcpp*)
-            # Portland Group C++ compiler
-	    case `$CC -V` in
-	    *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
-	      prelink_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
-	      old_archive_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
-		$RANLIB $oldlib'
-	      archive_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      archive_expsym_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    *) # Version 6 and above use weak symbols
-	      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    esac
-
-	    hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	    whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-            ;;
-	  cxx*)
-	    # Compaq C++
-	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
-
-	    runpath_var=LD_RUN_PATH
-	    hardcode_libdir_flag_spec_CXX='-rpath $libdir'
-	    hardcode_libdir_separator_CXX=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
-	    ;;
-	  xl* | mpixl* | bgxl*)
-	    # IBM XL 8.0 on PPC, with GNU ld
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    if test "x$supports_anon_versioning" = xyes; then
-	      archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
-		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-		echo "local: *; };" >> $output_objdir/$libname.ver~
-		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-	    fi
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      no_undefined_flag_CXX=' -zdefs'
-	      archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
-	      hardcode_libdir_flag_spec_CXX='-R$libdir'
-	      whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	      compiler_needs_object_CXX=yes
-
-	      # Not sure whether something based on
-	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
-	      # would be better.
-	      output_verbose_link_cmd='func_echo_all'
-
-	      # Archives containing C++ object files must be created using
-	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	      # necessary to make sure instantiated templates are included
-	      # in the archive.
-	      old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-
-      lynxos*)
-        # FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-
-      m88k*)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-	;;
-
-      mvs*)
-        case $cc_basename in
-          cxx*)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-	  *)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-	esac
-	;;
-
-      netbsd*)
-        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	  archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
-	  wlarc=
-	  hardcode_libdir_flag_spec_CXX='-R$libdir'
-	  hardcode_direct_CXX=yes
-	  hardcode_shlibpath_var_CXX=no
-	fi
-	# Workaround some broken pre-1.5 toolchains
-	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
-	;;
-
-      *nto* | *qnx*)
-        ld_shlibs_CXX=yes
-	;;
-
-      openbsd2*)
-        # C++ shared libraries are fairly broken
-	ld_shlibs_CXX=no
-	;;
-
-      openbsd*)
-	if test -f /usr/libexec/ld.so; then
-	  hardcode_direct_CXX=yes
-	  hardcode_shlibpath_var_CXX=no
-	  hardcode_direct_absolute_CXX=yes
-	  archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-	  hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-	    export_dynamic_flag_spec_CXX='${wl}-E'
-	    whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-	  fi
-	  output_verbose_link_cmd=func_echo_all
-	else
-	  ld_shlibs_CXX=no
-	fi
-	;;
-
-      osf3* | osf4* | osf5*)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	    hardcode_libdir_separator_CXX=:
-
-	    # Archives containing C++ object files must be created using
-	    # the KAI C++ compiler.
-	    case $host in
-	      osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
-	      *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
-	    esac
-	    ;;
-          RCC*)
-	    # Rational C++ 2.4.1
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          cxx*)
-	    case $host in
-	      osf3*)
-	        allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
-	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-		;;
-	      *)
-	        allow_undefined_flag_CXX=' -expect_unresolved \*'
-	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	          echo "-hidden">> $lib.exp~
-	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
-	          $RM $lib.exp'
-	        hardcode_libdir_flag_spec_CXX='-rpath $libdir'
-		;;
-	    esac
-
-	    hardcode_libdir_separator_CXX=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-	    ;;
-	  *)
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
-	      case $host in
-	        osf3*)
-	          archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	        *)
-	          archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	      esac
-
-	      hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-	      hardcode_libdir_separator_CXX=:
-
-	      # Commands to make compiler produce verbose output that lists
-	      # what "hidden" libraries, object files and flags are used when
-	      # linking a shared library.
-	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
-	    else
-	      # FIXME: insert proper C++ library support
-	      ld_shlibs_CXX=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      psos*)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-        ;;
-
-      sunos4*)
-        case $cc_basename in
-          CC*)
-	    # Sun C++ 4.x
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          lcc*)
-	    # Lucid
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-        esac
-        ;;
-
-      solaris*)
-        case $cc_basename in
-          CC* | sunCC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-            archive_cmds_need_lc_CXX=yes
-	    no_undefined_flag_CXX=' -zdefs'
-	    archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	    archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	    hardcode_libdir_flag_spec_CXX='-R$libdir'
-	    hardcode_shlibpath_var_CXX=no
-	    case $host_os in
-	      solaris2.[0-5] | solaris2.[0-5].*) ;;
-	      *)
-		# The compiler driver will combine and reorder linker options,
-		# but understands `-z linker_flag'.
-	        # Supported since Solaris 2.6 (maybe 2.5.1?)
-		whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
-	        ;;
-	    esac
-	    link_all_deplibs_CXX=yes
-
-	    output_verbose_link_cmd='func_echo_all'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
-	    ;;
-          gcx*)
-	    # Green Hills C++ Compiler
-	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-
-	    # The C++ compiler must be used to create the archive.
-	    old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    # GNU C++ compiler with Solaris linker
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
-	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-	      else
-	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
-	        # platform.
-	        archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-	      fi
-
-	      hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
-	      case $host_os in
-		solaris2.[0-5] | solaris2.[0-5].*) ;;
-		*)
-		  whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-		  ;;
-	      esac
-	    fi
-	    ;;
-        esac
-        ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag_CXX='${wl}-z,text'
-      archive_cmds_need_lc_CXX=no
-      hardcode_shlibpath_var_CXX=no
-      runpath_var='LD_RUN_PATH'
-
-      case $cc_basename in
-        CC*)
-	  archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-      esac
-      ;;
-
-      sysv5* | sco3.2v5* | sco5v6*)
-	# Note: We can NOT use -z defs as we might desire, because we do not
-	# link with -lc, and that would cause any symbols used from libc to
-	# always be unresolved, which means just about no library would
-	# ever link correctly.  If we're not using GNU ld we use -z text
-	# though, which does catch some bad symbols but isn't as heavy-handed
-	# as -z defs.
-	no_undefined_flag_CXX='${wl}-z,text'
-	allow_undefined_flag_CXX='${wl}-z,nodefs'
-	archive_cmds_need_lc_CXX=no
-	hardcode_shlibpath_var_CXX=no
-	hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir'
-	hardcode_libdir_separator_CXX=':'
-	link_all_deplibs_CXX=yes
-	export_dynamic_flag_spec_CXX='${wl}-Bexport'
-	runpath_var='LD_RUN_PATH'
-
-	case $cc_basename in
-          CC*)
-	    archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
-	      '"$old_archive_cmds_CXX"
-	    reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
-	      '"$reload_cmds_CXX"
-	    ;;
-	  *)
-	    archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    ;;
-	esac
-      ;;
-
-      tandem*)
-        case $cc_basename in
-          NCC*)
-	    # NonStop-UX NCC 3.20
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-        esac
-        ;;
-
-      vxworks*)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-        ;;
-
-      *)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-        ;;
-    esac
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
-$as_echo "$ld_shlibs_CXX" >&6; }
-    test "$ld_shlibs_CXX" = no && can_build_shared=no
-
-    GCC_CXX="$GXX"
-    LD_CXX="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    # Dependencies to place before and after the object being linked:
-predep_objects_CXX=
-postdep_objects_CXX=
-predeps_CXX=
-postdeps_CXX=
-compiler_lib_search_path_CXX=
-
-cat > conftest.$ac_ext <<_LT_EOF
-class Foo
-{
-public:
-  Foo (void) { a = 0; }
-private:
-  int a;
-};
-_LT_EOF
-
-
-_lt_libdeps_save_CFLAGS=$CFLAGS
-case "$CC $CFLAGS " in #(
-*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
-*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
-*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
-esac
-
-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-  # Parse the compiler output and extract the necessary
-  # objects, libraries and library flags.
-
-  # Sentinel used to keep track of whether or not we are before
-  # the conftest object file.
-  pre_test_object_deps_done=no
-
-  for p in `eval "$output_verbose_link_cmd"`; do
-    case ${prev}${p} in
-
-    -L* | -R* | -l*)
-       # Some compilers place space between "-{L,R}" and the path.
-       # Remove the space.
-       if test $p = "-L" ||
-          test $p = "-R"; then
-	 prev=$p
-	 continue
-       fi
-
-       # Expand the sysroot to ease extracting the directories later.
-       if test -z "$prev"; then
-         case $p in
-         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
-         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
-         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
-         esac
-       fi
-       case $p in
-       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
-       esac
-       if test "$pre_test_object_deps_done" = no; then
-	 case ${prev} in
-	 -L | -R)
-	   # Internal compiler library paths should come after those
-	   # provided the user.  The postdeps already come after the
-	   # user supplied libs so there is no need to process them.
-	   if test -z "$compiler_lib_search_path_CXX"; then
-	     compiler_lib_search_path_CXX="${prev}${p}"
-	   else
-	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
-	   fi
-	   ;;
-	 # The "-l" case would never come before the object being
-	 # linked, so don't bother handling this case.
-	 esac
-       else
-	 if test -z "$postdeps_CXX"; then
-	   postdeps_CXX="${prev}${p}"
-	 else
-	   postdeps_CXX="${postdeps_CXX} ${prev}${p}"
-	 fi
-       fi
-       prev=
-       ;;
-
-    *.lto.$objext) ;; # Ignore GCC LTO objects
-    *.$objext)
-       # This assumes that the test object file only shows up
-       # once in the compiler output.
-       if test "$p" = "conftest.$objext"; then
-	 pre_test_object_deps_done=yes
-	 continue
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 if test -z "$predep_objects_CXX"; then
-	   predep_objects_CXX="$p"
-	 else
-	   predep_objects_CXX="$predep_objects_CXX $p"
-	 fi
-       else
-	 if test -z "$postdep_objects_CXX"; then
-	   postdep_objects_CXX="$p"
-	 else
-	   postdep_objects_CXX="$postdep_objects_CXX $p"
-	 fi
-       fi
-       ;;
-
-    *) ;; # Ignore the rest.
-
-    esac
-  done
-
-  # Clean up.
-  rm -f a.out a.exe
-else
-  echo "libtool.m4: error: problem compiling CXX test program"
-fi
-
-$RM -f confest.$objext
-CFLAGS=$_lt_libdeps_save_CFLAGS
-
-# PORTME: override above test on systems where it is broken
-case $host_os in
-interix[3-9]*)
-  # Interix 3.5 installs completely hosed .la files for C++, so rather than
-  # hack all around it, let's just trust "g++" to DTRT.
-  predep_objects_CXX=
-  postdep_objects_CXX=
-  postdeps_CXX=
-  ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    if test "$solaris_use_stlport4" != yes; then
-      postdeps_CXX='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC* | sunCC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      postdeps_CXX='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-esac
-
-
-case " $postdeps_CXX " in
-*" -lc "*) archive_cmds_need_lc_CXX=no ;;
-esac
- compiler_lib_search_dirs_CXX=
-if test -n "${compiler_lib_search_path_CXX}"; then
- compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    lt_prog_compiler_wl_CXX=
-lt_prog_compiler_pic_CXX=
-lt_prog_compiler_static_CXX=
-
-
-  # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
-    lt_prog_compiler_wl_CXX='-Wl,'
-    lt_prog_compiler_static_CXX='-static'
-
-    case $host_os in
-    aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static_CXX='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            lt_prog_compiler_pic_CXX='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-    mingw* | cygwin* | os2* | pw32* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
-      ;;
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic_CXX='-fno-common'
-      ;;
-    *djgpp*)
-      # DJGPP does not support shared libraries at all
-      lt_prog_compiler_pic_CXX=
-      ;;
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      lt_prog_compiler_static_CXX=
-      ;;
-    interix[3-9]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic_CXX=-Kconform_pic
-      fi
-      ;;
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	;;
-      *)
-	lt_prog_compiler_pic_CXX='-fPIC'
-	;;
-      esac
-      ;;
-    *qnx* | *nto*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic_CXX='-fPIC -shared'
-      ;;
-    *)
-      lt_prog_compiler_pic_CXX='-fPIC'
-      ;;
-    esac
-  else
-    case $host_os in
-      aix[4-9]*)
-	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
-	  # AIX 5 now supports IA64 processor
-	  lt_prog_compiler_static_CXX='-Bstatic'
-	else
-	  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
-	fi
-	;;
-      chorus*)
-	case $cc_basename in
-	cxch68*)
-	  # Green Hills C++ Compiler
-	  # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
-	  ;;
-	esac
-	;;
-      mingw* | cygwin* | os2* | pw32* | cegcc*)
-	# This hack is so that the source file can tell whether it is being
-	# built for inclusion in a dll (and should export symbols for example).
-	lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
-	;;
-      dgux*)
-	case $cc_basename in
-	  ec++*)
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    ;;
-	  ghcx*)
-	    # Green Hills C++ Compiler
-	    lt_prog_compiler_pic_CXX='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      freebsd* | dragonfly*)
-	# FreeBSD uses GNU C++
-	;;
-      hpux9* | hpux10* | hpux11*)
-	case $cc_basename in
-	  CC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
-	      lt_prog_compiler_pic_CXX='+Z'
-	    fi
-	    ;;
-	  aCC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
-	    case $host_cpu in
-	    hppa*64*|ia64*)
-	      # +Z the default
-	      ;;
-	    *)
-	      lt_prog_compiler_pic_CXX='+Z'
-	      ;;
-	    esac
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      interix*)
-	# This is c89, which is MS Visual C++ (no shared libs)
-	# Anyone wants to do a port?
-	;;
-      irix5* | irix6* | nonstopux*)
-	case $cc_basename in
-	  CC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='-non_shared'
-	    # CC pic flag -KPIC is the default.
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-	case $cc_basename in
-	  KCC*)
-	    # KAI C++ Compiler
-	    lt_prog_compiler_wl_CXX='--backend -Wl,'
-	    lt_prog_compiler_pic_CXX='-fPIC'
-	    ;;
-	  ecpc* )
-	    # old Intel C++ for x86_64 which still supported -KPIC.
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    lt_prog_compiler_static_CXX='-static'
-	    ;;
-	  icpc* )
-	    # Intel C++, used to be incompatible with GCC.
-	    # ICC 10 doesn't accept -KPIC any more.
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-fPIC'
-	    lt_prog_compiler_static_CXX='-static'
-	    ;;
-	  pgCC* | pgcpp*)
-	    # Portland Group C++ compiler
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-fpic'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    ;;
-	  cxx*)
-	    # Compaq C++
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    lt_prog_compiler_pic_CXX=
-	    lt_prog_compiler_static_CXX='-non_shared'
-	    ;;
-	  xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
-	    # IBM XL 8.0, 9.0 on PPC and BlueGene
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-qpic'
-	    lt_prog_compiler_static_CXX='-qstaticlink'
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      lt_prog_compiler_pic_CXX='-KPIC'
-	      lt_prog_compiler_static_CXX='-Bstatic'
-	      lt_prog_compiler_wl_CXX='-Qoption ld '
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-      lynxos*)
-	;;
-      m88k*)
-	;;
-      mvs*)
-	case $cc_basename in
-	  cxx*)
-	    lt_prog_compiler_pic_CXX='-W c,exportall'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      netbsd*)
-	;;
-      *qnx* | *nto*)
-        # QNX uses GNU C++, but need to define -shared option too, otherwise
-        # it will coredump.
-        lt_prog_compiler_pic_CXX='-fPIC -shared'
-        ;;
-      osf3* | osf4* | osf5*)
-	case $cc_basename in
-	  KCC*)
-	    lt_prog_compiler_wl_CXX='--backend -Wl,'
-	    ;;
-	  RCC*)
-	    # Rational C++ 2.4.1
-	    lt_prog_compiler_pic_CXX='-pic'
-	    ;;
-	  cxx*)
-	    # Digital/Compaq C++
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    lt_prog_compiler_pic_CXX=
-	    lt_prog_compiler_static_CXX='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      psos*)
-	;;
-      solaris*)
-	case $cc_basename in
-	  CC* | sunCC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    lt_prog_compiler_wl_CXX='-Qoption ld '
-	    ;;
-	  gcx*)
-	    # Green Hills C++ Compiler
-	    lt_prog_compiler_pic_CXX='-PIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sunos4*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.x
-	    lt_prog_compiler_pic_CXX='-pic'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    ;;
-	  lcc*)
-	    # Lucid
-	    lt_prog_compiler_pic_CXX='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-	case $cc_basename in
-	  CC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    ;;
-	esac
-	;;
-      tandem*)
-	case $cc_basename in
-	  NCC*)
-	    # NonStop-UX NCC 3.20
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      vxworks*)
-	;;
-      *)
-	lt_prog_compiler_can_build_shared_CXX=no
-	;;
-    esac
-  fi
-
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic_CXX=
-    ;;
-  *)
-    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
-    ;;
-esac
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-if ${lt_cv_prog_compiler_pic_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; }
-lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic_CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
-if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_pic_works_CXX=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_pic_works_CXX=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
-
-if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
-    case $lt_prog_compiler_pic_CXX in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
-     esac
-else
-    lt_prog_compiler_pic_CXX=
-     lt_prog_compiler_can_build_shared_CXX=no
-fi
-
-fi
-
-
-
-
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if ${lt_cv_prog_compiler_static_works_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_static_works_CXX=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler_static_works_CXX=yes
-       fi
-     else
-       lt_cv_prog_compiler_static_works_CXX=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
-
-if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
-    :
-else
-    lt_prog_compiler_static_CXX=
-fi
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o_CXX=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o_CXX=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o_CXX=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o_CXX=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
-
-
-
-
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-
-  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
-  case $host_os in
-  aix[4-9]*)
-    # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    # Also, AIX nm treats weak defined symbols like other global defined
-    # symbols, whereas GNU nm marks them as "W".
-    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    else
-      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    fi
-    ;;
-  pw32*)
-    export_symbols_cmds_CXX="$ltdll_cmds"
-    ;;
-  cygwin* | mingw* | cegcc*)
-    case $cc_basename in
-    cl*)
-      exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
-      ;;
-    *)
-      export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
-      exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
-      ;;
-    esac
-    ;;
-  *)
-    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-    ;;
-  esac
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
-$as_echo "$ld_shlibs_CXX" >&6; }
-test "$ld_shlibs_CXX" = no && can_build_shared=no
-
-with_gnu_ld_CXX=$with_gnu_ld
-
-
-
-
-
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc_CXX" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc_CXX=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds_CXX in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  $RM conftest*
-	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } 2>conftest.err; then
-	  soname=conftest
-	  lib=conftest
-	  libobjs=conftest.$ac_objext
-	  deplibs=
-	  wl=$lt_prog_compiler_wl_CXX
-	  pic_flag=$lt_prog_compiler_pic_CXX
-	  compiler_flags=-v
-	  linker_flags=-v
-	  verstring=
-	  output_objdir=.
-	  libname=conftest
-	  lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
-	  allow_undefined_flag_CXX=
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
-  (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-	  then
-	    lt_cv_archive_cmds_need_lc_CXX=no
-	  else
-	    lt_cv_archive_cmds_need_lc_CXX=yes
-	  fi
-	  allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
-	else
-	  cat conftest.err 1>&5
-	fi
-	$RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
-$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
-      archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
-
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[4-9]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[45]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$cc_basename in
-  yes,*)
-    # gcc
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    dynamic_linker='Win32 ld.exe'
-    ;;
-
-  *,cl*)
-    # Native MSVC
-    libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
-
-    case $build_os in
-    mingw*)
-      sys_lib_search_path_spec=
-      lt_save_ifs=$IFS
-      IFS=';'
-      for lt_path in $LIB
-      do
-        IFS=$lt_save_ifs
-        # Let DOS variable expansion print the short 8.3 style file name.
-        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
-        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
-      done
-      IFS=$lt_save_ifs
-      # Convert to MSYS style.
-      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
-      ;;
-    cygwin*)
-      # Convert to unix form, then to dos form, then back to unix form
-      # but this time dos style (no spaces!) so that the unix form looks
-      # like /cygdrive/c/PROGRA~1:/cygdr...
-      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
-      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
-      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
-      ;;
-    *)
-      sys_lib_search_path_spec="$LIB"
-      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
-        # It is most probably a Windows format PATH.
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      # FIXME: find the short name or the path components, as spaces are
-      # common. (e.g. "Program Files" -> "PROGRA~1")
-      ;;
-    esac
-
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-    dynamic_linker='Win32 link.exe'
-    ;;
-
-  *)
-    # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    dynamic_linker='Win32 ld.exe'
-    ;;
-  esac
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[23].*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  # Handle Gentoo/FreeBSD as it was Linux
-  case $host_vendor in
-    gentoo)
-      version_type=linux ;;
-    *)
-      version_type=freebsd-$objformat ;;
-  esac
-
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-    linux)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-      soname_spec='${libname}${release}${shared_ext}$major'
-      need_lib_prefix=no
-      need_version=no
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2.*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-haiku*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
-  postinstall_cmds='chmod 555 $lib'
-  # or fails outright, so override atomically:
-  install_override_mode=555
-  ;;
-
-interix[3-9]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux # correct to gnu/linux during the next big refactor
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-
-  # Some binutils ld are patched to set DT_RUNPATH
-  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_shlibpath_overrides_runpath=no
-    save_LDFLAGS=$LDFLAGS
-    save_libdir=$libdir
-    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
-	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
-  lt_cv_shlibpath_overrides_runpath=yes
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-    LDFLAGS=$save_LDFLAGS
-    libdir=$save_libdir
-
-fi
-
-  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
-hardcode_action_CXX=
-if test -n "$hardcode_libdir_flag_spec_CXX" ||
-   test -n "$runpath_var_CXX" ||
-   test "X$hardcode_automatic_CXX" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$hardcode_direct_CXX" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
-     test "$hardcode_minus_L_CXX" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action_CXX=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action_CXX=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action_CXX=unsupported
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
-$as_echo "$hardcode_action_CXX" >&6; }
-
-if test "$hardcode_action_CXX" = relink ||
-   test "$inherit_rpath_CXX" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-
-
-
-
-
-
-
-  fi # test -n "$compiler"
-
-  CC=$lt_save_CC
-  CFLAGS=$lt_save_CFLAGS
-  LDCXX=$LD
-  LD=$lt_save_LD
-  GCC=$lt_save_GCC
-  with_gnu_ld=$lt_save_with_gnu_ld
-  lt_cv_path_LDCXX=$lt_cv_path_LD
-  lt_cv_path_LD=$lt_save_path_LD
-  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
-  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-        ac_config_commands="$ac_config_commands libtool"
-
-
-
-
-# Only expand once:
-
-
-
-# newer libtool...
-
-
-
-
-echo "-----------------------------------------------"
-
-
-# Machine characteristics
-
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char" >&5
-$as_echo_n "checking size of char... " >&6; }
-if ${ac_cv_sizeof_char+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_char" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (char)
-See \`config.log' for more details" "$LINENO" 5; }
-   else
-     ac_cv_sizeof_char=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_char" >&5
-$as_echo "$ac_cv_sizeof_char" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_CHAR $ac_cv_sizeof_char
-_ACEOF
-
-
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5
-$as_echo_n "checking size of short... " >&6; }
-if ${ac_cv_sizeof_short+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_short" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (short)
-See \`config.log' for more details" "$LINENO" 5; }
-   else
-     ac_cv_sizeof_short=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5
-$as_echo "$ac_cv_sizeof_short" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_SHORT $ac_cv_sizeof_short
-_ACEOF
-
-
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
-$as_echo_n "checking size of int... " >&6; }
-if ${ac_cv_sizeof_int+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_int" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (int)
-See \`config.log' for more details" "$LINENO" 5; }
-   else
-     ac_cv_sizeof_int=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
-$as_echo "$ac_cv_sizeof_int" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_INT $ac_cv_sizeof_int
-_ACEOF
-
-
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
-$as_echo_n "checking size of long... " >&6; }
-if ${ac_cv_sizeof_long+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_long" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (long)
-See \`config.log' for more details" "$LINENO" 5; }
-   else
-     ac_cv_sizeof_long=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
-$as_echo "$ac_cv_sizeof_long" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_LONG $ac_cv_sizeof_long
-_ACEOF
-
-
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5
-$as_echo_n "checking size of long long... " >&6; }
-if ${ac_cv_sizeof_long_long+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_long_long" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (long long)
-See \`config.log' for more details" "$LINENO" 5; }
-   else
-     ac_cv_sizeof_long_long=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5
-$as_echo "$ac_cv_sizeof_long_long" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
-_ACEOF
-
-
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of __int64" >&5
-$as_echo_n "checking size of __int64... " >&6; }
-if ${ac_cv_sizeof___int64+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (__int64))" "ac_cv_sizeof___int64"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type___int64" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (__int64)
-See \`config.log' for more details" "$LINENO" 5; }
-   else
-     ac_cv_sizeof___int64=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof___int64" >&5
-$as_echo "$ac_cv_sizeof___int64" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF___INT64 $ac_cv_sizeof___int64
-_ACEOF
-
-
-
-# Checks for header files.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_cv_header_stdc=yes
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      return 2;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-for ac_header in float.h limits.h stddef.h stdlib.h string.h sys/time.h stdint.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-
-# check endianness of the architecture
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
-$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
-if ${ac_cv_c_bigendian+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_c_bigendian=unknown
-    # See if we're dealing with a universal compiler.
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifndef __APPLE_CC__
-	       not a universal capable compiler
-	     #endif
-	     typedef int dummy;
-
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-
-	# Check for potential -arch flags.  It is not universal unless
-	# there are at least two -arch flags with different values.
-	ac_arch=
-	ac_prev=
-	for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
-	 if test -n "$ac_prev"; then
-	   case $ac_word in
-	     i?86 | x86_64 | ppc | ppc64)
-	       if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
-		 ac_arch=$ac_word
-	       else
-		 ac_cv_c_bigendian=universal
-		 break
-	       fi
-	       ;;
-	   esac
-	   ac_prev=
-	 elif test "x$ac_word" = "x-arch"; then
-	   ac_prev=arch
-	 fi
-       done
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    if test $ac_cv_c_bigendian = unknown; then
-      # See if sys/param.h defines the BYTE_ORDER macro.
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-	     #include <sys/param.h>
-
-int
-main ()
-{
-#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
-		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
-		     && LITTLE_ENDIAN)
-	      bogus endian macros
-	     #endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  # It does; now see whether it defined to BIG_ENDIAN or not.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-		#include <sys/param.h>
-
-int
-main ()
-{
-#if BYTE_ORDER != BIG_ENDIAN
-		 not big endian
-		#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_cv_c_bigendian=yes
-else
-  ac_cv_c_bigendian=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    fi
-    if test $ac_cv_c_bigendian = unknown; then
-      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <limits.h>
-
-int
-main ()
-{
-#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
-	      bogus endian macros
-	     #endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  # It does; now see whether it defined to _BIG_ENDIAN or not.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <limits.h>
-
-int
-main ()
-{
-#ifndef _BIG_ENDIAN
-		 not big endian
-		#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_cv_c_bigendian=yes
-else
-  ac_cv_c_bigendian=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    fi
-    if test $ac_cv_c_bigendian = unknown; then
-      # Compile a test program.
-      if test "$cross_compiling" = yes; then :
-  # Try to guess by grepping values from an object file.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-short int ascii_mm[] =
-		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
-		short int ascii_ii[] =
-		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
-		int use_ascii (int i) {
-		  return ascii_mm[i] + ascii_ii[i];
-		}
-		short int ebcdic_ii[] =
-		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
-		short int ebcdic_mm[] =
-		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
-		int use_ebcdic (int i) {
-		  return ebcdic_mm[i] + ebcdic_ii[i];
-		}
-		extern int foo;
-
-int
-main ()
-{
-return use_ascii (foo) == use_ebcdic (foo);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
-	      ac_cv_c_bigendian=yes
-	    fi
-	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
-	      if test "$ac_cv_c_bigendian" = unknown; then
-		ac_cv_c_bigendian=no
-	      else
-		# finding both strings is unlikely to happen, but who knows?
-		ac_cv_c_bigendian=unknown
-	      fi
-	    fi
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-
-	     /* Are we little or big endian?  From Harbison&Steele.  */
-	     union
-	     {
-	       long int l;
-	       char c[sizeof (long int)];
-	     } u;
-	     u.l = 1;
-	     return u.c[sizeof (long int) - 1] == 1;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-  ac_cv_c_bigendian=no
-else
-  ac_cv_c_bigendian=yes
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-    fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
-$as_echo "$ac_cv_c_bigendian" >&6; }
- case $ac_cv_c_bigendian in #(
-   yes)
-
-$as_echo "#define HAVE_BIG_ENDIAN 1" >>confdefs.h
-;; #(
-   no)
-
-$as_echo "#define HAVE_LITTLE_ENDIAN 1" >>confdefs.h
- ;; #(
-   universal)
-
-$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
-
-     ;; #(
-   *)
-     as_fn_error $? "unknown endianness
- presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
- esac
-
-
-# Create some useful data types of fixed, known lengths
-
-# We hereby assume that a character is always one byte
-# LINBOX_INT8="char";
-
-# case $ac_cv_sizeof_char in
-  # 1)
-     # TWO_BYTES=2;
-     # FOUR_BYTES=4;
-     # EIGHT_BYTES=8;
-     # ;;
-  # 8)
-     # TWO_BYTES=16;
-     # FOUR_BYTES=32;
-     # EIGHT_BYTES=64;
-# esac
-
-# case $TWO_BYTES in
-  # $ac_cv_sizeof_short)
-     # LINBOX_INT16="short";
-     # ;;
-  # $ac_cv_sizeof_int)
-     # LINBOX_INT16="int";
-     # ;;
-# esac
-
-# case $FOUR_BYTES in
-  # $ac_cv_sizeof_short)
-     # LINBOX_INT32="short";
-     # ;;
-  # $ac_cv_sizeof_int)
-     # LINBOX_INT32="int";
-     # ;;
-  # $ac_cv_sizeof_long)
-     # LINBOX_INT32="long";
-     # ;;
-# esac
-
-# case $EIGHT_BYTES in
-  # $ac_cv_sizeof_short)
-     # LINBOX_INT64="short";
-     # ;;
-  # $ac_cv_sizeof_int)
-     # LINBOX_INT64="int";
-     # ;;
-  # $ac_cv_sizeof_long)
-     # LINBOX_INT64="long";
-     # ;;
-  # $ac_cv_sizeof_long_long)
-     # LINBOX_INT64="long long";
-     # ;;
-  # $ac_cv_sizeof___int64)
-     # LINBOX_INT64="__int64";
-     # ;;
-# esac
-
-# AC_DEFINE_UNQUOTED(INT8, $LINBOX_INT8, Canonical 8-bit data type)
-# AC_DEFINE_UNQUOTED(INT16, $LINBOX_INT16, Canonical 16-bit data type)
-# AC_DEFINE_UNQUOTED(INT32, $LINBOX_INT32, Canonical 32-bit data type)
-# AC_DEFINE_UNQUOTED(INT64, $LINBOX_INT64, Canonical 64-bit data type)
-
-echo "-----------------------------------------------"
-# Feature checks
-
-
-
-# Check whether --with-default was given.
-if test "${with_default+set}" = set; then :
-  withval=$with_default; if test "$withval" = yes ; then
-			echo "Default path = /usr /usr/local "
-			DEFAULT_CHECKING_PATH="/usr /usr/local "
-	      else
-			echo "Default path = $withval /usr /usr/local "
-			DEFAULT_CHECKING_PATH="$withval /usr /usr/local "
-	     fi
-
-else
-
-		echo "Default path = /usr /usr/local "
-		DEFAULT_CHECKING_PATH="/usr /usr/local "
-
-fi
-
-
-
-
-# Check whether --with-all was given.
-if test "${with_all+set}" = set; then :
-  withval=$with_all; if test "$withval" = yes ; then
-			check_all="yes"
-			echo "Checking all external packages in ${DEFAULT_CHECKING_PATH}"
-
-	      elif test "$withval" != no ; then
-			check_all="yes"
-			DEFAULT_CHECKING_PATH="$withval ${DEFAULT_CHECKING_PATH}"
-			echo "Checking all external packages in ${DEFAULT_CHECKING_PATH}"
-	     fi
-
-fi
-
-
-if test -n "$check_all"; then
-
-	GMP_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-	GIVARO_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-	NTL_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-	IML_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-    FFLAS_FFPACK_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-	LIDIA_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-	SACLIB_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-	MAPLE_HOME_PATH="${DEFAULT_CHECKING_PATH} unknown"
-	BLAS_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-fi
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to compile the drivers" >&5
-$as_echo_n "checking whether to compile the drivers... " >&6; }
-
-# Check whether --enable-drivers was given.
-if test "${enable_drivers+set}" = set; then :
-  enableval=$enable_drivers;
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-compile_drivers="yes"
-
-else
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-compile_drivers="no"
-
-fi
-
- if test "x$compile_drivers" = "xyes"; then
-  LINBOX_COMPILE_DRIVERS_TRUE=
-  LINBOX_COMPILE_DRIVERS_FALSE='#'
-else
-  LINBOX_COMPILE_DRIVERS_TRUE='#'
-  LINBOX_COMPILE_DRIVERS_FALSE=
-fi
-
-
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-echo "-----------------------------------------------"
-
-
-
-# Check whether --with-gmp was given.
-if test "${with_gmp+set}" = set; then :
-  withval=$with_gmp; if test "$withval" = yes ; then
-			GMP_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-	         elif test "$withval" != no ; then
-			GMP_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}"
-	        fi
-else
-  GMP_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-fi
-
-
-min_gmp_version=3.1.1
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GMP >= $min_gmp_version" >&5
-$as_echo_n "checking for GMP >= $min_gmp_version... " >&6; }
-
-for GMP_HOME in ${GMP_HOME_PATH}
-  do
-	if test -r "$GMP_HOME/include/gmp.h"; then
-
-		if test "x$GMP_HOME" != "x/usr" -a "x$GMP_HOME" != "x/usr/local"; then
-			GMP_CFLAGS="-I${GMP_HOME}/include"
-			GMP_LIBS="-L${GMP_HOME}/lib -lgmpxx -lgmp"
-		else
-			GMP_CFLAGS=
-			GMP_LIBS="-lgmpxx -lgmp"
-		fi
-
-		CXXFLAGS="${CXXFLAGS} ${GMP_CFLAGS}"
-		LIBS="${LIBS} ${GMP_LIBS}"
-
-		cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef __PATHCC__
-#include <rw/_defs.h>
-#include <ansi/_cstddef.h>
-#endif
-#include "stddef.h"
-		#include <gmp.h>
-
-int
-main ()
-{
-mpz_t a; mpz_init (a);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-        		if test "$cross_compiling" = yes; then :
-
-				{ $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
-				echo "WARNING: You appear to be cross compiling, so there is no way to determine"
-				echo "whether your GMP version is new enough. I am assuming it is."
-
-
-
-$as_echo "#define HAVE_GMP 1" >>confdefs.h
-
-				:
-				break
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef __PATHCC__
-#include <rw/_defs.h>
-		#include <ansi/_cstddef.h>
-		#include "stddef.h"
-#endif
-		#include <gmp.h>
-			 int main () {  if (__GNU_MP_VERSION < 3) return -1; else return 0; }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
-				{ $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
-
-
-
-$as_echo "#define HAVE_GMP 1" >>confdefs.h
-
-				# See if we are running GMP 4.0
-	   			{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GMP is 4.0 or greater" >&5
-$as_echo_n "checking whether GMP is 4.0 or greater... " >&6; }
-		   		if test "$cross_compiling" = yes; then :
-
-										{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef __PATHCC__
-#include <rw/_defs.h>
-		#include <ansi/_cstddef.h>
-		#include "stddef.h"
-#endif
-#include <gmp.h>
-	    			int main () { if (__GNU_MP_VERSION < 4) return -1; else return 0; }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
-					gmp_found="yes"
-					{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-					# See if GMP was compiled with --enable-cxx
-					{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GMP was compiled with --enable-cxx" >&5
-$as_echo_n "checking whether GMP was compiled with --enable-cxx... " >&6; }
-					if test "$cross_compiling" = yes; then :
-
-												{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <gmpxx.h>
-					int main () { mpz_class a(2),b(3),c(5); if ( a+b == c ) return 0; else return -1; }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
-						{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-						GMP_VERSION=""
-
-
-else
-
-						gmp_found="no"
-						{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
-					{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-$as_echo "#define GMP_VERSION_3 1" >>confdefs.h
-
-					GMP_VERSION="-DGMP_VERSION_3"
-
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-				:
-				break
-
-else
-
-				gmp_problem="$gmp_problem $GMP_HOME"
-				unset GMP_CFLAGS
-				unset GMP_LIBS
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
-		gmp_found="no"
-		unset GMP_CFLAGS
-		unset GMP_LIBS
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-	else
-		gmp_found="no"
-	fi
-done
-
-if test "x$gmp_found" != "xyes"; then
-	if test -n "$gmp_problem"; then
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
-		echo "Sorry, your GMP version is too old. Disabling."
-	elif test "x$gmp_found" != "xno"; then
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
-	fi
-	echo '*******************************************************************************'
-echo ' ERROR: GMP not found!'
-echo
-echo ' GMP library compiled with --enable-cxx is required for this library to compile.'
-echo ' Please make sure GMP is installed and specify its location with the option'
-echo ' --with-gmp=<prefix> when running configure.'
-echo '*******************************************************************************'
-exit 1
-
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-
-
-
-
-# Check whether --with-iml was given.
-if test "${with_iml+set}" = set; then :
-  withval=$with_iml; if test "$withval" = yes ; then
-        IML_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-        elif test "$withval" != no ; then
-        IML_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}"
-        fi
-else
-  IML_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-fi
-
-
-
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for IML" >&5
-$as_echo_n "checking for IML... " >&6; }
-
-for IML_HOME in ${IML_HOME_PATH}
-  do
-    if test -r "$IML_HOME/include/iml.h"; then
-
-       if test "x$IML_HOME" != "x/usr" -a "x$IML_HOME" != "x/usr/local"; then
-           IML_CFLAGS="-I${IML_HOME}/include"
-           IML_LIBS="-L${IML_HOME}/lib -liml"
-       else
-           IML_CFLAGS=
-           IML_LIBS="-liml"
-       fi
-
-       CXXFLAGS="${BACKUP_CXXFLAGS} ${IML_CFLAGS} ${GMP_CFLAGS}"
-       LIBS="${BACKUP_LIBS} ${IML_LIBS} ${GMP_LIBS}"
-
-       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <gmp.h>
-	   extern "C" {
-	   #include <iml.h>
-	   }
-int
-main ()
-{
-Double a;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-	   if test "$cross_compiling" = yes; then :
-
-	   iml_found="yes"
-	   iml_cross="yes"
-	   break
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-	   int main () { return 0; /* not possible to check version */ }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
-	   iml_found="yes"
-	   break
-
-else
-
-	   iml_problem="$problem $IML_HOME"
-	   unset IML_CFLAGS
-	   unset IML_LIBS
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
-       iml_found="no"
-       iml_checked="$checked $IML_HOME"
-       unset IML_CFLAGS
-       unset IML_LIBS
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-	       else
-       iml_found="no"
-	       fi
-done
-
-if test "x$iml_found" = "xyes" ; then
-
-
-
-$as_echo "#define HAVE_IML 1" >>confdefs.h
-
-    HAVE_IML=yes
-    if test "x$iml_cross" != "xyes"; then
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
-    else
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
-        echo "WARNING: You appear to be cross compiling, so there is no way to determine"
-        echo "whether your IML version is new enough. I am assuming it is."
-    fi
-    :
-elif test -n "$iml_problem"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
-    echo "Sorry, your IML version is too old. Disabling."
-    :
-elif test "x$iml_found" = "xno" ; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
-    :
-fi
-
- if test "x$HAVE_IML" = "xyes"; then
-  LINBOX_HAVE_IML_TRUE=
-  LINBOX_HAVE_IML_FALSE='#'
-else
-  LINBOX_HAVE_IML_TRUE='#'
-  LINBOX_HAVE_IML_FALSE=
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-
-
-
-# Check whether --with-m4ri was given.
-if test "${with_m4ri+set}" = set; then :
-  withval=$with_m4ri;
-fi
-
-
-if test "$withval" = yes ; then :
-   M4RI_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-elif  test "$withval" != no ; then :
-   M4RI_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}"
-else
-   M4RI_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-fi
-
-
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for M4RI" >&5
-$as_echo_n "checking for M4RI... " >&6; }
-
-for M4RI_HOME in ${M4RI_HOME_PATH}
-  do
-    if test -r "$M4RI_HOME/include/m4ri/m4ri.h"; then :
-
-
-       if  test "x$M4RI_HOME" != "x/usr" -a "x$M4RI_HOME" != "x/usr/local"; then :
-
-           M4RI_CFLAGS="-I${M4RI_HOME}/include"
-           M4RI_LIBS="-L${M4RI_HOME}/lib -lm4ri"
-else
-
-		   M4RI_CFLAGS=
-		   M4RI_LIBS="-lm4ri"
-fi
-
-       CXXFLAGS="${BACKUP_CXXFLAGS} ${M4RI_CFLAGS} ${GMP_CFLAGS}"
-       LIBS="${BACKUP_LIBS} ${M4RI_LIBS} ${GMP_LIBS}"
-
-       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <m4ri/m4ri.h>
-int
-main ()
-{
-mzd_t a;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-	   if test "$cross_compiling" = yes; then :
-
-	   m4ri_found="yes"
-	   m4ri_cross="yes"
-	   break
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-	   int main () { return 0; /* not possible to check version */ }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
-	   m4ri_found="yes"
-	   break
-
-else
-
-	   m4ri_problem="$problem $M4RI_HOME"
-	   unset M4RI_CFLAGS
-	   unset M4RI_LIBS
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
-       m4ri_found="no"
-       m4ri_checked="$checked $M4RI_HOME"
-       unset M4RI_CFLAGS
-       unset M4RI_LIBS
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-else
-
-       m4ri_found="no"
-
-fi
-done
-
-if test "x$m4ri_found" = "xyes"; then :
-
-
-
-
-$as_echo "#define HAVE_M4RI 1" >>confdefs.h
-
-		HAVE_M4RI=yes
-		if test "x$m4ri_cross" != "xyes"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
-			echo "WARNING: You appear to be cross compiling, so there is no way to determine"
-			echo "whether your M4RI version is new enough. I am assuming it is."
-
-fi
-		:
-elif  test -n "$m4ri_problem" ; then :
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
-		echo "Sorry, your M4RI version is too old. Disabling."
-		:
-elif  test "x$m4ri_found" = "xno" ; then :
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
-		:
-fi
-
- if test "x$HAVE_M4RI" = "xyes"; then
-  LINBOX_HAVE_M4RI_TRUE=
-  LINBOX_HAVE_M4RI_FALSE='#'
-else
-  LINBOX_HAVE_M4RI_TRUE='#'
-  LINBOX_HAVE_M4RI_FALSE=
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-
-
-
-# Check whether --with-m4rie was given.
-if test "${with_m4rie+set}" = set; then :
-  withval=$with_m4rie;
-fi
-
-
-if test "$withval" = yes ; then :
-   M4RIE_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-elif  test "$withval" != no ; then :
-   M4RIE_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}"
-else
-   M4RIE_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-fi
-
-
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for M4RIE" >&5
-$as_echo_n "checking for M4RIE... " >&6; }
-
-for M4RIE_HOME in ${M4RIE_HOME_PATH}
-  do
-    if test -r "$M4RIE_HOME/include/m4rie/m4rie.h"; then :
-
-
-       if  test "x$M4RIE_HOME" != "x/usr" -a "x$M4RIE_HOME" != "x/usr/local"; then :
-
-           M4RIE_CFLAGS="-I${M4RIE_HOME}/include"
-           M4RIE_LIBS="-L${M4RIE_HOME}/lib -lm4rie"
-else
-
-		   M4RIE_CFLAGS=
-		   M4RIE_LIBS="-lm4rie"
-fi
-
-       CXXFLAGS="${BACKUP_CXXFLAGS} ${M4RIE_CFLAGS} ${GMP_CFLAGS}"
-       LIBS="${BACKUP_LIBS} ${M4RIE_LIBS} ${GMP_LIBS}"
-
-       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <m4rie/m4rie.h>
-int
-main ()
-{
-gf2e a;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-	   if test "$cross_compiling" = yes; then :
-
-	   m4rie_found="yes"
-	   m4rie_cross="yes"
-	   break
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-	   int main () { return 0; /* not possible to check version */ }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
-	   m4rie_found="yes"
-	   break
-
-else
-
-	   m4rie_problem="$problem $M4RIE_HOME"
-	   unset M4RIE_CFLAGS
-	   unset M4RIE_LIBS
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
-       m4rie_found="no"
-       m4rie_checked="$checked $M4RIE_HOME"
-       unset M4RIE_CFLAGS
-       unset M4RIE_LIBS
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-else
-
-       m4rie_found="no"
-
-fi
-done
-
-if test "x$m4rie_found" = "xyes"; then :
-
-
-
-
-$as_echo "#define HAVE_M4RIE 1" >>confdefs.h
-
-		HAVE_M4RIE=yes
-		if test "x$m4rie_cross" != "xyes"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
-			echo "WARNING: You appear to be cross compiling, so there is no way to determine"
-			echo "whether your M4RIE version is new enough. I am assuming it is."
-
-fi
-		:
-elif  test -n "$m4rie_problem" ; then :
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
-		echo "Sorry, your M4RIE version is too old. Disabling."
-		:
-elif  test "x$m4rie_found" = "xno" ; then :
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
-		:
-fi
-
- if test "x$HAVE_M4RIE" = "xyes"; then
-  LINBOX_HAVE_M4RIE_TRUE=
-  LINBOX_HAVE_M4RIE_FALSE='#'
-else
-  LINBOX_HAVE_M4RIE_TRUE='#'
-  LINBOX_HAVE_M4RIE_FALSE=
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-
-
-
-# Check whether --with-mpfr was given.
-if test "${with_mpfr+set}" = set; then :
-  withval=$with_mpfr; if test "$withval" = yes ; then
-        MPFR_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-        elif test "$withval" != no ; then
-        MPFR_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}"
-        fi
-else
-  MPFR_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-fi
-
-
-
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MPFR" >&5
-$as_echo_n "checking for MPFR... " >&6; }
-
-for MPFR_HOME in ${MPFR_HOME_PATH}
-  do
-    if test -r "$MPFR_HOME/include/mpfr.h"; then
-
-       if  test "x$MPFR_HOME" != "x/usr" -a "x$MPFR_HOME" != "x/usr/local"; then :
-
-           MPFR_CFLAGS="-I${MPFR_HOME}/include"
-           MPFR_LIBS="-L${MPFR_HOME}/lib -lmpfr"
-
-else
-
-           MPFR_CFLAGS=
-           MPFR_LIBS="-lmpfr"
-
-fi
-
-       CXXFLAGS="${BACKUP_CXXFLAGS} ${MPFR_CFLAGS} ${GMP_CFLAGS}"
-       LIBS="${BACKUP_LIBS} ${GMP_LIBS} ${MPFR_LIBS} "
-
-       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-	   #include <mpfr.h>
-
-int
-main ()
-{
-mpfr_t a ;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-	   if test "$cross_compiling" = yes; then :
-
-	   mpfr_found="yes"
-	   mpfr_cross="yes"
-	   break
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-	   int main () { return 0; /* not important to check for  version */ }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
-	   mpfr_found="yes"
-	   break
-
-else
-
-	   mpfr_problem="$problem $MPFR_HOME"
-	   unset MPFR_CFLAGS
-	   unset MPFR_LIBS
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
-       mpfr_found="no"
-       mpfr_checked="$checked $MPFR_HOME"
-       unset MPFR_CFLAGS
-       unset MPFR_LIBS
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-	       else
-       mpfr_found="no"
-	       fi
-done
-
-if test "x$mpfr_found" = "xyes" ; then
-
-
-
-$as_echo "#define HAVE_MPFR 1" >>confdefs.h
-
-    HAVE_MPFR=yes
-    if  test "x$mpfr_cross" != "xyes" ; then :
-
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
-
-else
-
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
-        echo "WARNING: You appear to be cross compiling, so there is no way to determine"
-        echo "whether your MPFR version is new enough. I am assuming it is."
-
-fi
-    :
-elif test -n "$mpfr_problem"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
-    echo "Sorry, your MPFR version is too old. Disabling."
-    :
-elif test "x$mpfr_found" = "xno" ; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
-    :
-fi
-
- if test "x$HAVE_MPFR" = "xyes"; then
-  LINBOX_HAVE_MPFR_TRUE=
-  LINBOX_HAVE_MPFR_FALSE='#'
-else
-  LINBOX_HAVE_MPFR_TRUE='#'
-  LINBOX_HAVE_MPFR_FALSE=
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-# we nedd mpfr next :
-
-
-
-# Check whether --with-fplll was given.
-if test "${with_fplll+set}" = set; then :
-  withval=$with_fplll; if test "$withval" = yes ; then
-        FPLLL_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-        elif test "$withval" != no ; then
-        FPLLL_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}"
-        fi
-else
-  FPLLL_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-fi
-
-
-
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FPLLL" >&5
-$as_echo_n "checking for FPLLL... " >&6; }
-
-for FPLLL_HOME in ${FPLLL_HOME_PATH}
-  do
-    if test -r "$FPLLL_HOME/include/fplll/fplll.h"; then
-
-       if  test "x$FPLLL_HOME" != "x/usr" -a "x$FPLLL_HOME" != "x/usr/local"; then :
-
-           FPLLL_CFLAGS="-I${FPLLL_HOME}/include"
-           FPLLL_LIBS="-L${FPLLL_HOME}/lib -lfplll"
-
-else
-
-           FPLLL_CFLAGS=
-           FPLLL_LIBS="-lfplll"
-
-fi
-
-       CXXFLAGS="${BACKUP_CXXFLAGS} ${MPFR_CFLAGS} ${FPLLL_CFLAGS} ${GMP_CFLAGS}"
-       LIBS="${BACKUP_LIBS} ${GMP_LIBS} ${MPFR_LIBS} ${FPLLL_LIBS} "
-
-       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-	   #include <fplll/fplll.h>
-	   #include <fplll/solver.h>
-
-int
-main ()
-{
-enum EvaluatorType a ;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-	   if test "$cross_compiling" = yes; then :
-
-	   fplll_found="yes"
-	   fplll_cross="yes"
-	   break
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-	   int main () { return 0; /* not important to check for  version */ }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
-	   fplll_found="yes"
-	   break
-
-else
-
-	   fplll_problem="$problem $FPLLL_HOME"
-	   unset FPLLL_CFLAGS
-	   unset FPLLL_LIBS
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
-       fplll_found="no"
-       fplll_checked="$checked $FPLLL_HOME"
-       unset FPLLL_CFLAGS
-       unset FPLLL_LIBS
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-	       else
-       fplll_found="no"
-	       fi
-done
-
-if test "x$fplll_found" = "xyes" ; then
-
-
-
-$as_echo "#define HAVE_FPLLL 1" >>confdefs.h
-
-    HAVE_FPLLL=yes
-    if  test "x$fplll_cross" != "xyes" ; then :
-
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
-
-else
-
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
-        echo "WARNING: You appear to be cross compiling, so there is no way to determine"
-        echo "whether your FPLLL version is new enough. I am assuming it is."
-
-fi
-    :
-elif test -n "$fplll_problem"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
-    echo "Sorry, your FPLLL version is too old. Disabling."
-    :
-elif test "x$fplll_found" = "xno" ; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
-    :
-fi
-
- if test "x$HAVE_FPLLL" = "xyes"; then
-  LINBOX_HAVE_FPLLL_TRUE=
-  LINBOX_HAVE_FPLLL_FALSE='#'
-else
-  LINBOX_HAVE_FPLLL_TRUE='#'
-  LINBOX_HAVE_FPLLL_FALSE=
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-
-
-
-
-# Check whether --with-ntl was given.
-if test "${with_ntl+set}" = set; then :
-  withval=$with_ntl; if test "$withval" = yes ; then
-			NTL_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-	      elif test "$withval" != no ; then
-			NTL_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}"
-	     fi
-else
-  NTL_HOME_PATH=${DEFAULT_CHECKING_PATH}
-fi
-
-
-min_ntl_version=5.0
-
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-if test -n "$NTL_HOME_PATH"; then
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for NTL >= $min_ntl_version" >&5
-$as_echo_n "checking for NTL >= $min_ntl_version... " >&6; }
-fi
-
-for NTL_HOME in ${NTL_HOME_PATH}
- do
-if test -r "$NTL_HOME/include/NTL/ZZ.h"; then
-
-	if test "x$NTL_HOME" != "x/usr" -a "x$NTL_HOME" != "x/usr/local"; then
-		NTL_CFLAGS="-I${NTL_HOME}/include"
-		NTL_LIBS="-L${NTL_HOME}/lib -lntl"
-	else
-		NTL_CFLAGS=
-		NTL_LIBS="-lntl"
-	fi
-	CXXFLAGS="${BACKUP_CXXFLAGS} ${NTL_CFLAGS} ${GMP_CFLAGS}"
-	LIBS="${BACKUP_LIBS} ${NTL_LIBS} ${GMP_LIBS}"
-
-	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <NTL/ZZ.h>
-int
-main ()
-{
-NTL::ZZ a;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-	if test "$cross_compiling" = yes; then :
-
-	ntl_found="yes"
-	ntl_cross="yes"
-	break
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <NTL/version.h>
-	int main () { if (NTL_MAJOR_VERSION < 5) return -1; else return 0; }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
-	ntl_found="yes"
-	break
-
-else
-
-	ntl_problem="$problem $NTL_HOME"
-	unset NTL_CFLAGS
-	unset NTL_LIBS
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
-	ntl_found="no"
-	ntl_checked="$checked $NTL_HOME"
-	unset NTL_CFLAGS
-	unset NTL_LIBS
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-else
-	ntl_found="no"
-fi
-done
-
-if test "x$ntl_found" = "xyes" ; then
-
-
-
-$as_echo "#define HAVE_NTL 1" >>confdefs.h
-
-	HAVE_NTL=yes
-	if test "x$ntl_cross" != "xyes"; then
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
-	else
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
-		echo "WARNING: You appear to be cross compiling, so there is no way to determine"
-		echo "whether your NTL version is new enough. I am assuming it is."
-	fi
-	:
-elif test -n "$ntl_problem"; then
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
-	echo "Sorry, your NTL version is too old. Disabling."
-	:
-elif test   "x$ntl_found" = "xno";  then
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
-	if test "x$NTL_HOME" != "x/usr" -a "x$NTL_HOME" != "x/usr/local" ; then
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: NTL >= $min_ntl_version was not found. LinBox also requires the NTL namespace to be enabled.  Please make sure NTL is compiled correctly." >&5
-$as_echo "$as_me: WARNING: NTL >= $min_ntl_version was not found. LinBox also requires the NTL namespace to be enabled.  Please make sure NTL is compiled correctly." >&2;}
-	fi
-	:
-fi
-
-
-
- if test "x$HAVE_NTL" = "xyes"; then
-  LINBOX_HAVE_NTL_TRUE=
-  LINBOX_HAVE_NTL_FALSE='#'
-else
-  LINBOX_HAVE_NTL_TRUE='#'
-  LINBOX_HAVE_NTL_FALSE=
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-
-
-
-# Check whether --with-givaro was given.
-if test "${with_givaro+set}" = set; then :
-  withval=$with_givaro; if test "$withval" = yes ; then
-			GIVARO_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-	      elif test "$withval" != no ; then
-			GIVARO_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}"
-	     fi
-else
-  GIVARO_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-fi
-
-
-
-version_min=30700
-version_max=30800
-
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GIVARO >= $version_min and < $version_max" >&5
-$as_echo_n "checking for GIVARO >= $version_min and < $version_max... " >&6; }
-
-for GIVARO_HOME in ${GIVARO_HOME_PATH}
- do
-if test -r "$GIVARO_HOME/include/givaro/givconfig.h"; then
-
-	if test "x$GIVARO_HOME" != "x/usr" -a "x$GIVARO_HOME" != "x/usr/local"; then
-		GIVARO_CFLAGS="-I${GIVARO_HOME}/include"
-		GIVARO_LIBS="-L${GIVARO_HOME}/lib -lgivaro"
-	else
-		GIVARO_CFLAGS=
-		GIVARO_LIBS="-lgivaro"
-	fi
-	CXXFLAGS="${BACKUP_CXXFLAGS} ${GIVARO_CFLAGS} ${GMP_CFLAGS}"
-	LIBS="${BACKUP_LIBS} ${GIVARO_LIBS} ${GMP_LIBS}"
-
-	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <givaro/givinteger.h>
-int
-main ()
-{
-Givaro::Integer a;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-	if test "$cross_compiling" = yes; then :
-
-	givaro_found="yes"
-	givaro_cross="yes"
-
-	break
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <givaro/givconfig.h>
-	 int main () { if (GIVARO_VERSION < $version_min || GIVARO_VERSION >= $version_max || GIVARO_VERSION>0x030000) return -1; else return 0; /* old version of Givaro are defined as hexa 0x03yyzz*/ }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
-	givaro_found="yes"
-	break
-
-else
-
-	givaro_problem="$problem $GIVARO_HOME"
-	unset GIVARO_CFLAGS
-	unset GIVARO_LIBS
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
-	givaro_found="no"
-	givaro_checked="$checked $GIVARO_HOME"
-	unset GIVARO_CFLAGS
-	unset GIVARO_LIBS
-
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-else
-	givaro_found="no"
-fi
-done
-
-if test "x$givaro_found" = "xyes" ; then
-
-
-
-$as_echo "#define HAVE_GIVARO 1" >>confdefs.h
-
-	HAVE_GIVARO=yes
-	if test "x$givaro_cross" != "xyes"; then
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
-	else
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
-		echo "WARNING: You appear to be cross compiling, so there is no way to determine"
-		echo "whether your GIVARO version is new enough. I am assuming it is."
-	fi
-	:
-elif test -n "$givaro_problem"; then
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
-	echo "Sorry, your GIVARO version is too old. Disabling."
-
-echo '*******************************************************************************'
-echo ' ERROR: GIVARO not found!'
-echo
-echo ' GIVARO library is required for this library to compile.'
-echo ' Please make sure GIVARO is installed and specify its location with the'
-echo ' option --with-givaro=<prefix> when running configure.'
-echo '*******************************************************************************'
-exit 1
-
-elif test "x$givaro_found" = "xno" ; then
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
-
-echo '*******************************************************************************'
-echo ' ERROR: GIVARO not found!'
-echo
-echo ' GIVARO library is required for this library to compile.'
-echo ' Please make sure GIVARO is installed and specify its location with the'
-echo ' option --with-givaro=<prefix> when running configure.'
-echo '*******************************************************************************'
-exit 1
-
-fi
-
- if test "x$HAVE_GIVARO" = "xyes"; then
-  LINBOX_HAVE_GIVARO_TRUE=
-  LINBOX_HAVE_GIVARO_FALSE='#'
-else
-  LINBOX_HAVE_GIVARO_TRUE='#'
-  LINBOX_HAVE_GIVARO_FALSE=
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-
-
-
-
-
-# Check whether --with-saclib was given.
-if test "${with_saclib+set}" = set; then :
-  withval=$with_saclib; if test "$withval" = yes ; then
-			SACLIB_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-	      elif test "$withval" != no ; then
-			SACLIB_HOME_PATH="$withval"
-	     fi
-fi
-
-
-min_saclib_version=2.0
-
-
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-if test -n  "$SACLIB_HOME_PATH"; then
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SACLIB >= $min_saclib_version" >&5
-$as_echo_n "checking for SACLIB >= $min_saclib_version... " >&6; }
-fi
-
-for SACLIB_HOME in ${SACLIB_HOME_PATH}
- do
-if test -r "$SACLIB_HOME/include/saclib.h"; then
-
-	if test "x$SACLIB_HOME" != "x/usr" -a "x$SACLIB_HOME" != "x/usr/local"; then
-		SACLIB_CFLAGS="-I${SACLIB_HOME}/include"
-		SACLIB_LIBS="-L${SACLIB_HOME}/lib -lsaclib"
-	else
-		SACLIB_CFLAGS=
-		SACLIB_LIBS="-lsaclib"
-	fi
-
-	CXXFLAGS="${BACKUP_CXXFLAGS} ${SACLIB_CFLAGS} ${GMP_CFLAGS}" 	LIBS="${BACKUP_LIBS} ${SACLIB_LIBS} ${GMP_LIBS}"
-
-	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <saclib.h>
-int
-main ()
-{
-BDigit a;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-	if test "$cross_compiling" = yes; then :
-
-	saclib_found="yes"
-	saclib_cross="yes"
-	break
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <saclib.h>
-	int main () {  if ( __GNU_MP_VERSION < 3) return -1; else return 0; }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
-	saclib_found="yes"
-	break
-
-else
-
-	saclib_problem="$problem $SACLIB_HOME"
-	unset SACLIB_CFLAGS
-	unset SACLIB_LIBS
-
-
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
-	saclib_found="no"
-	saclib_checked="$saclib_checked $SACLIB_HOME"
-	unset SACLIB_CFLAGS
-	unset SACLIB_LIBS
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-else
-	saclib_found="no"
-
-fi
-done
-
-
-if test "x$saclib_found" = "xyes" ; then
-
-
-
-$as_echo "#define HAVE_SACLIB 1" >>confdefs.h
-
-	HAVE_SACLIB=yes
-
-	if test "x$saclib_cross" != "xyes"; then
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
-	else
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
-		echo "WARNING: You appear to be cross compiling, so there is no way to determine"
-		echo "whether your SACLIB version is new enough. I am assuming it is."
-	fi
-	:
-elif test -n "$saclib_problem"; then
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
-	echo "Sorry, your SACLIB version is too old. Disabling."
-	:
-elif test "x$saclib_found" = "xno" ; then
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
-	:
-fi
-
-
-
- if test "x$HAVE_SACLIB" = "xyes"; then
-  LINBOX_HAVE_SACLIB_TRUE=
-  LINBOX_HAVE_SACLIB_FALSE='#'
-else
-  LINBOX_HAVE_SACLIB_TRUE='#'
-  LINBOX_HAVE_SACLIB_FALSE=
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-
-
-
-# Check whether --with-lidia was given.
-if test "${with_lidia+set}" = set; then :
-  withval=$with_lidia; if test "$withval" = yes ; then
-			LIDIA_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-	      elif test "$withval" != no ; then
-			LIDIA_HOME_PATH="$withval"
-	     fi
-fi
-
-
-min_lidia_version=2.1
-
-
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-if test -n "$LIDIA_HOME_PATH" ; then
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIDIA >= $min_lidia_version" >&5
-$as_echo_n "checking for LIDIA >= $min_lidia_version... " >&6; }
-fi
-
-for LIDIA_HOME in ${LIDIA_HOME_PATH}
- do
-if test -r "$LIDIA_HOME/include/LiDIA/LiDIA.h"; then
-	if test "x$LIDIA_HOME" != "x/usr" -a "x$LIDIA_HOME" != "x/usr/local"; then
-		LIDIA_CFLAGS="-I${LIDIA_HOME}/include"
-		LIDIA_LIBS="-L${LIDIA_HOME}/lib -lLiDIA"
-	else
-		LIDIA_CFLAGS=
-		LIDIA_LIBS="-lLiDIA"
-	fi
-	CXXFLAGS="${BACKUP_CXXFLAGS} ${LIDIA_CFLAGS} ${GMP_CFLAGS}"
-	LIBS="${BACKUP_LIBS} ${LIDIA_LIBS} ${GMP_LIBS}"
-
-	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <LiDIA/bigint.h>
-int
-main ()
-{
-LiDIA::bigint a;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-	if test "$cross_compiling" = yes; then :
-
-	lidia_found="yes"
-	lidia_cross="yes"
-	break
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <LiDIA/LiDIA.h>
-	int main () {  if (LIDIA_MAJOR_VERSION < 2) return -1; else return 0; }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
-	lidia_found="yes"
-	break
-
-else
-
-	lidia_problem="$problem $LIDIA_HOME"
-	unset LIDIA_CFLAGS
-	unset LIDIA_LIBS
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
-	lidia_found="no"
-	lidia_checked="$checked $LIDIA_HOME"
-	unset LIDIA_CFLAGS
-	unset LIDIA_LIBS
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-else
-	lidia_found="no"
-fi
-done
-
-if test "x$lidia_found" = "xyes" ; then
-
-
-
-$as_echo "#define HAVE_LIDIA 1" >>confdefs.h
-
-	HAVE_LIDIA=yes
-	if test "x$lidia_cross" != "xyes"; then
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
-	else
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
-		echo "WARNING: You appear to be cross compiling, so there is no way to determine"
-		echo "whether your LIDIA version is new enough. I am assuming it is."
-	fi
-	:
-elif test -n "$lidia_problem"; then
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
-	echo "Sorry, your LIDIA version is too old. Disabling."
-	:
-elif test "x$lidia_found" = "xno" ; then
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
-	:
-fi
-
-
- if test "x$HAVE_LIDIA" = "xyes"; then
-  LINBOX_HAVE_LIDIA_TRUE=
-  LINBOX_HAVE_LIDIA_FALSE='#'
-else
-  LINBOX_HAVE_LIDIA_TRUE='#'
-  LINBOX_HAVE_LIDIA_FALSE=
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-
-
-
-# Check whether --with-maple was given.
-if test "${with_maple+set}" = set; then :
-  withval=$with_maple; if test "$withval" = yes ; then
-		MAPLE_HOME_PATH="${DEFAULT_CHECKING_PATH} unknown"
-	      elif test "$withval" != no ; then
-		MAPLE_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH} unknown"
-	     fi
-fi
-
-
-# Check whether --enable-shared was given.
-if test "${enable_shared+set}" = set; then :
-  enableval=$enable_shared; have_shared="$enableval"
-else
-  have_shared="no"
-fi
-
-
-if test -n "$MAPLE_HOME_PATH" ; then
-min_maple_version=9.0
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MAPLE >= $min_maple_version" >&5
-$as_echo_n "checking for MAPLE >= $min_maple_version... " >&6; }
-fi
-
-eval LIB_DIR=${libdir}
-if test ${LIB_DIR} = "NONE/lib" ; then
-	eval LIB_DIR="${prefix}/lib"
-fi
-
-
-for MAPLE_HOME in ${MAPLE_HOME_PATH}
-do
-		if test "x$MAPLE_HOME" != "xunknown"; then
-			if test -r "${MAPLE_HOME}/bin/maple.system.type" && test -r "${MAPLE_HOME}/extern/include/maplec.h" ; then
-				MAPLE_BIN=${MAPLE_HOME}/`${MAPLE_HOME}/bin/maple.system.type`
-			else
-				MAPLE_BIN=""
-			fi
-		else
-			if test -r "/usr/local/bin/xmaple" && test -r "/usr/local/bin/maple.system.type"; then
-					MAPLE_HOME=`sed -ne "s/MAPLE='\(.*\)'/\\1/p" /usr/local/bin/xmaple`
-					MAPLE_BIN="${MAPLE_HOME}/"`${MAPLE_HOME}/bin/maple.system.type`
-			elif test -r "/usr/bin/xmaple" ; then
-					MAPLE_HOME=`sed -ne "s/MAPLE='\(.*\)'/\\1/p" /usr/bin/xmaple`
-					MAPLE_BIN="${MAPLE_HOME}/"`${MAPLE_HOME}/bin/maple.system.type`
-			else
-					MAPLE_BIN=""
-			fi
-		fi
-
-		if test -z "${MAPLE_BIN}" ; then
-			maple_found="no"
-		else
-			maple_found="yes"
-			if test $have_shared = "yes"; then
-				${MAPLE_HOME}/bin/maple macros/maple-check-version.mpl > /dev/null
-				MAPLE_VERSION=`cat maple_version.txt`
-
-				if test ${MAPLE_VERSION} -lt 9; then
-					{ $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
-					echo " your version of Maple is too old, at least version 9 is recquired. Disabling."
-					break
-				else
-					{ $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
-					LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${MAPLE_BIN}:${LIB_DIR}"
-					LD_RUN_PATH="${LD_RUN_PATH}:${MAPLE_BIN}:${LIB_DIR}"
-					export LD_LIBRARY_PATH
-					export LD_RUN_PATH
-					MAPLE_LIBS="-L${MAPLE_BIN} -lmaplec -lstdc++"
-					MAPLE_CFLAGS="-I${MAPLE_HOME}/extern/include"
-
-
-
-
-					if test ${MAPLE_VERSION} -ge 10 	; then
-
-cat >>confdefs.h <<_ACEOF
-#define MAPLE_GMP_ACCESS /**/
-_ACEOF
-
-					fi
-
-$as_echo "#define HAVE_MAPLE 1" >>confdefs.h
-
-					HAVE_MAPLE=yes
-					break
-				fi
-			else
-				{ $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
-				echo " you need to give option --enable-shared to allow Maple interfacing. Disabling."
-				break
-			fi
-		fi
-done
-
-if test "x$maple_found" = "xno" ; then
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
-	$as_echo "#define HAVE_MAPLE 0" >>confdefs.h
-
-fi
-
- if test "x$HAVE_MAPLE" = "xyes"; then
-  LINBOX_HAVE_MAPLE_TRUE=
-  LINBOX_HAVE_MAPLE_FALSE='#'
-else
-  LINBOX_HAVE_MAPLE_TRUE='#'
-  LINBOX_HAVE_MAPLE_FALSE=
-fi
-
- if test "x$compile_drivers" = "xyes" -o "x$HAVE_MAPLE" = "xyes" ; then
-  LINBOX_COMPILE_DRIVERS_TRUE=
-  LINBOX_COMPILE_DRIVERS_FALSE='#'
-else
-  LINBOX_COMPILE_DRIVERS_TRUE='#'
-  LINBOX_COMPILE_DRIVERS_FALSE=
-fi
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to compile the SAGE interface" >&5
-$as_echo_n "checking whether to compile the SAGE interface... " >&6; }
-
-# Check whether --enable-sage was given.
-if test "${enable_sage+set}" = set; then :
-  enableval=$enable_sage;
-fi
-
- if test "x$enable_sage" = "xyes"; then
-  LINBOX_HAVE_SAGE_TRUE=
-  LINBOX_HAVE_SAGE_FALSE='#'
-else
-  LINBOX_HAVE_SAGE_TRUE='#'
-  LINBOX_HAVE_SAGE_FALSE=
-fi
-
-if test "x$enable_sage" = "xyes"; then :
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-
-
-
-else
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-fi
-
-#LB_CHECK_ATLAS
-
-# LB_CHECK_BLAS(,,[
-# echo ''
-# echo '*******************************************************************************'
-# echo ' ERROR: BLAS not found!'
-# echo
-# echo ' BLAS routines are required for this library to compile. Please'
-# echo ' make sure BLAS are installed and specify its location with the option'
-# echo ' --with-blas=<lib> when running configure.'
-# echo '*******************************************************************************'
-# exit 1
-# ])
-
-
-
-
-
-# Check whether --with-fflas-ffpack was given.
-if test "${with_fflas_ffpack+set}" = set; then :
-  withval=$with_fflas_ffpack; if test "$withval" = yes ; then
-        FFLAS_FFPACK_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-        elif test "$withval" != no ; then
-        FFLAS_FFPACK_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}"
-        fi
-else
-  FFLAS_FFPACK_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-fi
-
-
-
-
-version_min=10600
-version_max=10700
-
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FFLAS-FFPACK >= $version_min and < $version_max" >&5
-$as_echo_n "checking for FFLAS-FFPACK >= $version_min and < $version_max... " >&6; }
-
-for FFLAS_FFPACK_HOME in ${FFLAS_FFPACK_HOME_PATH}
-  do
-    if test -r "$FFLAS_FFPACK_HOME/include/fflas-ffpack/fflas-ffpack.h" -a -x "$FFLAS_FFPACK_HOME/bin/fflas-ffpack-config"; then
-
-		BLAS_LIBS=`$FFLAS_FFPACK_HOME/bin/fflas-ffpack-config --blas-libs`
-		BLAS_CFLAGS=`$FFLAS_FFPACK_HOME/bin/fflas-ffpack-config --cflags`
-
-
-       if test "x$FFLAS_FFPACK_HOME" != "x/usr" -a "x$FFLAS_FFPACK_HOME" != "x/usr/local"; then
-           FFLAS_FFPACK_CFLAGS="-I${FFLAS_FFPACK_HOME}/include"
-       else
-           FFLAS_FFPACK_CFLAGS=
-       fi
-
-       CXXFLAGS="${BACKUP_CXXFLAGS} ${FFLAS_FFPACK_CFLAGS} ${BLAS_CFLAGS}"
-       LIBS="${BACKUP_LIBS} ${BLAS_LIBS}"
-
-       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include "fflas-ffpack/fflas-ffpack.h"
-int
-main ()
-{
-FFLAS::FFLAS_TRANSPOSE a;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-
-	FF_VER=`$FFLAS_FFPACK_HOME/bin/fflas-ffpack-config --decimal-version`
-	if  test $FF_VER -ge $version_min -a $FF_VER -lt $version_max ; then :
-
-		ffflasffpack_found="yes"
-		FFLAS_FFPACK_LOC="$FFLAS_FFPACK_HOME"
-		break
-
-else
-
-		ffflasffpack_found="no"
-
-
-fi
-
-else
-
-       ffflasffpack_found="no"
-       ffflasffpack_checked="$checked $FFLAS_FFPACK_HOME"
-       unset FFLAS_FFPACK_CFLAGS
-	   unset FFLAS_FFPACK_LOC
-	   unset BLAS_LIBS
-	   unset BLAS_CFLAGS
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-	       else
-       fflasflas_found="no"
-	       fi
-done
-
-if test "x$ffflasffpack_found" = "xyes" ; then
-
-
-
-
-
-
-$as_echo "#define HAVE_FFLAS_FFPACK 1" >>confdefs.h
-
-	FF_VER=`$FFLAS_FFPACK_LOC/bin/fflas-ffpack-config --decimal-version`
-
-cat >>confdefs.h <<_ACEOF
-#define FFLAS_FFPACK_VERSION $FF_VER
-_ACEOF
-
-	HAVE_FFLAS_FFPACK=yes
-    if test "x$fflasflas_cross" != "xyes"; then
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
-    else
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
-        echo "WARNING: You appear to be cross compiling, so there is no way to determine"
-        echo "whether your FFLAS-FFPACK version is new enough. I am assuming it is."
-    fi
-    :
-elif test -n "$fflasflas_problem"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
-    echo "Sorry, your FFLAS-FFPACK version is too old. Disabling."
-
-echo ''
-echo '*******************************************************************************'
-echo ' ERROR: Fflas-Ffpack not found!'
-echo
-echo ' Fflas-Ffpack routines  are required for this library to compile. Please'
-echo ' make sure they are installed and specify its location with the option'
-echo ' --with-fflas-ffpack=<lib> when running configure.'
-echo '*******************************************************************************'
-exit 1
-
-elif test "x$fflasflas_found" = "xno" ; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
-
-echo ''
-echo '*******************************************************************************'
-echo ' ERROR: Fflas-Ffpack not found!'
-echo
-echo ' Fflas-Ffpack routines  are required for this library to compile. Please'
-echo ' make sure they are installed and specify its location with the option'
-echo ' --with-fflas-ffpack=<lib> when running configure.'
-echo '*******************************************************************************'
-exit 1
-
-fi
-
- if test "x$HAVE_FFLAS_FFPACK" = "xyes"; then
-  LINBOX_HAVE_FFLAS_FFPACK_TRUE=
-  LINBOX_HAVE_FFLAS_FFPACK_FALSE='#'
-else
-  LINBOX_HAVE_FFLAS_FFPACK_TRUE='#'
-  LINBOX_HAVE_FFLAS_FFPACK_FALSE=
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LAPACK in fflas-ffpack" >&5
-$as_echo_n "checking for LAPACK in fflas-ffpack... " >&6; }
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-CXXFLAGS="${BACKUP_CXXFLAGS} ${FFLAS_FFPACK_CFLAGS} ${BLAS_CFLAGS}"
-LIBS="${BACKUP_LIBS} ${BLAS_LIBS}"
-
-if test "$cross_compiling" = yes; then :
-
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
-    if false; then
-  LINBOX_HAVE_LAPACK_TRUE=
-  LINBOX_HAVE_LAPACK_FALSE='#'
-else
-  LINBOX_HAVE_LAPACK_TRUE='#'
-  LINBOX_HAVE_LAPACK_FALSE=
-fi
-
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-   #include "fflas-ffpack/fflas-ffpack-config.h"
-	#ifdef __FFLAS_FFPACK_HAVE_LAPACK
-	   int main() { return 0 ; }
-   #else
-   a pas lapack
-   #endif
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-     { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
-$as_echo "ok" >&6; }
-
-$as_echo "#define HAVE_LAPACK 1" >>confdefs.h
-
-    if true; then
-  LINBOX_HAVE_LAPACK_TRUE=
-  LINBOX_HAVE_LAPACK_FALSE='#'
-else
-  LINBOX_HAVE_LAPACK_TRUE='#'
-  LINBOX_HAVE_LAPACK_FALSE=
-fi
-
-
-else
-
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-	 if false; then
-  LINBOX_HAVE_LAPACK_TRUE=
-  LINBOX_HAVE_LAPACK_FALSE='#'
-else
-  LINBOX_HAVE_LAPACK_TRUE='#'
-  LINBOX_HAVE_LAPACK_FALSE=
-fi
-
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-
-
-
-
-# AC_MSG_RESULT($BLAS_LIBS)
-# AC_MSG_RESULT($BLAS_CFLAGS)
-
-
-
-
-
-# Check whether --with-expat was given.
-if test "${with_expat+set}" = set; then :
-  withval=$with_expat; if test "$withval" = yes ; then
-			EXPAT_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-	      elif test "$withval" != no ; then
-			EXPAT_HOME_PATH="$withval"
-	     fi
-fi
-
-
-min_expat_version=1.95
-
-
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-if test -n "$EXPAT_HOME_PATH"; then
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for EXPAT >= $min_expat_version" >&5
-$as_echo_n "checking for EXPAT >= $min_expat_version... " >&6; }
-fi
-
-for EXPAT_HOME in ${EXPAT_HOME_PATH}
- do
-if test -r "$EXPAT_HOME/include/expat.h"; then
-
-	if test "x$EXPAT_HOME" != "x/usr" -a "x$EXPAT_HOME" != "x/usr/local"; then
-		EXPAT_CFLAGS="-I${EXPAT_HOME}/include"
-		EXPAT_LIBS="-L${EXPAT_HOME}/lib -lexpat"
-	else
-		EXPAT_CFLAGS=
-		EXPAT_LIBS="-lexpat"
-	fi
-
-	CXXFLAGS="${BACKUP_CXXFLAGS} ${EXPAT_CFLAGS} ${GMP_CFLAGS}"
-	LIBS="${BACKUP_LIBS} ${EXPAT_LIBS} ${GMP_LIBS}"
-	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <expat.h>
-int
-main ()
-{
-XML_Content_Type a;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-	if test "$cross_compiling" = yes; then :
-
-	expat_found="yes"
-	expat_cross="yes"
-	break
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <expat.h>
-	 int main () {  if(XML_MAJOR_VERSION < 1  || (XML_MAJOR_VERSION == 1 && XML_MINOR_VERSION < 95)) return -1;  else return 0; }
-
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
-
-	expat_found="yes"
-	break
-
-else
-
-	expat_problem="$problem $EXPAT_HOME"
-	unset EXPAT_CFLAGS
-	unset EXPAT_LIBS
-
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-else
-
-	expat_found="no"
-	expat_checked="$checked $EXPAT_HOME"
-	unset EXPAT_CFLAGS
-	unset EXPAT_LIBS
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-else
-	expat_found="no"
-fi
-done
-
-if test "x$expat_found" = "xyes" ; then
-
-
-
-$as_echo "#define XMLENABLED 1" >>confdefs.h
-
-	HAVE_EXPAT=yes
-	if test "x$expat_cross" != "xyes"; then
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
-$as_echo "found" >&6; }
-	else
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5
-$as_echo "unknown" >&6; }
-		echo "WARNING: You appear to be cross compiling, so there is no way to determine"
-		echo "whether your EXPAT version is new enough. I am assuming it is."
-	fi
-	:
-elif test -n "$expat_problem"; then
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: problem" >&5
-$as_echo "problem" >&6; }
-	echo "Sorry, your EXPAT version is too old. Disabling."
-	:
-elif test "x$expat_found" = "xno" ; then
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
-	:
-fi
-
- if test "x$HAVE_EXPAT" = "xyes"; then
-  LINBOX_HAVE_EXPAT_TRUE=
-  LINBOX_HAVE_EXPAT_FALSE='#'
-else
-  LINBOX_HAVE_EXPAT_TRUE='#'
-  LINBOX_HAVE_EXPAT_FALSE=
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-
-
-
-
-
-
-# Check whether --with-benchdir was given.
-if test "${with_benchdir+set}" = set; then :
-  withval=$with_benchdir;
-		LINBOX_BENCH_PATH="$withval"
-
-else
-
-		eval LINBOX_BENCH_PATH="${prefix}/benchmarks"
-
-fi
-
-
-
-
-
-# Check whether --with-gnuplot was given.
-if test "${with_gnuplot+set}" = set; then :
-  withval=$with_gnuplot;
-		GNUPLOT_PATH="$PATH $withval"
-
-else
-
-		GNUPLOT_PATH="$PATH"
-
-fi
-
-
-# Check whether --with-ghostscript was given.
-if test "${with_ghostscript+set}" = set; then :
-  withval=$with_ghostscript;
-		GHOSTSCRIPT_PATH="$PATH $withval"
-
-else
-
-		GHOSTSCRIPT_PATH="$PATH"
-
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gnuplot works" >&5
-$as_echo_n "checking whether gnuplot works... " >&6; }
-res=yes;
-export PATH=$GNUPLOT_PATH
-(gnuplot --version) < /dev/null > /dev/null 2>&1 || res=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $res" >&5
-$as_echo "$res" >&6; }
-if test $res = no ; then
-	echo
-	echo "You must have gnuplot installed to create benchmark  "
-	echo "graphics for LinBox. Download the appropriate package"
-	echo "for your distribution, or get the source tarball from"
-    echo "http://www.gnuplot.info/download.html                "
-else
-
-$as_echo "#define HAVE_GNUPLOT 1" >>confdefs.h
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ps2pdf works" >&5
-$as_echo_n "checking whether ps2pdf works... " >&6; }
-res=yes;
-export PATH=$GHOSTSCRIPT_PATH
-(ps2pdf --version -) < /dev/null > /dev/null 2>&1 || res=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $res" >&5
-$as_echo "$res" >&6; }
-if test $res = no ; then
-	echo
-	echo "You must have ps2pdf installed to create pdf benchmarks"
-	echo "graphics for LinBox. Download the appropriate package  "
-	echo "for your distribution, or get the source tarball from  "
-    echo "http://pages.cs.wisc.edu/~ghost/                       "
-else
-
-$as_echo "#define HAVE_GHOSTSCRIPT 1" >>confdefs.h
-
-fi
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use run time optimization" >&5
-$as_echo_n "checking whether to use run time optimization... " >&6; }
-
-# Check whether --enable-optimization was given.
-if test "${enable_optimization+set}" = set; then :
-  enableval=$enable_optimization;
-
-	WINO="`grep "define.*__FFLASFFPACK_WINOTHRESHOLD" ${FFLAS_FFPACK_LOC}/include/fflas-ffpack/fflas-ffpack-optimise.h  | awk '{print $NF}'`"
-	if  test -z "{WINO}"; then :
-
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: \"fflas-ffpack was not optimised. Defaulting\"" >&5
-$as_echo "\"fflas-ffpack was not optimised. Defaulting\"" >&6; }
-		WINO="`grep "define.*__FFLASFFPACK_WINOTHRESHOLD" ${FFLAS_FFPACK_LOC}/include/fflas-ffpack/fflas-ffpack-config.h  | awk '{print $NF}'`"
-
-else
-
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: OK" >&5
-$as_echo "OK" >&6; }
-
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define WINOTHRESHOLD $WINO
-_ACEOF
-
-
-
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build documentation" >&5
-$as_echo_n "checking whether to build documentation... " >&6; }
-
-
-
-# Check whether --with-docdir was given.
-if test "${with_docdir+set}" = set; then :
-  withval=$with_docdir;
-		LINBOX_DOC_PATH="$withval"
-
-else
-
-		eval LINBOX_DOC_PATH="${prefix}/doc"
-
-fi
-
-
-
-
-
-# Check whether --with-doxygen was given.
-if test "${with_doxygen+set}" = set; then :
-  withval=$with_doxygen;
-		DOXYGEN_PATH="$PATH $withval"
-
-else
-
-		DOXYGEN_PATH="$PATH"
-
-fi
-
-
-# Check whether --enable-doc was given.
-if test "${enable_doc+set}" = set; then :
-  enableval=$enable_doc;
-fi
-
-WANTDOC="no"
-if  test "x$enable_doc" = "xyes"; then :
-
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether doxygen works" >&5
-$as_echo_n "checking whether doxygen works... " >&6; }
-   export PATH=$DOXYGEN_PATH
-   (doxygen --version) < /dev/null > /dev/null 2>&1 || {
-       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-       echo
-       echo "You must have doxygen installed to create documentation for"
-       echo "LinBox. This error only happens if you use --enable-doc."
-       echo "Download the appropriate package for your distribution, or get"
-       echo "the source tarball from http://www.stack.nl/~dimitri/doxygen/"
-       exit -1
-   }
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-   WANTDOC="yes"
-
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$WANTDOC" != "xno" ; then
-  LINBOX_BUILD_DOC_TRUE=
-  LINBOX_BUILD_DOC_FALSE='#'
-else
-  LINBOX_BUILD_DOC_TRUE='#'
-  LINBOX_BUILD_DOC_FALSE=
-fi
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether dot works" >&5
-$as_echo_n "checking whether dot works... " >&6; }
-res=yes;
-(dot -V) < /dev/null > /dev/null 2>&1 || res=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $res" >&5
-$as_echo "$res" >&6; }
-if test $res = yes; then :
-
-sed 's/^HAVE_DOT.*/HAVE_DOT = YES/' doc/Doxyfile.mod > doc/Doxyfile
-sed 's/^HAVE_DOT.*/HAVE_DOT = YES/' doc/DoxyfileDev.mod > doc/DoxyfileDev
-
-else
-   cp doc/Doxyfile.mod doc/Doxyfile ;
-cp doc/DoxyfileDev.mod doc/DoxyfileDev
-
-fi
-
-
-
-
-if test ! -d ./benchmarks/data  ; then
-	echo "Creating data dir in benchmark" ;
-	mkdir ./benchmarks/data  ;
-fi
-
-# this is bogus so far as I can tell.  -bds
-#CXXFLAGS="${GMP_CFLAGS} ${NTL_CFLAGS} ${GIVARO_CFLAGS} ${SACLIB_CFLAGS} ${CXXFLAGS}"
-#AC_SUBST(CXXFLAGS)
-
-CXXFLAGS="${GMP_CFLAGS} ${CXXFLAGS}"
-
-
-echo "-----------------------------------------------"
-
-ac_config_files="$ac_config_files Makefile linbox-config examples/Makefile examples/fields/Makefile examples/Readme-make doc/Makefile linbox/Makefile linbox/algorithms/Makefile linbox/algorithms/gauss/Makefile linbox/algorithms/matrix-blas3/Makefile linbox/blackbox/Makefile linbox/element/Makefile linbox/field/Makefile linbox/field/NTL/Makefile linbox/field/Givaro/Makefile linbox/field/Modular/Makefile linbox/matrix/Makefile linbox/randiter/Makefile linbox/ring/Makefile linbox/solutions/ [...]
-
-cat >confcache <<\_ACEOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs, see configure's option --config-cache.
-# It is not useful on other systems.  If it contains results you don't
-# want to keep, you may remove or edit it.
-#
-# config.status only pays attention to the cache file if you give it
-# the --recheck option to rerun configure.
-#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
-# following values.
-
-_ACEOF
-
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, we kill variables containing newlines.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(
-  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) { eval $ac_var=; unset $ac_var;} ;;
-      esac ;;
-    esac
-  done
-
-  (set) 2>&1 |
-    case $as_nl`(ac_space=' '; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      # `set' does not quote correctly, so add quotes: double-quote
-      # substitution turns \\\\ into \\, and sed turns \\ into \.
-      sed -n \
-	"s/'/'\\\\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
-      ;; #(
-    *)
-      # `set' quotes correctly as required by POSIX, so do not add quotes.
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-) |
-  sed '
-     /^ac_cv_env_/b end
-     t clear
-     :clear
-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
-     t end
-     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
-     :end' >>confcache
-if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
-  if test -w "$cache_file"; then
-    if test "x$cache_file" != "x/dev/null"; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
-      if test ! -f "$cache_file" || test -h "$cache_file"; then
-	cat confcache >"$cache_file"
-      else
-        case $cache_file in #(
-        */* | ?:*)
-	  mv -f confcache "$cache_file"$$ &&
-	  mv -f "$cache_file"$$ "$cache_file" ;; #(
-        *)
-	  mv -f confcache "$cache_file" ;;
-	esac
-      fi
-    fi
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
-  fi
-fi
-rm -f confcache
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-DEFS=-DHAVE_CONFIG_H
-
-ac_libobjs=
-ac_ltlibobjs=
-U=
-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
-  # 1. Remove the extension, and $U if already installed.
-  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
-  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
-  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
-  #    will be set to the directory where LIBOBJS objects are built.
-  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
-  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
-done
-LIBOBJS=$ac_libobjs
-
-LTLIBOBJS=$ac_ltlibobjs
-
-
- if test -n "$EXEEXT"; then
-  am__EXEEXT_TRUE=
-  am__EXEEXT_FALSE='#'
-else
-  am__EXEEXT_TRUE='#'
-  am__EXEEXT_FALSE=
-fi
-
-if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
-  as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
-  as_fn_error $? "conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${INSIDE_GNOME_COMMON_TRUE}" && test -z "${INSIDE_GNOME_COMMON_FALSE}"; then
-  as_fn_error $? "conditional \"INSIDE_GNOME_COMMON\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${DEBUG_TRUE}" && test -z "${DEBUG_FALSE}"; then
-  as_fn_error $? "conditional \"DEBUG\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${PROFILE_TRUE}" && test -z "${PROFILE_FALSE}"; then
-  as_fn_error $? "conditional \"PROFILE\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-
-if test -z "${LINBOX_COMPILE_DRIVERS_TRUE}" && test -z "${LINBOX_COMPILE_DRIVERS_FALSE}"; then
-  as_fn_error $? "conditional \"LINBOX_COMPILE_DRIVERS\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_IML_TRUE}" && test -z "${LINBOX_HAVE_IML_FALSE}"; then
-  as_fn_error $? "conditional \"LINBOX_HAVE_IML\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_M4RI_TRUE}" && test -z "${LINBOX_HAVE_M4RI_FALSE}"; then
-  as_fn_error $? "conditional \"LINBOX_HAVE_M4RI\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_M4RIE_TRUE}" && test -z "${LINBOX_HAVE_M4RIE_FALSE}"; then
-  as_fn_error $? "conditional \"LINBOX_HAVE_M4RIE\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_MPFR_TRUE}" && test -z "${LINBOX_HAVE_MPFR_FALSE}"; then
-  as_fn_error $? "conditional \"LINBOX_HAVE_MPFR\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_FPLLL_TRUE}" && test -z "${LINBOX_HAVE_FPLLL_FALSE}"; then
-  as_fn_error $? "conditional \"LINBOX_HAVE_FPLLL\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_NTL_TRUE}" && test -z "${LINBOX_HAVE_NTL_FALSE}"; then
-  as_fn_error $? "conditional \"LINBOX_HAVE_NTL\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_GIVARO_TRUE}" && test -z "${LINBOX_HAVE_GIVARO_FALSE}"; then
-  as_fn_error $? "conditional \"LINBOX_HAVE_GIVARO\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_SACLIB_TRUE}" && test -z "${LINBOX_HAVE_SACLIB_FALSE}"; then
-  as_fn_error $? "conditional \"LINBOX_HAVE_SACLIB\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_LIDIA_TRUE}" && test -z "${LINBOX_HAVE_LIDIA_FALSE}"; then
-  as_fn_error $? "conditional \"LINBOX_HAVE_LIDIA\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_MAPLE_TRUE}" && test -z "${LINBOX_HAVE_MAPLE_FALSE}"; then
-  as_fn_error $? "conditional \"LINBOX_HAVE_MAPLE\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_COMPILE_DRIVERS_TRUE}" && test -z "${LINBOX_COMPILE_DRIVERS_FALSE}"; then
-  as_fn_error $? "conditional \"LINBOX_COMPILE_DRIVERS\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_SAGE_TRUE}" && test -z "${LINBOX_HAVE_SAGE_FALSE}"; then
-  as_fn_error $? "conditional \"LINBOX_HAVE_SAGE\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_FFLAS_FFPACK_TRUE}" && test -z "${LINBOX_HAVE_FFLAS_FFPACK_FALSE}"; then
-  as_fn_error $? "conditional \"LINBOX_HAVE_FFLAS_FFPACK\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_LAPACK_TRUE}" && test -z "${LINBOX_HAVE_LAPACK_FALSE}"; then
-  as_fn_error $? "conditional \"LINBOX_HAVE_LAPACK\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_LAPACK_TRUE}" && test -z "${LINBOX_HAVE_LAPACK_FALSE}"; then
-  as_fn_error $? "conditional \"LINBOX_HAVE_LAPACK\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_LAPACK_TRUE}" && test -z "${LINBOX_HAVE_LAPACK_FALSE}"; then
-  as_fn_error $? "conditional \"LINBOX_HAVE_LAPACK\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_HAVE_EXPAT_TRUE}" && test -z "${LINBOX_HAVE_EXPAT_FALSE}"; then
-  as_fn_error $? "conditional \"LINBOX_HAVE_EXPAT\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LINBOX_BUILD_DOC_TRUE}" && test -z "${LINBOX_BUILD_DOC_FALSE}"; then
-  as_fn_error $? "conditional \"LINBOX_BUILD_DOC\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-
-: "${CONFIG_STATUS=./config.status}"
-ac_write_fail=0
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
-as_write_fail=0
-cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate the current configuration.
-# Compiler output produced by configure, useful for debugging
-# configure, is in config.log if it exists.
-
-debug=false
-ac_cs_recheck=false
-ac_cs_silent=false
-
-SHELL=\${CONFIG_SHELL-$SHELL}
-export SHELL
-_ASEOF
-cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
-      PATH_SEPARATOR=';'
-  }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-as_myself=
-case $0 in #((
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-  done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-
-# as_fn_error STATUS ERROR [LINENO LOG_FD]
-# ----------------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with STATUS, using 1 if that was 0.
-as_fn_error ()
-{
-  as_status=$1; test $as_status -eq 0 && as_status=1
-  if test "$4"; then
-    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
-  fi
-  $as_echo "$as_me: error: $2" >&2
-  as_fn_exit $as_status
-} # as_fn_error
-
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
-  return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
-  set +e
-  as_fn_set_status $1
-  exit $1
-} # as_fn_exit
-
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
-  { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
-  eval 'as_fn_append ()
-  {
-    eval $1+=\$2
-  }'
-else
-  as_fn_append ()
-  {
-    eval $1=\$$1\$2
-  }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
-  eval 'as_fn_arith ()
-  {
-    as_val=$(( $* ))
-  }'
-else
-  as_fn_arith ()
-  {
-    as_val=`expr "$@" || test $? -eq 1`
-  }
-fi # as_fn_arith
-
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
-  case `echo 'xy\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  xy)  ECHO_C='\c';;
-  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
-       ECHO_T='	';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
-  if ln -s conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s='ln -s'
-    # ... but there are two gotchas:
-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -pR'.
-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -pR'
-  elif ln conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s=ln
-  else
-    as_ln_s='cp -pR'
-  fi
-else
-  as_ln_s='cp -pR'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || eval $as_mkdir_p || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p='mkdir -p "$as_dir"'
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-
-# as_fn_executable_p FILE
-# -----------------------
-# Test if FILE is an executable regular file.
-as_fn_executable_p ()
-{
-  test -f "$1" && test -x "$1"
-} # as_fn_executable_p
-as_test_x='test -x'
-as_executable_p=as_fn_executable_p
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-exec 6>&1
-## ----------------------------------- ##
-## Main body of $CONFIG_STATUS script. ##
-## ----------------------------------- ##
-_ASEOF
-test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=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 LinBox $as_me 1.3.2, which was
-generated by GNU Autoconf 2.69.  Invocation command line was
-
-  CONFIG_FILES    = $CONFIG_FILES
-  CONFIG_HEADERS  = $CONFIG_HEADERS
-  CONFIG_LINKS    = $CONFIG_LINKS
-  CONFIG_COMMANDS = $CONFIG_COMMANDS
-  $ $0 $@
-
-on `(hostname || uname -n) 2>/dev/null | sed 1q`
-"
-
-_ACEOF
-
-case $ac_config_files in *"
-"*) set x $ac_config_files; shift; ac_config_files=$*;;
-esac
-
-case $ac_config_headers in *"
-"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
-esac
-
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-# Files that config.status was made for.
-config_files="$ac_config_files"
-config_headers="$ac_config_headers"
-config_commands="$ac_config_commands"
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-ac_cs_usage="\
-\`$as_me' instantiates files and other configuration actions
-from templates according to the current configuration.  Unless the files
-and actions are specified as TAGs, all are instantiated by default.
-
-Usage: $0 [OPTION]... [TAG]...
-
-  -h, --help       print this help, then exit
-  -V, --version    print version number and configuration settings, then exit
-      --config     print configuration, then exit
-  -q, --quiet, --silent
-                   do not print progress messages
-  -d, --debug      don't remove temporary files
-      --recheck    update $as_me by reconfiguring in the same conditions
-      --file=FILE[:TEMPLATE]
-                   instantiate the configuration file FILE
-      --header=FILE[:TEMPLATE]
-                   instantiate the configuration header FILE
-
-Configuration files:
-$config_files
-
-Configuration headers:
-$config_headers
-
-Configuration commands:
-$config_commands
-
-Report bugs to <linbox-use at googlegroups.com>.
-LinBox home page: <http://www.linalg.org/>."
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
-ac_cs_version="\\
-LinBox config.status 1.3.2
-configured by $0, generated by GNU Autoconf 2.69,
-  with options \\"\$ac_cs_config\\"
-
-Copyright (C) 2012 Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-
-ac_pwd='$ac_pwd'
-srcdir='$srcdir'
-INSTALL='$INSTALL'
-MKDIR_P='$MKDIR_P'
-AWK='$AWK'
-test -n "\$AWK" || AWK=awk
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# The default lists apply if the user does not specify any file.
-ac_need_defaults=:
-while test $# != 0
-do
-  case $1 in
-  --*=?*)
-    ac_option=`expr "X$1" : 'X\([^=]*\)='`
-    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
-    ac_shift=:
-    ;;
-  --*=)
-    ac_option=`expr "X$1" : 'X\([^=]*\)='`
-    ac_optarg=
-    ac_shift=:
-    ;;
-  *)
-    ac_option=$1
-    ac_optarg=$2
-    ac_shift=shift
-    ;;
-  esac
-
-  case $ac_option in
-  # Handling of the options.
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    ac_cs_recheck=: ;;
-  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
-    $as_echo "$ac_cs_version"; exit ;;
-  --config | --confi | --conf | --con | --co | --c )
-    $as_echo "$ac_cs_config"; exit ;;
-  --debug | --debu | --deb | --de | --d | -d )
-    debug=: ;;
-  --file | --fil | --fi | --f )
-    $ac_shift
-    case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    '') as_fn_error $? "missing file argument" ;;
-    esac
-    as_fn_append CONFIG_FILES " '$ac_optarg'"
-    ac_need_defaults=false;;
-  --header | --heade | --head | --hea )
-    $ac_shift
-    case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
-    ac_need_defaults=false;;
-  --he | --h)
-    # Conflict between --help and --header
-    as_fn_error $? "ambiguous option: \`$1'
-Try \`$0 --help' for more information.";;
-  --help | --hel | -h )
-    $as_echo "$ac_cs_usage"; exit ;;
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil | --si | --s)
-    ac_cs_silent=: ;;
-
-  # This is an error.
-  -*) as_fn_error $? "unrecognized option: \`$1'
-Try \`$0 --help' for more information." ;;
-
-  *) as_fn_append ac_config_targets " $1"
-     ac_need_defaults=false ;;
-
-  esac
-  shift
-done
-
-ac_configure_extra_args=
-
-if $ac_cs_silent; then
-  exec 6>/dev/null
-  ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-if \$ac_cs_recheck; then
-  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
-  shift
-  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
-  CONFIG_SHELL='$SHELL'
-  export CONFIG_SHELL
-  exec "\$@"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-exec 5>>config.log
-{
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-  $as_echo "$ac_log"
-} >&5
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-#
-# INIT-COMMANDS
-#
-PACKAGE="$PACKAGE"
-AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
-
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
-macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
-enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
-enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
-pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
-enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
-SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
-ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
-PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
-host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
-host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
-host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
-build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
-build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
-build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
-SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
-Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
-GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
-EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
-FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
-LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
-NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
-LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
-max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
-ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
-exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
-lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
-lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
-lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
-lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
-lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
-reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
-reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
-OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
-deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
-file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
-file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
-want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
-DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
-sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
-AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
-AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
-archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
-STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
-RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
-old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
-old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
-old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
-lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
-CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
-CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
-compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
-GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
-nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
-lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
-objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
-MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
-lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
-need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
-MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
-DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
-NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
-LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
-OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
-OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
-libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
-shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
-extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
-archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
-enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
-export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
-whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
-compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
-old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
-old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
-archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
-archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
-module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
-module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
-with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
-allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
-no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
-hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
-hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
-hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
-hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
-inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
-link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
-always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
-export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
-exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
-include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
-prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
-postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
-file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
-variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
-need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
-need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
-version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
-runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
-shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
-shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
-libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
-library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
-soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
-install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
-postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
-postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
-finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
-finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
-hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
-sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
-sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
-hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
-enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
-enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
-enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
-old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
-striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
-predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
-postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
-predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
-postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
-LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
-reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
-reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
-GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
-lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
-archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
-enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
-export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
-whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
-old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
-allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
-no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
-inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
-link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
-always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
-export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
-include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
-prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
-predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
-postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
-predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
-postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
-
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-\$1
-_LTECHO_EOF'
-}
-
-# Quote evaled strings.
-for var in SHELL \
-ECHO \
-PATH_SEPARATOR \
-SED \
-GREP \
-EGREP \
-FGREP \
-LD \
-NM \
-LN_S \
-lt_SP2NL \
-lt_NL2SP \
-reload_flag \
-OBJDUMP \
-deplibs_check_method \
-file_magic_cmd \
-file_magic_glob \
-want_nocaseglob \
-DLLTOOL \
-sharedlib_from_linklib_cmd \
-AR \
-AR_FLAGS \
-archiver_list_spec \
-STRIP \
-RANLIB \
-CC \
-CFLAGS \
-compiler \
-lt_cv_sys_global_symbol_pipe \
-lt_cv_sys_global_symbol_to_cdecl \
-lt_cv_sys_global_symbol_to_c_name_address \
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
-nm_file_list_spec \
-lt_prog_compiler_no_builtin_flag \
-lt_prog_compiler_pic \
-lt_prog_compiler_wl \
-lt_prog_compiler_static \
-lt_cv_prog_compiler_c_o \
-need_locks \
-MANIFEST_TOOL \
-DSYMUTIL \
-NMEDIT \
-LIPO \
-OTOOL \
-OTOOL64 \
-shrext_cmds \
-export_dynamic_flag_spec \
-whole_archive_flag_spec \
-compiler_needs_object \
-with_gnu_ld \
-allow_undefined_flag \
-no_undefined_flag \
-hardcode_libdir_flag_spec \
-hardcode_libdir_separator \
-exclude_expsyms \
-include_expsyms \
-file_list_spec \
-variables_saved_for_relink \
-libname_spec \
-library_names_spec \
-soname_spec \
-install_override_mode \
-finish_eval \
-old_striplib \
-striplib \
-compiler_lib_search_dirs \
-predep_objects \
-postdep_objects \
-predeps \
-postdeps \
-compiler_lib_search_path \
-LD_CXX \
-reload_flag_CXX \
-compiler_CXX \
-lt_prog_compiler_no_builtin_flag_CXX \
-lt_prog_compiler_pic_CXX \
-lt_prog_compiler_wl_CXX \
-lt_prog_compiler_static_CXX \
-lt_cv_prog_compiler_c_o_CXX \
-export_dynamic_flag_spec_CXX \
-whole_archive_flag_spec_CXX \
-compiler_needs_object_CXX \
-with_gnu_ld_CXX \
-allow_undefined_flag_CXX \
-no_undefined_flag_CXX \
-hardcode_libdir_flag_spec_CXX \
-hardcode_libdir_separator_CXX \
-exclude_expsyms_CXX \
-include_expsyms_CXX \
-file_list_spec_CXX \
-compiler_lib_search_dirs_CXX \
-predep_objects_CXX \
-postdep_objects_CXX \
-predeps_CXX \
-postdeps_CXX \
-compiler_lib_search_path_CXX; do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Double-quote double-evaled strings.
-for var in reload_cmds \
-old_postinstall_cmds \
-old_postuninstall_cmds \
-old_archive_cmds \
-extract_expsyms_cmds \
-old_archive_from_new_cmds \
-old_archive_from_expsyms_cmds \
-archive_cmds \
-archive_expsym_cmds \
-module_cmds \
-module_expsym_cmds \
-export_symbols_cmds \
-prelink_cmds \
-postlink_cmds \
-postinstall_cmds \
-postuninstall_cmds \
-finish_cmds \
-sys_lib_search_path_spec \
-sys_lib_dlsearch_path_spec \
-reload_cmds_CXX \
-old_archive_cmds_CXX \
-old_archive_from_new_cmds_CXX \
-old_archive_from_expsyms_cmds_CXX \
-archive_cmds_CXX \
-archive_expsym_cmds_CXX \
-module_cmds_CXX \
-module_expsym_cmds_CXX \
-export_symbols_cmds_CXX \
-prelink_cmds_CXX \
-postlink_cmds_CXX; do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-ac_aux_dir='$ac_aux_dir'
-xsi_shell='$xsi_shell'
-lt_shell_append='$lt_shell_append'
-
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-
-    PACKAGE='$PACKAGE'
-    VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
-    RM='$RM'
-    ofile='$ofile'
-
-
-
-
-
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-
-# Handling of arguments.
-for ac_config_target in $ac_config_targets
-do
-  case $ac_config_target in
-    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
-    "linbox/linbox-config.h") CONFIG_COMMANDS="$CONFIG_COMMANDS linbox/linbox-config.h" ;;
-    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
-    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
-    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-    "linbox-config") CONFIG_FILES="$CONFIG_FILES linbox-config" ;;
-    "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;;
-    "examples/fields/Makefile") CONFIG_FILES="$CONFIG_FILES examples/fields/Makefile" ;;
-    "examples/Readme-make") CONFIG_FILES="$CONFIG_FILES examples/Readme-make" ;;
-    "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
-    "linbox/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/Makefile" ;;
-    "linbox/algorithms/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/algorithms/Makefile" ;;
-    "linbox/algorithms/gauss/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/algorithms/gauss/Makefile" ;;
-    "linbox/algorithms/matrix-blas3/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/algorithms/matrix-blas3/Makefile" ;;
-    "linbox/blackbox/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/blackbox/Makefile" ;;
-    "linbox/element/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/element/Makefile" ;;
-    "linbox/field/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/field/Makefile" ;;
-    "linbox/field/NTL/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/field/NTL/Makefile" ;;
-    "linbox/field/Givaro/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/field/Givaro/Makefile" ;;
-    "linbox/field/Modular/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/field/Modular/Makefile" ;;
-    "linbox/matrix/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/matrix/Makefile" ;;
-    "linbox/randiter/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/randiter/Makefile" ;;
-    "linbox/ring/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/ring/Makefile" ;;
-    "linbox/solutions/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/solutions/Makefile" ;;
-    "linbox/switch/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/switch/Makefile" ;;
-    "linbox/util/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/util/Makefile" ;;
-    "linbox/util/formats/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/util/formats/Makefile" ;;
-    "linbox/vector/Makefile") CONFIG_FILES="$CONFIG_FILES linbox/vector/Makefile" ;;
-    "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
-    "tests/data/Makefile") CONFIG_FILES="$CONFIG_FILES tests/data/Makefile" ;;
-    "tests/matrix/Makefile") CONFIG_FILES="$CONFIG_FILES tests/matrix/Makefile" ;;
-    "interfaces/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Makefile" ;;
-    "interfaces/driver/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/driver/Makefile" ;;
-    "interfaces/maple/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/maple/Makefile" ;;
-    "interfaces/kaapi/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/kaapi/Makefile" ;;
-    "interfaces/sage/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/sage/Makefile" ;;
-    "macros/Makefile") CONFIG_FILES="$CONFIG_FILES macros/Makefile" ;;
-    "benchmarks/Makefile") CONFIG_FILES="$CONFIG_FILES benchmarks/Makefile" ;;
-
-  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
-  esac
-done
-
-
-# If the user did not use the arguments to specify the items to instantiate,
-# then the envvar interface is used.  Set only those that are not.
-# We use the long form for the default assignment because of an extremely
-# bizarre bug on SunOS 4.1.3.
-if $ac_need_defaults; then
-  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
-  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
-  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
-fi
-
-# Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason against having it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Hook for its removal unless debugging.
-# Note that there is a small window in which the directory will not be cleaned:
-# after its creation but before its name has been assigned to `$tmp'.
-$debug ||
-{
-  tmp= ac_tmp=
-  trap 'exit_status=$?
-  : "${ac_tmp:=$tmp}"
-  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
-' 0
-  trap 'as_fn_exit 1' 1 2 13 15
-}
-# Create a (secure) tmp directory for tmp files.
-
-{
-  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
-  test -d "$tmp"
-}  ||
-{
-  tmp=./conf$$-$RANDOM
-  (umask 077 && mkdir "$tmp")
-} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
-ac_tmp=$tmp
-
-# Set up the scripts for CONFIG_FILES section.
-# No need to generate them if there are no CONFIG_FILES.
-# This happens for instance with `./config.status config.h'.
-if test -n "$CONFIG_FILES"; then
-
-
-ac_cr=`echo X | tr X '\015'`
-# On cygwin, bash can eat \r inside `` if the user requested igncr.
-# But we know of no other shell where ac_cr would be empty at this
-# point, so we can use a bashism as a fallback.
-if test "x$ac_cr" = x; then
-  eval ac_cr=\$\'\\r\'
-fi
-ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
-if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
-  ac_cs_awk_cr='\\r'
-else
-  ac_cs_awk_cr=$ac_cr
-fi
-
-echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
-_ACEOF
-
-
-{
-  echo "cat >conf$$subs.awk <<_ACEOF" &&
-  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
-  echo "_ACEOF"
-} >conf$$subs.sh ||
-  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
-ac_delim='%!_!# '
-for ac_last_try in false false false false false :; do
-  . ./conf$$subs.sh ||
-    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-
-  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
-  if test $ac_delim_n = $ac_delim_num; then
-    break
-  elif $ac_last_try; then
-    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-  else
-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
-  fi
-done
-rm -f conf$$subs.sh
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
-_ACEOF
-sed -n '
-h
-s/^/S["/; s/!.*/"]=/
-p
-g
-s/^[^!]*!//
-:repl
-t repl
-s/'"$ac_delim"'$//
-t delim
-:nl
-h
-s/\(.\{148\}\)..*/\1/
-t more1
-s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
-p
-n
-b repl
-:more1
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t nl
-:delim
-h
-s/\(.\{148\}\)..*/\1/
-t more2
-s/["\\]/\\&/g; s/^/"/; s/$/"/
-p
-b
-:more2
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t delim
-' <conf$$subs.awk | sed '
-/^[^""]/{
-  N
-  s/\n//
-}
-' >>$CONFIG_STATUS || ac_write_fail=1
-rm -f conf$$subs.awk
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-_ACAWK
-cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
-  for (key in S) S_is_set[key] = 1
-  FS = ""
-
-}
-{
-  line = $ 0
-  nfields = split(line, field, "@")
-  substed = 0
-  len = length(field[1])
-  for (i = 2; i < nfields; i++) {
-    key = field[i]
-    keylen = length(key)
-    if (S_is_set[key]) {
-      value = S[key]
-      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
-      len += length(value) + length(field[++i])
-      substed = 1
-    } else
-      len += 1 + keylen
-  }
-
-  print line
-}
-
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
-  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
-else
-  cat
-fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
-  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
-_ACEOF
-
-# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
-# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
-h
-s///
-s/^/:/
-s/[	 ]*$/:/
-s/:\$(srcdir):/:/g
-s/:\${srcdir}:/:/g
-s/:@srcdir@:/:/g
-s/^:*//
-s/:*$//
-x
-s/\(=[	 ]*\).*/\1/
-G
-s/\n//
-s/^[^=]*=[	 ]*$//
-}'
-fi
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-fi # test -n "$CONFIG_FILES"
-
-# Set up the scripts for CONFIG_HEADERS section.
-# No need to generate them if there are no CONFIG_HEADERS.
-# This happens for instance with `./config.status Makefile'.
-if test -n "$CONFIG_HEADERS"; then
-cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
-BEGIN {
-_ACEOF
-
-# Transform confdefs.h into an awk script `defines.awk', embedded as
-# here-document in config.status, that substitutes the proper values into
-# config.h.in to produce config.h.
-
-# Create a delimiter string that does not exist in confdefs.h, to ease
-# handling of long lines.
-ac_delim='%!_!# '
-for ac_last_try in false false :; do
-  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
-  if test -z "$ac_tt"; then
-    break
-  elif $ac_last_try; then
-    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
-  else
-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
-  fi
-done
-
-# For the awk script, D is an array of macro values keyed by name,
-# likewise P contains macro parameters if any.  Preserve backslash
-# newline sequences.
-
-ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
-sed -n '
-s/.\{148\}/&'"$ac_delim"'/g
-t rset
-:rset
-s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
-t def
-d
-:def
-s/\\$//
-t bsnl
-s/["\\]/\\&/g
-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
-D["\1"]=" \3"/p
-s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
-d
-:bsnl
-s/["\\]/\\&/g
-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
-D["\1"]=" \3\\\\\\n"\\/p
-t cont
-s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
-t cont
-d
-:cont
-n
-s/.\{148\}/&'"$ac_delim"'/g
-t clear
-:clear
-s/\\$//
-t bsnlc
-s/["\\]/\\&/g; s/^/"/; s/$/"/p
-d
-:bsnlc
-s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
-b cont
-' <confdefs.h | sed '
-s/'"$ac_delim"'/"\\\
-"/g' >>$CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-  for (key in D) D_is_set[key] = 1
-  FS = ""
-}
-/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
-  line = \$ 0
-  split(line, arg, " ")
-  if (arg[1] == "#") {
-    defundef = arg[2]
-    mac1 = arg[3]
-  } else {
-    defundef = substr(arg[1], 2)
-    mac1 = arg[2]
-  }
-  split(mac1, mac2, "(") #)
-  macro = mac2[1]
-  prefix = substr(line, 1, index(line, defundef) - 1)
-  if (D_is_set[macro]) {
-    # Preserve the white space surrounding the "#".
-    print prefix "define", macro P[macro] D[macro]
-    next
-  } else {
-    # Replace #undef with comments.  This is necessary, for example,
-    # in the case of _POSIX_SOURCE, which is predefined and required
-    # on some systems where configure will not decide to define it.
-    if (defundef == "undef") {
-      print "/*", prefix defundef, macro, "*/"
-      next
-    }
-  }
-}
-{ print }
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
-fi # test -n "$CONFIG_HEADERS"
-
-
-eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
-shift
-for ac_tag
-do
-  case $ac_tag in
-  :[FHLC]) ac_mode=$ac_tag; continue;;
-  esac
-  case $ac_mode$ac_tag in
-  :[FHL]*:*);;
-  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
-  :[FH]-) ac_tag=-:-;;
-  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
-  esac
-  ac_save_IFS=$IFS
-  IFS=:
-  set x $ac_tag
-  IFS=$ac_save_IFS
-  shift
-  ac_file=$1
-  shift
-
-  case $ac_mode in
-  :L) ac_source=$1;;
-  :[FH])
-    ac_file_inputs=
-    for ac_f
-    do
-      case $ac_f in
-      -) ac_f="$ac_tmp/stdin";;
-      *) # Look for the file first in the build tree, then in the source tree
-	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
-	 # because $ac_f cannot contain `:'.
-	 test -f "$ac_f" ||
-	   case $ac_f in
-	   [\\/$]*) false;;
-	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
-	   esac ||
-	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
-      esac
-      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
-      as_fn_append ac_file_inputs " '$ac_f'"
-    done
-
-    # Let's still pretend it is `configure' which instantiates (i.e., don't
-    # use $as_me), people would be surprised to read:
-    #    /* config.h.  Generated by config.status.  */
-    configure_input='Generated from '`
-	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
-	`' by configure.'
-    if test x"$ac_file" != x-; then
-      configure_input="$ac_file.  $configure_input"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
-    fi
-    # Neutralize special characters interpreted by sed in replacement strings.
-    case $configure_input in #(
-    *\&* | *\|* | *\\* )
-       ac_sed_conf_input=`$as_echo "$configure_input" |
-       sed 's/[\\\\&|]/\\\\&/g'`;; #(
-    *) ac_sed_conf_input=$configure_input;;
-    esac
-
-    case $ac_tag in
-    *:-:* | *:-) cat >"$ac_tmp/stdin" \
-      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
-    esac
-    ;;
-  esac
-
-  ac_dir=`$as_dirname -- "$ac_file" ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  as_dir="$ac_dir"; as_fn_mkdir_p
-  ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-
-  case $ac_mode in
-  :F)
-  #
-  # CONFIG_FILE
-  #
-
-  case $INSTALL in
-  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
-  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
-  esac
-  ac_MKDIR_P=$MKDIR_P
-  case $MKDIR_P in
-  [\\/$]* | ?:[\\/]* ) ;;
-  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
-  esac
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# If the template does not know about datarootdir, expand it.
-# FIXME: This hack should be removed a few years after 2.60.
-ac_datarootdir_hack=; ac_datarootdir_seen=
-ac_sed_dataroot='
-/datarootdir/ {
-  p
-  q
-}
-/@datadir@/p
-/@docdir@/p
-/@infodir@/p
-/@localedir@/p
-/@mandir@/p'
-case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
-*datarootdir*) ac_datarootdir_seen=yes;;
-*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-  ac_datarootdir_hack='
-  s&@datadir@&$datadir&g
-  s&@docdir@&$docdir&g
-  s&@infodir@&$infodir&g
-  s&@localedir@&$localedir&g
-  s&@mandir@&$mandir&g
-  s&\\\${datarootdir}&$datarootdir&g' ;;
-esac
-_ACEOF
-
-# Neutralize VPATH when `$srcdir' = `.'.
-# Shell code in configure.ac might set extrasub.
-# FIXME: do we really want to maintain this feature?
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_sed_extra="$ac_vpsub
-$extrasub
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s|@configure_input@|$ac_sed_conf_input|;t t
-s&@top_builddir@&$ac_top_builddir_sub&;t t
-s&@top_build_prefix@&$ac_top_build_prefix&;t t
-s&@srcdir@&$ac_srcdir&;t t
-s&@abs_srcdir@&$ac_abs_srcdir&;t t
-s&@top_srcdir@&$ac_top_srcdir&;t t
-s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
-s&@builddir@&$ac_builddir&;t t
-s&@abs_builddir@&$ac_abs_builddir&;t t
-s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
-s&@INSTALL@&$ac_INSTALL&;t t
-s&@MKDIR_P@&$ac_MKDIR_P&;t t
-$ac_datarootdir_hack
-"
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
-  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
-
-test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
-  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
-  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
-      "$ac_tmp/out"`; test -z "$ac_out"; } &&
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined" >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined" >&2;}
-
-  rm -f "$ac_tmp/stdin"
-  case $ac_file in
-  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
-  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
-  esac \
-  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
- ;;
-  :H)
-  #
-  # CONFIG_HEADER
-  #
-  if test x"$ac_file" != x-; then
-    {
-      $as_echo "/* $configure_input  */" \
-      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
-    } >"$ac_tmp/config.h" \
-      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
-    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
-$as_echo "$as_me: $ac_file is unchanged" >&6;}
-    else
-      rm -f "$ac_file"
-      mv "$ac_tmp/config.h" "$ac_file" \
-	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
-    fi
-  else
-    $as_echo "/* $configure_input  */" \
-      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
-      || as_fn_error $? "could not create -" "$LINENO" 5
-  fi
-# Compute "$ac_file"'s index in $config_headers.
-_am_arg="$ac_file"
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $_am_arg | $_am_arg:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
-$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$_am_arg" : 'X\(//\)[^/]' \| \
-	 X"$_am_arg" : 'X\(//\)$' \| \
-	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$_am_arg" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`/stamp-h$_am_stamp_count
- ;;
-
-  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
-$as_echo "$as_me: executing $ac_file commands" >&6;}
- ;;
-  esac
-
-
-  case $ac_file$ac_mode in
-    "linbox/linbox-config.h":C) ac_prefix_conf_OUT=`echo linbox/linbox-config.h`
-ac_prefix_conf_DEF=`echo _$ac_prefix_conf_OUT | sed -e "y:abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:" -e "s/[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g"`
-ac_prefix_conf_PKG=`echo __LINBOX`
-ac_prefix_conf_LOW=`echo _$ac_prefix_conf_PKG | sed -e "y:ABCDEFGHIJKLMNOPQRSTUVWXYZ-:abcdefghijklmnopqrstuvwxyz_:"`
-ac_prefix_conf_UPP=`echo $ac_prefix_conf_PKG | sed -e "y:abcdefghijklmnopqrstuvwxyz-:ABCDEFGHIJKLMNOPQRSTUVWXYZ_:"  -e "/^[0123456789]/s/^/_/"`
-ac_prefix_conf_INP=`echo "" | sed -e 's/ *//'`
-if test ".$ac_prefix_conf_INP" = "."; then
-   for ac_file in : $CONFIG_HEADERS; do test "_$ac_file" = _: && continue
-     case "$ac_file" in
-        *.h) ac_prefix_conf_INP=$ac_file ;;
-        *)
-     esac
-     test ".$ac_prefix_conf_INP" != "." && break
-   done
-fi
-if test ".$ac_prefix_conf_INP" = "."; then
-   case "$ac_prefix_conf_OUT" in
-      */*) ac_prefix_conf_INP=`basename "$ac_prefix_conf_OUT"`
-      ;;
-      *-*) ac_prefix_conf_INP=`echo "$ac_prefix_conf_OUT" | sed -e "s/[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]*-//"`
-      ;;
-      *) ac_prefix_conf_INP=config.h
-      ;;
-   esac
-fi
-if test -z "$ac_prefix_conf_PKG" ; then
-   as_fn_error $? "no prefix for _PREFIX_PKG_CONFIG_H" "$LINENO" 5
-else
-  if test ! -f "$ac_prefix_conf_INP" ; then if test -f "$srcdir/$ac_prefix_conf_INP" ; then
-     ac_prefix_conf_INP="$srcdir/$ac_prefix_conf_INP"
-  fi fi
-  { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_prefix_conf_OUT - prefix $ac_prefix_conf_UPP for $ac_prefix_conf_INP defines" >&5
-$as_echo "$as_me: creating $ac_prefix_conf_OUT - prefix $ac_prefix_conf_UPP for $ac_prefix_conf_INP defines" >&6;}
-  if test -f $ac_prefix_conf_INP ; then
-    echo "s/#undef  *\\([ABCDEFGHIJKLMNOPQRSTUVWXYZ_]\\)/#undef $ac_prefix_conf_UPP""_\\1/" > conftest.prefix
-    echo "s/#undef  *\\([abcdefghijklmnopqrstuvwxyz]\\)/#undef $ac_prefix_conf_LOW""_\\1/" >> conftest.prefix
-    echo "s/#define  *\\([ABCDEFGHIJKLMNOPQRSTUVWXYZ_][abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]*\\)\\(.*\\)/#ifndef $ac_prefix_conf_UPP""_\\1 \\" >> conftest.prefix
-    echo "#define $ac_prefix_conf_UPP""_\\1 \\2 \\" >> conftest.prefix
-    echo "#endif/" >>conftest.prefix
-    echo "s/#define  *\\([abcdefghijklmnopqrstuvwxyz][abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]*\\)\\(.*\\)/#ifndef $ac_prefix_conf_LOW""_\\1 \\" >> conftest.prefix
-    echo "#define $ac_prefix_conf_LOW""_\\1 \\2 \\" >> conftest.prefix
-    echo "#endif/" >> conftest.prefix
-    # now executing _script on _DEF input to create _OUT output file
-    echo "#ifndef $ac_prefix_conf_DEF"      >$tmp/pconfig.h
-    echo "#define $ac_prefix_conf_DEF 1" >>$tmp/pconfig.h
-    echo ' ' >>$tmp/pconfig.h
-    echo /'*' $ac_prefix_conf_OUT. Generated automatically at end of configure. '*'/ >>$tmp/pconfig.h
-
-    sed -f conftest.prefix $ac_prefix_conf_INP >>$tmp/pconfig.h
-    echo ' ' >>$tmp/pconfig.h
-    echo '/* once:' $ac_prefix_conf_DEF '*/' >>$tmp/pconfig.h
-    echo "#endif" >>$tmp/pconfig.h
-    if cmp -s $ac_prefix_conf_OUT $tmp/pconfig.h 2>/dev/null; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_prefix_conf_OUT is unchanged" >&5
-$as_echo "$as_me: $ac_prefix_conf_OUT is unchanged" >&6;}
-    else
-      ac_dir=`$as_dirname -- "$ac_prefix_conf_OUT" ||
-$as_expr X"$ac_prefix_conf_OUT" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_prefix_conf_OUT" : 'X\(//\)[^/]' \| \
-	 X"$ac_prefix_conf_OUT" : 'X\(//\)$' \| \
-	 X"$ac_prefix_conf_OUT" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_prefix_conf_OUT" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      as_dir="$ac_dir"; as_fn_mkdir_p
-      rm -f "$ac_prefix_conf_OUT"
-      mv $tmp/pconfig.h "$ac_prefix_conf_OUT"
-    fi
-    cp conftest.prefix _configs.sed
-  else
-    as_fn_error $? "input file $ac_prefix_conf_INP does not exist - skip generating $ac_prefix_conf_OUT" "$LINENO" 5
-  fi
-  rm -f conftest.*
-fi
- ;;
-    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
-  # are listed without --file.  Let's play safe and only enable the eval
-  # if we detect the quoting.
-  case $CONFIG_FILES in
-  *\'*) eval set x "$CONFIG_FILES" ;;
-  *)   set x $CONFIG_FILES ;;
-  esac
-  shift
-  for mf
-  do
-    # Strip MF so we end up with the name of the file.
-    mf=`echo "$mf" | sed -e 's/:.*$//'`
-    # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
-    # some people rename them; so instead we look at the file content.
-    # Grep'ing the first line is not enough: some people post-process
-    # each Makefile.in and add a new line on top of each file to say so.
-    # Grep'ing the whole file is not good either: AIX grep has a line
-    # limit of 2048, but all sed's we know have understand at least 4000.
-    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-      dirpart=`$as_dirname -- "$mf" ||
-$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$mf" : 'X\(//\)[^/]' \| \
-	 X"$mf" : 'X\(//\)$' \| \
-	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$mf" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-    else
-      continue
-    fi
-    # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
-    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-    test -z "$DEPDIR" && continue
-    am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
-    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
-    # Find all dependency output files, they are included files with
-    # $(DEPDIR) in their names.  We invoke sed twice because it is the
-    # simplest approach to changing $(DEPDIR) to its actual value in the
-    # expansion.
-    for file in `sed -n "
-      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-      # Make sure the directory exists.
-      test -f "$dirpart/$file" && continue
-      fdir=`$as_dirname -- "$file" ||
-$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$file" : 'X\(//\)[^/]' \| \
-	 X"$file" : 'X\(//\)$' \| \
-	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      as_dir=$dirpart/$fdir; as_fn_mkdir_p
-      # echo "creating $dirpart/$file"
-      echo '# dummy' > "$dirpart/$file"
-    done
-  done
-}
- ;;
-    "libtool":C)
-
-    # See if we are running on zsh, and set the options which allow our
-    # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
-      setopt NO_GLOB_SUBST
-    fi
-
-    cfgfile="${ofile}T"
-    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
-    $RM "$cfgfile"
-
-    cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool 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 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool 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 General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-
-# The names of the tagged configurations supported by this script.
-available_tags="CXX "
-
-# ### BEGIN LIBTOOL CONFIG
-
-# Which release of libtool.m4 was used?
-macro_version=$macro_version
-macro_revision=$macro_revision
-
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
-
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
-
-# What type of objects to build.
-pic_mode=$pic_mode
-
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
-
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
-
-# An echo program that protects backslashes.
-ECHO=$lt_ECHO
-
-# The PATH separator for the build system.
-PATH_SEPARATOR=$lt_PATH_SEPARATOR
-
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
-
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
-
-# A sed program that does not truncate output.
-SED=$lt_SED
-
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="\$SED -e 1s/^X//"
-
-# A grep program that handles long lines.
-GREP=$lt_GREP
-
-# An ERE matcher.
-EGREP=$lt_EGREP
-
-# A literal string matcher.
-FGREP=$lt_FGREP
-
-# A BSD- or MS-compatible name lister.
-NM=$lt_NM
-
-# Whether we need soft or hard links.
-LN_S=$lt_LN_S
-
-# What is the maximum length of a command?
-max_cmd_len=$max_cmd_len
-
-# Object file suffix (normally "o").
-objext=$ac_objext
-
-# Executable file suffix (normally "").
-exeext=$exeext
-
-# whether the shell understands "unset".
-lt_unset=$lt_unset
-
-# turn spaces into newlines.
-SP2NL=$lt_lt_SP2NL
-
-# turn newlines into spaces.
-NL2SP=$lt_lt_NL2SP
-
-# convert \$build file names to \$host format.
-to_host_file_cmd=$lt_cv_to_host_file_cmd
-
-# convert \$build files to toolchain format.
-to_tool_file_cmd=$lt_cv_to_tool_file_cmd
-
-# An object symbol dumper.
-OBJDUMP=$lt_OBJDUMP
-
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
-
-# Command to use when deplibs_check_method = "file_magic".
-file_magic_cmd=$lt_file_magic_cmd
-
-# How to find potential files when deplibs_check_method = "file_magic".
-file_magic_glob=$lt_file_magic_glob
-
-# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
-want_nocaseglob=$lt_want_nocaseglob
-
-# DLL creation program.
-DLLTOOL=$lt_DLLTOOL
-
-# Command to associate shared and link libraries.
-sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
-
-# The archiver.
-AR=$lt_AR
-
-# Flags to create an archive.
-AR_FLAGS=$lt_AR_FLAGS
-
-# How to feed a file listing to the archiver.
-archiver_list_spec=$lt_archiver_list_spec
-
-# A symbol stripping program.
-STRIP=$lt_STRIP
-
-# Commands used to install an old-style archive.
-RANLIB=$lt_RANLIB
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
-
-# Whether to use a lock for old archive extraction.
-lock_old_archive_extraction=$lock_old_archive_extraction
-
-# A C compiler.
-LTCC=$lt_CC
-
-# LTCC compiler flags.
-LTCFLAGS=$lt_CFLAGS
-
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
-
-# Transform the output of nm in a proper C declaration.
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
-
-# Transform the output of nm in a C name address pair.
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
-
-# Transform the output of nm in a C name address pair when lib prefix is needed.
-global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
-
-# Specify filename containing input files for \$NM.
-nm_file_list_spec=$lt_nm_file_list_spec
-
-# The root where to search for dependent libraries,and in which our libraries should be installed.
-lt_sysroot=$lt_sysroot
-
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
-
-# Used to examine libraries when file_magic_cmd begins with "file".
-MAGIC_CMD=$MAGIC_CMD
-
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
-
-# Manifest tool.
-MANIFEST_TOOL=$lt_MANIFEST_TOOL
-
-# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
-DSYMUTIL=$lt_DSYMUTIL
-
-# Tool to change global to local symbols on Mac OS X.
-NMEDIT=$lt_NMEDIT
-
-# Tool to manipulate fat objects and archives on Mac OS X.
-LIPO=$lt_LIPO
-
-# ldd/readelf like tool for Mach-O binaries on Mac OS X.
-OTOOL=$lt_OTOOL
-
-# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
-OTOOL64=$lt_OTOOL64
-
-# Old archive suffix (normally "a").
-libext=$libext
-
-# Shared library suffix (normally ".so").
-shrext_cmds=$lt_shrext_cmds
-
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
-
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at link time.
-variables_saved_for_relink=$lt_variables_saved_for_relink
-
-# Do we need the "lib" prefix for modules?
-need_lib_prefix=$need_lib_prefix
-
-# Do we need a version for libraries?
-need_version=$need_version
-
-# Library versioning type.
-version_type=$version_type
-
-# Shared library runtime path variable.
-runpath_var=$runpath_var
-
-# Shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
-
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
-
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME
-library_names_spec=$lt_library_names_spec
-
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
-
-# Permission mode override for installation of shared libraries.
-install_override_mode=$lt_install_override_mode
-
-# Command to use after installation of a shared archive.
-postinstall_cmds=$lt_postinstall_cmds
-
-# Command to use after uninstallation of a shared archive.
-postuninstall_cmds=$lt_postuninstall_cmds
-
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
-
-# As "finish_cmds", except a single script fragment to be evaled but
-# not shown.
-finish_eval=$lt_finish_eval
-
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
-
-# Compile-time system search path for libraries.
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
-
-# Run-time system search path for libraries.
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
-
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
-
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
-
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
-
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
-
-
-# The linker used to build libraries.
-LD=$lt_LD
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
-
-# Commands used to build an old-style archive.
-old_archive_cmds=$lt_old_archive_cmds
-
-# A language specific compiler.
-CC=$lt_compiler
-
-# Is the compiler the GNU compiler?
-with_gcc=$GCC
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic
-
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc
-
-# Whether or not to disallow shared libs when runtime libs are static.
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec
-
-# Whether the compiler copes with passing no objects directly.
-compiler_needs_object=$lt_compiler_needs_object
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
-
-# Commands used to build a shared archive.
-archive_cmds=$lt_archive_cmds
-archive_expsym_cmds=$lt_archive_expsym_cmds
-
-# Commands used to build a loadable module if different from building
-# a shared archive.
-module_cmds=$lt_module_cmds
-module_expsym_cmds=$lt_module_expsym_cmds
-
-# Whether we are building with GNU ld or not.
-with_gnu_ld=$lt_with_gnu_ld
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag
-
-# Flag that enforces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
-
-# Whether we need a single "-rpath" flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary.
-hardcode_direct=$hardcode_direct
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
-# library is relocated.
-hardcode_direct_absolute=$hardcode_direct_absolute
-
-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-# into the resulting binary.
-hardcode_minus_L=$hardcode_minus_L
-
-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-# into the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var
-
-# Set to "yes" if building a shared library automatically hardcodes DIR
-# into the library and all subsequent libraries and executables linked
-# against it.
-hardcode_automatic=$hardcode_automatic
-
-# Set to yes if linker adds runtime paths of dependent libraries
-# to runtime path list.
-inherit_rpath=$inherit_rpath
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs
-
-# Set to "yes" if exported symbols are required.
-always_export_symbols=$always_export_symbols
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms
-
-# Commands necessary for linking programs (against libraries) with templates.
-prelink_cmds=$lt_prelink_cmds
-
-# Commands necessary for finishing linking programs.
-postlink_cmds=$lt_postlink_cmds
-
-# Specify filename containing input files.
-file_list_spec=$lt_file_list_spec
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action
-
-# The directories searched by this compiler when creating a shared library.
-compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
-
-# Dependencies to place before and after the objects being linked to
-# create a shared library.
-predep_objects=$lt_predep_objects
-postdep_objects=$lt_postdep_objects
-predeps=$lt_predeps
-postdeps=$lt_postdeps
-
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path
-
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
-  case $host_os in
-  aix3*)
-    cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-_LT_EOF
-    ;;
-  esac
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '$q' "$ltmain" >> "$cfgfile" \
-     || (rm -f "$cfgfile"; exit 1)
-
-  if test x"$xsi_shell" = xyes; then
-  sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
-func_dirname ()\
-{\
-\    case ${1} in\
-\      */*) func_dirname_result="${1%/*}${2}" ;;\
-\      *  ) func_dirname_result="${3}" ;;\
-\    esac\
-} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_basename ()$/,/^} # func_basename /c\
-func_basename ()\
-{\
-\    func_basename_result="${1##*/}"\
-} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
-func_dirname_and_basename ()\
-{\
-\    case ${1} in\
-\      */*) func_dirname_result="${1%/*}${2}" ;;\
-\      *  ) func_dirname_result="${3}" ;;\
-\    esac\
-\    func_basename_result="${1##*/}"\
-} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
-func_stripname ()\
-{\
-\    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
-\    # positional parameters, so assign one to ordinary parameter first.\
-\    func_stripname_result=${3}\
-\    func_stripname_result=${func_stripname_result#"${1}"}\
-\    func_stripname_result=${func_stripname_result%"${2}"}\
-} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
-func_split_long_opt ()\
-{\
-\    func_split_long_opt_name=${1%%=*}\
-\    func_split_long_opt_arg=${1#*=}\
-} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
-func_split_short_opt ()\
-{\
-\    func_split_short_opt_arg=${1#??}\
-\    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
-} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
-func_lo2o ()\
-{\
-\    case ${1} in\
-\      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
-\      *)    func_lo2o_result=${1} ;;\
-\    esac\
-} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_xform ()$/,/^} # func_xform /c\
-func_xform ()\
-{\
-    func_xform_result=${1%.*}.lo\
-} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_arith ()$/,/^} # func_arith /c\
-func_arith ()\
-{\
-    func_arith_result=$(( $* ))\
-} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_len ()$/,/^} # func_len /c\
-func_len ()\
-{\
-    func_len_result=${#1}\
-} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-fi
-
-if test x"$lt_shell_append" = xyes; then
-  sed -e '/^func_append ()$/,/^} # func_append /c\
-func_append ()\
-{\
-    eval "${1}+=\\${2}"\
-} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
-func_append_quoted ()\
-{\
-\    func_quote_for_eval "${2}"\
-\    eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
-} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  # Save a `func_append' function call where possible by direct use of '+='
-  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-else
-  # Save a `func_append' function call even when '+=' is not available
-  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-fi
-
-if test x"$_lt_function_replace_fail" = x":"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
-$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
-fi
-
-
-   mv -f "$cfgfile" "$ofile" ||
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
-
-
-    cat <<_LT_EOF >> "$ofile"
-
-# ### BEGIN LIBTOOL TAG CONFIG: CXX
-
-# The linker used to build libraries.
-LD=$lt_LD_CXX
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag_CXX
-reload_cmds=$lt_reload_cmds_CXX
-
-# Commands used to build an old-style archive.
-old_archive_cmds=$lt_old_archive_cmds_CXX
-
-# A language specific compiler.
-CC=$lt_compiler_CXX
-
-# Is the compiler the GNU compiler?
-with_gcc=$GCC_CXX
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic_CXX
-
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl_CXX
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static_CXX
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc_CXX
-
-# Whether or not to disallow shared libs when runtime libs are static.
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
-
-# Whether the compiler copes with passing no objects directly.
-compiler_needs_object=$lt_compiler_needs_object_CXX
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
-
-# Commands used to build a shared archive.
-archive_cmds=$lt_archive_cmds_CXX
-archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
-
-# Commands used to build a loadable module if different from building
-# a shared archive.
-module_cmds=$lt_module_cmds_CXX
-module_expsym_cmds=$lt_module_expsym_cmds_CXX
-
-# Whether we are building with GNU ld or not.
-with_gnu_ld=$lt_with_gnu_ld_CXX
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag_CXX
-
-# Flag that enforces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag_CXX
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
-
-# Whether we need a single "-rpath" flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary.
-hardcode_direct=$hardcode_direct_CXX
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
-# library is relocated.
-hardcode_direct_absolute=$hardcode_direct_absolute_CXX
-
-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-# into the resulting binary.
-hardcode_minus_L=$hardcode_minus_L_CXX
-
-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-# into the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
-
-# Set to "yes" if building a shared library automatically hardcodes DIR
-# into the library and all subsequent libraries and executables linked
-# against it.
-hardcode_automatic=$hardcode_automatic_CXX
-
-# Set to yes if linker adds runtime paths of dependent libraries
-# to runtime path list.
-inherit_rpath=$inherit_rpath_CXX
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs_CXX
-
-# Set to "yes" if exported symbols are required.
-always_export_symbols=$always_export_symbols_CXX
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds_CXX
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms_CXX
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms_CXX
-
-# Commands necessary for linking programs (against libraries) with templates.
-prelink_cmds=$lt_prelink_cmds_CXX
-
-# Commands necessary for finishing linking programs.
-postlink_cmds=$lt_postlink_cmds_CXX
-
-# Specify filename containing input files.
-file_list_spec=$lt_file_list_spec_CXX
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action_CXX
-
-# The directories searched by this compiler when creating a shared library.
-compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
-
-# Dependencies to place before and after the objects being linked to
-# create a shared library.
-predep_objects=$lt_predep_objects_CXX
-postdep_objects=$lt_postdep_objects_CXX
-predeps=$lt_predeps_CXX
-postdeps=$lt_postdeps_CXX
-
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
-
-# ### END LIBTOOL TAG CONFIG: CXX
-_LT_EOF
-
- ;;
-
-  esac
-done # for ac_tag
-
-
-as_fn_exit 0
-_ACEOF
-ac_clean_files=$ac_clean_files_save
-
-test $ac_write_fail = 0 ||
-  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
-
-
-# configure is writing to config.log, and then calls config.status.
-# config.status does its own redirection, appending to config.log.
-# Unfortunately, on DOS this fails, as config.log is still kept open
-# by configure, so config.status won't be able to write to it; its
-# output is simply discarded.  So we exec the FD to /dev/null,
-# effectively closing config.log, so it can be properly (re)opened and
-# appended to by config.status.  When coming back to configure, we
-# need to make the FD available again.
-if test "$no_create" != yes; then
-  ac_cs_success=:
-  ac_config_status_args=
-  test "$silent" = yes &&
-    ac_config_status_args="$ac_config_status_args --quiet"
-  exec 5>/dev/null
-  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
-  exec 5>>config.log
-  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
-  # would make configure fail if this is the last instruction.
-  $ac_cs_success || as_fn_exit 1
-fi
-if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
-fi
-
diff --git a/configure.ac b/configure.ac
index 760f5ec..12c8981 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3,7 +3,7 @@
 #  ========LICENCE========
 # This file is part of the library LinBox.
 #
- LinBox is free software: you can redistribute it and/or modify
+# LinBox is free software: you can redistribute it and/or modify
 # it under the terms of the  GNU Lesser General Public
 # License as published by the Free Software Foundation; either
 # version 2.1 of the License, or (at your option) any later version.
@@ -17,15 +17,18 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 # ========LICENCE========
-AC_PREREQ(2.61)
+#/
 
-AC_INIT([LinBox], [1.3.2],[linbox-use at googlegroups.com],[linbox],
+AC_PREREQ([2.61])
+
+AC_INIT([LinBox], [1.4.1],[linbox-use at googlegroups.com],[linbox],
 		[http://www.linalg.org/])
+
 AC_CONFIG_MACRO_DIR([macros])
 AC_CONFIG_AUX_DIR([build-aux])
 AM_INIT_AUTOMAKE([1.8 gnu no-dependencies -Wall -Wno-portability])
-AM_CONFIG_HEADER([config.h])
-AX_PREFIX_CONFIG_H(linbox/linbox-config.h, __LINBOX)
+AC_CONFIG_HEADERS([config.h])
+AX_PREFIX_CONFIG_H(linbox/config.h, __LINBOX)
 AC_PATH_PROG(RM, rm, $FALSE)
 RM="$RM -f"
 
@@ -65,15 +68,21 @@ AC_PROG_CXX
 
 AC_COMPILER_NAME
 
+STDFLAG=${CXXFLAGS}
+
+CXXFLAGS=""
+
+# We need a C++11 compiler now - AB 2014-12-12
+AX_CXX_COMPILE_STDCXX_11([],[mandatory])
+
 AC_SUBST([DEFAULT_CFLAGS])
 AC_SUBST([DEBUG_CFLAGS])
 AC_SUBST([TESTS_CFLAGS])
 
 TESTS_CFLAGS="-O0"
 DEBUG_CFLAGS="-g"
-
 DEFAULT_CFLAGS=""
-# WARN_CFLAGS="-Wall"
+WARN_CFLAGS="-Wall"
 
 #TODO use -fast for icc, -ipa for eko...
 if test "x$DBG" = "xyes" ; then
@@ -92,17 +101,49 @@ if test "x$WARN" = "xyes" -o "x$WARN" = "xfull" ; then
 	case x${CCNAM} in
 		xicc)
 		WARN_CFLAGS="${WARN_CFLAGS} -Wcheck"
-		# DEBUG_CFLAGS="-fast"
+		WARN_CFLAGS="${WARN_CFLAGS} -Wall -Wno-unused-parameter -Wuninitialized -Wconversion -Wcast-qual -pedantic -Wshadow -Wpointer-arith -Wwrite-strings -Wno-long-long"
+		WARN_CFLAGS="${WARN_CFLAGS} -Wextra -ansi"
 			;;
 		xeko)
 			WARN_CFLAGS="${WARN_CFLAGS} -Wno-unused-parameter"
 			;;
-		xgcc|xclang)
+		xgcc|xgcc44)
+			WARN_CFLAGS="${WARN_CFLAGS} -Wextra -Wno-unused-parameter"
+			if test "x${WARN}" = "xfull" ; then
+				WARN_CFLAGS="${WARN_CFLAGS} -Wuninitialized -Wconversion -Wcast-qual -pedantic -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Wno-long-long  -Wno-variadic-macros -Wno-vla"
+			fi
+			if test "x${HAVE_CXX11}" = "x0" ; then
+				WARN_CFLAGS="${WARN_CFLAGS} -ansi"
+			fi
+			;;
+		xgcc48)
+			WARN_CFLAGS="${WARN_CFLAGS} -Wextra -Wno-unused-parameter"
+			if test "x${WARN}" = "xfull" ; then
+				WARN_CFLAGS="${WARN_CFLAGS} -Wuninitialized -Wconversion -Wcast-qual -pedantic -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Wno-long-long  -Wno-variadic-macros -Wno-vla"
+				# WARN_CFLAGS="${WARN_CFLAGS} -fsanitize=address"
+			fi
+			if test "x${HAVE_CXX11}" = "x0" ; then
+				WARN_CFLAGS="${WARN_CFLAGS} -ansi"
+			fi
+
+			;;
+
+		xclang)
 			WARN_CFLAGS="${WARN_CFLAGS} -Wextra -Wno-unused-parameter"
 			if test "x${WARN}" = "xfull" ; then
-				WARN_CFLAGS="${WARN_CFLAGS} -Wuninitialized -Wconversion -Wcast-qual -ansi -pedantic -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Wno-long-long"
+				WARN_CFLAGS="${WARN_CFLAGS} -Wuninitialized -Wconversion -Wcast-qual -pedantic -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Wno-long-long -Wno-vla-extension -Wno-variadic-macros"
+				WARN_CFLAGS="${WARN_CFLAGS} -D__STRICT_ANSI__"
 			fi
-		;;
+			;;
+		xclang31)
+			WARN_CFLAGS="${WARN_CFLAGS} -Wextra -Wno-unused-parameter"
+			if test "x${WARN}" = "xfull" ; then
+				WARN_CFLAGS="${WARN_CFLAGS} -Wuninitialized -Wconversion -Wcast-qual -pedantic -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Wno-long-long  -g -Wno-vla-extension -Wno-variadic-macros"
+				WARN_CFLAGS="${WARN_CFLAGS} -D__STRICT_ANSI__"
+				# WARN_CFLAGS="${WARN_CFLAGS} -fsanitize=address"
+			fi
+			;;
+
 		*)
 			echo
 			echo "*******************************************************"
@@ -127,8 +168,16 @@ LT_INIT
 
 
 echo "-----------------------------------------------"
+echo "        START  LINBOX CONFIG                   "
+echo "-----------------------------------------------"
 
 
+echo "-----------------------------------------------"
+LB_OMP
+echo "-----------------------------------------------"
+AC_SUBST([PARFLAGS],['${OMPFLAGS}'])
+AC_SUBST([PARLIBS],['${OMPFLAGS}'])
+
 # Machine characteristics
 
 AC_CHECK_SIZEOF(char, 8)
@@ -140,7 +189,7 @@ AC_CHECK_SIZEOF(__int64, 64)
 
 # Checks for header files.
 AC_HEADER_STDC
-AC_CHECK_HEADERS([float.h limits.h stddef.h stdlib.h string.h sys/time.h stdint.h])
+AC_CHECK_HEADERS([float.h limits.h stddef.h stdlib.h string.h sys/time.h stdint.h pthread.h])
 
 
 # check endianness of the architecture
@@ -149,186 +198,113 @@ AC_C_BIGENDIAN(
   [AC_DEFINE(HAVE_LITTLE_ENDIAN, 1, [Define that architecture uses little endian storage])],
   [])
 
-# Create some useful data types of fixed, known lengths
-
-# We hereby assume that a character is always one byte
-# LINBOX_INT8="char";
-
-# case $ac_cv_sizeof_char in
-  # 1)
-     # TWO_BYTES=2;
-     # FOUR_BYTES=4;
-     # EIGHT_BYTES=8;
-     # ;;
-  # 8)
-     # TWO_BYTES=16;
-     # FOUR_BYTES=32;
-     # EIGHT_BYTES=64;
-# esac
-
-# case $TWO_BYTES in
-  # $ac_cv_sizeof_short)
-     # LINBOX_INT16="short";
-     # ;;
-  # $ac_cv_sizeof_int)
-     # LINBOX_INT16="int";
-     # ;;
-# esac
-
-# case $FOUR_BYTES in
-  # $ac_cv_sizeof_short)
-     # LINBOX_INT32="short";
-     # ;;
-  # $ac_cv_sizeof_int)
-     # LINBOX_INT32="int";
-     # ;;
-  # $ac_cv_sizeof_long)
-     # LINBOX_INT32="long";
-     # ;;
-# esac
-
-# case $EIGHT_BYTES in
-  # $ac_cv_sizeof_short)
-     # LINBOX_INT64="short";
-     # ;;
-  # $ac_cv_sizeof_int)
-     # LINBOX_INT64="int";
-     # ;;
-  # $ac_cv_sizeof_long)
-     # LINBOX_INT64="long";
-     # ;;
-  # $ac_cv_sizeof_long_long)
-     # LINBOX_INT64="long long";
-     # ;;
-  # $ac_cv_sizeof___int64)
-     # LINBOX_INT64="__int64";
-     # ;;
-# esac
-
-# AC_DEFINE_UNQUOTED(INT8, $LINBOX_INT8, Canonical 8-bit data type)
-# AC_DEFINE_UNQUOTED(INT16, $LINBOX_INT16, Canonical 16-bit data type)
-# AC_DEFINE_UNQUOTED(INT32, $LINBOX_INT32, Canonical 32-bit data type)
-# AC_DEFINE_UNQUOTED(INT64, $LINBOX_INT64, Canonical 64-bit data type)
-
 echo "-----------------------------------------------"
 # Feature checks
 LB_MISC
 LB_DRIVER
 
-AC_LANG_CPLUSPLUS
 
 echo "-----------------------------------------------"
 
-LB_CHECK_GMP(,,[
+# Now getting GMP and Givaro from FFLAS-FFPACK - AB 2014-12-10
+
+LB_CHECK_FFLAS_FFPACK(,,[
+echo ''
 echo '*******************************************************************************'
-echo ' ERROR: GMP not found!'
+echo ' ERROR: Fflas-Ffpack not found!'
 echo
-echo ' GMP library compiled with --enable-cxx is required for this library to compile.'
-echo ' Please make sure GMP is installed and specify its location with the option'
-echo ' --with-gmp=<prefix> when running configure.'
+echo ' Fflas-Ffpack routines are required for this library to compile. Please'
+echo ' make sure they are installed and specify its location with the option'
+echo ' --with-fflas-ffpack=<lib> when running configure.'
+echo ' Also make sure your compiler supports cxx-11...'
 echo '*******************************************************************************'
 exit 1
 ])
 
+LB_CHECK_LAPACK
+
+# AC_MSG_RESULT($BLAS_LIBS)
+# AC_MSG_RESULT($BLAS_CFLAGS)
+
 LB_CHECK_IML
 LB_CHECK_M4RI
 LB_CHECK_M4RIE
 LB_CHECK_MPFR
 # we nedd mpfr next :
 LB_CHECK_FPLLL
+LB_CHECK_FLINT
 
 LB_CHECK_NTL
-LB_CHECK_GIVARO(,,[
-echo '*******************************************************************************'
-echo ' ERROR: GIVARO not found!'
-echo
-echo ' GIVARO library is required for this library to compile.'
-echo ' Please make sure GIVARO is installed and specify its location with the'
-echo ' option --with-givaro=<prefix> when running configure.'
-echo '*******************************************************************************'
-exit 1
-])
-
 
 LB_CHECK_SACLIB
-LB_CHECK_LIDIA
 LB_CHECK_MAPLE
 LB_CHECK_SAGE
-#LB_CHECK_ATLAS
-
-# LB_CHECK_BLAS(,,[
-# echo ''
-# echo '*******************************************************************************'
-# echo ' ERROR: BLAS not found!'
-# echo
-# echo ' BLAS routines are required for this library to compile. Please'
-# echo ' make sure BLAS are installed and specify its location with the option'
-# echo ' --with-blas=<lib> when running configure.'
-# echo '*******************************************************************************'
-# exit 1
-# ])
-
-
-LB_CHECK_FFLAS_FFPACK(,,[
-echo ''
-echo '*******************************************************************************'
-echo ' ERROR: Fflas-Ffpack not found!'
-echo
-echo ' Fflas-Ffpack routines  are required for this library to compile. Please'
-echo ' make sure they are installed and specify its location with the option'
-echo ' --with-fflas-ffpack=<lib> when running configure.'
-echo '*******************************************************************************'
-exit 1
-])
-
-LB_CHECK_LAPACK
-
-# AC_MSG_RESULT($BLAS_LIBS)
-# AC_MSG_RESULT($BLAS_CFLAGS)
-
 
 LB_CHECK_EXPAT
 
 LB_BENCH
-LB_OPT
+LB_CHECK_XML
+# LB_OPT
 LB_DOC
 
-if test ! -d ./benchmarks/data  ; then
+LB_CHECK_OCL
+
+
+if test ! -d ./benchmarks/data ; then
 	echo "Creating data dir in benchmark" ;
-	mkdir ./benchmarks/data  ;
+	mkdir ./benchmarks/data ;
 fi
 
-# this is bogus so far as I can tell.  -bds
-#CXXFLAGS="${GMP_CFLAGS} ${NTL_CFLAGS} ${GIVARO_CFLAGS} ${SACLIB_CFLAGS} ${CXXFLAGS}"
-#AC_SUBST(CXXFLAGS)
+DEPS_CFLAGS="${FFLAS_FFPACK_CFLAGS} ${NTL_CFLAGS} ${MPFR_CFLAGS} ${FPLLL_CFLAGS} ${IML_CFLAGS} ${FLINT_CFLAGS}"
+DEPS_LIBS="${FFLAS_FFPACK_LIBS} ${NTL_LIBS} ${MPFR_LIBS} ${FPLLL_LIBS} ${IML_LIBS} ${FLINT_LIBS} ${OCL_LIBS}"
+
+CXXFLAGS="${CXXFLAGS} ${STDFLAG}"
 
-CXXFLAGS="${GMP_CFLAGS} ${CXXFLAGS}"
 AC_SUBST(CXXFLAGS)
+AC_SUBST(DEPS_CFLAGS)
+AC_SUBST(DEPS_LIBS)
 
 echo "-----------------------------------------------"
 
+dnl MYLIBS="${FFLAS_FFPACK_LIBS} ${NTL_LIBS} ${MPFR_LIBS} ${FPLLL_LIBS} ${IML_LIBS} ${FLINT_LIBS} ${LDFLAGS} ${OCL_LIBS}"
+dnl MYLIBS="${LIBS}"
+dnl MYFLAGS="${FFLAS_FFPACK_CFLAGS} ${NTL_CFLAGS} ${MPFR_CFLAGS} ${FPLLL_CFLAGS} ${IML_CFLAGS} ${FLINT_CFLAGS} ${OPT_FLAGS}"
+
+echo "CXXFLAGS       = ${CXXFLAGS}"
+echo "LIBS           = ${LIBS}"
+echo "DEPS_CFLAGS    = ${DEPS_CFLAGS}"
+echo "DEPS_LIBS      = ${DEPS_LIBS}"
+echo "DEFAULT CFLAGS = ${DEFAULT_CFLAGS}"
+echo "TESTS CFLAGS   = ${TESTS_CFLAGS}"
+
+echo "-----------------------------------------------"
+echo "         END   LINBOX CONFIG                   "
+echo "-----------------------------------------------"
+
 AC_CONFIG_FILES([
 Makefile
 linbox-config
 examples/Makefile
-examples/fields/Makefile
-examples/Readme-make
 doc/Makefile
 linbox/Makefile
 linbox/algorithms/Makefile
 linbox/algorithms/gauss/Makefile
 linbox/algorithms/matrix-blas3/Makefile
+linbox/algorithms/opencl-kernels/Makefile
+linbox/algorithms/polynomial-matrix/Makefile
 linbox/blackbox/Makefile
 linbox/element/Makefile
 linbox/field/Makefile
-linbox/field/NTL/Makefile
-linbox/field/Givaro/Makefile
-linbox/field/Modular/Makefile
 linbox/matrix/Makefile
+linbox/matrix/sparsematrix/Makefile
+linbox/matrix/densematrix/Makefile
+linbox/matrix/matrixdomain/Makefile
+linbox/matrix/sliced3/Makefile
 linbox/randiter/Makefile
 linbox/ring/Makefile
+linbox/ring/ntl/Makefile
+linbox/ring/modular/Makefile
 linbox/solutions/Makefile
-linbox/switch/Makefile
 linbox/util/Makefile
 linbox/util/formats/Makefile
 linbox/vector/Makefile
@@ -342,5 +318,18 @@ interfaces/kaapi/Makefile
 interfaces/sage/Makefile
 macros/Makefile
 benchmarks/Makefile
+benchmarks/data/Makefile
+benchmarks/matrix/Makefile
+linbox.pc
 ])
+# linbox/algorithms/IML/Makefile
+
+# examples/Readme-make
+# examples/field
+# examples/solver
+# examples/blackbox
+# examples/data
+
 AC_OUTPUT
+
+echo "-----------------------------------------------"
diff --git a/doc/Makefile.am b/doc/Makefile.am
index d56ce1d..0f50f59 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -39,7 +39,6 @@ docs :
 	if test -d linbox-html ; then echo exists; else mkdir linbox-html ; fi
 	if test -d linbox-dev-html ; then echo exists; else mkdir linbox-dev-html ; fi
 	cp index-dev.html linbox-dev-html/index.html
-	cp tutorial.html linbox-html/
 	cp install-dist.html linbox-html/
 	cp install-dev.html linbox-html/
 	cp ../INSTALL linbox-html/
@@ -49,7 +48,6 @@ docs :
 
 docs_dev :
 	make docs
-	cp tutorial.html linbox-dev-html/
 	cp install-dist.html linbox-dev-html/
 	cp install-dev.html linbox-dev-html/
 	cp ../INSTALL linbox-dev-html/
@@ -67,7 +65,6 @@ install-doc :
 
 EXTRA_DIST=             \
     linbox.html         \
-    tutorial.html       \
     install-dev.html    \
     index-dev.html      \
     install-dist.html   \
@@ -76,6 +73,7 @@ EXTRA_DIST=             \
     doc.doxy            \
     mainpage.doxy       \
     tutorial.doxy       \
+    versionning.doxy    \
     linbox-config.1
 
 
diff --git a/doc/Makefile.in b/doc/Makefile.in
deleted file mode 100644
index 90d5449..0000000
--- a/doc/Makefile.in
+++ /dev/null
@@ -1,611 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-#
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-#/
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = doc
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-man1dir = $(mandir)/man1
-am__installdirs = "$(DESTDIR)$(man1dir)"
-NROFF = nroff
-MANS = $(man1_MANS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = $(LINBOX_DOC_PATH)
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
- at LINBOX_BUILD_DOC_TRUE@USE_TARGETS = docs
- at LINBOX_BUILD_DOC_TRUE@INSTALL_TARGETS = install-doc
-man1_MANS = linbox-config.1
-EXTRA_DIST = \
-    linbox.html         \
-    tutorial.html       \
-    install-dev.html    \
-    index-dev.html      \
-    install-dist.html   \
-    Doxyfile.mod        \
-    DoxyfileDev.mod     \
-    doc.doxy            \
-    mainpage.doxy       \
-    tutorial.doxy       \
-    linbox-config.1
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps doc/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps doc/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-man1: $(man1_MANS)
-	@$(NORMAL_INSTALL)
-	@list1='$(man1_MANS)'; \
-	list2=''; \
-	test -n "$(man1dir)" \
-	  && test -n "`echo $$list1$$list2`" \
-	  || exit 0; \
-	echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
-	$(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
-	{ for i in $$list1; do echo "$$i"; done;  \
-	if test -n "$$list2"; then \
-	  for i in $$list2; do echo "$$i"; done \
-	    | sed -n '/\.1[a-z]*$$/p'; \
-	fi; \
-	} | while read p; do \
-	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; echo "$$p"; \
-	done | \
-	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
-	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
-	sed 'N;N;s,\n, ,g' | { \
-	list=; while read file base inst; do \
-	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
-	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
-	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
-	  fi; \
-	done; \
-	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
-	while read files; do \
-	  test -z "$$files" || { \
-	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
-	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
-	done; }
-
-uninstall-man1:
-	@$(NORMAL_UNINSTALL)
-	@list='$(man1_MANS)'; test -n "$(man1dir)" || exit 0; \
-	files=`{ for i in $$list; do echo "$$i"; done; \
-	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
-	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
-	dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
-	@list='$(MANS)'; if test -n "$$list"; then \
-	  list=`for p in $$list; do \
-	    if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
-	    if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \
-	  if test -n "$$list" && \
-	    grep 'ab help2man is required to generate this page' $$list >/dev/null; then \
-	    echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \
-	    grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/         /' >&2; \
-	    echo "       to fix them, install help2man, remove and regenerate the man pages;" >&2; \
-	    echo "       typically \`make maintainer-clean' will remove them" >&2; \
-	    exit 1; \
-	  else :; fi; \
-	else :; fi
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(MANS)
-installdirs:
-	for dir in "$(DESTDIR)$(man1dir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool clean-local mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-man
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man: install-man1
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-man
-
-uninstall-man: uninstall-man1
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-	clean-local distclean distclean-generic distclean-libtool \
-	distdir dvi dvi-am html html-am info info-am install \
-	install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-man1 install-pdf install-pdf-am install-ps \
-	install-ps-am install-strip installcheck installcheck-am \
-	installdirs maintainer-clean maintainer-clean-generic \
-	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
-	ps ps-am uninstall uninstall-am uninstall-man uninstall-man1
-
-
-all all-local: $(USE_TARGETS)
-
-install install-data-local: $(INSTALL_TARGETS)
-
-docs :
-	sed -i 's/\\version\s1.*/\\version\ $(VERSION)/' mainpage.doxy
-	if test -d linbox-html ; then echo exists; else mkdir linbox-html ; fi
-	if test -d linbox-dev-html ; then echo exists; else mkdir linbox-dev-html ; fi
-	cp index-dev.html linbox-dev-html/index.html
-	cp tutorial.html linbox-html/
-	cp install-dist.html linbox-html/
-	cp install-dev.html linbox-html/
-	cp ../INSTALL linbox-html/
-	cp ../COPYING linbox-html/
-	cp ../AUTHORS linbox-html/
-	doxygen Doxyfile
-
-docs_dev :
-	make docs
-	cp tutorial.html linbox-dev-html/
-	cp install-dist.html linbox-dev-html/
-	cp install-dev.html linbox-dev-html/
-	cp ../INSTALL linbox-dev-html/
-	cp ../COPYING linbox-dev-html/
-	cp ../AUTHORS linbox-dev-html/
-	doxygen DoxyfileDev
-
-install-doc :
-	mkdir -p $(DESTDIR)/$(docdir)
-	cp -rp linbox-html $(DESTDIR)/$(docdir)/linbox-html
-	cp -rp linbox-dev-html $(DESTDIR)/$(docdir)/linbox-dev-html
-	cp -p linbox.html $(DESTDIR)/$(docdir)/linbox.html
-
-clean-local :
-	rm -rf linbox-html
-	rm -rf linbox-dev-html
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/doc/install-1.0.html b/doc/install-1.0.html
new file mode 100644
index 0000000..528e02c
--- /dev/null
+++ b/doc/install-1.0.html
@@ -0,0 +1,164 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<!--  Copyright (C) 2005 LinBox team, part of LinBox, GNU LGPL, see COPYING
+-->
+<!--
+/*
+ * Coypright (c) LinBox
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *
+ */
+ -->
+<html>
+<head>
+   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+   <meta name="GENERATOR" content="Mozilla/4.76 [en] (X11; U; SunOS 5.8 sun4u) [Netscape]">
+</head>
+  <body text="#000000" bgcolor="#FFFFFF" link="#0000EE" vlink="#551A8B" alink="#FF0000">
+     
+    <center>
+      <p><b><font size=+2>How to install LinBox (from a distribution)</font></b></center>
+
+    <p><br>
+    <blockquote>
+      See also <a href="INSTALL">INSTALL</a>.  Once the LinBox
+      distribution has been downloaded from the <a href="http://www.linalg.org/download.html"> LinBox download section</a> ,
+    </blockquote>
+
+    <blockquote>
+      <p><b>1.</b>
+	Unpack the distribution using <tt>tar</tt> command:
+      <blockquote>
+	<tt>
+	  tar -xvzf linbox-X.X.X.tar.gz
+	</tt>
+      </blockquote>
+    </blockquote>
+
+    <blockquote>
+      <b>2.</b> Go to the newly-created linbox directory and
+      run the script
+      <b>configure,</b> optionally you may specify the LinBox
+      installation directory or an optional package directory using prefixes:
+      <blockquote><tt>> cd linbox</tt>
+	<br><tt>> ./configure [--prefix=<inst. dir.> --with-package=<location> --enable-feature]</tt></blockquote>
+      <a href="http://swox.com/gmp">Gmp</a> is required and its location
+      must be specified <gmp location> is not a standard location such as
+      <tt>/usr</tt> or <tt>/usr/loca</tt>l:
+      <blockquote><tt>> ./configure --with-gmp= <gmp location>
+	  [...]</tt></blockquote>
+      <a href="http://math-atlas.sourceforge.net/">Atlas</a>, or other source of BLAS, is also required and its location
+      must be specified if not standard.
+      <blockquote><tt>> ./configure --with-atlas= <atlas location>
+	  [...]</tt></blockquote>
+      This sets up the library and runs  .<tt>/configure</tt>
+
+      <p> <b>3.</b> Optional configurations
+
+      <blockquote>
+	<b> 3.1.</b> Where to put the <tt>include/</tt> and <tt>lib/</tt> directories:
+	<blockquote><tt>--prefix= <chosen installation directory></tt>
+	  <br>Ex:  <tt> ./configure --prefix= `pwd` </tt>will put the files within the current
+	  directory</blockquote>
+
+	<p><b> 3.2.</b> The use of an optional package is switched on by specifying the directory
+	  where it can be found:
+	<blockquote>
+	  --with-package=<package_directory>
+	  <br>
+	  <br>
+	  <package_directory> can be left blank if the package is installed in a standard directory (<tt>/usr</tt> or <tt>/usr/local</tt>)
+	  <br>
+	  Ex: <tt> ./configure --with-givaro</tt> will enable the use of Givaro library and assume it is installed in a standard directory
+	  <br>
+	  <br>
+	  <b>Available packages are the following:</b>
+	  <br>
+	  <br>
+	  <table  border="3" style="text-align: left; margin-left: 30pt;" cellpadding="5" cellspacing="5">
+	    <tr>
+	      <td> <a href="http://ljk.imag.fr/CASYS/LOGICIELS/givaro/givaro-3.1.3.tar.gz"> Givaro (v3.1.3)</a> </td>
+	      <td> <tt> --with-givaro= <givaro_directory></tt> </td>
+	      <td> used for finite field arithmetic.</td>
+	    </tr>
+	    <tr>
+	      <td> <a href="http://www.informatik.tu-darmstadt.de/TI/LiDIA/"> Lidia </a></td>
+	      <td> <tt> --with-lidia= <lidia_directory></tt> </td>
+	      <td> used for finite field arithmetic.</td>
+	    </tr>
+	    <tr>
+	      <td> <a href="http://shoup.net/ntl/">NTL</a></td>
+	      <td> <tt> --with-ntl= <ntl_directory></tt></td>
+	      <td> used for finite field, polynomial arithmetic.</td>
+	    </tr>
+	    <tr>
+	      <td> <a href="ftp://ftp.risc.uni-linz.ac.at/pub/saclib/"> Saclib </a></td>
+	      <td> <tt> --with-saclib= <saclib_directory></td>
+	      <td> not yet used </td>
+	    </tr>
+	    <tr>
+	      <td> <a href="http://www.maplesoft.com/"> Maple </a></td>
+	      <td> <tt> --with-maple= <maple-directory>  </tt></td>
+	      <td> used to create an interface with Maple.</td>
+	    </tr>
+	    <tr>
+	      <td> <a href="http://www.doxygen.org/"> Doxygen </a></td>
+	      <td> <tt> --with-doxygen= <doxygen-path>  </tt></td>
+	      <td>used to create the html reference manual.</td>
+	    </tr>
+	  </table>
+
+	  <br>
+	  Note:
+	  <blockquote>
+	    <p> the use of <tt> --with-default= <default_directory></tt> can add a special directory to the default location of library
+	    <p> the use of <tt> --with-all</tt> specifies that all packages will be used
+	  </blockquote>
+	</blockquote>
+
+	<p><b> 3.3.</b> The use of special feature is switched on by calling the enable parameter:
+	<blockquote>
+	  <tt> --enable-feature</tt>
+	  <br>
+	  Ex: <tt> ./configure --enable-shared</tt>  will turn on the build of a shared library
+	  <br>
+	  <br>
+	  <b>Available extra features are the following:</b>
+	  <br>
+	  <br>
+	  <table  border="3" style="text-align: left; margin-left: 30pt;" cellpadding="5" cellspacing="5">
+	    <tr>
+	      <td> <tt> --enable-optimization</tt> </td>
+	      <td> turn on runtime optimization during the configuration </td>
+	    </tr>
+	    <tr>
+	      <td> <tt> --enable-doc</tt> </td>
+	      <td> turn on the build of documentation via Doxygen.</td>
+	    </tr>
+	  </table>
+	</blockquote>
+      </blockquote>
+      <b>4.  </b>Install the library:
+      <blockquote><tt>>  make install</tt></blockquote>
+    </blockquote>
+
+    <hr WIDTH="100%">
+    <div align=right><font size=-1>Copyright 1999-2005 The Linbox Group.</font></div>
+
+  </body>
+</html>
diff --git a/doc/install-dev.html b/doc/install-dev.html
index 78445e8..aecd689 100644
--- a/doc/install-dev.html
+++ b/doc/install-dev.html
@@ -34,10 +34,12 @@
 <body text="#000000" bgcolor="#FFFFFF" link="#0000EE" vlink="#551A8B" alink="#FF0000">
  
 <center>
-	<p><b><font size=+2>How to install LinBox (for developers using svn)</font></b></center></p>
+	<p><b><font size=+2>How to install LinBox (for developers using git)</font></b></center></p>
 
 <p>
-When you have retrieved your local svn snapshot, you can configure LinBox with the <b>autogen.sh</b> script.
+Retrieve givaro, fflas-ffpack, and from github.com/linbox-team.
+You can configure LinBox with the <b>autogen.sh</b> script.
+
 You can use it exactly the same way <tt>./configure</tt> works (<small>execpt for the --help part... :(</small>) See <a href="install-dist.html">here</a> for additional information on configure script.
 </p>
 <p>
diff --git a/doc/mainpage.doxy b/doc/mainpage.doxy
index 964277d..69647d6 100644
--- a/doc/mainpage.doxy
+++ b/doc/mainpage.doxy
@@ -1,5 +1,5 @@
 // Copyright (C) 2005 David Saunders, 2010 LinBox. This file is part of LinBox,
-// GNU LGPL, see COPYING for lincene information.
+// GNU LGPL, see COPYING for license information.
 /*
  * Coypright (c) LinBox
  * ========LICENCE========
@@ -95,6 +95,11 @@
  * - \subpage inst. Explains how to install from sources or from the latest svn
  * version.
  * - \subpage arch. Describes how %LinBox is organized
+ * \internal
+ * - \subpage upgr. Explains how to make new versions of %LinBox  \endinternal
+ * .
+ *
+ * \section docu Documentation
  * - <a href="../linbox-html/index.html"     style="color: blue  ; font-weight:
  * bold"> Documentation for Users</a>. If everything around is blue, then you
  * are reading the lighter, user-oriented, documentation.
@@ -114,10 +119,10 @@
  * discussions).
  *
  * \authors Members of the \link AUTHORS %LinBox group\endlink.  The most
- * prolific documenters have been first William J Turner, then Bradford
- * Hovinen, and David Saunders.
+ * prolific documenters have been William J Turner, Bradford Hovinen, 
+ * David Saunders, Brice Boyer.
  *
- * \version 1.3.0
+ * \version 1.4.0
  *
  * \par Support.
  * The project is supported by the National Science Foundation
@@ -125,8 +130,9 @@
  */
 
  /*! \page copy Copyright and Licencing
-  * The copyright and licensing (GNU LGPL) info of %LinBox is in \c COPYING
-  * \verbinclude "COPYING".
+  * The copyright and licensing (GNU LGPL) info of %LinBox is in \c COPYING.LESSER (and below).
+  * It gives permissions in addition to those of the GPL, see \c COPYING.
+  * \verbinclude "COPYING.LESSER".
   */
 
 /*!  \page inst Installing LinBox
diff --git a/doc/organization/Linbox.draft b/doc/organization/Linbox.draft
new file mode 100644
index 0000000..cc40512
--- /dev/null
+++ b/doc/organization/Linbox.draft
@@ -0,0 +1,60 @@
+/Linbox 	
+	--/doc						: Describes Linbox
+		--/algorithms				: requirements and implementations for algorithms
+		--/organization				: documentation on the package organization
+
+	--/config					: generic makefiles, configuration files
+
+	--/src						: Library
+	   --/library
+		--/archetypes				: Linbox archetypes
+			--/Field			
+			--/Blackbox
+			--/Polynomials
+
+		--/algorithms				: Linbox algorithms (generic on Linbox objects)
+			--/Ring
+			--/Field
+				--/FiniteExtension	: Finite fields as a polynomial domain over finite fields
+							  Requires   templates with field operations
+							  Implements		    field operations		
+			--/Blackbox			: Requires   templates with Apply
+							  Implements                Apply
+				--/Composition 		: A o B
+				--/Transposition	: A^t
+			--/Sequence			: Minimum polynomials
+				--/Iterator		: Requires   templates with Apply
+							  Implements                forward_iterator (u^t A^i v)
+				--/Massey		: Requires   templates with forward_iterator
+							  Implements                degree, minimun_poly
+				--/Wiedemann		: Requires   templates with Apply, minimum_poly
+							  Implements		    rank, matrix minpoly
+
+		--/objects				: Implements from scratch
+				--/Random
+				--/Blackbox
+				--/Field
+
+	   --/wrappers					: Links existing libraries
+		--/by_library				: Wraps existing classes to match Linbox requirements
+		   --/A Library
+			--/Rings			: Implements ring operations 	from 	+,*,..
+				--/Integer		: Implements integer operations	from	GMP, ...
+				--/Polynomials		: Implements Polynomial domain	from 	...
+			--/Fields			: Implements field operations 	from 	+,*,/,..
+				--/ZpZ			: parametrized with a modulus   from    NTL ...
+				--/GFq			: tabulated finite fields       from    Givaro ...
+			--/Blackbox
+				--/SparseBlackbox	: Implements Apply 		from    vector of sparse vectors
+				--/DenseBlackbox	: Implements Apply 		from    bidimensionnal arrays
+
+		--/by_scope				: Links to wrappers, but organized by scope
+
+	  --/tools
+		--/Commentator
+		--/SparseVector
+
+	  --/examples
+		--/Gauss				: Sparse gaussian elimination with reordering
+		--/Random				: Random generators tests
+		--/Sequence				: Wiedemann algorithm
diff --git a/doc/organization/Makefile.am b/doc/organization/Makefile.am
new file mode 100644
index 0000000..13a43c1
--- /dev/null
+++ b/doc/organization/Makefile.am
@@ -0,0 +1,24 @@
+# Copyright (c) 2010 the LinBox group
+# see COPYING for licence
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the  GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# ========LICENCE========
+
+
+
+EXTRA_DIST=\
+	Linbox.draft
diff --git a/doc/tex/Makefile.am b/doc/tex/Makefile.am
new file mode 100644
index 0000000..85ec499
--- /dev/null
+++ b/doc/tex/Makefile.am
@@ -0,0 +1,38 @@
+# Copyright (c) 2010 the LinBox group
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the  GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# ========LICENCE========
+
+
+
+if USE_DOCPLUSPLUS_TEX
+USE_TARGETS = linbox.tex linbox.ps linbox.dvi
+endif
+
+CLEANFILES = linbox.tex linbox.ps
+MOSTLYCLEANFILES = linbox.aux linbox.log linbox.dvi
+
+all-local: $(USE_TARGETS)
+
+linbox.ps: linbox.dvi
+	dvips linbox.dvi -o linbox.ps
+
+linbox.dvi: linbox.tex
+	latex "\scrollmode\input linbox"; exit 0
+
+linbox.tex: $(top_srcdir)/linbox/linbox.dxx
+	doc++ -t -o linbox.tex $(top_srcdir)/linbox/linbox.dxx
diff --git a/doc/tutorial.doxy b/doc/tutorial.doxy
index 8871876..22e8d6e 100644
--- a/doc/tutorial.doxy
+++ b/doc/tutorial.doxy
@@ -134,7 +134,7 @@ your specific field.
 #include <linbox/field/modular.h>
 
 
-typedef Modular<short> Field;
+typedef Givaro::Modular<short> Field;
 Field F(101);
 \endcode
 
@@ -145,7 +145,7 @@ href="http://shoup.net/ntl/" target="_blank">NTL</a>'s \c NTL::ZZ_p class.  The
 LinBox wrapper of that, called \p LinBox::NTL_ZZ_p is found in \c
 field/ntl-ZZ_p.h.  Or use a <a
 href="http://ljk.imag.fr/CASYS/LOGICIELS/givaro/" target="_blank">Givaro</a>
-table based representation, \c LinBox::GivaroGfq in \c field/givaro-gfq.h
+table based representation, \c LinBox::Givaro::GFq in \c field/givaro-gfq.h
 ...and there are many other options.  The program \c tests/test-fields.C will
 provide some timing data on the basic functions of each representation.  In
 %LinBox, a \p Field class and the class representing the field entries are
@@ -173,7 +173,7 @@ good representation choice if a blackbox algorithm is to be used.  For a
 space and time.  On the other hand, if elimination is to be used, those will
 not serve at all, but \c LinBox::SparseMatrix, which allows internal
 modification, will do the trick.  The ordinary matrix representation is
-\c LinBox::DenseMatrix.  If your matrix structure allows you to compute
+\c LinBox::BlasMatrix.  If your matrix structure allows you to compute
 matrix-vector products in a way faster than these classes provide, you can gain
 by defining your own matrix class adhering to the \ref blackbox interface.  The main
 components of the blackbox interface are member functions \c apply() and
@@ -203,21 +203,25 @@ for ( ... )
 Putting it all together, we may have a program looking like this.
 \code
 #include <linbox/field/modular.h>
-#include <linbox/blackbox/dense.h>
+#include <linbox/matrix/blas-matrix.h>
 #include <linbox/solutions/det.h>
+#include <linbox/util/matrix-stream.h>
 
 using namespace LinBox;
 
 main()
 {
-    typedef Modular<double> Field;
-    typedef DenseMatrix<Field> Matrix;
+    typedef Givaro::Modular<double> Field;
+    typedef BlasMatrix<Field> Matrix;
     Field F(65521);
-    Matrix A; A.read("datafile");
+	MatrixStream<Field> ms(F, std::cin);
+    Matrix A(ms); 
     Field::Element d;
-    det(d, A, blasElimination);
-    F.write(cout << "the determinant is ", d) << endl;
+	Method::BlasElimination M;
+    det(d, A, M);
+    F.write(std::cout << "the determinant is ", d) << std::endl;
 }
+
 \endcode
 
 This tutorial should continue with a discussion of compilation issues, but it
diff --git a/doc/tutorial.html b/doc/tutorial.html
deleted file mode 100644
index 054fafd..0000000
--- a/doc/tutorial.html
+++ /dev/null
@@ -1,207 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<!-- Copyright (C) 2005 David Saunders, part of LinBox, GNU LGPL, see COPYING -->
-<!--
-/*
- * Coypright (c) LinBox
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *
- */
- -->
-<title>linbox: LinBox Tutorial</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<h1><a class="el" href="namespace_lin_box.html">LinBox</a> Tutorial</h1>
-
-
-The person requiring some exact linear algebra computation may exploit linbox at
-any of four general levels.
-In order from least involved with the details to most involved, they are:
-
-<ol>
-<li>
-Access using a linbox web server.
-<p>
-The user at this level must attend to preparation of a matrix in
-a suitable file format and invoking the webservice.  The server itself should provide adequate
-documentation for this.
-Servers are generally available at <a href="linalg.org">linalg.org</a>.
-
-<li>
-Access using compiled codes.  Full programs exist in the examples directory and
-can be used through an interface to linbox
-in a general purposes system such as Maple or SAGE.
-<p>
-The user at this level must see to installation, and then attend to preparation of her
-matrix in a suitable file format and to the form of the program or procedure invocation.
-A number of programs are available in the examples directory distributed with LinBox
-providing for rank, determinant, linear system solution, etc.  The documentation of the
-examples module should serve for this level of access.
-<!-- what about interfaces maple and gap - can they be documented now? -->
-
-<li>
-Use of LinBox as a programmers library for exact linear algebra functions.
-<p>
-At this level a user must do at least the following:
-<ol type="a">
-<li>
-Choose a field or ring representation and construct a specific field or ring object R.
-<li>
-Choose a blackbox or matrix representation suitable to your data and construct
-specific matrix A over R.
-<li>
-Call needed algorithm.  The solutions directory is designed to support this by
-providing functions with simple problem oriented interfaces (<tt>rank(), det(), solve()</tt>), yet
-allowing some user control of algorithm details.  The programmer may be providing some of the
-parts such as an application specific blackbox matrix class.
-</ol>
-
-<p>
-<li>
-Power development.
-<p>
-Again, this is use of LinBox as a library, but with hands fully on the details.
-The programmer
-at this level apparently needs the best opportunities for high performance and is
-willing to use the more complicated internal interfaces to get it.  Direct calls to functions
-in the algorithms directory and perhaps to related packages such as
-fflas, ffpac, or other components are being used.
-The programmer working at this level of intimacy with LinBox is likely to develop some
-components that ought to be included in future releases of LinBox.  Such contributions
-are warmly welcomed.
-The online documentation system is intended primarily for the programmer at level 3.
-Thus documentation is not generated to the last internal detail.
-It is supposed that the the level 4 (and 3) programmer, when studying internal details,
-will be best served by reading the code.
-It is possible, if you wish, to set doxygen parameters so as to
-have a documentation listing for every class and function.
-Good luck separating wheat from chaff in that case.
-</ul>
-
-<p>
-In this tutorial we will discuss a simple application at level 3,  the design of a
-program to compute the determinant of a sparse matrix over GF(101).  The programmer
-has 3 major issues: field, matrix, algorithm.
-
-The basic algorithm choice is between blackbox and elimination algorithms.
-If our matrix is A, then the algorithm call may look like
-<pre>
-determinant(det, A, Method::Blackbox());
-//or
-determinant(det, A, Method::Elimination());
-</pre>
-To have access to this determinant function, <tt>#include <linbox/solutions/determinant.h></tt>.
-
-The larger and
-sparser the matrix the more likely that the blackbox algorithm is fastest.  Hybrids are
-under development to help make this choice, and even to make it at run time adaptively.
-The last argument to the solutions functions is a method object which specifies
-the algorithm to be used.  In each case there is a default, so this argument is optional.
-Also, some method objects may be constructed so as to convey more detail about the algorithm to use.
-For example it may help to promise that the matrix is nonsingular or symmetric or to request
-a particular algorithm variant.  The blackbox algorithm based fundamentally on
-Wiedemann's approach is specified by <tt>Method::Wiedemann</tt>, see <tt>linbox/solutions/methods.h</tt> for more details.  Specification
-of a blocked blackbox algorithm may be advantageous (in the future).
-Elimination is likely fastest if the matrix is not extremely sparse or not large or
-not subject to rapid fill-in.
-<p>
-Of course, first we must construct the matrix and field.
-For the field, you must first choose the class (representation type) of field and then
-instantiate your specific field.
-
-<pre>
-#include <linbox/field/modular.h>
-
-typedef Modular<short> Field;
-Field F(101);
-</pre>
-It is a good idea to use a typedef, making it easy to change representations later.
-The <em>Modular</em> field representations are LinBox's own and contain some useful
-optimizations.  Another possibility is use of NTL's zz_p class.  The linbox wrapper of
-that, called NTL_zz_p is found in <tt>linbox/field/NTL-zz_p.h</tt>.  Or use
-a Givaro table based representation, <tt>GivaroGFq</tt> in <tt>linbox/field/givaro-gfq.h</tt>.
-...and there are many other options.  The program <tt>tests/test-fields.C</tt> will provide some
-timing data on the basic functions of each representation.
-In linbox, a Field class and the class representing the field entries are distinct types.  The
-field object owns the arithmetic operations, whereas the entry objects may be of a primitive
-type such as short, int, double.  Each field class Fld has the embedded class Fld::Element for
-it's elements.
-<pre>
-Field::Element a, b, c;
-F.init(a, 2); F.init(b, 3);
-F.mul(c, a, b); // c <- a*b
-F.write(cout, c);
-</pre>
-
-<!-- put here a diatribe on field and element representations -->
-
-You have seen that the field representations are in subdirectory <tt>linbox/field</tt>.  Similarly
-the matrix representations are in <tt>linbox/blackbox</tt>.
-All of these are are suitable for blackbox algorithms.  Only those deriving from
-representations in <tt>linbox/matrix</tt> are suitable for elimination.
-For a sparse matrix, <tt>TriplesBB</tt> is a good representation choice if a blackbox algorithm
-is to be used.  For a {0,1}-incidence matrix, the class <tt>ZeroOne</tt> will be more economical
-of space and time.  On the other hand, if elimination is to be used, those will not serve at
-all,
-but <tt>SparseMatrix</tt>, which allows internal modification, will do the trick.
-The ordinary matrix representation is <tt>DenseMatrix</tt>.
-If your matrix structure allows you to compute matrix-vector products in a way faster than
-these classes provide, you can gain by defining your own matrix class adhering to the
-blackbox interface.  The main components of the blackbox interface are member functions <tt>apply()</tt> and <tt>applyTranspose()</tt>
-functions. <tt>A.apply(y, x)</tt> performs y leftarrow Ax.
-
-Then there is the question of initializing matrix
-entries.  Two basic approaches are illustrated here.
-<pre>
-TriplesBB A;
-A.read("triples-file"); // initialize A from data in file (including shape).
-</pre>
-Or a program can add entries to a sparse or dense matrix one by one using the <tt>setEntry</tt>
-function.
-<pre>
-SparseMatrix B(100, 200); // 100 by 200 zero matrix (so far).
-for ( ... )
-{
-   Field::Element v;
-   F.init(v, ...);
-   B.setEntry(i, j, v);  // put nonzerp v in i,j position.
-}
-</pre>
-
-Putting it all together, we may have a program looking like this.
-<pre>
-#include <linbox/field/modular.h>
-#include <linbox/blackbox/dense.h>
-#include <linbox/solutions/determinant.h>
-using namespace LinBox;
-
-main(){
-typedef Modular<double> Field;
-typedef DenseMatrix<Field> Matrix;
-Field F(65521);
-Matrix A; A.read("datafile");
-Field::Element det;
-determinant(det, A, blasElimination);
-F.write(cout << "the determinant is ", det) << endl;
-}
-</pre>
-
-This tutorial should continue with a discussion of compilation issues, but it
-doesn't.  Something useful may be learned from examining the Makefile.am in the examples directory.
-</body></html>
diff --git a/doc/versionning.doxy b/doc/versionning.doxy
new file mode 100644
index 0000000..f53d4fe
--- /dev/null
+++ b/doc/versionning.doxy
@@ -0,0 +1,141 @@
+// Copyright (C) 2013 the LinBox Group
+// Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+// This file is part of LinBox, see COPYING for licence information.
+/*
+ * Coypright (c) LinBox
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *
+ */
+
+/*!
+* \page upgr Updating/Versionning
+* <h3>Creating a new version number for LinBox/Givaro/fflas-ffpack:</h3>
+*
+* These software are versioned as \c projectname-x.y.z where \c x is a \b major revision
+* number, \c y a \b minor number and \c z a \b revision (or bug) number.
+* The script \c incremente-version — in the root directory of these project
+* sources — takes care of incrementing these numbers (along with the library
+* so-names if necessary).
+*
+*<ul>
+*  <li> \b Revision number. <br/>
+*    Minor changes are changes that do not change any API and do not provoke
+* any miscompilation in LinBox. As a consequence, for instance, any release
+* \c 1.3.z of LinBox should  compile with any givaro \c 3.7.z and any
+* fflas-ffpack \c 1.6.z. <br/>
+* This correspondance should be published on the website. It is however always put in
+* the \c auto-install.sh script.
+*  </li>
+*
+*  <li> \b Minor number. <br/>
+*    Any change in these numbers in givaro or fflas-ffpack produces a minor
+* version change in LinBox. A minor version number changed is required when there
+* is some API change in fflas-ffpack or givaro or linbox or anything leading to
+* a failure to compile properly due to newly added inconsistencies.
+*  </li>
+*
+*  <li> \b Major number. <br/>
+*  These number are incremented when big change happens. Only the minor number
+* of LinBox is needed to change when a major increment happens in
+* givaro/fflas-ffpack.
+*  </li>
+*</ul>
+*
+* <h3> Publishing </h3>
+* Before publishing a new version :
+* <ul>
+* <li> \b Testing
+* - The buildbots should be green and the script \c auto-install.sh should
+* succeed and the tests/example pass/compile. <small>(It would be cool if more
+* compilers were tested, namely clang and ekopath).</small>
+* - The number of warnings when compiled with \c --enable-warnings=full should
+* also be minimised.
+* - The number of warnings when compiling the doc should be minimised (and new
+* functionalities/concepts documented).
+* .
+* </li>
+*
+* <li> \b Incrementing
+*  - on an up-to-date svn source, run the script \c incremente-version, follow
+* its instruction and confirm.
+*  - commit these changes as in: \code svn commit -m "updated to projectname-x.y.z"\endcode
+* so that it is easier to spot the changes in the ChangeLog when publishing it.
+* </li>
+*
+* <li> \b Branching <br/>
+* Once the incrementing has been done, if the minor or major number
+* has been changed, then a new branch should be created in the svn repository
+* using \code svn copy /path/to/trunk /path/to/branch/project-x.y \endcode
+* This is done in order to allow maintainance and support, eg. new patches from
+* distributions and easy support of a \c x.y major.minor version (for sage for
+* instance).
+* </li>
+*
+* <li> \b Publishing <br/>
+* A release comes with a tar ball \c tar.gz, a \c md5sum of it and a summary \c ChangeLog.
+*
+* <ul>
+* <li>   LinBox and fflas-ffpack
+*   - a \c tar.gz and a \c md5sum is created in the \c www directory
+*   - the corresponding web pages are updated
+*   - The changes form the ChangeLog should be
+* put in \c NEWS-a.b.html (even for revision versions) for LinBox and \c fflas-ffpack-Changelog-x.y.z for
+* fflas-ffpack.
+*  </li>
+*
+*  <li> Givaro<br/>
+*    - a \c tar.gz and a \c md5sum is created and uploaded to the
+*   <a href="https://forge.imag.fr/frs/?group_id=187">forge</a> where
+*    one can also put the ChangeLog in a form.
+*  </li>
+*
+*  <li>\c auto-install.sh script<br/>
+*   - the auto-installation script (first 4 lines) should be updated
+* accordingly. They should correspond to the latest stable/desired version number for
+* givaro/fflas-ffpack.
+*  </li>
+* <li> ChangeLogs <br/>
+* It would be nice if the <code>ChangeLog</code>s looked something like (the
+* users cannot/won't view the <code>svn log</code>):
+*
+*  \verbatim
+Date
+- code update :
+        * item
+
+- bugs :
+        * item
+
+- new features :
+        * item
+
+  \endverbatim
+*
+*  </li>
+* </ul>
+*  </li>
+*  <li> \b Documentation <br/>
+* If a minor revision change happens, there should be an automatic way to update the doxygen documentation.
+*  </li>
+* </ul>
+*.
+*
+*/
+
+// vim:syntax=doxygen
diff --git a/examples/Makefile.am b/examples/Makefile.am
index ef35f50..11b459d 100644
--- a/examples/Makefile.am
+++ b/examples/Makefile.am
@@ -19,42 +19,35 @@
 # ========LICENCE========
 #/
 
-#INCLUDES=-I$(top_srcdir)
-AM_CPPFLAGS=-I$(top_srcdir) -I$(top_srcdir)/linbox
-
-#if LinBoxSrcOnly
-#AM_CPPFLAGS=-g -DLinBoxSrcOnly $(GMP_CFLAGS) $(NTL_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS)
-#LINBOX_LIBS=
-#else
-#AM_CPPFLAGS=-g $(GMP_CFLAGS) $(NTL_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS)
-#LINBOX_LIBS= $(top_builddir)/linbox/liblinbox.la
-#endif
-
-# SAFER_FLAGS=--std=c++98 -g -Wall -Wextra -Wno-ignored-qualifiers -Wno-unused-parameter
-#  SAFER_FLAGS=-g -Wall -Wextra -Wno-unused-parameter
-
-# AM_CXXFLAGS = $(SAFER_FLAGS) -DLinBoxSrcOnly -DDEBUG -O0
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DLinBoxSrcOnly -DDISABLE_COMMENTATOR
-AM_CPPFLAGS += $(GMP_CFLAGS) $(NTL_CFLAGS) $(FFLAS_FFPACK_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS) $(IML_CFLAGS)
-#LDADD = $(NTL_LIBS) $(GIVARO_LIBS) $(LIDIA_LIBS) $(BLAS_LIBS) $(GMP_LIBS)  "-Wl,-enable-auto-import"
-LDADD = $(NTL_LIBS) $(GIVARO_LIBS) $(LIDIA_LIBS) $(BLAS_LIBS) $(GMP_LIBS) $(MPFR_LIBS) $(FPLLL_LIBS) $(LDFLAGS) $(IML_LIBS)
+# DEFAULT_INCLUDES=-I at includedir@
+
+#  -DLinBoxSrcOnly
+DEFCPPFLAGS  = @DEFAULT_CFLAGS@   -DDISABLE_COMMENTATOR
+AM_CPPFLAGS = -I$(top_srcdir)/linbox $(DEFCPPFLAGS) $(DEPS_CFLAGS)
+LDADD = $(DEPS_LIBS) $(LDFLAGS)
+LDADD += $(top_builddir)/linbox/liblinbox.la
 #  AM_LDFLAGS=-static
-AM_LDFLAGS = $(top_srcdir)/linbox/.libs/liblinbox.a
+
+#AM_LDFLAGS=-L at libdir@ -llinbox
+
+# if LINBOX_HAVE_OCL
+# AM_CPPFLAGS += $(OCL_CFLAGS)
+# LDADD += $(OCL_LIBS)
+# endif
 
 
-#EX_LDADD = $(NTL_LIBS) $(GMP_LIBS) $(GIVARO_LIBS) $(LIDIA_LIBS) $(BLAS_LIBS)
+
+#EX_LDADD = $(NTL_LIBS)
 #LDADD = $(LINBOX_LIBS) $(EX_LDADD)
 
-SUBDIRS=fields
+#  SUBDIRS=fields solver data blackbox
 
-EXAMPLES=rank det minpoly valence solve dot-product echelon sparseelimdet sparseelimrank checksolve doubledet smithvalence
-# EXAMPLES+=nulp yabla
-GIVARONTL_EXAMPLES=smith charpoly graph-charpoly
+EXAMPLES=rank det minpoly valence solve dot-product echelon sparseelimdet sparseelimrank checksolve doubledet smithvalence charpoly polysmith benchfft benchmatpolymult 
+# EXAMPLES+=nulp yabla 
+GIVARONTL_EXAMPLES=smith graph-charpoly
 if LINBOX_HAVE_NTL
-if LINBOX_HAVE_GIVARO
 USE_GIVARONTL_EXAMPLES = $(GIVARONTL_EXAMPLES)
 endif
-endif
 
 
 EXTRA_PROGRAMS= $(EXAMPLES) $(USE_GIVARONTL_EXAMPLES)
@@ -62,8 +55,9 @@ EXTRA_PROGRAMS= $(EXAMPLES) $(USE_GIVARONTL_EXAMPLES)
 CLEANFILES=$(EXTRA_PROGRAMS)
 
 EXTRA_DIST = examples.doxy smithvalence.h
+#map-sparse.h map-sparse.inl
 
-examples: ${EXTRA_PROGRAMS}
+examples:  ${EXTRA_PROGRAMS}
 
 dot_product_SOURCES    = dot-product.C
 doubledet_SOURCES      = doubledet.C
@@ -82,16 +76,19 @@ echelon_SOURCES        = echelon.C
 smithvalence_SOURCES   = smithvalence.C
 sparseelimdet_SOURCES  = sparseelimdet.C
 sparseelimrank_SOURCES = sparseelimrank.C
+polysmith_SOURCES      = poly-smith.C
+benchfft_SOURCES       = bench-fft.C
+benchmatpolymult_SOURCES = bench-matpoly-mult.C
 LINBOX=@prefix@
 
-# no /bin if LinBox is uncompiled
-#LINBOX_BIN=$(LINBOX)/bin
 LINBOX_BIN=@bindir@
 
 
 # for compilation of new examples
+new_examp_comp = $(CXX) -I at includedir@ $(CXXFLAGS) $(AM_CPPFLAGS) $(OPTFLAGS) ${INCLUDES}  $< -o $@ -L at libdir@ -llinbox $(AM_LDFLAGS) $(LDADD) $(LIBS)
+
 %:%.C
-	$(CXX) $(CXXFLAGS) $(AM_CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.C -o $@ $(AM_LDFLAGS) $(LDADD)
+	$(new_examp_comp)
 
 %:%.cpp
-	$(CXX)  $(CXXFLAGS) $(AM_CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.cpp -o $@ $(AM_LDFLAGS) $(LDADD)
+	$(new_examp_comp)
diff --git a/examples/Makefile.in b/examples/Makefile.in
deleted file mode 100644
index 9ef7fc0..0000000
--- a/examples/Makefile.in
+++ /dev/null
@@ -1,948 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# This file is part of LinBox
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-#/
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-EXTRA_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_3)
-subdir = examples
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-	$(srcdir)/Readme-make.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES = Readme-make
-CONFIG_CLEAN_VPATH_FILES =
-am__EXEEXT_1 = rank$(EXEEXT) det$(EXEEXT) minpoly$(EXEEXT) \
-	valence$(EXEEXT) solve$(EXEEXT) dot-product$(EXEEXT) \
-	echelon$(EXEEXT) sparseelimdet$(EXEEXT) \
-	sparseelimrank$(EXEEXT) checksolve$(EXEEXT) doubledet$(EXEEXT) \
-	smithvalence$(EXEEXT)
-am__EXEEXT_2 = smith$(EXEEXT) charpoly$(EXEEXT) \
-	graph-charpoly$(EXEEXT)
- at LINBOX_HAVE_GIVARO_TRUE@@LINBOX_HAVE_NTL_TRUE at am__EXEEXT_3 = $(am__EXEEXT_2)
-am_charpoly_OBJECTS = charpoly.$(OBJEXT)
-charpoly_OBJECTS = $(am_charpoly_OBJECTS)
-charpoly_LDADD = $(LDADD)
-am__DEPENDENCIES_1 =
-charpoly_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_checksolve_OBJECTS = checksolve.$(OBJEXT)
-checksolve_OBJECTS = $(am_checksolve_OBJECTS)
-checksolve_LDADD = $(LDADD)
-checksolve_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_det_OBJECTS = det.$(OBJEXT)
-det_OBJECTS = $(am_det_OBJECTS)
-det_LDADD = $(LDADD)
-det_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_dot_product_OBJECTS = dot-product.$(OBJEXT)
-dot_product_OBJECTS = $(am_dot_product_OBJECTS)
-dot_product_LDADD = $(LDADD)
-dot_product_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_doubledet_OBJECTS = doubledet.$(OBJEXT)
-doubledet_OBJECTS = $(am_doubledet_OBJECTS)
-doubledet_LDADD = $(LDADD)
-doubledet_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_echelon_OBJECTS = echelon.$(OBJEXT)
-echelon_OBJECTS = $(am_echelon_OBJECTS)
-echelon_LDADD = $(LDADD)
-echelon_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_graph_charpoly_OBJECTS = graph-charpoly.$(OBJEXT)
-graph_charpoly_OBJECTS = $(am_graph_charpoly_OBJECTS)
-graph_charpoly_LDADD = $(LDADD)
-graph_charpoly_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_minpoly_OBJECTS = minpoly.$(OBJEXT)
-minpoly_OBJECTS = $(am_minpoly_OBJECTS)
-minpoly_LDADD = $(LDADD)
-minpoly_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_rank_OBJECTS = rank.$(OBJEXT)
-rank_OBJECTS = $(am_rank_OBJECTS)
-rank_LDADD = $(LDADD)
-rank_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_smith_OBJECTS = smith.$(OBJEXT)
-smith_OBJECTS = $(am_smith_OBJECTS)
-smith_LDADD = $(LDADD)
-smith_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_smithvalence_OBJECTS = smithvalence.$(OBJEXT)
-smithvalence_OBJECTS = $(am_smithvalence_OBJECTS)
-smithvalence_LDADD = $(LDADD)
-smithvalence_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_solve_OBJECTS = solve.$(OBJEXT)
-solve_OBJECTS = $(am_solve_OBJECTS)
-solve_LDADD = $(LDADD)
-solve_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_sparseelimdet_OBJECTS = sparseelimdet.$(OBJEXT)
-sparseelimdet_OBJECTS = $(am_sparseelimdet_OBJECTS)
-sparseelimdet_LDADD = $(LDADD)
-sparseelimdet_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_sparseelimrank_OBJECTS = sparseelimrank.$(OBJEXT)
-sparseelimrank_OBJECTS = $(am_sparseelimrank_OBJECTS)
-sparseelimrank_LDADD = $(LDADD)
-sparseelimrank_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_valence_OBJECTS = valence.$(OBJEXT)
-valence_OBJECTS = $(am_valence_OBJECTS)
-valence_LDADD = $(LDADD)
-valence_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = $(charpoly_SOURCES) $(checksolve_SOURCES) $(det_SOURCES) \
-	$(dot_product_SOURCES) $(doubledet_SOURCES) $(echelon_SOURCES) \
-	$(graph_charpoly_SOURCES) $(minpoly_SOURCES) $(rank_SOURCES) \
-	$(smith_SOURCES) $(smithvalence_SOURCES) $(solve_SOURCES) \
-	$(sparseelimdet_SOURCES) $(sparseelimrank_SOURCES) \
-	$(valence_SOURCES)
-DIST_SOURCES = $(charpoly_SOURCES) $(checksolve_SOURCES) \
-	$(det_SOURCES) $(dot_product_SOURCES) $(doubledet_SOURCES) \
-	$(echelon_SOURCES) $(graph_charpoly_SOURCES) \
-	$(minpoly_SOURCES) $(rank_SOURCES) $(smith_SOURCES) \
-	$(smithvalence_SOURCES) $(solve_SOURCES) \
-	$(sparseelimdet_SOURCES) $(sparseelimrank_SOURCES) \
-	$(valence_SOURCES)
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-dvi-recursive install-exec-recursive \
-	install-html-recursive install-info-recursive \
-	install-pdf-recursive install-ps-recursive install-recursive \
-	installcheck-recursive installdirs-recursive pdf-recursive \
-	ps-recursive uninstall-recursive
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
-  distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
-	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
-	distdir
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-
-#INCLUDES=-I$(top_srcdir)
-AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/linbox $(GMP_CFLAGS) \
-	$(NTL_CFLAGS) $(FFLAS_FFPACK_CFLAGS) $(GIVARO_CFLAGS) \
-	$(LIDIA_CFLAGS) $(IML_CFLAGS)
-
-#if LinBoxSrcOnly
-#AM_CPPFLAGS=-g -DLinBoxSrcOnly $(GMP_CFLAGS) $(NTL_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS)
-#LINBOX_LIBS=
-#else
-#AM_CPPFLAGS=-g $(GMP_CFLAGS) $(NTL_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS)
-#LINBOX_LIBS= $(top_builddir)/linbox/liblinbox.la
-#endif
-
-# SAFER_FLAGS=--std=c++98 -g -Wall -Wextra -Wno-ignored-qualifiers -Wno-unused-parameter
-#  SAFER_FLAGS=-g -Wall -Wextra -Wno-unused-parameter
-
-# AM_CXXFLAGS = $(SAFER_FLAGS) -DLinBoxSrcOnly -DDEBUG -O0
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DLinBoxSrcOnly -DDISABLE_COMMENTATOR
-#LDADD = $(NTL_LIBS) $(GIVARO_LIBS) $(LIDIA_LIBS) $(BLAS_LIBS) $(GMP_LIBS)  "-Wl,-enable-auto-import"
-LDADD = $(NTL_LIBS) $(GIVARO_LIBS) $(LIDIA_LIBS) $(BLAS_LIBS) $(GMP_LIBS) $(MPFR_LIBS) $(FPLLL_LIBS) $(LDFLAGS) $(IML_LIBS)
-#  AM_LDFLAGS=-static
-AM_LDFLAGS = $(top_srcdir)/linbox/.libs/liblinbox.a
-
-#EX_LDADD = $(NTL_LIBS) $(GMP_LIBS) $(GIVARO_LIBS) $(LIDIA_LIBS) $(BLAS_LIBS)
-#LDADD = $(LINBOX_LIBS) $(EX_LDADD)
-SUBDIRS = fields
-EXAMPLES = rank det minpoly valence solve dot-product echelon sparseelimdet sparseelimrank checksolve doubledet smithvalence
-# EXAMPLES+=nulp yabla
-GIVARONTL_EXAMPLES = smith charpoly graph-charpoly
- at LINBOX_HAVE_GIVARO_TRUE@@LINBOX_HAVE_NTL_TRUE at USE_GIVARONTL_EXAMPLES = $(GIVARONTL_EXAMPLES)
-CLEANFILES = $(EXTRA_PROGRAMS)
-EXTRA_DIST = examples.doxy smithvalence.h
-dot_product_SOURCES = dot-product.C
-doubledet_SOURCES = doubledet.C
-#linbox_program_SOURCES = \
-#	linbox-program.C
-checksolve_SOURCES = checksolve.C
-charpoly_SOURCES = charpoly.C
-graph_charpoly_SOURCES = graph-charpoly.C
-det_SOURCES = det.C
-rank_SOURCES = rank.C
-smith_SOURCES = smith.C
-minpoly_SOURCES = minpoly.C
-valence_SOURCES = valence.C
-solve_SOURCES = solve.C
-echelon_SOURCES = echelon.C
-smithvalence_SOURCES = smithvalence.C
-sparseelimdet_SOURCES = sparseelimdet.C
-sparseelimrank_SOURCES = sparseelimrank.C
-LINBOX = @prefix@
-
-# no /bin if LinBox is uncompiled
-#LINBOX_BIN=$(LINBOX)/bin
-LINBOX_BIN = @bindir@
-all: all-recursive
-
-.SUFFIXES:
-.SUFFIXES: .C .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps examples/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps examples/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-Readme-make: $(top_builddir)/config.status $(srcdir)/Readme-make.in
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-charpoly$(EXEEXT): $(charpoly_OBJECTS) $(charpoly_DEPENDENCIES) $(EXTRA_charpoly_DEPENDENCIES) 
-	@rm -f charpoly$(EXEEXT)
-	$(CXXLINK) $(charpoly_OBJECTS) $(charpoly_LDADD) $(LIBS)
-checksolve$(EXEEXT): $(checksolve_OBJECTS) $(checksolve_DEPENDENCIES) $(EXTRA_checksolve_DEPENDENCIES) 
-	@rm -f checksolve$(EXEEXT)
-	$(CXXLINK) $(checksolve_OBJECTS) $(checksolve_LDADD) $(LIBS)
-det$(EXEEXT): $(det_OBJECTS) $(det_DEPENDENCIES) $(EXTRA_det_DEPENDENCIES) 
-	@rm -f det$(EXEEXT)
-	$(CXXLINK) $(det_OBJECTS) $(det_LDADD) $(LIBS)
-dot-product$(EXEEXT): $(dot_product_OBJECTS) $(dot_product_DEPENDENCIES) $(EXTRA_dot_product_DEPENDENCIES) 
-	@rm -f dot-product$(EXEEXT)
-	$(CXXLINK) $(dot_product_OBJECTS) $(dot_product_LDADD) $(LIBS)
-doubledet$(EXEEXT): $(doubledet_OBJECTS) $(doubledet_DEPENDENCIES) $(EXTRA_doubledet_DEPENDENCIES) 
-	@rm -f doubledet$(EXEEXT)
-	$(CXXLINK) $(doubledet_OBJECTS) $(doubledet_LDADD) $(LIBS)
-echelon$(EXEEXT): $(echelon_OBJECTS) $(echelon_DEPENDENCIES) $(EXTRA_echelon_DEPENDENCIES) 
-	@rm -f echelon$(EXEEXT)
-	$(CXXLINK) $(echelon_OBJECTS) $(echelon_LDADD) $(LIBS)
-graph-charpoly$(EXEEXT): $(graph_charpoly_OBJECTS) $(graph_charpoly_DEPENDENCIES) $(EXTRA_graph_charpoly_DEPENDENCIES) 
-	@rm -f graph-charpoly$(EXEEXT)
-	$(CXXLINK) $(graph_charpoly_OBJECTS) $(graph_charpoly_LDADD) $(LIBS)
-minpoly$(EXEEXT): $(minpoly_OBJECTS) $(minpoly_DEPENDENCIES) $(EXTRA_minpoly_DEPENDENCIES) 
-	@rm -f minpoly$(EXEEXT)
-	$(CXXLINK) $(minpoly_OBJECTS) $(minpoly_LDADD) $(LIBS)
-rank$(EXEEXT): $(rank_OBJECTS) $(rank_DEPENDENCIES) $(EXTRA_rank_DEPENDENCIES) 
-	@rm -f rank$(EXEEXT)
-	$(CXXLINK) $(rank_OBJECTS) $(rank_LDADD) $(LIBS)
-smith$(EXEEXT): $(smith_OBJECTS) $(smith_DEPENDENCIES) $(EXTRA_smith_DEPENDENCIES) 
-	@rm -f smith$(EXEEXT)
-	$(CXXLINK) $(smith_OBJECTS) $(smith_LDADD) $(LIBS)
-smithvalence$(EXEEXT): $(smithvalence_OBJECTS) $(smithvalence_DEPENDENCIES) $(EXTRA_smithvalence_DEPENDENCIES) 
-	@rm -f smithvalence$(EXEEXT)
-	$(CXXLINK) $(smithvalence_OBJECTS) $(smithvalence_LDADD) $(LIBS)
-solve$(EXEEXT): $(solve_OBJECTS) $(solve_DEPENDENCIES) $(EXTRA_solve_DEPENDENCIES) 
-	@rm -f solve$(EXEEXT)
-	$(CXXLINK) $(solve_OBJECTS) $(solve_LDADD) $(LIBS)
-sparseelimdet$(EXEEXT): $(sparseelimdet_OBJECTS) $(sparseelimdet_DEPENDENCIES) $(EXTRA_sparseelimdet_DEPENDENCIES) 
-	@rm -f sparseelimdet$(EXEEXT)
-	$(CXXLINK) $(sparseelimdet_OBJECTS) $(sparseelimdet_LDADD) $(LIBS)
-sparseelimrank$(EXEEXT): $(sparseelimrank_OBJECTS) $(sparseelimrank_DEPENDENCIES) $(EXTRA_sparseelimrank_DEPENDENCIES) 
-	@rm -f sparseelimrank$(EXEEXT)
-	$(CXXLINK) $(sparseelimrank_OBJECTS) $(sparseelimrank_LDADD) $(LIBS)
-valence$(EXEEXT): $(valence_OBJECTS) $(valence_DEPENDENCIES) $(EXTRA_valence_DEPENDENCIES) 
-	@rm -f valence$(EXEEXT)
-	$(CXXLINK) $(valence_OBJECTS) $(valence_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-.C.o:
-	$(CXXCOMPILE) -c -o $@ $<
-
-.C.obj:
-	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.C.lo:
-	$(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    $(am__make_dryrun) \
-	      || test -d "$(distdir)/$$subdir" \
-	      || $(MKDIR_P) "$(distdir)/$$subdir" \
-	      || exit 1; \
-	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-	    $(am__relativize); \
-	    new_distdir=$$reldir; \
-	    dir1=$$subdir; dir2="$(top_distdir)"; \
-	    $(am__relativize); \
-	    new_top_distdir=$$reldir; \
-	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-	    ($(am__cd) $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$new_top_distdir" \
-	        distdir="$$new_distdir" \
-		am__remove_distdir=: \
-		am__skip_length_check=: \
-		am__skip_mode_fix=: \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-recursive
-all-am: Makefile
-installdirs: installdirs-recursive
-installdirs-am:
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
-	install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-	all all-am check check-am clean clean-generic clean-libtool \
-	ctags ctags-recursive distclean distclean-compile \
-	distclean-generic distclean-libtool distclean-tags distdir dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-man install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs installdirs-am \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-	pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am
-
-
-examples: ${EXTRA_PROGRAMS}
-
-# for compilation of new examples
-%:%.C
-	$(CXX) $(CXXFLAGS) $(AM_CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.C -o $@ $(AM_LDFLAGS) $(LDADD)
-
-%:%.cpp
-	$(CXX)  $(CXXFLAGS) $(AM_CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.cpp -o $@ $(AM_LDFLAGS) $(LDADD)
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/examples/Readme b/examples/Readme
new file mode 100644
index 0000000..ac7e230
--- /dev/null
+++ b/examples/Readme
@@ -0,0 +1 @@
+See also matrix examples in ../../tests/data/
diff --git a/examples/athadet.C b/examples/athadet.C
new file mode 100644
index 0000000..b4d397b
--- /dev/null
+++ b/examples/athadet.C
@@ -0,0 +1,107 @@
+/*
+ * examples/athadet.C
+ *
+ * Copyright (C) 2007, 2010 S. Guelton
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/**\file examples/athadet.C
+ * @example  examples/athadet.C
+  \brief Determinant of sparse matrix over Z or Zp.
+  \ingroup examples
+  @author serge.guelton at imag.fr
+  */
+
+
+/*
+ * to be  compiled with kaapi library **svn sources**, available at http://gforge.inria.fr
+ * g++ -o atahdet athadet.C  $(pkg-config --cflags --libs kaapi) -g3 $( linbox-config --cflags --libs)
+ * or
+ * g++ -o atahdet athadet.C  $KAAPI_CPPFLAGS $KAAPI_LDFLAGS -g3 $( linbox-config --cflags --libs)
+ */
+#define __LINBOX_HAVE_KAAPI
+
+#include <iostream>
+#include <string>
+
+#include <linbox/ring/modular.h>
+#include <linbox/ring/gmp-integers.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/solutions/det.h>
+#include <linbox/util/matrix-stream.h>
+
+
+using namespace LinBox;
+using namespace std;
+
+typedef Givaro::ZRing<Integer> Integers;
+
+struct  cra_det_task {
+
+
+	void operator()(int argc, char **argv) {
+		ifstream input (argv[1]);
+		if (!input) {
+			cerr << "Error opening matrix file '" << argv[1] << "'" << endl;
+			return ;
+		}
+
+
+		Util::logfile() << "creating matrix" << std::endl;
+		Integers ZZ;
+		SparseMatrix<Integers> sparseMatrix (ZZ);
+		sparseMatrix.read(input);
+		Util::logfile() << "matrix created" << std::endl;
+		Givaro::ZRing<Integer>::Element det_A;
+		try {
+			cra_det(det_A, sparseMatrix, RingCategories::IntegerTag(), Method::Hybrid() );
+		}
+		catch ( LinBox::LinboxError & err ) {
+			std::cerr << err << std::endl;
+		}
+		cout << "Determinant is ";
+		ZZ.write(cout, det_A) << endl;
+	}
+};
+
+int main (int argc, char **argv)
+{
+	if(argc<2) {
+		cerr << "not enough args : usage = athadet file" << endl;
+		return 1;
+	}
+
+	a1::Community com = a1::System::join_community(argc,argv);
+
+	Util::logfile() << "starting job" << std::endl;
+	a1::ForkMain<cra_det_task>()(argc,argv);
+	com.leave();
+	a1::System::terminate();
+	return 0;
+}
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/bench-fft.C b/examples/bench-fft.C
new file mode 100755
index 0000000..9c8583f
--- /dev/null
+++ b/examples/bench-fft.C
@@ -0,0 +1,249 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013  Pascal Giorgi
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+#include <linbox/linbox-config.h>
+
+#include <functional>
+#include <iostream>
+#include <vector>
+
+#include <givaro/modular.h>
+#include <givaro/givranditer.h>
+
+using namespace std; 
+
+
+#include "linbox/algorithms/polynomial-matrix/polynomial-fft-transform.h"
+#include "linbox/randiter/random-fftprime.h"
+#include "linbox/ring/modular.h"
+#include "fflas-ffpack/utils/align-allocator.h"
+
+using namespace LinBox;
+
+
+
+template <typename Rand, typename Vect>
+void randomVect (Rand& r, Vect& v) {
+	size_t s = v.size();
+	for (size_t i = 0; i < s; ++i)
+		r.random(v[i]);
+}
+
+
+/**********************************
+ ****** DFT CHECKING FUNCTION *****
+ *********************************/
+template<typename T>
+struct congruent{
+	T p;
+	congruent(T _p): p(_p){}
+	bool operator()(T a, T b) const { return ((uint64_t)a%(uint64_t)p) == ((uint64_t)b%(uint64_t)p);}
+};
+template<typename Funct, typename FFT, typename Vect>
+void DFT_sanity_check(FFT& FFTDom, Funct f, const Vect& x, const Vect& y, string msg){
+	typedef typename FFT::Element Element ;
+	Vect z(x);
+	auto Functor = bind(f, &FFTDom, &z[0]);
+	Functor();
+	msg+="  ";
+	msg.resize(45,'.');
+	cout<<"  Checking ... "<<msg
+	    << (equal(y.begin(),y.end(),z.begin(),congruent<Element>(FFTDom._p))?" done":" error")<<endl;
+
+	// if (!(equal(y.begin(),y.end(),z.begin(),congruent<Element>(FFTDom._p)))){
+	// 	std::ostream_iterator<Element> out_it (std::cout,", ");
+	// 	std::copy ( z.begin(), z.end(), out_it );
+	// 	std::cout<<std::endl;
+	// 	std::copy ( y.begin(), y.end(), out_it );
+	// 	std::cout<<std::endl; 
+	// }
+
+}
+
+template<typename Field>
+void check_DIF(const Field& fld, size_t kmax, long seed) {  
+	typedef typename Field::Element Element;
+	for (size_t lpts = 1; lpts < kmax ; lpts++){
+		size_t pts = 1 << lpts;
+		cout<<"********************************************************"<<endl;
+		cout<<"*** Testing polynomials of size 2^" << lpts <<endl;
+		cout<<"********************************************************"<<endl;
+		//vector<Element> x(pts),y(pts);
+		std::vector<Element,AlignedAllocator<Element, Alignment::DEFAULT>> x(pts),y(pts);
+
+		// Generate random inputs
+		typename Field::RandIter Gen(fld);//,fld.characteristic(),seed);
+		randomVect(Gen,y);
+		x=y;
+		
+		FFT_transform<Field> MulDom(fld,lpts);
+		typedef FFT_transform<Field> FFT_t;
+
+
+		/* CHECK DIF */
+		// compute the correct result
+		MulDom.FFT_DIF_Harvey_mod2p_iterative(y.data()); 
+		// check 2x2 		
+		DFT_sanity_check(MulDom,&FFT_t::FFT_DIF_Harvey_mod2p_iterative2x2,x,y, "DIF_Harvey_mod2p_iterative2x2");
+		// check 3x3 		
+		DFT_sanity_check(MulDom,&FFT_t::FFT_DIF_Harvey_mod2p_iterative3x3,x,y, "DIF_Harvey_mod2p_iterative3x3");
+		// check 4x1 SSE		
+		//DFT_sanity_check(MulDom,&FFT_t::FFT_DIF_Harvey_mod2p_iterative4x1_SSE,x,y, "DIF_Harvey_mod2p_iterative4x1_SSE");
+		// check 4x2 SSE		
+		//DFT_sanity_check(MulDom,&FFT_t::FFT_DIF_Harvey_mod2p_iterative4x2_SSE,x,y, "DIF_Harvey_mod2p_iterative4x2_SSE");
+#ifdef __AVX2__
+		// check 8x1 AVX		
+		//DFT_sanity_check(MulDom,&FFT_t::FFT_DIF_Harvey_mod2p_iterative8x1_AVX,x,y, "DIF_Harvey_mod2p_iterative8x1_AVX");
+#endif
+		// check Harvey SSE		
+		DFT_sanity_check(MulDom,&FFT_t::template FFT_DIF<Element>,x,y, "DIF_Harvey_SSE");
+		cout<<"---------------------------------------------------------------"<<endl;
+		/* CHECK DIT */
+		// compute the correct result
+		y=x;
+		MulDom.FFT_DIT_Harvey_mod4p_iterative2x2(y.data());
+		// check 2x2 		
+		DFT_sanity_check(MulDom,&FFT_t::FFT_DIT_Harvey_mod4p_iterative2x2,x,y, "DIT_Harvey_mod4p_iterative2x2");
+		// check 3x3 		
+		DFT_sanity_check(MulDom,&FFT_t::FFT_DIT_Harvey_mod4p_iterative3x3,x,y, "DIT_Harvey_mod4p_iterative3x3");
+		// check 4x1 SSE		
+		//DFT_sanity_check(MulDom,&FFT_t::FFT_DIT_Harvey_mod4p_iterative4x1_SSE,x,y, "DIT_Harvey_mod4p_iterative4x1_SSE");
+#ifdef __AVX2__
+		// check 8x1 AVX		
+		//DFT_sanity_check(MulDom,&FFT_t::FFT_DIT_Harvey_mod4p_iterative8x1_AVX,x,y, "DIT_Harvey_mod4p_iterative8x1_AVX");
+#endif
+		// check Harvey SSE		
+		DFT_sanity_check(MulDom,&FFT_t::template FFT_DIT<Element>,x,y, "DIT_Harvey_SSE");
+		
+		cout<<endl;
+	}
+}
+
+/**************************************
+ ****** DFT PERFORMANCE FUNCTION ******
+ **************************************/
+template<typename Funct, typename FFT, typename Vect>
+void DFT_performance(FFT& FFTDom, Funct f, size_t lpts, const Vect& x, string msg){
+	Vect z(x);
+	auto Functor = bind(f, &FFTDom, &z[0]);
+	Timer chrono;
+        double time;
+        double Miops;
+        size_t ct,minct=4;
+	ct = 0;
+	chrono.start();
+	while (chrono.realElapsedTime() < 1){
+		for (size_t k=0;k<minct;k++)
+			Functor();
+		ct+=minct;
+	}
+	time = chrono.userElapsedTime()/ct;
+	Miops = 17 * (lpts<<(lpts-1)) /(1e6 * time); // 3/2 n log n
+	msg+="  ";
+	msg.resize(45,'.');
+	cout << "Timings ... " << msg <<" : ";
+	cout.precision(2);
+	cout.width(10);
+	cout<<scientific<<time << " s, ";
+	cout.precision(2);
+	cout.width(10);
+	cout<<fixed<<Miops << " Miops\n";
+}
+
+
+
+template<typename Field>
+void bench_DIF(const Field& fld, size_t kmax, long seed) { 
+	typedef typename Field::Element Element;
+	for (size_t lpts = 5; lpts < kmax ; lpts++){
+		size_t pts = 1 << lpts;
+		cout<<"********************************************************"<<endl;
+		cout<<"*** Testing polynomials of size 2^" << lpts <<endl;
+		cout<<"********************************************************"<<endl;
+		vector<Element> x(pts);
+
+		// Generate random inputs
+		typename Field::RandIter Gen(fld,seed);
+		randomVect(Gen,x);
+		FFT_transform<Field> MulDom(fld,lpts);
+		typedef FFT_transform<Field> FFT_t; 
+
+		// check 2x2 		
+		DFT_performance(MulDom,&FFT_t::FFT_DIF_Harvey_mod2p_iterative2x2,lpts, x,     "DIF_Harvey_mod2p_iterative2x2");
+		// check 3x3 		
+		DFT_performance(MulDom,&FFT_t::FFT_DIF_Harvey_mod2p_iterative3x3,lpts, x,     "DIF_Harvey_mod2p_iterative3x3");
+		// check 4x1 SSE		
+		//DFT_performance(MulDom,&FFT_t::FFT_DIF_Harvey_mod2p_iterative4x1_SSE,lpts, x, "DIF_Harvey_mod2p_iterative4x1_SSE");
+		// check 4x2 SSE		
+		//DFT_performance(MulDom,&FFT_t::FFT_DIF_Harvey_mod2p_iterative4x2_SSE,lpts, x, "DIF_Harvey_mod2p_iterative4x2_SSE");
+#ifdef __AVX2__
+		// check 8x1 AVX		
+		//DFT_performance(MulDom,&FFT_t::FFT_DIF_Harvey_mod2p_iterative8x1_AVX,lpts, x, "DIF_Harvey_mod2p_iterative8x1_AVX");
+#endif
+		// check Harvey SSE		
+		DFT_performance(MulDom,&FFT_t::template FFT_DIF<Element>,lpts, x, "DIF_Harvey_SSE");
+		cout<<"---------------------------------------------------------------"<<endl;
+		// check 2x2 		
+		DFT_performance(MulDom,&FFT_t::FFT_DIT_Harvey_mod4p_iterative2x2,lpts, x,     "DIT_Harvey_mod4p_iterative2x2");
+		// check 3x3 		
+		DFT_performance(MulDom,&FFT_t::FFT_DIT_Harvey_mod4p_iterative3x3,lpts, x,     "DIT_Harvey_mod4p_iterative3x3");
+		// check 4x1 SSE		
+		//DFT_performance(MulDom,&FFT_t::FFT_DIT_Harvey_mod4p_iterative4x1_SSE,lpts, x, "DIT_Harvey_mod4p_iterative4x1_SSE");
+#ifdef __AVX2__
+		// check 8x1 AVX		
+		//DFT_performance(MulDom,&FFT_t::FFT_DIT_Harvey_mod4p_iterative8x1_AVX,lpts, x, "DIT_Harvey_mod4p_iterative8x1_AVX");
+#endif
+		// check Harvey SSE		
+		DFT_performance(MulDom,&FFT_t::template FFT_DIT<Element>,lpts, x, "DIT_Harvey_SSE");
+
+
+		cout<<endl;
+	}
+}
+
+
+int main(int argc, char** argv){
+	if (argc < 2 || argc >3){
+		cerr<<"usage : prime_bitsize , (seed)"<<endl;
+		exit(0);
+	}
+	uint64_t bits =atoi(argv[1]);
+	long seed=((argc>2)?atoi(argv[2]):time(NULL));	
+	RandomFFTPrime Rd(1<<bits,seed);
+	uint32_t p = (uint32_t)Rd.randomPrime(5);
+	size_t k = bits-4;
+	cout<<"prime : "<<p<<endl;
+	cout<<endl;
+	
+	//Givaro::Modular<uint32_t> F(p);
+	Givaro::Modular<double> F(p);
+	check_DIF(F,k,seed);
+	bench_DIF(F,k,seed);
+
+
+	return 0;
+}
+ 
+ 
diff --git a/examples/bench-matpoly-mult.C b/examples/bench-matpoly-mult.C
new file mode 100755
index 0000000..6779c8d
--- /dev/null
+++ b/examples/bench-matpoly-mult.C
@@ -0,0 +1,495 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013  Pascal Giorgi
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+#include <linbox/linbox-config.h>
+#ifdef VERB
+#define KARA_TIMING
+#define FFT_PROFILE
+#endif
+#ifdef VERBINT
+#define INTFFT_TIMING
+#endif
+
+
+#ifdef HAVE_OPENMP
+#include <omp.h>
+#define GIVARO_USES_OMP
+#include <givaro/givtimer.h>
+#define gettime realtime
+typedef Givaro::OMPTimer myTimer;
+#else
+#include <givaro/givtimer.h>
+#define gettime usertime
+typedef Givaro::Timer myTimer;
+#endif
+
+
+#include <functional>
+#include <iostream>
+#include <vector>
+using namespace std;
+#include <linbox/ring/modular.h>
+#include <linbox/randiter/random-prime.h>
+#include <linbox/randiter/random-fftprime.h>
+//#include <linbox/field/unparametric.h>
+#include <givaro/zring.h>
+#include <recint/rint.h>
+#include <linbox/matrix/matrix-domain.h>
+#include <linbox/util/commentator.h>
+#include <linbox/util/timer.h>
+#include <linbox/matrix/polynomial-matrix.h>
+#include <linbox/algorithms/polynomial-matrix/polynomial-matrix-domain.h>
+
+
+#ifdef BENCH_FLINT
+#define __GMP_BITS_PER_MP_LIMB 64
+extern "C" {
+#include "flint/longlong.h"
+#include "flint/ulong_extras.h"
+#include "flint/nmod_poly_mat.h"
+#include "flint/flint.h"
+}
+#endif
+#ifdef BENCH_MMX
+#include <numerix/modular_int.hpp>
+#include <algebramix/polynomial.hpp>
+#include <algebramix/polynomial_modular_int.hpp>
+#include <algebramix/polynomial_tft.hpp>
+#include <algebramix/matrix.hpp>
+#include <algebramix/matrix_modular_int.hpp>
+#include <algebramix/matrix_tft.hpp>
+#define Prime_field(C, n, p)						\
+	modular<modulus<C, modulus_int_preinverse<n> >, modular_fixed<int,p> >
+
+#endif
+
+using namespace LinBox;
+
+
+
+
+template <typename Rand, typename Vect>
+void randomVect (Rand& r, Vect& v) {
+	size_t s = v.size();
+	for (size_t i = 0; i < s; ++i)
+		r.random(v[i]);
+}
+
+template <typename Rand, typename Mat>
+void randomMat (Rand& r, Mat& m) {
+	for (size_t i = 0; i < m.rowdim(); ++i)
+		for (size_t j = 0; j < m.coldim(); ++j)
+			r.random(m.refEntry(i,j));
+}
+
+template<typename MatPol>
+bool operator==(const MatPol& A, const MatPol& B){
+	MatrixDomain<typename MatPol::Field> MD(A.field());
+	if (A.size()!=B.size()|| A.rowdim()!= B.rowdim() || A.coldim()!=B.coldim())
+		return false;
+	size_t i=0;
+	while (i<A.size() && MD.areEqual(A[i],B[i]))
+		i++;
+
+	if (i<A.size() && A.rowdim()<10 && A.coldim()<10){
+		cout<<"first:"<<endl<<A<<endl;
+		cout<<"second:"<<endl<<B<<endl;
+	}
+
+	return i==A.size();
+}
+
+/******************************************
+ ****** MATPOLY MUL CHECKING FUNCTION *****
+ ******************************************/
+template<typename T>
+struct congruent{
+	T p;
+	congruent(T _p): p(_p){}
+	bool operator()(T a, T b) const { return (a%p) == (b%p);}
+};
+
+template<typename MULDOM, typename MatPol>
+void MATPOLMUL_sanity_check(MULDOM& MulDom, const MatPol& C, const MatPol& A, const MatPol& B, std::string msg){
+	MatPol CC(C.field(),C.rowdim(),C.coldim(),C.size());
+	//auto Functor = bind(f, &MulDom, ref(CC),A,B);
+	//Functor();
+#ifdef FFT_PROFILER
+	FFT_PROF_LEVEL=3;
+#endif
+	MulDom.mul(CC,A,B);
+	msg+="  ";
+	msg.resize(45,'.');
+	cout<<"  Checking ... "<<msg
+	    << ((C==CC)?" done":" error")<<endl;
+}
+
+template<typename Field, typename RandIter>
+void check_matpol_mul(const Field& fld,  RandIter& Gen, size_t n, size_t d) {
+	typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,Field> MatrixP;
+	typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> PMatrix;
+	PMatrix A(fld,n,n,d),B(fld,n,n,d),C(fld,n,n,2*d-1);
+	MatrixP AA(fld,n,n,d),BB(fld,n,n,d),CC(fld,n,n,2*d-1);
+	// Generate random matrix of polynomial
+	for (size_t i=0;i<d;i++){
+		randomMat(Gen,A[i]);
+		randomMat(Gen,B[i]);
+	}
+
+	typedef PolynomialMatrixNaiveMulDomain<Field>       Naive;
+	typedef PolynomialMatrixKaraDomain<Field>            Kara;
+	typedef PolynomialMatrixFFTMulDomain<Field>           FFT;
+
+	Naive NMD(fld);
+	Kara PMKD(fld);
+	FFT  PMFFT(fld);
+
+	// compute the correct result
+	for (size_t r=0;r<n;r++)
+		for (size_t c=0;c<n;c++)
+			for (size_t k=0;k<n;k++)
+				for (size_t i=0;i<A.size();i++)
+					for (size_t j=0;j<B.size();j++)
+						fld.axpyin(C.ref(r,c,i+j),A.get(r,k,i),B.get(k,c,j));
+
+
+	// check naive
+	MATPOLMUL_sanity_check(NMD,C,A,B, "Naive Multiplication");
+	// check karatsuba
+	MATPOLMUL_sanity_check(PMKD,C,A,B, "Karatsuba Multiplication");
+
+	AA.copy(A);
+	BB.copy(B);
+	CC.copy(C);
+	// check fft
+	MATPOLMUL_sanity_check(PMFFT,CC,AA,BB, "FFT Multiplication");
+
+	cout<<endl;
+}
+
+
+/***********************************************
+ ****** MATPOLY MUL  PERFORMANCE FUNCTION ******
+ ***********************************************/
+template<typename MULDOM, typename MatPol>
+void MATPOLMUL_performance(MULDOM& MulDom,  const MatPol& A, const MatPol& B, double Miops, std::string msg){
+	MatPol C(A.field(),A.rowdim(),A.coldim(),A.size()+B.size()-1);
+	//auto Functor = bind(f, &MulDom, ref(C),A,B);
+	Timer chrono;
+	double time;
+	size_t ct,minct=4;
+	size_t prec=6;
+	ct = 0;
+	chrono.start();
+	while (chrono.realElapsedTime() < 1){
+		for (size_t k=0;k<minct;k++)
+			//Functor();
+			MulDom.mul(C,A,B);
+		ct+=minct;
+	}
+
+	time = chrono.userElapsedTime()/ct;
+	Miops/=(1e6*time);
+	msg+="  ";
+	msg.resize(45,'.');
+	cout << "Timings ... " << msg <<" : ";
+	cout.precision(prec);
+	cout.width(10);
+	cout<<fixed<<time << " s, ";
+	cout.precision(2);
+	cout.width(10);
+	cout<<fixed<<Miops << " Miops\n";
+}
+
+
+template<typename Field, typename RandIter>
+void bench_matpol_mul(const Field& fld,  RandIter& Gen, size_t n, size_t d) {
+	typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> MatrixP;
+	MatrixP A(fld,n,n,d),B(fld,n,n,d),C(fld,n,n,2*d-1);
+
+	// Generate random matrix of polynomial
+	for (size_t i=0;i<d;i++){
+		randomMat(Gen,A[i]);
+		randomMat(Gen,B[i]);
+	}
+
+	typedef PolynomialMatrixNaiveMulDomain<Field>       Naive;
+	typedef PolynomialMatrixKaraDomain<Field>            Kara;
+	typedef PolynomialMatrixFFTMulDomain<Field>           FFT;
+
+	Naive NMD(fld);
+	Kara PMKD(fld);
+	FFT  PMFFT(fld);
+	size_t mmul=2*n*n*n;
+	size_t madd=n*n;
+	size_t kara=pow((double)d, log(3.)/log(2.));
+	//size_t fft= 17 *d *log(2.*d)/log(2.);
+	size_t costNaive= mmul*d*d + madd*(d-1)*(d-1);
+	size_t costKara = mmul*kara+ 6*madd*kara;
+	//size_t costFFT  = mmul*2*d + 3*madd*fft;
+
+#ifdef FFT_PROFILER
+	FFT_PROF_LEVEL=3;
+#endif
+	// bench naive
+	MATPOLMUL_performance(NMD,A,B,costNaive, "Naive Multiplication");
+	// bench karatsuba
+	MATPOLMUL_performance(PMKD,A,B,costKara, "Karatsuba Multiplication");
+	// bench fft
+	//MATPOLMUL_performance(PMFFT,A,B,costFFT, "FFT Multiplication");
+
+
+	Timer chrono;
+#ifdef BENCH_FLINT
+	nmod_poly_mat_t AA,BB,CC;
+	nmod_poly_mat_init(AA,n,n,(uint64_t)fld.cardinality());
+	nmod_poly_mat_init(BB,n,n,(uint64_t)fld.cardinality());
+	nmod_poly_mat_init(CC,n,n,(uint64_t)fld.cardinality());
+	flint_rand_t state;
+	flint_randinit(state);
+	nmod_poly_mat_randtest(AA,state,d);
+	nmod_poly_mat_randtest(BB,state,d);
+	cout<<"-----------------------"<<endl;
+	chrono.start();
+ 	nmod_poly_mat_mul(CC,AA,BB);
+	cout.precision(6);
+	chrono.stop();
+	cout<<"FLINT Multiplication    : "<<chrono.usertime()<<" s"<<endl;
+	chrono.start();
+	nmod_poly_mat_mul_KS(CC,AA,BB);
+	cout.precision(6);
+	chrono.stop();
+	cout<<"FLINT Multiplication KS : "<<chrono.usertime()<<" s"<<endl;
+	chrono.start();
+	nmod_poly_mat_mul_interpolate(CC,AA,BB);
+	cout.precision(6);
+	chrono.stop();
+	cout<<"FLINT Multiplication E/I: "<<chrono.usertime()<<" s"<<endl;
+#endif
+	
+	
+	cout<<endl;
+}
+
+
+
+template<typename Field, typename RandIter>
+void profile_matpol_mulfft(const Field& fld,  RandIter& Gen, size_t n, size_t d) {
+	typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,Field> MatrixP;
+	MatrixP A(fld,n,n,d),B(fld,n,n,d),C(fld,n,n,2*d-1);
+
+	// Generate random matrix of polynomial
+	for (size_t i=0;i<n*n;i++){
+		randomVect(Gen,A(i));
+		randomVect(Gen,B(i));
+	}
+	std::cout<<n<<" "<<d<<" "<<std::endl;
+	typedef PolynomialMatrixFFTMulDomain<Field>    FFT;
+	FFT  PMFFT(fld);
+	myTimer chrono;
+	//size_t mmul=2*n*n*n;
+	//size_t madd=n*n;
+	//size_t fft= 17 *d *log(2.*d)/log(2.);
+	//size_t costFFT  = mmul*2*d + 3*madd*fft;
+	size_t count=0;
+	chrono.start();
+	do {
+		PMFFT.mul(C,A,B);
+		count++;
+	} while (false);//count<20 && chrono.userElapsedTime()<1);
+	//cout<<"FFT Multiplication total: "<<chrono.userElapsedTime()<<" s, "
+	//   <<costFFT/(1e6*chrono.userElapsedTime())<<" Miops"<<endl;
+	chrono.stop();
+	//cout<<chrono.userElapsedTime()/count<<" (";
+	//cout<<chrono.realElapsedTime()/count<<") ";
+	//cout<<chrono.gettime()/count<<" ";
+	cout<<chrono<<" ";
+	
+#ifdef BENCH_FLINT
+	nmod_poly_mat_t AA,BB,CC;
+	nmod_poly_mat_init(AA,n,n,(uint64_t)fld.cardinality());
+	nmod_poly_mat_init(BB,n,n,(uint64_t)fld.cardinality());
+	nmod_poly_mat_init(CC,n,n,(uint64_t)fld.cardinality());
+	flint_rand_t state;
+	flint_randinit(state);
+	nmod_poly_mat_randtest(AA,state,d);
+	nmod_poly_mat_randtest(BB,state,d);
+	count=0;
+	chrono.start();
+	do {
+		nmod_poly_mat_mul(CC,AA,BB);
+		count++;
+	} while (false);//(count<20 && chrono.userElapsedTime()<1);
+	cout<<chrono.userElapsedTime()/count<<" (";
+	cout<<chrono.realElapsedTime()/count<<") ";
+	//cout<<"FLINT Multiplication: "<<chrono.userElapsedTime()<<" s, "
+	//    <<costFFT/(1e6*chrono.userElapsedTime())<<" Miops"<<endl;
+
+#endif
+	
+#ifdef BENCH_MMX
+	{
+		mmx::threads_set_number (1);
+		srand(time(NULL));
+		//typedef mmx::modulus<uint32_t,mmx::modulus_int_preinverse<29> > MOD;
+		// typedef mmx::modulus<uint64_t > MOD;
+		// typedef mmx::modular<MOD> COEFF;
+		// MOD M((uint64_t)fld.cardinality());
+		// COEFF::set_modulus(M);
+		typedef mmx::modular<mmx::modulus<uint32_t,mmx::modulus_int_preinverse<29> >, mmx::modular_fixed<mmx::nat,469762049>> COEFF;
+		//mmx::mmout <<"\n MMX mod :"<< COEFF::get_modulus()<<"\n";
+		typedef mmx::polynomial_tft<mmx::polynomial_naive> PV;
+		typedef mmx::matrix_tft<mmx::matrix_naive> MV;
+		typedef mmx::polynomial<COEFF,PV> POLY;
+		typedef mmx::matrix<POLY,MV> MATRIX;
+		MATRIX AAA(1,n,n), BBB(1,n,n), CCC(1,n,n);
+		for (mmx::nat i=0; i<n; i++)
+			for (mmx::nat j=0; j<n; j++) {
+				mmx::vector<COEFF> vA,vB;
+				for(size_t h=0;h<d;h++){
+					vA<<COEFF(rand()%(uint64_t)fld.cardinality());
+					vB<<COEFF(rand()%(uint64_t)fld.cardinality());
+				}
+				AAA(i,j)=POLY(vA);
+				BBB(i,j)=POLY(vB);
+				//mmx::mmout<<AAA(i,j)<<"\n";
+				//mmx::mmout<<BBB(i,j)<<"\n";
+			}
+		chrono.clear();
+		chrono.start();
+		CCC=AAA*BBB;
+		//mmx::mmout<<CCC;
+		cout<<chrono.userElapsedTime()/count<<" ";
+	}
+#endif
+	cout<<endl;
+}
+
+
+
+template<typename Field, typename RandIter>
+void profile_matpol_mulkara(const Field& fld,  RandIter& Gen, size_t n, size_t d) {
+	typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> MatrixP;
+	MatrixP A(fld,n,n,d),B(fld,n,n,d),C(fld,n,n,2*d-1);
+
+	// Generate random matrix of polynomial
+	for (size_t i=0;i<d;i++){
+		randomMat(Gen,A[i]);
+		randomMat(Gen,B[i]);
+	}
+
+	typedef PolynomialMatrixKaraDomain<Field>    Kara;
+	Kara  PM(fld);
+	Timer chrono;
+	chrono.start();
+	PM.mul(C,A,B);
+	size_t mmul=2*n*n*n;
+	size_t madd=n*n;
+	size_t kara=pow((double)d, log(3.)/log(2.));
+	size_t costKara = mmul*kara+ 6*madd*kara;
+	cout<<"Kara Multiplication total: "<<chrono.userElapsedTime()<<" s, "
+	    <<costKara/(1e6*chrono.userElapsedTime())<<" Miops"<<endl;
+}
+
+
+template<typename Field>
+void runTest(const Field& F, size_t n, long b, long d, long seed, std::string test){
+	//typename Field::RandIter G(F,b,seed);
+	typename Field::RandIter G(F,seed);
+	if (test == "check"|| test == "all")
+		check_matpol_mul(F,G,n,d);
+	if (test == "bench" || test == "all")
+		bench_matpol_mul(F,G,n,d);
+	if (test == "fft")
+		profile_matpol_mulfft(F,G,n,d);
+	if (test == "longfft"){
+		size_t N[15]={16,16,16,16,16,16,16,16,             64,128,256,512,512,1024,2048};
+		size_t D[15]={64,128,256,512,1024,2048,4096,8192,1024,512,256,512,128,  64,32 };
+		for (size_t i=0;i<15;i++)
+			profile_matpol_mulfft(F,G,N[i],D[i]);
+	}
+	if (test == "kara")
+		profile_matpol_mulkara(F,G,n,d);
+}
+
+int main(int argc, char** argv){
+	static size_t  n = 32; // matrix dimension
+	static long    b = 20; // entries bitsize
+	static uint64_t d = 32;  // matrix degree
+	static bool    z = false; // computer over  Z[x]
+	static long    seed = time(NULL);
+	static std::string  test ="all";
+
+	static Argument args[] = {
+		{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT,     &n },
+		{ 'd', "-d D", "Set degree of test matrices to D.", TYPE_INT,     &d },
+		{ 'b', "-b B", "Set bitsize of the matrix entries", TYPE_INT, &b },
+		{ 'z', "-z y", "Perform the computation over Z[x]", TYPE_BOOL, &z},
+		{ 's', "-s s", "Set the random seed to a specific value", TYPE_INT, &seed},
+		{ 't', "-t t", "Choose the targeted test {all,check,bench,fft,kara,longfft}", TYPE_STR, &test},
+		END_OF_ARGUMENTS
+	};
+	parseArguments (argc, argv, args);
+
+	if (z){
+#ifdef FFT_PROFILER
+		FFT_PROF_LEVEL=2;		
+#endif
+		cout<<"Computation over Z[x]  "<<endl;
+		cout<<"++++++++++++++++++++++++++++++++++++"<<endl;
+		Givaro::ZRing<integer> F;
+		runTest (F,n,b,d,seed,test);
+	}
+	else {
+		if (b > 29){
+#ifdef FFT_PROFILER		
+			FFT_PROF_LEVEL=2;
+#endif
+			RandomPrimeIter Rd(b,seed);
+			integer p= Rd.random();
+			Givaro::Modular<integer> F(p);
+			//Givaro::Modular<RecInt::ruint128,RecInt::ruint512> F(p);
+			cout<<"Computation over Fp[x] with p=  "<<p<<" (Generic prime)"<<endl;
+			cout<<"++++++++++++++++++++++++++++++++++++"<<endl;
+			runTest (F,n,b,d,seed,test);
+		}
+		else {
+#ifdef FFT_PROFILER 
+			FFT_PROF_LEVEL=1; 
+#endif
+			RandomFFTPrime Rd(1<<b,seed);
+			integer p = Rd.randomPrime(integer(d).bitsize()+1);
+			//Givaro::Modular<int32_t> F((int32_t)p);
+			Givaro::Modular<double> F((int32_t)p);
+			cout<<"Computation over Fp[x] with p=  "<<p<<" (FFT prime)"<<endl;
+			cout<<"++++++++++++++++++++++++++++++++++++"<<endl;
+			runTest (F,n,b,d,seed,test);
+		}
+	}
+	return 0;
+} 
+ 
+
+
+
diff --git a/examples/bigmat.C b/examples/bigmat.C
new file mode 100644
index 0000000..4e6897c
--- /dev/null
+++ b/examples/bigmat.C
@@ -0,0 +1,68 @@
+/*
+ * examples/bigmat.C
+ *
+ * Copyright (C) 2007, 2010 B Youse, D. Saunders
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+/*! @file examples/bigmat.C
+ * @example  examples/bigmat.C
+ * \ingroup examples
+ * @brief Outputs a big and very sparse matrix.
+ *
+ * let C be the cyclic shift matrix with 1 on the 1,n position and along the first subdiagonal.
+ *
+ *  This matrix is \f$2C + 3I\f$. It has 2 nonzero entries per row and per column.
+ *  It is an \f$ n \times n\f$ matrix whose determinant is considerably less than the
+ *  Hadamard bound (but is large -- 3^n +- 2^n).
+ *
+ */
+#include <iostream>
+#include <cstdlib>
+using namespace std;
+
+int main(int argc, char* argv[])
+{
+	if (argc != 2 ) {
+		cerr << "Usage: bigmat <n>, where <n> is the size you like." << endl;
+		return -1;
+	}
+
+	int n = atoi(argv[1]);
+	cout << n << " " << n << " M" << endl;
+	cout << "1 1 3" << endl;
+	cout << "1 " << n << " 2" << endl;
+	for (int i = 2; i <=n; ++i)
+	{
+		cout << i << " " << i-1 << " " << 2 << endl;
+		cout << i << " " << i << " " << 3 << endl;
+	}
+	cout << "0 0 0" << endl;
+	return 0 ;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/blackbox/Makefile.am b/examples/blackbox/Makefile.am
new file mode 100644
index 0000000..f9c1125
--- /dev/null
+++ b/examples/blackbox/Makefile.am
@@ -0,0 +1,44 @@
+# Copyright (c) 2010 the LinBox group
+# This file is part of LinBox
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the  GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# ========LICENCE========
+#/
+
+INCLUDES=-I$(top_srcdir)
+
+EXTRA_PROGRAMS = smith example ex-mat0 load-det load-minpoly load-symmetrize random-rank
+#zeroone-rank
+
+AM_CPPFLAGS=-DLinBoxSrcOnly  $(NTL_CFLAGS) -DEXAMPLE_DATADIR=\"$(srcdir)/data\"
+LDADD =  $(NTL_LIBS) -lgivaro -lclapack -lcblas -latlas  $(LDFLAGS)
+
+example_SOURCES  = example.C
+smith_SOURCES  = smith.C
+load_det_SOURCES = load-det.C
+load_minpoly_SOURCES = load-minpoly.C
+load_symmetrize_SOURCES = load-symmetrize.C
+random_rank_SOURCES = random-rank.C
+#zeroone_rank_SOURCES = zeroone-rank.C
+ex_mat0_SOURCES  = ex-mat0.C
+
+# general
+
+%:%.o
+	$(CXXLINK) $(LDFLAGS) $(OBJECTS) $(LDADD) $(LIBS)
+
+
diff --git a/examples/blackbox/ex-mat0.C b/examples/blackbox/ex-mat0.C
new file mode 100644
index 0000000..3673270
--- /dev/null
+++ b/examples/blackbox/ex-mat0.C
@@ -0,0 +1,91 @@
+/*
+ * examples/blackbox/example.C
+ *
+ * Copyright (C) 2003 William J. Turner
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/** @name examples/blackbox/ex-mat0.C
+ * @author William J. Turner for the LinBox group
+ *
+ * @memo usage: ex-mat0 in-file out-file
+ *
+ * @doc
+ * Run tests on Wiedemann algorithm for solving nonhomogeneous linear
+ * equations
+ *
+ * FIXME What does it do?  I think this may be a remnant, has evolved
+ * into one of the other examples.  delete it?
+ */
+//@{
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+#include <list>
+#include <utility>
+
+#include "linbox/field/modular.h"
+//#include "linbox/blackbox/sparse0.h"
+#include "linbox/blackbox/sparse1.h"
+
+using namespace LinBox;
+using namespace std;
+
+int main(int argc, char* argv[])
+{
+
+	if (argc != 3)
+	{	cerr << "usage: " << argv[0] << " in_file out_file" << endl;
+		return -1;
+	}
+        char* in_file = argv[1];
+        char* out_file = argv[2];
+
+        typedef Givaro::Modular<uint32_t>  Field;
+	typedef Field::Element Element;
+	typedef Field::RandIter RandIter;
+	typedef std::list< pair<size_t, Element> > Row;
+	typedef std::vector<Element> Vector;
+
+        Field K(7);
+
+        ofstream out_stream(out_file);
+        ifstream in_stream(in_file);
+
+//	SparseMatrix<Field, Row, Vector>  A(K,4,4);
+//      A.read(in_stream);
+//	A.write(out_stream);
+
+        SparseBlackBoxDom< Field > A(K) ;
+
+        A.read(in_stream);
+        A.write(out_stream);
+
+}
+//@}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/blackbox/example.C b/examples/blackbox/example.C
new file mode 100644
index 0000000..0c8cdce
--- /dev/null
+++ b/examples/blackbox/example.C
@@ -0,0 +1,166 @@
+
+/*
+ * examples/blackbox/example.C
+ *
+ * Copyright (C) 2001, 2002, 2010 Bradford Hovinen <hovinen at cis.udel.edu>
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/** @name examples/blackbox/example.C
+ *
+ * @author Bradford Hovinen <hovinen at cis.udel.edu>
+ * @memo
+ * Simple example on Linbox use. Demonstrates loading and application of
+ * blackbox matrix to a vector and computation of the minimal polynomial.
+ * @doc
+ * FIXME what is shown different that in other minpoly example?
+ *
+ */
+//@{
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+
+// Field we are working with
+//#include "linbox/field/modular.h"
+#include "linbox/field/givaro-gfq.h"
+
+// Black box classes we are going to work with
+#include "linbox/matrix/sparse-matrix.h"
+
+// Minimal polynomial algorithm
+#include "linbox/solutions/minpoly.h"
+
+#include "linbox/vector/vector-domain.h"
+
+//using namespace LinBox;
+using namespace std;
+
+// This is the field we are going to be working with - integers mod q
+//typedef Givaro::Modular<LinBox::uint32_t> Field;
+typedef LinBox::Givaro::GFq Field;
+
+// Some typedefs to make the type names less daunting
+typedef vector <Field::Element> Vector;
+typedef vector <Field::Element> Polynomial;
+typedef vector <pair <size_t, Field::Element> > Row;
+typedef LinBox::SparseMatrix <Field, VectorTraits<Row>::SparseFormat > Blackbox;
+
+// Constants: we are working with an n x n matrix over GF(q)
+const int n = 10;
+const int q = 101;
+
+void printVector (const Field &F, const Vector &v)
+{
+	int i;
+
+	cout << '(';
+	for (i = 0; i < v.size (); i++) {
+		F.write (cout, v[i]);
+		if (i < v.size () - 1)
+			cout << ", ";
+	}
+	cout << ')' << endl;
+}
+
+void printPolynomial (const Field &F, const Polynomial &v)
+{
+	int i;
+
+	for (i = v.size () - 1; i >= 0; i--) {
+		F.write (cout, v[i]);
+
+		if (i > 0)
+			cout << " x^" << i << " + ";
+	}
+
+	cout << endl;
+}
+
+void makeTestVector (const Field &F, const Blackbox &A, Vector &v)
+{
+	int i;
+
+	v.resize (A.coldim ());
+
+	for (i = 0; i < v.size (); i++)
+		F.init (v[i], i);
+}
+
+void testApply (const Field &F, const Blackbox &A, const Vector &v)
+{
+	Vector w (A.coldim ());
+
+	cout << "v = ";
+	printVector (F, v);
+
+	A.apply (w, v);
+
+	cout << "Av = ";
+	printVector (F, w);
+	cout << endl;
+}
+
+void testMinpoly (const Field &F, const Blackbox &A)
+{
+	Polynomial m_A;
+
+	LinBox::minpoly (m_A, A, F);
+
+	cout << "Minimal polynomial m_A of A is: ";
+	printPolynomial (F, m_A);
+	cout << endl;
+}
+
+/// no command line args
+int main (int argc, char **argv)
+{
+	srand (time (NULL));
+
+	// Construct the field GF(q) and a vector over GF(q)^n to
+	// which to apply the matrix
+	//Field F (q);
+	Field F (2, 15);
+	Vector v (n);
+
+	// Construct and load the sparse test matrix
+	Blackbox A (F, n, n);
+	//ifstream input (EXAMPLE_DATADIR "/test.matrix");
+	ifstream input ("mat.txt");
+	A.read (input);
+
+	// Run tests
+	makeTestVector (F, A, v);
+	testApply (F, A, v);
+	testMinpoly (F, A);
+
+	return 0;
+}
+//@}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/blackbox/load-det.C b/examples/blackbox/load-det.C
new file mode 100644
index 0000000..7c84097
--- /dev/null
+++ b/examples/blackbox/load-det.C
@@ -0,0 +1,98 @@
+
+
+/*
+ * examples/blackbox/load-det.C
+ *
+ * Copyright (C) 2001, 2002, 2010 Bradford Hovinen <hovinen at cis.udel.edu>
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/** @name examples/blackbox/load-det.C
+ *
+ * @author Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * @memo
+ * Small program that loads and computes the determinant of a matrix whose
+ * filename is given on the command line.
+ */
+//@{
+#include "linbox/linbox-config.h"
+
+#include <fstream>
+#include <vector>
+
+#include "linbox/field/modular.h"
+#include "linbox/solutions/det.h"
+
+using namespace LinBox;
+using namespace std;
+
+// Select our field: integers modulo a word-size (max. 31-bit) modulus
+typedef Givaro::Modular<uint32_t> Field;
+
+// Select our black box: a sparse matrix over the above-mentioned field with
+// default application vector and row representation types
+typedef DenseMatrix<Field> Blackbox;
+
+// Constants: we are working with a matrix over GF(q)
+
+/// load-det matrix-file
+int main (int argc, char **argv)
+{
+	Field::Element det_A;
+	int q = 65521U;
+
+	if (argc < 2 || argc > 3) {
+		cerr << "Usage: load-det <matrix> [<p>]" << endl;
+		return -1;
+	}
+
+	commentator().setMaxDepth (2);
+	commentator().setReportStream (cout);
+
+	if (argc == 3) q = atoi(argv[2]);
+	Field F (q);
+
+	Blackbox A (F);
+	ifstream input (argv[1]);
+
+	if (!input) {
+		cerr << "Error: Cannot load matrix " << argv[1] << endl;
+		return -1;
+	}
+
+	A.read (input); // size is determined by the input.
+	cout << "A is " << A.rowdim() << " by " << A.coldim() << endl;
+
+	det (det_A, A, F);
+
+	cout << "Determinant is " << det_A << " mod " << q << endl;
+
+	return 0;
+}
+//@}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/blackbox/load-minpoly.C b/examples/blackbox/load-minpoly.C
new file mode 100644
index 0000000..9a90022
--- /dev/null
+++ b/examples/blackbox/load-minpoly.C
@@ -0,0 +1,117 @@
+
+/*
+ * examples/blackbox/load-minpoly.C
+ *
+ * Copyright (C) 2001, 2002 Bradford Hovinen <hovinen at cis.udel.edu>
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/** @name examples/blackbox/load-minpoly.C
+ *
+ * @author Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * @memo
+ * Small program that loads and computes the minimal polynomial of a matrix
+ * whose filename is given on the command line.
+ */
+//@{
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+
+#include "linbox/field/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/solutions/minpoly.h"
+
+using namespace LinBox;
+using namespace std;
+
+// Select our field: integers modulo a word-size (max. 31-bit) modulus
+typedef Givaro::Modular<uint32_t> Field;
+
+// Select our black box: a sparse matrix over the above-mentioned field with
+// default application vector and row representation types
+typedef SparseMatrix<Field> Blackbox;
+
+// We are using dense vectors to represent polynomials
+typedef Vector<Field>::Dense Polynomial;
+
+// Constants: we are working with an n x n matrix over GF(q)
+const int n = 1000;
+const int q = 65521U;
+
+void printPolynomial (const Field &F, const Polynomial &v)
+{
+	int i;
+
+	for (i = v.size () - 1; i >= 0; i--) {
+		F.write (cout, v[i]);
+
+		if (i > 0)
+			cout << " x^" << i << " + ";
+	}
+
+	cout << endl;
+}
+
+/// load-minpoly matrix-file
+int main (int argc, char **argv)
+{
+	Polynomial m_A;
+
+	if (argc < 2) {
+		cerr << "Usage: load-minpoly <matrix>" << endl;
+		return -1;
+	}
+
+	commentator().setMaxDepth (2);
+	commentator().setReportStream (cout);
+
+	Field F (q);
+
+	Blackbox A (F, n, n);
+	ifstream input (argv[1]);
+
+	if (!input) {
+		cerr << "Error: Cannot load matrix " << argv[1] << endl;
+		return -1;
+	}
+
+	A.read (input);
+
+	minpoly (m_A, A, F);
+
+	cout << "Minimal polynomial is ";
+	printPolynomial (F, m_A);
+
+	return 0;
+}
+//@}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/blackbox/load-symmetrize.C b/examples/blackbox/load-symmetrize.C
new file mode 100644
index 0000000..f626326
--- /dev/null
+++ b/examples/blackbox/load-symmetrize.C
@@ -0,0 +1,103 @@
+
+/*
+ * examples/blackbox/load-sylletrize.C
+ *
+ * Copyright (C) 2001, 2002, 2010 Bradford Hovinen <hovinen at cis.udel.edu>
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/** @name examples/blackbox/load-symmetrize.C
+ *
+ * @author Bradford Hovinen <hovinen at cis.udel.edu>
+ * @memo
+ * Small program that loads and computes the minimal polynomial of A^T A, where
+ * A is a matrix whose filename is given on the command line
+ */
+//@{
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+
+#include "linbox/field/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/algorithms/blackbox-container-symmetrize.h"
+#include "linbox/algorithms/massey-domain.h"
+
+using namespace LinBox;
+using namespace std;
+
+typedef Givaro::Modular<uint32_t> Field;
+
+typedef vector <Field::Element> Vector;
+typedef vector <Field::Element> Polynomial;
+typedef SparseMatrix <Field, VectorTraits<Vector>::SparseFormat > Blackbox;
+
+// Constants: we are working with an n x n matrix over GF(q)
+const int n = 1000;
+const int q = 65521U;
+
+/// load-symmetrize matrix-file
+int main (int argc, char **argv)
+{
+	if (argc < 2) {
+		cerr << "Usage: load-symmetrize <matrix>" << endl;
+		return -1;
+	}
+
+	commentator().setMaxDepth (2);
+	commentator().setReportStream (cout);
+
+	Field F (q);
+
+	Blackbox A (F, n, n);
+	ifstream input (argv[1]);
+
+	if (!input) {
+		cerr << "Error: Cannot load matrix " << argv[1] << endl;
+		return -1;
+	}
+
+	A.read (input);
+
+	unsigned long               deg;
+	std::vector<Field::Element> P;
+
+	BlackboxContainerSymmetrize<Field, Vector> TF (&A, F);
+	MasseyDomain< Field, BlackboxContainerSymmetrize<Field, Vector> > WD (&TF, 20);
+
+	WD.pseudo_minpoly (P, deg);
+
+	cout << "Determinant is " << P[0] << endl;
+	cout << "Degree is " << P.size () - 1 << endl;
+
+	return 0;
+}
+//@}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/blackbox/mat.txt b/examples/blackbox/mat.txt
new file mode 100644
index 0000000..36fdda9
--- /dev/null
+++ b/examples/blackbox/mat.txt
@@ -0,0 +1,9 @@
+4 4 M  
+1 1 1
+1 2 2
+1 3 8
+1 3 9
+2 2 3
+3 0 9
+-1 
+
diff --git a/examples/blackbox/mat2.txt b/examples/blackbox/mat2.txt
new file mode 100644
index 0000000..080a01d
--- /dev/null
+++ b/examples/blackbox/mat2.txt
@@ -0,0 +1,6 @@
+2 2 M
+0 0 1
+0 1 2
+1 0 3
+1 1 4
+-1
diff --git a/examples/blackbox/random-rank.C b/examples/blackbox/random-rank.C
new file mode 100644
index 0000000..20414e9
--- /dev/null
+++ b/examples/blackbox/random-rank.C
@@ -0,0 +1,108 @@
+
+/*
+ * examples/blackbox/random-rank.C
+ *
+ * Copyright (C) 2001, 2002, 2010 Bradford Hovinen <hovinen at cis.udel.edu>
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+/** @name examples/blackbox/random-rank.C
+ *
+ * @author Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *
+ * @memo rank by several algorithms over large and small fields.
+ * @doc FIXME what's it do more precisely?
+ */
+//@{
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+
+#include "linbox/field/modular.h"
+#include "linbox/field/givaro-gfq.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/solutions/rank.h"
+#include "linbox/solutions/methods.h"
+#include "linbox/vector/stream.h"
+
+using namespace LinBox;
+using namespace std;
+
+// Select our field: integers modulo a word-size (max. 31-bit) modulus
+typedef Givaro::Modular<LinBox::uint32_t> Field;
+typedef Givaro::GFq FieldExtn;
+
+// The Gaussian elimiation code only works with sparse sequence vectors, so we'll use those
+typedef Vector<Field>::SparseSeq Row;
+typedef Vector<FieldExtn>::SparseSeq RowE;
+
+// Select our black box: a sparse matrix over the above-mentioned field with
+// default application vector and row representation types
+typedef SparseMatrix<Field, VectorTraits<Row>::SparseFormat> Blackbox;
+typedef SparseMatrix<FieldExtn, VectorTraits<RowE>::SparseFormat> BlackboxE;
+
+// Constants: we are working with an n x n matrix over GF(q)
+const int n = 1000;
+//const int q = 65521U;
+const int q = 2U;
+const double p = 0.026;
+
+/// no command line args
+int main (int argc, char **argv)
+{
+	unsigned long rank_A_Wiedemann, rank_A_elimination;
+
+	commentator().setMaxDepth (2);
+	commentator().setReportStream (cout);
+
+	Field F (q); Field::RandIter gen(F);
+	FieldExtn E (q, 10); FieldExtn::RandIter Egen(E);
+
+	RandomSparseStream<Field, Row> A_stream (F, gen, p, n, n);
+	RandomSparseStream<FieldExtn, RowE> B_stream (E, Egen, p, n, n);
+
+	Blackbox A (F, A_stream);
+	BlackboxE B (E, B_stream);
+
+	rank (rank_A_Wiedemann, A, F, MethodTrait::Wiedemann ());
+	rank (rank_A_elimination, A, F, MethodTrait::Elimination ());
+
+	cout << "Rank by Wiedemann is " << rank_A_Wiedemann << endl;
+	cout << "Rank by Elimination is " << rank_A_elimination << endl;
+
+	rank (rank_A_Wiedemann, B, E, MethodTrait::Wiedemann ());
+	rank (rank_A_elimination, B, E, MethodTrait::Elimination ());
+
+	cout << "Over Extension Field Rank by Wiedemann is " << rank_A_Wiedemann << endl;
+	cout << "Over Extension Field Rank by Elimination is " << rank_A_elimination << endl;
+
+	return 0;
+}
+//@}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/blackbox/smith.C b/examples/blackbox/smith.C
new file mode 100644
index 0000000..3e2626d
--- /dev/null
+++ b/examples/blackbox/smith.C
@@ -0,0 +1,576 @@
+/* Copyright (C) LinBox
+ * Written by bds, zw
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+/** \file examples/blackbox/smith.C
+  \brief mod m Smith form by elmination
+
+  \author bds & zw
+
+*/
+#include <iostream>
+#include <string>
+#include <vector>
+#include <list>
+
+using namespace std;
+#include "linbox/util/timer.h"
+#include "linbox/field/unparametric.h"
+#include "linbox/field/local2_32.h"
+//#include "linbox/field/PIR-modular-int32.h"
+#include "linbox/algorithms/2local-smith.h"
+#include "linbox/algorithms/local-smith.h"
+#include "linbox/algorithms/iliopoulos-elimination.h"
+
+using namespace LinBox;
+#ifndef BIG
+#include "linbox/field/PIR-modular-int32.h"
+typedef PIRModular<int32_t> PIR;
+#else
+#include "linbox/field/PIR-ntl-ZZ_p.h"
+typedef PIR_ntl_ZZ_p PIR;
+#endif
+
+
+
+template<class PIR>
+void Mat(DenseMatrix<PIR>& M, PIR& R, int n,
+	 string src, string file, string format);
+
+template<class I1, class Lp> void distinct (I1 a, I1 b, Lp& c);
+template <class I> void display(I b, I e);
+
+int main(int argc, char* argv[])
+{
+
+	if (argc < 5) {
+
+		cout << "usage: " << argv[0] << " alg m n source format \n"  << endl;
+
+		cout << "alg = `adaptive', `ilio', `local', or `2local', \n"
+		<< "m is modulus (ignored by 2local, adaptive), "
+		<< "n is matrix order, \n"
+		<< "source is `random', `random-rough', `fib', `tref', or a filename \n"
+		<< "format is `dense' or `sparse' (if matrix from a file)\n"
+		<< "compile with -DBIG if you want big integers used.\n";
+
+		return 0;
+	}
+
+	string algo = argv[1];
+
+	int m = atoi(argv[2]);
+
+	int n = atoi(argv[3]);
+
+	string src = argv[4];
+
+	string file = src;
+
+	string format = (argc >= 6 ? argv[5] : "");
+
+	UserTimer T;
+
+	if (algo == "adaptive")
+	{
+		cerr << "adaptive call not implemented yet" << endl;
+	}
+	if (algo == "ilio") {
+
+		PIR R(m);
+
+		DenseMatrix<PIR> M(R);
+
+		Mat(M, R, n, src, file, format);
+
+		T.start();
+
+		IliopoulosElimination::smithIn (M);
+
+		T.stop();
+
+		typedef list< PIR::Element > List;
+
+		List L;
+
+		for (size_t i = 0; i < M.rowdim(); ++i) L.push_back(M[i][i]);
+
+		list<pair<PIR::Element, size_t> > p;
+
+		distinct(L.begin(), L.end(), p);
+
+		cout << "#";
+
+		display(p.begin(), p.end());
+
+		cout << "# ilio, PIR-Modular-int32_t(" << m << "), n = " << n << endl;
+
+		cout << "T" << n << "ilio" << m << " := ";
+	}
+
+	else if (algo == "local") { // m must be a prime power
+
+		PIR R(m);
+
+		DenseMatrix<PIR> M(R);
+
+		Mat(M, R, n, src, file, format);
+
+		typedef list< PIR::Element > List;
+
+		List L;
+
+		LocalSmith<PIR> SmithForm;
+
+		T.start();
+
+		SmithForm( L, M, R );
+
+		T.stop();
+
+		list<pair<PIR::Element, size_t> > p;
+
+		distinct(L.begin(), L.end(), p);
+
+		cout << "#";
+
+		display(p.begin(), p.end());
+
+		cout << "# local, PIR-Modular-int32_t(" << m << "), n = " << n << endl;
+
+		cout << "T" << n << "local" << m << " := ";
+	}
+
+	else if (algo == "2local") {
+
+		Local2_32 R;
+
+		DenseMatrix<Local2_32> M(R);
+
+		Mat(M, R, n, src, file, format);
+
+		typedef list< Local2_32::Element > List;
+
+		List L;
+
+		LocalSmith<Local2_32> SmithForm;
+
+		T.start();
+
+		SmithForm( L, M, R );
+
+		T.stop();
+
+		list<pair<Local2_32::Element, size_t> > p;
+
+		distinct(L.begin(), L.end(), p);
+
+		cout << "#";
+
+		display(p.begin(), p.end());
+
+		cout << "# 2local, Local2_32, n = " << n << endl;
+
+		cout << "T" << n << "local2_32 := ";
+	}
+
+	else {
+
+		printf ("Unknown algorithms\n");
+
+		exit (-1);
+
+	}
+
+	T.print(cout); cout << ";" << endl;
+
+	return 0 ;
+}
+
+/** Output matrix is determined by src which may be:
+  "random-rough"
+  This mat will have s, near sqrt(n), distinct invariant factors,
+  each repeated twice), involving the s primes 101, 103, ...
+  "random"
+  This mat will have the same nontrivial invariant factors as
+  diag(1,2,3,5,8, ... 999, 0, 1, 2, ...).
+  "fib"
+  This mat will have the same nontrivial invariant factors as
+  diag(1,2,3,5,8, ... fib(k)), where k is about sqrt(n).
+  The basic matrix is block diagonal with i-th block of order i and
+  being a tridiagonal {-1,0,1} matrix whose snf = diag(i-1 1's, fib(i)),
+  where fib(1) = 1, fib(2) = 2.  But note that, depending on n,
+  the last block may be truncated, thus repeating an earlier fibonacci number.
+  "file" (or any other string)
+  mat read from named file with format "sparse" or "dense".
+  Also "tref" and file with format "kdense"
+  */
+template <class PIR>
+
+void Mat(DenseMatrix<PIR>& M, PIR& R, int n,
+	 string src, string file, string format) {
+
+	if (src == "random-rough") RandomRoughMat(M, R, n);
+
+	else if (src == "random") RandomFromDiagMat(M, R, n);
+
+	else if (src == "fib") RandomFibMat(M, R, n);
+
+	else if (src == "tref") TrefMat(M, R, n);
+
+	else // from file
+	{
+
+		int rdim, cdim;
+
+		std::ifstream in (file.c_str(), std::ios::in);
+		if (! in) { cerr << "error: unable to open file" << endl; exit(-1); }
+
+		in >> rdim >> cdim;
+
+		M. resize (rdim, cdim);
+
+
+		if (format == "dense" ) {
+		int val;
+
+			for (int i = 0; i < rdim; ++ i)
+
+				for ( int j = 0; j < cdim; ++ j) {
+
+					in >> val;
+
+					R. init (M[i][j], val);
+
+				}
+		}
+
+		else if (format == "sparse") {
+
+			int i, j;
+
+			char mark;
+
+			in >> mark;
+
+			LinBox::integer val;
+
+			do {
+
+				in >> i >> j;
+				in. ignore (1);
+				in >> val;
+
+				if ( i == 0) break;
+
+				R. init (M[i-1][j-1], val);
+
+			} while (true);
+
+		}
+		//Krattenthaler's q^e matrices, given by exponent
+		else if (format == "kdense") KratMat(M, R, n, in);
+
+		else {
+
+			cout << "Format: " << format << " Unknown\n";
+
+			exit (-1);
+
+		}
+	}
+
+	/*show some entries
+	  for (int k = 0; k < 10; ++k)
+	  cout << M.getEntry(0,k) <<  " " << M.getEntry(M.rowdim()-1, M.coldim()-1 - k) << endl;
+	  cout << endl << M.rowdim() << " " << M.coldim() << endl;
+	  */
+
+	/* some row ops and some col ops */
+} // Mat
+
+// This mat will have s, near sqrt(n), distinct invariant factors,
+// each repeated twice), involving the s primes 101, 103, ...
+template <class PIR>
+void RandomRoughMat(DenseMatrix<PIR>& M, PIR& R, int n) {
+	M.resize(n, n, R.zero);
+	if (n > 10000) {cerr << "n too big" << endl; exit(-1);}
+	int jth_factor[130] =
+	{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67,
+		71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149,
+		151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229,
+		233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313,
+		317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409,
+		419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499,
+		503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601,
+		607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691,
+		701, 709, 719, 727, 733};
+
+	for (int j= 0, i = 0 ; i < n; ++j)
+	{
+		typename PIR::Element v; R.init(v, jth_factor[25+j]);
+		for (int k = j ; k > 0 && i < n ; --k)
+		{   M[i][i] = v; ++i;
+			if (i < n) {M[i][i] = v; ++i;}
+		}
+	}
+	scramble(M);
+}
+
+// This mat will have the same nontrivial invariant factors as
+// diag(1,2,3,5,8, ... 999, 0, 1, 2, ...).
+template <class PIR>
+void RandomFromDiagMat(DenseMatrix<PIR>& M, PIR& R, int n) {
+	M.resize(n, n, R.zero);
+
+	for (int i= 0 ; i < n; ++i)
+
+		R.init(M[i][i], i % 1000 + 1);
+	scramble(M);
+
+}
+
+// This mat will have the same nontrivial invariant factors as
+// diag(1,2,3,5,8, ... fib(k)), where k is about sqrt(n).
+// The basic matrix is block diagonal with i-th block of order i and
+// being a tridiagonal {-1,0,1} matrix whose snf = diag(i-1 1's, fib(i)),
+// where fib(1) = 1, fib(2) = 2.  But note that, depending on n,
+// the last block may be truncated, thus repeating an earlier fibonacci number.
+template <class PIR>
+void RandomFibMat(DenseMatrix<PIR>& M, PIR& R, int n) {
+	M.resize(n, n, R.zero);
+
+	typename PIR::Element pmone; R.assign(pmone, R.one);
+
+	for (int i= 0 ; i < n; ++i) M[i][i] = R.one;
+
+	int j = 1, k = 0;
+
+	for (int i= 0 ; i < n-1; ++i) {
+
+		if ( i == k) {
+
+			M[i][i+1] = R.zero;
+
+			k += ++j;
+		}
+
+		else {
+
+			M[i][i+1] = pmone;
+
+			R.negin(pmone);
+		}
+		R.neg(M[i+1][i], M[i][i+1]);
+	}
+	scramble(M);
+}
+
+template < class Ring >
+void scramble(DenseMatrix<Ring>& M)
+{
+
+	Ring R = M.field();
+
+	int N,n = M.rowdim(); // number of random basic row and col ops.
+	N = n;
+
+	for (int k = 0; k < N; ++k) {
+
+		int i = rand()%M.rowdim();
+
+		int j = rand()%M.coldim();
+
+		if (i == j) continue;
+
+		// M*i += alpha M*j and Mi* += beta Mj
+
+		//int a = rand()%2;
+		int a = 0;
+
+		for (size_t l = 0; l < M.rowdim(); ++l) {
+
+			if (a)
+
+				R.subin(M[l][i], M[l][j]);
+
+			else
+
+				R.addin(M[l][i], M[l][j]);
+
+			//K.axpy(c, M.getEntry(l, i), x, M.getEntry(l, j));
+			//M.setEntry(l, i, c);
+		}
+
+		//a = rand()%2;
+
+		for (size_t l = 0; l < M.coldim(); ++l) {
+
+			if (a)
+
+				R.subin(M[i][l], M[j][l]);
+			else
+
+				R.addin(M[i][l], M[j][l]);
+		}
+	}
+
+	std::ofstream out("matrix", std::ios::out);
+
+	//M. write(std::cout);
+
+	out << n << " " << n << "\n";
+
+	for (int i = 0; i < n; ++ i) {
+
+		for ( int j = 0; j < n; ++ j) {
+
+			R. write(out, M[i][j]);
+
+			out << " ";
+		}
+
+		out << "\n";
+
+	}
+
+	//}
+}
+
+//////////////////////////////////
+// special mats tref and krat
+
+// Trefethen's challenge #7 mat (primes on diag, 1's on 2^e bands).
+template <class PIR>
+void TrefMat(DenseMatrix<PIR>& M, PIR& R, int n) {
+	M.resize(n, n, R.zero);
+
+	std::vector<int> power2;
+
+	int i = 1;
+
+	do {
+
+		power2. push_back(i);
+
+		i *= 2;
+	} while (i < n);
+
+	std::ifstream in ("prime", std::ios::in);
+
+	for ( i = 0; i < n; ++ i)
+
+		in >> M[i][i];
+
+	std::vector<int>::iterator p;
+
+	for ( i = 0; i < n; ++ i) {
+
+		for ( p = power2. begin(); (p != power2. end()) && (*p <= i); ++ p)
+			M[i][i - *p] = 1;
+
+		for ( p = power2. begin(); (p != power2. end()) && (*p < n - i); ++ p)
+			M[i][i + *p] = 1;
+	}
+
+}
+//// end tref ///////  begin krat /////////////////////////////
+
+struct pwrlist
+{
+	vector<integer> m;
+	pwrlist(integer q)
+	{ m.push_back(1); m.push_back(q); //cout << "pwrlist " << m[0] << " " << m[1] << endl;
+	}
+	integer operator[](int e)
+	{
+		for (int i = m.size(); i <= e; ++i) m.push_back(m[1]*m[i-1]);
+		return m[e];
+	}
+};
+
+// Read "1" or "q" or "q^e", for some (small) exponent e.
+// Return value of the power of q at q = _q.
+template <class num>
+num& qread(num& val, pwrlist& M, istream& in)
+{
+	char c;
+	in >> c; // next nonwhitespace
+	if (c == '0') return val = 0;
+	if (c == '1') return val = 1;
+	if (c != 'p' && c != 'q') { cout << "exiting due to unknown char " << c << endl; exit(-1);}
+	in.get(c);
+	if (c !='^') {in.putback(c); return val = M[1];}
+	else
+	{ int expt; in >> expt;
+		return val = M[expt];
+	};
+}
+
+template <class PIR>
+void KratMat(DenseMatrix<PIR>& M, PIR& R, int q, istream& in)
+{
+	pwrlist pwrs(q);
+	for (int i = 0; i < M.rowdim(); ++ i)
+
+		for ( int j = 0; j < M.coldim(); ++ j) {
+			int /*  e,*/ val;
+			qread(val, pwrs, in);
+			R. init (M[i][j], val);
+		}
+}
+
+///// end krat ////////////////////////////
+template<class I1, class Lp>
+void distinct (I1 a, I1 b, Lp& c)
+{ typename I1::value_type e;
+	size_t count = 0;
+	if (a != b) {e = *a; ++a; count = 1;}
+	else return;
+	while (a != b)
+	{  if (*a == e) ++count;
+		else
+		{ c.push_back(typename Lp::value_type(e, count));
+			e = *a; count = 1;
+		}
+		++a;
+	}
+	c.push_back(typename Lp::value_type(e, count));
+	return;
+}
+template <class I>
+void display(I b, I e)
+{ cout << "(";
+	for (I p = b; p != e; ++p) cout << p->first << " " << p->second << ", ";
+	cout << ")" << endl;
+}
+//@}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/charpoly.C b/examples/charpoly.C
index fd73e79..b99eb76 100644
--- a/examples/charpoly.C
+++ b/examples/charpoly.C
@@ -26,24 +26,26 @@
   \brief Characteristic polynomial of matrix over Z or Zp.
   \ingroup examples
   */
+#include <linbox/linbox-config.h>
+
 #include <iostream>
 #include <iomanip>
 
-#include "linbox/util/timer.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/unparametric.h"
-#include "linbox/blackbox/sparse.h"
+#include <linbox/util/timer.h>
+#include <linbox/ring/modular.h>
+#include <givaro/zring.h>
+#include <linbox/matrix/sparse-matrix.h>
 using namespace std;
 
-#include "linbox/solutions/charpoly.h"
-#include "linbox/ring/givaro-polynomial.h"
+#include <linbox/solutions/charpoly.h>
+#include <givaro/givpoly1.h>
 using namespace LinBox;
 
 template <class Field, class Polynomial>
 std::ostream& printPolynomial (std::ostream& out, const Field &F, const Polynomial &v)
 {
-	for (int i = v.size () - 1; i >= 0; i--) {
-		F.write (out, v[i]);
+	for (int i = (int)(v.size () - 1); i >= 0; i--) {
+		F.write (out, v[(size_t)i]);
 		if (i > 0)
 			out << " X^" << i << " + ";
 	}
@@ -62,9 +64,9 @@ std::ostream& prettyprintIntegerPolynomial (std::ostream& out, const Field &F, c
 			out << 'X';
 			if (n > 1) out << '^' << n;
 			for (int i = (int)n - 1; i > 0; i--) {
-				if (v[i] != 0) {
-					if (v[i] >0) out << " + ";
-					if (v[i] != 1) F.write (out, v[i]) << '*';
+				if (v[(size_t)i] != 0) {
+					if (v[(size_t)i] >0) out << " + ";
+					if (v[(size_t)i] != 1) F.write (out, v[(size_t)i]) << '*';
 					out << 'X';
 					if (i > 1) out << '^' << i;
 				}
@@ -83,13 +85,15 @@ std::ostream& printFactorization (std::ostream& out, const Field &F, const Facto
 	typename Factors::const_iterator itf = f.begin();
 	typename Exponents::const_iterator ite = exp.begin();
 	for ( ; itf != f.end(); ++itf, ++ite) {
-		prettyprintIntegerPolynomial(out << '(', F, *(*itf)) << ')';
+		prettyprintIntegerPolynomial(out << '(', F, *itf) << ')';
 		if (*ite > 1) out << '^' << *ite;
 		out << endl;
 	}
 	return out;
 }
 
+typedef Givaro::ZRing<Givaro::Integer> IntDom;
+
 int main (int argc, char **argv)
 {
 	commentator().setMaxDetailLevel (2);
@@ -108,69 +112,64 @@ int main (int argc, char **argv)
 
 	if (argc == 2) {
 
-		PID_integer ZZ;
-		BlasMatrix<PID_integer > A (ZZ);
+		IntDom ZZ;
+		DenseMatrix<IntDom > A (ZZ);
 		A.read (input);
-		typedef GivPolynomialRing<PID_integer, Givaro::Dense> IntPolRing;
-		IntPolRing::Element c_A;
+		typedef Givaro::Poly1FactorDom<IntDom> IntPolRing;
+		DenseVector<IntDom> c_A(ZZ);
 
 		Timer tim; tim.clear();tim.start();
 		charpoly (c_A, A, Method::Blackbox());
 		tim.stop();
 
 		cout << "Characteristic Polynomial is ";
-		//printPolynomial (cout, ZZ, c_A) << endl;
+		printPolynomial (cout, ZZ, c_A) << endl;
 		cout << tim << endl;
 
-#ifdef __LINBOX_HAVE_NTL
 		cout << "Do you want a factorization (y/n) ? ";
 		char tmp;
 		cin >> tmp;
 		if (tmp == 'y' || tmp == 'Y') {
 			commentator().start("Integer Polynomial factorization by NTL", "NTLfac");
-			vector<IntPolRing::Element*> intFactors;
-			vector<unsigned long> exp;
+			vector<IntPolRing::Element> intFactors;
+			vector<uint64_t> exp;
 			IntPolRing IPD(ZZ);
 			tim.start();
-			IPD.factor (intFactors, exp, c_A);
+			IPD.factor (intFactors, exp, IntPolRing::Element(c_A.getRep().begin(),c_A.getRep().end()));
 			tim.stop();
 			commentator().stop("done", NULL, "NTLfac");
 			printFactorization(cout << intFactors.size() << " integer polynomial factors:" << endl, ZZ, intFactors, exp) << endl;
-			vector<IntPolRing::Element*>::const_iterator itf = intFactors.begin();
-			for ( ; itf != intFactors.end(); ++itf)
-				delete *itf;
 
 			cout << tim << endl;
 
 		}
-#endif
 	}
 	if (argc == 3) {
 
-		typedef Modular<double> Field;
+		typedef Givaro::Modular<double> Field;
 		double q = atof(argv[2]);
 		Field F(q);
-		BlasMatrix<Field> B (F);
+		DenseMatrix<Field> B (F);
 		B.read (input);
 		cout << "B is " << B.rowdim() << " by " << B.coldim() << endl;
-		GivPolynomialRing<Field, Givaro::Dense>::Element c_B;
+// 		Givaro::Poly1Dom<Field, Givaro::Dense>::Element c_B;
+        DenseVector<Field> c_B(F);
 		Timer tim; tim.clear();tim.start();
 		charpoly (c_B, B);
 		tim.stop();
 
 		cout << "Characteristic Polynomial is ";
-		//printPolynomial (cout, F, c_B) << endl;
+		printPolynomial (cout, F, c_B) << endl;
 		cout << tim << endl;
 	}
 
 	return 0;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/checksolve.C b/examples/checksolve.C
index f414193..95ea611 100644
--- a/examples/checksolve.C
+++ b/examples/checksolve.C
@@ -25,13 +25,13 @@
   \brief Solving of sparse matrix over Z or Zp.
   \ingroup examples
   */
-//#include "linbox-config.h"
+#include <linbox/linbox-config.h>
 #include <iostream>
 
-#include "linbox/field/modular.h"
-#include "linbox/solutions/solve.h"
-#include "linbox/util/matrix-stream.h"
-#include "linbox/solutions/methods.h"
+#include <linbox/ring/modular.h>
+#include <linbox/solutions/solve.h>
+#include <linbox/util/matrix-stream.h>
+#include <linbox/solutions/methods.h>
 
 using namespace LinBox;
 // using namespace std;
@@ -58,16 +58,16 @@ int main (int argc, char **argv)
 	if (!input) { std::cerr << "Error opening vector file " << argv[2] << std::endl; return -1; }
 
 
-	typedef Modular<double> Field;
+	typedef Givaro::Modular<double> Field;
 	double q = atof(argv[3]);
 	Field F(q);
 	MatrixStream< Field > ms ( F, input );
-	BlasMatrix<Field> A (ms); // A.write(std::cout);
+	DenseMatrix<Field> A (ms); // A.write(std::cout);
 	std::cout << "A is " << A.rowdim() << " by " << A.coldim() << std::endl;
 
-	std::vector<Field::Element> X( A.coldim()),B(A.rowdim());
+	DenseVector<Field> X(F, A.coldim()),B(F, A.rowdim());
 
-	for(std::vector<Field::Element>::iterator it=B.begin();
+	for(DenseVector<Field>::iterator it=B.begin();
 	    it != B.end(); ++it)
 		invect >> *it;
 
@@ -76,9 +76,9 @@ int main (int argc, char **argv)
 	solve (X, A, B, Method::BlasElimination());
 
 	std::cout << "(BlasElimination) Solution is [ "<<X<< "]" << std::endl;
-	std::vector<Field::Element> r(A.rowdim());
+	DenseVector<Field> r(F, A.rowdim());
 	BlasMatrixDomain<Field> BMD(F);
-	BMD.mul(r, static_cast<BlasMatrix<Field>& >(A), X);
+	BMD.mul(r, static_cast<DenseMatrix<Field>& >(A), X);
 	//A.apply (r,X);
 	VectorDomain<Field> VD(F);
 	if (VD.areEqual (r,B))
diff --git a/examples/data/Makefile.am b/examples/data/Makefile.am
new file mode 100644
index 0000000..0bfbb0a
--- /dev/null
+++ b/examples/data/Makefile.am
@@ -0,0 +1,23 @@
+# Copyright (c) 2010 the LinBox group
+# This file is part of LinBox
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the  GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# ========LICENCE========
+#/
+
+EXTRA_DIST = \
+	test.matrix
diff --git a/examples/data/mat.txt b/examples/data/mat.txt
new file mode 100644
index 0000000..4b327b2
--- /dev/null
+++ b/examples/data/mat.txt
@@ -0,0 +1,8 @@
+4 4 M  
+1 1 1
+1 2 2
+1 3 8
+1 4 9
+2 2 3
+3 1 9
+0 0 0
diff --git a/examples/data/mat2.txt b/examples/data/mat2.txt
new file mode 100644
index 0000000..ecc2cc4
--- /dev/null
+++ b/examples/data/mat2.txt
@@ -0,0 +1,6 @@
+2 2 M
+1 1 1
+1 2 2
+2 1 3
+2 2 4
+0 0 0
diff --git a/examples/data/test.matrix b/examples/data/test.matrix
new file mode 100644
index 0000000..ee4f31a
--- /dev/null
+++ b/examples/data/test.matrix
@@ -0,0 +1,28 @@
+10 10 M
+1 2 7
+1 3 83
+1 7 38
+2 1 6
+2 4 16
+2 9 24
+3 5 56
+3 6 79
+3 7 61
+4 7 65
+4 8 9
+4 9 98
+5 1 27
+5 9 87
+6 4 57
+6 6 28
+6 8 35
+7 1 93
+7 4 43
+7 8 95
+8 2 94
+8 3 40
+9 2 66
+9 8 60
+9 9 21
+10 10 1
+0 0 0
diff --git a/examples/data/wikivote b/examples/data/wikivote
new file mode 100644
index 0000000..0cef96c
--- /dev/null
+++ b/examples/data/wikivote
@@ -0,0 +1,103691 @@
+8297 8297 M
+30	1412 1
+30	3352 1
+30	5254 1
+30	5543 1
+30	7478 1
+3	28 1
+3	30 1
+3	39 1
+3	54 1
+3	108 1
+3	152 1
+3	178 1
+3	182 1
+3	214 1
+3	271 1
+3	286 1
+3	300 1
+3	348 1
+3	349 1
+3	371 1
+3	567 1
+3	581 1
+3	584 1
+3	586 1
+3	590 1
+3	604 1
+3	611 1
+3	8283 1
+25	3 1
+25	6 1
+25	8 1
+25	19 1
+25	23 1
+25	28 1
+25	29 1
+25	30 1
+25	33 1
+25	35 1
+25	50 1
+25	54 1
+25	55 1
+25	75 1
+25	80 1
+25	86 1
+25	94 1
+25	127 1
+25	152 1
+25	154 1
+25	182 1
+25	192 1
+25	214 1
+25	224 1
+25	226 1
+25	246 1
+25	252 1
+25	255 1
+25	257 1
+25	261 1
+25	271 1
+25	273 1
+25	280 1
+25	282 1
+25	286 1
+25	299 1
+25	300 1
+25	302 1
+25	306 1
+25	308 1
+25	310 1
+25	322 1
+25	325 1
+25	339 1
+25	348 1
+25	349 1
+25	356 1
+25	358 1
+25	363 1
+25	370 1
+25	371 1
+25	373 1
+25	377 1
+25	379 1
+25	407 1
+25	415 1
+25	422 1
+25	428 1
+25	439 1
+25	488 1
+25	514 1
+25	545 1
+25	549 1
+25	560 1
+25	590 1
+25	592 1
+25	600 1
+25	604 1
+25	611 1
+25	645 1
+25	650 1
+25	659 1
+25	664 1
+25	667 1
+25	673 1
+25	675 1
+25	696 1
+25	706 1
+25	723 1
+25	739 1
+25	756 1
+25	857 1
+25	864 1
+25	893 1
+25	959 1
+25	994 1
+25	1131 1
+25	3755 1
+25	8282 1
+25	8284 1
+4	8 1
+4	10 1
+4	28 1
+4	30 1
+4	38 1
+4	55 1
+4	56 1
+4	75 1
+4	130 1
+4	140 1
+4	147 1
+4	151 1
+4	152 1
+4	214 1
+4	232 1
+4	243 1
+4	282 1
+4	299 1
+4	341 1
+4	363 1
+4	370 1
+4	415 1
+4	560 1
+4	606 1
+4	611 1
+4	645 1
+4	650 1
+4	659 1
+4	8282 1
+5	6 1
+5	8 1
+5	10 1
+5	23 1
+5	30 1
+5	33 1
+5	38 1
+5	50 1
+5	54 1
+5	55 1
+5	61 1
+5	75 1
+5	89 1
+5	93 1
+5	127 1
+5	130 1
+5	147 1
+5	153 1
+5	163 1
+5	167 1
+5	168 1
+5	175 1
+5	299 1
+6	3 1
+6	8 1
+6	10 1
+6	19 1
+6	23 1
+6	28 1
+6	29 1
+6	30 1
+6	33 1
+6	34 1
+6	35 1
+6	38 1
+6	39 1
+6	50 1
+6	54 1
+6	55 1
+6	56 1
+6	61 1
+6	80 1
+6	86 1
+6	89 1
+6	93 1
+6	94 1
+6	127 1
+6	130 1
+6	132 1
+6	135 1
+6	140 1
+6	147 1
+6	151 1
+6	153 1
+6	154 1
+6	163 1
+6	167 1
+6	168 1
+6	171 1
+6	175 1
+6	178 1
+6	182 1
+6	183 1
+6	216 1
+6	219 1
+6	226 1
+6	227 1
+6	228 1
+6	232 1
+6	236 1
+6	243 1
+6	250 1
+6	252 1
+6	257 1
+6	258 1
+6	259 1
+6	261 1
+6	271 1
+6	273 1
+6	274 1
+6	280 1
+6	285 1
+6	286 1
+6	290 1
+6	298 1
+6	299 1
+6	300 1
+6	301 1
+6	304 1
+6	306 1
+6	317 1
+6	319 1
+6	322 1
+6	325 1
+6	339 1
+6	348 1
+6	349 1
+6	356 1
+6	358 1
+6	359 1
+6	362 1
+6	363 1
+6	370 1
+6	371 1
+6	373 1
+6	377 1
+6	378 1
+6	379 1
+6	390 1
+6	391 1
+6	392 1
+6	394 1
+6	396 1
+6	402 1
+6	405 1
+6	406 1
+6	407 1
+6	415 1
+6	421 1
+6	422 1
+6	427 1
+6	428 1
+6	431 1
+6	432 1
+6	433 1
+6	435 1
+6	439 1
+6	440 1
+6	447 1
+6	538 1
+6	545 1
+6	549 1
+6	560 1
+6	564 1
+6	566 1
+6	567 1
+6	579 1
+6	581 1
+6	584 1
+6	586 1
+6	589 1
+6	590 1
+6	592 1
+6	600 1
+6	604 1
+6	609 1
+6	611 1
+6	613 1
+6	616 1
+6	617 1
+6	619 1
+6	643 1
+6	656 1
+6	659 1
+6	665 1
+6	668 1
+6	673 1
+6	691 1
+6	694 1
+6	700 1
+6	704 1
+6	717 1
+6	723 1
+6	730 1
+6	733 1
+6	739 1
+6	741 1
+6	761 1
+6	765 1
+6	779 1
+6	789 1
+6	791 1
+6	798 1
+6	802 1
+6	813 1
+6	820 1
+6	826 1
+6	857 1
+6	863 1
+6	871 1
+6	881 1
+6	885 1
+6	893 1
+6	895 1
+6	897 1
+6	904 1
+6	906 1
+6	907 1
+6	913 1
+6	922 1
+6	932 1
+6	936 1
+6	955 1
+6	960 1
+6	963 1
+6	966 1
+6	971 1
+6	972 1
+6	978 1
+6	979 1
+6	983 1
+6	991 1
+6	993 1
+6	995 1
+6	1007 1
+6	1014 1
+6	1022 1
+6	1026 1
+6	1032 1
+6	1035 1
+6	1043 1
+6	1055 1
+6	1062 1
+6	1125 1
+6	1144 1
+6	1152 1
+6	1156 1
+6	1160 1
+6	1167 1
+6	1168 1
+6	1218 1
+6	1220 1
+6	1221 1
+6	1222 1
+6	1234 1
+6	1241 1
+6	1248 1
+6	1253 1
+6	1261 1
+6	1297 1
+6	1321 1
+6	1326 1
+6	1377 1
+6	1389 1
+6	1390 1
+6	1394 1
+6	1396 1
+6	1428 1
+6	1439 1
+6	1441 1
+6	1442 1
+6	1446 1
+6	1453 1
+6	1464 1
+6	1465 1
+6	1468 1
+6	1471 1
+6	1472 1
+6	1476 1
+6	1478 1
+6	1484 1
+6	1485 1
+6	1487 1
+6	1489 1
+6	1490 1
+6	1497 1
+6	1501 1
+6	1506 1
+6	1507 1
+6	1513 1
+6	1514 1
+6	1518 1
+6	1524 1
+6	1525 1
+6	1531 1
+6	1532 1
+6	1533 1
+6	1538 1
+6	1549 1
+6	1555 1
+6	1556 1
+6	1557 1
+6	1563 1
+6	1569 1
+6	1573 1
+6	1587 1
+6	1597 1
+6	1610 1
+6	1619 1
+6	1641 1
+6	1648 1
+6	1652 1
+6	1654 1
+6	1657 1
+6	1662 1
+6	1669 1
+6	1679 1
+6	1689 1
+6	1692 1
+6	1701 1
+6	1716 1
+6	1718 1
+6	1752 1
+6	1758 1
+6	1768 1
+6	1774 1
+6	1783 1
+6	1787 1
+6	1788 1
+6	1798 1
+6	1861 1
+6	1864 1
+6	1982 1
+6	2409 1
+6	2651 1
+6	2843 1
+6	2909 1
+6	3755 1
+6	3892 1
+6	4037 1
+6	4134 1
+6	4792 1
+6	4942 1
+6	5323 1
+6	5697 1
+6	6227 1
+6	6330 1
+6	6624 1
+6	6765 1
+6	6790 1
+6	6965 1
+6	7161 1
+6	7632 1
+6	8282 1
+6	8290 1
+7	6 1
+7	28 1
+7	30 1
+7	32 1
+7	35 1
+7	38 1
+7	54 1
+7	55 1
+7	61 1
+7	75 1
+7	93 1
+7	105 1
+7	228 1
+7	259 1
+7	271 1
+7	299 1
+7	524 1
+7	1190 1
+7	1193 1
+7	1425 1
+7	1471 1
+7	1919 1
+7	8283 1
+7	8287 1
+8	6 1
+8	10 1
+8	19 1
+8	23 1
+8	28 1
+8	30 1
+8	33 1
+8	34 1
+8	36 1
+8	39 1
+8	49 1
+8	50 1
+8	54 1
+8	55 1
+8	56 1
+8	61 1
+8	75 1
+8	80 1
+8	86 1
+8	89 1
+8	127 1
+8	130 1
+8	132 1
+8	135 1
+8	140 1
+8	144 1
+8	150 1
+8	151 1
+8	152 1
+8	153 1
+8	154 1
+8	163 1
+8	167 1
+8	168 1
+8	175 1
+8	178 1
+8	182 1
+8	183 1
+8	192 1
+8	214 1
+8	216 1
+8	219 1
+8	224 1
+8	226 1
+8	232 1
+8	236 1
+8	243 1
+8	250 1
+8	252 1
+8	255 1
+8	258 1
+8	261 1
+8	271 1
+8	273 1
+8	274 1
+8	280 1
+8	282 1
+8	286 1
+8	299 1
+8	300 1
+8	301 1
+8	308 1
+8	310 1
+8	319 1
+8	322 1
+8	339 1
+8	341 1
+8	348 1
+8	349 1
+8	356 1
+8	358 1
+8	362 1
+8	363 1
+8	370 1
+8	371 1
+8	373 1
+8	377 1
+8	378 1
+8	379 1
+8	389 1
+8	390 1
+8	391 1
+8	392 1
+8	394 1
+8	396 1
+8	402 1
+8	405 1
+8	406 1
+8	415 1
+8	421 1
+8	422 1
+8	427 1
+8	428 1
+8	431 1
+8	432 1
+8	433 1
+8	435 1
+8	439 1
+8	440 1
+8	488 1
+8	506 1
+8	514 1
+8	524 1
+8	538 1
+8	549 1
+8	560 1
+8	564 1
+8	566 1
+8	567 1
+8	581 1
+8	584 1
+8	586 1
+8	587 1
+8	589 1
+8	590 1
+8	592 1
+8	600 1
+8	604 1
+8	606 1
+8	607 1
+8	609 1
+8	611 1
+8	613 1
+8	616 1
+8	617 1
+8	622 1
+8	624 1
+8	627 1
+8	628 1
+8	631 1
+8	636 1
+8	637 1
+8	645 1
+8	650 1
+8	656 1
+8	657 1
+8	658 1
+8	659 1
+8	664 1
+8	665 1
+8	667 1
+8	668 1
+8	673 1
+8	674 1
+8	675 1
+8	677 1
+8	681 1
+8	687 1
+8	706 1
+8	715 1
+8	719 1
+8	723 1
+8	725 1
+8	739 1
+8	741 1
+8	749 1
+8	756 1
+8	760 1
+8	761 1
+8	778 1
+8	779 1
+8	798 1
+8	802 1
+8	806 1
+8	810 1
+8	817 1
+8	822 1
+8	844 1
+8	857 1
+8	864 1
+8	866 1
+8	868 1
+8	875 1
+8	878 1
+8	881 1
+8	882 1
+8	885 1
+8	936 1
+8	938 1
+8	977 1
+8	1092 1
+8	8284 1
+9	8 1
+9	10 1
+9	23 1
+9	28 1
+9	30 1
+9	33 1
+9	34 1
+9	54 1
+9	55 1
+9	56 1
+9	61 1
+9	75 1
+9	80 1
+9	86 1
+9	94 1
+9	130 1
+9	135 1
+9	144 1
+9	151 1
+9	168 1
+9	214 1
+9	226 1
+9	228 1
+9	243 1
+9	250 1
+9	258 1
+9	261 1
+9	271 1
+9	274 1
+9	299 1
+9	325 1
+9	339 1
+9	348 1
+9	356 1
+9	363 1
+9	370 1
+9	377 1
+9	378 1
+9	379 1
+9	390 1
+9	391 1
+9	392 1
+9	394 1
+9	402 1
+9	421 1
+9	422 1
+9	427 1
+9	431 1
+9	439 1
+9	440 1
+9	506 1
+9	517 1
+9	559 1
+9	560 1
+9	579 1
+9	592 1
+9	611 1
+9	626 1
+9	658 1
+9	664 1
+9	715 1
+9	733 1
+9	756 1
+9	857 1
+9	868 1
+9	893 1
+9	904 1
+9	918 1
+9	932 1
+9	972 1
+9	982 1
+9	1049 1
+9	1103 1
+9	1384 1
+9	1525 1
+9	1580 1
+9	1618 1
+9	1652 1
+9	1717 1
+9	1855 1
+9	1966 1
+10	3 1
+10	6 1
+10	8 1
+10	19 1
+10	23 1
+10	28 1
+10	30 1
+10	33 1
+10	34 1
+10	38 1
+10	50 1
+10	54 1
+10	89 1
+10	93 1
+10	105 1
+10	130 1
+10	132 1
+10	135 1
+10	147 1
+10	153 1
+10	154 1
+10	163 1
+10	168 1
+10	175 1
+10	183 1
+10	214 1
+10	216 1
+10	219 1
+10	246 1
+10	250 1
+10	252 1
+10	255 1
+10	257 1
+10	261 1
+10	271 1
+10	274 1
+10	280 1
+10	286 1
+10	300 1
+10	301 1
+10	306 1
+10	310 1
+10	319 1
+10	405 1
+10	406 1
+10	407 1
+10	432 1
+10	549 1
+10	587 1
+10	600 1
+10	609 1
+10	617 1
+10	619 1
+10	622 1
+10	627 1
+10	628 1
+10	631 1
+10	636 1
+10	656 1
+10	657 1
+10	658 1
+10	659 1
+10	664 1
+10	665 1
+10	667 1
+10	668 1
+10	673 1
+10	675 1
+10	681 1
+10	700 1
+10	706 1
+10	715 1
+10	719 1
+10	725 1
+10	739 1
+10	741 1
+10	743 1
+10	746 1
+10	748 1
+10	750 1
+10	756 1
+10	760 1
+10	761 1
+10	765 1
+10	778 1
+10	779 1
+11	6 1
+11	8 1
+11	10 1
+11	15 1
+11	19 1
+11	23 1
+11	28 1
+11	29 1
+11	30 1
+11	33 1
+11	34 1
+11	35 1
+11	36 1
+11	38 1
+11	49 1
+11	50 1
+11	54 1
+11	55 1
+11	56 1
+11	61 1
+11	72 1
+11	75 1
+11	86 1
+11	89 1
+11	93 1
+11	95 1
+11	105 1
+11	127 1
+11	130 1
+11	132 1
+11	147 1
+11	151 1
+11	153 1
+11	154 1
+11	163 1
+11	168 1
+11	171 1
+11	178 1
+11	183 1
+11	192 1
+11	204 1
+11	214 1
+11	216 1
+11	219 1
+11	224 1
+11	227 1
+11	228 1
+11	230 1
+11	246 1
+11	250 1
+11	252 1
+11	255 1
+11	257 1
+11	259 1
+11	261 1
+11	271 1
+11	274 1
+11	282 1
+11	285 1
+11	286 1
+11	298 1
+11	299 1
+11	306 1
+11	308 1
+11	310 1
+11	313 1
+11	317 1
+11	319 1
+11	322 1
+11	325 1
+11	332 1
+11	334 1
+11	338 1
+11	350 1
+11	372 1
+11	406 1
+11	407 1
+11	415 1
+11	429 1
+11	431 1
+11	432 1
+11	439 1
+11	440 1
+11	465 1
+11	488 1
+11	506 1
+11	514 1
+11	545 1
+11	549 1
+11	559 1
+11	560 1
+11	575 1
+11	579 1
+11	587 1
+11	600 1
+11	607 1
+11	608 1
+11	609 1
+11	611 1
+11	613 1
+11	617 1
+11	622 1
+11	624 1
+11	627 1
+11	628 1
+11	631 1
+11	636 1
+11	637 1
+11	643 1
+11	644 1
+11	647 1
+11	658 1
+11	659 1
+11	664 1
+11	667 1
+11	668 1
+11	673 1
+11	674 1
+11	675 1
+11	677 1
+11	681 1
+11	684 1
+11	687 1
+11	694 1
+11	700 1
+11	705 1
+11	706 1
+11	707 1
+11	710 1
+11	715 1
+11	717 1
+11	719 1
+11	722 1
+11	723 1
+11	725 1
+11	730 1
+11	733 1
+11	739 1
+11	741 1
+11	743 1
+11	744 1
+11	746 1
+11	748 1
+11	749 1
+11	750 1
+11	756 1
+11	760 1
+11	761 1
+11	762 1
+11	763 1
+11	764 1
+11	765 1
+11	771 1
+11	779 1
+11	791 1
+11	793 1
+11	798 1
+11	802 1
+11	803 1
+11	805 1
+11	806 1
+11	810 1
+11	817 1
+11	822 1
+11	825 1
+11	826 1
+11	829 1
+11	836 1
+11	837 1
+11	838 1
+11	839 1
+11	844 1
+11	849 1
+11	853 1
+11	857 1
+11	859 1
+11	863 1
+11	864 1
+11	866 1
+11	868 1
+11	871 1
+11	873 1
+11	878 1
+11	881 1
+11	882 1
+11	885 1
+11	887 1
+11	893 1
+11	895 1
+11	904 1
+11	907 1
+11	908 1
+11	913 1
+11	918 1
+11	922 1
+11	929 1
+11	932 1
+11	934 1
+11	935 1
+11	936 1
+11	937 1
+11	941 1
+11	942 1
+11	943 1
+11	945 1
+11	946 1
+11	947 1
+11	955 1
+11	956 1
+11	958 1
+11	959 1
+11	960 1
+11	963 1
+11	968 1
+11	971 1
+11	975 1
+11	978 1
+11	982 1
+11	985 1
+11	989 1
+11	993 1
+11	994 1
+11	999 1
+11	1000 1
+11	1006 1
+11	1012 1
+11	1018 1
+11	1022 1
+11	1031 1
+11	1032 1
+11	1034 1
+11	1035 1
+11	1049 1
+11	1055 1
+11	1061 1
+11	1062 1
+11	1075 1
+11	1080 1
+11	1092 1
+11	1097 1
+11	1103 1
+11	1111 1
+11	1124 1
+11	1127 1
+11	1128 1
+11	1137 1
+11	1144 1
+11	1151 1
+11	1154 1
+11	1156 1
+11	1160 1
+11	1164 1
+11	1165 1
+11	1167 1
+11	1168 1
+11	1185 1
+11	1186 1
+11	1190 1
+11	1191 1
+11	1193 1
+11	1196 1
+11	1199 1
+11	1200 1
+11	1201 1
+11	1203 1
+11	1211 1
+11	1218 1
+11	1220 1
+11	1221 1
+11	1222 1
+11	1230 1
+11	1239 1
+11	1241 1
+11	1243 1
+11	1248 1
+11	1250 1
+11	1253 1
+11	1259 1
+11	1260 1
+11	1261 1
+11	1279 1
+11	1282 1
+11	1284 1
+11	1285 1
+11	1286 1
+11	1296 1
+11	1297 1
+11	1305 1
+11	1307 1
+11	1310 1
+11	1319 1
+11	1321 1
+11	1322 1
+11	1326 1
+11	1330 1
+11	1353 1
+11	1360 1
+11	1372 1
+11	1374 1
+11	1375 1
+11	1377 1
+11	1378 1
+11	1382 1
+11	1384 1
+11	1385 1
+11	1389 1
+11	1390 1
+11	1394 1
+11	1396 1
+11	1402 1
+11	1407 1
+11	1411 1
+11	1412 1
+11	1413 1
+11	1418 1
+11	1420 1
+11	1425 1
+11	1428 1
+11	1435 1
+11	1437 1
+11	1439 1
+11	1441 1
+11	1442 1
+11	1444 1
+11	1446 1
+11	1453 1
+11	1464 1
+11	1465 1
+11	1468 1
+11	1471 1
+11	1476 1
+11	1482 1
+11	1484 1
+11	1485 1
+11	1486 1
+11	1487 1
+11	1489 1
+11	1490 1
+11	1492 1
+11	1496 1
+11	1497 1
+11	1501 1
+11	1506 1
+11	1507 1
+11	1513 1
+11	1514 1
+11	1518 1
+11	1520 1
+11	1521 1
+11	1524 1
+11	1525 1
+11	1531 1
+11	1532 1
+11	1533 1
+11	1534 1
+11	1538 1
+11	1542 1
+11	1547 1
+11	1549 1
+11	1550 1
+11	1555 1
+11	1556 1
+11	1557 1
+11	1565 1
+11	1566 1
+11	1583 1
+11	1585 1
+11	1592 1
+11	1608 1
+11	1610 1
+11	1613 1
+11	1619 1
+11	1621 1
+11	1622 1
+11	1628 1
+11	1629 1
+11	1633 1
+11	1637 1
+11	1638 1
+11	1641 1
+11	1646 1
+11	1648 1
+11	1649 1
+11	1652 1
+11	1653 1
+11	1654 1
+11	1657 1
+11	1658 1
+11	1661 1
+11	1662 1
+11	1669 1
+11	1672 1
+11	1679 1
+11	1680 1
+11	1687 1
+11	1688 1
+11	1689 1
+11	1692 1
+11	1697 1
+11	1700 1
+11	1701 1
+11	1706 1
+11	1707 1
+11	1714 1
+11	1716 1
+11	1717 1
+11	1718 1
+11	1726 1
+11	1729 1
+11	1730 1
+11	1732 1
+11	1746 1
+11	1747 1
+11	1749 1
+11	1752 1
+11	1757 1
+11	1758 1
+11	1768 1
+11	1769 1
+11	1771 1
+11	1772 1
+11	1774 1
+11	1780 1
+11	1783 1
+11	1787 1
+11	1788 1
+11	1791 1
+11	1798 1
+11	1802 1
+11	1805 1
+11	1811 1
+11	1816 1
+11	1835 1
+11	1836 1
+11	1842 1
+11	1847 1
+11	1848 1
+11	1849 1
+11	1855 1
+11	1857 1
+11	1858 1
+11	1859 1
+11	1861 1
+11	1864 1
+11	1880 1
+11	1884 1
+11	1888 1
+11	1893 1
+11	1901 1
+11	1903 1
+11	1908 1
+11	1919 1
+11	1920 1
+11	1927 1
+11	1953 1
+11	1956 1
+11	1963 1
+11	1964 1
+11	1965 1
+11	1966 1
+11	1969 1
+11	1973 1
+11	1977 1
+11	1979 1
+11	1983 1
+11	1985 1
+11	1987 1
+11	1990 1
+11	1991 1
+11	1992 1
+11	1997 1
+11	2004 1
+11	2007 1
+11	2014 1
+11	2055 1
+11	2060 1
+11	2062 1
+11	2066 1
+11	2071 1
+11	2073 1
+11	2076 1
+11	2079 1
+11	2085 1
+11	2091 1
+11	2095 1
+11	2097 1
+11	2101 1
+11	2109 1
+11	2114 1
+11	2117 1
+11	2119 1
+11	2128 1
+11	2134 1
+11	2137 1
+11	2144 1
+11	2145 1
+11	2151 1
+11	2157 1
+11	2168 1
+11	2178 1
+11	2181 1
+11	2182 1
+11	2193 1
+11	2202 1
+11	2205 1
+11	2206 1
+11	2210 1
+11	2237 1
+11	2240 1
+11	2241 1
+11	2246 1
+11	2252 1
+11	2253 1
+11	2257 1
+11	2273 1
+11	2289 1
+11	2294 1
+11	2328 1
+11	2329 1
+11	2332 1
+11	2333 1
+11	2339 1
+11	2341 1
+11	2345 1
+11	2350 1
+11	2362 1
+11	2364 1
+11	2381 1
+11	2384 1
+11	2385 1
+11	2397 1
+11	2400 1
+11	2409 1
+11	2410 1
+11	2411 1
+11	2426 1
+11	2435 1
+11	2456 1
+11	2470 1
+11	2475 1
+11	2479 1
+11	2484 1
+11	2485 1
+11	2490 1
+11	2499 1
+11	2504 1
+11	2506 1
+11	2508 1
+11	2517 1
+11	2535 1
+11	2544 1
+11	2565 1
+11	2570 1
+11	2575 1
+11	2579 1
+11	2580 1
+11	2585 1
+11	2587 1
+11	2593 1
+11	2595 1
+11	2604 1
+11	2612 1
+11	2619 1
+11	2625 1
+11	2643 1
+11	2646 1
+11	2653 1
+11	2655 1
+11	2657 1
+11	2665 1
+11	2669 1
+11	2685 1
+11	2686 1
+11	2696 1
+11	2720 1
+11	2727 1
+11	2746 1
+11	2754 1
+11	2760 1
+11	2763 1
+11	2775 1
+11	2777 1
+11	2787 1
+11	2794 1
+11	2811 1
+11	2843 1
+11	2859 1
+11	2871 1
+11	2900 1
+11	2923 1
+11	2932 1
+11	2958 1
+11	2981 1
+11	3002 1
+11	3005 1
+11	3007 1
+11	3010 1
+11	3014 1
+11	3024 1
+11	3026 1
+11	3028 1
+11	3034 1
+11	3059 1
+11	3073 1
+11	3084 1
+11	3092 1
+11	3114 1
+11	3117 1
+11	3125 1
+11	3136 1
+11	3140 1
+11	3144 1
+11	3180 1
+11	3192 1
+11	3258 1
+11	3260 1
+11	3284 1
+11	3291 1
+11	3309 1
+11	3321 1
+11	3334 1
+11	3352 1
+11	3394 1
+11	3404 1
+11	3433 1
+11	3439 1
+11	3443 1
+11	3447 1
+11	3452 1
+11	3453 1
+11	3454 1
+11	3458 1
+11	3463 1
+11	3464 1
+11	3480 1
+11	3529 1
+11	3537 1
+11	3557 1
+11	3562 1
+11	3568 1
+11	3607 1
+11	3615 1
+11	3631 1
+11	3635 1
+11	3645 1
+11	3650 1
+11	3660 1
+11	3661 1
+11	3680 1
+11	3748 1
+11	3755 1
+11	3787 1
+11	3800 1
+11	3806 1
+11	3807 1
+11	3812 1
+11	3830 1
+11	3843 1
+11	3847 1
+11	3871 1
+11	3892 1
+11	3903 1
+11	3926 1
+11	3937 1
+11	3956 1
+11	3958 1
+11	3967 1
+11	3970 1
+11	4011 1
+11	4013 1
+11	4021 1
+11	4024 1
+11	4040 1
+11	4043 1
+11	4044 1
+11	4055 1
+11	4058 1
+11	4065 1
+11	4072 1
+11	4088 1
+11	4103 1
+11	4124 1
+11	4162 1
+11	4179 1
+11	4201 1
+11	4212 1
+11	4231 1
+11	4247 1
+11	4256 1
+11	4261 1
+11	4263 1
+11	4266 1
+11	4269 1
+11	4289 1
+11	4290 1
+11	4297 1
+11	4299 1
+11	4335 1
+11	4384 1
+11	4417 1
+11	4422 1
+11	4424 1
+11	4463 1
+11	4485 1
+11	4510 1
+11	4528 1
+11	4531 1
+11	4547 1
+11	4578 1
+11	4613 1
+11	4661 1
+11	4662 1
+11	4706 1
+11	4709 1
+11	4719 1
+11	4796 1
+11	4808 1
+11	4811 1
+11	4814 1
+11	4820 1
+11	4827 1
+11	4938 1
+11	4962 1
+11	5026 1
+11	5037 1
+11	5055 1
+11	5073 1
+11	5092 1
+11	5100 1
+11	5106 1
+11	5130 1
+11	5132 1
+11	5144 1
+11	5802 1
+11	6170 1
+11	6496 1
+11	6715 1
+11	6739 1
+11	8286 1
+11	8287 1
+11	8290 1
+11	8291 1
+11	8293 1
+12	8 1
+12	28 1
+12	30 1
+12	56 1
+12	72 1
+12	80 1
+12	214 1
+12	219 1
+12	232 1
+12	236 1
+12	250 1
+12	255 1
+12	257 1
+12	259 1
+12	274 1
+12	282 1
+12	286 1
+12	290 1
+12	299 1
+12	349 1
+12	356 1
+12	362 1
+12	390 1
+12	407 1
+12	427 1
+12	428 1
+12	432 1
+12	435 1
+12	538 1
+12	564 1
+12	609 1
+12	631 1
+12	644 1
+12	663 1
+12	668 1
+12	675 1
+12	677 1
+12	697 1
+12	706 1
+12	725 1
+12	748 1
+12	756 1
+12	765 1
+12	793 1
+12	805 1
+12	810 1
+12	822 1
+12	838 1
+12	857 1
+12	937 1
+12	1014 1
+12	1160 1
+12	1241 1
+12	1297 1
+12	1464 1
+12	1573 1
+12	1629 1
+12	1638 1
+12	2252 1
+12	2708 1
+12	3371 1
+12	3843 1
+12	4233 1
+12	8287 1
+12	8291 1
+13	28 1
+13	30 1
+13	178 1
+13	214 1
+13	216 1
+13	232 1
+13	250 1
+13	252 1
+13	271 1
+13	302 1
+13	341 1
+14	3 1
+14	10 1
+14	23 1
+14	28 1
+14	30 1
+14	32 1
+14	49 1
+14	54 1
+14	55 1
+14	56 1
+14	61 1
+14	75 1
+14	95 1
+14	127 1
+14	130 1
+14	140 1
+14	150 1
+14	152 1
+14	178 1
+14	182 1
+14	183 1
+14	192 1
+14	214 1
+14	216 1
+14	219 1
+14	224 1
+14	226 1
+14	236 1
+14	250 1
+14	259 1
+14	261 1
+14	271 1
+14	282 1
+14	299 1
+14	324 1
+14	325 1
+14	338 1
+14	356 1
+14	363 1
+14	368 1
+14	371 1
+14	377 1
+14	378 1
+14	390 1
+14	391 1
+14	394 1
+14	396 1
+14	402 1
+14	421 1
+14	422 1
+14	427 1
+14	440 1
+14	477 1
+14	517 1
+14	524 1
+14	538 1
+14	560 1
+14	564 1
+14	566 1
+14	567 1
+14	581 1
+14	584 1
+14	589 1
+14	609 1
+14	611 1
+14	613 1
+14	616 1
+14	617 1
+14	619 1
+14	626 1
+14	631 1
+14	650 1
+14	656 1
+14	665 1
+14	797 1
+14	968 1
+14	1031 1
+14	1053 1
+14	1080 1
+14	1123 1
+14	1164 1
+14	1259 1
+14	1307 1
+14	1385 1
+14	1496 1
+14	1717 1
+14	1835 1
+14	1842 1
+14	1855 1
+14	1864 1
+14	1927 1
+14	1966 1
+14	2016 1
+14	2066 1
+14	2117 1
+14	2134 1
+14	2193 1
+14	2339 1
+14	2384 1
+14	2470 1
+14	2475 1
+14	2479 1
+14	2565 1
+14	2587 1
+14	2595 1
+14	2643 1
+14	2653 1
+14	3192 1
+14	3562 1
+14	4055 1
+14	4179 1
+14	4247 1
+14	8285 1
+14	8287 1
+15	8 1
+15	23 1
+15	28 1
+15	30 1
+15	32 1
+15	33 1
+15	38 1
+15	49 1
+15	54 1
+15	55 1
+15	56 1
+15	61 1
+15	95 1
+15	105 1
+15	152 1
+15	214 1
+15	299 1
+15	368 1
+15	417 1
+15	477 1
+15	560 1
+15	589 1
+15	600 1
+15	667 1
+15	737 1
+15	756 1
+15	762 1
+15	893 1
+15	974 1
+15	1006 1
+15	1297 1
+15	1717 1
+15	2066 1
+15	2144 1
+15	2229 1
+15	2398 1
+15	2643 1
+15	2651 1
+15	3005 1
+15	3334 1
+15	3755 1
+15	4037 1
+15	4561 1
+15	4600 1
+15	4645 1
+15	4658 1
+15	7632 1
+15	7871 1
+15	8287 1
+15	8292 1
+16	28 1
+16	30 1
+16	637 1
+16	749 1
+16	789 1
+16	817 1
+16	857 1
+16	887 1
+16	982 1
+16	993 1
+16	1186 1
+16	1374 1
+16	1412 1
+16	1580 1
+16	1672 1
+17	3 1
+17	8 1
+17	10 1
+17	28 1
+17	30 1
+17	32 1
+17	33 1
+17	35 1
+17	50 1
+17	54 1
+17	55 1
+17	95 1
+17	108 1
+17	127 1
+17	135 1
+17	183 1
+17	214 1
+17	258 1
+17	261 1
+17	271 1
+17	273 1
+17	282 1
+17	299 1
+17	339 1
+17	356 1
+17	359 1
+17	377 1
+17	378 1
+17	391 1
+17	524 1
+17	590 1
+17	592 1
+17	624 1
+17	656 1
+17	658 1
+17	667 1
+17	675 1
+17	739 1
+17	750 1
+17	756 1
+17	941 1
+17	982 1
+17	1190 1
+17	1218 1
+17	1513 1
+18	30 1
+18	36 1
+18	55 1
+18	144 1
+18	192 1
+18	214 1
+18	308 1
+18	429 1
+18	477 1
+18	549 1
+18	643 1
+18	2570 1
+19	3 1
+19	6 1
+19	23 1
+19	28 1
+19	30 1
+19	33 1
+19	38 1
+19	50 1
+19	54 1
+19	55 1
+19	61 1
+19	89 1
+19	127 1
+19	130 1
+19	132 1
+19	151 1
+19	154 1
+19	163 1
+19	168 1
+19	182 1
+19	183 1
+19	214 1
+19	216 1
+19	219 1
+19	250 1
+19	252 1
+19	257 1
+19	261 1
+19	271 1
+19	274 1
+19	286 1
+19	299 1
+19	371 1
+19	564 1
+19	581 1
+19	584 1
+19	589 1
+19	590 1
+19	592 1
+20	3 1
+20	6 1
+20	19 1
+20	30 1
+20	33 1
+20	34 1
+20	36 1
+20	50 1
+20	54 1
+20	55 1
+20	56 1
+20	61 1
+20	75 1
+20	80 1
+20	89 1
+20	105 1
+20	132 1
+20	135 1
+20	140 1
+20	151 1
+20	153 1
+20	167 1
+20	168 1
+20	182 1
+20	183 1
+20	214 1
+20	216 1
+20	224 1
+20	232 1
+20	243 1
+20	250 1
+20	252 1
+20	255 1
+20	257 1
+20	258 1
+20	261 1
+20	271 1
+20	274 1
+20	282 1
+20	286 1
+20	299 1
+20	306 1
+20	308 1
+20	310 1
+20	321 1
+20	322 1
+20	325 1
+20	339 1
+20	348 1
+20	350 1
+20	363 1
+20	368 1
+20	370 1
+20	371 1
+20	377 1
+20	378 1
+20	379 1
+20	391 1
+20	402 1
+20	405 1
+20	425 1
+20	427 1
+20	429 1
+20	447 1
+20	465 1
+20	477 1
+20	564 1
+20	567 1
+20	590 1
+20	592 1
+20	600 1
+20	606 1
+20	609 1
+20	611 1
+20	624 1
+20	626 1
+20	631 1
+20	636 1
+20	650 1
+20	656 1
+20	657 1
+20	658 1
+20	667 1
+20	673 1
+20	675 1
+20	677 1
+20	681 1
+20	697 1
+20	700 1
+20	704 1
+20	706 1
+20	707 1
+20	722 1
+20	723 1
+20	746 1
+20	749 1
+20	756 1
+20	765 1
+20	803 1
+20	829 1
+20	838 1
+20	853 1
+20	861 1
+20	864 1
+20	896 1
+20	918 1
+20	941 1
+20	943 1
+20	979 1
+20	981 1
+20	982 1
+20	993 1
+20	994 1
+20	1034 1
+20	1044 1
+20	1055 1
+20	1062 1
+20	1075 1
+20	1156 1
+20	1164 1
+20	1167 1
+20	1190 1
+20	1211 1
+20	1218 1
+20	1307 1
+20	1321 1
+20	1352 1
+20	1374 1
+20	1389 1
+20	1396 1
+20	1402 1
+20	1501 1
+20	1513 1
+20	1569 1
+20	1585 1
+20	1597 1
+20	1604 1
+20	1680 1
+20	1692 1
+20	1730 1
+20	1758 1
+20	1774 1
+20	1783 1
+20	1787 1
+20	1855 1
+20	1859 1
+20	1919 1
+20	1965 1
+20	1966 1
+20	2134 1
+20	2165 1
+20	2281 1
+20	2285 1
+20	2324 1
+20	2339 1
+20	2348 1
+20	2411 1
+20	2484 1
+20	2517 1
+20	2565 1
+20	2693 1
+20	2774 1
+20	2775 1
+20	2777 1
+20	2828 1
+20	2877 1
+20	2900 1
+20	3027 1
+20	3136 1
+20	3371 1
+20	3456 1
+20	3516 1
+20	3614 1
+20	3755 1
+20	4179 1
+20	4373 1
+20	5327 1
+20	5714 1
+20	5775 1
+20	5780 1
+20	5814 1
+20	5818 1
+20	6229 1
+20	6262 1
+20	6780 1
+20	7726 1
+20	8288 1
+21	28 1
+21	30 1
+21	35 1
+21	54 1
+21	61 1
+21	75 1
+21	86 1
+21	89 1
+21	105 1
+21	135 1
+21	140 1
+21	144 1
+21	150 1
+21	168 1
+21	183 1
+21	219 1
+21	236 1
+21	243 1
+21	250 1
+21	252 1
+21	271 1
+21	299 1
+21	308 1
+21	334 1
+21	356 1
+21	370 1
+21	422 1
+21	429 1
+21	433 1
+21	439 1
+21	447 1
+21	465 1
+21	488 1
+21	549 1
+21	590 1
+21	592 1
+21	611 1
+21	613 1
+21	637 1
+21	656 1
+21	657 1
+21	664 1
+21	667 1
+21	723 1
+21	725 1
+21	760 1
+21	765 1
+21	789 1
+21	794 1
+21	802 1
+21	837 1
+21	853 1
+21	868 1
+21	871 1
+21	887 1
+21	893 1
+21	908 1
+21	932 1
+21	960 1
+21	963 1
+21	1014 1
+21	1049 1
+21	1190 1
+21	1297 1
+21	1476 1
+21	1707 1
+21	1717 1
+21	1726 1
+21	2085 1
+21	2117 1
+21	2181 1
+21	2202 1
+21	2410 1
+21	2685 1
+21	2727 1
+21	2814 1
+22	30 1
+22	1407 1
+23	29 1
+23	30 1
+23	33 1
+23	38 1
+23	39 1
+23	50 1
+23	55 1
+23	80 1
+23	94 1
+23	127 1
+23	135 1
+23	144 1
+23	151 1
+23	163 1
+23	168 1
+23	175 1
+23	183 1
+23	214 1
+23	236 1
+23	252 1
+23	257 1
+23	271 1
+23	280 1
+23	282 1
+23	299 1
+23	300 1
+23	302 1
+23	304 1
+23	308 1
+23	313 1
+23	325 1
+23	406 1
+23	549 1
+23	586 1
+23	587 1
+23	590 1
+23	601 1
+23	616 1
+23	617 1
+23	656 1
+23	664 1
+23	667 1
+23	670 1
+23	673 1
+23	674 1
+23	700 1
+23	706 1
+23	715 1
+23	725 1
+23	760 1
+23	765 1
+23	794 1
+23	810 1
+23	857 1
+23	881 1
+23	897 1
+23	904 1
+23	906 1
+23	942 1
+23	945 1
+23	972 1
+23	981 1
+23	989 1
+23	1014 1
+23	1029 1
+23	1039 1
+23	1053 1
+23	1061 1
+23	1123 1
+23	1478 1
+23	1538 1
+23	1593 1
+23	1638 1
+23	8288 1
+24	3 1
+24	8 1
+24	15 1
+24	19 1
+24	28 1
+24	30 1
+24	33 1
+24	34 1
+24	35 1
+24	36 1
+24	50 1
+24	54 1
+24	72 1
+24	130 1
+24	132 1
+24	150 1
+24	214 1
+24	228 1
+24	230 1
+24	243 1
+24	255 1
+24	259 1
+24	271 1
+24	280 1
+24	299 1
+24	310 1
+24	311 1
+24	321 1
+24	334 1
+24	348 1
+24	370 1
+24	373 1
+24	378 1
+24	391 1
+24	407 1
+24	415 1
+24	417 1
+24	465 1
+24	545 1
+24	549 1
+24	560 1
+24	579 1
+24	589 1
+24	600 1
+24	626 1
+24	633 1
+24	636 1
+24	643 1
+24	644 1
+24	647 1
+24	663 1
+24	667 1
+24	681 1
+24	696 1
+24	697 1
+24	706 1
+24	707 1
+24	710 1
+24	719 1
+24	722 1
+24	739 1
+24	742 1
+24	750 1
+24	756 1
+24	760 1
+24	762 1
+24	763 1
+24	769 1
+24	803 1
+24	813 1
+24	817 1
+24	829 1
+24	849 1
+24	853 1
+24	856 1
+24	857 1
+24	863 1
+24	887 1
+24	893 1
+24	895 1
+24	908 1
+24	932 1
+24	935 1
+24	945 1
+24	946 1
+24	960 1
+24	993 1
+24	994 1
+24	999 1
+24	1018 1
+24	1034 1
+24	1043 1
+24	1053 1
+24	1075 1
+24	1080 1
+24	1100 1
+24	1111 1
+24	1123 1
+24	1125 1
+24	1156 1
+24	1164 1
+24	1165 1
+24	1186 1
+24	1193 1
+24	1200 1
+24	1234 1
+24	1250 1
+24	1267 1
+24	1284 1
+24	1285 1
+24	1297 1
+24	1310 1
+24	1315 1
+24	1330 1
+24	1353 1
+24	1357 1
+24	1360 1
+24	1416 1
+24	1419 1
+24	1439 1
+24	1442 1
+24	1473 1
+24	1482 1
+24	1497 1
+24	1501 1
+24	1538 1
+24	1542 1
+24	1547 1
+24	1548 1
+24	1549 1
+24	1566 1
+24	1585 1
+24	1608 1
+24	1622 1
+24	1633 1
+24	1641 1
+24	1646 1
+24	1658 1
+24	1669 1
+24	1697 1
+24	1705 1
+24	1717 1
+24	1723 1
+24	1729 1
+24	1734 1
+24	1754 1
+24	1769 1
+24	1772 1
+24	1781 1
+24	1808 1
+24	1814 1
+24	1816 1
+24	1835 1
+24	1836 1
+24	1837 1
+24	1842 1
+24	1855 1
+24	1858 1
+24	1880 1
+24	1893 1
+24	1901 1
+24	1903 1
+24	1927 1
+24	1953 1
+24	1956 1
+24	1963 1
+24	1966 1
+24	1969 1
+24	1977 1
+24	1987 1
+24	2004 1
+24	2055 1
+24	2060 1
+24	2062 1
+24	2066 1
+24	2117 1
+24	2119 1
+24	2137 1
+24	2144 1
+24	2193 1
+24	2209 1
+24	2225 1
+24	2237 1
+24	2264 1
+24	2276 1
+24	2323 1
+24	2328 1
+24	2329 1
+24	2341 1
+24	2345 1
+24	2354 1
+24	2371 1
+24	2375 1
+24	2385 1
+24	2398 1
+24	2504 1
+24	2508 1
+24	2516 1
+24	2542 1
+24	2560 1
+24	2579 1
+24	2585 1
+24	2587 1
+24	2595 1
+24	2612 1
+24	2619 1
+24	2625 1
+24	2660 1
+24	2667 1
+24	2696 1
+24	2697 1
+24	2707 1
+24	2746 1
+24	2754 1
+24	2760 1
+24	2763 1
+24	2815 1
+24	2819 1
+24	2822 1
+24	2830 1
+24	2871 1
+24	2922 1
+24	2926 1
+24	2955 1
+24	2963 1
+24	2999 1
+24	3018 1
+24	3028 1
+24	3089 1
+24	3136 1
+24	3164 1
+24	3192 1
+24	3351 1
+24	3352 1
+24	3408 1
+24	3410 1
+24	3439 1
+24	3443 1
+24	3447 1
+24	3452 1
+24	3456 1
+24	3458 1
+24	3473 1
+24	3537 1
+24	3568 1
+24	3586 1
+24	3607 1
+24	3643 1
+24	3660 1
+24	3661 1
+24	3748 1
+24	3792 1
+24	3800 1
+24	3843 1
+24	3854 1
+24	3898 1
+24	3903 1
+24	3910 1
+24	4040 1
+24	4261 1
+24	4276 1
+24	4299 1
+24	4310 1
+24	4338 1
+24	4349 1
+24	4373 1
+24	4463 1
+24	4485 1
+24	4510 1
+24	4706 1
+24	4709 1
+24	4712 1
+24	4792 1
+24	4796 1
+24	4811 1
+24	4827 1
+24	4944 1
+24	4953 1
+24	4999 1
+24	5026 1
+24	5037 1
+24	5055 1
+24	5123 1
+24	5162 1
+24	5254 1
+24	5327 1
+24	5341 1
+24	5412 1
+24	5423 1
+24	5484 1
+24	5511 1
+24	5596 1
+24	5714 1
+24	5818 1
+24	5863 1
+24	6097 1
+24	6229 1
+24	6272 1
+24	6441 1
+24	6496 1
+24	6566 1
+24	6833 1
+24	6855 1
+24	6869 1
+24	6948 1
+24	6955 1
+24	7119 1
+24	7143 1
+24	7144 1
+54	3 1
+54	28 1
+54	214 1
+54	299 1
+54	356 1
+54	373 1
+54	394 1
+28	3 1
+28	6 1
+28	8 1
+28	19 1
+28	29 1
+28	33 1
+28	34 1
+28	35 1
+28	38 1
+28	49 1
+28	50 1
+28	54 1
+28	55 1
+28	56 1
+28	61 1
+28	75 1
+28	80 1
+28	86 1
+28	94 1
+28	127 1
+28	130 1
+28	132 1
+28	135 1
+28	144 1
+28	147 1
+28	150 1
+28	151 1
+28	152 1
+28	154 1
+28	163 1
+28	178 1
+28	182 1
+28	192 1
+28	214 1
+28	216 1
+28	224 1
+28	226 1
+28	228 1
+28	232 1
+28	236 1
+28	246 1
+28	250 1
+28	252 1
+28	259 1
+28	261 1
+28	271 1
+28	273 1
+28	280 1
+28	282 1
+28	299 1
+28	301 1
+28	302 1
+28	304 1
+28	310 1
+28	313 1
+28	319 1
+28	322 1
+28	325 1
+28	356 1
+28	370 1
+28	391 1
+28	396 1
+28	402 1
+28	405 1
+28	406 1
+28	415 1
+28	428 1
+28	435 1
+28	439 1
+28	488 1
+28	514 1
+28	584 1
+28	587 1
+28	590 1
+28	600 1
+28	613 1
+28	616 1
+28	627 1
+28	631 1
+28	636 1
+28	645 1
+28	656 1
+28	658 1
+28	659 1
+28	667 1
+28	670 1
+28	673 1
+28	675 1
+28	677 1
+28	681 1
+28	687 1
+28	715 1
+28	723 1
+28	725 1
+28	730 1
+28	739 1
+28	741 1
+28	743 1
+28	746 1
+28	748 1
+28	750 1
+28	756 1
+28	789 1
+28	798 1
+28	857 1
+28	859 1
+28	864 1
+28	895 1
+28	934 1
+28	958 1
+28	979 1
+28	991 1
+28	1014 1
+28	1026 1
+28	1030 1
+28	1077 1
+28	1160 1
+28	1186 1
+28	1190 1
+28	1201 1
+28	1286 1
+28	1428 1
+28	1604 1
+28	1608 1
+28	1638 1
+28	1964 1
+28	2470 1
+28	2479 1
+28	2801 1
+28	6251 1
+28	8282 1
+28	8284 1
+28	8285 1
+33	8 1
+33	28 1
+33	38 1
+33	50 1
+33	54 1
+33	56 1
+33	127 1
+33	140 1
+33	144 1
+33	147 1
+33	167 1
+33	178 1
+33	183 1
+33	214 1
+33	396 1
+33	402 1
+33	440 1
+33	538 1
+33	545 1
+33	1144 1
+33	1241 1
+33	1717 1
+33	2119 1
+33	2165 1
+34	3 1
+34	6 1
+34	39 1
+34	54 1
+34	282 1
+36	15 1
+36	28 1
+36	35 1
+36	38 1
+36	50 1
+36	54 1
+36	55 1
+36	80 1
+36	86 1
+36	89 1
+36	152 1
+36	204 1
+36	226 1
+36	228 1
+36	232 1
+36	255 1
+36	271 1
+36	274 1
+36	282 1
+36	299 1
+36	304 1
+36	308 1
+36	310 1
+36	313 1
+36	322 1
+36	325 1
+36	332 1
+36	334 1
+36	348 1
+36	356 1
+36	370 1
+36	373 1
+36	377 1
+36	391 1
+36	394 1
+36	396 1
+36	402 1
+36	417 1
+36	427 1
+36	431 1
+36	439 1
+36	465 1
+36	549 1
+36	560 1
+36	579 1
+36	600 1
+36	626 1
+36	636 1
+36	637 1
+36	643 1
+36	644 1
+36	656 1
+36	663 1
+36	665 1
+36	667 1
+36	681 1
+36	697 1
+36	704 1
+36	707 1
+36	710 1
+36	719 1
+36	722 1
+36	730 1
+36	733 1
+36	737 1
+36	762 1
+36	813 1
+36	817 1
+36	838 1
+36	844 1
+36	849 1
+36	857 1
+36	859 1
+36	861 1
+36	895 1
+36	908 1
+36	922 1
+36	941 1
+36	945 1
+36	958 1
+36	959 1
+36	972 1
+36	975 1
+36	981 1
+36	982 1
+36	993 1
+36	999 1
+36	1023 1
+36	1026 1
+36	1038 1
+36	1075 1
+36	1111 1
+36	1123 1
+36	1125 1
+36	1127 1
+36	1131 1
+36	1166 1
+36	1186 1
+36	1190 1
+36	1193 1
+36	1196 1
+36	1222 1
+36	1234 1
+36	1296 1
+36	1297 1
+36	1307 1
+36	1310 1
+36	1353 1
+36	1357 1
+36	1372 1
+36	1377 1
+36	1378 1
+36	1402 1
+36	1413 1
+36	1416 1
+36	1468 1
+36	1489 1
+36	1506 1
+36	1513 1
+36	1518 1
+36	1524 1
+36	1538 1
+36	1549 1
+36	1555 1
+36	1566 1
+36	1585 1
+36	1608 1
+36	1621 1
+36	1701 1
+36	1707 1
+36	1726 1
+36	1769 1
+36	1783 1
+36	1816 1
+36	1842 1
+36	1848 1
+36	1855 1
+36	1956 1
+36	1964 1
+36	1969 1
+36	1997 1
+36	2066 1
+36	2071 1
+36	2109 1
+36	2117 1
+36	2120 1
+36	2135 1
+36	2145 1
+36	2237 1
+36	2241 1
+36	2297 1
+36	2328 1
+36	2329 1
+36	2381 1
+36	2456 1
+36	2470 1
+36	2485 1
+36	2506 1
+36	2570 1
+36	2579 1
+36	2594 1
+36	2599 1
+36	2619 1
+36	2620 1
+36	2625 1
+36	2651 1
+36	2655 1
+36	2685 1
+36	2689 1
+36	2775 1
+36	2831 1
+36	2834 1
+36	2871 1
+36	3034 1
+36	3089 1
+36	3136 1
+36	3150 1
+36	3192 1
+36	3258 1
+36	3274 1
+36	3334 1
+36	3352 1
+36	3394 1
+36	3443 1
+36	3454 1
+36	3456 1
+36	3480 1
+36	3489 1
+36	3537 1
+36	3562 1
+36	3586 1
+36	3680 1
+36	4065 1
+36	4099 1
+36	4201 1
+36	4303 1
+36	4483 1
+36	4574 1
+36	4578 1
+36	4712 1
+36	4717 1
+36	4781 1
+36	4929 1
+36	5022 1
+36	5144 1
+36	5412 1
+36	5459 1
+36	5529 1
+36	5605 1
+36	5697 1
+36	5714 1
+36	5799 1
+36	5804 1
+36	5822 1
+36	5897 1
+36	6006 1
+36	6044 1
+36	6151 1
+36	6437 1
+36	6496 1
+36	6955 1
+36	7115 1
+36	7289 1
+36	7632 1
+36	7908 1
+36	8174 1
+36	8282 1
+35	3 1
+35	33 1
+35	39 1
+35	50 1
+35	54 1
+35	132 1
+35	135 1
+35	151 1
+35	152 1
+35	153 1
+35	183 1
+35	214 1
+35	226 1
+35	227 1
+35	243 1
+35	257 1
+35	259 1
+35	261 1
+35	271 1
+35	274 1
+35	299 1
+35	300 1
+35	339 1
+35	348 1
+35	356 1
+35	362 1
+35	370 1
+35	373 1
+35	377 1
+35	378 1
+35	379 1
+35	390 1
+35	391 1
+35	394 1
+35	402 1
+35	415 1
+35	422 1
+35	545 1
+35	644 1
+35	647 1
+35	803 1
+35	853 1
+35	907 1
+35	960 1
+35	963 1
+35	971 1
+35	978 1
+35	1023 1
+35	1026 1
+35	1075 1
+35	1127 1
+35	1193 1
+35	1203 1
+35	1297 1
+35	1330 1
+35	1377 1
+35	1389 1
+35	1413 1
+35	1418 1
+35	1439 1
+35	1446 1
+35	1465 1
+35	1468 1
+35	1476 1
+35	1484 1
+37	50 1
+37	54 1
+37	168 1
+37	216 1
+37	252 1
+37	299 1
+37	325 1
+37	370 1
+37	608 1
+37	609 1
+37	656 1
+37	762 1
+37	881 1
+37	2775 1
+37	3456 1
+37	3976 1
+37	4310 1
+37	4735 1
+37	5412 1
+37	5780 1
+38	54 1
+38	55 1
+38	56 1
+38	75 1
+38	152 1
+38	182 1
+38	280 1
+38	302 1
+38	415 1
+38	589 1
+38	609 1
+38	922 1
+38	1836 1
+38	2385 1
+39	6 1
+39	8 1
+39	23 1
+39	28 1
+39	29 1
+39	33 1
+39	35 1
+39	50 1
+39	54 1
+39	80 1
+39	127 1
+39	135 1
+39	147 1
+39	152 1
+39	163 1
+39	168 1
+39	182 1
+39	216 1
+39	252 1
+39	271 1
+39	282 1
+39	299 1
+39	319 1
+39	325 1
+39	341 1
+39	407 1
+39	415 1
+39	549 1
+39	611 1
+39	613 1
+39	628 1
+39	631 1
+39	659 1
+39	706 1
+39	756 1
+39	779 1
+39	793 1
+39	822 1
+39	878 1
+39	1007 1
+39	6123 1
+40	33 1
+40	54 1
+40	55 1
+40	214 1
+40	216 1
+40	243 1
+40	252 1
+40	257 1
+40	273 1
+40	274 1
+40	299 1
+26	3 1
+26	6 1
+26	19 1
+26	23 1
+26	28 1
+26	33 1
+26	34 1
+26	38 1
+26	39 1
+26	50 1
+26	54 1
+26	55 1
+26	56 1
+26	80 1
+26	89 1
+26	93 1
+26	127 1
+26	130 1
+26	132 1
+26	135 1
+26	140 1
+26	144 1
+26	147 1
+26	151 1
+26	152 1
+26	154 1
+26	163 1
+26	167 1
+26	168 1
+26	182 1
+26	183 1
+26	214 1
+26	216 1
+26	219 1
+26	226 1
+26	232 1
+26	236 1
+26	243 1
+26	250 1
+26	252 1
+26	257 1
+26	258 1
+26	261 1
+26	271 1
+26	273 1
+26	274 1
+26	286 1
+26	299 1
+26	300 1
+26	301 1
+26	306 1
+26	310 1
+26	325 1
+26	339 1
+26	341 1
+26	348 1
+26	349 1
+26	356 1
+26	358 1
+26	359 1
+26	362 1
+26	363 1
+26	370 1
+26	371 1
+26	373 1
+26	377 1
+26	378 1
+26	379 1
+26	389 1
+26	390 1
+26	391 1
+26	394 1
+26	396 1
+26	415 1
+26	419 1
+26	421 1
+26	422 1
+26	427 1
+26	431 1
+26	433 1
+26	560 1
+26	564 1
+26	566 1
+26	567 1
+26	581 1
+26	584 1
+26	590 1
+26	636 1
+26	673 1
+26	675 1
+26	681 1
+26	684 1
+26	687 1
+26	756 1
+26	8282 1
+41	3 1
+41	28 1
+41	33 1
+41	54 1
+41	56 1
+41	75 1
+41	140 1
+41	151 1
+41	183 1
+41	226 1
+41	227 1
+41	252 1
+41	271 1
+41	299 1
+41	322 1
+41	339 1
+41	356 1
+41	358 1
+41	377 1
+41	402 1
+41	422 1
+41	681 1
+41	756 1
+41	837 1
+41	857 1
+41	887 1
+41	893 1
+41	922 1
+41	1259 1
+41	1282 1
+42	19 1
+42	23 1
+42	28 1
+42	34 1
+42	50 1
+42	54 1
+42	55 1
+42	56 1
+42	75 1
+42	80 1
+42	105 1
+42	178 1
+42	214 1
+42	219 1
+42	243 1
+42	250 1
+42	252 1
+42	259 1
+42	271 1
+42	274 1
+42	286 1
+42	298 1
+42	299 1
+42	302 1
+42	348 1
+42	356 1
+42	377 1
+42	378 1
+42	391 1
+42	396 1
+42	407 1
+42	415 1
+42	545 1
+42	549 1
+42	564 1
+42	656 1
+42	658 1
+42	710 1
+42	743 1
+42	748 1
+42	756 1
+42	810 1
+42	817 1
+42	823 1
+42	853 1
+42	907 1
+42	908 1
+42	975 1
+42	993 1
+42	1024 1
+42	1026 1
+42	1053 1
+42	1075 1
+42	1123 1
+42	1127 1
+42	1200 1
+42	1234 1
+42	1353 1
+42	1464 1
+42	1465 1
+42	1476 1
+42	1497 1
+42	1548 1
+42	1604 1
+42	1717 1
+42	1783 1
+42	1903 1
+42	1977 1
+42	1997 1
+42	2004 1
+42	2128 1
+42	2157 1
+42	2181 1
+42	2241 1
+42	2475 1
+42	2504 1
+42	2625 1
+42	3026 1
+42	3136 1
+42	3352 1
+42	3408 1
+42	4261 1
+42	4709 1
+42	5423 1
+42	5775 1
+42	6437 1
+42	6458 1
+42	7108 1
+42	8287 1
+43	54 1
+43	182 1
+43	857 1
+43	918 1
+44	15 1
+44	54 1
+44	147 1
+44	154 1
+44	214 1
+44	224 1
+44	259 1
+44	372 1
+44	390 1
+44	391 1
+44	465 1
+44	908 1
+44	947 1
+44	966 1
+44	1111 1
+44	1186 1
+44	1717 1
+44	1855 1
+44	1857 1
+44	1919 1
+44	1920 1
+44	1953 1
+44	1956 1
+44	2066 1
+44	2157 1
+44	2345 1
+44	2508 1
+44	2516 1
+44	2643 1
+44	2652 1
+44	3028 1
+44	3813 1
+44	4687 1
+44	4795 1
+44	4875 1
+44	5055 1
+44	5254 1
+44	5439 1
+44	6262 1
+44	6306 1
+44	6432 1
+44	6437 1
+44	7092 1
+44	8295 1
+45	8 1
+45	54 1
+45	55 1
+45	299 1
+45	871 1
+45	1441 1
+45	1507 1
+45	1513 1
+46	3 1
+46	36 1
+46	54 1
+46	56 1
+46	132 1
+46	150 1
+46	152 1
+46	182 1
+46	204 1
+46	214 1
+46	224 1
+46	252 1
+46	255 1
+46	271 1
+46	280 1
+46	282 1
+46	286 1
+46	300 1
+46	301 1
+46	325 1
+46	348 1
+46	368 1
+46	370 1
+46	371 1
+46	377 1
+46	378 1
+46	379 1
+46	391 1
+46	394 1
+46	396 1
+46	402 1
+46	407 1
+46	428 1
+46	431 1
+46	564 1
+46	566 1
+46	590 1
+46	609 1
+46	624 1
+46	656 1
+46	664 1
+46	681 1
+46	704 1
+46	715 1
+46	749 1
+46	838 1
+46	844 1
+46	857 1
+46	991 1
+46	993 1
+46	1279 1
+46	1425 1
+46	1542 1
+46	1565 1
+46	1593 1
+46	1758 1
+46	3435 1
+46	3506 1
+46	8287 1
+47	3 1
+47	8 1
+47	10 1
+47	19 1
+47	28 1
+47	39 1
+47	50 1
+47	54 1
+47	55 1
+47	56 1
+47	61 1
+47	72 1
+47	80 1
+47	93 1
+47	94 1
+47	127 1
+47	135 1
+47	140 1
+47	151 1
+47	152 1
+47	154 1
+47	163 1
+47	168 1
+47	178 1
+47	182 1
+47	214 1
+47	216 1
+47	226 1
+47	243 1
+47	250 1
+47	252 1
+47	257 1
+47	271 1
+47	274 1
+47	282 1
+47	286 1
+47	290 1
+47	299 1
+47	300 1
+47	302 1
+47	304 1
+47	317 1
+47	322 1
+47	324 1
+47	334 1
+47	356 1
+47	389 1
+47	402 1
+47	405 1
+47	415 1
+47	427 1
+47	428 1
+47	431 1
+47	435 1
+47	447 1
+47	545 1
+47	560 1
+47	609 1
+47	644 1
+47	656 1
+47	664 1
+47	667 1
+47	675 1
+47	704 1
+47	739 1
+47	756 1
+47	761 1
+47	789 1
+47	820 1
+47	844 1
+47	857 1
+47	935 1
+47	958 1
+47	989 1
+47	993 1
+47	1111 1
+47	1186 1
+47	1211 1
+47	1236 1
+47	1248 1
+47	1284 1
+47	1285 1
+47	1286 1
+47	1297 1
+47	1300 1
+47	1307 1
+47	1378 1
+47	1420 1
+47	1453 1
+47	1514 1
+47	1564 1
+47	1573 1
+47	1585 1
+47	1603 1
+47	1717 1
+47	1723 1
+47	1726 1
+47	1787 1
+47	1855 1
+47	1859 1
+47	1884 1
+47	1956 1
+47	1965 1
+47	1966 1
+47	1983 1
+47	2007 1
+47	2062 1
+47	2066 1
+47	2079 1
+47	2091 1
+47	2185 1
+47	2193 1
+47	2240 1
+47	2397 1
+47	2398 1
+47	2409 1
+47	2470 1
+47	2485 1
+47	2506 1
+47	2565 1
+47	2754 1
+47	2777 1
+47	2871 1
+47	2900 1
+47	2955 1
+47	3136 1
+47	3352 1
+47	3631 1
+47	3720 1
+47	3755 1
+47	3803 1
+47	3897 1
+47	3946 1
+47	4037 1
+47	4058 1
+47	4189 1
+47	4256 1
+47	4735 1
+47	5254 1
+47	5412 1
+47	5922 1
+47	6227 1
+47	6875 1
+47	8212 1
+47	8282 1
+47	8294 1
+48	28 1
+48	54 1
+48	86 1
+48	94 1
+48	168 1
+48	214 1
+48	250 1
+48	252 1
+48	271 1
+48	282 1
+48	299 1
+48	310 1
+48	356 1
+48	391 1
+48	421 1
+48	564 1
+48	664 1
+48	817 1
+48	878 1
+48	1211 1
+48	1864 1
+49	28 1
+49	54 1
+49	214 1
+49	363 1
+49	370 1
+49	396 1
+49	517 1
+49	664 1
+49	749 1
+49	762 1
+49	1031 1
+49	1123 1
+49	1211 1
+49	1550 1
+49	2643 1
+50	23 1
+50	28 1
+50	54 1
+50	61 1
+50	154 1
+50	216 1
+50	219 1
+50	250 1
+50	252 1
+50	257 1
+50	261 1
+50	271 1
+50	273 1
+50	299 1
+51	33 1
+51	39 1
+51	54 1
+51	55 1
+51	56 1
+51	72 1
+51	80 1
+51	93 1
+51	175 1
+51	214 1
+51	246 1
+51	271 1
+51	280 1
+51	299 1
+51	325 1
+51	589 1
+51	609 1
+51	611 1
+51	656 1
+51	739 1
+51	750 1
+51	756 1
+51	791 1
+51	893 1
+52	54 1
+53	15 1
+53	28 1
+53	54 1
+53	274 1
+53	806 1
+53	857 1
+53	1744 1
+53	2114 1
+53	2324 1
+53	2535 1
+53	2657 1
+53	2686 1
+53	2774 1
+53	2900 1
+53	3192 1
+53	3276 1
+53	3352 1
+53	3568 1
+53	3646 1
+53	3650 1
+53	3717 1
+53	3755 1
+53	3812 1
+53	4011 1
+53	4088 1
+53	4099 1
+53	4162 1
+53	4183 1
+53	4191 1
+53	4235 1
+53	4335 1
+53	4389 1
+53	4666 1
+53	4735 1
+53	4764 1
+53	5079 1
+53	5640 1
+53	5804 1
+53	5998 1
+29	3 1
+29	8 1
+29	10 1
+29	23 1
+29	28 1
+29	33 1
+29	39 1
+29	50 1
+29	54 1
+29	55 1
+29	56 1
+29	75 1
+29	86 1
+29	93 1
+29	95 1
+29	105 1
+29	127 1
+29	130 1
+29	140 1
+29	147 1
+29	150 1
+29	151 1
+29	152 1
+29	154 1
+29	183 1
+29	214 1
+29	228 1
+29	243 1
+29	246 1
+29	252 1
+29	259 1
+29	261 1
+29	271 1
+29	273 1
+29	274 1
+29	282 1
+29	286 1
+29	299 1
+29	300 1
+29	308 1
+29	313 1
+29	317 1
+29	322 1
+29	348 1
+29	356 1
+29	358 1
+29	362 1
+29	389 1
+29	391 1
+29	394 1
+29	396 1
+29	402 1
+29	406 1
+29	407 1
+29	415 1
+29	428 1
+29	435 1
+29	439 1
+29	524 1
+29	538 1
+29	549 1
+29	587 1
+29	589 1
+29	600 1
+29	604 1
+29	611 1
+29	627 1
+29	656 1
+29	659 1
+29	665 1
+29	667 1
+29	668 1
+29	670 1
+29	673 1
+29	674 1
+29	677 1
+29	681 1
+29	684 1
+29	700 1
+29	704 1
+29	715 1
+29	719 1
+29	722 1
+29	730 1
+29	733 1
+29	739 1
+29	756 1
+29	761 1
+29	789 1
+29	810 1
+29	829 1
+29	837 1
+29	838 1
+29	840 1
+29	857 1
+29	863 1
+29	866 1
+29	868 1
+29	878 1
+29	882 1
+29	893 1
+29	895 1
+29	904 1
+29	918 1
+29	929 1
+29	932 1
+29	934 1
+29	936 1
+29	938 1
+29	942 1
+29	956 1
+29	958 1
+29	966 1
+29	1014 1
+29	1026 1
+29	1053 1
+29	1061 1
+29	1080 1
+29	1131 1
+29	1297 1
+29	1307 1
+29	1548 1
+29	1549 1
+29	1772 1
+29	2252 1
+29	2273 1
+29	2565 1
+29	3643 1
+29	3717 1
+29	3720 1
+29	3843 1
+29	4011 1
+29	4021 1
+29	4088 1
+29	4103 1
+29	4666 1
+29	5404 1
+29	5545 1
+29	5582 1
+29	5922 1
+29	6198 1
+29	6498 1
+29	6503 1
+29	6913 1
+29	6946 1
+29	7040 1
+29	7052 1
+29	7119 1
+29	7295 1
+29	8294 1
+55	6 1
+55	8 1
+55	28 1
+55	29 1
+55	36 1
+55	38 1
+55	56 1
+55	61 1
+55	75 1
+55	80 1
+55	86 1
+55	94 1
+55	135 1
+55	144 1
+55	152 1
+55	214 1
+55	216 1
+55	243 1
+55	250 1
+55	252 1
+55	271 1
+55	282 1
+55	299 1
+55	302 1
+55	304 1
+55	308 1
+55	313 1
+55	317 1
+55	321 1
+55	325 1
+55	348 1
+55	356 1
+55	370 1
+55	373 1
+55	379 1
+55	402 1
+55	407 1
+55	439 1
+55	447 1
+55	488 1
+55	514 1
+55	549 1
+55	673 1
+55	682 1
+55	696 1
+55	697 1
+55	714 1
+55	730 1
+55	733 1
+55	739 1
+55	761 1
+55	784 1
+55	793 1
+55	795 1
+55	918 1
+55	942 1
+55	956 1
+55	958 1
+55	1014 1
+55	1020 1
+55	1030 1
+55	1080 1
+55	1123 1
+55	1432 1
+56	6 1
+56	28 1
+56	49 1
+56	61 1
+56	105 1
+56	152 1
+56	175 1
+56	192 1
+56	214 1
+56	368 1
+56	415 1
+56	515 1
+56	622 1
+56	750 1
+56	762 1
+56	1077 1
+56	1211 1
+56	1549 1
+56	2151 1
+56	2211 1
+56	2323 1
+56	2651 1
+56	8287 1
+56	8290 1
+57	55 1
+57	61 1
+57	228 1
+57	271 1
+57	299 1
+57	415 1
+57	549 1
+57	656 1
+57	673 1
+57	675 1
+57	756 1
+57	789 1
+57	817 1
+58	15 1
+58	23 1
+58	28 1
+58	50 1
+58	55 1
+58	61 1
+58	75 1
+58	80 1
+58	89 1
+58	93 1
+58	94 1
+58	127 1
+58	132 1
+58	144 1
+58	154 1
+58	163 1
+58	167 1
+58	183 1
+58	257 1
+58	271 1
+58	274 1
+58	290 1
+58	299 1
+58	310 1
+58	322 1
+58	325 1
+58	853 1
+58	1186 1
+58	1697 1
+58	1966 1
+58	2345 1
+58	2877 1
+58	5079 1
+58	5254 1
+58	5378 1
+58	5412 1
+58	6044 1
+58	8237 1
+59	3 1
+59	15 1
+59	28 1
+59	33 1
+59	49 1
+59	56 1
+59	61 1
+59	86 1
+59	152 1
+59	167 1
+59	168 1
+59	204 1
+59	214 1
+59	219 1
+59	228 1
+59	252 1
+59	271 1
+59	298 1
+59	370 1
+59	371 1
+59	372 1
+59	377 1
+59	378 1
+59	391 1
+59	407 1
+59	417 1
+59	421 1
+59	425 1
+59	431 1
+59	549 1
+59	564 1
+59	584 1
+59	600 1
+59	643 1
+59	723 1
+59	733 1
+59	763 1
+59	861 1
+59	895 1
+59	928 1
+59	935 1
+59	937 1
+59	959 1
+59	1000 1
+59	1034 1
+59	1125 1
+59	1131 1
+59	1152 1
+59	1201 1
+59	1230 1
+59	1315 1
+59	1357 1
+59	1396 1
+59	1416 1
+59	1464 1
+59	1476 1
+59	1484 1
+59	1595 1
+59	1604 1
+59	1633 1
+59	1781 1
+59	1808 1
+59	1836 1
+59	1842 1
+59	1893 1
+59	1918 1
+59	2062 1
+59	2066 1
+59	2174 1
+59	2345 1
+59	2371 1
+59	2375 1
+59	2397 1
+59	2400 1
+59	2470 1
+59	2547 1
+59	2550 1
+59	2560 1
+59	2724 1
+59	2727 1
+59	2922 1
+59	2946 1
+59	2955 1
+59	2963 1
+59	2966 1
+59	2972 1
+59	2977 1
+59	2979 1
+59	3015 1
+59	3408 1
+59	3807 1
+59	5404 1
+59	5624 1
+59	6166 1
+60	61 1
+60	1374 1
+60	1521 1
+60	1717 1
+60	1726 1
+60	1956 1
+60	2252 1
+60	2625 1
+60	7624 1
+62	6 1
+62	243 1
+62	280 1
+62	363 1
+62	370 1
+62	415 1
+62	606 1
+62	607 1
+62	609 1
+62	611 1
+62	2091 1
+62	2092 1
+62	2095 1
+62	2185 1
+62	2193 1
+62	2247 1
+62	2470 1
+27	6 1
+27	15 1
+27	19 1
+27	28 1
+27	34 1
+27	55 1
+27	93 1
+27	132 1
+27	135 1
+27	140 1
+27	144 1
+27	152 1
+27	153 1
+27	167 1
+27	175 1
+27	182 1
+27	183 1
+27	216 1
+27	219 1
+27	226 1
+27	243 1
+27	271 1
+27	274 1
+27	280 1
+27	282 1
+27	301 1
+27	302 1
+27	306 1
+27	310 1
+27	319 1
+27	325 1
+27	348 1
+27	362 1
+27	370 1
+27	371 1
+27	373 1
+27	377 1
+27	379 1
+27	390 1
+27	394 1
+27	396 1
+27	402 1
+27	422 1
+27	427 1
+27	433 1
+27	435 1
+27	566 1
+27	567 1
+27	584 1
+27	586 1
+27	590 1
+27	604 1
+27	606 1
+27	609 1
+27	613 1
+27	616 1
+27	624 1
+27	627 1
+27	628 1
+27	631 1
+27	636 1
+27	645 1
+27	656 1
+27	664 1
+27	667 1
+27	668 1
+27	670 1
+27	673 1
+27	681 1
+27	684 1
+27	687 1
+27	700 1
+27	719 1
+27	737 1
+27	741 1
+27	743 1
+27	746 1
+27	748 1
+27	866 1
+27	1092 1
+27	2369 1
+27	2398 1
+27	2696 1
+27	2917 1
+27	3456 1
+27	3537 1
+27	3643 1
+27	4044 1
+27	4189 1
+27	4191 1
+27	4335 1
+27	4400 1
+27	4448 1
+27	4715 1
+27	4828 1
+27	5210 1
+27	5254 1
+27	5412 1
+27	5459 1
+27	5743 1
+27	5844 1
+27	6246 1
+63	6 1
+64	6 1
+65	6 1
+65	89 1
+66	6 1
+66	28 1
+66	55 1
+66	56 1
+66	152 1
+66	183 1
+66	282 1
+66	302 1
+66	338 1
+66	359 1
+66	394 1
+66	402 1
+66	600 1
+66	607 1
+66	665 1
+66	756 1
+66	784 1
+66	977 1
+66	1012 1
+66	1026 1
+66	1075 1
+66	1131 1
+66	1193 1
+66	1267 1
+66	1717 1
+66	1729 1
+66	2014 1
+66	2062 1
+66	2117 1
+66	2193 1
+66	2237 1
+66	2470 1
+66	2625 1
+66	2651 1
+66	2799 1
+66	3352 1
+66	3464 1
+66	3680 1
+66	3803 1
+66	4588 1
+66	4687 1
+66	5529 1
+66	5614 1
+66	7961 1
+72	8 1
+72	15 1
+72	28 1
+72	39 1
+72	56 1
+72	89 1
+72	144 1
+72	152 1
+72	178 1
+72	182 1
+72	204 1
+72	226 1
+72	232 1
+72	236 1
+72	243 1
+72	261 1
+72	271 1
+72	282 1
+72	299 1
+72	313 1
+72	321 1
+72	322 1
+72	325 1
+72	341 1
+72	356 1
+72	370 1
+72	371 1
+72	407 1
+72	422 1
+72	427 1
+72	431 1
+72	432 1
+72	435 1
+72	439 1
+72	440 1
+72	514 1
+72	549 1
+72	566 1
+72	567 1
+72	584 1
+72	586 1
+72	589 1
+72	590 1
+72	592 1
+72	600 1
+72	636 1
+72	637 1
+72	659 1
+72	663 1
+72	667 1
+72	697 1
+72	704 1
+72	714 1
+72	719 1
+72	730 1
+72	733 1
+72	739 1
+72	756 1
+72	761 1
+72	762 1
+72	789 1
+72	794 1
+72	802 1
+72	820 1
+72	844 1
+72	857 1
+72	881 1
+72	885 1
+72	895 1
+72	896 1
+72	943 1
+72	946 1
+72	947 1
+72	959 1
+72	966 1
+72	972 1
+72	975 1
+72	989 1
+72	991 1
+72	993 1
+72	1007 1
+72	1023 1
+72	1026 1
+72	1031 1
+72	1035 1
+72	1053 1
+72	1062 1
+72	1123 1
+72	1131 1
+72	1156 1
+72	1193 1
+72	1211 1
+72	1279 1
+72	1310 1
+72	1319 1
+72	1352 1
+72	1378 1
+72	1394 1
+72	1396 1
+72	1538 1
+72	1549 1
+72	1573 1
+72	1597 1
+72	1621 1
+72	1622 1
+72	1637 1
+72	1717 1
+72	1718 1
+72	1842 1
+72	1848 1
+72	1982 1
+72	2066 1
+72	2398 1
+72	2535 1
+72	2565 1
+72	2774 1
+72	2775 1
+72	3136 1
+72	3164 1
+72	3238 1
+72	3276 1
+72	3291 1
+72	3334 1
+72	3352 1
+72	3443 1
+72	3459 1
+72	3479 1
+72	3498 1
+72	3607 1
+72	3970 1
+72	4037 1
+72	4098 1
+72	4099 1
+72	4276 1
+72	4335 1
+72	4994 1
+72	5022 1
+72	5061 1
+72	5079 1
+72	5254 1
+72	5321 1
+72	5459 1
+72	5511 1
+72	5524 1
+72	5683 1
+72	6004 1
+72	6229 1
+72	6437 1
+72	6566 1
+72	6715 1
+72	6774 1
+72	6790 1
+72	6832 1
+72	6833 1
+72	6855 1
+72	6979 1
+72	7050 1
+72	7279 1
+72	7478 1
+72	7620 1
+72	7632 1
+72	8042 1
+72	8128 1
+72	8295 1
+73	3 1
+73	8 1
+73	28 1
+73	75 1
+73	95 1
+73	152 1
+73	214 1
+73	243 1
+73	274 1
+73	299 1
+73	363 1
+73	378 1
+73	394 1
+75	8 1
+75	28 1
+75	32 1
+75	56 1
+75	94 1
+75	152 1
+75	154 1
+75	192 1
+75	246 1
+75	299 1
+75	370 1
+75	514 1
+75	515 1
+75	545 1
+75	549 1
+75	600 1
+75	739 1
+75	756 1
+75	771 1
+75	928 1
+75	1077 1
+75	1186 1
+75	1243 1
+75	1248 1
+75	1861 1
+75	1864 1
+75	1884 1
+75	1956 1
+75	3755 1
+75	8284 1
+75	8285 1
+76	8 1
+76	514 1
+78	8 1
+78	28 1
+78	49 1
+78	56 1
+78	144 1
+78	214 1
+78	258 1
+78	261 1
+78	300 1
+78	302 1
+78	368 1
+78	377 1
+78	378 1
+78	379 1
+78	390 1
+78	391 1
+78	392 1
+78	396 1
+78	415 1
+78	419 1
+78	421 1
+78	422 1
+78	428 1
+78	431 1
+78	433 1
+78	517 1
+78	524 1
+78	566 1
+78	567 1
+78	659 1
+78	793 1
+78	857 1
+78	1192 1
+78	1211 1
+78	1464 1
+78	1513 1
+78	1514 1
+78	1652 1
+78	1654 1
+78	1662 1
+78	8287 1
+79	8 1
+79	29 1
+79	50 1
+79	55 1
+79	75 1
+79	93 1
+79	94 1
+79	153 1
+79	167 1
+79	192 1
+79	214 1
+79	236 1
+79	243 1
+79	252 1
+79	271 1
+79	299 1
+79	302 1
+79	311 1
+79	313 1
+79	341 1
+79	356 1
+79	370 1
+79	391 1
+79	407 1
+79	435 1
+79	477 1
+79	514 1
+79	515 1
+79	600 1
+79	637 1
+79	659 1
+79	697 1
+79	704 1
+79	733 1
+79	756 1
+79	784 1
+79	789 1
+79	817 1
+79	857 1
+79	864 1
+79	875 1
+79	878 1
+79	893 1
+79	930 1
+79	934 1
+79	955 1
+79	958 1
+79	979 1
+79	1014 1
+79	1020 1
+79	1053 1
+79	8284 1
+79	8287 1
+77	8 1
+77	28 1
+77	49 1
+77	108 1
+77	130 1
+77	175 1
+77	214 1
+77	219 1
+77	271 1
+77	299 1
+77	363 1
+77	524 1
+77	604 1
+77	624 1
+77	644 1
+77	700 1
+77	868 1
+77	878 1
+77	1185 1
+77	1193 1
+77	1372 1
+77	1550 1
+77	1563 1
+77	1816 1
+77	3812 1
+80	8 1
+80	29 1
+80	33 1
+80	50 1
+80	55 1
+80	75 1
+80	86 1
+80	144 1
+80	150 1
+80	151 1
+80	168 1
+80	236 1
+80	252 1
+80	255 1
+80	271 1
+80	280 1
+80	282 1
+80	299 1
+80	304 1
+80	310 1
+80	311 1
+80	319 1
+80	322 1
+80	325 1
+80	339 1
+80	356 1
+80	370 1
+80	402 1
+80	433 1
+80	439 1
+80	560 1
+80	590 1
+80	600 1
+80	619 1
+80	631 1
+80	636 1
+80	643 1
+80	656 1
+80	657 1
+80	658 1
+80	664 1
+80	675 1
+80	681 1
+80	684 1
+80	719 1
+80	723 1
+80	725 1
+80	730 1
+80	733 1
+80	739 1
+80	746 1
+80	756 1
+80	779 1
+80	789 1
+80	798 1
+80	817 1
+80	857 1
+80	945 1
+80	1026 1
+81	8 1
+81	28 1
+81	32 1
+81	55 1
+81	93 1
+81	105 1
+81	175 1
+81	192 1
+81	214 1
+81	273 1
+81	299 1
+81	477 1
+81	506 1
+81	517 1
+81	524 1
+81	1157 1
+81	1218 1
+81	8287 1
+83	33 1
+83	371 1
+83	517 1
+83	1384 1
+83	1385 1
+83	1749 1
+83	2963 1
+83	8287 1
+91	33 1
+91	55 1
+67	33 1
+67	56 1
+67	75 1
+67	132 1
+67	153 1
+67	178 1
+67	192 1
+67	214 1
+67	274 1
+67	282 1
+67	299 1
+67	356 1
+67	391 1
+67	405 1
+67	515 1
+67	756 1
+67	2508 1
+84	33 1
+85	33 1
+86	15 1
+86	33 1
+86	35 1
+86	50 1
+86	55 1
+86	56 1
+86	150 1
+86	214 1
+86	228 1
+86	243 1
+86	259 1
+86	271 1
+86	282 1
+86	299 1
+86	304 1
+86	308 1
+86	313 1
+86	325 1
+86	332 1
+86	391 1
+86	405 1
+86	407 1
+86	415 1
+86	428 1
+86	439 1
+86	447 1
+86	538 1
+86	549 1
+86	564 1
+86	600 1
+86	626 1
+86	674 1
+86	696 1
+86	719 1
+86	733 1
+86	750 1
+86	756 1
+86	761 1
+86	762 1
+86	794 1
+86	795 1
+86	820 1
+86	857 1
+86	866 1
+86	878 1
+86	893 1
+86	895 1
+86	908 1
+86	913 1
+86	918 1
+86	932 1
+86	937 1
+86	972 1
+86	981 1
+86	989 1
+86	991 1
+86	1007 1
+86	1014 1
+86	1026 1
+86	1131 1
+86	1186 1
+86	1234 1
+86	1248 1
+86	1297 1
+86	1305 1
+86	1432 1
+86	1514 1
+86	1525 1
+86	1569 1
+86	1585 1
+86	1672 1
+86	1718 1
+86	1835 1
+86	1855 1
+86	1857 1
+86	1859 1
+86	1987 1
+86	2016 1
+86	2128 1
+86	2157 1
+86	2160 1
+86	2354 1
+86	2397 1
+86	2409 1
+86	2570 1
+86	2576 1
+86	2643 1
+86	2754 1
+86	2763 1
+86	2775 1
+86	2799 1
+86	2809 1
+86	2923 1
+86	3050 1
+86	3092 1
+86	3136 1
+86	3310 1
+86	3443 1
+86	3529 1
+86	3537 1
+86	3576 1
+86	3681 1
+86	3897 1
+86	3970 1
+86	4055 1
+86	4099 1
+86	4247 1
+86	4338 1
+86	4687 1
+86	4719 1
+86	4828 1
+86	4962 1
+86	5028 1
+86	5421 1
+86	5449 1
+86	5936 1
+86	6094 1
+86	6327 1
+86	6914 1
+86	6930 1
+86	7553 1
+86	8291 1
+71	19 1
+71	33 1
+71	35 1
+71	50 1
+71	55 1
+71	75 1
+71	80 1
+71	86 1
+71	93 1
+71	94 1
+71	144 1
+71	151 1
+71	168 1
+71	214 1
+71	226 1
+71	228 1
+71	236 1
+71	257 1
+71	271 1
+71	299 1
+71	319 1
+71	356 1
+71	370 1
+71	391 1
+71	402 1
+71	415 1
+71	427 1
+71	435 1
+71	439 1
+71	447 1
+71	549 1
+71	560 1
+71	564 1
+71	600 1
+71	631 1
+71	706 1
+71	762 1
+71	789 1
+71	895 1
+71	908 1
+71	937 1
+71	963 1
+71	971 1
+71	989 1
+71	1014 1
+71	1026 1
+71	1034 1
+71	1248 1
+71	1297 1
+71	1357 1
+71	1453 1
+71	1465 1
+71	1497 1
+71	1513 1
+71	1518 1
+71	1549 1
+71	1573 1
+71	1585 1
+71	1593 1
+71	1636 1
+71	1811 1
+71	1859 1
+71	1915 1
+71	1918 1
+71	1956 1
+71	1966 1
+71	2095 1
+71	2106 1
+71	2114 1
+71	2210 1
+71	2328 1
+71	2398 1
+71	2400 1
+71	2409 1
+71	2535 1
+71	2646 1
+71	2763 1
+71	2775 1
+71	2801 1
+71	2946 1
+71	2972 1
+71	3027 1
+71	3334 1
+71	3352 1
+71	3529 1
+71	3562 1
+71	3576 1
+71	3635 1
+71	3681 1
+71	3800 1
+71	3804 1
+71	3892 1
+71	3897 1
+71	3970 1
+71	4037 1
+71	4735 1
+71	4780 1
+71	5058 1
+71	5079 1
+71	5254 1
+71	5421 1
+71	5449 1
+71	5671 1
+71	5714 1
+71	6094 1
+71	6327 1
+71	6914 1
+71	7809 1
+71	7921 1
+87	8 1
+87	15 1
+87	28 1
+87	29 1
+87	33 1
+87	35 1
+87	36 1
+87	55 1
+87	56 1
+87	72 1
+87	75 1
+87	86 1
+87	150 1
+87	151 1
+87	154 1
+87	183 1
+87	192 1
+87	204 1
+87	259 1
+87	271 1
+87	282 1
+87	290 1
+87	299 1
+87	304 1
+87	313 1
+87	317 1
+87	348 1
+87	363 1
+87	372 1
+87	396 1
+87	407 1
+87	439 1
+87	515 1
+87	545 1
+87	549 1
+87	579 1
+87	600 1
+87	608 1
+87	647 1
+87	656 1
+87	658 1
+87	667 1
+87	696 1
+87	704 1
+87	737 1
+87	756 1
+87	761 1
+87	762 1
+87	765 1
+87	771 1
+87	789 1
+87	837 1
+87	913 1
+87	928 1
+87	932 1
+87	958 1
+87	963 1
+87	978 1
+87	989 1
+87	999 1
+87	1022 1
+87	1026 1
+87	1053 1
+87	1055 1
+87	1092 1
+87	1123 1
+87	1131 1
+87	1193 1
+87	1199 1
+87	1248 1
+87	1279 1
+87	1297 1
+87	1307 1
+87	1330 1
+87	1352 1
+87	1382 1
+87	1411 1
+87	1413 1
+87	1484 1
+87	1549 1
+87	1573 1
+87	1585 1
+87	1604 1
+87	1717 1
+87	1718 1
+87	1847 1
+87	1855 1
+87	1956 1
+87	1965 1
+87	2053 1
+87	2066 1
+87	2256 1
+87	2264 1
+87	2354 1
+87	2398 1
+87	2456 1
+87	2535 1
+87	2565 1
+87	2576 1
+87	2623 1
+87	2754 1
+87	2764 1
+87	2774 1
+87	2790 1
+87	2801 1
+87	2900 1
+87	2925 1
+87	3027 1
+87	3117 1
+87	3192 1
+87	3238 1
+87	3276 1
+87	3334 1
+87	3352 1
+87	3443 1
+87	3453 1
+87	3460 1
+87	3464 1
+87	3473 1
+87	3479 1
+87	3516 1
+87	3873 1
+87	3892 1
+87	3897 1
+87	3912 1
+87	3962 1
+87	4037 1
+87	4078 1
+87	4099 1
+87	4110 1
+87	4124 1
+87	4191 1
+87	4332 1
+87	4338 1
+87	4400 1
+87	4453 1
+87	4485 1
+87	4510 1
+87	4632 1
+87	4687 1
+87	4712 1
+87	4715 1
+87	4735 1
+87	4748 1
+87	5020 1
+87	5022 1
+87	5028 1
+87	5055 1
+87	5072 1
+87	5200 1
+87	5210 1
+87	5254 1
+87	5308 1
+87	5392 1
+87	5412 1
+87	5415 1
+87	5421 1
+87	5439 1
+87	5449 1
+87	5459 1
+87	5484 1
+87	5584 1
+87	5630 1
+87	5683 1
+87	5684 1
+87	5697 1
+87	5732 1
+87	5737 1
+87	5775 1
+87	5790 1
+87	5798 1
+87	5804 1
+87	5963 1
+87	6006 1
+87	6156 1
+87	6174 1
+87	6296 1
+87	6337 1
+87	6400 1
+87	6407 1
+87	6437 1
+87	6441 1
+87	6458 1
+87	6496 1
+87	6553 1
+87	6737 1
+87	6930 1
+87	7381 1
+87	7478 1
+87	7649 1
+87	7662 1
+87	8141 1
+87	8174 1
+87	8212 1
+87	8287 1
+88	33 1
+89	15 1
+89	33 1
+89	35 1
+89	56 1
+89	86 1
+89	151 1
+89	153 1
+89	168 1
+89	243 1
+89	271 1
+89	310 1
+89	545 1
+89	682 1
+89	756 1
+89	1020 1
+89	1026 1
+89	1031 1
+89	1192 1
+89	1270 1
+89	1425 1
+89	1612 1
+89	2144 1
+89	2145 1
+89	2328 1
+89	2657 1
+89	2991 1
+89	3404 1
+89	3921 1
+89	3974 1
+90	15 1
+90	23 1
+90	28 1
+90	29 1
+90	33 1
+90	35 1
+90	39 1
+90	55 1
+90	72 1
+90	75 1
+90	86 1
+90	171 1
+90	204 1
+90	214 1
+90	243 1
+90	252 1
+90	271 1
+90	290 1
+90	308 1
+90	321 1
+90	338 1
+90	407 1
+90	417 1
+90	439 1
+90	477 1
+90	549 1
+90	559 1
+90	560 1
+90	600 1
+90	644 1
+90	733 1
+90	737 1
+90	749 1
+90	750 1
+90	756 1
+90	761 1
+90	820 1
+90	932 1
+90	958 1
+90	994 1
+90	1007 1
+90	1124 1
+90	1128 1
+90	1131 1
+90	1234 1
+90	1305 1
+90	1468 1
+90	1569 1
+90	1596 1
+90	1628 1
+90	1637 1
+90	1638 1
+90	1956 1
+90	2193 1
+90	2384 1
+90	2398 1
+90	2760 1
+90	3014 1
+90	3027 1
+90	3034 1
+90	3309 1
+90	3352 1
+90	3435 1
+90	3897 1
+90	3958 1
+90	4191 1
+90	4335 1
+90	4666 1
+90	4735 1
+90	5412 1
+90	5449 1
+90	8287 1
+93	153 1
+92	93 1
+92	105 1
+92	168 1
+92	300 1
+92	302 1
+82	93 1
+94	3 1
+94	19 1
+94	23 1
+94	28 1
+94	39 1
+94	56 1
+94	80 1
+94	86 1
+94	93 1
+94	127 1
+94	130 1
+94	132 1
+94	147 1
+94	150 1
+94	151 1
+94	152 1
+94	175 1
+94	183 1
+94	214 1
+94	219 1
+94	224 1
+94	243 1
+94	250 1
+94	252 1
+94	257 1
+94	258 1
+94	261 1
+94	271 1
+94	273 1
+94	274 1
+94	282 1
+94	286 1
+94	299 1
+94	301 1
+94	302 1
+94	304 1
+94	322 1
+94	324 1
+94	325 1
+94	348 1
+94	349 1
+94	356 1
+94	370 1
+94	389 1
+94	402 1
+94	405 1
+94	415 1
+94	549 1
+94	613 1
+94	616 1
+94	628 1
+94	631 1
+94	656 1
+94	659 1
+94	663 1
+94	668 1
+94	715 1
+94	739 1
+94	756 1
+94	779 1
+94	789 1
+94	798 1
+94	857 1
+94	859 1
+94	873 1
+94	937 1
+94	1053 1
+94	1123 1
+94	1186 1
+94	1201 1
+94	1243 1
+94	1956 1
+94	2062 1
+94	2128 1
+94	2237 1
+94	2499 1
+94	2643 1
+94	3034 1
+94	3089 1
+94	8282 1
+95	10 1
+95	108 1
+99	10 1
+99	271 1
+99	1498 1
+99	2565 1
+99	3293 1
+99	3371 1
+99	4071 1
+99	5022 1
+99	5055 1
+99	5412 1
+99	5812 1
+99	6560 1
+99	6592 1
+99	6634 1
+99	6737 1
+99	6765 1
+99	6774 1
+99	6918 1
+99	7574 1
+99	7588 1
+99	7632 1
+99	7803 1
+99	8132 1
+99	8237 1
+96	10 1
+96	28 1
+100	10 1
+100	34 1
+100	232 1
+100	378 1
+100	560 1
+98	10 1
+98	56 1
+98	86 1
+98	228 1
+98	514 1
+98	664 1
+98	966 1
+98	3002 1
+31	28 1
+31	49 1
+31	75 1
+31	95 1
+31	230 1
+31	322 1
+31	405 1
+31	506 1
+31	517 1
+31	857 1
+31	1402 1
+31	2348 1
+31	8285 1
+31	8286 1
+31	8287 1
+102	95 1
+102	108 1
+102	813 1
+102	1232 1
+102	1437 1
+103	28 1
+103	75 1
+103	80 1
+103	95 1
+103	144 1
+103	167 1
+103	182 1
+103	192 1
+103	255 1
+103	271 1
+103	299 1
+103	302 1
+103	306 1
+103	370 1
+103	391 1
+103	506 1
+103	579 1
+103	600 1
+103	656 1
+103	657 1
+103	665 1
+103	667 1
+103	681 1
+103	687 1
+103	700 1
+103	719 1
+103	739 1
+103	741 1
+103	746 1
+103	761 1
+103	1669 1
+103	1706 1
+103	1982 1
+103	2014 1
+103	2398 1
+103	2589 1
+103	2667 1
+103	2686 1
+103	2775 1
+103	2851 1
+103	2871 1
+103	2922 1
+103	3537 1
+103	4191 1
+103	4536 1
+103	4666 1
+103	4808 1
+103	4929 1
+103	4944 1
+103	5412 1
+103	5452 1
+103	5503 1
+103	5671 1
+103	5800 1
+103	5822 1
+103	5872 1
+103	6097 1
+103	6327 1
+103	6589 1
+103	6624 1
+103	6665 1
+103	6832 1
+103	6946 1
+103	6967 1
+103	7074 1
+103	7381 1
+103	7553 1
+103	7618 1
+115	95 1
+115	108 1
+115	506 1
+116	95 1
+116	756 1
+104	28 1
+104	55 1
+104	75 1
+104	94 1
+104	95 1
+104	150 1
+104	152 1
+104	178 1
+104	214 1
+104	243 1
+104	252 1
+104	282 1
+104	299 1
+104	302 1
+104	308 1
+104	356 1
+104	368 1
+104	377 1
+104	396 1
+104	477 1
+104	515 1
+104	664 1
+104	667 1
+104	955 1
+104	1077 1
+104	1100 1
+104	1103 1
+104	1192 1
+104	5022 1
+104	8287 1
+105	94 1
+105	95 1
+105	677 1
+106	28 1
+106	55 1
+106	95 1
+106	299 1
+106	579 1
+106	1211 1
+106	1595 1
+106	2211 1
+106	3033 1
+68	8 1
+68	15 1
+68	32 1
+68	56 1
+68	72 1
+68	75 1
+68	95 1
+68	127 1
+68	130 1
+68	271 1
+68	290 1
+68	368 1
+68	379 1
+68	465 1
+68	608 1
+68	650 1
+68	700 1
+68	762 1
+68	771 1
+68	825 1
+68	1026 1
+68	1157 1
+68	1159 1
+68	1239 1
+68	1352 1
+68	1374 1
+68	1437 1
+68	1498 1
+68	1549 1
+68	1592 1
+68	1633 1
+68	1637 1
+68	1646 1
+68	1680 1
+68	1688 1
+68	1706 1
+68	1792 1
+68	1855 1
+68	1919 1
+68	2001 1
+68	2066 1
+68	2072 1
+68	2102 1
+68	2134 1
+68	2160 1
+68	2174 1
+68	2209 1
+68	2237 1
+68	2264 1
+68	2276 1
+68	2307 1
+68	2325 1
+68	2328 1
+68	2338 1
+68	2354 1
+68	2371 1
+68	2440 1
+68	2535 1
+68	2565 1
+68	2576 1
+68	2579 1
+68	2587 1
+68	2593 1
+68	2597 1
+68	2612 1
+68	2618 1
+68	2643 1
+68	2653 1
+68	2654 1
+68	2697 1
+68	2708 1
+68	2760 1
+68	2764 1
+68	2765 1
+68	2774 1
+68	2775 1
+68	2809 1
+68	2814 1
+68	2859 1
+68	2871 1
+68	2877 1
+68	2900 1
+68	2912 1
+68	2951 1
+68	2973 1
+68	3014 1
+68	3018 1
+68	3021 1
+68	3024 1
+68	3026 1
+68	3028 1
+68	3034 1
+68	3050 1
+68	3056 1
+68	3084 1
+68	3089 1
+68	3117 1
+68	3145 1
+68	3150 1
+68	3192 1
+68	3238 1
+68	3258 1
+68	3276 1
+68	3307 1
+68	3313 1
+68	3334 1
+68	3351 1
+68	3352 1
+68	3371 1
+68	3376 1
+68	3435 1
+68	3439 1
+68	3443 1
+68	3454 1
+68	3459 1
+68	3473 1
+68	3489 1
+68	3498 1
+68	3506 1
+68	3537 1
+68	3557 1
+68	3586 1
+68	3607 1
+68	3614 1
+68	3634 1
+68	3635 1
+68	3643 1
+68	3661 1
+68	3691 1
+68	3806 1
+68	3807 1
+68	3816 1
+68	3892 1
+68	3897 1
+68	3946 1
+68	3949 1
+68	3958 1
+68	3980 1
+68	4013 1
+68	4024 1
+68	4037 1
+68	4040 1
+68	4051 1
+68	4055 1
+68	4065 1
+68	4099 1
+68	4111 1
+68	4124 1
+68	4162 1
+68	4179 1
+68	4201 1
+68	4211 1
+68	4212 1
+68	4231 1
+68	4247 1
+68	4290 1
+68	4310 1
+68	4335 1
+68	4338 1
+68	4351 1
+68	4373 1
+68	4453 1
+68	4485 1
+68	4536 1
+68	4574 1
+68	4584 1
+68	4587 1
+68	4588 1
+68	4604 1
+68	4613 1
+68	4631 1
+68	4791 1
+68	4795 1
+68	4828 1
+68	4875 1
+68	4884 1
+68	4896 1
+68	4944 1
+68	4981 1
+68	5002 1
+68	5022 1
+68	5061 1
+68	5079 1
+68	5096 1
+68	5123 1
+68	5179 1
+68	5188 1
+68	5210 1
+68	5226 1
+68	5233 1
+68	5245 1
+68	5254 1
+68	5262 1
+68	5288 1
+68	5323 1
+68	5351 1
+68	5404 1
+68	5412 1
+68	5415 1
+68	5423 1
+68	5430 1
+68	5437 1
+68	5445 1
+68	5449 1
+68	5457 1
+68	5459 1
+68	5463 1
+68	5484 1
+68	5524 1
+68	5527 1
+68	5543 1
+68	5545 1
+68	5605 1
+68	5620 1
+68	5637 1
+68	5639 1
+68	5655 1
+68	5671 1
+68	5680 1
+68	5697 1
+68	5721 1
+68	5732 1
+68	5745 1
+68	5780 1
+68	5806 1
+68	5814 1
+68	5839 1
+68	5848 1
+68	5860 1
+68	5863 1
+68	5886 1
+68	5902 1
+68	5922 1
+68	5925 1
+68	5933 1
+68	5936 1
+68	5972 1
+68	5994 1
+68	6083 1
+68	6097 1
+68	6098 1
+68	6124 1
+68	6130 1
+68	6156 1
+68	6229 1
+68	6262 1
+68	6306 1
+68	6400 1
+68	6407 1
+68	6437 1
+68	6505 1
+68	6599 1
+68	6634 1
+68	6682 1
+68	6774 1
+68	6784 1
+68	6832 1
+68	6914 1
+68	7063 1
+68	7094 1
+68	7115 1
+68	7168 1
+68	7233 1
+68	7341 1
+68	7544 1
+68	7553 1
+68	7620 1
+68	7632 1
+68	7795 1
+68	7839 1
+68	8051 1
+68	8178 1
+68	8287 1
+68	8293 1
+68	8295 1
+117	95 1
+118	95 1
+119	95 1
+107	95 1
+107	477 1
+107	517 1
+107	8287 1
+108	95 1
+108	8283 1
+109	95 1
+109	204 1
+109	290 1
+109	415 1
+109	993 1
+109	1018 1
+109	1074 1
+109	1151 1
+109	1164 1
+109	1199 1
+109	1234 1
+109	1261 1
+109	1297 1
+109	1425 1
+109	1468 1
+109	1521 1
+109	1538 1
+109	1622 1
+109	1628 1
+109	1679 1
+109	1718 1
+109	1758 1
+109	1816 1
+109	1969 1
+109	1982 1
+109	2106 1
+109	2160 1
+109	2273 1
+109	2397 1
+109	2440 1
+109	2511 1
+109	2535 1
+109	3291 1
+109	3310 1
+109	3334 1
+109	3459 1
+109	3614 1
+109	3634 1
+109	3752 1
+109	3792 1
+109	3830 1
+109	3897 1
+109	3962 1
+109	4037 1
+109	4099 1
+109	4361 1
+109	4401 1
+109	4441 1
+109	4483 1
+109	4536 1
+109	4632 1
+109	4687 1
+109	4709 1
+109	4712 1
+109	4715 1
+109	4717 1
+109	4748 1
+109	4786 1
+109	4795 1
+109	4798 1
+109	4940 1
+109	4994 1
+109	5002 1
+109	5022 1
+109	5028 1
+109	5079 1
+109	5096 1
+109	5140 1
+109	5179 1
+109	5188 1
+109	5200 1
+109	5210 1
+109	5254 1
+109	5273 1
+109	5295 1
+109	5321 1
+109	5404 1
+109	5423 1
+109	5465 1
+109	5479 1
+109	5484 1
+109	5524 1
+109	5543 1
+109	5563 1
+109	5596 1
+109	5626 1
+109	5697 1
+109	5714 1
+109	5739 1
+109	5760 1
+109	5798 1
+109	5799 1
+109	5800 1
+109	5802 1
+109	5804 1
+109	5818 1
+109	5819 1
+109	5822 1
+109	5824 1
+109	5827 1
+109	5829 1
+109	5839 1
+109	5871 1
+109	5902 1
+109	5933 1
+109	6001 1
+109	6006 1
+109	6043 1
+109	6097 1
+109	6123 1
+109	6156 1
+109	6174 1
+109	6272 1
+109	6296 1
+109	6306 1
+109	6328 1
+109	6330 1
+109	6344 1
+109	6376 1
+109	6407 1
+109	6417 1
+109	6437 1
+109	6442 1
+109	6458 1
+109	6464 1
+109	6481 1
+109	6505 1
+109	6511 1
+109	6523 1
+109	6528 1
+109	6529 1
+109	6552 1
+109	6555 1
+109	6567 1
+109	6576 1
+109	6596 1
+109	6600 1
+109	6665 1
+109	6699 1
+109	6715 1
+109	6765 1
+109	6770 1
+109	6774 1
+109	6788 1
+109	6832 1
+109	6860 1
+109	6901 1
+109	6913 1
+109	6914 1
+109	6934 1
+109	6946 1
+109	6951 1
+109	6955 1
+109	6979 1
+109	6980 1
+109	7005 1
+109	7021 1
+109	7047 1
+109	7052 1
+109	7063 1
+109	7092 1
+109	7101 1
+109	7115 1
+109	7168 1
+109	7185 1
+109	7225 1
+109	7280 1
+109	7373 1
+109	7393 1
+109	7400 1
+109	7414 1
+109	7553 1
+109	7620 1
+109	7632 1
+109	7649 1
+109	7662 1
+109	7668 1
+109	7694 1
+109	7757 1
+109	7763 1
+109	7788 1
+109	7809 1
+109	7810 1
+109	7908 1
+109	7924 1
+109	7961 1
+109	8042 1
+109	8237 1
+109	8291 1
+109	8297 1
+110	29 1
+110	49 1
+110	95 1
+110	108 1
+110	175 1
+110	228 1
+110	271 1
+110	282 1
+110	304 1
+110	306 1
+110	310 1
+110	313 1
+110	317 1
+110	322 1
+110	429 1
+110	477 1
+110	488 1
+110	506 1
+110	517 1
+110	524 1
+110	613 1
+110	616 1
+110	617 1
+110	622 1
+110	643 1
+110	656 1
+110	658 1
+110	665 1
+110	667 1
+110	670 1
+110	674 1
+110	677 1
+110	682 1
+110	705 1
+110	722 1
+110	730 1
+110	733 1
+110	744 1
+110	789 1
+110	794 1
+110	810 1
+110	837 1
+110	838 1
+110	839 1
+110	844 1
+110	857 1
+110	859 1
+110	863 1
+110	866 1
+110	868 1
+110	881 1
+110	882 1
+110	885 1
+110	893 1
+110	895 1
+110	897 1
+110	904 1
+110	918 1
+110	929 1
+110	930 1
+110	932 1
+110	934 1
+110	936 1
+110	937 1
+110	942 1
+110	945 1
+110	955 1
+110	966 1
+110	972 1
+110	979 1
+110	981 1
+110	989 1
+110	991 1
+110	1007 1
+110	1014 1
+110	1092 1
+110	1191 1
+110	1492 1
+110	1700 1
+110	1836 1
+110	1842 1
+110	1964 1
+110	2193 1
+110	2397 1
+110	2400 1
+110	2426 1
+110	4435 1
+110	4981 1
+110	5079 1
+110	7005 1
+110	7855 1
+110	7862 1
+110	8285 1
+110	8287 1
+110	8288 1
+111	3 1
+111	39 1
+111	80 1
+111	86 1
+111	95 1
+111	192 1
+111	271 1
+111	300 1
+111	306 1
+111	308 1
+111	373 1
+111	377 1
+111	378 1
+111	477 1
+111	517 1
+111	600 1
+111	611 1
+111	636 1
+111	668 1
+111	730 1
+111	838 1
+111	857 1
+111	885 1
+111	895 1
+111	942 1
+111	994 1
+111	995 1
+111	1075 1
+111	1413 1
+120	15 1
+120	28 1
+120	95 1
+120	214 1
+120	299 1
+120	1186 1
+120	1569 1
+120	4795 1
+112	95 1
+121	95 1
+121	350 1
+121	368 1
+121	477 1
+121	524 1
+121	659 1
+121	857 1
+121	8283 1
+121	8285 1
+122	15 1
+122	95 1
+122	152 1
+122	204 1
+122	403 1
+122	417 1
+122	465 1
+122	608 1
+122	737 1
+122	765 1
+122	825 1
+122	856 1
+122	974 1
+122	1026 1
+122	1159 1
+122	1166 1
+122	1239 1
+122	1247 1
+122	1291 1
+122	1297 1
+122	1385 1
+122	1393 1
+122	1419 1
+122	1453 1
+122	1549 1
+122	1637 1
+122	1653 1
+122	1723 1
+122	1729 1
+122	1777 1
+122	1792 1
+122	1837 1
+122	1965 1
+122	1984 1
+122	1990 1
+122	1992 1
+122	2014 1
+122	2066 1
+122	2102 1
+122	2120 1
+122	2135 1
+122	2145 1
+122	2209 1
+122	2237 1
+122	2240 1
+122	2252 1
+122	2256 1
+122	2257 1
+122	2289 1
+122	2322 1
+122	2354 1
+122	2371 1
+122	2375 1
+122	2381 1
+122	2384 1
+122	2398 1
+122	2411 1
+122	2440 1
+122	2456 1
+122	2474 1
+122	2485 1
+122	2506 1
+122	2508 1
+122	2516 1
+122	2517 1
+122	2542 1
+122	2565 1
+122	2585 1
+122	2597 1
+122	2619 1
+122	2623 1
+122	2625 1
+122	2646 1
+122	2651 1
+122	2653 1
+122	2654 1
+122	2657 1
+122	2660 1
+122	2665 1
+122	2667 1
+122	2685 1
+122	2693 1
+122	2697 1
+122	2700 1
+122	2747 1
+122	2768 1
+122	2799 1
+122	2805 1
+122	2809 1
+122	2811 1
+122	2828 1
+122	2834 1
+122	2900 1
+122	2932 1
+122	2955 1
+122	2958 1
+122	2963 1
+122	2966 1
+122	2968 1
+122	2979 1
+122	2981 1
+122	3007 1
+122	3010 1
+122	3014 1
+122	3024 1
+122	3028 1
+122	3029 1
+122	3034 1
+122	3059 1
+122	3084 1
+122	3106 1
+122	3114 1
+122	3117 1
+122	3140 1
+122	3144 1
+122	3148 1
+122	3173 1
+122	3180 1
+122	3192 1
+122	3251 1
+122	3253 1
+122	3258 1
+122	3260 1
+122	3276 1
+122	3291 1
+122	3309 1
+122	3321 1
+122	3352 1
+122	3393 1
+122	3404 1
+122	3435 1
+122	3439 1
+122	3443 1
+122	3453 1
+122	3456 1
+122	3458 1
+122	3480 1
+122	3489 1
+122	3516 1
+122	3520 1
+122	3537 1
+122	3541 1
+122	3568 1
+122	3580 1
+122	3587 1
+122	3615 1
+122	3635 1
+122	3645 1
+122	3646 1
+122	3661 1
+122	3681 1
+122	3772 1
+122	3776 1
+122	3812 1
+122	3843 1
+122	3847 1
+122	3871 1
+122	3887 1
+122	3903 1
+122	3926 1
+122	3958 1
+122	3970 1
+122	3976 1
+122	4013 1
+122	4043 1
+122	4099 1
+122	4117 1
+122	4162 1
+122	4191 1
+122	4201 1
+122	4247 1
+122	4263 1
+122	4266 1
+122	4289 1
+122	4335 1
+122	4365 1
+122	4384 1
+122	4400 1
+122	4417 1
+122	4422 1
+122	4453 1
+122	4463 1
+122	4530 1
+122	4531 1
+122	4578 1
+122	4662 1
+122	4687 1
+122	4712 1
+122	4719 1
+122	4953 1
+122	4964 1
+122	4977 1
+122	4999 1
+122	5155 1
+122	5254 1
+122	5335 1
+122	5392 1
+122	5412 1
+122	5449 1
+122	5454 1
+122	5459 1
+122	5506 1
+122	5509 1
+122	5592 1
+122	5651 1
+122	5790 1
+122	5936 1
+122	5947 1
+122	6498 1
+122	7553 1
+122	7699 1
+122	8293 1
+122	8294 1
+113	8 1
+113	15 1
+113	28 1
+113	29 1
+113	32 1
+113	56 1
+113	75 1
+113	94 1
+113	95 1
+113	132 1
+113	140 1
+113	152 1
+113	214 1
+113	219 1
+113	228 1
+113	243 1
+113	290 1
+113	339 1
+113	370 1
+113	405 1
+113	428 1
+113	439 1
+113	524 1
+113	686 1
+113	722 1
+113	744 1
+113	762 1
+113	817 1
+113	829 1
+113	838 1
+113	849 1
+113	859 1
+113	868 1
+113	893 1
+113	959 1
+113	981 1
+113	1014 1
+113	1186 1
+113	1248 1
+113	1297 1
+113	1413 1
+113	1453 1
+113	1490 1
+113	1513 1
+113	1563 1
+113	1565 1
+113	1597 1
+113	1633 1
+113	1701 1
+113	1717 1
+113	1842 1
+113	1855 1
+113	2157 1
+113	2264 1
+113	2323 1
+113	2339 1
+113	2410 1
+113	2479 1
+113	2508 1
+113	2576 1
+113	2643 1
+113	2754 1
+113	3034 1
+113	3144 1
+113	3238 1
+113	3439 1
+113	3489 1
+113	3537 1
+113	3586 1
+113	3926 1
+113	4037 1
+113	4820 1
+113	4940 1
+113	5002 1
+113	5022 1
+113	5072 1
+113	5178 1
+113	5484 1
+113	5721 1
+113	5886 1
+113	5936 1
+113	6437 1
+113	6555 1
+113	7651 1
+113	7809 1
+113	7839 1
+113	8285 1
+113	8287 1
+113	8292 1
+123	95 1
+124	95 1
+124	108 1
+124	8283 1
+114	95 1
+130	56 1
+130	86 1
+130	152 1
+130	182 1
+130	271 1
+130	356 1
+130	439 1
+130	650 1
+130	656 1
+130	657 1
+130	733 1
+130	895 1
+130	936 1
+126	29 1
+126	55 1
+126	75 1
+126	86 1
+126	130 1
+126	228 1
+126	271 1
+126	321 1
+126	439 1
+126	447 1
+126	696 1
+126	697 1
+126	733 1
+126	742 1
+126	756 1
+126	789 1
+126	913 1
+126	956 1
+126	989 1
+126	1156 1
+126	1186 1
+126	1297 1
+126	1855 1
+126	2576 1
+126	5022 1
+127	3 1
+127	15 1
+127	28 1
+127	35 1
+127	130 1
+127	144 1
+127	152 1
+127	178 1
+127	204 1
+127	228 1
+127	232 1
+127	252 1
+127	259 1
+127	261 1
+127	271 1
+127	282 1
+127	290 1
+127	325 1
+127	332 1
+127	346 1
+127	379 1
+127	402 1
+127	417 1
+127	431 1
+127	435 1
+127	549 1
+127	584 1
+127	601 1
+127	607 1
+127	616 1
+127	650 1
+127	656 1
+127	700 1
+127	737 1
+127	762 1
+127	805 1
+127	849 1
+127	893 1
+127	956 1
+127	974 1
+127	978 1
+127	982 1
+127	1007 1
+127	1014 1
+127	1026 1
+127	1100 1
+127	1157 1
+127	1159 1
+127	1267 1
+127	1297 1
+127	1385 1
+127	1425 1
+127	1464 1
+127	1744 1
+127	1918 1
+127	1956 1
+127	2066 1
+127	2072 1
+127	2145 1
+127	2237 1
+127	2252 1
+127	2290 1
+127	2323 1
+127	2411 1
+127	2565 1
+127	2576 1
+127	2625 1
+127	2643 1
+127	2652 1
+127	2654 1
+127	2685 1
+127	2687 1
+127	2747 1
+127	2754 1
+127	2790 1
+127	2811 1
+127	2877 1
+127	2928 1
+127	2946 1
+127	2963 1
+127	2977 1
+127	2999 1
+127	3007 1
+127	3009 1
+127	3028 1
+127	3034 1
+127	3089 1
+127	3114 1
+127	3117 1
+127	3180 1
+127	3265 1
+127	3291 1
+127	3351 1
+127	3352 1
+127	3443 1
+127	3456 1
+127	3516 1
+127	3520 1
+127	3537 1
+127	3549 1
+127	3562 1
+127	3567 1
+127	3580 1
+127	3587 1
+127	3615 1
+127	3680 1
+127	3713 1
+127	3769 1
+127	3804 1
+127	3897 1
+127	3976 1
+127	4037 1
+127	4179 1
+127	4234 1
+127	4269 1
+127	4373 1
+127	4424 1
+127	4453 1
+127	4735 1
+127	4811 1
+127	4999 1
+127	5254 1
+127	5404 1
+127	5412 1
+127	5449 1
+127	5928 1
+127	6156 1
+127	7012 1
+127	7632 1
+127	8178 1
+127	8293 1
+127	8294 1
+128	28 1
+128	29 1
+128	86 1
+128	127 1
+128	130 1
+128	214 1
+128	216 1
+128	271 1
+128	348 1
+128	356 1
+128	372 1
+128	379 1
+128	407 1
+128	730 1
+128	761 1
+128	813 1
+128	857 1
+128	864 1
+128	873 1
+128	895 1
+128	904 1
+128	937 1
+128	960 1
+128	993 1
+128	1012 1
+128	1164 1
+128	1166 1
+128	1193 1
+128	1199 1
+128	1234 1
+128	1322 1
+128	1416 1
+128	1428 1
+128	1476 1
+128	1485 1
+128	1496 1
+128	1524 1
+128	1538 1
+128	1549 1
+128	1556 1
+128	1557 1
+128	1613 1
+128	1669 1
+128	1705 1
+128	1714 1
+128	1730 1
+128	1780 1
+128	1787 1
+128	1842 1
+128	1855 1
+128	1888 1
+128	1893 1
+128	1918 1
+128	1950 1
+128	1973 1
+128	2062 1
+128	2069 1
+128	2137 1
+128	2276 1
+128	2290 1
+128	2322 1
+128	2340 1
+128	2366 1
+128	2386 1
+128	2470 1
+128	2625 1
+128	2643 1
+128	2651 1
+128	2654 1
+128	2768 1
+128	2877 1
+128	2900 1
+128	2912 1
+128	2966 1
+128	3117 1
+128	3126 1
+128	3680 1
+128	8290 1
+128	8291 1
+128	8292 1
+129	55 1
+129	130 1
+129	299 1
+129	427 1
+132	19 1
+132	35 1
+132	56 1
+132	144 1
+132	152 1
+132	204 1
+132	271 1
+132	299 1
+132	310 1
+132	325 1
+132	370 1
+132	407 1
+132	428 1
+132	549 1
+132	656 1
+132	730 1
+132	756 1
+132	791 1
+132	829 1
+132	1100 1
+132	1151 1
+132	1374 1
+132	1633 1
+132	1861 1
+132	1864 1
+132	1956 1
+132	2643 1
+132	3769 1
+132	5321 1
+133	135 1
+133	144 1
+133	348 1
+133	349 1
+133	362 1
+133	370 1
+133	373 1
+133	391 1
+133	402 1
+133	7632 1
+134	144 1
+134	601 1
+135	144 1
+135	255 1
+135	310 1
+135	394 1
+135	402 1
+135	589 1
+135	656 1
+136	15 1
+136	19 1
+136	56 1
+136	80 1
+136	132 1
+136	144 1
+136	150 1
+136	178 1
+136	204 1
+136	232 1
+136	243 1
+136	258 1
+136	261 1
+136	349 1
+136	356 1
+136	389 1
+136	431 1
+136	440 1
+136	584 1
+136	739 1
+136	761 1
+136	1211 1
+136	1234 1
+136	1493 1
+136	1549 1
+136	1564 1
+136	1622 1
+136	1633 1
+136	1893 1
+136	1918 1
+136	1956 1
+136	1982 1
+136	1984 1
+136	2066 1
+136	2151 1
+136	2398 1
+136	2535 1
+136	3005 1
+136	3164 1
+136	3297 1
+136	3346 1
+136	3897 1
+136	3919 1
+136	4037 1
+136	4099 1
+136	4191 1
+136	4335 1
+136	4412 1
+136	4530 1
+136	4536 1
+136	4713 1
+136	4717 1
+136	4786 1
+136	4795 1
+136	5140 1
+136	5445 1
+136	5482 1
+136	5484 1
+136	5529 1
+136	5596 1
+136	5683 1
+136	5738 1
+136	5739 1
+136	5824 1
+136	5844 1
+136	5871 1
+136	5872 1
+136	5936 1
+136	5950 1
+136	5980 1
+136	6000 1
+136	6006 1
+136	6262 1
+136	6299 1
+136	6330 1
+136	6441 1
+136	6472 1
+136	6498 1
+136	6505 1
+136	6560 1
+136	6628 1
+136	6634 1
+136	6670 1
+136	6707 1
+136	6725 1
+136	6739 1
+136	6777 1
+136	6805 1
+136	6855 1
+136	6913 1
+136	6938 1
+136	6953 1
+136	6997 1
+136	7050 1
+136	7054 1
+136	7301 1
+136	7442 1
+136	7553 1
+136	7620 1
+137	144 1
+138	3 1
+138	19 1
+138	28 1
+138	36 1
+138	55 1
+138	86 1
+138	89 1
+138	132 1
+138	144 1
+138	151 1
+138	153 1
+138	163 1
+138	168 1
+138	224 1
+138	228 1
+138	236 1
+138	250 1
+138	252 1
+138	255 1
+138	259 1
+138	271 1
+138	274 1
+138	282 1
+138	298 1
+138	308 1
+138	317 1
+138	370 1
+138	373 1
+138	439 1
+138	440 1
+138	488 1
+138	560 1
+138	566 1
+138	590 1
+138	592 1
+138	600 1
+138	637 1
+138	656 1
+138	659 1
+138	663 1
+138	668 1
+138	673 1
+138	681 1
+138	719 1
+138	723 1
+138	730 1
+138	746 1
+138	749 1
+138	798 1
+138	806 1
+138	817 1
+138	849 1
+138	857 1
+138	863 1
+138	868 1
+138	871 1
+138	875 1
+138	941 1
+138	971 1
+138	1125 1
+138	1186 1
+138	1190 1
+138	1192 1
+138	1193 1
+138	1375 1
+138	1413 1
+138	1597 1
+138	1718 1
+138	1726 1
+138	1842 1
+138	2777 1
+138	4661 1
+139	3 1
+139	8 1
+139	28 1
+139	49 1
+139	75 1
+139	86 1
+139	144 1
+139	192 1
+139	228 1
+139	246 1
+139	252 1
+139	271 1
+139	282 1
+139	299 1
+139	302 1
+139	322 1
+139	439 1
+139	440 1
+139	611 1
+139	681 1
+139	741 1
+139	743 1
+139	748 1
+139	756 1
+139	760 1
+139	793 1
+139	802 1
+139	806 1
+139	822 1
+139	829 1
+139	849 1
+139	895 1
+139	958 1
+139	1507 1
+139	2790 1
+139	5459 1
+139	8288 1
+140	34 1
+140	39 1
+140	56 1
+140	80 1
+140	135 1
+140	144 1
+140	226 1
+140	258 1
+140	282 1
+140	339 1
+140	341 1
+140	348 1
+140	349 1
+140	356 1
+140	358 1
+140	359 1
+140	363 1
+140	370 1
+140	379 1
+140	389 1
+140	390 1
+140	396 1
+140	402 1
+140	415 1
+140	428 1
+140	431 1
+140	435 1
+140	590 1
+140	592 1
+140	606 1
+141	144 1
+142	34 1
+142	144 1
+142	147 1
+142	182 1
+142	243 1
+142	271 1
+142	299 1
+142	300 1
+142	301 1
+142	302 1
+142	349 1
+142	359 1
+142	363 1
+142	370 1
+142	371 1
+142	389 1
+142	402 1
+142	407 1
+142	432 1
+142	579 1
+142	682 1
+142	700 1
+142	1014 1
+142	1648 1
+142	1661 1
+143	3 1
+143	19 1
+143	28 1
+143	29 1
+143	35 1
+143	36 1
+143	80 1
+143	132 1
+143	135 1
+143	144 1
+143	171 1
+143	182 1
+143	183 1
+143	204 1
+143	214 1
+143	216 1
+143	226 1
+143	250 1
+143	252 1
+143	271 1
+143	274 1
+143	298 1
+143	299 1
+143	301 1
+143	313 1
+143	317 1
+143	334 1
+143	339 1
+143	363 1
+143	370 1
+143	373 1
+143	377 1
+143	378 1
+143	379 1
+143	390 1
+143	391 1
+143	394 1
+143	396 1
+143	402 1
+143	432 1
+143	559 1
+143	566 1
+143	567 1
+143	590 1
+143	633 1
+143	644 1
+143	647 1
+143	697 1
+143	704 1
+143	710 1
+143	762 1
+143	805 1
+143	817 1
+143	871 1
+143	887 1
+143	918 1
+143	960 1
+143	972 1
+143	991 1
+143	995 1
+143	1032 1
+143	1062 1
+143	1075 1
+143	1211 1
+143	1279 1
+143	1297 1
+143	1330 1
+143	1413 1
+143	1439 1
+143	1476 1
+143	1506 1
+143	1569 1
+143	1573 1
+143	1593 1
+143	1893 1
+143	2135 1
+143	2329 1
+143	2341 1
+143	2474 1
+143	2620 1
+143	2625 1
+143	3631 1
+143	3803 1
+143	4037 1
+143	5288 1
+143	5800 1
+143	5822 1
+143	6004 1
+143	6156 1
+143	6600 1
+143	6634 1
+143	6770 1
+143	6784 1
+143	6979 1
+147	28 1
+147	271 1
+147	304 1
+147	310 1
+147	311 1
+147	319 1
+147	682 1
+147	704 1
+147	737 1
+147	794 1
+147	798 1
+147	820 1
+147	937 1
+147	958 1
+147	966 1
+147	993 1
+147	994 1
+147	1007 1
+147	1014 1
+147	1026 1
+147	1137 1
+147	1185 1
+147	1315 1
+147	1357 1
+147	1378 1
+147	1407 1
+147	1453 1
+147	1566 1
+147	1678 1
+147	1705 1
+147	1729 1
+147	1730 1
+147	1754 1
+147	1955 1
+147	2016 1
+147	2095 1
+147	2341 1
+147	2371 1
+147	2485 1
+147	2516 1
+147	2570 1
+147	2579 1
+147	2801 1
+147	2819 1
+147	2955 1
+147	3026 1
+147	3056 1
+147	3059 1
+147	3643 1
+147	3787 1
+147	3970 1
+147	4310 1
+147	4365 1
+147	4384 1
+147	5412 1
+147	5430 1
+147	7092 1
+147	8295 1
+145	147 1
+145	214 1
+145	271 1
+145	391 1
+145	626 1
+145	717 1
+145	769 1
+145	1080 1
+145	1248 1
+145	1297 1
+145	1321 1
+145	1377 1
+145	1484 1
+145	1485 1
+145	1569 1
+145	1633 1
+145	5189 1
+145	6720 1
+146	147 1
+151	28 1
+151	29 1
+151	80 1
+151	86 1
+151	171 1
+151	182 1
+151	228 1
+151	236 1
+151	246 1
+151	271 1
+151	308 1
+151	322 1
+151	338 1
+151	402 1
+151	407 1
+151	549 1
+151	637 1
+151	643 1
+151	659 1
+151	663 1
+151	682 1
+151	707 1
+151	719 1
+151	723 1
+151	733 1
+151	749 1
+151	762 1
+151	806 1
+151	837 1
+151	844 1
+151	857 1
+151	863 1
+151	878 1
+151	887 1
+151	893 1
+151	895 1
+151	897 1
+151	906 1
+151	913 1
+151	918 1
+151	930 1
+151	936 1
+151	938 1
+151	941 1
+151	942 1
+151	945 1
+151	955 1
+151	956 1
+151	958 1
+151	966 1
+151	972 1
+151	989 1
+151	994 1
+151	1123 1
+151	1125 1
+151	1128 1
+151	1140 1
+151	1141 1
+151	1248 1
+151	1416 1
+151	1471 1
+151	1489 1
+151	1520 1
+151	1633 1
+151	1638 1
+151	1648 1
+151	1649 1
+151	1652 1
+151	1654 1
+151	1661 1
+151	1662 1
+151	2508 1
+151	3970 1
+151	8288 1
+149	151 1
+152	28 1
+152	35 1
+152	50 1
+152	55 1
+152	56 1
+152	75 1
+152	182 1
+152	192 1
+152	214 1
+152	252 1
+152	514 1
+152	567 1
+152	581 1
+152	586 1
+152	589 1
+152	656 1
+152	665 1
+152	667 1
+152	677 1
+152	1077 1
+152	8287 1
+153	50 1
+154	15 1
+154	23 1
+154	28 1
+154	29 1
+154	39 1
+154	50 1
+154	80 1
+154	151 1
+154	153 1
+154	168 1
+154	171 1
+154	178 1
+154	204 1
+154	224 1
+154	243 1
+154	252 1
+154	282 1
+154	304 1
+154	306 1
+154	308 1
+154	310 1
+154	322 1
+154	348 1
+154	370 1
+154	377 1
+154	402 1
+154	405 1
+154	407 1
+154	415 1
+154	439 1
+154	549 1
+154	609 1
+154	617 1
+154	636 1
+154	733 1
+154	750 1
+154	795 1
+154	829 1
+154	857 1
+154	895 1
+154	958 1
+154	989 1
+154	1053 1
+154	1123 1
+154	1211 1
+154	1279 1
+154	1297 1
+154	1413 1
+154	1464 1
+154	1514 1
+154	1628 1
+154	1718 1
+154	1956 1
+154	2151 1
+154	2339 1
+154	4310 1
+154	4531 1
+154	4875 1
+154	5886 1
+154	7050 1
+154	8282 1
+155	15 1
+155	50 1
+155	75 1
+155	89 1
+155	105 1
+155	214 1
+155	928 1
+155	2398 1
+155	3459 1
+155	5079 1
+155	5529 1
+155	5745 1
+155	6665 1
+155	6923 1
+155	6993 1
+155	7116 1
+155	7400 1
+155	7493 1
+155	7587 1
+155	7604 1
+155	7647 1
+155	7648 1
+155	7651 1
+155	7652 1
+155	7672 1
+155	7701 1
+155	7921 1
+155	7927 1
+156	50 1
+156	163 1
+156	168 1
+156	259 1
+157	23 1
+157	29 1
+157	50 1
+157	56 1
+157	140 1
+157	182 1
+157	204 1
+157	243 1
+157	271 1
+157	290 1
+157	311 1
+157	313 1
+157	325 1
+157	396 1
+157	407 1
+157	435 1
+157	626 1
+157	663 1
+157	696 1
+157	697 1
+157	704 1
+157	707 1
+157	743 1
+157	756 1
+157	762 1
+157	857 1
+157	885 1
+157	893 1
+157	955 1
+157	966 1
+157	994 1
+157	1014 1
+157	1053 1
+157	1055 1
+157	1114 1
+157	1123 1
+157	1156 1
+157	1166 1
+157	1297 1
+157	1487 1
+157	1556 1
+157	2657 1
+157	2979 1
+157	3506 1
+158	28 1
+158	75 1
+158	152 1
+158	153 1
+158	477 1
+158	514 1
+158	1439 1
+159	153 1
+160	153 1
+161	28 1
+161	55 1
+161	75 1
+161	153 1
+161	154 1
+161	299 1
+161	334 1
+161	677 1
+161	941 1
+161	963 1
+161	978 1
+161	989 1
+161	1127 1
+161	1131 1
+161	1201 1
+161	1232 1
+161	1240 1
+161	1418 1
+161	1425 1
+161	1435 1
+161	1484 1
+161	1585 1
+161	1633 1
+161	1718 1
+161	1754 1
+161	2151 1
+161	2474 1
+161	2579 1
+161	2619 1
+161	2625 1
+161	2801 1
+161	3429 1
+162	89 1
+162	168 1
+162	246 1
+162	300 1
+163	271 1
+163	1284 1
+163	1285 1
+163	1286 1
+163	1726 1
+163	1965 1
+163	2871 1
+163	6691 1
+163	6875 1
+165	39 1
+165	152 1
+165	167 1
+168	299 1
+168	302 1
+168	663 1
+168	742 1
+168	789 1
+168	857 1
+168	875 1
+168	993 1
+168	3027 1
+171	23 1
+171	35 1
+171	227 1
+171	230 1
+171	299 1
+171	432 1
+171	545 1
+171	559 1
+171	575 1
+171	579 1
+171	644 1
+171	663 1
+171	705 1
+171	762 1
+171	803 1
+171	853 1
+171	857 1
+171	887 1
+171	904 1
+171	907 1
+171	930 1
+171	960 1
+171	982 1
+171	1000 1
+171	1022 1
+171	1035 1
+171	1043 1
+171	1062 1
+171	1125 1
+171	1140 1
+171	1152 1
+171	1154 1
+171	1156 1
+171	1186 1
+171	1190 1
+171	1192 1
+171	1193 1
+171	1196 1
+171	1211 1
+171	1218 1
+171	1220 1
+171	1240 1
+171	1241 1
+171	1259 1
+171	1286 1
+171	1297 1
+171	1330 1
+171	1382 1
+171	1389 1
+171	1394 1
+171	1402 1
+171	1413 1
+171	1464 1
+171	1476 1
+171	1484 1
+171	1487 1
+171	1501 1
+171	1524 1
+171	1532 1
+171	1549 1
+171	1556 1
+171	1619 1
+171	1638 1
+171	1689 1
+171	1692 1
+171	1726 1
+171	1746 1
+171	1768 1
+171	1771 1
+171	4689 1
+172	23 1
+172	214 1
+172	246 1
+172	285 1
+172	290 1
+172	391 1
+172	417 1
+172	477 1
+172	743 1
+172	744 1
+172	756 1
+172	761 1
+172	762 1
+172	856 1
+172	873 1
+172	878 1
+172	975 1
+172	993 1
+172	1012 1
+172	1166 1
+172	1211 1
+172	1243 1
+172	1267 1
+172	1297 1
+172	1357 1
+172	1374 1
+172	1384 1
+172	1549 1
+172	1571 1
+172	1633 1
+172	1679 1
+172	1717 1
+172	1734 1
+172	1754 1
+172	1757 1
+172	1792 1
+172	1814 1
+172	1919 1
+172	1972 1
+172	2016 1
+172	2062 1
+172	2066 1
+172	2135 1
+172	2211 1
+172	2225 1
+172	2240 1
+172	2273 1
+172	2297 1
+172	2307 1
+172	2323 1
+172	2324 1
+172	2325 1
+172	2338 1
+172	2345 1
+172	2348 1
+172	2356 1
+172	2385 1
+172	2397 1
+172	2398 1
+172	2411 1
+172	2470 1
+172	2508 1
+172	2510 1
+172	2542 1
+172	2550 1
+172	2576 1
+172	2623 1
+172	2625 1
+172	2651 1
+172	2653 1
+172	2654 1
+172	2660 1
+172	2662 1
+172	2686 1
+172	2693 1
+172	2700 1
+172	2708 1
+172	2724 1
+172	2819 1
+172	2830 1
+172	2859 1
+172	2951 1
+172	2958 1
+172	2966 1
+172	2973 1
+172	3009 1
+172	3018 1
+172	3020 1
+172	3030 1
+172	3089 1
+172	3099 1
+172	3117 1
+172	3126 1
+172	3140 1
+172	3150 1
+172	3164 1
+172	3173 1
+172	3243 1
+172	3251 1
+172	3253 1
+172	3307 1
+172	3338 1
+172	3371 1
+172	3408 1
+172	3435 1
+172	3473 1
+172	3489 1
+172	3506 1
+172	3516 1
+172	3529 1
+172	3580 1
+172	3587 1
+172	3614 1
+172	3670 1
+172	3812 1
+172	3892 1
+172	4798 1
+172	4994 1
+172	6441 1
+172	6498 1
+172	6634 1
+172	8291 1
+172	8293 1
+175	55 1
+173	15 1
+173	35 1
+173	86 1
+173	175 1
+173	214 1
+173	227 1
+173	230 1
+173	259 1
+173	271 1
+173	298 1
+173	299 1
+173	304 1
+173	311 1
+173	313 1
+173	314 1
+173	317 1
+173	321 1
+173	322 1
+173	334 1
+173	346 1
+173	372 1
+173	415 1
+173	432 1
+173	447 1
+173	559 1
+173	560 1
+173	575 1
+173	579 1
+173	587 1
+173	600 1
+173	626 1
+173	644 1
+173	647 1
+173	665 1
+173	691 1
+173	697 1
+173	704 1
+173	733 1
+173	742 1
+173	762 1
+173	763 1
+173	764 1
+173	769 1
+173	771 1
+173	789 1
+173	794 1
+173	803 1
+173	805 1
+173	813 1
+173	817 1
+173	820 1
+173	823 1
+173	836 1
+173	853 1
+173	857 1
+173	861 1
+173	871 1
+173	873 1
+173	887 1
+173	895 1
+173	904 1
+173	907 1
+173	908 1
+173	913 1
+173	918 1
+173	922 1
+173	935 1
+173	937 1
+173	941 1
+173	945 1
+173	946 1
+173	947 1
+173	948 1
+173	955 1
+173	958 1
+173	959 1
+173	960 1
+173	971 1
+173	972 1
+173	975 1
+173	979 1
+173	993 1
+173	995 1
+173	999 1
+173	1000 1
+173	1007 1
+173	1022 1
+173	1023 1
+173	1026 1
+173	1031 1
+173	1032 1
+173	1034 1
+173	1035 1
+173	1053 1
+173	1055 1
+173	1061 1
+173	1075 1
+173	1103 1
+173	1111 1
+173	1123 1
+173	1124 1
+173	1127 1
+173	1137 1
+173	1151 1
+173	1167 1
+173	1168 1
+173	1186 1
+173	1190 1
+173	1193 1
+173	1196 1
+173	1199 1
+173	1200 1
+173	1201 1
+173	1211 1
+173	1218 1
+173	1222 1
+173	1230 1
+173	1234 1
+173	1236 1
+173	1243 1
+173	1248 1
+173	1253 1
+173	1267 1
+173	1279 1
+173	1285 1
+173	1286 1
+173	1296 1
+173	1297 1
+173	1319 1
+173	1322 1
+173	1353 1
+173	1357 1
+173	1360 1
+173	1372 1
+173	1375 1
+173	1377 1
+173	1378 1
+173	1389 1
+173	1394 1
+173	1396 1
+173	1402 1
+173	1407 1
+173	1412 1
+173	1413 1
+173	1428 1
+173	1439 1
+173	1444 1
+173	1446 1
+173	1464 1
+173	1465 1
+173	1468 1
+173	1471 1
+173	1476 1
+173	1482 1
+173	1489 1
+173	1490 1
+173	1496 1
+173	1501 1
+173	1506 1
+173	1514 1
+173	1518 1
+173	1520 1
+173	1524 1
+173	1525 1
+173	1531 1
+173	1534 1
+173	1537 1
+173	1542 1
+173	1547 1
+173	1550 1
+173	1556 1
+173	1563 1
+173	1565 1
+173	1566 1
+173	1580 1
+173	1583 1
+173	1585 1
+173	1587 1
+173	1593 1
+173	1595 1
+173	1603 1
+173	1604 1
+173	1613 1
+173	1618 1
+173	1619 1
+173	1621 1
+173	1628 1
+173	1629 1
+173	1633 1
+173	1638 1
+173	1641 1
+173	1649 1
+173	1652 1
+173	1654 1
+173	1658 1
+173	1661 1
+173	1662 1
+173	1672 1
+173	1689 1
+173	1692 1
+173	1697 1
+173	1701 1
+173	1707 1
+173	1714 1
+173	1717 1
+173	1726 1
+173	1730 1
+173	1732 1
+173	1746 1
+173	1747 1
+173	1752 1
+173	1758 1
+173	1772 1
+173	1774 1
+173	1783 1
+173	1787 1
+173	1788 1
+173	1791 1
+173	1798 1
+173	1802 1
+173	1805 1
+173	1808 1
+173	1811 1
+173	1836 1
+173	1842 1
+173	1848 1
+173	1849 1
+173	1855 1
+173	1880 1
+173	1901 1
+173	1903 1
+173	1908 1
+173	1956 1
+173	1977 1
+173	1983 1
+173	1985 1
+173	1991 1
+173	1997 1
+173	2062 1
+173	2066 1
+173	2071 1
+173	2073 1
+173	2079 1
+173	2085 1
+173	2091 1
+173	2095 1
+173	2097 1
+173	2106 1
+173	2109 1
+173	2119 1
+173	2128 1
+173	2137 1
+173	2145 1
+173	2151 1
+173	2157 1
+173	2165 1
+173	2168 1
+173	2181 1
+173	2193 1
+173	2202 1
+173	2210 1
+173	2211 1
+173	2237 1
+173	2241 1
+173	2246 1
+173	2253 1
+173	2273 1
+173	2276 1
+173	2328 1
+173	2329 1
+173	2333 1
+173	2339 1
+173	2341 1
+173	2345 1
+173	2348 1
+173	2350 1
+173	2381 1
+173	2385 1
+173	2397 1
+173	2400 1
+173	2504 1
+173	2516 1
+173	2774 1
+173	2787 1
+173	2871 1
+173	3002 1
+173	3136 1
+173	3238 1
+173	3408 1
+173	3443 1
+173	3452 1
+173	3456 1
+173	3537 1
+173	3643 1
+173	3830 1
+173	3843 1
+173	3897 1
+173	3910 1
+173	3976 1
+173	4037 1
+173	4124 1
+173	4310 1
+173	4709 1
+173	4828 1
+173	4875 1
+173	5026 1
+173	5028 1
+173	5037 1
+173	5055 1
+173	5100 1
+173	5106 1
+173	5130 1
+173	5254 1
+173	5335 1
+173	5484 1
+173	5511 1
+173	5714 1
+173	5760 1
+173	5799 1
+173	6006 1
+173	6043 1
+173	6098 1
+173	6151 1
+173	6269 1
+173	6414 1
+173	6606 1
+173	6833 1
+173	6994 1
+173	7092 1
+173	7649 1
+173	7809 1
+173	7813 1
+173	8290 1
+173	8291 1
+174	175 1
+74	28 1
+74	29 1
+74	35 1
+74	49 1
+74	55 1
+74	56 1
+74	75 1
+74	86 1
+74	154 1
+74	178 1
+74	228 1
+74	252 1
+74	257 1
+74	271 1
+74	285 1
+74	299 1
+74	304 1
+74	317 1
+74	321 1
+74	334 1
+74	356 1
+74	447 1
+74	488 1
+74	626 1
+74	637 1
+74	643 1
+74	665 1
+74	682 1
+74	710 1
+74	749 1
+74	769 1
+74	784 1
+74	789 1
+74	794 1
+74	803 1
+74	806 1
+74	817 1
+74	863 1
+74	864 1
+74	893 1
+74	895 1
+74	918 1
+74	922 1
+74	937 1
+74	955 1
+74	956 1
+74	958 1
+74	960 1
+74	993 1
+74	995 1
+74	1026 1
+74	1053 1
+74	1111 1
+74	1123 1
+74	1186 1
+74	1190 1
+74	1284 1
+74	1297 1
+74	1330 1
+74	1583 1
+74	1633 1
+74	1811 1
+74	1836 1
+74	1927 1
+74	2004 1
+74	2119 1
+74	2181 1
+74	3117 1
+74	8290 1
+176	19 1
+176	29 1
+176	35 1
+176	154 1
+176	271 1
+176	334 1
+176	432 1
+176	647 1
+176	710 1
+176	805 1
+176	857 1
+176	871 1
+176	922 1
+176	948 1
+176	960 1
+176	1043 1
+176	1123 1
+176	1131 1
+176	1156 1
+176	1160 1
+176	1167 1
+176	1186 1
+176	1190 1
+176	1201 1
+176	1218 1
+176	1222 1
+176	1234 1
+176	1375 1
+176	1413 1
+176	1428 1
+176	1464 1
+176	1465 1
+176	1468 1
+176	1476 1
+176	1520 1
+176	1531 1
+176	1537 1
+176	1593 1
+176	1603 1
+177	56 1
+177	135 1
+177	183 1
+177	214 1
+177	228 1
+177	372 1
+177	427 1
+177	677 1
+177	739 1
+177	820 1
+177	849 1
+177	968 1
+177	972 1
+177	1186 1
+177	1514 1
+177	1592 1
+177	1593 1
+177	1718 1
+177	6496 1
+178	3 1
+178	72 1
+178	182 1
+178	183 1
+178	228 1
+178	271 1
+178	282 1
+178	313 1
+178	371 1
+178	396 1
+178	405 1
+178	429 1
+178	560 1
+178	564 1
+178	590 1
+178	600 1
+178	606 1
+178	616 1
+178	673 1
+178	704 1
+178	719 1
+178	723 1
+178	730 1
+178	741 1
+178	798 1
+178	817 1
+178	829 1
+178	838 1
+178	844 1
+178	866 1
+178	895 1
+178	906 1
+178	958 1
+178	983 1
+178	993 1
+178	994 1
+178	1014 1
+178	1185 1
+178	1482 1
+178	1733 1
+178	1799 1
+178	1893 1
+178	1966 1
+178	2073 1
+178	2145 1
+178	2210 1
+178	2381 1
+178	2398 1
+178	3634 1
+178	3755 1
+178	3897 1
+178	4297 1
+178	4483 1
+178	4578 1
+178	4646 1
+178	4715 1
+178	5412 1
+178	5684 1
+178	5804 1
+178	6006 1
+178	6098 1
+178	7699 1
+178	8288 1
+179	135 1
+179	183 1
+179	301 1
+179	304 1
+179	306 1
+179	308 1
+179	348 1
+179	349 1
+179	407 1
+179	549 1
+179	673 1
+179	739 1
+179	756 1
+179	761 1
+179	829 1
+179	977 1
+179	989 1
+180	3 1
+180	80 1
+180	132 1
+180	135 1
+180	182 1
+180	183 1
+180	216 1
+180	271 1
+180	274 1
+180	299 1
+180	349 1
+180	370 1
+180	402 1
+180	677 1
+180	908 1
+180	1026 1
+180	1031 1
+180	1100 1
+180	1166 1
+180	1203 1
+180	1218 1
+180	1222 1
+180	1284 1
+180	1425 1
+180	1464 1
+180	1476 1
+180	1542 1
+180	1622 1
+180	1701 1
+180	1754 1
+180	1858 1
+180	1956 1
+180	2114 1
+180	2246 1
+180	2325 1
+180	2517 1
+180	2542 1
+180	2597 1
+180	2604 1
+180	2625 1
+180	2643 1
+180	2657 1
+180	2720 1
+180	2727 1
+180	2777 1
+180	3010 1
+180	3089 1
+180	3136 1
+180	3265 1
+180	3480 1
+180	3567 1
+180	3587 1
+180	3681 1
+180	5563 1
+181	183 1
+181	214 1
+181	271 1
+182	56 1
+182	86 1
+182	183 1
+182	204 1
+182	243 1
+182	271 1
+182	299 1
+182	310 1
+182	405 1
+182	407 1
+182	427 1
+182	432 1
+182	590 1
+182	600 1
+182	644 1
+182	647 1
+182	650 1
+182	656 1
+182	659 1
+182	667 1
+182	694 1
+182	723 1
+182	750 1
+182	762 1
+182	805 1
+182	857 1
+182	878 1
+182	895 1
+182	966 1
+182	971 1
+182	972 1
+182	977 1
+182	982 1
+182	993 1
+182	1006 1
+182	1007 1
+182	1026 1
+182	1043 1
+182	1092 1
+182	1127 1
+182	1128 1
+182	1131 1
+182	1151 1
+182	1156 1
+182	1167 1
+182	1186 1
+182	1297 1
+182	1305 1
+182	1357 1
+182	1374 1
+182	1396 1
+182	1416 1
+182	1464 1
+182	1473 1
+182	1484 1
+182	1525 1
+182	1569 1
+182	1718 1
+182	1754 1
+182	1864 1
+182	1919 1
+182	2328 1
+182	2329 1
+182	2625 1
+182	2653 1
+182	2696 1
+182	2697 1
+182	2774 1
+182	2775 1
+182	2777 1
+182	3192 1
+182	3251 1
+182	3253 1
+182	3537 1
+182	3787 1
+182	4037 1
+182	4256 1
+182	6400 1
+182	7620 1
+166	28 1
+166	35 1
+166	75 1
+166	86 1
+166	152 1
+166	171 1
+166	204 1
+166	214 1
+166	243 1
+166	259 1
+166	261 1
+166	271 1
+166	273 1
+166	274 1
+166	290 1
+166	304 1
+166	417 1
+166	439 1
+166	465 1
+166	545 1
+166	647 1
+166	659 1
+166	673 1
+166	733 1
+166	789 1
+166	829 1
+166	837 1
+166	838 1
+166	859 1
+166	897 1
+166	908 1
+166	959 1
+166	1157 1
+166	1211 1
+166	1248 1
+166	1279 1
+166	1297 1
+166	1307 1
+166	1484 1
+166	1493 1
+166	1585 1
+166	1705 1
+166	1935 1
+166	1956 1
+166	1990 1
+166	2066 1
+166	2276 1
+166	2398 1
+166	2411 1
+166	2565 1
+166	2843 1
+166	2877 1
+166	3005 1
+166	3459 1
+166	3562 1
+166	3650 1
+166	3946 1
+166	4037 1
+166	4191 1
+166	4233 1
+166	4463 1
+166	4875 1
+166	5002 1
+166	5210 1
+166	5246 1
+166	5254 1
+166	5288 1
+166	5738 1
+166	5800 1
+166	6004 1
+166	6044 1
+166	6156 1
+166	6305 1
+166	6330 1
+166	6523 1
+166	6560 1
+166	6833 1
+166	6855 1
+166	6945 1
+166	6948 1
+166	7574 1
+166	7695 1
+166	7699 1
+166	7924 1
+166	7961 1
+166	8079 1
+166	8083 1
+166	8132 1
+166	8134 1
+166	8141 1
+166	8163 1
+166	8198 1
+166	8294 1
+185	214 1
+185	321 1
+185	1679 1
+185	2625 1
+194	214 1
+194	259 1
+194	368 1
+194	1497 1
+194	2585 1
+187	28 1
+187	29 1
+187	36 1
+187	86 1
+187	135 1
+187	214 1
+187	228 1
+187	243 1
+187	285 1
+187	322 1
+187	348 1
+187	373 1
+187	394 1
+187	415 1
+187	545 1
+187	600 1
+187	601 1
+187	657 1
+187	658 1
+187	664 1
+187	706 1
+187	733 1
+187	739 1
+187	760 1
+187	761 1
+187	779 1
+187	932 1
+187	977 1
+187	989 1
+187	1151 1
+187	1211 1
+187	1573 1
+187	1638 1
+187	2290 1
+187	2323 1
+187	4384 1
+187	8291 1
+188	214 1
+188	1808 1
+188	2713 1
+32	75 1
+32	214 1
+32	368 1
+32	517 1
+189	214 1
+196	214 1
+190	214 1
+190	370 1
+197	152 1
+197	214 1
+197	259 1
+197	324 1
+197	741 1
+197	1075 1
+197	1080 1
+197	1111 1
+197	1353 1
+197	2060 1
+197	2595 1
+195	214 1
+198	214 1
+199	214 1
+199	579 1
+199	963 1
+199	1186 1
+199	1407 1
+199	1412 1
+199	1471 1
+199	1520 1
+199	1603 1
+199	1633 1
+199	1662 1
+199	2721 1
+199	5671 1
+199	6784 1
+199	7279 1
+199	7442 1
+199	7795 1
+191	214 1
+191	259 1
+191	271 1
+191	372 1
+191	802 1
+191	829 1
+191	959 1
+191	1164 1
+191	1165 1
+191	1842 1
+191	1855 1
+191	1893 1
+191	1969 1
+200	214 1
+201	36 1
+201	55 1
+201	75 1
+201	80 1
+201	214 1
+201	252 1
+201	271 1
+201	282 1
+201	549 1
+201	681 1
+201	705 1
+201	706 1
+201	760 1
+201	817 1
+201	823 1
+201	956 1
+201	1023 1
+201	1026 1
+201	1043 1
+201	1123 1
+201	1186 1
+202	28 1
+202	135 1
+202	214 1
+202	300 1
+202	301 1
+202	427 1
+203	214 1
+203	259 1
+203	299 1
+203	407 1
+203	600 1
+203	829 1
+203	1075 1
+203	1111 1
+203	1717 1
+203	1808 1
+203	1842 1
+203	1855 1
+203	1956 1
+203	2398 1
+203	2456 1
+203	2470 1
+203	2516 1
+203	2542 1
+203	2576 1
+203	2595 1
+203	2660 1
+203	3018 1
+203	3192 1
+203	3352 1
+203	3835 1
+203	3903 1
+203	4276 1
+203	4338 1
+203	5123 1
+203	5254 1
+203	5423 1
+204	214 1
+204	439 1
+204	611 1
+204	756 1
+204	1151 1
+204	1165 1
+204	1608 1
+204	1718 1
+204	1787 1
+204	2151 1
+204	2211 1
+204	3516 1
+205	86 1
+205	140 1
+205	150 1
+205	152 1
+205	214 1
+205	282 1
+205	600 1
+205	613 1
+205	616 1
+205	658 1
+205	659 1
+205	1285 1
+206	214 1
+207	214 1
+208	28 1
+208	214 1
+208	219 1
+208	626 1
+208	771 1
+208	6156 1
+209	214 1
+209	259 1
+209	271 1
+209	626 1
+209	686 1
+209	696 1
+209	697 1
+209	1123 1
+209	1186 1
+209	1190 1
+192	28 1
+192	39 1
+192	56 1
+192	75 1
+192	94 1
+192	214 1
+192	308 1
+192	379 1
+192	406 1
+192	432 1
+192	549 1
+192	586 1
+192	600 1
+192	756 1
+192	857 1
+192	932 1
+192	936 1
+192	8283 1
+192	8287 1
+210	214 1
+125	28 1
+125	29 1
+125	35 1
+125	36 1
+125	55 1
+125	214 1
+125	271 1
+125	299 1
+125	302 1
+125	313 1
+125	317 1
+125	321 1
+125	488 1
+125	517 1
+125	637 1
+125	704 1
+125	710 1
+125	730 1
+125	784 1
+125	937 1
+125	959 1
+125	960 1
+125	1014 1
+125	1167 1
+125	1218 1
+125	1286 1
+125	1966 1
+125	8283 1
+125	8287 1
+216	86 1
+216	321 1
+216	895 1
+216	1418 1
+216	1453 1
+216	3634 1
+216	4735 1
+216	5412 1
+215	28 1
+215	35 1
+215	94 1
+215	178 1
+215	192 1
+215	216 1
+215	252 1
+215	257 1
+215	271 1
+215	282 1
+215	298 1
+215	299 1
+215	306 1
+215	310 1
+215	321 1
+215	332 1
+215	348 1
+215	350 1
+215	368 1
+215	506 1
+215	517 1
+215	559 1
+215	636 1
+215	663 1
+215	684 1
+215	687 1
+215	784 1
+215	836 1
+215	904 1
+215	943 1
+215	956 1
+215	985 1
+215	993 1
+215	994 1
+215	1018 1
+215	1103 1
+215	1124 1
+215	1141 1
+215	1156 1
+215	1186 1
+215	1193 1
+215	1199 1
+215	1261 1
+215	1297 1
+215	1322 1
+215	1374 1
+215	1375 1
+215	1482 1
+215	1487 1
+215	1492 1
+215	1496 1
+215	1514 1
+215	1521 1
+215	1608 1
+215	1610 1
+215	1628 1
+215	1700 1
+215	1726 1
+215	1732 1
+215	1746 1
+215	1747 1
+215	1758 1
+215	1768 1
+215	1771 1
+215	1774 1
+215	1783 1
+215	1788 1
+215	1791 1
+215	1798 1
+215	1802 1
+215	1805 1
+215	1811 1
+215	1842 1
+215	1848 1
+215	1849 1
+215	1903 1
+215	1964 1
+215	1966 1
+215	2195 1
+215	2234 1
+215	2240 1
+215	2241 1
+215	2242 1
+215	2332 1
+215	2378 1
+215	2400 1
+215	2409 1
+215	2499 1
+215	2504 1
+215	2570 1
+215	2619 1
+215	2625 1
+215	2685 1
+215	2736 1
+215	2754 1
+215	2801 1
+215	3755 1
+215	8283 1
+215	8290 1
+215	8291 1
+217	219 1
+221	28 1
+221	135 1
+221	282 1
+221	339 1
+221	341 1
+221	348 1
+221	390 1
+221	402 1
+221	590 1
+221	604 1
+222	28 1
+222	348 1
+222	1151 1
+222	1919 1
+223	3 1
+223	28 1
+223	80 1
+223	226 1
+223	257 1
+223	301 1
+223	325 1
+223	341 1
+223	348 1
+223	356 1
+223	358 1
+223	406 1
+223	415 1
+223	422 1
+223	427 1
+223	590 1
+223	607 1
+223	636 1
+223	882 1
+224	28 1
+224	152 1
+224	271 1
+224	282 1
+224	402 1
+224	407 1
+224	765 1
+224	806 1
+224	857 1
+224	994 1
+224	1633 1
+224	1793 1
+224	2066 1
+225	28 1
+226	28 1
+226	55 1
+226	72 1
+226	298 1
+226	322 1
+226	407 1
+226	432 1
+226	439 1
+226	789 1
+226	937 1
+226	966 1
+226	977 1
+226	989 1
+226	1014 1
+226	1151 1
+226	1152 1
+226	1192 1
+226	1322 1
+226	1497 1
+226	1569 1
+226	1573 1
+226	1997 1
+226	2775 1
+226	2777 1
+226	6437 1
+240	28 1
+240	637 1
+240	857 1
+240	1151 1
+240	1152 1
+227	28 1
+227	35 1
+227	271 1
+227	407 1
+227	1497 1
+228	28 1
+228	282 1
+228	299 1
+228	391 1
+228	415 1
+228	1484 1
+242	28 1
+242	407 1
+243	28 1
+243	250 1
+244	28 1
+244	56 1
+244	1920 1
+244	1973 1
+245	28 1
+245	56 1
+245	243 1
+246	28 1
+247	28 1
+247	232 1
+247	274 1
+247	300 1
+247	341 1
+247	415 1
+247	421 1
+247	422 1
+247	427 1
+247	428 1
+247	435 1
+230	28 1
+230	171 1
+230	298 1
+230	559 1
+230	1610 1
+230	1701 1
+231	28 1
+231	35 1
+231	86 1
+231	94 1
+231	132 1
+231	175 1
+231	178 1
+231	228 1
+231	236 1
+231	255 1
+231	271 1
+231	280 1
+231	299 1
+231	300 1
+231	321 1
+231	379 1
+231	391 1
+231	396 1
+231	402 1
+231	439 1
+231	549 1
+231	560 1
+231	600 1
+231	611 1
+231	613 1
+231	617 1
+231	650 1
+231	656 1
+231	657 1
+231	673 1
+231	686 1
+231	739 1
+231	756 1
+231	956 1
+231	1080 1
+231	1193 1
+231	1396 1
+231	1473 1
+231	1855 1
+231	1861 1
+231	1864 1
+231	2097 1
+231	2398 1
+231	4338 1
+231	5226 1
+231	5263 1
+231	5737 1
+231	5743 1
+231	6930 1
+231	7553 1
+232	28 1
+232	34 1
+232	178 1
+232	228 1
+232	271 1
+232	282 1
+232	402 1
+232	600 1
+232	619 1
+232	665 1
+232	737 1
+232	739 1
+232	742 1
+232	849 1
+232	857 1
+232	960 1
+232	1023 1
+232	1297 1
+232	1563 1
+232	1842 1
+232	1855 1
+232	3192 1
+232	5254 1
+233	28 1
+234	28 1
+235	28 1
+235	271 1
+236	28 1
+236	80 1
+236	94 1
+236	150 1
+236	151 1
+236	178 1
+236	182 1
+236	232 1
+236	257 1
+236	271 1
+236	282 1
+236	300 1
+236	306 1
+236	308 1
+236	310 1
+236	319 1
+236	325 1
+236	348 1
+236	349 1
+236	356 1
+236	406 1
+236	428 1
+236	581 1
+236	586 1
+236	590 1
+236	592 1
+236	600 1
+236	611 1
+236	622 1
+236	636 1
+236	656 1
+236	684 1
+236	725 1
+236	746 1
+236	749 1
+236	844 1
+236	857 1
+236	1679 1
+236	2625 1
+237	28 1
+237	56 1
+237	75 1
+237	178 1
+237	271 1
+237	282 1
+237	373 1
+237	391 1
+237	465 1
+237	560 1
+237	581 1
+237	587 1
+237	636 1
+237	746 1
+237	765 1
+237	1034 1
+237	1315 1
+237	1374 1
+237	1646 1
+237	1798 1
+237	1855 1
+237	1956 1
+237	2102 1
+237	2470 1
+237	2754 1
+237	2763 1
+237	2768 1
+237	2794 1
+237	2805 1
+237	2809 1
+237	2814 1
+237	2828 1
+237	2838 1
+237	3334 1
+237	4037 1
+237	5254 1
+237	6229 1
+237	6417 1
+237	6780 1
+237	7414 1
+237	8121 1
+248	28 1
+238	28 1
+238	358 1
+238	2517 1
+239	28 1
+169	28 1
+169	80 1
+169	257 1
+257	19 1
+257	132 1
+257	271 1
+257	302 1
+257	377 1
+257	937 1
+257	977 1
+257	981 1
+253	257 1
+254	55 1
+254	75 1
+254	105 1
+254	150 1
+254	228 1
+254	246 1
+254	257 1
+254	313 1
+254	677 1
+254	682 1
+254	706 1
+254	715 1
+254	739 1
+254	756 1
+254	857 1
+254	864 1
+254	881 1
+254	895 1
+254	1014 1
+254	1186 1
+254	1190 1
+254	1200 1
+254	1287 1
+254	1612 1
+254	1718 1
+255	29 1
+255	35 1
+255	36 1
+255	56 1
+255	257 1
+255	259 1
+255	271 1
+255	280 1
+255	282 1
+255	299 1
+255	306 1
+255	310 1
+255	317 1
+255	319 1
+255	325 1
+255	371 1
+255	405 1
+255	432 1
+255	439 1
+255	549 1
+255	564 1
+255	567 1
+255	581 1
+255	600 1
+255	606 1
+255	607 1
+255	608 1
+255	624 1
+255	627 1
+255	628 1
+255	631 1
+255	633 1
+255	636 1
+255	637 1
+255	643 1
+255	656 1
+255	657 1
+255	658 1
+255	659 1
+255	667 1
+255	668 1
+255	673 1
+255	675 1
+255	677 1
+255	681 1
+255	697 1
+255	706 1
+255	719 1
+255	723 1
+255	725 1
+255	730 1
+255	739 1
+255	741 1
+255	743 1
+255	746 1
+255	748 1
+255	749 1
+255	756 1
+255	760 1
+255	763 1
+255	765 1
+255	779 1
+255	789 1
+255	798 1
+255	817 1
+255	864 1
+255	878 1
+255	893 1
+255	993 1
+255	1123 1
+255	1166 1
+255	1286 1
+255	1482 1
+255	1487 1
+255	1538 1
+255	1573 1
+255	1893 1
+255	1956 1
+255	1966 1
+255	1992 1
+255	2066 1
+255	2595 1
+255	2625 1
+255	2834 1
+255	2859 1
+255	5073 1
+256	80 1
+256	226 1
+256	257 1
+256	282 1
+256	298 1
+256	626 1
+256	644 1
+256	771 1
+256	1402 1
+256	1701 1
+261	258 1
+261	286 1
+261	339 1
+261	356 1
+261	405 1
+261	606 1
+261	607 1
+261	609 1
+258	261 1
+258	271 1
+258	273 1
+258	1062 1
+258	1360 1
+258	6262 1
+260	258 1
+260	261 1
+260	285 1
+260	1360 1
+260	2576 1
+260	6262 1
+259	29 1
+259	227 1
+259	261 1
+259	271 1
+259	299 1
+259	356 1
+259	432 1
+259	579 1
+259	600 1
+259	626 1
+259	769 1
+259	803 1
+259	817 1
+259	853 1
+259	893 1
+259	959 1
+259	1075 1
+259	1111 1
+259	1203 1
+259	1330 1
+259	1372 1
+259	1375 1
+259	1382 1
+259	1402 1
+259	1473 1
+259	1652 1
+259	1717 1
+259	1808 1
+259	1835 1
+259	1842 1
+259	1855 1
+259	1956 1
+259	2060 1
+259	2181 1
+259	2210 1
+259	2323 1
+259	2506 1
+259	2508 1
+259	2542 1
+259	2660 1
+259	2770 1
+259	3084 1
+259	3192 1
+259	3804 1
+259	3835 1
+259	4110 1
+259	5210 1
+259	5254 1
+259	5714 1
+259	5773 1
+259	5828 1
+259	6833 1
+259	6840 1
+259	7115 1
+259	8141 1
+259	8294 1
+263	80 1
+263	182 1
+263	271 1
+263	282 1
+263	339 1
+263	432 1
+263	733 1
+263	746 1
+263	762 1
+263	893 1
+263	918 1
+263	922 1
+263	979 1
+263	1123 1
+263	1573 1
+263	2210 1
+263	2774 1
+263	3092 1
+263	3106 1
+263	3726 1
+263	5222 1
+263	5584 1
+264	271 1
+265	29 1
+265	32 1
+265	35 1
+265	49 1
+265	75 1
+265	150 1
+265	271 1
+265	282 1
+265	447 1
+265	600 1
+265	675 1
+265	677 1
+265	700 1
+265	737 1
+265	748 1
+265	827 1
+265	1007 1
+265	1131 1
+265	1858 1
+265	2151 1
+265	2369 1
+265	2593 1
+265	3587 1
+265	4065 1
+265	4266 1
+265	5083 1
+265	5254 1
+265	6328 1
+265	6737 1
+265	7478 1
+265	7587 1
+266	271 1
+266	429 1
+266	665 1
+266	715 1
+266	836 1
+266	844 1
+266	935 1
+266	1285 1
+266	1723 1
+266	1726 1
+266	1802 1
+266	2955 1
+266	3680 1
+267	271 1
+268	178 1
+268	271 1
+268	935 1
+269	3 1
+269	86 1
+269	246 1
+269	271 1
+269	321 1
+269	339 1
+269	348 1
+269	396 1
+269	429 1
+269	439 1
+269	440 1
+269	549 1
+269	609 1
+269	697 1
+269	704 1
+269	730 1
+269	789 1
+269	817 1
+269	895 1
+269	972 1
+269	977 1
+269	994 1
+269	1123 1
+269	1151 1
+269	1248 1
+269	1322 1
+269	1661 1
+269	1717 1
+269	1726 1
+269	1811 1
+270	271 1
+270	853 1
+270	935 1
+270	937 1
+270	1284 1
+270	1285 1
+270	1378 1
+270	1585 1
+270	1965 1
+270	2079 1
+270	2485 1
+270	3144 1
+270	4432 1
+270	5106 1
+273	34 1
+273	151 1
+273	258 1
+273	299 1
+273	302 1
+273	348 1
+273	392 1
+276	132 1
+276	243 1
+276	274 1
+276	802 1
+276	849 1
+276	1218 1
+276	1250 1
+277	140 1
+277	274 1
+275	15 1
+275	28 1
+275	75 1
+275	80 1
+275	94 1
+275	152 1
+275	182 1
+275	224 1
+275	274 1
+275	282 1
+275	299 1
+275	356 1
+275	405 1
+275	417 1
+275	590 1
+275	604 1
+275	619 1
+275	650 1
+275	656 1
+275	657 1
+275	664 1
+275	667 1
+275	946 1
+275	1211 1
+275	1357 1
+275	1717 1
+275	1734 1
+275	1792 1
+275	1835 1
+275	1888 1
+275	1918 1
+275	1956 1
+275	1992 1
+275	1997 1
+275	2053 1
+275	2322 1
+275	2323 1
+275	2504 1
+275	2508 1
+275	2576 1
+275	2619 1
+275	2625 1
+275	2654 1
+275	2669 1
+275	2685 1
+275	2790 1
+275	2794 1
+275	2799 1
+275	2828 1
+275	2838 1
+275	2844 1
+275	2972 1
+275	2999 1
+275	3117 1
+275	3650 1
+275	5254 1
+241	132 1
+241	271 1
+241	282 1
+241	325 1
+241	626 1
+241	802 1
+241	864 1
+241	1186 1
+280	15 1
+280	56 1
+280	132 1
+280	152 1
+280	178 1
+280	271 1
+280	290 1
+280	299 1
+280	304 1
+280	308 1
+280	317 1
+280	372 1
+280	407 1
+280	415 1
+280	421 1
+280	422 1
+280	431 1
+280	433 1
+280	447 1
+280	488 1
+280	566 1
+280	567 1
+280	579 1
+280	626 1
+280	667 1
+280	677 1
+280	697 1
+280	719 1
+280	739 1
+280	789 1
+280	794 1
+280	795 1
+280	813 1
+280	817 1
+280	820 1
+280	908 1
+280	966 1
+280	977 1
+280	989 1
+280	991 1
+280	994 1
+280	995 1
+280	1007 1
+280	1012 1
+280	1014 1
+280	1026 1
+280	1043 1
+280	1053 1
+280	1123 1
+280	1151 1
+280	1186 1
+280	1200 1
+280	1250 1
+280	1297 1
+280	1464 1
+280	1585 1
+280	1608 1
+280	1718 1
+280	1723 1
+280	1855 1
+280	1956 1
+280	2004 1
+280	2071 1
+280	2246 1
+280	2398 1
+280	2535 1
+280	2570 1
+280	2579 1
+280	2775 1
+280	2785 1
+280	3089 1
+280	3136 1
+280	4037 1
+280	4808 1
+280	7632 1
+280	8083 1
+282	19 1
+282	34 1
+282	132 1
+282	140 1
+282	204 1
+282	224 1
+282	228 1
+282	230 1
+282	236 1
+282	255 1
+282	280 1
+282	286 1
+282	300 1
+282	428 1
+282	440 1
+282	560 1
+282	564 1
+282	566 1
+282	567 1
+282	579 1
+282	590 1
+282	592 1
+282	604 1
+282	606 1
+282	607 1
+282	609 1
+282	656 1
+282	664 1
+282	675 1
+282	762 1
+282	1201 1
+282	1464 1
+282	1471 1
+282	1496 1
+282	1501 1
+282	1597 1
+282	1603 1
+282	1633 1
+282	1718 1
+283	132 1
+283	771 1
+284	3 1
+284	19 1
+284	132 1
+284	286 1
+284	299 1
+284	358 1
+284	389 1
+285	286 1
+285	763 1
+285	993 1
+285	1884 1
+285	2517 1
+285	2643 1
+287	34 1
+288	34 1
+289	34 1
+291	72 1
+291	299 1
+291	346 1
+291	1297 1
+291	2066 1
+291	2326 1
+291	2328 1
+291	2397 1
+291	2398 1
+291	2517 1
+291	2790 1
+291	2811 1
+291	2958 1
+291	3014 1
+291	3034 1
+291	3352 1
+291	3455 1
+291	3463 1
+291	3635 1
+291	3976 1
+291	4013 1
+291	4179 1
+291	4201 1
+291	4233 1
+291	4261 1
+291	4266 1
+291	4466 1
+291	4661 1
+291	4662 1
+291	4666 1
+291	4719 1
+291	4735 1
+291	4776 1
+291	4780 1
+291	4811 1
+294	299 1
+292	3 1
+292	178 1
+292	299 1
+292	477 1
+292	945 1
+292	1201 1
+293	282 1
+293	299 1
+293	1497 1
+295	56 1
+295	299 1
+295	300 1
+295	1442 1
+295	1444 1
+296	243 1
+296	246 1
+296	299 1
+296	405 1
+296	415 1
+296	560 1
+296	663 1
+296	1123 1
+296	1718 1
+296	8282 1
+297	299 1
+290	35 1
+290	204 1
+290	214 1
+290	271 1
+290	299 1
+290	372 1
+290	633 1
+290	765 1
+290	887 1
+290	908 1
+290	946 1
+290	959 1
+290	974 1
+290	1131 1
+290	1164 1
+290	1165 1
+290	1193 1
+290	1201 1
+290	1211 1
+290	1230 1
+290	1248 1
+290	1284 1
+290	1297 1
+290	1305 1
+290	1378 1
+290	1396 1
+290	1411 1
+290	1468 1
+290	1482 1
+290	1484 1
+290	1514 1
+290	1593 1
+290	1622 1
+290	1706 1
+290	1717 1
+290	1726 1
+290	1734 1
+290	1754 1
+290	1757 1
+290	1774 1
+290	1788 1
+290	1805 1
+290	1836 1
+290	1893 1
+290	1908 1
+290	1918 1
+290	1927 1
+290	1956 1
+290	1966 1
+290	1973 1
+290	1977 1
+290	2004 1
+290	2135 1
+290	2210 1
+290	2225 1
+290	2356 1
+290	2411 1
+290	2474 1
+290	2508 1
+290	2579 1
+290	2654 1
+290	2697 1
+290	2708 1
+290	2871 1
+290	3005 1
+290	3117 1
+290	3408 1
+290	3516 1
+290	4037 1
+290	4983 1
+290	5412 1
+298	299 1
+298	5793 1
+301	362 1
+302	75 1
+302	94 1
+302	349 1
+302	359 1
+302	363 1
+302	370 1
+302	389 1
+302	2289 1
+302	2470 1
+302	3635 1
+302	3724 1
+302	4557 1
+302	8283 1
+249	15 1
+249	28 1
+249	299 1
+249	302 1
+249	700 1
+249	784 1
+249	1006 1
+249	1196 1
+249	1248 1
+249	1485 1
+249	1638 1
+249	1648 1
+249	1652 1
+249	1654 1
+249	2055 1
+303	80 1
+303	94 1
+303	302 1
+304	29 1
+304	86 1
+304	271 1
+304	313 1
+304	317 1
+304	322 1
+304	682 1
+304	696 1
+304	704 1
+304	714 1
+304	741 1
+304	742 1
+304	761 1
+304	763 1
+304	789 1
+304	795 1
+304	810 1
+304	820 1
+304	906 1
+304	907 1
+304	908 1
+304	945 1
+304	963 1
+304	966 1
+304	971 1
+304	972 1
+304	978 1
+304	981 1
+304	989 1
+304	1014 1
+304	1020 1
+304	1023 1
+304	1026 1
+304	1053 1
+304	1123 1
+304	1131 1
+304	1140 1
+304	1154 1
+304	1164 1
+304	1165 1
+304	1248 1
+304	1284 1
+304	1297 1
+304	1319 1
+304	1326 1
+304	1428 1
+304	1439 1
+304	1446 1
+304	1464 1
+304	1468 1
+304	1476 1
+304	1478 1
+304	1514 1
+304	1534 1
+304	1622 1
+304	1652 1
+304	1654 1
+304	1662 1
+304	1717 1
+304	1757 1
+304	1833 1
+304	1858 1
+304	1859 1
+304	1864 1
+304	1884 1
+304	1903 1
+304	1927 1
+304	1950 1
+304	1953 1
+304	1963 1
+304	1966 1
+304	1969 1
+304	1984 1
+304	2151 1
+304	2210 1
+304	2246 1
+304	2276 1
+304	2499 1
+304	3136 1
+306	8 1
+306	29 1
+306	36 1
+306	86 1
+306	204 1
+306	228 1
+306	246 1
+306	255 1
+306	271 1
+306	282 1
+306	298 1
+306	308 1
+306	310 1
+306	311 1
+306	313 1
+306	317 1
+306	319 1
+306	322 1
+306	325 1
+306	332 1
+306	371 1
+306	406 1
+306	407 1
+306	415 1
+306	417 1
+306	429 1
+306	439 1
+306	549 1
+306	566 1
+306	567 1
+306	587 1
+306	600 1
+306	609 1
+306	613 1
+306	619 1
+306	636 1
+306	637 1
+306	643 1
+306	656 1
+306	659 1
+306	664 1
+306	667 1
+306	670 1
+306	673 1
+306	675 1
+306	677 1
+306	681 1
+306	682 1
+306	684 1
+306	687 1
+306	697 1
+306	700 1
+306	704 1
+306	706 1
+306	707 1
+306	714 1
+306	715 1
+306	719 1
+306	722 1
+306	723 1
+306	730 1
+306	733 1
+306	739 1
+306	741 1
+306	742 1
+306	743 1
+306	746 1
+306	748 1
+306	749 1
+306	750 1
+306	756 1
+306	760 1
+306	762 1
+306	765 1
+306	778 1
+306	794 1
+306	795 1
+306	798 1
+306	810 1
+306	817 1
+306	829 1
+306	838 1
+306	857 1
+306	863 1
+306	866 1
+306	868 1
+306	875 1
+306	878 1
+306	881 1
+306	895 1
+306	896 1
+306	903 1
+306	907 1
+306	908 1
+306	913 1
+306	934 1
+306	936 1
+306	938 1
+306	956 1
+306	958 1
+306	960 1
+306	963 1
+306	971 1
+306	972 1
+306	974 1
+306	978 1
+306	979 1
+306	993 1
+306	1007 1
+306	1018 1
+306	1022 1
+306	1026 1
+306	1032 1
+306	1039 1
+306	1043 1
+306	1141 1
+306	1157 1
+306	1166 1
+306	1167 1
+306	1199 1
+306	1200 1
+306	1234 1
+306	1236 1
+306	1253 1
+306	1277 1
+306	1286 1
+306	1297 1
+306	1378 1
+306	1385 1
+306	1394 1
+306	1413 1
+306	1418 1
+306	1428 1
+306	1464 1
+306	1468 1
+306	1473 1
+306	1476 1
+306	1490 1
+306	1492 1
+306	1501 1
+306	1506 1
+306	1518 1
+306	1524 1
+306	1537 1
+306	1538 1
+306	1556 1
+306	1573 1
+306	1585 1
+306	1587 1
+306	1595 1
+306	1633 1
+306	1646 1
+306	1700 1
+306	1701 1
+306	1714 1
+306	1732 1
+306	1935 1
+306	1964 1
+306	1965 1
+306	1984 1
+306	1992 1
+306	2066 1
+306	2079 1
+306	2097 1
+306	2114 1
+306	2144 1
+306	2145 1
+306	2206 1
+306	2209 1
+306	2240 1
+306	2257 1
+306	2276 1
+306	2324 1
+306	2328 1
+306	2485 1
+306	2510 1
+306	2544 1
+306	2565 1
+306	2576 1
+306	2646 1
+306	2653 1
+306	2654 1
+306	2657 1
+306	2660 1
+306	2665 1
+306	2686 1
+306	2693 1
+306	2727 1
+306	2747 1
+306	2754 1
+306	2790 1
+306	2859 1
+306	2900 1
+306	2923 1
+306	2932 1
+306	2973 1
+306	3005 1
+306	3015 1
+306	3021 1
+306	3089 1
+306	3114 1
+306	3117 1
+306	3144 1
+306	3191 1
+306	3291 1
+306	3352 1
+306	3404 1
+306	3408 1
+306	3454 1
+306	3480 1
+306	3529 1
+306	3537 1
+306	3562 1
+306	3567 1
+306	3680 1
+306	3713 1
+306	3720 1
+306	3804 1
+306	3812 1
+306	3847 1
+306	3976 1
+306	4011 1
+306	4041 1
+306	4138 1
+306	4162 1
+306	4290 1
+306	4299 1
+306	4365 1
+306	4661 1
+306	5123 1
+306	5176 1
+306	5182 1
+306	5404 1
+306	5445 1
+306	5457 1
+306	5543 1
+306	5925 1
+306	5928 1
+306	5947 1
+306	5969 1
+306	6029 1
+306	8288 1
+306	8290 1
+306	8294 1
+307	55 1
+307	75 1
+307	322 1
+307	377 1
+307	402 1
+308	15 1
+308	29 1
+308	35 1
+308	36 1
+308	86 1
+308	204 1
+308	228 1
+308	243 1
+308	271 1
+308	299 1
+308	304 1
+308	311 1
+308	313 1
+308	317 1
+308	321 1
+308	322 1
+308	350 1
+308	417 1
+308	425 1
+308	439 1
+308	447 1
+308	465 1
+308	545 1
+308	549 1
+308	579 1
+308	600 1
+308	626 1
+308	643 1
+308	644 1
+308	647 1
+308	663 1
+308	673 1
+308	697 1
+308	704 1
+308	707 1
+308	710 1
+308	730 1
+308	733 1
+308	739 1
+308	746 1
+308	750 1
+308	762 1
+308	789 1
+308	813 1
+308	817 1
+308	838 1
+308	844 1
+308	853 1
+308	857 1
+308	859 1
+308	861 1
+308	878 1
+308	895 1
+308	908 1
+308	913 1
+308	941 1
+308	948 1
+308	958 1
+308	959 1
+308	960 1
+308	972 1
+308	974 1
+308	978 1
+308	982 1
+308	993 1
+308	994 1
+308	999 1
+308	1022 1
+308	1026 1
+308	1034 1
+308	1038 1
+308	1039 1
+308	1055 1
+308	1062 1
+308	1127 1
+308	1131 1
+308	1156 1
+308	1157 1
+308	1167 1
+308	1193 1
+308	1218 1
+308	1248 1
+308	1253 1
+308	1279 1
+308	1297 1
+308	1307 1
+308	1389 1
+308	1402 1
+308	1413 1
+308	1418 1
+308	1464 1
+308	1468 1
+308	1476 1
+308	1484 1
+308	1506 1
+308	1513 1
+308	1525 1
+308	1538 1
+308	1566 1
+308	1585 1
+308	1587 1
+308	1593 1
+308	1604 1
+308	1622 1
+308	1654 1
+308	1661 1
+308	1672 1
+308	1811 1
+308	1847 1
+308	1855 1
+308	1956 1
+308	1966 1
+308	2004 1
+308	2066 1
+308	2157 1
+308	2165 1
+308	2193 1
+308	2297 1
+308	2323 1
+308	2328 1
+308	2329 1
+308	2339 1
+308	2345 1
+308	2409 1
+308	2474 1
+308	2535 1
+308	2774 1
+308	2805 1
+308	2828 1
+308	3005 1
+308	3136 1
+308	3150 1
+308	3443 1
+308	3473 1
+308	3562 1
+308	3976 1
+308	4233 1
+308	4373 1
+308	4687 1
+308	5288 1
+308	5584 1
+308	5714 1
+320	243 1
+320	299 1
+320	317 1
+320	322 1
+320	849 1
+320	1080 1
+320	1186 1
+309	322 1
+310	35 1
+310	36 1
+310	56 1
+310	86 1
+310	171 1
+310	204 1
+310	243 1
+310	271 1
+310	299 1
+310	304 1
+310	308 1
+310	313 1
+310	317 1
+310	322 1
+310	324 1
+310	332 1
+310	338 1
+310	350 1
+310	407 1
+310	429 1
+310	432 1
+310	439 1
+310	447 1
+310	488 1
+310	549 1
+310	587 1
+310	600 1
+310	626 1
+310	633 1
+310	637 1
+310	659 1
+310	665 1
+310	674 1
+310	677 1
+310	682 1
+310	686 1
+310	697 1
+310	704 1
+310	707 1
+310	710 1
+310	719 1
+310	723 1
+310	725 1
+310	730 1
+310	733 1
+310	739 1
+310	742 1
+310	748 1
+310	749 1
+310	756 1
+310	760 1
+310	763 1
+310	765 1
+310	769 1
+310	778 1
+310	779 1
+310	784 1
+310	789 1
+310	794 1
+310	798 1
+310	805 1
+310	806 1
+310	813 1
+310	817 1
+310	844 1
+310	857 1
+310	866 1
+310	868 1
+310	871 1
+310	878 1
+310	893 1
+310	904 1
+310	918 1
+310	922 1
+310	932 1
+310	935 1
+310	936 1
+310	945 1
+310	946 1
+310	947 1
+310	955 1
+310	958 1
+310	966 1
+310	972 1
+310	985 1
+310	989 1
+310	991 1
+310	993 1
+310	994 1
+310	995 1
+310	999 1
+310	1006 1
+310	1014 1
+310	1032 1
+310	1039 1
+310	1061 1
+310	1103 1
+310	1111 1
+310	1123 1
+310	1125 1
+310	1128 1
+310	1131 1
+310	1140 1
+310	1164 1
+310	1166 1
+310	1167 1
+310	1191 1
+310	1193 1
+310	1196 1
+310	1200 1
+310	1201 1
+310	1211 1
+310	1218 1
+310	1222 1
+310	1236 1
+310	1240 1
+310	1250 1
+310	1260 1
+310	1261 1
+310	1267 1
+310	1285 1
+310	1297 1
+310	1319 1
+310	1375 1
+310	1378 1
+310	1407 1
+310	1411 1
+310	1413 1
+310	1428 1
+310	1464 1
+310	1476 1
+310	1487 1
+310	1501 1
+310	1514 1
+310	1518 1
+310	1520 1
+310	1538 1
+310	1573 1
+310	1585 1
+310	1603 1
+310	1619 1
+310	1633 1
+310	1641 1
+310	1646 1
+310	1649 1
+310	1672 1
+310	1717 1
+310	1718 1
+310	1723 1
+310	1726 1
+310	1746 1
+310	1749 1
+310	1754 1
+310	1757 1
+310	1774 1
+310	1842 1
+310	1888 1
+310	1901 1
+310	1903 1
+310	1966 1
+310	1977 1
+310	1979 1
+310	1992 1
+310	2066 1
+310	2079 1
+310	2097 1
+310	2106 1
+310	2117 1
+310	2120 1
+310	2121 1
+310	2128 1
+310	2144 1
+310	2151 1
+310	2174 1
+310	2241 1
+310	2246 1
+310	2257 1
+310	2297 1
+310	2322 1
+310	2325 1
+310	2341 1
+310	2375 1
+310	2381 1
+310	2400 1
+310	2485 1
+310	2535 1
+310	2593 1
+310	2625 1
+310	2643 1
+310	2669 1
+310	2685 1
+310	2693 1
+310	2700 1
+310	2754 1
+310	2794 1
+310	2819 1
+310	2822 1
+310	2834 1
+310	2955 1
+310	3028 1
+310	3034 1
+310	3089 1
+310	3136 1
+310	3251 1
+310	3253 1
+310	3352 1
+310	3408 1
+310	3417 1
+310	3464 1
+310	3473 1
+310	3489 1
+310	3634 1
+310	3643 1
+310	3664 1
+310	3967 1
+310	4471 1
+310	4482 1
+310	4827 1
+310	4828 1
+310	5072 1
+310	5210 1
+310	5222 1
+310	5239 1
+310	5288 1
+310	5524 1
+310	5651 1
+310	5721 1
+310	5753 1
+310	5844 1
+310	6505 1
+311	15 1
+311	29 1
+311	35 1
+311	56 1
+311	72 1
+311	86 1
+311	243 1
+311	259 1
+311	271 1
+311	299 1
+311	304 1
+311	313 1
+311	317 1
+311	321 1
+311	322 1
+311	324 1
+311	407 1
+311	432 1
+311	439 1
+311	447 1
+311	465 1
+311	488 1
+311	506 1
+311	626 1
+311	637 1
+311	643 1
+311	647 1
+311	663 1
+311	674 1
+311	697 1
+311	704 1
+311	705 1
+311	707 1
+311	710 1
+311	722 1
+311	730 1
+311	742 1
+311	762 1
+311	765 1
+311	769 1
+311	784 1
+311	789 1
+311	795 1
+311	805 1
+311	810 1
+311	826 1
+311	844 1
+311	857 1
+311	859 1
+311	861 1
+311	871 1
+311	875 1
+311	878 1
+311	882 1
+311	887 1
+311	893 1
+311	895 1
+311	904 1
+311	907 1
+311	908 1
+311	922 1
+311	930 1
+311	936 1
+311	937 1
+311	941 1
+311	943 1
+311	946 1
+311	955 1
+311	956 1
+311	958 1
+311	971 1
+311	972 1
+311	978 1
+311	981 1
+311	983 1
+311	985 1
+311	989 1
+311	993 1
+311	994 1
+311	995 1
+311	1006 1
+311	1012 1
+311	1014 1
+311	1022 1
+311	1023 1
+311	1026 1
+311	1030 1
+311	1031 1
+311	1034 1
+311	1038 1
+311	1053 1
+311	1055 1
+311	1097 1
+311	1114 1
+311	1123 1
+311	1125 1
+311	1128 1
+311	1151 1
+311	1152 1
+311	1160 1
+311	1164 1
+311	1166 1
+311	1167 1
+311	1186 1
+311	1193 1
+311	1199 1
+311	1200 1
+311	1201 1
+311	1211 1
+311	1222 1
+311	1230 1
+311	1234 1
+311	1236 1
+311	1241 1
+311	1243 1
+311	1261 1
+311	1277 1
+311	1279 1
+311	1284 1
+311	1285 1
+311	1286 1
+311	1297 1
+311	1319 1
+311	1322 1
+311	1326 1
+311	1330 1
+311	1353 1
+311	1357 1
+311	1374 1
+311	1375 1
+311	1377 1
+311	1385 1
+311	1413 1
+311	1418 1
+311	1419 1
+311	1425 1
+311	1428 1
+311	1453 1
+311	1464 1
+311	1465 1
+311	1476 1
+311	1482 1
+311	1484 1
+311	1487 1
+311	1490 1
+311	1492 1
+311	1496 1
+311	1497 1
+311	1514 1
+311	1521 1
+311	1525 1
+311	1534 1
+311	1538 1
+311	1547 1
+311	1549 1
+311	1580 1
+311	1583 1
+311	1585 1
+311	1587 1
+311	1592 1
+311	1593 1
+311	1597 1
+311	1603 1
+311	1608 1
+311	1618 1
+311	1622 1
+311	1633 1
+311	1638 1
+311	1641 1
+311	1649 1
+311	1658 1
+311	1697 1
+311	1700 1
+311	1714 1
+311	1717 1
+311	1729 1
+311	1734 1
+311	1752 1
+311	1754 1
+311	1758 1
+311	1769 1
+311	1772 1
+311	1774 1
+311	1787 1
+311	1814 1
+311	1847 1
+311	1848 1
+311	1861 1
+311	1864 1
+311	1884 1
+311	1888 1
+311	1893 1
+311	1919 1
+311	1956 1
+311	1964 1
+311	1965 1
+311	1966 1
+311	1973 1
+311	1977 1
+311	1992 1
+311	1997 1
+311	2062 1
+311	2071 1
+311	2079 1
+311	2102 1
+311	2106 1
+311	2109 1
+311	2120 1
+311	2128 1
+311	2145 1
+311	2151 1
+311	2206 1
+311	2210 1
+311	2225 1
+311	2241 1
+311	2257 1
+311	2297 1
+311	2322 1
+311	2323 1
+311	2341 1
+311	2381 1
+311	2385 1
+311	2425 1
+311	2456 1
+311	2485 1
+311	2504 1
+311	2535 1
+311	2542 1
+311	2560 1
+311	2565 1
+311	2570 1
+311	2605 1
+311	2625 1
+311	2643 1
+311	2654 1
+311	2655 1
+311	2660 1
+311	2672 1
+311	2708 1
+311	2720 1
+311	2763 1
+311	2775 1
+311	2790 1
+311	2809 1
+311	2830 1
+311	2871 1
+311	2918 1
+311	2940 1
+311	2963 1
+311	2968 1
+311	2973 1
+311	2981 1
+311	2999 1
+311	3007 1
+311	3009 1
+311	3033 1
+311	3034 1
+311	3068 1
+311	3089 1
+311	3117 1
+311	3136 1
+311	3144 1
+311	3238 1
+311	3253 1
+311	3265 1
+311	3334 1
+311	3408 1
+311	3443 1
+311	3456 1
+311	3459 1
+311	3506 1
+311	3755 1
+311	3843 1
+311	3892 1
+311	3969 1
+311	3976 1
+311	4040 1
+311	4072 1
+311	4098 1
+311	4099 1
+311	4435 1
+311	4534 1
+311	4578 1
+311	4650 1
+311	4712 1
+311	4735 1
+311	4884 1
+311	5020 1
+311	5022 1
+311	5179 1
+311	5254 1
+311	5335 1
+311	5404 1
+311	5412 1
+311	5449 1
+311	5463 1
+311	5543 1
+311	5743 1
+311	5897 1
+311	5922 1
+311	6097 1
+311	6151 1
+311	6156 1
+311	6299 1
+311	6306 1
+311	6330 1
+311	6595 1
+311	6715 1
+311	6770 1
+311	6918 1
+311	6979 1
+311	7620 1
+311	7624 1
+311	7632 1
+311	7809 1
+311	7833 1
+311	7839 1
+311	7855 1
+311	8083 1
+311	8290 1
+311	8295 1
+312	8 1
+312	29 1
+312	36 1
+312	86 1
+312	224 1
+312	227 1
+312	228 1
+312	255 1
+312	271 1
+312	282 1
+312	304 1
+312	306 1
+312	308 1
+312	310 1
+312	311 1
+312	313 1
+312	317 1
+312	319 1
+312	321 1
+312	322 1
+312	325 1
+312	332 1
+312	334 1
+312	338 1
+312	406 1
+312	407 1
+312	429 1
+312	432 1
+312	439 1
+312	447 1
+312	488 1
+312	545 1
+312	549 1
+312	575 1
+312	579 1
+312	600 1
+312	624 1
+312	626 1
+312	628 1
+312	631 1
+312	636 1
+312	643 1
+312	644 1
+312	647 1
+312	656 1
+312	657 1
+312	658 1
+312	664 1
+312	667 1
+312	668 1
+312	670 1
+312	673 1
+312	674 1
+312	675 1
+312	677 1
+312	681 1
+312	682 1
+312	684 1
+312	686 1
+312	687 1
+312	691 1
+312	696 1
+312	697 1
+312	700 1
+312	704 1
+312	705 1
+312	706 1
+312	707 1
+312	710 1
+312	715 1
+312	719 1
+312	722 1
+312	723 1
+312	725 1
+312	730 1
+312	733 1
+312	739 1
+312	742 1
+312	743 1
+312	746 1
+312	749 1
+312	750 1
+312	756 1
+312	761 1
+312	769 1
+312	778 1
+312	784 1
+312	789 1
+312	794 1
+312	795 1
+312	798 1
+312	802 1
+312	803 1
+312	805 1
+312	806 1
+312	813 1
+312	817 1
+312	820 1
+312	822 1
+312	837 1
+312	838 1
+312	839 1
+312	844 1
+312	849 1
+312	857 1
+312	861 1
+312	863 1
+312	864 1
+312	866 1
+312	868 1
+312	878 1
+312	881 1
+312	882 1
+312	885 1
+312	887 1
+312	893 1
+312	895 1
+312	897 1
+312	918 1
+312	929 1
+312	932 1
+312	936 1
+312	937 1
+312	941 1
+312	943 1
+312	945 1
+312	948 1
+312	956 1
+312	958 1
+312	959 1
+312	966 1
+312	972 1
+312	977 1
+312	978 1
+312	979 1
+312	981 1
+312	982 1
+312	985 1
+312	989 1
+312	991 1
+312	994 1
+312	995 1
+312	999 1
+312	1006 1
+312	1007 1
+312	1014 1
+312	1023 1
+312	1030 1
+312	1035 1
+312	1039 1
+312	1043 1
+312	1061 1
+312	1062 1
+312	1123 1
+312	1125 1
+312	1127 1
+312	1128 1
+312	1141 1
+312	1144 1
+312	1152 1
+312	1156 1
+312	1164 1
+312	1165 1
+312	1168 1
+312	1186 1
+312	1190 1
+312	1193 1
+312	1196 1
+312	1201 1
+312	1203 1
+312	1211 1
+312	1218 1
+312	1220 1
+312	1221 1
+312	1222 1
+312	1234 1
+312	1241 1
+312	1248 1
+312	1259 1
+312	1279 1
+312	1286 1
+312	1296 1
+312	1297 1
+312	1319 1
+312	1330 1
+312	1375 1
+312	1382 1
+312	1413 1
+312	1418 1
+312	1425 1
+312	1439 1
+312	1446 1
+312	1453 1
+312	1464 1
+312	1468 1
+312	1471 1
+312	1489 1
+312	1492 1
+312	1520 1
+312	1556 1
+312	1573 1
+312	1580 1
+312	1595 1
+312	1603 1
+312	1604 1
+312	1619 1
+312	1638 1
+312	1641 1
+312	1648 1
+312	1649 1
+312	1654 1
+312	1661 1
+312	1672 1
+312	1692 1
+312	1700 1
+312	1701 1
+312	1726 1
+312	1836 1
+312	1842 1
+312	1855 1
+312	1893 1
+312	1953 1
+312	1963 1
+312	1966 1
+312	1969 1
+312	2397 1
+312	2400 1
+313	29 1
+313	35 1
+313	56 1
+313	290 1
+313	322 1
+313	644 1
+313	697 1
+313	704 1
+313	761 1
+313	762 1
+313	795 1
+313	857 1
+313	871 1
+313	941 1
+313	958 1
+313	959 1
+313	974 1
+313	978 1
+313	981 1
+313	999 1
+313	1026 1
+313	1151 1
+313	1211 1
+313	1297 1
+313	1330 1
+313	1377 1
+313	1482 1
+313	1497 1
+313	1538 1
+313	1549 1
+313	1593 1
+313	1597 1
+313	1772 1
+313	1859 1
+313	1918 1
+313	2106 1
+313	2151 1
+313	2157 1
+313	2193 1
+313	2386 1
+313	2411 1
+313	2565 1
+313	2763 1
+313	2790 1
+313	2801 1
+313	2838 1
+313	2871 1
+313	2923 1
+313	3005 1
+313	3117 1
+313	3456 1
+313	3946 1
+313	8290 1
+313	8292 1
+314	322 1
+315	8 1
+315	36 1
+315	72 1
+315	214 1
+315	259 1
+315	299 1
+315	308 1
+315	317 1
+315	322 1
+315	407 1
+315	432 1
+315	488 1
+315	637 1
+315	643 1
+315	659 1
+315	663 1
+315	673 1
+315	674 1
+315	677 1
+315	730 1
+315	741 1
+315	742 1
+315	749 1
+315	765 1
+315	778 1
+315	779 1
+315	793 1
+315	798 1
+315	802 1
+315	806 1
+315	817 1
+315	829 1
+315	838 1
+315	844 1
+315	857 1
+315	863 1
+315	864 1
+315	873 1
+315	878 1
+315	881 1
+315	885 1
+315	893 1
+315	895 1
+315	930 1
+315	942 1
+315	943 1
+315	963 1
+315	985 1
+315	993 1
+315	1038 1
+315	1123 1
+315	1127 1
+315	1156 1
+315	1166 1
+315	1186 1
+315	1201 1
+315	1259 1
+315	1296 1
+315	1321 1
+315	1382 1
+315	1413 1
+315	1593 1
+315	1718 1
+315	1888 1
+315	2014 1
+315	2102 1
+315	2120 1
+315	2135 1
+315	2341 1
+315	2456 1
+315	2470 1
+315	2625 1
+315	2834 1
+315	2963 1
+315	3117 1
+315	4037 1
+315	5683 1
+316	322 1
+316	559 1
+316	1717 1
+305	322 1
+305	659 1
+305	715 1
+305	1014 1
+305	1282 1
+305	5130 1
+305	5412 1
+317	29 1
+317	35 1
+317	36 1
+317	204 1
+317	228 1
+317	271 1
+317	298 1
+317	299 1
+317	304 1
+317	308 1
+317	311 1
+317	313 1
+317	321 1
+317	322 1
+317	334 1
+317	429 1
+317	432 1
+317	439 1
+317	447 1
+317	488 1
+317	545 1
+317	579 1
+317	626 1
+317	637 1
+317	643 1
+317	644 1
+317	647 1
+317	663 1
+317	677 1
+317	682 1
+317	686 1
+317	696 1
+317	697 1
+317	704 1
+317	705 1
+317	707 1
+317	714 1
+317	730 1
+317	741 1
+317	742 1
+317	762 1
+317	769 1
+317	789 1
+317	794 1
+317	795 1
+317	805 1
+317	813 1
+317	820 1
+317	823 1
+317	826 1
+317	838 1
+317	844 1
+317	849 1
+317	853 1
+317	857 1
+317	863 1
+317	864 1
+317	866 1
+317	868 1
+317	871 1
+317	878 1
+317	882 1
+317	887 1
+317	895 1
+317	918 1
+317	929 1
+317	930 1
+317	932 1
+317	934 1
+317	938 1
+317	941 1
+317	948 1
+317	956 1
+317	958 1
+317	960 1
+317	971 1
+317	972 1
+317	979 1
+317	981 1
+317	989 1
+317	991 1
+317	993 1
+317	994 1
+317	995 1
+317	999 1
+317	1007 1
+317	1014 1
+317	1022 1
+317	1023 1
+317	1026 1
+317	1032 1
+317	1039 1
+317	1053 1
+317	1055 1
+317	1062 1
+317	1075 1
+317	1123 1
+317	1125 1
+317	1128 1
+317	1167 1
+317	1190 1
+317	1193 1
+317	1201 1
+317	1234 1
+317	1277 1
+317	1279 1
+317	1286 1
+317	1296 1
+317	1297 1
+317	1377 1
+317	1394 1
+317	1413 1
+317	1428 1
+317	1476 1
+317	1482 1
+317	1490 1
+317	1496 1
+317	1506 1
+317	1518 1
+317	1520 1
+317	1524 1
+317	1538 1
+317	1555 1
+317	1556 1
+317	1573 1
+317	1585 1
+317	1593 1
+317	1603 1
+317	1622 1
+317	1641 1
+317	1661 1
+317	1726 1
+317	1774 1
+317	1783 1
+317	1893 1
+317	2707 1
+317	3136 1
+317	4037 1
+317	5802 1
+317	8288 1
+318	271 1
+318	322 1
+318	1080 1
+319	8 1
+319	15 1
+319	39 1
+319	182 1
+319	204 1
+319	214 1
+319	255 1
+319	271 1
+319	280 1
+319	282 1
+319	290 1
+319	299 1
+319	306 1
+319	310 1
+319	311 1
+319	317 1
+319	322 1
+319	325 1
+319	370 1
+319	371 1
+319	379 1
+319	403 1
+319	405 1
+319	407 1
+319	429 1
+319	439 1
+319	587 1
+319	590 1
+319	592 1
+319	600 1
+319	622 1
+319	627 1
+319	633 1
+319	637 1
+319	647 1
+319	656 1
+319	659 1
+319	670 1
+319	673 1
+319	675 1
+319	704 1
+319	706 1
+319	725 1
+319	730 1
+319	733 1
+319	739 1
+319	741 1
+319	746 1
+319	749 1
+319	762 1
+319	765 1
+319	789 1
+319	798 1
+319	803 1
+319	805 1
+319	813 1
+319	817 1
+319	822 1
+319	826 1
+319	844 1
+319	857 1
+319	878 1
+319	904 1
+319	906 1
+319	907 1
+319	908 1
+319	922 1
+319	936 1
+319	955 1
+319	967 1
+319	971 1
+319	972 1
+319	978 1
+319	981 1
+319	993 1
+319	995 1
+319	1023 1
+319	1026 1
+319	1035 1
+319	1038 1
+319	1103 1
+319	1152 1
+319	1164 1
+319	1167 1
+319	1186 1
+319	1199 1
+319	1200 1
+319	1211 1
+319	1267 1
+319	1296 1
+319	1382 1
+319	1413 1
+319	1464 1
+319	1471 1
+319	1478 1
+319	1482 1
+319	1514 1
+319	1537 1
+319	1566 1
+319	1573 1
+319	1580 1
+319	1587 1
+319	1593 1
+319	1622 1
+319	1669 1
+319	1680 1
+319	1697 1
+319	1723 1
+319	1799 1
+319	1842 1
+319	1908 1
+319	1919 1
+319	1987 1
+319	1991 1
+319	2004 1
+319	2117 1
+319	2145 1
+319	2181 1
+319	2371 1
+319	2535 1
+319	2592 1
+319	2629 1
+319	2660 1
+319	2689 1
+319	2696 1
+319	2774 1
+319	2775 1
+319	2819 1
+319	2925 1
+319	3029 1
+319	3033 1
+319	3192 1
+319	3334 1
+319	3537 1
+319	3547 1
+319	3607 1
+319	3643 1
+319	3691 1
+319	3748 1
+319	3752 1
+319	3796 1
+319	3830 1
+319	3843 1
+319	3854 1
+319	3897 1
+319	3910 1
+319	3958 1
+319	4040 1
+319	4099 1
+319	4103 1
+319	4297 1
+319	4310 1
+319	4335 1
+319	4527 1
+319	4551 1
+319	4587 1
+319	4632 1
+319	4827 1
+319	4828 1
+319	4954 1
+319	4962 1
+319	4994 1
+319	5002 1
+319	5020 1
+319	5026 1
+319	5072 1
+319	5073 1
+319	5075 1
+319	5178 1
+319	5182 1
+319	5226 1
+319	5273 1
+319	5335 1
+319	5423 1
+319	5430 1
+319	5459 1
+319	5545 1
+319	5563 1
+319	5584 1
+319	5806 1
+319	5897 1
+319	6006 1
+319	6097 1
+319	6110 1
+319	6347 1
+319	6442 1
+319	6505 1
+319	6570 1
+319	6715 1
+319	6774 1
+319	6860 1
+319	6913 1
+319	6930 1
+319	7021 1
+319	7910 1
+319	8037 1
+319	8121 1
+319	8163 1
+319	8288 1
+329	80 1
+329	135 1
+329	228 1
+329	282 1
+329	299 1
+329	733 1
+330	80 1
+323	80 1
+324	80 1
+324	135 1
+324	704 1
+324	739 1
+324	742 1
+324	746 1
+324	789 1
+324	817 1
+324	849 1
+324	966 1
+324	1026 1
+324	1413 1
+324	1757 1
+324	1842 1
+326	39 1
+326	80 1
+326	140 1
+326	152 1
+326	243 1
+326	282 1
+326	348 1
+326	407 1
+326	488 1
+326	549 1
+326	616 1
+326	2160 1
+331	80 1
+331	94 1
+331	415 1
+331	3892 1
+327	80 1
+327	232 1
+327	282 1
+327	311 1
+327	857 1
+327	918 1
+327	1053 1
+327	2205 1
+251	32 1
+251	80 1
+251	94 1
+251	299 1
+251	310 1
+251	432 1
+251	719 1
+251	1261 1
+328	75 1
+328	80 1
+328	299 1
+328	325 1
+328	356 1
+328	373 1
+328	626 1
+328	789 1
+328	875 1
+328	966 1
+328	1026 1
+328	1864 1
+328	2999 1
+333	55 1
+333	94 1
+335	15 1
+335	56 1
+335	94 1
+335	151 1
+335	589 1
+335	737 1
+335	839 1
+335	1026 1
+335	1259 1
+335	1282 1
+335	1385 1
+335	1513 1
+335	1573 1
+335	1729 1
+335	2369 1
+335	2506 1
+335	2592 1
+335	2612 1
+335	4037 1
+335	4191 1
+335	4234 1
+335	4365 1
+335	4551 1
+335	4632 1
+335	4709 1
+335	4814 1
+335	4820 1
+335	4994 1
+335	5083 1
+335	5421 1
+335	5482 1
+335	5545 1
+335	5563 1
+335	5584 1
+335	5743 1
+335	5886 1
+335	5887 1
+335	5922 1
+335	6174 1
+335	6634 1
+335	7074 1
+335	7443 1
+335	7497 1
+335	7587 1
+335	7688 1
+335	7795 1
+150	56 1
+150	94 1
+150	178 1
+150	232 1
+150	280 1
+150	371 1
+150	407 1
+150	431 1
+150	566 1
+150	567 1
+150	584 1
+150	587 1
+150	589 1
+150	590 1
+150	592 1
+150	601 1
+150	606 1
+150	607 1
+150	609 1
+150	737 1
+150	1319 1
+150	1385 1
+150	1412 1
+150	3334 1
+150	3568 1
+150	4373 1
+150	4403 1
+150	4536 1
+336	15 1
+336	28 1
+336	75 1
+336	86 1
+336	135 1
+336	151 1
+336	214 1
+336	271 1
+336	310 1
+336	325 1
+336	356 1
+336	371 1
+336	439 1
+336	465 1
+336	590 1
+336	600 1
+336	636 1
+336	941 1
+336	1196 1
+336	1201 1
+336	1385 1
+336	1633 1
+336	2727 1
+336	3238 1
+336	4289 1
+336	5233 1
+336	5412 1
+336	6221 1
+336	6595 1
+336	7450 1
+336	8287 1
+337	135 1
+338	135 1
+339	35 1
+339	36 1
+339	86 1
+339	135 1
+339	140 1
+339	150 1
+339	224 1
+339	226 1
+339	227 1
+339	236 1
+339	243 1
+339	259 1
+339	271 1
+339	282 1
+339	334 1
+339	341 1
+339	373 1
+339	377 1
+339	379 1
+339	394 1
+339	402 1
+339	439 1
+339	549 1
+339	560 1
+339	600 1
+339	609 1
+339	611 1
+339	613 1
+339	616 1
+339	624 1
+339	627 1
+339	628 1
+339	631 1
+339	643 1
+339	644 1
+339	647 1
+339	659 1
+339	665 1
+339	668 1
+339	673 1
+339	675 1
+339	706 1
+339	719 1
+339	725 1
+339	730 1
+339	733 1
+339	741 1
+339	746 1
+339	750 1
+339	762 1
+339	803 1
+339	817 1
+339	822 1
+339	853 1
+339	863 1
+339	881 1
+339	885 1
+339	893 1
+339	895 1
+339	918 1
+339	936 1
+339	941 1
+339	959 1
+339	1053 1
+339	1080 1
+339	1186 1
+339	1296 1
+339	1321 1
+339	1330 1
+339	1485 1
+339	1506 1
+339	1525 1
+339	1717 1
+339	1855 1
+339	2398 1
+339	2651 1
+339	5335 1
+339	5341 1
+339	6043 1
+339	7961 1
+340	86 1
+340	135 1
+340	151 1
+340	178 1
+340	232 1
+340	271 1
+340	282 1
+340	304 1
+340	396 1
+340	407 1
+340	439 1
+340	440 1
+340	564 1
+340	627 1
+340	628 1
+340	656 1
+340	663 1
+340	885 1
+340	918 1
+340	932 1
+340	937 1
+340	945 1
+340	963 1
+340	972 1
+340	985 1
+340	1007 1
+340	1020 1
+340	1413 1
+340	1428 1
+340	1464 1
+341	28 1
+341	135 1
+341	151 1
+341	171 1
+341	259 1
+341	299 1
+341	324 1
+341	348 1
+341	362 1
+341	370 1
+341	396 1
+341	407 1
+341	431 1
+341	659 1
+341	663 1
+341	686 1
+341	710 1
+341	761 1
+341	791 1
+341	829 1
+341	906 1
+341	922 1
+341	937 1
+341	959 1
+341	978 1
+341	985 1
+341	989 1
+341	1007 1
+341	1080 1
+341	1123 1
+341	1140 1
+341	1152 1
+341	1160 1
+341	1186 1
+341	1201 1
+341	1222 1
+341	1266 1
+341	1297 1
+341	1385 1
+341	1771 1
+341	2163 1
+341	2205 1
+341	2242 1
+341	2625 1
+341	2670 1
+341	3755 1
+341	8290 1
+342	55 1
+342	135 1
+343	135 1
+343	282 1
+343	656 1
+343	1261 1
+344	75 1
+344	135 1
+344	348 1
+348	86 1
+348	271 1
+348	325 1
+348	439 1
+348	665 1
+348	686 1
+348	697 1
+348	704 1
+348	769 1
+348	817 1
+348	878 1
+348	941 1
+348	981 1
+348	1022 1
+348	1128 1
+348	1156 1
+348	1418 1
+348	1419 1
+348	2264 1
+348	2501 1
+348	2612 1
+345	39 1
+345	56 1
+345	228 1
+345	282 1
+345	348 1
+345	371 1
+345	567 1
+345	581 1
+345	600 1
+346	214 1
+346	290 1
+346	348 1
+346	403 1
+346	417 1
+346	659 1
+346	682 1
+346	762 1
+346	765 1
+346	853 1
+346	936 1
+346	938 1
+346	942 1
+346	945 1
+346	974 1
+346	1157 1
+346	1166 1
+346	1297 1
+346	1453 1
+346	1564 1
+346	1744 1
+346	1777 1
+346	1915 1
+346	2144 1
+346	2251 1
+346	2252 1
+346	2323 1
+346	2325 1
+346	2326 1
+346	2375 1
+346	2411 1
+346	2416 1
+346	2685 1
+346	2720 1
+346	2721 1
+346	2724 1
+346	2747 1
+346	2805 1
+346	2828 1
+346	2838 1
+346	2859 1
+346	2900 1
+346	2912 1
+346	2918 1
+346	2922 1
+346	2923 1
+346	2926 1
+346	2999 1
+346	3009 1
+346	3034 1
+346	3089 1
+346	3099 1
+346	3104 1
+346	3117 1
+346	3173 1
+346	3180 1
+346	3192 1
+346	3243 1
+346	3309 1
+346	3446 1
+346	3483 1
+346	3520 1
+346	3537 1
+346	3541 1
+346	3557 1
+346	3562 1
+346	3580 1
+346	3646 1
+346	3812 1
+346	3871 1
+346	3887 1
+346	3926 1
+346	3971 1
+346	4266 1
+346	4335 1
+346	4424 1
+346	4661 1
+346	4666 1
+346	4735 1
+346	4811 1
+346	4814 1
+346	4820 1
+346	4822 1
+346	4875 1
+346	6784 1
+346	8293 1
+349	613 1
+356	55 1
+356	214 1
+356	259 1
+356	282 1
+356	299 1
+356	579 1
+356	769 1
+356	993 1
+356	1043 1
+356	1186 1
+356	1375 1
+356	1428 1
+356	1835 1
+356	2210 1
+356	2323 1
+356	2660 1
+356	2770 1
+356	4110 1
+350	356 1
+350	696 1
+351	86 1
+351	325 1
+351	339 1
+351	356 1
+351	439 1
+351	733 1
+351	893 1
+351	2535 1
+351	3946 1
+351	4735 1
+351	5254 1
+355	356 1
+352	75 1
+352	192 1
+352	243 1
+352	325 1
+352	356 1
+352	506 1
+352	756 1
+352	1077 1
+352	8287 1
+353	56 1
+353	152 1
+353	243 1
+353	339 1
+353	356 1
+353	684 1
+357	339 1
+357	358 1
+193	86 1
+193	204 1
+193	228 1
+193	325 1
+193	358 1
+193	402 1
+193	417 1
+193	439 1
+193	465 1
+193	549 1
+193	656 1
+193	733 1
+193	974 1
+193	1186 1
+193	1211 1
+193	1297 1
+193	2066 1
+193	2157 1
+193	3005 1
+193	3034 1
+193	3971 1
+363	362 1
+363	1305 1
+363	2237 1
+362	363 1
+364	75 1
+364	214 1
+364	370 1
+364	658 1
+364	670 1
+364	739 1
+364	1007 1
+364	1267 1
+364	1418 1
+364	2542 1
+364	2777 1
+364	4110 1
+364	6458 1
+364	8287 1
+365	56 1
+365	75 1
+365	152 1
+365	370 1
+365	377 1
+365	391 1
+365	477 1
+365	515 1
+366	28 1
+366	49 1
+366	282 1
+366	299 1
+366	370 1
+366	377 1
+366	379 1
+366	391 1
+366	606 1
+366	645 1
+366	656 1
+366	3976 1
+366	5947 1
+366	8287 1
+369	370 1
+367	75 1
+367	299 1
+367	370 1
+367	2643 1
+367	8287 1
+368	370 1
+371	15 1
+371	29 1
+371	56 1
+371	72 1
+371	86 1
+371	204 1
+371	228 1
+371	255 1
+371	271 1
+371	282 1
+371	299 1
+371	304 1
+371	310 1
+371	313 1
+371	317 1
+371	373 1
+371	432 1
+371	439 1
+371	447 1
+371	567 1
+371	590 1
+371	600 1
+371	627 1
+371	643 1
+371	658 1
+371	659 1
+371	664 1
+371	677 1
+371	686 1
+371	704 1
+371	717 1
+371	730 1
+371	733 1
+371	737 1
+371	739 1
+371	746 1
+371	756 1
+371	762 1
+371	789 1
+371	823 1
+371	844 1
+371	849 1
+371	857 1
+371	868 1
+371	878 1
+371	881 1
+371	882 1
+371	885 1
+371	895 1
+371	897 1
+371	936 1
+371	945 1
+371	958 1
+371	960 1
+371	977 1
+371	991 1
+371	1023 1
+371	1026 1
+371	1031 1
+371	1032 1
+371	1044 1
+371	1053 1
+371	1157 1
+371	1186 1
+371	1196 1
+371	1201 1
+371	1211 1
+371	1222 1
+371	1260 1
+371	1261 1
+371	1297 1
+371	1310 1
+371	1322 1
+371	1396 1
+371	1428 1
+371	1446 1
+371	1468 1
+371	1485 1
+371	1487 1
+371	1573 1
+371	1633 1
+371	1706 1
+371	1726 1
+371	1956 1
+371	1966 1
+371	2145 1
+371	2165 1
+371	2339 1
+371	2398 1
+371	2501 1
+371	2625 1
+371	2643 1
+371	2693 1
+371	2801 1
+371	3352 1
+371	3456 1
+371	3645 1
+371	3755 1
+371	3796 1
+371	3967 1
+371	3976 1
+371	4110 1
+371	4335 1
+371	4338 1
+371	4424 1
+371	4661 1
+371	4735 1
+371	5288 1
+371	5412 1
+371	5459 1
+371	5775 1
+371	6388 1
+371	7277 1
+371	7422 1
+371	7478 1
+371	7795 1
+371	7809 1
+372	373 1
+372	391 1
+372	515 1
+372	8287 1
+374	377 1
+374	419 1
+374	1652 1
+375	377 1
+376	35 1
+376	36 1
+376	86 1
+376	299 1
+376	310 1
+376	311 1
+376	325 1
+376	350 1
+376	377 1
+376	394 1
+376	406 1
+376	636 1
+376	643 1
+376	697 1
+376	706 1
+376	789 1
+376	817 1
+376	977 1
+376	985 1
+376	999 1
+376	1023 1
+376	1026 1
+376	1043 1
+376	1127 1
+376	1167 1
+376	1193 1
+376	1234 1
+376	1330 1
+376	1402 1
+376	1482 1
+376	1518 1
+376	1633 1
+376	1802 1
+376	1992 1
+376	2253 1
+376	2325 1
+376	3150 1
+386	8 1
+386	243 1
+386	310 1
+381	243 1
+381	622 1
+382	243 1
+387	150 1
+387	214 1
+387	243 1
+387	259 1
+387	600 1
+387	756 1
+387	817 1
+387	829 1
+387	1053 1
+387	1123 1
+387	1201 1
+101	28 1
+101	56 1
+101	75 1
+101	108 1
+101	152 1
+101	192 1
+101	243 1
+101	299 1
+101	405 1
+101	477 1
+101	517 1
+101	756 1
+101	761 1
+101	1077 1
+101	1478 1
+101	8287 1
+383	15 1
+383	56 1
+383	140 1
+383	150 1
+383	175 1
+383	182 1
+383	224 1
+383	243 1
+383	246 1
+383	255 1
+383	282 1
+383	428 1
+383	560 1
+383	601 1
+383	611 1
+383	622 1
+383	631 1
+383	659 1
+383	739 1
+383	746 1
+383	756 1
+383	762 1
+383	1166 1
+383	1646 1
+383	2206 1
+383	2297 1
+383	2324 1
+383	2398 1
+383	2411 1
+383	2508 1
+383	2535 1
+383	2674 1
+383	2770 1
+383	3026 1
+383	3089 1
+383	3352 1
+383	3480 1
+383	3529 1
+383	3537 1
+383	3615 1
+383	3680 1
+383	4110 1
+383	4977 1
+383	5254 1
+383	6296 1
+384	243 1
+391	3776 1
+393	394 1
+395	35 1
+395	282 1
+395	321 1
+395	396 1
+395	967 1
+395	1357 1
+395	1384 1
+395	1389 1
+395	1418 1
+395	1506 1
+395	1593 1
+395	1919 1
+395	1956 1
+395	2398 1
+395	2851 1
+395	2963 1
+395	3634 1
+395	4037 1
+395	4175 1
+395	4179 1
+395	4341 1
+395	4709 1
+395	5028 1
+395	5199 1
+395	5479 1
+395	5524 1
+395	5563 1
+395	5596 1
+395	5818 1
+395	5872 1
+395	6227 1
+395	6869 1
+395	6904 1
+395	6934 1
+395	6976 1
+395	7115 1
+395	7414 1
+395	7512 1
+395	7553 1
+395	7795 1
+395	7890 1
+395	8163 1
+397	402 1
+398	402 1
+398	3792 1
+398	5295 1
+398	5543 1
+398	5739 1
+398	6001 1
+398	6890 1
+399	271 1
+399	402 1
+399	560 1
+399	579 1
+399	715 1
+399	1513 1
+400	192 1
+400	243 1
+400	271 1
+400	299 1
+400	321 1
+400	402 1
+400	606 1
+400	686 1
+400	769 1
+400	1044 1
+400	1723 1
+400	8284 1
+401	402 1
+403	75 1
+403	402 1
+403	425 1
+403	739 1
+403	974 1
+403	1166 1
+403	1211 1
+403	1521 1
+403	1705 1
+403	1744 1
+403	1746 1
+403	2053 1
+403	2144 1
+403	2264 1
+403	2416 1
+403	2599 1
+403	2814 1
+403	2834 1
+403	2922 1
+403	2966 1
+404	402 1
+404	403 1
+404	1521 1
+404	1744 1
+404	1746 1
+405	56 1
+405	246 1
+405	271 1
+405	290 1
+405	402 1
+405	637 1
+405	658 1
+405	677 1
+405	697 1
+405	1030 1
+405	1053 1
+405	1277 1
+405	2134 1
+405	2790 1
+405	2859 1
+405	2973 1
+405	3459 1
+405	3680 1
+405	5412 1
+406	178 1
+406	236 1
+406	255 1
+406	282 1
+406	306 1
+406	310 1
+406	319 1
+406	325 1
+406	402 1
+406	440 1
+406	538 1
+406	560 1
+406	636 1
+406	667 1
+406	668 1
+406	670 1
+406	675 1
+406	677 1
+406	681 1
+406	684 1
+406	687 1
+406	756 1
+406	1648 1
+406	1661 1
+406	2369 1
+406	2511 1
+406	2657 1
+406	3631 1
+406	5822 1
+406	6555 1
+406	6624 1
+406	6774 1
+406	6979 1
+406	7094 1
+407	15 1
+407	72 1
+407	204 1
+407	214 1
+407	230 1
+407	285 1
+407	298 1
+407	308 1
+407	372 1
+407	402 1
+407	406 1
+407	415 1
+407	429 1
+407	506 1
+407	579 1
+407	673 1
+407	696 1
+407	697 1
+407	722 1
+407	762 1
+407	763 1
+407	838 1
+407	844 1
+407	887 1
+407	937 1
+407	946 1
+407	958 1
+407	989 1
+407	993 1
+407	1000 1
+407	1014 1
+407	1026 1
+407	1049 1
+407	1111 1
+407	1141 1
+407	1164 1
+407	1199 1
+407	1201 1
+407	1230 1
+407	1236 1
+407	1248 1
+407	1284 1
+407	1285 1
+407	1297 1
+407	1322 1
+407	1407 1
+407	1413 1
+407	1425 1
+407	1471 1
+407	1482 1
+407	1489 1
+407	1492 1
+407	1496 1
+407	1497 1
+407	1525 1
+407	1534 1
+407	1566 1
+407	1573 1
+407	1585 1
+407	1622 1
+407	1629 1
+407	1633 1
+407	1641 1
+407	1648 1
+407	1652 1
+407	1654 1
+407	1658 1
+407	1661 1
+407	1662 1
+407	1718 1
+407	1723 1
+407	1752 1
+407	1758 1
+407	1787 1
+407	1816 1
+407	1835 1
+407	1858 1
+407	1859 1
+407	1884 1
+407	1893 1
+407	1903 1
+407	1908 1
+407	1918 1
+407	1927 1
+407	1953 1
+407	1955 1
+407	1956 1
+407	1963 1
+407	1966 1
+407	1969 1
+407	1973 1
+407	1979 1
+407	1987 1
+407	1991 1
+407	1997 1
+407	2066 1
+407	2073 1
+407	2097 1
+407	2106 1
+407	2120 1
+407	2128 1
+407	2137 1
+407	2151 1
+407	2168 1
+407	2211 1
+407	2264 1
+407	2323 1
+407	2354 1
+407	2398 1
+407	2400 1
+407	2433 1
+407	2517 1
+407	2535 1
+407	2587 1
+407	2594 1
+407	2617 1
+407	2625 1
+407	2693 1
+407	2774 1
+407	2775 1
+407	2811 1
+407	2977 1
+407	3014 1
+407	3020 1
+407	3130 1
+407	3334 1
+407	3580 1
+407	3645 1
+407	3835 1
+407	4037 1
+407	4335 1
+407	4735 1
+407	4846 1
+407	4980 1
+407	5412 1
+407	5484 1
+407	5524 1
+407	5559 1
+407	5568 1
+407	5817 1
+407	6246 1
+407	6770 1
+407	7306 1
+407	8290 1
+407	8293 1
+408	402 1
+409	402 1
+409	875 1
+410	140 1
+410	402 1
+410	407 1
+410	428 1
+410	431 1
+410	433 1
+411	402 1
+413	402 1
+415	35 1
+415	405 1
+415	549 1
+415	1330 1
+414	39 1
+414	415 1
+414	656 1
+325	232 1
+325	282 1
+325	415 1
+325	428 1
+325	560 1
+325	590 1
+325	601 1
+325	606 1
+325	607 1
+325	739 1
+325	1031 1
+325	1211 1
+325	1360 1
+325	1549 1
+325	1688 1
+325	2066 1
+325	2134 1
+325	2348 1
+325	2790 1
+325	2909 1
+325	3352 1
+325	3967 1
+325	4037 1
+325	4233 1
+325	4808 1
+416	226 1
+416	560 1
+417	226 1
+417	422 1
+417	431 1
+417	433 1
+417	435 1
+417	974 1
+417	1297 1
+417	2066 1
+417	3005 1
+418	140 1
+427	259 1
+427	820 1
+427	1384 1
+427	1593 1
+427	4175 1
+427	4179 1
+423	56 1
+423	214 1
+423	427 1
+423	1384 1
+423	1593 1
+423	1747 1
+423	1956 1
+424	310 1
+424	427 1
+424	428 1
+424	838 1
+424	857 1
+424	893 1
+425	204 1
+425	280 1
+425	285 1
+425	407 1
+425	427 1
+425	663 1
+425	1165 1
+425	1493 1
+425	1549 1
+425	1730 1
+425	1777 1
+425	1857 1
+425	1893 1
+425	1982 1
+425	2160 1
+425	2231 1
+425	2433 1
+425	2560 1
+425	2565 1
+425	2576 1
+425	2643 1
+425	2700 1
+425	2708 1
+425	2877 1
+425	2880 1
+425	2951 1
+425	2963 1
+425	3020 1
+425	3030 1
+425	3089 1
+425	3351 1
+425	3580 1
+425	4065 1
+425	4373 1
+425	4530 1
+425	4875 1
+425	5079 1
+425	5233 1
+425	5321 1
+425	5384 1
+425	5404 1
+425	5487 1
+425	5798 1
+425	5800 1
+425	5811 1
+425	5835 1
+425	6241 1
+425	6255 1
+425	6323 1
+425	6337 1
+425	6424 1
+425	6447 1
+425	6599 1
+425	6613 1
+425	6725 1
+425	6770 1
+425	6803 1
+425	6805 1
+425	6809 1
+425	6813 1
+425	6832 1
+425	6833 1
+425	6855 1
+425	6979 1
+425	6982 1
+425	7047 1
+425	7054 1
+425	7108 1
+425	7131 1
+425	7351 1
+425	7422 1
+425	7442 1
+425	7553 1
+425	7587 1
+425	7632 1
+425	7707 1
+425	8291 1
+425	8293 1
+425	8295 1
+426	28 1
+426	32 1
+426	39 1
+426	49 1
+426	56 1
+426	75 1
+426	105 1
+426	151 1
+426	152 1
+426	178 1
+426	182 1
+426	192 1
+426	232 1
+426	236 1
+426	282 1
+426	299 1
+426	322 1
+426	341 1
+426	368 1
+426	427 1
+426	428 1
+426	431 1
+426	433 1
+426	435 1
+426	440 1
+426	477 1
+426	506 1
+426	514 1
+426	515 1
+426	517 1
+426	524 1
+426	538 1
+426	560 1
+426	566 1
+426	567 1
+426	586 1
+426	589 1
+426	592 1
+426	8282 1
+426	8284 1
+426	8287 1
+429	428 1
+429	435 1
+429	837 1
+429	839 1
+429	1049 1
+430	49 1
+430	108 1
+430	151 1
+430	431 1
+430	991 1
+432	36 1
+432	178 1
+432	308 1
+432	310 1
+432	317 1
+432	321 1
+432	332 1
+432	403 1
+432	407 1
+432	429 1
+432	433 1
+432	559 1
+432	618 1
+432	637 1
+432	664 1
+432	665 1
+432	675 1
+432	691 1
+432	697 1
+432	700 1
+432	715 1
+432	719 1
+432	722 1
+432	723 1
+432	743 1
+432	749 1
+432	765 1
+432	769 1
+432	798 1
+432	802 1
+432	813 1
+432	817 1
+432	837 1
+432	839 1
+432	844 1
+432	849 1
+432	861 1
+432	864 1
+432	868 1
+432	895 1
+432	960 1
+432	978 1
+432	993 1
+432	999 1
+432	1031 1
+432	1039 1
+432	1044 1
+432	1049 1
+432	1055 1
+432	1103 1
+432	1186 1
+432	1201 1
+432	1250 1
+432	1285 1
+432	1296 1
+432	1305 1
+432	1378 1
+432	1402 1
+432	1407 1
+432	1446 1
+432	1464 1
+432	1524 1
+432	1531 1
+432	1542 1
+432	1608 1
+432	1621 1
+432	1622 1
+432	1628 1
+432	1648 1
+432	1661 1
+432	1669 1
+432	1706 1
+432	1717 1
+432	1723 1
+432	1746 1
+432	1769 1
+432	1802 1
+432	1808 1
+432	1811 1
+432	1842 1
+432	1858 1
+432	1888 1
+432	1893 1
+432	1927 1
+432	1963 1
+432	1964 1
+432	2066 1
+432	2079 1
+432	2091 1
+432	2117 1
+432	2193 1
+432	2237 1
+432	2251 1
+432	2257 1
+432	2264 1
+432	2329 1
+432	2333 1
+432	2375 1
+432	2485 1
+432	2592 1
+432	2604 1
+432	2643 1
+432	2669 1
+432	2696 1
+432	2819 1
+432	2851 1
+432	2871 1
+432	2932 1
+432	2958 1
+432	2963 1
+432	3002 1
+432	3024 1
+432	3026 1
+432	3027 1
+432	3033 1
+432	3059 1
+432	3148 1
+432	3310 1
+432	3352 1
+432	3408 1
+432	3417 1
+432	3447 1
+432	3480 1
+432	3635 1
+432	3680 1
+432	3796 1
+432	3803 1
+432	4037 1
+432	4055 1
+432	4124 1
+432	4261 1
+432	4400 1
+432	4551 1
+432	4578 1
+432	4587 1
+432	4600 1
+432	4653 1
+432	4666 1
+432	4687 1
+432	4706 1
+432	4827 1
+432	5073 1
+432	5130 1
+432	5222 1
+432	5430 1
+432	5459 1
+432	5466 1
+432	5651 1
+432	5693 1
+432	6227 1
+432	6780 1
+432	6832 1
+432	6875 1
+432	7443 1
+432	7813 1
+432	7862 1
+432	7961 1
+434	435 1
+434	4361 1
+434	5897 1
+434	6832 1
+434	7351 1
+434	7381 1
+436	232 1
+437	232 1
+438	178 1
+412	151 1
+412	178 1
+412	290 1
+412	403 1
+412	560 1
+412	681 1
+412	715 1
+412	838 1
+412	844 1
+412	859 1
+412	868 1
+412	937 1
+412	1151 1
+412	1919 1
+412	2066 1
+412	2120 1
+412	2397 1
+412	2625 1
+412	3130 1
+412	3813 1
+412	5055 1
+439	86 1
+439	178 1
+439	271 1
+439	644 1
+439	733 1
+439	895 1
+439	1192 1
+439	2157 1
+440	28 1
+440	49 1
+440	178 1
+440	236 1
+440	282 1
+440	538 1
+440	560 1
+440	8284 1
+441	178 1
+443	28 1
+447	28 1
+447	75 1
+447	350 1
+447	417 1
+447	514 1
+447	1049 1
+447	1384 1
+447	1997 1
+447	2685 1
+447	3321 1
+447	3352 1
+447	4037 1
+447	4735 1
+447	5384 1
+447	7992 1
+444	28 1
+444	55 1
+451	28 1
+448	28 1
+449	28 1
+449	2209 1
+449	3007 1
+449	3010 1
+449	3548 1
+449	4400 1
+449	4402 1
+449	4735 1
+449	6221 1
+446	28 1
+450	28 1
+211	28 1
+211	517 1
+453	192 1
+454	8 1
+454	28 1
+454	49 1
+454	75 1
+454	192 1
+454	506 1
+454	517 1
+454	524 1
+454	8287 1
+455	28 1
+455	192 1
+455	322 1
+455	1092 1
+456	192 1
+456	817 1
+456	3755 1
+456	4687 1
+456	4981 1
+457	15 1
+457	35 1
+457	56 1
+457	64 1
+457	72 1
+457	155 1
+457	192 1
+457	227 1
+457	271 1
+457	290 1
+457	298 1
+457	299 1
+457	311 1
+457	506 1
+457	545 1
+457	559 1
+457	575 1
+457	587 1
+457	608 1
+457	633 1
+457	643 1
+457	663 1
+457	696 1
+457	697 1
+457	707 1
+457	722 1
+457	737 1
+457	741 1
+457	762 1
+457	763 1
+457	764 1
+457	789 1
+457	810 1
+457	826 1
+457	836 1
+457	856 1
+457	857 1
+457	861 1
+457	871 1
+457	873 1
+457	904 1
+457	908 1
+457	922 1
+457	935 1
+457	941 1
+457	946 1
+457	959 1
+457	960 1
+457	963 1
+457	971 1
+457	975 1
+457	993 1
+457	1000 1
+457	1012 1
+457	1018 1
+457	1022 1
+457	1026 1
+457	1055 1
+457	1061 1
+457	1062 1
+457	1080 1
+457	1103 1
+457	1111 1
+457	1151 1
+457	1157 1
+457	1159 1
+457	1167 1
+457	1193 1
+457	1199 1
+457	1200 1
+457	1201 1
+457	1211 1
+457	1222 1
+457	1230 1
+457	1234 1
+457	1241 1
+457	1247 1
+457	1260 1
+457	1282 1
+457	1284 1
+457	1285 1
+457	1286 1
+457	1297 1
+457	1310 1
+457	1319 1
+457	1322 1
+457	1352 1
+457	1353 1
+457	1357 1
+457	1374 1
+457	1377 1
+457	1378 1
+457	1385 1
+457	1390 1
+457	1394 1
+457	1396 1
+457	1413 1
+457	1416 1
+457	1418 1
+457	1420 1
+457	1482 1
+457	1484 1
+457	1487 1
+457	1490 1
+457	1492 1
+457	1493 1
+457	1496 1
+457	1497 1
+457	1507 1
+457	1514 1
+457	1520 1
+457	1524 1
+457	1531 1
+457	1533 1
+457	1534 1
+457	1537 1
+457	1538 1
+457	1547 1
+457	1549 1
+457	1555 1
+457	1556 1
+457	1563 1
+457	1566 1
+457	1569 1
+457	1573 1
+457	1580 1
+457	1585 1
+457	1593 1
+457	1596 1
+457	1600 1
+457	1604 1
+457	1622 1
+457	1628 1
+457	1633 1
+457	1638 1
+457	1648 1
+457	1654 1
+457	1658 1
+457	1679 1
+457	1680 1
+457	1705 1
+457	1717 1
+457	1726 1
+457	1729 1
+457	1733 1
+457	1734 1
+457	1752 1
+457	1754 1
+457	1757 1
+457	1758 1
+457	1768 1
+457	1772 1
+457	1774 1
+457	1783 1
+457	1788 1
+457	1791 1
+457	1798 1
+457	1799 1
+457	1802 1
+457	1805 1
+457	1811 1
+457	1814 1
+457	1816 1
+457	1835 1
+457	1836 1
+457	1842 1
+457	1848 1
+457	1849 1
+457	1855 1
+457	1859 1
+457	1880 1
+457	1884 1
+457	1888 1
+457	1893 1
+457	1908 1
+457	1915 1
+457	1918 1
+457	1953 1
+457	1966 1
+457	1969 1
+457	1972 1
+457	1973 1
+457	1979 1
+457	1982 1
+457	1987 1
+457	1990 1
+457	1991 1
+457	2001 1
+457	2004 1
+457	2071 1
+457	2091 1
+457	2106 1
+457	2117 1
+457	2120 1
+457	2128 1
+457	2137 1
+457	2144 1
+457	2145 1
+457	2151 1
+457	2157 1
+457	2160 1
+457	2165 1
+457	2209 1
+457	2225 1
+457	2237 1
+457	2240 1
+457	2241 1
+457	2246 1
+457	2252 1
+457	2253 1
+457	2273 1
+457	2277 1
+457	2289 1
+457	2324 1
+457	2328 1
+457	2350 1
+457	2354 1
+457	2356 1
+457	2364 1
+457	2366 1
+457	2397 1
+457	2398 1
+457	2411 1
+457	2416 1
+457	2433 1
+457	2435 1
+457	2440 1
+457	2456 1
+457	2490 1
+457	2504 1
+457	2511 1
+457	2516 1
+457	2517 1
+457	2535 1
+457	2565 1
+457	2576 1
+457	2579 1
+457	2580 1
+457	2605 1
+457	2612 1
+457	2620 1
+457	2625 1
+457	2651 1
+457	2653 1
+457	2654 1
+457	2687 1
+457	2689 1
+457	2693 1
+457	2696 1
+457	2708 1
+457	2727 1
+457	2746 1
+457	2763 1
+457	2764 1
+457	2765 1
+457	2768 1
+457	2774 1
+457	2775 1
+457	2785 1
+457	2811 1
+457	2818 1
+457	2822 1
+457	2831 1
+457	2843 1
+457	2851 1
+457	2859 1
+457	2871 1
+457	2877 1
+457	2900 1
+457	2923 1
+457	2932 1
+457	2958 1
+457	2973 1
+457	2996 1
+457	2999 1
+457	3010 1
+457	3014 1
+457	3020 1
+457	3026 1
+457	3034 1
+457	3059 1
+457	3084 1
+457	3089 1
+457	3106 1
+457	3117 1
+457	3125 1
+457	3136 1
+457	3140 1
+457	3144 1
+457	3192 1
+457	3200 1
+457	3253 1
+457	3274 1
+457	3276 1
+457	3291 1
+457	3321 1
+457	3324 1
+457	3334 1
+457	3352 1
+457	3371 1
+457	3376 1
+457	3394 1
+457	3404 1
+457	3408 1
+457	3409 1
+457	3439 1
+457	3443 1
+457	3447 1
+457	3454 1
+457	3456 1
+457	3459 1
+457	3460 1
+457	3463 1
+457	3464 1
+457	3479 1
+457	3483 1
+457	3498 1
+457	3529 1
+457	3537 1
+457	3557 1
+457	3562 1
+457	3568 1
+457	3586 1
+457	3614 1
+457	3615 1
+457	3634 1
+457	3643 1
+457	3646 1
+457	3660 1
+457	3661 1
+457	3680 1
+457	3691 1
+457	3724 1
+457	3726 1
+457	3755 1
+457	3769 1
+457	3796 1
+457	3803 1
+457	3807 1
+457	3812 1
+457	3830 1
+457	3843 1
+457	3847 1
+457	3849 1
+457	3854 1
+457	3871 1
+457	3887 1
+457	3897 1
+457	3910 1
+457	3911 1
+457	3919 1
+457	3922 1
+457	3956 1
+457	3958 1
+457	3962 1
+457	3976 1
+457	4011 1
+457	4013 1
+457	4037 1
+457	4040 1
+457	4041 1
+457	4044 1
+457	4065 1
+457	4098 1
+457	4099 1
+457	4124 1
+457	4173 1
+457	4191 1
+457	4231 1
+457	4233 1
+457	4247 1
+457	4256 1
+457	4263 1
+457	4269 1
+457	4297 1
+457	4315 1
+457	4335 1
+457	4361 1
+457	4400 1
+457	4401 1
+457	4412 1
+457	4441 1
+457	4448 1
+457	4482 1
+457	4483 1
+457	4488 1
+457	4507 1
+457	4510 1
+457	4527 1
+457	4530 1
+457	4534 1
+457	4536 1
+457	4547 1
+457	4574 1
+457	4587 1
+457	4600 1
+457	4613 1
+457	4621 1
+457	4653 1
+457	4666 1
+457	4687 1
+457	4689 1
+457	4709 1
+457	4712 1
+457	4713 1
+457	4715 1
+457	4717 1
+457	4735 1
+457	4748 1
+457	4764 1
+457	4781 1
+457	4791 1
+457	4792 1
+457	4795 1
+457	4797 1
+457	4798 1
+457	4811 1
+457	4814 1
+457	4820 1
+457	4824 1
+457	4827 1
+457	4828 1
+457	4831 1
+457	4846 1
+457	4875 1
+457	4879 1
+457	4899 1
+457	4929 1
+457	4940 1
+457	4944 1
+457	4953 1
+457	4964 1
+457	4980 1
+457	4986 1
+457	4994 1
+457	4999 1
+457	5002 1
+457	5012 1
+457	5020 1
+457	5022 1
+457	5037 1
+457	5045 1
+457	5055 1
+457	5058 1
+457	5061 1
+457	5072 1
+457	5092 1
+457	5100 1
+457	5121 1
+457	5130 1
+457	5140 1
+457	5148 1
+457	5178 1
+457	5179 1
+457	5188 1
+457	5189 1
+457	5199 1
+457	5200 1
+457	5204 1
+457	5210 1
+457	5222 1
+457	5226 1
+457	5233 1
+457	5239 1
+457	5245 1
+457	5246 1
+457	5254 1
+457	5262 1
+457	5273 1
+457	5285 1
+457	5288 1
+457	5289 1
+457	5295 1
+457	5305 1
+457	5321 1
+457	5335 1
+457	5378 1
+457	5404 1
+457	5412 1
+457	5437 1
+457	5439 1
+457	5449 1
+457	5452 1
+457	5454 1
+457	5459 1
+457	5463 1
+457	5479 1
+457	5482 1
+457	5484 1
+457	5506 1
+457	5513 1
+457	5524 1
+457	5529 1
+457	5543 1
+457	5545 1
+457	5559 1
+457	5563 1
+457	5584 1
+457	5596 1
+457	5614 1
+457	5623 1
+457	5626 1
+457	5630 1
+457	5631 1
+457	5637 1
+457	5638 1
+457	5639 1
+457	5640 1
+457	5651 1
+457	5663 1
+457	5680 1
+457	5683 1
+457	5684 1
+457	5693 1
+457	5697 1
+457	5705 1
+457	5714 1
+457	5721 1
+457	5732 1
+457	5737 1
+457	5738 1
+457	5739 1
+457	5743 1
+457	5753 1
+457	5757 1
+457	5760 1
+457	5775 1
+457	5776 1
+457	5780 1
+457	5792 1
+457	5798 1
+457	5799 1
+457	5800 1
+457	5801 1
+457	5802 1
+457	5804 1
+457	5806 1
+457	5809 1
+457	5811 1
+457	5812 1
+457	5814 1
+457	5817 1
+457	5818 1
+457	5822 1
+457	5827 1
+457	5829 1
+457	5830 1
+457	5832 1
+457	5844 1
+457	5850 1
+457	5860 1
+457	5871 1
+457	5872 1
+457	5886 1
+457	5891 1
+457	5897 1
+457	5902 1
+457	5928 1
+457	5931 1
+457	5932 1
+457	5933 1
+457	5950 1
+457	5969 1
+457	5973 1
+457	5980 1
+457	5991 1
+457	5994 1
+457	5998 1
+457	6001 1
+457	6004 1
+457	6006 1
+457	6009 1
+457	6010 1
+457	6021 1
+457	6032 1
+457	6044 1
+457	6094 1
+457	6097 1
+457	6106 1
+457	6124 1
+457	6149 1
+457	6156 1
+457	6161 1
+457	6166 1
+457	6170 1
+457	6218 1
+457	6221 1
+457	6227 1
+457	6229 1
+457	6243 1
+457	6261 1
+457	6270 1
+457	6272 1
+457	6296 1
+457	6299 1
+457	6302 1
+457	6305 1
+457	6306 1
+457	6323 1
+457	6327 1
+457	6328 1
+457	6334 1
+457	6337 1
+457	6347 1
+457	6376 1
+457	6388 1
+457	6400 1
+457	6407 1
+457	6409 1
+457	6417 1
+457	6422 1
+457	6432 1
+457	6437 1
+457	6441 1
+457	6442 1
+457	6447 1
+457	6458 1
+457	6464 1
+457	6472 1
+457	6474 1
+457	6481 1
+457	6491 1
+457	6496 1
+457	6498 1
+457	6503 1
+457	6505 1
+457	6528 1
+457	6529 1
+457	6552 1
+457	6554 1
+457	6560 1
+457	6571 1
+457	6576 1
+457	6589 1
+457	6594 1
+457	6595 1
+457	6600 1
+457	6606 1
+457	6613 1
+457	6632 1
+457	6634 1
+457	6663 1
+457	6665 1
+457	6668 1
+457	6682 1
+457	6685 1
+457	6686 1
+457	6699 1
+457	6715 1
+457	6720 1
+457	6725 1
+457	6739 1
+457	6770 1
+457	6774 1
+457	6780 1
+457	6783 1
+457	6784 1
+457	6788 1
+457	6803 1
+457	6832 1
+457	6840 1
+457	6860 1
+457	6869 1
+457	6873 1
+457	6875 1
+457	6890 1
+457	6897 1
+457	6901 1
+457	6907 1
+457	6913 1
+457	6930 1
+457	7021 1
+457	7034 1
+457	7050 1
+457	7073 1
+457	7074 1
+457	7092 1
+457	7094 1
+457	7237 1
+457	7238 1
+457	7279 1
+457	7280 1
+457	7341 1
+457	7351 1
+457	7381 1
+457	7389 1
+457	7400 1
+457	7414 1
+457	7450 1
+457	7478 1
+457	7491 1
+457	7529 1
+457	7544 1
+457	7553 1
+457	7561 1
+457	7587 1
+457	7624 1
+457	7649 1
+457	7662 1
+457	7757 1
+457	7791 1
+457	7810 1
+457	7833 1
+457	7835 1
+457	7860 1
+457	7910 1
+457	7924 1
+457	7946 1
+457	7957 1
+457	7961 1
+457	7965 1
+457	7979 1
+457	8037 1
+457	8044 1
+457	8050 1
+457	8051 1
+457	8121 1
+457	8134 1
+457	8141 1
+457	8174 1
+457	8198 1
+457	8209 1
+457	8212 1
+457	8219 1
+457	8224 1
+457	8226 1
+457	8249 1
+457	8290 1
+457	8291 1
+457	8292 1
+457	8293 1
+457	8295 1
+458	105 1
+458	192 1
+458	271 1
+458	1053 1
+460	28 1
+460	75 1
+460	514 1
+461	28 1
+461	75 1
+461	477 1
+461	515 1
+462	28 1
+462	75 1
+462	105 1
+462	8287 1
+463	28 1
+463	32 1
+463	105 1
+463	368 1
+463	517 1
+463	8287 1
+465	514 1
+465	1307 1
+465	1453 1
+465	2508 1
+465	3180 1
+465	3562 1
+465	3717 1
+465	3812 1
+465	3843 1
+465	3937 1
+465	3939 1
+465	3942 1
+465	3967 1
+465	5449 1
+465	8283 1
+465	8284 1
+465	8294 1
+467	32 1
+467	214 1
+467	259 1
+467	368 1
+467	517 1
+467	849 1
+467	893 1
+467	1151 1
+467	1186 1
+467	2625 1
+467	4247 1
+467	6156 1
+468	32 1
+164	35 1
+164	108 1
+164	151 1
+164	590 1
+164	628 1
+164	677 1
+164	1097 1
+164	1234 1
+472	8284 1
+476	477 1
+479	86 1
+479	243 1
+479	477 1
+479	545 1
+479	549 1
+479	686 1
+479	978 1
+479	1026 1
+480	477 1
+481	477 1
+486	8286 1
+473	105 1
+488	86 1
+488	105 1
+488	271 1
+488	549 1
+489	75 1
+489	105 1
+489	514 1
+489	524 1
+489	8287 1
+490	105 1
+492	299 1
+493	299 1
+493	739 1
+493	1718 1
+494	75 1
+494	299 1
+494	8287 1
+497	8 1
+497	152 1
+498	8 1
+498	75 1
+499	8 1
+499	86 1
+499	560 1
+499	626 1
+499	739 1
+499	789 1
+499	802 1
+499	829 1
+499	893 1
+499	999 1
+499	1080 1
+499	1186 1
+499	1193 1
+499	1218 1
+501	322 1
+501	325 1
+501	664 1
+501	704 1
+501	749 1
+501	817 1
+501	887 1
+501	2209 1
+501	2805 1
+501	3473 1
+502	86 1
+502	322 1
+502	417 1
+502	8287 1
+504	49 1
+507	506 1
+513	8 1
+513	514 1
+513	636 1
+513	739 1
+511	514 1
+511	3321 1
+511	8293 1
+509	514 1
+516	517 1
+519	524 1
+520	524 1
+525	524 1
+521	407 1
+521	524 1
+521	1018 1
+521	2257 1
+521	3352 1
+522	524 1
+523	524 1
+445	271 1
+445	524 1
+445	3309 1
+445	4547 1
+527	8287 1
+528	8287 1
+531	8287 1
+530	86 1
+530	243 1
+530	313 1
+530	549 1
+530	733 1
+530	958 1
+530	8287 1
+529	8287 1
+534	55 1
+534	2210 1
+534	2535 1
+534	3800 1
+536	39 1
+536	75 1
+536	368 1
+536	1211 1
+536	3755 1
+539	75 1
+539	3010 1
+540	75 1
+541	49 1
+541	55 1
+541	75 1
+542	15 1
+542	75 1
+542	228 1
+542	243 1
+542	372 1
+542	549 1
+542	2774 1
+543	55 1
+544	55 1
+544	6458 1
+545	35 1
+545	55 1
+545	243 1
+545	299 1
+545	334 1
+545	644 1
+545	647 1
+545	710 1
+545	803 1
+545	960 1
+545	978 1
+545	999 1
+545	1026 1
+545	1296 1
+545	1297 1
+545	1330 1
+545	1402 1
+545	1420 1
+545	2135 1
+545	2708 1
+545	3459 1
+545	6560 1
+545	7620 1
+545	7646 1
+546	55 1
+546	214 1
+546	290 1
+546	372 1
+546	415 1
+546	417 1
+546	665 1
+546	761 1
+546	762 1
+546	763 1
+546	764 1
+546	908 1
+546	937 1
+546	946 1
+546	974 1
+546	1026 1
+546	1034 1
+546	1151 1
+546	1164 1
+546	1165 1
+546	1166 1
+546	1211 1
+546	1230 1
+546	1261 1
+546	1284 1
+546	1297 1
+546	1307 1
+546	1357 1
+546	1407 1
+546	1482 1
+546	1547 1
+546	1571 1
+546	1621 1
+546	1658 1
+546	1680 1
+546	1697 1
+546	1717 1
+546	1734 1
+546	1772 1
+546	1808 1
+546	1816 1
+546	1836 1
+546	1837 1
+546	1842 1
+546	1847 1
+546	1849 1
+546	1858 1
+546	1884 1
+546	1893 1
+546	1901 1
+546	1908 1
+546	1927 1
+546	1935 1
+546	1953 1
+546	1955 1
+546	1956 1
+546	1963 1
+546	1966 1
+546	1969 1
+546	1973 1
+546	1979 1
+546	1982 1
+546	1987 1
+546	1990 1
+546	2055 1
+546	2071 1
+546	2072 1
+546	2073 1
+546	2128 1
+546	2144 1
+546	2145 1
+546	2160 1
+546	2209 1
+546	2210 1
+546	2289 1
+546	2297 1
+546	2385 1
+546	2397 1
+546	2411 1
+546	2440 1
+546	2474 1
+546	2542 1
+546	2544 1
+546	2625 1
+546	2643 1
+546	2660 1
+546	2763 1
+546	2805 1
+546	2859 1
+546	2877 1
+546	3005 1
+546	3136 1
+546	3260 1
+546	3334 1
+546	3352 1
+546	3443 1
+546	3452 1
+546	3479 1
+546	3516 1
+546	3562 1
+546	3614 1
+546	3650 1
+546	3811 1
+546	3946 1
+546	4037 1
+546	4099 1
+546	4173 1
+546	4191 1
+546	4199 1
+546	4424 1
+546	4453 1
+546	4463 1
+546	4536 1
+546	4578 1
+546	4712 1
+546	4719 1
+546	4795 1
+546	5254 1
+546	5273 1
+546	5295 1
+546	5298 1
+546	5484 1
+546	5524 1
+546	5584 1
+546	5605 1
+546	5697 1
+546	5800 1
+546	5807 1
+546	5871 1
+546	6407 1
+546	6421 1
+546	6441 1
+546	6523 1
+546	6553 1
+546	6576 1
+546	6590 1
+546	6715 1
+546	6784 1
+546	6840 1
+546	8290 1
+546	8291 1
+546	8292 1
+551	55 1
+218	55 1
+218	1077 1
+547	55 1
+548	55 1
+549	55 1
+549	243 1
+549	714 1
+549	4256 1
+550	55 1
+552	49 1
+552	1026 1
+560	271 1
+560	440 1
+560	559 1
+560	748 1
+560	750 1
+560	760 1
+560	1080 1
+560	1638 1
+553	259 1
+553	560 1
+553	600 1
+553	626 1
+553	769 1
+553	893 1
+553	1186 1
+553	1211 1
+553	1239 1
+553	1315 1
+553	1808 1
+553	1855 1
+553	2117 1
+553	2654 1
+553	2871 1
+553	3136 1
+553	3408 1
+553	4712 1
+553	5254 1
+553	5466 1
+553	6299 1
+553	7910 1
+554	560 1
+554	1103 1
+554	1566 1
+554	1842 1
+554	2654 1
+554	2697 1
+555	560 1
+555	893 1
+555	1855 1
+556	15 1
+556	35 1
+556	86 1
+556	150 1
+556	224 1
+556	227 1
+556	228 1
+556	230 1
+556	255 1
+556	259 1
+556	271 1
+556	282 1
+556	299 1
+556	321 1
+556	372 1
+556	405 1
+556	407 1
+556	417 1
+556	432 1
+556	439 1
+556	560 1
+556	600 1
+556	611 1
+556	617 1
+556	624 1
+556	626 1
+556	627 1
+556	628 1
+556	631 1
+556	643 1
+556	645 1
+556	650 1
+556	656 1
+556	657 1
+556	658 1
+556	659 1
+556	665 1
+556	667 1
+556	668 1
+556	675 1
+556	686 1
+556	697 1
+556	710 1
+556	722 1
+556	730 1
+556	733 1
+556	769 1
+556	803 1
+556	817 1
+556	829 1
+556	849 1
+556	853 1
+556	857 1
+556	863 1
+556	878 1
+556	893 1
+556	895 1
+556	897 1
+556	945 1
+556	993 1
+556	999 1
+556	1035 1
+556	1044 1
+556	1053 1
+556	1075 1
+556	1111 1
+556	1123 1
+556	1144 1
+556	1164 1
+556	1186 1
+556	1190 1
+556	1193 1
+556	1315 1
+556	1330 1
+556	1353 1
+556	1442 1
+556	1473 1
+556	1497 1
+556	1542 1
+556	1717 1
+556	1729 1
+556	1808 1
+556	1836 1
+556	1842 1
+556	1855 1
+556	1858 1
+556	1893 1
+556	1908 1
+556	1919 1
+556	1927 1
+556	1953 1
+556	1956 1
+556	1963 1
+556	1966 1
+556	1969 1
+556	1973 1
+556	1990 1
+556	2004 1
+556	2542 1
+556	2595 1
+556	2612 1
+556	2623 1
+556	2654 1
+556	2657 1
+556	2805 1
+556	3018 1
+556	3136 1
+556	3192 1
+556	3352 1
+556	3371 1
+556	3408 1
+556	3439 1
+556	3458 1
+556	3537 1
+556	3661 1
+556	4124 1
+556	4276 1
+556	4338 1
+556	4735 1
+556	5412 1
+556	5423 1
+557	560 1
+558	560 1
+559	560 1
+559	1802 1
+559	2076 1
+559	3755 1
+561	56 1
+561	152 1
+561	236 1
+561	282 1
+562	282 1
+563	282 1
+565	282 1
+564	150 1
+564	255 1
+564	282 1
+564	310 1
+564	311 1
+564	604 1
+564	656 1
+564	673 1
+564	730 1
+564	739 1
+564	756 1
+564	761 1
+564	895 1
+564	906 1
+564	4735 1
+567	371 1
+567	584 1
+568	567 1
+569	567 1
+570	56 1
+570	152 1
+570	567 1
+570	581 1
+571	567 1
+572	567 1
+572	1111 1
+572	1717 1
+572	2398 1
+572	3192 1
+573	567 1
+574	151 1
+574	282 1
+574	567 1
+574	587 1
+574	673 1
+575	152 1
+575	765 1
+575	1662 1
+579	152 1
+579	626 1
+579	1127 1
+579	1186 1
+576	152 1
+577	152 1
+578	152 1
+580	182 1
+580	1733 1
+580	2258 1
+580	2381 1
+580	3293 1
+580	3346 1
+580	3664 1
+580	4041 1
+580	4653 1
+580	4709 1
+580	4899 1
+580	4983 1
+580	5103 1
+580	5106 1
+580	5144 1
+580	5500 1
+580	5651 1
+580	6032 1
+580	6043 1
+580	6328 1
+580	6784 1
+580	7092 1
+580	7144 1
+580	7400 1
+580	7587 1
+580	7662 1
+580	7946 1
+580	7961 1
+580	7992 1
+580	8037 1
+583	56 1
+583	86 1
+583	214 1
+583	372 1
+583	628 1
+583	633 1
+583	737 1
+583	762 1
+583	789 1
+583	1026 1
+583	1859 1
+583	2102 1
+583	2398 1
+583	2535 1
+583	2763 1
+583	2775 1
+583	3334 1
+583	3443 1
+583	3576 1
+583	3897 1
+583	4687 1
+583	4977 1
+583	5421 1
+583	5449 1
+583	5671 1
+583	6914 1
+582	56 1
+582	589 1
+582	762 1
+582	1185 1
+582	1688 1
+582	2144 1
+582	2456 1
+582	2760 1
+582	2871 1
+582	3073 1
+582	3321 1
+582	3460 1
+582	3464 1
+582	3557 1
+582	3812 1
+582	3956 1
+582	4040 1
+582	4072 1
+582	4212 1
+582	4261 1
+582	4536 1
+582	4562 1
+582	4584 1
+582	4605 1
+582	4661 1
+582	4662 1
+582	4666 1
+582	4728 1
+582	4735 1
+582	4796 1
+582	4808 1
+582	4811 1
+582	4875 1
+582	5412 1
+584	371 1
+584	590 1
+584	604 1
+584	1600 1
+584	1638 1
+585	310 1
+585	371 1
+585	1307 1
+586	86 1
+586	151 1
+586	243 1
+586	403 1
+586	439 1
+586	616 1
+586	667 1
+586	673 1
+586	677 1
+586	733 1
+586	1080 1
+586	1201 1
+586	3005 1
+587	35 1
+587	589 1
+587	704 1
+587	794 1
+587	922 1
+587	941 1
+587	972 1
+587	991 1
+587	1286 1
+587	1425 1
+587	1439 1
+587	2375 1
+587	2625 1
+587	2877 1
+587	2918 1
+587	2922 1
+587	2926 1
+587	2928 1
+588	35 1
+588	587 1
+588	589 1
+588	859 1
+588	922 1
+588	941 1
+588	947 1
+588	959 1
+588	999 1
+588	1035 1
+588	1193 1
+588	1330 1
+588	1425 1
+588	1439 1
+588	1492 1
+588	1547 1
+588	1836 1
+588	1842 1
+588	1964 1
+588	2062 1
+588	2345 1
+588	2385 1
+590	36 1
+590	282 1
+590	429 1
+590	579 1
+590	829 1
+590	1026 1
+590	1062 1
+590	1375 1
+592	150 1
+592	175 1
+592	224 1
+592	280 1
+592	282 1
+592	606 1
+592	611 1
+592	619 1
+592	624 1
+592	628 1
+592	657 1
+592	863 1
+591	592 1
+591	673 1
+595	39 1
+595	2193 1
+593	39 1
+596	39 1
+594	39 1
+597	86 1
+597	151 1
+598	151 1
+599	151 1
+601	321 1
+601	600 1
+601	803 1
+601	1152 1
+601	1413 1
+601	1468 1
+601	1476 1
+601	2251 1
+601	4234 1
+600	15 1
+600	29 1
+600	35 1
+600	36 1
+600	72 1
+600	86 1
+600	227 1
+600	228 1
+600	243 1
+600	246 1
+600	259 1
+600	271 1
+600	282 1
+600	290 1
+600	299 1
+600	308 1
+600	311 1
+600	313 1
+600	321 1
+600	324 1
+600	350 1
+600	372 1
+600	407 1
+600	417 1
+600	439 1
+600	488 1
+600	549 1
+600	579 1
+600	601 1
+600	626 1
+600	637 1
+600	647 1
+600	665 1
+600	677 1
+600	704 1
+600	706 1
+600	722 1
+600	723 1
+600	730 1
+600	733 1
+600	739 1
+600	742 1
+600	746 1
+600	749 1
+600	750 1
+600	760 1
+600	762 1
+600	763 1
+600	769 1
+600	794 1
+600	798 1
+600	803 1
+600	817 1
+600	829 1
+600	844 1
+600	853 1
+600	856 1
+600	859 1
+600	864 1
+600	866 1
+600	873 1
+600	878 1
+600	885 1
+600	893 1
+600	895 1
+600	907 1
+600	932 1
+600	946 1
+600	960 1
+600	966 1
+600	999 1
+600	1023 1
+600	1026 1
+600	1049 1
+600	1053 1
+600	1075 1
+600	1080 1
+600	1100 1
+600	1103 1
+600	1111 1
+600	1165 1
+600	1186 1
+600	1193 1
+600	1297 1
+600	1310 1
+600	1315 1
+600	1330 1
+600	1352 1
+600	1353 1
+600	1374 1
+600	1377 1
+600	1407 1
+600	1471 1
+600	1473 1
+600	1476 1
+600	1484 1
+600	1497 1
+600	1514 1
+600	1521 1
+600	1548 1
+600	1549 1
+600	1555 1
+600	1564 1
+600	1585 1
+600	1633 1
+600	1661 1
+600	1717 1
+600	1808 1
+600	1835 1
+600	1836 1
+600	1837 1
+600	1842 1
+600	1847 1
+600	1855 1
+600	1884 1
+600	1919 1
+600	1927 1
+600	1956 1
+600	1963 1
+600	1977 1
+600	1979 1
+600	2004 1
+600	2060 1
+600	2066 1
+600	2106 1
+600	2117 1
+600	2210 1
+600	2225 1
+600	2251 1
+600	2256 1
+600	2297 1
+600	2323 1
+600	2328 1
+600	2398 1
+600	2409 1
+600	2475 1
+600	2479 1
+600	2535 1
+600	2542 1
+600	2576 1
+600	2587 1
+600	2593 1
+600	2595 1
+600	2617 1
+600	2625 1
+600	2643 1
+600	2652 1
+600	2660 1
+600	2736 1
+600	2775 1
+600	2851 1
+600	2871 1
+600	3002 1
+600	3009 1
+600	3018 1
+600	3033 1
+600	3034 1
+600	3136 1
+600	3164 1
+600	3192 1
+600	3352 1
+600	3408 1
+600	3443 1
+600	3458 1
+600	3568 1
+600	3681 1
+600	3755 1
+600	3769 1
+600	3804 1
+600	3835 1
+600	3962 1
+600	4037 1
+600	4071 1
+600	4191 1
+600	4276 1
+600	4289 1
+600	4310 1
+600	4338 1
+600	4384 1
+600	4441 1
+600	4510 1
+600	4709 1
+600	5226 1
+600	5254 1
+600	5341 1
+600	5404 1
+600	5423 1
+600	5449 1
+600	5452 1
+600	5484 1
+600	5511 1
+600	5524 1
+600	5543 1
+600	5714 1
+600	5829 1
+600	6004 1
+600	6229 1
+600	6330 1
+600	6560 1
+600	6566 1
+600	6613 1
+600	6739 1
+600	6774 1
+600	6833 1
+600	6855 1
+600	6892 1
+600	6946 1
+600	7050 1
+600	7115 1
+600	7912 1
+600	8042 1
+600	8174 1
+600	8212 1
+600	8219 1
+604	310 1
+604	325 1
+604	600 1
+604	636 1
+604	725 1
+604	746 1
+604	960 1
+604	1377 1
+602	604 1
+605	280 1
+606	280 1
+606	607 1
+606	611 1
+608	609 1
+608	5605 1
+608	6414 1
+610	611 1
+613	1638 1
+613	4078 1
+612	613 1
+616	282 1
+614	549 1
+614	600 1
+614	616 1
+614	659 1
+614	682 1
+614	715 1
+614	798 1
+614	938 1
+614	942 1
+614	945 1
+615	150 1
+615	246 1
+615	255 1
+615	282 1
+615	306 1
+615	319 1
+615	325 1
+615	432 1
+615	587 1
+615	616 1
+615	617 1
+615	622 1
+615	624 1
+615	627 1
+615	628 1
+615	636 1
+615	645 1
+615	650 1
+615	656 1
+615	657 1
+615	664 1
+615	668 1
+615	673 1
+615	675 1
+615	677 1
+615	684 1
+615	687 1
+615	694 1
+615	700 1
+615	719 1
+615	739 1
+615	750 1
+615	756 1
+615	760 1
+615	761 1
+618	282 1
+618	407 1
+618	600 1
+618	619 1
+618	673 1
+618	715 1
+618	844 1
+618	857 1
+618	875 1
+618	895 1
+618	955 1
+495	282 1
+495	622 1
+495	665 1
+495	2014 1
+495	2470 1
+495	4037 1
+620	86 1
+620	175 1
+620	622 1
+620	628 1
+620	643 1
+620	673 1
+620	730 1
+620	739 1
+620	741 1
+620	778 1
+620	881 1
+620	882 1
+620	979 1
+620	8289 1
+621	175 1
+624	627 1
+624	628 1
+625	624 1
+625	2398 1
+625	2774 1
+626	35 1
+626	86 1
+626	259 1
+626	282 1
+626	299 1
+626	432 1
+626	439 1
+626	579 1
+626	600 1
+626	627 1
+626	673 1
+626	707 1
+626	733 1
+626	802 1
+626	803 1
+626	817 1
+626	893 1
+626	960 1
+626	993 1
+626	1000 1
+626	1141 1
+626	1167 1
+626	1186 1
+626	1193 1
+626	1330 1
+626	1425 1
+626	1464 1
+626	1468 1
+626	1855 1
+626	2066 1
+626	3136 1
+628	1154 1
+632	282 1
+633	86 1
+633	171 1
+633	255 1
+633	271 1
+633	282 1
+633	298 1
+633	306 1
+633	310 1
+633	311 1
+633	313 1
+633	319 1
+633	407 1
+633	439 1
+633	600 1
+633	626 1
+633	636 1
+633	644 1
+633	656 1
+633	704 1
+633	706 1
+633	746 1
+633	749 1
+633	760 1
+633	769 1
+633	789 1
+633	798 1
+633	817 1
+633	820 1
+633	857 1
+633	863 1
+633	893 1
+633	906 1
+633	982 1
+633	1020 1
+633	1026 1
+633	1425 1
+633	1573 1
+633	1580 1
+633	1593 1
+633	1859 1
+633	1966 1
+633	2397 1
+633	2474 1
+633	3253 1
+633	3310 1
+633	3607 1
+633	4099 1
+633	4211 1
+633	4534 1
+633	5469 1
+633	5479 1
+633	5773 1
+633	6004 1
+633	6330 1
+633	7587 1
+634	15 1
+634	35 1
+634	214 1
+634	243 1
+634	271 1
+634	282 1
+634	290 1
+634	334 1
+634	417 1
+634	545 1
+634	579 1
+634	608 1
+634	626 1
+634	644 1
+634	647 1
+634	686 1
+634	697 1
+634	705 1
+634	737 1
+634	803 1
+634	813 1
+634	844 1
+634	853 1
+634	887 1
+634	935 1
+634	936 1
+634	938 1
+634	941 1
+634	946 1
+634	948 1
+634	958 1
+634	993 1
+634	999 1
+634	1006 1
+634	1044 1
+634	1061 1
+634	1157 1
+634	1164 1
+634	1186 1
+634	1190 1
+634	1193 1
+634	1196 1
+634	1200 1
+634	1201 1
+634	1218 1
+634	1253 1
+634	1261 1
+634	1284 1
+634	1285 1
+634	1286 1
+634	1296 1
+634	1297 1
+634	1319 1
+634	1321 1
+634	1330 1
+634	1357 1
+634	1378 1
+634	1382 1
+634	1385 1
+634	1389 1
+634	1390 1
+634	1403 1
+634	1476 1
+634	1486 1
+634	1514 1
+634	1537 1
+634	1564 1
+634	1585 1
+634	1688 1
+634	1689 1
+634	1707 1
+634	1717 1
+634	1723 1
+634	1744 1
+634	1757 1
+634	1774 1
+634	1842 1
+634	1965 1
+634	1966 1
+634	1972 1
+634	2071 1
+634	2073 1
+634	2079 1
+634	2225 1
+634	2289 1
+634	2328 1
+634	2440 1
+634	2485 1
+634	2542 1
+634	2565 1
+634	2579 1
+634	2618 1
+634	2625 1
+634	2653 1
+634	2654 1
+634	2774 1
+634	2831 1
+634	2851 1
+634	2871 1
+634	2955 1
+634	3192 1
+634	3276 1
+634	3394 1
+634	3455 1
+634	3456 1
+634	3516 1
+634	3554 1
+634	3580 1
+634	3755 1
+634	3796 1
+634	3803 1
+634	3892 1
+634	4037 1
+634	4041 1
+634	4099 1
+634	4175 1
+634	4290 1
+634	4297 1
+634	4323 1
+634	4400 1
+634	4424 1
+634	4748 1
+634	4929 1
+634	4994 1
+634	5002 1
+634	5103 1
+634	5106 1
+634	5200 1
+634	5233 1
+634	5288 1
+634	5404 1
+634	5437 1
+634	5459 1
+634	5509 1
+634	5524 1
+634	5527 1
+634	5539 1
+634	5543 1
+634	5773 1
+634	5814 1
+634	5818 1
+634	5827 1
+634	5922 1
+634	5925 1
+634	5936 1
+634	5994 1
+634	6148 1
+634	6227 1
+634	6869 1
+634	8288 1
+646	282 1
+646	762 1
+646	810 1
+646	963 1
+646	1385 1
+646	1412 1
+646	1425 1
+646	1484 1
+646	1734 1
+646	1754 1
+646	1781 1
+646	2697 1
+646	2830 1
+646	3089 1
+646	3140 1
+646	3150 1
+646	7862 1
+635	29 1
+635	35 1
+635	204 1
+635	271 1
+635	282 1
+635	285 1
+635	299 1
+635	304 1
+635	317 1
+635	407 1
+635	432 1
+635	587 1
+635	600 1
+635	643 1
+635	656 1
+635	659 1
+635	665 1
+635	704 1
+635	710 1
+635	714 1
+635	722 1
+635	730 1
+635	741 1
+635	779 1
+635	803 1
+635	857 1
+635	863 1
+635	937 1
+635	958 1
+635	982 1
+635	991 1
+635	1012 1
+635	1014 1
+635	1020 1
+635	1026 1
+635	1035 1
+635	1131 1
+635	1160 1
+635	1166 1
+635	1186 1
+635	1193 1
+635	1200 1
+635	1211 1
+635	1296 1
+635	1321 1
+635	1357 1
+635	1437 1
+635	1453 1
+635	1566 1
+635	1621 1
+635	1861 1
+635	1864 1
+635	2066 1
+635	2073 1
+635	2328 1
+635	2341 1
+635	2475 1
+635	2506 1
+635	2660 1
+635	2801 1
+635	3148 1
+635	3307 1
+635	3489 1
+635	3516 1
+635	4201 1
+635	4261 1
+636	271 1
+636	282 1
+636	407 1
+636	432 1
+636	663 1
+636	715 1
+636	739 1
+636	750 1
+636	806 1
+636	1201 1
+636	1524 1
+647	35 1
+647	243 1
+647	282 1
+647	299 1
+647	545 1
+647	587 1
+647	600 1
+647	626 1
+647	739 1
+647	836 1
+647	857 1
+647	985 1
+647	1031 1
+647	1053 1
+647	1123 1
+647	1186 1
+647	1193 1
+647	1218 1
+647	1297 1
+647	1330 1
+647	1378 1
+647	1390 1
+647	1497 1
+647	1547 1
+647	2062 1
+647	2281 1
+647	2322 1
+647	2345 1
+647	2348 1
+647	2350 1
+647	2385 1
+647	2397 1
+637	271 1
+637	282 1
+637	311 1
+637	317 1
+637	742 1
+637	762 1
+637	789 1
+637	838 1
+637	857 1
+637	863 1
+637	937 1
+637	977 1
+637	1014 1
+637	1026 1
+637	1573 1
+637	2237 1
+637	2517 1
+637	2565 1
+637	2651 1
+637	4037 1
+637	4335 1
+637	4712 1
+637	4820 1
+637	5254 1
+637	6833 1
+638	282 1
+640	214 1
+640	282 1
+640	644 1
+640	1186 1
+641	282 1
+641	686 1
+642	282 1
+642	656 1
+642	657 1
+648	150 1
+648	282 1
+643	72 1
+643	282 1
+643	311 1
+643	313 1
+643	600 1
+643	673 1
+643	715 1
+643	719 1
+643	725 1
+643	733 1
+643	746 1
+643	749 1
+643	750 1
+643	756 1
+643	798 1
+643	823 1
+643	866 1
+643	930 1
+643	958 1
+643	972 1
+643	1023 1
+643	1026 1
+643	1053 1
+643	1123 1
+643	1151 1
+643	1259 1
+643	1279 1
+643	1413 1
+643	1534 1
+643	1718 1
+643	1758 1
+643	1919 1
+643	1964 1
+643	2253 1
+643	2654 1
+643	3338 1
+643	3803 1
+643	3871 1
+643	4037 1
+643	4117 1
+643	4179 1
+643	4735 1
+643	6305 1
+643	6400 1
+643	6589 1
+643	6934 1
+644	35 1
+644	86 1
+644	271 1
+644	282 1
+644	313 1
+644	415 1
+644	425 1
+644	439 1
+644	549 1
+644	636 1
+644	677 1
+644	762 1
+644	863 1
+644	908 1
+644	1022 1
+644	1125 1
+644	1360 1
+644	1372 1
+644	1524 1
+644	1585 1
+644	1593 1
+644	2264 1
+644	2790 1
+644	2838 1
+644	2877 1
+644	2922 1
+644	2928 1
+645	29 1
+645	72 1
+645	214 1
+645	271 1
+645	282 1
+645	407 1
+645	659 1
+645	706 1
+645	817 1
+645	857 1
+645	863 1
+645	875 1
+645	1186 1
+645	1919 1
+645	4315 1
+645	6306 1
+649	150 1
+649	282 1
+649	304 1
+649	317 1
+649	407 1
+649	432 1
+649	447 1
+649	549 1
+649	600 1
+649	643 1
+649	650 1
+649	659 1
+649	673 1
+649	705 1
+649	714 1
+649	715 1
+649	719 1
+649	723 1
+649	730 1
+649	741 1
+649	778 1
+649	779 1
+649	789 1
+649	793 1
+649	794 1
+649	798 1
+649	802 1
+649	810 1
+649	820 1
+649	863 1
+649	878 1
+649	881 1
+649	882 1
+649	885 1
+649	995 1
+649	1007 1
+649	1014 1
+649	1186 1
+649	1453 1
+649	2643 1
+650	36 1
+650	214 1
+650	259 1
+650	271 1
+650	290 1
+650	308 1
+650	311 1
+650	332 1
+650	429 1
+650	488 1
+650	637 1
+650	657 1
+650	663 1
+650	667 1
+650	677 1
+650	682 1
+650	700 1
+650	714 1
+650	733 1
+650	748 1
+650	762 1
+650	765 1
+650	779 1
+650	794 1
+650	798 1
+650	806 1
+650	817 1
+650	829 1
+650	853 1
+650	857 1
+650	859 1
+650	868 1
+650	885 1
+650	895 1
+650	922 1
+650	932 1
+650	936 1
+650	955 1
+650	977 1
+650	978 1
+650	982 1
+650	995 1
+650	1020 1
+650	1026 1
+650	1030 1
+650	1053 1
+650	1144 1
+650	1156 1
+650	1186 1
+650	1192 1
+650	1211 1
+650	1267 1
+650	1286 1
+650	1296 1
+650	1297 1
+650	1375 1
+650	1382 1
+650	1413 1
+650	1418 1
+650	1419 1
+650	1453 1
+650	1507 1
+650	1592 1
+650	1608 1
+650	1734 1
+650	1836 1
+650	1997 1
+650	2053 1
+650	2117 1
+650	2128 1
+650	2225 1
+650	2234 1
+650	2323 1
+650	2332 1
+650	2333 1
+650	2339 1
+650	2397 1
+650	2400 1
+650	2425 1
+650	2484 1
+650	2576 1
+650	2587 1
+650	2593 1
+650	2625 1
+650	2655 1
+650	2669 1
+650	2785 1
+650	2830 1
+650	2880 1
+650	2951 1
+650	2955 1
+650	2972 1
+650	2977 1
+650	3034 1
+650	3082 1
+650	3117 1
+650	3130 1
+650	3256 1
+651	656 1
+651	714 1
+655	656 1
+652	549 1
+652	656 1
+653	656 1
+653	958 1
+654	656 1
+657	4110 1
+658	255 1
+658	664 1
+658	667 1
+658	1186 1
+658	1190 1
+658	6458 1
+659	35 1
+659	86 1
+659	204 1
+659	271 1
+659	417 1
+659	439 1
+659	545 1
+659	761 1
+659	857 1
+659	906 1
+659	978 1
+659	1193 1
+659	1297 1
+659	3755 1
+661	658 1
+661	1186 1
+662	658 1
+662	2655 1
+664	749 1
+664	797 1
+664	849 1
+664	906 1
+664	1374 1
+664	1489 1
+664	1513 1
+664	1569 1
+664	1718 1
+664	1864 1
+664	2470 1
+664	2651 1
+664	3755 1
+663	35 1
+663	36 1
+663	56 1
+663	72 1
+663	86 1
+663	171 1
+663	214 1
+663	243 1
+663	259 1
+663	271 1
+663	290 1
+663	299 1
+663	311 1
+663	321 1
+663	407 1
+663	425 1
+663	439 1
+663	600 1
+663	618 1
+663	636 1
+663	637 1
+663	643 1
+663	664 1
+663	667 1
+663	675 1
+663	677 1
+663	682 1
+663	684 1
+663	696 1
+663	697 1
+663	700 1
+663	704 1
+663	707 1
+663	710 1
+663	715 1
+663	719 1
+663	725 1
+663	730 1
+663	737 1
+663	739 1
+663	743 1
+663	746 1
+663	750 1
+663	756 1
+663	760 1
+663	761 1
+663	762 1
+663	769 1
+663	789 1
+663	794 1
+663	798 1
+663	817 1
+663	822 1
+663	844 1
+663	853 1
+663	857 1
+663	864 1
+663	868 1
+663	871 1
+663	875 1
+663	878 1
+663	881 1
+663	887 1
+663	903 1
+663	922 1
+663	929 1
+663	930 1
+663	934 1
+663	936 1
+663	947 1
+663	966 1
+663	971 1
+663	978 1
+663	979 1
+663	985 1
+663	993 1
+663	1007 1
+663	1020 1
+663	1026 1
+663	1043 1
+663	1053 1
+663	1123 1
+663	1125 1
+663	1128 1
+663	1140 1
+663	1166 1
+663	1167 1
+663	1193 1
+663	1211 1
+663	1222 1
+663	1234 1
+663	1241 1
+663	1261 1
+663	1266 1
+663	1270 1
+663	1287 1
+663	1319 1
+663	1360 1
+663	1374 1
+663	1394 1
+663	1496 1
+663	1498 1
+663	1525 1
+663	1538 1
+663	1573 1
+663	1603 1
+663	1661 1
+663	1688 1
+663	1754 1
+663	1769 1
+663	1956 1
+663	1961 1
+663	1966 1
+663	2066 1
+663	2102 1
+663	2135 1
+663	2174 1
+663	2223 1
+663	2242 1
+663	2324 1
+663	2364 1
+663	2381 1
+663	2485 1
+663	2535 1
+663	2560 1
+663	2592 1
+663	2643 1
+663	2700 1
+663	2830 1
+663	3014 1
+663	3084 1
+663	3253 1
+663	3284 1
+663	3452 1
+663	3456 1
+663	3635 1
+663	3661 1
+663	3897 1
+663	3910 1
+663	3962 1
+663	4040 1
+663	4099 1
+663	4269 1
+663	4400 1
+663	4424 1
+663	4480 1
+663	4485 1
+663	4846 1
+663	4980 1
+663	5092 1
+663	5144 1
+663	5204 1
+663	5806 1
+663	5887 1
+663	6123 1
+663	6634 1
+663	6784 1
+663	7809 1
+667	332 1
+667	665 1
+667	1111 1
+667	1193 1
+667	1729 1
+667	1927 1
+667	2135 1
+667	2470 1
+667	2763 1
+667	2958 1
+667	3009 1
+667	3404 1
+667	4037 1
+667	4463 1
+667	4600 1
+667	4687 1
+667	5421 1
+667	6006 1
+667	7553 1
+665	56 1
+665	667 1
+665	1729 1
+665	2470 1
+665	2958 1
+665	3408 1
+665	4687 1
+666	665 1
+666	667 1
+668	3089 1
+668	6897 1
+639	86 1
+639	271 1
+639	313 1
+639	439 1
+639	668 1
+639	674 1
+639	696 1
+639	719 1
+639	749 1
+639	760 1
+639	761 1
+639	794 1
+639	810 1
+639	817 1
+639	823 1
+639	857 1
+639	863 1
+639	941 1
+639	943 1
+639	985 1
+639	989 1
+639	1023 1
+639	1026 1
+639	1030 1
+639	1201 1
+639	1222 1
+639	1277 1
+639	1286 1
+639	1382 1
+639	1453 1
+639	1484 1
+669	670 1
+673	86 1
+673	271 1
+673	407 1
+673	549 1
+673	565 1
+672	673 1
+675	4049 1
+674	86 1
+674	271 1
+674	308 1
+674	310 1
+674	317 1
+674	325 1
+674	406 1
+674	675 1
+674	733 1
+674	749 1
+674	857 1
+674	878 1
+674	895 1
+674	972 1
+674	981 1
+674	1222 1
+677	760 1
+677	817 1
+676	677 1
+678	681 1
+684	756 1
+684	1833 1
+683	684 1
+682	310 1
+682	636 1
+682	684 1
+686	171 1
+686	334 1
+686	338 1
+686	372 1
+686	407 1
+686	644 1
+686	663 1
+686	687 1
+686	710 1
+686	769 1
+686	803 1
+686	805 1
+686	826 1
+686	853 1
+686	861 1
+686	937 1
+686	943 1
+686	948 1
+686	956 1
+686	966 1
+686	971 1
+686	978 1
+686	981 1
+686	985 1
+686	1022 1
+686	1032 1
+686	1035 1
+686	1038 1
+686	1039 1
+686	1043 1
+686	1062 1
+686	1080 1
+686	1128 1
+686	1144 1
+686	1152 1
+686	1160 1
+686	1165 1
+686	1196 1
+686	1203 1
+686	1221 1
+686	1261 1
+686	1277 1
+686	1282 1
+686	1297 1
+686	1372 1
+686	1375 1
+686	1389 1
+686	1402 1
+686	1413 1
+686	1418 1
+686	1420 1
+686	1476 1
+686	1489 1
+686	1514 1
+686	1518 1
+686	1524 1
+686	1533 1
+686	1534 1
+686	1538 1
+686	1600 1
+686	1603 1
+686	1658 1
+686	1717 1
+686	1805 1
+686	1833 1
+686	1836 1
+686	1842 1
+686	1849 1
+686	1861 1
+686	1864 1
+686	1893 1
+686	1903 1
+686	1966 1
+686	1973 1
+686	2397 1
+686	3755 1
+686	5233 1
+686	5524 1
+686	5527 1
+686	6148 1
+686	6151 1
+686	8288 1
+686	8290 1
+688	310 1
+688	743 1
+688	1196 1
+688	3720 1
+688	3967 1
+689	86 1
+689	214 1
+689	259 1
+689	299 1
+689	310 1
+689	439 1
+689	644 1
+689	749 1
+689	789 1
+689	798 1
+689	873 1
+689	1018 1
+689	1039 1
+689	1186 1
+689	1297 1
+689	1307 1
+689	1413 1
+689	1613 1
+689	1787 1
+689	1805 1
+689	1859 1
+689	1864 1
+689	1992 1
+689	2128 1
+689	2157 1
+689	2163 1
+689	2333 1
+689	2397 1
+689	2398 1
+689	2411 1
+689	2517 1
+689	2580 1
+689	2593 1
+689	2643 1
+689	2736 1
+689	3089 1
+689	3173 1
+689	3180 1
+689	3371 1
+689	3393 1
+689	3926 1
+689	4021 1
+689	4666 1
+689	5412 1
+689	5452 1
+689	5637 1
+689	5790 1
+690	310 1
+690	3456 1
+690	4600 1
+691	36 1
+691	306 1
+691	429 1
+691	696 1
+691	817 1
+691	863 1
+691	928 1
+691	937 1
+691	1043 1
+691	1186 1
+691	1199 1
+691	1201 1
+691	1203 1
+691	1236 1
+691	1243 1
+691	1487 1
+691	1622 1
+691	1835 1
+691	1847 1
+691	1888 1
+691	1953 1
+691	1969 1
+691	2117 1
+691	6930 1
+692	306 1
+692	319 1
+692	325 1
+693	694 1
+695	15 1
+695	36 1
+695	56 1
+695	86 1
+695	204 1
+695	271 1
+695	290 1
+695	317 1
+695	324 1
+695	325 1
+695	346 1
+695	372 1
+695	439 1
+695	549 1
+695	600 1
+695	691 1
+695	704 1
+695	730 1
+695	733 1
+695	737 1
+695	756 1
+695	761 1
+695	762 1
+695	769 1
+695	789 1
+695	813 1
+695	863 1
+695	893 1
+695	932 1
+695	958 1
+695	971 1
+695	999 1
+695	1014 1
+695	1123 1
+695	1151 1
+695	1166 1
+695	1211 1
+695	1222 1
+695	1322 1
+695	1374 1
+695	1385 1
+695	1411 1
+695	1497 1
+695	1521 1
+695	1580 1
+695	1585 1
+695	1603 1
+695	1638 1
+695	1657 1
+695	1687 1
+695	1717 1
+695	1718 1
+695	1732 1
+695	1842 1
+695	1855 1
+695	1901 1
+695	1979 1
+695	1983 1
+695	2066 1
+695	2145 1
+695	2151 1
+695	2210 1
+695	2240 1
+695	2252 1
+695	2328 1
+695	2499 1
+695	2506 1
+695	2535 1
+695	2576 1
+695	2585 1
+695	2625 1
+695	2643 1
+695	2654 1
+695	2686 1
+695	2747 1
+695	2777 1
+695	2877 1
+695	2923 1
+695	3007 1
+695	3117 1
+695	3309 1
+695	3352 1
+695	3404 1
+695	3443 1
+695	3516 1
+695	3537 1
+695	3580 1
+695	3607 1
+695	3631 1
+695	3680 1
+695	3807 1
+695	3892 1
+695	3976 1
+695	4011 1
+695	4098 1
+695	4201 1
+695	4269 1
+695	4365 1
+695	4384 1
+695	4480 1
+695	4587 1
+695	4639 1
+695	4712 1
+695	4735 1
+695	4962 1
+695	4999 1
+695	5233 1
+695	5487 1
+695	5760 1
+695	5897 1
+695	6251 1
+695	6262 1
+695	6306 1
+695	6437 1
+695	6634 1
+695	6770 1
+695	7809 1
+695	8292 1
+699	406 1
+699	407 1
+699	647 1
+699	978 1
+699	1222 1
+699	1573 1
+699	1585 1
+699	1966 1
+701	15 1
+701	230 1
+701	432 1
+701	3334 1
+703	714 1
+704	271 1
+704	304 1
+704	308 1
+704	313 1
+704	317 1
+704	346 1
+704	545 1
+704	579 1
+704	647 1
+704	663 1
+704	673 1
+704	714 1
+704	723 1
+704	762 1
+704	765 1
+704	789 1
+704	805 1
+704	857 1
+704	859 1
+704	873 1
+704	908 1
+704	941 1
+704	948 1
+704	974 1
+704	985 1
+704	993 1
+704	999 1
+704	1007 1
+704	1026 1
+704	1034 1
+704	1097 1
+704	1125 1
+704	1166 1
+704	1201 1
+704	1222 1
+704	1241 1
+704	1297 1
+704	1396 1
+704	1413 1
+704	1453 1
+704	1471 1
+704	1501 1
+704	1514 1
+704	1595 1
+704	1603 1
+704	1633 1
+704	1757 1
+704	1787 1
+704	1903 1
+704	1966 1
+704	1987 1
+704	2066 1
+704	2102 1
+704	2106 1
+704	2117 1
+704	2119 1
+704	2181 1
+704	2225 1
+704	2231 1
+704	2341 1
+704	2400 1
+704	2579 1
+704	2593 1
+704	2625 1
+704	2643 1
+704	2655 1
+704	2660 1
+704	2662 1
+704	2708 1
+704	2809 1
+704	2811 1
+704	2814 1
+704	2912 1
+704	3005 1
+704	3028 1
+704	3253 1
+704	3473 1
+704	3680 1
+704	4661 1
+704	5204 1
+704	5412 1
+705	35 1
+705	171 1
+705	317 1
+705	674 1
+705	710 1
+705	714 1
+705	795 1
+705	823 1
+705	857 1
+705	878 1
+705	906 1
+705	922 1
+705	932 1
+705	941 1
+705	943 1
+705	958 1
+705	978 1
+705	981 1
+705	1007 1
+705	1029 1
+705	1062 1
+705	1127 1
+705	1201 1
+705	1222 1
+705	1270 1
+705	1282 1
+705	1413 1
+705	8289 1
+706	35 1
+706	36 1
+706	56 1
+706	259 1
+706	299 1
+706	317 1
+706	407 1
+706	549 1
+706	579 1
+706	600 1
+706	626 1
+706	659 1
+706	663 1
+706	710 1
+706	714 1
+706	741 1
+706	748 1
+706	761 1
+706	765 1
+706	778 1
+706	789 1
+706	803 1
+706	817 1
+706	829 1
+706	836 1
+706	838 1
+706	903 1
+706	913 1
+706	963 1
+706	978 1
+706	993 1
+706	1014 1
+706	1053 1
+706	1080 1
+706	1111 1
+706	1123 1
+706	1186 1
+706	1190 1
+706	1192 1
+706	1193 1
+706	1211 1
+706	1248 1
+706	1279 1
+706	1296 1
+706	1297 1
+706	1321 1
+706	1322 1
+706	1330 1
+706	1374 1
+706	1411 1
+706	1435 1
+706	1442 1
+706	1471 1
+706	1478 1
+706	1486 1
+706	1489 1
+706	1496 1
+706	1501 1
+706	1514 1
+706	1520 1
+706	1569 1
+706	1573 1
+706	1585 1
+706	1593 1
+706	1597 1
+706	1636 1
+706	1649 1
+706	1652 1
+706	1654 1
+706	1661 1
+706	1662 1
+706	1669 1
+706	1672 1
+706	1680 1
+706	1718 1
+706	1772 1
+706	1819 1
+706	1864 1
+706	1884 1
+706	1919 1
+706	1956 1
+706	1984 1
+706	2060 1
+706	2062 1
+706	2157 1
+706	2165 1
+706	2385 1
+706	2397 1
+706	2400 1
+706	2484 1
+706	2625 1
+706	2763 1
+706	2801 1
+706	3755 1
+706	8291 1
+707	35 1
+707	86 1
+707	227 1
+707	271 1
+707	290 1
+707	299 1
+707	311 1
+707	321 1
+707	372 1
+707	407 1
+707	432 1
+707	579 1
+707	626 1
+707	663 1
+707	682 1
+707	696 1
+707	697 1
+707	710 1
+707	714 1
+707	742 1
+707	762 1
+707	769 1
+707	784 1
+707	794 1
+707	795 1
+707	803 1
+707	813 1
+707	826 1
+707	853 1
+707	857 1
+707	861 1
+707	904 1
+707	907 1
+707	928 1
+707	938 1
+707	941 1
+707	945 1
+707	946 1
+707	948 1
+707	956 1
+707	971 1
+707	977 1
+707	978 1
+707	989 1
+707	991 1
+707	994 1
+707	999 1
+707	1007 1
+707	1020 1
+707	1023 1
+707	1026 1
+707	1030 1
+707	1038 1
+707	1039 1
+707	1053 1
+707	1055 1
+707	1061 1
+707	1062 1
+707	1075 1
+707	1123 1
+707	1131 1
+707	1167 1
+707	1190 1
+707	1192 1
+707	1193 1
+707	1201 1
+707	1203 1
+707	1211 1
+707	1234 1
+707	1248 1
+707	1253 1
+707	1261 1
+707	1297 1
+707	1319 1
+707	1330 1
+707	1372 1
+707	1375 1
+707	1377 1
+707	1389 1
+707	1402 1
+707	1428 1
+707	1471 1
+707	1476 1
+707	1484 1
+707	1486 1
+707	1489 1
+707	1490 1
+707	1496 1
+707	1497 1
+707	1506 1
+707	1514 1
+707	1518 1
+707	1521 1
+707	1525 1
+707	1532 1
+707	1537 1
+707	1538 1
+707	1542 1
+707	1556 1
+707	1563 1
+707	1564 1
+707	1573 1
+707	1580 1
+707	1587 1
+707	1593 1
+707	1600 1
+707	1603 1
+707	1608 1
+707	1621 1
+707	1661 1
+707	1662 1
+707	1701 1
+707	1718 1
+707	1726 1
+707	1774 1
+707	1808 1
+707	1842 1
+707	1855 1
+707	2053 1
+707	2625 1
+707	2643 1
+707	2843 1
+707	3136 1
+708	29 1
+708	171 1
+708	204 1
+708	271 1
+708	304 1
+708	311 1
+708	317 1
+708	321 1
+708	334 1
+708	407 1
+708	447 1
+708	545 1
+708	696 1
+708	707 1
+708	714 1
+708	764 1
+708	784 1
+708	789 1
+708	866 1
+708	930 1
+708	937 1
+708	947 1
+708	956 1
+708	958 1
+708	978 1
+708	981 1
+708	991 1
+708	1031 1
+708	1039 1
+708	1092 1
+708	1114 1
+708	1128 1
+708	1140 1
+708	1141 1
+708	1154 1
+708	1156 1
+708	1270 1
+708	1297 1
+708	1888 1
+708	2066 1
+708	2120 1
+708	2193 1
+708	2322 1
+708	2576 1
+708	2768 1
+708	2790 1
+708	2815 1
+708	2818 1
+708	2900 1
+708	2993 1
+708	3473 1
+709	714 1
+710	15 1
+710	35 1
+710	56 1
+710	230 1
+710	243 1
+710	271 1
+710	321 1
+710	407 1
+710	417 1
+710	644 1
+710	663 1
+710	686 1
+710	697 1
+710	704 1
+710	707 1
+710	714 1
+710	762 1
+710	769 1
+710	784 1
+710	789 1
+710	795 1
+710	857 1
+710	861 1
+710	937 1
+710	941 1
+710	955 1
+710	960 1
+710	972 1
+710	979 1
+710	989 1
+710	991 1
+710	993 1
+710	1026 1
+710	1038 1
+710	1043 1
+710	1044 1
+710	1053 1
+710	1055 1
+710	1062 1
+710	1092 1
+710	1100 1
+710	1123 1
+710	1127 1
+710	1141 1
+710	1152 1
+710	1193 1
+710	1199 1
+710	1201 1
+710	1211 1
+710	1230 1
+710	1234 1
+710	1261 1
+710	1267 1
+710	1277 1
+710	1279 1
+710	1286 1
+710	1297 1
+710	1319 1
+710	1360 1
+710	1377 1
+710	1413 1
+710	1428 1
+710	1439 1
+710	1496 1
+710	1514 1
+710	1525 1
+710	1564 1
+710	1585 1
+710	1593 1
+710	1633 1
+710	1648 1
+710	1705 1
+710	1718 1
+710	1734 1
+710	1754 1
+710	1768 1
+710	1774 1
+710	1956 1
+710	1969 1
+710	2117 1
+710	2120 1
+710	2174 1
+710	2225 1
+710	2276 1
+710	2290 1
+710	2339 1
+710	2381 1
+710	2474 1
+710	2542 1
+710	2625 1
+710	2651 1
+710	2657 1
+710	2801 1
+710	2900 1
+710	2923 1
+710	3284 1
+710	3376 1
+710	3456 1
+710	3516 1
+710	3537 1
+710	3671 1
+710	4735 1
+710	5412 1
+710	8289 1
+710	8292 1
+696	587 1
+696	714 1
+696	903 1
+696	930 1
+696	1026 1
+696	1125 1
+711	714 1
+712	304 1
+712	714 1
+712	795 1
+712	978 1
+712	1193 1
+712	1253 1
+712	1428 1
+712	1496 1
+712	1525 1
+712	1555 1
+712	1585 1
+712	1595 1
+712	1603 1
+712	1604 1
+712	1622 1
+712	1697 1
+712	1774 1
+712	1855 1
+712	1927 1
+713	332 1
+713	432 1
+713	714 1
+713	2426 1
+715	35 1
+715	227 1
+715	299 1
+715	334 1
+715	407 1
+715	644 1
+715	647 1
+715	719 1
+715	803 1
+715	857 1
+715	978 1
+715	999 1
+715	1006 1
+715	1062 1
+715	1075 1
+715	1193 1
+715	1221 1
+715	1282 1
+715	1286 1
+715	1296 1
+715	1321 1
+715	1330 1
+715	1637 1
+716	715 1
+717	715 1
+718	715 1
+719	715 1
+719	723 1
+719	1811 1
+719	3808 1
+720	715 1
+721	715 1
+722	36 1
+722	72 1
+722	86 1
+722	204 1
+722	214 1
+722	246 1
+722	290 1
+722	308 1
+722	346 1
+722	403 1
+722	407 1
+722	429 1
+722	439 1
+722	447 1
+722	608 1
+722	637 1
+722	643 1
+722	719 1
+722	723 1
+722	733 1
+722	737 1
+722	739 1
+722	746 1
+722	748 1
+722	760 1
+722	761 1
+722	762 1
+722	763 1
+722	765 1
+722	769 1
+722	784 1
+722	789 1
+722	813 1
+722	817 1
+722	825 1
+722	827 1
+722	839 1
+722	844 1
+722	856 1
+722	857 1
+722	893 1
+722	895 1
+722	897 1
+722	904 1
+722	906 1
+722	908 1
+722	932 1
+722	934 1
+722	935 1
+722	955 1
+722	963 1
+722	974 1
+722	977 1
+722	978 1
+722	989 1
+722	991 1
+722	993 1
+722	1018 1
+722	1026 1
+722	1049 1
+722	1053 1
+722	1127 1
+722	1154 1
+722	1157 1
+722	1164 1
+722	1166 1
+722	1167 1
+722	1186 1
+722	1201 1
+722	1211 1
+722	1218 1
+722	1232 1
+722	1234 1
+722	1236 1
+722	1250 1
+722	1261 1
+722	1267 1
+722	1277 1
+722	1291 1
+722	1297 1
+722	1307 1
+722	1321 1
+722	1357 1
+722	1374 1
+722	1378 1
+722	1385 1
+722	1402 1
+722	1420 1
+722	1441 1
+722	1442 1
+722	1453 1
+722	1473 1
+722	1485 1
+722	1525 1
+722	1534 1
+722	1537 1
+722	1556 1
+722	1566 1
+722	1573 1
+722	1593 1
+722	1596 1
+722	1597 1
+722	1603 1
+722	1612 1
+722	1633 1
+722	1637 1
+722	1641 1
+722	1646 1
+722	1669 1
+722	1705 1
+722	1717 1
+722	1718 1
+722	1733 1
+722	1734 1
+722	1744 1
+722	1754 1
+722	1777 1
+722	1783 1
+722	1805 1
+722	1836 1
+722	1847 1
+722	1849 1
+722	1859 1
+722	1864 1
+722	1918 1
+722	1956 1
+722	1992 1
+722	2053 1
+722	2066 1
+722	2097 1
+722	2101 1
+722	2102 1
+722	2117 1
+722	2120 1
+722	2145 1
+722	2157 1
+722	2234 1
+722	2237 1
+722	2251 1
+722	2252 1
+722	2256 1
+722	2294 1
+722	2326 1
+722	2333 1
+722	2340 1
+722	2375 1
+722	2398 1
+722	2410 1
+722	2411 1
+722	2416 1
+722	2470 1
+722	2501 1
+722	2565 1
+722	2570 1
+722	2571 1
+722	2575 1
+722	2576 1
+722	2579 1
+722	2587 1
+722	2591 1
+722	2607 1
+722	2618 1
+722	2625 1
+722	2629 1
+722	2643 1
+722	2647 1
+722	2651 1
+722	2653 1
+722	2654 1
+722	2662 1
+722	2670 1
+722	2697 1
+722	2707 1
+722	2720 1
+722	2721 1
+722	2727 1
+722	2754 1
+722	2775 1
+722	2777 1
+722	2785 1
+722	2787 1
+722	2790 1
+722	2794 1
+722	2797 1
+722	2799 1
+722	2801 1
+722	2818 1
+722	2821 1
+722	2825 1
+722	2830 1
+722	2838 1
+722	2856 1
+722	2877 1
+722	2880 1
+722	2900 1
+722	2902 1
+722	2917 1
+722	2918 1
+722	2926 1
+722	2940 1
+722	2946 1
+722	2951 1
+722	2968 1
+722	2972 1
+722	2991 1
+722	2993 1
+722	2996 1
+722	3007 1
+722	3018 1
+722	3020 1
+722	3029 1
+722	3033 1
+722	3034 1
+722	3050 1
+722	3056 1
+722	3068 1
+722	3089 1
+722	3117 1
+722	3140 1
+722	3145 1
+722	3173 1
+722	3253 1
+722	3255 1
+722	3258 1
+722	3276 1
+722	3371 1
+722	3393 1
+722	3408 1
+722	3435 1
+722	3443 1
+722	3480 1
+722	3580 1
+722	3609 1
+722	3680 1
+722	3681 1
+722	3755 1
+722	3796 1
+722	3812 1
+722	3897 1
+722	3958 1
+722	4037 1
+722	4103 1
+722	4201 1
+722	4266 1
+722	4735 1
+722	4797 1
+722	4798 1
+722	4820 1
+722	4980 1
+722	5022 1
+722	5263 1
+722	5323 1
+722	5326 1
+722	5341 1
+722	5392 1
+722	5454 1
+722	5484 1
+722	5928 1
+722	6299 1
+722	6432 1
+722	6714 1
+722	6784 1
+722	7553 1
+722	8292 1
+723	719 1
+725	749 1
+725	789 1
+725	849 1
+725	859 1
+725	1006 1
+725	1053 1
+724	725 1
+724	741 1
+724	1935 1
+724	3404 1
+726	739 1
+726	756 1
+727	72 1
+727	214 1
+727	271 1
+727	665 1
+727	737 1
+727	739 1
+727	1186 1
+727	1199 1
+727	1211 1
+727	1497 1
+727	1569 1
+727	1842 1
+727	1861 1
+727	1864 1
+727	1956 1
+727	1961 1
+727	2066 1
+727	2256 1
+727	2323 1
+727	2397 1
+727	2398 1
+727	2643 1
+727	2775 1
+727	2777 1
+727	2877 1
+727	3050 1
+727	3104 1
+727	3433 1
+727	4191 1
+727	4828 1
+727	5412 1
+727	6913 1
+728	600 1
+728	706 1
+728	739 1
+728	756 1
+728	817 1
+729	739 1
+730	35 1
+730	86 1
+730	243 1
+730	271 1
+730	299 1
+730	439 1
+730	600 1
+730	696 1
+730	704 1
+730	733 1
+730	739 1
+730	743 1
+730	749 1
+730	750 1
+730	838 1
+730	857 1
+730	893 1
+730	895 1
+730	955 1
+730	958 1
+730	983 1
+730	989 1
+730	1022 1
+730	1026 1
+730	1031 1
+730	1035 1
+730	1131 1
+730	1140 1
+730	1186 1
+730	1192 1
+730	1435 1
+730	1506 1
+730	2339 1
+730	5412 1
+731	739 1
+732	246 1
+732	549 1
+732	739 1
+732	857 1
+733	86 1
+733	439 1
+733	549 1
+733	739 1
+733	829 1
+733	1026 1
+733	1151 1
+733	1464 1
+737	246 1
+737	659 1
+737	739 1
+737	840 1
+737	938 1
+737	1403 1
+737	1493 1
+737	1823 1
+737	1865 1
+737	1982 1
+737	2381 1
+737	2433 1
+737	2440 1
+737	2565 1
+737	2620 1
+737	2851 1
+737	2940 1
+737	3084 1
+737	3092 1
+737	3106 1
+737	3238 1
+737	3284 1
+737	3452 1
+737	3458 1
+737	3459 1
+737	3568 1
+737	3631 1
+737	3726 1
+737	3792 1
+737	3842 1
+737	3919 1
+737	4037 1
+737	4044 1
+737	4065 1
+737	4071 1
+737	4298 1
+737	4335 1
+737	4401 1
+737	4432 1
+737	4441 1
+737	4632 1
+737	4712 1
+737	4713 1
+737	4791 1
+737	4875 1
+737	4953 1
+737	4983 1
+737	5002 1
+737	5012 1
+737	5028 1
+737	5037 1
+737	5064 1
+737	5096 1
+737	5132 1
+737	5144 1
+737	5148 1
+737	5179 1
+737	5188 1
+737	5199 1
+737	5210 1
+737	5233 1
+737	5239 1
+737	5246 1
+737	5254 1
+737	5273 1
+737	5288 1
+737	5295 1
+737	5321 1
+737	5341 1
+737	5384 1
+737	5404 1
+737	5412 1
+737	5466 1
+737	5529 1
+737	5543 1
+737	5563 1
+737	5582 1
+737	5605 1
+737	5697 1
+737	5738 1
+737	5760 1
+737	5772 1
+737	5800 1
+737	5802 1
+737	5807 1
+737	5814 1
+737	5822 1
+737	5824 1
+737	5827 1
+737	5887 1
+737	5902 1
+737	5922 1
+737	5950 1
+737	6000 1
+737	6001 1
+737	6004 1
+737	6032 1
+737	6044 1
+737	6047 1
+737	6097 1
+737	6123 1
+737	6156 1
+737	6170 1
+737	6221 1
+737	6227 1
+737	6280 1
+737	6299 1
+737	6305 1
+737	6320 1
+737	6323 1
+737	6388 1
+737	6414 1
+737	6417 1
+737	6421 1
+737	6422 1
+737	6442 1
+737	6447 1
+737	6496 1
+737	6523 1
+737	6560 1
+737	6566 1
+737	6567 1
+737	6576 1
+737	6595 1
+737	6596 1
+737	6599 1
+737	6613 1
+737	6618 1
+737	6624 1
+737	6628 1
+737	6634 1
+737	6663 1
+737	6665 1
+737	6700 1
+737	6720 1
+737	6725 1
+737	6736 1
+737	6739 1
+737	6759 1
+737	6765 1
+737	6770 1
+737	6772 1
+737	6780 1
+737	6784 1
+737	6789 1
+737	6803 1
+737	6805 1
+737	6832 1
+737	6855 1
+737	6875 1
+737	6897 1
+737	6913 1
+737	6917 1
+737	6924 1
+737	6930 1
+737	6933 1
+737	6934 1
+737	6945 1
+737	6946 1
+737	6948 1
+737	6953 1
+737	6976 1
+737	6979 1
+737	6993 1
+737	6994 1
+737	7012 1
+737	7047 1
+737	7063 1
+737	7094 1
+737	7115 1
+737	7116 1
+737	7162 1
+737	7185 1
+737	7186 1
+737	7225 1
+737	7233 1
+737	7279 1
+737	7295 1
+737	7323 1
+737	7341 1
+737	7351 1
+737	7373 1
+737	7386 1
+737	7391 1
+737	7397 1
+737	7422 1
+737	7442 1
+737	7449 1
+737	7450 1
+737	7493 1
+737	7517 1
+737	7544 1
+737	7553 1
+737	7567 1
+737	7574 1
+737	7588 1
+737	7593 1
+737	7618 1
+737	7620 1
+737	7632 1
+737	7647 1
+737	7649 1
+737	7651 1
+737	7658 1
+737	7666 1
+737	7669 1
+737	7673 1
+737	7675 1
+737	7694 1
+737	7699 1
+737	7730 1
+737	7778 1
+737	7799 1
+737	7803 1
+737	7819 1
+737	7839 1
+737	7874 1
+737	7921 1
+737	7924 1
+737	7927 1
+737	7961 1
+737	7965 1
+737	8051 1
+737	8134 1
+737	8141 1
+737	8163 1
+737	8168 1
+737	8192 1
+737	8198 1
+737	8204 1
+737	8212 1
+737	8297 1
+738	8 1
+738	86 1
+738	439 1
+738	739 1
+738	748 1
+738	979 1
+738	2276 1
+738	5301 1
+734	739 1
+735	739 1
+742	72 1
+742	86 1
+742	246 1
+742	271 1
+742	298 1
+742	304 1
+742	311 1
+742	317 1
+742	324 1
+742	447 1
+742	643 1
+742	659 1
+742	663 1
+742	682 1
+742	697 1
+742	704 1
+742	707 1
+742	722 1
+742	762 1
+742	769 1
+742	789 1
+742	810 1
+742	817 1
+742	829 1
+742	838 1
+742	857 1
+742	863 1
+742	885 1
+742	893 1
+742	897 1
+742	906 1
+742	941 1
+742	977 1
+742	978 1
+742	993 1
+742	994 1
+742	1006 1
+742	1007 1
+742	1023 1
+742	1026 1
+742	1038 1
+742	1039 1
+742	1053 1
+742	1165 1
+742	1167 1
+742	1200 1
+742	1201 1
+742	1241 1
+742	1310 1
+742	1385 1
+742	1394 1
+742	1413 1
+742	1425 1
+742	1476 1
+742	1983 1
+742	2095 1
+742	2097 1
+742	2435 1
+742	2669 1
+742	2721 1
+742	2940 1
+742	3238 1
+742	3334 1
+742	3352 1
+742	3460 1
+742	3464 1
+742	3568 1
+742	4044 1
+742	4234 1
+742	4261 1
+742	4384 1
+742	4385 1
+742	4386 1
+742	4424 1
+742	4605 1
+742	4820 1
+742	4875 1
+742	5002 1
+742	5073 1
+742	5745 1
+742	6424 1
+742	6624 1
+742	6712 1
+742	6832 1
+742	7214 1
+742	7225 1
+742	7277 1
+742	7662 1
+742	7691 1
+742	7707 1
+742	7795 1
+742	7803 1
+742	7809 1
+744	746 1
+745	746 1
+745	750 1
+748	5210 1
+697	15 1
+697	72 1
+697	271 1
+697	311 1
+697	313 1
+697	321 1
+697	332 1
+697	600 1
+697	643 1
+697	663 1
+697	665 1
+697	682 1
+697	691 1
+697	696 1
+697	704 1
+697	705 1
+697	730 1
+697	742 1
+697	748 1
+697	789 1
+697	794 1
+697	817 1
+697	859 1
+697	875 1
+697	895 1
+697	936 1
+697	941 1
+697	960 1
+697	981 1
+697	982 1
+697	993 1
+697	994 1
+697	1007 1
+697	1014 1
+697	1023 1
+697	1026 1
+697	1032 1
+697	1039 1
+697	1062 1
+697	1092 1
+697	1125 1
+697	1128 1
+697	1141 1
+697	1190 1
+697	1236 1
+697	1253 1
+697	1259 1
+697	1413 1
+697	1473 1
+697	1476 1
+697	1513 1
+697	1548 1
+697	1569 1
+697	1595 1
+697	1636 1
+697	1700 1
+697	1757 1
+697	1836 1
+697	1884 1
+697	1966 1
+697	2116 1
+697	2225 1
+697	2369 1
+697	2397 1
+697	2398 1
+697	2517 1
+697	2535 1
+697	2576 1
+697	2785 1
+697	3106 1
+697	3274 1
+697	3371 1
+697	3393 1
+697	3456 1
+697	3498 1
+697	3631 1
+697	3635 1
+697	3970 1
+697	4037 1
+697	4044 1
+697	4099 1
+697	4212 1
+697	4266 1
+697	4574 1
+697	4661 1
+697	4666 1
+697	4735 1
+697	4820 1
+697	4953 1
+697	4962 1
+697	4964 1
+697	5215 1
+697	5412 1
+697	5449 1
+697	5509 1
+697	5790 1
+697	6784 1
+697	6873 1
+697	7809 1
+697	8044 1
+749	86 1
+749	290 1
+749	407 1
+749	559 1
+749	600 1
+749	697 1
+749	730 1
+749	750 1
+749	789 1
+749	798 1
+749	805 1
+749	817 1
+749	878 1
+749	1039 1
+749	1186 1
+749	1239 1
+749	1310 1
+749	1407 1
+749	1425 1
+749	1629 1
+749	1637 1
+749	1744 1
+749	2225 1
+749	2258 1
+749	2324 1
+749	2328 1
+749	2384 1
+749	2651 1
+749	2654 1
+749	2770 1
+749	2819 1
+749	2951 1
+749	3238 1
+749	3352 1
+749	3417 1
+749	3435 1
+749	3537 1
+749	3607 1
+749	3634 1
+749	3873 1
+749	3892 1
+749	3970 1
+749	4037 1
+749	4124 1
+749	4289 1
+749	4335 1
+749	4400 1
+749	4666 1
+749	4715 1
+749	4953 1
+749	4981 1
+749	5239 1
+749	5254 1
+749	5412 1
+749	5445 1
+749	5584 1
+749	5637 1
+749	6347 1
+749	6498 1
+749	7115 1
+749	7587 1
+749	7618 1
+749	7632 1
+749	7683 1
+749	7778 1
+749	7992 1
+321	35 1
+321	86 1
+321	271 1
+321	308 1
+321	311 1
+321	439 1
+321	488 1
+321	696 1
+321	704 1
+321	750 1
+321	769 1
+321	817 1
+321	895 1
+321	918 1
+321	934 1
+321	938 1
+321	945 1
+321	955 1
+321	958 1
+321	966 1
+321	971 1
+321	972 1
+321	1023 1
+321	1026 1
+321	1053 1
+321	1123 1
+321	1190 1
+751	756 1
+754	56 1
+754	756 1
+752	756 1
+753	756 1
+755	756 1
+760	600 1
+758	760 1
+758	5130 1
+759	35 1
+759	36 1
+759	72 1
+759	86 1
+759	259 1
+759	271 1
+759	299 1
+759	311 1
+759	313 1
+759	317 1
+759	429 1
+759	432 1
+759	600 1
+759	626 1
+759	643 1
+759	659 1
+759	704 1
+759	730 1
+759	760 1
+759	762 1
+759	763 1
+759	769 1
+759	789 1
+759	829 1
+759	857 1
+759	893 1
+759	895 1
+759	897 1
+759	906 1
+759	963 1
+759	972 1
+759	979 1
+759	981 1
+759	995 1
+759	999 1
+759	1014 1
+759	1053 1
+759	1075 1
+759	1080 1
+759	1123 1
+759	1140 1
+759	1186 1
+759	1193 1
+759	1211 1
+759	1230 1
+759	1315 1
+759	1375 1
+759	1416 1
+759	1425 1
+759	1534 1
+759	1580 1
+759	1697 1
+759	1717 1
+759	1842 1
+759	1855 1
+759	1956 1
+759	2398 1
+759	2542 1
+759	2754 1
+759	3136 1
+759	3473 1
+759	3520 1
+759	3537 1
+759	3587 1
+759	3680 1
+759	4191 1
+759	4338 1
+759	4653 1
+759	4666 1
+759	4777 1
+759	5072 1
+759	5321 1
+759	5392 1
+759	5423 1
+759	5430 1
+759	5673 1
+759	8293 1
+761	29 1
+761	204 1
+761	304 1
+761	565 1
+761	989 1
+761	1484 1
+761	2151 1
+761	2398 1
+763	15 1
+763	214 1
+763	579 1
+763	637 1
+763	665 1
+763	733 1
+763	765 1
+763	817 1
+763	820 1
+763	849 1
+763	857 1
+763	893 1
+763	1049 1
+763	1211 1
+763	1267 1
+763	1360 1
+763	1407 1
+763	1464 1
+763	1520 1
+763	1633 1
+763	1717 1
+763	1718 1
+763	1927 1
+763	2095 1
+763	2097 1
+763	2257 1
+763	2294 1
+763	2323 1
+763	2375 1
+763	2398 1
+763	2411 1
+763	2542 1
+763	2560 1
+763	2612 1
+763	2625 1
+763	2643 1
+763	2651 1
+763	2653 1
+763	2754 1
+763	2871 1
+763	2966 1
+763	2977 1
+763	3130 1
+763	3284 1
+763	3352 1
+763	3393 1
+763	3529 1
+763	3664 1
+763	3691 1
+763	3752 1
+763	3806 1
+763	3976 1
+763	4297 1
+763	4335 1
+763	4712 1
+763	4953 1
+763	5037 1
+763	5073 1
+763	5222 1
+763	5288 1
+763	5392 1
+763	5412 1
+763	5430 1
+763	5620 1
+763	5651 1
+763	6262 1
+763	7813 1
+763	7862 1
+764	549 1
+764	600 1
+764	762 1
+764	765 1
+764	946 1
+764	947 1
+764	1154 1
+764	1211 1
+764	1492 1
+764	1700 1
+764	1734 1
+764	1754 1
+764	1772 1
+764	1956 1
+764	1992 1
+764	2071 1
+764	2117 1
+764	2120 1
+764	2174 1
+764	2195 1
+764	2205 1
+764	2294 1
+764	2322 1
+764	2328 1
+764	2501 1
+764	2504 1
+764	2580 1
+764	2585 1
+764	2625 1
+764	3192 1
+764	3276 1
+764	3755 1
+764	4269 1
+764	8290 1
+766	15 1
+766	72 1
+766	86 1
+766	155 1
+766	204 1
+766	271 1
+766	285 1
+766	332 1
+766	346 1
+766	350 1
+766	403 1
+766	417 1
+766	549 1
+766	579 1
+766	600 1
+766	608 1
+766	633 1
+766	644 1
+766	659 1
+766	673 1
+766	706 1
+766	722 1
+766	737 1
+766	741 1
+766	749 1
+766	762 1
+766	765 1
+766	789 1
+766	817 1
+766	825 1
+766	826 1
+766	856 1
+766	857 1
+766	871 1
+766	878 1
+766	908 1
+766	946 1
+766	960 1
+766	967 1
+766	968 1
+766	974 1
+766	978 1
+766	1024 1
+766	1026 1
+766	1031 1
+766	1035 1
+766	1049 1
+766	1100 1
+766	1114 1
+766	1125 1
+766	1157 1
+766	1159 1
+766	1164 1
+766	1166 1
+766	1167 1
+766	1185 1
+766	1186 1
+766	1191 1
+766	1201 1
+766	1211 1
+766	1239 1
+766	1243 1
+766	1247 1
+766	1250 1
+766	1267 1
+766	1286 1
+766	1291 1
+766	1305 1
+766	1307 1
+766	1310 1
+766	1352 1
+766	1357 1
+766	1360 1
+766	1378 1
+766	1384 1
+766	1385 1
+766	1393 1
+766	1403 1
+766	1416 1
+766	1419 1
+766	1428 1
+766	1437 1
+766	1473 1
+766	1492 1
+766	1496 1
+766	1514 1
+766	1538 1
+766	1550 1
+766	1571 1
+766	1585 1
+766	1608 1
+766	1621 1
+766	1622 1
+766	1633 1
+766	1646 1
+766	1653 1
+766	1680 1
+766	1688 1
+766	1705 1
+766	1706 1
+766	1717 1
+766	1723 1
+766	1733 1
+766	1734 1
+766	1754 1
+766	1769 1
+766	1772 1
+766	1774 1
+766	1777 1
+766	1781 1
+766	1799 1
+766	1808 1
+766	1814 1
+766	1836 1
+766	1837 1
+766	1842 1
+766	1847 1
+766	1858 1
+766	1888 1
+766	1893 1
+766	1915 1
+766	1918 1
+766	1919 1
+766	1935 1
+766	1956 1
+766	1964 1
+766	1966 1
+766	1969 1
+766	1971 1
+766	1972 1
+766	1982 1
+766	1984 1
+766	1990 1
+766	1992 1
+766	2001 1
+766	2004 1
+766	2014 1
+766	2016 1
+766	2066 1
+766	2071 1
+766	2076 1
+766	2102 1
+766	2114 1
+766	2116 1
+766	2117 1
+766	2120 1
+766	2134 1
+766	2135 1
+766	2144 1
+766	2145 1
+766	2174 1
+766	2193 1
+766	2209 1
+766	2225 1
+766	2231 1
+766	2237 1
+766	2240 1
+766	2241 1
+766	2251 1
+766	2252 1
+766	2256 1
+766	2257 1
+766	2258 1
+766	2264 1
+766	2276 1
+766	2290 1
+766	2297 1
+766	2307 1
+766	2322 1
+766	2324 1
+766	2325 1
+766	2328 1
+766	2338 1
+766	2354 1
+766	2356 1
+766	2364 1
+766	2371 1
+766	2375 1
+766	2381 1
+766	2384 1
+766	2398 1
+766	2410 1
+766	2433 1
+766	2440 1
+766	2456 1
+766	2474 1
+766	2485 1
+766	2506 1
+766	2507 1
+766	2510 1
+766	2511 1
+766	2516 1
+766	2517 1
+766	2535 1
+766	2542 1
+766	2544 1
+766	2547 1
+766	2550 1
+766	2560 1
+766	2565 1
+766	2576 1
+766	2579 1
+766	2592 1
+766	2593 1
+766	2594 1
+766	2597 1
+766	2599 1
+766	2605 1
+766	2617 1
+766	2619 1
+766	2623 1
+766	2625 1
+766	2646 1
+766	2653 1
+766	2654 1
+766	2658 1
+766	2660 1
+766	2662 1
+766	2667 1
+766	2674 1
+766	2685 1
+766	2689 1
+766	2693 1
+766	2696 1
+766	2697 1
+766	2700 1
+766	2707 1
+766	2713 1
+766	2721 1
+766	2747 1
+766	2754 1
+766	2760 1
+766	2763 1
+766	2764 1
+766	2765 1
+766	2774 1
+766	2775 1
+766	2785 1
+766	2787 1
+766	2790 1
+766	2794 1
+766	2805 1
+766	2809 1
+766	2811 1
+766	2814 1
+766	2815 1
+766	2819 1
+766	2822 1
+766	2828 1
+766	2830 1
+766	2831 1
+766	2834 1
+766	2851 1
+766	2856 1
+766	2859 1
+766	2871 1
+766	2900 1
+766	2909 1
+766	2912 1
+766	2917 1
+766	2922 1
+766	2923 1
+766	2925 1
+766	2932 1
+766	2940 1
+766	2951 1
+766	2955 1
+766	2958 1
+766	2963 1
+766	2968 1
+766	2972 1
+766	2973 1
+766	2981 1
+766	2993 1
+766	2999 1
+766	3000 1
+766	3002 1
+766	3005 1
+766	3009 1
+766	3010 1
+766	3014 1
+766	3015 1
+766	3021 1
+766	3027 1
+766	3029 1
+766	3033 1
+766	3034 1
+766	3050 1
+766	3073 1
+766	3089 1
+766	3092 1
+766	3103 1
+766	3104 1
+766	3114 1
+766	3117 1
+766	3125 1
+766	3140 1
+766	3144 1
+766	3148 1
+766	3150 1
+766	3192 1
+766	3200 1
+766	3238 1
+766	3243 1
+766	3251 1
+766	3253 1
+766	3265 1
+766	3271 1
+766	3274 1
+766	3276 1
+766	3284 1
+766	3291 1
+766	3293 1
+766	3307 1
+766	3309 1
+766	3310 1
+766	3319 1
+766	3320 1
+766	3321 1
+766	3324 1
+766	3334 1
+766	3348 1
+766	3351 1
+766	3352 1
+766	3381 1
+766	3393 1
+766	3394 1
+766	3408 1
+766	3417 1
+766	3433 1
+766	3443 1
+766	3447 1
+766	3452 1
+766	3453 1
+766	3454 1
+766	3455 1
+766	3456 1
+766	3458 1
+766	3459 1
+766	3460 1
+766	3464 1
+766	3473 1
+766	3483 1
+766	3486 1
+766	3489 1
+766	3498 1
+766	3506 1
+766	3516 1
+766	3537 1
+766	3541 1
+766	3547 1
+766	3549 1
+766	3554 1
+766	3555 1
+766	3557 1
+766	3562 1
+766	3580 1
+766	3586 1
+766	3587 1
+766	3607 1
+766	3614 1
+766	3615 1
+766	3616 1
+766	3631 1
+766	3634 1
+766	3635 1
+766	3643 1
+766	3645 1
+766	3646 1
+766	3664 1
+766	3681 1
+766	3691 1
+766	3720 1
+766	3724 1
+766	3726 1
+766	3748 1
+766	3752 1
+766	3769 1
+766	3772 1
+766	3776 1
+766	3787 1
+766	3792 1
+766	3796 1
+766	3803 1
+766	3804 1
+766	3806 1
+766	3812 1
+766	3813 1
+766	3830 1
+766	3835 1
+766	3842 1
+766	3843 1
+766	3854 1
+766	3856 1
+766	3871 1
+766	3873 1
+766	3887 1
+766	3897 1
+766	3898 1
+766	3910 1
+766	3956 1
+766	3958 1
+766	3962 1
+766	3969 1
+766	3976 1
+766	4011 1
+766	4013 1
+766	4040 1
+766	4041 1
+766	4043 1
+766	4044 1
+766	4055 1
+766	4065 1
+766	4072 1
+766	4098 1
+766	4099 1
+766	4103 1
+766	4110 1
+766	4124 1
+766	4134 1
+766	4138 1
+766	4162 1
+766	4175 1
+766	4179 1
+766	4189 1
+766	4191 1
+766	4212 1
+766	4219 1
+766	4247 1
+766	4256 1
+766	4261 1
+766	4263 1
+766	4266 1
+766	4269 1
+766	4289 1
+766	4290 1
+766	4297 1
+766	4298 1
+766	4299 1
+766	4310 1
+766	4315 1
+766	4323 1
+766	4335 1
+766	4338 1
+766	4341 1
+766	4400 1
+766	4422 1
+766	4435 1
+766	4448 1
+766	4453 1
+766	4463 1
+766	4471 1
+766	4480 1
+766	4482 1
+766	4485 1
+766	4488 1
+766	4500 1
+766	4510 1
+766	4527 1
+766	4528 1
+766	4529 1
+766	4530 1
+766	4531 1
+766	4534 1
+766	4547 1
+766	4551 1
+766	4557 1
+766	4578 1
+766	4583 1
+766	4587 1
+766	4588 1
+766	4600 1
+766	4604 1
+766	4613 1
+766	4631 1
+766	4632 1
+766	4646 1
+766	4653 1
+766	4661 1
+766	4662 1
+766	4666 1
+766	4687 1
+766	4689 1
+766	4706 1
+766	4709 1
+766	4712 1
+766	4713 1
+766	4715 1
+766	4717 1
+766	4719 1
+766	4735 1
+766	4748 1
+766	4764 1
+766	4777 1
+766	4780 1
+766	4781 1
+766	4792 1
+766	4795 1
+766	4797 1
+766	4798 1
+766	4808 1
+766	4814 1
+766	4820 1
+766	4824 1
+766	4827 1
+766	4828 1
+766	4846 1
+766	4879 1
+766	4884 1
+766	4899 1
+766	4929 1
+766	4938 1
+766	4944 1
+766	4953 1
+766	4962 1
+766	4964 1
+766	4977 1
+766	4980 1
+766	4981 1
+766	4983 1
+766	4986 1
+766	4994 1
+766	4999 1
+766	5002 1
+766	5022 1
+766	5026 1
+766	5033 1
+766	5037 1
+766	5055 1
+766	5058 1
+766	5061 1
+766	5072 1
+766	5073 1
+766	5075 1
+766	5079 1
+766	5092 1
+766	5096 1
+766	5100 1
+766	5103 1
+766	5106 1
+766	5121 1
+766	5123 1
+766	5130 1
+766	5132 1
+766	5140 1
+766	5144 1
+766	5148 1
+766	5155 1
+766	5178 1
+766	5182 1
+766	5188 1
+766	5189 1
+766	5199 1
+766	5200 1
+766	5204 1
+766	5215 1
+766	5222 1
+766	5226 1
+766	5239 1
+766	5245 1
+766	5254 1
+766	5262 1
+766	5273 1
+766	5323 1
+766	5392 1
+766	5404 1
+766	5412 1
+766	5423 1
+766	5430 1
+766	5432 1
+766	5437 1
+766	5439 1
+766	5445 1
+766	5459 1
+766	5465 1
+766	5466 1
+766	5479 1
+766	5506 1
+766	5509 1
+766	5511 1
+766	5524 1
+766	5527 1
+766	5539 1
+766	5543 1
+766	5545 1
+766	5563 1
+766	5584 1
+766	5596 1
+766	5623 1
+766	5624 1
+766	5626 1
+766	5637 1
+766	5650 1
+766	5651 1
+766	5671 1
+766	5684 1
+766	5693 1
+766	5714 1
+766	5721 1
+766	5732 1
+766	5737 1
+766	5739 1
+766	5743 1
+766	5753 1
+766	5773 1
+766	5775 1
+766	5776 1
+766	5780 1
+766	5790 1
+766	5799 1
+766	5800 1
+766	5802 1
+766	5806 1
+766	5814 1
+766	5817 1
+766	5818 1
+766	5822 1
+766	5827 1
+766	5828 1
+766	5829 1
+766	5835 1
+766	5837 1
+766	5839 1
+766	5844 1
+766	5848 1
+766	5871 1
+766	5872 1
+766	5897 1
+766	5925 1
+766	5932 1
+766	5933 1
+766	5947 1
+766	5950 1
+766	5998 1
+766	6001 1
+766	6004 1
+766	6006 1
+766	6029 1
+766	6032 1
+766	6043 1
+766	6044 1
+766	6098 1
+766	6123 1
+766	6124 1
+766	6151 1
+766	6156 1
+766	6166 1
+766	6170 1
+766	6174 1
+766	6221 1
+766	6227 1
+766	6229 1
+766	6241 1
+766	6243 1
+766	6251 1
+766	6262 1
+766	6272 1
+766	6296 1
+766	6299 1
+766	6327 1
+766	6337 1
+766	6347 1
+766	6414 1
+766	6417 1
+766	6432 1
+766	6437 1
+766	6441 1
+766	6442 1
+766	6458 1
+766	6481 1
+766	6496 1
+766	6501 1
+766	6505 1
+766	6528 1
+766	6554 1
+766	6555 1
+766	6566 1
+766	6570 1
+766	6576 1
+766	6589 1
+766	6594 1
+766	6595 1
+766	6600 1
+766	6624 1
+766	6632 1
+766	6665 1
+766	6699 1
+766	6715 1
+766	6739 1
+766	6770 1
+766	6774 1
+766	6783 1
+766	6784 1
+766	6790 1
+766	6832 1
+766	6860 1
+766	6869 1
+766	6873 1
+766	6901 1
+766	6907 1
+766	6930 1
+766	6934 1
+766	6946 1
+766	6976 1
+766	6980 1
+766	7005 1
+766	7012 1
+766	7021 1
+766	7052 1
+766	7063 1
+766	7092 1
+766	7101 1
+766	7115 1
+766	7116 1
+766	7119 1
+766	7143 1
+766	7144 1
+766	7168 1
+766	7214 1
+766	7237 1
+766	7238 1
+766	7277 1
+766	7280 1
+766	7341 1
+766	7381 1
+766	7400 1
+766	7414 1
+766	7443 1
+766	7450 1
+766	7478 1
+766	7493 1
+766	7510 1
+766	7561 1
+766	7618 1
+766	7624 1
+766	7632 1
+766	7646 1
+766	7649 1
+766	7651 1
+766	7662 1
+766	7683 1
+766	7694 1
+766	7695 1
+766	7699 1
+766	7707 1
+766	7726 1
+766	7757 1
+766	7763 1
+766	7778 1
+766	7788 1
+766	7795 1
+766	7809 1
+766	7813 1
+766	7855 1
+766	7860 1
+766	7862 1
+766	7871 1
+766	7879 1
+766	7882 1
+766	7890 1
+766	7908 1
+766	7910 1
+766	7912 1
+766	7927 1
+766	7946 1
+766	7961 1
+766	7965 1
+766	7979 1
+766	8037 1
+766	8042 1
+766	8073 1
+766	8293 1
+766	8294 1
+762	15 1
+762	271 1
+762	324 1
+762	600 1
+762	626 1
+762	644 1
+762	659 1
+762	663 1
+762	691 1
+762	697 1
+762	704 1
+762	789 1
+762	838 1
+762	881 1
+762	895 1
+762	896 1
+762	930 1
+762	966 1
+762	979 1
+762	993 1
+762	1012 1
+762	1026 1
+762	1029 1
+762	1053 1
+762	1123 1
+762	1186 1
+762	1191 1
+762	1211 1
+762	1222 1
+762	1453 1
+762	1476 1
+762	1569 1
+762	1697 1
+762	1861 1
+762	1864 1
+762	2066 1
+762	2508 1
+762	2651 1
+762	2790 1
+762	3976 1
+762	4875 1
+762	5148 1
+762	5162 1
+762	5902 1
+762	7378 1
+762	7587 1
+762	7620 1
+762	7632 1
+762	7699 1
+762	7809 1
+767	600 1
+768	600 1
+768	1717 1
+769	56 1
+769	171 1
+769	214 1
+769	228 1
+769	259 1
+769	271 1
+769	290 1
+769	298 1
+769	311 1
+769	313 1
+769	314 1
+769	321 1
+769	332 1
+769	338 1
+769	350 1
+769	432 1
+769	447 1
+769	559 1
+769	579 1
+769	600 1
+769	626 1
+769	707 1
+769	710 1
+769	722 1
+769	742 1
+769	749 1
+769	802 1
+769	805 1
+769	813 1
+769	817 1
+769	829 1
+769	868 1
+769	887 1
+769	893 1
+769	904 1
+769	922 1
+769	941 1
+769	948 1
+769	958 1
+769	959 1
+769	960 1
+769	974 1
+769	978 1
+769	993 1
+769	1006 1
+769	1018 1
+769	1026 1
+769	1031 1
+769	1034 1
+769	1043 1
+769	1044 1
+769	1049 1
+769	1053 1
+769	1080 1
+769	1111 1
+769	1123 1
+769	1127 1
+769	1131 1
+769	1137 1
+769	1144 1
+769	1166 1
+769	1167 1
+769	1186 1
+769	1190 1
+769	1193 1
+769	1196 1
+769	1201 1
+769	1211 1
+769	1218 1
+769	1222 1
+769	1248 1
+769	1253 1
+769	1297 1
+769	1315 1
+769	1319 1
+769	1378 1
+769	1396 1
+769	1413 1
+769	1418 1
+769	1428 1
+769	1432 1
+769	1453 1
+769	1465 1
+769	1473 1
+769	1476 1
+769	1566 1
+769	1580 1
+769	1592 1
+769	1597 1
+769	1604 1
+769	1629 1
+769	1633 1
+769	1637 1
+769	1652 1
+769	1717 1
+769	1718 1
+769	1726 1
+769	1787 1
+769	1808 1
+769	1835 1
+769	1836 1
+769	1842 1
+769	1884 1
+769	1919 1
+769	2062 1
+769	2128 1
+769	2193 1
+769	2210 1
+769	2225 1
+769	2231 1
+769	2256 1
+769	2323 1
+769	2328 1
+769	2506 1
+769	2535 1
+769	2542 1
+769	2576 1
+769	2625 1
+769	2651 1
+769	2660 1
+769	2770 1
+769	2775 1
+769	2801 1
+769	2828 1
+769	2963 1
+769	3002 1
+769	3148 1
+769	3251 1
+769	3253 1
+769	3371 1
+769	3408 1
+769	3479 1
+769	3480 1
+769	3554 1
+769	3755 1
+769	4110 1
+769	5210 1
+769	5254 1
+769	5412 1
+769	5804 1
+769	5828 1
+769	6229 1
+769	6840 1
+769	8141 1
+769	8178 1
+769	8294 1
+770	600 1
+770	893 1
+770	897 1
+771	600 1
+771	626 1
+771	893 1
+771	1641 1
+771	1701 1
+771	1726 1
+771	2643 1
+772	600 1
+772	798 1
+772	817 1
+773	549 1
+774	549 1
+736	439 1
+736	549 1
+736	857 1
+736	866 1
+775	549 1
+775	1585 1
+776	549 1
+786	227 1
+786	407 1
+788	15 1
+788	72 1
+788	86 1
+788	204 1
+788	243 1
+788	290 1
+788	311 1
+788	317 1
+788	321 1
+788	407 1
+788	415 1
+788	417 1
+788	439 1
+788	447 1
+788	545 1
+788	643 1
+788	644 1
+788	696 1
+788	697 1
+788	705 1
+788	707 1
+788	733 1
+788	742 1
+788	761 1
+788	762 1
+788	769 1
+788	849 1
+788	859 1
+788	863 1
+788	893 1
+788	895 1
+788	903 1
+788	904 1
+788	930 1
+788	938 1
+788	956 1
+788	959 1
+788	963 1
+788	974 1
+788	978 1
+788	1012 1
+788	1023 1
+788	1039 1
+788	1053 1
+788	1123 1
+788	1131 1
+788	1140 1
+788	1156 1
+788	1157 1
+788	1166 1
+788	1186 1
+788	1240 1
+788	1385 1
+788	1411 1
+788	1453 1
+788	1492 1
+788	1585 1
+788	1587 1
+788	1700 1
+788	1836 1
+788	1859 1
+788	1956 1
+788	1964 1
+788	2062 1
+788	2066 1
+788	2240 1
+788	2397 1
+788	2490 1
+788	2535 1
+788	2576 1
+788	2654 1
+788	2790 1
+788	2877 1
+788	2914 1
+788	3307 1
+788	3338 1
+788	3479 1
+788	3516 1
+788	3614 1
+788	3631 1
+788	3755 1
+788	3873 1
+788	3897 1
+788	3946 1
+788	3971 1
+788	3976 1
+788	4201 1
+788	4453 1
+788	4687 1
+788	4786 1
+788	4795 1
+788	4798 1
+788	4980 1
+788	5200 1
+788	5233 1
+788	5415 1
+788	5620 1
+788	5638 1
+788	5684 1
+788	5709 1
+788	5798 1
+788	5814 1
+788	6255 1
+788	6302 1
+788	6306 1
+788	6334 1
+788	6360 1
+788	6400 1
+788	6407 1
+788	6409 1
+788	6417 1
+788	6422 1
+788	8295 1
+780	407 1
+780	771 1
+781	407 1
+781	673 1
+781	1261 1
+781	1514 1
+781	1564 1
+781	2151 1
+781	2398 1
+781	3755 1
+782	8 1
+782	407 1
+782	659 1
+782	673 1
+782	677 1
+782	749 1
+782	798 1
+782	802 1
+782	817 1
+783	407 1
+784	35 1
+784	56 1
+784	204 1
+784	214 1
+784	230 1
+784	243 1
+784	290 1
+784	299 1
+784	311 1
+784	338 1
+784	346 1
+784	407 1
+784	417 1
+784	425 1
+784	647 1
+784	663 1
+784	665 1
+784	697 1
+784	704 1
+784	705 1
+784	707 1
+784	710 1
+784	762 1
+784	765 1
+784	789 1
+784	810 1
+784	856 1
+784	857 1
+784	904 1
+784	908 1
+784	937 1
+784	946 1
+784	947 1
+784	948 1
+784	963 1
+784	974 1
+784	982 1
+784	985 1
+784	989 1
+784	993 1
+784	999 1
+784	1006 1
+784	1007 1
+784	1014 1
+784	1031 1
+784	1053 1
+784	1080 1
+784	1114 1
+784	1151 1
+784	1160 1
+784	1164 1
+784	1165 1
+784	1166 1
+784	1186 1
+784	1193 1
+784	1199 1
+784	1200 1
+784	1211 1
+784	1222 1
+784	1241 1
+784	1248 1
+784	1259 1
+784	1261 1
+784	1297 1
+784	1360 1
+784	1384 1
+784	1385 1
+784	1411 1
+784	1420 1
+784	1453 1
+784	1464 1
+784	1465 1
+784	1485 1
+784	1513 1
+784	1514 1
+784	1525 1
+784	1534 1
+784	1549 1
+784	1573 1
+784	1585 1
+784	1610 1
+784	1622 1
+784	1633 1
+784	1652 1
+784	1654 1
+784	1662 1
+784	1679 1
+784	1688 1
+784	1706 1
+784	1707 1
+784	1729 1
+784	1749 1
+784	1752 1
+784	1758 1
+784	1769 1
+784	1792 1
+784	1793 1
+784	1814 1
+784	1836 1
+784	1842 1
+784	1849 1
+784	1855 1
+784	1858 1
+784	1864 1
+784	1918 1
+784	1919 1
+784	1964 1
+784	1966 1
+784	1973 1
+784	1987 1
+784	2053 1
+784	2060 1
+784	2062 1
+784	2066 1
+784	2076 1
+784	2091 1
+784	2095 1
+784	2097 1
+784	2106 1
+784	2120 1
+784	2135 1
+784	2144 1
+784	2145 1
+784	2174 1
+784	2211 1
+784	2225 1
+784	2237 1
+784	2256 1
+784	2257 1
+784	2290 1
+784	2297 1
+784	2323 1
+784	2325 1
+784	2328 1
+784	2338 1
+784	2345 1
+784	2348 1
+784	2356 1
+784	2381 1
+784	2397 1
+784	2398 1
+784	2400 1
+784	2411 1
+784	2416 1
+784	2456 1
+784	2470 1
+784	2499 1
+784	2508 1
+784	2535 1
+784	2565 1
+784	2576 1
+784	2579 1
+784	2580 1
+784	2594 1
+784	2597 1
+784	2617 1
+784	2625 1
+784	2643 1
+784	2651 1
+784	2653 1
+784	2654 1
+784	2660 1
+784	2665 1
+784	2685 1
+784	2693 1
+784	2727 1
+784	2746 1
+784	2747 1
+784	2754 1
+784	2763 1
+784	2815 1
+784	2830 1
+784	2859 1
+784	2877 1
+784	2900 1
+784	2951 1
+784	2958 1
+784	2963 1
+784	2973 1
+784	3007 1
+784	3014 1
+784	3020 1
+784	3030 1
+784	3089 1
+784	3117 1
+784	3265 1
+784	3291 1
+784	3307 1
+784	3338 1
+784	3351 1
+784	3352 1
+784	3371 1
+784	3439 1
+784	3443 1
+784	3489 1
+784	3568 1
+784	3587 1
+784	3615 1
+784	3631 1
+784	3650 1
+784	3661 1
+784	3680 1
+784	3720 1
+784	3755 1
+784	3892 1
+784	3976 1
+784	4013 1
+784	4103 1
+784	4179 1
+784	4201 1
+784	4256 1
+784	4263 1
+784	4349 1
+784	4373 1
+784	4384 1
+784	4424 1
+784	4820 1
+784	4875 1
+784	5100 1
+784	8209 1
+784	8290 1
+784	8291 1
+784	8292 1
+784	8293 1
+789	35 1
+789	56 1
+789	72 1
+789	171 1
+789	243 1
+789	259 1
+789	271 1
+789	290 1
+789	299 1
+789	304 1
+789	311 1
+789	313 1
+789	317 1
+789	346 1
+789	407 1
+789	447 1
+789	608 1
+789	637 1
+789	663 1
+789	673 1
+789	697 1
+789	704 1
+789	705 1
+789	710 1
+789	717 1
+789	722 1
+789	730 1
+789	749 1
+789	762 1
+789	769 1
+789	784 1
+789	794 1
+789	795 1
+789	798 1
+789	817 1
+789	844 1
+789	857 1
+789	875 1
+789	887 1
+789	893 1
+789	904 1
+789	930 1
+789	937 1
+789	946 1
+789	947 1
+789	959 1
+789	963 1
+789	971 1
+789	972 1
+789	978 1
+789	985 1
+789	989 1
+789	994 1
+789	999 1
+789	1006 1
+789	1007 1
+789	1014 1
+789	1026 1
+789	1053 1
+789	1061 1
+789	1080 1
+789	1123 1
+789	1151 1
+789	1154 1
+789	1156 1
+789	1159 1
+789	1165 1
+789	1167 1
+789	1186 1
+789	1193 1
+789	1199 1
+789	1200 1
+789	1201 1
+789	1218 1
+789	1220 1
+789	1222 1
+789	1241 1
+789	1243 1
+789	1247 1
+789	1248 1
+789	1266 1
+789	1277 1
+789	1297 1
+789	1310 1
+789	1319 1
+789	1321 1
+789	1322 1
+789	1352 1
+789	1360 1
+789	1374 1
+789	1384 1
+789	1385 1
+789	1390 1
+789	1394 1
+789	1396 1
+789	1413 1
+789	1428 1
+789	1453 1
+789	1468 1
+789	1473 1
+789	1476 1
+789	1497 1
+789	1506 1
+789	1521 1
+789	1525 1
+789	1542 1
+789	1547 1
+789	1549 1
+789	1564 1
+789	1565 1
+789	1585 1
+789	1592 1
+789	1633 1
+789	1638 1
+789	1646 1
+789	1653 1
+789	1657 1
+789	1658 1
+789	1678 1
+789	1680 1
+789	1749 1
+789	1774 1
+789	1780 1
+789	1787 1
+789	1799 1
+789	1805 1
+789	1816 1
+789	1855 1
+789	1888 1
+789	1920 1
+789	1956 1
+789	1966 1
+789	1969 1
+789	1977 1
+789	1979 1
+789	2062 1
+789	2091 1
+789	2102 1
+789	2106 1
+789	2193 1
+789	2210 1
+789	2211 1
+789	2237 1
+789	2240 1
+789	2273 1
+789	2276 1
+789	2281 1
+789	2307 1
+789	2322 1
+789	2326 1
+789	2341 1
+789	2345 1
+789	2350 1
+789	2354 1
+789	2364 1
+789	2381 1
+789	2385 1
+789	2397 1
+789	2398 1
+789	2400 1
+789	2456 1
+789	2507 1
+789	2516 1
+789	2592 1
+789	2593 1
+789	2625 1
+789	2643 1
+789	2669 1
+789	2689 1
+789	2696 1
+789	2754 1
+789	2763 1
+789	2775 1
+789	2777 1
+789	2787 1
+789	2794 1
+789	2809 1
+789	2814 1
+789	2822 1
+789	2831 1
+789	2909 1
+789	3002 1
+789	3027 1
+789	3073 1
+789	3089 1
+789	3092 1
+789	3103 1
+789	3106 1
+789	3191 1
+789	3276 1
+789	3291 1
+789	3334 1
+789	3352 1
+789	3393 1
+789	3417 1
+789	3433 1
+789	3447 1
+789	3452 1
+789	3455 1
+789	3456 1
+789	3458 1
+789	3460 1
+789	3498 1
+789	3537 1
+789	3554 1
+789	3586 1
+789	3607 1
+789	3631 1
+789	3664 1
+789	3748 1
+789	3755 1
+789	3830 1
+789	3843 1
+789	3854 1
+789	3897 1
+789	4037 1
+789	4040 1
+789	4099 1
+789	4103 1
+789	4124 1
+789	4191 1
+789	4212 1
+789	4219 1
+789	4266 1
+789	4297 1
+789	4315 1
+789	4335 1
+789	4338 1
+789	4355 1
+789	4400 1
+789	4441 1
+789	4448 1
+789	4482 1
+789	4527 1
+789	4530 1
+789	4551 1
+789	4587 1
+789	4600 1
+789	4632 1
+789	4687 1
+789	4706 1
+789	4712 1
+789	4715 1
+789	4717 1
+789	4792 1
+789	4797 1
+789	4808 1
+789	4811 1
+789	4814 1
+789	4820 1
+789	4824 1
+789	4827 1
+789	4828 1
+789	4875 1
+789	4929 1
+789	4953 1
+789	4977 1
+789	4999 1
+789	5022 1
+789	5026 1
+789	5055 1
+789	5058 1
+789	5072 1
+789	5073 1
+789	5083 1
+789	5092 1
+789	5100 1
+789	5120 1
+789	5123 1
+789	5130 1
+789	5155 1
+789	5178 1
+789	5182 1
+789	5204 1
+789	5210 1
+789	5222 1
+789	5239 1
+789	5254 1
+789	5288 1
+789	5323 1
+789	5327 1
+789	5335 1
+789	5392 1
+789	5412 1
+789	5430 1
+789	5449 1
+789	5463 1
+789	5470 1
+789	5506 1
+789	5509 1
+789	5511 1
+789	5524 1
+789	5539 1
+789	5543 1
+789	5683 1
+789	5721 1
+789	5743 1
+789	5753 1
+789	5804 1
+789	5817 1
+789	5897 1
+789	5936 1
+789	5994 1
+789	6229 1
+789	6246 1
+789	6262 1
+789	6337 1
+789	6432 1
+789	6481 1
+789	6505 1
+789	6553 1
+789	6606 1
+789	6715 1
+789	6855 1
+789	8290 1
+789	8291 1
+789	8295 1
+785	407 1
+792	733 1
+792	793 1
+791	15 1
+791	35 1
+791	214 1
+791	271 1
+791	647 1
+791	769 1
+791	793 1
+791	794 1
+791	802 1
+791	817 1
+791	959 1
+791	981 1
+791	1022 1
+791	1053 1
+791	1123 1
+791	1193 1
+791	1201 1
+791	1260 1
+791	1270 1
+791	1279 1
+791	1297 1
+791	1428 1
+791	1468 1
+791	1506 1
+791	1597 1
+791	1633 1
+791	1884 1
+791	2535 1
+791	3459 1
+791	4037 1
+791	5079 1
+791	5254 1
+791	5804 1
+791	5811 1
+791	5902 1
+791	5991 1
+791	6417 1
+791	6566 1
+791	6914 1
+791	7899 1
+791	7910 1
+794	86 1
+794	230 1
+794	271 1
+794	407 1
+794	723 1
+794	789 1
+794	795 1
+794	895 1
+794	966 1
+794	982 1
+794	1014 1
+794	1557 1
+794	1564 1
+794	1569 1
+794	1573 1
+794	1633 1
+794	1638 1
+794	3136 1
+795	171 1
+795	243 1
+795	271 1
+795	290 1
+795	304 1
+795	311 1
+795	313 1
+795	317 1
+795	321 1
+795	372 1
+795	447 1
+795	579 1
+795	643 1
+795	704 1
+795	723 1
+795	789 1
+795	794 1
+795	853 1
+795	882 1
+795	887 1
+795	895 1
+795	960 1
+795	963 1
+795	966 1
+795	993 1
+795	999 1
+795	1014 1
+795	1023 1
+795	1034 1
+795	1053 1
+795	1123 1
+795	1167 1
+795	1211 1
+795	1360 1
+795	1413 1
+795	1420 1
+795	1501 1
+795	1524 1
+795	1549 1
+795	1587 1
+795	1595 1
+795	1603 1
+795	1653 1
+795	1692 1
+795	1717 1
+795	1718 1
+795	2053 1
+795	2117 1
+795	2157 1
+795	2210 1
+795	2381 1
+795	2400 1
+795	2775 1
+795	2877 1
+795	2981 1
+795	4037 1
+795	4289 1
+795	4297 1
+795	4384 1
+795	4735 1
+798	978 1
+798	1648 1
+798	1729 1
+798	2289 1
+798	2612 1
+798	3439 1
+798	3568 1
+798	3660 1
+798	3661 1
+798	4349 1
+798	4351 1
+798	4365 1
+798	4373 1
+798	4384 1
+798	4417 1
+798	4424 1
+796	644 1
+796	742 1
+796	797 1
+796	798 1
+796	1031 1
+796	1550 1
+797	324 1
+797	644 1
+797	798 1
+797	817 1
+797	868 1
+802	432 1
+802	769 1
+802	829 1
+802	2643 1
+799	802 1
+800	802 1
+800	829 1
+801	659 1
+801	665 1
+801	749 1
+801	802 1
+801	838 1
+801	2055 1
+803	35 1
+803	659 1
+803	806 1
+803	1420 1
+803	1437 1
+803	1849 1
+804	403 1
+804	749 1
+804	1732 1
+804	1744 1
+804	1746 1
+804	3435 1
+805	35 1
+805	171 1
+805	271 1
+805	290 1
+805	299 1
+805	313 1
+805	579 1
+805	644 1
+805	704 1
+805	710 1
+805	749 1
+805	789 1
+805	813 1
+805	825 1
+805	857 1
+805	871 1
+805	941 1
+805	946 1
+805	948 1
+805	960 1
+805	993 1
+805	994 1
+805	1055 1
+805	1097 1
+805	1103 1
+805	1125 1
+805	1144 1
+805	1164 1
+805	1167 1
+805	1193 1
+805	1201 1
+805	1203 1
+805	1222 1
+805	1230 1
+805	1307 1
+805	1322 1
+805	1374 1
+805	1377 1
+805	1385 1
+805	1390 1
+805	1396 1
+805	1402 1
+805	1413 1
+805	1425 1
+805	1453 1
+805	1468 1
+805	1476 1
+805	1496 1
+805	1497 1
+805	1501 1
+805	1506 1
+805	1514 1
+805	1542 1
+805	1573 1
+805	1580 1
+805	1593 1
+805	1603 1
+805	1604 1
+805	1628 1
+805	1633 1
+805	1658 1
+805	1783 1
+805	1842 1
+805	1847 1
+805	1855 1
+805	1884 1
+805	1956 1
+805	1969 1
+805	2066 1
+805	2106 1
+805	2237 1
+805	2297 1
+805	2398 1
+805	2689 1
+805	2774 1
+805	2811 1
+805	3009 1
+805	3192 1
+805	3291 1
+805	3309 1
+805	3352 1
+805	3435 1
+805	3443 1
+805	3800 1
+805	4289 1
+805	4384 1
+805	5022 1
+805	5605 1
+805	6770 1
+805	7862 1
+807	806 1
+808	8 1
+808	271 1
+808	1043 1
+808	3557 1
+810	35 1
+810	171 1
+810	290 1
+810	299 1
+810	304 1
+810	313 1
+810	324 1
+810	407 1
+810	647 1
+810	704 1
+810	705 1
+810	791 1
+810	805 1
+810	817 1
+810	959 1
+810	977 1
+810	989 1
+810	1007 1
+810	1029 1
+810	1140 1
+810	1186 1
+810	1191 1
+810	1199 1
+810	1218 1
+810	1297 1
+810	1322 1
+810	1514 1
+810	1597 1
+810	1679 1
+810	1716 1
+810	1718 1
+810	1758 1
+810	1793 1
+810	3755 1
+811	817 1
+811	1531 1
+811	1864 1
+812	36 1
+812	817 1
+812	822 1
+813	72 1
+813	86 1
+813	204 1
+813	298 1
+813	332 1
+813	350 1
+813	407 1
+813	432 1
+813	439 1
+813	559 1
+813	579 1
+813	608 1
+813	691 1
+813	704 1
+813	722 1
+813	733 1
+813	762 1
+813	763 1
+813	805 1
+813	817 1
+813	822 1
+813	825 1
+813	859 1
+813	864 1
+813	871 1
+813	878 1
+813	887 1
+813	908 1
+813	937 1
+813	941 1
+813	946 1
+813	947 1
+813	958 1
+813	959 1
+813	968 1
+813	974 1
+813	993 1
+813	994 1
+813	1018 1
+813	1031 1
+813	1035 1
+813	1049 1
+813	1055 1
+813	1097 1
+813	1137 1
+813	1157 1
+813	1166 1
+813	1167 1
+813	1186 1
+813	1193 1
+813	1211 1
+813	1230 1
+813	1239 1
+813	1248 1
+813	1250 1
+813	1253 1
+813	1267 1
+813	1279 1
+813	1284 1
+813	1285 1
+813	1291 1
+813	1296 1
+813	1297 1
+813	1315 1
+813	1319 1
+813	1357 1
+813	1360 1
+813	1374 1
+813	1378 1
+813	1384 1
+813	1385 1
+813	1413 1
+813	1419 1
+813	1428 1
+813	1437 1
+813	1444 1
+813	1471 1
+813	1476 1
+813	1482 1
+813	1492 1
+813	1496 1
+813	1521 1
+813	1525 1
+813	1534 1
+813	1542 1
+813	1547 1
+813	1549 1
+813	1565 1
+813	1566 1
+813	1571 1
+813	1585 1
+813	1597 1
+813	1603 1
+813	1608 1
+813	1646 1
+813	1653 1
+813	1658 1
+813	1661 1
+813	1705 1
+813	1717 1
+813	1723 1
+813	1726 1
+813	1730 1
+813	1734 1
+813	1744 1
+813	1746 1
+813	1754 1
+813	1808 1
+813	1835 1
+813	1836 1
+813	1837 1
+813	1842 1
+813	1847 1
+813	1888 1
+813	1893 1
+813	1908 1
+813	1915 1
+813	1919 1
+813	1927 1
+813	1964 1
+813	1987 1
+813	1990 1
+813	1991 1
+813	1992 1
+813	2016 1
+813	2066 1
+813	2071 1
+813	2073 1
+813	2076 1
+813	2079 1
+813	2128 1
+813	2134 1
+813	2144 1
+813	2174 1
+813	2193 1
+813	2209 1
+813	2210 1
+813	2241 1
+813	2251 1
+813	2252 1
+813	2264 1
+813	2290 1
+813	2297 1
+813	2322 1
+813	2323 1
+813	2324 1
+813	2328 1
+813	2329 1
+813	2354 1
+813	2371 1
+813	2375 1
+813	2384 1
+813	2385 1
+813	2400 1
+813	2410 1
+813	2411 1
+813	2470 1
+813	2475 1
+813	2485 1
+813	2506 1
+813	2510 1
+813	2542 1
+813	2544 1
+813	2560 1
+813	2565 1
+813	2579 1
+813	2593 1
+813	2595 1
+813	2597 1
+813	2619 1
+813	2643 1
+813	2653 1
+813	2654 1
+813	2655 1
+813	2660 1
+813	2665 1
+813	2669 1
+813	2674 1
+813	2687 1
+813	2693 1
+813	2696 1
+813	2707 1
+813	2727 1
+813	2747 1
+813	2763 1
+813	2790 1
+813	2815 1
+813	2819 1
+813	2859 1
+813	2871 1
+813	2925 1
+813	2932 1
+813	2955 1
+813	2958 1
+813	2963 1
+813	2968 1
+813	2973 1
+813	2981 1
+813	2999 1
+813	3005 1
+813	3024 1
+813	3026 1
+813	3029 1
+813	3033 1
+813	3034 1
+813	3059 1
+813	3103 1
+813	3148 1
+813	3173 1
+813	3192 1
+813	3258 1
+813	3276 1
+813	3284 1
+813	3352 1
+813	3394 1
+813	3404 1
+813	3433 1
+813	3473 1
+813	3489 1
+813	3520 1
+813	3537 1
+813	3557 1
+813	3580 1
+813	3587 1
+813	3615 1
+813	3646 1
+813	3650 1
+813	3681 1
+813	3713 1
+813	3724 1
+813	3748 1
+813	3847 1
+813	3854 1
+813	3875 1
+813	3967 1
+813	3976 1
+813	4041 1
+813	4043 1
+813	4055 1
+813	4124 1
+813	4138 1
+813	4162 1
+813	4179 1
+813	4181 1
+813	4256 1
+813	4263 1
+813	4269 1
+813	4289 1
+813	4290 1
+813	4402 1
+813	4578 1
+813	4613 1
+813	4653 1
+813	4712 1
+813	4735 1
+813	4781 1
+813	4828 1
+813	4999 1
+813	5026 1
+813	5092 1
+813	5100 1
+813	5103 1
+813	5123 1
+813	5543 1
+813	5753 1
+813	5848 1
+813	5925 1
+813	6098 1
+813	6124 1
+813	6400 1
+813	8293 1
+813	8294 1
+814	817 1
+814	893 1
+814	979 1
+815	817 1
+815	829 1
+816	15 1
+816	72 1
+816	227 1
+816	304 1
+816	488 1
+816	644 1
+816	742 1
+816	763 1
+816	784 1
+816	797 1
+816	817 1
+816	829 1
+816	871 1
+816	993 1
+816	1193 1
+816	1218 1
+816	1453 1
+816	1497 1
+816	1648 1
+816	1697 1
+816	2339 1
+816	2775 1
+816	3922 1
+816	4289 1
+816	4463 1
+816	5132 1
+816	5254 1
+816	6166 1
+816	6306 1
+822	813 1
+822	1137 1
+822	1315 1
+822	1566 1
+822	1908 1
+822	2016 1
+822	2371 1
+822	3026 1
+822	3537 1
+822	3748 1
+822	3854 1
+819	822 1
+820	559 1
+820	822 1
+820	1123 1
+820	1186 1
+820	1506 1
+820	1514 1
+820	1819 1
+820	1842 1
+820	1918 1
+820	2120 1
+820	2237 1
+820	2240 1
+820	2322 1
+820	2397 1
+820	2400 1
+820	4110 1
+821	822 1
+334	29 1
+334	36 1
+334	56 1
+334	86 1
+334	271 1
+334	313 1
+334	317 1
+334	545 1
+334	643 1
+334	697 1
+334	704 1
+334	741 1
+334	789 1
+334	822 1
+334	829 1
+334	838 1
+334	839 1
+334	849 1
+334	863 1
+334	864 1
+334	885 1
+334	893 1
+334	918 1
+334	932 1
+334	941 1
+334	945 1
+334	955 1
+334	985 1
+334	989 1
+334	1014 1
+334	1023 1
+334	1201 1
+334	1203 1
+334	1218 1
+334	1286 1
+334	1307 1
+334	1413 1
+334	1774 1
+334	2202 1
+334	2329 1
+334	4179 1
+818	822 1
+818	932 1
+823	29 1
+823	243 1
+823	304 1
+823	313 1
+823	439 1
+823	626 1
+823	677 1
+823	686 1
+823	697 1
+823	789 1
+823	955 1
+823	979 1
+823	1026 1
+823	1131 1
+823	3465 1
+824	677 1
+824	1186 1
+826	56 1
+826	204 1
+826	290 1
+826	332 1
+826	372 1
+826	403 1
+826	407 1
+826	415 1
+826	425 1
+826	575 1
+826	633 1
+826	665 1
+826	761 1
+826	765 1
+826	871 1
+826	887 1
+826	908 1
+826	937 1
+826	946 1
+826	948 1
+826	960 1
+826	968 1
+826	993 1
+826	1049 1
+826	1055 1
+826	1061 1
+826	1124 1
+826	1151 1
+826	1154 1
+826	1165 1
+826	1167 1
+826	1168 1
+826	1199 1
+826	1211 1
+826	1230 1
+826	1253 1
+826	1267 1
+826	1279 1
+826	1297 1
+826	1319 1
+826	1322 1
+826	1357 1
+826	1374 1
+826	1377 1
+826	1416 1
+826	1428 1
+826	1437 1
+826	1441 1
+826	1444 1
+826	1471 1
+826	1482 1
+826	1484 1
+826	1487 1
+826	1490 1
+826	1492 1
+826	1496 1
+826	1497 1
+826	1506 1
+826	1507 1
+826	1513 1
+826	1514 1
+826	1518 1
+826	1520 1
+826	1521 1
+826	1531 1
+826	1532 1
+826	1533 1
+826	1534 1
+826	1537 1
+826	1538 1
+826	1556 1
+826	1557 1
+826	1563 1
+826	1565 1
+826	1566 1
+826	1571 1
+826	1573 1
+826	1585 1
+826	1595 1
+826	1596 1
+826	1597 1
+826	1600 1
+826	1604 1
+826	1613 1
+826	1618 1
+826	1619 1
+826	1622 1
+826	1633 1
+826	1636 1
+826	1638 1
+826	1641 1
+826	1653 1
+826	1661 1
+826	1672 1
+826	1679 1
+826	1680 1
+826	1687 1
+826	1705 1
+826	1717 1
+826	1718 1
+826	1723 1
+826	1732 1
+826	1734 1
+826	1749 1
+826	1754 1
+826	1757 1
+826	1768 1
+826	1772 1
+826	1774 1
+826	1781 1
+826	1792 1
+826	1805 1
+826	1814 1
+826	1816 1
+826	1836 1
+826	1837 1
+826	1842 1
+826	1849 1
+826	1880 1
+826	1893 1
+826	1908 1
+826	1918 1
+826	1919 1
+826	1927 1
+826	1953 1
+826	1963 1
+826	1966 1
+826	1970 1
+826	1973 1
+826	1979 1
+826	1984 1
+826	1987 1
+826	1991 1
+826	1992 1
+826	2016 1
+826	2053 1
+826	2055 1
+826	2066 1
+826	2076 1
+826	2101 1
+826	2106 1
+826	2116 1
+826	2120 1
+826	2128 1
+826	2157 1
+826	2174 1
+826	2182 1
+826	2225 1
+826	2231 1
+826	2237 1
+826	2240 1
+826	2242 1
+826	2251 1
+826	2256 1
+826	2294 1
+826	2322 1
+826	2323 1
+826	2325 1
+826	2338 1
+826	2340 1
+826	2341 1
+826	2348 1
+826	2356 1
+826	2371 1
+826	2375 1
+826	2385 1
+826	2400 1
+826	2410 1
+826	2474 1
+826	2490 1
+826	2501 1
+826	2504 1
+826	2542 1
+826	2550 1
+826	2570 1
+826	2571 1
+826	2575 1
+826	2576 1
+826	2580 1
+826	2593 1
+826	2594 1
+826	2617 1
+826	2623 1
+826	2625 1
+826	2629 1
+826	2638 1
+826	2643 1
+826	2651 1
+826	2654 1
+826	2662 1
+826	2670 1
+826	2697 1
+826	2708 1
+826	2713 1
+826	2720 1
+826	2724 1
+826	2785 1
+826	2787 1
+826	2797 1
+826	2805 1
+826	2809 1
+826	2815 1
+826	2819 1
+826	2830 1
+826	2838 1
+826	2856 1
+826	2880 1
+826	2900 1
+826	2912 1
+826	2922 1
+826	2946 1
+826	2955 1
+826	2966 1
+826	2968 1
+826	2972 1
+826	2977 1
+826	2979 1
+826	2999 1
+826	3018 1
+826	3021 1
+826	3029 1
+826	3033 1
+826	3034 1
+826	3056 1
+826	3089 1
+826	3099 1
+826	3105 1
+826	3117 1
+826	3130 1
+826	3136 1
+826	3140 1
+826	3150 1
+826	3235 1
+826	3251 1
+826	3253 1
+826	3258 1
+826	3307 1
+826	3320 1
+826	3338 1
+826	3351 1
+826	3371 1
+826	3408 1
+826	3446 1
+826	3473 1
+826	3489 1
+826	3506 1
+826	3516 1
+826	3755 1
+826	8290 1
+825	15 1
+825	72 1
+825	417 1
+825	465 1
+825	737 1
+825	826 1
+825	827 1
+825	1026 1
+825	1166 1
+825	1307 1
+825	1310 1
+825	1549 1
+825	1680 1
+825	1706 1
+825	1754 1
+825	1769 1
+825	1823 1
+825	2066 1
+825	2102 1
+825	2145 1
+825	2209 1
+825	2237 1
+825	2252 1
+825	2276 1
+825	2285 1
+825	2290 1
+825	2328 1
+825	2398 1
+825	2411 1
+825	2416 1
+825	2456 1
+825	2485 1
+825	2508 1
+825	2516 1
+825	2576 1
+825	2585 1
+825	2619 1
+825	2625 1
+825	2653 1
+825	2660 1
+825	2667 1
+825	2674 1
+825	2686 1
+825	2700 1
+825	2790 1
+825	2794 1
+825	2799 1
+825	2871 1
+825	2917 1
+825	2940 1
+825	2958 1
+825	3024 1
+825	3026 1
+825	3028 1
+825	3084 1
+825	3103 1
+825	3117 1
+825	3125 1
+825	3140 1
+825	3148 1
+825	3192 1
+825	3258 1
+825	3276 1
+825	3321 1
+825	3334 1
+825	3352 1
+825	3447 1
+825	3456 1
+825	3473 1
+825	3537 1
+825	3548 1
+825	3562 1
+825	3568 1
+825	3587 1
+825	3614 1
+825	3631 1
+825	3635 1
+825	3650 1
+825	3660 1
+825	3748 1
+825	3796 1
+825	3800 1
+825	3816 1
+825	3822 1
+825	3835 1
+825	3892 1
+825	3908 1
+825	3910 1
+825	3926 1
+825	3946 1
+825	3969 1
+825	3970 1
+825	3976 1
+825	4024 1
+825	4030 1
+825	4037 1
+825	4043 1
+825	4051 1
+825	4058 1
+825	4099 1
+825	4103 1
+825	4110 1
+825	4124 1
+825	4173 1
+825	4191 1
+825	4261 1
+825	4310 1
+825	4412 1
+825	4417 1
+825	4463 1
+825	4530 1
+825	4551 1
+825	4578 1
+825	4678 1
+825	4687 1
+825	4735 1
+825	4783 1
+825	4820 1
+825	4827 1
+825	4986 1
+825	5020 1
+825	5123 1
+825	5233 1
+825	5262 1
+825	5263 1
+825	5301 1
+825	5351 1
+825	5412 1
+825	5423 1
+825	5426 1
+825	5454 1
+825	5459 1
+825	5484 1
+825	5487 1
+825	5524 1
+825	5527 1
+825	5545 1
+825	5568 1
+825	5592 1
+825	5620 1
+825	5623 1
+825	5640 1
+825	5737 1
+825	5740 1
+825	5743 1
+825	5745 1
+825	5817 1
+825	5828 1
+825	5963 1
+825	6218 1
+825	6229 1
+825	6246 1
+825	6251 1
+825	6327 1
+825	6337 1
+825	6360 1
+825	6590 1
+825	6592 1
+825	6600 1
+825	6628 1
+825	7250 1
+825	7809 1
+825	7839 1
+825	8246 1
+825	8293 1
+830	829 1
+830	993 1
+830	2157 1
+832	407 1
+832	829 1
+832	878 1
+831	829 1
+831	1111 1
+831	1413 1
+831	1811 1
+831	1855 1
+831	1858 1
+831	1927 1
+831	2085 1
+831	2091 1
+831	2095 1
+831	2247 1
+831	5162 1
+835	829 1
+836	429 1
+836	665 1
+836	763 1
+836	765 1
+836	993 1
+836	1428 1
+836	1442 1
+836	1525 1
+836	1621 1
+836	1705 1
+836	1723 1
+836	1734 1
+836	1754 1
+836	1802 1
+836	1805 1
+836	1848 1
+836	1901 1
+836	1997 1
+836	2225 1
+836	2240 1
+836	2256 1
+836	2625 1
+836	2763 1
+836	3026 1
+836	3480 1
+836	3847 1
+837	230 1
+837	839 1
+837	2071 1
+837	6229 1
+838	204 1
+838	230 1
+838	308 1
+838	334 1
+838	417 1
+838	506 1
+838	643 1
+838	730 1
+838	810 1
+838	839 1
+838	844 1
+838	857 1
+838	864 1
+838	866 1
+838	878 1
+838	881 1
+838	882 1
+838	885 1
+838	904 1
+838	932 1
+838	1124 1
+838	1199 1
+838	1322 1
+838	1717 1
+838	1718 1
+838	1732 1
+838	1746 1
+838	1747 1
+838	1752 1
+838	2053 1
+838	2416 1
+838	2799 1
+838	3009 1
+838	3516 1
+838	3548 1
+838	6004 1
+841	56 1
+841	765 1
+841	837 1
+841	1154 1
+841	1291 1
+841	1315 1
+841	1521 1
+841	1653 1
+841	1680 1
+841	1723 1
+841	2014 1
+841	2102 1
+841	2256 1
+841	2323 1
+841	2340 1
+841	2369 1
+841	2375 1
+841	2381 1
+841	2416 1
+841	2516 1
+841	2599 1
+841	2618 1
+841	2625 1
+841	2707 1
+841	2721 1
+841	2754 1
+841	2763 1
+841	2768 1
+841	2770 1
+841	2801 1
+841	2805 1
+841	2814 1
+841	2815 1
+841	2828 1
+841	2844 1
+841	2877 1
+841	2880 1
+841	2918 1
+841	2926 1
+841	2968 1
+841	2993 1
+841	2999 1
+841	3029 1
+841	3034 1
+841	3056 1
+841	3092 1
+841	3251 1
+841	3664 1
+841	3803 1
+841	3914 1
+841	4044 1
+841	4335 1
+841	4645 1
+841	4828 1
+841	4964 1
+841	5132 1
+841	5144 1
+841	5162 1
+841	5204 1
+841	5215 1
+841	5222 1
+840	837 1
+840	3962 1
+840	5002 1
+840	6618 1
+840	6784 1
+840	6790 1
+840	7063 1
+844	299 1
+844	308 1
+844	313 1
+844	432 1
+844	545 1
+844	579 1
+844	637 1
+844	663 1
+844	682 1
+844	730 1
+844	794 1
+844	795 1
+844	805 1
+844	857 1
+844	935 1
+844	936 1
+844	945 1
+844	959 1
+844	966 1
+844	989 1
+844	1007 1
+844	1014 1
+844	1026 1
+844	1043 1
+844	1044 1
+844	1053 1
+844	1125 1
+844	1160 1
+844	1186 1
+844	1218 1
+844	1286 1
+844	1468 1
+844	1629 1
+844	1717 1
+844	1723 1
+844	1726 1
+844	1833 1
+844	1859 1
+844	2409 1
+844	2646 1
+844	3352 1
+844	3645 1
+844	4110 1
+844	4453 1
+844	4666 1
+842	56 1
+842	171 1
+842	290 1
+842	844 1
+842	853 1
+842	935 1
+842	936 1
+842	937 1
+842	945 1
+842	948 1
+842	1124 1
+842	1144 1
+842	1166 1
+842	1284 1
+842	1286 1
+842	1688 1
+842	1706 1
+842	1726 1
+842	1859 1
+842	1966 1
+842	2251 1
+842	2411 1
+842	2485 1
+842	2686 1
+842	2996 1
+842	3018 1
+842	3320 1
+842	3352 1
+842	4055 1
+842	4110 1
+843	844 1
+845	838 1
+847	838 1
+848	228 1
+848	308 1
+848	317 1
+848	643 1
+848	838 1
+848	881 1
+848	882 1
+848	893 1
+851	857 1
+851	1484 1
+854	15 1
+854	72 1
+854	762 1
+854	857 1
+854	863 1
+854	875 1
+854	904 1
+854	968 1
+854	972 1
+854	978 1
+854	981 1
+854	1127 1
+854	1211 1
+854	1297 1
+854	1319 1
+854	1384 1
+854	1385 1
+854	1389 1
+854	1416 1
+854	1420 1
+854	1437 1
+854	1532 1
+854	1538 1
+854	1549 1
+854	1557 1
+854	1564 1
+854	1596 1
+854	1637 1
+854	1672 1
+854	1679 1
+854	1770 1
+854	1836 1
+854	1848 1
+854	1861 1
+854	1864 1
+854	1983 1
+854	2072 1
+854	2091 1
+854	2095 1
+854	2101 1
+854	2112 1
+854	2117 1
+854	2121 1
+854	2135 1
+854	2145 1
+854	2182 1
+854	2206 1
+854	2234 1
+854	2251 1
+854	2297 1
+854	2329 1
+854	2378 1
+854	2411 1
+854	2426 1
+854	2470 1
+854	2484 1
+854	2490 1
+854	2499 1
+854	2565 1
+854	2570 1
+854	2571 1
+854	2589 1
+854	2629 1
+854	2638 1
+854	2651 1
+854	2660 1
+854	2801 1
+854	2825 1
+854	2828 1
+854	2880 1
+854	2963 1
+854	2966 1
+854	3050 1
+854	3238 1
+854	3253 1
+854	3393 1
+854	3439 1
+854	3456 1
+854	3873 1
+854	3976 1
+854	4175 1
+854	4179 1
+854	4385 1
+854	4712 1
+854	4717 1
+854	4792 1
+854	4827 1
+854	4929 1
+854	5200 1
+854	5254 1
+854	5684 1
+854	5994 1
+854	6251 1
+854	6496 1
+854	6715 1
+854	7092 1
+854	7890 1
+854	8174 1
+854	8192 1
+855	857 1
+855	1014 1
+856	825 1
+856	857 1
+856	897 1
+856	1305 1
+856	1307 1
+856	1374 1
+856	1453 1
+856	1521 1
+856	1596 1
+856	1679 1
+856	1814 1
+856	2210 1
+856	2231 1
+856	2252 1
+856	2328 1
+856	2338 1
+856	2411 1
+856	2508 1
+856	2535 1
+856	2542 1
+856	2565 1
+856	2594 1
+856	2619 1
+856	2643 1
+856	2651 1
+856	2660 1
+856	2662 1
+856	2669 1
+856	2674 1
+856	2686 1
+856	2693 1
+856	2700 1
+856	2713 1
+856	2747 1
+856	2754 1
+856	2815 1
+856	2831 1
+856	2900 1
+856	2951 1
+856	2973 1
+856	3018 1
+856	3030 1
+856	3084 1
+856	3089 1
+856	3191 1
+856	3276 1
+856	3307 1
+856	3334 1
+856	3338 1
+856	3348 1
+856	3371 1
+856	3435 1
+856	3446 1
+856	3459 1
+856	3465 1
+856	3506 1
+856	3516 1
+856	3541 1
+856	3670 1
+856	3680 1
+856	3803 1
+856	3849 1
+856	3962 1
+856	4014 1
+856	4037 1
+856	4058 1
+856	4103 1
+856	4110 1
+856	4191 1
+856	4233 1
+856	4361 1
+856	4584 1
+856	4820 1
+856	5002 1
+856	5083 1
+856	5233 1
+856	5511 1
+856	5529 1
+856	6299 1
+856	6347 1
+856	6665 1
+856	6700 1
+856	6720 1
+856	6739 1
+856	6833 1
+856	6855 1
+856	6914 1
+856	6946 1
+856	7351 1
+856	7620 1
+856	7803 1
+852	15 1
+852	86 1
+852	243 1
+852	308 1
+852	417 1
+852	545 1
+852	579 1
+852	762 1
+852	857 1
+852	913 1
+852	989 1
+852	991 1
+852	993 1
+852	1053 1
+852	1211 1
+852	1248 1
+852	1297 1
+852	1471 1
+852	1638 1
+852	1649 1
+852	1654 1
+852	1692 1
+852	2053 1
+852	2066 1
+852	2210 1
+852	2323 1
+852	2535 1
+852	2653 1
+852	3479 1
+852	3755 1
+852	3873 1
+852	3946 1
+852	3976 1
+852	4037 1
+852	4453 1
+852	4687 1
+852	5079 1
+852	6255 1
+852	7632 1
+853	230 1
+853	299 1
+853	317 1
+853	488 1
+853	663 1
+853	674 1
+853	697 1
+853	789 1
+853	857 1
+853	868 1
+853	904 1
+853	985 1
+853	1412 1
+853	1464 1
+853	1726 1
+853	2910 1
+859	86 1
+859	308 1
+859	959 1
+859	1211 1
+859	1297 1
+859	1492 1
+859	1547 1
+859	1700 1
+859	1836 1
+859	1842 1
+859	2062 1
+859	2397 1
+859	2409 1
+860	228 1
+860	308 1
+860	317 1
+860	643 1
+860	730 1
+860	906 1
+860	934 1
+860	955 1
+861	204 1
+861	308 1
+861	579 1
+861	707 1
+861	762 1
+861	941 1
+861	1026 1
+861	1038 1
+861	1253 1
+861	1496 1
+861	1608 1
+861	1859 1
+861	1992 1
+861	2625 1
+861	2685 1
+861	3680 1
+862	637 1
+862	849 1
+862	897 1
+863	637 1
+863	849 1
+863	897 1
+863	906 1
+863	2160 1
+865	15 1
+865	35 1
+865	72 1
+865	86 1
+865	204 1
+865	214 1
+865	228 1
+865	243 1
+865	259 1
+865	271 1
+865	317 1
+865	407 1
+865	417 1
+865	626 1
+865	663 1
+865	665 1
+865	682 1
+865	705 1
+865	730 1
+865	762 1
+865	769 1
+865	784 1
+865	810 1
+865	849 1
+865	857 1
+865	866 1
+865	882 1
+865	893 1
+865	895 1
+865	897 1
+865	929 1
+865	930 1
+865	936 1
+865	942 1
+865	945 1
+865	1026 1
+865	1030 1
+865	1053 1
+865	1080 1
+865	1092 1
+865	1144 1
+865	1156 1
+865	1186 1
+865	1211 1
+865	1222 1
+865	1315 1
+865	1473 1
+865	1497 1
+865	1525 1
+865	1549 1
+865	1563 1
+865	1573 1
+865	1717 1
+865	1808 1
+865	1855 1
+865	2016 1
+865	2060 1
+865	2066 1
+865	2182 1
+865	2210 1
+865	2297 1
+865	2323 1
+865	2398 1
+865	2490 1
+865	2535 1
+865	2542 1
+865	2595 1
+865	2617 1
+865	2625 1
+865	2643 1
+865	2654 1
+865	2660 1
+865	2669 1
+865	2685 1
+865	2687 1
+865	2838 1
+865	2877 1
+865	2880 1
+865	3018 1
+865	3089 1
+865	3291 1
+865	3393 1
+865	3554 1
+865	4021 1
+865	4247 1
+865	4276 1
+865	4846 1
+865	5254 1
+865	5412 1
+865	5423 1
+865	5482 1
+865	5743 1
+865	6328 1
+865	6388 1
+865	6566 1
+865	8292 1
+865	8293 1
+867	868 1
+869	674 1
+869	882 1
+869	941 1
+869	1006 1
+869	1190 1
+869	1191 1
+869	1192 1
+869	1196 1
+869	1547 1
+869	1654 1
+869	2707 1
+870	86 1
+870	171 1
+870	243 1
+870	271 1
+870	298 1
+870	299 1
+870	559 1
+870	579 1
+870	674 1
+870	730 1
+870	733 1
+870	761 1
+870	857 1
+870	861 1
+870	887 1
+870	896 1
+870	993 1
+870	1234 1
+870	1248 1
+870	1279 1
+870	1319 1
+870	1322 1
+870	1428 1
+870	1487 1
+870	1514 1
+870	1520 1
+870	1555 1
+870	1569 1
+870	1573 1
+870	1603 1
+870	1641 1
+870	1654 1
+870	1687 1
+870	1746 1
+870	1768 1
+870	1893 1
+870	1953 1
+870	1966 1
+871	35 1
+871	171 1
+871	214 1
+871	290 1
+871	299 1
+871	311 1
+871	697 1
+871	710 1
+871	717 1
+871	784 1
+871	805 1
+871	826 1
+871	857 1
+871	875 1
+871	941 1
+871	943 1
+871	960 1
+871	971 1
+871	982 1
+871	999 1
+871	1055 1
+871	1062 1
+871	1167 1
+871	1168 1
+871	1193 1
+871	1211 1
+871	1222 1
+871	1241 1
+871	1286 1
+871	1287 1
+871	1377 1
+871	1439 1
+871	1446 1
+871	1453 1
+871	1465 1
+871	1468 1
+871	1471 1
+871	1484 1
+871	1490 1
+871	1506 1
+871	1513 1
+871	1518 1
+871	1524 1
+871	1532 1
+871	1538 1
+871	1612 1
+871	1633 1
+871	1816 1
+871	1859 1
+871	1919 1
+871	1953 1
+871	1966 1
+871	2830 1
+871	2834 1
+871	2990 1
+871	2993 1
+871	2996 1
+871	3023 1
+871	3050 1
+873	643 1
+873	730 1
+873	849 1
+873	875 1
+873	2062 1
+874	875 1
+876	878 1
+877	313 1
+877	878 1
+879	35 1
+879	259 1
+879	432 1
+879	608 1
+879	737 1
+879	810 1
+879	825 1
+879	881 1
+879	1151 1
+879	1166 1
+879	1297 1
+879	1305 1
+879	1382 1
+879	1453 1
+879	1549 1
+879	1744 1
+879	1919 1
+879	1990 1
+879	2072 1
+879	2144 1
+879	2209 1
+879	2237 1
+879	2240 1
+879	2257 1
+879	2297 1
+879	2328 1
+879	2364 1
+879	2381 1
+879	2398 1
+879	2508 1
+879	2517 1
+879	2565 1
+879	2585 1
+879	2612 1
+879	2646 1
+879	2653 1
+879	2655 1
+879	2657 1
+879	2674 1
+879	2746 1
+879	2760 1
+879	2811 1
+879	2859 1
+879	2871 1
+879	2973 1
+879	3014 1
+879	3026 1
+879	3028 1
+879	3059 1
+879	3125 1
+879	3148 1
+879	3180 1
+879	3200 1
+879	3260 1
+879	3276 1
+879	3321 1
+879	3334 1
+879	3352 1
+879	3394 1
+879	3439 1
+879	3443 1
+879	3447 1
+879	3453 1
+879	3454 1
+879	3456 1
+879	3516 1
+879	3537 1
+879	3557 1
+879	3562 1
+879	3568 1
+879	3607 1
+879	3635 1
+879	3643 1
+879	3650 1
+879	3661 1
+879	3680 1
+879	3745 1
+879	3812 1
+879	3843 1
+879	3871 1
+879	3875 1
+879	3892 1
+879	3897 1
+879	3942 1
+879	3956 1
+879	3976 1
+879	4011 1
+879	4040 1
+879	4044 1
+879	4051 1
+879	4124 1
+879	4162 1
+879	4191 1
+879	4212 1
+879	4261 1
+879	4266 1
+879	4290 1
+879	4323 1
+879	4335 1
+879	4359 1
+879	4385 1
+879	4402 1
+879	4448 1
+879	4463 1
+879	4485 1
+879	4528 1
+879	4531 1
+879	4550 1
+879	4578 1
+879	4613 1
+879	4639 1
+879	4661 1
+879	4662 1
+879	4735 1
+879	4814 1
+879	4938 1
+879	4962 1
+879	5295 1
+879	5739 1
+879	5800 1
+879	5829 1
+879	6323 1
+880	881 1
+882	271 1
+882	317 1
+882	897 1
+882	963 1
+882	985 1
+882	1053 1
+882	1569 1
+883	407 1
+883	730 1
+883	1043 1
+885	794 1
+885	937 1
+885	977 1
+885	995 1
+885	1144 1
+885	1556 1
+885	1563 1
+886	407 1
+886	643 1
+886	7699 1
+887	863 1
+888	863 1
+889	863 1
+890	863 1
+891	863 1
+892	893 1
+469	608 1
+469	893 1
+469	1186 1
+469	1717 1
+469	1855 1
+469	1956 1
+469	3408 1
+469	5254 1
+469	5714 1
+469	7131 1
+895	86 1
+895	271 1
+895	741 1
+895	794 1
+895	1569 1
+895	2763 1
+897	227 1
+896	86 1
+896	439 1
+896	696 1
+896	741 1
+896	897 1
+896	1053 1
+896	1123 1
+896	1125 1
+896	1901 1
+896	2499 1
+896	3498 1
+896	3843 1
+896	3856 1
+896	4037 1
+896	4310 1
+896	5254 1
+896	5335 1
+896	5465 1
+896	5563 1
+896	5798 1
+896	6299 1
+896	6780 1
+896	6934 1
+896	6979 1
+896	7094 1
+896	7961 1
+898	86 1
+898	762 1
+898	849 1
+898	897 1
+898	1026 1
+898	2511 1
+898	2764 1
+898	2765 1
+898	4796 1
+898	5412 1
+900	228 1
+900	407 1
+900	1193 1
+900	1323 1
+900	2007 1
+902	849 1
+902	1385 1
+904	35 1
+904	171 1
+904	230 1
+904	259 1
+904	372 1
+904	407 1
+904	506 1
+904	559 1
+904	575 1
+904	587 1
+904	761 1
+904	763 1
+904	797 1
+904	810 1
+904	857 1
+904	928 1
+904	959 1
+904	971 1
+904	982 1
+904	993 1
+904	999 1
+904	1014 1
+904	1031 1
+904	1097 1
+904	1103 1
+904	1127 1
+904	1151 1
+904	1154 1
+904	1160 1
+904	1165 1
+904	1199 1
+904	1211 1
+904	1222 1
+904	1243 1
+904	1261 1
+904	1296 1
+904	1319 1
+904	1322 1
+904	1326 1
+904	1330 1
+904	1374 1
+904	1375 1
+904	1390 1
+904	1442 1
+904	1453 1
+904	1465 1
+904	1471 1
+904	1478 1
+904	1485 1
+904	1486 1
+904	1487 1
+904	1490 1
+904	1496 1
+904	1513 1
+904	1525 1
+904	1542 1
+904	1547 1
+904	1549 1
+904	1610 1
+904	1629 1
+904	1633 1
+904	1649 1
+904	1678 1
+904	1700 1
+904	1716 1
+904	1717 1
+904	1718 1
+904	1732 1
+904	1746 1
+904	1747 1
+904	1749 1
+904	1752 1
+904	1757 1
+904	1758 1
+904	1768 1
+904	1771 1
+904	1774 1
+904	1783 1
+904	1787 1
+904	1788 1
+904	1791 1
+904	1798 1
+904	1819 1
+904	1833 1
+904	1842 1
+904	1847 1
+904	1849 1
+904	1855 1
+904	1857 1
+904	1861 1
+904	1864 1
+904	1918 1
+904	1920 1
+904	1963 1
+904	1973 1
+904	1979 1
+904	1997 1
+904	2145 1
+904	2157 1
+904	2210 1
+904	2253 1
+904	2273 1
+904	2276 1
+904	2281 1
+904	2290 1
+904	2307 1
+904	2322 1
+904	2348 1
+904	2385 1
+904	2397 1
+904	2400 1
+904	2571 1
+904	2604 1
+904	2643 1
+904	2751 1
+904	2754 1
+904	3084 1
+904	3755 1
+904	8291 1
+903	904 1
+905	86 1
+905	906 1
+907	259 1
+907	704 1
+907	733 1
+907	959 1
+907	1734 1
+907	2211 1
+907	2281 1
+907	2470 1
+907	8291 1
+908	439 1
+908	958 1
+908	1297 1
+908	1836 1
+908	1849 1
+908	2763 1
+908	2801 1
+908	3755 1
+908	4735 1
+909	86 1
+909	439 1
+909	938 1
+909	3334 1
+909	5079 1
+909	5233 1
+909	6789 1
+909	6953 1
+909	7407 1
+909	7422 1
+909	7439 1
+909	7478 1
+910	86 1
+910	439 1
+911	86 1
+911	243 1
+911	271 1
+911	304 1
+911	321 1
+911	439 1
+911	447 1
+911	626 1
+911	697 1
+911	704 1
+911	769 1
+911	789 1
+911	794 1
+911	795 1
+911	918 1
+911	932 1
+911	934 1
+911	942 1
+911	958 1
+911	1030 1
+911	1039 1
+911	1044 1
+911	1053 1
+911	1080 1
+911	1123 1
+911	1131 1
+911	1160 1
+912	86 1
+912	214 1
+912	439 1
+912	682 1
+912	929 1
+912	955 1
+912	994 1
+912	1053 1
+912	1123 1
+913	86 1
+913	439 1
+913	2328 1
+914	271 1
+914	304 1
+914	407 1
+914	439 1
+914	989 1
+914	1131 1
+914	2576 1
+923	86 1
+915	86 1
+915	762 1
+915	918 1
+915	1580 1
+915	1717 1
+915	1966 1
+915	2809 1
+916	86 1
+916	559 1
+916	1186 1
+916	1569 1
+917	86 1
+918	86 1
+918	321 1
+918	334 1
+918	665 1
+918	763 1
+918	904 1
+918	985 1
+918	1000 1
+918	1075 1
+918	1261 1
+918	1525 1
+918	1633 1
+918	1717 1
+918	1793 1
+918	1802 1
+918	1927 1
+918	3136 1
+919	86 1
+920	86 1
+920	407 1
+920	545 1
+920	941 1
+920	1026 1
+920	1297 1
+920	1490 1
+920	1669 1
+920	2069 1
+920	2151 1
+921	86 1
+921	545 1
+921	761 1
+921	978 1
+921	1439 1
+921	1484 1
+924	86 1
+787	15 1
+787	86 1
+787	565 1
+787	1018 1
+787	1160 1
+787	1211 1
+787	2060 1
+787	2651 1
+787	3635 1
+787	4103 1
+787	4212 1
+787	8290 1
+927	929 1
+928	579 1
+928	762 1
+928	929 1
+928	1211 1
+928	1236 1
+928	1267 1
+928	1297 1
+928	1439 1
+928	1514 1
+928	1564 1
+928	1687 1
+928	1861 1
+928	1864 1
+928	2066 1
+928	2151 1
+928	2499 1
+928	2501 1
+928	2508 1
+928	2646 1
+928	2707 1
+928	2996 1
+932	665 1
+926	243 1
+926	769 1
+926	932 1
+926	1030 1
+926	1131 1
+926	1141 1
+931	665 1
+931	932 1
+935	290 1
+935	506 1
+935	853 1
+935	936 1
+935	1284 1
+935	1285 1
+935	1286 1
+935	1534 1
+935	1717 1
+935	1723 1
+935	1726 1
+935	1770 1
+935	1859 1
+935	1903 1
+935	1965 1
+935	2079 1
+935	2470 1
+935	2485 1
+935	2880 1
+935	3796 1
+935	5106 1
+935	6875 1
+938	966 1
+938	972 1
+937	271 1
+937	682 1
+937	795 1
+937	938 1
+937	955 1
+937	958 1
+937	977 1
+937	979 1
+937	981 1
+937	983 1
+937	1020 1
+937	1031 1
+937	1053 1
+937	1061 1
+937	1123 1
+937	1127 1
+937	1151 1
+937	1152 1
+937	1156 1
+937	1191 1
+937	1222 1
+937	1240 1
+937	1260 1
+937	1277 1
+937	1284 1
+937	1378 1
+937	1413 1
+937	1453 1
+937	1549 1
+937	1585 1
+937	1621 1
+937	1723 1
+937	1754 1
+937	1781 1
+937	1888 1
+937	1919 1
+937	1956 1
+937	2071 1
+937	2114 1
+937	2251 1
+937	2485 1
+937	2625 1
+937	2955 1
+937	2968 1
+937	3117 1
+937	8288 1
+940	682 1
+941	35 1
+941	56 1
+941	171 1
+941	214 1
+941	227 1
+941	290 1
+941	299 1
+941	311 1
+941	334 1
+941	417 1
+941	579 1
+941	647 1
+941	682 1
+941	691 1
+941	697 1
+941	861 1
+941	907 1
+941	922 1
+941	928 1
+941	971 1
+941	978 1
+941	1034 1
+941	1062 1
+941	1127 1
+941	1151 1
+941	1193 1
+941	1199 1
+941	1201 1
+941	1222 1
+941	1230 1
+941	1234 1
+941	1253 1
+941	1260 1
+941	1279 1
+941	1286 1
+941	1297 1
+941	1319 1
+941	1330 1
+941	1375 1
+941	1411 1
+941	1413 1
+941	1425 1
+941	1428 1
+941	1439 1
+941	1482 1
+941	1484 1
+941	1489 1
+941	1492 1
+941	1496 1
+941	1514 1
+941	1521 1
+941	1538 1
+941	1555 1
+941	1564 1
+941	1580 1
+941	1587 1
+941	1593 1
+941	1596 1
+941	1621 1
+941	1622 1
+941	1700 1
+941	1701 1
+941	1754 1
+941	1768 1
+941	1774 1
+941	1805 1
+941	1816 1
+941	1859 1
+941	1893 1
+941	1969 1
+941	2102 1
+941	2106 1
+941	2120 1
+941	2333 1
+941	2499 1
+941	2618 1
+941	3117 1
+941	3136 1
+941	3164 1
+941	8291 1
+943	35 1
+943	243 1
+943	271 1
+943	299 1
+943	313 1
+943	826 1
+943	918 1
+943	922 1
+943	945 1
+943	955 1
+943	960 1
+943	1023 1
+943	1029 1
+943	1035 1
+943	1164 1
+943	1167 1
+943	1193 1
+943	1234 1
+943	1425 1
+943	1518 1
+943	1538 1
+943	1622 1
+943	1633 1
+943	2071 1
+943	2134 1
+943	2356 1
+943	2654 1
+943	3473 1
+943	4011 1
+943	5412 1
+944	271 1
+944	945 1
+944	1752 1
+944	2332 1
+944	3251 1
+946	35 1
+946	56 1
+946	72 1
+946	204 1
+946	271 1
+946	311 1
+946	334 1
+946	350 1
+946	403 1
+946	579 1
+946	663 1
+946	697 1
+946	704 1
+946	707 1
+946	722 1
+946	744 1
+946	762 1
+946	765 1
+946	857 1
+946	859 1
+946	887 1
+946	937 1
+946	947 1
+946	985 1
+946	993 1
+946	1018 1
+946	1020 1
+946	1031 1
+946	1035 1
+946	1049 1
+946	1062 1
+946	1125 1
+946	1140 1
+946	1166 1
+946	1186 1
+946	1191 1
+946	1192 1
+946	1193 1
+946	1211 1
+946	1218 1
+946	1250 1
+946	1253 1
+946	1259 1
+946	1297 1
+946	1357 1
+946	1360 1
+946	1396 1
+946	1407 1
+946	1412 1
+946	1413 1
+946	1418 1
+946	1521 1
+946	1549 1
+946	1565 1
+946	1585 1
+946	1596 1
+946	1633 1
+946	1653 1
+946	1808 1
+946	1847 1
+946	1888 1
+946	2066 1
+946	2076 1
+946	2083 1
+946	2114 1
+946	2128 1
+946	2137 1
+946	2225 1
+946	2241 1
+946	2290 1
+946	2294 1
+946	2328 1
+946	2333 1
+946	2341 1
+946	2400 1
+946	2426 1
+946	2485 1
+946	2504 1
+946	2508 1
+946	2510 1
+946	2571 1
+946	2575 1
+946	2593 1
+946	2619 1
+946	2653 1
+946	2654 1
+946	2669 1
+946	2670 1
+946	2685 1
+946	2689 1
+946	2697 1
+946	2720 1
+946	2799 1
+946	2801 1
+946	2818 1
+946	2821 1
+946	2828 1
+946	2993 1
+946	2996 1
+946	3026 1
+946	3050 1
+946	3117 1
+946	3253 1
+946	3256 1
+946	3320 1
+946	3404 1
+946	3629 1
+946	4040 1
+946	4179 1
+946	5412 1
+947	271 1
+947	697 1
+947	737 1
+947	764 1
+947	1679 1
+947	2066 1
+947	2237 1
+947	2594 1
+947	2623 1
+947	2625 1
+947	2651 1
+947	2689 1
+947	2713 1
+947	3005 1
+947	3456 1
+947	3549 1
+947	3615 1
+947	4181 1
+947	4247 1
+947	4297 1
+947	4385 1
+947	4400 1
+947	4735 1
+947	4777 1
+947	4796 1
+947	4962 1
+947	5412 1
+948	271 1
+948	324 1
+948	633 1
+948	1156 1
+948	1199 1
+948	1323 1
+948	1419 1
+948	1453 1
+948	1482 1
+948	1534 1
+948	1714 1
+948	1726 1
+948	2137 1
+948	2181 1
+948	2485 1
+948	2516 1
+948	2619 1
+948	2689 1
+948	2815 1
+948	2834 1
+948	3148 1
+948	3243 1
+948	3253 1
+948	4879 1
+948	5083 1
+948	5253 1
+948	6832 1
+948	6907 1
+948	7624 1
+949	56 1
+949	271 1
+949	425 1
+949	1407 1
+949	1573 1
+949	1580 1
+949	2165 1
+949	2322 1
+950	918 1
+950	2001 1
+950	2605 1
+950	4797 1
+950	4994 1
+950	5454 1
+950	5459 1
+950	5757 1
+950	7979 1
+951	918 1
+954	56 1
+954	290 1
+954	407 1
+954	626 1
+954	742 1
+954	857 1
+954	904 1
+954	955 1
+954	985 1
+954	989 1
+954	1131 1
+954	1186 1
+954	1218 1
+954	1261 1
+954	1277 1
+954	1411 1
+954	1453 1
+954	1485 1
+954	1486 1
+954	1564 1
+954	1669 1
+954	1717 1
+954	1718 1
+954	1836 1
+954	1849 1
+954	1861 1
+954	1864 1
+954	2163 1
+954	2205 1
+954	2206 1
+954	2593 1
+954	2619 1
+954	2643 1
+954	8291 1
+956	56 1
+956	271 1
+956	299 1
+956	311 1
+956	321 1
+956	417 1
+956	663 1
+956	686 1
+956	696 1
+956	697 1
+956	722 1
+956	742 1
+956	764 1
+956	765 1
+956	784 1
+956	823 1
+956	857 1
+956	958 1
+956	978 1
+956	993 1
+956	1023 1
+956	1026 1
+956	1031 1
+956	1039 1
+956	1053 1
+956	1123 1
+956	1131 1
+956	1190 1
+956	1613 1
+956	1966 1
+956	2106 1
+956	2210 1
+956	2246 1
+956	2341 1
+956	2504 1
+956	2508 1
+956	2535 1
+956	2669 1
+956	2777 1
+956	3433 1
+956	4201 1
+956	4338 1
+957	304 1
+957	958 1
+957	1023 1
+959	259 1
+959	313 1
+959	545 1
+959	978 1
+959	985 1
+959	1026 1
+959	1186 1
+959	1297 1
+959	1835 1
+959	1836 1
+959	1842 1
+959	3755 1
+960	214 1
+960	313 1
+960	626 1
+960	663 1
+960	696 1
+960	697 1
+960	805 1
+960	1000 1
+960	1034 1
+960	1125 1
+960	1160 1
+960	1322 1
+960	1564 1
+960	1633 1
+960	1781 1
+960	1956 1
+960	2504 1
+960	2542 1
+960	2576 1
+960	2580 1
+960	3136 1
+960	3769 1
+961	966 1
+961	1031 1
+961	1049 1
+961	1701 1
+961	1847 1
+961	1956 1
+961	1964 1
+961	2069 1
+961	2073 1
+961	2128 1
+961	2181 1
+961	2625 1
+961	2660 1
+961	2966 1
+961	8290 1
+961	8291 1
+965	966 1
+962	966 1
+962	1186 1
+962	3456 1
+963	966 1
+963	3473 1
+963	4875 1
+964	966 1
+964	1382 1
+964	1453 1
+964	3634 1
+933	317 1
+933	704 1
+933	789 1
+933	795 1
+933	966 1
+933	999 1
+933	1014 1
+933	1080 1
+933	1103 1
+933	1186 1
+933	1490 1
+933	1514 1
+933	1697 1
+933	1836 1
+933	1842 1
+933	1855 1
+933	1864 1
+933	1966 1
+967	243 1
+967	697 1
+967	742 1
+967	789 1
+967	972 1
+967	3456 1
+967	4037 1
+967	5210 1
+967	5466 1
+967	5819 1
+967	6918 1
+967	6946 1
+967	7620 1
+967	8037 1
+967	8042 1
+967	8044 1
+968	972 1
+968	1384 1
+968	1592 1
+968	7890 1
+968	8174 1
+969	972 1
+969	1389 1
+970	338 1
+970	626 1
+970	784 1
+970	857 1
+970	972 1
+970	1022 1
+970	1144 1
+970	1156 1
+970	1297 1
+970	1518 1
+970	1893 1
+971	35 1
+971	171 1
+971	271 1
+971	290 1
+971	299 1
+971	311 1
+971	317 1
+971	321 1
+971	334 1
+971	663 1
+971	710 1
+971	762 1
+971	789 1
+971	794 1
+971	805 1
+971	810 1
+971	857 1
+971	871 1
+971	904 1
+971	930 1
+971	937 1
+971	941 1
+971	956 1
+971	959 1
+971	972 1
+971	979 1
+971	982 1
+971	1006 1
+971	1014 1
+971	1061 1
+971	1123 1
+971	1131 1
+971	1152 1
+971	1159 1
+971	1167 1
+971	1191 1
+971	1193 1
+971	1199 1
+971	1211 1
+971	1241 1
+971	1260 1
+971	1261 1
+971	1277 1
+971	1284 1
+971	1321 1
+971	1389 1
+971	1428 1
+971	1441 1
+971	1496 1
+971	1501 1
+971	1514 1
+971	1525 1
+971	1538 1
+971	1555 1
+971	1557 1
+971	1573 1
+971	1603 1
+971	1752 1
+971	1758 1
+971	1774 1
+971	1780 1
+971	1802 1
+971	1811 1
+971	1849 1
+971	1920 1
+971	1950 1
+971	1966 1
+971	1973 1
+971	4365 1
+971	5452 1
+971	5936 1
+971	5994 1
+973	977 1
+973	1232 1
+974	15 1
+974	204 1
+974	271 1
+974	417 1
+974	762 1
+974	977 1
+974	978 1
+974	1166 1
+974	1297 1
+974	1385 1
+974	2144 1
+974	2209 1
+974	2237 1
+974	2240 1
+974	2289 1
+974	2328 1
+974	2654 1
+974	2667 1
+974	2747 1
+974	2871 1
+974	3005 1
+974	3443 1
+974	3580 1
+974	3587 1
+974	3769 1
+974	3946 1
+974	3976 1
+974	4037 1
+974	4191 1
+974	4373 1
+974	4384 1
+974	4735 1
+974	4962 1
+974	4981 1
+974	5822 1
+974	8294 1
+975	977 1
+975	993 1
+975	1714 1
+975	1919 1
+975	1997 1
+975	2071 1
+975	2195 1
+975	2211 1
+975	2625 1
+975	2708 1
+975	3205 1
+976	977 1
+980	979 1
+978	35 1
+978	56 1
+978	171 1
+978	214 1
+978	271 1
+978	290 1
+978	304 1
+978	324 1
+978	407 1
+978	415 1
+978	545 1
+978	644 1
+978	761 1
+978	805 1
+978	908 1
+978	956 1
+978	959 1
+978	979 1
+978	989 1
+978	993 1
+978	1012 1
+978	1022 1
+978	1026 1
+978	1029 1
+978	1031 1
+978	1062 1
+978	1080 1
+978	1114 1
+978	1125 1
+978	1156 1
+978	1165 1
+978	1191 1
+978	1192 1
+978	1193 1
+978	1222 1
+978	1234 1
+978	1279 1
+978	1296 1
+978	1297 1
+978	1374 1
+978	1425 1
+978	1432 1
+978	1439 1
+978	1482 1
+978	1484 1
+978	1496 1
+978	1514 1
+978	1564 1
+978	1585 1
+978	1641 1
+978	1661 1
+978	1680 1
+978	1718 1
+978	1847 1
+978	1861 1
+978	1864 1
+978	1956 1
+978	2117 1
+978	2120 1
+978	2151 1
+978	2174 1
+978	2435 1
+978	2625 1
+978	2900 1
+978	3136 1
+981	271 1
+981	304 1
+981	626 1
+981	696 1
+981	697 1
+981	704 1
+981	789 1
+981	857 1
+981	1053 1
+981	1123 1
+981	1164 1
+981	1193 1
+981	1377 1
+981	1497 1
+981	1593 1
+981	1603 1
+982	299 1
+982	338 1
+982	407 1
+982	663 1
+982	705 1
+982	794 1
+982	857 1
+982	887 1
+982	930 1
+982	937 1
+982	1012 1
+982	1035 1
+982	1043 1
+982	1053 1
+982	1123 1
+982	1125 1
+982	1144 1
+982	1152 1
+982	1154 1
+982	1156 1
+982	1186 1
+982	1190 1
+982	1191 1
+982	1192 1
+982	1220 1
+982	1222 1
+982	1241 1
+982	1453 1
+982	1730 1
+982	2151 1
+982	2338 1
+982	2470 1
+982	2625 1
+982	2651 1
+982	2693 1
+982	2708 1
+982	2747 1
+982	2912 1
+982	2951 1
+982	3173 1
+982	3276 1
+982	3615 1
+982	3670 1
+982	4058 1
+982	4191 1
+982	5073 1
+982	5432 1
+983	8288 1
+984	15 1
+984	644 1
+984	704 1
+984	789 1
+984	995 1
+984	1261 1
+984	5210 1
+985	35 1
+985	704 1
+985	789 1
+985	857 1
+985	1193 1
+985	5210 1
+986	35 1
+986	72 1
+986	171 1
+986	290 1
+986	332 1
+986	334 1
+986	626 1
+986	704 1
+986	722 1
+986	789 1
+986	791 1
+986	805 1
+986	922 1
+986	946 1
+986	948 1
+986	960 1
+986	978 1
+986	985 1
+986	993 1
+986	1035 1
+986	1062 1
+986	1140 1
+986	1151 1
+986	1166 1
+986	1186 1
+986	1191 1
+986	1192 1
+986	1201 1
+986	1203 1
+986	1211 1
+986	1240 1
+986	1241 1
+986	1266 1
+986	1270 1
+986	1277 1
+986	1286 1
+986	1287 1
+986	1297 1
+986	1307 1
+986	1453 1
+986	1464 1
+986	1482 1
+986	1484 1
+986	1532 1
+986	1549 1
+986	1573 1
+986	1679 1
+986	1730 1
+986	1734 1
+986	1758 1
+986	1842 1
+986	1861 1
+986	1864 1
+986	1966 1
+986	2066 1
+986	2117 1
+986	2163 1
+986	2237 1
+986	2251 1
+986	2256 1
+986	2322 1
+986	2328 1
+986	2341 1
+986	2348 1
+986	2397 1
+986	2594 1
+986	2625 1
+986	2763 1
+986	2856 1
+986	2871 1
+986	3307 1
+986	3348 1
+986	3456 1
+986	3970 1
+986	4365 1
+986	8290 1
+986	8291 1
+988	204 1
+988	290 1
+988	332 1
+988	417 1
+988	465 1
+988	633 1
+988	722 1
+988	737 1
+988	762 1
+988	856 1
+988	859 1
+988	922 1
+988	959 1
+988	974 1
+988	982 1
+988	989 1
+988	1018 1
+988	1049 1
+988	1100 1
+988	1157 1
+988	1166 1
+988	1185 1
+988	1186 1
+988	1250 1
+988	1267 1
+988	1291 1
+988	1297 1
+988	1305 1
+988	1307 1
+988	1357 1
+988	1393 1
+988	1416 1
+988	1437 1
+988	1453 1
+988	1492 1
+988	1549 1
+988	1571 1
+988	1608 1
+988	1633 1
+988	1679 1
+988	1688 1
+988	1700 1
+988	1706 1
+988	1734 1
+988	1744 1
+988	1754 1
+988	1769 1
+988	1777 1
+988	1781 1
+988	1792 1
+988	1814 1
+988	1835 1
+988	1837 1
+988	1842 1
+988	1919 1
+988	1964 1
+988	1982 1
+988	2016 1
+988	2066 1
+988	2097 1
+988	2114 1
+988	2116 1
+988	2117 1
+988	2120 1
+988	2134 1
+988	2135 1
+988	2145 1
+988	2209 1
+988	2210 1
+988	2225 1
+988	2231 1
+988	2237 1
+988	2240 1
+988	2251 1
+988	2252 1
+988	2256 1
+988	2257 1
+988	2290 1
+988	2297 1
+988	2322 1
+988	2323 1
+988	2324 1
+988	2325 1
+988	2328 1
+988	2338 1
+988	2356 1
+988	2371 1
+988	2400 1
+988	2411 1
+988	2416 1
+988	2435 1
+988	2474 1
+988	2479 1
+988	2485 1
+988	2490 1
+988	2510 1
+988	2517 1
+988	2535 1
+988	2542 1
+988	2544 1
+988	2550 1
+988	2565 1
+988	2576 1
+988	2585 1
+988	2587 1
+988	2593 1
+988	2594 1
+988	2595 1
+988	2597 1
+988	2612 1
+988	2617 1
+988	2619 1
+988	2623 1
+988	2625 1
+988	2646 1
+988	2651 1
+988	2653 1
+988	2654 1
+988	2655 1
+988	2657 1
+988	2660 1
+988	2662 1
+988	2667 1
+988	2674 1
+988	2686 1
+988	2693 1
+988	2697 1
+988	2700 1
+988	2708 1
+988	2713 1
+988	2727 1
+988	2746 1
+988	2747 1
+988	2754 1
+988	2760 1
+988	2799 1
+988	2819 1
+988	2830 1
+988	2856 1
+988	2900 1
+988	2912 1
+988	2918 1
+988	2923 1
+988	2951 1
+988	2958 1
+988	2972 1
+988	2973 1
+988	2974 1
+988	2991 1
+988	2999 1
+988	3005 1
+988	3007 1
+988	3009 1
+988	3010 1
+988	3018 1
+988	3020 1
+988	3021 1
+988	3024 1
+988	3026 1
+988	3028 1
+988	3029 1
+988	3030 1
+988	3033 1
+988	3034 1
+988	3056 1
+988	3059 1
+988	3084 1
+988	3089 1
+988	3099 1
+988	3114 1
+988	3126 1
+988	3140 1
+988	3148 1
+988	3150 1
+988	3164 1
+988	3173 1
+988	3180 1
+988	3235 1
+988	3243 1
+988	3251 1
+988	3253 1
+988	3255 1
+988	3258 1
+988	3260 1
+988	3265 1
+988	3276 1
+988	3284 1
+988	3293 1
+988	3307 1
+988	3324 1
+988	3338 1
+988	3348 1
+988	3351 1
+988	3352 1
+988	3371 1
+988	3376 1
+988	3404 1
+988	3408 1
+988	3435 1
+988	3439 1
+988	3454 1
+988	3473 1
+988	3480 1
+988	3489 1
+988	3506 1
+988	3529 1
+988	3537 1
+988	3538 1
+988	3541 1
+988	3547 1
+988	3548 1
+988	3557 1
+988	3567 1
+988	3580 1
+988	3587 1
+988	3645 1
+988	3670 1
+988	3680 1
+988	3681 1
+988	3745 1
+988	3769 1
+988	3800 1
+988	3804 1
+988	3807 1
+988	3809 1
+988	3812 1
+988	3825 1
+988	3847 1
+988	3849 1
+988	3871 1
+988	3892 1
+988	3903 1
+988	3926 1
+988	3937 1
+988	3970 1
+988	4013 1
+988	4037 1
+988	4256 1
+988	4290 1
+988	4384 1
+988	4401 1
+988	4432 1
+988	4578 1
+988	4735 1
+988	4962 1
+988	4999 1
+988	5022 1
+988	5210 1
+988	5417 1
+988	5605 1
+988	5614 1
+988	5819 1
+988	5887 1
+988	6044 1
+988	6618 1
+988	6634 1
+988	6737 1
+988	6759 1
+988	6946 1
+988	6980 1
+988	7050 1
+988	7233 1
+988	7391 1
+988	7620 1
+988	7810 1
+988	7835 1
+988	7908 1
+988	7910 1
+988	8037 1
+988	8042 1
+988	8051 1
+988	8073 1
+988	8083 1
+988	8121 1
+988	8122 1
+988	8124 1
+988	8128 1
+988	8130 1
+988	8134 1
+988	8141 1
+988	8163 1
+988	8168 1
+988	8174 1
+988	8178 1
+988	8192 1
+988	8198 1
+988	8209 1
+988	8212 1
+988	8219 1
+988	8224 1
+988	8237 1
+988	8293 1
+987	304 1
+987	989 1
+990	991 1
+992	794 1
+993	35 1
+993	56 1
+993	171 1
+993	214 1
+993	298 1
+993	299 1
+993	304 1
+993	311 1
+993	317 1
+993	334 1
+993	403 1
+993	415 1
+993	506 1
+993	579 1
+993	587 1
+993	626 1
+993	663 1
+993	697 1
+993	722 1
+993	761 1
+993	762 1
+993	765 1
+993	789 1
+993	805 1
+993	813 1
+993	826 1
+993	836 1
+993	857 1
+993	871 1
+993	873 1
+993	887 1
+993	908 1
+993	935 1
+993	937 1
+993	946 1
+993	947 1
+993	948 1
+993	956 1
+993	959 1
+993	975 1
+993	978 1
+993	995 1
+993	999 1
+993	1000 1
+993	1014 1
+993	1022 1
+993	1026 1
+993	1031 1
+993	1035 1
+993	1061 1
+993	1097 1
+993	1103 1
+993	1111 1
+993	1125 1
+993	1151 1
+993	1164 1
+993	1165 1
+993	1166 1
+993	1167 1
+993	1168 1
+993	1190 1
+993	1200 1
+993	1201 1
+993	1203 1
+993	1211 1
+993	1222 1
+993	1230 1
+993	1234 1
+993	1236 1
+993	1239 1
+993	1243 1
+993	1261 1
+993	1279 1
+993	1284 1
+993	1285 1
+993	1286 1
+993	1297 1
+993	1319 1
+993	1330 1
+993	1374 1
+993	1377 1
+993	1378 1
+993	1382 1
+993	1393 1
+993	1394 1
+993	1407 1
+993	1413 1
+993	1416 1
+993	1420 1
+993	1425 1
+993	1428 1
+993	1437 1
+993	1444 1
+993	1464 1
+993	1471 1
+993	1476 1
+993	1482 1
+993	1489 1
+993	1492 1
+993	1496 1
+993	1501 1
+993	1506 1
+993	1514 1
+993	1520 1
+993	1533 1
+993	1534 1
+993	1537 1
+993	1538 1
+993	1542 1
+993	1547 1
+993	1549 1
+993	1555 1
+993	1556 1
+993	1557 1
+993	1565 1
+993	1566 1
+993	1573 1
+993	1580 1
+993	1583 1
+993	1585 1
+993	1587 1
+993	1603 1
+993	1608 1
+993	1621 1
+993	1622 1
+993	1629 1
+993	1633 1
+993	1637 1
+993	1641 1
+993	1646 1
+993	1661 1
+993	1679 1
+993	1689 1
+993	1697 1
+993	1700 1
+993	1707 1
+993	1717 1
+993	1726 1
+993	1730 1
+993	1749 1
+993	1758 1
+993	1768 1
+993	1772 1
+993	1774 1
+993	1787 1
+993	1788 1
+993	1802 1
+993	1808 1
+993	1811 1
+993	1814 1
+993	1835 1
+993	1836 1
+993	1842 1
+993	1847 1
+993	1848 1
+993	1880 1
+993	1888 1
+993	1901 1
+993	1903 1
+993	1908 1
+993	1919 1
+993	1963 1
+993	1965 1
+993	1966 1
+993	1969 1
+993	1987 1
+993	1991 1
+993	1997 1
+993	2062 1
+993	2066 1
+993	2069 1
+993	2071 1
+993	2073 1
+993	2097 1
+993	2102 1
+993	2106 1
+993	2117 1
+993	2119 1
+993	2120 1
+993	2128 1
+993	2134 1
+993	2137 1
+993	2157 1
+993	2168 1
+993	2195 1
+993	2211 1
+993	2225 1
+993	2246 1
+993	2323 1
+993	2324 1
+993	2328 1
+993	2329 1
+993	2341 1
+993	2345 1
+993	2386 1
+993	2400 1
+993	2475 1
+993	2479 1
+993	2504 1
+993	2570 1
+993	2580 1
+993	2619 1
+993	2625 1
+993	2654 1
+993	2655 1
+993	2685 1
+993	2686 1
+993	2693 1
+993	2708 1
+993	2763 1
+993	2805 1
+993	2814 1
+993	2815 1
+993	2828 1
+993	2834 1
+993	2859 1
+993	2972 1
+993	3014 1
+993	3117 1
+993	3130 1
+993	3136 1
+993	3352 1
+993	3537 1
+993	3800 1
+993	3888 1
+993	3926 1
+993	3970 1
+993	4256 1
+993	4365 1
+993	4424 1
+993	5064 1
+993	5100 1
+993	5210 1
+993	5543 1
+993	6498 1
+993	7063 1
+993	7961 1
+993	8290 1
+994	15 1
+994	35 1
+994	304 1
+994	311 1
+994	321 1
+994	663 1
+994	696 1
+994	697 1
+994	707 1
+994	710 1
+994	742 1
+994	762 1
+994	789 1
+994	805 1
+994	995 1
+994	1007 1
+994	1023 1
+994	1026 1
+994	1039 1
+994	1160 1
+994	1193 1
+994	1259 1
+994	1297 1
+994	1393 1
+994	1549 1
+994	1633 1
+994	1706 1
+994	1859 1
+994	2114 1
+994	2209 1
+994	2328 1
+994	2625 1
+994	2654 1
+994	2775 1
+994	2856 1
+994	3030 1
+994	3192 1
+994	3529 1
+994	3537 1
+994	3885 1
+994	3892 1
+994	4013 1
+994	4384 1
+994	4953 1
+994	5412 1
+996	15 1
+996	56 1
+996	204 1
+996	259 1
+996	290 1
+996	332 1
+996	334 1
+996	346 1
+996	350 1
+996	403 1
+996	425 1
+996	587 1
+996	608 1
+996	633 1
+996	644 1
+996	647 1
+996	722 1
+996	762 1
+996	764 1
+996	765 1
+996	810 1
+996	813 1
+996	820 1
+996	859 1
+996	907 1
+996	946 1
+996	947 1
+996	959 1
+996	968 1
+996	971 1
+996	1018 1
+996	1035 1
+996	1049 1
+996	1061 1
+996	1100 1
+996	1166 1
+996	1185 1
+996	1186 1
+996	1203 1
+996	1211 1
+996	1234 1
+996	1243 1
+996	1247 1
+996	1250 1
+996	1267 1
+996	1291 1
+996	1296 1
+996	1297 1
+996	1353 1
+996	1357 1
+996	1375 1
+996	1378 1
+996	1384 1
+996	1389 1
+996	1393 1
+996	1394 1
+996	1402 1
+996	1412 1
+996	1413 1
+996	1416 1
+996	1419 1
+996	1435 1
+996	1444 1
+996	1453 1
+996	1471 1
+996	1472 1
+996	1473 1
+996	1521 1
+996	1542 1
+996	1547 1
+996	1565 1
+996	1571 1
+996	1592 1
+996	1608 1
+996	1613 1
+996	1621 1
+996	1633 1
+996	1637 1
+996	1638 1
+996	1646 1
+996	1648 1
+996	1653 1
+996	1678 1
+996	1705 1
+996	1723 1
+996	1729 1
+996	1734 1
+996	1749 1
+996	1783 1
+996	1792 1
+996	1814 1
+996	1823 1
+996	1835 1
+996	1847 1
+996	1848 1
+996	1888 1
+996	1919 1
+996	1956 1
+996	1964 1
+996	1977 1
+996	1982 1
+996	1992 1
+996	1997 1
+996	2014 1
+996	2062 1
+996	2066 1
+996	2071 1
+996	2091 1
+996	2095 1
+996	2102 1
+996	2116 1
+996	2120 1
+996	2128 1
+996	2135 1
+996	2145 1
+996	2174 1
+996	2182 1
+996	2209 1
+996	2210 1
+996	2225 1
+996	2231 1
+996	2240 1
+996	2241 1
+996	2246 1
+996	2251 1
+996	2253 1
+996	2273 1
+996	2281 1
+996	2323 1
+996	2324 1
+996	2329 1
+996	2332 1
+996	2333 1
+996	2339 1
+996	2345 1
+996	2348 1
+996	2354 1
+996	2356 1
+996	2371 1
+996	2375 1
+996	2385 1
+996	2397 1
+996	2398 1
+996	2400 1
+996	2411 1
+996	2435 1
+996	2470 1
+996	2479 1
+996	2510 1
+996	2516 1
+996	2517 1
+996	2542 1
+996	2550 1
+996	2570 1
+996	2576 1
+996	2579 1
+996	2580 1
+996	2587 1
+996	2591 1
+996	2593 1
+996	2620 1
+996	2625 1
+996	2651 1
+996	2653 1
+996	2654 1
+996	2657 1
+996	2665 1
+996	2669 1
+996	2685 1
+996	2693 1
+996	2707 1
+996	2708 1
+996	2713 1
+996	2754 1
+996	2763 1
+996	2764 1
+996	2768 1
+996	2774 1
+996	2775 1
+996	2785 1
+996	2787 1
+996	2794 1
+996	2801 1
+996	2805 1
+996	2809 1
+996	2815 1
+996	2819 1
+996	2828 1
+996	2834 1
+996	2856 1
+996	2923 1
+996	2951 1
+996	2963 1
+996	2968 1
+996	3027 1
+996	3029 1
+996	3089 1
+996	3103 1
+996	3106 1
+996	3117 1
+996	3140 1
+996	3148 1
+996	3192 1
+996	3238 1
+996	3253 1
+996	3274 1
+996	3309 1
+996	3393 1
+996	3408 1
+996	3456 1
+996	3479 1
+996	3489 1
+996	3537 1
+996	3554 1
+996	3557 1
+996	3562 1
+996	3796 1
+996	3806 1
+996	3813 1
+996	3897 1
+996	3958 1
+996	4055 1
+996	4098 1
+996	4179 1
+996	4234 1
+996	4266 1
+996	4289 1
+996	4315 1
+996	4323 1
+996	4335 1
+996	4384 1
+996	4400 1
+996	4424 1
+996	4448 1
+996	4510 1
+996	4530 1
+996	4574 1
+996	4600 1
+996	4661 1
+996	4666 1
+996	4712 1
+996	4735 1
+996	4797 1
+996	4820 1
+996	4875 1
+996	4929 1
+996	4964 1
+996	5022 1
+996	5079 1
+996	5162 1
+996	5233 1
+996	5254 1
+996	5263 1
+996	5288 1
+996	5335 1
+996	5392 1
+996	5412 1
+996	5423 1
+996	5449 1
+996	5452 1
+996	5454 1
+996	5463 1
+996	5484 1
+996	5506 1
+996	5509 1
+996	5568 1
+996	5637 1
+996	5650 1
+996	5651 1
+996	5683 1
+996	5784 1
+996	5790 1
+996	5828 1
+996	5863 1
+996	5994 1
+996	6246 1
+996	6262 1
+996	6306 1
+996	6400 1
+996	6432 1
+996	6437 1
+996	6441 1
+996	6498 1
+996	6566 1
+996	6599 1
+996	6714 1
+996	6780 1
+996	7047 1
+996	7092 1
+996	7094 1
+996	7108 1
+996	7373 1
+996	7620 1
+996	8290 1
+996	8291 1
+996	8292 1
+996	8293 1
+998	243 1
+998	372 1
+998	579 1
+998	663 1
+998	686 1
+998	696 1
+998	697 1
+998	789 1
+998	913 1
+998	956 1
+998	971 1
+998	1014 1
+998	1053 1
+998	1123 1
+998	1152 1
+998	1186 1
+998	1248 1
+998	1322 1
+998	1442 1
+998	1476 1
+998	1489 1
+998	1597 1
+998	1603 1
+998	1652 1
+998	1654 1
+998	1661 1
+998	1662 1
+998	1717 1
+998	1956 1
+998	2381 1
+1005	789 1
+1005	813 1
+1005	1234 1
+1005	1497 1
+1005	1573 1
+999	432 1
+999	789 1
+999	959 1
+999	1014 1
+1000	290 1
+1000	317 1
+1000	403 1
+1000	765 1
+1000	789 1
+1000	896 1
+1000	960 1
+1000	968 1
+1000	1014 1
+1000	1018 1
+1000	1103 1
+1000	1154 1
+1000	1253 1
+1000	1428 1
+1000	1501 1
+1000	1525 1
+1000	1600 1
+1000	1734 1
+1000	1754 1
+1000	1781 1
+1000	1835 1
+1000	1918 1
+1000	2120 1
+1000	2240 1
+1000	2264 1
+1000	2328 1
+1000	2332 1
+1000	2410 1
+1000	2470 1
+1000	2499 1
+1000	2517 1
+1000	2550 1
+1000	2570 1
+1000	2571 1
+1000	2575 1
+1000	2579 1
+1000	2593 1
+1000	2830 1
+1000	2834 1
+1000	2877 1
+1000	3015 1
+1000	3089 1
+1000	3140 1
+1000	3150 1
+1000	3191 1
+1000	3334 1
+1000	3586 1
+1000	4527 1
+1000	5176 1
+1000	5527 1
+1000	5624 1
+1000	5798 1
+1000	5936 1
+1000	5963 1
+1000	5973 1
+1000	6027 1
+1000	6029 1
+1000	6148 1
+1000	6946 1
+1000	7436 1
+1006	35 1
+1006	171 1
+1006	214 1
+1006	227 1
+1006	230 1
+1006	259 1
+1006	298 1
+1006	314 1
+1006	338 1
+1006	432 1
+1006	579 1
+1006	686 1
+1006	696 1
+1006	762 1
+1006	789 1
+1006	803 1
+1006	805 1
+1006	813 1
+1006	836 1
+1006	857 1
+1006	861 1
+1006	871 1
+1006	904 1
+1006	935 1
+1006	937 1
+1006	941 1
+1006	948 1
+1006	956 1
+1006	960 1
+1006	963 1
+1006	975 1
+1006	982 1
+1006	994 1
+1006	1007 1
+1006	1014 1
+1006	1023 1
+1006	1026 1
+1006	1029 1
+1006	1030 1
+1006	1032 1
+1006	1034 1
+1006	1039 1
+1006	1043 1
+1006	1075 1
+1006	1080 1
+1006	1141 1
+1006	1144 1
+1006	1156 1
+1006	1167 1
+1006	1200 1
+1006	1203 1
+1006	1220 1
+1006	1221 1
+1006	1222 1
+1006	1234 1
+1006	1248 1
+1006	1286 1
+1006	1297 1
+1006	1326 1
+1006	1330 1
+1006	1375 1
+1006	1389 1
+1006	1394 1
+1006	1396 1
+1006	1402 1
+1006	1412 1
+1006	1413 1
+1006	1418 1
+1006	1432 1
+1006	1441 1
+1006	1444 1
+1006	1453 1
+1006	1465 1
+1006	1468 1
+1006	1487 1
+1006	1496 1
+1006	1506 1
+1006	1514 1
+1006	1518 1
+1006	1524 1
+1006	1534 1
+1006	1538 1
+1006	1547 1
+1006	1555 1
+1006	1556 1
+1006	1573 1
+1006	1583 1
+1006	1585 1
+1006	1587 1
+1006	1593 1
+1006	1595 1
+1006	1597 1
+1006	1600 1
+1006	1603 1
+1006	1610 1
+1006	1613 1
+1006	1718 1
+1006	1747 1
+1006	1774 1
+1006	1783 1
+1006	1787 1
+1006	1788 1
+1006	1793 1
+1006	1798 1
+1006	1836 1
+1006	1848 1
+1006	1857 1
+1006	1893 1
+1006	1920 1
+1006	1950 1
+1006	1953 1
+1006	1983 1
+1006	1984 1
+1006	1985 1
+1006	2066 1
+1006	2073 1
+1006	2085 1
+1006	2097 1
+1006	2128 1
+1006	2178 1
+1006	2181 1
+1006	2202 1
+1006	2231 1
+1006	2324 1
+1006	2341 1
+1006	2435 1
+1006	2579 1
+1006	2580 1
+1006	2651 1
+1006	2763 1
+1006	2912 1
+1006	3034 1
+1006	3136 1
+1006	3568 1
+1006	4037 1
+1006	4422 1
+1006	4510 1
+1006	4983 1
+1001	789 1
+1002	789 1
+1003	290 1
+1003	663 1
+1003	789 1
+1003	857 1
+1003	946 1
+1003	1230 1
+1003	1319 1
+1003	1374 1
+1003	1880 1
+1003	1956 1
+1003	1966 1
+1003	2504 1
+1003	2851 1
+1003	4071 1
+1003	5543 1
+1003	7073 1
+1003	7115 1
+1003	7699 1
+1004	789 1
+1004	4335 1
+1004	4846 1
+1004	5178 1
+1004	5305 1
+1004	5543 1
+1004	5545 1
+1004	6302 1
+1004	6306 1
+1004	6334 1
+1004	6414 1
+1004	6441 1
+1008	304 1
+1008	1026 1
+1008	4037 1
+1008	4875 1
+1008	5254 1
+1008	5714 1
+1008	6682 1
+1008	6714 1
+1011	447 1
+1011	1031 1
+1011	2193 1
+1011	2210 1
+1011	3321 1
+1011	4365 1
+1012	447 1
+1012	1218 1
+1012	2247 1
+1012	2571 1
+1012	2991 1
+1012	3301 1
+1012	4373 1
+1013	243 1
+1013	259 1
+1013	271 1
+1013	626 1
+1013	644 1
+1013	762 1
+1013	769 1
+1013	857 1
+1013	930 1
+1013	937 1
+1013	985 1
+1013	1014 1
+1013	1044 1
+1013	1053 1
+1013	1080 1
+1013	1140 1
+1013	1144 1
+1013	1154 1
+1013	1186 1
+1013	1260 1
+1013	1382 1
+1013	1396 1
+1013	3164 1
+1016	565 1
+1017	565 1
+1018	565 1
+1018	2237 1
+1018	4335 1
+1018	4728 1
+1018	5623 1
+1019	565 1
+1009	271 1
+1009	299 1
+1009	311 1
+1009	314 1
+1009	332 1
+1009	334 1
+1009	707 1
+1009	948 1
+1009	994 1
+1009	1023 1
+1009	1026 1
+1009	1043 1
+1009	1125 1
+1009	1164 1
+1009	1165 1
+1009	1203 1
+1009	1402 1
+1009	1412 1
+1009	1425 1
+1009	1439 1
+1009	1442 1
+1009	1464 1
+1009	1486 1
+1009	1514 1
+1009	1811 1
+1009	1858 1
+1009	1893 1
+1009	1920 1
+1009	1927 1
+1009	1963 1
+1009	1966 1
+1009	2202 1
+1009	2328 1
+1009	2597 1
+1009	2674 1
+1009	3148 1
+1009	3529 1
+1009	4263 1
+1009	6029 1
+1009	6251 1
+1009	6417 1
+1009	6665 1
+1009	7225 1
+1009	7400 1
+1021	1026 1
+1022	35 1
+1022	243 1
+1022	545 1
+1022	663 1
+1022	978 1
+1022	1026 1
+1022	1053 1
+1022	1055 1
+1022	1123 1
+1022	1131 1
+1022	1156 1
+1022	1167 1
+1022	1377 1
+1022	1484 1
+1023	311 1
+1023	332 1
+1023	722 1
+1023	742 1
+1023	1026 1
+1023	1167 1
+1023	1201 1
+1023	1492 1
+1023	1700 1
+1024	290 1
+1024	425 1
+1024	626 1
+1024	697 1
+1024	825 1
+1024	1026 1
+1024	1279 1
+1024	1291 1
+1024	1305 1
+1024	1307 1
+1024	1549 1
+1024	1592 1
+1024	1637 1
+1024	1641 1
+1024	2264 1
+1024	2384 1
+1024	2506 1
+1024	2625 1
+1024	2657 1
+1024	2696 1
+1024	2785 1
+1024	2805 1
+1024	2828 1
+1024	2830 1
+1024	2977 1
+1024	3009 1
+1024	3029 1
+1024	3033 1
+1024	3034 1
+1024	3125 1
+1024	3145 1
+1024	3150 1
+1024	3164 1
+1024	3408 1
+1024	3433 1
+1024	3748 1
+1024	4162 1
+1024	4510 1
+1024	4706 1
+1024	4735 1
+1024	5055 1
+1025	1026 1
+1027	311 1
+1027	321 1
+1027	697 1
+1027	1023 1
+1027	1039 1
+1027	5631 1
+1028	271 1
+1028	626 1
+1028	697 1
+1028	1030 1
+1028	1053 1
+1028	1123 1
+1028	1186 1
+1029	35 1
+1029	171 1
+1029	227 1
+1029	243 1
+1029	271 1
+1029	299 1
+1029	311 1
+1029	314 1
+1029	321 1
+1029	432 1
+1029	579 1
+1029	626 1
+1029	686 1
+1029	691 1
+1029	697 1
+1029	705 1
+1029	707 1
+1029	742 1
+1029	761 1
+1029	762 1
+1029	769 1
+1029	771 1
+1029	784 1
+1029	803 1
+1029	805 1
+1029	810 1
+1029	813 1
+1029	853 1
+1029	871 1
+1029	913 1
+1029	941 1
+1029	956 1
+1029	960 1
+1029	963 1
+1029	971 1
+1029	978 1
+1029	982 1
+1029	999 1
+1029	1000 1
+1029	1006 1
+1029	1030 1
+1029	1032 1
+1029	1038 1
+1029	1039 1
+1029	1044 1
+1029	1053 1
+1029	1055 1
+1029	1061 1
+1029	1062 1
+1029	1075 1
+1029	1080 1
+1029	1092 1
+1029	1103 1
+1029	1114 1
+1029	1123 1
+1029	1128 1
+1029	1131 1
+1029	1144 1
+1029	1154 1
+1029	1160 1
+1029	1186 1
+1029	1190 1
+1029	1193 1
+1029	1196 1
+1029	1201 1
+1029	1211 1
+1029	1218 1
+1029	1220 1
+1029	1222 1
+1029	1261 1
+1029	1279 1
+1029	1297 1
+1029	1319 1
+1029	1321 1
+1029	1330 1
+1029	1372 1
+1029	1375 1
+1029	1377 1
+1029	1382 1
+1029	1394 1
+1029	1396 1
+1029	1402 1
+1029	1413 1
+1029	1418 1
+1029	1420 1
+1029	1428 1
+1029	1439 1
+1029	1441 1
+1029	1446 1
+1029	1453 1
+1029	1464 1
+1029	1468 1
+1029	1471 1
+1029	1476 1
+1029	1484 1
+1029	1485 1
+1029	1486 1
+1029	1487 1
+1029	1490 1
+1029	1496 1
+1029	1497 1
+1029	1506 1
+1029	1507 1
+1029	1513 1
+1029	1520 1
+1029	1524 1
+1029	1531 1
+1029	1533 1
+1029	1537 1
+1029	1538 1
+1029	1555 1
+1029	1556 1
+1029	1557 1
+1029	1573 1
+1029	1580 1
+1029	1587 1
+1029	1654 1
+1029	1661 1
+1029	1662 1
+1029	1679 1
+1029	1758 1
+1029	1768 1
+1029	1774 1
+1029	1780 1
+1029	1783 1
+1029	1787 1
+1029	1788 1
+1029	1791 1
+1029	1798 1
+1029	1802 1
+1029	1811 1
+1029	2625 1
+1029	2843 1
+1029	3755 1
+1029	8289 1
+1031	311 1
+1031	1012 1
+1031	1154 1
+1031	1186 1
+1031	1297 1
+1031	1492 1
+1031	1549 1
+1031	1621 1
+1031	1835 1
+1031	1842 1
+1031	1888 1
+1031	2339 1
+1031	2490 1
+1031	2550 1
+1031	2585 1
+1031	2619 1
+1031	3104 1
+1031	3351 1
+1031	3650 1
+1032	311 1
+1032	647 1
+1032	663 1
+1032	857 1
+1032	978 1
+1032	993 1
+1032	1039 1
+1032	1243 1
+1032	1267 1
+1032	1357 1
+1032	1413 1
+1032	1482 1
+1032	1506 1
+1032	1520 1
+1032	1556 1
+1032	1603 1
+1032	1622 1
+1032	1658 1
+1032	1680 1
+1032	1997 1
+1032	2128 1
+1032	2328 1
+1032	2909 1
+1032	2912 1
+1032	3024 1
+1032	3089 1
+1032	3136 1
+1032	3253 1
+1032	3352 1
+1032	3587 1
+1032	3720 1
+1032	3787 1
+1032	4037 1
+1032	4191 1
+1032	4712 1
+1032	5222 1
+1032	5683 1
+1032	6774 1
+1032	6833 1
+1033	271 1
+1033	311 1
+1033	626 1
+1033	956 1
+1033	1053 1
+1033	1123 1
+1034	15 1
+1034	271 1
+1034	311 1
+1034	321 1
+1034	372 1
+1034	417 1
+1034	579 1
+1034	857 1
+1034	907 1
+1034	974 1
+1034	1043 1
+1034	1062 1
+1034	1141 1
+1034	1164 1
+1034	1186 1
+1034	1201 1
+1034	1218 1
+1034	1253 1
+1034	1297 1
+1034	1319 1
+1034	1322 1
+1034	1482 1
+1034	1484 1
+1034	1585 1
+1034	1595 1
+1034	1603 1
+1034	1718 1
+1034	2508 1
+1034	2612 1
+1034	2775 1
+1034	3005 1
+1034	3680 1
+1034	4828 1
+1035	742 1
+1035	947 1
+1035	1190 1
+1035	1547 1
+1035	2062 1
+1035	2341 1
+1035	2350 1
+1035	2499 1
+1035	2547 1
+1035	2697 1
+1035	2963 1
+1035	5817 1
+1039	407 1
+1039	989 1
+1039	1482 1
+1039	1585 1
+1039	2157 1
+1039	2685 1
+1037	15 1
+1037	204 1
+1037	230 1
+1037	415 1
+1037	417 1
+1037	686 1
+1037	722 1
+1037	761 1
+1037	859 1
+1037	908 1
+1037	946 1
+1037	947 1
+1037	960 1
+1037	1026 1
+1037	1039 1
+1037	1144 1
+1037	1167 1
+1037	1297 1
+1037	1353 1
+1037	1374 1
+1037	1378 1
+1037	1437 1
+1037	1514 1
+1037	1520 1
+1037	1549 1
+1037	1571 1
+1037	1585 1
+1037	1592 1
+1037	1613 1
+1037	1622 1
+1037	1633 1
+1037	1648 1
+1037	1734 1
+1037	1744 1
+1037	1758 1
+1037	1783 1
+1037	1918 1
+1037	1966 1
+1037	1982 1
+1037	2066 1
+1037	2137 1
+1037	2160 1
+1037	2165 1
+1037	2210 1
+1037	2225 1
+1037	2323 1
+1037	2338 1
+1037	2339 1
+1037	2398 1
+1037	2411 1
+1037	2506 1
+1037	2535 1
+1037	2625 1
+1037	2654 1
+1037	2665 1
+1037	2877 1
+1037	2966 1
+1037	3014 1
+1037	3030 1
+1037	3130 1
+1037	3253 1
+1037	3334 1
+1037	3459 1
+1037	3516 1
+1037	3724 1
+1037	3843 1
+1037	4037 1
+1037	4266 1
+1037	4335 1
+1037	4510 1
+1037	4875 1
+1037	5022 1
+1037	5079 1
+1037	5484 1
+1037	5671 1
+1037	5902 1
+1037	5963 1
+1037	6299 1
+1037	6634 1
+1037	6720 1
+1037	6833 1
+1037	6855 1
+1037	7225 1
+1037	7620 1
+1037	7632 1
+1037	8290 1
+1038	271 1
+1038	545 1
+1038	707 1
+1038	710 1
+1038	1039 1
+1038	1618 1
+1040	1038 1
+1041	15 1
+1041	896 1
+1041	913 1
+1041	1026 1
+1041	1038 1
+1041	1199 1
+1041	1319 1
+1041	1514 1
+1041	1585 1
+1041	1758 1
+1041	2276 1
+1041	2277 1
+1041	2510 1
+1041	2516 1
+1041	2535 1
+1041	2747 1
+1041	2790 1
+1041	3417 1
+1041	3586 1
+1041	3956 1
+1041	4103 1
+1041	4127 1
+1041	4453 1
+1041	4468 1
+1041	4587 1
+1041	4796 1
+1041	4828 1
+1041	4875 1
+1041	5022 1
+1041	5262 1
+1041	5285 1
+1041	5308 1
+1041	5309 1
+1041	5326 1
+1041	5404 1
+1041	5638 1
+1041	5693 1
+1041	5697 1
+1041	5743 1
+1041	5790 1
+1041	5928 1
+1041	6124 1
+1041	6262 1
+1041	6270 1
+1041	6311 1
+1041	6715 1
+1041	6934 1
+1041	6979 1
+1041	7052 1
+1042	332 1
+1042	769 1
+1042	856 1
+1042	1043 1
+1042	1100 1
+1042	1137 1
+1042	1267 1
+1042	1297 1
+1042	1384 1
+1042	1396 1
+1042	1407 1
+1042	1592 1
+1042	1744 1
+1042	1835 1
+1042	1842 1
+1042	1992 1
+1042	2073 1
+1042	2109 1
+1042	2231 1
+1042	2256 1
+1042	2470 1
+1042	2504 1
+1042	2643 1
+1042	2665 1
+1042	2669 1
+1042	2763 1
+1042	2785 1
+1042	2801 1
+1042	2877 1
+1042	2880 1
+1042	2951 1
+1042	2963 1
+1042	4412 1
+1042	4653 1
+1042	5155 1
+1042	5254 1
+1042	5799 1
+1042	6560 1
+1042	6595 1
+1042	6686 1
+1042	7073 1
+1043	350 1
+1043	372 1
+1043	762 1
+1043	763 1
+1043	769 1
+1043	1186 1
+1043	1396 1
+1043	1465 1
+1043	1658 1
+1043	1717 1
+1043	1734 1
+1043	1835 1
+1043	2660 1
+1043	2787 1
+1043	3338 1
+1043	3351 1
+1043	4424 1
+1043	4953 1
+1043	7073 1
+1043	7115 1
+1043	8290 1
+1044	769 1
+1044	941 1
+1044	1049 1
+1044	1218 1
+1044	1465 1
+1044	2114 1
+1044	2686 1
+1044	3926 1
+1044	5055 1
+1045	769 1
+1046	407 1
+1046	432 1
+1046	647 1
+1046	663 1
+1046	710 1
+1046	769 1
+1046	810 1
+1046	971 1
+1046	978 1
+1046	1156 1
+1046	1167 1
+1046	1193 1
+1046	1222 1
+1046	1234 1
+1046	1319 1
+1046	1321 1
+1046	1326 1
+1046	1394 1
+1046	1425 1
+1046	1428 1
+1046	1476 1
+1046	1486 1
+1046	1537 1
+1046	1580 1
+1047	769 1
+1048	769 1
+1048	3479 1
+1049	769 1
+1049	1044 1
+1049	1465 1
+1050	35 1
+1050	372 1
+1050	575 1
+1050	697 1
+1050	956 1
+1050	960 1
+1050	975 1
+1050	1022 1
+1050	1053 1
+1050	1123 1
+1050	1154 1
+1050	1193 1
+1050	1199 1
+1050	1203 1
+1050	1284 1
+1050	1357 1
+1050	1378 1
+1050	1407 1
+1050	1441 1
+1050	1549 1
+1050	1714 1
+1050	1726 1
+1050	1758 1
+1050	1793 1
+1050	1802 1
+1050	1855 1
+1050	1920 1
+1050	1927 1
+1050	1963 1
+1050	1966 1
+1050	2053 1
+1050	2101 1
+1050	2210 1
+1050	2211 1
+1050	2253 1
+1050	2264 1
+1050	2398 1
+1050	2565 1
+1050	2617 1
+1050	2651 1
+1050	2708 1
+1050	2777 1
+1050	3251 1
+1050	8290 1
+1052	321 1
+1052	1053 1
+1052	1123 1
+1052	1781 1
+1051	15 1
+1051	290 1
+1051	644 1
+1051	762 1
+1051	938 1
+1051	968 1
+1051	1053 1
+1051	1123 1
+1051	1164 1
+1051	1186 1
+1051	1384 1
+1051	1385 1
+1051	1416 1
+1051	1420 1
+1051	1592 1
+1051	1629 1
+1051	1633 1
+1051	1662 1
+1051	1680 1
+1051	2109 1
+1051	2135 1
+1051	2285 1
+1051	2398 1
+1051	2470 1
+1051	2485 1
+1051	2579 1
+1051	2660 1
+1051	2851 1
+1051	2963 1
+1051	3180 1
+1051	3439 1
+1051	3480 1
+1051	4175 1
+1051	4179 1
+1051	4453 1
+1051	4827 1
+1051	4953 1
+1051	5022 1
+1051	5335 1
+1051	6496 1
+1051	6498 1
+1051	6955 1
+1051	7778 1
+1051	7890 1
+1051	8174 1
+1051	8192 1
+1055	15 1
+1055	56 1
+1055	204 1
+1055	214 1
+1055	227 1
+1055	259 1
+1055	290 1
+1055	298 1
+1055	321 1
+1055	417 1
+1055	432 1
+1055	579 1
+1055	691 1
+1055	697 1
+1055	737 1
+1055	761 1
+1055	762 1
+1055	771 1
+1055	826 1
+1055	871 1
+1055	896 1
+1055	908 1
+1055	913 1
+1055	928 1
+1055	948 1
+1055	959 1
+1055	960 1
+1055	978 1
+1055	993 1
+1055	1034 1
+1055	1075 1
+1055	1092 1
+1055	1157 1
+1055	1193 1
+1055	1201 1
+1055	1211 1
+1055	1236 1
+1055	1247 1
+1055	1248 1
+1055	1261 1
+1055	1279 1
+1055	1297 1
+1055	1322 1
+1055	1360 1
+1055	1375 1
+1055	1382 1
+1055	1411 1
+1055	1428 1
+1055	1437 1
+1055	1439 1
+1055	1468 1
+1055	1471 1
+1055	1476 1
+1055	1478 1
+1055	1482 1
+1055	1484 1
+1055	1489 1
+1055	1493 1
+1055	1496 1
+1055	1514 1
+1055	1531 1
+1055	1538 1
+1055	1549 1
+1055	1555 1
+1055	1564 1
+1055	1569 1
+1055	1573 1
+1055	1585 1
+1055	1587 1
+1055	1593 1
+1055	1597 1
+1055	1622 1
+1055	1633 1
+1055	1638 1
+1055	1648 1
+1055	1649 1
+1055	1652 1
+1055	1654 1
+1055	1661 1
+1055	1662 1
+1055	1679 1
+1055	1687 1
+1055	1700 1
+1055	1744 1
+1055	1752 1
+1055	1758 1
+1055	1768 1
+1055	1774 1
+1055	1811 1
+1055	1823 1
+1055	1849 1
+1055	1857 1
+1055	1864 1
+1055	1918 1
+1055	1935 1
+1055	1956 1
+1055	1982 1
+1055	1990 1
+1055	2106 1
+1055	2144 1
+1055	2151 1
+1055	2157 1
+1055	2285 1
+1055	2323 1
+1055	2328 1
+1055	2339 1
+1055	2341 1
+1055	2398 1
+1055	2411 1
+1055	2416 1
+1055	2504 1
+1055	2535 1
+1055	2565 1
+1055	2576 1
+1055	2580 1
+1055	2620 1
+1055	2625 1
+1055	2654 1
+1055	2747 1
+1055	2774 1
+1055	2775 1
+1055	2790 1
+1055	2877 1
+1055	2900 1
+1055	2902 1
+1055	2923 1
+1055	2963 1
+1055	3005 1
+1055	3014 1
+1055	3084 1
+1055	3089 1
+1055	3103 1
+1055	3117 1
+1055	3136 1
+1055	3140 1
+1055	3192 1
+1055	3276 1
+1055	3291 1
+1055	3483 1
+1055	3516 1
+1055	3520 1
+1055	3541 1
+1055	3554 1
+1055	3580 1
+1055	3755 1
+1055	3976 1
+1055	4037 1
+1055	4058 1
+1055	4099 1
+1055	4175 1
+1055	4191 1
+1055	4290 1
+1055	4530 1
+1055	4536 1
+1055	4735 1
+1055	4797 1
+1055	4811 1
+1055	4820 1
+1055	4875 1
+1055	5002 1
+1055	5022 1
+1055	5123 1
+1055	5148 1
+1055	5254 1
+1055	5288 1
+1055	5412 1
+1055	5683 1
+1055	5714 1
+1055	5780 1
+1055	5790 1
+1055	5863 1
+1055	5902 1
+1055	5963 1
+1055	5994 1
+1055	6004 1
+1055	6306 1
+1055	6328 1
+1055	6347 1
+1055	6523 1
+1055	6566 1
+1055	6599 1
+1055	6665 1
+1055	6720 1
+1055	6739 1
+1055	6979 1
+1055	7047 1
+1055	7478 1
+1055	7497 1
+1055	7544 1
+1055	7553 1
+1055	7683 1
+1055	7699 1
+1055	7707 1
+1055	7726 1
+1055	7910 1
+1055	8294 1
+1058	784 1
+1059	784 1
+1059	2470 1
+1060	784 1
+1061	937 1
+1061	1390 1
+1062	35 1
+1062	227 1
+1062	271 1
+1062	321 1
+1062	403 1
+1062	432 1
+1062	644 1
+1062	647 1
+1062	663 1
+1062	705 1
+1062	707 1
+1062	710 1
+1062	722 1
+1062	763 1
+1062	764 1
+1062	765 1
+1062	803 1
+1062	836 1
+1062	853 1
+1062	922 1
+1062	935 1
+1062	941 1
+1062	943 1
+1062	946 1
+1062	947 1
+1062	959 1
+1062	975 1
+1062	982 1
+1062	993 1
+1062	994 1
+1062	999 1
+1062	1035 1
+1062	1125 1
+1062	1152 1
+1062	1164 1
+1062	1185 1
+1062	1190 1
+1062	1193 1
+1062	1201 1
+1062	1203 1
+1062	1221 1
+1062	1230 1
+1062	1243 1
+1062	1250 1
+1062	1259 1
+1062	1266 1
+1062	1267 1
+1062	1282 1
+1062	1286 1
+1062	1291 1
+1062	1296 1
+1062	1330 1
+1062	1357 1
+1062	1374 1
+1062	1416 1
+1062	1418 1
+1062	1419 1
+1062	1425 1
+1062	1444 1
+1062	1492 1
+1062	1521 1
+1062	1534 1
+1062	1566 1
+1062	1583 1
+1062	1621 1
+1062	1633 1
+1062	1658 1
+1062	1688 1
+1062	1700 1
+1062	1705 1
+1062	1706 1
+1062	1714 1
+1062	1723 1
+1062	1734 1
+1062	1754 1
+1062	1772 1
+1062	1808 1
+1062	1814 1
+1062	1816 1
+1062	1835 1
+1062	1836 1
+1062	1848 1
+1062	1858 1
+1062	1888 1
+1062	1893 1
+1062	1901 1
+1062	1964 1
+1062	1985 1
+1062	1992 1
+1062	2071 1
+1062	2085 1
+1062	2117 1
+1062	2120 1
+1062	2128 1
+1062	2134 1
+1062	2144 1
+1062	2174 1
+1062	2178 1
+1062	2225 1
+1062	2240 1
+1062	2241 1
+1062	2251 1
+1062	2256 1
+1062	2322 1
+1062	2328 1
+1062	2329 1
+1062	2333 1
+1062	2341 1
+1062	2400 1
+1062	2411 1
+1062	2435 1
+1062	2474 1
+1062	2475 1
+1062	2485 1
+1062	2510 1
+1062	2579 1
+1062	2587 1
+1062	2593 1
+1062	2594 1
+1062	2653 1
+1062	2657 1
+1062	2685 1
+1062	2697 1
+1062	2707 1
+1062	2727 1
+1062	2746 1
+1062	2828 1
+1062	2830 1
+1062	2834 1
+1062	2932 1
+1062	2968 1
+1062	3005 1
+1062	3021 1
+1062	3024 1
+1062	3026 1
+1062	3029 1
+1062	3030 1
+1062	3033 1
+1062	3059 1
+1062	3117 1
+1062	3192 1
+1062	3307 1
+1062	3351 1
+1062	3352 1
+1062	3394 1
+1062	3404 1
+1062	3529 1
+1062	3645 1
+1062	3812 1
+1062	3956 1
+1062	4011 1
+1062	4256 1
+1062	4263 1
+1062	4269 1
+1062	4531 1
+1062	8291 1
+1063	35 1
+1063	243 1
+1063	299 1
+1063	971 1
+1063	1167 1
+1063	1465 1
+1063	1603 1
+1063	1799 1
+1063	1901 1
+1063	2145 1
+1063	2381 1
+1063	2658 1
+1063	3089 1
+1063	3103 1
+1063	3456 1
+1063	3568 1
+1063	3873 1
+1063	4717 1
+1063	5037 1
+1063	5273 1
+1063	5671 1
+1063	5680 1
+1063	5844 1
+1063	6006 1
+1063	6123 1
+1063	6832 1
+1063	7021 1
+1063	7052 1
+1063	7908 1
+1064	15 1
+1064	243 1
+1064	857 1
+1064	1200 1
+1064	1201 1
+1064	1476 1
+1064	1654 1
+1064	1680 1
+1064	2225 1
+1064	2333 1
+1064	3034 1
+1064	3803 1
+1064	3822 1
+1064	4212 1
+1064	6243 1
+1064	6589 1
+1067	243 1
+1067	8290 1
+1065	243 1
+1065	1186 1
+1065	1218 1
+1065	1849 1
+1065	1857 1
+1065	2328 1
+1065	4011 1
+1066	243 1
+1066	271 1
+1066	1044 1
+1066	1131 1
+1066	2339 1
+1070	1044 1
+1071	1044 1
+1072	1044 1
+872	271 1
+872	465 1
+872	686 1
+872	974 1
+872	993 1
+872	1044 1
+872	1164 1
+872	1166 1
+872	1279 1
+872	1413 1
+872	1489 1
+872	1648 1
+872	1653 1
+872	1654 1
+872	1662 1
+872	1672 1
+872	1689 1
+872	1730 1
+872	1780 1
+872	1811 1
+872	1857 1
+872	2073 1
+872	2225 1
+872	2264 1
+872	2770 1
+872	2856 1
+872	3136 1
+872	3587 1
+872	5499 1
+1074	686 1
+1074	994 1
+1074	1222 1
+1074	1321 1
+1074	1352 1
+1074	1823 1
+1074	1972 1
+1074	2160 1
+1074	2273 1
+1074	2285 1
+1074	2433 1
+1074	2440 1
+1074	2914 1
+1074	3291 1
+1074	3634 1
+1074	3792 1
+1074	3830 1
+1074	3842 1
+1074	3919 1
+1074	4065 1
+1074	4099 1
+1074	4412 1
+1074	4507 1
+1074	4709 1
+1074	4712 1
+1074	4713 1
+1074	4717 1
+1074	4791 1
+1074	4994 1
+1074	5002 1
+1074	5037 1
+1074	5140 1
+1074	5188 1
+1074	5254 1
+1074	5524 1
+1074	5563 1
+1074	5584 1
+1074	5596 1
+1074	5626 1
+1074	5714 1
+1074	5739 1
+1074	5799 1
+1074	5818 1
+1074	5824 1
+1074	5827 1
+1074	5829 1
+1074	5871 1
+1074	5950 1
+1074	6004 1
+1074	6156 1
+1074	6170 1
+1074	6221 1
+1074	6299 1
+1074	6327 1
+1074	6347 1
+1074	6409 1
+1074	6424 1
+1074	6441 1
+1074	6474 1
+1074	6481 1
+1074	6491 1
+1074	6496 1
+1074	6498 1
+1074	6501 1
+1074	6505 1
+1074	6528 1
+1074	6529 1
+1074	6554 1
+1074	6560 1
+1074	6570 1
+1074	6592 1
+1074	6595 1
+1074	6599 1
+1074	6600 1
+1074	6613 1
+1074	6632 1
+1074	6663 1
+1074	6665 1
+1074	6670 1
+1074	6699 1
+1074	6700 1
+1074	6725 1
+1074	6739 1
+1074	6755 1
+1074	6769 1
+1074	6770 1
+1074	6788 1
+1074	6850 1
+1074	6860 1
+1074	6869 1
+1074	6873 1
+1074	6890 1
+1074	6892 1
+1074	6897 1
+1074	6930 1
+1075	15 1
+1075	35 1
+1075	227 1
+1075	259 1
+1075	324 1
+1075	407 1
+1075	432 1
+1075	579 1
+1075	665 1
+1075	686 1
+1075	763 1
+1075	825 1
+1075	853 1
+1075	907 1
+1075	971 1
+1075	1018 1
+1075	1080 1
+1075	1111 1
+1075	1127 1
+1075	1140 1
+1075	1157 1
+1075	1165 1
+1075	1203 1
+1075	1330 1
+1075	1353 1
+1075	1372 1
+1075	1375 1
+1075	1418 1
+1075	1420 1
+1075	1425 1
+1075	1473 1
+1075	1476 1
+1075	1525 1
+1075	1537 1
+1075	1548 1
+1075	1622 1
+1075	1717 1
+1075	1802 1
+1075	1842 1
+1075	1858 1
+1075	1893 1
+1075	1927 1
+1075	1953 1
+1075	2137 1
+1075	2237 1
+1075	2354 1
+1075	2398 1
+1075	2470 1
+1075	2593 1
+1075	2595 1
+1075	2653 1
+1075	3018 1
+1075	3034 1
+1075	3192 1
+1075	3243 1
+1075	3321 1
+1075	3352 1
+1075	3650 1
+1075	4055 1
+1075	4110 1
+1075	4179 1
+1075	4276 1
+1075	4448 1
+1075	4666 1
+1075	5254 1
+1075	5341 1
+1075	5423 1
+1075	5452 1
+1075	5484 1
+1075	5511 1
+1075	5624 1
+1075	6229 1
+1075	6388 1
+1075	7131 1
+1084	271 1
+1084	338 1
+1084	626 1
+1084	1080 1
+1084	2210 1
+1078	259 1
+1078	271 1
+1078	626 1
+1078	1075 1
+1078	1193 1
+1079	271 1
+1079	5925 1
+1080	271 1
+1080	959 1
+1080	1836 1
+1080	1842 1
+1080	1855 1
+1081	271 1
+1082	271 1
+1082	1506 1
+1082	1903 1
+1082	2708 1
+1083	271 1
+1083	1783 1
+1085	214 1
+1085	259 1
+1085	626 1
+1085	1842 1
+1086	579 1
+1086	626 1
+1086	665 1
+1086	1151 1
+1086	1152 1
+1086	1464 1
+1086	1991 1
+1086	2097 1
+1089	259 1
+1089	626 1
+1089	873 1
+1089	1000 1
+1089	1152 1
+1089	1717 1
+1089	1842 1
+1089	1855 1
+1087	626 1
+1087	5254 1
+1088	626 1
+1093	1080 1
+1093	1842 1
+1094	1080 1
+1094	1842 1
+1095	959 1
+1095	1080 1
+1095	1103 1
+1095	1542 1
+1095	1833 1
+1095	1836 1
+1095	1842 1
+1095	1855 1
+1095	2504 1
+1095	2697 1
+1096	1080 1
+1097	15 1
+1097	56 1
+1097	204 1
+1097	417 1
+1097	737 1
+1097	762 1
+1097	805 1
+1097	856 1
+1097	941 1
+1097	993 1
+1097	1049 1
+1097	1080 1
+1097	1193 1
+1097	1201 1
+1097	1211 1
+1097	1239 1
+1097	1247 1
+1097	1297 1
+1097	1393 1
+1097	1428 1
+1097	1437 1
+1097	1521 1
+1097	1549 1
+1097	1564 1
+1097	1573 1
+1097	1595 1
+1097	1633 1
+1097	1637 1
+1097	1700 1
+1097	1808 1
+1097	1814 1
+1097	1919 1
+1097	2066 1
+1097	2102 1
+1097	2174 1
+1097	2256 1
+1097	2323 1
+1097	2328 1
+1097	2366 1
+1097	2381 1
+1097	2470 1
+1097	2479 1
+1097	2516 1
+1097	2570 1
+1097	2576 1
+1097	2594 1
+1097	2625 1
+1097	2651 1
+1097	2653 1
+1097	2685 1
+1097	2768 1
+1097	2794 1
+1097	2801 1
+1097	2830 1
+1097	2958 1
+1097	2972 1
+1097	3014 1
+1097	3020 1
+1097	3027 1
+1097	3030 1
+1097	3033 1
+1097	3089 1
+1097	3117 1
+1097	3155 1
+1097	3192 1
+1097	3274 1
+1097	3309 1
+1097	3352 1
+1097	3393 1
+1097	3443 1
+1097	3456 1
+1097	3554 1
+1097	3562 1
+1097	3580 1
+1097	3926 1
+1097	4124 1
+1097	4247 1
+1097	4256 1
+1097	4310 1
+1097	4335 1
+1097	4530 1
+1097	4735 1
+1097	4953 1
+1097	5412 1
+1097	5449 1
+1097	5452 1
+1097	5743 1
+1097	7450 1
+1098	56 1
+1098	285 1
+1098	350 1
+1098	722 1
+1098	764 1
+1098	859 1
+1098	946 1
+1098	947 1
+1098	959 1
+1098	967 1
+1098	993 1
+1098	1018 1
+1098	1026 1
+1098	1049 1
+1098	1080 1
+1098	1103 1
+1098	1166 1
+1098	1186 1
+1098	1291 1
+1098	1315 1
+1098	1357 1
+1098	1378 1
+1098	1407 1
+1098	1419 1
+1098	1492 1
+1098	1514 1
+1098	1521 1
+1098	1542 1
+1098	1549 1
+1098	1565 1
+1098	1583 1
+1098	1608 1
+1098	1613 1
+1098	1633 1
+1098	1646 1
+1098	1653 1
+1098	1700 1
+1098	1714 1
+1098	1730 1
+1098	1734 1
+1098	1754 1
+1098	1772 1
+1098	1781 1
+1098	1783 1
+1098	1808 1
+1098	1814 1
+1098	1833 1
+1098	1835 1
+1098	1836 1
+1098	1837 1
+1098	1847 1
+1098	1848 1
+1098	1855 1
+1098	1859 1
+1098	1888 1
+1098	1893 1
+1098	1919 1
+1098	1956 1
+1098	1963 1
+1098	1964 1
+1098	1969 1
+1098	1973 1
+1098	1982 1
+1098	1991 1
+1098	1992 1
+1098	1997 1
+1098	2016 1
+1098	2062 1
+1098	2066 1
+1098	2071 1
+1098	2072 1
+1098	2079 1
+1098	2095 1
+1098	2102 1
+1098	2106 1
+1098	2109 1
+1098	2114 1
+1098	2117 1
+1098	2120 1
+1098	2128 1
+1098	2174 1
+1098	2178 1
+1098	2181 1
+1098	2193 1
+1098	2225 1
+1098	2240 1
+1098	2241 1
+1098	2251 1
+1098	2256 1
+1098	2264 1
+1098	2294 1
+1098	2297 1
+1098	2322 1
+1098	2332 1
+1098	2338 1
+1098	2341 1
+1098	2375 1
+1098	2385 1
+1098	2400 1
+1098	2410 1
+1098	2435 1
+1098	2474 1
+1098	2504 1
+1098	2542 1
+1098	2560 1
+1098	2565 1
+1098	2570 1
+1098	2576 1
+1098	2579 1
+1098	2585 1
+1098	2589 1
+1098	2593 1
+1098	2594 1
+1098	2620 1
+1098	2625 1
+1098	2650 1
+1098	2651 1
+1098	2654 1
+1098	2658 1
+1098	2669 1
+1098	2672 1
+1098	2685 1
+1098	2697 1
+1098	2707 1
+1098	2721 1
+1098	2781 1
+1098	2785 1
+1098	2794 1
+1098	2805 1
+1098	2814 1
+1098	2828 1
+1098	2851 1
+1098	2940 1
+1098	2963 1
+1098	2968 1
+1098	2973 1
+1098	3005 1
+1098	3018 1
+1098	3029 1
+1098	3030 1
+1098	3033 1
+1098	3034 1
+1098	3084 1
+1098	3117 1
+1098	3130 1
+1098	3150 1
+1098	3238 1
+1098	3253 1
+1098	3265 1
+1098	3297 1
+1098	3310 1
+1098	3346 1
+1098	3351 1
+1098	3408 1
+1098	3435 1
+1098	3459 1
+1098	3473 1
+1098	3489 1
+1098	3529 1
+1098	3537 1
+1098	3580 1
+1098	3726 1
+1098	4037 1
+1098	4401 1
+1098	4483 1
+1098	4632 1
+1098	4666 1
+1098	4764 1
+1098	4940 1
+1098	4981 1
+1098	5002 1
+1098	5020 1
+1098	5079 1
+1098	5246 1
+1098	5289 1
+1098	5321 1
+1098	5415 1
+1098	5432 1
+1098	5466 1
+1098	5582 1
+1098	5614 1
+1098	5697 1
+1098	5738 1
+1098	5760 1
+1098	5772 1
+1098	5773 1
+1098	5776 1
+1098	5800 1
+1098	5806 1
+1098	5807 1
+1098	5811 1
+1098	5812 1
+1098	5814 1
+1098	5819 1
+1098	5822 1
+1098	5829 1
+1098	5897 1
+1098	5932 1
+1098	5998 1
+1098	6004 1
+1098	6032 1
+1098	6043 1
+1098	6097 1
+1098	6123 1
+1098	6151 1
+1098	6170 1
+1098	6241 1
+1098	6270 1
+1098	6296 1
+1098	6299 1
+1098	6305 1
+1098	6306 1
+1098	6323 1
+1098	6327 1
+1098	6330 1
+1098	6334 1
+1098	6424 1
+1098	6555 1
+1098	6560 1
+1098	6568 1
+1098	6624 1
+1098	6665 1
+1098	6712 1
+1098	6714 1
+1098	6736 1
+1098	6739 1
+1098	6765 1
+1098	6783 1
+1098	6784 1
+1098	6789 1
+1098	6790 1
+1098	6806 1
+1098	6855 1
+1098	6860 1
+1098	6913 1
+1098	6914 1
+1098	6917 1
+1098	6934 1
+1098	6938 1
+1098	6946 1
+1098	6953 1
+1098	6955 1
+1098	6967 1
+1098	6976 1
+1098	6979 1
+1098	6980 1
+1098	6982 1
+1098	7012 1
+1098	7021 1
+1098	7047 1
+1098	7050 1
+1098	7052 1
+1098	7059 1
+1098	7060 1
+1098	7063 1
+1098	7092 1
+1098	7094 1
+1098	7108 1
+1098	7110 1
+1098	7120 1
+1098	7131 1
+1098	7186 1
+1098	7201 1
+1098	7233 1
+1098	7262 1
+1098	7277 1
+1098	7323 1
+1098	7351 1
+1098	7378 1
+1098	7381 1
+1098	7386 1
+1098	7391 1
+1098	7397 1
+1098	7414 1
+1098	7478 1
+1098	7553 1
+1098	7574 1
+1098	7587 1
+1098	7618 1
+1098	7620 1
+1098	7634 1
+1098	7646 1
+1098	7647 1
+1098	7651 1
+1098	7662 1
+1098	7666 1
+1098	7675 1
+1098	7701 1
+1098	7707 1
+1098	7726 1
+1098	7763 1
+1098	7810 1
+1098	7819 1
+1098	7833 1
+1098	7839 1
+1098	7874 1
+1098	7879 1
+1098	7924 1
+1098	8002 1
+1098	8050 1
+1098	8141 1
+1098	8168 1
+1098	8246 1
+1098	8290 1
+1098	8291 1
+1103	993 1
+1103	1080 1
+1103	1211 1
+1103	1842 1
+1103	2504 1
+1103	2517 1
+1103	2570 1
+1103	2708 1
+1103	2946 1
+1099	559 1
+1099	1080 1
+1099	1103 1
+1099	1297 1
+1099	1542 1
+1099	1836 1
+1099	1842 1
+1099	1855 1
+1104	1080 1
+1100	1080 1
+1100	2657 1
+1105	1080 1
+1105	1836 1
+1105	2654 1
+1106	15 1
+1106	1080 1
+1101	1080 1
+1107	1080 1
+1108	1080 1
+1109	1080 1
+1110	1080 1
+1111	15 1
+1111	72 1
+1111	259 1
+1111	299 1
+1111	432 1
+1111	722 1
+1111	803 1
+1111	922 1
+1111	959 1
+1111	993 1
+1111	999 1
+1111	1075 1
+1111	1080 1
+1111	1193 1
+1111	1196 1
+1111	1241 1
+1111	1243 1
+1111	1247 1
+1111	1330 1
+1111	1353 1
+1111	1542 1
+1111	1548 1
+1111	1583 1
+1111	1717 1
+1111	1836 1
+1111	1842 1
+1111	1855 1
+1111	1927 1
+1111	1977 1
+1111	1997 1
+1111	2060 1
+1111	2062 1
+1111	2066 1
+1111	2073 1
+1111	2085 1
+1111	2106 1
+1111	2323 1
+1111	2354 1
+1111	2398 1
+1111	2400 1
+1111	2822 1
+1111	2925 1
+1111	3084 1
+1111	3192 1
+1111	3352 1
+1111	3897 1
+1111	4065 1
+1111	4191 1
+1111	4247 1
+1111	4310 1
+1111	4400 1
+1111	5178 1
+1111	5254 1
+1111	5263 1
+1111	5392 1
+1111	5412 1
+1111	5423 1
+1111	5524 1
+1111	5543 1
+1111	5683 1
+1112	1080 1
+1113	1075 1
+1113	1080 1
+1113	1855 1
+1113	2398 1
+1113	3352 1
+1113	3835 1
+1102	1080 1
+1102	1103 1
+1102	1411 1
+1102	1836 1
+1102	1837 1
+1102	1842 1
+1102	1855 1
+1102	1903 1
+1102	2144 1
+1102	2479 1
+1102	2570 1
+1102	2625 1
+1102	2654 1
+1102	3173 1
+1102	3276 1
+1114	171 1
+1114	230 1
+1114	299 1
+1114	334 1
+1114	663 1
+1114	665 1
+1114	705 1
+1114	710 1
+1114	853 1
+1114	922 1
+1114	941 1
+1114	971 1
+1114	978 1
+1114	985 1
+1114	989 1
+1114	1062 1
+1114	1140 1
+1114	1144 1
+1114	1160 1
+1114	1192 1
+1114	1193 1
+1114	1201 1
+1114	1211 1
+1114	1220 1
+1114	1221 1
+1114	1222 1
+1114	1261 1
+1114	1270 1
+1114	1286 1
+1114	1321 1
+1114	1322 1
+1114	1330 1
+1114	1394 1
+1114	1413 1
+1114	1718 1
+1114	1752 1
+1114	1770 1
+1114	1787 1
+1114	2416 1
+1432	1697 1
+1115	1432 1
+1120	1123 1
+1124	350 1
+1124	696 1
+1124	859 1
+1124	993 1
+1124	1031 1
+1124	1492 1
+1124	1564 1
+1124	1772 1
+1124	1888 1
+1124	1992 1
+1124	2062 1
+1124	2117 1
+1124	2128 1
+1124	2151 1
+1124	2168 1
+1124	2195 1
+1124	2205 1
+1124	2579 1
+1124	2625 1
+1124	2685 1
+1125	72 1
+1125	171 1
+1125	214 1
+1125	407 1
+1125	608 1
+1125	663 1
+1125	696 1
+1125	737 1
+1125	805 1
+1125	810 1
+1125	930 1
+1125	960 1
+1125	993 1
+1125	1140 1
+1125	1154 1
+1125	1211 1
+1125	1287 1
+1125	1492 1
+1125	1564 1
+1125	1585 1
+1125	1772 1
+1125	1783 1
+1125	1919 1
+1125	1992 1
+1125	2066 1
+1125	2151 1
+1125	2195 1
+1125	2398 1
+1125	2504 1
+1125	2625 1
+1125	3473 1
+1125	3516 1
+1125	3769 1
+1125	3796 1
+1125	4578 1
+1125	4735 1
+1125	6665 1
+1126	214 1
+1126	696 1
+1128	35 1
+1128	1140 1
+1128	1279 1
+1128	1476 1
+1128	1525 1
+1128	1564 1
+1128	1569 1
+1128	1641 1
+1128	1799 1
+1128	1859 1
+1128	2968 1
+1128	4424 1
+1128	5449 1
+1127	35 1
+1127	465 1
+1127	559 1
+1127	579 1
+1127	665 1
+1127	691 1
+1127	941 1
+1127	1049 1
+1127	1128 1
+1127	1165 1
+1127	1166 1
+1127	1199 1
+1127	1297 1
+1127	1319 1
+1127	1357 1
+1127	1384 1
+1127	1416 1
+1127	1482 1
+1127	1489 1
+1127	1496 1
+1127	1507 1
+1127	1525 1
+1127	1593 1
+1127	1604 1
+1127	1610 1
+1127	1621 1
+1127	1633 1
+1127	1652 1
+1127	1653 1
+1127	1658 1
+1127	1662 1
+1127	1672 1
+1127	1701 1
+1127	1706 1
+1127	1734 1
+1127	1754 1
+1127	1758 1
+1127	1842 1
+1127	2062 1
+1127	2076 1
+1127	2135 1
+1127	2145 1
+1127	2348 1
+1127	2350 1
+1127	2516 1
+1127	2707 1
+1127	2787 1
+1127	2851 1
+1127	2871 1
+1127	2963 1
+1127	3030 1
+1127	3084 1
+1127	3352 1
+1127	3404 1
+1127	3489 1
+1127	4179 1
+1127	4297 1
+1127	4587 1
+1127	4776 1
+1127	5037 1
+1127	5055 1
+1127	5335 1
+1129	171 1
+1129	214 1
+1129	290 1
+1129	415 1
+1129	545 1
+1129	691 1
+1129	761 1
+1129	762 1
+1129	813 1
+1129	887 1
+1129	913 1
+1129	941 1
+1129	959 1
+1129	960 1
+1129	978 1
+1129	993 1
+1129	1022 1
+1129	1029 1
+1129	1031 1
+1129	1074 1
+1129	1131 1
+1129	1156 1
+1129	1167 1
+1129	1211 1
+1129	1234 1
+1129	1241 1
+1129	1248 1
+1129	1261 1
+1129	1286 1
+1129	1297 1
+1129	1321 1
+1129	1377 1
+1129	1407 1
+1129	1420 1
+1129	1428 1
+1129	1478 1
+1129	1489 1
+1129	1497 1
+1129	1514 1
+1129	1537 1
+1129	1538 1
+1129	1556 1
+1129	1557 1
+1129	1563 1
+1129	1569 1
+1129	1573 1
+1129	1580 1
+1129	1585 1
+1129	1618 1
+1129	1622 1
+1129	1689 1
+1129	1774 1
+1129	1861 1
+1129	2151 1
+1129	2157 1
+1129	2160 1
+1129	2397 1
+1129	2576 1
+1129	2790 1
+1129	2877 1
+1129	3140 1
+1129	3755 1
+1130	1131 1
+1132	56 1
+1132	204 1
+1132	259 1
+1132	338 1
+1132	425 1
+1132	665 1
+1132	971 1
+1132	993 1
+1132	1193 1
+1132	1396 1
+1132	1413 1
+1132	1637 1
+1132	1729 1
+1132	1864 1
+1132	1903 1
+1132	2014 1
+1132	2016 1
+1132	2101 1
+1132	2237 1
+1132	2257 1
+1132	2290 1
+1132	2354 1
+1132	2398 1
+1132	2411 1
+1132	2440 1
+1132	2456 1
+1132	2470 1
+1132	2651 1
+1132	2787 1
+1132	2801 1
+1132	2946 1
+1132	3027 1
+1132	3173 1
+1132	3238 1
+1132	3352 1
+1132	3443 1
+1132	3871 1
+1132	3897 1
+1132	4037 1
+1132	4044 1
+1132	4117 1
+1132	4424 1
+1132	4687 1
+1132	5335 1
+1132	5404 1
+1132	5421 1
+1132	5449 1
+1132	5902 1
+1132	6306 1
+1132	6560 1
+1132	6914 1
+1132	6979 1
+1132	7108 1
+1132	7378 1
+1132	7553 1
+1132	7620 1
+1132	7699 1
+1133	15 1
+1133	72 1
+1133	171 1
+1133	230 1
+1133	298 1
+1133	299 1
+1133	346 1
+1133	545 1
+1133	608 1
+1133	633 1
+1133	663 1
+1133	737 1
+1133	761 1
+1133	762 1
+1133	805 1
+1133	825 1
+1133	896 1
+1133	913 1
+1133	922 1
+1133	989 1
+1133	1012 1
+1133	1022 1
+1133	1026 1
+1133	1029 1
+1133	1055 1
+1133	1140 1
+1133	1156 1
+1133	1157 1
+1133	1159 1
+1133	1165 1
+1133	1185 1
+1133	1186 1
+1133	1190 1
+1133	1211 1
+1133	1222 1
+1133	1239 1
+1133	1240 1
+1133	1248 1
+1133	1266 1
+1133	1282 1
+1133	1296 1
+1133	1297 1
+1133	1305 1
+1133	1310 1
+1133	1360 1
+1133	1385 1
+1133	1464 1
+1133	1476 1
+1133	1484 1
+1133	1490 1
+1133	1549 1
+1133	1555 1
+1133	1587 1
+1133	1619 1
+1133	1622 1
+1133	1661 1
+1133	1679 1
+1133	1680 1
+1133	1688 1
+1133	1718 1
+1133	1729 1
+1133	1733 1
+1133	1752 1
+1133	1772 1
+1133	1780 1
+1133	1791 1
+1133	1799 1
+1133	1836 1
+1133	1859 1
+1133	1984 1
+1133	1990 1
+1133	2014 1
+1133	2066 1
+1133	2129 1
+1133	2134 1
+1133	2144 1
+1133	2145 1
+1133	2151 1
+1133	2210 1
+1133	2229 1
+1133	2240 1
+1133	2276 1
+1133	2289 1
+1133	2326 1
+1133	2328 1
+1133	2333 1
+1133	2364 1
+1133	2398 1
+1133	2456 1
+1133	2474 1
+1133	2490 1
+1133	2506 1
+1133	2507 1
+1133	2517 1
+1133	2576 1
+1133	2599 1
+1133	2612 1
+1133	2625 1
+1133	2646 1
+1133	2651 1
+1133	2653 1
+1133	2696 1
+1133	2697 1
+1133	2700 1
+1133	2760 1
+1133	2765 1
+1133	2775 1
+1133	2787 1
+1133	2790 1
+1133	2811 1
+1133	2830 1
+1133	2859 1
+1133	2871 1
+1133	2900 1
+1133	2909 1
+1133	2925 1
+1133	2932 1
+1133	2958 1
+1133	2968 1
+1133	2981 1
+1133	3002 1
+1133	3007 1
+1133	3014 1
+1133	3034 1
+1133	3073 1
+1133	3089 1
+1133	3125 1
+1133	3136 1
+1133	3140 1
+1133	3144 1
+1133	3191 1
+1133	3192 1
+1133	3238 1
+1133	3253 1
+1133	3276 1
+1133	3284 1
+1133	3309 1
+1133	3321 1
+1133	3334 1
+1133	3346 1
+1133	3352 1
+1133	3376 1
+1133	3394 1
+1133	3433 1
+1133	3439 1
+1133	3443 1
+1133	3447 1
+1133	3452 1
+1133	3453 1
+1133	3454 1
+1133	3455 1
+1133	3456 1
+1133	3458 1
+1133	3460 1
+1133	3464 1
+1133	3498 1
+1133	3537 1
+1133	3554 1
+1133	3557 1
+1133	3568 1
+1133	3586 1
+1133	3607 1
+1133	3615 1
+1133	3631 1
+1133	3635 1
+1133	3643 1
+1133	3645 1
+1133	3660 1
+1133	3661 1
+1133	3664 1
+1133	3691 1
+1133	3724 1
+1133	3748 1
+1133	3787 1
+1133	3796 1
+1133	3806 1
+1133	3812 1
+1133	3813 1
+1133	3835 1
+1133	3843 1
+1133	3854 1
+1133	3873 1
+1133	3898 1
+1133	3912 1
+1133	3922 1
+1133	3956 1
+1133	3958 1
+1133	3976 1
+1133	4011 1
+1133	4037 1
+1133	4040 1
+1133	4041 1
+1133	4044 1
+1133	4047 1
+1133	4051 1
+1133	4055 1
+1133	4065 1
+1133	4072 1
+1133	4103 1
+1133	4110 1
+1133	4124 1
+1133	4127 1
+1133	4138 1
+1133	4175 1
+1133	4188 1
+1133	4189 1
+1133	4191 1
+1133	4199 1
+1133	4212 1
+1133	4233 1
+1133	4235 1
+1133	4247 1
+1133	4254 1
+1133	4256 1
+1133	4261 1
+1133	4263 1
+1133	4266 1
+1133	4269 1
+1133	4289 1
+1133	4290 1
+1133	4297 1
+1133	4298 1
+1133	4299 1
+1133	4310 1
+1133	4311 1
+1133	4323 1
+1133	4331 1
+1133	4335 1
+1133	4349 1
+1133	4351 1
+1133	4355 1
+1133	4359 1
+1133	4365 1
+1133	4373 1
+1133	4384 1
+1133	4385 1
+1133	4400 1
+1133	4402 1
+1133	4403 1
+1133	4412 1
+1133	4417 1
+1133	4422 1
+1133	4424 1
+1133	4448 1
+1133	4463 1
+1133	4466 1
+1133	4468 1
+1133	4482 1
+1133	4485 1
+1133	4500 1
+1133	4510 1
+1133	4527 1
+1133	4528 1
+1133	4529 1
+1133	4531 1
+1133	4534 1
+1133	4551 1
+1133	4557 1
+1133	4558 1
+1133	4562 1
+1133	4574 1
+1133	4578 1
+1133	4584 1
+1133	4587 1
+1133	4588 1
+1133	4600 1
+1133	4620 1
+1133	4621 1
+1133	4631 1
+1133	4646 1
+1133	4648 1
+1133	4662 1
+1133	4666 1
+1133	4677 1
+1133	4706 1
+1133	4713 1
+1133	4719 1
+1133	4728 1
+1133	4735 1
+1133	4776 1
+1133	4781 1
+1133	4792 1
+1133	4796 1
+1133	4797 1
+1133	4808 1
+1133	4811 1
+1133	4814 1
+1133	4820 1
+1133	4822 1
+1133	4824 1
+1133	4827 1
+1133	4828 1
+1133	4831 1
+1133	4846 1
+1133	4875 1
+1133	4929 1
+1133	4938 1
+1133	4942 1
+1133	4946 1
+1133	4953 1
+1133	4962 1
+1133	4983 1
+1133	4999 1
+1133	5020 1
+1133	5022 1
+1133	5026 1
+1133	5043 1
+1133	5044 1
+1133	5045 1
+1133	5055 1
+1133	5058 1
+1133	5061 1
+1133	5073 1
+1133	5083 1
+1133	5092 1
+1133	5100 1
+1133	5103 1
+1133	5106 1
+1133	5121 1
+1133	5123 1
+1133	5176 1
+1133	5179 1
+1133	5182 1
+1133	5189 1
+1133	5204 1
+1133	5222 1
+1133	5233 1
+1133	5254 1
+1133	5262 1
+1133	5263 1
+1133	5288 1
+1133	5301 1
+1133	5335 1
+1133	5392 1
+1133	5404 1
+1133	5412 1
+1133	5437 1
+1133	5482 1
+1133	5484 1
+1133	5527 1
+1133	5543 1
+1133	5545 1
+1133	5559 1
+1133	5563 1
+1133	5568 1
+1133	5605 1
+1133	5624 1
+1133	5630 1
+1133	5635 1
+1133	5637 1
+1133	5638 1
+1133	5640 1
+1133	5680 1
+1133	5753 1
+1133	5773 1
+1133	5775 1
+1133	5780 1
+1133	5812 1
+1133	5817 1
+1133	5848 1
+1133	5863 1
+1133	5886 1
+1133	5925 1
+1133	5928 1
+1133	5936 1
+1133	5947 1
+1133	5963 1
+1133	5972 1
+1133	5973 1
+1133	5977 1
+1133	5980 1
+1133	5994 1
+1133	6004 1
+1133	6009 1
+1133	6021 1
+1133	6029 1
+1133	6094 1
+1133	6098 1
+1133	6124 1
+1133	6148 1
+1133	6161 1
+1133	6166 1
+1133	6226 1
+1133	6229 1
+1133	6246 1
+1133	6262 1
+1133	6334 1
+1133	6833 1
+1133	7040 1
+1133	7092 1
+1133	7833 1
+1133	7890 1
+1133	7910 1
+1133	8002 1
+1133	8051 1
+1133	8134 1
+1133	8290 1
+1133	8294 1
+1133	8295 1
+1134	989 1
+1134	1297 1
+1134	3005 1
+1135	171 1
+1135	204 1
+1135	299 1
+1135	332 1
+1135	334 1
+1135	407 1
+1135	545 1
+1135	579 1
+1135	644 1
+1135	647 1
+1135	710 1
+1135	722 1
+1135	765 1
+1135	805 1
+1135	813 1
+1135	836 1
+1135	887 1
+1135	908 1
+1135	922 1
+1135	937 1
+1135	943 1
+1135	960 1
+1135	971 1
+1135	975 1
+1135	978 1
+1135	989 1
+1135	993 1
+1135	999 1
+1135	1014 1
+1135	1049 1
+1135	1097 1
+1135	1140 1
+1135	1152 1
+1135	1164 1
+1135	1199 1
+1135	1201 1
+1135	1203 1
+1135	1211 1
+1135	1234 1
+1135	1253 1
+1135	1267 1
+1135	1279 1
+1135	1284 1
+1135	1286 1
+1135	1322 1
+1135	1330 1
+1135	1357 1
+1135	1378 1
+1135	1413 1
+1135	1416 1
+1135	1418 1
+1135	1428 1
+1135	1439 1
+1135	1464 1
+1135	1468 1
+1135	1476 1
+1135	1490 1
+1135	1492 1
+1135	1496 1
+1135	1501 1
+1135	1534 1
+1135	1555 1
+1135	1580 1
+1135	1585 1
+1135	1646 1
+1135	1664 1
+1135	1700 1
+1135	1717 1
+1135	1752 1
+1135	1758 1
+1135	1774 1
+1135	1781 1
+1135	1792 1
+1135	1808 1
+1135	1814 1
+1135	1836 1
+1135	1847 1
+1135	1858 1
+1135	1918 1
+1135	1963 1
+1135	1965 1
+1135	1966 1
+1135	1977 1
+1135	1997 1
+1135	2073 1
+1135	2076 1
+1135	2102 1
+1135	2128 1
+1135	2135 1
+1135	2225 1
+1135	2240 1
+1135	2246 1
+1135	2256 1
+1135	2276 1
+1135	2322 1
+1135	2323 1
+1135	2410 1
+1135	2435 1
+1135	2475 1
+1135	2504 1
+1135	2547 1
+1135	2587 1
+1135	2593 1
+1135	2617 1
+1135	2625 1
+1135	2685 1
+1135	2724 1
+1135	2794 1
+1135	2814 1
+1135	2922 1
+1135	2955 1
+1135	3034 1
+1135	3056 1
+1135	3130 1
+1135	3253 1
+1137	56 1
+1137	64 1
+1137	72 1
+1137	259 1
+1137	285 1
+1137	298 1
+1137	350 1
+1137	432 1
+1137	579 1
+1137	644 1
+1137	763 1
+1137	813 1
+1137	887 1
+1137	959 1
+1137	963 1
+1137	978 1
+1137	994 1
+1137	1049 1
+1137	1103 1
+1137	1127 1
+1137	1140 1
+1137	1200 1
+1137	1203 1
+1137	1221 1
+1137	1230 1
+1137	1261 1
+1137	1284 1
+1137	1286 1
+1137	1297 1
+1137	1357 1
+1137	1372 1
+1137	1374 1
+1137	1375 1
+1137	1378 1
+1137	1394 1
+1137	1407 1
+1137	1413 1
+1137	1416 1
+1137	1418 1
+1137	1428 1
+1137	1435 1
+1137	1437 1
+1137	1441 1
+1137	1464 1
+1137	1465 1
+1137	1514 1
+1137	1521 1
+1137	1524 1
+1137	1534 1
+1137	1549 1
+1137	1564 1
+1137	1566 1
+1137	1585 1
+1137	1592 1
+1137	1608 1
+1137	1637 1
+1137	1646 1
+1137	1700 1
+1137	1706 1
+1137	1723 1
+1137	1734 1
+1137	1754 1
+1137	1772 1
+1137	1781 1
+1137	1842 1
+1137	1858 1
+1137	1903 1
+1137	1908 1
+1137	1919 1
+1137	1956 1
+1137	1991 1
+1137	2071 1
+1137	2073 1
+1137	2101 1
+1137	2112 1
+1137	2128 1
+1137	2165 1
+1137	2205 1
+1137	2241 1
+1137	2328 1
+1137	2340 1
+1137	2354 1
+1137	2371 1
+1137	2410 1
+1137	2485 1
+1137	2490 1
+1137	2510 1
+1137	2593 1
+1137	2594 1
+1137	2653 1
+1137	2696 1
+1137	2697 1
+1137	2724 1
+1137	2754 1
+1137	2763 1
+1137	2768 1
+1137	2777 1
+1137	2781 1
+1137	2785 1
+1137	2805 1
+1137	2814 1
+1137	2825 1
+1137	2828 1
+1137	2830 1
+1137	2838 1
+1137	2900 1
+1137	2958 1
+1137	3026 1
+1137	3033 1
+1137	3059 1
+1137	3117 1
+1137	3192 1
+1137	3265 1
+1137	3537 1
+1137	3615 1
+1137	3643 1
+1137	3748 1
+1137	3755 1
+1137	3796 1
+1137	3854 1
+1137	3898 1
+1137	4041 1
+1137	4099 1
+1137	4162 1
+1137	4256 1
+1137	4323 1
+1137	4335 1
+1137	4365 1
+1137	4653 1
+1137	4712 1
+1137	4827 1
+1137	5026 1
+1137	5141 1
+1137	5285 1
+1137	5527 1
+1138	407 1
+1138	805 1
+1138	994 1
+1139	994 1
+1139	1043 1
+1141	545 1
+1141	1193 1
+1142	15 1
+1142	299 1
+1142	417 1
+1142	425 1
+1142	579 1
+1142	705 1
+1142	762 1
+1142	871 1
+1142	960 1
+1142	978 1
+1142	993 1
+1142	1043 1
+1142	1097 1
+1142	1166 1
+1142	1167 1
+1142	1186 1
+1142	1201 1
+1142	1248 1
+1142	1297 1
+1142	1322 1
+1142	1357 1
+1142	1476 1
+1142	1525 1
+1142	1592 1
+1142	1597 1
+1142	1603 1
+1142	1689 1
+1142	1956 1
+1142	2117 1
+1142	2328 1
+1142	2345 1
+1142	2381 1
+1142	2398 1
+1142	2510 1
+1142	2576 1
+1142	2580 1
+1142	2781 1
+1142	3516 1
+1142	3680 1
+1142	4110 1
+1142	4400 1
+1142	4631 1
+1142	5886 1
+1142	7073 1
+1142	7115 1
+1142	7168 1
+1142	7277 1
+1142	7839 1
+1143	56 1
+1143	372 1
+1143	579 1
+1143	968 1
+1143	1043 1
+1143	1186 1
+1143	1307 1
+1143	1416 1
+1143	1621 1
+1143	1888 1
+1143	2062 1
+1143	2479 1
+1143	2599 1
+1143	2963 1
+1144	941 1
+1144	1006 1
+1144	1125 1
+1144	1190 1
+1144	1196 1
+1144	1218 1
+1144	4037 1
+1068	1125 1
+1068	1322 1
+1068	1534 1
+1145	1125 1
+1145	1186 1
+1146	663 1
+1147	663 1
+1147	2830 1
+1147	3480 1
+1148	407 1
+1150	1152 1
+1150	1319 1
+1150	1484 1
+1150	1583 1
+1150	1622 1
+1150	2594 1
+1150	3136 1
+1150	4011 1
+1151	15 1
+1151	56 1
+1151	72 1
+1151	204 1
+1151	214 1
+1151	230 1
+1151	290 1
+1151	332 1
+1151	346 1
+1151	350 1
+1151	372 1
+1151	403 1
+1151	415 1
+1151	417 1
+1151	465 1
+1151	587 1
+1151	608 1
+1151	722 1
+1151	737 1
+1151	761 1
+1151	762 1
+1151	763 1
+1151	764 1
+1151	765 1
+1151	836 1
+1151	859 1
+1151	871 1
+1151	904 1
+1151	908 1
+1151	937 1
+1151	947 1
+1151	967 1
+1151	968 1
+1151	974 1
+1151	975 1
+1151	993 1
+1151	1000 1
+1151	1026 1
+1151	1032 1
+1151	1035 1
+1151	1049 1
+1151	1061 1
+1151	1097 1
+1151	1103 1
+1151	1111 1
+1151	1137 1
+1151	1152 1
+1151	1164 1
+1151	1166 1
+1151	1185 1
+1151	1186 1
+1151	1191 1
+1151	1200 1
+1151	1201 1
+1151	1211 1
+1151	1230 1
+1151	1234 1
+1151	1236 1
+1151	1239 1
+1151	1243 1
+1151	1248 1
+1151	1250 1
+1151	1279 1
+1151	1284 1
+1151	1285 1
+1151	1297 1
+1151	1319 1
+1151	1322 1
+1151	1323 1
+1151	1352 1
+1151	1353 1
+1151	1357 1
+1151	1374 1
+1151	1378 1
+1151	1393 1
+1151	1407 1
+1151	1416 1
+1151	1428 1
+1151	1437 1
+1151	1444 1
+1151	1464 1
+1151	1473 1
+1151	1482 1
+1151	1485 1
+1151	1487 1
+1151	1492 1
+1151	1496 1
+1151	1521 1
+1151	1537 1
+1151	1542 1
+1151	1547 1
+1151	1549 1
+1151	1550 1
+1151	1555 1
+1151	1565 1
+1151	1566 1
+1151	1571 1
+1151	1583 1
+1151	1585 1
+1151	1592 1
+1151	1597 1
+1151	1603 1
+1151	1608 1
+1151	1613 1
+1151	1621 1
+1151	1622 1
+1151	1633 1
+1151	1646 1
+1151	1680 1
+1151	1697 1
+1151	1700 1
+1151	1705 1
+1151	1707 1
+1151	1714 1
+1151	1717 1
+1151	1723 1
+1151	1730 1
+1151	1732 1
+1151	1733 1
+1151	1746 1
+1151	1747 1
+1151	1749 1
+1151	1752 1
+1151	1754 1
+1151	1757 1
+1151	1758 1
+1151	1768 1
+1151	1769 1
+1151	1770 1
+1151	1772 1
+1151	1774 1
+1151	1781 1
+1151	1783 1
+1151	1788 1
+1151	1791 1
+1151	1808 1
+1151	1814 1
+1151	1816 1
+1151	1835 1
+1151	1836 1
+1151	1842 1
+1151	1847 1
+1151	1848 1
+1151	1888 1
+1151	1893 1
+1151	1918 1
+1151	1919 1
+1151	1956 1
+1151	1961 1
+1151	1964 1
+1151	1965 1
+1151	1969 1
+1151	1977 1
+1151	1979 1
+1151	1983 1
+1151	1985 1
+1151	1991 1
+1151	1992 1
+1151	1997 1
+1151	2001 1
+1151	2004 1
+1151	2014 1
+1151	2016 1
+1151	2062 1
+1151	2066 1
+1151	2071 1
+1151	2073 1
+1151	2085 1
+1151	2091 1
+1151	2095 1
+1151	2097 1
+1151	2106 1
+1151	2114 1
+1151	2116 1
+1151	2117 1
+1151	2119 1
+1151	2120 1
+1151	2128 1
+1151	2135 1
+1151	2137 1
+1151	2145 1
+1151	2151 1
+1151	2157 1
+1151	2160 1
+1151	2165 1
+1151	2174 1
+1151	2181 1
+1151	2193 1
+1151	2202 1
+1151	2206 1
+1151	2209 1
+1151	2210 1
+1151	2211 1
+1151	2225 1
+1151	2229 1
+1151	2240 1
+1151	2241 1
+1151	2246 1
+1151	2251 1
+1151	2253 1
+1151	2257 1
+1151	2258 1
+1151	2264 1
+1151	2273 1
+1151	2297 1
+1151	2322 1
+1151	2323 1
+1151	2324 1
+1151	2328 1
+1151	2329 1
+1151	2332 1
+1151	2333 1
+1151	2341 1
+1151	2345 1
+1151	2350 1
+1151	2354 1
+1151	2369 1
+1151	2381 1
+1151	2385 1
+1151	2397 1
+1151	2398 1
+1151	2410 1
+1151	2433 1
+1151	2435 1
+1151	2456 1
+1151	2470 1
+1151	2475 1
+1151	2479 1
+1151	2485 1
+1151	2504 1
+1151	2506 1
+1151	2507 1
+1151	2510 1
+1151	2516 1
+1151	2535 1
+1151	2542 1
+1151	2547 1
+1151	2570 1
+1151	2576 1
+1151	2579 1
+1151	2587 1
+1151	2592 1
+1151	2593 1
+1151	2594 1
+1151	2604 1
+1151	2623 1
+1151	2625 1
+1151	2643 1
+1151	2654 1
+1151	2660 1
+1151	2665 1
+1151	2667 1
+1151	2669 1
+1151	2685 1
+1151	2686 1
+1151	2697 1
+1151	2700 1
+1151	2707 1
+1151	2713 1
+1151	2747 1
+1151	2754 1
+1151	2763 1
+1151	2768 1
+1151	2775 1
+1151	2805 1
+1151	2809 1
+1151	2815 1
+1151	2828 1
+1151	2830 1
+1151	2834 1
+1151	2851 1
+1151	2856 1
+1151	2871 1
+1151	2940 1
+1151	2963 1
+1151	2999 1
+1151	3002 1
+1151	3005 1
+1151	3009 1
+1151	3024 1
+1151	3026 1
+1151	3027 1
+1151	3028 1
+1151	3033 1
+1151	3034 1
+1151	3089 1
+1151	3092 1
+1151	3114 1
+1151	3117 1
+1151	3136 1
+1151	3144 1
+1151	3192 1
+1151	3238 1
+1151	3251 1
+1151	3253 1
+1151	3274 1
+1151	3309 1
+1151	3310 1
+1151	3338 1
+1151	3352 1
+1151	3381 1
+1151	3443 1
+1151	3452 1
+1151	3456 1
+1151	3473 1
+1151	3480 1
+1151	3489 1
+1151	3498 1
+1151	3537 1
+1151	3643 1
+1151	3680 1
+1151	3726 1
+1151	3752 1
+1151	3792 1
+1151	3796 1
+1151	3807 1
+1151	3842 1
+1151	3885 1
+1151	3892 1
+1151	3897 1
+1151	3903 1
+1151	3926 1
+1151	3937 1
+1151	3962 1
+1151	3976 1
+1151	4011 1
+1151	4037 1
+1151	4044 1
+1151	4065 1
+1151	4071 1
+1151	4099 1
+1151	4103 1
+1151	4124 1
+1151	4179 1
+1151	4191 1
+1151	4212 1
+1151	4234 1
+1151	4247 1
+1151	4310 1
+1151	4335 1
+1151	4338 1
+1151	4384 1
+1151	4422 1
+1151	4435 1
+1151	4510 1
+1151	4530 1
+1151	4531 1
+1151	4534 1
+1151	4551 1
+1151	4653 1
+1151	4706 1
+1151	4712 1
+1151	4781 1
+1151	4792 1
+1151	4828 1
+1151	4875 1
+1151	4899 1
+1151	4954 1
+1151	4964 1
+1151	4981 1
+1151	4986 1
+1151	5028 1
+1151	5061 1
+1151	5100 1
+1151	5121 1
+1151	5178 1
+1151	5182 1
+1151	5188 1
+1151	5226 1
+1151	5254 1
+1151	5273 1
+1151	5289 1
+1151	5423 1
+1151	5430 1
+1151	5437 1
+1151	5445 1
+1151	5454 1
+1151	5459 1
+1151	5509 1
+1151	5524 1
+1151	5529 1
+1151	5545 1
+1151	5584 1
+1151	5650 1
+1151	5693 1
+1151	5714 1
+1151	5721 1
+1151	5743 1
+1151	5775 1
+1151	5776 1
+1151	5818 1
+1151	5822 1
+1151	5828 1
+1151	5839 1
+1151	5848 1
+1151	5872 1
+1151	5897 1
+1151	5933 1
+1151	5947 1
+1151	6006 1
+1151	6032 1
+1151	6043 1
+1151	6094 1
+1151	6124 1
+1151	6151 1
+1151	6156 1
+1151	6166 1
+1151	6174 1
+1151	6226 1
+1151	6229 1
+1151	6327 1
+1151	6328 1
+1151	6337 1
+1151	6414 1
+1151	6437 1
+1151	6458 1
+1151	6481 1
+1151	6496 1
+1151	6523 1
+1151	6528 1
+1151	6552 1
+1151	6555 1
+1151	6560 1
+1151	6589 1
+1151	6594 1
+1151	6600 1
+1151	6632 1
+1151	6714 1
+1151	6715 1
+1151	6784 1
+1151	6832 1
+1151	6869 1
+1151	6873 1
+1151	6897 1
+1151	6914 1
+1151	6955 1
+1151	7005 1
+1151	7012 1
+1151	7021 1
+1151	7050 1
+1151	7063 1
+1151	7092 1
+1151	7115 1
+1151	7119 1
+1151	7143 1
+1151	7144 1
+1151	7277 1
+1151	7280 1
+1151	7341 1
+1151	7414 1
+1151	7587 1
+1151	7649 1
+1151	7763 1
+1151	7788 1
+1151	7795 1
+1151	7809 1
+1151	7813 1
+1151	7835 1
+1151	7855 1
+1151	7862 1
+1151	7871 1
+1151	7879 1
+1151	7882 1
+1151	7890 1
+1151	7910 1
+1151	7912 1
+1151	7927 1
+1151	7946 1
+1151	7961 1
+1151	8290 1
+1151	8291 1
+1151	8292 1
+1154	2770 1
+1154	2781 1
+1156	762 1
+1156	1022 1
+1156	2409 1
+1156	3130 1
+1155	1156 1
+1157	930 1
+1157	1156 1
+1158	1156 1
+922	35 1
+922	204 1
+922	259 1
+922	290 1
+922	299 1
+922	334 1
+922	407 1
+922	415 1
+922	579 1
+922	587 1
+922	647 1
+922	691 1
+922	710 1
+922	761 1
+922	762 1
+922	763 1
+922	803 1
+922	826 1
+922	861 1
+922	871 1
+922	887 1
+922	904 1
+922	908 1
+922	913 1
+922	928 1
+922	930 1
+922	937 1
+922	941 1
+922	943 1
+922	946 1
+922	974 1
+922	978 1
+922	982 1
+922	993 1
+922	1000 1
+922	1014 1
+922	1022 1
+922	1029 1
+922	1031 1
+922	1034 1
+922	1035 1
+922	1055 1
+922	1062 1
+922	1103 1
+922	1111 1
+922	1137 1
+922	1151 1
+922	1154 1
+922	1156 1
+922	1160 1
+922	1164 1
+922	1165 1
+922	1167 1
+922	1186 1
+922	1193 1
+922	1200 1
+922	1201 1
+922	1203 1
+922	1211 1
+922	1220 1
+922	1222 1
+922	1230 1
+922	1234 1
+922	1236 1
+922	1241 1
+922	1243 1
+922	1248 1
+922	1253 1
+922	1261 1
+922	1266 1
+922	1279 1
+922	1284 1
+922	1286 1
+922	1296 1
+922	1297 1
+922	1319 1
+922	1321 1
+922	1322 1
+922	1330 1
+922	1377 1
+922	1413 1
+922	1425 1
+922	1428 1
+922	1439 1
+922	1441 1
+922	1482 1
+922	1484 1
+922	1486 1
+922	1490 1
+922	1496 1
+922	1497 1
+922	1501 1
+922	1506 1
+922	1514 1
+922	1520 1
+922	1525 1
+922	1538 1
+922	1549 1
+922	1550 1
+922	1555 1
+922	1557 1
+922	1564 1
+922	1565 1
+922	1573 1
+922	1580 1
+922	1585 1
+922	1587 1
+922	1593 1
+922	1595 1
+922	1597 1
+922	1610 1
+922	1618 1
+922	1621 1
+922	1622 1
+922	1633 1
+922	1654 1
+922	1661 1
+922	1687 1
+922	1718 1
+922	1768 1
+922	1772 1
+922	1774 1
+922	1787 1
+922	1805 1
+922	1816 1
+922	1842 1
+922	1849 1
+922	1855 1
+922	1857 1
+922	1859 1
+922	1880 1
+922	1893 1
+922	1927 1
+922	1963 1
+922	1965 1
+922	1969 1
+922	1973 1
+922	1979 1
+922	1997 1
+922	2004 1
+922	2066 1
+922	2106 1
+922	2157 1
+922	2411 1
+922	2923 1
+922	3005 1
+922	3136 1
+922	3807 1
+922	8290 1
+1159	930 1
+1159	1165 1
+1161	930 1
+1160	35 1
+1160	171 1
+1160	227 1
+1160	299 1
+1160	334 1
+1160	432 1
+1160	810 1
+1160	853 1
+1160	930 1
+1160	941 1
+1160	971 1
+1160	978 1
+1160	1022 1
+1160	1167 1
+1160	1193 1
+1160	1201 1
+1160	1330 1
+1160	1372 1
+1160	1382 1
+1160	1394 1
+1160	1396 1
+1160	1413 1
+1160	1425 1
+1160	1476 1
+1164	15 1
+1164	290 1
+1164	299 1
+1164	407 1
+1164	665 1
+1164	761 1
+1164	857 1
+1164	908 1
+1164	993 1
+1164	1211 1
+1164	1261 1
+1164	1266 1
+1164	1513 1
+1164	1514 1
+1164	1549 1
+1164	1569 1
+1164	1573 1
+1164	1653 1
+1164	1658 1
+1164	1707 1
+1164	1816 1
+1164	1918 1
+1164	1956 1
+1164	1966 1
+1164	2076 1
+1164	2114 1
+1164	2157 1
+1164	2385 1
+1164	2535 1
+1164	3238 1
+1164	3755 1
+1164	3873 1
+1164	4099 1
+1164	5412 1
+1164	5479 1
+1164	6006 1
+1164	6424 1
+1164	7386 1
+1164	7809 1
+1165	857 1
+1165	871 1
+1165	993 1
+1165	1014 1
+1165	1261 1
+1165	1679 1
+1165	1956 1
+1165	2066 1
+1165	2328 1
+1165	2340 1
+1165	2398 1
+1165	2707 1
+1165	4037 1
+1166	15 1
+1166	56 1
+1166	72 1
+1166	204 1
+1166	214 1
+1166	222 1
+1166	285 1
+1166	290 1
+1166	332 1
+1166	346 1
+1166	350 1
+1166	372 1
+1166	403 1
+1166	417 1
+1166	608 1
+1166	633 1
+1166	665 1
+1166	737 1
+1166	741 1
+1166	761 1
+1166	762 1
+1166	763 1
+1166	764 1
+1166	765 1
+1166	825 1
+1166	840 1
+1166	856 1
+1166	857 1
+1166	873 1
+1166	887 1
+1166	896 1
+1166	946 1
+1166	959 1
+1166	978 1
+1166	993 1
+1166	1031 1
+1166	1049 1
+1166	1061 1
+1166	1097 1
+1166	1140 1
+1166	1151 1
+1166	1157 1
+1166	1159 1
+1166	1164 1
+1166	1165 1
+1166	1185 1
+1166	1186 1
+1166	1199 1
+1166	1200 1
+1166	1211 1
+1166	1230 1
+1166	1243 1
+1166	1250 1
+1166	1284 1
+1166	1285 1
+1166	1291 1
+1166	1297 1
+1166	1305 1
+1166	1307 1
+1166	1315 1
+1166	1322 1
+1166	1323 1
+1166	1352 1
+1166	1357 1
+1166	1374 1
+1166	1378 1
+1166	1384 1
+1166	1385 1
+1166	1393 1
+1166	1411 1
+1166	1416 1
+1166	1419 1
+1166	1437 1
+1166	1453 1
+1166	1473 1
+1166	1482 1
+1166	1492 1
+1166	1521 1
+1166	1547 1
+1166	1548 1
+1166	1549 1
+1166	1566 1
+1166	1571 1
+1166	1585 1
+1166	1592 1
+1166	1622 1
+1166	1633 1
+1166	1637 1
+1166	1653 1
+1166	1678 1
+1166	1679 1
+1166	1680 1
+1166	1688 1
+1166	1697 1
+1166	1705 1
+1166	1717 1
+1166	1734 1
+1166	1744 1
+1166	1747 1
+1166	1749 1
+1166	1754 1
+1166	1757 1
+1166	1772 1
+1166	1781 1
+1166	1783 1
+1166	1787 1
+1166	1791 1
+1166	1799 1
+1166	1814 1
+1166	1816 1
+1166	1823 1
+1166	1836 1
+1166	1842 1
+1166	1847 1
+1166	1849 1
+1166	1855 1
+1166	1857 1
+1166	1880 1
+1166	1884 1
+1166	1888 1
+1166	1901 1
+1166	1919 1
+1166	1920 1
+1166	1956 1
+1166	1961 1
+1166	1963 1
+1166	1964 1
+1166	1966 1
+1166	1972 1
+1166	1973 1
+1166	1977 1
+1166	1982 1
+1166	1983 1
+1166	1984 1
+1166	1985 1
+1166	1987 1
+1166	1990 1
+1166	1992 1
+1166	1997 1
+1166	2004 1
+1166	2007 1
+1166	2014 1
+1166	2053 1
+1166	2055 1
+1166	2062 1
+1166	2066 1
+1166	2076 1
+1166	2102 1
+1166	2109 1
+1166	2114 1
+1166	2117 1
+1166	2119 1
+1166	2120 1
+1166	2128 1
+1166	2129 1
+1166	2134 1
+1166	2135 1
+1166	2145 1
+1166	2157 1
+1166	2163 1
+1166	2165 1
+1166	2174 1
+1166	2178 1
+1166	2193 1
+1166	2205 1
+1166	2209 1
+1166	2210 1
+1166	2211 1
+1166	2223 1
+1166	2225 1
+1166	2231 1
+1166	2237 1
+1166	2240 1
+1166	2251 1
+1166	2256 1
+1166	2257 1
+1166	2258 1
+1166	2264 1
+1166	2273 1
+1166	2276 1
+1166	2281 1
+1166	2285 1
+1166	2289 1
+1166	2290 1
+1166	2297 1
+1166	2322 1
+1166	2323 1
+1166	2324 1
+1166	2328 1
+1166	2333 1
+1166	2338 1
+1166	2341 1
+1166	2345 1
+1166	2348 1
+1166	2354 1
+1166	2362 1
+1166	2364 1
+1166	2371 1
+1166	2375 1
+1166	2376 1
+1166	2381 1
+1166	2384 1
+1166	2398 1
+1166	2400 1
+1166	2409 1
+1166	2411 1
+1166	2416 1
+1166	2433 1
+1166	2470 1
+1166	2474 1
+1166	2485 1
+1166	2490 1
+1166	2501 1
+1166	2508 1
+1166	2510 1
+1166	2516 1
+1166	2517 1
+1166	2535 1
+1166	2542 1
+1166	2550 1
+1166	2565 1
+1166	2570 1
+1166	2575 1
+1166	2576 1
+1166	2593 1
+1166	2594 1
+1166	2597 1
+1166	2604 1
+1166	2619 1
+1166	2623 1
+1166	2625 1
+1166	2643 1
+1166	2646 1
+1166	2650 1
+1166	2651 1
+1166	2653 1
+1166	2654 1
+1166	2658 1
+1166	2660 1
+1166	2662 1
+1166	2665 1
+1166	2669 1
+1166	2674 1
+1166	2685 1
+1166	2686 1
+1166	2693 1
+1166	2700 1
+1166	2708 1
+1166	2721 1
+1166	2724 1
+1166	2736 1
+1166	2747 1
+1166	2754 1
+1166	2763 1
+1166	2774 1
+1166	2775 1
+1166	2785 1
+1166	2787 1
+1166	2790 1
+1166	2794 1
+1166	2801 1
+1166	2811 1
+1166	2819 1
+1166	2828 1
+1166	2830 1
+1166	2834 1
+1166	2838 1
+1166	2856 1
+1166	2871 1
+1166	2877 1
+1166	2880 1
+1166	2900 1
+1166	2902 1
+1166	2912 1
+1166	2918 1
+1166	2940 1
+1166	2951 1
+1166	2958 1
+1166	2968 1
+1166	2972 1
+1166	2973 1
+1166	2977 1
+1166	2991 1
+1166	3002 1
+1166	3007 1
+1166	3014 1
+1166	3018 1
+1166	3021 1
+1166	3026 1
+1166	3030 1
+1166	3033 1
+1166	3034 1
+1166	3056 1
+1166	3084 1
+1166	3089 1
+1166	3092 1
+1166	3099 1
+1166	3106 1
+1166	3117 1
+1166	3126 1
+1166	3136 1
+1166	3140 1
+1166	3145 1
+1166	3150 1
+1166	3155 1
+1166	3164 1
+1166	3173 1
+1166	3191 1
+1166	3192 1
+1166	3238 1
+1166	3251 1
+1166	3253 1
+1166	3255 1
+1166	3258 1
+1166	3260 1
+1166	3265 1
+1166	3266 1
+1166	3291 1
+1166	3307 1
+1166	3309 1
+1166	3320 1
+1166	3334 1
+1166	3338 1
+1166	3348 1
+1166	3352 1
+1166	3371 1
+1166	3393 1
+1166	3394 1
+1166	3408 1
+1166	3433 1
+1166	3435 1
+1166	3439 1
+1166	3446 1
+1166	3452 1
+1166	3454 1
+1166	3456 1
+1166	3460 1
+1166	3473 1
+1166	3479 1
+1166	3480 1
+1166	3483 1
+1166	3486 1
+1166	3489 1
+1166	3498 1
+1166	3506 1
+1166	3516 1
+1166	3537 1
+1166	3538 1
+1166	3541 1
+1166	3554 1
+1166	3557 1
+1166	3562 1
+1166	3580 1
+1166	3586 1
+1166	3587 1
+1166	3607 1
+1166	3615 1
+1166	3631 1
+1166	3635 1
+1166	3643 1
+1166	3650 1
+1166	3724 1
+1166	3755 1
+1166	3796 1
+1166	3803 1
+1166	3807 1
+1166	3812 1
+1166	3813 1
+1166	3830 1
+1166	3843 1
+1166	3873 1
+1166	3885 1
+1166	3887 1
+1166	3892 1
+1166	3893 1
+1166	3897 1
+1166	3910 1
+1166	3926 1
+1166	3937 1
+1166	3958 1
+1166	3967 1
+1166	3976 1
+1166	4011 1
+1166	4037 1
+1166	4040 1
+1166	4041 1
+1166	4058 1
+1166	4065 1
+1166	4098 1
+1166	4099 1
+1166	4103 1
+1166	4110 1
+1166	4124 1
+1166	4127 1
+1166	4134 1
+1166	4189 1
+1166	4191 1
+1166	4201 1
+1166	4247 1
+1166	4256 1
+1166	4266 1
+1166	4276 1
+1166	4290 1
+1166	4297 1
+1166	4298 1
+1166	4299 1
+1166	4315 1
+1166	4335 1
+1166	4355 1
+1166	4361 1
+1166	4384 1
+1166	4412 1
+1166	4417 1
+1166	4463 1
+1166	4480 1
+1166	4483 1
+1166	4510 1
+1166	4527 1
+1166	4530 1
+1166	4536 1
+1166	4547 1
+1166	4666 1
+1166	4712 1
+1166	4717 1
+1166	4719 1
+1166	4735 1
+1166	4748 1
+1166	4781 1
+1166	4797 1
+1166	4808 1
+1166	4811 1
+1166	4820 1
+1166	4828 1
+1166	4846 1
+1166	4875 1
+1166	4953 1
+1166	4981 1
+1166	5002 1
+1166	5012 1
+1166	5020 1
+1166	5022 1
+1166	5079 1
+1166	5083 1
+1166	5100 1
+1166	5132 1
+1166	5148 1
+1166	5162 1
+1166	5179 1
+1166	5188 1
+1166	5210 1
+1166	5233 1
+1166	5254 1
+1166	5263 1
+1166	5273 1
+1166	5285 1
+1166	5288 1
+1166	5301 1
+1166	5305 1
+1166	5309 1
+1166	5321 1
+1166	5327 1
+1166	5384 1
+1166	5392 1
+1166	5404 1
+1166	5412 1
+1166	5415 1
+1166	5423 1
+1166	5430 1
+1166	5449 1
+1166	5452 1
+1166	5454 1
+1166	5482 1
+1166	5484 1
+1166	5509 1
+1166	5524 1
+1166	5529 1
+1166	5582 1
+1166	5626 1
+1166	5638 1
+1166	5697 1
+1166	5714 1
+1166	5721 1
+1166	5743 1
+1166	5772 1
+1166	5773 1
+1166	5780 1
+1166	5784 1
+1166	5790 1
+1166	5798 1
+1166	5800 1
+1166	5806 1
+1166	5811 1
+1166	5814 1
+1166	5824 1
+1166	5828 1
+1166	5860 1
+1166	5863 1
+1166	5872 1
+1166	5922 1
+1166	5928 1
+1166	5932 1
+1166	5936 1
+1166	5963 1
+1166	5980 1
+1166	5994 1
+1166	5998 1
+1166	6000 1
+1166	6004 1
+1166	6006 1
+1166	6023 1
+1166	6094 1
+1166	6098 1
+1166	6148 1
+1166	6151 1
+1166	6156 1
+1166	6164 1
+1166	6198 1
+1166	6218 1
+1166	6221 1
+1166	6246 1
+1166	6251 1
+1166	6255 1
+1166	6262 1
+1166	6270 1
+1166	6299 1
+1166	6305 1
+1166	6306 1
+1166	6327 1
+1166	6330 1
+1166	6334 1
+1166	6337 1
+1166	6388 1
+1166	6400 1
+1166	6407 1
+1166	6414 1
+1166	6432 1
+1166	6437 1
+1166	6441 1
+1166	6496 1
+1166	6498 1
+1166	6503 1
+1166	6505 1
+1166	6523 1
+1166	6560 1
+1166	6570 1
+1166	6589 1
+1166	6599 1
+1166	6634 1
+1166	6665 1
+1166	6700 1
+1166	6714 1
+1166	6715 1
+1166	6720 1
+1166	6784 1
+1166	6789 1
+1166	6832 1
+1166	6855 1
+1166	6914 1
+1166	6918 1
+1166	6934 1
+1166	6946 1
+1166	6948 1
+1166	6953 1
+1166	6979 1
+1166	6982 1
+1166	6994 1
+1166	7047 1
+1166	7052 1
+1166	7059 1
+1166	7092 1
+1166	7094 1
+1166	7108 1
+1166	7168 1
+1166	7279 1
+1166	7280 1
+1166	7373 1
+1166	7442 1
+1166	7553 1
+1166	7620 1
+1166	7662 1
+1166	7699 1
+1166	7707 1
+1166	7726 1
+1166	7803 1
+1166	7809 1
+1166	7839 1
+1166	7908 1
+1166	7946 1
+1166	7992 1
+1166	8083 1
+1166	8122 1
+1166	8134 1
+1166	8290 1
+1166	8291 1
+1166	8292 1
+1166	8293 1
+1166	8294 1
+1166	8295 1
+1166	8297 1
+1167	35 1
+1167	56 1
+1167	171 1
+1167	290 1
+1167	299 1
+1167	407 1
+1167	506 1
+1167	710 1
+1167	717 1
+1167	762 1
+1167	805 1
+1167	810 1
+1167	826 1
+1167	857 1
+1167	871 1
+1167	873 1
+1167	904 1
+1167	908 1
+1167	922 1
+1167	963 1
+1167	971 1
+1167	978 1
+1167	982 1
+1167	985 1
+1167	993 1
+1167	1022 1
+1167	1035 1
+1167	1151 1
+1167	1160 1
+1167	1164 1
+1167	1186 1
+1167	1190 1
+1167	1192 1
+1167	1193 1
+1167	1200 1
+1167	1201 1
+1167	1211 1
+1167	1220 1
+1167	1230 1
+1167	1234 1
+1167	1241 1
+1167	1253 1
+1167	1261 1
+1167	1270 1
+1167	1277 1
+1167	1286 1
+1167	1321 1
+1167	1322 1
+1167	1330 1
+1167	1357 1
+1167	1411 1
+1167	1413 1
+1167	1428 1
+1167	1453 1
+1167	1471 1
+1167	1476 1
+1167	1478 1
+1167	1482 1
+1167	1484 1
+1167	1487 1
+1167	1489 1
+1167	1492 1
+1167	1496 1
+1167	1497 1
+1167	1498 1
+1167	1501 1
+1167	1514 1
+1167	1538 1
+1167	1563 1
+1167	1580 1
+1167	1585 1
+1167	1593 1
+1167	1600 1
+1167	1603 1
+1167	1608 1
+1167	1612 1
+1167	1618 1
+1167	1633 1
+1167	1641 1
+1167	1661 1
+1167	1678 1
+1167	1718 1
+1167	1730 1
+1167	1754 1
+1167	1774 1
+1167	1780 1
+1167	1793 1
+1167	1805 1
+1167	1835 1
+1167	1842 1
+1167	1859 1
+1167	1861 1
+1167	1864 1
+1167	1888 1
+1167	1893 1
+1167	1920 1
+1167	1956 1
+1167	1963 1
+1167	2004 1
+1167	2069 1
+1167	2106 1
+1167	2114 1
+1167	2128 1
+1167	2157 1
+1167	2182 1
+1167	2210 1
+1167	2225 1
+1167	2256 1
+1167	2322 1
+1167	2323 1
+1167	2397 1
+1167	2411 1
+1167	2470 1
+1167	2499 1
+1167	2565 1
+1167	2575 1
+1167	2585 1
+1167	2619 1
+1167	2625 1
+1167	2647 1
+1167	2650 1
+1167	2651 1
+1167	2662 1
+1167	2665 1
+1167	2685 1
+1167	2686 1
+1167	2754 1
+1167	2770 1
+1167	2834 1
+1167	2838 1
+1167	2877 1
+1167	2880 1
+1167	2900 1
+1167	2966 1
+1167	3028 1
+1167	3033 1
+1167	3130 1
+1167	3164 1
+1167	3200 1
+1167	3253 1
+1167	3334 1
+1167	3352 1
+1167	3408 1
+1167	3446 1
+1167	3541 1
+1167	3650 1
+1167	3720 1
+1167	3755 1
+1167	3835 1
+1167	3976 1
+1167	4110 1
+1167	4365 1
+1167	4735 1
+1167	4875 1
+1167	5545 1
+1167	5963 1
+1167	8292 1
+1167	8293 1
+1177	1186 1
+1168	1014 1
+1168	1186 1
+1168	1816 1
+1168	2178 1
+1168	3660 1
+1178	1186 1
+1179	15 1
+1179	214 1
+1179	1186 1
+1179	1464 1
+1179	2508 1
+1179	3443 1
+1179	4463 1
+1179	4719 1
+1179	5254 1
+1179	8192 1
+1169	350 1
+1169	407 1
+1169	856 1
+1169	1061 1
+1169	1186 1
+1169	1633 1
+1169	1847 1
+1169	2091 1
+1169	2117 1
+1169	2366 1
+1169	2508 1
+1169	2576 1
+1169	2594 1
+1169	2619 1
+1169	2625 1
+1169	2643 1
+1169	2754 1
+1169	2951 1
+1169	3020 1
+1169	3307 1
+1169	3338 1
+1169	3408 1
+1169	3807 1
+1169	3871 1
+1169	4999 1
+1169	5423 1
+1169	5449 1
+1169	5936 1
+1169	5973 1
+1170	1186 1
+1170	1190 1
+1180	1186 1
+1171	1186 1
+1090	943 1
+1090	1186 1
+1172	1186 1
+1173	1186 1
+1174	1186 1
+1175	1186 1
+1182	299 1
+1182	922 1
+1182	941 1
+1182	1006 1
+1182	1186 1
+1182	1222 1
+1182	1240 1
+1183	425 1
+1183	1186 1
+1183	1389 1
+1183	1592 1
+1183	1653 1
+1183	1808 1
+1183	2754 1
+1183	2922 1
+1183	2955 1
+1185	56 1
+1185	407 1
+1185	665 1
+1185	762 1
+1185	771 1
+1185	797 1
+1185	937 1
+1185	963 1
+1185	1151 1
+1185	1167 1
+1185	1186 1
+1185	1199 1
+1185	1321 1
+1185	1322 1
+1185	1525 1
+1185	1585 1
+1185	1633 1
+1185	1648 1
+1185	1662 1
+1185	1717 1
+1185	1718 1
+1185	1752 1
+1185	1758 1
+1185	1780 1
+1185	1805 1
+1185	1842 1
+1185	1849 1
+1185	1855 1
+1185	1859 1
+1185	1861 1
+1185	1864 1
+1185	1973 1
+1185	2004 1
+1185	2237 1
+1185	2801 1
+1185	3136 1
+1185	3309 1
+1185	3443 1
+1185	3958 1
+1185	4875 1
+1185	6790 1
+1185	7040 1
+1185	8293 1
+1176	1186 1
+1190	15 1
+1190	417 1
+1190	974 1
+1190	1496 1
+1187	1035 1
+1187	1190 1
+1187	1191 1
+1188	1190 1
+1188	1453 1
+1189	1190 1
+1193	15 1
+1193	35 1
+1193	72 1
+1193	290 1
+1193	762 1
+1193	859 1
+1193	871 1
+1193	887 1
+1193	928 1
+1193	959 1
+1193	1031 1
+1193	1062 1
+1193	1192 1
+1193	1259 1
+1193	1260 1
+1193	1261 1
+1193	1297 1
+1193	1323 1
+1193	1518 1
+1193	1595 1
+1193	1661 1
+1193	1669 1
+1193	1798 1
+1193	2160 1
+1193	2328 1
+1193	2470 1
+1193	3755 1
+1193	4037 1
+1193	4463 1
+1193	5002 1
+1193	6560 1
+1196	737 1
+1196	1864 1
+1196	3050 1
+1196	3193 1
+1196	3346 1
+1196	3557 1
+1196	3645 1
+1196	3769 1
+1196	4110 1
+1194	1196 1
+1195	259 1
+1195	805 1
+1195	1006 1
+1195	1196 1
+1195	1218 1
+1197	1006 1
+1197	1201 1
+1197	1222 1
+1198	285 1
+1198	1006 1
+1198	2565 1
+1198	2593 1
+1199	922 1
+1199	941 1
+1200	56 1
+1200	290 1
+1200	403 1
+1200	633 1
+1200	765 1
+1200	856 1
+1200	941 1
+1200	993 1
+1200	1166 1
+1200	1167 1
+1200	1267 1
+1200	1393 1
+1200	1413 1
+1200	1416 1
+1200	1419 1
+1200	1453 1
+1200	1592 1
+1200	1633 1
+1200	1637 1
+1200	1679 1
+1200	1723 1
+1200	1754 1
+1200	1781 1
+1200	1792 1
+1200	1814 1
+1200	1919 1
+1200	1956 1
+1200	2053 1
+1200	2066 1
+1200	2102 1
+1200	2116 1
+1200	2120 1
+1200	2135 1
+1200	2174 1
+1200	2225 1
+1200	2231 1
+1200	2251 1
+1200	2264 1
+1200	2297 1
+1200	2322 1
+1200	2340 1
+1200	2371 1
+1200	2375 1
+1200	2416 1
+1200	2474 1
+1200	2550 1
+1200	2593 1
+1200	2599 1
+1200	2617 1
+1200	2618 1
+1200	2625 1
+1200	2647 1
+1200	2651 1
+1200	2654 1
+1200	2660 1
+1200	2697 1
+1200	2713 1
+1200	2724 1
+1200	2754 1
+1200	2768 1
+1200	2785 1
+1200	2787 1
+1200	2794 1
+1200	2805 1
+1200	2809 1
+1200	2814 1
+1200	2828 1
+1200	2830 1
+1200	2834 1
+1200	2838 1
+1200	2856 1
+1200	2877 1
+1200	2880 1
+1200	2912 1
+1200	2918 1
+1200	2922 1
+1200	2951 1
+1200	3021 1
+1200	3030 1
+1200	3033 1
+1200	3034 1
+1200	3089 1
+1200	3099 1
+1200	3126 1
+1200	3138 1
+1200	3140 1
+1200	3145 1
+1200	3150 1
+1200	3164 1
+1200	3238 1
+1200	3243 1
+1200	3251 1
+1200	3253 1
+1200	3265 1
+1200	3455 1
+1200	3456 1
+1200	3976 1
+1200	4534 1
+1200	4796 1
+1200	5022 1
+1200	5073 1
+1200	5404 1
+1200	5412 1
+1200	6306 1
+1200	7707 1
+1200	7879 1
+1200	8293 1
+1201	35 1
+1201	298 1
+1201	545 1
+1201	644 1
+1201	941 1
+1201	978 1
+1201	982 1
+1201	1193 1
+1201	1200 1
+1201	1222 1
+1201	1253 1
+1201	1259 1
+1201	1260 1
+1201	1261 1
+1201	1319 1
+1201	1322 1
+1201	1394 1
+1201	1396 1
+1201	1413 1
+1201	1425 1
+1201	1428 1
+1201	1476 1
+1201	1482 1
+1201	1487 1
+1201	1489 1
+1201	1496 1
+1201	1497 1
+1201	1514 1
+1201	1580 1
+1201	1593 1
+1201	1603 1
+1201	1718 1
+1201	1726 1
+1201	1780 1
+1201	2066 1
+1202	56 1
+1202	559 1
+1202	587 1
+1202	722 1
+1202	871 1
+1202	887 1
+1202	904 1
+1202	907 1
+1202	941 1
+1202	1000 1
+1202	1032 1
+1202	1111 1
+1202	1151 1
+1202	1186 1
+1202	1200 1
+1202	1201 1
+1202	1250 1
+1202	1253 1
+1202	1284 1
+1202	1291 1
+1202	1297 1
+1202	1353 1
+1202	1407 1
+1202	1428 1
+1202	1482 1
+1202	1489 1
+1202	1492 1
+1202	1514 1
+1202	1525 1
+1202	1531 1
+1202	1547 1
+1202	1555 1
+1202	1580 1
+1202	1585 1
+1202	1597 1
+1202	1604 1
+1202	1608 1
+1202	1622 1
+1202	1661 1
+1202	1697 1
+1202	1700 1
+1202	1701 1
+1202	1717 1
+1202	1752 1
+1202	1758 1
+1202	1793 1
+1202	1847 1
+1202	1861 1
+1202	1864 1
+1202	1893 1
+1202	1919 1
+1202	1927 1
+1202	1997 1
+1202	2053 1
+1202	2066 1
+1202	2181 1
+1202	2251 1
+1202	2504 1
+1202	2625 1
+1202	2968 1
+1202	3018 1
+1202	3033 1
+1202	3034 1
+1202	3136 1
+1202	8290 1
+1202	8291 1
+1203	334 1
+1203	887 1
+1203	941 1
+1203	963 1
+1203	1165 1
+1203	1199 1
+1203	1291 1
+1203	1307 1
+1203	1326 1
+1203	1357 1
+1203	1549 1
+1203	1633 1
+1203	1679 1
+1203	1692 1
+1203	1697 1
+1203	1855 1
+1203	1979 1
+1203	2055 1
+1203	2168 1
+1203	2356 1
+1203	2400 1
+1203	2499 1
+1204	171 1
+1204	290 1
+1204	432 1
+1204	710 1
+1204	803 1
+1204	853 1
+1204	922 1
+1204	941 1
+1204	943 1
+1204	1199 1
+1204	1201 1
+1204	1220 1
+1204	1222 1
+1204	1234 1
+1204	1259 1
+1204	1261 1
+1204	1267 1
+1204	1286 1
+1204	1305 1
+1204	1330 1
+1204	1372 1
+1204	1375 1
+1204	1394 1
+1204	1402 1
+1204	1618 1
+1204	1633 1
+1204	1648 1
+1204	1662 1
+1204	1679 1
+1204	2231 1
+1204	2325 1
+1204	2364 1
+1204	2651 1
+1204	2662 1
+1204	2696 1
+1204	2700 1
+1204	2713 1
+1204	2951 1
+1204	3002 1
+1204	3030 1
+1204	3276 1
+1204	3338 1
+1204	3433 1
+1204	3447 1
+1204	3452 1
+1204	3458 1
+1204	3537 1
+1204	3755 1
+1204	3843 1
+1204	3854 1
+1204	4037 1
+1204	4191 1
+1204	4335 1
+1204	4529 1
+1204	4792 1
+1204	4938 1
+1204	5026 1
+1204	5045 1
+1204	5199 1
+1204	6299 1
+1204	6980 1
+1205	941 1
+1206	941 1
+1207	941 1
+1207	1062 1
+1207	1193 1
+1207	1211 1
+1207	1277 1
+1207	1489 1
+1207	1633 1
+1207	1652 1
+1207	1662 1
+1207	1680 1
+1207	2323 1
+1207	2398 1
+1207	2490 1
+1207	3050 1
+1207	3056 1
+1207	3291 1
+1207	4099 1
+1207	4748 1
+1207	4994 1
+1207	5262 1
+1207	5479 1
+1207	5620 1
+1207	5626 1
+1207	5640 1
+1207	5832 1
+1207	8295 1
+1208	941 1
+1209	941 1
+1210	35 1
+1210	56 1
+1210	72 1
+1210	204 1
+1210	230 1
+1210	298 1
+1210	334 1
+1210	350 1
+1210	372 1
+1210	403 1
+1210	633 1
+1210	644 1
+1210	722 1
+1210	737 1
+1210	762 1
+1210	763 1
+1210	764 1
+1210	765 1
+1210	803 1
+1210	840 1
+1210	935 1
+1210	937 1
+1210	941 1
+1210	947 1
+1210	993 1
+1210	999 1
+1210	1000 1
+1210	1034 1
+1210	1035 1
+1210	1049 1
+1210	1061 1
+1210	1103 1
+1210	1111 1
+1210	1127 1
+1210	1137 1
+1210	1164 1
+1210	1166 1
+1210	1185 1
+1210	1186 1
+1210	1193 1
+1210	1203 1
+1210	1222 1
+1210	1230 1
+1210	1243 1
+1210	1284 1
+1210	1286 1
+1210	1297 1
+1210	1319 1
+1210	1330 1
+1210	1352 1
+1210	1353 1
+1210	1357 1
+1210	1374 1
+1210	1377 1
+1210	1378 1
+1210	1384 1
+1210	1389 1
+1210	1393 1
+1210	1394 1
+1210	1396 1
+1210	1402 1
+1210	1407 1
+1210	1412 1
+1210	1413 1
+1210	1416 1
+1210	1418 1
+1210	1420 1
+1210	1425 1
+1210	1492 1
+1210	1514 1
+1210	1534 1
+1210	1547 1
+1210	1549 1
+1210	1565 1
+1210	1585 1
+1210	1592 1
+1210	1608 1
+1210	1658 1
+1210	1678 1
+1210	1707 1
+1210	1717 1
+1210	1730 1
+1210	1744 1
+1210	1749 1
+1210	1754 1
+1210	1758 1
+1210	1772 1
+1210	1777 1
+1210	1783 1
+1210	1787 1
+1210	1792 1
+1210	1814 1
+1210	1848 1
+1210	1855 1
+1210	1880 1
+1210	1893 1
+1210	1903 1
+1210	1908 1
+1210	1919 1
+1210	1964 1
+1210	1965 1
+1210	1966 1
+1210	1991 1
+1210	1992 1
+1210	2062 1
+1210	2066 1
+1210	2073 1
+1210	2076 1
+1210	2079 1
+1210	2085 1
+1210	2091 1
+1210	2095 1
+1210	2097 1
+1210	2109 1
+1210	2117 1
+1210	2120 1
+1210	2128 1
+1210	2135 1
+1210	2157 1
+1210	2165 1
+1210	2168 1
+1210	2181 1
+1210	2193 1
+1210	2210 1
+1210	2211 1
+1210	2240 1
+1210	2253 1
+1210	2273 1
+1210	2281 1
+1210	2297 1
+1210	2322 1
+1210	2324 1
+1210	2345 1
+1210	2364 1
+1210	2398 1
+1210	2400 1
+1210	2411 1
+1210	2470 1
+1210	2475 1
+1210	2504 1
+1210	2508 1
+1210	2510 1
+1210	2516 1
+1210	2535 1
+1210	2565 1
+1210	2570 1
+1210	2579 1
+1210	2587 1
+1210	2593 1
+1210	2604 1
+1210	2625 1
+1210	2654 1
+1210	2657 1
+1210	2660 1
+1210	2669 1
+1210	2685 1
+1210	2697 1
+1210	2713 1
+1210	2785 1
+1210	2805 1
+1210	2834 1
+1210	2851 1
+1210	3020 1
+1210	3027 1
+1210	3089 1
+1210	3148 1
+1210	3251 1
+1210	3253 1
+1210	3284 1
+1210	3351 1
+1210	3456 1
+1210	3479 1
+1210	3537 1
+1210	3557 1
+1210	3580 1
+1210	3586 1
+1210	3587 1
+1210	3634 1
+1210	3670 1
+1210	3807 1
+1210	3926 1
+1210	3958 1
+1210	3976 1
+1210	4037 1
+1210	4289 1
+1210	4290 1
+1210	4400 1
+1210	4424 1
+1210	4795 1
+1210	4798 1
+1210	4846 1
+1210	5073 1
+1210	5100 1
+1210	5254 1
+1210	5288 1
+1210	5423 1
+1210	5430 1
+1210	5524 1
+1210	5563 1
+1210	5799 1
+1210	5804 1
+1210	5818 1
+1210	5822 1
+1210	5994 1
+1210	6004 1
+1210	6305 1
+1210	6330 1
+1210	6334 1
+1210	6337 1
+1210	6498 1
+1210	6560 1
+1210	6715 1
+1210	6790 1
+1210	6860 1
+1210	6901 1
+1210	6930 1
+1210	6934 1
+1210	8292 1
+1211	171 1
+1211	285 1
+1211	290 1
+1211	506 1
+1211	579 1
+1211	665 1
+1211	710 1
+1211	761 1
+1211	762 1
+1211	908 1
+1211	941 1
+1211	993 1
+1211	1018 1
+1211	1031 1
+1211	1151 1
+1211	1193 1
+1211	1253 1
+1211	1261 1
+1211	1267 1
+1211	1279 1
+1211	1286 1
+1211	1372 1
+1211	1375 1
+1211	1413 1
+1211	1435 1
+1211	1471 1
+1211	1496 1
+1211	1514 1
+1211	1521 1
+1211	1585 1
+1211	1648 1
+1211	1661 1
+1211	1678 1
+1211	1680 1
+1211	1701 1
+1211	1705 1
+1211	1772 1
+1211	1780 1
+1211	1787 1
+1211	1798 1
+1211	1808 1
+1211	1814 1
+1211	1819 1
+1211	1836 1
+1211	1842 1
+1211	1849 1
+1211	1956 1
+1211	1966 1
+1211	2007 1
+1211	2062 1
+1211	2066 1
+1211	2101 1
+1211	2106 1
+1211	2128 1
+1211	2151 1
+1211	2157 1
+1211	2174 1
+1211	2193 1
+1211	2195 1
+1211	2225 1
+1211	2328 1
+1211	2397 1
+1211	2474 1
+1211	2508 1
+1211	2535 1
+1211	2643 1
+1211	2653 1
+1211	2763 1
+1211	2877 1
+1211	2922 1
+1211	2923 1
+1211	3117 1
+1211	3265 1
+1211	3720 1
+1211	4051 1
+1211	4138 1
+1211	4256 1
+1211	8290 1
+1211	8294 1
+1212	941 1
+1212	1211 1
+1212	2323 1
+1212	2625 1
+1213	941 1
+1214	922 1
+1214	941 1
+1215	15 1
+1215	72 1
+1215	762 1
+1215	896 1
+1215	941 1
+1215	947 1
+1215	1026 1
+1215	1035 1
+1215	1186 1
+1215	1211 1
+1215	1297 1
+1215	1357 1
+1215	1492 1
+1215	1521 1
+1215	1534 1
+1215	1549 1
+1215	1621 1
+1215	1633 1
+1215	1734 1
+1215	1754 1
+1215	1847 1
+1215	1859 1
+1215	1880 1
+1215	1919 1
+1215	1953 1
+1215	2066 1
+1215	2117 1
+1215	2264 1
+1215	2285 1
+1215	2323 1
+1215	2356 1
+1215	2400 1
+1215	2426 1
+1215	2504 1
+1215	2535 1
+1215	2593 1
+1215	2594 1
+1215	2604 1
+1215	2625 1
+1215	2643 1
+1215	2736 1
+1215	3089 1
+1215	3130 1
+1215	3265 1
+1215	3291 1
+1215	3297 1
+1215	3334 1
+1215	3376 1
+1215	3410 1
+1215	3873 1
+1215	5079 1
+1215	5179 1
+1215	5886 1
+1215	5936 1
+1215	6094 1
+1215	6161 1
+1215	6437 1
+1215	6523 1
+1215	7131 1
+1215	7168 1
+1215	7544 1
+1215	7620 1
+1215	7632 1
+1215	7699 1
+1215	7835 1
+1216	941 1
+1219	1220 1
+1221	545 1
+1221	587 1
+1221	633 1
+1221	765 1
+1221	791 1
+1221	803 1
+1221	887 1
+1221	907 1
+1221	908 1
+1221	978 1
+1221	1035 1
+1221	1137 1
+1221	1164 1
+1221	1193 1
+1221	1203 1
+1221	1222 1
+1221	1236 1
+1221	1253 1
+1221	1259 1
+1221	1282 1
+1221	1284 1
+1221	1296 1
+1221	1321 1
+1221	1375 1
+1221	1378 1
+1221	1390 1
+1221	1394 1
+1221	1396 1
+1221	1413 1
+1221	1425 1
+1221	1439 1
+1221	1492 1
+1221	1518 1
+1221	1524 1
+1221	1538 1
+1221	1566 1
+1221	1571 1
+1221	1585 1
+1221	1587 1
+1221	1603 1
+1221	1608 1
+1221	1688 1
+1221	1754 1
+1221	1774 1
+1221	1814 1
+1221	1847 1
+1221	1858 1
+1221	1888 1
+1221	1927 1
+1221	1963 1
+1221	1966 1
+1221	2097 1
+1221	2168 1
+1221	2174 1
+1221	2210 1
+1221	2225 1
+1221	2241 1
+1221	2290 1
+1221	2324 1
+1221	2356 1
+1221	2579 1
+1221	2585 1
+1221	2667 1
+1221	2685 1
+1221	2707 1
+1221	2834 1
+1221	2922 1
+1221	3007 1
+1221	3021 1
+1221	3024 1
+1221	3099 1
+1221	3251 1
+1221	3253 1
+1221	3351 1
+1221	3807 1
+1221	3903 1
+1221	3956 1
+1223	922 1
+1224	922 1
+1225	922 1
+1226	922 1
+1227	922 1
+1228	15 1
+1228	922 1
+1228	978 1
+1228	1956 1
+1228	2625 1
+1228	2651 1
+1228	2685 1
+1228	2940 1
+1228	4299 1
+1228	4463 1
+1228	4735 1
+1229	922 1
+1230	290 1
+1230	710 1
+1230	763 1
+1230	922 1
+1230	993 1
+1230	1062 1
+1230	1164 1
+1230	1167 1
+1230	1234 1
+1230	1243 1
+1230	1286 1
+1230	1297 1
+1230	1437 1
+1230	1514 1
+1230	1564 1
+1230	1587 1
+1230	1621 1
+1230	1700 1
+1230	1701 1
+1230	1774 1
+1230	1814 1
+1230	1837 1
+1230	1880 1
+1230	1893 1
+1230	1908 1
+1230	1953 1
+1230	1969 1
+1230	1987 1
+1230	2066 1
+1230	2117 1
+1230	2333 1
+1230	2400 1
+1230	3117 1
+1231	922 1
+1232	922 1
+1233	761 1
+1233	826 1
+1233	907 1
+1233	922 1
+1233	937 1
+1233	1024 1
+1233	1151 1
+1233	1321 1
+1233	1326 1
+1233	1439 1
+1233	1441 1
+1233	1485 1
+1233	1490 1
+1233	2066 1
+1234	35 1
+1234	171 1
+1234	299 1
+1234	545 1
+1234	922 1
+1234	943 1
+1234	978 1
+1234	1167 1
+1234	1193 1
+1234	1277 1
+1234	1297 1
+1234	1428 1
+1234	1464 1
+1234	1538 1
+1234	1580 1
+1234	1587 1
+1235	35 1
+1235	227 1
+1235	299 1
+1235	717 1
+1235	762 1
+1235	922 1
+1235	963 1
+1235	1127 1
+1235	1193 1
+1235	1203 1
+1235	1326 1
+1235	1330 1
+1235	1389 1
+1235	1412 1
+1235	1413 1
+1235	1418 1
+1235	1420 1
+1235	1425 1
+1235	1464 1
+1235	3755 1
+1239	922 1
+1236	290 1
+1236	407 1
+1236	425 1
+1236	763 1
+1236	871 1
+1236	922 1
+1236	928 1
+1236	948 1
+1236	960 1
+1236	971 1
+1236	993 1
+1236	1000 1
+1236	1035 1
+1236	1103 1
+1236	1164 1
+1236	1166 1
+1236	1167 1
+1236	1168 1
+1236	1199 1
+1236	1201 1
+1236	1203 1
+1236	1211 1
+1236	1221 1
+1236	1230 1
+1236	1234 1
+1236	1253 1
+1236	1261 1
+1236	1279 1
+1236	1291 1
+1236	1297 1
+1236	1319 1
+1236	1357 1
+1236	1378 1
+1236	1390 1
+1236	1394 1
+1236	1425 1
+1236	1428 1
+1236	1439 1
+1236	1453 1
+1236	1471 1
+1236	1478 1
+1236	1482 1
+1236	1484 1
+1236	1489 1
+1236	1492 1
+1236	1496 1
+1236	1514 1
+1236	1518 1
+1236	1520 1
+1236	1521 1
+1236	1525 1
+1236	1538 1
+1236	1549 1
+1236	1555 1
+1236	1593 1
+1236	1600 1
+1236	1603 1
+1236	1610 1
+1236	1618 1
+1236	1622 1
+1236	1633 1
+1236	1641 1
+1236	1661 1
+1236	1701 1
+1236	1734 1
+1236	1754 1
+1236	1783 1
+1236	1808 1
+1236	1816 1
+1236	1847 1
+1236	1893 1
+1236	1918 1
+1236	1965 1
+1236	1966 1
+1236	1973 1
+1236	2066 1
+1236	2097 1
+1236	2120 1
+1236	2151 1
+1236	2251 1
+1236	2257 1
+1236	2328 1
+1236	2338 1
+1236	2504 1
+1236	2560 1
+1236	2585 1
+1236	2593 1
+1236	2594 1
+1236	2625 1
+1236	2685 1
+1236	2727 1
+1236	2746 1
+1236	2981 1
+1236	2999 1
+1236	3005 1
+1236	3030 1
+1236	3117 1
+1236	3276 1
+1236	3615 1
+1236	3807 1
+1236	4263 1
+1236	4365 1
+1236	4463 1
+1237	35 1
+1237	922 1
+1237	1193 1
+1237	1232 1
+1237	1260 1
+1237	1439 1
+1238	922 1
+1243	1201 1
+1243	1593 1
+1243	1718 1
+1243	2128 1
+1243	8290 1
+1241	35 1
+1241	230 1
+1241	871 1
+1241	974 1
+1241	978 1
+1241	982 1
+1241	1201 1
+1241	1234 1
+1241	1261 1
+1241	1286 1
+1241	1297 1
+1241	1319 1
+1241	1330 1
+1241	1484 1
+1241	1514 1
+1241	1549 1
+1241	1618 1
+1241	1633 1
+1241	1661 1
+1241	1758 1
+1241	1956 1
+1241	1973 1
+1241	2066 1
+1241	2210 1
+1241	2510 1
+1241	2594 1
+1241	3005 1
+1241	3084 1
+1241	3260 1
+1241	3755 1
+1241	3800 1
+1241	3903 1
+1241	4536 1
+1241	4735 1
+1241	6869 1
+1242	72 1
+1242	985 1
+1242	1199 1
+1242	1201 1
+1242	1241 1
+1242	1261 1
+1242	1286 1
+1242	1322 1
+1242	1496 1
+1242	1555 1
+1242	2685 1
+1244	805 1
+1244	6262 1
+1245	334 1
+1245	545 1
+1245	644 1
+1245	805 1
+1245	982 1
+1245	1062 1
+1245	1221 1
+1245	1241 1
+1245	1259 1
+1245	1286 1
+1246	545 1
+1246	644 1
+1246	805 1
+1246	943 1
+1246	1266 1
+1246	1286 1
+1246	1484 1
+1246	1979 1
+1247	15 1
+1247	204 1
+1247	298 1
+1247	407 1
+1247	425 1
+1247	633 1
+1247	762 1
+1247	765 1
+1247	805 1
+1247	960 1
+1247	971 1
+1247	993 1
+1247	1049 1
+1247	1097 1
+1247	1166 1
+1247	1167 1
+1247	1201 1
+1247	1253 1
+1247	1297 1
+1247	1319 1
+1247	1357 1
+1247	1374 1
+1247	1385 1
+1247	1407 1
+1247	1428 1
+1247	1441 1
+1247	1453 1
+1247	1468 1
+1247	1482 1
+1247	1484 1
+1247	1514 1
+1247	1580 1
+1247	1585 1
+1247	1633 1
+1247	1662 1
+1247	1754 1
+1247	1757 1
+1247	1847 1
+1247	2145 1
+1247	2251 1
+1247	2257 1
+1247	2324 1
+1247	2328 1
+1247	2398 1
+1247	2570 1
+1247	2620 1
+1247	2625 1
+1247	2657 1
+1247	2774 1
+1247	2775 1
+1247	2871 1
+1247	3002 1
+1247	3106 1
+1247	3171 1
+1247	3352 1
+1247	3393 1
+1247	3454 1
+1247	3473 1
+1247	3537 1
+1247	3843 1
+1247	3873 1
+1247	4189 1
+1247	4299 1
+1247	4384 1
+1247	4534 1
+1247	4780 1
+1247	4953 1
+1247	5189 1
+1247	5239 1
+1247	5321 1
+1247	5449 1
+1247	5545 1
+1247	5584 1
+1247	5817 1
+1247	5928 1
+1247	6417 1
+1247	8249 1
+1248	171 1
+1248	545 1
+1248	928 1
+1248	1160 1
+1248	1221 1
+1248	1236 1
+1248	1241 1
+1248	1266 1
+1248	1297 1
+1248	1402 1
+1248	1412 1
+1248	1425 1
+1248	1428 1
+1248	1484 1
+1248	1525 1
+1248	1587 1
+1248	1649 1
+1248	2066 1
+1248	2151 1
+1248	2328 1
+1248	3562 1
+1253	64 1
+1253	171 1
+1253	204 1
+1253	314 1
+1253	717 1
+1253	761 1
+1253	861 1
+1253	978 1
+1253	993 1
+1253	1022 1
+1253	1164 1
+1253	1199 1
+1253	1297 1
+1253	1382 1
+1253	1411 1
+1253	1428 1
+1253	1501 1
+1253	1513 1
+1253	1566 1
+1253	1596 1
+1253	1597 1
+1253	1600 1
+1253	1610 1
+1253	1636 1
+1253	1652 1
+1253	1679 1
+1253	1718 1
+1253	1729 1
+1253	1752 1
+1253	1787 1
+1253	1788 1
+1253	1833 1
+1253	1842 1
+1253	1847 1
+1253	1884 1
+1253	1956 1
+1253	2071 1
+1253	2381 1
+1253	2770 1
+1253	2797 1
+1253	2801 1
+1253	3033 1
+1253	3274 1
+1253	3393 1
+1253	3443 1
+1253	3456 1
+1253	4103 1
+1253	4234 1
+1253	4510 1
+1253	5828 1
+1253	8290 1
+1252	171 1
+1252	1241 1
+1254	1062 1
+1255	1062 1
+1256	1062 1
+1257	1062 1
+1258	1062 1
+1259	35 1
+1259	227 1
+1259	334 1
+1259	791 1
+1259	853 1
+1259	943 1
+1259	1062 1
+1259	1075 1
+1259	1166 1
+1259	1193 1
+1259	1221 1
+1259	1296 1
+1259	1297 1
+1259	1372 1
+1259	1389 1
+1259	1394 1
+1259	1413 1
+1259	1571 1
+1259	1633 1
+1259	2209 1
+1259	2338 1
+1259	2411 1
+1259	2542 1
+1259	2565 1
+1259	2587 1
+1259	2623 1
+1259	2657 1
+1259	2660 1
+1259	2693 1
+1259	2727 1
+1259	2790 1
+1259	2828 1
+1259	2900 1
+1259	3005 1
+1259	3408 1
+1259	3410 1
+1259	3429 1
+1259	3435 1
+1259	3446 1
+1259	3473 1
+1259	3489 1
+1259	3506 1
+1259	3529 1
+1259	3680 1
+1259	8293 1
+1261	298 1
+1261	407 1
+1261	763 1
+1261	1165 1
+1261	1514 1
+1261	1819 1
+1261	1859 1
+1261	3755 1
+1260	1241 1
+1260	1261 1
+1262	982 1
+1262	1444 1
+1264	1241 1
+1267	579 1
+1267	665 1
+1267	722 1
+1267	763 1
+1267	935 1
+1267	968 1
+1267	993 1
+1267	1018 1
+1267	1103 1
+1267	1211 1
+1267	1250 1
+1267	1259 1
+1267	1285 1
+1267	1319 1
+1267	1357 1
+1267	1496 1
+1267	1514 1
+1267	1521 1
+1267	1534 1
+1267	1566 1
+1267	1608 1
+1267	1672 1
+1267	1700 1
+1267	1707 1
+1267	1717 1
+1267	1791 1
+1267	1811 1
+1267	1835 1
+1267	1908 1
+1267	1964 1
+1267	1965 1
+1267	2014 1
+1267	2016 1
+1267	2085 1
+1267	2097 1
+1267	2135 1
+1267	2251 1
+1267	2371 1
+1267	2504 1
+1267	2560 1
+1267	2570 1
+1267	2579 1
+1267	2619 1
+1267	2660 1
+1267	2707 1
+1267	2746 1
+1267	2819 1
+1267	2831 1
+1267	2856 1
+1267	2955 1
+1267	2963 1
+1267	2968 1
+1267	2999 1
+1267	3033 1
+1267	3456 1
+1267	3800 1
+1267	3970 1
+1267	4600 1
+1267	4938 1
+1267	6170 1
+1267	6496 1
+1268	1259 1
+1269	1259 1
+1271	943 1
+1271	1282 1
+1272	1277 1
+1273	1277 1
+1274	1277 1
+1275	1277 1
+1278	35 1
+1278	259 1
+1278	290 1
+1278	299 1
+1278	644 1
+1278	710 1
+1278	717 1
+1278	810 1
+1278	853 1
+1278	907 1
+1278	960 1
+1278	963 1
+1278	971 1
+1278	978 1
+1278	985 1
+1278	993 1
+1278	1127 1
+1278	1167 1
+1278	1193 1
+1278	1201 1
+1278	1203 1
+1278	1211 1
+1278	1230 1
+1278	1234 1
+1278	1253 1
+1278	1277 1
+1278	1279 1
+1278	1286 1
+1278	1287 1
+1278	1297 1
+1278	1319 1
+1278	1321 1
+1278	1326 1
+1278	1382 1
+1278	1412 1
+1278	1413 1
+1278	1418 1
+1278	1420 1
+1278	1425 1
+1278	1428 1
+1278	1435 1
+1278	1437 1
+1278	1439 1
+1278	1441 1
+1278	1446 1
+1278	1464 1
+1278	1468 1
+1278	1471 1
+1278	1476 1
+1278	1484 1
+1278	1485 1
+1278	1486 1
+1278	1490 1
+1278	1496 1
+1278	1532 1
+1278	1538 1
+1278	1563 1
+1278	1580 1
+1278	1618 1
+1278	1622 1
+1278	1633 1
+1278	1648 1
+1278	1772 1
+1278	1774 1
+1278	1808 1
+1278	1816 1
+1278	1893 1
+1278	1918 1
+1278	4365 1
+1276	1277 1
+1279	35 1
+1279	171 1
+1279	204 1
+1279	227 1
+1279	259 1
+1279	290 1
+1279	332 1
+1279	417 1
+1279	575 1
+1279	579 1
+1279	644 1
+1279	710 1
+1279	717 1
+1279	762 1
+1279	771 1
+1279	813 1
+1279	826 1
+1279	871 1
+1279	887 1
+1279	907 1
+1279	948 1
+1279	959 1
+1279	960 1
+1279	971 1
+1279	978 1
+1279	1000 1
+1279	1022 1
+1279	1032 1
+1279	1055 1
+1279	1075 1
+1279	1154 1
+1279	1166 1
+1279	1167 1
+1279	1185 1
+1279	1201 1
+1279	1211 1
+1279	1234 1
+1279	1236 1
+1279	1248 1
+1279	1253 1
+1279	1267 1
+1279	1277 1
+1279	1286 1
+1279	1297 1
+1279	1319 1
+1279	1321 1
+1279	1326 1
+1279	1357 1
+1279	1377 1
+1279	1425 1
+1279	1428 1
+1279	1441 1
+1279	1446 1
+1279	1453 1
+1279	1464 1
+1279	1468 1
+1279	1471 1
+1279	1472 1
+1279	1484 1
+1279	1485 1
+1279	1489 1
+1279	1490 1
+1279	1496 1
+1279	1506 1
+1279	1507 1
+1279	1513 1
+1279	1518 1
+1279	1520 1
+1279	1524 1
+1279	1525 1
+1279	1531 1
+1279	1538 1
+1279	1549 1
+1279	1555 1
+1279	1563 1
+1279	1573 1
+1279	1580 1
+1279	1587 1
+1279	1595 1
+1279	1597 1
+1279	1608 1
+1279	1610 1
+1279	1618 1
+1279	1619 1
+1279	1629 1
+1279	1633 1
+1279	1638 1
+1279	1641 1
+1279	1649 1
+1279	1652 1
+1279	1654 1
+1279	1661 1
+1279	1662 1
+1279	1672 1
+1279	1716 1
+1279	1726 1
+1279	1732 1
+1279	1768 1
+1279	1774 1
+1279	1780 1
+1279	1787 1
+1279	1847 1
+1279	2062 1
+1279	2341 1
+1279	2345 1
+1279	2371 1
+1279	2385 1
+1279	2400 1
+1279	2504 1
+1279	2535 1
+1279	2587 1
+1279	2654 1
+1279	2655 1
+1279	2674 1
+1279	2819 1
+1279	2843 1
+1279	2963 1
+1279	2973 1
+1279	3005 1
+1279	3009 1
+1279	3253 1
+1279	3892 1
+1279	3956 1
+1279	4013 1
+1280	290 1
+1280	1277 1
+1280	2251 1
+1280	4341 1
+1282	1154 1
+1282	1384 1
+1282	2340 1
+1282	2410 1
+1282	2618 1
+1282	2763 1
+1282	2777 1
+1282	3557 1
+1281	946 1
+1281	993 1
+1281	1031 1
+1281	1282 1
+1281	1464 1
+1281	1489 1
+1281	1707 1
+1281	1772 1
+1281	1888 1
+1281	1893 1
+1286	35 1
+1286	72 1
+1286	299 1
+1286	737 1
+1286	765 1
+1286	853 1
+1286	935 1
+1286	1193 1
+1286	1230 1
+1286	1284 1
+1286	1285 1
+1286	1394 1
+1286	1403 1
+1286	1413 1
+1286	1420 1
+1286	1688 1
+1286	1706 1
+1286	1901 1
+1286	1903 1
+1286	1965 1
+1286	2079 1
+1286	2145 1
+1286	2193 1
+1286	2206 1
+1286	2398 1
+1286	2425 1
+1286	2456 1
+1286	2547 1
+1286	2619 1
+1286	2625 1
+1286	2651 1
+1286	2657 1
+1286	2686 1
+1286	2851 1
+1286	2856 1
+1286	2871 1
+1286	2955 1
+1286	2956 1
+1286	3309 1
+1286	3352 1
+1286	3454 1
+1286	3456 1
+1286	3464 1
+1286	3537 1
+1286	3643 1
+1286	3680 1
+1286	3755 1
+1286	4055 1
+1286	4127 1
+1286	4432 1
+1286	4529 1
+1286	4613 1
+1286	4646 1
+1286	4662 1
+1286	5002 1
+1286	5106 1
+1286	5459 1
+1286	5757 1
+1286	5818 1
+1286	5844 1
+1286	5925 1
+1286	6032 1
+1286	6227 1
+1286	6875 1
+1286	7553 1
+1284	935 1
+1284	937 1
+1284	1151 1
+1284	1285 1
+1284	1286 1
+1284	1534 1
+1284	1585 1
+1284	1688 1
+1284	1697 1
+1284	1723 1
+1284	1726 1
+1284	1859 1
+1284	1965 1
+1284	1966 1
+1284	1983 1
+1284	1987 1
+1284	2007 1
+1284	2079 1
+1284	2955 1
+1284	6875 1
+1285	15 1
+1285	72 1
+1285	290 1
+1285	579 1
+1285	853 1
+1285	993 1
+1285	1286 1
+1285	1305 1
+1285	1378 1
+1285	1688 1
+1285	1723 1
+1285	1726 1
+1285	1956 1
+1285	1965 1
+1285	2066 1
+1285	2079 1
+1285	2398 1
+1285	2485 1
+1285	2871 1
+1285	2955 1
+1285	3005 1
+1285	3009 1
+1285	3898 1
+1285	4463 1
+1285	4600 1
+1285	4687 1
+1285	5020 1
+1285	5684 1
+1285	5760 1
+1285	5818 1
+1285	7839 1
+1290	545 1
+1290	762 1
+1290	871 1
+1290	963 1
+1290	978 1
+1290	985 1
+1290	1167 1
+1290	1234 1
+1290	1297 1
+1290	1330 1
+1290	1377 1
+1290	1439 1
+1290	1497 1
+1290	1518 1
+1290	1573 1
+1290	1580 1
+1291	35 1
+1291	871 1
+1291	985 1
+1291	993 1
+1291	1193 1
+1291	1203 1
+1291	1261 1
+1291	1330 1
+1291	1357 1
+1291	1375 1
+1291	1377 1
+1291	1402 1
+1291	1497 1
+1291	1506 1
+1291	1549 1
+1291	1814 1
+1291	1977 1
+1291	2102 1
+1291	2106 1
+1291	2251 1
+1291	2256 1
+1291	2297 1
+1291	2474 1
+1291	2485 1
+1291	2594 1
+1291	2815 1
+1291	2972 1
+1291	2999 1
+1291	3014 1
+1291	3021 1
+1291	3473 1
+1291	3885 1
+1291	3887 1
+1291	4719 1
+1292	35 1
+1292	259 1
+1292	299 1
+1292	432 1
+1292	985 1
+1292	1193 1
+1292	1402 1
+1293	407 1
+1293	810 1
+1293	826 1
+1293	871 1
+1293	907 1
+1293	960 1
+1293	963 1
+1293	971 1
+1293	985 1
+1293	1031 1
+1293	1165 1
+1293	1167 1
+1293	1297 1
+1293	1319 1
+1293	1330 1
+1293	1377 1
+1293	1464 1
+1293	1484 1
+1293	1485 1
+1293	1486 1
+1293	1507 1
+1293	1513 1
+1293	1531 1
+1293	1532 1
+1293	1542 1
+1293	1842 1
+1293	1855 1
+1293	2193 1
+1293	2294 1
+1293	2665 1
+1293	2843 1
+1293	2877 1
+1293	2880 1
+1294	545 1
+1295	545 1
+1296	545 1
+1296	813 1
+1296	1035 1
+1296	1315 1
+1296	2195 1
+1296	2625 1
+1296	3026 1
+1296	3192 1
+1296	3537 1
+1297	35 1
+1297	204 1
+1297	290 1
+1297	417 1
+1297	465 1
+1297	545 1
+1297	647 1
+1297	710 1
+1297	762 1
+1297	859 1
+1297	959 1
+1297	974 1
+1297	978 1
+1297	1029 1
+1297	1166 1
+1297	1186 1
+1297	1193 1
+1297	1211 1
+1297	1234 1
+1297	1248 1
+1297	1261 1
+1297	1330 1
+1297	1439 1
+1297	1464 1
+1297	1484 1
+1297	1514 1
+1297	1564 1
+1297	1585 1
+1297	1633 1
+1297	1679 1
+1297	1705 1
+1297	1836 1
+1297	1847 1
+1297	1918 1
+1297	1964 1
+1297	2053 1
+1297	2069 1
+1297	2072 1
+1297	2145 1
+1297	2210 1
+1297	2256 1
+1297	2297 1
+1297	2322 1
+1297	2323 1
+1297	2398 1
+1297	2411 1
+1297	2474 1
+1297	2499 1
+1297	2508 1
+1297	2517 1
+1297	2535 1
+1297	2576 1
+1297	2585 1
+1297	2647 1
+1297	2653 1
+1297	2697 1
+1297	2727 1
+1297	2877 1
+1297	2900 1
+1297	2918 1
+1297	2923 1
+1297	2966 1
+1297	3005 1
+1297	3024 1
+1297	3029 1
+1297	3034 1
+1297	3084 1
+1297	3140 1
+1297	3276 1
+1297	3376 1
+1297	3516 1
+1297	3580 1
+1297	3755 1
+1297	3800 1
+1297	3946 1
+1297	8293 1
+1298	978 1
+1299	791 1
+1299	1442 1
+1299	1485 1
+1299	1525 1
+1299	1855 1
+1301	334 1
+1301	1203 1
+1301	1307 1
+1302	334 1
+1303	334 1
+1304	334 1
+1305	35 1
+1305	56 1
+1305	204 1
+1305	214 1
+1305	290 1
+1305	314 1
+1305	334 1
+1305	403 1
+1305	425 1
+1305	608 1
+1305	633 1
+1305	647 1
+1305	691 1
+1305	762 1
+1305	765 1
+1305	803 1
+1305	810 1
+1305	813 1
+1305	825 1
+1305	826 1
+1305	853 1
+1305	856 1
+1305	861 1
+1305	948 1
+1305	999 1
+1305	1022 1
+1305	1100 1
+1305	1127 1
+1305	1154 1
+1305	1157 1
+1305	1166 1
+1305	1167 1
+1305	1201 1
+1305	1211 1
+1305	1234 1
+1305	1239 1
+1305	1291 1
+1305	1296 1
+1305	1297 1
+1305	1315 1
+1305	1321 1
+1305	1330 1
+1305	1357 1
+1305	1389 1
+1305	1393 1
+1305	1403 1
+1305	1413 1
+1305	1416 1
+1305	1419 1
+1305	1453 1
+1305	1486 1
+1305	1490 1
+1305	1498 1
+1305	1556 1
+1305	1563 1
+1305	1571 1
+1305	1587 1
+1305	1592 1
+1305	1593 1
+1305	1595 1
+1305	1596 1
+1305	1600 1
+1305	1603 1
+1305	1604 1
+1305	1608 1
+1305	1633 1
+1305	1637 1
+1305	1646 1
+1305	1648 1
+1305	1653 1
+1305	1679 1
+1305	1723 1
+1305	1734 1
+1305	1754 1
+1305	1769 1
+1305	1777 1
+1305	1781 1
+1305	1792 1
+1305	1808 1
+1305	1814 1
+1305	1915 1
+1305	1918 1
+1305	1919 1
+1305	1935 1
+1305	1956 1
+1305	2016 1
+1305	2102 1
+1305	2114 1
+1305	2116 1
+1305	2120 1
+1305	2135 1
+1305	2144 1
+1305	2174 1
+1305	2209 1
+1305	2225 1
+1305	2231 1
+1305	2251 1
+1305	2252 1
+1305	2256 1
+1305	2257 1
+1305	2264 1
+1305	2290 1
+1305	2294 1
+1305	2297 1
+1305	2322 1
+1305	2323 1
+1305	2324 1
+1305	2325 1
+1305	2338 1
+1305	2366 1
+1305	2371 1
+1305	2410 1
+1305	2411 1
+1305	2416 1
+1305	2470 1
+1305	2474 1
+1305	2485 1
+1305	2501 1
+1305	2510 1
+1305	2542 1
+1305	2544 1
+1305	2547 1
+1305	2550 1
+1305	2560 1
+1305	2565 1
+1305	2576 1
+1305	2593 1
+1305	2594 1
+1305	2597 1
+1305	2599 1
+1305	2617 1
+1305	2619 1
+1305	2623 1
+1305	2625 1
+1305	2646 1
+1305	2654 1
+1305	2657 1
+1305	2662 1
+1305	2667 1
+1305	2674 1
+1305	2686 1
+1305	2693 1
+1305	2696 1
+1305	2697 1
+1305	2700 1
+1305	2707 1
+1305	2708 1
+1305	2713 1
+1305	2720 1
+1305	2721 1
+1305	2724 1
+1305	2727 1
+1305	2746 1
+1305	2747 1
+1305	2754 1
+1305	2763 1
+1305	2768 1
+1305	2770 1
+1305	2777 1
+1305	2794 1
+1305	2799 1
+1305	2805 1
+1305	2809 1
+1305	2814 1
+1305	2815 1
+1305	2819 1
+1305	2828 1
+1305	2830 1
+1305	2834 1
+1305	2877 1
+1305	2880 1
+1305	2900 1
+1305	2902 1
+1305	2912 1
+1305	2946 1
+1305	2951 1
+1305	2955 1
+1305	2958 1
+1305	2963 1
+1305	2966 1
+1305	2968 1
+1305	2972 1
+1305	2973 1
+1305	2977 1
+1305	2981 1
+1305	2993 1
+1305	2999 1
+1305	3005 1
+1305	3007 1
+1305	3009 1
+1305	3010 1
+1305	3018 1
+1305	3021 1
+1305	3024 1
+1305	3028 1
+1305	3029 1
+1305	3030 1
+1305	3033 1
+1305	3050 1
+1305	3056 1
+1305	3059 1
+1305	3073 1
+1305	3084 1
+1305	3089 1
+1305	3099 1
+1305	3114 1
+1305	3117 1
+1305	3126 1
+1305	3140 1
+1305	3148 1
+1305	3150 1
+1305	3164 1
+1305	3173 1
+1305	3193 1
+1305	3200 1
+1305	3243 1
+1305	3251 1
+1305	3253 1
+1305	3258 1
+1305	3260 1
+1305	3265 1
+1305	3276 1
+1305	3307 1
+1305	3324 1
+1305	3338 1
+1305	3351 1
+1305	3352 1
+1305	3371 1
+1305	3404 1
+1305	3408 1
+1305	3435 1
+1305	3461 1
+1305	3473 1
+1305	3480 1
+1305	3483 1
+1305	3489 1
+1305	3506 1
+1305	3516 1
+1305	3529 1
+1305	3538 1
+1305	3541 1
+1305	3548 1
+1305	3557 1
+1305	3567 1
+1305	3580 1
+1305	3587 1
+1305	3631 1
+1305	3646 1
+1305	3670 1
+1305	3680 1
+1305	3681 1
+1305	3713 1
+1305	3717 1
+1305	3769 1
+1305	3772 1
+1305	3800 1
+1305	3803 1
+1305	3804 1
+1305	3807 1
+1305	3812 1
+1305	3847 1
+1305	3887 1
+1305	3903 1
+1305	3946 1
+1305	3973 1
+1305	4043 1
+1305	4051 1
+1305	4055 1
+1305	4088 1
+1305	4162 1
+1305	4181 1
+1305	4188 1
+1305	4199 1
+1305	4233 1
+1305	4263 1
+1305	4266 1
+1305	4373 1
+1305	4529 1
+1305	4578 1
+1305	4588 1
+1305	4938 1
+1305	4953 1
+1305	4993 1
+1305	5155 1
+1305	5239 1
+1305	5404 1
+1305	5739 1
+1305	7108 1
+1305	8292 1
+1305	8293 1
+1306	298 1
+1306	334 1
+1306	813 1
+1306	907 1
+1306	1203 1
+1306	1234 1
+1306	1253 1
+1306	1307 1
+1306	1476 1
+1306	1484 1
+1306	1514 1
+1306	1726 1
+1306	1808 1
+1306	2375 1
+1306	2707 1
+1306	2922 1
+1306	3059 1
+1306	3404 1
+1306	3680 1
+1306	3867 1
+1308	644 1
+1308	1413 1
+1308	1425 1
+1308	1816 1
+1309	644 1
+1313	644 1
+1310	644 1
+1310	4827 1
+1311	644 1
+1311	1372 1
+1312	644 1
+1314	1296 1
+1315	904 1
+1315	1296 1
+1315	1566 1
+1315	1842 1
+1315	1908 1
+1315	2195 1
+1316	904 1
+1316	993 1
+1316	1296 1
+1316	1836 1
+1316	1842 1
+1316	1908 1
+1316	3192 1
+1317	1296 1
+1318	959 1
+1318	1296 1
+1319	204 1
+1319	230 1
+1319	290 1
+1319	314 1
+1319	407 1
+1319	415 1
+1319	417 1
+1319	506 1
+1319	579 1
+1319	691 1
+1319	717 1
+1319	762 1
+1319	764 1
+1319	813 1
+1319	907 1
+1319	908 1
+1319	946 1
+1319	948 1
+1319	959 1
+1319	971 1
+1319	974 1
+1319	978 1
+1319	993 1
+1319	1014 1
+1319	1035 1
+1319	1103 1
+1319	1127 1
+1319	1151 1
+1319	1154 1
+1319	1164 1
+1319	1165 1
+1319	1166 1
+1319	1200 1
+1319	1201 1
+1319	1203 1
+1319	1211 1
+1319	1236 1
+1319	1253 1
+1319	1261 1
+1319	1267 1
+1319	1279 1
+1319	1296 1
+1319	1322 1
+1319	1326 1
+1319	1357 1
+1319	1374 1
+1319	1382 1
+1319	1402 1
+1319	1418 1
+1319	1420 1
+1319	1428 1
+1319	1439 1
+1319	1446 1
+1319	1453 1
+1319	1465 1
+1319	1468 1
+1319	1482 1
+1319	1487 1
+1319	1492 1
+1319	1496 1
+1319	1521 1
+1319	1531 1
+1319	1537 1
+1319	1538 1
+1319	1549 1
+1319	1556 1
+1319	1566 1
+1319	1569 1
+1319	1573 1
+1319	1585 1
+1319	1593 1
+1319	1595 1
+1319	1596 1
+1319	1603 1
+1319	1604 1
+1319	1608 1
+1319	1618 1
+1319	1622 1
+1319	1628 1
+1319	1633 1
+1319	1638 1
+1319	1641 1
+1319	1648 1
+1319	1654 1
+1319	1658 1
+1319	1678 1
+1319	1680 1
+1319	1697 1
+1319	1700 1
+1319	1706 1
+1319	1714 1
+1319	1729 1
+1319	1734 1
+1319	1754 1
+1319	1758 1
+1319	1768 1
+1319	1772 1
+1319	1774 1
+1319	1793 1
+1319	1802 1
+1319	1805 1
+1319	1808 1
+1319	1814 1
+1319	1816 1
+1319	1849 1
+1319	1855 1
+1319	1880 1
+1319	1888 1
+1319	1893 1
+1319	1918 1
+1319	1919 1
+1319	1927 1
+1319	1953 1
+1319	1956 1
+1319	1966 1
+1319	1969 1
+1319	1973 1
+1319	1987 1
+1319	1992 1
+1319	2066 1
+1319	2073 1
+1319	2095 1
+1319	2097 1
+1319	2106 1
+1319	2117 1
+1319	2119 1
+1319	2128 1
+1319	2145 1
+1319	2151 1
+1319	2160 1
+1319	2231 1
+1319	2240 1
+1319	2307 1
+1319	2322 1
+1319	2328 1
+1319	2398 1
+1319	2474 1
+1319	2506 1
+1319	2542 1
+1319	2565 1
+1319	2593 1
+1319	2625 1
+1319	2653 1
+1319	2662 1
+1319	2693 1
+1319	2727 1
+1319	2746 1
+1319	2754 1
+1319	2859 1
+1319	2900 1
+1319	2923 1
+1319	2958 1
+1319	3005 1
+1319	3014 1
+1319	3021 1
+1319	3024 1
+1319	3033 1
+1319	3117 1
+1319	3130 1
+1319	3136 1
+1319	3237 1
+1319	3253 1
+1319	3265 1
+1319	3276 1
+1319	3307 1
+1319	3338 1
+1319	3473 1
+1319	3650 1
+1319	3726 1
+1319	3755 1
+1319	3787 1
+1319	3871 1
+1319	3967 1
+1319	4162 1
+1319	4323 1
+1319	4528 1
+1319	5288 1
+1319	6496 1
+1319	6789 1
+1319	8290 1
+1319	8291 1
+1320	417 1
+1320	647 1
+1320	2508 1
+1320	3005 1
+1320	4980 1
+1320	5288 1
+1322	710 1
+1322	946 1
+1322	960 1
+1322	993 1
+1322	1267 1
+1322	1418 1
+1322	1497 1
+1322	1633 1
+1322	2400 1
+1322	2785 1
+1322	2809 1
+1322	2922 1
+1324	1029 1
+1327	299 1
+1328	299 1
+1328	665 1
+1325	299 1
+1329	299 1
+1329	1633 1
+1329	1638 1
+1326	56 1
+1326	299 1
+1326	1322 1
+1326	1439 1
+1326	1893 1
+1326	2004 1
+1331	35 1
+1331	959 1
+1331	1193 1
+1331	2160 1
+1331	3755 1
+1331	5902 1
+1332	35 1
+1333	999 1
+1333	1111 1
+1334	1193 1
+1335	290 1
+1335	579 1
+1335	761 1
+1335	762 1
+1335	935 1
+1335	971 1
+1335	1000 1
+1335	1097 1
+1335	1127 1
+1335	1151 1
+1335	1193 1
+1335	1250 1
+1335	1253 1
+1335	1285 1
+1335	1297 1
+1335	1322 1
+1335	1326 1
+1335	1374 1
+1335	1384 1
+1335	1412 1
+1335	1420 1
+1335	1425 1
+1335	1428 1
+1335	1442 1
+1335	1453 1
+1335	1521 1
+1335	1555 1
+1335	1610 1
+1335	1618 1
+1335	1628 1
+1335	1638 1
+1335	1672 1
+1335	1680 1
+1335	1716 1
+1335	1726 1
+1335	1732 1
+1335	1770 1
+1335	1772 1
+1335	1798 1
+1335	1835 1
+1335	1848 1
+1335	1861 1
+1335	1864 1
+1335	1992 1
+1335	2076 1
+1335	2165 1
+1335	2168 1
+1335	2178 1
+1335	2322 1
+1335	2329 1
+1335	2504 1
+1335	2517 1
+1335	2605 1
+1335	2625 1
+1335	3459 1
+1335	4536 1
+1335	5305 1
+1335	5651 1
+1335	5680 1
+1335	5683 1
+1335	5828 1
+1335	5850 1
+1336	665 1
+1336	1193 1
+1336	2014 1
+1336	2091 1
+1336	2237 1
+1336	2470 1
+1336	3792 1
+1336	4687 1
+1337	1193 1
+1338	1193 1
+1338	1407 1
+1338	1412 1
+1339	993 1
+1339	1193 1
+1339	1585 1
+1339	1593 1
+1339	1956 1
+1340	665 1
+1340	1193 1
+1340	2470 1
+1341	1193 1
+1341	2470 1
+1342	1193 1
+1342	1564 1
+1342	2470 1
+1342	3352 1
+1343	1193 1
+1343	2398 1
+1344	1193 1
+1344	1260 1
+1345	1193 1
+1346	1193 1
+1346	1412 1
+1346	4795 1
+1349	259 1
+1349	1977 1
+1350	259 1
+1350	372 1
+1350	407 1
+1350	415 1
+1350	559 1
+1350	579 1
+1350	763 1
+1350	826 1
+1350	908 1
+1350	947 1
+1350	993 1
+1350	1000 1
+1350	1022 1
+1350	1035 1
+1350	1103 1
+1350	1124 1
+1350	1151 1
+1350	1164 1
+1350	1165 1
+1350	1167 1
+1350	1199 1
+1350	1201 1
+1350	1211 1
+1350	1230 1
+1350	1248 1
+1350	1253 1
+1350	1261 1
+1350	1279 1
+1350	1285 1
+1350	1297 1
+1350	1319 1
+1350	1322 1
+1350	1389 1
+1350	1411 1
+1350	1428 1
+1350	1482 1
+1350	1487 1
+1350	1489 1
+1350	1490 1
+1350	1492 1
+1350	1496 1
+1350	1506 1
+1350	1514 1
+1350	1520 1
+1350	1533 1
+1350	1534 1
+1350	1538 1
+1350	1547 1
+1350	1555 1
+1350	1566 1
+1350	1585 1
+1350	1596 1
+1350	1597 1
+1350	1608 1
+1350	1610 1
+1350	1619 1
+1350	1621 1
+1350	1622 1
+1350	1628 1
+1350	1633 1
+1350	1638 1
+1350	1649 1
+1350	1652 1
+1350	1657 1
+1350	1658 1
+1350	1661 1
+1350	1662 1
+1350	1672 1
+1350	1678 1
+1350	1680 1
+1350	1700 1
+1350	1701 1
+1350	1717 1
+1350	1718 1
+1350	1726 1
+1350	1732 1
+1350	1757 1
+1350	1758 1
+1350	1768 1
+1350	1774 1
+1350	1783 1
+1350	1788 1
+1350	1791 1
+1350	1793 1
+1350	1798 1
+1350	1802 1
+1350	1805 1
+1350	1811 1
+1350	1816 1
+1350	1836 1
+1350	1842 1
+1350	1849 1
+1350	1855 1
+1350	1858 1
+1350	1859 1
+1350	1884 1
+1350	1901 1
+1350	1903 1
+1350	1908 1
+1350	1953 1
+1350	1963 1
+1350	1966 1
+1350	1969 1
+1350	1973 1
+1350	2062 1
+1350	2117 1
+1350	2151 1
+1350	2157 1
+1350	2178 1
+1350	2240 1
+1350	2285 1
+1350	2322 1
+1350	2378 1
+1350	2400 1
+1350	3755 1
+1350	8290 1
+1350	8291 1
+1351	259 1
+1352	230 1
+1352	259 1
+1352	285 1
+1352	298 1
+1352	314 1
+1352	372 1
+1352	559 1
+1352	717 1
+1352	761 1
+1352	763 1
+1352	887 1
+1352	904 1
+1352	908 1
+1352	928 1
+1352	937 1
+1352	963 1
+1352	971 1
+1352	993 1
+1352	1000 1
+1352	1014 1
+1352	1103 1
+1352	1111 1
+1352	1124 1
+1352	1164 1
+1352	1199 1
+1352	1200 1
+1352	1201 1
+1352	1211 1
+1352	1230 1
+1352	1234 1
+1352	1236 1
+1352	1248 1
+1352	1253 1
+1352	1261 1
+1352	1284 1
+1352	1285 1
+1352	1297 1
+1352	1319 1
+1352	1396 1
+1352	1411 1
+1352	1420 1
+1352	1428 1
+1352	1453 1
+1352	1478 1
+1352	1482 1
+1352	1487 1
+1352	1489 1
+1352	1496 1
+1352	1497 1
+1352	1514 1
+1352	1531 1
+1352	1534 1
+1352	1555 1
+1352	1556 1
+1352	1566 1
+1352	1573 1
+1352	1580 1
+1352	1583 1
+1352	1585 1
+1352	1603 1
+1352	1608 1
+1352	1618 1
+1352	1622 1
+1352	1628 1
+1352	1629 1
+1352	1638 1
+1352	1649 1
+1352	1658 1
+1352	1661 1
+1352	1679 1
+1352	1697 1
+1352	1714 1
+1352	1717 1
+1352	1726 1
+1352	1746 1
+1352	1747 1
+1352	1752 1
+1352	1757 1
+1352	1758 1
+1352	1770 1
+1352	1774 1
+1352	1780 1
+1352	1783 1
+1352	1787 1
+1352	1791 1
+1352	1802 1
+1352	1805 1
+1352	1811 1
+1352	1816 1
+1352	1842 1
+1352	1849 1
+1352	1858 1
+1352	1859 1
+1352	1864 1
+1352	1893 1
+1352	1908 1
+1352	1920 1
+1352	1927 1
+1352	1956 1
+1352	1963 1
+1352	1966 1
+1352	1969 1
+1352	1973 1
+1352	1979 1
+1352	1985 1
+1352	1987 1
+1352	2004 1
+1352	2055 1
+1352	2060 1
+1352	2066 1
+1352	2073 1
+1352	2106 1
+1352	2119 1
+1352	2137 1
+1352	2151 1
+1352	2157 1
+1352	2165 1
+1352	2181 1
+1352	2211 1
+1352	3136 1
+1352	8290 1
+1359	15 1
+1359	259 1
+1359	7168 1
+1353	259 1
+1353	1075 1
+1353	1111 1
+1353	1473 1
+1353	1548 1
+1353	1783 1
+1353	1836 1
+1353	1848 1
+1353	1977 1
+1353	1997 1
+1353	2071 1
+1353	2181 1
+1353	2276 1
+1353	2354 1
+1353	2398 1
+1353	2542 1
+1353	2595 1
+1353	3192 1
+1353	3352 1
+1353	3408 1
+1353	3458 1
+1353	3835 1
+1353	3976 1
+1353	4276 1
+1353	4338 1
+1353	5254 1
+1353	5341 1
+1353	5423 1
+1353	5511 1
+1353	7131 1
+1360	259 1
+1360	285 1
+1360	290 1
+1360	762 1
+1360	763 1
+1360	856 1
+1360	1864 1
+1360	2550 1
+1360	2625 1
+1360	2654 1
+1360	2877 1
+1360	2951 1
+1360	3020 1
+1360	3089 1
+1360	3117 1
+1360	3140 1
+1360	3150 1
+1360	4044 1
+1360	4189 1
+1360	4953 1
+1360	5412 1
+1360	6262 1
+1354	259 1
+1354	1297 1
+1354	1372 1
+1354	1411 1
+1354	2411 1
+1354	2770 1
+1354	3136 1
+1354	3769 1
+1355	259 1
+1355	1412 1
+1355	2066 1
+1361	259 1
+1356	259 1
+1356	290 1
+1356	960 1
+1356	1322 1
+1356	1493 1
+1356	1595 1
+1356	1638 1
+1356	1718 1
+1356	1732 1
+1356	1780 1
+1356	1842 1
+1356	1855 1
+1356	2416 1
+1356	3020 1
+1356	3346 1
+1356	3813 1
+1356	4201 1
+1356	4373 1
+1356	6388 1
+1356	6770 1
+1362	259 1
+1362	771 1
+1362	1701 1
+1362	2643 1
+1357	259 1
+1357	285 1
+1357	298 1
+1357	403 1
+1357	417 1
+1357	425 1
+1357	579 1
+1357	762 1
+1357	813 1
+1357	871 1
+1357	887 1
+1357	907 1
+1357	960 1
+1357	963 1
+1357	971 1
+1357	1022 1
+1357	1032 1
+1357	1127 1
+1357	1164 1
+1357	1166 1
+1357	1167 1
+1357	1201 1
+1357	1203 1
+1357	1230 1
+1357	1234 1
+1357	1236 1
+1357	1253 1
+1357	1279 1
+1357	1291 1
+1357	1319 1
+1357	1322 1
+1357	1352 1
+1357	1377 1
+1357	1428 1
+1357	1439 1
+1357	1468 1
+1357	1471 1
+1357	1476 1
+1357	1482 1
+1357	1496 1
+1357	1497 1
+1357	1513 1
+1357	1514 1
+1357	1518 1
+1357	1525 1
+1357	1538 1
+1357	1571 1
+1357	1580 1
+1357	1585 1
+1357	1593 1
+1357	1603 1
+1357	1604 1
+1357	1619 1
+1357	1622 1
+1357	1641 1
+1357	1649 1
+1357	1661 1
+1357	1672 1
+1357	1679 1
+1357	1701 1
+1357	1726 1
+1357	1734 1
+1357	1747 1
+1357	1758 1
+1357	1774 1
+1357	1792 1
+1357	1808 1
+1357	1814 1
+1357	1859 1
+1357	1956 1
+1357	1963 1
+1357	1966 1
+1357	2102 1
+1357	2264 1
+1357	2328 1
+1357	2371 1
+1357	2560 1
+1357	2593 1
+1357	2674 1
+1357	2727 1
+1357	2763 1
+1357	2794 1
+1357	2968 1
+1357	3033 1
+1357	3117 1
+1357	3130 1
+1357	3192 1
+1357	3265 1
+1357	3276 1
+1357	4256 1
+1357	5950 1
+1358	259 1
+1358	407 1
+1358	959 1
+1358	1307 1
+1358	1497 1
+1358	1549 1
+1358	1836 1
+1358	1842 1
+1358	1855 1
+1358	2354 1
+1358	2398 1
+1358	2654 1
+1358	3755 1
+1358	4037 1
+1358	4884 1
+1358	5028 1
+1358	5484 1
+1358	7478 1
+1365	432 1
+1365	1075 1
+1365	2774 1
+1365	3238 1
+1365	6790 1
+1365	6914 1
+1365	7795 1
+1366	1075 1
+1367	204 1
+1367	285 1
+1367	417 1
+1367	432 1
+1367	810 1
+1367	856 1
+1367	959 1
+1367	974 1
+1367	1100 1
+1367	1157 1
+1367	1186 1
+1367	1297 1
+1367	1402 1
+1367	1538 1
+1367	1571 1
+1367	1679 1
+1367	2144 1
+1367	2290 1
+1367	2324 1
+1367	2398 1
+1367	2542 1
+1367	2565 1
+1367	2576 1
+1367	2623 1
+1367	2653 1
+1367	2660 1
+1367	2667 1
+1367	2674 1
+1367	2819 1
+1367	2973 1
+1367	3173 1
+1367	3348 1
+1367	3371 1
+1367	3465 1
+1367	3506 1
+1367	3520 1
+1367	3537 1
+1367	3548 1
+1367	3587 1
+1367	3609 1
+1368	407 1
+1368	771 1
+1368	959 1
+1368	1186 1
+1368	1261 1
+1368	1542 1
+1368	1622 1
+1368	1816 1
+1368	1842 1
+1368	1855 1
+1368	1859 1
+1368	1893 1
+1368	1927 1
+1368	1987 1
+1368	2210 1
+1368	2325 1
+1368	2397 1
+1368	2474 1
+1368	2565 1
+1368	2654 1
+1368	2662 1
+1368	3243 1
+1368	3265 1
+1368	3307 1
+1368	3557 1
+1368	3646 1
+1368	3717 1
+1368	3755 1
+1368	3772 1
+1368	3785 1
+1368	3843 1
+1368	4043 1
+1368	4051 1
+1369	3755 1
+1370	3755 1
+1375	1793 1
+1375	4098 1
+1375	4480 1
+1375	5886 1
+1373	762 1
+1373	1248 1
+1373	1375 1
+1373	1435 1
+1374	56 1
+1374	72 1
+1374	171 1
+1374	204 1
+1374	230 1
+1374	285 1
+1374	290 1
+1374	298 1
+1374	407 1
+1374	425 1
+1374	559 1
+1374	579 1
+1374	608 1
+1374	633 1
+1374	665 1
+1374	737 1
+1374	762 1
+1374	765 1
+1374	826 1
+1374	840 1
+1374	856 1
+1374	896 1
+1374	904 1
+1374	959 1
+1374	967 1
+1374	974 1
+1374	1022 1
+1374	1034 1
+1374	1049 1
+1374	1103 1
+1374	1111 1
+1374	1127 1
+1374	1151 1
+1374	1165 1
+1374	1166 1
+1374	1167 1
+1374	1191 1
+1374	1199 1
+1374	1247 1
+1374	1253 1
+1374	1267 1
+1374	1285 1
+1374	1297 1
+1374	1322 1
+1374	1353 1
+1374	1375 1
+1374	1384 1
+1374	1393 1
+1374	1403 1
+1374	1411 1
+1374	1419 1
+1374	1464 1
+1374	1473 1
+1374	1506 1
+1374	1521 1
+1374	1534 1
+1374	1549 1
+1374	1573 1
+1374	1580 1
+1374	1585 1
+1374	1633 1
+1374	1637 1
+1374	1646 1
+1374	1648 1
+1374	1653 1
+1374	1679 1
+1374	1680 1
+1374	1705 1
+1374	1717 1
+1374	1730 1
+1374	1733 1
+1374	1746 1
+1374	1749 1
+1374	1757 1
+1374	1772 1
+1374	1774 1
+1374	1788 1
+1374	1792 1
+1374	1799 1
+1374	1805 1
+1374	1808 1
+1374	1814 1
+1374	1847 1
+1374	1849 1
+1374	1855 1
+1374	1858 1
+1374	1865 1
+1374	1888 1
+1374	1903 1
+1374	1918 1
+1374	1919 1
+1374	1956 1
+1374	1973 1
+1374	1982 1
+1374	1990 1
+1374	1991 1
+1374	2001 1
+1374	2066 1
+1374	2071 1
+1374	2095 1
+1374	2102 1
+1374	2106 1
+1374	2109 1
+1374	2116 1
+1374	2117 1
+1374	2120 1
+1374	2121 1
+1374	2135 1
+1374	2137 1
+1374	2145 1
+1374	2151 1
+1374	2157 1
+1374	2168 1
+1374	2174 1
+1374	2181 1
+1374	2193 1
+1374	2202 1
+1374	2223 1
+1374	2225 1
+1374	2246 1
+1374	2253 1
+1374	2257 1
+1374	2258 1
+1374	2264 1
+1374	2273 1
+1374	2307 1
+1374	2322 1
+1374	2323 1
+1374	2325 1
+1374	2338 1
+1374	2354 1
+1374	2369 1
+1374	2375 1
+1374	2397 1
+1374	2398 1
+1374	2410 1
+1374	2470 1
+1374	2485 1
+1374	2490 1
+1374	2508 1
+1374	2516 1
+1374	2535 1
+1374	2547 1
+1374	2560 1
+1374	2565 1
+1374	2576 1
+1374	2585 1
+1374	2593 1
+1374	2623 1
+1374	2625 1
+1374	2643 1
+1374	2654 1
+1374	2658 1
+1374	2665 1
+1374	2685 1
+1374	2687 1
+1374	2713 1
+1374	2747 1
+1374	2754 1
+1374	2763 1
+1374	2764 1
+1374	2768 1
+1374	2775 1
+1374	2785 1
+1374	2787 1
+1374	2794 1
+1374	2805 1
+1374	2809 1
+1374	2814 1
+1374	2822 1
+1374	2825 1
+1374	2828 1
+1374	2830 1
+1374	2831 1
+1374	2834 1
+1374	2838 1
+1374	2859 1
+1374	2877 1
+1374	2909 1
+1374	2912 1
+1374	2922 1
+1374	2928 1
+1374	2955 1
+1374	2963 1
+1374	2966 1
+1374	2977 1
+1374	3005 1
+1374	3018 1
+1374	3020 1
+1374	3030 1
+1374	3084 1
+1374	3089 1
+1374	3114 1
+1374	3117 1
+1374	3136 1
+1374	3164 1
+1374	3238 1
+1374	3243 1
+1374	3251 1
+1374	3258 1
+1374	3260 1
+1374	3265 1
+1374	3274 1
+1374	3276 1
+1374	3293 1
+1374	3297 1
+1374	3307 1
+1374	3310 1
+1374	3334 1
+1374	3338 1
+1374	3348 1
+1374	3351 1
+1374	3352 1
+1374	3371 1
+1374	3381 1
+1374	3393 1
+1374	3408 1
+1374	3417 1
+1374	3435 1
+1374	3456 1
+1374	3459 1
+1374	3506 1
+1374	3529 1
+1374	3554 1
+1374	3562 1
+1374	3631 1
+1374	3720 1
+1374	3726 1
+1374	3752 1
+1374	3755 1
+1374	3830 1
+1374	3843 1
+1374	3871 1
+1374	3887 1
+1374	3897 1
+1374	3910 1
+1374	3958 1
+1374	3962 1
+1374	3973 1
+1374	3976 1
+1374	4037 1
+1374	4055 1
+1374	4071 1
+1374	4098 1
+1374	4099 1
+1374	4110 1
+1374	4124 1
+1374	4179 1
+1374	4191 1
+1374	4233 1
+1374	4247 1
+1374	4269 1
+1374	4276 1
+1374	4310 1
+1374	4335 1
+1374	4338 1
+1374	4341 1
+1374	4361 1
+1374	4435 1
+1374	4448 1
+1374	4530 1
+1374	4534 1
+1374	4536 1
+1374	4600 1
+1374	4632 1
+1374	4653 1
+1374	4666 1
+1374	4712 1
+1374	4777 1
+1374	4797 1
+1374	4846 1
+1374	4875 1
+1374	4964 1
+1374	4977 1
+1374	4981 1
+1374	5002 1
+1374	5012 1
+1374	5020 1
+1374	5022 1
+1374	5028 1
+1374	5072 1
+1374	5079 1
+1374	5083 1
+1374	5092 1
+1374	5123 1
+1374	5148 1
+1374	5155 1
+1374	5162 1
+1374	5176 1
+1374	5189 1
+1374	5199 1
+1374	5210 1
+1374	5233 1
+1374	5246 1
+1374	5254 1
+1374	5263 1
+1374	5288 1
+1374	5301 1
+1374	5321 1
+1374	5323 1
+1374	5335 1
+1374	5341 1
+1374	5384 1
+1374	5392 1
+1374	5404 1
+1374	5412 1
+1374	5423 1
+1374	5445 1
+1374	5449 1
+1374	5452 1
+1374	5454 1
+1374	5463 1
+1374	5465 1
+1374	5482 1
+1374	5484 1
+1374	5500 1
+1374	5509 1
+1374	5511 1
+1374	5529 1
+1374	5539 1
+1374	5568 1
+1374	5605 1
+1374	5637 1
+1374	5671 1
+1374	5683 1
+1374	5693 1
+1374	5697 1
+1374	5714 1
+1374	5721 1
+1374	5732 1
+1374	5737 1
+1374	5743 1
+1374	5760 1
+1374	5773 1
+1374	5780 1
+1374	5790 1
+1374	5807 1
+1374	5814 1
+1374	5817 1
+1374	5828 1
+1374	5837 1
+1374	5839 1
+1374	5844 1
+1374	5871 1
+1374	5886 1
+1374	5891 1
+1374	5897 1
+1374	5902 1
+1374	5922 1
+1374	5933 1
+1374	5947 1
+1374	6004 1
+1374	6032 1
+1374	6043 1
+1374	6044 1
+1374	6151 1
+1374	6174 1
+1374	6241 1
+1374	6299 1
+1374	6320 1
+1374	6330 1
+1374	6347 1
+1374	6414 1
+1374	6496 1
+1374	6523 1
+1374	6555 1
+1374	6560 1
+1374	6624 1
+1374	6634 1
+1374	6774 1
+1374	6783 1
+1374	6784 1
+1374	6789 1
+1374	6790 1
+1374	6803 1
+1374	6850 1
+1374	6855 1
+1374	6875 1
+1374	6914 1
+1374	6918 1
+1374	6934 1
+1374	6946 1
+1374	6980 1
+1374	7005 1
+1374	7021 1
+1374	7047 1
+1374	7052 1
+1374	7054 1
+1374	7059 1
+1374	7088 1
+1374	7092 1
+1374	7094 1
+1374	7108 1
+1374	7120 1
+1374	7131 1
+1374	7214 1
+1374	7225 1
+1374	7233 1
+1374	7237 1
+1374	7277 1
+1374	7280 1
+1374	7295 1
+1374	7301 1
+1374	7351 1
+1374	7373 1
+1374	7378 1
+1374	7386 1
+1374	7391 1
+1374	7400 1
+1374	7443 1
+1374	7510 1
+1374	7512 1
+1374	7529 1
+1374	7544 1
+1374	7553 1
+1374	7561 1
+1374	7587 1
+1374	7620 1
+1374	7632 1
+1374	7646 1
+1374	7649 1
+1374	7651 1
+1374	7683 1
+1374	7699 1
+1374	7707 1
+1374	7726 1
+1374	7757 1
+1374	7763 1
+1374	7788 1
+1374	7795 1
+1374	7803 1
+1374	7809 1
+1374	7813 1
+1374	7839 1
+1374	7855 1
+1374	7860 1
+1374	7862 1
+1374	7871 1
+1374	7879 1
+1374	7882 1
+1374	7890 1
+1374	7908 1
+1374	7910 1
+1374	7912 1
+1374	7979 1
+1374	7992 1
+1374	8002 1
+1374	8037 1
+1374	8083 1
+1374	8121 1
+1374	8122 1
+1374	8128 1
+1374	8163 1
+1374	8168 1
+1374	8174 1
+1374	8192 1
+1374	8198 1
+1374	8290 1
+1374	8292 1
+1374	8293 1
+1374	8294 1
+1374	8297 1
+1382	1100 1
+1382	1211 1
+1382	1297 1
+1382	1453 1
+1382	1777 1
+1382	2257 1
+1382	2397 1
+1382	2411 1
+1382	2485 1
+1382	2654 1
+1382	2657 1
+1382	2727 1
+1382	3005 1
+1382	3480 1
+1382	3646 1
+1382	3745 1
+1382	3875 1
+1376	1382 1
+1377	407 1
+1377	826 1
+1377	871 1
+1377	960 1
+1377	1022 1
+1377	1034 1
+1377	1164 1
+1377	1168 1
+1377	1234 1
+1377	1253 1
+1377	1279 1
+1377	1297 1
+1377	1382 1
+1377	1396 1
+1377	1402 1
+1377	1484 1
+1377	1490 1
+1377	1496 1
+1377	1514 1
+1377	1518 1
+1377	1569 1
+1377	1597 1
+1377	1652 1
+1377	1661 1
+1377	1774 1
+1377	1783 1
+1377	1805 1
+1377	1819 1
+1377	1842 1
+1377	1966 1
+1377	2580 1
+1377	3755 1
+1377	5412 1
+1378	762 1
+1378	935 1
+1378	1284 1
+1378	1382 1
+1378	1453 1
+1378	1723 1
+1378	1726 1
+1378	1965 1
+1378	1966 1
+1378	1977 1
+1378	2071 1
+1378	2079 1
+1378	2246 1
+1378	2371 1
+1379	1382 1
+1380	214 1
+1380	230 1
+1380	717 1
+1380	762 1
+1380	871 1
+1380	928 1
+1380	963 1
+1380	971 1
+1380	974 1
+1380	975 1
+1380	993 1
+1380	1031 1
+1380	1127 1
+1380	1140 1
+1380	1167 1
+1380	1201 1
+1380	1203 1
+1380	1234 1
+1380	1253 1
+1380	1297 1
+1380	1319 1
+1380	1374 1
+1380	1377 1
+1380	1382 1
+1380	1402 1
+1380	1407 1
+1380	1413 1
+1380	1418 1
+1380	1420 1
+1380	1425 1
+1380	1439 1
+1380	1453 1
+1380	1464 1
+1380	1468 1
+1380	1471 1
+1380	1476 1
+1380	1487 1
+1380	1492 1
+1380	1513 1
+1380	1518 1
+1380	1538 1
+1380	1547 1
+1380	1573 1
+1380	1621 1
+1380	1638 1
+1380	1705 1
+1380	1754 1
+1380	1772 1
+1380	1774 1
+1380	1787 1
+1380	1792 1
+1380	1956 1
+1380	2062 1
+1380	2066 1
+1380	2073 1
+1380	2117 1
+1380	2119 1
+1380	2151 1
+1380	2193 1
+1380	2400 1
+1380	2517 1
+1380	2625 1
+1380	8292 1
+1381	813 1
+1381	913 1
+1381	948 1
+1381	993 1
+1381	1014 1
+1381	1164 1
+1381	1253 1
+1381	1297 1
+1381	1315 1
+1381	1378 1
+1381	1382 1
+1381	1453 1
+1381	1482 1
+1381	1514 1
+1381	1566 1
+1381	1610 1
+1381	1613 1
+1381	1622 1
+1381	1662 1
+1381	1688 1
+1381	1705 1
+1381	1780 1
+1381	1805 1
+1381	1908 1
+1381	1992 1
+1381	2016 1
+1381	2066 1
+1381	2137 1
+1381	2165 1
+1381	2371 1
+1381	2378 1
+1381	2398 1
+1381	2485 1
+1381	2560 1
+1381	2653 1
+1381	2696 1
+1381	2697 1
+1381	2880 1
+1381	2966 1
+1381	3026 1
+1381	3059 1
+1381	3144 1
+1381	3173 1
+1381	3192 1
+1381	3537 1
+1381	3634 1
+1381	3748 1
+1381	3755 1
+1381	3897 1
+1381	5026 1
+1381	5323 1
+1381	6347 1
+1383	1384 1
+1383	1389 1
+1383	2963 1
+1383	4179 1
+1384	56 1
+1384	762 1
+1384	1049 1
+1384	1154 1
+1384	1374 1
+1384	1389 1
+1384	1416 1
+1384	1549 1
+1384	1564 1
+1384	1593 1
+1384	1837 1
+1384	1847 1
+1384	1956 1
+1384	2542 1
+1384	2565 1
+1384	2653 1
+1384	2655 1
+1384	2660 1
+1384	2686 1
+1384	2727 1
+1384	2751 1
+1384	2809 1
+1384	2814 1
+1384	2828 1
+1384	3180 1
+1384	3258 1
+1384	3489 1
+1384	3506 1
+1384	3537 1
+1384	3587 1
+1384	3717 1
+1384	3755 1
+1384	4021 1
+1384	4049 1
+1384	4110 1
+1384	4179 1
+1384	8293 1
+1385	579 1
+1385	1389 1
+1385	1593 1
+1385	2323 1
+1385	2612 1
+1385	2999 1
+1385	3164 1
+1385	3238 1
+1385	3319 1
+1385	3346 1
+1385	3439 1
+1385	4037 1
+1385	4071 1
+1385	4099 1
+1385	4179 1
+1385	4781 1
+1385	4884 1
+1385	4999 1
+1385	5012 1
+1385	5022 1
+1385	5200 1
+1385	5233 1
+1385	5614 1
+1385	6004 1
+1385	6299 1
+1385	6833 1
+1385	7092 1
+1385	7279 1
+1385	7351 1
+1385	7478 1
+1385	7694 1
+1385	7699 1
+1385	7890 1
+1385	7992 1
+1385	8002 1
+1386	298 1
+1386	559 1
+1386	579 1
+1386	761 1
+1386	763 1
+1386	771 1
+1386	813 1
+1386	836 1
+1386	887 1
+1386	928 1
+1386	935 1
+1386	937 1
+1386	948 1
+1386	960 1
+1386	975 1
+1386	1127 1
+1386	1164 1
+1386	1203 1
+1386	1211 1
+1386	1236 1
+1386	1248 1
+1386	1253 1
+1386	1353 1
+1386	1389 1
+1386	1413 1
+1386	1420 1
+1386	1425 1
+1386	1428 1
+1386	1444 1
+1386	1482 1
+1386	1489 1
+1386	1496 1
+1386	1518 1
+1386	1525 1
+1386	1534 1
+1386	1555 1
+1386	1566 1
+1386	1585 1
+1386	1595 1
+1386	1622 1
+1386	1641 1
+1386	1649 1
+1386	1717 1
+1386	1772 1
+1386	1774 1
+1386	1791 1
+1386	1805 1
+1386	1842 1
+1386	1848 1
+1386	1858 1
+1386	1893 1
+1386	1901 1
+1386	1903 1
+1386	1927 1
+1386	1953 1
+1386	1966 1
+1386	1973 1
+1386	2071 1
+1386	2085 1
+1386	2205 1
+1386	2241 1
+1387	1389 1
+1388	1384 1
+1388	1389 1
+1394	887 1
+1394	960 1
+1394	1167 1
+1394	1390 1
+1394	1437 1
+1394	1464 1
+1394	1472 1
+1394	1496 1
+1394	1758 1
+1390	290 1
+1390	417 1
+1390	762 1
+1390	1186 1
+1390	1211 1
+1390	1297 1
+1390	1377 1
+1390	1394 1
+1390	1420 1
+1390	1679 1
+1390	1705 1
+1390	1992 1
+1390	2151 1
+1390	2174 1
+1390	2264 1
+1390	2297 1
+1390	2322 1
+1390	2323 1
+1390	2325 1
+1390	2599 1
+1390	2654 1
+1390	2665 1
+1390	2707 1
+1390	2721 1
+1390	2844 1
+1390	2880 1
+1390	3009 1
+1390	3018 1
+1390	3020 1
+1390	3099 1
+1390	3516 1
+1390	3755 1
+1391	1394 1
+1392	1394 1
+1392	1525 1
+1393	1394 1
+1393	2575 1
+1393	5263 1
+1393	5484 1
+1395	15 1
+1395	171 1
+1395	204 1
+1395	298 1
+1395	332 1
+1395	403 1
+1395	407 1
+1395	579 1
+1395	587 1
+1395	722 1
+1395	762 1
+1395	763 1
+1395	836 1
+1395	840 1
+1395	861 1
+1395	904 1
+1395	935 1
+1395	946 1
+1395	947 1
+1395	959 1
+1395	975 1
+1395	978 1
+1395	993 1
+1395	1018 1
+1395	1031 1
+1395	1035 1
+1395	1049 1
+1395	1111 1
+1395	1164 1
+1395	1168 1
+1395	1186 1
+1395	1200 1
+1395	1201 1
+1395	1236 1
+1395	1243 1
+1395	1248 1
+1395	1250 1
+1395	1253 1
+1395	1267 1
+1395	1284 1
+1395	1285 1
+1395	1291 1
+1395	1297 1
+1395	1319 1
+1395	1322 1
+1395	1353 1
+1395	1357 1
+1395	1378 1
+1395	1384 1
+1395	1390 1
+1395	1396 1
+1395	1407 1
+1395	1419 1
+1395	1428 1
+1395	1444 1
+1395	1453 1
+1395	1471 1
+1395	1482 1
+1395	1492 1
+1395	1501 1
+1395	1514 1
+1395	1534 1
+1395	1538 1
+1395	1547 1
+1395	1550 1
+1395	1555 1
+1395	1566 1
+1395	1580 1
+1395	1583 1
+1395	1597 1
+1395	1603 1
+1395	1604 1
+1395	1608 1
+1395	1613 1
+1395	1618 1
+1395	1621 1
+1395	1628 1
+1395	1641 1
+1395	1669 1
+1395	1697 1
+1395	1700 1
+1395	1701 1
+1395	1705 1
+1395	1714 1
+1395	1723 1
+1395	1729 1
+1395	1730 1
+1395	1734 1
+1395	1754 1
+1395	1781 1
+1395	1792 1
+1395	1798 1
+1395	1811 1
+1395	1816 1
+1395	1836 1
+1395	1842 1
+1395	1847 1
+1395	1848 1
+1395	1849 1
+1395	1858 1
+1395	1859 1
+1395	1880 1
+1395	1901 1
+1395	1903 1
+1395	1927 1
+1395	1964 1
+1395	1965 1
+1395	1966 1
+1395	1969 1
+1395	1973 1
+1395	1979 1
+1395	1983 1
+1395	1985 1
+1395	1987 1
+1395	1992 1
+1395	1997 1
+1395	2062 1
+1395	2066 1
+1395	2071 1
+1395	2072 1
+1395	2076 1
+1395	2085 1
+1395	2097 1
+1395	2106 1
+1395	2109 1
+1395	2114 1
+1395	2117 1
+1395	2120 1
+1395	2137 1
+1395	2145 1
+1395	2151 1
+1395	2168 1
+1395	2174 1
+1395	2178 1
+1395	2181 1
+1395	2193 1
+1395	2202 1
+1395	2225 1
+1395	2240 1
+1395	2241 1
+1395	2246 1
+1395	2251 1
+1395	2264 1
+1395	2297 1
+1395	2322 1
+1395	2328 1
+1395	2329 1
+1395	2333 1
+1395	2341 1
+1395	2356 1
+1395	2385 1
+1395	2397 1
+1395	2400 1
+1395	2410 1
+1395	2435 1
+1395	2456 1
+1395	2516 1
+1395	2547 1
+1395	2560 1
+1395	2576 1
+1395	2579 1
+1395	2625 1
+1395	2667 1
+1395	2685 1
+1395	2686 1
+1395	2697 1
+1395	2707 1
+1395	2760 1
+1395	2763 1
+1395	2794 1
+1395	2805 1
+1395	2830 1
+1395	2834 1
+1395	2856 1
+1395	2955 1
+1395	2963 1
+1395	3026 1
+1395	3029 1
+1395	3033 1
+1395	3059 1
+1395	3136 1
+1395	3150 1
+1395	3192 1
+1395	3265 1
+1395	3404 1
+1395	3892 1
+1395	3970 1
+1395	4110 1
+1395	4117 1
+1395	4261 1
+1395	4263 1
+1395	4600 1
+1395	4706 1
+1395	5445 1
+1395	6227 1
+1395	6229 1
+1395	6790 1
+1395	7649 1
+1395	8293 1
+1397	1402 1
+1398	1402 1
+1399	1402 1
+1400	1402 1
+1400	1633 1
+1400	1849 1
+1401	1402 1
+1401	5103 1
+1401	6347 1
+1403	1199 1
+1403	1412 1
+1403	2079 1
+1404	1412 1
+1405	1412 1
+1411	1412 1
+1406	1411 1
+1406	1412 1
+1407	993 1
+1407	1412 1
+1407	1772 1
+1408	1412 1
+1409	1412 1
+1410	1412 1
+1416	1127 1
+1416	1384 1
+1416	1633 1
+1416	2109 1
+1416	2307 1
+1416	2426 1
+1416	2576 1
+1416	2700 1
+1416	3020 1
+1416	3030 1
+1416	3140 1
+1416	3309 1
+1416	5384 1
+1420	761 1
+1420	1322 1
+1420	1525 1
+1420	1587 1
+1420	1633 1
+1420	1638 1
+1420	1654 1
+1420	1752 1
+1420	1780 1
+1420	2151 1
+1420	2165 1
+1420	2211 1
+1419	350 1
+1419	1049 1
+1419	1111 1
+1419	1291 1
+1419	1323 1
+1419	1384 1
+1419	1420 1
+1419	1521 1
+1419	1564 1
+1419	1992 1
+1419	2114 1
+1419	2157 1
+1419	2256 1
+1419	2277 1
+1419	2294 1
+1419	2297 1
+1419	2323 1
+1419	2338 1
+1419	2366 1
+1419	2576 1
+1419	2617 1
+1419	2623 1
+1419	2657 1
+1419	2665 1
+1419	2669 1
+1419	2670 1
+1419	2685 1
+1419	2720 1
+1419	2736 1
+1419	2815 1
+1419	3029 1
+1419	3056 1
+1419	3253 1
+1419	3408 1
+1419	3473 1
+1419	3489 1
+1419	3516 1
+1419	3548 1
+1419	3807 1
+1419	5732 1
+1419	8293 1
+1421	1411 1
+1421	1425 1
+1422	1425 1
+1423	826 1
+1423	960 1
+1423	1425 1
+1423	1569 1
+1423	1573 1
+1423	1648 1
+1423	1864 1
+1423	2843 1
+1424	826 1
+1424	871 1
+1424	887 1
+1424	907 1
+1424	1164 1
+1424	1167 1
+1424	1201 1
+1424	1234 1
+1424	1236 1
+1424	1291 1
+1424	1297 1
+1424	1357 1
+1424	1377 1
+1424	1416 1
+1424	1425 1
+1424	1428 1
+1424	1464 1
+1424	1478 1
+1424	1482 1
+1424	1484 1
+1424	1485 1
+1424	1549 1
+1424	1556 1
+1424	1563 1
+1424	1593 1
+1424	1595 1
+1424	1600 1
+1424	1603 1
+1424	1608 1
+1424	1618 1
+1424	1622 1
+1424	1792 1
+1424	1814 1
+1424	1919 1
+1424	1927 1
+1424	1966 1
+1424	1973 1
+1424	2073 1
+1424	2225 1
+1424	2251 1
+1424	2356 1
+1424	2371 1
+1424	2411 1
+1424	2501 1
+1424	2625 1
+1424	2819 1
+1424	3117 1
+1424	3126 1
+1424	3130 1
+1424	3155 1
+1424	3243 1
+1424	3453 1
+1426	1203 1
+1427	1203 1
+1427	1307 1
+1428	64 1
+1428	290 1
+1428	298 1
+1428	415 1
+1428	506 1
+1428	559 1
+1428	579 1
+1428	665 1
+1428	765 1
+1428	836 1
+1428	873 1
+1428	887 1
+1428	904 1
+1428	908 1
+1428	935 1
+1428	937 1
+1428	975 1
+1428	993 1
+1428	1000 1
+1428	1034 1
+1428	1103 1
+1428	1111 1
+1428	1124 1
+1428	1137 1
+1428	1151 1
+1428	1157 1
+1428	1164 1
+1428	1199 1
+1428	1200 1
+1428	1203 1
+1428	1211 1
+1428	1248 1
+1428	1279 1
+1428	1284 1
+1428	1291 1
+1428	1297 1
+1428	1319 1
+1428	1322 1
+1428	1326 1
+1428	1357 1
+1428	1374 1
+1428	1378 1
+1428	1390 1
+1428	1407 1
+1428	1444 1
+1428	1471 1
+1428	1482 1
+1428	1489 1
+1428	1496 1
+1428	1514 1
+1428	1520 1
+1428	1521 1
+1428	1534 1
+1428	1549 1
+1428	1555 1
+1428	1566 1
+1428	1583 1
+1428	1585 1
+1428	1613 1
+1428	1619 1
+1428	1622 1
+1428	1628 1
+1428	1629 1
+1428	1633 1
+1428	1636 1
+1428	1648 1
+1428	1649 1
+1428	1654 1
+1428	1661 1
+1428	1662 1
+1428	1672 1
+1428	1679 1
+1428	1680 1
+1428	1697 1
+1428	1701 1
+1428	1714 1
+1428	1717 1
+1428	1726 1
+1428	1734 1
+1428	1746 1
+1428	1747 1
+1428	1752 1
+1428	1754 1
+1428	1757 1
+1428	1758 1
+1428	1772 1
+1428	1774 1
+1428	1781 1
+1428	1787 1
+1428	1788 1
+1428	1791 1
+1428	1793 1
+1428	1798 1
+1428	1802 1
+1428	1805 1
+1428	1811 1
+1428	1816 1
+1428	1848 1
+1428	1849 1
+1428	1858 1
+1428	1859 1
+1428	1880 1
+1428	1893 1
+1428	1901 1
+1428	1903 1
+1428	1919 1
+1428	1927 1
+1428	1956 1
+1428	1963 1
+1428	1965 1
+1428	1966 1
+1428	1969 1
+1428	1973 1
+1428	1979 1
+1428	1983 1
+1428	1985 1
+1428	1987 1
+1428	2004 1
+1428	2007 1
+1428	2060 1
+1428	2066 1
+1428	2073 1
+1428	2085 1
+1428	2091 1
+1428	2095 1
+1428	2106 1
+1428	2114 1
+1428	2119 1
+1428	2121 1
+1428	2137 1
+1428	2151 1
+1428	2165 1
+1428	2168 1
+1428	2202 1
+1428	2210 1
+1428	2211 1
+1428	2252 1
+1428	2256 1
+1428	2276 1
+1428	2290 1
+1428	2324 1
+1428	2328 1
+1428	2333 1
+1428	2411 1
+1428	2499 1
+1428	2506 1
+1428	2510 1
+1428	2550 1
+1428	2593 1
+1428	2617 1
+1428	2625 1
+1428	2629 1
+1428	2679 1
+1428	2685 1
+1428	2693 1
+1428	2805 1
+1428	2859 1
+1428	2871 1
+1428	2932 1
+1428	2958 1
+1428	2973 1
+1428	3005 1
+1428	3021 1
+1428	3033 1
+1428	3080 1
+1428	3104 1
+1428	3117 1
+1428	3136 1
+1428	3192 1
+1428	3258 1
+1428	3717 1
+1428	3811 1
+1428	3835 1
+1428	3843 1
+1428	3970 1
+1428	4055 1
+1428	4179 1
+1428	4349 1
+1428	4706 1
+1428	4875 1
+1428	5002 1
+1428	7005 1
+1428	8290 1
+1429	963 1
+1429	1203 1
+1429	1319 1
+1430	1203 1
+1430	1307 1
+1431	1203 1
+1433	1428 1
+1434	1435 1
+1434	1439 1
+1436	963 1
+1184	56 1
+1184	72 1
+1184	204 1
+1184	214 1
+1184	403 1
+1184	765 1
+1184	963 1
+1184	1018 1
+1184	1166 1
+1184	1167 1
+1184	1186 1
+1184	1211 1
+1184	1284 1
+1184	1319 1
+1184	1357 1
+1184	1374 1
+1184	1496 1
+1184	1497 1
+1184	1538 1
+1184	1564 1
+1184	1585 1
+1184	1705 1
+1184	1718 1
+1184	1808 1
+1184	1835 1
+1184	1842 1
+1184	1855 1
+1184	1956 1
+1184	1984 1
+1184	2053 1
+1184	2066 1
+1184	2120 1
+1184	2145 1
+1184	2151 1
+1184	2157 1
+1184	2322 1
+1184	2340 1
+1184	2375 1
+1184	2411 1
+1184	2504 1
+1184	2517 1
+1184	2599 1
+1184	2643 1
+1184	2777 1
+1184	2781 1
+1184	2787 1
+1184	2797 1
+1184	2801 1
+1184	2811 1
+1184	2834 1
+1184	2877 1
+1184	2922 1
+1184	2926 1
+1184	2963 1
+1184	3034 1
+1184	3309 1
+1184	3352 1
+1184	3443 1
+1184	3453 1
+1184	3455 1
+1184	3635 1
+1184	4011 1
+1184	4037 1
+1184	4040 1
+1184	4212 1
+1184	4261 1
+1184	4613 1
+1184	4631 1
+1184	4648 1
+1184	4661 1
+1184	4719 1
+1184	4735 1
+1184	4796 1
+1184	4797 1
+1184	4809 1
+1184	5412 1
+1184	6098 1
+1184	8290 1
+1184	8292 1
+1438	1326 1
+1440	978 1
+1439	928 1
+1439	978 1
+1439	1234 1
+1439	1236 1
+1439	1319 1
+1439	1484 1
+1439	1518 1
+1439	1538 1
+1439	1814 1
+1441	407 1
+1441	761 1
+1441	871 1
+1441	904 1
+1441	937 1
+1441	946 1
+1441	978 1
+1441	993 1
+1441	1031 1
+1441	1103 1
+1441	1186 1
+1441	1199 1
+1441	1201 1
+1441	1253 1
+1441	1261 1
+1441	1297 1
+1441	1428 1
+1441	1486 1
+1441	1514 1
+1441	1525 1
+1441	1610 1
+1441	1612 1
+1441	1638 1
+1441	1662 1
+1441	1752 1
+1441	1757 1
+1441	1768 1
+1441	1780 1
+1441	1783 1
+1441	1787 1
+1441	1991 1
+1441	2062 1
+1441	2073 1
+1441	2097 1
+1441	2101 1
+1441	2106 1
+1441	2242 1
+1441	2348 1
+1441	2397 1
+1441	8290 1
+1441	8291 1
+1446	1442 1
+1446	1444 1
+1446	3371 1
+1442	64 1
+1442	314 1
+1442	813 1
+1442	993 1
+1442	1000 1
+1442	1234 1
+1442	1297 1
+1442	1319 1
+1442	1428 1
+1442	1444 1
+1442	1446 1
+1442	1487 1
+1442	1496 1
+1442	1525 1
+1442	1538 1
+1442	1555 1
+1442	1774 1
+1442	1780 1
+1442	1787 1
+1442	1864 1
+1443	971 1
+1443	1319 1
+1443	1446 1
+1444	1442 1
+1444	1446 1
+1445	1446 1
+1447	1234 1
+1447	1428 1
+1447	1439 1
+1447	1490 1
+1447	1593 1
+1447	1618 1
+1447	1641 1
+1448	1319 1
+1449	1319 1
+1450	1319 1
+1451	1319 1
+1451	1322 1
+1451	1618 1
+1452	1453 1
+1454	1464 1
+1455	1464 1
+1456	1464 1
+1457	813 1
+1457	1464 1
+1457	2371 1
+1457	2696 1
+1457	3748 1
+1458	1464 1
+1459	1464 1
+1460	1464 1
+1461	1464 1
+1462	56 1
+1462	204 1
+1462	230 1
+1462	771 1
+1462	960 1
+1462	1012 1
+1462	1165 1
+1462	1186 1
+1462	1261 1
+1462	1377 1
+1462	1411 1
+1462	1428 1
+1462	1464 1
+1462	1497 1
+1462	1549 1
+1462	1569 1
+1462	1633 1
+1462	1701 1
+1462	1717 1
+1462	1842 1
+1462	1849 1
+1462	1864 1
+1462	1919 1
+1462	1920 1
+1462	2066 1
+1462	2128 1
+1462	2165 1
+1462	2285 1
+1462	2328 1
+1462	2398 1
+1462	2490 1
+1462	2508 1
+1462	2535 1
+1462	2544 1
+1462	2625 1
+1462	2643 1
+1462	2809 1
+1462	3456 1
+1462	4233 1
+1462	4247 1
+1462	5412 1
+1462	5449 1
+1462	5780 1
+1462	5828 1
+1462	5872 1
+1462	5963 1
+1462	5994 1
+1462	8293 1
+1463	403 1
+1463	762 1
+1463	765 1
+1463	1035 1
+1463	1279 1
+1463	1284 1
+1463	1464 1
+1463	1484 1
+1463	1596 1
+1463	1653 1
+1463	1808 1
+1463	1893 1
+1463	1992 1
+1463	2264 1
+1463	2542 1
+1463	2565 1
+1463	2585 1
+1463	2794 1
+1463	2963 1
+1463	3136 1
+1463	3144 1
+1463	3892 1
+1463	4219 1
+1463	4453 1
+1463	4944 1
+1463	5822 1
+1465	214 1
+1465	1049 1
+1465	1186 1
+1465	1357 1
+1465	1798 1
+1465	2323 1
+1465	2508 1
+1465	2542 1
+1468	290 1
+1468	346 1
+1468	762 1
+1468	1201 1
+1468	1385 1
+1468	1471 1
+1468	1476 1
+1468	2264 1
+1468	2397 1
+1468	2456 1
+1468	2646 1
+1468	3089 1
+1468	3645 1
+1468	4103 1
+1468	4212 1
+1468	4424 1
+1468	4796 1
+1468	4808 1
+1468	4814 1
+1468	4827 1
+1466	407 1
+1466	960 1
+1466	1055 1
+1466	1211 1
+1466	1319 1
+1466	1377 1
+1466	1428 1
+1466	1468 1
+1466	1476 1
+1466	1538 1
+1466	1593 1
+1466	1597 1
+1466	1633 1
+1466	1701 1
+1466	1718 1
+1466	2073 1
+1466	2264 1
+1466	2328 1
+1466	2329 1
+1466	2669 1
+1466	2764 1
+1466	3089 1
+1466	4247 1
+1466	4964 1
+1467	971 1
+1467	1230 1
+1467	1261 1
+1467	1441 1
+1467	1468 1
+1467	1497 1
+1467	2516 1
+1467	3664 1
+1467	4964 1
+1467	5144 1
+1467	5204 1
+1469	290 1
+1469	971 1
+1469	1603 1
+1469	1608 1
+1469	1672 1
+1469	3171 1
+1469	3755 1
+1470	15 1
+1470	56 1
+1470	72 1
+1470	290 1
+1470	737 1
+1470	762 1
+1470	871 1
+1470	887 1
+1470	904 1
+1470	946 1
+1470	959 1
+1470	971 1
+1470	974 1
+1470	1151 1
+1470	1164 1
+1470	1166 1
+1470	1167 1
+1470	1211 1
+1470	1234 1
+1470	1243 1
+1470	1247 1
+1470	1261 1
+1470	1297 1
+1470	1310 1
+1470	1319 1
+1470	1374 1
+1470	1385 1
+1470	1428 1
+1470	1471 1
+1470	1476 1
+1470	1482 1
+1470	1484 1
+1470	1487 1
+1470	1492 1
+1470	1496 1
+1470	1501 1
+1470	1555 1
+1470	1585 1
+1470	1603 1
+1470	1622 1
+1470	1641 1
+1470	1658 1
+1470	1661 1
+1470	1700 1
+1470	1701 1
+1470	1744 1
+1470	1774 1
+1470	1799 1
+1470	1816 1
+1470	1836 1
+1470	1857 1
+1470	1893 1
+1470	1918 1
+1470	1956 1
+1470	1966 1
+1470	1969 1
+1470	1977 1
+1470	2135 1
+1470	2144 1
+1470	2209 1
+1470	2252 1
+1470	2328 1
+1470	2354 1
+1470	2364 1
+1470	2381 1
+1470	2398 1
+1470	2411 1
+1470	2535 1
+1470	2576 1
+1470	2579 1
+1470	2592 1
+1470	2620 1
+1470	2625 1
+1470	2653 1
+1470	2662 1
+1470	2747 1
+1470	2768 1
+1470	2775 1
+1470	2790 1
+1470	2877 1
+1470	2923 1
+1470	3002 1
+1470	3005 1
+1470	3010 1
+1470	3089 1
+1470	3117 1
+1470	3130 1
+1470	3253 1
+1470	3276 1
+1470	3285 1
+1470	3346 1
+1470	3376 1
+1470	3393 1
+1470	3452 1
+1470	3456 1
+1470	3458 1
+1470	3473 1
+1470	3479 1
+1470	3498 1
+1470	3516 1
+1470	3537 1
+1470	3580 1
+1470	3587 1
+1470	3607 1
+1470	3614 1
+1470	3813 1
+1470	3897 1
+1470	3910 1
+1470	4013 1
+1470	4099 1
+1470	4124 1
+1470	4191 1
+1470	4297 1
+1470	4335 1
+1470	4400 1
+1470	4645 1
+1470	4687 1
+1470	4712 1
+1470	4735 1
+1470	4792 1
+1470	4795 1
+1470	4797 1
+1470	4983 1
+1470	5055 1
+1470	5130 1
+1470	5204 1
+1470	5210 1
+1470	5412 1
+1470	5439 1
+1470	5449 1
+1470	5527 1
+1470	5626 1
+1470	5706 1
+1470	5714 1
+1470	5798 1
+1470	6004 1
+1470	6006 1
+1470	6156 1
+1470	6229 1
+1470	6246 1
+1470	6251 1
+1470	6262 1
+1470	6306 1
+1470	6327 1
+1470	6328 1
+1470	6334 1
+1470	6337 1
+1470	6417 1
+1470	6432 1
+1470	6458 1
+1470	6474 1
+1470	6552 1
+1470	7092 1
+1470	7553 1
+1470	8292 1
+1470	8295 1
+1471	56 1
+1471	204 1
+1471	214 1
+1471	425 1
+1471	579 1
+1471	762 1
+1471	861 1
+1471	871 1
+1471	904 1
+1471	907 1
+1471	948 1
+1471	960 1
+1471	971 1
+1471	1026 1
+1471	1034 1
+1471	1167 1
+1471	1199 1
+1471	1211 1
+1471	1234 1
+1471	1248 1
+1471	1253 1
+1471	1279 1
+1471	1297 1
+1471	1322 1
+1471	1489 1
+1471	1490 1
+1471	1501 1
+1471	1514 1
+1471	1532 1
+1471	1556 1
+1471	1581 1
+1471	1603 1
+1471	1612 1
+1471	1628 1
+1471	1636 1
+1471	1641 1
+1471	1661 1
+1471	1672 1
+1471	1701 1
+1471	1726 1
+1471	1752 1
+1471	1758 1
+1471	1768 1
+1471	1880 1
+1471	1884 1
+1471	1956 1
+1471	2072 1
+1471	2160 1
+1471	2499 1
+1471	2535 1
+1471	3180 1
+1471	3238 1
+1471	3334 1
+1471	3456 1
+1471	3459 1
+1471	4037 1
+1471	4201 1
+1471	4263 1
+1471	4536 1
+1471	5012 1
+1471	5022 1
+1471	5079 1
+1471	5246 1
+1471	5596 1
+1471	5697 1
+1471	5897 1
+1471	5963 1
+1471	6272 1
+1471	6299 1
+1471	6720 1
+1471	6765 1
+1471	7855 1
+1472	907 1
+1473	204 1
+1473	372 1
+1473	403 1
+1473	425 1
+1473	579 1
+1473	665 1
+1473	763 1
+1473	856 1
+1473	907 1
+1473	908 1
+1473	913 1
+1473	960 1
+1473	993 1
+1473	1026 1
+1473	1111 1
+1473	1164 1
+1473	1166 1
+1473	1211 1
+1473	1279 1
+1473	1284 1
+1473	1357 1
+1473	1374 1
+1473	1419 1
+1473	1428 1
+1473	1487 1
+1473	1608 1
+1473	1646 1
+1473	1679 1
+1473	1688 1
+1473	1692 1
+1473	1697 1
+1473	1730 1
+1473	1747 1
+1473	1754 1
+1473	1780 1
+1473	1783 1
+1473	1793 1
+1473	1805 1
+1473	1836 1
+1473	1842 1
+1473	1855 1
+1473	1859 1
+1473	1880 1
+1473	1893 1
+1473	1919 1
+1473	1953 1
+1473	1963 1
+1473	1979 1
+1473	2004 1
+1473	2007 1
+1473	2060 1
+1473	2097 1
+1473	2102 1
+1473	2174 1
+1473	2225 1
+1473	2289 1
+1473	2375 1
+1473	2475 1
+1473	2499 1
+1473	2504 1
+1473	2560 1
+1473	2763 1
+1473	2790 1
+1473	2828 1
+1473	2871 1
+1473	2966 1
+1473	3136 1
+1473	3253 1
+1473	3408 1
+1473	3439 1
+1473	3473 1
+1473	3680 1
+1473	3903 1
+1473	3970 1
+1473	4071 1
+1473	4110 1
+1473	4266 1
+1473	4338 1
+1473	4706 1
+1473	4709 1
+1473	4719 1
+1473	4814 1
+1473	4827 1
+1473	5254 1
+1473	5445 1
+1473	5714 1
+1473	6833 1
+1473	7092 1
+1473	7115 1
+1473	7890 1
+1473	8002 1
+1474	907 1
+1474	2657 1
+1480	372 1
+1480	763 1
+1480	896 1
+1480	993 1
+1480	1000 1
+1480	1103 1
+1480	1165 1
+1480	1230 1
+1480	1253 1
+1480	1284 1
+1480	1407 1
+1480	1484 1
+1480	1492 1
+1480	1514 1
+1480	1534 1
+1480	1585 1
+1480	1622 1
+1480	1628 1
+1480	1633 1
+1480	1658 1
+1480	1700 1
+1480	1717 1
+1480	1758 1
+1480	1772 1
+1480	1780 1
+1480	1788 1
+1480	1791 1
+1480	1798 1
+1480	1802 1
+1480	1805 1
+1480	1811 1
+1480	1816 1
+1480	1842 1
+1480	1849 1
+1480	1859 1
+1480	1893 1
+1480	1901 1
+1480	1908 1
+1480	1979 1
+1480	1987 1
+1480	1992 1
+1480	2128 1
+1480	5614 1
+1480	8290 1
+1481	1484 1
+1482	415 1
+1482	908 1
+1482	1034 1
+1482	1035 1
+1482	1151 1
+1482	1164 1
+1482	1200 1
+1482	1297 1
+1482	1484 1
+1482	1496 1
+1482	1514 1
+1482	1547 1
+1482	1580 1
+1482	1585 1
+1482	1621 1
+1482	1622 1
+1482	1697 1
+1482	1701 1
+1482	1805 1
+1482	1816 1
+1482	1893 1
+1482	1903 1
+1482	1953 1
+1482	1966 1
+1482	1969 1
+1482	2066 1
+1483	290 1
+1483	579 1
+1483	771 1
+1483	813 1
+1483	826 1
+1483	871 1
+1483	887 1
+1483	960 1
+1483	1055 1
+1483	1167 1
+1483	1211 1
+1483	1234 1
+1483	1261 1
+1483	1279 1
+1483	1297 1
+1483	1377 1
+1483	1411 1
+1483	1428 1
+1483	1484 1
+1483	1487 1
+1483	1490 1
+1483	1496 1
+1483	1497 1
+1483	1507 1
+1483	1514 1
+1483	1525 1
+1483	1537 1
+1483	1538 1
+1483	1555 1
+1483	1573 1
+1483	1580 1
+1483	1595 1
+1483	1633 1
+1483	1649 1
+1483	1716 1
+1483	1717 1
+1483	1726 1
+1483	1758 1
+1483	1768 1
+1483	1774 1
+1483	1791 1
+1483	1798 1
+1483	1802 1
+1483	1805 1
+1483	1811 1
+1483	1842 1
+1483	1849 1
+1483	1859 1
+1483	1893 1
+1483	2843 1
+1483	3755 1
+1483	5500 1
+1488	1297 1
+1487	171 1
+1487	230 1
+1487	298 1
+1487	372 1
+1487	407 1
+1487	559 1
+1487	575 1
+1487	579 1
+1487	763 1
+1487	887 1
+1487	904 1
+1487	913 1
+1487	928 1
+1487	935 1
+1487	1034 1
+1487	1124 1
+1487	1165 1
+1487	1168 1
+1487	1199 1
+1487	1201 1
+1487	1211 1
+1487	1248 1
+1487	1253 1
+1487	1279 1
+1487	1297 1
+1487	1319 1
+1487	1322 1
+1487	1428 1
+1487	1442 1
+1487	1471 1
+1487	1489 1
+1487	1501 1
+1487	1520 1
+1487	1525 1
+1487	1534 1
+1487	1549 1
+1487	1610 1
+1487	1618 1
+1487	1619 1
+1487	1622 1
+1487	1629 1
+1487	1633 1
+1487	1638 1
+1487	1641 1
+1487	1648 1
+1487	1654 1
+1487	1658 1
+1487	1661 1
+1487	1662 1
+1487	1669 1
+1487	1672 1
+1487	1679 1
+1487	1689 1
+1487	1692 1
+1487	1701 1
+1487	1707 1
+1487	1718 1
+1487	1726 1
+1487	1732 1
+1487	1746 1
+1487	1747 1
+1487	1752 1
+1487	1757 1
+1487	1816 1
+1487	1836 1
+1487	1847 1
+1487	1855 1
+1487	1857 1
+1487	1858 1
+1487	1893 1
+1487	1901 1
+1487	1903 1
+1487	1908 1
+1487	1953 1
+1487	1969 1
+1487	1973 1
+1487	1979 1
+1487	1987 1
+1487	1991 1
+1487	2069 1
+1487	2073 1
+1487	2325 1
+1487	2338 1
+1487	2356 1
+1487	2474 1
+1487	2475 1
+1487	2565 1
+1487	2576 1
+1487	2593 1
+1487	2594 1
+1487	2619 1
+1487	2623 1
+1487	2625 1
+1487	2638 1
+1487	2643 1
+1487	2651 1
+1487	2665 1
+1487	2669 1
+1487	2700 1
+1487	2912 1
+1487	3020 1
+1487	3021 1
+1487	3030 1
+1487	3130 1
+1487	3265 1
+1487	3307 1
+1487	3338 1
+1487	3348 1
+1487	3351 1
+1487	3371 1
+1487	3376 1
+1487	3408 1
+1487	3435 1
+1487	3473 1
+1487	3489 1
+1487	8290 1
+1487	8293 1
+1489	204 1
+1489	407 1
+1489	579 1
+1489	797 1
+1489	993 1
+1489	1103 1
+1489	1140 1
+1489	1164 1
+1489	1167 1
+1489	1201 1
+1489	1234 1
+1489	1236 1
+1489	1253 1
+1489	1279 1
+1489	1297 1
+1489	1307 1
+1489	1374 1
+1489	1428 1
+1489	1482 1
+1489	1487 1
+1489	1490 1
+1489	1514 1
+1489	1520 1
+1489	1538 1
+1489	1555 1
+1489	1563 1
+1489	1573 1
+1489	1583 1
+1489	1593 1
+1489	1596 1
+1489	1600 1
+1489	1608 1
+1489	1621 1
+1489	1622 1
+1489	1653 1
+1489	1657 1
+1489	1662 1
+1489	1680 1
+1489	1700 1
+1489	1701 1
+1489	1768 1
+1489	1772 1
+1489	1816 1
+1489	1847 1
+1489	1855 1
+1489	1857 1
+1489	1893 1
+1489	1953 1
+1489	1969 1
+1489	1984 1
+1489	1997 1
+1489	2007 1
+1489	2055 1
+1489	2060 1
+1489	2062 1
+1489	2066 1
+1489	2182 1
+1489	2256 1
+1489	2281 1
+1489	2322 1
+1489	2345 1
+1489	2516 1
+1489	2570 1
+1489	8291 1
+1492	72 1
+1492	171 1
+1492	230 1
+1492	298 1
+1492	575 1
+1492	579 1
+1492	691 1
+1492	763 1
+1492	764 1
+1492	826 1
+1492	861 1
+1492	871 1
+1492	887 1
+1492	935 1
+1492	937 1
+1492	948 1
+1492	993 1
+1492	1000 1
+1492	1022 1
+1492	1032 1
+1492	1034 1
+1492	1035 1
+1492	1055 1
+1492	1103 1
+1492	1151 1
+1492	1164 1
+1492	1167 1
+1492	1168 1
+1492	1199 1
+1492	1200 1
+1492	1201 1
+1492	1211 1
+1492	1230 1
+1492	1236 1
+1492	1253 1
+1492	1279 1
+1492	1284 1
+1492	1297 1
+1492	1319 1
+1492	1377 1
+1492	1407 1
+1492	1428 1
+1492	1487 1
+1492	1489 1
+1492	1496 1
+1492	1506 1
+1492	1518 1
+1492	1520 1
+1492	1525 1
+1492	1534 1
+1492	1537 1
+1492	1538 1
+1492	1550 1
+1492	1555 1
+1492	1580 1
+1492	1585 1
+1492	1587 1
+1492	1593 1
+1492	1595 1
+1492	1597 1
+1492	1600 1
+1492	1603 1
+1492	1618 1
+1492	1619 1
+1492	1621 1
+1492	1622 1
+1492	1633 1
+1492	1641 1
+1492	1649 1
+1492	1652 1
+1492	1654 1
+1492	1658 1
+1492	1661 1
+1492	1689 1
+1492	1692 1
+1492	1700 1
+1492	1701 1
+1492	1726 1
+1492	1734 1
+1492	1747 1
+1492	1754 1
+1492	1772 1
+1492	1774 1
+1492	1783 1
+1492	1814 1
+1492	1816 1
+1492	1847 1
+1492	1858 1
+1492	1880 1
+1492	1888 1
+1492	1893 1
+1492	1901 1
+1492	1903 1
+1492	1908 1
+1492	1918 1
+1492	1919 1
+1492	1927 1
+1492	1966 1
+1492	1969 1
+1492	1987 1
+1492	1992 1
+1492	1997 1
+1492	2066 1
+1492	2073 1
+1492	2106 1
+1492	2128 1
+1492	2178 1
+1492	2225 1
+1492	2251 1
+1492	2256 1
+1492	2322 1
+1492	2328 1
+1492	2341 1
+1492	2384 1
+1492	2411 1
+1492	2474 1
+1492	2504 1
+1492	2585 1
+1492	2593 1
+1492	2595 1
+1492	2612 1
+1492	2618 1
+1492	2619 1
+1492	2653 1
+1492	2700 1
+1492	2713 1
+1492	2746 1
+1492	2830 1
+1492	2859 1
+1492	2912 1
+1492	2958 1
+1492	2981 1
+1492	3005 1
+1492	3020 1
+1492	3033 1
+1492	3117 1
+1492	3253 1
+1492	3258 1
+1492	3307 1
+1492	3338 1
+1492	3537 1
+1492	3568 1
+1492	3645 1
+1492	3897 1
+1492	4021 1
+1492	4037 1
+1492	4040 1
+1492	4043 1
+1492	4162 1
+1492	4422 1
+1492	4715 1
+1492	4735 1
+1492	4811 1
+1492	4964 1
+1492	5412 1
+1492	5844 1
+1492	8290 1
+1493	1167 1
+1494	1167 1
+1495	1164 1
+1495	1167 1
+1495	1201 1
+1495	1482 1
+1495	1514 1
+1495	1734 1
+1495	1816 1
+1495	1893 1
+1495	1973 1
+1495	2651 1
+1496	15 1
+1496	230 1
+1496	285 1
+1496	417 1
+1496	506 1
+1496	579 1
+1496	633 1
+1496	722 1
+1496	762 1
+1496	763 1
+1496	764 1
+1496	765 1
+1496	825 1
+1496	887 1
+1496	908 1
+1496	913 1
+1496	946 1
+1496	993 1
+1496	1000 1
+1496	1035 1
+1496	1097 1
+1496	1103 1
+1496	1151 1
+1496	1164 1
+1496	1166 1
+1496	1167 1
+1496	1186 1
+1496	1199 1
+1496	1200 1
+1496	1201 1
+1496	1211 1
+1496	1230 1
+1496	1248 1
+1496	1253 1
+1496	1261 1
+1496	1267 1
+1496	1279 1
+1496	1297 1
+1496	1307 1
+1496	1319 1
+1496	1322 1
+1496	1353 1
+1496	1357 1
+1496	1360 1
+1496	1377 1
+1496	1393 1
+1496	1416 1
+1496	1428 1
+1496	1482 1
+1496	1487 1
+1496	1492 1
+1496	1501 1
+1496	1514 1
+1496	1521 1
+1496	1555 1
+1496	1571 1
+1496	1585 1
+1496	1593 1
+1496	1603 1
+1496	1610 1
+1496	1618 1
+1496	1621 1
+1496	1622 1
+1496	1633 1
+1496	1646 1
+1496	1648 1
+1496	1653 1
+1496	1654 1
+1496	1658 1
+1496	1697 1
+1496	1700 1
+1496	1701 1
+1496	1718 1
+1496	1726 1
+1496	1734 1
+1496	1754 1
+1496	1772 1
+1496	1774 1
+1496	1780 1
+1496	1783 1
+1496	1791 1
+1496	1798 1
+1496	1808 1
+1496	1814 1
+1496	1816 1
+1496	1836 1
+1496	1842 1
+1496	1847 1
+1496	1849 1
+1496	1859 1
+1496	1880 1
+1496	1884 1
+1496	1893 1
+1496	1903 1
+1496	1908 1
+1496	1919 1
+1496	1953 1
+1496	1956 1
+1496	1966 1
+1496	1969 1
+1496	1973 1
+1496	1992 1
+1496	2001 1
+1496	2066 1
+1496	2071 1
+1496	2073 1
+1496	2114 1
+1496	2116 1
+1496	2117 1
+1496	2120 1
+1496	2121 1
+1496	2145 1
+1496	2211 1
+1496	2225 1
+1496	2241 1
+1496	2251 1
+1496	2256 1
+1496	2297 1
+1496	2324 1
+1496	2328 1
+1496	2381 1
+1496	2398 1
+1496	2410 1
+1496	2474 1
+1496	2504 1
+1496	2506 1
+1496	2510 1
+1496	2579 1
+1496	2585 1
+1496	2593 1
+1496	2594 1
+1496	2595 1
+1496	2597 1
+1496	2605 1
+1496	2618 1
+1496	2625 1
+1496	2646 1
+1496	2657 1
+1496	2660 1
+1496	2667 1
+1496	2685 1
+1496	2708 1
+1496	2713 1
+1496	2727 1
+1496	2746 1
+1496	2747 1
+1496	2794 1
+1496	2819 1
+1496	2856 1
+1496	2871 1
+1496	2877 1
+1496	2900 1
+1496	2923 1
+1496	2981 1
+1496	2996 1
+1496	3005 1
+1496	3007 1
+1496	3033 1
+1496	3136 1
+1496	3243 1
+1496	3251 1
+1496	3253 1
+1496	3258 1
+1496	3276 1
+1496	3371 1
+1496	3408 1
+1496	3456 1
+1496	3473 1
+1496	3489 1
+1496	3562 1
+1496	3586 1
+1496	3772 1
+1496	3830 1
+1496	3892 1
+1496	4040 1
+1496	4071 1
+1496	4099 1
+1496	4191 1
+1496	4261 1
+1496	4310 1
+1496	4400 1
+1496	4402 1
+1496	4411 1
+1496	4463 1
+1496	4709 1
+1496	4735 1
+1496	4875 1
+1496	5055 1
+1496	5106 1
+1496	5178 1
+1496	5210 1
+1496	5239 1
+1496	5288 1
+1496	5412 1
+1496	5452 1
+1496	5459 1
+1496	5484 1
+1496	5732 1
+1496	5863 1
+1496	5947 1
+1496	6458 1
+1496	6553 1
+1496	6914 1
+1496	7005 1
+1496	7632 1
+1496	7839 1
+1496	7890 1
+1496	8290 1
+1496	8291 1
+1496	8294 1
+1497	15 1
+1497	346 1
+1497	771 1
+1497	959 1
+1497	1167 1
+1497	1201 1
+1497	1234 1
+1497	1297 1
+1497	1322 1
+1497	1531 1
+1497	1538 1
+1497	1550 1
+1497	1556 1
+1497	1573 1
+1497	1580 1
+1497	1593 1
+1497	1956 1
+1497	2145 1
+1497	2151 1
+1497	2157 1
+1497	2297 1
+1497	2763 1
+1497	3020 1
+1497	4735 1
+1497	4875 1
+1497	5254 1
+1497	6229 1
+1497	8292 1
+1498	762 1
+1498	1167 1
+1498	3238 1
+1498	3456 1
+1498	4191 1
+1498	7651 1
+1499	56 1
+1499	1167 1
+1499	1497 1
+1499	1547 1
+1499	1573 1
+1499	1580 1
+1499	1597 1
+1499	1612 1
+1499	1658 1
+1499	1774 1
+1499	1956 1
+1499	2794 1
+1500	56 1
+1500	204 1
+1500	214 1
+1500	506 1
+1500	608 1
+1500	633 1
+1500	737 1
+1500	859 1
+1500	960 1
+1500	1097 1
+1500	1151 1
+1500	1167 1
+1500	1199 1
+1500	1297 1
+1500	1315 1
+1500	1497 1
+1500	1538 1
+1500	1569 1
+1500	1612 1
+1500	1717 1
+1500	1718 1
+1500	1956 1
+1500	2134 1
+1500	2174 1
+1500	2210 1
+1500	2240 1
+1500	2256 1
+1500	2323 1
+1500	2397 1
+1500	2508 1
+1500	2604 1
+1500	2625 1
+1500	2660 1
+1500	2777 1
+1500	2794 1
+1500	2801 1
+1500	2871 1
+1500	3018 1
+1500	3117 1
+1500	3193 1
+1500	3480 1
+1500	3615 1
+1500	4098 1
+1500	4138 1
+1500	4191 1
+1500	4299 1
+1500	4735 1
+1500	5253 1
+1501	64 1
+1501	407 1
+1501	506 1
+1501	762 1
+1501	871 1
+1501	904 1
+1501	946 1
+1501	993 1
+1501	1000 1
+1501	1103 1
+1501	1167 1
+1501	1261 1
+1501	1322 1
+1501	1437 1
+1501	1471 1
+1501	1496 1
+1501	1514 1
+1501	1564 1
+1501	1633 1
+1501	1687 1
+1501	1772 1
+1501	1787 1
+1501	1788 1
+1501	1793 1
+1501	1811 1
+1501	1861 1
+1501	1864 1
+1501	2225 1
+1501	2290 1
+1501	2397 1
+1501	2550 1
+1501	2651 1
+1501	2662 1
+1501	2951 1
+1501	3089 1
+1501	3117 1
+1501	3140 1
+1501	3171 1
+1506	290 1
+1506	559 1
+1506	771 1
+1506	974 1
+1506	993 1
+1506	1032 1
+1506	1297 1
+1506	1385 1
+1506	1489 1
+1506	1497 1
+1506	1520 1
+1506	1524 1
+1506	1531 1
+1506	1556 1
+1506	1649 1
+1506	1652 1
+1506	1654 1
+1506	1662 1
+1506	1672 1
+1506	1679 1
+1506	1680 1
+1506	1717 1
+1506	1849 1
+1506	1880 1
+1506	2062 1
+1506	2135 1
+1506	2160 1
+1506	2333 1
+1506	2504 1
+1506	2654 1
+1506	2674 1
+1506	2912 1
+1506	3020 1
+1506	3253 1
+1506	3276 1
+1506	3976 1
+1506	4349 1
+1506	4953 1
+1506	5683 1
+1506	6296 1
+1506	8134 1
+1502	1234 1
+1502	1506 1
+1503	1506 1
+1503	1563 1
+1503	1638 1
+1504	1506 1
+1504	1513 1
+1504	1533 1
+1504	1633 1
+1504	2231 1
+1504	2651 1
+1505	935 1
+1505	1506 1
+1505	1717 1
+1505	1893 1
+1507	2062 1
+1507	6576 1
+1511	1377 1
+1510	771 1
+1510	871 1
+1510	960 1
+1510	1032 1
+1510	1234 1
+1510	1377 1
+1510	1441 1
+1510	1497 1
+1510	1513 1
+1510	1518 1
+1510	1524 1
+1510	1531 1
+1510	1538 1
+1510	1556 1
+1510	1563 1
+1510	2843 1
+1512	1513 1
+1515	1441 1
+1516	1441 1
+1517	1441 1
+1519	1032 1
+1520	1018 1
+1520	1032 1
+1520	1253 1
+1521	298 1
+1521	403 1
+1521	579 1
+1521	871 1
+1521	904 1
+1521	937 1
+1521	993 1
+1521	1000 1
+1521	1049 1
+1521	1097 1
+1521	1111 1
+1521	1151 1
+1521	1166 1
+1521	1199 1
+1521	1201 1
+1521	1211 1
+1521	1230 1
+1521	1261 1
+1521	1267 1
+1521	1279 1
+1521	1319 1
+1521	1323 1
+1521	1374 1
+1521	1411 1
+1521	1419 1
+1521	1482 1
+1521	1487 1
+1521	1492 1
+1521	1496 1
+1521	1514 1
+1521	1583 1
+1521	1585 1
+1521	1608 1
+1521	1621 1
+1521	1633 1
+1521	1679 1
+1521	1700 1
+1521	1706 1
+1521	1714 1
+1521	1744 1
+1521	1746 1
+1521	1747 1
+1521	1768 1
+1521	1772 1
+1521	1780 1
+1521	1787 1
+1521	1791 1
+1521	1808 1
+1521	1814 1
+1521	1836 1
+1521	1842 1
+1521	1888 1
+1521	1893 1
+1521	1919 1
+1521	1964 1
+1521	1992 1
+1521	1997 1
+1521	2062 1
+1521	2066 1
+1521	2117 1
+1521	2120 1
+1521	2128 1
+1521	2174 1
+1521	2178 1
+1521	2225 1
+1521	2241 1
+1521	2297 1
+1521	2328 1
+1521	2341 1
+1521	2375 1
+1521	2385 1
+1521	2397 1
+1521	2400 1
+1521	2474 1
+1521	2485 1
+1521	2506 1
+1521	2510 1
+1521	2547 1
+1521	2594 1
+1521	2625 1
+1521	2653 1
+1521	2685 1
+1521	2727 1
+1521	2746 1
+1521	2814 1
+1521	2834 1
+1521	2958 1
+1521	3005 1
+1521	3014 1
+1521	3024 1
+1521	3117 1
+1521	3136 1
+1521	3253 1
+1521	3265 1
+1521	3307 1
+1521	3404 1
+1521	3755 1
+1521	4055 1
+1521	8291 1
+1522	15 1
+1522	290 1
+1522	332 1
+1522	415 1
+1522	465 1
+1522	608 1
+1522	741 1
+1522	762 1
+1522	763 1
+1522	871 1
+1522	947 1
+1522	993 1
+1522	1103 1
+1522	1151 1
+1522	1211 1
+1522	1261 1
+1522	1297 1
+1522	1374 1
+1522	1385 1
+1522	1514 1
+1522	1521 1
+1522	1534 1
+1522	1592 1
+1522	1628 1
+1522	1637 1
+1522	1688 1
+1522	1700 1
+1522	1754 1
+1522	1758 1
+1522	1777 1
+1522	1780 1
+1522	1791 1
+1522	1814 1
+1522	1842 1
+1522	1857 1
+1522	1880 1
+1522	1893 1
+1522	1903 1
+1522	1956 1
+1522	1990 1
+1522	2062 1
+1522	2066 1
+1522	2145 1
+1522	2210 1
+1522	2297 1
+1522	2328 1
+1522	2329 1
+1522	2339 1
+1522	2345 1
+1522	2397 1
+1522	2398 1
+1522	2426 1
+1522	2433 1
+1522	2470 1
+1522	2490 1
+1522	2499 1
+1522	2508 1
+1522	2510 1
+1522	2517 1
+1522	2550 1
+1522	2565 1
+1522	2570 1
+1522	2580 1
+1522	2585 1
+1522	2593 1
+1522	2595 1
+1522	2599 1
+1522	2618 1
+1522	2619 1
+1522	2625 1
+1522	2643 1
+1522	2651 1
+1522	2653 1
+1522	2654 1
+1522	2665 1
+1522	2667 1
+1522	2746 1
+1522	2754 1
+1522	2834 1
+1522	2973 1
+1522	2981 1
+1522	2999 1
+1522	3059 1
+1522	3084 1
+1522	3089 1
+1522	3125 1
+1522	3130 1
+1522	3260 1
+1522	3291 1
+1522	3297 1
+1522	3346 1
+1522	3404 1
+1522	3455 1
+1522	3463 1
+1522	3473 1
+1522	3480 1
+1522	3520 1
+1522	3631 1
+1522	3670 1
+1522	3724 1
+1522	3800 1
+1522	3804 1
+1522	3806 1
+1522	3807 1
+1522	3809 1
+1522	3812 1
+1522	3847 1
+1522	3856 1
+1522	3887 1
+1522	3903 1
+1522	3922 1
+1522	3937 1
+1522	3956 1
+1522	3971 1
+1522	3976 1
+1522	4011 1
+1522	4012 1
+1522	4072 1
+1522	4110 1
+1522	4138 1
+1522	4179 1
+1522	4234 1
+1522	4247 1
+1522	4256 1
+1522	4263 1
+1522	4400 1
+1522	4424 1
+1522	4453 1
+1522	4463 1
+1522	4510 1
+1522	4588 1
+1522	4735 1
+1522	5288 1
+1522	5301 1
+1522	5321 1
+1522	5925 1
+1522	5928 1
+1522	6327 1
+1522	6462 1
+1524	1692 1
+1524	3473 1
+1524	5321 1
+1524	5683 1
+1523	1524 1
+1527	960 1
+1525	298 1
+1525	579 1
+1525	665 1
+1525	763 1
+1525	904 1
+1525	960 1
+1525	1000 1
+1525	1103 1
+1525	1199 1
+1525	1248 1
+1525	1253 1
+1525	1261 1
+1525	1279 1
+1525	1322 1
+1525	1428 1
+1525	1442 1
+1525	1487 1
+1525	1489 1
+1525	1514 1
+1525	1520 1
+1525	1628 1
+1525	1633 1
+1525	1649 1
+1525	1652 1
+1525	1654 1
+1525	1669 1
+1525	1717 1
+1525	1780 1
+1525	1788 1
+1525	1791 1
+1525	1793 1
+1525	1798 1
+1525	1802 1
+1525	1811 1
+1525	3136 1
+1526	904 1
+1526	960 1
+1526	1279 1
+1526	1411 1
+1528	1531 1
+1538	15 1
+1538	298 1
+1538	372 1
+1538	415 1
+1538	506 1
+1538	559 1
+1538	691 1
+1538	904 1
+1538	928 1
+1538	937 1
+1538	1000 1
+1538	1103 1
+1538	1124 1
+1538	1165 1
+1538	1199 1
+1538	1201 1
+1538	1236 1
+1538	1248 1
+1538	1253 1
+1538	1297 1
+1538	1319 1
+1538	1322 1
+1538	1428 1
+1538	1482 1
+1538	1487 1
+1538	1489 1
+1538	1492 1
+1538	1496 1
+1538	1514 1
+1538	1534 1
+1538	1555 1
+1538	1564 1
+1538	1610 1
+1538	1618 1
+1538	1622 1
+1538	1697 1
+1538	1700 1
+1538	1701 1
+1538	1726 1
+1538	1732 1
+1538	1734 1
+1538	1746 1
+1538	1747 1
+1538	1752 1
+1538	1768 1
+1538	1774 1
+1538	1802 1
+1538	1805 1
+1538	1811 1
+1538	1816 1
+1538	1836 1
+1538	1855 1
+1538	1858 1
+1538	1893 1
+1538	1918 1
+1538	1935 1
+1538	1953 1
+1538	1969 1
+1538	1973 1
+1538	2066 1
+1538	2120 1
+1538	2256 1
+1538	2410 1
+1538	2411 1
+1538	2510 1
+1538	2535 1
+1538	2594 1
+1538	2618 1
+1538	2643 1
+1538	2653 1
+1538	2665 1
+1538	2774 1
+1538	2877 1
+1538	3005 1
+1538	3155 1
+1538	3260 1
+1538	3580 1
+1538	3755 1
+1538	4021 1
+1538	4037 1
+1538	8290 1
+1534	230 1
+1534	1538 1
+1535	1538 1
+1535	1604 1
+1536	1538 1
+1537	56 1
+1537	737 1
+1537	762 1
+1537	856 1
+1537	1151 1
+1537	1164 1
+1537	1211 1
+1537	1234 1
+1537	1291 1
+1537	1357 1
+1537	1407 1
+1537	1492 1
+1537	1514 1
+1537	1538 1
+1537	1549 1
+1537	1622 1
+1537	1729 1
+1537	1734 1
+1537	1754 1
+1537	1808 1
+1537	1814 1
+1537	1816 1
+1537	1919 1
+1537	1966 1
+1537	1969 1
+1537	2066 1
+1537	2145 1
+1537	2174 1
+1537	2240 1
+1537	2256 1
+1537	2289 1
+1537	2508 1
+1537	2560 1
+1537	2593 1
+1537	2625 1
+1537	2655 1
+1537	2693 1
+1537	2707 1
+1537	2713 1
+1537	2746 1
+1537	2790 1
+1537	2871 1
+1537	2963 1
+1537	3005 1
+1537	3024 1
+1537	3027 1
+1537	3033 1
+1537	3140 1
+1537	3260 1
+1537	3276 1
+1537	3334 1
+1537	3433 1
+1537	3439 1
+1537	3454 1
+1537	3568 1
+1537	3812 1
+1537	3897 1
+1537	3956 1
+1537	4011 1
+1537	4021 1
+1537	4335 1
+1537	4528 1
+1537	4536 1
+1537	4551 1
+1537	4578 1
+1537	4735 1
+1537	5226 1
+1537	5412 1
+1539	771 1
+1539	6560 1
+1539	7673 1
+1539	7855 1
+1539	7912 1
+1540	771 1
+1541	771 1
+1543	771 1
+1545	771 1
+1546	771 1
+1542	15 1
+1542	332 1
+1542	722 1
+1542	737 1
+1542	762 1
+1542	771 1
+1542	859 1
+1542	873 1
+1542	959 1
+1542	967 1
+1542	993 1
+1542	1035 1
+1542	1103 1
+1542	1111 1
+1542	1159 1
+1542	1185 1
+1542	1234 1
+1542	1319 1
+1542	1353 1
+1542	1385 1
+1542	1473 1
+1542	1492 1
+1542	1549 1
+1542	1565 1
+1542	1608 1
+1542	1628 1
+1542	1648 1
+1542	1700 1
+1542	1783 1
+1542	1798 1
+1542	1799 1
+1542	1823 1
+1542	1833 1
+1542	1836 1
+1542	1842 1
+1542	1855 1
+1542	1859 1
+1542	1893 1
+1542	1919 1
+1542	1920 1
+1542	1972 1
+1542	1997 1
+1542	2071 1
+1542	2129 1
+1542	2193 1
+1542	2240 1
+1542	2276 1
+1542	2333 1
+1542	2348 1
+1542	2354 1
+1542	2364 1
+1542	2384 1
+1542	2385 1
+1542	2423 1
+1542	2507 1
+1542	2516 1
+1542	2595 1
+1542	2646 1
+1542	2654 1
+1542	2658 1
+1542	2689 1
+1542	2746 1
+1542	2822 1
+1542	2871 1
+1542	2909 1
+1542	2940 1
+1542	2973 1
+1542	3007 1
+1542	3014 1
+1542	3015 1
+1542	3026 1
+1542	3027 1
+1542	3089 1
+1542	3092 1
+1542	3238 1
+1542	3291 1
+1542	3293 1
+1542	3310 1
+1542	3321 1
+1542	3334 1
+1542	3381 1
+1542	3417 1
+1542	3443 1
+1542	3456 1
+1542	3460 1
+1542	3463 1
+1542	3498 1
+1542	3537 1
+1542	3554 1
+1542	3586 1
+1542	3634 1
+1542	3645 1
+1542	3776 1
+1542	3803 1
+1542	3809 1
+1542	3873 1
+1542	3892 1
+1542	3897 1
+1542	3910 1
+1542	3967 1
+1542	3976 1
+1542	4011 1
+1542	4012 1
+1542	4037 1
+1542	4043 1
+1542	4124 1
+1542	4127 1
+1542	4191 1
+1542	4233 1
+1542	4247 1
+1542	4297 1
+1542	4310 1
+1542	4338 1
+1542	4422 1
+1542	4448 1
+1542	4483 1
+1542	4485 1
+1542	4527 1
+1542	4534 1
+1542	4547 1
+1542	4578 1
+1542	4587 1
+1542	4613 1
+1542	4645 1
+1542	4646 1
+1542	4661 1
+1542	4666 1
+1542	4712 1
+1542	4715 1
+1542	4717 1
+1542	4748 1
+1542	4781 1
+1542	4828 1
+1542	4846 1
+1542	4899 1
+1542	4981 1
+1542	4994 1
+1542	5002 1
+1542	5061 1
+1542	5072 1
+1542	5079 1
+1542	5092 1
+1542	5103 1
+1542	5115 1
+1542	5123 1
+1542	5140 1
+1542	5144 1
+1542	5155 1
+1542	5178 1
+1542	5200 1
+1542	5226 1
+1542	5239 1
+1542	5262 1
+1542	5301 1
+1542	5308 1
+1542	5323 1
+1542	5327 1
+1542	5335 1
+1542	5341 1
+1542	5404 1
+1542	5415 1
+1542	5437 1
+1542	5479 1
+1542	5482 1
+1542	5511 1
+1542	5524 1
+1542	5527 1
+1542	5543 1
+1542	5545 1
+1542	5563 1
+1542	5624 1
+1542	5697 1
+1542	5714 1
+1542	5739 1
+1542	5743 1
+1542	5760 1
+1542	5780 1
+1542	5798 1
+1542	5799 1
+1542	5800 1
+1542	5850 1
+1542	5886 1
+1542	5891 1
+1542	5925 1
+1542	5928 1
+1542	5933 1
+1542	5947 1
+1542	6009 1
+1542	6029 1
+1542	6059 1
+1542	6083 1
+1542	6096 1
+1542	6097 1
+1542	6098 1
+1542	6123 1
+1542	6124 1
+1542	6166 1
+1542	6227 1
+1542	6229 1
+1542	6241 1
+1542	6243 1
+1542	6246 1
+1542	6261 1
+1542	6328 1
+1542	6417 1
+1542	6447 1
+1542	6481 1
+1542	6496 1
+1542	6505 1
+1542	6528 1
+1542	6555 1
+1542	6570 1
+1542	6576 1
+1542	6589 1
+1542	6594 1
+1542	6595 1
+1542	6624 1
+1542	6634 1
+1542	6832 1
+1542	6914 1
+1542	6955 1
+1542	7012 1
+1542	7021 1
+1542	7052 1
+1542	7074 1
+1542	7115 1
+1542	7279 1
+1542	7301 1
+1542	7381 1
+1542	7414 1
+1542	7449 1
+1542	7478 1
+1542	7649 1
+1542	7662 1
+1542	7691 1
+1542	7757 1
+1542	7763 1
+1542	7795 1
+1542	7809 1
+1542	7855 1
+1542	7862 1
+1542	7927 1
+1542	7946 1
+1542	8290 1
+1552	15 1
+1552	56 1
+1552	285 1
+1552	407 1
+1552	417 1
+1552	761 1
+1552	935 1
+1552	968 1
+1552	993 1
+1552	1012 1
+1552	1014 1
+1552	1049 1
+1552	1239 1
+1552	1284 1
+1552	1285 1
+1552	1291 1
+1552	1297 1
+1552	1411 1
+1552	1482 1
+1552	1489 1
+1552	1497 1
+1552	1534 1
+1552	1549 1
+1552	1566 1
+1552	1628 1
+1552	1633 1
+1552	1646 1
+1552	1700 1
+1552	1707 1
+1552	1717 1
+1552	1734 1
+1552	1783 1
+1552	1788 1
+1552	1808 1
+1552	1836 1
+1552	1842 1
+1552	1849 1
+1552	1858 1
+1552	1880 1
+1552	1893 1
+1552	1908 1
+1552	1956 1
+1552	1973 1
+1552	1991 1
+1552	2066 1
+1552	2073 1
+1552	2106 1
+1552	2114 1
+1552	2116 1
+1552	2134 1
+1552	2151 1
+1552	2157 1
+1552	2195 1
+1552	2323 1
+1552	2354 1
+1552	2504 1
+1552	2508 1
+1552	2535 1
+1552	2576 1
+1552	2579 1
+1552	2593 1
+1552	2594 1
+1552	2604 1
+1552	2617 1
+1552	2625 1
+1552	2651 1
+1552	2775 1
+1552	2834 1
+1552	3014 1
+1552	3130 1
+1552	3324 1
+1552	3607 1
+1552	3631 1
+1552	4024 1
+1552	4037 1
+1552	4254 1
+1552	4266 1
+1552	4335 1
+1552	4735 1
+1552	4846 1
+1552	5412 1
+1553	56 1
+1553	1154 1
+1553	1428 1
+1553	1482 1
+1553	1497 1
+1553	1514 1
+1553	1525 1
+1553	1600 1
+1553	1608 1
+1553	1680 1
+1553	1758 1
+1553	1780 1
+1553	1788 1
+1553	1816 1
+1553	1956 1
+1553	2323 1
+1553	2504 1
+1553	2781 1
+1553	2825 1
+1553	3568 1
+1547	722 1
+1547	887 1
+1547	913 1
+1547	968 1
+1547	993 1
+1547	1097 1
+1547	1374 1
+1547	1482 1
+1547	1492 1
+1547	1497 1
+1547	1549 1
+1547	1573 1
+1547	1593 1
+1547	1956 1
+1547	1966 1
+1547	2066 1
+1547	2117 1
+1547	2475 1
+1547	2593 1
+1547	2607 1
+1547	2625 1
+1547	2629 1
+1547	2651 1
+1547	2669 1
+1547	2768 1
+1547	2805 1
+1547	3253 1
+1547	8290 1
+1548	1497 1
+1548	4875 1
+1548	5254 1
+1548	6555 1
+1549	15 1
+1549	56 1
+1549	64 1
+1549	171 1
+1549	204 1
+1549	214 1
+1549	290 1
+1549	298 1
+1549	332 1
+1549	350 1
+1549	407 1
+1549	417 1
+1549	465 1
+1549	506 1
+1549	525 1
+1549	579 1
+1549	633 1
+1549	722 1
+1549	737 1
+1549	761 1
+1549	762 1
+1549	763 1
+1549	764 1
+1549	765 1
+1549	825 1
+1549	840 1
+1549	856 1
+1549	859 1
+1549	887 1
+1549	896 1
+1549	904 1
+1549	908 1
+1549	935 1
+1549	937 1
+1549	946 1
+1549	947 1
+1549	959 1
+1549	974 1
+1549	975 1
+1549	993 1
+1549	1000 1
+1549	1018 1
+1549	1031 1
+1549	1034 1
+1549	1035 1
+1549	1049 1
+1549	1061 1
+1549	1097 1
+1549	1100 1
+1549	1103 1
+1549	1111 1
+1549	1137 1
+1549	1140 1
+1549	1151 1
+1549	1154 1
+1549	1157 1
+1549	1164 1
+1549	1165 1
+1549	1166 1
+1549	1186 1
+1549	1199 1
+1549	1201 1
+1549	1211 1
+1549	1230 1
+1549	1243 1
+1549	1247 1
+1549	1248 1
+1549	1261 1
+1549	1267 1
+1549	1279 1
+1549	1284 1
+1549	1285 1
+1549	1291 1
+1549	1297 1
+1549	1307 1
+1549	1315 1
+1549	1319 1
+1549	1322 1
+1549	1352 1
+1549	1353 1
+1549	1357 1
+1549	1360 1
+1549	1374 1
+1549	1378 1
+1549	1385 1
+1549	1390 1
+1549	1407 1
+1549	1411 1
+1549	1416 1
+1549	1419 1
+1549	1428 1
+1549	1441 1
+1549	1453 1
+1549	1471 1
+1549	1473 1
+1549	1482 1
+1549	1487 1
+1549	1489 1
+1549	1492 1
+1549	1496 1
+1549	1497 1
+1549	1501 1
+1549	1510 1
+1549	1514 1
+1549	1521 1
+1549	1534 1
+1549	1547 1
+1549	1555 1
+1549	1565 1
+1549	1566 1
+1549	1571 1
+1549	1580 1
+1549	1583 1
+1549	1585 1
+1549	1592 1
+1549	1597 1
+1549	1603 1
+1549	1608 1
+1549	1613 1
+1549	1618 1
+1549	1619 1
+1549	1621 1
+1549	1622 1
+1549	1628 1
+1549	1633 1
+1549	1641 1
+1549	1646 1
+1549	1648 1
+1549	1653 1
+1549	1658 1
+1549	1661 1
+1549	1672 1
+1549	1678 1
+1549	1679 1
+1549	1680 1
+1549	1688 1
+1549	1697 1
+1549	1700 1
+1549	1701 1
+1549	1705 1
+1549	1706 1
+1549	1714 1
+1549	1716 1
+1549	1717 1
+1549	1723 1
+1549	1726 1
+1549	1729 1
+1549	1730 1
+1549	1732 1
+1549	1733 1
+1549	1734 1
+1549	1744 1
+1549	1746 1
+1549	1747 1
+1549	1749 1
+1549	1754 1
+1549	1757 1
+1549	1768 1
+1549	1772 1
+1549	1774 1
+1549	1777 1
+1549	1780 1
+1549	1781 1
+1549	1783 1
+1549	1787 1
+1549	1792 1
+1549	1793 1
+1549	1798 1
+1549	1799 1
+1549	1802 1
+1549	1805 1
+1549	1808 1
+1549	1814 1
+1549	1816 1
+1549	1819 1
+1549	1836 1
+1549	1842 1
+1549	1847 1
+1549	1849 1
+1549	1857 1
+1549	1858 1
+1549	1859 1
+1549	1880 1
+1549	1888 1
+1549	1893 1
+1549	1903 1
+1549	1908 1
+1549	1918 1
+1549	1919 1
+1549	1927 1
+1549	1953 1
+1549	1956 1
+1549	1963 1
+1549	1964 1
+1549	1965 1
+1549	1966 1
+1549	1969 1
+1549	1973 1
+1549	1977 1
+1549	1979 1
+1549	1982 1
+1549	1984 1
+1549	1985 1
+1549	1987 1
+1549	1990 1
+1549	1992 1
+1549	1997 1
+1549	2001 1
+1549	2007 1
+1549	2016 1
+1549	2062 1
+1549	2066 1
+1549	2071 1
+1549	2072 1
+1549	2073 1
+1549	2076 1
+1549	2085 1
+1549	2091 1
+1549	2097 1
+1549	2102 1
+1549	2114 1
+1549	2116 1
+1549	2117 1
+1549	2120 1
+1549	2128 1
+1549	2134 1
+1549	2135 1
+1549	2144 1
+1549	2145 1
+1549	2151 1
+1549	2157 1
+1549	2165 1
+1549	2168 1
+1549	2174 1
+1549	2178 1
+1549	2181 1
+1549	2193 1
+1549	2209 1
+1549	2211 1
+1549	2225 1
+1549	2231 1
+1549	2233 1
+1549	2237 1
+1549	2240 1
+1549	2241 1
+1549	2242 1
+1549	2251 1
+1549	2252 1
+1549	2256 1
+1549	2257 1
+1549	2258 1
+1549	2264 1
+1549	2273 1
+1549	2276 1
+1549	2277 1
+1549	2281 1
+1549	2285 1
+1549	2290 1
+1549	2294 1
+1549	2297 1
+1549	2307 1
+1549	2322 1
+1549	2323 1
+1549	2324 1
+1549	2326 1
+1549	2328 1
+1549	2329 1
+1549	2333 1
+1549	2338 1
+1549	2339 1
+1549	2341 1
+1549	2348 1
+1549	2350 1
+1549	2354 1
+1549	2356 1
+1549	2366 1
+1549	2371 1
+1549	2375 1
+1549	2384 1
+1549	2385 1
+1549	2397 1
+1549	2398 1
+1549	2400 1
+1549	2410 1
+1549	2411 1
+1549	2435 1
+1549	2440 1
+1549	2456 1
+1549	2470 1
+1549	2474 1
+1549	2475 1
+1549	2485 1
+1549	2504 1
+1549	2506 1
+1549	2507 1
+1549	2508 1
+1549	2510 1
+1549	2516 1
+1549	2542 1
+1549	2544 1
+1549	2547 1
+1549	2550 1
+1549	2560 1
+1549	2565 1
+1549	2571 1
+1549	2575 1
+1549	2576 1
+1549	2579 1
+1549	2580 1
+1549	2585 1
+1549	2587 1
+1549	2589 1
+1549	2593 1
+1549	2594 1
+1549	2597 1
+1549	2599 1
+1549	2604 1
+1549	2605 1
+1549	2607 1
+1549	2618 1
+1549	2619 1
+1549	2623 1
+1549	2625 1
+1549	2629 1
+1549	2643 1
+1549	2650 1
+1549	2651 1
+1549	2653 1
+1549	2654 1
+1549	2655 1
+1549	2657 1
+1549	2660 1
+1549	2662 1
+1549	2665 1
+1549	2667 1
+1549	2669 1
+1549	2670 1
+1549	2685 1
+1549	2686 1
+1549	2687 1
+1549	2693 1
+1549	2697 1
+1549	2700 1
+1549	2707 1
+1549	2713 1
+1549	2721 1
+1549	2727 1
+1549	2746 1
+1549	2747 1
+1549	2754 1
+1549	2760 1
+1549	2763 1
+1549	2765 1
+1549	2774 1
+1549	2785 1
+1549	2787 1
+1549	2790 1
+1549	2794 1
+1549	2809 1
+1549	2814 1
+1549	2815 1
+1549	2819 1
+1549	2828 1
+1549	2830 1
+1549	2859 1
+1549	2871 1
+1549	2880 1
+1549	2900 1
+1549	2918 1
+1549	2922 1
+1549	2932 1
+1549	2946 1
+1549	2951 1
+1549	2955 1
+1549	2958 1
+1549	2963 1
+1549	2966 1
+1549	2968 1
+1549	2972 1
+1549	2973 1
+1549	2977 1
+1549	2981 1
+1549	2999 1
+1549	3005 1
+1549	3007 1
+1549	3009 1
+1549	3010 1
+1549	3024 1
+1549	3026 1
+1549	3027 1
+1549	3028 1
+1549	3029 1
+1549	3030 1
+1549	3033 1
+1549	3034 1
+1549	3059 1
+1549	3080 1
+1549	3084 1
+1549	3089 1
+1549	3103 1
+1549	3104 1
+1549	3117 1
+1549	3130 1
+1549	3136 1
+1549	3138 1
+1549	3140 1
+1549	3144 1
+1549	3148 1
+1549	3150 1
+1549	3164 1
+1549	3192 1
+1549	3251 1
+1549	3253 1
+1549	3258 1
+1549	3260 1
+1549	3265 1
+1549	3274 1
+1549	3307 1
+1549	3334 1
+1549	3338 1
+1549	3351 1
+1549	3352 1
+1549	3393 1
+1549	3394 1
+1549	3404 1
+1549	3408 1
+1549	3439 1
+1549	3443 1
+1549	3453 1
+1549	3454 1
+1549	3456 1
+1549	3459 1
+1549	3463 1
+1549	3473 1
+1549	3480 1
+1549	3489 1
+1549	3498 1
+1549	3529 1
+1549	3537 1
+1549	3541 1
+1549	3562 1
+1549	3568 1
+1549	3580 1
+1549	3587 1
+1549	3615 1
+1549	3631 1
+1549	3634 1
+1549	3643 1
+1549	3650 1
+1549	3661 1
+1549	3680 1
+1549	3691 1
+1549	3720 1
+1549	3745 1
+1549	3755 1
+1549	3787 1
+1549	3796 1
+1549	3800 1
+1549	3803 1
+1549	3804 1
+1549	3807 1
+1549	3812 1
+1549	3813 1
+1549	3835 1
+1549	3842 1
+1549	3847 1
+1549	3880 1
+1549	3892 1
+1549	3897 1
+1549	3903 1
+1549	3912 1
+1549	3926 1
+1549	3939 1
+1549	3970 1
+1549	4009 1
+1549	4011 1
+1549	4013 1
+1549	4021 1
+1549	4037 1
+1549	4041 1
+1549	4055 1
+1549	4099 1
+1549	4103 1
+1549	4117 1
+1549	4162 1
+1549	4179 1
+1549	4189 1
+1549	4191 1
+1549	4211 1
+1549	4247 1
+1549	4256 1
+1549	4261 1
+1549	4263 1
+1549	4266 1
+1549	4272 1
+1549	4276 1
+1549	4289 1
+1549	4290 1
+1549	4299 1
+1549	4303 1
+1549	4310 1
+1549	4323 1
+1549	4335 1
+1549	4338 1
+1549	4349 1
+1549	4400 1
+1549	4448 1
+1549	4463 1
+1549	4468 1
+1549	4527 1
+1549	4528 1
+1549	4530 1
+1549	4536 1
+1549	4574 1
+1549	4578 1
+1549	4587 1
+1549	4600 1
+1549	4632 1
+1549	4646 1
+1549	4653 1
+1549	4661 1
+1549	4666 1
+1549	4712 1
+1549	4719 1
+1549	4776 1
+1549	4797 1
+1549	4811 1
+1549	4875 1
+1549	5020 1
+1549	5061 1
+1549	5073 1
+1549	5100 1
+1549	5123 1
+1549	5155 1
+1549	5200 1
+1549	5215 1
+1549	5254 1
+1549	5285 1
+1549	5288 1
+1549	5305 1
+1549	5312 1
+1549	5341 1
+1549	5384 1
+1549	5412 1
+1549	5430 1
+1549	5445 1
+1549	5449 1
+1549	5452 1
+1549	5454 1
+1549	5459 1
+1549	5482 1
+1549	5484 1
+1549	5524 1
+1549	5563 1
+1549	5637 1
+1549	5683 1
+1549	5693 1
+1549	5697 1
+1549	5714 1
+1549	5721 1
+1549	5732 1
+1549	5775 1
+1549	5776 1
+1549	5817 1
+1549	5822 1
+1549	5844 1
+1549	5872 1
+1549	5897 1
+1549	5947 1
+1549	6097 1
+1549	6123 1
+1549	6299 1
+1549	6442 1
+1549	6624 1
+1549	6634 1
+1549	6774 1
+1549	6790 1
+1549	6832 1
+1549	6897 1
+1549	6979 1
+1549	7115 1
+1549	7168 1
+1549	7185 1
+1549	7237 1
+1549	7478 1
+1549	7510 1
+1549	8293 1
+1550	608 1
+1550	1031 1
+1550	1157 1
+1550	1385 1
+1550	1497 1
+1550	1549 1
+1550	1596 1
+1550	1729 1
+1550	1990 1
+1550	2129 1
+1550	2289 1
+1550	2328 1
+1550	2516 1
+1550	2612 1
+1550	2871 1
+1550	3007 1
+1550	3117 1
+1550	3180 1
+1550	3192 1
+1550	3352 1
+1550	3394 1
+1550	3439 1
+1550	3443 1
+1550	3568 1
+1550	3650 1
+1550	3660 1
+1550	3661 1
+1550	3800 1
+1550	3812 1
+1550	3903 1
+1550	3958 1
+1550	4021 1
+1550	4191 1
+1550	4256 1
+1550	4290 1
+1550	4323 1
+1550	4349 1
+1550	4365 1
+1550	4373 1
+1550	4384 1
+1550	4424 1
+1550	4613 1
+1551	1497 1
+1555	204 1
+1555	350 1
+1555	407 1
+1555	415 1
+1555	506 1
+1555	579 1
+1555	813 1
+1555	887 1
+1555	904 1
+1555	913 1
+1555	937 1
+1555	948 1
+1555	993 1
+1555	1034 1
+1555	1097 1
+1555	1164 1
+1555	1165 1
+1555	1230 1
+1555	1234 1
+1555	1236 1
+1555	1261 1
+1555	1297 1
+1555	1319 1
+1555	1428 1
+1555	1482 1
+1555	1487 1
+1555	1489 1
+1555	1492 1
+1555	1496 1
+1555	1514 1
+1555	1556 1
+1555	1557 1
+1555	1563 1
+1555	1587 1
+1555	1597 1
+1555	1608 1
+1555	1622 1
+1555	1629 1
+1555	1633 1
+1555	1636 1
+1555	1641 1
+1555	1658 1
+1555	1672 1
+1555	1679 1
+1555	1689 1
+1555	1692 1
+1555	1697 1
+1555	1700 1
+1555	1701 1
+1555	1718 1
+1555	1768 1
+1555	1774 1
+1555	1780 1
+1555	1802 1
+1555	1805 1
+1555	1816 1
+1555	1842 1
+1555	1847 1
+1555	1861 1
+1555	1864 1
+1555	1893 1
+1555	1901 1
+1555	1903 1
+1555	1908 1
+1555	1966 1
+1555	1969 1
+1555	1973 1
+1555	2066 1
+1555	2117 1
+1555	2206 1
+1555	2264 1
+1555	2490 1
+1555	2604 1
+1555	2625 1
+1555	2665 1
+1555	2809 1
+1555	3136 1
+1555	8290 1
+1555	8292 1
+1554	1556 1
+1554	1563 1
+1554	4310 1
+1554	4875 1
+1554	5543 1
+1554	6094 1
+1558	1563 1
+1559	1563 1
+1560	1049 1
+1560	1563 1
+1560	3933 1
+1565	813 1
+1565	993 1
+1565	1211 1
+1565	1749 1
+1565	1798 1
+1565	2329 1
+1565	2385 1
+1565	7862 1
+1566	741 1
+1566	761 1
+1566	813 1
+1566	937 1
+1566	993 1
+1566	1097 1
+1566	1315 1
+1566	1378 1
+1566	1453 1
+1566	1628 1
+1566	1705 1
+1566	1734 1
+1566	1847 1
+1566	1855 1
+1566	1903 1
+1566	1908 1
+1566	2071 1
+1566	2073 1
+1566	2079 1
+1566	2117 1
+1566	2246 1
+1566	2328 1
+1566	2371 1
+1566	2485 1
+1566	2560 1
+1566	2580 1
+1566	2593 1
+1566	2638 1
+1566	2653 1
+1566	2665 1
+1566	2685 1
+1566	2696 1
+1566	2801 1
+1566	2877 1
+1566	2946 1
+1566	3026 1
+1566	3033 1
+1566	3059 1
+1566	3173 1
+1566	3192 1
+1566	3537 1
+1566	3748 1
+1566	3854 1
+1566	4256 1
+1566	5026 1
+1566	8290 1
+1568	1277 1
+1569	1718 1
+1569	1793 1
+1569	3136 1
+1570	1569 1
+1570	2385 1
+1570	3136 1
+1570	3164 1
+1572	1569 1
+1572	1581 1
+1574	1537 1
+1575	1537 1
+1576	8288 1
+1578	1580 1
+1579	1580 1
+1581	8292 1
+1010	314 1
+1010	948 1
+1010	3148 1
+1010	6029 1
+1010	6417 1
+1010	7400 1
+1582	314 1
+1582	993 1
+1582	1199 1
+1582	1211 1
+1582	1253 1
+1582	1279 1
+1582	1428 1
+1582	1521 1
+1582	1654 1
+1582	1679 1
+1582	1718 1
+1582	1752 1
+1582	1774 1
+1583	290 1
+1583	314 1
+1583	465 1
+1583	762 1
+1583	764 1
+1583	993 1
+1583	1097 1
+1583	1111 1
+1583	1154 1
+1583	1166 1
+1583	1211 1
+1583	1236 1
+1583	1374 1
+1583	1411 1
+1583	1428 1
+1583	1437 1
+1583	1482 1
+1583	1492 1
+1583	1542 1
+1583	1549 1
+1583	1600 1
+1583	1604 1
+1583	1608 1
+1583	1619 1
+1583	1621 1
+1583	1633 1
+1583	1637 1
+1583	1706 1
+1583	1754 1
+1583	1757 1
+1583	1787 1
+1583	1842 1
+1583	1919 1
+1583	1956 1
+1583	1965 1
+1583	1987 1
+1583	2053 1
+1583	2073 1
+1583	2117 1
+1583	2174 1
+1583	2202 1
+1583	2225 1
+1583	2231 1
+1583	2241 1
+1583	2256 1
+1583	2273 1
+1583	2297 1
+1583	2323 1
+1583	2470 1
+1583	2474 1
+1583	2550 1
+1583	2560 1
+1583	2565 1
+1583	2594 1
+1583	2599 1
+1583	2618 1
+1583	2625 1
+1583	2643 1
+1583	2654 1
+1583	2660 1
+1583	2665 1
+1583	2669 1
+1583	2670 1
+1583	2697 1
+1583	2700 1
+1583	2707 1
+1583	2721 1
+1583	2754 1
+1583	2763 1
+1583	2785 1
+1583	2794 1
+1583	2828 1
+1583	2830 1
+1583	2880 1
+1583	2900 1
+1583	2955 1
+1583	2968 1
+1583	2991 1
+1583	3034 1
+1583	3130 1
+1583	3145 1
+1583	3251 1
+1583	3253 1
+1583	3265 1
+1583	3351 1
+1583	3489 1
+1583	3650 1
+1587	171 1
+1587	1248 1
+1587	1585 1
+1587	1718 1
+1587	8294 1
+1584	1587 1
+1585	204 1
+1585	214 1
+1585	290 1
+1585	415 1
+1585	425 1
+1585	762 1
+1585	908 1
+1585	913 1
+1585	935 1
+1585	959 1
+1585	1031 1
+1585	1035 1
+1585	1097 1
+1585	1151 1
+1585	1164 1
+1585	1165 1
+1585	1211 1
+1585	1243 1
+1585	1248 1
+1585	1279 1
+1585	1284 1
+1585	1297 1
+1585	1378 1
+1585	1384 1
+1585	1482 1
+1585	1492 1
+1585	1520 1
+1585	1547 1
+1585	1564 1
+1585	1587 1
+1585	1618 1
+1585	1622 1
+1585	1641 1
+1585	1646 1
+1585	1654 1
+1585	1661 1
+1585	1672 1
+1585	1679 1
+1585	1697 1
+1585	1700 1
+1585	1723 1
+1585	1726 1
+1585	1754 1
+1585	1772 1
+1585	1787 1
+1585	1811 1
+1585	1836 1
+1585	1847 1
+1585	1855 1
+1585	1857 1
+1585	1858 1
+1585	1888 1
+1585	1903 1
+1585	1966 1
+1585	1969 1
+1585	1973 1
+1585	1979 1
+1585	2053 1
+1585	2066 1
+1585	2076 1
+1585	2079 1
+1585	2091 1
+1585	2114 1
+1585	2117 1
+1585	2145 1
+1585	2193 1
+1585	2210 1
+1585	2252 1
+1585	2329 1
+1585	2356 1
+1585	2371 1
+1585	2385 1
+1585	2397 1
+1585	2398 1
+1585	2400 1
+1585	2410 1
+1585	2411 1
+1585	2433 1
+1585	2508 1
+1585	2542 1
+1585	2560 1
+1585	2604 1
+1585	2763 1
+1585	2830 1
+1585	2838 1
+1585	2859 1
+1585	2877 1
+1585	2880 1
+1585	3005 1
+1585	3136 1
+1585	3200 1
+1585	3348 1
+1585	3473 1
+1585	3520 1
+1585	3580 1
+1585	3615 1
+1585	3807 1
+1585	4138 1
+1585	4179 1
+1585	4269 1
+1585	8291 1
+1585	8297 1
+1588	948 1
+1589	861 1
+1589	913 1
+1589	948 1
+1589	1201 1
+1589	1236 1
+1589	1261 1
+1589	1428 1
+1589	1596 1
+1589	1600 1
+1589	1603 1
+1589	1612 1
+1589	1638 1
+1589	1679 1
+1590	1593 1
+1591	1593 1
+1592	425 1
+1592	993 1
+1592	1186 1
+1592	1384 1
+1592	1416 1
+1592	1489 1
+1592	1593 1
+1592	1792 1
+1592	1837 1
+1592	2073 1
+1592	2109 1
+1592	2157 1
+1592	2165 1
+1592	2174 1
+1592	2470 1
+1592	2501 1
+1592	2625 1
+1592	2654 1
+1592	2794 1
+1592	2856 1
+1592	2963 1
+1592	3034 1
+1592	3089 1
+1592	3117 1
+1592	3140 1
+1592	3164 1
+1592	3516 1
+1592	4179 1
+1592	4953 1
+1592	5055 1
+1594	171 1
+1594	285 1
+1594	298 1
+1594	372 1
+1594	559 1
+1594	575 1
+1594	579 1
+1594	762 1
+1594	763 1
+1594	825 1
+1594	887 1
+1594	904 1
+1594	913 1
+1594	935 1
+1594	937 1
+1594	975 1
+1594	993 1
+1594	1034 1
+1594	1103 1
+1594	1124 1
+1594	1164 1
+1594	1168 1
+1594	1211 1
+1594	1230 1
+1594	1236 1
+1594	1248 1
+1594	1253 1
+1594	1279 1
+1594	1297 1
+1594	1319 1
+1594	1374 1
+1594	1428 1
+1594	1442 1
+1594	1471 1
+1594	1482 1
+1594	1487 1
+1594	1489 1
+1594	1496 1
+1594	1514 1
+1594	1534 1
+1594	1549 1
+1594	1555 1
+1594	1566 1
+1594	1585 1
+1594	1595 1
+1594	1610 1
+1594	1619 1
+1594	1622 1
+1594	1628 1
+1594	1629 1
+1594	1638 1
+1594	1641 1
+1594	1649 1
+1594	1652 1
+1594	1654 1
+1594	1658 1
+1594	1661 1
+1594	1662 1
+1594	1669 1
+1594	1689 1
+1594	1692 1
+1594	1697 1
+1594	1701 1
+1594	1707 1
+1594	1714 1
+1594	1717 1
+1594	1718 1
+1594	1726 1
+1594	1732 1
+1594	1746 1
+1594	1747 1
+1594	1752 1
+1594	1758 1
+1594	1770 1
+1594	1774 1
+1594	1783 1
+1594	1788 1
+1594	1791 1
+1594	1802 1
+1594	1836 1
+1594	1855 1
+1594	1858 1
+1594	1859 1
+1594	1880 1
+1594	1888 1
+1594	1893 1
+1594	1901 1
+1594	1903 1
+1594	1919 1
+1594	1963 1
+1594	1966 1
+1594	1969 1
+1594	1977 1
+1594	1979 1
+1594	2062 1
+1594	2066 1
+1594	2097 1
+1594	2135 1
+1594	2174 1
+1594	2193 1
+1594	2375 1
+1594	2485 1
+1594	2504 1
+1594	2794 1
+1594	2922 1
+1594	2968 1
+1594	2972 1
+1594	3117 1
+1594	3136 1
+1594	3192 1
+1594	3253 1
+1594	4179 1
+1594	4480 1
+1594	8290 1
+1596	633 1
+1596	1199 1
+1596	1201 1
+1596	1319 1
+1596	1550 1
+1596	1597 1
+1596	1633 1
+1596	1772 1
+1596	2117 1
+1596	2120 1
+1596	2325 1
+1596	2328 1
+1596	2474 1
+1596	2485 1
+1596	2565 1
+1596	2625 1
+1596	2693 1
+1596	2958 1
+1596	3117 1
+1596	3265 1
+1596	3276 1
+1596	3284 1
+1596	3352 1
+1596	3562 1
+1596	3842 1
+1596	4012 1
+1596	4043 1
+1596	4055 1
+1596	4256 1
+1599	1489 1
+1599	1600 1
+1599	1774 1
+1603	15 1
+1603	1018 1
+1603	1243 1
+1603	1835 1
+1603	2240 1
+1603	2332 1
+1603	2435 1
+1603	2571 1
+1603	2579 1
+1603	3479 1
+1603	5233 1
+1603	5254 1
+1603	6334 1
+1603	6400 1
+1603	6407 1
+1603	6422 1
+1571	56 1
+1571	975 1
+1571	1031 1
+1571	1035 1
+1571	1200 1
+1571	1279 1
+1571	1297 1
+1571	1357 1
+1571	1482 1
+1571	1510 1
+1571	1514 1
+1571	1585 1
+1571	1603 1
+1571	1621 1
+1571	1638 1
+1571	1652 1
+1571	1661 1
+1571	1956 1
+1571	1992 1
+1571	2066 1
+1571	2071 1
+1571	2348 1
+1571	3136 1
+1571	3473 1
+1601	861 1
+1601	1428 1
+1601	1603 1
+1601	5714 1
+1602	1603 1
+1604	1253 1
+1604	1603 1
+1604	2917 1
+1604	3136 1
+1605	559 1
+1605	691 1
+1605	1168 1
+1605	1199 1
+1605	1253 1
+1605	1442 1
+1605	1520 1
+1605	1525 1
+1605	1654 1
+1605	1657 1
+1606	861 1
+1606	1927 1
+1606	3291 1
+1607	861 1
+1607	1661 1
+1608	15 1
+1608	214 1
+1608	230 1
+1608	285 1
+1608	290 1
+1608	298 1
+1608	332 1
+1608	350 1
+1608	403 1
+1608	407 1
+1608	415 1
+1608	506 1
+1608	559 1
+1608	575 1
+1608	587 1
+1608	633 1
+1608	665 1
+1608	737 1
+1608	761 1
+1608	762 1
+1608	763 1
+1608	765 1
+1608	836 1
+1608	859 1
+1608	887 1
+1608	904 1
+1608	908 1
+1608	913 1
+1608	937 1
+1608	947 1
+1608	959 1
+1608	968 1
+1608	975 1
+1608	993 1
+1608	1000 1
+1608	1031 1
+1608	1034 1
+1608	1035 1
+1608	1049 1
+1608	1061 1
+1608	1097 1
+1608	1103 1
+1608	1111 1
+1608	1124 1
+1608	1137 1
+1608	1140 1
+1608	1151 1
+1608	1165 1
+1608	1168 1
+1608	1186 1
+1608	1199 1
+1608	1201 1
+1608	1211 1
+1608	1230 1
+1608	1243 1
+1608	1248 1
+1608	1250 1
+1608	1253 1
+1608	1261 1
+1608	1267 1
+1608	1279 1
+1608	1284 1
+1608	1291 1
+1608	1297 1
+1608	1307 1
+1608	1319 1
+1608	1322 1
+1608	1353 1
+1608	1357 1
+1608	1374 1
+1608	1378 1
+1608	1384 1
+1608	1390 1
+1608	1393 1
+1608	1407 1
+1608	1416 1
+1608	1419 1
+1608	1428 1
+1608	1442 1
+1608	1444 1
+1608	1453 1
+1608	1471 1
+1608	1482 1
+1608	1489 1
+1608	1492 1
+1608	1514 1
+1608	1520 1
+1608	1521 1
+1608	1525 1
+1608	1534 1
+1608	1542 1
+1608	1549 1
+1608	1565 1
+1608	1566 1
+1608	1583 1
+1608	1585 1
+1608	1592 1
+1608	1604 1
+1608	1610 1
+1608	1612 1
+1608	1613 1
+1608	1619 1
+1608	1621 1
+1608	1622 1
+1608	1628 1
+1608	1629 1
+1608	1633 1
+1608	1641 1
+1608	1648 1
+1608	1649 1
+1608	1654 1
+1608	1662 1
+1608	1669 1
+1608	1672 1
+1608	1678 1
+1608	1687 1
+1608	1689 1
+1608	1692 1
+1608	1700 1
+1608	1701 1
+1608	1707 1
+1608	1714 1
+1608	1717 1
+1608	1718 1
+1608	1723 1
+1608	1730 1
+1608	1732 1
+1608	1734 1
+1608	1746 1
+1608	1747 1
+1608	1749 1
+1608	1752 1
+1608	1754 1
+1608	1757 1
+1608	1758 1
+1608	1772 1
+1608	1781 1
+1608	1787 1
+1608	1788 1
+1608	1791 1
+1608	1792 1
+1608	1798 1
+1608	1802 1
+1608	1808 1
+1608	1811 1
+1608	1814 1
+1608	1816 1
+1608	1835 1
+1608	1842 1
+1608	1847 1
+1608	1848 1
+1608	1855 1
+1608	1857 1
+1608	1858 1
+1608	1888 1
+1608	1893 1
+1608	1901 1
+1608	1903 1
+1608	1908 1
+1608	1918 1
+1608	1919 1
+1608	1927 1
+1608	1956 1
+1608	1963 1
+1608	1964 1
+1608	1965 1
+1608	1969 1
+1608	1973 1
+1608	1977 1
+1608	1979 1
+1608	1983 1
+1608	1985 1
+1608	1987 1
+1608	1991 1
+1608	1992 1
+1608	1997 1
+1608	2004 1
+1608	2060 1
+1608	2066 1
+1608	2071 1
+1608	2072 1
+1608	2073 1
+1608	2076 1
+1608	2079 1
+1608	2083 1
+1608	2091 1
+1608	2097 1
+1608	2101 1
+1608	2109 1
+1608	2116 1
+1608	2117 1
+1608	2119 1
+1608	2120 1
+1608	2121 1
+1608	2128 1
+1608	2135 1
+1608	2137 1
+1608	2145 1
+1608	2157 1
+1608	2160 1
+1608	2163 1
+1608	2165 1
+1608	2168 1
+1608	2174 1
+1608	2178 1
+1608	2181 1
+1608	2193 1
+1608	2195 1
+1608	2205 1
+1608	2210 1
+1608	2225 1
+1608	2231 1
+1608	2240 1
+1608	2242 1
+1608	2246 1
+1608	2251 1
+1608	2253 1
+1608	2256 1
+1608	2264 1
+1608	2273 1
+1608	2285 1
+1608	2290 1
+1608	2297 1
+1608	2322 1
+1608	2323 1
+1608	2325 1
+1608	2328 1
+1608	2329 1
+1608	2333 1
+1608	2339 1
+1608	2341 1
+1608	2345 1
+1608	2348 1
+1608	2350 1
+1608	2354 1
+1608	2356 1
+1608	2371 1
+1608	2385 1
+1608	2397 1
+1608	2398 1
+1608	2400 1
+1608	2411 1
+1608	2435 1
+1608	2475 1
+1608	2504 1
+1608	2508 1
+1608	2517 1
+1608	2550 1
+1608	2560 1
+1608	2565 1
+1608	2576 1
+1608	2579 1
+1608	2580 1
+1608	2585 1
+1608	2587 1
+1608	2593 1
+1608	2594 1
+1608	2604 1
+1608	2617 1
+1608	2625 1
+1608	2643 1
+1608	2653 1
+1608	2654 1
+1608	2662 1
+1608	2669 1
+1608	2685 1
+1608	2697 1
+1608	2707 1
+1608	2721 1
+1608	2747 1
+1608	2754 1
+1608	2763 1
+1608	2794 1
+1608	2805 1
+1608	2814 1
+1608	2815 1
+1608	2828 1
+1608	2830 1
+1608	2834 1
+1608	2856 1
+1608	2871 1
+1608	2951 1
+1608	2972 1
+1608	2981 1
+1608	2996 1
+1608	2999 1
+1608	3021 1
+1608	3029 1
+1608	3030 1
+1608	3034 1
+1608	3089 1
+1608	3099 1
+1608	3117 1
+1608	3136 1
+1608	3150 1
+1608	3180 1
+1608	3192 1
+1608	3251 1
+1608	3253 1
+1608	3260 1
+1608	3265 1
+1608	3307 1
+1608	3338 1
+1608	3351 1
+1608	3352 1
+1608	3371 1
+1608	3394 1
+1608	3435 1
+1608	3459 1
+1608	3520 1
+1608	3547 1
+1608	3562 1
+1608	3646 1
+1608	3796 1
+1608	3804 1
+1608	3812 1
+1608	3813 1
+1608	3843 1
+1608	3871 1
+1608	3887 1
+1608	3926 1
+1608	3946 1
+1608	4011 1
+1608	4021 1
+1608	4037 1
+1608	4065 1
+1608	4162 1
+1608	4234 1
+1608	4247 1
+1608	4256 1
+1608	4290 1
+1608	4338 1
+1608	4361 1
+1608	4365 1
+1608	4384 1
+1608	4530 1
+1608	4531 1
+1608	4604 1
+1608	4712 1
+1608	4795 1
+1608	5083 1
+1608	5100 1
+1608	5288 1
+1608	5335 1
+1608	5545 1
+1608	5714 1
+1608	5822 1
+1608	5897 1
+1608	6246 1
+1608	6770 1
+1608	6774 1
+1608	7882 1
+1608	8291 1
+1608	8293 1
+1608	8294 1
+1609	1201 1
+1610	1201 1
+1610	1211 1
+1610	1236 1
+1610	1253 1
+1610	1297 1
+1610	1428 1
+1610	1496 1
+1610	1555 1
+1610	1641 1
+1610	1726 1
+1610	1747 1
+1610	1903 1
+1611	1596 1
+1612	1211 1
+1612	1982 1
+1612	2565 1
+1612	3346 1
+1612	4134 1
+1612	4507 1
+1612	4666 1
+1612	4713 1
+1612	5012 1
+1612	5210 1
+1612	5246 1
+1612	5378 1
+1612	5384 1
+1612	5582 1
+1612	5772 1
+1612	5811 1
+1612	5814 1
+1612	5932 1
+1612	5969 1
+1612	5998 1
+1612	6097 1
+1612	6270 1
+1612	6347 1
+1612	6414 1
+1612	6555 1
+1612	6560 1
+1612	6624 1
+1612	6634 1
+1612	6780 1
+1612	6783 1
+1612	6832 1
+1612	6833 1
+1612	6901 1
+1612	6918 1
+1612	6934 1
+1612	6946 1
+1612	6993 1
+1612	7040 1
+1612	7042 1
+1612	7052 1
+1612	7074 1
+1612	7094 1
+1612	7162 1
+1612	7262 1
+1612	7277 1
+1612	7280 1
+1612	7306 1
+1612	7517 1
+1612	7544 1
+1612	7726 1
+1612	7763 1
+1612	7788 1
+1612	7791 1
+1612	7803 1
+1612	7810 1
+1612	8037 1
+1612	8042 1
+1612	8044 1
+1612	8050 1
+1612	8134 1
+1612	8149 1
+1612	8198 1
+1612	8212 1
+1612	8219 1
+1612	8224 1
+1612	8235 1
+1612	8237 1
+1612	8249 1
+1613	763 1
+1613	1236 1
+1613	1496 1
+1613	1520 1
+1613	1610 1
+1613	1903 1
+1613	2223 1
+1613	2790 1
+1613	2940 1
+1613	3443 1
+1613	4103 1
+1613	4798 1
+1613	7839 1
+1613	8148 1
+1613	8290 1
+1614	15 1
+1614	204 1
+1614	214 1
+1614	372 1
+1614	579 1
+1614	665 1
+1614	762 1
+1614	763 1
+1614	836 1
+1614	993 1
+1614	1000 1
+1614	1211 1
+1614	1236 1
+1614	1267 1
+1614	1279 1
+1614	1322 1
+1614	1357 1
+1614	1374 1
+1614	1442 1
+1614	1514 1
+1614	1525 1
+1614	1549 1
+1614	1583 1
+1614	1592 1
+1614	1621 1
+1614	1622 1
+1614	1628 1
+1614	1669 1
+1614	1717 1
+1614	1734 1
+1614	1774 1
+1614	1780 1
+1614	1787 1
+1614	1802 1
+1614	1805 1
+1614	1811 1
+1614	1814 1
+1614	1842 1
+1614	1848 1
+1614	1857 1
+1614	1859 1
+1614	1893 1
+1614	1903 1
+1614	1919 1
+1614	1987 1
+1614	1992 1
+1614	2071 1
+1614	2205 1
+1614	2225 1
+1614	2256 1
+1614	2297 1
+1614	2328 1
+1614	2348 1
+1614	2410 1
+1614	2456 1
+1614	2547 1
+1614	2625 1
+1614	2654 1
+1614	2760 1
+1614	2777 1
+1614	2856 1
+1614	3034 1
+1614	3136 1
+1614	3253 1
+1614	3680 1
+1614	4037 1
+1614	4335 1
+1614	4600 1
+1614	4706 1
+1614	4735 1
+1614	5022 1
+1614	5341 1
+1614	5848 1
+1615	56 1
+1615	64 1
+1615	171 1
+1615	230 1
+1615	285 1
+1615	290 1
+1615	298 1
+1615	372 1
+1615	407 1
+1615	415 1
+1615	506 1
+1615	559 1
+1615	575 1
+1615	579 1
+1615	665 1
+1615	761 1
+1615	763 1
+1615	887 1
+1615	908 1
+1615	913 1
+1615	928 1
+1615	935 1
+1615	937 1
+1615	946 1
+1615	993 1
+1615	1000 1
+1615	1034 1
+1615	1103 1
+1615	1124 1
+1615	1137 1
+1615	1151 1
+1615	1164 1
+1615	1168 1
+1615	1199 1
+1615	1200 1
+1615	1211 1
+1615	1230 1
+1615	1248 1
+1615	1253 1
+1615	1279 1
+1615	1285 1
+1615	1297 1
+1615	1319 1
+1615	1322 1
+1615	1407 1
+1615	1411 1
+1615	1428 1
+1615	1442 1
+1615	1471 1
+1615	1482 1
+1615	1487 1
+1615	1489 1
+1615	1496 1
+1615	1501 1
+1615	1514 1
+1615	1520 1
+1615	1525 1
+1615	1534 1
+1615	1549 1
+1615	1550 1
+1615	1555 1
+1615	1566 1
+1615	1585 1
+1615	1618 1
+1615	1619 1
+1615	1622 1
+1615	1628 1
+1615	1633 1
+1615	1636 1
+1615	1638 1
+1615	1641 1
+1615	1648 1
+1615	1649 1
+1615	1652 1
+1615	1654 1
+1615	1657 1
+1615	1658 1
+1615	1661 1
+1615	1662 1
+1615	1669 1
+1615	1672 1
+1615	1679 1
+1615	1680 1
+1615	1689 1
+1615	1697 1
+1615	1707 1
+1615	1716 1
+1615	1717 1
+1615	1726 1
+1615	1730 1
+1615	1732 1
+1615	1746 1
+1615	1747 1
+1615	1752 1
+1615	1757 1
+1615	1758 1
+1615	1768 1
+1615	1770 1
+1615	1772 1
+1615	1774 1
+1615	1780 1
+1615	1787 1
+1615	1788 1
+1615	1791 1
+1615	1798 1
+1615	1802 1
+1615	1805 1
+1615	1811 1
+1615	1816 1
+1615	1849 1
+1615	1855 1
+1615	1857 1
+1615	1858 1
+1615	1859 1
+1615	1864 1
+1615	1880 1
+1615	1893 1
+1615	1901 1
+1615	1903 1
+1615	1908 1
+1615	1920 1
+1615	1927 1
+1615	1953 1
+1615	1955 1
+1615	1956 1
+1615	1963 1
+1615	1965 1
+1615	1966 1
+1615	1969 1
+1615	1973 1
+1615	1979 1
+1615	1983 1
+1615	1984 1
+1615	1987 1
+1615	1991 1
+1615	2007 1
+1615	2055 1
+1615	2066 1
+1615	2069 1
+1615	2073 1
+1615	2079 1
+1615	2083 1
+1615	2095 1
+1615	2097 1
+1615	2101 1
+1615	2106 1
+1615	2109 1
+1615	2112 1
+1615	2114 1
+1615	2119 1
+1615	2121 1
+1615	2137 1
+1615	2151 1
+1615	2163 1
+1615	2165 1
+1615	2168 1
+1615	2174 1
+1615	2178 1
+1615	2181 1
+1615	2350 1
+1615	3136 1
+1615	8290 1
+1616	928 1
+1617	1618 1
+1530	72 1
+1530	1428 1
+1530	1566 1
+1530	1835 1
+1530	1859 1
+1530	4632 1
+1530	5226 1
+1530	5459 1
+1530	5828 1
+1530	8141 1
+1530	8178 1
+1619	1297 1
+1619	1428 1
+1619	1487 1
+1619	1726 1
+1620	1428 1
+1621	836 1
+1621	946 1
+1621	947 1
+1621	993 1
+1621	1031 1
+1621	1035 1
+1621	1049 1
+1621	1111 1
+1621	1211 1
+1621	1353 1
+1621	1378 1
+1621	1428 1
+1621	1444 1
+1621	1492 1
+1621	1514 1
+1621	1521 1
+1621	1583 1
+1621	1622 1
+1621	1697 1
+1621	1700 1
+1621	1714 1
+1621	1729 1
+1621	1734 1
+1621	1749 1
+1621	1754 1
+1621	1783 1
+1621	1808 1
+1621	1816 1
+1621	1842 1
+1621	1858 1
+1621	1880 1
+1621	1888 1
+1621	1901 1
+1621	1919 1
+1621	1979 1
+1621	1985 1
+1621	1987 1
+1621	2071 1
+1621	2120 1
+1621	2128 1
+1621	2174 1
+1621	2205 1
+1621	2210 1
+1621	2211 1
+1621	2240 1
+1621	2246 1
+1621	2273 1
+1621	2322 1
+1621	2328 1
+1621	2329 1
+1621	2341 1
+1621	2474 1
+1621	2565 1
+1621	2593 1
+1621	2625 1
+1621	2646 1
+1621	2651 1
+1621	2763 1
+1621	3084 1
+1621	3117 1
+1621	3238 1
+1621	3265 1
+1621	3456 1
+1621	3568 1
+1621	3645 1
+1621	4072 1
+1621	4191 1
+1621	4290 1
+1621	4578 1
+1621	4811 1
+1621	5466 1
+1621	5655 1
+1621	5739 1
+1621	5839 1
+1621	7021 1
+1621	7052 1
+1621	7386 1
+1621	7620 1
+1621	8121 1
+1621	8290 1
+1622	15 1
+1622	415 1
+1622	1034 1
+1622	1279 1
+1622	1297 1
+1622	1357 1
+1622	1428 1
+1622	1482 1
+1622	1487 1
+1622	1492 1
+1622	1496 1
+1622	1514 1
+1622	1549 1
+1622	1585 1
+1622	1700 1
+1622	1701 1
+1622	1772 1
+1622	1788 1
+1622	1816 1
+1622	1893 1
+1622	1935 1
+1622	1953 1
+1622	1966 1
+1622	1973 1
+1622	1992 1
+1622	2285 1
+1622	2328 1
+1622	2378 1
+1622	2474 1
+1622	2506 1
+1622	2508 1
+1622	2565 1
+1622	2594 1
+1622	2727 1
+1622	2746 1
+1622	2830 1
+1622	2859 1
+1622	2923 1
+1622	2958 1
+1622	3005 1
+1622	3068 1
+1622	3117 1
+1622	3136 1
+1622	3265 1
+1622	3580 1
+1622	3680 1
+1622	3792 1
+1622	4578 1
+1622	4795 1
+1622	6327 1
+1623	407 1
+1623	737 1
+1623	761 1
+1623	887 1
+1623	993 1
+1623	1014 1
+1623	1049 1
+1623	1357 1
+1623	1428 1
+1623	1487 1
+1623	1555 1
+1623	1565 1
+1623	1893 1
+1623	1966 1
+1623	2323 1
+1623	2341 1
+1623	2345 1
+1623	2593 1
+1623	2625 1
+1623	2685 1
+1623	2693 1
+1623	2851 1
+1623	2966 1
+1623	3140 1
+1623	3291 1
+1623	3580 1
+1623	3629 1
+1623	3634 1
+1623	3812 1
+1623	4037 1
+1623	4335 1
+1623	4717 1
+1623	4811 1
+1623	5130 1
+1623	5140 1
+1623	5479 1
+1623	5928 1
+1623	6496 1
+1623	8290 1
+1625	1525 1
+1625	2763 1
+1627	1525 1
+1626	1525 1
+1626	3650 1
+1628	1297 1
+1628	1471 1
+1628	1514 1
+1628	1542 1
+1628	1629 1
+1628	1669 1
+1628	1811 1
+1628	1858 1
+1628	1859 1
+1628	2128 1
+1628	2193 1
+1628	8290 1
+1630	1279 1
+1630	1633 1
+1631	904 1
+1631	1165 1
+1631	1168 1
+1631	1610 1
+1631	1633 1
+1631	1758 1
+1632	1471 1
+1632	1633 1
+1632	1661 1
+1634	797 1
+1635	797 1
+1636	2499 1
+1638	1103 1
+1638	1637 1
+1638	1661 1
+1637	1638 1
+1639	935 1
+1639	1186 1
+1639	1284 1
+1639	1378 1
+1639	1473 1
+1639	1592 1
+1639	1621 1
+1639	1637 1
+1639	1638 1
+1639	1783 1
+1639	1858 1
+1639	2016 1
+1639	2071 1
+1639	2079 1
+1639	2091 1
+1639	2095 1
+1639	2237 1
+1639	2241 1
+1639	2485 1
+1639	2651 1
+1639	2686 1
+1639	2775 1
+1639	2955 1
+1639	3291 1
+1639	3371 1
+1639	3417 1
+1639	3631 1
+1639	3680 1
+1639	3792 1
+1639	4748 1
+1639	5072 1
+1639	5083 1
+1639	5162 1
+1639	5189 1
+1639	5335 1
+1639	5693 1
+1641	1035 1
+1641	1489 1
+1642	1489 1
+1643	1489 1
+1644	15 1
+1644	56 1
+1644	230 1
+1644	737 1
+1644	762 1
+1644	1049 1
+1644	1186 1
+1644	1297 1
+1644	1384 1
+1644	1489 1
+1644	1521 1
+1644	1661 1
+1644	1717 1
+1644	1787 1
+1644	1842 1
+1644	1859 1
+1644	1956 1
+1644	1997 1
+1644	2004 1
+1644	2091 1
+1644	2097 1
+1644	2165 1
+1644	2211 1
+1644	2237 1
+1644	2332 1
+1644	2398 1
+1644	2535 1
+1644	2565 1
+1644	2651 1
+1644	2774 1
+1644	2801 1
+1644	3238 1
+1644	3334 1
+1644	3976 1
+1644	4600 1
+1644	5210 1
+1644	5412 1
+1644	5680 1
+1644	5902 1
+1644	6414 1
+1644	6437 1
+1644	6498 1
+1644	6599 1
+1644	6765 1
+1644	6914 1
+1644	7699 1
+1644	7839 1
+1644	8290 1
+1645	1648 1
+1645	5886 1
+1646	1199 1
+1646	1585 1
+1646	1648 1
+1646	2339 1
+1646	2768 1
+1650	887 1
+1651	1652 1
+1653	1654 1
+1653	2814 1
+1655	1520 1
+1656	1520 1
+1661	15 1
+1661	415 1
+1661	974 1
+1661	1026 1
+1661	1211 1
+1661	1297 1
+1661	1305 1
+1661	1754 1
+1661	1808 1
+1661	1859 1
+1661	1953 1
+1661	1966 1
+1661	2066 1
+1661	2069 1
+1661	2102 1
+1661	2151 1
+1661	2210 1
+1661	2328 1
+1661	2398 1
+1661	2433 1
+1661	2490 1
+1661	2535 1
+1661	2565 1
+1661	2658 1
+1661	2912 1
+1661	2923 1
+1661	2940 1
+1661	3144 1
+1661	3145 1
+1661	3253 1
+1661	3276 1
+1661	3408 1
+1661	3443 1
+1661	3447 1
+1661	3456 1
+1661	3548 1
+1661	3635 1
+1661	3645 1
+1661	3962 1
+1661	4037 1
+1661	4191 1
+1661	4269 1
+1661	4323 1
+1661	4402 1
+1661	4453 1
+1661	4482 1
+1661	4580 1
+1661	4687 1
+1661	4791 1
+1661	5022 1
+1661	5092 1
+1661	5148 1
+1661	5215 1
+1661	5605 1
+1661	5651 1
+1661	5811 1
+1661	5817 1
+1661	6218 1
+1661	6296 1
+1661	6323 1
+1661	6600 1
+1661	6855 1
+1661	7092 1
+1661	7497 1
+1661	7924 1
+1661	8293 1
+1658	1661 1
+1658	1697 1
+1658	2053 1
+1658	2297 1
+1658	2787 1
+1658	2838 1
+1658	2877 1
+1658	5055 1
+1658	7871 1
+1659	1661 1
+1660	1661 1
+1662	856 1
+1662	1124 1
+1662	1718 1
+1662	1903 1
+1662	3235 1
+1662	5239 1
+1564	290 1
+1564	764 1
+1564	1353 1
+1564	1390 1
+1564	1496 1
+1564	1555 1
+1564	1622 1
+1564	1679 1
+1564	1687 1
+1564	1700 1
+1564	1701 1
+1564	1772 1
+1564	1783 1
+1564	1805 1
+1564	1893 1
+1564	1953 1
+1564	1969 1
+1564	1992 1
+1564	2151 1
+1564	2178 1
+1564	2398 1
+1564	2594 1
+1564	2618 1
+1564	2713 1
+1564	3030 1
+1564	3755 1
+1564	8290 1
+1663	1564 1
+1664	579 1
+1664	1888 1
+1664	2535 1
+1665	1471 1
+1666	1471 1
+1667	737 1
+1667	1049 1
+1667	1628 1
+1667	1669 1
+1667	1680 1
+1667	1802 1
+1667	1835 1
+1667	1849 1
+1667	1857 1
+1667	1859 1
+1667	2328 1
+1667	2516 1
+1667	2580 1
+1667	2587 1
+1667	2763 1
+1667	3014 1
+1667	3276 1
+1667	3447 1
+1667	3537 1
+1667	3796 1
+1667	3897 1
+1667	4310 1
+1667	4341 1
+1667	4536 1
+1667	4547 1
+1667	5020 1
+1667	5022 1
+1667	5064 1
+1667	5079 1
+1667	5103 1
+1667	5178 1
+1667	5301 1
+1667	5404 1
+1667	5465 1
+1667	5529 1
+1667	5543 1
+1667	5605 1
+1667	5614 1
+1667	5620 1
+1667	5737 1
+1667	5760 1
+1667	5844 1
+1667	5872 1
+1667	6164 1
+1667	6302 1
+1667	6306 1
+1667	6566 1
+1667	6923 1
+1667	7378 1
+1667	7491 1
+1667	7553 1
+1667	7795 1
+1667	8019 1
+1667	8134 1
+1667	8198 1
+1668	1186 1
+1668	1669 1
+1668	1816 1
+1668	2091 1
+1668	2685 1
+1670	913 1
+1670	1124 1
+1670	1374 1
+1670	1390 1
+1670	1646 1
+1670	1847 1
+1670	1956 1
+1670	1997 1
+1670	2117 1
+1670	2120 1
+1670	2145 1
+1670	2165 1
+1670	2240 1
+1670	2294 1
+1670	2763 1
+1670	2787 1
+1670	2797 1
+1670	8290 1
+1671	913 1
+1647	417 1
+1647	1211 1
+1647	1279 1
+1647	1548 1
+1647	2144 1
+1647	2252 1
+1647	2535 1
+1647	3005 1
+1647	3587 1
+1647	3967 1
+1647	4037 1
+1647	4072 1
+1647	4191 1
+1647	4315 1
+1647	4796 1
+1647	5226 1
+1647	5412 1
+1647	6784 1
+1647	7131 1
+1674	72 1
+1674	633 1
+1674	1250 1
+1674	1279 1
+1674	2587 1
+1674	5524 1
+1674	5732 1
+1674	7005 1
+1675	1279 1
+1675	1956 1
+1676	1279 1
+1677	1199 1
+1677	1279 1
+1678	1211 1
+1678	1977 1
+1678	4654 1
+1680	3813 1
+1680	4315 1
+1680	4373 1
+1680	5222 1
+1681	1442 1
+1681	2506 1
+1682	1442 1
+1683	1641 1
+1683	1802 1
+1685	1641 1
+1684	403 1
+1684	1416 1
+1684	1641 1
+1684	1653 1
+1684	2102 1
+1684	2225 1
+1684	2322 1
+1684	2625 1
+1684	2651 1
+1686	1501 1
+1687	1501 1
+1687	2151 1
+1687	3125 1
+1687	3806 1
+1687	4528 1
+1687	4811 1
+1689	1031 1
+1689	1787 1
+1692	372 1
+1692	1514 1
+1692	2877 1
+1690	1692 1
+1690	2877 1
+1691	372 1
+1691	425 1
+1691	967 1
+1691	1049 1
+1691	1191 1
+1691	1416 1
+1691	1492 1
+1691	1566 1
+1691	1622 1
+1691	1692 1
+1691	1723 1
+1691	1769 1
+1691	1836 1
+1691	1842 1
+1691	1908 1
+1691	1919 1
+1691	2117 1
+1691	2323 1
+1691	2328 1
+1691	2593 1
+1691	2657 1
+1691	2754 1
+1691	2775 1
+1691	2871 1
+1691	2909 1
+1691	2922 1
+1691	3000 1
+1691	3033 1
+1691	3150 1
+1691	3309 1
+1691	3338 1
+1691	3352 1
+1691	3489 1
+1691	3562 1
+1691	3807 1
+1691	4043 1
+1691	4247 1
+1691	4435 1
+1691	4981 1
+1691	5100 1
+1691	5178 1
+1691	5254 1
+1691	5463 1
+1691	5714 1
+1691	6151 1
+1691	6555 1
+1691	6914 1
+1691	7115 1
+1691	7862 1
+1691	7871 1
+1693	935 1
+1693	993 1
+1693	1566 1
+1693	1610 1
+1693	2062 1
+1693	2073 1
+1701	15 1
+1701	56 1
+1701	72 1
+1701	214 1
+1701	608 1
+1701	737 1
+1701	1026 1
+1701	1031 1
+1701	1035 1
+1701	1186 1
+1701	1360 1
+1701	1416 1
+1701	1473 1
+1701	1549 1
+1701	1621 1
+1701	1648 1
+1701	1700 1
+1701	1723 1
+1701	1734 1
+1701	1754 1
+1701	1847 1
+1701	1888 1
+1701	1919 1
+1701	1997 1
+1701	2120 1
+1701	2322 1
+1701	2328 1
+1701	2354 1
+1701	2381 1
+1701	2398 1
+1701	2440 1
+1701	2535 1
+1701	2585 1
+1701	2594 1
+1701	2595 1
+1701	2620 1
+1701	2625 1
+1701	2643 1
+1701	2686 1
+1701	2828 1
+1701	2973 1
+1701	2981 1
+1701	3002 1
+1701	3026 1
+1701	3029 1
+1701	3089 1
+1701	3238 1
+1701	3253 1
+1701	3260 1
+1701	3458 1
+1701	3516 1
+1701	3537 1
+1701	3586 1
+1701	3897 1
+1701	4037 1
+1701	4041 1
+1701	4071 1
+1701	4110 1
+1701	4276 1
+1701	4310 1
+1701	4338 1
+1701	4373 1
+1701	4483 1
+1701	4527 1
+1701	4551 1
+1701	4574 1
+1701	4578 1
+1701	4600 1
+1701	4709 1
+1701	4712 1
+1701	4715 1
+1701	4735 1
+1701	4795 1
+1701	4828 1
+1701	4899 1
+1701	5028 1
+1701	5079 1
+1701	5123 1
+1701	5148 1
+1701	5155 1
+1701	5188 1
+1701	5210 1
+1701	5226 1
+1701	5233 1
+1701	5254 1
+1701	5412 1
+1701	5445 1
+1701	5543 1
+1701	5584 1
+1701	5638 1
+1701	5671 1
+1701	5680 1
+1701	5714 1
+1701	5775 1
+1701	5828 1
+1701	6098 1
+1701	6156 1
+1701	6221 1
+1701	6229 1
+1701	6414 1
+1701	6496 1
+1701	6624 1
+1701	6723 1
+1701	6770 1
+1701	6833 1
+1701	6869 1
+1701	7131 1
+1701	7381 1
+1701	7763 1
+1701	7795 1
+1701	7855 1
+1701	7946 1
+1694	1701 1
+1695	1701 1
+1696	56 1
+1696	1622 1
+1696	1701 1
+1696	1893 1
+1697	15 1
+1697	285 1
+1697	608 1
+1697	633 1
+1697	762 1
+1697	873 1
+1697	993 1
+1697	1164 1
+1697	1186 1
+1697	1247 1
+1697	1385 1
+1697	1555 1
+1697	1633 1
+1697	1701 1
+1697	1808 1
+1697	1842 1
+1697	1849 1
+1697	1855 1
+1697	1859 1
+1697	1880 1
+1697	1935 1
+1697	1966 1
+1697	2072 1
+1697	2101 1
+1697	2182 1
+1697	2237 1
+1697	2252 1
+1697	2258 1
+1697	2328 1
+1697	2384 1
+1697	2397 1
+1697	2411 1
+1697	2484 1
+1697	2501 1
+1697	2508 1
+1697	2516 1
+1697	2535 1
+1697	2552 1
+1697	2576 1
+1697	2580 1
+1697	2643 1
+1697	2774 1
+1697	2790 1
+1697	2801 1
+1697	2838 1
+1697	2877 1
+1697	2923 1
+1697	3136 1
+1697	3164 1
+1697	3251 1
+1697	3408 1
+1697	3456 1
+1697	3473 1
+1697	3480 1
+1697	3681 1
+1697	3970 1
+1697	4349 1
+1697	4373 1
+1697	4530 1
+1697	4687 1
+1697	5176 1
+1697	5178 1
+1697	5335 1
+1697	5412 1
+1697	5449 1
+1697	5714 1
+1697	5732 1
+1697	5773 1
+1697	5817 1
+1697	6255 1
+1698	1701 1
+1699	1701 1
+1700	290 1
+1700	415 1
+1700	425 1
+1700	762 1
+1700	778 1
+1700	908 1
+1700	937 1
+1700	978 1
+1700	993 1
+1700	1012 1
+1700	1151 1
+1700	1297 1
+1700	1353 1
+1700	1385 1
+1700	1482 1
+1700	1496 1
+1700	1521 1
+1700	1555 1
+1700	1564 1
+1700	1585 1
+1700	1622 1
+1700	1697 1
+1700	1701 1
+1700	1714 1
+1700	1770 1
+1700	1772 1
+1700	1787 1
+1700	1816 1
+1700	1847 1
+1700	1893 1
+1700	1918 1
+1700	1953 1
+1700	1969 1
+1700	1985 1
+1700	1992 1
+1700	2066 1
+1700	2071 1
+1700	2073 1
+1700	2076 1
+1700	2117 1
+1700	2120 1
+1700	2128 1
+1700	2151 1
+1700	2178 1
+1700	2202 1
+1700	2244 1
+1700	2256 1
+1700	2322 1
+1700	2340 1
+1700	2366 1
+1700	2411 1
+1700	2416 1
+1700	2565 1
+1700	2571 1
+1700	2575 1
+1700	2579 1
+1700	2580 1
+1700	2585 1
+1700	2589 1
+1700	2607 1
+1700	2618 1
+1700	2638 1
+1700	2643 1
+1700	2646 1
+1700	2650 1
+1700	2665 1
+1700	2669 1
+1700	2751 1
+1700	2777 1
+1700	2781 1
+1700	2785 1
+1700	2794 1
+1700	2797 1
+1700	2801 1
+1700	2809 1
+1700	2814 1
+1700	2880 1
+1700	2946 1
+1700	3050 1
+1700	3136 1
+1700	3256 1
+1700	3276 1
+1700	3463 1
+1700	3616 1
+1700	3976 1
+1700	4191 1
+1700	4231 1
+1700	4441 1
+1700	4453 1
+1700	4735 1
+1700	5092 1
+1700	5886 1
+1700	8290 1
+1711	230 1
+1711	1151 1
+1711	1211 1
+1711	1697 1
+1711	1855 1
+1711	1956 1
+1711	2210 1
+1711	2328 1
+1711	3136 1
+1703	230 1
+1704	230 1
+1705	214 1
+1705	230 1
+1705	403 1
+1705	765 1
+1705	946 1
+1705	1297 1
+1705	1419 1
+1705	1542 1
+1705	1565 1
+1705	1566 1
+1705	1596 1
+1705	1707 1
+1705	1723 1
+1705	1808 1
+1705	1888 1
+1705	1919 1
+1705	2071 1
+1705	2102 1
+1705	2120 1
+1705	2241 1
+1705	2251 1
+1705	2256 1
+1705	2264 1
+1705	2322 1
+1705	2323 1
+1705	2375 1
+1705	2547 1
+1705	2560 1
+1705	2599 1
+1705	2707 1
+1705	2721 1
+1705	2805 1
+1705	2814 1
+1705	2815 1
+1705	2828 1
+1705	2834 1
+1705	2902 1
+1705	2922 1
+1705	2946 1
+1705	2955 1
+1705	2963 1
+1705	2968 1
+1705	2972 1
+1705	2993 1
+1705	2999 1
+1705	3029 1
+1705	3033 1
+1706	230 1
+1706	1705 1
+1706	2114 1
+1706	2955 1
+1707	72 1
+1707	230 1
+1707	993 1
+1707	1186 1
+1707	1211 1
+1707	1267 1
+1707	1285 1
+1707	1297 1
+1707	1384 1
+1707	1678 1
+1707	1697 1
+1707	1705 1
+1707	1723 1
+1707	1888 1
+1707	1977 1
+1707	2076 1
+1707	2116 1
+1707	2181 1
+1707	2362 1
+1707	2371 1
+1707	2398 1
+1707	2485 1
+1707	2570 1
+1707	2594 1
+1707	2790 1
+1707	2794 1
+1707	2805 1
+1707	2871 1
+1707	2955 1
+1707	3251 1
+1707	4055 1
+1707	4578 1
+1707	5465 1
+1707	7632 1
+1708	230 1
+1709	230 1
+1709	1031 1
+1709	1297 1
+1709	2409 1
+1709	2643 1
+1709	2794 1
+1710	230 1
+1712	1319 1
+1713	1319 1
+1714	993 1
+1714	1319 1
+1714	2137 1
+1714	2504 1
+1714	5335 1
+1715	1718 1
+1716	372 1
+1716	904 1
+1716	1718 1
+1716	1747 1
+1716	1920 1
+1716	2470 1
+1717	15 1
+1717	56 1
+1717	72 1
+1717	204 1
+1717	214 1
+1717	372 1
+1717	415 1
+1717	665 1
+1717	722 1
+1717	762 1
+1717	935 1
+1717	993 1
+1717	1164 1
+1717	1166 1
+1717	1185 1
+1717	1211 1
+1717	1261 1
+1717	1284 1
+1717	1297 1
+1717	1322 1
+1717	1357 1
+1717	1482 1
+1717	1585 1
+1717	1622 1
+1717	1658 1
+1717	1697 1
+1717	1718 1
+1717	1744 1
+1717	1752 1
+1717	1855 1
+1717	1858 1
+1717	1918 1
+1717	1956 1
+1717	1969 1
+1717	1973 1
+1717	1979 1
+1717	1987 1
+1717	2004 1
+1717	2053 1
+1717	2062 1
+1717	2066 1
+1717	2128 1
+1717	2157 1
+1717	2210 1
+1717	2281 1
+1717	2328 1
+1717	2339 1
+1717	2381 1
+1717	2397 1
+1717	2398 1
+1717	2411 1
+1717	2508 1
+1717	2535 1
+1717	2570 1
+1717	2575 1
+1717	2593 1
+1717	2625 1
+1717	2669 1
+1717	2674 1
+1717	2736 1
+1717	2754 1
+1717	2811 1
+1717	2877 1
+1717	2999 1
+1717	3007 1
+1717	3029 1
+1717	3136 1
+1717	3144 1
+1717	3321 1
+1717	3338 1
+1717	3352 1
+1717	3447 1
+1717	3498 1
+1717	3516 1
+1717	3587 1
+1717	3607 1
+1717	3614 1
+1717	3680 1
+1717	3873 1
+1717	3976 1
+1717	4037 1
+1717	4453 1
+1717	4735 1
+1717	5022 1
+1717	5254 1
+1717	5341 1
+1717	5780 1
+1717	6306 1
+1717	6337 1
+1717	6400 1
+1717	6599 1
+1717	7168 1
+1717	8083 1
+1717	8292 1
+1717	8294 1
+1717	8295 1
+1719	1031 1
+1719	1496 1
+1719	1596 1
+1719	1622 1
+1719	1726 1
+1719	1772 1
+1719	1965 1
+1719	2289 1
+1719	3117 1
+1719	4712 1
+1720	935 1
+1720	1285 1
+1720	1378 1
+1720	1453 1
+1720	1726 1
+1720	1965 1
+1720	2485 1
+1720	5103 1
+1720	5106 1
+1720	5922 1
+1720	5925 1
+1720	6227 1
+1720	6327 1
+1720	7860 1
+1721	1726 1
+1722	737 1
+1722	935 1
+1722	1378 1
+1722	1403 1
+1722	1726 1
+1722	1808 1
+1722	2079 1
+1722	5106 1
+1722	5563 1
+1722	5818 1
+1722	5925 1
+1722	6151 1
+1722	6227 1
+1722	7587 1
+1723	1726 1
+1688	825 1
+1688	935 1
+1688	1285 1
+1688	1378 1
+1688	1453 1
+1688	1723 1
+1688	1726 1
+1688	1965 1
+1688	1966 1
+1688	2485 1
+1688	2653 1
+1688	2871 1
+1688	2955 1
+1688	3144 1
+1688	3192 1
+1688	3537 1
+1688	4162 1
+1688	4179 1
+1688	4827 1
+1688	5106 1
+1688	5798 1
+1688	6227 1
+1688	6496 1
+1688	6739 1
+1688	8174 1
+1724	1726 1
+1725	1726 1
+1728	1716 1
+1729	214 1
+1729	1124 1
+1729	1200 1
+1729	1353 1
+1729	1754 1
+1729	1857 1
+1729	1888 1
+1729	1893 1
+1729	2014 1
+1729	2264 1
+1729	2348 1
+1729	2470 1
+1729	2535 1
+1729	2580 1
+1729	2856 1
+1729	3084 1
+1729	3265 1
+1729	4037 1
+1729	8290 1
+1732	559 1
+1732	904 1
+1732	1416 1
+1732	1487 1
+1732	1492 1
+1732	1730 1
+1732	1772 1
+1732	1805 1
+1732	1811 1
+1732	1893 1
+1732	1908 1
+1732	1956 1
+1732	2256 1
+1732	2474 1
+1732	2594 1
+1732	2651 1
+1732	2955 1
+1732	3307 1
+1730	15 1
+1730	425 1
+1730	559 1
+1730	762 1
+1730	993 1
+1730	1026 1
+1730	1166 1
+1730	1211 1
+1730	1549 1
+1730	1565 1
+1730	1732 1
+1730	1772 1
+1730	1859 1
+1730	2016 1
+1730	2072 1
+1730	2109 1
+1730	2246 1
+1730	2323 1
+1730	2328 1
+1730	2339 1
+1730	2348 1
+1730	2385 1
+1730	2397 1
+1730	2398 1
+1730	2400 1
+1730	2576 1
+1730	2579 1
+1730	2625 1
+1730	2643 1
+1730	2763 1
+1730	2871 1
+1730	3050 1
+1730	3253 1
+1730	3443 1
+1730	3804 1
+1730	3970 1
+1730	3976 1
+1730	4037 1
+1730	4110 1
+1730	4191 1
+1730	4199 1
+1730	4384 1
+1730	4735 1
+1730	6094 1
+1730	8294 1
+1731	1732 1
+1733	15 1
+1733	298 1
+1733	1247 1
+1733	1352 1
+1733	1482 1
+1733	1514 1
+1733	1549 1
+1733	1799 1
+1733	1816 1
+1733	1966 1
+1733	2364 1
+1733	2516 1
+1733	2651 1
+1733	2657 1
+1733	3015 1
+1733	3073 1
+1733	3089 1
+1733	3238 1
+1733	3334 1
+1733	3352 1
+1733	3433 1
+1733	3607 1
+1733	3970 1
+1733	4099 1
+1733	4335 1
+1733	4735 1
+1733	4786 1
+1733	4875 1
+1733	5210 1
+1733	5254 1
+1733	5449 1
+1733	5527 1
+1733	5714 1
+1733	5936 1
+1733	6337 1
+1733	6347 1
+1733	6481 1
+1733	6774 1
+1733	7143 1
+1733	7620 1
+1733	7632 1
+1733	7699 1
+1734	290 1
+1734	465 1
+1734	764 1
+1734	908 1
+1734	1151 1
+1734	1211 1
+1734	1322 1
+1734	1357 1
+1734	1378 1
+1734	1453 1
+1734	1521 1
+1734	1585 1
+1734	1633 1
+1734	1754 1
+1734	1808 1
+1734	1893 1
+1734	1918 1
+1734	1969 1
+1734	2066 1
+1734	2128 1
+1734	2241 1
+1734	2246 1
+1734	2328 1
+1734	2354 1
+1734	2398 1
+1734	2474 1
+1734	2485 1
+1734	2508 1
+1734	2535 1
+1734	2593 1
+1734	2595 1
+1734	2625 1
+1734	2696 1
+1734	2727 1
+1734	2912 1
+1734	3258 1
+1734	3265 1
+1734	3473 1
+1734	3537 1
+1734	4037 1
+1734	4043 1
+1734	4310 1
+1734	4335 1
+1734	4875 1
+1734	4929 1
+1734	4954 1
+1734	5002 1
+1734	5178 1
+1734	5233 1
+1734	5697 1
+1734	6462 1
+1734	6553 1
+1734	7632 1
+1734	7651 1
+1734	7961 1
+1735	1322 1
+1736	1199 1
+1737	1199 1
+1737	2799 1
+1737	3376 1
+1737	5178 1
+1737	5301 1
+1737	5624 1
+1737	5760 1
+1737	6098 1
+1737	6340 1
+1740	1199 1
+1738	1199 1
+1738	1811 1
+1738	2085 1
+1739	1199 1
+1741	214 1
+1741	1199 1
+1741	1419 1
+1741	1496 1
+1741	1723 1
+1741	2174 1
+1741	2322 1
+1741	2501 1
+1741	2877 1
+1746	1378 1
+1746	1744 1
+1746	1788 1
+1746	1848 1
+1746	1893 1
+1746	2237 1
+1746	8291 1
+1742	935 1
+1742	1411 1
+1742	1746 1
+1742	1780 1
+1742	1859 1
+1742	1901 1
+1743	1746 1
+1744	1297 1
+1744	1746 1
+1744	2508 1
+1744	2657 1
+1744	2900 1
+1744	3024 1
+1744	3435 1
+1744	3776 1
+1745	1746 1
+1747	2479 1
+1747	3452 1
+1747	3480 1
+1748	350 1
+1748	1026 1
+1748	1307 1
+1748	1453 1
+1748	1521 1
+1748	1549 1
+1748	1592 1
+1748	1637 1
+1748	1646 1
+1748	1747 1
+1748	1984 1
+1748	2237 1
+1748	2264 1
+1748	2398 1
+1748	2456 1
+1748	2506 1
+1748	2517 1
+1748	2565 1
+1748	2643 1
+1748	2665 1
+1748	2669 1
+1748	2774 1
+1748	2923 1
+1748	3009 1
+1748	3026 1
+1748	3030 1
+1748	3117 1
+1748	3191 1
+1748	3310 1
+1748	3334 1
+1748	3376 1
+1748	3394 1
+1748	3443 1
+1748	3452 1
+1748	3480 1
+1748	3548 1
+1748	3562 1
+1748	3635 1
+1748	3661 1
+1748	3755 1
+1748	3976 1
+1748	4013 1
+1748	4037 1
+1748	4103 1
+1748	4110 1
+1748	4179 1
+1748	4189 1
+1748	4191 1
+1748	4199 1
+1748	4351 1
+1748	4424 1
+1748	4463 1
+1748	4480 1
+1748	4500 1
+1748	4588 1
+1748	4605 1
+1748	4797 1
+1748	4815 1
+1748	5100 1
+1748	5115 1
+1748	5738 1
+1748	5817 1
+1748	5887 1
+1748	6006 1
+1748	6123 1
+1748	6320 1
+1748	6442 1
+1748	6634 1
+1748	6993 1
+1748	7386 1
+1748	7809 1
+1748	7890 1
+1748	7946 1
+1748	8249 1
+1748	8275 1
+1748	8291 1
+1749	64 1
+1749	856 1
+1749	859 1
+1749	904 1
+1749	1097 1
+1749	1297 1
+1749	1565 1
+1749	1633 1
+1749	1646 1
+1749	1783 1
+1749	1918 1
+1749	1919 1
+1749	1997 1
+1749	2062 1
+1749	2072 1
+1749	2145 1
+1749	2210 1
+1749	2231 1
+1749	2285 1
+1749	2329 1
+1749	2338 1
+1749	2398 1
+1749	2470 1
+1749	2490 1
+1749	2508 1
+1749	2576 1
+1749	2594 1
+1749	2604 1
+1749	2625 1
+1749	2643 1
+1749	2651 1
+1749	2653 1
+1749	2654 1
+1749	2662 1
+1749	2674 1
+1749	2700 1
+1749	2707 1
+1749	2713 1
+1749	2747 1
+1749	2754 1
+1749	2763 1
+1749	2859 1
+1749	2877 1
+1749	2912 1
+1749	2951 1
+1749	2991 1
+1749	2993 1
+1749	3020 1
+1749	3030 1
+1749	3033 1
+1749	3130 1
+1749	3173 1
+1749	3243 1
+1749	3260 1
+1749	3307 1
+1749	3435 1
+1749	3483 1
+1749	3516 1
+1749	3538 1
+1749	3562 1
+1749	3670 1
+1749	3755 1
+1749	3843 1
+1749	3926 1
+1749	3937 1
+1749	4021 1
+1749	8290 1
+1749	8293 1
+1758	1788 1
+1758	1802 1
+1753	1758 1
+1754	407 1
+1754	762 1
+1754	1185 1
+1754	1211 1
+1754	1496 1
+1754	1658 1
+1754	1729 1
+1754	1758 1
+1754	1893 1
+1754	1918 1
+1754	1956 1
+1754	2066 1
+1754	2117 1
+1754	2211 1
+1754	2240 1
+1754	2251 1
+1754	2345 1
+1754	2456 1
+1754	2625 1
+1754	2801 1
+1754	3371 1
+1754	3787 1
+1754	3958 1
+1755	1758 1
+1756	332 1
+1756	372 1
+1756	587 1
+1756	722 1
+1756	744 1
+1756	763 1
+1756	859 1
+1756	908 1
+1756	937 1
+1756	946 1
+1756	959 1
+1756	968 1
+1756	1000 1
+1756	1018 1
+1756	1061 1
+1756	1103 1
+1756	1186 1
+1756	1200 1
+1756	1230 1
+1756	1250 1
+1756	1261 1
+1756	1297 1
+1756	1315 1
+1756	1353 1
+1756	1390 1
+1756	1411 1
+1756	1492 1
+1756	1514 1
+1756	1534 1
+1756	1547 1
+1756	1550 1
+1756	1608 1
+1756	1622 1
+1756	1628 1
+1756	1658 1
+1756	1697 1
+1756	1700 1
+1756	1717 1
+1756	1749 1
+1756	1758 1
+1756	1780 1
+1756	1783 1
+1756	1787 1
+1756	1788 1
+1756	1791 1
+1756	1798 1
+1756	1802 1
+1756	1805 1
+1756	1811 1
+1756	1816 1
+1756	1835 1
+1756	1836 1
+1756	1842 1
+1756	1849 1
+1756	1859 1
+1756	1888 1
+1756	1901 1
+1756	1903 1
+1756	1908 1
+1756	1918 1
+1756	1964 1
+1756	1973 1
+1756	1977 1
+1756	2062 1
+1756	2071 1
+1756	2073 1
+1756	2145 1
+1756	2193 1
+1756	2240 1
+1756	2246 1
+1756	2253 1
+1756	2273 1
+1756	2332 1
+1756	2385 1
+1756	2397 1
+1756	2400 1
+1756	2426 1
+1756	2435 1
+1756	2470 1
+1756	2479 1
+1756	2517 1
+1756	2547 1
+1756	2560 1
+1756	2579 1
+1756	2955 1
+1756	2963 1
+1756	2966 1
+1756	2972 1
+1756	2977 1
+1757	993 1
+1757	1137 1
+1757	1628 1
+1757	1730 1
+1757	1758 1
+1757	1783 1
+1757	1788 1
+1757	1791 1
+1757	1849 1
+1757	1855 1
+1757	1857 1
+1757	1920 1
+1757	1973 1
+1757	2106 1
+1757	2151 1
+1757	8290 1
+1760	559 1
+1761	559 1
+1761	1770 1
+1762	559 1
+1762	1000 1
+1762	1493 1
+1762	1496 1
+1762	1555 1
+1762	1774 1
+1762	2160 1
+1762	2620 1
+1762	3297 1
+1762	3830 1
+1762	4065 1
+1762	4412 1
+1762	4441 1
+1762	4709 1
+1762	4712 1
+1762	4713 1
+1762	5254 1
+1762	5321 1
+1762	5596 1
+1762	5714 1
+1762	5811 1
+1762	5829 1
+1762	5871 1
+1762	6004 1
+1762	6221 1
+1762	6299 1
+1762	6347 1
+1762	6388 1
+1762	6560 1
+1762	6613 1
+1762	6632 1
+1762	6665 1
+1762	6699 1
+1762	6700 1
+1762	6725 1
+1762	6755 1
+1762	6770 1
+1762	6777 1
+1762	6788 1
+1762	6809 1
+1762	6832 1
+1762	6833 1
+1762	6850 1
+1762	7047 1
+1762	7647 1
+1762	8002 1
+1762	8297 1
+1763	1687 1
+1764	1564 1
+1764	1811 1
+1765	1407 1
+1765	1487 1
+1765	1849 1
+1765	1983 1
+1766	332 1
+1766	722 1
+1766	947 1
+1766	1018 1
+1766	1250 1
+1766	1297 1
+1766	1374 1
+1766	1496 1
+1766	1700 1
+1766	1768 1
+1766	1791 1
+1766	1835 1
+1766	1842 1
+1766	1964 1
+1766	2062 1
+1766	2182 1
+1766	2240 1
+1766	2290 1
+1766	2345 1
+1766	2397 1
+1766	2435 1
+1766	2470 1
+1766	2490 1
+1766	2517 1
+1766	2777 1
+1766	2955 1
+1766	8290 1
+1767	15 1
+1767	407 1
+1767	608 1
+1767	762 1
+1767	937 1
+1767	993 1
+1767	1097 1
+1767	1151 1
+1767	1164 1
+1767	1165 1
+1767	1200 1
+1767	1473 1
+1767	1496 1
+1767	1534 1
+1767	1628 1
+1767	1706 1
+1767	1768 1
+1767	1772 1
+1767	1774 1
+1767	1777 1
+1767	1780 1
+1767	1802 1
+1767	1811 1
+1767	1847 1
+1767	1915 1
+1767	1918 1
+1767	1919 1
+1767	2066 1
+1767	2097 1
+1767	2114 1
+1767	2209 1
+1767	2237 1
+1767	2256 1
+1767	2277 1
+1767	2328 1
+1767	2340 1
+1767	2381 1
+1767	2398 1
+1767	2411 1
+1767	2547 1
+1767	2576 1
+1767	2585 1
+1767	2620 1
+1767	2625 1
+1767	2654 1
+1767	2678 1
+1767	2686 1
+1767	2727 1
+1767	2775 1
+1767	2781 1
+1767	2794 1
+1767	2797 1
+1767	2809 1
+1767	2834 1
+1767	2900 1
+1767	2909 1
+1767	2932 1
+1767	2946 1
+1767	2955 1
+1767	2963 1
+1767	2991 1
+1767	3029 1
+1767	3033 1
+1767	3200 1
+1767	3291 1
+1767	3334 1
+1767	3338 1
+1767	3352 1
+1767	3408 1
+1767	3446 1
+1767	3473 1
+1767	3480 1
+1767	3541 1
+1767	3680 1
+1767	3803 1
+1767	3807 1
+1767	3813 1
+1767	3847 1
+1767	3926 1
+1767	3937 1
+1767	3946 1
+1767	4037 1
+1767	4110 1
+1767	4138 1
+1767	4191 1
+1767	4247 1
+1767	4290 1
+1767	4453 1
+1767	4828 1
+1767	5100 1
+1767	5233 1
+1767	5254 1
+1767	5714 1
+1767	6437 1
+1767	6496 1
+1767	7131 1
+1767	8293 1
+1770	1771 1
+1769	214 1
+1769	403 1
+1769	415 1
+1769	765 1
+1769	993 1
+1769	1151 1
+1769	1164 1
+1769	1211 1
+1769	1261 1
+1769	1284 1
+1769	1416 1
+1769	1549 1
+1769	1585 1
+1769	1680 1
+1769	1754 1
+1769	1770 1
+1769	1781 1
+1769	1965 1
+1769	1966 1
+1769	2102 1
+1769	2117 1
+1769	2120 1
+1769	2253 1
+1769	2371 1
+1769	2479 1
+1769	2504 1
+1769	2516 1
+1769	2517 1
+1769	2535 1
+1769	2547 1
+1769	2560 1
+1769	2571 1
+1769	2580 1
+1769	2587 1
+1769	2593 1
+1769	2617 1
+1769	2619 1
+1769	2625 1
+1769	2643 1
+1769	2654 1
+1769	2655 1
+1769	2697 1
+1769	2774 1
+1769	2785 1
+1769	2794 1
+1769	2828 1
+1769	2922 1
+1769	2968 1
+1769	3027 1
+1769	3117 1
+1769	3125 1
+1769	3253 1
+1769	3352 1
+1769	3376 1
+1769	3537 1
+1769	3615 1
+1769	3803 1
+1769	3898 1
+1769	4040 1
+1769	4043 1
+1769	4361 1
+1769	4712 1
+1769	5327 1
+1769	5680 1
+1769	6441 1
+1769	7478 1
+1769	7683 1
+1772	56 1
+1772	285 1
+1772	332 1
+1772	763 1
+1772	764 1
+1772	836 1
+1772	937 1
+1772	959 1
+1772	993 1
+1772	1012 1
+1772	1031 1
+1772	1103 1
+1772	1111 1
+1772	1137 1
+1772	1151 1
+1772	1164 1
+1772	1186 1
+1772	1243 1
+1772	1261 1
+1772	1297 1
+1772	1374 1
+1772	1378 1
+1772	1407 1
+1772	1492 1
+1772	1496 1
+1772	1514 1
+1772	1521 1
+1772	1549 1
+1772	1550 1
+1772	1555 1
+1772	1564 1
+1772	1585 1
+1772	1621 1
+1772	1622 1
+1772	1637 1
+1772	1646 1
+1772	1700 1
+1772	1723 1
+1772	1730 1
+1772	1757 1
+1772	1774 1
+1772	1780 1
+1772	1783 1
+1772	1787 1
+1772	1791 1
+1772	1798 1
+1772	1805 1
+1772	1811 1
+1772	1836 1
+1772	1842 1
+1772	1847 1
+1772	1859 1
+1772	1861 1
+1772	1864 1
+1772	1880 1
+1772	1884 1
+1772	1888 1
+1772	1893 1
+1772	1903 1
+1772	1918 1
+1772	1927 1
+1772	1955 1
+1772	1956 1
+1772	1964 1
+1772	1966 1
+1772	1977 1
+1772	1987 1
+1772	1992 1
+1772	1997 1
+1772	2066 1
+1772	2069 1
+1772	2071 1
+1772	2083 1
+1772	2095 1
+1772	2101 1
+1772	2106 1
+1772	2112 1
+1772	2117 1
+1772	2120 1
+1772	2121 1
+1772	2128 1
+1772	2151 1
+1772	2157 1
+1772	2168 1
+1772	2174 1
+1772	2178 1
+1772	2210 1
+1772	2246 1
+1772	2264 1
+1772	2294 1
+1772	2329 1
+1772	2333 1
+1772	2339 1
+1772	2341 1
+1772	2348 1
+1772	2397 1
+1772	2400 1
+1772	2409 1
+1772	2410 1
+1772	2423 1
+1772	2425 1
+1772	2490 1
+1772	2501 1
+1772	2504 1
+1772	2535 1
+1772	2580 1
+1772	2618 1
+1772	2619 1
+1772	2625 1
+1772	2638 1
+1772	2647 1
+1772	2670 1
+1772	2685 1
+1772	2720 1
+1772	2777 1
+1772	2785 1
+1772	2794 1
+1772	2797 1
+1772	2798 1
+1772	2801 1
+1772	2814 1
+1772	2877 1
+1772	2880 1
+1772	3024 1
+1772	3136 1
+1772	3258 1
+1772	3260 1
+1772	3650 1
+1772	3755 1
+1772	3812 1
+1772	3922 1
+1772	3933 1
+1772	3967 1
+1772	3970 1
+1772	3999 1
+1772	4021 1
+1772	4024 1
+1772	8290 1
+1772	8291 1
+1772	8292 1
+1772	8293 1
+1759	290 1
+1759	1411 1
+1759	1514 1
+1759	1780 1
+1759	1966 1
+1773	1774 1
+1777	2625 1
+1775	1777 1
+1778	1164 1
+1778	1780 1
+1778	1791 1
+1778	1819 1
+1778	1884 1
+1778	1920 1
+1778	1955 1
+1778	1966 1
+1781	1000 1
+1781	2114 1
+1781	2410 1
+1781	2507 1
+1781	2625 1
+1781	2657 1
+1782	1000 1
+1782	1781 1
+1751	15 1
+1751	56 1
+1751	204 1
+1751	214 1
+1751	290 1
+1751	417 1
+1751	608 1
+1751	665 1
+1751	1103 1
+1751	1549 1
+1751	1717 1
+1751	1730 1
+1751	1734 1
+1751	1787 1
+1751	1979 1
+1751	2016 1
+1751	2211 1
+1751	2252 1
+1751	2508 1
+1751	2535 1
+1751	2625 1
+1751	2651 1
+1751	2654 1
+1751	2951 1
+1751	3018 1
+1751	3180 1
+1751	3260 1
+1751	3307 1
+1751	3338 1
+1751	3371 1
+1751	3812 1
+1751	3887 1
+1751	3926 1
+1751	3937 1
+1751	4021 1
+1783	15 1
+1783	204 1
+1783	761 1
+1783	764 1
+1783	947 1
+1783	974 1
+1783	1035 1
+1783	1103 1
+1783	1353 1
+1783	1411 1
+1783	1416 1
+1783	1492 1
+1783	1542 1
+1783	1621 1
+1783	1700 1
+1783	1749 1
+1783	1754 1
+1783	1903 1
+1783	1918 1
+1783	1992 1
+1783	1997 1
+1783	2062 1
+1783	2066 1
+1783	2071 1
+1783	2120 1
+1783	2237 1
+1783	2241 1
+1783	2246 1
+1783	2251 1
+1783	2322 1
+1783	2398 1
+1783	2410 1
+1783	2474 1
+1783	2510 1
+1783	2585 1
+1783	2594 1
+1783	2618 1
+1783	2625 1
+1783	2653 1
+1783	2713 1
+1783	2746 1
+1783	2790 1
+1783	2805 1
+1783	3005 1
+1783	3030 1
+1783	3130 1
+1783	3260 1
+1783	3307 1
+1783	3464 1
+1783	3537 1
+1783	3562 1
+1783	3580 1
+1783	3748 1
+1783	4811 1
+1783	6148 1
+1783	6553 1
+1783	8290 1
+1784	1103 1
+1785	1103 1
+1789	1658 1
+1789	1783 1
+1789	1920 1
+1789	2144 1
+1789	2251 1
+1789	2787 1
+1789	3796 1
+1789	5452 1
+1789	5824 1
+1789	7833 1
+1789	7871 1
+1790	1791 1
+1790	2814 1
+1792	56 1
+1792	761 1
+1792	993 1
+1792	1034 1
+1792	1261 1
+1792	1284 1
+1792	1374 1
+1792	1521 1
+1792	1757 1
+1792	1787 1
+1792	1793 1
+1792	1805 1
+1792	1842 1
+1792	1857 1
+1792	1858 1
+1792	1861 1
+1792	1864 1
+1792	1908 1
+1792	1920 1
+1792	1973 1
+1792	1987 1
+1792	2055 1
+1792	2060 1
+1792	2073 1
+1792	2095 1
+1792	2157 1
+1792	2625 1
+1792	2754 1
+1792	2777 1
+1792	2801 1
+1792	8290 1
+1795	1157 1
+1795	1166 1
+1795	1357 1
+1795	1416 1
+1795	1453 1
+1795	1549 1
+1795	1571 1
+1795	1633 1
+1795	1717 1
+1795	1798 1
+1795	1805 1
+1795	1814 1
+1795	1919 1
+1795	2016 1
+1795	2210 1
+1795	2251 1
+1795	2290 1
+1795	2324 1
+1795	2364 1
+1795	2510 1
+1795	2542 1
+1795	2700 1
+1795	2747 1
+1795	2809 1
+1795	2811 1
+1795	2819 1
+1795	2912 1
+1795	2973 1
+1795	3020 1
+1795	3258 1
+1795	3265 1
+1795	3284 1
+1795	3352 1
+1795	3393 1
+1795	3408 1
+1795	3439 1
+1795	3843 1
+1795	4043 1
+1795	5073 1
+1795	5083 1
+1795	5092 1
+1795	5773 1
+1795	5814 1
+1795	7186 1
+679	214 1
+679	407 1
+679	1798 1
+1796	1798 1
+1796	1982 1
+1796	2160 1
+1796	2440 1
+1796	3459 1
+1796	3614 1
+1796	3897 1
+1796	4099 1
+1796	4483 1
+1796	4536 1
+1796	4717 1
+1796	4748 1
+1796	4795 1
+1796	5200 1
+1796	5210 1
+1796	5254 1
+1796	5273 1
+1796	5524 1
+1796	5684 1
+1796	5697 1
+1796	5739 1
+1796	5814 1
+1796	5871 1
+1796	5980 1
+1796	6221 1
+1796	6270 1
+1796	6305 1
+1796	6327 1
+1796	6505 1
+1796	6552 1
+1796	6560 1
+1796	6736 1
+1796	6739 1
+1796	6774 1
+1796	6832 1
+1796	7094 1
+1796	7168 1
+1796	8297 1
+1797	1798 1
+1799	1357 1
+1799	1628 1
+1799	1966 1
+1799	2223 1
+1799	2516 1
+1799	2535 1
+1799	2565 1
+1799	2576 1
+1799	2655 1
+1799	2697 1
+1799	2790 1
+1799	2912 1
+1799	3452 1
+1799	3456 1
+1799	3498 1
+1799	3796 1
+1799	3803 1
+1799	3830 1
+1799	3969 1
+1799	3970 1
+1799	4043 1
+1799	4058 1
+1799	4662 1
+1799	4735 1
+1799	4792 1
+1799	4981 1
+1799	5178 1
+1799	5412 1
+1799	5459 1
+1799	5463 1
+1799	5545 1
+1799	5563 1
+1799	5569 1
+1799	5684 1
+1799	5693 1
+1799	5798 1
+1799	5804 1
+1799	5814 1
+1799	5950 1
+1799	6044 1
+1799	6221 1
+1799	6555 1
+1799	6595 1
+1799	6665 1
+1799	6715 1
+1799	7012 1
+1799	7809 1
+1799	7908 1
+1800	15 1
+1800	993 1
+1800	1111 1
+1800	1151 1
+1800	1186 1
+1800	1493 1
+1800	1628 1
+1800	1787 1
+1800	1836 1
+1800	1842 1
+1800	1858 1
+1800	1908 1
+1800	2246 1
+1800	2479 1
+1800	2774 1
+1800	4175 1
+1800	6334 1
+1800	6496 1
+1800	6715 1
+1800	8291 1
+1811	722 1
+1811	762 1
+1811	859 1
+1811	1031 1
+1811	1097 1
+1811	1267 1
+1811	1297 1
+1811	1352 1
+1811	1393 1
+1811	1473 1
+1811	1633 1
+1811	1648 1
+1811	1973 1
+1811	2001 1
+1811	2114 1
+1811	2160 1
+1811	2240 1
+1811	2332 1
+1811	2371 1
+1811	2625 1
+1811	2643 1
+1811	2651 1
+1811	2654 1
+1811	2693 1
+1811	3238 1
+1811	3266 1
+1811	3307 1
+1811	3629 1
+1811	3634 1
+1811	4349 1
+1811	4536 1
+1811	4574 1
+1811	4632 1
+1811	5028 1
+1811	5445 1
+1811	5891 1
+1811	6151 1
+1811	6328 1
+1811	6699 1
+1811	7092 1
+1811	7280 1
+1811	7587 1
+1811	7910 1
+1803	762 1
+1803	859 1
+1803	974 1
+1803	993 1
+1803	1164 1
+1803	1549 1
+1803	1613 1
+1803	1811 1
+1803	1842 1
+1803	1919 1
+1803	2071 1
+1803	2109 1
+1803	2168 1
+1803	2697 1
+1803	3002 1
+1803	3537 1
+1803	4297 1
+1803	6226 1
+1803	8290 1
+1804	1811 1
+1805	1811 1
+1805	1893 1
+1806	1811 1
+1807	1811 1
+1807	2354 1
+1807	3059 1
+1807	3796 1
+1807	4247 1
+1807	4653 1
+1807	5484 1
+1807	5511 1
+1808	72 1
+1808	465 1
+1808	722 1
+1808	762 1
+1808	765 1
+1808	946 1
+1808	993 1
+1808	1049 1
+1808	1097 1
+1808	1111 1
+1808	1164 1
+1808	1230 1
+1808	1284 1
+1808	1285 1
+1808	1353 1
+1808	1378 1
+1808	1384 1
+1808	1385 1
+1808	1407 1
+1808	1419 1
+1808	1482 1
+1808	1492 1
+1808	1514 1
+1808	1521 1
+1808	1549 1
+1808	1564 1
+1808	1566 1
+1808	1585 1
+1808	1608 1
+1808	1621 1
+1808	1622 1
+1808	1680 1
+1808	1700 1
+1808	1705 1
+1808	1717 1
+1808	1723 1
+1808	1734 1
+1808	1772 1
+1808	1783 1
+1808	1805 1
+1808	1811 1
+1808	1816 1
+1808	1847 1
+1808	1888 1
+1808	1919 1
+1808	1927 1
+1808	1969 1
+1808	1977 1
+1808	1992 1
+1808	2004 1
+1808	2066 1
+1808	2106 1
+1808	2117 1
+1808	2120 1
+1808	2121 1
+1808	2145 1
+1808	2157 1
+1808	2174 1
+1808	2195 1
+1808	2234 1
+1808	2256 1
+1808	2297 1
+1808	2328 1
+1808	2375 1
+1808	2385 1
+1808	2410 1
+1808	2475 1
+1808	2485 1
+1808	2510 1
+1808	2517 1
+1808	2535 1
+1808	2542 1
+1808	2547 1
+1808	2560 1
+1808	2576 1
+1808	2579 1
+1808	2587 1
+1808	2589 1
+1808	2591 1
+1808	2595 1
+1808	2599 1
+1808	2604 1
+1808	2605 1
+1808	2629 1
+1808	2645 1
+1808	2646 1
+1808	2651 1
+1808	2652 1
+1808	2669 1
+1808	2708 1
+1808	2751 1
+1808	2794 1
+1808	2834 1
+1808	2900 1
+1808	2922 1
+1808	2955 1
+1808	2963 1
+1808	3028 1
+1808	3130 1
+1808	3136 1
+1808	3320 1
+1808	3352 1
+1808	3404 1
+1808	3408 1
+1808	3498 1
+1808	3516 1
+1808	3976 1
+1808	4103 1
+1808	4124 1
+1808	4191 1
+1808	4256 1
+1808	4338 1
+1808	4453 1
+1808	4735 1
+1808	5215 1
+1808	5254 1
+1808	5271 1
+1808	5296 1
+1808	5459 1
+1808	5482 1
+1808	5683 1
+1808	5714 1
+1808	5721 1
+1808	5947 1
+1808	5969 1
+1808	5980 1
+1808	8290 1
+1808	8291 1
+1808	8293 1
+1809	1811 1
+1809	1859 1
+1810	1811 1
+1812	1261 1
+1812	1842 1
+1812	1855 1
+1812	3371 1
+1813	465 1
+1813	825 1
+1813	1261 1
+1813	1549 1
+1813	1688 1
+1813	1842 1
+1813	2144 1
+1813	2145 1
+1813	2210 1
+1813	2535 1
+1813	2655 1
+1813	2746 1
+1813	2760 1
+1813	2871 1
+1813	3014 1
+1813	3024 1
+1813	3026 1
+1813	3028 1
+1813	3034 1
+1813	3117 1
+1813	3125 1
+1813	3144 1
+1813	3260 1
+1813	3321 1
+1813	3439 1
+1813	3453 1
+1813	3454 1
+1813	3557 1
+1813	3800 1
+1813	3812 1
+1813	3956 1
+1813	3967 1
+1813	4011 1
+1813	4021 1
+1813	4024 1
+1813	4051 1
+1813	4072 1
+1813	4531 1
+1813	4552 1
+1813	4578 1
+1813	7279 1
+1814	290 1
+1814	737 1
+1814	762 1
+1814	856 1
+1814	993 1
+1814	1261 1
+1814	1291 1
+1814	1315 1
+1814	1357 1
+1814	1393 1
+1814	1416 1
+1814	1596 1
+1814	1734 1
+1814	1754 1
+1814	1781 1
+1814	1919 1
+1814	2001 1
+1814	2134 1
+1814	2225 1
+1814	2251 1
+1814	2256 1
+1814	2276 1
+1814	2323 1
+1814	2440 1
+1814	2547 1
+1814	2550 1
+1814	2560 1
+1814	2593 1
+1814	2594 1
+1814	2620 1
+1814	2625 1
+1814	2651 1
+1814	2653 1
+1814	2654 1
+1814	2657 1
+1814	2660 1
+1814	2697 1
+1814	2707 1
+1814	2721 1
+1814	2724 1
+1814	2775 1
+1814	2815 1
+1814	2830 1
+1814	2856 1
+1814	2900 1
+1814	2955 1
+1814	2963 1
+1814	2966 1
+1814	2968 1
+1814	2972 1
+1814	2977 1
+1814	2979 1
+1814	2981 1
+1814	2991 1
+1814	2993 1
+1814	2999 1
+1814	3029 1
+1814	3033 1
+1814	3034 1
+1814	3050 1
+1814	3056 1
+1814	3099 1
+1814	3117 1
+1814	3130 1
+1814	3140 1
+1814	3150 1
+1814	3253 1
+1814	3291 1
+1814	3334 1
+1814	3456 1
+1814	3459 1
+1814	3516 1
+1814	3645 1
+1814	3720 1
+1814	3842 1
+1814	4117 1
+1814	4299 1
+1814	4422 1
+1814	4777 1
+1814	4944 1
+1814	5210 1
+1814	5305 1
+1814	5412 1
+1814	5454 1
+1814	5737 1
+1814	5798 1
+1814	5819 1
+1814	5902 1
+1814	6001 1
+1814	6004 1
+1814	6023 1
+1814	6124 1
+1814	6421 1
+1814	6462 1
+1814	6566 1
+1814	7168 1
+1814	7553 1
+1814	7699 1
+1814	8186 1
+1814	8192 1
+1814	8219 1
+1814	8224 1
+1814	8237 1
+1814	8293 1
+1814	8294 1
+1816	1151 1
+1816	1482 1
+1816	2066 1
+1816	2256 1
+1816	2625 1
+1816	3755 1
+1816	4335 1
+1816	5146 1
+1816	7620 1
+1816	8290 1
+1820	56 1
+1820	204 1
+1820	290 1
+1820	350 1
+1820	425 1
+1820	762 1
+1820	946 1
+1820	993 1
+1820	1097 1
+1820	1166 1
+1820	1211 1
+1820	1267 1
+1820	1291 1
+1820	1297 1
+1820	1357 1
+1820	1374 1
+1820	1419 1
+1820	1492 1
+1820	1514 1
+1820	1521 1
+1820	1621 1
+1820	1633 1
+1820	1646 1
+1820	1653 1
+1820	1734 1
+1820	1754 1
+1820	1792 1
+1820	1808 1
+1820	1814 1
+1820	1888 1
+1820	1918 1
+1820	1919 1
+1820	1956 1
+1820	1992 1
+1820	2053 1
+1820	2062 1
+1820	2102 1
+1820	2117 1
+1820	2120 1
+1820	2128 1
+1820	2225 1
+1820	2231 1
+1820	2256 1
+1820	2290 1
+1820	2297 1
+1820	2322 1
+1820	2323 1
+1820	2328 1
+1820	2333 1
+1820	2338 1
+1820	2366 1
+1820	2400 1
+1820	2411 1
+1820	2426 1
+1820	2499 1
+1820	2508 1
+1820	2510 1
+1820	2585 1
+1820	2593 1
+1820	2594 1
+1820	2599 1
+1820	2625 1
+1820	2643 1
+1820	2645 1
+1820	2654 1
+1820	2660 1
+1820	2665 1
+1820	2685 1
+1820	2686 1
+1820	2693 1
+1820	2697 1
+1820	2727 1
+1820	2736 1
+1820	2754 1
+1820	2814 1
+1820	2838 1
+1820	2856 1
+1820	2963 1
+1820	2991 1
+1820	3089 1
+1820	3117 1
+1820	3253 1
+1820	3276 1
+1820	3404 1
+1820	3557 1
+1820	3650 1
+1820	3807 1
+1820	3892 1
+1820	3903 1
+1820	8292 1
+1821	1514 1
+1821	1633 1
+1821	3117 1
+1821	3516 1
+1821	3548 1
+1821	3669 1
+1821	8291 1
+1822	407 1
+1822	1164 1
+1822	1230 1
+1822	1514 1
+1822	1585 1
+1822	1880 1
+1822	1893 1
+1822	1903 1
+1822	1908 1
+1822	1966 1
+1822	2073 1
+1823	737 1
+1823	763 1
+1823	765 1
+1823	935 1
+1823	1035 1
+1823	1353 1
+1823	1444 1
+1823	1498 1
+1823	1514 1
+1823	1717 1
+1823	1749 1
+1823	1805 1
+1823	1842 1
+1823	1855 1
+1823	1858 1
+1823	1893 1
+1823	1953 1
+1823	1956 1
+1823	1963 1
+1823	2128 1
+1823	2381 1
+1823	2511 1
+1823	2565 1
+1823	2822 1
+1823	3456 1
+1823	3460 1
+1823	3830 1
+1823	4065 1
+1823	4247 1
+1823	4315 1
+1823	4587 1
+1823	4600 1
+1823	4706 1
+1823	4824 1
+1823	5130 1
+1823	5188 1
+1823	5262 1
+1823	5423 1
+1823	5439 1
+1823	5651 1
+1823	5804 1
+1823	5819 1
+1823	6170 1
+1823	6272 1
+1823	6715 1
+1823	6860 1
+1823	6979 1
+1823	7116 1
+1823	7707 1
+1825	1842 1
+1826	1842 1
+1827	1842 1
+1827	2856 1
+347	407 1
+347	1165 1
+347	1842 1
+347	1855 1
+347	1920 1
+347	1950 1
+347	1953 1
+347	1956 1
+1835	15 1
+1835	762 1
+1835	959 1
+1835	974 1
+1835	1012 1
+1835	1035 1
+1835	1186 1
+1835	1200 1
+1835	1211 1
+1835	1315 1
+1835	1374 1
+1835	1407 1
+1835	1416 1
+1835	1492 1
+1835	1592 1
+1835	1792 1
+1835	1842 1
+1835	1918 1
+1835	2066 1
+1835	2160 1
+1835	2210 1
+1835	2240 1
+1835	2297 1
+1835	2322 1
+1835	2323 1
+1835	2398 1
+1835	2504 1
+1835	2506 1
+1835	2508 1
+1835	2535 1
+1835	2542 1
+1835	2547 1
+1835	2560 1
+1835	2576 1
+1835	2587 1
+1835	2625 1
+1835	2660 1
+1835	2707 1
+1835	2754 1
+1835	2770 1
+1835	2828 1
+1835	2830 1
+1835	2834 1
+1835	2993 1
+1835	2996 1
+1835	3002 1
+1835	3148 1
+1835	3352 1
+1835	3456 1
+1835	3458 1
+1835	3892 1
+1835	4110 1
+1835	4247 1
+1835	4338 1
+1835	4424 1
+1835	4468 1
+1835	4632 1
+1835	5100 1
+1835	5210 1
+1835	5254 1
+1835	5714 1
+1835	5799 1
+1835	5828 1
+1835	6000 1
+1835	6229 1
+1835	6437 1
+1835	6634 1
+1835	6833 1
+1835	6840 1
+1835	6930 1
+1835	7115 1
+1835	8141 1
+1835	8294 1
+1836	214 1
+1836	407 1
+1836	722 1
+1836	859 1
+1836	908 1
+1836	959 1
+1836	1151 1
+1836	1165 1
+1836	1211 1
+1836	1297 1
+1836	1585 1
+1836	1608 1
+1836	1622 1
+1836	1842 1
+1836	1956 1
+1836	2193 1
+1828	1842 1
+1828	1849 1
+1837	290 1
+1837	836 1
+1837	993 1
+1837	1137 1
+1837	1315 1
+1837	1407 1
+1837	1542 1
+1837	1566 1
+1837	1754 1
+1837	1842 1
+1837	1919 1
+1837	2060 1
+1837	2073 1
+1837	2076 1
+1837	2091 1
+1837	2119 1
+1837	2168 1
+1837	2205 1
+1837	2251 1
+1837	2371 1
+1837	2593 1
+1837	2617 1
+1837	2654 1
+1837	2697 1
+1837	2963 1
+1837	3033 1
+1837	3034 1
+1837	3104 1
+1829	1717 1
+1829	1842 1
+1838	761 1
+1838	764 1
+1838	825 1
+1838	836 1
+1838	908 1
+1838	937 1
+1838	993 1
+1838	1137 1
+1838	1239 1
+1838	1285 1
+1838	1407 1
+1838	1585 1
+1838	1622 1
+1838	1707 1
+1838	1714 1
+1838	1730 1
+1838	1757 1
+1838	1772 1
+1838	1842 1
+1838	1849 1
+1838	1893 1
+1838	1953 1
+1838	1969 1
+1838	1973 1
+1838	1991 1
+1838	1992 1
+1838	2060 1
+1838	2066 1
+1838	2071 1
+1838	2073 1
+1838	2079 1
+1838	2095 1
+1838	2097 1
+1838	2101 1
+1838	2106 1
+1838	2109 1
+1838	2112 1
+1838	2128 1
+1838	2151 1
+1838	2157 1
+1838	2168 1
+1838	2178 1
+1838	2210 1
+1838	2859 1
+1838	2958 1
+1838	3258 1
+1838	3562 1
+1838	3631 1
+1838	3787 1
+1838	4013 1
+1838	4088 1
+1838	4110 1
+1838	4201 1
+1838	4233 1
+1838	8290 1
+1838	8293 1
+1838	8294 1
+1830	1542 1
+1830	1842 1
+1830	1855 1
+1831	1542 1
+1831	1842 1
+1831	1855 1
+1832	1805 1
+1832	1842 1
+1832	2210 1
+1832	2746 1
+1832	2819 1
+1832	8293 1
+1833	1842 1
+1833	1855 1
+1833	2112 1
+1833	2654 1
+1833	3164 1
+1833	4247 1
+1834	1842 1
+1839	1842 1
+1840	1842 1
+1840	1855 1
+1841	1842 1
+1849	1211 1
+1844	1849 1
+1845	1849 1
+1846	1849 1
+1847	15 1
+1847	285 1
+1847	761 1
+1847	959 1
+1847	993 1
+1847	1411 1
+1847	1787 1
+1847	1849 1
+1847	1893 1
+1847	1903 1
+1847	1908 1
+1847	1953 1
+1847	1973 1
+1847	2066 1
+1847	2178 1
+1847	2324 1
+1847	2354 1
+1847	2398 1
+1847	2510 1
+1847	2625 1
+1847	2693 1
+1847	2747 1
+1847	2790 1
+1847	2973 1
+1847	3103 1
+1847	3130 1
+1847	3460 1
+1847	3897 1
+1847	3910 1
+1847	4099 1
+1847	4191 1
+1847	4400 1
+1847	4712 1
+1847	4735 1
+1847	4811 1
+1847	5132 1
+1847	5188 1
+1847	5208 1
+1847	5254 1
+1847	5392 1
+1847	5412 1
+1847	5449 1
+1847	5827 1
+1847	6552 1
+1847	6566 1
+1847	7146 1
+1847	7168 1
+1852	1849 1
+1848	204 1
+1848	762 1
+1848	836 1
+1848	1211 1
+1848	1787 1
+1848	1849 1
+1848	2053 1
+1848	2062 1
+1848	2102 1
+1848	2256 1
+1848	2328 1
+1848	2754 1
+1848	2763 1
+1848	2880 1
+1848	3089 1
+1848	3680 1
+1853	1849 1
+1859	3443 1
+1859	4037 1
+1859	4071 1
+1855	1111 1
+1855	1622 1
+1855	1697 1
+1855	1859 1
+1855	1893 1
+1855	1927 1
+1855	1956 1
+1855	1963 1
+1855	2237 1
+1855	2856 1
+1855	3136 1
+1855	3408 1
+1856	1859 1
+1857	407 1
+1857	1230 1
+1857	1859 1
+1857	2307 1
+1857	2785 1
+1857	2787 1
+1857	8290 1
+1857	8291 1
+1858	1859 1
+1860	1859 1
+1862	290 1
+1862	1864 1
+1865	1411 1
+1865	4666 1
+1865	5814 1
+1865	6560 1
+1865	7052 1
+1865	7386 1
+1866	1411 1
+1867	1411 1
+1867	1865 1
+1868	764 1
+1868	836 1
+1868	975 1
+1868	1378 1
+1868	1411 1
+1868	1444 1
+1868	1583 1
+1868	1613 1
+1868	1714 1
+1868	1749 1
+1868	1783 1
+1868	1787 1
+1868	1848 1
+1868	1985 1
+1868	2071 1
+1868	2085 1
+1868	2091 1
+1868	2128 1
+1868	2210 1
+1868	2211 1
+1868	2241 1
+1868	2253 1
+1869	1717 1
+1869	2062 1
+1869	3680 1
+1870	1717 1
+1874	1026 1
+1874	1717 1
+1874	3192 1
+1874	3835 1
+1874	4276 1
+1874	5254 1
+1874	5452 1
+1874	5511 1
+1874	6229 1
+1875	56 1
+1875	204 1
+1875	1166 1
+1875	1393 1
+1875	1705 1
+1875	1717 1
+1875	1730 1
+1875	1837 1
+1875	2102 1
+1875	2174 1
+1875	2225 1
+1875	2256 1
+1875	2264 1
+1875	2565 1
+1875	2619 1
+1875	2625 1
+1875	2686 1
+1875	2693 1
+1875	2794 1
+1875	2809 1
+1875	2825 1
+1875	2828 1
+1875	2928 1
+1875	2996 1
+1875	3029 1
+1875	3130 1
+1875	3193 1
+1875	3410 1
+1875	3717 1
+1875	3903 1
+1875	4269 1
+1875	4289 1
+1875	4735 1
+1871	1717 1
+1872	935 1
+1872	1297 1
+1872	1717 1
+1872	2485 1
+1872	3529 1
+1876	1111 1
+1876	1717 1
+1876	5254 1
+1873	1717 1
+1879	1880 1
+1879	2120 1
+1879	3885 1
+1879	5002 1
+1879	5423 1
+1879	6123 1
+1879	6305 1
+1879	6417 1
+1879	6442 1
+1879	6765 1
+1879	7414 1
+1879	7422 1
+1879	7624 1
+1881	935 1
+1882	935 1
+1883	935 1
+1885	407 1
+1885	762 1
+1885	765 1
+1885	856 1
+1885	1097 1
+1885	1297 1
+1885	1357 1
+1885	1482 1
+1885	1534 1
+1885	1549 1
+1885	1777 1
+1885	1893 1
+1885	1908 1
+1885	2016 1
+1885	2102 1
+1885	2114 1
+1885	2135 1
+1885	2210 1
+1885	2225 1
+1885	2231 1
+1885	2256 1
+1885	2257 1
+1885	2322 1
+1885	2475 1
+1885	2485 1
+1885	2535 1
+1885	2587 1
+1885	2593 1
+1885	2617 1
+1885	2619 1
+1885	2625 1
+1885	2655 1
+1885	2657 1
+1885	2697 1
+1885	2713 1
+1885	2809 1
+1885	2932 1
+1885	3130 1
+1885	3136 1
+1885	3155 1
+1885	3404 1
+1885	3453 1
+1885	3650 1
+1885	3892 1
+1886	1211 1
+1886	1697 1
+1886	1893 1
+1886	2091 1
+1887	763 1
+1887	1893 1
+1888	764 1
+1888	873 1
+1888	978 1
+1888	993 1
+1888	1031 1
+1888	1243 1
+1888	1613 1
+1888	1646 1
+1888	1893 1
+1888	1956 1
+1888	1977 1
+1888	2102 1
+1888	2128 1
+1888	2145 1
+1888	2157 1
+1888	2163 1
+1888	2205 1
+1888	2210 1
+1888	2211 1
+1888	2253 1
+1888	2276 1
+1888	2323 1
+1888	2329 1
+1888	2339 1
+1888	2341 1
+1888	2350 1
+1888	2410 1
+1888	2781 1
+1888	2794 1
+1888	3843 1
+1888	4043 1
+1888	4055 1
+1888	5321 1
+1888	5412 1
+1888	8290 1
+1888	8291 1
+1889	1893 1
+1891	415 1
+1891	762 1
+1891	993 1
+1891	1049 1
+1891	1097 1
+1891	1186 1
+1891	1211 1
+1891	1230 1
+1891	1250 1
+1891	1384 1
+1891	1633 1
+1891	1678 1
+1891	1893 1
+1891	1992 1
+1891	2102 1
+1891	2195 1
+1891	2205 1
+1891	2504 1
+1891	2580 1
+1891	2618 1
+1891	2619 1
+1891	2625 1
+1891	2724 1
+1891	2770 1
+1891	2923 1
+1891	2977 1
+1891	3568 1
+1891	3807 1
+1891	3976 1
+1891	4021 1
+1891	4256 1
+1891	5083 1
+1891	5144 1
+1891	5539 1
+1891	5784 1
+1891	8293 1
+1892	407 1
+1892	1893 1
+1892	1953 1
+1892	1963 1
+1892	1969 1
+1894	1534 1
+1895	1534 1
+1896	285 1
+1896	290 1
+1896	403 1
+1896	836 1
+1896	947 1
+1896	1035 1
+1896	1211 1
+1896	1297 1
+1896	1315 1
+1896	1374 1
+1896	1390 1
+1896	1498 1
+1896	1534 1
+1896	1549 1
+1896	1956 1
+1896	2066 1
+1896	2109 1
+1896	2144 1
+1896	2324 1
+1896	2345 1
+1896	2348 1
+1896	2516 1
+1896	2576 1
+1896	2650 1
+1896	2651 1
+1896	2696 1
+1896	2700 1
+1896	2805 1
+1896	3021 1
+1896	3092 1
+1896	3099 1
+1896	3117 1
+1896	3253 1
+1896	3309 1
+1896	3435 1
+1896	3748 1
+1896	3807 1
+1896	3887 1
+1896	4037 1
+1896	4266 1
+1896	4536 1
+1896	4547 1
+1896	6001 1
+1896	6327 1
+1896	6699 1
+1896	7144 1
+1896	7553 1
+1896	7707 1
+1896	8237 1
+1896	8290 1
+1896	8293 1
+1897	763 1
+1901	3847 1
+1899	1165 1
+1899	1230 1
+1899	1284 1
+1899	1901 1
+1899	2066 1
+1899	3516 1
+1900	1901 1
+1902	1903 1
+1908	993 1
+1908	1137 1
+1908	1164 1
+1908	1315 1
+1908	1566 1
+1908	1858 1
+1908	1927 1
+1908	1963 1
+1908	2333 1
+1905	1908 1
+1906	1908 1
+1907	1908 1
+1909	1908 1
+1911	1908 1
+1912	1908 1
+1912	3026 1
+1912	3059 1
+1913	1908 1
+1914	1658 1
+1914	5445 1
+1915	15 1
+1915	1658 1
+1915	2237 1
+1915	2354 1
+1915	2398 1
+1915	2516 1
+1915	2535 1
+1915	3089 1
+1915	3456 1
+1915	4310 1
+1915	4587 1
+1915	4875 1
+1915	5083 1
+1915	5100 1
+1915	5106 1
+1915	5121 1
+1915	5148 1
+1915	5200 1
+1915	5233 1
+1915	5262 1
+1915	5412 1
+1915	5459 1
+1915	5487 1
+1915	5527 1
+1915	5543 1
+1915	5891 1
+1915	6148 1
+1915	6161 1
+1915	6246 1
+1915	6251 1
+1915	6306 1
+1915	6328 1
+1915	8295 1
+1916	1658 1
+1917	1658 1
+1918	764 1
+1918	1211 1
+1918	1297 1
+1918	1492 1
+1918	1542 1
+1918	1565 1
+1918	1700 1
+1918	1920 1
+1918	1977 1
+1918	1992 1
+1918	2062 1
+1918	2066 1
+1918	2117 1
+1918	2322 1
+1918	2411 1
+1918	2958 1
+1918	3005 1
+1918	3014 1
+1918	3200 1
+1918	4072 1
+1919	56 1
+1919	214 1
+1919	290 1
+1919	332 1
+1919	403 1
+1919	407 1
+1919	415 1
+1919	587 1
+1919	665 1
+1919	764 1
+1919	765 1
+1919	836 1
+1919	859 1
+1919	908 1
+1919	937 1
+1919	946 1
+1919	947 1
+1919	959 1
+1919	975 1
+1919	1061 1
+1919	1151 1
+1919	1200 1
+1919	1211 1
+1919	1243 1
+1919	1284 1
+1919	1353 1
+1919	1374 1
+1919	1378 1
+1919	1390 1
+1919	1419 1
+1919	1482 1
+1919	1521 1
+1919	1542 1
+1919	1547 1
+1919	1550 1
+1919	1566 1
+1919	1583 1
+1919	1585 1
+1919	1608 1
+1919	1613 1
+1919	1622 1
+1919	1697 1
+1919	1714 1
+1919	1734 1
+1919	1749 1
+1919	1757 1
+1919	1783 1
+1919	1787 1
+1919	1816 1
+1919	1836 1
+1919	1842 1
+1919	1848 1
+1919	1888 1
+1919	1920 1
+1919	1964 1
+1919	1973 1
+1919	1977 1
+1919	1979 1
+1919	1983 1
+1919	1985 1
+1919	1987 1
+1919	1997 1
+1919	2007 1
+1919	2055 1
+1919	2060 1
+1919	2062 1
+1919	2066 1
+1919	2069 1
+1919	2071 1
+1919	2073 1
+1919	2085 1
+1919	2091 1
+1919	2119 1
+1919	2120 1
+1919	2137 1
+1919	2145 1
+1919	2157 1
+1919	2205 1
+1919	2210 1
+1919	2211 1
+1919	2241 1
+1919	2246 1
+1919	2251 1
+1919	2253 1
+1919	2264 1
+1919	2273 1
+1919	2285 1
+1919	2290 1
+1919	2345 1
+1919	2385 1
+1919	2397 1
+1919	2400 1
+1919	2411 1
+1919	2470 1
+1919	2479 1
+1919	2593 1
+1919	2617 1
+1919	2625 1
+1919	2763 1
+1919	2768 1
+1919	2805 1
+1919	2828 1
+1919	2830 1
+1919	2834 1
+1919	2946 1
+1919	2977 1
+1919	3033 1
+1919	3034 1
+1919	3099 1
+1919	3117 1
+1919	3136 1
+1919	8291 1
+1921	1230 1
+1922	72 1
+1922	188 1
+1922	204 1
+1922	285 1
+1922	290 1
+1922	425 1
+1922	465 1
+1922	587 1
+1922	608 1
+1922	633 1
+1922	741 1
+1922	762 1
+1922	827 1
+1922	856 1
+1922	946 1
+1922	1097 1
+1922	1154 1
+1922	1230 1
+1922	1267 1
+1922	1291 1
+1922	1353 1
+1922	1357 1
+1922	1393 1
+1922	1416 1
+1922	1419 1
+1922	1493 1
+1922	1521 1
+1922	1549 1
+1922	1571 1
+1922	1633 1
+1922	1679 1
+1922	1705 1
+1922	1706 1
+1922	1717 1
+1922	1723 1
+1922	1734 1
+1922	1754 1
+1922	1781 1
+1922	1792 1
+1922	1808 1
+1922	1814 1
+1922	1837 1
+1922	1847 1
+1922	1888 1
+1922	1919 1
+1922	1984 1
+1922	1992 1
+1922	2053 1
+1922	2116 1
+1922	2117 1
+1922	2135 1
+1922	2145 1
+1922	2174 1
+1922	2202 1
+1922	2225 1
+1922	2231 1
+1922	2251 1
+1922	2256 1
+1922	2273 1
+1922	2276 1
+1922	2294 1
+1922	2322 1
+1922	2323 1
+1922	2325 1
+1922	2356 1
+1922	2364 1
+1922	2371 1
+1922	2375 1
+1922	2381 1
+1922	2398 1
+1922	2411 1
+1922	2416 1
+1922	2426 1
+1922	2470 1
+1922	2474 1
+1922	2475 1
+1922	2501 1
+1922	2508 1
+1922	2516 1
+1922	2542 1
+1922	2544 1
+1922	2547 1
+1922	2550 1
+1922	2576 1
+1922	2585 1
+1922	2587 1
+1922	2593 1
+1922	2594 1
+1922	2599 1
+1922	2604 1
+1922	2607 1
+1922	2617 1
+1922	2618 1
+1922	2623 1
+1922	2625 1
+1922	2646 1
+1922	2647 1
+1922	2650 1
+1922	2654 1
+1922	2665 1
+1922	2669 1
+1922	2670 1
+1922	2697 1
+1922	2707 1
+1922	2708 1
+1922	2713 1
+1922	2721 1
+1922	2724 1
+1922	2751 1
+1922	2754 1
+1922	2787 1
+1922	2790 1
+1922	2815 1
+1922	2819 1
+1922	2838 1
+1922	2856 1
+1922	2880 1
+1922	2900 1
+1922	2902 1
+1922	2918 1
+1922	2922 1
+1922	2926 1
+1922	2928 1
+1922	2946 1
+1922	2951 1
+1922	2955 1
+1922	2963 1
+1922	2966 1
+1922	2996 1
+1922	3002 1
+1922	3007 1
+1922	3018 1
+1922	3020 1
+1922	3021 1
+1922	3024 1
+1922	3026 1
+1922	3028 1
+1922	3029 1
+1922	3030 1
+1922	3050 1
+1922	3056 1
+1922	3059 1
+1922	3082 1
+1922	3084 1
+1922	3089 1
+1922	3099 1
+1922	3117 1
+1922	3126 1
+1922	3140 1
+1922	3145 1
+1922	3150 1
+1922	3155 1
+1922	3164 1
+1922	3201 1
+1922	3243 1
+1922	3251 1
+1922	3253 1
+1922	3255 1
+1922	3260 1
+1922	3265 1
+1922	3284 1
+1922	3307 1
+1922	3324 1
+1922	3338 1
+1922	3351 1
+1922	3352 1
+1922	3404 1
+1922	3408 1
+1922	3435 1
+1922	3446 1
+1922	3452 1
+1922	3456 1
+1922	3473 1
+1922	3483 1
+1922	3486 1
+1922	3516 1
+1922	3537 1
+1922	3650 1
+1922	3812 1
+1922	3813 1
+1922	3830 1
+1922	3843 1
+1922	3871 1
+1922	3887 1
+1922	3892 1
+1922	3937 1
+1922	3946 1
+1922	4124 1
+1922	4297 1
+1922	4828 1
+1922	4983 1
+1922	5026 1
+1922	5055 1
+1922	5073 1
+1922	5083 1
+1922	5092 1
+1922	5106 1
+1922	5115 1
+1922	5130 1
+1922	5132 1
+1922	5305 1
+1922	7289 1
+1922	8292 1
+1922	8293 1
+1923	1111 1
+1923	1855 1
+1924	15 1
+1924	1855 1
+1924	3352 1
+1924	3835 1
+1924	6789 1
+1925	762 1
+1925	974 1
+1925	975 1
+1925	1111 1
+1925	1542 1
+1925	1633 1
+1925	1717 1
+1925	1836 1
+1925	1842 1
+1925	1855 1
+1925	1977 1
+1925	1983 1
+1925	2004 1
+1925	2165 1
+1925	2328 1
+1925	2651 1
+1925	2654 1
+1925	3018 1
+1925	3136 1
+1925	3408 1
+1925	3587 1
+1925	5511 1
+1928	1111 1
+1928	1855 1
+1928	1927 1
+1928	2060 1
+1928	2066 1
+1928	2654 1
+1928	3408 1
+1890	1855 1
+1926	1855 1
+1927	665 1
+1927	1855 1
+1929	1855 1
+1930	1855 1
+1931	1186 1
+1931	1353 1
+1931	1542 1
+1931	1842 1
+1931	1855 1
+1931	1888 1
+1931	1927 1
+1931	1964 1
+1931	1997 1
+1931	2654 1
+1931	2871 1
+1931	3408 1
+1931	3755 1
+1931	6227 1
+1931	8212 1
+1937	1026 1
+1937	1473 1
+1937	1548 1
+1937	1855 1
+1937	3084 1
+1937	3192 1
+1937	3456 1
+1937	4276 1
+1937	5254 1
+1937	5341 1
+1937	5423 1
+1937	5511 1
+1937	6009 1
+1932	1855 1
+1933	1855 1
+1938	1855 1
+1934	1855 1
+1935	1548 1
+1935	1855 1
+1935	2565 1
+1935	3192 1
+1935	3352 1
+1935	3830 1
+1935	5254 1
+1939	1855 1
+1940	1186 1
+1940	1835 1
+1940	1855 1
+1940	2323 1
+1940	2830 1
+1941	1857 1
+1943	407 1
+1943	2285 1
+1943	2625 1
+1944	407 1
+1944	1956 1
+1945	407 1
+1945	1816 1
+1946	1157 1
+1946	1165 1
+1946	4191 1
+1946	4323 1
+1947	1165 1
+1947	2210 1
+1947	2328 1
+1947	2565 1
+1947	2727 1
+1947	2900 1
+1947	2923 1
+1947	3117 1
+1947	3276 1
+1947	3541 1
+1947	3562 1
+1947	3800 1
+1947	3887 1
+1947	3892 1
+1947	4031 1
+1948	1165 1
+1948	1186 1
+1948	1608 1
+1948	1621 1
+1948	1918 1
+1948	1956 1
+1948	2004 1
+1948	2069 1
+1948	2114 1
+1948	2157 1
+1948	2378 1
+1948	2386 1
+1948	2470 1
+1948	2625 1
+827	1953 1
+827	3024 1
+827	3946 1
+1951	1953 1
+1951	2117 1
+1951	2128 1
+1951	2195 1
+1951	2257 1
+1951	2297 1
+1951	2324 1
+1951	2435 1
+1951	2485 1
+1951	2565 1
+1951	2625 1
+1951	2653 1
+1951	2657 1
+1951	2686 1
+1951	2819 1
+1951	2973 1
+1951	3010 1
+1951	3114 1
+1951	3352 1
+1951	3408 1
+1951	3480 1
+1951	3549 1
+1951	3615 1
+1951	3769 1
+1951	4994 1
+1951	5423 1
+1951	6481 1
+1951	6505 1
+1951	6632 1
+1955	2340 1
+1958	1963 1
+1959	1963 1
+1960	1963 1
+1961	1963 1
+1961	2354 1
+1961	2654 1
+1961	4247 1
+1961	5484 1
+1962	56 1
+1962	285 1
+1962	993 1
+1962	1151 1
+1962	1164 1
+1962	1200 1
+1962	1284 1
+1962	1407 1
+1962	1482 1
+1962	1550 1
+1962	1622 1
+1962	1697 1
+1962	1757 1
+1962	1787 1
+1962	1816 1
+1962	1858 1
+1962	1927 1
+1962	1963 1
+1962	1966 1
+1962	1969 1
+1962	1973 1
+1962	1979 1
+1962	1987 1
+1962	2095 1
+1962	2106 1
+1962	2151 1
+1962	2157 1
+1962	2165 1
+1962	2211 1
+1962	3136 1
+1962	8290 1
+1966	290 1
+1966	937 1
+1966	1285 1
+1966	1378 1
+1966	1585 1
+1966	1706 1
+1966	1723 1
+1966	1965 1
+1966	1977 1
+1966	2079 1
+1966	2485 1
+1966	2508 1
+1966	2686 1
+1966	2775 1
+1966	2955 1
+1966	4055 1
+1966	7961 1
+1966	8149 1
+1964	765 1
+1964	1966 1
+1964	2375 1
+1964	2485 1
+1964	2511 1
+1964	2764 1
+1964	2765 1
+1964	2794 1
+1964	2966 1
+1964	4666 1
+1964	4719 1
+1964	6621 1
+1964	6762 1
+1965	937 1
+1965	993 1
+1965	1284 1
+1965	1285 1
+1965	1378 1
+1965	1566 1
+1965	1966 1
+1965	2079 1
+1965	2137 1
+1967	665 1
+1967	873 1
+1967	974 1
+1967	1267 1
+1967	1285 1
+1967	1416 1
+1967	1723 1
+1967	1734 1
+1967	1754 1
+1967	1858 1
+1967	1969 1
+1967	1990 1
+1967	2178 1
+1967	2209 1
+1967	2252 1
+1967	2371 1
+1967	2485 1
+1967	2595 1
+1967	2597 1
+1967	2693 1
+1967	2708 1
+1967	2746 1
+1967	2973 1
+1967	3117 1
+1967	3140 1
+1967	3260 1
+1967	3520 1
+1967	3537 1
+1967	3580 1
+1967	3587 1
+1967	8290 1
+1968	665 1
+1968	1969 1
+1972	204 1
+1972	417 1
+1972	465 1
+1972	608 1
+1972	825 1
+1972	974 1
+1972	1159 1
+1972	1166 1
+1972	1211 1
+1972	1239 1
+1972	1247 1
+1972	1267 1
+1972	1291 1
+1972	1297 1
+1972	1307 1
+1972	1315 1
+1972	1357 1
+1972	1416 1
+1972	1549 1
+1972	1571 1
+1972	1596 1
+1972	1633 1
+1972	1706 1
+1972	1734 1
+1972	1754 1
+1972	1781 1
+1972	1792 1
+1972	1799 1
+1972	1823 1
+1972	1918 1
+1972	1973 1
+1972	2016 1
+1972	2062 1
+1972	2114 1
+1972	2209 1
+1972	2210 1
+1972	2225 1
+1972	2252 1
+1972	2256 1
+1972	2257 1
+1972	2285 1
+1972	2290 1
+1972	2297 1
+1972	2323 1
+1972	2324 1
+1972	2325 1
+1972	2338 1
+1972	2356 1
+1972	2371 1
+1972	2384 1
+1972	2398 1
+1972	2474 1
+1972	2485 1
+1972	2506 1
+1972	2508 1
+1972	2510 1
+1972	2535 1
+1972	2542 1
+1972	2544 1
+1972	2550 1
+1972	2560 1
+1972	2576 1
+1972	2585 1
+1972	2594 1
+1972	2595 1
+1972	2597 1
+1972	2619 1
+1972	2620 1
+1972	2623 1
+1972	2625 1
+1972	2651 1
+1972	2653 1
+1972	2654 1
+1972	2655 1
+1972	2657 1
+1972	2660 1
+1972	2667 1
+1972	2674 1
+1972	2686 1
+1972	2693 1
+1972	2697 1
+1972	2700 1
+1972	2707 1
+1972	2727 1
+1972	2746 1
+1972	2747 1
+1972	2815 1
+1972	2819 1
+1972	2830 1
+1972	2909 1
+1972	2955 1
+1972	2958 1
+1972	2966 1
+1972	2968 1
+1972	2972 1
+1972	2981 1
+1972	2999 1
+1972	3005 1
+1972	3007 1
+1972	3009 1
+1972	3024 1
+1972	3026 1
+1972	3027 1
+1972	3028 1
+1972	3029 1
+1972	3030 1
+1972	3059 1
+1972	3084 1
+1972	3089 1
+1972	3114 1
+1972	3117 1
+1972	3140 1
+1972	3148 1
+1972	3150 1
+1972	3173 1
+1972	3180 1
+1972	3260 1
+1972	3307 1
+1972	3338 1
+1972	3352 1
+1972	3371 1
+1972	3404 1
+1972	3408 1
+1972	3417 1
+1972	3456 1
+1972	3473 1
+1972	3480 1
+1972	3489 1
+1972	3516 1
+1972	3529 1
+1972	3562 1
+1972	3580 1
+1972	3587 1
+1972	3650 1
+1972	3680 1
+1972	3800 1
+1972	3807 1
+1972	3842 1
+1972	3843 1
+1972	3847 1
+1972	3892 1
+1972	3903 1
+1972	3970 1
+1972	4041 1
+1972	4043 1
+1972	4055 1
+1972	4110 1
+1972	4162 1
+1972	4179 1
+1972	4201 1
+1972	4448 1
+1972	4600 1
+1972	4604 1
+1972	4712 1
+1972	4713 1
+1972	4795 1
+1972	4929 1
+1972	5155 1
+1972	5188 1
+1972	5273 1
+1972	5323 1
+1972	5327 1
+1972	5341 1
+1972	5430 1
+1972	5439 1
+1972	5449 1
+1972	5463 1
+1972	5584 1
+1972	5626 1
+1972	5827 1
+1972	6006 1
+1972	6437 1
+1972	6441 1
+1972	6458 1
+1972	6501 1
+1972	6552 1
+1972	6589 1
+1972	6594 1
+1972	6600 1
+1972	8293 1
+1972	8294 1
+1975	1284 1
+1976	974 1
+1976	1284 1
+1976	1285 1
+1976	1977 1
+1976	2470 1
+1976	2955 1
+1977	859 1
+1977	993 1
+1977	1018 1
+1977	1031 1
+1977	1035 1
+1977	1111 1
+1977	1243 1
+1977	1284 1
+1977	1353 1
+1977	1378 1
+1977	1482 1
+1977	1565 1
+1977	1608 1
+1977	1621 1
+1977	1707 1
+1977	1772 1
+1977	1836 1
+1977	1888 1
+1977	1997 1
+1977	2004 1
+1977	2062 1
+1977	2076 1
+1977	2145 1
+1977	2240 1
+1977	2246 1
+1977	2329 1
+1977	2332 1
+1977	2339 1
+1977	2341 1
+1977	2362 1
+1977	2385 1
+1977	2593 1
+1977	2685 1
+1977	8291 1
+1978	1284 1
+1979	15 1
+1979	762 1
+1952	1482 1
+1952	1622 1
+1952	1816 1
+1980	947 1
+1980	993 1
+1980	1482 1
+1980	1492 1
+1980	1585 1
+1980	1622 1
+1980	1700 1
+1980	1772 1
+1980	1777 1
+1980	1816 1
+1980	1835 1
+1980	1842 1
+1980	1888 1
+1980	1956 1
+1980	1964 1
+1980	2073 1
+1980	2128 1
+1980	2145 1
+1980	2174 1
+1980	2240 1
+1980	2241 1
+1980	2329 1
+1980	2338 1
+1980	2341 1
+1980	2375 1
+1980	2400 1
+1980	2504 1
+1980	2547 1
+1980	2560 1
+1980	2565 1
+1980	2587 1
+1980	2623 1
+1980	2625 1
+1980	2685 1
+1980	2794 1
+1980	2825 1
+1980	2922 1
+1980	2993 1
+1980	3005 1
+1980	3029 1
+1980	3117 1
+1980	3321 1
+1980	3352 1
+1980	3557 1
+1980	3660 1
+1980	4335 1
+1980	4662 1
+1981	1816 1
+1981	2799 1
+1982	214 1
+1982	1211 1
+1982	1250 1
+1982	1267 1
+1982	1816 1
+1982	2004 1
+1982	2062 1
+1982	3459 1
+1982	3792 1
+1982	3919 1
+1982	4536 1
+1982	5002 1
+1982	5037 1
+1982	5188 1
+1982	5288 1
+1982	5839 1
+1982	6270 1
+1982	6305 1
+1982	6327 1
+1982	6388 1
+1982	6712 1
+1982	6869 1
+1982	6948 1
+1982	6994 1
+1982	7553 1
+1982	7620 1
+1982	7658 1
+1982	7839 1
+1982	7961 1
+1984	2252 1
+1984	2871 1
+1984	3887 1
+1984	4011 1
+1984	4191 1
+1984	4875 1
+1984	5817 1
+1985	762 1
+1985	946 1
+1985	959 1
+1985	993 1
+1985	1166 1
+1985	1357 1
+1985	1390 1
+1985	1482 1
+1985	1492 1
+1985	1549 1
+1985	1621 1
+1985	1622 1
+1985	1633 1
+1985	1700 1
+1985	1734 1
+1985	1749 1
+1985	1754 1
+1985	1888 1
+1985	1919 1
+1985	1987 1
+1985	1992 1
+1985	1997 1
+1985	2062 1
+1985	2117 1
+1985	2128 1
+1985	2157 1
+1985	2209 1
+1985	2231 1
+1985	2241 1
+1985	2276 1
+1985	2323 1
+1985	2328 1
+1985	2516 1
+1985	2623 1
+1985	2625 1
+1985	2643 1
+1985	2646 1
+1985	2655 1
+1985	2674 1
+1985	2828 1
+1985	2830 1
+1985	2834 1
+1985	3099 1
+1985	3253 1
+1985	3307 1
+1985	3404 1
+1985	3443 1
+1985	3460 1
+1985	3464 1
+1985	3650 1
+1985	3956 1
+1985	4485 1
+1985	4735 1
+1985	4808 1
+1985	5817 1
+1985	8290 1
+1986	761 1
+1986	908 1
+1986	993 1
+1986	1585 1
+1986	1772 1
+1986	1787 1
+1986	1835 1
+1986	1888 1
+1986	1985 1
+1986	1987 1
+1986	2145 1
+1986	2193 1
+1986	2211 1
+1986	2504 1
+1986	4037 1
+1986	4110 1
+1986	4735 1
+1988	1622 1
+1989	1622 1
+1990	1074 1
+1990	1239 1
+1990	1352 1
+1990	1385 1
+1990	1549 1
+1990	1622 1
+1990	2066 1
+1990	2324 1
+1990	2398 1
+1990	2565 1
+1990	2693 1
+1990	3007 1
+1990	3562 1
+1990	3646 1
+1990	3785 1
+1990	3830 1
+1990	3919 1
+1990	4065 1
+1990	4233 1
+1990	4384 1
+1990	4709 1
+1990	4712 1
+1990	4735 1
+1990	5037 1
+1990	5188 1
+1990	5210 1
+1990	5285 1
+1990	5950 1
+1990	6501 1
+1990	6552 1
+1990	6570 1
+1990	6599 1
+1990	6613 1
+1990	6707 1
+1990	6739 1
+1990	8294 1
+1991	56 1
+1991	350 1
+1991	403 1
+1991	425 1
+1991	633 1
+1991	765 1
+1991	993 1
+1991	1049 1
+1991	1267 1
+1991	1291 1
+1991	1374 1
+1991	1384 1
+1991	1419 1
+1991	1482 1
+1991	1521 1
+1991	1622 1
+1991	1633 1
+1991	1637 1
+1991	1646 1
+1991	1653 1
+1991	1705 1
+1991	1723 1
+1991	1734 1
+1991	1754 1
+1991	1792 1
+1991	1808 1
+1991	1814 1
+1991	1842 1
+1991	1956 1
+1991	1992 1
+1991	2097 1
+1991	2102 1
+1991	2120 1
+1991	2174 1
+1991	2225 1
+1991	2256 1
+1991	2264 1
+1991	2322 1
+1991	2375 1
+1991	2410 1
+1991	2547 1
+1991	2593 1
+1991	2599 1
+1991	2625 1
+1991	2665 1
+1991	2685 1
+1991	2707 1
+1991	2768 1
+1991	2777 1
+1991	2794 1
+1991	2805 1
+1991	2809 1
+1991	2814 1
+1991	2828 1
+1991	2830 1
+1991	2834 1
+1991	2856 1
+1991	2922 1
+1991	2955 1
+1991	2963 1
+1991	2968 1
+1991	3130 1
+1991	3140 1
+1991	3150 1
+1991	3251 1
+1991	3253 1
+1992	56 1
+1992	764 1
+1992	937 1
+1992	1384 1
+1992	1492 1
+1992	1622 1
+1992	1700 1
+1992	1808 1
+1992	2117 1
+1992	2120 1
+1992	2128 1
+1992	2504 1
+1992	2594 1
+1992	2625 1
+1992	2665 1
+1992	3253 1
+1993	946 1
+1993	1622 1
+1993	3059 1
+1994	1151 1
+1995	1151 1
+1995	1919 1
+1995	7497 1
+1996	1151 1
+1997	56 1
+1997	332 1
+1997	415 1
+1997	587 1
+1997	665 1
+1997	761 1
+1997	764 1
+1997	836 1
+1997	873 1
+1997	937 1
+1997	947 1
+1997	968 1
+1997	975 1
+1997	1018 1
+1997	1031 1
+1997	1035 1
+1997	1061 1
+1997	1097 1
+1997	1111 1
+1997	1137 1
+1997	1151 1
+1997	1186 1
+1997	1285 1
+1997	1297 1
+1997	1353 1
+1997	1378 1
+1997	1407 1
+1997	1482 1
+1997	1492 1
+1997	1542 1
+1997	1547 1
+1997	1585 1
+1997	1608 1
+1997	1613 1
+1997	1621 1
+1997	1697 1
+1997	1700 1
+1997	1707 1
+1997	1717 1
+1997	1730 1
+1997	1749 1
+1997	1757 1
+1997	1772 1
+1997	1783 1
+1997	1787 1
+1997	1835 1
+1997	1842 1
+1997	1848 1
+1997	1919 1
+1997	1965 1
+1997	1977 1
+1997	1991 1
+1997	2004 1
+1997	2062 1
+1997	2066 1
+1997	2071 1
+1997	2073 1
+1997	2079 1
+1997	2085 1
+1997	2095 1
+1997	2097 1
+1997	2106 1
+1997	2109 1
+1997	2117 1
+1997	2119 1
+1997	2128 1
+1997	2151 1
+1997	2157 1
+1997	2165 1
+1997	2168 1
+1997	2178 1
+1997	2181 1
+1997	2202 1
+1997	2210 1
+1997	2240 1
+1997	2241 1
+1997	2246 1
+1997	2273 1
+1997	2332 1
+1997	2435 1
+1997	2475 1
+1997	2504 1
+1997	2579 1
+1997	2587 1
+1997	2593 1
+1997	2604 1
+1997	3136 1
+1997	8290 1
+1794	1018 1
+1794	1166 1
+1794	1393 1
+1794	1482 1
+1794	1633 1
+1794	1706 1
+1794	1814 1
+1794	1847 1
+1794	1919 1
+1794	2071 1
+1794	2135 1
+1794	2225 1
+1794	2246 1
+1794	2251 1
+1794	2297 1
+1794	2324 1
+1794	2375 1
+1794	2475 1
+1794	2565 1
+1794	2580 1
+1794	2625 1
+1794	2794 1
+1794	2828 1
+1794	3034 1
+1794	3892 1
+1794	3970 1
+2000	1482 1
+2001	415 1
+2001	764 1
+2001	1159 1
+2001	1482 1
+2001	1492 1
+2001	1700 1
+2001	1783 1
+2001	1991 1
+2001	2004 1
+2001	2071 1
+2001	2241 1
+2001	2625 1
+2001	3089 1
+2001	3191 1
+2001	3393 1
+2001	3554 1
+2001	3897 1
+2001	3910 1
+2001	3976 1
+2001	4355 1
+2001	4361 1
+2001	4448 1
+2001	4666 1
+2001	5022 1
+2001	5392 1
+2001	5452 1
+2001	5459 1
+2001	5568 1
+2001	5651 1
+2001	5828 1
+2001	5863 1
+2001	5886 1
+2001	5963 1
+2001	5994 1
+2001	6029 1
+2001	7012 1
+2001	8042 1
+2001	8121 1
+2001	8290 1
+2002	2004 1
+2005	415 1
+2008	665 1
+2009	350 1
+2009	665 1
+2009	762 1
+2009	946 1
+2009	1026 1
+2009	1166 1
+2009	1211 1
+2009	1267 1
+2009	1357 1
+2009	1707 1
+2009	1717 1
+2009	1835 1
+2009	1918 1
+2009	1964 1
+2009	1992 1
+2009	2014 1
+2009	2083 1
+2009	2091 1
+2009	2135 1
+2009	2174 1
+2009	2193 1
+2009	2237 1
+2009	2257 1
+2009	2297 1
+2009	2328 1
+2009	2456 1
+2009	2470 1
+2009	2485 1
+2009	2504 1
+2009	2516 1
+2009	2599 1
+2009	2646 1
+2009	2651 1
+2009	2660 1
+2009	2669 1
+2009	2809 1
+2009	2830 1
+2009	3033 1
+2009	3173 1
+2009	3251 1
+2009	3334 1
+2009	3352 1
+2009	3408 1
+2009	3443 1
+2009	3455 1
+2009	3460 1
+2009	3464 1
+2009	3473 1
+2009	3680 1
+2009	3755 1
+2009	3871 1
+2009	4037 1
+2009	4289 1
+2009	4687 1
+2009	4811 1
+2009	4828 1
+2009	5028 1
+2009	5162 1
+2009	5341 1
+2009	5421 1
+2009	6624 1
+2009	7279 1
+2009	7553 1
+2040	665 1
+2010	665 1
+2010	2095 1
+2010	2101 1
+2010	2470 1
+2010	2658 1
+2010	3310 1
+2010	3352 1
+2010	4687 1
+2010	5020 1
+2010	5079 1
+2010	5301 1
+2010	5466 1
+2010	5529 1
+2010	5839 1
+2010	5933 1
+2010	6320 1
+2010	6523 1
+2010	6560 1
+2010	7021 1
+2010	7277 1
+2010	7443 1
+2010	7694 1
+2010	7726 1
+2010	7795 1
+2010	7803 1
+2010	7946 1
+2010	7992 1
+2011	665 1
+2011	4687 1
+2011	5162 1
+2012	665 1
+2012	2014 1
+2012	2135 1
+2013	665 1
+2042	665 1
+2042	2470 1
+2014	665 1
+2014	1267 1
+2014	2095 1
+2014	2135 1
+2014	2237 1
+2014	2253 1
+2014	2470 1
+2014	2909 1
+2014	3452 1
+2014	3607 1
+2015	665 1
+2016	15 1
+2016	417 1
+2016	665 1
+2016	1315 1
+2016	2237 1
+2016	2371 1
+2016	2643 1
+2016	2653 1
+2016	2697 1
+2016	3026 1
+2016	3059 1
+2016	3748 1
+2016	3892 1
+2017	665 1
+2018	665 1
+2018	2470 1
+2019	665 1
+2020	665 1
+2021	665 1
+2044	665 1
+2044	2470 1
+2023	665 1
+2024	665 1
+2025	665 1
+2026	665 1
+2027	665 1
+2045	665 1
+2029	665 1
+2029	2135 1
+2030	665 1
+2031	665 1
+2032	665 1
+2033	72 1
+2033	665 1
+2033	1026 1
+2033	1473 1
+2033	1548 1
+2033	2398 1
+2033	2542 1
+2033	2654 1
+2033	3084 1
+2033	3192 1
+2033	3352 1
+2033	3408 1
+2033	3835 1
+2033	4276 1
+2033	4338 1
+2033	4510 1
+2033	5123 1
+2033	5254 1
+2033	5341 1
+2033	5452 1
+2033	5484 1
+2033	5511 1
+2034	665 1
+2035	665 1
+2036	665 1
+2036	2470 1
+2037	665 1
+2037	2643 1
+2037	5103 1
+2037	5140 1
+2037	5524 1
+2037	5543 1
+2037	6111 1
+2037	6481 1
+698	665 1
+698	2066 1
+698	2323 1
+698	2508 1
+698	2595 1
+698	2653 1
+698	2966 1
+698	3117 1
+698	3260 1
+698	4110 1
+698	4216 1
+2038	665 1
+2038	1031 1
+2038	2341 1
+2038	2350 1
+2038	2877 1
+2049	974 1
+2049	1697 1
+2049	2657 1
+2050	1697 1
+2050	1730 1
+2050	2322 1
+2050	4335 1
+2051	1697 1
+2052	946 1
+2052	968 1
+2052	993 1
+2052	1097 1
+2052	1186 1
+2052	1697 1
+2052	1717 1
+2052	1835 1
+2052	2117 1
+2052	2193 1
+2052	2246 1
+2052	2475 1
+2052	2570 1
+2052	8291 1
+2053	1200 1
+2054	1564 1
+2054	2055 1
+2054	2066 1
+2056	1550 1
+2057	1550 1
+2058	1550 1
+2059	2060 1
+2059	2576 1
+2059	6907 1
+2059	6980 1
+2061	765 1
+2061	1585 1
+2061	1646 1
+2061	1888 1
+2062	72 1
+2062	285 1
+2062	332 1
+2062	587 1
+2062	722 1
+2062	761 1
+2062	764 1
+2062	836 1
+2062	873 1
+2062	937 1
+2062	946 1
+2062	947 1
+2062	959 1
+2062	975 1
+2062	993 1
+2062	1031 1
+2062	1035 1
+2062	1061 1
+2062	1111 1
+2062	1166 1
+2062	1243 1
+2062	1267 1
+2062	1285 1
+2062	1297 1
+2062	1353 1
+2062	1378 1
+2062	1444 1
+2062	1492 1
+2062	1542 1
+2062	1565 1
+2062	1566 1
+2062	1583 1
+2062	1585 1
+2062	1613 1
+2062	1621 1
+2062	1633 1
+2062	1678 1
+2062	1700 1
+2062	1707 1
+2062	1714 1
+2062	1717 1
+2062	1749 1
+2062	1754 1
+2062	1757 1
+2062	1772 1
+2062	1783 1
+2062	1836 1
+2062	1842 1
+2062	1848 1
+2062	1888 1
+2062	1919 1
+2062	1965 1
+2062	1977 1
+2062	1985 1
+2062	1991 1
+2062	1997 1
+2062	2066 1
+2062	2071 1
+2062	2073 1
+2062	2079 1
+2062	2085 1
+2062	2091 1
+2062	2095 1
+2062	2097 1
+2062	2109 1
+2062	2114 1
+2062	2119 1
+2062	2121 1
+2062	2128 1
+2062	2137 1
+2062	2145 1
+2062	2151 1
+2062	2157 1
+2062	2165 1
+2062	2168 1
+2062	2178 1
+2062	2181 1
+2062	2182 1
+2062	2193 1
+2062	2195 1
+2062	2202 1
+2062	2205 1
+2062	2206 1
+2062	2210 1
+2062	2211 1
+2062	2241 1
+2062	2246 1
+2062	2253 1
+2062	2273 1
+2062	2277 1
+2062	2285 1
+2062	2297 1
+2062	2322 1
+2062	2325 1
+2062	2328 1
+2062	2329 1
+2062	2333 1
+2062	2339 1
+2062	2341 1
+2062	2350 1
+2062	2381 1
+2062	2385 1
+2062	2397 1
+2062	2400 1
+2062	2593 1
+2062	2594 1
+2062	2625 1
+2062	2651 1
+2062	2654 1
+2062	2693 1
+2062	2877 1
+2062	2923 1
+2062	3007 1
+2062	3014 1
+2062	3117 1
+2062	3192 1
+2062	3265 1
+2062	3803 1
+2062	7478 1
+2062	8290 1
+2062	8291 1
+2063	937 1
+2063	1186 1
+2063	1285 1
+2063	1378 1
+2063	1564 1
+2063	1585 1
+2063	1707 1
+2063	1730 1
+2063	1835 1
+2063	1965 1
+2063	1977 1
+2063	2079 1
+2063	2101 1
+2063	2117 1
+2063	2425 1
+2063	2470 1
+2063	2475 1
+2063	2593 1
+2063	2625 1
+2063	2643 1
+2063	2685 1
+2064	2066 1
+2064	4191 1
+2065	465 1
+2065	633 1
+2065	959 1
+2065	993 1
+2065	1111 1
+2065	1166 1
+2065	1297 1
+2065	1315 1
+2065	1323 1
+2065	1549 1
+2065	1633 1
+2065	1772 1
+2065	1808 1
+2065	1842 1
+2065	1919 1
+2065	1956 1
+2065	2066 1
+2065	2225 1
+2065	2240 1
+2065	2328 1
+2065	2385 1
+2065	2508 1
+2065	2542 1
+2065	2619 1
+2065	2623 1
+2065	2660 1
+2065	2736 1
+2065	2871 1
+2065	3002 1
+2065	3018 1
+2065	3130 1
+2065	3164 1
+2065	3192 1
+2065	3253 1
+2065	3260 1
+2065	3291 1
+2065	3443 1
+2065	3454 1
+2065	3456 1
+2065	3458 1
+2065	3587 1
+2065	3769 1
+2065	3843 1
+2065	3970 1
+2065	4138 1
+2065	4338 1
+2065	5100 1
+2065	5254 1
+2065	6566 1
+2065	8290 1
+2069	1049 1
+2069	1250 1
+2069	1323 1
+2069	1608 1
+2069	1717 1
+2069	1964 1
+2069	2076 1
+2069	2339 1
+2069	2470 1
+2069	2475 1
+2069	2570 1
+2069	2571 1
+2069	2580 1
+2069	2587 1
+2069	2593 1
+2069	2685 1
+2069	2946 1
+2068	1783 1
+2068	2069 1
+2068	2242 1
+2068	4981 1
+2071	1378 1
+2071	1992 1
+2071	2066 1
+2071	2073 1
+2071	2145 1
+2071	2211 1
+2071	2625 1
+2070	2073 1
+2072	56 1
+2072	285 1
+2072	332 1
+2072	350 1
+2072	722 1
+2072	859 1
+2072	873 1
+2072	946 1
+2072	947 1
+2072	959 1
+2072	993 1
+2072	1012 1
+2072	1018 1
+2072	1031 1
+2072	1035 1
+2072	1049 1
+2072	1097 1
+2072	1137 1
+2072	1186 1
+2072	1250 1
+2072	1285 1
+2072	1291 1
+2072	1297 1
+2072	1374 1
+2072	1378 1
+2072	1384 1
+2072	1390 1
+2072	1419 1
+2072	1444 1
+2072	1492 1
+2072	1521 1
+2072	1542 1
+2072	1547 1
+2072	1583 1
+2072	1592 1
+2072	1596 1
+2072	1608 1
+2072	1621 1
+2072	1637 1
+2072	1646 1
+2072	1653 1
+2072	1700 1
+2072	1707 1
+2072	1717 1
+2072	1723 1
+2072	1730 1
+2072	1749 1
+2072	1757 1
+2072	1772 1
+2072	1787 1
+2072	1808 1
+2072	1835 1
+2072	1836 1
+2072	1842 1
+2072	1847 1
+2072	1848 1
+2072	1888 1
+2072	1918 1
+2072	1956 1
+2072	1964 1
+2072	1977 1
+2072	1985 1
+2072	1991 1
+2072	1997 1
+2072	2062 1
+2072	2073 1
+2072	2091 1
+2072	2097 1
+2072	2102 1
+2072	2106 1
+2072	2117 1
+2072	2128 1
+2072	2137 1
+2072	2151 1
+2072	2157 1
+2072	2178 1
+2072	2193 1
+2072	2210 1
+2072	2240 1
+2072	2256 1
+2072	2264 1
+2072	2322 1
+2072	2323 1
+2072	2397 1
+2072	2400 1
+2072	2410 1
+2072	2426 1
+2072	2470 1
+2072	2475 1
+2072	2479 1
+2072	2517 1
+2072	2560 1
+2072	2571 1
+2072	2593 1
+2072	2599 1
+2072	2604 1
+2072	2618 1
+2072	2619 1
+2072	2625 1
+2072	2643 1
+2072	2665 1
+2072	2669 1
+2072	2707 1
+2072	2721 1
+2072	2754 1
+2072	2777 1
+2072	2785 1
+2072	2787 1
+2072	2794 1
+2072	2801 1
+2072	2809 1
+2072	2814 1
+2072	2815 1
+2072	2834 1
+2072	2838 1
+2072	2968 1
+2072	2999 1
+2072	3029 1
+2072	3033 1
+2072	8290 1
+2072	8291 1
+2077	1991 1
+2081	1707 1
+2082	1707 1
+2083	2322 1
+2083	3548 1
+2095	2182 1
+2095	2185 1
+2095	2193 1
+2095	2470 1
+2095	2504 1
+2095	5162 1
+2084	1997 1
+2084	2085 1
+2084	2091 1
+2084	2092 1
+2084	2095 1
+2084	2185 1
+2084	2244 1
+2084	2247 1
+2084	2470 1
+2084	5200 1
+2085	968 1
+2085	1018 1
+2085	1049 1
+2085	1111 1
+2085	1250 1
+2085	1419 1
+2085	1521 1
+2085	1608 1
+2085	1792 1
+2085	1835 1
+2085	1919 1
+2085	1992 1
+2085	2076 1
+2085	2091 1
+2085	2095 1
+2085	2117 1
+2085	2128 1
+2085	2264 1
+2085	2322 1
+2085	2332 1
+2085	2400 1
+2085	2435 1
+2085	2504 1
+2085	2579 1
+2085	2593 1
+2085	2685 1
+2085	2834 1
+2085	5162 1
+2086	2095 1
+2087	2095 1
+2088	1997 1
+2088	2085 1
+2088	2091 1
+2088	2095 1
+2088	2112 1
+2088	2470 1
+2089	2095 1
+2090	2095 1
+2091	1307 1
+2091	1836 1
+2091	2095 1
+2091	2193 1
+2091	2210 1
+2091	2328 1
+2091	2470 1
+2091	2643 1
+2092	2085 1
+2092	2091 1
+2092	2095 1
+2092	2185 1
+2092	2247 1
+2092	2470 1
+2092	5162 1
+2093	285 1
+2093	350 1
+2093	993 1
+2093	1049 1
+2093	1097 1
+2093	1186 1
+2093	1250 1
+2093	1315 1
+2093	1374 1
+2093	1416 1
+2093	1564 1
+2093	1566 1
+2093	1608 1
+2093	1717 1
+2093	1772 1
+2093	1792 1
+2093	1835 1
+2093	1847 1
+2093	1964 1
+2093	1992 1
+2093	2095 1
+2093	2117 1
+2093	2119 1
+2093	2137 1
+2093	2157 1
+2093	2174 1
+2093	2240 1
+2093	2323 1
+2093	2435 1
+2093	2470 1
+2093	2475 1
+2093	2547 1
+2093	2560 1
+2093	2579 1
+2093	2587 1
+2093	2593 1
+2093	2604 1
+2093	2607 1
+2093	2625 1
+2093	2643 1
+2093	2685 1
+2093	2707 1
+2093	2720 1
+2093	2790 1
+2093	2830 1
+2093	2922 1
+2093	2966 1
+2093	2972 1
+2093	3029 1
+2093	3106 1
+2093	3117 1
+2093	3253 1
+2093	3351 1
+2093	4709 1
+2093	7979 1
+2096	1730 1
+2096	5799 1
+2097	993 1
+2097	1012 1
+2097	1018 1
+2097	2182 1
+2097	2422 1
+2097	2490 1
+2097	2607 1
+2100	2101 1
+2099	1297 1
+2099	1353 1
+2099	1547 1
+2099	1565 1
+2099	1700 1
+2099	1997 1
+2099	2062 1
+2099	2085 1
+2099	2091 1
+2099	2092 1
+2099	2101 1
+2099	2182 1
+2099	2185 1
+2099	2193 1
+2099	2244 1
+2099	2247 1
+2099	2290 1
+2099	2348 1
+2099	2385 1
+2099	2470 1
+2099	2504 1
+2099	8290 1
+2102	285 1
+2102	762 1
+2102	778 1
+2102	825 1
+2102	993 1
+2102	1012 1
+2102	1166 1
+2102	1211 1
+2102	1243 1
+2102	1291 1
+2102	1416 1
+2102	1473 1
+2102	1492 1
+2102	1549 1
+2102	1596 1
+2102	1633 1
+2102	1769 1
+2102	1777 1
+2102	1808 1
+2102	2106 1
+2102	2323 1
+2102	2328 1
+2102	2474 1
+2102	2535 1
+2102	2542 1
+2102	2565 1
+2102	2576 1
+2102	2594 1
+2102	2638 1
+2102	2707 1
+2102	2790 1
+2102	2815 1
+2102	2968 1
+2102	3080 1
+2102	3171 1
+2102	3843 1
+2102	3912 1
+2102	3976 1
+2102	4335 1
+2102	4351 1
+2102	5176 1
+2102	5459 1
+2102	5683 1
+2102	5780 1
+2102	5947 1
+2104	1407 1
+2104	2106 1
+2103	1035 1
+2103	2106 1
+2105	761 1
+2105	873 1
+2105	1111 1
+2105	2106 1
+2105	2157 1
+2105	2174 1
+2105	2206 1
+2105	2231 1
+2105	3114 1
+2105	3681 1
+2105	8290 1
+2109	762 1
+2109	1186 1
+2109	1211 1
+2109	1453 1
+2109	1744 1
+2109	2066 1
+2109	2210 1
+2109	2350 1
+2109	2354 1
+2109	2398 1
+2109	2411 1
+2109	2508 1
+2109	2516 1
+2109	2535 1
+2109	2565 1
+2109	2775 1
+2109	2859 1
+2109	3007 1
+2109	3117 1
+2109	3192 1
+2109	3393 1
+2109	3394 1
+2109	3443 1
+2109	3480 1
+2109	3489 1
+2109	3562 1
+2109	3843 1
+2109	3926 1
+2109	3946 1
+2109	4021 1
+2109	4044 1
+2109	4201 1
+2109	4234 1
+2109	4247 1
+2109	4266 1
+2109	4338 1
+2109	4424 1
+2109	4463 1
+2109	4510 1
+2109	4536 1
+2109	4661 1
+2109	4666 1
+2109	4735 1
+2109	5100 1
+2109	5327 1
+2109	5392 1
+2109	5790 1
+2108	1186 1
+2108	2109 1
+2108	2625 1
+2108	2651 1
+2110	762 1
+2110	1407 1
+2110	7890 1
+2111	1407 1
+2111	1688 1
+2111	2871 1
+2111	3030 1
+2112	2185 1
+2114	290 1
+2114	1291 1
+2114	1706 1
+2114	1734 1
+2114	1754 1
+2114	1777 1
+2114	1781 1
+2114	1919 1
+2114	1965 1
+2114	2016 1
+2114	2251 1
+2114	2323 1
+2114	2585 1
+2114	2593 1
+2114	2617 1
+2114	2625 1
+2114	2727 1
+2114	2815 1
+2114	2830 1
+2114	2968 1
+2114	2993 1
+2114	2999 1
+2114	3007 1
+2114	3026 1
+2114	3028 1
+2114	3029 1
+2114	3034 1
+2114	3050 1
+2114	3056 1
+2114	3059 1
+2114	3068 1
+2114	3084 1
+2114	3099 1
+2114	3117 1
+2114	3140 1
+2114	3404 1
+2114	3576 1
+2114	3680 1
+2114	3970 1
+2115	1186 1
+2115	1211 1
+2115	1285 1
+2115	1310 1
+2115	1835 1
+2115	1965 1
+2115	2210 1
+2115	2576 1
+2115	2645 1
+2115	2785 1
+2115	2871 1
+2115	4574 1
+2115	5459 1
+2115	5721 1
+2115	5828 1
+2115	6094 1
+2116	350 1
+2116	587 1
+2116	1166 1
+2116	1723 1
+2116	1888 1
+2116	1977 1
+2116	2114 1
+2116	2117 1
+2116	2206 1
+2116	2234 1
+2116	2256 1
+2116	2273 1
+2116	2504 1
+2116	2579 1
+2116	2721 1
+2116	2794 1
+2116	3005 1
+2116	3034 1
+2116	3529 1
+2116	3804 1
+2119	765 1
+2119	856 1
+2119	1814 1
+2119	2625 1
+2119	3251 1
+2117	204 1
+2117	968 1
+2117	993 1
+2117	1049 1
+2117	2066 1
+2117	2119 1
+2117	2182 1
+2117	2364 1
+2117	2375 1
+2117	2398 1
+2117	2456 1
+2117	2470 1
+2117	2504 1
+2117	2517 1
+2117	2535 1
+2117	2966 1
+2117	4037 1
+2117	4735 1
+2117	4808 1
+2117	4811 1
+2117	4820 1
+2117	4827 1
+2117	4875 1
+2118	350 1
+2118	417 1
+2118	737 1
+2118	764 1
+2118	765 1
+2118	968 1
+2118	993 1
+2118	1018 1
+2118	1049 1
+2118	1097 1
+2118	1239 1
+2118	1285 1
+2118	1492 1
+2118	1547 1
+2118	1565 1
+2118	1566 1
+2118	1571 1
+2118	1633 1
+2118	1646 1
+2118	1700 1
+2118	1714 1
+2118	1769 1
+2118	1772 1
+2118	1792 1
+2118	1847 1
+2118	1888 1
+2118	1919 1
+2118	2071 1
+2118	2114 1
+2118	2119 1
+2118	2128 1
+2118	2209 1
+2118	2240 1
+2118	2246 1
+2118	2256 1
+2118	2323 1
+2118	2324 1
+2118	2328 1
+2118	2332 1
+2118	2338 1
+2118	2345 1
+2118	2381 1
+2118	2385 1
+2118	2400 1
+2118	2435 1
+2118	2456 1
+2118	2511 1
+2118	2550 1
+2118	2579 1
+2118	2580 1
+2118	2585 1
+2118	2587 1
+2118	2594 1
+2118	2617 1
+2118	2651 1
+2118	2653 1
+2118	2655 1
+2118	2657 1
+2118	2667 1
+2118	2685 1
+2118	2693 1
+2118	2696 1
+2118	2707 1
+2118	2727 1
+2118	2774 1
+2118	2775 1
+2118	2777 1
+2118	2805 1
+2118	2811 1
+2118	2822 1
+2118	2828 1
+2118	2851 1
+2118	2856 1
+2118	2900 1
+2118	2909 1
+2118	2958 1
+2118	2966 1
+2118	2968 1
+2118	2977 1
+2118	2999 1
+2118	3125 1
+2118	3253 1
+2118	3351 1
+2118	3352 1
+2118	3408 1
+2118	3417 1
+2118	3433 1
+2118	3439 1
+2118	3454 1
+2118	3580 1
+2118	3607 1
+2118	3752 1
+2118	3806 1
+2118	3812 1
+2118	3892 1
+2118	3898 1
+2118	3939 1
+2118	4037 1
+2118	4201 1
+2118	4297 1
+2118	4299 1
+2118	4400 1
+2118	4448 1
+2118	4463 1
+2118	4735 1
+2118	5092 1
+2118	5130 1
+2118	5412 1
+2118	5459 1
+2118	5524 1
+2118	5605 1
+2118	5886 1
+2118	8290 1
+2121	1111 1
+2120	332 1
+2120	417 1
+2120	737 1
+2120	764 1
+2120	765 1
+2120	975 1
+2120	993 1
+2120	1012 1
+2120	1024 1
+2120	1049 1
+2120	1140 1
+2120	1166 1
+2120	1353 1
+2120	1492 1
+2120	1549 1
+2120	1596 1
+2120	1608 1
+2120	1621 1
+2120	1700 1
+2120	1714 1
+2120	1772 1
+2120	1781 1
+2120	1783 1
+2120	1842 1
+2120	1848 1
+2120	1997 1
+2120	2001 1
+2120	2071 1
+2120	2117 1
+2120	2121 1
+2120	2128 1
+2120	2145 1
+2120	2165 1
+2120	2195 1
+2120	2205 1
+2120	2206 1
+2120	2211 1
+2120	2225 1
+2120	2234 1
+2120	2242 1
+2120	2246 1
+2120	2276 1
+2120	2281 1
+2120	2285 1
+2120	2290 1
+2120	2307 1
+2120	2323 1
+2120	2325 1
+2120	2328 1
+2120	2329 1
+2120	2333 1
+2120	2350 1
+2120	2426 1
+2120	2484 1
+2120	2501 1
+2120	2504 1
+2120	2517 1
+2120	2575 1
+2120	2579 1
+2120	2589 1
+2120	2591 1
+2120	2594 1
+2120	2607 1
+2120	2619 1
+2120	2625 1
+2120	2650 1
+2120	2657 1
+2120	2667 1
+2120	2720 1
+2120	2724 1
+2120	2751 1
+2120	2774 1
+2120	2781 1
+2120	2797 1
+2120	2799 1
+2120	2811 1
+2120	2834 1
+2120	2900 1
+2120	2902 1
+2120	2926 1
+2120	2974 1
+2120	2979 1
+2120	2996 1
+2120	3056 1
+2120	3068 1
+2120	3082 1
+2120	3089 1
+2120	3104 1
+2120	3126 1
+2120	3193 1
+2120	3243 1
+2120	3258 1
+2120	3320 1
+2120	3324 1
+2120	3409 1
+2120	3429 1
+2120	3459 1
+2120	3480 1
+2120	3538 1
+2120	3548 1
+2120	3835 1
+2120	4179 1
+2120	4261 1
+2120	4466 1
+2120	4536 1
+2120	4735 1
+2120	4780 1
+2120	5072 1
+2120	5079 1
+2120	5412 1
+2120	5638 1
+2120	6321 1
+2120	6388 1
+2120	6980 1
+2120	7146 1
+2120	7277 1
+2120	7323 1
+2120	7632 1
+2120	7839 1
+2120	7994 1
+2120	8225 1
+2120	8290 1
+2125	1566 1
+2125	1836 1
+2125	2145 1
+2126	993 1
+2127	15 1
+2127	993 1
+2127	2625 1
+2128	764 1
+2128	993 1
+2128	1992 1
+2129	978 1
+2129	993 1
+2129	1990 1
+2129	2144 1
+2129	2210 1
+2129	2328 1
+2129	2398 1
+2129	2565 1
+2129	2625 1
+2129	2657 1
+2129	3024 1
+2129	3026 1
+2129	3034 1
+2129	3144 1
+2129	3404 1
+2129	3439 1
+2129	3454 1
+2129	3529 1
+2129	3557 1
+2129	3568 1
+2129	3645 1
+2129	3724 1
+2129	3800 1
+2129	3812 1
+2129	3903 1
+2129	3958 1
+2129	4049 1
+2129	4138 1
+2129	4234 1
+2129	4290 1
+2129	4299 1
+2129	4335 1
+2129	4424 1
+2129	4463 1
+2129	4510 1
+2129	4528 1
+2129	4531 1
+2129	4547 1
+2129	4578 1
+2129	4735 1
+2129	4808 1
+2129	5891 1
+2129	8293 1
+2129	8294 1
+2130	290 1
+2130	993 1
+2130	1646 1
+2130	1723 1
+2130	1977 1
+2130	2375 1
+2130	2470 1
+2130	2955 1
+2131	993 1
+2132	993 1
+2133	56 1
+2133	214 1
+2133	332 1
+2133	350 1
+2133	403 1
+2133	722 1
+2133	765 1
+2133	859 1
+2133	946 1
+2133	947 1
+2133	959 1
+2133	968 1
+2133	993 1
+2133	1018 1
+2133	1031 1
+2133	1035 1
+2133	1049 1
+2133	1097 1
+2133	1186 1
+2133	1211 1
+2133	1243 1
+2133	1250 1
+2133	1291 1
+2133	1297 1
+2133	1374 1
+2133	1384 1
+2133	1390 1
+2133	1419 1
+2133	1492 1
+2133	1521 1
+2133	1547 1
+2133	1565 1
+2133	1596 1
+2133	1608 1
+2133	1621 1
+2133	1637 1
+2133	1646 1
+2133	1653 1
+2133	1700 1
+2133	1705 1
+2133	1717 1
+2133	1723 1
+2133	1772 1
+2133	1808 1
+2133	1835 1
+2133	1836 1
+2133	1842 1
+2133	1847 1
+2133	1888 1
+2133	1918 1
+2133	1956 1
+2133	1964 1
+2133	1977 1
+2133	1992 1
+2133	2062 1
+2133	2076 1
+2133	2102 1
+2133	2117 1
+2133	2120 1
+2133	2174 1
+2133	2193 1
+2133	2240 1
+2133	2322 1
+2133	2323 1
+2133	2329 1
+2133	2332 1
+2133	2340 1
+2133	2341 1
+2133	2345 1
+2133	2350 1
+2133	2375 1
+2133	2385 1
+2133	2397 1
+2133	2400 1
+2133	2410 1
+2133	2425 1
+2133	2435 1
+2133	2470 1
+2133	2475 1
+2133	2479 1
+2133	2490 1
+2133	2504 1
+2133	2547 1
+2133	2560 1
+2133	2570 1
+2133	2579 1
+2133	2580 1
+2133	2587 1
+2133	2593 1
+2133	2599 1
+2133	2604 1
+2133	2619 1
+2133	2625 1
+2133	2643 1
+2133	2646 1
+2133	2665 1
+2133	2669 1
+2133	2685 1
+2133	2707 1
+2133	2720 1
+2133	2721 1
+2133	2754 1
+2133	2768 1
+2133	2777 1
+2133	2781 1
+2133	2794 1
+2133	2797 1
+2133	2805 1
+2133	2809 1
+2133	2814 1
+2133	2815 1
+2133	2828 1
+2133	2834 1
+2133	2838 1
+2133	2877 1
+2133	2880 1
+2133	2922 1
+2133	2926 1
+2133	2955 1
+2133	2963 1
+2133	2968 1
+2133	2972 1
+2133	2979 1
+2133	2993 1
+2133	2999 1
+2133	3029 1
+2133	3755 1
+2133	8290 1
+2133	8291 1
+2134	993 1
+2134	1990 1
+2134	2144 1
+2134	2328 1
+2134	3125 1
+2134	3192 1
+2134	4191 1
+2134	4256 1
+2134	4289 1
+2134	4290 1
+2134	4299 1
+2134	4323 1
+2134	4365 1
+2134	4386 1
+2135	15 1
+2135	737 1
+2135	741 1
+2135	762 1
+2135	825 1
+2135	993 1
+2135	1247 1
+2135	1267 1
+2135	1297 1
+2135	1419 1
+2135	1453 1
+2135	1473 1
+2135	1633 1
+2135	1729 1
+2135	1792 1
+2135	1837 1
+2135	1972 1
+2135	1982 1
+2135	2014 1
+2135	2117 1
+2135	2120 1
+2135	2145 1
+2135	2174 1
+2135	2225 1
+2135	2251 1
+2135	2256 1
+2135	2289 1
+2135	2322 1
+2135	2323 1
+2135	2324 1
+2135	2328 1
+2135	2375 1
+2135	2381 1
+2135	2398 1
+2135	2433 1
+2135	2456 1
+2135	2470 1
+2135	2485 1
+2135	2508 1
+2135	2516 1
+2135	2517 1
+2135	2535 1
+2135	2560 1
+2135	2565 1
+2135	2594 1
+2135	2625 1
+2135	2651 1
+2135	2654 1
+2135	2657 1
+2135	2658 1
+2135	2693 1
+2135	2707 1
+2135	2747 1
+2135	2763 1
+2135	2774 1
+2135	2775 1
+2135	2790 1
+2135	2794 1
+2135	2830 1
+2135	2844 1
+2135	2851 1
+2135	2900 1
+2135	2909 1
+2135	2912 1
+2135	2963 1
+2135	3010 1
+2135	3020 1
+2135	3033 1
+2135	3034 1
+2135	3089 1
+2135	3117 1
+2135	3126 1
+2135	3237 1
+2135	3238 1
+2135	3253 1
+2135	3276 1
+2135	3321 1
+2135	3338 1
+2135	3352 1
+2135	3371 1
+2135	3393 1
+2135	3452 1
+2135	3456 1
+2135	3480 1
+2135	3537 1
+2135	3568 1
+2135	3614 1
+2135	3691 1
+2135	3724 1
+2135	3748 1
+2135	3787 1
+2135	3792 1
+2135	3807 1
+2135	3873 1
+2135	3880 1
+2135	3887 1
+2135	4037 1
+2135	4099 1
+2135	4124 1
+2135	4179 1
+2135	4191 1
+2135	4234 1
+2135	4266 1
+2135	4335 1
+2135	4448 1
+2135	4463 1
+2135	4530 1
+2135	4534 1
+2135	4536 1
+2135	4604 1
+2135	4661 1
+2135	4712 1
+2135	4735 1
+2135	4748 1
+2135	4777 1
+2135	4811 1
+2135	4820 1
+2135	4827 1
+2135	4846 1
+2135	4899 1
+2135	4953 1
+2135	5002 1
+2135	5100 1
+2135	5155 1
+2135	5222 1
+2135	5254 1
+2135	5404 1
+2135	5412 1
+2135	5449 1
+2135	5454 1
+2135	5459 1
+2135	5463 1
+2135	5484 1
+2135	5539 1
+2135	5568 1
+2135	5651 1
+2135	5683 1
+2135	5743 1
+2135	5963 1
+2135	6218 1
+2135	6262 1
+2135	6337 1
+2135	6496 1
+2135	7587 1
+2135	7632 1
+2135	7908 1
+2136	2137 1
+2138	1285 1
+2139	285 1
+2139	2151 1
+2139	8290 1
+2141	1772 1
+2141	2151 1
+2142	1186 1
+2142	2151 1
+2143	2151 1
+2144	15 1
+2144	417 1
+2144	737 1
+2144	2151 1
+2144	2210 1
+2144	2328 1
+2144	2398 1
+2144	2653 1
+2144	3454 1
+2144	3456 1
+2144	3459 1
+2144	3660 1
+2144	3720 1
+2144	4037 1
+2144	4051 1
+2144	4218 1
+2144	4266 1
+2144	4349 1
+2144	4687 1
+2144	4735 1
+2144	5285 1
+2144	7632 1
+2144	8294 1
+2145	204 1
+2145	737 1
+2145	947 1
+2145	974 1
+2145	1166 1
+2145	1549 1
+2145	1608 1
+2145	1637 1
+2145	1653 1
+2145	1679 1
+2145	1705 1
+2145	1734 1
+2145	1814 1
+2145	1847 1
+2145	1888 1
+2145	1982 1
+2145	2066 1
+2145	2120 1
+2145	2144 1
+2145	2151 1
+2145	2210 1
+2145	2258 1
+2145	2289 1
+2145	2297 1
+2145	2323 1
+2145	2328 1
+2145	2356 1
+2145	2364 1
+2145	2375 1
+2145	2398 1
+2145	2411 1
+2145	2456 1
+2145	2504 1
+2145	2516 1
+2145	2535 1
+2145	2565 1
+2145	2594 1
+2145	2620 1
+2145	2651 1
+2145	2747 1
+2145	2774 1
+2145	2775 1
+2145	2790 1
+2145	2794 1
+2145	2811 1
+2145	2822 1
+2145	2831 1
+2145	2871 1
+2145	2912 1
+2145	2922 1
+2145	2981 1
+2145	3002 1
+2145	3005 1
+2145	3024 1
+2145	3084 1
+2145	3125 1
+2145	3130 1
+2145	3140 1
+2145	3260 1
+2145	3265 1
+2145	3291 1
+2145	3320 1
+2145	3334 1
+2145	3338 1
+2145	3376 1
+2145	3393 1
+2145	3439 1
+2145	3473 1
+2145	3537 1
+2145	3587 1
+2145	3631 1
+2145	3645 1
+2145	3664 1
+2145	3787 1
+2145	3800 1
+2145	3807 1
+2145	3843 1
+2145	3873 1
+2145	3903 1
+2145	4037 1
+2145	4191 1
+2145	4234 1
+2145	4266 1
+2145	4289 1
+2145	4335 1
+2145	4384 1
+2145	4400 1
+2145	4424 1
+2145	4485 1
+2145	4574 1
+2145	4587 1
+2145	4687 1
+2145	4735 1
+2145	4792 1
+2145	4798 1
+2145	4827 1
+2145	4875 1
+2145	4953 1
+2145	5020 1
+2145	5058 1
+2145	5079 1
+2145	5092 1
+2145	5130 1
+2145	5200 1
+2145	5210 1
+2145	5226 1
+2145	5254 1
+2145	5273 1
+2145	5288 1
+2145	5404 1
+2145	5412 1
+2145	5463 1
+2145	5543 1
+2145	5563 1
+2145	5800 1
+2145	5811 1
+2145	5827 1
+2145	5828 1
+2145	5837 1
+2145	5902 1
+2145	6006 1
+2145	6096 1
+2145	6097 1
+2145	6166 1
+2145	6221 1
+2145	6299 1
+2145	6330 1
+2145	6414 1
+2145	6437 1
+2145	6441 1
+2145	6498 1
+2145	6554 1
+2145	6634 1
+2145	6784 1
+2145	6855 1
+2145	6901 1
+2145	7279 1
+2145	7632 1
+2145	7651 1
+2145	7699 1
+2145	7757 1
+2145	7924 1
+2145	8290 1
+2145	8293 1
+2145	8297 1
+2146	2151 1
+2147	2151 1
+2148	2151 1
+2149	975 1
+2149	2151 1
+2150	2151 1
+2152	1757 1
+2152	2085 1
+2152	2165 1
+2152	2181 1
+2156	761 1
+2156	762 1
+2156	946 1
+2156	1012 1
+2156	1035 1
+2156	1061 1
+2156	1140 1
+2156	1353 1
+2156	1492 1
+2156	1549 1
+2156	1608 1
+2156	1621 1
+2156	1678 1
+2156	1700 1
+2156	1772 1
+2156	1888 1
+2156	1992 1
+2156	2071 1
+2156	2157 1
+2156	2165 1
+2156	2182 1
+2156	2195 1
+2156	2205 1
+2156	2211 1
+2156	2233 1
+2156	2241 1
+2156	2294 1
+2156	2329 1
+2156	2362 1
+2156	2378 1
+2156	2484 1
+2156	2490 1
+2156	2499 1
+2156	2517 1
+2156	2580 1
+2156	2589 1
+2156	2670 1
+2156	2736 1
+2156	3745 1
+2156	8290 1
+2156	8291 1
+2155	2157 1
+2159	764 1
+2159	1140 1
+2159	1444 1
+2159	1749 1
+2159	1783 1
+2159	1848 1
+2159	1888 1
+2159	1919 1
+2159	1997 1
+2159	2071 1
+2159	2091 1
+2159	2128 1
+2159	2145 1
+2159	2210 1
+2159	2241 1
+2159	2246 1
+2159	2253 1
+2159	8290 1
+2160	15 1
+2160	761 1
+2160	762 1
+2160	1297 1
+2160	1416 1
+2160	1549 1
+2160	2066 1
+2160	2328 1
+2160	2371 1
+2160	2398 1
+2160	2470 1
+2160	2508 1
+2160	2535 1
+2160	2900 1
+2160	3089 1
+2160	3140 1
+2160	3145 1
+2160	3150 1
+2160	3164 1
+2160	3253 1
+2160	3562 1
+2160	3776 1
+2160	3812 1
+2160	5254 1
+2160	5829 1
+2160	8290 1
+2161	761 1
+2161	2409 1
+2161	8290 1
+2163	761 1
+2163	873 1
+2164	761 1
+2168	350 1
+2168	2174 1
+2168	2977 1
+2167	2168 1
+2169	946 1
+2169	1031 1
+2169	1035 1
+2169	1211 1
+2169	1374 1
+2169	1390 1
+2169	1521 1
+2169	1621 1
+2169	1705 1
+2169	1772 1
+2169	1836 1
+2169	1842 1
+2169	1888 1
+2169	1977 1
+2169	1997 1
+2169	2117 1
+2169	2120 1
+2169	2174 1
+2169	2202 1
+2169	2241 1
+2169	2246 1
+2169	2285 1
+2169	2294 1
+2169	2322 1
+2169	2329 1
+2169	2580 1
+2169	2669 1
+2169	2685 1
+2169	2902 1
+2169	8290 1
+2169	8291 1
+2169	8292 1
+2170	1772 1
+2170	2544 1
+2171	1297 1
+2171	1679 1
+2171	1772 1
+2171	2416 1
+2171	2651 1
+2171	2660 1
+2171	2708 1
+2171	2754 1
+2171	2790 1
+2171	3021 1
+2171	3030 1
+2171	3307 1
+2171	3319 1
+2171	3338 1
+2171	3351 1
+2171	4713 1
+2172	15 1
+2172	332 1
+2172	873 1
+2172	968 1
+2172	1111 1
+2172	1250 1
+2172	1384 1
+2172	1608 1
+2172	1772 1
+2172	1956 1
+2172	1964 1
+2172	2163 1
+2172	2479 1
+2172	2484 1
+2172	2535 1
+2172	2570 1
+2172	2685 1
+2172	2777 1
+2172	2794 1
+2172	2801 1
+2172	2877 1
+2172	3034 1
+2172	3479 1
+2172	3614 1
+2172	3897 1
+2172	4037 1
+2172	4980 1
+2172	6328 1
+2172	6407 1
+2173	1772 1
+2174	214 1
+2174	1154 1
+2174	1353 1
+2174	1374 1
+2174	1564 1
+2174	1583 1
+2174	1592 1
+2174	1621 1
+2174	1808 1
+2174	2066 1
+2174	2102 1
+2174	2120 1
+2174	2160 1
+2174	2210 1
+2174	2256 1
+2174	2276 1
+2174	2328 1
+2174	2332 1
+2174	2339 1
+2174	2410 1
+2174	2411 1
+2174	2435 1
+2174	2470 1
+2174	2504 1
+2174	2570 1
+2174	2576 1
+2174	2585 1
+2174	2594 1
+2174	2607 1
+2174	2618 1
+2174	2619 1
+2174	2620 1
+2174	2625 1
+2174	2651 1
+2174	2751 1
+2174	2754 1
+2174	2770 1
+2174	2775 1
+2174	2777 1
+2174	2801 1
+2174	2809 1
+2174	2821 1
+2174	2825 1
+2174	2828 1
+2174	2838 1
+2174	2877 1
+2174	2928 1
+2174	2946 1
+2174	2955 1
+2174	3007 1
+2174	3030 1
+2174	3155 1
+2174	3253 1
+2174	3351 1
+2174	3439 1
+2174	3486 1
+2174	3516 1
+2174	3903 1
+2174	4231 1
+2174	4269 1
+2174	4687 1
+2174	5626 1
+2174	6498 1
+2174	7620 1
+2174	8291 1
+2175	2163 1
+2176	762 1
+2176	856 1
+2176	873 1
+2176	1211 1
+2176	1792 1
+2176	2205 1
+2176	2237 1
+2176	2322 1
+2176	2411 1
+2176	2651 1
+2176	2654 1
+2176	2662 1
+2176	2700 1
+2176	2856 1
+2176	3099 1
+2176	3164 1
+2176	3307 1
+2177	873 1
+2177	2991 1
+2177	2993 1
+2178	15 1
+2178	2285 1
+2178	2625 1
+2181	2475 1
+2181	4983 1
+2179	2181 1
+2180	2181 1
+2182	2185 1
+2183	2185 1
+2184	2085 1
+2184	2185 1
+2184	2264 1
+2186	741 1
+2186	1026 1
+2186	1111 1
+2186	1291 1
+2186	1315 1
+2186	1403 1
+2186	1419 1
+2186	1705 1
+2186	1769 1
+2186	1808 1
+2186	1918 1
+2186	1919 1
+2186	2174 1
+2186	2209 1
+2186	2264 1
+2186	2375 1
+2186	2547 1
+2186	2599 1
+2186	2665 1
+2186	2727 1
+2186	2747 1
+2186	2775 1
+2186	2814 1
+2186	2922 1
+2186	2963 1
+2186	2968 1
+2186	2977 1
+2186	2979 1
+2186	2999 1
+2186	3021 1
+2186	3029 1
+2186	3089 1
+2186	3148 1
+2186	3192 1
+2186	3238 1
+2186	3321 1
+2186	3351 1
+2186	3352 1
+2186	3408 1
+2186	3607 1
+2186	3969 1
+2186	4269 1
+2186	4338 1
+2186	4574 1
+2186	4604 1
+2186	4828 1
+2186	5103 1
+2186	5199 1
+2186	5404 1
+2186	5423 1
+2186	5584 1
+2186	5680 1
+2186	5848 1
+2186	6006 1
+2186	6098 1
+2186	6229 1
+2186	6299 1
+2186	6832 1
+2186	6913 1
+2186	7073 1
+2186	7108 1
+2187	1111 1
+2188	1111 1
+2188	1548 1
+2188	5254 1
+2189	1111 1
+2190	1111 1
+2191	1111 1
+2192	1315 1
+2192	2195 1
+2192	6914 1
+2192	7131 1
+2192	7803 1
+2193	1031 1
+2193	1211 1
+2193	1297 1
+2193	1492 1
+2193	1836 1
+2193	1935 1
+2193	2062 1
+2193	2195 1
+2193	2240 1
+2193	2398 1
+2193	2991 1
+2193	3811 1
+2194	2145 1
+2194	2195 1
+2194	2242 1
+2196	2085 1
+2196	4179 1
+2196	7890 1
+2197	859 1
+2197	1835 1
+2197	2085 1
+2197	2470 1
+2198	2085 1
+2198	2091 1
+2198	2247 1
+2199	2085 1
+2200	2202 1
+2200	2504 1
+2201	2202 1
+2203	975 1
+2204	975 1
+2206	1097 1
+2206	1154 1
+2206	1374 1
+2206	1608 1
+2206	1956 1
+2206	2233 1
+2206	2234 1
+2206	2340 1
+2206	2411 1
+2206	2499 1
+2206	2504 1
+2206	2672 1
+2206	2720 1
+2206	2777 1
+2209	204 1
+2209	350 1
+2209	974 1
+2209	1166 1
+2209	1357 1
+2209	1416 1
+2209	1564 1
+2209	1633 1
+2209	1646 1
+2209	1653 1
+2209	1787 1
+2209	2120 1
+2209	2252 1
+2209	2338 1
+2209	2410 1
+2209	2504 1
+2209	2542 1
+2209	2594 1
+2209	2657 1
+2209	2720 1
+2209	2805 1
+2209	2819 1
+2209	2900 1
+2209	3018 1
+2209	3020 1
+2209	3148 1
+2209	3201 1
+2209	3473 1
+2209	3489 1
+2209	3580 1
+2209	3587 1
+2210	1061 1
+2210	1140 1
+2210	1749 1
+2210	1787 1
+2210	2066 1
+2210	2211 1
+2210	2246 1
+2210	2253 1
+2210	2544 1
+2210	2790 1
+2210	3084 1
+2210	3394 1
+2210	3562 1
+2210	4013 1
+2210	4233 1
+2210	4735 1
+2210	5412 1
+2212	1985 1
+2213	1985 1
+2214	1985 1
+2214	1997 1
+2214	3136 1
+2215	1211 1
+2215	1444 1
+2215	1714 1
+2215	2397 1
+2215	2456 1
+2215	2470 1
+2215	3018 1
+2215	3027 1
+2215	3334 1
+2215	3792 1
+2215	4384 1
+2215	4735 1
+2215	5463 1
+2215	6296 1
+2215	7108 1
+2216	1714 1
+2217	825 1
+2217	1714 1
+2217	3125 1
+2217	3276 1
+2217	3562 1
+2217	3568 1
+2217	3785 1
+2217	3787 1
+2217	4384 1
+2217	5426 1
+2217	5631 1
+2218	1444 1
+2219	1444 1
+2221	1613 1
+2222	1613 1
+2223	1613 1
+2223	2398 1
+2223	2547 1
+2223	3084 1
+2223	3125 1
+2223	3720 1
+2223	3892 1
+2223	4071 1
+2223	4401 1
+2223	4798 1
+2223	5022 1
+2223	7553 1
+2223	8033 1
+2223	8148 1
+2223	8294 1
+2224	2102 1
+2224	2128 1
+2224	2625 1
+2225	15 1
+2225	764 1
+2225	856 1
+2225	1049 1
+2225	1492 1
+2225	1564 1
+2225	1700 1
+2225	1992 1
+2225	2071 1
+2225	2117 1
+2225	2128 1
+2225	2135 1
+2225	2145 1
+2225	2323 1
+2225	2328 1
+2225	2474 1
+2225	2625 1
+2225	2651 1
+2225	2775 1
+2225	2856 1
+2225	2951 1
+2225	3007 1
+2225	3020 1
+2225	3034 1
+2225	3089 1
+2225	3238 1
+2225	3253 1
+2225	3265 1
+2225	3452 1
+2225	3755 1
+2225	5022 1
+2225	5335 1
+2225	5412 1
+2225	8168 1
+2226	1018 1
+2226	1166 1
+2226	1374 1
+2226	1571 1
+2226	2128 1
+2226	2456 1
+2226	2504 1
+2226	2517 1
+2226	2790 1
+2226	3253 1
+2226	3352 1
+2226	3459 1
+2226	3607 1
+2226	4037 1
+2226	4266 1
+2226	4661 1
+2226	4827 1
+2226	5773 1
+2226	5800 1
+2226	6299 1
+2226	6330 1
+2226	6523 1
+2226	6634 1
+2226	7890 1
+2226	7924 1
+2226	7961 1
+2226	8168 1
+2226	8291 1
+2227	1808 1
+2227	2071 1
+2227	2128 1
+2227	2375 1
+2234	825 1
+2234	1267 1
+2234	2116 1
+2234	2285 1
+2234	2654 1
+2234	2724 1
+2234	2856 1
+2234	2900 1
+2234	3089 1
+2234	3145 1
+2234	3150 1
+2234	3313 1
+2234	3321 1
+2234	8293 1
+2228	2234 1
+2230	214 1
+2230	332 1
+2230	417 1
+2230	744 1
+2230	1297 1
+2230	1419 1
+2230	1608 1
+2230	1633 1
+2230	1700 1
+2230	1792 1
+2230	1808 1
+2230	1847 1
+2230	1964 1
+2230	2117 1
+2230	2120 1
+2230	2135 1
+2230	2182 1
+2230	2231 1
+2230	2234 1
+2230	2240 1
+2230	2256 1
+2230	2375 1
+2230	2411 1
+2230	2484 1
+2230	2504 1
+2230	2585 1
+2230	2591 1
+2230	2594 1
+2230	2619 1
+2230	2625 1
+2230	2638 1
+2230	2651 1
+2230	2654 1
+2230	2685 1
+2230	2794 1
+2230	2926 1
+2230	2996 1
+2230	3005 1
+2230	3033 1
+2230	3059 1
+2230	3080 1
+2230	3084 1
+2230	3104 1
+2230	3130 1
+2230	3320 1
+2230	3541 1
+2230	3623 1
+2230	3680 1
+2230	3875 1
+2231	15 1
+2231	332 1
+2231	744 1
+2231	968 1
+2231	1012 1
+2231	1018 1
+2231	1186 1
+2231	1250 1
+2231	1492 1
+2231	1596 1
+2231	1608 1
+2231	1637 1
+2231	1706 1
+2231	1835 1
+2231	1964 1
+2231	2117 1
+2231	2182 1
+2231	2234 1
+2231	2294 1
+2231	2332 1
+2231	2340 1
+2231	2366 1
+2231	2400 1
+2231	2426 1
+2231	2435 1
+2231	2490 1
+2231	2499 1
+2231	2504 1
+2231	2517 1
+2231	2570 1
+2231	2571 1
+2231	2575 1
+2231	2579 1
+2231	2587 1
+2231	2589 1
+2231	2591 1
+2231	2594 1
+2231	2604 1
+2231	2607 1
+2231	2618 1
+2231	2629 1
+2231	2643 1
+2231	2650 1
+2231	2657 1
+2231	2670 1
+2231	2720 1
+2231	2736 1
+2231	2801 1
+2231	2818 1
+2231	2821 1
+2231	2825 1
+2231	2918 1
+2231	2977 1
+2231	2979 1
+2231	3030 1
+2231	3050 1
+2231	3056 1
+2231	3068 1
+2231	3104 1
+2231	3171 1
+2231	3201 1
+2231	3614 1
+2231	3976 1
+2231	5412 1
+2231	5963 1
+2231	6251 1
+2229	285 1
+2229	350 1
+2229	633 1
+2229	762 1
+2229	856 1
+2229	968 1
+2229	974 1
+2229	1097 1
+2229	1157 1
+2229	1166 1
+2229	1186 1
+2229	1250 1
+2229	1267 1
+2229	1357 1
+2229	1385 1
+2229	1393 1
+2229	1416 1
+2229	1437 1
+2229	1549 1
+2229	1564 1
+2229	1679 1
+2229	1717 1
+2229	1729 1
+2229	1734 1
+2229	1754 1
+2229	1792 1
+2229	1814 1
+2229	1835 1
+2229	1990 1
+2229	2116 1
+2229	2117 1
+2229	2129 1
+2229	2135 1
+2229	2209 1
+2229	2225 1
+2229	2231 1
+2229	2234 1
+2229	2237 1
+2229	2252 1
+2229	2289 1
+2229	2325 1
+2229	2328 1
+2229	2356 1
+2229	2371 1
+2229	2416 1
+2229	2474 1
+2229	2475 1
+2229	2504 1
+2229	2517 1
+2229	2550 1
+2229	2565 1
+2229	2570 1
+2229	2571 1
+2229	2575 1
+2229	2579 1
+2229	2580 1
+2229	2587 1
+2229	2589 1
+2229	2591 1
+2229	2593 1
+2229	2594 1
+2229	2597 1
+2229	2604 1
+2229	2607 1
+2229	2612 1
+2229	2625 1
+2229	2629 1
+2229	2646 1
+2229	2651 1
+2229	2654 1
+2229	2662 1
+2229	2674 1
+2229	2697 1
+2229	2700 1
+2229	2708 1
+2229	2713 1
+2229	2720 1
+2229	2724 1
+2229	2754 1
+2229	2830 1
+2229	2856 1
+2229	2900 1
+2229	2912 1
+2229	2951 1
+2229	3018 1
+2229	3020 1
+2229	3021 1
+2229	3030 1
+2229	3089 1
+2229	3126 1
+2229	3140 1
+2229	3144 1
+2229	3145 1
+2229	3148 1
+2229	3150 1
+2229	3155 1
+2229	3164 1
+2229	3173 1
+2229	3192 1
+2229	3235 1
+2229	3243 1
+2229	3251 1
+2229	3253 1
+2229	3265 1
+2229	3276 1
+2229	3307 1
+2229	3319 1
+2229	3320 1
+2229	3324 1
+2229	3338 1
+2229	3346 1
+2229	3348 1
+2229	3351 1
+2229	3371 1
+2229	3376 1
+2229	3394 1
+2229	3408 1
+2229	3520 1
+2229	3537 1
+2229	3568 1
+2229	3580 1
+2229	3587 1
+2229	3645 1
+2229	3660 1
+2229	3661 1
+2229	3813 1
+2229	4191 1
+2229	4234 1
+2229	4256 1
+2229	4289 1
+2229	4290 1
+2229	4297 1
+2229	4323 1
+2229	4349 1
+2229	4365 1
+2229	4373 1
+2229	4384 1
+2229	4385 1
+2229	4402 1
+2229	4411 1
+2229	4417 1
+2229	4422 1
+2229	4424 1
+2232	332 1
+2232	1956 1
+2232	2234 1
+2232	2425 1
+2232	2426 1
+2232	2589 1
+2232	2591 1
+2232	2618 1
+2232	2629 1
+2232	2647 1
+2232	2720 1
+2232	2781 1
+2233	56 1
+2233	332 1
+2233	859 1
+2233	959 1
+2233	968 1
+2233	1035 1
+2233	1097 1
+2233	1186 1
+2233	1250 1
+2233	1492 1
+2233	1547 1
+2233	1608 1
+2233	1717 1
+2233	1919 1
+2233	1956 1
+2233	2117 1
+2233	2193 1
+2233	2234 1
+2233	2251 1
+2233	2332 1
+2233	2345 1
+2233	2385 1
+2233	2400 1
+2233	2475 1
+2233	2504 1
+2233	2575 1
+2233	2587 1
+2233	2593 1
+2233	2604 1
+2233	2625 1
+2233	2801 1
+2233	2809 1
+2233	3033 1
+2233	3056 1
+2233	3238 1
+2233	7695 1
+2235	1783 1
+2236	633 1
+2236	762 1
+2236	764 1
+2236	856 1
+2236	946 1
+2236	1061 1
+2236	1267 1
+2236	1291 1
+2236	1357 1
+2236	1393 1
+2236	1416 1
+2236	1679 1
+2236	1734 1
+2236	1754 1
+2236	1781 1
+2236	1783 1
+2236	1792 1
+2236	1814 1
+2236	1848 1
+2236	1919 1
+2236	2071 1
+2236	2116 1
+2236	2135 1
+2236	2145 1
+2236	2225 1
+2236	2231 1
+2236	2241 1
+2236	2246 1
+2236	2251 1
+2236	2256 1
+2236	2273 1
+2236	2323 1
+2236	2325 1
+2236	2356 1
+2236	2411 1
+2236	2474 1
+2236	2550 1
+2236	2593 1
+2236	2625 1
+2236	2651 1
+2236	2654 1
+2236	2662 1
+2236	2697 1
+2236	2700 1
+2236	2708 1
+2236	2713 1
+2236	2721 1
+2236	2724 1
+2236	2754 1
+2236	2830 1
+2236	2856 1
+2236	2900 1
+2236	2912 1
+2236	2951 1
+2236	2966 1
+2236	2968 1
+2236	3020 1
+2236	3030 1
+2236	3033 1
+2236	3034 1
+2236	3089 1
+2236	3099 1
+2236	3117 1
+2236	3126 1
+2236	3140 1
+2236	3145 1
+2236	3150 1
+2236	3164 1
+2236	3243 1
+2236	3251 1
+2236	3253 1
+2236	3258 1
+2236	3265 1
+2236	3320 1
+2236	8291 1
+2237	15 1
+2237	204 1
+2237	465 1
+2237	608 1
+2237	737 1
+2237	762 1
+2237	974 1
+2237	1166 1
+2237	1185 1
+2237	1291 1
+2237	1297 1
+2237	1305 1
+2237	1315 1
+2237	1357 1
+2237	1416 1
+2237	1549 1
+2237	1633 1
+2237	1637 1
+2237	1688 1
+2237	1706 1
+2237	1729 1
+2237	1734 1
+2237	1744 1
+2237	1754 1
+2237	1769 1
+2237	1781 1
+2237	1919 1
+2237	1990 1
+2237	2014 1
+2237	2016 1
+2237	2091 1
+2237	2114 1
+2237	2134 1
+2237	2144 1
+2237	2145 1
+2237	2182 1
+2237	2209 1
+2237	2251 1
+2237	2252 1
+2237	2256 1
+2237	2257 1
+2237	2276 1
+2237	2289 1
+2237	2290 1
+2237	2297 1
+2237	2324 1
+2237	2328 1
+2237	2381 1
+2237	2398 1
+2237	2456 1
+2237	2470 1
+2237	2485 1
+2237	2510 1
+2237	2517 1
+2237	2535 1
+2237	2544 1
+2237	2550 1
+2237	2565 1
+2237	2576 1
+2237	2585 1
+2237	2592 1
+2237	2593 1
+2237	2594 1
+2237	2595 1
+2237	2612 1
+2237	2619 1
+2237	2646 1
+2237	2651 1
+2237	2654 1
+2237	2657 1
+2237	2660 1
+2237	2667 1
+2237	2674 1
+2237	2686 1
+2237	2693 1
+2237	2696 1
+2237	2697 1
+2237	2700 1
+2237	2707 1
+2237	2746 1
+2237	2747 1
+2237	2760 1
+2237	2790 1
+2237	2811 1
+2237	2815 1
+2237	2819 1
+2237	2830 1
+2237	2831 1
+2237	2871 1
+2237	2909 1
+2237	2932 1
+2237	2955 1
+2237	2968 1
+2237	2973 1
+2237	2996 1
+2237	2999 1
+2237	3005 1
+2237	3010 1
+2237	3014 1
+2237	3021 1
+2237	3024 1
+2237	3026 1
+2237	3028 1
+2237	3029 1
+2237	3033 1
+2237	3034 1
+2237	3059 1
+2237	3084 1
+2237	3089 1
+2237	3114 1
+2237	3117 1
+2237	3125 1
+2237	3140 1
+2237	3144 1
+2237	3148 1
+2237	3150 1
+2237	3164 1
+2237	3192 1
+2237	3260 1
+2237	3284 1
+2237	3291 1
+2237	3307 1
+2237	3309 1
+2237	3321 1
+2237	3334 1
+2237	3338 1
+2237	3352 1
+2237	3394 1
+2237	3404 1
+2237	3408 1
+2237	3417 1
+2237	3433 1
+2237	3439 1
+2237	3443 1
+2237	3447 1
+2237	3453 1
+2237	3454 1
+2237	3456 1
+2237	3464 1
+2237	3480 1
+2237	3498 1
+2237	3529 1
+2237	3537 1
+2237	3541 1
+2237	3557 1
+2237	3568 1
+2237	3580 1
+2237	3615 1
+2237	3635 1
+2237	3643 1
+2237	3645 1
+2237	3650 1
+2237	3660 1
+2237	3661 1
+2237	3680 1
+2237	3748 1
+2237	3800 1
+2237	3807 1
+2237	3812 1
+2237	3847 1
+2237	3871 1
+2237	3887 1
+2237	3892 1
+2237	3903 1
+2237	3956 1
+2237	3958 1
+2237	3970 1
+2237	4011 1
+2237	4040 1
+2237	4044 1
+2237	4072 1
+2237	4103 1
+2237	4124 1
+2237	4191 1
+2237	4212 1
+2237	4234 1
+2237	4256 1
+2237	4261 1
+2237	4263 1
+2237	4266 1
+2237	4269 1
+2237	4276 1
+2237	4289 1
+2237	4290 1
+2237	4299 1
+2237	4335 1
+2237	4365 1
+2237	4384 1
+2237	4417 1
+2237	4422 1
+2237	4424 1
+2237	4448 1
+2237	4453 1
+2237	4463 1
+2237	4485 1
+2237	4510 1
+2237	4528 1
+2237	4551 1
+2237	4574 1
+2237	4578 1
+2237	4600 1
+2237	4613 1
+2237	4653 1
+2237	4661 1
+2237	4662 1
+2237	4666 1
+2237	4687 1
+2237	4719 1
+2237	4735 1
+2237	4781 1
+2237	4796 1
+2237	4808 1
+2237	4811 1
+2237	4814 1
+2237	4824 1
+2237	4827 1
+2237	4828 1
+2237	4938 1
+2237	4962 1
+2237	5061 1
+2237	5092 1
+2237	5100 1
+2237	5130 1
+2237	5155 1
+2237	5162 1
+2237	5178 1
+2237	5262 1
+2237	5412 1
+2237	5430 1
+2237	5449 1
+2237	5459 1
+2237	5482 1
+2237	5509 1
+2237	5511 1
+2237	5640 1
+2237	5844 1
+2237	5848 1
+2237	5886 1
+2237	6229 1
+2237	6624 1
+2237	8293 1
+2238	2091 1
+2241	1097 1
+2241	1186 1
+2241	1353 1
+2241	1492 1
+2241	1621 1
+2241	1700 1
+2241	1888 1
+2241	1992 1
+2241	1997 1
+2241	2117 1
+2241	2504 1
+2241	2587 1
+2241	2604 1
+2241	2665 1
+2239	2241 1
+2240	15 1
+2240	204 1
+2240	285 1
+2240	737 1
+2240	856 1
+2240	947 1
+2240	974 1
+2240	1018 1
+2240	1026 1
+2240	1031 1
+2240	1074 1
+2240	1186 1
+2240	1243 1
+2240	1297 1
+2240	1307 1
+2240	1393 1
+2240	1492 1
+2240	1549 1
+2240	1565 1
+2240	1608 1
+2240	1633 1
+2240	1842 1
+2240	1888 1
+2240	2066 1
+2240	2071 1
+2240	2102 1
+2240	2117 1
+2240	2120 1
+2240	2160 1
+2240	2174 1
+2240	2209 1
+2240	2237 1
+2240	2241 1
+2240	2256 1
+2240	2285 1
+2240	2322 1
+2240	2325 1
+2240	2328 1
+2240	2341 1
+2240	2356 1
+2240	2362 1
+2240	2398 1
+2240	2409 1
+2240	2435 1
+2240	2499 1
+2240	2504 1
+2240	2535 1
+2240	2575 1
+2240	2591 1
+2240	2594 1
+2240	2625 1
+2240	2651 1
+2240	2657 1
+2240	2665 1
+2240	2746 1
+2240	2951 1
+2240	3005 1
+2240	3014 1
+2240	3020 1
+2240	3024 1
+2240	3030 1
+2240	3130 1
+2240	3238 1
+2240	3260 1
+2240	3408 1
+2240	3580 1
+2240	3615 1
+2240	3796 1
+2240	3842 1
+2240	3962 1
+2240	3976 1
+2240	4037 1
+2240	4065 1
+2240	4099 1
+2240	4183 1
+2240	4256 1
+2240	4351 1
+2240	4471 1
+2240	4528 1
+2240	4536 1
+2240	4981 1
+2240	5079 1
+2240	5254 1
+2240	5321 1
+2240	5524 1
+2240	5605 1
+2240	5814 1
+2240	5827 1
+2240	5871 1
+2240	6327 1
+2240	6337 1
+2240	6567 1
+2240	6576 1
+2240	6634 1
+2240	6774 1
+2240	6832 1
+2240	6913 1
+2240	7517 1
+2240	7620 1
+2240	7651 1
+2240	7662 1
+2240	7992 1
+2240	8083 1
+2240	8168 1
+2240	8290 1
+2240	8291 1
+2240	8293 1
+2240	8294 1
+2242	1140 1
+2242	1749 1
+2242	1848 1
+2041	1140 1
+2041	1378 1
+2041	2595 1
+2041	2654 1
+2041	3352 1
+2041	3408 1
+2243	2242 1
+2246	1919 1
+2246	2210 1
+2246	2323 1
+2246	2535 1
+2246	3130 1
+2246	4735 1
+2246	5412 1
+2246	5714 1
+2249	946 1
+2249	1353 1
+2249	1403 1
+2249	1565 1
+2249	1608 1
+2249	2071 1
+2249	2145 1
+2249	2281 1
+2249	2322 1
+2249	2338 1
+2249	2397 1
+2249	2400 1
+2249	2618 1
+2249	2625 1
+2249	2754 1
+2249	2851 1
+2249	3291 1
+2249	3346 1
+2249	3348 1
+2249	3479 1
+2249	3726 1
+2249	4361 1
+2249	5199 1
+2249	5233 1
+2249	5378 1
+2249	5404 1
+2249	5432 1
+2249	5439 1
+2249	5582 1
+2249	6299 1
+2249	6417 1
+2249	6503 1
+2249	6599 1
+2249	6736 1
+2249	6913 1
+2249	6976 1
+2249	7295 1
+2249	7301 1
+2250	2071 1
+2250	2246 1
+2250	8291 1
+2251	587 1
+2251	856 1
+2251	1061 1
+2251	1542 1
+2251	1679 1
+2251	1977 1
+2251	2071 1
+2251	2231 1
+2251	2332 1
+2251	2435 1
+2251	2625 1
+2251	2651 1
+2251	2654 1
+2251	2707 1
+2251	2721 1
+2251	2814 1
+2251	2815 1
+2251	2968 1
+2251	2972 1
+2251	2977 1
+2251	2999 1
+2251	3020 1
+2251	3056 1
+2251	3265 1
+2251	8291 1
+2252	825 1
+2252	1549 1
+2252	1744 1
+2252	2251 1
+2252	2253 1
+2252	2422 1
+2252	2585 1
+2252	2652 1
+2252	2654 1
+2252	2674 1
+2252	2693 1
+2252	2747 1
+2252	3005 1
+2252	3026 1
+2252	3461 1
+2252	3520 1
+2252	3576 1
+2252	3629 1
+2252	3745 1
+2252	3811 1
+2252	3946 1
+2252	3970 1
+2254	946 1
+2254	1847 1
+2254	1888 1
+2254	1992 1
+2254	2504 1
+2254	2805 1
+2255	722 1
+2255	859 1
+2255	946 1
+2255	947 1
+2255	959 1
+2255	1031 1
+2255	1243 1
+2255	1291 1
+2255	1390 1
+2255	1492 1
+2255	1547 1
+2255	1565 1
+2255	1700 1
+2255	1836 1
+2255	1842 1
+2255	1888 1
+2255	1919 1
+2255	1964 1
+2255	2193 1
+2255	2290 1
+2255	2323 1
+2255	2333 1
+2255	2350 1
+2255	2385 1
+2255	2397 1
+2255	2400 1
+2255	2560 1
+2255	2707 1
+2255	2815 1
+2255	2963 1
+2255	2999 1
+2256	15 1
+2256	56 1
+2256	214 1
+2256	350 1
+2256	403 1
+2256	425 1
+2256	741 1
+2256	765 1
+2256	778 1
+2256	827 1
+2256	946 1
+2256	968 1
+2256	1012 1
+2256	1049 1
+2256	1100 1
+2256	1291 1
+2256	1297 1
+2256	1374 1
+2256	1384 1
+2256	1419 1
+2256	1521 1
+2256	1549 1
+2256	1564 1
+2256	1565 1
+2256	1592 1
+2256	1596 1
+2256	1608 1
+2256	1637 1
+2256	1646 1
+2256	1653 1
+2256	1705 1
+2256	1723 1
+2256	1744 1
+2256	1777 1
+2256	1808 1
+2256	1814 1
+2256	1847 1
+2256	1918 1
+2256	1935 1
+2256	1990 1
+2256	1992 1
+2256	2053 1
+2256	2066 1
+2256	2072 1
+2256	2076 1
+2256	2102 1
+2256	2117 1
+2256	2120 1
+2256	2134 1
+2256	2145 1
+2256	2174 1
+2256	2225 1
+2256	2240 1
+2256	2264 1
+2256	2294 1
+2256	2307 1
+2256	2322 1
+2256	2329 1
+2256	2340 1
+2256	2341 1
+2256	2375 1
+2256	2410 1
+2256	2411 1
+2256	2416 1
+2256	2435 1
+2256	2475 1
+2256	2501 1
+2256	2504 1
+2256	2516 1
+2256	2517 1
+2256	2535 1
+2256	2544 1
+2256	2547 1
+2256	2560 1
+2256	2579 1
+2256	2587 1
+2256	2591 1
+2256	2593 1
+2256	2594 1
+2256	2599 1
+2256	2619 1
+2256	2625 1
+2256	2647 1
+2256	2650 1
+2256	2651 1
+2256	2652 1
+2256	2654 1
+2256	2657 1
+2256	2667 1
+2256	2669 1
+2256	2670 1
+2256	2685 1
+2256	2687 1
+2256	2707 1
+2256	2720 1
+2256	2736 1
+2256	2747 1
+2256	2751 1
+2256	2754 1
+2256	2763 1
+2256	2770 1
+2256	2774 1
+2256	2777 1
+2256	2781 1
+2256	2785 1
+2256	2787 1
+2256	2790 1
+2256	2794 1
+2256	2797 1
+2256	2799 1
+2256	2805 1
+2256	2809 1
+2256	2814 1
+2256	2815 1
+2256	2818 1
+2256	2821 1
+2256	2825 1
+2256	2828 1
+2256	2844 1
+2256	2859 1
+2256	2877 1
+2256	2900 1
+2256	2902 1
+2256	2918 1
+2256	2922 1
+2256	2926 1
+2256	2928 1
+2256	2955 1
+2256	2958 1
+2256	2963 1
+2256	2974 1
+2256	2979 1
+2256	2993 1
+2256	2999 1
+2256	3005 1
+2256	3023 1
+2256	3028 1
+2256	3030 1
+2256	3089 1
+2256	3117 1
+2256	3200 1
+2256	3243 1
+2256	3253 1
+2256	3256 1
+2256	3258 1
+2256	3266 1
+2256	3276 1
+2256	3291 1
+2256	3301 1
+2256	3324 1
+2256	3338 1
+2256	3352 1
+2256	3371 1
+2256	3376 1
+2256	3404 1
+2256	3409 1
+2256	3410 1
+2256	3429 1
+2256	3435 1
+2256	3443 1
+2256	3446 1
+2256	3456 1
+2256	3461 1
+2256	3473 1
+2256	3479 1
+2256	3483 1
+2256	3486 1
+2256	3489 1
+2256	3520 1
+2256	3547 1
+2256	3555 1
+2256	3562 1
+2256	3576 1
+2256	3587 1
+2256	3609 1
+2256	3614 1
+2256	3616 1
+2256	3635 1
+2256	3643 1
+2256	3646 1
+2256	3670 1
+2256	3720 1
+2256	3737 1
+2256	3769 1
+2256	3776 1
+2256	3785 1
+2256	3787 1
+2256	3800 1
+2256	3803 1
+2256	3811 1
+2256	3822 1
+2256	3849 1
+2256	3871 1
+2256	3893 1
+2256	3897 1
+2256	3973 1
+2256	3980 1
+2256	4037 1
+2256	4041 1
+2256	4047 1
+2256	4051 1
+2256	4055 1
+2256	4078 1
+2256	4110 1
+2256	4111 1
+2256	4173 1
+2256	4179 1
+2256	4181 1
+2256	4201 1
+2256	4218 1
+2256	4231 1
+2256	4247 1
+2256	4335 1
+2256	4400 1
+2256	4677 1
+2256	4678 1
+2256	4735 1
+2256	4780 1
+2256	4795 1
+2256	4797 1
+2256	4798 1
+2256	4809 1
+2256	4811 1
+2256	4946 1
+2256	5178 1
+2256	5200 1
+2256	5233 1
+2256	5412 1
+2256	5423 1
+2256	5457 1
+2256	5638 1
+2256	5709 1
+2256	6029 1
+2256	6296 1
+2256	6302 1
+2256	6306 1
+2256	6328 1
+2256	6334 1
+2256	6337 1
+2256	6388 1
+2256	6409 1
+2256	6422 1
+2256	6432 1
+2256	6806 1
+2256	8291 1
+2256	8293 1
+2256	8294 1
+2257	737 1
+2257	765 1
+2257	1018 1
+2257	1166 1
+2257	1734 1
+2257	1823 1
+2257	1919 1
+2257	2120 1
+2257	2135 1
+2257	2144 1
+2257	2145 1
+2257	2225 1
+2257	2246 1
+2257	2381 1
+2257	2397 1
+2257	2440 1
+2257	2544 1
+2257	2576 1
+2257	2593 1
+2257	2667 1
+2257	2686 1
+2257	2708 1
+2257	2764 1
+2257	3117 1
+2257	3253 1
+2257	3291 1
+2257	3321 1
+2257	3352 1
+2257	3408 1
+2257	3435 1
+2257	3439 1
+2257	3464 1
+2257	3465 1
+2257	3473 1
+2257	3680 1
+2257	3796 1
+2257	3885 1
+2257	3892 1
+2257	4191 1
+2257	4719 1
+2257	4827 1
+2257	4938 1
+2257	5072 1
+2257	5239 1
+2257	5459 1
+2257	5506 1
+2257	5651 1
+2257	5732 1
+2257	5806 1
+2258	762 1
+2258	1026 1
+2258	1166 1
+2258	1297 1
+2258	1549 1
+2258	1648 1
+2258	1733 1
+2258	1842 1
+2258	2066 1
+2258	2145 1
+2258	2246 1
+2258	2328 1
+2258	2411 1
+2258	2456 1
+2258	2508 1
+2258	2511 1
+2258	2565 1
+2258	2576 1
+2258	2605 1
+2258	2625 1
+2258	2727 1
+2258	2760 1
+2258	2774 1
+2258	2775 1
+2258	2859 1
+2258	2871 1
+2258	2981 1
+2258	3089 1
+2258	3200 1
+2258	3253 1
+2258	3321 1
+2258	3334 1
+2258	3480 1
+2258	3568 1
+2258	3586 1
+2258	3631 1
+2258	3873 1
+2258	3970 1
+2258	4011 1
+2258	4037 1
+2258	4043 1
+2258	4349 1
+2258	4510 1
+2258	4666 1
+2258	4712 1
+2258	4715 1
+2258	4781 1
+2258	4980 1
+2258	4994 1
+2258	5072 1
+2258	5121 1
+2258	5182 1
+2258	5199 1
+2258	5200 1
+2258	5226 1
+2258	5233 1
+2258	5273 1
+2258	5437 1
+2258	5466 1
+2258	5482 1
+2258	5693 1
+2258	5721 1
+2258	5732 1
+2258	5753 1
+2258	5760 1
+2258	5773 1
+2258	5784 1
+2258	5790 1
+2258	5798 1
+2258	5804 1
+2258	5828 1
+2258	5863 1
+2258	5891 1
+2258	5925 1
+2258	5947 1
+2258	5963 1
+2258	6124 1
+2258	6229 1
+2258	6251 1
+2258	6328 1
+2258	6330 1
+2258	6414 1
+2258	6571 1
+2258	6595 1
+2258	6790 1
+2258	7119 1
+2258	7143 1
+2258	7373 1
+2258	7422 1
+2258	7478 1
+2258	7810 1
+2258	7946 1
+2258	8083 1
+2258	8198 1
+2258	8294 1
+2259	2246 1
+2260	8291 1
+2261	8291 1
+2262	8291 1
+2153	2594 1
+2153	2625 1
+2153	7168 1
+2153	8291 1
+2264	1024 1
+2264	1049 1
+2264	1186 1
+2264	1353 1
+2264	1357 1
+2264	1403 1
+2264	1473 1
+2264	1549 1
+2264	1653 1
+2264	1729 1
+2264	1961 1
+2264	2328 1
+2264	2381 1
+2264	2385 1
+2264	2433 1
+2264	2654 1
+2264	2697 1
+2264	2774 1
+2264	2775 1
+2264	2794 1
+2264	2834 1
+2264	2856 1
+2264	3293 1
+2264	3352 1
+2264	3456 1
+2264	3660 1
+2264	3691 1
+2264	3843 1
+2264	3926 1
+2264	3937 1
+2264	3942 1
+2264	3958 1
+2264	4124 1
+2264	4234 1
+2264	4247 1
+2264	4261 1
+2264	4417 1
+2264	4510 1
+2264	4530 1
+2264	4706 1
+2264	4712 1
+2264	4797 1
+2264	5100 1
+2264	5254 1
+2264	5289 1
+2264	5454 1
+2264	5714 1
+2264	5775 1
+2264	6029 1
+2264	6243 1
+2264	6458 1
+2264	6554 1
+2264	6594 1
+2264	6714 1
+2264	6784 1
+2264	6833 1
+2264	7115 1
+2264	7620 1
+2266	587 1
+2267	2273 1
+2268	2273 1
+2269	2273 1
+2269	3348 1
+2270	2273 1
+2274	332 1
+2274	425 1
+2274	722 1
+2274	744 1
+2274	856 1
+2274	859 1
+2274	947 1
+2274	1012 1
+2274	1018 1
+2274	1250 1
+2274	1267 1
+2274	1437 1
+2274	1492 1
+2274	1608 1
+2274	1700 1
+2274	1835 1
+2274	1888 1
+2274	1919 1
+2274	1964 1
+2274	2117 1
+2274	2135 1
+2274	2145 1
+2274	2182 1
+2274	2240 1
+2274	2307 1
+2274	2329 1
+2274	2332 1
+2274	2385 1
+2274	2411 1
+2274	2423 1
+2274	2425 1
+2274	2426 1
+2274	2435 1
+2274	2484 1
+2274	2490 1
+2274	2571 1
+2274	2575 1
+2274	2579 1
+2274	2580 1
+2274	2625 1
+2274	2654 1
+2274	2946 1
+2274	3080 1
+2274	3130 1
+2274	3155 1
+2274	3193 1
+2274	3235 1
+2274	5936 1
+2276	15 1
+2276	72 1
+2276	840 1
+2276	896 1
+2276	1026 1
+2276	2398 1
+2276	2433 1
+2276	3334 1
+2276	3459 1
+2276	3614 1
+2276	3897 1
+2276	4110 1
+2276	4298 1
+2276	4400 1
+2276	4795 1
+2276	5254 1
+2276	5393 1
+2276	5638 1
+2276	5963 1
+2276	5969 1
+2276	5973 1
+2276	6004 1
+2276	6156 1
+2276	6422 1
+2276	6725 1
+2276	6739 1
+2276	6803 1
+2276	7059 1
+2276	7478 1
+2276	7490 1
+2276	7632 1
+2276	7839 1
+2277	2354 1
+2277	3089 1
+2277	3643 1
+2277	4335 1
+2277	5412 1
+2277	6813 1
+2277	8175 1
+2277	8291 1
+2278	2276 1
+2278	2917 1
+2278	5543 1
+2278	8291 1
+2280	1664 1
+2281	2193 1
+2281	2625 1
+2282	1542 1
+2282	1997 1
+2282	2285 1
+2282	2397 1
+2282	8290 1
+2283	1542 1
+2286	1035 1
+2286	1297 1
+2286	1492 1
+2286	1621 1
+2286	1700 1
+2286	1997 1
+2285	1393 1
+2285	1633 1
+2285	1679 1
+2285	1997 1
+2285	2135 1
+2285	2210 1
+2285	2231 1
+2285	2398 1
+2285	2485 1
+2285	2592 1
+2285	2625 1
+2285	2713 1
+2285	3258 1
+2285	3321 1
+2285	3371 1
+2285	3408 1
+2285	7478 1
+2287	1492 1
+2287	1997 1
+2287	2504 1
+2287	2968 1
+2290	204 1
+2290	825 1
+2290	827 1
+2290	974 1
+2290	1100 1
+2290	1157 1
+2290	1166 1
+2290	1297 1
+2290	1307 1
+2290	1385 1
+2290	1549 1
+2290	1744 1
+2290	1777 1
+2290	1990 1
+2290	2114 1
+2290	2144 1
+2290	2209 1
+2290	2210 1
+2290	2252 1
+2290	2257 1
+2290	2289 1
+2290	2297 1
+2290	2324 1
+2290	2411 1
+2290	2485 1
+2290	2510 1
+2290	2535 1
+2290	2565 1
+2290	2595 1
+2290	2597 1
+2290	2619 1
+2290	2651 1
+2290	2652 1
+2290	2653 1
+2290	2654 1
+2290	2655 1
+2290	2657 1
+2290	2660 1
+2290	2667 1
+2290	2674 1
+2290	2686 1
+2290	2687 1
+2290	2693 1
+2290	2727 1
+2290	2746 1
+2290	2747 1
+2290	2819 1
+2290	2900 1
+2290	2923 1
+2290	2973 1
+2290	2974 1
+2290	3005 1
+2290	3007 1
+2290	3009 1
+2290	3010 1
+2290	3024 1
+2290	3059 1
+2290	3114 1
+2290	3117 1
+2290	3148 1
+2290	3173 1
+2290	3200 1
+2290	3258 1
+2290	3260 1
+2290	3301 1
+2290	3404 1
+2290	3480 1
+2290	3516 1
+2290	3520 1
+2290	3529 1
+2290	3537 1
+2290	3541 1
+2290	3547 1
+2290	3548 1
+2290	3556 1
+2290	3557 1
+2290	3567 1
+2290	3568 1
+2290	3580 1
+2290	3587 1
+2290	3609 1
+2290	3629 1
+2290	3646 1
+2290	3670 1
+2290	3671 1
+2290	3680 1
+2290	3681 1
+2290	3717 1
+2290	3720 1
+2290	3737 1
+2290	3745 1
+2290	3769 1
+2290	3772 1
+2290	3800 1
+2290	3803 1
+2290	3807 1
+2290	3809 1
+2290	3811 1
+2290	3812 1
+2290	3822 1
+2290	3843 1
+2290	3847 1
+2290	3849 1
+2290	3867 1
+2290	3887 1
+2290	3892 1
+2290	3903 1
+2290	3946 1
+2290	3970 1
+2290	3973 1
+2290	3980 1
+2290	4011 1
+2290	4021 1
+2290	4088 1
+2290	4110 1
+2290	4191 1
+2290	4384 1
+2290	4402 1
+2290	6055 1
+2290	8293 1
+2288	2290 1
+2289	1385 1
+2289	1888 1
+2289	1977 1
+2289	2237 1
+2289	2290 1
+2289	2364 1
+2289	2504 1
+2289	2669 1
+2289	2811 1
+2289	3117 1
+2289	3352 1
+2289	3568 1
+2289	4124 1
+2289	4876 1
+2291	1977 1
+2292	1977 1
+2265	1977 1
+2293	1888 1
+2293	1977 1
+2294	1977 1
+2294	2619 1
+2294	2625 1
+2294	2638 1
+2294	2665 1
+2294	2856 1
+2294	2990 1
+2294	5254 1
+2294	6229 1
+2295	1888 1
+2295	5963 1
+2296	214 1
+2296	1888 1
+2297	15 1
+2297	204 1
+2297	214 1
+2297	332 1
+2297	417 1
+2297	425 1
+2297	465 1
+2297	608 1
+2297	737 1
+2297	825 1
+2297	1166 1
+2297	1267 1
+2297	1297 1
+2297	1307 1
+2297	1315 1
+2297	1357 1
+2297	1374 1
+2297	1384 1
+2297	1416 1
+2297	1571 1
+2297	1633 1
+2297	1700 1
+2297	1723 1
+2297	1734 1
+2297	1754 1
+2297	1792 1
+2297	1814 1
+2297	1847 1
+2297	1888 1
+2297	1956 1
+2297	1990 1
+2297	2066 1
+2297	2072 1
+2297	2117 1
+2297	2134 1
+2297	2144 1
+2297	2145 1
+2297	2174 1
+2297	2193 1
+2297	2209 1
+2297	2210 1
+2297	2225 1
+2297	2240 1
+2297	2290 1
+2297	2328 1
+2297	2333 1
+2297	2338 1
+2297	2398 1
+2297	2440 1
+2297	2456 1
+2297	2474 1
+2297	2485 1
+2297	2504 1
+2297	2506 1
+2297	2508 1
+2297	2510 1
+2297	2535 1
+2297	2542 1
+2297	2547 1
+2297	2570 1
+2297	2594 1
+2297	2619 1
+2297	2625 1
+2297	2651 1
+2297	2654 1
+2297	2657 1
+2297	2660 1
+2297	2667 1
+2297	2685 1
+2297	2693 1
+2297	2727 1
+2297	2746 1
+2297	2774 1
+2297	2775 1
+2297	2794 1
+2297	2797 1
+2297	2801 1
+2297	2856 1
+2297	2859 1
+2297	2871 1
+2297	2958 1
+2297	3005 1
+2297	3009 1
+2297	3014 1
+2297	3020 1
+2297	3024 1
+2297	3026 1
+2297	3033 1
+2297	3034 1
+2297	3059 1
+2297	3089 1
+2297	3150 1
+2297	3192 1
+2297	3253 1
+2297	3258 1
+2297	3260 1
+2297	3265 1
+2297	3307 1
+2297	3338 1
+2297	3352 1
+2297	3435 1
+2297	3454 1
+2297	3456 1
+2297	3473 1
+2297	3489 1
+2297	3516 1
+2297	3529 1
+2297	3537 1
+2297	3562 1
+2297	3568 1
+2297	3576 1
+2297	3587 1
+2297	3607 1
+2297	3615 1
+2297	3650 1
+2297	3661 1
+2297	3770 1
+2297	3807 1
+2297	3926 1
+2297	3946 1
+2297	3976 1
+2297	4013 1
+2297	4021 1
+2297	4055 1
+2297	4099 1
+2297	4103 1
+2297	4124 1
+2297	4162 1
+2297	4179 1
+2297	4191 1
+2297	4233 1
+2297	4263 1
+2297	4269 1
+2297	4299 1
+2297	4338 1
+2297	4400 1
+2297	4453 1
+2297	4510 1
+2297	4528 1
+2297	4578 1
+2297	4604 1
+2297	4687 1
+2297	4706 1
+2297	4811 1
+2297	4981 1
+2297	4983 1
+2297	5055 1
+2297	5061 1
+2297	5412 1
+2297	5584 1
+2297	5714 1
+2297	5828 1
+2297	6337 1
+2297	6437 1
+2297	6442 1
+2297	6566 1
+2297	6914 1
+2297	6979 1
+2297	7168 1
+2297	7341 1
+2297	7587 1
+2297	7632 1
+2297	8209 1
+2297	8293 1
+2298	1012 1
+2298	1211 1
+2298	1385 1
+2298	1792 1
+2298	1837 1
+2298	1888 1
+2298	1964 1
+2298	2129 1
+2298	2289 1
+2298	2328 1
+2298	2501 1
+2298	2504 1
+2298	2535 1
+2298	2547 1
+2298	2560 1
+2298	2575 1
+2298	2646 1
+2298	2654 1
+2298	2794 1
+2298	2797 1
+2298	2900 1
+2298	2926 1
+2298	2932 1
+2298	2993 1
+2298	3028 1
+2298	3117 1
+2298	3144 1
+2298	3145 1
+2298	3235 1
+2298	3253 1
+2298	3276 1
+2298	3291 1
+2298	3352 1
+2298	3483 1
+2298	3660 1
+2298	3724 1
+2298	3806 1
+2298	4031 1
+2298	4199 1
+2298	4201 1
+2298	4231 1
+2298	4269 1
+2298	4289 1
+2298	4297 1
+2298	4349 1
+2298	4365 1
+2298	4417 1
+2298	4424 1
+2299	56 1
+2299	856 1
+2299	1390 1
+2299	1549 1
+2299	2120 1
+2299	2251 1
+2299	2256 1
+2299	2322 1
+2299	2328 1
+2299	2398 1
+2299	2410 1
+2299	2485 1
+2299	2547 1
+2299	2560 1
+2299	2565 1
+2299	2585 1
+2299	2619 1
+2299	2620 1
+2299	2625 1
+2299	2651 1
+2299	2665 1
+2299	2687 1
+2299	2700 1
+2299	2746 1
+2299	2754 1
+2299	2794 1
+2299	2809 1
+2299	2851 1
+2299	2909 1
+2299	2972 1
+2299	2999 1
+2299	3026 1
+2299	3030 1
+2299	3117 1
+2299	3251 1
+2299	3265 1
+2299	3351 1
+2299	3459 1
+2299	3541 1
+2299	3580 1
+2299	3615 1
+2299	3892 1
+2299	3903 1
+2299	4024 1
+2299	4044 1
+2299	4138 1
+2299	4448 1
+2299	4587 1
+2299	4824 1
+2299	5148 1
+2299	5215 1
+2299	5226 1
+2299	5246 1
+2299	5323 1
+2299	5714 1
+2299	5814 1
+2299	5827 1
+2299	5829 1
+2299	6032 1
+2299	6832 1
+2299	7021 1
+2299	7092 1
+2299	8083 1
+2299	8174 1
+2299	8178 1
+2299	8192 1
+2299	8294 1
+2300	1390 1
+2301	1390 1
+2302	1390 1
+2304	2305 1
+2307	2585 1
+2307	2746 1
+2307	3024 1
+2307	3117 1
+2307	3616 1
+2307	3650 1
+2307	4024 1
+2308	2285 1
+2310	2285 1
+2311	2285 1
+2312	2285 1
+2313	2285 1
+2314	1297 1
+2314	2285 1
+2314	8293 1
+2315	2285 1
+2309	2285 1
+2309	3321 1
+2309	8293 1
+2316	2285 1
+2316	5375 1
+2316	8293 1
+2317	2285 1
+2317	8293 1
+2318	2285 1
+2318	8293 1
+2319	2285 1
+2319	2325 1
+2319	8293 1
+2320	2285 1
+2320	8293 1
+2321	2285 1
+2321	5375 1
+2321	8293 1
+2322	332 1
+2322	1031 1
+2322	1297 1
+2322	1547 1
+2322	1621 1
+2322	1700 1
+2322	1835 1
+2322	1992 1
+2322	2182 1
+2322	2289 1
+2322	2350 1
+2322	2504 1
+2322	2619 1
+2322	2625 1
+2322	2643 1
+2322	2814 1
+2322	3645 1
+2322	4349 1
+2322	6227 1
+2323	15 1
+2323	72 1
+2323	204 1
+2323	290 1
+2323	346 1
+2323	417 1
+2323	608 1
+2323	737 1
+2323	827 1
+2323	959 1
+2323	1157 1
+2323	1243 1
+2323	1297 1
+2323	1307 1
+2323	1385 1
+2323	1492 1
+2323	1549 1
+2323	1571 1
+2323	1633 1
+2323	1729 1
+2323	1744 1
+2323	1777 1
+2323	1836 1
+2323	1847 1
+2323	1935 1
+2323	1984 1
+2323	1990 1
+2323	2066 1
+2323	2114 1
+2323	2174 1
+2323	2193 1
+2323	2210 1
+2323	2225 1
+2323	2240 1
+2323	2252 1
+2323	2297 1
+2323	2369 1
+2323	2398 1
+2323	2411 1
+2323	2416 1
+2323	2485 1
+2323	2516 1
+2323	2535 1
+2323	2565 1
+2323	2576 1
+2323	2580 1
+2323	2585 1
+2323	2594 1
+2323	2625 1
+2323	2651 1
+2323	2653 1
+2323	2654 1
+2323	2657 1
+2323	2660 1
+2323	2746 1
+2323	2747 1
+2323	2794 1
+2323	2815 1
+2323	2838 1
+2323	2859 1
+2323	2900 1
+2323	2923 1
+2323	2958 1
+2323	3005 1
+2323	3007 1
+2323	3014 1
+2323	3018 1
+2323	3020 1
+2323	3028 1
+2323	3103 1
+2323	3130 1
+2323	3243 1
+2323	3260 1
+2323	3352 1
+2323	3371 1
+2323	3443 1
+2323	3456 1
+2323	3480 1
+2323	3516 1
+2323	3541 1
+2323	3562 1
+2323	3580 1
+2323	3724 1
+2323	3803 1
+2323	3847 1
+2323	3871 1
+2323	3897 1
+2323	3926 1
+2323	3937 1
+2323	3942 1
+2323	3946 1
+2323	4011 1
+2323	4103 1
+2323	4179 1
+2323	4191 1
+2323	4385 1
+2323	4400 1
+2323	4510 1
+2323	4531 1
+2323	4687 1
+2323	4820 1
+2323	5079 1
+2323	5412 1
+2323	5415 1
+2323	5449 1
+2323	5799 1
+2323	5817 1
+2323	6255 1
+2323	7277 1
+2323	8294 1
+2323	8295 1
+2324	1565 1
+2324	2485 1
+2324	2535 1
+2326	204 1
+2326	285 1
+2326	417 1
+2326	608 1
+2326	762 1
+2326	825 1
+2326	827 1
+2326	974 1
+2326	1031 1
+2326	1100 1
+2326	1140 1
+2326	1157 1
+2326	1166 1
+2326	1239 1
+2326	1297 1
+2326	1307 1
+2326	1310 1
+2326	1385 1
+2326	1453 1
+2326	1549 1
+2326	1571 1
+2326	1621 1
+2326	1633 1
+2326	1688 1
+2326	1706 1
+2326	1729 1
+2326	1744 1
+2326	1769 1
+2326	1777 1
+2326	1935 1
+2326	1990 1
+2326	2016 1
+2326	2066 1
+2326	2114 1
+2326	2129 1
+2326	2134 1
+2326	2144 1
+2326	2145 1
+2326	2209 1
+2326	2210 1
+2326	2252 1
+2326	2257 1
+2326	2289 1
+2326	2290 1
+2326	2297 1
+2326	2307 1
+2326	2324 1
+2326	2325 1
+2326	2328 1
+2326	2329 1
+2326	2338 1
+2326	2339 1
+2326	2341 1
+2326	2348 1
+2326	2350 1
+2326	2356 1
+2326	2384 1
+2326	2398 1
+2326	2411 1
+2326	2416 1
+2326	2433 1
+2326	2485 1
+2326	2506 1
+2326	2508 1
+2326	2510 1
+2326	2516 1
+2326	2535 1
+2326	2542 1
+2326	2544 1
+2326	2565 1
+2326	2576 1
+2326	2585 1
+2326	2592 1
+2326	2594 1
+2326	2595 1
+2326	2597 1
+2326	2612 1
+2326	2619 1
+2326	2623 1
+2326	2646 1
+2326	2653 1
+2326	2654 1
+2326	2655 1
+2326	2657 1
+2326	2660 1
+2326	2667 1
+2326	2674 1
+2326	2686 1
+2326	2687 1
+2326	2693 1
+2326	2727 1
+2326	2746 1
+2326	2747 1
+2326	2790 1
+2326	2799 1
+2326	2819 1
+2326	2859 1
+2326	2871 1
+2326	2900 1
+2326	2918 1
+2326	2923 1
+2326	2932 1
+2326	2958 1
+2326	2973 1
+2326	2981 1
+2326	3005 1
+2326	3007 1
+2326	3009 1
+2326	3010 1
+2326	3020 1
+2326	3021 1
+2326	3024 1
+2326	3026 1
+2326	3028 1
+2326	3030 1
+2326	3059 1
+2326	3084 1
+2326	3114 1
+2326	3117 1
+2326	3148 1
+2326	3173 1
+2326	3180 1
+2326	3192 1
+2326	3200 1
+2326	3258 1
+2326	3260 1
+2326	3276 1
+2326	3291 1
+2326	3307 1
+2326	3313 1
+2326	3338 1
+2326	3346 1
+2326	3348 1
+2326	3351 1
+2326	3352 1
+2326	3371 1
+2326	3376 1
+2326	3404 1
+2326	3408 1
+2326	3435 1
+2326	3439 1
+2326	3443 1
+2326	3446 1
+2326	3455 1
+2326	3460 1
+2326	3473 1
+2326	3480 1
+2326	3483 1
+2326	3486 1
+2326	3489 1
+2326	3506 1
+2326	3516 1
+2326	3520 1
+2326	3529 1
+2326	3537 1
+2326	3538 1
+2326	3541 1
+2326	3548 1
+2326	3557 1
+2326	3562 1
+2326	3567 1
+2326	3568 1
+2326	3580 1
+2326	3587 1
+2326	3615 1
+2326	3616 1
+2326	3629 1
+2326	3631 1
+2326	3645 1
+2326	3646 1
+2326	3650 1
+2326	3660 1
+2326	3661 1
+2326	3670 1
+2326	3680 1
+2326	3681 1
+2326	3717 1
+2326	3720 1
+2326	3745 1
+2326	3769 1
+2326	3787 1
+2326	3800 1
+2326	3804 1
+2326	3807 1
+2326	3812 1
+2326	3813 1
+2326	3843 1
+2326	3847 1
+2326	3871 1
+2326	3887 1
+2326	3892 1
+2326	3898 1
+2326	3903 1
+2326	3921 1
+2326	3926 1
+2326	3933 1
+2326	3937 1
+2326	3967 1
+2326	3970 1
+2326	3976 1
+2326	4011 1
+2326	4013 1
+2326	4021 1
+2326	4024 1
+2326	4031 1
+2326	4043 1
+2326	4055 1
+2326	4058 1
+2326	4110 1
+2326	4117 1
+2326	4124 1
+2326	4138 1
+2326	4162 1
+2326	4173 1
+2326	4179 1
+2326	4181 1
+2326	4183 1
+2326	4188 1
+2326	4189 1
+2326	4191 1
+2326	4201 1
+2326	4233 1
+2326	4235 1
+2326	4247 1
+2326	4256 1
+2326	4263 1
+2326	4269 1
+2326	4290 1
+2326	4297 1
+2326	4298 1
+2326	4323 1
+2326	4349 1
+2326	4373 1
+2326	4384 1
+2326	4402 1
+2326	4411 1
+2326	4417 1
+2326	4424 1
+2326	4468 1
+2326	4480 1
+2326	4500 1
+2326	4578 1
+2326	4735 1
+2326	4811 1
+2326	4938 1
+2326	4962 1
+2326	5083 1
+2326	5092 1
+2326	5100 1
+2326	5106 1
+2326	8293 1
+2326	8294 1
+2328	332 1
+2328	350 1
+2328	403 1
+2328	465 1
+2328	722 1
+2328	744 1
+2328	765 1
+2328	825 1
+2328	859 1
+2328	947 1
+2328	959 1
+2328	968 1
+2328	974 1
+2328	978 1
+2328	1012 1
+2328	1018 1
+2328	1035 1
+2328	1049 1
+2328	1097 1
+2328	1166 1
+2328	1186 1
+2328	1211 1
+2328	1239 1
+2328	1297 1
+2328	1384 1
+2328	1492 1
+2328	1521 1
+2328	1547 1
+2328	1549 1
+2328	1564 1
+2328	1608 1
+2328	1621 1
+2328	1637 1
+2328	1646 1
+2328	1653 1
+2328	1700 1
+2328	1723 1
+2328	1808 1
+2328	1835 1
+2328	1836 1
+2328	1842 1
+2328	1847 1
+2328	1956 1
+2328	1964 1
+2328	1990 1
+2328	1992 1
+2328	2053 1
+2328	2062 1
+2328	2066 1
+2328	2076 1
+2328	2117 1
+2328	2120 1
+2328	2134 1
+2328	2160 1
+2328	2174 1
+2328	2193 1
+2328	2209 1
+2328	2210 1
+2328	2240 1
+2328	2252 1
+2328	2257 1
+2328	2264 1
+2328	2297 1
+2328	2322 1
+2328	2324 1
+2328	2329 1
+2328	2332 1
+2328	2341 1
+2328	2345 1
+2328	2350 1
+2328	2385 1
+2328	2397 1
+2328	2400 1
+2328	2410 1
+2328	2411 1
+2328	2435 1
+2328	2470 1
+2328	2475 1
+2328	2479 1
+2328	2485 1
+2328	2504 1
+2328	2506 1
+2328	2508 1
+2328	2510 1
+2328	2517 1
+2328	2535 1
+2328	2544 1
+2328	2547 1
+2328	2565 1
+2328	2570 1
+2328	2579 1
+2328	2585 1
+2328	2587 1
+2328	2593 1
+2328	2595 1
+2328	2597 1
+2328	2599 1
+2328	2604 1
+2328	2619 1
+2328	2620 1
+2328	2643 1
+2328	2652 1
+2328	2653 1
+2328	2654 1
+2328	2657 1
+2328	2660 1
+2328	2665 1
+2328	2667 1
+2328	2669 1
+2328	2685 1
+2328	2693 1
+2328	2707 1
+2328	2727 1
+2328	2746 1
+2328	2747 1
+2328	2754 1
+2328	2763 1
+2328	2768 1
+2328	2774 1
+2328	2781 1
+2328	2794 1
+2328	2805 1
+2328	2809 1
+2328	2814 1
+2328	2818 1
+2328	2821 1
+2328	2825 1
+2328	2834 1
+2328	2877 1
+2328	2932 1
+2328	2958 1
+2328	2973 1
+2328	2981 1
+2328	3005 1
+2328	3010 1
+2328	3014 1
+2328	3024 1
+2328	3026 1
+2328	3028 1
+2328	3034 1
+2328	3114 1
+2328	3148 1
+2328	3192 1
+2328	3258 1
+2328	3260 1
+2328	3291 1
+2328	3352 1
+2328	3394 1
+2328	3459 1
+2328	3479 1
+2328	3480 1
+2328	3529 1
+2328	3537 1
+2328	3562 1
+2328	3568 1
+2328	3587 1
+2328	3607 1
+2328	3615 1
+2328	3629 1
+2328	3650 1
+2328	3661 1
+2328	3670 1
+2328	3713 1
+2328	3769 1
+2328	3800 1
+2328	3892 1
+2328	3903 1
+2328	3926 1
+2328	3970 1
+2328	4021 1
+2328	4037 1
+2328	4043 1
+2328	4065 1
+2328	4099 1
+2328	4134 1
+2328	4162 1
+2328	4247 1
+2328	4256 1
+2328	4269 1
+2328	4323 1
+2328	4483 1
+2328	4604 1
+2328	4709 1
+2328	4712 1
+2328	4717 1
+2328	4791 1
+2328	4795 1
+2328	4994 1
+2328	5188 1
+2328	5524 1
+2328	5697 1
+2328	5714 1
+2328	5800 1
+2328	5806 1
+2328	5814 1
+2328	5822 1
+2328	5829 1
+2328	5902 1
+2328	6123 1
+2328	6296 1
+2328	6327 1
+2328	6347 1
+2328	6576 1
+2328	6665 1
+2328	6770 1
+2328	6774 1
+2328	6783 1
+2328	6832 1
+2328	7131 1
+2328	7400 1
+2328	7414 1
+2328	7553 1
+2328	8291 1
+2328	8293 1
+2328	8294 1
+2330	2333 1
+2330	6914 1
+1561	2333 1
+2331	2333 1
+2331	5714 1
+2332	633 1
+2332	968 1
+2332	1012 1
+2332	1018 1
+2332	1049 1
+2332	1250 1
+2332	1835 1
+2332	2116 1
+2332	2333 1
+2332	2411 1
+2332	2416 1
+2332	2589 1
+2332	2591 1
+2332	2594 1
+2332	2625 1
+2332	2651 1
+2332	2653 1
+2332	2657 1
+2332	2708 1
+2332	2754 1
+2332	2912 1
+2332	3018 1
+2332	3020 1
+2332	3251 1
+2332	3253 1
+2332	3319 1
+2332	3320 1
+2332	3324 1
+2332	3408 1
+2332	3409 1
+2332	3410 1
+2332	3429 1
+2332	3548 1
+2332	3556 1
+2332	3562 1
+2332	8293 1
+2334	2339 1
+2335	2339 1
+2336	2339 1
+2337	2339 1
+2340	56 1
+2340	2341 1
+2340	2593 1
+2340	2809 1
+2342	1211 1
+2342	1918 1
+2342	2345 1
+2342	2651 1
+2342	4191 1
+2343	1250 1
+2343	1992 1
+2343	2345 1
+2343	2589 1
+2343	2591 1
+2343	2643 1
+2343	2650 1
+2344	2345 1
+2349	2350 1
+2349	2625 1
+2351	1031 1
+2352	1031 1
+2352	3117 1
+2354	1031 1
+2353	1031 1
+2272	56 1
+2272	959 1
+2272	1031 1
+2272	1166 1
+2272	1211 1
+2272	1297 1
+2272	1492 1
+2272	1521 1
+2272	1633 1
+2272	1653 1
+2272	1700 1
+2272	1792 1
+2272	1992 1
+2272	2117 1
+2272	2120 1
+2272	2193 1
+2272	2225 1
+2272	2385 1
+2272	2398 1
+2272	2400 1
+2272	2576 1
+2272	2593 1
+2272	2619 1
+2272	2625 1
+2272	2643 1
+2272	2651 1
+2272	2654 1
+2272	2785 1
+2272	2877 1
+2272	3034 1
+2272	3089 1
+2357	947 1
+2357	1035 1
+2357	1267 1
+2357	1492 1
+2357	1521 1
+2357	1547 1
+2357	1700 1
+2357	1754 1
+2357	1964 1
+2357	2625 1
+2357	3755 1
+2357	8290 1
+2359	1621 1
+2359	3265 1
+2360	1621 1
+2360	2653 1
+2360	3005 1
+2361	2362 1
+2363	1035 1
+2363	1315 1
+2363	1393 1
+2363	2193 1
+2364	762 1
+2364	1035 1
+2364	1679 1
+2364	2290 1
+2364	2440 1
+2364	2660 1
+2364	2667 1
+2364	2819 1
+2364	2923 1
+2364	3538 1
+2364	3809 1
+2364	3885 1
+2364	4037 1
+2364	4424 1
+2365	15 1
+2365	762 1
+2365	856 1
+2365	1035 1
+2365	1297 1
+2365	1357 1
+2365	1453 1
+2365	1521 1
+2365	1571 1
+2365	1705 1
+2365	1706 1
+2365	1754 1
+2365	1792 1
+2365	1992 1
+2365	2053 1
+2365	2066 1
+2365	2174 1
+2365	2252 1
+2365	2256 1
+2365	2297 1
+2365	2328 1
+2365	2385 1
+2365	2411 1
+2365	2510 1
+2365	2593 1
+2365	2594 1
+2365	2599 1
+2365	2618 1
+2365	2646 1
+2365	2651 1
+2365	2657 1
+2365	2660 1
+2365	2665 1
+2365	2685 1
+2365	2727 1
+2365	2746 1
+2365	2754 1
+2365	2775 1
+2365	2801 1
+2365	2856 1
+2365	2859 1
+2365	2951 1
+2365	3005 1
+2365	3009 1
+2365	3020 1
+2365	3028 1
+2365	3030 1
+2365	3117 1
+2365	3180 1
+2365	3253 1
+2365	3260 1
+2365	3291 1
+2365	3443 1
+2365	3516 1
+2365	3580 1
+2365	3680 1
+2365	3812 1
+2365	3958 1
+2365	4013 1
+2365	4021 1
+2365	4031 1
+2365	4071 1
+2365	4099 1
+2365	4110 1
+2365	4510 1
+2365	4528 1
+2365	4530 1
+2365	4536 1
+2365	4719 1
+2365	4735 1
+2365	5285 1
+2365	5671 1
+2365	5721 1
+2365	5773 1
+2365	5775 1
+2365	5780 1
+2365	8002 1
+2366	1097 1
+2366	1374 1
+2366	1835 1
+2366	2625 1
+2366	2643 1
+2366	2665 1
+2366	2736 1
+2367	1097 1
+2367	2475 1
+2367	2579 1
+2367	2587 1
+2367	2593 1
+2367	2604 1
+2367	2625 1
+2367	2643 1
+2368	15 1
+2368	290 1
+2368	1097 1
+2368	2508 1
+2368	2560 1
+2368	2565 1
+2368	2594 1
+2368	2599 1
+2368	2760 1
+2368	3018 1
+2368	3021 1
+2368	3117 1
+2368	3307 1
+2368	3351 1
+2368	3352 1
+2368	3371 1
+2368	3443 1
+2338	1964 1
+2338	2323 1
+2338	2504 1
+2338	2508 1
+2338	2654 1
+2338	3348 1
+2369	15 1
+2369	332 1
+2369	737 1
+2369	840 1
+2369	896 1
+2369	1026 1
+2369	1352 1
+2369	1493 1
+2369	1799 1
+2369	1964 1
+2369	1982 1
+2369	2014 1
+2369	2160 1
+2369	2276 1
+2369	2354 1
+2369	2364 1
+2369	2398 1
+2369	2411 1
+2369	2552 1
+2369	2785 1
+2369	2787 1
+2369	2822 1
+2369	2909 1
+2369	3002 1
+2369	3106 1
+2369	3238 1
+2369	3334 1
+2369	3393 1
+2369	3417 1
+2369	3447 1
+2369	3456 1
+2369	3459 1
+2369	3498 1
+2369	3541 1
+2369	3554 1
+2369	3634 1
+2369	3643 1
+2369	3755 1
+2369	3796 1
+2369	3808 1
+2369	3813 1
+2369	3830 1
+2369	3897 1
+2369	3898 1
+2369	3910 1
+2369	3976 1
+2369	4037 1
+2369	4124 1
+2369	4191 1
+2369	4219 1
+2369	4276 1
+2369	4297 1
+2369	4310 1
+2369	4315 1
+2369	4401 1
+2369	4432 1
+2369	4448 1
+2369	4507 1
+2369	4530 1
+2369	4536 1
+2369	4547 1
+2369	4587 1
+2369	4712 1
+2369	4791 1
+2369	4795 1
+2369	4824 1
+2369	4828 1
+2369	4875 1
+2369	4929 1
+2369	4964 1
+2369	4977 1
+2369	4983 1
+2369	5020 1
+2369	5022 1
+2369	5037 1
+2369	5055 1
+2369	5079 1
+2369	5083 1
+2369	5123 1
+2369	5148 1
+2369	5176 1
+2369	5179 1
+2369	5182 1
+2369	5189 1
+2369	5208 1
+2369	5210 1
+2369	5215 1
+2369	5226 1
+2369	5231 1
+2369	5233 1
+2369	5254 1
+2369	5255 1
+2369	5303 1
+2369	5305 1
+2369	5321 1
+2369	5327 1
+2369	5375 1
+2369	5404 1
+2369	5412 1
+2369	5415 1
+2369	5452 1
+2369	5454 1
+2369	5457 1
+2369	5467 1
+2369	5484 1
+2369	5545 1
+2369	5563 1
+2369	5564 1
+2369	5584 1
+2369	5605 1
+2369	5624 1
+2369	5638 1
+2369	5664 1
+2369	5673 1
+2369	5680 1
+2369	5714 1
+2369	5739 1
+2369	5745 1
+2369	5775 1
+2369	5799 1
+2369	5811 1
+2369	5886 1
+2369	5902 1
+2369	5963 1
+2369	5977 1
+2369	6001 1
+2369	6041 1
+2369	6044 1
+2369	6107 1
+2369	6111 1
+2369	6156 1
+2369	6166 1
+2369	6227 1
+2369	6235 1
+2369	6306 1
+2369	6327 1
+2369	6328 1
+2369	6414 1
+2369	6447 1
+2369	6458 1
+2369	6523 1
+2369	6566 1
+2369	6571 1
+2369	6576 1
+2369	6596 1
+2369	6632 1
+2369	6634 1
+2369	6665 1
+2369	6720 1
+2369	6725 1
+2369	6736 1
+2369	6765 1
+2369	6789 1
+2369	6875 1
+2369	6955 1
+2369	7047 1
+2369	7050 1
+2369	7052 1
+2369	7088 1
+2369	7092 1
+2369	7116 1
+2369	7131 1
+2369	7146 1
+2369	7168 1
+2369	7214 1
+2369	7238 1
+2369	7279 1
+2369	7386 1
+2369	7389 1
+2369	7512 1
+2369	7553 1
+2369	7620 1
+2369	7632 1
+2369	7649 1
+2369	7666 1
+2369	7810 1
+2369	7839 1
+2369	7855 1
+2369	7860 1
+2369	7862 1
+2369	7871 1
+2369	7908 1
+2369	7924 1
+2369	7928 1
+2369	8002 1
+2369	8083 1
+2369	8212 1
+2369	8224 1
+2369	8295 1
+2370	1964 1
+2370	2484 1
+2371	214 1
+2371	722 1
+2371	762 1
+2371	856 1
+2371	959 1
+2371	1012 1
+2371	1166 1
+2371	1186 1
+2371	1211 1
+2371	1250 1
+2371	1267 1
+2371	1291 1
+2371	1297 1
+2371	1315 1
+2371	1357 1
+2371	1416 1
+2371	1437 1
+2371	1453 1
+2371	1492 1
+2371	1596 1
+2371	1705 1
+2371	1734 1
+2371	1754 1
+2371	1781 1
+2371	1792 1
+2371	1808 1
+2371	1814 1
+2371	1837 1
+2371	1847 1
+2371	1918 1
+2371	1919 1
+2371	1964 1
+2371	2053 1
+2371	2117 1
+2371	2174 1
+2371	2225 1
+2371	2251 1
+2371	2256 1
+2371	2264 1
+2371	2323 1
+2371	2324 1
+2371	2354 1
+2371	2375 1
+2371	2400 1
+2371	2411 1
+2371	2416 1
+2371	2426 1
+2371	2470 1
+2371	2485 1
+2371	2504 1
+2371	2517 1
+2371	2547 1
+2371	2550 1
+2371	2560 1
+2371	2565 1
+2371	2579 1
+2371	2587 1
+2371	2593 1
+2371	2625 1
+2371	2646 1
+2371	2653 1
+2371	2654 1
+2371	2657 1
+2371	2662 1
+2371	2696 1
+2371	2697 1
+2371	2707 1
+2371	2724 1
+2371	2815 1
+2371	2830 1
+2371	2856 1
+2371	2877 1
+2371	2880 1
+2371	2900 1
+2371	2902 1
+2371	2918 1
+2371	2922 1
+2371	2926 1
+2371	2955 1
+2371	2963 1
+2371	2968 1
+2371	2972 1
+2371	2973 1
+2371	2977 1
+2371	2979 1
+2371	2993 1
+2371	2996 1
+2371	2999 1
+2371	3007 1
+2371	3026 1
+2371	3029 1
+2371	3033 1
+2371	3034 1
+2371	3056 1
+2371	3059 1
+2371	3068 1
+2371	3080 1
+2371	3104 1
+2371	3117 1
+2371	3126 1
+2371	3140 1
+2371	3144 1
+2371	3150 1
+2371	3164 1
+2371	3173 1
+2371	3192 1
+2371	3235 1
+2371	3237 1
+2371	3516 1
+2371	3537 1
+2371	3634 1
+2371	3748 1
+2371	3796 1
+2371	3887 1
+2371	4124 1
+2371	4256 1
+2371	4323 1
+2371	4361 1
+2371	4653 1
+2371	4964 1
+2371	5412 1
+2371	5459 1
+2371	7561 1
+2371	7632 1
+2372	1700 1
+2372	1835 1
+2372	1964 1
+2372	2182 1
+2372	2470 1
+2372	2479 1
+2372	2517 1
+2374	1964 1
+2375	741 1
+2375	762 1
+2375	765 1
+2375	1018 1
+2375	1049 1
+2375	1157 1
+2375	1185 1
+2375	1186 1
+2375	1250 1
+2375	1384 1
+2375	1419 1
+2375	1521 1
+2375	1564 1
+2375	1608 1
+2375	1637 1
+2375	1653 1
+2375	1688 1
+2375	1918 1
+2375	1964 1
+2375	2066 1
+2375	2120 1
+2375	2240 1
+2375	2256 1
+2375	2470 1
+2375	2479 1
+2375	2504 1
+2375	2565 1
+2375	2579 1
+2375	2599 1
+2375	2612 1
+2375	2685 1
+2375	2828 1
+2375	2880 1
+2375	3192 1
+2375	3394 1
+2375	3724 1
+2375	4289 1
+2375	4331 1
+2375	4365 1
+2375	4384 1
+2375	4500 1
+2375	4528 1
+2375	4712 1
+2375	4875 1
+2375	5233 1
+2375	5415 1
+2375	5568 1
+2375	6004 1
+2375	6441 1
+2376	290 1
+2376	1374 1
+2376	1964 1
+2376	2066 1
+2376	2237 1
+2376	2240 1
+2376	2398 1
+2376	2474 1
+2376	2535 1
+2376	2594 1
+2376	2620 1
+2376	3005 1
+2376	3024 1
+2376	3117 1
+2376	3755 1
+2376	4191 1
+2376	5233 1
+2376	5262 1
+2376	5482 1
+2376	5822 1
+2376	6006 1
+2376	6218 1
+2376	6437 1
+2376	6441 1
+2376	6774 1
+2376	8246 1
+2378	2062 1
+2378	2400 1
+2378	2504 1
+2378	2571 1
+2381	762 1
+2381	1297 1
+2381	1385 1
+2381	1549 1
+2381	1680 1
+2381	1956 1
+2381	2062 1
+2381	2066 1
+2381	2117 1
+2381	2252 1
+2381	2297 1
+2381	2323 1
+2381	2398 1
+2381	2508 1
+2381	2516 1
+2381	2535 1
+2381	2570 1
+2381	2625 1
+2381	2643 1
+2381	2651 1
+2381	2790 1
+2381	3007 1
+2381	3034 1
+2381	3089 1
+2381	3192 1
+2381	3334 1
+2381	3352 1
+2381	3394 1
+2381	3443 1
+2381	3456 1
+2381	3459 1
+2381	3479 1
+2381	3607 1
+2381	3631 1
+2381	3720 1
+2381	3892 1
+2381	3976 1
+2381	4013 1
+2381	4037 1
+2381	4110 1
+2381	4191 1
+2381	4201 1
+2381	4247 1
+2381	4269 1
+2381	4315 1
+2381	4335 1
+2381	4453 1
+2381	4547 1
+2381	4687 1
+2381	4735 1
+2381	4875 1
+2381	4977 1
+2381	5020 1
+2381	5079 1
+2381	5254 1
+2381	5449 1
+2381	5452 1
+2381	5697 1
+2381	5721 1
+2381	5743 1
+2381	5799 1
+2381	6330 1
+2381	6400 1
+2381	6498 1
+2381	6613 1
+2381	6665 1
+2381	6720 1
+2381	6833 1
+2381	7961 1
+2381	8292 1
+2381	8294 1
+2379	762 1
+2379	1307 1
+2379	1688 1
+2379	1744 1
+2379	1777 1
+2379	2062 1
+2379	2114 1
+2379	2134 1
+2379	2257 1
+2379	2328 1
+2379	2397 1
+2379	2411 1
+2379	2485 1
+2379	2516 1
+2379	2565 1
+2379	2859 1
+2379	2900 1
+2379	2923 1
+2379	2932 1
+2379	2958 1
+2379	2981 1
+2379	3005 1
+2379	3099 1
+2379	3192 1
+2379	3200 1
+2379	3291 1
+2379	3480 1
+2379	3483 1
+2379	3541 1
+2379	3615 1
+2379	3631 1
+2379	3772 1
+2379	3787 1
+2379	4013 1
+2379	4110 1
+2379	4162 1
+2379	4179 1
+2379	4201 1
+2379	4233 1
+2379	4247 1
+2379	4269 1
+2379	4480 1
+2379	4552 1
+2379	4557 1
+2379	5631 1
+2380	2062 1
+2382	1297 1
+2384	15 1
+2384	72 1
+2384	1166 1
+2384	1315 1
+2384	1385 1
+2384	1416 1
+2384	2237 1
+2384	2256 1
+2384	2328 1
+2384	2354 1
+2384	2371 1
+2384	2385 1
+2384	2398 1
+2384	2416 1
+2384	2511 1
+2384	2516 1
+2384	2565 1
+2384	2625 1
+2384	2760 1
+2384	2822 1
+2384	2871 1
+2384	2909 1
+2384	3007 1
+2384	3028 1
+2384	3192 1
+2384	3238 1
+2384	3291 1
+2384	3321 1
+2384	3417 1
+2384	3435 1
+2384	3443 1
+2384	3498 1
+2384	3516 1
+2384	3631 1
+2384	3787 1
+2384	3796 1
+2384	3871 1
+2384	3976 1
+2384	4037 1
+2384	4099 1
+2384	4201 1
+2384	4233 1
+2384	4247 1
+2384	4289 1
+2384	4536 1
+2384	4600 1
+2384	4687 1
+2384	4781 1
+2384	4797 1
+2384	4828 1
+2384	4999 1
+2384	5022 1
+2384	5061 1
+2384	5079 1
+2384	5106 1
+2384	5162 1
+2384	5226 1
+2384	5341 1
+2384	5459 1
+2384	5482 1
+2384	5511 1
+2384	5637 1
+2384	5651 1
+2384	5693 1
+2384	5753 1
+2384	5775 1
+2384	5790 1
+2384	6029 1
+2384	6624 1
+2384	7694 1
+2384	7946 1
+2384	8293 1
+2387	72 1
+2387	737 1
+2387	762 1
+2387	1648 1
+2387	1680 1
+2387	2193 1
+2387	2354 1
+2387	2398 1
+2387	2470 1
+2387	2775 1
+2387	2822 1
+2387	2909 1
+2387	3014 1
+2387	3089 1
+2387	3274 1
+2387	3417 1
+2387	3456 1
+2387	3460 1
+2387	3554 1
+2387	3643 1
+2387	3724 1
+2387	3796 1
+2387	3897 1
+2387	3910 1
+2387	3958 1
+2387	4098 1
+2387	4276 1
+2387	4315 1
+2387	4335 1
+2387	4400 1
+2387	4448 1
+2387	4574 1
+2387	4587 1
+2387	4600 1
+2387	4653 1
+2387	4712 1
+2387	4828 1
+2387	4846 1
+2387	4875 1
+2387	4964 1
+2387	5061 1
+2387	5189 1
+2387	5204 1
+2387	5226 1
+2387	5239 1
+2387	5263 1
+2387	5341 1
+2387	5354 1
+2387	5392 1
+2387	5404 1
+2387	5412 1
+2387	5430 1
+2387	5449 1
+2387	5511 1
+2387	5527 1
+2387	5559 1
+2387	5780 1
+2387	5848 1
+2387	5886 1
+2387	5925 1
+2387	5936 1
+2387	5994 1
+2387	6148 1
+2387	7143 1
+2387	7144 1
+2387	7561 1
+2388	2193 1
+2389	2193 1
+2390	2193 1
+2390	2506 1
+2392	2397 1
+2391	2397 1
+2394	2397 1
+2395	2397 1
+2396	2397 1
+2393	1836 1
+2393	2332 1
+2393	2397 1
+2393	2484 1
+2398	72 1
+2398	465 1
+2398	968 1
+2398	974 1
+2398	1012 1
+2398	1250 1
+2398	1549 1
+2398	1571 1
+2398	1706 1
+2398	1734 1
+2398	1847 1
+2398	2144 1
+2398	2209 1
+2398	2210 1
+2398	2297 1
+2398	2326 1
+2398	2400 1
+2398	2504 1
+2398	2506 1
+2398	2516 1
+2398	2585 1
+2398	2597 1
+2398	2619 1
+2398	2625 1
+2398	2638 1
+2398	2651 1
+2398	2655 1
+2398	2660 1
+2398	2686 1
+2398	2746 1
+2398	2790 1
+2398	2871 1
+2398	3024 1
+2398	3026 1
+2398	3084 1
+2398	3117 1
+2398	3130 1
+2398	3180 1
+2398	3260 1
+2398	3352 1
+2398	3443 1
+2398	3454 1
+2398	3516 1
+2398	3555 1
+2398	3580 1
+2398	3609 1
+2398	3650 1
+2398	3720 1
+2398	3800 1
+2398	3892 1
+2398	3903 1
+2398	3926 1
+2398	3937 1
+2398	3970 1
+2398	3976 1
+2398	4191 1
+2398	4528 1
+2398	4578 1
+2398	4735 1
+2398	4811 1
+2398	5412 1
+2398	8293 1
+2399	1700 1
+2399	2400 1
+2401	1323 1
+2402	1100 1
+2402	1323 1
+2403	1842 1
+2403	2542 1
+2404	1842 1
+2405	1842 1
+2406	1842 1
+2406	2356 1
+2407	332 1
+2407	722 1
+2407	1608 1
+2407	1842 1
+2410	15 1
+2410	737 1
+2410	1492 1
+2410	1700 1
+2410	1799 1
+2410	2507 1
+2410	2576 1
+2410	2794 1
+2410	2825 1
+2410	3027 1
+2410	3456 1
+2410	3586 1
+2410	3962 1
+2410	4071 1
+2410	4098 1
+2410	4310 1
+2410	4400 1
+2410	4929 1
+2410	5079 1
+2410	5178 1
+2410	5392 1
+2410	5412 1
+2410	5415 1
+2410	5459 1
+2410	5524 1
+2410	5539 1
+2410	5721 1
+2410	5743 1
+2410	5994 1
+2410	6151 1
+2410	6414 1
+2410	7632 1
+2410	7839 1
+2410	7910 1
+2306	1049 1
+2306	1492 1
+2306	2504 1
+2306	2643 1
+2411	417 1
+2411	465 1
+2411	825 1
+2411	974 1
+2411	1140 1
+2411	1166 1
+2411	1297 1
+2411	1385 1
+2411	1419 1
+2411	1453 1
+2411	1492 1
+2411	1571 1
+2411	1596 1
+2411	1633 1
+2411	1680 1
+2411	1700 1
+2411	1754 1
+2411	1777 1
+2411	1915 1
+2411	1918 1
+2411	1919 1
+2411	1935 1
+2411	1990 1
+2411	1992 1
+2411	2016 1
+2411	2066 1
+2411	2114 1
+2411	2120 1
+2411	2129 1
+2411	2144 1
+2411	2209 1
+2411	2210 1
+2411	2251 1
+2411	2252 1
+2411	2256 1
+2411	2290 1
+2411	2307 1
+2411	2325 1
+2411	2375 1
+2411	2433 1
+2411	2474 1
+2411	2510 1
+2411	2535 1
+2411	2544 1
+2411	2560 1
+2411	2576 1
+2411	2585 1
+2411	2595 1
+2411	2653 1
+2411	2654 1
+2411	2657 1
+2411	2660 1
+2411	2667 1
+2411	2674 1
+2411	2686 1
+2411	2687 1
+2411	2708 1
+2411	2713 1
+2411	2724 1
+2411	2727 1
+2411	2746 1
+2411	2777 1
+2411	2790 1
+2411	2794 1
+2411	2797 1
+2411	2799 1
+2411	2809 1
+2411	2859 1
+2411	2900 1
+2411	2955 1
+2411	2958 1
+2411	2974 1
+2411	3005 1
+2411	3014 1
+2411	3024 1
+2411	3028 1
+2411	3029 1
+2411	3030 1
+2411	3034 1
+2411	3050 1
+2411	3084 1
+2411	3089 1
+2411	3104 1
+2411	3117 1
+2411	3126 1
+2411	3140 1
+2411	3148 1
+2411	3253 1
+2411	3291 1
+2411	3307 1
+2411	3319 1
+2411	3324 1
+2411	3338 1
+2411	3376 1
+2411	3408 1
+2411	3439 1
+2411	3446 1
+2411	3473 1
+2411	3483 1
+2411	3486 1
+2411	3489 1
+2411	3506 1
+2411	3529 1
+2411	3537 1
+2411	3538 1
+2411	3548 1
+2411	3580 1
+2411	3587 1
+2411	3609 1
+2411	3615 1
+2411	3635 1
+2411	3645 1
+2411	3650 1
+2411	3669 1
+2411	3680 1
+2411	3681 1
+2411	3772 1
+2411	3893 1
+2411	3898 1
+2411	3967 1
+2411	4011 1
+2411	4021 1
+2411	4024 1
+2411	4051 1
+2411	4110 1
+2411	4124 1
+2411	4218 1
+2411	4231 1
+2411	4233 1
+2411	4247 1
+2411	4299 1
+2411	4323 1
+2411	4386 1
+2411	4412 1
+2411	4500 1
+2411	4531 1
+2411	4547 1
+2411	5484 1
+2411	7304 1
+2411	8293 1
+2411	8294 1
+2412	1492 1
+2412	2504 1
+2412	6243 1
+2413	1492 1
+2413	2747 1
+2414	1700 1
+2414	1865 1
+2414	1956 1
+2414	2625 1
+2414	2643 1
+2414	6788 1
+2416	332 1
+2416	762 1
+2416	1012 1
+2416	1018 1
+2416	1211 1
+2416	1291 1
+2416	1633 1
+2416	1723 1
+2416	1835 1
+2416	2120 1
+2416	2323 1
+2416	2375 1
+2416	2426 1
+2416	2580 1
+2416	2647 1
+2416	2708 1
+2416	2721 1
+2416	2763 1
+2416	2781 1
+2416	2902 1
+2416	2926 1
+2416	2946 1
+2416	2966 1
+2416	2968 1
+2416	2993 1
+2416	3029 1
+2416	3068 1
+2416	3080 1
+2416	3099 1
+2416	3150 1
+2416	3251 1
+2416	3276 1
+2416	3338 1
+2416	3348 1
+2416	3371 1
+2416	3587 1
+2416	8291 1
+2417	290 1
+2417	332 1
+2417	2643 1
+2417	2721 1
+2417	2991 1
+2417	6628 1
+2417	7168 1
+2418	332 1
+2113	1154 1
+2113	2420 1
+2113	2625 1
+2113	2685 1
+2113	2880 1
+2113	4072 1
+2113	7561 1
+2419	2420 1
+2424	2425 1
+2428	859 1
+2429	859 1
+2429	2323 1
+2427	859 1
+2427	1608 1
+2427	2237 1
+2427	2240 1
+2427	2416 1
+2427	2470 1
+2427	2629 1
+2427	2880 1
+2427	3479 1
+2427	4687 1
+2427	6417 1
+2435	56 1
+2435	1211 1
+2435	1297 1
+2435	1374 1
+2435	1564 1
+2435	1592 1
+2435	1633 1
+2435	1637 1
+2435	1646 1
+2435	1723 1
+2435	1956 1
+2435	1992 1
+2435	2117 1
+2435	2174 1
+2435	2231 1
+2435	2240 1
+2435	2256 1
+2435	2340 1
+2435	2490 1
+2435	2587 1
+2435	2594 1
+2435	2618 1
+2435	2625 1
+2435	2654 1
+2435	2657 1
+2435	2754 1
+2435	2770 1
+2435	2781 1
+2435	2794 1
+2435	2801 1
+2435	2809 1
+2435	2900 1
+2435	3030 1
+2435	3034 1
+2435	3089 1
+2433	2435 1
+2433	3439 1
+2434	2435 1
+2434	2963 1
+2437	2470 1
+2437	4687 1
+2373	2135 1
+2373	2470 1
+2438	2470 1
+2462	1250 1
+2462	1608 1
+2462	2182 1
+2462	2470 1
+2463	2470 1
+2439	2470 1
+2440	15 1
+2440	465 1
+2440	737 1
+2440	896 1
+2440	1982 1
+2440	2237 1
+2440	2257 1
+2440	2470 1
+2440	2654 1
+2440	3007 1
+2440	3026 1
+2440	3034 1
+2440	3084 1
+2440	3238 1
+2440	3321 1
+2440	3334 1
+2440	3352 1
+2440	3456 1
+2440	3643 1
+2440	3664 1
+2440	3892 1
+2440	3962 1
+2440	3976 1
+2440	4099 1
+2440	4191 1
+2440	4261 1
+2440	4400 1
+2440	4646 1
+2440	4687 1
+2440	4712 1
+2440	4735 1
+2440	4827 1
+2440	4828 1
+2440	4875 1
+2440	4981 1
+2440	5210 1
+2440	5335 1
+2440	5412 1
+2440	5584 1
+2440	5605 1
+2440	5760 1
+2440	5819 1
+2440	6111 1
+2440	6414 1
+2440	6699 1
+2440	6918 1
+2440	7050 1
+2440	7620 1
+2440	7908 1
+2440	7927 1
+2441	2470 1
+2442	2470 1
+2443	2470 1
+2444	2237 1
+2444	2384 1
+2444	2470 1
+2444	4037 1
+2444	4600 1
+2444	5022 1
+2445	2470 1
+2446	2470 1
+2094	2470 1
+2447	2470 1
+2448	2470 1
+2449	2470 1
+2450	2470 1
+2451	2470 1
+2451	4687 1
+2452	1026 1
+2452	1982 1
+2452	2470 1
+2452	4037 1
+2452	4341 1
+2452	4361 1
+2452	4401 1
+2452	4875 1
+2452	5079 1
+2452	5179 1
+2452	5233 1
+2452	5378 1
+2452	5432 1
+2452	5800 1
+2452	5811 1
+2452	5814 1
+2452	5839 1
+2452	5902 1
+2452	6123 1
+2452	6280 1
+2452	6417 1
+2452	6555 1
+2452	6772 1
+2452	6784 1
+2452	6832 1
+2452	7005 1
+2452	7047 1
+2452	7050 1
+2452	7116 1
+2452	7225 1
+2452	7351 1
+2452	7393 1
+2452	7414 1
+2452	7553 1
+2452	7587 1
+2452	7632 1
+2452	7662 1
+2452	7683 1
+2452	7701 1
+2452	7924 1
+2452	8044 1
+2452	8174 1
+2453	2470 1
+2454	2470 1
+2455	2470 1
+2456	72 1
+2456	2285 1
+2456	2440 1
+2456	2470 1
+2456	2504 1
+2456	3238 1
+2456	3498 1
+2456	3607 1
+2456	3842 1
+2456	3873 1
+2456	4037 1
+2456	4531 1
+2456	4689 1
+2456	4735 1
+2456	4781 1
+2456	4981 1
+2456	4983 1
+2456	5028 1
+2456	5273 1
+2456	5671 1
+2456	5760 1
+2456	6414 1
+2456	6437 1
+2456	6458 1
+2456	6570 1
+2456	6576 1
+2456	6589 1
+2456	6770 1
+2456	7115 1
+2456	7624 1
+2456	7912 1
+2465	2470 1
+2457	2470 1
+2466	2470 1
+2458	2237 1
+2458	2470 1
+2458	5210 1
+2458	5902 1
+2458	6442 1
+2458	6600 1
+2459	2470 1
+2460	2470 1
+2461	2470 1
+2475	3026 1
+2475	4261 1
+2471	2475 1
+2472	56 1
+2472	214 1
+2472	350 1
+2472	633 1
+2472	765 1
+2472	856 1
+2472	1049 1
+2472	1154 1
+2472	1267 1
+2472	1315 1
+2472	1357 1
+2472	1393 1
+2472	1416 1
+2472	1419 1
+2472	1437 1
+2472	1521 1
+2472	1549 1
+2472	1592 1
+2472	1637 1
+2472	1705 1
+2472	1723 1
+2472	1734 1
+2472	1754 1
+2472	1781 1
+2472	1808 1
+2472	1918 1
+2472	2076 1
+2472	2102 1
+2472	2116 1
+2472	2120 1
+2472	2174 1
+2472	2225 1
+2472	2237 1
+2472	2264 1
+2472	2322 1
+2472	2323 1
+2472	2375 1
+2472	2470 1
+2472	2475 1
+2472	2547 1
+2472	2550 1
+2472	2560 1
+2472	2593 1
+2472	2599 1
+2472	2618 1
+2472	2662 1
+2472	2685 1
+2472	2697 1
+2472	2707 1
+2472	2713 1
+2472	2754 1
+2472	2763 1
+2472	2768 1
+2472	2770 1
+2472	2805 1
+2472	2809 1
+2472	2814 1
+2472	2815 1
+2472	2828 1
+2472	2830 1
+2472	2834 1
+2472	2877 1
+2472	2922 1
+2472	2946 1
+2472	2955 1
+2472	2963 1
+2472	2999 1
+2472	3089 1
+2472	3099 1
+2472	3117 1
+2472	3150 1
+2472	3164 1
+2472	3251 1
+2472	8291 1
+2472	8293 1
+2473	290 1
+2473	350 1
+2473	403 1
+2473	633 1
+2473	765 1
+2473	856 1
+2473	1049 1
+2473	1267 1
+2473	1291 1
+2473	1315 1
+2473	1374 1
+2473	1384 1
+2473	1393 1
+2473	1419 1
+2473	1521 1
+2473	1596 1
+2473	1637 1
+2473	1646 1
+2473	1653 1
+2473	1688 1
+2473	1705 1
+2473	1723 1
+2473	1734 1
+2473	1754 1
+2473	1781 1
+2473	1792 1
+2473	1808 1
+2473	1814 1
+2473	1847 1
+2473	1918 1
+2473	1919 1
+2473	1956 1
+2473	1992 1
+2473	2102 1
+2473	2116 1
+2473	2117 1
+2473	2120 1
+2473	2135 1
+2473	2174 1
+2473	2225 1
+2473	2251 1
+2473	2256 1
+2473	2264 1
+2473	2322 1
+2473	2371 1
+2473	2375 1
+2473	2410 1
+2473	2416 1
+2473	2475 1
+2473	2547 1
+2473	2560 1
+2473	2593 1
+2473	2599 1
+2473	2625 1
+2473	2662 1
+2473	2669 1
+2473	2685 1
+2473	2697 1
+2473	2707 1
+2473	2713 1
+2473	2721 1
+2473	2724 1
+2473	2751 1
+2473	2754 1
+2473	2763 1
+2473	2768 1
+2473	2794 1
+2473	2805 1
+2473	2809 1
+2473	2814 1
+2473	2815 1
+2473	2818 1
+2473	2821 1
+2473	2825 1
+2473	2828 1
+2473	2830 1
+2473	2834 1
+2473	2856 1
+2473	2900 1
+2473	2902 1
+2473	2918 1
+2473	2922 1
+2473	2926 1
+2473	2955 1
+2473	2963 1
+2473	2968 1
+2473	2979 1
+2473	2993 1
+2473	2999 1
+2473	3029 1
+2473	3033 1
+2473	3050 1
+2473	3056 1
+2473	3068 1
+2473	3099 1
+2473	3126 1
+2473	3145 1
+2473	3251 1
+2473	3253 1
+2473	3812 1
+2473	4528 1
+2473	4531 1
+2473	8291 1
+2476	290 1
+2476	1291 1
+2476	1357 1
+2476	1416 1
+2476	1705 1
+2476	1734 1
+2476	1754 1
+2476	1919 1
+2476	2225 1
+2476	2264 1
+2476	2323 1
+2476	2411 1
+2476	2416 1
+2476	2479 1
+2476	2550 1
+2476	2593 1
+2476	2617 1
+2476	2707 1
+2476	2724 1
+2476	2815 1
+2476	2830 1
+2476	2856 1
+2476	2900 1
+2476	2918 1
+2476	2968 1
+2476	2999 1
+2476	3029 1
+2476	3033 1
+2476	3034 1
+2476	3056 1
+2476	3068 1
+2476	3099 1
+2476	3140 1
+2476	3145 1
+2476	3150 1
+2477	2479 1
+2478	2120 1
+2478	2252 1
+2478	2479 1
+2478	2499 1
+2478	2650 1
+2478	8292 1
+2480	1608 1
+2480	2369 1
+2480	3320 1
+2480	4315 1
+2480	4536 1
+2480	4735 1
+2480	5936 1
+2481	155 1
+2481	1608 1
+2481	3293 1
+2481	4536 1
+2481	4632 1
+2481	6634 1
+2481	6955 1
+2481	7649 1
+2482	1250 1
+2482	1608 1
+2482	2570 1
+2485	204 1
+2485	290 1
+2485	417 1
+2485	465 1
+2485	737 1
+2485	762 1
+2485	765 1
+2485	825 1
+2485	856 1
+2485	896 1
+2485	974 1
+2485	1166 1
+2485	1185 1
+2485	1239 1
+2485	1267 1
+2485	1291 1
+2485	1307 1
+2485	1315 1
+2485	1357 1
+2485	1360 1
+2485	1393 1
+2485	1403 1
+2485	1453 1
+2485	1473 1
+2485	1549 1
+2485	1571 1
+2485	1596 1
+2485	1637 1
+2485	1648 1
+2485	1688 1
+2485	1705 1
+2485	1723 1
+2485	1729 1
+2485	1754 1
+2485	1769 1
+2485	1792 1
+2485	1808 1
+2485	1982 1
+2485	1984 1
+2485	1990 1
+2485	2014 1
+2485	2016 1
+2485	2066 1
+2485	2114 1
+2485	2116 1
+2485	2120 1
+2485	2135 1
+2485	2145 1
+2485	2174 1
+2485	2225 1
+2485	2237 1
+2485	2256 1
+2485	2257 1
+2485	2289 1
+2485	2297 1
+2485	2323 1
+2485	2325 1
+2485	2328 1
+2485	2364 1
+2485	2371 1
+2485	2375 1
+2485	2384 1
+2485	2398 1
+2485	2411 1
+2485	2433 1
+2485	2456 1
+2485	2484 1
+2485	2506 1
+2485	2508 1
+2485	2510 1
+2485	2511 1
+2485	2542 1
+2485	2547 1
+2485	2550 1
+2485	2560 1
+2485	2565 1
+2485	2576 1
+2485	2585 1
+2485	2593 1
+2485	2594 1
+2485	2595 1
+2485	2597 1
+2485	2605 1
+2485	2619 1
+2485	2625 1
+2485	2646 1
+2485	2647 1
+2485	2653 1
+2485	2654 1
+2485	2655 1
+2485	2657 1
+2485	2660 1
+2485	2667 1
+2485	2674 1
+2485	2686 1
+2485	2696 1
+2485	2700 1
+2485	2713 1
+2485	2727 1
+2485	2746 1
+2485	2747 1
+2485	2819 1
+2485	2830 1
+2485	2831 1
+2485	2856 1
+2485	2871 1
+2485	2877 1
+2485	2900 1
+2485	2902 1
+2485	2909 1
+2485	2918 1
+2485	2923 1
+2485	2928 1
+2485	2940 1
+2485	2955 1
+2485	2958 1
+2485	2966 1
+2485	2972 1
+2485	2993 1
+2485	3005 1
+2485	3007 1
+2485	3009 1
+2485	3010 1
+2485	3014 1
+2485	3018 1
+2485	3020 1
+2485	3024 1
+2485	3026 1
+2485	3027 1
+2485	3028 1
+2485	3029 1
+2485	3034 1
+2485	3056 1
+2485	3059 1
+2485	3073 1
+2485	3089 1
+2485	3103 1
+2485	3114 1
+2485	3117 1
+2485	3125 1
+2485	3144 1
+2485	3145 1
+2485	3148 1
+2485	3164 1
+2485	3173 1
+2485	3192 1
+2485	3238 1
+2485	3243 1
+2485	3258 1
+2485	3260 1
+2485	3274 1
+2485	3309 1
+2485	3319 1
+2485	3321 1
+2485	3324 1
+2485	3351 1
+2485	3352 1
+2485	3371 1
+2485	3393 1
+2485	3404 1
+2485	3409 1
+2485	3417 1
+2485	3443 1
+2485	3452 1
+2485	3458 1
+2485	3459 1
+2485	3473 1
+2485	3480 1
+2485	3489 1
+2485	3498 1
+2485	3516 1
+2485	3529 1
+2485	3537 1
+2485	3557 1
+2485	3562 1
+2485	3568 1
+2485	3580 1
+2485	3587 1
+2485	3615 1
+2485	3645 1
+2485	3650 1
+2485	3660 1
+2485	3680 1
+2485	3748 1
+2485	3752 1
+2485	3796 1
+2485	3800 1
+2485	3854 1
+2485	3873 1
+2485	3892 1
+2485	3897 1
+2485	3903 1
+2485	3970 1
+2485	4011 1
+2485	4013 1
+2485	4037 1
+2485	4040 1
+2485	4055 1
+2485	4071 1
+2485	4099 1
+2485	4124 1
+2485	4162 1
+2485	4175 1
+2485	4179 1
+2485	4181 1
+2485	4191 1
+2485	4212 1
+2485	4247 1
+2485	4256 1
+2485	4266 1
+2485	4290 1
+2485	4338 1
+2485	4361 1
+2485	4384 1
+2485	4432 1
+2485	4485 1
+2485	4510 1
+2485	4536 1
+2485	4574 1
+2485	4578 1
+2485	4600 1
+2485	4613 1
+2485	4653 1
+2485	4666 1
+2485	4712 1
+2485	4781 1
+2485	4814 1
+2485	4827 1
+2485	4828 1
+2485	4899 1
+2485	4938 1
+2485	4964 1
+2485	4977 1
+2485	5002 1
+2485	5020 1
+2485	5022 1
+2485	5026 1
+2485	5028 1
+2485	5061 1
+2485	5096 1
+2485	5100 1
+2485	5103 1
+2485	5106 1
+2485	5144 1
+2485	5178 1
+2485	5189 1
+2485	5233 1
+2485	5254 1
+2485	5289 1
+2485	5323 1
+2485	5404 1
+2485	5412 1
+2485	5430 1
+2485	5445 1
+2485	5452 1
+2485	5454 1
+2485	5459 1
+2485	5482 1
+2485	5484 1
+2485	5506 1
+2485	5509 1
+2485	5529 1
+2485	5543 1
+2485	5584 1
+2485	5637 1
+2485	5640 1
+2485	5651 1
+2485	5683 1
+2485	5693 1
+2485	5721 1
+2485	5790 1
+2485	5804 1
+2485	5806 1
+2485	5818 1
+2485	5872 1
+2485	5902 1
+2485	5922 1
+2485	5925 1
+2485	5932 1
+2485	6032 1
+2485	6043 1
+2485	6123 1
+2485	6124 1
+2485	6148 1
+2485	6151 1
+2485	6227 1
+2485	6229 1
+2485	6327 1
+2485	6347 1
+2485	6417 1
+2485	6523 1
+2485	6560 1
+2485	6600 1
+2485	6780 1
+2485	6832 1
+2485	6875 1
+2485	6897 1
+2485	6914 1
+2485	6934 1
+2485	6976 1
+2485	7092 1
+2485	7351 1
+2485	7400 1
+2485	7422 1
+2485	7478 1
+2485	7510 1
+2485	7561 1
+2485	7620 1
+2485	7624 1
+2485	7649 1
+2485	7795 1
+2485	7809 1
+2485	7833 1
+2485	7855 1
+2485	7862 1
+2485	7890 1
+2485	7927 1
+2485	7961 1
+2485	7965 1
+2485	8163 1
+2485	8174 1
+2485	8192 1
+2485	8212 1
+2485	8295 1
+2487	2240 1
+2488	825 1
+2488	1166 1
+2488	1633 1
+2488	1769 1
+2488	1919 1
+2488	2102 1
+2488	2120 1
+2488	2144 1
+2488	2145 1
+2488	2240 1
+2488	2328 1
+2488	2625 1
+2488	2912 1
+2488	3018 1
+2488	3607 1
+2488	3873 1
+2488	3892 1
+2488	4072 1
+2488	4201 1
+2488	4646 1
+2488	4827 1
+2489	2490 1
+2491	2182 1
+2492	2182 1
+2493	2182 1
+2493	3291 1
+2493	3634 1
+2493	4748 1
+2493	6474 1
+2493	6505 1
+2494	2182 1
+2495	2182 1
+2496	2182 1
+2496	4261 1
+2497	1166 1
+2497	1211 1
+2497	1744 1
+2497	1814 1
+2497	2117 1
+2497	2120 1
+2497	2174 1
+2497	2225 1
+2497	2256 1
+2497	2297 1
+2497	2485 1
+2497	2499 1
+2497	2501 1
+2497	2510 1
+2497	2593 1
+2497	2594 1
+2497	2625 1
+2497	2657 1
+2497	2662 1
+2497	2685 1
+2497	2693 1
+2497	2720 1
+2497	3010 1
+2497	3050 1
+2497	3089 1
+2497	3104 1
+2497	3193 1
+2497	3255 1
+2497	3258 1
+2497	3265 1
+2497	3324 1
+2497	3489 1
+2497	3529 1
+2497	3547 1
+2497	3548 1
+2497	3629 1
+2497	3745 1
+2497	3772 1
+2500	2501 1
+2500	2591 1
+2500	2629 1
+2502	214 1
+2502	1018 1
+2502	1186 1
+2502	1549 1
+2502	1835 1
+2502	2174 1
+2502	2297 1
+2502	2323 1
+2502	2506 1
+2502	2542 1
+2502	2576 1
+2502	2655 1
+2502	2660 1
+2502	2770 1
+2502	2918 1
+2502	3002 1
+2502	3018 1
+2502	3408 1
+2502	3459 1
+2502	4110 1
+2502	5210 1
+2502	5254 1
+2502	5773 1
+2502	5828 1
+2502	6634 1
+2502	6833 1
+2502	7054 1
+2502	7115 1
+2502	8141 1
+2502	8178 1
+2503	1835 1
+2503	2607 1
+2504	15 1
+2504	737 1
+2504	762 1
+2504	825 1
+2504	1185 1
+2504	1453 1
+2504	1769 1
+2504	1799 1
+2504	1835 1
+2504	2066 1
+2504	2144 1
+2504	2252 1
+2504	2256 1
+2504	2297 1
+2504	2323 1
+2504	2328 1
+2504	2338 1
+2504	2354 1
+2504	2364 1
+2504	2381 1
+2504	2398 1
+2504	2508 1
+2504	2542 1
+2504	2544 1
+2504	2547 1
+2504	2576 1
+2504	2585 1
+2504	2605 1
+2504	2619 1
+2504	2655 1
+2504	2660 1
+2504	2775 1
+2504	2794 1
+2504	2830 1
+2504	2940 1
+2504	3002 1
+2504	3009 1
+2504	3020 1
+2504	3034 1
+2504	3050 1
+2504	3068 1
+2504	3084 1
+2504	3092 1
+2504	3117 1
+2504	3443 1
+2504	3452 1
+2504	3454 1
+2504	3456 1
+2504	3568 1
+2504	3607 1
+2504	3650 1
+2504	3720 1
+2504	3800 1
+2504	3843 1
+2504	3892 1
+2504	3903 1
+2504	3926 1
+2504	3956 1
+2504	3971 1
+2504	4024 1
+2504	4037 1
+2504	4043 1
+2504	4099 1
+2504	4191 1
+2504	4256 1
+2504	4263 1
+2504	4400 1
+2504	4485 1
+2504	4827 1
+2504	4846 1
+2504	4875 1
+2504	4953 1
+2504	4962 1
+2504	4981 1
+2504	4999 1
+2504	5079 1
+2504	5092 1
+2504	5189 1
+2504	5233 1
+2504	5412 1
+2504	5449 1
+2504	5484 1
+2504	5527 1
+2504	5828 1
+2504	5886 1
+2504	6006 1
+2504	6094 1
+2504	6123 1
+2504	6124 1
+2504	6156 1
+2504	6296 1
+2504	6560 1
+2504	6770 1
+2504	6918 1
+2504	7092 1
+2504	7839 1
+2504	7908 1
+2504	7924 1
+2504	8174 1
+2504	8296 1
+2505	1835 1
+2506	350 1
+2506	1186 1
+2506	1706 1
+2506	1835 1
+2506	2016 1
+2506	2066 1
+2506	2145 1
+2506	2251 1
+2506	2323 1
+2506	2474 1
+2506	2535 1
+2506	2657 1
+2506	2658 1
+2506	2727 1
+2506	2774 1
+2506	2859 1
+2506	2871 1
+2506	2932 1
+2506	3014 1
+2506	3443 1
+2506	3479 1
+2506	3480 1
+2506	3541 1
+2506	3631 1
+2506	3892 1
+2506	4011 1
+2506	4013 1
+2506	4055 1
+2506	4124 1
+2506	4289 1
+2506	4412 1
+2506	4510 1
+2506	4983 1
+2506	5055 1
+2506	5200 1
+2506	5208 1
+2506	5311 1
+2506	6306 1
+2506	6347 1
+2506	6422 1
+2506	6634 1
+2506	6759 1
+2506	6979 1
+2506	7778 1
+2506	7860 1
+2506	7979 1
+2507	15 1
+2507	633 1
+2507	765 1
+2507	1297 1
+2507	1352 1
+2507	1357 1
+2507	1393 1
+2507	1416 1
+2507	1633 1
+2507	1646 1
+2507	1781 1
+2507	1814 1
+2507	1835 1
+2507	1847 1
+2507	1919 1
+2507	1992 1
+2507	2102 1
+2507	2116 1
+2507	2117 1
+2507	2120 1
+2507	2135 1
+2507	2225 1
+2507	2231 1
+2507	2264 1
+2507	2322 1
+2507	2324 1
+2507	2325 1
+2507	2356 1
+2507	2375 1
+2507	2410 1
+2507	2474 1
+2507	2504 1
+2507	2510 1
+2507	2576 1
+2507	2593 1
+2507	2594 1
+2507	2617 1
+2507	2625 1
+2507	2651 1
+2507	2693 1
+2507	2713 1
+2507	2724 1
+2507	2794 1
+2507	2805 1
+2507	2828 1
+2507	2834 1
+2507	2844 1
+2507	2856 1
+2507	2912 1
+2507	2928 1
+2507	2955 1
+2507	2963 1
+2507	2973 1
+2507	3005 1
+2507	3015 1
+2507	3021 1
+2507	3033 1
+2507	3034 1
+2507	3251 1
+2507	3253 1
+2507	3265 1
+2507	3307 1
+2507	3351 1
+2507	3408 1
+2507	5254 1
+2507	5262 1
+2507	5445 1
+2507	5624 1
+2507	6164 1
+2508	214 1
+2508	290 1
+2508	1374 1
+2508	1835 1
+2508	2323 1
+2508	2470 1
+2508	2542 1
+2508	2625 1
+2508	2669 1
+2508	3562 1
+2508	3892 1
+2508	5083 1
+2508	6004 1
+2509	1374 1
+2509	1384 1
+2509	1835 1
+2509	2340 1
+2509	2619 1
+2509	2625 1
+2509	2638 1
+2509	2685 1
+2509	2720 1
+2509	2770 1
+2509	2801 1
+2510	403 1
+2510	765 1
+2510	1166 1
+2510	1186 1
+2510	1250 1
+2510	1267 1
+2510	1297 1
+2510	1416 1
+2510	1437 1
+2510	1633 1
+2510	1648 1
+2510	1653 1
+2510	1792 1
+2510	1808 1
+2510	1814 1
+2510	1847 1
+2510	1992 1
+2510	2102 1
+2510	2117 1
+2510	2120 1
+2510	2134 1
+2510	2174 1
+2510	2231 1
+2510	2294 1
+2510	2328 1
+2510	2371 1
+2510	2410 1
+2510	2474 1
+2510	2485 1
+2510	2504 1
+2510	2542 1
+2510	2565 1
+2510	2587 1
+2510	2593 1
+2510	2594 1
+2510	2617 1
+2510	2625 1
+2510	2651 1
+2510	2654 1
+2510	2660 1
+2510	2674 1
+2510	2693 1
+2510	2700 1
+2510	2707 1
+2510	2727 1
+2510	2754 1
+2510	2794 1
+2510	2801 1
+2510	2805 1
+2510	2828 1
+2510	2834 1
+2510	2999 1
+2510	3005 1
+2510	3030 1
+2510	3034 1
+2510	3130 1
+2510	3253 1
+2510	3265 1
+2510	3276 1
+2510	3394 1
+2510	3404 1
+2510	3489 1
+2510	3516 1
+2510	3529 1
+2510	3557 1
+2510	4124 1
+2510	4256 1
+2510	5412 1
+2511	1018 1
+2511	1026 1
+2511	3084 1
+2511	3238 1
+2511	6241 1
+2511	7647 1
+2511	7649 1
+2511	7688 1
+2517	1310 1
+2517	1918 1
+2517	2117 1
+2517	2120 1
+2517	2996 1
+2512	2517 1
+2514	2517 1
+2513	2517 1
+2515	2517 1
+2516	2517 1
+2516	2576 1
+2516	2579 1
+2516	2587 1
+2516	2605 1
+2516	2657 1
+2516	2912 1
+2516	3026 1
+2516	3265 1
+2516	3456 1
+2516	3479 1
+2516	3664 1
+2516	3680 1
+2516	3792 1
+2516	3892 1
+2516	3976 1
+2516	4574 1
+2516	4706 1
+2516	4808 1
+2516	4875 1
+2516	5037 1
+2516	5130 1
+2516	5245 1
+2516	5273 1
+2516	5459 1
+2516	5463 1
+2516	5605 1
+2516	5683 1
+2516	5697 1
+2516	5743 1
+2516	5814 1
+2516	5827 1
+2516	5844 1
+2516	5863 1
+2516	5926 1
+2516	5931 1
+2516	5947 1
+2516	6009 1
+2516	6481 1
+2516	6532 1
+2516	6589 1
+2516	6634 1
+2516	8128 1
+2516	8295 1
+2518	1186 1
+2518	2510 1
+2518	3024 1
+2518	7115 1
+2519	1186 1
+2355	1186 1
+2520	1186 1
+2530	1186 1
+2531	1186 1
+2531	2256 1
+2521	1186 1
+2522	1186 1
+2523	968 1
+2523	1186 1
+2523	2999 1
+2523	4175 1
+2523	7890 1
+2534	1186 1
+2526	1186 1
+2527	1186 1
+2527	2625 1
+2528	1186 1
+2535	15 1
+2535	204 1
+2535	1186 1
+2535	1453 1
+2535	1549 1
+2535	2066 1
+2535	2145 1
+2535	2160 1
+2535	2240 1
+2535	2326 1
+2535	2354 1
+2535	2381 1
+2535	2775 1
+2535	2790 1
+2535	2805 1
+2535	2981 1
+2535	3103 1
+2535	3309 1
+2535	3352 1
+2535	3443 1
+2535	3454 1
+2535	3456 1
+2535	3458 1
+2535	3607 1
+2535	3643 1
+2535	3897 1
+2535	3976 1
+2535	4040 1
+2535	4044 1
+2535	4098 1
+2535	4219 1
+2535	4233 1
+2535	4335 1
+2535	4480 1
+2535	4808 1
+2535	5020 1
+2535	5100 1
+2535	5123 1
+2535	5254 1
+2535	5335 1
+2535	5375 1
+2535	5412 1
+2535	5683 1
+2535	5817 1
+2535	6156 1
+2535	6832 1
+2535	8293 1
+2536	1186 1
+2537	1186 1
+2538	1186 1
+2529	1186 1
+2540	1186 1
+1181	1186 1
+2541	204 1
+2541	290 1
+2541	762 1
+2541	974 1
+2541	1211 1
+2541	1297 1
+2541	1549 1
+2541	1754 1
+2541	1918 1
+2541	2144 1
+2541	2251 1
+2541	2256 1
+2541	2323 1
+2541	2398 1
+2541	2504 1
+2541	2617 1
+2541	2625 1
+2541	2651 1
+2541	2708 1
+2541	2724 1
+2541	2799 1
+2541	2818 1
+2541	2821 1
+2541	2926 1
+2541	2963 1
+2541	2991 1
+2541	3029 1
+2541	3050 1
+2541	3068 1
+2541	3082 1
+2541	3089 1
+2541	3099 1
+2541	3307 1
+2541	3348 1
+2541	3408 1
+2541	3946 1
+2541	8293 1
+2542	72 1
+2542	204 1
+2542	403 1
+2542	417 1
+2542	765 1
+2542	1100 1
+2542	1267 1
+2542	1297 1
+2542	1307 1
+2542	1453 1
+2542	1549 1
+2542	1637 1
+2542	1723 1
+2542	1956 1
+2542	1990 1
+2542	2016 1
+2542	2066 1
+2542	2102 1
+2542	2120 1
+2542	2145 1
+2542	2174 1
+2542	2225 1
+2542	2231 1
+2542	2252 1
+2542	2264 1
+2542	2290 1
+2542	2297 1
+2542	2323 1
+2542	2328 1
+2542	2356 1
+2542	2398 1
+2542	2456 1
+2542	2504 1
+2542	2508 1
+2542	2576 1
+2542	2597 1
+2542	2599 1
+2542	2623 1
+2542	2660 1
+2542	2693 1
+2542	2707 1
+2542	2746 1
+2542	2768 1
+2542	2787 1
+2542	2805 1
+2542	2819 1
+2542	2828 1
+2542	2834 1
+2542	2859 1
+2542	2871 1
+2542	2968 1
+2542	3018 1
+2542	3021 1
+2542	3028 1
+2542	3260 1
+2542	3291 1
+2542	3301 1
+2542	3371 1
+2542	3408 1
+2542	3435 1
+2542	3443 1
+2542	3473 1
+2542	3580 1
+2542	3587 1
+2542	3804 1
+2542	3812 1
+2542	3847 1
+2542	3871 1
+2542	3903 1
+2542	3926 1
+2542	3946 1
+2542	3976 1
+2542	4013 1
+2542	4138 1
+2542	4175 1
+2542	4191 1
+2542	4233 1
+2542	4247 1
+2542	4261 1
+2542	4338 1
+2542	4361 1
+2542	4463 1
+2542	4510 1
+2542	4604 1
+2542	4687 1
+2542	4735 1
+2542	4981 1
+2542	5584 1
+2542	5714 1
+2542	5828 1
+2542	5902 1
+2542	6229 1
+2542	8294 1
+2543	2504 1
+2498	2504 1
+2545	2504 1
+2545	2508 1
+2545	3026 1
+2545	3480 1
+2545	5671 1
+2545	6437 1
+2545	6458 1
+2546	968 1
+2546	1357 1
+2546	1416 1
+2546	1419 1
+2546	1549 1
+2546	1633 1
+2546	1734 1
+2546	1956 1
+2546	2066 1
+2546	2102 1
+2546	2145 1
+2546	2174 1
+2546	2297 1
+2546	2322 1
+2546	2338 1
+2546	2340 1
+2546	2504 1
+2546	2542 1
+2546	2570 1
+2546	2576 1
+2546	2579 1
+2546	2638 1
+2546	2654 1
+2546	2660 1
+2546	2665 1
+2546	2674 1
+2546	2693 1
+2546	2794 1
+2546	2801 1
+2546	2828 1
+2546	2900 1
+2546	3034 1
+2546	3443 1
+2546	3567 1
+2547	204 1
+2547	762 1
+2547	1357 1
+2547	1437 1
+2547	1549 1
+2547	1596 1
+2547	1679 1
+2547	1777 1
+2547	1792 1
+2547	1808 1
+2547	2209 1
+2547	2290 1
+2547	2297 1
+2547	2325 1
+2547	2328 1
+2547	2371 1
+2547	2398 1
+2547	2411 1
+2547	2440 1
+2547	2474 1
+2547	2485 1
+2547	2504 1
+2547	2542 1
+2547	2560 1
+2547	2576 1
+2547	2625 1
+2547	2646 1
+2547	2653 1
+2547	2654 1
+2547	2660 1
+2547	2662 1
+2547	2667 1
+2547	2674 1
+2547	2687 1
+2547	2724 1
+2547	2768 1
+2547	2777 1
+2547	2790 1
+2547	2794 1
+2547	2797 1
+2547	2799 1
+2547	2819 1
+2547	2900 1
+2547	2912 1
+2547	2914 1
+2547	2946 1
+2547	2972 1
+2547	2991 1
+2547	2993 1
+2547	2996 1
+2547	3014 1
+2547	3034 1
+2547	3050 1
+2547	3056 1
+2547	3068 1
+2547	3089 1
+2547	3099 1
+2547	3126 1
+2547	3150 1
+2547	3235 1
+2547	3253 1
+2547	3276 1
+2547	3352 1
+2547	3439 1
+2547	3443 1
+2547	3516 1
+2547	3557 1
+2547	3580 1
+2547	3587 1
+2547	3650 1
+2547	3976 1
+2547	4021 1
+2547	4124 1
+2547	4199 1
+2547	4266 1
+2547	4297 1
+2547	4349 1
+2547	4402 1
+2547	4453 1
+2547	4662 1
+2547	4687 1
+2547	4706 1
+2547	4715 1
+2547	4719 1
+2547	4735 1
+2547	4798 1
+2547	4811 1
+2547	4875 1
+2547	5072 1
+2547	5073 1
+2547	5487 1
+2547	5524 1
+2547	5543 1
+2547	5638 1
+2547	6098 1
+2547	6337 1
+2547	6407 1
+2547	6435 1
+2547	6481 1
+2547	6566 1
+2547	6699 1
+2547	7115 1
+2547	8293 1
+2547	8294 1
+2547	8295 1
+2548	1847 1
+2548	2117 1
+2548	2144 1
+2548	2504 1
+2548	2585 1
+2548	2646 1
+2548	2657 1
+2548	2794 1
+2548	2923 1
+2548	3005 1
+2548	3568 1
+2548	3645 1
+2549	290 1
+2549	762 1
+2549	1211 1
+2549	1357 1
+2549	1648 1
+2549	1734 1
+2549	1754 1
+2549	1808 1
+2549	1918 1
+2549	1919 1
+2549	1956 1
+2549	2251 1
+2549	2256 1
+2549	2323 1
+2549	2371 1
+2549	2474 1
+2549	2504 1
+2549	2510 1
+2549	2565 1
+2549	2576 1
+2549	2585 1
+2549	2593 1
+2549	2727 1
+2549	2746 1
+2549	2877 1
+2549	2923 1
+2549	2932 1
+2549	2955 1
+2549	2958 1
+2549	2963 1
+2549	3002 1
+2549	3005 1
+2549	3007 1
+2549	3024 1
+2549	3029 1
+2549	3033 1
+2549	3117 1
+2549	3238 1
+2549	3615 1
+2549	3650 1
+2549	3752 1
+2549	3812 1
+2549	3937 1
+2549	4037 1
+2549	4482 1
+2549	4531 1
+2549	4536 1
+2549	4587 1
+2549	4777 1
+2549	4797 1
+2549	4814 1
+2549	4929 1
+2549	5022 1
+2549	5079 1
+2549	5263 1
+2549	5301 1
+2549	5412 1
+2549	5459 1
+2549	5527 1
+2549	5651 1
+2549	5743 1
+2549	5773 1
+2549	5784 1
+2549	5790 1
+2549	5828 1
+2549	5928 1
+2549	6914 1
+2549	7092 1
+2549	7131 1
+2549	7803 1
+2550	765 1
+2550	1357 1
+2550	1416 1
+2550	1437 1
+2550	1549 1
+2550	1717 1
+2550	1956 1
+2550	2116 1
+2550	2174 1
+2550	2233 1
+2550	2264 1
+2550	2371 1
+2550	2501 1
+2550	2504 1
+2550	2579 1
+2550	2589 1
+2550	2591 1
+2550	2697 1
+2550	2794 1
+2550	2797 1
+2550	2834 1
+2550	2902 1
+2550	2918 1
+2550	3164 1
+2550	3171 1
+2550	8291 1
+2552	2504 1
+2552	4828 1
+2552	6094 1
+2552	6124 1
+2552	7005 1
+2551	1211 1
+2551	2504 1
+899	403 1
+899	1592 1
+899	1637 1
+899	1646 1
+899	1653 1
+899	1723 1
+899	1956 1
+899	2120 1
+899	2225 1
+899	2410 1
+899	2618 1
+899	2754 1
+899	2768 1
+899	2777 1
+899	2794 1
+899	2801 1
+899	2805 1
+899	2809 1
+899	2814 1
+899	2818 1
+899	2821 1
+899	2828 1
+899	2834 1
+899	8292 1
+2555	765 1
+2555	1653 1
+2555	1956 1
+2555	2102 1
+2555	2120 1
+2555	2322 1
+2555	2410 1
+2555	2794 1
+2555	2801 1
+2555	2809 1
+2555	2828 1
+2555	8292 1
+2556	1956 1
+2566	15 1
+2566	762 1
+2566	1374 1
+2566	1549 1
+2566	1792 1
+2566	1956 1
+2566	2066 1
+2566	2102 1
+2566	2354 1
+2566	2535 1
+2566	2595 1
+2566	2654 1
+2566	2660 1
+2566	2674 1
+2566	2900 1
+2566	2972 1
+2566	3320 1
+2566	3348 1
+2566	3394 1
+2566	3479 1
+2566	3529 1
+2566	3562 1
+2566	3843 1
+2566	4138 1
+2566	4191 1
+2566	4201 1
+2566	4335 1
+2566	4712 1
+2566	4994 1
+2566	5130 1
+2566	6464 1
+2566	8292 1
+2557	56 1
+2557	214 1
+2557	403 1
+2557	765 1
+2557	1154 1
+2557	1310 1
+2557	1315 1
+2557	1419 1
+2557	1596 1
+2557	1637 1
+2557	1646 1
+2557	1705 1
+2557	1723 1
+2557	1769 1
+2557	1918 1
+2557	1956 1
+2557	2053 1
+2557	2102 1
+2557	2120 1
+2557	2174 1
+2557	2264 1
+2557	2322 1
+2557	2323 1
+2557	2340 1
+2557	2411 1
+2557	2416 1
+2557	2470 1
+2557	2547 1
+2557	2560 1
+2557	2599 1
+2557	2618 1
+2557	2707 1
+2557	2763 1
+2557	2768 1
+2557	2770 1
+2557	2777 1
+2557	2781 1
+2557	2785 1
+2557	2794 1
+2557	2797 1
+2557	2801 1
+2557	2805 1
+2557	2809 1
+2557	2814 1
+2557	2815 1
+2557	2828 1
+2557	2834 1
+2557	2871 1
+2557	2877 1
+2557	2880 1
+2557	2918 1
+2557	2922 1
+2557	2955 1
+2557	2963 1
+2557	2966 1
+2557	2972 1
+2557	2977 1
+2557	2979 1
+2557	2996 1
+2557	2999 1
+2557	3014 1
+2557	3276 1
+2557	3443 1
+2557	3607 1
+2557	3643 1
+2557	3854 1
+2557	3898 1
+2557	3958 1
+2557	4220 1
+2557	4298 1
+2557	4551 1
+2557	4613 1
+2557	4792 1
+2557	4953 1
+2557	4999 1
+2557	8290 1
+2557	8292 1
+2469	350 1
+2469	1956 1
+2469	2794 1
+2567	15 1
+2567	1211 1
+2567	1956 1
+2567	2398 1
+2567	8292 1
+2558	1956 1
+2558	3020 1
+2559	214 1
+2559	290 1
+2559	403 1
+2559	417 1
+2559	633 1
+2559	762 1
+2559	765 1
+2559	974 1
+2559	1166 1
+2559	1211 1
+2559	1291 1
+2559	1297 1
+2559	1385 1
+2559	1729 1
+2559	1734 1
+2559	1744 1
+2559	1754 1
+2559	1792 1
+2559	1814 1
+2559	1847 1
+2559	1956 1
+2559	1961 1
+2559	2053 1
+2559	2066 1
+2559	2120 1
+2559	2225 1
+2559	2252 1
+2559	2256 1
+2559	2289 1
+2559	2290 1
+2559	2324 1
+2559	2356 1
+2559	2398 1
+2559	2411 1
+2559	2470 1
+2559	2508 1
+2559	2510 1
+2559	2542 1
+2559	2565 1
+2559	2617 1
+2559	2625 1
+2559	2651 1
+2559	2654 1
+2559	2662 1
+2559	2674 1
+2559	2721 1
+2559	2785 1
+2559	2794 1
+2559	2805 1
+2559	2809 1
+2559	2828 1
+2559	2856 1
+2559	2859 1
+2559	2951 1
+2559	2958 1
+2559	2968 1
+2559	3029 1
+2559	3034 1
+2559	3117 1
+2559	3140 1
+2559	3148 1
+2559	3173 1
+2559	3253 1
+2559	3307 1
+2559	3371 1
+2559	3394 1
+2559	3516 1
+2559	3562 1
+2559	3568 1
+2559	3580 1
+2559	3629 1
+2559	3680 1
+2559	4051 1
+2559	4110 1
+2559	4201 1
+2559	4290 1
+2559	4365 1
+2559	4384 1
+2559	4453 1
+2559	4463 1
+2559	8292 1
+2559	8294 1
+2560	204 1
+2560	290 1
+2560	346 1
+2560	417 1
+2560	825 1
+2560	827 1
+2560	856 1
+2560	1024 1
+2560	1026 1
+2560	1157 1
+2560	1211 1
+2560	1239 1
+2560	1291 1
+2560	1297 1
+2560	1305 1
+2560	1307 1
+2560	1360 1
+2560	1549 1
+2560	1571 1
+2560	1596 1
+2560	1744 1
+2560	1754 1
+2560	1777 1
+2560	1915 1
+2560	1956 1
+2560	2016 1
+2560	2066 1
+2560	2114 1
+2560	2129 1
+2560	2144 1
+2560	2210 1
+2560	2231 1
+2560	2252 1
+2560	2256 1
+2560	2323 1
+2560	2324 1
+2560	2340 1
+2560	2398 1
+2560	2411 1
+2560	2485 1
+2560	2508 1
+2560	2565 1
+2560	2593 1
+2560	2595 1
+2560	2597 1
+2560	2617 1
+2560	2619 1
+2560	2646 1
+2560	2653 1
+2560	2654 1
+2560	2655 1
+2560	2686 1
+2560	2708 1
+2560	2727 1
+2560	2794 1
+2560	2799 1
+2560	2809 1
+2560	2859 1
+2560	2912 1
+2560	2917 1
+2560	2918 1
+2560	2923 1
+2560	2926 1
+2560	2951 1
+2560	2963 1
+2560	2968 1
+2560	2972 1
+2560	2979 1
+2560	2993 1
+2560	2996 1
+2560	2999 1
+2560	3009 1
+2560	3024 1
+2560	3034 1
+2560	3050 1
+2560	3056 1
+2560	3073 1
+2560	3084 1
+2560	3089 1
+2560	3099 1
+2560	3114 1
+2560	3140 1
+2560	3145 1
+2560	3164 1
+2560	3173 1
+2560	3180 1
+2560	3238 1
+2560	3253 1
+2560	3276 1
+2560	3291 1
+2560	3310 1
+2560	3346 1
+2560	3394 1
+2560	3417 1
+2560	3439 1
+2560	3473 1
+2560	3480 1
+2560	3506 1
+2560	3516 1
+2560	3520 1
+2560	3537 1
+2560	3557 1
+2560	3567 1
+2560	3580 1
+2560	3615 1
+2560	3646 1
+2560	3650 1
+2560	3661 1
+2560	3670 1
+2560	3681 1
+2560	3717 1
+2560	3770 1
+2560	3803 1
+2560	3812 1
+2560	3843 1
+2560	3847 1
+2560	3926 1
+2560	3937 1
+2560	3949 1
+2560	3967 1
+2560	4012 1
+2560	4021 1
+2560	4044 1
+2560	4138 1
+2560	4189 1
+2560	4191 1
+2560	4201 1
+2560	4233 1
+2560	4256 1
+2560	4289 1
+2560	4290 1
+2560	4298 1
+2560	4311 1
+2560	4323 1
+2560	4341 1
+2560	4365 1
+2560	4384 1
+2560	4507 1
+2560	4706 1
+2560	4811 1
+2560	4999 1
+2560	5096 1
+2560	5148 1
+2560	5341 1
+2560	5406 1
+2560	5671 1
+2560	6043 1
+2560	6320 1
+2560	6330 1
+2560	6422 1
+2560	6523 1
+2560	6560 1
+2560	6665 1
+2560	6918 1
+2560	6980 1
+2560	7052 1
+2560	7059 1
+2560	7277 1
+2560	7400 1
+2560	7443 1
+2560	7544 1
+2560	7587 1
+2560	7647 1
+2560	7648 1
+2560	7649 1
+2560	7651 1
+2560	7652 1
+2560	7694 1
+2560	7695 1
+2560	7699 1
+2560	7707 1
+2560	7726 1
+2560	7778 1
+2560	7788 1
+2560	7795 1
+2560	7803 1
+2560	7809 1
+2560	7813 1
+2560	7965 1
+2560	8293 1
+2561	1956 1
+2561	2809 1
+2562	1956 1
+2562	5254 1
+2563	1956 1
+2563	2777 1
+2564	15 1
+2564	72 1
+2564	204 1
+2564	608 1
+2564	737 1
+2564	974 1
+2564	1315 1
+2564	1352 1
+2564	1473 1
+2564	1799 1
+2564	1956 1
+2564	2066 1
+2564	2134 1
+2564	2237 1
+2564	2324 1
+2564	2456 1
+2564	2508 1
+2564	2576 1
+2564	2657 1
+2564	2660 1
+2564	2693 1
+2564	2940 1
+2564	2981 1
+2564	3027 1
+2564	3164 1
+2564	3371 1
+2564	3456 1
+2564	3537 1
+2564	3635 1
+2564	3680 1
+2564	3720 1
+2564	3830 1
+2564	4099 1
+2564	4191 1
+2564	4247 1
+2564	4297 1
+2564	4338 1
+2564	4712 1
+2564	4953 1
+2564	5239 1
+2564	5637 1
+2564	5714 1
+2564	5848 1
+2564	6328 1
+2564	6337 1
+2564	6437 1
+2564	6442 1
+2564	6600 1
+2564	6833 1
+2564	6897 1
+2565	56 1
+2565	155 1
+2565	204 1
+2565	214 1
+2565	285 1
+2565	290 1
+2565	346 1
+2565	403 1
+2565	417 1
+2565	425 1
+2565	465 1
+2565	633 1
+2565	737 1
+2565	762 1
+2565	765 1
+2565	825 1
+2565	827 1
+2565	840 1
+2565	856 1
+2565	938 1
+2565	967 1
+2565	974 1
+2565	1024 1
+2565	1026 1
+2565	1100 1
+2565	1154 1
+2565	1157 1
+2565	1166 1
+2565	1185 1
+2565	1191 1
+2565	1211 1
+2565	1239 1
+2565	1247 1
+2565	1267 1
+2565	1291 1
+2565	1297 1
+2565	1305 1
+2565	1307 1
+2565	1310 1
+2565	1315 1
+2565	1357 1
+2565	1360 1
+2565	1374 1
+2565	1384 1
+2565	1385 1
+2565	1393 1
+2565	1403 1
+2565	1416 1
+2565	1419 1
+2565	1437 1
+2565	1493 1
+2565	1498 1
+2565	1548 1
+2565	1549 1
+2565	1571 1
+2565	1596 1
+2565	1633 1
+2565	1637 1
+2565	1646 1
+2565	1653 1
+2565	1679 1
+2565	1680 1
+2565	1688 1
+2565	1705 1
+2565	1706 1
+2565	1723 1
+2565	1729 1
+2565	1734 1
+2565	1744 1
+2565	1754 1
+2565	1769 1
+2565	1777 1
+2565	1781 1
+2565	1792 1
+2565	1799 1
+2565	1808 1
+2565	1814 1
+2565	1865 1
+2565	1915 1
+2565	1918 1
+2565	1919 1
+2565	1935 1
+2565	1956 1
+2565	1982 1
+2565	1990 1
+2565	2014 1
+2565	2016 1
+2565	2053 1
+2565	2066 1
+2565	2102 1
+2565	2114 1
+2565	2116 1
+2565	2120 1
+2565	2133 1
+2565	2134 1
+2565	2135 1
+2565	2144 1
+2565	2145 1
+2565	2160 1
+2565	2174 1
+2565	2209 1
+2565	2210 1
+2565	2223 1
+2565	2225 1
+2565	2231 1
+2565	2237 1
+2565	2240 1
+2565	2251 1
+2565	2252 1
+2565	2256 1
+2565	2257 1
+2565	2258 1
+2565	2264 1
+2565	2289 1
+2565	2290 1
+2565	2297 1
+2565	2307 1
+2565	2322 1
+2565	2323 1
+2565	2324 1
+2565	2325 1
+2565	2328 1
+2565	2338 1
+2565	2354 1
+2565	2356 1
+2565	2364 1
+2565	2369 1
+2565	2371 1
+2565	2375 1
+2565	2381 1
+2565	2384 1
+2565	2386 1
+2565	2398 1
+2565	2410 1
+2565	2411 1
+2565	2416 1
+2565	2426 1
+2565	2433 1
+2565	2456 1
+2565	2470 1
+2565	2474 1
+2565	2485 1
+2565	2501 1
+2565	2506 1
+2565	2508 1
+2565	2510 1
+2565	2511 1
+2565	2516 1
+2565	2517 1
+2565	2535 1
+2565	2542 1
+2565	2544 1
+2565	2547 1
+2565	2550 1
+2565	2560 1
+2565	2576 1
+2565	2585 1
+2565	2592 1
+2565	2593 1
+2565	2594 1
+2565	2595 1
+2565	2597 1
+2565	2599 1
+2565	2605 1
+2565	2612 1
+2565	2617 1
+2565	2623 1
+2565	2625 1
+2565	2646 1
+2565	2647 1
+2565	2651 1
+2565	2652 1
+2565	2653 1
+2565	2654 1
+2565	2655 1
+2565	2657 1
+2565	2658 1
+2565	2660 1
+2565	2662 1
+2565	2667 1
+2565	2674 1
+2565	2686 1
+2565	2687 1
+2565	2689 1
+2565	2693 1
+2565	2696 1
+2565	2697 1
+2565	2700 1
+2565	2707 1
+2565	2708 1
+2565	2713 1
+2565	2721 1
+2565	2724 1
+2565	2727 1
+2565	2746 1
+2565	2747 1
+2565	2754 1
+2565	2763 1
+2565	2764 1
+2565	2768 1
+2565	2770 1
+2565	2775 1
+2565	2777 1
+2565	2785 1
+2565	2787 1
+2565	2790 1
+2565	2794 1
+2565	2799 1
+2565	2805 1
+2565	2809 1
+2565	2811 1
+2565	2814 1
+2565	2815 1
+2565	2819 1
+2565	2822 1
+2565	2825 1
+2565	2828 1
+2565	2830 1
+2565	2831 1
+2565	2834 1
+2565	2838 1
+2565	2844 1
+2565	2851 1
+2565	2856 1
+2565	2859 1
+2565	2871 1
+2565	2877 1
+2565	2880 1
+2565	2900 1
+2565	2902 1
+2565	2909 1
+2565	2912 1
+2565	2917 1
+2565	2918 1
+2565	2922 1
+2565	2923 1
+2565	2926 1
+2565	2932 1
+2565	2940 1
+2565	2946 1
+2565	2951 1
+2565	2955 1
+2565	2958 1
+2565	2963 1
+2565	2966 1
+2565	2968 1
+2565	2972 1
+2565	2973 1
+2565	2974 1
+2565	2977 1
+2565	2979 1
+2565	2981 1
+2565	2991 1
+2565	2993 1
+2565	2999 1
+2565	3000 1
+2565	3002 1
+2565	3005 1
+2565	3007 1
+2565	3009 1
+2565	3010 1
+2565	3018 1
+2565	3020 1
+2565	3021 1
+2565	3024 1
+2565	3026 1
+2565	3027 1
+2565	3028 1
+2565	3029 1
+2565	3030 1
+2565	3033 1
+2565	3034 1
+2565	3050 1
+2565	3056 1
+2565	3059 1
+2565	3068 1
+2565	3073 1
+2565	3084 1
+2565	3089 1
+2565	3092 1
+2565	3099 1
+2565	3103 1
+2565	3106 1
+2565	3114 1
+2565	3117 1
+2565	3125 1
+2565	3126 1
+2565	3140 1
+2565	3144 1
+2565	3145 1
+2565	3148 1
+2565	3150 1
+2565	3164 1
+2565	3173 1
+2565	3192 1
+2565	3200 1
+2565	3235 1
+2565	3238 1
+2565	3243 1
+2565	3251 1
+2565	3253 1
+2565	3258 1
+2565	3260 1
+2565	3265 1
+2565	3276 1
+2565	3284 1
+2565	3293 1
+2565	3297 1
+2565	3307 1
+2565	3309 1
+2565	3310 1
+2565	3313 1
+2565	3319 1
+2565	3320 1
+2565	3321 1
+2565	3324 1
+2565	3334 1
+2565	3338 1
+2565	3346 1
+2565	3348 1
+2565	3351 1
+2565	3352 1
+2565	3371 1
+2565	3381 1
+2565	3393 1
+2565	3394 1
+2565	3404 1
+2565	3408 1
+2565	3417 1
+2565	3435 1
+2565	3439 1
+2565	3443 1
+2565	3447 1
+2565	3452 1
+2565	3453 1
+2565	3454 1
+2565	3455 1
+2565	3456 1
+2565	3458 1
+2565	3459 1
+2565	3460 1
+2565	3461 1
+2565	3464 1
+2565	3473 1
+2565	3480 1
+2565	3483 1
+2565	3486 1
+2565	3489 1
+2565	3506 1
+2565	3516 1
+2565	3520 1
+2565	3529 1
+2565	3537 1
+2565	3538 1
+2565	3541 1
+2565	3547 1
+2565	3548 1
+2565	3557 1
+2565	3562 1
+2565	3567 1
+2565	3568 1
+2565	3576 1
+2565	3580 1
+2565	3587 1
+2565	3607 1
+2565	3609 1
+2565	3615 1
+2565	3631 1
+2565	3635 1
+2565	3643 1
+2565	3645 1
+2565	3646 1
+2565	3650 1
+2565	3660 1
+2565	3661 1
+2565	3664 1
+2565	3670 1
+2565	3680 1
+2565	3681 1
+2565	3691 1
+2565	3717 1
+2565	3720 1
+2565	3726 1
+2565	3748 1
+2565	3752 1
+2565	3769 1
+2565	3770 1
+2565	3787 1
+2565	3792 1
+2565	3796 1
+2565	3803 1
+2565	3804 1
+2565	3806 1
+2565	3807 1
+2565	3812 1
+2565	3813 1
+2565	3816 1
+2565	3843 1
+2565	3847 1
+2565	3849 1
+2565	3854 1
+2565	3856 1
+2565	3867 1
+2565	3871 1
+2565	3885 1
+2565	3887 1
+2565	3892 1
+2565	3893 1
+2565	3898 1
+2565	3903 1
+2565	3910 1
+2565	3926 1
+2565	3937 1
+2565	3946 1
+2565	3956 1
+2565	3958 1
+2565	3962 1
+2565	3967 1
+2565	3969 1
+2565	3976 1
+2565	4011 1
+2565	4013 1
+2565	4021 1
+2565	4024 1
+2565	4031 1
+2565	4037 1
+2565	4040 1
+2565	4043 1
+2565	4044 1
+2565	4051 1
+2565	4055 1
+2565	4058 1
+2565	4065 1
+2565	4071 1
+2565	4072 1
+2565	4088 1
+2565	4098 1
+2565	4103 1
+2565	4110 1
+2565	4117 1
+2565	4124 1
+2565	4127 1
+2565	4134 1
+2565	4138 1
+2565	4162 1
+2565	4179 1
+2565	4189 1
+2565	4191 1
+2565	4199 1
+2565	4201 1
+2565	4212 1
+2565	4231 1
+2565	4233 1
+2565	4234 1
+2565	4247 1
+2565	4256 1
+2565	4261 1
+2565	4263 1
+2565	4266 1
+2565	4269 1
+2565	4289 1
+2565	4290 1
+2565	4297 1
+2565	4298 1
+2565	4299 1
+2565	4315 1
+2565	4331 1
+2565	4335 1
+2565	4341 1
+2565	4349 1
+2565	4355 1
+2565	4361 1
+2565	4365 1
+2565	4373 1
+2565	4384 1
+2565	4385 1
+2565	4386 1
+2565	4400 1
+2565	4401 1
+2565	4412 1
+2565	4417 1
+2565	4422 1
+2565	4424 1
+2565	4432 1
+2565	4435 1
+2565	4448 1
+2565	4453 1
+2565	4463 1
+2565	4468 1
+2565	4482 1
+2565	4485 1
+2565	4488 1
+2565	4500 1
+2565	4507 1
+2565	4510 1
+2565	4528 1
+2565	4530 1
+2565	4531 1
+2565	4536 1
+2565	4547 1
+2565	4551 1
+2565	4557 1
+2565	4558 1
+2565	4562 1
+2565	4578 1
+2565	4583 1
+2565	4587 1
+2565	4588 1
+2565	4600 1
+2565	4605 1
+2565	4613 1
+2565	4620 1
+2565	4631 1
+2565	4632 1
+2565	4646 1
+2565	4648 1
+2565	4653 1
+2565	4661 1
+2565	4662 1
+2565	4666 1
+2565	4706 1
+2565	4709 1
+2565	4713 1
+2565	4719 1
+2565	4735 1
+2565	4764 1
+2565	4777 1
+2565	4778 1
+2565	4780 1
+2565	4792 1
+2565	4796 1
+2565	4808 1
+2565	4811 1
+2565	4814 1
+2565	4820 1
+2565	4824 1
+2565	4827 1
+2565	4846 1
+2565	4875 1
+2565	4884 1
+2565	4929 1
+2565	4938 1
+2565	4940 1
+2565	4944 1
+2565	4953 1
+2565	4964 1
+2565	4981 1
+2565	4983 1
+2565	4986 1
+2565	4999 1
+2565	5002 1
+2565	5012 1
+2565	5020 1
+2565	5022 1
+2565	5026 1
+2565	5028 1
+2565	5037 1
+2565	5055 1
+2565	5058 1
+2565	5073 1
+2565	5079 1
+2565	5092 1
+2565	5096 1
+2565	5100 1
+2565	5106 1
+2565	5130 1
+2565	5132 1
+2565	5144 1
+2565	5148 1
+2565	5162 1
+2565	5179 1
+2565	5189 1
+2565	5199 1
+2565	5204 1
+2565	5210 1
+2565	5215 1
+2565	5222 1
+2565	5233 1
+2565	5239 1
+2565	5245 1
+2565	5246 1
+2565	5288 1
+2565	5289 1
+2565	5295 1
+2565	5321 1
+2565	5335 1
+2565	5341 1
+2565	5364 1
+2565	5378 1
+2565	5384 1
+2565	5392 1
+2565	5404 1
+2565	5406 1
+2565	5412 1
+2565	5421 1
+2565	5423 1
+2565	5430 1
+2565	5432 1
+2565	5449 1
+2565	5452 1
+2565	5454 1
+2565	5459 1
+2565	5465 1
+2565	5466 1
+2565	5484 1
+2565	5500 1
+2565	5506 1
+2565	5509 1
+2565	5511 1
+2565	5524 1
+2565	5529 1
+2565	5539 1
+2565	5543 1
+2565	5545 1
+2565	5559 1
+2565	5563 1
+2565	5568 1
+2565	5582 1
+2565	5592 1
+2565	5596 1
+2565	5605 1
+2565	5614 1
+2565	5637 1
+2565	5640 1
+2565	5650 1
+2565	5651 1
+2565	5671 1
+2565	5683 1
+2565	5693 1
+2565	5697 1
+2565	5714 1
+2565	5739 1
+2565	5760 1
+2565	5772 1
+2565	5773 1
+2565	5776 1
+2565	5800 1
+2565	5802 1
+2565	5806 1
+2565	5807 1
+2565	5811 1
+2565	5812 1
+2565	5814 1
+2565	5817 1
+2565	5818 1
+2565	5822 1
+2565	5829 1
+2565	5835 1
+2565	5839 1
+2565	5871 1
+2565	5872 1
+2565	5887 1
+2565	5897 1
+2565	5902 1
+2565	5922 1
+2565	5932 1
+2565	5933 1
+2565	5998 1
+2565	6000 1
+2565	6004 1
+2565	6032 1
+2565	6043 1
+2565	6044 1
+2565	6097 1
+2565	6123 1
+2565	6151 1
+2565	6174 1
+2565	6198 1
+2565	6227 1
+2565	6241 1
+2565	6243 1
+2565	6270 1
+2565	6272 1
+2565	6299 1
+2565	6305 1
+2565	6320 1
+2565	6327 1
+2565	6330 1
+2565	6347 1
+2565	6388 1
+2565	6414 1
+2565	6417 1
+2565	6422 1
+2565	6424 1
+2565	6442 1
+2565	6496 1
+2565	6503 1
+2565	6523 1
+2565	6555 1
+2565	6560 1
+2565	6596 1
+2565	6613 1
+2565	6618 1
+2565	6624 1
+2565	6634 1
+2565	6665 1
+2565	6712 1
+2565	6714 1
+2565	6720 1
+2565	6736 1
+2565	6737 1
+2565	6759 1
+2565	6765 1
+2565	6770 1
+2565	6774 1
+2565	6780 1
+2565	6783 1
+2565	6789 1
+2565	6790 1
+2565	6832 1
+2565	6833 1
+2565	6850 1
+2565	6855 1
+2565	6860 1
+2565	6869 1
+2565	6873 1
+2565	6875 1
+2565	6897 1
+2565	6901 1
+2565	6907 1
+2565	6913 1
+2565	6914 1
+2565	6918 1
+2565	6923 1
+2565	6930 1
+2565	6933 1
+2565	6934 1
+2565	6942 1
+2565	6945 1
+2565	6946 1
+2565	6948 1
+2565	6953 1
+2565	6955 1
+2565	6976 1
+2565	6979 1
+2565	6980 1
+2565	6982 1
+2565	6993 1
+2565	6994 1
+2565	7005 1
+2565	7012 1
+2565	7021 1
+2565	7047 1
+2565	7050 1
+2565	7052 1
+2565	7054 1
+2565	7059 1
+2565	7063 1
+2565	7073 1
+2565	7088 1
+2565	7092 1
+2565	7094 1
+2565	7101 1
+2565	7108 1
+2565	7110 1
+2565	7115 1
+2565	7116 1
+2565	7119 1
+2565	7120 1
+2565	7131 1
+2565	7143 1
+2565	7144 1
+2565	7186 1
+2565	7201 1
+2565	7214 1
+2565	7225 1
+2565	7233 1
+2565	7237 1
+2565	7238 1
+2565	7277 1
+2565	7279 1
+2565	7280 1
+2565	7295 1
+2565	7301 1
+2565	7319 1
+2565	7341 1
+2565	7351 1
+2565	7362 1
+2565	7373 1
+2565	7378 1
+2565	7381 1
+2565	7386 1
+2565	7389 1
+2565	7391 1
+2565	7400 1
+2565	7414 1
+2565	7422 1
+2565	7442 1
+2565	7443 1
+2565	7450 1
+2565	7478 1
+2565	7497 1
+2565	7510 1
+2565	7512 1
+2565	7517 1
+2565	7529 1
+2565	7544 1
+2565	7553 1
+2565	7561 1
+2565	7567 1
+2565	7574 1
+2565	7587 1
+2565	7588 1
+2565	7593 1
+2565	7618 1
+2565	7620 1
+2565	7624 1
+2565	7632 1
+2565	7634 1
+2565	7646 1
+2565	7649 1
+2565	7651 1
+2565	7658 1
+2565	7662 1
+2565	7666 1
+2565	7668 1
+2565	7673 1
+2565	7683 1
+2565	7694 1
+2565	7695 1
+2565	7699 1
+2565	7701 1
+2565	7707 1
+2565	7726 1
+2565	7757 1
+2565	7763 1
+2565	7778 1
+2565	7788 1
+2565	7791 1
+2565	7795 1
+2565	7799 1
+2565	7803 1
+2565	7809 1
+2565	7810 1
+2565	7813 1
+2565	7819 1
+2565	7833 1
+2565	7835 1
+2565	7839 1
+2565	7855 1
+2565	7857 1
+2565	7860 1
+2565	7862 1
+2565	7871 1
+2565	7879 1
+2565	7882 1
+2565	7890 1
+2565	7908 1
+2565	7910 1
+2565	7912 1
+2565	7921 1
+2565	7924 1
+2565	7927 1
+2565	7928 1
+2565	7946 1
+2565	7961 1
+2565	7965 1
+2565	7979 1
+2565	7992 1
+2565	7994 1
+2565	7996 1
+2565	8037 1
+2565	8042 1
+2565	8044 1
+2565	8051 1
+2565	8068 1
+2565	8073 1
+2565	8083 1
+2565	8121 1
+2565	8122 1
+2565	8124 1
+2565	8128 1
+2565	8130 1
+2565	8132 1
+2565	8134 1
+2565	8141 1
+2565	8148 1
+2565	8163 1
+2565	8168 1
+2565	8169 1
+2565	8174 1
+2565	8178 1
+2565	8192 1
+2565	8198 1
+2565	8209 1
+2565	8212 1
+2565	8219 1
+2565	8224 1
+2565	8237 1
+2565	8249 1
+2565	8292 1
+2565	8293 1
+2565	8294 1
+2570	1717 1
+2569	56 1
+2569	1049 1
+2569	1374 1
+2569	2294 1
+2569	2570 1
+2572	1935 1
+2572	2575 1
+2572	2579 1
+2572	2587 1
+2572	2607 1
+2572	2629 1
+2572	4051 1
+2573	2575 1
+2574	2575 1
+2574	2625 1
+2576	56 1
+2576	765 1
+2576	974 1
+2576	1159 1
+2576	1166 1
+2576	1211 1
+2576	1297 1
+2576	1315 1
+2576	1357 1
+2576	1416 1
+2576	1633 1
+2576	1679 1
+2576	1680 1
+2576	1688 1
+2576	1705 1
+2576	1781 1
+2576	1865 1
+2576	1919 1
+2576	2001 1
+2576	2053 1
+2576	2102 1
+2576	2144 1
+2576	2160 1
+2576	2174 1
+2576	2231 1
+2576	2251 1
+2576	2285 1
+2576	2324 1
+2576	2338 1
+2576	2354 1
+2576	2375 1
+2576	2381 1
+2576	2398 1
+2576	2411 1
+2576	2416 1
+2576	2470 1
+2576	2474 1
+2576	2507 1
+2576	2542 1
+2576	2579 1
+2576	2592 1
+2576	2594 1
+2576	2620 1
+2576	2625 1
+2576	2646 1
+2576	2651 1
+2576	2654 1
+2576	2660 1
+2576	2662 1
+2576	2674 1
+2576	2687 1
+2576	2689 1
+2576	2693 1
+2576	2697 1
+2576	2700 1
+2576	2713 1
+2576	2724 1
+2576	2760 1
+2576	2765 1
+2576	2768 1
+2576	2805 1
+2576	2809 1
+2576	2814 1
+2576	2822 1
+2576	2825 1
+2576	2828 1
+2576	2871 1
+2576	2877 1
+2576	2880 1
+2576	2912 1
+2576	2918 1
+2576	2926 1
+2576	2973 1
+2576	3005 1
+2576	3021 1
+2576	3033 1
+2576	3084 1
+2576	3089 1
+2576	3092 1
+2576	3099 1
+2576	3106 1
+2576	3117 1
+2576	3125 1
+2576	3148 1
+2576	3256 1
+2576	3265 1
+2576	3274 1
+2576	3307 1
+2576	3408 1
+2576	3443 1
+2576	3473 1
+2576	3489 1
+2576	3516 1
+2576	3643 1
+2576	3670 1
+2576	3769 1
+2576	3813 1
+2576	3956 1
+2576	3958 1
+2576	3962 1
+2576	4037 1
+2576	4065 1
+2576	4071 1
+2576	4072 1
+2576	4298 1
+2576	4536 1
+2576	4613 1
+2576	4797 1
+2576	4981 1
+2576	5148 1
+2576	5210 1
+2576	5245 1
+2576	5254 1
+2576	5301 1
+2576	5305 1
+2576	5459 1
+2576	5605 1
+2576	5713 1
+2576	5721 1
+2576	5732 1
+2576	5739 1
+2576	5802 1
+2576	5814 1
+2576	5819 1
+2576	6029 1
+2576	6044 1
+2576	6174 1
+2576	6320 1
+2576	6437 1
+2576	6523 1
+2576	6552 1
+2576	6918 1
+2576	6980 1
+2576	7052 1
+2576	7120 1
+2576	7443 1
+2576	7620 1
+2576	7699 1
+2576	7757 1
+2576	7763 1
+2576	7809 1
+2576	7871 1
+2576	7882 1
+2576	7910 1
+2576	8293 1
+2576	8295 1
+2577	2579 1
+2577	2580 1
+2578	765 1
+2578	1646 1
+2578	1653 1
+2578	1717 1
+2578	2117 1
+2578	2323 1
+2578	2410 1
+2578	2579 1
+2578	2587 1
+2578	2617 1
+2578	2625 1
+2578	3130 1
+2587	72 1
+2587	2576 1
+2587	2617 1
+2587	2625 1
+2587	2775 1
+2587	3568 1
+2587	4349 1
+2587	4661 1
+2587	5226 1
+2587	5459 1
+2587	5524 1
+2587	5684 1
+2581	2587 1
+2582	2587 1
+2583	2587 1
+2583	2625 1
+2584	2587 1
+2585	15 1
+2585	762 1
+2585	1549 1
+2585	2066 1
+2585	2120 1
+2585	2160 1
+2585	2210 1
+2585	2252 1
+2585	2328 1
+2585	2338 1
+2585	2398 1
+2585	2535 1
+2585	2544 1
+2585	2587 1
+2585	2594 1
+2585	2625 1
+2585	2651 1
+2585	2653 1
+2585	2746 1
+2585	2790 1
+2585	2958 1
+2585	3005 1
+2585	3024 1
+2585	3028 1
+2585	3030 1
+2585	3089 1
+2585	3117 1
+2585	3192 1
+2585	3260 1
+2585	3276 1
+2585	3351 1
+2585	3394 1
+2585	3439 1
+2585	3454 1
+2585	3537 1
+2585	3562 1
+2585	3580 1
+2585	3615 1
+2585	3645 1
+2585	3842 1
+2585	3873 1
+2585	3892 1
+2585	3976 1
+2585	4013 1
+2585	4021 1
+2585	4037 1
+2585	4191 1
+2585	4448 1
+2585	4528 1
+2585	4574 1
+2585	4735 1
+2585	5121 1
+2585	5273 1
+2585	5288 1
+2585	5412 1
+2585	5891 1
+2585	6124 1
+2585	7168 1
+2585	8293 1
+2585	8294 1
+2586	2587 1
+2586	2643 1
+2592	1799 1
+2592	2117 1
+2592	2237 1
+2592	2375 1
+2592	2416 1
+2592	2928 1
+2592	4098 1
+2592	4191 1
+2592	4587 1
+2592	4625 1
+2592	4846 1
+2592	5123 1
+2592	5484 1
+2593	56 1
+2593	350 1
+2593	765 1
+2593	1049 1
+2593	1374 1
+2593	1521 1
+2593	1734 1
+2593	1754 1
+2593	1847 1
+2593	2102 1
+2593	2117 1
+2593	2294 1
+2593	2322 1
+2593	2328 1
+2593	2411 1
+2593	2625 1
+2593	2654 1
+2593	2693 1
+2593	2727 1
+2593	2751 1
+2593	2801 1
+2593	2805 1
+2593	2809 1
+2593	2844 1
+2593	2902 1
+2593	2958 1
+2593	2990 1
+2593	3026 1
+2593	3082 1
+2593	3117 1
+2593	3650 1
+2593	8292 1
+2594	15 1
+2594	417 1
+2594	465 1
+2594	737 1
+2594	856 1
+2594	974 1
+2594	1166 1
+2594	1297 1
+2594	1847 1
+2594	2001 1
+2594	2066 1
+2594	2117 1
+2594	2120 1
+2594	2174 1
+2594	2256 1
+2594	2264 1
+2594	2322 1
+2594	2398 1
+2594	2410 1
+2594	2501 1
+2594	2544 1
+2594	2576 1
+2594	2585 1
+2594	2619 1
+2594	2625 1
+2594	2665 1
+2594	2700 1
+2594	2746 1
+2594	2751 1
+2594	2797 1
+2594	2831 1
+2594	2958 1
+2594	3005 1
+2594	3030 1
+2594	3082 1
+2594	3089 1
+2594	3104 1
+2594	3130 1
+2594	3321 1
+2594	3439 1
+2594	3562 1
+2594	3580 1
+2594	4021 1
+2594	4124 1
+2594	5412 1
+2595	15 1
+2595	608 1
+2595	1297 1
+2595	1357 1
+2595	1548 1
+2595	1808 1
+2595	2117 1
+2595	2134 1
+2595	2174 1
+2595	2237 1
+2595	2264 1
+2595	2276 1
+2595	2328 1
+2595	2354 1
+2595	2398 1
+2595	2516 1
+2595	2560 1
+2595	2585 1
+2595	2625 1
+2595	2657 1
+2595	2665 1
+2595	2746 1
+2595	2794 1
+2595	3034 1
+2595	3089 1
+2595	3117 1
+2595	3258 1
+2595	3352 1
+2595	3443 1
+2595	3456 1
+2595	3537 1
+2595	3586 1
+2595	3615 1
+2595	3650 1
+2595	4030 1
+2595	4049 1
+2595	4162 1
+2595	4179 1
+2595	4276 1
+2595	4338 1
+2595	4875 1
+2595	5178 1
+2595	5254 1
+2595	5484 1
+2595	5760 1
+2595	6006 1
+2595	6437 1
+2595	7362 1
+2595	7478 1
+2596	765 1
+2596	1646 1
+2596	2117 1
+2596	2593 1
+2596	2625 1
+2596	2643 1
+2596	2790 1
+2596	2805 1
+2596	3073 1
+2596	3276 1
+2596	3284 1
+2596	4536 1
+2596	4735 1
+2597	2117 1
+2597	3145 1
+2598	1847 1
+2598	1992 1
+2598	2117 1
+2598	2251 1
+2598	2593 1
+2598	2625 1
+2598	2643 1
+2474	56 1
+2474	204 1
+2474	290 1
+2474	403 1
+2474	417 1
+2474	425 1
+2474	633 1
+2474	737 1
+2474	762 1
+2474	765 1
+2474	1049 1
+2474	1267 1
+2474	1291 1
+2474	1307 1
+2474	1357 1
+2474	1374 1
+2474	1384 1
+2474	1393 1
+2474	1416 1
+2474	1419 1
+2474	1549 1
+2474	1592 1
+2474	1646 1
+2474	1705 1
+2474	1723 1
+2474	1734 1
+2474	1754 1
+2474	1781 1
+2474	1792 1
+2474	1808 1
+2474	1814 1
+2474	1847 1
+2474	1919 1
+2474	1992 1
+2474	2066 1
+2474	2116 1
+2474	2117 1
+2474	2120 1
+2474	2135 1
+2474	2145 1
+2474	2174 1
+2474	2210 1
+2474	2225 1
+2474	2229 1
+2474	2231 1
+2474	2240 1
+2474	2251 1
+2474	2256 1
+2474	2264 1
+2474	2294 1
+2474	2297 1
+2474	2322 1
+2474	2328 1
+2474	2340 1
+2474	2371 1
+2474	2375 1
+2474	2398 1
+2474	2410 1
+2474	2501 1
+2474	2506 1
+2474	2547 1
+2474	2550 1
+2474	2576 1
+2474	2593 1
+2474	2594 1
+2474	2599 1
+2474	2617 1
+2474	2618 1
+2474	2619 1
+2474	2625 1
+2474	2638 1
+2474	2646 1
+2474	2650 1
+2474	2651 1
+2474	2654 1
+2474	2662 1
+2474	2665 1
+2474	2669 1
+2474	2670 1
+2474	2685 1
+2474	2697 1
+2474	2707 1
+2474	2721 1
+2474	2736 1
+2474	2763 1
+2474	2774 1
+2474	2794 1
+2474	2805 1
+2474	2809 1
+2474	2811 1
+2474	2814 1
+2474	2815 1
+2474	2825 1
+2474	2828 1
+2474	2830 1
+2474	2834 1
+2474	2856 1
+2474	2877 1
+2474	2902 1
+2474	2912 1
+2474	2922 1
+2474	2928 1
+2474	2951 1
+2474	2955 1
+2474	2963 1
+2474	2968 1
+2474	2993 1
+2474	3007 1
+2474	3024 1
+2474	3029 1
+2474	3033 1
+2474	3034 1
+2474	3068 1
+2474	3117 1
+2474	3251 1
+2474	3253 1
+2474	3258 1
+2474	3265 1
+2474	3443 1
+2474	3562 1
+2474	3631 1
+2474	3755 1
+2474	3898 1
+2474	4013 1
+2474	4021 1
+2474	4051 1
+2474	4055 1
+2474	4058 1
+2474	4078 1
+2474	4124 1
+2474	4191 1
+2474	4261 1
+2474	4266 1
+2474	4510 1
+2474	4735 1
+2474	5055 1
+2474	5200 1
+2474	5311 1
+2474	5539 1
+2474	6347 1
+2474	7168 1
+2474	8294 1
+2599	417 1
+2599	762 1
+2599	2117 1
+2599	2665 1
+2599	3009 1
+2599	4400 1
+2599	5412 1
+2599	6251 1
+2599	7632 1
+2603	2604 1
+2605	403 1
+2605	1166 1
+2605	1297 1
+2605	1688 1
+2605	1808 1
+2605	1992 1
+2605	2001 1
+2605	2120 1
+2605	2144 1
+2605	2174 1
+2605	2251 1
+2605	2323 1
+2605	2381 1
+2605	2516 1
+2605	2542 1
+2605	2547 1
+2605	2576 1
+2605	2594 1
+2605	2620 1
+2605	2625 1
+2605	2707 1
+2605	2871 1
+2605	2922 1
+2605	2963 1
+2605	2996 1
+2605	3029 1
+2605	3033 1
+2605	3104 1
+2605	3251 1
+2605	3376 1
+2605	3417 1
+2605	3489 1
+2605	3568 1
+2605	3643 1
+2605	3660 1
+2605	3807 1
+2605	3812 1
+2605	3856 1
+2605	4191 1
+2605	4335 1
+2605	4483 1
+2605	4653 1
+2605	4986 1
+2605	5106 1
+2605	5188 1
+2605	5189 1
+2605	5226 1
+2605	5301 1
+2605	5321 1
+2605	5404 1
+2605	5449 1
+2605	5459 1
+2605	5624 1
+2605	5637 1
+2605	5650 1
+2605	5651 1
+2605	5693 1
+2605	5713 1
+2605	5721 1
+2605	6006 1
+2605	6080 1
+2605	6501 1
+2605	6552 1
+2605	6600 1
+2606	2625 1
+2607	2625 1
+2608	765 1
+2608	1419 1
+2608	1723 1
+2608	2174 1
+2608	2264 1
+2608	2322 1
+2608	2366 1
+2608	2410 1
+2608	2470 1
+2608	2560 1
+2608	2625 1
+2608	2814 1
+2608	2828 1
+2608	2979 1
+2609	2620 1
+2609	2625 1
+2609	2720 1
+2609	2805 1
+2609	3002 1
+2609	4482 1
+2609	4712 1
+2610	2625 1
+2611	2323 1
+2611	2535 1
+2611	2617 1
+2611	2625 1
+2611	3130 1
+2611	4037 1
+2611	4261 1
+2612	737 1
+2612	765 1
+2612	1291 1
+2612	1297 1
+2612	1548 1
+2612	2323 1
+2612	2375 1
+2612	2398 1
+2612	2516 1
+2612	2565 1
+2612	2593 1
+2612	2594 1
+2612	2625 1
+2612	2877 1
+2612	2900 1
+2612	2912 1
+2612	2922 1
+2612	3408 1
+2612	3439 1
+2612	3454 1
+2612	3458 1
+2612	3555 1
+2612	3587 1
+2612	3813 1
+2612	3897 1
+2612	3958 1
+2612	4290 1
+2612	5387 1
+2612	8293 1
+2613	737 1
+2613	762 1
+2613	1777 1
+2613	2114 1
+2613	2237 1
+2613	2535 1
+2613	2625 1
+2613	2674 1
+2613	2686 1
+2613	2727 1
+2613	2790 1
+2613	2811 1
+2613	2900 1
+2613	3059 1
+2613	3480 1
+2613	3541 1
+2613	3803 1
+2613	3807 1
+2613	3976 1
+2613	4191 1
+2613	4201 1
+2613	4808 1
+2613	4828 1
+2613	5484 1
+2613	6098 1
+2614	2625 1
+2614	3130 1
+2614	3680 1
+2614	3847 1
+2614	3849 1
+2615	2625 1
+2615	3130 1
+2616	2625 1
+2617	15 1
+2617	765 1
+2617	1646 1
+2617	1653 1
+2617	1918 1
+2617	2102 1
+2617	2231 1
+2617	2323 1
+2617	2410 1
+2617	2535 1
+2617	2625 1
+2617	2667 1
+2617	2697 1
+2617	2775 1
+2617	2794 1
+2617	2814 1
+2617	3029 1
+2617	3117 1
+2617	3130 1
+2617	3580 1
+2617	4037 1
+2617	4980 1
+2618	762 1
+2618	856 1
+2618	974 1
+2618	1166 1
+2618	1267 1
+2618	1549 1
+2618	1734 1
+2618	1814 1
+2618	1847 1
+2618	1992 1
+2618	2066 1
+2618	2120 1
+2618	2174 1
+2618	2209 1
+2618	2231 1
+2618	2240 1
+2618	2252 1
+2618	2256 1
+2618	2375 1
+2618	2410 1
+2618	2510 1
+2618	2585 1
+2618	2594 1
+2618	2625 1
+2618	2646 1
+2618	2651 1
+2618	2653 1
+2618	2657 1
+2618	2660 1
+2618	2665 1
+2618	2669 1
+2618	2713 1
+2618	2746 1
+2618	2747 1
+2618	2751 1
+2618	2790 1
+2618	2958 1
+2618	2973 1
+2618	3030 1
+2618	3130 1
+2618	3148 1
+2618	3164 1
+2618	3260 1
+2618	3307 1
+2618	3473 1
+2618	3562 1
+2618	3755 1
+2618	3974 1
+2618	4014 1
+2618	4191 1
+2618	4796 1
+2618	8293 1
+2618	8294 1
+2623	15 1
+2623	204 1
+2623	350 1
+2623	403 1
+2623	406 1
+2623	737 1
+2623	741 1
+2623	1297 1
+2623	1453 1
+2623	1571 1
+2623	1633 1
+2623	1919 1
+2623	2209 1
+2623	2257 1
+2623	2324 1
+2623	2375 1
+2623	2398 1
+2623	2416 1
+2623	2501 1
+2623	2535 1
+2623	2565 1
+2623	2585 1
+2623	2597 1
+2623	2620 1
+2623	2625 1
+2623	2652 1
+2623	2653 1
+2623	2667 1
+2623	2746 1
+2623	2799 1
+2623	2838 1
+2623	2900 1
+2623	2918 1
+2623	2926 1
+2623	2996 1
+2623	3024 1
+2623	3253 1
+2623	3255 1
+2623	3258 1
+2623	3284 1
+2623	3320 1
+2623	3324 1
+2623	3516 1
+2623	3547 1
+2623	3549 1
+2623	3586 1
+2623	3615 1
+2623	3772 1
+2623	3856 1
+2623	3867 1
+2623	3892 1
+2623	3914 1
+2623	3921 1
+2623	3933 1
+2623	4011 1
+2623	4012 1
+2623	4037 1
+2623	4098 1
+2623	4124 1
+2623	4138 1
+2623	4254 1
+2623	4298 1
+2623	4315 1
+2623	4338 1
+2623	4385 1
+2623	4527 1
+2623	4529 1
+2623	4666 1
+2623	4687 1
+2623	4777 1
+2623	4875 1
+2623	5002 1
+2623	5083 1
+2623	5121 1
+2623	5176 1
+2623	5210 1
+2623	5233 1
+2623	5240 1
+2623	5254 1
+2623	5412 1
+2623	5415 1
+2623	5457 1
+2623	5484 1
+2623	5524 1
+2623	5533 1
+2623	5559 1
+2623	5568 1
+2623	5605 1
+2623	5630 1
+2623	5705 1
+2623	5772 1
+2623	5817 1
+2623	5936 1
+2623	5956 1
+2623	5972 1
+2623	6094 1
+2623	6109 1
+2623	6124 1
+2623	6130 1
+2623	6261 1
+2623	6279 1
+2623	6306 1
+2623	6311 1
+2623	6447 1
+2623	6523 1
+2623	6555 1
+2623	6994 1
+2623	8293 1
+2619	15 1
+2619	825 1
+2619	1357 1
+2619	1416 1
+2619	1549 1
+2619	1754 1
+2619	1781 1
+2619	1808 1
+2619	1847 1
+2619	1982 1
+2619	2328 1
+2619	2371 1
+2619	2474 1
+2619	2485 1
+2619	2535 1
+2619	2547 1
+2619	2560 1
+2619	2585 1
+2619	2625 1
+2619	2657 1
+2619	2665 1
+2619	2697 1
+2619	2963 1
+2619	2972 1
+2619	3028 1
+2619	3084 1
+2619	3103 1
+2619	3164 1
+2619	3671 1
+2619	3752 1
+2619	3800 1
+2619	3962 1
+2619	4712 1
+2619	5079 1
+2619	5563 1
+2619	6784 1
+2619	6790 1
+2619	6914 1
+2619	6955 1
+2619	6980 1
+2619	7021 1
+2619	7040 1
+2619	7092 1
+2619	7277 1
+2619	7381 1
+2619	7809 1
+2620	1564 1
+2620	2120 1
+2620	2294 1
+2620	2550 1
+2620	2576 1
+2620	2594 1
+2620	2618 1
+2620	2625 1
+2620	2665 1
+2620	3193 1
+2620	3919 1
+2620	5254 1
+2620	5800 1
+2620	5829 1
+2620	5871 1
+2620	6305 1
+2620	6388 1
+2620	6555 1
+2620	6560 1
+2620	6765 1
+2620	6833 1
+2620	6850 1
+2620	6901 1
+2620	7040 1
+2627	1717 1
+2626	1374 1
+2626	1717 1
+2626	2763 1
+2630	2593 1
+2630	2968 1
+2631	2593 1
+2632	2593 1
+2633	2643 1
+1863	2643 1
+2634	2643 1
+2635	2643 1
+2636	2643 1
+2637	2643 1
+2639	2643 1
+2640	2643 1
+2638	2643 1
+2641	2643 1
+2642	2643 1
+2645	3192 1
+2645	3394 1
+2645	3439 1
+2645	4191 1
+2645	4218 1
+2645	4289 1
+2645	4351 1
+2644	2645 1
+2628	1847 1
+2646	425 1
+2646	765 1
+2646	1049 1
+2646	1291 1
+2646	1437 1
+2646	1596 1
+2646	1734 1
+2646	1808 1
+2646	1823 1
+2646	1847 1
+2646	2120 1
+2646	2256 1
+2646	2366 1
+2646	2547 1
+2646	2560 1
+2646	2593 1
+2646	2617 1
+2646	2620 1
+2646	2625 1
+2646	2665 1
+2646	2720 1
+2646	2721 1
+2646	2830 1
+2646	2877 1
+2646	2963 1
+2646	2968 1
+2646	2972 1
+2646	2979 1
+2646	2993 1
+2646	3029 1
+2646	3056 1
+2646	3099 1
+2646	3144 1
+2646	3307 1
+2646	3473 1
+2646	3645 1
+2646	4422 1
+2646	6599 1
+2646	8293 1
+2647	56 1
+2647	214 1
+2647	1291 1
+2647	1521 1
+2647	1564 1
+2647	1646 1
+2647	1847 1
+2647	1992 1
+2647	2053 1
+2647	2174 1
+2647	2264 1
+2647	2416 1
+2647	2470 1
+2647	2501 1
+2647	2797 1
+2647	2814 1
+2647	2902 1
+2647	3755 1
+2648	2365 1
+2649	2650 1
+2651	15 1
+2651	204 1
+2651	285 1
+2651	290 1
+2651	403 1
+2651	417 1
+2651	465 1
+2651	608 1
+2651	737 1
+2651	762 1
+2651	825 1
+2651	856 1
+2651	974 1
+2651	1140 1
+2651	1166 1
+2651	1185 1
+2651	1297 1
+2651	1305 1
+2651	1360 1
+2651	1385 1
+2651	1416 1
+2651	1437 1
+2651	1453 1
+2651	1549 1
+2651	1571 1
+2651	1688 1
+2651	1706 1
+2651	1729 1
+2651	1744 1
+2651	1754 1
+2651	1769 1
+2651	1777 1
+2651	1918 1
+2651	1935 1
+2651	1990 1
+2651	2001 1
+2651	2016 1
+2651	2066 1
+2651	2144 1
+2651	2145 1
+2651	2174 1
+2651	2209 1
+2651	2225 1
+2651	2231 1
+2651	2240 1
+2651	2252 1
+2651	2256 1
+2651	2257 1
+2651	2289 1
+2651	2290 1
+2651	2322 1
+2651	2324 1
+2651	2328 1
+2651	2338 1
+2651	2375 1
+2651	2384 1
+2651	2398 1
+2651	2411 1
+2651	2416 1
+2651	2499 1
+2651	2506 1
+2651	2510 1
+2651	2517 1
+2651	2535 1
+2651	2542 1
+2651	2544 1
+2651	2565 1
+2651	2576 1
+2651	2585 1
+2651	2594 1
+2651	2597 1
+2651	2612 1
+2651	2619 1
+2651	2623 1
+2651	2625 1
+2651	2652 1
+2651	2653 1
+2651	2657 1
+2651	2660 1
+2651	2662 1
+2651	2665 1
+2651	2667 1
+2651	2686 1
+2651	2693 1
+2651	2707 1
+2651	2713 1
+2651	2727 1
+2651	2746 1
+2651	2747 1
+2651	2760 1
+2651	2811 1
+2651	2814 1
+2651	2819 1
+2651	2838 1
+2651	2871 1
+2651	2900 1
+2651	2918 1
+2651	2958 1
+2651	2973 1
+2651	2981 1
+2651	3005 1
+2651	3007 1
+2651	3009 1
+2651	3010 1
+2651	3020 1
+2651	3021 1
+2651	3024 1
+2651	3026 1
+2651	3028 1
+2651	3029 1
+2651	3030 1
+2651	3059 1
+2651	3084 1
+2651	3114 1
+2651	3117 1
+2651	3125 1
+2651	3130 1
+2651	3140 1
+2651	3144 1
+2651	3148 1
+2651	3180 1
+2651	3200 1
+2651	3235 1
+2651	3251 1
+2651	3253 1
+2651	3258 1
+2651	3260 1
+2651	3276 1
+2651	3284 1
+2651	3301 1
+2651	3309 1
+2651	3321 1
+2651	3334 1
+2651	3346 1
+2651	3351 1
+2651	3352 1
+2651	3394 1
+2651	3404 1
+2651	3408 1
+2651	3409 1
+2651	3410 1
+2651	3433 1
+2651	3435 1
+2651	3439 1
+2651	3446 1
+2651	3453 1
+2651	3454 1
+2651	3473 1
+2651	3483 1
+2651	3486 1
+2651	3489 1
+2651	3506 1
+2651	3516 1
+2651	3541 1
+2651	3547 1
+2651	3548 1
+2651	3562 1
+2651	3567 1
+2651	3576 1
+2651	3580 1
+2651	3607 1
+2651	3609 1
+2651	3615 1
+2651	3629 1
+2651	3631 1
+2651	3635 1
+2651	3645 1
+2651	3650 1
+2651	3661 1
+2651	3680 1
+2651	3681 1
+2651	3691 1
+2651	3769 1
+2651	3772 1
+2651	3785 1
+2651	3787 1
+2651	3800 1
+2651	3803 1
+2651	3807 1
+2651	3809 1
+2651	3811 1
+2651	3822 1
+2651	3825 1
+2651	3847 1
+2651	3849 1
+2651	3854 1
+2651	3856 1
+2651	3867 1
+2651	3871 1
+2651	3887 1
+2651	3898 1
+2651	3903 1
+2651	3910 1
+2651	3911 1
+2651	3914 1
+2651	3926 1
+2651	3933 1
+2651	3956 1
+2651	3958 1
+2651	3967 1
+2651	4013 1
+2651	4030 1
+2651	4037 1
+2651	4043 1
+2651	4047 1
+2651	4051 1
+2651	4055 1
+2651	4072 1
+2651	4103 1
+2651	4110 1
+2651	4111 1
+2651	4162 1
+2651	4179 1
+2651	4181 1
+2651	4191 1
+2651	4201 1
+2651	4211 1
+2651	4231 1
+2651	4247 1
+2651	4254 1
+2651	4256 1
+2651	4261 1
+2651	4263 1
+2651	4266 1
+2651	4269 1
+2651	4290 1
+2651	4299 1
+2651	4365 1
+2651	4400 1
+2651	4422 1
+2651	4424 1
+2651	4448 1
+2651	4453 1
+2651	4463 1
+2651	4485 1
+2651	4530 1
+2651	4536 1
+2651	4547 1
+2651	4551 1
+2651	4578 1
+2651	4620 1
+2651	4646 1
+2651	4648 1
+2651	4662 1
+2651	4735 1
+2651	4778 1
+2651	4780 1
+2651	4792 1
+2651	4797 1
+2651	4827 1
+2651	4899 1
+2651	4938 1
+2651	4962 1
+2651	4993 1
+2651	4999 1
+2651	5079 1
+2651	5092 1
+2651	5100 1
+2651	5130 1
+2651	5412 1
+2651	5445 1
+2651	5775 1
+2651	5780 1
+2651	5819 1
+2651	5844 1
+2651	5848 1
+2651	7632 1
+2651	8293 1
+2651	8294 1
+2653	204 1
+2653	417 1
+2653	608 1
+2653	737 1
+2653	778 1
+2653	825 1
+2653	1166 1
+2653	1267 1
+2653	1297 1
+2653	1307 1
+2653	1453 1
+2653	1549 1
+2653	1688 1
+2653	1734 1
+2653	1915 1
+2653	2016 1
+2653	2066 1
+2653	2144 1
+2653	2206 1
+2653	2209 1
+2653	2237 1
+2653	2252 1
+2653	2257 1
+2653	2328 1
+2653	2354 1
+2653	2371 1
+2653	2398 1
+2653	2411 1
+2653	2485 1
+2653	2535 1
+2653	2544 1
+2653	2565 1
+2653	2576 1
+2653	2585 1
+2653	2594 1
+2653	2619 1
+2653	2625 1
+2653	2652 1
+2653	2654 1
+2653	2657 1
+2653	2660 1
+2653	2674 1
+2653	2686 1
+2653	2693 1
+2653	2696 1
+2653	2727 1
+2653	2747 1
+2653	2871 1
+2653	2909 1
+2653	2918 1
+2653	2958 1
+2653	3005 1
+2653	3007 1
+2653	3009 1
+2653	3024 1
+2653	3026 1
+2653	3028 1
+2653	3059 1
+2653	3084 1
+2653	3114 1
+2653	3117 1
+2653	3125 1
+2653	3173 1
+2653	3192 1
+2653	3260 1
+2653	3276 1
+2653	3301 1
+2653	3404 1
+2653	3435 1
+2653	3439 1
+2653	3443 1
+2653	3454 1
+2653	3456 1
+2653	3461 1
+2653	3480 1
+2653	3483 1
+2653	3516 1
+2653	3529 1
+2653	3537 1
+2653	3548 1
+2653	3568 1
+2653	3580 1
+2653	3587 1
+2653	3609 1
+2653	3615 1
+2653	3634 1
+2653	3645 1
+2653	3650 1
+2653	3680 1
+2653	3748 1
+2653	3772 1
+2653	3800 1
+2653	3807 1
+2653	3813 1
+2653	3854 1
+2653	3875 1
+2653	3903 1
+2653	3939 1
+2653	3970 1
+2653	4043 1
+2653	4124 1
+2653	4162 1
+2653	4179 1
+2653	4183 1
+2653	4191 1
+2653	4256 1
+2653	4299 1
+2653	4510 1
+2653	4578 1
+2653	4827 1
+2653	5026 1
+2653	5817 1
+2653	8294 1
+2655	15 1
+2655	72 1
+2655	762 1
+2655	896 1
+2655	1159 1
+2655	1211 1
+2655	1307 1
+2655	1315 1
+2655	1792 1
+2655	2210 1
+2655	2326 1
+2655	2371 1
+2655	2560 1
+2655	2652 1
+2655	2660 1
+2655	2775 1
+2655	2981 1
+2655	3023 1
+2655	3089 1
+2655	3321 1
+2655	3334 1
+2655	3352 1
+2655	3443 1
+2655	3452 1
+2655	3835 1
+2655	4037 1
+2655	4040 1
+2655	4201 1
+2655	4687 1
+2655	4712 1
+2655	4735 1
+2655	4795 1
+2655	4827 1
+2655	5079 1
+2655	5233 1
+2655	5412 1
+2655	5423 1
+2655	5449 1
+2655	5624 1
+2655	5684 1
+2655	6006 1
+2655	6337 1
+2655	6422 1
+2655	6441 1
+2655	6498 1
+2655	6543 1
+2655	6715 1
+2655	7063 1
+2655	8293 1
+2656	2652 1
+2657	15 1
+2657	204 1
+2657	974 1
+2657	1297 1
+2657	1352 1
+2657	1935 1
+2657	2252 1
+2657	2257 1
+2657	2297 1
+2657	2324 1
+2657	2411 1
+2657	2485 1
+2657	2576 1
+2657	2625 1
+2657	2652 1
+2657	2654 1
+2657	2693 1
+2657	2727 1
+2657	2747 1
+2657	2790 1
+2657	3005 1
+2657	3018 1
+2657	3084 1
+2657	3130 1
+2657	3173 1
+2657	3180 1
+2657	3260 1
+2657	3276 1
+2657	3404 1
+2657	3516 1
+2657	3562 1
+2657	3567 1
+2657	3568 1
+2657	3580 1
+2657	3645 1
+2657	3811 1
+2657	3914 1
+2657	4298 1
+2657	4299 1
+2657	4500 1
+2657	4717 1
+2657	4953 1
+2657	5254 1
+2657	5273 1
+2658	72 1
+2658	155 1
+2658	204 1
+2658	346 1
+2658	417 1
+2658	762 1
+2658	967 1
+2658	1024 1
+2658	1100 1
+2658	1157 1
+2658	1166 1
+2658	1185 1
+2658	1305 1
+2658	1385 1
+2658	1498 1
+2658	1680 1
+2658	1688 1
+2658	1729 1
+2658	1744 1
+2658	1769 1
+2658	1777 1
+2658	1915 1
+2658	1982 1
+2658	1990 1
+2658	2014 1
+2658	2114 1
+2658	2129 1
+2658	2144 1
+2658	2209 1
+2658	2240 1
+2658	2252 1
+2658	2257 1
+2658	2290 1
+2658	2297 1
+2658	2324 1
+2658	2326 1
+2658	2364 1
+2658	2411 1
+2658	2433 1
+2658	2485 1
+2658	2516 1
+2658	2517 1
+2658	2565 1
+2658	2592 1
+2658	2652 1
+2658	2653 1
+2658	2654 1
+2658	2657 1
+2658	2674 1
+2658	2686 1
+2658	2687 1
+2658	2689 1
+2658	2693 1
+2658	2696 1
+2658	2727 1
+2658	2747 1
+2658	2760 1
+2658	2799 1
+2658	2900 1
+2658	2923 1
+2658	2940 1
+2658	2973 1
+2658	3000 1
+2658	3002 1
+2658	3005 1
+2658	3010 1
+2658	3014 1
+2658	3092 1
+2658	3106 1
+2658	3114 1
+2658	3173 1
+2658	3200 1
+2658	3276 1
+2658	3297 1
+2658	3309 1
+2658	3334 1
+2658	3346 1
+2658	3352 1
+2658	3394 1
+2658	3443 1
+2658	3452 1
+2658	3453 1
+2658	3454 1
+2658	3459 1
+2658	3464 1
+2658	3537 1
+2658	3541 1
+2658	3557 1
+2658	3580 1
+2658	3587 1
+2658	3609 1
+2658	3643 1
+2658	3646 1
+2658	3660 1
+2658	3661 1
+2658	3664 1
+2658	3681 1
+2658	3691 1
+2658	3713 1
+2658	3724 1
+2658	3745 1
+2658	3752 1
+2658	3769 1
+2658	3772 1
+2658	3806 1
+2658	3807 1
+2658	3812 1
+2658	3847 1
+2658	3849 1
+2658	3885 1
+2658	3956 1
+2658	3958 1
+2658	3962 1
+2658	3969 1
+2658	3976 1
+2658	4011 1
+2658	4021 1
+2658	4037 1
+2658	4044 1
+2658	4047 1
+2658	4071 1
+2658	4072 1
+2658	4124 1
+2658	4127 1
+2658	4138 1
+2658	4191 1
+2658	4289 1
+2658	4297 1
+2658	4311 1
+2658	4315 1
+2658	4331 1
+2658	4335 1
+2658	4373 1
+2658	4386 1
+2658	4401 1
+2658	4402 1
+2658	4417 1
+2658	4424 1
+2658	4435 1
+2658	4453 1
+2658	4463 1
+2658	4471 1
+2658	4480 1
+2658	4482 1
+2658	4510 1
+2658	4529 1
+2658	4531 1
+2658	4588 1
+2658	4620 1
+2658	4632 1
+2658	4645 1
+2658	4650 1
+2658	4654 1
+2658	4713 1
+2658	4717 1
+2658	4735 1
+2658	4811 1
+2658	4820 1
+2658	4824 1
+2658	4828 1
+2658	4875 1
+2658	4879 1
+2658	4942 1
+2658	4962 1
+2658	4964 1
+2658	4981 1
+2658	4983 1
+2658	5020 1
+2658	5022 1
+2658	5026 1
+2658	5028 1
+2658	5044 1
+2658	5045 1
+2658	5058 1
+2658	5083 1
+2658	5092 1
+2658	5096 1
+2658	5106 1
+2658	5130 1
+2658	5132 1
+2658	5144 1
+2658	5162 1
+2658	5179 1
+2658	5204 1
+2658	5208 1
+2658	5210 1
+2658	5215 1
+2658	5222 1
+2658	5233 1
+2658	5239 1
+2658	5245 1
+2658	5246 1
+2658	5260 1
+2658	5288 1
+2658	5289 1
+2658	5378 1
+2658	5406 1
+2658	5466 1
+2658	5500 1
+2658	5529 1
+2658	5800 1
+2658	5806 1
+2658	5811 1
+2658	5812 1
+2658	5817 1
+2658	5835 1
+2658	5872 1
+2658	5887 1
+2658	5897 1
+2658	5933 1
+2658	6000 1
+2658	6032 1
+2658	6043 1
+2658	6044 1
+2658	6151 1
+2658	6174 1
+2658	6243 1
+2658	6414 1
+2658	6417 1
+2658	6422 1
+2658	6442 1
+2658	6523 1
+2658	6555 1
+2658	6596 1
+2658	6634 1
+2658	6665 1
+2658	6737 1
+2658	6907 1
+2658	6946 1
+2658	6976 1
+2658	6979 1
+2658	7005 1
+2658	7012 1
+2658	7021 1
+2658	7054 1
+2658	7063 1
+2658	7088 1
+2658	7092 1
+2658	7116 1
+2658	7131 1
+2658	7233 1
+2658	7237 1
+2658	7279 1
+2658	7341 1
+2658	7351 1
+2658	7373 1
+2658	7378 1
+2658	7381 1
+2658	7391 1
+2658	7400 1
+2658	7414 1
+2658	7422 1
+2658	7436 1
+2658	7442 1
+2658	7450 1
+2658	7478 1
+2658	7497 1
+2658	7510 1
+2658	7512 1
+2658	7529 1
+2658	7553 1
+2658	7561 1
+2658	7587 1
+2658	7620 1
+2658	7624 1
+2658	7647 1
+2658	7648 1
+2658	7651 1
+2658	7652 1
+2658	7683 1
+2658	7694 1
+2658	7695 1
+2658	7699 1
+2658	7707 1
+2658	7726 1
+2658	7778 1
+2658	7810 1
+2658	7813 1
+2658	7835 1
+2658	7855 1
+2658	7860 1
+2658	7862 1
+2658	7871 1
+2658	7879 1
+2658	7882 1
+2658	7890 1
+2658	7899 1
+2658	7910 1
+2658	7912 1
+2658	7927 1
+2658	7946 1
+2658	7961 1
+2658	7965 1
+2658	7979 1
+2658	8024 1
+2658	8037 1
+2658	8042 1
+2658	8044 1
+2658	8134 1
+2658	8163 1
+2658	8168 1
+2658	8169 1
+2658	8178 1
+2658	8209 1
+2658	8212 1
+2658	8219 1
+2658	8237 1
+2659	417 1
+2659	1744 1
+2659	1990 1
+2659	2066 1
+2659	2652 1
+2659	2655 1
+2659	2674 1
+2659	2687 1
+2659	2859 1
+2659	3005 1
+2659	3670 1
+2659	4024 1
+2665	2251 1
+2665	2256 1
+2665	2322 1
+2665	2410 1
+2665	2973 1
+2665	3351 1
+2661	2665 1
+2662	2256 1
+2662	2665 1
+2663	2076 1
+2663	2665 1
+2664	2665 1
+2668	2669 1
+2671	2294 1
+2672	350 1
+2672	1049 1
+2672	1374 1
+2672	1384 1
+2672	1419 1
+2672	1521 1
+2672	1564 1
+2672	1992 1
+2672	2076 1
+2672	2294 1
+2672	2366 1
+2672	2685 1
+2672	2720 1
+2673	2294 1
+2674	633 1
+2674	825 1
+2674	856 1
+2674	1166 1
+2674	1267 1
+2674	1291 1
+2674	1297 1
+2674	1305 1
+2674	1357 1
+2674	1393 1
+2674	1416 1
+2674	1549 1
+2674	1571 1
+2674	1734 1
+2674	1754 1
+2674	1814 1
+2674	1992 1
+2674	2016 1
+2674	2114 1
+2674	2116 1
+2674	2209 1
+2674	2225 1
+2674	2231 1
+2674	2251 1
+2674	2252 1
+2674	2290 1
+2674	2297 1
+2674	2324 1
+2674	2356 1
+2674	2371 1
+2674	2474 1
+2674	2485 1
+2674	2535 1
+2674	2542 1
+2674	2550 1
+2674	2560 1
+2674	2565 1
+2674	2576 1
+2674	2597 1
+2674	2619 1
+2674	2623 1
+2674	2625 1
+2674	2651 1
+2674	2654 1
+2674	2660 1
+2674	2686 1
+2674	2693 1
+2674	2697 1
+2674	2700 1
+2674	2708 1
+2674	2713 1
+2674	2775 1
+2674	2785 1
+2674	2819 1
+2674	2830 1
+2674	2851 1
+2674	2912 1
+2674	2918 1
+2674	2973 1
+2674	3007 1
+2674	3024 1
+2674	3026 1
+2674	3029 1
+2674	3034 1
+2674	3056 1
+2674	3068 1
+2674	3099 1
+2674	3114 1
+2674	3148 1
+2674	3164 1
+2674	3251 1
+2674	3253 1
+2674	3265 1
+2674	3320 1
+2674	3371 1
+2674	3404 1
+2674	3456 1
+2674	3480 1
+2674	3562 1
+2674	3650 1
+2674	3717 1
+2674	3812 1
+2674	3903 1
+2674	3946 1
+2674	3970 1
+2674	4014 1
+2674	4021 1
+2674	4335 1
+2674	5002 1
+2674	5176 1
+2674	5288 1
+2674	5312 1
+2674	5430 1
+2674	5743 1
+2674	5804 1
+2674	5828 1
+2674	5936 1
+2674	6501 1
+2674	6599 1
+2674	7073 1
+2674	7381 1
+2674	8293 1
+2674	8295 1
+2675	1992 1
+2676	214 1
+2676	350 1
+2676	1154 1
+2676	1374 1
+2676	1992 1
+2676	2366 1
+2676	2618 1
+2677	840 1
+2677	1549 1
+2677	1982 1
+2677	1992 1
+2677	2565 1
+2677	3809 1
+2677	4536 1
+2677	4666 1
+2677	4944 1
+2677	5563 1
+2677	5697 1
+2677	5739 1
+2677	5773 1
+2677	5800 1
+2677	5807 1
+2677	5822 1
+2677	5922 1
+2677	5932 1
+2677	5998 1
+2677	6097 1
+2677	6123 1
+2677	6272 1
+2677	6327 1
+2677	6330 1
+2677	6555 1
+2677	6624 1
+2677	6736 1
+2677	6790 1
+2677	6832 1
+2677	6913 1
+2677	6930 1
+2677	6946 1
+2677	6953 1
+2677	6979 1
+2677	7040 1
+2677	7052 1
+2677	7060 1
+2677	7073 1
+2677	7074 1
+2677	7301 1
+2680	896 1
+2680	2076 1
+2680	4530 1
+2680	5103 1
+2680	5254 1
+2680	5454 1
+2682	2685 1
+2683	1357 1
+2683	2322 1
+2683	2323 1
+2683	2651 1
+2683	2685 1
+2683	2700 1
+2683	2828 1
+2683	3126 1
+2683	3235 1
+2683	3243 1
+2683	3285 1
+2683	4587 1
+2683	5305 1
+2684	2685 1
+2708	346 1
+2708	2651 1
+2708	3002 1
+2708	3030 1
+2708	4037 1
+2708	4719 1
+2708	4735 1
+2708	4820 1
+2708	5083 1
+2699	608 1
+2699	633 1
+2699	1416 1
+2699	1706 1
+2699	1744 1
+2699	1935 1
+2699	2116 1
+2699	2210 1
+2699	2252 1
+2699	2325 1
+2699	2326 1
+2699	2565 1
+2699	2653 1
+2699	2655 1
+2699	2657 1
+2699	2660 1
+2699	2662 1
+2699	2667 1
+2699	2708 1
+2699	2713 1
+2699	2727 1
+2699	2871 1
+2699	2900 1
+2699	2973 1
+2699	3009 1
+2699	3018 1
+2699	3024 1
+2699	3026 1
+2699	3059 1
+2699	3084 1
+2699	3106 1
+2699	3117 1
+2699	3148 1
+2699	3251 1
+2699	3253 1
+2699	3260 1
+2699	3265 1
+2699	3284 1
+2699	3320 1
+2699	3348 1
+2699	3352 1
+2699	3404 1
+2699	3417 1
+2699	3460 1
+2699	3473 1
+2699	3480 1
+2699	3483 1
+2699	3489 1
+2699	3580 1
+2699	3587 1
+2699	3650 1
+2699	3681 1
+2699	3804 1
+2699	3812 1
+2699	3871 1
+2699	3887 1
+2699	3910 1
+2699	3946 1
+2699	4040 1
+2699	4043 1
+2699	4212 1
+2699	4219 1
+2699	4266 1
+2699	4365 1
+2699	4466 1
+2699	4709 1
+2699	4735 1
+2699	4796 1
+2699	4797 1
+2699	5092 1
+2699	5100 1
+2699	5123 1
+2699	5335 1
+2699	6458 1
+2700	204 1
+2700	285 1
+2700	465 1
+2700	608 1
+2700	778 1
+2700	825 1
+2700	974 1
+2700	1100 1
+2700	1157 1
+2700	1166 1
+2700	1239 1
+2700	1297 1
+2700	1453 1
+2700	1571 1
+2700	1633 1
+2700	1679 1
+2700	1706 1
+2700	1744 1
+2700	1777 1
+2700	1935 1
+2700	1990 1
+2700	2016 1
+2700	2114 1
+2700	2134 1
+2700	2209 1
+2700	2210 1
+2700	2252 1
+2700	2257 1
+2700	2290 1
+2700	2297 1
+2700	2324 1
+2700	2325 1
+2700	2328 1
+2700	2338 1
+2700	2384 1
+2700	2411 1
+2700	2416 1
+2700	2485 1
+2700	2506 1
+2700	2510 1
+2700	2535 1
+2700	2542 1
+2700	2544 1
+2700	2585 1
+2700	2594 1
+2700	2595 1
+2700	2597 1
+2700	2612 1
+2700	2619 1
+2700	2623 1
+2700	2625 1
+2700	2653 1
+2700	2654 1
+2700	2655 1
+2700	2657 1
+2700	2660 1
+2700	2667 1
+2700	2674 1
+2700	2686 1
+2700	2693 1
+2700	2708 1
+2700	2713 1
+2700	2727 1
+2700	2746 1
+2700	2747 1
+2700	2799 1
+2700	2819 1
+2700	2859 1
+2700	2912 1
+2700	2923 1
+2700	2932 1
+2700	2958 1
+2700	2973 1
+2700	2974 1
+2700	2981 1
+2700	3005 1
+2700	3007 1
+2700	3009 1
+2700	3010 1
+2700	3018 1
+2700	3020 1
+2700	3021 1
+2700	3024 1
+2700	3026 1
+2700	3028 1
+2700	3030 1
+2700	3059 1
+2700	3084 1
+2700	3114 1
+2700	3117 1
+2700	3148 1
+2700	3173 1
+2700	3180 1
+2700	3251 1
+2700	3258 1
+2700	3260 1
+2700	3276 1
+2700	3291 1
+2700	3307 1
+2700	3313 1
+2700	3319 1
+2700	3320 1
+2700	3324 1
+2700	3338 1
+2700	3352 1
+2700	3394 1
+2700	3404 1
+2700	3408 1
+2700	3410 1
+2700	3473 1
+2700	3480 1
+2700	3483 1
+2700	3489 1
+2700	3506 1
+2700	3516 1
+2700	3520 1
+2700	3529 1
+2700	3538 1
+2700	3548 1
+2700	3556 1
+2700	3557 1
+2700	3580 1
+2700	3587 1
+2700	3609 1
+2700	3615 1
+2700	3631 1
+2700	3646 1
+2700	3661 1
+2700	3680 1
+2700	3681 1
+2700	3717 1
+2700	3787 1
+2700	3800 1
+2700	3804 1
+2700	3807 1
+2700	3812 1
+2700	3816 1
+2700	3843 1
+2700	3887 1
+2700	3892 1
+2700	3898 1
+2700	3903 1
+2700	3926 1
+2700	3970 1
+2700	3971 1
+2700	4011 1
+2700	4024 1
+2700	4031 1
+2700	4043 1
+2700	4055 1
+2700	4088 1
+2700	4103 1
+2700	4110 1
+2700	4111 1
+2700	4138 1
+2700	4162 1
+2700	4173 1
+2700	4179 1
+2700	4191 1
+2700	4201 1
+2700	4233 1
+2700	4256 1
+2700	4263 1
+2700	4269 1
+2700	4290 1
+2700	4323 1
+2700	4331 1
+2700	8294 1
+2701	204 1
+2701	1633 1
+2701	2174 1
+2701	2225 1
+2701	2264 1
+2701	2325 1
+2701	2356 1
+2701	2371 1
+2701	2398 1
+2701	2416 1
+2701	2542 1
+2701	2576 1
+2701	2594 1
+2701	2651 1
+2701	2654 1
+2701	2708 1
+2701	3030 1
+2701	3265 1
+2701	3338 1
+2686	204 1
+2686	417 1
+2686	465 1
+2686	633 1
+2686	762 1
+2686	825 1
+2686	856 1
+2686	896 1
+2686	1159 1
+2686	1166 1
+2686	1267 1
+2686	1297 1
+2686	1357 1
+2686	1393 1
+2686	1416 1
+2686	1437 1
+2686	1571 1
+2686	1679 1
+2686	1688 1
+2686	1777 1
+2686	1792 1
+2686	1814 1
+2686	2016 1
+2686	2116 1
+2686	2135 1
+2686	2225 1
+2686	2231 1
+2686	2237 1
+2686	2285 1
+2686	2290 1
+2686	2297 1
+2686	2325 1
+2686	2328 1
+2686	2338 1
+2686	2356 1
+2686	2416 1
+2686	2426 1
+2686	2485 1
+2686	2510 1
+2686	2542 1
+2686	2550 1
+2686	2565 1
+2686	2576 1
+2686	2585 1
+2686	2594 1
+2686	2619 1
+2686	2620 1
+2686	2623 1
+2686	2625 1
+2686	2651 1
+2686	2653 1
+2686	2654 1
+2686	2657 1
+2686	2660 1
+2686	2662 1
+2686	2667 1
+2686	2697 1
+2686	2700 1
+2686	2708 1
+2686	2713 1
+2686	2724 1
+2686	2754 1
+2686	2790 1
+2686	2799 1
+2686	2819 1
+2686	2851 1
+2686	2856 1
+2686	2900 1
+2686	2912 1
+2686	2918 1
+2686	2951 1
+2686	3007 1
+2686	3009 1
+2686	3018 1
+2686	3020 1
+2686	3021 1
+2686	3028 1
+2686	3030 1
+2686	3089 1
+2686	3117 1
+2686	3126 1
+2686	3140 1
+2686	3145 1
+2686	3150 1
+2686	3164 1
+2686	3191 1
+2686	3193 1
+2686	3235 1
+2686	3243 1
+2686	3251 1
+2686	3265 1
+2686	3285 1
+2686	3307 1
+2686	3319 1
+2686	3334 1
+2686	3338 1
+2686	3348 1
+2686	3351 1
+2686	3371 1
+2686	3376 1
+2686	3408 1
+2686	3435 1
+2686	3439 1
+2686	3459 1
+2686	3465 1
+2686	3473 1
+2686	3489 1
+2686	3506 1
+2686	3516 1
+2686	3520 1
+2686	3538 1
+2686	3547 1
+2686	3614 1
+2686	3643 1
+2686	3646 1
+2686	3670 1
+2686	3671 1
+2686	3681 1
+2686	3769 1
+2686	3785 1
+2686	3804 1
+2686	3843 1
+2686	3903 1
+2686	3922 1
+2686	3926 1
+2686	4041 1
+2686	4175 1
+2686	4276 1
+2686	4310 1
+2686	4335 1
+2686	4483 1
+2686	4621 1
+2686	4715 1
+2686	4717 1
+2686	4735 1
+2686	4828 1
+2686	4999 1
+2686	5123 1
+2686	5176 1
+2686	5479 1
+2686	5524 1
+2686	5543 1
+2686	5925 1
+2686	5936 1
+2686	5977 1
+2686	5980 1
+2686	5994 1
+2686	6105 1
+2686	6111 1
+2686	6337 1
+2686	6360 1
+2686	6414 1
+2686	6417 1
+2686	6422 1
+2686	8293 1
+2686	8295 1
+2687	1633 1
+2687	2338 1
+2687	2651 1
+2687	2657 1
+2687	2662 1
+2687	2708 1
+2687	2754 1
+2687	3307 1
+2687	3319 1
+2687	3324 1
+2687	3348 1
+2687	3371 1
+2687	3548 1
+2702	72 1
+2702	204 1
+2702	290 1
+2702	425 1
+2702	1385 1
+2702	1437 1
+2702	1633 1
+2702	1680 1
+2702	1734 1
+2702	2135 1
+2702	2225 1
+2702	2251 1
+2702	2323 1
+2702	2338 1
+2702	2381 1
+2702	2398 1
+2702	2516 1
+2702	2565 1
+2702	2576 1
+2702	2592 1
+2702	2651 1
+2702	2708 1
+2702	2775 1
+2702	2830 1
+2702	2856 1
+2702	2880 1
+2702	2900 1
+2702	2928 1
+2702	2977 1
+2702	2979 1
+2702	2991 1
+2702	3018 1
+2702	3089 1
+2702	3099 1
+2702	3117 1
+2702	3140 1
+2702	3150 1
+2702	3164 1
+2702	3265 1
+2702	3276 1
+2702	3307 1
+2702	3319 1
+2702	3338 1
+2702	3351 1
+2702	3371 1
+2702	3408 1
+2702	3456 1
+2702	3459 1
+2702	3516 1
+2702	3537 1
+2702	3538 1
+2702	3755 1
+2702	3796 1
+2702	3813 1
+2702	3843 1
+2702	3976 1
+2702	4099 1
+2702	4127 1
+2702	4247 1
+2702	4276 1
+2702	4310 1
+2702	4547 1
+2702	4574 1
+2702	4953 1
+2702	4983 1
+2702	5044 1
+2702	5055 1
+2702	5092 1
+2702	5103 1
+2702	5204 1
+2702	5222 1
+2702	5285 1
+2702	5457 1
+2702	5484 1
+2702	5683 1
+2702	5705 1
+2702	5828 1
+2702	5863 1
+2702	5936 1
+2702	6124 1
+2703	204 1
+2703	285 1
+2703	633 1
+2703	856 1
+2703	1393 1
+2703	1571 1
+2703	1633 1
+2703	1679 1
+2703	1814 1
+2703	2016 1
+2703	2116 1
+2703	2135 1
+2703	2225 1
+2703	2231 1
+2703	2290 1
+2703	2297 1
+2703	2325 1
+2703	2338 1
+2703	2356 1
+2703	2398 1
+2703	2411 1
+2703	2416 1
+2703	2474 1
+2703	2542 1
+2703	2565 1
+2703	2576 1
+2703	2594 1
+2703	2623 1
+2703	2625 1
+2703	2651 1
+2703	2660 1
+2703	2700 1
+2703	2708 1
+2703	2713 1
+2703	2754 1
+2703	2819 1
+2703	2912 1
+2703	2951 1
+2703	3020 1
+2703	3021 1
+2703	3030 1
+2703	3251 1
+2703	3253 1
+2703	3265 1
+2703	3307 1
+2703	3319 1
+2703	3320 1
+2703	3324 1
+2703	3338 1
+2703	3351 1
+2703	3371 1
+2703	3376 1
+2703	3408 1
+2703	3409 1
+2703	3410 1
+2703	3429 1
+2703	3473 1
+2703	3489 1
+2703	3516 1
+2703	3538 1
+2703	8293 1
+2688	72 1
+2688	204 1
+2688	285 1
+2688	290 1
+2688	346 1
+2688	417 1
+2688	465 1
+2688	608 1
+2688	633 1
+2688	737 1
+2688	762 1
+2688	825 1
+2688	856 1
+2688	896 1
+2688	974 1
+2688	978 1
+2688	1024 1
+2688	1026 1
+2688	1100 1
+2688	1159 1
+2688	1166 1
+2688	1185 1
+2688	1239 1
+2688	1247 1
+2688	1267 1
+2688	1297 1
+2688	1305 1
+2688	1310 1
+2688	1352 1
+2688	1357 1
+2688	1360 1
+2688	1385 1
+2688	1393 1
+2688	1416 1
+2688	1437 1
+2688	1453 1
+2688	1473 1
+2688	1549 1
+2688	1571 1
+2688	1633 1
+2688	1648 1
+2688	1679 1
+2688	1680 1
+2688	1688 1
+2688	1706 1
+2688	1733 1
+2688	1734 1
+2688	1744 1
+2688	1754 1
+2688	1769 1
+2688	1777 1
+2688	1781 1
+2688	1792 1
+2688	1799 1
+2688	1814 1
+2688	1823 1
+2688	1919 1
+2688	1935 1
+2688	1961 1
+2688	1982 1
+2688	1984 1
+2688	2001 1
+2688	2014 1
+2688	2016 1
+2688	2066 1
+2688	2114 1
+2688	2116 1
+2688	2134 1
+2688	2135 1
+2688	2144 1
+2688	2145 1
+2688	2209 1
+2688	2210 1
+2688	2225 1
+2688	2231 1
+2688	2237 1
+2688	2240 1
+2688	2251 1
+2688	2252 1
+2688	2256 1
+2688	2257 1
+2688	2258 1
+2688	2276 1
+2688	2289 1
+2688	2290 1
+2688	2297 1
+2688	2307 1
+2688	2324 1
+2688	2325 1
+2688	2326 1
+2688	2328 1
+2688	2338 1
+2688	2354 1
+2688	2356 1
+2688	2364 1
+2688	2369 1
+2688	2371 1
+2688	2381 1
+2688	2384 1
+2688	2386 1
+2688	2398 1
+2688	2411 1
+2688	2433 1
+2688	2440 1
+2688	2456 1
+2688	2474 1
+2688	2485 1
+2688	2490 1
+2688	2507 1
+2688	2508 1
+2688	2510 1
+2688	2516 1
+2688	2535 1
+2688	2542 1
+2688	2544 1
+2688	2550 1
+2688	2565 1
+2688	2576 1
+2688	2585 1
+2688	2592 1
+2688	2593 1
+2688	2594 1
+2688	2595 1
+2688	2597 1
+2688	2605 1
+2688	2612 1
+2688	2617 1
+2688	2619 1
+2688	2620 1
+2688	2623 1
+2688	2625 1
+2688	2646 1
+2688	2651 1
+2688	2653 1
+2688	2654 1
+2688	2655 1
+2688	2657 1
+2688	2660 1
+2688	2662 1
+2688	2667 1
+2688	2674 1
+2688	2686 1
+2688	2687 1
+2688	2693 1
+2688	2696 1
+2688	2697 1
+2688	2700 1
+2688	2708 1
+2688	2713 1
+2688	2724 1
+2688	2727 1
+2688	2746 1
+2688	2747 1
+2688	2754 1
+2688	2760 1
+2688	2764 1
+2688	2765 1
+2688	2774 1
+2688	2775 1
+2688	2785 1
+2688	2787 1
+2688	2790 1
+2688	2799 1
+2688	2819 1
+2688	2822 1
+2688	2830 1
+2688	2831 1
+2688	2856 1
+2688	2859 1
+2688	2871 1
+2688	2900 1
+2688	2909 1
+2688	2912 1
+2688	2918 1
+2688	2923 1
+2688	2925 1
+2688	2932 1
+2688	2951 1
+2688	2958 1
+2688	2973 1
+2688	2974 1
+2688	2981 1
+2688	3002 1
+2688	3005 1
+2688	3007 1
+2688	3009 1
+2688	3010 1
+2688	3014 1
+2688	3015 1
+2688	3020 1
+2688	3021 1
+2688	3024 1
+2688	3026 1
+2688	3027 1
+2688	3028 1
+2688	3030 1
+2688	3033 1
+2688	3034 1
+2688	3050 1
+2688	3059 1
+2688	3080 1
+2688	3084 1
+2688	3089 1
+2688	3092 1
+2688	3099 1
+2688	3103 1
+2688	3104 1
+2688	3114 1
+2688	3125 1
+2688	3130 1
+2688	3140 1
+2688	3144 1
+2688	3145 1
+2688	3148 1
+2688	3150 1
+2688	3155 1
+2688	3164 1
+2688	3173 1
+2688	3191 1
+2688	3192 1
+2688	3200 1
+2688	3243 1
+2688	3251 1
+2688	3253 1
+2688	3258 1
+2688	3260 1
+2688	3265 1
+2688	3271 1
+2688	3276 1
+2688	3284 1
+2688	3285 1
+2688	3291 1
+2688	3307 1
+2688	3309 1
+2688	3319 1
+2688	3320 1
+2688	3321 1
+2688	3324 1
+2688	3334 1
+2688	3338 1
+2688	3351 1
+2688	3352 1
+2688	3376 1
+2688	3393 1
+2688	3394 1
+2688	3404 1
+2688	3408 1
+2688	3417 1
+2688	3439 1
+2688	3443 1
+2688	3447 1
+2688	3452 1
+2688	3453 1
+2688	3454 1
+2688	3456 1
+2688	3458 1
+2688	3459 1
+2688	3460 1
+2688	3463 1
+2688	3473 1
+2688	3479 1
+2688	3480 1
+2688	3483 1
+2688	3489 1
+2688	3498 1
+2688	3506 1
+2688	3516 1
+2688	3520 1
+2688	3529 1
+2688	3537 1
+2688	3538 1
+2688	3541 1
+2688	3547 1
+2688	3548 1
+2688	3549 1
+2688	3554 1
+2688	3555 1
+2688	3557 1
+2688	3562 1
+2688	3568 1
+2688	3576 1
+2688	3580 1
+2688	3586 1
+2688	3587 1
+2688	3607 1
+2688	3609 1
+2688	3614 1
+2688	3615 1
+2688	3616 1
+2688	3631 1
+2688	3634 1
+2688	3635 1
+2688	3643 1
+2688	3645 1
+2688	3646 1
+2688	3661 1
+2688	3664 1
+2688	3670 1
+2688	3680 1
+2688	3681 1
+2688	3691 1
+2688	3720 1
+2688	3724 1
+2688	3748 1
+2688	3769 1
+2688	3772 1
+2688	3792 1
+2688	3796 1
+2688	3800 1
+2688	3803 1
+2688	3804 1
+2688	3806 1
+2688	3807 1
+2688	3812 1
+2688	3813 1
+2688	3835 1
+2688	3843 1
+2688	3847 1
+2688	3849 1
+2688	3854 1
+2688	3873 1
+2688	3888 1
+2688	3892 1
+2688	3897 1
+2688	3898 1
+2688	3903 1
+2688	3910 1
+2688	3919 1
+2688	3922 1
+2688	3926 1
+2688	3933 1
+2688	3937 1
+2688	3956 1
+2688	3958 1
+2688	3970 1
+2688	3973 1
+2688	3976 1
+2688	4011 1
+2688	4012 1
+2688	4013 1
+2688	4021 1
+2688	4037 1
+2688	4041 1
+2688	4044 1
+2688	4055 1
+2688	4098 1
+2688	4099 1
+2688	4103 1
+2688	4110 1
+2688	4124 1
+2688	4162 1
+2688	4173 1
+2688	4175 1
+2688	4179 1
+2688	4191 1
+2688	4212 1
+2688	4219 1
+2688	4233 1
+2688	4247 1
+2688	4256 1
+2688	4261 1
+2688	4263 1
+2688	4266 1
+2688	4269 1
+2688	4276 1
+2688	4297 1
+2688	4298 1
+2688	4299 1
+2688	4310 1
+2688	4315 1
+2688	4335 1
+2688	4338 1
+2688	4355 1
+2688	4373 1
+2688	4384 1
+2688	4400 1
+2688	4417 1
+2688	4424 1
+2688	4448 1
+2688	4453 1
+2688	4463 1
+2688	4468 1
+2688	4480 1
+2688	4482 1
+2688	4485 1
+2688	4488 1
+2688	4500 1
+2688	4510 1
+2688	4527 1
+2688	4528 1
+2688	4529 1
+2688	4530 1
+2688	4531 1
+2688	4534 1
+2688	4536 1
+2688	4547 1
+2688	4551 1
+2688	4552 1
+2688	4557 1
+2688	4558 1
+2688	4574 1
+2688	4578 1
+2688	4583 1
+2688	4587 1
+2688	4588 1
+2688	4600 1
+2688	4604 1
+2688	4620 1
+2688	4645 1
+2688	4646 1
+2688	4650 1
+2688	4653 1
+2688	4661 1
+2688	4662 1
+2688	4677 1
+2688	4687 1
+2688	4689 1
+2688	4706 1
+2688	4709 1
+2688	4712 1
+2688	4713 1
+2688	4715 1
+2688	4717 1
+2688	4719 1
+2688	4764 1
+2688	4781 1
+2688	4792 1
+2688	4795 1
+2688	4796 1
+2688	4798 1
+2688	4808 1
+2688	4811 1
+2688	4814 1
+2688	4815 1
+2688	4820 1
+2688	4822 1
+2688	4824 1
+2688	4827 1
+2688	4828 1
+2688	4846 1
+2688	4875 1
+2688	4899 1
+2688	4929 1
+2688	4953 1
+2688	4954 1
+2688	4962 1
+2688	4964 1
+2688	4977 1
+2688	4983 1
+2688	4986 1
+2688	4993 1
+2688	4999 1
+2688	5026 1
+2688	5055 1
+2688	5061 1
+2688	5072 1
+2688	5073 1
+2688	5092 1
+2688	5100 1
+2688	5103 1
+2688	5106 1
+2688	5115 1
+2688	5123 1
+2688	5130 1
+2688	5132 1
+2688	5141 1
+2688	5144 1
+2688	5155 1
+2688	5162 1
+2688	5176 1
+2688	5178 1
+2688	5179 1
+2688	5182 1
+2688	5188 1
+2688	5189 1
+2688	5200 1
+2688	5204 1
+2688	5215 1
+2688	5222 1
+2688	5226 1
+2688	5231 1
+2688	5239 1
+2688	5254 1
+2688	5262 1
+2688	5263 1
+2688	5273 1
+2688	5285 1
+2688	5288 1
+2688	5295 1
+2688	5305 1
+2688	5308 1
+2688	5321 1
+2688	5323 1
+2688	5327 1
+2688	5335 1
+2688	5341 1
+2688	5368 1
+2688	5392 1
+2688	5404 1
+2688	5412 1
+2688	5423 1
+2688	5426 1
+2688	5430 1
+2688	5437 1
+2688	5445 1
+2688	5449 1
+2688	5452 1
+2688	5454 1
+2688	5457 1
+2688	5459 1
+2688	5470 1
+2688	5484 1
+2688	5506 1
+2688	5509 1
+2688	5513 1
+2688	5514 1
+2688	5524 1
+2688	5527 1
+2688	5539 1
+2688	5543 1
+2688	5545 1
+2688	5559 1
+2688	5563 1
+2688	5596 1
+2688	5620 1
+2688	5624 1
+2688	5626 1
+2688	5630 1
+2688	5637 1
+2688	5638 1
+2688	5639 1
+2688	5640 1
+2688	5651 1
+2688	5683 1
+2688	5693 1
+2688	5697 1
+2688	5732 1
+2688	5737 1
+2688	5739 1
+2688	5743 1
+2688	5753 1
+2688	5756 1
+2688	5775 1
+2688	5780 1
+2688	5784 1
+2688	5790 1
+2688	5800 1
+2688	5814 1
+2688	5817 1
+2688	5824 1
+2688	5827 1
+2688	5828 1
+2688	5829 1
+2688	5837 1
+2688	5844 1
+2688	5848 1
+2688	5860 1
+2688	5863 1
+2688	5871 1
+2688	5872 1
+2688	5886 1
+2688	5891 1
+2688	5925 1
+2688	5928 1
+2688	5950 1
+2688	5994 1
+2688	6023 1
+2688	6029 1
+2688	6047 1
+2688	6094 1
+2688	6124 1
+2688	6156 1
+2688	6161 1
+2688	6166 1
+2688	6221 1
+2688	6226 1
+2688	6227 1
+2688	6229 1
+2688	6246 1
+2688	6251 1
+2688	6262 1
+2688	6272 1
+2688	6296 1
+2688	6302 1
+2688	6306 1
+2688	6334 1
+2688	6337 1
+2688	6407 1
+2688	6417 1
+2688	6458 1
+2688	6501 1
+2688	6505 1
+2688	6529 1
+2688	6560 1
+2688	6576 1
+2688	6589 1
+2688	6595 1
+2688	6599 1
+2688	6600 1
+2688	6624 1
+2688	6632 1
+2688	6665 1
+2688	6700 1
+2688	6739 1
+2688	6777 1
+2688	6783 1
+2688	6803 1
+2688	6809 1
+2688	6833 1
+2688	6850 1
+2688	6855 1
+2688	6869 1
+2688	6873 1
+2688	6897 1
+2688	6901 1
+2688	8293 1
+2688	8294 1
+2688	8295 1
+2704	290 1
+2704	633 1
+2704	856 1
+2704	1157 1
+2704	1267 1
+2704	1393 1
+2704	1437 1
+2704	1723 1
+2704	1754 1
+2704	1814 1
+2704	1837 1
+2704	1919 1
+2704	2135 1
+2704	2225 1
+2704	2231 1
+2704	2237 1
+2704	2251 1
+2704	2256 1
+2704	2324 1
+2704	2325 1
+2704	2356 1
+2704	2371 1
+2704	2375 1
+2704	2411 1
+2704	2416 1
+2704	2516 1
+2704	2550 1
+2704	2576 1
+2704	2585 1
+2704	2625 1
+2704	2654 1
+2704	2662 1
+2704	2693 1
+2704	2697 1
+2704	2708 1
+2704	2724 1
+2704	2838 1
+2704	2856 1
+2704	2900 1
+2704	2918 1
+2704	2926 1
+2704	2951 1
+2704	2991 1
+2704	2993 1
+2704	3033 1
+2704	3034 1
+2704	3056 1
+2704	3099 1
+2704	3104 1
+2704	3117 1
+2704	3126 1
+2704	3140 1
+2704	3145 1
+2704	3150 1
+2704	3155 1
+2704	3164 1
+2704	3235 1
+2704	3243 1
+2704	3251 1
+2704	3265 1
+2704	3307 1
+2704	3320 1
+2704	3324 1
+2704	3348 1
+2704	3538 1
+2704	3650 1
+2704	4263 1
+2704	4574 1
+2704	4648 1
+2704	5072 1
+2704	5445 1
+2704	5482 1
+2704	5693 1
+2704	5850 1
+2704	6229 1
+2660	72 1
+2660	204 1
+2660	285 1
+2660	417 1
+2660	633 1
+2660	737 1
+2660	762 1
+2660	825 1
+2660	856 1
+2660	1140 1
+2660	1157 1
+2660	1166 1
+2660	1267 1
+2660	1360 1
+2660	1393 1
+2660	1633 1
+2660	1734 1
+2660	1744 1
+2660	1754 1
+2660	1781 1
+2660	1814 1
+2660	1990 1
+2660	2066 1
+2660	2114 1
+2660	2116 1
+2660	2135 1
+2660	2144 1
+2660	2145 1
+2660	2210 1
+2660	2231 1
+2660	2252 1
+2660	2323 1
+2660	2324 1
+2660	2325 1
+2660	2328 1
+2660	2356 1
+2660	2381 1
+2660	2398 1
+2660	2411 1
+2660	2474 1
+2660	2485 1
+2660	2506 1
+2660	2510 1
+2660	2516 1
+2660	2542 1
+2660	2550 1
+2660	2576 1
+2660	2592 1
+2660	2593 1
+2660	2594 1
+2660	2597 1
+2660	2605 1
+2660	2625 1
+2660	2651 1
+2660	2653 1
+2660	2654 1
+2660	2657 1
+2660	2686 1
+2660	2693 1
+2660	2697 1
+2660	2708 1
+2660	2713 1
+2660	2747 1
+2660	2754 1
+2660	2787 1
+2660	2819 1
+2660	2830 1
+2660	2831 1
+2660	2856 1
+2660	2871 1
+2660	2900 1
+2660	2912 1
+2660	2918 1
+2660	2951 1
+2660	3005 1
+2660	3010 1
+2660	3014 1
+2660	3018 1
+2660	3020 1
+2660	3027 1
+2660	3030 1
+2660	3089 1
+2660	3114 1
+2660	3125 1
+2660	3150 1
+2660	3192 1
+2660	3235 1
+2660	3251 1
+2660	3265 1
+2660	3285 1
+2660	3291 1
+2660	3320 1
+2660	3324 1
+2660	3352 1
+2660	3394 1
+2660	3408 1
+2660	3410 1
+2660	3435 1
+2660	3439 1
+2660	3443 1
+2660	3459 1
+2660	3464 1
+2660	3473 1
+2660	3480 1
+2660	3506 1
+2660	3516 1
+2660	3529 1
+2660	3537 1
+2660	3541 1
+2660	3580 1
+2660	3587 1
+2660	3607 1
+2660	3670 1
+2660	3752 1
+2660	3807 1
+2660	3843 1
+2660	3871 1
+2660	3873 1
+2660	3887 1
+2660	4044 1
+2660	4110 1
+2660	4261 1
+2660	4365 1
+2660	4373 1
+2660	4424 1
+2660	4463 1
+2660	4485 1
+2660	4510 1
+2660	4528 1
+2660	4574 1
+2660	4613 1
+2660	4712 1
+2660	4717 1
+2660	4792 1
+2660	4797 1
+2660	4980 1
+2660	5020 1
+2660	5123 1
+2660	5182 1
+2660	5210 1
+2660	5254 1
+2660	5423 1
+2660	5459 1
+2660	5482 1
+2660	5683 1
+2660	5732 1
+2660	5773 1
+2660	5790 1
+2660	5828 1
+2660	5837 1
+2660	5863 1
+2660	6262 1
+2660	6417 1
+2660	6553 1
+2660	6594 1
+2660	6833 1
+2660	6840 1
+2660	6869 1
+2660	6873 1
+2660	7063 1
+2660	7115 1
+2660	7809 1
+2660	7855 1
+2660	8141 1
+2689	737 1
+2689	1297 1
+2689	1799 1
+2689	2257 1
+2689	2325 1
+2689	2398 1
+2689	2485 1
+2689	2657 1
+2689	2700 1
+2689	2708 1
+2689	2958 1
+2689	3010 1
+2689	3024 1
+2689	3089 1
+2689	3265 1
+2689	3284 1
+2689	3456 1
+2689	3529 1
+2689	3812 1
+2689	3946 1
+2689	4138 1
+2689	4247 1
+2689	4435 1
+2689	5055 1
+2689	5092 1
+2689	5100 1
+2689	5155 1
+2689	5253 1
+2689	5412 1
+2689	5452 1
+2689	5454 1
+2689	5650 1
+2689	5886 1
+2689	5891 1
+2689	6833 1
+2689	7874 1
+2689	7910 1
+2689	7961 1
+2667	15 1
+2667	633 1
+2667	737 1
+2667	1159 1
+2667	1548 1
+2667	1799 1
+2667	2276 1
+2667	2325 1
+2667	2398 1
+2667	2474 1
+2667	2507 1
+2667	2651 1
+2667	2708 1
+2667	2764 1
+2667	2765 1
+2667	2774 1
+2667	2831 1
+2667	2914 1
+2667	2925 1
+2667	3015 1
+2667	3089 1
+2667	3092 1
+2667	3106 1
+2667	3191 1
+2667	3265 1
+2667	3393 1
+2667	3456 1
+2667	3479 1
+2667	3554 1
+2667	3586 1
+2667	3614 1
+2667	3643 1
+2667	3691 1
+2667	3897 1
+2667	4041 1
+2667	4175 1
+2667	4191 1
+2667	4247 1
+2667	4276 1
+2667	4310 1
+2667	4483 1
+2667	4600 1
+2667	4666 1
+2667	4687 1
+2667	4712 1
+2667	4715 1
+2667	4781 1
+2667	4786 1
+2667	4795 1
+2667	4798 1
+2667	4828 1
+2667	4846 1
+2667	4929 1
+2667	4964 1
+2667	4980 1
+2667	5103 1
+2667	5121 1
+2667	5123 1
+2667	5176 1
+2667	5179 1
+2667	5189 1
+2667	5200 1
+2667	5233 1
+2667	5239 1
+2667	5245 1
+2667	5301 1
+2667	5437 1
+2667	5439 1
+2667	5449 1
+2667	5452 1
+2667	5463 1
+2667	5482 1
+2667	5484 1
+2667	5506 1
+2667	5509 1
+2667	5511 1
+2667	5524 1
+2667	5527 1
+2667	5543 1
+2667	5545 1
+2667	5563 1
+2667	5564 1
+2667	5568 1
+2667	5620 1
+2667	5624 1
+2667	5630 1
+2667	5635 1
+2667	5638 1
+2667	5684 1
+2667	5738 1
+2667	5753 1
+2667	5798 1
+2667	5804 1
+2667	5886 1
+2667	5891 1
+2667	5936 1
+2667	5963 1
+2667	5994 1
+2667	6006 1
+2667	6029 1
+2667	6078 1
+2667	6094 1
+2667	6096 1
+2667	6098 1
+2667	6105 1
+2667	6111 1
+2667	6124 1
+2667	6148 1
+2667	6151 1
+2667	6166 1
+2667	6218 1
+2667	6229 1
+2667	6327 1
+2667	6328 1
+2667	6334 1
+2667	6337 1
+2667	6360 1
+2667	6388 1
+2667	6400 1
+2667	6407 1
+2667	6409 1
+2667	6414 1
+2667	6422 1
+2667	6432 1
+2667	6437 1
+2667	6441 1
+2690	633 1
+2690	856 1
+2690	1267 1
+2690	1357 1
+2690	1679 1
+2690	1754 1
+2690	1814 1
+2690	2116 1
+2690	2225 1
+2690	2231 1
+2690	2325 1
+2690	2356 1
+2690	2550 1
+2690	2593 1
+2690	2625 1
+2690	2651 1
+2690	2654 1
+2690	2662 1
+2690	2708 1
+2690	2713 1
+2690	3117 1
+2690	3164 1
+2690	3253 1
+2690	3255 1
+2690	3258 1
+2690	3435 1
+2691	1297 1
+2691	1357 1
+2691	1799 1
+2691	1961 1
+2691	2134 1
+2691	2324 1
+2691	2328 1
+2691	2398 1
+2691	2485 1
+2691	2508 1
+2691	2535 1
+2691	2565 1
+2691	2576 1
+2691	2625 1
+2691	2658 1
+2691	2660 1
+2691	2700 1
+2691	2708 1
+2691	2727 1
+2691	2859 1
+2691	2871 1
+2691	2912 1
+2691	2958 1
+2691	3014 1
+2691	3092 1
+2691	3103 1
+2691	3106 1
+2691	3117 1
+2691	3125 1
+2691	3130 1
+2691	3291 1
+2691	3352 1
+2691	3568 1
+2691	3892 1
+2691	3976 1
+2691	4098 1
+2691	4510 1
+2691	4527 1
+2691	5404 1
+2691	5459 1
+2691	5757 1
+2691	5817 1
+2691	5828 1
+2691	8293 1
+2692	1393 1
+2692	1633 1
+2692	2135 1
+2692	2325 1
+2692	2338 1
+2692	2576 1
+2692	2625 1
+2692	2651 1
+2692	2700 1
+2692	2708 1
+2692	2713 1
+2692	2951 1
+2692	3030 1
+2692	3265 1
+2692	3307 1
+2692	3324 1
+2692	3338 1
+2692	3408 1
+2692	8293 1
+2693	15 1
+2693	204 1
+2693	285 1
+2693	417 1
+2693	737 1
+2693	856 1
+2693	896 1
+2693	1024 1
+2693	1026 1
+2693	1166 1
+2693	1239 1
+2693	1310 1
+2693	1416 1
+2693	1549 1
+2693	1571 1
+2693	1633 1
+2693	1744 1
+2693	1792 1
+2693	1990 1
+2693	2066 1
+2693	2134 1
+2693	2209 1
+2693	2252 1
+2693	2289 1
+2693	2290 1
+2693	2297 1
+2693	2324 1
+2693	2328 1
+2693	2354 1
+2693	2371 1
+2693	2381 1
+2693	2411 1
+2693	2416 1
+2693	2426 1
+2693	2433 1
+2693	2485 1
+2693	2510 1
+2693	2516 1
+2693	2542 1
+2693	2550 1
+2693	2576 1
+2693	2585 1
+2693	2594 1
+2693	2597 1
+2693	2625 1
+2693	2651 1
+2693	2653 1
+2693	2654 1
+2693	2657 1
+2693	2667 1
+2693	2708 1
+2693	2747 1
+2693	2774 1
+2693	2787 1
+2693	2819 1
+2693	2822 1
+2693	2831 1
+2693	2932 1
+2693	2958 1
+2693	2973 1
+2693	3002 1
+2693	3005 1
+2693	3007 1
+2693	3009 1
+2693	3010 1
+2693	3014 1
+2693	3018 1
+2693	3021 1
+2693	3030 1
+2693	3092 1
+2693	3106 1
+2693	3114 1
+2693	3117 1
+2693	3148 1
+2693	3351 1
+2693	3352 1
+2693	3371 1
+2693	3408 1
+2693	3435 1
+2693	3439 1
+2693	3443 1
+2693	3447 1
+2693	3456 1
+2693	3459 1
+2693	3473 1
+2693	3516 1
+2693	3529 1
+2693	3537 1
+2693	3549 1
+2693	3562 1
+2693	3568 1
+2693	3580 1
+2693	3587 1
+2693	3607 1
+2693	3615 1
+2693	3643 1
+2693	3660 1
+2693	3664 1
+2693	3792 1
+2693	3813 1
+2693	3843 1
+2693	3910 1
+2693	4037 1
+2693	4134 1
+2693	4179 1
+2693	4191 1
+2693	4201 1
+2693	4247 1
+2693	4263 1
+2693	4276 1
+2693	4290 1
+2693	4448 1
+2693	4547 1
+2693	4687 1
+2693	4709 1
+2693	4735 1
+2693	4811 1
+2693	4953 1
+2693	4980 1
+2693	5026 1
+2693	5130 1
+2693	5144 1
+2693	5200 1
+2693	5204 1
+2693	5254 1
+2693	5375 1
+2693	5449 1
+2693	5543 1
+2693	5714 1
+2693	5739 1
+2693	5780 1
+2693	5804 1
+2693	5818 1
+2693	5891 1
+2693	5936 1
+2693	6004 1
+2693	6330 1
+2693	6347 1
+2693	6496 1
+2693	6566 1
+2693	6595 1
+2693	6613 1
+2693	6790 1
+2693	6855 1
+2693	6869 1
+2693	6901 1
+2693	6955 1
+2693	8293 1
+2693	8295 1
+2705	2708 1
+2706	856 1
+2706	1814 1
+2706	2325 1
+2706	2565 1
+2706	2597 1
+2706	2700 1
+2706	2708 1
+2706	2973 1
+2706	3007 1
+2706	3243 1
+2706	3307 1
+2706	3324 1
+2706	3352 1
+2706	3408 1
+2706	3489 1
+2706	3537 1
+2706	3587 1
+2706	8293 1
+2694	417 1
+2694	2398 1
+2694	2474 1
+2694	2592 1
+2694	2651 1
+2694	2708 1
+2694	2790 1
+2694	3334 1
+2694	3456 1
+2694	4191 1
+2694	4735 1
+2694	5295 1
+2694	5335 1
+2694	5412 1
+2694	5605 1
+2694	7618 1
+2694	7620 1
+2694	7862 1
+2695	2325 1
+2695	2651 1
+2695	2653 1
+2695	2667 1
+2695	2708 1
+2695	3720 1
+2695	8294 1
+2696	633 1
+2696	737 1
+2696	762 1
+2696	856 1
+2696	1185 1
+2696	1267 1
+2696	1393 1
+2696	1688 1
+2696	1799 1
+2696	2135 1
+2696	2144 1
+2696	2225 1
+2696	2237 1
+2696	2325 1
+2696	2328 1
+2696	2354 1
+2696	2356 1
+2696	2485 1
+2696	2576 1
+2696	2625 1
+2696	2651 1
+2696	2653 1
+2696	2708 1
+2696	2713 1
+2696	2790 1
+2696	2909 1
+2696	2912 1
+2696	3020 1
+2696	3021 1
+2696	3026 1
+2696	3059 1
+2696	3125 1
+2696	3144 1
+2696	3173 1
+2696	3192 1
+2696	3251 1
+2696	3274 1
+2696	3320 1
+2696	3324 1
+2696	3338 1
+2696	3352 1
+2696	3435 1
+2696	3456 1
+2696	3537 1
+2696	3568 1
+2696	3661 1
+2696	3748 1
+2696	3796 1
+2696	3854 1
+2696	4099 1
+2696	4124 1
+2696	4191 1
+2696	4256 1
+2696	4261 1
+2696	4335 1
+2696	4411 1
+2696	4578 1
+2696	4653 1
+2696	4662 1
+2696	5026 1
+2696	5452 1
+2696	5459 1
+2696	5743 1
+2696	6148 1
+2697	974 1
+2697	1297 1
+2697	1549 1
+2697	1633 1
+2697	1769 1
+2697	2066 1
+2697	2134 1
+2697	2144 1
+2697	2231 1
+2697	2323 1
+2697	2326 1
+2697	2328 1
+2697	2411 1
+2697	2535 1
+2697	2544 1
+2697	2565 1
+2697	2585 1
+2697	2619 1
+2697	2625 1
+2697	2654 1
+2697	2657 1
+2697	2708 1
+2697	2775 1
+2697	2790 1
+2697	2900 1
+2697	2996 1
+2697	3005 1
+2697	3024 1
+2697	3026 1
+2697	3030 1
+2697	3084 1
+2697	3192 1
+2697	3253 1
+2697	3260 1
+2697	3537 1
+2697	3562 1
+2697	3615 1
+2697	3635 1
+2697	3650 1
+2697	4055 1
+2697	4124 1
+2697	4247 1
+2697	4256 1
+2697	4290 1
+2697	6976 1
+2698	1633 1
+2698	2144 1
+2698	2297 1
+2698	2325 1
+2698	2356 1
+2698	2651 1
+2698	2660 1
+2698	2700 1
+2698	2708 1
+2698	2799 1
+2698	3009 1
+2698	3020 1
+2698	3030 1
+2698	3516 1
+2698	3548 1
+2709	1564 1
+2711	762 1
+2711	1166 1
+2711	1564 1
+2711	1990 1
+2711	2144 1
+2711	2307 1
+2711	2506 1
+2711	2660 1
+2711	3089 1
+2711	3537 1
+2711	3548 1
+2711	3549 1
+2711	3822 1
+2715	1384 1
+2715	4179 1
+2716	1384 1
+2717	1384 1
+2718	1384 1
+2719	765 1
+2719	1049 1
+2719	1549 1
+2719	1637 1
+2719	1729 1
+2719	1808 1
+2719	2134 1
+2719	2252 1
+2719	2328 1
+2719	2544 1
+2719	2594 1
+2719	2653 1
+2719	2720 1
+2719	2958 1
+2719	3180 1
+2719	3307 1
+2719	3351 1
+2719	3562 1
+2719	4162 1
+2719	4323 1
+2719	8293 1
+2721	1049 1
+2721	2963 1
+2722	1049 1
+2723	1049 1
+2724	1049 1
+2724	1777 1
+2724	2973 1
+2724	2974 1
+2724	3200 1
+2724	3439 1
+2724	3629 1
+2724	3772 1
+2724	3804 1
+2724	3847 1
+2725	1049 1
+2727	737 1
+2727	1211 1
+2727	1357 1
+2727	1521 1
+2727	1754 1
+2727	1918 1
+2727	2251 1
+2727	2289 1
+2727	2297 1
+2727	2328 1
+2727	2474 1
+2727	2485 1
+2727	2510 1
+2727	2585 1
+2727	2593 1
+2727	2653 1
+2727	2958 1
+2727	3007 1
+2727	3014 1
+2727	3028 1
+2727	3265 1
+2727	3276 1
+2727	3404 1
+2727	3456 1
+2727	3516 1
+2727	3529 1
+2727	4099 1
+2727	4162 1
+2727	4256 1
+2727	4323 1
+2727	4400 1
+2727	4551 1
+2727	5254 1
+2728	1154 1
+2728	1521 1
+2728	8291 1
+2730	1374 1
+2730	3755 1
+2731	3755 1
+2733	2206 1
+2733	2237 1
+2733	3755 1
+2729	3755 1
+2734	3755 1
+2736	1374 1
+2737	290 1
+2737	856 1
+2737	1374 1
+2737	2135 1
+2737	2398 1
+2737	2651 1
+2737	3089 1
+2737	3106 1
+2737	3253 1
+2737	3309 1
+2737	3443 1
+2737	3516 1
+2737	4510 1
+2737	4820 1
+2737	5073 1
+2737	5288 1
+2738	1374 1
+2738	5179 1
+2738	7423 1
+2739	1374 1
+2740	403 1
+2740	765 1
+2740	1154 1
+2740	1374 1
+2740	1637 1
+2740	1646 1
+2740	1653 1
+2740	2102 1
+2740	2120 1
+2740	2410 1
+2740	2560 1
+2740	2618 1
+2740	2693 1
+2740	2754 1
+2740	2768 1
+2740	2785 1
+2740	2805 1
+2740	2809 1
+2740	2814 1
+2740	2828 1
+2740	2834 1
+2740	2922 1
+2740	2973 1
+2740	3200 1
+2740	3520 1
+2740	3803 1
+2740	3804 1
+2740	3807 1
+2741	2736 1
+2744	15 1
+2744	72 1
+2744	896 1
+2744	1026 1
+2744	1154 1
+2744	1637 1
+2744	2416 1
+2744	2490 1
+2744	2535 1
+2744	2618 1
+2744	2781 1
+2744	2785 1
+2744	2787 1
+2744	2918 1
+2744	4175 1
+2744	4335 1
+2744	4574 1
+2744	4709 1
+2744	5020 1
+2744	5254 1
+2744	5263 1
+2744	5482 1
+2744	5511 1
+2744	5639 1
+2744	5640 1
+2744	5683 1
+2744	5784 1
+2744	5860 1
+2744	5872 1
+2744	5936 1
+2744	5973 1
+2744	5994 1
+2744	6006 1
+2744	6021 1
+2744	6094 1
+2744	6148 1
+2744	6229 1
+2744	6246 1
+2744	6251 1
+2747	974 1
+2747	1100 1
+2747	1297 1
+2747	1729 1
+2747	1744 1
+2747	2145 1
+2747	2257 1
+2747	2289 1
+2747	2290 1
+2747	2328 1
+2747	2411 1
+2747	2485 1
+2747	2510 1
+2747	2565 1
+2747	2585 1
+2747	2618 1
+2747	2625 1
+2747	2651 1
+2747	2654 1
+2747	2657 1
+2747	2674 1
+2747	2687 1
+2747	2693 1
+2747	2746 1
+2747	2900 1
+2747	2923 1
+2747	2973 1
+2747	2974 1
+2747	3005 1
+2747	3007 1
+2747	3010 1
+2747	3024 1
+2747	3026 1
+2747	3114 1
+2747	3117 1
+2747	3125 1
+2747	3148 1
+2747	3200 1
+2747	3258 1
+2747	3260 1
+2747	3265 1
+2747	3291 1
+2747	3320 1
+2747	3352 1
+2747	3394 1
+2747	3404 1
+2747	3439 1
+2747	3480 1
+2747	3483 1
+2747	3516 1
+2747	3529 1
+2747	3568 1
+2747	3576 1
+2747	3580 1
+2747	3650 1
+2747	3670 1
+2747	3680 1
+2747	3681 1
+2747	3769 1
+2747	3772 1
+2747	3776 1
+2747	3785 1
+2747	3800 1
+2747	3807 1
+2747	3892 1
+2747	4021 1
+2747	4051 1
+2747	4191 1
+2747	4199 1
+2747	4233 1
+2747	4247 1
+2747	4365 1
+2747	4384 1
+2747	4402 1
+2747	4480 1
+2747	4485 1
+2747	4735 1
+2747	4811 1
+2747	5144 1
+2746	825 1
+2746	1549 1
+2746	2066 1
+2746	2102 1
+2746	2256 1
+2746	2328 1
+2746	2340 1
+2746	2474 1
+2746	2585 1
+2746	2594 1
+2746	2595 1
+2746	2618 1
+2746	2651 1
+2746	2781 1
+2746	2814 1
+2746	2825 1
+2746	2844 1
+2746	2923 1
+2746	2958 1
+2746	3171 1
+2746	3265 1
+2746	3562 1
+2746	3843 1
+2746	4021 1
+2746	4528 1
+2748	1637 1
+2749	1637 1
+2752	15 1
+2752	290 1
+2752	1744 1
+2752	2398 1
+2752	2754 1
+2752	3456 1
+2752	5254 1
+2753	2754 1
+2755	8291 1
+2757	56 1
+2757	1653 1
+2757	2102 1
+2757	2654 1
+2757	2770 1
+2759	2763 1
+2760	15 1
+2760	72 1
+2760	1385 1
+2760	2066 1
+2760	2145 1
+2760	2258 1
+2760	2398 1
+2760	2516 1
+2760	2763 1
+2760	3787 1
+2760	4099 1
+2760	4600 1
+2760	4828 1
+2760	5002 1
+2760	5083 1
+2760	5100 1
+2760	5311 1
+2760	5412 1
+2760	5449 1
+2760	5482 1
+2760	5784 1
+2760	5828 1
+2760	5850 1
+2761	2763 1
+2762	762 1
+2762	2654 1
+2762	2763 1
+2764	1646 1
+2765	762 1
+2765	765 1
+2765	1646 1
+2765	1729 1
+2765	2144 1
+2765	2257 1
+2765	2273 1
+2765	2511 1
+2765	2544 1
+2765	2612 1
+2765	2764 1
+2765	2819 1
+2765	2859 1
+2765	3117 1
+2765	3634 1
+2765	3897 1
+2765	4600 1
+2765	4719 1
+2765	4875 1
+2765	5341 1
+2765	5452 1
+2765	5482 1
+2765	5584 1
+2765	5973 1
+2765	6227 1
+2765	6441 1
+2765	7047 1
+2765	7649 1
+2765	7965 1
+2766	1646 1
+2767	1646 1
+2768	425 1
+2768	1291 1
+2768	1419 1
+2768	1596 1
+2768	1646 1
+2768	1705 1
+2768	1723 1
+2768	1808 1
+2768	2053 1
+2768	2120 1
+2768	2174 1
+2768	2264 1
+2768	2323 1
+2768	2375 1
+2768	2416 1
+2768	2542 1
+2768	2547 1
+2768	2560 1
+2768	2599 1
+2768	2646 1
+2768	2707 1
+2768	2721 1
+2768	2799 1
+2768	2805 1
+2768	2809 1
+2768	2815 1
+2768	2834 1
+2768	2877 1
+2768	2902 1
+2768	2918 1
+2768	2922 1
+2768	2926 1
+2768	2928 1
+2768	2946 1
+2768	2963 1
+2768	2968 1
+2768	2972 1
+2768	2979 1
+2768	2990 1
+2768	2999 1
+2770	4110 1
+2771	2770 1
+2769	2770 1
+2772	1592 1
+2773	1592 1
+2774	15 1
+2774	1297 1
+2774	1310 1
+2774	1403 1
+2774	1416 1
+2774	1592 1
+2774	1705 1
+2774	1706 1
+2774	1918 1
+2774	2114 1
+2774	2323 1
+2774	2328 1
+2774	2474 1
+2774	2506 1
+2774	2535 1
+2774	2660 1
+2774	2775 1
+2774	2801 1
+2774	3084 1
+2774	3089 1
+2774	3238 1
+2774	3309 1
+2774	3456 1
+2774	3480 1
+2774	3897 1
+2774	3976 1
+2774	4055 1
+2774	4071 1
+2774	4110 1
+2774	4261 1
+2774	4646 1
+2774	4735 1
+2774	5079 1
+2774	5121 1
+2774	5123 1
+2774	5262 1
+2774	5529 1
+2774	5624 1
+2774	5828 1
+2774	6006 1
+2774	6347 1
+2774	6437 1
+2774	6832 1
+2774	7510 1
+2774	7632 1
+2774	7795 1
+2775	15 1
+2775	1633 1
+2775	1799 1
+2775	2120 1
+2775	2174 1
+2775	2285 1
+2775	2297 1
+2775	2328 1
+2775	2410 1
+2775	2440 1
+2775	2576 1
+2775	2660 1
+2775	2777 1
+2775	2871 1
+2775	3034 1
+2775	3089 1
+2775	3352 1
+2775	3394 1
+2775	3443 1
+2775	3456 1
+2775	3568 1
+2775	4191 1
+2775	4266 1
+2775	4384 1
+2775	4604 1
+2775	4689 1
+2775	4717 1
+2775	4981 1
+2775	5100 1
+2775	5123 1
+2775	5182 1
+2775	5273 1
+2775	5412 1
+2775	5886 1
+2775	6437 1
+2776	2777 1
+2778	155 1
+2778	214 1
+2778	425 1
+2778	762 1
+2778	1211 1
+2778	2053 1
+2778	2416 1
+2778	2433 1
+2778	2781 1
+2778	2787 1
+2778	2801 1
+2778	2821 1
+2778	2877 1
+2778	2880 1
+2778	2946 1
+2778	2972 1
+2778	3724 1
+2778	4173 1
+2778	4510 1
+2778	5323 1
+2778	5683 1
+2778	5812 1
+2779	2781 1
+2780	2560 1
+2780	2781 1
+2780	2972 1
+2785	5423 1
+2782	2785 1
+2783	2785 1
+2784	2785 1
+2787	2517 1
+2787	3307 1
+2787	4072 1
+2787	4162 1
+2786	2787 1
+2788	403 1
+2788	2102 1
+2788	2410 1
+2788	2801 1
+2789	1211 1
+2789	2257 1
+2789	2794 1
+2790	15 1
+2790	204 1
+2790	417 1
+2790	465 1
+2790	633 1
+2790	741 1
+2790	762 1
+2790	827 1
+2790	856 1
+2790	974 1
+2790	1166 1
+2790	1297 1
+2790	1357 1
+2790	1453 1
+2790	1549 1
+2790	1571 1
+2790	1633 1
+2790	1706 1
+2790	1744 1
+2790	1754 1
+2790	1777 1
+2790	1814 1
+2790	1935 1
+2790	1982 1
+2790	1984 1
+2790	1990 1
+2790	2114 1
+2790	2116 1
+2790	2120 1
+2790	2135 1
+2790	2144 1
+2790	2160 1
+2790	2174 1
+2790	2209 1
+2790	2231 1
+2790	2256 1
+2790	2297 1
+2790	2322 1
+2790	2324 1
+2790	2326 1
+2790	2398 1
+2790	2411 1
+2790	2440 1
+2790	2474 1
+2790	2510 1
+2790	2516 1
+2790	2535 1
+2790	2542 1
+2790	2544 1
+2790	2576 1
+2790	2585 1
+2790	2593 1
+2790	2594 1
+2790	2625 1
+2790	2646 1
+2790	2651 1
+2790	2654 1
+2790	2657 1
+2790	2660 1
+2790	2662 1
+2790	2687 1
+2790	2693 1
+2790	2697 1
+2790	2700 1
+2790	2713 1
+2790	2747 1
+2790	2794 1
+2790	2838 1
+2790	2856 1
+2790	2900 1
+2790	2912 1
+2790	2918 1
+2790	2951 1
+2790	2973 1
+2790	3005 1
+2790	3009 1
+2790	3021 1
+2790	3024 1
+2790	3028 1
+2790	3030 1
+2790	3036 1
+2790	3059 1
+2790	3084 1
+2790	3089 1
+2790	3114 1
+2790	3117 1
+2790	3125 1
+2790	3130 1
+2790	3155 1
+2790	3173 1
+2790	3180 1
+2790	3253 1
+2790	3260 1
+2790	3265 1
+2790	3301 1
+2790	3307 1
+2790	3324 1
+2790	3334 1
+2790	3348 1
+2790	3352 1
+2790	3376 1
+2790	3404 1
+2790	3408 1
+2790	3439 1
+2790	3443 1
+2790	3446 1
+2790	3459 1
+2790	3464 1
+2790	3473 1
+2790	3480 1
+2790	3483 1
+2790	3486 1
+2790	3516 1
+2790	3520 1
+2790	3537 1
+2790	3548 1
+2790	3549 1
+2790	3555 1
+2790	3576 1
+2790	3580 1
+2790	3609 1
+2790	3650 1
+2790	3670 1
+2790	3680 1
+2790	3681 1
+2790	3785 1
+2790	3800 1
+2790	3803 1
+2790	3807 1
+2790	3809 1
+2790	3856 1
+2790	3893 1
+2790	3897 1
+2790	3914 1
+2790	3921 1
+2790	3946 1
+2790	3958 1
+2790	3967 1
+2790	3970 1
+2790	3980 1
+2790	4124 1
+2790	4191 1
+2790	4212 1
+2790	4400 1
+2790	4448 1
+2790	4466 1
+2790	4536 1
+2790	4558 1
+2790	4578 1
+2790	4778 1
+2790	4811 1
+2790	4875 1
+2790	5130 1
+2790	5254 1
+2790	5263 1
+2790	5323 1
+2790	5404 1
+2790	5412 1
+2790	5423 1
+2790	5449 1
+2790	5487 1
+2790	5697 1
+2790	6235 1
+2790	6246 1
+2790	6255 1
+2790	6330 1
+2790	6388 1
+2790	6833 1
+2790	6869 1
+2790	6945 1
+2790	6953 1
+2790	7040 1
+2790	8293 1
+2791	425 1
+2791	1166 1
+2791	1297 1
+2791	1808 1
+2791	1918 1
+2791	2297 1
+2791	2375 1
+2791	2411 1
+2791	2547 1
+2791	2794 1
+2791	2877 1
+2791	2955 1
+2791	2963 1
+2791	3473 1
+2791	8293 1
+2792	403 1
+2792	765 1
+2792	1419 1
+2792	1723 1
+2792	2120 1
+2792	2174 1
+2792	2264 1
+2792	2375 1
+2792	2599 1
+2792	2625 1
+2792	2651 1
+2792	2794 1
+2792	2834 1
+2792	2880 1
+2792	2922 1
+2792	3007 1
+2792	3976 1
+2792	4040 1
+2793	2576 1
+2793	2794 1
+2793	4335 1
+2793	4828 1
+2793	5178 1
+2793	7073 1
+2796	1211 1
+2796	1808 1
+2796	2416 1
+2796	2797 1
+2796	2946 1
+2796	2955 1
+2796	3056 1
+2796	4037 1
+2802	765 1
+2802	2354 1
+2802	2535 1
+2802	2805 1
+2802	4875 1
+2802	4964 1
+2802	5484 1
+2802	5524 1
+2802	6023 1
+2803	2805 1
+2804	974 1
+2804	2209 1
+2804	2252 1
+2804	2597 1
+2804	2653 1
+2804	2667 1
+2804	2674 1
+2804	2747 1
+2804	2799 1
+2804	2805 1
+2804	3148 1
+2804	3260 1
+2804	3537 1
+2804	3580 1
+2804	3587 1
+2804	4055 1
+2807	2535 1
+2807	2617 1
+2807	2625 1
+2807	2809 1
+2807	4037 1
+2808	2398 1
+2808	2809 1
+2811	2066 1
+2811	2398 1
+2811	2433 1
+2811	3456 1
+2811	3562 1
+2811	3607 1
+2811	4037 1
+2811	4218 1
+2811	4315 1
+2811	4335 1
+2811	4500 1
+2811	4583 1
+2811	4605 1
+2811	4831 1
+2811	4929 1
+2811	5412 1
+2811	5459 1
+2811	6634 1
+2811	7604 1
+2813	2814 1
+2544	15 1
+2544	2328 1
+2544	2790 1
+2544	2814 1
+2544	3014 1
+2544	3352 1
+2544	3568 1
+2544	3615 1
+2544	5321 1
+2544	5624 1
+2544	7553 1
+2815	1291 1
+2815	1633 1
+2815	1734 1
+2815	2102 1
+2815	2322 1
+2815	2323 1
+2815	2619 1
+2815	2625 1
+2815	2693 1
+2815	2996 1
+2815	3029 1
+2818	2821 1
+2817	2818 1
+2817	2821 1
+2819	1549 1
+2819	1633 1
+2819	2016 1
+2819	2619 1
+2819	2660 1
+2819	2821 1
+2819	2825 1
+2819	3018 1
+2819	3251 1
+2819	3410 1
+2819	3439 1
+2819	3516 1
+2819	3548 1
+2819	3623 1
+2819	3903 1
+2819	4536 1
+2819	4600 1
+2819	6780 1
+2822	214 1
+2822	403 1
+2822	737 1
+2822	762 1
+2822	765 1
+2822	856 1
+2822	1211 1
+2822	1291 1
+2822	1723 1
+2822	1935 1
+2822	2114 1
+2822	2174 1
+2822	2256 1
+2822	2322 1
+2822	2323 1
+2822	2354 1
+2822	2416 1
+2822	2535 1
+2822	2625 1
+2822	2654 1
+2822	2707 1
+2822	2834 1
+2822	2856 1
+2822	2880 1
+2822	2900 1
+2822	2902 1
+2822	2923 1
+2822	2968 1
+2822	2991 1
+2822	3029 1
+2822	3033 1
+2822	3050 1
+2822	3056 1
+2822	3059 1
+2822	3068 1
+2822	3404 1
+2822	3847 1
+2822	4021 1
+2822	4124 1
+2822	5412 1
+2822	5928 1
+2822	5963 1
+2822	8292 1
+2823	2825 1
+2654	285 1
+2654	417 1
+2654	762 1
+2654	825 1
+2654	827 1
+2654	1267 1
+2654	1291 1
+2654	1297 1
+2654	1357 1
+2654	1416 1
+2654	1453 1
+2654	1549 1
+2654	1679 1
+2654	1744 1
+2654	1781 1
+2654	1792 1
+2654	1915 1
+2654	1935 1
+2654	1990 1
+2654	2053 1
+2654	2116 1
+2654	2144 1
+2654	2210 1
+2654	2252 1
+2654	2297 1
+2654	2307 1
+2654	2324 1
+2654	2371 1
+2654	2411 1
+2654	2416 1
+2654	2470 1
+2654	2485 1
+2654	2508 1
+2654	2510 1
+2654	2535 1
+2654	2550 1
+2654	2576 1
+2654	2585 1
+2654	2625 1
+2654	2653 1
+2654	2657 1
+2654	2662 1
+2654	2667 1
+2654	2674 1
+2654	2686 1
+2654	2693 1
+2654	2697 1
+2654	2713 1
+2654	2724 1
+2654	2746 1
+2654	2819 1
+2654	2825 1
+2654	2856 1
+2654	2859 1
+2654	2900 1
+2654	2902 1
+2654	2958 1
+2654	2996 1
+2654	3005 1
+2654	3007 1
+2654	3010 1
+2654	3026 1
+2654	3056 1
+2654	3089 1
+2654	3109 1
+2654	3126 1
+2654	3140 1
+2654	3148 1
+2654	3171 1
+2654	3180 1
+2654	3193 1
+2654	3253 1
+2654	3255 1
+2654	3258 1
+2654	3313 1
+2654	3352 1
+2654	3404 1
+2654	3446 1
+2654	3486 1
+2654	3529 1
+2654	3537 1
+2654	3541 1
+2654	3556 1
+2654	3562 1
+2654	3567 1
+2654	3650 1
+2654	3670 1
+2654	3681 1
+2654	3717 1
+2654	3769 1
+2654	3800 1
+2654	3822 1
+2654	3867 1
+2654	3898 1
+2654	3922 1
+2654	3926 1
+2654	3973 1
+2654	4013 1
+2654	4021 1
+2654	4110 1
+2654	4111 1
+2654	4117 1
+2654	4233 1
+2654	8294 1
+2824	2825 1
+2826	765 1
+2758	765 1
+2758	1679 1
+2827	765 1
+2799	1777 1
+2799	2565 1
+2799	2686 1
+2799	2923 1
+2799	3200 1
+2799	3483 1
+2799	3680 1
+2799	3847 1
+2830	1723 1
+2830	2120 1
+2830	2323 1
+2830	2547 1
+2830	2560 1
+2830	2877 1
+2834	2072 1
+2834	3117 1
+2834	3726 1
+2834	5793 1
+2834	6784 1
+2831	425 1
+2831	1166 1
+2831	1972 1
+2831	2001 1
+2831	2256 1
+2831	2328 1
+2831	2381 1
+2831	2474 1
+2831	2594 1
+2831	2619 1
+2831	2620 1
+2831	2625 1
+2831	2674 1
+2831	2834 1
+2831	2912 1
+2831	2972 1
+2831	3103 1
+2831	3480 1
+2831	3529 1
+2831	3631 1
+2831	3813 1
+2831	3958 1
+2831	4310 1
+2831	4531 1
+2831	4578 1
+2831	4846 1
+2831	5079 1
+2831	5144 1
+2831	5262 1
+2831	5454 1
+2831	5459 1
+2831	5605 1
+2831	5827 1
+2831	5928 1
+2831	6124 1
+2831	6913 1
+2831	7908 1
+2831	7910 1
+2831	7912 1
+2832	762 1
+2832	1360 1
+2832	1596 1
+2832	1984 1
+2832	2323 1
+2832	2811 1
+2832	2834 1
+2832	2932 1
+2832	2979 1
+2832	3029 1
+2832	3099 1
+2832	3125 1
+2832	3144 1
+2832	3352 1
+2832	3439 1
+2832	3443 1
+2832	3568 1
+2832	3645 1
+2832	3650 1
+2832	3812 1
+2832	3835 1
+2832	4037 1
+2832	4191 1
+2832	4234 1
+2832	4264 1
+2832	4289 1
+2832	4297 1
+2832	4299 1
+2832	4349 1
+2832	4351 1
+2832	4373 1
+2832	4384 1
+2832	4422 1
+2832	4424 1
+2832	4463 1
+2832	4468 1
+2832	4480 1
+2832	4485 1
+2832	4529 1
+2832	4588 1
+2832	4631 1
+2832	4713 1
+2832	4728 1
+2832	4735 1
+2832	4780 1
+2832	4783 1
+2832	4814 1
+2832	4820 1
+2832	4875 1
+2832	4953 1
+2833	1419 1
+2833	1549 1
+2833	2371 1
+2833	2834 1
+2833	2880 1
+2833	3969 1
+2833	7561 1
+2835	8292 1
+2838	1211 1
+2838	1297 1
+2838	1419 1
+2838	1633 1
+2838	2290 1
+2838	2535 1
+2838	2585 1
+2838	2593 1
+2838	2619 1
+2838	2657 1
+2838	2660 1
+2838	2727 1
+2838	2746 1
+2838	2923 1
+2838	2958 1
+2838	2999 1
+2838	3117 1
+2838	3516 1
+2838	3587 1
+2838	3776 1
+2838	3892 1
+2839	1419 1
+2839	3334 1
+2839	6417 1
+2839	6442 1
+2839	7422 1
+2840	1419 1
+2840	1808 1
+2840	2174 1
+2840	2256 1
+2840	2264 1
+2840	2375 1
+2840	2470 1
+2840	2501 1
+2840	2599 1
+2840	2646 1
+2840	2877 1
+2840	2922 1
+2840	2972 1
+2840	2993 1
+2844	2880 1
+2844	2902 1
+2845	1211 1
+2845	1723 1
+2845	2955 1
+2846	1723 1
+2847	1723 1
+2848	1723 1
+2849	1723 1
+2850	1723 1
+2851	15 1
+2851	737 1
+2851	967 1
+2851	1723 1
+2851	1754 1
+2851	2356 1
+2851	2485 1
+2851	2506 1
+2851	2508 1
+2851	2535 1
+2851	2774 1
+2851	2856 1
+2851	2871 1
+2851	2955 1
+2851	3015 1
+2851	3144 1
+2851	3643 1
+2851	3796 1
+2851	4037 1
+2851	4335 1
+2851	4432 1
+2851	4940 1
+2851	5022 1
+2851	5037 1
+2851	5254 1
+2851	5288 1
+2851	5412 1
+2851	5445 1
+2851	5449 1
+2851	5922 1
+2851	6006 1
+2851	6337 1
+2851	6437 1
+2851	6442 1
+2851	6725 1
+2851	6832 1
+2851	6850 1
+2851	6875 1
+2851	6955 1
+2851	6980 1
+2851	7553 1
+2851	7871 1
+2851	7912 1
+2851	8212 1
+2852	1723 1
+2852	2775 1
+2853	1723 1
+2855	1360 1
+2855	2225 1
+2855	2264 1
+2855	2764 1
+2855	2774 1
+2855	2856 1
+2855	3276 1
+2855	3842 1
+2855	5100 1
+2855	5210 1
+2855	5697 1
+2855	6330 1
+2855	6552 1
+2855	6594 1
+2855	6790 1
+2855	6979 1
+2856	2264 1
+2856	2662 1
+2856	3089 1
+2856	3126 1
+2856	3243 1
+2857	2264 1
+2858	2264 1
+2858	2516 1
+2858	2963 1
+2859	608 1
+2859	741 1
+2859	762 1
+2859	778 1
+2859	825 1
+2859	1157 1
+2859	1239 1
+2859	1307 1
+2859	1453 1
+2859	1769 1
+2859	1777 1
+2859	2014 1
+2859	2144 1
+2859	2145 1
+2859	2237 1
+2859	2264 1
+2859	2307 1
+2859	2328 1
+2859	2398 1
+2859	2485 1
+2859	2506 1
+2859	2508 1
+2859	2516 1
+2859	2517 1
+2859	2542 1
+2859	2565 1
+2859	2585 1
+2859	2619 1
+2859	2746 1
+2859	2775 1
+2859	2790 1
+2859	2871 1
+2859	2900 1
+2859	2958 1
+2859	2981 1
+2859	3007 1
+2859	3024 1
+2859	3028 1
+2859	3034 1
+2859	3073 1
+2859	3144 1
+2859	3155 1
+2859	3200 1
+2859	3258 1
+2859	3260 1
+2859	3291 1
+2859	3320 1
+2859	3321 1
+2859	3352 1
+2859	3404 1
+2859	3408 1
+2859	3439 1
+2859	3443 1
+2859	3453 1
+2859	3454 1
+2859	3473 1
+2859	3486 1
+2859	3489 1
+2859	3557 1
+2859	3562 1
+2859	3568 1
+2859	3615 1
+2859	3645 1
+2859	3650 1
+2859	3717 1
+2859	3724 1
+2859	3748 1
+2859	3803 1
+2859	3812 1
+2859	3843 1
+2859	3856 1
+2859	3871 1
+2859	3903 1
+2859	3914 1
+2859	3921 1
+2859	3922 1
+2859	3933 1
+2859	3937 1
+2859	3942 1
+2859	3946 1
+2859	3973 1
+2859	3976 1
+2859	3980 1
+2859	4011 1
+2859	4024 1
+2859	4030 1
+2859	4031 1
+2859	4037 1
+2859	4043 1
+2859	4044 1
+2859	4051 1
+2859	4055 1
+2859	4088 1
+2859	4103 1
+2859	4110 1
+2859	4111 1
+2859	4162 1
+2859	4171 1
+2859	4173 1
+2859	4179 1
+2859	4183 1
+2859	4191 1
+2859	4234 1
+2859	4256 1
+2859	4290 1
+2859	4297 1
+2859	4331 1
+2859	4332 1
+2859	4335 1
+2859	4351 1
+2859	4365 1
+2859	4373 1
+2859	4384 1
+2859	4385 1
+2859	4386 1
+2859	4402 1
+2859	4412 1
+2859	4463 1
+2859	4468 1
+2859	4500 1
+2859	4510 1
+2859	4528 1
+2859	4531 1
+2859	4552 1
+2859	4557 1
+2859	4588 1
+2859	4613 1
+2859	4631 1
+2859	4648 1
+2859	4661 1
+2859	4677 1
+2859	4719 1
+2859	4728 1
+2859	4780 1
+2859	4811 1
+2859	4820 1
+2859	4831 1
+2859	8293 1
+2859	8294 1
+2860	214 1
+2860	1919 1
+2860	2542 1
+2860	2623 1
+2860	3018 1
+2866	214 1
+2866	1211 1
+2866	1705 1
+2866	2053 1
+2866	2470 1
+2866	2877 1
+2867	214 1
+2867	3027 1
+2867	4536 1
+2861	214 1
+2868	214 1
+2869	214 1
+2862	214 1
+2862	2470 1
+2862	2880 1
+2862	2926 1
+2863	214 1
+2863	2470 1
+2863	2877 1
+2863	2880 1
+2863	2902 1
+2870	214 1
+2871	72 1
+2871	204 1
+2871	214 1
+2871	290 1
+2871	465 1
+2871	608 1
+2871	633 1
+2871	737 1
+2871	762 1
+2871	825 1
+2871	827 1
+2871	856 1
+2871	1157 1
+2871	1211 1
+2871	1239 1
+2871	1267 1
+2871	1297 1
+2871	1307 1
+2871	1310 1
+2871	1315 1
+2871	1357 1
+2871	1360 1
+2871	1385 1
+2871	1393 1
+2871	1416 1
+2871	1453 1
+2871	1548 1
+2871	1571 1
+2871	1596 1
+2871	1679 1
+2871	1680 1
+2871	1688 1
+2871	1706 1
+2871	1769 1
+2871	1777 1
+2871	1781 1
+2871	1814 1
+2871	1918 1
+2871	1919 1
+2871	1984 1
+2871	2016 1
+2871	2066 1
+2871	2116 1
+2871	2134 1
+2871	2135 1
+2871	2145 1
+2871	2210 1
+2871	2225 1
+2871	2231 1
+2871	2240 1
+2871	2251 1
+2871	2252 1
+2871	2256 1
+2871	2257 1
+2871	2290 1
+2871	2297 1
+2871	2323 1
+2871	2325 1
+2871	2328 1
+2871	2364 1
+2871	2369 1
+2871	2371 1
+2871	2381 1
+2871	2384 1
+2871	2386 1
+2871	2398 1
+2871	2411 1
+2871	2456 1
+2871	2470 1
+2871	2474 1
+2871	2485 1
+2871	2506 1
+2871	2516 1
+2871	2544 1
+2871	2550 1
+2871	2552 1
+2871	2560 1
+2871	2585 1
+2871	2592 1
+2871	2595 1
+2871	2612 1
+2871	2617 1
+2871	2619 1
+2871	2625 1
+2871	2651 1
+2871	2653 1
+2871	2655 1
+2871	2657 1
+2871	2662 1
+2871	2689 1
+2871	2696 1
+2871	2697 1
+2871	2700 1
+2871	2707 1
+2871	2713 1
+2871	2724 1
+2871	2746 1
+2871	2775 1
+2871	2790 1
+2871	2815 1
+2871	2819 1
+2871	2880 1
+2871	2900 1
+2871	2902 1
+2871	2912 1
+2871	2932 1
+2871	2951 1
+2871	2955 1
+2871	2958 1
+2871	2963 1
+2871	2966 1
+2871	2972 1
+2871	2977 1
+2871	2979 1
+2871	2981 1
+2871	2993 1
+2871	2996 1
+2871	2999 1
+2871	3005 1
+2871	3007 1
+2871	3010 1
+2871	3014 1
+2871	3020 1
+2871	3024 1
+2871	3026 1
+2871	3028 1
+2871	3029 1
+2871	3030 1
+2871	3033 1
+2871	3034 1
+2871	3050 1
+2871	3056 1
+2871	3073 1
+2871	3080 1
+2871	3084 1
+2871	3089 1
+2871	3092 1
+2871	3106 1
+2871	3114 1
+2871	3117 1
+2871	3126 1
+2871	3140 1
+2871	3145 1
+2871	3150 1
+2871	3164 1
+2871	3192 1
+2871	3243 1
+2871	3251 1
+2871	3253 1
+2871	3258 1
+2871	3260 1
+2871	3276 1
+2871	3284 1
+2871	3291 1
+2871	3309 1
+2871	3313 1
+2871	3338 1
+2871	3352 1
+2871	3393 1
+2871	3439 1
+2871	3443 1
+2871	3447 1
+2871	3452 1
+2871	3455 1
+2871	3456 1
+2871	3537 1
+2871	3557 1
+2871	3562 1
+2871	3568 1
+2871	3615 1
+2871	3643 1
+2871	3650 1
+2871	3661 1
+2871	3717 1
+2871	3720 1
+2871	3748 1
+2871	3755 1
+2871	3796 1
+2871	3803 1
+2871	3806 1
+2871	3812 1
+2871	3813 1
+2871	3816 1
+2871	3843 1
+2871	3847 1
+2871	3854 1
+2871	3871 1
+2871	3887 1
+2871	3892 1
+2871	3897 1
+2871	3898 1
+2871	3903 1
+2871	3926 1
+2871	3937 1
+2871	3946 1
+2871	3949 1
+2871	3967 1
+2871	3970 1
+2871	4011 1
+2871	4013 1
+2871	4021 1
+2871	4024 1
+2871	4030 1
+2871	4037 1
+2871	4043 1
+2871	4049 1
+2871	4051 1
+2871	4055 1
+2871	4088 1
+2871	4103 1
+2871	4110 1
+2871	4127 1
+2871	4138 1
+2871	4162 1
+2871	4173 1
+2871	4179 1
+2871	4181 1
+2871	4183 1
+2871	4189 1
+2871	4191 1
+2871	4212 1
+2871	4256 1
+2871	4261 1
+2871	4263 1
+2871	4266 1
+2871	4269 1
+2871	4297 1
+2871	4298 1
+2871	4315 1
+2871	4335 1
+2871	4338 1
+2871	4400 1
+2871	4466 1
+2871	4468 1
+2871	4482 1
+2871	4510 1
+2871	4529 1
+2871	4534 1
+2871	4547 1
+2871	4551 1
+2871	4587 1
+2871	4588 1
+2871	4661 1
+2871	4662 1
+2871	4666 1
+2871	4706 1
+2871	4719 1
+2871	4777 1
+2871	4780 1
+2871	4792 1
+2871	4820 1
+2871	4824 1
+2871	4827 1
+2871	4929 1
+2871	4953 1
+2871	4962 1
+2871	4964 1
+2871	4999 1
+2871	5022 1
+2871	5026 1
+2871	5055 1
+2871	5073 1
+2871	5106 1
+2871	5130 1
+2871	5132 1
+2871	5144 1
+2871	5162 1
+2871	5204 1
+2871	5210 1
+2871	5222 1
+2871	5285 1
+2871	5288 1
+2871	5308 1
+2871	5509 1
+2871	5539 1
+2871	5563 1
+2871	5651 1
+2871	5737 1
+2871	5775 1
+2871	5817 1
+2871	8293 1
+2871	8294 1
+2864	214 1
+2865	214 1
+2865	2599 1
+2872	214 1
+2872	290 1
+2872	465 1
+2872	608 1
+2872	762 1
+2872	778 1
+2872	1211 1
+2872	1297 1
+2872	1307 1
+2872	1393 1
+2872	1437 1
+2872	1453 1
+2872	1549 1
+2872	1679 1
+2872	1705 1
+2872	1706 1
+2872	1915 1
+2872	2114 1
+2872	2135 1
+2872	2225 1
+2872	2323 1
+2872	2470 1
+2872	2506 1
+2872	2508 1
+2872	2535 1
+2872	2544 1
+2872	2619 1
+2872	2625 1
+2872	2651 1
+2872	2653 1
+2872	2697 1
+2872	2721 1
+2872	2727 1
+2872	2746 1
+2872	2790 1
+2872	2838 1
+2872	2877 1
+2872	2918 1
+2872	2979 1
+2872	2981 1
+2872	3005 1
+2872	3007 1
+2872	3024 1
+2872	3028 1
+2872	3084 1
+2872	3145 1
+2872	3180 1
+2872	3243 1
+2872	3253 1
+2872	3258 1
+2872	3260 1
+2872	3313 1
+2872	3338 1
+2872	3557 1
+2872	3562 1
+2872	3681 1
+2872	3717 1
+2872	3720 1
+2872	3800 1
+2872	3803 1
+2872	3807 1
+2872	3816 1
+2872	3843 1
+2872	3847 1
+2872	3871 1
+2872	3892 1
+2872	3903 1
+2872	3926 1
+2872	3937 1
+2872	3946 1
+2872	3967 1
+2872	3970 1
+2872	3973 1
+2872	4011 1
+2872	4021 1
+2872	4024 1
+2872	4031 1
+2872	4043 1
+2872	4051 1
+2872	4055 1
+2872	4088 1
+2872	4103 1
+2872	4110 1
+2872	4117 1
+2872	4162 1
+2872	8293 1
+2872	8294 1
+2875	1393 1
+2875	2625 1
+2875	2877 1
+2875	3307 1
+2875	3351 1
+2875	5020 1
+2876	2877 1
+2880	1453 1
+2880	2686 1
+2879	2880 1
+2881	2880 1
+2882	2880 1
+2883	856 1
+2883	1211 1
+2883	1416 1
+2883	1799 1
+2883	2277 1
+2883	2323 1
+2883	2662 1
+2883	2822 1
+2883	2880 1
+2883	2968 1
+2883	3021 1
+2883	3103 1
+2883	3274 1
+2883	3408 1
+2883	3755 1
+2883	3897 1
+2883	4068 1
+2883	4098 1
+2883	4211 1
+2883	4247 1
+2883	4310 1
+2883	4448 1
+2883	5020 1
+2883	5226 1
+2883	5387 1
+2883	5559 1
+2883	5640 1
+2883	5947 1
+2884	2880 1
+2885	1315 1
+2885	2323 1
+2885	2880 1
+2885	2972 1
+2885	2977 1
+2467	2470 1
+2467	3871 1
+2467	6221 1
+2467	8293 1
+2896	2470 1
+2568	1808 1
+2568	2470 1
+2568	3453 1
+2568	3835 1
+2886	2470 1
+2886	3238 1
+2886	7694 1
+2887	2470 1
+2888	2470 1
+2464	2470 1
+2889	737 1
+2889	2398 1
+2889	2470 1
+2889	3027 1
+2889	3459 1
+2889	4653 1
+2889	4687 1
+2889	4712 1
+2889	4899 1
+2889	5155 1
+2889	5430 1
+2889	5449 1
+2889	5925 1
+2889	6790 1
+2890	2470 1
+2891	2470 1
+2892	2470 1
+2893	2470 1
+2894	2470 1
+2895	2470 1
+2898	2174 1
+2898	2297 1
+2901	290 1
+2901	2174 1
+2901	2625 1
+2901	3068 1
+2899	2174 1
+2900	204 1
+2900	285 1
+2900	290 1
+2900	974 1
+2900	1267 1
+2900	1297 1
+2900	1549 1
+2900	1571 1
+2900	1633 1
+2900	1705 1
+2900	1706 1
+2900	1754 1
+2900	1918 1
+2900	2066 1
+2900	2134 1
+2900	2174 1
+2900	2593 1
+2900	2594 1
+2900	2625 1
+2900	2651 1
+2900	2654 1
+2900	2657 1
+2900	2790 1
+2900	2815 1
+2900	2922 1
+2900	3089 1
+2900	3253 1
+2900	3650 1
+2900	4247 1
+2905	2053 1
+2905	3830 1
+2905	5254 1
+2905	6613 1
+2903	1679 1
+2903	2053 1
+2903	2398 1
+2903	2625 1
+2903	3956 1
+2903	4735 1
+2903	4796 1
+2903	5404 1
+2904	1211 1
+2904	1357 1
+2904	1416 1
+2904	1549 1
+2904	1734 1
+2904	1754 1
+2904	1918 1
+2904	1919 1
+2904	2053 1
+2904	2323 1
+2904	2411 1
+2904	2565 1
+2904	2593 1
+2904	2999 1
+2904	3104 1
+2904	3117 1
+2904	3164 1
+2904	3265 1
+2906	554 1
+2906	2654 1
+2906	2910 1
+2906	3059 1
+2906	3084 1
+2906	3352 1
+2907	2398 1
+2907	2910 1
+2907	3352 1
+2907	4605 1
+2907	7632 1
+2907	7809 1
+2908	2535 1
+2908	2542 1
+2908	2623 1
+2908	2910 1
+2908	3018 1
+2908	5233 1
+2908	5753 1
+2908	6004 1
+2908	6251 1
+2908	7301 1
+2908	7620 1
+2908	7632 1
+2909	737 1
+2909	1310 1
+2909	1754 1
+2909	2135 1
+2909	2237 1
+2909	2384 1
+2909	2398 1
+2909	2485 1
+2909	2516 1
+2909	2535 1
+2909	2625 1
+2909	2651 1
+2909	2654 1
+2909	2657 1
+2909	2697 1
+2909	2910 1
+2909	3033 1
+2909	3125 1
+2909	3130 1
+2909	3144 1
+2909	3260 1
+2909	3352 1
+2909	3417 1
+2909	3443 1
+2909	3456 1
+2909	3643 1
+2909	3726 1
+2909	3835 1
+2909	3897 1
+2909	3910 1
+2909	3976 1
+2909	4124 1
+2909	4191 1
+2909	4310 1
+2909	4335 1
+2909	4528 1
+2909	4534 1
+2909	4587 1
+2909	4653 1
+2909	4712 1
+2909	4735 1
+2909	5123 1
+2909	5155 1
+2909	5189 1
+2909	5222 1
+2909	5387 1
+2909	5412 1
+2909	5470 1
+2909	5640 1
+2909	5651 1
+2909	5886 1
+2909	5969 1
+2909	6594 1
+2909	6774 1
+2909	6832 1
+2909	7168 1
+2909	8294 1
+2912	1357 1
+2912	1393 1
+2912	1416 1
+2912	1734 1
+2912	1754 1
+2912	1769 1
+2912	1919 1
+2912	2072 1
+2912	2135 1
+2912	2231 1
+2912	2251 1
+2912	2325 1
+2912	2356 1
+2912	2371 1
+2912	2416 1
+2912	2456 1
+2912	2474 1
+2912	2576 1
+2912	2593 1
+2912	2625 1
+2912	2654 1
+2912	2724 1
+2912	2900 1
+2912	3020 1
+2912	3021 1
+2912	3033 1
+2912	3034 1
+2912	3099 1
+2912	3104 1
+2912	3265 1
+2912	4037 1
+2912	4233 1
+2912	4463 1
+2913	417 1
+2913	1305 1
+2913	1705 1
+2913	2066 1
+2913	2375 1
+2913	2398 1
+2913	2416 1
+2913	2918 1
+2913	2922 1
+2913	3005 1
+2913	5697 1
+2916	1705 1
+2917	1705 1
+2917	4735 1
+2918	1705 1
+2918	2375 1
+2918	2922 1
+2919	1211 1
+2919	1705 1
+2921	2918 1
+2923	1211 1
+2923	1297 1
+2923	1734 1
+2923	2252 1
+2923	2256 1
+2923	2307 1
+2923	2328 1
+2923	2375 1
+2923	2411 1
+2923	2474 1
+2923	2485 1
+2923	2535 1
+2923	2585 1
+2923	2653 1
+2923	2657 1
+2923	2746 1
+2923	2972 1
+2923	2979 1
+2923	2990 1
+2923	3020 1
+2923	3026 1
+2923	3028 1
+2923	3117 1
+2923	3265 1
+2923	3291 1
+2923	3394 1
+2923	3454 1
+2923	3516 1
+2923	3537 1
+2923	3568 1
+2923	3629 1
+2923	3646 1
+2923	3680 1
+2923	3724 1
+2923	4547 1
+2924	2375 1
+2924	2928 1
+2925	425 1
+2925	1211 1
+2925	1596 1
+2925	1808 1
+2925	1918 1
+2925	2547 1
+2925	2625 1
+2925	2646 1
+2925	2651 1
+2925	2877 1
+2925	2926 1
+2925	2946 1
+2925	2955 1
+2925	2956 1
+2925	2972 1
+2925	2977 1
+2925	2979 1
+2925	3265 1
+2925	8178 1
+2928	2877 1
+2929	2877 1
+2930	2877 1
+2932	15 1
+2932	762 1
+2932	1157 1
+2932	1211 1
+2932	1297 1
+2932	1549 1
+2932	1648 1
+2932	1688 1
+2932	1777 1
+2932	1918 1
+2932	2145 1
+2932	2328 1
+2932	2485 1
+2932	2547 1
+2932	2565 1
+2932	2594 1
+2932	2651 1
+2932	2667 1
+2932	2877 1
+2932	2955 1
+2932	2958 1
+2932	3028 1
+2932	3059 1
+2932	3140 1
+2932	3192 1
+2932	3291 1
+2932	3321 1
+2932	3394 1
+2932	3417 1
+2932	3439 1
+2932	3454 1
+2932	3480 1
+2932	3537 1
+2932	3557 1
+2932	3568 1
+2932	3615 1
+2932	3635 1
+2932	3646 1
+2932	3661 1
+2932	3724 1
+2932	3812 1
+2932	3969 1
+2932	3976 1
+2932	4065 1
+2932	4191 1
+2932	4231 1
+2932	4235 1
+2932	4254 1
+2932	4261 1
+2932	4266 1
+2932	4272 1
+2932	4323 1
+2932	4365 1
+2932	4373 1
+2932	4463 1
+2932	4661 1
+2932	4735 1
+2932	4814 1
+2932	4875 1
+2932	5103 1
+2932	5828 1
+2932	7301 1
+2931	2877 1
+2931	7316 1
+2933	1211 1
+2933	2724 1
+2933	2877 1
+2933	2946 1
+2933	3068 1
+2933	3253 1
+2935	425 1
+2935	1808 1
+2935	2517 1
+2935	2646 1
+2935	2811 1
+2935	2871 1
+2935	3002 1
+2935	3321 1
+2935	3447 1
+2935	3452 1
+2935	3455 1
+2935	3537 1
+2935	3607 1
+2935	3835 1
+2935	3854 1
+2935	3958 1
+2935	4124 1
+2935	4298 1
+2935	4466 1
+2935	4588 1
+2935	4613 1
+2935	4661 1
+2935	4662 1
+2935	4719 1
+2935	4735 1
+2935	4792 1
+2935	4797 1
+2935	4815 1
+2935	4938 1
+2935	4962 1
+2935	4983 1
+2935	4999 1
+2935	5055 1
+2935	5058 1
+2935	5083 1
+2935	5092 1
+2914	1754 1
+2914	1808 1
+2914	2963 1
+2914	4792 1
+2939	1211 1
+2939	1633 1
+2939	2411 1
+2939	2657 1
+2939	2707 1
+2939	3529 1
+2939	3669 1
+2938	1211 1
+2940	15 1
+2940	285 1
+2940	290 1
+2940	417 1
+2940	762 1
+2940	825 1
+2940	938 1
+2940	1026 1
+2940	1157 1
+2940	1166 1
+2940	1211 1
+2940	1352 1
+2940	1571 1
+2940	1633 1
+2940	1744 1
+2940	1919 1
+2940	1990 1
+2940	2016 1
+2940	2114 1
+2940	2135 1
+2940	2210 1
+2940	2240 1
+2940	2251 1
+2940	2273 1
+2940	2290 1
+2940	2297 1
+2940	2324 1
+2940	2325 1
+2940	2338 1
+2940	2433 1
+2940	2485 1
+2940	2510 1
+2940	2565 1
+2940	2576 1
+2940	2593 1
+2940	2594 1
+2940	2619 1
+2940	2623 1
+2940	2625 1
+2940	2653 1
+2940	2657 1
+2940	2660 1
+2940	2667 1
+2940	2693 1
+2940	2700 1
+2940	2727 1
+2940	2851 1
+2940	2912 1
+2940	2932 1
+2940	2958 1
+2940	2973 1
+2940	2974 1
+2940	2977 1
+2940	3005 1
+2940	3009 1
+2940	3026 1
+2940	3028 1
+2940	3056 1
+2940	3114 1
+2940	3117 1
+2940	3148 1
+2940	3238 1
+2940	3266 1
+2940	3291 1
+2940	3307 1
+2940	3351 1
+2940	3404 1
+2940	3408 1
+2940	3480 1
+2940	3489 1
+2940	3557 1
+2940	3681 1
+2940	3769 1
+2940	3772 1
+2940	3792 1
+2940	3800 1
+2940	3803 1
+2940	3804 1
+2940	3807 1
+2940	3847 1
+2940	3892 1
+2940	3897 1
+2940	4049 1
+2940	4055 1
+2940	4134 1
+2940	4162 1
+2940	4173 1
+2940	4179 1
+2940	4201 1
+2940	4218 1
+2940	4485 1
+2940	4980 1
+2940	5020 1
+2940	5079 1
+2940	5179 1
+2940	5233 1
+2940	5298 1
+2940	5626 1
+2940	5806 1
+2940	5872 1
+2940	5950 1
+2940	5969 1
+2940	6000 1
+2940	6004 1
+2940	6306 1
+2940	6462 1
+2940	6496 1
+2940	6505 1
+2940	6595 1
+2940	6600 1
+2940	6682 1
+2940	6755 1
+2940	6780 1
+2940	6784 1
+2940	6897 1
+2940	7012 1
+2940	7116 1
+2940	7162 1
+2940	7254 1
+2940	7277 1
+2940	7301 1
+2940	7389 1
+2940	7618 1
+2941	974 1
+2941	1211 1
+2941	2535 1
+2941	2693 1
+2941	2747 1
+2941	3549 1
+2941	3609 1
+2941	3970 1
+2941	5058 1
+2941	7054 1
+2941	8141 1
+2936	1211 1
+2936	2815 1
+2936	2946 1
+2936	2999 1
+2936	3148 1
+2936	5902 1
+2936	7517 1
+2936	8186 1
+2944	2946 1
+2945	2946 1
+2947	1291 1
+2947	2485 1
+2947	2547 1
+2947	2660 1
+2947	2968 1
+2947	3029 1
+2947	3253 1
+2947	3352 1
+2947	3489 1
+2947	4043 1
+2948	762 1
+2948	1357 1
+2948	1416 1
+2948	1437 1
+2948	1734 1
+2948	1754 1
+2948	1781 1
+2948	2251 1
+2948	2371 1
+2948	2547 1
+2948	2550 1
+2948	2593 1
+2948	2654 1
+2948	2697 1
+2948	2830 1
+2948	2856 1
+2948	2900 1
+2948	3033 1
+2948	3089 1
+2948	3117 1
+2948	3130 1
+2948	3140 1
+2948	3150 1
+2948	3164 1
+2948	3193 1
+2948	8293 1
+2949	2547 1
+2950	1315 1
+2950	1596 1
+2950	2323 1
+2950	2547 1
+2950	2560 1
+2950	2707 1
+2950	2815 1
+2950	2963 1
+2950	2966 1
+2950	2972 1
+2950	2977 1
+2950	2993 1
+2950	2999 1
+2951	72 1
+2951	1185 1
+2951	1385 1
+2951	2145 1
+2951	2297 1
+2951	2547 1
+2951	2576 1
+2951	2625 1
+2951	2660 1
+2951	2760 1
+2951	2790 1
+2951	3014 1
+2951	3489 1
+2951	3615 1
+2951	3976 1
+2951	4297 1
+2951	4411 1
+2951	4463 1
+2951	4531 1
+2952	2955 1
+2953	290 1
+2953	1688 1
+2953	1706 1
+2953	2338 1
+2953	2371 1
+2953	2485 1
+2953	2654 1
+2953	2871 1
+2953	2955 1
+2953	5106 1
+2954	2955 1
+2957	1918 1
+2958	1026 1
+2958	1267 1
+2958	1918 1
+2958	2066 1
+2958	2134 1
+2958	2225 1
+2958	2256 1
+2958	2323 1
+2958	2328 1
+2958	2411 1
+2958	2474 1
+2958	2510 1
+2958	2585 1
+2958	2594 1
+2958	2625 1
+2958	2646 1
+2958	2727 1
+2958	2746 1
+2958	2790 1
+2958	2830 1
+2958	2856 1
+2958	3005 1
+2958	3084 1
+2958	3089 1
+2958	3117 1
+2958	3125 1
+2958	3265 1
+2958	3291 1
+2958	3352 1
+2958	3394 1
+2958	3439 1
+2958	3516 1
+2958	3645 1
+2958	3650 1
+2958	3892 1
+2958	3898 1
+2958	3903 1
+2958	4256 1
+2958	4290 1
+2958	4299 1
+2958	4400 1
+2958	4528 1
+2958	4530 1
+2958	4735 1
+2958	5412 1
+2958	5772 1
+2958	7620 1
+2960	2963 1
+2961	2963 1
+2962	2963 1
+2964	633 1
+2964	825 1
+2964	856 1
+2964	1140 1
+2964	1239 1
+2964	1267 1
+2964	1305 1
+2964	1307 1
+2964	1360 1
+2964	1385 1
+2964	1437 1
+2964	1734 1
+2964	1919 1
+2964	2066 1
+2964	2134 1
+2964	2210 1
+2964	2225 1
+2964	2237 1
+2964	2256 1
+2964	2384 1
+2964	2595 1
+2964	2651 1
+2964	2653 1
+2964	2654 1
+2964	2655 1
+2964	2662 1
+2964	2746 1
+2964	2859 1
+2964	2932 1
+2964	2951 1
+2964	2958 1
+2964	2966 1
+2964	2981 1
+2964	3021 1
+2964	3033 1
+2964	3034 1
+2964	3192 1
+2964	3251 1
+2964	3258 1
+2964	3265 1
+2964	3291 1
+2964	3307 1
+2964	3309 1
+2964	3320 1
+2964	3321 1
+2964	3351 1
+2964	3394 1
+2964	3408 1
+2964	3453 1
+2964	3615 1
+2964	4011 1
+2964	4013 1
+2964	4021 1
+2964	4043 1
+2964	4055 1
+2964	4110 1
+2964	4162 1
+2964	4179 1
+2964	4201 1
+2964	4216 1
+2964	4247 1
+2964	4256 1
+2964	4263 1
+2964	4269 1
+2964	4289 1
+2964	4290 1
+2964	4424 1
+2964	4646 1
+2964	8293 1
+2964	8294 1
+2965	2966 1
+2965	2993 1
+2967	417 1
+2967	762 1
+2967	825 1
+2967	974 1
+2967	1157 1
+2967	1166 1
+2967	1239 1
+2967	1297 1
+2967	1305 1
+2967	1307 1
+2967	1310 1
+2967	1315 1
+2967	1549 1
+2967	1571 1
+2967	1688 1
+2967	1729 1
+2967	1734 1
+2967	1754 1
+2967	1769 1
+2967	1984 1
+2967	2014 1
+2967	2016 1
+2967	2066 1
+2967	2114 1
+2967	2129 1
+2967	2134 1
+2967	2144 1
+2967	2145 1
+2967	2209 1
+2967	2210 1
+2967	2237 1
+2967	2240 1
+2967	2252 1
+2967	2256 1
+2967	2257 1
+2967	2290 1
+2967	2297 1
+2967	2325 1
+2967	2326 1
+2967	2328 1
+2967	2354 1
+2967	2356 1
+2967	2364 1
+2967	2371 1
+2967	2381 1
+2967	2384 1
+2967	2398 1
+2967	2411 1
+2967	2433 1
+2967	2456 1
+2967	2474 1
+2967	2485 1
+2967	2506 1
+2967	2516 1
+2967	2517 1
+2967	2565 1
+2967	2576 1
+2967	2595 1
+2967	2597 1
+2967	2612 1
+2967	2646 1
+2967	2653 1
+2967	2654 1
+2967	2655 1
+2967	2657 1
+2967	2660 1
+2967	2674 1
+2967	2693 1
+2967	2696 1
+2967	2697 1
+2967	2707 1
+2967	2760 1
+2967	2775 1
+2967	2787 1
+2967	2790 1
+2967	2859 1
+2967	2871 1
+2967	2900 1
+2967	2912 1
+2967	2918 1
+2967	2932 1
+2967	2958 1
+2967	2966 1
+2967	2968 1
+2967	2981 1
+2967	3002 1
+2967	3005 1
+2967	3007 1
+2967	3009 1
+2967	3010 1
+2967	3014 1
+2967	3026 1
+2967	3029 1
+2967	3034 1
+2967	3059 1
+2967	3073 1
+2967	3117 1
+2967	3140 1
+2967	3148 1
+2967	3173 1
+2967	3192 1
+2967	3258 1
+2967	3265 1
+2967	3276 1
+2967	3284 1
+2967	3291 1
+2967	3309 1
+2967	3321 1
+2967	3334 1
+2967	3346 1
+2967	3351 1
+2967	3352 1
+2967	3394 1
+2967	3404 1
+2967	3435 1
+2967	3439 1
+2967	3447 1
+2967	3453 1
+2967	3455 1
+2967	3456 1
+2967	3458 1
+2967	3463 1
+2967	3479 1
+2967	3520 1
+2967	3529 1
+2967	3538 1
+2967	3562 1
+2967	3568 1
+2967	3580 1
+2967	3587 1
+2967	3607 1
+2967	3609 1
+2967	3615 1
+2967	3631 1
+2967	3635 1
+2967	3643 1
+2967	3660 1
+2967	3680 1
+2967	3691 1
+2967	3717 1
+2967	3724 1
+2967	3748 1
+2967	3787 1
+2967	3796 1
+2967	3806 1
+2967	3813 1
+2967	3843 1
+2967	3847 1
+2967	3854 1
+2967	3871 1
+2967	3903 1
+2967	3912 1
+2967	3956 1
+2967	3958 1
+2967	3976 1
+2967	4011 1
+2967	4013 1
+2967	4021 1
+2967	4024 1
+2967	4037 1
+2967	4040 1
+2967	4043 1
+2967	4044 1
+2967	4055 1
+2967	4086 1
+2967	4088 1
+2967	4099 1
+2967	4103 1
+2967	4110 1
+2967	4117 1
+2967	4124 1
+2967	4138 1
+2967	4162 1
+2967	4179 1
+2967	4181 1
+2967	4191 1
+2967	4201 1
+2967	4212 1
+2967	4219 1
+2967	4220 1
+2967	4233 1
+2967	4234 1
+2967	4247 1
+2967	4256 1
+2967	4261 1
+2967	4263 1
+2967	4266 1
+2967	4269 1
+2967	4289 1
+2967	4290 1
+2967	4297 1
+2967	4335 1
+2967	4422 1
+2967	4453 1
+2967	4471 1
+2967	4485 1
+2967	4510 1
+2967	4551 1
+2967	4574 1
+2967	4578 1
+2967	4600 1
+2967	4613 1
+2967	4653 1
+2967	4661 1
+2967	4662 1
+2967	4666 1
+2967	4706 1
+2967	4719 1
+2967	4735 1
+2967	4792 1
+2967	4796 1
+2967	4811 1
+2967	4814 1
+2967	4827 1
+2967	4828 1
+2967	4938 1
+2967	4953 1
+2967	4962 1
+2967	4999 1
+2967	5026 1
+2967	5055 1
+2967	5058 1
+2967	5073 1
+2967	5083 1
+2967	5092 1
+2967	5100 1
+2967	5106 1
+2967	5130 1
+2967	5132 1
+2967	5176 1
+2967	5445 1
+2967	5459 1
+2967	5511 1
+2967	6148 1
+2967	6306 1
+2967	6400 1
+2967	8293 1
+2967	8294 1
+2968	465 1
+2968	762 1
+2968	1166 1
+2968	1357 1
+2968	1416 1
+2968	1633 1
+2968	1679 1
+2968	1754 1
+2968	1982 1
+2968	2135 1
+2968	2225 1
+2968	2251 1
+2968	2258 1
+2968	2297 1
+2968	2542 1
+2968	2576 1
+2968	2605 1
+2968	2653 1
+2968	2658 1
+2968	2697 1
+2968	2785 1
+2968	2966 1
+2968	3026 1
+2968	3089 1
+2968	3117 1
+2968	3265 1
+2968	3276 1
+2968	3293 1
+2968	3338 1
+2968	3394 1
+2968	3454 1
+2968	3456 1
+2968	3473 1
+2968	3489 1
+2968	3516 1
+2968	3557 1
+2968	3562 1
+2968	3650 1
+2968	3724 1
+2968	4124 1
+2968	4173 1
+2968	4179 1
+2968	4191 1
+2968	4234 1
+2968	4349 1
+2968	4735 1
+2968	4983 1
+2968	5072 1
+2968	5073 1
+2968	5148 1
+2968	5459 1
+2968	5582 1
+2968	7620 1
+2968	7699 1
+2968	7908 1
+2972	15 1
+2972	222 1
+2972	406 1
+2972	608 1
+2972	737 1
+2972	778 1
+2972	825 1
+2972	896 1
+2972	1159 1
+2972	1239 1
+2972	1247 1
+2972	1305 1
+2972	1310 1
+2972	1360 1
+2972	1549 1
+2972	1680 1
+2972	1688 1
+2972	1733 1
+2972	1769 1
+2972	1799 1
+2972	1972 1
+2972	1990 1
+2972	2001 1
+2972	2134 1
+2972	2144 1
+2972	2145 1
+2972	2237 1
+2972	2240 1
+2972	2273 1
+2972	2328 1
+2972	2364 1
+2972	2369 1
+2972	2381 1
+2972	2440 1
+2972	2507 1
+2972	2511 1
+2972	2517 1
+2972	2552 1
+2972	2565 1
+2972	2576 1
+2972	2592 1
+2972	2605 1
+2972	2612 1
+2972	2619 1
+2972	2646 1
+2972	2653 1
+2972	2689 1
+2972	2696 1
+2972	2746 1
+2972	2760 1
+2972	2787 1
+2972	2811 1
+2972	2822 1
+2972	2831 1
+2972	2859 1
+2972	2871 1
+2972	2909 1
+2972	2914 1
+2972	2932 1
+2972	2958 1
+2972	2973 1
+2972	2981 1
+2972	3002 1
+2972	3027 1
+2972	3028 1
+2972	3089 1
+2972	3092 1
+2972	3103 1
+2972	3125 1
+2972	3140 1
+2972	3144 1
+2972	3192 1
+2972	3258 1
+2972	3274 1
+2972	3291 1
+2972	3320 1
+2972	3321 1
+2972	3334 1
+2972	3352 1
+2972	3376 1
+2972	3417 1
+2972	3433 1
+2972	3439 1
+2972	3447 1
+2972	3452 1
+2972	3453 1
+2972	3454 1
+2972	3456 1
+2972	3460 1
+2972	3479 1
+2972	3498 1
+2972	3537 1
+2972	3557 1
+2972	3562 1
+2972	3568 1
+2972	3607 1
+2972	3615 1
+2972	3634 1
+2972	3635 1
+2972	3645 1
+2972	3650 1
+2972	3661 1
+2972	3664 1
+2972	3691 1
+2972	3720 1
+2972	3748 1
+2972	3755 1
+2972	3796 1
+2972	3800 1
+2972	3816 1
+2972	3835 1
+2972	3843 1
+2972	3854 1
+2972	3873 1
+2972	3885 1
+2972	3898 1
+2972	3903 1
+2972	3910 1
+2972	3919 1
+2972	3926 1
+2972	3946 1
+2972	3956 1
+2972	3958 1
+2972	3967 1
+2972	3973 1
+2972	4012 1
+2972	4030 1
+2972	4031 1
+2972	4037 1
+2972	4040 1
+2972	4043 1
+2972	4044 1
+2972	4047 1
+2972	4055 1
+2972	4058 1
+2972	4099 1
+2972	4103 1
+2972	4124 1
+2972	4162 1
+2972	4173 1
+2972	4175 1
+2972	4212 1
+2972	4219 1
+2972	4247 1
+2972	4261 1
+2972	4263 1
+2972	4266 1
+2972	4269 1
+2972	4297 1
+2972	4298 1
+2972	4299 1
+2972	4315 1
+2972	4331 1
+2972	4335 1
+2972	4338 1
+2972	4351 1
+2972	4361 1
+2972	4400 1
+2972	4411 1
+2972	4412 1
+2972	4422 1
+2972	4448 1
+2972	4453 1
+2972	4468 1
+2972	4482 1
+2972	4485 1
+2972	4500 1
+2972	4507 1
+2972	4527 1
+2972	4528 1
+2972	4529 1
+2972	4534 1
+2972	4536 1
+2972	4547 1
+2972	4551 1
+2972	4562 1
+2972	4578 1
+2972	4587 1
+2972	4600 1
+2972	4604 1
+2972	4613 1
+2972	4625 1
+2972	4631 1
+2972	4653 1
+2972	4661 1
+2972	4662 1
+2972	4666 1
+2972	4689 1
+2972	4706 1
+2972	4712 1
+2972	4717 1
+2972	4719 1
+2972	4735 1
+2972	4748 1
+2972	4780 1
+2972	4792 1
+2972	4795 1
+2972	4796 1
+2972	4797 1
+2972	4811 1
+2972	4814 1
+2972	4815 1
+2972	4824 1
+2972	4827 1
+2972	4828 1
+2972	4831 1
+2972	4846 1
+2972	4866 1
+2972	4899 1
+2972	4929 1
+2972	4934 1
+2972	4938 1
+2972	4964 1
+2972	4986 1
+2972	4987 1
+2972	4992 1
+2972	4999 1
+2972	5026 1
+2972	5055 1
+2972	5061 1
+2972	5073 1
+2972	5092 1
+2972	5100 1
+2972	5106 1
+2972	5130 1
+2972	5132 1
+2972	5140 1
+2972	5144 1
+2972	5155 1
+2972	5176 1
+2972	5178 1
+2972	5199 1
+2972	5204 1
+2972	5208 1
+2972	5210 1
+2972	5222 1
+2972	5226 1
+2972	5233 1
+2972	5239 1
+2972	5245 1
+2972	5254 1
+2972	5262 1
+2972	5273 1
+2972	5295 1
+2972	5298 1
+2972	5305 1
+2972	5326 1
+2972	5335 1
+2972	5387 1
+2972	5392 1
+2972	5404 1
+2972	5412 1
+2972	5415 1
+2972	5423 1
+2972	5430 1
+2972	5449 1
+2972	5459 1
+2972	5463 1
+2972	5467 1
+2972	5484 1
+2972	5506 1
+2972	5513 1
+2972	5524 1
+2972	5545 1
+2972	5559 1
+2972	5563 1
+2972	5626 1
+2972	5637 1
+2972	5638 1
+2972	5639 1
+2972	5663 1
+2972	5693 1
+2972	5694 1
+2972	5697 1
+2972	5705 1
+2972	5721 1
+2972	5732 1
+2972	5737 1
+2972	5738 1
+2972	5743 1
+2972	5756 1
+2972	5757 1
+2972	5775 1
+2972	5776 1
+2972	5814 1
+2972	5817 1
+2972	5818 1
+2972	5822 1
+2972	5844 1
+2972	5848 1
+2972	5969 1
+2972	5977 1
+2972	5980 1
+2972	5991 1
+2972	6097 1
+2972	6166 1
+2972	6170 1
+2972	6235 1
+2972	6246 1
+2972	6251 1
+2972	6272 1
+2972	6311 1
+2972	6330 1
+2972	6414 1
+2972	6435 1
+2972	6441 1
+2972	6458 1
+2972	6462 1
+2972	6472 1
+2972	6474 1
+2972	6481 1
+2972	6491 1
+2972	6498 1
+2972	6501 1
+2972	6503 1
+2972	6505 1
+2972	6511 1
+2972	6528 1
+2972	6543 1
+2972	6554 1
+2972	6555 1
+2972	6560 1
+2972	6566 1
+2972	6570 1
+2972	6576 1
+2972	6589 1
+2972	6594 1
+2972	6596 1
+2972	6600 1
+2972	6611 1
+2972	6632 1
+2972	6670 1
+2972	6699 1
+2972	6736 1
+2972	6765 1
+2972	6774 1
+2972	6855 1
+2972	6860 1
+2972	6869 1
+2972	6930 1
+2972	6942 1
+2972	6946 1
+2972	6955 1
+2972	6982 1
+2972	6994 1
+2972	7023 1
+2972	7074 1
+2972	7101 1
+2972	7115 1
+2972	7116 1
+2972	7119 1
+2972	7162 1
+2972	7185 1
+2972	7186 1
+2972	7734 1
+2972	8294 1
+2972	8295 1
+2971	2972 1
+2969	2655 1
+2969	2972 1
+2969	3028 1
+2970	2972 1
+2974	762 1
+2974	1915 1
+2974	2565 1
+2974	2775 1
+2974	2977 1
+2974	2981 1
+2974	3099 1
+2974	3480 1
+2974	3562 1
+2974	3720 1
+2974	4051 1
+2974	4110 1
+2974	4173 1
+2974	5743 1
+2974	8293 1
+2978	856 1
+2978	2237 1
+2978	2830 1
+2978	2977 1
+2978	3155 1
+2978	3164 1
+2980	2560 1
+2982	1596 1
+2983	1493 1
+2983	1596 1
+2983	1982 1
+2983	3014 1
+2983	4127 1
+2983	4335 1
+2983	4432 1
+2983	4940 1
+2983	5022 1
+2983	5058 1
+2983	5738 1
+2983	6618 1
+2983	6634 1
+2983	6720 1
+2983	6737 1
+2983	7391 1
+2983	7791 1
+2983	7810 1
+2983	7833 1
+2983	8051 1
+2983	8168 1
+2983	8178 1
+2983	8192 1
+2983	8198 1
+2983	8212 1
+2983	8224 1
+2983	8237 1
+2983	8249 1
+2985	1315 1
+2985	2016 1
+2985	3748 1
+2985	6347 1
+2986	1315 1
+2986	2371 1
+2986	3537 1
+2987	1315 1
+2987	1357 1
+2987	1734 1
+2987	1754 1
+2987	2371 1
+2987	2830 1
+2987	3089 1
+2987	3126 1
+2987	3130 1
+2988	737 1
+2988	1191 1
+2988	1315 1
+2988	1473 1
+2988	1493 1
+2988	2016 1
+2988	2252 1
+2988	2257 1
+2988	2328 1
+2988	2485 1
+2988	2565 1
+2988	2592 1
+2988	2653 1
+2988	2654 1
+2988	2657 1
+2988	2696 1
+2988	2819 1
+2988	3026 1
+2988	3059 1
+2988	3173 1
+2988	3192 1
+2988	3404 1
+2988	3537 1
+2988	3615 1
+2988	3772 1
+2988	3796 1
+2988	3847 1
+2988	3873 1
+2988	3897 1
+2988	4041 1
+2988	4256 1
+2988	4310 1
+2988	4335 1
+2988	4483 1
+2988	4488 1
+2988	4600 1
+2988	4653 1
+2988	4687 1
+2988	4717 1
+2988	4884 1
+2988	5058 1
+2988	5092 1
+2988	5178 1
+2988	5226 1
+2988	5262 1
+2988	5445 1
+2988	5459 1
+2988	5487 1
+2988	5511 1
+2988	5651 1
+2988	5684 1
+2988	5775 1
+2988	6148 1
+2988	6400 1
+2988	6832 1
+2989	1315 1
+2989	2371 1
+2989	2565 1
+2989	3026 1
+2989	3059 1
+2989	3173 1
+2989	3192 1
+2989	3854 1
+2989	4256 1
+2989	4999 1
+2993	2991 1
+2991	2066 1
+2991	2958 1
+2991	2993 1
+2991	3562 1
+2991	3615 1
+2991	3787 1
+2991	4179 1
+2992	2993 1
+2994	2237 1
+2994	2707 1
+2994	2993 1
+2995	2323 1
+2995	2324 1
+2995	2617 1
+2995	2993 1
+2995	3029 1
+2995	3056 1
+2995	3537 1
+2995	3567 1
+2995	4645 1
+2995	5215 1
+2998	974 1
+2998	2323 1
+2998	2830 1
+2999	825 1
+2999	1633 1
+2999	2323 1
+2999	2625 1
+2999	2822 1
+2999	3635 1
+2999	4191 1
+3007	290 1
+3007	465 1
+3007	896 1
+3007	2251 1
+3007	2323 1
+3007	2398 1
+3007	2653 1
+3007	3903 1
+3007	3914 1
+3007	4191 1
+3007	4219 1
+3007	5106 1
+3007	5484 1
+3007	5563 1
+3007	5683 1
+3000	72 1
+3000	285 1
+3000	1166 1
+3000	1633 1
+3000	1744 1
+3000	2114 1
+3000	2144 1
+3000	2225 1
+3000	2323 1
+3000	2411 1
+3000	2660 1
+3000	2662 1
+3000	2724 1
+3000	2819 1
+3000	2856 1
+3000	3021 1
+3000	3144 1
+3000	3276 1
+3000	3301 1
+3000	3307 1
+3000	3320 1
+3000	3408 1
+3000	3456 1
+3000	3568 1
+3000	3830 1
+3000	3919 1
+3000	4748 1
+3000	4994 1
+3000	5123 1
+3000	5178 1
+3000	5182 1
+3000	5210 1
+3000	5311 1
+3000	5800 1
+3000	5802 1
+3000	5806 1
+3000	5811 1
+3000	6424 1
+3000	6599 1
+3000	6715 1
+3000	6832 1
+3000	6840 1
+3000	8297 1
+3001	2323 1
+3001	2485 1
+3001	2542 1
+3001	2654 1
+3001	3192 1
+3001	3352 1
+3001	3408 1
+3002	2323 1
+3002	2364 1
+3002	3456 1
+3002	5123 1
+3002	5412 1
+3008	2323 1
+3003	2323 1
+3009	204 1
+3009	417 1
+3009	762 1
+3009	974 1
+3009	1385 1
+3009	1733 1
+3009	2145 1
+3009	2252 1
+3009	2290 1
+3009	2297 1
+3009	2323 1
+3009	2328 1
+3009	2433 1
+3009	2508 1
+3009	2565 1
+3009	2576 1
+3009	2585 1
+3009	2653 1
+3009	2660 1
+3009	2667 1
+3009	2693 1
+3009	2765 1
+3009	2774 1
+3009	3103 1
+3009	3140 1
+3009	3144 1
+3009	3148 1
+3009	3276 1
+3009	3547 1
+3009	3614 1
+3009	3643 1
+3009	3650 1
+3009	3724 1
+3009	3812 1
+3009	4338 1
+3009	4365 1
+3009	4373 1
+3009	4384 1
+3009	4400 1
+3009	4422 1
+3009	4510 1
+3009	4528 1
+3009	4529 1
+3009	4578 1
+3009	4666 1
+3009	5072 1
+3009	5182 1
+3009	5524 1
+3009	5543 1
+3009	5756 1
+3009	6417 1
+3004	15 1
+3004	2323 1
+3004	3443 1
+3005	290 1
+3005	417 1
+3005	974 1
+3005	1307 1
+3005	1357 1
+3005	1549 1
+3005	2066 1
+3005	2210 1
+3005	2256 1
+3005	2297 1
+3005	2323 1
+3005	2474 1
+3005	2576 1
+3005	2585 1
+3005	2594 1
+3005	2625 1
+3005	2654 1
+3005	2700 1
+3005	3024 1
+3005	3030 1
+3005	3260 1
+3005	3265 1
+3005	3319 1
+3005	3435 1
+3005	3529 1
+3005	3562 1
+3005	3580 1
+3005	4021 1
+3006	290 1
+3006	762 1
+3006	856 1
+3006	1267 1
+3006	1291 1
+3006	1792 1
+3006	1814 1
+3006	2225 1
+3006	2256 1
+3006	2323 1
+3006	2325 1
+3006	2356 1
+3006	2371 1
+3006	2594 1
+3006	2617 1
+3006	2654 1
+3006	2662 1
+3006	2707 1
+3006	2721 1
+3006	2856 1
+3006	2968 1
+3006	2991 1
+3006	2999 1
+3006	3020 1
+3006	3021 1
+3006	3029 1
+3006	3030 1
+3006	3050 1
+3006	3068 1
+3006	3338 1
+3006	3351 1
+3010	465 1
+3010	608 1
+3010	825 1
+3010	974 1
+3010	1166 1
+3010	1291 1
+3010	1297 1
+3010	1307 1
+3010	1549 1
+3010	1633 1
+3010	1706 1
+3010	1734 1
+3010	1744 1
+3010	1754 1
+3010	1799 1
+3010	1915 1
+3010	1990 1
+3010	2135 1
+3010	2160 1
+3010	2209 1
+3010	2251 1
+3010	2252 1
+3010	2257 1
+3010	2297 1
+3010	2324 1
+3010	2325 1
+3010	2326 1
+3010	2356 1
+3010	2411 1
+3010	2485 1
+3010	2510 1
+3010	2544 1
+3010	2565 1
+3010	2597 1
+3010	2653 1
+3010	2654 1
+3010	2657 1
+3010	2660 1
+3010	2667 1
+3010	2674 1
+3010	2693 1
+3010	2697 1
+3010	2707 1
+3010	2721 1
+3010	2727 1
+3010	2747 1
+3010	2799 1
+3010	2815 1
+3010	2973 1
+3010	2974 1
+3010	2999 1
+3010	3005 1
+3010	3007 1
+3010	3009 1
+3010	3024 1
+3010	3026 1
+3010	3028 1
+3010	3030 1
+3010	3033 1
+3010	3059 1
+3010	3084 1
+3010	3089 1
+3010	3103 1
+3010	3114 1
+3010	3117 1
+3010	3148 1
+3010	3173 1
+3010	3251 1
+3010	3265 1
+3010	3307 1
+3010	3338 1
+3010	3351 1
+3010	3352 1
+3010	3371 1
+3010	3404 1
+3010	3408 1
+3010	3435 1
+3010	3473 1
+3010	3480 1
+3010	3483 1
+3010	3520 1
+3010	3529 1
+3010	3537 1
+3010	3549 1
+3010	3557 1
+3010	3580 1
+3010	3587 1
+3010	3609 1
+3010	3629 1
+3010	3650 1
+3010	3670 1
+3010	3680 1
+3010	3717 1
+3010	3769 1
+3010	3772 1
+3010	3776 1
+3010	3807 1
+3010	3847 1
+3010	3871 1
+3010	3887 1
+3010	3892 1
+3010	3903 1
+3010	3937 1
+3010	4400 1
+3010	4712 1
+3010	4764 1
+3010	5022 1
+3010	5072 1
+3010	5130 1
+3010	5222 1
+3010	5412 1
+3010	5445 1
+3010	5449 1
+3010	5596 1
+3010	5780 1
+3010	5829 1
+3010	5871 1
+3010	6347 1
+3010	6441 1
+3010	6770 1
+3010	6783 1
+3010	8293 1
+3010	8294 1
+3011	2815 1
+3012	2999 1
+3013	2999 1
+2707	290 1
+2707	825 1
+2707	856 1
+2707	1239 1
+2707	1357 1
+2707	1385 1
+2707	1437 1
+2707	1473 1
+2707	1549 1
+2707	1633 1
+2707	1679 1
+2707	1733 1
+2707	1814 1
+2707	1919 1
+2707	2066 1
+2707	2225 1
+2707	2237 1
+2707	2251 1
+2707	2289 1
+2707	2325 1
+2707	2328 1
+2707	2338 1
+2707	2356 1
+2707	2364 1
+2707	2384 1
+2707	2398 1
+2707	2474 1
+2707	2516 1
+2707	2535 1
+2707	2565 1
+2707	2593 1
+2707	2594 1
+2707	2617 1
+2707	2619 1
+2707	2625 1
+2707	2646 1
+2707	2653 1
+2707	2662 1
+2707	2787 1
+2707	2856 1
+2707	2912 1
+2707	2958 1
+2707	2981 1
+2707	3002 1
+2707	3015 1
+2707	3020 1
+2707	3024 1
+2707	3033 1
+2707	3034 1
+2707	3073 1
+2707	3130 1
+2707	3144 1
+2707	3180 1
+2707	3258 1
+2707	3284 1
+2707	3351 1
+2707	3408 1
+2707	3439 1
+2707	3455 1
+2707	3516 1
+2707	3537 1
+2707	3568 1
+2707	3645 1
+2707	3650 1
+2707	3970 1
+2707	3973 1
+2707	4037 1
+2707	4043 1
+2707	4055 1
+2707	4088 1
+2707	4110 1
+2707	4117 1
+2707	4124 1
+2707	4179 1
+2707	4189 1
+2707	4289 1
+2707	4297 1
+2707	4335 1
+2707	4338 1
+2707	4365 1
+2707	4417 1
+2707	4422 1
+2707	4463 1
+2707	4534 1
+2707	4899 1
+2707	5055 1
+2707	5073 1
+2707	5226 1
+2707	5404 1
+2707	5432 1
+2707	5445 1
+2707	5459 1
+2707	5582 1
+2707	5637 1
+2707	5705 1
+2707	5721 1
+2707	5737 1
+2707	5775 1
+2707	6784 1
+2707	6913 1
+2707	6976 1
+2707	7301 1
+2707	7647 1
+3015	1473 1
+3015	1733 1
+3015	2001 1
+3015	2258 1
+3015	2328 1
+3015	2398 1
+3015	2707 1
+3015	3020 1
+3015	3274 1
+3015	3498 1
+3015	4037 1
+3015	4335 1
+3015	4338 1
+3015	4534 1
+3015	4536 1
+3015	4797 1
+3015	4828 1
+3015	4899 1
+3015	4980 1
+3015	5226 1
+3015	5263 1
+3015	5439 1
+3015	5445 1
+3015	5459 1
+3015	5524 1
+3015	5630 1
+3015	5638 1
+3015	5732 1
+3015	5756 1
+3015	5775 1
+3015	5780 1
+3015	5814 1
+3015	5830 1
+3015	5844 1
+3015	5926 1
+3015	5931 1
+3015	5947 1
+3015	5972 1
+3015	6010 1
+3015	6481 1
+3015	6594 1
+3015	6723 1
+3015	6784 1
+3015	6869 1
+3016	2657 1
+3016	2707 1
+3017	1291 1
+3017	2256 1
+3017	2707 1
+3018	1357 1
+3018	1754 1
+3018	1919 1
+3018	2256 1
+3018	2565 1
+3018	2623 1
+3018	2653 1
+3018	2707 1
+3018	2973 1
+3018	3034 1
+3018	3084 1
+3018	3099 1
+3018	3140 1
+3018	3371 1
+3018	3408 1
+3018	3537 1
+3018	3557 1
+3018	3680 1
+3018	3806 1
+3019	2707 1
+3020	633 1
+3020	856 1
+3020	1267 1
+3020	1357 1
+3020	1393 1
+3020	1416 1
+3020	1633 1
+3020	1679 1
+3020	1734 1
+3020	1754 1
+3020	1781 1
+3020	1792 1
+3020	1814 1
+3020	2116 1
+3020	2135 1
+3020	2225 1
+3020	2231 1
+3020	2325 1
+3020	2328 1
+3020	2356 1
+3020	2371 1
+3020	2474 1
+3020	2576 1
+3020	2593 1
+3020	2594 1
+3020	2623 1
+3020	2625 1
+3020	2651 1
+3020	2697 1
+3020	2700 1
+3020	2707 1
+3020	2713 1
+3020	2830 1
+3020	2856 1
+3020	2900 1
+3020	2912 1
+3020	2951 1
+3020	3021 1
+3020	3030 1
+3020	3089 1
+3020	3099 1
+3020	3130 1
+3020	3243 1
+3020	3251 1
+3020	3253 1
+3020	3265 1
+3020	3338 1
+3020	3363 1
+3020	3371 1
+3020	3376 1
+3020	3516 1
+3020	8293 1
+3021	285 1
+3021	1473 1
+3021	2325 1
+3021	2707 1
+3021	4071 1
+3021	6481 1
+3021	7890 1
+3022	2707 1
+3024	633 1
+3024	1166 1
+3024	1291 1
+3024	1297 1
+3024	1307 1
+3024	1453 1
+3024	1754 1
+3024	2066 1
+3024	2135 1
+3024	2225 1
+3024	2231 1
+3024	2307 1
+3024	2411 1
+3024	2485 1
+3024	2510 1
+3024	2542 1
+3024	2585 1
+3024	2594 1
+3024	2625 1
+3024	2651 1
+3024	2653 1
+3024	2660 1
+3024	2667 1
+3024	2746 1
+3024	2747 1
+3024	2900 1
+3024	2923 1
+3024	2958 1
+3024	2973 1
+3024	3005 1
+3024	3029 1
+3024	3109 1
+3024	3114 1
+3024	3117 1
+3024	3253 1
+3024	3265 1
+3024	3284 1
+3024	3307 1
+3024	3351 1
+3024	3408 1
+3024	3562 1
+3024	3580 1
+3024	3650 1
+3024	3748 1
+3024	3898 1
+3024	4173 1
+3024	4256 1
+3024	4578 1
+3024	4735 1
+3024	5697 1
+3024	5817 1
+3024	6599 1
+3025	290 1
+3025	1919 1
+3025	2237 1
+3025	2721 1
+3026	72 1
+3026	290 1
+3026	608 1
+3026	737 1
+3026	825 1
+3026	856 1
+3026	974 1
+3026	1157 1
+3026	1247 1
+3026	1297 1
+3026	1307 1
+3026	1357 1
+3026	1385 1
+3026	1437 1
+3026	1548 1
+3026	1633 1
+3026	1688 1
+3026	1706 1
+3026	1729 1
+3026	1754 1
+3026	1792 1
+3026	1799 1
+3026	1814 1
+3026	1919 1
+3026	2016 1
+3026	2066 1
+3026	2134 1
+3026	2135 1
+3026	2145 1
+3026	2209 1
+3026	2225 1
+3026	2237 1
+3026	2251 1
+3026	2252 1
+3026	2307 1
+3026	2324 1
+3026	2328 1
+3026	2338 1
+3026	2354 1
+3026	2371 1
+3026	2384 1
+3026	2411 1
+3026	2485 1
+3026	2508 1
+3026	2510 1
+3026	2516 1
+3026	2535 1
+3026	2544 1
+3026	2550 1
+3026	2565 1
+3026	2592 1
+3026	2595 1
+3026	2625 1
+3026	2651 1
+3026	2653 1
+3026	2654 1
+3026	2660 1
+3026	2667 1
+3026	2674 1
+3026	2686 1
+3026	2693 1
+3026	2696 1
+3026	2697 1
+3026	2700 1
+3026	2721 1
+3026	2747 1
+3026	2760 1
+3026	2775 1
+3026	2819 1
+3026	2859 1
+3026	2871 1
+3026	2932 1
+3026	2958 1
+3026	2973 1
+3026	3007 1
+3026	3014 1
+3026	3024 1
+3026	3027 1
+3026	3028 1
+3026	3029 1
+3026	3033 1
+3026	3050 1
+3026	3059 1
+3026	3073 1
+3026	3084 1
+3026	3092 1
+3026	3103 1
+3026	3106 1
+3026	3117 1
+3026	3144 1
+3026	3148 1
+3026	3173 1
+3026	3180 1
+3026	3192 1
+3026	3200 1
+3026	3258 1
+3026	3260 1
+3026	3265 1
+3026	3276 1
+3026	3313 1
+3026	3324 1
+3026	3352 1
+3026	3404 1
+3026	3443 1
+3026	3452 1
+3026	3454 1
+3026	3456 1
+3026	3480 1
+3026	3529 1
+3026	3537 1
+3026	3548 1
+3026	3562 1
+3026	3568 1
+3026	3587 1
+3026	3607 1
+3026	3615 1
+3026	3635 1
+3026	3643 1
+3026	3645 1
+3026	3650 1
+3026	3680 1
+3026	3720 1
+3026	3724 1
+3026	3748 1
+3026	3813 1
+3026	3843 1
+3026	3847 1
+3026	3854 1
+3026	3875 1
+3026	3892 1
+3026	3897 1
+3026	3903 1
+3026	3910 1
+3026	4011 1
+3026	4024 1
+3026	4031 1
+3026	4043 1
+3026	4051 1
+3026	4124 1
+3026	4162 1
+3026	4181 1
+3026	4183 1
+3026	4189 1
+3026	4191 1
+3026	4201 1
+3026	4234 1
+3026	4256 1
+3026	4261 1
+3026	4323 1
+3026	4335 1
+3026	4349 1
+3026	4384 1
+3026	4448 1
+3026	4453 1
+3026	4480 1
+3026	4510 1
+3026	4531 1
+3026	4536 1
+3026	4547 1
+3026	4578 1
+3026	4587 1
+3026	4600 1
+3026	4706 1
+3026	4712 1
+3026	4827 1
+3026	4962 1
+3026	4983 1
+3026	4999 1
+3026	5026 1
+3026	5055 1
+3026	5123 1
+3026	5130 1
+3026	5412 1
+3026	5452 1
+3026	8293 1
+3029	3027 1
+3029	5179 1
+3027	15 1
+3027	737 1
+3027	1310 1
+3027	1549 1
+3027	2456 1
+3027	2576 1
+3027	2774 1
+3027	2831 1
+3027	3029 1
+3027	3089 1
+3027	3456 1
+3027	3922 1
+3027	3976 1
+3027	4247 1
+3027	4310 1
+3027	4335 1
+3027	4536 1
+3027	4574 1
+3027	4712 1
+3027	4781 1
+3027	4808 1
+3027	5079 1
+3027	5178 1
+3027	5210 1
+3027	5457 1
+3027	5697 1
+3027	5863 1
+3027	5871 1
+3027	6044 1
+3027	6124 1
+3027	6441 1
+3027	6458 1
+3027	6498 1
+3027	6554 1
+3027	6576 1
+3027	6600 1
+3027	6948 1
+3027	7450 1
+3027	7478 1
+3028	72 1
+3028	417 1
+3028	465 1
+3028	525 1
+3028	608 1
+3028	737 1
+3028	762 1
+3028	825 1
+3028	978 1
+3028	1024 1
+3028	1166 1
+3028	1393 1
+3028	1633 1
+3028	1679 1
+3028	1814 1
+3028	1961 1
+3028	2145 1
+3028	2209 1
+3028	2210 1
+3028	2231 1
+3028	2237 1
+3028	2252 1
+3028	2256 1
+3028	2257 1
+3028	2297 1
+3028	2326 1
+3028	2328 1
+3028	2371 1
+3028	2398 1
+3028	2426 1
+3028	2485 1
+3028	2510 1
+3028	2535 1
+3028	2550 1
+3028	2576 1
+3028	2585 1
+3028	2619 1
+3028	2623 1
+3028	2625 1
+3028	2651 1
+3028	2653 1
+3028	2654 1
+3028	2657 1
+3028	2660 1
+3028	2674 1
+3028	2686 1
+3028	2687 1
+3028	2693 1
+3028	2799 1
+3028	2859 1
+3028	2871 1
+3028	2923 1
+3028	2958 1
+3028	2974 1
+3028	3007 1
+3028	3009 1
+3028	3026 1
+3028	3029 1
+3028	3084 1
+3028	3089 1
+3028	3130 1
+3028	3251 1
+3028	3258 1
+3028	3265 1
+3028	3271 1
+3028	3285 1
+3028	3319 1
+3028	3351 1
+3028	3352 1
+3028	3439 1
+3028	3454 1
+3028	3456 1
+3028	3473 1
+3028	3480 1
+3028	3529 1
+3028	3557 1
+3028	3567 1
+3028	3568 1
+3028	3576 1
+3028	3580 1
+3028	3614 1
+3028	3616 1
+3028	3629 1
+3028	3634 1
+3028	3635 1
+3028	3650 1
+3028	3661 1
+3028	3670 1
+3028	3776 1
+3028	3785 1
+3028	3880 1
+3028	3892 1
+3028	3897 1
+3028	3898 1
+3028	3903 1
+3028	3914 1
+3028	3922 1
+3028	3956 1
+3028	3974 1
+3028	4011 1
+3028	4078 1
+3028	4099 1
+3028	4124 1
+3028	4138 1
+3028	4189 1
+3028	4191 1
+3028	4201 1
+3028	4216 1
+3028	4218 1
+3028	4220 1
+3028	4231 1
+3028	4256 1
+3028	4297 1
+3028	4310 1
+3028	4331 1
+3028	4335 1
+3028	4384 1
+3028	4385 1
+3028	4403 1
+3028	4468 1
+3028	4485 1
+3028	4507 1
+3028	4510 1
+3028	4529 1
+3028	4550 1
+3028	4551 1
+3028	4552 1
+3028	4557 1
+3028	4578 1
+3028	4584 1
+3028	4631 1
+3028	4639 1
+3028	4648 1
+3028	4650 1
+3028	4677 1
+3028	4678 1
+3028	4684 1
+3028	4715 1
+3028	4777 1
+3028	4778 1
+3028	4779 1
+3028	4780 1
+3028	4783 1
+3028	4822 1
+3028	4828 1
+3028	4831 1
+3028	4875 1
+3028	4887 1
+3028	4962 1
+3028	4964 1
+3028	4983 1
+3028	4987 1
+3028	4999 1
+3028	5043 1
+3028	5083 1
+3028	5146 1
+3028	5267 1
+3028	5350 1
+3028	5412 1
+3028	5415 1
+3028	5442 1
+3028	5459 1
+3028	5467 1
+3028	5638 1
+3028	5697 1
+3028	5738 1
+3028	5928 1
+3028	5936 1
+3028	6009 1
+3028	6098 1
+3028	6130 1
+3028	6261 1
+3028	6302 1
+3028	6306 1
+3028	6311 1
+3028	6321 1
+3028	6340 1
+3028	6376 1
+3028	6409 1
+3028	6427 1
+3028	6462 1
+3028	6474 1
+3028	6475 1
+3028	6529 1
+3028	6668 1
+3028	6670 1
+3028	6685 1
+3028	6686 1
+3028	8294 1
+3031	204 1
+3031	417 1
+3031	974 1
+3031	1166 1
+3031	1267 1
+3031	1297 1
+3031	1571 1
+3031	1633 1
+3031	1734 1
+3031	1754 1
+3031	2016 1
+3031	2206 1
+3031	2231 1
+3031	2371 1
+3031	2398 1
+3031	2485 1
+3031	2542 1
+3031	2565 1
+3031	2576 1
+3031	2594 1
+3031	2625 1
+3031	2651 1
+3031	2653 1
+3031	2654 1
+3031	2657 1
+3031	2660 1
+3031	2662 1
+3031	2693 1
+3031	2697 1
+3031	2900 1
+3031	2912 1
+3031	2918 1
+3031	3005 1
+3031	3018 1
+3031	3130 1
+3031	3145 1
+3031	3150 1
+3031	3173 1
+3031	3200 1
+3031	3265 1
+3031	3351 1
+3031	3408 1
+3031	3435 1
+3031	3439 1
+3031	3516 1
+3031	3537 1
+3031	3567 1
+3031	3580 1
+3031	3803 1
+3031	3847 1
+3032	15 1
+3032	72 1
+3032	737 1
+3032	762 1
+3032	856 1
+3032	967 1
+3032	978 1
+3032	1140 1
+3032	1157 1
+3032	1166 1
+3032	1239 1
+3032	1297 1
+3032	1385 1
+3032	1453 1
+3032	1680 1
+3032	1744 1
+3032	1777 1
+3032	1792 1
+3032	1799 1
+3032	1823 1
+3032	1915 1
+3032	2066 1
+3032	2134 1
+3032	2135 1
+3032	2252 1
+3032	2257 1
+3032	2285 1
+3032	2289 1
+3032	2290 1
+3032	2326 1
+3032	2328 1
+3032	2354 1
+3032	2398 1
+3032	2411 1
+3032	2485 1
+3032	2508 1
+3032	2516 1
+3032	2550 1
+3032	2565 1
+3032	2576 1
+3032	2585 1
+3032	2592 1
+3032	2594 1
+3032	2651 1
+3032	2657 1
+3032	2662 1
+3032	2674 1
+3032	2687 1
+3032	2713 1
+3032	2724 1
+3032	2747 1
+3032	2754 1
+3032	2775 1
+3032	2790 1
+3032	2811 1
+3032	2859 1
+3032	2900 1
+3032	2912 1
+3032	2923 1
+3032	3005 1
+3032	3020 1
+3032	3026 1
+3032	3027 1
+3032	3089 1
+3032	3106 1
+3032	3140 1
+3032	3145 1
+3032	3173 1
+3032	3180 1
+3032	3192 1
+3032	3200 1
+3032	3238 1
+3032	3276 1
+3032	3291 1
+3032	3297 1
+3032	3301 1
+3032	3346 1
+3032	3352 1
+3032	3393 1
+3032	3394 1
+3032	3439 1
+3032	3452 1
+3032	3453 1
+3032	3454 1
+3032	3455 1
+3032	3456 1
+3032	3458 1
+3032	3516 1
+3032	3520 1
+3032	3541 1
+3032	3557 1
+3032	3567 1
+3032	3568 1
+3032	3587 1
+3032	3615 1
+3032	3635 1
+3032	3645 1
+3032	3670 1
+3032	3681 1
+3032	3724 1
+3032	3787 1
+3032	3803 1
+3032	3813 1
+3032	3843 1
+3032	3871 1
+3032	3885 1
+3032	3887 1
+3032	3897 1
+3032	3910 1
+3032	3926 1
+3032	3937 1
+3032	3946 1
+3032	3958 1
+3032	4013 1
+3032	4065 1
+3032	4138 1
+3032	4179 1
+3032	4191 1
+3032	4233 1
+3032	4247 1
+3032	4266 1
+3032	4269 1
+3032	4289 1
+3032	4290 1
+3032	4297 1
+3032	4298 1
+3032	4299 1
+3032	4323 1
+3032	4373 1
+3032	4384 1
+3032	4386 1
+3032	4402 1
+3032	4417 1
+3032	4424 1
+3032	4432 1
+3032	4453 1
+3032	4463 1
+3032	4466 1
+3032	4471 1
+3032	4483 1
+3032	4510 1
+3032	4528 1
+3032	4530 1
+3032	4536 1
+3032	4588 1
+3032	4653 1
+3032	4661 1
+3032	4666 1
+3032	4712 1
+3032	4717 1
+3032	4780 1
+3032	4791 1
+3032	4795 1
+3032	4846 1
+3032	4953 1
+3032	4981 1
+3032	5020 1
+3032	5022 1
+3032	5178 1
+3032	5254 1
+3032	5262 1
+3032	5323 1
+3032	5327 1
+3032	5335 1
+3032	5426 1
+3032	5430 1
+3032	5449 1
+3032	5452 1
+3032	5524 1
+3032	5529 1
+3032	5626 1
+3032	5650 1
+3032	5651 1
+3032	5697 1
+3032	5776 1
+3032	5799 1
+3032	5822 1
+3032	5828 1
+3032	5863 1
+3032	5922 1
+3032	5932 1
+3032	6001 1
+3032	6148 1
+3032	6151 1
+3032	6156 1
+3032	6170 1
+3032	6218 1
+3032	6251 1
+3032	6272 1
+3032	6334 1
+3032	6337 1
+3032	6347 1
+3032	6388 1
+3032	6432 1
+3032	6437 1
+3032	6501 1
+3032	6566 1
+3032	6599 1
+3032	6600 1
+3032	6737 1
+3032	6759 1
+3032	6770 1
+3032	6774 1
+3032	6784 1
+3032	6833 1
+3032	6897 1
+3032	6918 1
+3032	7054 1
+3032	7120 1
+3032	7378 1
+3032	7478 1
+3032	7574 1
+3032	7587 1
+3032	7620 1
+3032	8083 1
+3032	8297 1
+3033	204 1
+3033	417 1
+3033	762 1
+3033	1166 1
+3033	1357 1
+3033	1393 1
+3033	1571 1
+3033	1734 1
+3033	1781 1
+3033	2016 1
+3033	2135 1
+3033	2251 1
+3033	2289 1
+3033	2290 1
+3033	2297 1
+3033	2328 1
+3033	2371 1
+3033	2474 1
+3033	2485 1
+3033	2550 1
+3033	2593 1
+3033	2653 1
+3033	2654 1
+3033	2657 1
+3033	2674 1
+3033	2693 1
+3033	2697 1
+3033	2819 1
+3033	2830 1
+3033	2856 1
+3033	2859 1
+3033	2912 1
+3033	2958 1
+3033	3024 1
+3033	3026 1
+3033	3059 1
+3033	3089 1
+3033	3150 1
+3033	3164 1
+3033	3443 1
+3033	3568 1
+3033	3580 1
+3033	3650 1
+3033	4510 1
+3033	4735 1
+3034	762 1
+3034	978 1
+3034	1157 1
+3034	1297 1
+3034	1360 1
+3034	2145 1
+3034	2231 1
+3034	2237 1
+3034	2328 1
+3034	2398 1
+3034	2440 1
+3034	2625 1
+3034	2871 1
+3034	2912 1
+3034	3005 1
+3034	3014 1
+3034	3089 1
+3034	3092 1
+3034	3106 1
+3034	3309 1
+3034	3321 1
+3034	3443 1
+3034	3568 1
+3034	3615 1
+3034	3661 1
+3034	3724 1
+3034	4037 1
+3034	4124 1
+3034	4212 1
+3034	4453 1
+3034	4463 1
+3034	4510 1
+3034	4528 1
+3034	4531 1
+3034	4735 1
+3034	5100 1
+3034	5412 1
+3034	5790 1
+3035	1352 1
+3035	1385 1
+3035	2237 1
+3035	2912 1
+3035	3417 1
+3035	3830 1
+3035	3871 1
+3035	4600 1
+3035	5162 1
+3035	5200 1
+3035	5222 1
+3035	5412 1
+3035	5482 1
+2713	204 1
+2713	285 1
+2713	417 1
+2713	465 1
+2713	825 1
+2713	827 1
+2713	978 1
+2713	1100 1
+2713	1157 1
+2713	1166 1
+2713	1239 1
+2713	1297 1
+2713	1307 1
+2713	1385 1
+2713	1453 1
+2713	1549 1
+2713	1571 1
+2713	1633 1
+2713	1679 1
+2713	1706 1
+2713	1729 1
+2713	1777 1
+2713	1990 1
+2713	2016 1
+2713	2066 1
+2713	2134 1
+2713	2144 1
+2713	2209 1
+2713	2210 1
+2713	2252 1
+2713	2257 1
+2713	2289 1
+2713	2290 1
+2713	2297 1
+2713	2307 1
+2713	2324 1
+2713	2325 1
+2713	2328 1
+2713	2338 1
+2713	2356 1
+2713	2384 1
+2713	2398 1
+2713	2411 1
+2713	2416 1
+2713	2474 1
+2713	2485 1
+2713	2506 1
+2713	2508 1
+2713	2510 1
+2713	2516 1
+2713	2535 1
+2713	2542 1
+2713	2544 1
+2713	2565 1
+2713	2576 1
+2713	2585 1
+2713	2594 1
+2713	2595 1
+2713	2597 1
+2713	2612 1
+2713	2619 1
+2713	2623 1
+2713	2625 1
+2713	2646 1
+2713	2651 1
+2713	2653 1
+2713	2654 1
+2713	2655 1
+2713	2657 1
+2713	2660 1
+2713	2667 1
+2713	2674 1
+2713	2693 1
+2713	2746 1
+2713	2747 1
+2713	2754 1
+2713	2799 1
+2713	2819 1
+2713	2859 1
+2713	2912 1
+2713	2918 1
+2713	2932 1
+2713	2958 1
+2713	2973 1
+2713	2974 1
+2713	2981 1
+2713	3005 1
+2713	3007 1
+2713	3009 1
+2713	3021 1
+2713	3024 1
+2713	3026 1
+2713	3028 1
+2713	3030 1
+2713	3059 1
+2713	3084 1
+2713	3117 1
+2713	3125 1
+2713	3144 1
+2713	3148 1
+2713	3173 1
+2713	3180 1
+2713	3192 1
+2713	3258 1
+2713	3260 1
+2713	3265 1
+2713	3276 1
+2713	3291 1
+2713	3307 1
+2713	3338 1
+2713	3351 1
+2713	3352 1
+2713	3371 1
+2713	3394 1
+2713	3404 1
+2713	3408 1
+2713	3439 1
+2713	3480 1
+2713	3483 1
+2713	3506 1
+2713	3516 1
+2713	3520 1
+2713	3529 1
+2713	3548 1
+2713	3557 1
+2713	3562 1
+2713	3568 1
+2713	3576 1
+2713	3580 1
+2713	3587 1
+2713	3615 1
+2713	3629 1
+2713	3645 1
+2713	3646 1
+2713	3650 1
+2713	3660 1
+2713	3661 1
+2713	3670 1
+2713	3717 1
+2713	3720 1
+2713	3787 1
+2713	3800 1
+2713	3812 1
+2713	3813 1
+2713	3843 1
+2713	3871 1
+2713	3887 1
+2713	3892 1
+2713	3898 1
+2713	3903 1
+2713	3926 1
+2713	3937 1
+2713	3946 1
+2713	3970 1
+2713	3971 1
+2713	3973 1
+2713	3980 1
+2713	4011 1
+2713	4013 1
+2713	4021 1
+2713	4043 1
+2713	4051 1
+2713	4055 1
+2713	4088 1
+2713	4138 1
+2713	4162 1
+2713	4171 1
+2713	4173 1
+2713	4179 1
+2713	4181 1
+2713	4191 1
+2713	4199 1
+2713	4201 1
+2713	4233 1
+2713	4234 1
+2713	4247 1
+2713	4256 1
+2713	4263 1
+2713	4269 1
+2713	4289 1
+2713	4297 1
+2713	4299 1
+2713	4323 1
+2713	4349 1
+2713	4365 1
+2713	4373 1
+2713	4384 1
+2713	4402 1
+2713	4412 1
+2713	4417 1
+2713	4422 1
+2713	4424 1
+2713	4453 1
+2713	4463 1
+2713	4485 1
+2713	4510 1
+2713	5721 1
+2713	5732 1
+2713	8293 1
+2713	8294 1
+3037	1166 1
+3037	2256 1
+3037	2651 1
+3037	2991 1
+3037	3021 1
+3037	3089 1
+3037	3580 1
+3038	2256 1
+3039	1297 1
+3039	1633 1
+3039	2256 1
+3039	2328 1
+3039	2398 1
+3039	2585 1
+3039	2594 1
+3039	2625 1
+3039	2651 1
+3039	2660 1
+3039	2958 1
+3039	3005 1
+3039	3130 1
+3039	3260 1
+3040	762 1
+3040	1498 1
+3040	2256 1
+3040	3021 1
+3040	3576 1
+3040	3970 1
+3040	4689 1
+3041	15 1
+3041	1416 1
+3041	2256 1
+3041	2371 1
+3041	2440 1
+3041	2542 1
+3041	2576 1
+3041	2594 1
+3041	2697 1
+3041	3030 1
+3041	3140 1
+3041	3150 1
+3041	4098 1
+3041	4483 1
+3042	2256 1
+3043	2256 1
+3044	2256 1
+3044	2474 1
+3044	2900 1
+3044	3117 1
+3044	3265 1
+3044	3516 1
+3048	3050 1
+3049	2593 1
+3049	2617 1
+3049	3033 1
+3049	3034 1
+3049	3050 1
+3049	3099 1
+3046	1633 1
+3046	2251 1
+3046	2411 1
+3046	2724 1
+3046	2923 1
+3046	3018 1
+3046	3050 1
+3046	3489 1
+3046	3646 1
+3046	8293 1
+3056	1393 1
+3056	1493 1
+3056	1571 1
+3056	1744 1
+3056	1919 1
+3056	2114 1
+3056	2144 1
+3056	2209 1
+3056	2251 1
+3056	2290 1
+3056	2411 1
+3056	2416 1
+3056	2485 1
+3056	2593 1
+3056	2594 1
+3056	2623 1
+3056	2625 1
+3056	2653 1
+3056	2657 1
+3056	2667 1
+3056	2687 1
+3056	2819 1
+3056	2973 1
+3056	3002 1
+3056	3009 1
+3056	3033 1
+3056	3034 1
+3056	3099 1
+3056	3104 1
+3056	3148 1
+3056	3265 1
+3056	3307 1
+3056	3338 1
+3056	3404 1
+3056	3460 1
+3056	3516 1
+3056	3520 1
+3056	3548 1
+3056	3567 1
+3056	3587 1
+3056	3803 1
+3056	3958 1
+3056	5045 1
+3056	6595 1
+3051	3056 1
+3052	3056 1
+3053	204 1
+3053	1297 1
+3053	1633 1
+3053	2474 1
+3053	2651 1
+3053	2653 1
+3053	3056 1
+3053	3117 1
+3053	3516 1
+3054	3056 1
+3055	465 1
+3055	608 1
+3055	1297 1
+3055	1549 1
+3055	1633 1
+3055	1754 1
+3055	2114 1
+3055	2209 1
+3055	2231 1
+3055	2257 1
+3055	2585 1
+3055	2619 1
+3055	2651 1
+3055	2653 1
+3055	2654 1
+3055	2667 1
+3055	2674 1
+3055	2693 1
+3055	2746 1
+3055	2799 1
+3055	2900 1
+3055	3005 1
+3055	3009 1
+3055	3010 1
+3055	3024 1
+3055	3026 1
+3055	3028 1
+3055	3034 1
+3055	3056 1
+3055	3059 1
+3055	3148 1
+3055	3180 1
+3055	3243 1
+3055	3251 1
+3055	3253 1
+3055	3258 1
+3055	3320 1
+3055	3446 1
+3055	3473 1
+3055	3480 1
+3055	3489 1
+3055	3587 1
+3055	3629 1
+3055	3650 1
+3055	3812 1
+3055	3888 1
+3055	3903 1
+3055	3937 1
+3055	3942 1
+3055	3967 1
+3055	3971 1
+3055	8293 1
+3057	608 1
+3057	840 1
+3057	1166 1
+3057	1357 1
+3057	1473 1
+3057	1571 1
+3057	1990 1
+3057	2016 1
+3057	2516 1
+3057	2653 1
+3057	2747 1
+3057	2790 1
+3057	2822 1
+3057	3007 1
+3057	3024 1
+3057	3106 1
+3057	3148 1
+3057	3173 1
+3057	3276 1
+3057	3352 1
+3057	3443 1
+3057	3456 1
+3057	3587 1
+3057	3787 1
+3057	3969 1
+3057	4071 1
+3057	4110 1
+3057	4124 1
+3057	4247 1
+3057	4261 1
+3057	4266 1
+3057	4587 1
+3057	4600 1
+3057	4706 1
+3057	4709 1
+3057	5055 1
+3057	5775 1
+3057	6780 1
+3057	6833 1
+3057	6979 1
+3057	7073 1
+3057	7092 1
+3057	7301 1
+3057	7649 1
+3057	7833 1
+3057	7890 1
+3057	7979 1
+3057	8174 1
+3059	1437 1
+3059	1453 1
+3059	1734 1
+3059	1754 1
+3059	1837 1
+3059	1919 1
+3059	2016 1
+3059	2237 1
+3059	2251 1
+3059	2328 1
+3059	2371 1
+3059	2474 1
+3059	2485 1
+3059	2506 1
+3059	2593 1
+3059	2625 1
+3059	2651 1
+3059	2653 1
+3059	2696 1
+3059	2697 1
+3059	3026 1
+3059	3033 1
+3059	3173 1
+3059	3192 1
+3059	3265 1
+3059	3537 1
+3059	3748 1
+3059	3854 1
+3059	4124 1
+3059	4256 1
+3059	5026 1
+3059	6347 1
+3047	1781 1
+3047	1792 1
+3047	1919 1
+3047	2251 1
+3047	2411 1
+3047	2991 1
+3047	3033 1
+3047	3034 1
+3047	3068 1
+3047	3099 1
+3047	3117 1
+3047	8293 1
+3060	1919 1
+3060	2014 1
+3060	2251 1
+3060	3033 1
+2356	465 1
+2356	825 1
+2356	974 1
+2356	1166 1
+2356	1706 1
+2356	1734 1
+2356	2114 1
+2356	2134 1
+2356	2210 1
+2356	2289 1
+2356	2324 1
+2356	2328 1
+2356	2510 1
+2356	2544 1
+2356	2565 1
+2356	2585 1
+2356	2594 1
+2356	2595 1
+2356	2654 1
+2356	2655 1
+2356	2657 1
+2356	2662 1
+2356	2693 1
+2356	2727 1
+2356	2746 1
+2356	2923 1
+2356	2932 1
+2356	2958 1
+2356	2973 1
+2356	3005 1
+2356	3007 1
+2356	3024 1
+2356	3026 1
+2356	3028 1
+2356	3033 1
+2356	3084 1
+2356	3117 1
+2356	3140 1
+2356	3258 1
+2356	3352 1
+2356	3454 1
+2356	3615 1
+2356	3650 1
+2356	3800 1
+2356	3843 1
+2356	3887 1
+2356	3892 1
+2356	3903 1
+2356	3926 1
+2356	3937 1
+2356	4011 1
+2356	4021 1
+2356	4043 1
+2356	4179 1
+2356	4269 1
+2356	4290 1
+2356	4528 1
+3061	3033 1
+3061	3164 1
+3062	633 1
+3062	762 1
+3062	856 1
+3062	1267 1
+3062	1393 1
+3062	1416 1
+3062	1437 1
+3062	1734 1
+3062	1754 1
+3062	1781 1
+3062	1792 1
+3062	1814 1
+3062	1919 1
+3062	2116 1
+3062	2135 1
+3062	2225 1
+3062	2231 1
+3062	2371 1
+3062	2474 1
+3062	2485 1
+3062	2593 1
+3062	2651 1
+3062	2654 1
+3062	2662 1
+3062	2697 1
+3062	2713 1
+3062	2724 1
+3062	2830 1
+3062	2856 1
+3062	2900 1
+3062	2951 1
+3062	3033 1
+3062	3089 1
+3062	3126 1
+3062	3140 1
+3062	3150 1
+3062	3155 1
+3062	3235 1
+3062	3243 1
+3062	3251 1
+3062	3253 1
+3062	3258 1
+2976	1777 1
+2976	2617 1
+2976	2974 1
+2976	3463 1
+2976	3541 1
+2976	3888 1
+2976	4037 1
+3066	290 1
+3070	2991 1
+3070	3164 1
+3071	2251 1
+3072	1357 1
+3072	1393 1
+3072	1416 1
+3072	1754 1
+3072	1781 1
+3072	1792 1
+3072	1919 1
+3072	2135 1
+3072	2251 1
+3072	2325 1
+3072	2356 1
+3072	2371 1
+3072	2550 1
+3072	2597 1
+3072	2623 1
+3072	2625 1
+3072	2654 1
+3072	2662 1
+3072	2697 1
+3072	2724 1
+3072	2727 1
+3072	2856 1
+3072	3117 1
+3072	4712 1
+3072	8293 1
+3073	1310 1
+3073	1498 1
+3073	2066 1
+3073	2251 1
+3073	2364 1
+3073	2485 1
+3073	2506 1
+3073	2510 1
+3073	2594 1
+3073	2625 1
+3073	2651 1
+3073	2657 1
+3073	2660 1
+3073	2819 1
+3073	2981 1
+3073	3002 1
+3073	3021 1
+3073	3034 1
+3073	3130 1
+3073	3456 1
+3073	3726 1
+3073	3892 1
+3073	3969 1
+3073	4043 1
+3073	4706 1
+3073	4796 1
+3073	4820 1
+3073	4827 1
+3073	5412 1
+3073	5897 1
+3073	6907 1
+3073	6918 1
+3073	7290 1
+3073	7632 1
+3074	2251 1
+3075	1754 1
+3075	2251 1
+3076	2251 1
+3077	1919 1
+3077	2411 1
+3077	3034 1
+3077	3099 1
+3078	2411 1
+3063	3082 1
+3063	3807 1
+3063	7735 1
+3081	1157 1
+3081	1633 1
+3081	1754 1
+3081	1919 1
+3081	2066 1
+3081	2135 1
+3081	2565 1
+3081	2593 1
+3081	2594 1
+3081	2625 1
+3081	2724 1
+3081	2958 1
+3081	3082 1
+3081	3117 1
+3081	3480 1
+3081	3516 1
+3081	3607 1
+3081	4191 1
+3081	4777 1
+3081	5936 1
+3083	2593 1
+3083	3034 1
+3084	465 1
+3084	1297 1
+3084	1777 1
+3084	1915 1
+3084	1935 1
+3084	2114 1
+3084	2160 1
+3084	2210 1
+3084	2398 1
+3084	2411 1
+3084	2485 1
+3084	2585 1
+3084	2593 1
+3084	2657 1
+3084	2727 1
+3084	2746 1
+3084	2790 1
+3084	3005 1
+3084	3026 1
+3084	3059 1
+3084	3089 1
+3084	3117 1
+3084	3334 1
+3084	3352 1
+3084	3381 1
+3084	3404 1
+3084	3480 1
+3084	3537 1
+3084	3555 1
+3084	3557 1
+3084	3562 1
+3084	3568 1
+3084	3646 1
+3084	3680 1
+3084	3717 1
+3084	3720 1
+3084	3752 1
+3084	3776 1
+3084	3803 1
+3084	3807 1
+3084	3847 1
+3084	3892 1
+3084	3903 1
+3084	4735 1
+3084	5079 1
+3084	5254 1
+3084	5818 1
+3084	6043 1
+3084	6560 1
+3084	6833 1
+3084	6869 1
+3084	6980 1
+3084	7277 1
+3084	7280 1
+3084	7443 1
+3084	7620 1
+3084	7649 1
+3084	7788 1
+3084	7803 1
+3084	7809 1
+3084	8293 1
+3084	8294 1
+3085	3034 1
+3086	2775 1
+3086	3034 1
+3086	3099 1
+3086	3458 1
+3086	3607 1
+3086	4191 1
+3086	4338 1
+3086	5026 1
+3087	2016 1
+3087	2354 1
+3087	2371 1
+3087	2696 1
+3087	2697 1
+3087	3034 1
+3087	3089 1
+3087	3748 1
+3088	15 1
+3088	737 1
+3088	1026 1
+3088	1100 1
+3088	1157 1
+3088	1297 1
+3088	2066 1
+3088	2225 1
+3088	2237 1
+3088	2398 1
+3088	2506 1
+3088	2508 1
+3088	2923 1
+3088	3005 1
+3088	3007 1
+3088	3034 1
+3088	3089 1
+3088	4037 1
+3088	4432 1
+3088	4687 1
+3088	5064 1
+3088	5254 1
+3088	5285 1
+3088	5452 1
+3088	5738 1
+3088	6156 1
+3088	6407 1
+3088	6634 1
+3088	6699 1
+3088	7389 1
+3088	7810 1
+3088	7879 1
+3088	8124 1
+3088	8174 1
+3088	8192 1
+3088	8198 1
+3088	8237 1
+3089	1437 1
+3089	1754 1
+3089	2625 1
+3089	3034 1
+3090	2371 1
+3090	2485 1
+3090	2727 1
+3090	2871 1
+3090	3034 1
+3090	3456 1
+3090	4201 1
+3090	4341 1
+3090	4717 1
+3090	5335 1
+3090	6530 1
+3090	6784 1
+3091	3034 1
+3092	633 1
+3092	737 1
+3092	1024 1
+3092	1769 1
+3092	1814 1
+3092	2135 1
+3092	2225 1
+3092	2369 1
+3092	2433 1
+3092	2576 1
+3092	2625 1
+3092	2654 1
+3092	2689 1
+3092	2697 1
+3092	2700 1
+3092	2713 1
+3092	2765 1
+3092	2831 1
+3092	3027 1
+3092	3034 1
+3092	3251 1
+3092	3258 1
+3092	3456 1
+3092	3726 1
+3092	3796 1
+3092	3910 1
+3092	4037 1
+3092	4099 1
+3092	4124 1
+3092	4191 1
+3092	4201 1
+3092	4276 1
+3092	4315 1
+3092	4400 1
+3092	4448 1
+3092	4468 1
+3092	4534 1
+3092	4536 1
+3092	4587 1
+3092	4712 1
+3092	4715 1
+3092	4781 1
+3092	4795 1
+3092	4875 1
+3092	4884 1
+3092	4962 1
+3092	5123 1
+3092	5144 1
+3092	5176 1
+3092	5178 1
+3092	5226 1
+3092	5239 1
+3092	5245 1
+3092	5246 1
+3092	5263 1
+3092	5309 1
+3092	5412 1
+3092	5457 1
+3092	5459 1
+3092	5465 1
+3092	5484 1
+3092	5506 1
+3092	5705 1
+3092	5714 1
+3092	5775 1
+3092	5817 1
+3092	5928 1
+3092	5931 1
+3092	5963 1
+3092	6306 1
+3092	6600 1
+3092	6774 1
+3092	7092 1
+3092	7146 1
+3092	7168 1
+3092	7699 1
+3092	7855 1
+3092	8134 1
+3092	8141 1
+3092	8295 1
+3092	8296 1
+3093	3099 1
+3094	1549 1
+3094	3089 1
+3094	3099 1
+3094	3537 1
+3094	4600 1
+3097	3099 1
+3098	633 1
+3098	762 1
+3098	1393 1
+3098	1416 1
+3098	1679 1
+3098	1754 1
+3098	1781 1
+3098	1814 1
+3098	2116 1
+3098	2135 1
+3098	2225 1
+3098	2231 1
+3098	2371 1
+3098	2625 1
+3098	2651 1
+3098	2654 1
+3098	2662 1
+3098	2697 1
+3098	2700 1
+3098	2713 1
+3098	2724 1
+3098	2856 1
+3098	2900 1
+3098	2951 1
+3098	3020 1
+3098	3089 1
+3098	3099 1
+3098	3126 1
+3098	3140 1
+3098	3145 1
+3098	3150 1
+3098	3164 1
+3098	3243 1
+3098	3251 1
+3098	3253 1
+3098	3265 1
+3098	3285 1
+3095	285 1
+3095	633 1
+3095	856 1
+3095	1267 1
+3095	1357 1
+3095	1393 1
+3095	1437 1
+3095	1679 1
+3095	1734 1
+3095	1754 1
+3095	1781 1
+3095	1814 1
+3095	1837 1
+3095	2116 1
+3095	2135 1
+3095	2225 1
+3095	2231 1
+3095	2371 1
+3095	2565 1
+3095	2625 1
+3095	2713 1
+3095	2724 1
+3095	2830 1
+3095	2900 1
+3095	2951 1
+3095	3018 1
+3095	3099 1
+3095	3126 1
+3095	3140 1
+3095	3243 1
+3095	3251 1
+3095	3253 1
+3095	3285 1
+3095	3307 1
+3095	3371 1
+3095	3376 1
+3095	3410 1
+3096	2542 1
+3096	2697 1
+3096	3099 1
+3101	1919 1
+3101	2072 1
+3102	3104 1
+3103	1688 1
+3103	2822 1
+3103	3104 1
+3103	4485 1
+3103	4552 1
+3106	1357 1
+3106	1403 1
+3106	4709 1
+3106	6458 1
+3106	7108 1
+3107	1357 1
+3107	1453 1
+3107	2210 1
+3107	2297 1
+3107	2485 1
+3107	2535 1
+3107	2653 1
+3107	2932 1
+3107	3660 1
+3107	4365 1
+2842	204 1
+2842	285 1
+2842	417 1
+2842	825 1
+2842	978 1
+2842	1157 1
+2842	1166 1
+2842	1357 1
+2842	1385 1
+2842	1453 1
+2842	1549 1
+2842	1571 1
+2842	1633 1
+2842	1679 1
+2842	1744 1
+2842	1754 1
+2842	1919 1
+2842	1990 1
+2842	2016 1
+2842	2066 1
+2842	2135 1
+2842	2144 1
+2842	2209 1
+2842	2231 1
+2842	2252 1
+2842	2290 1
+2842	2297 1
+2842	2324 1
+2842	2328 1
+2842	2356 1
+2842	2398 1
+2842	2416 1
+2842	2474 1
+2842	2485 1
+2842	2508 1
+2842	2510 1
+2842	2542 1
+2842	2565 1
+2842	2576 1
+2842	2594 1
+2842	2597 1
+2842	2619 1
+2842	2623 1
+2842	2625 1
+2842	2646 1
+2842	2651 1
+2842	2653 1
+2842	2654 1
+2842	2660 1
+2842	2667 1
+2842	2674 1
+2842	2687 1
+2842	2693 1
+2842	2700 1
+2842	2746 1
+2842	2747 1
+2842	2799 1
+2842	2819 1
+2842	2830 1
+2842	2859 1
+2842	2923 1
+2842	2951 1
+2842	2958 1
+2842	2973 1
+2842	3005 1
+2842	3009 1
+2842	3010 1
+2842	3020 1
+2842	3024 1
+2842	3028 1
+2842	3114 1
+2842	3117 1
+2842	3148 1
+2842	3192 1
+2842	3193 1
+2842	3253 1
+2842	3258 1
+2842	3260 1
+2842	3265 1
+2842	3276 1
+2842	3291 1
+2842	3320 1
+2842	3346 1
+2842	3351 1
+2842	3394 1
+2842	3408 1
+2842	3410 1
+2842	3429 1
+2842	3435 1
+2842	3439 1
+2842	3473 1
+2842	3486 1
+2842	3489 1
+2842	3506 1
+2842	3520 1
+2842	3538 1
+2842	3580 1
+2842	3587 1
+2842	3617 1
+2842	3645 1
+2842	3681 1
+2842	3720 1
+2842	3737 1
+2842	3800 1
+2842	3812 1
+2842	3908 1
+2842	3937 1
+2842	3939 1
+2842	3970 1
+2842	4011 1
+2842	4021 1
+2842	4138 1
+2842	4173 1
+2842	4179 1
+2842	4191 1
+2842	4234 1
+2842	4256 1
+2842	4269 1
+2842	4349 1
+2842	4384 1
+2842	4453 1
+2842	4485 1
+2842	8293 1
+2842	8294 1
+3108	1267 1
+3108	1357 1
+3108	1416 1
+3108	2016 1
+3108	2237 1
+3108	2654 1
+3108	2697 1
+3108	4485 1
+3109	737 1
+3109	1734 1
+3109	4040 1
+3109	4219 1
+3109	4400 1
+3109	4401 1
+3109	4402 1
+3109	4584 1
+3109	8227 1
+3110	1297 1
+3110	1734 1
+3110	2328 1
+3110	2369 1
+3110	2381 1
+3110	2594 1
+3110	3028 1
+3110	3103 1
+3110	3117 1
+3110	3352 1
+3110	3439 1
+3110	3615 1
+3110	3635 1
+3110	3800 1
+3110	3897 1
+3110	3903 1
+3110	4587 1
+3110	4645 1
+3110	5130 1
+3110	5459 1
+3110	5743 1
+3111	1734 1
+3112	3117 1
+3113	3117 1
+2003	762 1
+2003	938 1
+2003	1267 1
+2003	1297 1
+2003	1633 1
+2003	1679 1
+2003	1814 1
+2003	2231 1
+2003	2307 1
+2003	2325 1
+2003	2338 1
+2003	2411 1
+2003	2508 1
+2003	2516 1
+2003	2565 1
+2003	2623 1
+2003	2625 1
+2003	2651 1
+2003	2657 1
+2003	2727 1
+2003	2775 1
+2003	2923 1
+2003	2973 1
+2003	3007 1
+2003	3018 1
+2003	3026 1
+2003	3084 1
+2003	3092 1
+2003	3117 1
+2003	3243 1
+2003	3253 1
+2003	3265 1
+2003	3276 1
+2003	3324 1
+2003	3352 1
+2003	3371 1
+2003	3408 1
+2003	3480 1
+2003	3607 1
+2003	3681 1
+2003	3849 1
+2003	3892 1
+2003	3926 1
+2003	4037 1
+2003	4531 1
+2003	4828 1
+2003	5022 1
+2003	5144 1
+2003	5605 1
+2003	5801 1
+2003	5819 1
+2003	6044 1
+2003	6097 1
+2003	6634 1
+2003	6918 1
+2003	7233 1
+2003	7279 1
+2003	7301 1
+2003	7440 1
+2003	7620 1
+2003	7860 1
+2003	8192 1
+2003	8209 1
+3114	3117 1
+3115	2565 1
+3115	2576 1
+3115	3117 1
+3115	3291 1
+3115	4037 1
+3118	1919 1
+3118	2830 1
+3119	2625 1
+3119	2830 1
+3119	3408 1
+3120	285 1
+3120	2474 1
+3120	2594 1
+3120	2687 1
+3120	2830 1
+3120	3324 1
+3120	3520 1
+3120	3807 1
+3123	1679 1
+3123	3020 1
+3123	3130 1
+3124	2625 1
+3124	3130 1
+3125	856 1
+3125	1792 1
+3125	1814 1
+3125	2325 1
+3125	2485 1
+3125	2576 1
+3125	2594 1
+3125	2625 1
+3125	2651 1
+3125	2657 1
+3125	2687 1
+3125	2747 1
+3125	3005 1
+3125	3130 1
+3125	3253 1
+3125	3265 1
+3126	3130 1
+3127	465 1
+3127	2411 1
+3127	2576 1
+3127	2585 1
+3127	2625 1
+3127	2657 1
+3127	2674 1
+3127	2693 1
+3127	3028 1
+3127	3130 1
+3127	3541 1
+3127	3557 1
+3127	3646 1
+3127	3701 1
+3127	3903 1
+3128	3130 1
+3129	2625 1
+3129	3130 1
+3131	3136 1
+3132	3136 1
+3132	3164 1
+3132	5254 1
+3135	3136 1
+3133	3136 1
+3134	3136 1
+3137	3138 1
+3137	3140 1
+3137	3454 1
+3137	4578 1
+3140	3201 1
+3140	4011 1
+3143	2900 1
+3142	1744 1
+3142	1982 1
+3142	2592 1
+3142	2654 1
+3142	2658 1
+3142	2900 1
+3142	3005 1
+3142	3293 1
+3142	3433 1
+3142	3681 1
+3142	4335 1
+3142	4432 1
+3142	4940 1
+3142	4964 1
+3142	5141 1
+3142	5210 1
+3142	5378 1
+3142	5738 1
+3142	5812 1
+3142	5925 1
+3142	6618 1
+3142	6634 1
+3142	6737 1
+3142	6759 1
+3142	6875 1
+3142	6918 1
+3142	6946 1
+3142	7389 1
+3142	7391 1
+3142	7553 1
+3142	7620 1
+3142	7791 1
+3142	7810 1
+3142	7928 1
+3142	7992 1
+3142	7996 1
+3142	8042 1
+3142	8051 1
+3142	8124 1
+3142	8134 1
+3142	8178 1
+3142	8192 1
+3142	8198 1
+3142	8209 1
+3142	8212 1
+3142	8219 1
+3142	8237 1
+3142	8249 1
+3142	8293 1
+3144	204 1
+3144	778 1
+3144	1157 1
+3144	1166 1
+3144	1453 1
+3144	1633 1
+3144	1679 1
+3144	1688 1
+3144	1729 1
+3144	1777 1
+3144	1792 1
+3144	1837 1
+3144	2016 1
+3144	2209 1
+3144	2237 1
+3144	2290 1
+3144	2307 1
+3144	2324 1
+3144	2338 1
+3144	2356 1
+3144	2371 1
+3144	2456 1
+3144	2485 1
+3144	2508 1
+3144	2510 1
+3144	2535 1
+3144	2594 1
+3144	2619 1
+3144	2625 1
+3144	2654 1
+3144	2657 1
+3144	2660 1
+3144	2686 1
+3144	2693 1
+3144	2700 1
+3144	2713 1
+3144	2819 1
+3144	2856 1
+3144	2871 1
+3144	2900 1
+3144	2923 1
+3144	2973 1
+3144	2974 1
+3144	3014 1
+3144	3018 1
+3144	3021 1
+3144	3026 1
+3144	3028 1
+3144	3059 1
+3144	3106 1
+3144	3148 1
+3144	3193 1
+3144	3235 1
+3144	3243 1
+3144	3251 1
+3144	3265 1
+3144	3338 1
+3144	3351 1
+3144	3352 1
+3144	3404 1
+3144	3408 1
+3144	3439 1
+3144	3443 1
+3144	3446 1
+3144	3454 1
+3144	3473 1
+3144	3480 1
+3144	3483 1
+3144	3486 1
+3144	3529 1
+3144	3557 1
+3144	3567 1
+3144	3568 1
+3144	3650 1
+3144	3660 1
+3144	3661 1
+3144	3670 1
+3144	3680 1
+3144	3681 1
+3144	3812 1
+3144	3926 1
+3144	4021 1
+3144	4040 1
+3144	4212 1
+3144	4261 1
+3144	4373 1
+3144	4531 1
+3144	4578 1
+3145	1688 1
+3145	2145 1
+3145	2240 1
+3145	2328 1
+3145	3034 1
+3145	3089 1
+3145	3125 1
+3145	3140 1
+3145	3309 1
+3145	3352 1
+3145	3443 1
+3145	3958 1
+3145	4263 1
+3145	4297 1
+3145	4299 1
+3145	4735 1
+3145	5233 1
+3145	5790 1
+3146	2697 1
+3147	974 1
+3147	2066 1
+3147	2225 1
+3147	2585 1
+3147	2697 1
+3147	4055 1
+3148	204 1
+3148	417 1
+3148	1166 1
+3148	1473 1
+3148	1549 1
+3148	1919 1
+3148	1990 1
+3148	2297 1
+3148	2328 1
+3148	2398 1
+3148	2654 1
+3148	2667 1
+3148	2674 1
+3148	2697 1
+3148	2819 1
+3148	3371 1
+3148	3480 1
+3148	3489 1
+3148	3516 1
+3148	3562 1
+3148	3650 1
+3148	4011 1
+3148	4055 1
+3148	4233 1
+3148	4263 1
+3148	4266 1
+3150	15 1
+3150	2066 1
+3150	2651 1
+3150	2654 1
+3150	2774 1
+3150	4098 1
+3150	4099 1
+3150	5043 1
+3150	5828 1
+3150	5980 1
+3149	3150 1
+3151	2724 1
+3152	2724 1
+3153	1781 1
+3154	1781 1
+3156	1416 1
+3158	3164 1
+3159	856 1
+3159	2237 1
+3159	2625 1
+3159	2654 1
+3159	3164 1
+3159	3192 1
+3159	3748 1
+3159	4247 1
+3159	8293 1
+3160	15 1
+3160	3164 1
+3162	2654 1
+3162	2662 1
+3162	3164 1
+3163	3164 1
+3165	2550 1
+3166	2550 1
+3167	2550 1
+3169	762 1
+3168	72 1
+3168	762 1
+3168	825 1
+3168	1185 1
+3168	1307 1
+3168	1453 1
+3168	1777 1
+3168	2129 1
+3168	2289 1
+3168	2328 1
+3168	2398 1
+3168	2508 1
+3168	2576 1
+3168	2625 1
+3168	2646 1
+3168	2653 1
+3168	2654 1
+3168	2655 1
+3168	2760 1
+3168	2859 1
+3168	2958 1
+3168	3007 1
+3168	3020 1
+3168	3117 1
+3168	3180 1
+3168	3192 1
+3168	3260 1
+3168	3291 1
+3168	3309 1
+3168	3334 1
+3168	3346 1
+3168	3352 1
+3168	3394 1
+3168	3439 1
+3168	3463 1
+3168	3516 1
+3168	3557 1
+3168	3562 1
+3168	3568 1
+3168	3615 1
+3168	3631 1
+3168	3650 1
+3168	3720 1
+3168	3787 1
+3168	3806 1
+3168	3812 1
+3168	3843 1
+3168	3897 1
+3168	3926 1
+3168	3937 1
+3168	3946 1
+3168	3956 1
+3168	3958 1
+3168	4013 1
+3168	4021 1
+3168	4088 1
+3168	4103 1
+3168	4110 1
+3168	4179 1
+3168	4191 1
+3168	4254 1
+3168	4290 1
+3168	4323 1
+3168	4365 1
+3168	4384 1
+3168	4386 1
+3168	4424 1
+3168	4463 1
+3168	4510 1
+3168	4613 1
+3168	4666 1
+3168	4735 1
+3168	4811 1
+3168	4820 1
+3168	5412 1
+3168	5454 1
+3168	5790 1
+3168	8293 1
+3168	8294 1
+3171	2657 1
+3172	465 1
+3172	1385 1
+3172	2371 1
+3172	2775 1
+3172	3007 1
+3172	3028 1
+3172	3180 1
+3172	3276 1
+3172	3458 1
+3172	3664 1
+3172	3903 1
+3172	4645 1
+3172	4964 1
+3173	2371 1
+3173	2974 1
+3173	3192 1
+3173	3529 1
+3173	3537 1
+3173	4191 1
+3173	4256 1
+3174	2371 1
+3175	827 1
+3175	1453 1
+3175	1549 1
+3175	1777 1
+3175	2257 1
+3175	2371 1
+3175	2411 1
+3175	2485 1
+3175	2508 1
+3175	2565 1
+3175	2595 1
+3175	2619 1
+3175	2653 1
+3175	2657 1
+3175	2696 1
+3175	2727 1
+3175	3024 1
+3175	3026 1
+3175	3059 1
+3175	3260 1
+3175	3461 1
+3175	3483 1
+3175	3529 1
+3175	3537 1
+3175	3541 1
+3175	3847 1
+3175	3892 1
+3175	3903 1
+3175	3926 1
+3175	3937 1
+3175	3967 1
+3175	3970 1
+3175	3973 1
+3175	4021 1
+3175	4529 1
+3175	4653 1
+3175	4666 1
+3175	4827 1
+3175	4831 1
+3175	5026 1
+3175	5423 1
+3176	72 1
+3176	2371 1
+3176	3796 1
+3176	5511 1
+3176	6148 1
+3176	6400 1
+3180	285 1
+3180	1267 1
+3180	1633 1
+3180	1744 1
+3180	1990 1
+3180	2225 1
+3180	2290 1
+3180	2297 1
+3180	2324 1
+3180	2328 1
+3180	2510 1
+3180	2542 1
+3180	2654 1
+3180	2660 1
+3180	2746 1
+3180	2856 1
+3180	2958 1
+3180	3489 1
+3180	3506 1
+3180	3516 1
+3180	3529 1
+3180	3537 1
+3180	3670 1
+3180	3812 1
+3181	1799 1
+3181	2654 1
+3181	4600 1
+3190	1548 1
+3190	2354 1
+3190	2398 1
+3190	2654 1
+3190	3084 1
+3190	3192 1
+3190	3352 1
+3190	3408 1
+3190	4276 1
+3190	5254 1
+3182	2654 1
+3183	2651 1
+3183	2654 1
+3184	2654 1
+3185	2654 1
+3185	4124 1
+3186	2654 1
+3187	2654 1
+3188	417 1
+3188	1297 1
+3188	1706 1
+3188	2328 1
+3188	2565 1
+3188	2654 1
+3188	2687 1
+3188	3028 1
+3188	3117 1
+3188	3319 1
+3188	3555 1
+3188	3567 1
+3188	3623 1
+3188	3629 1
+3188	3871 1
+3188	4234 1
+3188	4256 1
+3188	4424 1
+3188	4466 1
+3188	4528 1
+3189	204 1
+3189	417 1
+3189	1297 1
+3189	1633 1
+3189	2066 1
+3189	2576 1
+3189	2654 1
+3189	3371 1
+3189	3587 1
+3189	4384 1
+3192	608 1
+3192	825 1
+3192	827 1
+3192	1305 1
+3192	1307 1
+3192	1453 1
+3192	1729 1
+3192	1837 1
+3192	1990 1
+3192	2016 1
+3192	2072 1
+3192	2210 1
+3192	2297 1
+3192	2325 1
+3192	2485 1
+3192	2510 1
+3192	2585 1
+3192	2594 1
+3192	2653 1
+3192	2655 1
+3192	2660 1
+3192	2687 1
+3192	2693 1
+3192	2696 1
+3192	2831 1
+3192	2871 1
+3192	3024 1
+3192	3026 1
+3192	3059 1
+3192	3092 1
+3192	3258 1
+3192	3404 1
+3192	3439 1
+3192	3454 1
+3192	3461 1
+3192	3489 1
+3192	3537 1
+3192	3615 1
+3192	3650 1
+3192	3717 1
+3192	3748 1
+3192	3843 1
+3192	4011 1
+3192	4021 1
+3192	4124 1
+3192	4173 1
+3192	4179 1
+3192	4189 1
+3192	4256 1
+3192	4600 1
+3192	4646 1
+3192	4820 1
+3192	4983 1
+3192	5026 1
+3192	5452 1
+3192	8294 1
+3194	3195 1
+3191	95 1
+3191	737 1
+3191	1247 1
+3191	2277 1
+3191	2354 1
+3191	2398 1
+3191	2822 1
+3191	2831 1
+3191	2856 1
+3191	3002 1
+3191	3027 1
+3191	3103 1
+3191	3274 1
+3191	3393 1
+3191	3417 1
+3191	3456 1
+3191	3460 1
+3191	3691 1
+3191	3897 1
+3191	3910 1
+3191	4098 1
+3191	4099 1
+3191	4191 1
+3191	4219 1
+3191	4247 1
+3191	4315 1
+3191	4400 1
+3191	4530 1
+3191	4587 1
+3191	4600 1
+3191	4666 1
+3191	4712 1
+3191	4824 1
+3191	4846 1
+3191	4964 1
+3191	4977 1
+3191	4986 1
+3191	5073 1
+3191	5226 1
+3191	5233 1
+3191	5288 1
+3191	5321 1
+3191	5323 1
+3191	5335 1
+3191	5341 1
+3191	5387 1
+3191	5392 1
+3191	5412 1
+3191	5415 1
+3191	5430 1
+3191	5449 1
+3191	5459 1
+3191	5463 1
+3191	5465 1
+3191	5484 1
+3191	5539 1
+3191	5545 1
+3191	5568 1
+3191	5592 1
+3191	5635 1
+3191	5637 1
+3191	5640 1
+3191	5651 1
+3191	5683 1
+3191	5693 1
+3191	5737 1
+3191	5743 1
+3191	5775 1
+3196	856 1
+3196	1571 1
+3196	1915 1
+3196	2257 1
+3196	2485 1
+3196	2585 1
+3196	2651 1
+3196	2657 1
+3196	2700 1
+3196	2727 1
+3196	2856 1
+3196	2923 1
+3196	3059 1
+3196	3404 1
+3196	3473 1
+3196	3480 1
+3196	3529 1
+3196	3646 1
+3196	3650 1
+3196	3804 1
+3196	3926 1
+3196	3937 1
+3197	1267 1
+3197	2856 1
+3197	3717 1
+3197	4021 1
+3198	2856 1
+3199	825 1
+3199	1267 1
+3199	1729 1
+3199	2135 1
+3199	2237 1
+3199	2338 1
+3199	2485 1
+3199	2612 1
+3199	2856 1
+3199	3028 1
+3199	3253 1
+3199	3307 1
+3199	3926 1
+3200	1024 1
+3200	1990 1
+3200	2114 1
+3200	2411 1
+3200	2565 1
+3200	2856 1
+3200	3114 1
+3200	3615 1
+3202	204 1
+3202	2576 1
+3202	2597 1
+3202	2651 1
+3202	2662 1
+3202	2700 1
+3202	3516 1
+3202	4373 1
+3203	2662 1
+3204	2662 1
+3206	1437 1
+3207	1437 1
+3208	2237 1
+3208	2384 1
+3208	3321 1
+3208	3871 1
+3208	4600 1
+3208	4999 1
+3209	856 1
+3209	1267 1
+3209	1385 1
+3209	1679 1
+3209	2225 1
+3209	2237 1
+3209	2290 1
+3209	2576 1
+3209	2625 1
+3209	2657 1
+3209	2660 1
+3209	2689 1
+3209	2700 1
+3209	3005 1
+3209	3235 1
+3209	3319 1
+3209	3351 1
+3209	3447 1
+3209	3473 1
+3209	3489 1
+3209	3520 1
+3209	3691 1
+3209	3804 1
+3209	3976 1
+3209	4124 1
+3209	4315 1
+3209	4338 1
+3209	4482 1
+3209	4587 1
+3209	4792 1
+3209	4824 1
+3209	5026 1
+3209	5058 1
+3209	5072 1
+3209	5182 1
+3209	5233 1
+3209	5756 1
+3209	5757 1
+3209	5947 1
+3209	5973 1
+3209	8293 1
+3212	2237 1
+3213	2237 1
+3215	2237 1
+3214	2237 1
+3216	2237 1
+3216	8293 1
+3210	2237 1
+3210	4037 1
+3210	4792 1
+3217	2237 1
+532	2237 1
+3219	2237 1
+3220	2237 1
+3221	2237 1
+1509	2237 1
+3211	2237 1
+3211	3408 1
+3218	2237 1
+3222	2237 1
+3223	2237 1
+3224	2237 1
+3225	1267 1
+3225	1633 1
+3225	1814 1
+3225	2225 1
+3225	2328 1
+3225	2456 1
+3225	2625 1
+3225	3020 1
+3225	3192 1
+3225	3516 1
+3225	3615 1
+3225	4103 1
+3225	4256 1
+3226	1267 1
+3227	737 1
+3227	1026 1
+3227	1267 1
+3227	1982 1
+3227	2651 1
+3227	2790 1
+3227	2819 1
+3227	3089 1
+3227	4191 1
+3227	4261 1
+3227	4536 1
+3227	4983 1
+3227	5140 1
+3227	5288 1
+3227	5301 1
+3227	5822 1
+3227	7587 1
+3227	7810 1
+3227	7862 1
+3228	1267 1
+3235	8293 1
+3229	3235 1
+3230	3235 1
+3231	3235 1
+3232	3235 1
+3234	3235 1
+3233	2285 1
+3233	3235 1
+3233	8293 1
+3238	1688 1
+3238	2225 1
+3238	2342 1
+3238	2381 1
+3238	2511 1
+3238	2516 1
+3238	2774 1
+3238	3084 1
+3238	3334 1
+3238	3456 1
+3238	4071 1
+3238	4562 1
+3238	4712 1
+3238	4824 1
+3238	5100 1
+3238	5210 1
+3238	5233 1
+3238	5484 1
+3238	5814 1
+3238	5839 1
+3238	6327 1
+3238	6833 1
+3238	7624 1
+3238	7632 1
+3238	7809 1
+3238	7839 1
+3238	7855 1
+3238	8174 1
+3239	856 1
+3239	1706 1
+3239	3555 1
+3240	3243 1
+3241	3243 1
+3242	1919 1
+3242	2576 1
+3242	3243 1
+3242	3253 1
+3242	3809 1
+3242	5697 1
+3244	3245 1
+3246	633 1
+3246	5222 1
+3247	633 1
+3247	5773 1
+3248	633 1
+3249	633 1
+3249	4247 1
+3249	4263 1
+3250	2625 1
+3250	2700 1
+3250	3251 1
+3252	608 1
+3252	825 1
+3252	1297 1
+3252	2134 1
+3252	2209 1
+3252	2324 1
+3252	2338 1
+3252	2485 1
+3252	2510 1
+3252	2542 1
+3252	2585 1
+3252	2594 1
+3252	2595 1
+3252	2625 1
+3252	2653 1
+3252	2655 1
+3252	2674 1
+3252	2693 1
+3252	2700 1
+3252	2727 1
+3252	3009 1
+3252	3024 1
+3252	3028 1
+3252	3059 1
+3252	3253 1
+3252	3258 1
+3252	3352 1
+3252	3404 1
+3252	3439 1
+3252	3480 1
+3252	3516 1
+3252	3562 1
+3252	3587 1
+3252	3650 1
+3252	3903 1
+3252	4011 1
+3252	4055 1
+3255	15 1
+3255	2625 1
+3255	3408 1
+3256	1549 1
+3256	2066 1
+3256	2364 1
+3256	2398 1
+3256	2411 1
+3256	2594 1
+3256	2746 1
+3256	2790 1
+3256	3020 1
+3256	3021 1
+3256	3276 1
+3256	3483 1
+3256	3650 1
+3256	3717 1
+3256	3769 1
+3256	4011 1
+3256	4953 1
+3256	5412 1
+3256	5423 1
+3257	2116 1
+3258	15 1
+3258	608 1
+3258	827 1
+3258	974 1
+3258	1157 1
+3258	1166 1
+3258	1297 1
+3258	1688 1
+3258	1777 1
+3258	1915 1
+3258	1935 1
+3258	2145 1
+3258	2328 1
+3258	2356 1
+3258	2398 1
+3258	2516 1
+3258	2535 1
+3258	2565 1
+3258	2625 1
+3258	2654 1
+3258	2657 1
+3258	2660 1
+3258	2674 1
+3258	2686 1
+3258	2727 1
+3258	2775 1
+3258	2871 1
+3258	2900 1
+3258	2923 1
+3258	3005 1
+3258	3015 1
+3258	3030 1
+3258	3034 1
+3258	3117 1
+3258	3173 1
+3258	3192 1
+3258	3200 1
+3258	3260 1
+3258	3274 1
+3258	3276 1
+3258	3291 1
+3258	3307 1
+3258	3351 1
+3258	3352 1
+3258	3404 1
+3258	3454 1
+3258	3480 1
+3258	3520 1
+3258	3541 1
+3258	3547 1
+3258	3557 1
+3258	3568 1
+3258	3587 1
+3258	3615 1
+3258	3643 1
+3258	3646 1
+3258	3660 1
+3258	3787 1
+3258	3804 1
+3258	3806 1
+3258	3807 1
+3258	3811 1
+3258	3812 1
+3258	3847 1
+3258	3856 1
+3258	3903 1
+3258	3967 1
+3258	4011 1
+3258	4013 1
+3258	4037 1
+3258	4055 1
+3258	4098 1
+3258	4183 1
+3258	4191 1
+3258	4201 1
+3258	4233 1
+3258	4338 1
+3258	4424 1
+3258	4453 1
+3258	4463 1
+3258	4480 1
+3258	4510 1
+3258	4531 1
+3258	5022 1
+3258	5120 1
+3258	5130 1
+3258	5412 1
+3258	5524 1
+3258	5824 1
+3258	5902 1
+3258	6097 1
+3258	6897 1
+3258	6979 1
+3258	6980 1
+3258	8293 1
+3263	3265 1
+3264	3265 1
+3259	15 1
+3259	3265 1
+3260	1549 1
+3260	1919 1
+3260	2576 1
+3260	2594 1
+3260	2625 1
+3260	2651 1
+3260	3030 1
+3260	3265 1
+3261	3265 1
+3262	2297 1
+3262	2565 1
+3262	2651 1
+3262	2660 1
+3262	3034 1
+3262	3265 1
+3262	3480 1
+3262	3489 1
+3262	3807 1
+3267	2951 1
+3268	2625 1
+3268	2651 1
+212	2625 1
+3269	15 1
+3269	2625 1
+3269	4037 1
+3270	2625 1
+3270	5254 1
+3271	1688 1
+3271	2625 1
+2624	2625 1
+3272	2625 1
+3272	3030 1
+3280	2594 1
+3280	2625 1
+3280	3307 1
+3281	2625 1
+3273	2625 1
+3274	72 1
+3274	155 1
+3274	762 1
+3274	1548 1
+3274	1549 1
+3274	2398 1
+3274	2516 1
+3274	2576 1
+3274	2620 1
+3274	2625 1
+3274	2790 1
+3274	2811 1
+3274	2851 1
+3274	3015 1
+3274	3084 1
+3274	3238 1
+3274	3352 1
+3274	3447 1
+3274	3454 1
+3274	3460 1
+3274	3537 1
+3274	3635 1
+3274	3835 1
+3274	3956 1
+3274	3962 1
+3274	4037 1
+3274	4065 1
+3274	4098 1
+3274	4099 1
+3274	4266 1
+3274	4448 1
+3274	4466 1
+3274	4483 1
+3274	4485 1
+3274	4547 1
+3274	4562 1
+3274	4574 1
+3274	4578 1
+3274	4717 1
+3274	4719 1
+3274	4735 1
+3274	4791 1
+3274	4796 1
+3274	4828 1
+3274	4899 1
+3274	5022 1
+3274	5028 1
+3274	5079 1
+3274	5123 1
+3274	5144 1
+3274	5226 1
+3274	5245 1
+3274	5262 1
+3274	5421 1
+3274	5423 1
+3274	5459 1
+3274	5527 1
+3274	5620 1
+3274	5947 1
+3274	6043 1
+3274	6305 1
+3274	6421 1
+3274	6560 1
+3274	7021 1
+3274	7092 1
+3274	7277 1
+3274	7351 1
+3274	7763 1
+3274	7809 1
+3275	1166 1
+3275	1297 1
+3275	1571 1
+3275	2594 1
+3275	2625 1
+3275	2657 1
+3275	3117 1
+3275	3410 1
+3275	3417 1
+3275	3516 1
+3275	3892 1
+3275	5459 1
+3275	5650 1
+3275	5683 1
+3276	1140 1
+3276	1157 1
+3276	1307 1
+3276	1549 1
+3276	1990 1
+3276	2072 1
+3276	2134 1
+3276	2210 1
+3276	2240 1
+3276	2297 1
+3276	2328 1
+3276	2416 1
+3276	2485 1
+3276	2510 1
+3276	2565 1
+3276	2595 1
+3276	2612 1
+3276	2623 1
+3276	2625 1
+3276	2653 1
+3276	2655 1
+3276	2667 1
+3276	2727 1
+3276	2746 1
+3276	2923 1
+3276	2958 1
+3276	3007 1
+3276	3014 1
+3276	3021 1
+3276	3024 1
+3276	3026 1
+3276	3028 1
+3276	3034 1
+3276	3117 1
+3276	3173 1
+3276	3180 1
+3276	3258 1
+3276	3291 1
+3276	3338 1
+3276	3376 1
+3276	3394 1
+3276	3404 1
+3276	3435 1
+3276	3439 1
+3276	3443 1
+3276	3529 1
+3276	3562 1
+3276	3615 1
+3276	3650 1
+3276	3661 1
+3276	3681 1
+3276	3717 1
+3276	3843 1
+3276	3912 1
+3276	3967 1
+3276	4011 1
+3276	4021 1
+3276	4024 1
+3276	4051 1
+3276	4055 1
+3276	4110 1
+3276	4138 1
+3276	4162 1
+3276	4181 1
+3276	4191 1
+3276	4216 1
+3276	4233 1
+3276	4256 1
+3276	4269 1
+3276	4289 1
+3276	4290 1
+3276	4323 1
+3276	4613 1
+3276	4631 1
+3276	4661 1
+3276	4820 1
+3276	5026 1
+3276	8293 1
+3276	8294 1
+3277	2625 1
+3278	1633 1
+3278	2625 1
+3279	1679 1
+3279	2625 1
+3285	3307 1
+3284	15 1
+3284	2623 1
+3284	3024 1
+3284	3089 1
+3284	3285 1
+3284	3506 1
+3284	3516 1
+3284	3556 1
+3284	3557 1
+3284	3785 1
+3284	3871 1
+3284	3939 1
+3284	3942 1
+3284	3946 1
+3284	3970 1
+3284	3973 1
+3284	4171 1
+3284	4173 1
+3284	4557 1
+3284	4712 1
+3288	3020 1
+3291	465 1
+3291	1166 1
+3291	1633 1
+3291	1679 1
+3291	1744 1
+3291	2240 1
+3291	2290 1
+3291	2326 1
+3291	2328 1
+3291	2356 1
+3291	2517 1
+3291	2565 1
+3291	2595 1
+3291	2619 1
+3291	2623 1
+3291	2660 1
+3291	2687 1
+3291	2727 1
+3291	2819 1
+3291	2900 1
+3291	2923 1
+3291	2958 1
+3291	2973 1
+3291	3014 1
+3291	3059 1
+3291	3089 1
+3291	3334 1
+3291	3351 1
+3291	3352 1
+3291	3439 1
+3291	3506 1
+3291	3516 1
+3291	3562 1
+3291	3587 1
+3291	3787 1
+3291	3807 1
+3291	3970 1
+3291	4011 1
+3291	4013 1
+3291	4162 1
+3291	4365 1
+3291	4385 1
+3291	4424 1
+3291	4531 1
+3291	4578 1
+3291	4712 1
+3291	4713 1
+3291	4735 1
+3291	4786 1
+3291	4999 1
+3291	5509 1
+3291	5543 1
+3291	6148 1
+3291	6151 1
+3291	6246 1
+3291	6432 1
+3291	8293 1
+3291	8295 1
+3292	1679 1
+3292	3291 1
+3292	3631 1
+3292	3956 1
+3292	4201 1
+3292	5002 1
+3292	5200 1
+3292	5404 1
+3294	1679 1
+3296	2576 1
+3296	3307 1
+3297	1633 1
+3297	2114 1
+3297	2210 1
+3297	2338 1
+3297	2356 1
+3297	2565 1
+3297	2655 1
+3297	2958 1
+3297	3007 1
+3297	3021 1
+3297	3117 1
+3297	3238 1
+3297	3258 1
+3297	3307 1
+3297	3351 1
+3297	3371 1
+3297	3408 1
+3297	3498 1
+3297	3717 1
+3297	3871 1
+3297	4071 1
+3297	4384 1
+3297	4401 1
+3297	4940 1
+3297	5179 1
+3297	5262 1
+3297	5404 1
+3297	5529 1
+3297	6032 1
+3297	6414 1
+3297	6596 1
+3297	6618 1
+3297	6634 1
+3297	6759 1
+3297	6918 1
+3297	7021 1
+3297	7059 1
+3297	7063 1
+3297	7092 1
+3297	7397 1
+3297	7620 1
+3297	7860 1
+3297	7910 1
+3297	7961 1
+3297	8037 1
+3297	8044 1
+3297	8073 1
+3297	8083 1
+3297	8122 1
+3297	8141 1
+3297	8293 1
+3298	3307 1
+3299	3307 1
+3300	2594 1
+3300	3021 1
+3300	3307 1
+3300	3338 1
+3300	3351 1
+3301	1297 1
+3301	2114 1
+3301	2657 1
+3301	2674 1
+3301	3026 1
+3301	3059 1
+3301	3307 1
+3301	3404 1
+3301	3483 1
+3301	3576 1
+3301	3680 1
+3301	3847 1
+3301	3871 1
+3301	3887 1
+3301	3892 1
+3302	3307 1
+3303	3307 1
+1529	3307 1
+1529	3755 1
+3304	285 1
+3304	1633 1
+3304	1744 1
+3304	2257 1
+3304	2297 1
+3304	2338 1
+3304	2411 1
+3304	2485 1
+3304	2542 1
+3304	2565 1
+3304	2623 1
+3304	2657 1
+3304	2693 1
+3304	2790 1
+3304	3005 1
+3304	3010 1
+3304	3018 1
+3304	3114 1
+3304	3173 1
+3304	3307 1
+3304	3371 1
+3304	3408 1
+3304	3435 1
+3304	3439 1
+3304	3473 1
+3304	3516 1
+3304	3529 1
+3304	3557 1
+3304	3580 1
+3304	3646 1
+3304	8293 1
+3305	285 1
+3305	2565 1
+3305	3018 1
+3305	3307 1
+3305	4796 1
+3309	1297 1
+3309	2474 1
+3309	4298 1
+3309	5721 1
+3310	1191 1
+3310	2356 1
+3310	2474 1
+3310	2658 1
+3310	4875 1
+3310	5529 1
+3310	6043 1
+3310	6151 1
+3310	6523 1
+3310	6560 1
+3310	6634 1
+3310	6780 1
+3310	6784 1
+3310	7063 1
+3310	7391 1
+3310	7587 1
+3310	8051 1
+3310	8212 1
+3311	2474 1
+3312	2651 1
+3313	1777 1
+3313	2328 1
+3313	2651 1
+3313	3720 1
+3313	3816 1
+3282	2651 1
+3282	2747 1
+3282	2790 1
+3282	2923 1
+3282	3635 1
+3314	2651 1
+3315	1247 1
+3315	2258 1
+3315	2585 1
+3315	2651 1
+3315	2859 1
+3315	2958 1
+3315	3260 1
+3315	4191 1
+3315	4587 1
+3315	4613 1
+3315	5457 1
+3315	5529 1
+3315	6001 1
+3290	737 1
+3290	1385 1
+3290	1571 1
+3290	1688 1
+3290	1706 1
+3290	2237 1
+3290	2252 1
+3290	2290 1
+3290	2325 1
+3290	2485 1
+3290	2510 1
+3290	2535 1
+3290	2585 1
+3290	2594 1
+3290	2595 1
+3290	2597 1
+3290	2651 1
+3290	2746 1
+3290	2747 1
+3290	2831 1
+3290	3117 1
+3290	3351 1
+3290	3352 1
+3290	3489 1
+3290	3587 1
+3290	3650 1
+3290	3926 1
+3290	4037 1
+3290	4040 1
+3290	4212 1
+3290	4531 1
+3290	4587 1
+3290	4824 1
+3290	5539 1
+3290	5563 1
+3290	8293 1
+3318	2651 1
+3316	2398 1
+3316	2651 1
+3316	5605 1
+3317	825 1
+3317	2134 1
+3317	2210 1
+3317	2328 1
+3317	2508 1
+3317	2535 1
+3317	2619 1
+3317	2651 1
+3317	2746 1
+3317	3024 1
+3317	3260 1
+3317	3439 1
+3317	3568 1
+3317	3661 1
+3317	3800 1
+3320	3946 1
+3320	5806 1
+3320	6714 1
+3320	7442 1
+3320	8295 1
+2325	3320 1
+2325	3321 1
+3321	2237 1
+3321	2325 1
+3321	3084 1
+3321	3238 1
+3321	3417 1
+3321	3456 1
+3321	3691 1
+3321	4110 1
+3321	4124 1
+3321	4191 1
+3321	4600 1
+3321	4964 1
+3321	4999 1
+3321	5073 1
+3321	5412 1
+3321	5479 1
+3321	7493 1
+3321	7694 1
+3322	2325 1
+3323	2325 1
+3323	8293 1
+3325	417 1
+3325	762 1
+3325	2290 1
+3325	2356 1
+3325	2653 1
+3325	2667 1
+3326	825 1
+3326	1688 1
+3326	1984 1
+3326	2356 1
+3326	2653 1
+3326	2871 1
+3326	2958 1
+3326	3014 1
+3326	3021 1
+3326	3030 1
+3326	3192 1
+3326	3443 1
+3326	3898 1
+3326	4162 1
+3326	4662 1
+3326	4735 1
+3326	4827 1
+3326	5817 1
+3335	3030 1
+3331	3030 1
+3332	3030 1
+3333	417 1
+3333	1571 1
+3333	1744 1
+3333	2290 1
+3333	2485 1
+3333	2657 1
+3333	2660 1
+3333	2674 1
+3333	3030 1
+3333	3148 1
+3333	3371 1
+3333	3587 1
+3333	3681 1
+3333	5226 1
+3333	5482 1
+3334	1571 1
+3334	2398 1
+3334	2646 1
+3334	3030 1
+3334	3394 1
+3334	3645 1
+3334	3812 1
+3334	4191 1
+3334	4290 1
+3334	4299 1
+3334	5233 1
+3334	7381 1
+3334	7632 1
+3338	1633 1
+3338	2114 1
+3338	3408 1
+3339	2594 1
+3340	1297 1
+3340	2594 1
+3340	5254 1
+3340	6148 1
+3341	2594 1
+3342	2594 1
+3343	1297 1
+3343	1706 1
+3343	2209 1
+3343	2510 1
+3343	2585 1
+3343	2594 1
+3343	2974 1
+3343	3005 1
+3343	3028 1
+3343	3117 1
+3343	3541 1
+3343	3772 1
+3343	3888 1
+3344	2594 1
+3345	204 1
+3345	737 1
+3345	1571 1
+3345	1633 1
+3345	2145 1
+3345	2297 1
+3345	2398 1
+3345	2440 1
+3345	2542 1
+3345	2623 1
+3345	2660 1
+3345	2819 1
+3345	3021 1
+3345	3408 1
+3345	3473 1
+3345	3586 1
+3345	4175 1
+3345	4709 1
+3345	4964 1
+3345	5037 1
+3345	5123 1
+3345	5182 1
+3345	5254 1
+3345	5459 1
+3345	5596 1
+3345	5775 1
+3345	5784 1
+3345	5925 1
+3345	6458 1
+3345	6496 1
+3345	6498 1
+3345	6528 1
+3345	6570 1
+3345	6600 1
+3345	6632 1
+3346	2657 1
+3346	3021 1
+3346	3454 1
+3346	4507 1
+3346	4735 1
+3348	1026 1
+3348	3334 1
+3348	3351 1
+3348	3459 1
+3348	4037 1
+3348	5233 1
+3348	5246 1
+3348	5432 1
+3348	5806 1
+3348	6006 1
+3348	6299 1
+3348	6330 1
+3348	6334 1
+3348	6472 1
+3348	6498 1
+3348	6511 1
+3348	6571 1
+3348	6634 1
+3348	6755 1
+3348	7092 1
+3348	7442 1
+3348	7588 1
+3348	7809 1
+3348	8044 1
+3348	8297 1
+3349	1571 1
+3349	2016 1
+3349	2209 1
+3349	2252 1
+3349	2597 1
+3349	2667 1
+3349	3351 1
+3349	3580 1
+3349	3587 1
+3350	737 1
+3350	1360 1
+3350	2144 1
+3350	2145 1
+3350	2237 1
+3350	2398 1
+3350	2585 1
+3350	2619 1
+3350	2831 1
+3350	2871 1
+3350	3002 1
+3350	3027 1
+3350	3028 1
+3350	3034 1
+3350	3103 1
+3350	3117 1
+3350	3144 1
+3350	3260 1
+3350	3321 1
+3350	3334 1
+3350	3351 1
+3350	3352 1
+3350	3443 1
+3350	3447 1
+3350	3452 1
+3350	3453 1
+3350	3454 1
+3350	3464 1
+3350	3489 1
+3350	3516 1
+3350	3615 1
+3350	3635 1
+3350	3660 1
+3350	3748 1
+3350	3812 1
+3350	3843 1
+3350	3897 1
+3350	3903 1
+3350	3956 1
+3350	3958 1
+3350	4044 1
+3350	4261 1
+3350	4299 1
+3350	4448 1
+3350	4485 1
+3350	4510 1
+3350	4528 1
+3350	4587 1
+3350	4653 1
+3350	4662 1
+3350	4706 1
+3350	4827 1
+3350	4846 1
+3350	4962 1
+3350	5189 1
+3352	72 1
+3352	285 1
+3352	417 1
+3352	465 1
+3352	608 1
+3352	762 1
+3352	825 1
+3352	827 1
+3352	974 1
+3352	1140 1
+3352	1166 1
+3352	1185 1
+3352	1239 1
+3352	1247 1
+3352	1297 1
+3352	1307 1
+3352	1310 1
+3352	1385 1
+3352	1453 1
+3352	1549 1
+3352	1571 1
+3352	1633 1
+3352	1680 1
+3352	1688 1
+3352	1706 1
+3352	1729 1
+3352	1769 1
+3352	1799 1
+3352	1990 1
+3352	2066 1
+3352	2114 1
+3352	2134 1
+3352	2144 1
+3352	2145 1
+3352	2240 1
+3352	2252 1
+3352	2257 1
+3352	2289 1
+3352	2297 1
+3352	2324 1
+3352	2326 1
+3352	2328 1
+3352	2338 1
+3352	2354 1
+3352	2369 1
+3352	2381 1
+3352	2384 1
+3352	2398 1
+3352	2411 1
+3352	2433 1
+3352	2485 1
+3352	2506 1
+3352	2510 1
+3352	2516 1
+3352	2517 1
+3352	2535 1
+3352	2544 1
+3352	2565 1
+3352	2576 1
+3352	2592 1
+3352	2595 1
+3352	2619 1
+3352	2646 1
+3352	2653 1
+3352	2654 1
+3352	2655 1
+3352	2657 1
+3352	2660 1
+3352	2667 1
+3352	2674 1
+3352	2687 1
+3352	2689 1
+3352	2693 1
+3352	2696 1
+3352	2727 1
+3352	2746 1
+3352	2747 1
+3352	2760 1
+3352	2775 1
+3352	2785 1
+3352	2787 1
+3352	2790 1
+3352	2819 1
+3352	2822 1
+3352	2859 1
+3352	2871 1
+3352	2900 1
+3352	2909 1
+3352	2932 1
+3352	2958 1
+3352	2973 1
+3352	2981 1
+3352	3005 1
+3352	3007 1
+3352	3009 1
+3352	3014 1
+3352	3024 1
+3352	3026 1
+3352	3027 1
+3352	3028 1
+3352	3059 1
+3352	3084 1
+3352	3089 1
+3352	3092 1
+3352	3103 1
+3352	3106 1
+3352	3114 1
+3352	3117 1
+3352	3125 1
+3352	3140 1
+3352	3144 1
+3352	3173 1
+3352	3180 1
+3352	3192 1
+3352	3258 1
+3352	3260 1
+3352	3276 1
+3352	3291 1
+3352	3309 1
+3352	3313 1
+3352	3346 1
+3352	3394 1
+3352	3404 1
+3352	3408 1
+3352	3417 1
+3352	3435 1
+3352	3443 1
+3352	3447 1
+3352	3452 1
+3352	3454 1
+3352	3455 1
+3352	3456 1
+3352	3464 1
+3352	3483 1
+3352	3516 1
+3352	3529 1
+3352	3537 1
+3352	3557 1
+3352	3562 1
+3352	3567 1
+3352	3568 1
+3352	3607 1
+3352	3615 1
+3352	3631 1
+3352	3635 1
+3352	3643 1
+3352	3645 1
+3352	3650 1
+3352	3660 1
+3352	3661 1
+3352	3664 1
+3352	3670 1
+3352	3680 1
+3352	3691 1
+3352	3717 1
+3352	3724 1
+3352	3800 1
+3352	3808 1
+3352	3812 1
+3352	3813 1
+3352	3835 1
+3352	3843 1
+3352	3847 1
+3352	3887 1
+3352	3892 1
+3352	3897 1
+3352	3903 1
+3352	3910 1
+3352	3921 1
+3352	3926 1
+3352	3937 1
+3352	3958 1
+3352	3967 1
+3352	3970 1
+3352	3976 1
+3352	3999 1
+3352	4011 1
+3352	4013 1
+3352	4021 1
+3352	4024 1
+3352	4037 1
+3352	4040 1
+3352	4043 1
+3352	4051 1
+3352	4055 1
+3352	4058 1
+3352	4088 1
+3352	4110 1
+3352	4124 1
+3352	4138 1
+3352	4162 1
+3352	4179 1
+3352	4181 1
+3352	4191 1
+3352	4201 1
+3352	4212 1
+3352	4233 1
+3352	4234 1
+3352	4247 1
+3352	4256 1
+3352	4263 1
+3352	4266 1
+3352	4269 1
+3352	4289 1
+3352	4290 1
+3352	4299 1
+3352	4315 1
+3352	4323 1
+3352	4335 1
+3352	4349 1
+3352	4355 1
+3352	4365 1
+3352	4373 1
+3352	4384 1
+3352	4400 1
+3352	4412 1
+3352	4417 1
+3352	4422 1
+3352	4424 1
+3352	4448 1
+3352	4471 1
+3352	4480 1
+3352	4482 1
+3352	4485 1
+3352	4510 1
+3352	4528 1
+3352	4531 1
+3352	4536 1
+3352	4547 1
+3352	4551 1
+3352	4587 1
+3352	4613 1
+3352	4666 1
+3352	4712 1
+3352	4717 1
+3352	4719 1
+3352	4735 1
+3352	4824 1
+3352	4827 1
+3352	4828 1
+3352	4866 1
+3352	4929 1
+3352	4953 1
+3352	4962 1
+3352	4964 1
+3352	4999 1
+3352	5083 1
+3352	5092 1
+3352	5123 1
+3352	5130 1
+3352	5132 1
+3352	5162 1
+3352	5204 1
+3352	5222 1
+3352	5233 1
+3352	5239 1
+3352	5288 1
+3352	5308 1
+3352	5323 1
+3352	5327 1
+3352	5335 1
+3352	5341 1
+3352	5364 1
+3352	5392 1
+3352	5412 1
+3352	5423 1
+3352	5430 1
+3352	5449 1
+3352	5457 1
+3352	5467 1
+3352	5817 1
+3352	8293 1
+3352	8294 1
+3353	2565 1
+3354	1823 1
+3354	2565 1
+3354	3371 1
+3354	4791 1
+3354	4796 1
+3355	3348 1
+3355	5432 1
+3355	8044 1
+3360	3348 1
+3356	3348 1
+3357	3348 1
+3357	3769 1
+3358	3348 1
+3359	3348 1
+3306	1297 1
+3306	2535 1
+3306	3348 1
+3306	3376 1
+3306	3645 1
+3306	4349 1
+3306	4453 1
+3361	2338 1
+3361	3348 1
+3362	3348 1
+3368	3371 1
+3369	3371 1
+3370	3371 1
+3366	72 1
+3366	1024 1
+3366	1140 1
+3366	1919 1
+3366	1961 1
+3366	2328 1
+3366	2364 1
+3366	2433 1
+3366	2507 1
+3366	2535 1
+3366	2565 1
+3366	2576 1
+3366	2657 1
+3366	2775 1
+3366	3014 1
+3366	3027 1
+3366	3334 1
+3366	3352 1
+3366	3371 1
+3366	3456 1
+3366	3937 1
+3366	3976 1
+3366	4124 1
+3366	4127 1
+3366	4175 1
+3366	4199 1
+3366	4272 1
+3366	4298 1
+3366	4310 1
+3366	4331 1
+3366	4335 1
+3366	4365 1
+3366	4386 1
+3366	4448 1
+3366	4466 1
+3366	4500 1
+3366	4574 1
+3366	4712 1
+3366	4777 1
+3366	4875 1
+3366	5020 1
+3366	5210 1
+3366	5233 1
+3366	5308 1
+3366	5311 1
+3366	5449 1
+3366	5454 1
+3366	5459 1
+3366	5511 1
+3366	5527 1
+3366	5637 1
+3366	5693 1
+3366	5817 1
+3366	5936 1
+3366	5963 1
+3366	5969 1
+3366	6027 1
+3366	6105 1
+3366	6306 1
+3366	6421 1
+3366	6914 1
+3366	7115 1
+3366	8295 1
+3367	3371 1
+3367	4263 1
+3367	7400 1
+3373	1157 1
+3373	2328 1
+3373	2746 1
+3373	2981 1
+3373	3192 1
+3373	3615 1
+3373	4162 1
+3373	4179 1
+3373	4191 1
+3373	4263 1
+3373	4269 1
+3373	4323 1
+3374	3376 1
+3374	3489 1
+3374	3516 1
+3374	4534 1
+3375	737 1
+3375	1915 1
+3375	2290 1
+3375	2328 1
+3375	2411 1
+3375	2485 1
+3375	2510 1
+3375	2542 1
+3375	2544 1
+3375	2585 1
+3375	2653 1
+3375	2657 1
+3375	2727 1
+3375	2746 1
+3375	2859 1
+3375	2923 1
+3375	2958 1
+3375	3005 1
+3375	3026 1
+3375	3260 1
+3375	3276 1
+3375	3334 1
+3375	3376 1
+3375	3464 1
+3375	3516 1
+3375	3520 1
+3375	3557 1
+3375	3562 1
+3375	3615 1
+3375	3629 1
+3375	3645 1
+3375	3680 1
+3375	3898 1
+3375	3903 1
+3375	3974 1
+3375	4299 1
+3375	4385 1
+3375	4528 1
+3375	4536 1
+3375	4977 1
+3375	5285 1
+3375	5421 1
+3375	5743 1
+3377	2297 1
+3377	2654 1
+3377	3489 1
+3377	3587 1
+3378	72 1
+3378	737 1
+3378	762 1
+3378	896 1
+3378	1297 1
+3378	1385 1
+3378	1961 1
+3378	2160 1
+3378	2297 1
+3378	2384 1
+3378	2398 1
+3378	2411 1
+3378	2456 1
+3378	2485 1
+3378	2657 1
+3378	3321 1
+3378	3352 1
+3378	3417 1
+3378	3443 1
+3378	3452 1
+3378	3562 1
+3378	3635 1
+3378	3720 1
+3378	3854 1
+3378	4055 1
+3378	4099 1
+3378	4162 1
+3378	4179 1
+3378	4463 1
+3378	4510 1
+3378	4600 1
+3378	4735 1
+3378	4781 1
+3378	4846 1
+3378	5022 1
+3378	5178 1
+3378	5412 1
+3378	5459 1
+3378	5503 1
+3378	6934 1
+3378	7694 1
+3379	417 1
+3379	974 1
+3379	1571 1
+3379	1633 1
+3379	2016 1
+3379	2209 1
+3379	2252 1
+3379	2290 1
+3379	2297 1
+3379	2576 1
+3379	2597 1
+3379	2653 1
+3379	2660 1
+3379	2667 1
+3379	3009 1
+3379	3334 1
+3379	3473 1
+3379	3489 1
+3379	3516 1
+3380	72 1
+3380	204 1
+3380	1157 1
+3380	1166 1
+3380	1982 1
+3380	2290 1
+3380	2297 1
+3380	2324 1
+3380	2328 1
+3380	2411 1
+3380	2485 1
+3380	2510 1
+3380	2576 1
+3380	2585 1
+3380	2654 1
+3380	2657 1
+3380	2660 1
+3380	2727 1
+3380	2790 1
+3380	3005 1
+3380	3148 1
+3380	3173 1
+3380	3276 1
+3380	3408 1
+3380	3409 1
+3380	3439 1
+3380	3506 1
+3380	3516 1
+3380	3520 1
+3380	3615 1
+3380	3623 1
+3380	3769 1
+3380	4795 1
+3380	5002 1
+3380	5378 1
+3380	6918 1
+3380	6946 1
+3380	7809 1
+3380	8042 1
+3380	8051 1
+3380	8209 1
+3380	8219 1
+3381	15 1
+3381	1403 1
+3381	1571 1
+3381	1823 1
+3381	2016 1
+3381	2290 1
+3381	2297 1
+3381	2433 1
+3381	2511 1
+3381	2542 1
+3381	2623 1
+3381	2774 1
+3381	2785 1
+3381	2819 1
+3381	2851 1
+3381	2940 1
+3381	3000 1
+3381	3238 1
+3381	3346 1
+3381	3489 1
+3381	3631 1
+3381	3634 1
+3381	3726 1
+3381	3792 1
+3381	3803 1
+3381	3873 1
+3381	3969 1
+3381	4488 1
+3381	4536 1
+3381	4666 1
+3381	4709 1
+3381	4713 1
+3381	4764 1
+3381	4884 1
+3381	4944 1
+3381	4980 1
+3381	5002 1
+3381	5012 1
+3381	5022 1
+3381	5028 1
+3381	5188 1
+3381	5199 1
+3381	5200 1
+3381	5254 1
+3381	5288 1
+3381	5289 1
+3381	5295 1
+3381	5335 1
+3381	5384 1
+3381	5432 1
+3381	5465 1
+3381	5484 1
+3381	5524 1
+3381	5543 1
+3381	5563 1
+3381	5582 1
+3381	5596 1
+3381	5697 1
+3381	5714 1
+3381	5739 1
+3381	5760 1
+3381	5776 1
+3381	5798 1
+3381	5800 1
+3381	5804 1
+3381	5806 1
+3381	5814 1
+3381	5818 1
+3381	5819 1
+3381	5822 1
+3381	5827 1
+3381	5835 1
+3381	5871 1
+3381	5872 1
+3381	5897 1
+3381	5902 1
+3381	5922 1
+3381	5932 1
+3381	5998 1
+3381	6000 1
+3381	6097 1
+3381	6123 1
+3381	6156 1
+3381	6170 1
+3381	6218 1
+3381	6221 1
+3381	6227 1
+3381	6243 1
+3381	6262 1
+3381	6272 1
+3381	6305 1
+3381	6306 1
+3381	6328 1
+3381	6334 1
+3381	6347 1
+3381	6414 1
+3381	6417 1
+3381	6432 1
+3381	6441 1
+3381	6442 1
+3381	6498 1
+3381	6501 1
+3381	6566 1
+3381	6594 1
+3381	6595 1
+3381	6599 1
+3381	6600 1
+3381	6624 1
+3381	6632 1
+3381	6634 1
+3381	6699 1
+3381	6712 1
+3381	6715 1
+3381	6720 1
+3381	6736 1
+3381	6770 1
+3381	6774 1
+3381	6783 1
+3381	6784 1
+3381	6790 1
+3381	6832 1
+3381	6855 1
+3381	6860 1
+3381	6869 1
+3381	6873 1
+3381	6897 1
+3381	6901 1
+3381	6907 1
+3381	6913 1
+3381	6918 1
+3381	6930 1
+3381	6934 1
+3381	6945 1
+3381	6948 1
+3381	6955 1
+3381	6976 1
+3381	7021 1
+3381	7052 1
+3381	7073 1
+3381	7088 1
+3381	7094 1
+3381	7101 1
+3381	7108 1
+3381	7115 1
+3381	7119 1
+3381	7143 1
+3381	7144 1
+3381	7214 1
+3381	7237 1
+3381	7279 1
+3381	7280 1
+3381	7295 1
+3381	7301 1
+3381	7373 1
+3381	7378 1
+3381	7381 1
+3381	7414 1
+3381	7422 1
+3381	7443 1
+3381	7450 1
+3381	7478 1
+3381	7510 1
+3381	7512 1
+3381	7529 1
+3381	7618 1
+3381	7624 1
+3381	7632 1
+3381	7646 1
+3381	7647 1
+3381	7651 1
+3381	7662 1
+3381	7694 1
+3381	7695 1
+3381	7726 1
+3381	7757 1
+3381	7788 1
+3381	7899 1
+3381	8083 1
+3381	8122 1
+3381	8134 1
+3382	2297 1
+3383	2297 1
+3383	2653 1
+3384	2297 1
+3384	2398 1
+3384	3580 1
+3385	2297 1
+3388	15 1
+3388	737 1
+3388	762 1
+3388	1159 1
+3388	1633 1
+3388	1919 1
+3388	2565 1
+3388	2646 1
+3388	2657 1
+3388	2871 1
+3388	3352 1
+3388	3645 1
+3388	3835 1
+3388	4179 1
+3388	4510 1
+3389	1633 1
+3389	5210 1
+3391	417 1
+3391	1633 1
+3391	2508 1
+3391	2660 1
+3392	827 1
+3392	1239 1
+3392	1297 1
+3392	1549 1
+3392	1633 1
+3392	2066 1
+3392	2324 1
+3392	2510 1
+3392	2544 1
+3392	2576 1
+3392	2585 1
+3392	2619 1
+3392	2657 1
+3392	2822 1
+3392	3024 1
+3392	3084 1
+3392	3284 1
+3392	3454 1
+3392	3529 1
+3392	3555 1
+3392	3650 1
+3392	3769 1
+3392	3800 1
+3392	3816 1
+3392	3892 1
+3392	3910 1
+3392	3967 1
+3392	3970 1
+3392	3980 1
+3392	4583 1
+3392	5092 1
+3392	5605 1
+3392	7620 1
+3393	1633 1
+3393	3752 1
+3393	4335 1
+3393	5459 1
+3393	5683 1
+3393	5897 1
+3393	5998 1
+3393	6044 1
+3393	6774 1
+3393	7946 1
+3394	465 1
+3394	737 1
+3394	762 1
+3394	778 1
+3394	825 1
+3394	827 1
+3394	974 1
+3394	1297 1
+3394	1305 1
+3394	1549 1
+3394	1633 1
+3394	1688 1
+3394	1706 1
+3394	1729 1
+3394	1777 1
+3394	1915 1
+3394	1990 1
+3394	2066 1
+3394	2129 1
+3394	2144 1
+3394	2209 1
+3394	2237 1
+3394	2252 1
+3394	2257 1
+3394	2324 1
+3394	2326 1
+3394	2328 1
+3394	2381 1
+3394	2398 1
+3394	2411 1
+3394	2485 1
+3394	2508 1
+3394	2510 1
+3394	2565 1
+3394	2576 1
+3394	2585 1
+3394	2646 1
+3394	2653 1
+3394	2654 1
+3394	2657 1
+3394	2660 1
+3394	2687 1
+3394	2693 1
+3394	2727 1
+3394	2746 1
+3394	2747 1
+3394	2775 1
+3394	2790 1
+3394	2799 1
+3394	2900 1
+3394	2923 1
+3394	2932 1
+3394	2958 1
+3394	2974 1
+3394	3005 1
+3394	3010 1
+3394	3014 1
+3394	3027 1
+3394	3084 1
+3394	3103 1
+3394	3117 1
+3394	3125 1
+3394	3144 1
+3394	3173 1
+3394	3180 1
+3394	3260 1
+3394	3276 1
+3394	3291 1
+3394	3301 1
+3394	3334 1
+3394	3352 1
+3394	3404 1
+3394	3409 1
+3394	3410 1
+3394	3439 1
+3394	3446 1
+3394	3447 1
+3394	3453 1
+3394	3454 1
+3394	3455 1
+3394	3456 1
+3394	3473 1
+3394	3480 1
+3394	3483 1
+3394	3516 1
+3394	3529 1
+3394	3537 1
+3394	3541 1
+3394	3548 1
+3394	3562 1
+3394	3568 1
+3394	3615 1
+3394	3629 1
+3394	3634 1
+3394	3635 1
+3394	3645 1
+3394	3650 1
+3394	3660 1
+3394	3671 1
+3394	3681 1
+3394	3737 1
+3394	3745 1
+3394	3769 1
+3394	3772 1
+3394	3776 1
+3394	3785 1
+3394	3800 1
+3394	3811 1
+3394	3812 1
+3394	3813 1
+3394	3822 1
+3394	3867 1
+3394	3898 1
+3394	3903 1
+3394	3914 1
+3394	3922 1
+3394	3926 1
+3394	3942 1
+3394	3958 1
+3394	3974 1
+3394	4011 1
+3394	4021 1
+3394	4031 1
+3394	4124 1
+3394	4189 1
+3394	4191 1
+3394	4256 1
+3394	4289 1
+3394	4290 1
+3394	4297 1
+3394	4299 1
+3394	4315 1
+3394	4373 1
+3394	4385 1
+3394	4386 1
+3394	4400 1
+3394	4402 1
+3394	4424 1
+3394	4528 1
+3394	4536 1
+3394	4578 1
+3394	4719 1
+3394	4735 1
+3394	4783 1
+3394	4811 1
+3394	5130 1
+3394	5189 1
+3394	5204 1
+3394	5301 1
+3394	5412 1
+3394	5417 1
+3394	5564 1
+3394	5882 1
+3394	5891 1
+3394	7620 1
+3394	8294 1
+3395	3018 1
+3396	2016 1
+3396	3018 1
+3397	2654 1
+3397	3018 1
+3397	3408 1
+3398	3018 1
+3399	3018 1
+3399	3408 1
+3399	4181 1
+3400	3018 1
+3401	3018 1
+3403	3018 1
+3403	3408 1
+3403	5254 1
+3402	608 1
+3402	762 1
+3402	1157 1
+3402	1185 1
+3402	1305 1
+3402	1310 1
+3402	1549 1
+3402	1688 1
+3402	1729 1
+3402	1744 1
+3402	1990 1
+3402	2237 1
+3402	2252 1
+3402	2324 1
+3402	2364 1
+3402	2369 1
+3402	2381 1
+3402	2398 1
+3402	2516 1
+3402	2517 1
+3402	2595 1
+3402	2623 1
+3402	2646 1
+3402	2653 1
+3402	2654 1
+3402	2689 1
+3402	2760 1
+3402	2775 1
+3402	2799 1
+3402	2819 1
+3402	2822 1
+3402	2831 1
+3402	3002 1
+3402	3014 1
+3402	3018 1
+3402	3027 1
+3402	3034 1
+3402	3092 1
+3402	3103 1
+3402	3106 1
+3402	3144 1
+3402	3180 1
+3402	3276 1
+3402	3321 1
+3402	3334 1
+3402	3352 1
+3402	3394 1
+3402	3433 1
+3402	3439 1
+3402	3443 1
+3402	3452 1
+3402	3453 1
+3402	3454 1
+3402	3455 1
+3402	3460 1
+3402	3464 1
+3402	3489 1
+3402	3516 1
+3402	3537 1
+3402	3607 1
+3402	3635 1
+3402	3645 1
+3402	3660 1
+3402	3664 1
+3402	3720 1
+3402	3724 1
+3402	3748 1
+3402	3843 1
+3402	3910 1
+3402	3946 1
+3402	3956 1
+3402	3958 1
+3402	3962 1
+3402	4011 1
+3402	4021 1
+3402	4037 1
+3402	4044 1
+3402	4124 1
+3402	4199 1
+3402	4261 1
+3402	4266 1
+3402	4297 1
+3402	4299 1
+3402	4335 1
+3402	4349 1
+3402	4400 1
+3402	4453 1
+3402	4463 1
+3402	4480 1
+3402	4485 1
+3402	4547 1
+3402	4578 1
+3402	4600 1
+3402	4613 1
+3402	4661 1
+3402	4666 1
+3402	4719 1
+3402	4735 1
+3402	4792 1
+3402	4796 1
+3402	4808 1
+3402	4820 1
+3402	4827 1
+3402	4828 1
+3402	4953 1
+3402	5026 1
+3402	5033 1
+3402	5083 1
+3402	5092 1
+3402	5100 1
+3402	5106 1
+3402	5130 1
+3402	5204 1
+3402	5222 1
+3402	5335 1
+3402	5392 1
+3402	5412 1
+3402	5449 1
+3402	5463 1
+3402	5506 1
+3402	5817 1
+3402	6032 1
+3036	2653 1
+3036	2660 1
+3036	2819 1
+3036	3009 1
+3036	3516 1
+3036	3592 1
+3036	8293 1
+3404	465 1
+3404	737 1
+3404	896 1
+3404	1159 1
+3404	1297 1
+3404	1688 1
+3404	1799 1
+3404	2114 1
+3404	2257 1
+3404	2276 1
+3404	2290 1
+3404	2324 1
+3404	2485 1
+3404	2585 1
+3404	2623 1
+3404	2654 1
+3404	2657 1
+3404	2667 1
+3404	2693 1
+3404	2727 1
+3404	2747 1
+3404	2819 1
+3404	2822 1
+3404	2909 1
+3404	2973 1
+3404	3010 1
+3404	3027 1
+3404	3059 1
+3404	3089 1
+3404	3103 1
+3404	3114 1
+3404	3148 1
+3404	3191 1
+3404	3238 1
+3404	3352 1
+3404	3408 1
+3404	3417 1
+3404	3454 1
+3404	3480 1
+3404	3489 1
+3404	3529 1
+3404	3548 1
+3404	3586 1
+3404	3587 1
+3404	3643 1
+3404	3650 1
+3404	3680 1
+3404	3792 1
+3404	3808 1
+3404	3897 1
+3404	3903 1
+3404	3910 1
+3404	3922 1
+3404	4041 1
+3404	4138 1
+3404	4175 1
+3404	4289 1
+3404	4310 1
+3404	4448 1
+3404	4482 1
+3404	4527 1
+3404	4712 1
+3404	4884 1
+3404	4940 1
+3404	5100 1
+3404	5106 1
+3404	5255 1
+3404	5323 1
+3404	5341 1
+3404	5375 1
+3404	5430 1
+3404	5439 1
+3404	5465 1
+3404	5482 1
+3404	5732 1
+3404	5839 1
+3404	5844 1
+3404	5886 1
+3404	5891 1
+3404	5947 1
+3404	5994 1
+3404	6029 1
+3404	6307 1
+3404	6555 1
+3404	7092 1
+3404	7624 1
+3404	7833 1
+3404	8263 1
+3404	8293 1
+3405	3408 1
+3390	72 1
+3390	1360 1
+3390	1473 1
+3390	2001 1
+3390	2258 1
+3390	2338 1
+3390	2364 1
+3390	2398 1
+3390	2516 1
+3390	2576 1
+3390	2605 1
+3390	2696 1
+3390	2822 1
+3390	3073 1
+3390	3274 1
+3390	3291 1
+3390	3321 1
+3390	3393 1
+3390	3408 1
+3390	3417 1
+3390	3435 1
+3390	3460 1
+3390	3537 1
+3390	3748 1
+3390	3796 1
+3390	3854 1
+3390	3910 1
+3390	3958 1
+3390	4124 1
+3390	4335 1
+3390	4338 1
+3390	4530 1
+3390	4653 1
+3390	4706 1
+3390	4827 1
+3390	4899 1
+3390	4964 1
+3390	4986 1
+3390	4993 1
+3390	5072 1
+3390	5123 1
+3390	5226 1
+3390	5263 1
+3390	5321 1
+3390	5335 1
+3390	5388 1
+3390	5454 1
+3390	5459 1
+3390	5511 1
+3390	5592 1
+3390	5637 1
+3390	5640 1
+3390	5651 1
+3390	5693 1
+3390	5705 1
+3390	5732 1
+3390	5737 1
+3390	5743 1
+3390	5756 1
+3390	5775 1
+3407	3408 1
+3406	3352 1
+3406	3408 1
+3406	3541 1
+3406	4587 1
+3409	3752 1
+3411	285 1
+3412	285 1
+3422	2485 1
+3422	2660 1
+3422	8293 1
+3423	8293 1
+3416	8293 1
+3424	8293 1
+3425	5375 1
+3425	8293 1
+3418	8293 1
+3417	762 1
+3417	1688 1
+3417	2134 1
+3417	2237 1
+3417	2257 1
+3417	2354 1
+3417	2411 1
+3417	2565 1
+3417	2597 1
+3417	2653 1
+3417	2657 1
+3417	2822 1
+3417	2909 1
+3417	2932 1
+3417	3173 1
+3417	3321 1
+3417	3404 1
+3417	3447 1
+3417	3460 1
+3417	3871 1
+3417	3910 1
+3417	4037 1
+3417	4181 1
+3417	4310 1
+3417	4448 1
+3417	4983 1
+3417	5026 1
+3417	5335 1
+3417	5341 1
+3417	8293 1
+3426	8293 1
+3434	2338 1
+3433	2338 1
+3433	2775 1
+3433	2811 1
+3433	3321 1
+3433	3352 1
+3433	4212 1
+3433	4661 1
+3433	4875 1
+3433	4962 1
+3435	1744 1
+3435	2384 1
+3435	3999 1
+3435	4510 1
+3436	2576 1
+3437	2576 1
+3440	2576 1
+3441	2576 1
+3441	3946 1
+3443	15 1
+3443	762 1
+3443	1961 1
+3443	2328 1
+3443	2456 1
+3443	2508 1
+3443	2565 1
+3443	2576 1
+3443	2693 1
+3443	2799 1
+3443	3026 1
+3443	3456 1
+3443	3720 1
+3443	3724 1
+3443	3813 1
+3443	3875 1
+3443	4234 1
+3443	4531 1
+3443	5022 1
+3443	5079 1
+3438	2576 1
+3444	2252 1
+3444	2576 1
+3445	15 1
+3445	72 1
+3445	1549 1
+3445	2381 1
+3445	2398 1
+3445	2535 1
+3445	2576 1
+3445	2775 1
+3445	3439 1
+3445	3443 1
+3445	4011 1
+3445	4247 1
+3445	4335 1
+3445	4422 1
+3445	4712 1
+3445	4797 1
+3445	5100 1
+3445	5182 1
+3445	5947 1
+3445	5963 1
+3445	6784 1
+3439	417 1
+3439	825 1
+3439	974 1
+3439	1166 1
+3439	1239 1
+3439	1352 1
+3439	1385 1
+3439	1571 1
+3439	2016 1
+3439	2144 1
+3439	2206 1
+3439	2209 1
+3439	2210 1
+3439	2290 1
+3439	2324 1
+3439	2440 1
+3439	2510 1
+3439	2576 1
+3439	2585 1
+3439	2597 1
+3439	2619 1
+3439	2620 1
+3439	2653 1
+3439	2655 1
+3439	2657 1
+3439	2667 1
+3439	2674 1
+3439	2693 1
+3439	2747 1
+3439	2819 1
+3439	2871 1
+3439	2932 1
+3439	3009 1
+3439	3026 1
+3439	3084 1
+3439	3140 1
+3439	3148 1
+3439	3258 1
+3439	3260 1
+3439	3276 1
+3439	3291 1
+3439	3334 1
+3439	3456 1
+3439	3461 1
+3439	3473 1
+3439	3516 1
+3439	3538 1
+3439	3548 1
+3439	3556 1
+3439	3567 1
+3439	3587 1
+3439	3631 1
+3439	3650 1
+3439	3670 1
+3439	3885 1
+3439	3898 1
+3439	4011 1
+3439	4021 1
+3439	4024 1
+3439	4088 1
+3439	4110 1
+3439	4124 1
+3439	4216 1
+3439	4220 1
+3439	4269 1
+3439	4351 1
+3439	4365 1
+3439	4402 1
+3439	4403 1
+3439	4510 1
+3439	4531 1
+3439	4536 1
+3439	4712 1
+3439	5188 1
+3439	5210 1
+3439	5254 1
+3439	5412 1
+3439	5827 1
+3439	6501 1
+3439	6600 1
+3439	6632 1
+3439	6634 1
+3439	6663 1
+3439	6699 1
+3439	6860 1
+3439	6930 1
+3439	7632 1
+3439	8295 1
+3447	737 1
+3447	1305 1
+3447	1310 1
+3447	1549 1
+3447	1688 1
+3447	1799 1
+3447	1823 1
+3447	2237 1
+3447	2258 1
+3447	2285 1
+3447	2326 1
+3447	2328 1
+3447	2354 1
+3447	2364 1
+3447	2369 1
+3447	2456 1
+3447	2576 1
+3447	2592 1
+3447	2605 1
+3447	2658 1
+3447	2774 1
+3447	2775 1
+3447	2822 1
+3447	2831 1
+3447	2871 1
+3447	3014 1
+3447	3015 1
+3447	3027 1
+3447	3034 1
+3447	3089 1
+3447	3092 1
+3447	3103 1
+3447	3238 1
+3447	3274 1
+3447	3276 1
+3447	3291 1
+3447	3297 1
+3447	3309 1
+3447	3321 1
+3447	3334 1
+3447	3352 1
+3447	3376 1
+3447	3417 1
+3447	3452 1
+3447	3453 1
+3447	3455 1
+3447	3456 1
+3447	3458 1
+3447	3459 1
+3447	3464 1
+3447	3479 1
+3447	3537 1
+3447	3635 1
+3447	3664 1
+3447	3752 1
+3447	3796 1
+3447	3843 1
+3447	3897 1
+3447	3898 1
+3447	3910 1
+3447	3911 1
+3447	3958 1
+3447	4011 1
+3447	4037 1
+3447	4040 1
+3447	4041 1
+3447	4044 1
+3447	4065 1
+3447	4099 1
+3447	4124 1
+3447	4127 1
+3447	4189 1
+3447	4191 1
+3447	4212 1
+3447	4261 1
+3447	4266 1
+3447	4298 1
+3447	4310 1
+3447	4335 1
+3447	4355 1
+3447	4361 1
+3447	4400 1
+3447	4448 1
+3447	4483 1
+3447	4529 1
+3447	4530 1
+3447	4547 1
+3447	4551 1
+3447	4574 1
+3447	4587 1
+3447	4588 1
+3447	4653 1
+3447	4654 1
+3447	4661 1
+3447	4662 1
+3447	4666 1
+3447	4677 1
+3447	4678 1
+3447	4687 1
+3447	4712 1
+3447	4713 1
+3447	4715 1
+3447	4717 1
+3447	4735 1
+3447	4776 1
+3447	4777 1
+3447	4778 1
+3447	4780 1
+3447	4783 1
+3447	4792 1
+3447	4795 1
+3447	4796 1
+3447	4797 1
+3447	4814 1
+3447	4815 1
+3447	4827 1
+3447	4828 1
+3447	4846 1
+3447	4879 1
+3447	4934 1
+3447	4953 1
+3447	4954 1
+3447	4962 1
+3447	4964 1
+3447	4977 1
+3447	4983 1
+3447	4986 1
+3447	4994 1
+3447	4999 1
+3447	5002 1
+3447	5020 1
+3447	5043 1
+3447	5044 1
+3447	5055 1
+3447	5058 1
+3447	5061 1
+3447	5079 1
+3447	5106 1
+3447	5123 1
+3447	5144 1
+3447	5162 1
+3447	5178 1
+3447	5179 1
+3447	5188 1
+3447	5189 1
+3447	5200 1
+3447	5204 1
+3447	5226 1
+3447	5255 1
+3447	5262 1
+3447	5273 1
+3447	5288 1
+3447	5295 1
+3447	5305 1
+3447	5308 1
+3447	5312 1
+3447	5323 1
+3447	5341 1
+3447	5364 1
+3447	5368 1
+3447	5375 1
+3447	5417 1
+3447	5432 1
+3447	5449 1
+3447	5459 1
+3447	5463 1
+3447	5479 1
+3447	5506 1
+3447	5524 1
+3447	5529 1
+3447	5543 1
+3447	5563 1
+3447	5596 1
+3447	5605 1
+3447	5620 1
+3447	5637 1
+3447	5640 1
+3447	5680 1
+3447	5683 1
+3447	5697 1
+3447	5705 1
+3447	5737 1
+3447	5743 1
+3447	5760 1
+3447	5775 1
+3447	5800 1
+3447	5804 1
+3447	5811 1
+3447	5814 1
+3447	5818 1
+3447	5819 1
+3447	5827 1
+3447	5829 1
+3447	5844 1
+3447	5871 1
+3447	5886 1
+3447	5932 1
+3447	5973 1
+3447	5998 1
+3447	6044 1
+3447	6083 1
+3447	6097 1
+3447	6105 1
+3447	6109 1
+3447	6148 1
+3447	6218 1
+3447	6225 1
+3447	6241 1
+3447	6246 1
+3447	6255 1
+3447	6261 1
+3447	6262 1
+3447	6270 1
+3447	6272 1
+3447	6299 1
+3447	6305 1
+3447	6306 1
+3447	6327 1
+3447	6330 1
+3447	6337 1
+3447	6360 1
+3447	6414 1
+3447	6474 1
+3447	6481 1
+3447	6501 1
+3447	6505 1
+3447	6555 1
+3447	6576 1
+3447	6600 1
+3447	6606 1
+3447	6618 1
+3447	6634 1
+3447	6714 1
+3447	6720 1
+3447	6724 1
+3447	6736 1
+3447	6765 1
+3447	6784 1
+3447	6832 1
+3447	6873 1
+3447	6907 1
+3447	6913 1
+3447	6914 1
+3447	6920 1
+3447	6934 1
+3447	6946 1
+3447	6953 1
+3447	6955 1
+3447	6979 1
+3447	6997 1
+3447	7012 1
+3447	7021 1
+3447	7052 1
+3447	7092 1
+3447	7101 1
+3447	7108 1
+3447	7144 1
+3447	7186 1
+3447	7222 1
+3447	7262 1
+3447	7290 1
+3447	7351 1
+3447	7381 1
+3447	7414 1
+3447	7510 1
+3447	7662 1
+3447	7694 1
+3447	7813 1
+3447	7833 1
+3447	7961 1
+3447	8295 1
+3448	1688 1
+3448	3464 1
+3448	4578 1
+3449	15 1
+3449	72 1
+3449	222 1
+3449	346 1
+3449	608 1
+3449	737 1
+3449	762 1
+3449	896 1
+3449	1159 1
+3449	1185 1
+3449	1247 1
+3449	1310 1
+3449	1360 1
+3449	1473 1
+3449	1648 1
+3449	1680 1
+3449	1688 1
+3449	1733 1
+3449	1769 1
+3449	1799 1
+3449	2001 1
+3449	2014 1
+3449	2144 1
+3449	2145 1
+3449	2237 1
+3449	2240 1
+3449	2258 1
+3449	2276 1
+3449	2354 1
+3449	2369 1
+3449	2381 1
+3449	2398 1
+3449	2456 1
+3449	2490 1
+3449	2507 1
+3449	2516 1
+3449	2517 1
+3449	2576 1
+3449	2592 1
+3449	2605 1
+3449	2646 1
+3449	2689 1
+3449	2696 1
+3449	2760 1
+3449	2764 1
+3449	2765 1
+3449	2774 1
+3449	2775 1
+3449	2787 1
+3449	2790 1
+3449	2811 1
+3449	2822 1
+3449	2831 1
+3449	2851 1
+3449	2871 1
+3449	2909 1
+3449	2917 1
+3449	2925 1
+3449	3002 1
+3449	3014 1
+3449	3015 1
+3449	3027 1
+3449	3034 1
+3449	3073 1
+3449	3089 1
+3449	3092 1
+3449	3103 1
+3449	3106 1
+3449	3125 1
+3449	3140 1
+3449	3144 1
+3449	3274 1
+3449	3276 1
+3449	3284 1
+3449	3309 1
+3449	3321 1
+3449	3334 1
+3449	3352 1
+3449	3417 1
+3449	3433 1
+3449	3443 1
+3449	3447 1
+3449	3452 1
+3449	3453 1
+3449	3454 1
+3449	3456 1
+3449	3458 1
+3449	3460 1
+3449	3464 1
+3449	3479 1
+3449	3498 1
+3449	3537 1
+3449	3557 1
+3449	3607 1
+3449	3614 1
+3449	3635 1
+3449	3643 1
+3449	3645 1
+3449	3664 1
+3449	3726 1
+3449	3748 1
+3449	3792 1
+3449	3796 1
+3449	3806 1
+3449	3812 1
+3449	3813 1
+3449	3835 1
+3449	3843 1
+3449	3854 1
+3449	3873 1
+3449	3897 1
+3449	3898 1
+3449	3910 1
+3449	3958 1
+3449	3976 1
+3449	4011 1
+3449	4037 1
+3449	4040 1
+3449	4041 1
+3449	4044 1
+3449	4072 1
+3449	4098 1
+3449	4099 1
+3449	4103 1
+3449	4124 1
+3449	4127 1
+3449	4175 1
+3449	4189 1
+3449	4191 1
+3449	4212 1
+3449	4247 1
+3449	4261 1
+3449	4297 1
+3449	4299 1
+3449	4310 1
+3449	4315 1
+3449	4335 1
+3449	4338 1
+3449	4400 1
+3449	4422 1
+3449	4448 1
+3449	4453 1
+3449	4463 1
+3449	4466 1
+3449	4482 1
+3449	4483 1
+3449	4485 1
+3449	4527 1
+3449	4528 1
+3449	4530 1
+3449	4531 1
+3449	4534 1
+3449	4536 1
+3449	4547 1
+3449	4551 1
+3449	4574 1
+3449	4587 1
+3449	4600 1
+3449	4613 1
+3449	4631 1
+3449	4646 1
+3449	4653 1
+3449	4661 1
+3449	4662 1
+3449	4666 1
+3449	4687 1
+3449	4706 1
+3449	4712 1
+3449	4715 1
+3449	4717 1
+3449	4719 1
+3449	4735 1
+3449	4776 1
+3449	4777 1
+3449	4781 1
+3449	4792 1
+3449	4795 1
+3449	4796 1
+3449	4797 1
+3449	4798 1
+3449	4808 1
+3449	4811 1
+3449	4814 1
+3449	4820 1
+3449	4824 1
+3449	4827 1
+3449	4828 1
+3449	4846 1
+3449	4875 1
+3449	4929 1
+3449	4938 1
+3449	4953 1
+3449	4962 1
+3449	4964 1
+3449	4980 1
+3449	4986 1
+3449	4999 1
+3449	5020 1
+3449	5026 1
+3449	5044 1
+3449	5055 1
+3449	5058 1
+3449	5061 1
+3449	5072 1
+3449	5073 1
+3449	5083 1
+3449	5092 1
+3449	5100 1
+3449	5103 1
+3449	5106 1
+3449	5123 1
+3449	5130 1
+3449	5132 1
+3449	5144 1
+3449	5155 1
+3449	5162 1
+3449	5178 1
+3449	5179 1
+3449	5182 1
+3449	5189 1
+3449	5204 1
+3449	5215 1
+3449	5222 1
+3449	5226 1
+3449	5239 1
+3449	5262 1
+3449	5288 1
+3449	5301 1
+3449	5305 1
+3449	5327 1
+3449	5335 1
+3449	5341 1
+3449	5392 1
+3449	5404 1
+3449	5412 1
+3449	5415 1
+3449	5417 1
+3449	5423 1
+3449	5430 1
+3449	5432 1
+3449	5437 1
+3449	5439 1
+3449	5445 1
+3449	5449 1
+3449	5452 1
+3449	5454 1
+3449	5459 1
+3449	5463 1
+3449	5506 1
+3449	5509 1
+3449	5511 1
+3449	5524 1
+3449	5527 1
+3449	5539 1
+3449	5543 1
+3449	5545 1
+3449	5559 1
+3449	5568 1
+3449	5584 1
+3449	5624 1
+3449	5637 1
+3449	5638 1
+3449	5640 1
+3449	5650 1
+3449	5651 1
+3449	5680 1
+3449	5683 1
+3449	5684 1
+3449	5693 1
+3449	5732 1
+3449	5737 1
+3449	5743 1
+3449	5753 1
+3449	5775 1
+3449	5780 1
+3449	5790 1
+3449	5798 1
+3449	5804 1
+3449	5814 1
+3449	5828 1
+3449	5837 1
+3449	5844 1
+3449	5848 1
+3449	5850 1
+3449	5863 1
+3449	5886 1
+3449	5891 1
+3449	5925 1
+3449	5928 1
+3449	5936 1
+3449	5947 1
+3449	5973 1
+3449	5994 1
+3449	6006 1
+3449	6029 1
+3449	6098 1
+3449	6124 1
+3449	6164 1
+3449	6166 1
+3449	6218 1
+3449	6229 1
+3449	6246 1
+3449	6251 1
+3449	6262 1
+3449	6296 1
+3449	6306 1
+3449	6328 1
+3449	6337 1
+3449	6400 1
+3449	6432 1
+3449	6576 1
+3449	6869 1
+3449	7757 1
+3449	8295 1
+3450	1185 1
+3450	1688 1
+3450	1984 1
+3450	2144 1
+3450	2240 1
+3450	2760 1
+3450	2871 1
+3450	3014 1
+3450	3034 1
+3450	3140 1
+3450	3443 1
+3450	3454 1
+3450	3464 1
+3450	3557 1
+3450	3645 1
+3450	3812 1
+3450	3956 1
+3450	3958 1
+3450	3976 1
+3450	4011 1
+3450	4072 1
+3450	4528 1
+3450	4531 1
+3450	4578 1
+3450	4613 1
+3450	4646 1
+3450	5817 1
+3451	978 1
+3451	1140 1
+3451	1185 1
+3451	1360 1
+3451	1385 1
+3451	1729 1
+3451	1984 1
+3451	2066 1
+3451	2129 1
+3451	2144 1
+3451	2289 1
+3451	2326 1
+3451	2456 1
+3451	2506 1
+3451	2517 1
+3451	2565 1
+3451	2612 1
+3451	2653 1
+3451	2811 1
+3451	2871 1
+3451	2932 1
+3451	2958 1
+3451	2981 1
+3451	3014 1
+3451	3073 1
+3451	3140 1
+3451	3144 1
+3451	3309 1
+3451	3321 1
+3451	3346 1
+3451	3439 1
+3451	3453 1
+3451	3454 1
+3451	3460 1
+3451	3464 1
+3451	3635 1
+3451	3645 1
+3451	3660 1
+3451	3813 1
+3451	3835 1
+3451	3912 1
+3451	3956 1
+3451	3958 1
+3451	4040 1
+3451	4043 1
+3451	4055 1
+3451	4103 1
+3451	4110 1
+3451	4162 1
+3451	4179 1
+3451	4191 1
+3451	4201 1
+3451	4212 1
+3451	4216 1
+3451	4231 1
+3451	4234 1
+3451	4235 1
+3451	4254 1
+3451	4263 1
+3451	4266 1
+3451	4269 1
+3451	4289 1
+3451	4297 1
+3451	4311 1
+3451	4323 1
+3451	4331 1
+3451	4332 1
+3451	4335 1
+3451	4349 1
+3451	4365 1
+3451	4373 1
+3451	4384 1
+3451	4385 1
+3451	4386 1
+3451	4402 1
+3451	4403 1
+3451	4417 1
+3451	4422 1
+3451	4466 1
+3451	4471 1
+3451	4557 1
+3451	4661 1
+3451	4662 1
+3451	4666 1
+3451	4684 1
+3451	4735 1
+3451	4776 1
+3451	4778 1
+3451	4780 1
+3451	4796 1
+3451	4797 1
+3451	4808 1
+3451	4811 1
+3451	4822 1
+3451	4827 1
+3451	4831 1
+3451	4875 1
+3451	8294 1
+3452	15 1
+3452	737 1
+3452	762 1
+3452	896 1
+3452	1024 1
+3452	1305 1
+3452	1310 1
+3452	1360 1
+3452	1403 1
+3452	1473 1
+3452	1688 1
+3452	1769 1
+3452	1799 1
+3452	2237 1
+3452	2240 1
+3452	2328 1
+3452	2354 1
+3452	2381 1
+3452	2456 1
+3452	2516 1
+3452	2535 1
+3452	2565 1
+3452	2605 1
+3452	2696 1
+3452	2760 1
+3452	2765 1
+3452	2787 1
+3452	2790 1
+3452	2831 1
+3452	2871 1
+3452	3073 1
+3452	3092 1
+3452	3103 1
+3452	3125 1
+3452	3274 1
+3452	3321 1
+3452	3352 1
+3452	3417 1
+3452	3433 1
+3452	3439 1
+3452	3443 1
+3452	3447 1
+3452	3453 1
+3452	3455 1
+3452	3456 1
+3452	3464 1
+3452	3498 1
+3452	3537 1
+3452	3586 1
+3452	3635 1
+3452	3643 1
+3452	3748 1
+3452	3796 1
+3452	3812 1
+3452	3813 1
+3452	3854 1
+3452	3910 1
+3452	3958 1
+3452	4040 1
+3452	4099 1
+3452	4111 1
+3452	4124 1
+3452	4175 1
+3452	4179 1
+3452	4191 1
+3452	4201 1
+3452	4212 1
+3452	4266 1
+3452	4297 1
+3452	4298 1
+3452	4310 1
+3452	4349 1
+3452	4400 1
+3452	4402 1
+3452	4424 1
+3452	4480 1
+3452	4527 1
+3452	4528 1
+3452	4530 1
+3452	4534 1
+3452	4551 1
+3452	4588 1
+3452	4600 1
+3452	4653 1
+3452	4661 1
+3452	4706 1
+3452	4712 1
+3452	4719 1
+3452	4792 1
+3452	4811 1
+3452	4815 1
+3452	4827 1
+3452	4875 1
+3452	4929 1
+3452	4938 1
+3452	4942 1
+3452	4964 1
+3452	4987 1
+3452	4999 1
+3452	5020 1
+3452	5055 1
+3452	5061 1
+3452	5083 1
+3452	5092 1
+3452	5106 1
+3452	5121 1
+3452	5132 1
+3452	5155 1
+3452	5162 1
+3452	5178 1
+3452	5288 1
+3452	5301 1
+3452	5335 1
+3452	5375 1
+3452	5392 1
+3452	5412 1
+3452	5449 1
+3452	5454 1
+3452	5459 1
+3452	5539 1
+3452	5592 1
+3452	5620 1
+3452	5651 1
+3452	5693 1
+3452	5753 1
+3452	5790 1
+3452	5844 1
+3452	5947 1
+3452	5963 1
+3452	5994 1
+3452	6006 1
+3453	15 1
+3453	72 1
+3453	346 1
+3453	406 1
+3453	608 1
+3453	737 1
+3453	1024 1
+3453	1026 1
+3453	1185 1
+3453	1247 1
+3453	1305 1
+3453	1310 1
+3453	1360 1
+3453	1385 1
+3453	1473 1
+3453	1549 1
+3453	1680 1
+3453	1688 1
+3453	1733 1
+3453	1769 1
+3453	1799 1
+3453	1972 1
+3453	2001 1
+3453	2144 1
+3453	2145 1
+3453	2237 1
+3453	2240 1
+3453	2258 1
+3453	2326 1
+3453	2354 1
+3453	2364 1
+3453	2369 1
+3453	2381 1
+3453	2398 1
+3453	2433 1
+3453	2440 1
+3453	2456 1
+3453	2516 1
+3453	2517 1
+3453	2565 1
+3453	2576 1
+3453	2592 1
+3453	2605 1
+3453	2646 1
+3453	2689 1
+3453	2696 1
+3453	2760 1
+3453	2765 1
+3453	2775 1
+3453	2785 1
+3453	2790 1
+3453	2811 1
+3453	2822 1
+3453	2831 1
+3453	2871 1
+3453	2909 1
+3453	3002 1
+3453	3014 1
+3453	3027 1
+3453	3034 1
+3453	3073 1
+3453	3089 1
+3453	3092 1
+3453	3103 1
+3453	3106 1
+3453	3125 1
+3453	3140 1
+3453	3144 1
+3453	3238 1
+3453	3274 1
+3453	3284 1
+3453	3291 1
+3453	3309 1
+3453	3321 1
+3453	3334 1
+3453	3352 1
+3453	3393 1
+3453	3417 1
+3453	3433 1
+3453	3443 1
+3453	3447 1
+3453	3452 1
+3453	3454 1
+3453	3456 1
+3453	3459 1
+3453	3460 1
+3453	3464 1
+3453	3479 1
+3453	3537 1
+3453	3557 1
+3453	3568 1
+3453	3607 1
+3453	3635 1
+3453	3643 1
+3453	3691 1
+3453	3748 1
+3453	3796 1
+3453	3806 1
+3453	3812 1
+3453	3813 1
+3453	3835 1
+3453	3843 1
+3453	3854 1
+3453	3897 1
+3453	3898 1
+3453	3910 1
+3453	3911 1
+3453	3956 1
+3453	3958 1
+3453	4011 1
+3453	4037 1
+3453	4040 1
+3453	4041 1
+3453	4044 1
+3453	4065 1
+3453	4068 1
+3453	4072 1
+3453	4098 1
+3453	4099 1
+3453	4103 1
+3453	4124 1
+3453	4191 1
+3453	4212 1
+3453	4219 1
+3453	4261 1
+3453	4266 1
+3453	4297 1
+3453	4298 1
+3453	4299 1
+3453	4310 1
+3453	4315 1
+3453	4335 1
+3453	4338 1
+3453	4355 1
+3453	4400 1
+3453	4417 1
+3453	4448 1
+3453	4463 1
+3453	4466 1
+3453	4468 1
+3453	4482 1
+3453	4485 1
+3453	4488 1
+3453	4528 1
+3453	4530 1
+3453	4531 1
+3453	4536 1
+3453	4547 1
+3453	4551 1
+3453	4574 1
+3453	4578 1
+3453	4587 1
+3453	4600 1
+3453	4613 1
+3453	4653 1
+3453	4661 1
+3453	4662 1
+3453	4677 1
+3453	4678 1
+3453	4706 1
+3453	4709 1
+3453	4712 1
+3453	4717 1
+3453	4719 1
+3453	4728 1
+3453	4735 1
+3453	4748 1
+3453	4776 1
+3453	4792 1
+3453	4795 1
+3453	4796 1
+3453	4797 1
+3453	4808 1
+3453	4811 1
+3453	4814 1
+3453	4822 1
+3453	4824 1
+3453	4827 1
+3453	4828 1
+3453	4831 1
+3453	4875 1
+3453	4879 1
+3453	4880 1
+3453	4899 1
+3453	4929 1
+3453	4938 1
+3453	4962 1
+3453	4964 1
+3453	4980 1
+3453	4981 1
+3453	4983 1
+3453	4986 1
+3453	4999 1
+3453	5020 1
+3453	5022 1
+3453	5026 1
+3453	5028 1
+3453	5033 1
+3453	5044 1
+3453	5055 1
+3453	5058 1
+3453	5061 1
+3453	5072 1
+3453	5073 1
+3453	5079 1
+3453	5092 1
+3453	5100 1
+3453	5106 1
+3453	5130 1
+3453	5140 1
+3453	5141 1
+3453	5144 1
+3453	5162 1
+3453	5176 1
+3453	5178 1
+3453	5182 1
+3453	5188 1
+3453	5189 1
+3453	5200 1
+3453	5204 1
+3453	5208 1
+3453	5210 1
+3453	5215 1
+3453	5222 1
+3453	5226 1
+3453	5233 1
+3453	5239 1
+3453	5254 1
+3453	5263 1
+3453	5273 1
+3453	5306 1
+3453	5311 1
+3453	5323 1
+3453	5335 1
+3453	5341 1
+3453	5354 1
+3453	5375 1
+3453	5392 1
+3453	5393 1
+3453	5412 1
+3453	5415 1
+3453	5430 1
+3453	5445 1
+3453	5454 1
+3453	5457 1
+3453	5459 1
+3453	5463 1
+3453	5467 1
+3453	5471 1
+3453	5484 1
+3453	5506 1
+3453	5524 1
+3453	5539 1
+3453	5543 1
+3453	5605 1
+3453	5637 1
+3453	5638 1
+3453	5650 1
+3453	5651 1
+3453	5680 1
+3453	5693 1
+3453	5714 1
+3453	5721 1
+3453	5737 1
+3453	5739 1
+3453	5743 1
+3453	5775 1
+3453	5780 1
+3453	5784 1
+3453	5800 1
+3453	5802 1
+3453	5804 1
+3453	5811 1
+3453	5817 1
+3453	5822 1
+3453	5827 1
+3453	5829 1
+3453	5844 1
+3453	5871 1
+3453	5886 1
+3453	5891 1
+3453	5991 1
+3453	6006 1
+3453	6041 1
+3453	6054 1
+3453	6272 1
+3453	6296 1
+3453	6323 1
+3453	6347 1
+3453	6481 1
+3453	6496 1
+3453	6505 1
+3453	6528 1
+3453	6553 1
+3453	6554 1
+3453	6567 1
+3453	6571 1
+3453	6606 1
+3453	6663 1
+3453	6699 1
+3453	6724 1
+3453	6725 1
+3453	6770 1
+3453	6777 1
+3453	6805 1
+3453	6809 1
+3453	6826 1
+3453	6832 1
+3453	6875 1
+3453	6979 1
+3453	7225 1
+3453	7238 1
+3453	7553 1
+3453	7620 1
+3453	7624 1
+3453	7632 1
+3453	7908 1
+3453	8042 1
+3453	8128 1
+3454	608 1
+3454	737 1
+3454	762 1
+3454	825 1
+3454	1185 1
+3454	1239 1
+3454	1305 1
+3454	1307 1
+3454	1310 1
+3454	1385 1
+3454	1549 1
+3454	1688 1
+3454	1706 1
+3454	1729 1
+3454	1769 1
+3454	1984 1
+3454	1990 1
+3454	2014 1
+3454	2129 1
+3454	2134 1
+3454	2144 1
+3454	2210 1
+3454	2237 1
+3454	2289 1
+3454	2328 1
+3454	2384 1
+3454	2398 1
+3454	2456 1
+3454	2506 1
+3454	2517 1
+3454	2535 1
+3454	2565 1
+3454	2595 1
+3454	2612 1
+3454	2619 1
+3454	2653 1
+3454	2657 1
+3454	2693 1
+3454	2760 1
+3454	2775 1
+3454	2790 1
+3454	2811 1
+3454	2859 1
+3454	2871 1
+3454	2917 1
+3454	2932 1
+3454	2958 1
+3454	2981 1
+3454	3028 1
+3454	3084 1
+3454	3117 1
+3454	3125 1
+3454	3180 1
+3454	3260 1
+3454	3276 1
+3454	3313 1
+3454	3321 1
+3454	3334 1
+3454	3352 1
+3454	3394 1
+3454	3433 1
+3454	3439 1
+3454	3443 1
+3454	3447 1
+3454	3452 1
+3454	3455 1
+3454	3464 1
+3454	3537 1
+3454	3557 1
+3454	3568 1
+3454	3615 1
+3454	3635 1
+3454	3643 1
+3454	3645 1
+3454	3660 1
+3454	3680 1
+3454	3724 1
+3454	3806 1
+3454	3813 1
+3454	3843 1
+3454	3854 1
+3454	3887 1
+3454	3898 1
+3454	3912 1
+3454	3922 1
+3454	3926 1
+3454	3937 1
+3454	3956 1
+3454	3958 1
+3454	3976 1
+3454	4011 1
+3454	4013 1
+3454	4037 1
+3454	4040 1
+3454	4043 1
+3454	4044 1
+3454	4049 1
+3454	4058 1
+3454	4072 1
+3454	4103 1
+3454	4111 1
+3454	4124 1
+3454	4138 1
+3454	4162 1
+3454	4179 1
+3454	4188 1
+3454	4191 1
+3454	4212 1
+3454	4261 1
+3454	4263 1
+3454	4269 1
+3454	4289 1
+3454	4290 1
+3454	4297 1
+3454	4299 1
+3454	4311 1
+3454	4331 1
+3454	4335 1
+3454	4384 1
+3454	4412 1
+3454	4424 1
+3454	4463 1
+3454	4485 1
+3454	4510 1
+3454	4528 1
+3454	4531 1
+3454	4551 1
+3454	4557 1
+3454	4578 1
+3454	4613 1
+3454	4661 1
+3454	4662 1
+3454	4666 1
+3454	4719 1
+3454	4735 1
+3454	4796 1
+3454	4808 1
+3454	4811 1
+3454	4814 1
+3454	4822 1
+3454	4875 1
+3454	4938 1
+3454	4953 1
+3454	4999 1
+3454	5026 1
+3454	5055 1
+3454	8293 1
+3454	8294 1
+3455	1024 1
+3455	1185 1
+3455	1305 1
+3455	1310 1
+3455	1680 1
+3455	1769 1
+3455	2014 1
+3455	2144 1
+3455	2145 1
+3455	2326 1
+3455	2364 1
+3455	2516 1
+3455	2517 1
+3455	2696 1
+3455	2775 1
+3455	2787 1
+3455	2790 1
+3455	2871 1
+3455	3002 1
+3455	3034 1
+3455	3073 1
+3455	3276 1
+3455	3284 1
+3455	3321 1
+3455	3334 1
+3455	3433 1
+3455	3443 1
+3455	3447 1
+3455	3453 1
+3455	3460 1
+3455	3464 1
+3455	3537 1
+3455	3643 1
+3455	3748 1
+3455	3843 1
+3455	3898 1
+3455	3911 1
+3455	3958 1
+3455	4044 1
+3455	4072 1
+3455	4124 1
+3455	4189 1
+3455	4191 1
+3455	4212 1
+3455	4297 1
+3455	4547 1
+3455	4551 1
+3455	4588 1
+3455	4646 1
+3455	4661 1
+3455	4666 1
+3455	4735 1
+3455	4792 1
+3455	4797 1
+3455	4820 1
+3455	4828 1
+3455	4938 1
+3455	4942 1
+3455	4953 1
+3455	4962 1
+3455	4987 1
+3455	5026 1
+3455	5055 1
+3455	5073 1
+3455	5083 1
+3455	5092 1
+3455	5100 1
+3455	5817 1
+3456	15 1
+3456	608 1
+3456	737 1
+3456	1305 1
+3456	1310 1
+3456	1352 1
+3456	1360 1
+3456	1385 1
+3456	1498 1
+3456	1549 1
+3456	1688 1
+3456	1729 1
+3456	1769 1
+3456	1799 1
+3456	1961 1
+3456	1982 1
+3456	1990 1
+3456	2001 1
+3456	2014 1
+3456	2144 1
+3456	2145 1
+3456	2240 1
+3456	2276 1
+3456	2289 1
+3456	2328 1
+3456	2354 1
+3456	2364 1
+3456	2369 1
+3456	2381 1
+3456	2386 1
+3456	2398 1
+3456	2433 1
+3456	2440 1
+3456	2456 1
+3456	2516 1
+3456	2565 1
+3456	2576 1
+3456	2592 1
+3456	2612 1
+3456	2658 1
+3456	2689 1
+3456	2696 1
+3456	2760 1
+3456	2775 1
+3456	2787 1
+3456	2811 1
+3456	2822 1
+3456	2831 1
+3456	2871 1
+3456	3014 1
+3456	3027 1
+3456	3034 1
+3456	3089 1
+3456	3092 1
+3456	3103 1
+3456	3125 1
+3456	3140 1
+3456	3144 1
+3456	3192 1
+3456	3238 1
+3456	3274 1
+3456	3291 1
+3456	3321 1
+3456	3352 1
+3456	3417 1
+3456	3433 1
+3456	3439 1
+3456	3443 1
+3456	3447 1
+3456	3452 1
+3456	3453 1
+3456	3454 1
+3456	3458 1
+3456	3459 1
+3456	3460 1
+3456	3464 1
+3456	3498 1
+3456	3537 1
+3456	3568 1
+3456	3607 1
+3456	3635 1
+3456	3645 1
+3456	3660 1
+3456	3661 1
+3456	3664 1
+3456	3691 1
+3456	3748 1
+3456	3792 1
+3456	3796 1
+3456	3806 1
+3456	3812 1
+3456	3843 1
+3456	3873 1
+3456	3897 1
+3456	3910 1
+3456	3958 1
+3456	4011 1
+3456	4041 1
+3456	4044 1
+3456	4047 1
+3456	4072 1
+3456	4099 1
+3456	4124 1
+3456	4138 1
+3456	4191 1
+3456	4256 1
+3456	4263 1
+3456	4269 1
+3456	4289 1
+3456	4290 1
+3456	4297 1
+3456	4299 1
+3456	4310 1
+3456	4338 1
+3456	4351 1
+3456	4361 1
+3456	4384 1
+3456	4385 1
+3456	4400 1
+3456	4402 1
+3456	4417 1
+3456	4422 1
+3456	4424 1
+3456	4448 1
+3456	4453 1
+3456	4463 1
+3456	4483 1
+3456	4485 1
+3456	4510 1
+3456	4531 1
+3456	4536 1
+3456	4557 1
+3456	4574 1
+3456	4578 1
+3456	4587 1
+3456	4588 1
+3456	4600 1
+3456	4605 1
+3456	4613 1
+3456	4653 1
+3456	4706 1
+3456	4709 1
+3456	4712 1
+3456	4715 1
+3456	4719 1
+3456	4735 1
+3456	4792 1
+3456	4795 1
+3456	4798 1
+3456	4827 1
+3456	4828 1
+3456	4899 1
+3456	4929 1
+3456	4938 1
+3456	4962 1
+3456	4964 1
+3456	4980 1
+3456	4999 1
+3456	5002 1
+3456	5020 1
+3456	5026 1
+3456	5028 1
+3456	5033 1
+3456	5055 1
+3456	5079 1
+3456	5092 1
+3456	5100 1
+3456	5106 1
+3456	5123 1
+3456	5130 1
+3456	5132 1
+3456	5144 1
+3456	5155 1
+3456	5176 1
+3456	5178 1
+3456	5188 1
+3456	5200 1
+3456	5204 1
+3456	5210 1
+3456	5226 1
+3456	5246 1
+3456	5254 1
+3456	5295 1
+3456	5335 1
+3456	5412 1
+3456	5421 1
+3456	5430 1
+3456	5449 1
+3456	5459 1
+3456	5499 1
+3456	5524 1
+3456	5543 1
+3456	5596 1
+3456	5605 1
+3456	5639 1
+3456	5640 1
+3456	5684 1
+3456	5697 1
+3456	5714 1
+3456	5739 1
+3456	5743 1
+3456	5760 1
+3456	5775 1
+3456	5800 1
+3456	5822 1
+3456	5827 1
+3456	5828 1
+3456	5829 1
+3456	5839 1
+3456	5844 1
+3456	5848 1
+3456	5897 1
+3456	5902 1
+3456	5947 1
+3456	6098 1
+3456	6328 1
+3456	6337 1
+3456	6437 1
+3456	6458 1
+3456	6481 1
+3456	6496 1
+3456	6498 1
+3456	6523 1
+3456	6560 1
+3456	6595 1
+3456	6736 1
+3456	6832 1
+3456	6869 1
+3456	6907 1
+3456	7168 1
+3456	7214 1
+3456	7225 1
+3456	7393 1
+3456	7400 1
+3456	7414 1
+3456	7450 1
+3456	7553 1
+3456	7620 1
+3456	8174 1
+3456	8192 1
+3456	8295 1
+3457	608 1
+3457	896 1
+3457	1024 1
+3457	1157 1
+3457	1191 1
+3457	1297 1
+3457	1305 1
+3457	1360 1
+3457	1385 1
+3457	1498 1
+3457	1688 1
+3457	1706 1
+3457	1729 1
+3457	1799 1
+3457	1915 1
+3457	1972 1
+3457	2066 1
+3457	2114 1
+3457	2129 1
+3457	2144 1
+3457	2160 1
+3457	2257 1
+3457	2289 1
+3457	2326 1
+3457	2364 1
+3457	2369 1
+3457	2381 1
+3457	2398 1
+3457	2485 1
+3457	2516 1
+3457	2565 1
+3457	2612 1
+3457	2619 1
+3457	2654 1
+3457	2657 1
+3457	2686 1
+3457	2775 1
+3457	2787 1
+3457	2790 1
+3457	2799 1
+3457	2811 1
+3457	2822 1
+3457	2851 1
+3457	2871 1
+3457	2900 1
+3457	2923 1
+3457	3002 1
+3457	3027 1
+3457	3028 1
+3457	3073 1
+3457	3084 1
+3457	3092 1
+3457	3103 1
+3457	3117 1
+3457	3125 1
+3457	3140 1
+3457	3144 1
+3457	3192 1
+3457	3276 1
+3457	3297 1
+3457	3352 1
+3457	3404 1
+3457	3417 1
+3457	3433 1
+3457	3455 1
+3457	3461 1
+3457	3464 1
+3457	3537 1
+3457	3541 1
+3457	3547 1
+3457	3555 1
+3457	3568 1
+3457	3607 1
+3457	3609 1
+3457	3634 1
+3457	3650 1
+3457	3661 1
+3457	3680 1
+3457	3726 1
+3457	3785 1
+3457	3812 1
+3457	3843 1
+3457	3856 1
+3457	3871 1
+3457	3887 1
+3457	3892 1
+3457	3946 1
+3457	3970 1
+3457	3973 1
+3457	4124 1
+3457	4199 1
+3457	4290 1
+3457	4298 1
+3457	4315 1
+3457	4323 1
+3457	4335 1
+3457	4417 1
+3457	4422 1
+3457	4466 1
+3457	4468 1
+3457	4510 1
+3457	4529 1
+3457	4536 1
+3457	4552 1
+3457	4557 1
+3457	4558 1
+3457	4562 1
+3457	4583 1
+3457	4648 1
+3457	4706 1
+3457	4719 1
+3457	4778 1
+3457	4781 1
+3457	4815 1
+3457	4822 1
+3457	4827 1
+3457	4828 1
+3457	4875 1
+3457	4879 1
+3457	4938 1
+3457	4992 1
+3457	5026 1
+3457	5044 1
+3457	5073 1
+3457	5092 1
+3457	5115 1
+3457	5176 1
+3457	5179 1
+3457	5215 1
+3457	5239 1
+3457	5288 1
+3457	5289 1
+3457	5327 1
+3457	5341 1
+3457	5415 1
+3457	5426 1
+3457	5430 1
+3457	5432 1
+3457	5437 1
+3457	5467 1
+3457	5479 1
+3457	5500 1
+3457	5514 1
+3457	5527 1
+3457	5753 1
+3457	5800 1
+3457	5827 1
+3457	6004 1
+3457	6041 1
+3457	6123 1
+3457	6235 1
+3457	6505 1
+3457	6529 1
+3457	6543 1
+3457	6686 1
+3457	6833 1
+3457	6914 1
+3457	7115 1
+3457	7131 1
+3457	7237 1
+3457	7306 1
+3457	7400 1
+3457	7442 1
+3457	7478 1
+3457	7561 1
+3457	7587 1
+3458	15 1
+3458	737 1
+3458	896 1
+3458	1024 1
+3458	1473 1
+3458	1744 1
+3458	1984 1
+3458	2114 1
+3458	2257 1
+3458	2485 1
+3458	2508 1
+3458	2510 1
+3458	2654 1
+3458	2657 1
+3458	2686 1
+3458	2727 1
+3458	2871 1
+3458	2923 1
+3458	2958 1
+3458	3002 1
+3458	3005 1
+3458	3026 1
+3458	3191 1
+3458	3301 1
+3458	3447 1
+3458	3453 1
+3458	3454 1
+3458	3456 1
+3458	3464 1
+3458	3480 1
+3458	3498 1
+3458	3520 1
+3458	3529 1
+3458	3537 1
+3458	3586 1
+3458	3634 1
+3458	3843 1
+3458	3847 1
+3458	3873 1
+3458	3887 1
+3458	3892 1
+3458	3897 1
+3458	3903 1
+3458	3976 1
+3458	4041 1
+3458	4055 1
+3458	4162 1
+3458	4179 1
+3458	4338 1
+3458	4483 1
+3458	4547 1
+3458	4551 1
+3458	4795 1
+3458	4828 1
+3458	5002 1
+3458	5055 1
+3458	5073 1
+3458	5083 1
+3458	5412 1
+3458	5421 1
+3458	5499 1
+3458	5804 1
+3458	5897 1
+3458	5947 1
+3458	5963 1
+3458	6337 1
+3458	7618 1
+3458	7855 1
+3458	7961 1
+3459	15 1
+3459	896 1
+3459	1549 1
+3459	1799 1
+3459	2276 1
+3459	2398 1
+3459	2440 1
+3459	2516 1
+3459	2765 1
+3459	2925 1
+3459	3015 1
+3459	3027 1
+3459	3089 1
+3459	3103 1
+3459	3456 1
+3459	3464 1
+3459	3643 1
+3459	3830 1
+3459	3897 1
+3459	3898 1
+3459	3910 1
+3459	3976 1
+3459	4041 1
+3459	4099 1
+3459	4310 1
+3459	4355 1
+3459	4400 1
+3459	4448 1
+3459	4574 1
+3459	4600 1
+3459	4653 1
+3459	4712 1
+3459	4764 1
+3459	4875 1
+3459	4929 1
+3459	4986 1
+3459	5061 1
+3459	5103 1
+3459	5144 1
+3459	5155 1
+3459	5178 1
+3459	5199 1
+3459	5226 1
+3459	5254 1
+3459	5262 1
+3459	5301 1
+3459	5305 1
+3459	5321 1
+3459	5363 1
+3459	5393 1
+3459	5415 1
+3459	5437 1
+3459	5449 1
+3459	5484 1
+3459	5506 1
+3459	5524 1
+3459	5559 1
+3459	5596 1
+3459	5624 1
+3459	5635 1
+3459	5638 1
+3459	5739 1
+3459	5780 1
+3459	5809 1
+3459	5811 1
+3459	5830 1
+3459	5839 1
+3459	5844 1
+3459	5871 1
+3459	5886 1
+3459	5950 1
+3459	5980 1
+3459	6029 1
+3459	6078 1
+3459	6106 1
+3459	6124 1
+3459	6198 1
+3459	6221 1
+3459	6272 1
+3459	6299 1
+3459	6432 1
+3459	6441 1
+3459	6481 1
+3459	6576 1
+3459	6606 1
+3459	6665 1
+3459	6699 1
+3459	6832 1
+3459	6869 1
+3459	7116 1
+3459	7301 1
+3459	7809 1
+3460	2326 1
+3460	3238 1
+3460	3464 1
+3460	3830 1
+3460	4463 1
+3460	4662 1
+3460	4791 1
+3460	4875 1
+3460	5073 1
+3460	5083 1
+3460	5178 1
+3460	5210 1
+3460	5289 1
+3460	5596 1
+3460	5819 1
+3460	5829 1
+3460	6347 1
+3460	7131 1
+3460	7510 1
+3460	7855 1
+3460	7879 1
+3460	7908 1
+3461	72 1
+3461	222 1
+3461	1185 1
+3461	1247 1
+3461	1548 1
+3461	1984 1
+3461	2066 1
+3461	2144 1
+3461	2252 1
+3461	2277 1
+3461	2326 1
+3461	2398 1
+3461	2552 1
+3461	2760 1
+3461	2787 1
+3461	2811 1
+3461	2917 1
+3461	3034 1
+3461	3073 1
+3461	3089 1
+3461	3140 1
+3461	3271 1
+3461	3321 1
+3461	3447 1
+3461	3454 1
+3461	3455 1
+3461	3456 1
+3461	3464 1
+3461	3557 1
+3461	3607 1
+3461	3631 1
+3461	3643 1
+3461	3755 1
+3461	3796 1
+3461	3835 1
+3461	3898 1
+3461	3956 1
+3461	4011 1
+3461	4037 1
+3461	4040 1
+3461	4044 1
+3461	4055 1
+3461	4072 1
+3461	4098 1
+3461	4099 1
+3461	4110 1
+3461	4191 1
+3461	4256 1
+3461	4266 1
+3461	4269 1
+3461	4297 1
+3461	4335 1
+3461	4529 1
+3461	4536 1
+3461	4578 1
+3461	4587 1
+3461	4613 1
+3461	4625 1
+3461	4631 1
+3461	4646 1
+3461	4648 1
+3461	4650 1
+3461	4658 1
+3461	4666 1
+3461	4677 1
+3461	4678 1
+3461	4713 1
+3461	4777 1
+3461	4778 1
+3461	4779 1
+3461	4795 1
+3461	4808 1
+3461	4809 1
+3461	4811 1
+3461	4815 1
+3461	4828 1
+3461	4875 1
+3461	4964 1
+3461	4977 1
+3461	4986 1
+3461	5075 1
+3461	5189 1
+3461	5215 1
+3461	5321 1
+3461	5449 1
+3461	5452 1
+3461	5454 1
+3461	5457 1
+3461	5463 1
+3461	5539 1
+3461	5559 1
+3461	5563 1
+3461	5568 1
+3461	5592 1
+3461	5620 1
+3461	5651 1
+3461	5680 1
+3461	5683 1
+3461	5693 1
+3461	8295 1
+3461	8296 1
+3462	72 1
+3462	1157 1
+3462	1185 1
+3462	1305 1
+3462	1352 1
+3462	1473 1
+3462	1548 1
+3462	1984 1
+3462	2014 1
+3462	2144 1
+3462	2326 1
+3462	2354 1
+3462	2398 1
+3462	2456 1
+3462	2696 1
+3462	2760 1
+3462	2822 1
+3462	2871 1
+3462	3014 1
+3462	3192 1
+3462	3352 1
+3462	3433 1
+3462	3443 1
+3462	3464 1
+3462	3557 1
+3462	3956 1
+3462	3958 1
+3462	4011 1
+3462	4037 1
+3462	4040 1
+3462	4044 1
+3462	4072 1
+3462	4124 1
+3462	4189 1
+3462	4212 1
+3462	4266 1
+3462	4338 1
+3462	4466 1
+3462	4510 1
+3462	4613 1
+3462	4712 1
+3462	4776 1
+3462	4796 1
+3462	4811 1
+3462	4962 1
+3462	5254 1
+3462	5484 1
+3462	5511 1
+3462	5817 1
+3462	6156 1
+3462	6501 1
+3462	6632 1
+3462	6634 1
+3462	7478 1
+3463	1185 1
+3463	1360 1
+3463	1688 1
+3463	2592 1
+3463	2790 1
+3463	2811 1
+3463	2871 1
+3463	3014 1
+3463	3027 1
+3463	3034 1
+3463	3073 1
+3463	3106 1
+3463	3125 1
+3463	3140 1
+3463	3144 1
+3463	3321 1
+3463	3334 1
+3463	3352 1
+3463	3443 1
+3463	3454 1
+3463	3464 1
+3463	3635 1
+3463	3664 1
+3463	3748 1
+3463	3806 1
+3463	3812 1
+3463	3958 1
+3463	4011 1
+3463	4040 1
+3463	4072 1
+3463	4199 1
+3463	4212 1
+3463	4261 1
+3463	4266 1
+3463	4466 1
+3463	4485 1
+3463	4510 1
+3463	4528 1
+3463	4531 1
+3463	4551 1
+3463	4578 1
+3463	4613 1
+3463	4662 1
+3463	4706 1
+3463	4719 1
+3463	4735 1
+3463	4796 1
+3463	4808 1
+3463	4811 1
+3463	4814 1
+3463	4820 1
+3463	4827 1
+3463	5106 1
+3463	5204 1
+3463	5239 1
+3463	5817 1
+3465	3258 1
+3465	3459 1
+3465	5301 1
+3466	1166 1
+3466	1352 1
+3466	1549 1
+3466	2209 1
+3466	2535 1
+3466	3459 1
+3466	3473 1
+3466	3680 1
+3466	3969 1
+3466	4037 1
+3466	4735 1
+3466	4986 1
+3466	5020 1
+3466	5073 1
+3466	5301 1
+3466	6606 1
+3466	7088 1
+3467	3473 1
+3468	2324 1
+3468	3473 1
+3468	3489 1
+3469	737 1
+3469	825 1
+3469	1166 1
+3469	2535 1
+3469	2686 1
+3469	3028 1
+3469	3073 1
+3469	3084 1
+3469	3192 1
+3469	3433 1
+3469	3452 1
+3469	3473 1
+3469	3529 1
+3469	3567 1
+3469	3587 1
+3469	3615 1
+3469	3804 1
+3469	4201 1
+3469	4335 1
+3469	4485 1
+3469	4827 1
+3469	5844 1
+3469	6262 1
+3470	825 1
+3470	974 1
+3470	1166 1
+3470	1744 1
+3470	2209 1
+3470	2252 1
+3470	2597 1
+3470	2623 1
+3470	2654 1
+3470	2667 1
+3470	2674 1
+3470	2693 1
+3470	2973 1
+3470	3148 1
+3470	3173 1
+3470	3473 1
+3470	3489 1
+3470	3580 1
+3470	3587 1
+3470	3670 1
+3470	8293 1
+3472	1305 1
+3472	2237 1
+3472	2285 1
+3472	2440 1
+3472	2775 1
+3472	2811 1
+3472	3352 1
+3472	3460 1
+3472	3473 1
+3472	3635 1
+3472	4037 1
+3472	4534 1
+3472	4654 1
+3472	4999 1
+3472	5083 1
+3471	3473 1
+3471	4037 1
+3475	2790 1
+3479	72 1
+3479	1157 1
+3479	1166 1
+3479	1307 1
+3479	1729 1
+3479	1744 1
+3479	1990 1
+3479	2066 1
+3479	2134 1
+3479	2237 1
+3479	2328 1
+3479	2364 1
+3479	2369 1
+3479	2499 1
+3479	2516 1
+3479	2612 1
+3479	2619 1
+3479	2646 1
+3479	2653 1
+3479	2657 1
+3479	2667 1
+3479	2687 1
+3479	2932 1
+3479	2958 1
+3479	2981 1
+3479	3002 1
+3479	3005 1
+3479	3009 1
+3479	3027 1
+3479	3073 1
+3479	3084 1
+3479	3089 1
+3479	3125 1
+3479	3192 1
+3479	3276 1
+3479	3321 1
+3479	3334 1
+3479	3352 1
+3479	3417 1
+3479	3439 1
+3479	3456 1
+3479	3537 1
+3479	3538 1
+3479	3568 1
+3479	3580 1
+3479	3587 1
+3479	3615 1
+3479	3631 1
+3479	3661 1
+3479	3691 1
+3479	3748 1
+3479	3843 1
+3479	3958 1
+3479	4013 1
+3479	4037 1
+3479	4040 1
+3479	4041 1
+3479	4065 1
+3479	4138 1
+3479	4191 1
+3479	4233 1
+3479	4263 1
+3479	4269 1
+3479	4289 1
+3479	4299 1
+3479	4323 1
+3479	4332 1
+3479	4335 1
+3479	4351 1
+3479	4365 1
+3479	4385 1
+3479	4422 1
+3479	4480 1
+3479	4483 1
+3479	4485 1
+3479	4574 1
+3479	4600 1
+3479	4661 1
+3479	4662 1
+3479	4814 1
+3479	4827 1
+3479	4828 1
+3479	4875 1
+3479	4929 1
+3479	4938 1
+3479	4999 1
+3479	5130 1
+3479	5459 1
+3479	5482 1
+3479	5513 1
+3479	5637 1
+3479	5693 1
+3479	5732 1
+3479	5737 1
+3479	5743 1
+3479	5844 1
+3479	5872 1
+3479	5963 1
+3479	6098 1
+3479	6124 1
+3479	6218 1
+3479	6739 1
+3480	978 1
+3480	1915 1
+3480	2506 1
+3480	2654 1
+3480	2657 1
+3480	2660 1
+3480	2687 1
+3480	2727 1
+3480	2775 1
+3480	2973 1
+3480	3007 1
+3480	3352 1
+3480	3458 1
+3480	3541 1
+3480	3650 1
+3480	3681 1
+3480	4201 1
+3480	4735 1
+3481	1297 1
+3481	2290 1
+3481	2324 1
+3481	2485 1
+3481	2653 1
+3481	2660 1
+3481	2686 1
+3481	2687 1
+3481	2799 1
+3481	3059 1
+3481	3117 1
+3481	3480 1
+3481	3538 1
+3481	3737 1
+3481	3807 1
+3481	3867 1
+3481	3914 1
+3482	825 1
+3482	974 1
+3482	1100 1
+3482	1297 1
+3482	2209 1
+3482	2252 1
+3482	2257 1
+3482	2324 1
+3482	2485 1
+3482	2506 1
+3482	2597 1
+3482	2654 1
+3482	2667 1
+3482	2687 1
+3482	2973 1
+3482	2974 1
+3482	3010 1
+3482	3028 1
+3482	3114 1
+3482	3480 1
+3482	3769 1
+3482	3772 1
+3482	4191 1
+3482	4290 1
+3483	1247 1
+3483	1990 1
+3483	2144 1
+3483	2209 1
+3483	2654 1
+3483	2657 1
+3483	2674 1
+3483	2687 1
+3483	2831 1
+3483	3026 1
+3483	3276 1
+3483	3393 1
+3483	3417 1
+3483	3634 1
+3483	3897 1
+3483	5263 1
+3483	5430 1
+3483	5484 1
+3483	5545 1
+3483	6251 1
+3477	827 1
+3477	1706 1
+3477	2209 1
+3477	2210 1
+3477	2252 1
+3477	2257 1
+3477	2411 1
+3477	2485 1
+3477	2508 1
+3477	2510 1
+3477	2535 1
+3477	2565 1
+3477	2585 1
+3477	2595 1
+3477	2597 1
+3477	2619 1
+3477	2623 1
+3477	2653 1
+3477	2654 1
+3477	2674 1
+3477	2687 1
+3477	2727 1
+3477	2746 1
+3477	2747 1
+3477	3005 1
+3477	3010 1
+3477	3024 1
+3477	3117 1
+3477	3173 1
+3477	3260 1
+3477	3404 1
+3477	3506 1
+3477	3529 1
+3477	3557 1
+3477	3587 1
+3477	3646 1
+3477	3650 1
+3477	3681 1
+3477	3800 1
+3477	3812 1
+3477	3816 1
+3477	3843 1
+3477	3847 1
+3477	3937 1
+3477	3946 1
+3477	3967 1
+3477	3970 1
+3477	3971 1
+3477	3973 1
+3477	3980 1
+3477	4021 1
+3477	4024 1
+3477	8294 1
+3478	1159 1
+3478	1239 1
+3478	1297 1
+3478	1473 1
+3478	2001 1
+3478	2511 1
+3478	2687 1
+3478	2693 1
+3478	2775 1
+3478	3089 1
+3478	3394 1
+3478	3479 1
+3478	3586 1
+3478	3873 1
+3478	3958 1
+3478	4138 1
+3478	4179 1
+3478	4289 1
+3478	4338 1
+3478	4527 1
+3478	4781 1
+3478	4797 1
+3478	4828 1
+3478	5179 1
+3478	5226 1
+3478	5288 1
+3478	5335 1
+3478	5454 1
+3478	5543 1
+3478	5732 1
+3478	5775 1
+3478	5799 1
+3478	5814 1
+3478	5829 1
+3478	5850 1
+3478	5994 1
+3478	6006 1
+3478	6124 1
+3478	6227 1
+3478	6458 1
+3478	6918 1
+3478	7115 1
+3487	3489 1
+3488	465 1
+3488	608 1
+3488	1157 1
+3488	1473 1
+3488	1706 1
+3488	2066 1
+3488	2328 1
+3488	2506 1
+3488	2655 1
+3488	3084 1
+3488	3117 1
+3488	3489 1
+3488	3892 1
+3488	3967 1
+3488	4055 1
+3488	4365 1
+3492	2285 1
+3492	5814 1
+3492	8293 1
+3493	8293 1
+3490	3321 1
+3490	8293 1
+3494	8293 1
+3495	2285 1
+3495	5375 1
+3495	8293 1
+3427	8293 1
+3496	2144 1
+3496	2542 1
+3496	2623 1
+3496	2660 1
+3496	2859 1
+3496	3258 1
+3496	3562 1
+3496	4485 1
+3496	4531 1
+3496	8293 1
+3491	2285 1
+3491	8293 1
+2524	1688 1
+2524	2508 1
+2524	2693 1
+2524	3946 1
+2524	5246 1
+2524	7803 1
+2524	8293 1
+3497	8293 1
+3498	346 1
+3498	608 1
+3498	737 1
+3498	896 1
+3498	1385 1
+3498	1473 1
+3498	1571 1
+3498	1799 1
+3498	2001 1
+3498	2237 1
+3498	2290 1
+3498	2326 1
+3498	2381 1
+3498	2398 1
+3498	2456 1
+3498	2490 1
+3498	2516 1
+3498	2535 1
+3498	2605 1
+3498	2775 1
+3498	2909 1
+3498	3014 1
+3498	3015 1
+3498	3089 1
+3498	3180 1
+3498	3238 1
+3498	3297 1
+3498	3309 1
+3498	3352 1
+3498	3393 1
+3498	3443 1
+3498	3452 1
+3498	3456 1
+3498	3460 1
+3498	3586 1
+3498	3631 1
+3498	3755 1
+3498	3796 1
+3498	3835 1
+3498	3897 1
+3498	3910 1
+3498	3969 1
+3498	4037 1
+3498	4040 1
+3498	4099 1
+3498	4335 1
+3498	4448 1
+3498	4530 1
+3498	4534 1
+3498	4536 1
+3498	4587 1
+3498	4600 1
+3498	4653 1
+3498	4666 1
+3498	4712 1
+3498	4735 1
+3498	4811 1
+3498	4846 1
+3498	4899 1
+3498	4953 1
+3498	4977 1
+3498	4986 1
+3498	5022 1
+3498	5061 1
+3498	5072 1
+3498	5155 1
+3498	5189 1
+3498	5254 1
+3498	5285 1
+3498	5412 1
+3498	5423 1
+3498	5449 1
+3498	5452 1
+3498	5454 1
+3498	5459 1
+3498	5463 1
+3498	5482 1
+3498	5509 1
+3498	5524 1
+3498	5527 1
+3498	5637 1
+3498	5651 1
+3498	5683 1
+3498	5693 1
+3498	5721 1
+3498	5743 1
+3498	5753 1
+3498	5780 1
+3498	5790 1
+3498	5828 1
+3498	5837 1
+3498	5844 1
+3498	5863 1
+3498	5902 1
+3498	5936 1
+3498	5991 1
+3498	5994 1
+3498	6098 1
+3498	6299 1
+3498	6328 1
+3498	6918 1
+3498	7054 1
+3498	7478 1
+3498	7553 1
+3498	7587 1
+3498	7632 1
+3498	7726 1
+3498	7882 1
+3498	7961 1
+3498	8044 1
+3498	8083 1
+3498	8178 1
+3498	8293 1
+3498	8294 1
+3499	2285 1
+3499	7803 1
+3499	8293 1
+3500	8293 1
+3504	2623 1
+3509	2542 1
+3510	3516 1
+3515	3516 1
+3515	3538 1
+3515	3587 1
+3511	3516 1
+3512	1706 1
+3512	2209 1
+3512	2328 1
+3512	2485 1
+3512	2510 1
+3512	2653 1
+3512	2799 1
+3512	2981 1
+3512	3516 1
+3513	204 1
+3513	2660 1
+3513	3009 1
+3513	3516 1
+3514	3516 1
+3518	1297 1
+3518	2398 1
+3518	2657 1
+3518	3005 1
+3518	3720 1
+3518	8294 1
+3519	737 1
+3519	1549 1
+3519	2134 1
+3519	2145 1
+3519	2237 1
+3519	2328 1
+3519	2398 1
+3519	2485 1
+3519	2516 1
+3519	2565 1
+3519	2576 1
+3519	2585 1
+3519	2595 1
+3519	2619 1
+3519	2657 1
+3519	2686 1
+3519	2693 1
+3519	2746 1
+3519	2831 1
+3519	2871 1
+3519	3007 1
+3519	3024 1
+3519	3026 1
+3519	3028 1
+3519	3084 1
+3519	3092 1
+3519	3117 1
+3519	3258 1
+3519	3291 1
+3519	3352 1
+3519	3443 1
+3519	3456 1
+3519	3529 1
+3519	3568 1
+3519	3615 1
+3519	3661 1
+3519	3796 1
+3519	3800 1
+3519	3892 1
+3519	4191 1
+3519	4247 1
+3519	4263 1
+3519	4400 1
+3519	4448 1
+3519	4587 1
+3519	4600 1
+3519	5144 1
+3519	5459 1
+3520	3529 1
+3521	15 1
+3521	825 1
+3521	2066 1
+3521	2328 1
+3521	2485 1
+3521	2535 1
+3521	2790 1
+3521	2940 1
+3521	3005 1
+3521	3117 1
+3521	3125 1
+3521	3258 1
+3521	3291 1
+3521	3334 1
+3521	3443 1
+3521	3498 1
+3521	3529 1
+3521	3568 1
+3521	3969 1
+3521	4384 1
+3521	4453 1
+3521	4482 1
+3521	4485 1
+3521	4735 1
+3521	5844 1
+3521	5886 1
+3521	6328 1
+3521	7632 1
+3521	7757 1
+3522	15 1
+3522	2001 1
+3522	2134 1
+3522	2328 1
+3522	2364 1
+3522	2384 1
+3522	2398 1
+3522	2565 1
+3522	2851 1
+3522	2958 1
+3522	3192 1
+3522	3291 1
+3522	3334 1
+3522	3393 1
+3522	3394 1
+3522	3447 1
+3522	3453 1
+3522	3455 1
+3522	3456 1
+3522	3529 1
+3522	3554 1
+3522	3557 1
+3522	3650 1
+3522	3691 1
+3522	3806 1
+3522	3910 1
+3522	3976 1
+3522	4044 1
+3522	4124 1
+3522	4441 1
+3522	4510 1
+3522	4551 1
+3522	4552 1
+3522	4558 1
+3522	4584 1
+3522	4620 1
+3522	4631 1
+3522	4661 1
+3522	4824 1
+3522	4831 1
+3522	4875 1
+3522	5020 1
+3522	5073 1
+3522	5179 1
+3522	5233 1
+3522	5254 1
+3522	5305 1
+3522	5375 1
+3522	5454 1
+3522	5457 1
+3522	5511 1
+3522	5543 1
+3522	5630 1
+3522	5639 1
+3522	5640 1
+3522	5683 1
+3522	5697 1
+3522	5790 1
+3522	5818 1
+3522	5902 1
+3522	5963 1
+3522	5994 1
+3522	6124 1
+3522	6148 1
+3522	6246 1
+3522	6306 1
+3522	6327 1
+3522	6553 1
+3522	6634 1
+3522	6770 1
+3522	7225 1
+3523	1100 1
+3523	1297 1
+3523	1744 1
+3523	1915 1
+3523	2257 1
+3523	2324 1
+3523	2411 1
+3523	2485 1
+3523	2510 1
+3523	2654 1
+3523	2657 1
+3523	2693 1
+3523	2727 1
+3523	2747 1
+3523	2973 1
+3523	3005 1
+3523	3010 1
+3523	3109 1
+3523	3114 1
+3523	3148 1
+3523	3520 1
+3523	3529 1
+3523	3670 1
+3523	3681 1
+3523	3769 1
+3523	3776 1
+3523	3804 1
+3523	3807 1
+3524	3529 1
+3525	1297 1
+3525	1935 1
+3525	2114 1
+3525	2510 1
+3525	2657 1
+3525	2923 1
+3525	3005 1
+3525	3059 1
+3525	3200 1
+3525	3404 1
+3525	3529 1
+3525	3541 1
+3525	3680 1
+3525	3772 1
+3525	3807 1
+3525	6855 1
+3526	1706 1
+3526	2411 1
+3526	2485 1
+3526	2654 1
+3526	3529 1
+3526	3887 1
+3527	465 1
+3527	608 1
+3527	778 1
+3527	827 1
+3527	840 1
+3527	1297 1
+3527	1403 1
+3527	1453 1
+3527	1706 1
+3527	1777 1
+3527	1915 1
+3527	2114 1
+3527	2257 1
+3527	2411 1
+3527	2485 1
+3527	2508 1
+3527	2544 1
+3527	2565 1
+3527	2585 1
+3527	2619 1
+3527	2657 1
+3527	2686 1
+3527	2727 1
+3527	2785 1
+3527	3007 1
+3527	3010 1
+3527	3024 1
+3527	3026 1
+3527	3028 1
+3527	3059 1
+3527	3084 1
+3527	3117 1
+3527	3200 1
+3527	3260 1
+3527	3352 1
+3527	3480 1
+3527	3483 1
+3527	3529 1
+3527	3576 1
+3527	3631 1
+3527	3646 1
+3527	3650 1
+3527	3772 1
+3527	3803 1
+3527	3804 1
+3527	3812 1
+3527	3822 1
+3527	3871 1
+3527	3887 1
+3527	3892 1
+3527	3893 1
+3527	3903 1
+3527	3926 1
+3527	3933 1
+3527	3937 1
+3527	3946 1
+3527	3967 1
+3527	5012 1
+3527	5288 1
+3527	5484 1
+3527	6560 1
+3527	6994 1
+3527	7108 1
+3527	7214 1
+3386	204 1
+3386	974 1
+3386	1166 1
+3386	2066 1
+3386	2398 1
+3386	3005 1
+3386	3028 1
+3386	3089 1
+3386	3117 1
+3386	3456 1
+3386	3892 1
+3386	5100 1
+3530	204 1
+3530	2660 1
+3530	4349 1
+3531	2290 1
+3532	2290 1
+3532	2727 1
+3532	2747 1
+3532	2974 1
+3532	3548 1
+3535	2016 1
+3535	2653 1
+3535	4994 1
+3535	6148 1
+3535	6437 1
+3536	417 1
+3536	2016 1
+3536	2660 1
+3536	2667 1
+3536	2799 1
+3536	3520 1
+3538	4687 1
+3538	6720 1
+3539	2508 1
+3539	2660 1
+3540	2595 1
+3540	2660 1
+3540	3717 1
+3540	4349 1
+3541	762 1
+3541	825 1
+3541	1239 1
+3541	1453 1
+3541	1915 1
+3541	1935 1
+3541	2066 1
+3541	2114 1
+3541	2145 1
+3541	2210 1
+3541	2307 1
+3541	2506 1
+3541	2508 1
+3541	2544 1
+3541	2565 1
+3541	2585 1
+3541	2595 1
+3541	2646 1
+3541	2653 1
+3541	2655 1
+3541	2657 1
+3541	2660 1
+3541	2667 1
+3541	2686 1
+3541	2727 1
+3541	2746 1
+3541	2859 1
+3541	2900 1
+3541	2923 1
+3541	2958 1
+3541	3005 1
+3541	3007 1
+3541	3026 1
+3541	3028 1
+3541	3059 1
+3541	3084 1
+3541	3117 1
+3541	3200 1
+3541	3260 1
+3541	3276 1
+3541	3394 1
+3541	3404 1
+3541	3454 1
+3541	3480 1
+3541	3562 1
+3541	3576 1
+3541	3616 1
+3541	3645 1
+3541	3650 1
+3541	3680 1
+3541	3803 1
+3541	3807 1
+3541	3809 1
+3541	3812 1
+3541	3847 1
+3541	3849 1
+3541	3871 1
+3541	3887 1
+3541	3888 1
+3541	3892 1
+3541	3893 1
+3541	3903 1
+3541	3922 1
+3541	3926 1
+3541	3933 1
+3541	3937 1
+3541	3942 1
+3541	3967 1
+3541	4011 1
+3541	4021 1
+3541	4024 1
+3541	4049 1
+3541	4055 1
+3541	4110 1
+3541	4162 1
+3541	4179 1
+3541	4191 1
+3541	4256 1
+3541	4417 1
+3541	4424 1
+3541	4578 1
+3542	2485 1
+3542	2660 1
+3542	3453 1
+3542	4011 1
+3542	5058 1
+3543	2657 1
+3543	2660 1
+3543	3548 1
+3508	417 1
+3508	1166 1
+3508	1297 1
+3508	2328 1
+3508	2535 1
+3508	2660 1
+3508	2900 1
+3508	3026 1
+3508	3680 1
+3508	4735 1
+3508	6496 1
+3544	2657 1
+3544	2660 1
+3544	2799 1
+3544	3276 1
+3544	3609 1
+3544	3646 1
+3544	3937 1
+3545	2660 1
+3545	7890 1
+3550	417 1
+3551	417 1
+3552	417 1
+3553	417 1
+3553	2252 1
+3553	2597 1
+3553	2653 1
+3553	2654 1
+3553	3276 1
+3553	3587 1
+3553	3670 1
+3554	15 1
+3554	2958 1
+3554	3009 1
+3554	4373 1
+3554	5705 1
+3554	7839 1
+3555	465 1
+3555	1935 1
+3555	2324 1
+3555	2328 1
+3555	2667 1
+3555	2693 1
+3555	2746 1
+3555	2973 1
+3555	3009 1
+3555	3024 1
+3555	3026 1
+3555	3537 1
+3555	3887 1
+3555	3892 1
+3556	1680 1
+3556	1915 1
+3556	2114 1
+3556	2686 1
+3556	2727 1
+3556	3200 1
+3556	3276 1
+3556	3541 1
+3556	3680 1
+3556	3804 1
+3556	3807 1
+3556	3892 1
+3556	5204 1
+3556	5222 1
+3557	2257 1
+3557	2799 1
+3557	3028 1
+3557	3084 1
+3557	3615 1
+3557	3645 1
+3557	3871 1
+3557	4199 1
+3557	4558 1
+3557	4562 1
+3558	2799 1
+3560	1297 1
+3560	2516 1
+3560	2565 1
+3560	2597 1
+3560	2653 1
+3560	2667 1
+3560	2923 1
+3560	3125 1
+3560	3320 1
+3560	3803 1
+3560	3843 1
+3560	4299 1
+3560	4402 1
+3560	4463 1
+3560	4481 1
+3560	4485 1
+3561	1935 1
+3561	2667 1
+3561	3562 1
+3561	3856 1
+3562	465 1
+3562	825 1
+3562	974 1
+3562	1166 1
+3562	1297 1
+3562	1549 1
+3562	1935 1
+3562	1990 1
+3562	2066 1
+3562	2210 1
+3562	2328 1
+3562	2506 1
+3562	2585 1
+3562	2619 1
+3562	2657 1
+3562	2667 1
+3562	2674 1
+3562	2727 1
+3562	2746 1
+3562	2958 1
+3562	2973 1
+3562	3005 1
+3562	3024 1
+3562	3260 1
+3562	3537 1
+3562	3541 1
+3562	3580 1
+3562	3650 1
+3562	3800 1
+3562	3807 1
+3562	3822 1
+3562	3892 1
+3562	3970 1
+3562	4021 1
+3562	4124 1
+3562	4191 1
+3562	4256 1
+3562	6832 1
+3562	7632 1
+3562	8294 1
+3563	2667 1
+3563	4341 1
+3563	5479 1
+3564	2667 1
+3564	3480 1
+3565	2667 1
+3566	2667 1
+3567	2324 1
+3567	2384 1
+3567	2485 1
+3567	2565 1
+3567	2595 1
+3567	2619 1
+3567	2654 1
+3567	2657 1
+3567	2667 1
+3567	2981 1
+3567	3148 1
+3567	3670 1
+3567	3671 1
+3567	3680 1
+3567	3717 1
+3567	4043 1
+3567	4335 1
+3567	4929 1
+3568	15 1
+3568	608 1
+3568	737 1
+3568	825 1
+3568	827 1
+3568	1185 1
+3568	1239 1
+3568	1307 1
+3568	1453 1
+3568	1688 1
+3568	1990 1
+3568	2066 1
+3568	2134 1
+3568	2257 1
+3568	2328 1
+3568	2384 1
+3568	2398 1
+3568	2485 1
+3568	2506 1
+3568	2516 1
+3568	2576 1
+3568	2585 1
+3568	2612 1
+3568	2653 1
+3568	2657 1
+3568	2760 1
+3568	2822 1
+3568	2831 1
+3568	2859 1
+3568	2871 1
+3568	2900 1
+3568	2932 1
+3568	2958 1
+3568	2981 1
+3568	3010 1
+3568	3015 1
+3568	3103 1
+3568	3114 1
+3568	3125 1
+3568	3192 1
+3568	3258 1
+3568	3321 1
+3568	3334 1
+3568	3352 1
+3568	3394 1
+3568	3417 1
+3568	3439 1
+3568	3443 1
+3568	3454 1
+3568	3456 1
+3568	3460 1
+3568	3463 1
+3568	3479 1
+3568	3537 1
+3568	3557 1
+3568	3562 1
+3568	3615 1
+3568	3635 1
+3568	3645 1
+3568	3660 1
+3568	3661 1
+3568	3720 1
+3568	3787 1
+3568	3796 1
+3568	3800 1
+3568	3812 1
+3568	3813 1
+3568	3843 1
+3568	3897 1
+3568	3910 1
+3568	3946 1
+3568	3949 1
+3568	3970 1
+3568	3973 1
+3568	4011 1
+3568	4013 1
+3568	4021 1
+3568	4030 1
+3568	4040 1
+3568	4043 1
+3568	4047 1
+3568	4049 1
+3568	4051 1
+3568	4055 1
+3568	4072 1
+3568	4078 1
+3568	4088 1
+3568	4098 1
+3568	4103 1
+3568	4110 1
+3568	4124 1
+3568	4138 1
+3568	4162 1
+3568	4171 1
+3568	4173 1
+3568	4179 1
+3568	4189 1
+3568	4191 1
+3568	4201 1
+3568	4233 1
+3568	4235 1
+3568	4256 1
+3568	4261 1
+3568	4263 1
+3568	4265 1
+3568	4269 1
+3568	4289 1
+3568	4297 1
+3568	4299 1
+3568	4323 1
+3568	4335 1
+3568	4373 1
+3568	4417 1
+3568	4448 1
+3568	4483 1
+3568	4530 1
+3568	4536 1
+3568	4547 1
+3568	4551 1
+3568	4578 1
+3568	4605 1
+3568	4653 1
+3568	4662 1
+3568	4706 1
+3568	4712 1
+3568	4735 1
+3568	4811 1
+3568	4953 1
+3568	4999 1
+3568	5130 1
+3568	5146 1
+3568	5176 1
+3568	5200 1
+3568	5254 1
+3568	5262 1
+3568	5404 1
+3568	5459 1
+3568	5484 1
+3568	5509 1
+3568	5620 1
+3568	5757 1
+3568	5844 1
+3568	5848 1
+3568	5863 1
+3568	5928 1
+3568	6162 1
+3568	8294 1
+3569	1297 1
+3569	1453 1
+3569	1549 1
+3569	1777 1
+3569	2114 1
+3569	2210 1
+3569	2485 1
+3569	2508 1
+3569	2565 1
+3569	2653 1
+3569	2654 1
+3569	2657 1
+3569	2693 1
+3569	2747 1
+3569	2900 1
+3569	3026 1
+3569	3059 1
+3569	3148 1
+3569	3173 1
+3569	3200 1
+3569	3352 1
+3569	3537 1
+3569	3541 1
+3569	3557 1
+3569	3580 1
+3569	3646 1
+3569	3650 1
+3569	3680 1
+3569	3720 1
+3569	3803 1
+3569	3804 1
+3569	3807 1
+3569	3871 1
+3569	3926 1
+3569	3937 1
+3569	3946 1
+3569	4021 1
+3569	4043 1
+3569	4653 1
+3569	5484 1
+3569	5814 1
+3569	6347 1
+3576	2252 1
+3576	3026 1
+3576	3970 1
+3576	6855 1
+3577	2252 1
+3579	3580 1
+3579	4181 1
+3578	3580 1
+3578	3708 1
+3587	1026 1
+3587	1166 1
+3587	2324 1
+3587	2674 1
+3587	3459 1
+3587	4488 1
+3587	5022 1
+3587	6328 1
+3587	6388 1
+3587	6850 1
+3587	6855 1
+3587	6869 1
+3587	7567 1
+3587	7708 1
+3587	8178 1
+3581	3587 1
+3582	3587 1
+3583	1915 1
+3583	2657 1
+3583	2747 1
+3583	3587 1
+3584	3587 1
+3585	3587 1
+3585	6505 1
+3586	155 1
+3586	1026 1
+3586	2160 1
+3586	2658 1
+3586	2774 1
+3586	2940 1
+3586	3084 1
+3586	3238 1
+3586	3291 1
+3586	3293 1
+3586	3334 1
+3586	3498 1
+3586	3587 1
+3586	3634 1
+3586	3770 1
+3586	3830 1
+3586	3873 1
+3586	3897 1
+3586	3962 1
+3586	4037 1
+3586	4065 1
+3586	4099 1
+3586	4218 1
+3586	4310 1
+3586	4401 1
+3586	4435 1
+3586	4441 1
+3586	4483 1
+3586	4632 1
+3586	4687 1
+3586	4709 1
+3586	4712 1
+3586	4748 1
+3586	4795 1
+3586	4828 1
+3586	4875 1
+3586	4981 1
+3586	4994 1
+3586	5020 1
+3586	5022 1
+3586	5037 1
+3586	5079 1
+3586	5103 1
+3586	5123 1
+3586	5178 1
+3586	5188 1
+3586	5199 1
+3586	5200 1
+3586	5210 1
+3586	5254 1
+3586	5298 1
+3586	5335 1
+3586	5423 1
+3586	5479 1
+3586	5484 1
+3586	5524 1
+3586	5527 1
+3586	5543 1
+3586	5563 1
+3586	5605 1
+3586	5624 1
+3586	5638 1
+3586	5684 1
+3586	5714 1
+3586	5739 1
+3586	5753 1
+3586	5760 1
+3586	5799 1
+3586	5800 1
+3586	5804 1
+3586	5806 1
+3586	5811 1
+3586	5814 1
+3586	5819 1
+3586	5827 1
+3586	5839 1
+3586	5872 1
+3586	5886 1
+3586	5902 1
+3586	5972 1
+3586	5980 1
+3586	6032 1
+3586	6043 1
+3586	6044 1
+3586	6123 1
+3586	6226 1
+3586	6227 1
+3586	6251 1
+3586	6270 1
+3586	6272 1
+3586	6296 1
+3586	6311 1
+3586	6327 1
+3586	6344 1
+3586	6407 1
+3586	6414 1
+3586	6427 1
+3586	6464 1
+3586	6481 1
+3586	6501 1
+3586	6505 1
+3586	6555 1
+3586	6613 1
+3586	6665 1
+3586	6680 1
+3586	6715 1
+3586	6770 1
+3586	6780 1
+3586	6784 1
+3586	6832 1
+3586	6833 1
+3586	6875 1
+3586	6907 1
+3586	6913 1
+3586	6914 1
+3586	6930 1
+3586	6934 1
+3586	6942 1
+3586	6976 1
+3586	6979 1
+3586	7012 1
+3586	7021 1
+3586	7050 1
+3586	7063 1
+3586	7092 1
+3586	7110 1
+3586	7119 1
+3586	7143 1
+3586	7144 1
+3586	7168 1
+3586	7185 1
+3586	7237 1
+3586	7301 1
+3586	7351 1
+3586	7381 1
+3586	7400 1
+3586	7414 1
+3586	7436 1
+3586	7553 1
+3586	7587 1
+3586	7632 1
+3586	7651 1
+3586	7662 1
+3586	7726 1
+3586	7795 1
+3586	7809 1
+3586	7835 1
+3586	7874 1
+3586	7921 1
+3586	7961 1
+3586	7979 1
+3586	8042 1
+3586	8051 1
+3586	8121 1
+3586	8128 1
+3586	8295 1
+3589	2510 1
+3589	2657 1
+3589	2923 1
+3589	3276 1
+3589	3681 1
+3528	1166 1
+3528	1297 1
+3528	2257 1
+3528	2411 1
+3528	2565 1
+3528	2654 1
+3528	2923 1
+3528	2973 1
+3528	3024 1
+3528	3276 1
+3528	3737 1
+3528	3745 1
+3528	3804 1
+3591	2517 1
+3591	2787 1
+3591	3014 1
+3591	3334 1
+3591	3352 1
+3591	3454 1
+3591	3568 1
+3591	3615 1
+3591	3645 1
+3591	4299 1
+3591	4480 1
+3591	4578 1
+3591	8294 1
+3590	3591 1
+3593	554 1
+3593	1403 1
+3593	1961 1
+3593	2237 1
+3593	2354 1
+3593	2654 1
+3593	2822 1
+3593	2851 1
+3593	3456 1
+3593	3726 1
+3593	3803 1
+3593	4037 1
+3593	4247 1
+3593	4884 1
+3593	4999 1
+3593	5384 1
+3593	5404 1
+3593	5452 1
+3593	5680 1
+3593	5776 1
+3593	5848 1
+3593	6736 1
+3593	7101 1
+3593	7115 1
+3593	7143 1
+3593	7144 1
+3594	554 1
+3594	2384 1
+3598	2354 1
+3598	2654 1
+3598	3173 1
+3598	3192 1
+3595	3173 1
+3595	3537 1
+3599	3173 1
+3600	1166 1
+3600	2674 1
+3600	3173 1
+3600	3650 1
+3600	4219 1
+3600	5430 1
+3600	5811 1
+3600	6123 1
+3600	6417 1
+3600	6946 1
+3600	7279 1
+3600	7478 1
+3601	15 1
+3601	346 1
+3601	737 1
+3601	974 1
+3601	1026 1
+3601	1799 1
+3601	2001 1
+3601	2276 1
+3601	2324 1
+3601	2369 1
+3601	2398 1
+3601	2657 1
+3601	2696 1
+3601	2774 1
+3601	3027 1
+3601	3089 1
+3601	3173 1
+3601	3334 1
+3601	3459 1
+3601	3645 1
+3601	3646 1
+3601	3748 1
+3601	3785 1
+3601	3830 1
+3601	3897 1
+3601	3958 1
+3601	4037 1
+3601	4138 1
+3601	4191 1
+3601	4216 1
+3601	4297 1
+3601	4310 1
+3601	4400 1
+3601	4530 1
+3601	4578 1
+3601	4795 1
+3601	4797 1
+3601	4820 1
+3601	4977 1
+3601	5189 1
+3601	5392 1
+3601	5412 1
+3601	5680 1
+3601	5721 1
+3601	5732 1
+3601	5737 1
+3601	5743 1
+3601	6156 1
+3601	6251 1
+3601	7620 1
+3601	7632 1
+3601	7699 1
+3596	3173 1
+3597	2066 1
+3597	2328 1
+3597	2485 1
+3597	2565 1
+3597	2696 1
+3597	2747 1
+3597	3010 1
+3597	3026 1
+3597	3059 1
+3597	3173 1
+3597	3192 1
+3597	3404 1
+3597	3681 1
+3602	1166 1
+3603	1166 1
+3603	1305 1
+3603	1310 1
+3603	2237 1
+3603	2917 1
+3603	3002 1
+3603	3433 1
+3603	3803 1
+3603	4044 1
+3603	4189 1
+3603	4792 1
+3603	5254 1
+3605	974 1
+3606	974 1
+3607	15 1
+3607	762 1
+3607	974 1
+3607	2145 1
+3607	2237 1
+3607	2328 1
+3607	2516 1
+3607	2535 1
+3607	2851 1
+3607	3352 1
+3607	3456 1
+3607	4037 1
+3607	4781 1
+3607	4953 1
+3607	5022 1
+3607	5233 1
+3607	5543 1
+3607	5684 1
+3607	6327 1
+3607	6715 1
+3607	6770 1
+3607	6833 1
+3607	7143 1
+3607	7168 1
+3610	1744 1
+3610	2674 1
+3610	2747 1
+3610	3148 1
+3611	1297 1
+3611	1744 1
+3611	2257 1
+3611	2324 1
+3611	2411 1
+3611	2485 1
+3611	2510 1
+3611	2654 1
+3611	2657 1
+3611	2674 1
+3611	2693 1
+3611	2923 1
+3611	2973 1
+3611	3005 1
+3611	3059 1
+3611	3114 1
+3611	3148 1
+3611	3404 1
+3611	3680 1
+3611	3737 1
+3611	3769 1
+3611	3847 1
+3613	3616 1
+3614	465 1
+3614	608 1
+3614	737 1
+3614	896 1
+3614	1024 1
+3614	1100 1
+3614	1157 1
+3614	1159 1
+3614	1247 1
+3614	1297 1
+3614	1310 1
+3614	1473 1
+3614	1648 1
+3614	1733 1
+3614	1769 1
+3614	1799 1
+3614	1984 1
+3614	1990 1
+3614	2001 1
+3614	2066 1
+3614	2145 1
+3614	2257 1
+3614	2258 1
+3614	2276 1
+3614	2328 1
+3614	2364 1
+3614	2381 1
+3614	2507 1
+3614	2508 1
+3614	2516 1
+3614	2535 1
+3614	2576 1
+3614	2592 1
+3614	2605 1
+3614	2689 1
+3614	2727 1
+3614	2764 1
+3614	2765 1
+3614	2775 1
+3614	2787 1
+3614	2790 1
+3614	2822 1
+3614	2831 1
+3614	2859 1
+3614	2909 1
+3614	2923 1
+3614	2958 1
+3614	3002 1
+3614	3027 1
+3614	3034 1
+3614	3089 1
+3614	3103 1
+3614	3106 1
+3614	3192 1
+3614	3238 1
+3614	3274 1
+3614	3276 1
+3614	3284 1
+3614	3291 1
+3614	3309 1
+3614	3352 1
+3614	3393 1
+3614	3394 1
+3614	3417 1
+3614	3443 1
+3614	3447 1
+3614	3452 1
+3614	3455 1
+3614	3456 1
+3614	3458 1
+3614	3459 1
+3614	3460 1
+3614	3537 1
+3614	3554 1
+3614	3557 1
+3614	3562 1
+3614	3568 1
+3614	3586 1
+3614	3607 1
+3614	3616 1
+3614	3634 1
+3614	3643 1
+3614	3691 1
+3614	3776 1
+3614	3796 1
+3614	3843 1
+3614	3854 1
+3614	3897 1
+3614	3898 1
+3614	3910 1
+3614	3921 1
+3614	3958 1
+3614	4013 1
+3614	4037 1
+3614	4055 1
+3614	4065 1
+3614	4068 1
+3614	4110 1
+3614	4124 1
+3614	4162 1
+3614	4191 1
+3614	4201 1
+3614	4233 1
+3614	4256 1
+3614	4290 1
+3614	4297 1
+3614	4298 1
+3614	4310 1
+3614	4315 1
+3614	4335 1
+3614	4338 1
+3614	4400 1
+3614	4422 1
+3614	4448 1
+3614	4482 1
+3614	4483 1
+3614	4500 1
+3614	4510 1
+3614	4527 1
+3614	4530 1
+3614	4534 1
+3614	4551 1
+3614	4574 1
+3614	4587 1
+3614	4600 1
+3614	4653 1
+3614	4654 1
+3614	4666 1
+3614	4712 1
+3614	4715 1
+3614	4781 1
+3614	4792 1
+3614	4824 1
+3614	4828 1
+3614	4846 1
+3614	4929 1
+3614	4938 1
+3614	4953 1
+3614	4962 1
+3614	4999 1
+3614	5022 1
+3614	5026 1
+3614	5044 1
+3614	5055 1
+3614	5072 1
+3614	5073 1
+3614	5079 1
+3614	5083 1
+3614	5092 1
+3614	5100 1
+3614	5103 1
+3614	5106 1
+3614	5121 1
+3614	5123 1
+3614	5155 1
+3614	5178 1
+3614	5182 1
+3614	5222 1
+3614	5226 1
+3614	5239 1
+3614	5245 1
+3614	5326 1
+3614	5335 1
+3614	5387 1
+3614	5412 1
+3614	5430 1
+3614	5454 1
+3614	5459 1
+3614	5463 1
+3614	5509 1
+3614	5513 1
+3614	5524 1
+3614	5543 1
+3614	5563 1
+3614	5596 1
+3614	5637 1
+3614	5680 1
+3614	5684 1
+3614	5693 1
+3614	5714 1
+3614	5732 1
+3614	5737 1
+3614	5739 1
+3614	5743 1
+3614	5753 1
+3614	5775 1
+3614	5798 1
+3614	5802 1
+3614	5804 1
+3614	5818 1
+3614	5828 1
+3614	5837 1
+3614	5844 1
+3614	5848 1
+3614	5922 1
+3614	5925 1
+3614	5947 1
+3614	6006 1
+3614	6124 1
+3614	6227 1
+3614	6229 1
+3614	6327 1
+3614	6715 1
+3614	6875 1
+3614	7092 1
+3615	465 1
+3615	762 1
+3615	778 1
+3615	825 1
+3615	827 1
+3615	1297 1
+3615	1307 1
+3615	1453 1
+3615	1549 1
+3615	1688 1
+3615	1706 1
+3615	1729 1
+3615	1769 1
+3615	1915 1
+3615	1990 1
+3615	2066 1
+3615	2144 1
+3615	2145 1
+3615	2237 1
+3615	2240 1
+3615	2252 1
+3615	2307 1
+3615	2328 1
+3615	2381 1
+3615	2398 1
+3615	2411 1
+3615	2508 1
+3615	2516 1
+3615	2535 1
+3615	2544 1
+3615	2592 1
+3615	2595 1
+3615	2619 1
+3615	2646 1
+3615	2653 1
+3615	2655 1
+3615	2657 1
+3615	2686 1
+3615	2746 1
+3615	2760 1
+3615	2859 1
+3615	2871 1
+3615	2932 1
+3615	2981 1
+3615	3007 1
+3615	3024 1
+3615	3026 1
+3615	3059 1
+3615	3117 1
+3615	3125 1
+3615	3140 1
+3615	3180 1
+3615	3192 1
+3615	3200 1
+3615	3258 1
+3615	3260 1
+3615	3291 1
+3615	3352 1
+3615	3394 1
+3615	3404 1
+3615	3439 1
+3615	3443 1
+3615	3452 1
+3615	3453 1
+3615	3455 1
+3615	3456 1
+3615	3483 1
+3615	3541 1
+3615	3557 1
+3615	3562 1
+3615	3568 1
+3615	3607 1
+3615	3616 1
+3615	3635 1
+3615	3645 1
+3615	3650 1
+3615	3660 1
+3615	3664 1
+3615	3691 1
+3615	3720 1
+3615	3796 1
+3615	3803 1
+3615	3804 1
+3615	3806 1
+3615	3807 1
+3615	3812 1
+3615	3822 1
+3615	3843 1
+3615	3847 1
+3615	3887 1
+3615	3893 1
+3615	3903 1
+3615	3910 1
+3615	3926 1
+3615	3933 1
+3615	3937 1
+3615	3946 1
+3615	3956 1
+3615	3967 1
+3615	3969 1
+3615	3970 1
+3615	3980 1
+3615	3999 1
+3615	4013 1
+3615	4024 1
+3615	4043 1
+3615	4044 1
+3615	4055 1
+3615	4098 1
+3615	4111 1
+3615	4124 1
+3615	4179 1
+3615	4233 1
+3615	4256 1
+3615	4263 1
+3615	4269 1
+3615	4289 1
+3615	4290 1
+3615	4299 1
+3615	4349 1
+3615	4365 1
+3615	4384 1
+3615	4417 1
+3615	4422 1
+3615	4424 1
+3615	4463 1
+3615	4480 1
+3615	4485 1
+3615	4531 1
+3615	4547 1
+3615	4578 1
+3615	4587 1
+3615	4666 1
+3615	4798 1
+3615	4953 1
+3615	5121 1
+3615	5130 1
+3615	5132 1
+3615	5210 1
+3615	5804 1
+3615	5817 1
+3615	7683 1
+3615	8293 1
+3615	8294 1
+3618	3148 1
+3619	3148 1
+3620	1157 1
+3621	1157 1
+3622	465 1
+3622	1157 1
+3622	1706 1
+3622	1744 1
+3622	2257 1
+3622	2485 1
+3622	2510 1
+3622	2544 1
+3622	2585 1
+3622	2657 1
+3622	2727 1
+3622	2747 1
+3622	3024 1
+3622	3026 1
+3622	3028 1
+3622	3059 1
+3622	3084 1
+3622	3352 1
+3622	3480 1
+3622	3650 1
+3622	3892 1
+3622	3903 1
+3624	72 1
+3624	825 1
+3624	1247 1
+3624	1473 1
+3624	1733 1
+3624	1744 1
+3624	1990 1
+3624	2210 1
+3624	2237 1
+3624	2240 1
+3624	2485 1
+3624	2516 1
+3624	2544 1
+3624	2565 1
+3624	2595 1
+3624	2619 1
+3624	2653 1
+3624	2655 1
+3624	2657 1
+3624	2746 1
+3624	2831 1
+3624	2871 1
+3624	2900 1
+3624	2909 1
+3624	2973 1
+3624	2981 1
+3624	3007 1
+3624	3024 1
+3624	3026 1
+3624	3125 1
+3624	3274 1
+3624	3334 1
+3624	3404 1
+3624	3461 1
+3624	3568 1
+3624	3660 1
+3624	3800 1
+3624	3811 1
+3624	3892 1
+3624	3999 1
+3624	4021 1
+3624	4024 1
+3624	4031 1
+3624	4043 1
+3624	4110 1
+3624	4162 1
+3624	4191 1
+3624	4290 1
+3624	4299 1
+3624	4335 1
+3624	4359 1
+3624	4384 1
+3624	4422 1
+3624	4448 1
+3624	4485 1
+3624	4528 1
+3624	4529 1
+3624	4587 1
+3624	4946 1
+3624	5459 1
+3624	5545 1
+3624	5637 1
+3624	5684 1
+3624	5980 1
+3625	1239 1
+3625	3520 1
+3625	4013 1
+3625	4201 1
+3629	2727 1
+3629	3010 1
+3629	3114 1
+3629	3537 1
+3604	2923 1
+3604	3629 1
+3628	3629 1
+3630	465 1
+3630	1297 1
+3630	1729 1
+3630	1990 1
+3630	2066 1
+3630	2240 1
+3630	2276 1
+3630	2398 1
+3630	2585 1
+3630	2612 1
+3630	2657 1
+3630	2746 1
+3630	2923 1
+3630	2958 1
+3630	3005 1
+3630	3024 1
+3630	3117 1
+3630	3439 1
+3630	3454 1
+3630	3562 1
+3630	3650 1
+3630	3660 1
+3630	3661 1
+3630	3812 1
+3630	3898 1
+3630	3946 1
+3630	3973 1
+3630	4021 1
+3630	4299 1
+3630	4373 1
+3630	4510 1
+3630	4531 1
+3631	15 1
+3631	72 1
+3631	737 1
+3631	762 1
+3631	978 1
+3631	1307 1
+3631	1549 1
+3631	2066 1
+3631	2145 1
+3631	2258 1
+3631	2328 1
+3631	2364 1
+3631	2369 1
+3631	2381 1
+3631	2398 1
+3631	2433 1
+3631	2517 1
+3631	2535 1
+3631	2544 1
+3631	2619 1
+3631	2653 1
+3631	2790 1
+3631	2859 1
+3631	3007 1
+3631	3026 1
+3631	3084 1
+3631	3180 1
+3631	3192 1
+3631	3258 1
+3631	3276 1
+3631	3313 1
+3631	3352 1
+3631	3452 1
+3631	3456 1
+3631	3463 1
+3631	3562 1
+3631	3568 1
+3631	3615 1
+3631	3650 1
+3631	3660 1
+3631	3787 1
+3631	3812 1
+3631	3813 1
+3631	3816 1
+3631	3871 1
+3631	3910 1
+3631	3914 1
+3631	3937 1
+3631	3946 1
+3631	3967 1
+3631	3973 1
+3631	4011 1
+3631	4024 1
+3631	4037 1
+3631	4099 1
+3631	4103 1
+3631	4117 1
+3631	4173 1
+3631	4179 1
+3631	4181 1
+3631	4199 1
+3631	4231 1
+3631	4233 1
+3631	4290 1
+3631	4297 1
+3631	4335 1
+3631	4349 1
+3631	4424 1
+3631	4510 1
+3631	4550 1
+3631	4661 1
+3631	4735 1
+3631	4846 1
+3631	5022 1
+3631	5055 1
+3631	5072 1
+3631	5254 1
+3631	5392 1
+3631	5412 1
+3631	5449 1
+3631	5509 1
+3631	5539 1
+3631	5568 1
+3631	5592 1
+3631	5817 1
+3631	6004 1
+3631	6918 1
+3631	7391 1
+3631	7553 1
+3631	8293 1
+3631	8295 1
+3632	3650 1
+3633	608 1
+3633	1549 1
+3633	1777 1
+3633	1915 1
+3633	2066 1
+3633	2114 1
+3633	2252 1
+3633	2384 1
+3633	2411 1
+3633	2508 1
+3633	2565 1
+3633	2585 1
+3633	2657 1
+3633	2746 1
+3633	2923 1
+3633	3028 1
+3633	3117 1
+3633	3260 1
+3633	3480 1
+3633	3557 1
+3633	3576 1
+3633	3650 1
+3633	3680 1
+3633	3720 1
+3633	3800 1
+3633	3803 1
+3633	3804 1
+3633	3807 1
+3633	3812 1
+3633	3822 1
+3633	3871 1
+3633	3887 1
+3633	3893 1
+3633	3898 1
+3633	3926 1
+3633	3933 1
+3633	3946 1
+3633	4011 1
+3633	4013 1
+3633	4021 1
+3633	4110 1
+3633	4162 1
+3633	4173 1
+3633	4181 1
+3633	4201 1
+3633	4349 1
+3633	5404 1
+3633	8294 1
+3634	737 1
+3634	1159 1
+3634	1799 1
+3634	1982 1
+3634	2240 1
+3634	2276 1
+3634	2398 1
+3634	2490 1
+3634	2764 1
+3634	2831 1
+3634	3089 1
+3634	3144 1
+3634	3352 1
+3634	3393 1
+3634	3394 1
+3634	3443 1
+3634	3456 1
+3634	3635 1
+3634	3643 1
+3634	3650 1
+3634	3755 1
+3634	3897 1
+3634	3976 1
+3634	4098 1
+3634	4099 1
+3634	4191 1
+3634	4212 1
+3634	4247 1
+3634	4323 1
+3634	4335 1
+3634	4361 1
+3634	4384 1
+3634	4448 1
+3634	4530 1
+3634	4574 1
+3634	4587 1
+3634	4646 1
+3634	4666 1
+3634	4712 1
+3634	4781 1
+3634	4846 1
+3634	4964 1
+3634	5002 1
+3634	5022 1
+3634	5028 1
+3634	5155 1
+3634	5210 1
+3634	5233 1
+3634	5323 1
+3634	5423 1
+3634	5449 1
+3634	5463 1
+3634	5509 1
+3634	5513 1
+3634	5683 1
+3634	5773 1
+3634	5800 1
+3634	5806 1
+3634	5812 1
+3634	5817 1
+3634	5863 1
+3634	5886 1
+3634	5925 1
+3634	5928 1
+3634	5994 1
+3634	6094 1
+3634	6218 1
+3634	6251 1
+3634	6262 1
+3634	6337 1
+3634	6400 1
+3634	6441 1
+3634	6481 1
+3634	6784 1
+3634	6875 1
+3634	6976 1
+3634	7295 1
+3634	7301 1
+3634	7561 1
+3634	7965 1
+3634	8141 1
+3634	8295 1
+3635	608 1
+3635	827 1
+3635	1157 1
+3635	1453 1
+3635	1729 1
+3635	2066 1
+3635	2129 1
+3635	2289 1
+3635	2328 1
+3635	2535 1
+3635	2595 1
+3635	2655 1
+3635	2746 1
+3635	2760 1
+3635	2932 1
+3635	2958 1
+3635	3007 1
+3635	3117 1
+3635	3180 1
+3635	3192 1
+3635	3276 1
+3635	3291 1
+3635	3352 1
+3635	3394 1
+3635	3439 1
+3635	3454 1
+3635	3562 1
+3635	3568 1
+3635	3615 1
+3635	3631 1
+3635	3650 1
+3635	3660 1
+3635	3787 1
+3635	3813 1
+3635	3926 1
+3635	3933 1
+3635	3937 1
+3635	3967 1
+3635	3970 1
+3635	3980 1
+3635	4013 1
+3635	4138 1
+3635	4191 1
+3635	4201 1
+3635	4233 1
+3635	4247 1
+3635	4256 1
+3635	4265 1
+3635	4290 1
+3635	4297 1
+3635	4311 1
+3635	4331 1
+3635	4332 1
+3635	4373 1
+3635	4384 1
+3635	4386 1
+3635	4402 1
+3635	4403 1
+3635	4453 1
+3635	4875 1
+3635	6243 1
+3635	7054 1
+3635	7378 1
+3636	1453 1
+3636	2508 1
+3636	2576 1
+3636	2774 1
+3636	3276 1
+3636	3646 1
+3636	3650 1
+3636	3926 1
+3636	3937 1
+3636	4953 1
+3636	5254 1
+3637	2592 1
+3637	3117 1
+3637	3650 1
+3637	3910 1
+3638	3650 1
+3639	762 1
+3639	1777 1
+3639	2760 1
+3639	2871 1
+3639	3026 1
+3639	3144 1
+3639	3309 1
+3639	3537 1
+3639	3650 1
+3639	4261 1
+3639	4662 1
+3639	5055 1
+3640	3650 1
+3641	15 1
+3641	72 1
+3641	465 1
+3641	737 1
+3641	762 1
+3641	825 1
+3641	1026 1
+3641	1060 1
+3641	1307 1
+3641	1385 1
+3641	1549 1
+3641	1680 1
+3641	1688 1
+3641	1769 1
+3641	2066 1
+3641	2134 1
+3641	2144 1
+3641	2145 1
+3641	2160 1
+3641	2210 1
+3641	2276 1
+3641	2307 1
+3641	2326 1
+3641	2328 1
+3641	2398 1
+3641	2433 1
+3641	2507 1
+3641	2516 1
+3641	2544 1
+3641	2565 1
+3641	2576 1
+3641	2653 1
+3641	2696 1
+3641	2746 1
+3641	2790 1
+3641	2822 1
+3641	2831 1
+3641	2851 1
+3641	2859 1
+3641	2900 1
+3641	2909 1
+3641	2917 1
+3641	2925 1
+3641	2958 1
+3641	3002 1
+3641	3014 1
+3641	3024 1
+3641	3026 1
+3641	3027 1
+3641	3059 1
+3641	3084 1
+3641	3089 1
+3641	3103 1
+3641	3117 1
+3641	3191 1
+3641	3192 1
+3641	3238 1
+3641	3258 1
+3641	3260 1
+3641	3334 1
+3641	3352 1
+3641	3393 1
+3641	3404 1
+3641	3417 1
+3641	3439 1
+3641	3454 1
+3641	3456 1
+3641	3459 1
+3641	3460 1
+3641	3537 1
+3641	3562 1
+3641	3568 1
+3641	3607 1
+3641	3615 1
+3641	3631 1
+3641	3643 1
+3641	3650 1
+3641	3720 1
+3641	3724 1
+3641	3748 1
+3641	3792 1
+3641	3796 1
+3641	3800 1
+3641	3813 1
+3641	3854 1
+3641	3897 1
+3641	3898 1
+3641	3946 1
+3641	3962 1
+3641	3969 1
+3641	4021 1
+3641	4037 1
+3641	4044 1
+3641	4065 1
+3641	4099 1
+3641	4110 1
+3641	4124 1
+3641	4162 1
+3641	4171 1
+3641	4173 1
+3641	4179 1
+3641	4191 1
+3641	4247 1
+3641	4254 1
+3641	4269 1
+3641	4297 1
+3641	4298 1
+3641	4310 1
+3641	4335 1
+3641	4349 1
+3641	4400 1
+3641	4488 1
+3641	4536 1
+3641	4547 1
+3641	4587 1
+3641	4600 1
+3641	4632 1
+3641	4645 1
+3641	4653 1
+3641	4662 1
+3641	4687 1
+3641	4709 1
+3641	4712 1
+3641	4713 1
+3641	4764 1
+3641	4781 1
+3641	4795 1
+3641	4811 1
+3641	4828 1
+3641	4846 1
+3641	4884 1
+3641	4929 1
+3641	4962 1
+3641	4977 1
+3641	5022 1
+3641	5033 1
+3641	5037 1
+3641	5073 1
+3641	5079 1
+3641	5103 1
+3641	5121 1
+3641	5182 1
+3641	5189 1
+3641	5295 1
+3641	5321 1
+3641	5327 1
+3641	5335 1
+3641	5404 1
+3641	5412 1
+3641	5415 1
+3641	5437 1
+3641	5439 1
+3641	5449 1
+3641	5452 1
+3641	5454 1
+3641	5459 1
+3641	5484 1
+3641	5506 1
+3641	5524 1
+3641	5527 1
+3641	5543 1
+3641	5563 1
+3641	5596 1
+3641	5605 1
+3641	5693 1
+3641	5697 1
+3641	5714 1
+3641	5739 1
+3641	5743 1
+3641	5753 1
+3641	5800 1
+3641	5802 1
+3641	5811 1
+3641	5818 1
+3641	5829 1
+3641	5848 1
+3641	5871 1
+3641	5977 1
+3641	6004 1
+3641	6098 1
+3641	6105 1
+3641	6107 1
+3641	6123 1
+3641	6124 1
+3641	6148 1
+3641	6227 1
+3641	6229 1
+3641	6272 1
+3641	6347 1
+3641	6417 1
+3641	6464 1
+3641	6498 1
+3641	6560 1
+3641	6613 1
+3641	6739 1
+3641	6770 1
+3641	6777 1
+3641	6783 1
+3641	6805 1
+3641	6855 1
+3641	6860 1
+3641	6869 1
+3641	6897 1
+3641	6901 1
+3641	6930 1
+3641	6934 1
+3641	6948 1
+3641	6955 1
+3641	7092 1
+3641	7108 1
+3641	7632 1
+3641	8294 1
+3642	15 1
+3642	72 1
+3642	155 1
+3642	465 1
+3642	778 1
+3642	840 1
+3642	896 1
+3642	1159 1
+3642	1239 1
+3642	1352 1
+3642	1473 1
+3642	1493 1
+3642	1548 1
+3642	1648 1
+3642	1733 1
+3642	1823 1
+3642	1972 1
+3642	1982 1
+3642	2001 1
+3642	2160 1
+3642	2276 1
+3642	2277 1
+3642	2285 1
+3642	2398 1
+3642	2433 1
+3642	2440 1
+3642	2490 1
+3642	2507 1
+3642	2535 1
+3642	2576 1
+3642	2605 1
+3642	2620 1
+3642	2658 1
+3642	2765 1
+3642	2774 1
+3642	2775 1
+3642	2914 1
+3642	2925 1
+3642	3084 1
+3642	3089 1
+3642	3191 1
+3642	3238 1
+3642	3274 1
+3642	3291 1
+3642	3334 1
+3642	3346 1
+3642	3459 1
+3642	3479 1
+3642	3498 1
+3642	3586 1
+3642	3614 1
+3642	3634 1
+3642	3643 1
+3642	3650 1
+3642	3792 1
+3642	3796 1
+3642	3807 1
+3642	3830 1
+3642	3842 1
+3642	3873 1
+3642	3897 1
+3642	3919 1
+3642	3922 1
+3642	3937 1
+3642	3969 1
+3642	3976 1
+3642	4037 1
+3642	4041 1
+3642	4065 1
+3642	4099 1
+3642	4134 1
+3642	4175 1
+3642	4201 1
+3642	4247 1
+3642	4276 1
+3642	4310 1
+3642	4338 1
+3642	4361 1
+3642	4483 1
+3642	4488 1
+3642	4527 1
+3642	4530 1
+3642	4534 1
+3642	4536 1
+3642	4574 1
+3642	4604 1
+3642	4689 1
+3642	4709 1
+3642	4712 1
+3642	4713 1
+3642	4715 1
+3642	4717 1
+3642	4748 1
+3642	4764 1
+3642	4781 1
+3642	4786 1
+3642	4791 1
+3642	4795 1
+3642	4797 1
+3642	4798 1
+3642	4828 1
+3642	4875 1
+3642	4899 1
+3642	4980 1
+3642	5002 1
+3642	5012 1
+3642	5020 1
+3642	5022 1
+3642	5037 1
+3642	5061 1
+3642	5072 1
+3642	5079 1
+3642	5103 1
+3642	5121 1
+3642	5123 1
+3642	5140 1
+3642	5176 1
+3642	5178 1
+3642	5179 1
+3642	5182 1
+3642	5188 1
+3642	5200 1
+3642	5210 1
+3642	5226 1
+3642	5233 1
+3642	5254 1
+3642	5262 1
+3642	5263 1
+3642	5273 1
+3642	5288 1
+3642	5295 1
+3642	5301 1
+3642	5305 1
+3642	5321 1
+3642	5335 1
+3642	5384 1
+3642	5404 1
+3642	5415 1
+3642	5423 1
+3642	5437 1
+3642	5439 1
+3642	5459 1
+3642	5479 1
+3642	5482 1
+3642	5487 1
+3642	5499 1
+3642	5524 1
+3642	5527 1
+3642	5529 1
+3642	5543 1
+3642	5545 1
+3642	5559 1
+3642	5563 1
+3642	5582 1
+3642	5584 1
+3642	5596 1
+3642	5624 1
+3642	5626 1
+3642	5630 1
+3642	5638 1
+3642	5640 1
+3642	5663 1
+3642	5680 1
+3642	5683 1
+3642	5693 1
+3642	5705 1
+3642	5713 1
+3642	5714 1
+3642	5721 1
+3642	5732 1
+3642	5737 1
+3642	5739 1
+3642	5743 1
+3642	5745 1
+3642	5753 1
+3642	5756 1
+3642	5760 1
+3642	5773 1
+3642	5775 1
+3642	5780 1
+3642	5784 1
+3642	5790 1
+3642	5799 1
+3642	5800 1
+3642	5802 1
+3642	5804 1
+3642	5814 1
+3642	5818 1
+3642	5824 1
+3642	5827 1
+3642	5828 1
+3642	5829 1
+3642	5837 1
+3642	5844 1
+3642	5848 1
+3642	5860 1
+3642	5871 1
+3642	5872 1
+3642	5886 1
+3642	5891 1
+3642	5902 1
+3642	5925 1
+3642	5928 1
+3642	5936 1
+3642	5947 1
+3642	5950 1
+3642	5963 1
+3642	5972 1
+3642	5973 1
+3642	5977 1
+3642	5980 1
+3642	5991 1
+3642	5994 1
+3642	6001 1
+3642	6004 1
+3642	6006 1
+3642	6021 1
+3642	6029 1
+3642	6080 1
+3642	6094 1
+3642	6098 1
+3642	6105 1
+3642	6107 1
+3642	6109 1
+3642	6111 1
+3642	6124 1
+3642	6130 1
+3642	6148 1
+3642	6151 1
+3642	6156 1
+3642	6161 1
+3642	6166 1
+3642	6170 1
+3642	6218 1
+3642	6221 1
+3642	6226 1
+3642	6229 1
+3642	6246 1
+3642	6251 1
+3642	6255 1
+3642	6262 1
+3642	6269 1
+3642	6296 1
+3642	6299 1
+3642	6305 1
+3642	6306 1
+3642	6323 1
+3642	6327 1
+3642	6328 1
+3642	6330 1
+3642	6334 1
+3642	6337 1
+3642	6340 1
+3642	6344 1
+3642	6347 1
+3642	6388 1
+3642	6400 1
+3642	6409 1
+3642	6414 1
+3642	6417 1
+3642	6422 1
+3642	6424 1
+3642	6435 1
+3642	6437 1
+3642	6441 1
+3642	6458 1
+3642	6462 1
+3642	6474 1
+3642	6475 1
+3642	6481 1
+3642	6496 1
+3642	6501 1
+3642	6503 1
+3642	6505 1
+3642	6523 1
+3642	6528 1
+3642	6552 1
+3642	6553 1
+3642	6554 1
+3642	6560 1
+3642	6566 1
+3642	6570 1
+3642	6571 1
+3642	6576 1
+3642	6589 1
+3642	6590 1
+3642	6592 1
+3642	6594 1
+3642	6595 1
+3642	6599 1
+3642	6600 1
+3642	6613 1
+3642	6624 1
+3642	6628 1
+3642	6632 1
+3642	6634 1
+3642	6663 1
+3642	6665 1
+3642	6699 1
+3642	6700 1
+3642	6714 1
+3642	6715 1
+3642	6720 1
+3642	6721 1
+3642	6736 1
+3642	6739 1
+3642	6765 1
+3642	6770 1
+3642	6774 1
+3642	6783 1
+3642	6789 1
+3642	6803 1
+3642	6832 1
+3642	6833 1
+3642	6850 1
+3642	6855 1
+3642	6860 1
+3642	6869 1
+3642	6873 1
+3642	6897 1
+3642	6901 1
+3642	6913 1
+3642	6914 1
+3642	6918 1
+3642	6924 1
+3642	6930 1
+3642	6934 1
+3642	6946 1
+3642	6948 1
+3642	6953 1
+3642	6994 1
+3642	7040 1
+3642	7047 1
+3642	7050 1
+3642	7052 1
+3642	7054 1
+3642	7092 1
+3642	7094 1
+3642	7108 1
+3642	7115 1
+3642	7131 1
+3642	7168 1
+3642	7185 1
+3642	7201 1
+3642	7225 1
+3642	7233 1
+3642	7295 1
+3642	7304 1
+3642	7351 1
+3642	7373 1
+3642	7378 1
+3642	7442 1
+3642	7478 1
+3642	7497 1
+3642	7510 1
+3642	7553 1
+3642	7587 1
+3642	7620 1
+3642	7632 1
+3642	7809 1
+3642	7839 1
+3642	8295 1
+3643	15 1
+3643	72 1
+3643	608 1
+3643	737 1
+3643	1385 1
+3643	1473 1
+3643	2144 1
+3643	2276 1
+3643	2354 1
+3643	2398 1
+3643	2605 1
+3643	2619 1
+3643	2790 1
+3643	3024 1
+3643	3089 1
+3643	3260 1
+3643	3321 1
+3643	3417 1
+3643	3461 1
+3643	3634 1
+3643	3645 1
+3643	3650 1
+3643	3748 1
+3643	3796 1
+3643	3800 1
+3643	3946 1
+3643	3956 1
+3643	3967 1
+3643	3970 1
+3643	4041 1
+3643	4191 1
+3643	4297 1
+3643	4298 1
+3643	4310 1
+3643	4530 1
+3643	4578 1
+3643	4712 1
+3643	4899 1
+3643	5103 1
+3643	5226 1
+3643	5452 1
+3643	5743 1
+3643	6029 1
+3643	6765 1
+3645	737 1
+3645	825 1
+3645	827 1
+3645	978 1
+3645	1239 1
+3645	2066 1
+3645	2210 1
+3645	2289 1
+3645	2328 1
+3645	2646 1
+3645	2653 1
+3645	2746 1
+3645	2859 1
+3645	2958 1
+3645	3125 1
+3645	3144 1
+3645	3260 1
+3645	3291 1
+3645	3439 1
+3645	3562 1
+3645	3568 1
+3645	3650 1
+3645	3720 1
+3645	3816 1
+3645	3970 1
+3645	4021 1
+3645	4110 1
+3645	4162 1
+3645	4179 1
+3645	4263 1
+3645	4299 1
+3645	4365 1
+3645	4373 1
+3645	4403 1
+3645	4417 1
+3645	4422 1
+3645	4463 1
+3645	4510 1
+3645	4528 1
+3645	4531 1
+3649	3650 1
+3646	825 1
+3646	1777 1
+3646	2210 1
+3646	2657 1
+3646	2958 1
+3646	2981 1
+3646	3650 1
+3646	4021 1
+3646	8294 1
+3647	465 1
+3647	1453 1
+3647	1706 1
+3647	2585 1
+3647	3007 1
+3647	3024 1
+3647	3028 1
+3647	3260 1
+3647	3352 1
+3647	3650 1
+3647	3903 1
+3647	3926 1
+3647	3937 1
+3651	3537 1
+3652	3537 1
+3654	2324 1
+3653	2324 1
+3653	2693 1
+3655	825 1
+3655	2324 1
+3655	2693 1
+3655	3002 1
+3655	4103 1
+3655	4110 1
+3655	5055 1
+3655	6918 1
+3655	8294 1
+3656	2693 1
+3656	4072 1
+3656	5288 1
+3657	2693 1
+3658	737 1
+3658	1239 1
+3658	1729 1
+3658	2237 1
+3658	2257 1
+3658	2328 1
+3658	2485 1
+3658	2510 1
+3658	2585 1
+3658	2620 1
+3658	2693 1
+3658	2774 1
+3658	2909 1
+3658	2932 1
+3658	3005 1
+3658	3089 1
+3658	3192 1
+3658	3352 1
+3658	3417 1
+3658	3537 1
+3658	3568 1
+3658	3664 1
+3658	3796 1
+3658	4191 1
+3658	4448 1
+3658	4666 1
+3658	4781 1
+3658	5140 1
+3658	5148 1
+3658	5335 1
+3658	5341 1
+3658	5459 1
+3658	5509 1
+3658	5651 1
+3658	5799 1
+3658	6227 1
+3658	6624 1
+3658	6790 1
+3658	7512 1
+3659	465 1
+3659	825 1
+3659	978 1
+3659	1385 1
+3659	1706 1
+3659	1729 1
+3659	2066 1
+3659	2289 1
+3659	2307 1
+3659	2544 1
+3659	2585 1
+3659	2727 1
+3659	2859 1
+3659	2958 1
+3659	3026 1
+3659	3028 1
+3659	3059 1
+3659	3084 1
+3659	3117 1
+3659	3352 1
+3659	3394 1
+3659	3404 1
+3659	3568 1
+3659	3660 1
+3659	3871 1
+3659	3887 1
+3659	3892 1
+3659	3912 1
+3659	3914 1
+3659	3922 1
+3659	4188 1
+3659	4263 1
+3659	4289 1
+3659	4297 1
+3659	4411 1
+3659	4417 1
+3659	4424 1
+3659	8293 1
+3660	762 1
+3660	1157 1
+3660	1307 1
+3660	1385 1
+3660	1453 1
+3660	1769 1
+3660	1777 1
+3660	1990 1
+3660	2066 1
+3660	2252 1
+3660	2289 1
+3660	2508 1
+3660	2516 1
+3660	2535 1
+3660	2544 1
+3660	2565 1
+3660	2619 1
+3660	2653 1
+3660	2654 1
+3660	2696 1
+3660	2900 1
+3660	2923 1
+3660	2958 1
+3660	3002 1
+3660	3117 1
+3660	3144 1
+3660	3180 1
+3660	3260 1
+3660	3276 1
+3660	3291 1
+3660	3352 1
+3660	3394 1
+3660	3447 1
+3660	3463 1
+3660	3557 1
+3660	3562 1
+3660	3568 1
+3660	3607 1
+3660	3615 1
+3660	3631 1
+3660	3645 1
+3660	3646 1
+3660	3720 1
+3660	3724 1
+3660	3804 1
+3660	3806 1
+3660	3813 1
+3660	3854 1
+3660	3887 1
+3660	3967 1
+3660	4013 1
+3660	4021 1
+3660	4037 1
+3660	4051 1
+3660	4088 1
+3660	4110 1
+3660	4124 1
+3660	4138 1
+3660	4181 1
+3660	4191 1
+3660	4201 1
+3660	4234 1
+3660	4247 1
+3660	4256 1
+3660	4289 1
+3660	4297 1
+3660	4299 1
+3660	4349 1
+3660	4365 1
+3660	4373 1
+3660	4384 1
+3660	4422 1
+3660	4424 1
+3660	4453 1
+3660	4463 1
+3660	4485 1
+3660	4510 1
+3660	4528 1
+3660	4531 1
+3660	4820 1
+3660	4938 1
+3660	4953 1
+3660	4983 1
+3660	5092 1
+3660	5130 1
+3660	5132 1
+3660	8294 1
+3661	825 1
+3661	978 1
+3661	1453 1
+3661	1706 1
+3661	1729 1
+3661	2066 1
+3661	2134 1
+3661	2210 1
+3661	2328 1
+3661	2619 1
+3661	2746 1
+3661	2923 1
+3661	3007 1
+3661	3024 1
+3661	3026 1
+3661	3180 1
+3661	3192 1
+3661	3200 1
+3661	3260 1
+3661	3352 1
+3661	3463 1
+3661	3555 1
+3661	3562 1
+3661	3568 1
+3661	3615 1
+3661	3631 1
+3661	3812 1
+3661	3871 1
+3661	3903 1
+3661	3926 1
+3661	3937 1
+3661	3967 1
+3661	4043 1
+3661	4289 1
+3661	4359 1
+3661	4365 1
+3662	3352 1
+3662	4335 1
+3662	6299 1
+3662	6330 1
+3662	6334 1
+3662	6634 1
+3662	6914 1
+3662	7021 1
+3662	7512 1
+3662	7924 1
+3663	3352 1
+3664	3352 1
+3665	1385 1
+3665	1680 1
+3665	1982 1
+3665	2223 1
+3665	2535 1
+3665	2658 1
+3665	3028 1
+3665	3352 1
+3665	3459 1
+3665	3691 1
+3665	4507 1
+3665	4536 1
+3665	5233 1
+3665	5288 1
+3665	6330 1
+3665	6422 1
+3665	6790 1
+3665	6946 1
+3665	7553 1
+3665	8044 1
+3666	222 1
+3666	346 1
+3666	737 1
+3666	762 1
+3666	1159 1
+3666	1185 1
+3666	1247 1
+3666	1453 1
+3666	1548 1
+3666	1549 1
+3666	1648 1
+3666	1680 1
+3666	1729 1
+3666	1799 1
+3666	2134 1
+3666	2144 1
+3666	2210 1
+3666	2240 1
+3666	2252 1
+3666	2307 1
+3666	2326 1
+3666	2328 1
+3666	2369 1
+3666	2398 1
+3666	2456 1
+3666	2490 1
+3666	2506 1
+3666	2517 1
+3666	2535 1
+3666	2544 1
+3666	2655 1
+3666	2775 1
+3666	2831 1
+3666	2859 1
+3666	2871 1
+3666	2900 1
+3666	2932 1
+3666	2981 1
+3666	3024 1
+3666	3026 1
+3666	3089 1
+3666	3106 1
+3666	3180 1
+3666	3191 1
+3666	3192 1
+3666	3260 1
+3666	3274 1
+3666	3284 1
+3666	3352 1
+3666	3393 1
+3666	3394 1
+3666	3452 1
+3666	3454 1
+3666	3456 1
+3666	3460 1
+3666	3483 1
+3666	3554 1
+3666	3557 1
+3666	3562 1
+3666	3568 1
+3666	3586 1
+3666	3615 1
+3666	3660 1
+3666	3661 1
+3666	3812 1
+3666	3813 1
+3666	3843 1
+3666	3897 1
+3666	3910 1
+3666	3942 1
+3666	3946 1
+3666	3958 1
+3666	3976 1
+3666	4011 1
+3666	4037 1
+3666	4055 1
+3666	4078 1
+3666	4098 1
+3666	4099 1
+3666	4110 1
+3666	4124 1
+3666	4179 1
+3666	4191 1
+3666	4219 1
+3666	4256 1
+3666	4266 1
+3666	4272 1
+3666	4331 1
+3666	4384 1
+3666	4422 1
+3666	4448 1
+3666	4466 1
+3666	4530 1
+3666	4534 1
+3666	4536 1
+3666	4547 1
+3666	4600 1
+3666	4653 1
+3666	4661 1
+3666	4666 1
+3666	4712 1
+3666	4777 1
+3666	4780 1
+3666	4811 1
+3666	4814 1
+3666	4828 1
+3666	4899 1
+3666	4977 1
+3666	4986 1
+3666	5100 1
+3666	5130 1
+3666	5189 1
+3666	5233 1
+3666	5239 1
+3666	5288 1
+3666	5305 1
+3666	5323 1
+3666	5327 1
+3666	5335 1
+3666	5430 1
+3666	5445 1
+3666	5449 1
+3666	5459 1
+3666	5463 1
+3666	5484 1
+3666	5506 1
+3666	5509 1
+3666	5511 1
+3666	5568 1
+3666	5592 1
+3666	5650 1
+3666	5683 1
+3666	5694 1
+3666	5743 1
+3666	5790 1
+3666	5817 1
+3666	5828 1
+3666	5863 1
+3666	5936 1
+3666	5947 1
+3666	5994 1
+3666	6098 1
+3666	8294 1
+3666	8295 1
+3667	2066 1
+3667	3117 1
+3667	3276 1
+3667	3352 1
+3667	3971 1
+3667	4201 1
+3668	3669 1
+3673	2398 1
+3673	2510 1
+3673	4315 1
+3673	4547 1
+3673	5204 1
+3674	2747 1
+3674	3557 1
+3675	2747 1
+3676	2747 1
+3677	1305 1
+3677	2747 1
+3678	1777 1
+3678	1915 1
+3678	1935 1
+3678	2114 1
+3678	2565 1
+3678	2686 1
+3678	2727 1
+3678	2923 1
+3678	3059 1
+3678	3404 1
+3678	3480 1
+3678	3483 1
+3678	3680 1
+3678	3822 1
+3678	3847 1
+3678	3856 1
+3678	3871 1
+3681	2654 1
+3682	778 1
+3682	825 1
+3682	827 1
+3682	1140 1
+3682	1157 1
+3682	1239 1
+3682	1307 1
+3682	1453 1
+3682	1549 1
+3682	1744 1
+3682	1777 1
+3682	1915 1
+3682	1935 1
+3682	2066 1
+3682	2114 1
+3682	2328 1
+3682	2433 1
+3682	2508 1
+3682	2565 1
+3682	2619 1
+3682	2653 1
+3682	2655 1
+3682	2657 1
+3682	2686 1
+3682	2859 1
+3682	2900 1
+3682	2981 1
+3682	3024 1
+3682	3180 1
+3682	3260 1
+3682	3276 1
+3682	3291 1
+3682	3394 1
+3682	3404 1
+3682	3463 1
+3682	3483 1
+3682	3541 1
+3682	3562 1
+3682	3681 1
+3682	3769 1
+3682	3772 1
+3682	3787 1
+3682	3800 1
+3682	3803 1
+3682	3806 1
+3682	3813 1
+3682	3816 1
+3682	3847 1
+3682	3871 1
+3682	3887 1
+3682	3898 1
+3682	3926 1
+3682	3933 1
+3682	3937 1
+3682	3942 1
+3682	3946 1
+3682	3967 1
+3682	3970 1
+3682	3980 1
+3682	4024 1
+3682	4088 1
+3682	4110 1
+3682	4162 1
+3682	4173 1
+3682	4181 1
+3682	4201 1
+3682	4233 1
+3682	4247 1
+3682	4256 1
+3682	4269 1
+3682	4289 1
+3682	4323 1
+3682	4331 1
+3682	4351 1
+3682	4373 1
+3683	2398 1
+3683	2654 1
+3683	4037 1
+3683	4884 1
+3683	5246 1
+3683	7478 1
+3684	2654 1
+3685	2237 1
+3685	2654 1
+3686	2384 1
+3686	2654 1
+3686	3871 1
+3692	72 1
+3692	1473 1
+3692	2398 1
+3692	2654 1
+3692	4338 1
+3692	5423 1
+3692	5452 1
+3692	5484 1
+3687	2654 1
+3688	15 1
+3688	1385 1
+3688	2289 1
+3688	2654 1
+3689	2654 1
+3689	3352 1
+3690	2654 1
+3691	1140 1
+3691	1191 1
+3691	1307 1
+3691	1473 1
+3691	1799 1
+3691	2289 1
+3691	2398 1
+3691	2654 1
+3691	2658 1
+3691	2689 1
+3691	2822 1
+3691	3106 1
+3691	3238 1
+3691	3301 1
+3691	3352 1
+3691	3394 1
+3691	3452 1
+3691	3456 1
+3691	3480 1
+3691	3537 1
+3691	3557 1
+3691	3568 1
+3691	3615 1
+3691	3634 1
+3691	3769 1
+3691	3792 1
+3691	3832 1
+3691	3847 1
+3691	3885 1
+3691	3969 1
+3691	4011 1
+3691	4037 1
+3691	4044 1
+3691	4124 1
+3691	4191 1
+3691	4201 1
+3691	4218 1
+3691	4233 1
+3691	4234 1
+3691	4310 1
+3691	4335 1
+3691	4359 1
+3691	4424 1
+3691	4448 1
+3691	4481 1
+3691	4820 1
+3691	4944 1
+3691	5020 1
+3691	5141 1
+3691	5208 1
+3691	5271 1
+3691	5288 1
+3691	5295 1
+3691	5298 1
+3691	5335 1
+3691	5404 1
+3691	5449 1
+3691	5459 1
+3691	5481 1
+3691	5513 1
+3691	5529 1
+3691	5568 1
+3691	5739 1
+3691	5760 1
+3691	5800 1
+3691	5835 1
+3691	5902 1
+3691	5963 1
+3691	6032 1
+3691	6305 1
+3691	6498 1
+3691	6665 1
+3691	6833 1
+3691	6897 1
+3691	6917 1
+3691	6934 1
+3691	6938 1
+3691	6945 1
+3691	7042 1
+3691	7047 1
+3691	7054 1
+3691	7110 1
+3691	7161 1
+3691	7186 1
+3691	7306 1
+3691	7378 1
+3691	7387 1
+3691	7422 1
+3691	7423 1
+3691	7440 1
+3691	7450 1
+3691	7497 1
+3691	7587 1
+3691	7632 1
+3691	7809 1
+3693	2654 1
+3694	2654 1
+3695	2654 1
+3696	2654 1
+3697	2654 1
+3698	2654 1
+3700	3645 1
+3700	3701 1
+3702	1744 1
+3703	1744 1
+3704	1744 1
+3705	1549 1
+3705	1744 1
+3705	3804 1
+3706	1744 1
+3707	1744 1
+3709	465 1
+3709	1990 1
+3709	2585 1
+3709	3026 1
+3709	3404 1
+3709	4037 1
+3709	6595 1
+2067	3114 1
+2067	6914 1
+2067	7763 1
+3711	3713 1
+3712	3713 1
+3714	1239 1
+3714	2066 1
+3714	2384 1
+3714	2653 1
+3714	2859 1
+3714	2958 1
+3714	3010 1
+3714	3258 1
+3714	3562 1
+3714	4043 1
+3714	4055 1
+3714	4058 1
+3714	4162 1
+3714	4179 1
+3714	8294 1
+3715	3010 1
+3717	3010 1
+3718	3005 1
+3719	1549 1
+3719	2958 1
+3719	3005 1
+3719	3117 1
+3719	3260 1
+3719	3394 1
+3719	3541 1
+3719	3562 1
+3719	3645 1
+3719	4013 1
+3719	4021 1
+3719	4191 1
+3719	4290 1
+3719	4299 1
+3723	762 1
+3723	1297 1
+3723	2508 1
+3723	3459 1
+3723	5412 1
+3723	7587 1
+3723	7632 1
+3724	465 1
+3724	608 1
+3724	825 1
+3724	978 1
+3724	1140 1
+3724	1239 1
+3724	1297 1
+3724	1307 1
+3724	1385 1
+3724	1453 1
+3724	1729 1
+3724	1990 1
+3724	2066 1
+3724	2134 1
+3724	2210 1
+3724	2289 1
+3724	2328 1
+3724	2508 1
+3724	2516 1
+3724	2544 1
+3724	2565 1
+3724	2585 1
+3724	2595 1
+3724	2612 1
+3724	2646 1
+3724	2653 1
+3724	2746 1
+3724	2859 1
+3724	2900 1
+3724	2932 1
+3724	2958 1
+3724	2981 1
+3724	3026 1
+3724	3059 1
+3724	3117 1
+3724	3125 1
+3724	3144 1
+3724	3192 1
+3724	3258 1
+3724	3291 1
+3724	3313 1
+3724	3346 1
+3724	3439 1
+3724	3483 1
+3724	3555 1
+3724	3562 1
+3724	3568 1
+3724	3615 1
+3724	3645 1
+3724	3660 1
+3724	3661 1
+3724	3787 1
+3724	3800 1
+3724	3816 1
+3724	3867 1
+3724	3914 1
+3724	3926 1
+3724	3933 1
+3724	3937 1
+3724	3946 1
+3724	4013 1
+3724	4021 1
+3724	4024 1
+3724	4031 1
+3724	4043 1
+3724	4051 1
+3724	4055 1
+3724	4110 1
+3724	4138 1
+3724	4162 1
+3724	4179 1
+3724	4181 1
+3724	4183 1
+3724	4201 1
+3724	4233 1
+3724	4234 1
+3724	4247 1
+3724	4254 1
+3724	4256 1
+3724	4263 1
+3724	4269 1
+3724	4289 1
+3724	4299 1
+3724	4349 1
+3724	4373 1
+3724	4384 1
+3724	4412 1
+3724	4422 1
+3724	4424 1
+3724	4463 1
+3724	4480 1
+3724	4485 1
+3724	4510 1
+3722	1297 1
+3722	5773 1
+3733	1297 1
+3571	15 1
+3571	1297 1
+3571	1403 1
+3571	1453 1
+3571	1688 1
+3571	2328 1
+3571	2398 1
+3571	2485 1
+3571	2653 1
+3571	2851 1
+3571	2871 1
+3571	2981 1
+3571	3059 1
+3571	3144 1
+3571	3586 1
+3571	3634 1
+3571	3643 1
+3571	3897 1
+3571	3926 1
+3571	4289 1
+3571	4310 1
+3571	4335 1
+3571	4463 1
+3571	5028 1
+3571	5103 1
+3571	5106 1
+3571	5210 1
+3571	5288 1
+3571	5799 1
+3571	5801 1
+3571	5814 1
+3571	5818 1
+3571	5872 1
+3571	5922 1
+3571	5925 1
+3571	6044 1
+3571	6227 1
+3571	6327 1
+3571	6875 1
+3571	6976 1
+3571	6979 1
+3571	7233 1
+3571	7553 1
+3571	7809 1
+3571	7908 1
+3725	1297 1
+3725	2411 1
+3725	2657 1
+3725	4528 1
+3726	1297 1
+3726	2655 1
+3726	3092 1
+3727	1297 1
+3728	15 1
+3728	737 1
+3728	762 1
+3728	1024 1
+3728	1297 1
+3728	1307 1
+3728	1385 1
+3728	1453 1
+3728	1473 1
+3728	1549 1
+3728	2001 1
+3728	2066 1
+3728	2398 1
+3728	2506 1
+3728	2508 1
+3728	2516 1
+3728	2774 1
+3728	2785 1
+3728	2909 1
+3728	2917 1
+3728	3034 1
+3728	3089 1
+3728	3106 1
+3728	3192 1
+3728	3276 1
+3728	3352 1
+3728	3456 1
+3728	3458 1
+3728	3720 1
+3728	3724 1
+3728	3843 1
+3728	3887 1
+3728	3946 1
+3728	3976 1
+3728	4037 1
+3728	4099 1
+3728	4110 1
+3728	4175 1
+3728	4201 1
+3728	4220 1
+3728	4261 1
+3728	4289 1
+3728	4335 1
+3728	4349 1
+3728	4400 1
+3728	4417 1
+3728	4463 1
+3728	4480 1
+3728	4536 1
+3728	4587 1
+3728	4600 1
+3728	4709 1
+3728	4712 1
+3728	4719 1
+3728	4735 1
+3728	4777 1
+3728	4797 1
+3728	4808 1
+3728	4875 1
+3728	4977 1
+3728	4983 1
+3728	5020 1
+3728	5083 1
+3728	5100 1
+3728	5176 1
+3728	5233 1
+3728	5327 1
+3728	5341 1
+3728	5412 1
+3728	5417 1
+3728	5430 1
+3728	5449 1
+3728	5506 1
+3728	5524 1
+3728	5775 1
+3728	5780 1
+3728	5828 1
+3728	5936 1
+3728	5994 1
+3728	6347 1
+3728	7855 1
+3728	7912 1
+3728	8294 1
+3728	8295 1
+3728	8296 1
+3729	1297 1
+3729	1307 1
+3729	1990 1
+3729	2066 1
+3729	2328 1
+3729	2775 1
+3729	2790 1
+3729	3562 1
+3729	4191 1
+3729	4811 1
+3729	5484 1
+3735	1297 1
+3735	1549 1
+3735	2210 1
+3730	1297 1
+3731	1297 1
+3731	1915 1
+3731	2411 1
+3731	2727 1
+3731	2974 1
+3731	3200 1
+3731	3480 1
+3731	3557 1
+3731	3646 1
+3731	3803 1
+3731	3804 1
+3731	3807 1
+3731	3822 1
+3731	4453 1
+3731	4480 1
+3742	1100 1
+3742	3443 1
+3742	3976 1
+3743	737 1
+3743	1100 1
+3743	1385 1
+3743	3443 1
+3743	3456 1
+3743	4297 1
+3743	4796 1
+3743	4962 1
+3743	5123 1
+3743	5133 1
+3744	3024 1
+3744	3745 1
+3746	2485 1
+3747	2485 1
+3747	3334 1
+3747	5790 1
+3747	6737 1
+3748	1688 1
+3748	2289 1
+3748	2354 1
+3748	2485 1
+3748	2516 1
+3748	2653 1
+3748	2696 1
+3748	2790 1
+3748	2871 1
+3748	2958 1
+3748	3026 1
+3748	3059 1
+3748	3192 1
+3748	3452 1
+3748	3456 1
+3748	3537 1
+3748	3796 1
+3748	3812 1
+3748	3854 1
+3748	4072 1
+3748	4124 1
+3748	4256 1
+3748	4261 1
+3748	4299 1
+3748	4557 1
+3748	4653 1
+3748	4677 1
+3748	4712 1
+3748	5026 1
+3748	5848 1
+3749	737 1
+3749	2485 1
+3749	2871 1
+3749	4037 1
+3750	2485 1
+3750	3007 1
+3751	15 1
+3751	2485 1
+3751	2619 1
+3751	3028 1
+3751	3946 1
+3751	4310 1
+3751	5178 1
+3751	5210 1
+3751	6337 1
+3751	8037 1
+3751	8295 1
+3752	2328 1
+3752	2485 1
+3752	2619 1
+3752	2871 1
+3752	3615 1
+3752	3962 1
+3752	4179 1
+3752	5412 1
+3752	5605 1
+3752	6241 1
+3752	7063 1
+3752	7662 1
+3752	7908 1
+3752	8073 1
+3752	8192 1
+3753	2485 1
+3754	2485 1
+3754	2565 1
+3754	2657 1
+3754	3026 1
+3754	3059 1
+3754	3800 1
+3679	2657 1
+3679	5886 1
+3757	2657 1
+3720	825 1
+3720	2066 1
+3720	2210 1
+3720	2657 1
+3720	3260 1
+3720	3562 1
+3720	3568 1
+3720	3615 1
+3720	4030 1
+3720	4183 1
+3720	8294 1
+3758	2657 1
+3759	2657 1
+3760	2657 1
+3761	2535 1
+3761	2657 1
+3762	2657 1
+3762	2900 1
+3762	2923 1
+3762	3394 1
+3762	3912 1
+3762	4323 1
+3762	4453 1
+3762	5288 1
+3763	2657 1
+3763	3452 1
+3763	3933 1
+3764	1549 1
+3764	2657 1
+3764	3769 1
+3764	5807 1
+3764	5922 1
+3764	6330 1
+3764	6790 1
+3764	6953 1
+3764	6955 1
+3764	6979 1
+3765	2411 1
+3766	2411 1
+3766	2790 1
+3766	3028 1
+3766	3034 1
+3766	3271 1
+3766	3453 1
+3766	3480 1
+3766	4646 1
+3766	4735 1
+3767	1385 1
+3767	2066 1
+3767	2210 1
+3767	2411 1
+3767	2565 1
+3767	3117 1
+3767	3192 1
+3767	3394 1
+3767	4110 1
+3767	4173 1
+3767	4384 1
+3767	4385 1
+3767	4403 1
+3767	4510 1
+3767	4529 1
+3767	8293 1
+3770	1403 1
+3770	1549 1
+3770	2210 1
+3770	2535 1
+3770	2746 1
+3770	2851 1
+3770	3180 1
+3770	3346 1
+3770	3769 1
+3770	3800 1
+3770	3808 1
+3770	4037 1
+3770	5432 1
+3770	5582 1
+3770	6503 1
+3770	6560 1
+3770	6736 1
+3770	6784 1
+3770	7214 1
+3770	7222 1
+3770	7295 1
+3770	7946 1
+3772	6930 1
+3771	3480 1
+3771	3643 1
+3771	3772 1
+3774	3776 1
+3775	2923 1
+3775	2958 1
+3775	3024 1
+3775	3180 1
+3775	3394 1
+3775	3720 1
+3775	3776 1
+3775	3970 1
+3775	3974 1
+3775	4218 1
+3775	6979 1
+3775	8294 1
+3777	1385 1
+3777	3568 1
+3777	3646 1
+3777	4297 1
+3777	4373 1
+3777	4384 1
+3777	4402 1
+3777	4413 1
+3777	4417 1
+3777	4424 1
+3777	5239 1
+3779	1024 1
+3779	3480 1
+3780	3480 1
+3780	3887 1
+3780	4110 1
+3781	3480 1
+3782	762 1
+3782	3480 1
+3782	4256 1
+3784	3480 1
+3783	3480 1
+3785	737 1
+3785	2398 1
+3785	2411 1
+3785	2565 1
+3785	2958 1
+3785	2981 1
+3785	3026 1
+3785	3276 1
+3785	3483 1
+3785	3562 1
+3785	4179 1
+3785	4189 1
+3785	4199 1
+3785	4666 1
+3785	4846 1
+3785	5200 1
+3785	5484 1
+3785	5693 1
+3786	15 1
+3786	608 1
+3786	737 1
+3786	825 1
+3786	1159 1
+3786	1453 1
+3786	1549 1
+3786	1777 1
+3786	2001 1
+3786	2066 1
+3786	2252 1
+3786	2258 1
+3786	2273 1
+3786	2277 1
+3786	2354 1
+3786	2398 1
+3786	2535 1
+3786	2576 1
+3786	2605 1
+3786	2746 1
+3786	2774 1
+3786	2958 1
+3786	3089 1
+3786	3260 1
+3786	3334 1
+3786	3456 1
+3786	3541 1
+3786	3562 1
+3786	3631 1
+3786	3897 1
+3786	3910 1
+3786	3946 1
+3786	3958 1
+3786	3967 1
+3786	4013 1
+3786	4037 1
+3786	4098 1
+3786	4127 1
+3786	4173 1
+3786	4191 1
+3786	4201 1
+3786	4310 1
+3786	4335 1
+3786	4530 1
+3786	4536 1
+3786	4574 1
+3786	4666 1
+3786	4712 1
+3786	4777 1
+3786	4795 1
+3786	4797 1
+3786	4964 1
+3786	5002 1
+3786	5020 1
+3786	5072 1
+3786	5155 1
+3786	5253 1
+3786	5254 1
+3786	5285 1
+3786	5288 1
+3786	5321 1
+3786	5341 1
+3786	5412 1
+3786	5423 1
+3786	5445 1
+3786	5452 1
+3786	5454 1
+3786	5463 1
+3786	5503 1
+3786	5514 1
+3786	5533 1
+3786	5545 1
+3786	5559 1
+3786	5624 1
+3786	5630 1
+3786	5651 1
+3786	5663 1
+3786	5683 1
+3786	5705 1
+3786	5721 1
+3786	5737 1
+3786	5760 1
+3786	5778 1
+3786	5780 1
+3786	5790 1
+3786	5828 1
+3786	5863 1
+3786	5936 1
+3786	5963 1
+3786	5973 1
+3786	6262 1
+3786	6311 1
+3786	6337 1
+3786	6567 1
+3786	6833 1
+3786	7632 1
+3786	8134 1
+3786	8293 1
+3786	8295 1
+2975	2974 1
+2975	3541 1
+3791	2974 1
+3787	15 1
+3787	72 1
+3787	155 1
+3787	346 1
+3787	737 1
+3787	762 1
+3787	1185 1
+3787	1305 1
+3787	1310 1
+3787	1360 1
+3787	1549 1
+3787	1680 1
+3787	1799 1
+3787	1982 1
+3787	2014 1
+3787	2129 1
+3787	2134 1
+3787	2145 1
+3787	2237 1
+3787	2252 1
+3787	2258 1
+3787	2326 1
+3787	2328 1
+3787	2354 1
+3787	2369 1
+3787	2398 1
+3787	2456 1
+3787	2506 1
+3787	2516 1
+3787	2517 1
+3787	2535 1
+3787	2565 1
+3787	2612 1
+3787	2619 1
+3787	2653 1
+3787	2658 1
+3787	2696 1
+3787	2727 1
+3787	2774 1
+3787	2785 1
+3787	2790 1
+3787	2871 1
+3787	2909 1
+3787	2958 1
+3787	3007 1
+3787	3014 1
+3787	3034 1
+3787	3073 1
+3787	3084 1
+3787	3089 1
+3787	3140 1
+3787	3191 1
+3787	3192 1
+3787	3260 1
+3787	3276 1
+3787	3291 1
+3787	3309 1
+3787	3321 1
+3787	3334 1
+3787	3346 1
+3787	3352 1
+3787	3393 1
+3787	3394 1
+3787	3439 1
+3787	3443 1
+3787	3454 1
+3787	3455 1
+3787	3456 1
+3787	3459 1
+3787	3460 1
+3787	3479 1
+3787	3537 1
+3787	3554 1
+3787	3557 1
+3787	3568 1
+3787	3631 1
+3787	3724 1
+3787	3748 1
+3787	3796 1
+3787	3813 1
+3787	3885 1
+3787	3897 1
+3787	3910 1
+3787	3958 1
+3787	3976 1
+3787	4011 1
+3787	4037 1
+3787	4040 1
+3787	4055 1
+3787	4099 1
+3787	4103 1
+3787	4124 1
+3787	4191 1
+3787	4247 1
+3787	4263 1
+3787	4266 1
+3787	4290 1
+3787	4315 1
+3787	4335 1
+3787	4349 1
+3787	4361 1
+3787	4365 1
+3787	4384 1
+3787	4400 1
+3787	4483 1
+3787	4530 1
+3787	4536 1
+3787	4551 1
+3787	4578 1
+3787	4613 1
+3787	4661 1
+3787	4666 1
+3787	4712 1
+3787	4713 1
+3787	4715 1
+3787	4735 1
+3787	4776 1
+3787	4777 1
+3787	4796 1
+3787	4797 1
+3787	4808 1
+3787	4811 1
+3787	4814 1
+3787	4820 1
+3787	4827 1
+3787	4828 1
+3787	4846 1
+3787	4875 1
+3787	4942 1
+3787	4953 1
+3787	4962 1
+3787	4977 1
+3787	4980 1
+3787	4999 1
+3787	5002 1
+3787	5022 1
+3787	5028 1
+3787	5055 1
+3787	5083 1
+3787	5148 1
+3787	5162 1
+3787	5233 1
+3787	5254 1
+3787	5263 1
+3787	5288 1
+3787	5305 1
+3787	5321 1
+3787	5327 1
+3787	5378 1
+3787	5392 1
+3787	5412 1
+3787	5415 1
+3787	5445 1
+3787	5449 1
+3787	5452 1
+3787	5454 1
+3787	5457 1
+3787	5482 1
+3787	5484 1
+3787	5529 1
+3787	5568 1
+3787	5582 1
+3787	5683 1
+3787	5684 1
+3787	5760 1
+3787	5784 1
+3787	5790 1
+3787	5798 1
+3787	5800 1
+3787	5804 1
+3787	5811 1
+3787	5814 1
+3787	5817 1
+3787	5828 1
+3787	5863 1
+3787	5902 1
+3787	5936 1
+3787	5963 1
+3787	5973 1
+3787	5994 1
+3787	6044 1
+3787	6156 1
+3787	6246 1
+3787	6251 1
+3787	6255 1
+3787	6262 1
+3787	6305 1
+3787	6306 1
+3787	6320 1
+3787	6328 1
+3787	6347 1
+3787	6388 1
+3787	6400 1
+3787	6560 1
+3787	6613 1
+3787	6634 1
+3787	6720 1
+3787	6934 1
+3787	6948 1
+3787	6979 1
+3787	7047 1
+3787	7054 1
+3787	7225 1
+3787	7277 1
+3787	7280 1
+3787	7378 1
+3787	7391 1
+3787	7422 1
+3787	7478 1
+3787	7497 1
+3787	7517 1
+3787	7529 1
+3787	7544 1
+3787	7553 1
+3787	7587 1
+3787	7620 1
+3787	7632 1
+3787	7699 1
+3787	7726 1
+3787	7788 1
+3787	7810 1
+3787	7899 1
+3787	7908 1
+3787	8083 1
+3787	8122 1
+3787	8124 1
+3787	8134 1
+3787	8141 1
+3787	8219 1
+3787	8224 1
+3787	8237 1
+3787	8295 1
+3792	72 1
+3792	762 1
+3792	2516 1
+3792	2727 1
+3792	3034 1
+3792	3238 1
+3792	3276 1
+3792	3456 1
+3792	4335 1
+3792	4578 1
+3792	4717 1
+3792	4828 1
+3792	4938 1
+3792	4999 1
+3792	5083 1
+3792	5215 1
+3792	5295 1
+3792	5484 1
+3792	5509 1
+3792	5714 1
+3792	6296 1
+3792	6305 1
+3792	6337 1
+3792	6347 1
+3792	6832 1
+3792	7073 1
+3792	8297 1
+3796	737 1
+3796	762 1
+3796	1648 1
+3796	1688 1
+3796	1733 1
+3796	1769 1
+3796	2144 1
+3796	2145 1
+3796	2237 1
+3796	2364 1
+3796	2381 1
+3796	2398 1
+3796	2516 1
+3796	2576 1
+3796	2592 1
+3796	2760 1
+3796	2775 1
+3796	2787 1
+3796	2811 1
+3796	2871 1
+3796	3002 1
+3796	3014 1
+3796	3034 1
+3796	3092 1
+3796	3274 1
+3796	3276 1
+3796	3284 1
+3796	3321 1
+3796	3352 1
+3796	3433 1
+3796	3447 1
+3796	3452 1
+3796	3453 1
+3796	3537 1
+3796	3568 1
+3796	3607 1
+3796	3615 1
+3796	3635 1
+3796	3664 1
+3796	3691 1
+3796	3724 1
+3796	3748 1
+3796	3755 1
+3796	3797 1
+3796	3813 1
+3796	3843 1
+3796	3854 1
+3796	3976 1
+3796	4040 1
+3796	4099 1
+3796	4124 1
+3796	4127 1
+3796	4191 1
+3796	4212 1
+3796	4261 1
+3796	4266 1
+3796	4297 1
+3796	4335 1
+3796	4482 1
+3796	4528 1
+3796	4531 1
+3796	4534 1
+3796	4547 1
+3796	4562 1
+3796	4574 1
+3796	4578 1
+3796	4587 1
+3796	4613 1
+3796	4653 1
+3796	4661 1
+3796	4666 1
+3796	4719 1
+3796	4735 1
+3796	4778 1
+3796	4792 1
+3796	4796 1
+3796	4814 1
+3796	4824 1
+3796	4827 1
+3796	4899 1
+3796	5020 1
+3796	5026 1
+3796	5055 1
+3796	5058 1
+3796	5061 1
+3796	5072 1
+3796	5073 1
+3796	5083 1
+3796	5092 1
+3796	5100 1
+3796	5106 1
+3796	5123 1
+3796	5130 1
+3796	5144 1
+3796	5182 1
+3796	5204 1
+3796	5226 1
+3796	5239 1
+3796	5301 1
+3796	5459 1
+3796	5683 1
+3796	5693 1
+3796	5737 1
+3796	5743 1
+3796	5775 1
+3796	5780 1
+3796	5828 1
+3796	5844 1
+3796	5848 1
+3796	5886 1
+3796	5891 1
+3796	5947 1
+3796	5963 1
+3795	3797 1
+3794	15 1
+3794	72 1
+3794	737 1
+3794	1769 1
+3794	2129 1
+3794	2237 1
+3794	2354 1
+3794	2456 1
+3794	2565 1
+3794	2592 1
+3794	2612 1
+3794	2696 1
+3794	3092 1
+3794	3284 1
+3794	3433 1
+3794	3443 1
+3794	3453 1
+3794	3537 1
+3794	3568 1
+3794	3748 1
+3794	3796 1
+3794	3797 1
+3794	3854 1
+3794	4189 1
+3794	4191 1
+3794	4247 1
+3794	4297 1
+3794	4335 1
+3794	4338 1
+3794	4361 1
+3794	4653 1
+3794	4712 1
+3794	4938 1
+3794	4953 1
+3794	5026 1
+3794	5072 1
+3794	5392 1
+3794	5423 1
+3794	5484 1
+3794	5511 1
+3794	5753 1
+3794	5818 1
+3794	5848 1
+3794	6148 1
+3794	6347 1
+3794	6832 1
+3798	465 1
+3798	825 1
+3798	1239 1
+3798	1688 1
+3798	2066 1
+3798	2210 1
+3798	2328 1
+3798	2508 1
+3798	2535 1
+3798	2859 1
+3798	3007 1
+3798	3028 1
+3798	3117 1
+3798	3180 1
+3798	3260 1
+3798	3586 1
+3798	3887 1
+3798	3969 1
+3798	4051 1
+3798	4485 1
+3798	5155 1
+3798	5178 1
+3798	6875 1
+3799	465 1
+3799	2585 1
+3799	3007 1
+3799	3028 1
+3799	3892 1
+3799	3903 1
+3800	3028 1
+3800	3454 1
+3800	3568 1
+3803	1060 1
+3803	1769 1
+3803	3748 1
+3803	4212 1
+3803	4551 1
+3803	4792 1
+3803	4797 1
+3803	4962 1
+3803	7101 1
+3803	7115 1
+3801	3803 1
+3802	465 1
+3802	3024 1
+3802	3084 1
+3802	3803 1
+3802	3892 1
+3802	3922 1
+3802	3926 1
+3802	3937 1
+3804	2066 1
+3804	2506 1
+3804	4021 1
+3804	4201 1
+3804	8294 1
+3805	3807 1
+3806	15 1
+3806	465 1
+3806	608 1
+3806	1473 1
+3806	1548 1
+3806	2134 1
+3806	2398 1
+3806	2565 1
+3806	2612 1
+3806	2775 1
+3806	2790 1
+3806	2871 1
+3806	3024 1
+3806	3144 1
+3806	3192 1
+3806	3291 1
+3806	3352 1
+3806	3447 1
+3806	3458 1
+3806	3554 1
+3806	3643 1
+3806	3807 1
+3806	3835 1
+3806	4041 1
+3806	4098 1
+3806	4138 1
+3806	4191 1
+3806	4263 1
+3806	4290 1
+3806	4299 1
+3806	4417 1
+3806	4463 1
+3806	4964 1
+3806	5072 1
+3806	5123 1
+3806	5327 1
+3806	5392 1
+3806	5423 1
+3806	5484 1
+3806	5511 1
+3806	5543 1
+3806	5639 1
+3806	5814 1
+3806	6566 1
+3806	6606 1
+3809	6634 1
+3809	8042 1
+3810	3811 1
+3812	15 1
+3812	825 1
+3812	1307 1
+3812	2145 1
+3812	2506 1
+3812	2595 1
+3812	2655 1
+3812	2746 1
+3812	2811 1
+3812	2822 1
+3812	2871 1
+3812	2909 1
+3812	2958 1
+3812	2981 1
+3812	3014 1
+3812	3024 1
+3812	3089 1
+3812	3125 1
+3812	3180 1
+3812	3258 1
+3812	3320 1
+3812	3352 1
+3812	3417 1
+3812	3717 1
+3812	3720 1
+3812	3816 1
+3812	3967 1
+3812	3976 1
+3812	4011 1
+3812	4012 1
+3812	4021 1
+3812	4024 1
+3812	4031 1
+3812	4043 1
+3812	4049 1
+3812	4051 1
+3812	4072 1
+3812	4088 1
+3812	4117 1
+3812	4448 1
+3812	4468 1
+3812	4578 1
+3812	4587 1
+3812	4600 1
+3812	4735 1
+3812	4811 1
+3812	5684 1
+3812	6337 1
+3812	6759 1
+3812	6946 1
+3812	8042 1
+3812	8293 1
+3812	8294 1
+3813	15 1
+3813	737 1
+3813	896 1
+3813	1307 1
+3813	2134 1
+3813	2258 1
+3813	2289 1
+3813	2381 1
+3813	2398 1
+3813	2516 1
+3813	2565 1
+3813	2605 1
+3813	2646 1
+3813	2653 1
+3813	2775 1
+3813	2831 1
+3813	3144 1
+3813	3192 1
+3813	3276 1
+3813	3313 1
+3813	3334 1
+3813	3346 1
+3813	3352 1
+3813	3394 1
+3813	3456 1
+3813	3537 1
+3813	3562 1
+3813	3568 1
+3813	3615 1
+3813	3645 1
+3813	3660 1
+3813	3661 1
+3813	3717 1
+3813	3724 1
+3813	3816 1
+3813	3873 1
+3813	3962 1
+3813	4012 1
+3813	4024 1
+3813	4031 1
+3813	4037 1
+3813	4055 1
+3813	4088 1
+3813	4138 1
+3813	4162 1
+3813	4179 1
+3813	4191 1
+3813	4256 1
+3813	4263 1
+3813	4269 1
+3813	4323 1
+3813	4335 1
+3813	4349 1
+3813	4359 1
+3813	4384 1
+3813	4424 1
+3813	4463 1
+3813	4480 1
+3813	4534 1
+3813	4536 1
+3813	4797 1
+3813	4964 1
+3813	5079 1
+3813	5106 1
+3813	5115 1
+3813	5132 1
+3813	5133 1
+3813	5146 1
+3813	5254 1
+3813	5404 1
+3813	5445 1
+3813	5454 1
+3813	5459 1
+3813	5527 1
+3813	5592 1
+3813	5683 1
+3813	5721 1
+3813	5739 1
+3813	5743 1
+3813	5780 1
+3813	5863 1
+3813	5882 1
+3813	5922 1
+3813	5963 1
+3813	6123 1
+3813	6156 1
+3813	6762 1
+3813	6832 1
+3813	6833 1
+3813	6914 1
+3813	7168 1
+3813	7632 1
+3813	7839 1
+3813	8294 1
+3814	825 1
+3814	1239 1
+3814	1307 1
+3814	2210 1
+3814	2252 1
+3814	2506 1
+3814	2653 1
+3814	2746 1
+3814	2859 1
+3814	2958 1
+3814	2981 1
+3814	3125 1
+3814	3144 1
+3814	3180 1
+3814	3258 1
+3814	3260 1
+3814	3313 1
+3814	3320 1
+3814	3346 1
+3814	3568 1
+3814	3615 1
+3814	3720 1
+3814	3800 1
+3814	3816 1
+3814	3822 1
+3814	3843 1
+3814	3967 1
+3814	4021 1
+3814	4024 1
+3814	4030 1
+3814	4031 1
+3814	4043 1
+3814	4051 1
+3814	4055 1
+3814	4088 1
+3814	4103 1
+3814	4110 1
+3814	4162 1
+3814	4173 1
+3814	4181 1
+3814	4269 1
+3814	4299 1
+3814	4386 1
+3814	4402 1
+3814	6624 1
+3814	8293 1
+3814	8294 1
+3815	465 1
+3815	2014 1
+3815	2114 1
+3815	2210 1
+3815	2276 1
+3815	2506 1
+3815	2544 1
+3815	2595 1
+3815	2655 1
+3815	3024 1
+3815	3260 1
+3815	3717 1
+3815	3812 1
+3815	3816 1
+3815	3922 1
+3815	4011 1
+3815	4021 1
+3815	4024 1
+3815	5721 1
+3815	5732 1
+3817	3200 1
+3823	3541 1
+3823	4735 1
+3824	3541 1
+3827	2900 1
+3827	4110 1
+3829	1935 1
+3830	15 1
+3830	737 1
+3830	1549 1
+3830	1935 1
+3830	2240 1
+3830	2516 1
+3830	2565 1
+3830	3014 1
+3830	3321 1
+3830	3456 1
+3830	3911 1
+3830	4191 1
+3830	4735 1
+3830	4796 1
+3830	5073 1
+3830	5100 1
+3830	5412 1
+3830	5463 1
+3830	5479 1
+3830	6098 1
+3821	1935 1
+3821	3007 1
+3832	1935 1
+3833	1935 1
+3833	2923 1
+3833	3892 1
+3834	2114 1
+3835	346 1
+3835	1799 1
+3835	2114 1
+3835	2354 1
+3835	2398 1
+3835	2456 1
+3835	3321 1
+3835	3334 1
+3835	3970 1
+3835	4037 1
+3835	4040 1
+3835	4044 1
+3835	4266 1
+3835	4335 1
+3835	4466 1
+3835	4588 1
+3835	4661 1
+3835	4706 1
+3835	4712 1
+3835	4795 1
+3835	4796 1
+3835	4797 1
+3835	4808 1
+3835	4814 1
+3835	4827 1
+3835	4962 1
+3835	5020 1
+3835	5335 1
+3835	5341 1
+3835	5430 1
+3835	5449 1
+3835	5454 1
+3835	5650 1
+3835	5922 1
+3835	6532 1
+3836	2114 1
+3837	2114 1
+3841	2923 1
+3839	2328 1
+3839	2544 1
+3839	2923 1
+3839	3014 1
+3839	3562 1
+3840	2923 1
+3842	608 1
+3842	778 1
+3842	1453 1
+3842	2508 1
+3842	2619 1
+3842	2923 1
+3842	3007 1
+3842	3024 1
+3842	3260 1
+3842	3404 1
+3842	3812 1
+3842	3926 1
+3842	3937 1
+3842	3946 1
+3842	3970 1
+3843	762 1
+3843	2565 1
+3843	3276 1
+3843	3443 1
+3843	3453 1
+3843	3455 1
+3843	3458 1
+3843	3847 1
+3843	3958 1
+3843	4266 1
+3843	4335 1
+3843	4448 1
+3843	4620 1
+3843	4792 1
+3843	4811 1
+3843	4820 1
+3843	5043 1
+3843	5058 1
+3844	3847 1
+3845	3554 1
+3845	3847 1
+3845	3887 1
+3845	4011 1
+3845	4315 1
+3845	4712 1
+3845	4824 1
+3845	5288 1
+3848	3849 1
+3850	2565 1
+3850	2655 1
+3851	2565 1
+3851	4138 1
+3854	15 1
+3854	737 1
+3854	1352 1
+3854	1473 1
+3854	1688 1
+3854	2066 1
+3854	2134 1
+3854	2237 1
+3854	2258 1
+3854	2328 1
+3854	2364 1
+3854	2398 1
+3854	2433 1
+3854	2516 1
+3854	2619 1
+3854	2653 1
+3854	2696 1
+3854	2764 1
+3854	2871 1
+3854	3024 1
+3854	3026 1
+3854	3034 1
+3854	3059 1
+3854	3089 1
+3854	3192 1
+3854	3238 1
+3854	3274 1
+3854	3276 1
+3854	3352 1
+3854	3404 1
+3854	3443 1
+3854	3447 1
+3854	3452 1
+3854	3456 1
+3854	3498 1
+3854	3537 1
+3854	3562 1
+3854	3607 1
+3854	3643 1
+3854	3748 1
+3854	3796 1
+3854	3813 1
+3854	3958 1
+3854	4040 1
+3854	4099 1
+3854	4124 1
+3854	4191 1
+3854	4199 1
+3854	4256 1
+3854	4297 1
+3854	4335 1
+3854	4485 1
+3854	4510 1
+3854	4530 1
+3854	4547 1
+3854	4578 1
+3854	4653 1
+3854	4706 1
+3854	4712 1
+3854	4814 1
+3854	4827 1
+3854	4828 1
+3854	4846 1
+3854	4884 1
+3854	4999 1
+3854	5026 1
+3854	5055 1
+3854	5061 1
+3854	5072 1
+3854	5285 1
+3854	5301 1
+3854	5412 1
+3854	5430 1
+3854	5445 1
+3854	5459 1
+3854	5463 1
+3854	5637 1
+3854	5651 1
+3854	5737 1
+3854	6098 1
+3854	6148 1
+3854	6699 1
+3855	1157 1
+3855	3404 1
+3855	3483 1
+3855	3615 1
+3855	4011 1
+3855	4335 1
+3858	3059 1
+3862	3059 1
+3862	3562 1
+3863	3026 1
+3863	3059 1
+3863	3192 1
+3863	3537 1
+3863	5308 1
+3864	3059 1
+3865	3059 1
+3865	4138 1
+3871	2237 1
+3871	2384 1
+3871	3321 1
+3871	4999 1
+3871	5162 1
+3869	2237 1
+3869	2384 1
+3869	3871 1
+3869	4600 1
+3869	4999 1
+3870	3871 1
+3870	3888 1
+3872	1307 1
+3872	2066 1
+3872	2210 1
+3872	2237 1
+3872	2328 1
+3872	2384 1
+3872	3321 1
+3872	3871 1
+3872	4162 1
+3872	4179 1
+3872	4269 1
+3872	4365 1
+3872	4999 1
+3872	5384 1
+3872	7553 1
+3873	3084 1
+3873	4712 1
+3873	5563 1
+3873	8038 1
+3648	608 1
+3648	778 1
+3648	827 1
+3648	3026 1
+3648	3084 1
+3648	3117 1
+3648	3483 1
+3648	3576 1
+3648	3887 1
+3876	3026 1
+3876	3117 1
+3876	4645 1
+3878	3117 1
+3877	737 1
+3877	1310 1
+3877	3117 1
+3877	3643 1
+3877	3792 1
+3877	3976 1
+3877	4266 1
+3877	5295 1
+3877	5484 1
+3877	5683 1
+3877	5772 1
+3877	6784 1
+3877	7092 1
+3881	3026 1
+3881	4335 1
+3882	1706 1
+3883	3483 1
+3885	3887 1
+3885	5466 1
+3886	3887 1
+3888	3892 1
+3889	3892 1
+3889	5499 1
+3890	1548 1
+3890	3892 1
+3890	4110 1
+3891	3892 1
+3894	3576 1
+3895	2307 1
+3897	2307 1
+3897	2565 1
+3897	3568 1
+3897	3898 1
+3897	4199 1
+3897	4335 1
+3897	4485 1
+3897	4551 1
+3897	4792 1
+3896	2307 1
+3900	3903 1
+3900	5818 1
+3900	5925 1
+3901	3903 1
+3902	737 1
+3902	1984 1
+3902	2144 1
+3902	2145 1
+3902	2326 1
+3902	2398 1
+3902	2517 1
+3902	2760 1
+3902	2790 1
+3902	3014 1
+3902	3034 1
+3902	3321 1
+3902	3352 1
+3902	3453 1
+3902	3455 1
+3902	3456 1
+3902	3460 1
+3902	3635 1
+3902	3835 1
+3902	3903 1
+3902	3956 1
+3902	3958 1
+3902	3976 1
+3902	4011 1
+3902	4212 1
+3902	4220 1
+3902	4261 1
+3902	4266 1
+3902	4466 1
+3902	4613 1
+3902	4646 1
+3902	4648 1
+3902	4661 1
+3902	4662 1
+3902	4666 1
+3902	4677 1
+3902	4735 1
+3902	4776 1
+3902	4778 1
+3902	4780 1
+3902	4797 1
+3902	4811 1
+3902	4815 1
+3904	2544 1
+3905	2289 1
+3905	2544 1
+3906	2544 1
+3907	2544 1
+3909	465 1
+3910	465 1
+3910	1026 1
+3910	2535 1
+3910	3334 1
+3910	3352 1
+3910	3456 1
+3910	3976 1
+3910	4037 1
+3910	4401 1
+3910	4735 1
+3910	5020 1
+3910	5022 1
+3910	5079 1
+3910	5123 1
+3910	5179 1
+3910	5254 1
+3910	5588 1
+3910	5773 1
+3910	5780 1
+3910	5799 1
+3910	6270 1
+3910	6628 1
+3910	6634 1
+3910	6897 1
+3910	6918 1
+3910	6946 1
+3910	7047 1
+3910	7094 1
+3910	7108 1
+3910	7478 1
+3910	7587 1
+3910	7620 1
+3910	8295 1
+3911	465 1
+3911	3643 1
+3912	465 1
+3912	2134 1
+3912	2508 1
+3912	2585 1
+3912	2746 1
+3912	2838 1
+3912	2932 1
+3912	3291 1
+3912	3615 1
+3912	3787 1
+3912	3937 1
+3912	4231 1
+3912	4247 1
+3912	4263 1
+3912	4269 1
+3912	4323 1
+3912	8293 1
+3916	72 1
+3916	2328 1
+3916	2585 1
+3916	2871 1
+3916	2958 1
+3916	3274 1
+3916	3586 1
+3916	3755 1
+3916	3796 1
+3916	4041 1
+3916	4099 1
+3916	4335 1
+3916	4536 1
+3916	4653 1
+3916	4709 1
+3916	4797 1
+3916	4875 1
+3916	4899 1
+3916	5020 1
+3916	5079 1
+3916	5176 1
+3916	5233 1
+3916	5285 1
+3916	5454 1
+3916	5459 1
+3916	5524 1
+3916	5605 1
+3916	5630 1
+3916	5639 1
+3916	5705 1
+3916	5714 1
+3916	5775 1
+3916	6083 1
+3916	6105 1
+3916	6123 1
+3916	6124 1
+3916	6555 1
+3916	6914 1
+3916	7063 1
+3916	7225 1
+3916	7620 1
+3916	7961 1
+3917	1729 1
+3917	1990 1
+3917	2014 1
+3917	2237 1
+3917	2328 1
+3917	2440 1
+3917	2456 1
+3917	2585 1
+3917	2646 1
+3917	3125 1
+3917	3144 1
+3917	3352 1
+3917	3568 1
+3917	3645 1
+3917	3787 1
+3917	3806 1
+3917	4201 1
+3917	4263 1
+3917	4384 1
+3917	4422 1
+3917	4485 1
+3917	4500 1
+3917	4687 1
+3917	4706 1
+3917	4735 1
+3917	4977 1
+3917	4999 1
+3917	5449 1
+3917	7553 1
+3918	2585 1
+3918	4335 1
+3918	5559 1
+3918	8294 1
+3919	1680 1
+3919	2585 1
+3919	3024 1
+3919	3614 1
+3919	4315 1
+3919	4547 1
+3919	4587 1
+3919	4687 1
+3919	4717 1
+3919	4795 1
+3919	5121 1
+3919	5188 1
+3919	5222 1
+3919	5288 1
+3919	6628 1
+3920	2585 1
+3920	2785 1
+3920	2871 1
+3920	2981 1
+3920	3787 1
+3920	6299 1
+3922	3191 1
+3922	4661 1
+3922	4779 1
+3922	5412 1
+3922	5947 1
+3922	6299 1
+3922	7295 1
+3923	1453 1
+3924	1453 1
+3924	2210 1
+3924	2508 1
+3924	3949 1
+3924	3967 1
+3925	1453 1
+3925	2653 1
+3925	3144 1
+3925	3634 1
+3925	3897 1
+3925	5210 1
+3925	8295 1
+3927	2508 1
+3928	2328 1
+3928	2508 1
+3929	2508 1
+3929	4875 1
+3930	15 1
+3930	2398 1
+3930	2508 1
+3930	4719 1
+3930	4875 1
+3931	2508 1
+3932	2508 1
+3932	4055 1
+3932	5626 1
+3932	6458 1
+3935	3937 1
+3936	3937 1
+3941	3942 1
+3943	608 1
+3944	608 1
+3947	2746 1
+3947	2958 1
+3947	3946 1
+3945	3946 1
+3945	4266 1
+3948	2134 1
+3948	2565 1
+3948	2619 1
+3948	2646 1
+3948	3144 1
+3948	3180 1
+3948	3260 1
+3948	3291 1
+3948	3631 1
+3948	3645 1
+3948	3720 1
+3948	3787 1
+3948	3812 1
+3948	3946 1
+3948	3970 1
+3948	4013 1
+3948	4110 1
+3948	4117 1
+3948	4138 1
+3948	4201 1
+3948	4233 1
+3948	4234 1
+3948	4247 1
+3948	4263 1
+3948	4297 1
+3948	8294 1
+3949	827 1
+3949	1239 1
+3949	2210 1
+3949	2384 1
+3949	2506 1
+3949	2595 1
+3949	2653 1
+3949	2655 1
+3949	2746 1
+3949	2859 1
+3949	2958 1
+3949	3258 1
+3949	3260 1
+3949	3562 1
+3949	3717 1
+3949	3720 1
+3949	3800 1
+3949	3812 1
+3949	3843 1
+3949	3967 1
+3949	3970 1
+3949	3980 1
+3949	4011 1
+3949	4021 1
+3949	4043 1
+3949	4055 1
+3949	4058 1
+3949	4162 1
+3949	4179 1
+3949	8294 1
+3952	3024 1
+3953	3024 1
+3954	3024 1
+3954	3260 1
+3955	3024 1
+3955	3720 1
+3955	4233 1
+3956	15 1
+3956	737 1
+3956	1157 1
+3956	1307 1
+3956	1549 1
+3956	1990 1
+3956	2066 1
+3956	2145 1
+3956	2160 1
+3956	2276 1
+3956	2364 1
+3956	2398 1
+3956	2535 1
+3956	2576 1
+3956	2760 1
+3956	2859 1
+3956	2900 1
+3956	2917 1
+3956	3024 1
+3956	3089 1
+3956	3180 1
+3956	3276 1
+3956	3320 1
+3956	3439 1
+3956	3452 1
+3956	3454 1
+3956	3455 1
+3956	3456 1
+3956	3461 1
+3956	3537 1
+3956	3568 1
+3956	3643 1
+3956	3645 1
+3956	3898 1
+3956	3958 1
+3956	3971 1
+3956	3976 1
+3956	3980 1
+3956	4011 1
+3956	4024 1
+3956	4031 1
+3956	4044 1
+3956	4072 1
+3956	4098 1
+3956	4124 1
+3956	4138 1
+3956	4219 1
+3956	4261 1
+3956	4290 1
+3956	4310 1
+3956	4323 1
+3956	4335 1
+3956	4365 1
+3956	4384 1
+3956	4402 1
+3956	4463 1
+3956	4468 1
+3956	4528 1
+3956	4531 1
+3956	4578 1
+3956	4795 1
+3956	4814 1
+3956	4831 1
+3956	4983 1
+3956	5022 1
+3956	5100 1
+3956	5130 1
+3956	5210 1
+3956	5321 1
+3956	5412 1
+3956	5484 1
+3956	5499 1
+3956	5539 1
+3956	5697 1
+3956	5775 1
+3956	5804 1
+3956	5871 1
+3956	5886 1
+3956	6337 1
+3956	6505 1
+3956	6570 1
+3956	6833 1
+3956	7063 1
+3956	7632 1
+3956	7651 1
+3958	2619 1
+3958	3897 1
+3958	4072 1
+3958	4099 1
+3958	4269 1
+3958	4485 1
+3958	4531 1
+3958	4689 1
+3958	5301 1
+3958	5605 1
+3958	5928 1
+3958	6123 1
+3958	6554 1
+3958	6774 1
+3958	7908 1
+3959	2535 1
+3959	2619 1
+3960	15 1
+3960	608 1
+3960	1473 1
+3960	2398 1
+3960	2516 1
+3960	2535 1
+3960	2619 1
+3960	2831 1
+3960	3806 1
+3960	4041 1
+3960	4099 1
+3960	4191 1
+3960	4453 1
+3960	5072 1
+3960	5254 1
+3960	5327 1
+3960	5392 1
+3960	5412 1
+3960	5423 1
+3960	5484 1
+3960	5543 1
+3960	5640 1
+3960	6560 1
+3961	1549 1
+3961	2210 1
+3961	2252 1
+3961	2535 1
+3961	2595 1
+3961	2619 1
+3961	2655 1
+3961	2746 1
+3961	3180 1
+3961	3800 1
+3961	3970 1
+3961	4011 1
+3961	4021 1
+3961	4024 1
+3961	4103 1
+3961	4110 1
+3962	2859 1
+3962	3260 1
+3962	4557 1
+3962	4886 1
+3964	3260 1
+3965	737 1
+3965	825 1
+3965	1549 1
+3965	1688 1
+3965	1769 1
+3965	2134 1
+3965	2144 1
+3965	2328 1
+3965	2398 1
+3965	2499 1
+3965	2535 1
+3965	2576 1
+3965	2646 1
+3965	2653 1
+3965	2774 1
+3965	2790 1
+3965	3027 1
+3965	3073 1
+3965	3260 1
+3965	3297 1
+3965	3321 1
+3965	3334 1
+3965	3352 1
+3965	3394 1
+3965	3454 1
+3965	3463 1
+3965	3568 1
+3965	3615 1
+3965	3645 1
+3965	3752 1
+3965	3969 1
+3965	3976 1
+3965	4065 1
+3965	4071 1
+3965	4191 1
+3965	4269 1
+3965	4299 1
+3965	4578 1
+3965	4687 1
+3965	4827 1
+3965	4875 1
+3965	5022 1
+3965	5079 1
+3965	5130 1
+3965	5178 1
+3965	5233 1
+3965	5288 1
+3965	5321 1
+3965	5437 1
+3965	5524 1
+3965	5527 1
+3965	5605 1
+3965	5802 1
+3965	5819 1
+3965	5822 1
+3965	5902 1
+3965	5932 1
+3965	5947 1
+3965	6006 1
+3965	6043 1
+3965	6044 1
+3965	6124 1
+3965	6148 1
+3965	6156 1
+3965	6174 1
+3965	6270 1
+3965	6306 1
+3965	6344 1
+3965	6414 1
+3965	6496 1
+3965	6552 1
+3965	6566 1
+3965	6832 1
+3965	6976 1
+3965	7101 1
+3965	7225 1
+3965	7422 1
+3965	7620 1
+3965	7632 1
+3965	7707 1
+3965	7788 1
+3965	7809 1
+3965	7961 1
+3965	8134 1
+3965	8168 1
+3965	8174 1
+3965	8209 1
+3965	8237 1
+3965	8294 1
+3963	3260 1
+3966	3967 1
+3957	3970 1
+3968	3970 1
+3969	15 1
+3969	72 1
+3969	737 1
+3969	1305 1
+3969	1385 1
+3969	1403 1
+3969	1680 1
+3969	1729 1
+3969	1799 1
+3969	2240 1
+3969	2328 1
+3969	2354 1
+3969	2433 1
+3969	2535 1
+3969	2565 1
+3969	2689 1
+3969	2774 1
+3969	2785 1
+3969	2790 1
+3969	2822 1
+3969	2940 1
+3969	3103 1
+3969	3125 1
+3969	3144 1
+3969	3291 1
+3969	3334 1
+3969	3346 1
+3969	3352 1
+3969	3452 1
+3969	3456 1
+3969	3537 1
+3969	3607 1
+3969	3615 1
+3969	3635 1
+3969	3661 1
+3969	3785 1
+3969	3835 1
+3969	3854 1
+3969	3897 1
+3969	3910 1
+3969	3970 1
+3969	4037 1
+3969	4040 1
+3969	4138 1
+3969	4191 1
+3969	4261 1
+3969	4266 1
+3969	4323 1
+3969	4331 1
+3969	4480 1
+3969	4485 1
+3969	4536 1
+3969	4587 1
+3969	4645 1
+3969	4662 1
+3969	4666 1
+3969	4706 1
+3969	4712 1
+3969	4719 1
+3969	4780 1
+3969	4792 1
+3969	4796 1
+3969	4809 1
+3969	4875 1
+3969	4940 1
+3969	4962 1
+3969	5012 1
+3969	5026 1
+3969	5058 1
+3969	5182 1
+3969	5231 1
+3969	5323 1
+3969	5351 1
+3969	5412 1
+3969	5484 1
+3969	5969 1
+3969	6481 1
+3969	6496 1
+3969	6665 1
+3969	6715 1
+3969	6721 1
+3969	6860 1
+3969	7040 1
+3969	7062 1
+3969	7214 1
+3969	7316 1
+3969	7553 1
+3969	7620 1
+3969	7624 1
+3969	7833 1
+3971	2535 1
+3971	3192 1
+3971	3458 1
+3971	3661 1
+3971	4098 1
+3971	5123 1
+3971	5524 1
+3973	1140 1
+3973	2134 1
+3973	2328 1
+3973	2859 1
+3973	2900 1
+3973	2932 1
+3973	3192 1
+3973	3276 1
+3973	3291 1
+3973	3394 1
+3973	3562 1
+3973	3615 1
+3973	3717 1
+3973	3787 1
+3973	3813 1
+3973	3898 1
+3973	4055 1
+3973	4138 1
+3973	4162 1
+3973	4179 1
+3973	4181 1
+3973	4191 1
+3973	4201 1
+3973	4216 1
+3973	4256 1
+3973	4263 1
+3973	4269 1
+3973	4272 1
+3973	4289 1
+3973	4290 1
+3973	4303 1
+3973	4311 1
+3973	4331 1
+3976	15 1
+3976	72 1
+3976	346 1
+3976	406 1
+3976	737 1
+3976	762 1
+3976	978 1
+3976	1305 1
+3976	1310 1
+3976	1549 1
+3976	1648 1
+3976	1984 1
+3976	2001 1
+3976	2144 1
+3976	2240 1
+3976	2276 1
+3976	2354 1
+3976	2364 1
+3976	2369 1
+3976	2398 1
+3976	2517 1
+3976	2535 1
+3976	2565 1
+3976	2589 1
+3976	2775 1
+3976	2790 1
+3976	2871 1
+3976	3014 1
+3976	3034 1
+3976	3089 1
+3976	3180 1
+3976	3271 1
+3976	3276 1
+3976	3334 1
+3976	3352 1
+3976	3455 1
+3976	3456 1
+3976	3459 1
+3976	3537 1
+3976	3643 1
+3976	3792 1
+3976	3796 1
+3976	3830 1
+3976	3897 1
+3976	3958 1
+3976	4037 1
+3976	4040 1
+3976	4110 1
+3976	4124 1
+3976	4127 1
+3976	4189 1
+3976	4191 1
+3976	4211 1
+3976	4212 1
+3976	4219 1
+3976	4220 1
+3976	4298 1
+3976	4335 1
+3976	4338 1
+3976	4401 1
+3976	4402 1
+3976	4500 1
+3976	4529 1
+3976	4536 1
+3976	4547 1
+3976	4551 1
+3976	4558 1
+3976	4562 1
+3976	4583 1
+3976	4584 1
+3976	4588 1
+3976	4621 1
+3976	4631 1
+3976	4650 1
+3976	4678 1
+3976	4684 1
+3976	4712 1
+3976	4717 1
+3976	4735 1
+3976	4776 1
+3976	4777 1
+3976	4780 1
+3976	4811 1
+3976	4828 1
+3976	4875 1
+3976	4954 1
+3976	4966 1
+3976	4977 1
+3976	5002 1
+3976	5020 1
+3976	5045 1
+3976	5075 1
+3976	5083 1
+3976	5123 1
+3976	5141 1
+3976	5199 1
+3976	5215 1
+3976	5233 1
+3976	5260 1
+3976	5267 1
+3976	5271 1
+3976	5285 1
+3976	5296 1
+3976	5303 1
+3976	5306 1
+3976	5327 1
+3976	5341 1
+3976	5364 1
+3976	5387 1
+3976	5388 1
+3976	5430 1
+3976	5463 1
+3976	5465 1
+3976	5481 1
+3976	5484 1
+3976	5509 1
+3976	5623 1
+3976	5635 1
+3976	5639 1
+3976	5664 1
+3976	5697 1
+3976	5800 1
+3976	5817 1
+3976	5860 1
+3976	5872 1
+3976	5886 1
+3976	5936 1
+3976	6009 1
+3976	6059 1
+3976	6083 1
+3976	6097 1
+3976	6098 1
+3976	6109 1
+3976	6130 1
+3976	6164 1
+3976	6257 1
+3976	6261 1
+3976	6269 1
+3976	6278 1
+3976	6755 1
+3976	6997 1
+3976	7185 1
+3976	7201 1
+3976	8295 1
+3976	8296 1
+3977	15 1
+3977	2066 1
+3977	2144 1
+3977	2398 1
+3977	2790 1
+3977	3562 1
+3977	3645 1
+3977	3720 1
+3977	3800 1
+3977	4030 1
+3977	4191 1
+3977	4256 1
+3977	4578 1
+3977	8294 1
+3978	3800 1
+3978	5818 1
+3979	2535 1
+3979	3800 1
+3979	4011 1
+3980	2328 1
+3980	4373 1
+3981	2535 1
+3987	2535 1
+3982	15 1
+3982	737 1
+3982	2276 1
+3982	2398 1
+3982	2535 1
+3982	2775 1
+3982	3089 1
+3982	3352 1
+3982	3456 1
+3982	3910 1
+3982	4037 1
+3982	4099 1
+3982	5079 1
+3982	5412 1
+3982	5902 1
+3982	6097 1
+3982	6337 1
+3982	6869 1
+3982	7115 1
+3982	7809 1
+3989	2535 1
+3989	5404 1
+3983	2535 1
+3983	4534 1
+3983	5452 1
+3983	7908 1
+3984	2535 1
+3984	4037 1
+3990	2535 1
+3985	15 1
+3985	1239 1
+3985	1498 1
+3985	2066 1
+3985	2511 1
+3985	2535 1
+3985	2655 1
+3985	2775 1
+3985	2811 1
+3985	2958 1
+3985	3140 1
+3985	3291 1
+3985	3454 1
+3985	3460 1
+3985	3498 1
+3985	3631 1
+3985	3634 1
+3985	3635 1
+3985	3830 1
+3985	4021 1
+3985	4037 1
+3985	4261 1
+3985	4335 1
+3985	4578 1
+3985	4661 1
+3985	4781 1
+3985	5002 1
+3985	5928 1
+3985	6296 1
+3985	6496 1
+3985	6553 1
+3985	7855 1
+3986	2535 1
+3991	1549 1
+3991	3320 1
+3991	3562 1
+3991	4024 1
+3991	4666 1
+3991	8293 1
+3991	8294 1
+3992	1549 1
+3992	4463 1
+3997	2746 1
+3998	2746 1
+3998	3664 1
+3999	2595 1
+3999	2746 1
+4000	2210 1
+4000	2746 1
+4000	3843 1
+4000	8293 1
+4001	737 1
+4001	1385 1
+4001	1729 1
+4001	1990 1
+4001	2145 1
+4001	2289 1
+4001	2746 1
+4001	3321 1
+4001	3394 1
+4001	3454 1
+4001	3568 1
+4001	3660 1
+4001	3976 1
+4001	4021 1
+4001	4037 1
+4001	4040 1
+4001	4127 1
+4001	4191 1
+4001	4219 1
+4001	4220 1
+4001	4261 1
+4001	4365 1
+4001	4536 1
+4001	4662 1
+4001	4678 1
+4001	4719 1
+4001	4811 1
+4001	4994 1
+3898	2746 1
+3898	2859 1
+4005	2595 1
+4006	2210 1
+4006	2655 1
+4007	2134 1
+4007	2210 1
+4007	2433 1
+4007	2655 1
+4007	2859 1
+4007	2900 1
+4007	3192 1
+4007	3258 1
+4007	3394 1
+4007	3562 1
+4007	3843 1
+4007	4043 1
+4007	4269 1
+4007	4290 1
+4007	8294 1
+4008	15 1
+4008	2655 1
+4008	3089 1
+4008	3276 1
+4008	4448 1
+4008	4780 1
+4008	5484 1
+4010	4011 1
+4013	15 1
+4013	346 1
+4013	896 1
+4013	1680 1
+4013	2066 1
+4013	2369 1
+4013	2535 1
+4013	2565 1
+4013	2909 1
+4013	4014 1
+4013	4138 1
+4013	4315 1
+4013	4712 1
+4013	5123 1
+4013	5215 1
+4013	5288 1
+4013	5412 1
+4013	5829 1
+4013	5863 1
+4013	6218 1
+4013	6789 1
+4016	2210 1
+4016	2384 1
+4015	15 1
+4015	2210 1
+4019	4021 1
+4019	4024 1
+4020	2328 1
+4020	2981 1
+4020	3192 1
+4020	4021 1
+4020	4256 1
+4020	4263 1
+4024	3898 1
+4024	4986 1
+4023	840 1
+4023	3720 1
+4023	4024 1
+4025	8293 1
+4026	3313 1
+4026	8293 1
+4027	2129 1
+4027	4162 1
+4027	4179 1
+4027	4384 1
+4027	4402 1
+4027	8293 1
+4028	8293 1
+4034	2072 1
+4034	3717 1
+4034	3843 1
+4034	4043 1
+4035	3717 1
+4036	15 1
+4036	155 1
+4036	825 1
+4036	1159 1
+4036	1239 1
+4036	1247 1
+4036	1305 1
+4036	1307 1
+4036	1310 1
+4036	1648 1
+4036	1769 1
+4036	2001 1
+4036	2066 1
+4036	2134 1
+4036	2258 1
+4036	2364 1
+4036	2384 1
+4036	2440 1
+4036	2506 1
+4036	2516 1
+4036	2576 1
+4036	2605 1
+4036	2653 1
+4036	2696 1
+4036	2775 1
+4036	2787 1
+4036	2831 1
+4036	2859 1
+4036	2958 1
+4036	2981 1
+4036	3000 1
+4036	3027 1
+4036	3103 1
+4036	3274 1
+4036	3276 1
+4036	3293 1
+4036	3352 1
+4036	3443 1
+4036	3456 1
+4036	3458 1
+4036	3562 1
+4036	3586 1
+4036	3607 1
+4036	3631 1
+4036	3717 1
+4036	3720 1
+4036	3796 1
+4036	3873 1
+4036	3885 1
+4036	3958 1
+4036	3969 1
+4036	4037 1
+4036	4088 1
+4036	4099 1
+4036	4138 1
+4036	4162 1
+4036	4175 1
+4036	4233 1
+4036	4335 1
+4036	4338 1
+4036	4341 1
+4036	4488 1
+4036	4530 1
+4036	4574 1
+4036	4600 1
+4036	4653 1
+4036	4712 1
+4036	4792 1
+4036	4797 1
+4036	4808 1
+4036	4929 1
+4036	4938 1
+4036	4953 1
+4036	4962 1
+4036	4981 1
+4036	4986 1
+4036	5022 1
+4036	5028 1
+4036	5037 1
+4036	5061 1
+4036	5072 1
+4036	5083 1
+4036	5189 1
+4036	5254 1
+4036	5288 1
+4036	5404 1
+4036	5423 1
+4036	5430 1
+4036	5445 1
+4036	5449 1
+4036	5452 1
+4036	5454 1
+4036	5459 1
+4036	5506 1
+4036	5509 1
+4036	5529 1
+4036	5543 1
+4036	5605 1
+4036	5614 1
+4036	5637 1
+4036	5650 1
+4036	5651 1
+4036	5680 1
+4036	5683 1
+4036	5693 1
+4036	5732 1
+4036	5737 1
+4036	5743 1
+4036	5780 1
+4036	5790 1
+4036	5814 1
+4036	5819 1
+4036	5827 1
+4036	5828 1
+4036	5835 1
+4036	5897 1
+4036	5925 1
+4036	5928 1
+4036	5936 1
+4036	5994 1
+4036	6044 1
+4036	6123 1
+4036	6148 1
+4036	6229 1
+4036	6417 1
+4036	6437 1
+4036	6566 1
+4036	6665 1
+4036	6780 1
+4036	6869 1
+4036	6907 1
+4036	6918 1
+4036	6946 1
+4036	7101 1
+4036	7381 1
+4036	7400 1
+4036	7414 1
+4036	7587 1
+4036	7620 1
+4036	7699 1
+4036	7860 1
+4036	8037 1
+4036	8042 1
+4036	8073 1
+4036	8128 1
+4036	8198 1
+4036	8294 1
+4037	15 1
+4037	825 1
+4037	1385 1
+4037	2014 1
+4037	2958 1
+4037	3498 1
+4037	3717 1
+4037	4138 1
+4037	4256 1
+4037	4402 1
+4037	5226 1
+4037	5693 1
+4037	6124 1
+4037	7699 1
+4037	8294 1
+4038	4043 1
+4040	15 1
+4040	72 1
+4040	737 1
+4040	967 1
+4040	1403 1
+4040	1688 1
+4040	1982 1
+4040	2144 1
+4040	2145 1
+4040	2237 1
+4040	2240 1
+4040	2277 1
+4040	2506 1
+4040	2535 1
+4040	2576 1
+4040	2605 1
+4040	2765 1
+4040	2790 1
+4040	2871 1
+4040	3089 1
+4040	3106 1
+4040	3321 1
+4040	3334 1
+4040	3352 1
+4040	3381 1
+4040	3454 1
+4040	3562 1
+4040	3586 1
+4040	3615 1
+4040	3635 1
+4040	3643 1
+4040	3748 1
+4040	3755 1
+4040	3796 1
+4040	3812 1
+4040	3910 1
+4040	3976 1
+4040	4011 1
+4040	4037 1
+4040	4043 1
+4040	4219 1
+4040	4266 1
+4040	4400 1
+4040	4401 1
+4040	4402 1
+4040	4529 1
+4040	4531 1
+4040	4578 1
+4040	4584 1
+4040	4678 1
+4040	4706 1
+4040	4735 1
+4040	4776 1
+4040	4778 1
+4040	4780 1
+4040	4811 1
+4040	4814 1
+4040	4827 1
+4040	4875 1
+4040	4966 1
+4040	4981 1
+4040	5020 1
+4040	5064 1
+4040	5123 1
+4040	5178 1
+4040	5288 1
+4040	5323 1
+4040	5404 1
+4040	5459 1
+4040	5559 1
+4040	5563 1
+4040	5693 1
+4040	5732 1
+4040	5743 1
+4040	5745 1
+4040	5757 1
+4040	5839 1
+4040	5991 1
+4040	6043 1
+4040	6269 1
+4040	6278 1
+4040	6709 1
+4040	6914 1
+4040	6934 1
+4040	6980 1
+4040	7005 1
+4040	7233 1
+4040	7280 1
+4040	7351 1
+4040	7443 1
+4040	7662 1
+4040	7788 1
+4040	7809 1
+4040	7871 1
+4040	8051 1
+4040	8174 1
+4040	8192 1
+4040	8198 1
+4040	8204 1
+4040	8212 1
+4040	8219 1
+4040	8224 1
+4040	8226 1
+4040	8294 1
+4039	825 1
+4039	2384 1
+4039	2653 1
+4039	2981 1
+4039	3562 1
+4039	4043 1
+4039	4055 1
+4039	4110 1
+4039	4162 1
+4041	15 1
+4041	737 1
+4041	1247 1
+4041	1972 1
+4041	2354 1
+4041	2381 1
+4041	3015 1
+4041	3089 1
+4041	3103 1
+4041	3276 1
+4041	3458 1
+4041	3460 1
+4041	3498 1
+4041	3554 1
+4041	3634 1
+4041	3643 1
+4041	3691 1
+4041	3796 1
+4041	3897 1
+4041	4043 1
+4041	4099 1
+4041	4124 1
+4041	4266 1
+4041	4298 1
+4041	4335 1
+4041	4355 1
+4041	4530 1
+4041	4653 1
+4041	4687 1
+4041	4712 1
+4041	4715 1
+4041	4719 1
+4041	4780 1
+4041	4792 1
+4041	4795 1
+4041	4827 1
+4041	4899 1
+4041	4938 1
+4041	4964 1
+4041	4987 1
+4041	5121 1
+4041	5141 1
+4041	5178 1
+4041	5200 1
+4041	5204 1
+4041	5210 1
+4041	5233 1
+4041	5239 1
+4041	5262 1
+4041	5375 1
+4041	5412 1
+4041	5439 1
+4041	5459 1
+4041	5559 1
+4041	5624 1
+4041	5650 1
+4041	5737 1
+4041	5829 1
+4041	5844 1
+4041	5886 1
+4041	5925 1
+4041	6098 1
+4041	6124 1
+4041	6255 1
+4041	6306 1
+4041	6337 1
+4041	6400 1
+4041	6739 1
+4042	825 1
+4042	1239 1
+4042	2066 1
+4042	2384 1
+4042	2653 1
+4042	2859 1
+4042	2932 1
+4042	2958 1
+4042	2981 1
+4042	3291 1
+4042	3615 1
+4042	3631 1
+4042	3787 1
+4042	4013 1
+4042	4043 1
+4042	4055 1
+4042	4162 1
+4042	4179 1
+4042	4201 1
+4042	4233 1
+4042	4247 1
+2981	15 1
+2981	608 1
+2981	737 1
+2981	1549 1
+2981	1799 1
+2981	1990 1
+2981	2145 1
+2981	2328 1
+2981	2653 1
+2981	2658 1
+2981	3238 1
+2981	3309 1
+2981	3321 1
+2981	3381 1
+2981	3447 1
+2981	3456 1
+2981	3460 1
+2981	3537 1
+2981	3568 1
+2981	3897 1
+2981	3910 1
+2981	4037 1
+2981	4043 1
+2981	4124 1
+2981	4162 1
+2981	4661 1
+2981	4662 1
+2981	5022 1
+2981	5073 1
+2981	5179 1
+2981	5430 1
+2981	5432 1
+2981	5459 1
+2981	5463 1
+2981	5886 1
+2981	5969 1
+2981	6555 1
+2981	6774 1
+2981	7120 1
+2981	7149 1
+2981	7381 1
+2981	7632 1
+2981	7778 1
+2981	8295 1
+4044	346 1
+4044	1305 1
+4044	1360 1
+4044	1688 1
+4044	1769 1
+4044	1961 1
+4044	1984 1
+4044	2145 1
+4044	2237 1
+4044	2240 1
+4044	2364 1
+4044	2398 1
+4044	2811 1
+4044	2871 1
+4044	2917 1
+4044	3014 1
+4044	3073 1
+4044	3089 1
+4044	3271 1
+4044	3321 1
+4044	3334 1
+4044	3352 1
+4044	3433 1
+4044	3447 1
+4044	3452 1
+4044	3453 1
+4044	3454 1
+4044	3455 1
+4044	3460 1
+4044	3537 1
+4044	3607 1
+4044	3724 1
+4044	3835 1
+4044	3843 1
+4044	3854 1
+4044	3898 1
+4044	3976 1
+4044	4011 1
+4044	4040 1
+4044	4047 1
+4044	4078 1
+4044	4191 1
+4044	4199 1
+4044	4216 1
+4044	4218 1
+4044	4219 1
+4044	4261 1
+4044	4266 1
+4044	4297 1
+4044	4335 1
+4044	4466 1
+4044	4468 1
+4044	4485 1
+4044	4529 1
+4044	4531 1
+4044	4551 1
+4044	4552 1
+4044	4557 1
+4044	4562 1
+4044	4578 1
+4044	4583 1
+4044	4588 1
+4044	4605 1
+4044	4613 1
+4044	4631 1
+4044	4639 1
+4044	4646 1
+4044	4648 1
+4044	4650 1
+4044	4666 1
+4044	4677 1
+4044	4678 1
+4044	4713 1
+4044	4719 1
+4044	4728 1
+4044	4778 1
+4044	4779 1
+4044	4780 1
+4044	4796 1
+4044	4809 1
+4044	4831 1
+4044	4875 1
+4044	4887 1
+4044	4938 1
+4044	4962 1
+4044	4987 1
+4044	4991 1
+4044	4993 1
+4044	5058 1
+4045	15 1
+4045	1159 1
+4045	1305 1
+4045	1310 1
+4045	1352 1
+4045	1360 1
+4045	1403 1
+4045	1473 1
+4045	1648 1
+4045	1680 1
+4045	1688 1
+4045	1733 1
+4045	1769 1
+4045	1972 1
+4045	2144 1
+4045	2145 1
+4045	2237 1
+4045	2240 1
+4045	2276 1
+4045	2364 1
+4045	2381 1
+4045	2433 1
+4045	2440 1
+4045	2456 1
+4045	2507 1
+4045	2511 1
+4045	2516 1
+4045	2517 1
+4045	2565 1
+4045	2592 1
+4045	2689 1
+4045	2696 1
+4045	2765 1
+4045	2775 1
+4045	2785 1
+4045	2787 1
+4045	2811 1
+4045	2851 1
+4045	2871 1
+4045	2925 1
+4045	3002 1
+4045	3015 1
+4045	3034 1
+4045	3073 1
+4045	3089 1
+4045	3092 1
+4045	3106 1
+4045	3125 1
+4045	3140 1
+4045	3144 1
+4045	3284 1
+4045	3291 1
+4045	3309 1
+4045	3321 1
+4045	3352 1
+4045	3433 1
+4045	3447 1
+4045	3452 1
+4045	3453 1
+4045	3455 1
+4045	3498 1
+4045	3537 1
+4045	3586 1
+4045	3607 1
+4045	3614 1
+4045	3635 1
+4045	3643 1
+4045	3645 1
+4045	3664 1
+4045	3724 1
+4045	3726 1
+4045	3748 1
+4045	3785 1
+4045	3796 1
+4045	3803 1
+4045	3806 1
+4045	3812 1
+4045	3843 1
+4045	3854 1
+4045	3873 1
+4045	3897 1
+4045	3898 1
+4045	3919 1
+4045	3956 1
+4045	3958 1
+4045	4037 1
+4045	4040 1
+4045	4041 1
+4045	4047 1
+4045	4072 1
+4045	4099 1
+4045	4103 1
+4045	4124 1
+4045	4175 1
+4045	4212 1
+4045	4261 1
+4045	4266 1
+4045	4297 1
+4045	4299 1
+4045	4310 1
+4045	4315 1
+4045	4338 1
+4045	4417 1
+4045	4453 1
+4045	4463 1
+4045	4485 1
+4045	4500 1
+4045	4510 1
+4045	4521 1
+4045	4527 1
+4045	4528 1
+4045	4534 1
+4045	4536 1
+4045	4547 1
+4045	4551 1
+4045	4552 1
+4045	4574 1
+4045	4578 1
+4045	4588 1
+4045	4613 1
+4045	4646 1
+4045	4661 1
+4045	4666 1
+4045	4687 1
+4045	4689 1
+4045	4706 1
+4045	4712 1
+4045	4715 1
+4045	4717 1
+4045	4719 1
+4045	4748 1
+4045	4781 1
+4045	4792 1
+4045	4795 1
+4045	4796 1
+4045	4798 1
+4045	4808 1
+4045	4811 1
+4045	4814 1
+4045	4827 1
+4045	4828 1
+4045	4879 1
+4045	4899 1
+4045	4938 1
+4045	4944 1
+4045	4953 1
+4045	4994 1
+4045	4999 1
+4045	5002 1
+4045	5026 1
+4045	5055 1
+4045	5061 1
+4045	5072 1
+4045	5073 1
+4045	5092 1
+4045	5100 1
+4045	5103 1
+4045	5106 1
+4045	5121 1
+4045	5123 1
+4045	5130 1
+4045	5132 1
+4045	5140 1
+4045	5144 1
+4045	5182 1
+4045	5188 1
+4045	5204 1
+4045	5215 1
+4045	5222 1
+4045	5226 1
+4045	5262 1
+4045	5273 1
+4045	5288 1
+4045	5301 1
+4045	5404 1
+4045	5437 1
+4045	5439 1
+4045	5445 1
+4045	5479 1
+4045	5484 1
+4045	5524 1
+4045	5527 1
+4045	5543 1
+4045	5545 1
+4045	5563 1
+4045	5584 1
+4045	5624 1
+4045	5680 1
+4045	5684 1
+4045	5739 1
+4045	5753 1
+4045	5773 1
+4045	5775 1
+4045	5776 1
+4045	5780 1
+4045	5790 1
+4045	5799 1
+4045	5814 1
+4045	5818 1
+4045	5822 1
+4045	5827 1
+4045	5844 1
+4045	5848 1
+4045	5886 1
+4045	5891 1
+4045	5925 1
+4045	5928 1
+4045	5932 1
+4045	5947 1
+4045	5998 1
+4045	6006 1
+4045	6029 1
+4045	6097 1
+4045	6098 1
+4045	6124 1
+4045	6148 1
+4045	6156 1
+4045	6166 1
+4045	6229 1
+4045	6327 1
+4045	6337 1
+4045	6432 1
+4045	6437 1
+4045	6441 1
+4045	6481 1
+4045	6496 1
+4045	6501 1
+4045	6505 1
+4045	6528 1
+4045	6552 1
+4045	6553 1
+4045	6554 1
+4045	6566 1
+4045	6570 1
+4045	6576 1
+4045	6589 1
+4045	6594 1
+4045	6600 1
+4045	6624 1
+4045	6632 1
+4045	6699 1
+4045	6725 1
+4045	6765 1
+4045	6774 1
+4045	6790 1
+4045	6901 1
+4045	6930 1
+4045	7073 1
+4045	7101 1
+4045	7108 1
+4045	7115 1
+4045	7119 1
+4045	7143 1
+4045	7144 1
+4045	7162 1
+4045	7214 1
+4045	8295 1
+4046	840 1
+4046	1026 1
+4046	1403 1
+4046	1769 1
+4046	2326 1
+4046	2342 1
+4046	2511 1
+4046	2517 1
+4046	2565 1
+4046	2785 1
+4046	2787 1
+4046	2790 1
+4046	2871 1
+4046	3002 1
+4046	3276 1
+4046	3334 1
+4046	3346 1
+4046	3352 1
+4046	3452 1
+4046	3453 1
+4046	3458 1
+4046	3459 1
+4046	3748 1
+4046	3835 1
+4046	3885 1
+4046	3958 1
+4046	4011 1
+4046	4037 1
+4046	4040 1
+4046	4047 1
+4046	4103 1
+4046	4189 1
+4046	4212 1
+4046	4298 1
+4046	4361 1
+4046	4558 1
+4046	4661 1
+4046	4666 1
+4046	4678 1
+4046	4706 1
+4046	4811 1
+4046	4820 1
+4046	4875 1
+4046	4929 1
+4046	4993 1
+4046	4999 1
+4046	5012 1
+4046	5083 1
+4046	5233 1
+4046	5288 1
+4046	5289 1
+4046	5384 1
+4046	5432 1
+4046	5484 1
+4046	5500 1
+4046	5582 1
+4046	5773 1
+4046	5801 1
+4046	5811 1
+4046	5814 1
+4046	5902 1
+4046	6241 1
+4046	6270 1
+4046	6320 1
+4046	6414 1
+4046	6523 1
+4046	6560 1
+4046	6596 1
+4046	6634 1
+4046	6714 1
+4046	6736 1
+4046	6917 1
+4046	6980 1
+4046	6994 1
+4046	7088 1
+4046	7092 1
+4046	7108 1
+4046	7168 1
+4046	7185 1
+4046	7254 1
+4046	7257 1
+4046	7295 1
+4046	7373 1
+4046	7381 1
+4046	7400 1
+4046	7620 1
+4046	7675 1
+4046	7683 1
+4046	7890 1
+4048	4049 1
+4051	4510 1
+4050	4051 1
+4053	2384 1
+4053	2506 1
+4055	2506 1
+4055	5106 1
+4055	6347 1
+4056	1024 1
+4056	1157 1
+4056	1385 1
+4056	2506 1
+4056	2787 1
+4056	2790 1
+4056	2871 1
+4056	3106 1
+4056	3452 1
+4056	3458 1
+4056	3835 1
+4056	4055 1
+4056	4110 1
+4056	4162 1
+4056	4234 1
+4056	4424 1
+4056	4453 1
+4056	4463 1
+4056	4808 1
+4056	4820 1
+4056	5055 1
+4056	5963 1
+4056	8294 1
+4057	2506 1
+4059	2398 1
+4059	2775 1
+4059	3562 1
+4059	5760 1
+4061	3562 1
+4062	1990 1
+4062	3125 1
+4062	3562 1
+4062	4578 1
+4063	737 1
+4063	1990 1
+4063	2144 1
+4063	2917 1
+4063	2925 1
+4063	3125 1
+4063	3447 1
+4063	3454 1
+4063	3562 1
+4063	3568 1
+4063	3645 1
+4063	4072 1
+4063	4191 1
+4063	4299 1
+4063	4310 1
+4063	4335 1
+4063	4689 1
+4063	4735 1
+4063	5123 1
+4063	5178 1
+4063	5262 1
+4063	5412 1
+4063	5545 1
+4063	5697 1
+4063	6098 1
+4063	6305 1
+4063	6634 1
+4077	608 1
+4077	737 1
+4077	762 1
+4077	1247 1
+4077	1305 1
+4077	1799 1
+4077	2014 1
+4077	2145 1
+4077	2237 1
+4077	2328 1
+4077	2354 1
+4077	2364 1
+4077	2381 1
+4077	2517 1
+4077	2565 1
+4077	2592 1
+4077	2653 1
+4077	2696 1
+4077	2811 1
+4077	2822 1
+4077	2831 1
+4077	3027 1
+4077	3034 1
+4077	3092 1
+4077	3103 1
+4077	3334 1
+4077	3352 1
+4077	3433 1
+4077	3447 1
+4077	3454 1
+4077	3456 1
+4077	3460 1
+4077	3537 1
+4077	3562 1
+4077	3568 1
+4077	3635 1
+4077	3645 1
+4077	3812 1
+4077	3813 1
+4077	3897 1
+4077	3910 1
+4077	4044 1
+4077	4191 1
+4077	4247 1
+4077	4266 1
+4077	4297 1
+4077	4384 1
+4077	4400 1
+4077	4448 1
+4077	4463 1
+4077	4480 1
+4077	4528 1
+4077	4529 1
+4077	4547 1
+4077	4613 1
+4077	4666 1
+4077	4712 1
+4077	4735 1
+4077	4811 1
+4077	4828 1
+4077	4929 1
+4077	4964 1
+4077	4977 1
+4077	5100 1
+4077	5106 1
+4077	5130 1
+4077	5132 1
+4077	5155 1
+4077	5204 1
+4077	5222 1
+4077	5308 1
+4077	5392 1
+4077	5412 1
+4077	5430 1
+4077	5449 1
+4077	5463 1
+4077	5513 1
+4078	1239 1
+4078	3562 1
+4064	3562 1
+4065	762 1
+4065	825 1
+4065	896 1
+4065	1185 1
+4065	1239 1
+4065	1305 1
+4065	1310 1
+4065	1688 1
+4065	1729 1
+4065	1769 1
+4065	1990 1
+4065	2014 1
+4065	2129 1
+4065	2134 1
+4065	2144 1
+4065	2289 1
+4065	2328 1
+4065	2565 1
+4065	2612 1
+4065	2620 1
+4065	2646 1
+4065	2653 1
+4065	2760 1
+4065	2775 1
+4065	2787 1
+4065	2859 1
+4065	2871 1
+4065	2932 1
+4065	2958 1
+4065	2981 1
+4065	3002 1
+4065	3015 1
+4065	3125 1
+4065	3140 1
+4065	3144 1
+4065	3309 1
+4065	3346 1
+4065	3433 1
+4065	3439 1
+4065	3443 1
+4065	3447 1
+4065	3452 1
+4065	3453 1
+4065	3454 1
+4065	3562 1
+4065	3568 1
+4065	3607 1
+4065	3615 1
+4065	3634 1
+4065	3643 1
+4065	3645 1
+4065	3661 1
+4065	3724 1
+4065	3792 1
+4065	3809 1
+4065	3830 1
+4065	3843 1
+4065	3854 1
+4065	3873 1
+4065	3898 1
+4065	3956 1
+4065	3958 1
+4065	4011 1
+4065	4013 1
+4065	4055 1
+4065	4072 1
+4065	4162 1
+4065	4179 1
+4065	4181 1
+4065	4201 1
+4065	4216 1
+4065	4218 1
+4065	4263 1
+4065	4269 1
+4065	4290 1
+4065	4299 1
+4065	4331 1
+4065	4365 1
+4065	4373 1
+4065	4402 1
+4065	4417 1
+4065	4422 1
+4065	4424 1
+4065	4453 1
+4065	4463 1
+4065	4468 1
+4065	4485 1
+4065	4510 1
+4065	4529 1
+4065	4531 1
+4065	4536 1
+4065	4551 1
+4065	4578 1
+4065	4604 1
+4065	4613 1
+4065	4620 1
+4065	4666 1
+4065	4713 1
+4065	4791 1
+4065	4792 1
+4065	4938 1
+4065	4962 1
+4065	4999 1
+4065	5026 1
+4065	5037 1
+4065	5178 1
+4065	5263 1
+4065	5415 1
+4065	5543 1
+4065	5584 1
+4065	5624 1
+4065	5760 1
+4065	5800 1
+4065	5871 1
+4065	5932 1
+4065	5950 1
+4065	5998 1
+4065	6004 1
+4065	6097 1
+4065	6323 1
+4065	6528 1
+4065	6560 1
+4065	6699 1
+4065	6770 1
+4065	6803 1
+4065	6832 1
+4065	6946 1
+4065	7052 1
+4065	7094 1
+4065	7280 1
+4065	7351 1
+4066	3352 1
+4066	3439 1
+4066	3562 1
+4066	3568 1
+4066	4480 1
+4067	3562 1
+4068	2066 1
+4068	3346 1
+4068	3562 1
+4068	4323 1
+4068	4448 1
+4068	4528 1
+4069	3562 1
+4079	3562 1
+4079	4055 1
+4079	4179 1
+4079	4181 1
+4070	72 1
+4070	222 1
+4070	896 1
+4070	1159 1
+4070	1305 1
+4070	1385 1
+4070	1648 1
+4070	1680 1
+4070	1733 1
+4070	2001 1
+4070	2258 1
+4070	2354 1
+4070	2364 1
+4070	2516 1
+4070	2565 1
+4070	2576 1
+4070	2605 1
+4070	2646 1
+4070	2653 1
+4070	2775 1
+4070	2822 1
+4070	2859 1
+4070	2909 1
+4070	2917 1
+4070	2958 1
+4070	2981 1
+4070	3092 1
+4070	3103 1
+4070	3106 1
+4070	3144 1
+4070	3274 1
+4070	3276 1
+4070	3284 1
+4070	3417 1
+4070	3455 1
+4070	3458 1
+4070	3562 1
+4070	3586 1
+4070	3691 1
+4070	3796 1
+4070	3808 1
+4070	3958 1
+4070	4044 1
+4070	4127 1
+4070	4175 1
+4070	4189 1
+4070	4276 1
+4070	4297 1
+4070	4299 1
+4070	4335 1
+4070	4338 1
+4070	4400 1
+4070	4417 1
+4070	4422 1
+4070	4424 1
+4070	4448 1
+4070	4453 1
+4070	4463 1
+4070	4468 1
+4070	4480 1
+4070	4482 1
+4070	4530 1
+4070	4534 1
+4070	4536 1
+4070	4547 1
+4070	4587 1
+4070	4645 1
+4070	4797 1
+4070	4828 1
+4070	4899 1
+4070	5020 1
+4070	5026 1
+4070	5055 1
+4070	5061 1
+4070	5083 1
+4070	5100 1
+4070	5106 1
+4070	5182 1
+4070	5204 1
+4070	5222 1
+4070	5226 1
+4070	5245 1
+4070	5263 1
+4070	5288 1
+4070	5305 1
+4070	5308 1
+4070	5321 1
+4070	5323 1
+4070	5327 1
+4070	5341 1
+4070	5445 1
+4070	5449 1
+4070	5454 1
+4070	5459 1
+4070	5543 1
+4070	5683 1
+4070	5693 1
+4070	5706 1
+4070	5721 1
+4070	5732 1
+4070	5737 1
+4070	5756 1
+4070	5775 1
+4070	5784 1
+4070	5790 1
+4070	5828 1
+4070	5863 1
+4070	5872 1
+4070	5936 1
+4070	5963 1
+4070	5994 1
+4071	15 1
+4071	1473 1
+4071	2507 1
+4071	2822 1
+4071	3192 1
+4071	3460 1
+4071	3562 1
+4071	3910 1
+4071	4483 1
+4071	5412 1
+4071	5684 1
+4071	5775 1
+4071	6296 1
+4071	6930 1
+4071	7092 1
+4071	7553 1
+4071	7632 1
+4072	72 1
+4072	346 1
+4072	762 1
+4072	1549 1
+4072	1769 1
+4072	2237 1
+4072	2240 1
+4072	2326 1
+4072	2696 1
+4072	2760 1
+4072	2790 1
+4072	2859 1
+4072	3334 1
+4072	3352 1
+4072	3557 1
+4072	3562 1
+4072	3643 1
+4072	3812 1
+4072	3898 1
+4072	4191 1
+4072	4298 1
+4072	4335 1
+4072	4578 1
+4072	4588 1
+4072	4621 1
+4072	4735 1
+4072	4811 1
+4072	4820 1
+4072	4938 1
+4073	15 1
+4073	72 1
+4073	825 1
+4073	896 1
+4073	1239 1
+4073	1307 1
+4073	1972 1
+4073	1990 1
+4073	2134 1
+4073	2144 1
+4073	2276 1
+4073	2381 1
+4073	2386 1
+4073	2398 1
+4073	2516 1
+4073	2535 1
+4073	2592 1
+4073	2653 1
+4073	2765 1
+4073	2775 1
+4073	2790 1
+4073	2811 1
+4073	2859 1
+4073	2871 1
+4073	3014 1
+4073	3191 1
+4073	3192 1
+4073	3274 1
+4073	3284 1
+4073	3443 1
+4073	3447 1
+4073	3452 1
+4073	3453 1
+4073	3454 1
+4073	3455 1
+4073	3456 1
+4073	3537 1
+4073	3562 1
+4073	3614 1
+4073	3634 1
+4073	3643 1
+4073	3645 1
+4073	3724 1
+4073	3796 1
+4073	3808 1
+4073	3835 1
+4073	3854 1
+4073	3897 1
+4073	4041 1
+4073	4068 1
+4073	4099 1
+4073	4124 1
+4073	4181 1
+4073	4189 1
+4073	4191 1
+4073	4199 1
+4073	4211 1
+4073	4256 1
+4073	4266 1
+4073	4297 1
+4073	4298 1
+4073	4310 1
+4073	4315 1
+4073	4323 1
+4073	4400 1
+4073	4448 1
+4073	4530 1
+4073	4547 1
+4073	4551 1
+4073	4687 1
+4073	4735 1
+4073	4776 1
+4073	4824 1
+4073	4828 1
+4073	4929 1
+4073	4964 1
+4073	5061 1
+4073	5130 1
+4073	5140 1
+4073	5178 1
+4073	5189 1
+4073	5200 1
+4073	5226 1
+4073	5233 1
+4073	5255 1
+4073	5263 1
+4073	5274 1
+4073	5312 1
+4073	5412 1
+4073	5430 1
+4073	5452 1
+4073	5457 1
+4073	5467 1
+4073	5470 1
+4073	5637 1
+4073	5651 1
+4073	5891 1
+4073	6098 1
+4073	6105 1
+4073	6218 1
+4073	6327 1
+4073	6360 1
+4073	6388 1
+4073	6400 1
+4073	6417 1
+4073	6422 1
+4073	6424 1
+4073	6437 1
+4073	6472 1
+4073	6474 1
+4073	6481 1
+4073	6498 1
+4073	6505 1
+4073	6553 1
+4073	6570 1
+4074	1157 1
+4074	1385 1
+4074	1729 1
+4074	1990 1
+4074	2066 1
+4074	2129 1
+4074	2328 1
+4074	2565 1
+4074	2653 1
+4074	2696 1
+4074	2760 1
+4074	2859 1
+4074	2871 1
+4074	2958 1
+4074	3276 1
+4074	3346 1
+4074	3439 1
+4074	3562 1
+4074	3645 1
+4074	3660 1
+4074	3661 1
+4074	3664 1
+4074	4011 1
+4074	4138 1
+4074	4191 1
+4074	4199 1
+4074	4297 1
+4074	4323 1
+4074	4384 1
+4074	4402 1
+4074	4417 1
+4074	4424 1
+4074	4547 1
+4075	3562 1
+4080	3720 1
+4083	8294 1
+4082	1385 1
+4082	2398 1
+4082	3456 1
+4082	3897 1
+4082	5182 1
+4082	5245 1
+4082	5463 1
+4082	5680 1
+4082	5784 1
+4082	5790 1
+4082	5837 1
+4082	5848 1
+4082	5863 1
+4082	5963 1
+4082	8294 1
+4085	4086 1
+4089	1307 1
+4089	3309 1
+4089	3453 1
+4090	1307 1
+4091	1307 1
+4092	1307 1
+4095	825 1
+4095	4110 1
+4096	825 1
+4097	825 1
+4098	825 1
+4098	3568 1
+4098	3897 1
+4098	4201 1
+4098	4218 1
+4098	4266 1
+4098	4269 1
+4098	4485 1
+4100	825 1
+4099	15 1
+4099	72 1
+4099	346 1
+4099	737 1
+4099	825 1
+4099	1026 1
+4099	1385 1
+4099	1548 1
+4099	1549 1
+4099	1984 1
+4099	2160 1
+4099	2240 1
+4099	2258 1
+4099	2326 1
+4099	2354 1
+4099	2369 1
+4099	2398 1
+4099	2516 1
+4099	2535 1
+4099	2592 1
+4099	2774 1
+4099	2775 1
+4099	2790 1
+4099	2925 1
+4099	3089 1
+4099	3092 1
+4099	3191 1
+4099	3238 1
+4099	3271 1
+4099	3274 1
+4099	3291 1
+4099	3334 1
+4099	3417 1
+4099	3452 1
+4099	3453 1
+4099	3455 1
+4099	3456 1
+4099	3459 1
+4099	3460 1
+4099	3498 1
+4099	3634 1
+4099	3635 1
+4099	3643 1
+4099	3755 1
+4099	3796 1
+4099	3830 1
+4099	3843 1
+4099	3897 1
+4099	3910 1
+4099	3958 1
+4099	4041 1
+4099	4110 1
+4099	4233 1
+4099	4335 1
+4099	4355 1
+4099	4361 1
+4099	4466 1
+4099	4483 1
+4099	4530 1
+4099	4536 1
+4099	4547 1
+4099	4645 1
+4099	4661 1
+4099	4662 1
+4099	4666 1
+4099	4677 1
+4099	4712 1
+4099	4713 1
+4099	4715 1
+4099	4728 1
+4099	4776 1
+4099	4778 1
+4099	4780 1
+4099	4781 1
+4099	4811 1
+4099	4822 1
+4099	4828 1
+4099	4831 1
+4099	4846 1
+4099	4875 1
+4099	4884 1
+4099	4899 1
+4099	4977 1
+4099	4993 1
+4099	5022 1
+4099	5028 1
+4099	5033 1
+4099	5058 1
+4099	5083 1
+4099	5100 1
+4099	5123 1
+4099	5176 1
+4099	5178 1
+4099	5188 1
+4099	5189 1
+4099	5204 1
+4099	5208 1
+4099	5210 1
+4099	5215 1
+4099	5226 1
+4099	5233 1
+4099	5262 1
+4099	5263 1
+4099	5321 1
+4099	5412 1
+4099	5423 1
+4099	5449 1
+4099	5459 1
+4099	5463 1
+4099	5484 1
+4099	5524 1
+4099	5527 1
+4099	5545 1
+4099	5563 1
+4099	5605 1
+4099	5624 1
+4099	5637 1
+4099	5671 1
+4099	5680 1
+4099	5684 1
+4099	5697 1
+4099	5714 1
+4099	5743 1
+4099	5760 1
+4099	5800 1
+4099	5818 1
+4099	5827 1
+4099	5828 1
+4099	5871 1
+4099	5886 1
+4099	5897 1
+4099	5902 1
+4099	6006 1
+4099	6123 1
+4099	6124 1
+4099	6299 1
+4099	6306 1
+4099	6437 1
+4099	6481 1
+4099	6505 1
+4099	6566 1
+4099	6596 1
+4099	6714 1
+4099	6770 1
+4099	6789 1
+4099	6890 1
+4099	6913 1
+4099	6934 1
+4099	6951 1
+4099	6979 1
+4099	7092 1
+4099	7553 1
+4099	7632 1
+4099	8178 1
+4099	8295 1
+4103	4798 1
+4110	5055 1
+4110	6914 1
+4110	7553 1
+4110	7803 1
+4108	4110 1
+4104	2354 1
+4104	3352 1
+4104	4110 1
+4105	4110 1
+4109	4110 1
+4106	4110 1
+4107	4110 1
+4111	1140 1
+4111	2871 1
+4111	3125 1
+4111	3463 1
+4111	3645 1
+4111	4173 1
+4111	4216 1
+4111	4256 1
+4111	4263 1
+4111	4269 1
+4111	4290 1
+4111	4297 1
+4111	4331 1
+4111	4422 1
+4111	4424 1
+4111	4453 1
+4116	2160 1
+4116	2398 1
+4116	3002 1
+4116	3755 1
+4116	4037 1
+4116	4117 1
+4116	4796 1
+4116	4820 1
+4116	5484 1
+4116	7050 1
+4116	7632 1
+4116	8168 1
+4119	1239 1
+4119	2958 1
+4119	2981 1
+4119	3352 1
+4119	4110 1
+4119	4706 1
+4120	1239 1
+4120	2328 1
+4120	2958 1
+4121	978 1
+4121	2328 1
+4076	15 1
+4076	72 1
+4076	346 1
+4076	762 1
+4076	852 1
+4076	1159 1
+4076	1239 1
+4076	1984 1
+4076	2066 1
+4076	2134 1
+4076	2144 1
+4076	2160 1
+4076	2328 1
+4076	2381 1
+4076	2398 1
+4076	2433 1
+4076	2456 1
+4076	2516 1
+4076	2535 1
+4076	2696 1
+4076	2790 1
+4076	2859 1
+4076	2932 1
+4076	2958 1
+4076	3276 1
+4076	3291 1
+4076	3321 1
+4076	3334 1
+4076	3352 1
+4076	3394 1
+4076	3454 1
+4076	3456 1
+4076	3463 1
+4076	3615 1
+4076	3631 1
+4076	3748 1
+4076	3787 1
+4076	3813 1
+4076	3898 1
+4076	3912 1
+4076	3976 1
+4076	4013 1
+4076	4037 1
+4076	4103 1
+4076	4138 1
+4076	4179 1
+4076	4201 1
+4076	4212 1
+4076	4218 1
+4076	4233 1
+4076	4247 1
+4076	4256 1
+4076	4263 1
+4076	4266 1
+4076	4269 1
+4076	4290 1
+4076	4335 1
+4076	4480 1
+4076	4662 1
+4076	4719 1
+4076	4735 1
+4076	4776 1
+4076	4796 1
+4076	4797 1
+4076	4808 1
+4076	4811 1
+4076	4814 1
+4076	4828 1
+4076	5072 1
+4076	5100 1
+4076	5106 1
+4076	5115 1
+4076	5130 1
+4076	5132 1
+4076	5176 1
+4076	5210 1
+4076	5285 1
+4076	5592 1
+4076	5640 1
+4076	5804 1
+4076	6634 1
+4076	6720 1
+4076	6770 1
+4076	6858 1
+4076	6914 1
+4076	7063 1
+4122	2328 1
+4123	1157 1
+4123	1239 1
+4123	2066 1
+4123	2134 1
+4123	2289 1
+4123	2328 1
+4123	2612 1
+4123	2790 1
+4123	2811 1
+4123	3291 1
+4123	3394 1
+4123	3463 1
+4123	3615 1
+4123	3631 1
+4123	4013 1
+4123	4072 1
+4123	4179 1
+4123	4247 1
+4123	4256 1
+4123	4263 1
+4123	4269 1
+4123	4323 1
+4123	4402 1
+4123	4578 1
+4123	4735 1
+4124	15 1
+4124	72 1
+4124	737 1
+4124	762 1
+4124	978 1
+4124	1157 1
+4124	1239 1
+4124	1549 1
+4124	1990 1
+4124	2066 1
+4124	2072 1
+4124	2129 1
+4124	2134 1
+4124	2229 1
+4124	2289 1
+4124	2326 1
+4124	2328 1
+4124	2364 1
+4124	2499 1
+4124	2565 1
+4124	2612 1
+4124	2790 1
+4124	2811 1
+4124	2900 1
+4124	3276 1
+4124	3352 1
+4124	3394 1
+4124	3439 1
+4124	3447 1
+4124	3463 1
+4124	3537 1
+4124	3568 1
+4124	3615 1
+4124	3631 1
+4124	3660 1
+4124	3724 1
+4124	4037 1
+4124	4138 1
+4124	4191 1
+4124	4201 1
+4124	4220 1
+4124	4247 1
+4124	4290 1
+4124	4323 1
+4124	4332 1
+4124	4365 1
+4124	4385 1
+4124	4424 1
+4124	5022 1
+4124	7478 1
+4125	2328 1
+4125	4055 1
+4126	2328 1
+4126	6624 1
+4127	762 1
+4127	1984 1
+4127	2066 1
+4127	2134 1
+4127	2144 1
+4127	2237 1
+4127	2240 1
+4127	2328 1
+4127	2369 1
+4127	2381 1
+4127	2398 1
+4127	2871 1
+4127	3014 1
+4127	3192 1
+4127	3276 1
+4127	3291 1
+4127	3443 1
+4127	3447 1
+4127	3452 1
+4127	3631 1
+4127	3724 1
+4127	3787 1
+4127	3812 1
+4127	3976 1
+4127	4011 1
+4127	4040 1
+4127	4044 1
+4127	4191 1
+4127	4256 1
+4127	4298 1
+4127	4402 1
+4127	4424 1
+4127	4463 1
+4127	4528 1
+4127	4531 1
+4127	4578 1
+4127	4811 1
+4127	4938 1
+4127	4999 1
+4127	5055 1
+4127	5058 1
+4128	1239 1
+4128	2066 1
+4128	2328 1
+4128	2932 1
+4128	2958 1
+4128	3192 1
+4128	3291 1
+4128	4237 1
+4128	4256 1
+4129	2328 1
+4129	7688 1
+4130	2328 1
+4130	4983 1
+4131	2328 1
+4132	2328 1
+4133	2328 1
+4133	3956 1
+4134	2328 1
+4134	6600 1
+4135	2328 1
+4135	2958 1
+4136	1157 1
+4136	2134 1
+4136	2328 1
+4136	2932 1
+4136	3192 1
+4136	3291 1
+4136	3394 1
+4136	3615 1
+4136	3631 1
+4136	3787 1
+4136	3813 1
+4136	3976 1
+4136	4013 1
+4136	4138 1
+4136	4201 1
+4136	4216 1
+4136	4233 1
+4136	4247 1
+4136	4256 1
+4136	4263 1
+4136	4269 1
+4136	4290 1
+4136	4323 1
+4136	5301 1
+4136	5928 1
+4136	5947 1
+4137	2328 1
+4137	3192 1
+4137	3568 1
+4137	4256 1
+4137	4289 1
+4137	4323 1
+4137	4402 1
+4138	608 1
+4138	737 1
+4138	1239 1
+4138	1990 1
+4138	2001 1
+4138	2289 1
+4138	2328 1
+4138	2398 1
+4138	2516 1
+4138	2565 1
+4138	2612 1
+4138	2646 1
+4138	2764 1
+4138	2831 1
+4138	2859 1
+4138	2932 1
+4138	3125 1
+4138	3144 1
+4138	3192 1
+4138	3274 1
+4138	3439 1
+4138	3456 1
+4138	3568 1
+4138	3645 1
+4138	3785 1
+4138	3958 1
+4138	4013 1
+4138	4191 1
+4138	4231 1
+4138	4234 1
+4138	4254 1
+4138	4256 1
+4138	4289 1
+4138	4290 1
+4138	4299 1
+4138	4335 1
+4138	4417 1
+4138	4422 1
+4138	4424 1
+4138	4453 1
+4138	4463 1
+4138	4466 1
+4138	4480 1
+4138	4485 1
+4138	4500 1
+4138	4530 1
+4138	4600 1
+4138	4653 1
+4138	4666 1
+4138	4797 1
+4138	4929 1
+4138	4964 1
+4138	4986 1
+4138	5155 1
+4138	5189 1
+4138	5484 1
+4138	5506 1
+4138	5509 1
+4138	5568 1
+4138	5637 1
+4138	5650 1
+4138	5651 1
+4138	5732 1
+4138	5737 1
+4139	2328 1
+4140	1024 1
+4140	2328 1
+4140	4201 1
+4140	5064 1
+4140	5605 1
+4140	5614 1
+4140	6715 1
+4140	6739 1
+4140	7233 1
+4140	8168 1
+4140	8174 1
+4140	8192 1
+4141	1990 1
+4141	2328 1
+4141	3125 1
+4141	3568 1
+4141	4299 1
+4142	1688 1
+4142	1729 1
+4142	1990 1
+4142	2240 1
+4142	2328 1
+4142	2517 1
+4142	2565 1
+4142	2612 1
+4142	2646 1
+4142	3034 1
+4142	3125 1
+4142	3144 1
+4142	3192 1
+4142	3309 1
+4142	3352 1
+4142	3394 1
+4142	3439 1
+4142	3453 1
+4142	3460 1
+4142	3635 1
+4142	3645 1
+4142	3660 1
+4142	3661 1
+4142	4256 1
+4142	4289 1
+4142	4290 1
+4142	4299 1
+4142	4359 1
+4142	4402 1
+4142	4422 1
+4142	4424 1
+4142	4480 1
+4142	4558 1
+4142	4646 1
+4142	4713 1
+4142	4735 1
+4142	5301 1
+4143	2328 1
+4144	15 1
+4144	406 1
+4144	762 1
+4144	896 1
+4144	1026 1
+4144	1157 1
+4144	1305 1
+4144	1352 1
+4144	1385 1
+4144	1680 1
+4144	2066 1
+4144	2145 1
+4144	2160 1
+4144	2328 1
+4144	2354 1
+4144	2398 1
+4144	2490 1
+4144	2774 1
+4144	2775 1
+4144	2790 1
+4144	2859 1
+4144	2958 1
+4144	3191 1
+4144	3393 1
+4144	3394 1
+4144	3447 1
+4144	3455 1
+4144	3498 1
+4144	3586 1
+4144	3812 1
+4144	3813 1
+4144	3976 1
+4144	4037 1
+4144	4065 1
+4144	4138 1
+4144	4175 1
+4144	4179 1
+4144	4191 1
+4144	4218 1
+4144	4256 1
+4144	4289 1
+4144	4335 1
+4144	4795 1
+4144	4797 1
+4144	4983 1
+4144	5020 1
+4144	5144 1
+4144	5210 1
+4144	5245 1
+4144	5254 1
+4144	5263 1
+4144	5301 1
+4144	5321 1
+4144	5392 1
+4144	5449 1
+4144	5457 1
+4144	5463 1
+4144	5626 1
+4144	5721 1
+4144	5732 1
+4144	5743 1
+4144	5850 1
+4144	5863 1
+4144	5886 1
+4144	5928 1
+4144	6006 1
+4144	6221 1
+4144	6246 1
+4144	6255 1
+4144	6262 1
+4144	6296 1
+4144	6299 1
+4144	6323 1
+4144	6328 1
+4144	6634 1
+4144	6725 1
+4145	2328 1
+4145	5061 1
+4146	2328 1
+4147	2328 1
+4147	4463 1
+4148	1990 1
+4148	2289 1
+4148	2328 1
+4148	4349 1
+4148	4403 1
+4148	4411 1
+4149	2328 1
+4149	3089 1
+4150	291 1
+4150	346 1
+4150	1548 1
+4150	1680 1
+4150	2328 1
+4150	2775 1
+4150	3073 1
+4150	3334 1
+4150	3352 1
+4150	3748 1
+4150	3835 1
+4150	3976 1
+4150	4191 1
+4150	4531 1
+4150	4735 1
+4150	4875 1
+4151	762 1
+4151	1185 1
+4151	1549 1
+4151	1688 1
+4151	1769 1
+4151	1799 1
+4151	2144 1
+4151	2145 1
+4151	2328 1
+4151	2381 1
+4151	2516 1
+4151	2592 1
+4151	2696 1
+4151	2760 1
+4151	2775 1
+4151	2871 1
+4151	3027 1
+4151	3034 1
+4151	3073 1
+4151	3125 1
+4151	3144 1
+4151	3238 1
+4151	3321 1
+4151	3352 1
+4151	3443 1
+4151	3447 1
+4151	3453 1
+4151	3454 1
+4151	3456 1
+4151	3537 1
+4151	3568 1
+4151	3586 1
+4151	3615 1
+4151	3643 1
+4151	3645 1
+4151	3660 1
+4151	3664 1
+4151	3796 1
+4151	3843 1
+4151	3897 1
+4151	4011 1
+4151	4040 1
+4151	4072 1
+4151	4124 1
+4151	4234 1
+4151	4247 1
+4151	4400 1
+4151	4422 1
+4151	4463 1
+4151	4531 1
+4151	4558 1
+4151	4562 1
+4151	4578 1
+4151	4587 1
+4151	4600 1
+4151	4613 1
+4151	4662 1
+4151	4666 1
+4151	4712 1
+4151	4827 1
+4151	5055 1
+4151	5100 1
+4151	5115 1
+4151	5144 1
+4151	5188 1
+4151	5254 1
+4151	5459 1
+4151	5637 1
+4151	5714 1
+4151	5743 1
+4151	5799 1
+4151	5817 1
+4151	5818 1
+4151	5844 1
+4151	6166 1
+4151	6306 1
+4151	6523 1
+4151	6600 1
+4151	6914 1
+4151	7115 1
+4151	7280 1
+4151	7443 1
+4151	7553 1
+4151	7862 1
+4152	737 1
+4152	762 1
+4152	1688 1
+4152	2145 1
+4152	2328 1
+4152	2381 1
+4152	2433 1
+4152	2565 1
+4152	2592 1
+4152	2646 1
+4152	2790 1
+4152	2871 1
+4152	3014 1
+4152	3125 1
+4152	3144 1
+4152	3352 1
+4152	3439 1
+4152	3443 1
+4152	3453 1
+4152	3454 1
+4152	3568 1
+4152	3615 1
+4152	3660 1
+4152	3724 1
+4152	3806 1
+4152	3843 1
+4152	4011 1
+4152	4044 1
+4152	4233 1
+4152	4234 1
+4152	4266 1
+4152	4297 1
+4152	4298 1
+4152	4335 1
+4152	4351 1
+4152	4424 1
+4152	4485 1
+4152	4531 1
+4152	4562 1
+4152	4613 1
+4152	4666 1
+4152	4820 1
+4152	5144 1
+4153	2328 1
+4154	2328 1
+4159	2653 1
+4159	4220 1
+4162	2134 1
+4162	3452 1
+4162	4201 1
+4162	4263 1
+4162	4269 1
+4162	4289 1
+4162	4290 1
+4162	4709 1
+4162	4981 1
+4162	5037 1
+4162	5055 1
+4162	6496 1
+4162	7620 1
+4162	7632 1
+4162	7871 1
+4162	7912 1
+4163	4055 1
+4163	4162 1
+4164	4162 1
+4164	4341 1
+4164	6907 1
+4165	4055 1
+4166	4055 1
+4155	1239 1
+4155	2066 1
+4155	2958 1
+4155	3615 1
+4155	4055 1
+4167	4168 1
+4169	1239 1
+4169	4216 1
+4169	4265 1
+4169	5233 1
+4169	6613 1
+4169	6789 1
+4169	6832 1
+4169	7262 1
+4169	7351 1
+4170	4171 1
+4174	4179 1
+4175	15 1
+4175	3498 1
+4175	4179 1
+4175	4712 1
+4175	5233 1
+4175	6006 1
+4175	6148 1
+4175	6498 1
+4176	4179 1
+4177	4179 1
+4178	4179 1
+4178	4191 1
+4178	4351 1
+4180	4181 1
+3819	2134 1
+3819	2859 1
+3819	2958 1
+3819	3631 1
+3819	3787 1
+3819	4013 1
+3819	4181 1
+3819	4233 1
+3819	4235 1
+3819	4424 1
+4184	2859 1
+4185	2859 1
+4186	291 1
+4186	2859 1
+4186	3334 1
+4186	4191 1
+4186	4827 1
+4186	5445 1
+4187	1310 1
+4187	1360 1
+4187	2576 1
+4187	2859 1
+4187	4037 1
+4187	4531 1
+4187	6006 1
+4187	6422 1
+4187	7908 1
+4189	737 1
+4189	1990 1
+4189	2066 1
+4189	3192 1
+4189	3394 1
+4189	3643 1
+4189	4298 1
+4189	4315 1
+4189	4557 1
+4189	4666 1
+4189	5288 1
+4190	15 1
+4190	2066 1
+4194	2066 1
+4194	4485 1
+4191	737 1
+4191	2066 1
+4191	2134 1
+4191	2144 1
+4191	2398 1
+4191	3125 1
+4191	3334 1
+4191	3456 1
+4191	4138 1
+4191	4400 1
+4191	4531 1
+4191	4557 1
+4191	4558 1
+4191	4987 1
+4191	5002 1
+4191	5274 1
+4191	5412 1
+4191	5848 1
+4191	6323 1
+4191	7632 1
+4192	2066 1
+4192	5012 1
+4192	5484 1
+4192	5998 1
+4192	6736 1
+4192	6873 1
+4192	7094 1
+4195	2066 1
+4197	762 1
+4197	3144 1
+4197	3615 1
+4197	4013 1
+4197	4199 1
+4197	4412 1
+4197	4551 1
+4198	3898 1
+4199	1961 1
+4199	2144 1
+4199	2433 1
+4199	3787 1
+4199	3898 1
+4199	4233 1
+4199	4247 1
+4199	4463 1
+4201	2134 1
+4201	4216 1
+4200	1498 1
+4200	4040 1
+4200	4201 1
+4200	6634 1
+4200	7144 1
+4207	4201 1
+4208	4201 1
+4208	4247 1
+4202	4201 1
+4203	4201 1
+4204	4201 1
+4204	5204 1
+3995	896 1
+3995	2276 1
+3995	2516 1
+3995	2535 1
+3995	3015 1
+3995	3089 1
+3995	3394 1
+3995	3456 1
+3995	3479 1
+3995	3498 1
+3995	3586 1
+3995	3634 1
+3995	3796 1
+3995	3897 1
+3995	4041 1
+3995	4098 1
+3995	4099 1
+3995	4201 1
+3995	4310 1
+3995	4335 1
+3995	4448 1
+3995	4482 1
+3995	4547 1
+3995	4574 1
+3995	4587 1
+3995	4645 1
+3995	4653 1
+3995	4712 1
+3995	4715 1
+3995	4824 1
+3995	4828 1
+3995	4846 1
+3995	4899 1
+3995	4964 1
+3995	5061 1
+3995	5144 1
+3995	5155 1
+3995	5178 1
+3995	5188 1
+3995	5200 1
+3995	5204 1
+3995	5273 1
+3995	5321 1
+3995	5437 1
+3995	5457 1
+3995	5459 1
+3995	5637 1
+3995	5680 1
+3995	5743 1
+3995	5757 1
+3995	5780 1
+3995	5827 1
+3995	5848 1
+3995	5886 1
+3995	5891 1
+3995	5947 1
+3995	6576 1
+4209	4201 1
+4205	4037 1
+4205	4201 1
+4205	4297 1
+4205	4335 1
+4205	5963 1
+4210	4201 1
+4206	4201 1
+4211	346 1
+4211	978 1
+4211	1385 1
+4211	1729 1
+4211	1990 1
+4211	2289 1
+4211	2326 1
+4211	2456 1
+4211	2516 1
+4211	2565 1
+4211	2646 1
+4211	2696 1
+4211	2790 1
+4211	2811 1
+4211	2940 1
+4211	3291 1
+4211	3321 1
+4211	3334 1
+4211	3352 1
+4211	3439 1
+4211	3455 1
+4211	3460 1
+4211	3537 1
+4211	3568 1
+4211	3635 1
+4211	3661 1
+4211	3796 1
+4211	3813 1
+4211	4037 1
+4211	4040 1
+4211	4191 1
+4211	4212 1
+4211	4234 1
+4211	4261 1
+4211	4297 1
+4211	4335 1
+4211	4373 1
+4211	4385 1
+4211	4386 1
+4211	4402 1
+4211	4417 1
+4211	4471 1
+4211	4661 1
+4211	4662 1
+4211	4666 1
+4211	4706 1
+4211	4719 1
+4211	4735 1
+4211	4780 1
+4211	4796 1
+4211	4811 1
+4211	4827 1
+4211	5055 1
+4211	5073 1
+4211	5083 1
+4211	5092 1
+4211	5199 1
+4211	5233 1
+4211	5445 1
+4211	5800 1
+4211	7237 1
+4211	7295 1
+4211	7362 1
+4211	7478 1
+4211	7553 1
+4212	72 1
+4212	737 1
+4212	2145 1
+4212	2237 1
+4212	2289 1
+4212	2516 1
+4212	2775 1
+4212	2785 1
+4212	2917 1
+4212	3433 1
+4212	3439 1
+4212	3443 1
+4212	3447 1
+4212	3452 1
+4212	3456 1
+4212	3537 1
+4212	3808 1
+4212	4040 1
+4212	4103 1
+4212	4124 1
+4212	4191 1
+4212	4448 1
+4212	4483 1
+4212	4529 1
+4212	4547 1
+4212	4551 1
+4212	4587 1
+4212	4631 1
+4212	4639 1
+4212	4666 1
+4212	4777 1
+4212	4780 1
+4212	4798 1
+4212	4815 1
+4212	4875 1
+4212	4983 1
+4212	4999 1
+4212	5123 1
+4212	5130 1
+4212	5178 1
+4212	5210 1
+4212	5245 1
+4212	5255 1
+4212	5271 1
+4212	5311 1
+4212	5326 1
+4212	5350 1
+4212	5362 1
+4212	5375 1
+4212	5635 1
+4212	5737 1
+4212	5740 1
+4212	6571 1
+4215	2612 1
+4215	3439 1
+4213	3439 1
+4213	4191 1
+4213	4365 1
+4214	2129 1
+4214	3144 1
+4214	3439 1
+4214	3568 1
+4214	3645 1
+4214	4138 1
+4214	4234 1
+4214	4422 1
+4214	4424 1
+4216	3140 1
+4217	4218 1
+4219	762 1
+4219	1024 1
+4219	1305 1
+4219	1680 1
+4219	1769 1
+4219	2144 1
+4219	2145 1
+4219	2240 1
+4219	2354 1
+4219	2364 1
+4219	2369 1
+4219	2381 1
+4219	2433 1
+4219	2456 1
+4219	2516 1
+4219	2517 1
+4219	2592 1
+4219	2696 1
+4219	2760 1
+4219	2790 1
+4219	2811 1
+4219	2822 1
+4219	2831 1
+4219	2871 1
+4219	3002 1
+4219	3014 1
+4219	3092 1
+4219	3106 1
+4219	3284 1
+4219	3309 1
+4219	3321 1
+4219	3334 1
+4219	3352 1
+4219	3433 1
+4219	3443 1
+4219	3453 1
+4219	3456 1
+4219	3607 1
+4219	3635 1
+4219	3643 1
+4219	3691 1
+4219	3748 1
+4219	3813 1
+4219	3835 1
+4219	3843 1
+4219	3897 1
+4219	3898 1
+4219	3956 1
+4219	3958 1
+4219	3976 1
+4219	4011 1
+4219	4037 1
+4219	4040 1
+4219	4044 1
+4219	4103 1
+4219	4124 1
+4219	4189 1
+4219	4212 1
+4219	4261 1
+4219	4266 1
+4219	4297 1
+4219	4335 1
+4219	4400 1
+4219	4401 1
+4219	4528 1
+4219	4529 1
+4219	4547 1
+4219	4578 1
+4219	4600 1
+4219	4613 1
+4219	4620 1
+4219	4661 1
+4219	4662 1
+4219	4678 1
+4219	4706 1
+4219	4713 1
+4219	4717 1
+4219	4719 1
+4219	4728 1
+4219	4735 1
+4219	4776 1
+4219	4792 1
+4219	4796 1
+4219	4808 1
+4219	4811 1
+4219	4814 1
+4219	4820 1
+4219	4827 1
+4219	4828 1
+4219	4929 1
+4219	4962 1
+4219	4964 1
+4219	4987 1
+4219	5022 1
+4219	5026 1
+4219	5073 1
+4219	5092 1
+4219	5106 1
+4219	5130 1
+4219	5132 1
+4219	5144 1
+4219	5162 1
+4219	5204 1
+4219	5208 1
+4219	5239 1
+4219	5301 1
+4219	5323 1
+4219	5459 1
+4219	5559 1
+4219	5800 1
+4219	5817 1
+4219	8296 1
+4220	2240 1
+4220	3443 1
+4220	3976 1
+4222	762 1
+4222	1305 1
+4222	1648 1
+4222	1688 1
+4222	2145 1
+4222	2240 1
+4222	2354 1
+4222	2381 1
+4222	2398 1
+4222	2433 1
+4222	2516 1
+4222	2790 1
+4222	2871 1
+4222	3125 1
+4222	3140 1
+4222	3274 1
+4222	3352 1
+4222	3635 1
+4222	3724 1
+4222	3806 1
+4222	3812 1
+4222	3922 1
+4222	3962 1
+4222	3976 1
+4222	4199 1
+4222	4335 1
+4222	4463 1
+4222	4510 1
+4222	4528 1
+4222	4536 1
+4222	4578 1
+4222	4646 1
+4222	4666 1
+4222	5083 1
+4222	5120 1
+4222	5132 1
+4222	5179 1
+4222	5204 1
+4222	5790 1
+4222	5817 1
+4222	7924 1
+4223	1157 1
+4223	2240 1
+4223	2326 1
+4223	3443 1
+4223	3976 1
+4223	4138 1
+4223	5850 1
+4224	1984 1
+4224	2240 1
+4224	2517 1
+4224	2790 1
+4224	3309 1
+4224	3352 1
+4224	3635 1
+4224	4040 1
+4224	4266 1
+4224	4605 1
+4224	4661 1
+4224	4735 1
+4224	4776 1
+4224	4811 1
+4224	5022 1
+4224	6875 1
+4224	7620 1
+4221	2240 1
+4221	2535 1
+4221	3014 1
+4221	3238 1
+4221	3274 1
+4221	3284 1
+4221	3447 1
+4221	3459 1
+4221	3796 1
+4221	4037 1
+4221	4099 1
+4221	4134 1
+4221	4323 1
+4221	4483 1
+4221	4536 1
+4221	4547 1
+4221	4653 1
+4221	4828 1
+4221	4977 1
+4221	5002 1
+4221	5200 1
+4221	5226 1
+4221	5254 1
+4221	5295 1
+4221	5459 1
+4221	5484 1
+4221	5714 1
+4221	5818 1
+4221	5871 1
+4221	6001 1
+4221	6032 1
+4221	6124 1
+4221	6720 1
+4221	6774 1
+4221	6840 1
+4221	6869 1
+4221	6934 1
+4221	7063 1
+4221	7510 1
+4221	7699 1
+4221	7778 1
+4221	8295 1
+4225	2240 1
+4228	3615 1
+4228	4138 1
+4228	4231 1
+4231	3615 1
+4233	3284 1
+4233	5204 1
+4232	4233 1
+4232	4485 1
+4232	4561 1
+4234	2289 1
+4234	4233 1
+4234	4424 1
+4093	4235 1
+4236	4237 1
+4009	1024 1
+4009	3631 1
+4238	3631 1
+4240	4247 1
+4243	4247 1
+4244	4247 1
+4241	4247 1
+4242	4247 1
+4245	2516 1
+4245	4247 1
+4246	4247 1
+4248	3291 1
+4249	2932 1
+4250	2144 1
+4250	2932 1
+4251	2932 1
+4252	2811 1
+4252	2932 1
+4252	4040 1
+4252	4124 1
+4252	4299 1
+4229	2134 1
+4229	3463 1
+4229	4263 1
+4229	4269 1
+4255	1305 1
+4255	2134 1
+4255	2917 1
+4255	3854 1
+4255	4138 1
+4255	4263 1
+4255	4266 1
+4255	4297 1
+4255	4962 1
+4257	3463 1
+4257	6417 1
+4263	5445 1
+4259	4263 1
+4260	4263 1
+4261	1385 1
+4261	1688 1
+4261	2289 1
+4261	2456 1
+4261	3276 1
+4261	3334 1
+4261	3447 1
+4261	3537 1
+4261	3568 1
+4261	4040 1
+4261	4072 1
+4261	4212 1
+4261	4263 1
+4261	4266 1
+4261	4531 1
+4261	4661 1
+4261	4662 1
+4261	4677 1
+4261	4709 1
+4261	4719 1
+4261	4796 1
+4261	4811 1
+4261	5026 1
+4261	5055 1
+4269	4335 1
+4269	4661 1
+4269	5404 1
+4266	1157 1
+4266	1473 1
+4266	3352 1
+4266	3660 1
+4266	4040 1
+4266	4269 1
+4266	4687 1
+4266	4735 1
+4266	5061 1
+4266	5780 1
+4266	6833 1
+4267	4269 1
+4275	2696 1
+4275	3192 1
+4275	3537 1
+4275	3748 1
+4275	5026 1
+4273	1157 1
+4273	2398 1
+4273	2433 1
+4273	2612 1
+4273	3014 1
+4273	3192 1
+4273	3276 1
+4273	3454 1
+4273	3568 1
+4273	4256 1
+4273	4299 1
+4273	4349 1
+4273	4373 1
+4273	4384 1
+4273	4578 1
+4273	4613 1
+4273	4709 1
+4273	5626 1
+4273	6170 1
+4273	6613 1
+4273	6715 1
+4273	6788 1
+4273	7315 1
+4276	737 1
+4276	896 1
+4276	1247 1
+4276	1473 1
+4276	1548 1
+4276	1733 1
+4276	2001 1
+4276	2258 1
+4276	2507 1
+4276	2516 1
+4276	2592 1
+4276	2605 1
+4276	2822 1
+4276	2831 1
+4276	2909 1
+4276	3027 1
+4276	3089 1
+4276	3092 1
+4276	3192 1
+4276	3352 1
+4276	3417 1
+4276	3456 1
+4276	3460 1
+4276	3586 1
+4276	3643 1
+4276	3664 1
+4276	3796 1
+4276	3910 1
+4276	3958 1
+4276	4041 1
+4276	4247 1
+4276	4338 1
+4276	4400 1
+4276	4527 1
+4276	4547 1
+4276	4600 1
+4276	4929 1
+4276	4964 1
+4276	5072 1
+4276	5144 1
+4276	5189 1
+4276	5204 1
+4276	5226 1
+4276	5423 1
+4276	5430 1
+4276	5568 1
+4276	5637 1
+4276	5651 1
+4276	5737 1
+4276	5743 1
+4276	5775 1
+4276	6229 1
+213	3192 1
+4277	3192 1
+4274	3192 1
+4278	3192 1
+4279	3192 1
+4280	3192 1
+4282	3334 1
+4282	4037 1
+4282	4256 1
+4282	4335 1
+4282	4588 1
+4282	4796 1
+4283	4256 1
+4284	4256 1
+4285	4256 1
+4285	4962 1
+4290	3394 1
+4290	4531 1
+4291	4037 1
+4291	4290 1
+4291	6009 1
+4291	6306 1
+4292	737 1
+4292	2398 1
+4292	3568 1
+4292	4290 1
+4295	2369 1
+4295	2565 1
+4295	3125 1
+4295	3284 1
+4295	3645 1
+4295	3796 1
+4295	3813 1
+4295	4189 1
+4295	4297 1
+4295	4299 1
+4295	4500 1
+4295	4536 1
+4295	4828 1
+4295	5100 1
+4295	5144 1
+4295	5459 1
+4295	5743 1
+4296	4299 1
+4297	15 1
+4297	737 1
+4297	2276 1
+4297	2354 1
+4297	2398 1
+4297	2440 1
+4297	2535 1
+4297	3089 1
+4297	3125 1
+4297	3334 1
+4297	3645 1
+4297	3691 1
+4297	3898 1
+4297	4191 1
+4297	4299 1
+4297	4315 1
+4297	4400 1
+4297	4528 1
+4297	4712 1
+4297	4717 1
+4297	4735 1
+4297	4795 1
+4297	5002 1
+4297	5254 1
+4297	5412 1
+4297	5415 1
+4297	5463 1
+4297	5499 1
+4297	5543 1
+4297	5811 1
+4297	5818 1
+4297	5819 1
+4297	5839 1
+4297	5871 1
+4297	6699 1
+4297	7168 1
+4297	7620 1
+4297	7632 1
+4298	737 1
+4298	3125 1
+4298	3643 1
+4298	4189 1
+4298	4191 1
+4298	4261 1
+4298	4299 1
+4298	4827 1
+4298	5285 1
+4304	1157 1
+4305	1157 1
+4308	608 1
+4308	1157 1
+4308	1548 1
+4308	4191 1
+4308	5140 1
+4308	5162 1
+4308	5543 1
+4306	1157 1
+4307	1157 1
+4307	4349 1
+4307	5817 1
+4312	3447 1
+4312	3568 1
+4312	3645 1
+4312	4578 1
+4312	4728 1
+4313	978 1
+4313	1385 1
+4313	2433 1
+4313	3568 1
+4313	4510 1
+4314	15 1
+4314	3568 1
+4314	5928 1
+4314	6594 1
+4315	15 1
+4315	762 1
+4315	1024 1
+4315	1385 1
+4315	1680 1
+4315	1729 1
+4315	2289 1
+4315	2364 1
+4315	2381 1
+4315	2398 1
+4315	2871 1
+4315	3568 1
+4315	3645 1
+4315	3660 1
+4315	3748 1
+4315	4189 1
+4315	4191 1
+4315	4297 1
+4315	4373 1
+4315	4402 1
+4315	4654 1
+4315	4666 1
+4315	4735 1
+4315	4820 1
+4315	4964 1
+4315	4983 1
+4315	5033 1
+4315	5412 1
+4315	5449 1
+4316	3447 1
+4316	3452 1
+4316	3568 1
+4316	3843 1
+4316	4011 1
+4316	4191 1
+4316	4335 1
+4316	4987 1
+4317	3454 1
+4317	3568 1
+4317	4402 1
+4318	3568 1
+4318	4191 1
+4318	6914 1
+4319	737 1
+4319	3568 1
+4319	5412 1
+4319	5484 1
+4320	3568 1
+4320	4417 1
+4321	3568 1
+4324	1185 1
+4324	1385 1
+4324	2565 1
+4324	3140 1
+4324	3309 1
+4324	3660 1
+4324	4384 1
+4324	4402 1
+4325	2565 1
+4325	4384 1
+4325	4424 1
+4326	2433 1
+4326	2565 1
+4326	3089 1
+4326	4797 1
+4326	5714 1
+4326	5994 1
+4326	6869 1
+4327	2565 1
+4327	4528 1
+4328	2565 1
+4329	762 1
+4329	2516 1
+4329	2565 1
+4329	3092 1
+4329	3724 1
+4329	4219 1
+4329	4463 1
+4329	4666 1
+4329	4712 1
+4329	4735 1
+4329	4828 1
+4329	5106 1
+4331	3634 1
+4331	6174 1
+4338	72 1
+4338	95 1
+4338	608 1
+4338	1026 1
+4338	1473 1
+4338	2001 1
+4338	2354 1
+4338	2398 1
+4338	2535 1
+4338	2775 1
+4338	3084 1
+4338	3291 1
+4338	3352 1
+4338	3458 1
+4338	3459 1
+4338	3537 1
+4338	3554 1
+4338	3607 1
+4338	4037 1
+4338	4191 1
+4338	4600 1
+4338	4709 1
+4338	4712 1
+4338	5045 1
+4338	5254 1
+4338	5412 1
+4338	5423 1
+4338	5449 1
+4338	5563 1
+4338	5714 1
+4338	6004 1
+4338	6229 1
+4338	6422 1
+4338	6566 1
+4338	6613 1
+4338	6739 1
+4338	6789 1
+4338	6833 1
+4338	6855 1
+4338	8295 1
+4333	4191 1
+4333	5412 1
+4334	4191 1
+4335	737 1
+4335	1074 1
+4335	2398 1
+4335	2535 1
+4335	2785 1
+4335	3084 1
+4335	3813 1
+4335	4191 1
+4335	4448 1
+4335	4485 1
+4335	4529 1
+4335	4578 1
+4335	4645 1
+4335	4653 1
+4335	4735 1
+4335	4846 1
+4335	4981 1
+4335	5028 1
+4335	5033 1
+4335	5037 1
+4335	5079 1
+4335	5121 1
+4335	5144 1
+4335	5273 1
+4335	5412 1
+4335	5671 1
+4335	6414 1
+4335	6980 1
+4335	7021 1
+4335	7632 1
+4335	7908 1
+4335	8297 1
+4336	4191 1
+4337	4191 1
+4345	4349 1
+4345	4875 1
+4346	4349 1
+4340	4349 1
+4342	1024 1
+4342	2592 1
+4342	2917 1
+4342	3898 1
+4342	4037 1
+4342	4212 1
+4342	4349 1
+4342	4365 1
+4342	5073 1
+4342	5092 1
+4341	4349 1
+4343	762 1
+4343	1823 1
+4343	4349 1
+4343	5527 1
+4343	6006 1
+4343	6594 1
+4343	6897 1
+4347	967 1
+4347	2223 1
+4347	3554 1
+4347	3806 1
+4347	3962 1
+4347	4037 1
+4347	4349 1
+4347	4435 1
+4347	4507 1
+4347	4613 1
+4347	4983 1
+4347	5064 1
+4347	5246 1
+4347	5466 1
+4347	5819 1
+4347	5933 1
+4347	6032 1
+4347	6174 1
+4347	6330 1
+4347	6414 1
+4347	6422 1
+4347	6914 1
+4347	6918 1
+4347	7021 1
+4347	7063 1
+4347	7341 1
+4347	7517 1
+4347	7574 1
+4347	7620 1
+4347	7701 1
+4347	7778 1
+4347	7879 1
+4347	7908 1
+4347	7924 1
+4347	7927 1
+4347	7946 1
+4347	7952 1
+4347	7961 1
+4347	7979 1
+4347	7992 1
+4347	7994 1
+4347	7996 1
+4347	8042 1
+4347	8079 1
+4347	8090 1
+4347	8121 1
+4347	8128 1
+4347	8130 1
+4347	8134 1
+4347	8168 1
+4347	8169 1
+4347	8174 1
+4347	8198 1
+4347	8212 1
+4347	8224 1
+4344	4349 1
+4344	4373 1
+4344	4384 1
+4348	4349 1
+4351	1990 1
+4351	3724 1
+4351	4510 1
+4351	4531 1
+4352	1990 1
+4353	15 1
+4353	72 1
+4353	737 1
+4353	1247 1
+4353	1799 1
+4353	1990 1
+4353	2001 1
+4353	2258 1
+4353	2354 1
+4353	2398 1
+4353	2516 1
+4353	2822 1
+4353	2831 1
+4353	3015 1
+4353	3027 1
+4353	3417 1
+4353	3456 1
+4353	3634 1
+4353	3897 1
+4353	3910 1
+4353	3976 1
+4353	4037 1
+4353	4071 1
+4353	4099 1
+4353	4127 1
+4353	4310 1
+4353	4335 1
+4353	4338 1
+4353	4400 1
+4353	4448 1
+4353	4587 1
+4353	4600 1
+4353	4713 1
+4353	4828 1
+4353	4846 1
+4353	5020 1
+4353	5155 1
+4353	5178 1
+4353	5189 1
+4353	5226 1
+4353	5262 1
+4353	5288 1
+4353	5326 1
+4353	5327 1
+4353	5335 1
+4353	5387 1
+4353	5392 1
+4353	5412 1
+4353	5423 1
+4353	5445 1
+4353	5449 1
+4353	5454 1
+4353	5459 1
+4353	5482 1
+4353	5484 1
+4353	5506 1
+4353	5509 1
+4353	5514 1
+4353	5539 1
+4353	5637 1
+4353	5683 1
+4353	5693 1
+4353	5713 1
+4353	5732 1
+4353	5743 1
+4353	5775 1
+4353	5844 1
+4353	5886 1
+4353	5925 1
+4353	6229 1
+4353	6262 1
+4353	6296 1
+4353	6328 1
+4353	6634 1
+4353	6780 1
+4353	7092 1
+4353	7301 1
+4353	7809 1
+4353	7910 1
+4353	7961 1
+4354	1990 1
+4354	3284 1
+4354	3443 1
+4354	3452 1
+4354	4335 1
+4354	5100 1
+4355	1733 1
+4355	2001 1
+4355	2014 1
+4355	2364 1
+4355	2822 1
+4355	2831 1
+4355	2902 1
+4355	3089 1
+4355	3092 1
+4355	3352 1
+4355	3417 1
+4355	3447 1
+4355	3453 1
+4355	3455 1
+4355	3459 1
+4355	3537 1
+4355	3634 1
+4355	3661 1
+4355	3796 1
+4355	3843 1
+4355	3897 1
+4355	3910 1
+4355	4400 1
+4355	4448 1
+4355	4483 1
+4355	4530 1
+4355	4531 1
+4355	4600 1
+4355	4653 1
+4355	4654 1
+4355	4748 1
+4355	4953 1
+4355	5020 1
+4355	5155 1
+4355	5176 1
+4355	5204 1
+4355	5215 1
+4355	5323 1
+4355	5341 1
+4355	5412 1
+4355	5415 1
+4355	5459 1
+4355	5509 1
+4355	5713 1
+4355	5737 1
+4355	5775 1
+4355	5778 1
+4355	5780 1
+4355	5784 1
+4355	8295 1
+4357	3661 1
+4358	2612 1
+4360	4365 1
+4361	4365 1
+4361	4666 1
+4361	5288 1
+4361	6946 1
+4361	7115 1
+4361	7201 1
+4364	762 1
+4364	1185 1
+4364	2354 1
+4364	2433 1
+4364	2774 1
+4364	3014 1
+4364	3309 1
+4364	3346 1
+4364	3443 1
+4364	3453 1
+4364	3456 1
+4364	3554 1
+4364	3873 1
+4364	3958 1
+4364	4037 1
+4364	4361 1
+4364	4365 1
+4364	4400 1
+4364	4432 1
+4364	4528 1
+4364	4578 1
+4364	5045 1
+4364	5083 1
+4364	5199 1
+4364	5233 1
+4364	5288 1
+4364	5335 1
+4364	5392 1
+4364	5511 1
+4364	5817 1
+4364	6246 1
+4364	6422 1
+4364	6553 1
+4364	6634 1
+4364	6737 1
+4364	6855 1
+4364	6979 1
+4364	7351 1
+4364	7924 1
+4362	4365 1
+4363	608 1
+4363	2398 1
+4363	2516 1
+4363	2871 1
+4363	3106 1
+4363	3291 1
+4363	3321 1
+4363	3352 1
+4363	3458 1
+4363	3796 1
+4363	3806 1
+4363	3835 1
+4363	4041 1
+4363	4099 1
+4363	4191 1
+4363	4365 1
+4363	4453 1
+4363	4463 1
+4363	4666 1
+4363	5524 1
+4363	5543 1
+4363	5592 1
+4366	1729 1
+4366	4687 1
+2028	1729 1
+4368	4373 1
+4369	4373 1
+4369	4632 1
+4371	762 1
+4371	3125 1
+4371	4219 1
+4371	4373 1
+4371	4557 1
+4371	5100 1
+4370	4373 1
+4372	4373 1
+4375	3660 1
+4375	4099 1
+4375	4384 1
+4377	2145 1
+4377	2871 1
+4377	2917 1
+4377	3034 1
+4377	3334 1
+4377	3958 1
+4377	4044 1
+4377	4384 1
+4377	4661 1
+4377	4719 1
+4377	4875 1
+4378	4384 1
+4383	2223 1
+4383	4384 1
+4383	4401 1
+4383	5807 1
+4379	1688 1
+4379	2516 1
+4379	2871 1
+4379	4384 1
+4379	4661 1
+4380	4384 1
+4381	4384 1
+4382	4384 1
+4393	4402 1
+4394	4402 1
+4399	4402 1
+4322	4402 1
+4395	4402 1
+4395	6736 1
+4395	6755 1
+4400	3976 1
+4400	4040 1
+4400	4219 1
+4400	4402 1
+4400	5412 1
+4396	4402 1
+4397	4402 1
+4398	4040 1
+4398	4400 1
+4398	4401 1
+4398	4402 1
+4398	5925 1
+4398	7092 1
+4398	7544 1
+4398	7561 1
+4398	7757 1
+4404	2289 1
+4408	1385 1
+4405	1385 1
+4412	2398 1
+4412	4417 1
+4414	4417 1
+4415	762 1
+4415	1305 1
+4415	1360 1
+4415	2237 1
+4415	2696 1
+4415	2871 1
+4415	3073 1
+4415	3433 1
+4415	3748 1
+4415	4037 1
+4415	4220 1
+4415	4335 1
+4415	4417 1
+4415	4557 1
+4415	4588 1
+4415	4706 1
+4415	4820 1
+4416	72 1
+4416	1026 1
+4416	2535 1
+4416	3084 1
+4416	4037 1
+4416	4338 1
+4416	4417 1
+4416	5254 1
+4416	5543 1
+4416	5714 1
+4416	6229 1
+4422	840 1
+4422	2646 1
+4422	3293 1
+4422	3645 1
+4422	4037 1
+4422	4424 1
+4422	4453 1
+4422	4875 1
+4422	5829 1
+4422	5922 1
+4422	5963 1
+4422	5969 1
+4422	7108 1
+4422	7517 1
+4422	7620 1
+4423	4424 1
+4425	4297 1
+4425	6334 1
+4426	2696 1
+4426	2871 1
+4426	4613 1
+4426	4666 1
+4426	4828 1
+4427	2871 1
+4428	2364 1
+4428	2381 1
+4428	2871 1
+4428	3537 1
+4428	4037 1
+4428	4044 1
+4428	4124 1
+4428	4297 1
+4428	4938 1
+4428	5092 1
+4428	5222 1
+4428	5848 1
+4429	1688 1
+4429	2386 1
+4429	2517 1
+4429	2871 1
+4429	3812 1
+4429	3854 1
+4429	4335 1
+4429	4468 1
+4429	4485 1
+4429	4531 1
+4429	4557 1
+4429	4661 1
+4430	2871 1
+4430	3014 1
+4430	3443 1
+4430	3958 1
+4430	4620 1
+4430	4621 1
+4431	2144 1
+4431	2871 1
+4431	4261 1
+4431	5288 1
+4432	2851 1
+4432	2871 1
+4432	3796 1
+4432	5103 1
+4432	5814 1
+4432	5818 1
+4432	5925 1
+4432	8212 1
+4433	762 1
+4433	1185 1
+4433	1688 1
+4433	2871 1
+4433	3125 1
+4433	3321 1
+4433	3454 1
+4433	3557 1
+4433	3812 1
+4433	3956 1
+4433	4011 1
+4433	4072 1
+4433	4261 1
+4433	4529 1
+4433	4531 1
+4433	4551 1
+4433	4552 1
+4433	4557 1
+4433	4558 1
+4433	4562 1
+4433	4661 1
+4433	4662 1
+4433	4666 1
+4433	5404 1
+4434	2871 1
+4434	4827 1
+4435	2871 1
+4435	4666 1
+4435	6770 1
+4436	2871 1
+4436	3958 1
+4437	840 1
+4437	1185 1
+4437	2517 1
+4437	2565 1
+4437	2811 1
+4437	2851 1
+4437	2871 1
+4437	3014 1
+4437	3034 1
+4437	3140 1
+4437	3238 1
+4437	3309 1
+4437	3321 1
+4437	3455 1
+4437	3459 1
+4437	3460 1
+4437	3557 1
+4437	3635 1
+4437	3958 1
+4437	4011 1
+4437	4261 1
+4437	4266 1
+4437	4468 1
+4437	4536 1
+4437	4578 1
+4437	4613 1
+4437	4646 1
+4437	4661 1
+4437	4666 1
+4437	4719 1
+4437	4875 1
+4437	5199 1
+4437	5289 1
+4437	5432 1
+4437	5582 1
+4437	5697 1
+4437	5775 1
+4437	5776 1
+4437	5806 1
+4437	5897 1
+4437	5932 1
+4437	6097 1
+4437	6123 1
+4437	6299 1
+4437	6305 1
+4437	6330 1
+4437	6442 1
+4437	6523 1
+4437	6624 1
+4437	6634 1
+4437	6736 1
+4437	6789 1
+4437	6907 1
+4437	6945 1
+4437	6946 1
+4437	6955 1
+4437	6976 1
+4437	6979 1
+4437	7052 1
+4437	7073 1
+4437	7115 1
+4437	7119 1
+4437	7237 1
+4437	7295 1
+4437	7301 1
+4437	7351 1
+4437	7373 1
+4437	7587 1
+4437	7620 1
+4437	7839 1
+4438	15 1
+4438	2871 1
+4438	4040 1
+4438	4400 1
+4438	5204 1
+4438	6257 1
+4439	2871 1
+4440	2144 1
+4440	2871 1
+4440	3014 1
+4440	3956 1
+4440	3958 1
+4440	4613 1
+4441	15 1
+4441	967 1
+4441	1191 1
+4441	1247 1
+4441	1769 1
+4441	1972 1
+4441	1982 1
+4441	2354 1
+4441	2364 1
+4441	2517 1
+4441	2592 1
+4441	2689 1
+4441	2775 1
+4441	2787 1
+4441	2790 1
+4441	2811 1
+4441	2822 1
+4441	2871 1
+4441	2909 1
+4441	3002 1
+4441	3092 1
+4441	3103 1
+4441	3106 1
+4441	3238 1
+4441	3309 1
+4441	3310 1
+4441	3334 1
+4441	3381 1
+4441	3393 1
+4441	3417 1
+4441	3433 1
+4441	3443 1
+4441	3447 1
+4441	3452 1
+4441	3453 1
+4441	3455 1
+4441	3458 1
+4441	3479 1
+4441	3537 1
+4441	3614 1
+4441	3634 1
+4441	3635 1
+4441	3664 1
+4441	3691 1
+4441	3752 1
+4441	3813 1
+4441	3843 1
+4441	3897 1
+4441	3898 1
+4441	3956 1
+4441	3958 1
+4441	3976 1
+4441	4011 1
+4441	4037 1
+4441	4071 1
+4441	4099 1
+4441	4124 1
+4441	4219 1
+4441	4297 1
+4441	4310 1
+4441	4315 1
+4441	4341 1
+4441	4400 1
+4441	4401 1
+4441	4435 1
+4441	4448 1
+4441	4482 1
+4441	4483 1
+4441	4547 1
+4441	4551 1
+4441	4574 1
+4441	4613 1
+4441	4620 1
+4441	4687 1
+4441	4689 1
+4441	4712 1
+4441	4715 1
+4441	4717 1
+4441	4719 1
+4441	4735 1
+4441	4798 1
+4441	4814 1
+4441	4827 1
+4441	4828 1
+4441	4938 1
+4441	4953 1
+4441	4962 1
+4441	4964 1
+4441	4980 1
+4441	4981 1
+4441	4994 1
+4441	4999 1
+4441	5002 1
+4441	5022 1
+4441	5028 1
+4441	5055 1
+4441	5073 1
+4441	5092 1
+4441	5100 1
+4441	5106 1
+4441	5123 1
+4441	5130 1
+4441	5132 1
+4441	5140 1
+4441	5144 1
+4441	5148 1
+4441	5200 1
+4441	5204 1
+4441	5239 1
+4441	5323 1
+4441	5378 1
+4441	5404 1
+4441	5412 1
+4441	5421 1
+4441	5423 1
+4441	5439 1
+4441	5445 1
+4441	5630 1
+4441	5671 1
+4441	5684 1
+4441	5780 1
+4441	5798 1
+4441	5799 1
+4441	5804 1
+4441	5812 1
+4441	5837 1
+4441	5844 1
+4441	5848 1
+4441	5863 1
+4441	5928 1
+4441	5947 1
+4441	6006 1
+4441	6032 1
+4441	6043 1
+4441	6098 1
+4441	6151 1
+4441	6162 1
+4441	6174 1
+4441	6328 1
+4441	6334 1
+4441	6337 1
+4441	6414 1
+4441	6437 1
+4441	6458 1
+4441	6505 1
+4441	6523 1
+4441	6528 1
+4441	6554 1
+4441	6555 1
+4441	6570 1
+4441	6576 1
+4441	6634 1
+4441	6712 1
+4441	6934 1
+4441	6980 1
+4441	7005 1
+4441	7012 1
+4441	7021 1
+4441	7108 1
+4441	7116 1
+4441	7238 1
+4441	7277 1
+4441	7279 1
+4441	7280 1
+4441	7443 1
+4441	7449 1
+4441	7544 1
+4441	7553 1
+4441	7618 1
+4441	7620 1
+4441	7624 1
+4441	7632 1
+4441	7646 1
+4441	7649 1
+4441	7662 1
+4441	7683 1
+4441	7695 1
+4441	7699 1
+4441	7707 1
+4441	7726 1
+4441	7763 1
+4441	7788 1
+4441	7795 1
+4441	7803 1
+4441	7809 1
+4441	7810 1
+4441	7813 1
+4441	7855 1
+4441	7862 1
+4441	7879 1
+4441	7882 1
+4441	7890 1
+4441	7912 1
+4441	7927 1
+4441	8051 1
+4441	8174 1
+4441	8192 1
+4441	8198 1
+4441	8209 1
+4441	8212 1
+4441	8219 1
+4441	8237 1
+4442	1360 1
+4442	2381 1
+4442	2516 1
+4442	2871 1
+4442	2909 1
+4442	3014 1
+4442	3456 1
+4442	4266 1
+4442	4297 1
+4442	4600 1
+4442	4706 1
+4442	4717 1
+4442	4815 1
+4442	4875 1
+4442	5073 1
+4442	5092 1
+4442	5100 1
+4442	5204 1
+4443	2516 1
+4443	2871 1
+4443	3352 1
+4443	4276 1
+4443	4735 1
+4443	5179 1
+4443	5799 1
+4444	2871 1
+4445	2871 1
+4446	2871 1
+4446	4661 1
+4447	72 1
+4447	2456 1
+4447	2871 1
+4447	3084 1
+4447	5002 1
+4447	5818 1
+4447	5860 1
+4447	5872 1
+4447	5925 1
+4447	6422 1
+4447	7553 1
+4447	7561 1
+4447	7862 1
+4447	7912 1
+4448	762 1
+4448	2144 1
+4448	2145 1
+4448	2398 1
+4448	2433 1
+4448	2822 1
+4448	2871 1
+4448	2909 1
+4448	3014 1
+4448	3140 1
+4448	3321 1
+4448	3417 1
+4448	3453 1
+4448	3460 1
+4448	3664 1
+4448	3812 1
+4448	3910 1
+4448	4127 1
+4448	4355 1
+4448	4400 1
+4448	4529 1
+4448	4531 1
+4448	4536 1
+4448	4547 1
+4448	4578 1
+4448	4587 1
+4448	4648 1
+4448	4717 1
+4448	4828 1
+4448	5144 1
+4448	5162 1
+4448	5308 1
+4448	5309 1
+4448	5312 1
+4448	5335 1
+4448	5412 1
+4449	4453 1
+4451	1352 1
+4451	1473 1
+4451	3334 1
+4451	4453 1
+4451	4510 1
+4451	6833 1
+4451	7092 1
+4451	7115 1
+4451	7862 1
+4452	4453 1
+4450	4453 1
+4454	3645 1
+4455	840 1
+4455	3334 1
+4455	3459 1
+4455	3645 1
+4455	4037 1
+4455	4044 1
+4455	4297 1
+4455	4529 1
+4455	4536 1
+4455	4539 1
+4455	4578 1
+4455	4631 1
+4455	4987 1
+4455	5178 1
+4455	5274 1
+4455	5288 1
+4455	5306 1
+4455	6270 1
+4455	6327 1
+4455	6832 1
+4455	7108 1
+4455	7632 1
+4456	3645 1
+4456	5028 1
+4456	5671 1
+4456	7351 1
+4457	3645 1
+4458	4220 1
+4458	4463 1
+4459	2144 1
+4459	3748 1
+4459	4463 1
+4459	5404 1
+4460	4463 1
+4460	4531 1
+4461	4199 1
+4461	4463 1
+2047	4463 1
+4462	4463 1
+4464	4422 1
+4465	2433 1
+4465	3144 1
+4465	4422 1
+4465	4552 1
+4467	4234 1
+4468	222 1
+4468	1688 1
+4468	2258 1
+4468	3456 1
+4468	4011 1
+4468	4234 1
+4468	4448 1
+4468	4557 1
+4468	4977 1
+4468	5020 1
+4468	5215 1
+4468	5245 1
+4468	5271 1
+4468	5321 1
+4468	5545 1
+4468	5592 1
+4468	6529 1
+4468	8295 1
+4469	3144 1
+4471	3664 1
+4471	4712 1
+4470	4471 1
+4473	4480 1
+4474	3453 1
+4474	4480 1
+4477	4261 1
+4477	4480 1
+4476	525 1
+4476	4191 1
+4476	4480 1
+4476	4777 1
+4476	5064 1
+4476	5233 1
+4476	5311 1
+4476	5457 1
+4476	5539 1
+4476	5926 1
+4476	6055 1
+4476	6596 1
+4476	7908 1
+4476	8139 1
+4476	8225 1
+4476	8246 1
+4478	4480 1
+4475	4480 1
+4479	4480 1
+4485	3453 1
+4485	3454 1
+4485	3635 1
+4485	4040 1
+4485	4335 1
+4485	4661 1
+4485	4712 1
+4485	4792 1
+4485	4876 1
+4485	5563 1
+4485	7292 1
+4485	7809 1
+4482	4037 1
+4482	4485 1
+4482	4587 1
+4482	4712 1
+4482	5239 1
+4482	5298 1
+4482	5563 1
+4483	15 1
+4483	1305 1
+4483	1498 1
+4483	1648 1
+4483	2276 1
+4483	2354 1
+4483	2364 1
+4483	2381 1
+4483	2386 1
+4483	2592 1
+4483	2658 1
+4483	2689 1
+4483	2765 1
+4483	3089 1
+4483	3238 1
+4483	3274 1
+4483	3291 1
+4483	3352 1
+4483	3447 1
+4483	3459 1
+4483	3479 1
+4483	3537 1
+4483	3691 1
+4483	3796 1
+4483	3962 1
+4483	4037 1
+4483	4071 1
+4483	4099 1
+4483	4110 1
+4483	4191 1
+4483	4310 1
+4483	4485 1
+4483	4500 1
+4483	4547 1
+4483	4587 1
+4483	4653 1
+4483	4712 1
+4483	4715 1
+4483	4748 1
+4483	4795 1
+4483	4797 1
+4483	4828 1
+4483	4929 1
+4483	4940 1
+4483	4986 1
+4483	4993 1
+4483	5002 1
+4483	5055 1
+4483	5058 1
+4483	5079 1
+4483	5123 1
+4483	5148 1
+4483	5155 1
+4483	5179 1
+4483	5188 1
+4483	5200 1
+4483	5204 1
+4483	5239 1
+4483	5254 1
+4483	5262 1
+4483	5296 1
+4483	5301 1
+4483	5426 1
+4483	5459 1
+4483	5467 1
+4483	5484 1
+4483	5509 1
+4483	5524 1
+4483	5527 1
+4483	5529 1
+4483	5545 1
+4483	5563 1
+4483	5592 1
+4483	5596 1
+4483	5614 1
+4483	5620 1
+4483	5684 1
+4483	5706 1
+4483	5739 1
+4483	5743 1
+4483	5745 1
+4483	5753 1
+4483	5760 1
+4483	5790 1
+4483	5799 1
+4483	5800 1
+4483	5802 1
+4483	5804 1
+4483	5806 1
+4483	5811 1
+4483	5829 1
+4483	5839 1
+4483	5863 1
+4483	5871 1
+4483	5977 1
+4483	5994 1
+4483	6027 1
+4483	6080 1
+4483	6107 1
+4483	6151 1
+4483	6166 1
+4483	6221 1
+4483	6225 1
+4483	6243 1
+4483	6269 1
+4483	6360 1
+4483	6417 1
+4483	6481 1
+4483	6505 1
+4483	6555 1
+4483	6596 1
+4483	6618 1
+4483	6634 1
+4483	6665 1
+4483	6715 1
+4483	6720 1
+4483	6724 1
+4483	6725 1
+4483	6739 1
+4483	6774 1
+4483	6784 1
+4483	6873 1
+4483	6914 1
+4483	6934 1
+4483	6946 1
+4483	6955 1
+4483	6979 1
+4483	7012 1
+4483	7021 1
+4483	7092 1
+4483	7237 1
+4483	7280 1
+4483	7289 1
+4483	7373 1
+4483	7381 1
+4483	7414 1
+4483	7553 1
+4483	7624 1
+4483	7632 1
+4483	7651 1
+4483	7662 1
+4483	7694 1
+4483	7809 1
+4483	7833 1
+4483	7862 1
+4483	7890 1
+4483	7961 1
+4483	8042 1
+4483	8128 1
+4483	8163 1
+4483	8174 1
+4483	8209 1
+4483	8295 1
+4493	762 1
+4486	72 1
+4486	762 1
+4486	1549 1
+4486	2145 1
+4486	2552 1
+4486	3352 1
+4486	3417 1
+4486	3443 1
+4486	3456 1
+4486	3808 1
+4486	3897 1
+4486	4536 1
+4486	4587 1
+4486	4631 1
+4486	4796 1
+4486	4879 1
+4486	5233 1
+4486	5255 1
+4486	5620 1
+4486	5726 1
+4494	762 1
+4495	762 1
+4488	15 1
+4488	737 1
+4488	762 1
+4488	1352 1
+4488	1498 1
+4488	2145 1
+4488	2440 1
+4488	2535 1
+4488	2658 1
+4488	2689 1
+4488	3014 1
+4488	3084 1
+4488	3238 1
+4488	3352 1
+4488	3443 1
+4488	3456 1
+4488	4099 1
+4488	4310 1
+4488	4400 1
+4488	4530 1
+4488	4795 1
+4488	4808 1
+4488	4875 1
+4488	5037 1
+4488	5200 1
+4488	5210 1
+4488	5288 1
+4488	5392 1
+4488	5412 1
+4488	5655 1
+4488	5743 1
+4488	5800 1
+4488	5817 1
+4488	5819 1
+4488	5955 1
+4488	5969 1
+4488	5980 1
+4488	6123 1
+4488	6156 1
+4488	6376 1
+4488	6571 1
+4488	6618 1
+4488	6634 1
+4488	6918 1
+4488	7021 1
+4488	7050 1
+4488	7238 1
+4488	7833 1
+4488	7908 1
+4488	7924 1
+4489	72 1
+4489	762 1
+4489	2535 1
+4489	2775 1
+4489	3238 1
+4489	3456 1
+4489	3498 1
+4489	4037 1
+4489	4191 1
+4489	4661 1
+4489	4811 1
+4489	4828 1
+4489	5254 1
+4489	5412 1
+4489	6334 1
+4490	762 1
+4496	762 1
+4496	2775 1
+4496	7351 1
+4491	762 1
+4497	762 1
+4500	2433 1
+4500	4199 1
+4504	3125 1
+4504	3443 1
+4502	3125 1
+4502	3664 1
+4503	3125 1
+4507	3806 1
+4507	6634 1
+4492	3806 1
+4492	4510 1
+4508	3806 1
+4509	1688 1
+4509	2364 1
+4509	2381 1
+4509	3537 1
+4509	3806 1
+4509	4297 1
+4509	5073 1
+4509	5092 1
+4509	5100 1
+4509	5106 1
+4509	5204 1
+4511	1984 1
+4511	2326 1
+4511	2790 1
+4511	3443 1
+4511	3453 1
+4511	3724 1
+4511	3835 1
+4511	4103 1
+4511	4110 1
+4511	4212 1
+4511	4266 1
+4511	4661 1
+4511	4719 1
+4511	4735 1
+4511	4808 1
+4498	3724 1
+4516	4199 1
+4523	2433 1
+4524	15 1
+4524	4335 1
+4524	4500 1
+4524	4875 1
+4524	5210 1
+4524	5773 1
+4524	6000 1
+4524	7144 1
+4524	7279 1
+4526	3843 1
+4526	4528 1
+4526	4529 1
+4526	4983 1
+4526	4991 1
+4527	525 1
+4527	2342 1
+4527	2369 1
+4527	3537 1
+4527	4528 1
+4527	4536 1
+4527	4645 1
+4527	4748 1
+4527	5044 1
+4527	5083 1
+4527	5130 1
+4527	5176 1
+4527	6755 1
+4527	7257 1
+4531	2398 1
+4531	2760 1
+4531	2775 1
+4531	3140 1
+4531	3352 1
+4531	3454 1
+4531	3557 1
+4531	3956 1
+4531	4219 1
+4531	4578 1
+4531	4583 1
+4531	4584 1
+4531	4588 1
+4531	4735 1
+4530	15 1
+4530	896 1
+4530	3897 1
+4530	4531 1
+4530	4678 1
+4530	4780 1
+4530	5412 1
+4530	5743 1
+4530	7632 1
+4533	4531 1
+4533	5323 1
+4533	5341 1
+4534	737 1
+4534	2516 1
+4534	3352 1
+4534	3456 1
+4534	3498 1
+4534	3796 1
+4534	4040 1
+4534	4191 1
+4534	4531 1
+4534	4648 1
+4534	4712 1
+4534	4796 1
+4534	5178 1
+4534	5545 1
+4534	5623 1
+4534	6914 1
+4534	7005 1
+4534	7879 1
+4534	8178 1
+4535	1688 1
+4535	3537 1
+4535	3812 1
+4535	4531 1
+4535	4578 1
+4536	1026 1
+4536	1733 1
+4536	1982 1
+4536	2258 1
+4536	2364 1
+4536	2381 1
+4536	2398 1
+4536	2790 1
+4536	2831 1
+4536	2917 1
+4536	3000 1
+4536	3276 1
+4536	3284 1
+4536	3334 1
+4536	3393 1
+4536	3447 1
+4536	3459 1
+4536	3643 1
+4536	3813 1
+4536	3854 1
+4536	3898 1
+4536	3922 1
+4536	4191 1
+4536	4219 1
+4536	4297 1
+4536	4298 1
+4536	4335 1
+4536	4338 1
+4536	4529 1
+4536	4530 1
+4536	4531 1
+4536	4557 1
+4536	4578 1
+4536	4653 1
+4536	4666 1
+4536	4792 1
+4536	4795 1
+4536	4899 1
+4536	4953 1
+4536	4962 1
+4536	4964 1
+4536	4983 1
+4536	4986 1
+4536	4993 1
+4536	4999 1
+4536	5022 1
+4536	5037 1
+4536	5043 1
+4536	5044 1
+4536	5045 1
+4536	5055 1
+4536	5058 1
+4536	5072 1
+4536	5073 1
+4536	5100 1
+4536	5189 1
+4536	5226 1
+4536	5254 1
+4536	5412 1
+4536	5500 1
+4536	5529 1
+4536	5539 1
+4536	5563 1
+4536	5650 1
+4536	5655 1
+4536	5694 1
+4536	5743 1
+4536	5775 1
+4536	5802 1
+4536	6004 1
+4536	6596 1
+4536	6714 1
+4536	6720 1
+4536	6790 1
+4536	6907 1
+4536	7054 1
+4536	7168 1
+4536	7378 1
+4536	7553 1
+4536	7632 1
+4536	7649 1
+4538	3812 1
+4540	4541 1
+4542	2914 1
+4542	3334 1
+4542	3897 1
+4542	4544 1
+4542	4786 1
+4542	6006 1
+4542	6422 1
+4542	7434 1
+4542	8083 1
+4543	2398 1
+4543	4544 1
+4545	1688 1
+4547	1688 1
+4547	1769 1
+4547	2014 1
+4547	2144 1
+4547	2145 1
+4547	2760 1
+4547	2775 1
+4547	3014 1
+4547	3140 1
+4547	3276 1
+4547	3447 1
+4547	3453 1
+4547	3454 1
+4547	3458 1
+4547	3460 1
+4547	3537 1
+4547	3796 1
+4547	3854 1
+4547	3956 1
+4547	3958 1
+4547	4037 1
+4547	4044 1
+4547	4072 1
+4547	4189 1
+4547	4298 1
+4547	4557 1
+4547	4613 1
+4547	4648 1
+4547	4666 1
+4547	4735 1
+4547	4792 1
+4547	4828 1
+4547	4875 1
+4547	4938 1
+4547	4946 1
+4547	4953 1
+4547	4962 1
+4547	4999 1
+4547	5044 1
+4547	5055 1
+4547	5058 1
+4547	5083 1
+4547	5115 1
+4547	5144 1
+4547	5459 1
+4550	95 1
+4550	608 1
+4550	737 1
+4550	1247 1
+4550	1549 1
+4550	1733 1
+4550	1799 1
+4550	2258 1
+4550	2354 1
+4550	2398 1
+4550	2516 1
+4550	2764 1
+4550	2822 1
+4550	2831 1
+4550	3027 1
+4550	3089 1
+4550	3092 1
+4550	3103 1
+4550	3393 1
+4550	3417 1
+4550	3456 1
+4550	3459 1
+4550	3460 1
+4550	3897 1
+4550	3910 1
+4550	4037 1
+4550	4099 1
+4550	4191 1
+4550	4247 1
+4550	4335 1
+4550	4355 1
+4550	4400 1
+4550	4448 1
+4550	4530 1
+4550	4600 1
+4550	4653 1
+4550	4666 1
+4550	4712 1
+4550	4846 1
+4550	4929 1
+4550	4964 1
+4550	4986 1
+4550	5037 1
+4550	5072 1
+4550	5123 1
+4550	5155 1
+4550	5189 1
+4550	5262 1
+4550	5321 1
+4550	5323 1
+4550	5335 1
+4550	5341 1
+4550	5364 1
+4550	5392 1
+4550	5412 1
+4550	5423 1
+4550	5430 1
+4550	5434 1
+4550	5452 1
+4550	5463 1
+4550	5465 1
+4550	5467 1
+4550	5484 1
+4550	5506 1
+4550	5509 1
+4550	5511 1
+4550	5514 1
+4550	5539 1
+4550	5545 1
+4550	5559 1
+4550	5568 1
+4550	5569 1
+4550	5570 1
+4550	5592 1
+4550	5637 1
+4550	5639 1
+4550	5650 1
+4550	5651 1
+4550	5683 1
+4550	5705 1
+4550	5817 1
+4550	5891 1
+4550	5963 1
+4550	6029 1
+4550	6251 1
+4550	6255 1
+4550	6305 1
+4550	6330 1
+4550	6523 1
+4550	6600 1
+4550	6707 1
+4550	6765 1
+4550	6938 1
+4550	6945 1
+4550	6948 1
+4550	6953 1
+4550	6955 1
+4550	6979 1
+4550	6982 1
+4550	8295 1
+4557	2276 1
+4557	2507 1
+4557	3586 1
+4557	3643 1
+4557	4041 1
+4557	4310 1
+4557	4338 1
+4557	4527 1
+4557	5072 1
+4557	5182 1
+4557	5226 1
+4557	5445 1
+4557	5524 1
+4557	5743 1
+4557	5780 1
+4557	6029 1
+4553	3334 1
+4553	4557 1
+4553	5392 1
+4554	4557 1
+4555	4557 1
+4556	4557 1
+4558	7757 1
+4560	4561 1
+4560	4661 1
+4560	4828 1
+4563	2364 1
+4563	3092 1
+4563	3140 1
+4563	3454 1
+4563	3554 1
+4563	3843 1
+4563	3898 1
+4563	4828 1
+4563	5092 1
+4563	5130 1
+4563	5132 1
+4564	72 1
+4564	737 1
+4564	2145 1
+4564	2326 1
+4564	2398 1
+4564	2535 1
+4564	2790 1
+4564	2811 1
+4564	3140 1
+4564	3276 1
+4564	3334 1
+4564	3352 1
+4564	3443 1
+4564	3454 1
+4564	3643 1
+4564	3796 1
+4564	3898 1
+4564	3956 1
+4564	3976 1
+4564	4072 1
+4564	4191 1
+4564	4297 1
+4564	4315 1
+4564	4335 1
+4564	4448 1
+4564	4578 1
+4564	4613 1
+4564	4735 1
+4564	4811 1
+4564	4929 1
+4564	5002 1
+4564	5452 1
+4564	5459 1
+4565	3454 1
+4565	4578 1
+4566	3454 1
+4566	4110 1
+4566	4400 1
+4567	2790 1
+4567	3454 1
+4568	3454 1
+4569	3140 1
+4574	346 1
+4574	1305 1
+4574	1310 1
+4574	2354 1
+4574	2398 1
+4574	2516 1
+4574	2620 1
+4574	3084 1
+4574	3334 1
+4574	3455 1
+4574	3456 1
+4574	3586 1
+4574	3748 1
+4574	3897 1
+4574	3919 1
+4574	4037 1
+4574	4103 1
+4574	4191 1
+4574	4247 1
+4574	4578 1
+4574	4781 1
+4574	4811 1
+4574	4846 1
+4574	4875 1
+4574	5079 1
+4574	5179 1
+4574	5182 1
+4574	5301 1
+4574	5412 1
+4574	5459 1
+4574	5828 1
+4574	5963 1
+4574	6044 1
+4574	6262 1
+4574	6305 1
+4574	6337 1
+4574	6624 1
+4574	6709 1
+4574	7632 1
+4574	7839 1
+4575	4578 1
+4575	4735 1
+4576	15 1
+4576	3447 1
+4576	3897 1
+4576	3919 1
+4576	4448 1
+4576	4530 1
+4576	4536 1
+4576	4578 1
+4576	4977 1
+4576	5463 1
+4577	4072 1
+4577	4578 1
+4581	1185 1
+4581	3433 1
+4581	4297 1
+4582	2381 1
+4582	2398 1
+4582	3014 1
+4582	4583 1
+4582	4728 1
+4586	2790 1
+4586	3352 1
+4586	4072 1
+4586	4335 1
+4586	4466 1
+4586	4778 1
+4586	4779 1
+4586	4780 1
+4586	5683 1
+4587	15 1
+4587	2145 1
+4587	2535 1
+4587	2592 1
+4587	3452 1
+4587	3453 1
+4587	3498 1
+4587	3537 1
+4587	3634 1
+4587	3748 1
+4587	3835 1
+4587	3873 1
+4587	4072 1
+4587	4212 1
+4587	4261 1
+4587	4448 1
+4587	4483 1
+4587	4662 1
+4587	4792 1
+4587	4828 1
+4587	4953 1
+4587	4999 1
+4587	5130 1
+4587	5350 1
+4587	5844 1
+4587	5947 1
+4587	6566 1
+4588	2326 1
+4588	3014 1
+4588	3352 1
+4588	3443 1
+4588	3460 1
+4588	3958 1
+4588	4072 1
+4588	4261 1
+4588	4266 1
+4588	4661 1
+4588	4719 1
+4592	1961 1
+4592	2775 1
+4592	4037 1
+4592	4808 1
+4592	5026 1
+4592	5133 1
+4593	1961 1
+4594	2144 1
+4595	2144 1
+4595	3453 1
+4595	4468 1
+4596	2144 1
+4597	2144 1
+4598	15 1
+4598	1026 1
+4598	2160 1
+4598	2440 1
+4598	3334 1
+4598	3352 1
+4598	3459 1
+4598	3498 1
+4598	3755 1
+4598	3885 1
+4598	3956 1
+4598	4011 1
+4598	4099 1
+4598	4211 1
+4598	4401 1
+4598	4536 1
+4598	4875 1
+4598	5002 1
+4598	5028 1
+4598	5072 1
+4598	5096 1
+4598	5121 1
+4598	5178 1
+4598	5179 1
+4598	5263 1
+4598	5301 1
+4598	5404 1
+4598	5415 1
+4598	5482 1
+4598	5527 1
+4598	5584 1
+4598	5697 1
+4598	5705 1
+4598	5756 1
+4598	5773 1
+4598	5776 1
+4598	5784 1
+4598	5790 1
+4598	5800 1
+4598	5824 1
+4598	5829 1
+4598	5839 1
+4598	5863 1
+4598	5871 1
+4598	5902 1
+4598	6080 1
+4598	6105 1
+4598	6151 1
+4598	6156 1
+4598	6246 1
+4598	6261 1
+4598	6270 1
+4598	6299 1
+4598	6327 1
+4598	6400 1
+4598	6523 1
+4598	6599 1
+4598	6634 1
+4598	6700 1
+4598	6715 1
+4598	6720 1
+4598	6739 1
+4598	6765 1
+4598	6855 1
+4598	7225 1
+4598	7279 1
+4598	7478 1
+4598	7553 1
+4598	7620 1
+4598	7757 1
+4598	7839 1
+4599	3956 1
+4600	15 1
+4600	2237 1
+4600	2760 1
+4600	2822 1
+4600	4041 1
+4600	4400 1
+4600	4781 1
+4600	4792 1
+4600	4846 1
+4600	4999 1
+4600	5189 1
+4600	5341 1
+4600	5445 1
+4600	5482 1
+4600	6229 1
+4602	2760 1
+4602	5445 1
+4601	2760 1
+4603	4605 1
+4604	4605 1
+4604	4712 1
+4604	5188 1
+4604	6532 1
+4604	6560 1
+4604	6621 1
+4604	7624 1
+4608	3958 1
+4607	3958 1
+4609	3443 1
+4609	3958 1
+2841	72 1
+4611	72 1
+4612	4613 1
+4615	3014 1
+4616	3014 1
+4616	3089 1
+4616	3238 1
+4616	4037 1
+4616	5799 1
+4616	6930 1
+4616	7632 1
+4617	3014 1
+4618	3014 1
+4618	3034 1
+4618	3453 1
+4618	4646 1
+4619	4620 1
+4622	3443 1
+4623	3352 1
+4623	3443 1
+4624	3443 1
+4624	4037 1
+4625	72 1
+4625	3103 1
+4625	3443 1
+4625	3796 1
+4629	3443 1
+4626	2775 1
+4626	3443 1
+4626	3456 1
+4626	3796 1
+4626	6780 1
+4627	3443 1
+4630	15 1
+4630	3976 1
+4630	4037 1
+4630	5254 1
+4487	406 1
+4487	1680 1
+4487	2354 1
+4487	2369 1
+4487	2516 1
+4487	2775 1
+4487	2917 1
+4487	3089 1
+4487	3456 1
+4487	3897 1
+4487	3976 1
+4487	4191 1
+4487	4551 1
+4487	4587 1
+4487	4666 1
+4487	4735 1
+4487	4964 1
+4487	4977 1
+4487	4991 1
+4487	5115 1
+4487	5208 1
+4487	5215 1
+4487	5298 1
+4487	5301 1
+4487	5306 1
+4487	5392 1
+4487	5412 1
+4487	5484 1
+4487	5563 1
+4487	5564 1
+4487	5817 1
+4631	5545 1
+4632	155 1
+4632	967 1
+4632	1159 1
+4632	1385 1
+4632	1473 1
+4632	1498 1
+4632	1548 1
+4632	1680 1
+4632	1799 1
+4632	1823 1
+4632	2223 1
+4632	2276 1
+4632	2285 1
+4632	2369 1
+4632	2490 1
+4632	2535 1
+4632	2658 1
+4632	2689 1
+4632	2774 1
+4632	2909 1
+4632	2925 1
+4632	2940 1
+4632	3000 1
+4632	3084 1
+4632	3106 1
+4632	3191 1
+4632	3393 1
+4632	3447 1
+4632	3460 1
+4632	3479 1
+4632	3498 1
+4632	3554 1
+4632	3586 1
+4632	3643 1
+4632	3752 1
+4632	3770 1
+4632	3796 1
+4632	3843 1
+4632	3873 1
+4632	3885 1
+4632	3910 1
+4632	3958 1
+4632	4011 1
+4632	4037 1
+4632	4040 1
+4632	4041 1
+4632	4071 1
+4632	4099 1
+4632	4103 1
+4632	4124 1
+4632	4175 1
+4632	4212 1
+4632	4261 1
+4632	4276 1
+4632	4297 1
+4632	4310 1
+4632	4315 1
+4632	4338 1
+4632	4355 1
+4632	4361 1
+4632	4412 1
+4632	4435 1
+4632	4482 1
+4632	4483 1
+4632	4534 1
+4632	4574 1
+4632	4588 1
+4632	4621 1
+4632	4653 1
+4632	4666 1
+4632	4715 1
+4632	4792 1
+4632	4797 1
+4632	4798 1
+4632	4808 1
+4632	4814 1
+4632	4828 1
+4632	4846 1
+4632	4940 1
+4632	4964 1
+4632	4980 1
+4632	4994 1
+4632	5002 1
+4632	5012 1
+4632	5020 1
+4632	5022 1
+4632	5079 1
+4632	5083 1
+4632	5092 1
+4632	5100 1
+4632	5121 1
+4632	5123 1
+4632	5148 1
+4632	5178 1
+4632	5189 1
+4632	5200 1
+4632	5215 1
+4632	5222 1
+4632	5233 1
+4632	5262 1
+4632	5288 1
+4632	5327 1
+4632	5335 1
+4632	5404 1
+4632	5423 1
+4632	5437 1
+4632	5439 1
+4632	5457 1
+4632	5466 1
+4632	5484 1
+4632	5487 1
+4632	5524 1
+4632	5529 1
+4632	5539 1
+4632	5559 1
+4632	5568 1
+4632	5671 1
+4632	5683 1
+4632	5684 1
+4632	5693 1
+4632	5743 1
+4632	5753 1
+4632	5760 1
+4632	5780 1
+4632	5798 1
+4632	5800 1
+4632	5804 1
+4632	5807 1
+4632	5819 1
+4632	5827 1
+4632	5872 1
+4632	5886 1
+4632	5891 1
+4632	5933 1
+4632	5936 1
+4632	5947 1
+4632	6006 1
+4632	6043 1
+4632	6097 1
+4632	6124 1
+4632	6151 1
+4632	6156 1
+4632	6166 1
+4632	6174 1
+4632	6218 1
+4632	6227 1
+4632	6246 1
+4632	6251 1
+4632	6255 1
+4632	6262 1
+4632	6299 1
+4632	6305 1
+4632	6306 1
+4632	6327 1
+4632	6328 1
+4632	6414 1
+4632	6422 1
+4632	6432 1
+4632	6437 1
+4632	6441 1
+4632	6458 1
+4632	6474 1
+4632	6481 1
+4632	6498 1
+4632	6523 1
+4632	6555 1
+4632	6589 1
+4632	6595 1
+4632	6599 1
+4632	6618 1
+4632	6634 1
+4632	6665 1
+4632	6737 1
+4632	6780 1
+4632	6860 1
+4632	6875 1
+4632	6914 1
+4632	6933 1
+4632	6934 1
+4632	6946 1
+4632	6948 1
+4632	6955 1
+4632	6976 1
+4632	6979 1
+4632	7005 1
+4632	7021 1
+4632	7052 1
+4632	7073 1
+4632	7092 1
+4632	7094 1
+4632	7143 1
+4632	7295 1
+4632	7341 1
+4632	7351 1
+4632	7373 1
+4632	7381 1
+4632	7391 1
+4632	7510 1
+4632	7587 1
+4632	7618 1
+4632	7620 1
+4632	7624 1
+4632	7646 1
+4632	7647 1
+4632	7695 1
+4632	7699 1
+4632	7726 1
+4632	7795 1
+4632	7803 1
+4632	7809 1
+4632	7810 1
+4632	7813 1
+4632	7833 1
+4632	7839 1
+4632	7855 1
+4632	7871 1
+4632	7882 1
+4632	7908 1
+4632	7912 1
+4632	7961 1
+4632	8073 1
+4632	8122 1
+4632	8163 1
+4632	8174 1
+4632	8192 1
+4632	8209 1
+4632	8237 1
+4632	8295 1
+4633	2456 1
+4633	2517 1
+4633	3748 1
+4633	3835 1
+4633	4011 1
+4633	4044 1
+4633	4103 1
+4633	4212 1
+4633	4261 1
+4633	4666 1
+4633	4706 1
+4633	4814 1
+4636	4468 1
+4638	4639 1
+4640	1984 1
+4640	5817 1
+4641	1984 1
+4644	3034 1
+4645	4646 1
+4649	3309 1
+4651	3453 1
+4651	3835 1
+4652	2516 1
+4652	3453 1
+4652	4530 1
+4652	4653 1
+4652	5020 1
+4652	5144 1
+4652	5335 1
+4652	5543 1
+4653	1385 1
+4653	1680 1
+4653	1799 1
+4653	2354 1
+4653	2386 1
+4653	2398 1
+4653	2516 1
+4653	2552 1
+4653	2592 1
+4653	2605 1
+4653	2689 1
+4653	2822 1
+4653	2831 1
+4653	2909 1
+4653	3089 1
+4653	3106 1
+4653	3276 1
+4653	3291 1
+4653	3393 1
+4653	3417 1
+4653	3447 1
+4653	3453 1
+4653	3455 1
+4653	3456 1
+4653	3459 1
+4653	3460 1
+4653	3537 1
+4653	3664 1
+4653	3691 1
+4653	3755 1
+4653	3796 1
+4653	3897 1
+4653	3910 1
+4653	4041 1
+4653	4098 1
+4653	4127 1
+4653	4191 1
+4653	4315 1
+4653	4335 1
+4653	4355 1
+4653	4400 1
+4653	4448 1
+4653	4468 1
+4653	4482 1
+4653	4530 1
+4653	4536 1
+4653	4547 1
+4653	4574 1
+4653	4587 1
+4653	4600 1
+4653	4625 1
+4653	4631 1
+4653	4632 1
+4653	4645 1
+4653	4661 1
+4653	4748 1
+4653	4777 1
+4653	4795 1
+4653	4828 1
+4653	4866 1
+4653	4964 1
+4653	4977 1
+4653	4983 1
+4653	4994 1
+4653	5020 1
+4653	5123 1
+4653	5141 1
+4653	5146 1
+4653	5162 1
+4653	5189 1
+4653	5200 1
+4653	5204 1
+4653	5208 1
+4653	5210 1
+4653	5215 1
+4653	5222 1
+4653	5226 1
+4653	5255 1
+4653	5260 1
+4653	5305 1
+4653	5308 1
+4653	5309 1
+4653	5326 1
+4653	5327 1
+4653	5351 1
+4653	5354 1
+4653	5363 1
+4653	5392 1
+4653	5393 1
+4653	5423 1
+4653	5454 1
+4653	5459 1
+4653	5463 1
+4653	5484 1
+4653	5509 1
+4653	5545 1
+4653	5563 1
+4653	5564 1
+4653	5569 1
+4653	5620 1
+4653	5623 1
+4653	5630 1
+4653	5635 1
+4653	5637 1
+4653	5650 1
+4653	5663 1
+4653	5680 1
+4653	5737 1
+4653	5743 1
+4653	5844 1
+4653	6164 1
+4653	6441 1
+4653	6505 1
+4653	8295 1
+4654	3453 1
+4654	6148 1
+4655	3321 1
+4655	3453 1
+4635	4220 1
+4659	2237 1
+4659	3321 1
+4659	4999 1
+4660	3321 1
+4661	2517 1
+4661	2811 1
+4661	3321 1
+4661	3635 1
+4661	3796 1
+4661	4037 1
+4661	4261 1
+4661	4335 1
+4661	4547 1
+4661	4662 1
+4661	4719 1
+4661	5459 1
+4661	5563 1
+4661	5596 1
+4661	5804 1
+4661	5822 1
+4661	6555 1
+4661	7855 1
+4661	7882 1
+4662	72 1
+4662	346 1
+4662	1549 1
+4662	1769 1
+4662	2398 1
+4662	2576 1
+4662	2917 1
+4662	3073 1
+4662	3238 1
+4662	3276 1
+4662	3321 1
+4662	3334 1
+4662	3460 1
+4662	3631 1
+4662	3796 1
+4662	3835 1
+4662	4037 1
+4662	4044 1
+4662	4099 1
+4662	4361 1
+4662	4536 1
+4662	4666 1
+4662	4780 1
+4662	4797 1
+4662	4820 1
+4662	4953 1
+4662	4962 1
+4662	5083 1
+4662	5123 1
+4662	5452 1
+4662	5454 1
+4662	5459 1
+4662	5693 1
+4662	5760 1
+4662	5897 1
+4662	5925 1
+4662	5947 1
+4662	5963 1
+4662	6624 1
+4662	6665 1
+4662	6774 1
+4662	6946 1
+4662	7073 1
+4662	7143 1
+4662	7620 1
+4662	7699 1
+4663	1305 1
+4663	2917 1
+4663	3321 1
+4663	3748 1
+4663	4037 1
+4663	4191 1
+4663	4335 1
+4663	4588 1
+4663	4661 1
+4663	4999 1
+4664	2145 1
+4664	2456 1
+4664	4666 1
+4664	4706 1
+4664	4712 1
+4664	4735 1
+4647	15 1
+4647	2145 1
+4647	2326 1
+4647	2565 1
+4647	2696 1
+4647	3433 1
+4647	3447 1
+4647	3456 1
+4647	5123 1
+4647	5412 1
+4647	6907 1
+4665	737 1
+4665	1360 1
+4665	2145 1
+4665	3417 1
+4665	3460 1
+4665	3537 1
+4665	3748 1
+4665	4814 1
+4665	5305 1
+4666	840 1
+4666	3089 1
+4666	3293 1
+4666	3958 1
+4666	4037 1
+4666	4247 1
+4666	4687 1
+4666	5482 1
+4666	5506 1
+4666	5850 1
+4666	6780 1
+4666	7012 1
+4666	7063 1
+4666	7860 1
+4666	7908 1
+4666	7912 1
+4666	7961 1
+4666	7992 1
+4666	8002 1
+4666	8042 1
+4666	8043 1
+4666	8044 1
+4666	8073 1
+4666	8083 1
+4672	4666 1
+4672	4875 1
+4667	4666 1
+4673	1352 1
+4673	1823 1
+4673	1972 1
+4673	2440 1
+4673	2535 1
+4673	2620 1
+4673	2774 1
+4673	2914 1
+4673	3284 1
+4673	3291 1
+4673	3614 1
+4673	3634 1
+4673	3842 1
+4673	3897 1
+4673	3919 1
+4673	4099 1
+4673	4219 1
+4673	4483 1
+4673	4587 1
+4673	4604 1
+4673	4654 1
+4673	4666 1
+4673	4677 1
+4673	4687 1
+4673	4689 1
+4673	4712 1
+4673	4715 1
+4673	4717 1
+4673	4748 1
+4673	4786 1
+4673	4791 1
+4673	4795 1
+4673	4798 1
+4673	4980 1
+4673	4994 1
+4673	5083 1
+4673	5092 1
+4673	5106 1
+4673	5140 1
+4673	5188 1
+4673	5200 1
+4673	5210 1
+4673	5215 1
+4673	5233 1
+4673	5273 1
+4673	5423 1
+4673	5439 1
+4673	5479 1
+4673	5584 1
+4673	5626 1
+4673	5638 1
+4673	5684 1
+4673	5738 1
+4673	5798 1
+4673	5799 1
+4673	5804 1
+4673	5827 1
+4673	5980 1
+4673	6006 1
+4673	6156 1
+4673	6218 1
+4673	6327 1
+4673	6328 1
+4673	6334 1
+4673	6337 1
+4673	6340 1
+4673	6388 1
+4673	6407 1
+4673	6409 1
+4673	6424 1
+4673	6432 1
+4673	6441 1
+4673	6458 1
+4673	6474 1
+4673	6481 1
+4673	6498 1
+4673	6501 1
+4673	6505 1
+4673	6528 1
+4673	6529 1
+4673	6552 1
+4673	6554 1
+4673	6567 1
+4673	6570 1
+4673	6571 1
+4673	6576 1
+4673	6589 1
+4673	6590 1
+4673	6594 1
+4673	6595 1
+4673	6599 1
+4673	6600 1
+4673	6628 1
+4673	6632 1
+4673	6634 1
+4673	6685 1
+4668	4666 1
+4669	938 1
+4669	3334 1
+4669	3796 1
+4669	4037 1
+4669	4529 1
+4669	4666 1
+4669	5800 1
+4669	5801 1
+4669	6442 1
+4669	6736 1
+4669	6913 1
+4669	6953 1
+4669	7254 1
+4670	4666 1
+4671	2398 1
+4671	2456 1
+4671	3554 1
+4671	4625 1
+4671	4666 1
+4671	5100 1
+4671	5459 1
+4674	3460 1
+4674	4666 1
+4674	8212 1
+4681	1305 1
+4681	1498 1
+4681	2223 1
+4681	2326 1
+4681	2696 1
+4681	2917 1
+4681	3297 1
+4681	3334 1
+4681	3460 1
+4681	3748 1
+4681	4037 1
+4681	4298 1
+4681	4588 1
+4681	4792 1
+4681	4811 1
+4681	4962 1
+4681	4993 1
+4681	5055 1
+4681	7092 1
+4681	7992 1
+4683	3460 1
+4682	1310 1
+4682	1769 1
+4682	2790 1
+4682	2811 1
+4682	3460 1
+4682	3635 1
+4682	3854 1
+4682	3898 1
+4682	4261 1
+4682	4298 1
+4682	4551 1
+4682	4661 1
+4682	4953 1
+4682	4999 1
+4686	406 1
+4686	1159 1
+4686	1305 1
+4686	1385 1
+4686	1680 1
+4686	2354 1
+4686	2369 1
+4686	2381 1
+4686	2398 1
+4686	2516 1
+4686	2689 1
+4686	2775 1
+4686	3089 1
+4686	3456 1
+4686	3554 1
+4686	3664 1
+4686	3691 1
+4686	3885 1
+4686	3897 1
+4686	3976 1
+4686	4037 1
+4686	4191 1
+4686	4338 1
+4686	4441 1
+4686	4534 1
+4686	4587 1
+4686	4645 1
+4686	4653 1
+4686	4661 1
+4686	4717 1
+4686	4964 1
+4686	5020 1
+4686	5083 1
+4686	5092 1
+4686	5100 1
+4686	5106 1
+4686	5130 1
+4686	5155 1
+4686	5210 1
+4686	5233 1
+4686	5295 1
+4686	5308 1
+4686	5387 1
+4686	5392 1
+4686	5404 1
+4686	5412 1
+4686	5415 1
+4686	5449 1
+4686	5452 1
+4686	5454 1
+4686	5463 1
+4686	5484 1
+4686	5683 1
+4686	5705 1
+4686	5743 1
+4686	5928 1
+4686	8295 1
+4687	2014 1
+4687	2237 1
+4687	2285 1
+4687	2440 1
+4687	2456 1
+4687	3479 1
+4687	4266 1
+4687	4335 1
+4687	4588 1
+4687	4661 1
+4687	4706 1
+4687	4735 1
+4687	4824 1
+4687	4983 1
+4687	5176 1
+4687	5254 1
+4687	5543 1
+4687	5824 1
+4687	6400 1
+4687	6498 1
+4687	6599 1
+4687	6613 1
+4687	6789 1
+4688	346 1
+4688	1305 1
+4688	1310 1
+4688	1360 1
+4688	1769 1
+4688	2014 1
+4688	2237 1
+4688	2326 1
+4688	2456 1
+4688	2696 1
+4688	2775 1
+4688	2787 1
+4688	2811 1
+4688	3002 1
+4688	3073 1
+4688	3276 1
+4688	3334 1
+4688	3352 1
+4688	3433 1
+4688	3447 1
+4688	3452 1
+4688	3458 1
+4688	3607 1
+4688	3635 1
+4688	3643 1
+4688	3748 1
+4688	3843 1
+4688	3854 1
+4688	3898 1
+4688	4037 1
+4688	4040 1
+4688	4044 1
+4688	4103 1
+4688	4189 1
+4688	4212 1
+4688	4261 1
+4688	4266 1
+4688	4335 1
+4688	4551 1
+4688	4661 1
+4688	4662 1
+4688	4706 1
+4688	4719 1
+4688	4735 1
+4688	4776 1
+4688	4792 1
+4688	4796 1
+4688	4808 1
+4688	4811 1
+4688	4814 1
+4688	4820 1
+4688	4827 1
+4688	4938 1
+4688	4942 1
+4688	4953 1
+4688	4962 1
+4688	4983 1
+4688	4999 1
+4688	5026 1
+4689	4661 1
+4693	4261 1
+4693	5162 1
+4692	4261 1
+4694	4261 1
+4695	4261 1
+4696	4261 1
+4697	4261 1
+4698	4261 1
+4699	4261 1
+4700	4261 1
+4701	4261 1
+4702	4261 1
+4703	4261 1
+4704	4261 1
+4705	3334 1
+4705	4261 1
+4705	4728 1
+4706	4261 1
+4706	4266 1
+4706	4792 1
+4707	4261 1
+4708	4261 1
+4709	1473 1
+4709	3106 1
+4709	3456 1
+4709	3586 1
+4709	3796 1
+4709	4071 1
+4709	4261 1
+4709	4338 1
+4709	4981 1
+4709	5037 1
+4709	5055 1
+4709	5459 1
+4709	5524 1
+4709	5684 1
+4709	5775 1
+4709	6123 1
+4709	6458 1
+4709	7119 1
+4709	7510 1
+4709	7871 1
+4709	7874 1
+4709	7890 1
+4709	7912 1
+4709	7961 1
+4709	7979 1
+4710	3910 1
+4710	4261 1
+4710	4706 1
+4710	4735 1
+4710	4824 1
+4710	4875 1
+4710	5100 1
+4710	5239 1
+4711	4261 1
+4714	737 1
+4714	4719 1
+4714	5775 1
+4715	3103 1
+4715	4298 1
+4715	4341 1
+4715	4400 1
+4715	4719 1
+4715	4964 1
+4715	5020 1
+4715	5321 1
+4715	5457 1
+4715	5790 1
+4715	5844 1
+4716	4719 1
+2621	2160 1
+2621	4719 1
+2621	5305 1
+2621	5412 1
+2621	6023 1
+2621	6481 1
+2621	6770 1
+2621	6789 1
+4717	737 1
+4717	896 1
+4717	967 1
+4717	2381 1
+4717	2456 1
+4717	2516 1
+4717	2565 1
+4717	2658 1
+4717	2831 1
+4717	3084 1
+4717	3089 1
+4717	3293 1
+4717	3334 1
+4717	3459 1
+4717	3796 1
+4717	3842 1
+4717	4099 1
+4717	4310 1
+4717	4448 1
+4717	4483 1
+4717	4536 1
+4717	4587 1
+4717	4666 1
+4717	4712 1
+4717	4719 1
+4717	4748 1
+4717	4764 1
+4717	4798 1
+4717	4814 1
+4717	4828 1
+4717	4899 1
+4717	5123 1
+4717	5178 1
+4717	5254 1
+4717	5273 1
+4717	5439 1
+4717	5463 1
+4717	5524 1
+4717	5596 1
+4717	5624 1
+4717	5650 1
+4717	5697 1
+4717	5743 1
+4717	5760 1
+4717	5829 1
+4717	5972 1
+4717	6059 1
+4717	6083 1
+4717	6221 1
+4717	6272 1
+4717	6553 1
+4717	6555 1
+4717	6560 1
+4717	6576 1
+4717	6832 1
+4717	6979 1
+4717	7131 1
+4717	7277 1
+4717	7381 1
+4717	7618 1
+4717	7620 1
+4717	7961 1
+4718	1680 1
+4718	1799 1
+4718	2001 1
+4718	2354 1
+4718	2689 1
+4718	2785 1
+4718	2822 1
+4718	2909 1
+4718	3089 1
+4718	3103 1
+4718	3456 1
+4718	3460 1
+4718	3691 1
+4718	3796 1
+4718	3910 1
+4718	4041 1
+4718	4175 1
+4718	4315 1
+4718	4482 1
+4718	4653 1
+4718	4719 1
+4718	4964 1
+4718	5026 1
+4718	5033 1
+4718	5123 1
+4718	5204 1
+4718	5222 1
+4718	5231 1
+4718	5239 1
+4718	5260 1
+4718	5267 1
+4718	5305 1
+4718	5306 1
+4718	5341 1
+4718	5354 1
+4718	5375 1
+4718	5415 1
+4718	5434 1
+4718	5449 1
+4718	5459 1
+4718	5564 1
+4718	5620 1
+4718	5630 1
+4718	5743 1
+4718	5844 1
+4718	5886 1
+4721	2790 1
+4721	5817 1
+4720	2790 1
+4712	15 1
+4712	737 1
+4712	967 1
+4712	1026 1
+4712	1310 1
+4712	1352 1
+4712	1799 1
+4712	1982 1
+4712	2364 1
+4712	2398 1
+4712	2535 1
+4712	2565 1
+4712	2774 1
+4712	2831 1
+4712	2851 1
+4712	2909 1
+4712	3015 1
+4712	3089 1
+4712	3238 1
+4712	3334 1
+4712	3459 1
+4712	3635 1
+4712	3643 1
+4712	3726 1
+4712	3755 1
+4712	3873 1
+4712	3885 1
+4712	3897 1
+4712	3910 1
+4712	4037 1
+4712	4175 1
+4712	4247 1
+4712	4310 1
+4712	4335 1
+4712	4361 1
+4712	4483 1
+4712	4534 1
+4712	4574 1
+4712	4717 1
+4712	4735 1
+4712	4791 1
+4712	4795 1
+4712	4828 1
+4712	4846 1
+4712	4875 1
+4712	4987 1
+4712	5002 1
+4712	5028 1
+4712	5123 1
+4712	5155 1
+4712	5178 1
+4712	5189 1
+4712	5233 1
+4712	5254 1
+4712	5288 1
+4712	5449 1
+4712	5452 1
+4712	5459 1
+4712	5463 1
+4712	5524 1
+4712	5527 1
+4712	5543 1
+4712	5545 1
+4712	5638 1
+4712	5651 1
+4712	5743 1
+4712	5753 1
+4712	5776 1
+4712	5800 1
+4712	5811 1
+4712	5936 1
+4712	5950 1
+4712	6006 1
+4712	6027 1
+4712	6123 1
+4712	6255 1
+4712	6262 1
+4712	6269 1
+4712	6270 1
+4712	6306 1
+4712	6328 1
+4712	6330 1
+4712	6334 1
+4712	6337 1
+4712	6407 1
+4712	6498 1
+4712	6501 1
+4712	6560 1
+4712	6566 1
+4712	6606 1
+4712	6715 1
+4712	6789 1
+4712	6803 1
+4712	6833 1
+4712	6855 1
+4712	6860 1
+4712	6942 1
+4712	6955 1
+4712	6967 1
+4712	6994 1
+4712	7047 1
+4712	7054 1
+4712	7088 1
+4712	7092 1
+4712	7144 1
+4712	7168 1
+4712	7214 1
+4712	7225 1
+4712	7237 1
+4712	7279 1
+4712	7373 1
+4712	7422 1
+4712	7478 1
+4712	7553 1
+4712	7587 1
+4712	7632 1
+4712	7673 1
+4712	7699 1
+4712	7707 1
+4712	8295 1
+4712	8297 1
+4723	3635 1
+4725	1305 1
+4725	1310 1
+4725	1769 1
+4725	2381 1
+4725	2456 1
+4725	2592 1
+4725	2787 1
+4725	2811 1
+4725	3002 1
+4725	3284 1
+4725	3334 1
+4725	3452 1
+4725	3664 1
+4725	3813 1
+4725	3843 1
+4725	3898 1
+4725	4037 1
+4725	4040 1
+4725	4044 1
+4725	4103 1
+4725	4547 1
+4725	4551 1
+4725	4796 1
+4725	4808 1
+4725	4875 1
+4725	4983 1
+4725	5073 1
+4725	5075 1
+4725	5092 1
+4725	5106 1
+4725	5115 1
+4725	5130 1
+4725	5132 1
+4725	5144 1
+4725	5204 1
+4725	6503 1
+4726	1680 1
+4726	2369 1
+4726	3027 1
+4726	3106 1
+4726	3459 1
+4726	3910 1
+4726	4219 1
+4726	4315 1
+4726	4448 1
+4726	4468 1
+4726	4587 1
+4726	4728 1
+4726	4820 1
+4726	4824 1
+4726	5222 1
+4727	4728 1
+4733	2517 1
+4733	4335 1
+4733	4735 1
+4733	5947 1
+4736	4735 1
+4675	4735 1
+4742	3352 1
+4742	4735 1
+4737	3830 1
+4737	4735 1
+4737	5838 1
+4738	4735 1
+4739	15 1
+4739	1473 1
+4739	2456 1
+4739	3310 1
+4739	4335 1
+4739	4600 1
+4739	4706 1
+4739	4735 1
+4739	5028 1
+4739	5863 1
+4739	7478 1
+4743	4735 1
+4743	4875 1
+4745	15 1
+4745	4735 1
+4740	4735 1
+4744	4335 1
+4744	4735 1
+4746	1548 1
+4746	3002 1
+4746	3276 1
+4746	3352 1
+4746	3458 1
+4746	3537 1
+4746	3835 1
+4746	3854 1
+4746	4124 1
+4746	4654 1
+4746	4735 1
+4746	4792 1
+4746	4983 1
+4746	5178 1
+4746	5484 1
+4746	5760 1
+4746	6296 1
+4746	6311 1
+4741	3002 1
+4741	4735 1
+4741	4828 1
+4749	3748 1
+4749	4706 1
+4749	4820 1
+4750	2696 1
+4750	3748 1
+4750	6124 1
+4751	2775 1
+4751	3352 1
+4751	3748 1
+4751	5083 1
+4754	3748 1
+4752	3748 1
+4753	3748 1
+4755	4266 1
+4756	72 1
+4756	1305 1
+4756	1680 1
+4756	2001 1
+4756	2014 1
+4756	2326 1
+4756	2354 1
+4756	2369 1
+4756	2398 1
+4756	2456 1
+4756	2576 1
+4756	3334 1
+4756	3691 1
+4756	3755 1
+4756	3958 1
+4756	3976 1
+4756	4037 1
+4756	4266 1
+4756	4335 1
+4756	4588 1
+4756	4653 1
+4756	4776 1
+4756	4796 1
+4756	4942 1
+4756	4964 1
+4756	5058 1
+4756	5083 1
+4756	5092 1
+4756	5233 1
+4756	5457 1
+4756	5459 1
+4756	5737 1
+4756	5760 1
+4756	6560 1
+4757	2456 1
+4757	4040 1
+4757	4266 1
+4757	4808 1
+4757	4811 1
+4757	4814 1
+4759	3835 1
+4748	1305 1
+4748	1310 1
+4748	1972 1
+4748	2326 1
+4748	2364 1
+4748	2398 1
+4748	2822 1
+4748	3284 1
+4748	3835 1
+4748	3898 1
+4748	3910 1
+4748	3976 1
+4748	4298 1
+4748	4468 1
+4748	4500 1
+4748	4507 1
+4748	4527 1
+4748	4776 1
+4748	4987 1
+4748	5176 1
+4748	5182 1
+4748	5204 1
+4748	5301 1
+4748	5323 1
+4748	5335 1
+4748	5354 1
+4748	5364 1
+4748	5430 1
+4748	5514 1
+4748	5640 1
+4748	5991 1
+4748	6009 1
+4748	6334 1
+4748	6571 1
+4748	6590 1
+4748	6594 1
+4748	6599 1
+4748	6739 1
+4760	1305 1
+4760	2014 1
+4760	3352 1
+4760	3911 1
+4760	5055 1
+4760	7110 1
+4760	7119 1
+4761	3352 1
+4762	3352 1
+4763	3352 1
+4764	2398 1
+4764	3000 1
+4764	3084 1
+4764	3089 1
+4764	3293 1
+4764	3352 1
+4764	3459 1
+4764	3631 1
+4764	3796 1
+4764	3873 1
+4764	4037 1
+4764	4488 1
+4764	4536 1
+4764	4547 1
+4764	4712 1
+4764	4717 1
+4764	4875 1
+4764	5022 1
+4764	5106 1
+4764	5123 1
+4764	5200 1
+4764	5254 1
+4764	5273 1
+4764	5454 1
+4764	5479 1
+4764	5484 1
+4764	5543 1
+4764	5721 1
+4764	5800 1
+4764	5801 1
+4764	5818 1
+4764	5844 1
+4764	5947 1
+4764	6006 1
+4764	6043 1
+4764	6123 1
+4764	6221 1
+4764	6229 1
+4764	6243 1
+4764	6442 1
+4764	6560 1
+4764	6665 1
+4764	6715 1
+4764	6784 1
+4764	6832 1
+4764	6901 1
+4764	7092 1
+4764	7143 1
+4764	7233 1
+4764	7279 1
+4764	7373 1
+4764	7662 1
+4764	7908 1
+4765	1548 1
+4765	2354 1
+4765	3352 1
+4765	4588 1
+4771	3352 1
+4771	7277 1
+4771	8174 1
+4766	3352 1
+4773	4776 1
+4774	346 1
+4774	2326 1
+4774	2456 1
+4774	4040 1
+4774	4103 1
+4774	4212 1
+4774	4776 1
+4774	4796 1
+4774	4808 1
+4774	4811 1
+4774	4814 1
+4774	4827 1
+4774	4831 1
+4778	4780 1
+4777	4778 1
+4777	5285 1
+4781	15 1
+4781	737 1
+4781	896 1
+4781	1352 1
+4781	1385 1
+4781	1865 1
+4781	1982 1
+4781	2276 1
+4781	2456 1
+4781	2516 1
+4781	3089 1
+4781	3274 1
+4781	3498 1
+4781	3873 1
+4781	4335 1
+4781	4574 1
+4781	4999 1
+4781	5028 1
+4781	5178 1
+4781	5479 1
+4781	5484 1
+4781	5624 1
+4781	5828 1
+4781	6124 1
+4781	6246 1
+4781	6458 1
+4781	7012 1
+4782	2456 1
+4782	4953 1
+4796	737 1
+4796	1548 1
+4796	4534 1
+4796	5226 1
+4785	4796 1
+4786	4791 1
+4786	4796 1
+4786	7879 1
+4787	4796 1
+4788	3460 1
+4788	4551 1
+4788	4764 1
+4788	4791 1
+4788	4796 1
+4788	5829 1
+4788	6032 1
+4788	6388 1
+4788	6618 1
+4788	6737 1
+4788	6783 1
+4788	6833 1
+4788	7021 1
+4788	7389 1
+4788	7649 1
+4788	7857 1
+4788	7879 1
+4788	7910 1
+4788	7912 1
+4788	7924 1
+4789	4796 1
+4789	7879 1
+4790	4796 1
+4791	4796 1
+4792	737 1
+4792	2273 1
+4792	2565 1
+4792	3084 1
+4792	3447 1
+4792	3796 1
+4792	3962 1
+4792	4009 1
+4792	4400 1
+4792	4507 1
+4792	4653 1
+4792	4666 1
+4792	4706 1
+4792	4777 1
+4792	4796 1
+4792	4981 1
+4792	5020 1
+4792	5022 1
+4792	5028 1
+4792	5079 1
+4792	5148 1
+4792	5254 1
+4792	5273 1
+4792	5298 1
+4792	5326 1
+4792	5459 1
+4792	5465 1
+4792	5466 1
+4792	5524 1
+4792	5605 1
+4792	5732 1
+4792	5739 1
+4792	5745 1
+4792	5756 1
+4792	5829 1
+4792	5871 1
+4792	5969 1
+4792	6032 1
+4792	6044 1
+4792	6124 1
+4792	6421 1
+4792	6560 1
+4792	6634 1
+4792	6665 1
+4792	6700 1
+4792	6783 1
+4792	6832 1
+4792	6869 1
+4792	6938 1
+4792	7092 1
+4792	7185 1
+4792	7280 1
+4792	7414 1
+4792	7574 1
+4792	7632 1
+4792	7788 1
+4792	7809 1
+4792	7899 1
+4792	7908 1
+4792	7909 1
+4792	7946 1
+4792	8079 1
+4793	4796 1
+4793	6869 1
+4794	4796 1
+4798	2223 1
+4798	4103 1
+4798	4212 1
+4798	5807 1
+4799	4212 1
+4799	4798 1
+4800	4040 1
+4803	4808 1
+4804	4808 1
+4805	4808 1
+4805	4814 1
+4806	4808 1
+4807	4808 1
+4810	4811 1
+4814	1360 1
+4814	2364 1
+4814	3455 1
+4814	3854 1
+4814	3897 1
+4814	4189 1
+4814	4777 1
+4814	4797 1
+4814	4827 1
+4814	4938 1
+4814	4962 1
+4814	4993 1
+4814	4999 1
+4814	5199 1
+4814	5226 1
+4814	5459 1
+4814	6422 1
+4814	6503 1
+4814	7295 1
+4814	7301 1
+4813	155 1
+4813	608 1
+4813	737 1
+4813	967 1
+4813	1310 1
+4813	1352 1
+4813	1823 1
+4813	1972 1
+4813	2440 1
+4813	2764 1
+4813	2831 1
+4813	3456 1
+4813	3479 1
+4813	3498 1
+4813	3614 1
+4813	3842 1
+4813	3897 1
+4813	4099 1
+4813	4587 1
+4813	4632 1
+4813	4687 1
+4813	4689 1
+4813	4709 1
+4813	4713 1
+4813	4748 1
+4813	4795 1
+4813	4814 1
+4813	4846 1
+4813	4994 1
+4813	5037 1
+4813	5140 1
+4813	5200 1
+4813	5204 1
+4813	5439 1
+4813	5479 1
+4813	5626 1
+4813	5799 1
+4813	6006 1
+4813	6441 1
+4813	6458 1
+4813	6481 1
+4813	6498 1
+4813	6505 1
+4813	6576 1
+4813	6589 1
+4813	6715 1
+4816	1360 1
+4817	1360 1
+4818	737 1
+4818	1305 1
+4818	1680 1
+4818	2237 1
+4818	2354 1
+4818	2364 1
+4818	2516 1
+4818	2917 1
+4818	3002 1
+4818	3092 1
+4818	3334 1
+4818	3455 1
+4818	3796 1
+4818	4044 1
+4818	4124 1
+4818	4191 1
+4818	4219 1
+4818	4820 1
+4818	4938 1
+4818	4983 1
+4818	5022 1
+4818	5058 1
+4818	5162 1
+4818	5375 1
+4818	5484 1
+4818	5790 1
+4818	5814 1
+4818	6306 1
+4819	4820 1
+4821	346 1
+4821	5162 1
+4823	4706 1
+4824	72 1
+4824	608 1
+4824	737 1
+4824	1473 1
+4824	1648 1
+4824	1733 1
+4824	1799 1
+4824	2001 1
+4824	2276 1
+4824	2277 1
+4824	2342 1
+4824	2364 1
+4824	2398 1
+4824	2516 1
+4824	2576 1
+4824	2605 1
+4824	2775 1
+4824	2831 1
+4824	2925 1
+4824	3089 1
+4824	3274 1
+4824	3456 1
+4824	3459 1
+4824	3537 1
+4824	3586 1
+4824	3755 1
+4824	3958 1
+4824	4099 1
+4824	4310 1
+4824	4335 1
+4824	4338 1
+4824	4500 1
+4824	4534 1
+4824	4574 1
+4824	4600 1
+4824	4653 1
+4824	4706 1
+4824	4777 1
+4824	4781 1
+4824	4792 1
+4824	4795 1
+4824	4797 1
+4824	4828 1
+4824	4899 1
+4824	4929 1
+4824	4981 1
+4824	4986 1
+4824	5020 1
+4824	5072 1
+4824	5079 1
+4824	5103 1
+4824	5123 1
+4824	5133 1
+4824	5155 1
+4824	5182 1
+4824	5215 1
+4824	5226 1
+4824	5285 1
+4824	5288 1
+4824	5289 1
+4824	5296 1
+4824	5301 1
+4824	5310 1
+4824	5321 1
+4824	5432 1
+4824	5459 1
+4824	5506 1
+4824	5513 1
+4824	5527 1
+4824	5639 1
+4824	5650 1
+4824	5651 1
+4824	5680 1
+4824	5693 1
+4824	5706 1
+4824	5721 1
+4824	5732 1
+4824	5737 1
+4824	5743 1
+4824	5745 1
+4824	5753 1
+4824	5775 1
+4824	5780 1
+4824	5828 1
+4824	5837 1
+4824	5844 1
+4824	5848 1
+4824	5886 1
+4824	5891 1
+4824	5902 1
+4824	5925 1
+4824	5947 1
+4824	5991 1
+4824	6006 1
+4824	6098 1
+4824	6124 1
+4824	6720 1
+4824	6784 1
+4824	6913 1
+4824	6976 1
+4824	8042 1
+4825	4706 1
+4825	5775 1
+4827	4828 1
+4826	4827 1
+4829	737 1
+4829	1247 1
+4829	1680 1
+4829	1799 1
+4829	2364 1
+4829	2689 1
+4829	2785 1
+4829	2822 1
+4829	2909 1
+4829	3027 1
+4829	3089 1
+4829	3103 1
+4829	3417 1
+4829	3456 1
+4829	3459 1
+4829	3460 1
+4829	3691 1
+4829	3792 1
+4829	3910 1
+4829	3962 1
+4829	4124 1
+4829	4127 1
+4829	4315 1
+4829	4400 1
+4829	4448 1
+4829	4482 1
+4829	4587 1
+4829	4600 1
+4829	4712 1
+4829	4824 1
+4829	4831 1
+4829	4866 1
+4829	4929 1
+4829	5002 1
+4829	5079 1
+4829	5083 1
+4829	5092 1
+4829	5155 1
+4829	5176 1
+4829	5245 1
+4829	5288 1
+4829	5295 1
+4829	5326 1
+4829	5327 1
+4829	5335 1
+4829	5341 1
+4829	5392 1
+4829	5412 1
+4829	5423 1
+4829	5430 1
+4829	5442 1
+4829	5449 1
+4829	5452 1
+4829	5457 1
+4829	5465 1
+4829	5467 1
+4829	5506 1
+4829	5543 1
+4829	5739 1
+4829	5800 1
+4829	5802 1
+4829	5818 1
+4829	5839 1
+4829	5933 1
+4829	6156 1
+4829	6170 1
+4829	6388 1
+4829	6560 1
+4829	6699 1
+4829	6720 1
+4829	6755 1
+4829	6788 1
+4829	6856 1
+4829	6873 1
+4829	6892 1
+4829	7012 1
+4829	7624 1
+4829	7946 1
+4830	4831 1
+4832	2237 1
+4832	2775 1
+4832	4037 1
+4832	4361 1
+4832	4991 1
+4832	6503 1
+4832	7478 1
+4857	2237 1
+4833	2237 1
+4833	2354 1
+4833	4037 1
+4833	4124 1
+4833	6595 1
+4833	6790 1
+4834	2237 1
+4835	2237 1
+4836	2237 1
+4837	2237 1
+4837	3498 1
+4838	2237 1
+4838	4600 1
+4839	2237 1
+4840	1385 1
+4840	2237 1
+4840	4600 1
+4840	5482 1
+4858	2237 1
+4841	2237 1
+4842	2237 1
+4842	4999 1
+4843	1473 1
+4843	2237 1
+4843	2354 1
+4843	2398 1
+4843	2565 1
+4843	3084 1
+4843	4037 1
+4843	4247 1
+4843	4335 1
+4843	4600 1
+4843	4879 1
+4843	4977 1
+4843	5254 1
+4843	5423 1
+4843	5449 1
+4843	5452 1
+4843	5484 1
+4843	5511 1
+4843	5651 1
+4843	5714 1
+4843	5828 1
+4843	5850 1
+4843	6790 1
+4843	7478 1
+4844	2237 1
+4844	4600 1
+4859	1310 1
+4859	1680 1
+4859	2237 1
+4859	2381 1
+4859	2516 1
+4859	2689 1
+4859	2775 1
+4859	3092 1
+4859	3276 1
+4859	3447 1
+4859	3452 1
+4859	3537 1
+4859	3607 1
+4859	3854 1
+4859	3898 1
+4859	4124 1
+4859	4191 1
+4859	4547 1
+4859	4551 1
+4859	4717 1
+4859	4792 1
+4859	4828 1
+4859	4953 1
+4859	4999 1
+4859	5026 1
+4859	5055 1
+4859	5106 1
+4859	5130 1
+4859	5144 1
+4859	5222 1
+4860	2237 1
+4860	4875 1
+4845	2237 1
+4846	737 1
+4846	2237 1
+4846	2381 1
+4846	2398 1
+4846	2592 1
+4846	3456 1
+4846	3664 1
+4846	3691 1
+4846	4189 1
+4846	4191 1
+4846	4335 1
+4846	4400 1
+4846	4448 1
+4846	4587 1
+4846	4600 1
+4846	4632 1
+4846	4653 1
+4846	4824 1
+4846	4828 1
+4846	4964 1
+4846	5092 1
+4846	5106 1
+4846	5115 1
+4846	5141 1
+4846	5189 1
+4846	5239 1
+4846	5341 1
+4846	5484 1
+4846	5511 1
+4846	5513 1
+4846	5545 1
+4846	5563 1
+4846	5568 1
+4846	5592 1
+4847	2237 1
+4848	2237 1
+4849	2237 1
+4849	4600 1
+4850	2237 1
+4850	4600 1
+4850	4999 1
+4861	2237 1
+4862	1026 1
+4862	2237 1
+4862	4276 1
+4862	5254 1
+4851	2237 1
+4851	4600 1
+4851	4846 1
+4852	2237 1
+4852	3498 1
+4852	5178 1
+4863	2237 1
+4853	1305 1
+4853	1352 1
+4853	2237 1
+4853	4588 1
+4853	5162 1
+4854	2237 1
+4854	4600 1
+4855	2237 1
+4855	3334 1
+4856	2237 1
+4856	3755 1
+4856	5651 1
+4866	3073 1
+4866	3433 1
+4867	4875 1
+4868	4875 1
+4873	4875 1
+4801	4875 1
+4871	4875 1
+4869	4875 1
+4874	2620 1
+4874	4875 1
+4874	5210 1
+4870	1548 1
+4870	4875 1
+4872	4875 1
+4879	1026 1
+4879	2565 1
+4879	2940 1
+4879	3334 1
+4879	3459 1
+4879	3537 1
+4879	3885 1
+4879	4219 1
+4879	4341 1
+4879	4887 1
+4879	5289 1
+4879	5760 1
+4879	5806 1
+4879	5835 1
+4879	5872 1
+4879	6243 1
+4879	6665 1
+4879	6907 1
+4879	7279 1
+4879	7362 1
+4879	7378 1
+4879	7386 1
+4879	7397 1
+4879	7414 1
+4879	7553 1
+4879	7557 1
+4879	7561 1
+4879	7587 1
+4881	3334 1
+4881	4530 1
+4881	4795 1
+4881	4977 1
+4882	3334 1
+4882	4037 1
+4882	5817 1
+4883	3334 1
+4883	5596 1
+4883	5714 1
+4883	6770 1
+4883	6833 1
+4884	3334 1
+4884	4037 1
+4884	7632 1
+4884	7882 1
+4885	3334 1
+4885	3447 1
+4885	3455 1
+4885	4983 1
+4889	4588 1
+4889	7809 1
+4890	4588 1
+4891	1305 1
+4891	2696 1
+4891	3433 1
+4891	4037 1
+4891	4335 1
+4891	4588 1
+4891	4942 1
+4893	1305 1
+4893	2014 1
+4893	2696 1
+4893	3433 1
+4893	4044 1
+4894	1305 1
+4894	2364 1
+4894	2689 1
+4894	2696 1
+4894	2764 1
+4894	2822 1
+4894	2925 1
+4894	3015 1
+4894	3274 1
+4894	3276 1
+4894	3796 1
+4894	3808 1
+4894	3873 1
+4894	4041 1
+4894	4044 1
+4894	4099 1
+4894	4191 1
+4894	4310 1
+4894	4335 1
+4894	4448 1
+4894	4483 1
+4894	4600 1
+4894	4653 1
+4894	4786 1
+4894	4828 1
+4894	4846 1
+4894	4964 1
+4894	4993 1
+4894	5083 1
+4894	5121 1
+4894	5123 1
+4894	5189 1
+4894	5210 1
+4894	5215 1
+4894	5323 1
+4894	5335 1
+4894	5375 1
+4894	5415 1
+4894	5459 1
+4894	5467 1
+4894	5469 1
+4894	5482 1
+4894	5539 1
+4894	5543 1
+4894	5563 1
+4894	5569 1
+4894	5570 1
+4894	5620 1
+4894	5640 1
+4894	5713 1
+4894	5799 1
+4894	5844 1
+4894	5872 1
+4894	5969 1
+4894	5972 1
+4894	6027 1
+4894	6029 1
+4894	6088 1
+4894	6130 1
+4894	6161 1
+4894	6225 1
+4894	6226 1
+4894	6246 1
+4894	6255 1
+4894	6261 1
+4894	6269 1
+4894	6302 1
+4894	6321 1
+4894	6340 1
+4894	6417 1
+4894	6424 1
+4894	6435 1
+4894	6474 1
+4894	6529 1
+4894	6592 1
+4894	6686 1
+4894	7362 1
+4894	8295 1
+4894	8296 1
+4898	1769 1
+4898	2014 1
+4898	3276 1
+4898	3854 1
+4898	4987 1
+4898	4993 1
+4898	4999 1
+4898	5044 1
+4898	5368 1
+4898	5392 1
+4898	5434 1
+4899	15 1
+4899	608 1
+4899	1648 1
+4899	1680 1
+4899	1733 1
+4899	1799 1
+4899	1972 1
+4899	2001 1
+4899	2014 1
+4899	2276 1
+4899	2364 1
+4899	2369 1
+4899	2381 1
+4899	2398 1
+4899	2440 1
+4899	2516 1
+4899	2576 1
+4899	2592 1
+4899	2689 1
+4899	2774 1
+4899	2822 1
+4899	2831 1
+4899	2909 1
+4899	2940 1
+4899	3002 1
+4899	3027 1
+4899	3084 1
+4899	3089 1
+4899	3092 1
+4899	3103 1
+4899	3238 1
+4899	3274 1
+4899	3284 1
+4899	3393 1
+4899	3417 1
+4899	3456 1
+4899	3460 1
+4899	3537 1
+4899	3586 1
+4899	3634 1
+4899	3643 1
+4899	3664 1
+4899	3691 1
+4899	3796 1
+4899	3813 1
+4899	3842 1
+4899	3843 1
+4899	3897 1
+4899	3910 1
+4899	4041 1
+4899	4098 1
+4899	4099 1
+4899	4124 1
+4899	4219 1
+4899	4247 1
+4899	4297 1
+4899	4310 1
+4899	4315 1
+4899	4335 1
+4899	4361 1
+4899	4400 1
+4899	4448 1
+4899	4482 1
+4899	4483 1
+4899	4534 1
+4899	4547 1
+4899	4574 1
+4899	4587 1
+4899	4600 1
+4899	4654 1
+4899	4689 1
+4899	4717 1
+4899	4748 1
+4899	4781 1
+4899	4824 1
+4899	4828 1
+4899	4929 1
+4899	4980 1
+4899	4986 1
+4899	4994 1
+4899	5055 1
+4899	5061 1
+4899	5072 1
+4899	5073 1
+4899	5092 1
+4899	5100 1
+4899	5103 1
+4899	5106 1
+4899	5123 1
+4899	5130 1
+4899	5132 1
+4899	5140 1
+4899	5144 1
+4899	5155 1
+4899	5162 1
+4899	5178 1
+4899	5182 1
+4899	5189 1
+4899	5199 1
+4899	5200 1
+4899	5204 1
+4899	5222 1
+4899	5233 1
+4899	5239 1
+4899	5245 1
+4899	5262 1
+4899	5301 1
+4899	5323 1
+4899	5327 1
+4899	5341 1
+4899	5392 1
+4899	5430 1
+4899	5437 1
+4899	5445 1
+4899	5449 1
+4899	5452 1
+4899	5459 1
+4899	5463 1
+4899	5479 1
+4899	5484 1
+4899	5545 1
+4899	5568 1
+4899	5626 1
+4899	5637 1
+4899	5680 1
+4899	5693 1
+4899	5743 1
+4899	5753 1
+4899	5775 1
+4899	5780 1
+4899	5799 1
+4899	5812 1
+4899	5819 1
+4899	5827 1
+4899	5844 1
+4899	5863 1
+4899	5886 1
+4899	5897 1
+4899	5925 1
+4899	5947 1
+4899	5963 1
+4899	6004 1
+4899	6006 1
+4899	6029 1
+4899	6098 1
+4899	6124 1
+4899	6246 1
+4899	6251 1
+4899	6299 1
+4899	6327 1
+4899	6328 1
+4899	6441 1
+4899	6458 1
+4899	6481 1
+4899	6498 1
+4899	6554 1
+4899	6715 1
+4899	6739 1
+4899	6832 1
+4899	6946 1
+4899	7373 1
+4899	7381 1
+4899	7809 1
+4899	7810 1
+4899	7860 1
+4899	7890 1
+4899	8042 1
+4899	8044 1
+4899	8128 1
+4900	2014 1
+4901	2014 1
+4901	4962 1
+4903	15 1
+4903	4037 1
+4904	15 1
+4904	4037 1
+4905	4037 1
+4923	2160 1
+4923	4037 1
+4923	6094 1
+4906	15 1
+4906	4037 1
+4908	4037 1
+4924	3015 1
+4924	4037 1
+4924	4536 1
+4924	4875 1
+4924	5079 1
+4924	5262 1
+4924	5404 1
+4924	5545 1
+4924	6251 1
+4924	6913 1
+4909	1648 1
+4909	4037 1
+4910	4037 1
+4910	4687 1
+4911	4037 1
+4912	15 1
+4912	4037 1
+4913	4037 1
+4914	15 1
+4914	4037 1
+4915	4037 1
+4915	5200 1
+4915	5404 1
+4915	6503 1
+4915	7414 1
+4915	8224 1
+4916	4037 1
+4917	4037 1
+4918	4037 1
+4925	4037 1
+4925	6714 1
+4919	4037 1
+4920	4037 1
+4920	7992 1
+4926	155 1
+4926	3962 1
+4926	4037 1
+4926	5760 1
+4926	6634 1
+4926	7050 1
+4926	8174 1
+4921	4037 1
+4922	15 1
+4922	4037 1
+4929	2381 1
+4929	2516 1
+4929	3456 1
+4929	4219 1
+4929	4536 1
+4929	5083 1
+4929	5120 1
+4929	5144 1
+4929	5417 1
+4931	3433 1
+4932	1305 1
+4932	3433 1
+4933	15 1
+4933	3433 1
+4933	6774 1
+4934	2398 1
+4934	2433 1
+4934	3456 1
+4934	4335 1
+4934	6784 1
+4934	8028 1
+4935	4335 1
+4936	4335 1
+4936	5144 1
+4937	1305 1
+4937	1310 1
+4937	2787 1
+4937	3002 1
+4937	3537 1
+4937	3854 1
+4937	3898 1
+4937	4124 1
+4937	4191 1
+4937	4298 1
+4937	4792 1
+4937	4938 1
+4937	4953 1
+4937	4993 1
+4937	4999 1
+4937	5026 1
+4937	5055 1
+4943	737 1
+4943	1024 1
+4943	2381 1
+4943	2851 1
+4943	3537 1
+4943	3726 1
+4943	3813 1
+4943	3962 1
+4943	4037 1
+4943	4044 1
+4943	4124 1
+4943	4297 1
+4943	4938 1
+4943	4962 1
+4943	5092 1
+4943	5100 1
+4943	5432 1
+4943	6784 1
+4943	6832 1
+4943	6913 1
+4943	6914 1
+4943	6976 1
+4943	6980 1
+4943	7063 1
+4943	7092 1
+4943	7301 1
+4943	7961 1
+4943	8121 1
+4943	8128 1
+4943	8134 1
+4943	8192 1
+4945	4044 1
+4944	3898 1
+4944	4044 1
+4944	4986 1
+4944	7839 1
+4947	2364 1
+4947	3276 1
+4947	3284 1
+4947	3537 1
+4947	3643 1
+4947	4124 1
+4947	5026 1
+4947	5055 1
+4947	5058 1
+4947	5073 1
+4948	15 1
+4948	608 1
+4948	737 1
+4948	967 1
+4948	1191 1
+4948	1310 1
+4948	1385 1
+4948	1473 1
+4948	1498 1
+4948	1680 1
+4948	1799 1
+4948	1982 1
+4948	2001 1
+4948	2354 1
+4948	2364 1
+4948	2369 1
+4948	2381 1
+4948	2398 1
+4948	2576 1
+4948	2592 1
+4948	2605 1
+4948	2658 1
+4948	2689 1
+4948	2764 1
+4948	2785 1
+4948	2787 1
+4948	2822 1
+4948	2831 1
+4948	2909 1
+4948	3002 1
+4948	3015 1
+4948	3027 1
+4948	3089 1
+4948	3092 1
+4948	3103 1
+4948	3106 1
+4948	3238 1
+4948	3274 1
+4948	3276 1
+4948	3284 1
+4948	3393 1
+4948	3417 1
+4948	3447 1
+4948	3452 1
+4948	3455 1
+4948	3456 1
+4948	3459 1
+4948	3460 1
+4948	3537 1
+4948	3554 1
+4948	3607 1
+4948	3664 1
+4948	3691 1
+4948	3752 1
+4948	3796 1
+4948	3813 1
+4948	3843 1
+4948	3897 1
+4948	3910 1
+4948	3976 1
+4948	4071 1
+4948	4124 1
+4948	4191 1
+4948	4247 1
+4948	4297 1
+4948	4315 1
+4948	4335 1
+4948	4338 1
+4948	4400 1
+4948	4401 1
+4948	4432 1
+4948	4435 1
+4948	4448 1
+4948	4482 1
+4948	4547 1
+4948	4587 1
+4948	4600 1
+4948	4653 1
+4948	4666 1
+4948	4712 1
+4948	4792 1
+4948	4797 1
+4948	4824 1
+4948	4828 1
+4948	4846 1
+4948	4929 1
+4948	4940 1
+4948	4964 1
+4948	4980 1
+4948	4981 1
+4948	4983 1
+4948	5020 1
+4948	5026 1
+4948	5028 1
+4948	5055 1
+4948	5072 1
+4948	5092 1
+4948	5096 1
+4948	5100 1
+4948	5106 1
+4948	5130 1
+4948	5144 1
+4948	5148 1
+4948	5162 1
+4948	5189 1
+4948	5200 1
+4948	5204 1
+4948	5210 1
+4948	5215 1
+4948	5222 1
+4948	5226 1
+4948	5239 1
+4948	5255 1
+4948	5263 1
+4948	5288 1
+4948	5311 1
+4948	5321 1
+4948	5326 1
+4948	5327 1
+4948	5335 1
+4948	5378 1
+4948	5388 1
+4948	5392 1
+4948	5412 1
+4948	5423 1
+4948	5426 1
+4948	5430 1
+4948	5449 1
+4948	5454 1
+4948	5459 1
+4948	5463 1
+4948	5465 1
+4948	5484 1
+4948	5506 1
+4948	5509 1
+4948	5568 1
+4948	5605 1
+4948	5620 1
+4948	5671 1
+4948	5721 1
+4948	5732 1
+4948	5737 1
+4948	5743 1
+4948	5773 1
+4948	5800 1
+4948	5806 1
+4948	5812 1
+4948	5817 1
+4948	5819 1
+4948	5839 1
+4948	5844 1
+4948	5872 1
+4948	5925 1
+4948	6044 1
+4948	6151 1
+4948	6320 1
+4948	6481 1
+4948	6555 1
+4948	6618 1
+4948	6634 1
+4948	6665 1
+4948	6737 1
+4948	6780 1
+4948	6875 1
+4948	6907 1
+4948	6914 1
+4948	6946 1
+4948	7005 1
+4948	7052 1
+4948	7054 1
+4948	7092 1
+4948	7233 1
+4948	7238 1
+4948	7279 1
+4948	7341 1
+4948	7389 1
+4948	7391 1
+4948	7400 1
+4948	7414 1
+4948	7443 1
+4948	7510 1
+4948	7561 1
+4948	7632 1
+4948	7694 1
+4948	7695 1
+4948	7726 1
+4948	7778 1
+4948	7810 1
+4948	7833 1
+4948	7855 1
+4948	7860 1
+4948	7862 1
+4948	7871 1
+4948	7882 1
+4948	7890 1
+4948	7924 1
+4948	7965 1
+4948	7979 1
+4948	8037 1
+4948	8042 1
+4948	8044 1
+4948	8051 1
+4948	8122 1
+4948	8124 1
+4948	8128 1
+4948	8163 1
+4948	8168 1
+4948	8178 1
+4948	8186 1
+4948	8192 1
+4948	8209 1
+4948	8212 1
+4948	8219 1
+4948	8237 1
+4950	2917 1
+4951	2917 1
+4952	4600 1
+4952	4938 1
+4952	4953 1
+4957	4189 1
+4960	1972 1
+4960	3291 1
+4960	4748 1
+4960	4962 1
+4960	5799 1
+4960	6006 1
+4960	6437 1
+4960	6505 1
+4963	1024 1
+4963	1310 1
+4963	1769 1
+4963	3455 1
+4963	3537 1
+4963	3691 1
+4963	3854 1
+4963	3898 1
+4963	4547 1
+4963	4938 1
+4963	4993 1
+4963	5092 1
+4963	5144 1
+4964	737 1
+4964	2364 1
+4964	2369 1
+4964	2398 1
+4964	2516 1
+4964	3015 1
+4964	3089 1
+4964	3284 1
+4964	3393 1
+4964	3447 1
+4964	3537 1
+4964	3586 1
+4964	3631 1
+4964	3664 1
+4964	3796 1
+4964	3854 1
+4964	3910 1
+4964	4037 1
+4964	4124 1
+4964	4297 1
+4964	4310 1
+4964	4448 1
+4964	4574 1
+4964	4604 1
+4964	4653 1
+4964	4715 1
+4964	5055 1
+4964	5073 1
+4964	5092 1
+4964	5100 1
+4964	5106 1
+4964	5200 1
+4964	5204 1
+4964	5222 1
+4964	5262 1
+4964	5273 1
+4964	5321 1
+4964	5404 1
+4964	5412 1
+4964	5459 1
+4964	5524 1
+4964	5760 1
+4964	5819 1
+4964	5844 1
+4964	5886 1
+4964	5969 1
+4964	6010 1
+4964	6059 1
+4964	6407 1
+4964	6414 1
+4964	6682 1
+4964	6755 1
+4964	6770 1
+4964	7023 1
+4964	7101 1
+4964	7149 1
+4964	7204 1
+4964	7214 1
+4964	7243 1
+4964	7908 1
+4965	3854 1
+4966	1385 1
+4966	1680 1
+4966	1865 1
+4966	2398 1
+4966	2576 1
+4966	2689 1
+4966	2764 1
+4966	3854 1
+4966	4297 1
+4966	4536 1
+4966	4797 1
+4966	5002 1
+4966	5072 1
+4966	5083 1
+4966	5106 1
+4966	5144 1
+4966	5162 1
+4966	5335 1
+4966	5459 1
+4966	5592 1
+4966	5683 1
+4966	6472 1
+4966	7047 1
+4966	7624 1
+4966	7699 1
+4967	15 1
+4967	608 1
+4967	737 1
+4967	840 1
+4967	896 1
+4967	1074 1
+4967	1159 1
+4967	1247 1
+4967	1352 1
+4967	1403 1
+4967	1473 1
+4967	1549 1
+4967	1648 1
+4967	1733 1
+4967	1799 1
+4967	1972 1
+4967	2001 1
+4967	2160 1
+4967	2258 1
+4967	2273 1
+4967	2276 1
+4967	2364 1
+4967	2381 1
+4967	2398 1
+4967	2433 1
+4967	2440 1
+4967	2490 1
+4967	2507 1
+4967	2511 1
+4967	2516 1
+4967	2565 1
+4967	2576 1
+4967	2592 1
+4967	2605 1
+4967	2620 1
+4967	2689 1
+4967	2764 1
+4967	2765 1
+4967	2774 1
+4967	2775 1
+4967	2785 1
+4967	2822 1
+4967	2831 1
+4967	2909 1
+4967	2925 1
+4967	3002 1
+4967	3015 1
+4967	3027 1
+4967	3089 1
+4967	3092 1
+4967	3103 1
+4967	3191 1
+4967	3238 1
+4967	3274 1
+4967	3291 1
+4967	3376 1
+4967	3393 1
+4967	3417 1
+4967	3456 1
+4967	3459 1
+4967	3460 1
+4967	3479 1
+4967	3498 1
+4967	3537 1
+4967	3586 1
+4967	3614 1
+4967	3631 1
+4967	3634 1
+4967	3643 1
+4967	3664 1
+4967	3691 1
+4967	3755 1
+4967	3792 1
+4967	3796 1
+4967	3803 1
+4967	3813 1
+4967	3830 1
+4967	3842 1
+4967	3843 1
+4967	3854 1
+4967	3873 1
+4967	3897 1
+4967	3910 1
+4967	3919 1
+4967	3958 1
+4967	4009 1
+4967	4037 1
+4967	4041 1
+4967	4065 1
+4967	4099 1
+4967	4124 1
+4967	4127 1
+4967	4134 1
+4967	4175 1
+4967	4247 1
+4967	4297 1
+4967	4310 1
+4967	4315 1
+4967	4335 1
+4967	4338 1
+4967	4355 1
+4967	4400 1
+4967	4448 1
+4967	4482 1
+4967	4483 1
+4967	4488 1
+4967	4500 1
+4967	4527 1
+4967	4530 1
+4967	4534 1
+4967	4536 1
+4967	4547 1
+4967	4574 1
+4967	4587 1
+4967	4600 1
+4967	4604 1
+4967	4625 1
+4967	4653 1
+4967	4666 1
+4967	4687 1
+4967	4689 1
+4967	4709 1
+4967	4712 1
+4967	4713 1
+4967	4715 1
+4967	4717 1
+4967	4748 1
+4967	4764 1
+4967	4781 1
+4967	4791 1
+4967	4795 1
+4967	4798 1
+4967	4824 1
+4967	4828 1
+4967	4846 1
+4967	4899 1
+4967	4929 1
+4967	4944 1
+4967	4964 1
+4967	4980 1
+4967	4986 1
+4967	4994 1
+4967	4999 1
+4967	5002 1
+4967	5020 1
+4967	5026 1
+4967	5037 1
+4967	5055 1
+4967	5058 1
+4967	5061 1
+4967	5072 1
+4967	5073 1
+4967	5083 1
+4967	5092 1
+4967	5100 1
+4967	5103 1
+4967	5106 1
+4967	5121 1
+4967	5123 1
+4967	5130 1
+4967	5140 1
+4967	5141 1
+4967	5144 1
+4967	5155 1
+4967	5176 1
+4967	5178 1
+4967	5179 1
+4967	5182 1
+4967	5188 1
+4967	5189 1
+4967	5200 1
+4967	5204 1
+4967	5210 1
+4967	5222 1
+4967	5226 1
+4967	5239 1
+4967	5254 1
+4967	5262 1
+4967	5273 1
+4967	5301 1
+4967	5335 1
+4967	5387 1
+4967	5392 1
+4967	5393 1
+4967	5404 1
+4967	5412 1
+4967	5423 1
+4967	5430 1
+4967	5432 1
+4967	5437 1
+4967	5439 1
+4967	5445 1
+4967	5459 1
+4967	5463 1
+4967	5465 1
+4967	5467 1
+4967	5479 1
+4967	5506 1
+4967	5509 1
+4967	5513 1
+4967	5514 1
+4967	5524 1
+4967	5527 1
+4967	5543 1
+4967	5545 1
+4967	5563 1
+4967	5568 1
+4967	5584 1
+4967	5596 1
+4967	5620 1
+4967	5623 1
+4967	5624 1
+4967	5637 1
+4967	5650 1
+4967	5651 1
+4967	5663 1
+4967	5680 1
+4967	5684 1
+4967	5693 1
+4967	5697 1
+4967	5705 1
+4967	5714 1
+4967	5721 1
+4967	5732 1
+4967	5737 1
+4967	5739 1
+4967	5743 1
+4967	5753 1
+4967	5775 1
+4967	5776 1
+4967	5780 1
+4967	5790 1
+4967	5792 1
+4967	5798 1
+4967	5799 1
+4967	5802 1
+4967	5804 1
+4967	5807 1
+4967	5814 1
+4967	5818 1
+4967	5822 1
+4967	5827 1
+4967	5828 1
+4967	5829 1
+4967	5837 1
+4967	5844 1
+4967	5848 1
+4967	5863 1
+4967	5871 1
+4967	5880 1
+4967	5886 1
+4967	5891 1
+4967	5922 1
+4967	5925 1
+4967	5926 1
+4967	5928 1
+4967	5932 1
+4967	5936 1
+4967	5947 1
+4967	5955 1
+4967	5969 1
+4967	5972 1
+4967	5991 1
+4967	5994 1
+4967	5998 1
+4967	6001 1
+4967	6006 1
+4967	6029 1
+4967	6047 1
+4967	6078 1
+4967	6083 1
+4967	6096 1
+4967	6097 1
+4967	6098 1
+4967	6106 1
+4967	6110 1
+4967	6124 1
+4967	6148 1
+4967	6156 1
+4967	6166 1
+4967	6170 1
+4967	6218 1
+4967	6221 1
+4967	6225 1
+4967	6226 1
+4967	6227 1
+4967	6229 1
+4967	6235 1
+4967	6246 1
+4967	6251 1
+4967	6257 1
+4967	6272 1
+4967	6296 1
+4967	6327 1
+4967	6328 1
+4967	6330 1
+4967	6337 1
+4967	6407 1
+4967	6409 1
+4967	6432 1
+4967	6437 1
+4967	6441 1
+4967	6458 1
+4967	6481 1
+4967	6496 1
+4967	6501 1
+4967	6505 1
+4967	6523 1
+4967	6528 1
+4967	6552 1
+4967	6554 1
+4967	6560 1
+4967	6570 1
+4967	6589 1
+4967	6594 1
+4967	6595 1
+4967	6599 1
+4967	6600 1
+4967	6606 1
+4967	6624 1
+4967	6632 1
+4967	6634 1
+4967	6661 1
+4967	6668 1
+4967	6682 1
+4967	6699 1
+4967	6715 1
+4967	6720 1
+4967	6721 1
+4967	6725 1
+4967	6770 1
+4967	6774 1
+4967	6777 1
+4967	6783 1
+4967	6784 1
+4967	6790 1
+4967	6806 1
+4967	6860 1
+4967	6869 1
+4967	6873 1
+4967	6897 1
+4967	6901 1
+4967	6920 1
+4967	6930 1
+4967	6945 1
+4967	6946 1
+4967	6950 1
+4967	6955 1
+4967	6976 1
+4967	7021 1
+4967	7101 1
+4967	7115 1
+4967	7119 1
+4967	7143 1
+4967	7144 1
+4967	7168 1
+4967	7214 1
+4967	7561 1
+4967	7927 1
+4967	8295 1
+4967	8296 1
+4938	737 1
+4938	2822 1
+4938	3417 1
+4938	4600 1
+4938	5162 1
+4938	5222 1
+4938	5323 1
+4938	5341 1
+4938	5412 1
+4938	5452 1
+4938	5506 1
+4938	5511 1
+4969	1769 1
+4970	15 1
+4970	1769 1
+4970	2822 1
+4970	4482 1
+4970	4875 1
+4970	6098 1
+4970	6229 1
+4970	6437 1
+4971	1769 1
+4972	1769 1
+4972	4298 1
+4973	1769 1
+4973	3002 1
+4973	3452 1
+4973	3537 1
+4973	3843 1
+4973	3898 1
+4973	4124 1
+4973	4654 1
+4974	737 1
+4974	1769 1
+4974	2576 1
+4974	2689 1
+4974	3002 1
+4974	3027 1
+4974	3089 1
+4974	3284 1
+4974	3447 1
+4974	3537 1
+4974	3586 1
+4974	3796 1
+4974	3843 1
+4974	3897 1
+4974	4310 1
+4974	4315 1
+4974	4574 1
+4974	4587 1
+4974	4653 1
+4974	4828 1
+4974	4929 1
+4974	5055 1
+4974	5123 1
+4974	5130 1
+4974	5144 1
+4974	5204 1
+4974	5215 1
+4974	5239 1
+4974	5351 1
+4974	5463 1
+4974	5524 1
+4974	5638 1
+4974	5743 1
+4974	5775 1
+4974	5844 1
+4974	5872 1
+4974	5886 1
+4974	6665 1
+4974	6832 1
+4974	6913 1
+4974	7414 1
+4974	7624 1
+4974	7642 1
+4974	7803 1
+4975	1024 1
+4975	3455 1
+4976	1024 1
+4976	2354 1
+4976	2364 1
+4976	3089 1
+4976	3843 1
+4976	3898 1
+4976	3976 1
+4976	4041 1
+4976	4099 1
+4976	4191 1
+4976	4310 1
+4976	4482 1
+4976	4574 1
+4976	4587 1
+4976	4824 1
+4976	4828 1
+4976	4999 1
+4976	5100 1
+4976	5215 1
+4976	5680 1
+4976	5886 1
+4976	6041 1
+4976	6505 1
+2346	1024 1
+2346	2764 1
+2346	6661 1
+2346	7965 1
+4978	1310 1
+4979	1310 1
+4980	1310 1
+4980	2398 1
+4980	2516 1
+4980	2774 1
+4980	3274 1
+4980	4099 1
+4980	4335 1
+4980	4777 1
+4980	5020 1
+4980	5178 1
+4980	5285 1
+4980	5543 1
+4980	5637 1
+4980	5639 1
+4980	5651 1
+4980	8295 1
+4981	1310 1
+4981	1385 1
+4981	1982 1
+4981	2001 1
+4981	2398 1
+4981	2440 1
+4981	2658 1
+4981	2689 1
+4981	2787 1
+4981	2909 1
+4981	3084 1
+4981	3586 1
+4981	3752 1
+4981	3962 1
+4981	4037 1
+4981	4191 1
+4981	4335 1
+4981	4587 1
+4981	4604 1
+4981	4712 1
+4981	4983 1
+4981	5002 1
+4981	5037 1
+4981	5073 1
+4981	5079 1
+4981	5188 1
+4981	5430 1
+4981	5584 1
+4981	5605 1
+4981	5671 1
+4981	5714 1
+4981	5807 1
+4981	5947 1
+4981	6151 1
+4981	6555 1
+4981	6560 1
+4981	6725 1
+4981	6774 1
+4981	6790 1
+4981	6979 1
+4981	7021 1
+4981	7063 1
+4981	7092 1
+4981	7341 1
+4981	7510 1
+4981	7553 1
+4981	7587 1
+4981	7833 1
+4981	7862 1
+4981	7879 1
+4981	7882 1
+4981	7908 1
+4981	7961 1
+4982	72 1
+4982	608 1
+4982	1310 1
+4982	1385 1
+4982	2398 1
+4982	2516 1
+4982	2775 1
+4982	3092 1
+4982	3106 1
+4982	3393 1
+4982	3455 1
+4982	3537 1
+4982	3755 1
+4982	3796 1
+4982	3813 1
+4982	3897 1
+4982	4099 1
+4982	4247 1
+4982	4335 1
+4982	4536 1
+4982	4653 1
+4982	4654 1
+4982	4712 1
+4982	4828 1
+4982	4846 1
+4982	4964 1
+4982	4983 1
+4982	5058 1
+4982	5083 1
+4982	5092 1
+4982	5100 1
+4982	5115 1
+4982	5144 1
+4982	5222 1
+4982	5254 1
+4982	5288 1
+4982	5321 1
+4982	5327 1
+4982	5454 1
+4982	5459 1
+4982	5511 1
+4982	5539 1
+4982	5817 1
+4977	1310 1
+4977	2369 1
+4977	3607 1
+4983	1310 1
+4983	4981 1
+4983	7860 1
+4983	7862 1
+4985	3898 1
+4986	3898 1
+4988	15 1
+4988	72 1
+4988	608 1
+4988	737 1
+4988	2276 1
+4988	2490 1
+4988	2516 1
+4988	2592 1
+4988	4247 1
+4988	4310 1
+4988	4551 1
+4988	5026 1
+4988	5092 1
+4988	5106 1
+4988	5178 1
+4988	5404 1
+4988	5459 1
+4988	5790 1
+4988	5994 1
+4988	6246 1
+4988	6424 1
+4988	6918 1
+4988	7632 1
+4989	1982 1
+4989	3447 1
+4989	3458 1
+4989	4298 1
+4989	5697 1
+4989	6262 1
+4989	6946 1
+4993	2386 1
+4993	4124 1
+4993	4297 1
+4993	5144 1
+4992	3002 1
+4992	4632 1
+4992	4993 1
+4992	7279 1
+4994	2589 1
+4994	3015 1
+4994	3634 1
+4994	4191 1
+4994	5199 1
+4994	5524 1
+4994	5760 1
+4994	5800 1
+4994	5897 1
+4994	6043 1
+4994	6299 1
+4994	6832 1
+4994	6869 1
+4994	7381 1
+4994	7414 1
+4994	7649 1
+4994	7803 1
+4994	7809 1
+4994	7813 1
+4995	4191 1
+4996	4191 1
+4864	4587 1
+4864	4632 1
+4864	4999 1
+4864	5902 1
+5000	4792 1
+5001	4792 1
+5002	72 1
+5002	737 1
+5002	840 1
+5002	1403 1
+5002	1549 1
+5002	1680 1
+5002	2276 1
+5002	2398 1
+5002	2511 1
+5002	2565 1
+5002	2851 1
+5002	2940 1
+5002	3456 1
+5002	3459 1
+5002	3631 1
+5002	3634 1
+5002	3643 1
+5002	3796 1
+5002	3803 1
+5002	3842 1
+5002	3897 1
+5002	4037 1
+5002	4041 1
+5002	4310 1
+5002	4315 1
+5002	4400 1
+5002	4448 1
+5002	4483 1
+5002	4536 1
+5002	4604 1
+5002	4632 1
+5002	4653 1
+5002	4709 1
+5002	4713 1
+5002	4792 1
+5002	4964 1
+5002	4966 1
+5002	4981 1
+5002	4992 1
+5002	5037 1
+5002	5061 1
+5002	5144 1
+5002	5148 1
+5002	5182 1
+5002	5188 1
+5002	5189 1
+5002	5199 1
+5002	5204 1
+5002	5210 1
+5002	5233 1
+5002	5239 1
+5002	5254 1
+5002	5263 1
+5002	5273 1
+5002	5393 1
+5002	5404 1
+5002	5432 1
+5002	5459 1
+5002	5484 1
+5002	5584 1
+5002	5721 1
+5002	5737 1
+5002	5773 1
+5002	5800 1
+5002	5802 1
+5002	5806 1
+5002	5814 1
+5002	5822 1
+5002	5827 1
+5002	5844 1
+5002	5872 1
+5002	5925 1
+5002	6047 1
+5002	6123 1
+5002	6124 1
+5002	6198 1
+5002	6221 1
+5002	6296 1
+5002	6327 1
+5002	6481 1
+5002	6501 1
+5002	6552 1
+5002	6555 1
+5002	6594 1
+5002	6600 1
+5002	6618 1
+5002	6628 1
+5002	6665 1
+5002	6715 1
+5002	6720 1
+5002	6774 1
+5002	6784 1
+5002	6832 1
+5002	6914 1
+5002	6946 1
+5002	6948 1
+5002	6979 1
+5002	6980 1
+5002	7052 1
+5002	7092 1
+5002	7115 1
+5002	7119 1
+5002	7143 1
+5002	7144 1
+5002	7186 1
+5002	7301 1
+5002	7373 1
+5002	7414 1
+5002	7442 1
+5002	7553 1
+5002	7620 1
+5002	7652 1
+5002	7662 1
+5002	7763 1
+5002	7809 1
+5003	2775 1
+5003	3607 1
+5005	3607 1
+4897	3458 1
+5006	72 1
+5006	1385 1
+5006	1680 1
+5006	2342 1
+5006	2369 1
+5006	2516 1
+5006	2775 1
+5006	3456 1
+5006	3458 1
+5006	3459 1
+5006	3796 1
+5006	4124 1
+5006	4219 1
+5006	4335 1
+5006	4536 1
+5006	4547 1
+5006	4797 1
+5006	4828 1
+5006	4964 1
+5006	5083 1
+5006	5132 1
+5006	5208 1
+5006	5210 1
+5006	5215 1
+5006	5288 1
+5006	5412 1
+5006	5459 1
+5006	5743 1
+5008	608 1
+5008	737 1
+5008	2369 1
+5008	2516 1
+5008	2775 1
+5008	2831 1
+5008	3089 1
+5008	3447 1
+5008	3456 1
+5008	3813 1
+5008	4068 1
+5008	4191 1
+5008	4587 1
+5008	4983 1
+5008	5073 1
+5008	5083 1
+5008	5130 1
+5008	5144 1
+5008	5189 1
+5008	5303 1
+5008	5323 1
+5008	5449 1
+5008	5484 1
+5008	5928 1
+5008	5973 1
+5008	5977 1
+5008	5980 1
+5009	2592 1
+5009	2822 1
+5009	3027 1
+5009	3106 1
+5009	3447 1
+5009	4547 1
+5009	4899 1
+5009	5026 1
+5009	5130 1
+5009	5222 1
+5009	5239 1
+5009	5524 1
+5009	5848 1
+5009	6855 1
+5010	3447 1
+5010	4037 1
+5010	5079 1
+5010	7857 1
+5011	3447 1
+5011	3796 1
+5011	4099 1
+5011	4191 1
+5011	4687 1
+5011	4977 1
+5011	5254 1
+5011	5285 1
+5011	5506 1
+5011	5584 1
+5012	2398 1
+5012	2764 1
+5012	3393 1
+5012	3417 1
+5012	3447 1
+5012	4124 1
+5012	4335 1
+5012	4666 1
+5012	4964 1
+5012	4983 1
+5012	5568 1
+5012	5640 1
+5012	6441 1
+5012	6613 1
+5013	525 1
+5013	3027 1
+5013	3447 1
+5013	4448 1
+5013	4587 1
+5013	5288 1
+5013	5449 1
+5016	2775 1
+5016	4071 1
+5016	5100 1
+5016	5162 1
+5016	5509 1
+5016	5529 1
+5016	5950 1
+5016	6914 1
+5016	7092 1
+5016	7890 1
+5017	72 1
+5017	2775 1
+5017	4099 1
+5017	4335 1
+5017	5012 1
+5017	5020 1
+5017	5233 1
+5017	5254 1
+5017	5683 1
+5018	2775 1
+5022	1074 1
+5022	1493 1
+5022	1549 1
+5022	1823 1
+5022	1982 1
+5022	2160 1
+5022	2285 1
+5022	2433 1
+5022	2490 1
+5022	2535 1
+5022	2620 1
+5022	2774 1
+5022	2914 1
+5022	3015 1
+5022	3191 1
+5022	3291 1
+5022	3459 1
+5022	3479 1
+5022	3614 1
+5022	3830 1
+5022	3842 1
+5022	3873 1
+5022	3897 1
+5022	3919 1
+5022	3922 1
+5022	4065 1
+5022	4099 1
+5022	4134 1
+5022	4441 1
+5022	4488 1
+5022	4507 1
+5022	4574 1
+5022	4604 1
+5022	4687 1
+5022	4689 1
+5022	4709 1
+5022	4748 1
+5022	4791 1
+5022	4795 1
+5022	4875 1
+5022	4994 1
+5022	5020 1
+5022	5037 1
+5022	5121 1
+5022	5140 1
+5022	5178 1
+5022	5179 1
+5022	5182 1
+5022	5188 1
+5022	5210 1
+5022	5233 1
+5022	5254 1
+5022	5262 1
+5022	5263 1
+5022	5301 1
+5022	5335 1
+5022	5404 1
+5022	5415 1
+5022	5423 1
+5022	5439 1
+5022	5482 1
+5022	5487 1
+5022	5524 1
+5022	5543 1
+5022	5545 1
+5022	5563 1
+5022	5624 1
+5022	5626 1
+5022	5638 1
+5022	5684 1
+5022	5697 1
+5022	5738 1
+5022	5739 1
+5022	5753 1
+5022	5760 1
+5022	5798 1
+5022	5799 1
+5022	5807 1
+5022	5809 1
+5022	5814 1
+5022	5818 1
+5022	5824 1
+5022	5829 1
+5022	5863 1
+5022	5886 1
+5022	5891 1
+5022	5936 1
+5022	5947 1
+5022	5950 1
+5022	5963 1
+5022	5973 1
+5022	5977 1
+5022	6001 1
+5022	6006 1
+5022	6023 1
+5022	6094 1
+5022	6148 1
+5022	6151 1
+5022	6161 1
+5022	6164 1
+5022	6170 1
+5022	6218 1
+5022	6229 1
+5022	6246 1
+5022	6251 1
+5022	6255 1
+5022	6262 1
+5022	6305 1
+5022	6327 1
+5022	6330 1
+5022	6334 1
+5022	6337 1
+5022	6347 1
+5022	6388 1
+5022	6407 1
+5022	6409 1
+5022	6417 1
+5022	6424 1
+5022	6432 1
+5022	6441 1
+5022	6474 1
+5022	6498 1
+5022	6501 1
+5022	6511 1
+5022	6523 1
+5022	6528 1
+5022	6552 1
+5022	6553 1
+5022	6554 1
+5022	6555 1
+5022	6566 1
+5022	6571 1
+5022	6576 1
+5022	6594 1
+5022	6595 1
+5022	6599 1
+5022	6600 1
+5022	6628 1
+5022	6632 1
+5022	6634 1
+5022	6661 1
+5022	6663 1
+5022	6665 1
+5022	6715 1
+5022	6720 1
+5022	6725 1
+5022	6755 1
+5022	6765 1
+5022	6769 1
+5022	6770 1
+5022	6783 1
+5022	6788 1
+5022	6789 1
+5022	6790 1
+5022	6803 1
+5022	6833 1
+5022	6850 1
+5022	6855 1
+5022	6860 1
+5022	6890 1
+5022	6897 1
+5022	6930 1
+5022	6933 1
+5022	6934 1
+5022	6938 1
+5022	6945 1
+5022	6948 1
+5022	6953 1
+5022	6955 1
+5022	6979 1
+5022	8295 1
+5022	8297 1
+5019	5022 1
+5020	72 1
+5020	95 1
+5020	896 1
+5020	1026 1
+5020	1247 1
+5020	1385 1
+5020	1548 1
+5020	1549 1
+5020	1680 1
+5020	1799 1
+5020	1982 1
+5020	2276 1
+5020	2354 1
+5020	2381 1
+5020	2398 1
+5020	2516 1
+5020	2565 1
+5020	2620 1
+5020	2785 1
+5020	2822 1
+5020	2902 1
+5020	3027 1
+5020	3089 1
+5020	3103 1
+5020	3106 1
+5020	3191 1
+5020	3334 1
+5020	3393 1
+5020	3417 1
+5020	3456 1
+5020	3459 1
+5020	3460 1
+5020	3554 1
+5020	3643 1
+5020	3755 1
+5020	3808 1
+5020	3897 1
+5020	3910 1
+5020	3919 1
+5020	3976 1
+5020	4068 1
+5020	4335 1
+5020	4400 1
+5020	4441 1
+5020	4482 1
+5020	4500 1
+5020	4530 1
+5020	4653 1
+5020	4666 1
+5020	4777 1
+5020	4824 1
+5020	4875 1
+5020	4929 1
+5020	4964 1
+5020	4977 1
+5020	5022 1
+5020	5073 1
+5020	5075 1
+5020	5130 1
+5020	5148 1
+5020	5162 1
+5020	5176 1
+5020	5178 1
+5020	5204 1
+5020	5208 1
+5020	5233 1
+5020	5240 1
+5020	5245 1
+5020	5255 1
+5020	5271 1
+5020	5285 1
+5020	5288 1
+5020	5296 1
+5020	5308 1
+5020	5312 1
+5020	5321 1
+5020	5323 1
+5020	5327 1
+5020	5335 1
+5020	5341 1
+5020	5350 1
+5020	5368 1
+5020	5375 1
+5020	5392 1
+5020	5412 1
+5020	5415 1
+5020	5417 1
+5020	5423 1
+5020	5430 1
+5020	5449 1
+5020	5452 1
+5020	5463 1
+5020	5484 1
+5020	5506 1
+5020	5509 1
+5020	5511 1
+5020	5513 1
+5020	5543 1
+5020	5545 1
+5020	5559 1
+5020	5563 1
+5020	5592 1
+5020	5620 1
+5020	5630 1
+5020	5638 1
+5020	5640 1
+5020	5651 1
+5020	5697 1
+5020	5706 1
+5020	5740 1
+5020	5760 1
+5020	5772 1
+5020	5817 1
+5020	5850 1
+5020	5860 1
+5020	5872 1
+5020	5936 1
+5020	5963 1
+5020	6059 1
+5020	6080 1
+5020	6094 1
+5020	6148 1
+5020	6229 1
+5020	6251 1
+5020	6278 1
+5020	6311 1
+5020	6327 1
+5020	6334 1
+5020	6400 1
+5020	6414 1
+5020	6422 1
+5020	6725 1
+5020	6994 1
+5020	7050 1
+5020	7168 1
+5020	7478 1
+5020	7553 1
+5020	7632 1
+5020	8295 1
+5024	3537 1
+5024	5026 1
+5024	6148 1
+5024	7092 1
+5028	3238 1
+5028	3452 1
+5028	3897 1
+5028	3962 1
+5028	4037 1
+5028	4361 1
+5028	4653 1
+5028	4781 1
+5028	4981 1
+5028	4986 1
+5028	5022 1
+5028	5079 1
+5028	5254 1
+5028	5605 1
+5028	5614 1
+5028	5671 1
+5028	5814 1
+5028	5839 1
+5028	6006 1
+5028	6023 1
+5028	6218 1
+5028	6334 1
+5028	6409 1
+5028	6414 1
+5028	6498 1
+5028	6665 1
+5028	6762 1
+5028	6784 1
+5028	6907 1
+5028	7047 1
+5028	7052 1
+5028	7092 1
+5028	7115 1
+5028	7116 1
+5028	7618 1
+5028	7620 1
+5028	7632 1
+5028	7683 1
+5028	7809 1
+5028	7908 1
+5028	8073 1
+5028	8083 1
+5028	8124 1
+5029	608 1
+5029	737 1
+5029	2785 1
+5029	2822 1
+5029	3027 1
+5029	3103 1
+5029	3417 1
+5029	3452 1
+5029	3456 1
+5029	3796 1
+5029	3910 1
+5029	4099 1
+5029	4400 1
+5029	4600 1
+5029	4653 1
+5029	4712 1
+5029	4929 1
+5029	5155 1
+5029	5323 1
+5029	5327 1
+5029	5423 1
+5029	5430 1
+5029	5449 1
+5029	5459 1
+5029	5484 1
+5029	5511 1
+5031	4983 1
+5032	3334 1
+5032	4983 1
+5035	2787 1
+5036	2787 1
+5036	3537 1
+5036	4124 1
+5036	4654 1
+5037	15 1
+5037	2787 1
+5037	3089 1
+5037	3334 1
+5037	3459 1
+5037	3796 1
+5037	4530 1
+5037	4536 1
+5037	4712 1
+5037	5055 1
+5037	5123 1
+5037	5295 1
+5037	5563 1
+5037	5605 1
+5037	5680 1
+5037	5743 1
+5037	7871 1
+5037	7908 1
+5038	840 1
+5038	3002 1
+5038	5928 1
+5038	6004 1
+5038	6632 1
+5039	2364 1
+5039	3002 1
+5039	3284 1
+5039	3455 1
+5039	3537 1
+5039	4297 1
+5039	5073 1
+5040	3002 1
+5040	3027 1
+5040	3537 1
+5043	3284 1
+5043	5092 1
+5046	4124 1
+5046	4191 1
+5047	4124 1
+5048	4124 1
+5048	4488 1
+5048	5233 1
+5048	5524 1
+5048	6855 1
+5048	6869 1
+5051	3084 1
+5051	4175 1
+5051	5055 1
+5051	5775 1
+5051	7855 1
+5051	7862 1
+5051	7890 1
+5051	7979 1
+5052	5055 1
+5053	2511 1
+5053	2774 1
+5053	2940 1
+5053	3238 1
+5053	3498 1
+5053	3969 1
+5053	4037 1
+5053	4175 1
+5053	4335 1
+5053	4632 1
+5053	4884 1
+5053	4981 1
+5053	5022 1
+5053	5028 1
+5053	5055 1
+5053	5079 1
+5053	5262 1
+5053	5671 1
+5053	5760 1
+5053	5775 1
+5053	5835 1
+5053	5897 1
+5053	5933 1
+5053	6043 1
+5053	6123 1
+5053	6151 1
+5053	6229 1
+5053	6299 1
+5053	6337 1
+5053	6496 1
+5053	6712 1
+5053	6780 1
+5053	6832 1
+5053	6897 1
+5053	6907 1
+5053	6934 1
+5053	6955 1
+5053	6980 1
+5053	7088 1
+5053	7116 1
+5053	7381 1
+5053	7561 1
+5053	7587 1
+5053	7620 1
+5053	7624 1
+5053	7632 1
+5053	7651 1
+5053	7662 1
+5053	7871 1
+5053	7890 1
+5053	7908 1
+5053	8174 1
+5054	5055 1
+5054	7119 1
+5057	5058 1
+5059	840 1
+5059	3346 1
+5059	3537 1
+5059	3726 1
+5059	3809 1
+5059	4666 1
+5059	5384 1
+5059	5432 1
+5059	5922 1
+5059	5932 1
+5059	6097 1
+5059	6634 1
+5059	6784 1
+5059	6913 1
+5059	6946 1
+5059	7040 1
+5059	7052 1
+5059	7074 1
+5059	7094 1
+5059	7110 1
+5059	7143 1
+5059	7289 1
+5059	7290 1
+5059	7301 1
+5059	7306 1
+5059	7318 1
+5060	3537 1
+5060	4653 1
+5060	8174 1
+5061	2386 1
+5061	3537 1
+5061	4527 1
+5061	4786 1
+5061	5215 1
+5061	5499 1
+5061	5543 1
+5061	5684 1
+5061	5760 1
+5061	5850 1
+5061	5950 1
+5061	6360 1
+5061	6407 1
+5062	3537 1
+5063	3537 1
+5064	4654 1
+5065	4654 1
+5069	737 1
+5069	2364 1
+5069	4127 1
+5069	4866 1
+5069	5002 1
+5067	2364 1
+5067	6720 1
+5068	2364 1
+5068	2940 1
+5068	3455 1
+5068	4712 1
+5068	5096 1
+5068	5452 1
+5068	5454 1
+5068	7381 1
+5068	7908 1
+5068	8124 1
+5071	4297 1
+5072	3498 1
+5072	5073 1
+5072	6174 1
+5077	3284 1
+5078	3284 1
+5078	5130 1
+5078	5341 1
+5079	15 1
+5079	737 1
+5079	1074 1
+5079	1247 1
+5079	1352 1
+5079	1473 1
+5079	1549 1
+5079	1680 1
+5079	1799 1
+5079	1972 1
+5079	1982 1
+5079	2001 1
+5079	2273 1
+5079	2276 1
+5079	2285 1
+5079	2369 1
+5079	2381 1
+5079	2398 1
+5079	2433 1
+5079	2440 1
+5079	2516 1
+5079	2535 1
+5079	2565 1
+5079	2576 1
+5079	2605 1
+5079	2774 1
+5079	2831 1
+5079	2902 1
+5079	2909 1
+5079	3015 1
+5079	3084 1
+5079	3089 1
+5079	3103 1
+5079	3191 1
+5079	3284 1
+5079	3291 1
+5079	3297 1
+5079	3334 1
+5079	3346 1
+5079	3417 1
+5079	3456 1
+5079	3459 1
+5079	3460 1
+5079	3479 1
+5079	3498 1
+5079	3586 1
+5079	3614 1
+5079	3634 1
+5079	3643 1
+5079	3691 1
+5079	3755 1
+5079	3792 1
+5079	3796 1
+5079	3830 1
+5079	3842 1
+5079	3897 1
+5079	3919 1
+5079	3976 1
+5079	4041 1
+5079	4065 1
+5079	4098 1
+5079	4099 1
+5079	4134 1
+5079	4218 1
+5079	4219 1
+5079	4247 1
+5079	4310 1
+5079	4335 1
+5079	4338 1
+5079	4361 1
+5079	4400 1
+5079	4401 1
+5079	4448 1
+5079	4468 1
+5079	4483 1
+5079	4527 1
+5079	4530 1
+5079	4534 1
+5079	4536 1
+5079	4547 1
+5079	4574 1
+5079	4587 1
+5079	4625 1
+5079	4631 1
+5079	4653 1
+5079	4666 1
+5079	4687 1
+5079	4712 1
+5079	4715 1
+5079	4717 1
+5079	4748 1
+5079	4777 1
+5079	4795 1
+5079	4798 1
+5079	4824 1
+5079	4828 1
+5079	4846 1
+5079	4875 1
+5079	4899 1
+5079	4929 1
+5079	4940 1
+5079	4944 1
+5079	4964 1
+5079	4980 1
+5079	4981 1
+5079	4983 1
+5079	4986 1
+5079	4994 1
+5079	5002 1
+5079	5020 1
+5079	5037 1
+5079	5061 1
+5079	5100 1
+5079	5121 1
+5079	5123 1
+5079	5130 1
+5079	5133 1
+5079	5144 1
+5079	5145 1
+5079	5148 1
+5079	5176 1
+5079	5178 1
+5079	5188 1
+5079	5189 1
+5079	5199 1
+5079	5200 1
+5079	5204 1
+5079	5208 1
+5079	5215 1
+5079	5226 1
+5079	5233 1
+5079	5254 1
+5079	5262 1
+5079	5263 1
+5079	5273 1
+5079	5289 1
+5079	5301 1
+5079	5306 1
+5079	5310 1
+5079	5321 1
+5079	5327 1
+5079	5335 1
+5079	5368 1
+5079	5393 1
+5079	5404 1
+5079	5415 1
+5079	5437 1
+5079	5439 1
+5079	5449 1
+5079	5454 1
+5079	5459 1
+5079	5466 1
+5079	5499 1
+5079	5506 1
+5079	5524 1
+5079	5527 1
+5079	5539 1
+5079	5543 1
+5079	5545 1
+5079	5563 1
+5079	5568 1
+5079	5570 1
+5079	5584 1
+5079	5588 1
+5079	5596 1
+5079	5624 1
+5079	5637 1
+5079	5638 1
+5079	5664 1
+5079	5684 1
+5079	5693 1
+5079	5697 1
+5079	5709 1
+5079	5714 1
+5079	5732 1
+5079	5737 1
+5079	5739 1
+5079	5743 1
+5079	5756 1
+5079	5760 1
+5079	5775 1
+5079	5780 1
+5079	5798 1
+5079	5799 1
+5079	5801 1
+5079	5802 1
+5079	5811 1
+5079	5812 1
+5079	5814 1
+5079	5817 1
+5079	5824 1
+5079	5827 1
+5079	5828 1
+5079	5829 1
+5079	5837 1
+5079	5844 1
+5079	5871 1
+5079	5872 1
+5079	5886 1
+5079	5891 1
+5079	5902 1
+5079	5947 1
+5079	5950 1
+5079	6006 1
+5079	6098 1
+5079	6124 1
+5079	6156 1
+5079	6170 1
+5079	6221 1
+5079	6272 1
+5079	6299 1
+5079	6306 1
+5079	6320 1
+5079	6323 1
+5079	6328 1
+5079	6337 1
+5079	6347 1
+5079	6360 1
+5079	6388 1
+5079	6417 1
+5079	6422 1
+5079	6427 1
+5079	6432 1
+5079	6437 1
+5079	6481 1
+5079	6505 1
+5079	6523 1
+5079	6552 1
+5079	6555 1
+5079	6560 1
+5079	6566 1
+5079	6576 1
+5079	6594 1
+5079	6618 1
+5079	6632 1
+5079	6665 1
+5079	6699 1
+5079	6714 1
+5079	6715 1
+5079	6720 1
+5079	6736 1
+5079	6739 1
+5079	6765 1
+5079	6774 1
+5079	6778 1
+5079	6784 1
+5079	6832 1
+5079	6833 1
+5079	6855 1
+5079	6897 1
+5079	6913 1
+5079	6934 1
+5079	6946 1
+5079	6948 1
+5079	6976 1
+5079	7047 1
+5079	7108 1
+5079	7238 1
+5079	7295 1
+5079	7319 1
+5079	7478 1
+5079	7553 1
+5079	7632 1
+5079	7699 1
+5079	7810 1
+5079	7839 1
+5079	7924 1
+5079	8002 1
+5079	8224 1
+5079	8277 1
+5079	8295 1
+5080	3284 1
+5080	5096 1
+5080	5651 1
+5081	2398 1
+5081	3284 1
+5081	4247 1
+5081	5083 1
+5081	5484 1
+5084	5083 1
+5085	4828 1
+5085	5083 1
+5085	5115 1
+5085	5880 1
+5086	5092 1
+5087	5092 1
+5088	5092 1
+5089	15 1
+5089	3479 1
+5089	3897 1
+5089	4795 1
+5089	4980 1
+5089	5092 1
+5089	5262 1
+5089	6328 1
+5090	1403 1
+5090	5092 1
+5090	5459 1
+5091	5092 1
+5095	3792 1
+5095	5100 1
+5095	5295 1
+5096	4310 1
+5096	5072 1
+5096	5100 1
+5096	5327 1
+5096	5412 1
+5096	5683 1
+5096	5973 1
+5096	6044 1
+5096	6174 1
+5096	6442 1
+5096	7238 1
+5096	7833 1
+5096	7910 1
+5096	8209 1
+5097	5100 1
+5099	15 1
+5099	737 1
+5099	1026 1
+5099	2831 1
+5099	2925 1
+5099	3459 1
+5099	4191 1
+5099	4276 1
+5099	4335 1
+5099	4587 1
+5099	5100 1
+5099	5239 1
+5099	5640 1
+5099	7604 1
+5098	5100 1
+5098	6784 1
+5106	1403 1
+5106	1680 1
+5106	1982 1
+5106	2822 1
+5106	2851 1
+5106	3103 1
+5106	3643 1
+5106	4037 1
+5106	4335 1
+5106	4400 1
+5106	4983 1
+5106	5022 1
+5106	5103 1
+5106	5210 1
+5106	5412 1
+5106	5459 1
+5106	5543 1
+5106	5664 1
+5106	5922 1
+5106	5925 1
+5106	6000 1
+5106	6227 1
+5106	6832 1
+5106	6875 1
+5106	6980 1
+5106	7280 1
+5106	7297 1
+5106	7365 1
+5106	7397 1
+5106	7803 1
+5106	8169 1
+5106	8212 1
+5106	8219 1
+5102	737 1
+5102	1403 1
+5102	2565 1
+5102	2765 1
+5102	2785 1
+5102	3238 1
+5102	3293 1
+5102	3459 1
+5102	3643 1
+5102	4037 1
+5102	4041 1
+5102	4507 1
+5102	4875 1
+5102	5012 1
+5102	5022 1
+5102	5028 1
+5102	5079 1
+5102	5103 1
+5102	5106 1
+5102	5182 1
+5102	5188 1
+5102	5210 1
+5102	5254 1
+5102	5288 1
+5102	5484 1
+5102	5605 1
+5102	5773 1
+5102	5812 1
+5102	5814 1
+5102	5818 1
+5102	5922 1
+5102	5936 1
+5102	6029 1
+5102	6227 1
+5102	6330 1
+5102	6442 1
+5102	6552 1
+5102	6681 1
+5102	6875 1
+5102	6918 1
+5102	6980 1
+5102	7115 1
+5102	7168 1
+5102	7201 1
+5102	7225 1
+5102	7280 1
+5102	7553 1
+5102	7561 1
+5102	7618 1
+5102	7620 1
+5102	7908 1
+5102	8141 1
+5102	8163 1
+5102	8212 1
+5103	1498 1
+5103	1823 1
+5103	2774 1
+5103	2785 1
+5103	2851 1
+5103	3238 1
+5103	3614 1
+5103	3631 1
+5103	3634 1
+5103	3873 1
+5103	3897 1
+5103	4037 1
+5103	4071 1
+5103	4134 1
+5103	4361 1
+5103	4401 1
+5103	4435 1
+5103	4483 1
+5103	4536 1
+5103	4604 1
+5103	4666 1
+5103	4709 1
+5103	4717 1
+5103	4884 1
+5103	5002 1
+5103	5022 1
+5103	5028 1
+5103	5064 1
+5103	5079 1
+5103	5106 1
+5103	5148 1
+5103	5178 1
+5103	5465 1
+5103	5524 1
+5103	5529 1
+5103	5584 1
+5103	5605 1
+5103	5624 1
+5103	5671 1
+5103	5714 1
+5103	5799 1
+5103	5804 1
+5103	5814 1
+5103	5839 1
+5103	5922 1
+5103	6006 1
+5103	6032 1
+5103	6097 1
+5103	6227 1
+5103	6306 1
+5103	6320 1
+5103	6327 1
+5103	6400 1
+5103	6417 1
+5103	6441 1
+5103	6442 1
+5103	6501 1
+5103	6503 1
+5103	6523 1
+5103	6554 1
+5103	6555 1
+5103	6566 1
+5103	6599 1
+5103	6600 1
+5103	6624 1
+5103	6634 1
+5103	6720 1
+5103	6780 1
+5103	6790 1
+5103	6832 1
+5103	6833 1
+5103	6869 1
+5103	6875 1
+5103	6897 1
+5103	6914 1
+5103	7005 1
+5103	7052 1
+5103	7073 1
+5103	7074 1
+5103	7092 1
+5103	7108 1
+5103	7115 1
+5103	7116 1
+5103	7225 1
+5103	7233 1
+5103	7237 1
+5103	7280 1
+5103	7295 1
+5103	7386 1
+5103	7391 1
+5103	7414 1
+5103	7443 1
+5103	7510 1
+5103	7512 1
+5103	7529 1
+5103	7544 1
+5103	7553 1
+5103	7587 1
+5103	7618 1
+5103	7620 1
+5103	7624 1
+5103	7647 1
+5103	7649 1
+5103	7651 1
+5103	7694 1
+5103	7726 1
+5103	7810 1
+5103	7813 1
+5103	7835 1
+5103	7862 1
+5103	7890 1
+5103	7912 1
+5103	7992 1
+5103	8002 1
+5103	8051 1
+5103	8083 1
+5103	8122 1
+5103	8128 1
+5103	8141 1
+5103	8163 1
+5103	8168 1
+5103	8174 1
+5103	8178 1
+5103	8192 1
+5103	8212 1
+5103	8219 1
+5103	8224 1
+5104	1473 1
+5104	5106 1
+5104	6151 1
+5105	5106 1
+5109	2516 1
+5111	2381 1
+5111	2516 1
+5111	3334 1
+5111	3813 1
+5111	4536 1
+5111	4828 1
+5111	5130 1
+5110	15 1
+5110	1247 1
+5110	1680 1
+5110	2354 1
+5110	2369 1
+5110	2381 1
+5110	2386 1
+5110	2516 1
+5110	2592 1
+5110	2785 1
+5110	2822 1
+5110	2909 1
+5110	3092 1
+5110	3103 1
+5110	3417 1
+5110	3460 1
+5110	3479 1
+5110	3498 1
+5110	3614 1
+5110	3664 1
+5110	3813 1
+5110	3873 1
+5110	3897 1
+5110	3910 1
+5110	3976 1
+5110	4400 1
+5110	4448 1
+5110	4483 1
+5110	4547 1
+5110	4645 1
+5110	4687 1
+5110	4712 1
+5110	4715 1
+5110	4717 1
+5110	4795 1
+5110	4798 1
+5110	4828 1
+5110	4964 1
+5110	5123 1
+5110	5130 1
+5110	5132 1
+5110	5144 1
+5110	5162 1
+5110	5176 1
+5110	5178 1
+5110	5182 1
+5110	5204 1
+5110	5210 1
+5110	5215 1
+5110	5222 1
+5110	5262 1
+5110	5263 1
+5110	5301 1
+5110	5323 1
+5110	5327 1
+5110	5335 1
+5110	5341 1
+5110	5392 1
+5110	5412 1
+5110	5415 1
+5110	5423 1
+5110	5430 1
+5110	5439 1
+5110	5457 1
+5110	5487 1
+5110	5545 1
+5110	5684 1
+5110	5798 1
+5110	5802 1
+5110	5804 1
+5110	5886 1
+5110	5891 1
+5110	5925 1
+5110	5928 1
+5110	5947 1
+5110	5963 1
+5110	6246 1
+5110	6251 1
+5110	6255 1
+5110	6337 1
+5110	6388 1
+5110	6400 1
+5110	6417 1
+5110	6422 1
+5112	2516 1
+5114	967 1
+5114	5115 1
+5114	7386 1
+5114	7908 1
+4828	15 1
+4828	95 1
+4828	608 1
+4828	737 1
+4828	840 1
+4828	896 1
+4828	1385 1
+4828	1549 1
+4828	1982 1
+4828	2273 1
+4828	2516 1
+4828	2565 1
+4828	2774 1
+4828	2822 1
+4828	2925 1
+4828	3089 1
+4828	3238 1
+4828	3291 1
+4828	3346 1
+4828	3586 1
+4828	3752 1
+4828	3792 1
+4828	3796 1
+4828	3873 1
+4828	3976 1
+4828	4098 1
+4828	4099 1
+4828	4448 1
+4828	4482 1
+4828	4488 1
+4828	4530 1
+4828	4621 1
+4828	4666 1
+4828	4712 1
+4828	4717 1
+4828	4748 1
+4828	4764 1
+4828	4791 1
+4828	4795 1
+4828	4797 1
+4828	4944 1
+4828	5020 1
+4828	5123 1
+4828	5155 1
+4828	5178 1
+4828	5239 1
+4828	5262 1
+4828	5263 1
+4828	5321 1
+4828	5326 1
+4828	5335 1
+4828	5404 1
+4828	5415 1
+4828	5434 1
+4828	5439 1
+4828	5449 1
+4828	5452 1
+4828	5457 1
+4828	5465 1
+4828	5470 1
+4828	5481 1
+4828	5506 1
+4828	5524 1
+4828	5545 1
+4828	5563 1
+4828	5564 1
+4828	5596 1
+4828	5623 1
+4828	5663 1
+4828	5665 1
+4828	5697 1
+4828	5714 1
+4828	5738 1
+4828	5739 1
+4828	5757 1
+4828	5806 1
+4828	5811 1
+4828	5818 1
+4828	5829 1
+4828	5871 1
+4828	5872 1
+4828	5922 1
+4828	5936 1
+4828	5955 1
+4828	5963 1
+4828	5969 1
+4828	5973 1
+4828	5977 1
+4828	5980 1
+4828	5991 1
+4828	6001 1
+4828	6004 1
+4828	6021 1
+4828	6023 1
+4828	6041 1
+4828	6044 1
+4828	6054 1
+4828	6094 1
+4828	6098 1
+4828	6106 1
+4828	6161 1
+4828	6162 1
+4828	6218 1
+4828	6262 1
+4828	6272 1
+4828	6305 1
+4828	6327 1
+4828	6330 1
+4828	6337 1
+4828	6347 1
+4828	6388 1
+4828	6422 1
+4828	6424 1
+4828	6432 1
+4828	6435 1
+4828	6464 1
+4828	6472 1
+4828	6474 1
+4828	6481 1
+4828	6503 1
+4828	6532 1
+4828	6555 1
+4828	6567 1
+4828	6613 1
+4828	6624 1
+4828	6628 1
+4828	6665 1
+4828	6721 1
+4828	6725 1
+4828	6765 1
+4828	6783 1
+4828	6790 1
+4828	6803 1
+4828	6813 1
+4828	6832 1
+4828	6850 1
+4828	6855 1
+4828	6860 1
+4828	6869 1
+4828	6901 1
+4828	6913 1
+4828	6930 1
+4828	6938 1
+4828	6942 1
+4828	6953 1
+4828	6955 1
+4828	6979 1
+4828	6982 1
+4828	6994 1
+4828	7040 1
+4828	7052 1
+4828	7074 1
+4828	7315 1
+4828	7373 1
+4828	7386 1
+4828	7414 1
+4828	7553 1
+4828	7587 1
+4828	7593 1
+4828	7604 1
+4828	7634 1
+4828	7899 1
+4828	7979 1
+4828	7992 1
+4828	8249 1
+4828	8277 1
+4828	8295 1
+4828	8296 1
+5116	4828 1
+5117	3092 1
+5117	4828 1
+5118	72 1
+5118	1799 1
+5118	2001 1
+5118	2381 1
+5118	2386 1
+5118	3027 1
+5118	3092 1
+5118	4797 1
+5118	5020 1
+5118	5412 1
+5118	5459 1
+5118	5683 1
+5118	5743 1
+5119	737 1
+5119	1799 1
+5119	2381 1
+5119	2398 1
+5119	2592 1
+5119	2764 1
+5119	3092 1
+5119	3664 1
+5119	3813 1
+5119	4247 1
+5119	4547 1
+5119	4964 1
+5119	5130 1
+5119	5132 1
+5119	5144 1
+5119	5204 1
+5119	5222 1
+5119	5463 1
+5121	15 1
+5121	2160 1
+5121	3089 1
+5121	4715 1
+5121	5130 1
+5121	5301 1
+5121	5902 1
+5121	6296 1
+5121	6599 1
+5122	5130 1
+5123	15 1
+5123	896 1
+5123	1159 1
+5123	2160 1
+5123	2276 1
+5123	2398 1
+5123	2490 1
+5123	2535 1
+5123	2774 1
+5123	2775 1
+5123	2909 1
+5123	3015 1
+5123	3456 1
+5123	3586 1
+5123	3634 1
+5123	3873 1
+5123	3910 1
+5123	4037 1
+5123	4041 1
+5123	4065 1
+5123	4099 1
+5123	4175 1
+5123	4310 1
+5123	4335 1
+5123	4338 1
+5123	4534 1
+5123	4536 1
+5123	4574 1
+5123	4712 1
+5123	4795 1
+5123	5020 1
+5123	5130 1
+5123	5178 1
+5123	5182 1
+5123	5226 1
+5123	5233 1
+5123	5412 1
+5123	5449 1
+5123	5459 1
+5123	5466 1
+5123	5543 1
+5123	5568 1
+5123	5624 1
+5123	5671 1
+5123	5684 1
+5123	5737 1
+5123	5760 1
+5123	5775 1
+5123	5799 1
+5123	5814 1
+5123	5824 1
+5123	5891 1
+5123	6124 1
+5123	6299 1
+5123	6306 1
+5123	6323 1
+5123	6337 1
+5123	6422 1
+5123	6498 1
+5123	6566 1
+5123	6715 1
+5123	6784 1
+5123	7168 1
+5123	7632 1
+5123	7691 1
+5123	7699 1
+5123	7726 1
+5123	7809 1
+5123	7860 1
+5127	5130 1
+5128	5130 1
+5129	5130 1
+5124	5130 1
+5125	840 1
+5125	1385 1
+5125	2273 1
+5125	2386 1
+5125	2490 1
+5125	2774 1
+5125	3479 1
+5125	3634 1
+5125	4037 1
+5125	4483 1
+5125	4507 1
+5125	4534 1
+5125	4687 1
+5125	4781 1
+5125	4797 1
+5125	4828 1
+5125	4875 1
+5125	5130 1
+5125	5144 1
+5125	5178 1
+5125	5179 1
+5125	5245 1
+5125	5327 1
+5125	5341 1
+5125	5445 1
+5125	5482 1
+5125	5484 1
+5125	5524 1
+5125	5680 1
+5125	5753 1
+5125	5790 1
+5125	5828 1
+5125	5837 1
+5125	5850 1
+5125	5863 1
+5125	5936 1
+5125	5963 1
+5125	6006 1
+5125	6148 1
+5125	6151 1
+5125	6162 1
+5125	6229 1
+5125	6246 1
+5125	6251 1
+5125	6296 1
+5125	6306 1
+5125	6498 1
+5125	6528 1
+5125	6555 1
+5125	6634 1
+5125	6714 1
+5125	6855 1
+5125	7062 1
+5125	7094 1
+5050	2354 1
+5050	3092 1
+5050	4247 1
+5050	4587 1
+5050	4653 1
+5050	5020 1
+5050	5130 1
+5050	5200 1
+5050	5452 1
+5050	5484 1
+5050	6337 1
+5126	3092 1
+5126	5130 1
+5126	5144 1
+5135	3092 1
+5136	4536 1
+5138	5144 1
+5139	1385 1
+5139	2765 1
+5139	3191 1
+5139	3643 1
+5139	3976 1
+5139	4547 1
+5139	4645 1
+5139	5144 1
+5139	5182 1
+5139	5886 1
+5139	5963 1
+5140	1352 1
+5140	1493 1
+5140	1823 1
+5140	2273 1
+5140	2369 1
+5140	2440 1
+5140	2592 1
+5140	2620 1
+5140	2689 1
+5140	3106 1
+5140	3291 1
+5140	3634 1
+5140	3691 1
+5140	3910 1
+5140	4037 1
+5140	4448 1
+5140	4482 1
+5140	4547 1
+5140	4574 1
+5140	4604 1
+5140	4689 1
+5140	4712 1
+5140	4717 1
+5140	4748 1
+5140	4824 1
+5140	5144 1
+5140	5188 1
+5140	5239 1
+5140	5245 1
+5140	5273 1
+5140	5295 1
+5140	5457 1
+5140	5584 1
+5140	5827 1
+5140	5844 1
+5140	5886 1
+5140	5963 1
+5140	6505 1
+5140	6528 1
+5140	6552 1
+5140	6554 1
+5140	6566 1
+5140	6570 1
+5140	6576 1
+5140	6589 1
+5140	6594 1
+5140	6599 1
+5140	6600 1
+5140	7378 1
+5140	7587 1
+5140	7810 1
+5141	5144 1
+5142	2592 1
+5142	4448 1
+5142	4653 1
+5142	5144 1
+5150	15 1
+5150	2398 1
+5150	2576 1
+5150	3897 1
+5150	4400 1
+5150	4530 1
+5150	4536 1
+5150	4547 1
+5150	5254 1
+5150	5459 1
+5150	5680 1
+5150	5743 1
+5150	5775 1
+5151	3456 1
+5151	4645 1
+5151	5430 1
+5152	2369 1
+5152	4645 1
+5152	5204 1
+5152	5215 1
+5153	4645 1
+5153	5188 1
+5153	5437 1
+5153	5753 1
+5153	5963 1
+5154	3664 1
+5154	4645 1
+5154	5162 1
+5155	222 1
+5155	1680 1
+5155	2689 1
+5155	2822 1
+5155	2909 1
+5155	3106 1
+5155	3691 1
+5155	4315 1
+5155	4400 1
+5155	4448 1
+5155	4468 1
+5155	4482 1
+5155	4645 1
+5155	4712 1
+5155	5162 1
+5155	5231 1
+5155	5239 1
+5155	5240 1
+5155	5260 1
+5155	5311 1
+5155	5363 1
+5155	5392 1
+5155	5393 1
+5155	5430 1
+5162	1352 1
+5162	4600 1
+5162	4666 1
+5162	7553 1
+5162	7928 1
+5158	5162 1
+5159	5162 1
+5160	2285 1
+5160	2620 1
+5160	3897 1
+5160	4929 1
+5160	5155 1
+5160	5162 1
+5160	5210 1
+5160	5392 1
+5160	5452 1
+5160	5506 1
+5160	5511 1
+5160	5709 1
+5161	5162 1
+5167	5162 1
+5163	5162 1
+5164	5162 1
+5164	5872 1
+5166	15 1
+5166	1352 1
+5166	1549 1
+5166	3084 1
+5166	3238 1
+5166	3456 1
+5166	3643 1
+5166	3873 1
+5166	3962 1
+5166	4037 1
+5166	4071 1
+5166	4310 1
+5166	4361 1
+5166	4600 1
+5166	4604 1
+5166	4709 1
+5166	4781 1
+5166	4981 1
+5166	5079 1
+5166	5096 1
+5166	5148 1
+5166	5162 1
+5166	5254 1
+5166	5524 1
+5166	5563 1
+5166	5697 1
+5166	5714 1
+5166	5806 1
+5166	5814 1
+5166	6123 1
+5166	6330 1
+5166	6496 1
+5166	6555 1
+5166	6606 1
+5166	6613 1
+5166	6832 1
+5166	6897 1
+5166	6930 1
+5166	6979 1
+5166	7021 1
+5166	7063 1
+5166	7092 1
+5166	7119 1
+5166	7131 1
+5166	7620 1
+5166	7908 1
+5166	7961 1
+5166	7965 1
+5171	737 1
+5171	1799 1
+5171	2258 1
+5171	2764 1
+5171	3089 1
+5171	3498 1
+5171	3634 1
+5171	3643 1
+5171	3796 1
+5171	3897 1
+5171	4041 1
+5171	4099 1
+5171	4191 1
+5171	4310 1
+5171	4335 1
+5171	4483 1
+5171	4574 1
+5171	4653 1
+5171	4712 1
+5171	4795 1
+5171	4846 1
+5171	4964 1
+5171	4994 1
+5171	5188 1
+5171	5189 1
+5171	5262 1
+5171	5263 1
+5171	5459 1
+5171	5543 1
+5171	5637 1
+5171	5775 1
+5171	5844 1
+5171	5886 1
+5171	6098 1
+5171	6164 1
+5171	6221 1
+5171	6327 1
+5171	6481 1
+5171	6576 1
+5171	6720 1
+5171	6739 1
+5172	72 1
+5172	3238 1
+5172	3274 1
+5172	3456 1
+5172	3498 1
+5172	3755 1
+5172	3796 1
+5172	4099 1
+5172	4310 1
+5172	4335 1
+5172	4781 1
+5172	5020 1
+5172	5028 1
+5172	5079 1
+5172	5178 1
+5172	5421 1
+5172	5459 1
+5172	5780 1
+5172	5828 1
+5172	5832 1
+5172	5963 1
+5172	5972 1
+5172	6006 1
+5172	6979 1
+5172	7092 1
+5172	7553 1
+5172	7871 1
+5172	8178 1
+5172	8186 1
+5173	155 1
+5173	840 1
+5173	938 1
+5173	1026 1
+5173	1982 1
+5173	2565 1
+5173	2775 1
+5173	3334 1
+5173	3346 1
+5173	3459 1
+5173	3631 1
+5173	3796 1
+5173	3809 1
+5173	3885 1
+5173	3962 1
+5173	3969 1
+5173	4037 1
+5173	4099 1
+5173	4247 1
+5173	4432 1
+5173	4536 1
+5173	4764 1
+5173	4875 1
+5173	4940 1
+5173	5012 1
+5173	5148 1
+5173	5179 1
+5173	5199 1
+5173	5210 1
+5173	5233 1
+5173	5285 1
+5173	5384 1
+5173	5404 1
+5173	5421 1
+5173	5465 1
+5173	5484 1
+5173	5500 1
+5173	5529 1
+5173	5640 1
+5173	5683 1
+5173	5714 1
+5173	5738 1
+5173	5772 1
+5173	5773 1
+5173	5784 1
+5173	5790 1
+5173	5800 1
+5173	5806 1
+5173	5812 1
+5173	5839 1
+5173	5902 1
+5173	5922 1
+5173	5969 1
+5173	5998 1
+5173	6000 1
+5173	6156 1
+5173	6270 1
+5173	6299 1
+5173	6323 1
+5173	6327 1
+5173	6414 1
+5173	6523 1
+5173	6555 1
+5173	6560 1
+5173	6634 1
+5173	6665 1
+5173	6681 1
+5173	6714 1
+5173	6736 1
+5173	6777 1
+5173	6789 1
+5173	6806 1
+5173	6832 1
+5173	6907 1
+5173	6918 1
+5173	6946 1
+5173	6976 1
+5173	6979 1
+5173	7040 1
+5173	7050 1
+5173	7052 1
+5173	7054 1
+5173	7060 1
+5173	7073 1
+5173	7074 1
+5173	7092 1
+5173	7108 1
+5173	7119 1
+5173	7146 1
+5173	7225 1
+5173	7238 1
+5173	7279 1
+5173	7295 1
+5173	7301 1
+5173	7351 1
+5173	7373 1
+5173	7378 1
+5173	7389 1
+5173	7400 1
+5173	7414 1
+5173	7422 1
+5173	7497 1
+5173	7512 1
+5173	7529 1
+5173	7553 1
+5173	7620 1
+5173	7632 1
+5173	7647 1
+5173	7810 1
+5173	7839 1
+5173	7921 1
+5173	7924 1
+5173	7946 1
+5173	8051 1
+5173	8128 1
+5173	8134 1
+5173	8174 1
+5173	8178 1
+5173	8198 1
+5173	8204 1
+5173	8209 1
+5173	8224 1
+5174	2398 1
+5174	3796 1
+5174	4041 1
+5174	4653 1
+5174	4712 1
+5174	5200 1
+5175	72 1
+5175	737 1
+5175	2398 1
+5175	2516 1
+5175	2576 1
+5175	2764 1
+5175	2831 1
+5175	3393 1
+5175	3796 1
+5175	4098 1
+5175	4099 1
+5175	4191 1
+5175	4247 1
+5175	4335 1
+5175	4530 1
+5175	4534 1
+5175	4536 1
+5175	4653 1
+5175	4666 1
+5175	4797 1
+5175	4846 1
+5175	4899 1
+5175	4964 1
+5175	5189 1
+5175	5452 1
+5175	5454 1
+5175	5459 1
+5175	5484 1
+5175	5568 1
+5175	5650 1
+5175	5651 1
+5175	5721 1
+5175	5743 1
+5175	5775 1
+5175	5790 1
+4795	737 1
+4795	1403 1
+4795	1498 1
+4795	1982 1
+4795	2276 1
+4795	2511 1
+4795	2658 1
+4795	3634 1
+4795	3752 1
+4795	3796 1
+4795	3842 1
+4795	3897 1
+4795	3922 1
+4795	4037 1
+4795	4401 1
+4795	4432 1
+4795	4500 1
+4795	4536 1
+4795	4653 1
+4795	4666 1
+4795	4929 1
+4795	5012 1
+4795	5079 1
+4795	5096 1
+4795	5123 1
+4795	5200 1
+4795	5210 1
+4795	5254 1
+4795	5288 1
+4795	5392 1
+4795	5406 1
+4795	5439 1
+4795	5459 1
+4795	5545 1
+4795	5773 1
+4795	5814 1
+4795	5839 1
+4795	5872 1
+4795	5891 1
+4795	5933 1
+4795	5950 1
+4795	6032 1
+4795	6151 1
+4795	6218 1
+4795	6270 1
+4795	6302 1
+4795	6328 1
+4795	6337 1
+4795	6407 1
+4795	6432 1
+4795	6474 1
+4795	6628 1
+4795	6634 1
+4795	6736 1
+4795	6913 1
+4795	6914 1
+4795	6979 1
+4795	6980 1
+4795	7012 1
+4795	7023 1
+4795	7074 1
+4795	7101 1
+4795	7108 1
+4795	7257 1
+4795	7351 1
+4795	7391 1
+4795	7699 1
+4795	7809 1
+4795	7839 1
+4795	7860 1
+4795	7992 1
+4795	8224 1
+4795	8295 1
+5176	72 1
+5176	95 1
+5176	525 1
+5176	608 1
+5176	737 1
+5176	896 1
+5176	1159 1
+5176	1247 1
+5176	1473 1
+5176	1548 1
+5176	1733 1
+5176	1799 1
+5176	2001 1
+5176	2258 1
+5176	2276 1
+5176	2398 1
+5176	2507 1
+5176	2516 1
+5176	2552 1
+5176	2576 1
+5176	2605 1
+5176	2764 1
+5176	2765 1
+5176	2822 1
+5176	2831 1
+5176	3027 1
+5176	3089 1
+5176	3103 1
+5176	3191 1
+5176	3274 1
+5176	3393 1
+5176	3456 1
+5176	3459 1
+5176	3460 1
+5176	3586 1
+5176	3643 1
+5176	3755 1
+5176	3796 1
+5176	3897 1
+5176	3958 1
+5176	4041 1
+5176	4098 1
+5176	4099 1
+5176	4127 1
+5176	4191 1
+5176	4247 1
+5176	4276 1
+5176	4310 1
+5176	4335 1
+5176	4338 1
+5176	4400 1
+5176	4527 1
+5176	4530 1
+5176	4534 1
+5176	4536 1
+5176	4587 1
+5176	4600 1
+5176	4631 1
+5176	4653 1
+5176	4666 1
+5176	4712 1
+5176	4777 1
+5176	4797 1
+5176	4846 1
+5176	4899 1
+5176	4929 1
+5176	4964 1
+5176	4977 1
+5176	4986 1
+5176	5020 1
+5176	5072 1
+5176	5103 1
+5176	5123 1
+5176	5155 1
+5176	5182 1
+5176	5189 1
+5176	5226 1
+5176	5263 1
+5176	5285 1
+5176	5296 1
+5176	5301 1
+5176	5308 1
+5176	5321 1
+5176	5326 1
+5176	5392 1
+5176	5412 1
+5176	5423 1
+5176	5426 1
+5176	5430 1
+5176	5449 1
+5176	5452 1
+5176	5454 1
+5176	5459 1
+5176	5463 1
+5176	5482 1
+5176	5484 1
+5176	5506 1
+5176	5509 1
+5176	5511 1
+5176	5513 1
+5176	5524 1
+5176	5539 1
+5176	5543 1
+5176	5545 1
+5176	5559 1
+5176	5563 1
+5176	5568 1
+5176	5592 1
+5176	5637 1
+5176	5639 1
+5176	5640 1
+5176	5650 1
+5176	5651 1
+5176	5683 1
+5176	5693 1
+5176	5705 1
+5176	5721 1
+5176	5732 1
+5176	5737 1
+5176	5743 1
+5176	5756 1
+5176	5757 1
+5176	5760 1
+5176	5775 1
+5176	5780 1
+5176	5872 1
+5176	5886 1
+5176	5891 1
+5176	5925 1
+5176	5928 1
+5176	5936 1
+5176	5947 1
+5176	5963 1
+5176	5973 1
+5176	5994 1
+5176	6029 1
+5176	6078 1
+5176	8295 1
+5176	8296 1
+5177	15 1
+5177	1026 1
+5177	1648 1
+5177	1972 1
+5177	1982 1
+5177	2620 1
+5177	2925 1
+5177	3084 1
+5177	3089 1
+5177	3191 1
+5177	3459 1
+5177	3586 1
+5177	3614 1
+5177	3634 1
+5177	3796 1
+5177	3897 1
+5177	3919 1
+5177	3976 1
+5177	4310 1
+5177	4483 1
+5177	4536 1
+5177	4709 1
+5177	4712 1
+5177	4715 1
+5177	4717 1
+5177	4781 1
+5177	4791 1
+5177	4795 1
+5177	4798 1
+5177	4828 1
+5177	4981 1
+5177	4994 1
+5177	5002 1
+5177	5079 1
+5177	5123 1
+5177	5140 1
+5177	5178 1
+5177	5179 1
+5177	5188 1
+5177	5246 1
+5177	5254 1
+5177	5262 1
+5177	5423 1
+5177	5437 1
+5177	5439 1
+5177	5457 1
+5177	5524 1
+5177	5527 1
+5177	5545 1
+5177	5630 1
+5177	5697 1
+5177	5709 1
+5177	5714 1
+5177	5798 1
+5177	5800 1
+5177	5804 1
+5177	5809 1
+5177	5827 1
+5177	5839 1
+5177	5871 1
+5177	5947 1
+5177	5950 1
+5177	5963 1
+5177	5969 1
+5177	5994 1
+5177	6006 1
+5177	6023 1
+5177	6059 1
+5177	6094 1
+5177	6105 1
+5177	6124 1
+5177	6148 1
+5177	6164 1
+5177	6166 1
+5177	6221 1
+5177	6229 1
+5177	6251 1
+5177	6262 1
+5177	6296 1
+5177	6306 1
+5177	6437 1
+5177	6441 1
+5177	6481 1
+5177	6505 1
+5177	6523 1
+5177	6528 1
+5177	6560 1
+5177	6576 1
+5177	6613 1
+5177	6621 1
+5177	6665 1
+5177	6707 1
+5177	6774 1
+5177	6934 1
+5177	6979 1
+5177	7414 1
+5177	7620 1
+5177	7632 1
+5177	7910 1
+5177	8295 1
+5177	8297 1
+5178	2925 1
+5178	3796 1
+5178	3919 1
+5178	4310 1
+5178	4828 1
+5178	4986 1
+5178	5096 1
+5178	5543 1
+5178	5753 1
+5178	5811 1
+5178	6098 1
+5178	6124 1
+5178	6156 1
+5178	6170 1
+5178	6496 1
+5178	6665 1
+5178	6686 1
+5178	6715 1
+5178	7910 1
+4310	15 1
+4310	72 1
+4310	737 1
+4310	938 1
+4310	1159 1
+4310	1191 1
+4310	1352 1
+4310	1403 1
+4310	1473 1
+4310	1799 1
+4310	1865 1
+4310	2001 1
+4310	2160 1
+4310	2258 1
+4310	2276 1
+4310	2285 1
+4310	2354 1
+4310	2398 1
+4310	2440 1
+4310	2490 1
+4310	2507 1
+4310	2516 1
+4310	2576 1
+4310	2605 1
+4310	2620 1
+4310	2774 1
+4310	2775 1
+4310	2822 1
+4310	2831 1
+4310	2851 1
+4310	2909 1
+4310	2925 1
+4310	3000 1
+4310	3027 1
+4310	3084 1
+4310	3089 1
+4310	3238 1
+4310	3274 1
+4310	3291 1
+4310	3417 1
+4310	3456 1
+4310	3459 1
+4310	3586 1
+4310	3614 1
+4310	3634 1
+4310	3643 1
+4310	3691 1
+4310	3752 1
+4310	3755 1
+4310	3796 1
+4310	3830 1
+4310	3897 1
+4310	3919 1
+4310	3976 1
+4310	4037 1
+4310	4041 1
+4310	4071 1
+4310	4098 1
+4310	4099 1
+4310	4127 1
+4310	4175 1
+4310	4191 1
+4310	4247 1
+4310	4315 1
+4310	4338 1
+4310	4341 1
+4310	4400 1
+4310	4448 1
+4310	4483 1
+4310	4527 1
+4310	4530 1
+4310	4534 1
+4310	4536 1
+4310	4574 1
+4310	4587 1
+4310	4600 1
+4310	4632 1
+4310	4653 1
+4310	4666 1
+4310	4687 1
+4310	4709 1
+4310	4712 1
+4310	4715 1
+4310	4717 1
+4310	4748 1
+4310	4777 1
+4310	4781 1
+4310	4791 1
+4310	4795 1
+4310	4824 1
+4310	4828 1
+4310	4846 1
+4310	4875 1
+4310	4899 1
+4310	4929 1
+4310	4980 1
+4310	4981 1
+4310	4983 1
+4310	4986 1
+4310	5002 1
+4310	5020 1
+4310	5028 1
+4310	5061 1
+4310	5072 1
+4310	5096 1
+4310	5123 1
+4310	5155 1
+4310	5176 1
+4310	5178 1
+4310	5179 1
+4310	5182 1
+4310	5188 1
+4310	5189 1
+4310	5199 1
+4310	5200 1
+4310	5226 1
+4310	5233 1
+4310	5254 1
+4310	5262 1
+4310	5273 1
+4310	5285 1
+4310	5288 1
+4310	5301 1
+4310	5308 1
+4310	5311 1
+4310	5321 1
+4310	5323 1
+4310	5327 1
+4310	5335 1
+4310	5341 1
+4310	5404 1
+4310	5412 1
+4310	5417 1
+4310	5423 1
+4310	5439 1
+4310	5445 1
+4310	5449 1
+4310	5452 1
+4310	5459 1
+4310	5463 1
+4310	5482 1
+4310	5484 1
+4310	5499 1
+4310	5506 1
+4310	5509 1
+4310	5514 1
+4310	5524 1
+4310	5527 1
+4310	5539 1
+4310	5543 1
+4310	5563 1
+4310	5584 1
+4310	5592 1
+4310	5620 1
+4310	5624 1
+4310	5637 1
+4310	5651 1
+4310	5673 1
+4310	5680 1
+4310	5683 1
+4310	5684 1
+4310	5697 1
+4310	5721 1
+4310	5732 1
+4310	5739 1
+4310	5743 1
+4310	5760 1
+4310	5775 1
+4310	5798 1
+4310	5800 1
+4310	5804 1
+4310	5806 1
+4310	5807 1
+4310	5811 1
+4310	5814 1
+4310	5818 1
+4310	5822 1
+4310	5824 1
+4310	5839 1
+4310	5844 1
+4310	5848 1
+4310	5871 1
+4310	5872 1
+4310	5886 1
+4310	5902 1
+4310	5928 1
+4310	5932 1
+4310	5936 1
+4310	5947 1
+4310	5973 1
+4310	5994 1
+4310	5998 1
+4310	6000 1
+4310	6001 1
+4310	6006 1
+4310	6027 1
+4310	6032 1
+4310	6043 1
+4310	6044 1
+4310	6097 1
+4310	6098 1
+4310	6105 1
+4310	6123 1
+4310	6124 1
+4310	6151 1
+4310	6156 1
+4310	6243 1
+4310	6296 1
+4310	6299 1
+4310	6327 1
+4310	6328 1
+4310	6337 1
+4310	6400 1
+4310	6414 1
+4310	6432 1
+4310	6437 1
+4310	6481 1
+4310	6505 1
+4310	6523 1
+4310	6555 1
+4310	6566 1
+4310	6567 1
+4310	6570 1
+4310	6576 1
+4310	6613 1
+4310	6665 1
+4310	6715 1
+4310	6720 1
+4310	6774 1
+4310	6784 1
+4310	6832 1
+4310	6833 1
+4310	6860 1
+4310	6869 1
+4310	6907 1
+4310	6913 1
+4310	6945 1
+4310	6946 1
+4310	6979 1
+4310	6980 1
+4310	7012 1
+4310	7021 1
+4310	7052 1
+4310	7054 1
+4310	7063 1
+4310	7073 1
+4310	7094 1
+4310	7101 1
+4310	7115 1
+4310	7116 1
+4310	7119 1
+4310	7143 1
+4310	7144 1
+4310	7168 1
+4310	7214 1
+4310	7237 1
+4310	7238 1
+4310	7277 1
+4310	7351 1
+4310	7378 1
+4310	7381 1
+4310	7386 1
+4310	7400 1
+4310	7450 1
+4310	7497 1
+4310	7587 1
+4310	7618 1
+4310	7620 1
+4310	7651 1
+4310	7653 1
+4310	7699 1
+4310	7707 1
+4310	7778 1
+4310	7795 1
+4310	7813 1
+4310	7927 1
+4310	7961 1
+4310	8297 1
+5179	15 1
+5179	155 1
+5179	737 1
+5179	1473 1
+5179	1549 1
+5179	1733 1
+5179	1982 1
+5179	2001 1
+5179	2160 1
+5179	2258 1
+5179	2276 1
+5179	2376 1
+5179	2398 1
+5179	2535 1
+5179	2565 1
+5179	2576 1
+5179	2605 1
+5179	2620 1
+5179	2764 1
+5179	2765 1
+5179	2774 1
+5179	2851 1
+5179	2925 1
+5179	3000 1
+5179	3084 1
+5179	3238 1
+5179	3274 1
+5179	3459 1
+5179	3479 1
+5179	3614 1
+5179	3631 1
+5179	3643 1
+5179	3792 1
+5179	3796 1
+5179	3803 1
+5179	3873 1
+5179	3897 1
+5179	3919 1
+5179	3958 1
+5179	3969 1
+5179	4037 1
+5179	4041 1
+5179	4071 1
+5179	4247 1
+5179	4276 1
+5179	4310 1
+5179	4335 1
+5179	4338 1
+5179	4361 1
+5179	4483 1
+5179	4530 1
+5179	4534 1
+5179	4536 1
+5179	4600 1
+5179	4653 1
+5179	4666 1
+5179	4687 1
+5179	4712 1
+5179	4715 1
+5179	4781 1
+5179	4795 1
+5179	4797 1
+5179	4798 1
+5179	4828 1
+5179	4846 1
+5179	4875 1
+5179	4899 1
+5179	4964 1
+5179	4980 1
+5179	5002 1
+5179	5012 1
+5179	5020 1
+5179	5022 1
+5179	5072 1
+5179	5079 1
+5179	5103 1
+5179	5121 1
+5179	5178 1
+5179	5188 1
+5179	5200 1
+5179	5210 1
+5179	5226 1
+5179	5233 1
+5179	5254 1
+5179	5263 1
+5179	5285 1
+5179	5288 1
+5179	5335 1
+5179	5404 1
+5179	5423 1
+5179	5437 1
+5179	5439 1
+5179	5445 1
+5179	5454 1
+5179	5459 1
+5179	5487 1
+5179	5509 1
+5179	5524 1
+5179	5527 1
+5179	5529 1
+5179	5543 1
+5179	5563 1
+5179	5568 1
+5179	5592 1
+5179	5620 1
+5179	5637 1
+5179	5640 1
+5179	5683 1
+5179	5684 1
+5179	5693 1
+5179	5697 1
+5179	5721 1
+5179	5732 1
+5179	5737 1
+5179	5738 1
+5179	5739 1
+5179	5743 1
+5179	5753 1
+5179	5756 1
+5179	5760 1
+5179	5775 1
+5179	5776 1
+5179	5778 1
+5179	5798 1
+5179	5800 1
+5179	5802 1
+5179	5804 1
+5179	5807 1
+5179	5814 1
+5179	5871 1
+5179	5902 1
+5179	5969 1
+5179	5994 1
+5179	5998 1
+5179	6001 1
+5179	6023 1
+5179	6029 1
+5179	6078 1
+5179	6098 1
+5179	6111 1
+5179	6123 1
+5179	6124 1
+5179	6148 1
+5179	6151 1
+5179	6156 1
+5179	6170 1
+5179	6221 1
+5179	6229 1
+5179	6246 1
+5179	6251 1
+5179	6255 1
+5179	6262 1
+5179	6270 1
+5179	6272 1
+5179	6296 1
+5179	6299 1
+5179	6305 1
+5179	6306 1
+5179	6327 1
+5179	6328 1
+5179	6330 1
+5179	6334 1
+5179	6337 1
+5179	6388 1
+5179	6400 1
+5179	6407 1
+5179	6414 1
+5179	6432 1
+5179	6523 1
+5179	6560 1
+5179	6599 1
+5179	6600 1
+5179	6618 1
+5179	6634 1
+5179	6665 1
+5179	6714 1
+5179	6715 1
+5179	6765 1
+5179	6784 1
+5179	6832 1
+5179	6855 1
+5179	6860 1
+5179	6907 1
+5179	6913 1
+5179	6918 1
+5179	6945 1
+5179	6946 1
+5179	6948 1
+5179	6979 1
+5179	6982 1
+5179	7047 1
+5179	7054 1
+5179	7088 1
+5179	7092 1
+5179	7144 1
+5179	7233 1
+5179	7237 1
+5179	7250 1
+5179	7373 1
+5179	7517 1
+5179	7544 1
+5179	7553 1
+5179	7587 1
+5179	7620 1
+5179	7632 1
+5179	7642 1
+5179	7646 1
+5179	7662 1
+5179	7683 1
+5179	7699 1
+5179	7839 1
+5179	8044 1
+5179	8083 1
+5179	8124 1
+5179	8134 1
+5179	8141 1
+5179	8295 1
+5180	896 1
+5180	1473 1
+5180	1648 1
+5180	1733 1
+5180	2001 1
+5180	2258 1
+5180	2354 1
+5180	2507 1
+5180	2576 1
+5180	2605 1
+5180	2765 1
+5180	2775 1
+5180	3089 1
+5180	3274 1
+5180	3586 1
+5180	3643 1
+5180	3796 1
+5180	4041 1
+5180	4527 1
+5180	4534 1
+5180	4536 1
+5180	4574 1
+5180	4795 1
+5180	5061 1
+5180	5123 1
+5180	5176 1
+5180	5182 1
+5180	5226 1
+5180	5445 1
+5180	5454 1
+5180	5459 1
+5180	5482 1
+5180	5680 1
+5180	5693 1
+5180	5743 1
+5180	5775 1
+5180	5780 1
+5180	5790 1
+5180	5837 1
+5180	5844 1
+5180	5848 1
+5180	5863 1
+5180	5886 1
+5180	5891 1
+5180	5925 1
+5180	5928 1
+5180	5947 1
+5180	5963 1
+5180	5994 1
+5181	1352 1
+5181	2398 1
+5181	2516 1
+5181	2552 1
+5181	2605 1
+5181	2764 1
+5181	2831 1
+5181	3456 1
+5181	3796 1
+5181	3897 1
+5181	3919 1
+5181	4098 1
+5181	4247 1
+5181	4335 1
+5181	4574 1
+5181	4600 1
+5181	4631 1
+5181	4653 1
+5181	4797 1
+5181	5188 1
+5181	5210 1
+5181	5254 1
+5181	5296 1
+5181	5321 1
+5181	5459 1
+5181	5482 1
+5181	5484 1
+5181	5568 1
+5181	5588 1
+5181	5651 1
+5181	5680 1
+5181	5693 1
+5181	5784 1
+5181	5827 1
+5181	5837 1
+5181	5844 1
+5181	5848 1
+5181	5863 1
+5181	6437 1
+5181	6566 1
+5181	8295 1
+5182	896 1
+5182	3498 1
+5182	3796 1
+5182	4099 1
+5182	4534 1
+5182	4846 1
+5182	5123 1
+5182	5262 1
+5182	5263 1
+5182	5568 1
+5182	5743 1
+5182	5828 1
+5182	5848 1
+5182	5863 1
+5183	3796 1
+5184	608 1
+5184	737 1
+5184	1247 1
+5184	1733 1
+5184	1799 1
+5184	2258 1
+5184	2276 1
+5184	2398 1
+5184	2516 1
+5184	2576 1
+5184	2605 1
+5184	2764 1
+5184	2822 1
+5184	2831 1
+5184	3027 1
+5184	3089 1
+5184	3103 1
+5184	3393 1
+5184	3417 1
+5184	3456 1
+5184	3460 1
+5184	3643 1
+5184	3796 1
+5184	3897 1
+5184	3910 1
+5184	4041 1
+5184	4098 1
+5184	4191 1
+5184	4247 1
+5184	4315 1
+5184	4400 1
+5184	4448 1
+5184	4482 1
+5184	4587 1
+5184	4600 1
+5184	4653 1
+5184	4777 1
+5184	4824 1
+5184	4846 1
+5184	4899 1
+5184	4929 1
+5184	4964 1
+5184	4986 1
+5184	5020 1
+5184	5155 1
+5184	5189 1
+5184	5335 1
+5184	5392 1
+5184	5412 1
+5184	5430 1
+5184	5449 1
+5184	5459 1
+5184	5463 1
+5184	5506 1
+5184	5509 1
+5184	5559 1
+5184	5564 1
+5184	5568 1
+5184	5623 1
+5184	5637 1
+5184	5650 1
+5184	5651 1
+5184	5693 1
+5184	5743 1
+5184	5775 1
+5184	5891 1
+5184	5925 1
+5184	5947 1
+5185	967 1
+5185	1352 1
+5185	1972 1
+5185	2160 1
+5185	2273 1
+5185	2277 1
+5185	2433 1
+5185	2535 1
+5185	2605 1
+5185	2774 1
+5185	3015 1
+5185	3238 1
+5185	3291 1
+5185	3334 1
+5185	3614 1
+5185	3634 1
+5185	3792 1
+5185	3796 1
+5185	3830 1
+5185	3873 1
+5185	3897 1
+5185	3919 1
+5185	4065 1
+5185	4099 1
+5185	4134 1
+5185	4335 1
+5185	4483 1
+5185	4488 1
+5185	4709 1
+5185	4712 1
+5185	4713 1
+5185	4715 1
+5185	4748 1
+5185	4764 1
+5185	4795 1
+5185	4798 1
+5185	4828 1
+5185	4875 1
+5185	4980 1
+5185	4986 1
+5185	5002 1
+5185	5020 1
+5185	5022 1
+5185	5037 1
+5185	5123 1
+5185	5178 1
+5185	5188 1
+5185	5200 1
+5185	5254 1
+5185	5295 1
+5185	5321 1
+5185	5378 1
+5185	5439 1
+5185	5459 1
+5185	5479 1
+5185	5524 1
+5185	5527 1
+5185	5543 1
+5185	5563 1
+5185	5596 1
+5185	5605 1
+5185	5614 1
+5185	5683 1
+5185	5684 1
+5185	5697 1
+5185	5714 1
+5185	5753 1
+5185	5760 1
+5185	5798 1
+5185	5799 1
+5185	5800 1
+5185	5802 1
+5185	5804 1
+5185	5818 1
+5185	5827 1
+5185	5829 1
+5185	5871 1
+5185	5897 1
+5185	5925 1
+5185	5947 1
+5185	6001 1
+5185	6004 1
+5185	6006 1
+5185	6124 1
+5185	6156 1
+5185	6170 1
+5185	6218 1
+5185	6221 1
+5185	6227 1
+5185	6229 1
+5185	6251 1
+5185	6272 1
+5185	6299 1
+5185	6305 1
+5185	6306 1
+5185	6323 1
+5185	6327 1
+5185	6328 1
+5185	6347 1
+5185	6388 1
+5185	6432 1
+5185	6447 1
+5185	6458 1
+5185	6481 1
+5185	6491 1
+5185	6496 1
+5185	6501 1
+5185	6505 1
+5185	6560 1
+5185	6595 1
+5185	6600 1
+5185	6613 1
+5185	6632 1
+5185	6665 1
+5185	6699 1
+5185	6720 1
+5185	6739 1
+5185	6755 1
+5185	6765 1
+5185	6770 1
+5185	6777 1
+5185	6783 1
+5185	6784 1
+5185	6788 1
+5185	6789 1
+5185	6803 1
+5185	6806 1
+5185	6832 1
+5185	6833 1
+5185	6850 1
+5185	6855 1
+5185	6860 1
+5185	6869 1
+5185	6873 1
+5185	6897 1
+5185	6930 1
+5185	6933 1
+5185	6934 1
+5185	6938 1
+5185	6945 1
+5185	6946 1
+5185	6948 1
+5185	6953 1
+5185	6955 1
+5185	6967 1
+5185	7301 1
+5185	7351 1
+5185	7414 1
+5185	8128 1
+5185	8219 1
+5185	8237 1
+5185	8297 1
+5186	3796 1
+5186	4944 1
+5187	1473 1
+5187	1648 1
+5187	2398 1
+5187	2490 1
+5187	3796 1
+5187	4530 1
+5187	4536 1
+5187	4574 1
+5187	5061 1
+5187	5123 1
+5187	5301 1
+5187	5321 1
+5187	5457 1
+5187	5459 1
+5187	5482 1
+5187	5637 1
+5187	5640 1
+5187	5651 1
+5187	5680 1
+5187	5721 1
+5187	5775 1
+5187	5784 1
+5187	5828 1
+5187	5844 1
+5187	5848 1
+5187	5860 1
+5187	5863 1
+5187	5886 1
+5187	5891 1
+5187	5925 1
+5187	5928 1
+5188	737 1
+5188	1352 1
+5188	1473 1
+5188	1549 1
+5188	1648 1
+5188	1733 1
+5188	1823 1
+5188	1972 1
+5188	2160 1
+5188	2258 1
+5188	2398 1
+5188	2433 1
+5188	2440 1
+5188	2511 1
+5188	2516 1
+5188	2535 1
+5188	2605 1
+5188	2764 1
+5188	2775 1
+5188	2785 1
+5188	2831 1
+5188	3238 1
+5188	3274 1
+5188	3291 1
+5188	3393 1
+5188	3456 1
+5188	3459 1
+5188	3631 1
+5188	3634 1
+5188	3792 1
+5188	3796 1
+5188	3803 1
+5188	3830 1
+5188	3842 1
+5188	4037 1
+5188	4065 1
+5188	4099 1
+5188	4247 1
+5188	4338 1
+5188	4483 1
+5188	4488 1
+5188	4530 1
+5188	4534 1
+5188	4536 1
+5188	4574 1
+5188	4600 1
+5188	4604 1
+5188	4653 1
+5188	4666 1
+5188	4689 1
+5188	4709 1
+5188	4712 1
+5188	4713 1
+5188	4717 1
+5188	4748 1
+5188	4764 1
+5188	4777 1
+5188	4795 1
+5188	4797 1
+5188	4846 1
+5188	4899 1
+5188	4929 1
+5188	4944 1
+5188	4964 1
+5188	4981 1
+5188	4986 1
+5188	4994 1
+5188	5002 1
+5188	5037 1
+5188	5061 1
+5188	5072 1
+5188	5140 1
+5188	5179 1
+5188	5189 1
+5188	5199 1
+5188	5200 1
+5188	5226 1
+5188	5254 1
+5188	5263 1
+5188	5273 1
+5188	5288 1
+5188	5321 1
+5188	5445 1
+5188	5454 1
+5188	5459 1
+5188	5479 1
+5188	5506 1
+5188	5509 1
+5188	5524 1
+5188	5543 1
+5188	5563 1
+5188	5568 1
+5188	5584 1
+5188	5592 1
+5188	5596 1
+5188	5626 1
+5188	5637 1
+5188	5640 1
+5188	5650 1
+5188	5651 1
+5188	5680 1
+5188	5684 1
+5188	5693 1
+5188	5697 1
+5188	5714 1
+5188	5732 1
+5188	5737 1
+5188	5739 1
+5188	5743 1
+5188	5775 1
+5188	5776 1
+5188	5780 1
+5188	5790 1
+5188	5798 1
+5188	5799 1
+5188	5802 1
+5188	5804 1
+5188	5814 1
+5188	5818 1
+5188	5822 1
+5188	5827 1
+5188	5828 1
+5188	5829 1
+5188	5837 1
+5188	5844 1
+5188	5848 1
+5188	5863 1
+5188	5871 1
+5188	5886 1
+5188	5891 1
+5188	5897 1
+5188	5922 1
+5188	5925 1
+5188	5932 1
+5188	5998 1
+5188	6001 1
+5188	6004 1
+5188	6097 1
+5188	6156 1
+5188	6170 1
+5188	6221 1
+5188	6227 1
+5188	6262 1
+5188	6272 1
+5188	6299 1
+5188	6305 1
+5188	6306 1
+5188	6327 1
+5188	6328 1
+5188	6330 1
+5188	6458 1
+5188	6496 1
+5188	6501 1
+5188	6503 1
+5188	6528 1
+5188	6552 1
+5188	6554 1
+5188	6555 1
+5188	6560 1
+5188	6566 1
+5188	6570 1
+5188	6576 1
+5188	6589 1
+5188	6594 1
+5188	6600 1
+5188	6613 1
+5188	6624 1
+5188	6632 1
+5188	6665 1
+5188	6699 1
+5188	6715 1
+5188	6770 1
+5188	6774 1
+5188	6783 1
+5188	6784 1
+5188	6790 1
+5188	6803 1
+5188	6832 1
+5188	6833 1
+5188	6855 1
+5188	6860 1
+5188	6869 1
+5188	6873 1
+5188	6897 1
+5188	6901 1
+5188	6913 1
+5188	6918 1
+5188	6930 1
+5188	6945 1
+5188	6955 1
+5188	6976 1
+5188	7063 1
+5188	7073 1
+5188	7092 1
+5188	7101 1
+5188	7115 1
+5188	7119 1
+5188	7143 1
+5188	7144 1
+5188	7168 1
+5188	7233 1
+5188	7301 1
+5188	7553 1
+5188	7695 1
+5188	7788 1
+5188	7795 1
+5188	7835 1
+5188	7961 1
+5188	7979 1
+5188	8192 1
+5188	8295 1
+5189	15 1
+5189	72 1
+5189	95 1
+5189	608 1
+5189	737 1
+5189	896 1
+5189	1247 1
+5189	1498 1
+5189	1548 1
+5189	1549 1
+5189	1799 1
+5189	1823 1
+5189	1972 1
+5189	2001 1
+5189	2160 1
+5189	2258 1
+5189	2276 1
+5189	2277 1
+5189	2354 1
+5189	2398 1
+5189	2516 1
+5189	2535 1
+5189	2552 1
+5189	2576 1
+5189	2605 1
+5189	2620 1
+5189	2764 1
+5189	2774 1
+5189	2822 1
+5189	2831 1
+5189	2909 1
+5189	2914 1
+5189	2925 1
+5189	3015 1
+5189	3027 1
+5189	3084 1
+5189	3089 1
+5189	3103 1
+5189	3191 1
+5189	3238 1
+5189	3274 1
+5189	3334 1
+5189	3417 1
+5189	3456 1
+5189	3459 1
+5189	3460 1
+5189	3498 1
+5189	3586 1
+5189	3634 1
+5189	3755 1
+5189	3796 1
+5189	3803 1
+5189	3842 1
+5189	3873 1
+5189	3885 1
+5189	3897 1
+5189	3910 1
+5189	3958 1
+5189	3962 1
+5189	3976 1
+5189	4037 1
+5189	4098 1
+5189	4099 1
+5189	4175 1
+5189	4191 1
+5189	4247 1
+5189	4310 1
+5189	4335 1
+5189	4338 1
+5189	4341 1
+5189	4361 1
+5189	4400 1
+5189	4441 1
+5189	4448 1
+5189	4483 1
+5189	4500 1
+5189	4534 1
+5189	4574 1
+5189	4587 1
+5189	4600 1
+5189	4631 1
+5189	4653 1
+5189	4687 1
+5189	4712 1
+5189	4717 1
+5189	4777 1
+5189	4781 1
+5189	4795 1
+5189	4797 1
+5189	4798 1
+5189	4824 1
+5189	4828 1
+5189	4875 1
+5189	4929 1
+5189	4940 1
+5189	4964 1
+5189	4986 1
+5189	5022 1
+5189	5079 1
+5189	5096 1
+5189	5103 1
+5189	5121 1
+5189	5123 1
+5189	5140 1
+5189	5155 1
+5189	5176 1
+5189	5178 1
+5189	5182 1
+5189	5200 1
+5189	5226 1
+5189	5233 1
+5189	5262 1
+5189	5285 1
+5189	5288 1
+5189	5289 1
+5189	5296 1
+5189	5301 1
+5189	5305 1
+5189	5321 1
+5189	5326 1
+5189	5327 1
+5189	5335 1
+5189	5341 1
+5189	5351 1
+5189	5387 1
+5189	5392 1
+5189	5404 1
+5189	5412 1
+5189	5417 1
+5189	5423 1
+5189	5426 1
+5189	5430 1
+5189	5437 1
+5189	5445 1
+5189	5449 1
+5189	5454 1
+5189	5457 1
+5189	5459 1
+5189	5463 1
+5189	5465 1
+5189	5466 1
+5189	5467 1
+5189	5471 1
+5189	5481 1
+5189	5487 1
+5189	5506 1
+5189	5509 1
+5189	5513 1
+5189	5514 1
+5189	5524 1
+5189	5529 1
+5189	5543 1
+5189	5545 1
+5189	5559 1
+5189	5563 1
+5189	5564 1
+5189	5568 1
+5189	5588 1
+5189	5592 1
+5189	5596 1
+5189	5620 1
+5189	5624 1
+5189	5626 1
+5189	5630 1
+5189	5637 1
+5189	5638 1
+5189	5639 1
+5189	5640 1
+5189	5651 1
+5189	5680 1
+5189	5683 1
+5189	5684 1
+5189	5693 1
+5189	5697 1
+5189	5705 1
+5189	5737 1
+5189	5738 1
+5189	5743 1
+5189	5745 1
+5189	5753 1
+5189	5754 1
+5189	5756 1
+5189	5760 1
+5189	5775 1
+5189	5798 1
+5189	5799 1
+5189	5800 1
+5189	5804 1
+5189	5806 1
+5189	5809 1
+5189	5812 1
+5189	5817 1
+5189	5819 1
+5189	5824 1
+5189	5829 1
+5189	5830 1
+5189	5837 1
+5189	5839 1
+5189	5844 1
+5189	5863 1
+5189	5872 1
+5189	5886 1
+5189	5891 1
+5189	5925 1
+5189	5928 1
+5189	5936 1
+5189	5947 1
+5189	5969 1
+5189	5972 1
+5189	5973 1
+5189	5977 1
+5189	5980 1
+5189	5991 1
+5189	5994 1
+5189	6004 1
+5189	6006 1
+5189	6023 1
+5189	6044 1
+5189	6059 1
+5189	6078 1
+5189	6094 1
+5189	6098 1
+5189	6105 1
+5189	6111 1
+5189	6123 1
+5189	6124 1
+5189	6148 1
+5189	6166 1
+5189	6218 1
+5189	6226 1
+5189	6229 1
+5189	6246 1
+5189	6251 1
+5189	6261 1
+5189	6262 1
+5189	6269 1
+5189	6278 1
+5189	6296 1
+5189	6302 1
+5189	6305 1
+5189	6306 1
+5189	6327 1
+5189	6330 1
+5189	6334 1
+5189	6337 1
+5189	6360 1
+5189	6417 1
+5189	6437 1
+5189	6441 1
+5189	6458 1
+5189	6474 1
+5189	6481 1
+5189	6523 1
+5189	6553 1
+5189	6555 1
+5189	6560 1
+5189	6566 1
+5189	6594 1
+5189	6606 1
+5189	6613 1
+5189	6618 1
+5189	6634 1
+5189	6665 1
+5189	6715 1
+5189	6774 1
+5189	6784 1
+5189	6832 1
+5189	6855 1
+5189	6897 1
+5189	6913 1
+5189	6918 1
+5189	6946 1
+5189	6979 1
+5189	6994 1
+5189	7021 1
+5189	7050 1
+5189	7052 1
+5189	7059 1
+5189	7092 1
+5189	7094 1
+5189	7101 1
+5189	7115 1
+5189	7120 1
+5189	7131 1
+5189	7214 1
+5189	7289 1
+5189	7323 1
+5189	7373 1
+5189	7378 1
+5189	7414 1
+5189	7478 1
+5189	7498 1
+5189	7510 1
+5189	7553 1
+5189	7618 1
+5189	7620 1
+5189	7624 1
+5189	7632 1
+5189	7662 1
+5189	7683 1
+5189	7695 1
+5189	7699 1
+5189	7701 1
+5189	7809 1
+5189	7813 1
+5189	7913 1
+5189	8132 1
+5189	8209 1
+5189	8224 1
+5189	8249 1
+5189	8295 1
+5189	8296 1
+5190	95 1
+5190	608 1
+5190	737 1
+5190	1648 1
+5190	1799 1
+5190	2001 1
+5190	2258 1
+5190	2398 1
+5190	2516 1
+5190	2576 1
+5190	2605 1
+5190	2764 1
+5190	2831 1
+5190	2909 1
+5190	3027 1
+5190	3103 1
+5190	3274 1
+5190	3417 1
+5190	3456 1
+5190	3796 1
+5190	4099 1
+5190	4191 1
+5190	4247 1
+5190	4335 1
+5190	4355 1
+5190	4400 1
+5190	4448 1
+5190	4587 1
+5190	4600 1
+5190	4653 1
+5190	4666 1
+5190	4712 1
+5190	4824 1
+5190	4846 1
+5190	4929 1
+5190	4964 1
+5190	4986 1
+5190	5123 1
+5190	5155 1
+5190	5182 1
+5190	5189 1
+5190	5321 1
+5190	5335 1
+5190	5341 1
+5190	5387 1
+5190	5392 1
+5190	5412 1
+5190	5423 1
+5190	5430 1
+5190	5454 1
+5190	5459 1
+5190	5463 1
+5190	5465 1
+5190	5467 1
+5190	5469 1
+5190	5470 1
+5190	5481 1
+5190	5506 1
+5190	5511 1
+5190	5513 1
+5190	5514 1
+5190	5539 1
+5190	5568 1
+5190	5592 1
+5190	5620 1
+5190	5623 1
+5190	5635 1
+5190	5637 1
+5190	5639 1
+5190	5640 1
+5190	5650 1
+5190	5651 1
+5190	5683 1
+5190	5693 1
+5190	5817 1
+5190	5828 1
+5190	5963 1
+5190	6700 1
+5190	8295 1
+5190	8296 1
+5191	1473 1
+5191	2764 1
+5191	3554 1
+5191	3796 1
+5191	4099 1
+5191	4338 1
+5191	4846 1
+5191	5020 1
+5191	5392 1
+5191	5423 1
+5192	3796 1
+5194	4483 1
+5194	4653 1
+5194	5072 1
+5194	5178 1
+5194	5204 1
+5194	5457 1
+5194	6023 1
+5194	6262 1
+5194	6737 1
+5194	8295 1
+5195	1385 1
+5195	1680 1
+5195	3106 1
+5195	5204 1
+5196	15 1
+5196	1972 1
+5196	2001 1
+5196	2774 1
+5196	3238 1
+5196	3885 1
+5196	3897 1
+5196	4315 1
+5196	4875 1
+5196	4964 1
+5196	5079 1
+5196	5178 1
+5196	5204 1
+5196	5254 1
+5196	5289 1
+5196	5543 1
+5196	5802 1
+5196	5804 1
+5196	5871 1
+5196	5963 1
+5196	6166 1
+5196	6251 1
+5196	6505 1
+5196	6665 1
+5196	6809 1
+5196	6832 1
+5196	6850 1
+5196	7279 1
+5196	7414 1
+5196	7561 1
+5196	7632 1
+5196	7646 1
+5197	4964 1
+5197	5204 1
+5197	6004 1
+5198	2354 1
+5198	2398 1
+5198	2689 1
+5198	3456 1
+5198	5123 1
+5198	5204 1
+5199	1823 1
+5199	2535 1
+5199	2658 1
+5199	2940 1
+5199	4483 1
+5199	4875 1
+5199	5200 1
+5199	5204 1
+5199	5459 1
+5199	5819 1
+5199	5829 1
+5199	6422 1
+5199	6560 1
+5199	6599 1
+5199	7012 1
+5199	7279 1
+5199	7378 1
+5199	7587 1
+5199	7647 1
+5199	7649 1
+5199	7669 1
+5199	7809 1
+5200	3897 1
+5200	4432 1
+5200	4448 1
+5200	4587 1
+5200	4632 1
+5200	4824 1
+5200	5204 1
+5200	5215 1
+5200	5412 1
+5200	5463 1
+5200	5465 1
+5200	5897 1
+5200	6979 1
+5200	7021 1
+5200	7553 1
+5201	4335 1
+5201	5079 1
+5201	5204 1
+5201	5208 1
+5201	5378 1
+5201	5412 1
+5201	5459 1
+5201	6665 1
+5201	6980 1
+5201	7021 1
+5201	7478 1
+5201	7498 1
+5201	7520 1
+5201	7632 1
+5201	7855 1
+5202	3460 1
+5202	5204 1
+5203	737 1
+5203	1799 1
+5203	3027 1
+5203	3417 1
+5203	4191 1
+5203	4400 1
+5203	4587 1
+5203	4653 1
+5203	4929 1
+5203	5020 1
+5203	5200 1
+5203	5204 1
+5203	5434 1
+5203	5463 1
+5203	6950 1
+5207	2592 1
+5207	2909 1
+5207	3089 1
+5207	4191 1
+5207	4631 1
+5207	5200 1
+5207	5233 1
+5207	5465 1
+5207	5814 1
+5207	5925 1
+5207	5947 1
+5207	5972 1
+5207	6302 1
+5209	5210 1
+5215	15 1
+5215	3634 1
+5215	4310 1
+5215	5200 1
+5215	6832 1
+5215	7279 1
+5215	7414 1
+5215	7553 1
+5213	5215 1
+5214	5215 1
+5216	5141 1
+5217	2369 1
+5217	3238 1
+5217	3631 1
+5217	4335 1
+5217	4448 1
+5217	4536 1
+5217	4712 1
+5217	5020 1
+5217	5123 1
+5217	5178 1
+5217	5245 1
+5217	5404 1
+5217	5459 1
+5217	5743 1
+5217	5760 1
+5217	6299 1
+5217	6442 1
+5217	6634 1
+5217	6832 1
+5217	6907 1
+5217	6934 1
+5222	5479 1
+5218	5222 1
+5219	5222 1
+5220	5222 1
+5221	5222 1
+5224	5231 1
+5226	4037 1
+5226	4310 1
+5226	4828 1
+5226	5079 1
+5226	5123 1
+5226	5231 1
+5226	5262 1
+5226	5605 1
+5226	5671 1
+5226	5680 1
+5226	5886 1
+5226	5947 1
+5226	5972 1
+5226	6634 1
+5226	7726 1
+5226	7910 1
+5226	8058 1
+5227	5231 1
+5228	5231 1
+5225	5231 1
+5229	5231 1
+5230	5231 1
+5233	737 1
+5233	1385 1
+5233	1680 1
+5233	2909 1
+5233	2940 1
+5233	3027 1
+5233	3103 1
+5233	3106 1
+5233	3393 1
+5233	3897 1
+5233	4071 1
+5233	4127 1
+5233	5239 1
+5233	5288 1
+5233	5430 1
+5233	5818 1
+5233	6004 1
+5233	6044 1
+5233	6780 1
+5233	6914 1
+5233	7092 1
+5233	7301 1
+5233	7862 1
+5233	7890 1
+5232	1385 1
+5232	1680 1
+5239	5305 1
+5238	1385 1
+5238	3459 1
+5238	5239 1
+5242	5245 1
+5244	5245 1
+5241	5245 1
+5241	8051 1
+5243	1247 1
+5243	1385 1
+5243	3027 1
+5243	3103 1
+5243	3459 1
+5243	3897 1
+5243	4127 1
+5243	4315 1
+5243	4400 1
+5243	4587 1
+5243	4824 1
+5243	5245 1
+5243	5288 1
+5243	5308 1
+5243	5392 1
+5243	5423 1
+5243	5430 1
+5243	5809 1
+5243	8295 1
+5246	1026 1
+5246	1352 1
+5246	1982 1
+5246	2276 1
+5246	2354 1
+5246	2620 1
+5246	2822 1
+5246	3089 1
+5246	3191 1
+5246	3459 1
+5246	3586 1
+5246	3643 1
+5246	3910 1
+5246	4041 1
+5246	4361 1
+5246	4400 1
+5246	4687 1
+5246	4712 1
+5246	5182 1
+5246	5245 1
+5246	5255 1
+5246	5260 1
+5246	5392 1
+5246	5393 1
+5246	5467 1
+5246	5524 1
+5246	5543 1
+5246	5582 1
+5246	5620 1
+5246	5756 1
+5246	5827 1
+5246	5839 1
+5246	5963 1
+5246	5991 1
+5246	6029 1
+5246	6109 1
+5246	6596 1
+5246	6599 1
+5246	6832 1
+5246	6976 1
+5246	6993 1
+5246	7301 1
+5246	7620 1
+5246	8148 1
+5250	737 1
+5250	1247 1
+5250	2398 1
+5250	2764 1
+5250	2785 1
+5250	3106 1
+5250	3755 1
+5250	4098 1
+5250	4191 1
+5250	5412 1
+5250	5484 1
+5250	5539 1
+5250	5559 1
+5250	5620 1
+5247	3106 1
+5247	6737 1
+5248	3106 1
+5248	6458 1
+5249	3106 1
+5252	5253 1
+5251	5253 1
+5254	840 1
+5254	896 1
+5254	2160 1
+5254	2398 1
+5254	2689 1
+5254	3089 1
+5254	4191 1
+5254	4361 1
+5254	4536 1
+5254	4713 1
+5254	4717 1
+5254	5178 1
+5254	5321 1
+5254	5412 1
+5254	5714 1
+5254	5807 1
+5254	5822 1
+5254	5839 1
+5254	6299 1
+5254	6496 1
+5254	6566 1
+5254	6628 1
+5254	6707 1
+5254	6765 1
+5254	6832 1
+5254	6840 1
+5254	6860 1
+5254	6946 1
+5254	7144 1
+5254	7620 1
+5254	7632 1
+5254	7835 1
+5254	7890 1
+5255	2689 1
+5255	3417 1
+5255	3460 1
+5255	4448 1
+5255	4587 1
+5255	5323 1
+5255	5640 1
+5255	6255 1
+5261	1385 1
+5261	3691 1
+5262	15 1
+5262	1159 1
+5262	1473 1
+5262	2490 1
+5262	2914 1
+5262	3089 1
+5262	3191 1
+5262	3643 1
+5262	3691 1
+5262	3922 1
+5262	4211 1
+5262	4310 1
+5262	4527 1
+5262	4574 1
+5262	4625 1
+5262	4717 1
+5262	4828 1
+5262	5020 1
+5262	5123 1
+5262	5178 1
+5262	5200 1
+5262	5254 1
+5262	5301 1
+5262	5308 1
+5262	5404 1
+5262	5459 1
+5262	5482 1
+5262	5524 1
+5262	5527 1
+5262	5596 1
+5262	5680 1
+5262	5713 1
+5262	5754 1
+5262	5756 1
+5262	5809 1
+5262	5814 1
+5262	5828 1
+5262	5837 1
+5262	5848 1
+5262	5850 1
+5262	5863 1
+5262	5872 1
+5262	5936 1
+5262	5947 1
+5262	5972 1
+5262	5973 1
+5262	5977 1
+5262	5980 1
+5262	5994 1
+5262	6021 1
+5262	6041 1
+5262	6096 1
+5262	6098 1
+5262	6246 1
+5262	6262 1
+5262	6306 1
+5262	6553 1
+5262	6570 1
+5262	7707 1
+5263	15 1
+5263	896 1
+5263	1159 1
+5263	1473 1
+5263	2258 1
+5263	2277 1
+5263	2354 1
+5263	2398 1
+5263	2490 1
+5263	2507 1
+5263	2516 1
+5263	2576 1
+5263	2605 1
+5263	2765 1
+5263	2775 1
+5263	2785 1
+5263	2831 1
+5263	3027 1
+5263	3089 1
+5263	3191 1
+5263	3274 1
+5263	3393 1
+5263	3691 1
+5263	3922 1
+5263	4041 1
+5263	4098 1
+5263	4335 1
+5263	4338 1
+5263	4448 1
+5263	4527 1
+5263	4530 1
+5263	4536 1
+5263	4587 1
+5263	4600 1
+5263	4666 1
+5263	4777 1
+5263	4795 1
+5263	4797 1
+5263	4824 1
+5263	4964 1
+5263	4986 1
+5263	5182 1
+5263	5226 1
+5263	5305 1
+5263	5321 1
+5263	5445 1
+5263	5449 1
+5263	5454 1
+5263	5482 1
+5263	5499 1
+5263	5568 1
+5263	5592 1
+5263	5620 1
+5263	5637 1
+5263	5640 1
+5263	5650 1
+5263	5693 1
+5263	5705 1
+5263	5721 1
+5263	5743 1
+5263	5756 1
+5263	5784 1
+5263	5790 1
+5263	5828 1
+5263	5837 1
+5263	5844 1
+5263	5848 1
+5263	5850 1
+5263	5860 1
+5263	5863 1
+5263	5872 1
+5263	5886 1
+5263	5963 1
+5263	5973 1
+5263	5994 1
+4407	1385 1
+5265	1385 1
+5267	3460 1
+5267	4335 1
+5275	4315 1
+5275	5210 1
+5276	1498 1
+5276	4315 1
+5276	4713 1
+5276	5079 1
+5276	5614 1
+5276	6044 1
+5276	6123 1
+5276	6156 1
+5276	6833 1
+5277	4315 1
+5278	4315 1
+5280	5288 1
+5281	5288 1
+5282	3089 1
+5282	4400 1
+5282	5288 1
+5282	5449 1
+5283	2398 1
+5283	5288 1
+5287	5288 1
+5284	5288 1
+5284	5412 1
+5285	608 1
+5285	737 1
+5285	2398 1
+5285	2516 1
+5285	4191 1
+5285	4335 1
+5285	4448 1
+5285	4530 1
+5285	4536 1
+5285	4587 1
+5285	4977 1
+5285	5155 1
+5285	5189 1
+5285	5255 1
+5285	5288 1
+5285	5312 1
+5285	5452 1
+5285	5506 1
+5285	5637 1
+5285	5651 1
+5285	6765 1
+5286	2822 1
+5286	3417 1
+5286	3460 1
+5286	3910 1
+5286	5288 1
+5286	5335 1
+5286	5375 1
+5286	5415 1
+5286	5426 1
+5286	5442 1
+5289	4824 1
+5289	4980 1
+5289	5233 1
+5289	5592 1
+5289	6004 1
+5289	7092 1
+5290	4824 1
+5291	4824 1
+5294	3417 1
+5295	2398 1
+5295	2785 1
+5295	3417 1
+5295	4191 1
+5295	4400 1
+5295	4530 1
+5295	4536 1
+5295	4777 1
+5295	4977 1
+5295	5079 1
+5295	5199 1
+5295	5210 1
+5295	5321 1
+5295	5506 1
+5295	5780 1
+5295	5839 1
+5295	6599 1
+5295	7225 1
+5295	7620 1
+5295	7632 1
+5295	7809 1
+5295	7839 1
+5296	1799 1
+5296	2354 1
+5296	2822 1
+5296	3089 1
+5296	3103 1
+5296	3417 1
+5296	3554 1
+5296	3634 1
+5296	3910 1
+5296	4400 1
+5296	4712 1
+5296	4929 1
+5296	5155 1
+5296	5323 1
+5296	5680 1
+5296	5732 1
+5299	4587 1
+5300	4587 1
+5301	15 1
+5301	2276 1
+5301	2285 1
+5301	2605 1
+5301	2620 1
+5301	2940 1
+5301	3089 1
+5301	3498 1
+5301	3643 1
+5301	3873 1
+5301	4310 1
+5301	4483 1
+5301	4527 1
+5301	4574 1
+5301	4653 1
+5301	4717 1
+5301	4748 1
+5301	4875 1
+5301	4994 1
+5301	5121 1
+5301	5179 1
+5301	5188 1
+5301	5233 1
+5301	5273 1
+5301	5404 1
+5301	5454 1
+5301	5459 1
+5301	5479 1
+5301	5527 1
+5301	5596 1
+5301	5624 1
+5301	5630 1
+5301	5680 1
+5301	5753 1
+5301	5804 1
+5301	5806 1
+5301	5827 1
+5301	5897 1
+5301	6094 1
+5301	6098 1
+5301	6123 1
+5301	6124 1
+5301	6148 1
+5301	6151 1
+5301	6218 1
+5301	6229 1
+5301	6498 1
+5301	6503 1
+5301	6505 1
+5301	6599 1
+5301	6714 1
+5301	6715 1
+5301	6739 1
+5301	6789 1
+5301	6860 1
+5301	7131 1
+5301	7351 1
+5301	7373 1
+5301	7381 1
+5301	7422 1
+5301	8295 1
+5306	7092 1
+5312	737 1
+5312	2398 1
+5312	2516 1
+5312	4335 1
+5312	4653 1
+5312	4846 1
+5312	5189 1
+5312	5305 1
+5312	5568 1
+5313	1473 1
+5313	3027 1
+5313	3456 1
+5313	4191 1
+5313	4448 1
+5313	4600 1
+5313	4977 1
+5313	5155 1
+5313	5412 1
+5313	5484 1
+5313	5775 1
+5313	5780 1
+5314	4448 1
+5315	4448 1
+5316	2831 1
+5316	3089 1
+5316	3456 1
+5316	3586 1
+5316	3634 1
+5316	3643 1
+5316	4191 1
+5316	4448 1
+5316	4574 1
+5316	4709 1
+5316	4712 1
+5316	4715 1
+5316	5140 1
+5316	5387 1
+5316	5459 1
+5316	5563 1
+5316	5714 1
+5316	5844 1
+5316	6496 1
+5316	6774 1
+5316	6913 1
+5316	7021 1
+5316	7662 1
+5316	8168 1
+5317	608 1
+5317	1548 1
+5317	2398 1
+5317	2775 1
+5317	4098 1
+5317	4191 1
+5317	4448 1
+5317	4536 1
+5317	5020 1
+5317	5123 1
+5317	5254 1
+5317	5326 1
+5317	5327 1
+5317	5423 1
+5317	5459 1
+5317	5511 1
+5317	5543 1
+5317	5780 1
+5320	2909 1
+5320	3027 1
+5320	3456 1
+5320	4037 1
+5320	5028 1
+5320	5199 1
+5320	5326 1
+5320	5387 1
+5320	5514 1
+5320	5533 1
+5320	5743 1
+5321	15 1
+5321	896 1
+5321	1648 1
+5321	2398 1
+5321	2909 1
+5321	3191 1
+5321	4191 1
+5321	4335 1
+5321	5188 1
+5321	5189 1
+5321	5233 1
+5321	5254 1
+5321	5263 1
+5321	5301 1
+5321	5326 1
+5321	5327 1
+5321	5341 1
+5321	5449 1
+5321	5482 1
+5321	5484 1
+5321	5487 1
+5321	5624 1
+5321	5683 1
+5321	5693 1
+5321	5860 1
+5321	5872 1
+5321	5963 1
+5321	5973 1
+5321	5994 1
+5321	6023 1
+5321	6255 1
+5321	6632 1
+5322	2909 1
+5323	3459 1
+5323	3897 1
+5323	8295 1
+5324	608 1
+5324	2354 1
+5324	3191 1
+5324	3393 1
+5324	3456 1
+5324	4929 1
+5324	5323 1
+5324	5327 1
+5324	5392 1
+5324	5637 1
+5324	5638 1
+5324	5947 1
+5324	5973 1
+5324	5980 1
+5324	5994 1
+5324	8295 1
+5328	5327 1
+5329	5327 1
+5329	5335 1
+5330	5327 1
+5333	3460 1
+5333	3910 1
+5333	5335 1
+5332	5335 1
+5332	5412 1
+5332	5459 1
+5332	5891 1
+5332	6328 1
+5332	6833 1
+5334	2785 1
+5334	4797 1
+5334	5301 1
+5334	5335 1
+5334	5449 1
+5334	5454 1
+5334	5721 1
+5341	5254 1
+5341	7961 1
+5336	4875 1
+5336	5341 1
+5336	5412 1
+5339	3456 1
+5339	3976 1
+5339	4191 1
+5339	5123 1
+5339	5341 1
+5339	5484 1
+5339	5524 1
+5339	5683 1
+5339	6023 1
+5339	6255 1
+5337	5341 1
+5342	2354 1
+5342	2658 1
+5342	3586 1
+5342	4310 1
+5342	4632 1
+5342	5096 1
+5342	5176 1
+5342	5179 1
+5342	5459 1
+5342	5524 1
+5342	5693 1
+5342	5705 1
+5342	5721 1
+5342	5886 1
+5342	6043 1
+5342	6618 1
+5342	6913 1
+5342	6979 1
+5342	7012 1
+5342	7021 1
+5342	7063 1
+5342	7632 1
+5342	7647 1
+5342	7726 1
+5342	7778 1
+5342	7809 1
+5342	7921 1
+5342	8174 1
+5342	8209 1
+5342	8297 1
+5343	2354 1
+5343	3586 1
+5344	2354 1
+5344	3027 1
+5344	4653 1
+5345	2354 1
+5346	2354 1
+5347	2354 1
+5347	5423 1
+5348	2354 1
+5352	737 1
+5352	3460 1
+5352	5176 1
+5353	3460 1
+5355	5354 1
+4591	3910 1
+4591	4712 1
+5356	3910 1
+5357	3910 1
+5358	3910 1
+5264	3554 1
+5264	4536 1
+5264	5061 1
+5264	5176 1
+5264	5463 1
+5264	5817 1
+5264	5828 1
+5360	15 1
+5360	72 1
+5360	608 1
+5360	3027 1
+5360	4191 1
+5360	5072 1
+5360	5123 1
+5360	5392 1
+5360	5412 1
+5360	5430 1
+5360	5543 1
+5360	5559 1
+5360	6251 1
+5360	6474 1
+5360	6567 1
+5361	3191 1
+5361	3393 1
+5361	5123 1
+5361	5963 1
+5361	5980 1
+5361	5994 1
+5365	2822 1
+5366	2822 1
+5366	5459 1
+5367	2822 1
+5370	5375 1
+5371	5375 1
+5372	5375 1
+5373	5375 1
+5374	5375 1
+5376	2785 1
+5377	2785 1
+5378	2785 1
+5378	4037 1
+5378	4401 1
+5378	4507 1
+5378	5432 1
+5378	5812 1
+5378	6044 1
+5378	6737 1
+5378	6780 1
+5378	6946 1
+5378	7050 1
+5378	8042 1
+5378	8044 1
+5378	8209 1
+5378	8219 1
+5378	8224 1
+5378	8237 1
+5380	4400 1
+5380	5392 1
+5381	4400 1
+5381	5263 1
+5381	5392 1
+5381	5963 1
+5382	737 1
+5382	2258 1
+5382	2398 1
+5382	2764 1
+5382	3027 1
+5382	3103 1
+5382	3456 1
+5382	4098 1
+5382	4400 1
+5382	4666 1
+5382	4846 1
+5382	4929 1
+5382	5155 1
+5382	5182 1
+5382	5189 1
+5382	5430 1
+5382	5449 1
+5382	5509 1
+5382	5568 1
+5384	1247 1
+5384	4400 1
+5385	4400 1
+5386	3027 1
+5386	4400 1
+5386	7512 1
+5387	4400 1
+5390	5392 1
+5390	5423 1
+5391	15 1
+5391	1247 1
+5391	1549 1
+5391	1982 1
+5391	2258 1
+5391	2516 1
+5391	3027 1
+5391	3084 1
+5391	3334 1
+5391	3498 1
+5391	4530 1
+5391	4536 1
+5391	4687 1
+5391	4712 1
+5391	5178 1
+5391	5189 1
+5391	5285 1
+5391	5392 1
+5391	5449 1
+5391	5459 1
+5391	5529 1
+5391	5640 1
+5391	5683 1
+5391	5684 1
+5391	5697 1
+5391	5922 1
+5391	6218 1
+5391	6400 1
+5391	6414 1
+5391	6523 1
+5391	6624 1
+5391	6712 1
+5391	6790 1
+5391	6979 1
+5391	7040 1
+5391	7073 1
+5391	7809 1
+5395	3103 1
+5404	2398 1
+5404	2535 1
+5404	3334 1
+5404	4276 1
+5404	4310 1
+5404	4335 1
+5404	4361 1
+5404	4536 1
+5404	4846 1
+5404	4875 1
+5404	5020 1
+5404	5072 1
+5404	5189 1
+5404	5200 1
+5404	5233 1
+5404	5254 1
+5404	5412 1
+5404	5454 1
+5404	5482 1
+5404	5487 1
+5404	5527 1
+5404	5757 1
+5404	5784 1
+5404	5790 1
+5404	5902 1
+5404	6023 1
+5404	6094 1
+5404	6156 1
+5404	6255 1
+5404	6299 1
+5404	6388 1
+5404	6714 1
+5404	6715 1
+5404	6833 1
+5404	7295 1
+5404	7620 1
+5404	7646 1
+5404	7699 1
+5404	8198 1
+5404	8249 1
+5397	5412 1
+5398	5412 1
+5398	5714 1
+5405	608 1
+5405	3456 1
+5405	4977 1
+5405	5412 1
+5399	896 1
+5399	3089 1
+5399	3643 1
+5399	4041 1
+5399	4310 1
+5399	5412 1
+5399	5524 1
+5399	6029 1
+5400	4600 1
+5400	5178 1
+5400	5412 1
+5400	5683 1
+5401	5412 1
+5401	6976 1
+5401	7301 1
+5406	5412 1
+5413	5414 1
+5415	5423 1
+5416	5417 1
+5423	2376 1
+5423	2535 1
+5423	2774 1
+5423	2940 1
+5423	3479 1
+5423	3614 1
+5423	3897 1
+5423	4099 1
+5423	4361 1
+5423	4483 1
+5423	4687 1
+5423	4715 1
+5423	4786 1
+5423	4795 1
+5423	4798 1
+5423	4980 1
+5423	4994 1
+5423	5179 1
+5423	5200 1
+5423	5273 1
+5423	5584 1
+5423	5638 1
+5423	5684 1
+5423	5709 1
+5423	5798 1
+5423	5799 1
+5423	5804 1
+5423	6000 1
+5423	6006 1
+5423	6306 1
+5423	6328 1
+5423	6334 1
+5423	6337 1
+5423	6388 1
+5423	6409 1
+5423	6432 1
+5423	6441 1
+5423	6474 1
+5423	6481 1
+5423	6496 1
+5423	6530 1
+5423	6570 1
+5423	6789 1
+5423	6832 1
+5423	6953 1
+5423	7381 1
+5423	7646 1
+5423	7809 1
+5418	5423 1
+5424	5254 1
+5424	5423 1
+5419	2001 1
+5419	4534 1
+5419	4781 1
+5419	5072 1
+5419	5301 1
+5419	5423 1
+5419	5705 1
+5419	5737 1
+5419	5775 1
+5421	3456 1
+5421	4500 1
+5421	4777 1
+5421	5423 1
+5422	5423 1
+5430	3830 1
+5430	4712 1
+5430	4748 1
+5430	5254 1
+5430	6156 1
+5430	6833 1
+5427	15 1
+5427	896 1
+5427	1159 1
+5427	2001 1
+5427	2925 1
+5427	3089 1
+5427	3393 1
+5427	3586 1
+5427	3873 1
+5427	3976 1
+5427	4041 1
+5427	4098 1
+5427	4191 1
+5427	4310 1
+5427	4653 1
+5427	4828 1
+5427	4964 1
+5427	5178 1
+5427	5262 1
+5427	5321 1
+5427	5335 1
+5427	5430 1
+5427	5459 1
+5427	5524 1
+5427	5527 1
+5427	5543 1
+5427	5640 1
+5427	5844 1
+5427	5848 1
+5427	5891 1
+5427	5928 1
+5427	5947 1
+5427	6023 1
+5427	6080 1
+5427	6096 1
+5427	6105 1
+5427	8295 1
+5428	1799 1
+5428	4712 1
+5428	5430 1
+5429	5430 1
+5431	1247 1
+5432	1247 1
+5432	5378 1
+5432	6682 1
+5432	6784 1
+5435	3897 1
+5436	3027 1
+5437	2490 1
+5437	2507 1
+5437	2765 1
+5437	2925 1
+5437	3027 1
+5437	3586 1
+5437	4041 1
+5437	4527 1
+5437	4574 1
+5437	4828 1
+5437	5123 1
+5437	5182 1
+5437	5680 1
+5437	5828 1
+5437	5844 1
+5437	5848 1
+5437	5863 1
+5437	5886 1
+5437	5891 1
+5437	5925 1
+5437	5928 1
+5437	5947 1
+5437	5973 1
+5437	6009 1
+5437	6029 1
+5437	6098 1
+5438	3027 1
+5439	1982 1
+5439	2273 1
+5439	2914 1
+5439	3027 1
+5439	3459 1
+5439	3792 1
+5439	3873 1
+5439	3897 1
+5439	4401 1
+5439	4441 1
+5439	4488 1
+5439	4687 1
+5439	4748 1
+5439	4786 1
+5439	4791 1
+5439	4795 1
+5439	5002 1
+5439	5140 1
+5439	5321 1
+5439	5543 1
+5439	5563 1
+5439	5596 1
+5439	5626 1
+5439	5738 1
+5439	5739 1
+5439	5773 1
+5439	5799 1
+5439	5800 1
+5439	5818 1
+5439	5829 1
+5439	5998 1
+5439	6001 1
+5439	6006 1
+5439	6097 1
+5439	6156 1
+5439	6218 1
+5439	6255 1
+5439	6261 1
+5439	6327 1
+5439	6330 1
+5439	6388 1
+5439	6400 1
+5439	6409 1
+5439	6422 1
+5439	6424 1
+5439	6437 1
+5439	6441 1
+5439	6458 1
+5439	6462 1
+5439	6474 1
+5439	6481 1
+5439	6498 1
+5439	6530 1
+5439	6560 1
+5439	6567 1
+5439	6686 1
+5439	6707 1
+5439	6715 1
+5439	6783 1
+5439	6788 1
+5439	6790 1
+5439	6855 1
+5439	6858 1
+5439	6920 1
+5439	6930 1
+5439	7060 1
+5440	3027 1
+5440	6462 1
+5445	155 1
+5445	967 1
+5445	1026 1
+5445	1549 1
+5445	2507 1
+5445	2851 1
+5445	3000 1
+5445	3015 1
+5445	3238 1
+5445	3334 1
+5445	3381 1
+5445	3885 1
+5445	3969 1
+5445	4361 1
+5445	4875 1
+5445	4940 1
+5445	5022 1
+5445	5061 1
+5445	5079 1
+5445	5289 1
+5445	5305 1
+5445	5321 1
+5445	5437 1
+5445	5449 1
+5445	5482 1
+5445	5524 1
+5445	5643 1
+5445	5828 1
+5445	5839 1
+5445	5850 1
+5445	5891 1
+5445	5947 1
+5445	6094 1
+5445	6161 1
+5445	6555 1
+5445	6560 1
+5445	6665 1
+5445	6715 1
+5445	6914 1
+5445	6979 1
+5445	7021 1
+5445	7047 1
+5445	7059 1
+5445	7088 1
+5445	7131 1
+5445	7146 1
+5445	7277 1
+5445	7280 1
+5445	7301 1
+5445	7315 1
+5445	7359 1
+5445	7393 1
+5445	7449 1
+5445	7553 1
+5445	7620 1
+5445	7634 1
+5445	7651 1
+5445	7699 1
+5445	7707 1
+5445	7803 1
+5445	7860 1
+5445	7927 1
+5445	8038 1
+5446	155 1
+5446	967 1
+5446	3015 1
+5446	3885 1
+5446	4361 1
+5446	5200 1
+5446	5289 1
+5446	5321 1
+5446	5445 1
+5446	5449 1
+5446	5465 1
+5446	5806 1
+5446	6320 1
+5446	6914 1
+5446	7047 1
+5446	7088 1
+5446	7279 1
+5446	7478 1
+5446	7512 1
+5446	7553 1
+5446	7620 1
+5446	7699 1
+5446	7809 1
+5446	7946 1
+5446	8050 1
+5446	8174 1
+5447	5449 1
+5447	5623 1
+5448	4687 1
+5448	5233 1
+5448	5449 1
+5452	3554 1
+5452	3634 1
+5452	4335 1
+5452	4530 1
+5452	4712 1
+5452	4875 1
+5452	5037 1
+5452	5226 1
+5452	5596 1
+5452	5680 1
+5452	5739 1
+5452	5822 1
+5452	6388 1
+5452	6860 1
+5452	7073 1
+5452	7115 1
+5452	8295 1
+5454	3958 1
+5454	4191 1
+5454	4335 1
+5454	4361 1
+5454	4530 1
+5454	4712 1
+5454	4981 1
+5454	5452 1
+5454	5459 1
+5454	5563 1
+5454	5605 1
+5454	5680 1
+5454	5743 1
+5454	6634 1
+5454	6832 1
+5454	7373 1
+5454	7381 1
+5454	7908 1
+5454	7910 1
+5456	4712 1
+5456	6833 1
+5455	2398 1
+5455	3089 1
+5455	4247 1
+5455	4712 1
+5455	5155 1
+5455	5482 1
+5455	6576 1
+5455	6600 1
+5457	1799 1
+5457	2276 1
+5457	2277 1
+5457	2490 1
+5457	2774 1
+5457	3089 1
+5457	3191 1
+5457	3498 1
+5457	4041 1
+5457	4310 1
+5457	4795 1
+5457	4875 1
+5457	5262 1
+5457	5263 1
+5457	5301 1
+5457	5487 1
+5457	5564 1
+5457	5620 1
+5457	5624 1
+5457	5637 1
+5457	5638 1
+5457	5683 1
+5457	5697 1
+5457	5757 1
+5457	5760 1
+5457	5780 1
+5457	5792 1
+5457	5828 1
+5457	5891 1
+5457	5969 1
+5457	5972 1
+5457	5973 1
+5457	6021 1
+5457	6078 1
+5457	6080 1
+5457	6096 1
+5457	6098 1
+5457	6149 1
+5457	6251 1
+5457	6261 1
+5457	6302 1
+5457	6388 1
+5457	6435 1
+5457	8295 1
+5460	5463 1
+5461	5463 1
+5466	5387 1
+5466	6634 1
+5468	1548 1
+5468	1799 1
+5468	3456 1
+5468	4191 1
+5468	5484 1
+5468	5506 1
+5468	5509 1
+5468	5511 1
+5468	5513 1
+5468	5514 1
+5472	1473 1
+5472	3752 1
+5472	3962 1
+5472	4574 1
+5472	4846 1
+5472	5022 1
+5472	5028 1
+5472	5155 1
+5472	5452 1
+5472	5863 1
+5472	6123 1
+5472	6458 1
+5472	7073 1
+5472	7510 1
+5472	7809 1
+5472	7961 1
+5473	5155 1
+5474	2831 1
+5474	3554 1
+5474	4041 1
+5474	4191 1
+5474	4600 1
+5474	4653 1
+5474	5484 1
+5474	5539 1
+5475	608 1
+5475	6414 1
+5476	608 1
+5477	4929 1
+5478	737 1
+5478	3456 1
+5478	4600 1
+5478	4929 1
+5478	4964 1
+5478	5509 1
+5478	5568 1
+5478	5650 1
+5478	5886 1
+5480	4929 1
+5480	4964 1
+5480	5484 1
+5479	15 1
+5479	2490 1
+5479	2535 1
+5479	3238 1
+5479	4037 1
+5479	4276 1
+5479	4574 1
+5479	4884 1
+5479	4929 1
+5479	5148 1
+5479	5182 1
+5479	5233 1
+5479	5454 1
+5479	5529 1
+5479	5543 1
+5479	5582 1
+5479	5683 1
+5479	5693 1
+5479	5773 1
+5479	5863 1
+5479	5886 1
+5479	6560 1
+5479	6832 1
+5479	6948 1
+5479	7620 1
+5479	7632 1
+5479	7809 1
+5479	8134 1
+5482	737 1
+5482	840 1
+5482	2831 1
+5482	4600 1
+5482	4653 1
+5482	5189 1
+5482	5445 1
+5482	5828 1
+5482	5850 1
+5482	6229 1
+5482	6790 1
+5482	8212 1
+5483	4600 1
+5484	15 1
+5484	737 1
+5484	3089 1
+5484	3459 1
+5484	3586 1
+5484	3755 1
+5484	4041 1
+5484	4099 1
+5484	4310 1
+5484	4600 1
+5484	4653 1
+5484	4781 1
+5484	4980 1
+5484	5020 1
+5484	5178 1
+5484	5459 1
+5484	5563 1
+5484	5780 1
+5484	6044 1
+5484	6124 1
+5484	6790 1
+5484	7092 1
+5485	1159 1
+5485	1473 1
+5485	1548 1
+5485	3238 1
+5485	4037 1
+5485	4099 1
+5485	4310 1
+5485	4600 1
+5485	5022 1
+5485	5176 1
+5485	5178 1
+5485	5484 1
+5485	5539 1
+5485	5673 1
+5485	5886 1
+5485	6044 1
+5485	6784 1
+5485	6914 1
+5485	7092 1
+5485	7386 1
+5485	8296 1
+5486	4600 1
+5487	15 1
+5487	1026 1
+5487	2001 1
+5487	2535 1
+5487	2764 1
+5487	2831 1
+5487	3393 1
+5487	3873 1
+5487	4071 1
+5487	4335 1
+5487	4435 1
+5487	4600 1
+5487	4666 1
+5487	4846 1
+5487	4981 1
+5487	5079 1
+5487	5262 1
+5487	5445 1
+5487	5500 1
+5487	5545 1
+5487	5569 1
+5487	5570 1
+5487	5683 1
+5487	5994 1
+5487	6161 1
+5487	6166 1
+5487	6246 1
+5487	6914 1
+5487	7839 1
+5487	7924 1
+5488	4600 1
+5489	1473 1
+5489	4071 1
+5489	4600 1
+5489	5780 1
+5489	5812 1
+5489	6833 1
+5489	6869 1
+5489	7092 1
+5489	7115 1
+5489	7553 1
+5489	7890 1
+5489	8051 1
+5490	4600 1
+5491	4600 1
+5494	4977 1
+5495	2001 1
+5495	4191 1
+5495	4977 1
+5495	5737 1
+5496	4977 1
+5462	737 1
+5462	1548 1
+5462	1733 1
+5462	2398 1
+5462	2552 1
+5462	2831 1
+5462	3456 1
+5462	4631 1
+5462	4977 1
+5462	5484 1
+5462	5511 1
+5462	5513 1
+5462	5545 1
+5462	5559 1
+5462	5563 1
+5462	5592 1
+5462	5620 1
+5462	5780 1
+5462	8296 1
+5497	4977 1
+5499	2398 1
+5499	4666 1
+5499	5452 1
+5501	1548 1
+5501	5452 1
+5501	7478 1
+5500	5452 1
+5504	5301 1
+5504	5506 1
+5505	5506 1
+5507	5509 1
+5508	5509 1
+5511	4335 1
+5511	5693 1
+5511	8198 1
+5510	5511 1
+5512	3456 1
+5512	5511 1
+5515	72 1
+5515	737 1
+5515	2398 1
+5515	4098 1
+5515	4191 1
+5515	4666 1
+5515	5650 1
+5516	4191 1
+5516	5285 1
+5517	4191 1
+5518	4191 1
+5519	4191 1
+5520	3643 1
+5520	4191 1
+5521	737 1
+5521	3456 1
+5521	4191 1
+5522	4191 1
+5523	4191 1
+5524	155 1
+5524	840 1
+5524	896 1
+5524	967 1
+5524	1026 1
+5524	1191 1
+5524	1403 1
+5524	1498 1
+5524	1549 1
+5524	1972 1
+5524	1982 1
+5524	2160 1
+5524	2273 1
+5524	2433 1
+5524	2440 1
+5524	2565 1
+5524	2658 1
+5524	2774 1
+5524	2785 1
+5524	2851 1
+5524	2925 1
+5524	2940 1
+5524	3000 1
+5524	3015 1
+5524	3084 1
+5524	3089 1
+5524	3238 1
+5524	3291 1
+5524	3293 1
+5524	3310 1
+5524	3334 1
+5524	3346 1
+5524	3381 1
+5524	3459 1
+5524	3498 1
+5524	3586 1
+5524	3631 1
+5524	3634 1
+5524	3726 1
+5524	3752 1
+5524	3792 1
+5524	3803 1
+5524	3809 1
+5524	3830 1
+5524	3842 1
+5524	3873 1
+5524	3885 1
+5524	3897 1
+5524	3919 1
+5524	3962 1
+5524	4037 1
+5524	4065 1
+5524	4071 1
+5524	4099 1
+5524	4134 1
+5524	4191 1
+5524	4310 1
+5524	4341 1
+5524	4361 1
+5524	4432 1
+5524	4435 1
+5524	4483 1
+5524	4488 1
+5524	4507 1
+5524	4536 1
+5524	4604 1
+5524	4632 1
+5524	4666 1
+5524	4689 1
+5524	4709 1
+5524	4712 1
+5524	4713 1
+5524	4715 1
+5524	4717 1
+5524	4748 1
+5524	4764 1
+5524	4781 1
+5524	4798 1
+5524	4828 1
+5524	4875 1
+5524	4944 1
+5524	4980 1
+5524	4981 1
+5524	4983 1
+5524	4994 1
+5524	5002 1
+5524	5012 1
+5524	5020 1
+5524	5022 1
+5524	5028 1
+5524	5037 1
+5524	5079 1
+5524	5096 1
+5524	5121 1
+5524	5140 1
+5524	5148 1
+5524	5178 1
+5524	5179 1
+5524	5188 1
+5524	5199 1
+5524	5200 1
+5524	5210 1
+5524	5233 1
+5524	5246 1
+5524	5254 1
+5524	5262 1
+5524	5273 1
+5524	5288 1
+5524	5289 1
+5524	5295 1
+5524	5301 1
+5524	5335 1
+5524	5378 1
+5524	5384 1
+5524	5393 1
+5524	5404 1
+5524	5406 1
+5524	5423 1
+5524	5439 1
+5524	5459 1
+5524	5465 1
+5524	5466 1
+5524	5479 1
+5524	5484 1
+5524	5500 1
+5524	5527 1
+5524	5529 1
+5524	5543 1
+5524	5563 1
+5524	5582 1
+5524	5584 1
+5524	5596 1
+5524	5605 1
+5524	5614 1
+5524	5626 1
+5524	5671 1
+5524	5684 1
+5524	5697 1
+5524	5714 1
+5524	5739 1
+5524	5760 1
+5524	5773 1
+5524	5776 1
+5524	5800 1
+5524	5802 1
+5524	5804 1
+5524	5811 1
+5524	5812 1
+5524	5814 1
+5524	5818 1
+5524	5819 1
+5524	5822 1
+5524	5827 1
+5524	5829 1
+5524	5835 1
+5524	5839 1
+5524	5871 1
+5524	5872 1
+5524	5886 1
+5524	5897 1
+5524	5902 1
+5524	5922 1
+5524	5932 1
+5524	5933 1
+5524	5947 1
+5524	5998 1
+5524	6001 1
+5524	6004 1
+5524	6006 1
+5524	6032 1
+5524	6043 1
+5524	6044 1
+5524	6078 1
+5524	6097 1
+5524	6098 1
+5524	6111 1
+5524	6123 1
+5524	6124 1
+5524	6151 1
+5524	6156 1
+5524	6162 1
+5524	6166 1
+5524	6170 1
+5524	6174 1
+5524	6221 1
+5524	6227 1
+5524	6241 1
+5524	6243 1
+5524	6251 1
+5524	6270 1
+5524	6272 1
+5524	6296 1
+5524	6299 1
+5524	6305 1
+5524	6306 1
+5524	6320 1
+5524	6327 1
+5524	6328 1
+5524	6330 1
+5524	6337 1
+5524	6347 1
+5524	6388 1
+5524	6407 1
+5524	6414 1
+5524	6417 1
+5524	6422 1
+5524	6437 1
+5524	6441 1
+5524	6458 1
+5524	6481 1
+5524	6496 1
+5524	6501 1
+5524	6503 1
+5524	6505 1
+5524	6523 1
+5524	6528 1
+5524	6552 1
+5524	6554 1
+5524	6555 1
+5524	6560 1
+5524	6566 1
+5524	6570 1
+5524	6576 1
+5524	6589 1
+5524	6594 1
+5524	6600 1
+5524	6613 1
+5524	6618 1
+5524	6624 1
+5524	6632 1
+5524	6634 1
+5524	6665 1
+5524	6699 1
+5524	6712 1
+5524	6714 1
+5524	6715 1
+5524	6736 1
+5524	6765 1
+5524	6770 1
+5524	6774 1
+5524	6780 1
+5524	6784 1
+5524	6789 1
+5524	6790 1
+5524	6832 1
+5524	6833 1
+5524	6850 1
+5524	6855 1
+5524	6860 1
+5524	6869 1
+5524	6873 1
+5524	6875 1
+5524	6892 1
+5524	6897 1
+5524	6901 1
+5524	6907 1
+5524	6913 1
+5524	6914 1
+5524	6918 1
+5524	6930 1
+5524	6934 1
+5524	6945 1
+5524	6946 1
+5524	6955 1
+5524	6976 1
+5524	6979 1
+5524	6980 1
+5524	6993 1
+5524	7005 1
+5524	7012 1
+5524	7021 1
+5524	7040 1
+5524	7047 1
+5524	7050 1
+5524	7052 1
+5524	7054 1
+5524	7059 1
+5524	7063 1
+5524	7073 1
+5524	7074 1
+5524	7088 1
+5524	7092 1
+5524	7094 1
+5524	7101 1
+5524	7108 1
+5524	7115 1
+5524	7119 1
+5524	7131 1
+5524	7143 1
+5524	7162 1
+5524	7168 1
+5524	7185 1
+5524	7186 1
+5524	7214 1
+5524	7225 1
+5524	7233 1
+5524	7237 1
+5524	7277 1
+5524	7279 1
+5524	7280 1
+5524	7295 1
+5524	7301 1
+5524	7304 1
+5524	7341 1
+5524	7351 1
+5524	7362 1
+5524	7373 1
+5524	7378 1
+5524	7381 1
+5524	7386 1
+5524	7391 1
+5524	7393 1
+5524	7400 1
+5524	7414 1
+5524	7422 1
+5524	7436 1
+5524	7442 1
+5524	7443 1
+5524	7450 1
+5524	7478 1
+5524	7497 1
+5524	7510 1
+5524	7512 1
+5524	7529 1
+5524	7544 1
+5524	7553 1
+5524	7557 1
+5524	7587 1
+5524	7588 1
+5524	7618 1
+5524	7620 1
+5524	7624 1
+5524	7632 1
+5524	7646 1
+5524	7649 1
+5524	7651 1
+5524	7662 1
+5524	7683 1
+5524	7694 1
+5524	7695 1
+5524	7699 1
+5524	7707 1
+5524	7726 1
+5524	7740 1
+5524	7757 1
+5524	7763 1
+5524	7788 1
+5524	7795 1
+5524	7809 1
+5524	7810 1
+5524	7833 1
+5524	7835 1
+5524	7839 1
+5524	7855 1
+5524	7860 1
+5524	7862 1
+5524	7871 1
+5524	7874 1
+5524	7879 1
+5524	7882 1
+5524	7890 1
+5524	7899 1
+5524	7908 1
+5524	7910 1
+5524	7924 1
+5524	7927 1
+5524	7961 1
+5524	7979 1
+5524	7992 1
+5524	8037 1
+5524	8042 1
+5524	8044 1
+5524	8121 1
+5524	8122 1
+5524	8124 1
+5524	8128 1
+5524	8134 1
+5524	8141 1
+5524	8163 1
+5524	8168 1
+5524	8169 1
+5524	8174 1
+5524	8178 1
+5524	8192 1
+5524	8209 1
+5524	8219 1
+5524	8224 1
+5524	8295 1
+5524	8297 1
+5525	4191 1
+5526	737 1
+5526	2398 1
+5526	3459 1
+5526	3803 1
+5526	4191 1
+5526	5254 1
+5527	4191 1
+5527	4689 1
+5530	4191 1
+5531	15 1
+5531	72 1
+5531	155 1
+5531	737 1
+5531	840 1
+5531	896 1
+5531	1026 1
+5531	1159 1
+5531	1352 1
+5531	1403 1
+5531	1473 1
+5531	1548 1
+5531	1549 1
+5531	1823 1
+5531	1972 1
+5531	1982 1
+5531	2001 1
+5531	2160 1
+5531	2273 1
+5531	2276 1
+5531	2285 1
+5531	2433 1
+5531	2440 1
+5531	2565 1
+5531	2774 1
+5531	2914 1
+5531	2925 1
+5531	2940 1
+5531	3000 1
+5531	3015 1
+5531	3089 1
+5531	3274 1
+5531	3291 1
+5531	3393 1
+5531	3459 1
+5531	3479 1
+5531	3631 1
+5531	3634 1
+5531	3792 1
+5531	3803 1
+5531	3842 1
+5531	3873 1
+5531	3885 1
+5531	3897 1
+5531	3919 1
+5531	3969 1
+5531	3976 1
+5531	4037 1
+5531	4065 1
+5531	4099 1
+5531	4134 1
+5531	4175 1
+5531	4191 1
+5531	4310 1
+5531	4335 1
+5531	4341 1
+5531	4412 1
+5531	4441 1
+5531	4488 1
+5531	4530 1
+5531	4534 1
+5531	4536 1
+5531	4604 1
+5531	4632 1
+5531	4689 1
+5531	4709 1
+5531	4712 1
+5531	4713 1
+5531	4748 1
+5531	4764 1
+5531	4781 1
+5531	4791 1
+5531	4828 1
+5531	4875 1
+5531	4884 1
+5531	4899 1
+5531	4994 1
+5531	5002 1
+5531	5012 1
+5531	5103 1
+5531	5121 1
+5531	5123 1
+5531	5140 1
+5531	5178 1
+5531	5179 1
+5531	5188 1
+5531	5199 1
+5531	5210 1
+5531	5226 1
+5531	5233 1
+5531	5254 1
+5531	5262 1
+5531	5273 1
+5531	5288 1
+5531	5295 1
+5531	5301 1
+5531	5321 1
+5531	5335 1
+5531	5384 1
+5531	5404 1
+5531	5423 1
+5531	5437 1
+5531	5454 1
+5531	5459 1
+5531	5479 1
+5531	5487 1
+5531	5524 1
+5531	5527 1
+5531	5543 1
+5531	5563 1
+5531	5584 1
+5531	5596 1
+5531	5624 1
+5531	5637 1
+5531	5683 1
+5531	5714 1
+5531	5732 1
+5531	5739 1
+5531	5753 1
+5531	5760 1
+5531	5775 1
+5531	5776 1
+5531	5780 1
+5531	5799 1
+5531	5800 1
+5531	5802 1
+5531	5804 1
+5531	5806 1
+5531	5814 1
+5531	5818 1
+5531	5827 1
+5531	5829 1
+5531	5871 1
+5531	5886 1
+5531	5897 1
+5531	5947 1
+5531	5963 1
+5531	5994 1
+5531	6000 1
+5531	6001 1
+5531	6004 1
+5531	6006 1
+5531	6041 1
+5531	6054 1
+5531	6098 1
+5531	6124 1
+5531	6148 1
+5531	6151 1
+5531	6156 1
+5531	6170 1
+5531	6218 1
+5531	6243 1
+5531	6246 1
+5531	6251 1
+5531	6255 1
+5531	6262 1
+5531	6272 1
+5531	6296 1
+5531	6299 1
+5531	6305 1
+5531	6306 1
+5531	6327 1
+5531	6330 1
+5531	6347 1
+5531	6388 1
+5531	6400 1
+5531	6414 1
+5531	6417 1
+5531	6437 1
+5531	6441 1
+5531	6442 1
+5531	6458 1
+5531	6481 1
+5531	6496 1
+5531	6498 1
+5531	6501 1
+5531	6503 1
+5531	6505 1
+5531	6528 1
+5531	6552 1
+5531	6553 1
+5531	6560 1
+5531	6566 1
+5531	6567 1
+5531	6576 1
+5531	6589 1
+5531	6594 1
+5531	6599 1
+5531	6600 1
+5531	6613 1
+5531	6632 1
+5531	6634 1
+5531	6665 1
+5531	6699 1
+5531	6715 1
+5531	6720 1
+5531	6721 1
+5531	6723 1
+5531	6736 1
+5531	6770 1
+5531	6774 1
+5531	6777 1
+5531	6783 1
+5531	6790 1
+5531	6803 1
+5531	6832 1
+5531	6833 1
+5531	6850 1
+5531	6855 1
+5531	6860 1
+5531	6869 1
+5531	6897 1
+5531	6901 1
+5531	6907 1
+5531	6913 1
+5531	6930 1
+5531	6933 1
+5531	6946 1
+5531	7052 1
+5531	7054 1
+5531	7073 1
+5531	7088 1
+5531	7094 1
+5531	7108 1
+5531	7115 1
+5531	7143 1
+5531	7149 1
+5531	7279 1
+5531	7351 1
+5531	7373 1
+5531	7378 1
+5531	7397 1
+5531	7414 1
+5531	7422 1
+5531	7450 1
+5531	7478 1
+5531	7510 1
+5531	7512 1
+5531	7553 1
+5531	7561 1
+5531	7587 1
+5531	8295 1
+5531	8297 1
+5528	4191 1
+5528	4335 1
+5528	4500 1
+5528	4777 1
+5528	5020 1
+5528	5640 1
+5532	15 1
+5532	72 1
+5532	737 1
+5532	1352 1
+5532	1549 1
+5532	2285 1
+5532	2535 1
+5532	3291 1
+5532	3976 1
+5532	4191 1
+5532	4276 1
+5532	4335 1
+5532	5254 1
+5532	5295 1
+5532	5772 1
+5532	5780 1
+5532	6004 1
+5532	6156 1
+5532	6229 1
+5532	6302 1
+5532	6566 1
+5532	6774 1
+5532	6832 1
+5532	6833 1
+5532	6869 1
+5532	8295 1
+5534	15 1
+5534	737 1
+5534	2831 1
+5534	3643 1
+5534	3976 1
+5534	4653 1
+5534	5178 1
+5534	5459 1
+5534	5637 1
+5534	5638 1
+5534	5775 1
+5534	5882 1
+5534	5991 1
+5534	8295 1
+5535	2831 1
+5536	72 1
+5536	2831 1
+5536	5020 1
+5537	2831 1
+5193	2440 1
+5193	3376 1
+5193	3634 1
+5193	3919 1
+5193	4335 1
+5193	4712 1
+5193	4717 1
+5193	5188 1
+5193	5482 1
+5193	5539 1
+5193	5863 1
+5193	5872 1
+5193	6347 1
+5193	6498 1
+5193	6505 1
+5193	6553 1
+5193	6595 1
+5193	6806 1
+5540	1548 1
+5540	5459 1
+5540	6330 1
+5541	1548 1
+5542	3456 1
+5543	15 1
+5543	737 1
+5543	1159 1
+5543	1549 1
+5543	2276 1
+5543	2507 1
+5543	2511 1
+5543	2535 1
+5543	2565 1
+5543	2589 1
+5543	2658 1
+5543	2765 1
+5543	2774 1
+5543	2851 1
+5543	2925 1
+5543	2940 1
+5543	3015 1
+5543	3089 1
+5543	3334 1
+5543	3456 1
+5543	3459 1
+5543	3498 1
+5543	3586 1
+5543	3634 1
+5543	3643 1
+5543	3792 1
+5543	3830 1
+5543	3873 1
+5543	3962 1
+5543	4037 1
+5543	4041 1
+5543	4065 1
+5543	4134 1
+5543	4310 1
+5543	4483 1
+5543	4488 1
+5543	4527 1
+5543	4715 1
+5543	4764 1
+5543	4781 1
+5543	4828 1
+5543	4944 1
+5543	4980 1
+5543	5061 1
+5543	5079 1
+5543	5096 1
+5543	5103 1
+5543	5121 1
+5543	5123 1
+5543	5178 1
+5543	5182 1
+5543	5199 1
+5543	5200 1
+5543	5233 1
+5543	5262 1
+5543	5273 1
+5543	5295 1
+5543	5335 1
+5543	5384 1
+5543	5423 1
+5543	5437 1
+5543	5524 1
+5543	5527 1
+5543	5545 1
+5543	5563 1
+5543	5596 1
+5543	5624 1
+5543	5684 1
+5543	5697 1
+5543	5739 1
+5543	5753 1
+5543	5798 1
+5543	5800 1
+5543	5804 1
+5543	5806 1
+5543	5807 1
+5543	5818 1
+5543	5822 1
+5543	5872 1
+5543	5897 1
+5543	5925 1
+5543	5947 1
+5543	5998 1
+5543	6001 1
+5543	6029 1
+5543	6098 1
+5543	6123 1
+5543	6124 1
+5543	6148 1
+5543	6166 1
+5543	6227 1
+5543	6246 1
+5543	6251 1
+5543	6272 1
+5543	6296 1
+5543	6299 1
+5543	6305 1
+5543	6306 1
+5543	6328 1
+5543	6330 1
+5543	6337 1
+5543	6555 1
+5543	6570 1
+5543	6589 1
+5543	6594 1
+5543	6624 1
+5543	6736 1
+5543	6774 1
+5543	6784 1
+5543	6790 1
+5543	6832 1
+5543	6855 1
+5543	6860 1
+5543	6869 1
+5543	6873 1
+5543	6897 1
+5543	6901 1
+5543	6930 1
+5543	6945 1
+5543	6953 1
+5543	6955 1
+5543	6979 1
+5543	6982 1
+5543	7040 1
+5543	7063 1
+5543	7092 1
+5543	7101 1
+5543	7119 1
+5543	7131 1
+5543	7143 1
+5543	7279 1
+5543	7373 1
+5543	7414 1
+5543	7478 1
+5543	7510 1
+5543	7961 1
+5543	7979 1
+5544	3456 1
+5544	5500 1
+5544	5545 1
+5544	5559 1
+5548	5484 1
+5549	4037 1
+5549	5020 1
+5549	5178 1
+5549	5254 1
+5549	5484 1
+5549	5714 1
+5549	6156 1
+5549	6229 1
+5549	6770 1
+5549	6790 1
+5550	4037 1
+5550	4310 1
+5550	4689 1
+5550	5178 1
+5550	5484 1
+5550	5563 1
+5550	5998 1
+5550	6044 1
+5550	6946 1
+5550	7908 1
+5550	8037 1
+5551	5459 1
+5551	5484 1
+5551	5963 1
+5551	6481 1
+5551	6634 1
+5551	7391 1
+5551	7624 1
+5551	7924 1
+5554	5484 1
+5552	1473 1
+5552	3238 1
+5552	4338 1
+5552	4687 1
+5552	5484 1
+5552	5780 1
+5552	6833 1
+5552	6869 1
+5553	2258 1
+5553	2490 1
+5553	3293 1
+5553	3792 1
+5553	4037 1
+5553	4071 1
+5553	4099 1
+5553	4335 1
+5553	4338 1
+5553	4653 1
+5553	5037 1
+5553	5072 1
+5553	5096 1
+5553	5178 1
+5553	5233 1
+5553	5335 1
+5553	5484 1
+5553	5524 1
+5553	5563 1
+5553	5637 1
+5553	5693 1
+5553	5863 1
+5553	5887 1
+5553	5963 1
+5553	6004 1
+5553	6006 1
+5553	6151 1
+5553	6306 1
+5553	6496 1
+5553	6624 1
+5553	6634 1
+5553	6759 1
+5553	6780 1
+5553	6860 1
+5553	6914 1
+5553	6930 1
+5553	6979 1
+5553	7119 1
+5553	7386 1
+5553	7813 1
+5553	7908 1
+5553	7965 1
+5553	7979 1
+5553	8121 1
+5553	8124 1
+5553	8134 1
+5555	5484 1
+5558	5545 1
+5558	5559 1
+5558	5705 1
+5563	3873 1
+5563	7882 1
+5561	5563 1
+5562	2277 1
+5562	3274 1
+5562	3897 1
+5562	4335 1
+5562	4530 1
+5562	4875 1
+5562	5189 1
+5562	5404 1
+5562	5527 1
+5562	5563 1
+5562	5568 1
+5562	5683 1
+5562	6156 1
+5565	5020 1
+5565	5188 1
+5565	5189 1
+5566	5189 1
+5567	5568 1
+5569	5020 1
+5571	4666 1
+5572	4666 1
+5573	4666 1
+5577	2398 1
+5577	4098 1
+5577	4335 1
+5577	4846 1
+5577	4964 1
+5577	5592 1
+5577	5620 1
+5577	5963 1
+5576	4846 1
+5578	2764 1
+5579	2764 1
+5579	3897 1
+5580	2764 1
+5580	6924 1
+5581	2764 1
+5581	2765 1
+5582	1549 1
+5582	1972 1
+5582	2160 1
+5582	2276 1
+5582	2433 1
+5582	2764 1
+5582	2774 1
+5582	2785 1
+5582	2851 1
+5582	2925 1
+5582	3015 1
+5582	3291 1
+5582	3498 1
+5582	3631 1
+5582	3634 1
+5582	3643 1
+5582	3803 1
+5582	3830 1
+5582	4037 1
+5582	4065 1
+5582	4099 1
+5582	4310 1
+5582	4536 1
+5582	4666 1
+5582	4709 1
+5582	4713 1
+5582	4717 1
+5582	4748 1
+5582	4795 1
+5582	4944 1
+5582	4964 1
+5582	4980 1
+5582	4994 1
+5582	5002 1
+5582	5037 1
+5582	5140 1
+5582	5200 1
+5582	5288 1
+5582	5384 1
+5582	5432 1
+5582	5439 1
+5582	5479 1
+5582	5543 1
+5582	5545 1
+5582	5624 1
+5582	5626 1
+5582	5714 1
+5582	5776 1
+5582	5799 1
+5582	5802 1
+5582	5822 1
+5582	5824 1
+5582	5829 1
+5582	5922 1
+5582	5932 1
+5582	5998 1
+5582	6004 1
+5582	6006 1
+5582	6097 1
+5582	6166 1
+5582	6170 1
+5582	6218 1
+5582	6221 1
+5582	6299 1
+5582	6327 1
+5582	6328 1
+5582	6334 1
+5582	6347 1
+5582	6432 1
+5582	6437 1
+5582	6441 1
+5582	6458 1
+5582	6481 1
+5582	6496 1
+5582	6505 1
+5582	6528 1
+5582	6554 1
+5582	6566 1
+5582	6570 1
+5582	6576 1
+5582	6613 1
+5582	6624 1
+5582	6634 1
+5582	6665 1
+5582	6699 1
+5582	6715 1
+5582	6720 1
+5582	6739 1
+5582	6774 1
+5582	6783 1
+5582	6784 1
+5582	6833 1
+5582	6855 1
+5582	6913 1
+5582	6955 1
+5582	6976 1
+5582	7073 1
+5582	7108 1
+5582	7119 1
+5582	7143 1
+5582	7144 1
+5582	7214 1
+5582	7301 1
+5582	7306 1
+5582	8297 1
+5583	2764 1
+5583	2765 1
+5584	15 1
+5584	737 1
+5584	2398 1
+5584	2440 1
+5584	2620 1
+5584	2764 1
+5584	4964 1
+5584	4983 1
+5584	5254 1
+5584	5321 1
+5584	6156 1
+5584	6576 1
+5587	5588 1
+5589	15 1
+5589	896 1
+5589	3873 1
+5589	3897 1
+5589	4964 1
+5589	5233 1
+5589	5459 1
+5589	5697 1
+5589	6218 1
+5589	6246 1
+5589	6296 1
+5591	15 1
+5591	2398 1
+5591	2774 1
+5591	2775 1
+5591	2914 1
+5591	3291 1
+5591	4335 1
+5591	4687 1
+5591	5254 1
+5591	5487 1
+5591	5592 1
+5591	5684 1
+5591	5799 1
+5591	5814 1
+5591	6023 1
+5591	6218 1
+5591	6246 1
+5591	6262 1
+5591	6306 1
+5591	6334 1
+5591	6388 1
+5591	6400 1
+5591	6409 1
+5591	6414 1
+5591	6417 1
+5591	6432 1
+5591	6566 1
+5594	4098 1
+5596	3631 1
+5596	4098 1
+5596	4134 1
+5596	5103 1
+5596	5459 1
+5596	5563 1
+5596	5697 1
+5596	5738 1
+5596	5800 1
+5596	5822 1
+5596	5850 1
+5596	5871 1
+5596	5886 1
+5596	5991 1
+5596	6059 1
+5596	6078 1
+5596	6407 1
+5596	6496 1
+5596	6543 1
+5596	6668 1
+5596	6685 1
+5596	6723 1
+5596	6725 1
+5596	6783 1
+5596	6813 1
+5596	7052 1
+5596	7108 1
+5596	7359 1
+5596	7520 1
+5596	8295 1
+5595	4098 1
+5598	4247 1
+5599	4247 1
+5600	1473 1
+5600	2258 1
+5600	2535 1
+5600	3897 1
+5600	4099 1
+5600	4247 1
+5600	4500 1
+5600	6029 1
+5601	2398 1
+5601	4247 1
+5602	4247 1
+5603	4247 1
+5603	4500 1
+5603	4797 1
+5604	2398 1
+5604	5226 1
+5604	5623 1
+5604	5871 1
+5604	6305 1
+5604	6765 1
+5604	6945 1
+5605	15 1
+5605	2398 1
+5605	3334 1
+5605	4536 1
+5605	4981 1
+5605	5028 1
+5605	5037 1
+5605	6840 1
+5605	7632 1
+5605	7862 1
+5605	7908 1
+5606	737 1
+5606	1473 1
+5606	1648 1
+5606	2398 1
+5606	2576 1
+5606	2605 1
+5606	4335 1
+5606	4534 1
+5606	4574 1
+5606	4899 1
+5606	5061 1
+5606	5072 1
+5606	5321 1
+5606	5445 1
+5606	5459 1
+5606	5680 1
+5606	5683 1
+5606	5745 1
+5606	5775 1
+5606	5780 1
+5606	5828 1
+5606	5830 1
+5606	5832 1
+5606	5837 1
+5606	5844 1
+5606	5848 1
+5606	5872 1
+5606	5969 1
+5607	2398 1
+5608	2398 1
+5608	2516 1
+5608	2535 1
+5608	3755 1
+5608	3897 1
+5608	4099 1
+5608	4795 1
+5608	4986 1
+5608	5301 1
+5608	5335 1
+5608	5638 1
+5608	5651 1
+5608	5664 1
+5608	5683 1
+5608	6124 1
+5608	6783 1
+5612	15 1
+5612	737 1
+5612	1549 1
+5612	1982 1
+5612	2160 1
+5612	2276 1
+5612	2398 1
+5612	2440 1
+5612	2535 1
+5612	2620 1
+5612	2775 1
+5612	3084 1
+5612	3291 1
+5612	3297 1
+5612	3459 1
+5612	3634 1
+5612	3643 1
+5612	3958 1
+5612	3962 1
+5612	4099 1
+5612	4134 1
+5612	4276 1
+5612	4530 1
+5612	4536 1
+5612	4687 1
+5612	4798 1
+5612	4828 1
+5612	4986 1
+5612	5002 1
+5612	5022 1
+5612	5179 1
+5612	5226 1
+5612	5233 1
+5612	5254 1
+5612	5295 1
+5612	5335 1
+5612	5404 1
+5612	5524 1
+5612	5584 1
+5612	5680 1
+5612	5693 1
+5612	5697 1
+5612	5757 1
+5612	5828 1
+5612	5848 1
+5612	5863 1
+5612	6006 1
+5612	6098 1
+5612	6148 1
+5612	6170 1
+5612	6328 1
+5612	6337 1
+5612	6441 1
+5612	6528 1
+5612	6553 1
+5612	6560 1
+5612	6600 1
+5612	6715 1
+5612	6720 1
+5612	6739 1
+5612	6948 1
+5612	6979 1
+5612	7683 1
+5612	7961 1
+5612	8178 1
+5612	8295 1
+5609	2398 1
+5610	15 1
+5610	2398 1
+5611	2398 1
+5613	2398 1
+5614	2398 1
+5614	3293 1
+5614	4037 1
+5614	4335 1
+5614	4940 1
+5614	6780 1
+5614	7924 1
+5615	2398 1
+5615	4037 1
+5615	7908 1
+5616	1403 1
+5616	1473 1
+5616	2398 1
+5616	2775 1
+5616	4037 1
+5616	4338 1
+5616	4712 1
+5616	5254 1
+5616	5404 1
+5616	5732 1
+5616	5760 1
+5616	6229 1
+5616	6560 1
+5616	7108 1
+5616	7214 1
+5617	15 1
+5617	72 1
+5617	1026 1
+5617	2398 1
+5617	2565 1
+5617	3459 1
+5617	3755 1
+5617	3976 1
+5617	4781 1
+5617	5020 1
+5617	5022 1
+5617	5176 1
+5617	5233 1
+5617	5772 1
+5617	5780 1
+5617	5800 1
+5617	6044 1
+5617	6110 1
+5617	6246 1
+5617	6595 1
+5617	7553 1
+5617	7632 1
+5620	737 1
+5620	3346 1
+5620	3459 1
+5620	3755 1
+5620	5459 1
+5620	7092 1
+5620	7688 1
+5623	4335 1
+5623	4653 1
+5622	4777 1
+5622	5623 1
+5396	3089 1
+5396	3755 1
+5396	4500 1
+5396	4536 1
+5396	4625 1
+5396	4777 1
+5396	5200 1
+5396	5301 1
+5396	5623 1
+5396	5680 1
+5396	5838 1
+5396	5947 1
+5627	4777 1
+5627	5321 1
+5627	5454 1
+5624	15 1
+5624	896 1
+5624	1159 1
+5624	2440 1
+5624	2507 1
+5624	3191 1
+5624	3293 1
+5624	3586 1
+5624	3922 1
+5624	4625 1
+5624	4717 1
+5624	5321 1
+5624	5445 1
+5624	5527 1
+5624	5626 1
+5624	5713 1
+5624	5778 1
+5624	5782 1
+5624	5809 1
+5624	5848 1
+5624	5928 1
+5624	5994 1
+5624	6027 1
+5624	6044 1
+5624	6098 1
+5624	6148 1
+5624	6600 1
+5624	8295 1
+5625	5321 1
+5626	4335 1
+5626	4798 1
+5626	5072 1
+5626	5321 1
+5628	5321 1
+5629	5321 1
+5630	15 1
+5630	2516 1
+5630	3015 1
+5630	3498 1
+5630	4653 1
+5630	4712 1
+5630	4748 1
+5630	4781 1
+5630	5121 1
+5630	5178 1
+5630	5254 1
+5630	5262 1
+5630	5263 1
+5630	5543 1
+5630	5563 1
+5630	5739 1
+5630	5760 1
+5630	5824 1
+5630	6161 1
+5630	6164 1
+5630	6166 1
+5630	6221 1
+5630	6235 1
+5630	6246 1
+5630	6251 1
+5630	6255 1
+5630	6269 1
+5630	6278 1
+5630	6306 1
+5630	6441 1
+5630	6505 1
+5630	6665 1
+5630	6860 1
+5630	6901 1
+5630	6930 1
+5630	7131 1
+5633	3393 1
+5640	3976 1
+5640	5963 1
+5639	2258 1
+5639	4335 1
+5639	5454 1
+5639	5640 1
+5644	15 1
+5644	896 1
+5644	2273 1
+5644	2516 1
+5644	3976 1
+5644	4276 1
+5644	4335 1
+5644	4795 1
+5644	5233 1
+5644	5335 1
+5644	5439 1
+5644	5524 1
+5644	5543 1
+5644	5863 1
+5644	5936 1
+5644	6251 1
+5644	6255 1
+5644	6262 1
+5644	6306 1
+5644	6417 1
+5644	8295 1
+5636	4777 1
+5645	4777 1
+5646	5639 1
+5646	6953 1
+5650	1191 1
+5650	6088 1
+5648	5650 1
+5649	5650 1
+5649	5683 1
+5651	5061 1
+5652	4500 1
+5653	4500 1
+5655	938 1
+5655	2160 1
+5655	2276 1
+5655	2511 1
+5655	3084 1
+5655	3089 1
+5655	3334 1
+5655	3586 1
+5655	3643 1
+5655	3976 1
+5655	4009 1
+5655	4310 1
+5655	4361 1
+5655	4507 1
+5655	4653 1
+5655	4712 1
+5655	4717 1
+5655	4786 1
+5655	4791 1
+5655	5002 1
+5655	5012 1
+5655	5103 1
+5655	5179 1
+5655	5199 1
+5655	5200 1
+5655	5254 1
+5655	5273 1
+5655	5289 1
+5655	5295 1
+5655	5393 1
+5655	5543 1
+5655	5684 1
+5655	5697 1
+5655	5709 1
+5655	5714 1
+5655	5738 1
+5655	5806 1
+5655	5822 1
+5655	5829 1
+5655	5844 1
+5655	5863 1
+5655	5887 1
+5655	5932 1
+5655	5950 1
+5655	5972 1
+5655	6004 1
+5655	6032 1
+5655	6105 1
+5655	6124 1
+5655	6149 1
+5655	6156 1
+5655	6161 1
+5655	6198 1
+5655	6226 1
+5655	6235 1
+5655	6269 1
+5655	6299 1
+5655	6302 1
+5655	6327 1
+5655	6340 1
+5655	6407 1
+5655	6424 1
+5655	6462 1
+5655	6464 1
+5655	6491 1
+5655	6505 1
+5655	6523 1
+5655	6530 1
+5655	6555 1
+5655	6567 1
+5655	6590 1
+5655	6699 1
+5655	6725 1
+5655	6736 1
+5655	6755 1
+5655	6790 1
+5655	6809 1
+5655	6832 1
+5655	6833 1
+5655	6923 1
+5655	6976 1
+5655	6994 1
+5655	7047 1
+5655	7050 1
+5655	7063 1
+5655	7116 1
+5655	7146 1
+5655	7214 1
+5655	7222 1
+5655	7237 1
+5655	7243 1
+5655	7246 1
+5655	7254 1
+5655	7257 1
+5655	7262 1
+5655	7273 1
+5655	7279 1
+5655	7289 1
+5655	7304 1
+5655	7306 1
+5655	7315 1
+5655	7316 1
+5655	7359 1
+5655	7362 1
+5655	7373 1
+5655	7378 1
+5655	7386 1
+5655	7440 1
+5655	7498 1
+5655	7510 1
+5655	7529 1
+5655	7534 1
+5655	7544 1
+5655	7557 1
+5655	7588 1
+5655	7620 1
+5655	7632 1
+5655	7642 1
+5655	7648 1
+5655	7653 1
+5655	7666 1
+5655	7668 1
+5655	7669 1
+5655	7673 1
+5655	7675 1
+5655	7688 1
+5655	7695 1
+5655	7730 1
+5655	7734 1
+5655	7763 1
+5655	7839 1
+5655	7994 1
+5655	8079 1
+5655	8121 1
+5655	8132 1
+5655	8169 1
+5655	8224 1
+5655	8225 1
+5655	8249 1
+5656	2276 1
+5656	4653 1
+5656	5838 1
+5656	6826 1
+5656	7359 1
+5657	4653 1
+5657	5254 1
+5658	4335 1
+5658	4653 1
+5658	5233 1
+5658	5812 1
+5658	5936 1
+5658	6029 1
+5658	6334 1
+5658	6980 1
+5658	7699 1
+5658	7726 1
+5659	4653 1
+5660	4653 1
+5660	5799 1
+5661	4530 1
+5661	4653 1
+5661	5683 1
+5662	5182 1
+5662	5663 1
+5662	5886 1
+5662	5963 1
+5668	4335 1
+5668	5178 1
+5668	5404 1
+5668	5963 1
+5647	2576 1
+5647	3976 1
+5647	4335 1
+5647	5123 1
+5647	5285 1
+5647	5301 1
+5647	5683 1
+5647	5706 1
+5666	15 1
+5666	72 1
+5666	4335 1
+5666	6004 1
+5666	6560 1
+5667	4335 1
+5667	4507 1
+5667	5969 1
+5667	8124 1
+5667	8128 1
+5669	4335 1
+5670	4099 1
+5670	4335 1
+5671	3770 1
+5671	4335 1
+5671	6979 1
+5674	4986 1
+5675	72 1
+5675	1733 1
+5675	3958 1
+5675	4530 1
+5675	4574 1
+5675	4986 1
+5675	5072 1
+5675	5459 1
+5676	3755 1
+5678	5679 1
+5680	3089 1
+5680	4530 1
+5680	4795 1
+5680	5694 1
+5682	5683 1
+5684	2258 1
+5684	2276 1
+5684	3089 1
+5684	3191 1
+5684	3976 1
+5684	4175 1
+5684	4338 1
+5684	4483 1
+5684	5072 1
+5684	5176 1
+5684	5182 1
+5684	5524 1
+5684	5743 1
+5684	5798 1
+5684	5936 1
+5684	5947 1
+5684	6306 1
+5684	6328 1
+5686	3962 1
+5686	4099 1
+5686	8198 1
+5685	4099 1
+5687	4099 1
+5688	4099 1
+5689	5693 1
+5690	5693 1
+5691	15 1
+5691	72 1
+5691	1648 1
+5691	1733 1
+5691	2001 1
+5691	2490 1
+5691	2775 1
+5691	3015 1
+5691	3089 1
+5691	3191 1
+5691	3459 1
+5691	3643 1
+5691	3922 1
+5691	4211 1
+5691	4483 1
+5691	4534 1
+5691	4797 1
+5691	5020 1
+5691	5061 1
+5691	5123 1
+5691	5263 1
+5691	5301 1
+5691	5437 1
+5691	5445 1
+5691	5457 1
+5691	5482 1
+5691	5527 1
+5691	5693 1
+5691	5743 1
+5691	5753 1
+5691	5780 1
+5691	5784 1
+5691	5790 1
+5691	5828 1
+5691	5830 1
+5691	5837 1
+5691	5844 1
+5691	5848 1
+5691	5860 1
+5691	5863 1
+5691	5872 1
+5691	5886 1
+5691	5891 1
+5691	6124 1
+5691	6148 1
+5691	6151 1
+5691	6255 1
+5691	6571 1
+5691	8295 1
+5692	1549 1
+5692	3803 1
+5692	4338 1
+5692	4536 1
+5692	5288 1
+5692	5693 1
+5692	5773 1
+5692	5922 1
+5692	5998 1
+5692	6299 1
+5692	6327 1
+5692	6560 1
+5692	6624 1
+5692	6634 1
+5692	6661 1
+5692	6765 1
+5692	6784 1
+5692	6855 1
+5692	6892 1
+5692	6913 1
+5692	7143 1
+5695	72 1
+5698	72 1
+5696	15 1
+5696	72 1
+5696	1972 1
+5696	2535 1
+5696	2774 1
+5696	2914 1
+5696	3291 1
+5696	3479 1
+5696	3873 1
+5696	4099 1
+5696	4604 1
+5696	4712 1
+5696	4715 1
+5696	4781 1
+5696	4980 1
+5696	4994 1
+5696	5002 1
+5696	5121 1
+5696	5178 1
+5696	5200 1
+5696	5233 1
+5696	5254 1
+5696	5437 1
+5696	5439 1
+5696	5479 1
+5696	5487 1
+5696	5527 1
+5696	5624 1
+5696	5626 1
+5696	5804 1
+5696	5824 1
+5696	6004 1
+5696	6124 1
+5696	6161 1
+5696	6229 1
+5696	6255 1
+5696	6299 1
+5696	6306 1
+5696	6432 1
+5696	6441 1
+5696	6458 1
+5696	6496 1
+5696	6599 1
+5696	6613 1
+5696	6634 1
+5696	6665 1
+5696	6700 1
+5696	6720 1
+5696	6739 1
+5696	8295 1
+5697	72 1
+5697	1026 1
+5697	1352 1
+5697	1549 1
+5697	1648 1
+5697	1972 1
+5697	1982 1
+5697	2160 1
+5697	2273 1
+5697	2433 1
+5697	2440 1
+5697	2490 1
+5697	2507 1
+5697	2565 1
+5697	2620 1
+5697	2774 1
+5697	2785 1
+5697	3084 1
+5697	3089 1
+5697	3191 1
+5697	3334 1
+5697	3459 1
+5697	3479 1
+5697	3498 1
+5697	3586 1
+5697	3614 1
+5697	3631 1
+5697	3634 1
+5697	3792 1
+5697	3803 1
+5697	3830 1
+5697	3842 1
+5697	3873 1
+5697	3897 1
+5697	3919 1
+5697	3976 1
+5697	4037 1
+5697	4065 1
+5697	4099 1
+5697	4134 1
+5697	4175 1
+5697	4338 1
+5697	4401 1
+5697	4412 1
+5697	4483 1
+5697	4488 1
+5697	4527 1
+5697	4536 1
+5697	4574 1
+5697	4604 1
+5697	4666 1
+5697	4687 1
+5697	4689 1
+5697	4709 1
+5697	4712 1
+5697	4713 1
+5697	4717 1
+5697	4748 1
+5697	4764 1
+5697	4791 1
+5697	4795 1
+5697	4798 1
+5697	4944 1
+5697	4980 1
+5697	4994 1
+5697	5002 1
+5697	5022 1
+5697	5037 1
+5697	5072 1
+5697	5079 1
+5697	5123 1
+5697	5176 1
+5697	5178 1
+5697	5182 1
+5697	5188 1
+5697	5199 1
+5697	5200 1
+5697	5210 1
+5697	5226 1
+5697	5233 1
+5697	5254 1
+5697	5262 1
+5697	5273 1
+5697	5288 1
+5697	5295 1
+5697	5301 1
+5697	5321 1
+5697	5423 1
+5697	5439 1
+5697	5457 1
+5697	5479 1
+5697	5484 1
+5697	5524 1
+5697	5543 1
+5697	5563 1
+5697	5584 1
+5697	5596 1
+5697	5605 1
+5697	5620 1
+5697	5626 1
+5697	5638 1
+5697	5684 1
+5697	5714 1
+5697	5738 1
+5697	5739 1
+5697	5743 1
+5697	5773 1
+5697	5776 1
+5697	5798 1
+5697	5799 1
+5697	5800 1
+5697	5802 1
+5697	5804 1
+5697	5807 1
+5697	5814 1
+5697	5818 1
+5697	5819 1
+5697	5822 1
+5697	5827 1
+5697	5828 1
+5697	5829 1
+5697	5837 1
+5697	5844 1
+5697	5848 1
+5697	5860 1
+5697	5863 1
+5697	5871 1
+5697	5872 1
+5697	5886 1
+5697	5891 1
+5697	5925 1
+5697	5926 1
+5697	5928 1
+5697	5932 1
+5697	5947 1
+5697	5963 1
+5697	5969 1
+5697	5991 1
+5697	5994 1
+5697	5998 1
+5697	6001 1
+5697	6006 1
+5697	6021 1
+5697	6156 1
+5697	6170 1
+5697	6218 1
+5697	6221 1
+5697	6227 1
+5697	6246 1
+5697	6251 1
+5697	6255 1
+5697	6262 1
+5697	6270 1
+5697	6272 1
+5697	6296 1
+5697	6302 1
+5697	6305 1
+5697	6306 1
+5697	6311 1
+5697	6323 1
+5697	6327 1
+5697	6328 1
+5697	6330 1
+5697	6334 1
+5697	6337 1
+5697	6347 1
+5697	6400 1
+5697	6417 1
+5697	6432 1
+5697	6437 1
+5697	6441 1
+5697	6458 1
+5697	6474 1
+5697	6481 1
+5697	6496 1
+5697	6501 1
+5697	6505 1
+5697	6511 1
+5697	6523 1
+5697	6528 1
+5697	6532 1
+5697	6552 1
+5697	6554 1
+5697	6560 1
+5697	6570 1
+5697	6576 1
+5697	6595 1
+5697	6613 1
+5697	6624 1
+5697	6632 1
+5697	6634 1
+5697	6663 1
+5697	6665 1
+5697	6668 1
+5697	6699 1
+5697	6707 1
+5697	6715 1
+5697	6739 1
+5697	6765 1
+5697	6770 1
+5697	6774 1
+5697	6783 1
+5697	6790 1
+5697	6803 1
+5697	6855 1
+5697	6860 1
+5697	6869 1
+5697	6873 1
+5697	6897 1
+5697	6901 1
+5697	6930 1
+5697	6955 1
+5697	6979 1
+5697	6994 1
+5697	7052 1
+5697	7094 1
+5697	7101 1
+5697	7115 1
+5697	7119 1
+5697	7144 1
+5697	7185 1
+5697	7214 1
+5697	7362 1
+5697	7393 1
+5697	7553 1
+5697	7620 1
+5697	7810 1
+5697	7908 1
+5697	8121 1
+5697	8124 1
+5702	967 1
+5702	3238 1
+5702	3634 1
+5702	3726 1
+5702	5028 1
+5702	5210 1
+5702	5454 1
+5702	5897 1
+5702	5963 1
+5702	7855 1
+5703	5454 1
+5705	5301 1
+5705	5947 1
+5705	6021 1
+5704	3089 1
+5704	4828 1
+5704	5705 1
+5704	6226 1
+5708	3191 1
+5708	4483 1
+5708	5254 1
+5708	5459 1
+5708	5524 1
+5708	5697 1
+5708	8042 1
+5707	5123 1
+5707	5459 1
+5707	5891 1
+5707	5925 1
+5709	3919 1
+5709	5140 1
+5709	5459 1
+5709	5799 1
+5709	5811 1
+5709	5950 1
+5709	6427 1
+5709	6472 1
+5709	6529 1
+5709	6566 1
+5709	6707 1
+5710	5459 1
+5711	5459 1
+5712	5459 1
+5713	5459 1
+5714	15 1
+5714	896 1
+5714	1352 1
+5714	1473 1
+5714	1549 1
+5714	2576 1
+5714	2774 1
+5714	2851 1
+5714	3334 1
+5714	3586 1
+5714	3643 1
+5714	3792 1
+5714	3897 1
+5714	4041 1
+5714	4099 1
+5714	4175 1
+5714	4687 1
+5714	4715 1
+5714	4981 1
+5714	5072 1
+5714	5200 1
+5714	5226 1
+5714	5459 1
+5714	5543 1
+5714	5684 1
+5714	5743 1
+5714	5760 1
+5714	5798 1
+5714	5799 1
+5714	5804 1
+5714	5818 1
+5714	5828 1
+5714	6124 1
+5714	6156 1
+5714	6229 1
+5714	6328 1
+5714	6337 1
+5714	6437 1
+5714	6458 1
+5714	6481 1
+5714	6833 1
+5714	6930 1
+5714	7115 1
+5714	7168 1
+5717	2576 1
+5718	3274 1
+5721	840 1
+5721	3873 1
+5721	4037 1
+5721	5262 1
+5721	5776 1
+5721	6414 1
+5721	7115 1
+5721	7119 1
+5721	7143 1
+5721	7144 1
+5720	5263 1
+5720	5721 1
+5720	6783 1
+5722	5263 1
+5722	5721 1
+5722	5737 1
+5729	5732 1
+5730	5732 1
+5731	5732 1
+5731	6528 1
+5733	2001 1
+5735	5737 1
+5738	840 1
+5738	4536 1
+5738	5022 1
+5738	5263 1
+5738	5822 1
+5738	6624 1
+5738	6774 1
+5738	6875 1
+5738	7040 1
+5738	7391 1
+5738	7740 1
+5738	8163 1
+5738	8168 1
+5738	8192 1
+5739	2273 1
+5739	2440 1
+5739	2507 1
+5739	2765 1
+5739	3015 1
+5739	3459 1
+5739	3643 1
+5739	3792 1
+5739	3897 1
+5739	3919 1
+5739	3976 1
+5739	4748 1
+5739	4828 1
+5739	4875 1
+5739	5210 1
+5739	5254 1
+5739	5262 1
+5739	5263 1
+5739	5524 1
+5739	5527 1
+5739	5543 1
+5739	5563 1
+5739	5800 1
+5739	5802 1
+5739	5829 1
+5739	5848 1
+5739	5871 1
+5739	5872 1
+5739	5947 1
+5739	6023 1
+5739	6162 1
+5739	6328 1
+5739	6424 1
+5739	6435 1
+5739	6554 1
+5739	6624 1
+5739	6686 1
+5739	6765 1
+5739	6774 1
+5739	6777 1
+5739	6833 1
+5739	6869 1
+5739	6892 1
+5739	6901 1
+5739	6934 1
+5741	15 1
+5741	1982 1
+5741	5020 1
+5741	5254 1
+5741	5301 1
+5741	5321 1
+5741	5543 1
+5741	5743 1
+5741	5936 1
+5741	6618 1
+5741	7295 1
+5741	7620 1
+5741	8224 1
+4418	5745 1
+5744	5745 1
+5746	4338 1
+5750	15 1
+5750	4338 1
+5750	5415 1
+5750	5437 1
+5747	4338 1
+5747	5799 1
+5748	4338 1
+5749	4338 1
+5749	5457 1
+5751	5072 1
+5752	5072 1
+5753	4712 1
+5753	5072 1
+5753	6528 1
+5753	6554 1
+5755	5756 1
+5757	6218 1
+5760	4310 1
+5760	6299 1
+5760	6832 1
+5761	1733 1
+5761	3334 1
+5761	5226 1
+5761	5305 1
+5761	5780 1
+5761	5784 1
+5761	5800 1
+5761	6736 1
+5761	7279 1
+5763	1473 1
+5763	4041 1
+5763	5775 1
+5763	6699 1
+5764	1473 1
+5765	1473 1
+5766	5767 1
+5768	15 1
+5768	4534 1
+5768	4791 1
+5768	5178 1
+5768	5262 1
+5768	5415 1
+5768	6251 1
+5768	6576 1
+5768	6599 1
+5768	7391 1
+5768	7620 1
+5768	8178 1
+5768	8295 1
+5769	5123 1
+5769	5226 1
+5769	6299 1
+5769	6634 1
+5770	3586 1
+5770	5178 1
+5770	5226 1
+5770	5784 1
+5770	5891 1
+5770	5963 1
+5775	1191 1
+5775	2785 1
+5775	3297 1
+5775	3334 1
+5775	3459 1
+5775	3631 1
+5775	3752 1
+5775	4037 1
+5775	4071 1
+5775	4435 1
+5775	4709 1
+5775	5012 1
+5775	5079 1
+5775	5288 1
+5775	5529 1
+5775	5773 1
+5775	5800 1
+5775	5902 1
+5775	6270 1
+5775	6347 1
+5775	6458 1
+5775	6914 1
+5775	6934 1
+5775	6946 1
+5775	7115 1
+5775	7277 1
+5775	7378 1
+5775	7510 1
+5775	7632 1
+5775	7813 1
+5775	7835 1
+5775	7855 1
+5775	7862 1
+5775	7871 1
+5775	7874 1
+5775	7882 1
+5775	7890 1
+5775	7912 1
+5775	7927 1
+5775	7979 1
+5775	7992 1
+5775	8122 1
+5771	3459 1
+5771	4632 1
+5771	5760 1
+5771	5773 1
+5771	5775 1
+5771	6634 1
+5771	7054 1
+5771	8141 1
+5771	8178 1
+5772	1493 1
+5772	3459 1
+5772	4536 1
+5772	5020 1
+5772	5288 1
+5772	5775 1
+5772	5800 1
+5772	5811 1
+5772	5829 1
+5772	6001 1
+5772	6004 1
+5772	6299 1
+5772	6560 1
+5772	6890 1
+5772	7168 1
+5773	840 1
+5773	1982 1
+5773	2511 1
+5773	2565 1
+5773	2589 1
+5773	3238 1
+5773	3334 1
+5773	3459 1
+5773	3803 1
+5773	4037 1
+5773	4361 1
+5773	4944 1
+5773	4992 1
+5773	5002 1
+5773	5079 1
+5773	5288 1
+5773	5295 1
+5773	5384 1
+5773	5643 1
+5773	5745 1
+5773	5760 1
+5773	5772 1
+5773	5775 1
+5773	5800 1
+5773	5811 1
+5773	5814 1
+5773	5828 1
+5773	5922 1
+5773	5932 1
+5773	6000 1
+5773	6097 1
+5773	6227 1
+5773	6272 1
+5773	6327 1
+5773	6330 1
+5773	6388 1
+5773	6414 1
+5773	6555 1
+5773	6560 1
+5773	6624 1
+5773	6634 1
+5773	6774 1
+5773	6850 1
+5773	6855 1
+5773	6873 1
+5773	6913 1
+5773	6914 1
+5773	6934 1
+5773	6955 1
+5773	6976 1
+5773	6982 1
+5773	7021 1
+5773	7040 1
+5773	7047 1
+5773	7059 1
+5773	7092 1
+5773	7094 1
+5773	7101 1
+5773	7119 1
+5773	7120 1
+5773	7143 1
+5773	7144 1
+5773	7162 1
+5773	7185 1
+5773	7315 1
+5773	7414 1
+5773	7436 1
+5773	7593 1
+5773	7632 1
+5773	7662 1
+5773	7668 1
+5773	7839 1
+5773	7855 1
+5773	7890 1
+5773	7924 1
+5774	5775 1
+5776	4899 1
+5776	4992 1
+5776	5872 1
+5776	5998 1
+5776	6023 1
+5776	6262 1
+5776	6306 1
+5776	7149 1
+5776	7237 1
+5776	7391 1
+5776	7529 1
+5776	7553 1
+5776	7701 1
+5776	8295 1
+5781	5445 1
+5784	5925 1
+5783	15 1
+5783	2775 1
+5783	3089 1
+5783	3191 1
+5783	4041 1
+5783	4310 1
+5783	4527 1
+5783	4574 1
+5783	5061 1
+5783	5178 1
+5783	5404 1
+5783	5457 1
+5783	5543 1
+5783	5784 1
+5783	5844 1
+5783	5848 1
+5783	5863 1
+5783	5928 1
+5783	5936 1
+5783	5994 1
+5783	6124 1
+5783	6148 1
+5783	6255 1
+5785	2775 1
+5785	5061 1
+5786	2775 1
+5787	15 1
+5787	896 1
+5787	1159 1
+5787	1648 1
+5787	2276 1
+5787	2775 1
+5787	2925 1
+5787	3089 1
+5787	3498 1
+5787	4041 1
+5787	4276 1
+5787	4310 1
+5787	4781 1
+5787	4828 1
+5787	4875 1
+5787	5103 1
+5787	5179 1
+5787	5182 1
+5787	5301 1
+5787	5524 1
+5787	5527 1
+5787	5543 1
+5787	5624 1
+5787	5753 1
+5787	5928 1
+5787	5947 1
+5787	5963 1
+5787	5972 1
+5787	6098 1
+5787	6124 1
+5787	6166 1
+5787	6229 1
+5790	7699 1
+5788	5790 1
+5788	5802 1
+5788	6023 1
+5788	6447 1
+5788	6715 1
+5789	5790 1
+5794	4625 1
+5796	15 1
+5796	896 1
+5796	1026 1
+5796	1074 1
+5796	1159 1
+5796	1498 1
+5796	1549 1
+5796	1982 1
+5796	2160 1
+5796	2276 1
+5796	2440 1
+5796	2535 1
+5796	2565 1
+5796	2658 1
+5796	2774 1
+5796	2851 1
+5796	2925 1
+5796	2940 1
+5796	3015 1
+5796	3084 1
+5796	3089 1
+5796	3238 1
+5796	3291 1
+5796	3334 1
+5796	3459 1
+5796	3498 1
+5796	3586 1
+5796	3614 1
+5796	3634 1
+5796	3643 1
+5796	3792 1
+5796	3803 1
+5796	3830 1
+5796	3842 1
+5796	3897 1
+5796	4037 1
+5796	4041 1
+5796	4065 1
+5796	4099 1
+5796	4134 1
+5796	4310 1
+5796	4361 1
+5796	4483 1
+5796	4488 1
+5796	4527 1
+5796	4536 1
+5796	4604 1
+5796	4689 1
+5796	4709 1
+5796	4712 1
+5796	4715 1
+5796	4717 1
+5796	4748 1
+5796	4764 1
+5796	4795 1
+5796	4828 1
+5796	4875 1
+5796	4981 1
+5796	4983 1
+5796	4994 1
+5796	5002 1
+5796	5022 1
+5796	5028 1
+5796	5037 1
+5796	5103 1
+5796	5121 1
+5796	5140 1
+5796	5178 1
+5796	5179 1
+5796	5200 1
+5796	5210 1
+5796	5246 1
+5796	5254 1
+5796	5262 1
+5796	5273 1
+5796	5288 1
+5796	5295 1
+5796	5298 1
+5796	5321 1
+5796	5404 1
+5796	5465 1
+5796	5484 1
+5796	5524 1
+5796	5543 1
+5796	5563 1
+5796	5584 1
+5796	5596 1
+5796	5605 1
+5796	5655 1
+5796	5684 1
+5796	5714 1
+5796	5739 1
+5796	5760 1
+5796	5772 1
+5796	5800 1
+5796	5802 1
+5796	5804 1
+5796	5807 1
+5796	5814 1
+5796	5818 1
+5796	5822 1
+5796	5827 1
+5796	5829 1
+5796	5871 1
+5796	5897 1
+5796	5902 1
+5796	5928 1
+5796	5936 1
+5796	6001 1
+5796	6006 1
+5796	6032 1
+5796	6055 1
+5796	6098 1
+5796	6105 1
+5796	6110 1
+5796	6123 1
+5796	6124 1
+5796	6148 1
+5796	6156 1
+5796	6218 1
+5796	6227 1
+5796	6229 1
+5796	6270 1
+5796	6272 1
+5796	6299 1
+5796	6327 1
+5796	6347 1
+5796	6388 1
+5796	6400 1
+5796	6407 1
+5796	6414 1
+5796	6442 1
+5796	6481 1
+5796	6496 1
+5796	6498 1
+5796	6501 1
+5796	6505 1
+5796	6528 1
+5796	6552 1
+5796	6555 1
+5796	6560 1
+5796	6566 1
+5796	6567 1
+5796	6570 1
+5796	6576 1
+5796	6599 1
+5796	6600 1
+5796	6665 1
+5796	6715 1
+5796	6739 1
+5796	6770 1
+5796	6774 1
+5796	6783 1
+5796	6784 1
+5796	6832 1
+5796	6833 1
+5796	6860 1
+5796	6869 1
+5796	6875 1
+5796	6890 1
+5796	6897 1
+5796	6901 1
+5796	6913 1
+5796	6934 1
+5796	6953 1
+5796	6955 1
+5796	6976 1
+5796	6980 1
+5796	7005 1
+5796	7021 1
+5796	7063 1
+5796	7092 1
+5796	7115 1
+5796	7225 1
+5796	7279 1
+5796	7301 1
+5796	7351 1
+5796	7381 1
+5796	7414 1
+5796	7443 1
+5796	7553 1
+5796	7561 1
+5796	7567 1
+5796	7620 1
+5796	7632 1
+5796	7651 1
+5796	7757 1
+5796	7871 1
+5796	7908 1
+5796	7961 1
+5796	8121 1
+5797	3634 1
+5797	3897 1
+5797	6501 1
+5798	3346 1
+5798	3897 1
+5798	4715 1
+5798	4795 1
+5798	4798 1
+5798	5638 1
+5798	5684 1
+5798	5804 1
+5798	6261 1
+5798	6337 1
+5798	6409 1
+5798	6427 1
+5799	2914 1
+5799	3479 1
+5799	3614 1
+5799	3897 1
+5799	4715 1
+5799	4786 1
+5799	4795 1
+5799	4798 1
+5799	4980 1
+5799	5200 1
+5799	5439 1
+5799	5626 1
+5799	5638 1
+5799	6006 1
+5799	6218 1
+5799	6296 1
+5799	6327 1
+5799	6388 1
+5799	6407 1
+5799	6432 1
+5799	6435 1
+5799	6437 1
+5799	6618 1
+5800	840 1
+5800	938 1
+5800	1026 1
+5800	1191 1
+5800	1403 1
+5800	1498 1
+5800	1982 1
+5800	2565 1
+5800	2589 1
+5800	2658 1
+5800	2785 1
+5800	3000 1
+5800	3084 1
+5800	3238 1
+5800	3297 1
+5800	3310 1
+5800	3346 1
+5800	3381 1
+5800	3792 1
+5800	3830 1
+5800	3897 1
+5800	3962 1
+5800	4037 1
+5800	4065 1
+5800	4134 1
+5800	4218 1
+5800	4310 1
+5800	4666 1
+5800	4712 1
+5800	4764 1
+5800	4791 1
+5800	4884 1
+5800	4934 1
+5800	4940 1
+5800	4944 1
+5800	4983 1
+5800	5002 1
+5800	5012 1
+5800	5022 1
+5800	5096 1
+5800	5179 1
+5800	5199 1
+5800	5210 1
+5800	5233 1
+5800	5421 1
+5800	5432 1
+5800	5465 1
+5800	5466 1
+5800	5524 1
+5800	5529 1
+5800	5582 1
+5800	5596 1
+5800	5655 1
+5800	5671 1
+5800	5697 1
+5800	5739 1
+5800	5760 1
+5800	5802 1
+5800	5806 1
+5800	5807 1
+5800	5812 1
+5800	5814 1
+5800	5818 1
+5800	5819 1
+5800	5822 1
+5800	5824 1
+5800	5827 1
+5800	5835 1
+5800	5839 1
+5800	5871 1
+5800	5897 1
+5800	5932 1
+5800	5933 1
+5800	5998 1
+5800	6000 1
+5800	6001 1
+5800	6032 1
+5800	6043 1
+5800	6097 1
+5800	6123 1
+5800	6156 1
+5800	6174 1
+5800	6221 1
+5800	6227 1
+5800	6243 1
+5800	6270 1
+5800	6272 1
+5800	6299 1
+5800	6305 1
+5800	6307 1
+5800	6327 1
+5800	6330 1
+5800	6347 1
+5800	6388 1
+5800	6414 1
+5800	6417 1
+5800	6424 1
+5800	6441 1
+5800	6442 1
+5800	6447 1
+5800	6523 1
+5800	6555 1
+5800	6560 1
+5800	6595 1
+5800	6618 1
+5800	6624 1
+5800	6628 1
+5800	6632 1
+5800	6634 1
+5800	6665 1
+5800	6712 1
+5800	6715 1
+5800	6725 1
+5800	6736 1
+5800	6737 1
+5800	6769 1
+5800	6774 1
+5800	6780 1
+5800	6783 1
+5800	6784 1
+5800	6789 1
+5800	6790 1
+5800	6806 1
+5800	6832 1
+5800	6860 1
+5800	6869 1
+5800	6873 1
+5800	6890 1
+5800	6892 1
+5800	6907 1
+5800	6913 1
+5800	6914 1
+5800	6918 1
+5800	6924 1
+5800	6934 1
+5800	6938 1
+5800	6946 1
+5800	6950 1
+5800	6953 1
+5800	6967 1
+5800	6976 1
+5800	6979 1
+5800	6980 1
+5800	6982 1
+5800	6993 1
+5800	6994 1
+5800	7040 1
+5800	7047 1
+5800	7050 1
+5800	7052 1
+5800	7060 1
+5800	7063 1
+5800	7073 1
+5800	7092 1
+5800	7101 1
+5800	7110 1
+5800	7116 1
+5800	7119 1
+5800	7120 1
+5800	7144 1
+5800	7162 1
+5800	7185 1
+5800	7201 1
+5800	7214 1
+5800	7238 1
+5800	7262 1
+5800	7277 1
+5800	7280 1
+5800	7295 1
+5800	7341 1
+5800	7351 1
+5800	7373 1
+5800	7389 1
+5800	7400 1
+5800	7422 1
+5800	7443 1
+5800	7491 1
+5800	7493 1
+5800	7520 1
+5800	7529 1
+5800	7544 1
+5800	7553 1
+5800	7561 1
+5800	7574 1
+5800	7583 1
+5800	7587 1
+5800	7588 1
+5800	7620 1
+5800	7646 1
+5800	7651 1
+5800	7694 1
+5800	7699 1
+5800	7726 1
+5800	7763 1
+5800	7795 1
+5800	7809 1
+5800	7810 1
+5800	7833 1
+5800	7874 1
+5800	7882 1
+5800	7924 1
+5800	7979 1
+5800	7992 1
+5800	7996 1
+5800	8002 1
+5800	8024 1
+5800	8042 1
+5800	8083 1
+5800	8090 1
+5800	8121 1
+5800	8122 1
+5800	8124 1
+5800	8134 1
+5800	8163 1
+5800	8168 1
+5800	8178 1
+5800	8192 1
+5800	8219 1
+5800	8246 1
+5800	8249 1
+5800	8271 1
+5800	8297 1
+5801	3897 1
+5801	5817 1
+5802	155 1
+5802	840 1
+5802	938 1
+5802	967 1
+5802	1026 1
+5802	1352 1
+5802	1403 1
+5802	1498 1
+5802	1823 1
+5802	1972 1
+5802	1982 1
+5802	2433 1
+5802	2440 1
+5802	2511 1
+5802	2565 1
+5802	2589 1
+5802	2620 1
+5802	2658 1
+5802	2785 1
+5802	2851 1
+5802	2914 1
+5802	2940 1
+5802	3291 1
+5802	3293 1
+5802	3297 1
+5802	3310 1
+5802	3334 1
+5802	3346 1
+5802	3381 1
+5802	3459 1
+5802	3614 1
+5802	3631 1
+5802	3634 1
+5802	3726 1
+5802	3752 1
+5802	3803 1
+5802	3830 1
+5802	3842 1
+5802	3885 1
+5802	3897 1
+5802	3919 1
+5802	3962 1
+5802	3969 1
+5802	4037 1
+5802	4065 1
+5802	4071 1
+5802	4099 1
+5802	4341 1
+5802	4361 1
+5802	4401 1
+5802	4435 1
+5802	4483 1
+5802	4488 1
+5802	4507 1
+5802	4536 1
+5802	4604 1
+5802	4632 1
+5802	4666 1
+5802	4689 1
+5802	4709 1
+5802	4712 1
+5802	4713 1
+5802	4717 1
+5802	4748 1
+5802	4764 1
+5802	4786 1
+5802	4791 1
+5802	4795 1
+5802	4798 1
+5802	4875 1
+5802	4879 1
+5802	4884 1
+5802	4944 1
+5802	4966 1
+5802	4980 1
+5802	4981 1
+5802	4983 1
+5802	4992 1
+5802	4994 1
+5802	5002 1
+5802	5012 1
+5802	5022 1
+5802	5028 1
+5802	5037 1
+5802	5079 1
+5802	5096 1
+5802	5140 1
+5802	5148 1
+5802	5179 1
+5802	5188 1
+5802	5199 1
+5802	5200 1
+5802	5210 1
+5802	5233 1
+5802	5254 1
+5802	5273 1
+5802	5288 1
+5802	5289 1
+5802	5384 1
+5802	5393 1
+5802	5404 1
+5802	5406 1
+5802	5432 1
+5802	5465 1
+5802	5466 1
+5802	5479 1
+5802	5484 1
+5802	5500 1
+5802	5524 1
+5802	5543 1
+5802	5582 1
+5802	5584 1
+5802	5596 1
+5802	5605 1
+5802	5614 1
+5802	5638 1
+5802	5671 1
+5802	5697 1
+5802	5714 1
+5802	5738 1
+5802	5739 1
+5802	5760 1
+5802	5773 1
+5802	5776 1
+5802	5798 1
+5802	5799 1
+5802	5800 1
+5802	5804 1
+5802	5806 1
+5802	5807 1
+5802	5811 1
+5802	5814 1
+5802	5819 1
+5802	5822 1
+5802	5824 1
+5802	5827 1
+5802	5829 1
+5802	5835 1
+5802	5839 1
+5802	5871 1
+5802	5872 1
+5802	5887 1
+5802	5897 1
+5802	5902 1
+5802	5932 1
+5802	5980 1
+5802	5998 1
+5802	6000 1
+5802	6004 1
+5802	6006 1
+5802	6032 1
+5802	6043 1
+5802	6047 1
+5802	6123 1
+5802	6151 1
+5802	6156 1
+5802	6170 1
+5802	6174 1
+5802	6198 1
+5802	6218 1
+5802	6227 1
+5802	6243 1
+5802	6270 1
+5802	6272 1
+5802	6299 1
+5802	6306 1
+5802	6320 1
+5802	6323 1
+5802	6327 1
+5802	6330 1
+5802	6334 1
+5802	6360 1
+5802	6388 1
+5802	6400 1
+5802	6407 1
+5802	6409 1
+5802	6414 1
+5802	6417 1
+5802	6424 1
+5802	6435 1
+5802	6437 1
+5802	6441 1
+5802	6442 1
+5802	6447 1
+5802	6458 1
+5802	6462 1
+5802	6464 1
+5802	6472 1
+5802	6474 1
+5802	6481 1
+5802	6491 1
+5802	6496 1
+5802	6501 1
+5802	6503 1
+5802	6505 1
+5802	6511 1
+5802	6523 1
+5802	6528 1
+5802	6530 1
+5802	6553 1
+5802	6554 1
+5802	6555 1
+5802	6560 1
+5802	6570 1
+5802	6576 1
+5802	6589 1
+5802	6590 1
+5802	6592 1
+5802	6594 1
+5802	6600 1
+5802	6606 1
+5802	6613 1
+5802	6618 1
+5802	6624 1
+5802	6628 1
+5802	6632 1
+5802	6634 1
+5802	6663 1
+5802	6665 1
+5802	6686 1
+5802	6699 1
+5802	6712 1
+5802	6714 1
+5802	6715 1
+5802	6725 1
+5802	6736 1
+5802	6739 1
+5802	6765 1
+5802	6770 1
+5802	6774 1
+5802	6777 1
+5802	6780 1
+5802	6784 1
+5802	6789 1
+5802	6803 1
+5802	6806 1
+5802	6809 1
+5802	6832 1
+5802	6850 1
+5802	6860 1
+5802	6869 1
+5802	6873 1
+5802	6875 1
+5802	6901 1
+5802	6907 1
+5802	6913 1
+5802	6914 1
+5802	6934 1
+5802	6938 1
+5802	6942 1
+5802	6945 1
+5802	6946 1
+5802	6948 1
+5802	6953 1
+5802	6955 1
+5802	6967 1
+5802	6976 1
+5802	6979 1
+5802	6980 1
+5802	6993 1
+5802	6994 1
+5802	7005 1
+5802	7012 1
+5802	7021 1
+5802	7040 1
+5802	7052 1
+5802	7059 1
+5802	7060 1
+5802	7063 1
+5802	7073 1
+5802	7088 1
+5802	7092 1
+5802	7094 1
+5802	7101 1
+5802	7108 1
+5802	7110 1
+5802	7115 1
+5802	7116 1
+5802	7119 1
+5802	7131 1
+5802	7143 1
+5802	7144 1
+5802	7168 1
+5802	7186 1
+5802	7214 1
+5802	7225 1
+5802	7233 1
+5802	7237 1
+5802	7246 1
+5802	7277 1
+5802	7279 1
+5802	7280 1
+5802	7295 1
+5802	7301 1
+5802	7304 1
+5802	7351 1
+5802	7362 1
+5802	7373 1
+5802	7378 1
+5802	7381 1
+5802	7391 1
+5802	7397 1
+5802	7400 1
+5802	7414 1
+5802	7422 1
+5802	7436 1
+5802	7442 1
+5802	7443 1
+5802	7449 1
+5802	7450 1
+5802	7478 1
+5802	7491 1
+5802	7497 1
+5802	7510 1
+5802	7512 1
+5802	7529 1
+5802	7544 1
+5802	7553 1
+5802	7557 1
+5802	7561 1
+5802	7587 1
+5802	7593 1
+5802	7618 1
+5802	7620 1
+5802	7624 1
+5802	7632 1
+5802	7646 1
+5802	7647 1
+5802	7649 1
+5802	7651 1
+5802	7652 1
+5802	7662 1
+5802	7666 1
+5802	7673 1
+5802	7694 1
+5802	7707 1
+5802	7726 1
+5802	7757 1
+5802	7763 1
+5802	7778 1
+5802	7788 1
+5802	7795 1
+5802	7809 1
+5802	7813 1
+5802	7819 1
+5802	7839 1
+5802	7855 1
+5802	7860 1
+5802	7862 1
+5802	7879 1
+5802	7882 1
+5802	7890 1
+5802	7908 1
+5802	7910 1
+5802	7924 1
+5802	7927 1
+5802	7946 1
+5802	7961 1
+5802	7965 1
+5802	7979 1
+5802	7992 1
+5802	7994 1
+5802	8002 1
+5802	8037 1
+5802	8042 1
+5802	8044 1
+5802	8051 1
+5802	8083 1
+5802	8090 1
+5802	8122 1
+5802	8124 1
+5802	8128 1
+5802	8132 1
+5802	8148 1
+5802	8163 1
+5802	8168 1
+5802	8174 1
+5802	8178 1
+5802	8192 1
+5802	8198 1
+5802	8209 1
+5802	8212 1
+5802	8219 1
+5802	8225 1
+5802	8297 1
+5803	3634 1
+5803	3897 1
+5806	1026 1
+5806	2565 1
+5806	3873 1
+5806	3885 1
+5806	3897 1
+5806	4037 1
+5806	4361 1
+5806	4795 1
+5806	4966 1
+5806	5022 1
+5806	5210 1
+5806	5233 1
+5806	5289 1
+5806	5335 1
+5806	5393 1
+5806	5406 1
+5806	5421 1
+5806	5800 1
+5806	5811 1
+5806	5872 1
+5806	5902 1
+5806	6006 1
+5806	6243 1
+5806	6296 1
+5806	6299 1
+5806	6302 1
+5806	6306 1
+5806	6327 1
+5806	6424 1
+5806	6441 1
+5806	6665 1
+5806	6686 1
+5806	6724 1
+5806	6737 1
+5806	6739 1
+5806	6756 1
+5806	6772 1
+5806	6777 1
+5806	6789 1
+5806	6907 1
+5806	6923 1
+5806	6980 1
+5806	7092 1
+5806	7225 1
+5806	7279 1
+5806	7295 1
+5806	7315 1
+5806	7319 1
+5806	7341 1
+5806	7373 1
+5806	7381 1
+5806	7400 1
+5806	7414 1
+5806	7422 1
+5806	7439 1
+5806	7497 1
+5806	7498 1
+5806	7510 1
+5806	7520 1
+5806	7529 1
+5806	7533 1
+5806	7553 1
+5806	7574 1
+5806	7583 1
+5806	7587 1
+5806	7620 1
+5806	7653 1
+5806	7688 1
+5806	7691 1
+5806	7730 1
+5806	7734 1
+5806	7735 1
+5806	7788 1
+5806	7809 1
+5806	7857 1
+5806	7882 1
+5806	7913 1
+5806	8002 1
+5806	8073 1
+5806	8128 1
+5806	8224 1
+5806	8275 1
+5806	8295 1
+5804	2276 1
+5804	3000 1
+5804	3897 1
+5804	4483 1
+5804	4574 1
+5804	4712 1
+5804	4715 1
+5804	4828 1
+5804	5457 1
+5804	5524 1
+5804	5563 1
+5804	5801 1
+5804	5871 1
+5804	5928 1
+5804	5956 1
+5804	5973 1
+5804	6006 1
+5804	6458 1
+5804	6600 1
+5804	6634 1
+5804	6661 1
+5804	6765 1
+5804	6784 1
+5804	6914 1
+5804	7021 1
+5804	7115 1
+5804	7116 1
+5804	7204 1
+5804	7243 1
+5804	7386 1
+5804	7648 1
+5804	7862 1
+5804	7874 1
+5805	15 1
+5805	1972 1
+5805	3897 1
+5805	5423 1
+5805	5479 1
+5805	5487 1
+5805	5527 1
+5805	5738 1
+5805	5799 1
+5805	5980 1
+5805	6023 1
+5805	6148 1
+5805	6251 1
+5805	6424 1
+5805	6462 1
+5805	6501 1
+5807	15 1
+5807	840 1
+5807	2940 1
+5807	3334 1
+5807	3803 1
+5807	3897 1
+5807	4934 1
+5807	5384 1
+5807	5584 1
+5807	5776 1
+5807	5922 1
+5807	6001 1
+5807	6004 1
+5807	6327 1
+5807	6417 1
+5807	6552 1
+5807	6765 1
+5807	6805 1
+5807	6897 1
+5807	7094 1
+5807	7101 1
+5807	7115 1
+5807	7116 1
+5807	7434 1
+5807	7440 1
+5807	7498 1
+5807	7534 1
+5808	3479 1
+5808	3897 1
+5808	4687 1
+5808	5200 1
+5808	5684 1
+5808	5804 1
+5809	2276 1
+5809	3191 1
+5809	3897 1
+5809	4875 1
+5809	5543 1
+5809	5697 1
+5809	5753 1
+5809	5814 1
+5809	5936 1
+5809	5977 1
+5809	5980 1
+5809	5994 1
+5809	6094 1
+5809	6105 1
+5809	6110 1
+5809	6124 1
+5809	6148 1
+5809	6218 1
+5809	6296 1
+5809	6306 1
+5809	6328 1
+5810	15 1
+5810	2440 1
+5810	2535 1
+5810	3084 1
+5810	3291 1
+5810	3873 1
+5810	3897 1
+5810	4037 1
+5810	4604 1
+5810	4712 1
+5810	4791 1
+5810	5022 1
+5810	5037 1
+5810	5233 1
+5810	5254 1
+5810	6006 1
+5810	6156 1
+5810	6311 1
+5810	6328 1
+5810	6337 1
+5810	6442 1
+5810	6600 1
+5810	6715 1
+5810	6869 1
+5810	6907 1
+5810	7054 1
+5810	7237 1
+5810	7620 1
+5810	7809 1
+5811	840 1
+5811	1403 1
+5811	1982 1
+5811	2785 1
+5811	3334 1
+5811	3726 1
+5811	3830 1
+5811	3897 1
+5811	4361 1
+5811	4412 1
+5811	4488 1
+5811	4536 1
+5811	4713 1
+5811	4748 1
+5811	4791 1
+5811	5012 1
+5811	5140 1
+5811	5210 1
+5811	5295 1
+5811	5563 1
+5811	5582 1
+5811	5739 1
+5811	5760 1
+5811	5800 1
+5811	5801 1
+5811	5818 1
+5811	5902 1
+5811	5950 1
+5811	6001 1
+5811	6123 1
+5811	6198 1
+5811	6299 1
+5811	6305 1
+5811	6330 1
+5811	6388 1
+5811	6414 1
+5811	6432 1
+5811	6441 1
+5811	6472 1
+5811	6491 1
+5811	6498 1
+5811	6511 1
+5811	6523 1
+5811	6530 1
+5811	6554 1
+5811	6560 1
+5811	6566 1
+5811	6613 1
+5811	6624 1
+5811	6634 1
+5811	6725 1
+5811	6736 1
+5811	6765 1
+5811	6832 1
+5811	6833 1
+5811	6850 1
+5811	6855 1
+5811	6860 1
+5811	6869 1
+5811	6901 1
+5811	6930 1
+5811	6934 1
+5811	6945 1
+5811	6950 1
+5811	6953 1
+5811	6979 1
+5811	6994 1
+5811	7108 1
+5811	7149 1
+5811	7254 1
+5811	7295 1
+5811	7304 1
+5811	7351 1
+5811	7381 1
+5811	7407 1
+5811	7414 1
+5811	7423 1
+5811	7434 1
+5811	8295 1
+5812	2535 1
+5812	3291 1
+5812	3459 1
+5812	3479 1
+5812	3614 1
+5812	3634 1
+5812	3897 1
+5812	4099 1
+5812	4687 1
+5812	4980 1
+5812	5022 1
+5812	5200 1
+5812	5295 1
+5812	5415 1
+5812	5423 1
+5812	5545 1
+5812	5626 1
+5812	5697 1
+5812	5760 1
+5812	5800 1
+5812	5814 1
+5812	5818 1
+5812	6001 1
+5812	6023 1
+5812	6161 1
+5812	6218 1
+5812	6246 1
+5812	6251 1
+5812	6262 1
+5812	6296 1
+5812	6328 1
+5812	6330 1
+5812	6458 1
+5812	6498 1
+5812	6560 1
+5812	6618 1
+5812	6784 1
+5812	6855 1
+5812	6901 1
+5812	6979 1
+5812	8295 1
+5813	3897 1
+5813	6417 1
+5814	1403 1
+5814	1549 1
+5814	2160 1
+5814	2276 1
+5814	2535 1
+5814	2851 1
+5814	2940 1
+5814	3084 1
+5814	3089 1
+5814	3238 1
+5814	3293 1
+5814	3459 1
+5814	3770 1
+5814	3830 1
+5814	3897 1
+5814	3919 1
+5814	3962 1
+5814	4037 1
+5814	4310 1
+5814	4401 1
+5814	4432 1
+5814	4536 1
+5814	4709 1
+5814	4712 1
+5814	4791 1
+5814	4940 1
+5814	5002 1
+5814	5020 1
+5814	5028 1
+5814	5037 1
+5814	5064 1
+5814	5079 1
+5814	5096 1
+5814	5188 1
+5814	5200 1
+5814	5210 1
+5814	5254 1
+5814	5262 1
+5814	5288 1
+5814	5432 1
+5814	5524 1
+5814	5543 1
+5814	5605 1
+5814	5714 1
+5814	5738 1
+5814	5739 1
+5814	5760 1
+5814	5800 1
+5814	5802 1
+5814	5806 1
+5814	5811 1
+5814	5812 1
+5814	5818 1
+5814	5827 1
+5814	5835 1
+5814	5863 1
+5814	5871 1
+5814	5887 1
+5814	5891 1
+5814	5897 1
+5814	5902 1
+5814	5932 1
+5814	5950 1
+5814	5973 1
+5814	5998 1
+5814	6004 1
+5814	6032 1
+5814	6105 1
+5814	6123 1
+5814	6156 1
+5814	6221 1
+5814	6299 1
+5814	6327 1
+5814	6340 1
+5814	6409 1
+5814	6417 1
+5814	6422 1
+5814	6437 1
+5814	6498 1
+5814	6560 1
+5814	6618 1
+5814	6634 1
+5814	6665 1
+5814	6699 1
+5814	6714 1
+5814	6715 1
+5814	6759 1
+5814	6774 1
+5814	6780 1
+5814	6784 1
+5814	6790 1
+5814	6806 1
+5814	6832 1
+5814	6855 1
+5814	6869 1
+5814	6913 1
+5814	6914 1
+5814	6917 1
+5814	6924 1
+5814	6946 1
+5814	6967 1
+5814	6979 1
+5814	6980 1
+5814	6982 1
+5814	6987 1
+5814	7012 1
+5814	7021 1
+5814	7063 1
+5814	7092 1
+5814	7110 1
+5814	7116 1
+5814	7225 1
+5814	7233 1
+5814	7237 1
+5814	7280 1
+5814	7414 1
+5814	7434 1
+5814	7508 1
+5814	7544 1
+5814	7553 1
+5814	7587 1
+5814	7593 1
+5814	7618 1
+5814	7620 1
+5814	7632 1
+5814	7651 1
+5814	7699 1
+5814	7757 1
+5814	7795 1
+5814	7809 1
+5814	7833 1
+5814	7835 1
+5814	7857 1
+5814	7860 1
+5814	7874 1
+5814	7928 1
+5814	7961 1
+5814	8002 1
+5814	8058 1
+5814	8134 1
+5814	8192 1
+5814	8246 1
+5814	8295 1
+5814	8297 1
+5815	3897 1
+5815	5798 1
+5815	6871 1
+5815	7510 1
+5815	8002 1
+5816	1026 1
+5816	1549 1
+5816	1972 1
+5816	1982 1
+5816	2160 1
+5816	2273 1
+5816	2285 1
+5816	2440 1
+5816	2535 1
+5816	2565 1
+5816	2774 1
+5816	2851 1
+5816	3291 1
+5816	3334 1
+5816	3459 1
+5816	3479 1
+5816	3634 1
+5816	3726 1
+5816	3792 1
+5816	3842 1
+5816	3897 1
+5816	4037 1
+5816	4099 1
+5816	4361 1
+5816	4536 1
+5816	4604 1
+5816	4666 1
+5816	4687 1
+5816	4689 1
+5816	4715 1
+5816	4944 1
+5816	5012 1
+5816	5079 1
+5816	5233 1
+5816	5254 1
+5816	5273 1
+5816	5295 1
+5816	5321 1
+5816	5423 1
+5816	5584 1
+5816	5697 1
+5816	5798 1
+5816	5902 1
+5816	6000 1
+5816	6004 1
+5816	6006 1
+5816	6221 1
+5816	6246 1
+5816	6306 1
+5816	6330 1
+5816	6432 1
+5816	6441 1
+5816	6498 1
+5816	6505 1
+5816	6528 1
+5816	6553 1
+5816	6554 1
+5816	6566 1
+5816	6570 1
+5816	6576 1
+5816	6599 1
+5816	6600 1
+5816	6624 1
+5816	6634 1
+5816	6700 1
+5816	6736 1
+5816	6803 1
+5816	6832 1
+5816	6855 1
+5816	6948 1
+5816	6955 1
+5816	7094 1
+5816	7115 1
+5816	7168 1
+5816	7279 1
+5816	7422 1
+5816	7478 1
+5816	7510 1
+5816	7553 1
+5816	7632 1
+5816	7683 1
+5816	7809 1
+5816	8295 1
+5816	8297 1
+5817	1026 1
+5817	1074 1
+5817	1549 1
+5817	1982 1
+5817	2160 1
+5817	2433 1
+5817	2511 1
+5817	2535 1
+5817	3291 1
+5817	3459 1
+5817	3631 1
+5817	3897 1
+5817	3976 1
+5817	4134 1
+5817	4361 1
+5817	4483 1
+5817	4632 1
+5817	4687 1
+5817	4791 1
+5817	4795 1
+5817	4798 1
+5817	4828 1
+5817	4980 1
+5817	5002 1
+5817	5020 1
+5817	5176 1
+5817	5254 1
+5817	5288 1
+5817	5321 1
+5817	5404 1
+5817	5421 1
+5817	5484 1
+5817	5524 1
+5817	5697 1
+5817	5709 1
+5817	5800 1
+5817	5811 1
+5817	5814 1
+5817	5886 1
+5817	5922 1
+5817	5950 1
+5817	5963 1
+5817	5973 1
+5817	6255 1
+5817	6299 1
+5817	6305 1
+5817	6327 1
+5817	6330 1
+5817	6337 1
+5817	6414 1
+5817	6481 1
+5817	6503 1
+5817	6523 1
+5817	6596 1
+5817	6606 1
+5817	6720 1
+5817	6765 1
+5817	6832 1
+5817	6855 1
+5817	6953 1
+5817	6955 1
+5817	6976 1
+5817	6979 1
+5817	6980 1
+5817	7023 1
+5817	7143 1
+5817	7168 1
+5817	7185 1
+5817	7186 1
+5817	7295 1
+5817	7301 1
+5817	7351 1
+5817	7373 1
+5817	7553 1
+5817	8297 1
+5818	15 1
+5818	2285 1
+5818	3015 1
+5818	3459 1
+5818	3479 1
+5818	3498 1
+5818	3614 1
+5818	3792 1
+5818	3873 1
+5818	3897 1
+5818	4099 1
+5818	4401 1
+5818	4432 1
+5818	4483 1
+5818	4488 1
+5818	4536 1
+5818	4689 1
+5818	4713 1
+5818	4764 1
+5818	4798 1
+5818	5178 1
+5818	5233 1
+5818	5262 1
+5818	5263 1
+5818	5273 1
+5818	5295 1
+5818	5321 1
+5818	5335 1
+5818	5415 1
+5818	5423 1
+5818	5487 1
+5818	5543 1
+5818	5624 1
+5818	5626 1
+5818	5760 1
+5818	5798 1
+5818	5804 1
+5818	5814 1
+5818	5829 1
+5818	5871 1
+5818	6004 1
+5818	6023 1
+5818	6166 1
+5818	6246 1
+5818	6251 1
+5818	6255 1
+5818	6262 1
+5818	6296 1
+5818	6306 1
+5818	6327 1
+5818	6337 1
+5818	6347 1
+5818	6388 1
+5818	6400 1
+5818	6441 1
+5818	6458 1
+5818	6576 1
+5818	6599 1
+5818	6613 1
+5818	6833 1
+5818	6850 1
+5818	6869 1
+5818	6873 1
+5818	6875 1
+5818	7791 1
+5818	8249 1
+5818	8295 1
+5819	15 1
+5819	896 1
+5819	1074 1
+5819	1493 1
+5819	1648 1
+5819	1823 1
+5819	1982 1
+5819	2276 1
+5819	2440 1
+5819	2507 1
+5819	3089 1
+5819	3498 1
+5819	3586 1
+5819	3634 1
+5819	3643 1
+5819	3830 1
+5819	3842 1
+5819	3897 1
+5819	3922 1
+5819	4041 1
+5819	4175 1
+5819	4310 1
+5819	4527 1
+5819	4689 1
+5819	4940 1
+5819	4994 1
+5819	5037 1
+5819	5140 1
+5819	5178 1
+5819	5254 1
+5819	5273 1
+5819	5301 1
+5819	5378 1
+5819	5404 1
+5819	5457 1
+5819	5482 1
+5819	5545 1
+5819	5753 1
+5819	5828 1
+5819	5832 1
+5819	5880 1
+5819	5886 1
+5819	6004 1
+5819	6098 1
+5819	6110 1
+5819	6432 1
+5819	6441 1
+5819	6505 1
+5819	6511 1
+5819	6589 1
+5819	6632 1
+5819	6780 1
+5819	6980 1
+5819	7238 1
+5819	7400 1
+5819	7553 1
+5819	7620 1
+5819	7833 1
+5819	7908 1
+5819	8037 1
+5819	8121 1
+5820	3381 1
+5820	3897 1
+5820	4981 1
+5820	4983 1
+5820	5839 1
+5820	6241 1
+5820	6414 1
+5820	6523 1
+5820	6596 1
+5820	6712 1
+5820	7280 1
+5820	7393 1
+5820	7449 1
+5820	7707 1
+5820	7757 1
+5820	7763 1
+5820	7788 1
+5820	7809 1
+5820	7839 1
+5820	7921 1
+5821	155 1
+5821	1352 1
+5821	2160 1
+5821	2285 1
+5821	2440 1
+5821	2565 1
+5821	2851 1
+5821	3897 1
+5821	4065 1
+5821	4361 1
+5821	4709 1
+5821	4712 1
+5821	4748 1
+5821	5254 1
+5821	5872 1
+5821	5902 1
+5821	6006 1
+5821	6458 1
+5821	6505 1
+5821	6590 1
+5821	6594 1
+5821	7478 1
+5822	1972 1
+5822	2160 1
+5822	2285 1
+5822	2440 1
+5822	2940 1
+5822	3291 1
+5822	3334 1
+5822	3346 1
+5822	3459 1
+5822	3634 1
+5822	3873 1
+5822	3897 1
+5822	3919 1
+5822	3962 1
+5822	4341 1
+5822	4361 1
+5822	4786 1
+5822	4791 1
+5822	4994 1
+5822	5002 1
+5822	5079 1
+5822	5178 1
+5822	5188 1
+5822	5199 1
+5822	5210 1
+5822	5254 1
+5822	5289 1
+5822	5421 1
+5822	5432 1
+5822	5466 1
+5822	5524 1
+5822	5563 1
+5822	5596 1
+5822	5799 1
+5822	5800 1
+5822	5819 1
+5822	5829 1
+5822	5839 1
+5822	5872 1
+5822	5902 1
+5822	5980 1
+5822	5998 1
+5822	6006 1
+5822	6043 1
+5822	6044 1
+5822	6097 1
+5822	6174 1
+5822	6251 1
+5822	6299 1
+5822	6347 1
+5822	6424 1
+5822	6432 1
+5822	6435 1
+5822	6437 1
+5822	6503 1
+5822	6505 1
+5822	6552 1
+5822	6613 1
+5822	6632 1
+5822	6634 1
+5822	6663 1
+5822	6774 1
+5822	6789 1
+5822	6832 1
+5822	6855 1
+5822	6869 1
+5822	6913 1
+5822	6923 1
+5822	6934 1
+5822	7063 1
+5822	7168 1
+5822	7225 1
+5822	7237 1
+5822	7238 1
+5822	7295 1
+5822	7301 1
+5822	7315 1
+5822	7351 1
+5822	7381 1
+5822	7386 1
+5822	7414 1
+5822	7422 1
+5822	7510 1
+5822	7632 1
+5822	7646 1
+5822	7649 1
+5822	7651 1
+5822	7662 1
+5822	7683 1
+5822	7690 1
+5822	7699 1
+5822	7809 1
+5822	7813 1
+5822	7833 1
+5822	7835 1
+5822	7912 1
+5822	8275 1
+5822	8295 1
+5823	2774 1
+5823	3897 1
+5823	4412 1
+5823	4875 1
+5823	4983 1
+5823	5254 1
+5823	5798 1
+5823	6417 1
+5823	6432 1
+5823	6437 1
+5823	6441 1
+5823	7478 1
+5824	1648 1
+5824	1982 1
+5824	2565 1
+5824	3792 1
+5824	4037 1
+5824	4536 1
+5824	5182 1
+5824	5295 1
+5824	5543 1
+5824	5563 1
+5824	5739 1
+5824	5773 1
+5824	5800 1
+5824	5814 1
+5824	5818 1
+5824	5828 1
+5824	5830 1
+5824	5848 1
+5824	5925 1
+5824	5926 1
+5824	5928 1
+5824	5963 1
+5824	6001 1
+5824	6004 1
+5824	6246 1
+5824	6299 1
+5824	6323 1
+5824	6491 1
+5824	6555 1
+5824	6560 1
+5824	6624 1
+5824	6665 1
+5824	6715 1
+5824	6790 1
+5824	6855 1
+5824	6892 1
+5824	6901 1
+5824	6930 1
+5824	6946 1
+5824	6994 1
+5824	7052 1
+5827	4175 1
+5827	5037 1
+5827	5123 1
+5827	5254 1
+5827	5404 1
+5827	5563 1
+5827	5605 1
+5827	5680 1
+5827	5828 1
+5827	6123 1
+5827	6327 1
+5827	6913 1
+5827	7143 1
+5827	7277 1
+5827	7662 1
+5829	5123 1
+5829	5262 1
+5829	5301 1
+5829	5415 1
+5829	5527 1
+5829	5545 1
+5829	5680 1
+5829	5830 1
+5829	5891 1
+5829	6148 1
+5829	6246 1
+5829	8295 1
+5837	5963 1
+5833	5837 1
+5834	3191 1
+5834	3643 1
+5834	5753 1
+5834	5837 1
+5834	6029 1
+5834	6094 1
+5839	1352 1
+5839	3459 1
+5839	4795 1
+5839	4828 1
+5839	5188 1
+5839	5210 1
+5839	5254 1
+5839	5262 1
+5839	5301 1
+5839	5439 1
+5839	5457 1
+5839	5524 1
+5839	5827 1
+5839	5829 1
+5839	5838 1
+5839	5871 1
+5839	5950 1
+5839	5963 1
+5839	5980 1
+5839	6123 1
+5839	6161 1
+5839	6417 1
+5839	6424 1
+5839	6432 1
+5839	6442 1
+5839	6458 1
+5839	6501 1
+5839	6505 1
+5839	6523 1
+5839	6600 1
+5839	6618 1
+5839	6634 1
+5839	6663 1
+5839	6712 1
+5839	6934 1
+5839	7092 1
+5839	7620 1
+5839	7632 1
+5839	7649 1
+5839	7653 1
+5839	7662 1
+5842	5305 1
+5840	5305 1
+5841	5305 1
+5836	3089 1
+5836	3586 1
+5836	4310 1
+5836	5482 1
+5836	5624 1
+5836	5844 1
+5836	5886 1
+5836	5991 1
+5836	6094 1
+5836	6148 1
+5836	8295 1
+5846	5680 1
+5846	5848 1
+5846	5850 1
+5852	5680 1
+5853	5680 1
+5854	5680 1
+3788	4574 1
+3788	7809 1
+5855	15 1
+5855	3498 1
+5855	4574 1
+5855	5123 1
+5855	5482 1
+5855	5543 1
+5855	5624 1
+5855	5891 1
+5856	4574 1
+5857	15 1
+5857	896 1
+5857	938 1
+5857	1026 1
+5857	1403 1
+5857	2276 1
+5857	2285 1
+5857	2535 1
+5857	2765 1
+5857	2851 1
+5857	3089 1
+5857	3334 1
+5857	3459 1
+5857	3586 1
+5857	3634 1
+5857	3643 1
+5857	3976 1
+5857	4041 1
+5857	4099 1
+5857	4310 1
+5857	4361 1
+5857	4401 1
+5857	4432 1
+5857	4574 1
+5857	4604 1
+5857	4712 1
+5857	4875 1
+5857	4879 1
+5857	4981 1
+5857	4994 1
+5857	5022 1
+5857	5028 1
+5857	5103 1
+5857	5188 1
+5857	5200 1
+5857	5210 1
+5857	5273 1
+5857	5321 1
+5857	5421 1
+5857	5524 1
+5857	5543 1
+5857	5563 1
+5857	5584 1
+5857	5714 1
+5857	5799 1
+5857	5806 1
+5857	5818 1
+5857	5827 1
+5857	5886 1
+5857	5891 1
+5857	5922 1
+5857	5950 1
+5857	5969 1
+5857	6000 1
+5857	6094 1
+5857	6098 1
+5857	6227 1
+5857	6272 1
+5857	6305 1
+5857	6327 1
+5857	6458 1
+5857	6481 1
+5857	6496 1
+5857	6501 1
+5857	6552 1
+5857	6560 1
+5857	6566 1
+5857	6570 1
+5857	6576 1
+5857	6594 1
+5857	6632 1
+5857	6634 1
+5857	6790 1
+5857	6875 1
+5857	6901 1
+5857	6914 1
+5857	6933 1
+5857	6946 1
+5857	6948 1
+5857	7063 1
+5857	7351 1
+5857	7510 1
+5857	7553 1
+5857	7561 1
+5857	7632 1
+5857	7699 1
+5857	7908 1
+5857	7961 1
+5857	8163 1
+5857	8178 1
+5857	8212 1
+5857	8295 1
+5859	1493 1
+5859	3830 1
+5859	4401 1
+5859	4940 1
+5859	5246 1
+5859	5860 1
+5859	5891 1
+5859	5969 1
+5859	6762 1
+5859	7791 1
+5859	8042 1
+5859	8044 1
+5859	8141 1
+5859	8224 1
+5859	8246 1
+5859	8249 1
+5861	5482 1
+5861	5863 1
+5862	15 1
+5862	896 1
+5862	1352 1
+5862	1549 1
+5862	3089 1
+5862	3976 1
+5862	4175 1
+5862	4712 1
+5862	4828 1
+5862	5188 1
+5862	5254 1
+5862	5524 1
+5862	5863 1
+5862	5886 1
+5862	5891 1
+5862	5936 1
+5862	6124 1
+5862	6156 1
+5862	6272 1
+5862	6501 1
+5862	6632 1
+5862	6945 1
+5862	6955 1
+5862	8295 1
+5864	2490 1
+5866	2490 1
+5868	2490 1
+5868	5482 1
+5868	5925 1
+5872	4341 1
+5872	4632 1
+5872	5289 1
+5872	5378 1
+5872	5605 1
+5872	5806 1
+5872	5812 1
+5872	6523 1
+5872	6618 1
+5872	6634 1
+5872	6665 1
+5872	6875 1
+5872	6907 1
+5872	7116 1
+5872	7506 1
+5872	7510 1
+5872	7553 1
+5872	7561 1
+5872	7587 1
+5872	7618 1
+5872	7624 1
+5872	7908 1
+5872	8163 1
+5872	8174 1
+5872	8192 1
+5872	8212 1
+5872	8249 1
+5873	3376 1
+5873	5123 1
+5873	5457 1
+5873	5482 1
+5873	5886 1
+5873	5891 1
+5874	5482 1
+5875	5482 1
+5876	5482 1
+5877	5123 1
+5877	5301 1
+5877	5482 1
+5877	5886 1
+5877	5891 1
+5877	5925 1
+5877	5928 1
+5878	5482 1
+5883	3586 1
+5883	5886 1
+5884	5123 1
+5884	5886 1
+5885	5886 1
+5885	5891 1
+5885	5963 1
+5887	5891 1
+5888	5891 1
+5889	5891 1
+5890	15 1
+5890	5697 1
+5890	5891 1
+5890	5963 1
+5890	6400 1
+5590	15 1
+5590	4037 1
+5590	4687 1
+5590	5817 1
+5590	7879 1
+5892	4037 1
+5892	5817 1
+5895	3461 1
+5896	3922 1
+5896	5182 1
+5896	5499 1
+5896	5529 1
+5896	6422 1
+5896	6474 1
+5896	6993 1
+5896	7047 1
+5896	7707 1
+5896	7803 1
+5897	5499 1
+5897	6634 1
+5899	5123 1
+5899	5457 1
+5902	5123 1
+5070	5096 1
+5070	5123 1
+5070	7778 1
+5070	7961 1
+5903	5123 1
+4767	15 1
+4767	2535 1
+4767	2565 1
+4767	2620 1
+4767	5254 1
+4767	5301 1
+4767	5543 1
+4767	5963 1
+4767	6006 1
+4767	6566 1
+4767	6715 1
+4767	6832 1
+4767	7092 1
+4767	8163 1
+5907	5301 1
+5911	5301 1
+5911	5928 1
+5908	15 1
+5908	2535 1
+5908	3334 1
+5908	5254 1
+5908	5298 1
+5908	5301 1
+5908	5812 1
+5908	6004 1
+5908	6595 1
+5908	6770 1
+5908	6942 1
+5908	7050 1
+5908	7238 1
+5908	7389 1
+5908	7553 1
+5908	7632 1
+5908	7810 1
+5908	8224 1
+5908	8237 1
+5909	5301 1
+5909	5928 1
+5913	15 1
+5913	3976 1
+5913	4037 1
+5913	4041 1
+5913	8128 1
+5915	967 1
+5915	1191 1
+5915	3310 1
+5915	3381 1
+5915	3752 1
+5915	3976 1
+5915	4071 1
+5915	4435 1
+5915	4981 1
+5915	5524 1
+5915	5529 1
+5915	5839 1
+5915	5928 1
+5915	5933 1
+5915	6021 1
+5915	6043 1
+5915	6151 1
+5915	6523 1
+5915	6555 1
+5915	6560 1
+5915	6596 1
+5915	6914 1
+5915	7005 1
+5915	7012 1
+5915	7052 1
+5915	7092 1
+5915	7277 1
+5915	7280 1
+5915	7386 1
+5915	7443 1
+5915	7449 1
+5915	7649 1
+5915	7694 1
+5915	7701 1
+5915	7726 1
+5915	7763 1
+5915	7788 1
+5915	7795 1
+5915	7803 1
+5915	7809 1
+5915	7813 1
+5915	7819 1
+5915	7839 1
+5915	7855 1
+5915	7862 1
+5915	7871 1
+5915	7882 1
+5915	7890 1
+5915	7909 1
+5915	7910 1
+5915	7912 1
+5915	7924 1
+5916	15 1
+5916	3976 1
+5916	5182 1
+5916	5925 1
+5916	5936 1
+5916	5947 1
+5916	5963 1
+5916	6599 1
+5916	8295 1
+4927	3976 1
+5914	3976 1
+5914	5335 1
+5871	896 1
+5871	1982 1
+5871	2440 1
+5871	3084 1
+5871	3089 1
+5871	3191 1
+5871	3334 1
+5871	3459 1
+5871	3643 1
+5871	3976 1
+5871	4310 1
+5871	4536 1
+5871	4712 1
+5871	4795 1
+5871	4875 1
+5871	5079 1
+5871	5176 1
+5871	5178 1
+5871	5182 1
+5871	5254 1
+5871	5262 1
+5871	5273 1
+5871	5295 1
+5871	5457 1
+5871	5524 1
+5871	5527 1
+5871	5543 1
+5871	5596 1
+5871	5697 1
+5871	5739 1
+5871	5800 1
+5871	5811 1
+5871	5827 1
+5871	5829 1
+5871	5839 1
+5871	5947 1
+5871	6272 1
+5871	6523 1
+5871	6576 1
+5871	6699 1
+5871	6720 1
+5871	6774 1
+5871	6832 1
+5871	6980 1
+5871	7225 1
+5871	7553 1
+5871	7587 1
+5871	7620 1
+5871	7632 1
+5871	8295 1
+5917	3976 1
+5919	4037 1
+5919	5925 1
+5920	1191 1
+5920	4435 1
+5920	5925 1
+5920	6044 1
+5920	6780 1
+5920	6918 1
+5920	6946 1
+5920	7517 1
+5920	8042 1
+5920	8134 1
+5921	4037 1
+5921	5925 1
+5921	6327 1
+5921	6330 1
+5922	2851 1
+5922	4432 1
+5922	5103 1
+5922	5925 1
+5922	6875 1
+5922	7561 1
+5922	7860 1
+5923	4037 1
+5923	5925 1
+5923	6227 1
+5924	5925 1
+5928	3459 1
+5928	5246 1
+5928	5936 1
+5928	7620 1
+5927	3293 1
+5927	4037 1
+5927	5210 1
+5927	5928 1
+5927	6634 1
+5927	7544 1
+5927	7588 1
+5927	7882 1
+5927	8051 1
+5927	8128 1
+5930	3089 1
+5930	5176 1
+5930	5931 1
+5932	896 1
+5932	3089 1
+5932	3459 1
+5932	4310 1
+5932	4828 1
+5932	4875 1
+5932	5002 1
+5932	5121 1
+5932	5254 1
+5932	5437 1
+5932	5479 1
+5932	5487 1
+5932	5524 1
+5932	5563 1
+5932	5624 1
+5932	5684 1
+5932	5799 1
+5932	5824 1
+5932	5871 1
+5932	5872 1
+5932	5998 1
+5932	6330 1
+5932	6407 1
+5932	6523 1
+5932	6560 1
+5932	6566 1
+5932	6599 1
+5932	6665 1
+5932	6789 1
+5932	6832 1
+5932	7101 1
+5932	7225 1
+5932	8295 1
+5933	3089 1
+5933	4791 1
+5933	4875 1
+5933	5254 1
+5934	896 1
+5934	1352 1
+5934	2276 1
+5934	2535 1
+5934	3089 1
+5934	3291 1
+5934	3873 1
+5934	3919 1
+5934	4065 1
+5934	4604 1
+5934	4781 1
+5934	4828 1
+5934	5037 1
+5934	5210 1
+5934	5273 1
+5934	5437 1
+5934	5527 1
+5934	5543 1
+5934	5620 1
+5934	5630 1
+5934	5753 1
+5934	5800 1
+5934	5802 1
+5934	5871 1
+5934	5947 1
+5934	6021 1
+5934	6111 1
+5934	6156 1
+5934	6166 1
+5934	6340 1
+5934	6409 1
+5934	6600 1
+5934	6613 1
+5934	6665 1
+5934	6699 1
+5934	6715 1
+5934	6805 1
+5934	6850 1
+5934	6855 1
+5934	6869 1
+5934	6901 1
+5934	7651 1
+5935	3089 1
+5935	3873 1
+5935	4310 1
+5935	5178 1
+5935	5487 1
+5935	5543 1
+5935	5545 1
+5935	5972 1
+5935	6161 1
+5935	6226 1
+5935	6235 1
+5936	3089 1
+5936	4175 1
+5937	3089 1
+5938	896 1
+5938	3089 1
+5942	896 1
+5942	3089 1
+5942	5936 1
+5942	5994 1
+5939	3089 1
+5939	3191 1
+5939	5994 1
+5940	1026 1
+5940	2774 1
+5940	3089 1
+5940	4175 1
+5940	5254 1
+5940	6006 1
+5940	6098 1
+5940	6496 1
+5940	7115 1
+5940	7632 1
+5940	7890 1
+5940	8174 1
+5940	8192 1
+5941	3089 1
+5944	5947 1
+5945	896 1
+5945	2765 1
+5945	4875 1
+5945	5179 1
+5945	5527 1
+5945	5947 1
+5945	5963 1
+5945	6094 1
+5945	6098 1
+5946	5182 1
+5946	5947 1
+5946	5963 1
+5946	8130 1
+5950	5457 1
+5950	6004 1
+5950	6634 1
+5950	6725 1
+5952	2440 1
+5952	3885 1
+5952	5079 1
+5952	5182 1
+5952	5697 1
+5952	5963 1
+5952	6414 1
+5952	7237 1
+5952	7238 1
+5952	7378 1
+5952	7620 1
+5952	7632 1
+5952	7839 1
+5952	7946 1
+5962	5963 1
+5962	5973 1
+5964	5963 1
+5958	5487 1
+5958	5963 1
+5958	6720 1
+5966	5335 1
+5966	5772 1
+5966	5963 1
+5966	6023 1
+5966	6946 1
+5966	7052 1
+5966	8219 1
+5959	5963 1
+5960	3191 1
+5960	5963 1
+5960	6094 1
+5960	6124 1
+5093	5963 1
+5961	3614 1
+5961	4310 1
+5961	4483 1
+5961	4798 1
+5961	4828 1
+5961	5188 1
+5961	5626 1
+5961	5804 1
+5961	5963 1
+5961	5991 1
+5961	6088 1
+5969	4435 1
+5969	6417 1
+5969	7092 1
+5969	7649 1
+5969	7835 1
+5970	5971 1
+5972	5263 1
+5972	6424 1
+5980	3634 1
+5980	5897 1
+5980	5969 1
+5980	6532 1
+5980	6553 1
+5980	6595 1
+5980	6634 1
+5980	6714 1
+5981	3586 1
+5981	4099 1
+5981	4483 1
+5981	5479 1
+5981	5584 1
+5981	5799 1
+5982	3586 1
+5982	6833 1
+5982	7961 1
+5982	8178 1
+5983	3586 1
+5984	896 1
+5984	3334 1
+5984	3586 1
+5984	4310 1
+5984	4791 1
+5984	5233 1
+5984	5524 1
+5984	5950 1
+5984	6323 1
+5984	7553 1
+5985	3586 1
+5986	3586 1
+5987	3586 1
+5988	3586 1
+5988	7131 1
+5988	7279 1
+5988	7478 1
+5989	3586 1
+5990	3586 1
+5992	5994 1
+5993	15 1
+5993	4037 1
+5993	5994 1
+5997	896 1
+5997	6791 1
+5998	896 1
+5998	1026 1
+5998	1352 1
+5998	2511 1
+5998	2565 1
+5998	2620 1
+5998	3291 1
+5998	3381 1
+5998	3634 1
+5998	3803 1
+5998	3962 1
+5998	4536 1
+5998	4604 1
+5998	4666 1
+5998	4712 1
+5998	4717 1
+5998	4748 1
+5998	4791 1
+5998	4944 1
+5998	4994 1
+5998	5002 1
+5998	5022 1
+5998	5140 1
+5998	5148 1
+5998	5179 1
+5998	5210 1
+5998	5254 1
+5998	5273 1
+5998	5404 1
+5998	5439 1
+5998	5773 1
+5998	5776 1
+5998	5799 1
+5998	5800 1
+5998	5806 1
+5998	5814 1
+5998	5822 1
+5998	5835 1
+5998	5922 1
+5998	5932 1
+5998	5936 1
+5998	6006 1
+5998	6097 1
+5998	6123 1
+5998	6327 1
+5998	6505 1
+5998	6552 1
+5998	6554 1
+5998	6570 1
+5998	6595 1
+5998	6600 1
+5998	6618 1
+5998	6632 1
+5998	6634 1
+5998	6665 1
+5998	6774 1
+5998	6914 1
+5998	6934 1
+5998	6946 1
+5998	7052 1
+5998	7092 1
+5998	7101 1
+5998	7115 1
+5998	7119 1
+5998	7143 1
+5998	7225 1
+5998	7279 1
+5998	7280 1
+5998	7389 1
+5998	7443 1
+5998	7510 1
+5998	7553 1
+5998	7707 1
+5998	7795 1
+5998	7833 1
+5998	7839 1
+5998	7871 1
+5998	7890 1
+5998	7924 1
+5998	7961 1
+5998	8168 1
+5967	896 1
+5999	896 1
+5999	1982 1
+5999	3084 1
+5999	3334 1
+5999	3459 1
+5999	4037 1
+5999	5079 1
+5999	5254 1
+5999	5620 1
+5999	6044 1
+5999	6246 1
+5999	6496 1
+5999	6553 1
+5999	6774 1
+5999	6833 1
+5999	7054 1
+5999	7620 1
+5999	7632 1
+5999	7803 1
+5999	7979 1
+6000	896 1
+6000	3084 1
+6000	5022 1
+6000	6270 1
+6000	6709 1
+6000	7168 1
+6000	7632 1
+6000	8124 1
+6000	8134 1
+6000	8276 1
+6005	1159 1
+6003	1159 1
+6006	1159 1
+6006	1498 1
+6006	2433 1
+6006	2440 1
+6006	2535 1
+6006	2620 1
+6006	3631 1
+6006	3962 1
+6006	4037 1
+6006	4483 1
+6006	4709 1
+6006	4712 1
+6006	4748 1
+6006	4983 1
+6006	5020 1
+6006	5022 1
+6006	5079 1
+6006	5254 1
+6006	5404 1
+6006	5596 1
+6006	5684 1
+6006	5714 1
+6006	5776 1
+6006	5799 1
+6006	5804 1
+6006	5812 1
+6006	5932 1
+6006	6156 1
+6006	6272 1
+6006	6320 1
+6006	6323 1
+6006	6327 1
+6006	6334 1
+6006	6437 1
+6006	6441 1
+6006	6458 1
+6006	6481 1
+6006	6496 1
+6006	6505 1
+6006	6576 1
+6006	6613 1
+6006	6634 1
+6006	6641 1
+6006	6700 1
+6006	6783 1
+6006	6907 1
+6006	6914 1
+6006	6918 1
+6006	6945 1
+6006	7052 1
+6006	7092 1
+6006	7108 1
+6006	7233 1
+6006	7279 1
+6006	7280 1
+6006	7341 1
+6006	7422 1
+6006	7443 1
+6006	7478 1
+6006	7510 1
+6006	7553 1
+6006	7699 1
+6006	7803 1
+6006	7810 1
+6006	7979 1
+6006	7992 1
+6006	8209 1
+6006	8224 1
+6004	1159 1
+6004	2940 1
+6004	5233 1
+6004	5484 1
+6004	5529 1
+6004	6832 1
+6007	1159 1
+6007	3498 1
+6007	5103 1
+6007	6080 1
+6007	6094 1
+6007	6496 1
+6013	4175 1
+6013	6496 1
+6013	7890 1
+4409	4175 1
+4409	6043 1
+4409	6306 1
+4409	6496 1
+4409	7890 1
+4409	7924 1
+4409	8275 1
+6014	4175 1
+6015	4175 1
+6015	6496 1
+6015	7890 1
+6016	3238 1
+6016	4071 1
+6016	4175 1
+6016	6496 1
+6016	6780 1
+6016	6914 1
+6016	7092 1
+6016	7833 1
+6016	8134 1
+6016	8174 1
+6017	2774 1
+6017	4175 1
+6018	4175 1
+6019	4175 1
+6020	15 1
+6020	3015 1
+6020	3498 1
+6020	3873 1
+6020	4310 1
+6020	4435 1
+6020	4940 1
+6020	5079 1
+6020	5178 1
+6020	5262 1
+6020	5529 1
+6020	5545 1
+6020	5624 1
+6020	5671 1
+6020	6021 1
+6020	6166 1
+6020	6226 1
+6020	6255 1
+6020	6980 1
+6020	7052 1
+6020	7092 1
+6020	7277 1
+6020	7280 1
+6020	7443 1
+6020	7763 1
+6024	15 1
+6024	2160 1
+6024	2433 1
+6024	2658 1
+6024	3334 1
+6024	3459 1
+6024	3634 1
+6024	4037 1
+6024	4712 1
+6024	5335 1
+6024	5902 1
+6024	5936 1
+6024	6218 1
+6024	6251 1
+6024	6337 1
+6024	7131 1
+6024	8295 1
+6022	5936 1
+6023	1972 1
+6023	3479 1
+6023	4715 1
+6023	4786 1
+6023	4994 1
+6023	5233 1
+6023	5263 1
+6023	5415 1
+6023	5439 1
+6023	5479 1
+6023	5638 1
+6023	5799 1
+6023	5814 1
+6023	5936 1
+6023	6006 1
+6023	6161 1
+6023	6218 1
+6023	6261 1
+6023	6327 1
+6023	6407 1
+6023	6417 1
+6023	6432 1
+6023	6435 1
+6023	6437 1
+6023	6441 1
+6023	6462 1
+6023	6474 1
+6023	6481 1
+6023	6511 1
+6023	6528 1
+6002	6025 1
+6026	2765 1
+6026	3334 1
+6026	6682 1
+6028	3643 1
+6030	4041 1
+6031	4041 1
+6031	4875 1
+6032	1403 1
+6032	1549 1
+6032	1982 1
+6032	2565 1
+6032	2658 1
+6032	2851 1
+6032	3726 1
+6032	4037 1
+6032	4041 1
+6032	4071 1
+6032	4361 1
+6032	4432 1
+6032	4709 1
+6032	4764 1
+6032	4944 1
+6032	4981 1
+6032	5002 1
+6032	5148 1
+6032	5199 1
+6032	5210 1
+6032	5246 1
+6032	5529 1
+6032	5543 1
+6032	5563 1
+6032	5739 1
+6032	5800 1
+6032	5806 1
+6032	6006 1
+6032	6097 1
+6032	6123 1
+6032	6243 1
+6032	6327 1
+6032	6328 1
+6032	6347 1
+6032	6414 1
+6032	6442 1
+6032	6529 1
+6032	6555 1
+6032	6618 1
+6032	6634 1
+6032	6665 1
+6032	6700 1
+6032	6736 1
+6032	6765 1
+6032	6769 1
+6032	6774 1
+6032	6784 1
+6032	6832 1
+6032	6875 1
+6032	6901 1
+6032	6913 1
+6032	6918 1
+6032	6930 1
+6032	6946 1
+6032	6955 1
+6032	6980 1
+6032	7050 1
+6032	7063 1
+6032	7092 1
+6032	7116 1
+6032	7131 1
+6032	7201 1
+6032	7233 1
+6032	7238 1
+6032	7280 1
+6032	7295 1
+6032	7351 1
+6032	7386 1
+6032	7397 1
+6032	7400 1
+6032	7544 1
+6032	7553 1
+6032	7618 1
+6032	7833 1
+6032	7839 1
+6032	7908 1
+6032	7921 1
+6032	8042 1
+6032	8121 1
+6032	8192 1
+5978	4041 1
+6033	4041 1
+6034	4041 1
+6036	4041 1
+6037	4041 1
+6035	4041 1
+6029	7699 1
+6029	7890 1
+6038	2440 1
+6038	4748 1
+6038	5188 1
+6038	5829 1
+6038	6029 1
+6038	6634 1
+6039	6029 1
+6042	2276 1
+6043	2276 1
+6043	2658 1
+6043	3015 1
+6043	3084 1
+6043	3310 1
+6043	3498 1
+6043	3962 1
+6043	4310 1
+6043	4341 1
+6043	4781 1
+6043	4828 1
+6043	4981 1
+6043	5103 1
+6043	5121 1
+6043	5210 1
+6043	5262 1
+6043	5437 1
+6043	5524 1
+6043	5543 1
+6043	5545 1
+6043	5624 1
+6043	6124 1
+6043	6148 1
+6043	6523 1
+6043	6560 1
+6043	7092 1
+6043	7280 1
+6043	7400 1
+6043	7443 1
+6043	7544 1
+6043	7694 1
+6043	7726 1
+6043	7757 1
+6043	7788 1
+6043	7795 1
+6043	7839 1
+6043	7961 1
+6043	8037 1
+6043	8174 1
+6044	4310 1
+6044	5484 1
+6045	3334 1
+6045	4310 1
+6045	5773 1
+6045	6041 1
+6045	6946 1
+6045	7378 1
+6045	7553 1
+6046	4310 1
+6046	6044 1
+6047	4310 1
+6047	4488 1
+6047	4713 1
+6047	5800 1
+6048	4310 1
+6049	4310 1
+6049	5210 1
+6049	5811 1
+6050	4310 1
+6051	4310 1
+6052	4310 1
+6053	4310 1
+6056	6059 1
+6057	6059 1
+6058	6059 1
+6060	5543 1
+6061	5543 1
+6062	5543 1
+6062	6098 1
+6063	5543 1
+6064	3919 1
+6064	5543 1
+6064	6780 1
+6064	7517 1
+6066	5524 1
+6070	4828 1
+6070	5524 1
+6070	6098 1
+6071	5524 1
+6071	7632 1
+6071	7803 1
+6072	1498 1
+6072	2223 1
+6072	2658 1
+6072	3293 1
+6072	3297 1
+6072	4037 1
+6072	4507 1
+6072	4940 1
+6072	4983 1
+6072	5246 1
+6072	5421 1
+6072	5524 1
+6072	5529 1
+6072	5614 1
+6072	5806 1
+6072	5818 1
+6072	5819 1
+6072	6004 1
+6072	6044 1
+6072	6241 1
+6072	6422 1
+6072	6634 1
+6072	6914 1
+6072	6946 1
+6072	7047 1
+6072	7092 1
+6072	7225 1
+6072	7544 1
+6072	7620 1
+6072	7707 1
+6072	7778 1
+6072	7833 1
+6072	7890 1
+6072	7908 1
+6072	7910 1
+6072	7924 1
+6072	7927 1
+6072	7946 1
+6072	7979 1
+6072	7992 1
+6072	8002 1
+6072	8037 1
+6072	8042 1
+6072	8044 1
+6072	8068 1
+6072	8073 1
+6072	8083 1
+6072	8122 1
+6072	8128 1
+6072	8141 1
+6072	8163 1
+6072	8168 1
+6072	8212 1
+6072	8224 1
+6067	5524 1
+6068	15 1
+6068	2925 1
+6068	3498 1
+6068	3634 1
+6068	3962 1
+6068	4037 1
+6068	4781 1
+6068	4828 1
+6068	4875 1
+6068	5179 1
+6068	5210 1
+6068	5421 1
+6068	5524 1
+6068	5624 1
+6068	5753 1
+6068	5922 1
+6068	6094 1
+6068	6098 1
+6068	6124 1
+6068	6151 1
+6068	6166 1
+6068	6174 1
+6068	6334 1
+6068	6414 1
+6068	6498 1
+6068	6875 1
+6068	7092 1
+6068	7280 1
+6068	7620 1
+6068	7879 1
+6068	7927 1
+6068	8134 1
+6069	4875 1
+6069	5404 1
+6069	5524 1
+6069	6148 1
+6069	6161 1
+6073	5103 1
+6074	5103 1
+6075	15 1
+6075	3015 1
+6075	3498 1
+6075	3873 1
+6075	4781 1
+6075	4828 1
+6075	4875 1
+6075	5103 1
+6075	5121 1
+6075	5178 1
+6075	5262 1
+6075	5437 1
+6075	5527 1
+6075	5545 1
+6075	5624 1
+6075	5753 1
+6075	5936 1
+6075	6124 1
+6077	6078 1
+6079	6080 1
+6081	5543 1
+6081	5596 1
+6081	6083 1
+6082	2535 1
+6082	2914 1
+6082	3084 1
+6082	4065 1
+6082	4441 1
+6082	5002 1
+6082	5079 1
+6082	5210 1
+6082	5714 1
+6082	5799 1
+6082	6083 1
+6082	6424 1
+6082	6496 1
+6082	6553 1
+6082	6571 1
+6082	6707 1
+6082	6720 1
+6082	6833 1
+6089	6090 1
+6091	4828 1
+6092	4828 1
+6093	2785 1
+6093	4536 1
+6093	4828 1
+6093	6505 1
+6093	6790 1
+6098	7306 1
+6097	2160 1
+6097	3498 1
+6097	4099 1
+6097	5079 1
+6097	5199 1
+6097	5806 1
+6097	5814 1
+6097	5872 1
+6097	5998 1
+6097	6006 1
+6097	6098 1
+6097	6123 1
+6097	6299 1
+6097	6323 1
+6097	6414 1
+6097	6496 1
+6097	6715 1
+6097	6832 1
+6097	7063 1
+6097	7101 1
+6097	7144 1
+6097	7214 1
+6097	7295 1
+6097	7478 1
+6097	7632 1
+6097	7651 1
+6094	4604 1
+6094	4781 1
+6094	5121 1
+6094	5423 1
+6094	5527 1
+6094	5584 1
+6094	5753 1
+6094	5814 1
+6094	6098 1
+6094	6124 1
+6094	6229 1
+6100	6101 1
+6108	5121 1
+6108	5437 1
+6108	5753 1
+6108	6229 1
+6110	6246 1
+6116	4875 1
+6116	5487 1
+6112	4875 1
+6113	4875 1
+6114	4875 1
+6114	4981 1
+6118	2620 1
+6118	4781 1
+6119	4037 1
+6119	4781 1
+6119	5624 1
+6120	4781 1
+6121	4781 1
+6121	5814 1
+6126	5262 1
+6126	5404 1
+6126	5829 1
+6126	6004 1
+6126	6006 1
+6126	6094 1
+6126	6148 1
+6126	6229 1
+6126	6432 1
+6126	6437 1
+6126	6441 1
+6129	6094 1
+6128	6094 1
+6128	6151 1
+6127	5028 1
+6127	5671 1
+6127	6094 1
+6130	6161 1
+6001	15 1
+6001	5121 1
+6001	5871 1
+6001	6327 1
+6001	6596 1
+6133	5037 1
+6133	5121 1
+6133	5437 1
+6133	5545 1
+6134	5121 1
+6134	5254 1
+6134	5423 1
+6134	5814 1
+6134	6296 1
+6134	6306 1
+6134	6739 1
+6135	5121 1
+6135	6161 1
+6141	6148 1
+6142	6148 1
+6143	6148 1
+6144	6148 1
+6145	6148 1
+6146	2535 1
+6146	3614 1
+6146	5178 1
+6146	5545 1
+6146	5804 1
+6146	6006 1
+6146	6148 1
+6146	6337 1
+6146	6571 1
+6147	6148 1
+6151	3498 1
+6151	4037 1
+6151	5022 1
+6151	5624 1
+6151	6618 1
+6151	6780 1
+6151	6832 1
+6151	7301 1
+6151	7587 1
+6151	7620 1
+6151	7624 1
+6151	7632 1
+6151	8134 1
+6150	6151 1
+6152	5437 1
+6153	5437 1
+6155	5404 1
+6158	5404 1
+6156	15 1
+6156	967 1
+6156	2774 1
+6156	3015 1
+6156	4632 1
+6156	4687 1
+6156	5404 1
+6156	5439 1
+6156	5624 1
+6156	5671 1
+6156	5697 1
+6156	5714 1
+6156	5798 1
+6156	6006 1
+6156	6166 1
+6156	6218 1
+6156	6221 1
+6156	6328 1
+6156	6417 1
+6156	6422 1
+6156	6432 1
+6156	7131 1
+6157	15 1
+6157	5404 1
+6157	6164 1
+6160	15 1
+6160	4037 1
+6160	6161 1
+6165	4134 1
+6165	6166 1
+6165	6554 1
+6165	6606 1
+6168	5624 1
+6169	3291 1
+6169	5624 1
+6169	6855 1
+6170	4134 1
+6170	5037 1
+6170	5188 1
+6170	5584 1
+6170	5624 1
+6170	5824 1
+6170	5871 1
+6170	6251 1
+6170	6311 1
+6170	6552 1
+6170	6596 1
+6170	6599 1
+6170	6628 1
+6170	6663 1
+6174	2658 1
+6174	3238 1
+6174	3498 1
+6174	3962 1
+6174	4940 1
+6174	5022 1
+6174	5079 1
+6174	5818 1
+6174	6832 1
+6174	7839 1
+6175	3498 1
+6176	3498 1
+6176	5415 1
+6176	5545 1
+6177	3498 1
+6177	6934 1
+6178	15 1
+6179	15 1
+6179	2440 1
+6179	4065 1
+6179	5584 1
+6179	6496 1
+6179	6897 1
+6179	7788 1
+6180	15 1
+6180	6907 1
+6180	7478 1
+6196	15 1
+6196	2535 1
+6197	15 1
+6197	4980 1
+6181	15 1
+6182	15 1
+6182	4875 1
+6182	6006 1
+6183	15 1
+6184	15 1
+6184	5822 1
+6185	15 1
+6186	15 1
+6187	15 1
+388	15 1
+6188	15 1
+6198	15 1
+6198	2620 1
+6198	3459 1
+6198	4992 1
+6198	5524 1
+6198	5822 1
+6198	5829 1
+6198	6560 1
+6198	6789 1
+6198	6790 1
+6198	6832 1
+6198	6979 1
+6198	7351 1
+6198	7414 1
+6199	15 1
+6200	15 1
+6200	4037 1
+6200	5178 1
+6200	5262 1
+6200	5484 1
+6200	6246 1
+6201	15 1
+6201	2535 1
+6202	15 1
+6202	4037 1
+6202	8134 1
+6203	15 1
+6204	15 1
+6204	1549 1
+6204	5233 1
+6204	5543 1
+6204	5563 1
+6204	5697 1
+6204	5800 1
+6204	5818 1
+6204	6330 1
+6204	6901 1
+6204	6930 1
+6204	8295 1
+6190	15 1
+6190	5254 1
+6190	6833 1
+6205	15 1
+6206	15 1
+6207	15 1
+6207	2535 1
+6207	4099 1
+6207	4687 1
+6191	15 1
+6192	15 1
+6192	6262 1
+6208	15 1
+6208	5254 1
+6208	6805 1
+6193	15 1
+6212	4435 1
+6212	5545 1
+6212	7835 1
+6213	5545 1
+6213	5824 1
+6213	6229 1
+6214	5545 1
+6215	5545 1
+6216	4099 1
+6216	5626 1
+6216	6458 1
+6216	6481 1
+6216	7624 1
+6217	1352 1
+6217	2620 1
+6217	3291 1
+6217	3792 1
+6217	3842 1
+6217	3919 1
+6217	4065 1
+6217	4099 1
+6217	4709 1
+6217	4712 1
+6217	5210 1
+6217	5254 1
+6217	5273 1
+6217	5584 1
+6217	5626 1
+6217	6156 1
+6217	6327 1
+6217	6388 1
+6217	6441 1
+6217	6458 1
+6217	6496 1
+6217	6498 1
+6217	6552 1
+6217	6566 1
+6217	6594 1
+6217	6599 1
+6217	6600 1
+6217	6665 1
+6217	6720 1
+6217	6725 1
+6217	6783 1
+6218	840 1
+6218	1026 1
+6218	1982 1
+6218	3334 1
+6218	3459 1
+6218	3962 1
+6218	4037 1
+6218	4401 1
+6218	4536 1
+6218	4712 1
+6218	4795 1
+6218	4798 1
+6218	4940 1
+6218	4981 1
+6218	4994 1
+6218	5022 1
+6218	5079 1
+6218	5210 1
+6218	5254 1
+6218	5605 1
+6218	5626 1
+6218	5798 1
+6218	5799 1
+6218	5806 1
+6218	5807 1
+6218	5811 1
+6218	5814 1
+6218	5897 1
+6218	5902 1
+6218	6006 1
+6218	6032 1
+6218	6043 1
+6218	6299 1
+6218	6327 1
+6218	6432 1
+6218	6555 1
+6218	6594 1
+6218	6634 1
+6218	6784 1
+6218	6913 1
+6218	6914 1
+6218	7063 1
+6218	7092 1
+6218	7168 1
+6218	7553 1
+6218	7587 1
+6218	7620 1
+6218	7632 1
+6218	7809 1
+6218	7835 1
+6218	7910 1
+6218	7961 1
+6218	8121 1
+6219	5626 1
+6219	5950 1
+6219	6170 1
+6219	6723 1
+6220	3634 1
+6220	3803 1
+6220	4713 1
+6220	4717 1
+6220	5012 1
+6220	5177 1
+6220	5178 1
+6220	5254 1
+6220	5335 1
+6220	5384 1
+6220	5479 1
+6220	6006 1
+6220	6262 1
+6220	6299 1
+6220	6634 1
+6220	6715 1
+6220	8246 1
+6220	8297 1
+6224	5262 1
+6221	938 1
+6221	3297 1
+6221	3962 1
+6221	4037 1
+6221	4071 1
+6221	4341 1
+6221	5254 1
+6221	5262 1
+6221	5529 1
+6221	5605 1
+6221	5643 1
+6221	5738 1
+6221	5760 1
+6221	5814 1
+6221	5835 1
+6221	6296 1
+6221	6306 1
+6221	6613 1
+6221	6715 1
+6221	6780 1
+6221	7050 1
+6221	7059 1
+6221	7092 1
+6221	7414 1
+6221	7478 1
+6221	7517 1
+6221	7561 1
+6221	7620 1
+6221	7632 1
+6221	7809 1
+6221	7839 1
+6222	5262 1
+6223	2285 1
+6223	2440 1
+6223	2620 1
+6223	4717 1
+6223	4791 1
+6223	5233 1
+6223	5254 1
+6223	5262 1
+6223	5684 1
+6223	6006 1
+6223	6156 1
+6223	6306 1
+6223	6388 1
+6223	6437 1
+6223	6554 1
+6223	6570 1
+6223	6632 1
+6229	840 1
+6229	3238 1
+6229	4037 1
+6229	5012 1
+6229	5543 1
+6229	5714 1
+6229	6227 1
+6229	6330 1
+6229	6566 1
+6229	6714 1
+6229	6784 1
+6229	6833 1
+6229	7092 1
+6229	7301 1
+6229	7478 1
+6229	7544 1
+6229	7649 1
+6229	7946 1
+6229	8212 1
+6227	6229 1
+6227	8212 1
+6230	6229 1
+6230	6407 1
+6228	6229 1
+6232	5263 1
+6232	5804 1
+6232	6218 1
+6236	5415 1
+6239	3873 1
+6239	5760 1
+6239	6218 1
+6239	6306 1
+6239	6432 1
+6240	3873 1
+6241	1026 1
+6241	1403 1
+6241	2565 1
+6241	2851 1
+6241	3238 1
+6241	3291 1
+6241	3634 1
+6241	3873 1
+6241	3962 1
+6241	3969 1
+6241	4341 1
+6241	4507 1
+6241	4632 1
+6241	4983 1
+6241	5002 1
+6241	5178 1
+6241	5289 1
+6241	5393 1
+6241	5465 1
+6241	5563 1
+6241	5671 1
+6241	5760 1
+6241	5806 1
+6241	5814 1
+6241	5822 1
+6241	5872 1
+6241	6097 1
+6241	6123 1
+6241	6299 1
+6241	6417 1
+6241	6424 1
+6241	6442 1
+6241	6496 1
+6241	6505 1
+6241	6555 1
+6241	6665 1
+6241	6715 1
+6241	6784 1
+6241	6790 1
+6241	6832 1
+6241	6860 1
+6241	6976 1
+6241	7021 1
+6241	7052 1
+6241	7059 1
+6241	7092 1
+6241	7116 1
+6241	7237 1
+6241	7277 1
+6241	7280 1
+6241	7362 1
+6241	7381 1
+6241	7400 1
+6241	7414 1
+6241	7443 1
+6241	7497 1
+6241	7561 1
+6241	7590 1
+6241	7593 1
+6241	7604 1
+6241	7620 1
+6241	7632 1
+6241	7651 1
+6241	7662 1
+6241	7694 1
+6241	7695 1
+6241	7763 1
+6241	7819 1
+6241	7855 1
+6241	7908 1
+6241	7961 1
+6241	8042 1
+6241	8051 1
+6241	8212 1
+6241	8219 1
+6242	3873 1
+6242	5524 1
+6242	6251 1
+6242	6892 1
+6242	6930 1
+6244	6246 1
+6245	2565 1
+6245	5465 1
+6245	5487 1
+6245	6023 1
+6245	6246 1
+6245	7116 1
+6245	7587 1
+6245	7632 1
+6243	2160 1
+6243	3752 1
+6243	4483 1
+6243	4604 1
+6243	4712 1
+6243	5002 1
+6243	5079 1
+6243	5254 1
+6243	5484 1
+6243	5739 1
+6243	5800 1
+6243	5829 1
+6243	5839 1
+6243	5871 1
+6243	5872 1
+6243	5902 1
+6243	5998 1
+6243	6000 1
+6243	6123 1
+6243	6246 1
+6243	6414 1
+6243	6501 1
+6243	6606 1
+6243	6628 1
+6243	6634 1
+6243	6665 1
+6243	6700 1
+6243	6774 1
+6243	6832 1
+6243	7092 1
+6243	7414 1
+6243	7632 1
+6243	7699 1
+6243	7809 1
+6243	8297 1
+6247	5178 1
+6248	1972 1
+6248	3634 1
+6248	4536 1
+6248	4717 1
+6248	5178 1
+6248	5233 1
+6248	5335 1
+6248	6337 1
+6248	6554 1
+6248	6570 1
+6252	6255 1
+6252	7813 1
+6253	6255 1
+6254	6255 1
+6258	6259 1
+6262	5200 1
+6263	5335 1
+6263	5423 1
+6263	6023 1
+6263	6262 1
+6264	6262 1
+6265	6262 1
+6266	6267 1
+6270	1982 1
+6270	2851 1
+6270	2914 1
+6270	3291 1
+6270	3334 1
+6270	3346 1
+6270	3459 1
+6270	3634 1
+6270	3803 1
+6270	3885 1
+6270	4009 1
+6270	4037 1
+6270	4099 1
+6270	4134 1
+6270	4218 1
+6270	4361 1
+6270	4507 1
+6270	4687 1
+6270	4944 1
+6270	5012 1
+6270	5233 1
+6270	5288 1
+6270	5524 1
+6270	5543 1
+6270	5563 1
+6270	5697 1
+6270	5714 1
+6270	5739 1
+6270	5773 1
+6270	5799 1
+6270	5800 1
+6270	5811 1
+6270	5814 1
+6270	5829 1
+6270	5932 1
+6270	5980 1
+6270	6001 1
+6270	6006 1
+6270	6097 1
+6270	6123 1
+6270	6198 1
+6270	6272 1
+6270	6299 1
+6270	6305 1
+6270	6327 1
+6270	6328 1
+6270	6417 1
+6270	6424 1
+6270	6441 1
+6270	6462 1
+6270	6464 1
+6270	6474 1
+6270	6496 1
+6270	6503 1
+6270	6505 1
+6270	6560 1
+6270	6596 1
+6270	6714 1
+6270	6736 1
+6270	6765 1
+6270	6770 1
+6270	6772 1
+6270	6789 1
+6270	6832 1
+6270	6869 1
+6270	6873 1
+6270	6901 1
+6270	6913 1
+6270	6930 1
+6270	6942 1
+6270	6946 1
+6270	6953 1
+6270	6955 1
+6270	6979 1
+6270	6994 1
+6270	7161 1
+6270	7185 1
+6270	7257 1
+6270	7304 1
+6270	7319 1
+6270	7323 1
+6270	7341 1
+6270	7351 1
+6270	7381 1
+6270	7397 1
+6270	7414 1
+6270	7442 1
+6270	8295 1
+6271	2440 1
+6271	4715 1
+6271	5188 1
+6271	5200 1
+6271	5799 1
+6271	6505 1
+6271	6571 1
+6271	6634 1
+6271	6809 1
+6271	6813 1
+6271	8295 1
+6272	1403 1
+6272	1549 1
+6272	1823 1
+6272	1982 1
+6272	2160 1
+6272	2440 1
+6272	2620 1
+6272	3334 1
+6272	3459 1
+6272	3634 1
+6272	4099 1
+6272	4361 1
+6272	4536 1
+6272	4666 1
+6272	4717 1
+6272	4940 1
+6272	4944 1
+6272	5020 1
+6272	5079 1
+6272	5188 1
+6272	5210 1
+6272	5233 1
+6272	5254 1
+6272	5543 1
+6272	5596 1
+6272	5697 1
+6272	5739 1
+6272	5800 1
+6272	5806 1
+6272	5811 1
+6272	5819 1
+6272	5822 1
+6272	5827 1
+6272	5839 1
+6272	5871 1
+6272	5902 1
+6272	5933 1
+6272	6000 1
+6272	6043 1
+6272	6047 1
+6272	6097 1
+6272	6123 1
+6272	6305 1
+6272	6501 1
+6272	6523 1
+6272	6554 1
+6272	6606 1
+6272	6634 1
+6272	6665 1
+6272	6714 1
+6272	6736 1
+6272	6774 1
+6272	6832 1
+6272	6914 1
+6272	6946 1
+6272	6955 1
+6272	6976 1
+6272	6979 1
+6272	7052 1
+6272	7092 1
+6272	7279 1
+6272	7414 1
+6272	7478 1
+6272	7510 1
+6272	7553 1
+6272	7620 1
+6272	7632 1
+6272	7662 1
+6272	7699 1
+6272	7839 1
+6272	7882 1
+6272	7908 1
+6272	7924 1
+6272	8051 1
+6272	8073 1
+6272	8295 1
+6273	8295 1
+6274	1026 1
+6274	3459 1
+6274	6032 1
+6274	6044 1
+6274	7649 1
+6274	7788 1
+6274	7835 1
+6274	7992 1
+6274	8295 1
+6275	8295 1
+6276	8295 1
+6282	5335 1
+6280	938 1
+6280	1403 1
+6280	2565 1
+6280	2851 1
+6280	2940 1
+6280	3334 1
+6280	3726 1
+6280	3885 1
+6280	4361 1
+6280	4884 1
+6280	5028 1
+6280	5199 1
+6280	5233 1
+6280	5289 1
+6280	5335 1
+6280	5404 1
+6280	5760 1
+6280	5773 1
+6280	5800 1
+6280	5806 1
+6280	5897 1
+6280	5902 1
+6280	6123 1
+6280	6299 1
+6280	6442 1
+6280	6503 1
+6280	6736 1
+6280	6789 1
+6280	6832 1
+6280	6946 1
+6280	7054 1
+6280	7088 1
+6280	7116 1
+6280	7131 1
+6280	7279 1
+6280	7295 1
+6280	7351 1
+6280	7362 1
+6280	7373 1
+6280	7378 1
+6280	7381 1
+6280	7414 1
+6280	7442 1
+6280	7450 1
+6280	7478 1
+6280	7497 1
+6280	7512 1
+6280	7529 1
+6280	7587 1
+6280	7618 1
+6280	7620 1
+6280	7632 1
+6281	5335 1
+6286	2535 1
+6286	4483 1
+6286	5423 1
+6287	5423 1
+6288	5423 1
+6291	6296 1
+6292	6296 1
+6293	6296 1
+6294	6296 1
+6297	6296 1
+6295	2565 1
+6295	5814 1
+6295	6296 1
+6299	840 1
+6299	1026 1
+6299	1493 1
+6299	2160 1
+6299	2535 1
+6299	2565 1
+6299	2774 1
+6299	3238 1
+6299	3334 1
+6299	4361 1
+6299	4536 1
+6299	4713 1
+6299	4798 1
+6299	5020 1
+6299	5199 1
+6299	5421 1
+6299	5524 1
+6299	5582 1
+6299	5596 1
+6299	5697 1
+6299	5760 1
+6299	5773 1
+6299	5776 1
+6299	5802 1
+6299	5804 1
+6299	5806 1
+6299	5814 1
+6299	5829 1
+6299	5897 1
+6299	6006 1
+6299	6097 1
+6299	6170 1
+6299	6198 1
+6299	6218 1
+6299	6270 1
+6299	6305 1
+6299	6306 1
+6299	6330 1
+6299	6334 1
+6299	6337 1
+6299	6400 1
+6299	6414 1
+6299	6417 1
+6299	6496 1
+6299	6505 1
+6299	6523 1
+6299	6555 1
+6299	6596 1
+6299	6624 1
+6299	6634 1
+6299	6665 1
+6299	6714 1
+6299	6715 1
+6299	6720 1
+6299	6736 1
+6299	6739 1
+6299	6755 1
+6299	6783 1
+6299	6784 1
+6299	6788 1
+6299	6789 1
+6299	6832 1
+6299	6833 1
+6299	6901 1
+6299	6907 1
+6299	6934 1
+6299	6953 1
+6299	6979 1
+6299	7185 1
+6299	7295 1
+6299	7351 1
+6299	7359 1
+6299	7553 1
+6299	7587 1
+6299	7620 1
+6299	7632 1
+6299	7688 1
+6299	8297 1
+6301	6302 1
+6304	6306 1
+6305	840 1
+6305	1493 1
+6305	1549 1
+6305	1972 1
+6305	1982 1
+6305	2160 1
+6305	2285 1
+6305	2433 1
+6305	2440 1
+6305	2511 1
+6305	2620 1
+6305	2785 1
+6305	2851 1
+6305	2914 1
+6305	3084 1
+6305	3291 1
+6305	3297 1
+6305	3310 1
+6305	3459 1
+6305	3479 1
+6305	3631 1
+6305	3634 1
+6305	3770 1
+6305	3803 1
+6305	3842 1
+6305	3885 1
+6305	3919 1
+6305	4037 1
+6305	4099 1
+6305	4361 1
+6305	4412 1
+6305	4441 1
+6305	4507 1
+6305	4687 1
+6305	4709 1
+6305	4712 1
+6305	4713 1
+6305	4717 1
+6305	4764 1
+6305	4786 1
+6305	4795 1
+6305	4994 1
+6305	5002 1
+6305	5022 1
+6305	5037 1
+6305	5079 1
+6305	5140 1
+6305	5179 1
+6305	5188 1
+6305	5199 1
+6305	5210 1
+6305	5233 1
+6305	5246 1
+6305	5254 1
+6305	5273 1
+6305	5288 1
+6305	5321 1
+6305	5404 1
+6305	5479 1
+6305	5524 1
+6305	5543 1
+6305	5563 1
+6305	5584 1
+6305	5596 1
+6305	5605 1
+6305	5614 1
+6305	5697 1
+6305	5714 1
+6305	5738 1
+6305	5739 1
+6305	5760 1
+6305	5773 1
+6305	5799 1
+6305	5801 1
+6305	5814 1
+6305	5824 1
+6305	5827 1
+6305	5829 1
+6305	5887 1
+6305	5922 1
+6305	5933 1
+6305	5950 1
+6305	5980 1
+6305	5998 1
+6305	6004 1
+6305	6006 1
+6305	6032 1
+6305	6044 1
+6305	6047 1
+6305	6156 1
+6305	6170 1
+6305	6218 1
+6305	6221 1
+6305	6227 1
+6305	6299 1
+6305	6306 1
+6305	6311 1
+6305	6323 1
+6305	6327 1
+6305	6330 1
+6305	6347 1
+6305	6388 1
+6305	6414 1
+6305	6417 1
+6305	6424 1
+6305	6441 1
+6305	6458 1
+6305	6462 1
+6305	6474 1
+6305	6481 1
+6305	6498 1
+6305	6503 1
+6305	6505 1
+6305	6511 1
+6305	6523 1
+6305	6528 1
+6305	6529 1
+6305	6532 1
+6305	6543 1
+6305	6552 1
+6305	6553 1
+6305	6560 1
+6305	6566 1
+6305	6589 1
+6305	6590 1
+6305	6594 1
+6305	6595 1
+6305	6599 1
+6305	6613 1
+6305	6624 1
+6305	6632 1
+6305	6634 1
+6305	6665 1
+6305	6699 1
+6305	6700 1
+6305	6714 1
+6305	6715 1
+6305	6720 1
+6305	6725 1
+6305	6759 1
+6305	6770 1
+6305	6777 1
+6305	6780 1
+6305	6783 1
+6305	6784 1
+6305	6789 1
+6305	6790 1
+6305	6803 1
+6305	6850 1
+6305	6855 1
+6305	6860 1
+6305	6875 1
+6305	6918 1
+6305	6930 1
+6305	6934 1
+6305	6979 1
+6305	6994 1
+6305	7073 1
+6305	7108 1
+6305	7144 1
+6305	7233 1
+6305	7277 1
+6305	7279 1
+6305	7295 1
+6305	7301 1
+6305	7373 1
+6305	7378 1
+6305	7491 1
+6305	7517 1
+6305	7544 1
+6305	7553 1
+6305	7620 1
+6305	7778 1
+6305	7795 1
+6305	7810 1
+6305	7860 1
+6305	7874 1
+6305	7913 1
+6305	7928 1
+6305	7965 1
+6305	8037 1
+6305	8043 1
+6305	8044 1
+6305	8128 1
+6305	8134 1
+6305	8139 1
+6305	8141 1
+6305	8149 1
+6305	8219 1
+6305	8297 1
+6311	7047 1
+6312	4798 1
+6312	5233 1
+6312	6334 1
+6313	5233 1
+6313	6004 1
+6314	1823 1
+6314	2620 1
+6314	4791 1
+6314	5210 1
+6314	5233 1
+6314	6156 1
+6314	6501 1
+6314	6663 1
+6314	6765 1
+6314	8002 1
+6315	5233 1
+6319	4791 1
+6319	5233 1
+6320	3291 1
+6320	3969 1
+6320	4715 1
+6320	5079 1
+6320	5563 1
+6320	5804 1
+6320	6006 1
+6320	6321 1
+6320	6388 1
+6320	6414 1
+6320	6505 1
+6320	6530 1
+6320	6809 1
+6320	6869 1
+6320	6873 1
+6320	7092 1
+6320	7214 1
+6320	7225 1
+6320	7237 1
+6320	7646 1
+6320	7809 1
+6320	7979 1
+6320	8168 1
+6323	1972 1
+6323	2851 1
+6323	3291 1
+6323	3334 1
+6323	3459 1
+6323	4134 1
+6323	4483 1
+6323	4764 1
+6323	5200 1
+6323	5233 1
+6323	5254 1
+6323	5432 1
+6323	5524 1
+6323	5543 1
+6323	5563 1
+6323	5596 1
+6323	5614 1
+6323	5697 1
+6323	5739 1
+6323	5800 1
+6323	5811 1
+6323	5829 1
+6323	5902 1
+6323	6327 1
+6323	6417 1
+6323	6481 1
+6323	6505 1
+6323	6528 1
+6323	6555 1
+6323	6783 1
+6323	6784 1
+6323	6789 1
+6323	6832 1
+6323	6869 1
+6323	6930 1
+6323	6976 1
+6323	6979 1
+6323	7378 1
+6323	7381 1
+6323	7414 1
+6323	7510 1
+6323	7553 1
+6323	7620 1
+6323	7839 1
+6132	5200 1
+6132	6950 1
+6317	2774 1
+6317	3479 1
+6317	4980 1
+6317	5200 1
+6317	6432 1
+6324	2774 1
+6324	3614 1
+6324	4712 1
+6324	4798 1
+6324	5200 1
+6324	5584 1
+6325	4483 1
+6325	5200 1
+6325	5254 1
+6325	6595 1
+6325	6979 1
+6326	4483 1
+6326	5200 1
+6334	3792 1
+6334	5233 1
+6334	6006 1
+6334	6330 1
+6330	6334 1
+6331	6156 1
+6331	6334 1
+6331	8134 1
+6332	6334 1
+6333	6334 1
+6333	7965 1
+6339	6218 1
+6339	6328 1
+6339	6340 1
+6344	1352 1
+6344	5827 1
+6346	1549 1
+6346	2774 1
+6346	3792 1
+6346	3919 1
+6346	4604 1
+6346	5002 1
+6346	5295 1
+6346	5596 1
+6346	6004 1
+6346	6554 1
+6346	6560 1
+6346	6624 1
+6346	6739 1
+6346	6777 1
+6346	6789 1
+6346	6869 1
+6346	7052 1
+6347	2774 1
+6347	4709 1
+6347	5289 1
+6347	5773 1
+6347	6006 1
+6347	6496 1
+6347	7862 1
+6347	7912 1
+6347	7979 1
+6347	8174 1
+6347	8192 1
+6348	2774 1
+6349	2774 1
+6350	2774 1
+4406	2535 1
+5995	2535 1
+5995	4687 1
+6355	2535 1
+6356	2535 1
+6356	5714 1
+6359	1352 1
+6359	1549 1
+6359	2433 1
+6359	3726 1
+6359	3792 1
+6359	3830 1
+6359	4037 1
+6359	4065 1
+6359	4488 1
+6359	4536 1
+6359	4604 1
+6359	4712 1
+6359	4713 1
+6359	4715 1
+6359	4764 1
+6359	4791 1
+6359	4980 1
+6359	5002 1
+6359	5037 1
+6359	5079 1
+6359	5188 1
+6359	5199 1
+6359	5254 1
+6359	5295 1
+6359	5524 1
+6359	5563 1
+6359	5596 1
+6359	5697 1
+6359	5714 1
+6359	5739 1
+6359	5802 1
+6359	5814 1
+6359	5822 1
+6359	5827 1
+6359	5829 1
+6359	5871 1
+6359	6001 1
+6359	6097 1
+6359	6170 1
+6359	6221 1
+6359	6227 1
+6359	6272 1
+6359	6299 1
+6359	6327 1
+6359	6347 1
+6359	6388 1
+6359	6491 1
+6359	6496 1
+6359	6501 1
+6359	6503 1
+6359	6555 1
+6359	6560 1
+6359	6600 1
+6359	6624 1
+6359	6634 1
+6359	6665 1
+6359	6699 1
+6359	6720 1
+6359	6739 1
+6359	6765 1
+6359	6772 1
+6359	6774 1
+6359	6784 1
+6359	6832 1
+6359	6840 1
+6359	6855 1
+6359	6860 1
+6359	6869 1
+6359	6873 1
+6359	6901 1
+6359	6913 1
+6359	6930 1
+6359	6934 1
+6359	6976 1
+6359	7073 1
+6359	7108 1
+6359	7214 1
+6359	7246 1
+6359	7257 1
+6359	7961 1
+6359	8297 1
+6360	840 1
+6360	3346 1
+6360	3479 1
+6360	3614 1
+6360	3809 1
+6360	4037 1
+6360	4687 1
+6360	4715 1
+6360	4798 1
+6360	4980 1
+6360	5012 1
+6360	5384 1
+6360	5484 1
+6360	5798 1
+6360	5804 1
+6360	5922 1
+6360	6218 1
+6360	6327 1
+6360	6337 1
+6360	6388 1
+6360	6414 1
+6360	6417 1
+6360	6560 1
+6360	6736 1
+6360	6994 1
+6360	7054 1
+6360	7073 1
+6360	7074 1
+6360	7108 1
+6360	7119 1
+6360	7143 1
+6360	7144 1
+6360	7214 1
+6360	7323 1
+6360	7442 1
+6298	4798 1
+6298	5254 1
+6298	5709 1
+6298	6328 1
+6298	6400 1
+6298	6409 1
+6298	7632 1
+6366	6328 1
+6351	6218 1
+6371	6218 1
+6374	5804 1
+6375	5804 1
+6377	3459 1
+6377	4713 1
+6377	4764 1
+6377	5288 1
+6377	5321 1
+6377	5596 1
+6377	5798 1
+6377	5829 1
+6377	5871 1
+6377	6347 1
+6377	6388 1
+6377	6665 1
+6377	6770 1
+6377	6783 1
+6377	6833 1
+6377	6850 1
+6377	6855 1
+6378	5798 1
+6378	6739 1
+6379	4798 1
+6380	2223 1
+6380	4401 1
+6380	4798 1
+6380	6897 1
+6381	2433 1
+6381	4798 1
+6381	6850 1
+6327	840 1
+6327	1403 1
+6327	1823 1
+6327	1982 1
+6327	2285 1
+6327	2620 1
+6327	2785 1
+6327	2851 1
+6327	3346 1
+6327	3459 1
+6327	3631 1
+6327	3726 1
+6327	3792 1
+6327	3803 1
+6327	3809 1
+6327	4037 1
+6327	4441 1
+6327	4536 1
+6327	4689 1
+6327	4712 1
+6327	4713 1
+6327	4786 1
+6327	4798 1
+6327	4944 1
+6327	5002 1
+6327	5012 1
+6327	5188 1
+6327	5199 1
+6327	5210 1
+6327	5254 1
+6327	5288 1
+6327	5295 1
+6327	5384 1
+6327	5404 1
+6327	5479 1
+6327	5484 1
+6327	5582 1
+6327	5697 1
+6327	5714 1
+6327	5772 1
+6327	5773 1
+6327	5776 1
+6327	5800 1
+6327	5807 1
+6327	5814 1
+6327	5818 1
+6327	5822 1
+6327	5824 1
+6327	5827 1
+6327	5829 1
+6327	5922 1
+6327	5932 1
+6327	5998 1
+6327	6001 1
+6327	6006 1
+6327	6097 1
+6327	6270 1
+6327	6299 1
+6327	6323 1
+6327	6347 1
+6327	6388 1
+6327	6414 1
+6327	6432 1
+6327	6437 1
+6327	6462 1
+6327	6501 1
+6327	6503 1
+6327	6560 1
+6327	6595 1
+6327	6624 1
+6327	6634 1
+6327	6665 1
+6327	6670 1
+6327	6715 1
+6327	6720 1
+6327	6724 1
+6327	6736 1
+6327	6765 1
+6327	6783 1
+6327	6784 1
+6327	6805 1
+6327	6832 1
+6327	6833 1
+6327	6869 1
+6327	6873 1
+6327	6901 1
+6327	6913 1
+6327	6917 1
+6327	6976 1
+6327	6979 1
+6327	6994 1
+6327	7040 1
+6327	7074 1
+6327	7094 1
+6327	7101 1
+6327	7108 1
+6327	7115 1
+6327	7119 1
+6327	7143 1
+6327	7144 1
+6327	7168 1
+6327	7214 1
+6327	7215 1
+6327	7246 1
+6327	7295 1
+6327	7319 1
+6327	7323 1
+6327	8297 1
+6383	967 1
+6383	4483 1
+6383	7855 1
+6387	6388 1
+5965	4037 1
+5965	5254 1
+5965	6337 1
+6389	6337 1
+6391	6400 1
+6392	6400 1
+6393	6400 1
+6394	1972 1
+6394	3634 1
+6394	4994 1
+6394	6006 1
+6394	6400 1
+6394	6529 1
+6394	6571 1
+6394	6634 1
+6399	6400 1
+6395	6400 1
+6396	6400 1
+6397	6400 1
+6398	4507 1
+6398	4709 1
+6398	5002 1
+6398	5714 1
+6398	5814 1
+6398	5871 1
+6398	6270 1
+6398	6400 1
+6398	6555 1
+6398	6770 1
+6398	6774 1
+6398	6833 1
+6398	6850 1
+6398	6869 1
+6398	6892 1
+6398	6955 1
+6398	7040 1
+6398	7185 1
+6398	7225 1
+6398	7243 1
+6398	7254 1
+6398	7553 1
+6398	7620 1
+6398	7763 1
+6398	8073 1
+6398	8224 1
+6398	8235 1
+6398	8249 1
+6398	8297 1
+6406	6407 1
+6406	6770 1
+6408	6409 1
+6408	7144 1
+6408	7149 1
+6410	4687 1
+6411	4687 1
+6412	4687 1
+6413	4687 1
+6414	2565 1
+6414	4037 1
+6414	5022 1
+6414	5582 1
+6414	6560 1
+6414	6567 1
+6414	6571 1
+6414	6634 1
+6414	6913 1
+6414	6914 1
+6414	6918 1
+6414	7021 1
+6414	7116 1
+6414	7553 1
+6414	7574 1
+6414	7587 1
+6414	7620 1
+6414	7632 1
+6414	7839 1
+6414	7874 1
+6414	8178 1
+6415	2620 1
+6415	6417 1
+6415	7054 1
+6415	7510 1
+6416	6327 1
+6416	6417 1
+6422	4712 1
+6422	5020 1
+6422	5697 1
+6422	5822 1
+6422	6560 1
+6422	6634 1
+6422	6762 1
+6422	6770 1
+6422	6983 1
+6422	7063 1
+6422	7809 1
+6421	1982 1
+6421	3084 1
+6421	3919 1
+6421	5210 1
+6421	5295 1
+6421	5543 1
+6421	5697 1
+6421	5807 1
+6421	5829 1
+6421	5839 1
+6421	5922 1
+6421	6001 1
+6421	6388 1
+6421	6422 1
+6421	6523 1
+6421	6634 1
+6421	6670 1
+6421	6805 1
+6421	6934 1
+6421	6993 1
+6421	7393 1
+6421	7701 1
+6421	7928 1
+6423	5738 1
+6424	5738 1
+6424	6481 1
+6426	6427 1
+6429	5439 1
+6428	1972 1
+6428	5439 1
+6428	6498 1
+6430	6432 1
+6431	6432 1
+6436	6004 1
+6436	6437 1
+6436	6803 1
+6439	6441 1
+6440	4099 1
+6440	5254 1
+6440	6441 1
+6442	3238 1
+6442	6006 1
+6442	7567 1
+6442	7620 1
+6443	1026 1
+6443	2160 1
+6443	2433 1
+6443	2565 1
+6443	2620 1
+6443	2785 1
+6443	2851 1
+6443	3084 1
+6443	3238 1
+6443	3310 1
+6443	3334 1
+6443	3459 1
+6443	4037 1
+6443	4071 1
+6443	4099 1
+6443	4134 1
+6443	4361 1
+6443	5002 1
+6443	5020 1
+6443	5022 1
+6443	5210 1
+6443	5233 1
+6443	5254 1
+6443	5321 1
+6443	5697 1
+6443	5800 1
+6443	5902 1
+6443	5932 1
+6443	6006 1
+6443	6151 1
+6443	6156 1
+6443	6270 1
+6443	6299 1
+6443	6320 1
+6443	6388 1
+6443	6523 1
+6443	6560 1
+6443	6600 1
+6443	6634 1
+6443	6789 1
+6443	6832 1
+6443	6855 1
+6443	6913 1
+6443	6914 1
+6443	6918 1
+6443	7050 1
+6443	7054 1
+6443	7108 1
+6443	7115 1
+6443	7131 1
+6443	7168 1
+6443	7214 1
+6443	7238 1
+6443	7301 1
+6443	7510 1
+6443	7517 1
+6443	7553 1
+6443	7587 1
+6443	7620 1
+6443	7632 1
+6443	7646 1
+6443	7699 1
+6443	7788 1
+6443	7795 1
+6443	7833 1
+6443	7890 1
+6443	7924 1
+6443	8134 1
+6443	8141 1
+6443	8224 1
+6444	6006 1
+6448	6006 1
+6445	4037 1
+6445	5933 1
+6445	6006 1
+6445	6914 1
+6445	7855 1
+6445	7912 1
+6445	7927 1
+850	1026 1
+850	6006 1
+850	7400 1
+850	7632 1
+6446	6006 1
+6447	1352 1
+6447	4099 1
+6447	4712 1
+6447	5824 1
+6447	6006 1
+6447	6170 1
+6447	6474 1
+6447	6481 1
+6447	6498 1
+6447	6501 1
+6447	6554 1
+6447	6594 1
+6458	1352 1
+6458	2160 1
+6458	4037 1
+6458	4099 1
+6458	4488 1
+6458	4709 1
+6458	5028 1
+6458	5273 1
+6458	5543 1
+6458	5760 1
+6458	5818 1
+6458	6000 1
+6458	6004 1
+6458	6330 1
+6458	6600 1
+6458	6606 1
+6458	6613 1
+6458	6670 1
+6458	6869 1
+6458	6907 1
+6458	6930 1
+6458	7073 1
+6458	7108 1
+6458	7115 1
+6458	7225 1
+6458	7386 1
+6458	7855 1
+6458	8163 1
+6450	6458 1
+6451	6458 1
+6452	6458 1
+6452	8297 1
+6453	6458 1
+6454	6458 1
+6455	6458 1
+6456	5714 1
+6456	6458 1
+6456	6930 1
+6457	6458 1
+6457	8141 1
+6459	6458 1
+6459	7108 1
+6461	155 1
+6461	967 1
+6461	2565 1
+6461	4361 1
+6461	6327 1
+6461	6715 1
+6462	1972 1
+6462	6327 1
+6462	6511 1
+6466	6424 1
+6467	1352 1
+6467	2620 1
+6467	4712 1
+6467	4717 1
+6467	4994 1
+6467	5254 1
+6467	6156 1
+6467	6424 1
+6468	6424 1
+6469	2620 1
+6469	6424 1
+6470	6472 1
+6471	1982 1
+6471	6472 1
+6471	6511 1
+6471	6790 1
+6471	7040 1
+6474	7649 1
+6477	4099 1
+6479	2620 1
+6479	3459 1
+6479	3634 1
+6479	4037 1
+6479	4099 1
+6479	5254 1
+6479	5273 1
+6479	5714 1
+6479	6000 1
+6479	6004 1
+6479	6552 1
+6479	6566 1
+6479	6595 1
+6478	4099 1
+6480	6481 1
+6483	2160 1
+6483	2620 1
+6483	3291 1
+6483	4441 1
+6483	4791 1
+6483	5002 1
+6483	5254 1
+6483	5827 1
+6483	5950 1
+6483	6156 1
+6483	6299 1
+6483	6496 1
+6483	6560 1
+6483	6595 1
+6483	6599 1
+6483	6606 1
+6483	6621 1
+6483	6628 1
+6483	6632 1
+6483	6661 1
+6483	6668 1
+6483	6707 1
+6483	6720 1
+6483	6721 1
+6483	6723 1
+6483	6755 1
+6483	6789 1
+6483	8297 1
+6484	2851 1
+6484	3238 1
+6484	5822 1
+6484	5998 1
+6484	6496 1
+6484	7021 1
+6484	7092 1
+6484	7890 1
+6484	8174 1
+6484	8192 1
+6485	6496 1
+6486	840 1
+6486	1403 1
+6486	2511 1
+6486	2851 1
+6486	2940 1
+6486	3726 1
+6486	3919 1
+6486	4218 1
+6486	4791 1
+6486	4879 1
+6486	4944 1
+6486	4966 1
+6486	4992 1
+6486	5002 1
+6486	5233 1
+6486	5254 1
+6486	5273 1
+6486	5289 1
+6486	5393 1
+6486	5404 1
+6486	5432 1
+6486	5524 1
+6486	5582 1
+6486	5596 1
+6486	5739 1
+6486	5773 1
+6486	5800 1
+6486	5806 1
+6486	5811 1
+6486	5814 1
+6486	5872 1
+6486	5998 1
+6486	6000 1
+6486	6097 1
+6486	6123 1
+6486	6323 1
+6486	6327 1
+6486	6496 1
+6486	6503 1
+6486	6555 1
+6486	6560 1
+6486	6600 1
+6486	6606 1
+6486	6624 1
+6486	6634 1
+6486	6665 1
+6486	6715 1
+6486	6725 1
+6486	6736 1
+6486	6765 1
+6486	6774 1
+6486	6784 1
+6486	6832 1
+6486	6873 1
+6486	6907 1
+6486	6913 1
+6486	6976 1
+6486	6994 1
+6486	7023 1
+6486	7108 1
+6486	7143 1
+6486	7162 1
+6486	7185 1
+6486	7214 1
+6486	7237 1
+6486	7246 1
+6486	7301 1
+6486	7304 1
+6486	7306 1
+6486	7315 1
+6486	7365 1
+6486	7381 1
+6486	7386 1
+6486	7391 1
+6486	7400 1
+6486	7414 1
+6486	7436 1
+6486	7439 1
+6486	7491 1
+6486	7529 1
+6486	7553 1
+6486	7587 1
+6486	7588 1
+6486	7620 1
+6486	7632 1
+6487	5037 1
+6487	5802 1
+6487	6496 1
+6487	6755 1
+6488	2160 1
+6488	2620 1
+6488	3459 1
+6488	3634 1
+6488	4713 1
+6488	4717 1
+6488	5210 1
+6488	5254 1
+6488	5524 1
+6488	5739 1
+6488	5800 1
+6488	5871 1
+6488	6170 1
+6488	6327 1
+6488	6496 1
+6488	6560 1
+6488	6628 1
+6488	6634 1
+6488	6770 1
+6488	6869 1
+6488	6873 1
+6488	6982 1
+6489	6330 1
+6489	6496 1
+6490	6496 1
+6490	6790 1
+6491	5002 1
+6491	5802 1
+6491	5824 1
+6491	6496 1
+6492	5802 1
+6492	6496 1
+6493	6496 1
+6494	1549 1
+6494	2160 1
+6494	2940 1
+6494	3084 1
+6494	3238 1
+6494	3381 1
+6494	3459 1
+6494	3631 1
+6494	3752 1
+6494	3792 1
+6494	4065 1
+6494	4071 1
+6494	4709 1
+6494	4875 1
+6494	4884 1
+6494	4940 1
+6494	4983 1
+6494	5002 1
+6494	5022 1
+6494	5028 1
+6494	5079 1
+6494	5179 1
+6494	5233 1
+6494	5254 1
+6494	5393 1
+6494	5524 1
+6494	5529 1
+6494	5543 1
+6494	5596 1
+6494	5714 1
+6494	5760 1
+6494	5799 1
+6494	5800 1
+6494	5806 1
+6494	5811 1
+6494	5814 1
+6494	5897 1
+6494	5922 1
+6494	6004 1
+6494	6032 1
+6494	6305 1
+6494	6320 1
+6494	6330 1
+6494	6496 1
+6494	6523 1
+6494	6555 1
+6494	6596 1
+6494	6759 1
+6494	6765 1
+6494	6790 1
+6494	6832 1
+6494	6833 1
+6494	6860 1
+6494	6873 1
+6494	6892 1
+6494	6897 1
+6494	6914 1
+6494	6920 1
+6494	6933 1
+6494	6938 1
+6494	6946 1
+6494	6955 1
+6494	6979 1
+6494	6982 1
+6494	6993 1
+6494	7023 1
+6494	7047 1
+6494	7052 1
+6494	7054 1
+6494	7059 1
+6494	7092 1
+6494	7101 1
+6494	7115 1
+6494	7279 1
+6494	7280 1
+6494	7301 1
+6494	7319 1
+6494	7351 1
+6494	7362 1
+6494	7373 1
+6494	7386 1
+6494	7400 1
+6494	7414 1
+6494	7443 1
+6494	7618 1
+6494	7620 1
+6494	7624 1
+6494	7642 1
+6494	7653 1
+6494	7688 1
+6494	7695 1
+6494	7763 1
+6494	7799 1
+6494	7833 1
+6494	7871 1
+6494	7890 1
+6494	7979 1
+6494	7996 1
+6494	8019 1
+6494	8025 1
+6494	8174 1
+6495	6496 1
+6495	7316 1
+6497	6498 1
+6500	2160 1
+6500	3792 1
+6500	5714 1
+6500	5799 1
+6500	6004 1
+6500	6566 1
+6500	6930 1
+6500	7301 1
+6501	3334 1
+6501	3459 1
+6501	3842 1
+6501	4507 1
+6501	5079 1
+6501	5210 1
+6501	5254 1
+6501	5321 1
+6501	5543 1
+6501	5739 1
+6501	5799 1
+6501	5827 1
+6501	6004 1
+6501	6599 1
+6501	6803 1
+6501	6897 1
+6501	6918 1
+6502	3238 1
+6502	4981 1
+6502	5022 1
+6502	5799 1
+6502	6044 1
+6502	6914 1
+6502	7115 1
+6502	7624 1
+6502	7879 1
+6502	7961 1
+6502	8134 1
+6502	8174 1
+6503	3634 1
+6503	5799 1
+6503	6221 1
+6503	6554 1
+6504	1972 1
+6504	4604 1
+6504	4994 1
+6504	5479 1
+6504	5827 1
+6504	6505 1
+6504	6600 1
+6506	5140 1
+6507	5140 1
+6508	5140 1
+6509	5140 1
+6510	1823 1
+6510	2160 1
+6510	3084 1
+6510	3293 1
+6510	3297 1
+6510	3346 1
+6510	3459 1
+6510	4709 1
+6510	4713 1
+6510	4875 1
+6510	4994 1
+6510	5002 1
+6510	5020 1
+6510	5022 1
+6510	5179 1
+6510	5254 1
+6510	5384 1
+6510	5465 1
+6510	5800 1
+6510	6000 1
+6510	6347 1
+6510	6388 1
+6510	6511 1
+6510	6523 1
+6510	6560 1
+6510	6566 1
+6510	6599 1
+6510	6665 1
+6510	6720 1
+6510	6725 1
+6510	6736 1
+6510	6765 1
+6510	6789 1
+6510	6803 1
+6510	6809 1
+6510	6832 1
+6510	6833 1
+6510	6850 1
+6510	6913 1
+6510	6934 1
+6510	6946 1
+6510	7052 1
+6510	7351 1
+6510	7442 1
+6510	7544 1
+6510	7553 1
+6510	7587 1
+6510	7620 1
+6510	7647 1
+6510	7694 1
+6510	7707 1
+6510	7795 1
+6510	7835 1
+6510	8134 1
+6513	4994 1
+6514	4994 1
+6515	4994 1
+6516	5479 1
+6517	1972 1
+6517	4713 1
+6518	1403 1
+6518	2589 1
+6518	2851 1
+6518	3459 1
+6518	3631 1
+6518	3885 1
+6518	4748 1
+6518	4875 1
+6518	4884 1
+6518	5002 1
+6518	5199 1
+6518	5814 1
+6518	5872 1
+6518	5922 1
+6518	5998 1
+6518	6032 1
+6518	6097 1
+6518	6327 1
+6518	6442 1
+6518	6634 1
+6518	6665 1
+6518	6784 1
+6518	6832 1
+6518	6976 1
+6518	6980 1
+6518	6994 1
+6518	7021 1
+6518	7052 1
+6518	7092 1
+6518	7277 1
+6518	7279 1
+6518	7422 1
+6518	7553 1
+6519	2433 1
+6520	2433 1
+6520	7280 1
+6521	2433 1
+6522	1493 1
+6522	2160 1
+6522	2433 1
+6522	4488 1
+6522	4536 1
+6522	4713 1
+6522	4764 1
+6522	5254 1
+6522	5321 1
+6522	5596 1
+6522	5829 1
+6522	5871 1
+6522	6004 1
+6522	6323 1
+6522	6347 1
+6522	6388 1
+6522	6560 1
+6522	6770 1
+6522	6777 1
+6522	6783 1
+6522	6789 1
+6522	6803 1
+6522	6809 1
+6522	6813 1
+6522	6833 1
+6522	6840 1
+6522	6855 1
+6522	6869 1
+6522	6873 1
+6523	1549 1
+6523	2433 1
+6523	3084 1
+6523	3334 1
+6523	3459 1
+6523	3962 1
+6523	4037 1
+6523	4507 1
+6523	4536 1
+6523	5079 1
+6523	5148 1
+6523	5524 1
+6523	5543 1
+6523	5655 1
+6523	5697 1
+6523	5714 1
+6523	5800 1
+6523	5839 1
+6523	5902 1
+6523	5932 1
+6523	6305 1
+6523	6330 1
+6523	6555 1
+6523	6634 1
+6523	6774 1
+6523	6832 1
+6523	6934 1
+6523	6948 1
+6523	6976 1
+6523	7115 1
+6523	7414 1
+6523	7620 1
+6523	7839 1
+6524	2433 1
+6524	5807 1
+6524	6914 1
+6524	7063 1
+6524	7478 1
+6524	7910 1
+6524	7992 1
+6524	8178 1
+6525	840 1
+6525	2433 1
+6525	2565 1
+6525	4536 1
+6525	4713 1
+6525	5543 1
+6525	5811 1
+6525	5829 1
+6525	6004 1
+6525	6414 1
+6525	6613 1
+6525	6634 1
+6525	6790 1
+6525	6803 1
+6525	6979 1
+6525	7119 1
+6525	8297 1
+6526	2160 1
+6526	2433 1
+6526	5321 1
+6526	5829 1
+6526	5871 1
+6526	6004 1
+6526	6323 1
+6526	6770 1
+6526	6783 1
+6526	6805 1
+6526	6840 1
+6527	6528 1
+6460	967 1
+6460	1498 1
+6460	2440 1
+6460	2620 1
+6460	3291 1
+6460	3334 1
+6460	3962 1
+6460	4689 1
+6460	4717 1
+6460	4875 1
+6460	4966 1
+6460	4981 1
+6460	5020 1
+6460	5079 1
+6460	5179 1
+6460	5188 1
+6460	5643 1
+6460	5800 1
+6460	5819 1
+6460	5839 1
+6460	5950 1
+6460	6032 1
+6460	6529 1
+6460	6553 1
+6460	6554 1
+6460	6555 1
+6460	6560 1
+6460	6567 1
+6460	6596 1
+6460	6699 1
+6460	6759 1
+6460	6946 1
+6460	6993 1
+6460	7021 1
+6460	7092 1
+6460	7277 1
+6460	7386 1
+6460	7414 1
+6460	7442 1
+6460	7491 1
+6460	7497 1
+6460	7498 1
+6460	7701 1
+6460	7765 1
+6460	7799 1
+6460	7803 1
+6460	7809 1
+6460	7835 1
+6460	7857 1
+6460	7910 1
+6460	7912 1
+6460	7921 1
+6460	7924 1
+6460	7952 1
+6460	7994 1
+6460	7996 1
+6460	8019 1
+6460	8042 1
+6533	4791 1
+6534	4791 1
+6537	1823 1
+6537	4791 1
+6537	6567 1
+6537	6599 1
+6537	6606 1
+6535	4791 1
+6538	2285 1
+6538	3459 1
+6538	4791 1
+6538	5179 1
+6538	5563 1
+6538	5902 1
+6538	6004 1
+6538	6388 1
+6538	6665 1
+6538	6769 1
+6538	6789 1
+6538	6850 1
+6538	6918 1
+6538	7116 1
+6538	7529 1
+6538	7620 1
+6538	7632 1
+6538	7819 1
+6538	8132 1
+6538	8141 1
+6538	8148 1
+6539	4791 1
+6536	4791 1
+6536	7879 1
+6541	4507 1
+6542	4507 1
+6544	3634 1
+6545	3634 1
+6545	4709 1
+6545	6156 1
+6545	6595 1
+6545	6663 1
+6546	3634 1
+6546	4709 1
+6547	3634 1
+6548	2940 1
+6548	3634 1
+6548	3842 1
+6548	4071 1
+6548	6442 1
+6548	7092 1
+6548	7381 1
+6548	7544 1
+6548	7553 1
+6548	7788 1
+6550	1498 1
+6550	4401 1
+6550	5079 1
+6550	5812 1
+6550	6553 1
+6550	7238 1
+6550	7553 1
+6550	7927 1
+6550	8249 1
+6555	2589 1
+6555	2785 1
+6555	2851 1
+6555	3381 1
+6555	3459 1
+6555	4361 1
+6555	4632 1
+6555	5002 1
+6555	5079 1
+6555	5199 1
+6555	5760 1
+6555	5811 1
+6555	5814 1
+6555	6004 1
+6555	6299 1
+6555	6523 1
+6555	6554 1
+6555	6560 1
+6555	6566 1
+6555	6699 1
+6555	6772 1
+6555	6832 1
+6555	7092 1
+6555	7146 1
+6555	7214 1
+6555	7225 1
+6555	7243 1
+6555	7351 1
+6555	7414 1
+6555	7434 1
+6555	7553 1
+6555	7632 1
+6555	7651 1
+6555	7726 1
+6555	7809 1
+5273	3334 1
+5273	3459 1
+5273	4536 1
+5273	4717 1
+5273	4764 1
+5273	5079 1
+5273	5254 1
+5273	5295 1
+5273	5596 1
+5273	7021 1
+5273	7632 1
+5273	7839 1
+6560	840 1
+6560	3084 1
+6560	3459 1
+6560	4401 1
+6560	4435 1
+6560	4713 1
+6560	4717 1
+6560	5079 1
+6560	5199 1
+6560	5233 1
+6560	5404 1
+6560	5776 1
+6560	5800 1
+6560	5811 1
+6560	5818 1
+6560	5839 1
+6560	5932 1
+6560	6123 1
+6560	6198 1
+6560	6327 1
+6560	6523 1
+6560	6596 1
+6560	6736 1
+6560	6770 1
+6560	6789 1
+6560	6832 1
+6560	6913 1
+6560	6946 1
+6560	6976 1
+6560	6980 1
+6560	6994 1
+6560	7092 1
+6560	7214 1
+6560	7381 1
+6560	7386 1
+6560	7414 1
+6560	7553 1
+6560	7632 1
+6560	7701 1
+6560	7757 1
+6560	7813 1
+6560	7833 1
+6560	8192 1
+6561	967 1
+6561	4604 1
+6561	4717 1
+6565	6566 1
+6123	3334 1
+6123	3459 1
+6123	4488 1
+6123	5524 1
+6123	5563 1
+6123	5697 1
+6123	5760 1
+6123	5822 1
+6123	5871 1
+6123	5902 1
+6123	6568 1
+6123	6774 1
+6123	6784 1
+6123	6832 1
+6123	7185 1
+6123	7204 1
+6123	7254 1
+6123	7381 1
+6123	7414 1
+6123	7439 1
+6123	7497 1
+6123	7498 1
+6123	7624 1
+6123	7632 1
+6570	5872 1
+6570	7301 1
+6570	7795 1
+6570	7908 1
+6572	4689 1
+6573	4689 1
+6574	6576 1
+6575	6576 1
+6563	1493 1
+6563	1982 1
+6563	2440 1
+6563	2565 1
+6563	3803 1
+6563	3962 1
+6563	4037 1
+6563	4361 1
+6563	4536 1
+6563	4875 1
+6563	4981 1
+6563	5002 1
+6563	5079 1
+6563	5254 1
+6563	5421 1
+6563	5465 1
+6563	5714 1
+6563	5739 1
+6563	5745 1
+6563	5773 1
+6563	5814 1
+6563	5897 1
+6563	5902 1
+6563	6097 1
+6563	6123 1
+6563	6299 1
+6563	6305 1
+6563	6327 1
+6563	6414 1
+6563	6634 1
+6563	6832 1
+6563	6860 1
+6563	6873 1
+6563	6907 1
+6563	6934 1
+6563	6946 1
+6563	6979 1
+6563	6982 1
+6563	6994 1
+6563	7052 1
+6563	7054 1
+6563	7108 1
+6563	7144 1
+6563	7214 1
+6563	7233 1
+6563	7279 1
+6563	7378 1
+6563	7436 1
+6563	7618 1
+6563	7620 1
+6563	7646 1
+6563	7651 1
+6563	7757 1
+6563	7778 1
+6563	7809 1
+6563	7839 1
+6563	7840 1
+6563	7927 1
+6577	2160 1
+6577	2440 1
+6577	4134 1
+6577	5254 1
+6577	5524 1
+6577	6227 1
+6577	6699 1
+6577	6897 1
+6577	6934 1
+6577	8297 1
+6578	2285 1
+6579	2285 1
+6580	2285 1
+6586	2285 1
+6581	2285 1
+6582	2285 1
+6583	2285 1
+6587	2285 1
+6584	2285 1
+6588	2285 1
+6585	2285 1
+6592	6323 1
+6552	1026 1
+6552	3334 1
+6552	3459 1
+6552	4071 1
+6552	4944 1
+6552	5002 1
+6552	5022 1
+6552	5079 1
+6552	5254 1
+6552	5295 1
+6552	5839 1
+6552	5998 1
+6552	6221 1
+6552	6243 1
+6552	6327 1
+6552	6523 1
+6552	6594 1
+6552	6832 1
+6552	6979 1
+6552	7050 1
+6552	7052 1
+6552	7168 1
+6552	7323 1
+6552	7414 1
+6552	7620 1
+6552	7632 1
+6552	7699 1
+6552	7809 1
+6552	8121 1
+6595	1026 1
+6595	4712 1
+6595	5020 1
+6595	5295 1
+6595	5596 1
+6595	6594 1
+6595	6715 1
+6595	6832 1
+6595	6948 1
+6595	7279 1
+6595	7414 1
+6595	7632 1
+6596	967 1
+6596	1191 1
+6596	1498 1
+6596	1865 1
+6596	1982 1
+6596	2223 1
+6596	2565 1
+6596	2658 1
+6596	3238 1
+6596	3293 1
+6596	3297 1
+6596	3310 1
+6596	3334 1
+6596	3381 1
+6596	3752 1
+6596	3962 1
+6596	4037 1
+6596	4071 1
+6596	4401 1
+6596	4432 1
+6596	4435 1
+6596	4507 1
+6596	4604 1
+6596	4712 1
+6596	4884 1
+6596	4940 1
+6596	4981 1
+6596	4983 1
+6596	5002 1
+6596	5028 1
+6596	5064 1
+6596	5079 1
+6596	5096 1
+6596	5148 1
+6596	5179 1
+6596	5199 1
+6596	5246 1
+6596	5378 1
+6596	5421 1
+6596	5465 1
+6596	5466 1
+6596	5529 1
+6596	5596 1
+6596	5605 1
+6596	5643 1
+6596	5671 1
+6596	5738 1
+6596	5812 1
+6596	5839 1
+6596	5871 1
+6596	5933 1
+6596	5969 1
+6596	6032 1
+6596	6151 1
+6596	6174 1
+6596	6241 1
+6596	6299 1
+6596	6320 1
+6596	6422 1
+6596	6503 1
+6596	6523 1
+6596	6555 1
+6596	6560 1
+6596	6618 1
+6596	6634 1
+6596	6712 1
+6596	6759 1
+6596	6774 1
+6596	6783 1
+6596	6789 1
+6596	6875 1
+6596	6913 1
+6596	6914 1
+6596	6918 1
+6596	6934 1
+6596	6946 1
+6596	6980 1
+6596	6993 1
+6596	7005 1
+6596	7012 1
+6596	7021 1
+6596	7047 1
+6596	7059 1
+6596	7063 1
+6596	7092 1
+6596	7094 1
+6596	7116 1
+6596	7120 1
+6596	7225 1
+6596	7233 1
+6596	7238 1
+6596	7277 1
+6596	7280 1
+6596	7341 1
+6596	7351 1
+6596	7386 1
+6596	7389 1
+6596	7391 1
+6596	7397 1
+6596	7443 1
+6596	7544 1
+6596	7553 1
+6596	7574 1
+6596	7587 1
+6596	7618 1
+6596	7620 1
+6596	7624 1
+6596	7632 1
+6596	7646 1
+6596	7647 1
+6596	7648 1
+6596	7649 1
+6596	7651 1
+6596	7652 1
+6596	7662 1
+6596	7668 1
+6596	7683 1
+6596	7688 1
+6596	7694 1
+6596	7695 1
+6596	7699 1
+6596	7707 1
+6596	7726 1
+6596	7730 1
+6596	7757 1
+6596	7763 1
+6596	7778 1
+6596	7788 1
+6596	7791 1
+6596	7795 1
+6596	7803 1
+6596	7809 1
+6596	7810 1
+6596	7833 1
+6596	7835 1
+6596	7839 1
+6596	7855 1
+6596	7862 1
+6596	7871 1
+6596	7879 1
+6596	7882 1
+6596	7890 1
+6596	7908 1
+6596	7910 1
+6596	7912 1
+6596	7913 1
+6596	7921 1
+6596	7924 1
+6596	7946 1
+6596	7952 1
+6596	7961 1
+6596	7965 1
+6596	7979 1
+6596	8002 1
+6596	8050 1
+6596	8051 1
+6596	8073 1
+6596	8083 1
+6596	8090 1
+6596	8121 1
+6596	8122 1
+6596	8124 1
+6596	8128 1
+6596	8130 1
+6596	8163 1
+6596	8168 1
+6596	8169 1
+6596	8174 1
+6596	8178 1
+6596	8186 1
+6596	8192 1
+6596	8198 1
+6596	8209 1
+6596	8212 1
+6596	8219 1
+6596	8237 1
+6596	8249 1
+6598	1403 1
+6598	5002 1
+6598	5543 1
+6598	5902 1
+6598	6599 1
+6598	7855 1
+6601	6600 1
+6602	6600 1
+6603	6600 1
+6604	6600 1
+6605	1352 1
+6605	2620 1
+6605	4712 1
+6605	5210 1
+6605	5950 1
+6605	6156 1
+6605	6501 1
+6605	6600 1
+6605	6632 1
+6605	6634 1
+6607	1352 1
+6607	4712 1
+6607	5827 1
+6607	6047 1
+6608	2160 1
+6608	3830 1
+6608	4065 1
+6608	4441 1
+6608	4709 1
+6608	5188 1
+6608	5254 1
+6608	5818 1
+6608	5824 1
+6608	5827 1
+6608	5829 1
+6608	5871 1
+6608	5950 1
+6608	6323 1
+6608	6665 1
+6608	6707 1
+6608	6770 1
+6608	6778 1
+6612	5012 1
+6612	6305 1
+6612	6330 1
+6612	6765 1
+6612	6938 1
+6612	6953 1
+6612	7115 1
+6618	840 1
+6618	2565 1
+6618	2785 1
+6618	3293 1
+6618	3297 1
+6618	3803 1
+6618	4037 1
+6618	4666 1
+6618	4934 1
+6618	4940 1
+6618	4944 1
+6618	4992 1
+6618	5002 1
+6618	5012 1
+6618	5022 1
+6618	5179 1
+6618	5210 1
+6618	5233 1
+6618	5246 1
+6618	5432 1
+6618	5465 1
+6618	5524 1
+6618	5543 1
+6618	5697 1
+6618	5773 1
+6618	5776 1
+6618	5800 1
+6618	5806 1
+6618	5807 1
+6618	5812 1
+6618	5814 1
+6618	5822 1
+6618	5932 1
+6618	5998 1
+6618	6000 1
+6618	6001 1
+6618	6097 1
+6618	6123 1
+6618	6270 1
+6618	6272 1
+6618	6305 1
+6618	6320 1
+6618	6327 1
+6618	6634 1
+6618	6765 1
+6618	6780 1
+6618	6784 1
+6618	6832 1
+6618	6860 1
+6618	6913 1
+6618	6924 1
+6618	6946 1
+6618	6955 1
+6618	6994 1
+6618	7040 1
+6618	7073 1
+6618	7094 1
+6618	7101 1
+6618	7115 1
+6618	7116 1
+6618	7119 1
+6618	7131 1
+6618	7144 1
+6618	7161 1
+6618	7238 1
+6618	7243 1
+6618	7262 1
+6618	7279 1
+6618	7280 1
+6618	7306 1
+6618	7318 1
+6618	7381 1
+6618	7389 1
+6618	7414 1
+6618	7490 1
+6618	7529 1
+6618	7533 1
+6618	7553 1
+6618	7561 1
+6618	7604 1
+6618	7620 1
+6618	7632 1
+6618	7683 1
+6618	7765 1
+6618	7810 1
+6618	7833 1
+6618	7961 1
+6618	8121 1
+6618	8130 1
+6618	8169 1
+6618	8276 1
+6619	155 1
+6619	1403 1
+6619	2511 1
+6619	2589 1
+6619	2851 1
+6619	2940 1
+6619	3334 1
+6619	3346 1
+6619	3726 1
+6619	4218 1
+6619	4361 1
+6619	4536 1
+6619	4666 1
+6619	4944 1
+6619	5002 1
+6619	5012 1
+6619	5020 1
+6619	5233 1
+6619	5298 1
+6619	5404 1
+6619	5421 1
+6619	5432 1
+6619	5465 1
+6619	5524 1
+6619	5760 1
+6619	5773 1
+6619	5800 1
+6619	5806 1
+6619	5811 1
+6619	5814 1
+6619	5822 1
+6619	5872 1
+6619	5897 1
+6619	5932 1
+6619	5969 1
+6619	5998 1
+6619	6097 1
+6619	6123 1
+6619	6227 1
+6619	6243 1
+6619	6272 1
+6619	6299 1
+6619	6305 1
+6619	6327 1
+6619	6330 1
+6619	6417 1
+6619	6442 1
+6619	6555 1
+6619	6596 1
+6619	6634 1
+6619	6765 1
+6619	6774 1
+6619	6784 1
+6619	6789 1
+6619	6832 1
+6619	6855 1
+6619	6897 1
+6619	6913 1
+6619	6930 1
+6619	6934 1
+6619	6946 1
+6619	6955 1
+6619	6976 1
+6619	7092 1
+6619	7101 1
+6619	7108 1
+6619	7115 1
+6619	7116 1
+6619	7144 1
+6619	7162 1
+6619	7185 1
+6619	7186 1
+6619	7214 1
+6619	7237 1
+6619	7279 1
+6619	7295 1
+6619	7306 1
+6619	7315 1
+6619	7323 1
+6619	7341 1
+6619	7362 1
+6619	7373 1
+6619	7381 1
+6619	7386 1
+6619	7387 1
+6619	7397 1
+6619	7400 1
+6619	7414 1
+6619	7423 1
+6619	7436 1
+6619	7439 1
+6619	7440 1
+6619	7508 1
+6619	7510 1
+6619	7529 1
+6619	7553 1
+6619	7593 1
+6619	7624 1
+6619	7632 1
+6619	7642 1
+6619	7648 1
+6619	7651 1
+6619	7658 1
+6619	7662 1
+6613	3809 1
+6613	4037 1
+6613	4666 1
+6613	5384 1
+6613	6305 1
+6613	6414 1
+6613	6948 1
+6613	7587 1
+6613	7620 1
+6614	4037 1
+6614	6305 1
+6615	1403 1
+6615	1549 1
+6615	1865 1
+6615	1982 1
+6615	2160 1
+6615	2511 1
+6615	2565 1
+6615	2785 1
+6615	2851 1
+6615	2940 1
+6615	3310 1
+6615	3334 1
+6615	3346 1
+6615	3381 1
+6615	3459 1
+6615	3631 1
+6615	3726 1
+6615	3792 1
+6615	3809 1
+6615	3885 1
+6615	4037 1
+6615	4218 1
+6615	4361 1
+6615	4488 1
+6615	4536 1
+6615	4666 1
+6615	4713 1
+6615	4764 1
+6615	4944 1
+6615	4992 1
+6615	5012 1
+6615	5148 1
+6615	5199 1
+6615	5233 1
+6615	5288 1
+6615	5295 1
+6615	5321 1
+6615	5384 1
+6615	5404 1
+6615	5432 1
+6615	5484 1
+6615	5543 1
+6615	5563 1
+6615	5582 1
+6615	5596 1
+6615	5671 1
+6615	5697 1
+6615	5739 1
+6615	5760 1
+6615	5773 1
+6615	5776 1
+6615	5800 1
+6615	5807 1
+6615	5811 1
+6615	5814 1
+6615	5818 1
+6615	5822 1
+6615	5829 1
+6615	5871 1
+6615	5897 1
+6615	5922 1
+6615	6001 1
+6615	6004 1
+6615	6097 1
+6615	6123 1
+6615	6198 1
+6615	6270 1
+6615	6272 1
+6615	6299 1
+6615	6305 1
+6615	6327 1
+6615	6330 1
+6615	6347 1
+6615	6388 1
+6615	6414 1
+6615	6417 1
+6615	6442 1
+6615	6503 1
+6615	6523 1
+6615	6555 1
+6615	6560 1
+6615	6624 1
+6615	6714 1
+6615	6736 1
+6615	6765 1
+6615	6770 1
+6615	6772 1
+6615	6774 1
+6615	6783 1
+6615	6784 1
+6615	6789 1
+6615	6790 1
+6615	6832 1
+6615	6833 1
+6615	6850 1
+6615	6855 1
+6615	6869 1
+6615	6873 1
+6615	6890 1
+6615	6892 1
+6615	6901 1
+6615	6913 1
+6615	6930 1
+6615	6945 1
+6615	6946 1
+6615	6955 1
+6615	6976 1
+6615	6979 1
+6615	6980 1
+6615	6994 1
+6615	7040 1
+6615	7052 1
+6615	7059 1
+6615	7062 1
+6615	7073 1
+6615	7101 1
+6615	7108 1
+6615	7115 1
+6615	7119 1
+6615	7131 1
+6615	7143 1
+6615	7144 1
+6615	7168 1
+6615	7185 1
+6615	7186 1
+6615	7201 1
+6615	7214 1
+6615	7243 1
+6615	7279 1
+6615	7280 1
+6615	7295 1
+6615	7301 1
+6615	7304 1
+6615	7306 1
+6615	7315 1
+6615	7319 1
+6615	7351 1
+6615	7362 1
+6615	7373 1
+6615	7381 1
+6615	7386 1
+6615	7397 1
+6615	7414 1
+6615	7422 1
+6615	7423 1
+6615	7436 1
+6615	7439 1
+6615	7442 1
+6615	7443 1
+6615	7449 1
+6615	7450 1
+6615	7478 1
+6615	7544 1
+6615	7695 1
+6615	7699 1
+6615	7707 1
+6615	7726 1
+6615	7740 1
+6615	7757 1
+6615	7763 1
+6616	2565 1
+6616	4037 1
+6616	4536 1
+6616	5012 1
+6616	5404 1
+6616	5500 1
+6616	5697 1
+6616	5922 1
+6616	6305 1
+6616	6330 1
+6616	6414 1
+6616	6560 1
+6616	6714 1
+6616	6897 1
+6616	6934 1
+6616	7040 1
+6616	7301 1
+6616	7557 1
+6617	6305 1
+6622	2851 1
+6622	3346 1
+6622	6623 1
+6622	6736 1
+6622	7146 1
+6624	967 1
+6624	1191 1
+6624	1403 1
+6624	1498 1
+6624	2511 1
+6624	2565 1
+6624	2620 1
+6624	2658 1
+6624	2851 1
+6624	2940 1
+6624	3000 1
+6624	3238 1
+6624	3293 1
+6624	3310 1
+6624	3381 1
+6624	3459 1
+6624	3631 1
+6624	3726 1
+6624	3752 1
+6624	3885 1
+6624	3962 1
+6624	3969 1
+6624	4037 1
+6624	4071 1
+6624	4341 1
+6624	4361 1
+6624	4435 1
+6624	4632 1
+6624	4981 1
+6624	5002 1
+6624	5028 1
+6624	5148 1
+6624	5288 1
+6624	5289 1
+6624	5404 1
+6624	5432 1
+6624	5465 1
+6624	5605 1
+6624	5614 1
+6624	5671 1
+6624	5760 1
+6624	5800 1
+6624	5806 1
+6624	5835 1
+6624	5839 1
+6624	5872 1
+6624	5897 1
+6624	5902 1
+6624	5933 1
+6624	6032 1
+6624	6043 1
+6624	6044 1
+6624	6123 1
+6624	6151 1
+6624	6174 1
+6624	6241 1
+6624	6243 1
+6624	6299 1
+6624	6414 1
+6624	6442 1
+6624	6555 1
+6624	6560 1
+6624	6665 1
+6624	6712 1
+6624	6780 1
+6624	6832 1
+6624	6907 1
+6624	6913 1
+6624	6914 1
+6624	6918 1
+6624	6934 1
+6624	6946 1
+6624	6980 1
+6624	7005 1
+6624	7012 1
+6624	7047 1
+6624	7052 1
+6624	7054 1
+6624	7092 1
+6624	7131 1
+6624	7225 1
+6624	7237 1
+6624	7277 1
+6624	7280 1
+6624	7378 1
+6624	7381 1
+6624	7400 1
+6624	7414 1
+6624	7443 1
+6624	7450 1
+6624	7478 1
+6624	7510 1
+6624	7512 1
+6624	7529 1
+6624	7533 1
+6624	7544 1
+6624	7561 1
+6624	7587 1
+6624	7618 1
+6624	7620 1
+6624	7624 1
+6624	7632 1
+6624	7646 1
+6624	7649 1
+6624	7651 1
+6624	7662 1
+6624	7683 1
+6624	7694 1
+6624	7695 1
+6624	7757 1
+6624	7763 1
+6624	7799 1
+6624	7803 1
+6624	7809 1
+6624	7813 1
+6624	7839 1
+6624	7855 1
+6624	7860 1
+6624	7862 1
+6624	7871 1
+6624	7882 1
+6624	7890 1
+6624	7908 1
+6624	7910 1
+6624	7912 1
+6624	7927 1
+6624	7946 1
+6624	7992 1
+6624	8037 1
+6624	8042 1
+6624	8044 1
+6624	8121 1
+6624	8122 1
+6624	8124 1
+6624	8128 1
+6625	2620 1
+6625	6227 1
+6625	6634 1
+6627	155 1
+6627	1982 1
+6627	2620 1
+6627	3346 1
+6627	3459 1
+6627	4065 1
+6627	4361 1
+6627	4412 1
+6627	4536 1
+6627	4632 1
+6627	4712 1
+6627	5028 1
+6627	5210 1
+6627	5254 1
+6627	5465 1
+6627	5484 1
+6627	5543 1
+6627	5760 1
+6627	5773 1
+6627	5835 1
+6627	5922 1
+6627	5950 1
+6627	6004 1
+6627	6330 1
+6627	6424 1
+6627	6503 1
+6627	6595 1
+6627	6634 1
+6627	6663 1
+6627	6790 1
+6627	6809 1
+6627	6833 1
+6627	6840 1
+6627	6850 1
+6627	6855 1
+6627	6946 1
+6627	6953 1
+6627	6979 1
+6627	7054 1
+6627	7062 1
+6627	7094 1
+6627	7115 1
+6627	7378 1
+6627	7529 1
+6627	7587 1
+6627	7588 1
+6627	7620 1
+6627	7910 1
+6627	8141 1
+6627	8178 1
+6626	2620 1
+6626	4712 1
+6626	5002 1
+6626	6221 1
+6626	6595 1
+6626	6634 1
+6626	6665 1
+6626	6682 1
+6626	6715 1
+6630	3919 1
+5943	6421 1
+6634	6946 1
+6634	8042 1
+6634	8163 1
+6636	4037 1
+6636	6634 1
+6633	6634 1
+6635	3752 1
+6635	5543 1
+6635	6634 1
+6635	6784 1
+6635	6913 1
+6635	7047 1
+6635	7478 1
+6635	7662 1
+6635	7699 1
+6639	6641 1
+6643	4037 1
+6643	5254 1
+6644	5254 1
+6645	5254 1
+6645	5714 1
+6646	4037 1
+6646	5254 1
+6646	7301 1
+6646	7478 1
+6647	5254 1
+6655	3346 1
+6655	5254 1
+6655	6624 1
+6655	6665 1
+6655	6784 1
+6655	7301 1
+6655	7478 1
+6648	1026 1
+6648	5254 1
+6648	7050 1
+6649	3792 1
+6649	4037 1
+6649	4134 1
+6649	4488 1
+6649	4944 1
+6649	5254 1
+6649	5524 1
+6649	5543 1
+6649	5563 1
+6649	5596 1
+6649	5739 1
+6649	5760 1
+6649	5818 1
+6649	5932 1
+6649	5998 1
+6649	6227 1
+6649	6272 1
+6649	6784 1
+6649	6855 1
+6649	6860 1
+6649	6869 1
+6649	6873 1
+6649	6901 1
+6649	6930 1
+6649	6934 1
+6649	7110 1
+6650	5254 1
+6651	5254 1
+6652	5254 1
+6653	5254 1
+6654	5254 1
+6656	5255 1
+6657	3293 1
+6657	3962 1
+6657	4712 1
+6657	5839 1
+6657	6715 1
+6657	6774 1
+6657	7279 1
+6657	7840 1
+6657	7961 1
+6657	8128 1
+6657	8132 1
+6658	4712 1
+6658	4875 1
+6658	5563 1
+6658	6780 1
+6658	6833 1
+6609	840 1
+6609	1549 1
+6609	4536 1
+6609	5210 1
+6609	5298 1
+6609	6327 1
+6609	6965 1
+6660	6661 1
+6551	5524 1
+6551	5950 1
+6665	1498 1
+6665	2658 1
+6665	2785 1
+6665	3631 1
+6665	3830 1
+6665	4065 1
+6665	4412 1
+6665	4441 1
+6665	4884 1
+6665	5028 1
+6665	5037 1
+6665	5288 1
+6665	5465 1
+6665	5697 1
+6665	5824 1
+6665	5950 1
+6665	6221 1
+6665	6503 1
+6665	6699 1
+6665	6715 1
+6665	6833 1
+6665	7101 1
+6665	7108 1
+6665	7116 1
+6665	7214 1
+6665	7618 1
+6665	7620 1
+6665	7624 1
+6665	8028 1
+6666	5950 1
+6666	6221 1
+6666	6299 1
+6666	6595 1
+6666	6699 1
+6666	6715 1
+6671	5760 1
+6671	6156 1
+6671	6832 1
+6671	7131 1
+6672	6156 1
+6673	6156 1
+6674	6156 1
+6675	6156 1
+6676	2658 1
+6676	5079 1
+6676	5738 1
+6676	6156 1
+6676	7092 1
+6676	7620 1
+6677	6156 1
+6678	6156 1
+6679	6156 1
+6683	6682 1
+6683	6685 1
+6683	6686 1
+6684	6685 1
+6687	6691 1
+6688	6691 1
+6689	6691 1
+6690	6691 1
+6695	4412 1
+6695	7632 1
+6696	4412 1
+6696	6770 1
+6697	6699 1
+6698	6699 1
+6701	6700 1
+6702	1403 1
+6702	3334 1
+6702	4944 1
+6702	5079 1
+6702	5839 1
+6702	5872 1
+6702	6555 1
+6702	6700 1
+6702	7225 1
+6702	7381 1
+6703	6221 1
+6705	5824 1
+6706	5002 1
+6706	5824 1
+6706	8297 1
+6710	737 1
+6710	6715 1
+6711	967 1
+6711	3803 1
+6711	6299 1
+6711	6715 1
+6711	7063 1
+6711	7115 1
+6711	7119 1
+6712	4764 1
+6712	5148 1
+6712	5671 1
+6712	6414 1
+6712	6442 1
+6712	6715 1
+6712	6933 1
+6712	7443 1
+6712	7544 1
+6712	7675 1
+6712	7795 1
+3293	840 1
+3293	5289 1
+3293	5605 1
+3293	5614 1
+3293	5969 1
+3293	6665 1
+3293	6715 1
+3293	6955 1
+3293	7620 1
+3293	7908 1
+6713	155 1
+6713	967 1
+6713	6715 1
+6713	7092 1
+6714	155 1
+6714	1026 1
+6714	1403 1
+6714	2565 1
+6714	2785 1
+6714	2851 1
+6714	2940 1
+6714	3334 1
+6714	3346 1
+6714	3459 1
+6714	3631 1
+6714	3726 1
+6714	3809 1
+6714	3885 1
+6714	4361 1
+6714	4632 1
+6714	4713 1
+6714	4875 1
+6714	4884 1
+6714	5002 1
+6714	5028 1
+6714	5199 1
+6714	5233 1
+6714	5289 1
+6714	5321 1
+6714	5404 1
+6714	5421 1
+6714	5432 1
+6714	5582 1
+6714	5596 1
+6714	5714 1
+6714	5745 1
+6714	5760 1
+6714	5800 1
+6714	5806 1
+6714	5822 1
+6714	5835 1
+6714	5872 1
+6714	5897 1
+6714	5902 1
+6714	6000 1
+6714	6097 1
+6714	6123 1
+6714	6243 1
+6714	6299 1
+6714	6417 1
+6714	6442 1
+6714	6503 1
+6714	6523 1
+6714	6560 1
+6714	6665 1
+6714	6715 1
+6714	6736 1
+6714	6770 1
+6714	6774 1
+6714	6784 1
+6714	6789 1
+6714	6803 1
+6714	6832 1
+6714	6833 1
+6714	6913 1
+6714	6934 1
+6714	6946 1
+6714	6976 1
+6714	7052 1
+6714	7054 1
+6714	7074 1
+6714	7088 1
+6714	7131 1
+6714	7214 1
+6714	7237 1
+6714	7262 1
+6714	7279 1
+6714	7295 1
+6714	7301 1
+6714	7315 1
+6714	7351 1
+6714	7365 1
+6714	7373 1
+6714	7378 1
+6714	7381 1
+6714	7414 1
+6714	7422 1
+6714	7423 1
+6714	7442 1
+6714	7450 1
+6714	7478 1
+6714	7491 1
+6714	7497 1
+6714	7510 1
+6714	7512 1
+6714	7520 1
+6714	7553 1
+6714	7561 1
+6714	7618 1
+6714	7620 1
+6714	7632 1
+6714	7646 1
+6714	7651 1
+6714	7662 1
+6718	6720 1
+6717	2160 1
+6717	6720 1
+6717	6778 1
+6717	6869 1
+6719	2940 1
+6719	6004 1
+6719	6720 1
+6727	5002 1
+6728	5002 1
+6611	2785 1
+6611	3459 1
+6611	5020 1
+6611	5543 1
+6611	5563 1
+6611	5739 1
+6611	5969 1
+6611	6270 1
+6611	6327 1
+6611	6414 1
+6611	6784 1
+6611	6913 1
+6611	6930 1
+6611	7101 1
+6611	7215 1
+6729	6665 1
+6730	6665 1
+6731	6665 1
+6732	6665 1
+6734	5802 1
+6734	7632 1
+6735	6739 1
+6736	1982 1
+6736	4401 1
+6736	4488 1
+6736	4536 1
+6736	4764 1
+6736	5321 1
+6736	5543 1
+6736	5596 1
+6736	5655 1
+6736	5697 1
+6736	5739 1
+6736	5800 1
+6736	5818 1
+6736	5839 1
+6736	5871 1
+6736	6001 1
+6736	6347 1
+6736	6422 1
+6736	6739 1
+6736	6774 1
+6736	6783 1
+6736	6788 1
+6736	6832 1
+6736	6833 1
+6736	6850 1
+6736	6860 1
+6736	6869 1
+6736	6873 1
+6736	6892 1
+6736	6901 1
+6736	6930 1
+6736	7021 1
+6736	7620 1
+6737	6739 1
+6738	6739 1
+6744	2160 1
+6744	8297 1
+6745	8297 1
+6746	6736 1
+6746	8297 1
+6749	6491 1
+6751	1493 1
+6751	6757 1
+6726	1493 1
+6726	5596 1
+6726	5800 1
+6726	5829 1
+6726	6001 1
+6726	6004 1
+6726	6323 1
+6726	6347 1
+6726	6770 1
+6726	6833 1
+6726	6850 1
+6726	6869 1
+6752	5037 1
+6753	2160 1
+6753	5037 1
+6753	6442 1
+6753	6890 1
+6755	6503 1
+6755	6774 1
+4401	2223 1
+4401	5022 1
+4401	5605 1
+4401	6897 1
+4401	7393 1
+4401	8033 1
+4401	8073 1
+4401	8139 1
+4401	8227 1
+6758	1498 1
+6758	3830 1
+6758	5871 1
+6758	6123 1
+6758	6243 1
+6758	7279 1
+6758	7407 1
+6758	7478 1
+6758	7632 1
+6758	8121 1
+6760	3830 1
+6760	6618 1
+6759	155 1
+6759	3830 1
+6759	7669 1
+6761	3830 1
+6764	4709 1
+6765	4709 1
+6766	155 1
+6766	3459 1
+6766	3885 1
+6766	4361 1
+6766	4401 1
+6766	4709 1
+6766	5432 1
+6766	5835 1
+6766	6347 1
+6766	7185 1
+6766	7306 1
+6766	7378 1
+6766	7512 1
+6766	7520 1
+6766	7561 1
+6766	7583 1
+6766	7587 1
+6766	7624 1
+6766	7695 1
+6766	7763 1
+6766	8051 1
+6766	8224 1
+6767	4709 1
+6767	6004 1
+6768	6613 1
+6770	5543 1
+6770	5806 1
+6770	5871 1
+6770	7050 1
+6770	7063 1
+6770	7961 1
+6771	5871 1
+6771	6833 1
+6772	155 1
+6772	1982 1
+6772	3084 1
+6772	3346 1
+6772	3885 1
+6772	4134 1
+6772	4488 1
+6772	4507 1
+6772	4940 1
+6772	4983 1
+6772	5020 1
+6772	5179 1
+6772	5199 1
+6772	5233 1
+6772	5321 1
+6772	5432 1
+6772	5524 1
+6772	5563 1
+6772	5596 1
+6772	5714 1
+6772	5739 1
+6772	5773 1
+6772	5800 1
+6772	5806 1
+6772	5818 1
+6772	5819 1
+6772	5829 1
+6772	5871 1
+6772	5872 1
+6772	6000 1
+6772	6001 1
+6772	6032 1
+6772	6123 1
+6772	6198 1
+6772	6327 1
+6772	6388 1
+6772	6417 1
+6772	6555 1
+6772	6596 1
+6772	6618 1
+6772	6783 1
+6772	6789 1
+6772	6803 1
+6772	6806 1
+6772	6809 1
+6772	6832 1
+6772	6833 1
+6772	6850 1
+6772	6901 1
+6772	6913 1
+6772	6914 1
+6772	6946 1
+6772	6976 1
+6772	6979 1
+6772	6980 1
+6772	7012 1
+6772	7021 1
+6772	7185 1
+6772	7225 1
+6772	7279 1
+6772	7289 1
+6772	7306 1
+6772	7423 1
+6772	7497 1
+6772	7553 1
+6772	7620 1
+6772	7632 1
+6772	7642 1
+6772	7662 1
+6772	7791 1
+6772	7835 1
+6772	7862 1
+6772	8019 1
+6772	8021 1
+6772	8083 1
+6772	8169 1
+6772	8178 1
+6775	5871 1
+6775	6770 1
+6775	7632 1
+6773	5871 1
+6774	1982 1
+6774	3084 1
+6774	4981 1
+6774	4983 1
+6774	5079 1
+6774	5148 1
+6774	5739 1
+6774	5814 1
+6774	5839 1
+6774	5871 1
+6774	6123 1
+6774	6243 1
+6774	6272 1
+6774	6618 1
+6774	6832 1
+6774	6913 1
+6774	6993 1
+6774	7005 1
+6774	7021 1
+6774	7386 1
+6774	7414 1
+6774	7553 1
+6774	7620 1
+6774	7810 1
+6779	5484 1
+6779	6004 1
+6779	7478 1
+6780	4071 1
+6780	5671 1
+6780	5819 1
+6780	6004 1
+6780	7813 1
+6780	7890 1
+6781	2160 1
+6781	4764 1
+6781	5697 1
+6781	6004 1
+6781	6523 1
+6781	6789 1
+6781	6833 1
+6781	6979 1
+6782	6004 1
+6783	5596 1
+6783	5829 1
+6783	6004 1
+6783	6323 1
+6784	840 1
+6784	2658 1
+6784	3459 1
+6784	3792 1
+6784	3885 1
+6784	5002 1
+6784	5028 1
+6784	5079 1
+6784	5199 1
+6784	5484 1
+6784	5596 1
+6784	5800 1
+6784	5806 1
+6784	5818 1
+6784	5839 1
+6784	5902 1
+6784	6000 1
+6784	6004 1
+6784	6414 1
+6784	6634 1
+6784	6790 1
+6784	6855 1
+6784	6860 1
+6784	6901 1
+6784	6913 1
+6784	6920 1
+6784	6934 1
+6784	6942 1
+6784	7054 1
+6784	7088 1
+6784	7092 1
+6784	7131 1
+6784	7279 1
+6784	7414 1
+6784	7422 1
+6784	7442 1
+6784	7450 1
+6784	7497 1
+6784	7512 1
+6784	7620 1
+6784	7651 1
+6784	7992 1
+6787	6788 1
+6789	4361 1
+6789	5199 1
+6789	5800 1
+6789	6299 1
+6789	6417 1
+6789	6634 1
+6789	6832 1
+6789	7295 1
+6789	7414 1
+6789	7442 1
+6789	7449 1
+6790	840 1
+6790	1549 1
+6790	1982 1
+6790	2565 1
+6790	3459 1
+6790	4536 1
+6790	5822 1
+6790	6323 1
+6790	6330 1
+6790	6555 1
+6790	6624 1
+6793	2160 1
+6794	2160 1
+6795	2160 1
+6795	6044 1
+6797	5714 1
+6798	5714 1
+6800	5714 1
+6801	3752 1
+6801	5714 1
+6801	5773 1
+6801	7050 1
+6801	7414 1
+6801	8174 1
+6802	6755 1
+6802	6803 1
+6802	7243 1
+6804	6770 1
+6804	6805 1
+6804	6907 1
+6804	7237 1
+6804	7414 1
+6804	7561 1
+6809	6001 1
+6809	8249 1
+6808	6809 1
+6807	6809 1
+6810	6770 1
+6812	6770 1
+6812	7662 1
+6811	6770 1
+6813	5596 1
+6815	5288 1
+6815	5321 1
+6815	6388 1
+6815	6783 1
+6816	5321 1
+6818	5529 1
+6818	6347 1
+6819	6347 1
+5269	6347 1
+6821	5829 1
+6822	5818 1
+6822	5829 1
+6824	5829 1
+6776	5800 1
+6776	5829 1
+6776	6855 1
+6828	4713 1
+6829	4536 1
+6829	4713 1
+6829	6330 1
+6829	6833 1
+6833	5404 1
+6834	4037 1
+6834	6833 1
+6835	6833 1
+6836	6833 1
+6837	4764 1
+6841	5210 1
+6841	5596 1
+6842	5596 1
+6843	5596 1
+6844	5596 1
+6845	6832 1
+6845	6850 1
+6846	5563 1
+6846	6388 1
+6846	6850 1
+6846	6855 1
+6846	6860 1
+6846	6930 1
+6848	2565 1
+6848	4361 1
+6848	5020 1
+6848	5800 1
+6848	6327 1
+6848	6774 1
+6848	6784 1
+6848	6850 1
+6848	6869 1
+6848	6901 1
+6848	6913 1
+6848	7074 1
+6848	7101 1
+6848	7143 1
+6847	6850 1
+6852	6388 1
+6855	2565 1
+6855	3084 1
+6855	5079 1
+6855	5524 1
+6855	5773 1
+6855	5814 1
+6855	6634 1
+6855	6832 1
+6855	7005 1
+6855	7094 1
+6855	7185 1
+6855	7757 1
+6855	8042 1
+6855	8128 1
+6854	6855 1
+6859	4037 1
+6859	5022 1
+6859	5524 1
+6859	5776 1
+6859	6272 1
+6859	6634 1
+6859	6860 1
+6859	8037 1
+6859	8163 1
+6859	8204 1
+6859	8226 1
+6620	840 1
+6620	1403 1
+6620	1549 1
+6620	1982 1
+6620	2511 1
+6620	2565 1
+6620	2785 1
+6620	2851 1
+6620	3346 1
+6620	3459 1
+6620	3631 1
+6620	3726 1
+6620	3792 1
+6620	3803 1
+6620	3809 1
+6620	4037 1
+6620	4134 1
+6620	4536 1
+6620	4666 1
+6620	4944 1
+6620	4992 1
+6620	5012 1
+6620	5288 1
+6620	5295 1
+6620	5384 1
+6620	5404 1
+6620	5432 1
+6620	5484 1
+6620	5524 1
+6620	5543 1
+6620	5563 1
+6620	5582 1
+6620	5697 1
+6620	5739 1
+6620	5773 1
+6620	5776 1
+6620	5800 1
+6620	5807 1
+6620	5811 1
+6620	5814 1
+6620	5818 1
+6620	5822 1
+6620	5922 1
+6620	5932 1
+6620	5998 1
+6620	6097 1
+6620	6227 1
+6620	6270 1
+6620	6272 1
+6620	6327 1
+6620	6414 1
+6620	6523 1
+6620	6560 1
+6620	6624 1
+6620	6634 1
+6620	6736 1
+6620	6774 1
+6620	6784 1
+6620	6790 1
+6620	6832 1
+6620	6860 1
+6620	6873 1
+6620	6897 1
+6620	6901 1
+6620	6930 1
+6620	6942 1
+6620	6945 1
+6620	6946 1
+6620	6948 1
+6620	6955 1
+6620	6976 1
+6620	6982 1
+6620	7040 1
+6620	7052 1
+6620	7073 1
+6620	7074 1
+6620	7094 1
+6620	7101 1
+6620	7108 1
+6620	7115 1
+6620	7119 1
+6620	7143 1
+6620	7144 1
+6620	7168 1
+6620	7185 1
+6620	7186 1
+6620	7201 1
+6620	7214 1
+6620	7257 1
+6620	7301 1
+6620	7304 1
+6620	7306 1
+6620	7632 1
+6861	3792 1
+6861	6930 1
+6862	3792 1
+6863	3792 1
+6863	4037 1
+6864	3792 1
+6864	6327 1
+6866	3238 1
+6866	3792 1
+6866	7695 1
+6866	7979 1
+6867	4488 1
+6867	5543 1
+6867	5800 1
+6867	6001 1
+6867	7373 1
+6869	7214 1
+6865	3459 1
+6865	4009 1
+6865	5543 1
+6865	5563 1
+6865	5739 1
+6865	5800 1
+6865	5811 1
+6865	5818 1
+6865	6001 1
+6865	6560 1
+6865	6618 1
+6865	6832 1
+6865	6869 1
+6865	6901 1
+6865	6913 1
+6865	6930 1
+6865	7021 1
+6865	7074 1
+6865	7620 1
+6870	5800 1
+6870	6869 1
+6870	6873 1
+6875	4432 1
+6875	5289 1
+6875	5818 1
+6875	5922 1
+6875	6032 1
+6875	6442 1
+6875	6634 1
+6875	6980 1
+6875	7443 1
+6875	7553 1
+6875	7561 1
+6875	7965 1
+6875	8168 1
+6875	8174 1
+6875	8212 1
+6876	5818 1
+6877	5818 1
+6878	5818 1
+6880	6327 1
+6880	6560 1
+6881	6560 1
+6883	5776 1
+6883	6001 1
+6883	6327 1
+6883	6523 1
+6884	6001 1
+6885	3334 1
+6885	4037 1
+6885	5079 1
+6885	5404 1
+6885	5671 1
+6885	6001 1
+6885	6307 1
+6885	6442 1
+6885	6560 1
+6885	6634 1
+6885	6784 1
+6885	7050 1
+6885	7422 1
+6885	7553 1
+6885	7620 1
+6885	7646 1
+6885	7707 1
+6885	8168 1
+6885	8249 1
+6747	4037 1
+6747	5773 1
+6747	6001 1
+6747	6414 1
+6886	840 1
+6886	3803 1
+6886	4037 1
+6886	6001 1
+6886	6097 1
+6886	6790 1
+6886	7143 1
+5410	5295 1
+6895	5563 1
+6895	6032 1
+6895	6097 1
+6895	6832 1
+6895	6897 1
+6895	7809 1
+6896	4134 1
+6896	5543 1
+6896	6897 1
+6896	6934 1
+6899	5800 1
+6899	6774 1
+6900	2658 1
+6900	3297 1
+6900	3334 1
+6900	3459 1
+6900	4037 1
+6900	4536 1
+6900	4632 1
+6900	4875 1
+6900	5022 1
+6900	5210 1
+6900	5378 1
+6900	5524 1
+6900	5605 1
+6900	5800 1
+6900	5811 1
+6900	5902 1
+6900	6330 1
+6900	6560 1
+6900	6918 1
+6900	6945 1
+6900	7088 1
+6900	7092 1
+6900	7131 1
+6900	7279 1
+6900	7422 1
+6900	7478 1
+6900	7553 1
+6900	7620 1
+6900	7961 1
+6900	8121 1
+6900	8134 1
+6902	2511 1
+6902	2851 1
+6902	3334 1
+6902	3752 1
+6902	4037 1
+6902	4875 1
+6902	5179 1
+6902	5288 1
+6902	5289 1
+6902	5563 1
+6902	5614 1
+6902	5739 1
+6902	5773 1
+6902	5872 1
+6902	5887 1
+6902	6241 1
+6902	6901 1
+6902	6914 1
+6902	7092 1
+6902	7237 1
+6902	7400 1
+6902	7436 1
+6902	7520 1
+6902	7553 1
+6902	7683 1
+6902	7928 1
+6902	8073 1
+6902	8121 1
+6903	6904 1
+6913	840 1
+6913	2511 1
+6913	2565 1
+6913	2785 1
+6913	3631 1
+6913	3803 1
+6913	4037 1
+6913	4361 1
+6913	4536 1
+6913	4666 1
+6913	4944 1
+6913	5484 1
+6913	5772 1
+6913	5773 1
+6913	5776 1
+6913	5814 1
+6913	5822 1
+6913	5932 1
+6913	5969 1
+6913	5998 1
+6913	6270 1
+6913	6327 1
+6913	6330 1
+6913	6555 1
+6913	6624 1
+6913	6634 1
+6913	6714 1
+6913	6736 1
+6913	6774 1
+6913	6784 1
+6913	6832 1
+6913	6917 1
+6913	6946 1
+6913	7052 1
+6913	7073 1
+6913	7074 1
+6913	7101 1
+6913	7108 1
+6913	7119 1
+6913	7143 1
+6913	7149 1
+6913	7168 1
+6913	7185 1
+6913	7214 1
+6905	5484 1
+6914	155 1
+6914	938 1
+6914	2658 1
+6914	2851 1
+6914	3297 1
+6914	3346 1
+6914	3459 1
+6914	3885 1
+6914	3962 1
+6914	4361 1
+6914	4632 1
+6914	4875 1
+6914	4940 1
+6914	4966 1
+6914	5012 1
+6914	5022 1
+6914	5179 1
+6914	5288 1
+6914	5404 1
+6914	5406 1
+6914	5484 1
+6914	5500 1
+6914	5529 1
+6914	5582 1
+6914	5605 1
+6914	5671 1
+6914	5760 1
+6914	5773 1
+6914	5800 1
+6914	5806 1
+6914	5835 1
+6914	5839 1
+6914	5872 1
+6914	5998 1
+6914	6000 1
+6914	6123 1
+6914	6243 1
+6914	6270 1
+6914	6320 1
+6914	6417 1
+6914	6503 1
+6914	6555 1
+6914	6560 1
+6914	6618 1
+6914	6634 1
+6914	6665 1
+6914	6714 1
+6914	6736 1
+6914	6780 1
+6914	6784 1
+6914	6832 1
+6914	6913 1
+6914	6946 1
+6914	6979 1
+6914	6993 1
+6914	7012 1
+6914	7052 1
+6914	7054 1
+6914	7063 1
+6914	7088 1
+6914	7092 1
+6914	7131 1
+6914	7225 1
+6914	7243 1
+6914	7246 1
+6914	7277 1
+6914	7295 1
+6914	7306 1
+6914	7351 1
+6914	7359 1
+6914	7373 1
+6914	7378 1
+6914	7414 1
+6914	7422 1
+6914	7442 1
+6914	7478 1
+6914	7491 1
+6914	7497 1
+6914	7510 1
+6914	7512 1
+6914	7544 1
+6914	7553 1
+6914	7587 1
+6914	7757 1
+6914	7788 1
+6914	7803 1
+6914	7810 1
+6914	7833 1
+6914	7862 1
+6914	7890 1
+6914	7921 1
+6914	7924 1
+6914	7927 1
+6914	8134 1
+6914	8141 1
+6915	5384 1
+6915	5484 1
+6906	1403 1
+6906	2511 1
+6906	2851 1
+6906	2940 1
+6906	3346 1
+6906	3631 1
+6906	3726 1
+6906	4037 1
+6906	4361 1
+6906	5012 1
+6906	5199 1
+6906	5288 1
+6906	5404 1
+6906	5432 1
+6906	5484 1
+6906	5582 1
+6906	5760 1
+6906	5773 1
+6906	5776 1
+6906	5814 1
+6906	5897 1
+6906	6123 1
+6906	6299 1
+6906	6327 1
+6906	6414 1
+6906	6417 1
+6906	6503 1
+6906	6634 1
+6906	6714 1
+6906	6736 1
+6906	6784 1
+6906	6789 1
+6906	6832 1
+6906	6913 1
+6906	6976 1
+6906	7101 1
+6906	7108 1
+6906	7115 1
+6906	7119 1
+6906	7143 1
+6906	7144 1
+6906	7185 1
+6906	7186 1
+6906	7214 1
+6906	7295 1
+6906	7301 1
+6906	7306 1
+6906	7351 1
+6906	7381 1
+6907	155 1
+6907	840 1
+6907	938 1
+6907	967 1
+6907	1191 1
+6907	1403 1
+6907	1498 1
+6907	2223 1
+6907	2511 1
+6907	2658 1
+6907	2785 1
+6907	2851 1
+6907	3000 1
+6907	3084 1
+6907	3238 1
+6907	3293 1
+6907	3297 1
+6907	3310 1
+6907	3346 1
+6907	3381 1
+6907	3631 1
+6907	3726 1
+6907	3752 1
+6907	3885 1
+6907	3962 1
+6907	3969 1
+6907	4037 1
+6907	4071 1
+6907	4341 1
+6907	4361 1
+6907	4401 1
+6907	4432 1
+6907	4632 1
+6907	4875 1
+6907	4879 1
+6907	4944 1
+6907	4983 1
+6907	5002 1
+6907	5022 1
+6907	5028 1
+6907	5064 1
+6907	5079 1
+6907	5148 1
+6907	5179 1
+6907	5199 1
+6907	5210 1
+6907	5233 1
+6907	5288 1
+6907	5378 1
+6907	5404 1
+6907	5421 1
+6907	5432 1
+6907	5465 1
+6907	5466 1
+6907	5484 1
+6907	5500 1
+6907	5529 1
+6907	5582 1
+6907	5605 1
+6907	5760 1
+6907	5773 1
+6907	5776 1
+6907	5800 1
+6907	5806 1
+6907	5812 1
+6907	5814 1
+6907	5835 1
+6907	5839 1
+6907	5872 1
+6907	5897 1
+6907	5902 1
+6907	6000 1
+6907	6043 1
+6907	6044 1
+6907	6123 1
+6907	6241 1
+6907	6243 1
+6907	6299 1
+6907	6320 1
+6907	6414 1
+6907	6417 1
+6907	6442 1
+6907	6503 1
+6907	6523 1
+6907	6555 1
+6907	6560 1
+6907	6618 1
+6907	6634 1
+6907	6665 1
+6907	6712 1
+6907	6714 1
+6907	6780 1
+6907	6784 1
+6907	6789 1
+6907	6832 1
+6907	6875 1
+6907	6913 1
+6907	6914 1
+6907	6918 1
+6907	6934 1
+6907	6946 1
+6907	6976 1
+6907	6979 1
+6907	6994 1
+6907	7005 1
+6907	7012 1
+6907	7021 1
+6907	7052 1
+6907	7054 1
+6907	7063 1
+6907	7092 1
+6907	7101 1
+6907	7108 1
+6907	7116 1
+6907	7131 1
+6907	7144 1
+6907	7214 1
+6907	7225 1
+6907	7233 1
+6907	7237 1
+6907	7254 1
+6907	7279 1
+6907	7280 1
+6907	7359 1
+6907	7373 1
+6907	7378 1
+6907	7381 1
+6907	7386 1
+6907	7389 1
+6907	7391 1
+6907	7400 1
+6907	7414 1
+6907	7423 1
+6907	7478 1
+6907	7497 1
+6907	7510 1
+6907	7529 1
+6907	7553 1
+6907	7561 1
+6907	7618 1
+6907	7620 1
+6907	7624 1
+6907	7632 1
+6907	7646 1
+6907	7647 1
+6907	7649 1
+6907	7651 1
+6907	7652 1
+6907	7662 1
+6907	7683 1
+6907	7688 1
+6907	7694 1
+6907	7695 1
+6907	7707 1
+6907	7726 1
+6907	7757 1
+6907	7763 1
+6907	7788 1
+6907	7795 1
+6907	7803 1
+6907	7809 1
+6907	7813 1
+6907	7835 1
+6907	7860 1
+6907	7874 1
+6907	7879 1
+6907	7882 1
+6907	7908 1
+6907	7912 1
+6907	7924 1
+6907	7961 1
+6907	7965 1
+6907	7992 1
+6907	8042 1
+6907	8044 1
+6907	8083 1
+6907	8090 1
+6907	8121 1
+6907	8122 1
+6907	8128 1
+6907	8134 1
+6907	8141 1
+6907	8163 1
+6907	8168 1
+6907	8169 1
+6907	8174 1
+6907	8178 1
+6907	8192 1
+6907	8209 1
+6907	8219 1
+6907	8237 1
+6908	5484 1
+6909	5484 1
+2415	5012 1
+2415	5484 1
+2415	5814 1
+2415	6560 1
+6910	5484 1
+6916	155 1
+6916	1026 1
+6916	1403 1
+6916	2658 1
+6916	3334 1
+6916	3459 1
+6916	3770 1
+6916	4037 1
+6916	4507 1
+6916	4875 1
+6916	4884 1
+6916	4940 1
+6916	5179 1
+6916	5289 1
+6916	5406 1
+6916	5484 1
+6916	5582 1
+6916	5806 1
+6916	5872 1
+6916	6000 1
+6916	6330 1
+6916	6503 1
+6916	6618 1
+6916	6907 1
+6916	6914 1
+6916	6946 1
+6916	6980 1
+6916	7108 1
+6916	7131 1
+6916	7225 1
+6916	7237 1
+6916	7279 1
+6916	7351 1
+6916	7442 1
+6916	7450 1
+6916	7553 1
+6916	7574 1
+6916	7587 1
+6916	7620 1
+6916	7642 1
+6916	7740 1
+6916	7757 1
+6916	7788 1
+6916	8002 1
+6916	8090 1
+6916	8128 1
+6916	8134 1
+6916	8168 1
+6916	8178 1
+6916	8219 1
+6916	8224 1
+6916	8226 1
+6916	8235 1
+6916	8275 1
+6917	5484 1
+6917	6634 1
+6917	6994 1
+6911	5484 1
+6911	5582 1
+6911	6714 1
+6911	6774 1
+6911	6976 1
+6912	1549 1
+6912	5484 1
+6912	6790 1
+6918	3297 1
+6918	3334 1
+6918	3631 1
+6918	3962 1
+6918	4435 1
+6918	5179 1
+6918	5233 1
+6918	5404 1
+6918	5466 1
+6918	5484 1
+6918	6442 1
+6918	6560 1
+6918	6780 1
+6918	6907 1
+6918	7021 1
+6918	7050 1
+6918	7054 1
+6918	7092 1
+6918	7108 1
+6918	7214 1
+6918	7400 1
+6918	7414 1
+6918	7553 1
+6918	7604 1
+6918	7632 1
+6918	7778 1
+6918	7927 1
+6918	7965 1
+6918	7979 1
+6921	5543 1
+6922	5543 1
+6923	5289 1
+6923	5739 1
+6924	1498 1
+6924	5739 1
+6924	6044 1
+6924	6555 1
+6924	6907 1
+6924	7092 1
+6924	7131 1
+6924	7389 1
+6924	7588 1
+6924	7757 1
+6924	7840 1
+6924	7927 1
+6924	8050 1
+6924	8174 1
+6924	8224 1
+6924	8237 1
+6926	6227 1
+6927	6227 1
+6928	5563 1
+6929	6930 1
+6934	155 1
+6934	1865 1
+6934	2565 1
+6934	2785 1
+6934	2940 1
+6934	3238 1
+6934	3334 1
+6934	3459 1
+6934	4009 1
+6934	4037 1
+6934	4361 1
+6934	4884 1
+6934	4940 1
+6934	4944 1
+6934	5012 1
+6934	5233 1
+6934	5404 1
+6934	5524 1
+6934	5529 1
+6934	5582 1
+6934	5800 1
+6934	5806 1
+6934	5872 1
+6934	5922 1
+6934	5998 1
+6934	6000 1
+6934	6097 1
+6934	6270 1
+6934	6503 1
+6934	6560 1
+6934	6618 1
+6934	6624 1
+6934	6634 1
+6934	6665 1
+6934	6736 1
+6934	6765 1
+6934	6784 1
+6934	6832 1
+6934	6907 1
+6934	6913 1
+6934	6914 1
+6934	6946 1
+6934	6955 1
+6934	6993 1
+6934	7052 1
+6934	7054 1
+6934	7115 1
+6934	7119 1
+6934	7120 1
+6934	7186 1
+6934	7214 1
+6934	7262 1
+6934	7277 1
+6934	7378 1
+6934	7381 1
+6934	7400 1
+6934	7497 1
+6934	7512 1
+6934	7529 1
+6934	7561 1
+6934	7587 1
+6934	7620 1
+6934	7683 1
+6934	7795 1
+6934	7803 1
+6935	5524 1
+6935	6272 1
+6936	5524 1
+6938	4134 1
+6938	6934 1
+6938	7992 1
+6938	8019 1
+6940	4134 1
+6941	155 1
+6941	840 1
+6941	1026 1
+6941	1549 1
+6941	2851 1
+6941	3000 1
+6941	3238 1
+6941	3459 1
+6941	3726 1
+6941	3969 1
+6941	4037 1
+6941	4134 1
+6941	4341 1
+6941	4507 1
+6941	4940 1
+6941	5012 1
+6941	5022 1
+6941	5028 1
+6941	5432 1
+6941	5529 1
+6941	5745 1
+6941	5819 1
+6941	5835 1
+6941	6241 1
+6941	6327 1
+6941	6555 1
+6941	6560 1
+6941	6634 1
+6941	6665 1
+6941	6765 1
+6941	6784 1
+6941	6907 1
+6941	6913 1
+6941	6923 1
+6941	6976 1
+6941	7047 1
+6941	7052 1
+6941	7054 1
+6941	7131 1
+6941	7225 1
+6941	7280 1
+6941	7301 1
+6941	7378 1
+6941	7386 1
+6941	7400 1
+6941	7553 1
+6941	7557 1
+6941	7561 1
+6941	7587 1
+6941	7618 1
+6941	7620 1
+6941	7624 1
+6941	7632 1
+6941	7809 1
+6941	7810 1
+6941	7819 1
+6941	7833 1
+5529	840 1
+5529	1982 1
+5529	3459 1
+5529	3631 1
+5529	4071 1
+5529	4134 1
+5529	5022 1
+5529	5079 1
+5529	5210 1
+5529	5289 1
+5529	5465 1
+5529	5819 1
+5529	5839 1
+5529	5998 1
+5529	6044 1
+5529	6327 1
+5529	6330 1
+5529	6560 1
+5529	6955 1
+5529	6979 1
+5529	7074 1
+5529	7092 1
+5529	7144 1
+5529	7214 1
+5529	7443 1
+5529	7510 1
+5529	7553 1
+5529	7618 1
+5529	7649 1
+5529	7699 1
+5529	7803 1
+5529	7809 1
+5529	7813 1
+5529	7860 1
+5529	7890 1
+5529	7908 1
+5529	7921 1
+5529	7927 1
+5529	8168 1
+6943	5020 1
+6945	4536 1
+6945	4875 1
+6945	5012 1
+6945	5811 1
+6945	5872 1
+6945	6000 1
+6945	6414 1
+6945	6560 1
+6945	6634 1
+6945	7052 1
+6945	7054 1
+6945	7094 1
+6945	7119 1
+6945	7529 1
+6945	7544 1
+6945	7587 1
+6945	7763 1
+6945	8028 1
+6949	1982 1
+6949	6765 1
+6949	6790 1
+6949	6955 1
+6949	6979 1
+6947	6765 1
+6953	6955 1
+6954	6330 1
+6954	6955 1
+6954	6982 1
+6951	967 1
+6951	1498 1
+6951	1549 1
+6951	1982 1
+6951	2658 1
+6951	3084 1
+6951	3459 1
+6951	4401 1
+6951	4432 1
+6951	4507 1
+6951	4940 1
+6951	4983 1
+6951	5079 1
+6951	5643 1
+6951	5697 1
+6951	5738 1
+6951	6422 1
+6951	6555 1
+6951	6560 1
+6951	6979 1
+6951	6980 1
+6951	6993 1
+6951	7005 1
+6951	7021 1
+6951	7050 1
+6951	7092 1
+6951	7386 1
+6951	7393 1
+6951	7553 1
+6951	7636 1
+6951	7666 1
+6951	7778 1
+6951	7810 1
+6951	7819 1
+6951	7839 1
+6951	7881 1
+6951	7899 1
+6951	7921 1
+6951	7924 1
+6951	7991 1
+6951	8002 1
+6951	8007 1
+6951	8037 1
+6951	8042 1
+6951	8079 1
+6951	8204 1
+6951	8249 1
+6959	4536 1
+6959	5697 1
+6959	5839 1
+6959	6243 1
+6959	7295 1
+6692	5288 1
+6692	5697 1
+6692	7021 1
+6692	7092 1
+6692	7927 1
+6692	7979 1
+6958	5697 1
+6958	7060 1
+6960	5697 1
+6961	5697 1
+6961	6993 1
+6962	5697 1
+6963	5697 1
+6968	6523 1
+6969	6523 1
+6316	3084 1
+6316	3459 1
+6316	4037 1
+6316	5199 1
+6316	6123 1
+6316	6327 1
+6316	6330 1
+6316	6555 1
+6316	6665 1
+6316	6832 1
+6316	6907 1
+6316	6917 1
+6316	7052 1
+6316	7054 1
+6316	7092 1
+6316	7237 1
+6316	7378 1
+6316	7529 1
+6316	7553 1
+6971	1403 1
+6971	3459 1
+6971	4009 1
+6971	5199 1
+6971	6784 1
+6971	7295 1
+6972	3459 1
+6974	3459 1
+6974	6330 1
+6975	3334 1
+6975	3459 1
+6975	3962 1
+6975	4037 1
+6975	5801 1
+6975	6414 1
+6975	6784 1
+6975	6790 1
+6975	7110 1
+6975	7119 1
+6976	1026 1
+6976	2511 1
+6976	2851 1
+6976	3334 1
+6976	3459 1
+6976	4037 1
+6976	4361 1
+6976	4944 1
+6976	4981 1
+6976	5002 1
+6976	5079 1
+6976	5233 1
+6976	5582 1
+6976	5605 1
+6976	5776 1
+6976	5800 1
+6976	5822 1
+6976	6043 1
+6976	6097 1
+6976	6503 1
+6976	6774 1
+6976	6784 1
+6976	6914 1
+6976	6918 1
+6976	7073 1
+6976	7092 1
+6976	7101 1
+6976	7115 1
+6976	7119 1
+6976	7143 1
+6976	7214 1
+6976	7400 1
+6976	7510 1
+6976	7553 1
+6976	7649 1
+6976	7788 1
+6976	7795 1
+6976	7839 1
+6976	7871 1
+6976	7890 1
+6976	7908 1
+6978	6979 1
+6981	6982 1
+6984	840 1
+6984	4536 1
+6984	6330 1
+6984	6555 1
+6984	6790 1
+6984	7040 1
+6984	7052 1
+6985	6330 1
+6990	1982 1
+6991	840 1
+6991	1982 1
+6991	2565 1
+6991	3809 1
+6991	4361 1
+6991	4536 1
+6991	4666 1
+6991	5012 1
+6991	5199 1
+6991	5288 1
+6991	6198 1
+6991	6736 1
+6991	6789 1
+6991	7040 1
+6991	7052 1
+6991	7108 1
+6991	7295 1
+6991	7323 1
+6993	967 1
+6993	1191 1
+6993	1982 1
+6993	3084 1
+6993	3310 1
+6993	3381 1
+6993	3752 1
+6993	3885 1
+6993	3962 1
+6993	4071 1
+6993	4435 1
+6993	4632 1
+6993	4875 1
+6993	4981 1
+6993	5079 1
+6993	5199 1
+6993	5466 1
+6993	5643 1
+6993	5655 1
+6993	5806 1
+6993	5839 1
+6993	5872 1
+6993	5902 1
+6993	5933 1
+6993	6000 1
+6993	6032 1
+6993	6043 1
+6993	6151 1
+6993	6174 1
+6993	6243 1
+6993	6414 1
+6993	6447 1
+6993	6555 1
+6993	6560 1
+6993	6596 1
+6993	6624 1
+6993	6774 1
+6993	6784 1
+6993	6790 1
+6993	6913 1
+6993	6914 1
+6993	6976 1
+6993	6979 1
+6993	6980 1
+6993	7005 1
+6993	7012 1
+6993	7021 1
+6993	7063 1
+6993	7092 1
+6993	7237 1
+6993	7277 1
+6993	7279 1
+6993	7280 1
+6993	7295 1
+6993	7301 1
+6993	7414 1
+6993	7442 1
+6993	7649 1
+6993	7701 1
+6993	7757 1
+6993	7763 1
+6993	7788 1
+6993	7795 1
+6993	7803 1
+6993	7809 1
+6993	7810 1
+6993	7813 1
+6993	7835 1
+6993	7855 1
+6993	7862 1
+6993	7871 1
+6993	7879 1
+6993	7882 1
+6993	7890 1
+6993	7899 1
+6993	7910 1
+6993	7912 1
+6993	7927 1
+6993	7946 1
+6993	7952 1
+6993	7961 1
+6995	6790 1
+6996	6997 1
+6998	6774 1
+6999	6774 1
+7000	6774 1
+7001	6774 1
+7002	6774 1
+7002	7620 1
+7003	6774 1
+7004	6774 1
+7005	3962 1
+7005	4037 1
+7005	5210 1
+7005	6032 1
+7005	6043 1
+7005	6634 1
+7005	6774 1
+7005	6914 1
+7005	7553 1
+7005	7620 1
+7005	7757 1
+7005	7763 1
+7005	7788 1
+7006	6774 1
+7007	6774 1
+7008	6774 1
+7009	6774 1
+7010	6774 1
+7011	2565 1
+7011	4536 1
+7011	6774 1
+7012	2658 1
+7012	6043 1
+7012	6774 1
+7012	6784 1
+7012	6913 1
+7012	6914 1
+7012	7021 1
+7012	7414 1
+7012	7910 1
+7012	7961 1
+7013	6774 1
+7014	6774 1
+7014	7021 1
+7015	6774 1
+7016	6774 1
+7017	6774 1
+7018	6774 1
+7019	4981 1
+7019	6774 1
+7019	7021 1
+7019	7862 1
+7020	6774 1
+7020	6780 1
+7020	6832 1
+7021	2658 1
+7021	4981 1
+7021	5079 1
+7021	5096 1
+7021	5466 1
+7021	5800 1
+7021	5806 1
+7021	5872 1
+7021	6123 1
+7021	6774 1
+7021	7386 1
+7021	7414 1
+7021	7813 1
+7021	8121 1
+7021	8149 1
+7022	6774 1
+7023	3346 1
+7023	5772 1
+7023	6560 1
+7023	6774 1
+7023	7052 1
+7023	7215 1
+7023	7222 1
+7023	7246 1
+7024	5814 1
+7024	6774 1
+7024	6913 1
+7025	6774 1
+7026	3297 1
+7026	5096 1
+7026	5148 1
+7026	5210 1
+7026	6774 1
+7026	6918 1
+7026	6979 1
+7026	7021 1
+7026	7047 1
+7026	7116 1
+7026	7587 1
+7026	7965 1
+7026	8083 1
+7027	6774 1
+7028	6774 1
+7029	5079 1
+7029	6774 1
+7031	7033 1
+7032	7033 1
+7035	4536 1
+7035	6624 1
+7036	4536 1
+7036	7040 1
+7037	4536 1
+7041	7042 1
+7043	5378 1
+7043	6634 1
+7043	7059 1
+7043	7238 1
+7043	7553 1
+7043	7707 1
+7043	7735 1
+7043	7763 1
+7043	7833 1
+7043	8219 1
+7043	8226 1
+7043	8235 1
+7043	8249 1
+7043	8275 1
+7044	4940 1
+7044	7059 1
+7044	7803 1
+7051	7059 1
+7052	155 1
+7052	840 1
+7052	967 1
+7052	1191 1
+7052	1403 1
+7052	2565 1
+7052	2851 1
+7052	2940 1
+7052	3238 1
+7052	3459 1
+7052	3726 1
+7052	3752 1
+7052	3803 1
+7052	3962 1
+7052	3969 1
+7052	4071 1
+7052	4341 1
+7052	4361 1
+7052	4435 1
+7052	4632 1
+7052	4875 1
+7052	4884 1
+7052	4934 1
+7052	4981 1
+7052	5002 1
+7052	5022 1
+7052	5028 1
+7052	5199 1
+7052	5233 1
+7052	5289 1
+7052	5404 1
+7052	5406 1
+7052	5421 1
+7052	5465 1
+7052	5466 1
+7052	5605 1
+7052	5738 1
+7052	5760 1
+7052	5776 1
+7052	5800 1
+7052	5806 1
+7052	5835 1
+7052	5839 1
+7052	5872 1
+7052	5897 1
+7052	5932 1
+7052	5933 1
+7052	5998 1
+7052	6000 1
+7052	6032 1
+7052	6097 1
+7052	6151 1
+7052	6174 1
+7052	6241 1
+7052	6243 1
+7052	6414 1
+7052	6555 1
+7052	6665 1
+7052	6712 1
+7052	6714 1
+7052	6736 1
+7052	6789 1
+7052	6832 1
+7052	6875 1
+7052	6907 1
+7052	6914 1
+7052	6923 1
+7052	6924 1
+7052	6934 1
+7052	6953 1
+7052	6979 1
+7052	7005 1
+7052	7012 1
+7052	7021 1
+7052	7047 1
+7052	7054 1
+7052	7059 1
+7052	7063 1
+7052	7088 1
+7052	7092 1
+7052	7094 1
+7052	7101 1
+7052	7108 1
+7052	7115 1
+7052	7116 1
+7052	7119 1
+7052	7143 1
+7052	7144 1
+7052	7146 1
+7052	7225 1
+7052	7233 1
+7052	7237 1
+7052	7279 1
+7052	7301 1
+7052	7341 1
+7052	7351 1
+7052	7362 1
+7052	7378 1
+7052	7381 1
+7052	7391 1
+7052	7400 1
+7052	7450 1
+7052	7478 1
+7052	7491 1
+7052	7497 1
+7052	7510 1
+7052	7512 1
+7052	7529 1
+7052	7544 1
+7052	7553 1
+7052	7561 1
+7052	7587 1
+7052	7593 1
+7052	7618 1
+7052	7620 1
+7052	7624 1
+7052	7632 1
+7052	7646 1
+7052	7647 1
+7052	7651 1
+7052	7662 1
+7052	7666 1
+7052	7683 1
+7052	7694 1
+7052	7695 1
+7052	7699 1
+7052	7707 1
+7052	7835 1
+7052	7855 1
+7052	7862 1
+7052	7871 1
+7052	7879 1
+7052	7890 1
+7052	7910 1
+7052	7912 1
+7052	7927 1
+7052	7946 1
+7052	7961 1
+7052	8163 1
+7052	8168 1
+7052	8178 1
+7052	8192 1
+7045	967 1
+7045	1498 1
+7045	3238 1
+7045	3381 1
+7045	5148 1
+7045	5671 1
+7045	5760 1
+7045	6241 1
+7045	6320 1
+7045	6414 1
+7045	6523 1
+7045	6712 1
+7045	6789 1
+7045	6934 1
+7045	6980 1
+7045	7021 1
+7045	7047 1
+7045	7052 1
+7045	7059 1
+7045	7280 1
+7045	7295 1
+7045	7443 1
+7045	7497 1
+7045	7544 1
+7045	7618 1
+7045	7620 1
+7045	7624 1
+7045	7662 1
+7045	7683 1
+7045	7694 1
+7045	7695 1
+7045	7699 1
+7045	7726 1
+7045	7757 1
+7045	7763 1
+7045	7882 1
+7053	3084 1
+7053	3297 1
+7053	3459 1
+7053	4401 1
+7053	4940 1
+7053	5148 1
+7053	5210 1
+7053	5246 1
+7053	5378 1
+7053	5671 1
+7053	5887 1
+7053	6307 1
+7053	6422 1
+7053	6618 1
+7053	6634 1
+7053	6914 1
+7053	6993 1
+7053	7047 1
+7053	7059 1
+7053	7225 1
+7053	7378 1
+7053	7389 1
+7053	7517 1
+7053	7553 1
+7053	7699 1
+7053	7791 1
+7053	8043 1
+7053	8083 1
+7053	8134 1
+7053	8224 1
+7053	8235 1
+7054	155 1
+7054	1026 1
+7054	3000 1
+7054	3238 1
+7054	3459 1
+7054	4884 1
+7054	5002 1
+7054	5393 1
+7054	5421 1
+7054	5500 1
+7054	5902 1
+7054	6424 1
+7054	6712 1
+7054	6907 1
+7054	6934 1
+7054	7052 1
+7054	7059 1
+7054	7116 1
+7054	7225 1
+7054	7316 1
+7054	7378 1
+7054	7510 1
+7054	7553 1
+7054	7557 1
+7054	7561 1
+7054	7583 1
+7054	7587 1
+7054	7593 1
+7054	7604 1
+7054	7620 1
+7054	7632 1
+7054	7646 1
+7054	7648 1
+7054	7651 1
+7054	7652 1
+7054	7673 1
+7054	7688 1
+7054	7695 1
+7054	7699 1
+7054	7809 1
+7046	3238 1
+7046	3334 1
+7046	3459 1
+7046	4884 1
+7046	5465 1
+7046	5800 1
+7046	6712 1
+7046	7047 1
+7046	7052 1
+7046	7059 1
+7046	7225 1
+7046	7414 1
+7046	7553 1
+7046	7557 1
+7046	7561 1
+7046	7620 1
+7046	7642 1
+7046	7646 1
+7046	7662 1
+7046	7688 1
+7046	7695 1
+7047	1191 1
+7047	1498 1
+7047	1865 1
+7047	1982 1
+7047	2223 1
+7047	2658 1
+7047	3238 1
+7047	3293 1
+7047	3297 1
+7047	3381 1
+7047	3962 1
+7047	4037 1
+7047	4071 1
+7047	4401 1
+7047	4432 1
+7047	4435 1
+7047	4507 1
+7047	4981 1
+7047	4983 1
+7047	5022 1
+7047	5079 1
+7047	5096 1
+7047	5148 1
+7047	5179 1
+7047	5210 1
+7047	5246 1
+7047	5378 1
+7047	5421 1
+7047	5466 1
+7047	5529 1
+7047	5605 1
+7047	5614 1
+7047	5643 1
+7047	5671 1
+7047	5738 1
+7047	5812 1
+7047	5819 1
+7047	5839 1
+7047	5887 1
+7047	5933 1
+7047	6032 1
+7047	6043 1
+7047	6044 1
+7047	6151 1
+7047	6174 1
+7047	6320 1
+7047	6414 1
+7047	6422 1
+7047	6523 1
+7047	6555 1
+7047	6560 1
+7047	6618 1
+7047	6634 1
+7047	6712 1
+7047	6737 1
+7047	6759 1
+7047	6780 1
+7047	6875 1
+7047	6914 1
+7047	6918 1
+7047	6934 1
+7047	6946 1
+7047	6979 1
+7047	6980 1
+7047	6993 1
+7047	7021 1
+7047	7052 1
+7047	7059 1
+7047	7063 1
+7047	7092 1
+7047	7120 1
+7047	7233 1
+7047	7277 1
+7047	7280 1
+7047	7341 1
+7047	7386 1
+7047	7389 1
+7047	7391 1
+7047	7443 1
+7047	7544 1
+7047	7553 1
+7047	7620 1
+7047	7634 1
+7047	7646 1
+7047	7649 1
+7047	7651 1
+7047	7662 1
+7047	7683 1
+7047	7694 1
+7047	7695 1
+7047	7699 1
+7047	7707 1
+7047	7726 1
+7047	7763 1
+7047	7778 1
+7047	7788 1
+7047	7795 1
+7047	7803 1
+7047	7809 1
+7047	7810 1
+7047	7813 1
+7047	7833 1
+7047	7835 1
+7047	7839 1
+7047	7855 1
+7047	7860 1
+7047	7862 1
+7047	7871 1
+7047	7874 1
+7047	7879 1
+7047	7882 1
+7047	7890 1
+7047	7908 1
+7047	7912 1
+7047	7921 1
+7047	7924 1
+7047	7927 1
+7047	7946 1
+7047	7961 1
+7047	7965 1
+7047	7979 1
+7047	7991 1
+7047	7992 1
+7047	7994 1
+7047	7996 1
+7047	8002 1
+7047	8033 1
+7047	8037 1
+7047	8042 1
+7047	8044 1
+7047	8051 1
+7047	8073 1
+7047	8079 1
+7047	8121 1
+7047	8122 1
+7047	8124 1
+7047	8128 1
+7047	8132 1
+7047	8134 1
+7047	8139 1
+7047	8141 1
+7047	8163 1
+7047	8168 1
+7047	8174 1
+7047	8178 1
+7047	8192 1
+7047	8198 1
+7047	8204 1
+7047	8209 1
+7047	8212 1
+7047	8224 1
+7047	8225 1
+7047	8226 1
+7047	8235 1
+7047	8237 1
+7047	8246 1
+7047	8249 1
+7047	8263 1
+7047	8275 1
+7047	8276 1
+7047	8277 1
+7055	155 1
+7055	967 1
+7055	1498 1
+7055	3000 1
+7055	3238 1
+7055	3381 1
+7055	3459 1
+7055	3752 1
+7055	3885 1
+7055	3969 1
+7055	4341 1
+7055	4632 1
+7055	4875 1
+7055	4983 1
+7055	5002 1
+7055	5022 1
+7055	5028 1
+7055	5079 1
+7055	5096 1
+7055	5148 1
+7055	5289 1
+7055	5465 1
+7055	5605 1
+7055	5671 1
+7055	5800 1
+7055	5806 1
+7055	5835 1
+7055	5839 1
+7055	5872 1
+7055	5902 1
+7055	5933 1
+7055	6151 1
+7055	6241 1
+7055	6243 1
+7055	6442 1
+7055	6523 1
+7055	6634 1
+7055	6665 1
+7055	6712 1
+7055	6907 1
+7055	6934 1
+7055	6946 1
+7055	6980 1
+7055	7005 1
+7055	7012 1
+7055	7021 1
+7055	7047 1
+7055	7052 1
+7055	7059 1
+7055	7063 1
+7055	7088 1
+7055	7131 1
+7055	7237 1
+7055	7277 1
+7055	7279 1
+7055	7400 1
+7055	7414 1
+7055	7443 1
+7055	7450 1
+7055	7478 1
+7055	7510 1
+7055	7512 1
+7055	7561 1
+7055	7593 1
+7055	7618 1
+7055	7620 1
+7055	7624 1
+7055	7632 1
+7055	7634 1
+7055	7642 1
+7055	7646 1
+7055	7649 1
+7055	7651 1
+7055	7662 1
+7055	7683 1
+7055	7694 1
+7055	7695 1
+7055	7699 1
+7055	7707 1
+7055	7726 1
+7055	7757 1
+7055	7763 1
+7055	7778 1
+7055	7788 1
+7055	7795 1
+7055	7809 1
+7055	7813 1
+7055	7835 1
+7055	7871 1
+7055	7882 1
+7055	7910 1
+7055	7946 1
+7055	7965 1
+7055	7979 1
+7055	7992 1
+7055	8051 1
+7055	8174 1
+7055	8192 1
+7048	7059 1
+7056	1982 1
+7056	2565 1
+7056	3381 1
+7056	4983 1
+7056	5064 1
+7056	5148 1
+7056	5179 1
+7056	5671 1
+7056	5738 1
+7056	5839 1
+7056	6320 1
+7056	6523 1
+7056	6560 1
+7056	6980 1
+7056	6993 1
+7056	7052 1
+7056	7059 1
+7056	7116 1
+7056	7233 1
+7056	7277 1
+7056	7280 1
+7056	7443 1
+7056	7544 1
+7056	7618 1
+7056	7620 1
+7056	7666 1
+7056	7694 1
+7056	7726 1
+7056	7757 1
+7056	7763 1
+7056	7795 1
+7056	7803 1
+7056	7809 1
+7056	7839 1
+7056	7979 1
+7056	8209 1
+7056	8226 1
+7049	1191 1
+7049	3310 1
+7049	3381 1
+7049	4435 1
+7049	5096 1
+7049	5148 1
+7049	5466 1
+7049	5529 1
+7049	5671 1
+7049	6151 1
+7049	6555 1
+7049	6980 1
+7049	7005 1
+7049	7059 1
+7049	7277 1
+7049	7280 1
+7049	7443 1
+7049	7694 1
+7049	7757 1
+7049	7763 1
+7049	7788 1
+7049	7795 1
+7049	7803 1
+7049	7809 1
+7049	7855 1
+7049	7862 1
+7049	7871 1
+7057	155 1
+7057	1498 1
+7057	1982 1
+7057	2565 1
+7057	3000 1
+7057	3084 1
+7057	3297 1
+7057	3334 1
+7057	3459 1
+7057	3885 1
+7057	3962 1
+7057	3969 1
+7057	4037 1
+7057	4071 1
+7057	4341 1
+7057	4401 1
+7057	4632 1
+7057	4875 1
+7057	4940 1
+7057	4981 1
+7057	4983 1
+7057	5002 1
+7057	5022 1
+7057	5079 1
+7057	5210 1
+7057	5289 1
+7057	5406 1
+7057	5466 1
+7057	5500 1
+7057	5529 1
+7057	5800 1
+7057	5806 1
+7057	5812 1
+7057	5819 1
+7057	5835 1
+7057	5839 1
+7057	5872 1
+7057	5902 1
+7057	5933 1
+7057	6000 1
+7057	6032 1
+7057	6043 1
+7057	6044 1
+7057	6123 1
+7057	6151 1
+7057	6174 1
+7057	6241 1
+7057	6243 1
+7057	6320 1
+7057	6414 1
+7057	6417 1
+7057	6442 1
+7057	6555 1
+7057	6560 1
+7057	6596 1
+7057	6618 1
+7057	6634 1
+7057	6665 1
+7057	6875 1
+7057	6907 1
+7057	6914 1
+7057	6918 1
+7057	6924 1
+7057	6934 1
+7057	6946 1
+7057	6979 1
+7057	6980 1
+7057	6993 1
+7057	7005 1
+7057	7047 1
+7057	7050 1
+7057	7052 1
+7057	7054 1
+7057	7059 1
+7057	7063 1
+7057	7088 1
+7057	7092 1
+7057	7131 1
+7057	7225 1
+7057	7233 1
+7057	7237 1
+7057	7238 1
+7057	7279 1
+7057	7280 1
+7057	7378 1
+7057	7386 1
+7057	7400 1
+7057	7442 1
+7057	7478 1
+7057	7497 1
+7057	7510 1
+7057	7512 1
+7057	7529 1
+7057	7544 1
+7057	7561 1
+7057	7587 1
+7057	7620 1
+7057	7647 1
+7057	7699 1
+7057	7707 1
+7057	7763 1
+7057	7788 1
+7057	7809 1
+7057	7810 1
+7057	7833 1
+7057	7839 1
+7057	7908 1
+7057	7924 1
+7057	7961 1
+7057	7965 1
+7057	8051 1
+7057	8083 1
+7057	8121 1
+7057	8134 1
+7057	8168 1
+7057	8209 1
+7057	8224 1
+7057	8237 1
+7030	5822 1
+7030	6327 1
+7061	5822 1
+7061	6123 1
+7061	6832 1
+7062	1982 1
+7062	6634 1
+7062	7050 1
+7062	7620 1
+7063	840 1
+7063	2565 1
+7063	3238 1
+7063	5800 1
+7063	6123 1
+7063	6555 1
+7063	6784 1
+7063	6832 1
+7063	6907 1
+7063	6913 1
+7063	6914 1
+7063	7414 1
+7063	7510 1
+7063	7553 1
+7063	7620 1
+7063	7961 1
+7064	2565 1
+7064	6097 1
+7064	6946 1
+7065	2565 1
+7038	840 1
+7038	3809 1
+7038	4944 1
+7038	5772 1
+7038	6097 1
+7038	6327 1
+7038	6634 1
+7072	7073 1
+7070	7073 1
+7070	7115 1
+7071	7073 1
+7071	7092 1
+7071	7115 1
+7071	7414 1
+7079	4666 1
+7080	1982 1
+7080	2511 1
+7080	2658 1
+7080	3084 1
+7080	3297 1
+7080	3381 1
+7080	3459 1
+7080	3885 1
+7080	3962 1
+7080	4666 1
+7080	4944 1
+7080	4983 1
+7080	5002 1
+7080	5012 1
+7080	5022 1
+7080	5199 1
+7080	5210 1
+7080	5288 1
+7080	5773 1
+7080	5800 1
+7080	5806 1
+7080	5819 1
+7080	5872 1
+7080	5902 1
+7080	5933 1
+7080	6000 1
+7080	6243 1
+7080	6270 1
+7080	6320 1
+7080	6555 1
+7080	6560 1
+7080	6736 1
+7080	6759 1
+7080	6946 1
+7080	6979 1
+7080	6980 1
+7080	7108 1
+7080	7185 1
+7080	7225 1
+7080	7277 1
+7080	7279 1
+7080	7280 1
+7080	7295 1
+7080	7301 1
+7080	7414 1
+7080	7442 1
+7080	7449 1
+7080	7478 1
+7080	7497 1
+7080	7510 1
+7080	7529 1
+7080	7574 1
+7080	7620 1
+7080	7624 1
+7080	7647 1
+7080	7666 1
+7080	7688 1
+7080	7797 1
+7080	7813 1
+7080	7871 1
+7080	7879 1
+7080	7882 1
+7080	7924 1
+7080	7927 1
+7080	7928 1
+7080	7965 1
+7080	8130 1
+7080	8163 1
+7080	8168 1
+7080	8174 1
+7082	4944 1
+6946	938 1
+6946	1026 1
+6946	2940 1
+6946	3238 1
+6946	4341 1
+6946	4632 1
+6946	4879 1
+6946	4884 1
+6946	4934 1
+6946	4992 1
+6946	5002 1
+6946	5028 1
+6946	5179 1
+6946	5289 1
+6946	5393 1
+6946	5421 1
+6946	5745 1
+6946	5800 1
+6946	6032 1
+6946	6417 1
+6946	6424 1
+6946	6634 1
+6946	6665 1
+6946	6780 1
+6946	6924 1
+6946	7116 1
+6946	7120 1
+6946	7225 1
+6946	7362 1
+6946	7378 1
+6946	7386 1
+6946	7391 1
+6946	7397 1
+6946	7423 1
+6946	7434 1
+6946	7436 1
+6946	7440 1
+6946	7442 1
+6946	7574 1
+6946	7587 1
+6946	7590 1
+6946	7604 1
+6946	7620 1
+6946	7642 1
+6946	7648 1
+6946	7652 1
+6946	7653 1
+6946	7666 1
+6946	7668 1
+6946	7669 1
+6946	7683 1
+6946	7688 1
+6946	7701 1
+6946	7809 1
+6946	7857 1
+6946	7928 1
+6946	7952 1
+6946	7992 1
+6946	7994 1
+6946	7996 1
+6946	8007 1
+6946	8019 1
+6946	8025 1
+6946	8090 1
+6946	8121 1
+6946	8128 1
+6946	8130 1
+6946	8169 1
+7085	6946 1
+7087	6946 1
+7087	7699 1
+7086	938 1
+7086	1403 1
+7086	1498 1
+7086	1982 1
+7086	2658 1
+7086	2851 1
+7086	3293 1
+7086	3297 1
+7086	3346 1
+7086	3726 1
+7086	4037 1
+7086	4071 1
+7086	4401 1
+7086	4432 1
+7086	4632 1
+7086	4875 1
+7086	4940 1
+7086	4966 1
+7086	4983 1
+7086	5022 1
+7086	5096 1
+7086	5210 1
+7086	5246 1
+7086	5289 1
+7086	5378 1
+7086	5404 1
+7086	5406 1
+7086	5432 1
+7086	5605 1
+7086	5614 1
+7086	5738 1
+7086	5800 1
+7086	5806 1
+7086	5812 1
+7086	5819 1
+7086	5839 1
+7086	5872 1
+7086	5902 1
+7086	5933 1
+7086	6000 1
+7086	6044 1
+7086	6174 1
+7086	6243 1
+7086	6422 1
+7086	6442 1
+7086	6523 1
+7086	6618 1
+7086	6634 1
+7086	6665 1
+7086	6736 1
+7086	6737 1
+7086	6759 1
+7086	6780 1
+7086	6784 1
+7086	6875 1
+7086	6907 1
+7086	6918 1
+7086	6946 1
+7086	7021 1
+7086	7047 1
+7086	7088 1
+7086	7094 1
+7086	7108 1
+7086	7131 1
+7086	7233 1
+7086	7237 1
+7086	7238 1
+7086	7243 1
+7086	7279 1
+7086	7341 1
+7086	7378 1
+7086	7389 1
+7086	7391 1
+7086	7414 1
+7086	7422 1
+7086	7450 1
+7086	7478 1
+7086	7491 1
+7086	7497 1
+7086	7510 1
+7086	7512 1
+7086	7517 1
+7086	7529 1
+7086	7553 1
+7086	7561 1
+7086	7620 1
+7086	7646 1
+7086	7810 1
+7086	7833 1
+7086	7835 1
+7086	7855 1
+7086	7860 1
+7086	7882 1
+7086	7908 1
+7086	7910 1
+7086	7912 1
+7086	7924 1
+7086	7946 1
+7086	7965 1
+7086	7979 1
+7086	7992 1
+7086	8037 1
+7086	8042 1
+7086	8044 1
+7086	8051 1
+7086	8073 1
+7086	8083 1
+7086	8121 1
+7086	8124 1
+7086	8128 1
+7086	8134 1
+7086	8141 1
+7086	8149 1
+7086	8163 1
+7086	8168 1
+7086	8174 1
+7086	8192 1
+7086	8198 1
+7086	8209 1
+7086	8212 1
+7086	8219 1
+7086	8224 1
+7086	8237 1
+7084	6946 1
+7088	4940 1
+7088	6097 1
+7088	7533 1
+7088	7632 1
+7088	7699 1
+7090	155 1
+7090	1026 1
+7090	2565 1
+7090	3459 1
+7090	3803 1
+7090	5002 1
+7090	7054 1
+7090	7225 1
+7090	7378 1
+7090	7529 1
+7090	7553 1
+7092	1026 1
+7092	1191 1
+7092	1403 1
+7092	1982 1
+7092	2785 1
+7092	2851 1
+7092	3310 1
+7092	3346 1
+7092	3459 1
+7092	3726 1
+7092	3885 1
+7092	3962 1
+7092	3969 1
+7092	4037 1
+7092	4071 1
+7092	4341 1
+7092	4507 1
+7092	4632 1
+7092	5002 1
+7092	5022 1
+7092	5079 1
+7092	5179 1
+7092	5210 1
+7092	5288 1
+7092	5289 1
+7092	5529 1
+7092	5671 1
+7092	5745 1
+7092	5773 1
+7092	5800 1
+7092	5835 1
+7092	5872 1
+7092	5902 1
+7092	5998 1
+7092	6000 1
+7092	6032 1
+7092	6043 1
+7092	6044 1
+7092	6243 1
+7092	6327 1
+7092	6414 1
+7092	6422 1
+7092	6523 1
+7092	6560 1
+7092	6618 1
+7092	6665 1
+7092	6736 1
+7092	6755 1
+7092	6784 1
+7092	6832 1
+7092	6914 1
+7092	6980 1
+7092	7005 1
+7092	7052 1
+7092	7131 1
+7092	7144 1
+7092	7162 1
+7092	7185 1
+7092	7214 1
+7092	7225 1
+7092	7237 1
+7092	7243 1
+7092	7280 1
+7092	7301 1
+7092	7378 1
+7092	7389 1
+7092	7400 1
+7092	7414 1
+7092	7443 1
+7092	7510 1
+7092	7553 1
+7092	7557 1
+7092	7561 1
+7092	7587 1
+7092	7618 1
+7092	7624 1
+7092	7632 1
+7092	7649 1
+7092	7651 1
+7092	7662 1
+7092	7788 1
+7092	7795 1
+7092	7809 1
+7092	7833 1
+7092	7835 1
+7092	7890 1
+7092	7924 1
+7092	7952 1
+7092	7961 1
+7092	8033 1
+7092	8068 1
+7092	8121 1
+7092	8168 1
+5015	3293 1
+5015	4940 1
+5015	5002 1
+5015	5199 1
+5015	5760 1
+5015	6044 1
+5015	6299 1
+5015	6422 1
+5015	6634 1
+5015	6979 1
+5015	7620 1
+5015	7646 1
+5015	7810 1
+5015	8122 1
+7089	6634 1
+7089	7301 1
+7096	3459 1
+7096	5773 1
+7096	6634 1
+7096	7054 1
+7096	7529 1
+7095	6634 1
+7098	7101 1
+7099	2785 1
+7099	3631 1
+7099	5288 1
+7099	5393 1
+7099	5582 1
+7099	5760 1
+7099	5814 1
+7099	5897 1
+7099	6270 1
+7099	6414 1
+7099	6560 1
+7099	6714 1
+7099	6907 1
+7099	6913 1
+7099	6976 1
+7099	7101 1
+7099	7214 1
+7099	7400 1
+7100	4037 1
+7100	5012 1
+7100	5384 1
+7100	5432 1
+7100	5582 1
+7100	6327 1
+7100	6414 1
+7100	6913 1
+7100	6976 1
+7100	7101 1
+7100	7115 1
+7100	7119 1
+7100	7143 1
+7100	7144 1
+7100	7301 1
+7103	7108 1
+7104	1403 1
+7104	2785 1
+7104	2851 1
+7104	3631 1
+7104	3726 1
+7104	5002 1
+7104	5404 1
+7104	5432 1
+7104	6665 1
+7104	6784 1
+7104	6913 1
+7104	6976 1
+7104	7108 1
+7104	7214 1
+7104	7301 1
+7106	2785 1
+7106	2851 1
+7106	3726 1
+7106	7108 1
+7107	7108 1
+7107	7273 1
+7109	7115 1
+7109	7510 1
+7110	3885 1
+7110	5384 1
+7110	6414 1
+7110	7092 1
+7110	7115 1
+7111	7115 1
+7112	7115 1
+7113	3334 1
+7113	3752 1
+7113	5233 1
+7113	5466 1
+7113	6422 1
+7113	6946 1
+7113	7115 1
+7113	7237 1
+7113	7439 1
+7113	7529 1
+7113	7587 1
+7113	7961 1
+7114	7115 1
+7116	4875 1
+7118	7119 1
+7117	4037 1
+7117	4632 1
+7117	6327 1
+7117	6994 1
+7117	7119 1
+7117	7143 1
+7117	7144 1
+7120	1865 1
+7120	3238 1
+7120	3381 1
+7120	5776 1
+7120	6241 1
+7120	6320 1
+7120	6560 1
+7120	6712 1
+7120	7047 1
+7120	7386 1
+7120	7544 1
+7120	7634 1
+7120	7651 1
+7120	7683 1
+7120	7695 1
+7120	7699 1
+7120	7707 1
+7120	7809 1
+7121	4361 1
+7121	5776 1
+7121	5800 1
+7121	5969 1
+7121	6714 1
+7121	6832 1
+7121	7279 1
+7123	5384 1
+7122	5384 1
+7124	4037 1
+7125	4037 1
+7127	4037 1
+7127	7301 1
+7128	4037 1
+7128	6784 1
+7129	4037 1
+7129	5500 1
+7129	5897 1
+7129	6299 1
+7129	6784 1
+7129	6832 1
+7129	6993 1
+7129	7290 1
+7129	7587 1
+7129	7666 1
+7129	7763 1
+7136	4037 1
+7136	4884 1
+7130	4037 1
+7130	5773 1
+7137	4037 1
+7131	967 1
+7131	2658 1
+7131	3238 1
+7131	3962 1
+7131	4037 1
+7131	4940 1
+7131	5773 1
+7131	6032 1
+7131	6123 1
+7131	6442 1
+7131	6555 1
+7131	6832 1
+7131	6907 1
+7131	6914 1
+7131	7021 1
+7131	7092 1
+7131	7280 1
+7131	7414 1
+7131	7553 1
+7131	7587 1
+7131	7809 1
+7131	7833 1
+7131	7871 1
+7131	7910 1
+7126	2511 1
+7126	4037 1
+7126	5773 1
+7132	2851 1
+7132	3238 1
+7132	4037 1
+7132	5002 1
+7132	5839 1
+7132	5872 1
+7132	6043 1
+7132	6123 1
+7132	6555 1
+7132	6784 1
+7132	6832 1
+7132	6913 1
+7132	6914 1
+7132	7021 1
+7132	7052 1
+7132	7063 1
+7132	7131 1
+7132	7257 1
+7132	7280 1
+7132	7304 1
+7132	7306 1
+7132	7362 1
+7132	7407 1
+7132	7423 1
+7132	7561 1
+7132	7567 1
+7132	7666 1
+7132	7809 1
+7132	7961 1
+7132	8121 1
+7133	4037 1
+7138	4037 1
+7138	7214 1
+7134	4037 1
+7134	7373 1
+7134	7587 1
+7139	2851 1
+7139	4037 1
+7139	7214 1
+7140	4037 1
+7135	4037 1
+6986	7143 1
+7142	2511 1
+7142	5773 1
+7142	7143 1
+7142	7144 1
+7145	7144 1
+7146	7144 1
+7151	6414 1
+7153	5022 1
+7153	5671 1
+7153	5887 1
+7153	5897 1
+7153	5969 1
+7153	6327 1
+7153	6907 1
+7153	6914 1
+7153	7373 1
+7153	8134 1
+7153	8141 1
+7153	8148 1
+7154	6327 1
+7155	6327 1
+7156	6327 1
+7157	6327 1
+7160	6327 1
+7158	6327 1
+7159	6327 1
+6994	1403 1
+6994	2851 1
+6994	3726 1
+6994	5432 1
+6994	5582 1
+6994	5969 1
+6994	6560 1
+6994	6634 1
+6994	6714 1
+6994	6736 1
+6994	6784 1
+6994	6913 1
+6994	7161 1
+6994	7214 1
+6994	7222 1
+6994	7250 1
+6994	7289 1
+6994	7290 1
+6994	7301 1
+7163	7162 1
+7163	7254 1
+7164	3962 1
+7164	5012 1
+7164	5179 1
+7164	6789 1
+7165	1026 1
+7165	7050 1
+7165	7168 1
+7166	7168 1
+7167	7168 1
+7172	2511 1
+7172	7649 1
+7173	2511 1
+7173	5819 1
+7174	5773 1
+7175	5773 1
+7175	7131 1
+7178	5773 1
+7178	7587 1
+7179	5773 1
+7179	7131 1
+7176	5773 1
+7176	7116 1
+7176	7185 1
+7176	7620 1
+7177	5773 1
+7183	5179 1
+7183	5529 1
+7183	5814 1
+7183	6665 1
+7183	6914 1
+7183	6980 1
+7183	7225 1
+7183	7924 1
+7183	8186 1
+7184	3631 1
+7184	7185 1
+7187	3631 1
+7188	1403 1
+7188	3631 1
+7188	3726 1
+7188	4361 1
+7188	5811 1
+7188	6299 1
+7188	6596 1
+7188	6789 1
+7188	6832 1
+7188	6976 1
+7188	7315 1
+7188	7351 1
+7188	7386 1
+7188	7397 1
+7189	3631 1
+7189	5760 1
+7189	8174 1
+7190	7191 1
+7192	5288 1
+7193	5288 1
+6889	5288 1
+6889	7233 1
+6889	7701 1
+6889	7921 1
+6889	7928 1
+7194	7195 1
+7197	2785 1
+7198	2785 1
+7198	4037 1
+7198	4401 1
+7198	7707 1
+7198	8219 1
+7198	8224 1
+7198	8225 1
+7198	8226 1
+7203	6270 1
+7205	7023 1
+7206	7023 1
+7210	7214 1
+7211	7214 1
+7212	7214 1
+7217	6994 1
+7219	1919 1
+7218	1919 1
+7220	5404 1
+7221	5404 1
+7222	1403 1
+7223	6665 1
+7225	155 1
+7225	1026 1
+7225	1982 1
+7225	2658 1
+7225	3084 1
+7225	3310 1
+7225	3459 1
+7225	4071 1
+7225	4966 1
+7225	5022 1
+7225	5079 1
+7225	5406 1
+7225	5655 1
+7225	5800 1
+7225	5806 1
+7225	5819 1
+7225	5839 1
+7225	5872 1
+7225	5902 1
+7225	6000 1
+7225	6032 1
+7225	6320 1
+7225	6555 1
+7225	6596 1
+7225	6665 1
+7225	6914 1
+7225	6979 1
+7225	7092 1
+7225	7237 1
+7225	7378 1
+7225	7386 1
+7225	7400 1
+7225	7449 1
+7225	7508 1
+7225	7510 1
+7225	7529 1
+7225	7553 1
+7225	7620 1
+7225	7632 1
+7225	7652 1
+7225	7662 1
+7225	7699 1
+7225	7707 1
+7225	7730 1
+7225	7835 1
+7225	7924 1
+7225	8192 1
+7226	5835 1
+7226	6665 1
+7226	7553 1
+7226	7557 1
+7227	155 1
+7227	1026 1
+7227	3962 1
+7227	5872 1
+7227	6555 1
+7227	6665 1
+7227	6923 1
+7227	7225 1
+7227	7277 1
+7227	7533 1
+7227	7587 1
+7227	7910 1
+7228	2565 1
+7228	4884 1
+7228	6665 1
+7228	7225 1
+7228	7561 1
+7228	7620 1
+7228	7662 1
+7229	1026 1
+7229	4341 1
+7229	5835 1
+7229	6665 1
+7229	7400 1
+7229	7553 1
+7229	7557 1
+5143	1026 1
+5143	1403 1
+5143	2851 1
+5143	3726 1
+5143	5806 1
+5143	6665 1
+5143	6736 1
+5143	6907 1
+5143	6913 1
+5143	7225 1
+5143	7246 1
+5143	7250 1
+5143	7273 1
+5143	7289 1
+5143	7557 1
+5143	7651 1
+7230	4884 1
+7230	5806 1
+7230	6665 1
+7230	7632 1
+7231	155 1
+7231	938 1
+7231	967 1
+7231	1026 1
+7231	2565 1
+7231	3000 1
+7231	3084 1
+7231	3238 1
+7231	3310 1
+7231	3381 1
+7231	3752 1
+7231	3885 1
+7231	3962 1
+7231	4071 1
+7231	4341 1
+7231	4435 1
+7231	4632 1
+7231	4879 1
+7231	4884 1
+7231	4981 1
+7231	5028 1
+7231	5079 1
+7231	5148 1
+7231	5289 1
+7231	5465 1
+7231	5500 1
+7231	5529 1
+7231	5671 1
+7231	5800 1
+7231	5806 1
+7231	5839 1
+7231	5872 1
+7231	5902 1
+7231	6000 1
+7231	6043 1
+7231	6151 1
+7231	6174 1
+7231	6241 1
+7231	6243 1
+7231	6523 1
+7231	6560 1
+7231	6665 1
+7231	6712 1
+7231	6907 1
+7231	6914 1
+7231	6934 1
+7231	6980 1
+7231	7005 1
+7231	7047 1
+7231	7052 1
+7231	7054 1
+7231	7116 1
+7231	7131 1
+7231	7225 1
+7231	7237 1
+7231	7277 1
+7231	7279 1
+7231	7280 1
+7231	7386 1
+7231	7400 1
+7231	7414 1
+7231	7443 1
+7231	7450 1
+7231	7478 1
+7231	7490 1
+7231	7498 1
+7231	7510 1
+7231	7544 1
+7231	7587 1
+7231	7593 1
+7231	7604 1
+7231	7618 1
+7231	7620 1
+7231	7624 1
+7231	7632 1
+7231	7642 1
+7231	7646 1
+7231	7649 1
+7231	7651 1
+7231	7658 1
+7231	7662 1
+7231	7673 1
+7231	7683 1
+7231	7694 1
+7231	7695 1
+7231	7699 1
+7231	7707 1
+7231	7726 1
+7231	7757 1
+7231	7763 1
+7231	7788 1
+7231	7795 1
+7231	7809 1
+7231	7813 1
+7231	7855 1
+7231	7862 1
+7231	7871 1
+7231	7879 1
+7231	7882 1
+7231	7890 1
+7231	7921 1
+7232	6907 1
+7233	5179 1
+7233	5760 1
+7233	5811 1
+7233	5872 1
+7233	6123 1
+7233	6447 1
+7233	6907 1
+7233	6946 1
+7233	7386 1
+7233	7389 1
+7233	7407 1
+7233	7422 1
+7233	7529 1
+7233	7683 1
+7233	7809 1
+7233	7860 1
+7233	7992 1
+7233	8083 1
+7233	8121 1
+7233	8134 1
+7233	8174 1
+7233	8192 1
+7234	6907 1
+7235	6907 1
+7236	1026 1
+7236	2658 1
+7236	3084 1
+7236	4632 1
+7236	4884 1
+7236	5002 1
+7236	5079 1
+7236	5148 1
+7236	5500 1
+7236	6032 1
+7236	6907 1
+7236	6993 1
+7236	7088 1
+7236	7378 1
+7236	7478 1
+7236	7529 1
+7236	7553 1
+7236	7588 1
+7236	7620 1
+7236	7632 1
+7236	7662 1
+7236	7695 1
+7236	7699 1
+7237	938 1
+7237	5064 1
+7237	5738 1
+7237	5800 1
+7237	6243 1
+7237	6907 1
+7237	7050 1
+7237	7233 1
+7237	7391 1
+7237	7498 1
+7237	7529 1
+7237	8051 1
+7237	8192 1
+7237	8198 1
+7237	8224 1
+7238	4432 1
+7238	4884 1
+7238	6618 1
+7238	6907 1
+7238	7233 1
+7238	7620 1
+7238	7624 1
+7238	7833 1
+7238	8212 1
+7239	3000 1
+7239	3969 1
+7239	4632 1
+7239	4875 1
+7239	4884 1
+7239	5806 1
+7239	5872 1
+7239	6000 1
+7239	6243 1
+7239	6907 1
+7239	7054 1
+7239	7116 1
+7239	7131 1
+7239	7237 1
+7239	7279 1
+7239	7478 1
+7239	7497 1
+7239	7553 1
+7239	7561 1
+7239	7587 1
+7239	7620 1
+7240	1403 1
+7241	938 1
+7241	1403 1
+7241	3346 1
+7241	4432 1
+7241	5028 1
+7241	5800 1
+7241	5806 1
+7241	5872 1
+7241	6032 1
+7241	6123 1
+7241	6784 1
+7241	6832 1
+7241	6875 1
+7241	6913 1
+7241	6914 1
+7241	6976 1
+7241	7238 1
+7241	7279 1
+7241	7373 1
+7241	7561 1
+7241	7791 1
+7243	7763 1
+7245	6736 1
+7251	2851 1
+7252	2851 1
+7253	2851 1
+7253	4037 1
+7253	7871 1
+7253	7912 1
+7255	5801 1
+7262	155 1
+7262	3381 1
+7262	3969 1
+7262	5500 1
+7262	5529 1
+7262	5835 1
+7262	7054 1
+7262	7400 1
+7262	7557 1
+7262	7757 1
+7262	7763 1
+7260	7262 1
+7260	7301 1
+7260	7478 1
+7265	6784 1
+7266	1982 1
+7266	5432 1
+7266	6555 1
+7266	6634 1
+7266	6714 1
+7266	6784 1
+7267	6784 1
+7268	6784 1
+7269	6784 1
+7270	5210 1
+7270	5897 1
+7270	6442 1
+7270	6784 1
+7270	7763 1
+7271	4037 1
+7271	6714 1
+7271	6784 1
+7276	6913 1
+7276	7021 1
+7276	7052 1
+7276	7740 1
+7276	7763 1
+7277	3334 1
+7277	6913 1
+7277	7493 1
+7277	8121 1
+7278	6832 1
+7278	6913 1
+7278	6953 1
+7278	7414 1
+7279	2658 1
+7279	3000 1
+7279	5812 1
+7279	6555 1
+7279	6618 1
+7279	6913 1
+7279	7012 1
+7279	7054 1
+7279	7225 1
+7279	7237 1
+7279	7280 1
+7279	7443 1
+7279	7587 1
+7279	7588 1
+7279	7694 1
+7279	7726 1
+7279	7910 1
+7279	8163 1
+7279	8192 1
+7280	1026 1
+7280	2223 1
+7280	2658 1
+7280	3238 1
+7280	3293 1
+7280	3297 1
+7280	3310 1
+7280	3381 1
+7280	3752 1
+7280	3962 1
+7280	4071 1
+7280	4401 1
+7280	4432 1
+7280	4507 1
+7280	4981 1
+7280	4983 1
+7280	5079 1
+7280	5096 1
+7280	5179 1
+7280	5233 1
+7280	5466 1
+7280	5529 1
+7280	5605 1
+7280	5806 1
+7280	5812 1
+7280	5819 1
+7280	5839 1
+7280	6032 1
+7280	6043 1
+7280	6044 1
+7280	6151 1
+7280	6241 1
+7280	6299 1
+7280	6422 1
+7280	6555 1
+7280	6560 1
+7280	6618 1
+7280	6737 1
+7280	6780 1
+7280	6875 1
+7280	6913 1
+7280	6918 1
+7280	6924 1
+7280	6946 1
+7280	7005 1
+7280	7021 1
+7280	7063 1
+7280	7092 1
+7280	7225 1
+7280	7233 1
+7280	7277 1
+7280	7386 1
+7280	7393 1
+7280	7440 1
+7280	7443 1
+7280	7588 1
+7280	7590 1
+7280	7620 1
+7280	7649 1
+7280	7652 1
+7280	7662 1
+7280	7666 1
+7280	7668 1
+7280	7669 1
+7280	7683 1
+7280	7691 1
+7280	7699 1
+7280	7740 1
+7280	7757 1
+7280	7763 1
+7280	7778 1
+7280	7788 1
+7280	7795 1
+7280	7809 1
+7280	7813 1
+7280	7833 1
+7280	7908 1
+7280	7910 1
+7280	7961 1
+7280	7965 1
+7280	7994 1
+7280	7996 1
+7280	8002 1
+7280	8042 1
+7280	8121 1
+7280	8124 1
+7280	8141 1
+7280	8174 1
+7280	8209 1
+7282	5378 1
+7282	5432 1
+7283	5432 1
+7284	5378 1
+7284	5432 1
+7285	5432 1
+7286	5432 1
+7287	5432 1
+7291	7292 1
+7293	6299 1
+7293	6714 1
+7293	6976 1
+7293	7301 1
+5949	5582 1
+5949	6976 1
+5949	7301 1
+7296	6976 1
+7295	4071 1
+7295	5179 1
+7295	5199 1
+7295	5887 1
+7295	6299 1
+7295	6914 1
+7295	6976 1
+7295	6980 1
+7295	7277 1
+7295	7301 1
+7295	7386 1
+7295	7924 1
+7295	8249 1
+7301	2223 1
+7301	2658 1
+7301	4071 1
+7301	4983 1
+7301	5819 1
+7301	6044 1
+7301	6320 1
+7301	6523 1
+7301	6634 1
+7301	6759 1
+7301	6832 1
+7301	6914 1
+7301	6918 1
+7301	6946 1
+7301	7052 1
+7301	7092 1
+7301	7694 1
+7301	7707 1
+7301	7757 1
+7301	7833 1
+7301	7871 1
+7301	7890 1
+7301	7908 1
+7301	7979 1
+7301	7992 1
+7301	8044 1
+7301	8079 1
+7298	5079 1
+7298	7301 1
+7299	7301 1
+7300	7301 1
+7302	7092 1
+7302	7301 1
+7305	6714 1
+7171	4632 1
+7171	5079 1
+7171	6714 1
+7171	7092 1
+7171	7553 1
+7171	7632 1
+7171	7662 1
+7171	7809 1
+7171	8043 1
+7309	5969 1
+7310	5969 1
+7317	5199 1
+7317	5760 1
+7317	5897 1
+7317	6198 1
+7317	6424 1
+7317	6503 1
+7317	6596 1
+7317	6832 1
+7317	7146 1
+7317	7295 1
+7317	7318 1
+7317	7323 1
+7317	7341 1
+7317	7351 1
+7317	7387 1
+7320	7319 1
+7294	155 1
+7294	1026 1
+7294	1982 1
+7294	3084 1
+7294	3334 1
+7294	3459 1
+7294	3962 1
+7294	4940 1
+7294	4983 1
+7294	5002 1
+7294	5079 1
+7294	5148 1
+7294	5179 1
+7294	5199 1
+7294	5246 1
+7294	5605 1
+7294	5655 1
+7294	5800 1
+7294	5806 1
+7294	5811 1
+7294	5839 1
+7294	6032 1
+7294	6243 1
+7294	6414 1
+7294	6523 1
+7294	6555 1
+7294	6618 1
+7294	6832 1
+7294	6979 1
+7294	6993 1
+7294	7225 1
+7294	7393 1
+7294	7400 1
+7294	7414 1
+7294	7510 1
+7294	7620 1
+7294	7632 1
+7294	7651 1
+7294	8121 1
+7326	5199 1
+7327	4361 1
+7327	5199 1
+7327	6299 1
+7327	6503 1
+7327	6832 1
+7327	7295 1
+7281	5671 1
+7281	5760 1
+7281	5902 1
+7281	6299 1
+7281	6503 1
+7281	7277 1
+7281	7295 1
+7281	7510 1
+7281	7529 1
+7281	7632 1
+7281	7795 1
+7281	7809 1
+7329	6832 1
+7329	7295 1
+7333	7295 1
+7330	5872 1
+7330	7295 1
+7332	6299 1
+7335	3962 1
+7335	5002 1
+7335	5210 1
+7335	5760 1
+7335	6299 1
+7335	6424 1
+7335	6503 1
+7335	6555 1
+7335	6789 1
+7335	6832 1
+7335	7381 1
+7335	7414 1
+7335	7791 1
+7335	7833 1
+7335	8276 1
+7336	6299 1
+7337	6299 1
+7341	5806 1
+7341	7414 1
+7342	4361 1
+7345	4361 1
+7343	3238 1
+7343	3334 1
+7343	4361 1
+7343	5233 1
+7343	5806 1
+7343	6832 1
+7343	6914 1
+7343	7414 1
+7343	7788 1
+7343	7809 1
+7343	7927 1
+7343	8134 1
+7344	155 1
+7344	967 1
+7344	4361 1
+7347	6832 1
+7348	6832 1
+7348	7561 1
+7349	6832 1
+7350	155 1
+7350	2940 1
+7350	4940 1
+7350	4981 1
+7350	5800 1
+7350	5806 1
+7350	5872 1
+7350	6243 1
+7350	6320 1
+7350	6618 1
+7350	6832 1
+7350	7381 1
+7350	7414 1
+7350	7553 1
+7350	7561 1
+7350	7618 1
+7350	7624 1
+7350	7695 1
+7350	7726 1
+7350	7809 1
+7350	8224 1
+7351	5897 1
+7351	6832 1
+7352	3310 1
+7352	3334 1
+7352	3459 1
+7352	5079 1
+7352	5148 1
+7352	5835 1
+7352	6447 1
+7352	6832 1
+7352	6980 1
+7352	7092 1
+7352	7378 1
+7352	7386 1
+7352	7544 1
+7352	7740 1
+7352	7809 1
+7353	6832 1
+7354	5800 1
+7354	6832 1
+7354	7351 1
+7354	7478 1
+7355	6832 1
+7360	7351 1
+7362	2565 1
+7362	2940 1
+7362	4884 1
+7362	5233 1
+7362	7116 1
+7362	7381 1
+7362	7587 1
+7362	7618 1
+7363	6789 1
+7365	6596 1
+7371	7373 1
+7371	7567 1
+7374	5760 1
+7377	5760 1
+7379	1026 1
+7379	4632 1
+7379	5289 1
+7379	7088 1
+7379	7237 1
+7379	7381 1
+7379	7529 1
+7378	155 1
+7378	1982 1
+7378	2565 1
+7378	3084 1
+7378	3334 1
+7378	3962 1
+7378	4037 1
+7378	5022 1
+7378	5079 1
+7378	5465 1
+7378	5605 1
+7378	5800 1
+7378	5806 1
+7378	5872 1
+7378	6044 1
+7378	6417 1
+7378	6422 1
+7378	6523 1
+7378	6918 1
+7378	6946 1
+7378	6980 1
+7378	7050 1
+7378	7225 1
+7378	7277 1
+7378	7381 1
+7378	7386 1
+7378	7553 1
+7378	7587 1
+7378	7620 1
+7378	7632 1
+7378	7757 1
+7378	7795 1
+7378	7803 1
+7378	7813 1
+7378	7908 1
+7378	8051 1
+7378	8124 1
+7378	8198 1
+7380	6123 1
+7380	7279 1
+7380	7381 1
+7357	1982 1
+7357	5233 1
+7357	7233 1
+7357	7391 1
+7357	7553 1
+7357	7924 1
+7357	8174 1
+7357	8204 1
+7357	8219 1
+7199	5233 1
+7199	7632 1
+7382	5233 1
+7383	2940 1
+7383	5233 1
+7387	3962 1
+7387	7553 1
+7387	7809 1
+7387	7921 1
+7386	4401 1
+7386	4940 1
+7386	5022 1
+7386	5378 1
+7386	5421 1
+7386	6422 1
+7386	6618 1
+7386	7021 1
+7386	7280 1
+7386	7387 1
+7386	7434 1
+7386	7553 1
+7386	7567 1
+7386	7620 1
+7386	7649 1
+7386	7791 1
+7386	7803 1
+7386	7809 1
+7386	7813 1
+7386	7833 1
+7386	7857 1
+7386	7882 1
+7386	8249 1
+7386	8275 1
+7386	8277 1
+7389	2940 1
+7389	7450 1
+7390	1865 1
+7390	2658 1
+7390	2940 1
+7390	3238 1
+7390	3962 1
+7390	5179 1
+7390	5671 1
+7390	5872 1
+7390	6424 1
+7390	6555 1
+7390	7047 1
+7390	7063 1
+7390	7225 1
+7390	7280 1
+7390	7423 1
+7390	7442 1
+7390	7443 1
+7390	7620 1
+7390	7632 1
+7390	7646 1
+7390	7647 1
+7390	7651 1
+7390	7809 1
+7390	7961 1
+7391	1982 1
+7391	2223 1
+7391	2658 1
+7391	2940 1
+7391	4401 1
+7391	4940 1
+7391	4983 1
+7391	5022 1
+7391	5179 1
+7391	5210 1
+7391	5246 1
+7391	5393 1
+7391	5466 1
+7391	6032 1
+7391	6422 1
+7391	6523 1
+7391	6634 1
+7391	6737 1
+7391	6993 1
+7391	7047 1
+7391	7050 1
+7391	7052 1
+7391	7120 1
+7391	7233 1
+7391	7237 1
+7391	7341 1
+7391	7443 1
+7391	7529 1
+7391	7544 1
+7391	7553 1
+7391	7604 1
+7391	7620 1
+7391	7649 1
+7391	7683 1
+7391	7726 1
+7391	7809 1
+7391	7835 1
+7391	7862 1
+7391	7921 1
+7391	7924 1
+7391	7965 1
+7391	7992 1
+7391	8019 1
+7391	8051 1
+7391	8122 1
+7391	8174 1
+7391	8192 1
+7391	8198 1
+7391	8209 1
+7391	8212 1
+7391	8224 1
+7391	8249 1
+7392	2940 1
+7321	2940 1
+7321	3293 1
+7321	7389 1
+7394	3293 1
+7394	5643 1
+7394	6424 1
+7394	7063 1
+7394	7620 1
+7400	3885 1
+7400	4940 1
+7400	5022 1
+7400	5079 1
+7400	5806 1
+7400	5839 1
+7400	6032 1
+7400	6123 1
+7400	6417 1
+7400	7225 1
+7400	7414 1
+7400	7450 1
+7400	7553 1
+7400	7632 1
+7400	7662 1
+7170	6123 1
+7401	5872 1
+7401	6123 1
+7401	7510 1
+7402	3334 1
+7402	6123 1
+7402	6241 1
+7402	6712 1
+7402	7632 1
+7403	6123 1
+7404	6123 1
+7405	3962 1
+7405	4037 1
+7405	5028 1
+7405	5096 1
+7405	5605 1
+7405	6123 1
+7405	6875 1
+7405	6946 1
+7405	6980 1
+7405	7050 1
+7405	7063 1
+7405	7443 1
+7405	7618 1
+7405	7624 1
+7405	7763 1
+7405	7835 1
+7405	7927 1
+7405	8163 1
+7407	6946 1
+7409	1982 1
+7409	3334 1
+7409	5002 1
+7409	5811 1
+7409	5839 1
+7409	7052 1
+7409	7553 1
+7409	7632 1
+7409	7646 1
+7409	7839 1
+7393	5002 1
+7393	5378 1
+7393	5839 1
+7393	7092 1
+7393	7225 1
+7393	7414 1
+7393	7553 1
+7393	7651 1
+7393	7662 1
+7393	7695 1
+7393	7840 1
+7393	8237 1
+7413	7279 1
+7413	7414 1
+7416	6417 1
+7417	5902 1
+7417	6442 1
+7418	4981 1
+7418	6442 1
+7419	6442 1
+7420	6442 1
+7421	1982 1
+7421	4037 1
+7421	4940 1
+7421	7238 1
+7421	7279 1
+7421	7422 1
+7421	7979 1
+7421	8163 1
+7421	8192 1
+7424	3334 1
+7424	4037 1
+7424	5605 1
+7424	7908 1
+7425	3334 1
+7425	4037 1
+7425	4940 1
+7425	6780 1
+7425	6946 1
+7425	7553 1
+7425	7649 1
+7426	3000 1
+7426	3334 1
+7427	3334 1
+7428	3334 1
+7428	3459 1
+7429	3334 1
+7430	3334 1
+7431	3334 1
+7441	4341 1
+7441	7442 1
+7441	8168 1
+7443	2658 1
+7443	3962 1
+7443	5800 1
+7443	6043 1
+7443	6414 1
+7443	7092 1
+7443	7280 1
+7443	7809 1
+7443	7882 1
+7443	8192 1
+7444	7450 1
+7444	7620 1
+7444	7632 1
+6139	7450 1
+7448	7450 1
+7445	7450 1
+7446	7450 1
+7447	7450 1
+7449	1982 1
+7449	3297 1
+7449	3752 1
+7449	3962 1
+7449	4507 1
+7449	4940 1
+7449	5079 1
+7449	5378 1
+7449	5614 1
+7449	5643 1
+7449	5812 1
+7449	5872 1
+7449	5887 1
+7449	5902 1
+7449	6422 1
+7449	6759 1
+7449	7021 1
+7449	7277 1
+7449	7279 1
+7449	7341 1
+7449	7393 1
+7449	7450 1
+7449	7508 1
+7449	7553 1
+7449	7574 1
+7449	7642 1
+7449	7649 1
+7449	7740 1
+7449	7839 1
+7449	7921 1
+7449	7979 1
+7449	8042 1
+7449	8073 1
+7449	8090 1
+7449	8134 1
+7449	8174 1
+7449	8186 1
+7449	8219 1
+7449	8224 1
+7451	7131 1
+7452	4037 1
+7452	6914 1
+7452	7131 1
+7453	7131 1
+7181	4037 1
+7181	7131 1
+7180	4037 1
+7180	6914 1
+7180	7131 1
+7180	7803 1
+7454	7131 1
+7455	7131 1
+7455	7237 1
+7455	7510 1
+7455	7529 1
+7456	7131 1
+7457	7131 1
+7458	7131 1
+7459	7131 1
+7461	7131 1
+7462	7131 1
+7465	7467 1
+7466	7467 1
+7473	7478 1
+7474	7478 1
+7468	7478 1
+7469	7478 1
+7476	7478 1
+7476	7512 1
+7477	7478 1
+7470	7478 1
+4532	5096 1
+4532	5179 1
+4532	6979 1
+4532	7478 1
+4532	7862 1
+4532	7921 1
+4532	7961 1
+4532	8174 1
+7480	7279 1
+7481	7279 1
+7482	6243 1
+7483	6243 1
+7484	5806 1
+7484	5872 1
+7484	5902 1
+7485	6000 1
+7486	6000 1
+7487	6000 1
+7490	2223 1
+7490	3238 1
+7490	3310 1
+7490	3381 1
+7490	4507 1
+7490	5002 1
+7490	5028 1
+7490	5421 1
+7490	5605 1
+7490	5969 1
+7490	6424 1
+7490	6560 1
+7490	6712 1
+7490	6780 1
+7490	6934 1
+7490	6993 1
+7490	7280 1
+7490	7618 1
+7490	7647 1
+7490	7662 1
+7490	7695 1
+7490	7699 1
+7490	7992 1
+7490	8007 1
+7490	8025 1
+7490	8083 1
+7490	8128 1
+7492	4875 1
+7492	7378 1
+7492	7624 1
+7493	4875 1
+7493	5421 1
+7493	7225 1
+7493	7646 1
+7494	7495 1
+7501	5289 1
+7502	5289 1
+7502	7544 1
+7502	7553 1
+7503	5289 1
+7505	5902 1
+7509	7510 1
+7471	2658 1
+7471	3084 1
+7471	6914 1
+7471	7237 1
+7471	7512 1
+7471	7632 1
+7471	7649 1
+7471	7946 1
+7471	7965 1
+7511	3752 1
+7511	4037 1
+7511	4981 1
+7511	4983 1
+7511	5614 1
+7511	6043 1
+7511	6780 1
+7511	6946 1
+7511	7021 1
+7511	7512 1
+7511	7620 1
+7511	7707 1
+7511	7810 1
+7511	7813 1
+7511	7890 1
+7511	8044 1
+7514	155 1
+7514	4879 1
+7514	7088 1
+7515	7088 1
+7513	7088 1
+7517	3293 1
+7517	7493 1
+7518	4037 1
+7518	4632 1
+7518	7620 1
+7520	6174 1
+7520	7624 1
+7520	7649 1
+7376	3459 1
+7376	4435 1
+7376	7063 1
+7376	7237 1
+7522	737 1
+7523	737 1
+7524	737 1
+7525	737 1
+7527	7529 1
+7528	7529 1
+7531	7054 1
+7538	7378 1
+7540	7378 1
+7535	7378 1
+7536	7378 1
+7537	7378 1
+7544	1982 1
+7544	5671 1
+7544	6032 1
+7544	6555 1
+7544	7005 1
+7544	7092 1
+7544	7553 1
+7544	7788 1
+7544	7813 1
+7544	7924 1
+7544	8226 1
+7549	3459 1
+7549	7553 1
+7545	7553 1
+7546	5028 1
+7546	5421 1
+7546	7553 1
+7550	7553 1
+7554	3459 1
+7554	5835 1
+7554	7624 1
+7563	4341 1
+7564	2565 1
+7564	2658 1
+7564	3238 1
+7564	3293 1
+7564	4037 1
+7564	4341 1
+7564	5002 1
+7564	5028 1
+7564	5465 1
+7564	5605 1
+7564	5614 1
+7564	6044 1
+7564	6712 1
+7564	6934 1
+7564	6946 1
+7564	7587 1
+7564	7618 1
+7564	7624 1
+7564	7646 1
+7564	7662 1
+7564	7860 1
+7564	7908 1
+7564	8042 1
+7564	8044 1
+7564	8051 1
+7564	8073 1
+7564	8121 1
+7564	8124 1
+7564	8128 1
+7564	8168 1
+7564	8219 1
+7415	1026 1
+7415	5079 1
+7415	6914 1
+7415	7225 1
+7415	7400 1
+7415	7632 1
+7150	5839 1
+7150	6555 1
+7150	6914 1
+7150	7005 1
+7150	7021 1
+7150	7052 1
+7150	7280 1
+7150	7400 1
+7150	7649 1
+7150	7683 1
+7565	1026 1
+7565	7400 1
+7565	7587 1
+7569	155 1
+7569	2565 1
+7569	7618 1
+7569	7624 1
+7570	155 1
+7570	5096 1
+7570	7778 1
+7571	155 1
+7572	155 1
+7576	1026 1
+7577	1026 1
+7578	967 1
+7578	1026 1
+7578	1498 1
+7578	3962 1
+7578	4037 1
+7578	4071 1
+7578	4435 1
+7578	4981 1
+7578	5020 1
+7578	5022 1
+7578	5079 1
+7578	5096 1
+7578	5378 1
+7578	5605 1
+7578	5812 1
+7578	6618 1
+7578	6918 1
+7578	6946 1
+7578	6979 1
+7578	7005 1
+7578	7092 1
+7578	7833 1
+7578	7855 1
+7578	7908 1
+7578	8122 1
+7578	8163 1
+7578	8165 1
+7578	8174 1
+7579	1026 1
+7579	3310 1
+7579	5210 1
+7579	5529 1
+7579	6914 1
+7579	7050 1
+7579	7620 1
+7579	7788 1
+7579	7795 1
+7580	1026 1
+7580	2565 1
+7580	4884 1
+7580	5002 1
+7580	5421 1
+7580	5500 1
+7580	6424 1
+7580	6712 1
+7580	6934 1
+7580	7116 1
+7580	7225 1
+7580	7587 1
+7580	7620 1
+7580	7647 1
+7580	7651 1
+7580	7658 1
+7580	7662 1
+7580	7666 1
+7580	7673 1
+7581	1026 1
+7585	7587 1
+7586	3084 1
+7586	3238 1
+7586	7587 1
+7586	7683 1
+7586	7757 1
+7586	7763 1
+7586	7809 1
+7588	5079 1
+7588	6174 1
+7588	7116 1
+7588	7391 1
+7588	7604 1
+7588	7618 1
+7588	7624 1
+7588	8141 1
+7593	7225 1
+7593	7618 1
+7593	7624 1
+7594	3293 1
+7594	5819 1
+7594	7225 1
+7594	8083 1
+7595	7225 1
+7597	4037 1
+7597	4884 1
+7597	7225 1
+7597	7620 1
+7598	3238 1
+7598	3752 1
+7598	3962 1
+7598	4884 1
+7598	4981 1
+7598	5028 1
+7598	5421 1
+7598	5466 1
+7598	5529 1
+7598	5839 1
+7598	6043 1
+7598	6151 1
+7598	6241 1
+7598	6555 1
+7598	6712 1
+7598	6914 1
+7598	6934 1
+7598	7047 1
+7598	7116 1
+7598	7225 1
+7598	7386 1
+7598	7588 1
+7598	7632 1
+7598	7649 1
+7598	7683 1
+7598	7694 1
+7598	7695 1
+7598	7699 1
+7598	7809 1
+7598	7862 1
+7598	7890 1
+7598	7913 1
+7598	7924 1
+7599	7225 1
+7600	7225 1
+7602	5500 1
+7605	2565 1
+7605	3752 1
+7605	7924 1
+5910	2565 1
+7608	4884 1
+7608	5210 1
+7610	4884 1
+7611	4884 1
+7613	4884 1
+7609	7620 1
+7609	7839 1
+7614	1191 1
+7614	3084 1
+7614	3238 1
+7614	3310 1
+7614	3752 1
+7614	3962 1
+7614	5002 1
+7614	5028 1
+7614	5079 1
+7614	5179 1
+7614	5466 1
+7614	5529 1
+7614	5839 1
+7614	6032 1
+7614	6151 1
+7614	6174 1
+7614	6241 1
+7614	6320 1
+7614	6422 1
+7614	6523 1
+7614	6555 1
+7614	6560 1
+7614	6914 1
+7614	7047 1
+7614	7092 1
+7614	7386 1
+7614	7544 1
+7614	7620 1
+7614	7624 1
+7614	7632 1
+7614	7658 1
+7614	7707 1
+7614	7726 1
+7614	7795 1
+7614	7809 1
+7614	7819 1
+7614	7874 1
+7614	7879 1
+7614	7952 1
+7615	7620 1
+7616	7620 1
+7617	7620 1
+7618	6523 1
+7618	7092 1
+7618	7620 1
+7619	7620 1
+7623	5028 1
+7623	5465 1
+7623	7647 1
+7625	5028 1
+7625	6634 1
+7625	7050 1
+7625	7632 1
+7625	7803 1
+7625	7924 1
+7626	5028 1
+7050	5839 1
+7050	6634 1
+7050	7120 1
+7050	7632 1
+7050	7839 1
+7630	7632 1
+7629	7632 1
+7634	7021 1
+7639	6280 1
+7638	6280 1
+7601	5002 1
+7601	7646 1
+7601	7653 1
+7642	5179 1
+7644	7646 1
+7645	7646 1
+7648	7391 1
+7647	6934 1
+7647	7662 1
+7647	7666 1
+7647	7668 1
+7649	3238 1
+7649	5210 1
+7649	5529 1
+7649	5839 1
+7649	6044 1
+7649	6979 1
+7649	7052 1
+7649	7443 1
+7649	7651 1
+7649	7965 1
+7653	7986 1
+7659	967 1
+7659	3962 1
+7659	6712 1
+7659	6934 1
+7659	7662 1
+7659	7855 1
+7660	7662 1
+7650	1498 1
+7650	7662 1
+7661	3381 1
+7661	7280 1
+7661	7662 1
+7661	7757 1
+7663	3238 1
+7664	3238 1
+7665	3238 1
+7665	4432 1
+7665	7047 1
+7665	7683 1
+7665	7695 1
+7665	7810 1
+7666	6320 1
+7666	6555 1
+7666	6759 1
+7666	6924 1
+7666	6946 1
+7666	6980 1
+7666	7012 1
+7666	7277 1
+7666	7397 1
+7666	7669 1
+7666	7691 1
+7666	7699 1
+7666	7701 1
+7666	8121 1
+7670	6712 1
+7675	1498 1
+7675	1982 1
+7675	2223 1
+7675	2658 1
+7675	3770 1
+7675	4983 1
+7675	5020 1
+7675	5096 1
+7675	5179 1
+7675	5378 1
+7675	6422 1
+7675	6618 1
+7675	6759 1
+7675	6946 1
+7675	7021 1
+7675	7386 1
+7675	7397 1
+7675	7666 1
+7675	7778 1
+7675	7979 1
+7675	7994 1
+7675	7996 1
+7675	8002 1
+7675	8192 1
+7675	8212 1
+7676	4940 1
+7676	6737 1
+7676	7047 1
+7676	7238 1
+7676	8178 1
+7677	4037 1
+7677	4940 1
+7677	5022 1
+7677	6875 1
+7677	7047 1
+7677	7238 1
+7677	7517 1
+7677	7924 1
+7677	7928 1
+7677	7992 1
+7677	8038 1
+7677	8224 1
+7678	4940 1
+7678	7047 1
+7679	3084 1
+7679	5022 1
+7679	5079 1
+7679	5148 1
+7679	5529 1
+7679	5605 1
+7679	5643 1
+7679	6151 1
+7679	6241 1
+7679	6555 1
+7679	6634 1
+7679	6875 1
+7679	7021 1
+7679	7238 1
+7679	7277 1
+7679	7280 1
+7679	7391 1
+7679	7443 1
+7679	7694 1
+7679	7695 1
+7679	7699 1
+7679	7809 1
+7679	7813 1
+7679	7855 1
+7679	8219 1
+7679	8235 1
+7682	1191 1
+7682	3297 1
+7682	4037 1
+7682	4507 1
+7682	5020 1
+7682	5148 1
+7682	5210 1
+7682	5529 1
+7682	5643 1
+7682	6422 1
+7682	6560 1
+7682	6759 1
+7682	6875 1
+7682	6914 1
+7682	6946 1
+7682	6979 1
+7682	7092 1
+7682	7386 1
+7682	7574 1
+7682	7620 1
+7682	7683 1
+7682	7839 1
+7682	7862 1
+7682	7874 1
+7682	7881 1
+7682	7910 1
+7682	7927 1
+7682	7928 1
+7682	7952 1
+7682	7961 1
+7682	8038 1
+7682	8128 1
+7682	8132 1
+7682	8148 1
+7682	8169 1
+7682	8209 1
+7684	7120 1
+7684	7683 1
+7685	4401 1
+7685	5179 1
+7685	6618 1
+7685	6634 1
+7685	7391 1
+7685	7683 1
+7685	7757 1
+7685	7908 1
+7685	8037 1
+7685	8124 1
+7685	8174 1
+7685	8198 1
+7685	8219 1
+7687	6560 1
+7687	7120 1
+7687	7683 1
+7686	7120 1
+7686	7683 1
+7691	3752 1
+7691	3962 1
+7691	4071 1
+7691	4983 1
+7691	5179 1
+7691	5933 1
+7691	6032 1
+7691	6946 1
+7691	7063 1
+7691	7092 1
+7691	7694 1
+7691	7778 1
+7691	7835 1
+7691	7855 1
+7691	7862 1
+7691	7871 1
+7691	7946 1
+7691	7961 1
+7691	7979 1
+7695	3381 1
+7695	6151 1
+7695	8224 1
+7696	7695 1
+7696	7707 1
+7696	7810 1
+7696	8019 1
+7697	3962 1
+7697	5179 1
+7697	6634 1
+7697	6980 1
+7697	7120 1
+7697	7277 1
+7697	7443 1
+7697	7588 1
+7697	7649 1
+7697	7695 1
+7697	7734 1
+7697	7740 1
+7697	7763 1
+7697	7803 1
+7697	7809 1
+7697	7908 1
+7697	8079 1
+7697	8132 1
+7697	8168 1
+7698	7699 1
+7701	6320 1
+7701	6980 1
+7701	7588 1
+7703	5179 1
+7703	7707 1
+7704	7707 1
+7705	7707 1
+7706	5671 1
+7706	7707 1
+7715	6523 1
+7716	5839 1
+7716	6523 1
+7719	4071 1
+7719	6523 1
+7719	6914 1
+7719	7763 1
+6367	6523 1
+6367	8141 1
+7717	5839 1
+7717	6523 1
+7720	6924 1
+7721	1865 1
+7724	1865 1
+7724	7544 1
+7726	3310 1
+7726	7809 1
+7726	7961 1
+7728	7726 1
+7728	7763 1
+7727	1982 1
+7727	3962 1
+7727	4037 1
+7727	4071 1
+7727	4981 1
+7727	4983 1
+7727	5022 1
+7727	5246 1
+7727	5839 1
+7727	6032 1
+7727	6634 1
+7727	6946 1
+7727	6979 1
+7727	7233 1
+7727	7238 1
+7727	7341 1
+7727	7391 1
+7727	7553 1
+7727	7620 1
+7727	7726 1
+7727	7835 1
+7727	7871 1
+7727	7910 1
+7727	7921 1
+7727	7965 1
+7727	7992 1
+7727	8002 1
+7727	8024 1
+7727	8122 1
+7727	8174 1
+7729	7730 1
+7732	7734 1
+7733	1982 1
+7733	2658 1
+7733	3962 1
+7733	4037 1
+7733	4401 1
+7733	4432 1
+7733	4940 1
+7733	4981 1
+7733	5022 1
+7733	5064 1
+7733	5079 1
+7733	5246 1
+7733	5605 1
+7733	5812 1
+7733	6032 1
+7733	6414 1
+7733	6422 1
+7733	6555 1
+7733	6618 1
+7733	6634 1
+7733	6914 1
+7733	6946 1
+7733	6979 1
+7733	7005 1
+7733	7021 1
+7733	7050 1
+7733	7063 1
+7733	7092 1
+7733	7120 1
+7733	7389 1
+7733	7553 1
+7733	7620 1
+7733	7666 1
+7733	7734 1
+7733	7791 1
+7733	7809 1
+7733	7810 1
+7733	7833 1
+7733	7839 1
+7733	7862 1
+7733	7910 1
+7733	8051 1
+7733	8121 1
+7733	8174 1
+7733	8198 1
+7736	7120 1
+7736	7757 1
+7737	5671 1
+7738	3084 1
+7738	5148 1
+7738	5671 1
+7738	7277 1
+7738	7795 1
+7738	7839 1
+7740	6980 1
+7741	5148 1
+7741	6980 1
+7741	7757 1
+7741	7763 1
+7742	6980 1
+7743	2223 1
+7743	4037 1
+7743	4507 1
+7743	4940 1
+7743	5179 1
+7743	6422 1
+7743	6914 1
+7743	6980 1
+7743	7005 1
+7743	7757 1
+7743	7992 1
+7743	8168 1
+7743	8169 1
+7744	967 1
+7744	1982 1
+7744	3310 1
+7744	3381 1
+7744	3770 1
+7744	3962 1
+7744	4037 1
+7744	4401 1
+7744	4432 1
+7744	4940 1
+7744	4983 1
+7744	5022 1
+7744	5079 1
+7744	5179 1
+7744	5738 1
+7744	5812 1
+7744	5819 1
+7744	5839 1
+7744	5933 1
+7744	6555 1
+7744	6618 1
+7744	6634 1
+7744	6914 1
+7744	6918 1
+7744	6979 1
+7744	7021 1
+7744	7092 1
+7744	7238 1
+7744	7449 1
+7744	7544 1
+7744	7553 1
+7744	7620 1
+7744	7740 1
+7744	7803 1
+7744	7809 1
+7744	7810 1
+7744	7890 1
+7744	7910 1
+7744	7924 1
+7744	7961 1
+7744	7979 1
+7744	8051 1
+7744	8121 1
+7744	8174 1
+7744	8178 1
+7744	8209 1
+7744	8219 1
+7744	8225 1
+7744	8249 1
+7744	8263 1
+7745	5148 1
+7747	4981 1
+7747	5148 1
+7747	5179 1
+7747	5839 1
+7747	6993 1
+7747	7277 1
+7747	7795 1
+7747	7809 1
+7750	4940 1
+7750	7757 1
+7751	7757 1
+7752	7005 1
+7752	7757 1
+7753	7005 1
+7753	7757 1
+7755	1982 1
+7755	5064 1
+7755	5079 1
+7755	5529 1
+7755	6043 1
+7755	6044 1
+7755	6560 1
+7755	6634 1
+7755	7277 1
+7755	7386 1
+7755	7620 1
+7755	7757 1
+7755	7803 1
+7756	7005 1
+7756	7757 1
+7758	7763 1
+7759	4981 1
+7759	4983 1
+7759	7763 1
+7759	7961 1
+7760	7763 1
+7761	7763 1
+7762	7763 1
+7766	1191 1
+7766	3310 1
+7766	4435 1
+7766	5529 1
+7766	6151 1
+7766	6555 1
+7766	7005 1
+7766	7788 1
+7766	7803 1
+7766	7809 1
+7766	7855 1
+7766	7862 1
+7766	7871 1
+7767	7277 1
+7767	7280 1
+7768	1498 1
+7768	3752 1
+7768	3962 1
+7768	6174 1
+7768	6414 1
+7768	7021 1
+7768	7393 1
+7768	7879 1
+7768	7882 1
+7768	7890 1
+7768	7927 1
+7769	967 1
+7769	3752 1
+7769	3962 1
+7769	4071 1
+7769	5933 1
+7769	6032 1
+7769	6174 1
+7769	6414 1
+7769	7012 1
+7769	7021 1
+7769	7871 1
+7769	7879 1
+7769	7882 1
+7769	7890 1
+7769	7908 1
+7769	7910 1
+7769	7912 1
+7769	7927 1
+7769	7946 1
+7770	5933 1
+7770	6174 1
+7771	5079 1
+7771	7778 1
+7771	7928 1
+7772	1982 1
+7772	4432 1
+7772	5064 1
+7772	5179 1
+7772	5378 1
+7772	7233 1
+7772	7389 1
+7772	7778 1
+7772	7791 1
+7772	7833 1
+7772	8073 1
+7772	8134 1
+7772	8174 1
+7772	8178 1
+7772	8192 1
+7772	8204 1
+7772	8212 1
+7772	8237 1
+7772	8249 1
+7772	8276 1
+7773	7778 1
+7774	1498 1
+7774	1982 1
+7774	3293 1
+7774	4037 1
+7774	5022 1
+7774	5210 1
+7774	5605 1
+7774	5738 1
+7774	5819 1
+7774	6044 1
+7774	6780 1
+7774	6875 1
+7774	6918 1
+7774	7233 1
+7774	7391 1
+7774	7574 1
+7774	7778 1
+7774	7860 1
+7774	7908 1
+7774	7965 1
+7774	7992 1
+7774	8037 1
+7774	8042 1
+7774	8051 1
+7774	8073 1
+7774	8121 1
+7774	8122 1
+7774	8128 1
+7774	8134 1
+7774	8168 1
+7774	8174 1
+7774	8178 1
+7774	8192 1
+7774	8209 1
+7774	8212 1
+7775	2658 1
+7775	5096 1
+7775	5179 1
+7775	5210 1
+7775	5819 1
+7775	5839 1
+7775	6422 1
+7775	7341 1
+7775	7553 1
+7775	7778 1
+7775	7965 1
+7777	7778 1
+7779	6560 1
+7779	7835 1
+7780	6560 1
+7780	7788 1
+7780	7803 1
+7781	6560 1
+7782	6560 1
+7783	6560 1
+7789	7277 1
+7790	5022 1
+7790	6634 1
+7790	7277 1
+7790	7803 1
+7791	5079 1
+7791	6414 1
+7791	7005 1
+7791	7277 1
+7792	6032 1
+7792	6555 1
+7792	7012 1
+7792	7021 1
+7792	7277 1
+7792	7835 1
+7792	7927 1
+7796	7795 1
+7800	7803 1
+7804	7803 1
+7801	7803 1
+7805	7803 1
+7802	7803 1
+7806	5529 1
+7806	5839 1
+7808	3084 1
+7808	3752 1
+7808	3770 1
+7808	3962 1
+7808	4037 1
+7808	5079 1
+7808	5096 1
+7808	6634 1
+7808	6914 1
+7808	7809 1
+7808	8124 1
+7808	8174 1
+7810	1982 1
+7810	2223 1
+7810	6737 1
+7810	6875 1
+7810	6993 1
+7810	7620 1
+7810	7979 1
+7810	8174 1
+7810	8224 1
+7812	6043 1
+7812	7092 1
+7812	7649 1
+7812	7839 1
+7812	7890 1
+7812	7899 1
+7814	7386 1
+7815	7386 1
+7815	7620 1
+7818	2223 1
+7818	3752 1
+7818	4071 1
+7818	5022 1
+7818	5079 1
+7818	5096 1
+7818	5210 1
+7818	5643 1
+7818	6946 1
+7818	6979 1
+7818	7819 1
+7818	7871 1
+7818	7874 1
+7818	7912 1
+7818	7946 1
+7818	7952 1
+7818	7961 1
+7818	8007 1
+7818	8024 1
+7818	8025 1
+7818	8042 1
+7818	8083 1
+7818	8134 1
+7821	7649 1
+7822	7649 1
+6709	5064 1
+6709	5210 1
+7826	6709 1
+7827	6709 1
+7828	6709 1
+7829	6044 1
+7829	6555 1
+7829	7092 1
+7829	7879 1
+7830	7092 1
+7831	7092 1
+7831	7393 1
+7832	7092 1
+7833	6914 1
+7833	7092 1
+7833	7238 1
+7833	7890 1
+7834	7092 1
+7836	7092 1
+7835	4435 1
+7835	5179 1
+7835	7092 1
+7837	5079 1
+7837	7839 1
+7841	5839 1
+7842	4981 1
+7842	5079 1
+7843	4983 1
+7843	5079 1
+7844	5079 1
+7845	5079 1
+7845	8121 1
+7848	5079 1
+7849	6555 1
+7852	6555 1
+7850	6555 1
+7851	6555 1
+6638	6555 1
+7853	7855 1
+7853	8178 1
+7854	7855 1
+7856	4432 1
+7856	4435 1
+7856	5605 1
+7856	7835 1
+7856	8121 1
+7856	8168 1
+7856	8192 1
+7754	7005 1
+7862	1982 1
+7862	3293 1
+7862	4037 1
+7862	5210 1
+7862	5605 1
+7862	7860 1
+7862	8024 1
+7862	8042 1
+7862	8043 1
+7862	8174 1
+7862	8192 1
+7860	4983 1
+7860	7862 1
+7863	4981 1
+7864	4981 1
+7864	4983 1
+7865	2658 1
+7865	3293 1
+7865	4981 1
+7865	5022 1
+7865	5096 1
+7865	5179 1
+7865	5378 1
+7865	6044 1
+7865	6618 1
+7865	7021 1
+7865	7063 1
+7865	7233 1
+7865	7238 1
+7865	7517 1
+7865	7620 1
+7865	7835 1
+7865	7882 1
+7865	7908 1
+7865	7961 1
+7865	8042 1
+7865	8051 1
+7865	8163 1
+7865	8212 1
+7865	8275 1
+7866	967 1
+7867	7871 1
+7868	7871 1
+7870	7871 1
+7873	4071 1
+7873	5179 1
+7873	6914 1
+7873	7910 1
+7873	7927 1
+7873	7979 1
+7874	4071 1
+7874	6914 1
+7874	7890 1
+7874	7927 1
+7875	6447 1
+7875	7012 1
+7877	4037 1
+7877	4507 1
+7877	4940 1
+7877	7233 1
+7877	7879 1
+7877	7927 1
+7878	7879 1
+7882	1498 1
+7882	2658 1
+7882	3752 1
+7882	3962 1
+7882	4940 1
+7882	5096 1
+7882	6414 1
+7882	6618 1
+7882	7021 1
+7882	7910 1
+7882	8033 1
+7885	4037 1
+7885	5605 1
+7885	6875 1
+7885	7691 1
+7885	7882 1
+7885	7928 1
+7883	7882 1
+7884	1982 1
+7884	4401 1
+7884	7553 1
+7884	7620 1
+7884	7882 1
+7886	7890 1
+7887	7890 1
+7888	7890 1
+7889	7890 1
+7891	6914 1
+7892	6914 1
+7893	6914 1
+7893	8174 1
+7372	6914 1
+7894	6914 1
+7900	4037 1
+7900	4507 1
+7900	5064 1
+7900	5210 1
+7900	5246 1
+7900	5605 1
+7900	5819 1
+7900	6918 1
+7900	6946 1
+7900	7391 1
+7900	7517 1
+7900	7574 1
+7900	7620 1
+7900	7860 1
+7900	7908 1
+7900	8037 1
+7900	8042 1
+7900	8044 1
+7900	8083 1
+7900	8121 1
+7900	8122 1
+7900	8128 1
+7900	8134 1
+7900	8163 1
+7900	8168 1
+7900	8169 1
+7900	8192 1
+7901	1982 1
+7901	4037 1
+7901	4401 1
+7901	4432 1
+7901	5210 1
+7901	5378 1
+7901	5605 1
+7901	5812 1
+7901	6044 1
+7901	6618 1
+7901	6634 1
+7901	6737 1
+7901	6875 1
+7901	6918 1
+7901	6946 1
+7901	7233 1
+7901	7391 1
+7901	7553 1
+7901	7860 1
+7901	7908 1
+7901	7979 1
+7901	8037 1
+7901	8042 1
+7901	8051 1
+7901	8174 1
+7901	8192 1
+7901	8209 1
+7901	8212 1
+7901	8219 1
+7901	8224 1
+7902	1498 1
+7902	1982 1
+7902	2658 1
+7902	3293 1
+7902	4432 1
+7902	5605 1
+7902	6737 1
+7902	6875 1
+7902	6946 1
+7902	7233 1
+7902	7391 1
+7902	7908 1
+7902	8042 1
+7902	8051 1
+7902	8128 1
+7902	8132 1
+7902	8148 1
+7902	8163 1
+7902	8192 1
+7902	8209 1
+7902	8224 1
+7903	4037 1
+7903	5022 1
+7903	7908 1
+7903	8174 1
+7904	2658 1
+7904	6634 1
+7904	7391 1
+7904	7908 1
+7904	7912 1
+7904	7927 1
+7905	7908 1
+7906	1982 1
+7906	4037 1
+7906	4401 1
+7906	5887 1
+7906	7050 1
+7906	7553 1
+7906	7908 1
+7906	8212 1
+7906	8219 1
+7906	8224 1
+7907	4983 1
+7907	5022 1
+7907	5179 1
+7907	7620 1
+7907	7908 1
+7907	7979 1
+7907	7992 1
+7907	8002 1
+7907	8083 1
+7907	8163 1
+7907	8168 1
+7907	8178 1
+7910	3962 1
+7910	6044 1
+7910	7012 1
+7910	7912 1
+7911	7912 1
+7869	7912 1
+7914	5933 1
+7915	3962 1
+7916	3962 1
+7916	7012 1
+7919	4940 1
+7919	7012 1
+7919	7921 1
+7920	7921 1
+7922	7927 1
+7923	7927 1
+7924	6634 1
+7924	7927 1
+7925	7927 1
+7928	6634 1
+7928	7233 1
+7928	8178 1
+7930	5179 1
+7929	4037 1
+7929	5179 1
+7929	6044 1
+7929	6634 1
+7932	5179 1
+7932	8168 1
+7933	4037 1
+7933	5179 1
+7933	5210 1
+7933	6875 1
+7931	5179 1
+7931	6979 1
+7934	5179 1
+7935	5179 1
+7937	7021 1
+7938	6634 1
+7938	7021 1
+7939	7021 1
+7940	7021 1
+7941	7021 1
+7942	7021 1
+7944	7012 1
+7945	5022 1
+7945	5605 1
+7945	7620 1
+7945	7946 1
+7945	8192 1
+7948	5096 1
+7948	7910 1
+7949	7910 1
+7950	7910 1
+7953	5466 1
+7954	7835 1
+7955	7835 1
+7956	7835 1
+7959	7961 1
+7960	7961 1
+7964	2223 1
+7964	5020 1
+7964	5022 1
+7964	5096 1
+7964	5210 1
+7964	5819 1
+7964	6618 1
+7964	7620 1
+7964	7965 1
+7964	8024 1
+7964	8122 1
+7966	6422 1
+7968	6422 1
+7968	6634 1
+7968	7553 1
+7969	6422 1
+7969	7928 1
+7967	6422 1
+7967	7553 1
+7967	7810 1
+7967	8249 1
+7970	6422 1
+7972	7973 1
+7974	5096 1
+7975	5096 1
+7976	5096 1
+7978	7979 1
+7980	1498 1
+7980	2223 1
+7980	2658 1
+7980	3297 1
+7980	5022 1
+7980	5246 1
+7980	5887 1
+7980	6759 1
+7980	7860 1
+7980	7979 1
+7980	7992 1
+7980	8044 1
+7980	8068 1
+7980	8132 1
+7980	8134 1
+7981	7982 1
+7985	2658 1
+7993	4037 1
+7993	7992 1
+7995	7996 1
+7998	8002 1
+7999	8002 1
+8000	8002 1
+8001	8002 1
+8005	2223 1
+8005	4401 1
+8006	8007 1
+8009	6044 1
+8010	6044 1
+8010	8042 1
+8011	6044 1
+8012	4037 1
+8012	5210 1
+8012	6044 1
+8012	6946 1
+8012	7860 1
+8012	8042 1
+8012	8044 1
+8013	6044 1
+8014	8015 1
+8021	8051 1
+8020	8021 1
+8027	8028 1
+8035	6946 1
+8037	8246 1
+8036	4940 1
+8036	5605 1
+8036	5614 1
+8036	6780 1
+8036	6875 1
+8036	7233 1
+8036	7238 1
+8036	7391 1
+8036	7553 1
+8036	7810 1
+8036	7860 1
+8036	8037 1
+8036	8121 1
+8036	8124 1
+8036	8128 1
+8036	8163 1
+8036	8168 1
+8036	8174 1
+8036	8192 1
+8042	6634 1
+8040	8042 1
+8041	5605 1
+8041	7620 1
+8041	8042 1
+8045	5812 1
+8045	6307 1
+8045	6634 1
+8045	7389 1
+8045	8235 1
+8045	8246 1
+8045	8271 1
+8046	4401 1
+8046	4432 1
+8046	4940 1
+8046	5378 1
+8046	5812 1
+8046	6618 1
+8046	7389 1
+8046	7553 1
+8046	7791 1
+8046	7810 1
+8046	7924 1
+8046	8051 1
+8046	8212 1
+8046	8246 1
+8046	8249 1
+8046	8263 1
+8047	1982 1
+8047	4401 1
+8047	4432 1
+8047	4940 1
+8047	5378 1
+8047	5812 1
+8047	6618 1
+8047	6634 1
+8047	6737 1
+8047	7233 1
+8047	7238 1
+8047	7389 1
+8047	7810 1
+8047	7833 1
+8047	8051 1
+8047	8219 1
+8047	8224 1
+8047	8237 1
+8047	8249 1
+8047	8276 1
+8048	5378 1
+8048	5812 1
+8048	8235 1
+8049	5812 1
+8051	5378 1
+8051	5812 1
+8051	7553 1
+8051	7791 1
+8051	8219 1
+8051	8237 1
+8051	8246 1
+8051	8249 1
+8052	5812 1
+8053	4940 1
+8053	5022 1
+8053	5378 1
+8053	5614 1
+8053	5812 1
+8053	6780 1
+8053	7050 1
+8053	7391 1
+8053	7553 1
+8053	7791 1
+8053	7810 1
+8053	7924 1
+8053	8178 1
+8053	8209 1
+8053	8219 1
+8053	8224 1
+8053	8235 1
+8053	8237 1
+8053	8249 1
+8053	8263 1
+8054	5812 1
+8054	6634 1
+8055	7860 1
+8056	7860 1
+8057	7860 1
+8060	3293 1
+8060	6875 1
+8060	8121 1
+8060	8168 1
+8060	8192 1
+8061	3293 1
+8061	4037 1
+8061	4940 1
+8061	5022 1
+8061	7553 1
+8062	5210 1
+8063	5210 1
+8063	8121 1
+8063	8192 1
+8064	5210 1
+8065	5210 1
+8066	4037 1
+8066	5022 1
+8066	5210 1
+8069	5819 1
+8069	6780 1
+8069	7620 1
+8069	7924 1
+8070	5819 1
+8071	5819 1
+8072	5819 1
+8074	8076 1
+8075	8076 1
+8077	6918 1
+8077	8079 1
+8080	8083 1
+8081	8083 1
+8023	6780 1
+8084	6780 1
+8085	4401 1
+8085	4432 1
+8085	4940 1
+8085	5022 1
+8085	5614 1
+8085	6618 1
+8085	6634 1
+8085	6780 1
+8085	7050 1
+8085	7391 1
+8085	7553 1
+8085	7924 1
+8085	8163 1
+8085	8174 1
+8085	8192 1
+8085	8198 1
+8086	6780 1
+8087	6780 1
+8088	1982 1
+8088	8089 1
+8091	5022 1
+8092	4037 1
+8092	5022 1
+8092	8192 1
+8092	8198 1
+8092	8219 1
+8093	5022 1
+8094	5022 1
+8094	7928 1
+8094	8275 1
+8094	8276 1
+8095	5022 1
+8096	5022 1
+8098	4037 1
+8099	4037 1
+8100	4037 1
+8101	4037 1
+8102	4037 1
+8108	4037 1
+8103	4037 1
+8104	4037 1
+8105	4037 1
+8111	4037 1
+8111	7620 1
+8112	4037 1
+8112	8141 1
+8106	4037 1
+8107	4037 1
+8107	4432 1
+8107	4940 1
+8107	5378 1
+8107	6618 1
+8107	6634 1
+8107	7553 1
+8107	7791 1
+8107	7833 1
+8107	7924 1
+8107	8141 1
+8107	8192 1
+8107	8249 1
+8114	4037 1
+8115	4037 1
+8109	4037 1
+8110	4037 1
+8118	8121 1
+8119	8121 1
+8120	8121 1
+8126	4507 1
+8131	8132 1
+8131	8148 1
+8133	7517 1
+8134	7553 1
+8135	8134 1
+8138	8134 1
+8136	8134 1
+8097	7620 1
+8097	8134 1
+8137	8134 1
+8140	8141 1
+8142	8141 1
+8144	8141 1
+8145	7928 1
+8145	8141 1
+8146	5246 1
+8146	8148 1
+8147	8148 1
+8152	1982 1
+8152	4940 1
+8152	5605 1
+8152	6618 1
+8152	7233 1
+8152	7553 1
+8152	7620 1
+8152	7924 1
+8152	8209 1
+8152	8212 1
+8153	5605 1
+8155	7620 1
+8156	4940 1
+8156	6618 1
+8156	7620 1
+8156	7810 1
+8156	8192 1
+8158	7620 1
+8159	7620 1
+8157	6634 1
+8157	7620 1
+8161	8163 1
+8162	5064 1
+8162	5738 1
+8162	7391 1
+8162	8163 1
+8162	8168 1
+8162	8174 1
+8162	8178 1
+8162	8192 1
+8162	8198 1
+8166	6875 1
+8167	6875 1
+8170	8174 1
+8171	7233 1
+8171	8174 1
+8171	8192 1
+8172	8174 1
+8173	1982 1
+8173	5738 1
+8173	7233 1
+8173	7391 1
+8173	8174 1
+8173	8192 1
+8173	8198 1
+8177	8178 1
+7472	8178 1
+8179	8178 1
+8184	8178 1
+8180	8178 1
+8181	8178 1
+8182	8178 1
+8183	8178 1
+8187	7391 1
+8189	5064 1
+8189	5738 1
+8189	7553 1
+8189	8276 1
+7861	5738 1
+7861	7233 1
+8190	4940 1
+8190	7238 1
+8190	7924 1
+8190	8192 1
+8193	7553 1
+8193	8192 1
+8194	8192 1
+8195	8192 1
+8196	8198 1
+8197	8198 1
+8199	5064 1
+8202	7233 1
+8203	7233 1
+8206	7233 1
+8204	7233 1
+8204	8212 1
+8205	7233 1
+8211	4401 1
+8211	4432 1
+8211	6618 1
+8211	6737 1
+8211	7238 1
+8211	7389 1
+8211	7810 1
+8211	8051 1
+8211	8212 1
+8211	8237 1
+8211	8249 1
+8213	1982 1
+8215	8051 1
+8216	8051 1
+8221	8219 1
+8222	4401 1
+8222	6634 1
+8222	7553 1
+8222	7924 1
+8222	8224 1
+8222	8249 1
+8050	4432 1
+8050	4940 1
+8050	6618 1
+8050	6737 1
+8050	7238 1
+8050	7833 1
+8050	8246 1
+8050	8249 1
+8050	8263 1
+8227	4401 1
+8231	5378 1
+8232	5378 1
+8233	5378 1
+8236	8237 1
+8214	7553 1
+8238	7553 1
+8241	4432 1
+8241	4940 1
+8242	4432 1
+8243	4432 1
+8243	6307 1
+8243	6618 1
+8243	6634 1
+8243	6924 1
+8243	8263 1
+8244	7050 1
+8245	7050 1
+8248	8249 1
+8229	8249 1
+8251	6618 1
+8252	6634 1
+8253	6634 1
+8254	6634 1
+8255	6634 1
+8256	6634 1
+8260	6737 1
+8261	6737 1
+8262	7389 1
+8263	4940 1
+8263	7389 1
+8264	7238 1
+8265	7238 1
+8266	7238 1
+7637	7833 1
+8270	4940 1
+8270	7833 1
+8271	7833 1
+8272	4940 1
+8273	4940 1
+8150	8275 1
+8150	8276 1
+8274	8275 1
+0 0 0
diff --git a/examples/det.C b/examples/det.C
index afa2334..aa42961 100644
--- a/examples/det.C
+++ b/examples/det.C
@@ -27,13 +27,12 @@
   \ingroup examples
   */
 
-//#include "linbox-config.h"
+#include <linbox/linbox-config.h>
 #include <iostream>
 
-#include "linbox/field/modular.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/solutions/det.h"
-#include "linbox/util/matrix-stream.h"
+#include <linbox/ring/modular.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/solutions/det.h>
 
 using namespace LinBox;
 using namespace std;
@@ -54,7 +53,7 @@ int main (int argc, char **argv)
 		// For a small integer matrix test, do "det data/mat2S".
 		// It is a 2 by 2 matrix with determinant = -2.
 
-		typedef PID_integer Integers;
+		typedef Givaro::ZRing<Integer> Integers;
 		Integers ZZ;
 
 		ifstream input (argv[1]);
@@ -62,8 +61,7 @@ int main (int argc, char **argv)
 		{ cerr << "Error opening matrix file " << argv[1] << endl;
 			return -1;
 		}
-		MatrixStream< Integers> ms ( ZZ, input );
-		BlasMatrix<Integers> A(ms);
+		DenseMatrix<Integers> A(ZZ); A.read(input);
 		cout << "Matrix is " << A.rowdim() << " by " << A.coldim() << endl;
 
 		Integers::Element det_A;
@@ -74,7 +72,7 @@ int main (int argc, char **argv)
 	}
 	if (argc == 3) {
 
-		typedef Modular<double> Field;
+		typedef Givaro::Modular<double> Field;
 		double q = atof(argv[2]);
 		Field F(q);
 
@@ -83,8 +81,7 @@ int main (int argc, char **argv)
 		{ cerr << "Error opening matrix file " << argv[1] << endl;
 			return -1;
 		}
-		MatrixStream< Field > ms ( F, input );
-		SparseMatrix<Field> B (ms);
+		SparseMatrix<Field> B (F); B.read(input);
 		cout << "Matrix is " << B.rowdim() << " by " << B.coldim() << endl;
 
 		Field::Element det_B;
diff --git a/examples/dot-product.C b/examples/dot-product.C
index 601a862..bacd55a 100644
--- a/examples/dot-product.C
+++ b/examples/dot-product.C
@@ -35,18 +35,18 @@
  * required time.
  */
 
-#include "linbox/linbox-config.h"
+#include <linbox/linbox-config.h>
 
 #include <iostream>
 
-#include "linbox/field/modular.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/vector/stream.h"
-#include "linbox/util/commentator.h"
+#include <linbox/ring/modular.h>
+#include <linbox/vector/vector-domain.h>
+#include <linbox/vector/stream.h>
+#include <linbox/util/commentator.h>
 
 using namespace LinBox;
 
-typedef Modular<uint32_t> Field;
+typedef Givaro::Modular<uint32_t> Field;
 
 /// no command line args
 int main (int argc, char **argv)
@@ -60,11 +60,11 @@ int main (int argc, char **argv)
 	commentator().setMaxDepth (1);
 	commentator().setReportStream (std::cout);
 
-	Field F (q);
+	Field F (q); Field::RandIter gen(F);
 
-	RandomDenseStream<Field, Vector<Field>::Dense> factory1 (F, n);
-	RandomSparseStream<Field, Vector<Field>::SparseSeq> factory2 (F, p, n);
-	RandomSparseStream<Field, Vector<Field>::SparsePar> factory3 (F, p, n);
+	RandomDenseStream<Field, Vector<Field>::Dense> factory1 (F, gen, n);
+	RandomSparseStream<Field, Vector<Field>::SparseSeq> factory2 (F, gen, p, n);
+	RandomSparseStream<Field, Vector<Field>::SparsePar> factory3 (F, gen, p, n);
 
 	Vector<Field>::Dense v1 (n), v2 (n);
 	Vector<Field>::SparseSeq v3;
diff --git a/examples/doubledet.C b/examples/doubledet.C
index aaf8fa3..3543bed 100644
--- a/examples/doubledet.C
+++ b/examples/doubledet.C
@@ -28,13 +28,14 @@
  * @brief computes doubleDet.
  */
 
+#include <linbox/linbox-config.h>
 #include <iostream>
 
-#include "linbox/linbox-config.h"
-#include "linbox/field/PID-integer.h"
-#include "linbox/util/matrix-stream.h"
-#include "linbox/solutions/det.h"
-#include "linbox/algorithms/double-det.h"
+#include <givaro/zring.h>
+#include <linbox/linbox-config.h>
+#include <linbox/util/matrix-stream.h>
+#include <linbox/solutions/det.h>
+#include <linbox/algorithms/double-det.h>
 
 
 using namespace LinBox;
@@ -46,15 +47,15 @@ int main (int argc, char **argv)
 	//     commentator().setMaxDepth (-1);
 	//     commentator().setReportStream (std::cerr);
 
-	PID_integer ZZ;
+	Givaro::ZRing<Integer> ZZ;
 
 	ifstream input (argv[1]);
 	if (!input)
 	{ cerr << "Error opening matrix file " << argv[1] << endl;
 		return -1;
 	}
-	MatrixStream <PID_integer> ms (ZZ, input);
-	BlasMatrix <PID_integer> A (ms);
+	MatrixStream <Givaro::ZRing<Integer> > ms (ZZ, input);
+	DenseMatrix <Givaro::ZRing<Integer> > A (ms);
 	cout << "Matrix is " << A.rowdim() << " by " << A.coldim() << endl;
 
 	if (A.rowdim() != A.coldim() + 1){
@@ -75,7 +76,7 @@ int main (int argc, char **argv)
 
 	// Check solution
 	size_t n = A.coldim();
-	BlasMatrix<PID_integer> B (ZZ, n, n);
+	DenseMatrix<Givaro::ZRing<Integer> > B (ZZ, n, n);
 	for (size_t i=0; i<n-1; ++i)
 		for (size_t j=0; j<n; ++j)
 			B.setEntry (i,j,A.getEntry(i,j));
@@ -104,11 +105,10 @@ int main (int argc, char **argv)
 	return 0 ;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/echelon.C b/examples/echelon.C
index 501c648..aad107c 100644
--- a/examples/echelon.C
+++ b/examples/echelon.C
@@ -28,11 +28,12 @@
   \ingroup examples
   */
 
+#include <linbox/linbox-config.h>
+
 #include <iostream>
 
-#include "linbox/field/modular.h"
-#include "linbox/util/matrix-stream.h"
-#include "linbox/algorithms/echelon-form.h"
+#include <linbox/ring/modular.h>
+#include <linbox/algorithms/echelon-form.h>
 #include <fflas-ffpack/ffpack/ffpack.h>
 
 using namespace LinBox;
@@ -47,42 +48,46 @@ int main (int argc, char **argv)
 	ifstream input (argv[1]);
 	if (!input) { cerr << "Error opening matrix file " << argv[1] << endl; return -1; }
 
-	typedef Modular<double> Field;
+	typedef Givaro::Modular<double> Field;
 	double q = atof(argv[2]);
 	Field F(q);
 
-	MatrixStream<Field> ms(F,input);
-	BlasMatrix<Field> A(ms);
-	BlasMatrix<Field> E(F,A.rowdim(),A.coldim());
+	DenseMatrix<Field> A(F);
+	A.read(input);
+	DenseMatrix<Field> E(F,A.rowdim(),A.coldim());
 	cout << "A is " << A.rowdim() << " by " << A.coldim() << endl;
 	cout << A << std::endl;
 
-	EchelonFormDomain<Modular<double> > EFD (F);
+	EchelonFormDomain<Givaro::Modular<double> > EFD (F);
 
 	EFD.rowReducedEchelon(E,A);
 
 #ifdef COMPARE_FFPACK
-	BlasMatrix<Field> G(A);
+	DenseMatrix<Field> G(A);
 	size_t * P = new size_t[G.coldim()];
 	size_t * Q = new size_t[G.rowdim()];
-	size_t r = (size_t)FFPACK::ReducedRowEchelonForm (F, G.rowdim(), G.coldim(), G.getWritePointer(), G.coldim(), P, Q,false);
+	/*  size_t r = (size_t)*/
+	FFPACK::ReducedRowEchelonForm (F, G.rowdim(), G.coldim(), G.getWritePointer(), G.coldim(), P, Q,false);
 
 	if (G.coldim() <20)
 		G.write(cerr<<"FFPACK::Echelon = "<<endl)<<endl;
 
+	delete[] P ;
+	delete[] Q ;
+
 #endif
 
 	if (E.coldim() <20)
 		E.write(cerr<<"LinBox::Echelon = "<<endl)<<endl;
 
+
 	return 0;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/fields/Makefile.am b/examples/fields/Makefile.am
index 2a9c752..7d14f2f 100644
--- a/examples/fields/Makefile.am
+++ b/examples/fields/Makefile.am
@@ -19,7 +19,7 @@
 # ========LICENCE========
 #/
 
-AM_CPPFLAGS=-I$(top_srcdir)
+#  AM_CPPFLAGS=-I$(top_srcdir)
 
 EXTRA_PROGRAMS =		\
 	ex-fields 		\
@@ -29,9 +29,9 @@ EXTRA_PROGRAMS =		\
 #AM_CPPFLAGS=$(GMP_CFLAGS) $(NTL_CFLAGS) -DEXAMPLE_DATADIR=\"$(srcdir)/data\"
 #LDADD = $(top_builddir)/linbox/liblinbox.a $(GMP_LIBS) $(NTL_LIBS)
 AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DLinBoxSrcOnly
-AM_CPPFLAGS+= -DLinBoxSrcOnly $(GMP_CFLAGS) $(NTL_CFLAGS) \
+AM_CPPFLAGS+= -DLinBoxSrcOnly  $(NTL_CFLAGS) \
 			 -DEXAMPLE_DATADIR=\"$(srcdir)/data\"
-LDADD = $(GMP_LIBS) $(NTL_LIBS) -lgivaro -lclapack -lcblas -latlas $(LDFLAGS)
+LDADD =  $(NTL_LIBS) $(LDFLAGS)
 
 ex_fields_SOURCES           = ex-fields.C
 ex_fields_archetype_SOURCES = ex-fields-archetype.C
diff --git a/examples/fields/Makefile.in b/examples/fields/Makefile.in
deleted file mode 100644
index 87f9b3e..0000000
--- a/examples/fields/Makefile.in
+++ /dev/null
@@ -1,584 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# This file is part of LinBox
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-#/
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-EXTRA_PROGRAMS = ex-fields$(EXEEXT) ex-fields-archetype$(EXEEXT) \
-	modular-int$(EXEEXT)
-subdir = examples/fields
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am_ex_fields_OBJECTS = ex-fields.$(OBJEXT)
-ex_fields_OBJECTS = $(am_ex_fields_OBJECTS)
-ex_fields_LDADD = $(LDADD)
-am__DEPENDENCIES_1 =
-ex_fields_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_ex_fields_archetype_OBJECTS = ex-fields-archetype.$(OBJEXT)
-ex_fields_archetype_OBJECTS = $(am_ex_fields_archetype_OBJECTS)
-ex_fields_archetype_LDADD = $(LDADD)
-ex_fields_archetype_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_modular_int_OBJECTS = modular-int.$(OBJEXT)
-modular_int_OBJECTS = $(am_modular_int_OBJECTS)
-modular_int_LDADD = $(LDADD)
-modular_int_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = $(ex_fields_SOURCES) $(ex_fields_archetype_SOURCES) \
-	$(modular_int_SOURCES)
-DIST_SOURCES = $(ex_fields_SOURCES) $(ex_fields_archetype_SOURCES) \
-	$(modular_int_SOURCES)
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-AM_CPPFLAGS = -I$(top_srcdir) -DLinBoxSrcOnly $(GMP_CFLAGS) \
-	$(NTL_CFLAGS) -DEXAMPLE_DATADIR=\"$(srcdir)/data\"
-
-#AM_CPPFLAGS=$(GMP_CFLAGS) $(NTL_CFLAGS) -DEXAMPLE_DATADIR=\"$(srcdir)/data\"
-#LDADD = $(top_builddir)/linbox/liblinbox.a $(GMP_LIBS) $(NTL_LIBS)
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DLinBoxSrcOnly
-LDADD = $(GMP_LIBS) $(NTL_LIBS) -lgivaro -lclapack -lcblas -latlas $(LDFLAGS)
-ex_fields_SOURCES = ex-fields.C
-ex_fields_archetype_SOURCES = ex-fields-archetype.C
-modular_int_SOURCES = modular-int.C
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .C .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps examples/fields/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps examples/fields/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-ex-fields$(EXEEXT): $(ex_fields_OBJECTS) $(ex_fields_DEPENDENCIES) $(EXTRA_ex_fields_DEPENDENCIES) 
-	@rm -f ex-fields$(EXEEXT)
-	$(CXXLINK) $(ex_fields_OBJECTS) $(ex_fields_LDADD) $(LIBS)
-ex-fields-archetype$(EXEEXT): $(ex_fields_archetype_OBJECTS) $(ex_fields_archetype_DEPENDENCIES) $(EXTRA_ex_fields_archetype_DEPENDENCIES) 
-	@rm -f ex-fields-archetype$(EXEEXT)
-	$(CXXLINK) $(ex_fields_archetype_OBJECTS) $(ex_fields_archetype_LDADD) $(LIBS)
-modular-int$(EXEEXT): $(modular_int_OBJECTS) $(modular_int_DEPENDENCIES) $(EXTRA_modular_int_DEPENDENCIES) 
-	@rm -f modular-int$(EXEEXT)
-	$(CXXLINK) $(modular_int_OBJECTS) $(modular_int_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-.C.o:
-	$(CXXCOMPILE) -c -o $@ $<
-
-.C.obj:
-	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.C.lo:
-	$(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool ctags distclean distclean-compile \
-	distclean-generic distclean-libtool distclean-tags distdir dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-man install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/examples/fields/ex-fields-archetype.C b/examples/fields/ex-fields-archetype.C
index febb2d0..3dcd42c 100644
--- a/examples/fields/ex-fields-archetype.C
+++ b/examples/fields/ex-fields-archetype.C
@@ -72,12 +72,12 @@ int main() {
 	/* The field objects "K_o" and "Q_o" are constructed as in previous examples
 	*/
 
-	// UnparametricField<NTL::RR> Q_o;
+	// Givaro::ZRing<NTL::RR> Q_o;
 	NTL_RR Q_o ;
 	NTL::RR::SetPrecision(400);
 	NTL::RR::SetOutputPrecision(50);
 
-	// UnparametricField<NTL::zz_p> K_o;
+	// Givaro::ZRing<NTL::zz_p> K_o;
 	NTL::zz_p::init(553);
 	NTL_zz_p K_o ;
 
diff --git a/examples/fields/ex-fields.C b/examples/fields/ex-fields.C
index c0d2b17..b478546 100644
--- a/examples/fields/ex-fields.C
+++ b/examples/fields/ex-fields.C
@@ -71,21 +71,21 @@ int main()
 	/* Using the parameterized domain capabilities, several domains
 	 * representing integers modulo may be used simultaneously. */
 
-	Modular<uint32_t> D(3), K(7);
+	Givaro::Modular<uint32_t> D(3), K(7);
 
 	divide_ex(D);  divide_ex(K);
 
 	// NTL arbitrary precision real field
 	// (Could be parameterized by the precision)
 
-	// UnparametricField<NTL::RR> K2;
+	// Givaro::ZRing<NTL::RR> K2;
 	NTL_RR K2 ;
 	NTL::RR::SetPrecision(500);
 	NTL::RR::SetOutputPrecision(50);
 
 	// NTL modulo p field
 
-	//UnparametricField<NTL::zz_p> K2;
+	//Givaro::ZRing<NTL::zz_p> K2;
 	//NTL::zz_p::init(553);
 
 	divide_ex(K2);
diff --git a/examples/fields/modular-int.C b/examples/fields/modular-int.C
index 9395470..cae45e7 100644
--- a/examples/fields/modular-int.C
+++ b/examples/fields/modular-int.C
@@ -23,7 +23,7 @@
  */
 
 /** \file examples/fields/modular-int.C
-  \brief  Example of arithmetic in the Modular<int> finite field.
+  \brief  Example of arithmetic in the Givaro::Modular<int> finite field.
   */
 //by  Zhendong wan wan at udel.edu
 
@@ -36,10 +36,10 @@
 int main (int argc, char **argv)
 {
 	/* construct the Z/101Z field */
-	LinBox::Modular<int> F(101);
+	Givaro::Modular<int> F(101);
 
 	/* declare local variable a, b, c, x, y*/
-	LinBox::Modular<int>::Element a, b, c, x, y;
+	Givaro::Modular<int>::Element a, b, c, x, y;
 
 	// initializtion
 	F.init(a, 92);
diff --git a/examples/find-invariant-factors.C b/examples/find-invariant-factors.C
new file mode 100644
index 0000000..58cb207
--- /dev/null
+++ b/examples/find-invariant-factors.C
@@ -0,0 +1,79 @@
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <vector>
+//#include <omp.h>
+
+//#define LINBOX_USES_OMP 1
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+
+#include "linbox/algorithms/coppersmith-invariant-factors.h"
+
+// Computes the invariant factors of a sparse matrix (given in Matrix Market Format)
+// Effectively times: TPL_omp, BlockCoppersmithDomain and KannanBachem
+
+using namespace LinBox;
+
+typedef Givaro::Modular<double> Field;
+typedef typename Field::Element Element;
+typedef SparseMatrix<Field, SparseMatrixFormat::TPL> SparseMat;
+//typedef SparseMatrix<Field, SparseMatrixFormat::TPL_omp> SparseMat;
+
+typedef CoppersmithInvariantFactors<Field,SparseMat> FactorDomain;
+typedef typename FactorDomain::PolyDom PolyDom;
+typedef typename FactorDomain::PolyRing PolyRing;
+typedef DenseVector<PolyRing> FactorVector;
+
+int main(int argc, char** argv)
+{
+	int earlyTerm = 10;
+	int p = 97, b = 3;
+	std::string mFname,oFname;
+
+	static Argument args[] = {
+		{ 'p', "-p P", "Set the field GF(p)", TYPE_INT, &p},
+		{ 't', "-t T", "Early term threshold", TYPE_INT, &earlyTerm},
+		{ 'b', "-b B", "Blocking factor", TYPE_INT, &b},
+		{ 'm', "-m M", "Name of file for matrix M", TYPE_STR, &mFname},
+		{ 'o', "-o O", "Name of file for output", TYPE_STR, &oFname},
+		END_OF_ARGUMENTS
+	};
+
+	parseArguments(argc,argv,args);
+
+	Field F(p);
+	SparseMat M(F);
+
+	{
+		std::ifstream iF(mFname);
+		M.read(iF);
+		M.finalize();
+		iF.close();
+	}
+
+	std::cout << "Finished reading" << std::endl;
+
+	PolyDom PD(F,"x");
+	PolyRing R(PD);
+	FactorVector factorList(R);
+	FactorDomain CIF(F,M,b);
+
+	size_t numFactors=CIF.computeFactors(factorList,earlyTerm);
+	std::cout << "Finished computing factors" << std::endl;
+
+	{
+		std::ofstream out(oFname);
+		for (size_t i=0;i<numFactors;++i) {
+			R.write(out,factorList[i]);
+			out << std::endl;
+		}
+		out.close();
+	}
+
+	return 0;
+}
+
+
diff --git a/examples/gf3-invariant-factors.C b/examples/gf3-invariant-factors.C
new file mode 100644
index 0000000..8201d81
--- /dev/null
+++ b/examples/gf3-invariant-factors.C
@@ -0,0 +1,122 @@
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <vector>
+#include <omp.h>
+
+#define LINBOX_USES_OMP 1
+
+
+#include "linbox/blackbox/pascal.h"
+
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/matrix/sliced3.h"
+#include "linbox/algorithms/coppersmith-invariant-factors.h"
+
+using namespace LinBox;
+
+template<class Field>
+std::istream& readVector(std::istream& is,
+                         const Field& F,
+                         std::vector<typename Field::Element>& out)
+{
+	char c;
+	is >> std::ws;
+	is >> c;
+	linbox_check(c=='[');
+	is >> std::ws;
+	out.clear();
+	c=is.peek();
+	while (is.good() && (c != ']')) {
+		typename Field::Element d;
+		F.read(is,d);
+		out.push_back(d);
+		is >> std::ws;
+		c=is.peek();
+	}
+	return is;
+}
+
+typedef SlicedField<Givaro::Modular<int64_t>,uint64_t> Field;
+typedef typename Field::Element Element;
+typedef PascalBlackbox<Field> SparseMat;
+
+typedef CoppersmithInvariantFactors<Field,SparseMat,Givaro::Modular<int64_t> > FactorDomain;
+typedef typename FactorDomain::PolyDom PolyDom;
+typedef typename FactorDomain::PolyRing PolyRing;
+typedef DenseVector<PolyRing> FactorVector;
+
+int main(int argc, char** argv)
+{
+	int earlyTerm;
+	int b;
+	std::string mFname,oFname;
+
+	static Argument args[] = {
+		{ 't', "-t T", "Early term threshold", TYPE_INT, &earlyTerm},
+		{ 'b', "-b B", "Blocking factor", TYPE_INT, &b},
+		{ 'm', "-m M", "Name of file for coefficients", TYPE_STR, &mFname},
+		{ 'o', "-o O", "Name of file for output", TYPE_STR, &oFname},
+		END_OF_ARGUMENTS
+	};
+
+	parseArguments(argc,argv,args);
+
+	Field F(3);
+	std::vector<Element> coeffs;
+	{
+		std::ifstream iF(mFname);
+		readVector(iF,F,coeffs);
+		iF.close();
+	}
+	int n=coeffs.size();
+	coeffs.resize(2*n);
+	SparseMat M(n,n,coeffs,F);
+
+#if 0
+	{
+		MatrixDomain<Field> MD;
+		typename MatrixDomain<Field>::OwnMatrix I(F,n,n),O(F,n,n);
+		for (int i=0;i<n;++i)
+			for (int j=0;j<n;++j)
+				I.setEntry(i,j,i==j?1:0);
+		M.applyLeft(O,I);
+		for (int i=0;i<n;++i) {
+			for (int j=0;j<n;++j) {
+				Element d;
+				O.getEntry(d,i,j);
+				std::cout << (int)d;
+			}
+			std::cout << std::endl;
+		}
+	}
+#else
+	std::cout << "Finished reading" << std::endl;
+
+	PolyDom PD(F,"x");
+	PolyRing R(PD);
+	FactorVector factorList(R);
+	FactorDomain CIF(F,M,b);
+
+	size_t numFactors=CIF.computeFactors(factorList,earlyTerm);
+	std::cout << "Finished computing factors" << std::endl;
+
+	{
+		std::ofstream out(oFname);
+		for (size_t i=0;i<numFactors;++i) {
+			R.write(out,factorList[i]);
+			out << std::endl;
+		}
+		out.close();
+	}
+#endif
+	return 0;
+}
+
+
+
+
+
diff --git a/examples/graph-charpoly.C b/examples/graph-charpoly.C
index 306fb18..756cc1c 100644
--- a/examples/graph-charpoly.C
+++ b/examples/graph-charpoly.C
@@ -29,13 +29,15 @@
  * Example for Pr G. Royle.
  */
 
+#include <linbox/linbox-config.h>
+
 #include <iostream>
 
-#include "linbox/blackbox/zero-one.h"
-#include "linbox/field/PID-integer.h"
-#include "linbox/solutions/charpoly.h"
-#include "linbox/ring/givaro-polynomial.h"
-#include "linbox/solutions/methods.h"
+#include <linbox/blackbox/zero-one.h>
+#include <givaro/zring.h>
+#include <linbox/solutions/charpoly.h>
+#include <linbox/ring/givaro-polynomial.h>
+#include <linbox/solutions/methods.h>
 
 using namespace std;
 using namespace LinBox;
@@ -45,7 +47,7 @@ void printPolynomial(const Field& F, const Polynomial& P)
 {
 	int n= (int) P.size()-1;
 	for (int i=0;i<n;++i)
-		cout<<P[i]<<" ";
+		cout<<P[(size_t)i]<<" ";
 	cout<<endl;
 	if (n==1){
 		cout<<"X";
@@ -55,8 +57,8 @@ void printPolynomial(const Field& F, const Polynomial& P)
 	else{
 		cout<<"X^"<<n;
 		for ( int i=n-1; i>1; --i)
-			if (!F.isZero(P[i]))
-				F.write(cout<<((P[i]>0)?"+":""),P[i])<<"*X^"<<i;
+			if (!F.isZero(P[(size_t)i]))
+				F.write(cout<<((P[(size_t)i]>0)?"+":""),P[(size_t)i])<<"*X^"<<i;
 		if ( P[1] != 0)
 			F.write(cout<<((P[1]>0)?"+":""),P[1])<<"*X";
 		if ( P[0] != 0)
@@ -65,8 +67,8 @@ void printPolynomial(const Field& F, const Polynomial& P)
 }
 
 
-typedef ZeroOne<PID_integer> Matrix;
-typedef GivPolynomialRing<PID_integer, Givaro::Dense> IntPolRing;
+typedef ZeroOne<Givaro::ZRing<Integer> > Matrix;
+typedef GivPolynomialRing<Givaro::ZRing<Integer>, Givaro::Dense> IntPolRing;
 
 int main (int argc, char **argv)
 {
@@ -85,8 +87,8 @@ int main (int argc, char **argv)
 		return -1;
 	}
 
-	//UnparametricField<integer> ZZ;
-	PID_integer ZZ;
+	//Givaro::ZRing<integer> ZZ;
+	Givaro::ZRing<Integer> ZZ;
 	Matrix A(ZZ);
 	A.read (input);
 	commentator().report(1, BRIEF_REPORT)<< "A is " << A.rowdim() << " by " << A.coldim() << endl;
diff --git a/examples/grid_reduce.C b/examples/grid_reduce.C
new file mode 100644
index 0000000..a512e29
--- /dev/null
+++ b/examples/grid_reduce.C
@@ -0,0 +1,451 @@
+
+/*
+ * examples/grid_reduce.C
+ *
+ * Copyright (C) 2008, 2010 A. Urbanska
+  ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file examples/grid_reduce.C
+ * @example examples/grid_reduce.C
+ * @ingroup examples
+ * @brief undocumented
+ */
+
+#include <iostream>
+#include <sstream>
+#include<fstream>
+
+#include <linbox/linbox-config.h>
+#include <givaro/modular.h>
+#include <linbox/util/timer.h>
+#include <linbox/matrix/grid.h>
+
+using namespace LinBox;
+
+int main(int argc, char* argv[])
+{
+
+	srand(time(NULL));
+
+	if (argc < 5) {
+
+		std::cout << "usage: " << argv[0] << " alg m n S source format " << std::endl  << std::endl;
+
+		std::cout << "alg = `adaptive', `ilio', `local', or `2local', " << std::endl
+		<< "m is modulus (ignored by 2local, adaptive), "
+		<< "n is matrix order, " << std::endl
+		<< "S is reduced rows size" << std::endl
+		<< "source is `random', `random-rough', `fib', `tref', or a filename " << std::endl
+		<< "format is `dense' or `sparse' (if matrix from a file)" << std::endl
+		<< "compile with -DBIG if you want big integers used." << std::endl;
+
+		return 0;
+	}
+
+	std::string algo = argv[1];
+
+	// int m = atoi(argv[2]);
+
+	// int n = atoi(argv[3]);
+
+	int S = atoi(argv[4]);
+	std::string src = argv[5];
+	// std::string file = src;
+
+	// std::string format = (argc >= 6 ? argv[5] : "");
+
+	UserTimer T, TT;
+
+	std::string out(src);
+	out=out+"z";
+	if (algo == "reduceT") out=out+"T";
+
+	typedef Givaro::ZRing<Integer> Ints;
+	//typedef Givaro::ModularBalanced<int> Ints;
+	//typedef Givaro::Modular<int> Ints;
+	//Ints Z(m);
+	Ints Z;
+
+	integer p;
+	std::cout << "Computation modulo " << Z.characteristic(p) << "" << std::endl<<std::flush;
+
+	std::ifstream in (src.c_str(), std::ios::in);
+	std::ofstream os (out.c_str(), std::ios::out);
+
+	std::vector<int> mC;
+	std::vector<int> mR;
+#if 0
+	   ifstream mRow ("mR2", ios::in);
+	   char c='['; mRow >> c; std::cout << c;
+	   while (c!='[') {
+	   mRow >> c;
+	   std::cout << c;
+	   }
+	   int mark;
+	   while( mRow >> mark) {
+	   mC.push_back(mark);
+	   }
+	   mRow.close();
+	   mRow.open("mC2", ios::in) ;
+	   c='['; mRow >> c; std::cout << c;
+	   while (c!='[') {
+	   mRow >> c;
+	   std::cout << c;
+	   }
+	   for (int i=0; i< mC.size(); ++i) {
+	   mRow >> mark;
+	   if(mark==1) mC[i] = mark;
+	   }
+#endif
+	std::cout << src << "" << std::endl<< std::flush ;
+	TT.clear();
+	TT.start();
+	Grid<Ints, Ints::Element> A(Z,in, mR, mC);
+	TT.stop();
+	std::cout << "Reading the matrix in ";
+	TT.print(std::cout);
+	std::cout << " seconds" << std::endl << std::flush;
+
+	int rank =0;
+	TT.clear();
+	TT.start();
+	A.reduce(rank, S, mR, mC, os);
+	TT.stop();
+	std::cout << "Reducing the matrix in ";
+	TT.print(std::cout);
+	std::cout << " seconds" << std::endl << std::flush;
+
+	std::cout << "The rank is " << rank << "" << std::endl << std::flush;
+	A.write(os);
+	//std::cout << "mR: \n[";
+	//for (int i=0; i < mR.size() ; ++i) {
+	//	std::cout << mR[i] << " ";
+	//}
+	os << "mC: \n[";
+	for (int i=0; i < mC.size() ; ++i) {
+		os << mC[i] << " ";
+	}
+	os << "]" << std::endl;
+	os << "mR: \n[";
+	for (int i=0; i < mR.size() ; ++i) {
+		os<< mR[i] << " ";
+	}
+	os <<std::endl <<std::flush;
+
+
+	int matrix=1;
+	TT.clear();
+	TT.start();
+	while  (matrix+1 < argc-5) {//argc - "grid-reduce reduce m n S", while takes 2 matrices
+		TT.stop();
+		std::cout << "Time other:";
+		TT.print(std::cout);
+		std::cout << "seconds" << std::endl << std::flush;
+		TT.clear();
+		TT.start();
+		//mC = mR;	//mR plays the role of mC
+		mC.resize(0);
+		char c='['; in >> c; std::cout << c;
+		while (c!='[') {
+			in >> c;
+			std::cout << c;
+		}
+		TT.stop();
+		std::cout << "Time vector exchange in";
+		TT.print(std::cout);
+		std::cout << "seconds" << std::endl << std::flush;
+		TT.clear();
+		TT.start();
+		std::cout << "reading additional columns" << std::endl << std::flush;
+		for (int i=0; i < mR.size(); ++i) {
+			int mark;
+			in >> mark;
+			if (mR[i]!=1) mR[i] = mark;
+			//if (mark>0) std::cout << mark << " ";
+		}
+		std::cout << "columns read in ";
+		TT.stop();
+		TT.print(std::cout);
+		std::cout << "seconds" << std::endl  << std::flush;
+
+		std::cout << "Time file preparation in";
+		TT.clear();
+		TT.start();
+		in.close();
+		src = argv[5+matrix];
+		std::cout << src << "" << std::endl << std::flush;
+		std::string out3(src);
+		out3= out3+"z";
+		if (algo == "reduceT") out3=out3+"T";
+		//++matrix;
+		in.open(src.c_str(), std::ios::in);
+		os.close();
+		os.open(out3.c_str(), std::ios::out);
+		TT.stop();
+		TT.print(std::cout);
+		std::cout << "seconds" << std::endl  << std::flush;
+		TT.clear();
+		TT.start();
+		A.read(Z,in, mC, mR);
+		//Grid<Ints, Ints::Element> A2(Z,in, mR, mC);
+		TT.stop();
+		std::cout << "Reading the matrix in ";
+		TT.print(std::cout);
+		std::cout << " seconds" << std::endl << std::flush;
+
+		rank =0;
+		TT.clear();
+		TT.start();
+		if (matrix==1) A.reduce(rank, 1000000*S, mC, mR, os); //22(1,9)
+		if (matrix==9) A.reduce(rank, 1000000*S, mC, mR, os); //22(1,9)
+		if (matrix==7) A.reduce(rank, 4.7*S, mC, mR, os); //20(3,7)change1.6
+		if (matrix==5) A.reduce(rank, 1000000*S, mC, mR, os); //18(5,5)change3
+		//if (matrix==1) A.reduce(rank, S,mC,mR,os);
+		else A.reduce(rank, S, mC, mR, os);
+		TT.stop();
+		std::cout << "Reducing the matrix in ";
+		TT.print(std::cout);
+		std::cout << " seconds" << std::endl << std::flush;
+
+		std::cout << "The rank is " << rank << "" << std::endl << std::flush;
+		TT.clear();
+		TT.start();
+		A.write(os);
+		TT.stop();
+		std::cout << "Writing the matrix in ";
+		TT.print(std::cout);
+		std::cout << " seconds" << std::endl << std::flush;
+
+		TT.clear();
+		TT.start();
+		os << "mC:\n[";
+		for (int i=0; i < mR.size() ; ++i) {
+			os << mR[i] << " ";
+		}
+		os << "" << std::endl;
+		os << "mR: \n[";
+		for (int i=0; i < mC.size() ; ++i) {
+			os<< mC[i] << " ";
+		}
+		os <<std::endl <<std::flush;
+		TT.stop();
+		std::cout << "Writing mC vector in ";
+		TT.print(std::cout);
+		std::cout << " seconds" << std::endl << std::flush;
+
+		//mC = mR;
+		mR.resize(0);
+		c='['; in >> c; std::cout << c;
+		while (c!='[') {
+			in >> c;
+			std::cout << c;
+		}
+		TT.stop();
+		std::cout << "Time vector exchange in";
+		TT.print(std::cout);
+		std::cout << "seconds" << std::endl << std::flush;
+		TT.clear();
+		TT.start();
+		std::cout << "reading additional columns" << std::endl << std::flush;
+		for (int i=0; i < mC.size(); ++i) {
+			int mark;
+			in >> mark;
+			if (mC[i]!=1) mC[i] = mark;
+			//if (mark>0) std::cout << mark << " ";
+		}
+		std::cout << "columns read in ";
+		TT.stop();
+		TT.print(std::cout);
+		std::cout << "seconds" << std::endl  << std::flush;
+
+		std::cout << "Time file preparation in";
+		TT.clear();
+		TT.start();
+		in.close();
+		src = argv[6+matrix];
+		std::cout << src << "" << std::endl << std::flush;
+		std::string out4(src);
+		out4= out4+"z";
+		if (algo == "reduceT") out4=out4+"T";
+		matrix+=2;
+		in.open(src.c_str(), std::ios::in);
+		os.close();
+		os.open(out4.c_str(), std::ios::out);
+		TT.stop();
+		TT.print(std::cout);
+		std::cout << "seconds" << std::endl  << std::flush;
+		TT.clear();
+		TT.start();
+
+		A.read(Z,in, mR, mC);
+		//Grid<Ints, Ints::Element> A2(Z,in, mR, mC);
+		TT.stop();
+		std::cout << "Reading the matrix in ";
+		TT.print(std::cout);
+		std::cout << " seconds" << std::endl << std::flush;
+
+		int rank =0;
+		TT.clear();
+		TT.start();
+		if (matrix==3) A.reduce(rank, 6.8*S, mR, mC, os); //21(3,9)
+		if (matrix==9) A.reduce(rank, 6.8*S, mR, mC, os); //21(3,9)
+		if (matrix==7) A.reduce(rank, 4.6*S, mR, mC, os); //19(5,7)nochange1.6
+		A.reduce(rank, S, mR, mC, os);
+		TT.stop();
+		std::cout << "Reducing the matrix in ";
+		TT.print(std::cout);
+		std::cout << " seconds" << std::endl << std::flush;
+
+		std::cout << "The rank is " << rank << "" << std::endl << std::flush;
+		TT.clear();
+		TT.start();
+		A.write(os);
+		TT.stop();
+		std::cout << "Writing the matrix in ";
+		TT.print(std::cout);
+		std::cout << " seconds" << std::endl << std::flush;
+
+		TT.clear();
+		TT.start();
+		os << "mC:\n[";
+		for (int i=0; i < mC.size() ; ++i) {
+			os << mC[i] << " ";
+		}
+		os << "" << std::endl;
+		os << "mR: \n[";
+		for (int i=0; i < mR.size() ; ++i) {
+			os<< mR[i] << " ";
+		}
+		os <<std::endl <<std::flush;
+		TT.stop();
+		std::cout << "Writing mC vector in ";
+		TT.print(std::cout);
+		std::cout << " seconds" << std::endl << std::flush;
+
+		TT.clear();
+		TT.start();
+	}
+
+	if (matrix < argc-5) {
+		TT.stop();
+		std::cout << "Time other:";
+		TT.print(std::cout);
+		std::cout << "seconds" << std::endl << std::flush;
+		TT.clear();
+		TT.start();
+		//mC = mR;      //mR plays the role of mC
+		mC.resize(0);
+		char c='['; in >> c; std::cout << c;
+		while (c!='[') {
+			in >> c;
+			std::cout << c;
+		}
+		TT.stop();
+		std::cout << "Time vector exchange in";
+		TT.print(std::cout);
+		std::cout << "seconds" << std::endl << std::flush;
+		TT.clear();
+		TT.start();
+		std::cout << "reading additional columns" << std::endl << std::flush;
+		for (int i=0; i < mR.size(); ++i) {
+			int mark;
+			in >> mark;
+			if (mR[i]!=1) mR[i] = mark;
+			//if (mark>0) std::cout << mark << " ";
+		}
+		std::cout << "columns read in ";
+		TT.stop();
+		TT.print(std::cout);
+		std::cout << "seconds" << std::endl  << std::flush;
+
+		std::cout << "Time file preparation in";
+		TT.clear();
+		TT.start();
+		in.close();
+		src = argv[5+matrix];
+		std::cout << src << "" << std::endl << std::flush;
+		std::string out2(src);
+		out2= out2+"z";
+		if (algo == "reduceT") out2=out2+"T";
+		//++matrix;
+		in.open(src.c_str(), std::ios::in);
+		os.close();
+		os.open(out2.c_str(), std::ios::out);
+		TT.stop();
+		TT.print(std::cout);
+		std::cout << "seconds" << std::endl  << std::flush;
+		TT.clear();
+		TT.start();
+		A.read(Z,in, mC, mR);
+		//Grid<Ints, Ints::Element> A2(Z,in, mR, mC);
+		TT.stop();
+		std::cout << "Reading the matrix in ";
+		TT.print(std::cout);
+		std::cout << " seconds" << std::endl << std::flush;
+
+		int rank =0;
+		TT.clear();
+		TT.start();
+		A.reduce(rank, S, mC, mR, os);
+		TT.stop();
+		std::cout << "Reducing the matrix in ";
+		TT.print(std::cout);
+		std::cout << " seconds" << std::endl << std::flush;
+
+		std::cout << "The rank is " << rank << "" << std::endl << std::flush;
+		TT.clear();
+		TT.start();
+		A.write(os);
+		TT.stop();
+		std::cout << "Writing the matrix in ";
+		TT.print(std::cout);
+		std::cout << " seconds" << std::endl << std::flush;
+
+		TT.clear();
+		TT.start();
+		os << "mC:\n[";
+		for (int i=0; i < mR.size() ; ++i) {
+			os << mR[i] << " ";
+		}
+		os << "" << std::endl;
+		os << "mC: \n[";
+		for (int i=0; i < mC.size() ; ++i) {
+			os<< mC[i] << " ";
+		}
+		os <<std::endl <<std::flush;
+		TT.stop();
+		std::cout << "Writing mC vector in ";
+		TT.print(std::cout);
+		std::cout << " seconds" << std::endl << std::flush;
+
+	}
+	TT.stop();
+
+	return 0 ;
+}
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/iliopoulos2.C b/examples/iliopoulos2.C
new file mode 100644
index 0000000..cc91d31
--- /dev/null
+++ b/examples/iliopoulos2.C
@@ -0,0 +1,137 @@
+/* linbox/algorithms/coppersmith-invariant-factors.h
+ * Copyright (C) 2015 Gavin Harrison
+ *
+ * Written by Gavin Harrison <gavin.har at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <vector>
+
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/matrix/random-matrix.h"
+
+#include "linbox/algorithms/smith-form-iliopoulos2.h"
+
+#include <givaro/zring.h>
+
+using namespace LinBox;
+using namespace Givaro;
+
+typedef ZRing<Integer> Field;
+typedef typename ZRing<Integer>::Element Element;
+typedef IliopoulosDomain<Field> IliopoulosDom;
+typedef MatrixDomain<Field> Domain;
+typedef typename Domain::OwnMatrix Matrix;
+typedef typename Field::RandIter RandIter;
+typedef RandomDenseMatrix<RandIter, Field> RandomMatrix;
+
+Field Z;
+Domain MD(Z);
+RandIter RI(Z);
+RandomMatrix RDM(Z, RI);
+IliopoulosDom ID(Z);
+
+void printMatrix(Matrix &A) {
+	size_t m = A.rowdim();
+	size_t n = A.coldim();
+	
+	std::cout << "matrix(ZZ, " << m << "," << n << ", [" << std::endl;
+	for (size_t i = 0; i < m; i++) {
+		Element tmp;
+		Z.write(std::cout << "[", A.getEntry(tmp, i, 0));
+		for (size_t j = 1; j < n; j++) {
+			Z.write(std::cout << ", ", A.getEntry(tmp, i, j));
+		}
+		std::cout << "]," << std::endl;
+	}
+	std::cout << "])" << std::endl;
+}
+
+void randomL(Matrix &L) {
+	size_t n = L.rowdim();
+	
+	RDM.random(L);
+	
+	for (size_t i = 0; i < n; i++) {
+		L.setEntry(i, i, Z.one);
+		
+		for (size_t j = i+1; j < n; j++) {
+			L.setEntry(i, j, Z.zero);
+		}
+	}
+}
+
+void randomU(Matrix &U) {
+	size_t n = U.rowdim();
+	
+	RDM.random(U);
+	
+	for (size_t i = 0; i < n; i++) {
+		U.setEntry(i, i, Z.one);
+		
+		for (size_t j = 0; j < i; j++) {
+			U.setEntry(i, j, Z.zero);
+		}
+	}
+}
+
+int main(int argc, char** argv)
+{
+	Matrix A(Z, 4, 4);
+	
+	//RDM.random(A);
+	A.setEntry(0,0,Integer(2));
+	A.setEntry(1,1,Integer(6));
+	A.setEntry(2,2,Integer(12));
+	printMatrix(A);
+	
+	Matrix L1(Z, 4, 4);
+	randomL(L1);
+	
+	Matrix U1(Z, 4, 4);
+	randomU(U1);
+	
+	Matrix L2(Z, 4, 4);
+	randomL(L2);
+	
+	Matrix U2(Z, 4, 4);
+	randomU(U2);
+	
+	Matrix B(Z, 4, 4);
+	
+	MD.mul(B, U1, A);
+	MD.leftMulin(B, L1);
+	MD.rightMulin(B, U2);
+	MD.rightMulin(B, L2);
+	
+	printMatrix(B);
+	
+	ID.smithFormIn(B, Integer(2 * 6 * 12));
+	printMatrix(B);
+	
+	return 0;
+}
+
+
diff --git a/examples/integer-mul.C b/examples/integer-mul.C
new file mode 100644
index 0000000..8abe2d9
--- /dev/null
+++ b/examples/integer-mul.C
@@ -0,0 +1,71 @@
+/*
+ * examples/integer-mul.C
+ *
+ * Copyright (C) 2002, 2005, 2010 G Villard, D. Saunders
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/** \file examples/integer-mul.C
+ * @example examples/integer-mul.C
+ * \author Gilles Villard
+ * \brief The LinBox arbitrary precision integer type illustrated.
+ * \ingroup examples
+ *
+ * The class `integer' is a wrapper of <a href=http://gmplib.org>GMP</a> integers.
+ */
+
+// ---------------------------------------------
+#include <iostream>
+#include <fstream>
+// ---------------------------------------------
+
+#include <linbox/linbox-config.h>
+
+// Use of Gmp based LinBox integers
+#include <linbox/integer.h>
+
+using namespace LinBox;
+using namespace std;
+
+// ---------------------------------------------
+
+/// no command line args.  Prompts for two integers.
+int main()
+{
+
+	integer a,b;
+
+	cout << "1st integer > ";
+	cin >> a;
+	cout << "2nd integer > ";
+	cin >> b;
+
+	cout << "The product " << a*b << "\n";
+
+	return 0;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/invariant-factors.C b/examples/invariant-factors.C
new file mode 100644
index 0000000..2f182a1
--- /dev/null
+++ b/examples/invariant-factors.C
@@ -0,0 +1,137 @@
+/* linbox/algorithms/coppersmith-invariant-factors.h
+ * Copyright (C) 2015 Gavin Harrison
+ *
+ * Written by Gavin Harrison <gavin.har at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <vector>
+
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/blackbox/transpose.h"
+#include "linbox/blackbox/compose.h"
+
+#include "linbox/algorithms/invariant-factors.h"
+
+using namespace LinBox;
+
+typedef Givaro::Modular<double> Field;
+typedef typename Field::Element Element;
+typedef SparseMatrix<Field, SparseMatrixFormat::CSR> SparseMat;
+
+typedef InvariantFactors<Field,SparseMat> FactorDomain;
+typedef typename FactorDomain::PolyDom PolyDom;
+typedef typename FactorDomain::PolyRing PolyRing;
+typedef DenseVector<PolyRing> FactorVector;
+
+int main(int argc, char** argv)
+{
+	int earlyTerm;
+	int p = 99991, b = 30, r = 3, t = 5;
+	std::string mFname = "jumat",oFname="";
+
+	static Argument args[] = {
+		{ 'p', "-p P", "Set the field GF(p)", TYPE_INT, &p},
+		{ 'e', "-e E", "Early term threshold", TYPE_INT, &earlyTerm},
+		{ 'b', "-b B", "Blocking factor", TYPE_INT, &b},
+		{ 't', "-t T", "First blocking factor", TYPE_INT, &t},
+		{ 'r', "-r R", "R-th factor used as mod for iliopoulos", TYPE_INT, &r},
+		{ 'm', "-m M", "Name of file for matrix M", TYPE_STR, &mFname},
+		{ 'o', "-o O", "Name of file for output", TYPE_STR, &oFname},
+		END_OF_ARGUMENTS
+	};
+
+	parseArguments(argc,argv,args);
+
+	Field F(p);
+	SparseMat M(F);
+
+	{
+		std::ifstream iF(mFname);
+		M.read(iF);
+		M.finalize();
+		iF.close();
+	}
+
+	std::cout << "Finished reading, dimension " << M.rowdim() << "x" << M.coldim() << ", nnz " << M.size() << std::endl;
+
+	PolyDom PD(F,"x");
+	PolyRing R(PD);
+	FactorVector List1(R), List2(R), factorList(R);
+	FactorDomain CIF(F, R);
+
+#if 1
+	CIF.solve(factorList, M, b, t, r, earlyTerm);
+#else
+	// from solve in invariant-factors.h
+        // Compute first b1 factors
+        CIF.computeFactors(List1, M, t, earlyTerm);
+
+	std::cout << "Finished computing early factors" << std::endl;
+	{
+		for (int i = List1.size()-1; i >= 0; i--) {
+			std::cout << PD.degree(List1[i]) << ", ";
+		}
+		std::cout << std::endl;
+	}
+
+        // get r-th factor
+		PolyRing::Element d; R.assign(d, List1[t - r]);
+
+        // Compute factors mod r-th factor
+        CIF.computeFactors(List2, M, d, b, earlyTerm);
+
+	// Fill in zeros before r-th factor with r-th factor
+	    for (int i = 0; i < b - r; i++) {
+			if (R.isZero(List2[i])) R.assign(List2[i], d);
+		}
+
+        // Fill in remaining factors with original values
+		factorList.resize(b);
+        for (int i = 0; i < r; i++) 
+			factorList[i] = List1[t-1-i];
+        for (int i = r; i < b; i++) 
+			factorList[i] = List2[b-1-i];
+#endif
+	std::cout << "Finished computing factors" << std::endl;
+		for (size_t i = 0; i<factorList.size(); i++) 
+			std::cout << PD.degree(factorList[i]) << ", ";
+		std::cout << std::endl;
+
+	if (oFname.size() > 0) 
+	{
+		std::ofstream out(oFname);
+		for (size_t i = 0; i<factorList.size(); i++) {
+			R.write(out,factorList[i]);
+			out << std::endl;
+		}
+		out.close();
+	}
+
+	return 0;
+}
+
+
diff --git a/examples/makefile.mpi b/examples/makefile.mpi
new file mode 100644
index 0000000..3baa418
--- /dev/null
+++ b/examples/makefile.mpi
@@ -0,0 +1,66 @@
+# Makefile for LinBox's examples/ directory
+
+###########################################
+# this section constructed at configure time (sets compiler, flags, header locations, library locations)
+
+# basic terms
+compiler=g++
+# MPICH
+# mpicompiler=mpicxx -D__LINBOX_HAVE_MPI
+# LAM/MPI
+mpicompiler=mpiCC -D__LINBOX_HAVE_MPI
+flags=-g -Wall -DLinBoxSrcOnly 
+linboxincludes=-I..
+
+# package headers locations.  The default is to look in /usr/include and /usr/local/include
+gmpincludes= 
+blasincludes= 
+ntlincludes= 
+givaroincludes=
+
+# package library locations.  Default is to look in /usr/lib and /usr/local/lib
+gmplibdir=
+blaslibdir=
+ntllibdir= 
+givarolibdir=
+
+###########################################
+# Below this point the makefile is fixed.
+###########################################
+
+# add flags so linker can get the libfilename right
+gmplibs=$(gmplibdir) -lgmp -lgmpxx
+blaslibs=$(blaslibdir) -lcblas -llapack -latlas
+ntllibs=$(ntllibdir) -lntl
+givarolibs=$(givarolibdir) -lgivaro
+
+includes=-I. $(linboxincludes) $(gmpincludes) $(blasincludes) $(ntlincludes) $(givaroincludes)
+libs=$(gmplibs) $(blaslibs) $(ntllibs) $(givarolibs)
+
+###########################################
+# rules to make targets
+
+# generic rule for any test program
+%:%.C 
+	$(compiler) $(flags) $*.C -o $* $(includes) $(libs)
+
+# particular rule for some program using different setup from the generic one
+test-rank: test-rank.C test-generic.h # dependence on linbox sources also wanted
+	g++ test-rank.C -o test-rank $(blasincludes) $(blaslibs)
+
+minpoly: minpoly.C ../linbox/solutions/methods.h ../linbox/solutions/minpoly.h ../linbox/algorithms/cra-domain.h
+	$(mpicompiler) $(flags) minpoly.C -o minpoly $(includes) $(libs)
+
+mpidet: mpidet.C ../linbox/solutions/methods.h ../linbox/solutions/det.h ../linbox/algorithms/cra-domain.h
+	$(mpicompiler) $(flags) mpidet.C -o mpidet $(includes) $(libs)
+
+mpidet2: mpidet bigmat
+	./bigmat 200 > file
+	mpiexec C ./mpidet file
+	rm file bigmat
+
+run: minpoly file
+	mpirun -np 1 ./minpoly file
+
+clean:
+	rm mpidet minpoly test-det test-bitonic-sort test-rank a.out *.o
diff --git a/examples/map-sparse-test.C b/examples/map-sparse-test.C
new file mode 100644
index 0000000..9bdf017
--- /dev/null
+++ b/examples/map-sparse-test.C
@@ -0,0 +1,55 @@
+#include "examples/map-sparse.h"
+#include <tests/test-common.h> //bb: is this supposed to be installed ?
+
+using namespace LinBox;
+
+// why this test here ?
+int main(int argc, char* argv[])
+{
+	typedef Givaro::Modular<double> Field;
+	typedef Field::Element Element;
+	int q=65537;
+	int n=10;
+
+	static Argument args[] = {
+		{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT,     &n },
+		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+		//{ 's', "-s S", "Sparse matrices with density S.", TYPE_DOUBLE,     &sparsity },
+		END_OF_ARGUMENTS
+	};
+
+	parseArguments (argc, argv, args);
+
+	srand ((unsigned)time (NULL));
+	Field F (q);
+	MapSparse<Field> ms(F,n,n);
+	Element d;
+	for (int i=0;i<n;++i) {
+		F.assign(d,F.one);
+		ms.setEntry(i,i,d);
+		F.init(d,2);
+		ms.setEntry(n-1-i,i,d);
+	}
+	F.init(d,2);
+	ms.addCol(d,1,3);
+	F.assign(d,F.one);
+	ms.addCol(d,3,1);
+	F.init(d,2);
+	ms.timesRow(d,3);
+	F.init(d,3);
+	ms.timesCol(d,1);
+	ms.swapRows(4,5);
+	ms.swapCols(1,8);
+	if (n <= 30) ms.print(std::cerr);
+	std::cerr << ms.nnz() << std::endl;
+
+	ms.randomSim(5*n);
+	if (n <= 30) ms.print(std::cerr);
+	std::cerr << ms.nnz() << std::endl;
+	ms.randomEquiv(n*n/2);
+	if (n <= 30) ms.print(std::cerr);
+	std::cerr << ms.nnz() << std::endl;
+
+	ms.write(std::cerr);
+	return 0;
+}
diff --git a/examples/map-sparse.h b/examples/map-sparse.h
new file mode 100644
index 0000000..7ab4c46
--- /dev/null
+++ b/examples/map-sparse.h
@@ -0,0 +1,200 @@
+/* Copyright (C) 2013 LinBox
+ * Written by AJS <stachnik at udel.edu>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file   examples/map-sparse.h
+ * @ingroup examples
+ * @brief
+ */
+
+#ifndef __LINBOX_MAP_SPARSE_H
+#define __LINBOX_MAP_SPARSE_H
+
+#include <stdlib.h>
+#include <fstream>
+#include <map>
+#include <iostream>
+
+#include <linbox/linbox-config.h>
+#include <linbox/util/debug.h>
+#include <linbox/util/field-axpy.h>
+#include <linbox/blackbox/blackbox-interface.h>
+#include <linbox/field/hom.h>
+
+
+namespace LinBox
+{
+
+template<class Field_>
+class MapSparseIF {
+public:
+	typedef Field_ Field;
+	typedef typename Field::Element Element;
+	typedef size_t Index;
+
+	virtual ~MapSparseIF() {};
+
+	virtual void setEntry(Index i, Index j, const Element& e) =0;
+
+	virtual const Element& getEntry(Index i, Index j) const =0;
+
+protected:
+	typedef std::map<Index,Element> VectorType;
+	typedef typename VectorType::iterator VectorIt;
+	typedef typename VectorType::const_iterator VectorConstIt;
+	typedef std::map<Index,VectorType> MapType;
+	typedef typename MapType::iterator MapIt;
+	typedef typename MapType::const_iterator MapConstIt;
+
+
+};
+
+template<class Field_>
+class MapSparse : public MapSparseIF<Field_> {
+public:
+	typedef Field_ Field;
+	typedef typename Field::Element Element;
+	typedef size_t Index;
+	typedef std::map<Index,Element> VectorType;
+	typedef typename VectorType::iterator VectorIt;
+	typedef typename VectorType::const_iterator VectorConstIt;
+	typedef std::map<Index,VectorType> MapType;
+	typedef typename MapType::iterator MapIt;
+	typedef typename MapType::const_iterator MapConstIt;
+
+	MapSparse();
+
+	MapSparse(const Field& F, Index r, Index c);
+
+	MapSparse(const MapSparse& M);
+
+	void init(const Field& F, Index r, Index c);
+
+	void shape(Index r, Index c);
+
+	MapSparse& operator=(const MapSparse& M);
+
+	~MapSparse();
+
+	Index rowdim() const;
+
+	Index coldim() const;
+
+	const Field& field() const;
+
+	void setEntry(Index i, Index j, const Element& e);
+
+	const Element& getEntry(Index i, Index j) const;
+
+	bool verify();
+
+	//forall r: A_{i,r}<-A_{i,r}+k*A_{j,r}
+	void addRow(const Element& k, Index i, Index j);
+
+	//forall r: A_{r,i}<-A_{r,i}+k*A_{r,j}
+	void addCol(const Element& k, Index i, Index j);
+
+	//forall r: A_{i,r}<-k*A_{i,r}
+	void timesRow(const Element& k, Index i);
+
+	//forall r: A_{r,j}<-k*A_{r,j}
+	void timesCol(const Element& k, Index j);
+
+	void swapRows(Index i, Index j);
+
+	void swapCols(Index i, Index j);
+
+	void scaleMat(const Element& k);
+
+	void transpose();
+
+	Index nnz() const;
+
+	// A -> A' = SAS^{-1}, and A' has about nnz nonzero entries.
+	void randomSim(Index nnz, int seed = 0);
+
+	// A -> A' = UAV, with U and V nonsingular, and A' has about nnz nonzero entries.
+	void randomEquiv(Index nnz, int seed = 0);
+
+	bool areEqual(MapSparse<Field_> rhs) const;
+
+	std::istream& read(std::istream& in);
+
+	std::ostream& print(std::ostream& out) const;
+
+	std::ostream& write(std::ostream& out) const;
+
+	template<class Matrix>
+	void copy(Matrix& mat) const;
+
+	template<class Matrix>
+	void copyFrom(Matrix& mat);
+
+	template<class Vector>
+	void toVector(Vector& vec) const;
+
+	template<class Vector>
+	void fromVector(const Vector& vec, Index r, Index c);
+
+	static void generateCompanion(MapSparse<Field>& mat,std::vector<Element>& coeffs);
+
+	static void generateDenseRandMat(MapSparse<Field_>& mat, int q);
+
+	static void generateRandMat(MapSparse<Field>& mat, int nnz, int q);
+
+	static void generateScaledIdent(MapSparse<Field>& mat, int alpha);
+
+	static void generateSparseNonSingular(MapSparse<Field>& mat, int approxNNZ, int seed=0);
+
+protected:
+
+	static int randRange(int start, int end);
+
+	MatrixDomain<Field> MD_;
+
+	MapType rowMap_;
+
+	MapType colMap_;
+
+	Index numCols_;
+
+	Index numRows_;
+
+	Index nnz_;
+
+	Element zero_;
+};
+
+}
+
+#include <examples/map-sparse.inl>
+
+#endif // __LINBOX_MAP_SPARSE_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/map-sparse.inl b/examples/map-sparse.inl
new file mode 100644
index 0000000..2500380
--- /dev/null
+++ b/examples/map-sparse.inl
@@ -0,0 +1,594 @@
+/* Copyright (C) 2013 LinBox
+ * Written by AJS <stachnik at udel.edu>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file   examples/map-sparse.inl
+ * @ingroup examples
+ * @brief
+ */
+
+#ifndef __LINBOX_MAP_SPARSE_INL
+#define __LINBOX_MAP_SPARSE_INL
+
+#include <stdlib.h>
+#include <fstream>
+#include <sstream>
+#include <set>
+#include <utility>
+#include <linbox/util/matrix-stream.h>
+
+namespace LinBox
+{
+
+template<class Field_>
+MapSparse<Field_>::MapSparse() : MD_(Field_()),numCols_(0), numRows_(0), nnz_(0) {}
+
+template<class Field_>
+MapSparse<Field_>::MapSparse(const Field& F, Index r, Index c):
+	MD_(F), numCols_(c), numRows_(r), nnz_(0) {F.assign(zero_,F.zero);}
+
+template<class Field_>
+void MapSparse<Field_>::init(const Field& F, Index r, Index c) {
+        MD_=F;
+        F.assign(zero_,F.zero);
+        shape(r,c);
+}
+
+template<class Field_>
+void MapSparse<Field_>::shape(Index r, Index c) {
+        rowMap_.clear();
+        colMap_.clear();
+        numRows_=r;
+        numCols_=c;
+        nnz_=0;
+}
+
+template<class Field_>
+template<class Vector>
+void MapSparse<Field_>::fromVector(const Vector& vec, Index r, Index c) {
+        shape(r,c);
+        if (numCols_==1) {
+                for (Index i=0;i<numRows_;++i) {
+                        setEntry(i,0,vec[i]);
+                }
+        } else {
+                for (Index j=0;j<numCols_;++j) {
+                        setEntry(0,j,vec[j]);
+                }
+        }
+}
+
+template<class Field_>
+MapSparse<Field_>::MapSparse(const MapSparse& M):
+        MD_(M.field()),
+	rowMap_(M.rowMap_), colMap_(M.colMap_),
+        numCols_(M.numCols_), numRows_(M.numRows_),
+        nnz_(M.nnz_), zero_(M.zero_) {}
+
+template<class Field_>
+MapSparse<Field_>& MapSparse<Field_>::operator=(const MapSparse<Field_>& rhs)
+{
+	if (rhs==this) return;
+	MD_.init(rhs.MD_);
+	numCols_=rhs.numCols_;
+	numRows_=rhs.numRows_;
+	rowMap_=rhs.rowMap_;
+	colMap_=rhs.colMap_;
+	nnz_=rhs.nnz_;
+	zero_=rhs.zero_;
+
+	return *this;
+}
+
+template<class Field_>
+MapSparse<Field_>::~MapSparse() {}
+
+template<class Field_>
+const Field_& MapSparse<Field_>::field() const
+{
+	return MD_.field();
+}
+
+template<class Field_>
+bool MapSparse<Field_>::verify()
+{
+	for (int i=0;i<rowdim();++i) {
+		for (int j=0;j<coldim();++j) {
+			Element d=zero_;
+			MapConstIt row=rowMap_.find(i);
+			if (row != rowMap_.end()) {
+				VectorConstIt entry=(row->second).find(j);
+				if (entry != (row->second.end())) {
+					d=entry->second;
+				}
+			}
+			Element e=zero_;
+			MapConstIt col=colMap_.find(j);
+			if (col != colMap_.end()) {
+				VectorConstIt entry=(col->second).find(i);
+				if (entry != (col->second.end())) {
+					e=entry->second;
+				}
+			}
+			if (d!=e) {
+				return false;
+			}
+		}
+	}
+        return true;
+}
+
+template<class Field_>
+void MapSparse<Field_>::setEntry(Index i, Index j, const Element& e)
+{
+	VectorIt it=rowMap_[i].find(j);
+	if (it != rowMap_[i].end()) {
+		--nnz_;
+		rowMap_[i].erase(it);
+		VectorIt colIt=colMap_[j].find(i);
+		colMap_[j].erase(colIt);
+	}
+
+	if (!field().isZero(e)) {
+		++nnz_;
+		rowMap_[i][j]=e;
+		colMap_[j][i]=e;
+	}
+}
+
+template<class Field_> const typename MapSparse<Field_>::Element&
+MapSparse<Field_>::getEntry(Index i, Index j) const
+{
+	MapConstIt row=rowMap_.find(i);
+	if (row != rowMap_.end()) {
+		VectorConstIt entry=(row->second).find(j);
+		if (entry != (row->second.end())) {
+			return (entry->second);
+		}
+	}
+	return zero_;
+}
+
+//forall r: A_{i,r}<-A_{i,r}+k*A_{j,r}
+template<class Field_>
+void MapSparse<Field_>::addRow(const Element& k, Index i, Index j)
+{
+	MapIt rowJ=rowMap_.find(j);
+	if (rowJ != rowMap_.end()) {
+		for (VectorIt it=rowJ->second.begin();it!=rowJ->second.end();++it) {
+			Index col=it->first;
+			Element d=getEntry(i,col);
+			field().axpyin(d,k,it->second);
+			setEntry(i,col,d);
+		}
+	}
+}
+
+//forall r: A_{r,i}<-A_{r,i}+k*A_{r,j}
+template<class Field_>
+void MapSparse<Field_>::addCol(const Element& k, Index i, Index j)
+{
+	MapIt colJ=colMap_.find(j);
+	if (colJ != colMap_.end()) {
+		for (VectorIt it=colJ->second.begin();it!=colJ->second.end();++it) {
+			Index row=it->first;
+			Element d = getEntry(row,i);
+			field().axpyin(d,k,it->second);
+			setEntry(row,i,d);
+		}
+	}
+}
+
+//forall r: A_{i,r}<-k*A_{i,r}
+template<class Field_>
+void MapSparse<Field_>::timesRow(const Element& k, Index i)
+{
+	linbox_check(!(field().isZero(k)));
+
+	MapIt row=rowMap_.find(i);
+	if (row != rowMap_.end()) {
+		for (VectorIt it=row->second.begin();it!=row->second.end();++it) {
+			Index col=it->first;
+			field().mulin(rowMap_[i][col],k);
+			field().mulin(colMap_[col][i],k);
+		}
+	}
+}
+
+//forall r: A_{r,j}<-k*A_{r,j}
+template<class Field_>
+void MapSparse<Field_>::timesCol(const Element& k, Index j)
+{
+	linbox_check(!(field().isZero(k)));
+
+	MapIt col=colMap_.find(j);
+	if (col != colMap_.end()) {
+		for (VectorIt it=col->second.begin();it!=col->second.end();++it) {
+			Index row=it->first;
+			field().mulin(rowMap_[row][j],k);
+			field().mulin(colMap_[j][row],k);
+		}
+	}
+}
+
+template<class Field_>
+void MapSparse<Field_>::swapRows(Index i, Index j)
+{
+	VectorType oldRowI=rowMap_[i];
+	VectorType oldRowJ=rowMap_[j];
+
+	rowMap_[i].clear();
+	rowMap_[j].clear();
+
+	for (VectorIt it=oldRowI.begin();it!=oldRowI.end();++it) {
+		Index col=it->first;
+		colMap_[col].erase(colMap_[col].find(i));
+	}
+
+	for (VectorIt it=oldRowJ.begin();it!=oldRowJ.end();++it) {
+		Index col=it->first;
+		colMap_[col].erase(colMap_[col].find(j));
+	}
+
+	for (VectorIt it=oldRowI.begin();it!=oldRowI.end();++it) {
+		Index col=it->first;
+		rowMap_[j][col]=oldRowI[col];
+		colMap_[col][j]=oldRowI[col];
+	}
+
+	for (VectorIt it=oldRowJ.begin();it!=oldRowJ.end();++it) {
+		Index col=it->first;
+		rowMap_[i][col]=oldRowJ[col];
+		colMap_[col][i]=oldRowJ[col];
+	}
+}
+
+template<class Field_>
+void MapSparse<Field_>::swapCols(Index i, Index j)
+{
+	VectorType oldColI=colMap_[i];
+	VectorType oldColJ=colMap_[j];
+
+	colMap_[i].clear();
+	colMap_[j].clear();
+
+	for (VectorIt it=oldColI.begin();it!=oldColI.end();++it) {
+		Index row=it->first;
+		rowMap_[row].erase(rowMap_[row].find(i));
+	}
+
+	for (VectorIt it=oldColJ.begin();it!=oldColJ.end();++it) {
+		Index row=it->first;
+		rowMap_[row].erase(rowMap_[row].find(j));
+	}
+
+	for (VectorIt it=oldColI.begin();it!=oldColI.end();++it) {
+		Index row=it->first;
+		colMap_[j][row]=oldColI[row];
+		rowMap_[row][j]=oldColI[row];
+	}
+
+	for (VectorIt it=oldColJ.begin();it!=oldColJ.end();++it) {
+		Index row=it->first;
+		colMap_[i][row]=oldColJ[row];
+		rowMap_[row][i]=oldColJ[row];
+	}
+}
+
+template<class Field_>
+typename MapSparse<Field_>::Index MapSparse<Field_>::nnz() const
+{
+	return nnz_;
+}
+
+// A -> A' = SAS^{-1}, and A' has about nnz nonzero entries.
+template<class Field_>
+void MapSparse<Field_>::randomSim(Index nz, int seed)
+{	typename Field::Element a;
+	Index i,j;
+	MersenneTwister ri;
+	typename Field::RandIter r(field(),0, seed);
+	//if (seed != 0) { ri.setSeed(seed); r.setSeed(seed); }
+	if (seed != 0)
+	{	ri.setSeed(seed);
+		// ridiculous constructor only seeding!
+		typename Field::RandIter s(field(), 0, seed);
+		r = s;
+	}
+	while (nnz() < nz)
+	{	field().nonzerorandom(r,a);
+		i = ri.randomIntRange(0, rowdim()); j = ri.randomIntRange(0, coldim());
+		addCol(a, i, j);
+		//std::cout << nnz() << std::endl;
+		field().negin(a);
+		addRow(a, i, j);
+	}
+}
+
+// A -> A' = UAV, with U and V nonsingular, and A' has about nnz nonzero entries.
+template<class Field_>
+void MapSparse<Field_>::randomEquiv(Index nz, int seed)
+{	typename Field::Element a;
+	Index i,j;
+	MersenneTwister ri;
+	typename Field::RandIter r(field(),0,seed);
+	if (seed != 0)
+	{	ri.setSeed(seed);
+		// ridiculous seeding!
+		typename Field::RandIter s(field(), 0, seed);
+		r = s;
+	}
+	bool flip = true;
+	int count=0;
+	while (nnz() < nz)
+	{	r.nonzerorandom(a);
+		i = ri.randomIntRange(0, rowdim()); j = ri.randomIntRange(0, coldim());
+		if (i!=j){
+			if (flip) addCol(a, i, j);
+			else addRow(a, i, j);
+			flip = not flip;
+		}
+		++count;
+	}
+}
+
+template<class Field_>
+std::ostream& MapSparse<Field_>::print(std::ostream& out) const
+{
+	for (Index i=0;i<numRows_;++i) {
+		for (Index j=0;j<numCols_;++j) {
+			field().write(out,getEntry(i,j));
+			if (j != (numCols_-1)) {
+				out << " ";
+			}
+		}
+		out << std::endl;
+	}
+        return out;
+}
+
+template<class Field_>
+std::ostream& MapSparse<Field_>::write(std::ostream& out) const
+{
+	out << "%%MatrixMarket matrix coordinate integer general" << std::endl;
+	out << "% written from a LinBox MapSparse" << std::endl;
+        out << numRows_ << " " << numCols_ << " " << nnz_ << std::endl;
+        //for (Index i = 0; i < numRows_; ++i)
+        for (MapConstIt p = rowMap_.begin(); p != rowMap_.end(); ++p)
+                for (VectorConstIt rp = p->second.begin(); rp != p->second.end(); ++rp)
+                        field().write(out << 1+p->first << " " << 1+rp->first << " ", rp->second) << std::endl;
+        out << std::endl;
+        return out;
+}
+
+template<class Field_>
+std::istream& MapSparse<Field_>::read(std::istream& in) {
+        Index r,c;
+        Element d;
+        field().init(d);
+        MatrixStream<Field> ms(field(),in);
+        ms.getDimensions(r,c);
+        shape(r,c);
+        while (ms.nextTriple(r,c,d)) setEntry(r,c,d);
+        return in;
+}
+
+template<class Field_>
+typename MapSparse<Field_>::Index MapSparse<Field_>::rowdim() const
+{
+        return numRows_;
+}
+
+template<class Field_>
+typename MapSparse<Field_>::Index MapSparse<Field_>::coldim() const
+{
+        return numCols_;
+}
+
+template<class Field_>
+void MapSparse<Field_>::transpose()
+{
+        rowMap_.swap(colMap_);
+        int temp=numCols_;numCols_=numRows_;numRows_=temp;
+}
+
+template<class Field_>
+template<class Matrix>
+void MapSparse<Field_>::copy(Matrix& mat) const
+{
+        std::stringstream ss;
+        write(ss);
+        mat.read(ss);
+        mat.finalize();
+}
+
+template<class Field_>
+template<class Matrix>
+void MapSparse<Field_>::copyFrom(Matrix& mat)
+{
+        std::stringstream ss;
+        mat.write(ss);
+        read(ss);
+}
+
+template<class Field_>
+template<class Vector>
+void MapSparse<Field_>::toVector(Vector& vec) const
+{
+        if (numCols_ == 1) {
+                for (Index i=0;i<numRows_;++i) {
+                        vec[i]=getEntry(i,0);
+                }
+        } else {
+                for (Index j=0;j<numCols_;++j) {
+                        vec[j]=getEntry(0,j);
+                }
+        }
+}
+
+template<class Field_>
+void MapSparse<Field_>::scaleMat(const Element& k)
+{
+        for (size_t i=0;i<numRows_;++i) {
+                timesRow(k,i);
+        }
+}
+
+template<class Field_>
+bool MapSparse<Field_>::areEqual(MapSparse<Field_> rhs) const
+{
+        if (rhs.numCols_ != numCols_) {
+                return false;
+        }
+        if (rhs.numRows_ != numRows_) {
+                return false;
+        }
+        if (nnz_ != rhs.nnz_) {
+                return false;
+        }
+
+        for (MapConstIt rowIt=rowMap_.begin();rowIt!=rowMap_.end();++rowIt) {
+                for (VectorConstIt eltIt=rowIt->second.begin();eltIt!=rowIt->second.end();++eltIt) {
+                        if (eltIt->second != rhs.getEntry(rowIt->first,eltIt->first)) {
+                                return false;
+                        }
+                }
+        }
+        return true;
+}
+
+template<class Field>
+void MapSparse<Field>::generateDenseRandMat(MapSparse<Field>& mat, int q)
+{
+        typedef typename Field::Element Element;
+
+        size_t m=mat.rowdim(),n=mat.coldim();
+	Element d;
+
+        for (size_t i=0;i<m;++i) {
+                for (size_t j=0;j<n;++j) {
+                        mat.field().init(d,randRange(0,q));
+                        mat.setEntry(i,j,d);
+                }
+        }
+}
+
+template<class Field>
+void MapSparse<Field>::generateRandMat(MapSparse<Field>& mat, int nnz, int q)
+{
+        typedef typename Field::Element Element;
+
+        size_t m=mat.rowdim(),n=mat.coldim();
+	Element d;
+
+        typedef std::pair<size_t,size_t> CoordPair;
+        typedef std::set<CoordPair> PairSet;
+        PairSet pairs;
+
+	for(int i = 0; i < (int)nnz; ++i) {
+                size_t row,col;
+                do {
+                        row = randRange(0,(int)m);
+                        col = randRange(0,(int)n);
+                } while (pairs.count(CoordPair(row,col))!=0);
+
+                mat.field().init(d, randRange(1,q));
+                mat.setEntry(row,col,d);
+                pairs.insert(CoordPair(row,col));
+        }
+}
+
+template<class Field>
+void MapSparse<Field>::generateScaledIdent(MapSparse<Field>& mat, int alpha)
+{
+        typedef typename Field::Element Element;
+        size_t m=mat.rowdim(),n=mat.coldim();
+        size_t minDim=(m<n)?m:n;
+	Element d;
+        mat.field().init(d,alpha);
+
+        for (size_t i=0;i<minDim;++i) {
+                mat.setEntry(i,i,d);
+        }
+}
+
+template<class Field>
+void MapSparse<Field>::generateSparseNonSingular(MapSparse<Field>& mat, int approxNNZ, int seed)
+{
+        typedef typename Field::Element Element;
+        int n=mat.rowdim();
+        linbox_check(mat.rowdim()==mat.coldim());
+
+        typename Field::RandIter r(mat.field(),0,seed);
+
+	Element d;
+
+        for (int i=0;i<n;++i) {
+                r.nonzerorandom(d);
+                mat.setEntry(i,i,d);
+        }
+
+        mat.randomEquiv(approxNNZ,seed);
+}
+
+template<class Field>
+void MapSparse<Field>::generateCompanion(MapSparse<Field>& mat,std::vector<typename Field::Element>& coeffs)
+{
+        typedef typename Field::Element Element;
+        int n=mat.rowdim();
+        linbox_check(mat.rowdim()==mat.coldim());
+
+        typename Field::RandIter r(mat.field());
+
+	Element d;
+	mat.field().init(d,1);
+        for (int i=1;i<n;++i) {
+                mat.setEntry(i,i-1,d);
+        }
+	for (int i=0;i<n;++i) {
+		mat.setEntry(i,n-1,coeffs[i]);
+	}
+}
+
+template<class Field>
+int MapSparse<Field>::randRange(int start, int end)
+{
+        double rval = rand();
+        static const double NORMALIZING_CONSTANT = 1.0/(1.0+RAND_MAX);
+        double normedRVal = rval*NORMALIZING_CONSTANT;
+        double rangeSize = end-start;
+        int offset = (int)(rangeSize*normedRVal);
+        return start+offset;
+}
+
+}
+
+#endif // __LINBOX_MAP_SPARSE_INL
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/minpoly.C b/examples/minpoly.C
index 8505948..7893e1b 100644
--- a/examples/minpoly.C
+++ b/examples/minpoly.C
@@ -27,21 +27,23 @@
   \brief Minimal polynomial of a sparse matrix.
   \ingroup examples
   */
+#include <linbox/linbox-config.h>
 #include <iostream>
+//! @bug this should be elsewhere
 template <class Field, class Polynomial>
 void printPolynomial (const Field &F, const Polynomial &v)
 {
 	for (int i = (int)v.size () ; i-- ; ) {
-		F.write (std::cout, v[i]);
+		F.write (std::cout, v[(size_t)i]);
 		if (i > 0)
 			std::cout << " x^" << i << " + ";
 	}
 	std::cout << std::endl;
 }
 
-#include "linbox/field/modular.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/solutions/minpoly.h"
+#include <linbox/ring/modular.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/solutions/minpoly.h>
 
 using namespace LinBox;
 using namespace std;
@@ -75,14 +77,21 @@ int main (int argc, char **argv)
 		M.communicatorp(&C);
 #endif
 
-		PID_integer ZZ;
-		SparseMatrix<PID_integer> A (ZZ);
+		Givaro::ZRing<Integer> ZZ;
+		SparseMatrix<Givaro::ZRing<Integer>> A (ZZ);
 		A.read (input);
+		/*
+		typedef SparseMatrix<Givaro::ZRing<Integer>> SpMat;
+		SpMat B (ZZ);
+		B.read (input);
+		Transpose<SpMat> BT(B);
+		Compose<SpMat, Transpose<SpMat> > A(B,BT);
+		*/
 
 		if(process == 0)
 			cout << "A is " << A.rowdim() << " by " << A.coldim() << endl;
 
-		vector<PID_integer::Element> m_A;
+		DenseVector<Givaro::ZRing<Integer> > m_A(ZZ);
 		minpoly (m_A, A, M);
 
 		if(process == 0){
@@ -99,14 +108,14 @@ int main (int argc, char **argv)
 
 	}
 	else{
-		typedef Modular<double> Field;
+		typedef Givaro::Modular<double> Field;
 		double q = atof(argv[2]);
 		Field F(q);
 		SparseMatrix<Field> B (F);
 		B.read (input);
 		cout << "B is " << B.rowdim() << " by " << B.coldim() << endl;
 
-		vector<Field::Element> m_B;
+		DenseVector<Field> m_B(F);
 		minpoly (m_B, B);
 
 		cout << "Minimal Polynomial is ";
@@ -121,11 +130,10 @@ int main (int argc, char **argv)
 	return 0;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/mpidet.C b/examples/mpidet.C
new file mode 100644
index 0000000..27a4bbf
--- /dev/null
+++ b/examples/mpidet.C
@@ -0,0 +1,101 @@
+
+/*
+ * examples/mpidet.C
+ *
+ * Copyright (C) 2006, 2010 B Youse, D Saunders
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/**\file examples/mpidet.C
+ * @example examples/mpidet.C
+  \brief Determinant of sparse matrix over Z or Zp.
+  \ingroup examples
+  */
+
+#include <iostream>
+#include <string>
+
+#include <linbox/ring/modular.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/solutions/det.h>
+#include <linbox/util/matrix-stream.h>
+
+using namespace LinBox;
+using namespace std;
+
+int main (int argc, char **argv)
+{
+#ifdef __LINBOX_HAVE_MPI
+	if (argc < 2) {
+		cerr << "Usage: det <matrix-file-in-supported-format>" << endl;
+		return -1;
+	}
+	//  ex:  ./det [matrix-file]
+	else{
+		// For a small integer matrix test, do "make mpidet2 -f makefile.mpi"
+
+		//  set up parallel code object
+		Communicator *Cptr = NULL;
+		Cptr = new Communicator(&argc, &argv);
+
+		typedef Givaro::ZRing<Integer> Integers;
+		Integers ZZ;
+
+		ifstream input (argv[1]);
+		if (!input)
+		{ cerr << "Error opening matrix file " << argv[1] << endl;
+			return -1;
+		}
+
+		SparseMatrix<Integers>A(ZZ);
+		A.read(input);
+		if(!Cptr->rank()){
+			cout << "A is " << A.rowdim() << " by " << A.coldim() << endl;
+			cout << "Beginning parallel computation with " << Cptr->size()
+			<< " processes." << endl;
+		}
+
+		Integers::Element det_A;
+
+		//  call parallel det with cra
+		cra_det(det_A, A, RingCategories::IntegerTag(), Method::Hybrid(*Cptr), Cptr);
+
+		//  if parent process, report the determinant
+		if(!Cptr->rank()){
+			cout << "Determinant is ";
+			ZZ.write(cout, det_A) << endl;
+		}
+		//  tie up parallel loose ends if necessary
+		MPI_Finalize();
+	}
+	return 0;
+#else
+	cerr << "Compile with -D__LINBOX_HAVE_MPI" << endl;
+	return -1 ;
+#endif
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/nullspacebasis.C b/examples/nullspacebasis.C
new file mode 100644
index 0000000..1b99753
--- /dev/null
+++ b/examples/nullspacebasis.C
@@ -0,0 +1,68 @@
+/*
+ * examples/nullspacebasis.C
+ *
+ * Copyright (C) 2014 J-G. Dumas
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/**\file examples/nullspacebasis.C
+ * @example  examples/nullspacebasis.C
+  \brief NullSpace of sparse matrix over GFq.
+  \brief nullspace is allocated m \times n.
+  \ingroup examples
+  */
+
+#include <iostream>
+#include "linbox/matrix/dense-matrix.h"
+#include <givaro/gfq.h>
+#include "linbox/algorithms/gauss.h"
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+
+	if ( argc <  2 || argc > 4) {
+		std::cerr << "Usage to get a random null space basis over GF(p,k):  <matrix-file-in-SMS-format> p [k]" << std::endl;
+		return -1;
+	}
+
+	std::ifstream input (argv[1]);
+	if (!input) { std::cerr << "Error opening matrix file " << argv[1] << std::endl; return -1; }
+
+	//typedef Givaro::Modular<int> Field;
+	typedef Givaro::GFqDom<int64_t> Field;
+	Field F(atoi(argv[2]),argc>3?atoi(argv[3]):1);
+	SparseMatrix<Field, SparseMatrixFormat::SparseSeq > B (F);
+	B.read (input);
+	std::cout << "B is " << B.rowdim() << " by " << B.coldim() << std::endl;
+
+    DenseMatrix<Field> NullSpace(F,B.coldim(),B.coldim());
+    GaussDomain<Field> GD(F);
+    
+    GD.nullspacebasisin(NullSpace, B);
+    
+    NullSpace.write( std::cerr << "X:=", Tag::FileFormat::Maple ) << ';' << std::endl;
+
+    std::cerr << "NullsSpace dimensions:" << NullSpace.rowdim() << 'x' << NullSpace.coldim() << std::endl;
+    
+    return 0;
+    
+
+}
diff --git a/examples/nullspacebasis_rank.C b/examples/nullspacebasis_rank.C
new file mode 100644
index 0000000..e78c1dd
--- /dev/null
+++ b/examples/nullspacebasis_rank.C
@@ -0,0 +1,91 @@
+/*
+ * examples/nullspacebasis_rank.C
+ *
+ * Copyright (C) 2014 J-G. Dumas
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/**\file examples/nullspacebasis_rank.C
+ * @example  examples/nullspacebasis_rank.C
+  \brief NullSpace of sparse matrix over GFq.
+  \brief nullspace is allocated rank \times n.
+  \ingroup examples
+  */
+
+#include <givaro/gfq.h>
+#include <iostream>
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/algorithms/gauss.h"
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+  if ( argc <  2 || argc > 4) {
+    std::cerr << "Usage to get a random null space basis over GF(p,k):  <matrix-file-in-SMS-format> p [k]" << std::endl;
+    return -1;
+  }
+
+  std::ifstream input (argv[1]);
+  if (!input) {
+    std::cerr << "Error opening matrix file " << argv[1] << std::endl;
+    return -1;
+  }
+  int pVal = atoi(argv[2]);
+
+
+  //typedef Givaro::Modular<int> Field;
+  typedef Givaro::GFqDom<int64_t> Field;
+  Field F(pVal, argc>3?atoi(argv[3]):1);
+  SparseMatrix<Field, SparseMatrixFormat::SparseSeq > A (F);
+  A.read (input);
+  std::cout << "A is " << A.rowdim() << " by " << A.coldim() << std::endl;
+
+  GaussDomain<Field> GD(F);
+  
+  typename Field::Element Det;
+  unsigned long Rank;
+  size_t Ni(A.rowdim()),Nj(A.coldim());
+
+  Permutation<Field> P((int)Nj,F);
+
+  GD.InPlaceLinearPivoting(Rank, Det, A, P, Ni, Nj );
+
+  for(size_t i=0; i< Ni; ++i) {
+    if (A[i].size() == 0) {
+      size_t j(i);
+      if (nextnonzero(j,Ni,A)) {
+	A[i] = A[j];
+	A[j].resize(0);
+      }
+      else {
+	break;
+      }
+    }
+  }
+  size_t nullity = A.coldim()-Rank;
+  DenseMatrix<Field> NullSpace(F,A.coldim(),nullity);
+  GD.nullspacebasis(NullSpace, Rank, A, P);
+
+  NullSpace.write( std::cerr << "X:=", Tag::FileFormat::Maple ) << ';' << std::endl;
+    
+  std::cerr << "NullsSpace dimensions:" << NullSpace.rowdim() << 'x' << NullSpace.coldim() << std::endl;
+    
+  return 0;
+}
diff --git a/examples/omp_block_rank.C b/examples/omp_block_rank.C
new file mode 100644
index 0000000..9c3939d
--- /dev/null
+++ b/examples/omp_block_rank.C
@@ -0,0 +1,574 @@
+/*
+ * examples/omp_block_rank.C
+ *
+ * Copyright (C) 2010 J-G Dumas
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+
+ * This file is part of LinBox.
+ *
+ *   LinBox is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU Lesser General Public License as
+ *   published by the Free Software Foundation, either version 2 of
+ *   the License, or (at your option) any later version.
+ *
+ *   LinBox 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 Lesser General Public License for more details.
+ *
+ *   You should have received a copy of the GNU Lesser General Public
+ *   License along with LinBox.  If not, see
+ *   <http://www.gnu.org/licenses/>.
+ */
+
+/*! @file examples/omp_block_rank.C
+ * @example  examples/omp_block_rank.C
+ * @ingroup examples
+ * @brief Block Wiedemann Rank with OpenMP
+ */
+
+#include <linbox/linbox-config.h>
+
+
+#include <iostream>
+#include <fstream>
+#include <omp.h>
+
+#define __GIVARO_USE_OPENMP
+
+#include <givaro/givtimer.h>
+#include <givaro/givpoly1crt.h>
+#include <linbox/integer.h>
+
+
+#ifndef __LINBOX_USE_OPENMP
+#error "you have to compile this example with openmp enabled"
+#endif
+
+
+// **********************************************************
+// Variable globale pour fixer le g�n�rateurs des FFT primes
+struct FFTSeeder {
+	unsigned long seed;
+	FFTSeeder(unsigned long s=0) : seed(s) {}
+	void setseed(unsigned long s=0) { seed=s; }
+	unsigned long operator()() const { return this->seed; }
+};
+FFTSeeder  FFTgenerator;
+#define FFT_PRIME_SEED FFTgenerator()
+// **********************************************************
+
+
+#include <linbox/field/givaro.h>
+#define LINBOX_EXTENSION_DEGREE_MAX 20
+#include <linbox/field/givaro.h>
+#include <linbox/ring/modular.h>
+#include <linbox/blackbox/zero-one.h>
+#include <linbox/blackbox/diagonal.h>
+#include <linbox/solutions/rank.h>
+#include <linbox/solutions/trace.h>
+#include <linbox/util/matrix-stream.h>
+#include <linbox/algorithms/sigma-basis.h>
+#include <linbox/algorithms/block-massey-domain.h>
+
+template<class Field>
+void extractLeftSigma(const Field &F,
+		      std::vector<LinBox::DenseMatrix<Field> >        &S,
+		      std::vector<LinBox::DenseMatrix<Field> >&SigmaBase,
+		      std::vector<size_t>                       &defect,
+		      size_t                                      block)
+{
+
+	typedef typename Field::Element Element;
+	LinBox::DenseMatrixDomain<Field> _BMD(F);
+	// take the block rows which have lowest defect
+	// compute permutation such that first block rows have lowest defect
+	std::vector<size_t> Perm(2*block);
+	for (size_t i=0;i<2*block;++i)
+		Perm[i]=i;
+	for (size_t i=0;i<2*block;++i) {
+		size_t idx_min=i;
+		for (size_t j=i+1;j<2*block;++j)
+			if (defect[j]< defect[idx_min])
+				idx_min=j;
+		std::swap(defect[i],defect[idx_min]);
+		Perm[i]=idx_min;
+	}
+	LinBox::BlasPermutation<size_t>  BPerm(Perm);
+
+	// Apply BPerm to the Sigma Base
+	for (size_t i=0;i<SigmaBase.size();++i)
+		_BMD.mulin_right(BPerm,SigmaBase[i]);
+
+	size_t max=defect[0];
+	for (size_t i=0;i<block;++i)
+		if (defect[i] > max)
+			max=defect[i];
+
+	// prepare S to receive the sigma base
+	const LinBox::DenseMatrix<Field> Zero(F,block,block);
+	S.resize(max+1, Zero);
+
+	// extract the sigma base
+	//for (size_t k=0;k<S.size();++k){
+	//	for(size_t i=0;i<block;++i)
+	//		for (size_t j=0;j<block;++j)
+	//			S[k].setEntry(i,j, SigmaBase[k].getEntry(i,j));
+	//}
+
+	// extract the reverse sigma base
+	for(size_t i=0;i<block;++i)
+		for (size_t j=0;j<=defect[i];++j){
+			for (size_t k=0;k<block;++k)
+				S[defect[i]-j].setEntry(i,k, SigmaBase[j].getEntry(i,k));
+
+		}
+
+
+}
+
+template<class Field>
+void write_sigma(const Field &F, const char* name, const std::vector<LinBox::DenseMatrix<Field> > & P)
+{
+	size_t m,n;
+	m = P[0].rowdim();
+	n = P[0].coldim();
+	std::cerr<<name<<":=[";
+	for (size_t k=0;k<P.size()-1;++k){
+		std::cerr<<"Matrix([";
+		for (size_t i=0;i<m-1;++i){
+			std::cerr<<"[";
+			for (size_t j=0;j<n-1;++j)
+				F.write(std::cerr,P[k].getEntry(i,j))<<",";
+			F.write(std::cerr, P[k].getEntry(i,n-1))<<"] , ";
+		}
+		std::cerr<<"[";
+		for (size_t j=0;j<n-1;++j)
+			F.write(std::cerr,P[k].getEntry(m-1,j))<<",";
+		F.write(std::cerr, P[k].getEntry(m-1,n-1))<<"]]) , ";
+	}
+
+	std::cerr<<"Matrix([";
+	for (size_t i=0;i<m-1;++i){
+		std::cerr<<"[";
+		for (size_t j=0;j<n-1;++j)
+			F.write(std::cerr,P[P.size()-1].getEntry(i,j))<<",";
+		F.write(std::cerr, P[P.size()-1].getEntry(i,n-1))<<"] , ";
+	}
+	std::cerr<<"[";
+	for (size_t j=0;j<n-1;++j)
+		F.write(std::cerr,P[P.size()-1].getEntry(m-1,j))<<",";
+	F.write(std::cerr, P[P.size()-1].getEntry(m-1,n-1))<<"]])]; \n";
+}
+
+
+template<class Container, class Field>
+void scalarmulin(Container& C, const Field& F, const typename Field::Element& x)
+{
+	for(typename Container::Iterator it=C.Begin();it!=C.End();++it)
+		F.mulin(*it, x);
+}
+
+template<class Container1, class Field, class Container2>
+void contaddin(Container1& C, const Field& F, const Container2& V)
+{
+	typename Container1::Iterator cit=C.Begin();
+	typename Container2::ConstIterator vit=V.Begin();
+	for( ; cit!=C.End(); ++cit, ++vit)
+		F.addin(*cit, *vit);
+}
+
+template<class Field, class Array, class Matrix>
+void EvalPolyMat(Array& EvalDets, const Field& F, const LinBox::DenseMatrixDomain<Field>& D, const std::vector<Matrix>& matminpol, const Array& Points)
+{
+	const long nump = Points.size();
+	std::cerr << "num procs: " << omp_get_num_procs() << std::endl;
+	std::cerr << "max threads: " << omp_get_max_threads() << std::endl;
+	std::cerr << "eval points: " << nump << std::endl;
+#pragma omp parallel for schedule(static)
+	for(int i=0; i<nump; ++i) {
+		const long degree = matminpol.size()-1;
+		Matrix mat=matminpol[degree];
+		for(int j=(int)degree-1;j>=0;--j) {
+			scalarmulin(mat, F, Points[i]);
+			contaddin(mat, F, matminpol[j]);
+		}
+		EvalDets[i] = D.det(mat);
+	}
+
+	//     for(int i=0; i<nump; ++i) {
+	//         std::cerr << Points[i] << "\t: " << EvalDets[i] << std::endl;
+	//     }
+}
+
+#include <linbox/algorithms/whisart_trace.h>
+
+
+using namespace Givaro;
+
+
+template<class Field>
+int OMP_BLOCK_RANK_main (const Field& F, int argc, char **argv)
+{
+	LinBox::commentator().setMaxDetailLevel (-1);
+	LinBox::commentator().setMaxDepth (-1);
+	LinBox::commentator().setReportStream (std::cerr);
+
+	OMPTimer chrono1,chrono2,chrono3,chrono4; chrono1.clear(); chrono2.clear(); chrono3.clear(); chrono4.clear();
+
+	Integer c; F.cardinality(c);
+	unsigned long seed = (argc>4?atoi(argv[4]):0);
+	FFTgenerator.setseed(seed);
+
+	typename Field::RandIter generator (F,c,seed);
+	LinBox::VectorDomain<Field> VD(F);
+
+	std::ifstream input (argv[1]);
+	LinBox::MatrixStream<Field> ms( F, input );
+	typedef LinBox::SparseMatrix<Field, LinBox::SparseMatrixFormat::SparseSeq > Blackbox;
+	typedef LinBox::DenseMatrix<Field> Block_t;
+
+	Blackbox B (ms);
+
+	std::cerr << "B is " << B.rowdim() << " by " << B.coldim() << std::endl;
+	long M = B.rowdim() ;
+	long N = B.coldim();
+	long R = (M<N?M:N);
+	long S = (M>N?M:N);
+
+	int nb = (argc>3 ? atoi(argv[3]) : omp_get_max_threads() );
+	std::cerr << "block size: " << nb << std::endl;
+
+	chrono1.start();
+	std::vector< std::vector< typename Field::Element > > LV(nb);
+	for (typename std::vector< std::vector< typename Field::Element > >::iterator it = LV.begin(); it != LV.end(); ++it) {
+		it->resize(R);
+		for(typename std::vector<typename Field::Element>::iterator vit=it->begin(); vit != it->end(); ++vit)
+			generator.random( *vit );
+		// 		VD.write(output, *it) << std::endl;
+	}
+
+	Block_t LM(F, nb, R);
+	for (size_t i=0; i < LM.rowdim(); ++i) {
+		for (size_t j=0; j < LM.coldim(); ++j) {
+			LM.setEntry(i,j, LV[i][j]);
+		}
+	}
+
+	chrono1.stop();
+
+	std::cerr << "Generated " << nb << ' ' << R << "-vectors" << std::endl;
+	std::cerr << chrono1 << std::endl;
+
+	chrono2.start();
+
+	typedef LinBox::DenseMatrix<Field>        Matrix;
+	typedef std::vector<Matrix>   Polynomial;
+
+
+	const Matrix SigmaZero(F, 2*nb,2*nb);
+	const Matrix SerieZero(F, 2*nb,nb);
+
+	long d = 4+(R<<1)/nb;
+
+	// define the serie and the sigmabase
+	Polynomial Serie(d, SerieZero);
+	Polynomial Sigma(d, SigmaZero);
+
+
+	LinBox::DenseVector<Field> d1(F,S);
+	for (int i = 0; i < S; i++)
+		do generator.random (d1[i]); while (F.isZero (d1[i]));
+	LinBox::Diagonal<Field> D1 (d1);
+	LinBox::DenseVector<Field> d2(F,R);
+	for (int i = 0; i < R; i++)
+		do generator.random (d2[i]); while (F.isZero (d2[i]));
+	LinBox::Diagonal<Field> D2 (d2);
+
+	std::cerr << "num procs: " << omp_get_num_procs() << std::endl;
+	std::cerr << "max threads: " << omp_get_max_threads() << std::endl;
+
+	if (M>N) {
+#pragma omp parallel for firstprivate(B) schedule(static)
+		for(int j=0; j<nb; ++j) {
+			std::vector< typename Field::Element > v(S),u(S),w(R);
+			std::vector< typename Field::Element > colonne(nb);
+
+			LM.apply(colonne, LV[j]);
+			for(int i=0;i<nb;++i)
+				Serie[0].setEntry(i,j,colonne[i]);
+
+			for(int k=1;k<d;++k) {
+				// BlackBox Apply
+				D2.apply(w,LV[j]);
+				B.apply(v,w);
+				D1.apply(u,v);
+				B.applyTranspose(w,u);
+				D2.apply(LV[j],w);
+
+				// Dot products
+				LM.apply(colonne, LV[j]);
+				for(int i=0;i<nb;++i)
+					Serie[k].setEntry(i,j,colonne[i]);
+			}
+			std::cerr << "Thread[" << omp_get_thread_num() << "]: Done BTB-Serie[k][" << j << ']' << std::endl;
+		}
+	}
+	else {
+#pragma omp parallel for firstprivate(B) schedule(static)
+		for(int j=0; j<nb; ++j) {
+			std::vector< typename Field::Element > v(S),u(S),w(R);
+			std::vector< typename Field::Element > colonne(nb);
+
+			LM.apply(colonne, LV[j]);
+			for(int i=0;i<nb;++i)
+				Serie[0].setEntry(i,j,colonne[i]);
+
+			for(int k=1;k<d;++k) {
+				// BlackBox Apply
+				D2.apply(w,LV[j]);
+				B.applyTranspose(v,w);
+				D1.apply(u,v);
+				B.apply(w,u);
+				D2.apply(LV[j],w);
+
+				// Dot products
+				LM.apply(colonne, LV[j]);
+				for(int i=0;i<nb;++i)
+					Serie[k].setEntry(i,j,colonne[i]);
+
+			}
+			std::cerr << "Thread[" << omp_get_thread_num() << "]: Done BBT-Serie[k][" << j << ']' << std::endl;
+
+		}
+	}
+
+	chrono2.stop();
+	std::cerr << "Computed a degree " << d << ' ' << nb << 'x' << nb << "-series" << std::endl;
+	std::cerr << chrono2 << std::endl;
+	// write_sigma(F, "serie", Serie);
+
+	chrono3.start();
+	// append Identity to the serie
+	for (int i=0;i<nb;++i)
+		F.assign(Serie[0].refEntry(nb+i,i), F.one);
+
+	// define defect
+	std::vector<size_t> defect(2*nb,0);
+	for (int i=nb;i<2*nb;++i){
+		defect[i]=1;
+	}
+
+
+	LinBox::SigmaBasis<Field> SB(F, Serie);
+	std::cerr<<"blockminpoly computation... ";
+	SB.PM_Basis(Sigma, Serie, d-1, defect);
+	std::cerr<<"done\n";
+	// write_sigma(F, "serie", Serie);
+	// write_sigma(F, "sigma", Sigma);
+
+	std::cerr<<"extracting bminpoly... ";
+	std::vector<Matrix> LS2;
+	extractLeftSigma(F, LS2, Sigma, defect, nb);
+	std::cerr<<"done with size: " << LS2.size() << std::endl;
+	std::cerr<<"Rank of the highest degree coefficient...";
+	unsigned long rdeg;
+	LinBox::DenseMatrixDomain<Field> D(F);
+	rdeg = D.rank(LS2[LS2.size()-1]);
+	typename Field::Element d0,de;
+	d0 = D.det(LS2[0]);
+	de = D.det(LS2[LS2.size()-2]);
+
+	if( ! ( F.isZero(d0) || F.isZero(de) ) )
+	{
+		int rank = (int) ((LS2.size()-2)*(LS2[0].rowdim())+rdeg);
+
+		chrono3.stop();
+		std::cerr<<"is " << rdeg << ", done.\n";
+		std::cerr << "Estimated rank: " << rank << std::endl;
+	}
+	else {
+		chrono3.stop();
+		std::cerr<<  "\n*** WARNING *** Insufficient information, interpolation required. You might also try again with a larger field.\n";
+		F.write(std::cerr<<  "det(bm[0]): ", d0) << std::endl;
+		std::cerr<<  "rk(bm[0]): " << D.rank(LS2[0])<< std::endl;
+		F.write(std::cerr<<  "det(bm[" << (LS2.size()-2) << "]): ", de) << std::endl;
+		std::cerr<<  "rk(bm[" << (LS2.size()-2) << "]): "<< D.rank(LS2[LS2.size()-2]) << std::endl;
+		std::cerr<<  "rk(bm[" << (LS2.size()-1) << "]): "<< rdeg << std::endl;
+		long def=0;
+		if (F.isZero(d0)) ++def;
+		if (F.isZero(de)) ++def;
+		int rank =  (int) ((LS2.size()-2-def)*(LS2[0].rowdim())+rdeg);
+		std::cerr<< "*** VERY ROUGH *** rank approximation  " << rank << std::endl;
+	}
+	std::cerr << "recursive PMBasis CPU time (s)  : " << chrono3.usertime() << std::endl<<std::endl;
+	std::cerr << chrono3 << std::endl;
+
+	chrono4.start();
+
+
+	std::cerr<<"Interpolation of matrix minpoly determinant ...";
+
+	// write_sigma(F, "bminpoly", LS2);
+
+	typedef Poly1CRT< LinBox::Field>   PolyCRT;
+	typedef typename PolyCRT::array_T VScal;
+
+	VScal EvalPoints( LS2.size()*nb );
+	for(typename VScal::iterator itp = EvalPoints.begin(); itp != EvalPoints.end(); ++itp) {
+		do {
+			do generator.random (*itp); while (F.isZero (*itp));
+		} while ( (std::find(EvalPoints.begin(), itp, *itp) != itp)) ;
+	}
+
+	VScal EvalDets( EvalPoints.size() );
+	EvalPolyMat(EvalDets, F, D, LS2, EvalPoints);
+
+
+	PolyCRT Interpolator(F, EvalPoints, "Y");
+	typename PolyCRT::Element Determinant;
+
+	Interpolator.RnsToRing(Determinant, EvalDets);
+	chrono4.stop();
+
+	std::cerr << "done\n";
+
+
+	//     Interpolator.write(std::cerr << "Determinant of MinPoly: ", Determinant) << std::endl;
+
+	Degree deg; Interpolator.getpolydom().degree(deg, Determinant);
+	Degree val; Interpolator.getpolydom().val(val, Determinant);
+
+
+	F.write(std::cerr, Determinant[0]) << " + ";
+	if (val > 0) F.write(std::cerr<< "... + ", Determinant[val.value()]) << "Y^" << val << " + ";
+	std::cerr << "... + ";
+	if (Determinant.size() >= 2) {
+		F.write(std::cerr, Determinant[Determinant.size()-2]) << "Y^" << (deg-1) << " + ";
+	}
+	F.write(std::cerr, Determinant[Determinant.size()-1]) << "Y^" << deg << std::endl;
+
+
+	typename Field::Element t, p2; F.assign(p2, F.zero);
+	if (Determinant.size() >= 2) {
+		F.neg(p2, Determinant[ Determinant.size()-2]);
+		F.divin(p2, Determinant[ Determinant.size()-1]);
+	}
+
+	if (M>N) {
+		typedef LinBox::Transpose<Blackbox> AT_BB;
+		typedef LinBox::Compose< LinBox::Diagonal<Field>, AT_BB > DAT_BB ;
+		typedef LinBox::Compose< DAT_BB, LinBox::Diagonal<Field> > DATD_BB;
+		typedef LinBox::Compose< DATD_BB, Blackbox> DATDA_BB;
+		typedef LinBox::Compose< DATDA_BB, LinBox::Diagonal<Field> > DATDAD_BB;
+
+		AT_BB 		AT(&B);
+		DAT_BB 		B1(&D2, &AT);	// B1 = D2 B^T
+		DATD_BB 	B2(&B1, &D1);	// B2 = B1 D1 = D2 B^T D1
+		DATDA_BB 	B3(&B2, &B);	// B3 = B2 B  = D2 B^T D1 B
+		DATDAD_BB	B4(&B3, &D2);	// B4 = B3 D2 = D2 B^T D1 B D2
+		std::cerr << "B4: " << B4.rowdim() << "x" << B4.coldim() << std::endl;
+
+		//         trace(t, B4);
+		LinBox::WhisartTraceTranspose(t, F, D2, B, D1);
+
+		F.write(std::cerr << "Trace D2 B^T D1 B D2: ", t) << std::endl;
+
+	}
+	else {
+		typedef LinBox::Compose< LinBox::Diagonal<Field>, Blackbox > DA_BB;
+		typedef LinBox::Compose< DA_BB, LinBox::Diagonal<Field> > DAD_BB;
+		typedef LinBox::Transpose<Blackbox> AT_BB;
+		typedef LinBox::Compose< DAD_BB, AT_BB> DADAT_BB;
+		typedef LinBox::Compose< DADAT_BB, LinBox::Diagonal<Field> > DADATD_BB;
+
+		DA_BB 		B1(&D2, &B);	// B1 = D2 B
+		DAD_BB 		B2(&B1, &D1);	// B2 = B1 D1 = D2 B D1
+		AT_BB 		AT(&B);
+		DADAT_BB 	B3(&B2, &AT);	// B3 = B2 B^T= D2 B D1 B^T
+		DADATD_BB	B4(&B3, &D2);	// B4 = B3 D2 = D2 B D1 B^T D2
+		std::cerr << "B4: " << B4.rowdim() << "x" << B4.coldim() << std::endl;
+
+		//         trace(t, B4);
+		LinBox::WhisartTrace(t, F, D2, B, D1);
+
+		F.write(std::cerr << "Trace D2 B D1 B^T D2: ", t) << std::endl;
+	}
+
+	if (! F.areEqual( t, p2 )) {
+		std::cerr << "*** FAILURE (" << (deg-val) << ") ***" << std::endl;
+		F.write(std::cerr << "Trace: ", t) << std::endl;
+		F.write(std::cerr << "Minpo: ", p2) << std::endl;
+	}
+	else {
+		//         std::cerr << "Degree - valuation: " << (deg-val) << std::endl;
+		std::cerr << "MONTE CARLO RANK: " << (deg-val) << std::endl;
+	}
+	std::cerr << chrono4 << std::endl;
+
+
+
+	std::cerr << "Rank |\t Time-genvect\t Time-seq\t Time-SB\t Time-Interp |\t Total-Time" << std::endl;
+	std::cout << (deg-val) << std::scientific << std::setprecision(3)
+	<< " |\t" << chrono1.usertime()
+	<< '\t' << chrono2.usertime()
+	<< '\t' << chrono3.usertime()
+	<< '\t' << chrono4.usertime()
+	<< " |\t" << (chrono1.usertime()+chrono2.usertime()+chrono3.usertime()+chrono4.usertime())
+	<< std::endl;
+	return 0;
+}
+
+
+int main (int argc, char **argv)
+{
+        // argv[1]: matrix file name
+        // argv[2]: [optional] field characteristic (default 65521)
+        // argv[3]: [optional] block size (default omp_max_threads)
+        // argv[4]: [optional] random generator seed
+
+	int c = (argc>2 ? atoi(argv[2]) : 65521);
+	unsigned long extend = (unsigned long)FF_EXPONENT_MAX(c,(int)LINBOX_EXTENSION_DEGREE_MAX);
+	if (extend > 1) {
+		std::cerr << "*** WARNING *** would be best using an extension field of degree " << extend << std::endl;
+	}
+#if 0
+	if (extend > 1) {
+		typedef LinBox::Givaro::GFq Field;
+		Field EF( (unsigned long)c, extend);
+		EF.write(std::cerr << "Using an extension field ") << std::endl;
+		return OMP_BLOCK_RANK_main(EF,argc,argv);
+	}
+#endif
+	// else {
+	typedef Givaro::Modular<double> Field;
+	Field F(c);
+	return OMP_BLOCK_RANK_main(F,argc,argv);
+	//     }
+
+}
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/omp_smithvalence.C b/examples/omp_smithvalence.C
new file mode 100644
index 0000000..1c4033d
--- /dev/null
+++ b/examples/omp_smithvalence.C
@@ -0,0 +1,236 @@
+/*
+ * examples/omp_smithvalence.C
+ * Copyright (c) Linbox
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/**\file examples/omp_smithvalence.C
+ * @example  examples/omp_smithvalence.C
+  \brief Valence of sparse matrix over Z or Zp.
+  \ingroup examples
+  */
+#ifndef DISABLE_COMMENTATOR
+#define DISABLE_COMMENTATOR
+#endif
+
+#include <iostream>
+#include <omp.h>
+#include "smithvalence.h"
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+	//     commentator().setMaxDetailLevel (-1);
+	//     commentator().setMaxDepth (-1);
+	//     commentator().setReportStream (std::cerr);
+
+
+	if (argc < 2 || argc > 4) {
+		std::cerr << "Usage: omp_smithvalence <matrix-file-in-supported-format> [-ata|-aat|valence] [coprime]" << std::endl;
+        std::cerr << "       Optional parameters valence and coprime are integers." << std::endl;
+        std::cerr << "       Prime factors of valence will be used for local computation." << std::endl;
+        std::cerr << "       coprime will be used for overall rank computation." << std::endl;
+		return -1;
+	}
+
+	std::ifstream input (argv[1]);
+	if (!input) { std::cerr << "Error opening matrix file " << argv[1] << std::endl; return -1; }
+
+	Givaro::ZRing<Integer> ZZ;
+	MatrixStream< Givaro::ZRing<Integer> > ms( ZZ, input );
+	typedef SparseMatrix<Givaro::ZRing<Integer>>  Blackbox;
+	Blackbox A (ms);
+	input.close();
+
+	std::cout << "A is " << A.rowdim() << " by " << A.coldim() << std::endl;
+
+	Givaro::ZRing<Integer>::Element val_A;
+
+	LinBox::Timer chrono; chrono.start();
+	if (argc >= 3) {
+		Transpose<Blackbox> T(&A);
+		if (strcmp(argv[2],"-ata") == 0) {
+			Compose< Transpose<Blackbox>, Blackbox > C (&T, &A);
+			std::cout << "A^T A is " << C.rowdim() << " by " << C.coldim() << std::endl;
+			valence(val_A, C);
+		}
+		else if (strcmp(argv[2],"-aat") == 0) {
+			Compose< Blackbox, Transpose<Blackbox> > C (&A, &T);
+			std::cout << "A A^T is " << C.rowdim() << " by " << C.coldim() << std::endl;
+			valence(val_A, C);
+		}
+		else {
+			std::cout << "Suppose primes are contained in " << argv[2] << std::endl;
+			val_A = LinBox::Integer(argv[2]);
+		}
+	}
+	else {
+		if (A.rowdim() != A.coldim()) {
+			std::cerr << "Valence works only on square matrices, try either to change the dimension in the matrix file, or to compute the valence of A A^T or A^T A, via the -aat or -ata options."  << std::endl;
+			exit(0);
+		}
+		else
+			valence (val_A, A);
+	}
+
+	std::cout << "Valence is " << val_A << std::endl;
+
+	std::vector<Givaro::Integer> Moduli;
+	std::vector<size_t> exponents;
+	Givaro::IntFactorDom<> FTD;
+
+	typedef std::pair<Givaro::Integer,unsigned long> PairIntRk;
+	std::vector< PairIntRk > smith;
+
+
+Givaro::Integer coprimeV=2;
+	if (argc >= 4) {
+		coprimeV =Givaro::Integer(argv[3]);
+	}
+	while ( gcd(val_A,coprimeV) > 1 ) {
+		FTD.nextprimein(coprimeV);
+	}
+
+	if (argc >= 4) {
+		std::cout << "Suppose " << argv[3] << " is coprime with Smith form" << std::endl;
+	}
+
+	std::cout << "Integer rank: " << std::endl;
+
+	unsigned long coprimeR; LRank(coprimeR, argv[1], coprimeV);
+	smith.push_back(PairIntRk(coprimeV, coprimeR));
+	//         std::cerr << "Rank mod " << coprimeV << " is " << coprimeR << std::endl;
+
+	std::cout << "Some factors (50000 factoring loop bound): ";
+	FTD.set(Moduli, exponents, val_A, 50000);
+	std::vector<size_t>::const_iterator eit=exponents.begin();
+	for(std::vector<Givaro::Integer>::const_iterator mit=Moduli.begin();
+	    mit != Moduli.end(); ++mit,++eit)
+		std::cout << *mit << '^' << *eit << ' ';
+	std::cout << std::endl;
+
+	std::vector<Givaro::Integer> SmithDiagonal(coprimeR,Givaro::Integer(1));
+
+	std::cout << "num procs: " << omp_get_num_procs() << std::endl;
+	std::cout << "max threads: " << omp_get_max_threads() << std::endl;
+#pragma omp parallel for shared(SmithDiagonal, Moduli, coprimeR)
+	for(size_t j=0; j<Moduli.size(); ++j) {
+		unsigned long r; LRank(r, argv[1], Moduli[j]);
+		std::cerr << "Rank mod " << Moduli[j] << " is " << r << " on thread: " << omp_get_thread_num() << std::endl;
+		smith.push_back(PairIntRk( Moduli[j], r));
+		for(size_t i=r; i < coprimeR; ++i)
+			SmithDiagonal[i] *= Moduli[j];
+	}
+
+
+	/*
+	   for(std::vector<Givaro::Integer>::const_iterator mit=Moduli.begin();
+	   mit != Moduli.end(); ++mit) {
+	   unsigned long r; LRank(r, argv[1], *mit);
+	   std::cerr << "Rank mod " << *mit << " is " << r << std::endl;
+	   smith.push_back(PairIntRk(*mit, r));
+	   for(size_t i=r; i < coprimeR; ++i)
+	   SmithDiagonal[i] *= *mit;
+	   }
+	   */
+
+	eit=exponents.begin();
+	std::vector<PairIntRk>::const_iterator sit=smith.begin();
+	for( ++sit; sit != smith.end(); ++sit, ++eit) {
+            if (sit->second != coprimeR) {
+                std::vector<size_t> ranks;
+                ranks.push_back(sit->second);
+                size_t effexp;
+                if (*eit > 1) {
+                    if (sit->first == 2)
+                        PRankPowerOfTwo(ranks, effexp, argv[1], *eit, coprimeR);
+                    else
+                        PRank(ranks, effexp, argv[1], sit->first, *eit, coprimeR);
+                }
+                else {
+			// if (sit->first == 2)
+			PRank(ranks, effexp, argv[1], sit->first, 2, coprimeR);
+			// else
+			// PRank(ranks, effexp, argv[1], sit->first, 2, coprimeR);
+		}
+                if (ranks.size() == 1) ranks.push_back(coprimeR);
+
+                if (effexp < *eit) {
+                    for(size_t expo = effexp<<1; ranks.back() < coprimeR; expo<<=1) {
+                        if (sit->first == 2)
+                            PRankIntegerPowerOfTwo(ranks, argv[1], expo, coprimeR);
+                        else
+                            PRankInteger(ranks, argv[1], sit->first, expo, coprimeR);
+                    }
+                } else {
+
+                    for(size_t expo = (*eit)<<1; ranks.back() < coprimeR; expo<<=1) {
+                        if (sit->first == 2)
+                            PRankPowerOfTwo(ranks, effexp, argv[1], expo, coprimeR);
+                        else
+                            PRank(ranks, effexp, argv[1], sit->first, expo, coprimeR);
+                        if (ranks.size() < expo) {
+                            std::cerr << "It seems we need a larger prime power, it will take longer ..." << std::endl;
+                                // break;
+                            if (sit->first == 2)
+                                PRankIntegerPowerOfTwo(ranks, argv[1], expo, coprimeR);
+                            else
+                                PRankInteger(ranks, argv[1], sit->first, expo, coprimeR);
+                        }
+                    }
+                }
+
+                std::vector<size_t>::const_iterator rit=ranks.begin();
+// 			unsigned long modrank = *rit;
+                for(++rit; rit!= ranks.end(); ++rit) {
+                    if ((*rit)>= coprimeR) break;
+                    for(size_t i=(*rit); i < coprimeR; ++i)
+                        SmithDiagonal[i] *= sit->first;
+// 				modrank = *rit;
+                }
+            }
+	}
+
+Givaro::Integer si=1;
+	size_t num=0;
+	for( std::vector<Givaro::Integer>::const_iterator dit=SmithDiagonal.begin();
+	     dit != SmithDiagonal.end(); ++dit) {
+		if (*dit == si) ++num;
+		else {
+			std::cerr << '[' << si << ',' << num << "] ";
+			num=1;
+			si = *dit;
+		}
+	}
+	std::cerr << '[' << si << ',' << num << "] " << std::endl;
+	chrono.stop();
+	std::cerr << chrono << std::endl;
+
+
+	return 0;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/poly-smith.C b/examples/poly-smith.C
new file mode 100644
index 0000000..76fe940
--- /dev/null
+++ b/examples/poly-smith.C
@@ -0,0 +1,141 @@
+#include <linbox/linbox-config.h>
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <string>
+#include <map>
+
+
+#include <linbox/util/commentator.h>
+#include <linbox/ring/modular.h>
+#include <linbox/vector/stream.h>
+#include <linbox/matrix/matrix-domain.h>
+#include <linbox/matrix/dense-matrix.h>
+
+#include <linbox/algorithms/blackbox-block-container.h>
+#include <linbox/algorithms/block-coppersmith-domain.h>
+
+#include <givaro/givtimer.h>
+#include <givaro/modular.h>
+#include <givaro/givpoly1.h>
+#include <linbox/ring/givaro-poly.h>
+#include <linbox/algorithms/smith-form-textbook.h>
+#include <linbox/algorithms/smith-form-kannan-bachem.h>
+
+using namespace LinBox;
+using namespace std;
+
+/// Prints out a matrix in maple format
+template<class MatrixDom, class Matrix>
+void printMatrix(MatrixDom MD, Matrix A)
+{
+	typename MatrixDom::Field::Element tmp;
+	
+	cout << "<";
+	for (size_t i = 0; i < A.rowdim(); i++)
+	{
+		if (i != 0)
+			cout << ",";
+		
+		MD.field().write(cout << "<", A.getEntry(tmp, i, 0));
+		for (size_t j = 1; j < A.coldim(); j++)
+		{
+			MD.field().write(cout << "|", A.getEntry(tmp, i, j));
+		}
+		cout << ">";
+	}
+	cout << ">" << endl;
+}
+
+/// Prints a vector as a list
+template<class Field, class Vector>
+void printVector(Field F, Vector S)
+{	
+	F.write(cout << "[", S[0]);
+	for (size_t i = 1; i < S.size(); i++)
+		F.write(cout << ",", S[i]);
+	cout << "]" << endl;
+}
+
+/// Makes vector polynomials monic
+template<class PolyDom, class Vector>
+void normalize(PolyDom &PD, Vector &S)
+{
+	typedef typename PolyDom::Type_t Scalar;
+	
+	for (size_t i = 0; i < S.size(); i++)
+	{
+		Scalar lcoef;
+		PD.leadcoef(lcoef, S[i]);
+		PD.divin(S[i], lcoef);
+	}
+}
+
+int main(int argc, char **argv)
+{
+	typedef Givaro::Modular<int32_t> BaseDom;
+	typedef Givaro::Poly1Dom<BaseDom, Givaro::Dense> PolyDom;
+	typedef GivaroPoly<PolyDom> Field;
+	typedef MatrixDomain<Field> MatrixDom;
+	typedef DenseMatrix<Field> Matrix;
+	
+	if (argc < 4)
+	{
+		cout << "Generates a random GF(p)^(n-by-n) with polynomial coefficients with degree=d" << endl;
+		cout << "Use: ./polysmith <p> <n> <d>" << endl;
+		return 1;
+	}
+	
+	int p = atoi(argv[1]);
+	int n = atoi(argv[2]);
+	int d = atoi(argv[3]);
+	
+	BaseDom BD(p);
+	PolyDom PD(BD, "x");
+	Field F(PD);
+	MatrixDom MD(F);
+	
+	Matrix M(F, n, n);
+	
+	GivaroPolyRandIter<Field> Rand(F);
+	
+	for (int i = 0; i < n; i++)
+	{
+		for (int j = 0; j < n; j++)
+		{
+			Field::Element tmp;
+			Rand.random(tmp, Givaro::Degree(d));
+			M.setEntry(i, j, tmp);
+		}
+	}
+	
+	printMatrix(MD, M);
+	
+	// Text Book SF Domain
+	// Comment out this block if things are getting too slow
+	SmithFormTextbookDomain<MatrixDom> SFD(MD);
+	DenseVector<Field> S1(F, n, F.zero);
+	
+	Givaro::Timer t1;
+	t1.start();
+	SFD.solve(S1, M);
+	t1.stop();
+	normalize(PD, S1);
+	printVector(F, S1);
+	
+	// Kannan-Bachem w/ Chou-Collins Improvement Domain 
+	SmithFormKannanBachemDomain<MatrixDom> SFKB(MD);
+	DenseVector<Field> S2(F, n, F.zero);
+	
+	Givaro::Timer t2;
+	t2.start();
+	SFKB.solve(S2, M);
+	t2.stop();
+	normalize(PD, S2);
+	printVector(F, S2);
+	
+	cout << "SFD: " << n << " " << p << " " << d << " " << t1.usertime() << endl;
+	cout << "SFK: " << n << " " << p << " " << d << " " << t2.usertime() << endl;
+	
+	return 0;
+}
diff --git a/examples/power_rank.C b/examples/power_rank.C
new file mode 100644
index 0000000..13df397
--- /dev/null
+++ b/examples/power_rank.C
@@ -0,0 +1,117 @@
+
+/*
+ * examples/power_rank.C
+ *
+ * Copyright (C) 2005, 2010 J-G Dumas
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/** \file examples/power_rank.C
+ * @example  examples/power_rank.C
+  \brief Rank of sparse matrix over Z or Zp.
+  \ingroup examples
+  */
+#include <linbox/linbox-config.h>
+
+#include <iostream>
+
+#include <givaro/modular.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/algorithms/smith-form-sparseelim-local.h>
+
+using namespace LinBox;
+using namespace std;
+
+
+template<typename Base>
+int tmain (int argc, char **argv)
+{
+	commentator().setMaxDetailLevel (-1);
+	commentator().setMaxDepth (-1);
+	commentator().setReportStream (std::cerr);
+
+	ifstream input (argv[1]);
+	if (!input) { cerr << "Error opening matrix file: " << argv[1] << endl; return -1; }
+
+    Base p; Givaro::Caster(p,Givaro::Integer(argv[2]));
+    Base q; Givaro::Caster(q,Givaro::Integer(argv[3]));
+    typedef Givaro::Modular<Base> Field;
+    Field F(q);
+    MatrixStream<Field> ms( F, input );
+    SparseMatrix<Field, SparseMatrixFormat::SparseSeq > B (ms);
+    cout << "B is " << B.rowdim() << " by " << B.coldim() << endl;
+    if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(cout) << endl;
+
+		// using Sparse Elimination
+    PowerGaussDomain< Field > PGD( F );
+    std::vector<std::pair<size_t,Base> > local;
+
+    Givaro::Timer tq; tq.clear(); tq.start();
+    PGD(local, B, q, p);
+    tq.stop();
+
+
+    F.write(std::cout << "Local Smith Form ") << " : " << std::endl << '(';
+    for (auto ip = local.begin(); ip != local.end(); ++ip) 
+        std::cout << ip->first << " " << ip->second << ", ";
+    cout << ")" << endl;
+
+
+    std::cerr << tq << std::endl;
+
+	return 0;
+}
+
+int main(int argc, char ** argv) {
+	if (argc < 4 || argc > 5) {	
+        cerr << "Usage: rank <matrix-file-in-supported-format> <prime> <prime-power> [<method>]" << endl; return -1; }
+
+    Givaro::Integer q(argv[3]);
+    size_t method( argc>4? atoi(argv[4]) : 0);
+    const size_t logq( (size_t)ceil(logtwo(q)) );
+    
+    if ( (method == 1) || ( (method==0) && (logq<63) ) ) {
+        return tmain<int64_t>(argc,argv);
+    } else {
+        if ( (method == 2) ) {
+            return tmain<Givaro::Integer>(argc,argv);
+        } else {
+            if (! method) method = (size_t)std::max(6.,  ceil(log(logq)/log(2.))  );
+            switch (method) {
+                case 6: return tmain<RecInt::ruint<6>>(argc,argv);
+                case 7: return tmain<RecInt::ruint<7>>(argc,argv); 
+                case 8: return tmain<RecInt::ruint<8>>(argc,argv);
+                case 9: return tmain<RecInt::ruint<9>>(argc,argv);
+                case 10: return tmain<RecInt::ruint<10>>(argc,argv);
+                case 11: return tmain<RecInt::ruint<11>>(argc,argv);
+            }
+        }
+    }
+    
+    return 0;
+}
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/poweroftwo_ranks.C b/examples/poweroftwo_ranks.C
new file mode 100644
index 0000000..c73bf8e
--- /dev/null
+++ b/examples/poweroftwo_ranks.C
@@ -0,0 +1,110 @@
+/* examples/poweroftwo_ranks.C
+ *
+ * Copyright (C) 2012 LinBox
+ * Written by J-G Dumas
+ * Time-stamp: <29 Mar 16 15:58:16 Jean-Guillaume.Dumas at imag.fr>
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/** \file examples/poweroftwo_ranks.C
+ * @example  examples/poweroftwo_ranks.C
+  \brief Ranks of sparse matrix modulo 2^k
+  \ingroup examples
+  */
+#include <linbox/linbox-config.h>
+
+#include <iostream>
+
+#include <givaro/modular.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/algorithms/smith-form-sparseelim-poweroftwo.h>
+
+using namespace LinBox;
+using namespace std;
+
+template<class Int_type, class Ring_type = Givaro::ZRing<Int_type> >
+void runpoweroftworank(ifstream& input, const size_t exponent) {
+    typedef std::vector<std::pair<size_t,Int_type> > Smith_t;
+    typedef Ring_type Ring; // signed ?
+    Smith_t local;
+    Ring R;
+    LinBox::MatrixStream<Ring> ms( R, input );
+    LinBox::SparseMatrix<Ring, LinBox::SparseMatrixFormat::SparseSeq > A (ms);
+
+    input.close();
+    LinBox::PowerGaussDomainPowerOfTwo< Int_type > PGD;
+            
+    cout << "B is " << A.rowdim() << " by " << A.coldim() << endl;
+//     R.write(std::cerr << "Last entry: ", A.getEntry(A.rowdim()-1,A.coldim()-1)) << std::endl;
+
+    Givaro::Timer tim; 
+    tim.clear(); tim.start();
+    PGD(local, A, exponent);
+    tim.stop();
+
+    R.write(std::cout << "Local Smith Form ") << " : " << std::endl << '(';
+    for (auto  p = local.begin(); p != local.end(); ++p)
+        std::cout << '[' << p->second << ',' << p->first << "] ";
+    cout << ')' << endl;
+       
+    std::cerr << tim << std::endl;
+}
+
+int main (int argc, char **argv) {
+    commentator().setMaxDetailLevel (-1);
+    commentator().setMaxDepth (-1);
+    commentator().setReportStream (std::cerr);
+
+    if (argc < 3 || argc > 4)
+    {	cerr << "Usage: rank <matrix-file-in-supported-format> <power of two exponent> [<method>]" << endl; return -1; }
+
+    ifstream input (argv[1]);
+    if (!input) { cerr << "Error opening matrix file: " << argv[1] << endl; return -1; }
+    size_t method( argc>3? atoi(argv[3]): 0 );
+    
+    Givaro::Timer tim;
+    size_t exponent = atoi(argv[2]);
+    if ((method == 2) || ((method == 0) && (exponent >= (1<<10))) ) {
+        runpoweroftworank<Givaro::Integer>(input, exponent);
+    } else {
+        if ((method == 1) || ((method == 0) && (exponent < 64)) ) {
+            runpoweroftworank<uint64_t, Givaro::ZRing<int64_t> >(input, exponent);
+        } else {
+            switch (method) {
+                case 6: runpoweroftworank<RecInt::ruint<6>>(input, exponent); break;
+                case 7: runpoweroftworank<RecInt::ruint<7>>(input, exponent); break;
+                case 8: runpoweroftworank<RecInt::ruint<8>>(input, exponent); break;
+                case 9: runpoweroftworank<RecInt::ruint<9>>(input, exponent); break;
+                case 10: runpoweroftworank<RecInt::ruint<10>>(input, exponent); break;
+                case 11: runpoweroftworank<RecInt::ruint<11>>(input, exponent); break;
+            }
+        }
+    }
+
+    std::cerr << tim << std::endl;
+    return 0;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/qchar.C b/examples/qchar.C
new file mode 100644
index 0000000..854864b
--- /dev/null
+++ b/examples/qchar.C
@@ -0,0 +1,548 @@
+
+/*
+ * examples/qchar.C
+ *
+ * Copyright (C) 2007, 2010 A. Urbanska
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file examples/qchar.C
+ * @example  examples/qchar.C
+ * @ingroup examples
+ * @brief  Undocumented.
+ */
+
+#include <givaro/modular.h>
+#include <linbox/field/gmp-rational.h>
+#include <linbox/matrix/dense-matrix.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/solutions/charpoly.h>
+#include <linbox/solutions/minpoly.h>
+#include <linbox/ring/givaro-polynomial.h>
+#include <linbox/element/givaro-polynomial.h>
+
+using namespace LinBox;
+using namespace std;
+
+typedef Givaro::ZRing<Integer> Integers;
+typedef Integers::Element Integer;
+typedef Givaro::Modular<double > Field;
+typedef Field::Element Element;
+typedef Vector<Integers>::Dense DVector;
+typedef GMPRationalField Rationals;
+typedef Rationals::Element Quotient;
+typedef DenseMatrix<Integers > Blackbox;
+typedef SparseMatrix<Rationals > RBlackbox;
+
+//#define _LB_CONT_FR
+
+typedef UserTimer myTimer;
+
+myTimer tRationalModular;
+
+template <class Field, class Polynomial>
+std::ostream& printPolynomial (std::ostream& out, const Field &F, const Polynomial &v)
+{
+	for (int i = v.size () - 1; i >= 0; i--) {
+		F.write (out, v[i]);
+		if (i > 0)
+			out << " X^" << i << " + ";
+		out << "\n";
+	}
+	return out;
+}
+
+template <class Blackbox, class MyMethod>
+struct PrecRationalModularCharpoly {
+	const Blackbox &A;
+	const MyMethod &M;
+	const Integer ≺
+
+	PrecRationalModularCharpoly(const Integer& detPrec, const Blackbox& b, const MyMethod& n) :
+		prec(detPrec), A(b), M(n)
+	{}
+
+	template<typename Polynomial, typename Field>
+	Polynomial& operator()(Polynomial& P, const Field& F) const
+	{
+
+		typedef typename Blackbox::template rebind<Field>::other FBlackbox;
+		FBlackbox * Ap;
+
+		tRationalModular.clear();
+		tRationalModular.start();
+		MatrixHom::map(Ap, A, F);
+		tRationalModular.stop();
+		//minpoly(P, *Ap, typename FieldTraits<Field>::categoryTag(), M);
+		charpoly( P, *Ap, typename FieldTraits<Field>::categoryTag(), M);
+		//minpolySymmetric(P, *Ap, typename FieldTraits<Field>::categoryTag(), M);
+		integer p;
+		F.characteristic(p);
+		cout<<"Valence "<<p<<" = P[P.size()-1]" << P[P.size(0)-1] << " R-M time " ;
+		tRationalModular.print(cout);
+		cout << "\n" ;
+
+		typename Field::Element fprec;
+		F.init(fprec, prec);
+		//printPolynomial (std::cout, F, P);
+		delete Ap;
+
+		for (int i=0; i < P.size(); ++i)
+			F.mulin(P[i],fprec);
+		//std::cout<<"prec*Det(A) mod "<<p<<" = P[0]" << P[0] << "\n";
+		return P;
+	}
+};
+
+template <class Blackbox, class MyMethod>
+struct PrecRationalModularMinpoly {
+	const Blackbox &A;
+	const MyMethod &M;
+	const DVector ≺
+
+
+	PrecRationalModularMinpoly(const DVector& detPrec, const Blackbox& b, const MyMethod& n) :
+		prec(detPrec), A(b), M(n)
+	{}
+
+	template<typename Polynomial, typename Field>
+	Polynomial& operator()(Polynomial& P, const Field& F) const
+	{
+
+		typedef typename Blackbox::template rebind<Field>::other FBlackbox;
+		FBlackbox * Ap;
+
+		tRationalModular.clear();
+		tRationalModular.start();
+		MatrixHom::map(Ap, A, F);
+		tRationalModular.stop();
+		//minpoly(P, *Ap, typename FieldTraits<Field>::categoryTag(), M);
+		//charpoly( P, *Ap, typename FieldTraits<Field>::categoryTag(), M);
+		minpolySymmetric(P, *Ap, typename FieldTraits<Field>::categoryTag(), M);
+		integer p;
+		F.characteristic(p);
+		//cout<<"Det(A) mod "<<p<<" = P[0]" << P[0] << " R-M time " ;
+		cout<<"Valence "<<p<<" = P[P.size()-1]" << P[P.size()-1] << " R-M time " ;
+		tRationalModular.print(cout);
+		cout << "\n" ;
+
+		typename Field::Element fprec;
+		//F.init(fprec, prec);
+		//printPolynomial (std::cout, F, P);
+		delete Ap;
+
+		for (int i=0; i < P.size()-1; ++i) {
+			F.init(fprec, prec[i]);
+			F.mulin(P[i],fprec);
+		}
+		//std::cout<<"prec*Det(A) mod "<<p<<" = P[0]" << P[0] << "\n";
+		//printPolynomial(cout,F,P);
+		return P;
+	}
+};
+
+
+void continuedFractionIn(double x,Integer& num, Integer& den, double epsi,const size_t s, Integer den_bound);
+template <class RMatrix>
+void generate_precRatMat(string& filename, RMatrix& M, DVector& den, Integer& denPrec);
+void i_vti_v(RBlackbox& Res, DenseMatrix<Rationals >& M, DVector& den, Integer& detPrec);
+
+int main (int argc, char** argv)
+{
+
+	if ((argc < 3) || (argc > 4) ) {
+		cout << "Usage: qchar n matrix" << endl;
+		return -1;
+	}
+
+	size_t n = atoi(argv[1]);
+	cout << "Matrix size " << n<< endl;
+	string filename;
+	filename=argv[2];
+
+	Integers Z;
+	Rationals Q;
+
+	Integer detPrec = 1;
+	Integer detNum;
+	Integer detDen;
+
+	Blackbox DM(Z,n,n);
+	DenseMatrix<Rationals > In(Q,n,n);
+	RBlackbox M(Q,n,n);
+	DVector V(n,1);
+
+	//	generate_precRatMat(filename, In, V, detPrec);
+	//i_vti_v(M,In, V, detPrec);
+	generate_precRatMat(filename, M, V, detPrec);
+	cout << "detPrec is " << detPrec  << "\n";
+	typedef GivPolynomialRing<Integers,Dense> IntPolRing;
+	IntPolRing::Element c_A;
+
+	Integer max = 1,min=0;
+	for (int i=0; i < n; ++i) {
+		for (int j=0; j < n; ++j) {
+			Integer a;
+			Q.convert(a,M.getEntry(i,j));
+			//      cerr<<"it="<<(*it)<<endl;
+			if (max < a)
+				max = a;
+			if (min > a)
+				min = a;
+		}
+	}
+	if (max<-min)
+		max=-min;
+	else max = max+1;
+	double hadamarcp = (double)n/2.0*(log(double(n))+2*log(double(max))+0.21163275)/log(2.0);
+
+
+	cout << "had" << hadamarcp << "\n";
+	cout << "had2" << (Integer)hadamarcp*detPrec << "\n";
+
+	RandomPrimeIterator genprime( 26-(int)ceil(log((double)M.rowdim())*0.7213475205));
+	ChineseRemainder< EarlyMultipCRA<Field  > > cra(3UL);
+	typedef Method::Hybrid MyMethod;
+	MyMethod Met;
+	//PrecRationalModularCharpoly <RBlackbox  ,MyMethod> iteration (detPrec, M, Met);
+	PrecRationalModularMinpoly< RBlackbox  ,MyMethod> iteration(V, M, Met);
+	cra (c_A, iteration, genprime);
+	printPolynomial(cout, Z, c_A);
+
+	return 0 ;
+}
+
+/* for a rational number num/den construct a continued fraction approximation:
+   - with den bounded by den_bound
+   AND - number of steps bounded by s
+   NEW fraction replaces num/den
+   */
+
+void continuedFractionIn(Integer& num, Integer& den, double epsi,const size_t s, Integer den_bound)
+{
+	//den_bound = 100;
+	Integer a=num;
+	Integer b=den;
+	Integer t;
+	//double y;
+	Integer f[s];
+	f[0] = a/b;// y = f[0];
+	int i=1;
+	while (1) //abs(y-x)>=epsi)
+	{
+		//cout << "a :" << a << " b: " << b << "\n";
+		t = a%b;
+		a = b;
+		b = t;
+		f[i] = a/b;
+		//y = (double)f[i];
+		num = 1;
+		den = f[i];
+		for (int j=i-1; j > 0; --j) {
+			Integer tmp = num;
+			num = den;
+			den = f[j]*den+tmp;
+			//y = (double)f[j]+1/y;
+		}
+		//y = (double)f[0]+1/y;
+		num = den*f[0]+num;
+		if (den >= den_bound) break;
+		++i;
+		if (i >= s) {
+			break;
+		}
+	}
+}
+
+void i_vti_v(RBlackbox& Res, DenseMatrix<Rationals >& M, DVector& den, Integer& detPrec)
+{
+	detPrec=1;
+	Rationals Q;
+	int n = M.coldim();
+	//DVector denV(n,1);
+	for (int i=0; i < den.size();++i) den[i]=1;
+	for (int i=0; i < n; ++i) {
+		for (int j=0; j <=i ; ++j) {
+			Integer q_num =0;
+			Integer q_den =1;
+			for (int k=0; k < n; ++k) {
+				Integer deno_ik, nume_ik, deno_jk, nume_jk, deno, nume;
+				Q.get_den (deno_ik, M.getEntry(k,i));
+				Q.get_num (nume_ik, M.getEntry(k,i));
+				Q.get_den (deno_jk, M.getEntry(k,j));
+				Q.get_num (nume_jk, M.getEntry(k,j));
+
+				if (i==k) {
+					nume_ik = deno_ik-nume_ik;
+				}
+				else {
+					nume_ik = -nume_ik;
+				}
+
+				if (j==k) {
+					nume_jk = deno_jk-nume_jk;
+				}
+				else {
+					nume_jk = -nume_jk;
+				}
+				//cout << nume_ik << nume_jk;
+
+				deno = deno_ik*deno_jk;
+				nume = nume_ik*nume_jk;
+				//cout << q_num << "/" << q_den << " " ;
+				//cout << nume << "/" << deno << " " ;
+				if (deno==q_den) q_num+=nume;
+				else {
+					if (nume != 0) {
+						Integer g = gcd(q_den, deno);
+						q_num = q_num*deno/g+nume*q_den/g;
+						q_den = q_den*deno/g;
+					}
+				}
+				//cout << q_num << "/" << q_den << " " ;
+			}
+			if (q_num != 0) {
+				Quotient q(q_num,q_den);
+				if (i!=j) {
+					den[i]=lcm(den[i], q_den);
+					den[j]=lcm(den[j], q_den);
+					Res.setEntry(i,j,q);
+					Res.setEntry(j,i,q);
+					cout << i << " " << j << " " << q_num << "/" << q_den << "\n";
+					cout << j << " " << i << " " << q_num << "/" << q_den << "\n";
+				}
+				else {
+					den[i]=lcm(den[i], q_den);
+					Res.setEntry(i,j,q);
+					cout << i << " " << j << " " << q_num << "/" << q_den << "\n";
+				}
+			}
+		}
+	}
+	Integer d = 1;
+	for (int i=0; i < den.size(); ++i) {
+		detPrec *=den[i];
+		d = lcm(d, den[i]);
+	}
+	den[den.size()-1]=d;
+	for (int i=den.size()-2; i >=0; --i) {
+		den[i]=d*den[i+1];
+	}
+
+}
+
+template <class RMatrix>
+void generate_precRatMat(string& filename, RMatrix& M, DVector& den, Integer& denPrec)
+{
+	int prec=10;
+	denPrec = 1;
+	ifstream is(filename.c_str(), std::ios::in);
+	int m,n;
+	char c;
+	is >> m >> n;
+	do is >> c; while (isspace (c));
+	if ((m > M.rowdim()) || (n > M.coldim())) {
+		cout << m << " " << n << " " ;
+		cout << "Wrong matrix size\n";
+		return;
+	}
+
+	cout << "Reading matrix\n";
+
+	den.resize(m,1);
+	while (1) {//! @todo temp fix
+#if 0
+		while (is >> m) //temp fix
+			if (m==0) break;//temp fix
+#endif
+		is >> m;//temp fix
+		is >> n;
+#if 0
+		cout << m << n << "\n";
+		long double x;
+		is >> x;
+#endif
+		char xstr[500];
+		char numstr[500];
+#if 0
+		cout << x << " ";
+		sprintf(xstr, "%100f", x);
+		cout << xstr << " " ;
+		is >> c; int i=0;
+		while (c!= '\n') {
+			xstr[i]=c;
+			++i;
+			is >> c;
+			if (i>=199) {
+				xstr[i]=0;
+				break;
+			}
+		}
+		is >> c;
+#endif
+		is.getline(xstr,500);
+
+		Integer ten=1;
+		if (strchr(xstr, '/') != NULL) {
+			//cout << "xstr " << xstr << "\n";
+			//! @bug non reentrant strtok
+			strcpy(numstr, strtok(xstr, "/"));
+			char tenstr[500];
+			strcpy(tenstr, strtok(NULL, "/"));
+			if (prec < strlen(tenstr)) {
+				int cut = strlen(tenstr)-prec;
+				tenstr[prec]=0;
+				//c = numstr[strlen(numstr)-2];
+				numstr[strlen(numstr)-cut]=0;//temp round down
+			}
+			Integer tmp(tenstr);
+			ten = tmp;
+			//cout << numstr << "/"  << ten << "\n";
+		}
+		else
+		{
+
+			//    cout << "xstr" << xstr << " " ;
+			int i=0;
+			int j=0;
+			c=xstr[i]; ++i;
+			while (isspace (c)) {
+				if (i >=strlen(xstr)) break;
+				c=xstr[i];
+				++i;
+			}
+			if (c=='-') {
+				numstr[j]=c;++j;
+				if (i < strlen(xstr)) {
+					c = xstr[i];
+					++i;
+				}
+			}
+			if (c=='0') {
+				//cout << "zero";
+				if (i < strlen(xstr)) {
+					c = xstr[i];
+					++i;
+				}
+			} //else cout << " not 0" << c;
+			while (strchr("0123456789",c) != NULL) {
+				//cout << "number";
+				numstr[j]=c; ++j;
+				if (i >=strlen(xstr)) break;
+				c=xstr[i];
+				++i;
+			}
+			if (c=='.') {
+				if (i < strlen(xstr)) {
+					c = xstr[i];
+					//cout << "c" << c ;
+					++i;
+					while (strchr("0123456789",c) != NULL) {
+						numstr[j]=c;++j;
+						if (i >=strlen(xstr)) break;
+						c=xstr[i];
+						++i;
+					}
+				}
+				else {
+					cout << "wrong number format at .";
+					break;
+				}
+			}
+			numstr[j]=0;
+			//cout << "num" << numstr << " " ;
+
+			size_t dplaces=0;
+			int exp=0;
+			j=0;
+			c = xstr[j]; ++j;
+			while (c != '.') {
+				if (j >= strlen(xstr)) break;
+				c = xstr[j];
+				++j;
+			}
+			if (j < strlen(xstr)) {
+				c = xstr[j]; ++j;
+				while (c != 'e') {
+					++dplaces;
+					ten *= 10;
+					if (j >= strlen(xstr)) break;
+					c = xstr[j];
+					++j;
+				}
+			}
+			if (j < strlen(xstr)) {
+				sscanf(xstr+j, "%d", &exp);
+				j=j-2;c = xstr[j];
+				while (c=='0') {
+					ten/=10;
+					--j;
+					c = xstr[j];
+				}
+			}
+
+			dplaces -=exp;
+			if (exp > 0) {
+				for (int i=0; i < exp; ++i) ten /=10;
+			}
+			else if (exp < 0) {
+				for (int i=0; i < exp; ++i) ten *=10;
+			}
+			//double nume = x * (double)ten;
+		}
+		Integer num (numstr);
+		Integer g;
+
+#ifdef _LB_CONT_FR
+		double epsi = 1/(double)ten*10;
+		size_t s=10;
+		continuedFractionIn(num, ten, epsi, s, ten);
+#endif
+		//cout << m << " " << n << " " << num << "/" << ten << "\n";
+		g = gcd(num,ten);
+		//g =1;
+		Quotient q(num/g,ten/g);
+		if ((m==0)&&(n==0)&&(num==0)) break;//temp fix
+		//M.setEntry(m-1,n-1,q);//temp fix
+		M.setEntry(m,n,q);
+		den[m-1] = lcm(den[m-1],ten/g);
+	}
+	Integer d = 1;
+	for (int i=0; i < den.size(); ++i) {
+		denPrec *=den[i];
+		d = lcm(d, den[i]);
+	}
+	den[den.size()-1]=d;
+	cout << d << "\n";
+	for (int i=den.size()-2; i >=0; --i) {
+		den[i]=d*den[i+1];
+		cout << den[i] << "\n";
+	}
+}
+
+#undef _LB_CONT_FR
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/rank.C b/examples/rank.C
index 4ea16e2..f65dbab 100644
--- a/examples/rank.C
+++ b/examples/rank.C
@@ -28,16 +28,19 @@
   \ingroup examples
   */
 
+#include <linbox/linbox-config.h>
 #include <iostream>
 #include <sstream>
+#include <givaro/givrational.h>
 
-#include "linbox/field/modular.h"
-#include "linbox/field/gf2.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/blackbox/zero-one.h"
-#include "linbox/solutions/rank.h"
-#include "linbox/util/matrix-stream.h"
-#include "linbox/field/givaro.h"
+#include <linbox/ring/modular.h>
+#include <linbox/field/gf2.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/blackbox/zero-one.h>
+#include <linbox/solutions/rank.h>
+#include <linbox/util/matrix-stream.h>
+
+#define SP_STOR SparseMatrixFormat::SparseSeq
 
 using namespace LinBox;
 
@@ -61,75 +64,57 @@ int main (int argc, char **argv)
 
 	long unsigned int r;
 
-	if (argc == 2) { // rank over the rational numbers.
+	Givaro::QField<Givaro::Rational> ZZ;
+	LinBox::Timer tim ; tim.clear() ; tim.start();
+	MatrixStream<Givaro::QField<Givaro::Rational>> ms( ZZ, input );
+	SparseMatrix<Givaro::QField<Givaro::Rational>, SP_STOR> A ( ms );
 
+	tim.stop();
+	std::cout << "matrix is " << A.rowdim() << " by " << A.coldim() << " (" << tim << ")" << std::endl;
+	tim.clear() ; tim.start();
+	
+	if (argc == 2) { // rank over the rational numbers.
 		/* We could pick a random prime and work mod that prime, But
 		 * the point here is that the rank function in solutions/
 		 * handles that issue.  Our matrix here is an integer or
 		 * rational matrix and our concept is that we are getting the
 		 * rank of that matrix by some blackbox magic inside linbox.
 		 */
-		LinBox::GivaroRational ZZ;
-		MatrixStream<GivaroRational> ms( ZZ, input );
-		SparseMatrix<GivaroRational> A ( ms );
-		std::cout << "A is " << A.rowdim() << " by " << A.coldim() << std::endl;
-
 		LinBox::rank (r, A);
 	}
+	
 	if (argc == 3) { // rank mod a prime
-		/*
-		//for prime greater than wordsize:
-		stringstream qstr(argv[2]);
-		integer q;
-		qstr >> q;
-		typedef Modular<integer> Field;
-		*/
-		/*
-		//to use doubles, prime < 2^{23}
-		double q = atof(argv[2]);
-		typedef Modular<double> Field;
-		*/
-		//to use ints, prime < 2^{31}
-		int32_t q = atoi(argv[2]);
-		typedef Modular<int32_t> Field;
+		uint32_t q = atoi(argv[2]);
+		if (q == 0) {
+				std::cerr << "second argument should be a non-zero integer or missing\n";
+				return -1;
+		}
+		typedef Givaro::Modular<double> Field;
 
 		Field F(q);
-		MatrixStream<Field> ms( F, input );
-		SparseMatrix<Field, Vector<Field>::SparseSeq > B (ms);
-		std::cout << "B is " << B.rowdim() << " by " << B.coldim() << std::endl;
-		if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(std::cout) << std::endl;
+		if (q > F.maxCardinality()) {
+			std::cerr << "your number is too big for this field" << std::endl;
+			return -1 ;
+		}
+
+		SparseMatrix<Field, SP_STOR > B (F, A.rowdim(), A.coldim());// modular image of A
+		MatrixHom::map(B, A);
+		std::cout << "matrix is " << B.rowdim() << " by " << B.coldim() << std::endl;
+		//if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(std::cout) << std::endl;
 
 		// Using the adaptive LinBox Solution
 		LinBox::rank(r,B);
-
-		// using BlackBoxes
-#if 0 /*  too bad */
-		   Method::Blackbox MBB;
-		   MBB.certificate(true);
-		   Linbox::rank(r, B, MBB);
-#endif
-
-		// using in place Sparse Elimination with linear pivoting
-
-#if 0 /*  too bad */
-		   Method::SparseElimination SE;
-		   SE.strategy(Specifier::PIVOT_LINEAR);
-		   rankin (r, B, SE);
-		   if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(std::cout) << std::endl;
-#endif
-
-
 	}
+	tim.stop();
 
-	std::cout << "Rank is " << r << std::endl;
+	std::cout << "Rank is " << r << " (" << tim << " )" << std::endl;
 	return 0;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/rr.C b/examples/rr.C
new file mode 100644
index 0000000..8dee961
--- /dev/null
+++ b/examples/rr.C
@@ -0,0 +1,99 @@
+
+/*
+ * examples/rr.C
+ *
+ * Copyright (C) 2008, 2010 A. Urbanska
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file examples/rr.C
+ * @example  examples/rr.C
+ * @ingroup examples
+ * @brief Rational Reconstruction.
+ */
+
+#include <iostream>
+
+#include <linbox/integer.h>
+#include <givaro/zring.h>
+#include <linbox/algorithms/rational-reconstruction-base.h>
+
+#include <linbox/util/matrix-stream.h>
+#include <linbox/util/timer.h>
+
+using namespace LinBox;
+using namespace std;
+
+typedef Givaro::ZRing<Integer> Ints;
+//typedef Ints::Element Integer;
+
+int main (int argc, char **argv)
+{
+	srand48( time(NULL) );
+
+	integer a,b;
+	integer x(1);
+	integer m(1);
+
+	x = x*rand()*rand()*rand()*rand()*rand()*rand();
+	m = m*rand()*rand()*rand()*rand()*rand()*rand()*rand()*rand();
+
+	if (x > m) {integer t=x; x=m; m=t;}
+
+	cout << "Searching a,b: a =" << x << "b mod " << m << endl << flush;
+	cout << "size of m" << m.bitsize() << endl << flush;
+
+	Ints Z;
+	WangClassicRationalReconstruction<Ints> RRB(Z,true,false);
+	//RationalReconstruction<Ints, WangClassicRationalReconstruction<Ints> > RR(RRB);
+	//RationalReconstruction<Ints, MaxQClassicRationalReconstruction<Ints> > RR(Z);
+	//RationalReconstruction<Ints, WangFastRationalReconstruction<Ints> > RR(Z);
+	RationalReconstruction<Ints, MaxQFastRationalReconstruction<Ints> > RR(Z);
+
+	LinBox::UserTimer t;
+	t.clear();
+	t.start();
+
+	for (int i=0; i < 1 ; ++i) {
+		if (RR.reconstructRational(a,b,x,m,5)) {
+			cout << "Found a,b: "<< a <<"=" << x << "x" << b << " mod " << m << endl << flush;
+			cout << "Does agree with bounds\n";
+		}
+		else {
+			cout << "Found a,b: "<< a <<"=" << x << "x" << b << " mod " << m << endl << flush;
+			cout << "Does not agree with bounds\n";
+		}
+	}
+	t.stop();
+	cout << "Time:";
+	t.print(cout);
+	cout << endl;
+
+	return 0 ;
+
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/samplebb.C b/examples/samplebb.C
new file mode 100644
index 0000000..e198ecc
--- /dev/null
+++ b/examples/samplebb.C
@@ -0,0 +1,277 @@
+
+/*
+ * examples/samplebb.C
+ *
+ * Copyright (C) 2005, 2010 D Saunders
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/** \file examples/samplebb.C
+ * @example  examples/samplebb.C
+ * \ingroup examples
+ * \brief generate an example matrix with specified frobenius form.
+ *
+ * samplebb takes options and any number of argument triples denoting companion
+ * matrix blocks.
+ * For example, the call "samplebb -r 7 2 3 a3 1 1" generates a sparsely
+ * randomized matrix (because of the '-r' option) matrix which is similar
+ * (because of the two triples '7 2 3' and 'a2 1 1') to a direct sum of 3
+ * companion matrices for (x-7)^2 plus one companion matrix for x^3 + x + 2, the
+ * polynomial denoted by 'a3'.
+ *
+ *  In general, in the first position of each triple 'aK' denotes the polynomial
+ *  x^k + x + K-1 and a number n denotes the polynomial x-n.  The second number
+ *  in the triple specifies a power of the polynomial and the third specifies how
+ *  many companion matrix blocks for that power of that polynomial.
+ *
+ *  Possible options are
+ *  -r lightly randomized similarity transform, matrix remains sparse.
+ *  -R fully randomized similarity transform, matrix becomes dense.
+ *
+ *  The matrix is written to standard out in SMS format (triples).
+ *
+ *  For some other examples:
+ *  "samplebb  1 1 2  2 1 2  4 1 2  12 1 1  0 1 1" is a 8 by 8 diagonal matrix in smith form,
+ *  diag(1,1,2,2,4,4,12,0)
+ *
+ */
+
+#include <iostream>
+#include <string>
+#include <list>
+#include <vector>
+#include <linbox/blackbox/direct-sum.h>
+#include <linbox/blackbox/companion.h>
+#include <linbox/algorithms/matrix-hom.h>
+#include <linbox/ring/ntl.h>
+#include <NTL/ZZX.h>
+#include <linbox/vector/blas-vector.h>
+
+using std::string;
+using std::list;
+using LinBox::Companion;
+using LinBox::DirectSum;
+using LinBox::DenseMatrix;
+using LinBox::NTL_ZZ;
+using NTL::ZZX;
+
+
+void stripOptions(int& acp, char* avp[], string& opts, const int ac, char** av)
+{
+	acp = 0;
+	for (int i = 1; i < ac; ++i)
+	{
+		//std::cout << av[i] << " ";
+		if (av[i][0] == '-') {
+			for (const char* j = av[i]+1; *j != 0; ++j)
+				opts.push_back(*j);
+		}
+
+		else {
+			avp[acp] = av[i];
+			++acp;
+		}
+	}
+}
+
+template <class List, class Ring>
+void augmentBB(List& L, char* code, int e, int k, const Ring& R)
+{
+	typedef typename Ring::Element Int;
+	Int a;
+	ZZX p;
+
+	// build poly p
+
+	if ( *code != 'a')  // build linear poly
+	{
+		R.init(a, -atoi(code));
+		p += ZZX(0, a);
+		p += ZZX(1, R.one);
+	}
+	else // build long poly
+	{
+		int n = atoi(code+1);
+		R.init(a, n-1);
+		p += ZZX(n, R.one);
+		p += ZZX(1, R.one);
+		p += ZZX(0, a);
+	}
+
+	//std::cout << "(code, e, k) =(" << code << ", " << e << ", " << k << ")" << std::endl;
+	//std::cout << "Correspoding poly: " << p << std::endl;
+	// compute q =  p^e
+	ZZX q(0, R.one);
+	for(int i = 0; i < e; ++i) q *= p;
+	//std::cout <<"Polynomial: " << q << std::endl;
+
+	LinBox::DenseVector<Ring>  v(R,deg(q)+1);
+	for (int i = 0; i < v.size(); ++i) v[i] = coeff(q, i);
+
+	// companion matrix of q
+	Companion<Ring>* C = new Companion<Ring>(R, v);
+	for(int i = 0; i < k; ++i) L.push_back(C);
+
+}
+
+template < class Ring >
+void scramble(DenseMatrix<Ring>& M)
+{
+
+	Ring R = M.field();
+
+	int N,n = M.rowdim(); // number of random basic row and col ops.
+	N = 2*n;
+
+	for (int k = 0; k < N; ++k) {
+
+		int i = rand()%M.rowdim();
+
+		int j = rand()%M.coldim();
+
+		if (i == j) continue;
+
+		// M*i += alpha M*j and Mj* -= alpha Mi*
+
+		typename Ring::Element alpha, beta, x;
+		R.init(alpha, rand()%5 - 2);
+		R.neg(beta, alpha);
+
+		for (size_t l = 0; l < M.rowdim(); ++l) if (!R.isZero(alpha)) {
+			R.mul(x, alpha, M[l][j]);
+			R.addin(M[l][i], x);
+		}
+
+
+		for (size_t l = 0; l < M.rowdim(); ++l) if (!R.isZero(alpha)) {
+			R.mul(x, beta, M[i][l]);
+			R.addin(M[j][l], x);
+		}
+	}
+
+	/*
+	   std::ofstream out("matrix", std::ios::out);
+
+	//M. write(std::cout);
+
+	out << n << " " << n << "\n";
+
+	for (int i = 0; i < n; ++ i) {
+
+	for ( int j = 0; j < n; ++ j) {
+
+	R. write(out, M[i][j]);
+
+	out << " ";
+	}
+
+	out << "\n";
+
+	}
+	*/
+
+}
+
+template <class Matrix>
+void printMatrix (const Matrix& A)
+{
+	int m = A. rowdim();
+	int n = A. coldim();
+	typedef typename Matrix::Field Ring;
+	typedef typename Ring::Element Element;
+	const Ring &r = A.field();
+	LinBox::DenseVector<Ring> x(r,m), y(r,n);
+
+	std::cout << m << " " << n <<  " M" << std::endl;
+	typename LinBox::DenseVector<Ring>::iterator y_p;
+	for (int i = 0; i < m; ++ i) {
+		r. assign (x[i], r.one);
+		A. applyTranspose(y, x);
+		for(y_p = y. begin(); y_p != y. end(); ++ y_p)
+			if (! r.isZero(*y_p))
+				std::cout << i+1 << " " << y_p - y.begin() + 1 << " " << *y_p << std::endl;
+		r. assign (x[i], r.zero);
+	}
+	std::cout << "0 0 0" << std::endl;
+}
+
+
+int main(int ac, char* av[])
+{
+	if (ac < 2)
+	{	std::cout << "usage: " << av[0] <<
+		" options block-groups." << std::endl;
+		std::cout << av[0] << " -r 1 2 3 a4 1 1" << std::endl;
+		std::cout <<
+		"for lightly randomized matrix similar to direct sum of 3 copies of companion " << std::endl
+		<< "matrix of (x-1)^2 and one copy of companion matrix of (x^4 + x + 3)^1." << std::endl;
+	}
+
+	typedef NTL_ZZ Ring;
+	Ring Z;
+	typedef Companion<Ring> BB;
+	int acp; char* avp[ac];
+	string opts;
+	stripOptions(acp, avp, opts, ac, av);
+	//std::cout << "number of triples: " << acp << std::endl;
+	//for (int i = 0; i < acp; ++ i)
+	//	std::cout << avp[i];
+	//std::cout << std::endl;
+	//std::cout << "Begin to ....\n";
+	list<BB*> L;
+
+	for (int i = 0; i < acp; i += 3)
+		augmentBB(L, avp[i], atoi(avp[i+1]), atoi(avp[i+2]), Z);
+
+	DirectSum<BB> A(L);
+	//std::cout <<"Option: " << opts.c_str() << std::endl;
+
+	if (opts.size() >= 1)
+	{	if (opts[0] == 'r')
+		{
+			// into sparse matrix, then 3n row ops with corresponding col ops
+			DenseMatrix<Ring> B(Z,A.rowdim(), A.coldim());
+			//MatrixDomain<Ring> MD(Z);
+			LinBox::MatrixHom::map (B, A);
+
+			scramble(B);
+			printMatrix(B);
+			// delete B;
+		}
+
+		if (opts[0] == 'R') { throw LinBox::NotImplementedYet(); }
+		// into dense matrix, then many row ops
+		//...
+
+	}
+	else {
+		printMatrix (A);
+	}
+
+	return 0 ;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/examples/smith.C b/examples/smith.C
index fb852af..f359bb4 100644
--- a/examples/smith.C
+++ b/examples/smith.C
@@ -47,6 +47,8 @@
   This example was used during the design process of the adaptive algorithm.
   */
 
+#include <linbox/linbox-config.h>
+
 #include <iostream>
 #include <string>
 #include <vector>
@@ -55,18 +57,17 @@
 using namespace std;
 
 
-#include "linbox/field/modular.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/algorithms/smith-form-sparseelim-local.h"
+#include <linbox/ring/modular.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/algorithms/smith-form-sparseelim-local.h>
 
-#include "linbox/util/timer.h"
+#include <linbox/util/timer.h>
 
-#include "linbox/field/unparametric.h"
-#include "linbox/field/local2_32.h"
-#include "linbox/field/PIR-modular-int32.h"
-#include "linbox/algorithms/smith-form-local.h"
-#include "linbox/algorithms/smith-form-iliopoulos.h"
-#include "linbox/algorithms/smith-form-adaptive.h"
+#include <linbox/ring/local2_32.h>
+#include <linbox/ring/PIR-modular-int32.h>
+#include <linbox/algorithms/smith-form-local.h>
+#include <linbox/algorithms/smith-form-iliopoulos.h>
+#include <linbox/algorithms/smith-form-adaptive.h>
 
 using namespace LinBox;
 
@@ -74,7 +75,7 @@ using namespace LinBox;
 
 
 template<class PIR>
-void Mat(BlasMatrix<PIR>& M, PIR& R, int n,
+void Mat(DenseMatrix<PIR>& M, PIR& R, int n,
 	 string src, string file, string format);
 
 template<class I1, class Lp> void distinct (I1 a, I1 b, Lp& c);
@@ -100,7 +101,7 @@ int main(int argc, char* argv[])
 
 	string algo = argv[1];
 
-	int m = atoi(argv[2]);
+	unsigned long m = atoi(argv[2]);
 
 	int n = atoi(argv[3]);
 
@@ -114,11 +115,16 @@ int main(int argc, char* argv[])
 
 	if (algo == "adaptive")
 	{
-		typedef PID_integer Ints;
+		typedef Givaro::ZRing<Integer> Ints;
 		Ints Z;
-		BlasMatrix<Ints> M(Z);
-		Mat(M, Z, n, src, file, format);
-		vector<integer> v(n);
+		DenseMatrix<Ints> M(Z);
+
+		std::ifstream input (file);
+		//MatrixStream<Ints> ms(Z, input);
+		M.read(input);
+		//Mat(M, Z, n, src, file, format);
+
+		DenseVector<Givaro::ZRing<Integer> > v(Z,(size_t)n);
 		T.start();
 		SmithFormAdaptive::smithForm(v, M);
 		T.stop();
@@ -137,9 +143,9 @@ int main(int argc, char* argv[])
 	}
 	else if (algo == "ilio") {
 
-		PIR R(m);
+                PIR R( (int32_t)m);
 
-		BlasMatrix<PIR> M(R);
+		DenseMatrix<PIR> M(R);
 
 		Mat(M, R, n, src, file, format);
 
@@ -154,7 +160,7 @@ int main(int argc, char* argv[])
 		List L;
 
 		for (size_t i = 0; i < M.rowdim(); ++i)
-			L.push_back(M[(int)i][i]);
+			L.push_back(M[(size_t)i][(size_t)i]);
 
 		list<pair<PIR::Element, size_t> > p;
 
@@ -172,13 +178,13 @@ int main(int argc, char* argv[])
 	else if (algo == "local") { // m must be a prime power
 
 		if (format == "sparse" ) {
-			typedef Modular<int32_t> Field;
+			typedef Givaro::Modular<int32_t> Field;
 			Field F(m);
 			std::ifstream input (argv[4]);
 			if (!input) { std::cerr << "Error opening matrix file: " << argv[1] << std::endl; return -1; }
 
 			MatrixStream<Field> ms( F, input );
-			SparseMatrix<Field, Vector<Field>::SparseSeq > B (ms);
+			SparseMatrix<Field, SparseMatrixFormat::SparseSeq > B (ms);
 			std::cout << "B is " << B.rowdim() << " by " << B.coldim() << std::endl;
 			if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(std::cout) << std::endl;
 
@@ -186,19 +192,19 @@ int main(int argc, char* argv[])
 
 			Integer p(m), im(m);
 			// Should better ask user to give the prime !!!
-			for(unsigned int k = 2; ( ( ! Givaro::probab_prime(p) ) && (p > 1) ); ++k)
-			 Givaro::root( p, im, k );
+                        Givaro::IntPrimeDom IPD;
+			for(unsigned int k = 2; ( ( ! IPD.isprime(p) ) && (p > 1) ); ++k)
+                                Givaro::root( p, im, k );
 
-			// using Sparse Elimination
+                        // using Sparse Elimination
 			LinBox::PowerGaussDomain< Field > PGD( F );
-			std::vector<std::pair<size_t,size_t> > local;
+			std::vector<std::pair<size_t,Field::Element> > local;
 
-			PGD(local, B, m, (int)p);
+			PGD(local, B, (int32_t)m, (int32_t)p);
 
 			typedef list< Field::Element > List;
 			List L;
-			for ( std::vector<std::pair<size_t,size_t> >::iterator
-			      p_it = local.begin(); p_it != local.end(); ++p_it) {
+			for ( auto p_it = local.begin(); p_it != local.end(); ++p_it) {
 				for(size_t i = 0; i < (size_t) p_it->first; ++i)
 					L.push_back((Field::Element)p_it->second);
 			}
@@ -219,9 +225,9 @@ int main(int argc, char* argv[])
 		}
 		else {
 
-			PIR R(m);
+			PIR R( (int32_t)m);
 
-			BlasMatrix<PIR> M(R);
+			DenseMatrix<PIR> M(R);
 
 			Mat(M, R, n, src, file, format);
 
@@ -255,7 +261,7 @@ int main(int argc, char* argv[])
 
 		Local2_32 R;
 
-		BlasMatrix<Local2_32> M(R);
+		DenseMatrix<Local2_32> M(R);
 
 		Mat(M, R, n, src, file, format);
 
@@ -298,7 +304,7 @@ int main(int argc, char* argv[])
 }
 
 template < class Ring >
-void scramble(BlasMatrix<Ring>& M)
+void scramble(DenseMatrix<Ring>& M)
 {
 
 	Ring R = M.field();
@@ -323,15 +329,15 @@ void scramble(BlasMatrix<Ring>& M)
 
 			if (a)
 
-				R.subin(M[(int)l][i], M[(int)l][j]);
+				R.subin(M[(size_t)l][(size_t)i], M[(size_t)l][(size_t)j]);
 
 			else
 
-				R.addin(M[(int)l][i], M[(int)l][j]);
+				R.addin(M[(size_t)l][(size_t)i], M[(size_t)l][(size_t)j]);
 
 			//K.axpy(c, M.getEntry(l, i), x, M.getEntry(l, j));
 			//M.setEntry(l, i, c);
-		}
+				}
 
 		//a = rand()%2;
 
@@ -339,10 +345,10 @@ void scramble(BlasMatrix<Ring>& M)
 
 			if (a)
 
-				R.subin(M[i][l], M[j][l]);
+				R.subin(M[(size_t)i][l], M[(size_t)j][l]);
 			else
 
-				R.addin(M[i][l], M[j][l]);
+				R.addin(M[(size_t)i][l], M[(size_t)j][l]);
 		}
 	}
 
@@ -354,14 +360,14 @@ void scramble(BlasMatrix<Ring>& M)
 
 		for ( int j = 0; j < n; ++ j) {
 
-			R. write(out, M[i][j]);
+			R. write(out, M[(size_t)i][(size_t)j]);
 
 			out << " ";
 		}
 
 		out << "\n";
 
-	}
+		}
 
 	//}
 }
@@ -370,9 +376,8 @@ void scramble(BlasMatrix<Ring>& M)
 // This mat will have s, near sqrt(n), distinct invariant factors,
 // each repeated twice), involving the s primes 101, 103, ...
 template <class PIR>
-void RandomRoughMat(BlasMatrix<PIR>& M, PIR& R, int n) {
-	typename PIR::Element zero; R.init(zero, 0);
-	M.resize(n, n, zero);
+void RandomRoughMat(DenseMatrix<PIR>& M, PIR& R, int n) {
+	M.resize((size_t)n, (size_t)n, R.zero);
 	if (n > 10000) {cerr << "n too big" << endl; exit(-1);}
 	int jth_factor[130] =
 	{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67,
@@ -389,8 +394,8 @@ void RandomRoughMat(BlasMatrix<PIR>& M, PIR& R, int n) {
 	{
 		typename PIR::Element v; R.init(v, jth_factor[25+j]);
 		for (int k = j ; k > 0 && i < n ; --k)
-		{   M[i][i] = v; ++i;
-			if (i < n) {M[i][i] = v; ++i;}
+		{   M[(size_t)i][(size_t)i] = v; ++i;
+			if (i < n) {M[(size_t)i][(size_t)i] = v; ++i;}
 		}
 	}
 	scramble(M);
@@ -399,13 +404,12 @@ void RandomRoughMat(BlasMatrix<PIR>& M, PIR& R, int n) {
 // This mat will have the same nontrivial invariant factors as
 // diag(1,2,3,5,8, ... 999, 0, 1, 2, ...).
 template <class PIR>
-void RandomFromDiagMat(BlasMatrix<PIR>& M, PIR& R, int n) {
-	typename PIR::Element zero; R.init(zero, 0);
-	M.resize(n, n, zero);
+void RandomFromDiagMat(DenseMatrix<PIR>& M, PIR& R, int n) {
+	M.resize((size_t)n,(size_t) n, R.zero);
 
 	for (int i= 0 ; i < n; ++i)
 
-		R.init(M[i][i], i % 1000 + 1);
+		R.init(M[(size_t)i][(size_t)i], i % 1000 + 1);
 	scramble(M);
 
 }
@@ -417,13 +421,12 @@ void RandomFromDiagMat(BlasMatrix<PIR>& M, PIR& R, int n) {
 // where fib(1) = 1, fib(2) = 2.  But note that, depending on n,
 // the last block may be truncated, thus repeating an earlier fibonacci number.
 template <class PIR>
-void RandomFibMat(BlasMatrix<PIR>& M, PIR& R, int n) {
-	typename PIR::Element zero; R.init(zero, 0);
-	M.resize(n, n, zero);
+void RandomFibMat(DenseMatrix<PIR>& M, PIR& R, int n) {
+	M.resize((size_t)n,(size_t) n, R.zero);
 
-	typename PIR::Element one; R.init(one, 1);
+	typename PIR::Element pmone; R.assign(pmone, R.one);
 
-	for (int i= 0 ; i < n; ++i) M[i][i] = one;
+	for (int i= 0 ; i < n; ++i) M[(size_t)i][(size_t)i] = R.one;
 
 	int j = 1, k = 0;
 
@@ -431,18 +434,18 @@ void RandomFibMat(BlasMatrix<PIR>& M, PIR& R, int n) {
 
 		if ( i == k) {
 
-			M[i][i+1] = zero;
+			M[(size_t)i][(size_t)i+1] = R.zero;
 
 			k += ++j;
 		}
 
 		else {
 
-			M[i][i+1] = one;
+			M[(size_t)i][(size_t)i+1] = pmone;
 
-			R.negin(one);
+			R.negin(pmone);
 		}
-		R.neg(M[i+1][i], M[i][i+1]);
+		R.neg(M[(size_t)i+1][(size_t)i], M[(size_t)i][(size_t)i+1]);
 	}
 	scramble(M);
 }
@@ -453,9 +456,8 @@ void RandomFibMat(BlasMatrix<PIR>& M, PIR& R, int n) {
 
 // Trefethen's challenge #7 mat (primes on diag, 1's on 2^e bands).
 template <class PIR>
-void TrefMat(BlasMatrix<PIR>& M, PIR& R, int n) {
-	typename PIR::Element zero; R.init(zero, 0);
-	M.resize(n, n, zero);
+void TrefMat(DenseMatrix<PIR>& M, PIR& R, int n) {
+	M.resize((size_t)n, (size_t)n, R.zero);
 
 	std::vector<int> power2;
 
@@ -472,17 +474,17 @@ void TrefMat(BlasMatrix<PIR>& M, PIR& R, int n) {
 
 	for ( i = 0; i < n; ++ i)
 
-		in >> M[i][i];
+		in >> M[(size_t)i][(size_t)i];
 
 	std::vector<int>::iterator p;
 
 	for ( i = 0; i < n; ++ i) {
 
 		for ( p = power2. begin(); (p != power2. end()) && (*p <= i); ++ p)
-			M[i][i - *p] = 1;
+			M[(size_t)i][(size_t)(i - *p)] = 1;
 
 		for ( p = power2. begin(); (p != power2. end()) && (*p < n - i); ++ p)
-			M[i][i + *p] = 1;
+			M[(size_t)i][(size_t)(i + *p)] = 1;
 	}
 
 }
@@ -496,8 +498,8 @@ struct pwrlist
 	}
 	integer operator[](int e)
 	{
-		for (int i = (int)m.size(); i <= e; ++i) m.push_back(m[1]*m[i-1]);
-		return m[e];
+		for (int i = (int)m.size(); i <= e; ++i) m.push_back(m[1]*m[(size_t)i-1]);
+		return m[(size_t)e];
 	}
 };
 
@@ -520,7 +522,7 @@ num& qread(num& Val, pwrlist& M, istream& in)
 }
 
 template <class PIR>
-void KratMat(BlasMatrix<PIR>& M, PIR& R, int q, istream& in)
+void KratMat(DenseMatrix<PIR>& M, PIR& R, int q, istream& in)
 {
 	pwrlist pwrs(q);
 	for (unsigned int i = 0; i < M.rowdim(); ++ i)
@@ -528,14 +530,16 @@ void KratMat(BlasMatrix<PIR>& M, PIR& R, int q, istream& in)
 		for ( unsigned int j = 0; j < M.coldim(); ++ j) {
 			int Val;
 			qread(Val, pwrs, in);
-			R. init (M[i][j], Val);
+			R. init (M[(size_t)i][(size_t)j], Val);
 		}
 }
 
 ///// end krat ////////////////////////////
+//! @bug this already exists elsewhere
 template<class I1, class Lp>
 void distinct (I1 a, I1 b, Lp& c)
-{ typename I1::value_type e;
+{
+	typename iterator_traits<I1>::value_type e;
 	size_t count = 0;
 	if (a != b) {e = *a; ++a; count = 1;}
 	else return;
@@ -577,10 +581,9 @@ void display(I b, I e)
   Also "tref" and file with format "kdense"
   */
 template <class PIR>
-void Mat(BlasMatrix<PIR>& M, PIR& R, int n,
+void Mat(DenseMatrix<PIR>& M, PIR& R, int n,
 	 string src, string file, string format) {
 
-	typename PIR::Element zero; R.init(zero, 0);
 	if (src == "random-rough") RandomRoughMat(M, R, n);
 
 	else if (src == "random") RandomFromDiagMat(M, R, n);
@@ -599,7 +602,7 @@ void Mat(BlasMatrix<PIR>& M, PIR& R, int n,
 
 		in >> rdim >> cdim;
 
-		M. resize (rdim, cdim);
+		M. resize ((size_t)rdim, (size_t)cdim);
 
 		integer Val;
 
@@ -611,7 +614,7 @@ void Mat(BlasMatrix<PIR>& M, PIR& R, int n,
 
 					in >> Val;
 
-					R. init (M[i][j], Val);
+					R. init (M[(size_t)i][(size_t)j], Val);
 
 				}
 		}
@@ -634,7 +637,7 @@ void Mat(BlasMatrix<PIR>& M, PIR& R, int n,
 
 				if ( i == 0) break;
 
-				R. init (M[i-1][j-1], val);
+				R. init (M[(size_t)i-1][(size_t)j-1], val);
 
 			} while (true);
 
diff --git a/examples/smithvalence.C b/examples/smithvalence.C
index 110d3d9..4487684 100644
--- a/examples/smithvalence.C
+++ b/examples/smithvalence.C
@@ -26,7 +26,8 @@
   \brief Valence of sparse matrix over Z or Zp.
   \ingroup examples
   */
-//#include "linbox-config.h"
+#include <linbox/linbox-config.h>
+
 #include <iostream>
 
 #include "smithvalence.h"
@@ -35,28 +36,33 @@ using namespace LinBox;
 
 int main (int argc, char **argv)
 {
-	//     commentator().setMaxDetailLevel (-1);
-	//     commentator().setMaxDepth (-1);
-	//     commentator().setReportStream (std::cerr);
-
+    commentator().setMaxDetailLevel (-1);
+    commentator().setMaxDepth (-1);
+    commentator().setReportStream (std::cerr);
+    
 
 	if (argc < 2 || argc > 4) {
-		std::cerr << "Usage: valence <matrix-file-in-supported-format> [-ata|-aat|valence] [coprime]" << std::endl;
+		std::cerr << "Usage: smithvalence <matrix-file-in-supported-format> [-ata|-aat|valence] [coprime]" << std::endl;
+        std::cerr << "       Optional parameters valence and coprime are integers." << std::endl;
+        std::cerr << "       Prime factors of valence will be used for local computation." << std::endl;
+        std::cerr << "       coprime will be used for overall rank computation." << std::endl;
+
+
 		return -1;
 	}
 
 	std::ifstream input (argv[1]);
 	if (!input) { std::cerr << "Error opening matrix file " << argv[1] << std::endl; return -1; }
 
-	PID_integer ZZ;
-	MatrixStream< PID_integer > ms( ZZ, input );
-	typedef SparseMatrix<PID_integer>  Blackbox;
+	Givaro::ZRing<Integer> ZZ;
+	MatrixStream< Givaro::ZRing<Integer> > ms( ZZ, input );
+	typedef SparseMatrix<Givaro::ZRing<Integer> >  Blackbox;
 	Blackbox A (ms);
 	input.close();
 
 	std::cout << "A is " << A.rowdim() << " by " << A.coldim() << std::endl;
 
-	PID_integer::Element val_A;
+	Givaro::ZRing<Integer>::Element val_A;
 
  Givaro::Timer chrono; chrono.start();
 	if (argc >= 3) {
@@ -164,7 +170,7 @@ int main (int argc, char **argv)
                     }
                 }
             }
-            
+
 			std::vector<size_t>::const_iterator rit=ranks.begin();
 			// unsigned long modrank = *rit;
 			for(++rit; rit!= ranks.end(); ++rit) {
@@ -182,7 +188,8 @@ int main (int argc, char **argv)
 	     dit != SmithDiagonal.end(); ++dit) {
 		if (*dit == si) ++num;
 		else {
-			std::cerr << '[' << si << ',' << num << "] ";
+			if (num > 0)
+				std::cerr << '[' << si << ',' << num << "] ";
 			num=1;
 			si = *dit;
 		}
diff --git a/examples/smithvalence.h b/examples/smithvalence.h
index 4305d89..91cdc0d 100644
--- a/examples/smithvalence.h
+++ b/examples/smithvalence.h
@@ -22,23 +22,24 @@
 
 /**\file examples/smithvalence.h
  * @example  examples/smithvalence.h
-  \brief Valence of sparse matrix over Z or Zp.
-  \ingroup examples
-  */
-
+ \brief Valence of sparse matrix over Z or Zp.
+ \ingroup examples
+ */
+ 
+#include <givaro/modular.h>
 #include <givaro/givintnumtheo.h>
-#include "linbox/field/gf2.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/givaro.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/blackbox/transpose.h"
-#include "linbox/blackbox/compose.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/solutions/rank.h"
-#include "linbox/solutions/valence.h"
-#include "linbox/algorithms/smith-form-sparseelim-local.h"
-#include "linbox/util/matrix-stream.h"
-#include "linbox/util/timer.h"
+
+#include <givaro/gf2.h>
+#include <linbox/field/field-traits.h>
+#include <linbox/blackbox/transpose.h>
+#include <linbox/blackbox/compose.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/solutions/rank.h>
+#include <linbox/solutions/valence.h>
+#include <linbox/algorithms/smith-form-sparseelim-local.h>
+#include <linbox/util/matrix-stream.h>
+#include <linbox/util/timer.h>
+#include <linbox/util/error.h>
 
 
 template<class Field>
@@ -46,7 +47,7 @@ unsigned long& TempLRank(unsigned long& r, char * filename, const Field& F)
 {
 	std::ifstream input(filename);
 	LinBox::MatrixStream< Field > msf( F, input );
-	LinBox::SparseMatrix<Field,typename LinBox::Vector<Field>::SparseSeq> FA(msf);
+	LinBox::SparseMatrix<Field,LinBox::SparseMatrixFormat::SparseSeq> FA(msf);
 	input.close();
 	LinBox::Timer tim; tim.start();
 	LinBox::rankin(r, FA);
@@ -71,36 +72,36 @@ unsigned long& TempLRank(unsigned long& r, char * filename, const LinBox::GF2& F
 unsigned long& LRank(unsigned long& r, char * filename,Givaro::Integer p)
 {
 
-Givaro::Integer maxmod16; LinBox::FieldTraits<LinBox::GivaroZpz<Givaro::Std16> >::maxModulus(maxmod16);
-Givaro::Integer maxmod32; LinBox::FieldTraits<LinBox::GivaroZpz<Givaro::Std32> >::maxModulus(maxmod32);
-Givaro::Integer maxmod53; LinBox::FieldTraits<LinBox::Modular<double> >::maxModulus(maxmod53);
-Givaro::Integer maxmod64; LinBox::FieldTraits<LinBox::GivaroZpz<Givaro::Std64> >::maxModulus(maxmod64);
+	Givaro::Integer maxmod16; LinBox::FieldTraits<Givaro::Modular<int16_t> >::maxModulus(maxmod16);
+	Givaro::Integer maxmod32; LinBox::FieldTraits<Givaro::Modular<int32_t> >::maxModulus(maxmod32);
+	Givaro::Integer maxmod53; LinBox::FieldTraits<Givaro::Modular<double> >::maxModulus(maxmod53);
+	Givaro::Integer maxmod64; LinBox::FieldTraits<Givaro::Modular<int64_t> >::maxModulus(maxmod64);
 	if (p == 2) {
 		LinBox::GF2 F2;
 		return TempLRank(r, filename, F2);
 	}
 	else if (p <= maxmod16) {
-		typedef LinBox::GivaroZpz<Givaro::Std16> Field;
+		typedef Givaro::Modular<int16_t> Field;
 		Field F(p);
 		return TempLRank(r, filename, F);
 	}
 	else if (p <= maxmod32) {
-		typedef LinBox::GivaroZpz<Givaro::Std32> Field;
+		typedef Givaro::Modular<int32_t> Field;
 		Field F(p);
 		return TempLRank(r, filename, F);
 	}
 	else if (p <= maxmod53) {
-		typedef LinBox::Modular<double> Field;
+		typedef Givaro::Modular<double> Field;
 		Field F(p);
 		return TempLRank(r, filename, F);
 	}
 	else if (p <= maxmod64) {
-		typedef LinBox::GivaroZpz<Givaro::Std64> Field;
+		typedef Givaro::Modular<int64_t> Field;
 		Field F(p);
 		return TempLRank(r, filename, F);
 	}
 	else {
-		typedef LinBox::GivaroZpz<Givaro::Integer> Field;
+		typedef Givaro::Modular<Givaro::Integer> Field;
 		Field F(p);
 		return TempLRank(r, filename, F);
 	}
@@ -109,33 +110,33 @@ Givaro::Integer maxmod64; LinBox::FieldTraits<LinBox::GivaroZpz<Givaro::Std64> >
 
 std::vector<size_t>& PRank(std::vector<size_t>& ranks, size_t& effective_exponent, char * filename,Givaro::Integer p, size_t e, size_t intr)
 {
-    effective_exponent = e;
-    Givaro::Integer maxmod;
-	LinBox::FieldTraits<LinBox::GivaroZpz<Givaro::Std64> >::maxModulus(maxmod);
+	effective_exponent = e;
+	Givaro::Integer maxmod;
+	LinBox::FieldTraits<Givaro::Modular<int64_t> >::maxModulus(maxmod);
 	if (p <= maxmod) {
-		typedef LinBox::GivaroZpz<Givaro::Std64> Ring;
+		typedef Givaro::Modular<int64_t> Ring;
 		int64_t lp(p);
-        Givaro::Integer q = pow(p,e); int64_t lq(q);
+		Givaro::Integer q = pow(p,e); int64_t lq(q);
 		if (q >Givaro::Integer(lq)) {
 			std::cerr << "Power rank might need extra large composite (" << p << '^' << e << ")." << std::endl;
-                // << "Such a large composite is not yet implemented ..." << std::endl;
-			q = p; lq = (int64_t)q;
-            for(effective_exponent=1; q == Givaro::Integer(lq); ++effective_exponent) {
-				q *= p; lq = (int64_t)q;
+			q = p;
+			for(effective_exponent=1; q <= Ring::maxCardinality(); ++effective_exponent) {
+				q *= p;
 			}
-			q/=p; --effective_exponent; lq = (int64_t)q;
+			q/=p; --effective_exponent;
+			lq = (int64_t)q;
 			std::cerr << "First trying: " << lq << " (=" << p << '^' << effective_exponent << ", without further warning this will be sufficient)." << std::endl;
 		}
 		Ring F(lq);
 		std::ifstream input(filename);
 		LinBox::MatrixStream<Ring> ms( F, input );
-		LinBox::SparseMatrix<Ring, LinBox::Vector<Ring>::SparseSeq > A (ms);
+		LinBox::SparseMatrix<Ring,LinBox::SparseMatrixFormat::SparseSeq > A (ms);
 		input.close();
 		LinBox::PowerGaussDomain< Ring > PGD( F );
 
-                LinBox::Timer tim; tim.clear(); tim.start();
+		LinBox::Timer tim; tim.clear(); tim.start();
 		PGD.prime_power_rankin( lq, lp, ranks, A, A.rowdim(), A.coldim(), std::vector<size_t>());
-                tim.stop();
+		tim.stop();
 		F.write(std::cerr << "Ranks over ") << " are " ;
 		for(std::vector<size_t>::const_iterator rit=ranks.begin(); rit != ranks.end(); ++rit)
 			std::cerr << *rit << ' ';
@@ -149,74 +150,81 @@ std::vector<size_t>& PRank(std::vector<size_t>& ranks, size_t& effective_exponen
 	return ranks;
 }
 
-#include "linbox/algorithms/smith-form-sparseelim-poweroftwo.h"
+#include <linbox/algorithms/smith-form-sparseelim-poweroftwo.h>
 
 
 std::vector<size_t>& PRankPowerOfTwo(std::vector<size_t>& ranks, size_t& effective_exponent, char * filename, size_t e, size_t intr)
 {
-    effective_exponent = e;
-    typedef uint64_t RingElements;
-    if (e > 63) {
-        std::cerr << "Power rank power of two might need extra large composite (2^" << e << ")." << std::endl;
-        std::cerr << "First trying: 63, without further warning this will be sufficient)." << std::endl;
-        effective_exponent = 63;
-    }
-    
-    std::ifstream input(filename);
-    typedef LinBox::UnparametricField<int64_t> Ring;
-    Ring F;
-    LinBox::MatrixStream<Ring> ms( F, input );
-    LinBox::SparseMatrix<Ring, LinBox::Vector<Ring>::SparseSeq > A (ms);
-    input.close();
-    LinBox::PowerGaussDomainPowerOfTwo< uint64_t > PGD;
-    
-    LinBox::Timer tim; tim.clear(); tim.start();
-    PGD.prime_power_rankin( effective_exponent, ranks, A, A.rowdim(), A.coldim(), std::vector<size_t>());
-    tim.stop();
-    std::cerr << "Ranks over 2^" << effective_exponent << " are " ;
-    for(std::vector<size_t>::const_iterator rit=ranks.begin(); rit != ranks.end(); ++rit)
-        std::cerr << *rit << ' ';
-    std::cerr << ' ' << tim << std::endl;
-    return ranks;
+	effective_exponent = e;
+	if (e > 63) {
+		std::cerr << "Power rank power of two might need extra large composite (2^" << e << ")." << std::endl;
+		std::cerr << "First trying: 63, without further warning this will be sufficient)." << std::endl;
+		effective_exponent = 63;
+	}
+
+	std::ifstream input(filename);
+	typedef Givaro::ZRing<int64_t> Ring;
+	Ring F;
+	LinBox::MatrixStream<Ring> ms( F, input );
+	LinBox::SparseMatrix<Ring,LinBox::SparseMatrixFormat::SparseSeq > A (ms);
+	input.close();
+	LinBox::PowerGaussDomainPowerOfTwo< uint64_t > PGD;
+
+	LinBox::Timer tim; tim.clear(); tim.start();
+	PGD.prime_power_rankin( effective_exponent, ranks, A, A.rowdim(), A.coldim(), std::vector<size_t>());
+	tim.stop();
+	std::cerr << "Ranks over 2^" << effective_exponent << " are " ;
+	for(std::vector<size_t>::const_iterator rit=ranks.begin(); rit != ranks.end(); ++rit)
+		std::cerr << *rit << ' ';
+	std::cerr << ' ' << tim << std::endl;
+	return ranks;
 }
 
 std::vector<size_t>& PRankInteger(std::vector<size_t>& ranks, char * filename,Givaro::Integer p, size_t e, size_t intr)
 {
-    typedef LinBox::GivaroZpz<Givaro::Integer> Ring;
-    Givaro::Integer q = pow(p,e);
-    Ring F(q);
-    std::ifstream input(filename);
-    LinBox::MatrixStream<Ring> ms( F, input );
-    LinBox::SparseMatrix<Ring, LinBox::Vector<Ring>::SparseSeq > A (ms);
-    input.close();
-    LinBox::PowerGaussDomain< Ring > PGD( F );
-    
-    LinBox::Timer tim; tim.clear(); tim.start();
-    PGD.prime_power_rankin( q, p, ranks, A, A.rowdim(), A.coldim(), std::vector<size_t>());
-    tim.stop();
-    F.write(std::cerr << "Ranks over ") << " are " ;
-    for(std::vector<size_t>::const_iterator rit=ranks.begin(); rit != ranks.end(); ++rit)
-        std::cerr << *rit << ' ';
-    std::cerr << ' ' << tim << std::endl;
-    return ranks;
+	typedef Givaro::Modular<Givaro::Integer> Ring;
+	Givaro::Integer q = pow(p,e);
+	Ring F(q);
+	std::ifstream input(filename);
+	LinBox::MatrixStream<Ring> ms( F, input );
+	LinBox::SparseMatrix<Ring,LinBox::SparseMatrixFormat::SparseSeq > A (ms);
+	input.close();
+	LinBox::PowerGaussDomain< Ring > PGD( F );
+
+	LinBox::Timer tim; tim.clear(); tim.start();
+	PGD.prime_power_rankin( q, p, ranks, A, A.rowdim(), A.coldim(), std::vector<size_t>());
+	tim.stop();
+	F.write(std::cerr << "Ranks over ") << " are " ;
+	for(std::vector<size_t>::const_iterator rit=ranks.begin(); rit != ranks.end(); ++rit)
+		std::cerr << *rit << ' ';
+	std::cerr << ' ' << tim << std::endl;
+	return ranks;
 }
 
 std::vector<size_t>& PRankIntegerPowerOfTwo(std::vector<size_t>& ranks, char * filename, size_t e, size_t intr)
 {
-    typedef LinBox::PID_integer Ring;
-    Ring ZZ;
-    std::ifstream input(filename);
-    LinBox::MatrixStream<Ring> ms( ZZ, input );
-    LinBox::SparseMatrix<Ring, LinBox::Vector<Ring>::SparseSeq > A (ms);
-    input.close();
-    LinBox::PowerGaussDomainPowerOfTwo< Givaro::Integer > PGD;
-    
-    LinBox::Timer tim; tim.clear(); tim.start();
-    PGD.prime_power_rankin( e, ranks, A, A.rowdim(), A.coldim(), std::vector<size_t>());
-    tim.stop();
-    std::cerr << "Ranks over 2^" << e << " are " ;
-    for(std::vector<size_t>::const_iterator rit=ranks.begin(); rit != ranks.end(); ++rit)
-        std::cerr << *rit << ' ';
-    std::cerr << ' ' << tim << std::endl;
-    return ranks;
+	typedef Givaro::ZRing<Givaro::Integer> Ring;
+	Ring ZZ;
+	std::ifstream input(filename);
+	LinBox::MatrixStream<Ring> ms( ZZ, input );
+	LinBox::SparseMatrix<Ring,LinBox::SparseMatrixFormat::SparseSeq > A (ms);
+	input.close();
+	LinBox::PowerGaussDomainPowerOfTwo< Givaro::Integer > PGD;
+
+	LinBox::Timer tim; tim.clear(); tim.start();
+	PGD.prime_power_rankin( e, ranks, A, A.rowdim(), A.coldim(), std::vector<size_t>());
+	tim.stop();
+	std::cerr << "Ranks over 2^" << e << " are " ;
+	for(std::vector<size_t>::const_iterator rit=ranks.begin(); rit != ranks.end(); ++rit)
+		std::cerr << *rit << ' ';
+	std::cerr << ' ' << tim << std::endl;
+	return ranks;
 }
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/solve.C b/examples/solve.C
index 87fe6e4..b7d0dd8 100644
--- a/examples/solve.C
+++ b/examples/solve.C
@@ -28,13 +28,16 @@
  * @example  examples/solve.C
  */
 
+#include <linbox/linbox-config.h>
+
 #include <iostream>
 
-#include "linbox/field/modular.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/solutions/solve.h"
-#include "linbox/util/matrix-stream.h"
-#include "linbox/solutions/methods.h"
+#include <givaro/modular.h>
+#include <givaro/zring.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/solutions/solve.h>
+#include <linbox/util/matrix-stream.h>
+#include <linbox/solutions/methods.h>
 
 using namespace LinBox;
 using namespace std;
@@ -88,38 +91,36 @@ int main (int argc, char **argv)
 
 
 	if (ModComp) {
-
-		typedef Modular<double> Field;
+                cout<<"Computation is done over Z/("<<atoi(argv[ModComp])<<")"<<endl;
+		typedef Givaro::Modular<double> Field;
 		double q = atof(argv[ModComp]);
+		typedef DenseVector<Field> DenseVector ;
 		Field F(q);
 		MatrixStream< Field > ms ( F, input );
 		SparseMatrix<Field> A (ms);  // A.write(std::cout);
 		cout << "A is " << A.rowdim() << " by " << A.coldim() << endl;
-
-		std::vector<Field::Element> X( A.coldim()),B(A.rowdim());
+                if (A.rowdim() <= 20 && A.coldim() <= 20) A.write(std::cerr << "A:=",Tag::FileFormat::Maple) << ';' << std::endl;
+		DenseVector X(F, A.coldim()),B(F, A.rowdim());
 		if (createB) {
-			cerr << "Creating a random {-1,1} vector " << endl;
-			std::vector<Field::Element> U( A.coldim() );
-			for(std::vector<Field::Element>::iterator it=U.begin();
+			cerr << "Creating a random {-1,1} vector U, B is AU (to have a consistent system)" << endl;
+			DenseVector U(F, A.coldim() );
+			for(DenseVector::iterator it=U.begin();
 			    it != U.end(); ++it)
 				if (drand48() <0.5)
-					F.init(*it,-1);
+					F.assign(*it,F.mOne);
 				else
-					F.init(*it,1);
+					F.assign(*it,F.one);
 			A.apply(B,U);
 		}
 		else {
-			for(std::vector<Field::Element>::iterator it=B.begin();
+			for(DenseVector::iterator it=B.begin();
 			    it != B.end(); ++it)
-				invect >> *it;
+				F.read(invect,*it);
 		}
 
 		//         A.write(std::cout << "A: ") << std::endl;
 
-		std::cout << "B is [";
-		for(std::vector<Field::Element>::const_iterator it=B.begin();it != B.end(); ++it)
-			F.write(cout, *it) << " ";
-		std::cout << "]" << std::endl;
+		std::cout << "B is " << B << std::endl;
 
 		Timer chrono;
 
@@ -131,7 +132,7 @@ int main (int argc, char **argv)
 		chrono.stop();
 
 		std::cout << "(Sparse Gauss) Solution is [";
-		for(std::vector<Field::Element>::const_iterator it=X.begin();it != X.end(); ++it)
+		for(DenseVector::const_iterator it=X.begin();it != X.end(); ++it)
 			F.write(cout, *it) << " ";
 		std::cout << "]" << std::endl;
 		std::cout << "CPU time (seconds): " << chrono.usertime() << std::endl<<std::endl;;
@@ -143,7 +144,7 @@ int main (int argc, char **argv)
 		chrono.stop();
 
 		std::cout << "(BlasElimination) Solution is [";
-		for(std::vector<Field::Element>::const_iterator it=X.begin();it != X.end(); ++it)
+		for(DenseVector::const_iterator it=X.begin();it != X.end(); ++it)
 			F.write(cout, *it) << " ";
 		std::cout << "]" << std::endl;
 		std::cout << "CPU time (seconds): " << chrono.usertime() << std::endl<< std::endl;
@@ -156,7 +157,7 @@ int main (int argc, char **argv)
 		chrono.stop();
 
 		std::cout << "(Wiedemann) Solution is [";
-		for(std::vector<Field::Element>::const_iterator it=X.begin();it != X.end(); ++it)
+		for(DenseVector::const_iterator it=X.begin();it != X.end(); ++it)
 			F.write(cout, *it) << " ";
 		std::cout << "]" << std::endl;
 		std::cout << "CPU time (seconds): " << chrono.usertime() << std::endl<<std::endl;;
@@ -169,7 +170,7 @@ int main (int argc, char **argv)
 		chrono.stop();
 
 		std::cout << "(Lanczos) Solution is [";
-		for(std::vector<Field::Element>::const_iterator it=X.begin();it != X.end(); ++it)
+		for(DenseVector::const_iterator it=X.begin();it != X.end(); ++it)
 			F.write(cout, *it) << " ";
 		std::cout << "]" << std::endl;
 		std::cout << "CPU time (seconds): " << chrono.usertime() << std::endl<< std::endl;
@@ -185,7 +186,7 @@ int main (int argc, char **argv)
 		chrono.stop();
 
 		std::cout << "(Block Lanczos) Solution is [";
-		for(std::vector<Field::Element>::const_iterator it=X.begin();it != X.end(); ++it)
+		for(DenseVector::const_iterator it=X.begin();it != X.end(); ++it)
 			F.write(cout, *it) << " ";
 		std::cout << "]" << std::endl;
 		std::cout << "CPU time (seconds): " << chrono.usertime() << std::endl<< std::endl;
@@ -193,79 +194,80 @@ int main (int argc, char **argv)
 
 	}
 	else {
-
-		PID_integer ZZ;
-		MatrixStream< PID_integer > ms( ZZ, input );
-		SparseMatrix<PID_integer> A (ms);
-		PID_integer::Element d;
+                cout<<"Computation is done over Q"<<endl;
+		Givaro::ZRing<Integer> ZZ;
+		typedef DenseVector<Givaro::ZRing<Integer> > DenseVector ;
+		MatrixStream< Givaro::ZRing<Integer> > ms( ZZ, input );
+		SparseMatrix<Givaro::ZRing<Integer> > A (ms);
+		Givaro::ZRing<Integer>::Element d;
 		std::cout << "A is " << A.rowdim() << " by " << A.coldim() << std::endl;
-
-		std::vector<PID_integer::Element> X( A.coldim()),B(A.rowdim());
+                if (A.rowdim() <= 20 && A.coldim() <= 20) A.write(std::cerr << "A:=",Tag::FileFormat::Maple) << ';' << std::endl;
+		DenseVector X(ZZ, A.coldim()),B(ZZ, A.rowdim());
 
 		if (createB) {
-			cerr << "Creating a random {-1,1} vector " << endl;
-			for(std::vector<PID_integer::Element>::iterator it=B.begin();
-			    it != B.end(); ++it)
+			cerr << "Creating a random {-1,1} vector U, B is AU" << endl;
+			DenseVector U(ZZ, A.coldim() );
+			for(DenseVector::iterator it=U.begin();
+			    it != U.end(); ++it)
 				if (drand48() <0.5)
 					*it = -1;
 				else
 					*it = 1;
+			A.apply(B,U);
 		}
 		else {
-			for(std::vector<PID_integer::Element>::iterator it=B.begin();
+			for(DenseVector::iterator it=B.begin();
 			    it != B.end(); ++it)
 				invect >> *it;
 		}
 
 
-		std::cout << "B is [";
-		for(std::vector<PID_integer::Element>::const_iterator it=B.begin();
-		    it != B.end(); ++it)
-			ZZ.write(cout, *it) << " ";
-		std::cout << "]" << std::endl;
+		std::cout << "B is " << B << std::endl;
 
 
 		Timer chrono;
 
-		// Wiedemann
-		std::cout << "Wiedemann" << std::endl;
-		chrono.start();
-		solve (X, d, A, B, Method::Wiedemann());
-		chrono.stop();
-
-		std::cout << "(Wiedemann) Solution is [";
-		for(std::vector<PID_integer::Element>::const_iterator it=X.begin();it != X.end(); ++it)
-			ZZ.write(cout, *it) << " ";
-		std::cout << "] / ";
-		ZZ.write(std::cout, d) << std::endl;
-		std::cout << "CPU time (seconds): " << chrono.usertime() << std::endl;
-
 		// BlasElimination
-		std::cout << "BlasElimination" << std::endl;
+                std::cout << "BlasElimination" << std::endl;
+                chrono.start();
+                solve (X, d, A, B, Method::BlasElimination());
+                chrono.stop();
+
+ 		std::cout << "(BlasElimination) Solution is [";
+                for(DenseVector::const_iterator it=X.begin();it != X.end(); ++it)
+ 			ZZ.write(cout, *it) << " ";
+                std::cout << "] / ";
+                ZZ.write(std::cout, d)<< std::endl;
+                std::cout << "CPU time (seconds): " << chrono.usertime() << std::endl;
+
+		// Sparse Elimination
+		std::cout << "Sparse Elimination" << std::endl;
 		chrono.start();
-		solve (X, d, A, B, Method::BlasElimination());
+		solve (X, d, A, B, Method::SparseElimination());
 		chrono.stop();
 
-		std::cout << "(BlasElimination) Solution is [";
-		for(std::vector<PID_integer::Element>::const_iterator it=X.begin();it != X.end(); ++it)
+		std::cout << "(SparseElimination) Solution is [";
+		for(DenseVector::const_iterator it=X.begin();it != X.end(); ++it)
 			ZZ.write(cout, *it) << " ";
 		std::cout << "] / ";
 		ZZ.write(std::cout, d)<< std::endl;
 		std::cout << "CPU time (seconds): " << chrono.usertime() << std::endl;
 
-		// Sparse Elimination
-		std::cout << "Sparse Elimination" << std::endl;
+                		// Wiedemann
+		std::cout << "Wiedemann" << std::endl;
 		chrono.start();
-		solve (X, d, A, B, Method::SparseElimination());
+		solve (X, d, A, B, Method::Wiedemann());
 		chrono.stop();
 
-		std::cout << "(SparseElimination) Solution is [";
-		for(std::vector<PID_integer::Element>::const_iterator it=X.begin();it != X.end(); ++it)
+		std::cout << "(Wiedemann) Solution is [";
+		for(DenseVector::const_iterator it=X.begin();it != X.end(); ++it)
 			ZZ.write(cout, *it) << " ";
 		std::cout << "] / ";
-		ZZ.write(std::cout, d)<< std::endl;
+		ZZ.write(std::cout, d) << std::endl;
 		std::cout << "CPU time (seconds): " << chrono.usertime() << std::endl;
 
+
+                
 #if 0
 		// Lanczos
 		std::cout << "Lanczos" << std::endl;
@@ -274,7 +276,7 @@ int main (int argc, char **argv)
 		chrono.stop();
 
 		std::cout << "(Lanczos) Solution is [";
-		for(std::vector<PID_integer::Element>::const_iterator it=X.begin();it != X.end(); ++it)
+		for(DenseVector::const_iterator it=X.begin();it != X.end(); ++it)
 			ZZ.write(cout, *it) << " ";
 		std::cout << "] / ";
 		ZZ.write(std::cout, d) << std::endl;
@@ -289,7 +291,7 @@ int main (int argc, char **argv)
 		chrono.stop();
 
 		std::cout << "(Block Lanczos) Solution is [";
-		for(std::vector<PID_integer::Element>::const_iterator it=X.begin();it != X.end(); ++it)
+		for(DenseVector::const_iterator it=X.begin();it != X.end(); ++it)
 			ZZ.write(cout, *it) << " ";
 		std::cout << "] / ";
 		ZZ.write(std::cout, d) << std::endl;
@@ -300,11 +302,10 @@ int main (int argc, char **argv)
 	return 0;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/solver/Makefile.am b/examples/solver/Makefile.am
new file mode 100644
index 0000000..d1bebb9
--- /dev/null
+++ b/examples/solver/Makefile.am
@@ -0,0 +1,38 @@
+# Copyright (c) 2010 the LinBox group
+# This file is part of LinBox
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the  GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# ========LICENCE========
+#/
+
+INCLUDES=-I$(top_srcdir)
+
+AM_CPPFLAGS=-g  $(NTL_CFLAGS) $(ATLAS_CFLAGS)
+LDADD = $(top_builddir)/linbox/liblinbox.la  $(NTL_LIBS) $(ATLAS_LIBS) $(LDFLAGS)
+
+EXTRA_PROGRAMS=t-rdisolve
+
+t_rdisolve_SOURCES = \
+	t-rdisolve.C
+
+# no /bin if LinBox is uncompiled
+#LINBOX_BIN=$(LINBOX)/bin
+LINBOX_BIN=$(bindir)
+
+# for compilation of new examples
+%:%.C
+	$(CXX) $(CPPFLAGS) $*.C -o $*  $(shell $(LINBOX_BIN)/linbox-config --cflags --libs) $(LDADD)
diff --git a/examples/solver/t-rdisolve.C b/examples/solver/t-rdisolve.C
new file mode 100644
index 0000000..bc6811d
--- /dev/null
+++ b/examples/solver/t-rdisolve.C
@@ -0,0 +1,529 @@
+/*
+ * examples/solver/t-rdisolve.C
+ *
+ * Copyright (C) 2004, 2005, 2010  D. Pritchard, P. Giorgi
+ *
+ * This file is part of LinBox.
+ *
+ *   LinBox is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU Lesser General Public License as
+ *   published by the Free Software Foundation, either version 2 of
+ *   the License, or (at your option) any later version.
+ *
+ *   LinBox 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 Lesser General Public License for more details.
+ *
+ *   You should have received a copy of the GNU Lesser General Public
+ *   License along with LinBox.  If not, see
+ *   <http://www.gnu.org/licenses/>.
+ */
+
+/* linbox/examples/solver/t-rdisolve.C
+ * demo, testing, time-comparison of certified rational/diophantine system solver
+ *
+ * Written by David Pritchard  <daveagp at mit.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+#define LIFTING_PROGRESS
+#define RSTIMING
+
+#include "givaro/modular.h"
+#include "givaro/zring.h"
+#include "linbox/blackbox/diagonal.h"
+#include "linbox/algorithms/rational-solver.h"
+#include "linbox/algorithms/vector-fraction.h"
+#include "linbox/algorithms/diophantine-solver.h"
+#include <iostream>
+#include <fstream>
+#include "linbox/randiter/random-prime.h"
+
+#include "linbox/field/unparametric.h"
+#include "givaro/zring.h"
+#include "linbox/field/ntl.h"
+
+#include "linbox/field/archetype.h"
+//#include "linbox/field/givaro.h"
+#include "linbox/vector/vector-domain.h"
+
+#include <vector>
+
+#include "linbox/field/archetype.h"
+#include "linbox/vector/vector-domain.h"
+
+// #include "linbox/../tests/test-common.C"
+using namespace std;
+using namespace LinBox;
+
+#define random_01() ((double)rand() / ((double)(RAND_MAX)+1))
+
+int  n               = 5;
+int  c               = 5;
+int  defaultPrime    = 0;
+int  primeBits       = 14;         // note: should be <= 15 to use Givaro::Modular<Log16>
+int  numPrimes       = 1;
+bool useDeterm       = true;
+bool useRandom       = false;
+bool useDiophantine  = false;
+int  printStuff      = 0;
+int  showTiming      = 0;
+
+bool    useFiles           = false;
+bool    sparseMatrix       = false;
+integer eBoundCmd          = 1000;
+double  singularProportion = 0;
+bool    inconsistent       = false;
+
+int useTimer  = true;
+int entrySeed = 12345;
+int trials    = 1;
+
+int destroyColumns = 0;
+
+bool testPidDouble = false;
+
+int levelAsInt = (int)SL_CERTIFIED;
+
+static Argument args[] = {
+	{ 'n', 0, "Row dimension of test matrix",                        TYPE_INT,     &n },
+	{ 'c', 0, "Column dimension of test matrix (c<=0 => c=n)",       TYPE_INT,     &c },
+	{ 'm', 0, "Try solving with up to m primes",                     TYPE_INT,     &numPrimes },
+	{ 'q', 0, "Solve first over the field Z/qZ (0: pick randomly)",  TYPE_INT,     &defaultPrime },
+	{ 'g', 0, "Subsequently generate primes that are g bits long",   TYPE_INT,     &primeBits },
+	{ 'r', 0, "Set random solving on/off",                           TYPE_BOOL,    &useRandom },
+	{ 'd', 0, "Set deterministic solving on/off",                    TYPE_BOOL,    &useDeterm },
+	{ 'z', 0, "Set diophantine solving on/off",                      TYPE_BOOL,    &useDiophantine },
+	{ 'p', 0, "Print lots of detail, tree levels (0,1,2,3)",           TYPE_INT,     &printStuff },
+	{ 'f', 0, "Read space-separated data from files td-{A, b}.txt?", TYPE_BOOL,    &useFiles},
+	{ 's', 0, "(If f=0N)  Say td-A.txt is in sparse format",         TYPE_BOOL,    &sparseMatrix},
+	{ 'b', 0, "(If f=OFF) Entry bound is (-b, b]",                   TYPE_INTEGER, &eBoundCmd},
+	{ 'x', 0, "(If f=OFF) Make roughly x*n dependant rows",          TYPE_DOUBLE,  &singularProportion},
+	{ 'i', 0, "(If f=OFF) Force inconsistent system",                TYPE_BOOL,    &inconsistent},
+	{ 't', 0, "(If f=OFF) Randomize with timer?",                    TYPE_BOOL,    &useTimer},
+	{ 'w', 0, "(If f=OFF, t=OFF) Randomize with seed w",             TYPE_INT,     &entrySeed},
+	{ 'e', 0, "Test PID_double",                                     TYPE_BOOL,    &testPidDouble},
+	{ 'k', 0, "Repeat trials k times",                               TYPE_INT,     &trials},
+	{ 'l', 0, "Level: 0=Monte Carlo, 1=Las Vegas, 2=Certified",      TYPE_INT,     &levelAsInt},
+	{ 'o', 0, "Set o columns to zero at random",                     TYPE_INT,     &destroyColumns}
+}; // 7 more options (yu vs jah) and the whole alphabet is covered
+
+int trialCount=0;
+integer* Aentries;
+integer* bentries;
+
+template <class Ring, class Field>
+int test()
+{
+	trialCount++;
+
+	typedef typename Ring::Element RingElement;
+
+	Ring R;
+	VectorDomain<Ring> VD (R);
+	typedef typename Vector<Ring>::Dense Vector;
+	typedef DenseMatrix<Ring> Matrix;
+	Matrix A(R, n, c);
+	MatrixDomain<Ring> MD(R);
+	typedef typename Ring::Element Integer;
+	Vector b(n);
+
+	if (sparseMatrix) {
+		// reading A from td-A.txt file
+		ifstream inA, inb;
+		inA.open("td-A.txt");
+		A.read(inA);
+		cout << "Matrix is sparse with n="<<A.rowdim()<<" rows by c="<<A.coldim()<<" columns\n";
+		n = (int) A.rowdim();
+		c = (int) A.coldim();
+		inA.close();
+		// reading b from td-b.txt
+		b.resize(n);
+		inb.open("td-b.txt");
+		for (int i=0; i<n; i++)
+			inb >> b[i];
+		inb.close();
+	}
+	else {
+		// reading A from Aentrie vector
+		for (int i=0; i<n; i++)
+			for (int j=0; j<c; j++)
+				R.init(A[i][j], Aentries[i*c+j]);
+		// reading b from bentry vector
+		typename Vector::iterator bi=b.begin();
+		for (int i=0; bi!=b.end(); bi++, i++)
+			R.init(*bi, bentries[i]);
+	}
+
+
+	if (trialCount==1 && (printStuff>2)) {cout << "b:\n"; VD.write(cout, b);}
+
+	if (trialCount==1 && (printStuff>2)) {cout << "\nA:\n"; A.write(cout);}
+
+	Field F(defaultPrime>0 ? defaultPrime : 2);
+	cout << "Testing with Z of type '";
+	R.write(cout);
+	cout<<"' and Z/pZ of type '";
+	F.write(cout)<<"'"<<endl;
+
+	typedef RationalSolver<Ring, Field, class RandomPrime, DixonTraits> QSolver;
+	typedef DiophantineSolver<QSolver> ZSolver;
+
+	//typedef std::vector<std::pair<RingElement, RingElement> > FractionVector;
+	typedef VectorFraction<Ring> FractionVector;
+	FractionVector x(R,c);
+	int result=0;
+	SolverLevel level = (SolverLevel)levelAsInt;
+
+	for (int iteration=0; iteration<3; iteration++) {
+		if (iteration==0 && !useDeterm) continue;
+		if (iteration==1 && !useRandom) continue;
+		if (iteration==2 && !useDiophantine) continue;
+
+		// no more cleaning
+#if 0
+		//clear x
+		for (FractionVector::Dense::iterator i=x.begin(); i!=x.end(); i++) {
+			R.assign(i->first, R.zero);
+			R.assign(i->second, R.zero);
+		}
+#endif
+
+		QSolver* rsolver;
+		if (defaultPrime == 0)
+			rsolver = new QSolver(R, LinBox::RandomPrime(primeBits));
+		else
+			rsolver = new QSolver(defaultPrime, R, LinBox::RandomPrime(primeBits));
+
+		ZSolver zsolver(*rsolver);
+		SolverReturnStatus s;
+
+		if (iteration==0) {
+			cout << "Solving deterministically.\n";
+			s = zsolver.solve(x.numer, x.denom, A, b, numPrimes, level);
+		}
+		else if (iteration==1) {
+			cout << "Solving randomly.\n";
+			s = zsolver.randomSolve(x.numer, x.denom, A, b, numPrimes, level);
+		}
+		else {
+			cout << "Solving diophantically.\n";
+			s = zsolver.diophantineSolve(x.numer, x.denom, A, b, numPrimes, level);
+		}
+		cout << "solverReturnStatus: " << solverReturnString[(int)s] << "\n";
+
+#ifdef RSTIMING
+		rsolver->reportTimes(cout);
+#endif
+		if (s == SS_OK)	{
+			VectorFraction<Ring> red(x);
+
+			if (printStuff > 0) {
+				if (useDiophantine){
+					cout<<"Number of system solved   : "<<zsolver.numSolutionsNeeded<<endl;
+					cout<<"Number of system failed   : "<<zsolver.numFailedCallsToSolver<<endl;
+					cout<<"Number of system revelant : "<<zsolver.numRevelantSolutions<<endl;
+
+				}
+				cout<<"Reduced solution: ";
+				integer tmp;
+				size_t maxbits=0;
+				for (int i=0;i<n;++i){
+					R.convert(tmp,x.numer[i]);
+					maxbits=(maxbits > tmp.bitsize() ? maxbits: tmp.bitsize());
+				}
+				R.convert(tmp,x.denom);
+				cout<<"numerators hold over "<<maxbits<<" bits and denominators hold over "<<tmp.bitsize()<<" bits\n";
+			}
+			if (printStuff > 1) {
+				if (useFiles){
+					ofstream out("td-x.txt");
+					out<< "Reduced solution: ";
+					red.write(out) << "\n";
+					out.close();
+				}
+				else{
+					cout << "Reduced solution: ";
+					red.write(cout) << "\n";
+				}
+			}
+			Vector LHS(n), RHS(b);
+			// check that Ax = b, if it thought it was okay
+			MD.vectorMul(LHS, A, red.numer);
+			VD.mulin(RHS, red.denom);
+			if (VD.areEqual(LHS, RHS))
+				cout << "Ax=b : Yes" << endl;
+			else {
+				cout << "Ax=b : No" << endl;
+				if (level >= SL_LASVEGAS)
+					cout << "ERROR: Las Vegas or Certified solver should never return wrong answer" << endl;
+			}
+
+			if (iteration==2 && level == SL_CERTIFIED) {
+				// check certificate of minimality z
+				// should satisfy that zA is integral, and den(z.b) == den(y)
+
+				Integer dp, tmp, denzb;
+				VectorFraction<Ring> z(zsolver.lastCertificate);
+				R.assign(dp, R.zero);
+				typename Vector::iterator zi = z.numer.begin();
+				typename Vector::iterator bi = b.begin();
+				for (; bi != b.end(); bi++, zi++)
+					R.addin(dp, R.mul(tmp, *bi, *zi));
+
+				R.gcd(denzb, dp, z.denom);
+				R.div(denzb, z.denom, denzb);
+
+				VectorFraction<Ring> tmpvf(x);
+				bool certified = R.areEqual(denzb, tmpvf.denom);
+				if (!certified)
+					cout << "ERROR Failed den(z.b) == den(y)" << endl;
+
+				bool certified2 = true;
+				Integer* nza = new Integer[c]; //z.numer * A
+				for (int i=0; i<c; i++) R.assign(nza[i], R.zero);
+				for (int i=0; i<n; i++)
+					for (int j=0; j<c; j++)
+						R.addin(nza[j], R.mul(tmp, z.numer[i], A[i][j]));
+				for (int i=0; i<c; i++)
+					certified2 &= R.isDivisor(nza[i], z.denom);
+				if (!certified2)
+					cout << "ERROR Failed zA integral" << endl;
+
+				if (certified && certified2)
+					cout << "Solution is certified correctly as having minimal denominator." << endl;
+			}
+		}
+		else if (s==SS_INCONSISTENT && level == SL_CERTIFIED) {
+			cout << "About to check certificate of inconsistency";
+			VectorFraction<Ring> cert(zsolver.lastCertificate);
+			if (printStuff > 1) {
+				cout << ": ";
+				cert.write(cout);
+			}
+			cout << endl;
+			std::vector<Integer> certA(c);
+			if (R.isZero(cert.denom))
+				cout << "ERROR: Zero denom in inc-certificate. May not have been generated." << endl;
+
+			Integer certb, tmp;
+
+			for (int i=0; i<c; i++) R.assign(certA[i], R.zero);
+			R.assign(certb, R.zero);
+
+			for (int i=0; i<n; i++)
+				for (int j=0; j<c; j++)
+					R.addin(certA[j], R.mul(tmp, cert.numer[i], A[i][j]));
+			for (int i=0; i<n; i++)
+				R.addin(certb, R.mul(tmp, cert.numer[i], b[i]));
+
+			bool certifies1 = true; //check certificate
+			if (R.isZero(certb)) {
+				cout << "ERROR: Product of certificate . b is zero!" << endl;
+				certifies1 = false;
+			}
+			bool certifies2 = true;
+			for (size_t i=0; certifies2 && i<A.rowdim(); i++)
+				if (!certifies2) {
+					certifies2 = false;
+					cout << "ERROR: entry " << i << " of certificate . A is nonzero" << endl;
+				}
+			if (certifies1 && certifies2)
+				cout << "System is certified correctly as inconsistent." << endl;
+		}
+		delete rsolver;
+	}
+	return result;
+
+};
+
+template <class Field>
+int fieldTest()
+{
+	return
+	0
+	//+test<NTL_ZZ, Field>()
+	+test<Givaro::ZRing<Integer>, Field>()
+	//+(testPidDouble?test<PID_double, Field>():0)
+	// */
+	;
+};
+
+void testAllFields()
+{
+	//fieldTest<Givaro::Modular<Log16> >();
+	//fieldTest<NTL_zz_p>();
+
+	//fieldTest<Givaro::Modular<int16_t> >();
+
+	//fieldTest<Givaro::Modular<int> >();
+	fieldTest<Givaro::Modular<double> >();
+
+
+	//fieldTest<Givaro::Modular<int32_t> >();           //broken?
+	//fieldTest<Givaro::Modular<int64_t> >();           //broken?
+	//fieldTest<Givaro::GFq>();                   //broken?
+
+	//fieldTest<Givaro::Montgomery>();    // appears to be broken in current build
+	//fieldTest<NTL_ZZ_p>();       // appears to be broken in current build
+	//fieldTest<Givaro::Modular<integer> >();
+
+	// */
+	// this takes a long time to compile with all fields
+	// so comment out unused ones when debugging
+}
+
+void genTestData()
+{
+	bool* auxRow = new bool[n];
+	int auxRows = 0;
+	for (int i=0; i<n; i++) {
+		auxRow[i] = (random_01() <= singularProportion);
+		if (auxRow[i]) auxRows++;
+	}
+	cout << "at least " << auxRows << " dependent rows" << endl;
+
+	if (inconsistent && auxRows == 0)
+	{ auxRows++; auxRow[(int)(random_01()*n)] = true; }
+
+	integer eBound(eBoundCmd);
+	if (auxRows > 0 && auxRows < n)
+		eBound /= (n-auxRows);
+	if (eBound == 0) {
+		cout << "WARNING: 'b' dropped to 0. Changed to 1, try increasing 'b'." << endl;
+		eBound = 1;
+	}
+
+	Givaro::ZRing<Integer> Z;
+	Givaro::ZRing<Integer>::RandIter ri(Z, 2*eBound,entrySeed); //for some reason this iterator tends to give numbers with
+	//large common factors, so we perturb the data a bit
+	bool notRandomEnough = (eBound >> 64) > 0;
+	double bigStuff = ((long long)1)<<25;
+	for (int i=0; i<n; i++) {
+		ri.random(bentries[i]);
+		bentries[i] -= eBound-1;
+		if (notRandomEnough) bentries[i] += static_cast<int>((random_01()-0.5)*bigStuff);
+	}
+
+	for (int i=0; i<n*c; i++) {
+		ri.random(Aentries[i]);
+		Aentries[i] -= eBound-1;
+		if (notRandomEnough) Aentries[i] += static_cast<int>((random_01()-0.5)*bigStuff);
+	}
+
+	int whichInconsistent = (int)(random_01()*auxRows);
+	//make singular rows
+	for (int i=0; i<n; i++)
+		if (auxRow[i]) {
+			for (int j=0; j<c; j++) Aentries[c*i+j] = 0;
+			bentries[i] = 0;
+			for (int k=0; k<n; k++)
+				if (!auxRow[k]) {
+					int m = (int)(random_01()*2)*2 - 1;
+					for (int j=0; j<c; j++)
+						Aentries[c*i+j] += Aentries[c*k+j]*m;
+					bentries[i] += bentries[k]*m;
+				}
+			if (inconsistent) {
+				if (whichInconsistent == 0)
+					bentries[i] += (int)(random_01()*2)*2 - 1;
+				whichInconsistent--;
+			}
+		}
+	delete[] auxRow ;
+	trialCount = 0; //so new data get printed
+
+	int columnsToDestroy = destroyColumns;
+	if (columnsToDestroy > c) {
+		cout << "WARNING, o > c. Lowering o." << endl;
+		columnsToDestroy = c;
+	}
+
+	for (int i=0; i<c; i++) {
+		if (random_01()*(c-i-1) < columnsToDestroy) {
+			for (int j=0; j<n; j++)
+				Aentries[c*j+i] = 0;
+			columnsToDestroy--;
+		}
+	}
+}
+
+int main (int argc, char **argv)
+{
+	parseArguments (argc, argv, args, true);
+
+	if (useTimer) {
+		entrySeed = static_cast<unsigned>(time(NULL));
+		useTimer = false;
+	}
+
+	writeCommandString (cout, args, argv[0]);
+
+	if (c <= 0) c += n;
+	if (c <= 0) {
+		cout << "WARNING, c <= -n; resulting column dimension changed from nonpositive value to 1" << endl;
+		c = 1;
+	}
+	if (!sparseMatrix)
+		cout << "Matrix is dense with n="<<n<<" rows by c="<<c<<" columns\n";
+
+	cout << "Seed: " << entrySeed <<"\n";
+	srand(entrySeed);
+
+	Aentries = new integer[n*c];
+	bentries = new integer[n];
+
+	if (useFiles && !sparseMatrix) {
+
+		ifstream in, in2;
+		in.open("td-b.txt");
+		for (int i=0; i<n; i++)
+			in >> bentries[i];
+		in.close();
+		in2.open("td-A.txt");
+		for (int i=0; i<n*c; i++)
+			in2 >> Aentries[i];
+		in2.close();
+	}
+
+	for (int j=0; j < trials; j++) {
+		if (!useFiles) genTestData();
+		testAllFields();
+		cout << "finished trial " << (j+1) << " of " << trials << endl;
+	}
+
+	delete[] Aentries;
+	delete[] bentries;
+
+	return 0;
+}
+
+//! @todo come up with better test data, so can have a big singular matrix of all 0..9
+//! @todo change "probability of dependence" to "set X dependent rows"
+//! @bug fixme : seems to not work for n >= 10000
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/sparseelimdet.C b/examples/sparseelimdet.C
index c990188..9a61e29 100644
--- a/examples/sparseelimdet.C
+++ b/examples/sparseelimdet.C
@@ -26,19 +26,19 @@
  \brief Gaussian elimination determinant of sparse matrix over Z or Zp.
  \ingroup examples
  */
-//#include "linbox-config.h"
+
+#include <linbox/linbox-config.h>
 
 #include <iostream>
 #include <vector>
 #include <utility>
 
-#include "linbox/field/modular.h"
-#include "linbox/field/gf2.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/blackbox/zero-one.h"
-#include "linbox/solutions/rank.h"
-#include "linbox/solutions/det.h"
-#include "linbox/util/matrix-stream.h"
+#include <linbox/ring/modular.h>
+#include <linbox/field/gf2.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/blackbox/zero-one.h>
+#include <linbox/solutions/rank.h>
+#include <linbox/solutions/det.h>
 
 using namespace LinBox;
 using namespace std;
@@ -59,38 +59,40 @@ int main (int argc, char **argv)
 
 	if (argc == 2) { // determinant over the integers.
 
-		PID_integer ZZ;
-		PID_integer::Element d;
-		MatrixStream<PID_integer> ms( ZZ, input );
-		SparseMatrix<PID_integer, Vector<PID_integer>::SparseSeq > A ( ms );
+		Givaro::ZRing<Integer> ZZ;
+		SparseMatrix<Givaro::ZRing<Integer> > A ( ZZ );
+		A.read(input);
 		cout << "A is " << A.rowdim() << " by " << A.coldim() << endl;
 
 		SE.strategy(Specifier::PIVOT_LINEAR);
+		Givaro::ZRing<Integer>::Element d;
 		det (d, A, SE);
 
 		ZZ.write(cout << "Determinant is ", d) << endl;
 	}
-	if (argc == 3) {
+	if (argc == 3) { // determinant over a finite field
+		typedef Givaro::Modular<double> Field;
 		double q = atof(argv[2]);
-		typedef Modular<double> Field;
-		Field::Element d;
 		Field F(q);
-		MatrixStream<Field> ms( F, input );
-		SparseMatrix<Field, Vector<Field>::SparseSeq > B (ms);
+		SparseMatrix<Field> B (F);
+		B.read(input);
 		cout << "B is " << B.rowdim() << " by " << B.coldim() << endl;
 		if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(cout) << endl;
 
-
-		SE.strategy(Specifier::PIVOT_NONE);
 		// using Sparse Elimination
+		SE.strategy(Specifier::PIVOT_NONE);
+		Field::Element d;
 		det (d, B, SE);
-		if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(cout) << endl;
+
+		if (B.rowdim() <= 20 && B.coldim() <= 20)
+			B.write(cout) << endl;
 		F.write(cout << "Determinant is ", d) << endl;
 
-		SE.strategy(Specifier::PIVOT_LINEAR);
 		// using Sparse Elimination with reordering
+		SE.strategy(Specifier::PIVOT_LINEAR);
 		detin (d, B, SE);
-		if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(cout) << endl;
+		if (B.rowdim() <= 20 && B.coldim() <= 20)
+			B.write(cout) << endl;
 		F.write(cout << "Determinant is ", d) << endl;
 
 
@@ -99,11 +101,10 @@ int main (int argc, char **argv)
 	return 0;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/examples/sparseelimrank.C b/examples/sparseelimrank.C
index 5d3f49b..61ab60d 100644
--- a/examples/sparseelimrank.C
+++ b/examples/sparseelimrank.C
@@ -26,19 +26,21 @@
  \brief Gaussian elimination Rank of sparse matrix over Z or Zp.
  \ingroup examples
  */
-//#include "linbox-config.h"
+
+#include <linbox/linbox-config.h>
 
 #include <iostream>
 #include <vector>
 #include <utility>
+#include <givaro/zring.h>
+#include <givaro/givrational.h>
 
-#include "linbox/field/modular.h"
-#include "linbox/field/gf2.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/blackbox/zero-one.h"
-#include "linbox/solutions/rank.h"
-#include "linbox/util/matrix-stream.h"
-#include "linbox/field/givaro.h"
+#include <givaro/modular.h>
+#include <linbox/field/gf2.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/blackbox/zero-one.h>
+#include <linbox/solutions/rank.h>
+#include <linbox/util/matrix-stream.h>
 
 using namespace LinBox;
 using namespace std;
@@ -48,6 +50,7 @@ int main (int argc, char **argv)
 	commentator().setMaxDetailLevel (-1);
 	commentator().setMaxDepth (-1);
 	commentator().setReportStream (std::cerr);
+    commentator().setBriefReportStream (std::cout);
 
 	if (argc < 2 || argc > 3)
 	{	cerr << "Usage: rank <matrix-file-in-supported-format> [<p>]" << endl; return -1; }
@@ -64,37 +67,40 @@ int main (int argc, char **argv)
 		   is an integer matrix and our concept is that we are getting the rank of that
 		   matrix by some blackbox magic inside linbox.
 		   */
-		LinBox::GivaroRational ZZ;
-		MatrixStream<GivaroRational> ms( ZZ, input );
-		SparseMatrix<GivaroRational> A ( ms );
+		Givaro::QField<Givaro::Rational> QQ;
+		MatrixStream<Givaro::QField<Givaro::Rational>> ms( QQ, input );
+		SparseMatrix<Givaro::QField<Givaro::Rational>, SparseMatrixFormat::SparseSeq > A ( ms );
+        if (A.rowdim() <= 20 && A.coldim() <= 20) A.write(std::cerr << "A:=",Tag::FileFormat::Maple) << ';' << std::endl;
+
+
 		cout << "A is " << A.rowdim() << " by " << A.coldim() << endl;
 
 		LinBox::rank (r, A, Method::SparseElimination() );
 
-		cout << "Rank is " << r << endl;
+		cout << "Z Rank is " << r << endl;
 	}
 	if (argc == 3) {
 		double q = atof(argv[2]);
-		typedef Modular<double> Field;
+		typedef Givaro::Modular<double> Field;
 		Field F(q);
 		MatrixStream<Field> ms( F, input );
-		SparseMatrix<Field, Vector<Field>::SparseSeq > B (ms);
+		SparseMatrix<Field, SparseMatrixFormat::SparseSeq > B (ms);
 		cout << "B is " << B.rowdim() << " by " << B.coldim() << endl;
 		if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(cout) << endl;
 
 
 		Method::SparseElimination SE;
-		SE.strategy(Specifier::PIVOT_NONE);
-		// using Sparse Elimination
-		LinBox::rank (r, B, SE);
-		if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(cout) << endl;
-		cout << "Rank is " << r << endl;
+// 		SE.strategy(Specifier::PIVOT_NONE);
+// 		// using Sparse Elimination
+// 		LinBox::rank (r, B, SE);
+// 		if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(cout) << endl;
+// 		cout << "Rank is " << r << endl;
 
 		SE.strategy(Specifier::PIVOT_LINEAR);
 		// using Sparse Elimination
-		LinBox::rank (r, B, SE);
+		LinBox::rankin (r, B, SE);
 		if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(cout) << endl;
-		cout << "Rank is " << r << endl;
+		F.write(cout << "Rank is " << r << " over ") << endl;
 
 
 	}
diff --git a/examples/test.sh b/examples/test.sh
new file mode 100755
index 0000000..5ec2367
--- /dev/null
+++ b/examples/test.sh
@@ -0,0 +1,32 @@
+#!/bin/bash 
+
+# written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+# part of LinBox, see COPYING
+
+set -o nounset                              # Treat unset variables as an error
+
+fail() {
+	echo "fail"
+}
+
+success() {
+	echo "ok"
+}
+
+
+pass="true"
+
+echo -n "check rank ... "
+rank_cmd="Rank\sis\s"
+./rank  data/test.matrix 7 > linbox-tmp.data
+result=`cat linbox-tmp.data | grep ${rank_cmd} | sed 's/'"$rank_cmd"'\([0-9]*\).*/\1/'`
+[ "$result" -eq "9" ] && success || { fail ;  pass="false" ; }
+
+echo -n "check rank ... "
+./rank  data/test.matrix > linbox-tmp.data
+result=`cat linbox-tmp.data | grep ${rank_cmd} | sed 's/'"$rank_cmd"'\([0-9]*\).*/\1/'`
+[ "$result" -eq "10" ] && success || { fail ; pass="false" ; }
+
+
+[ "$pass" == "true" ] && { success ; exit 0  ;} || { fail ; exit 1 ;};
+
diff --git a/examples/valence.C b/examples/valence.C
index 400ef88..e566480 100644
--- a/examples/valence.C
+++ b/examples/valence.C
@@ -26,15 +26,16 @@
  * \ingroup examples
  * @example  examples/valence.C
  */
-//#include "linbox-config.h"
+#include <linbox/linbox-config.h>
+
 #include <iostream>
 
-#include "linbox/field/modular.h"
-#include "linbox/blackbox/transpose.h"
-#include "linbox/blackbox/compose.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/solutions/valence.h"
-#include "linbox/util/matrix-stream.h"
+#include <linbox/ring/modular.h>
+#include <linbox/blackbox/transpose.h>
+#include <linbox/blackbox/compose.h>
+#include <linbox/matrix/sparse-matrix.h>
+#include <linbox/solutions/valence.h>
+#include <linbox/util/matrix-stream.h>
 
 using namespace LinBox;
 
@@ -53,14 +54,14 @@ int main (int argc, char **argv)
 	std::ifstream input (argv[1]);
 	if (!input) { std::cerr << "Error opening matrix file " << argv[1] << std::endl; return -1; }
 
-	PID_integer ZZ;
-	MatrixStream< PID_integer > ms( ZZ, input );
-	typedef SparseMatrix<PID_integer>  Blackbox;
+	Givaro::ZRing<Integer> ZZ;
+	MatrixStream< Givaro::ZRing<Integer> > ms( ZZ, input );
+	typedef SparseMatrix<Givaro::ZRing<Integer> >  Blackbox;
 	Blackbox A (ms);
 
 	std::cout << "A is " << A.rowdim() << " by " << A.coldim() << std::endl;
 
-	PID_integer::Element val_A;
+	Givaro::ZRing<Integer>::Element val_A;
 
 
 	if (argc == 3) {
@@ -90,11 +91,10 @@ int main (int argc, char **argv)
 	return 0;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/incremente-versions b/incremente-versions
new file mode 100755
index 0000000..414388b
--- /dev/null
+++ b/incremente-versions
@@ -0,0 +1,115 @@
+#!/bin/csh -f
+# Copyright(c) 2011 LinBox
+# Copyright(c)'1994-2009 by The Givaro group
+# Imported and modified from Givaro's by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+# see the COPYING file for more details.
+
+
+set conf = configure.ac
+set ver  = Makefile.am
+
+#verbatim second argument of AC_INIT
+set verb = `grep ^AC_INIT $conf | cut -d',' -f2`
+#removes spaces and brackets
+set vern = `echo "$verb" | sed 's/ //g;s/\[//;s/\]//'`
+echo "Current version is $vern."
+
+echo -n "Increment library version ? (y/n)"
+set answ = $<
+if ("$answ" == "y") then
+	set line = `fgrep -n  ^AC_INIT $conf  | cut -d':' -f1`  #gets the line
+    set macro = `echo "$vern" | cut -d'.' -f1` #a version number is macro.minor.micro
+    set minor = `echo "$vern" | cut -d'.' -f2`
+	set micro = `echo "$vern" | cut -d'.' -f3`
+	set tmpfile = `mktemp` #tempfile
+	set sedfile = `mktemp` #temp sed file
+	set pmicro = `echo $micro`
+    @ pmicro ++
+	set pminor = `echo $minor`
+    @ pminor ++
+	set pmacro = `echo $macro`
+    @ pmacro ++
+	echo "Increment micro revision number ($vern -> $macro.$minor.$pmicro) ? press '0' "
+	echo "Increment minor revision number ($vern -> $macro.$pminor.0) ? press '1' "
+	echo -n "Increment macro revision number ($vern -> $pmacro.0.0) ? press '2' "
+	set increm = $<
+	switch ($increm)
+		case 0:
+			set newv = "[$macro.$minor.$pmicro]"
+			breaksw
+		case 1:
+			set newv = "[$macro.$pminor.0]"
+			breaksw
+		case 2:
+			set newv = "[$pmacro.0.0]"
+			breaksw
+		default:
+			set newv = "$verb"
+			echo "'$increm' read. Not incrementing anything."
+			breaksw
+	endsw
+
+	#replacing [ ] and . with escaped version for sed would understand them as 'operators'
+	echo "$line s/$verb/$newv/" | sed 's/\./\\\./g;s/\[/\\\[/g;s/\]/\\\]/g' > $sedfile
+	sed -f $sedfile $conf > $tmpfile
+	#clean up
+	\rm -f $sedfile
+	#diff for changes
+	diff -u0 $conf $tmpfile
+	#if something was changed, confirm incrementation :
+    if ("$newv" != "$verb") then
+		echo -n "Confirmation of incrementation ? (yes/no)"
+		set answ = $<
+        set backupconf = $conf.back$$
+		if ("$answ" == "yes") then
+			\cp -p $conf $backupconf
+            echo "Back-up of $conf made in $backupconf. Now overwriting $conf."
+			\mv -f $tmpfile $conf
+		else
+			echo "'$answ' read. Not incrementing anything."
+			\rm -f $tmpfile
+			exit 0 ;
+		endif
+		#now change Makefile accordingly
+		echo -n "Incrementing Makefile revision accordingly"
+		set tmpfile = `mktemp` #tempfile
+		set sedfile = `mktemp` #tempfile
+		switch ($increm)
+			case 0:
+				echo -n "s/VERSION.*/VERSION=$macro.$minor.$pmicro/"  >> $sedfile
+				breaksw
+			case 1:
+				echo "s/VERSION.*/VERSION=$macro.$pminor.0/"  > $sedfile
+				breaksw
+			case 2:
+				echo "s/VERSION.*/VERSION=$pmacro.0.0/"  > $sedfile
+				breaksw
+			default:
+				echo "Something abnormal happened"
+				exit 1
+				breaksw
+		endsw
+		sed -f $sedfile $ver > $tmpfile
+		\rm -f $sedfile
+		diff -u0 $ver $tmpfile
+		echo -n "Confirmation of incrementation ? (yes/no) "
+		set answ = $<
+		if ("$answ" == "yes") then
+			\mv -f $tmpfile $ver
+			echo " your old $conf is destroyed..."
+			\rm -f $backupconf
+		else
+			echo "'$answ' read. Not incrementing anything."
+			echo " your old $conf is restored..."
+			\rm -f $tmpfile
+			\mv -f $backupconf $conf
+			exit 0
+		endif
+
+	endif
+else
+	echo "'$answ' read. Not doing anything."
+endif
+
+exit 0
+
diff --git a/interfaces/Makefile.in b/interfaces/Makefile.in
deleted file mode 100644
index 7e2d2ff..0000000
--- a/interfaces/Makefile.in
+++ /dev/null
@@ -1,665 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = interfaces
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-dvi-recursive install-exec-recursive \
-	install-html-recursive install-info-recursive \
-	install-pdf-recursive install-ps-recursive install-recursive \
-	installcheck-recursive installdirs-recursive pdf-recursive \
-	ps-recursive uninstall-recursive
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
-  distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
-	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
-	distdir
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-SUBDIRS = driver kaapi maple sage
-all: all-recursive
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps interfaces/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps interfaces/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    $(am__make_dryrun) \
-	      || test -d "$(distdir)/$$subdir" \
-	      || $(MKDIR_P) "$(distdir)/$$subdir" \
-	      || exit 1; \
-	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-	    $(am__relativize); \
-	    new_distdir=$$reldir; \
-	    dir1=$$subdir; dir2="$(top_distdir)"; \
-	    $(am__relativize); \
-	    new_top_distdir=$$reldir; \
-	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-	    ($(am__cd) $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$new_top_distdir" \
-	        distdir="$$new_distdir" \
-		am__remove_distdir=: \
-		am__skip_length_check=: \
-		am__skip_mode_fix=: \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-recursive
-all-am: Makefile
-installdirs: installdirs-recursive
-installdirs-am:
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
-	install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-	all all-am check check-am clean clean-generic clean-libtool \
-	ctags ctags-recursive distclean distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-ps install-ps-am install-strip installcheck \
-	installcheck-am installdirs installdirs-am maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
-	uninstall uninstall-am
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/interfaces/driver/Makefile.am b/interfaces/driver/Makefile.am
index 8779c20..4c4e947 100644
--- a/interfaces/driver/Makefile.am
+++ b/interfaces/driver/Makefile.am
@@ -22,13 +22,13 @@ pkgincludesubdir=$(includedir)/interfaces/driver
 
 AM_CPPFLAGS=-I$(top_srcdir) -I. -I../../linbox
 
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR $(GMP_CFLAGS) $(FFLAS_FFPACK_CFLAGS) $(BLAS_CFLAGS) $(GIVARO_CFLAGS)
+AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR   
 
 #ifdef HAVE_NTL
 AM_CXXFLAGS +=$(NTL_CFLAGS)
 #endif
 
-#LDADD= $(GMP_LIBS) $(NTL_LIBS) $(BLAS_LIBS) $(MAPLE_LIBS) $(GIVARO_LIBS) "../../linbox/liblinbox.la -z muldefs"
+#LDADD= $(GMP_LIBS) $(NTL_LIBS)  $(MAPLE_LIBS)  "../../linbox/liblinbox.la -z muldefs"
 
 lib_LTLIBRARIES=liblbdriver.la
 
@@ -46,7 +46,7 @@ liblbdriver_la_SOURCES= lb-element.C 	\
 # \
 			#  lb-solve.C
 
-liblbdriver_la_LDFLAGS=$(GIVARO_LIBS) $(GMP_LIBS) $(NTL_LIBS) $(BLAS_LIBS) $(LDFLAGS) $(top_srcdir)/linbox/liblinbox.la -Wl,-zmuldefs
+liblbdriver_la_LDFLAGS=  $(NTL_LIBS) $(LDFLAGS) $(top_srcdir)/linbox/liblinbox.la -Wl,-zmuldefs
 
 
 
diff --git a/interfaces/driver/Makefile.in b/interfaces/driver/Makefile.in
deleted file mode 100644
index 8580dd8..0000000
--- a/interfaces/driver/Makefile.in
+++ /dev/null
@@ -1,730 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-#========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = interfaces/driver
-DIST_COMMON = $(am__pkginclude_HEADERS_DIST) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"
-LTLIBRARIES = $(lib_LTLIBRARIES)
-liblbdriver_la_LIBADD =
-am__liblbdriver_la_SOURCES_DIST = lb-element.C lb-domain.C lb-vector.C \
-	lb-polynomial.C lb-det.C lb-rank.C lb-garbage.C lb-minpoly.C \
-	lb-blackbox.C lb-charpoly.C
- at LINBOX_COMPILE_DRIVERS_TRUE@am_liblbdriver_la_OBJECTS =  \
- at LINBOX_COMPILE_DRIVERS_TRUE@	lb-element.lo lb-domain.lo \
- at LINBOX_COMPILE_DRIVERS_TRUE@	lb-vector.lo lb-polynomial.lo \
- at LINBOX_COMPILE_DRIVERS_TRUE@	lb-det.lo lb-rank.lo \
- at LINBOX_COMPILE_DRIVERS_TRUE@	lb-garbage.lo lb-minpoly.lo \
- at LINBOX_COMPILE_DRIVERS_TRUE@	lb-blackbox.lo lb-charpoly.lo
-liblbdriver_la_OBJECTS = $(am_liblbdriver_la_OBJECTS)
-liblbdriver_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(liblbdriver_la_LDFLAGS) $(LDFLAGS) -o $@
- at LINBOX_COMPILE_DRIVERS_TRUE@am_liblbdriver_la_rpath = -rpath \
- at LINBOX_COMPILE_DRIVERS_TRUE@	$(libdir)
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = $(liblbdriver_la_SOURCES)
-DIST_SOURCES = $(am__liblbdriver_la_SOURCES_DIST)
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__pkginclude_HEADERS_DIST = lb-driver.h lb-blackbox-abstract.h \
-	lb-blackbox-type.h lb-domain-function.h \
-	lb-element-collection.h lb-polynomial.h lb-vector-data.h \
-	lb-blackbox-collection.h lb-charpoly.h lb-domain-functor.h \
-	lb-element-data.h lb-rank.h lb-vector-function.h \
-	lb-blackbox-data.h lb-det.h lb-domain.h lb-element.h \
-	lb-solve.h lb-vector-functor.h lb-blackbox-function.h \
-	lb-domain-abstract.h lb-domain-type.h lb-garbage.h \
-	lb-utilities.h lb-vector.h lb-blackbox-functor.h \
-	lb-domain-collection.h lb-interface.h lb-vector-abstract.h \
-	lb-vector-type.h lb-blackbox.h lb-domain-data.h \
-	lb-element-abstract.h lb-minpoly.h lb-vector-collection.h
-HEADERS = $(pkginclude_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
- at LINBOX_COMPILE_DRIVERS_TRUE@pkgincludesubdir = $(includedir)/interfaces/driver
- at LINBOX_COMPILE_DRIVERS_TRUE@AM_CPPFLAGS = -I$(top_srcdir) -I. -I../../linbox
-
-#ifdef HAVE_NTL
- at LINBOX_COMPILE_DRIVERS_TRUE@AM_CXXFLAGS = @DEFAULT_CFLAGS@ \
- at LINBOX_COMPILE_DRIVERS_TRUE@	-DDISABLE_COMMENTATOR \
- at LINBOX_COMPILE_DRIVERS_TRUE@	$(GMP_CFLAGS) \
- at LINBOX_COMPILE_DRIVERS_TRUE@	$(FFLAS_FFPACK_CFLAGS) \
- at LINBOX_COMPILE_DRIVERS_TRUE@	$(BLAS_CFLAGS) $(GIVARO_CFLAGS) \
- at LINBOX_COMPILE_DRIVERS_TRUE@	$(NTL_CFLAGS)
-#endif
-
-#LDADD= $(GMP_LIBS) $(NTL_LIBS) $(BLAS_LIBS) $(MAPLE_LIBS) $(GIVARO_LIBS) "../../linbox/liblinbox.la -z muldefs"
- at LINBOX_COMPILE_DRIVERS_TRUE@lib_LTLIBRARIES = liblbdriver.la
- at LINBOX_COMPILE_DRIVERS_TRUE@liblbdriver_la_SOURCES = lb-element.C 	\
- at LINBOX_COMPILE_DRIVERS_TRUE@			lb-domain.C     \
- at LINBOX_COMPILE_DRIVERS_TRUE@			lb-vector.C     \
- at LINBOX_COMPILE_DRIVERS_TRUE@			lb-polynomial.C \
- at LINBOX_COMPILE_DRIVERS_TRUE@			lb-det.C        \
- at LINBOX_COMPILE_DRIVERS_TRUE@			lb-rank.C       \
- at LINBOX_COMPILE_DRIVERS_TRUE@			lb-garbage.C    \
- at LINBOX_COMPILE_DRIVERS_TRUE@			lb-minpoly.C    \
- at LINBOX_COMPILE_DRIVERS_TRUE@			lb-blackbox.C   \
- at LINBOX_COMPILE_DRIVERS_TRUE@			lb-charpoly.C
-
-# \
-#			#  lb-solve.C
- at LINBOX_COMPILE_DRIVERS_TRUE@liblbdriver_la_LDFLAGS = $(GIVARO_LIBS) $(GMP_LIBS) $(NTL_LIBS) $(BLAS_LIBS) $(LDFLAGS) $(top_srcdir)/linbox/liblinbox.la -Wl,-zmuldefs
- at LINBOX_COMPILE_DRIVERS_TRUE@pkginclude_HEADERS = \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-driver.h              \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-blackbox-abstract.h   \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-blackbox-type.h       \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-domain-function.h     \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-element-collection.h  \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-polynomial.h          \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-vector-data.h         \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-blackbox-collection.h \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-charpoly.h            \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-domain-functor.h      \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-element-data.h        \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-rank.h                \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-vector-function.h     \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-blackbox-data.h       \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-det.h                 \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-domain.h              \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-element.h             \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-solve.h               \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-vector-functor.h      \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-blackbox-function.h   \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-domain-abstract.h     \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-domain-type.h         \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-garbage.h             \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-utilities.h           \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-vector.h              \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-blackbox-functor.h    \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-domain-collection.h   \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-interface.h           \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-vector-abstract.h     \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-vector-type.h         \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-blackbox.h            \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-domain-data.h         \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-element-abstract.h    \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-minpoly.h             \
- at LINBOX_COMPILE_DRIVERS_TRUE@		lb-vector-collection.h
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .C .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps interfaces/driver/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps interfaces/driver/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
-	}
-
-uninstall-libLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
-	done
-
-clean-libLTLIBRARIES:
-	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
-	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" != "$$p" || dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-liblbdriver.la: $(liblbdriver_la_OBJECTS) $(liblbdriver_la_DEPENDENCIES) $(EXTRA_liblbdriver_la_DEPENDENCIES) 
-	$(liblbdriver_la_LINK) $(am_liblbdriver_la_rpath) $(liblbdriver_la_OBJECTS) $(liblbdriver_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-.C.o:
-	$(CXXCOMPILE) -c -o $@ $<
-
-.C.obj:
-	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.C.lo:
-	$(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgincludeHEADERS: $(pkginclude_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
-	done
-
-uninstall-pkgincludeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(LTLIBRARIES) $(HEADERS)
-installdirs:
-	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
-	mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludeHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am: install-libLTLIBRARIES
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-libLTLIBRARIES uninstall-pkgincludeHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libLTLIBRARIES clean-libtool ctags distclean \
-	distclean-compile distclean-generic distclean-libtool \
-	distclean-tags distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am \
-	install-libLTLIBRARIES install-man install-pdf install-pdf-am \
-	install-pkgincludeHEADERS install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-	pdf pdf-am ps ps-am tags uninstall uninstall-am \
-	uninstall-libLTLIBRARIES uninstall-pkgincludeHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/interfaces/driver/compile-readme.txt b/interfaces/driver/compile-readme.txt
new file mode 100644
index 0000000..62bded3
--- /dev/null
+++ b/interfaces/driver/compile-readme.txt
@@ -0,0 +1,4 @@
+CAREFUL
+
+with IA64, all libraries used in the link edition need to be compiled with the option -fPIC -DPIC
+this is mandatory to provide a dynamic library.
\ No newline at end of file
diff --git a/interfaces/driver/lb-blackbox-data.h b/interfaces/driver/lb-blackbox-data.h
index 8ccefe9..f565b73 100644
--- a/interfaces/driver/lb-blackbox-data.h
+++ b/interfaces/driver/lb-blackbox-data.h
@@ -25,7 +25,7 @@
 #ifndef __LINBOX_lb_blackbox_data_H
 #define __LINBOX_lb_blackbox_data_H
 
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/util/matrix-stream.h"
 #include <map>
 #include <utility>
@@ -148,7 +148,8 @@ public:
 	{
 		Blackbox<DomainSource> *B_source= static_cast<Blackbox<DomainSource> * >  (ptr);
 		Blackbox<DomainTarget> *B_target = NULL; /*  was not init't */
-		typename Blackbox<DomainSource>::template rebind<DomainTarget>()(*B_target, *B_source, *D);
+//		typename Blackbox<DomainSource>::template rebind<DomainTarget>()(*B_target, *B_source, *D);
+		typename Blackbox<DomainSource>::template rebind<DomainTarget>()(*B_target, *B_source);
 		delete B_source;
 		ptr = B_target;
 	}
diff --git a/interfaces/driver/lb-blackbox-functor.h b/interfaces/driver/lb-blackbox-functor.h
index 16c55b6..1848e35 100644
--- a/interfaces/driver/lb-blackbox-functor.h
+++ b/interfaces/driver/lb-blackbox-functor.h
@@ -53,7 +53,7 @@ public:
  * Macro for automatic code generation *
  ***************************************/
 #define LB_BLACKBOX_VISIT(B)				\
-void visit(const B &d){apply(d);}
+void visit(const B &d){this->apply(d);}
 
 
 /**********************************************************************************
diff --git a/interfaces/driver/lb-blackbox-type.h b/interfaces/driver/lb-blackbox-type.h
index 9e95062..1e4d518 100644
--- a/interfaces/driver/lb-blackbox-type.h
+++ b/interfaces/driver/lb-blackbox-type.h
@@ -25,7 +25,7 @@
 #ifndef __LINBOX_lb_blackbox_type_H
 #define __LINBOX_lb_blackbox_type_H
 
-#include <linbox/matrix/blas-matrix.h>
+#include <linbox/matrix/dense-matrix.h>
 
 /****************************************
  * Define the list of all Blackbox Type *
diff --git a/interfaces/driver/lb-blackbox.C b/interfaces/driver/lb-blackbox.C
index bb1cdf5..94f272e 100644
--- a/interfaces/driver/lb-blackbox.C
+++ b/interfaces/driver/lb-blackbox.C
@@ -25,7 +25,7 @@
 #ifndef __LINBOX_lb_blackbox_C
 #define __LINBOX_lb_blackbox_C
 
-#include "linbox-config.h"
+#include "linbox/linbox-config.h"
 
 #include <lb-blackbox.h>
 #include <lb-blackbox-function.h>
diff --git a/interfaces/driver/lb-charpoly.C b/interfaces/driver/lb-charpoly.C
index 5406907..df803bc 100644
--- a/interfaces/driver/lb-charpoly.C
+++ b/interfaces/driver/lb-charpoly.C
@@ -27,9 +27,7 @@
 
 
 #include "linbox/solutions/charpoly.h"
-#ifdef __LINBOX_HAVE_GIVARO
 #include "linbox/ring/givaro-polynomial.h"
-#endif
 
 
 #include <lb-charpoly.h>
@@ -55,7 +53,7 @@ public:
 	void operator() (Result &res, Blackbox *B) const {
 		typedef typename Blackbox::Field Field;
 		typedef typename Field::Element Element;
-#ifdef __LINBOX_HAVE_GIVARO
+		
 		// use givpolynomial du to non genericity of charpoly over integer
 		typename LinBox::GivPolynomialRing<Field, Givaro::Dense>::Element pol;
 		LinBox::charpoly(pol, *B, meth);
@@ -65,10 +63,6 @@ public:
 		phi->resize(pol.size());
 		for (size_t i=0; i< pol.size(); ++i)
 			B->field().assign((*phi)[i], pol[i]);
-#else
-		throw lb_runtime_error("LinBox ERROR: charpoly computation requires Givaro library, computation impossible)\n");
-#endif
-
 	}
 };
 
diff --git a/interfaces/driver/lb-det.C b/interfaces/driver/lb-det.C
index 552c68d..a87c36a 100644
--- a/interfaces/driver/lb-det.C
+++ b/interfaces/driver/lb-det.C
@@ -25,7 +25,7 @@
 #ifndef __LINBOX_lb_det_C
 #define __LINBOX_lb_det_C
 
-#include "linbox-config.h"
+#include "linbox/linbox-config.h"
 #include "linbox/solutions/det.h"
 
 #include <lb-det.h>
diff --git a/interfaces/driver/lb-domain-data.h b/interfaces/driver/lb-domain-data.h
index 058cf34..b9267b9 100644
--- a/interfaces/driver/lb-domain-data.h
+++ b/interfaces/driver/lb-domain-data.h
@@ -26,7 +26,7 @@
 #define __LINBOX_lb_domain_data_H
 
 
-#include "linbox-config.h"
+#include "linbox/linbox-config.h"
 #include "linbox/integer.h"
 #include "linbox/field/field-traits.h"
 
diff --git a/interfaces/driver/lb-domain-functor.h b/interfaces/driver/lb-domain-functor.h
index 2cca757..f7c1554 100644
--- a/interfaces/driver/lb-domain-functor.h
+++ b/interfaces/driver/lb-domain-functor.h
@@ -52,7 +52,7 @@ public:
  * Macro for automatic code generation *
  ***************************************/
 #define LB_DOMAIN_VISIT(D)				\
-void visit(const DomainEnvelope<D> &d){apply(d);}
+void visit(const DomainEnvelope<D> &d){this->apply(d);}
 
 
 /*******************************************************************************
diff --git a/interfaces/driver/lb-domain-type.h b/interfaces/driver/lb-domain-type.h
index 0386e45..f7cc73e 100644
--- a/interfaces/driver/lb-domain-type.h
+++ b/interfaces/driver/lb-domain-type.h
@@ -25,16 +25,13 @@
 #ifndef __LINBOX_lb_domain_type_H
 #define __LINBOX_lb_domain_type_H
 
-#include "linbox/field/modular.h"
-#include "linbox/field/PID-integer.h"
+#include "linbox/ring/modular.h"
+#include "givaro/zring.h"
 #include "linbox/field/gmp-rational.h"
+#include "linbox/field/givaro.h"
 
 #ifdef __LINBOX_HAVE_NTL
-#include "linbox/field/ntl.h"
-#endif
-
-#ifdef __LINBOX_HAVE_GIVARO
-#include "linbox/field/givaro.h"
+#include "linbox/ring/ntl.h"
 #endif
 
 /**************************************
@@ -44,12 +41,12 @@
 #define __LINBOX_MINIMIZE_DOMAIN
 #define __LINBOX_DOMAIN_ONLY
 
-typedef LinBoxTypelist < LinBox::Modular<double>          , LinBoxDumbType> DL1;
-typedef LinBoxTypelist < LinBox::PID_integer              , DL1> DL2;
+typedef LinBoxTypelist < Givaro::Modular<double>          , LinBoxDumbType> DL1;
+typedef LinBoxTypelist < LinBox::Givaro::ZRing<Integer>              , DL1> DL2;
 typedef LinBoxTypelist < LinBox::GMPRationalField         , DL2> DL3;
-typedef LinBoxTypelist < LinBox::Modular<int32_t>         , DL3> DL4;
-typedef LinBoxTypelist < LinBox::Modular<int64_t>         , DL4> DL5;
-typedef LinBoxTypelist < LinBox::Modular<LinBox::integer> , DL5> DL6;
+typedef LinBoxTypelist < Givaro::Modular<int32_t>         , DL3> DL4;
+typedef LinBoxTypelist < LinBox::Givaro::Modular<int64_t>         , DL4> DL5;
+typedef LinBoxTypelist < Givaro::Modular<LinBox::integer> , DL5> DL6;
 
 #ifdef __LINBOX_MINIMIZE_DOMAIN
 typedef DL3 linbox_domain_list;
@@ -71,17 +68,13 @@ typedef DN3 ntl_domain_list;
 typedef LinBoxDumbType ntl_domain_list;
 #endif
 
-#ifdef __LINBOX_HAVE_GIVARO
-typedef LinBoxTypelist < LinBox::GivaroGfq, LinBoxDumbType> DG1;
-typedef LinBoxTypelist < LinBox::GivaroZpz< Givaro::Std32>, DG1> DG2;
+typedef LinBoxTypelist < LinBox::Givaro::GFq, LinBoxDumbType> DG1;
+typedef LinBoxTypelist < Givaro::Modular< int32_t>, DG1> DG2;
 #ifdef __LINBOX_MINIMIZE_DOMAIN
 typedef DG1 givaro_domain_list;
 #else
 typedef DG2 givaro_domain_list;
 #endif
-#else
-typedef LinBoxDumbType givaro_domain_list;
-#endif
 
 // define DomainList to be the list of all domains
 #ifdef __LINBOX_DOMAIN_ONLY
@@ -100,13 +93,13 @@ typedef LinBoxTL::Append< linbox_domain_list, LinBoxTL::Append< ntl_domain_list,
 extern Domain_Factory linbox_domain;
 
 void UpdateDomain(){
-	linbox_domain.add("linbox_field_dbl"      , constructDomain<LinBox::Modular<double> >);
+	linbox_domain.add("linbox_field_dbl"      , constructDomain<Givaro::Modular<double> >);
 	linbox_domain.add("linbox_field_rational" , constructDomain<LinBox::GMPRationalField>);
-	linbox_domain.add("linbox_ring_integer"   , constructDomain<LinBox::PID_integer>);
+	linbox_domain.add("linbox_ring_integer"   , constructDomain<LinBox::Givaro::ZRing<Integer> >);
 #ifndef __LINBOX_MINIMIZE_DOMAIN
-	linbox_domain.add("linbox_field_32"       , constructDomain<LinBox::Modular<int32_t> >);
-	linbox_domain.add("linbox_field_64"       , constructDomain<LinBox::Modular<int64_t> >);
-	linbox_domain.add("linbox_field_mp"       , constructDomain<LinBox::Modular<LinBox::integer> >);
+	linbox_domain.add("linbox_field_32"       , constructDomain<Givaro::Modular<int32_t> >);
+	linbox_domain.add("linbox_field_64"       , constructDomain<LinBox::Givaro::Modular<int64_t> >);
+	linbox_domain.add("linbox_field_mp"       , constructDomain<Givaro::Modular<LinBox::integer> >);
 #endif
 #ifdef __LINBOX_HAVE_NTL
 	linbox_domain.add("ntl_field_ZZ_p"      , constructDomain<LinBox::NTL_ZZ_p>);
@@ -115,11 +108,10 @@ void UpdateDomain(){
 	linbox_domain.add("ntl_ring_integer"    , constructDomain<LinBox::NTL_ZZ>);
 #endif
 #endif
-#ifdef __LINBOX_HAVE_GIVARO
-	linbox_domain.add("givaro_field_gfq"    , constructDomain<LinBox::GivaroGfq>);
+
+	linbox_domain.add("givaro_field_gfq"    , constructDomain<LinBox::Givaro::GFq>);
 #ifndef  __LINBOX_MINIMIZE_DOMAIN
-	linbox_domain.add("givaro_field_32"     , constructDomain<LinBox::GivaroZpz< Givaro::Std32> >);
-#endif
+	linbox_domain.add("givaro_field_32"     , constructDomain<Givaro::Modular< int32_t> >);
 #endif
 }
 
diff --git a/interfaces/driver/lb-solve.C b/interfaces/driver/lb-solve.C
new file mode 100644
index 0000000..c624353
--- /dev/null
+++ b/interfaces/driver/lb-solve.C
@@ -0,0 +1,234 @@
+/* lb-solve.C
+ * Copyright (C) 2005 Pascal Giorgi
+ *
+ * Written by Pascal Giorgi <pgiorgi at uwaterloo.ca>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_lb_solve_C
+#define __LINBOX_lb_solve_C
+
+#include "linbox/solutions/solve.h"
+
+#include <lb-solve.h>
+#include <lb-blackbox-function.h>
+#include <lb-vector-function.h>
+#include <lb-blackbox.h>
+#include <lb-vector.h>
+#include <lb-domain.h>
+#include <lb-garbage.h>
+
+
+extern BlackboxTable blackbox_hashtable;
+extern VectorTable   vector_hashtable;
+extern const char* current_rational_field;
+
+/****************************************************************
+ * Functor interface to launch LinBox solving                   *
+ * deal with different API and avoid different type compilation *
+ ****************************************************************/
+
+// generic version to handle different type compilation
+template<class ResultElement, class BlackboxElement, class VectorElement, class DomainCategory>
+class LaunchSolveFunctor {
+public:
+	template<class Result, class Blackbox, class Vector, class Method>
+	inline void  operator()(Result &s, Blackbox *B, Vector *v, const Method &m) const {
+		throw lb_runtime_error("LinBox ERROR: incompatible domain in solving");// throw an exception for incompatible data type
+	}
+};
+
+// specialization to launch LinBox solving using standard API
+template<class Element, class DomainCategory>
+class LaunchSolveFunctor<Element, Element, Element, DomainCategory>{
+public:
+	template<class Result, class Blackbox, class Vector, class Method>
+	inline void  operator()(Result &s, Blackbox *B, Vector *v, const Method &m) const {
+		LinBox::solve(s, *B, *v, m);
+	}
+};
+
+
+// specialization to launch LinBox solving using integer solving API (output is a GMPRational)
+template<class Element>
+class LaunchSolveFunctor<Element, Element, Element, LinBox::RingCategories::IntegerTag >{
+public:
+	template<class Result, class Blackbox, class Vector, class Method>
+	inline void  operator()(Result &s, Blackbox *B, Vector *v, const Method &m) const {
+		//LinBox::solve(s, *B, *v, m);
+		//not yet handled
+		throw lb_runtime_error("LinBox ERROR: integer system solving with same vector type is not yet handled");
+	}
+};
+
+
+// specialization to launch LinBox solving using integer solving API (output is a GMPRational)
+template<class Element>
+class LaunchSolveFunctor<LinBox::GMPRationalElement, Element, Element, LinBox::RingCategories::IntegerTag >{
+public:
+	template<class Result, class Blackbox, class Vector, class Method>
+	inline void  operator()(Result &s, Blackbox *B, Vector *v, const Method &m) const {
+		LinBox::solve(s, *B, *v, m);
+	}
+};
+
+
+/**********************************************************************
+ * Partial Solving linear system Functor according to a blackbox type *
+ **********************************************************************/
+
+template<class Blackbox, class Method>
+class SolvePartialFunctor{
+protected:
+	Blackbox         *_BB;
+	const Method   &meth;
+public:
+
+	SolvePartialFunctor (Blackbox *B, const Method &m) : _BB(B), meth(m) {}
+
+	template<class Vector>
+	void operator()(const VectorKey& Vkey, Vector *res) const {
+		VectorTable::iterator it = vector_hashtable.find(Vkey);
+		if (it == vector_hashtable.end())
+			throw lb_runtime_error("LinBox ERROR: right hand side vector does not exist (solving impossible)\n");
+
+		SolvePartialFunctor<Blackbox, Method> fct(_BB, meth);
+		VectorFunction::call(*res, Vkey, fct);
+	}
+
+      	template<class Vector, class Result>
+	void operator() (Result &res, Vector *v) const {
+		typedef typename Blackbox::Field::Element BElement;
+		typedef typename Vector::value_type       VElement;
+		typedef typename Result::value_type       RElement;
+		typedef typename LinBox::FieldTraits<typename Blackbox::Field>::categoryTag categoryTag;
+		LaunchSolveFunctor<RElement, BElement, VElement, categoryTag>()(res, _BB, v, meth);
+	}
+};
+
+
+
+/**********************************************************
+ * Modify the vector Result if it is integer computation  *
+ * and vector result is not define over a rational domain *
+ **********************************************************/
+template<class Category>
+class MutateVector{
+public:
+	void operator()(VectorAbstract *v){}
+};
+
+template<>
+class MutateVector<LinBox::RingCategories::IntegerTag>{
+public:
+	void operator()(VectorAbstract *v){
+		const DomainKey *k= &createDomain(0, current_rational_field);
+		v->rebind(*k);
+		deleteDomain(*k);
+	}
+};
+
+
+class MutateVectorFunctor{
+public:
+	template<class Domain>
+	void operator()(VectorAbstract *&v, Domain *D) const {
+	  MutateVector<typename LinBox::FieldTraits<Domain>::categoryTag>()(v);
+	}
+};
+
+
+void modifyResultVector(const VectorKey &key){
+	VectorTable::iterator it = vector_hashtable.find(key);
+	if (it == vector_hashtable.end())
+			throw lb_runtime_error("LinBox ERROR: result vector does not exist (solving impossible)\n");
+
+	const DomainKey *Dkey = &(it->second->getDomainKey());
+	MutateVectorFunctor Fct;
+	DomainFunction::call(it->second, *Dkey, Fct);
+}
+
+
+/*****************************************
+ * Generic Solving linear system Functor *
+ *****************************************/
+
+template<typename Method = LinBox::Method::Hybrid >
+class SolveFunctor{
+protected:
+	const VectorKey &_Vkey;
+	Method meth;
+public:
+	SolveFunctor(const VectorKey &Vkey, Method m =Method()) : _Vkey(Vkey), meth(m) {}
+
+	template<class Blackbox, class Result>
+	inline void operator()(Result &res, Blackbox *B) const {
+		SolvePartialFunctor<Blackbox, Method> fct(B, meth);
+		VectorFunction::call(res, _Vkey, fct);
+	}
+};
+
+
+/***********************************************************
+ * API for solving linear systems                          *
+ * vector solution  is returned through a given vector key *
+ ***********************************************************/
+
+void lb_solve(const VectorKey &res, const BlackboxKey &Bkey, const VectorKey &Vkey) {
+	SolveFunctor<> fct(res);
+	modifyResultVector(res);
+	BlackboxFunction::call(Vkey, Bkey, fct);
+}
+
+/*****************************************************
+ * API for solving linear systems                    *
+ * vector solution  is returned through a vector key *
+ *****************************************************/
+
+const VectorKey&  lb_solve(const BlackboxKey &Bkey, const VectorKey &Vkey) {
+
+	BlackboxTable::iterator it = blackbox_hashtable.find(Bkey);
+	if (it == blackbox_hashtable.end())
+		throw lb_runtime_error("LinBox ERROR: blackbox does not exist (solving impossible)\n");
+	const DomainKey *Dkey = &it->second->getDomainKey();
+
+	std::pair<size_t,size_t> dim;
+	dim = getBlackboxDimension(Bkey);
+	size_t coldim = dim.second;
+
+	//const VectorKey *res = &copyVector(Vkey);
+	const VectorKey *res = &createVector(*Dkey, coldim);
+
+	lb_solve(*res, Bkey, Vkey);
+	return *res;
+}
+
+
+
+#endif
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/interfaces/driver/lb-vector-data.h b/interfaces/driver/lb-vector-data.h
index 49f77ee..4779b0c 100644
--- a/interfaces/driver/lb-vector-data.h
+++ b/interfaces/driver/lb-vector-data.h
@@ -229,9 +229,7 @@ public:
 	template<class Domain>
 	void operator()(void *&res, Domain *D) const
 	{
-		typename Domain::Element zero;
-		D->init(zero, 0UL);
-		res = new Vector<typename Domain::Element, Alloc<typename Domain::Element> >(_dim, zero);
+		res = new Vector<typename Domain::Element, Alloc<typename Domain::Element> >(_dim, D->zero);
 	}
 };
 
diff --git a/interfaces/driver/lb-vector-functor.h b/interfaces/driver/lb-vector-functor.h
index 8fdf872..5b4a768 100644
--- a/interfaces/driver/lb-vector-functor.h
+++ b/interfaces/driver/lb-vector-functor.h
@@ -54,7 +54,7 @@ public:
  * Macro for automatic code generation *
  ***************************************/
 #define LB_VECTOR_VISIT(B)				\
-	void visit(const B &d){apply(d);}
+	void visit(const B &d){this->apply(d);}
 
 
 /**********************************************************************************
diff --git a/interfaces/driver/lb-vector.C b/interfaces/driver/lb-vector.C
index c79a5cf..0be32dd 100644
--- a/interfaces/driver/lb-vector.C
+++ b/interfaces/driver/lb-vector.C
@@ -25,7 +25,7 @@
 #ifndef __LINBOX_lb_vector_C
 #define __LINBOX_lb_vector_C
 
-#include "linbox-config.h"
+#include "linbox/linbox-config.h"
 
 #include <lb-vector.h>
 #include <lb-vector-function.h>
diff --git a/interfaces/kaapi/Makefile.in b/interfaces/kaapi/Makefile.in
deleted file mode 100644
index 0b6d84b..0000000
--- a/interfaces/kaapi/Makefile.in
+++ /dev/null
@@ -1,574 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = interfaces/kaapi
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/kaapi
-pkgincludesub_HEADERS = \
-communicate.h
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps interfaces/kaapi/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps interfaces/kaapi/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
-	done
-
-uninstall-pkgincludesubHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
-	for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool ctags distclean distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-pkgincludesubHEADERS install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/interfaces/kaapi/communicate.h b/interfaces/kaapi/communicate.h
index 543e8a9..452df50 100644
--- a/interfaces/kaapi/communicate.h
+++ b/interfaces/kaapi/communicate.h
@@ -28,8 +28,8 @@
 
 #include <athapascan-1>
 #include "linbox/integer.h"
-#include "linbox/field/modular-double.h"
-#include "linbox/matrix/sparse.h"
+#include "linbox/ring/modular-double.h"
+#include "linbox/matrix/sparse-matrix.h"
 
 /*
  * gmp integers
@@ -65,7 +65,7 @@ namespace kaapi
 	 * double specialization
 	 */
 	template <>
-	struct Modular<double> : LinBox::Modular<double>
+	struct Givaro::Modular<double> : Givaro::Modular<double>
 	{
 		const double& get_modulus() const { return this->modulus; }
 		const unsigned long& get_lmodulus() const { return this->lmodulus; }
@@ -75,13 +75,13 @@ namespace kaapi
 
 } //namespace
 
-a1::OStream& operator<<( a1::OStream& out, const LinBox::Modular<double>& m)
+a1::OStream& operator<<( a1::OStream& out, const Givaro::Modular<double>& m)
 {
 	const kaapi::Modular<double>* m_tmp = static_cast<const kaapi::Modular<double>*>(&m);
 	return out << m_tmp->get_modulus() << m_tmp->get_lmodulus() ;
 }
 
-a1::IStream& operator>>( a1::IStream& in, LinBox::Modular<double>& m)
+a1::IStream& operator>>( a1::IStream& in, Givaro::Modular<double>& m)
 {
 	kaapi::Modular<double>* m_tmp = static_cast<kaapi::Modular<double>*>(&m);
 	return in >> m_tmp->get_modulus() >> m_tmp->get_lmodulus() ;
diff --git a/interfaces/maple-old/Makefile.am b/interfaces/maple-old/Makefile.am
new file mode 100644
index 0000000..871571d
--- /dev/null
+++ b/interfaces/maple-old/Makefile.am
@@ -0,0 +1,37 @@
+# Copyright (c) 2010 the LinBox group
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the  GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# ========LICENCE========
+
+
+
+INCLUDES=-I$(top_srcdir)
+
+AM_CPPFLAGS= $(NTL_CFLAGS) $(ATLAS_CFLAGS) $(MAPLE_CFLAGS) 
+
+EXTRA_DIST = lbmaple.C lbmaple.mpl.head lbmaple.mpl.tail Makefile.in.1 Makefile.in.2 demonstration.mws
+
+lib_LTLIBRARIES=liblbmaple.la liblbmapleffpack.la
+
+liblbmaple_la_SOURCES=lbmaple.C
+liblbmaple_la_LDFLAGS=$(top_builddir)/linbox/liblinbox.la  $(NTL_LIBS) $(MAPLE_LIBS)
+
+liblbmapleffpack_la_SOURCES=lbmaple-ffpack.C
+liblbmapleffpack_la_LDFLAGS=$(top_builddir)/linbox/liblinbox.la  $(ATLAS_LIBS) $(NTL_LIBS) $(MAPLE_LIBS) 
+
+install-data-local:
+	$(INSTALL_DATA) lbmaple.mpl $(libdir)/lbmaple.mpl
diff --git a/interfaces/maple-old/Makefile.in.1 b/interfaces/maple-old/Makefile.in.1
new file mode 100644
index 0000000..94c4518
--- /dev/null
+++ b/interfaces/maple-old/Makefile.in.1
@@ -0,0 +1,232 @@
+# Makefile.in generated automatically by automake 1.5 from Makefile.am.
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = @program_transform_name@
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AMTAR = @AMTAR@
+AS = @AS@
+AWK = @AWK@
+CC = @CC@
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOCPLUSPLUS_SUBDIRS = @DOCPLUSPLUS_SUBDIRS@
+ECHO = @ECHO@
+EXEEXT = @EXEEXT@
+GIVARO_CFLAGS = @GIVARO_CFLAGS@
+GIVARO_LIBS = @GIVARO_LIBS@
+GMP_CFLAGS = @GMP_CFLAGS@
+GMP_LIBS = @GMP_LIBS@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBTOOL = @LIBTOOL@
+LIDIA_CFLAGS = @LIDIA_CFLAGS@
+LIDIA_LIBS = @LIDIA_LIBS@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAPLE_BUILD_LOC = @MAPLE_BUILD_LOC@
+MAPLE_INCLUDES = @MAPLE_INCLUDES@
+MAPLE_LIBS = @MAPLE_LIBS@
+NTL_CFLAGS = @NTL_CFLAGS@
+NTL_LIBS = @NTL_LIBS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SACLIB_CFLAGS = @SACLIB_CFLAGS@
+SACLIB_LIBS = @SACLIB_LIBS@
+STRIP = @STRIP@
+VERSION = @VERSION@
+am__include = @am__include@
+am__quote = @am__quote@
+install_sh = @install_sh@
+
+INCLUDES = -I$(top_srcdir)
+
+AM_CPPFLAGS = $(GMP_CFLAGS) $(NTL_CFLAGS) @MAPLE_INCLUDES@ 
+LDADD = $(top_builddir)/linbox/liblinbox.la $(GMP_LIBS) $(NTL_LIBS) 
+EXTRA_DIST = lbmaple.C lbmaple.mpl.head lbmaple.mpl.tail Makefile.in.1 Makefile.in.2 \
+		demonstration.mws
+
+subdir = interfaces/maple
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/linbox-config.h
+CONFIG_CLEAN_FILES =
+DIST_SOURCES =
+DIST_COMMON = Makefile.am Makefile.in
+all: all-am
+
+.SUFFIXES:
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  interfaces/maple/Makefile
+Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) && \
+	  CONFIG_HEADERS= CONFIG_LINKS= \
+	  CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ../..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  if test -f $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    $(mkinstalldirs) "$(distdir)/$$dir"; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    cp -pR $$d/$$file $(distdir) \
+	    || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile
+
+installdirs:
+
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+
+distclean-am: clean-am distclean-generic distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am info info-am install install-am install-data \
+	install-data-am install-exec install-exec-am install-info \
+	install-info-am install-man install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool uninstall uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/maple-old/Makefile.in.2 b/interfaces/maple-old/Makefile.in.2
new file mode 100644
index 0000000..29acf37
--- /dev/null
+++ b/interfaces/maple-old/Makefile.in.2
@@ -0,0 +1,372 @@
+# Makefile.in generated by automake 1.6.3 from Makefile.am.
+# @configure_input@
+
+# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
+# Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = @program_transform_name@
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+
+EXEEXT = @EXEEXT@
+OBJEXT = @OBJEXT@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+AMTAR = @AMTAR@
+AS = @AS@
+AWK = @AWK@
+CC = @CC@
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOCPLUSPLUS_SUBDIRS = @DOCPLUSPLUS_SUBDIRS@
+ECHO = @ECHO@
+GIVARO_CFLAGS = @GIVARO_CFLAGS@
+GIVARO_LIBS = @GIVARO_LIBS@
+GMP_CFLAGS = @GMP_CFLAGS@
+GMP_LIBS = @GMP_LIBS@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LB_LOC = @LB_LOC@
+LIBTOOL = @LIBTOOL@
+LIDIA_CFLAGS = @LIDIA_CFLAGS@
+LIDIA_LIBS = @LIDIA_LIBS@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAPLE_INCLUDES = @MAPLE_INCLUDES@
+MAPLE_LIBS = @MAPLE_LIBS@
+NTL_CFLAGS = @NTL_CFLAGS@
+NTL_LIBS = @NTL_LIBS@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SACLIB_CFLAGS = @SACLIB_CFLAGS@
+SACLIB_LIBS = @SACLIB_LIBS@
+STRIP = @STRIP@
+TEX_SUBDIRS = @TEX_SUBDIRS@
+VERSION = @VERSION@
+am__include = @am__include@
+am__quote = @am__quote@
+install_sh = @install_sh@
+INCLUDES = -I$(top_srcdir)
+
+AM_CPPFLAGS = $(GMP_CFLAGS) $(NTL_CFLAGS) @MAPLE_INCLUDES@ 
+LDADD = $(top_builddir)/linbox/liblinbox.la $(GMP_LIBS) $(NTL_LIBS) 
+EXTRA_DIST = lbmaple.C lbmaple.mpl.head lbmaple.mpl.tail Makefile.in.1 Makefile.in.2 \
+		demonstration.mws
+
+
+mapledir = $(libdir)
+maple_LTLIBRARIES = liblbmaple.la
+liblbmaple_la_SOURCES = lbmaple.C
+liblbmaple_la_INCLUDES = @LB_LOC@/linbox/blackbox/triplesbb.h
+liblbmaple_la_LDFLAGS = @MAPLE_LIBS@ -module
+subdir = interfaces/maple
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/linbox-config.h
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(maple_LTLIBRARIES)
+
+liblbmaple_la_LIBADD =
+am_liblbmaple_la_OBJECTS = lbmaple.lo
+liblbmaple_la_OBJECTS = $(am_liblbmaple_la_OBJECTS)
+
+DEFS = @DEFS@
+DEFAULT_INCLUDES =  -I. -I$(srcdir) -I$(top_builddir)
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+ at AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/lbmaple.Plo
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+DIST_SOURCES = $(liblbmaple_la_SOURCES)
+DIST_COMMON = Makefile.am Makefile.in
+SOURCES = $(liblbmaple_la_SOURCES)
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .C .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  interfaces/maple/Makefile
+Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
+mapleLTLIBRARIES_INSTALL = $(INSTALL)
+install-mapleLTLIBRARIES: $(maple_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	$(mkinstalldirs) $(DESTDIR)$(mapledir)
+	@list='$(maple_LTLIBRARIES)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    f="`echo $$p | sed -e 's|^.*/||'`"; \
+	    echo " $(LIBTOOL) --mode=install $(mapleLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(mapledir)/$$f"; \
+	    $(LIBTOOL) --mode=install $(mapleLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(mapledir)/$$f; \
+	  else :; fi; \
+	done
+
+uninstall-mapleLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(maple_LTLIBRARIES)'; for p in $$list; do \
+	    p="`echo $$p | sed -e 's|^.*/||'`"; \
+	  echo " $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(mapledir)/$$p"; \
+	  $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(mapledir)/$$p; \
+	done
+
+clean-mapleLTLIBRARIES:
+	-test -z "$(maple_LTLIBRARIES)" || rm -f $(maple_LTLIBRARIES)
+	@list='$(maple_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test -z "$dir" && dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+liblbmaple.la: $(liblbmaple_la_OBJECTS) $(liblbmaple_la_DEPENDENCIES) 
+	$(CXXLINK) -rpath $(mapledir) $(liblbmaple_la_LDFLAGS) $(liblbmaple_la_OBJECTS) $(liblbmaple_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT) core *.core
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/lbmaple.Plo at am__quote@
+
+distclean-depend:
+	-rm -rf ./$(DEPDIR)
+
+.C.o:
+ at AMDEP_TRUE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+ at AMDEP_TRUE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+	$(CXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+
+.C.obj:
+ at AMDEP_TRUE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
+ at AMDEP_TRUE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+	$(CXXCOMPILE) -c -o $@ `cygpath -w $<`
+
+.C.lo:
+ at AMDEP_TRUE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@	depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@
+ at AMDEP_TRUE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+	$(LTCXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+CXXDEPMODE = @CXXDEPMODE@
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+
+ETAGS = etags
+ETAGSFLAGS =
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(ETAGS_ARGS)$$tags$$unique" \
+	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+
+top_distdir = ../..
+distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
+
+distdir: $(DISTFILES)
+	@list='$(DISTFILES)'; for file in $$list; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkinstalldirs) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES)
+
+installdirs:
+	$(mkinstalldirs) $(DESTDIR)$(mapledir)
+
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-mapleLTLIBRARIES \
+	mostlyclean-am
+
+distclean: distclean-am
+
+distclean-am: clean-am distclean-compile distclean-depend \
+	distclean-generic distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-mapleLTLIBRARIES
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+uninstall-am: uninstall-info-am uninstall-mapleLTLIBRARIES
+
+.PHONY: GTAGS all all-am check check-am clean clean-generic \
+	clean-libtool clean-mapleLTLIBRARIES distclean \
+	distclean-compile distclean-depend distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am info \
+	info-am install install-am install-data install-data-am \
+	install-exec install-exec-am install-info install-info-am \
+	install-man install-mapleLTLIBRARIES install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool tags uninstall \
+	uninstall-am uninstall-info-am uninstall-mapleLTLIBRARIES
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/maple-old/README b/interfaces/maple-old/README
new file mode 100644
index 0000000..a1b591a
--- /dev/null
+++ b/interfaces/maple-old/README
@@ -0,0 +1,75 @@
+LinBox/Maple Interface - version 1.0 
+2-3-2003
+
+1.  What is it:
+	This is an interface between the LinBox library of functions and
+utilities for the Maple computer algebra system.  It allows you to call
+LinBox functions from a Maple session.  It is currently under
+development by Rich Seagraves at the University of Delaware.  Any ideas or
+suggestions are more than welcome.  The package is made up of a small library
+that wraps LinBox functions, and a Maple module called LinBox that contains all
+procedures and external calling definitions.  
+
+
+2.  Requirements:
+	The interface requires the following packges:
+	I.   Maple v6.0 or greater
+	II.  LinBox
+	III. GMP v3.2 or greater (for LinBox)
+	IV.  unix make utility 
+	V.   A UNIX other than Solaris (see "But I have Solaris you 
+             insensitive CLOD!!!!" below).
+
+	It is recommended you have the following
+	I.   Maple v7.0 or later
+	II.  g++ 3.0 or later (compiler on which this library was tested).
+	III. GNU make utility (gmake). 
+	
+    
+3.  Availability:
+	The interface is currently distributed as part of the LinBox package,
+available through CVS.  Please goto http://www.linalg.org/developer.html
+for information about getting the latest version of LinBox.  (Note - at
+present, the Maple interface is not available through the latest LinBox
+beta release, v0.3b.  It should be available when the next beta release of
+LinBox comes out.  Stay on the look-out and keep your fingers crossed!)
+The interface is available in the interfaces/maple directory of the 
+LinBox distribution.
+
+4.  But I have Solaris you insensitive CLOD!!!!
+	At the moment, the package has been tested under Linux and
+theoretically will work on other Unix variant systems.
+Both LinBox and this interface has had some trouble building on Solaris,
+and at present Solaris doesnot support a build feature that this interface
+needs.  If someone has had extensive experience with Solaris and would like
+to help out with this, I'd be more than happy toi recieve that help.
+
+5.  Installation:
+	The interface consists of a shared object file and a plain text
+script defining a module called LinBox.  To create the Maple interface to
+LinBox, re-run LinBox's configure script with the following additional 
+arguements:
+
+	--with-maple-prefix=MPFX --enable-shared
+
+where MPFX is the directory of a working maple installation.  Then rebuild
+LinBox with
+	make; make install
+and the interface will be built in LinBox's lib/ directory.   
+
+6.  Usage:
+	The build system will compile a shared object generate is called
+lbmaple.mpl.  In Maple, type 
+
+'read("/directory/you/install/to/lib/lbmaple.mpl");'
+
+(where /directory/you/install/to is LinBox's installation path) to get the 
+module.  Also, in the interfaces/maple directory in LinBox is a file called
+demonstration.mws which contains a demonstrational maple worksheet.
+
+7.  Wow, this interface is horrible.  What's wrong with you? :-)
+	If you really think it's that bad, why not email me and show me how
+it's done right?  I always love help.
+
+8.  Contact
+	You can contact the author, Rich Seagraves, at <seagrave at cis.udel.edu>
diff --git a/interfaces/maple-old/demonstration.mws b/interfaces/maple-old/demonstration.mws
new file mode 100644
index 0000000..9731e2f
--- /dev/null
+++ b/interfaces/maple-old/demonstration.mws
@@ -0,0 +1,291 @@
+{VERSION 5 0 "IBM INTEL LINUX" "5.0" }
+{USTYLETAB {CSTYLE "Maple Input" -1 0 "Courier" 0 1 255 0 0 1 0 1 0 0 
+1 0 0 0 0 1 }{CSTYLE "2D Math" -1 2 "Times" 0 1 0 0 0 0 0 0 2 0 0 0 0 
+0 0 1 }{CSTYLE "2D Output" 2 20 "" 0 1 0 0 255 1 0 0 0 0 0 0 0 0 0 1 }
+{CSTYLE "" -1 256 "itc avant garde" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }
+{CSTYLE "" -1 257 "lucida bright" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }
+{CSTYLE "" -1 258 "interface user" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }
+{CSTYLE "" -1 259 "screen" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "
+" -1 260 "terminal" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 
+261 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 262 "" 0 1 0 0 
+0 0 1 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 263 "" 0 1 0 0 0 0 0 1 0 0 0 0 
+0 0 0 0 }{CSTYLE "" -1 264 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }
+{CSTYLE "" -1 265 "" 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 
+266 "" 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 267 "" 0 1 0 0 
+0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 268 "" 1 14 0 0 0 0 0 1 0 0 0 
+0 0 0 0 0 }{CSTYLE "" -1 269 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }
+{CSTYLE "" -1 270 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 
+271 "" 0 24 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 272 "" 1 18 0 
+0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 273 "" 1 18 0 0 0 0 0 2 0 0 
+0 0 0 0 0 0 }{CSTYLE "" -1 274 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }
+{CSTYLE "" -1 275 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 
+276 "" 1 18 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 277 "" 0 1 0 0 
+0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 278 "" 1 18 0 0 0 0 0 0 0 0 0 
+0 0 0 0 0 }{CSTYLE "" -1 279 "" 1 18 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }
+{CSTYLE "" -1 280 "" 1 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{PSTYLE "Normal
+" -1 0 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }0 0 0 
+-1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "Maple Output" 0 11 1 {CSTYLE "" 
+-1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }3 3 0 -1 -1 -1 0 0 0 0 0 0 
+-1 0 }{PSTYLE "" 11 12 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 
+0 0 0 0 }1 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "Title" 0 18 1 
+{CSTYLE "" -1 -1 "" 1 18 0 0 0 0 0 1 1 0 0 0 0 0 0 0 }3 0 0 -1 12 12 
+0 0 0 0 0 0 19 0 }{PSTYLE "Author" 0 19 1 {CSTYLE "" -1 -1 "" 0 1 0 0 
+0 0 0 0 0 0 0 0 0 0 0 0 }3 0 0 -1 8 8 0 0 0 0 0 0 -1 0 }{PSTYLE "" 0 
+256 1 {CSTYLE "" -1 -1 "" 1 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }0 0 0 -1 
+-1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "" 0 257 1 {CSTYLE "" -1 -1 "" 0 1 0 
+0 0 0 0 1 0 0 0 0 0 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }}
+{SECT 0 {EXCHG {PARA 18 "" 0 "" {TEXT -1 0 "" }{TEXT 256 28 "Maple Lin
+Box Interface, v0.5" }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 19 "" 0 "
+" {TEXT -1 17 "by Rich Seagraves" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 
+271 "This interface is the fruits of a summer research project.  It is
+ meant to demonstrate a practical application of the LinBox suite of u
+tilities and functions.  It is currently distributed as an extra compo
+nent of the LinBox development package.  Please see http://www.lin" }
+{TEXT 264 0 "" }{TEXT -1 65 "alg.org to find out how to get a copy of \+
+this package using CVS  " }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 259 "LinB
+ox is a set of libraries meant to provide fast symbolic solutions to p
+roblems in Linear Algebra.  Currently it provides solutions to 3 class
+es of problems:  Rank calculations, Determinant calculations, and the \+
+computation of a Matrix's Minimal Polynomial." }{TEXT 257 0 "" }{TEXT 
+258 0 "" }{TEXT 259 0 "" }{TEXT 260 0 "" }}}{EXCHG {PARA 0 "" 0 "" 
+{TEXT -1 0 "" }{TEXT 261 31 "Installing the LinBox interface" }}{PARA 
+0 "" 0 "" {TEXT -1 335 "The interface is composed of a comiled library
+ of code that wraps linbox code, and a maple script that provides Mapl
+e access to this code.  To compile the library and create the script, \+
+the linbox package must be compiled with the maple option activated.  \+
+For information on this, see the README file  in the interfaces/maple \+
+directory" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 0 "" }{TEXT 262 0 "" }
+{TEXT -1 0 "" }{TEXT 263 24 "Activating the interface" }}{PARA 0 "" 0 
+"" {TEXT -1 353 "Once installation is complete, the shared object \"li
+blbmaple.so\" and the maple script \"lbmaple.mpl\" will be in the $pre
+fix/lib directory, where $prefix is the prefix you specified when you \+
+installed LinBox .  If you want to move the interface to a different d
+irectory, the lbmaple.mpl file will need to be edited.  Instructions f
+or this are in the file." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "
+" 0 "" {TEXT -1 145 "To activate the interface, read in the script usi
+ng the following command (change $dir to the directory the interface i
+s currently installed in):" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 
+25 "read(\"$dir/lbmaple.mpl\");" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#7)%
+(LBapplyG%1LBapplyTransposeG%&LBdetG%*LBminpolyG%'LBrankG%)LinBoxBBG%(
+LinBoxVG" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 40 "The module LinBox sho
+uld be activated.  " }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 0 "" }{TEXT 
+265 0 "" }{TEXT 266 0 "" }{TEXT 267 19 "Using the interface" }{TEXT 
+-1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 48 "The LinBox interface defines tw
+o new data types:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 11 "LinBox
+BB();" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 10 "LinBoxV();" }}}
+{EXCHG {PARA 0 "" 0 "" {TEXT -1 228 "LinBoxBB is a Matrix BlackBox typ
+e, while LinBoxV is a vector type.  They can be initialized with:  \n \+
+                       1)  A ready made Matrix or Vector\n            \+
+            2)  Dimensions and an initalization procedure" }}{PARA 0 "
+" 0 "" {TEXT -1 54 "                        3)  A list (LinBoxV type o
+nly)" }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 238 "
+For these data types, matrix or vector data is  stored in the external
+ code so that multiple data conversions between Maple data types and e
+xternal code types are un-necessary.  Each object stores a handle to a
+ particular external type.  " }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 
+0 "" 0 "" {TEXT -1 45 "The interface also defines several functions:" 
+}}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 9 "LBrank();" }}}{EXCHG 
+{PARA 0 "> " 0 "" {MPLTEXT 1 0 8 "LBdet();" }}}{EXCHG {PARA 0 "> " 0 "
+" {MPLTEXT 1 0 12 "LBminpoly();" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 
+1 0 10 "LBapply();" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 19 "LBapp
+lyTranspose();" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 175 "By default, th
+ese functions expect to take the LinBox BlackBox and Vector types as i
+nput.  They can take native Maple types, but convert these two the Lin
+Box types on the fly." }}}{EXCHG {PARA 0 "" 0 "" {TEXT 269 0 "" }
+{TEXT 268 27 "Creating a BlackBox object\n" }{TEXT -1 214 "The easiest
+ way to declare a BlackBox matrix is to give the matrix a procedure an
+d dimensions.  Here is a simple procedure that puts 1's on every \"eve
+n\" diagonal ( abs( i-j) = 0 mod 2), and i+1 on the main diagonal" }}}
+{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 14 "f := proc(i,j)" }}{PARA 0 ">
+ " 0 "" {MPLTEXT 1 0 30 "  if abs(i-j) mod 2 = 0 then 1" }}{PARA 0 "> \+
+" 0 "" {MPLTEXT 1 0 8 "  else 0" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 5 " \+
+ fi;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 9 "end proc;" }}{PARA 11 "" 1 "
+" {XPPMATH 20 "6#>%\"fGf*6$%\"iG%\"jG6\"F)F)@%/-%$modG6$-%$absG6#,&9$
+\"\"\"9%!\"\"\"\"#\"\"!F4F8F)F)F)" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 
+171 "Say we want to create a 500x500 BlackBox matrix with this form.  \+
+For this test, let's say we use the 30th prime.  To create the Blackbo
+x, we would make the following call:" }}}{EXCHG {PARA 0 "> " 0 "" 
+{MPLTEXT 1 0 43 "Diag1s := LinBoxBB(ithprime(30),500,500,f);" }}{PARA 
+12 "" 1 "" {XPPMATH 20 "6#>%'Diag1sG`6$%*getMatrixG%$keyGb6#%+thismodu
+leG6#%)destructG6#/%'unloadGF-6$%*getMatrixG%$keyG6\"6#QDMaple~Contain
+er~for~LinBox~blackboxF4F46*%\"kG%\"kG%(ExToMapG%(ExToMapG%-lbXgetMatr
+ixG%-lbXgetMatrixG%.lbXkillMatrixG%.lbXkillMatrixG%,_m145668688G6#%)de
+structG" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 148 "Diag1s becomes a LinB
+oxBB.  If you wanted to get a copy of the Matrix stored within the ext
+ernal code, you can call the LinBoxBB method getMatrix()." }}}{EXCHG 
+{PARA 0 "> " 0 "" {MPLTEXT 1 0 25 "M := Diag1s:-getMatrix();" }}{PARA 
+11 "" 1 "" {XPPMATH 20 "6#>%\"MG-%'RTABLEG6*\"*g%R\\8%)anythingG%'Matr
+ixG%.Fortran_orderG7\"\"\"#;\"\"\"\"$+&F." }}}{EXCHG {PARA 0 "" 0 "" 
+{TEXT -1 118 "Notice that you can also create a LinBoxBB object from a
+ pre-created Matrix.  In this case, let's use the 60th, prime:" }}}
+{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 36 "Diag2s := LinBoxBB(ithprime(
+60), M);" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%'Diag2sG`6$%*getMatrixG%
+$keyGb6#%+thismoduleG6#%)destructG6#/%'unloadGF-6$%*getMatrixG%$keyG6
+\"6#QDMaple~Container~for~LinBox~blackboxF4F46*%\"kG%\"kG%(ExToMapG%(E
+xToMapG%-lbXgetMatrixG%-lbXgetMatrixG%.lbXkillMatrixG%.lbXkillMatrixG6
+\"6#%)destructG" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 2 "or" }}}{EXCHG 
+{PARA 0 "> " 0 "" {MPLTEXT 1 0 69 "Diag3s := LinBoxBB(ithprime(60), Ma
+trix(500,500, f, storage=sparse));" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#
+>%'Diag3sG`6$%*getMatrixG%$keyGb6#%+thismoduleG6#%)destructG6#/%'unloa
+dGF-6$%*getMatrixG%$keyG6\"6#QDMaple~Container~for~LinBox~blackboxF4F4
+6*%\"kG%\"kG%(ExToMapG%(ExToMapG%-lbXgetMatrixG%-lbXgetMatrixG%.lbXkil
+lMatrixG%.lbXkillMatrixG6\"6#%)destructG" }}}{EXCHG {PARA 0 "" 0 "" 
+{TEXT -1 348 "Notice that the Matrix used to initalize Diag3s had the \+
+option \"storage=sparse\" set.  This is a requirement of all Maple Mat
+rix's used to create LinBox Blackbox types (and in general a good idea
+, as LinBox works best with Sparse Matrices.  Note that any Maple Matr
+ix returned by the getMatrix() method is declared to have sparse stora
+ge by default." }}}{EXCHG {PARA 256 "" 0 "" {TEXT -1 0 "" }{TEXT 270 
+0 "" }{TEXT 271 56 "LinBox Algorithm functions - LBrank, LBdet and LBm
+inpoly" }}{PARA 0 "" 0 "" {TEXT -1 410 "Now that we've demonstrated th
+e basic blackbox type, we can call LinBox functions on them.  At the p
+resent, the LinBox project supports fast, probabilistic computation of
+ three aspects of a Matrix:  it's Rank, it's Determinant, and it's Min
+imal Polynomial.\n\nLet's say I wanted to calculate the rank of the di
+agonal Matrix I created in the previous section.  To do so, I would us
+e the LBrank command as follows:" }}}{EXCHG {PARA 0 "> " 0 "" 
+{MPLTEXT 1 0 23 "LinBox[LBrank](Diag1s);" }}{PARA 11 "" 1 "" {XPPMATH 
+20 "6#\"\"#" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG 
+{PARA 0 "" 0 "" {TEXT -1 73 "Let's compare that to the rank computed b
+y Maple's LinearAlgebra package:" }}}{EXCHG {PARA 0 "> " 0 "" 
+{MPLTEXT 1 0 76 "LinearAlgebra[Rank](Matrix(500,500,f, storage=sparse,
+ datatype=integer[4]));" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"#" }}}
+{EXCHG {PARA 0 "" 0 "" {TEXT -1 199 "The same result.  Notice that bot
+h functions gave the same result, as the rank of a Matrix is independa
+nt of the entries the field over which the Matrix's entries are.  Noti
+ce the timing differece - " }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 
+21 "time(LBrank(Diag1s));" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#$\"$2\"!
+\"$" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 61 "M := Matrix(500,500,
+ f, storage=sparse, datatype=integer[4]);" }}{PARA 11 "" 1 "" 
+{XPPMATH 20 "6#>%\"MG-%'RTABLEG6+\"*[XuX\"&%(integerG6#\"\"%%'MatrixG%
+'sparseG%.Fortran_orderG7\"\"\"#;\"\"\"\"$+&F2" }}}{EXCHG {PARA 0 "> \+
+" 0 "" {MPLTEXT 1 0 29 "time(LinearAlgebra[Rank](M));" }}{PARA 11 "" 
+1 "" {XPPMATH 20 "6#$\"'X%R(!\"$" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 
+105 "Now let's look at computing the Determinant of a Matrix.  This is
+ done with the LBdet command as follows:" }}}{EXCHG {PARA 0 "> " 0 "" 
+{MPLTEXT 1 0 14 "LBdet(Diag1s);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"
+\"!" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 74 "Compare that to the Determ
+inant computed by Maple's LinearAlgebra package:" }}}{EXCHG {PARA 0 ">
+ " 0 "" {MPLTEXT 1 0 30 "LinearAlgebra[Determinant](M);" }}{PARA 11 "
+" 1 "" {XPPMATH 20 "6#\"\"!" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 289 "N
+otice that though they both return the same number, they haven't retur
+ned the same answer.  While the LinearAlgebra package's Determinant fu
+nction returns the absolute Determinant, LinBox's determinant function
+ returns the Givaro::Modular Determinant.  The same is true of the Minimal Pol
+ynomial:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 20 "LBminpoly(Diag1
+s,x);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#,&*&\"#*)\"\"\"%\"xGF&F&*$)F'
+\"\"#F&F&" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 76 "LinearAlgebra[
+MinimalPolynomial](M,x); # best leave this running over-night\n" }}}
+{EXCHG {PARA 0 "" 0 "" {TEXT -1 142 "You can also call LBminpoly witho
+ut a symbolic argument, in which case you will recieve a Maple list of
+ the coefficients, lowest degree first:" }}}{EXCHG {PARA 0 "> " 0 "" 
+{MPLTEXT 1 0 19 "LBminpoly(Diag1s);\n" }}{PARA 11 "" 1 "" {XPPMATH 20 
+"6#7%\"\"!\"#*)\"\"\"" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 137 "Notice \+
+that the LinBox functions can be called on Maple Matrix types as well.
+  When doing so, you provide the prime specifying the field:" }}}
+{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 24 "LBrank(ithprime(30), M);" }}
+{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"#" }}}{EXCHG {PARA 0 "> " 0 "" 
+{MPLTEXT 1 0 23 "LBdet(ithprime(30), M);" }}{PARA 11 "" 1 "" {XPPMATH 
+20 "6#\"\"!" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 27 "LBminpoly(it
+hprime(30), M);" }{TEXT -1 0 "" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#7%\"
+\"!\"#*)\"\"\"" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 103 "In these cases
+, a blackbox type is created in the background and used without return
+ing a handle to it." }}}{EXCHG {PARA 257 "" 0 "" {TEXT -1 0 "" }{TEXT 
+272 20 "Using LinBox Vectors" }{TEXT 273 0 "" }}{PARA 0 "" 0 "" {TEXT 
+-1 0 "" }{TEXT 274 0 "" }{TEXT -1 138 "Just as a type is given to hand
+le Blackbox matrices, a type has also been given to handle external Ve
+ctor types.  This is the LinBoV type:" }}}{EXCHG {PARA 0 "> " 0 "" 
+{MPLTEXT 1 0 54 "V := LinBoxV(500, i-> if isprime(i) then 1 else 0 fi)
+;" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%\"VG`6$%*getVectorG%$keyGb6#%+t
+hismoduleG6#%)destructG6#/%'unloadGF-6$%*getVectorG%$keyG6\"6#QBMaple~
+container~for~LinBox~VectorF4F46*%\"kG%\"kG%.lbXkillVectorG%.lbXkillVe
+ctorG%(ExToMapG%(ExToMapG%-lbXgetVectorG%-lbXgetVectorG%,_m135564960G6
+#%)destructG" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 146 "These vectors ar
+e stored in external code and accessed via a key stored in the LinBoxV
+ type.  The LinBoxV type can be created using the following:" }}}
+{EXCHG {PARA 0 "" 0 "" {TEXT -1 44 "A length variable and procedure (s
+ee above)," }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 18 "A ready-made list:
+" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 41 "f := i -> if isprime(i)
+ then 1 else 0 fi;" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"fGf*6#%\"iG6
+\"6$%)operatorG%&arrowGF(@%-%(isprimeG6#9$\"\"\"\"\"!F(F(F(" }}}
+{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 36 "V := LinBoxV([seq(f(i), i=1.
+.500)]);" }{TEXT -1 0 "" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%\"VG`6$%*
+getVectorG%$keyGb6#%+thismoduleG6#%)destructG6#/%'unloadGF-6$%*getVect
+orG%$keyG6\"6#QBMaple~container~for~LinBox~VectorF4F46*%\"kG%\"kG%.lbX
+killVectorG%.lbXkillVectorG%(ExToMapG%(ExToMapG%-lbXgetVectorG%-lbXget
+VectorG6\"6#%)destructG" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 35 "and A \+
+ready-made Maple Vector type:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 
+0 83 "V := LinBoxV(Vector(500, i-> if isprime(i) then 1 else 0 fi, dat
+atype=integer[4]));" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%\"VG`6$%*getV
+ectorG%$keyGb6#%+thismoduleG6#%)destructG6#/%'unloadGF-6$%*getVectorG%
+$keyG6\"6#QBMaple~container~for~LinBox~VectorF4F46*%\"kG%\"kG%.lbXkill
+VectorG%.lbXkillVectorG%(ExToMapG%(ExToMapG%-lbXgetVectorG%-lbXgetVect
+orG%,_m135778512G6#%)destructG" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 
+167 "Notice in the last it is required that datatype=integer[4] be spe
+cified.  The LinBoxV type includes a method that returns a ready made \+
+Maple Vector called getVector():" }}}{EXCHG {PARA 0 "> " 0 "" 
+{MPLTEXT 1 0 20 "x := V:-getVector();" }}{PARA 11 "" 1 "" {XPPMATH 20 
+"6#>%\"xG-%'RTABLEG6*\"*Cb5N\"%)anythingG&%'VectorG6#%'columnG%,rectan
+gularG%.Fortran_orderG7\"\"\"\";F1\"$+&" }}}{EXCHG {PARA 0 "" 0 "" 
+{TEXT -1 45 "x can now be used to check the contents of V;" }}}{EXCHG 
+{PARA 0 "" 0 "" {TEXT -1 0 "" }{TEXT 275 0 "" }{TEXT 276 28 "LBapply a
+nd LBapplyTranspose" }}{PARA 0 "" 0 "" {TEXT -1 0 "" }{TEXT 277 0 "" }
+{TEXT -1 227 "The LBapply and LBapplyTranspose functions can be used t
+o apply a Blackbox Matrix to an external Vector.  LBapply and LBapplyT
+ranpose corresponds to the apply and applyTranspose functions in the B
+lackboxArchetype.  For example:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 
+1 0 25 "V1 := LBapply(Diag1s, V);" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>
+%#V1G`6$%*getVectorG%$keyGb6#%+thismoduleG6#%)destructG6#/%'unloadGF-6
+$%*getVectorG%$keyG6\"6#QBMaple~container~for~LinBox~VectorF4F46*%\"kG
+%\"kG%.lbXkillVectorG%.lbXkillVectorG%(ExToMapG%(ExToMapG%-lbXgetVecto
+rG%-lbXgetVectorG%,_m135779332G6#%)destructG" }}}{EXCHG {PARA 0 "> " 
+0 "" {MPLTEXT 1 0 35 "V1T := LBapplyTranspose(Diag1s, V);" }}{PARA 12 
+"" 1 "" {XPPMATH 20 "6#>%$V1TG`6$%*getVectorG%$keyGb6#%+thismoduleG6#%
+)destructG6#/%'unloadGF-6$%*getVectorG%$keyG6\"6#QBMaple~container~for
+~LinBox~VectorF4F46*%\"kG%\"kG%.lbXkillVectorG%.lbXkillVectorG%(ExToMa
+pG%(ExToMapG%-lbXgetVectorG%-lbXgetVectorG%-_m1095974244G6#%)destructG
+" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 243 "As you can see, these functi
+ons return another LinBoxV type.  As with the other functions in the L
+inBox interface, LBapply and LBapplyTranspose can take Maple Matrix an
+d Vector types (or a mix of LinBox and Maple types) as input.  For exa
+mple:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 34 "V2 := LBapply(ithp
+rime(30), M, V);" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%#V2G`6$%*getVect
+orG%$keyGb6#%+thismoduleG6#%)destructG6#/%'unloadGF-6$%*getVectorG%$ke
+yG6\"6#QBMaple~container~for~LinBox~VectorF4F46*%\"kG%\"kG%.lbXkillVec
+torG%.lbXkillVectorG%(ExToMapG%(ExToMapG%-lbXgetVectorG%-lbXgetVectorG
+%-_m1095975044G6#%)destructG" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 
+0 102 "V3 := LBapplyTranspose(Diag1s, Vector(500, i -> if isprime(i) t
+hen 1 else 0 fi, datatype=integer[4]));" }}{PARA 11 "" 1 "" {XPPMATH 
+20 "6#>%#V3G-%'RTABLEG6*\"*OECN\"%)anythingG&%'VectorG6#%'columnG%,rec
+tangularG%.Fortran_orderG7\"\"\"\";F1\"$+&" }}}{EXCHG {PARA 0 "> " 0 "
+" {MPLTEXT 1 0 76 "vm := Vector(500, i -> if isprime(i) then 1 else 0 \+
+fi, datatype=integer[4]);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%#vmG-%'
+RTABLEG6*\"*O5CN\"&%(integerG6#\"\"%&%'VectorG6#%'columnG%,rectangular
+G%.Fortran_orderG7\"\"\"\";F4\"$+&" }}}{EXCHG {PARA 0 "> " 0 "" 
+{MPLTEXT 1 0 44 "V4 := LBapplyTranspose(ithprime(30), M, vm);" }}
+{PARA 11 "" 1 "" {XPPMATH 20 "6#>%#V4G-%'RTABLEG6*\"*#*pLN\"%)anything
+G&%'VectorG6#%'columnG%,rectangularG%.Fortran_orderG7\"\"\"\";F1\"$+&
+" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 221 "Notice in the last example, \+
+the answer comes back as a Maple Vector rather than a LinBoxV type.  F
+Or the LBApply and LBApplyTranspose functions, if all the inputs are M
+aple types, all the outputs will also be Maple types." }}}{EXCHG 
+{PARA 0 "" 0 "" {TEXT -1 226 "As always, when using a Maple Matrix wit
+h a LinBox function, firsty give a prime that specifies the field of t
+he Matrix.  These functions could be used to create low-level LinBox p
+rocedures in Maple, were the user so inclined." }}}{EXCHG {PARA 0 "" 
+0 "" {TEXT -1 0 "" }{TEXT 278 0 "" }{TEXT 279 19 "Further Development
+" }{TEXT 280 0 "" }{TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 186 "As wi
+th all aspects of the LinBox project, this module is currently under d
+evelopment.  To aide in the development of LinBox algorithms in Maple,
+ under works are the following functions:" }}}{EXCHG {PARA 0 "" 0 "" 
+{TEXT -1 96 "LBdiag(prime, n) - Returns a blackbox object representing
+ a diagonal Matrix with random entries." }}}{EXCHG {PARA 0 "" 0 "" 
+{TEXT -1 89 "LBcompose(M1, M2) - Returns a blackbox object represeting
+ the composition of two Matrices" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 
+82 "LBtranspose(M1) - Returns a blackbox object representing the trans
+pose of a Matrix" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 256 "The develope
+r is currently accepting ideas, suggestions and angry flames.  If you \+
+have any constructive criticism, you can reach Rich Seagraves at seagr
+ave at cis.udel.edu.  Otherwise, messages pointed to /dev/null will be ju
+st fine :-).  Thank you very much." }}}}{MARK "5 0 0" 10 }{VIEWOPTS 1 
+1 0 1 1 1803 1 1 1 1 }{PAGENUMBERS 0 1 2 33 1 1 }
diff --git a/interfaces/maple-old/lbffpack.mpl b/interfaces/maple-old/lbffpack.mpl
new file mode 100644
index 0000000..d89e076
--- /dev/null
+++ b/interfaces/maple-old/lbffpack.mpl
@@ -0,0 +1,165 @@
+FFPACK:=module()
+	export LBMultiply,LBAddMultiply,LSPFactor,LQUPFactor,LBRank,LBDeterminant,LBInverse;
+	local fgemm,lsp,lbrank,lbdeterminant,lbinverse,create,libname;
+	option package, load=create, unload=gc;
+	description "Maple interface to FFPACK package";
+
+
+	create := proc()
+	libname :="/home/pgiorgi/Library/src/linbox/interfaces/maple/.libs/liblbmapleffpack.so"; 
+	fgemm:=define_external('fgemm',MAPLE,LIB=libname);
+	lsp:=define_external('lsp',MAPLE,LIB=libname);
+	lbrank:=define_external('rank',MAPLE,LIB=libname);
+	lbdeterminant:=define_external('determinant',MAPLE,LIB=libname);
+	lbinverse:=define_external('inverse',MAPLE,LIB=libname);
+	
+	end proc;
+
+	create();
+
+
+	LBMultiply:=proc()
+		# calls are :
+		#		LBMultiply(p,A,B) 		-> return A*B mod p
+		#		LBMultiply(p,alpha,A,B)		-> return alpha.A*B mod p
+		#		LBMultiply(p,A,B,C)		-> return C:= A*B mod p
+		#		LBMultiply(p,alpha,A,B,C)	-> return C:= alpha.A*B mod p
+
+		local m,n,k1,k2,alpha,C,a,b;
+	
+		if (type(args[2],Matrix)) then
+			alpha:=1;
+			m,k1 :=  LinearAlgebra:-Dimension(args[2]);
+			k2,n :=  LinearAlgebra:-Dimension(args[3]);
+			a:=2;b:=3;
+
+		elif (type(args[2],numeric)) then
+			alpha:=args[2];
+			m,k1 :=  LinearAlgebra:-Dimension(args[3]);
+			k2,n :=  LinearAlgebra:-Dimension(args[4]);
+			a:=3:b:=4;
+		else
+			error " 2nd argument should be either a Matrix or a numeric value";
+
+		end if;
+
+		if (k1<> k2) then
+			error "Dimensions don't match",k1,k2;
+		end if;
+	
+	
+		if (nargs <b+1) then
+			C:=LinearAlgebra:-Modular:-Create(args[1],m,n,float[8]);
+			fgemm(args[1],m,n,k1,alpha,args[a],args[b],0,C);
+		else	
+			fgemm(args[1],m,n,k1,alpha,args[a],args[b],0,args[b+1]);
+		end if;
+				
+	end proc;
+
+
+	LBAddMultiply:=proc()
+		# calls are:
+		#		 LBAddMultiply(p,alpha,A,B,beta,C) -> return C:= beta.C+alpha.A*B mod p
+
+		local m,n,k1,k2,m1,n1;
+	
+		m,k1:=  LinearAlgebra:-Dimension(args[3]);
+		k2,n:=  LinearAlgebra:-Dimension(args[4]);
+		m1,n1:= LinearAlgebra:-Dimension(args[6]);
+
+
+		
+		if ((k1<>k2) or ( m1<> m) or (n1 <> n)) then
+			error "Dimensions don't match";
+		end if;
+
+		fgemm(args[1],m,n,k1,args[2],args[3],args[4],args[5],args[6]);
+
+				
+	end proc;
+
+
+	LSPFactor:=proc()
+		# calls are:
+		#		LSPFactor(p,A)		-> return A,P ;   A:=[LSP] mod p (L is lower part of A , S is upper part of A)
+		#		LSPFactor(p,A,perm)	-> return A,perm; A:=[LSP],perm:=P
+
+		local m,n,P;
+		m,n:= LinearAlgebra:-Dimension(args[2]);
+			
+		if (nargs <3) then			
+			P:=rtable(1..n,subtype=Vector[column],datatype=integer[4],order=C_order);
+			#P:=Vector[column](1..n);
+			lsp(args[1],m,n,args[2],P,1);
+			return args[2],P;
+		else
+			lsp(args[1],m,n,args[2],args[3],1);
+			return args[2],args[3];	
+		end if;				
+
+	end proc;
+
+
+	LQUPFactor:=proc()
+		# calls are:
+		#		LQUPFactor(p,A)		-> return A,Q,P ;   A:=[LQUP] mod p (L is lower part of A  in compress form, U is upper part of A)
+		#		LQUPFactor(p,A,perm1,perm2)	-> return A,perm1,perm2; A:=[LSP],perm:=P
+
+		local m,n,P,Q;
+		m,n:= LinearAlgebra:-Dimension(args[2]);
+			
+		if (nargs <3) then
+			Q:=rtable(1..m,subtype=Vector[column],datatype=integer[4],order=C_order);
+			P:=rtable(1..n,subtype=Vector[column],datatype=integer[4],order=C_order);
+			lsp(args[1],m,n,args[2],P,2,Q);
+			return args[2],P,Q;
+		else
+			lsp(args[1],m,n,args[2],args[3],2,args[4]);	
+			return args[2],args[3],args[4];		
+		end if;				
+
+	end proc;
+
+	LBRank:=proc()
+		# calls are:
+		#		LBRank(p,A)	return rank(A mod p)
+
+		local m,n;
+		m,n:= LinearAlgebra:-Dimension(args[2]);
+		lbrank(args[1],m,n,args[2]);
+
+	end proc;
+
+	LBDeterminant:=proc()
+		# calls are:
+		#		LBDeterminant(p,A)	return determinant(A) mod p
+				local m,n;
+		m,n:= LinearAlgebra:-Dimension(args[2]);
+		lbdeterminant(args[1],m,n,args[2]);
+
+	end proc;
+
+	
+	LBInverse:=proc()
+		# calls are:
+		#		LBInverse(p,A)	return A^(-1) mod p
+		#		LBInverse(p,A,X) return X:=A^(-1) mod p
+
+		local m,n,X;
+		m,n:= LinearAlgebra:-Dimension(args[2]);
+		if (m<>n) then error "matrix should be square"; end if;
+
+		if (nargs <3) then
+			X:=LinearAlgebra:-Modular:-Create(args[1],m,m,float[8]);
+			lbinverse(args[1],m,args[2],X);
+		else
+			lbinverse(args[1],m,args[2],args[3]);
+		end if;
+
+	end proc;
+
+	
+
+
+end module;
diff --git a/interfaces/maple-old/lbmaple-ffpack.C b/interfaces/maple-old/lbmaple-ffpack.C
new file mode 100644
index 0000000..c3b7e6f
--- /dev/null
+++ b/interfaces/maple-old/lbmaple-ffpack.C
@@ -0,0 +1,444 @@
+/* Copyright (C) LinBox
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+
+
+//#define DEBUG 3
+
+
+#include "linbox/field/modular.h"
+#include "linbox/field/givaro-zpz.h"
+#include "fflas-ffpack/fflas/fflas.h"
+#include "fflas-ffpack/ffpack/ffpack.h"
+#include "maplec.h"
+
+using namespace LinBox;
+
+typedef Givaro::Modular<double> Field;
+//typedef Givaro::Modular<int32_t> Field;
+typedef Field::Element Element;
+
+
+extern "C"
+{
+
+
+	ALGEB fgemm(MKernelVector kv, ALGEB* argv )
+	{
+
+		/* expect arguments in following order:
+		   1- p (int prime)
+		   2- m (int)
+		   3- n (int)
+		   4- k (int)
+		   5- alpha (int)
+		   6- A (matrix)
+		   7- B (matrix)
+		   8- beta (int)
+		   9- C (matrix)
+		*/
+
+		//MaplePrintf(kv,"Givaro::Modular Matrix Mutiplication using LinBox library\n");
+
+		int p,m,n,k,alpha,beta;
+		p     = MapleToInteger32(kv,(ALGEB)argv[1]);
+		m     = MapleToInteger32(kv,(ALGEB)argv[2]);
+		n     = MapleToInteger32(kv,(ALGEB)argv[3]);
+		k     = MapleToInteger32(kv,(ALGEB)argv[4]);
+		alpha = MapleToInteger32(kv,(ALGEB)argv[5]);
+		beta  = MapleToInteger32(kv,(ALGEB)argv[8]);
+
+		Field F(p);
+		Element a,b;
+		F.init(a,alpha);
+		F.init(b,beta);
+		Element *A, *B, *C;
+
+		ALGEB Matrix;
+		RTableSettings settings;
+
+		// Check that argument 6,7,9 are float[8] rtable and return a pointer on it
+		Matrix = (ALGEB)argv[6];
+		RTableGetSettings(kv,&settings,Matrix);
+		if( settings.data_type != RTABLE_FLOAT64
+		    || settings.storage != RTABLE_RECT
+		    || !IsMapleNULL(kv,settings.index_functions) )
+			{
+				MaplePrintf(kv,"Making a copy \n");
+				/* not the format we wanted -- make a copy */
+				settings.data_type = RTABLE_FLOAT64;
+				settings.storage = RTABLE_RECT;
+				settings.index_functions = ToMapleNULL(kv);
+				settings.foreign = FALSE;
+				Matrix = RTableCopy(kv,&settings,Matrix);
+			}
+		A = (Element*)RTableDataBlock(kv,Matrix);
+		//Ae=new Element[m*k];
+		//for (int i=0;i<m*k;i++)
+		//  *(Ae+i)=*(A+i);
+
+		Matrix = (ALGEB)argv[7];
+		RTableGetSettings(kv,&settings,Matrix);
+		if( settings.data_type != RTABLE_FLOAT64
+		    || settings.storage != RTABLE_RECT
+		    || !IsMapleNULL(kv,settings.index_functions) )
+			{
+				MaplePrintf(kv,"Making a copy \n");
+				/* not the format we wanted -- make a copy */
+				settings.data_type = RTABLE_FLOAT64;
+				settings.storage = RTABLE_RECT;
+				settings.index_functions = ToMapleNULL(kv);
+				settings.foreign = FALSE;
+				Matrix = RTableCopy(kv,&settings,Matrix);
+			}
+		B = (Element*)RTableDataBlock(kv,Matrix);
+		//Be=new Element[k*n];
+		//for (int i=0;i<k*n;i++)
+		//  *(Be+i)=*(B+i);
+
+		Matrix = (ALGEB)argv[9];
+		RTableGetSettings(kv,&settings,Matrix);
+		if( settings.data_type != RTABLE_FLOAT64
+		    || settings.storage != RTABLE_RECT
+		    || !IsMapleNULL(kv,settings.index_functions) )
+			{
+				MaplePrintf(kv,"Making a copy \n");
+				/* not the format we wanted -- make a copy */
+				settings.data_type = RTABLE_FLOAT64;
+				settings.storage = RTABLE_RECT;
+				settings.index_functions = ToMapleNULL(kv);
+				settings.foreign = FALSE;
+				Matrix = RTableCopy(kv,&settings,Matrix);
+			}
+		C = (Element*)RTableDataBlock(kv,Matrix);
+
+		//Ce=new Element[m*n];
+		FFLAS::fgemm(F,FFLAS::FflasNoTrans,FFLAS::FflasNoTrans,m,n,k,a,A,k,B,n,b,C,n);
+
+		Matrix = (ALGEB)argv[9];
+		RTableGetSettings(kv,&settings,Matrix);
+		switch (settings.data_type) {
+
+		case RTABLE_FLOAT64:
+			break;
+
+		case RTABLE_INTEGER32:
+			MaplePrintf(kv,"Converting the result to int[4]\n");
+			int* Ce;
+			Ce= (int *)RTableDataBlock(kv,Matrix);
+			for (int i=0;i<m*n;i++)
+				*(Ce+i)= (int) *(C+i);
+			break;
+
+		case RTABLE_DAG:
+			MaplePrintf(kv,"Converting the result to maple int\n");
+			ALGEB* Cee;
+			Cee= (ALGEB *)RTableDataBlock(kv,Matrix);
+			for (int i=0;i<m*n;i++)
+				*(Cee+i)= ToMapleInteger(kv,(long)*(C+i));
+			break;
+		}
+
+
+
+		return Matrix;
+
+	}
+}
+
+
+extern "C" {
+
+	ALGEB lsp(MKernelVector kv, ALGEB* argv )
+	{
+
+		/* expect arguments in following order:
+		   1- p (int prime)
+		   2- m (int)
+		   3- n (int)
+		   4- A (matrix)
+		   5- P (vector)
+		   6- k (method: k=1 -> LSP : k=2 -> LQUP)
+		   7- Q (vector) only needed when k=2
+
+		*/
+
+		int p=MapleToInteger32(kv,argv[1]);
+		int m,n,k;
+		m=MapleToInteger32(kv,(ALGEB)argv[2]);
+		n=MapleToInteger32(kv,(ALGEB)argv[3]);
+		k=MapleToInteger32(kv,(ALGEB)argv[6]);
+
+		Field F(p);
+
+
+		ALGEB Matrix,OutMatrix,Perm1,Perm2;
+		RTableSettings settings,oldsettings;
+
+		Matrix = (ALGEB)argv[4];
+		RTableGetSettings(kv,&settings,Matrix);
+		if( settings.data_type != RTABLE_FLOAT64
+		    || settings.storage != RTABLE_RECT
+		    || !IsMapleNULL(kv,settings.index_functions) )
+			{
+				RTableGetSettings(kv,&oldsettings,Matrix);
+				MaplePrintf(kv,"Making a copy \n");
+				/* not the format we wanted -- make a copy */
+				settings.data_type = RTABLE_FLOAT64;
+				settings.storage = RTABLE_RECT;
+				settings.index_functions = ToMapleNULL(kv);
+				settings.foreign = FALSE;
+				Matrix = RTableCopy(kv,&settings,Matrix);
+			}
+
+		Element *TMP1= (Element*) RTableDataBlock(kv,Matrix);
+
+		Perm1= (ALGEB)argv[5];
+		RTableGetSettings(kv,&settings,Perm1);
+
+
+		size_t *TMP2= (size_t*) RTableDataBlock(kv,Perm1);
+
+		if (k == 2) {
+			Perm2= (ALGEB) argv[7];
+			size_t *TMP3= (size_t*) RTableDataBlock(kv,Perm2);
+			FFPACK::LUdivine( F, FFLAS::FflasNonUnit, m, n, TMP1, n, TMP2, FFPACK::FfpackLQUP,TMP3);
+		}
+		else{
+			FFPACK::LUdivine( F, FFLAS::FflasNonUnit, m, n, TMP1, n, TMP2, FFPACK::FfpackLSP);
+		}
+
+
+
+		OutMatrix = (ALGEB)argv[4];
+
+		switch (settings.data_type) {
+
+		case RTABLE_FLOAT64:
+			OutMatrix=Matrix;
+			break;
+
+		case RTABLE_INTEGER32:
+			MaplePrintf(kv,"Converting the result to int[4]\n");
+			OutMatrix = RTableCopy(kv,&oldsettings,Matrix);
+			break;
+
+		case RTABLE_DAG:
+			MaplePrintf(kv,"Converting the result to maple int\n");
+			OutMatrix = RTableCopy(kv,&oldsettings,Matrix);
+			break;
+		}
+
+
+		return OutMatrix;
+	}
+
+}
+
+extern "C" {
+
+	ALGEB rank(MKernelVector kv, ALGEB* argv )
+	{
+		/* expect arguments in following order:
+		   1- p (int prime)
+		   2- m (int)
+		   3- n (int)
+		   4- A (matrix)
+		*/
+
+		int p=MapleToInteger32(kv,argv[1]);
+		int m,n;
+		m=MapleToInteger32(kv,(ALGEB)argv[2]);
+		n=MapleToInteger32(kv,(ALGEB)argv[3]);
+
+		Field F(p);
+		Element *A;
+
+		RTableSettings settings;
+		ALGEB Matrix = (ALGEB)argv[4];
+
+		RTableGetSettings(kv,&settings,Matrix);
+		if( settings.data_type != RTABLE_FLOAT64
+		    || settings.storage != RTABLE_RECT
+		    || !IsMapleNULL(kv,settings.index_functions) )
+			{
+				MaplePrintf(kv,"Making a copy \n");
+
+
+
+				/* not the format we wanted -- make a copy */
+				settings.data_type = RTABLE_FLOAT64;
+				settings.storage = RTABLE_RECT;
+				settings.index_functions = ToMapleNULL(kv);
+				settings.foreign = FALSE;
+				Matrix = RTableCopy(kv,&settings,Matrix);
+			}
+		A= (Element*) RTableDataBlock(kv,Matrix);
+
+		int rank=FFPACK::Rank(F,m,n,A,n);
+
+		return ToMapleInteger(kv,rank);
+	}
+}
+
+
+
+extern "C" {
+
+	ALGEB determinant(MKernelVector kv, ALGEB* argv )
+	{
+		/* expect arguments in following order:
+		   1- p (int prime)
+		   2- m (int)
+		   3- n (int)
+		   4- A (matrix)
+		*/
+
+		int p=MapleToInteger32(kv,argv[1]);
+		int m,n;
+		m=MapleToInteger32(kv,(ALGEB)argv[2]);
+		n=MapleToInteger32(kv,(ALGEB)argv[3]);
+
+		Field F(p);
+		Element *A;
+
+		RTableSettings settings;
+		ALGEB Matrix = (ALGEB)argv[4];
+
+		RTableGetSettings(kv,&settings,Matrix);
+		if( settings.data_type != RTABLE_FLOAT64
+		    || settings.storage != RTABLE_RECT
+		    || !IsMapleNULL(kv,settings.index_functions) )
+			{
+				MaplePrintf(kv,"Making a copy \n");
+				/* not the format we wanted -- make a copy */
+				settings.data_type = RTABLE_FLOAT64;
+				settings.storage = RTABLE_RECT;
+				settings.index_functions = ToMapleNULL(kv);
+				settings.foreign = FALSE;
+				Matrix = RTableCopy(kv,&settings,Matrix);
+			}
+		A= (Element*) RTableDataBlock(kv,Matrix);
+
+		Element d=FFPACK::Det(F,m,n,A,n);
+
+		return ToMapleInteger(kv,long(d));
+	}
+}
+
+
+extern "C" {
+
+	ALGEB inverse(MKernelVector kv, ALGEB* argv )
+	{
+		/* expect arguments in following order:
+		   1- p (int prime)
+		   2- m (int)
+		   3- A (matrix)
+		   4- X (matrix)
+		*/
+
+		int p=MapleToInteger32(kv,argv[1]);
+		int m;
+		m=MapleToInteger32(kv,(ALGEB)argv[2]);
+
+		Field F(p);
+		Element *A,*X;
+
+		RTableSettings settings;
+		ALGEB Matrix;
+
+		Matrix= (ALGEB)argv[3];
+		RTableGetSettings(kv,&settings,Matrix);
+		if( settings.data_type != RTABLE_FLOAT64
+		    || settings.storage != RTABLE_RECT
+		    || !IsMapleNULL(kv,settings.index_functions) )
+			{
+				MaplePrintf(kv,"Making a copy \n");
+				/* not the format we wanted -- make a copy */
+				settings.data_type = RTABLE_FLOAT64;
+				settings.storage = RTABLE_RECT;
+				settings.index_functions = ToMapleNULL(kv);
+				settings.foreign = FALSE;
+				Matrix = RTableCopy(kv,&settings,Matrix);
+			}
+		A= (Element*) RTableDataBlock(kv,Matrix);
+
+
+		Matrix= (ALGEB)argv[4];
+		RTableGetSettings(kv,&settings,Matrix);
+		if( settings.data_type != RTABLE_FLOAT64
+		    || settings.storage != RTABLE_RECT
+		    || !IsMapleNULL(kv,settings.index_functions) )
+			{
+				MaplePrintf(kv,"Making a copy \n");
+				/* not the format we wanted -- make a copy */
+				settings.data_type = RTABLE_FLOAT64;
+				settings.storage = RTABLE_RECT;
+				settings.index_functions = ToMapleNULL(kv);
+				settings.foreign = FALSE;
+				Matrix = RTableCopy(kv,&settings,Matrix);
+			}
+		X= (Element*) RTableDataBlock(kv,Matrix);
+
+		FFPACK::Invert(F,m,A,m,X,m);
+
+		Matrix = (ALGEB)argv[4];
+		RTableGetSettings(kv,&settings,Matrix);
+		switch (settings.data_type) {
+
+		case RTABLE_FLOAT64:
+			break;
+
+		case RTABLE_INTEGER32:
+			MaplePrintf(kv,"Converting the result to int[4]\n");
+			int* Ae;
+			Ae= (int *)RTableDataBlock(kv,Matrix);
+			for (int i=0;i<m*m;i++)
+				*(Ae+i)= (int) *(X+i);
+			break;
+
+		case RTABLE_DAG:
+			MaplePrintf(kv,"Converting the result to maple int\n");
+			ALGEB* Cee;
+			Cee= (ALGEB *)RTableDataBlock(kv,Matrix);
+			for (int i=0;i<m*m;i++)
+				*(Cee+i)= ToMapleInteger(kv,(long)*(X+i));
+			break;
+		}
+
+		return Matrix;
+	}
+}
+
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/interfaces/maple-old/lbmaple.C b/interfaces/maple-old/lbmaple.C
new file mode 100644
index 0000000..4a2c467
--- /dev/null
+++ b/interfaces/maple-old/lbmaple.C
@@ -0,0 +1,1441 @@
+/* Copyright (C) LinBox
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+#include "linbox/field/modular.h"
+#include "linbox/integer.h" // <- Wrapper for gmp BIG int support
+// #include "linbox/field/integer.h" <- When linbox supports computations
+//                                         over the whole integers
+#include "linbox/blackbox/triplesbb.h" // Special blackbox for this interface
+#include "linbox/solutions/rank.h"
+#include "linbox/solutions/det.h"
+#include "linbox/solutions/minpoly.h"
+// #include "linbox/solutions/ssolve.h" <- When linbox supports System solver
+
+#include <vector>
+#include <map>
+#include <utility>
+#include <cstring>
+#include <cstdio>
+
+#include "maplec.h"
+
+using LinBox::integer;
+typedef std::vector<long> Vectorl;
+typedef std::vector<integer> VectorI;
+typedef LinBox::TriplesBB<Givaro::Modular<long> > TriplesBBi;
+typedef LinBox::TriplesBB<Givaro::Modular<integer> > TriplesBBI;
+
+/* Type references: Used to identify the type of object pointed to by
+ * elements in the hash table.
+ * Types:  BlackBoxi - Black Box matrix, single-word size entries
+ *           Class:  LinBox::TriplesBB<Givaro::Modular<long>, std::vector<long> > (TriplesBBi)
+ *         BlackBoxI - Black Box matrix, multi-word size entries
+ *           Class:  LinBox::TriplesBB<Givaro::Modular<integer>, std::vector<integer> > (TriplesBBI)
+ *         SmallV - STL vector, single-word size entries
+ *           Class:  std::vector<long> (Vectorl)
+ *         LargeV - STL vector, multi-word size entries
+ *           Class:  std::vector<integer> (VectorI)
+ */
+
+const int BlackBoxi = 1;
+const int BlackBoxI = 2;
+const int SmallV = 3;
+const int LargeV = 4;
+
+extern "C"
+{
+  ALGEB End(MKernelVector kv, ALGEB* args);
+  ALGEB initBB(MKernelVector kv, ALGEB* args);
+  ALGEB getMatrix(MKernelVector kv, ALGEB* args);
+  ALGEB killMatrix(MKernelVector kv, ALGEB* args);
+  ALGEB initV(MKernelVector kv, ALGEB* args);
+  ALGEB getVector(MKernelVector kv, ALGEB* args);
+  ALGEB killVector(MKernelVector kv, ALGEB* args);
+  ALGEB apply(MKernelVector kv, ALGEB* args);
+  ALGEB applyT(MKernelVector kv, ALGEB* args);
+  ALGEB rank(MKernelVector kv, ALGEB* args);
+  ALGEB det(MKernelVector kv, ALGEB* args);
+  ALGEB minpoly(MKernelVector kv, ALGEB* args);
+  //  ALGEB ssolve(MKernelVector kv, ALGEB* args);
+}
+
+ALGEB & LiToM(MKernelVector &, const integer &, ALGEB &);
+integer & MtoLI(MKernelVector &, integer &, const ALGEB &);
+
+std::map<int,void*> hashTable;
+std::map<int, int> typeTable;
+
+
+/*  End -- LBmaple back-end module "destructor".  Cleans up all external data
+ *  when the LBmaple module goes out of scope and is garbage collected.
+ *  Pre-Condition:  attached maple module has gone out of scope and is
+ *         garbage collected.
+ *  Post-Condition: all dynamically allocated data is freed
+ */
+
+extern "C"
+{
+  ALGEB End(MKernelVector kv, ALGEB* args)
+  {
+    /* Four types of objects stored in memory */
+
+    TriplesBBi* BBip;
+    TriplesBBI* BBIp;
+    Vectorl* Vip;
+    VectorI* VIp;
+
+   std::map<int,int>::iterator f_i;
+   std::map<int,void*>::iterator h_i;
+
+   // For each object in the hashTable . . .
+    for( h_i = hashTable.begin(); h_i != hashTable.end(); ++h_i) {
+
+      // Find the objects type and switch appropriately. . .
+      f_i = typeTable.find(h_i->first);
+      switch( f_i->second ) {
+
+	// In each case, delete the object pointed to
+        case BlackBoxi:
+	   BBip = (TriplesBBi*) h_i->second;
+	   delete BBip;
+	   break;
+
+         case BlackBoxI:
+	   BBIp = (TriplesBBI*) h_i->second;
+	   delete BBIp;
+	   break;
+
+         case SmallV:
+	   Vip = (std::vector<long> *) h_i->second;
+	   delete Vip;
+	   break;
+
+         case LargeV:
+	   VIp = ( std::vector<integer> *) h_i->second;
+	   delete VIp;
+	   break;
+
+	   /* Of course there are more cases to follow */
+      }
+
+    }
+    // When all objects are deleted, return
+    return ToMapleNULL(kv);
+  }
+}
+
+/* initBB - Backend "constructor" for Maple BlackBox objects. Takes as input 3 types of objects
+ * from Maple:  A Maple NAG sparse Matrix, 3 vectors defining a word-size entry matrix, or
+ * 3 vectors defining a multi-word size entry matrix
+ * Declares the object in dynamic memory and hashes into hashTable and typeTable
+ * using the key supplied by Maple.
+ * Pre-Condition:  Called from Maple to create blackbox type
+ * Post-Condition:  Blackbox object exists in dynamic memory, can be called upon with key
+ * supplied by Maple
+ */
+
+extern "C"
+{
+  ALGEB initBB(MKernelVector kv, ALGEB* args)
+  {
+
+    // First get flag and key
+    // IN this c
+    int flag = MapleToInteger32(kv,args[1]), key = MapleToInteger32(kv,args[2]);
+    size_t m, n, nonzeros, i;
+
+    // perform an intial search to see if the key is stored in memory.  If so, return the key,
+    // the object already exists
+
+    // Otherwise, switch on the type
+    switch(flag) {
+
+      // The first type is the Maple NAG sparse matrix.  It is passed straight into the routine
+      // the prime is passed first, then the object.  All pertinant data can be lifted using
+      // Maple's extensive rtable API
+       case 1: {
+	 long p;
+	 int *data;
+	 NAG_INT *rowP, *colP;
+	 TriplesBBi* In;
+
+	 p = MapleToInteger32(kv, args[3]);
+	 m = RTableUpperBound(kv, args[4], 1);
+	 n = RTableUpperBound(kv, args[4], 2);
+	 nonzeros = RTableNumElements(kv, args[4]);
+
+	 // Get pointers to the data
+	 rowP = RTableSparseIndexRow(kv,args[4],1);
+	 colP = RTableSparseIndexRow(kv, args[4],2);
+	 data = (int*) RTableDataBlock(kv,args[4]);
+
+	 // Declare a new object on the heap
+	 Givaro::Modular<long> modF(p);
+	 In = new TriplesBBi(modF, m, n, nonzeros);
+
+	 // Add each entry
+	 for(i = 0; i < nonzeros; ++i) {
+	   In->addEntry( data[i], rowP[i], colP[i]);
+	 }
+
+	 // hash the pointer into the hasTable, the type into the typeTable using the key
+	 hashTable.insert(std::pair<int,void*>(key, In));
+	 typeTable.insert(std::pair<int,int>( key, BlackBoxi ));
+       }
+       break;
+
+
+       // In the second case, the user either A) Created a BlackBox from an existing sparse
+       // matrix in Maple, or created a Matrix by passing in parameters and a procedure
+       // In either case, the data is formatted in Maple, and a number of parameters are passed
+       // to this routine.
+       // First is the prime, then the row list, then the column list, the entry list, followed
+       // by the rows, columns, and number of non-zero entries.
+       case 2: {
+	 long p;
+	 TriplesBBi* In;
+
+	 p = MapleToInteger32(kv, args[3]);
+	 m = (size_t) MapleToInteger32(kv,args[7]);
+	 n = (size_t) MapleToInteger32(kv,args[8]);
+	 nonzeros = (size_t) MapleToInteger32(kv,args[9]);
+
+	 // Declares field and blackbox
+	 Givaro::Modular<long> modF(p);
+	 In = new TriplesBBi(modF, m, n, nonzeros);
+	 // Populates blackbox w/ entries
+	 for(i = 1; i <= nonzeros; i++) {
+	   In->addEntry( MapleToInteger32(kv, MapleListSelect(kv, args[4], i)), MapleToInteger32(kv, MapleListSelect(kv, args[5], i)), MapleToInteger32(kv, MapleListSelect(kv, args[6], i)));
+	 }
+
+	 hashTable.insert(std::pair<int,void*>(key, (void*) In));
+	 typeTable.insert(std::pair<int,int>(key, BlackBoxi));
+       }
+       break;
+
+
+       // In this case, a sparse Matrix was input, or a matrix was created w/ a procedure, but
+       // the matrix is defined by a multi-word size prime.  Data is passed in the order
+       // mentioned for case #2 above.  Notice that the function calls the MtoLI function
+       // to convert into a gmp integer
+      case 3:{
+	integer blank, iPrime;
+	VectorI Elements;
+	TriplesBBI* In;
+
+	iPrime = MtoLI(kv, iPrime, args[3]);
+	m = (size_t) MapleToInteger32(kv,args[7]);
+	n = (size_t) MapleToInteger32(kv,args[8]);
+	nonzeros = (size_t) MapleToInteger32(kv,args[9]);
+
+	// Declare Field and blackbox
+	Givaro::Modular<integer> modF(iPrime);
+	In = new TriplesBBI(modF, m, n, nonzeros);
+	for(i = 1; i <= nonzeros; i++) {
+	  In->addEntry( MtoLI(kv, blank, MapleListSelect(kv, args[4],i)), MapleToInteger32(kv, MapleListSelect(kv, args[5], i)), MapleToInteger32(kv, MapleListSelect(kv, args[6], i)));
+	}
+
+	hashTable.insert(std::pair<int,void*>(key, In));
+	typeTable.insert(std::pair<int,int>(key,BlackBoxI));
+      }
+      break;
+
+
+      // In case some weird operation is requested, just bail.
+      default:
+	MapleRaiseError(kv, "ERROR!  Confused by request.  No action performed.");
+	break;
+    }
+
+    return ToMapleNULL(kv);
+  }
+}
+
+
+
+
+
+/* initV - Backend "constructor" for LBmaple vector type.
+ * Can create either a wordsize entry
+ * vector, or a multi-precision vector (distinction made by entry size flag passed
+ * from Maple).  Declares the object in dynamic memory and hashes into hashTable and typeTable
+ * using the key supplied by Maple.
+ * Pre-Condition:  Called from Maple with initialized data in a correct format
+ * Post-Condition:  Blackbox object exists in dynamic memory, can be called upon with key
+ * supplied by Maple
+ */
+
+extern "C" {
+  ALGEB initV(MKernelVector kv, ALGEB* args)
+  {
+
+    // First get the flag and key to use.  The flag indicates what type of object was passed in
+    // the key what key it should be hashed against
+    int flag = MapleToInteger32(kv,args[1]), key = MapleToInteger32(kv,args[2]), length, index, i, j, L;
+    std::vector<long>* vP;
+    std::vector<integer>* VP;
+    integer blank;
+
+
+    // Performs a quick table check to see if the Vector has already been
+    // created.  If so, simply return it
+    std::map<int,void*>::iterator h_i = hashTable.find(key);
+    if( h_i != hashTable.end() ) {
+      return ToMapleInteger(kv, (long) key);
+    }
+
+    // A few good choices
+    switch( flag ) {
+
+      // For this case, a complete maple list of single-word size entries is passed
+      // in that will be translated (1-1) into an STL vector and hased in.
+       case 1:
+	 // First get the vector length
+	 length = MapleToInteger32(kv, args[4]);
+
+	 // dynamically allocate the new object, and reserve space in memory for savings
+	 vP = new std::vector<long>;
+	 vP->reserve(length);
+
+	 // initialize entries and hash into hashTable
+	 for(i = 1; i <= length; i++) {
+	   vP->push_back( MapleToInteger32(kv, MapleListSelect(kv, args[3], (M_INT) i)));
+	 }
+	 hashTable.insert(std::pair<int, void*>(key, vP));
+	 break;
+
+	 // For thsi case, a complete maple list of  multi-word sized entries is passed
+	 // in that will be translate (1-1) into an STL vector and hashed in.
+       case 2:
+	 length = MapleToInteger32(kv, args[4]);
+	 VP = new std::vector<integer>;
+	 VP->reserve(length);
+	 for(i = 1; i <= length; i++) {
+	   VP->push_back( MtoLI(kv, blank, MapleListSelect(kv, args[3], (M_INT) i)));
+	 }
+
+	 hashTable.insert(std::pair<int,void*>(key, VP));
+	 break;
+
+
+      // In this case, the vector passed in was parsed into a two lists, the first containing
+      // the data entries, the second containing the indice in which this entry goes.  Each of
+      // these entries are single word integers
+       case SmallV:
+
+	 // Initialzie variables, get length and first indice
+	 i = 1; j = 1;
+	 length = MapleToInteger32(kv, args[5]);
+	 L = MapleToInteger32(kv, args[6]);
+
+
+	 // For speed, ensures only 1 memory management adjustment in creation
+	 vP = new std::vector<long>;
+	 vP->reserve(L);
+	 for( ; i <= length; ++i) {
+
+	   index = MapleToInteger32(kv, MapleListSelect(kv, args[3], i));
+
+	   // All lists are passed back in sparse form, so just add zeros
+	   // until you get to the correct index
+	   while(j < index) {
+	     vP->push_back(0L);
+	     ++j;
+	   }
+
+	   // Add the nonzero entry
+	   vP->push_back( (long) MapleToInteger32(kv,MapleListSelect(kv,args[4], i)));
+
+	   // ++index
+	   ++j;
+	 }
+
+
+	 // Now populate the rest of V with 0's
+	 for(i = index + 1 ; i <= L; ++i)
+	   vP->push_back( 0L );
+
+	 hashTable.insert(std::pair<int,void*>(key, vP));
+	 break;
+
+    // Multi-word integer case.  As above, 2 sparse lists are passed in.  The first contains
+    // all the non-zero entries.  The second contains the indice of each element.
+    case LargeV:
+
+      i = 1; j = 1;
+      length = MapleToInteger32(kv,args[5]);
+      L = MapleToInteger32(kv, args[6]);
+
+      VP = new std::vector<integer>;
+      VP->reserve(L );
+      for( ; i <= length; ++i ) {
+
+	index = MapleToInteger32(kv, MapleListSelect(kv, args[3], i));
+
+
+	while(j < index) {
+	  VP->push_back( integer(0) );
+	  ++j;
+	}
+
+	// Add a nonzero entry
+	VP->push_back( MtoLI(kv, blank, MapleListSelect(kv,args[4], i) ));
+
+	++j;
+	// ++index :-)
+	index = MapleToInteger32(kv,MapleListSelect(kv,args[3],i));
+      }
+
+      for( ; i <= L; ++i)
+	VP->push_back( integer(0) );
+
+
+      hashTable.insert(std::pair<int,void*>(key, VP));
+      break;
+
+      // In case a weird action is performed, just bail out
+      default:
+	MapleRaiseError(kv,"ERROR! Confused by request.  Bailing out.");
+
+    }
+
+    // Corrects for list cases.  Ensures that the "flag" variable is either 3 or 4, so it will
+    // properly correspond to the type settings in the type table
+    // insert the type in the typeTable
+    if(flag < 3) flag += 2;
+
+    typeTable.insert(std::pair<int,int>(key,flag));
+    return ToMapleNULL(kv);
+  }
+}
+
+
+
+
+
+
+/* killMatrix - BackEnd "destructor" for a Maple blackbox element that goes out of scope.
+ * Deletes the blackbox.
+ * Pre-condition: The object hashed to by key is an active BlackBox matrix.
+ * Post-condition:  The BlackBox matrix hashed to by key is freed
+ */
+
+
+extern "C"
+{
+  ALGEB killMatrix(MKernelVector kv, ALGEB* args)
+  {
+    char err[] = "ERROR!  Associated blackbox object does not exist!";
+    int key = MapleToInteger32(kv,args[1]), flag;
+
+    // Gets the type in question
+    std::map<int,int>::iterator i = typeTable.find(key);
+
+    // If the associated object code is not there, we have a problem.  Bail.
+    if( i == typeTable.end() )
+      MapleRaiseError(kv,err);
+
+    // Otherwise we're good
+    flag = i->second;
+
+    // Erase the entry from the typeTable
+    typeTable.erase(key);
+
+    // hash out the pointer
+    std::map<int, void*>::iterator h_i = hashTable.find(key);
+    if( h_i != hashTable.end() ) {
+
+      switch( flag ) { // Free the data, whatever it is
+        case BlackBoxi:{
+	  TriplesBBi* ptr = (TriplesBBi*) h_i->second;
+	  delete ptr;
+	}
+	break;
+
+        case BlackBoxI: {
+	  TriplesBBI* ptr = (TriplesBBI*) h_i->second;
+	  delete ptr;
+	}
+	break;
+
+      }
+
+      // remove the pointer and bail
+      hashTable.erase(key);
+    }
+
+    return ToMapleNULL(kv);
+  }
+}
+
+
+
+
+
+
+/* killVector - Backend "destructor" for a linbox vector object in Maple.  Takes as input a key to the
+ * data.  Frees up dynamic memory and removes the object from the hash tables
+ * Pre-Condition: key is a key to a valid vector object
+ * Post-Condition:  Dynamic memory is freed and the object is removed from the hash tables.
+ */
+
+extern "C"
+{
+  ALGEB killVector(MKernelVector kv, ALGEB* args)
+  {
+    // Gets the key
+    int key = MapleToInteger32(kv, args[1]), flag;
+    char err[] = "ERROR! Associated Vector object does not exist!";
+
+    // Checks to see if the object is there.  If not, bail
+    std::map<int,int>::iterator f_i = typeTable.find(key);
+    if( f_i == typeTable.end() )
+      MapleRaiseError( kv, err);
+
+    // We're good otherwise
+    flag = f_i->second;
+
+    // In case the flag is there but the data isn't
+    typeTable.erase(key);
+
+    // Get ahold of the data
+    std::map<int,void*>::iterator h_i = hashTable.find(key);
+    if( h_i != hashTable.end() ) {
+
+      // Switch according to the vector type, small or large
+      switch( flag) {
+
+         case SmallV: {
+	   Vectorl* ptr = (Vectorl*) h_i->second;
+	   delete ptr;
+	 }
+	 break;
+
+         case LargeV: {
+	   VectorI* ptr = (VectorI*) h_i->second;
+	   delete ptr;
+	 }
+	 break;
+
+      }
+
+      hashTable.erase(key);
+    }
+
+    // Do nothing if it isn't in there
+    return ToMapleNULL(kv);
+  }
+}
+
+
+
+
+
+
+
+/* getMatrix - Returns an rtable object initialized with the data from the blackbox.  This is a bit
+ * of a hack, as the differences between Maple versions becomes an issue.  There are two methods:
+ * 1)  (if using Maple 7) use string tools to build a string that embodies the proper command to
+ * declare an rtable object, and invoke this command with the MapleEvalStatement() function, or
+ * 2)  use Maple's RTable API to create a new RTable object (this works in Maple 8, and I'm
+ * presuming Maple 6 and 5.  Special thanks to tech support at Maple Soft for informing me that in
+ * maple 7, the RTableCreate() function has been disabled).
+ * Pre-Condition:  The key provided by the call hashes to a valid BlackBox object
+ * Post-Condition:  An RTable object initialized with the entries of the Black Box is returned to Maple
+ */
+
+extern "C"
+{
+  ALGEB getMatrix(MKernelVector kv, ALGEB* args)
+  {
+    // Get the key
+    int key = MapleToInteger32(kv,args[1]), flag;
+    char err[] = "ERROR!  The associated BlackBox object does not exist!";
+    M_INT index[2], bound[4];
+    RTableData d;
+    ALGEB rtable, blank;
+    RTableSettings s;
+    std::vector<size_t> Row, Col;
+    std::vector<size_t>::const_iterator r_i, c_i;
+    char MapleStatement[100] = "rtable(1..";
+
+
+    // Get the data type of the blackbox
+    std::map<int,int>::iterator f_i = typeTable.find(key);
+    if( f_i == typeTable.end() ) // In case the blackbox isn't there
+      MapleRaiseError(kv,err);
+    flag = f_i->second; // Otherwise, get the blackbox type
+
+    // Check that the data is there
+    std::map<int,void*>::iterator h_i = hashTable.find(key);
+    if(h_i != hashTable.end() ) {
+
+      // Switch according to mode - regular or "special fix" mode
+      switch( MapleToInteger32(kv, args[3])) {
+
+      case 1: // This is the Maple 7 case, "special fix" mode
+	      // Use the EvalMapleStatement() to call the rtable constructor in the
+	      // Maple environment
+
+	   // Switch according to the type
+	   switch(flag) {
+	   case BlackBoxi:{ // For single word entry matrices
+
+	     // Extract the necessary data
+	     TriplesBBi* BB = (TriplesBBi*) h_i->second;
+	     Vectorl Data = BB->getData();
+	     Row = BB->getRows();
+	     Col = BB->getCols();
+	     Vectorl::const_iterator d_i;
+
+	     // Builds the statement that will be used in the Maple 7 callback
+
+	     sprintf(MapleStatement + strlen(MapleStatement), "%d", BB->rowdim() );
+	     strcat(MapleStatement, ",1..");
+
+	     sprintf(MapleStatement + strlen(MapleStatement), "%d", BB->coldim() );
+	     strcat(MapleStatement, ", subtype=Matrix, storage=sparse);");
+
+	     // Perform the callback
+	     rtable = kv->evalMapleStatement(MapleStatement);
+
+	     // Insert each non-zero entry
+	     for(d_i = Data.begin(), r_i = Row.begin(), c_i = Col.begin(); r_i != Row.end(); ++d_i, ++c_i, ++r_i) {
+	       index[0] = *r_i; index[1] = *c_i;
+	       d.dag = ToMapleInteger(kv, *d_i); // d is a union, dag is the
+	                                        // ALGEB union field
+	       RTableAssign(kv, rtable, index, d);
+	     }
+	   }
+	   break;
+
+	   case BlackBoxI: { // For multi-word size matrix types
+	     TriplesBBI* BB = (TriplesBBI*) h_i->second;
+	     VectorI Data = BB->getData();
+	     VectorI::const_iterator d_i;
+
+	     // Build and execute the Maple callback
+	     sprintf(MapleStatement + strlen(MapleStatement), "%d", BB->rowdim() );
+	     strcat(MapleStatement, ", 1..");
+	     sprintf(MapleStatement + strlen(MapleStatement), "%d", BB->coldim() );
+	     strcat(MapleStatement, ", subtype=Matrix, storage=sparse);");
+	     rtable = kv->evalMapleStatement(MapleStatement);
+
+	     for(d_i = Data.begin(), r_i = Row.begin(), c_i = Col.begin(); r_i != Row.end(); ++d_i, ++r_i, ++c_i) {
+	       index[0] = *r_i; index[1] = *c_i;
+
+	       //    * Okay, here's how this line works.  Basically,
+	       //    * in order to set the entries of this RTable to
+	       //    * multi-precision integers, I have to first use my own conversion
+	       //    * method, LiToM, to convert the integer entry to a ALGEB structure,
+	       //    * then do a callback into Maple that calls the ExToM procedure,
+	       //    * which converts the results of LiToM into a Maple multi-precision
+	       //    * integer. At the moment, this is the best idea I've got as to
+	       //    * how to convert a GMP integer into a Maple representation in one shot.
+	       //    *
+
+	       d.dag = EvalMapleProc(kv,args[2],1,LiToM(kv, *d_i, blank));
+	       RTableAssign(kv, rtable, index, d);
+             }
+	   }
+	   break;
+
+	   // In this case the object is not a BlackBox type
+	   default:
+	     MapleRaiseError(kv,err);
+	     break;
+	   }
+	break;
+
+      case 2: // Okay, here is the normal case.
+	      // Use RTableCreate to create a Maple rtable object
+
+	    kv->rtableGetDefaults(&s);
+	    // Get default settings - set datatype to Maple,
+	    // DAGTAG to anything
+
+	    s.subtype = RTABLE_MATRIX; // Subtype set to Matrix
+	    s.storage = RTABLE_SPARSE; // Storage set to sparse
+	    s.num_dimensions = 2; // What do you think this means :-)
+	    bound[0] = bound[2] = 1; // Set the lower bounds of each dimension to 0, which for maple is 1
+
+	    switch(flag) { // Switch on data type
+
+	    case BlackBoxi:{ // word size entry Matrix
+		TriplesBBi* BB = (TriplesBBi*) h_i->second;
+		Vectorl Data = BB->getData();
+		Row = BB->getRows();
+		Col = BB->getCols();
+		Vectorl::const_iterator d_i;
+
+		bound[1] = BB->rowdim();
+		bound[3] = BB->coldim();
+		rtable = kv->rtableCreate(&s, NULL, bound); // This is the RTableCreate function, it's
+		                                            // just the one that works
+
+		// Assign all the non-zero rows
+		for( d_i = Data.begin(), r_i = Row.begin(), c_i = Col.begin(); r_i != Row.end(); ++d_i, ++c_i, ++r_i) {
+		  index[0] = *r_i; index[1] = *c_i;
+		  d.dag = ToMapleInteger(kv, *d_i); // d is a union, dag is the
+	                                        // ALGEB union field
+		  RTableAssign(kv, rtable, index, d);
+		}
+	      }
+	      break;
+
+	    case BlackBoxI: { // For multi-word entry Matrices
+	      TriplesBBI* BB = (TriplesBBI*) h_i->second;
+	      VectorI Data = BB->getData();
+
+	      // Setup the Create() call
+	      VectorI::const_iterator d_i;
+	      Row = BB->getRows();
+	      Col = BB->getCols();
+	      bound[1] = BB->rowdim();
+	      bound[3] = BB->coldim();
+	      rtable = kv->rtableCreate(&s, NULL, bound); // Create an empty RTable
+
+	      // Populate the RTable using the callback method described below
+	      for(d_i = Data.begin(), r_i = Row.begin(), c_i = Col.begin(); r_i != Row.end(); ++d_i, ++r_i, ++c_i) {
+		index[0] = *r_i; index[1] = *c_i;
+
+	    //    * Okay, here's how this line works.  Basically,
+	   //    * in order to set the entries of this RTable to
+	   //    * multi-precision integers, I have to first use my own conversion
+	   //    * method, LiToM, to convert the integer entry to a ALGEB structure,
+	   //    * then do a callback into Maple that calls the ExToM procedure,
+	   //    * which converts the results of LiToM into a Maple multi-precision
+	   //    * integer. At the moment, this is the best idea I've got as to
+	   //    * how to convert a GMP integer into a Maple representation in one shot.
+
+	      d.dag = EvalMapleProc(kv,args[2],1,LiToM(kv, *d_i, blank));
+	      RTableAssign(kv, rtable, index, d);
+	      }
+	    }
+	  break;
+       }
+      }
+    }
+    else
+      MapleRaiseError(kv,err);
+
+    return rtable;
+  }
+}
+
+
+
+
+
+/* getVector - Returns a Maple vector initalized with the data from the LinBox vector.  As above,
+ * is a hack in order to support two differing versions in Maple.  Normally, would use the RTableCreate()
+ * function to properly create the Vector, but in Maple7 this isn't supported.  The code is essentially
+ * the same as above, accept that we are building a vector rather than a Matrix
+ * Pre-Condition:  the key provided hashes to a viable vector object in the hashTable
+ * Post-Condition:  A properly initalized vector object is returned to maple
+ */
+
+extern "C"
+{
+  ALGEB getVector(MKernelVector kv, ALGEB* args)
+  {
+    // Get the key, declare variables
+    int key = MapleToInteger32(kv,args[1]), flag;
+    char err[] = "ERROR!  The associated Vector object does not exist!";
+    M_INT index, bound[2];
+    RTableData d;
+    RTableSettings s;
+    ALGEB rtable, blank;
+    char MapleStatement[100] = "rtable(1..";
+
+
+    // Check to see if the object pointed to by key is in the type table.  If not, panic
+    std::map<int,int>::iterator f_i = typeTable.find(key);
+    if(f_i == typeTable.end() ) {
+      MapleRaiseError(kv, err);
+    }
+
+    // Otherwise, we have our object
+    flag = f_i->second;
+
+    // Get a pointer to the actual data
+    std::map<int,void*>::iterator h_i = hashTable.find(key);
+    if(h_i != hashTable.end() ) {
+
+      // Diverge over whether we are using maple 7 or 8 ( and 5 & 6)
+      // in Maple, arg 3 is a flag indicating which method to use
+      switch( MapleToInteger32(kv, args[3])) {
+
+	// In this case, Maple 7 is being used, we have to construct a call using "EvalMapleStatement()"
+	// to call the RTable constructor
+         case 1:
+
+	   switch(flag) {
+	   case SmallV:{
+	     // Get the vector
+	     Vectorl* V = (Vectorl*) h_i->second;
+	     Vectorl::const_iterator V_i;
+
+	     // Create the Maple object
+	     sprintf(MapleStatement + strlen(MapleStatement), "%d", V->size() );
+	     strcat(MapleStatement, ", subtype=Vector[column], storage=sparse)");
+	     rtable = kv->evalMapleStatement(MapleStatement);
+
+	     // populate the Maple vector w/ the entries from V above
+	     for(index = 1, V_i = V->begin(); V_i != V->end(); ++V_i, ++index) {
+	       d.dag = ToMapleInteger(kv, *V_i); // d is a union, dag is the
+	                                         // ALGEB union field
+	       RTableAssign(kv, rtable, &index, d);
+	     }
+	   }
+	   break;
+
+	   case LargeV: {
+	     // This part works the same way as above
+	     VectorI* V = (VectorI*) h_i->second;
+	     VectorI::const_iterator V_i;
+	     sprintf(MapleStatement + strlen(MapleStatement), "%d", V->size() );
+	     strcat(MapleStatement, ",subtype=Vector[column], storage=sparse)");
+	     rtable = kv->evalMapleStatement(MapleStatement);
+
+	     // Use maple callback to call the procedure from Maple that translates a gmp integer
+	     // into a large maple integer.  Then put this into the Maple vector
+	     for(index = 1, V_i = V->begin(); V_i != V->end(); ++V_i, ++index) {
+
+	       /* Okay, here's how this line works.  Basically,
+		* in order to set the entries of this RTable to
+		* multi-precision integers, I have to first use my own conversion
+		* method, LiToM, to convert the integer entry to a ALGEB structure,
+		* then do a callback into Maple that calls the ExToM procedure,
+		* which converts the results of LiToM into a Maple multi-precision
+		* integer. At the moment, this is the best idea I've got as to
+		* how to convert a GMP integer into a Maple representation in one shot.
+		*/
+
+	       d.dag = EvalMapleProc(kv,args[2],1,LiToM(kv, *V_i, blank));
+	       RTableAssign(kv, rtable, &index, d);
+	     }
+	   }
+	   break;
+
+	   default:
+	     MapleRaiseError(kv, err);
+	     break;
+	   }
+	   break;
+
+	   // In this case, use the simpler RTableCreate function, rather than building a string
+	   // that must be parsed by maple
+
+	   case 2:
+
+	     kv->rtableGetDefaults(&s); // Get default settings - set datatype to Maple,
+                               // DAGTAG to anything
+	     s.subtype = 2; // Subtype set to column vector
+	     s.storage = 4; // Storage set to rectangular
+	     s.num_dimensions = 1; // What do you think this means :-)
+	     bound[0] = 1; // Set the lower bounds of each dimension to 0
+
+	     switch(flag) {// Switch on data type of vector
+	     case SmallV:{ // single word integer entry vector
+	       Vectorl* V = (Vectorl*) h_i->second;
+	       Vectorl::const_iterator V_i;
+	       bound[1] = V->size();
+	       rtable = kv->rtableCreate(&s, NULL, bound); // Create the Maple vector
+
+	       for(index = 1, V_i = V->begin(); V_i != V->end(); ++V_i, ++index) {
+		 d.dag = ToMapleInteger(kv, *V_i); // d is a union, dag is the
+	                                        // ALGEB union field
+		 RTableAssign(kv, rtable, &index, d);
+	       }
+	     }
+	     break;
+
+	     case LargeV: { // Same as above for multi-word integer entry vector
+	       VectorI* V = (VectorI*) h_i->second;
+	       VectorI::const_iterator V_i;
+	       bound[1] = V->size();
+	       rtable = kv->rtableCreate(&s, NULL, bound);
+
+	       for(index = 1, V_i = V->begin(); V_i != V->end(); ++V_i, ++index) {
+
+
+		 /* Okay, here's how this line works.  Basically,
+		  * in order to set the entries of this RTable to
+		  * multi-precision integers, I have to first use my own conversion
+		  * method, LiToM, to convert the integer entry to a ALGEB structure,
+		  * then do a callback into Maple that calls the ExToM procedure,
+		  * which converts the results of LiToM into a Maple multi-precision
+		  * integer. At the moment, this is the best idea I've got as to
+		  * how to convert a GMP integer into a Maple representation in one shot.
+		  */
+
+		 d.dag = EvalMapleProc(kv,args[2],1,LiToM(kv, *V_i, blank));
+		 RTableAssign(kv, rtable, &index, d);
+	       }
+	     }
+	     break;
+
+	     default:
+	       MapleRaiseError(kv, err);
+	       break;
+	     }
+	     break; // breaks case 2.
+	     // This was causing a wicked error :-)
+
+
+      default:
+	MapleRaiseError(kv, err);
+	break;
+
+      }
+    }
+    else {
+      MapleRaiseError(kv, err);
+    }
+
+    return rtable;
+  }
+}
+
+
+
+
+
+
+/* apply - Application function,  Takes a Blackbox A and Vector X and performs the apply Ax.
+ * There's alot of code here that essentially leads to simply calling the BlackBox's apply routine,
+ * but there is alot that can go wrong with this call.
+ * Pre-Condition:  BlackBox & Vector objects exist in the hashtable; Blackbox data-type can handle
+ *      size of vector (ie - not trying to apply a large entry vector to a small entry Matrix
+ * Post-Condition: New Vector is produced, put into hash table for future calls, access key returned
+ *      to Maple
+ */
+
+extern "C"
+{
+  ALGEB apply(MKernelVector kv, ALGEB* args)
+  {
+    // There are probably a million better random number generators, but for the moment I use this one
+    int BBKey = MapleToInteger32(kv,args[1]), VKey = MapleToInteger32(kv,args[2]), bflag, vflag, nKey;
+    VectorI *tempIV, newV;
+    Vectorl *tempiV, *vp;
+    char MisMatchErr[] = "ERROR!  The Vector elements are not in the field of the Matrix!";
+    char BBnoFind[] = "ERROR!  The associated Blackbox object does not exist!";
+    char VectnoFind[] = "ERROR!  The associated Vector object does not exist!";
+
+    std::map<int,int>::iterator f_i;
+    std::map<int, void*>::iterator h_i;
+
+    // Get the random key from Maple
+    nKey = MapleToInteger32(kv, args[3]);
+
+    // Hash out the blackbox type
+    f_i = typeTable.find(BBKey);
+    if( f_i == typeTable.end() )
+      MapleRaiseError(kv, BBnoFind);
+    else
+      bflag = f_i->second;
+
+    // Hash out the vector type
+    f_i = typeTable.find(VKey);
+    if( f_i == typeTable.end() )
+      MapleRaiseError(kv, VectnoFind);
+    else
+      vflag = f_i->second;
+
+    // check that there isn't a type mismatch
+    if( bflag == BlackBoxi && vflag == LargeV)
+      // If this comes up, it means we have a large int vector, and a small int blackbox.  Bad
+      MapleRaiseError(kv, MisMatchErr);
+    else if( bflag == BlackBoxI && vflag == SmallV) {
+
+      // If this comes up, it means we have a small int vector, and a large int blackbox.  Not fatal.
+      h_i = hashTable.find(BBKey);
+      if( h_i == hashTable.end() )
+	MapleRaiseError(kv, BBnoFind);
+      TriplesBBI* BB = (TriplesBBI*) h_i->second;
+
+      h_i = hashTable.find(VKey);
+      if(h_i == hashTable.end() )
+	MapleRaiseError(kv, VectnoFind);
+
+      vp = (Vectorl*) h_i->second;
+
+      // Converts the small vector into a large vector
+      // Note, the reserve ensures there will only be at most one reallocation neccessary
+      newV.reserve(vp->size() );
+      for(Vectorl::iterator i = vp->begin(); i != vp->end(); ++i)
+	newV.push_back(integer(*i));
+
+      // Puts tempIV on the stack, so that it will persist.  Also, set the correct size
+      tempIV = new VectorI;
+      tempIV->resize( BB->coldim() );
+
+      // Perform the apply
+      BB->apply( *tempIV, newV);
+      hashTable.insert(std::pair<int,void*>(nKey, tempIV));
+      typeTable.insert(std::pair<int,int>(nKey, LargeV));
+
+    }
+    else { // In this case, the types match (single word integer matrix w/ single word integer vector,
+           // or multi-word entry w/ multi-word entry.  This simplifies the code a good bit
+
+      switch( bflag) {
+
+         case BlackBoxi: {
+
+	   // Get the BlackBox
+	   h_i = hashTable.find(BBKey);
+	   if( h_i == hashTable.end() )
+	     MapleRaiseError(kv, BBnoFind);
+	   TriplesBBi* BB = (TriplesBBi*) h_i->second;
+
+	   // Get the Vector
+	   h_i = hashTable.find(VKey);
+	   if( h_i == hashTable.end() )
+	     MapleRaiseError(kv, VectnoFind);
+	   vp = (Vectorl*) h_i->second;
+
+	   // Perform the apply.  Note, sets the temp vector's size to the columnar dimension
+	   tempiV = new Vectorl;
+	   tempiV->resize( BB->coldim() );
+	   BB->apply(*tempiV, *vp);
+
+	   // Hash the results
+	   hashTable.insert(std::pair<int, void*>(nKey, tempiV));
+	   typeTable.insert(std::pair<int,int>(nKey,SmallV));
+	 }
+	 break;
+
+         case BlackBoxI: {
+
+	   // Get the BlackBox
+	   h_i = hashTable.find(BBKey);
+	   if( h_i == hashTable.end() )
+	     MapleRaiseError(kv, BBnoFind );
+	   TriplesBBI* BB = (TriplesBBI*) h_i->second;
+
+	   // Get the vector
+	   h_i = hashTable.find(VKey);
+	   if( h_i == hashTable.end() )
+	     MapleRaiseError(kv, VectnoFind );
+	   VectorI* Vp = (VectorI*) h_i->second;
+
+	   // Perform the apply
+	   tempIV = new VectorI;
+	   tempIV->resize( BB->coldim() );
+	   BB->apply( *tempIV, *Vp);
+
+	   // Hash in the results
+	   hashTable.insert(std::pair<int,void*>(nKey, tempIV));
+	   typeTable.insert(std::pair<int,int>(nKey,LargeV));
+	 }
+	 break;
+      }
+    }
+
+    // If you get to this point, something has been hashed in, so return the key
+    return ToMapleInteger(kv, (long) nKey);
+  }
+}
+
+
+
+
+/* applyT - Application function.  Takes a Blackbox A and Vector X and performs the transpose apply,
+ * Atx.  There's alot of code here that essentially leads to simply calling the BlackBox's apply routine,
+ * but there is alot that can go wrong with this call.
+ * Pre-Condition:  BlackBox & Vector objects exist in the hashtable; Blackbox data-type can handle
+ *      size of vector (ie - not trying to apply a large entry vector to a small entry Matrix
+ * Post-Condition: New Vector is produced, put into hash table for future calls, access key returned
+ *      to Maple
+ */
+
+extern "C"
+{
+  ALGEB applyT(MKernelVector kv, ALGEB* args)
+  {
+
+    int BBKey = MapleToInteger32(kv,args[1]), VKey = MapleToInteger32(kv,args[2]), bflag, vflag, nKey;
+    char misMatchErr[] = "ERROR! Vector not in field of blackbox!";
+    char BBnoFindErr[] = "ERROR! The associated blackbox object does not exist!";
+    char VectNoFindErr[] = "ERROR! The associated vector object does not exist!";
+    VectorI *tempIV, newV;
+    Vectorl *tempiV, *vp;
+
+    std::map<int,int>::iterator f_i;
+    std::map<int, void*>::iterator h_i;
+
+
+    // Creates the new key
+    nKey = MapleToInteger32(kv, args[3]);
+
+    // Hash out the blackbox type
+    f_i = typeTable.find(BBKey);
+    if( f_i == typeTable.end() )
+      MapleRaiseError(kv,BBnoFindErr);
+    else
+      bflag = f_i->second;
+
+    // Hash out the vector type
+    f_i = typeTable.find(VKey);
+    if( f_i == typeTable.end() )
+      MapleRaiseError(kv,VectNoFindErr);
+    else
+      vflag = f_i->second;
+
+    // check that there isn't a type mismatch
+    if( bflag == BlackBoxi && vflag == LargeV)
+      // If this comes up, it means we have a large int vector, and a small int blackbox.  Bad
+      MapleRaiseError(kv, misMatchErr);
+    else if( bflag == BlackBoxI && vflag == SmallV) {
+
+      // If this comes up, it means we have a small int vector, and a large int blackbox.  Not fatal.
+
+
+      // Bail if data can't be found
+      h_i = hashTable.find(BBKey);
+      if( h_i == hashTable.end() )
+	MapleRaiseError(kv, BBnoFindErr);
+      TriplesBBI* BB = (TriplesBBI*) h_i->second;
+
+      h_i = hashTable.find(VKey);
+      if(h_i == hashTable.end() )
+	MapleRaiseError(kv, VectNoFindErr);
+
+      // Build a large entry vector and populate it with the converted data from the small entry vector
+      vp = (Vectorl*) h_i->second;
+      newV.reserve( vp->size() );
+      for(Vectorl::iterator i = vp->begin(); i != vp->end(); ++i)
+	newV.push_back(integer(*i));
+
+      // Puts tempIV on the stack, so that it will persist
+      tempIV = new VectorI;
+      tempIV->resize( BB->rowdim() );
+
+      // Perform the apply
+      BB->applyTranspose( *tempIV, newV);
+      hashTable.insert(std::pair<int,void*>(nKey, tempIV));
+      typeTable.insert(std::pair<int,int>(nKey, LargeV));
+
+    }
+    else { // For types that match (small Blackbox w/ small Vector or large blackbox w/ large vector)
+
+      switch( bflag) {
+
+         case BlackBoxi: {
+
+	   // Get the BlackBox
+	   h_i = hashTable.find(BBKey);
+	   if( h_i == hashTable.end() )
+	     MapleRaiseError(kv, BBnoFindErr);
+	   TriplesBBi* BB = (TriplesBBi*) h_i->second;
+
+	   // Get the Vector
+	   h_i = hashTable.find(VKey);
+	   if( h_i == hashTable.end() )
+	     MapleRaiseError(kv, VectNoFindErr);
+	   vp = (Vectorl*) h_i->second;
+
+	   // Perform the apply
+	   tempiV = new Vectorl;
+	   tempiV->resize( BB->rowdim() );
+	   BB->applyTranspose( *tempiV, *vp);
+
+	   // Hash the results
+	   hashTable.insert(std::pair<int, void*>(nKey, tempiV));
+	   typeTable.insert(std::pair<int,int>(nKey,SmallV));
+	 }
+	 break;
+
+         case BlackBoxI: {
+
+	   // Get the BlackBox
+	   h_i = hashTable.find(BBKey);
+	   if( h_i == hashTable.end() )
+	     MapleRaiseError(kv, BBnoFindErr);
+	   TriplesBBI* BB = (TriplesBBI*) h_i->second;
+
+	   // Get the vector
+	   h_i = hashTable.find(VKey);
+	   if( h_i == hashTable.end() )
+	     MapleRaiseError(kv, VectNoFindErr);
+	   VectorI* Vp = (VectorI*) h_i->second;
+
+	   // Perform the apply
+	   tempIV = new VectorI;
+	   tempIV->resize( BB->rowdim() );
+	   BB->applyTranspose( *tempIV, *Vp);
+
+	   // Hash in the results
+	   hashTable.insert(std::pair<int,void*>(nKey, tempIV));
+	   typeTable.insert(std::pair<int,int>(nKey,LargeV));
+	 }
+	 break;
+      }
+    }
+
+    // If you get to this point, something has been hashed in, so return the key
+    return ToMapleInteger(kv, (long) nKey);
+  }
+}
+
+
+
+
+
+/* rank - one of the three main "solution" functions, computes the rank of a BlackBox in the hash table
+ * Rank is computed using the rank function from the linbox repository
+ * Pre-Condition: key provided hashes to a valid blackbox object
+ * Post-Condition: the rank is returned to maple as an int
+ */
+
+extern "C"
+{
+  ALGEB rank(MKernelVector kv, ALGEB* args)
+  {
+    int key = MapleToInteger32(kv,args[1]), flag;
+    unsigned long result;
+    char err[] = "ERROR!  Associated blackbox object does not exist!";
+    TriplesBBi* BBi;
+    TriplesBBI* BBI;
+
+    std::map<int,int>::iterator f_i = typeTable.find(key);
+    std::map<int,void*>::iterator h_i;
+
+    if(f_i == typeTable.end() )
+      MapleRaiseError(kv,err);
+    else
+      flag = f_i->second;
+
+
+    h_i = hashTable.find(key);
+    if( h_i != hashTable.end() ) {
+      switch( flag ) {
+	case BlackBoxi:
+	  BBi = (TriplesBBi*) h_i->second;
+	  return ToMapleInteger(kv, LinBox::rank(result, *BBi, BBi->field() ) ); // <- actual computation starts
+	  break;                                                         //    here :-)
+
+         case BlackBoxI:
+	  BBI = (TriplesBBI*) h_i->second;
+	  return ToMapleInteger(kv,LinBox::rank(result, *BBI, BBI->field() ));
+	  break;
+      }
+    }
+    else
+      MapleRaiseError(kv,err);
+  }
+}
+
+
+/* det - Another major "application" function, this computes the determinant of the blackbox mod the
+ * prime using the LinBox determinant methods, of which I know very little.  Look at the
+ * documentation in the solutions directory for more details.
+ * Pre-condition: Key hashes to a valid BlackBox object
+ * Post-condition: The modular determinant of the blackbox is returned as a maple integer
+ */
+
+extern "C"
+{
+  ALGEB det(MKernelVector kv, ALGEB* args)
+  {
+    char err[] = "ERROR!  Associated blackbox object does not exist!";
+    int key = MapleToInteger32(kv,args[1]), flag;
+    std::map<int,int>::iterator f_i;
+    std::map<int,void*>::iterator h_i;
+    long resulti;
+    integer resultI;
+    ALGEB blank;
+    TriplesBBi *BBi;
+    TriplesBBI *BBI;
+
+
+    // Get the blackbox
+    f_i = typeTable.find(key);
+    if( f_i == typeTable.end() )
+      MapleRaiseError(kv,err);
+    else
+      flag = f_i->second;
+
+    // If it's there
+    h_i = hashTable.find(key);
+    if( h_i != hashTable.end() ) {
+
+      switch( flag ) { // switch on the type
+       case BlackBoxi:
+	 BBi = (TriplesBBi*) h_i->second;
+	 return ToMapleInteger(kv, LinBox::det(resulti, *BBi, BBi->field() ) );
+	 break;
+
+        case BlackBoxI:
+	 BBI = (TriplesBBI*) h_i->second;
+	 return LiToM(kv,  LinBox::det(resultI, *BBI, BBI->field() ), blank);
+
+	break;
+      }
+    }
+    else
+      MapleRaiseError(kv, err);
+  }
+}
+
+
+
+
+
+/* minpoly - Compute the minimal polynomial of the BlackBox matrix using linbox's minpoly solution.
+ * I have no clue how it works, just that it does.  This one is slightly more complicated than the
+ * other two above
+ * Pre-condition:  Key maps to a valid BlackBox object in the hashTable
+ * Post-condition: A Maple list of the polynomial coefficients, lowest degree first, is returned
+ */
+
+extern "C"
+{
+ALGEB minpoly(MKernelVector kv, ALGEB* args)
+  {
+    int i;
+    ALGEB retlist, blank;
+    char err[] = "ERROR!  Associated blackbox object does not exist!";
+    int key = MapleToInteger32(kv,args[1]), flag;
+    std::map<int,int>::iterator f_i;
+    std::map<int,void*>::iterator h_i;
+
+    // Get the data from the hash table
+    f_i = typeTable.find(key);
+    if( f_i == typeTable.end() )
+      MapleRaiseError(kv,err);
+    else
+      flag = f_i->second;
+
+
+    h_i = hashTable.find(key);
+    if(h_i != hashTable.end() ) { // We've got data
+      switch( flag ) {
+	// Getting the minimal polynomial is rather complicated, so both instances of this code were
+	// wrapped up inside a block, to cut down at the clutter at the top of this function.
+	// First declares a vector of the proper type and casts the pointer.  Then computes the minimal
+	// polynomial.  It then builds the proper Maple list structure for this application.
+
+
+         case BlackBoxi: {
+	   Vectorl mpreturn;
+	    Vectorl::iterator mp_i;
+	    TriplesBBi* BB = (TriplesBBi*) h_i->second;
+	    LinBox::minpoly( mpreturn, *BB, BB->field() );
+	    retlist = MapleListAlloc(kv, mpreturn.size() );
+	    for(i = 1, mp_i = mpreturn.begin(); mp_i != mpreturn.end(); ++mp_i, ++i)
+	      MapleListAssign(kv, retlist, i, ToMapleInteger(kv, *mp_i));
+	 }
+	 break;
+
+         case BlackBoxI: {
+	   VectorI mpreturn;
+	   VectorI::iterator mp_i;
+	   TriplesBBI* BB = (TriplesBBI*) h_i->second;
+	   LinBox::minpoly( mpreturn, *BB, BB->field() );
+	   retlist = MapleListAlloc(kv, mpreturn.size());
+	   for(i = 1, mp_i = mpreturn.begin(); mp_i != mpreturn.end(); ++mp_i, ++i)
+	     MapleListAssign(kv, retlist, i, LiToM(kv, *mp_i, blank));
+
+	 }
+	 break;
+      }
+    }
+    else
+      MapleRaiseError(kv,err);
+
+    return retlist;
+
+  }
+}
+
+/* LiToM - Converts from a GMP integer to a Maple list of word-size chunks
+ * these chunks are passed back into Maple and converted by into maple represented integers
+ * Pre-Condition:  In is an initialized GMP number, Out can be initialized (or re-initialized)
+ * Post-Condition: Out is an initalized maple integer containing the value of In
+ */
+
+ALGEB & LiToM(MKernelVector & kv, const integer & In, ALGEB & Out)
+{
+  // If we get lucky, this thing fits in one word, which is good, so we just
+  // straight convert it
+  if(In.size() == 1)
+    Out = ToMapleInteger(kv, Integer2long(In) );
+  else {
+    // Otherwise, create a list, and for each entry, add a word-sized chunk.
+    Out = MapleListAlloc(kv, In.size() );
+    for(size_t i = 1; i <= In.size(); ++i)
+      MapleListAssign(kv,Out,i,ToMapleInteger(kv,In[i-1]));
+  }
+
+  // Return the result for redundancy
+  return Out;
+}
+
+/* MtoLI - conversion between long integers passed from maple into gmp integers
+ * Uses Horners method.
+ * Pre-Condition:  Out is un-initialized (or can be re-initialized), In is either an int or a
+ *   list
+ * Post-Condition:  Out contains a GMP version of In.
+ */
+
+
+integer & MtoLI(MKernelVector & kv, integer & Out, const ALGEB &In)
+{
+  // We just need 1 base.  By default, Maple breaks all integers of a certain size up into
+  // mod 10000 chunks.  The chunks are put into a maple list, and then passed into code
+  static integer base(10000);
+  int num, i;
+
+  // This could be an int
+  if( IsMapleInteger32(kv,In) )
+    // if so, just convert it
+    Out = integer(MapleToInteger32(kv, In));
+  else {
+    // else, get the number of chunks, and convert the highest chunk of In
+    num = MapleToInteger32(kv, MapleListSelect(kv, In, 1) );
+    Out = integer(MapleToInteger32(kv, MapleListSelect(kv,In, num) ) );
+
+    for(i = num - 1; i > 1; --i) {
+      // For each additional chunk, multiply Out by the base, and add in the new chunk
+      Out *= base;
+      Out += MapleToInteger32(kv, MapleListSelect( kv, In, i));
+    }
+  }
+
+  // redundant
+  return Out;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/interfaces/maple-old/lbmaple.mpl.head b/interfaces/maple-old/lbmaple.mpl.head
new file mode 100644
index 0000000..ccb46ac
--- /dev/null
+++ b/interfaces/maple-old/lbmaple.mpl.head
@@ -0,0 +1,11 @@
+module LinBox() 
+	local create, destroy, lbXapply, lbXapplyT, lbXinitBB, lbXinitV,
+	lbXrank, lbXdet, lbXmp, lbXssolve, lbXstart1, lbXstart2, 
+	lbXend, lbXgetMatrix, lbXkillMatrix, lbXgetVector, lbXkillVector, lbXgetEntryVector, lbXgetEntryMatrix, ExToMap, MapToEx, libname, ObjKeyCount;
+	export LinBoxBB, LBrank, LBdet, LBminpoly, LBapply, LBapplyTranspose, LinBoxV; # LBDiag, LBSolve;
+	option package, load=create, unload=destroy;
+	description "Maple interface to LinBox methods & functions";
+
+	 create := proc()
+		global `type/LinBoxBB`, `type/LinBoxV`;
+		libname :=
\ No newline at end of file
diff --git a/interfaces/maple-old/lbmaple.mpl.tail b/interfaces/maple-old/lbmaple.mpl.tail
new file mode 100644
index 0000000..393eb02
--- /dev/null
+++ b/interfaces/maple-old/lbmaple.mpl.tail
@@ -0,0 +1,377 @@
+		lbXend := define_external('End', MAPLE,LIB=libname);
+		lbXapply := define_external('apply', MAPLE,LIB=libname);
+		lbXapplyT := define_external('applyT', MAPLE,LIB=libname);
+		lbXinitV := define_external('initV', MAPLE,LIB=libname);
+#		lbXdiag := define_external('diag', MAPLE,LIB=libname);
+		lbXinitBB := define_external('initBB', MAPLE,LIB=libname);
+		lbXrank := define_external('rank',MAPLE,LIB=libname);
+		lbXdet := define_external('det', MAPLE,LIB=libname);
+		lbXmp := define_external('minpoly', MAPLE,LIB=libname);
+#		lbXssolve := define_external('ssolve', MAPLE,LIB=libname);
+		lbXgetMatrix := define_external('getMatrix', MAPLE,LIB=libname);
+		lbXgetVector := define_external('getVector',MAPLE,LIB=libname);
+		lbXkillMatrix := define_external('killMatrix', MAPLE,LIB=libname);
+		lbXkillVector := define_external('killVector', MAPLE,LIB=libname);
+# 		lbXgetEntryVector := define_external('getEntryVector',MAPLE,LIB=libname);
+#		lbXgetEntryMatrix := define_external('getEntryMatrix',MAPLE,LIB=libname);
+		`type/LinBoxBB` :=  `module`(getMatrix) ;
+		`type/LinBoxV` := `module`(getVector) ;
+		ObjKeyCount := 0;
+	end proc;
+
+	create();
+
+	destroy := proc()
+		lbXend();
+	end proc;
+
+	ExToMap := proc()
+		local b0, s, r, A, i;
+		if type(args[1], integer) then
+			args[1];
+		else
+			A := args[1];
+			s := A[nops(A)];
+			b0 := 2^kernelopts(wordsize);
+			for i from nops(A) - 1 to 1 do
+				s := s * b0 + A[i];
+			od;
+			s
+		fi;
+	end proc;
+
+	MapToEx := proc(num::integer)
+		local r;
+		if num < kernelopts(maximmediate) then 
+			num;
+		else 
+			r := [disassemble(addressof(num))];
+			subsop(1=nops(r),r);
+		fi;
+	end proc;  
+
+	LinBoxBB := proc( )
+		local k, f, D, R, C, rows, cols, s, nnz, M, p, check;
+
+		if type(args[1], posint) then
+			if nargs = 1 then
+				k := args[1];
+			elif type(args[2], posint) and type(args[3], posint) and type(args[4], procedure) then
+				p := args[1];
+				rows := args[2];
+				cols := args[3];
+				ObjKeyCount := ObjKeyCount + 1;
+				k := ObjKeyCount;
+				check := x -> evalb(rhs(x) <> 0);
+				s := select(check, {seq(seq( (i,j)=apply(args[4],i,j), i=1..rows),j=1..cols)} ); # Pick out all the non-zero's
+				nnz := nops(s);
+				D := [seq(rhs(s[i]),i=1..nnz)];
+				R := [seq(lhs(s[i])[1], i=1..nnz)];
+				C := [seq(lhs(s[i])[2], i=1..nnz)];
+				lbXinitBB(2, k, p, D, R, C, rows, cols, nnz);
+		
+			elif type(args[2], Matrix) then
+				ObjKeyCount := ObjKeyCount + 1;
+				k := ObjKeyCount;
+				M := args[2]; p := args[1];
+				# if p = 0 then
+				# ... insert special code for integer ring
+				# computation, as opposed to finite field computation
+				if op(3,M)[1] = 'datatype=integer[4]' then
+					lbXinitBB(1, k, p, M);
+				elif p < kernelopts(maximmediate) then
+					s := op(2,M);
+					nnz := nops(s);
+					rows := op(1,M)[1]; cols := op(1,M)[2];
+					D := [seq(rhs(s[i]),i=1..nnz)];
+					R := [seq(lhs(s[i])[1],i=1..nnz)];
+					C := [seq(lhs(s[i])[2],i=1..nnz)];
+					lbXinitBB(2, k, p, D, R, C, rows, cols, nnz);
+				else
+					s := op(2,M);
+					nnz := nops(s);
+					rows := op(1,M)[1]; cols := op(1,M)[2];
+					D := [seq(MapToEx(rhs(s[i])),i=1..nnz)];
+					R := [seq(lhs(s[i])[1],i=1..nnz)];
+					C := [seq(lhs(s[i])[2],i=1..nnz)];
+					lbXinitBB(3, k, MapToEx(p), D, R, C, rows, cols, nnz);
+				fi;
+			else
+				error "Wrong number or type of parameters!";
+			fi;
+		else
+			error "Wrong number or type of parameters!";
+		fi;
+
+		module()
+			local destruct;
+			export getMatrix, key; # getEntry
+			option unload = destruct;
+			description "Maple Container for LinBox blackbox";
+
+			key := k;
+
+			getMatrix := proc()
+	# Implents difference between Maple 7 & 6(8)
+	# Many thanks to MapleSoft for pointing out the need for a workaround
+	# for Maple v7
+	# If you are running v7, run the "exceptional" function
+	# otherwise, run the normal function
+				if `Maple 7` = substring(kernelopts(version),1..7) then lbXgetMatrix(k, ExToMap , 1);
+				else lbXgetMatrix(k, ExToMap , 2);
+				fi;
+			end proc;
+	
+#			getEntry := proc(i::posint, j::posint)
+#				lbXgetEntryMatrix(key, i, j);
+#			end proc;
+
+			destruct := proc()
+				lbXkillMatrix(k):
+			end proc;
+				
+		end module
+
+	end proc;
+
+	LinBoxV := proc()
+		local k, index, L, mode, V, p, t, i, f;
+		if type(args[1], posint) then # two possibilities:  Vector from
+					      # a existing vector (key), or
+					      # build one from a proc
+			if nargs = 1 then
+				k := args[1];
+			elif type(args[2], 'procedure') then
+
+
+				ObjKeyCount := ObjKeyCount + 1;
+				k := ObjKeyCount;
+				mode := 1;
+				f := args[2];
+				p := proc(n)
+					local r;
+					r := MapToEx(apply(f, n));
+					if type(r, list) then mode := 2; fi;
+					r
+				end proc; 
+				
+
+
+				L := [seq(p(t), t=1..args[1])];
+				lbXinitV(mode, k, L, args[1]);
+			else
+				error "Wrong number or type of parameters!";			
+			end if;
+		elif type(args[1], Vector) then # No key, we're translating from a vector
+			ObjKeyCount := ObjKeyCount + 1;
+			k := ObjKeyCount;
+			V := args[1];
+			p := proc(n)
+				local r;
+				r := MapToEx(rhs(n));
+				if type(r,list) then mode := 4; fi;
+				r
+			end proc;
+			
+			mode := 3;
+			t := sort(op(table(op(2,V))), (x,y)->( lhs(x) < lhs(y) ) );
+			index := map(lhs, t);
+			L := map(p, t);
+			lbXinitV(mode, k, index, L, nops(index), op(1,V) );
+
+		elif type( args[1], list) then 
+			ObjKeyCount := ObjKeyCount + 1;
+
+			k := ObjKeyCount;
+			lbXinitV(1,k, args[1], nops(args[1]) ); 
+
+
+		else
+			error "Wrong number or type of parameters!";
+		fi;
+
+		module()
+			local destruct;
+			export getVector, key; #getEntry
+			description "Maple container for LinBox Vector";
+			option unload = destruct;
+				
+			key := k;
+
+			destruct := proc()
+				lbXkillVector(key);
+			end proc;
+
+#			getEntry := proc(i::posint)
+#				lbXgetEntryVector(key, i);
+#			end proc;
+
+			getVector := proc()
+	# Once again, split b/c of difference between Maple 7 and 6(8)
+	# For maple 7, run the special getMatrix function
+	# otherwise, run the normal function
+				if `Maple 7` = substring(kernelopts(version),1..7) then lbXgetVector(key, ExToMap, 1);
+				else lbXgetVector(key, ExToMap, 2);
+				fi;
+			end proc;
+			
+		end module
+	end proc;
+
+
+	LBapply := proc()
+		local M, V, R, f;
+
+		# if Matrix is not LinBox BB, make it so
+		if type(args[1], posint) and type(args[2], Matrix) then 
+			if type(args[3], Vector) then
+				M := LinBoxBB(args[1], args[2]);
+				V := LinBoxV(args[3]);
+				f := 1;
+			elif type(args[3], LinBoxV) then
+				M := LinBoxBB(args[1], args[2]);
+				V := args[3];
+				f := 2;
+			else
+				error "Wrong number or type of parameters!";
+			fi;
+
+		elif type(args[1], LinBoxBB) then
+			M := args[1];
+			if type(args[2], Vector) then
+				V := LinBoxV(args[2]);
+				f := 1;
+			elif type(args[2], LinBoxV) then
+				V := args[2];
+				f := 2;
+			fi;
+		else
+			error "Wrong number or type of parameters!";
+		fi;
+
+	
+		ObjKeyCount := ObjKeyCount + 1;
+
+		lbXapply(M:-key, V:-key, ObjKeyCount );
+
+		if f = 1 then # if the user sends the vector
+					      # as a maple type, return
+					      # as that type
+			R := LinBoxV(ObjKeyCount);
+			R:-getVector()
+		else
+			LinBoxV(ObjKeyCount)
+		end if;
+	end proc;
+
+	LBapplyTranspose := proc()
+		local M, V, R, f;
+		
+		if type(args[1], posint) and type(args[2], Matrix) then
+			if type(args[3], Vector) then
+				M := LinBoxBB(args[1], args[2]);
+				V := LinBoxV(args[3]);
+				f := 1;
+			elif type(args[3], LinBoxV) then
+				M := LinBoxBB(args[1], args[2]);
+				V := args[3];
+				f := 2;
+			else
+				error "Wrong number or type of parameters!";
+			fi;
+		elif type(args[1], LinBoxBB) then
+			M := args[1];
+			if type(args[2], Vector) then
+				V := LinBoxV(args[2]);
+				f := 1;
+			elif type(args[2], LinBoxV) then
+				V := args[2];
+				f := 2;
+			else
+				error "Wrong number or type of parameters!";
+			fi;
+		else
+			error "Wrong number or type of paramters!";
+		fi;
+
+		
+		ObjKeyCount := ObjKeyCount + 1;
+		lbXapplyT(M:-key, V:-key, ObjKeyCount );
+
+		if f = 1 then # if the user sends the vector
+					      # as a maple type, return
+					      # as that type
+			R := LinBoxV(ObjKeyCount);
+			R:-getVector();
+		else
+			LinBoxV(ObjKeyCount);
+		fi;
+	end proc;
+
+	LBrank := proc()
+		local M;
+		if type(args[1], LinBoxBB) then
+			M := args[1];
+		elif type(args[1], posint) and type(args[2], Matrix) then
+			M := LinBoxBB(args[1], args[2]);
+		else
+			error "Wrong number or type of parameters!";
+		fi;
+
+		lbXrank(M:-key);
+	end proc;
+
+	LBdet := proc()
+		local M;
+		if type(args[1], LinBoxBB) then
+			M := args[1];
+		elif type(args[1], posint) and type(args[2], Matrix) then
+			M := LinBoxBB(args[1], args[2]);
+		else
+			error "Wrong number or type of parameters!";
+		fi;
+		
+		lbXdet(M:-key);
+	end proc;
+
+	# minpoly function.  If no variable name is given, then a list
+	# containg the coefficients in sorted order, from degree lowest to
+	# highest is returned (note this is a dense coefficient vector, there
+	# are zeros here
+
+	LBminpoly := proc()
+		local L, i, x, M;
+		if type(args[1], LinBoxBB) then
+			M := args[1];
+			if nargs = 1 then 
+				x := true;
+			elif nargs = 2 and type(args[2],name) then
+				x := args[2];
+			else
+				error "Wrong number or type of parameters!";
+			fi;
+		elif type(args[1],posint) and type(args[2], Matrix) then
+			M := LinBoxBB(args[1], args[2]);
+			if nargs = 2 then 
+				x := true;
+			elif nargs = 3 and type(args[3], name) then
+				x := args[3];
+			else
+				error "Wrong number or type of parameters!";
+			fi;
+		else
+			error "Wrong number or type of parameters!";
+		fi;
+		
+		L := lbXmp(M:-key);
+		L := [seq(ExToMap(L[i]),i=1..nops(L))];
+		if type(x, boolean) then
+			L
+		else
+			add(ExToMap(L[i])*x^(i-1),i=1..nops(L))
+		end if;
+	end proc;
+
+end module:
+
+with(LinBox);			
diff --git a/interfaces/maple/Makefile.am b/interfaces/maple/Makefile.am
index d23032c..b68cf9c 100644
--- a/interfaces/maple/Makefile.am
+++ b/interfaces/maple/Makefile.am
@@ -24,13 +24,13 @@ pkgincludesubdir=$(includedir)/interfaces/maple/new
 
 AM_CPPFLAGS =-I$(top_srcdir) -I. -I../../linbox
 
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR -I../driver $(GMP_CFLAGS) $(NTL_CFLAGS) $(ATLAS_CFLAGS) $(FFLAS_FFPACK_CFLAGS) $(MAPLE_CFLAGS) $(GIVARO_CFLAGS)
+AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR -I../driver  $(NTL_CFLAGS) $(MAPLE_CFLAGS) 
 
 lib_LTLIBRARIES=liblbmaple.la
 
 liblbmaple_la_SOURCES= lb-maple.C
 
-liblbmaple_la_LDFLAGS=$(GIVARO_LIBS) $(GMP_LIBS) $(NTL_LIBS) $(BLAS_LIBS) $(MAPLE_LIBS) $(top_srcdir)/interfaces/driver/liblbdriver.la -Wl,-zmuldefs $(LDFLAGS)
+liblbmaple_la_LDFLAGS=  $(NTL_LIBS) $(MAPLE_LIBS) $(top_srcdir)/interfaces/driver/liblbdriver.la -Wl,-zmuldefs $(LDFLAGS)
 
 pkginclude_HEADERS =lb-maple.h lb-maple-utilities.h
 
diff --git a/interfaces/maple/Makefile.in b/interfaces/maple/Makefile.in
deleted file mode 100644
index eea2fcb..0000000
--- a/interfaces/maple/Makefile.in
+++ /dev/null
@@ -1,665 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = interfaces/maple
-DIST_COMMON = $(am__pkginclude_HEADERS_DIST) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"
-LTLIBRARIES = $(lib_LTLIBRARIES)
-liblbmaple_la_LIBADD =
-am__liblbmaple_la_SOURCES_DIST = lb-maple.C
- at LINBOX_HAVE_MAPLE_TRUE@am_liblbmaple_la_OBJECTS = lb-maple.lo
-liblbmaple_la_OBJECTS = $(am_liblbmaple_la_OBJECTS)
-liblbmaple_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(liblbmaple_la_LDFLAGS) $(LDFLAGS) -o $@
- at LINBOX_HAVE_MAPLE_TRUE@am_liblbmaple_la_rpath = -rpath $(libdir)
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = $(liblbmaple_la_SOURCES)
-DIST_SOURCES = $(am__liblbmaple_la_SOURCES_DIST)
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__pkginclude_HEADERS_DIST = lb-maple.h lb-maple-utilities.h
-HEADERS = $(pkginclude_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
- at LINBOX_HAVE_MAPLE_TRUE@pkgincludesubdir = $(includedir)/interfaces/maple/new
- at LINBOX_HAVE_MAPLE_TRUE@AM_CPPFLAGS = -I$(top_srcdir) -I. -I../../linbox
- at LINBOX_HAVE_MAPLE_TRUE@AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR -I../driver $(GMP_CFLAGS) $(NTL_CFLAGS) $(ATLAS_CFLAGS) $(FFLAS_FFPACK_CFLAGS) $(MAPLE_CFLAGS) $(GIVARO_CFLAGS)
- at LINBOX_HAVE_MAPLE_TRUE@lib_LTLIBRARIES = liblbmaple.la
- at LINBOX_HAVE_MAPLE_TRUE@liblbmaple_la_SOURCES = lb-maple.C
- at LINBOX_HAVE_MAPLE_TRUE@liblbmaple_la_LDFLAGS = $(GIVARO_LIBS) $(GMP_LIBS) $(NTL_LIBS) $(BLAS_LIBS) $(MAPLE_LIBS) $(top_srcdir)/interfaces/driver/liblbdriver.la -Wl,-zmuldefs $(LDFLAGS)
- at LINBOX_HAVE_MAPLE_TRUE@pkginclude_HEADERS = lb-maple.h lb-maple-utilities.h
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .C .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps interfaces/maple/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps interfaces/maple/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
-	}
-
-uninstall-libLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
-	done
-
-clean-libLTLIBRARIES:
-	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
-	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" != "$$p" || dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-liblbmaple.la: $(liblbmaple_la_OBJECTS) $(liblbmaple_la_DEPENDENCIES) $(EXTRA_liblbmaple_la_DEPENDENCIES) 
-	$(liblbmaple_la_LINK) $(am_liblbmaple_la_rpath) $(liblbmaple_la_OBJECTS) $(liblbmaple_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-.C.o:
-	$(CXXCOMPILE) -c -o $@ $<
-
-.C.obj:
-	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.C.lo:
-	$(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgincludeHEADERS: $(pkginclude_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
-	done
-
-uninstall-pkgincludeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(LTLIBRARIES) $(HEADERS)
-installdirs:
-	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
- at LINBOX_HAVE_MAPLE_FALSE@install-data-local:
- at LINBOX_HAVE_MAPLE_FALSE@install-data-hook:
-clean: clean-am
-
-clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
-	mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-data-local install-pkgincludeHEADERS
-	@$(NORMAL_INSTALL)
-	$(MAKE) $(AM_MAKEFLAGS) install-data-hook
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am: install-libLTLIBRARIES
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-libLTLIBRARIES uninstall-pkgincludeHEADERS
-
-.MAKE: install-am install-data-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libLTLIBRARIES clean-libtool ctags distclean \
-	distclean-compile distclean-generic distclean-libtool \
-	distclean-tags distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am \
-	install-data-hook install-data-local install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am \
-	install-libLTLIBRARIES install-man install-pdf install-pdf-am \
-	install-pkgincludeHEADERS install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-	pdf pdf-am ps ps-am tags uninstall uninstall-am \
-	uninstall-libLTLIBRARIES uninstall-pkgincludeHEADERS
-
-
- at LINBOX_HAVE_MAPLE_TRUE@install-data-local:
- at LINBOX_HAVE_MAPLE_TRUE@	sh lb-maple-path.sh "$(libdir)/liblbmaple.so"
- at LINBOX_HAVE_MAPLE_TRUE@	$(INSTALL_DATA) lb-maple.mpl $(libdir)/lb-maple.mpl
-
- at LINBOX_HAVE_MAPLE_TRUE@install-data-hook:
- at LINBOX_HAVE_MAPLE_TRUE@	cd $(libdir) && \
- at LINBOX_HAVE_MAPLE_TRUE@	$(MAPLE_HOME)/bin/maple lb-maple.mpl 2>&1 > /dev/null
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/interfaces/maple/lb-maple-path.pl b/interfaces/maple/lb-maple-path.pl
new file mode 100644
index 0000000..5df3c80
--- /dev/null
+++ b/interfaces/maple/lb-maple-path.pl
@@ -0,0 +1,4 @@
+#!/usr/bin/perl 
+
+$sentence=
+s/lbpathvalue/lbpath:=$ARGV[1];
\ No newline at end of file
diff --git a/interfaces/maple/lb-maple-path.sh b/interfaces/maple/lb-maple-path.sh
new file mode 100644
index 0000000..062e309
--- /dev/null
+++ b/interfaces/maple/lb-maple-path.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/sh
+
+if test -r "lb-maple.mpl.bak"; then
+    mv lb-maple.mpl.bak lb-maple.mpl
+fi
+
+sed -e "s|lbpathvalue|lbpath:=\"$1\";|" -i.bak lb-maple.mpl  
\ No newline at end of file
diff --git a/interfaces/maple/lb-maple-utilities.h b/interfaces/maple/lb-maple-utilities.h
index e85cba1..b4bab2f 100644
--- a/interfaces/maple/lb-maple-utilities.h
+++ b/interfaces/maple/lb-maple-utilities.h
@@ -26,7 +26,7 @@
 #ifndef __LINBOX_lb_maple_utilities_H
 #define __LINBOX_lb_maple_utilities_H
 
-#include "linbox-config.h"
+#include "linbox/linbox-config.h"
 #include <lb-driver.h>
 extern "C" {
 #include <gmp.h>
diff --git a/interfaces/maple/lb-maple.mpl.bak b/interfaces/maple/lb-maple.mpl.bak
new file mode 100755
index 0000000..91c8a4c
--- /dev/null
+++ b/interfaces/maple/lb-maple.mpl.bak
@@ -0,0 +1,320 @@
+LinBox:= module()
+        description "Maple interface for LinBox library version 1.0 by Pascal Giorgi (LinBox project - www.linal.org)";
+	local lbpath, lbInit, lbEnd, lbStart, lbStop:
+	export lbDeterminant, lbRank, lbMinpoly, lbCharpoly, lbSolve, Dev:
+	option package, load=lbInit, unload=lbEnd: 
+	
+	lbpathvalue
+
+	############################################################# 
+	# Function to initialize LinBox driver and LinBox interface #
+	#############################################################	
+	lbStart  := define_external('lbStart' , MAPLE, LIB=lbpath);
+	lbStop   := define_external('lbStop'  , MAPLE, LIB=lbpath);
+
+
+	lbInit := proc() printf("  LinBox/Maple Interface Package beta version 1.0 \n  by Pascal Giorgi (pascal.giorgi at univ-perp.fr)\n");			 
+			 lbStart();
+		  end proc;
+	lbEnd  := proc() end proc;#lbStop();end proc;  
+
+
+#####################################################################
+#############  Definition of the low level submodule ################
+#####################################################################
+
+	Dev:= module()
+	      description "low level interface for direct LinBox object manipulation";
+	        local lbInit, lbEnd;
+		export lbDataInfo,lbStart, lbStop,
+	        lbElement, lbDomain, lbBlackbox, lbVector, 
+	      	lbSetPrimeField, lbSetRationalField, lbSetIntegerRing,
+		lbCopyBlackbox, lbBlackboxDimension, lbSetBlackboxAtRandom, lbRebindBlackbox, lbWriteBlackbox, lbSetBlackbox,
+		lbCopyVector, lbVectorDimension, lbSetVectorAtRandom, lbRebindVector, lbWriteVector, lbSetVector,
+		lbWritePolynomial,
+		lbDeterminant, lbRank, lbMinpoly, lbCharpoly, lbSolve,
+		lbConvertElement, lbConvertBlackbox, lbConvertVector, lbConvertPolynomial,
+		lbCopy, lbWrite, lbDimension, lbRebind, lbRandom:       
+		option package, load=lbInit, unload=lbEnd:							
+
+		
+        	############################################################# 
+		# Function to initialize LinBox driver and LinBox interface #
+		#############################################################	
+		lbStart  := define_external('lbStart' , MAPLE, LIB=lbpath);
+		lbStop   := define_external('lbStop'  , MAPLE, LIB=lbpath);
+
+		######################################################
+		# Function to get information from the LinBox driver #
+		######################################################
+		lbDataInfo := define_external('lbDataInfo', MAPLE, LIB=lbpath);	
+
+		
+		########################################
+		# Function to set the LinBox data type #
+		########################################	
+		lbSetPrimeField    := define_external('lbSetPrimeField'     , MAPLE, LIB=lbpath);
+		lbSetRationalField := define_external('lbSetRationalField'  , MAPLE, LIB=lbpath);
+		lbSetIntegerRing   := define_external('lbSetIntegerRing'    , MAPLE, LIB=lbpath);
+		lbSetBlackbox      := define_external('lbSetBlackbox'       , MAPLE, LIB=lbpath);
+		lbSetVector        := define_external('lbSetVector'         , MAPLE, LIB=lbpath);
+
+
+		###############################################
+		# Function to create LinBox object from Maple #
+		###############################################	
+		lbElement   := define_external('lbCreateElement'   , MAPLE, LIB=lbpath);
+		lbDomain    := define_external('lbCreateDomain'    , MAPLE, LIB=lbpath);
+		lbBlackbox  := define_external('lbCreateBlackbox'  , MAPLE, LIB=lbpath);
+		lbVector    := define_external('lbCreateVector'    , MAPLE, LIB=lbpath);
+
+
+		#######################################
+		# Function for LinBox blackbox object #
+		#######################################		
+		lbCopyBlackbox        := define_external('lbCopyBlackbox'         , MAPLE, LIB=lbpath);
+		lbBlackboxDimension   := define_external('lbGetBlackboxDimension' , MAPLE, LIB=lbpath);
+		lbSetBlackboxAtRandom := define_external('lbSetBlackboxAtRandom'  , MAPLE, LIB=lbpath);
+		lbRebindBlackbox      := define_external('lbRebindBlackbox'       , MAPLE, LIB=lbpath);
+		lbWriteBlackbox       := define_external('lbWriteBlackbox'        , MAPLE, LIB=lbpath);
+		
+
+		#####################################
+		# Function for LinBox vector object #
+		#####################################
+		lbCopyVector        := define_external('lbCopyVector'         , MAPLE, LIB=lbpath);
+		lbVectorDimension   := define_external('lbGetVectorDimension' , MAPLE, LIB=lbpath);
+		lbSetVectorAtRandom := define_external('lbSetVectorAtRandom'  , MAPLE, LIB=lbpath);
+		lbRebindVector      := define_external('lbRebindVector'       , MAPLE, LIB=lbpath);
+		lbWriteVector       := define_external('lbWriteVector'        , MAPLE, LIB=lbpath);
+		
+		#########################################
+		# Function for LinBox polynomial object #
+		#########################################
+		lbWritePolynomial   := define_external('lbWritePolynomial'    , MAPLE, LIB=lbpath);
+	
+		##############################
+		# Available LinBox solutions #
+		##############################
+		lbDeterminant := define_external('lbDeterminant'  , MAPLE, LIB=lbpath);
+		lbRank        := define_external('lbRank'         , MAPLE, LIB=lbpath);	
+		lbMinpoly     := define_external('lbMinpoly'      , MAPLE, LIB=lbpath);
+		lbCharpoly    := define_external('lbCharpoly'     , MAPLE, LIB=lbpath);
+		lbSolve       := define_external('lbSolve'        , MAPLE, LIB=lbpath);	
+
+
+		##################################################
+		# Conversion from LinBox object to Maple Objects #
+		##################################################
+		lbConvertElement    := define_external('lbConvertElement'    , MAPLE, LIB=lbpath);
+		lbConvertBlackbox   := define_external('lbConvertBlackbox'   , MAPLE, LIB=lbpath);
+		lbConvertVector     := define_external('lbConvertVector'     , MAPLE, LIB=lbpath);
+		lbConvertPolynomial := define_external('lbConvertPolynomial' , MAPLE, LIB=lbpath);
+
+		####################
+		# Higher level API #
+		####################			
+		lbCopy      := define_external('lbCopy'       , MAPLE, LIB=lbpath);
+		lbWrite     := define_external('lbWrite'      , MAPLE, LIB=lbpath);
+		lbDimension := define_external('lbDimension'  , MAPLE, LIB=lbpath);
+		lbRebind    := define_external('lbRebind'     , MAPLE, LIB=lbpath);
+		lbRandom    := define_external('lbRandom'     , MAPLE, LIB=lbpath);	
+	
+	end module:
+
+##############################################################
+#############  end of the low level submodule ################
+##############################################################
+
+
+###################################################################
+#############  definition of the high level module ################
+###################################################################
+		
+
+		################################################
+		# Determinant computation from a Maple Matrix  #
+		################################################		
+		lbDeterminant := proc()
+		      local d, A, det, t;			  
+		      if (type(args[1], integer)) then	      	      
+		      	 if (type(args[2], Matrix)) then	      
+			    t := time();
+			    A  := Dev:-lbBlackbox(args[1], args[2]);			   					 
+			    t:= time()-t;
+			 else
+			    error("invalid argument",args[2], "must be a Matrix");
+			 end if;
+		      elif (type(args[1], Matrix)) then
+			    t := time();
+			    A := Dev:-lbBlackbox(args[1]);			
+			    t:= time()-t;					
+		      else
+			    error("invalid argument",args[1], "must be a Matrix");
+		      end if;		 		   
+		      d   := Dev:-lbDeterminant(A);		     		     
+		      det := Dev:-lbConvertElement(d); 
+		      if (printlevel>1) then
+			      print("conversion time:",t);
+		      end if;
+		      return det;			      
+		end;
+
+		########################################
+		# Rank computation from a Maple matrix #
+		########################################		
+		lbRank := proc()
+		      local A,t;
+		      if (type(args[1], integer)) then	      	      
+		      	 if (type(args[2], Matrix)) then	      
+			    t := time();
+			    A:=Dev:-lbBlackbox(args[1], args[2]); 
+			    t:=time()-t;
+			 else
+			    error("invalid argument",args[2], "must be a Matrix");
+			 end if;
+		      elif (type(args[1], Matrix)) then
+			   t := time();
+			   A := Dev:-lbBlackbox(args[1]);
+			   t:=time()-t;			
+		      else
+			    error("invalid argument",args[1], "must be a Matrix");
+		      end if;
+		      if (printlevel>1) then
+			      print("conversion time:",t);
+		      end if;
+		      return Dev:-lbRank(A);			      
+		end;
+
+		######################################################
+		# Minimal polynomial computation from a Maple matrix #
+		######################################################		
+		lbMinpoly := proc()
+		      local A, p, symb,t;
+		      if (type(args[1], integer)) then	      	      
+		      	 if (type(args[2], Matrix)) then
+			    if (type(args[3], name)) then
+			        t:=time(); 	      
+			        A:=Dev:-lbBlackbox(args[1], args[2]); 
+				t:=time()-t;
+				symb:=args[3];
+			    else
+				 error("invalid argument",args[3], "must be a name");
+		            end if;
+			 else
+			     error("invalid argument",args[2], "must be a Matrix");
+			 end if;  
+		      elif (type(args[1], Matrix)) then
+			   if (type(args[2], name)) then 
+			      t:=time(); 
+			      A := Dev:-lbBlackbox(args[1]);
+			      t:=time()-t;
+			      symb:=args[2];			
+		           else
+			      error("invalid argument",args[2], "must be a name");
+			   end if
+		      else
+			error("invalid argument",args[1], "must be a Matrix");
+		      end if;
+		      p:= Dev:-lbMinpoly(A); 
+		      if (printlevel>1) then
+			      print("conversion time:",t);
+		      end if;
+		      return Dev:-lbConvertPolynomial(p,symb);	 
+		end;
+
+		#############################################################
+		# Characteristic polynomial computation from a Maple matrix #
+		#############################################################		
+		lbCharpoly := proc()
+		      local A, p, symb,t;		      		      
+		      if (type(args[1], integer)) then	      	      
+		      	 if (type(args[2], Matrix)) then
+			    if (type(args[3], name)) then  
+			        t:=time(); 	      
+			        A:=Dev:-lbBlackbox(args[1], args[2]); 
+				t:=time()-t;
+				symb:=args[3];
+			    else
+				 error("invalid argument",args[3], "must be a name");
+		            end if;
+			 else
+			     error("invalid argument",args[2], "must be a Matrix");
+			 end if;  
+		      elif (type(args[1], Matrix)) then
+			   if (type(args[2], name)) then 
+			         t:=time(); 	
+				 A := Dev:-lbBlackbox(args[1]);
+  			 	 t:=time()-t;
+			      symb:=args[2];			
+		           else
+			      error("invalid argument",args[2], "must be a name");
+			   end if
+		      else
+			error("invalid argument",args[1], "must be a Matrix");
+		      end if;
+		      p:= Dev:-lbCharpoly(A); 
+		      if (printlevel>1) then
+			      print("conversion time:",t);
+		      end if;
+		      return Dev:-lbConvertPolynomial(p,symb);			      
+		end;
+
+		#############################################################
+		# Linear system solving from Maple matrix and Maple Vector  #
+		#############################################################		
+		lbSolve := proc()
+		      local A,b,x,y,t;
+		      if (type(args[1], integer)) then	     	      
+			 if (type(args[2], Matrix)) then	      
+			    if (type(args[3], Vector)) then 
+			        t:=time(); 	
+			        A:=Dev:-lbBlackbox(args[1], args[2]);
+				b:=Dev:-lbVector(args[1], args[3]); 
+				t:=time()-t;							  							 
+			    else
+				error("invalid argument",args[3], "must be a Vector");				    
+			    fi;	
+			 else
+			    error("invalid argument",args[2], "must be a Matrix");			 
+			 fi;   
+		      elif (type(args[1], Matrix)) then
+	      		   if (type(args[2], Vector)) then 
+			        t:=time(); 
+				A:=Dev:-lbBlackbox(args[1]);
+				b:=Dev:-lbVector(args[2]); 
+				t:=time()-t;
+			   else
+				error("invalid argument",args[2], "must be a Vector");	
+			   fi;
+		      else
+			   error("invalid argument",args[1], "must be a Matrix");
+		      fi;		      
+		      x:= Dev:-lbSolve(A,b);
+		      y:=Dev:-lbConvertVector(x); 
+		      if (printlevel>1) then
+			      print("conversion time:",t);
+		      end if;
+		      return y;			      
+		end;	
+end module:
+
+
+save_linbox:=proc(repo)
+	global savelibname,libname:
+	if (FileTools[Exists](cat(repo,"/maple.lib"))) then 
+		fremove(cat(repo,"/maple.lib"));
+		fremove(cat(repo,"/maple.ind"));
+#		fremove(cat(repo,"/maple.hdb"));
+		rmdir(repo);
+	fi:
+	if (not(FileTools[Exists](repo))) then mkdir(repo);fi:
+	march( 'create',repo, 1000 ):
+	savelibname := repo: libname := savelibname, libname:
+	savelib('LinBox'):
+end:
+
+save_linbox("LinBoxMaple");
+
+
+ 
diff --git a/interfaces/maple/linbox-demonstration-good.mw b/interfaces/maple/linbox-demonstration-good.mw
new file mode 100755
index 0000000..e93cb5b
--- /dev/null
+++ b/interfaces/maple/linbox-demonstration-good.mw
@@ -0,0 +1,2248 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Worksheet>
+<Version major="7" minor="0"/>
+<Label-Scheme value="2" prefix=""/>
+<View-Properties presentation="false"></View-Properties>
+<MapleNet-Properties warnlevel="3" longdelim="true" plotoptions="" echo="1" errorcursor="false" elisiontermsthreshold="10000" elisiontermsbefore="100" errorbreak="1" prettyprint="3" prompt="> " latexwidth="6.0" useclientjvm="true" ansi="false" screenheight="25" labelwidth="20" plotdevice="inline" typesetting="standard" displayprecision="-1" indentamount="4" elisiondigitsthreshold="10000" quiet="false" plotoutput="terminal" rtablesize="10" preplot="" showassumed="1" plotdriver="openviz [...]
+<Styles><Font name="Heading 4" background="[255,255,255]" bold="false" executable="false" family="Serif" foreground="[0,0,0]" italic="true" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Ordered List 5" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Ordered List 1" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Text Output" background="[255,255,255]" bold="false" executable="false" family="Monospaced" foreground="[0,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Bullet Item" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Author" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Text" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Diagnostic" background="[255,255,255]" bold="false" executable="false" family="Monospaced" foreground="[40,120,40]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Heading 2" background="[255,255,255]" bold="true" executable="false" family="Serif" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="16" subscript="false" superscript="false" underline="false"/>
+<Font name="Page Number" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="10" subscript="false" superscript="false" underline="false"/>
+<Font name="Ordered List 3" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Maple Plot" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Normal" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Maple Input" background="[255,255,255]" bold="true" executable="true" family="Monospaced" foreground="[255,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="2D Output" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Dictionary Hyperlink" background="[255,255,255]" bold="false" executable="false" family="Serif" foreground="[147,0,15]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="true"/>
+<Font name="Dash Item" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Heading 3" background="[255,255,255]" bold="true" executable="false" family="Serif" foreground="[0,0,0]" italic="true" opaque="false" readonly="false" size="14" subscript="false" superscript="false" underline="false"/>
+<Font name="Ordered List 4" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Maple Output" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="2D Input" background="[255,255,255]" bold="false" executable="true" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Line Printed Output" background="[255,255,255]" bold="false" executable="false" family="Monospaced" foreground="[0,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="List Item" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Maple Input Placeholder" background="[255,255,255]" bold="true" executable="true" family="Monospaced" foreground="[200,0,200]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="2D Math" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Error" background="[255,255,255]" bold="false" executable="false" family="Monospaced" foreground="[255,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Warning" background="[255,255,255]" bold="false" executable="false" family="Monospaced" foreground="[0,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Heading 1" background="[255,255,255]" bold="true" executable="false" family="Serif" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="18" subscript="false" superscript="false" underline="false"/>
+<Font name="Title" background="[255,255,255]" bold="true" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="18" subscript="false" superscript="false" underline="false"/>
+<Font name="Ordered List 2" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Hyperlink" background="[255,255,255]" bold="false" executable="false" family="Serif" foreground="[0,128,128]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="true"/>
+<Layout name="Ordered List 5" alignment="left" bullet="ROMAN" firstindent="0" leftmargin="144" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1"/>
+<Layout name="Heading 4" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Text Output" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="newline" pagebreak-before="false" initial="0"/>
+<Layout name="Ordered List 1" alignment="left" bullet="numeric" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1"/>
+<Layout name="Bullet Item" alignment="left" bullet="dot" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Author" alignment="centred" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="8" spacebelow="8" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Dash Item" alignment="left" bullet="dash" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Heading 3" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Diagnostic" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="any" pagebreak-before="false" initial="0"/>
+<Layout name="Ordered List 4" alignment="left" bullet="ALPHABETIC" firstindent="0" leftmargin="108" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1"/>
+<Layout name="Maple Output" alignment="centred" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.3" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="List Item" alignment="left" bullet="indent" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Line Printed Output" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="any" pagebreak-before="false" initial="0"/>
+<Layout name="Heading 2" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="8" spacebelow="2" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Ordered List 3" alignment="left" bullet="roman" firstindent="0" leftmargin="72" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1"/>
+<Layout name="Error" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Maple Plot" alignment="centred" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Warning" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Heading 1" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="8" spacebelow="4" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Title" alignment="centred" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="12" spacebelow="12" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Ordered List 2" alignment="left" bullet="alphabetic" firstindent="0" leftmargin="36" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1"/>
+<Layout name="Normal" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Pencil-style name="Pencil 3" pen-color="[0,0,0]" pen-height="3.0" pen-width="3.0" pen-opacity="1.0"/>
+<Pencil-style name="Pencil 1" pen-color="[0,0,0]" pen-height="1.0" pen-width="1.0" pen-opacity="1.0"/>
+<Pencil-style name="Pencil 5" pen-color="[255,0,0]" pen-height="5.0" pen-width="5.0" pen-opacity="1.0"/>
+<Pencil-style name="Pencil 2" pen-color="[0,0,255]" pen-height="1.0" pen-width="1.0" pen-opacity="1.0"/>
+<Pencil-style name="Pencil 4" pen-color="[0,0,255]" pen-height="3.0" pen-width="3.0" pen-opacity="1.0"/>
+<Highlighter-style name="Highlighter 2" pen-color="[255,204,0]" pen-height="14.0" pen-width="14.0" pen-opacity="0.8"/>
+<Highlighter-style name="Highlighter 4" pen-color="[0,255,255]" pen-height="32.0" pen-width="32.0" pen-opacity="0.8"/>
+<Highlighter-style name="Highlighter 3" pen-color="[51,255,0]" pen-height="24.0" pen-width="24.0" pen-opacity="0.8"/>
+<Highlighter-style name="Highlighter 1" pen-color="[255,153,255]" pen-height="12.0" pen-width="8.0" pen-opacity="0.8"/>
+<Highlighter-style name="Highlighter 5" pen-color="[255,255,0]" pen-height="48.0" pen-width="48.0" pen-opacity="0.8"/>
+</Styles>
+<Task-table>
+    <Task-category name="<default>">
+    </Task-category>
+</Task-table>
+<Group labelreference="L7" drawlabel="true">
+<Input>
+<Text-field style="Text" family="Lucida Bright" size="24" layout="Normal" alignment="centred"><Font family="Lucida Bright" size="24">LinBox Interface beta version 0.1</Font></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="24" layout="Normal" alignment="centred"><Font family="Lucida Bright" size="24">demonstration</Font></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="18" layout="Normal" alignment="centred"><Font family="Lucida Bright" size="18">by Pascal Giorgi</Font></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="18" layout="Normal" alignment="centred"></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="18" layout="Normal" alignment="centred"></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="18" layout="Normal" alignment="centred"></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="18" layout="Normal" alignment="centred"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L118" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart;</Text-field>
+</Input>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 1" layout="Heading 1">Available through Maple module</Text-field></Title>
+<Group labelreference="L10" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L11" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">with(LinBox);</Text-field>
+</Input>
+<Output>
+<Text-field style="Line Printed Output" layout="Line Printed Output">  LinBox/Maple Interface Package beta version 0.1 
+  by Pascal Giorgi (pgiorgi at uwaterloo.ca)</Text-field>
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uY [...]
+</Output>
+</Group>
+<Group labelreference="L16" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L13" drawlabel="true">
+<Input>
+<Text-field style="Text" size="18" layout="Normal"><Font size="16">comparison with LinearAlgebra package</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L14" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">with(LinearAlgebra);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uY [...]
+</Output>
+</Group>
+<Group labelreference="L15" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 1" layout="Heading 1">High level of the interface </Text-field></Title>
+<Group labelreference="L8" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="16" layout="Normal"><Font size="16">Call LinBox functionnalities directly on Maple objects.</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Computation over the integers</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L227" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Determinant</Text-field></Title>
+<Group labelreference="L17" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L228" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=100;gen:=rand(0..10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L229" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L29" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> <Font size="16">Maple determinant</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L27" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Determinant(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UV1zMTMxNTQyMTA5NjUyNDk5ODEwNDIyNzczOTQ5NjE2NjQzMzE5MTU2Mzc3NzMzNjAxNzQ5ODU1OTgzNzk3NDY0Njk1MTI3MTQ5NDk4NDIzMTg4MTg1ODgyMTI3Mzg0MzE3NzgwMDI3MDA2NDUzODIxMTk4NzYxNTc2Mzc4NDY1NTY4MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc [...]
+</Output>
+</Group>
+<Group labelreference="L30" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> </Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox determinant</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L28" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbDeterminant(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UV1zMTMxNTQyMTA5NjUyNDk5ODEwNDIyNzczOTQ5NjE2NjQzMzE5MTU2Mzc3NzMzNjAxNzQ5ODU1OTgzNzk3NDY0Njk1MTI3MTQ5NDk4NDIzMTg4MTg1ODgyMTI3Mzg0MzE3NzgwMDI3MDA2NDUzODIxMTk4NzYxNTc2Mzc4NDY1NTY4MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc [...]
+</Output>
+</Group>
+<Group labelreference="L32" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L31" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Determinant(A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L33" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbDeterminant(A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L34" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USw3LjM2NTI2OTQ2MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L35" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">B:=Matrix(200,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L37" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Determinant(B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L38" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbDeterminant(B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L39" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwxNC40MTQ0NzM2OEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L36" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Rank</Text-field></Title>
+<Group labelreference="L232" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=100;gen:=rand(0..10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L231" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L18" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L40" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple rank</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L41" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Rank(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQxMDBGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L42" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="18">LinBox rank</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L43" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRank(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQxMDBGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L44" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L174" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Rank(A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L178" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbRank(A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L179" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwyNy40ODc4MDQ4OEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L176" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">B:=Matrix(200,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L177" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Rank(B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L175" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:time(lbRank(B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjMwMEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L181" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwzMDAuMzE3MDczMkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L180" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Minimal Polynomial</Text-field></Title>
+<Group labelreference="L235" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L234" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=20;gen:=rand(0..10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L233" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L185" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L226" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L183" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple minimal polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L188" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">MinimalPolynomial(A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNkwtSSNtb0dGJTYzUSomdW1pbnVzMDtGKC8lJWZvcm1HUSdwcmVmaXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdGNS8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjUvJSpzeW1tZXRyaWNHRjUvJShtYXhzaXplR1EpaW5maW5pdHlGKC8lKG1pbnNpemVHUSIxRigvJShsYXJnZW9wR0Y1LyUubW92YWJsZWxpbWl0c0dGNS8lJ2FjY2VudEdGNS8lMGZvbnRfc3R5bGVfbmFtZUdRKjJEf [...]
+</Output>
+</Group>
+<Group labelreference="L184" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox minimal polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L194" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbMinpoly(A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNkwtSSNtb0dGJTYzUSomdW1pbnVzMDtGKC8lJWZvcm1HUSdwcmVmaXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdGNS8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjUvJSpzeW1tZXRyaWNHRjUvJShtYXhzaXplR1EpaW5maW5pdHlGKC8lKG1pbnNpemVHUSIxRigvJShsYXJnZW9wR0Y1LyUubW92YWJsZWxpbWl0c0dGNS8lJ2FjY2VudEdGNS8lMGZvbnRfc3R5bGVfbmFtZUdRKjJEf [...]
+</Output>
+</Group>
+<Group labelreference="L192" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L187" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(MinimalPolynomial(A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L186" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:time(lbMinpoly(A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjAwN0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L191" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USw0Ni45NzU2MDk3NkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L189" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Characteristic Polynomial</Text-field></Title>
+<Group labelreference="L199" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L237" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=20;gen:=rand(0..10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L236" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L199" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L197" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple characteristic polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L202" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">CharacteristicPolynomial(A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNkstRiQ2Iy1JJW1zdXBHRiU2JS1JI21pR0YlNjlRInhGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGPS8lKnN1YnNjcmlwdEdGPS8lLHN1cGVyc2NyaXB0R0Y9LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGPS8lK2V4ZWN1dGFib [...]
+</Output>
+</Group>
+<Group labelreference="L198" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox characteristic polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L208" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbCharpoly(A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNkstRiQ2Iy1JJW1zdXBHRiU2JS1JI21pR0YlNjlRInhGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGPS8lKnN1YnNjcmlwdEdGPS8lLHN1cGVyc2NyaXB0R0Y9LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGPS8lK2V4ZWN1dGFib [...]
+</Output>
+</Group>
+<Group labelreference="L206" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L201" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(CharacteristicPolynomial(A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L200" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbCharpoly(A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L205" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwxNy4wMDAwMDAwMEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L207" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">B:=Matrix(50,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L203" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">CharacteristicPolynomial(B,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNmJxLUkjbW9HRiU2M1EqJnVtaW51czA7RigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJmZhbHNlRigvJSpzZXBhcmF0b3JHRjUvJSdsc3BhY2VHUSQwZW1GKC8lJ3JzcGFjZUdGOi8lKXN0cmV0Y2h5R0Y1LyUqc3ltbWV0cmljR0Y1LyUobWF4c2l6ZUdRKWluZmluaXR5RigvJShtaW5zaXplR1EiMUYoLyUobGFyZ2VvcEdGNS8lLm1vdmFibGVsaW1pdHNHRjUvJSdhY2NlbnRHRjUvJTBmb250X3N0eWxlX25hbWVHUSoyR [...]
+</Output>
+</Group>
+<Group labelreference="L238" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbCharpoly(B,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNmJxLUkjbW9HRiU2M1EqJnVtaW51czA7RigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJmZhbHNlRigvJSpzZXBhcmF0b3JHRjUvJSdsc3BhY2VHUSQwZW1GKC8lJ3JzcGFjZUdGOi8lKXN0cmV0Y2h5R0Y1LyUqc3ltbWV0cmljR0Y1LyUobWF4c2l6ZUdRKWluZmluaXR5RigvJShtaW5zaXplR1EiMUYoLyUobGFyZ2VvcEdGNS8lLm1vdmFibGVsaW1pdHNHRjUvJSdhY2NlbnRHRjUvJTBmb250X3N0eWxlX25hbWVHUSoyR [...]
+</Output>
+</Group>
+<Group labelreference="L241" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(CharacteristicPolynomial(B,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L242" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:time(lbCharpoly(B,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjA4MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L240" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USw3NzYuNTAwMDAwMEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L239" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Linear System Solving</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L244" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=200;gen:=rand(0..10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L243" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen);b:=Vector(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiYkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L245" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L213" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L211" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple linear system solving</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L216" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x1:=LinearSolve(A,b, method=modular);x1[1];</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEjeDFGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJSVib2xkR1EmZmFsc2VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lKnVuZGVybGluZUdGNy8lKnN1YnNjcmlwdEdGNy8lLHN1cGVyc2NyaXB0R0Y3LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGO [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSZtZnJhY0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDYqLUkjbW5HRiU2OVFhXWwmbWludXM7NTI3NDE2MTU0NzUxOTUxMDIzMTE3MTU1OTY4NjczNTQ2NDg0MjE2MzA0MTM3MTk5MjE2OTM0MDkxODcxNTUxMTg3Mjg4MjA0MDg4NjE5MjIwNDczNjMxNDQ1NTEwOTI5ODE4MDU0NzM3MDg3Mjc4NTk3MDUzNzYxNzg3MTQ3ODU1MjQxNTM2NzU0NDYxMTE1MTE1OTgxOTMxNzM5NzU4MTk3MTkwNDYxNjAzNDAxMDA4MzEzNjI4MDkyNTQzOTg0MjY0MzY3NTEyNjA0Mzg4NDk5NDM4ODU0M [...]
+</Output>
+</Group>
+<Group labelreference="L212" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox linear system solving</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L222" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x2:=lbSolve(A,b);x2[1];</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEjeDJGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJSVib2xkR1EmZmFsc2VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lKnVuZGVybGluZUdGNy8lKnN1YnNjcmlwdEdGNy8lLHN1cGVyc2NyaXB0R0Y3LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGO [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSZtZnJhY0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDYqLUkjbW5HRiU2OVFhXWwmbWludXM7NTI3NDE2MTU0NzUxOTUxMDIzMTE3MTU1OTY4NjczNTQ2NDg0MjE2MzA0MTM3MTk5MjE2OTM0MDkxODcxNTUxMTg3Mjg4MjA0MDg4NjE5MjIwNDczNjMxNDQ1NTEwOTI5ODE4MDU0NzM3MDg3Mjc4NTk3MDUzNzYxNzg3MTQ3ODU1MjQxNTM2NzU0NDYxMTE1MTE1OTgxOTMxNzM5NzU4MTk3MTkwNDYxNjAzNDAxMDA4MzEzNjI4MDkyNTQzOTg0MjY0MzY3NTEyNjA0Mzg4NDk5NDM4ODU0M [...]
+</Output>
+</Group>
+<Group labelreference="L246" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L247" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L220" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L215" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(LinearSolve(A,b,method=modular));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L214" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbSolve(A,b));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L219" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwxNC4yODE3MzM3NUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L221" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=300;B:=Matrix(n,gen);b1:=Vector(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEjYjFGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJSVib2xkR1EmZmFsc2VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lKnVuZGVybGluZUdGNy8lKnN1YnNjcmlwdEdGNy8lLHN1cGVyc2NyaXB0R0Y3LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGO [...]
+</Output>
+</Group>
+<Group labelreference="L223" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(LinearSolve(B,b1, method=modular));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L218" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:time(lbSolve(B,b1));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjgwNUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L224" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USw0My4zNzQ2MTMwMEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L217" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Group labelreference="L182" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Computation over finite fields</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L285" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart():with(LinBox):with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Determinant</Text-field></Title>
+<Group labelreference="L130" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L256" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=1000;p:=17;gen:=rand(0..p-1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L257" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen,datatype=integer[4]);B:=Modular:-Mod(p,A, integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L255" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L128" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> <Font size="16">Maple determinant</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L148" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Modular:-Determinant(p,B);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USMxMkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L151" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Determinant(A,method=modular[p]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USMxMkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L152" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> </Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox determinant</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L122" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbDeterminant(p, A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USMxMkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L141" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L131" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Modular:-Determinant(p,B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L168" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(Determinant(A,method=modular[p]));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L138" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t3:=time(lbDeterminant(p,A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0M0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L153" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t3;t2/t3; </Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwxLjM4NTUyNjMxNkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwyLjA5NDczNjg0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L140" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L150" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Rank</Text-field></Title>
+<Group labelreference="L123" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L346" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart():with(LinBox):with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Group labelreference="L259" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=1000;p:=17;gen:=rand(0..p-1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L260" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen,datatype=integer[4]);B:=Modular:-Mod(p,A, integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L258" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L162" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple rank</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L137" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Modular:-Rank(p,B);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USUxMDAwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb [...]
+</Output>
+</Group>
+<Group labelreference="L127" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox rank</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L134" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRank(p, A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USUxMDAwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb [...]
+</Output>
+</Group>
+<Group labelreference="L167" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L249" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Modular:-Rank(p,B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L250" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbRank(p,A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L251" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5US0wLjg2MzgzMTgyMDRGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGK [...]
+</Output>
+</Group>
+<Group labelreference="L121" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Minimal Polynomial</Text-field></Title>
+<Group labelreference="L132" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L347" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart():with(LinBox):with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Group labelreference="L262" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=500;p:=17;gen:=rand(0..p-1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L263" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen,datatype=integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L261" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L145" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple minimal polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L254" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> <Font bold="true" italic="true" size="14">doesn't exist in Givaro::Modular Package</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L136" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox minimal polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L166" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbMinpoly(p,A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNl9mbi1GJDYlLUkjbW5HRiU2OVEiNUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y6LyUqdW5kZXJsaW5lR0Y6LyUqc3Vic2NyaXB0R0Y6LyUsc3VwZXJzY3JpcHRHRjovJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y6LyUrZXhlY3V0YWJsZUdGOi8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L143" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing </Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L160" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">time(lbMinpoly(p,A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjcwNkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L264" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Characteristic Polynomial</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L348" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart():with(LinBox):with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Group labelreference="L267" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=500;p:=17;gen:=rand(0..p-1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L266" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen,datatype=integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L135" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L119" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple Characteristic polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L269" drawlabel="true">
+<Input>
+<Text-field style="Text" bold="true" italic="true" size="14" layout="Normal"><Font italic="true" bold="true" size="14">doesn't exist in Givaro::Modular package</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L126" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox Characteristic polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L154" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbCharpoly(p,A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNl1nbi1GJDYlLUkjbW5HRiU2OVEiN0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y6LyUqdW5kZXJsaW5lR0Y6LyUqc3Vic2NyaXB0R0Y6LyUsc3VwZXJzY3JpcHRHRjovJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y6LyUrZXhlY3V0YWJsZUdGOi8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L144" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L139" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">time(lbCharpoly(p,A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjY1N0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L270" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Linear System Solving</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L349" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart():with(LinBox):with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Group labelreference="L272" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=500;p:=17;gen:=rand(0..p-1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L271" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen,datatype=integer[4]);b:=Vector(n,gen,datatype=integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiYkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L129" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L133" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple linear system solving</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L273" drawlabel="true">
+<Input>
+<Text-field style="Text" bold="true" italic="true" size="14" layout="Normal"><Font italic="true" bold="true" size="14">no native solution available</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L163" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">B:=Modular:-Mod(p,A,integer[4]);b1:=Modular:-Mod(p,b,integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEjYjFGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJSVib2xkR1EmZmFsc2VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lKnVuZGVybGluZUdGNy8lKnN1YnNjcmlwdEdGNy8lLHN1cGVyc2NyaXB0R0Y3LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGO [...]
+</Output>
+</Group>
+<Group labelreference="L274" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">pv:=Vector(n-1):Modular:-LUDecomposition(p,B,pv,0);</Text-field>
+</Input>
+</Group>
+<Group labelreference="L275" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Modular:-LUApply(p,B,pv,b1);b1[1..10];</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbW9HRiQ2M1EiW0YnLyUlZm9ybUdRJ3ByZWZpeEYnLyUmZmVuY2VHUSV0cnVlRicvJSpzZXBhcmF0b3JHUSZmYWxzZUYnLyUnbHNwYWNlR1EudGhpbm1hdGhzcGFjZUYnLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjQvJSpzeW1tZXRyaWNHRjcvJShtYXhzaXplR1EpaW5maW5pdHlGJy8lKG1pbnNpemVHUSIxRicvJShsYXJnZW9wR0Y3LyUubW92YWJsZWxpbWl0c0dGNy8lJ2FjY2VudEdGNy8lMGZvbnRfc3R5bGVfbmFtZ [...]
+</Output>
+</Group>
+<Group labelreference="L147" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="16" layout="Normal"><Font size="16">LinBox linear system solving</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L161" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x:=lbSolve(p,A,b);x[1..10];</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEieEYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbW9HRiQ2M1EiW0YnLyUlZm9ybUdRJ3ByZWZpeEYnLyUmZmVuY2VHUSV0cnVlRicvJSpzZXBhcmF0b3JHUSZmYWxzZUYnLyUnbHNwYWNlR1EudGhpbm1hdGhzcGFjZUYnLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjQvJSpzeW1tZXRyaWNHRjcvJShtYXhzaXplR1EpaW5maW5pdHlGJy8lKG1pbnNpemVHUSIxRicvJShsYXJnZW9wR0Y3LyUubW92YWJsZWxpbWl0c0dGNy8lJ2FjY2VudEdGNy8lMGZvbnRfc3R5bGVfbmFtZ [...]
+</Output>
+</Group>
+<Group labelreference="L155" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L282" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">B:=Modular:-Mod(p,A,integer[4]):b1:=Modular:-Mod(p,b,integer[4]):pv:=Vector(n-1):</Text-field>
+</Input>
+</Group>
+<Group labelreference="L281" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Modular:-LUDecomposition(p,B,pv,0))+time(Modular:-LUApply(p,B,pv,b1));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L276" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbSolve(p,A,b));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L277" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5US0wLjU5MzEwMzQ0ODNGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGK [...]
+</Output>
+</Group>
+<Group labelreference="L350" drawlabel="true">
+<Input>
+<Text-field style="Text" size="16" layout="Normal"><Font size="16">Singular system</Font></Text-field>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L352" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=100;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L353" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,n,gen,datatype=integer[4]):c:=Vector(n,gen,datatype=integer[4]):c[n]:=0:</Text-field>
+</Input>
+</Group>
+<Group labelreference="L354" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A[1..n,n]:=A.c;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUklbXN1YkdGJDYmLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y6LyUqc3Vic2NyaXB0R0Y6LyUsc3VwZXJzY3JpcHRHRjovJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y6LyUrZXhlY3V0YWJsZUdGOi8lK [...]
+</Output>
+</Group>
+<Group labelreference="L355" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRank(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USM5OUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L356" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">pv:=Vector(n-1):Modular:-LUDecomposition(p,A,pv,0);</Text-field>
+</Input>
+<Output>
+<Text-field style="Error" layout="Error">Error, (in LinearAlgebra:-Modular:-LUDecomposition) matrix is singular</Text-field>
+</Output>
+</Group>
+<Group labelreference="L358" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x:=lbSolve(p,A,c):x[1..10];</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbW9HRiQ2M1EiW0YnLyUlZm9ybUdRJ3ByZWZpeEYnLyUmZmVuY2VHUSV0cnVlRicvJSpzZXBhcmF0b3JHUSZmYWxzZUYnLyUnbHNwYWNlR1EudGhpbm1hdGhzcGFjZUYnLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjQvJSpzeW1tZXRyaWNHRjcvJShtYXhzaXplR1EpaW5maW5pdHlGJy8lKG1pbnNpemVHUSIxRicvJShsYXJnZW9wR0Y3LyUubW92YWJsZWxpbWl0c0dGNy8lJ2FjY2VudEdGNy8lMGZvbnRfc3R5bGVfbmFtZ [...]
+</Output>
+</Group>
+<Group labelreference="L361" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Norm(map(modp,A.x-c,p));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USIwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb3NlZ [...]
+</Output>
+</Group>
+<Group labelreference="L439" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="Typesetting:-mrow(Typesetting:-mi(""))">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYjLUkjbWlHRiQ2OVEhRicvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GJy8lJXNpemVHUSMxMkYnLyUlYm9sZEdRJmZhbHNlRicvJSdpdGFsaWNHUSV0cnVlRicvJSp1bmRlcmxpbmVHRjcvJSpzdWJzY3JpcHRHRjcvJSxzdXBlcnNjcmlwdEdGNy8lK2ZvcmVncm91bmRHUShbMCwwLDBdRicvJStiYWNrZ3JvdW5kR1EuWzI1NS [...]
+</Input>
+</Group>
+<Group labelreference="L351" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Benefits in practice</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="14" layout="Normal"><Font size="14">Sometime numerical computation is not satisfying and exact computation becomes mandatory</Font></Text-field>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+<Group labelreference="L406" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Very bad conditionned matrix</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L398" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Moler:=proc(n) local i,j,Moler; 
+   Moler:=Matrix(n);
+   for i from 1 to n do 
+      for j from 1 to (i-1) do 
+        Moler[i,j]:=j-2; 
+      end do;
+      Moler[i,i]:=i;
+      for j from (i+1) to n do
+       Moler[i,j]:=i-2;
+      end do; 
+   end do;
+   return Moler; end proc:</Text-field>
+</Input>
+</Group>
+<Group labelreference="L400" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Redheffer:=proc(n) local i,j,Redheffer; 
+   Redheffer:=Matrix(n);
+   for i from 1 to n do
+      Redheffer[i,1]:=1;
+      for j from 2 to n do
+         if (j mod i = 0) then
+            Redheffer[i,j]:=1;
+         else
+            Redheffer[i,j]:=0;
+         end if;
+      end do;
+   end do:
+   return Redheffer; end proc:</Text-field>
+</Input>
+</Group>
+<Group labelreference="L399" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Moler(10),Redheffer(10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUYjNiUtSSNtb0dGJDYzUSJbRicvJSVmb3JtR1EncHJlZml4RicvJSZmZW5jZUdRJXRydWVGJy8lKnNlcGFyYXRvckdRJmZhbHNlRicvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRicvJSdyc3BhY2VHRjwvJSlzdHJldGNoeUdGNi8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYnLyUobWluc2l6ZUdRIjFGJy8lKGxhcmdlb3BHRjkvJS5tb3ZhYmxlbGltaXRzR0Y5LyUnYWNjZW50R0Y5LyUwZm9udF9zdHlsZ [...]
+</Output>
+</Group>
+<Group labelreference="L404" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=200;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L405" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">M:=1.*Moler(n):R:=1.*Redheffer(n):MR:=M.R;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEjTVJGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJSVib2xkR1EmZmFsc2VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lKnVuZGVybGluZUdGNy8lKnN1YnNjcmlwdEdGNy8lLHN1cGVyc2NyaXB0R0Y3LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGO [...]
+</Output>
+</Group>
+<Group labelreference="L422" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">ConditionNumber(M); ConditionNumber(R); ConditionNumber(MR);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtbkdGJTY5USw4LjQ4MDEwODYwMUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y4LyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvb [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwxMTI1MC4wMDAwMEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtbkdGJTY5USwyLjUyNzg2NTk5MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y4LyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvb [...]
+</Output>
+</Group>
+<Group labelreference="L411" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">Solving a linear system</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L402" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">b:=1.*Vector(n,rand(-1..1));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiYkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L403" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Digits:=14;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USdEaWdpdHNGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb [...]
+</Output>
+</Group>
+<Group labelreference="L418" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t:=time():x:=LinearSolve(MR,b,method=hybrid):time()-t;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjAwOUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L416" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Norm(MR.x-b);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UTQyMzcuMTE3MTg3NTAwMDAwMDAwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHU [...]
+</Output>
+</Group>
+<Group labelreference="L421" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(MR,datatype=integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L420" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t:=time():y:=lbSolve(A,b):time()-t;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjMwN0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L417" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Norm(A.y-b);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USMwLkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L413" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L414" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+</Section>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">High precision results</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L423" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Tref:=ImportMatrix("tref200.dat",format=entries);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVElVHJlZkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L424" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">b:=Vector(200,rand(-1..1),datatype=integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiYkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L430" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Digits:=14;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USdEaWdpdHNGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb [...]
+</Output>
+</Group>
+<Group labelreference="L425" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t:=time():x:=LinearSolve(1.*Tref,1.*b):time()-t;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjA2NUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L426" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Norm(Tref.x-b);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtbkdGJTY5UTQyLjMxNzMxMzQzNjQ2MDc1NzgyRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjgvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4L [...]
+</Output>
+</Group>
+<Group labelreference="L427" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t:=time():y:=lbSolve(Tref,b):time()-t;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjM3MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L428" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Norm(Tref.y-b);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USIwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb3NlZ [...]
+</Output>
+</Group>
+<Group labelreference="L431" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">Bug in Maple</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L434" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Determinant(Tref);Rank(Tref);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USIwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb3NlZ [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQxOTlGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L440" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Digits:=14;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USdEaWdpdHNGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb [...]
+</Output>
+</Group>
+<Group labelreference="L435" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Determinant(1.*Tref);Rank(1.*Tref);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtbkdGJTY5UTAyLjQwODQ1MTkyNTQ4MDVGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGOC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZ [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQyMDBGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L436" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbDeterminant(Tref);lbRank(Tref);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UVxbbTI0MDg0NTE5MjU0ODAyNzQzMTkzNTM5MjE0MTY1NjUwNzE0MDcxODM4ODg4OTI4ODk5NjM4MDgxMzEzMjU2MjE0MjAxMDk4MTY2MDQyMzgyMTg3MDYwNDE4MDEzMTA5MzQ5NzE1NjMzNzYyNDgzNDY1ODIzMjM4NTEyNTU5ODQwNjk4OTQ4OTY0MDE1NjUwNDExMzc4MjU1NDYxMzU2OTYyODg4NzMwMjgwNjEwMzQ0MTc2MzU1NDEyMjQ4OTk4MDc1NDE0NjYzMTcxNzUxOTYyMTQyMzA3OTQ3MjE4NTE3NDkyNzAzNzI4OTg2N [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQyMDBGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L437" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Determinant(Matrix(Tref,storage=rectangular));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UVxbbTI0MDg0NTE5MjU0ODAyNzQzMTkzNTM5MjE0MTY1NjUwNzE0MDcxODM4ODg4OTI4ODk5NjM4MDgxMzEzMjU2MjE0MjAxMDk4MTY2MDQyMzgyMTg3MDYwNDE4MDEzMTA5MzQ5NzE1NjMzNzYyNDgzNDY1ODIzMjM4NTEyNTU5ODQwNjk4OTQ4OTY0MDE1NjUwNDExMzc4MjU1NDYxMzU2OTYyODg4NzMwMjgwNjEwMzQ0MTc2MzU1NDEyMjQ4OTk4MDc1NDE0NjYzMTcxNzUxOTYyMTQyMzA3OTQ3MjE4NTE3NDkyNzAzNzI4OTg2N [...]
+</Output>
+</Group>
+<Group labelreference="L438" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Section>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Section>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 1" layout="Heading 1">Low level of the interface</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L283" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart;</Text-field>
+</Input>
+</Group>
+<Group labelreference="L284" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">p:=17;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Submodule of module LinBox</Text-field></Title>
+<Group labelreference="L285" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L286" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">with(LinBox:-Dev);</Text-field>
+</Input>
+<Output>
+<Text-field style="Line Printed Output" layout="Line Printed Output">  LinBox/Maple Interface Package beta version 0.1 
+  by Pascal Giorgi (pgiorgi at uwaterloo.ca)</Text-field>
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uY [...]
+</Output>
+</Group>
+<Group labelreference="L287" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L288" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L291" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Creation of Domain</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="16" layout="Normal"><Font size="16">Integers Domain</Font></Text-field>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+<Group labelreference="L293" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Z:=lbDomain(0,"linbox_ring_integer");</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJaRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L294" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Z:=lbDomain();</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJaRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Finite fields domain</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L301" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Zp:=lbDomain(p,"linbox_field_dbl");</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNacEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L302" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Zp:=lbDomain(p);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNacEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Use of global default type</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L296" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbSetIntegerRing("linbox_ring_integer");</Text-field>
+</Input>
+</Group>
+<Group labelreference="L297" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbSetPrimeField("linbox_field_dbl");</Text-field>
+</Input>
+</Group>
+<Group labelreference="L304" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Z1:=lbDomain();</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNaMUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L305" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Zp2:=lbDomain(p);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRacDJGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L387" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Using Blackbox (Matrix)</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L306" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=lbBlackbox(Z,10,10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJBRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L307" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Ap:=lbBlackbox(Zp,10,10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNBcEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L445" drawlabel="true">
+<Input>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+<Text-field style="Text" size="16" layout="Normal"><Font size="14">Use of global default type</Font></Text-field>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L448" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbSetBlackbox("linbox_sparse");</Text-field>
+</Input>
+</Group>
+<Group labelreference="L446" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=lbBlackbox(Z,10,10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJBRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L447" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L365" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"> <Font size="14">Set entries at random over the domain</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L308" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRandom(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtaUc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UV1yW35MaW5Cb3h+QmxhY2tib3h+KHN0b3JhZ2V+PX5saW5ib3hfc3BhcnNlLH5kb21haW5+PX5bTGluQm94fkRvbWFpbn4odHlwZX49fmxpbmJveF9yaW5nX2ludGVnZXIsfmNoYXJhY3R+PX4wKV1+KV18K0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3Jpc [...]
+</Output>
+</Group>
+<Group labelreference="L311" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRandom(Ap);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtaUc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UWpxW35MaW5Cb3h+QmxhY2tib3h+KHN0b3JhZ2V+PX5saW5ib3hfZGVuc2UsfmRvbWFpbn49fltMaW5Cb3h+RG9tYWlufih0eXBlfj1+bGluYm94X2ZpZWxkX2RibCx+Y2hhcmFjdH49fjE3KV1+KV18K0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHR [...]
+</Output>
+</Group>
+<Group labelreference="L363" drawlabel="true">
+<Input>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+<Text-field style="Text" size="14" layout="Normal"><Font size="14">Computation without specifying the domain</Font></Text-field>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L366" drawlabel="true">
+<Input>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">Over the integers</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L312" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">d1:=lbDeterminant(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNkMUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L367" drawlabel="true">
+<Input>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">Over a finite field</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L313" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">d2:=lbDeterminant(Ap);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNkMkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L450" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L309" drawlabel="true">
+<Input>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+<Text-field style="Text" size="14" layout="Normal"><Font size="14">Converting data</Font></Text-field>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L441" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbConvertElement(d1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UWhwMzExNjI3OTYyMjI4MzQ1MzA4MjI5ODYyNjQxMjc3NjYxNjczOTQ3MDg1MDkwOTQ1ODg4MjgyNzY3MTQzMjYyOTAwMDkyNTExNzI1NDIwMDc0ODEzNTIzMjY1NDk2RigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1N [...]
+</Output>
+</Group>
+<Group labelreference="L449" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbConvertElement(d2);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USMxMUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L310" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">using Vector</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L369" drawlabel="true">
+<Input>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">construction over the integers</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L333" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">V:=lbVector(Z,10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJWRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L370" drawlabel="true">
+<Input>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">construction over finite field</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L336" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Vp:=lbVector(Zp,10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNWcEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L451" drawlabel="true">
+<Input>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+<Text-field style="Text" size="16" layout="Normal"><Font size="14">Use of global default type</Font></Text-field>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L452" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbSetVector("linbox_dense");</Text-field>
+</Input>
+</Group>
+<Group labelreference="L371" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L372" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> <Font size="14">Set entries at random over the domain</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L332" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRandom(V);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtaUc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UWpxW35MaW5Cb3h+VmVjdG9yfihzdG9yYWdlfj1+bGluYm94X2RlbnNlLH5kb21haW5+PX5bTGluQm94fkRvbWFpbn4odHlwZX49fmxpbmJveF9yaW5nX2ludGVnZXIsfmNoYXJhY3R+PX4wKV1+KV18K0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHR [...]
+</Output>
+</Group>
+<Group labelreference="L334" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRandom(Vp);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtaUc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UWhxW35MaW5Cb3h+VmVjdG9yfihzdG9yYWdlfj1+bGluYm94X2RlbnNlLH5kb21haW5+PX5bTGluQm94fkRvbWFpbn4odHlwZX49fmxpbmJveF9maWVsZF9kYmwsfmNoYXJhY3R+PX4xNyldfildfCtGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1L [...]
+</Output>
+</Group>
+<Group labelreference="L373" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L375" drawlabel="true">
+<Input>
+<Text-field style="Text" size="14" layout="Normal"><Font size="14">Computation without specifying the domain</Font></Text-field>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L376" drawlabel="true">
+<Input>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">Over the integers</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L342" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x1:=lbSolve(A,V);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN4MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L335" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x2:=lbSolve(Ap,Vp);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN4MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L339" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="14" layout="Normal"><Font size="14">Converting data</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L453" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbConvertVector(x1);lbConvertVector(x2);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uY [...]
+</Output>
+</Group>
+</Section>
+<Section collapsed="false" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Example of use</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Highly efficient user's solution</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font italic="true" size="14">Compute the determinant of a matrix read from a file</Font></Text-field>
+<Group labelreference="L343" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">myDeterminant:=proc(p, file)
+   local Zp,B,d;
+   Zp:=lbDomain(p);
+   B:=lbBlackbox(Zp,file);
+   d:=lbElement(Zp);
+   lbDeterminant(d,B);
+   return lbConvertElement(d);
+ end;
+   
+   </Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5US5teURldGVybWluYW50RigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4L [...]
+</Output>
+</Group>
+<Group labelreference="L344" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">myDeterminant(1009, "trefethen_200.sms");</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQzNDZGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L345" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">myDeterminant(0, "trefethen_200.sms");</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UVxbbTI0MDg0NTE5MjU0ODAyNzQzMTkzNTM5MjE0MTY1NjUwNzE0MDcxODM4ODg4OTI4ODk5NjM4MDgxMzEzMjU2MjE0MjAxMDk4MTY2MDQyMzgyMTg3MDYwNDE4MDEzMTA5MzQ5NzE1NjMzNzYyNDgzNDY1ODIzMjM4NTEyNTU5ODQwNjk4OTQ4OTY0MDE1NjUwNDExMzc4MjU1NDYxMzU2OTYyODg4NzMwMjgwNjEwMzQ0MTc2MzU1NDEyMjQ4OTk4MDc1NDE0NjYzMTcxNzUxOTYyMTQyMzA3OTQ3MjE4NTE3NDkyNzAzNzI4OTg2N [...]
+</Output>
+</Group>
+<Group labelreference="L382" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">To continue ...</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Section>
+</Section>
+<Group labelreference="L289" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Worksheet>
\ No newline at end of file
diff --git a/interfaces/maple/linbox-demonstration.mw b/interfaces/maple/linbox-demonstration.mw
new file mode 100755
index 0000000..e93cb5b
--- /dev/null
+++ b/interfaces/maple/linbox-demonstration.mw
@@ -0,0 +1,2248 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Worksheet>
+<Version major="7" minor="0"/>
+<Label-Scheme value="2" prefix=""/>
+<View-Properties presentation="false"></View-Properties>
+<MapleNet-Properties warnlevel="3" longdelim="true" plotoptions="" echo="1" errorcursor="false" elisiontermsthreshold="10000" elisiontermsbefore="100" errorbreak="1" prettyprint="3" prompt="> " latexwidth="6.0" useclientjvm="true" ansi="false" screenheight="25" labelwidth="20" plotdevice="inline" typesetting="standard" displayprecision="-1" indentamount="4" elisiondigitsthreshold="10000" quiet="false" plotoutput="terminal" rtablesize="10" preplot="" showassumed="1" plotdriver="openviz [...]
+<Styles><Font name="Heading 4" background="[255,255,255]" bold="false" executable="false" family="Serif" foreground="[0,0,0]" italic="true" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Ordered List 5" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Ordered List 1" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Text Output" background="[255,255,255]" bold="false" executable="false" family="Monospaced" foreground="[0,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Bullet Item" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Author" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Text" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Diagnostic" background="[255,255,255]" bold="false" executable="false" family="Monospaced" foreground="[40,120,40]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Heading 2" background="[255,255,255]" bold="true" executable="false" family="Serif" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="16" subscript="false" superscript="false" underline="false"/>
+<Font name="Page Number" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="10" subscript="false" superscript="false" underline="false"/>
+<Font name="Ordered List 3" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Maple Plot" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Normal" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Maple Input" background="[255,255,255]" bold="true" executable="true" family="Monospaced" foreground="[255,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="2D Output" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Dictionary Hyperlink" background="[255,255,255]" bold="false" executable="false" family="Serif" foreground="[147,0,15]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="true"/>
+<Font name="Dash Item" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Heading 3" background="[255,255,255]" bold="true" executable="false" family="Serif" foreground="[0,0,0]" italic="true" opaque="false" readonly="false" size="14" subscript="false" superscript="false" underline="false"/>
+<Font name="Ordered List 4" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Maple Output" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="2D Input" background="[255,255,255]" bold="false" executable="true" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Line Printed Output" background="[255,255,255]" bold="false" executable="false" family="Monospaced" foreground="[0,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="List Item" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Maple Input Placeholder" background="[255,255,255]" bold="true" executable="true" family="Monospaced" foreground="[200,0,200]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="2D Math" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Error" background="[255,255,255]" bold="false" executable="false" family="Monospaced" foreground="[255,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Warning" background="[255,255,255]" bold="false" executable="false" family="Monospaced" foreground="[0,0,255]" italic="false" opaque="false" readonly="true" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Heading 1" background="[255,255,255]" bold="true" executable="false" family="Serif" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="18" subscript="false" superscript="false" underline="false"/>
+<Font name="Title" background="[255,255,255]" bold="true" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="18" subscript="false" superscript="false" underline="false"/>
+<Font name="Ordered List 2" background="[255,255,255]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="false"/>
+<Font name="Hyperlink" background="[255,255,255]" bold="false" executable="false" family="Serif" foreground="[0,128,128]" italic="false" opaque="false" readonly="false" size="12" subscript="false" superscript="false" underline="true"/>
+<Layout name="Ordered List 5" alignment="left" bullet="ROMAN" firstindent="0" leftmargin="144" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1"/>
+<Layout name="Heading 4" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Text Output" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="newline" pagebreak-before="false" initial="0"/>
+<Layout name="Ordered List 1" alignment="left" bullet="numeric" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1"/>
+<Layout name="Bullet Item" alignment="left" bullet="dot" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Author" alignment="centred" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="8" spacebelow="8" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Dash Item" alignment="left" bullet="dash" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Heading 3" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Diagnostic" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="any" pagebreak-before="false" initial="0"/>
+<Layout name="Ordered List 4" alignment="left" bullet="ALPHABETIC" firstindent="0" leftmargin="108" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1"/>
+<Layout name="Maple Output" alignment="centred" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.3" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="List Item" alignment="left" bullet="indent" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Line Printed Output" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="any" pagebreak-before="false" initial="0"/>
+<Layout name="Heading 2" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="8" spacebelow="2" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Ordered List 3" alignment="left" bullet="roman" firstindent="0" leftmargin="72" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1"/>
+<Layout name="Error" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Maple Plot" alignment="centred" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Warning" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Heading 1" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="8" spacebelow="4" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Title" alignment="centred" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="12" spacebelow="12" linebreak="space" pagebreak-before="false" initial="0"/>
+<Layout name="Ordered List 2" alignment="left" bullet="alphabetic" firstindent="0" leftmargin="36" rightmargin="0" linespacing="0.0" spaceabove="3" spacebelow="3" linebreak="space" pagebreak-before="false" initial="-1"/>
+<Layout name="Normal" alignment="left" bullet="none" firstindent="0" leftmargin="0" rightmargin="0" linespacing="0.0" spaceabove="0" spacebelow="0" linebreak="space" pagebreak-before="false" initial="0"/>
+<Pencil-style name="Pencil 3" pen-color="[0,0,0]" pen-height="3.0" pen-width="3.0" pen-opacity="1.0"/>
+<Pencil-style name="Pencil 1" pen-color="[0,0,0]" pen-height="1.0" pen-width="1.0" pen-opacity="1.0"/>
+<Pencil-style name="Pencil 5" pen-color="[255,0,0]" pen-height="5.0" pen-width="5.0" pen-opacity="1.0"/>
+<Pencil-style name="Pencil 2" pen-color="[0,0,255]" pen-height="1.0" pen-width="1.0" pen-opacity="1.0"/>
+<Pencil-style name="Pencil 4" pen-color="[0,0,255]" pen-height="3.0" pen-width="3.0" pen-opacity="1.0"/>
+<Highlighter-style name="Highlighter 2" pen-color="[255,204,0]" pen-height="14.0" pen-width="14.0" pen-opacity="0.8"/>
+<Highlighter-style name="Highlighter 4" pen-color="[0,255,255]" pen-height="32.0" pen-width="32.0" pen-opacity="0.8"/>
+<Highlighter-style name="Highlighter 3" pen-color="[51,255,0]" pen-height="24.0" pen-width="24.0" pen-opacity="0.8"/>
+<Highlighter-style name="Highlighter 1" pen-color="[255,153,255]" pen-height="12.0" pen-width="8.0" pen-opacity="0.8"/>
+<Highlighter-style name="Highlighter 5" pen-color="[255,255,0]" pen-height="48.0" pen-width="48.0" pen-opacity="0.8"/>
+</Styles>
+<Task-table>
+    <Task-category name="<default>">
+    </Task-category>
+</Task-table>
+<Group labelreference="L7" drawlabel="true">
+<Input>
+<Text-field style="Text" family="Lucida Bright" size="24" layout="Normal" alignment="centred"><Font family="Lucida Bright" size="24">LinBox Interface beta version 0.1</Font></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="24" layout="Normal" alignment="centred"><Font family="Lucida Bright" size="24">demonstration</Font></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="18" layout="Normal" alignment="centred"><Font family="Lucida Bright" size="18">by Pascal Giorgi</Font></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="18" layout="Normal" alignment="centred"></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="18" layout="Normal" alignment="centred"></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="18" layout="Normal" alignment="centred"></Text-field>
+<Text-field style="Text" family="Lucida Bright" size="18" layout="Normal" alignment="centred"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L118" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart;</Text-field>
+</Input>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 1" layout="Heading 1">Available through Maple module</Text-field></Title>
+<Group labelreference="L10" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L11" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">with(LinBox);</Text-field>
+</Input>
+<Output>
+<Text-field style="Line Printed Output" layout="Line Printed Output">  LinBox/Maple Interface Package beta version 0.1 
+  by Pascal Giorgi (pgiorgi at uwaterloo.ca)</Text-field>
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uY [...]
+</Output>
+</Group>
+<Group labelreference="L16" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L13" drawlabel="true">
+<Input>
+<Text-field style="Text" size="18" layout="Normal"><Font size="16">comparison with LinearAlgebra package</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L14" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">with(LinearAlgebra);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uY [...]
+</Output>
+</Group>
+<Group labelreference="L15" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 1" layout="Heading 1">High level of the interface </Text-field></Title>
+<Group labelreference="L8" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="16" layout="Normal"><Font size="16">Call LinBox functionnalities directly on Maple objects.</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Computation over the integers</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L227" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Determinant</Text-field></Title>
+<Group labelreference="L17" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L228" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=100;gen:=rand(0..10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L229" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L29" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> <Font size="16">Maple determinant</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L27" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Determinant(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UV1zMTMxNTQyMTA5NjUyNDk5ODEwNDIyNzczOTQ5NjE2NjQzMzE5MTU2Mzc3NzMzNjAxNzQ5ODU1OTgzNzk3NDY0Njk1MTI3MTQ5NDk4NDIzMTg4MTg1ODgyMTI3Mzg0MzE3NzgwMDI3MDA2NDUzODIxMTk4NzYxNTc2Mzc4NDY1NTY4MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc [...]
+</Output>
+</Group>
+<Group labelreference="L30" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> </Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox determinant</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L28" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbDeterminant(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UV1zMTMxNTQyMTA5NjUyNDk5ODEwNDIyNzczOTQ5NjE2NjQzMzE5MTU2Mzc3NzMzNjAxNzQ5ODU1OTgzNzk3NDY0Njk1MTI3MTQ5NDk4NDIzMTg4MTg1ODgyMTI3Mzg0MzE3NzgwMDI3MDA2NDUzODIxMTk4NzYxNTc2Mzc4NDY1NTY4MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc [...]
+</Output>
+</Group>
+<Group labelreference="L32" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L31" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Determinant(A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L33" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbDeterminant(A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L34" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USw3LjM2NTI2OTQ2MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L35" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">B:=Matrix(200,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L37" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Determinant(B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L38" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbDeterminant(B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L39" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwxNC40MTQ0NzM2OEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L36" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Rank</Text-field></Title>
+<Group labelreference="L232" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=100;gen:=rand(0..10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L231" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L18" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L40" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple rank</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L41" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Rank(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQxMDBGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L42" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="18">LinBox rank</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L43" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRank(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQxMDBGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L44" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L174" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Rank(A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L178" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbRank(A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L179" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwyNy40ODc4MDQ4OEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L176" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">B:=Matrix(200,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L177" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Rank(B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L175" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:time(lbRank(B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjMwMEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L181" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwzMDAuMzE3MDczMkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L180" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Minimal Polynomial</Text-field></Title>
+<Group labelreference="L235" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L234" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=20;gen:=rand(0..10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L233" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L185" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L226" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L183" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple minimal polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L188" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">MinimalPolynomial(A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNkwtSSNtb0dGJTYzUSomdW1pbnVzMDtGKC8lJWZvcm1HUSdwcmVmaXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdGNS8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjUvJSpzeW1tZXRyaWNHRjUvJShtYXhzaXplR1EpaW5maW5pdHlGKC8lKG1pbnNpemVHUSIxRigvJShsYXJnZW9wR0Y1LyUubW92YWJsZWxpbWl0c0dGNS8lJ2FjY2VudEdGNS8lMGZvbnRfc3R5bGVfbmFtZUdRKjJEf [...]
+</Output>
+</Group>
+<Group labelreference="L184" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox minimal polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L194" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbMinpoly(A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNkwtSSNtb0dGJTYzUSomdW1pbnVzMDtGKC8lJWZvcm1HUSdwcmVmaXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdGNS8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjUvJSpzeW1tZXRyaWNHRjUvJShtYXhzaXplR1EpaW5maW5pdHlGKC8lKG1pbnNpemVHUSIxRigvJShsYXJnZW9wR0Y1LyUubW92YWJsZWxpbWl0c0dGNS8lJ2FjY2VudEdGNS8lMGZvbnRfc3R5bGVfbmFtZUdRKjJEf [...]
+</Output>
+</Group>
+<Group labelreference="L192" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L187" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(MinimalPolynomial(A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L186" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:time(lbMinpoly(A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjAwN0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L191" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USw0Ni45NzU2MDk3NkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L189" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Characteristic Polynomial</Text-field></Title>
+<Group labelreference="L199" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L237" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=20;gen:=rand(0..10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L236" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L199" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L197" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple characteristic polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L202" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">CharacteristicPolynomial(A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNkstRiQ2Iy1JJW1zdXBHRiU2JS1JI21pR0YlNjlRInhGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGPS8lKnN1YnNjcmlwdEdGPS8lLHN1cGVyc2NyaXB0R0Y9LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGPS8lK2V4ZWN1dGFib [...]
+</Output>
+</Group>
+<Group labelreference="L198" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox characteristic polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L208" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbCharpoly(A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNkstRiQ2Iy1JJW1zdXBHRiU2JS1JI21pR0YlNjlRInhGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGPS8lKnN1YnNjcmlwdEdGPS8lLHN1cGVyc2NyaXB0R0Y9LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGPS8lK2V4ZWN1dGFib [...]
+</Output>
+</Group>
+<Group labelreference="L206" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L201" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(CharacteristicPolynomial(A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L200" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbCharpoly(A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L205" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwxNy4wMDAwMDAwMEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L207" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">B:=Matrix(50,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L203" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">CharacteristicPolynomial(B,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNmJxLUkjbW9HRiU2M1EqJnVtaW51czA7RigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJmZhbHNlRigvJSpzZXBhcmF0b3JHRjUvJSdsc3BhY2VHUSQwZW1GKC8lJ3JzcGFjZUdGOi8lKXN0cmV0Y2h5R0Y1LyUqc3ltbWV0cmljR0Y1LyUobWF4c2l6ZUdRKWluZmluaXR5RigvJShtaW5zaXplR1EiMUYoLyUobGFyZ2VvcEdGNS8lLm1vdmFibGVsaW1pdHNHRjUvJSdhY2NlbnRHRjUvJTBmb250X3N0eWxlX25hbWVHUSoyR [...]
+</Output>
+</Group>
+<Group labelreference="L238" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbCharpoly(B,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNmJxLUkjbW9HRiU2M1EqJnVtaW51czA7RigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJmZhbHNlRigvJSpzZXBhcmF0b3JHRjUvJSdsc3BhY2VHUSQwZW1GKC8lJ3JzcGFjZUdGOi8lKXN0cmV0Y2h5R0Y1LyUqc3ltbWV0cmljR0Y1LyUobWF4c2l6ZUdRKWluZmluaXR5RigvJShtaW5zaXplR1EiMUYoLyUobGFyZ2VvcEdGNS8lLm1vdmFibGVsaW1pdHNHRjUvJSdhY2NlbnRHRjUvJTBmb250X3N0eWxlX25hbWVHUSoyR [...]
+</Output>
+</Group>
+<Group labelreference="L241" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(CharacteristicPolynomial(B,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L242" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:time(lbCharpoly(B,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjA4MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L240" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USw3NzYuNTAwMDAwMEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L239" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Linear System Solving</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L244" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=200;gen:=rand(0..10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L243" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen);b:=Vector(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiYkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L245" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L213" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L211" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple linear system solving</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L216" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x1:=LinearSolve(A,b, method=modular);x1[1];</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEjeDFGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJSVib2xkR1EmZmFsc2VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lKnVuZGVybGluZUdGNy8lKnN1YnNjcmlwdEdGNy8lLHN1cGVyc2NyaXB0R0Y3LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGO [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSZtZnJhY0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDYqLUkjbW5HRiU2OVFhXWwmbWludXM7NTI3NDE2MTU0NzUxOTUxMDIzMTE3MTU1OTY4NjczNTQ2NDg0MjE2MzA0MTM3MTk5MjE2OTM0MDkxODcxNTUxMTg3Mjg4MjA0MDg4NjE5MjIwNDczNjMxNDQ1NTEwOTI5ODE4MDU0NzM3MDg3Mjc4NTk3MDUzNzYxNzg3MTQ3ODU1MjQxNTM2NzU0NDYxMTE1MTE1OTgxOTMxNzM5NzU4MTk3MTkwNDYxNjAzNDAxMDA4MzEzNjI4MDkyNTQzOTg0MjY0MzY3NTEyNjA0Mzg4NDk5NDM4ODU0M [...]
+</Output>
+</Group>
+<Group labelreference="L212" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox linear system solving</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L222" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x2:=lbSolve(A,b);x2[1];</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEjeDJGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJSVib2xkR1EmZmFsc2VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lKnVuZGVybGluZUdGNy8lKnN1YnNjcmlwdEdGNy8lLHN1cGVyc2NyaXB0R0Y3LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGO [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSZtZnJhY0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDYqLUkjbW5HRiU2OVFhXWwmbWludXM7NTI3NDE2MTU0NzUxOTUxMDIzMTE3MTU1OTY4NjczNTQ2NDg0MjE2MzA0MTM3MTk5MjE2OTM0MDkxODcxNTUxMTg3Mjg4MjA0MDg4NjE5MjIwNDczNjMxNDQ1NTEwOTI5ODE4MDU0NzM3MDg3Mjc4NTk3MDUzNzYxNzg3MTQ3ODU1MjQxNTM2NzU0NDYxMTE1MTE1OTgxOTMxNzM5NzU4MTk3MTkwNDYxNjAzNDAxMDA4MzEzNjI4MDkyNTQzOTg0MjY0MzY3NTEyNjA0Mzg4NDk5NDM4ODU0M [...]
+</Output>
+</Group>
+<Group labelreference="L246" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L247" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L220" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L215" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(LinearSolve(A,b,method=modular));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L214" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbSolve(A,b));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L219" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwxNC4yODE3MzM3NUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L221" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=300;B:=Matrix(n,gen);b1:=Vector(n,gen);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEjYjFGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJSVib2xkR1EmZmFsc2VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lKnVuZGVybGluZUdGNy8lKnN1YnNjcmlwdEdGNy8lLHN1cGVyc2NyaXB0R0Y3LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGO [...]
+</Output>
+</Group>
+<Group labelreference="L223" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(LinearSolve(B,b1, method=modular));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L218" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:time(lbSolve(B,b1));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjgwNUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L224" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USw0My4zNzQ2MTMwMEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L217" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Group labelreference="L182" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Computation over finite fields</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L285" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart():with(LinBox):with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Determinant</Text-field></Title>
+<Group labelreference="L130" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L256" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=1000;p:=17;gen:=rand(0..p-1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L257" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen,datatype=integer[4]);B:=Modular:-Mod(p,A, integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L255" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L128" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> <Font size="16">Maple determinant</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L148" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Modular:-Determinant(p,B);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USMxMkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L151" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Determinant(A,method=modular[p]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USMxMkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L152" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> </Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox determinant</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L122" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbDeterminant(p, A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USMxMkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L141" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L131" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Modular:-Determinant(p,B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L168" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(Determinant(A,method=modular[p]));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L138" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t3:=time(lbDeterminant(p,A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0M0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L153" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t3;t2/t3; </Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwxLjM4NTUyNjMxNkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwyLjA5NDczNjg0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+</Group>
+<Group labelreference="L140" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L150" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Rank</Text-field></Title>
+<Group labelreference="L123" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L346" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart():with(LinBox):with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Group labelreference="L259" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=1000;p:=17;gen:=rand(0..p-1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L260" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen,datatype=integer[4]);B:=Modular:-Mod(p,A, integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L258" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L162" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple rank</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L137" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Modular:-Rank(p,B);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USUxMDAwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb [...]
+</Output>
+</Group>
+<Group labelreference="L127" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox rank</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L134" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRank(p, A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USUxMDAwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb [...]
+</Output>
+</Group>
+<Group labelreference="L167" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L249" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Modular:-Rank(p,B));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L250" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbRank(p,A));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L251" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5US0wLjg2MzgzMTgyMDRGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGK [...]
+</Output>
+</Group>
+<Group labelreference="L121" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Minimal Polynomial</Text-field></Title>
+<Group labelreference="L132" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L347" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart():with(LinBox):with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Group labelreference="L262" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=500;p:=17;gen:=rand(0..p-1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L263" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen,datatype=integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L261" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L145" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple minimal polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L254" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> <Font bold="true" italic="true" size="14">doesn't exist in Givaro::Modular Package</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L136" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox minimal polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L166" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbMinpoly(p,A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNl9mbi1GJDYlLUkjbW5HRiU2OVEiNUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y6LyUqdW5kZXJsaW5lR0Y6LyUqc3Vic2NyaXB0R0Y6LyUsc3VwZXJzY3JpcHRHRjovJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y6LyUrZXhlY3V0YWJsZUdGOi8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L143" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing </Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L160" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">time(lbMinpoly(p,A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjcwNkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L264" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Characteristic Polynomial</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L348" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart():with(LinBox):with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Group labelreference="L267" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=500;p:=17;gen:=rand(0..p-1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L266" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen,datatype=integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L135" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L119" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple Characteristic polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L269" drawlabel="true">
+<Input>
+<Text-field style="Text" bold="true" italic="true" size="14" layout="Normal"><Font italic="true" bold="true" size="14">doesn't exist in Givaro::Modular package</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L126" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">LinBox Characteristic polynomial</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L154" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbCharpoly(p,A,'x');</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNl1nbi1GJDYlLUkjbW5HRiU2OVEiN0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y6LyUqdW5kZXJsaW5lR0Y6LyUqc3Vic2NyaXB0R0Y6LyUsc3VwZXJzY3JpcHRHRjovJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y6LyUrZXhlY3V0YWJsZUdGOi8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L144" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L139" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">time(lbCharpoly(p,A,'x'));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjY1N0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L270" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Linear System Solving</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L349" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart():with(LinBox):with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Group labelreference="L272" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=500;p:=17;gen:=rand(0..p-1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRnZW5GKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L271" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,gen,datatype=integer[4]);b:=Vector(n,gen,datatype=integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiYkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L129" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L133" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"><Font size="16">Maple linear system solving</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L273" drawlabel="true">
+<Input>
+<Text-field style="Text" bold="true" italic="true" size="14" layout="Normal"><Font italic="true" bold="true" size="14">no native solution available</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L163" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">B:=Modular:-Mod(p,A,integer[4]);b1:=Modular:-Mod(p,b,integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEjYjFGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJSVib2xkR1EmZmFsc2VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lKnVuZGVybGluZUdGNy8lKnN1YnNjcmlwdEdGNy8lLHN1cGVyc2NyaXB0R0Y3LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGO [...]
+</Output>
+</Group>
+<Group labelreference="L274" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">pv:=Vector(n-1):Modular:-LUDecomposition(p,B,pv,0);</Text-field>
+</Input>
+</Group>
+<Group labelreference="L275" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Modular:-LUApply(p,B,pv,b1);b1[1..10];</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbW9HRiQ2M1EiW0YnLyUlZm9ybUdRJ3ByZWZpeEYnLyUmZmVuY2VHUSV0cnVlRicvJSpzZXBhcmF0b3JHUSZmYWxzZUYnLyUnbHNwYWNlR1EudGhpbm1hdGhzcGFjZUYnLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjQvJSpzeW1tZXRyaWNHRjcvJShtYXhzaXplR1EpaW5maW5pdHlGJy8lKG1pbnNpemVHUSIxRicvJShsYXJnZW9wR0Y3LyUubW92YWJsZWxpbWl0c0dGNy8lJ2FjY2VudEdGNy8lMGZvbnRfc3R5bGVfbmFtZ [...]
+</Output>
+</Group>
+<Group labelreference="L147" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="16" layout="Normal"><Font size="16">LinBox linear system solving</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L161" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x:=lbSolve(p,A,b);x[1..10];</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEieEYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbW9HRiQ2M1EiW0YnLyUlZm9ybUdRJ3ByZWZpeEYnLyUmZmVuY2VHUSV0cnVlRicvJSpzZXBhcmF0b3JHUSZmYWxzZUYnLyUnbHNwYWNlR1EudGhpbm1hdGhzcGFjZUYnLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjQvJSpzeW1tZXRyaWNHRjcvJShtYXhzaXplR1EpaW5maW5pdHlGJy8lKG1pbnNpemVHUSIxRicvJShsYXJnZW9wR0Y3LyUubW92YWJsZWxpbWl0c0dGNy8lJ2FjY2VudEdGNy8lMGZvbnRfc3R5bGVfbmFtZ [...]
+</Output>
+</Group>
+<Group labelreference="L155" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Timing comparison</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L282" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">B:=Modular:-Mod(p,A,integer[4]):b1:=Modular:-Mod(p,b,integer[4]):pv:=Vector(n-1):</Text-field>
+</Input>
+</Group>
+<Group labelreference="L281" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1:=time(Modular:-LUDecomposition(p,B,pv,0))+time(Modular:-LUApply(p,B,pv,b1));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L276" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t2:=time(lbSolve(p,A,b));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN0MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L277" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t1/t2;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5US0wLjU5MzEwMzQ0ODNGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGK [...]
+</Output>
+</Group>
+<Group labelreference="L350" drawlabel="true">
+<Input>
+<Text-field style="Text" size="16" layout="Normal"><Font size="16">Singular system</Font></Text-field>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L352" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=100;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L353" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(n,n,gen,datatype=integer[4]):c:=Vector(n,gen,datatype=integer[4]):c[n]:=0:</Text-field>
+</Input>
+</Group>
+<Group labelreference="L354" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A[1..n,n]:=A.c;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUklbXN1YkdGJDYmLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y6LyUqc3Vic2NyaXB0R0Y6LyUsc3VwZXJzY3JpcHRHRjovJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y6LyUrZXhlY3V0YWJsZUdGOi8lK [...]
+</Output>
+</Group>
+<Group labelreference="L355" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRank(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USM5OUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L356" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">pv:=Vector(n-1):Modular:-LUDecomposition(p,A,pv,0);</Text-field>
+</Input>
+<Output>
+<Text-field style="Error" layout="Error">Error, (in LinearAlgebra:-Modular:-LUDecomposition) matrix is singular</Text-field>
+</Output>
+</Group>
+<Group labelreference="L358" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x:=lbSolve(p,A,c):x[1..10];</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbW9HRiQ2M1EiW0YnLyUlZm9ybUdRJ3ByZWZpeEYnLyUmZmVuY2VHUSV0cnVlRicvJSpzZXBhcmF0b3JHUSZmYWxzZUYnLyUnbHNwYWNlR1EudGhpbm1hdGhzcGFjZUYnLyUncnNwYWNlR0Y6LyUpc3RyZXRjaHlHRjQvJSpzeW1tZXRyaWNHRjcvJShtYXhzaXplR1EpaW5maW5pdHlGJy8lKG1pbnNpemVHUSIxRicvJShsYXJnZW9wR0Y3LyUubW92YWJsZWxpbWl0c0dGNy8lJ2FjY2VudEdGNy8lMGZvbnRfc3R5bGVfbmFtZ [...]
+</Output>
+</Group>
+<Group labelreference="L361" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Norm(map(modp,A.x-c,p));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USIwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb3NlZ [...]
+</Output>
+</Group>
+<Group labelreference="L439" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"><Equation executable="true" style="2D Input" input-equation="Typesetting:-mrow(Typesetting:-mi(""))">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYjLUkjbWlHRiQ2OVEhRicvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GJy8lJXNpemVHUSMxMkYnLyUlYm9sZEdRJmZhbHNlRicvJSdpdGFsaWNHUSV0cnVlRicvJSp1bmRlcmxpbmVHRjcvJSpzdWJzY3JpcHRHRjcvJSxzdXBlcnNjcmlwdEdGNy8lK2ZvcmVncm91bmRHUShbMCwwLDBdRicvJStiYWNrZ3JvdW5kR1EuWzI1NS [...]
+</Input>
+</Group>
+<Group labelreference="L351" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Benefits in practice</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="14" layout="Normal"><Font size="14">Sometime numerical computation is not satisfying and exact computation becomes mandatory</Font></Text-field>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+<Group labelreference="L406" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">with(LinearAlgebra):</Text-field>
+</Input>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Very bad conditionned matrix</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L398" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Moler:=proc(n) local i,j,Moler; 
+   Moler:=Matrix(n);
+   for i from 1 to n do 
+      for j from 1 to (i-1) do 
+        Moler[i,j]:=j-2; 
+      end do;
+      Moler[i,i]:=i;
+      for j from (i+1) to n do
+       Moler[i,j]:=i-2;
+      end do; 
+   end do;
+   return Moler; end proc:</Text-field>
+</Input>
+</Group>
+<Group labelreference="L400" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Redheffer:=proc(n) local i,j,Redheffer; 
+   Redheffer:=Matrix(n);
+   for i from 1 to n do
+      Redheffer[i,1]:=1;
+      for j from 2 to n do
+         if (j mod i = 0) then
+            Redheffer[i,j]:=1;
+         else
+            Redheffer[i,j]:=0;
+         end if;
+      end do;
+   end do:
+   return Redheffer; end proc:</Text-field>
+</Input>
+</Group>
+<Group labelreference="L399" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Moler(10),Redheffer(10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUYjNiUtSSNtb0dGJDYzUSJbRicvJSVmb3JtR1EncHJlZml4RicvJSZmZW5jZUdRJXRydWVGJy8lKnNlcGFyYXRvckdRJmZhbHNlRicvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRicvJSdyc3BhY2VHRjwvJSlzdHJldGNoeUdGNi8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYnLyUobWluc2l6ZUdRIjFGJy8lKGxhcmdlb3BHRjkvJS5tb3ZhYmxlbGltaXRzR0Y5LyUnYWNjZW50R0Y5LyUwZm9udF9zdHlsZ [...]
+</Output>
+</Group>
+<Group labelreference="L404" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">n:=200;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJuRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L405" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">M:=1.*Moler(n):R:=1.*Redheffer(n):MR:=M.R;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEjTVJGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJSVib2xkR1EmZmFsc2VGJy8lJ2l0YWxpY0dRJXRydWVGJy8lKnVuZGVybGluZUdGNy8lKnN1YnNjcmlwdEdGNy8lLHN1cGVyc2NyaXB0R0Y3LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGO [...]
+</Output>
+</Group>
+<Group labelreference="L422" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">ConditionNumber(M); ConditionNumber(R); ConditionNumber(MR);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtbkdGJTY5USw4LjQ4MDEwODYwMUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y4LyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvb [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USwxMTI1MC4wMDAwMEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoL [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtbkdGJTY5USwyLjUyNzg2NTk5MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y4LyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvb [...]
+</Output>
+</Group>
+<Group labelreference="L411" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">Solving a linear system</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L402" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">b:=1.*Vector(n,rand(-1..1));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiYkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L403" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Digits:=14;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USdEaWdpdHNGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb [...]
+</Output>
+</Group>
+<Group labelreference="L418" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t:=time():x:=LinearSolve(MR,b,method=hybrid):time()-t;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjAwOUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L416" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Norm(MR.x-b);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UTQyMzcuMTE3MTg3NTAwMDAwMDAwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHU [...]
+</Output>
+</Group>
+<Group labelreference="L421" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=Matrix(MR,datatype=integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiQUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L420" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t:=time():y:=lbSolve(A,b):time()-t;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjMwN0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L417" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Norm(A.y-b);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USMwLkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L413" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L414" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+</Section>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">High precision results</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L423" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Tref:=ImportMatrix("tref200.dat",format=entries);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVElVHJlZkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L424" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">b:=Vector(200,rand(-1..1),datatype=integer[4]);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2OVEiYkYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRicvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYnLyUnb3BhcXVlR0Y3LyUrZXhlY3V0YWJsZUdGNy8lKXJlYWRvbmx5R0Y6L [...]
+</Output>
+</Group>
+<Group labelreference="L430" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Digits:=14;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USdEaWdpdHNGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb [...]
+</Output>
+</Group>
+<Group labelreference="L425" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t:=time():x:=LinearSolve(1.*Tref,1.*b):time()-t;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjA2NUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L426" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Norm(Tref.x-b);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtbkdGJTY5UTQyLjMxNzMxMzQzNjQ2MDc1NzgyRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjgvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4L [...]
+</Output>
+</Group>
+<Group labelreference="L427" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">t:=time():y:=lbSolve(Tref,b):time()-t;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USYwLjM3MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tc [...]
+</Output>
+</Group>
+<Group labelreference="L428" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Norm(Tref.y-b);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USIwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb3NlZ [...]
+</Output>
+</Group>
+<Group labelreference="L431" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">Bug in Maple</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L434" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Determinant(Tref);Rank(Tref);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USIwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjUvJStleGVjdXRhYmxlR0Y1LyUpcmVhZG9ubHlHUSV0cnVlRigvJSljb21wb3NlZ [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQxOTlGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L440" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Digits:=14;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USdEaWdpdHNGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb [...]
+</Output>
+</Group>
+<Group labelreference="L435" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Determinant(1.*Tref);Rank(1.*Tref);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtbkdGJTY5UTAyLjQwODQ1MTkyNTQ4MDVGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGOC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZ [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQyMDBGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L436" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbDeterminant(Tref);lbRank(Tref);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UVxbbTI0MDg0NTE5MjU0ODAyNzQzMTkzNTM5MjE0MTY1NjUwNzE0MDcxODM4ODg4OTI4ODk5NjM4MDgxMzEzMjU2MjE0MjAxMDk4MTY2MDQyMzgyMTg3MDYwNDE4MDEzMTA5MzQ5NzE1NjMzNzYyNDgzNDY1ODIzMjM4NTEyNTU5ODQwNjk4OTQ4OTY0MDE1NjUwNDExMzc4MjU1NDYxMzU2OTYyODg4NzMwMjgwNjEwMzQ0MTc2MzU1NDEyMjQ4OTk4MDc1NDE0NjYzMTcxNzUxOTYyMTQyMzA3OTQ3MjE4NTE3NDkyNzAzNzI4OTg2N [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtc0dGJTYjUTFjb252ZXJzaW9ufnRpbWU6RigtSSNtb0dGJTYzUSIsRigvJSVmb3JtR1EmaW5maXhGKC8lJmZlbmNlR1EmZmFsc2VGKC8lKnNlcGFyYXRvckdRJXRydWVGKC8lJ2xzcGFjZUdRJDBlbUYoLyUncnNwYWNlR1EzdmVyeXRoaWNrbWF0aHNwYWNlRigvJSlzdHJldGNoeUdGOS8lKnN5bW1ldHJpY0dGOS8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjkvJS5tb3ZhY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQyMDBGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L437" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Determinant(Matrix(Tref,storage=rectangular));</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UVxbbTI0MDg0NTE5MjU0ODAyNzQzMTkzNTM5MjE0MTY1NjUwNzE0MDcxODM4ODg4OTI4ODk5NjM4MDgxMzEzMjU2MjE0MjAxMDk4MTY2MDQyMzgyMTg3MDYwNDE4MDEzMTA5MzQ5NzE1NjMzNzYyNDgzNDY1ODIzMjM4NTEyNTU5ODQwNjk4OTQ4OTY0MDE1NjUwNDExMzc4MjU1NDYxMzU2OTYyODg4NzMwMjgwNjEwMzQ0MTc2MzU1NDEyMjQ4OTk4MDc1NDE0NjYzMTcxNzUxOTYyMTQyMzA3OTQ3MjE4NTE3NDkyNzAzNzI4OTg2N [...]
+</Output>
+</Group>
+<Group labelreference="L438" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Section>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Section>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 1" layout="Heading 1">Low level of the interface</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L283" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">restart;</Text-field>
+</Input>
+</Group>
+<Group labelreference="L284" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">p:=17;</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJwRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Submodule of module LinBox</Text-field></Title>
+<Group labelreference="L285" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L286" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">with(LinBox:-Dev);</Text-field>
+</Input>
+<Output>
+<Text-field style="Line Printed Output" layout="Line Printed Output">  LinBox/Maple Interface Package beta version 0.1 
+  by Pascal Giorgi (pgiorgi at uwaterloo.ca)</Text-field>
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uY [...]
+</Output>
+</Group>
+<Group labelreference="L287" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L288" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L291" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Creation of Domain</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="16" layout="Normal"><Font size="16">Integers Domain</Font></Text-field>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+<Group labelreference="L293" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Z:=lbDomain(0,"linbox_ring_integer");</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJaRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L294" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Z:=lbDomain();</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJaRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Finite fields domain</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L301" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Zp:=lbDomain(p,"linbox_field_dbl");</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNacEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L302" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Zp:=lbDomain(p);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNacEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font size="16">Use of global default type</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L296" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbSetIntegerRing("linbox_ring_integer");</Text-field>
+</Input>
+</Group>
+<Group labelreference="L297" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbSetPrimeField("linbox_field_dbl");</Text-field>
+</Input>
+</Group>
+<Group labelreference="L304" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Z1:=lbDomain();</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNaMUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L305" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Zp2:=lbDomain(p);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USRacDJGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25se [...]
+</Output>
+</Group>
+<Group labelreference="L387" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Using Blackbox (Matrix)</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L306" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=lbBlackbox(Z,10,10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJBRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L307" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Ap:=lbBlackbox(Zp,10,10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNBcEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L445" drawlabel="true">
+<Input>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+<Text-field style="Text" size="16" layout="Normal"><Font size="14">Use of global default type</Font></Text-field>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L448" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbSetBlackbox("linbox_sparse");</Text-field>
+</Input>
+</Group>
+<Group labelreference="L446" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">A:=lbBlackbox(Z,10,10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJBRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L447" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L365" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"> <Font size="14">Set entries at random over the domain</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L308" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRandom(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtaUc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UV1yW35MaW5Cb3h+QmxhY2tib3h+KHN0b3JhZ2V+PX5saW5ib3hfc3BhcnNlLH5kb21haW5+PX5bTGluQm94fkRvbWFpbn4odHlwZX49fmxpbmJveF9yaW5nX2ludGVnZXIsfmNoYXJhY3R+PX4wKV1+KV18K0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3Jpc [...]
+</Output>
+</Group>
+<Group labelreference="L311" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRandom(Ap);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtaUc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UWpxW35MaW5Cb3h+QmxhY2tib3h+KHN0b3JhZ2V+PX5saW5ib3hfZGVuc2UsfmRvbWFpbn49fltMaW5Cb3h+RG9tYWlufih0eXBlfj1+bGluYm94X2ZpZWxkX2RibCx+Y2hhcmFjdH49fjE3KV1+KV18K0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHR [...]
+</Output>
+</Group>
+<Group labelreference="L363" drawlabel="true">
+<Input>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+<Text-field style="Text" size="14" layout="Normal"><Font size="14">Computation without specifying the domain</Font></Text-field>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L366" drawlabel="true">
+<Input>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">Over the integers</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L312" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">d1:=lbDeterminant(A);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNkMUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L367" drawlabel="true">
+<Input>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">Over a finite field</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L313" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">d2:=lbDeterminant(Ap);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNkMkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L450" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L309" drawlabel="true">
+<Input>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+<Text-field style="Text" size="14" layout="Normal"><Font size="14">Converting data</Font></Text-field>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L441" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbConvertElement(d1);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UWhwMzExNjI3OTYyMjI4MzQ1MzA4MjI5ODYyNjQxMjc3NjYxNjczOTQ3MDg1MDkwOTQ1ODg4MjgyNzY3MTQzMjYyOTAwMDkyNTExNzI1NDIwMDc0ODEzNTIzMjY1NDk2RigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHRjUvJSp1bmRlcmxpbmVHRjUvJSpzdWJzY3JpcHRHRjUvJSxzdXBlcnNjcmlwdEdGNS8lK2ZvcmVncm91bmRHUSpbMCwwLDI1N [...]
+</Output>
+</Group>
+<Group labelreference="L449" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbConvertElement(d2);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USMxMUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR0Y1LyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHRjUvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y1LyUrZXhlY3V0YWJsZUdGNS8lKXJlYWRvbmx5R1EldHJ1ZUYoLyUpY29tcG9zZ [...]
+</Output>
+</Group>
+<Group labelreference="L310" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">using Vector</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Group labelreference="L369" drawlabel="true">
+<Input>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">construction over the integers</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L333" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">V:=lbVector(Z,10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USJWRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHR [...]
+</Output>
+</Group>
+<Group labelreference="L370" drawlabel="true">
+<Input>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">construction over finite field</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L336" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">Vp:=lbVector(Zp,10);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USNWcEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L451" drawlabel="true">
+<Input>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+<Text-field style="Text" size="16" layout="Normal"><Font size="14">Use of global default type</Font></Text-field>
+<Text-field style="Text" size="16" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L452" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbSetVector("linbox_dense");</Text-field>
+</Input>
+</Group>
+<Group labelreference="L371" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L372" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"> <Font size="14">Set entries at random over the domain</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L332" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRandom(V);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtaUc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UWpxW35MaW5Cb3h+VmVjdG9yfihzdG9yYWdlfj1+bGluYm94X2RlbnNlLH5kb21haW5+PX5bTGluQm94fkRvbWFpbn4odHlwZX49fmxpbmJveF9yaW5nX2ludGVnZXIsfmNoYXJhY3R+PX4wKV1+KV18K0YoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y1LyUqc3Vic2NyaXB0R0Y1LyUsc3VwZXJzY3JpcHRHR [...]
+</Output>
+</Group>
+<Group labelreference="L334" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbRandom(Vp);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtaUc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UWhxW35MaW5Cb3h+VmVjdG9yfihzdG9yYWdlfj1+bGluYm94X2RlbnNlLH5kb21haW5+PX5bTGluQm94fkRvbWFpbn4odHlwZX49fmxpbmJveF9maWVsZF9kYmwsfmNoYXJhY3R+PX4xNyldfildfCtGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1L [...]
+</Output>
+</Group>
+<Group labelreference="L373" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L375" drawlabel="true">
+<Input>
+<Text-field style="Text" size="14" layout="Normal"><Font size="14">Computation without specifying the domain</Font></Text-field>
+<Text-field style="Text" size="14" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L376" drawlabel="true">
+<Input>
+<Text-field style="Text" italic="true" size="14" layout="Normal"><Font italic="true" size="14">Over the integers</Font></Text-field>
+</Input>
+</Group>
+<Group labelreference="L342" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x1:=lbSolve(A,V);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN4MUYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L335" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">x2:=lbSolve(Ap,Vp);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USN4MkYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR1EjMTJGKC8lJWJvbGRHUSZmYWxzZUYoLyUnaXRhbGljR1EldHJ1ZUYoLyUqdW5kZXJsaW5lR0Y4LyUqc3Vic2NyaXB0R0Y4LyUsc3VwZXJzY3JpcHRHRjgvJStmb3JlZ3JvdW5kR1EqWzAsMCwyNTVdRigvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XUYoLyUnb3BhcXVlR0Y4LyUrZXhlY3V0YWJsZUdGOC8lKXJlYWRvbmx5R [...]
+</Output>
+</Group>
+<Group labelreference="L339" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" size="14" layout="Normal"><Font size="14">Converting data</Font></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+<Group labelreference="L453" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">lbConvertVector(x1);lbConvertVector(x2);</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uY [...]
+</Output>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uY [...]
+</Output>
+</Group>
+</Section>
+<Section collapsed="false" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">Example of use</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 3" layout="Heading 3">Highly efficient user's solution</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"><Font italic="true" size="14">Compute the determinant of a matrix read from a file</Font></Text-field>
+<Group labelreference="L343" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">myDeterminant:=proc(p, file)
+   local Zp,B,d;
+   Zp:=lbDomain(p);
+   B:=lbBlackbox(Zp,file);
+   d:=lbElement(Zp);
+   lbDeterminant(d,B);
+   return lbConvertElement(d);
+ end;
+   
+   </Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5US5teURldGVybWluYW50RigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4L [...]
+</Output>
+</Group>
+<Group labelreference="L344" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">myDeterminant(1009, "trefethen_200.sms");</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5USQzNDZGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGNS8lKnN1YnNjcmlwdEdGNS8lLHN1cGVyc2NyaXB0R0Y1LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGNS8lK2V4ZWN1dGFibGVHRjUvJSlyZWFkb25seUdRJXRydWVGKC8lKWNvbXBvc [...]
+</Output>
+</Group>
+<Group labelreference="L345" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal">myDeterminant(0, "trefethen_200.sms");</Text-field>
+</Input>
+<Output>
+<Text-field style="2D Output" layout="Maple Output"><Equation executable="false" style="2D Output">NiQtSSNtbkc2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGKDY5UVxbbTI0MDg0NTE5MjU0ODAyNzQzMTkzNTM5MjE0MTY1NjUwNzE0MDcxODM4ODg4OTI4ODk5NjM4MDgxMzEzMjU2MjE0MjAxMDk4MTY2MDQyMzgyMTg3MDYwNDE4MDEzMTA5MzQ5NzE1NjMzNzYyNDgzNDY1ODIzMjM4NTEyNTU5ODQwNjk4OTQ4OTY0MDE1NjUwNDExMzc4MjU1NDYxMzU2OTYyODg4NzMwMjgwNjEwMzQ0MTc2MzU1NDEyMjQ4OTk4MDc1NDE0NjYzMTcxNzUxOTYyMTQyMzA3OTQ3MjE4NTE3NDkyNzAzNzI4OTg2N [...]
+</Output>
+</Group>
+<Group labelreference="L382" drawlabel="true">
+<Input>
+<Text-field prompt="> " style="Maple Input" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Section>
+</Section>
+<Section collapsed="true" MultipleChoiceAnswerIndex="-1" MultipleChoiceRandomizeChoices="false" TrueFalseAnswerIndex="-1" EssayAnswerRows="5" EssayAnswerColumns="60"><Title>
+<Text-field style="Heading 2" layout="Heading 2">To continue ...</Text-field></Title>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Section>
+</Section>
+<Group labelreference="L289" drawlabel="true">
+<Input>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+<Text-field style="Text" layout="Normal"></Text-field>
+</Input>
+</Group>
+</Worksheet>
\ No newline at end of file
diff --git a/interfaces/sage/Makefile.am b/interfaces/sage/Makefile.am
index f7c690c..a3c6f47 100644
--- a/interfaces/sage/Makefile.am
+++ b/interfaces/sage/Makefile.am
@@ -21,9 +21,12 @@
 
 if LINBOX_HAVE_SAGE
 
-AM_CPPFLAGS=-I$(top_srcdir) -I. -I../../linbox
+#AM_CPPFLAGS=-I$(top_srcdir) -I. -I../../linbox
 
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR $(GMP_CFLAGS) $(NTL_CFLAGS) $(ATLAS_CFLAGS) $(FFLAS_FFPACK_CFLAGS) $(GIVARO_CFLAGS)
+AM_CPPFLAGS = -DDISABLE_COMMENTATOR -I$(top_srcdir)/linbox $(DEPS_CFLAGS)
+LDADD = $(DEPS_LIBS) $(LDFLAGS)
+
+#AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR  $(NTL_CFLAGS) $(OPTFLAGS) $(PARFLAGS)
 
 lib_LTLIBRARIES = liblinboxsage.la
 
@@ -31,9 +34,9 @@ liblinboxsage_la_SOURCES = linbox-sage.C
 
 pkginclude_HEADERS = linbox-sage.h
 
-#liblinboxsage_la_LIBADD = -llinbox $(BLAS_LIBS)
+#liblinboxsage_la_LIBADD = -llinbox 
 #gentoo's linbox-1.1.6-fix-undefined-symbols.patch
 liblinboxsage_la_LIBADD = $(top_builddir)/linbox/liblinbox.la
 
-liblinboxsage_la_LDFLAGS =  $(GIVARO_LIBS) $(GMP_LIBS) $(NTL_LIBS) $(BLAS_LIBS) $(MAPLE_LIBS) $(LDFLAGS) -version-info 0:0:0 #-Wl,-zmuldefs
+liblinboxsage_la_LDFLAGS = $(DEPS_LIBS) $(LDFLAGS) -version-info 0:0:0 #-Wl,-zmuldefs
 endif
diff --git a/interfaces/sage/Makefile.in b/interfaces/sage/Makefile.in
deleted file mode 100644
index 924dc48..0000000
--- a/interfaces/sage/Makefile.in
+++ /dev/null
@@ -1,657 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = interfaces/sage
-DIST_COMMON = $(am__pkginclude_HEADERS_DIST) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"
-LTLIBRARIES = $(lib_LTLIBRARIES)
- at LINBOX_HAVE_SAGE_TRUE@liblinboxsage_la_DEPENDENCIES =  \
- at LINBOX_HAVE_SAGE_TRUE@	$(top_builddir)/linbox/liblinbox.la
-am__liblinboxsage_la_SOURCES_DIST = linbox-sage.C
- at LINBOX_HAVE_SAGE_TRUE@am_liblinboxsage_la_OBJECTS = linbox-sage.lo
-liblinboxsage_la_OBJECTS = $(am_liblinboxsage_la_OBJECTS)
-liblinboxsage_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(liblinboxsage_la_LDFLAGS) $(LDFLAGS) -o $@
- at LINBOX_HAVE_SAGE_TRUE@am_liblinboxsage_la_rpath = -rpath $(libdir)
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = $(liblinboxsage_la_SOURCES)
-DIST_SOURCES = $(am__liblinboxsage_la_SOURCES_DIST)
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__pkginclude_HEADERS_DIST = linbox-sage.h
-HEADERS = $(pkginclude_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
- at LINBOX_HAVE_SAGE_TRUE@AM_CPPFLAGS = -I$(top_srcdir) -I. -I../../linbox
- at LINBOX_HAVE_SAGE_TRUE@AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR $(GMP_CFLAGS) $(NTL_CFLAGS) $(ATLAS_CFLAGS) $(FFLAS_FFPACK_CFLAGS) $(GIVARO_CFLAGS)
- at LINBOX_HAVE_SAGE_TRUE@lib_LTLIBRARIES = liblinboxsage.la
- at LINBOX_HAVE_SAGE_TRUE@liblinboxsage_la_SOURCES = linbox-sage.C
- at LINBOX_HAVE_SAGE_TRUE@pkginclude_HEADERS = linbox-sage.h
-
-#liblinboxsage_la_LIBADD = -llinbox $(BLAS_LIBS)
-#gentoo's linbox-1.1.6-fix-undefined-symbols.patch
- at LINBOX_HAVE_SAGE_TRUE@liblinboxsage_la_LIBADD = $(top_builddir)/linbox/liblinbox.la
- at LINBOX_HAVE_SAGE_TRUE@liblinboxsage_la_LDFLAGS = $(GIVARO_LIBS) $(GMP_LIBS) $(NTL_LIBS) $(BLAS_LIBS) $(MAPLE_LIBS) $(LDFLAGS) -version-info 0:0:0 #-Wl,-zmuldefs
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .C .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps interfaces/sage/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps interfaces/sage/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
-	}
-
-uninstall-libLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
-	done
-
-clean-libLTLIBRARIES:
-	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
-	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" != "$$p" || dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-liblinboxsage.la: $(liblinboxsage_la_OBJECTS) $(liblinboxsage_la_DEPENDENCIES) $(EXTRA_liblinboxsage_la_DEPENDENCIES) 
-	$(liblinboxsage_la_LINK) $(am_liblinboxsage_la_rpath) $(liblinboxsage_la_OBJECTS) $(liblinboxsage_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-.C.o:
-	$(CXXCOMPILE) -c -o $@ $<
-
-.C.obj:
-	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.C.lo:
-	$(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgincludeHEADERS: $(pkginclude_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
-	done
-
-uninstall-pkgincludeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(LTLIBRARIES) $(HEADERS)
-installdirs:
-	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
-	mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludeHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am: install-libLTLIBRARIES
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-libLTLIBRARIES uninstall-pkgincludeHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libLTLIBRARIES clean-libtool ctags distclean \
-	distclean-compile distclean-generic distclean-libtool \
-	distclean-tags distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am \
-	install-libLTLIBRARIES install-man install-pdf install-pdf-am \
-	install-pkgincludeHEADERS install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-	pdf pdf-am ps ps-am tags uninstall uninstall-am \
-	uninstall-libLTLIBRARIES uninstall-pkgincludeHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/interfaces/sage/linbox-sage.C b/interfaces/sage/linbox-sage.C
index c117ab6..7fa31f3 100644
--- a/interfaces/sage/linbox-sage.C
+++ b/interfaces/sage/linbox-sage.C
@@ -25,25 +25,22 @@
  */
 
 #include <iostream>
-#include <gmp.h>
 
 #include <cstdlib>
 #include <vector>
 #include <list>
-
-#include "linbox-sage.h"
-
+#include "linbox/linbox-config.h"
 #include "linbox/util/commentator.h"
 
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 
 //#include "linbox/element/givaro-polynomial.h"
 
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/matrix/sparse.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/vector/sparse.h"
 
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
 #include "linbox/algorithms/echelon-form.h"
 #include "linbox/algorithms/gauss.h"
 #include "linbox/algorithms/smith-form-adaptive.h"
@@ -58,7 +55,11 @@
 #include "linbox/integer.h"
 #include "linbox/field/gmp-rational.h"
 #include "linbox/ring/givaro-polynomial.h"
-#include "linbox/field/modular.h"
+#include "givaro/modular.h"
+
+#include <gmp.h>
+
+#include "linbox-sage.h"
 
 using namespace LinBox;
 
@@ -66,15 +67,13 @@ using namespace LinBox;
   dense modulo Z/nZ
  *************************************************************************/
 
-//we are using Modular<double> here as it seems to be best supported
+//we are using Givaro::Modular<double> here as it seems to be best supported
 
 /* NOTE: There are many echelon form functions, possible base rings, etc.  Strangely,
    most don't build.  This combination below does though.
    */
 
-void linbox_modn_dense_delete_array_double(double * f)
-{
-	delete[] f;
+void linbox_modn_dense_delete_array_double(double * f) {delete[] f;
 }
 void linbox_modn_dense_delete_array_float(float * f) {delete[] f;
 }
@@ -83,7 +82,7 @@ template <class Element>
 unsigned long int linbox_modn_dense_echelonize (Element modulus, Element* matrix,
 						size_t nrows, size_t ncols)
 {
-	Modular<Element> F(modulus);
+	Givaro::Modular<Element> F(modulus);
 
 	size_t * P=new size_t[ncols];
 	size_t * Q=new size_t[nrows];
@@ -117,7 +116,7 @@ template<class Element>
 unsigned long int linbox_modn_dense_rank (Element modulus,  Element* matrix, size_t nrows, size_t ncols)
 {
 
-	Modular<Element> F (modulus);
+	Givaro::Modular<Element> F (modulus);
 	Element * Ad = new Element [nrows*ncols];
 	for (size_t i=0; i< nrows; ++i)
 		for (size_t j = 0; j < ncols; ++j)
@@ -141,7 +140,7 @@ template<class Element>
 Element linbox_modn_dense_det(Element modulus,Element*matrix,size_t nrows,size_t ncols)
 {
 
-	Modular<Element> F (modulus);
+	Givaro::Modular<Element> F (modulus);
 	Element * Ad = new Element [nrows*ncols];
 	for (size_t i=0; i< nrows; ++i)
 		for (size_t j = 0; j < ncols; ++j)
@@ -164,10 +163,10 @@ template<class Element>
 Element* linbox_modn_dense_minpoly (Element modulus, Element ** mp, size_t* degree,
 				    size_t n, Element *matrix)
 {
-	typedef  Modular<Element> Field;
+	typedef  Givaro::Modular<Element> Field;
 	typedef  std::vector<Element> Polynomial;
 
-	Modular<Element> F(modulus);
+	Givaro::Modular<Element> F(modulus);
 	// Warning: super sketchy memory alloc here!!!!
 	std::vector<Element> *minP=new std::vector<Element>(n);
 	Element * X = new Element[n*(n+1)];
@@ -213,7 +212,7 @@ template<class Element>
 Element* linbox_modn_dense_charpoly (Element modulus, Element *& cp, size_t n, Element *matrix)
 {
 
-	Modular<Element> F(modulus);
+	Givaro::Modular<Element> F(modulus);
 
 	// FIXME: check the memory management: better to allocate mp in sage
 	std::list<std::vector<Element> > P_list;
@@ -256,7 +255,7 @@ unsigned long linbox_modn_dense_col_rankprofile_submatrix_indices (Element modul
 								   size_t nrows,
 								   size_t ncols)
 {
-	Modular<Element> F (modulus);
+	Givaro::Modular<Element> F (modulus);
 	Element * Ad = new Element [nrows*ncols];
 	for (size_t i=0; i< nrows; ++i)
 		for (size_t j = 0; j < ncols; ++j)
@@ -283,7 +282,7 @@ unsigned long linbox_modn_dense_col_rankprofile_submatrix (Element modulus,
 							   size_t& rank,
 							   size_t nrows, size_t ncols)
 {
-	Modular<Element> F (modulus);
+	Givaro::Modular<Element> F (modulus);
 	//FIXME: check the memory managmenent
 	Element * Ad = new Element [nrows*ncols];
 	for (size_t i=0; i< nrows; ++i)
@@ -309,7 +308,7 @@ Element* linbox_modn_dense_matrix_matrix_multiply (Element modulus, Element *ans
 						   size_t m, size_t n, size_t k)
 {
 
-	Modular<Element> F(modulus);
+	Givaro::Modular<Element> F(modulus);
 
 	FFLAS::fgemm (F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, m,n,k, 1.0,
 		      A, k, B, n, 0.0, ans, n);
@@ -333,7 +332,7 @@ Element *  linbox_modn_dense_matrix_matrix_general_multiply(Element modulus,
 							    Element *A, Element *B,
 							    size_t m, size_t n, size_t k)
 {
-	Modular<Element> F(modulus);
+	Givaro::Modular<Element> F(modulus);
 	FFLAS::fgemm (F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, m,n,k, alpha,
 		      A, k, B, n, beta,ans, n);
 	return ans;
@@ -352,7 +351,7 @@ EXTERN float* linbox_modn_dense_matrix_matrix_general_multiply_float (float modu
   dense over ZZ
  *************************************************************************/
 
-typedef PID_integer IntegerRing;
+typedef Givaro::ZRing<Integer> IntegerRing;
 
 template <class Field, class Polynomial>
 void printPolynomial (const Field &F, const Polynomial &v)
@@ -368,7 +367,7 @@ void printPolynomial (const Field &F, const Polynomial &v)
 SpyInteger spy;
 typedef GivPolynomialRing<IntegerRing, Givaro::Dense> IntPolRing;
 
-void get_matrix(BlasMatrix<IntegerRing> &A, mpz_t** matrix)
+void get_matrix(DenseMatrix<IntegerRing> &A, mpz_t** matrix)
 {
 
 	size_t i, j;
@@ -382,7 +381,7 @@ void get_matrix(BlasMatrix<IntegerRing> &A, mpz_t** matrix)
 }
 
 template<class Field>
-void set_matrix(mpz_t** matrix, BlasMatrix<Field>& A)
+void set_matrix(mpz_t** matrix, DenseMatrix<Field>& A)
 {
 	size_t i, j;
 	for (i=0; i < A.rowdim(); ++i) {
@@ -392,6 +391,7 @@ void set_matrix(mpz_t** matrix, BlasMatrix<Field>& A)
 	}
 }
 
+
 // void linbox_integer_dense_minpoly_hacked(mpz_t* *mp, size_t* degree, size_t n, mpz_t** matrix, int do_minpoly)
 // {
 // 	/* We program around a bizarre bug in linbox, where minpoly doesn't work
@@ -406,7 +406,7 @@ void set_matrix(mpz_t** matrix, BlasMatrix<Field>& A)
 // 	}
 //         IntegerRing ZZ;
 
-// 	BlasMatrix<IntegerRing> A(ZZ, m, m);
+// 	DenseMatrix<IntegerRing> A(ZZ, m, m);
 
 //         get_matrix<IntegerRing>(A, matrix);
 
@@ -455,7 +455,7 @@ void set_matrix(mpz_t** matrix, BlasMatrix<Field>& A)
 void linbox_integer_dense_charpoly(mpz_t* &mp, size_t& degree, size_t n, mpz_t** matrix)
 {
         IntegerRing ZZ;
-	BlasMatrix<IntegerRing> A(ZZ, n, n);
+	DenseMatrix<IntegerRing> A(ZZ, n, n);
         get_matrix(A, matrix);
 
 	IntPolRing::Element m_A;
@@ -473,7 +473,7 @@ void linbox_integer_dense_charpoly(mpz_t* &mp, size_t& degree, size_t n, mpz_t**
 void linbox_integer_dense_minpoly(mpz_t* &mp, size_t& degree, size_t n, mpz_t** matrix)
 {
         IntegerRing ZZ;
-	BlasMatrix<IntegerRing> A(ZZ, n, n);
+	DenseMatrix<IntegerRing> A(ZZ, n, n);
         get_matrix(A, matrix);
 
 	IntPolRing::Element m_A;
@@ -496,9 +496,9 @@ int linbox_integer_dense_matrix_matrix_multiply(mpz_t** ans, mpz_t **A, mpz_t **
 						size_t A_nr, size_t A_nc,size_t B_nc)
 {
         IntegerRing ZZ;
-	BlasMatrix<IntegerRing> AA(ZZ, A_nr, A_nc);
-	BlasMatrix<IntegerRing> BB(ZZ, A_nc, B_nc);
-	BlasMatrix<IntegerRing> CC(ZZ, A_nr, B_nc);
+	DenseMatrix<IntegerRing> AA(ZZ, A_nr, A_nc);
+	DenseMatrix<IntegerRing> BB(ZZ, A_nc, B_nc);
+	DenseMatrix<IntegerRing> CC(ZZ, A_nr, B_nc);
 
         get_matrix(AA, A);
         get_matrix(BB, B);
@@ -515,7 +515,7 @@ unsigned long linbox_integer_dense_rank(mpz_t** matrix, size_t nrows,
 					size_t ncols)
 {
         IntegerRing ZZ;
-	BlasMatrix<IntegerRing> A(ZZ, nrows, ncols);
+	DenseMatrix<IntegerRing> A(ZZ, nrows, ncols);
         get_matrix(A, matrix);
 	unsigned long r;
 	rank(r, A);
@@ -529,7 +529,7 @@ void linbox_integer_dense_det(mpz_t ans, mpz_t** matrix, size_t nrows,
 	commentator().setMaxDepth (0);
 
         IntegerRing ZZ;
-	BlasMatrix<IntegerRing> A ( ZZ, nrows, ncols);
+	DenseMatrix<IntegerRing> A ( ZZ, nrows, ncols);
         get_matrix(A, matrix);
 	IntegerRing::Element d;
 
@@ -538,15 +538,15 @@ void linbox_integer_dense_det(mpz_t ans, mpz_t** matrix, size_t nrows,
 }
 
 #ifdef __LINBOX_HAVE_NTL
-BlasMatrix<NTL_ZZ> new_matrix_integer_dense_ntl(mpz_t** matrix, size_t nrows, size_t ncols)
+DenseMatrix<NTL_ZZ> new_matrix_integer_dense_ntl(mpz_t** matrix, size_t nrows, size_t ncols)
 {
 	NTL_ZZ Z;
-	BlasMatrix<NTL_ZZ> A (Z,nrows, ncols);
+	DenseMatrix<NTL_ZZ> A (Z,nrows, ncols);
 	size_t i, j;
 	for (i=0; i < nrows; ++i) {
 		for (j=0; j < ncols; ++j) {
 			NTL_ZZ::Element t;
-			PID_integer::Element s;
+			Givaro::ZRing<Integer>::Element s;
 			mpz_set(spy.get_mpz(s), matrix[i][j]);
 			Z.init(t, s);
 			A.setEntry(i, j, t);
@@ -561,7 +561,7 @@ void linbox_integer_dense_double_det (mpz_t  ans1, mpz_t ans2, mpz_t **a, mpz_t
 {
 
 	IntegerRing ZZ;
-	BlasMatrix<IntegerRing> A(ZZ, n+1, n);
+	DenseMatrix<IntegerRing> A(ZZ, n+1, n);
 	size_t i, j;
 	for (i=0; i < n-1; ++i) {
 		for (j=0; j < n; ++j) {
@@ -571,13 +571,13 @@ void linbox_integer_dense_double_det (mpz_t  ans1, mpz_t ans2, mpz_t **a, mpz_t
 		}
 	}
 	for (j=0; j < n; ++j) {
-		PID_integer::Element t;
+		Givaro::ZRing<Integer>::Element t;
 		mpz_set(spy.get_mpz(t), b[0][j]);
 		A.setEntry (n-1, j, t);
 		mpz_set (spy.get_mpz(t), c[0][j]);
 		A.setEntry (n, j, t);
 	}
-	PID_integer::Element d1,d2;
+	Givaro::ZRing<Integer>::Element d1,d2;
 	doubleDet (d1, d2, A, proof);
 	mpz_set(ans1, spy.get_mpz(d1));
 	mpz_set(ans2, spy.get_mpz(d2));
@@ -591,7 +591,7 @@ void linbox_integer_dense_smithform(mpz_t **v,
 {
 	typedef NTL_ZZ Ints;
 	Ints Z;
-	BlasMatrix<Ints> M(new_matrix_integer_dense_ntl(matrix, nrows, ncols));
+	DenseMatrix<Ints> M(new_matrix_integer_dense_ntl(matrix, nrows, ncols));
 	std::vector<integer> w(ncols);
 	SmithFormAdaptive::smithForm(w, M);
 
@@ -618,30 +618,34 @@ struct c_vector_modint_linbox {
 };
 
 typedef unsigned int mod_int;
-typedef Modular<unsigned int> GFp;
+typedef Givaro::Modular<unsigned int> GFp;
 typedef GFp::Element  GFpElement;
 typedef std::vector <std::pair <size_t, GFpElement> > SparseSeqVectorGFp;
-typedef SparseMatrix<GFp, SparseSeqVectorGFp> SparseMatrixGFp;
+typedef SparseMatrix<GFp, VectorTraits<SparseSeqVectorGFp>::SparseFormat> SparseMatrixGFp;
 
-static SparseMatrixGFp linbox_new_modn_sparse_matrix(mod_int modulus, size_t numrows, size_t numcols, void *rows)
+SparseMatrixGFp* linbox_new_modn_sparse_matrix(mod_int modulus, size_t numrows, size_t numcols, void *rows)
 {
-	GFp F(modulus);
-	SparseMatrixGFp M(F, numrows, numcols);
+	GFp *F=new GFp(modulus);
+	SparseMatrixGFp* M=new SparseMatrixGFp(*F, numrows, numcols);
 
 	struct c_vector_modint_linbox *A = static_cast<struct c_vector_modint_linbox *>(rows);
 
 	for(size_t i = 0; i < numrows; ++i) {
 		for(size_t j = 0; j < A[i].num_nonzero; ++j) {
-			M.setEntry(i, A[i].positions[j], A[i].entries[j]);
+                        M->setEntry(i, A[i].positions[j], A[i].entries[j]);
 		}
 	}
 	return M;
 }
 
+void linbox_delete_modn_sparse_matrix (SparseMatrixGFp * A) {
+        const GFp * F = &A->field();
+        delete A;
+        delete F;
+}
+
 static std::vector<GFpElement> linbox_new_modn_sparse_vector(mod_int modulus, size_t len, void *_vec)
 {
-	GFp F(modulus);
-
 	std::vector<GFpElement> A(len);
 
 	if (_vec==NULL) {
@@ -659,18 +663,18 @@ unsigned long linbox_modn_sparse_matrix_rank(mod_int modulus,
 					     size_t numrows, size_t numcols,
 					     void *rows, int gauss)
 {
-	GFp F(modulus);
 	unsigned long M_rank;
 	GFpElement M_det;
-	GaussDomain<GFp> dom(F);
 
-	SparseMatrixGFp M( linbox_new_modn_sparse_matrix(modulus, numrows, numcols, rows) );
+	SparseMatrixGFp *M = linbox_new_modn_sparse_matrix(modulus, numrows, numcols, rows) ;
+	const GFp &F = M->field();
+	GaussDomain<GFp> dom(F);
 
 	if(!gauss) {
-		dom.InPlaceLinearPivoting(M_rank, M_det, M, numrows, numcols);
+		dom.InPlaceLinearPivoting(M_rank, M_det, *M, numrows, numcols);
 	}
 	else {
-		dom.NoReordering(M_rank, M_det, M, numrows, numcols);
+		dom.NoReordering(M_rank, M_det, *M, numrows, numcols);
 	}
 
 	//*pivots = (int*)calloc(sizeof(int), dom.pivots.size());
@@ -679,7 +683,7 @@ unsigned long linbox_modn_sparse_matrix_rank(mod_int modulus,
 	//   for(std::vector<int>::const_iterator i= dom.pivots.begin(); i!= dom.pivots.end(); ++i, ++j){
 	//     (*pivots)[j] = *i;
 	//   }
-
+        linbox_delete_modn_sparse_matrix(M);
 	return M_rank;
 }
 
@@ -687,30 +691,34 @@ std::vector<mod_int> linbox_modn_sparse_matrix_solve(mod_int p, size_t numrows,
 						     void *_a, void *b, int method)
 {
 	// solve ax = b, for x, a matrix, b vector, x vector
-	GFp F(p);
 
-	std::vector<mod_int> X( numrows);
-	std::vector<mod_int> B( linbox_new_modn_sparse_vector(p, numcols, b));
+	SparseMatrixGFp *A =linbox_new_modn_sparse_matrix(p, numrows, numcols, _a);
+
+	const GFp & F = A->field();
 
-	SparseMatrixGFp A(linbox_new_modn_sparse_matrix(p, numrows, numcols, _a));
+        DenseVector<GFp> X(F, numrows);
+        DenseVector<GFp> B(F, linbox_new_modn_sparse_vector(p, numcols, b) );
 
 	switch(method) {
 	case 1:
-		solve(X, A, B, Method::BlasElimination());
+		solve(X, *A, B, Method::BlasElimination());
 		break;
 
 	case 2:
-		solve(X, A, B, Method::Blackbox());
+		solve(X, *A, B, Method::Blackbox());
 		break;
 
 	case 3:
-		solve(X, A, B, Method::Wiedemann());
+		solve(X, *A, B, Method::Wiedemann());
 		break;
 
 	default:
-		solve(X, A, B);
+		solve(X, *A, B);
 	}
-	return X;
+
+        linbox_delete_modn_sparse_matrix(A);
+
+	return X.refRep();
 }
 
 // vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
diff --git a/interfaces/sage/linbox-sage.h b/interfaces/sage/linbox-sage.h
index e249228..d521b02 100644
--- a/interfaces/sage/linbox-sage.h
+++ b/interfaces/sage/linbox-sage.h
@@ -25,9 +25,9 @@
  */
 
 #ifndef __LINBOX_sage_H
-#define __LINBOX_sagE_H
+#define __LINBOX_sage_H
 
-#include<stddef.h>
+#include <stddef.h>
 
 #include <cstdlib>
 #include <vector>
diff --git a/linbox-config.in b/linbox-config.in
index b27dbd9..8bfd627 100644
--- a/linbox-config.in
+++ b/linbox-config.in
@@ -1,4 +1,4 @@
-#! /bin/sh
+#! /bin/bash
 
 # Copyright (c) the LinBox group
 # This file is part of LinBox (and probably stolen here and there)
@@ -19,8 +19,6 @@ cflags=false
 libs=false
 
 
-
-
 usage()
 {
     cat <<EOF
@@ -30,7 +28,8 @@ Known values for OPTION are:
 
   --prefix		show Linbox installation prefix 
   --libs		print library linking information
-  --cflags		print pre-processor and compiler flags
+  --cflags		print pre-processor flags
+  --cflags-full	print pre-processor and compiler flags
   --help		display this help and exit
   --version		output version information string (eg @VERSION@)
   --decimal-version	output version information number (eg $decvr)
@@ -74,11 +73,15 @@ while test $# -gt 0; do
 	;;
 
     --cflags)
-       	echo -n " -I${includedir} @GMP_CFLAGS@ @NTL_CFLAGS@ @GIVARO_CFLAGS@ @SACLIB_CFLAGS@ @LIDIA_CFLAGS@"
+       	echo -n " -I${includedir} @FFLAS_FFPACK_CFLAGS@ @NTL_CFLAGS@ @SACLIB_CFLAGS@"
+	;;
+
+    --cflags-full)
+       	echo -n " -I${includedir} @CXXFLAGS@"
 	;;
 
     --libs)
-	echo -n " -L${libdir} -llinbox @LIDIA_LIBS@  @NTL_LIBS@ @GIVARO_LIBS@ @SACLIB_LIBS@ @GMP_LIBS@ @BLAS_LIBS@"
+	echo -n " -L${libdir} -llinbox @FFLAS_FFPACK_LIBS@ @NTL_LIBS@ @SACLIB_LIBS@ @IML_LIBS@ @MPFR_LIBS@ @FPLLL_LIBS@ @FPLLL_LIBS@ @OCL_LIBS@"
 	;;
 
     *)
diff --git a/linbox.pc.in b/linbox.pc.in
new file mode 100644
index 0000000..6a95e29
--- /dev/null
+++ b/linbox.pc.in
@@ -0,0 +1,14 @@
+/------------------ linbox.pc ------------------------
+prefix=@prefix@
+exec_prefix=@prefix@/bin
+libdir=@prefix@/lib
+includedir=@prefix@/include
+
+Name: linbox
+Description: Exact Linear Algebra library
+URL: http://linbox-team.github.io/linbox/
+Version: @VERSION@
+Requires: fflas-ffpack >= 2.2.0
+Libs: -L${libdir} -llinbox @LINBOXSAGE_LIBS@ @NTL_LIBS@ @MPFR_LIBS@ @FPLLL_LIBS@ @IML_LIBS@ @FLINT_LIBS@ @OCL_LIBS@
+Cflags: @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR -I${includedir}/linbox @NTL_CFLAGS@ @MPFR_CFLAGS@ @FPLLL_CFLAGS@  @IML_CFLAGS@ @FLINT_CFLAGS@
+\-------------------------------------------------------
diff --git a/linbox/Makefile.am b/linbox/Makefile.am
index 405658c..b8c3d59 100644
--- a/linbox/Makefile.am
+++ b/linbox/Makefile.am
@@ -19,42 +19,34 @@
 # ========LICENCE========
 #/
 
-AM_CPPFLAGS=-I$(top_srcdir)
+AM_CPPFLAGS= -I$(top_srcdir)/linbox $(DEPS_CFLAGS)
+LDADD = $(DEPS_LIBS) $(LDFLAGS)
 
-SUBDIRS=util element field randiter vector matrix blackbox switch algorithms solutions ring
+#AM_CPPFLAGS = -I at includedir@ -I$(top_srcdir)/linbox -I$(top_srcdir) $(DEFCPPFLAGS) $(OPTFLAGS) $(FFLAS_FFPACK_CFLAGS) $(NTL_CFLAGS) $(MPFR_CFLAGS) $(FPLLL_CFLAGS) $(IML_CFLAGS) $(FLINT_CFLAGS) $(PARFLAGS)
+#LDADD = $(FFLAS_FFPACK_LIBS) $(NTL_LIBS) $(MPFR_LIBS) $(FPLLL_LIBS) $(IML_LIBS) $(FLINT_LIBS) $(OCL_LIBS)
 
-BASIC_HDRS =    \
-    integer.h   \
-    config-blas.h   linbox-config.h
+SUBDIRS=util element field randiter vector matrix blackbox algorithms solutions ring
 
-NTL_HDRS =
 
-GIVARO_HDRS =
+BASIC_HDRS =          \
+    linbox-config.h \
+    config.h \
+    config-blas.h     \
+    integer.h         \
+    linbox-tags.h
 
-LIDIA_HDRS =
+NTL_HDRS =
 
 if LINBOX_HAVE_NTL
 USE_NTL_HDRS = $(NTL_HDRS)
 endif
 
-if LINBOX_HAVE_GIVARO
-USE_GIVARO_HDRS = $(GIVARO_HDRS)
-endif
-
-if LINBOX_HAVE_LIDIA
-USE_LIDIA_HDRS = $(LIDIA_HDRS)
-endif
-
 pkginclude_HEADERS =        \
     $(BASIC_HDRS)           \
-    $(USE_NTL_HDRS)         \
-    $(USE_GIVARO_HDRS)      \
-    $(USE_LIDIA_HDRS)
+    $(USE_NTL_HDRS)
 
 EXTRA_DIST =            \
     $(NTL_HDRS)         \
-    $(GIVARO_HDRS)      \
-    $(LIDIA_HDRS)       \
     linbox.doxy         \
     archetypes.doxy
 
@@ -65,4 +57,12 @@ liblinbox_la_SOURCES = dummy.C
 liblinbox_la_LIBADD =           \
     util/libutil.la             \
     randiter/libranditer.la     \
-    algorithms/libalgorithms.la
+    algorithms/libalgorithms.la \
+    $(MPFR_LIBS) $(IML_LIBS) $(OCL_LIBS)
+
+#Cygwin ?
+liblinbox_la_LDFLAGS = $(DEPS_LIBS) $(LDFLAGS) -no-undefined
+
+
+#  $(top_srcdir)/benchmarks/libbenchmarks.la \
+#
diff --git a/linbox/Makefile.in b/linbox/Makefile.in
deleted file mode 100644
index eca8f1d..0000000
--- a/linbox/Makefile.in
+++ /dev/null
@@ -1,825 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# This file is part of LinBox
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-#/
-
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox
-DIST_COMMON = $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"
-LTLIBRARIES = $(lib_LTLIBRARIES)
-liblinbox_la_DEPENDENCIES = util/libutil.la randiter/libranditer.la \
-	algorithms/libalgorithms.la
-am_liblinbox_la_OBJECTS = dummy.lo
-liblinbox_la_OBJECTS = $(am_liblinbox_la_OBJECTS)
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = $(liblinbox_la_SOURCES)
-DIST_SOURCES = $(liblinbox_la_SOURCES)
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-dvi-recursive install-exec-recursive \
-	install-html-recursive install-info-recursive \
-	install-pdf-recursive install-ps-recursive install-recursive \
-	installcheck-recursive installdirs-recursive pdf-recursive \
-	ps-recursive uninstall-recursive
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-HEADERS = $(pkginclude_HEADERS)
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
-  distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
-	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
-	distdir
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-AM_CPPFLAGS = -I$(top_srcdir)
-SUBDIRS = util element field randiter vector matrix blackbox switch algorithms solutions ring
-BASIC_HDRS = \
-    integer.h   \
-    config-blas.h   linbox-config.h
-
-NTL_HDRS = 
-GIVARO_HDRS = 
-LIDIA_HDRS = 
- at LINBOX_HAVE_NTL_TRUE@USE_NTL_HDRS = $(NTL_HDRS)
- at LINBOX_HAVE_GIVARO_TRUE@USE_GIVARO_HDRS = $(GIVARO_HDRS)
- at LINBOX_HAVE_LIDIA_TRUE@USE_LIDIA_HDRS = $(LIDIA_HDRS)
-pkginclude_HEADERS = \
-    $(BASIC_HDRS)           \
-    $(USE_NTL_HDRS)         \
-    $(USE_GIVARO_HDRS)      \
-    $(USE_LIDIA_HDRS)
-
-EXTRA_DIST = \
-    $(NTL_HDRS)         \
-    $(GIVARO_HDRS)      \
-    $(LIDIA_HDRS)       \
-    linbox.doxy         \
-    archetypes.doxy
-
-lib_LTLIBRARIES = liblinbox.la
-liblinbox_la_SOURCES = dummy.C
-liblinbox_la_LIBADD = \
-    util/libutil.la             \
-    randiter/libranditer.la     \
-    algorithms/libalgorithms.la
-
-all: all-recursive
-
-.SUFFIXES:
-.SUFFIXES: .C .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps linbox/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
-	}
-
-uninstall-libLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
-	done
-
-clean-libLTLIBRARIES:
-	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
-	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" != "$$p" || dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-liblinbox.la: $(liblinbox_la_OBJECTS) $(liblinbox_la_DEPENDENCIES) $(EXTRA_liblinbox_la_DEPENDENCIES) 
-	$(CXXLINK) -rpath $(libdir) $(liblinbox_la_OBJECTS) $(liblinbox_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-.C.o:
-	$(CXXCOMPILE) -c -o $@ $<
-
-.C.obj:
-	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.C.lo:
-	$(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgincludeHEADERS: $(pkginclude_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
-	done
-
-uninstall-pkgincludeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir)
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    $(am__make_dryrun) \
-	      || test -d "$(distdir)/$$subdir" \
-	      || $(MKDIR_P) "$(distdir)/$$subdir" \
-	      || exit 1; \
-	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-	    $(am__relativize); \
-	    new_distdir=$$reldir; \
-	    dir1=$$subdir; dir2="$(top_distdir)"; \
-	    $(am__relativize); \
-	    new_top_distdir=$$reldir; \
-	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-	    ($(am__cd) $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$new_top_distdir" \
-	        distdir="$$new_distdir" \
-		am__remove_distdir=: \
-		am__skip_length_check=: \
-		am__skip_mode_fix=: \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(LTLIBRARIES) $(HEADERS)
-installdirs: installdirs-recursive
-installdirs-am:
-	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
-	mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am: install-pkgincludeHEADERS
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am: install-libLTLIBRARIES
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-libLTLIBRARIES uninstall-pkgincludeHEADERS
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
-	install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-	all all-am check check-am clean clean-generic \
-	clean-libLTLIBRARIES clean-libtool ctags ctags-recursive \
-	distclean distclean-compile distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-libLTLIBRARIES install-man install-pdf \
-	install-pdf-am install-pkgincludeHEADERS install-ps \
-	install-ps-am install-strip installcheck installcheck-am \
-	installdirs installdirs-am maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags tags-recursive uninstall uninstall-am \
-	uninstall-libLTLIBRARIES uninstall-pkgincludeHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/algorithms/Makefile.am b/linbox/algorithms/Makefile.am
index b011792..6a7b999 100644
--- a/linbox/algorithms/Makefile.am
+++ b/linbox/algorithms/Makefile.am
@@ -21,121 +21,148 @@
 
 pkgincludesubdir=$(pkgincludedir)/algorithms
 
-SUBDIRS=gauss matrix-blas3
+SUBDIRS=gauss opencl-kernels matrix-blas3 polynomial-matrix
+#  IML
 
 noinst_LTLIBRARIES=libalgorithms.la
 
 libalgorithms_la_SOURCES= diophantine-solver.C
 
-#  AM_CPPFLAGS= $(CBLAS_FLAG) $(GMP_CFLAGS) $(NTL_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS)
-
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR $(CBLAS_FLAG) $(FFLAS_FFPACK_CFLAGS) $(GMP_CFLAGS) $(NTL_CFLAGS) $(ATLAS_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS) $(FPLLL_CFLAGS)
-
-pkgincludesub_HEADERS =         \
-    blackbox-container.h        \
-    blackbox-container-symmetric.h          \
-    blackbox-container-symmetrize.h         \
-    blackbox-container-base.h   \
-    bbsolve.h                   \
-    double-det.h                \
-    det-rational.h              \
-    massey-domain.h             \
-    wiedemann.h wiedemann.inl   \
-    lanczos.h   lanczos.inl     \
-    block-lanczos.h block-lanczos.inl       \
-    mg-block-lanczos.h mg-block-lanczos.inl \
-    la-block-lanczos.h la-block-lanczos.inl \
-    eliminator.h    eliminator.inl          \
-    gauss.h                                 \
-    triangular-solve.h          \
-    gauss-gf2.h                 \
-    triangular-solve-gf2.h      \
-    dense-container.h           \
-    cra-mpi.h                   \
-    cra-kaapi.h                 \
-    cra-domain.h                \
-    cra-domain-seq.h            \
-    cra-domain-omp.h            \
-    cra-early-multip.h          \
-    cra-early-single.h          \
-    cra-full-multip.h           \
-	cra-full-multip-fixed.h     \
-	cra-givrnsfixed.h           \
-    lazy-product.h              \
-    rational-cra.h              \
-    rational-cra2.h             \
-    rational-cra-early-multip.h \
-    rational-cra-early-single.h \
-    rational-cra-full-multip.h  \
-    blas-domain.h               \
-    blas-domain.inl             \
-    blas-domain-multimod.h      \
-    bitonic-sort.h              \
-    blackbox-block-container-base.h         \
-    blackbox-block-container.h  \
-    block-massey-domain.h       \
-    block-wiedemann.h           \
-    default.h                   \
-    signature.h                 \
-    smith-form-iliopoulos.h     \
-    one-invariant-factor.h      \
-    last-invariant-factor.h     \
-    hybrid-det.h                \
-    lifting-container.h         \
-    smith-form-local.h          \
-    smith-form-local2.inl       \
-    matrix-inverse.h            \
-    matrix-hom.h                \
-    matrix-rank.h               \
-    numeric-solver-lapack.h     \
-    rational-solver-sn.h        \
-    rational-solver-sn.inl      \
-    dyadic-to-rational.h        \
-    rational-reconstruction.h   \
-    rational-reconstruction-base.h          \
-    classic-rational-reconstruction.h       \
-    fast-rational-reconstruction.h          \
-    rational-solver.h           \
-    rational-solver2.h          \
-    rational-solver.inl         \
-    diophantine-solver.h        \
-    diophantine-solver.inl      \
-    smith-form-binary.h         \
-    smith-form-adaptive.h       \
-    smith-form-adaptive.inl     \
-    smith-form-sparseelim-local.h           \
-    smith-form-sparseelim-poweroftwo.h      \
-    rational-reconstruction2.h  \
-    rational-solver-adaptive.h  \
-    varprec-cra-early-single.h  \
-    varprec-cra-early-multip.h  \
-    vector-fraction.h           \
-    whisart_trace.h             \
-    cia.h                       \
-    lattice.h lattice.inl      \
-    bbcharpoly.h                \
-    charpoly-rational.h         \
-    minpoly-integer.h           \
-    minpoly-rational.h          \
-    sigma-basis.h               \
-    matpoly-mult.h              \
-    echelon-form.h              \
-    toeplitz-det.h              \
-    dense-nullspace.h dense-nullspace.inl   \
-    linbox-tags.h               \
-    bm-seq.h                    \
-    short-vector.h              \
-    rns.h rns.inl
-
-EXTRA_DIST =                    \
-             algorithms.doxy    \
-             cra.doxy           \
-             wiedemann.doxy     \
-             lanczos.doxy       \
-             sigmabasis.doxy    \
-             elimination.doxy   \
-	     lattice.doxy       \
-             diophantine.doxy   \
-	     gauss.doxy
+#  AM_CPPFLAGS= $(CBLAS_FLAG) $(GMP_CFLAGS) $(NTL_CFLAGS)  
+
+AM_CPPFLAGS = -I$(top_srcdir)/linbox $(DEPS_CFLAGS)
+LDADD = $(DEPS_LIBS) $(LDFLAGS)
+
+#AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR   $(NTL_CFLAGS) $(ATLAS_CFLAGS)  $(FPLLL_CFLAGS) $(OCL_CFLAGS) $(OMPFLAGS)
+
+OCL_HDRS =                                  \
+    opencl-resource-controller.h            \
+    opencl-environ.h
+
+#  if LINBOX_HAVE_OCL // we include them anyway. (for make dist when OCL not available)
+USE_OCL_HDRS = $(OCL_HDRS)
+#  endif
+
+
+
+pkgincludesub_HEADERS =            \
+	blackbox-container.h               \
+	blackbox-container-symmetric.h     \
+	blackbox-container-symmetrize.h    \
+	blackbox-container-base.h          \
+	bbsolve.h                          \
+	coppersmith.h                      \
+	double-det.h                       \
+	det-rational.h                     \
+	massey-domain.h                    \
+	wiedemann.h                        \
+	wiedemann.inl                      \
+	lanczos.h                          \
+	lanczos.inl                        \
+	block-lanczos.h                    \
+	block-lanczos.inl                  \
+	mg-block-lanczos.h                 \
+	mg-block-lanczos.inl               \
+	la-block-lanczos.h                 \
+	la-block-lanczos.inl               \
+	eliminator.h                       \
+	eliminator.inl                     \
+	gauss.h                            \
+	triangular-solve.h                 \
+	gauss-gf2.h                        \
+	triangular-solve-gf2.h             \
+	dense-container.h                  \
+	cra-mpi.h                          \
+	cra-kaapi.h                        \
+	cra-domain.h                       \
+	cra-domain-seq.h                   \
+	cra-domain-omp.h                   \
+	cra-early-multip.h                 \
+	cra-early-single.h                 \
+	cra-full-multip.h                  \
+	cra-full-multip-fixed.h            \
+	cra-givrnsfixed.h                  \
+	lazy-product.h                     \
+	rational-cra.h                     \
+	rational-cra2.h                    \
+	rational-cra-early-multip.h        \
+	rational-cra-early-single.h        \
+	rational-cra-full-multip.h         \
+	bitonic-sort.h                     \
+	blackbox-block-container-base.h    \
+	blackbox-block-container.h         \
+	block-massey-domain.h              \
+	block-wiedemann.h                  \
+	block-coppersmith-domain.h            \
+	default.h                          \
+	signature.h                        \
+	smith-form-iliopoulos.h            \
+	one-invariant-factor.h             \
+	last-invariant-factor.h            \
+	hybrid-det.h                       \
+	lifting-container.h                \
+	smith-form-local.h                 \
+	smith-form-local2.inl              \
+	smith-form-textbook.h              \
+	smith-form-kannan-bachem.h         \
+	matrix-inverse.h                   \
+	matrix-hom.h                       \
+	matrix-rank.h                      \
+	numeric-solver-lapack.h            \
+	rational-solver-sn.h               \
+	rational-solver-sn.inl             \
+	dyadic-to-rational.h               \
+	rational-reconstruction.h          \
+	rational-reconstruction-base.h     \
+	classic-rational-reconstruction.h  \
+	fast-rational-reconstruction.h     \
+	rational-solver.h                  \
+	rational-solver2.h                 \
+	rational-solver.inl                \
+	diophantine-solver.h               \
+	diophantine-solver.inl             \
+	smith-form-binary.h                \
+	smith-form-adaptive.h              \
+	smith-form-adaptive.inl            \
+	smith-form-sparseelim-local.h      \
+	smith-form-sparseelim-poweroftwo.h \
+	rational-reconstruction2.h         \
+	rational-solver-adaptive.h         \
+	varprec-cra-early-single.h         \
+	varprec-cra-early-multip.h         \
+	vector-fraction.h                  \
+	whisart_trace.h                    \
+	cia.h                              \
+	lattice.h                          \
+	lattice.inl                        \
+	bbcharpoly.h                       \
+	charpoly-rational.h                \
+	minpoly-integer.h                  \
+	minpoly-rational.h                 \
+	sigma-basis.h                      \
+	matpoly-mult.h                     \
+	echelon-form.h                     \
+	toeplitz-det.h                     \
+	dense-nullspace.h                  \
+	dense-nullspace.inl                \
+	short-vector.h                     \
+	rns.h                              \
+	rns.inl                            \
+	$(USE_OCL_HDRS)
+
+#  iml.h                              \
+#
+
+EXTRA_DIST =           \
+    algorithms.doxy    \
+    cra.doxy           \
+    iml.doxy           \
+    wiedemann.doxy     \
+    lanczos.doxy       \
+    sigmabasis.doxy    \
+    elimination.doxy   \
+    lattice.doxy       \
+    diophantine.doxy   \
+    gauss.doxy
 
 
diff --git a/linbox/algorithms/Makefile.in b/linbox/algorithms/Makefile.in
deleted file mode 100644
index f79170b..0000000
--- a/linbox/algorithms/Makefile.in
+++ /dev/null
@@ -1,880 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/algorithms
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-LTLIBRARIES = $(noinst_LTLIBRARIES)
-libalgorithms_la_LIBADD =
-am_libalgorithms_la_OBJECTS = diophantine-solver.lo
-libalgorithms_la_OBJECTS = $(am_libalgorithms_la_OBJECTS)
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = $(libalgorithms_la_SOURCES)
-DIST_SOURCES = $(libalgorithms_la_SOURCES)
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-dvi-recursive install-exec-recursive \
-	install-html-recursive install-info-recursive \
-	install-pdf-recursive install-ps-recursive install-recursive \
-	installcheck-recursive installdirs-recursive pdf-recursive \
-	ps-recursive uninstall-recursive
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
-  distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
-	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
-	distdir
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/algorithms
-SUBDIRS = gauss matrix-blas3
-noinst_LTLIBRARIES = libalgorithms.la
-libalgorithms_la_SOURCES = diophantine-solver.C
-
-#  AM_CPPFLAGS= $(CBLAS_FLAG) $(GMP_CFLAGS) $(NTL_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS)
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR $(CBLAS_FLAG) $(FFLAS_FFPACK_CFLAGS) $(GMP_CFLAGS) $(NTL_CFLAGS) $(ATLAS_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS) $(FPLLL_CFLAGS)
-pkgincludesub_HEADERS = \
-    blackbox-container.h        \
-    blackbox-container-symmetric.h          \
-    blackbox-container-symmetrize.h         \
-    blackbox-container-base.h   \
-    bbsolve.h                   \
-    double-det.h                \
-    det-rational.h              \
-    massey-domain.h             \
-    wiedemann.h wiedemann.inl   \
-    lanczos.h   lanczos.inl     \
-    block-lanczos.h block-lanczos.inl       \
-    mg-block-lanczos.h mg-block-lanczos.inl \
-    la-block-lanczos.h la-block-lanczos.inl \
-    eliminator.h    eliminator.inl          \
-    gauss.h                                 \
-    triangular-solve.h          \
-    gauss-gf2.h                 \
-    triangular-solve-gf2.h      \
-    dense-container.h           \
-    cra-mpi.h                   \
-    cra-kaapi.h                 \
-    cra-domain.h                \
-    cra-domain-seq.h            \
-    cra-domain-omp.h            \
-    cra-early-multip.h          \
-    cra-early-single.h          \
-    cra-full-multip.h           \
-	cra-full-multip-fixed.h     \
-	cra-givrnsfixed.h           \
-    lazy-product.h              \
-    rational-cra.h              \
-    rational-cra2.h             \
-    rational-cra-early-multip.h \
-    rational-cra-early-single.h \
-    rational-cra-full-multip.h  \
-    blas-domain.h               \
-    blas-domain.inl             \
-    blas-domain-multimod.h      \
-    bitonic-sort.h              \
-    blackbox-block-container-base.h         \
-    blackbox-block-container.h  \
-    block-massey-domain.h       \
-    block-wiedemann.h           \
-    default.h                   \
-    signature.h                 \
-    smith-form-iliopoulos.h     \
-    one-invariant-factor.h      \
-    last-invariant-factor.h     \
-    hybrid-det.h                \
-    lifting-container.h         \
-    smith-form-local.h          \
-    smith-form-local2.inl       \
-    matrix-inverse.h            \
-    matrix-hom.h                \
-    matrix-rank.h               \
-    numeric-solver-lapack.h     \
-    rational-solver-sn.h        \
-    rational-solver-sn.inl      \
-    dyadic-to-rational.h        \
-    rational-reconstruction.h   \
-    rational-reconstruction-base.h          \
-    classic-rational-reconstruction.h       \
-    fast-rational-reconstruction.h          \
-    rational-solver.h           \
-    rational-solver2.h          \
-    rational-solver.inl         \
-    diophantine-solver.h        \
-    diophantine-solver.inl      \
-    smith-form-binary.h         \
-    smith-form-adaptive.h       \
-    smith-form-adaptive.inl     \
-    smith-form-sparseelim-local.h           \
-    smith-form-sparseelim-poweroftwo.h      \
-    rational-reconstruction2.h  \
-    rational-solver-adaptive.h  \
-    varprec-cra-early-single.h  \
-    varprec-cra-early-multip.h  \
-    vector-fraction.h           \
-    whisart_trace.h             \
-    cia.h                       \
-    lattice.h lattice.inl      \
-    bbcharpoly.h                \
-    charpoly-rational.h         \
-    minpoly-integer.h           \
-    minpoly-rational.h          \
-    sigma-basis.h               \
-    matpoly-mult.h              \
-    echelon-form.h              \
-    toeplitz-det.h              \
-    dense-nullspace.h dense-nullspace.inl   \
-    linbox-tags.h               \
-    bm-seq.h                    \
-    short-vector.h              \
-    rns.h rns.inl
-
-EXTRA_DIST = \
-             algorithms.doxy    \
-             cra.doxy           \
-             wiedemann.doxy     \
-             lanczos.doxy       \
-             sigmabasis.doxy    \
-             elimination.doxy   \
-	     lattice.doxy       \
-             diophantine.doxy   \
-	     gauss.doxy
-
-all: all-recursive
-
-.SUFFIXES:
-.SUFFIXES: .C .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/algorithms/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps linbox/algorithms/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-clean-noinstLTLIBRARIES:
-	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
-	@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" != "$$p" || dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-libalgorithms.la: $(libalgorithms_la_OBJECTS) $(libalgorithms_la_DEPENDENCIES) $(EXTRA_libalgorithms_la_DEPENDENCIES) 
-	$(CXXLINK)  $(libalgorithms_la_OBJECTS) $(libalgorithms_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-.C.o:
-	$(CXXCOMPILE) -c -o $@ $<
-
-.C.obj:
-	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.C.lo:
-	$(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
-	done
-
-uninstall-pkgincludesubHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    $(am__make_dryrun) \
-	      || test -d "$(distdir)/$$subdir" \
-	      || $(MKDIR_P) "$(distdir)/$$subdir" \
-	      || exit 1; \
-	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-	    $(am__relativize); \
-	    new_distdir=$$reldir; \
-	    dir1=$$subdir; dir2="$(top_distdir)"; \
-	    $(am__relativize); \
-	    new_top_distdir=$$reldir; \
-	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-	    ($(am__cd) $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$new_top_distdir" \
-	        distdir="$$new_distdir" \
-		am__remove_distdir=: \
-		am__skip_length_check=: \
-		am__skip_mode_fix=: \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(LTLIBRARIES) $(HEADERS)
-installdirs: installdirs-recursive
-installdirs-am:
-	for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
-	mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
-	install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-	all all-am check check-am clean clean-generic clean-libtool \
-	clean-noinstLTLIBRARIES ctags ctags-recursive distclean \
-	distclean-compile distclean-generic distclean-libtool \
-	distclean-tags distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-pdf install-pdf-am install-pkgincludesubHEADERS \
-	install-ps install-ps-am install-strip installcheck \
-	installcheck-am installdirs installdirs-am maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags tags-recursive uninstall uninstall-am \
-	uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/algorithms/alt-blackbox-block-container.h b/linbox/algorithms/alt-blackbox-block-container.h
new file mode 100644
index 0000000..210e5cb
--- /dev/null
+++ b/linbox/algorithms/alt-blackbox-block-container.h
@@ -0,0 +1,104 @@
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+
+#ifndef __LINBOX_alt_blackbox_block_container_H
+#define __LINBOX_alt_blackbox_block_container_H
+
+namespace LinBox {
+
+template <class Field,class Blackbox,class Value>
+class AltBlackboxBlockContainer {
+public:
+
+	typedef typename MatrixDomain<Field>::OwnMatrix Block;
+
+	AltBlackboxBlockContainer () {}
+
+	/*
+	AltBlackboxBlockContainer(const Blackbox *M,
+	                       const Field &F,
+	                       const Block &V)
+		: U_(F,V.coldim(),M->rowdim()), V_(V),
+		  M_(M), F_(F), b_(V.coldim())
+	{
+
+	}
+	*/
+
+	AltBlackboxBlockContainer(const Blackbox *M,
+	                       const Field &F,
+	                       const Block &U,
+	                       const Block &V)
+		: b_(V.coldim()), F_(&F),
+		  U_(U), V_(V),
+		  LastOdd_(F,V.rowdim(),V.coldim()),
+		  LastEven_(F,V.rowdim(),V.coldim()),
+		  val_(F,V.coldim(),V.coldim()),
+		  M_(M), MD_(F) {}
+
+	class const_iterator {
+	protected:
+		AltBlackboxBlockContainer &c_;
+	public:
+		const_iterator () {}
+		const_iterator(AltBlackboxBlockContainer<Field,Blackbox,Value> &c) :
+			c_(c) {}
+
+		const_iterator& operator++() {c_.incr(); return *this;}
+		const Value& operator*() {return c_.getValue();}
+	};
+
+	const_iterator begin() {
+		LastOdd_=V_;
+		LastEven_=V_;
+		isOdd_=true;
+		return const_iterator(*this);
+	}
+
+	void incr() {
+		Block result(*(const_cast<Field*>(F_)),b_,b_);
+		if (isOdd_) {
+			M_->applyLeft(LastEven_,LastOdd_);
+			MD_.mul(result,U_,LastEven_);
+		} else {
+			M_->applyLeft(LastOdd_,LastEven_);
+			MD_.mul(result,U_,LastOdd_);
+		}
+		isOdd_=!isOdd_;
+		for (size_t i=0;i<b_;++i) {
+			for (size_t j=0;j<b_;++j) {
+				typename Field::Element d;
+				result.getEntry(d,i,j);
+				val_.setEntry(i,j,d);
+			}
+		}
+	}
+
+	const Value& getValue() const {
+		return val_;
+	}
+
+	size_t rowdim() const {return b_;}
+	size_t coldim() const {return b_;}
+
+	const Blackbox* getBB() const {return M_;}
+
+protected:
+
+	size_t b_;
+
+	const Field *F_;
+
+	Block U_, V_, LastOdd_, LastEven_;
+
+	Value val_;
+
+	bool isOdd_;
+
+	const Blackbox *M_;
+
+	MatrixDomain<Field> MD_;
+};
+
+}
+
+#endif
diff --git a/linbox/algorithms/bbcharpoly.h b/linbox/algorithms/bbcharpoly.h
index 866ac1a..3458efd 100644
--- a/linbox/algorithms/bbcharpoly.h
+++ b/linbox/algorithms/bbcharpoly.h
@@ -34,13 +34,13 @@
 #define __LINBOX_bbcharpoly_H
 
 #define _LB_MAXITER 5
-#include <vector>
-#include <map>
+
+#include <givaro/givpoly1.h>
+
 
 #include "linbox/blackbox/scalar-matrix.h"
 #include "linbox/blackbox/sum.h"
-#include "linbox/ring/givaro-polynomial.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 #include "linbox/field/field-traits.h"
 #include "linbox/solutions/det.h"
 #include "linbox/solutions/rank.h"
@@ -49,6 +49,9 @@
 #include "linbox/algorithms/matrix-hom.h"
 #include "linbox/blackbox/polynomial.h"
 
+#include <vector>
+#include <map>
+
 namespace LinBox
 {
 
@@ -68,7 +71,8 @@ namespace LinBox
 		class FactorMult {
 		public:
 			FactorMult() :
-				multiplicity(0),dep(NULL)
+				fieldP(NULL),intP(NULL)
+				,multiplicity(0),dep(NULL)
 			{}
 			FactorMult( FieldPoly* FP, IntPoly* IP, unsigned long m, FactorMult<FieldPoly,IntPoly>*d) :
 				fieldP(FP), intP(IP), multiplicity(m), dep(d)
@@ -92,7 +96,7 @@ namespace LinBox
 						--i;
 					}
 					tmp = tmp/k + (int)(multiplicity - dep->multiplicity) / d;
-					dep->multiplicity = tmp ;
+					dep->multiplicity =(size_t) tmp ;
 					//std::cerr<<"Updating "<<*dep->fieldP<<" --> mul = "<<tmp<<std::endl;
 
 					*goal -= tmp * ((int)dep->fieldP->size()-1);
@@ -102,7 +106,7 @@ namespace LinBox
 					int tmp =  (int)((n - 2 * dep->multiplicity + multiplicity) / (dep->fieldP->size()-1));
 					*goal -= tmp * ((int)dep->fieldP->size()-1);
 					//std::cerr<<"Updating (leaf)"<<*dep->fieldP<<" --> mul = "<<tmp<<std::endl;
-					dep->multiplicity = tmp;
+					dep->multiplicity = (size_t)tmp;
 					return 1;
 				}
 			}
@@ -140,9 +144,9 @@ namespace LinBox
 		/** Algorithm computing the integer characteristic polynomial
 		 * of a blackbox.
 		 */
-		template < class BlackBox >
-		static typename GivPolynomialRing<typename BlackBox::Field>::Element&
-		blackboxcharpoly (typename GivPolynomialRing<typename BlackBox::Field>::Element & P,
+		template < class BlackBox, class Polynomial >
+		static Polynomial&
+		blackboxcharpoly (Polynomial& P,
 				  const BlackBox                   & A,
 				  const RingCategories::IntegerTag & tag,
 				  const Method::Blackbox           & M)
@@ -150,11 +154,11 @@ namespace LinBox
 			commentator().start ("Integer BlackBox Charpoly ", "IbbCharpoly");
 
 			typename BlackBox::Field intRing = A.field();
-			typedef Modular<uint32_t> Field;
+			typedef Givaro::Modular<uint32_t> Field;
 			typedef typename BlackBox::template rebind<Field>::other FieldBlackBox;
-			typedef GivPolynomialRing<typename BlackBox::Field, Givaro::Dense> IntPolyDom;
+			typedef Givaro::Poly1FactorDom<typename BlackBox::Field, Givaro::Dense> IntPolyDom;
 			typedef typename IntPolyDom::Element IntPoly;
-			typedef GivPolynomialRing<Field>::Element FieldPoly;
+			typedef Givaro::Poly1FactorDom<Field,Givaro::Dense>::Element FieldPoly;
 			// Set of factors-multiplicities sorted by degree
 			typedef FactorMult<FieldPoly,IntPoly> FM;
 			typedef std::multimap<unsigned long,FM*> FactPoly;
@@ -167,16 +171,16 @@ namespace LinBox
 			IntPolyDom IPD(intRing);
 
 			/* Computation of the integer minimal polynomial */
-			IntPoly intMinPoly;
+			Polynomial intMinPoly(A.field());
 			minpoly (intMinPoly, A, M);
 			if (intMinPoly.size() == n+1){
 				commentator().stop ("done", NULL, "IbbCharpoly");
 				return P = intMinPoly;
 			}
 			/* Factorization over the integers */
-			std::vector<IntPoly*> intFactors;
-			std::vector<unsigned long> exp;
-			IPD.factor (intFactors, exp, intMinPoly);
+			std::vector<IntPoly> intFactors;
+			std::vector<uint64_t> exp;
+			IPD.factor (intFactors, exp, IntPoly(intMinPoly.getRep().begin(),intMinPoly.getRep().end()));
 			size_t factnum = intFactors.size();
 
 			/* Choose a modular prime field */
@@ -188,10 +192,10 @@ namespace LinBox
 			int goal =(int) n;
 
 			for (size_t i = 0; i < intFactors.size(); ++i) {
-				unsigned long deg =  (intFactors[i]->size()-1);
+				uint64_t deg =  (intFactors[i].size()-1);
 				FactorMult<FieldPoly,IntPoly>* FFM=NULL;
 				if (exp[i] > 1) {
-					IntPoly *tmp = new IntPoly(*intFactors[i]);
+					IntPoly *tmp = new IntPoly(intFactors[i]);
 					FM* depend = NULL;
 					for (size_t j = 1; j <= exp[i]; ++j){
 						IntPoly * tmp2 = new IntPoly(*tmp);
@@ -202,21 +206,21 @@ namespace LinBox
 						factCharPoly.insert (std::pair<size_t, FM*> (deg, FFM));
 						++factnum;
 						depend = FFM;
-						deg += intFactors[i]->size()-1;
+						deg += intFactors[i].size()-1;
 						if (j < exp[i])
-							IPD.mul (*tmp, *tmp2, *intFactors[i]);
+							IPD.mul (*tmp, *tmp2, intFactors[i]);
 					}
 					delete tmp;
 					--factnum;
 					FFM->multiplicity = 1; // The last factor is present in minpoly
-					goal -= (int)deg-(int)intFactors[i]->size()+1;
+					goal -= (int)deg-(int)intFactors[i].size()+1;
 					leadingBlocks.insert (std::pair<FM*,bool>(FFM,false));
 				}
 				else {
-					FieldPoly* fp=new FieldPoly(intFactors[i]->size());
-					typename IntPoly::template rebind<Field>() (*fp, *(intFactors[i]), F);
-					FFM = new FM (fp,intFactors[i],1,NULL);
-					factCharPoly.insert (std::pair<size_t, FM* > (intFactors[i]->size()-1, FFM));
+					FieldPoly* fp=new FieldPoly(intFactors[i].size());
+					typename IntPoly::template rebind<Field>() (*fp, (intFactors[i]), F);
+					FFM = new FM (fp,&intFactors[i],1,NULL);
+					factCharPoly.insert (std::pair<size_t, FM* > (intFactors[i].size()-1, FFM));
 					leadingBlocks.insert (std::pair<FM*,bool>(FFM,false));
 					goal -= (int)deg;
 				}
@@ -229,9 +233,9 @@ namespace LinBox
 			// Building the integer charpoly
 			IntPoly intCharPoly (n+1);
 			IntPoly tmpP;
-			intRing.init (intCharPoly[0], 1);
+			intRing.assign(intCharPoly[0], intRing.one);
 			for (FactPolyIterator it_f = factCharPoly.begin(); it_f != factCharPoly.end(); ++it_f){
-				IPD.pow (tmpP, *it_f->second->intP, it_f->second->multiplicity);
+				IPD.pow (tmpP, *it_f->second->intP, (long) it_f->second->multiplicity);
 				IPD.mulin (intCharPoly, tmpP);
 				delete it_f->second->intP;
 				delete it_f->second->fieldP;
@@ -239,27 +243,27 @@ namespace LinBox
 			}
 			commentator().stop ("done", NULL, "IbbCharpoly");
 
-			return P = intCharPoly;
+			return P = Polynomial(A.field(), typename Polynomial::Rep(intCharPoly.begin(),intCharPoly.end()));
 		}
 
 		/** Algorithm computing the  characteristic polynomial
 		 * of a blackbox over a prime field.
 		 */
-		template < class BlackBox >
-		static typename GivPolynomialRing<typename BlackBox::Field>::Element&
-		blackboxcharpoly (typename GivPolynomialRing<typename BlackBox::Field>::Element & P,
+		template < class BlackBox, class Polynomial >
+		static Polynomial&
+		blackboxcharpoly (Polynomial & P,
 				  const BlackBox                                                & A,
 				  const RingCategories::ModularTag                              & tag,
 				  const Method::Blackbox                                        & M)
 		{
-			commentator().start ("Modular BlackBox Charpoly ", "MbbCharpoly");
+			commentator().start ("Givaro::Modular BlackBox Charpoly ", "MbbCharpoly");
 			typedef typename BlackBox::Field Field;
-			typedef GivPolynomialRing<Field, Givaro::Dense> PolyDom;
-			typedef typename PolyDom::Element Polynomial;
+			typedef Givaro::Poly1FactorDom<Field, Givaro::Dense> PolyDom;
+			typedef typename PolyDom::Element FieldPoly;
 			// Set of factors-multiplicities sorted by degree
-			typedef std::multimap<unsigned long,FactorMult<Polynomial>* > FactPoly;
+			typedef std::multimap<unsigned long,FactorMult<FieldPoly>* > FactPoly;
 			typedef typename FactPoly::iterator FactPolyIterator;
-			std::multimap<FactorMult<Polynomial>*,bool> leadingBlocks;
+			std::multimap<FactorMult<FieldPoly>*,bool> leadingBlocks;
 			//typename std::multimap<FactorMult<Polynomial>*,bool>::iterator lead_it;
 
 			Field F = A.field();
@@ -277,58 +281,57 @@ namespace LinBox
 			}
 
 
-			Polynomial charPoly (n+1);
+			FieldPoly charPoly (n+1);
 
 			{	/* Factorization over the field */
-				std::vector<Polynomial*> factors;
-				std::vector<unsigned long> exp;
+				std::vector<FieldPoly> factors;
+				std::vector<uint64_t> exp;
 
-				PD.factor (factors, exp, minPoly);
+				PD.factor (factors, exp, FieldPoly(minPoly.getRep().begin(),minPoly.getRep().end()));
 				size_t factnum = factors.size();
 
 				/* Building the structure of factors */
 				int goal = (int)n;
 
 				for (size_t i = 0; i < factors.size(); ++i) {
-					unsigned long deg =  (factors[i]->size()-1);
-					FactorMult<Polynomial>* FFM=NULL;
+					uint64_t deg =  (factors[i].size()-1);
+					FactorMult<FieldPoly>* FFM=NULL;
 					if (exp[i] > 1) {
-						Polynomial* tmp = new Polynomial(*factors[i]);
-						FactorMult<Polynomial>* depend = NULL;
+                                            FieldPoly* tmp = new FieldPoly(factors[i]);
+						FactorMult<FieldPoly>* depend = NULL;
 						for (size_t j = 1; j <= exp[i]; ++j){
-							Polynomial * tmp2 = new Polynomial(*tmp);
-							FFM = new FactorMult<Polynomial> (tmp2, tmp2, 0, depend);
+							FieldPoly* tmp2 = new FieldPoly(*tmp);
+							FFM = new FactorMult<FieldPoly> (tmp2, tmp2, 0, depend);
 							//	std::cerr<<"Inserting new factor (exp>1): "<<(*tmp2)<<std::endl;
 
-							factCharPoly.insert (std::pair<size_t, FactorMult<Polynomial>* > (deg, FFM));
+							factCharPoly.insert (std::pair<size_t, FactorMult<FieldPoly>* > (deg, FFM));
 							++factnum;
 							depend = FFM;
-							deg += factors[i]->size()-1;
+							deg += factors[i].size()-1;
 							if (j < exp[i])
-								PD.mul (*tmp, *tmp2, *factors[i]);
+								PD.mul (*tmp, *tmp2, factors[i]);
 						}
 						delete tmp;
 						--factnum;
 						FFM->multiplicity = 1; // The last factor is present in minpoly
-						goal -= (int)(deg-factors[i]->size())+1;
-						leadingBlocks.insert (std::pair<FactorMult<Polynomial>*,bool>(FFM,false));
-						delete factors[i] ;
+						goal -= (int)(deg-factors[i].size())+1;
+						leadingBlocks.insert (std::pair<FactorMult<FieldPoly>*,bool>(FFM,false));
 					}
 					else {
-						FFM = new FactorMult<Polynomial> (factors[i],factors[i],1,NULL);
+						FFM = new FactorMult<FieldPoly> (&factors[i],&factors[i],1U,NULL);
 						//std::cerr<<"Inserting new factor : "<<*factors[i]<<std::endl;
-						factCharPoly.insert (std::pair<size_t, FactorMult<Polynomial>* > (factors[i]->size()-1, FFM));
-						leadingBlocks.insert (std::pair<FactorMult<Polynomial>*,bool>(FFM,false));
+						factCharPoly.insert (std::pair<size_t, FactorMult<FieldPoly>* > (factors[i].size()-1, FFM));
+						leadingBlocks.insert (std::pair<FactorMult<FieldPoly>*,bool>(FFM,false));
 						goal -= (int)deg;
 					}
 				}
 				findMultiplicities ( A, factCharPoly, leadingBlocks, goal, M);
 
 				// Building the product
-				Polynomial tmpP;
-				F.init (charPoly[0], 1);
+				FieldPoly tmpP;
+				F.assign(charPoly[0], F.one);
 				for (FactPolyIterator it_f = factCharPoly.begin(); it_f != factCharPoly.end(); ++it_f){
-					PD.pow (tmpP, *it_f->second->fieldP, it_f->second->multiplicity);
+					PD.pow (tmpP, *it_f->second->fieldP,(long) it_f->second->multiplicity);
 					PD.mulin (charPoly, tmpP);
 					delete it_f->second->fieldP;
 					delete it_f->second;
@@ -338,7 +341,7 @@ namespace LinBox
 
 			commentator().stop ("done", NULL, "MbbCharpoly");
 
-			return P = charPoly;
+			return P = Polynomial(A.field(), typename Polynomial::Rep(charPoly.begin(),charPoly.end()));
 		}
 
 
@@ -352,7 +355,7 @@ namespace LinBox
 				sols.push_back( ufv);
 			}
 			else if ( goal > 0 ){
-				for (size_t i=i0; i<ufv.size(); ++i){
+				for (size_t i=(size_t)i0; i<ufv.size(); ++i){
 					ufv[i].multiplicity++;
 					trials( sols, goal - (int)ufv[i].fieldP->size()+1, ufv, (int)i );
 					ufv[i].multiplicity--;
@@ -369,7 +372,7 @@ namespace LinBox
 		{
 			typedef std::multimap<unsigned long, FactorMult<FieldPoly,IntPoly>* > FactPoly;
 			typedef typename BlackBox::Field Field;
-			typedef GivPolynomialRing<Field, Givaro::Dense> PolyDom;
+			typedef Givaro::Poly1FactorDom<Field, Givaro::Dense> PolyDom;
 			typename FactPoly::iterator itf = factCharPoly.begin();
 			typename std::multimap<FactorMult<FieldPoly,IntPoly>*,bool>::iterator lead_it;
 			Field F = A.field();
@@ -393,7 +396,7 @@ namespace LinBox
 					PolynomialBB<BlackBox, FieldPoly > PA (A, *itf->second->fieldP);
 					rank (r, PA,  M) ;
 				}
-				itf->second->multiplicity = r;
+				itf->second->multiplicity =(size_t) r;
 
 				//std::cerr<<"Rank 1 : "<<*itf->second->fieldP<<" --> "<<r<<std::endl;
 				--factnum;
@@ -411,7 +414,7 @@ namespace LinBox
 				long unsigned int r;
 				rank (r, PA,  M);
 
-				itf->second->multiplicity =r;
+				itf->second->multiplicity =(size_t)r;
 				//std::cerr<<"Rank > 1 : "<<*itf->second->intP<<" --> "<<r<<std::endl;
 
 				--factnum;
@@ -441,9 +444,9 @@ namespace LinBox
 						//std::cerr<<"extra factor : "<<*currFFM->fieldP<<" --> "<<r<<std::endl;
 
 						int tmp = (int)currFFM->multiplicity;
-						currFFM->multiplicity = r;
+						currFFM->multiplicity =(size_t) r;
 						currFFM->update (n,&goal);
-						currFFM->multiplicity = tmp;
+						currFFM->multiplicity = (size_t)tmp;
 					}
 				}
 				else {
@@ -463,10 +466,10 @@ namespace LinBox
 						goal -= (lbm-1)*((int)lead_it->first->fieldP->size()-1);
 					}
 					else {
-						lbm = (int)((n-lead_it->first->multiplicity) / ((int)lead_it->first->fieldP->size()-1));
+						lbm = (int)((int)(n-lead_it->first->multiplicity) / ((int)(lead_it->first->fieldP->size())-1));
 						goal -=  (lbm-1)*((int)lead_it->first->fieldP->size()-1);
 					}
-					lead_it->first->multiplicity = lbm;
+					lead_it->first->multiplicity = (size_t)lbm;
 				}
 			}
 
@@ -492,7 +495,7 @@ namespace LinBox
 
 					//Building the matrix A + gamma.Id mod p
 					F.neg( mgamma, gamma );
-					ScalarMatrix<Field> gammaId( F, n, gamma );
+					ScalarMatrix<Field> gammaId( F, n, n, gamma );
 					Sum<BlackBox,ScalarMatrix<Field> > Agamma(A, gammaId);
 
 					// Compute det (A+gamma.Id)
@@ -502,7 +505,7 @@ namespace LinBox
 
 					// Compute Prod(Pi(-gamma)^mi)
 					typename Field::Element tmp, e;
-					F.init (d2,1);
+					F.assign(d2,F.one);
 					typename FactPoly::iterator it_f=factCharPoly.begin();
 					PolyDom PD_f (F);
 					for (size_t i = 0; i < factCharPoly.size()-factnum; ++i, ++it_f){
@@ -511,7 +514,7 @@ namespace LinBox
 							F.mulin (d2, tmp);
 					}
 					while ( uf_it != sols.end() ){
-						F.init (e,1);
+						F.assign (e,F.one);
 						for (size_t i = 0; i < uf_it->size(); ++i){
 							PD_f.eval( tmp, *(*uf_it)[i].fieldP, mgamma );
 							for (size_t  j=0; j < (*uf_it)[i].multiplicity; ++j)
@@ -540,11 +543,10 @@ namespace LinBox
 #endif // __BBCHARPOLY_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/bbsolve.h b/linbox/algorithms/bbsolve.h
index a50ddc0..d6e2842 100644
--- a/linbox/algorithms/bbsolve.h
+++ b/linbox/algorithms/bbsolve.h
@@ -4,20 +4,20 @@
  * written
  *  by Bradford Hovinen <hovinen at cis.udel.edu>
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -28,7 +28,6 @@
 #ifndef __LINBOX_bbsolve_H
 #define __LINBOX_bbsolve_H
 
-#include <vector>
 #include <algorithm>
 
 // must fix this list...
@@ -112,7 +111,7 @@ namespace LinBox
 		       const Field                     &F,
 		       const WiedemannTraits &traits = WiedemannTraits ())
 	{
-		Vector u;
+		Vector u(A.field());
 		WiedemannSolver<Field> solver (F, traits);
 
 		VectorWrapper::ensureDim (u, A.rowdim ());
@@ -297,11 +296,10 @@ namespace LinBox
 #endif // __LINBOX_bbsolve_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/blackbox-block-container-base.h b/linbox/algorithms/blackbox-block-container-base.h
index 5f0fa25..a2c0aa8 100644
--- a/linbox/algorithms/blackbox-block-container-base.h
+++ b/linbox/algorithms/blackbox-block-container-base.h
@@ -35,16 +35,61 @@
 
 #include <time.h> // for seeding
 
+#ifdef _OPENMP
+#include <omp.h>
+#endif
+
 #include "linbox/linbox-config.h"
 #include "linbox/util/debug.h"
 #include "linbox/blackbox/archetype.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
 #include "linbox/vector/vector-domain.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/matrix/matrix-domain.h"
+
+// #include "linbox/blackbox/triplesbb-omp.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/blackbox/pascal.h"
 
 namespace LinBox
 {
 
+//Temporary fix to deal with the fact that not all Blackboxes have applyLeft()
+template<class Field,class Block>
+class MulHelper {
+public:
+	template<class Blackbox>
+	static void mul(const Field& F,
+			Block &M1, const Blackbox &M2, const Block& M3) {
+		linbox_check( M1.rowdim() == M2.rowdim());
+		linbox_check( M2.coldim() == M3.rowdim());
+		linbox_check( M1.coldim() == M3.coldim());
+
+		MatrixDomain<Field> MD(F);
+		typename Block::ColIterator        p1 = M1.colBegin();
+		typename Block::ConstColIterator   p3 = M3.colBegin();
+
+		for (; p3 != M3.colEnd(); ++p1,++p3) {
+			M2.apply(*p1,*p3);
+		}
+	}
+
+	static void mul (const Field& F,
+			 Block &M1, const SparseMatrix<Field,SparseMatrixFormat::TPL> &M2, const Block& M3) {
+		M2.applyLeft(M1,M3);
+	}
+
+	static void mul (const Field& F,
+			 Block &M1, const SparseMatrix<Field,SparseMatrixFormat::TPL_omp> &M2, const Block& M3) {
+		M2.applyLeft(M1,M3);
+	}
+
+	static void mul (const Field& F,
+	                 Block &M1, const PascalBlackbox<Field> &M2, const Block& M3) {
+		M2.applyLeft(M1,M3);
+	}
+};
+
 #ifndef MIN
 #define MIN(a,b) ((a)<(b)?(a):(b))
 #endif
@@ -75,9 +120,10 @@ namespace LinBox
 		// Sequence constructor from a blackbox and a field
 		// cs set the size of the sequence
 		BlackboxBlockContainerBase (const Blackbox *BD, const Field &F, size_t m, size_t n, size_t seed=(size_t)time(NULL)) :
-			_field(F)  , _BB(BD), _size(BD->rowdim()/m + BD->coldim()/n +2)
-			, _nn(BD->rowdim()),  _m(m), _n(n),
-			_blockU(F,_m,_nn),_blockV(F,_nn,_n),_value(_field,m,n), _seed(seed)
+			_field(&F)  , _BB(BD), _size(BD->rowdim()/m + BD->coldim()/n +2)
+			, _nn(BD->rowdim()),  _m(m), _n(n)
+			,casenumber(0)
+			,_blockU(F,_m,_nn),_blockV(F,_nn,_n),_value(field(),m,n), _seed(seed)
 		{}
 
 
@@ -111,7 +157,8 @@ namespace LinBox
 		size_t size() const            { return _size; }
 
 		// field of the sequence
-		const Field &getField () const { return _field; }
+		const Field &field () const { return *_field; }
+		const Field &getField () const { return *_field; } // deprecated
 
 		// blackbox of the sequence
 		const Blackbox *getBB () const { return _BB; }
@@ -140,7 +187,7 @@ namespace LinBox
 		/// Members
 		//--------------
 
-		Field                        _field;
+		const Field                        *_field;
 		const Blackbox             *_BB;
 		size_t                    _size; // length of sequence
 		size_t			     _nn; // _BB order (square mat)
@@ -161,21 +208,12 @@ namespace LinBox
 		/// Initializers
 		//--------------
 
+
 		// Blackbox multiplication using apply function
-		void Mul(Block &M1, const Blackbox &M2 , const Block& M3)
+		inline void Mul(Block &M1, const Blackbox &M2 , const Block& M3)
 		{
-			linbox_check( M1.rowdim() == M2.rowdim());
-			linbox_check( M2.coldim() == M3.rowdim());
-			linbox_check( M1.coldim() == M3.coldim());
-
-			typename Block::ColIterator        p1 = M1.colBegin();
-			typename Block::ConstColIterator   p3 = M3.colBegin();
-
-			for (; p3 != M3.colEnd(); ++p1,++p3) {
-				M2.apply(*p1,*p3);
-			}
-		}
-
+                        MulHelper<Field,Block>::mul(field(),M1,M2,M3);
+                }
 
 		/// User Left and Right blocks
 		void init (const Block& U, const Block& V)
@@ -188,8 +226,8 @@ namespace LinBox
 			casenumber = 1;
 			_blockU = U;
 			_blockV = V;
-			_value = Value(_field,_m,_n);
-			BlasMatrixDomain<Field> BMD(_field);
+			_value = Value(*_field,_m,_n);
+			BlasMatrixDomain<Field> BMD(*_field);
 			BMD.mul(_value, _blockU, _blockV);
 		}
 
@@ -198,7 +236,7 @@ namespace LinBox
 		{
 			casenumber = 1;
 
-			typename Field::RandIter G(_field,0,_seed);
+			typename Field::RandIter G(*_field,0,_seed);
 			Block U (m, _BB->rowdim());
 			_blockU =U;
 			Block V(_BB->coldim(), n);
@@ -212,8 +250,8 @@ namespace LinBox
 			for (; iter_V != _blockV.End();++iter_V)
 				G.random(*iter_V);
 
-			_value = Value(_field,m,n);
-			BlasMatrixDomain<Field> BMD(_field);
+			_value = Value(*_field,m,n);
+			BlasMatrixDomain<Field> BMD(*_field);
 			BMD.mul(_value, _blockU, _blockV);
 		}
 	};
@@ -223,11 +261,10 @@ namespace LinBox
 #endif // __LINBOX_blackbox_block_container_base_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/blackbox-block-container.h b/linbox/algorithms/blackbox-block-container.h
index 6a785ce..e21f748 100644
--- a/linbox/algorithms/blackbox-block-container.h
+++ b/linbox/algorithms/blackbox-block-container.h
@@ -34,8 +34,8 @@
 #include "linbox/util/debug.h"
 
 #include "linbox/algorithms/blackbox-block-container-base.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
 
 #define _BBC_TIMING
 
@@ -54,9 +54,9 @@ namespace LinBox
 	public:
 		typedef _Field                         Field;
 		typedef typename Field::Element      Element;
-		typedef typename Field::RandIter    RandIter;
-		typedef BlasMatrix<Field>              Block;
-		typedef BlasMatrix<Field>              Value;
+		typedef typename Field::RandIter   RandIter;
+		typedef BlasMatrix<Field>           Block;
+		typedef BlasMatrix<Field>           Value;
 
 		// Default constructor
 		BlackboxBlockContainer () {}
@@ -139,12 +139,12 @@ namespace LinBox
 			tSequence.start();
 #endif
 			if (this->casenumber) {
-				this->Mul(_blockW,*this->_BB,this->_blockV);
+                                this->Mul(_blockW,*this->_BB,this->_blockV);
 				_BMD.mul(this->_value, this->_blockU, _blockW);
 				this->casenumber = 0;
-			}
+                        }
 			else {
-				this->Mul(this->_blockV,*this->_BB,_blockW);
+                                this->Mul(this->_blockV,*this->_BB,_blockW);
 				_BMD.mul(this->_value, this->_blockU, this->_blockV);
 				this->casenumber = 1;
 			}
@@ -166,8 +166,8 @@ namespace LinBox
 		typedef _Field                        Field;
 		typedef typename Field::Element     Element;
 		typedef typename Field::RandIter   RandIter;
-		typedef BlasMatrix<Field>             Block;
-		typedef BlasMatrix<Field>             Value;
+		typedef BlasMatrix<Field>           Block;
+		typedef BlasMatrix<Field>           Value;
 
 		enum Launcher {RowUpdate=0, ColUpdate=1, Nothing=2};
 
@@ -418,7 +418,7 @@ namespace LinBox
 					BlasMatrix<Field> T(_blockW, i*numblock, 0, numblock, block);
 					_BMD.mul(tmp, _Special_U[i], T);
 					for (size_t j=0;j<block;++j){
-						this->_field.assign(this->_value.refEntry(i,j), tmp[j]);
+						this->getField()->assign(this->_value.refEntry(i,j), tmp[j]);
 					}
 				}
 
@@ -432,7 +432,7 @@ namespace LinBox
 					BlasMatrix<Field> T(this->_blockV, i*numblock, 0, numblock, block);
 					_BMD.mul(tmp, _Special_U[i], T);
 					for (size_t j=0;j<block;++j)
-						this->_field.assign(this->_value.refEntry(i,j), tmp[j]);
+						this->getField().assign(this->_value.refEntry(i,j), tmp[j]);
 				}
 
 				this->casenumber = 1;
diff --git a/linbox/algorithms/blackbox-container-base.h b/linbox/algorithms/blackbox-container-base.h
index 4ce344a..d61487d 100644
--- a/linbox/algorithms/blackbox-container-base.h
+++ b/linbox/algorithms/blackbox-container-base.h
@@ -59,17 +59,22 @@ namespace LinBox
 		typedef typename Field::Element Element;
 
 		//-- Constructors
-		BlackboxContainerBase () {}
 
+		//! @bug no need for F
 		BlackboxContainerBase (const Blackbox *BB, const Field &F) :
-			_field (F), _VD (F), _BB (BB), _size ((long)MIN (BB->rowdim (), BB->coldim ()))
+			_field (&F), _VD (F), _BB (BB), _size ((long)MIN (BB->rowdim (), BB->coldim ()))
+			,casenumber(0)
+			,u(F),v(F)
 		{
 			_size <<= 1;
 		}
 
 		// Pascal Giorgi 16.02.2004
+		//! @bug no need for F
 		BlackboxContainerBase (const Blackbox *BB, const Field &F, unsigned long Size) :
-			_field (F), _VD (F), _BB (BB), _size ((long)Size)
+			_field (&F), _VD (F), _BB (BB), _size ((long)Size)
+			,casenumber(0)
+			,u(F),v(F)
 		{}
 
 		virtual ~BlackboxContainerBase ()
@@ -78,21 +83,22 @@ namespace LinBox
 		}
 
 		class const_iterator {
-			BlackboxContainerBase<Field, Blackbox> &_c;
+			BlackboxContainerBase<Field, Blackbox> *_c;
 		public:
-			//const_iterator () {} // BB ??
+			const_iterator () : _c(0){} // BB ??
 			const_iterator (BlackboxContainerBase<Field, Blackbox> &C) :
-				_c (C)
+				_c (&C)
 			{}
-			const_iterator &operator ++ () { _c._launch (); return *this; }
-			const Element  &operator *  () { _c._wait ();   return _c.getvalue (); }
+			const_iterator &operator ++ () { _c->_launch (); return *this; }
+			const Element  &operator *  () { _c->_wait ();   return _c->getvalue (); }
 		};
 
 		const_iterator begin () { return const_iterator (*this); }
 		const_iterator end   () { return const_iterator (); }
 
 		long         size     () const { return _size; }
-		const Field &getField () const { return _field; }
+		const Field &getField () const { return *_field; } // deprecated
+		const Field &field () const { return *_field; }
 		Blackbox    *getBB    () const { return _BB; }
 
 	protected:
@@ -113,15 +119,15 @@ namespace LinBox
 		/// Members
 		//--------------
 
-		Field                _field;
+		const Field           *_field;
 		VectorDomain<Field>  _VD;
 		const Blackbox            *_BB;
 
 		long                 _size;
 
-		// BDS 22.03.03
+		// BDS 22.03.03 // bb : what is casenumber ?
 		long                 casenumber;
-		std::vector<Element>    u, v;
+		BlasVector<Field>    u, v;
 		Element              _value;
 
 		const Element &getvalue() { return _value; }
@@ -151,8 +157,8 @@ namespace LinBox
 		{
 			casenumber = 1;
 			u.resize (_BB->coldim ());
-			for (long i = u.size (); i--;)
-				g.random (u[i]);
+			for (long i = (long)u.size (); i--;)
+				g.random (u[(size_t)i]);
 			v.resize (_BB->rowdim ());
 			return _VD.dot (_value, u, u);
 		}
@@ -173,11 +179,10 @@ namespace LinBox
 #endif // __LINBOX_blackbox_container_base_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/blackbox-container-symmetric.h b/linbox/algorithms/blackbox-container-symmetric.h
index 3d503f6..8b7f292 100644
--- a/linbox/algorithms/blackbox-container-symmetric.h
+++ b/linbox/algorithms/blackbox-container-symmetric.h
@@ -59,7 +59,7 @@ namespace LinBox
 		template<class Vector>
 		BlackboxContainerSymmetric (const Blackbox *D, const Field &F, const Vector &u0) :
 			BlackboxContainerBase<Field, _Blackbox> (D, F)
-		{ init (u0, u0); }
+		{ this->init (u0, u0); }
 		BlackboxContainerSymmetric (const Blackbox *D, const Field &F, RandIter &g) :
 			BlackboxContainerBase<Field, _Blackbox> (D, F)
 		{ this->init (g); }
diff --git a/linbox/algorithms/blackbox-container.h b/linbox/algorithms/blackbox-container.h
index 948b788..05c5994 100644
--- a/linbox/algorithms/blackbox-container.h
+++ b/linbox/algorithms/blackbox-container.h
@@ -6,20 +6,20 @@
  *
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -43,12 +43,13 @@ namespace LinBox
 	public:
 		typedef _Blackbox Blackbox;
 
-		BlackboxContainer () {}
+		// BlackboxContainer () { /*std::cerr << "BC def cstor" << std::endl;*/ }
 
 		template<class Vector>
 
 		BlackboxContainer(const Blackbox * D, const Field &F, const Vector &u0) :
 			BlackboxContainerBase<Field, Blackbox> (D, F)
+			,w(F)
 		{
 			init (u0, u0); w = this->u;
 #ifdef INCLUDE_TIMING
@@ -60,6 +61,7 @@ namespace LinBox
 		template<class Vector>
 		BlackboxContainer(const Blackbox * D, const Field &F, const Vector &u0, unsigned long size) :
 			BlackboxContainerBase<Field, Blackbox> (D, F,size)
+			,w(F)
 		{
 			init (u0, u0); w = this->u;
 #ifdef INCLUDE_TIMING
@@ -71,6 +73,7 @@ namespace LinBox
 		template<class Vector1, class Vector2>
 		BlackboxContainer(const Blackbox * D, const Field &F, const Vector1 &u0, const Vector2& v0) :
 			BlackboxContainerBase<Field, Blackbox> (D, F)
+			,w(F)
 		{
 			init (u0, v0); w = this->v;
 #ifdef INCLUDE_TIMING
@@ -80,14 +83,15 @@ namespace LinBox
 
 		BlackboxContainer(const Blackbox * D, const Field &F, RandIter &g) :
 			BlackboxContainerBase<Field, Blackbox> (D, F)
+			,w(F)
 		{
 			this->casenumber = 1;
 			this->u.resize (this->_BB->coldim ());
-			for (long i = this->u.size (); i--;)
-				g.random (this->u[i]);
+			for (long i = (long)this->u.size (); i--;)
+				g.random (this->u[(size_t)i]);
 			this->w.resize (this->_BB->coldim ());
-			for (long i = this->w.size (); i--;)
-				g.random (this->w[i]);
+			for (long i = (long)this->w.size (); i--;)
+				g.random (this->w[(size_t)i]);
 			this->v.resize (this->_BB->rowdim ());
 			this->_VD.dot (this->_value, this->u, this->w);
 #ifdef INCLUDE_TIMING
@@ -101,7 +105,8 @@ namespace LinBox
 #endif // INCLUDE_TIMING
 
 	protected:
-		std::vector<typename Field::Element> w;
+		// std::vector<typename Field::Element> w;
+		BlasVector<Field> w ;
 
 #ifdef INCLUDE_TIMING
 		Timer _timer;
diff --git a/linbox/algorithms/blas-domain-multimod.h b/linbox/algorithms/blas-domain-multimod.h
deleted file mode 100644
index 9a2325d..0000000
--- a/linbox/algorithms/blas-domain-multimod.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/* linbox/algorithms/blas-domain.inl
- * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
- *
- * Written by :
- *               Pascal Giorgi  pascal.giorgi at ens-lyon.fr
- *               Clément Pernet clement.pernet at imag.fr
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-
-
-#ifndef __LINBOX_blas_matrix_domain_multimod_H
-#define __LINBOX_blas_matrix_domain_multimod_H
-
-#include "linbox/matrix/blas-matrix-multimod.h"
-#include "linbox/algorithms/blas-domain.h"
-
-THIS_CODE_MAY_NOT_COMPILE_AND_IS_NOT_TESTED
-
-namespace LinBox
-{
-
-
-	/*! specialisation for MultiModDouble.
-	*/
-// #ifndef __INTEL_COMPILER
-	// template <>
-// #endif
-	class BlasMatrixDomainInv<MultiModDouble,BlasMatrix<MultiModDouble> > {
-	public:
-		int operator() (const MultiModDouble                   &F,
-				BlasMatrix<MultiModDouble>        &Ainv,
-				const BlasMatrix<MultiModDouble>     &A) const
-		{
-
-			linbox_check( A.rowdim() == A.coldim());
-			linbox_check( A.rowdim() == Ainv.rowdim());
-			linbox_check( A.coldim() == Ainv.coldim());
-			BlasMatrix<MultiModDouble> tmp(A);
-			return (*this)(F,Ainv,tmp);
-		}
-
-		int operator() (const MultiModDouble                &F,
-				BlasMatrix<MultiModDouble>     &Ainv,
-				BlasMatrix<MultiModDouble>        &A) const
-		{
-
-			linbox_check( A.rowdim() == A.coldim());
-			linbox_check( A.rowdim() == Ainv.rowdim());
-			linbox_check( A.coldim() == Ainv.coldim());
-			int nullity, defrank=0;
-
-			for (size_t i=0;i<F.size();++i){
-				// get parent fflas field...
-				FFPACK::Invert(F.getBase(i),A.rowdim(), A.getMatrix(i)->getPointer(),A.getMatrix(i)->getStride(),
-					       Ainv.getMatrix(i)->getPointer(),Ainv.getMatrix(i)->getStride(),nullity);
-				defrank+=nullity;
-			}
-			return defrank;
-		}
-
-	};
-
-}
-
-
-#endif // __LINBOX_blas_matrix_domain_multimod_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/algorithms/blas-domain.h b/linbox/algorithms/blas-domain.h
deleted file mode 100644
index 93e7b19..0000000
--- a/linbox/algorithms/blas-domain.h
+++ /dev/null
@@ -1,827 +0,0 @@
-/* linbox/algorithms/blas-domain.h
- * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
- *
- * Written by :
- *               Pascal Giorgi  pascal.giorgi at ens-lyon.fr
- *               Clément Pernet clement.pernet at imag.fr
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*! @file algorithms/blas-domain.h
- * @ingroup algorithms
- * @brief NO DOC
- * @warning A <code>BlasMatrixDomain<Field></code> should be templated by a
- * \link LinBox::Modular Modular\endlink field. In particular, this domain
- * is not suitable for integers.
- * @warning A \e Field does mean here a \e Field and not a general \f$\mathbf{Z}/m\mathbf{Z}\f$ \e ring. You'll be warned...
- */
-
-#ifndef __LINBOX_blas_matrix_domain_H
-#define __LINBOX_blas_matrix_domain_H
-
-#include <iostream>
-#include <vector>
-
-#include "linbox/linbox-config.h"
-#include "linbox/util/debug.h"
-
-#include <fflas-ffpack/ffpack/ffpack.h>
-#include <fflas-ffpack/fflas/fflas.h>
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/matrix/permutation-matrix.h"
-
-
-namespace LinBox
-{
-
-	const int BlasBound = 1 << 26;
-
-	/** @internal
-	 * Class handling multiplication of a Matrix by an Operand with accumulation and scaling.
-	 *  Operand can be either a matrix or a vector.
-	 *
-	 *  The only function:  operator () is defined :
-	 *     -  D = beta.C + alpha. A*B
-	 *     -  C = beta.C + alpha. A*B
-	 */
-	template< class Field, class Operand1, class Operand2, class Operand3>
-	class BlasMatrixDomainMulAdd {
-	public:
-		Operand1 &operator() (const Field &F,
-				      Operand1 &D,
-				      const typename Field::Element &beta, const Operand1 &C,
-				      const typename Field::Element &alpha, const Operand2 &A, const Operand3 &B) const;
-
-		Operand1 &operator() (const Field &F,
-				      const typename Field::Element &beta, Operand1 &C,
-				      const typename Field::Element &alpha, const Operand2 &A, const Operand3 &B) const;
-
-
-		// allowing disymetry of Operand2 and Operand3 (only if different type)
-		Operand1 &operator() (const Field &F,
-				      Operand1 &D,
-				      const typename Field::Element &beta, const Operand1 &C,
-				      const typename Field::Element &alpha, const Operand3 &A, const Operand2 &B) const;
-
-		Operand1 &operator() (const Field &F,
-				      const typename Field::Element &beta, Operand1 &C,
-				      const typename Field::Element &alpha, const Operand3 &A, const Operand2 &B) const;
-
-
-
-	};
-
-	/*!@internal
-	 * Adding two matrices
-	 */
-	template< class Field, class Operand1, class Operand2, class Operand3>
-	class BlasMatrixDomainAdd {
-	public:
-		Operand1 &operator() (const Field &F,
-				      Operand1 &C, const Operand2 &A, const Operand3 &B) const;
-
-	};
-
-	/*!@internal
-	 * Substracting two matrices
-	 */
-	template< class Field, class Operand1, class Operand2, class Operand3>
-	class BlasMatrixDomainSub {
-	public:
-		Operand1 &operator() (const Field &F,
-				      Operand1 &C, const Operand2 &A, const Operand3 &B) const;
-
-	};
-	//! C -= A
-	template< class Field, class Operand1, class Operand2>
-	class BlasMatrixDomainSubin {
-	public:
-		Operand1 &operator() (const Field &F,
-				      Operand1 &C, const Operand2 &A) const;
-
-	};
-	//! C += A
-	template< class Field, class Operand1, class Operand2>
-	class BlasMatrixDomainAddin {
-	public:
-		Operand1 &operator() (const Field &F,
-				      Operand1 &C, const Operand2 &A) const;
-
-	};
-
-
-	/*!@internal
-	 * Copying a matrix
-	 */
-	template< class Field, class Operand1, class Operand2>
-	class BlasMatrixDomainCopy {
-	public:
-		Operand1 &operator() (const Field &F,
-				      Operand1 &B, const Operand2 &A) const;
-
-	};
-
-	/*!@internal
-	 * multiplying two matrices.
-	 */
-	template< class Field, class Operand1, class Operand2, class Operand3>
-	class BlasMatrixDomainMul {
-	public:
-		Operand1 &operator() (const Field &F,
-				      Operand1 &C, const Operand2 &A, const Operand3 &B) const
-		{
-			typename Field::Element zero, one;
-			F.init( zero, 0UL );
-			F.init( one, 1UL );
-			return BlasMatrixDomainMulAdd<Field,Operand1,Operand2,Operand3>()( F, zero, C, one, A, B );
-		}
-	};
-
-	/*! @internal
-	 * Class handling in-place multiplication of a Matrix by an Operand.
-	 *  Operand can be either a matrix a permutation or a vector
-	 *
-	 *  only  function:  operator () are defined :
-	 *     -  A = A*B
-	 *     -  B = A*B
-	 *     .
-	 * @note In-place multiplications are proposed for the specialization
-	 * with a matrix and a permutation.
-	 * @warning Using mulin with two matrices is still defined but is
-	 * non-sense
-	 */
-	// Operand 2 is always the type of the matrix which is not modified
-	// ( for example: BlasPermutation TriangularBlasMatrix )
-	template< class Field, class Operand1, class Operand2>
-	class BlasMatrixDomainMulin {
-	public:
-		// Defines a dummy mulin over generic matrices using a temporary
-		Operand1 &operator() (const Field &F,
-				      Operand1 &A, const Operand2 &B) const
-		{
-			typename Field::Element zero, one;
-			F.init( zero, 0UL );
-			F.init( one, 1UL );
-			Operand1* tmp = new Operand1(A);
-			// Effective copy of A
-			*tmp = A;
-			BlasMatrixDomainMulAdd<Field,Operand1,Operand1,Operand2>()( F, zero, A, one, *tmp, B );
-			delete tmp;
-			return A;
-		}
-
-		Operand1 &operator() (const Field &F,
-				      const Operand2 &A, Operand1 &B ) const
-		{
-			typename Field::Element zero, one;
-			F.init( zero, 0UL );
-			F.init( one, 1UL );
-			Operand1* tmp = new Operand1(B);
-			// Effective copy of B
-			*tmp = B;
-			BlasMatrixDomainMulAdd<Field,Operand1,Operand1,Operand2>()( F, zero, B, one, A, *tmp );
-			delete tmp;
-			return B;
-		}
-	};
-
-	/*! @internal
-	 * Class handling inversion of a Matrix.
-	 *
-	 *  only  function:  operator () are defined :
-	 *    -   Ainv = A^(-1)
-	 *
-	 *  Returns nullity of matrix (0 iff inversion was ok)
-	 *
-	 * @warning Beware, if A is not const this allows an inplace computation
-	 *  and so A will be modified
-	 *
-	 */
-	template< class Field, class Matrix>
-	class BlasMatrixDomainInv {
-	public:
-		int &operator() (const Field &F, Matrix &Ainv, const Matrix &A) const;
-		int &operator() (const Field &F, Matrix &Ainv, Matrix &A) const;
-	};
-
-	/*! @internal
-	 * Class handling rank computation of a Matrix.
-	 *
-	 *  only  function:  operator () are defined :
-	 *    -  return the rank of A
-	 *
-	 *  @warning Beware, if A is not const this allows an inplace computation
-	 *  and so A will be modified
-	 */
-	template< class Field, class Matrix>
-	class BlasMatrixDomainRank {
-	public:
-		unsigned int &operator() (const Field &F, const Matrix& A) const;
-		unsigned int &operator() (const Field &F, Matrix& A) const;
-	};
-
-	/*! @internal
-	 * Class handling determinant computation of a Matrix.
-	 *
-	 *  only  function:  operator () are defined :
-	 *     -  return the determinant of A
-	 *
-	 * @warning Beware, if A is not const this allows an inplace computation
-	 *  and so A will be modified
-	 */
-	template< class Field, class Matrix>
-	class BlasMatrixDomainDet {
-	public:
-		typename Field::Element operator() (const Field &F, const Matrix& A) const;
-		typename Field::Element operator() (const Field &F, Matrix& A) const;
-	};
-
-	/*! @internal
-	 * Class handling resolution of linear system of a Matrix.
-	 *  with Operand as right or left and side
-	 *
-	 *  only  function:  operator () are defined :
-	 *    -  X = A^(-1).B
-	 *    -  B = A^(-1).B
-	 */
-	template< class Field, class Operand, class Matrix>
-	class BlasMatrixDomainLeftSolve {
-	public:
-		Operand &operator() (const Field &F, Operand &X, const Matrix &A, const Operand &B) const;
-		Operand &operator() (const Field &F, const Matrix &A, Operand &B) const;
-	};
-
-	/*! @internal
-	 * Class handling resolution of linear system of a Matrix.
-	 *  with Operand as right or left and side
-	 *
-	 *  only  function:  operator () are defined :
-	 *   -   X = B.A^(-1)
-	 *   -   B = B.A^(-1)
-	 */
-	template< class Field, class Operand, class Matrix>
-	class BlasMatrixDomainRightSolve {
-	public:
-		Operand &operator() (const Field &F, Operand &X, const Matrix &A, const Operand &B) const;
-		Operand &operator() (const Field &F, const Matrix &A, Operand &B) const;
-	};
-
-	/*! @internal
-	 * Class handling the minimal polynomial  of a Matrix.
-	 */
-	template< class Field, class Polynomial, class Matrix>
-	class BlasMatrixDomainMinpoly {
-	public:
-		Polynomial&  operator() (const Field &F, Polynomial& P, const Matrix& A) const;
-	};
-
-	/*! @internal
-	 * Class handling the characteristic polynomial  of a Matrix.
-	 */
-	template< class Field, class ContPol, class Matrix>
-	class BlasMatrixDomainCharpoly {
-	public:
-		//		typedef Container<Polynomial> ContPol;
-
-		ContPol&  operator() (const Field &F, ContPol& P, const Matrix& A) const;
-	};
-
-	/**
-	 *  Interface for all functionnalities provided
-	 *  for BlasMatrix.
-	 *  @internal
-	 *  Done through specialization of all
-	 *  classes defined above.
-	 */
-	template <class Field>
-	class BlasMatrixDomain {
-
-	public:
-		typedef typename Field::Element         Element;
-
-	protected:
-
-		const Field  & _field;
-		Element _One;
-		Element _Zero;
-		Element _MOne;
-
-	public:
-
-		//! Constructor of BlasDomain.
-
-		BlasMatrixDomain (const Field& F ) :
-			_field(F)
-		{
-			F.init(_One,1UL);
-			F.init(_Zero,0UL);
-			F.init(_MOne,-1);
-#ifndef NDEBUG
-			if (!Givaro::probab_prime(F.characteristic())) {
-				std::cout << " *** WARNING *** "                                           << std::endl;
-				std::cout << " You are using a BLAS Domain where your field is not prime " << std::endl;
-			}
-#endif
-		}
-
-		//! Copy constructor
-		BlasMatrixDomain (const BlasMatrixDomain<Field> & BMD) :
-			_field(BMD._field), _One(BMD._One), _Zero(BMD._Zero), _MOne(BMD._MOne)
-		{
-#ifndef NDEBUG
-			if (!Givaro::probab_prime(_field.characteristic())) {
-				std::cout << " *** WARNING *** "                                           << std::endl;
-				std::cout << " You are using a BLAS Domain where your field is not prime " << std::endl;
-			}
-#endif
-
-		}
-
-
-		//! Field accessor
-		const Field& field() const
-		{
-			return _field;
-		}
-
-
-		/*
-		 * Basics operation available matrix respecting BlasMatrix interface
-		 */
-
-		//! multiplication.
-		//! C = A*B
-		template <class Operand1, class Operand2, class Operand3>
-		Operand1& mul(Operand1& C, const Operand2& A, const Operand3& B) const
-		{
-			return BlasMatrixDomainMul<Field,Operand1,Operand2,Operand3>()(_field,C,A,B);
-		}
-
-		//! addition.
-		//! C = A+B
-		template <class Operand1, class Operand2, class Operand3>
-		Operand1& add(Operand1& C, const Operand2& A, const Operand3& B) const
-		{
-			return BlasMatrixDomainAdd<Field,Operand1,Operand2,Operand3>()(_field,C,A,B);
-		}
-
-		//! copy.
-		//! B = A
-		template <class Operand1, class Operand2>
-		Operand1& copy(Operand1& B, const Operand2& A) const
-		{
-			return BlasMatrixDomainCopy<Field,Operand1,Operand2>()(_field,B,A);
-		}
-
-		//! substraction
-		//! C = A-B
-		template <class Operand1, class Operand2, class Operand3>
-		Operand1& sub(Operand1& C, const Operand2& A, const Operand3& B) const
-		{
-			return BlasMatrixDomainSub<Field,Operand1,Operand2,Operand3>()(_field,C,A,B);
-		}
-
-		//! substraction (in place)
-		//! C -= B
-		template <class Operand1, class Operand3>
-		Operand1& subin(Operand1& C, const Operand3& B) const
-		{
-			return BlasMatrixDomainSubin<Field,Operand1,Operand3>()(_field,C,B);
-		}
-
-		//! addition (in place)
-		//! C += B
-		template <class Operand1, class Operand3>
-		Operand1& addin(Operand1& C, const Operand3& B) const
-		{
-			return BlasMatrixDomainAddin<Field,Operand1,Operand3>()(_field,C,B);
-		}
-
-
-		//! multiplication with scaling.
-		//! C = alpha.A*B
-		template <class Operand1, class Operand2, class Operand3>
-		Operand1& mul(Operand1& C, const Element& alpha, const Operand2& A, const Operand3& B) const
-		{
-			return muladdin(_Zero,C,alpha,A,B);
-		}
-
-
-		//! In place multiplication.
-		//! A = A*B
-		template <class Operand1, class Operand2>
-		Operand1& mulin_left(Operand1& A, const Operand2& B ) const
-		{
-			return BlasMatrixDomainMulin<Field,Operand1,Operand2>()(_field,A,B);
-		}
-
-		//! In place multiplication.
-		//! B = A*B
-		template <class Operand1, class Operand2>
-		Operand2& mulin_right(const Operand1& A, Operand2& B ) const
-		{
-			return BlasMatrixDomainMulin<Field,Operand2,Operand1>()(_field,A,B);
-		}
-
-		//! axpy.
-		//! D = A*B + C
-		template <class Operand1, class Operand2, class Operand3>
-		Operand1& axpy(Operand1& D, const Operand2& A, const Operand3& B, const Operand1& C) const
-		{
-			return muladd(D,_One,C,_One,A,B);
-		}
-
-		//! axpyin.
-		//! C += A*B
-		template <class Operand1, class Operand2, class Operand3>
-		Operand1& axpyin(Operand1& C, const Operand2& A, const Operand3& B) const
-		{
-			return muladdin(_One,C,_One,A,B);
-		}
-
-		//! maxpy.
-		//! D = C - A*B
-		template <class Operand1, class Operand2, class Operand3>
-		Operand1& maxpy(Operand1& D, const Operand2& A, const Operand3& B, const Operand1& C)const
-		{
-			return muladd(D,_One,C,_MOne,A,B);
-		}
-
-		//! maxpyin.
-		//! C -= A*B
-		template <class Operand1, class Operand2, class Operand3>
-		Operand1& maxpyin(Operand1& C, const Operand2& A, const Operand3& B) const
-		{
-			return muladdin(_One,C,_MOne,A,B);
-		}
-
-		//! axmy.
-		//! D= A*B - C
-		template <class Operand1, class Operand2, class Operand3>
-		Operand1& axmy(Operand1& D, const Operand2& A, const Operand3& B, const Operand1& C) const
-		{
-			return muladd(D,_MOne,C,_One,A,B);
-		}
-
-		//! axmyin.
-		//! C = A*B - C
-		template <class Operand1, class Operand2, class Operand3>
-		Operand1& axmyin(Operand1& C, const Operand2& A, const Operand3& B) const
-		{
-			return muladdin(_MOne,C,_One,A,B);
-		}
-
-		//!  general matrix-matrix multiplication and addition with scaling.
-		//! D= beta.C + alpha.A*B
-		template <class Operand1, class Operand2, class Operand3>
-		Operand1& muladd(Operand1& D, const Element& beta, const Operand1& C,
-				 const Element& alpha, const Operand2& A, const Operand3& B) const
-		{
-			return BlasMatrixDomainMulAdd<Field,Operand1,Operand2,Operand3>()(_field,D,beta,C,alpha,A,B);
-		}
-
-		//! muladdin.
-		//! C= beta.C + alpha.A*B.
-		template <class Operand1, class Operand2, class Operand3>
-		Operand1& muladdin(const Element& beta, Operand1& C,
-				   const Element& alpha, const Operand2& A, const Operand3& B) const
-		{
-			return BlasMatrixDomainMulAdd<Field,Operand1,Operand2,Operand3>()(_field,beta,C,alpha,A,B);
-		}
-
-
-		/*!
-		 * @name Solutions available for matrix respecting BlasMatrix interface
-		 */
-		//@{
-
-		//! Inversion
-		template <class Matrix>
-		Matrix& inv( Matrix &Ainv, const Matrix &A) const
-		{
-			BlasMatrixDomainInv<Field,Matrix>()(_field,Ainv,A);
-			return Ainv;
-		}
-
-		//! Inversion (in place)
-		template <class Matrix>
-		Matrix& invin( Matrix &Ainv, Matrix &A) const
-		{
-			BlasMatrixDomainInv<Field,Matrix>()(_field,Ainv,A);
-			return Ainv;
-		}
-
-		//! Inversion (the matrix A is modified)
-		template <class Matrix>
-		Matrix& invin(Matrix &A) const
-		{
-			Matrix tmp(A.rowdim(), A.coldim());
-			tmp = A;
-			BlasMatrixDomainInv<Field,Matrix>()(_field,A,tmp);
-			return A;
-		}
-
-
-		/*! Division.
-		 * C = A B^{-1}  ==>  C . B = A
-		 */
-		template <class Matrix>
-		Matrix& div( Matrix &C, const Matrix &A, const Matrix &B) const
-		{
-			return this->right_solve(C,B,A);
-		}
-
-
-		//! Inversion w singular check
-		template <class Matrix>
-		Matrix& inv( Matrix &Ainv, const Matrix &A, int& nullity) const
-		{
-			nullity = BlasMatrixDomainInv<Field,Matrix>()(_field,Ainv,A);
-			return Ainv;
-		}
-
-		//! Inversion (the matrix A is modified) w singular check
-		template <class Matrix>
-		Matrix& invin( Matrix &Ainv, Matrix &A, int& nullity) const
-		{
-			nullity = BlasMatrixDomainInv<Field,Matrix>()(_field,Ainv,A);
-			return Ainv;
-		}
-
-		//! Rank
-		template <class Matrix>
-		unsigned int rank(const Matrix &A) const
-		{
-			return BlasMatrixDomainRank<Field,Matrix>()(_field,A);
-		}
-
-		//! in-place Rank (the matrix is modified)
-		template <class Matrix>
-		unsigned int rankin(Matrix &A) const
-		{
-			return BlasMatrixDomainRank<Field, Matrix>()(_field,A);
-		}
-
-		//! determinant
-		template <class Matrix>
-		Element det(const Matrix &A) const
-		{
-			return BlasMatrixDomainDet<Field, Matrix>()(_field,A);
-		}
-
-		//! in-place Determinant (the matrix is modified)
-		template <class Matrix>
-		Element detin(Matrix &A) const
-		{
-			return BlasMatrixDomainDet<Field, Matrix>()(_field,A);
-		}
-		//@}
-
-		/*!
-		 * @name Solvers for Matrix (respecting BlasMatrix interface)
-		 * with Operand as right or left hand side
-		 */
-		//@{
-		//! linear solve with matrix right hand side.
-		//! AX=B
-		template <class Operand, class Matrix>
-		Operand& left_solve (Operand& X, const Matrix& A, const Operand& B) const
-		{
-			return BlasMatrixDomainLeftSolve<Field,Operand,Matrix>()(_field,X,A,B);
-		}
-
-		//! linear solve with matrix right hand side, the result is stored in-place in B.
-		//! @pre A must be square
-		//! AX=B , (B<-X)
-		template <class Operand,class Matrix>
-		Operand& left_solve (const Matrix& A, Operand& B) const
-		{
-			return BlasMatrixDomainLeftSolve<Field,Operand,Matrix>()(_field,A,B);
-		}
-
-		//! linear solve with matrix right hand side.
-		//! XA=B
-		template <class Operand, class Matrix>
-		Operand& right_solve (Operand& X, const Matrix& A, const Operand& B) const
-		{
-			return BlasMatrixDomainRightSolve<Field,Operand,Matrix>()(_field,X,A,B);
-		}
-
-		//! linear solve with matrix right hand side, the result is stored in-place in B.
-		//! @pre A must be square
-		//! XA=B , (B<-X)
-		template <class Operand, class Matrix>
-		Operand& right_solve (const Matrix& A, Operand& B) const
-		{
-			return BlasMatrixDomainRightSolve<Field,Operand,Matrix>()(_field,A,B);
-		}
-
-		//! minimal polynomial computation.
-		template <class Polynomial, class Matrix>
-		Polynomial& minpoly( Polynomial& P, const Matrix& A ) const
-		{
-			return BlasMatrixDomainMinpoly<Field, Polynomial, Matrix>()(_field,P,A);
-		}
-
-		//! characteristic polynomial computation.
-		template <class Polynomial,  class Matrix >
-		Polynomial& charpoly( Polynomial& P, const Matrix& A ) const
-		{
-
-			commentator().start ("Modular Dense Charpoly ", "MDCharpoly");
-			std::list<Polynomial> P_list;
-			P_list.clear();
-			BlasMatrixDomainCharpoly<Field, std::list<Polynomial>, Matrix >()(_field,P_list,A);
-
-
-			Polynomial tmp(A.rowdim()+1);
-			typename std::list<Polynomial>::iterator it = P_list.begin();
-			P = *(it++);
-			while( it!=P_list.end() ){
-				// Waiting for an implementation of a domain of polynomials
-				mulpoly( tmp, P, *it);
-				P = tmp;
-				//	delete &(*it);
-				++it;
-			}
-			commentator().stop ("done", NULL, "MDCharpoly");
-
-			return P;
-		}
-
-		//! characteristic polynomial computation.
-		template <class Polynomial, class Matrix >
-		std::list<Polynomial>& charpoly( std::list<Polynomial>& P, const Matrix& A ) const
-		{
-			return BlasMatrixDomainCharpoly<Field, std::list<Polynomial>, Matrix >()(_field,P,A);
-		}
-
-
-		//private:
-		//! @todo Temporary: waiting for an implementation of a domain of polynomial
-		template<class Polynomial>
-		Polynomial &
-		mulpoly(Polynomial &res, const Polynomial & P1, const Polynomial & P2)const
-		{
-			size_t i,j;
-			res.resize(P1.size()+P2.size()-1);
-			for (i=0;i<res.size();i++)
-				_field.assign(res[i],_Zero);
-			for ( i=0;i<P1.size();i++)
-				for ( j=0;j<P2.size();j++)
-					_field.axpyin(res[i+j],P1[i],P2[j]);
-			return res;
-
-		}
-		//@}
-
-		template<class Matrix1, class Matrix2>
-		bool areEqual(const Matrix1 & A, const Matrix2 & B)
-		{
-			if ( (A.rowdim() != B.rowdim()) || (A.coldim() != B.coldim()) )
-				return false ;
-			for (size_t i = 0 ; i < A.rowdim() ; ++i)
-				for (size_t j = 0 ; j < A.coldim() ; ++j)
-					if (!_field.areEqual(A.getEntry(i,j),B.getEntry(i,j))) //!@bug use refs
-						return false ;
-			return true ;
-		}
-
-		template<class Matrix>
-		void setIdentity(Matrix & I)
-		{
-			for (size_t i = 0 ; i< I.rowdim() ; ++i)
-				for (size_t j = 0 ; j < I.coldim() ; ++j) {
-					if (i == j)
-						I.setEntry(i,j,_One);
-					else
-						I.setEntry(i,j,_Zero);
-				}
-
-		}
-
-		template<class Matrix>
-		void setZero(Matrix & I)
-		{
-			// use Iterator
-			for (size_t i = 0 ; i< I.rowdim() ; ++i)
-				for (size_t j = 0 ; j < I.coldim() ; ++j) {
-						I.setEntry(i,j,_Zero);
-				}
-		}
-
-
-		template<class Matrix1>
-		bool isZero(const Matrix1 & A)
-		{
-			for (size_t i = 0 ; i < A.rowdim() ; ++i)
-				for (size_t j = 0 ; j < A.coldim() ; ++j)
-					if (!_field.isZero(A.getEntry(i,j))) //!@bug use refs
-						return false ;
-			return true ;
-		}
-
-		template<class Matrix1>
-		bool isIdentity(const Matrix1 & A)
-		{
-			if (A.rowdim() != A.coldim())
-				return false ;
-			for (size_t i = 0 ; i < A.rowdim() ; ++i)
-				if (!_field.isOne(A.getEntry(i,i)))
-					return false;
-
-			for (size_t i = 0 ; i < A.rowdim() ; ++i)
-				for (size_t j = 0 ; j < i ; ++j)
-					if (!_field.isZero(A.getEntry(i,j))) //!@bug use refs
-						return false ;
-			for (size_t i = 0 ; i < A.rowdim() ; ++i)
-				for (size_t j = i+1 ; j < A.coldim() ; ++j)
-					if (!_field.isZero(A.getEntry(i,j))) //!@bug use refs
-						return false ;
-			return true ;
-		}
-
-		template<class Matrix1>
-		bool isIdentityGeneralized(const Matrix1 & A)
-		{
-			size_t mn = std::min(A.rowdim(),A.coldim());
-			for (size_t i = 0 ; i < mn ; ++i)
-				if (!_field.isOne(A.getEntry(i,i)))
-					return false;
-
-			for (size_t i = 0 ; i < A.rowdim() ; ++i)
-				for (size_t j = 0 ; j < std::min(i,mn) ; ++j)
-					if (!_field.isZero(A.getEntry(i,j))) //!@bug use refs
-						return false ;
-			for (size_t i = 0 ; i < A.rowdim() ; ++i)
-				for (size_t j = i+1 ; j < A.coldim() ; ++j)
-					if (!_field.isZero(A.getEntry(i,j))) //!@bug use refs
-						return false ;
-			return true ;
-		}
-
-	public:
-
-		/** Print matrix.
-		 * @param  os  Output stream to which matrix is written.
-		 * @param  A   Matrix.
-		 * @returns reference to os.
-		 */
-		template <class Matrix>
-		inline std::ostream &write (std::ostream &os, const Matrix &A) const
-		{
-			return A.write (os);
-		}
-
-		template <class Matrix>
-		inline std::ostream &write (std::ostream &os, const Matrix &A, bool maple_format) const
-		{
-			return A.write (os, _field, maple_format);
-		}
-
-		/** Read matrix
-		 * @param  is  Input stream from which matrix is read.
-		 * @param  A   Matrix.
-		 * @returns reference to is.
-		 */
-		template <class Matrix>
-		inline std::istream &read (std::istream &is, Matrix &A) const
-		{
-			return A.read (is, _field);
-		}
-
-	}; /* end of class BlasMatrixDomain */
-
-
-} /* end of namespace LinBox */
-
-#include "linbox/algorithms/blas-domain.inl"
-
-#endif /* __LINBOX_blas_matrix_domain_H */
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/algorithms/blas-domain.inl b/linbox/algorithms/blas-domain.inl
deleted file mode 100644
index 54b6d5c..0000000
--- a/linbox/algorithms/blas-domain.inl
+++ /dev/null
@@ -1,1507 +0,0 @@
-/* linbox/algorithms/blas-domain.inl
- * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
- *
- * Written by :
- *               Pascal Giorgi  pascal.giorgi at ens-lyon.fr
- *               Clément Pernet clement.pernet at imag.fr
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-
-
-#ifndef __LINBOX_blas_matrix_domain_INL
-#define __LINBOX_blas_matrix_domain_INL
-
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/matrix/factorized-matrix.h"
-
-namespace LinBox
-{
-
-	/*
-	 * **********************************************
-	 * *** Specialization for BlasMatrix<Field> ***
-	 * **********************************************
-	 */
-
-
-#if 0
-	// Inversion
-	// dpritcha: now returns nullity. (2004-07-19)
-	// previously returned Ainv but this is passed back anyway.
-	template <class Field>
-	class BlasMatrixDomainInv<Field,BlasMatrix<Field> > {
-	public:
-		int operator() (const Field                   &F,
-				BlasMatrix<Field>        &Ainv,
-				const BlasMatrix<Field>     &A) const
-		{
-
-			linbox_check( A.rowdim() == A.coldim());
-			linbox_check( A.rowdim() == Ainv.rowdim());
-			linbox_check( A.coldim() == Ainv.coldim());
-			BlasMatrix<Field> tmp(A);
-			return (*this)(F,Ainv,tmp);
-		}
-
-		int operator() (const Field                &F,
-				BlasMatrix<Field>     &Ainv,
-				BlasMatrix<Field>        &A) const
-		{
-
-			linbox_check( A.rowdim() == A.coldim());
-			linbox_check( A.rowdim() == Ainv.rowdim());
-			linbox_check( A.coldim() == Ainv.coldim());
-			int nullity;
-			FFPACK::Invert((typename Field::Father_t)F,A.rowdim(),A.getPointer(),A.getStride(),
-				       Ainv.getPointer(),Ainv.getStride(),nullity);
-			return nullity;
-		}
-
-	};
-#endif
-
-
-#if 0
-	// Rank
-	template <class Field>
-	class 	BlasMatrixDomainRank<Field,BlasMatrix<Field> > {
-	public:
-		inline unsigned int operator() (const Field                &F,
-						const BlasMatrix<Field>  &A) const
-		{
-
-			BlasMatrix<Field> tmp(A);
-			return (*this)(F,tmp);
-		}
-
-		inline unsigned int operator() (const Field                &F,
-						BlasMatrix<Field>        &A) const
-		{
-
-			return FFPACK::Rank((typename Field::Father_t)F, A.rowdim(), A.coldim(),A.getPointer(), A.getStride());
-		}
-	};
-
-	// determinant
-	template <class Field>
-	class BlasMatrixDomainDet<Field,BlasMatrix<Field> > {
-	public:
-		inline typename Field::Element operator()(const Field                 &F,
-							  const BlasMatrix<Field>   &A) const
-		{
-
-			BlasMatrix<Field> tmp(A);
-			return  (*this)(F,tmp);
-		}
-
-		inline typename Field::Element operator() (const Field                &F,
-							   BlasMatrix<Field>        &A) const
-		{
-
-			return FFPACK::Det((typename Field::Father_t)F, A.rowdim(), A.coldim(),A.getPointer(), A.getStride());
-		}
-	};
-#endif
-
-
-	/*
-	 * **********************************************
-	 * *** Specialization for BlasMatrix<Field> ***
-	 * **********************************************
-	 */
-
-
-	// Inversion
-	// dpritcha: now returns nullity. (2004-07-19)
-	// previously returned Ainv but this is passed back anyway.
-	template <class Field>
-	class BlasMatrixDomainInv<Field,BlasMatrix<Field> > {
-	public:
-		int operator() (const Field                                   &F,
-				BlasMatrix<Field>        &Ainv,
-				const BlasMatrix<Field>     &A) const
-		{
-
-			linbox_check( A.rowdim() == A.coldim());
-			linbox_check( A.rowdim() == Ainv.rowdim());
-			linbox_check( A.coldim() == Ainv.coldim());
-			BlasMatrix<Field> tmp(A);
-			return (*this)(F,Ainv,tmp);
-		}
-
-		int operator() (const Field                                  &F,
-				BlasMatrix<Field>       &Ainv,
-				BlasMatrix<Field>          &A) const
-		{
-
-			linbox_check( A.rowdim() == A.coldim());
-			linbox_check( A.rowdim() == Ainv.rowdim());
-			linbox_check( A.coldim() == Ainv.coldim());
-			int nullity;
-			FFPACK::Invert ((typename Field::Father_t)F, A.rowdim(), A.getPointer(), A.getStride(),
-					Ainv.getPointer(),Ainv.getStride(),nullity);
-			return nullity;
-		}
-
-	};
-
-	// Rank
-	template <class Field>
-	class 	BlasMatrixDomainRank<Field,BlasMatrix<Field> > {
-	public:
-		inline unsigned int operator() (const Field                                &F,
-						const BlasMatrix<Field>  &A) const
-		{
-
-			BlasMatrix<Field> tmp(A);
-			return (*this)(F,tmp);
-		}
-
-		inline unsigned int
-		operator() (const Field                           &F,
-			    BlasMatrix<Field>   &A) const
-		{
-
-			return (unsigned int) FFPACK::Rank((typename Field::Father_t)F,
-					A.rowdim(), A.coldim(),A.getPointer(), A.getStride());
-		}
-	};
-
-	// determinant
-	template <class Field>
-	class BlasMatrixDomainDet<Field,BlasMatrix<Field> > {
-	public:
-		inline typename Field::Element operator()(const Field                                &F,
-							  const BlasMatrix<Field>  &A) const
-		{
-
-			BlasMatrix<Field> tmp(A);
-			return  (*this)(F,tmp);
-		}
-
-		inline typename Field::Element operator() (const Field                             &F,
-							   BlasMatrix<Field>     &A) const
-		{
-
-			return FFPACK::Det((typename Field::Father_t)F, A.rowdim(), A.coldim(),A.getPointer(), A.getStride());
-		}
-	};
-
-
-	/*
-	 * specialization for Operand1, Operand2 and Operand3  of type BlasMatrix<Field>
-	 */
-
-	template<class Field>
-	class 	BlasMatrixDomainAdd<Field,BlasMatrix<Field>,BlasMatrix<Field>, BlasMatrix<Field> > {
-	public:
-		BlasMatrix<Field>& operator()(const Field& F,
-								BlasMatrix<Field>& C,
-								const BlasMatrix<Field>& A,
-								const BlasMatrix<Field>& B) const
-		{
-			linbox_check( A.rowdim() == B.rowdim());
-			linbox_check( C.rowdim() == A.rowdim());
-			linbox_check( A.coldim() == B.coldim());
-			linbox_check( C.coldim() == A.coldim());
-			FFLAS::fadd ((typename Field::Father_t)F, C.rowdim(), C.coldim(),
-				     A.getPointer(), A.getStride(),
-				     B.getPointer(), B.getStride(),
-				     C.getPointer(), C.getStride());
-			return C;
-		}
-	};
-
-	template<class Field>
-	class 	BlasMatrixDomainCopy<Field,BlasMatrix<Field>, BlasMatrix<Field> > {
-	public:
-		BlasMatrix<Field>& operator()(const Field& F,
-								BlasMatrix<Field>& B,
-								const BlasMatrix<Field>& A) const
-		{
-			linbox_check( A.rowdim() == B.rowdim());
-			linbox_check( A.coldim() == B.coldim());
-			for (size_t i=0; i<A.rowdim(); i++)
-				FFLAS::fcopy ((typename Field::Father_t)F, A.coldim(),
-					      B.getPointer() + i*B.getStride(), 1,
-					      A.getPointer() + i*A.getStride(), 1);
-			return B;
-		}
-	};
-
-	template<class Field>
-	class 	BlasMatrixDomainSub<Field,BlasMatrix<Field>,BlasMatrix<Field>, BlasMatrix<Field> > {
-	public:
-		BlasMatrix<Field>& operator()(const Field& F,
-								BlasMatrix<Field>& C,
-								const BlasMatrix<Field>& A,
-								const BlasMatrix<Field>& B) const
-		{
-			linbox_check( A.rowdim() == B.rowdim());
-			linbox_check( C.rowdim() == A.rowdim());
-			linbox_check( A.coldim() == B.coldim());
-			linbox_check( C.coldim() == A.coldim());
-			FFLAS::fsub ((typename Field::Father_t)F, C.rowdim(), C.coldim(),
-				     A.getPointer(), A.getStride(),
-				     B.getPointer(), B.getStride(),
-				     C.getPointer(), C.getStride());
-			return C;
-		}
-	};
-
-	template<class Field>
-	class 	BlasMatrixDomainSubin<Field,BlasMatrix<Field>,BlasMatrix<Field> > {
-	public:
-		BlasMatrix<Field>& operator()(const Field& F,
-								BlasMatrix<Field>& C,
-								const BlasMatrix<Field>& B) const
-		{
-			linbox_check( C.rowdim() == B.rowdim());
-			linbox_check( C.coldim() == B.coldim());
-			FFLAS::fsubin ((typename Field::Father_t)F, C.rowdim(), C.coldim(),
-				     B.getPointer(), B.getStride(),
-				     C.getPointer(), C.getStride());
-			return C;
-		}
-	};
-
-	template<class Field>
-	class 	BlasMatrixDomainAddin<Field,BlasMatrix<Field>,BlasMatrix<Field> > {
-	public:
-		BlasMatrix<Field>& operator()(const Field& F,
-								BlasMatrix<Field>& C,
-								const BlasMatrix<Field>& B) const
-		{
-			linbox_check( C.rowdim() == B.rowdim());
-			linbox_check( C.coldim() == B.coldim());
-			FFLAS::faddin ((typename Field::Father_t)F, C.rowdim(), C.coldim(),
-				     B.getPointer(), B.getStride(),
-				     C.getPointer(), C.getStride());
-			return C;
-		}
-	};
-
-	//  general matrix-matrix multiplication and addition with scaling
-	// D= beta.C + alpha.A*B
-	template<class Field>
-	class 	BlasMatrixDomainMulAdd<Field,BlasMatrix<Field>,BlasMatrix<Field>, BlasMatrix<Field> > {
-	public:
-		BlasMatrix<Field>&
-		operator()(const Field                              & F,
-			   BlasMatrix<Field>      & D,
-			   const typename Field::Element            & beta,
-			   const BlasMatrix<Field>& C,
-			   const typename Field::Element            & alpha,
-			   const BlasMatrix<Field>& A,
-			   const BlasMatrix<Field>& B) const
-		{
-			linbox_check( A.coldim() == B.rowdim());
-			linbox_check( C.rowdim() == A.rowdim());
-			linbox_check( C.coldim() == B.coldim());
-			linbox_check( D.rowdim() == C.rowdim());
-			linbox_check( D.coldim() == C.coldim());
-
-			D=C;
-			// linbox_check(D.getPointer() != C.getPointer());
-
-			// std::cout << "alpha :" << alpha << std::endl;
-			// std::cout << "beta  :" << beta  << std::endl;
-			// D.write(std::cout << "Dfgem :=" ) <<','<< std::endl;
-			// A.write(std::cout << "Afgem :=" ) <<','<< std::endl;
-			// B.write(std::cout << "Bfgem :=" ) <<','<< std::endl;
-			FFLAS::fgemm((typename Field::Father_t) F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
-				      C.rowdim(), C.coldim(), A.coldim(),
-				      alpha,
-				      A.getPointer(), A.getStride(),
-				      B.getPointer(), B.getStride(),
-				      beta,
-				      D.getPointer(), D.getStride());
-			// D.write(std::cout << "Dfgem :=" ) <<','<< std::endl;
-			// std::cout << A.getStride() << "," << A.coldim() << std::endl;
-			// std::cout << B.getStride() << "," << B.coldim() << std::endl;
-			// std::cout << D.getStride() << "," << D.coldim() << std::endl;
-			return D;
-		}
-
-
-		BlasMatrix<Field>&
-		operator() (const Field                              & F,
-			    const typename Field::Element            & beta,
-			    BlasMatrix<Field>      & C,
-			    const typename Field::Element            & alpha,
-			    const BlasMatrix<Field>& A,
-			    const BlasMatrix<Field>& B) const
-		{
-			linbox_check( A.coldim() == B.rowdim());
-			linbox_check( C.rowdim() == A.rowdim());
-			linbox_check( C.coldim() == B.coldim());
-
-			FFLAS::fgemm((typename Field::Father_t) F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
-				      C.rowdim(), C.coldim(), A.coldim(),
-				      alpha,
-				      A.getPointer(), A.getStride(),
-				      B.getPointer(), B.getStride(),
-				      beta,
-				      C.getPointer(), C.getStride());
-			return C;
-		}
-	};
-
-
-	template<class Field>
-	class 	BlasMatrixDomainMulAdd<Field,
-		BlasMatrix<Field>,
-		TransposedBlasMatrix<BlasMatrix<Field> >,
-		BlasMatrix<Field> > {
-	public:
-		BlasMatrix<Field>&
-		operator()(const Field                              & F,
-			   BlasMatrix<Field>      & D,
-			   const typename Field::Element            & beta,
-			   const BlasMatrix<Field>& C,
-			   const typename Field::Element            & alpha,
-			   const TransposedBlasMatrix<BlasMatrix<Field> >& A,
-			   const BlasMatrix<Field>& B) const
-		{
-			linbox_check( A.getMatrix().rowdim() == B.rowdim());
-			linbox_check( C.rowdim() == A.getMatrix().coldim());
-			linbox_check( C.coldim() == B.coldim());
-			linbox_check( D.rowdim() == C.rowdim());
-			linbox_check( D.coldim() == C.coldim());
-
-			D=C;
-
-			FFLAS::fgemm((typename Field::Father_t) F, FFLAS::FflasTrans, FFLAS::FflasNoTrans,
-				      C.rowdim(), C.coldim(), B.rowdim(),
-				      alpha,
-				      A.getMatrix().getPointer(), A.getMatrix().getStride(),
-				      B.getPointer(), B.getStride(),
-				      beta,
-				      D.getPointer(), D.getStride());
-
-			return D;
-		}
-
-
-		BlasMatrix<Field>&
-		operator() (const Field                              & F,
-			    const typename Field::Element            & beta,
-			    BlasMatrix<Field>      & C,
-			    const typename Field::Element            & alpha,
-			    const TransposedBlasMatrix<BlasMatrix<Field> >& A,
-			    const BlasMatrix<Field>& B) const
-		{
-			linbox_check( A.getMatrix().rowdim() == B.rowdim());
-			linbox_check( C.rowdim() == A.getMatrix().coldim());
-			linbox_check( C.coldim() == B.coldim());
-
-			FFLAS::fgemm((typename Field::Father_t) F, FFLAS::FflasTrans, FFLAS::FflasNoTrans,
-				      C.rowdim(), C.coldim(), B.rowdim(),
-				      alpha,
-				      A.getMatrix().getPointer(), A.getMatrix().getStride(),
-				      B.getPointer(), B.getStride(),
-				      beta,
-				      C.getPointer(), C.getStride());
-			return C;
-		}
-	};
-
-	template<class Field>
-	class 	BlasMatrixDomainMulAdd<Field,
-		BlasMatrix<Field>,
-		TransposedBlasMatrix<BlasMatrix<Field> >,
-		TransposedBlasMatrix<BlasMatrix<Field> > > {
-	public:
-		BlasMatrix<Field>&
-		operator()(const Field                              & F,
-			   BlasMatrix<Field>      & D,
-			   const typename Field::Element            & beta,
-			   const BlasMatrix<Field>& C,
-			   const typename Field::Element            & alpha,
-			   const TransposedBlasMatrix<BlasMatrix<Field> >& A,
-			   const TransposedBlasMatrix<BlasMatrix<Field> >& B) const
-		{
-			linbox_check( A.getMatrix().rowdim() == B.getMatrix().coldim());
-			linbox_check( C.rowdim() == A.getMatrix().coldim());
-			linbox_check( C.coldim() == B.getMatrix().rowdim());
-			linbox_check( D.rowdim() == C.rowdim());
-			linbox_check( D.coldim() == C.coldim());
-
-			D=C;
-			// linbox_check(D.getPointer() != C.getPointer());
-
-			FFLAS::fgemm((typename Field::Father_t) F, FFLAS::FflasTrans, FFLAS::FflasTrans,
-				      C.rowdim(), C.coldim(), A.getMatrix().rowdim(),
-				      alpha,
-				      A.getMatrix().getPointer(), A.getMatrix().getStride(),
-				      B.getMatrix().getPointer(), B.getMatrix().getStride(),
-				      beta,
-				      D.getPointer(), D.getStride());
-			return D;
-		}
-
-
-		BlasMatrix<Field>&
-		operator() (const Field                              & F,
-			    const typename Field::Element            & beta,
-			    BlasMatrix<Field>      & C,
-			    const typename Field::Element            & alpha,
-			    const TransposedBlasMatrix<BlasMatrix<Field> >& A,
-			    const TransposedBlasMatrix<BlasMatrix<Field> >& B) const
-		{
-			linbox_check( A.getMatrix().rowdim() == B.getMatrix().coldim());
-			linbox_check( C.rowdim() == A.getMatrix().coldim());
-			linbox_check( C.coldim() == B.getMatrix().rowdim());
-
-			FFLAS::fgemm((typename Field::Father_t) F, FFLAS::FflasTrans, FFLAS::FflasTrans,
-				      C.rowdim(), C.coldim(), A.getMatrix().rowdim(),
-				      alpha,
-				      A.getMatrix().getPointer(), A.getMatrix().getStride(),
-				      B.getMatrix().getPointer(), B.getMatrix().getStride(),
-				      beta,
-				      C.getPointer(), C.getStride());
-			return C;
-		}
-	};
-
-	template<class Field>
-	class 	BlasMatrixDomainMulAdd<Field,
-		BlasMatrix<Field>,
-		BlasMatrix<Field>,
-		TransposedBlasMatrix<BlasMatrix<Field> > > {
-	public:
-		BlasMatrix<Field>&
-		operator()(const Field                              & F,
-			   BlasMatrix<Field>      & D,
-			   const typename Field::Element            & beta,
-			   const BlasMatrix<Field>& C,
-			   const typename Field::Element            & alpha,
-			   const BlasMatrix<Field>& A,
-			   const TransposedBlasMatrix<BlasMatrix<Field> >& B) const
-		{
-			linbox_check( A.coldim() == B.getMatrix().coldim());
-			linbox_check( C.rowdim() == A.rowdim());
-			linbox_check( C.coldim() == B.getMatrix().rowdim());
-			linbox_check( D.rowdim() == C.rowdim());
-			linbox_check( D.coldim() == C.coldim());
-
-			D=C;
-			FFLAS::fgemm((typename Field::Father_t) F, FFLAS::FflasNoTrans, FFLAS::FflasTrans,
-				      C.rowdim(), C.coldim(), A.coldim(),
-				      alpha,
-				      A.getPointer(), A.getStride(),
-				      B.getMatrix().getPointer(), B.getMatrix().getStride(),
-				      beta,
-				      D.getPointer(), D.getStride());
-			return D;
-		}
-
-
-		BlasMatrix<Field>&
-		operator() (const Field                              & F,
-			    const typename Field::Element            & beta,
-			    BlasMatrix<Field>      & C,
-			    const typename Field::Element            & alpha,
-			    const BlasMatrix<Field>& A,
-			    const TransposedBlasMatrix<BlasMatrix<Field> >& B) const
-		{
-			linbox_check( A.coldim() == B.getMatrix().coldim());
-			linbox_check( C.rowdim() == A.rowdim());
-			linbox_check( C.coldim() == B.getMatrix().rowdim());
-
-			FFLAS::fgemm((typename Field::Father_t) F, FFLAS::FflasNoTrans, FFLAS::FflasTrans,
-				      C.rowdim(), C.coldim(), A.coldim(),
-				      alpha,
-				      A.getPointer(), A.getStride(),
-				      B.getMatrix().getPointer(), B.getMatrix().getStride(),
-				      beta,
-				      C.getPointer(), C.getStride());
-			return C;
-		}
-	};
-
-	/*
-	 * specialization for Operand1 and Operand3 of type std::vector<Element>
-	 * and Operand2 of type BlasMatrix<Field>
-	 */
-
-	//  general matrix-vector multiplication and addition with scaling
-	// d = beta.c + alpha.A*b
-	template<class Field>
-	class BlasMatrixDomainMulAdd<Field,std::vector<typename Field::Element>,BlasMatrix<Field>,std::vector<typename Field::Element> > {
-	public:
-		std::vector<typename Field::Element>& operator() (const Field& F,
-								  std::vector<typename Field::Element>& d,
-								  const typename Field::Element& beta,
-								  const std::vector<typename Field::Element>& c,
-								  const typename Field::Element& alpha,
-								  const BlasMatrix<Field>& A,
-								  const std::vector<typename Field::Element>& b) const
-		{
-			linbox_check( A.coldim() == b.size());
-			linbox_check( c.size()   == b.size());
-			linbox_check( d.size()   == c.size());
-			d=c;
-
-			FFLAS::fgemv((typename Field::Father_t) F, FFLAS::FflasNoTrans,
-				      A.rowdim(), A.coldim(),
-				      alpha,
-				      A.getPointer(), A.getStride(),
-				      &b[0],1,
-				      beta,
-				      &d[0],1);
-			return d;
-		}
-
-
-		std::vector<typename Field::Element>& operator() (const Field& F,
-								  const typename Field::Element& beta,
-								  std::vector<typename Field::Element>& c,
-								  const typename Field::Element& alpha,
-								  const BlasMatrix<Field>& A,
-								  const std::vector<typename Field::Element>& b) const
-		{
-			linbox_check( A.coldim() == b.size());
-			linbox_check( A.rowdim() == c.size()); //fixed: dpritcha
-
-			FFLAS::fgemv((typename Field::Father_t) F, FFLAS::FflasNoTrans,
-				      A.rowdim(), A.coldim(),
-				      alpha,
-				      A.getPointer(), A.getStride(),
-				      &b[0],1,
-				      beta,
-				      &c[0],1);
-			return c;
-		}
-	};
-
-	//  general vector-matrix multiplication and addition with scaling
-	// d = beta.c + alpha.a*B -- note order of coldim, rowdim passed to fgemv is switched
-	template<class Field>
-	class BlasMatrixDomainMulAdd<Field,std::vector<typename Field::Element>,std::vector<typename Field::Element>,BlasMatrix<Field> > {
-	public:
-		std::vector<typename Field::Element>& operator() (const Field& F,
-								  std::vector<typename Field::Element>& d,
-								  const typename Field::Element& beta,
-								  const std::vector<typename Field::Element>& c,
-								  const typename Field::Element& alpha,
-								  const std::vector<typename Field::Element>& a,
-								  const BlasMatrix<Field>& B) const
-		{
-			linbox_check( B.rowdim() == a.size());
-			linbox_check( B.coldim() == c.size());
-			linbox_check( d.size()   == c.size());
-			d=c;
-
-			FFLAS::fgemv((typename Field::Father_t) F, FFLAS::FflasTrans,
-				      B.rowdim(), B.coldim(),
-				      alpha,
-				      B.getPointer(), B.getStride(),
-				      &a[0],1,
-				      beta,
-				      &d[0],1);
-			return d;
-		}
-
-
-		std::vector<typename Field::Element>& operator() (const Field& F,
-								  const typename Field::Element& beta,
-								  std::vector<typename Field::Element>& c,
-								  const typename Field::Element& alpha,
-								  const std::vector<typename Field::Element>& a,
-								  const BlasMatrix<Field>& B) const
-		{
-			linbox_check( B.rowdim() == a.size());
-			linbox_check( B.coldim() == c.size());
-
-			FFLAS::fgemv((typename Field::Father_t) F, FFLAS::FflasTrans,
-				      B.rowdim(), B.coldim(),
-				      alpha,
-				      B.getPointer(), B.getStride(),
-				      &a[0],1,
-				      beta,
-
-				      &c[0],1);
-			return c;
-		}
-	};
-
-
-	/*
-	 * Specialization for Operand1, Operand2  of type BlasMatrix<Field>
-	 * and Operand3 of type BlasPermutation
-	 */
-
-	// Matrix permutation product C = A*B
-	template<class Field>
-	class BlasMatrixDomainMul<Field,BlasMatrix<Field>,BlasMatrix<Field>, BlasPermutation<size_t> > {
-	public:
-		BlasMatrix<Field>& operator()(const Field& F,
-								BlasMatrix<Field>& C,
-								const BlasMatrix<Field>& A,
-								const BlasPermutation<size_t>& B) const
-		{
-			C = A;
-			return BlasMatrixDomainMulin<Field,BlasMatrix<Field>,BlasPermutation<size_t> >()( F, C, B);
-		}
-	};
-
-	template<class Field>
-	class BlasMatrixDomainMul<Field,BlasMatrix<Field>, BlasPermutation<size_t>,BlasMatrix<Field> > {
-	public:
-		BlasMatrix<Field>& operator()(const Field& F,
-								BlasMatrix<Field>& C,
-								const BlasPermutation<size_t>& B,
-								const BlasMatrix<Field>& A) const
-		{
-			C = A;
-			return BlasMatrixDomainMulin<Field,BlasMatrix<Field>,BlasPermutation<size_t> >()( F, B, C);
-		}
-	};
-
-	/*
-	 * specialization for Operand1, Operand2  of type BlasMatrix<Field> and Operand3 of type TransposedBlasMatrix<BlasPermutation<size_t> >
-	 */
-
-	// Matrix permutation product C = A*B
-	template<class Field>
-	class BlasMatrixDomainMul<Field,BlasMatrix<Field>,BlasMatrix<Field>, TransposedBlasMatrix<BlasPermutation<size_t> > > {
-	public:
-		BlasMatrix<Field>& operator()(const Field& F,
-								BlasMatrix<Field>& C,
-								const BlasMatrix<Field>& A,
-								const TransposedBlasMatrix<BlasPermutation<size_t> >& B) const
-		{
-			C = A;
-			return BlasMatrixDomainMulin<Field,BlasMatrix<Field>,TransposedBlasMatrix<BlasPermutation<size_t> > >()( F, C, B);
-		}
-	};
-
-	template<class Field>
-	class BlasMatrixDomainMul<Field,BlasMatrix<Field>, TransposedBlasMatrix<BlasPermutation<size_t> >,BlasMatrix<Field> > {
-	public:
-		BlasMatrix<Field>& operator()(const Field& F,
-								BlasMatrix<Field>& C,
-								const TransposedBlasMatrix<BlasPermutation<size_t> >& B,
-								const BlasMatrix<Field>& A) const
-		{
-			C = A;
-			return BlasMatrixDomainMulin<Field,BlasMatrix<Field>,TransposedBlasMatrix<BlasPermutation<size_t> > >()( F, B, C);
-		}
-	};
-
-	/*
-	 * specialization for Operand1 of type BlasMatrix<Field> and Operand2 of type BlasPermutation
-	 */
-
-	// In-place matrix permutation product
-	template<class Field>
-	class BlasMatrixDomainMulin<Field,BlasMatrix<Field>, BlasPermutation<size_t> > {
-	public:
-		BlasMatrix<Field>& operator()( const Field& F,
-								 BlasMatrix<Field>& A,
-								 const BlasPermutation<size_t>& B) const
-		{
-			if (B.isIdentity()) return A ;
-			linbox_check( A.coldim() >= B.getSize() );
-			FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
-					A.rowdim(), 0,(int) B.getOrder(),
-					A.getPointer(), A.getStride(), B.getPointer() );
-			return A;
-		}
-
-		BlasMatrix<Field>& operator()( const Field& F,
-								 const BlasPermutation<size_t>& B,
-								 BlasMatrix<Field>& A) const
-		{
-			if (B.isIdentity()) return A ;
-			linbox_check( A.rowdim() >= B.getSize() );
-			FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
-					A.coldim(), 0,(int) B.getOrder(), A.getPointer(), A.getStride(), B.getPointer() );
-			return A;
-		}
-
-	};
-
-	template<class Field>
-	class BlasMatrixDomainMulin<Field,BlasMatrix<Field>, TransposedBlasMatrix<BlasPermutation<size_t> > > {
-	public:
-		BlasMatrix<Field>& operator()( const Field& F,
-								 BlasMatrix<Field>& A,
-								 const TransposedBlasMatrix<BlasPermutation<size_t> >& B) const
-		{
-			if (B.getMatrix().isIdentity()) return A ;
-			linbox_check( A.coldim() >= B.getMatrix().getSize() );
-			FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasRight, FFLAS::FflasTrans,
-					A.rowdim(), 0,(int) B.getMatrix().getOrder(),
-					A.getPointer(), A.getStride(), B.getMatrix().getPointer() );
-			return A;
-		}
-		BlasMatrix<Field>& operator()(  const Field& F,
-								  const TransposedBlasMatrix<BlasPermutation<size_t> >& B,
-								  BlasMatrix<Field>& A) const
-		{
-			if (B.getMatrix().isIdentity()) return A ;
-			linbox_check( A.rowdim() >= B.getMatrix().getSize() );
-			FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasLeft, FFLAS::FflasTrans,
-					A.coldim(), 0,(int) B.getMatrix().getOrder(), A.getPointer(), A.getStride(), B.getMatrix().getPointer() );
-			return A;
-		}
-	};
-
-
-
-	/*
-	 * specialization for Operand1, Operand2  of type std::vector<Element> and Operand3 of type BlasPermutation
-	 */
-
-	// Matrix permutation product C = A*B
-	template<class Field>
-	class BlasMatrixDomainMul<Field,std::vector< typename Field::Element>,std::vector< typename Field::Element>, BlasPermutation<size_t> > {
-	public:
-		std::vector< typename Field::Element>& operator()(const Field& F,
-								  std::vector< typename Field::Element>& C,
-								  const std::vector< typename Field::Element>& A,
-								  const BlasPermutation<size_t>& B) const
-		{
-			C = A;
-			return BlasMatrixDomainMulin<Field,std::vector< typename Field::Element>,BlasPermutation<size_t> >()( F, C, B);
-		}
-	};
-
-	template<class Field>
-	class BlasMatrixDomainMul<Field,std::vector< typename Field::Element>, BlasPermutation<size_t>,std::vector< typename Field::Element> > {
-	public:
-		std::vector< typename Field::Element>& operator()(const Field& F,
-								  std::vector< typename Field::Element>& C,
-								  const BlasPermutation<size_t>& B,
-								  const std::vector< typename Field::Element>& A) const
-		{
-			C = A;
-			return BlasMatrixDomainMulin<Field,std::vector< typename Field::Element>,BlasPermutation<size_t> >()( F, B, C);
-		}
-	};
-
-	/*
-	 * specialization for Operand1, Operand2  of type std::vector<Element> and Operand3 of type TransposedBlasMatrix<BlasPermutation<size_t> >
-	 */
-
-	// Matrix permutation product C = A*B
-	template<class Field>
-	class BlasMatrixDomainMul<Field,std::vector< typename Field::Element>,std::vector< typename Field::Element>, TransposedBlasMatrix<BlasPermutation<size_t> > > {
-	public:
-		std::vector< typename Field::Element>& operator()(const Field& F,
-								  std::vector< typename Field::Element>& C,
-								  const std::vector< typename Field::Element>& A,
-								  const TransposedBlasMatrix<BlasPermutation<size_t> >& B) const
-		{
-			C = A;
-			return BlasMatrixDomainMulin<Field,std::vector< typename Field::Element>,TransposedBlasMatrix<BlasPermutation<size_t> > >()( F, C, B);
-		}
-	};
-
-	template<class Field>
-	class BlasMatrixDomainMul<Field,std::vector< typename Field::Element>, TransposedBlasMatrix<BlasPermutation<size_t> >,std::vector< typename Field::Element> > {
-	public:
-		std::vector< typename Field::Element>& operator()(const Field& F,
-								  std::vector< typename Field::Element>& C,
-								  const TransposedBlasMatrix<BlasPermutation<size_t> >& B,
-								  const std::vector< typename Field::Element>& A) const
-		{
-			C = A;
-			return BlasMatrixDomainMulin<Field,std::vector< typename Field::Element>,TransposedBlasMatrix<BlasPermutation<size_t> > >()( F, B, C);
-		}
-	};
-
-	/*
-	 * specialization for Operand1 of type std::vector<Element> and Operand2 of type BlasPermutation
-	 */
-
-	// In-place matrix permutation product
-	template<class Field>
-	class BlasMatrixDomainMulin<Field,std::vector< typename Field::Element>, BlasPermutation<size_t> > {
-	public:
-		std::vector< typename Field::Element>& operator()( const Field& F,
-								   std::vector< typename Field::Element>& A,
-								   const BlasPermutation<size_t>& B) const
-		{
-			if (B.isIdentity()) return A ;
-			linbox_check( A.size() == B.getSize() );
-			FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
-					1, 0,(int) B.getOrder(), &A[0], 1, B.getPointer() );
-			return A;
-		}
-
-		std::vector< typename Field::Element>& operator()( const Field& F,
-								   const BlasPermutation<size_t>& B,
-								   std::vector< typename Field::Element>& A) const
-		{
-			if (B.isIdentity()) return A ;
-			linbox_check( A.size() >= B.getSize() );
-			FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
-					1, 0,(int) B.getOrder(), &A[0], 1, B.getPointer() );
-			return A;
-		}
-
-	};
-
-	template<class Field>
-	class BlasMatrixDomainMulin<Field,std::vector< typename Field::Element>, TransposedBlasMatrix<BlasPermutation<size_t> > > {
-	public:
-		std::vector< typename Field::Element>& operator()( const Field& F,
-								   std::vector< typename Field::Element>& A,
-								   const TransposedBlasMatrix<BlasPermutation<size_t> >& B) const
-		{
-			if (B.getMatrix().isIdentity()) return A ;
-			linbox_check( A.size() >= B.getMatrix().getSize() );
-			FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasRight, FFLAS::FflasTrans,
-					1, 0,(int) B.getMatrix().getOrder(),
-					&A[0], 1, B.getMatrix().getPointer() );
-			return A;
-		}
-		std::vector< typename Field::Element>& operator()(  const Field& F,
-								    const TransposedBlasMatrix<BlasPermutation<size_t> >& B,
-								    std::vector< typename Field::Element>& A) const
-		{
-			if (B.getMatrix().isIdentity()) return A ;
-			linbox_check( A.size() >= B.getMatrix().getSize() );
-			FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasLeft, FFLAS::FflasTrans,
-					1, 0,(int) B.getMatrix().getOrder(), &A[0], 1, B.getMatrix().getPointer() );
-			return A;
-		}
-	};
-
-	/*
-	 * specialization for Operand1 of type BlasMatrix<Field> and Operand2
-	 * of type TriangularBlasMatrix<Field>
-	 */
-
-	// Matrix/Triangular product C = A*B
-	template<class Field>
-	class BlasMatrixDomainMul<Field,BlasMatrix<Field>,BlasMatrix<Field>, TriangularBlasMatrix<Field> > {
-	public:
-		BlasMatrix<Field>& operator()(const Field& F,
-								BlasMatrix<Field>& C,
-								const BlasMatrix<Field>& A,
-								const TriangularBlasMatrix<Field>& B) const
-		{
-			C = A;
-			return BlasMatrixDomainMulin<Field,BlasMatrix<Field>,TriangularBlasMatrix<Field> >()( F, C, B);
-		}
-	};
-
-	template<class Field>
-	class BlasMatrixDomainMul<Field,BlasMatrix<Field>, TriangularBlasMatrix<Field>,BlasMatrix<Field> > {
-	public:
-		BlasMatrix<Field>& operator()(const Field& F,
-								BlasMatrix<Field>& C,
-								const TriangularBlasMatrix<Field>& B,
-								const BlasMatrix<Field>& A) const
-		{
-			C = A;
-			return BlasMatrixDomainMulin<Field,BlasMatrix<Field>,TriangularBlasMatrix<Field> >()( F, B, C);
-		}
-	};
-
-	/*
-	 * specialization for Operand1 of type BlasMatrix<Field> and Operand2 of type TriangularBlasMatrix<Field>
-	 */
-
-	// In-place matrix*triangular matrix product
-	template<class Field>
-	class BlasMatrixDomainMulin<Field,BlasMatrix<Field>,
-	      TriangularBlasMatrix<Field> >{
-	public:
-		BlasMatrix<Field>& operator()( const Field& F,
-								 BlasMatrix<Field>& A,
-								 const TriangularBlasMatrix<Field>& B) const
-		{
-			typename Field::Element one;
-			F.init(one, 1UL);
-			linbox_check( A.coldim() == B.rowdim() );
-
-			FFLAS::ftrmm((typename Field::Father_t) F, FFLAS::FflasRight, (FFLAS::FFLAS_UPLO) (B.getUpLo()),
-				      FFLAS::FflasNoTrans,(FFLAS::FFLAS_DIAG) (B.getDiag()),
-				      A.rowdim(), A.coldim(), one,
-				      B.getPointer(), B.getStride(), A.getPointer(), A.getStride() );
-			return A;
-		}
-
-		BlasMatrix<Field>& operator()( const Field& F,
-								 const TriangularBlasMatrix<Field>& B,
-								 BlasMatrix<Field>& A) const
-		{
-			linbox_check( B.coldim() == A.rowdim() );
-			typename Field::Element one;
-			F.init(one, 1UL);
-			FFLAS::ftrmm((typename Field::Father_t) F, FFLAS::FflasLeft, (FFLAS::FFLAS_UPLO)(B.getUpLo()),
-				      FFLAS::FflasNoTrans, (FFLAS::FFLAS_DIAG) (B.getDiag()),
-				      A.rowdim(), A.coldim(), one,
-				      B.getPointer(), B.getStride(),
-				      A.getPointer(), A.getStride() );
-			return A;
-		}
-	};
-
-
-	/*! @internal In-place matrix*triangular matrix product with transpose.
-	 */
-	template<class Field>
-	class BlasMatrixDomainMulin<Field,BlasMatrix<Field>,
-	      TransposedBlasMatrix<TriangularBlasMatrix<Field> > >{
-	public:
-		BlasMatrix<Field>& operator()( const Field& F,
-								 BlasMatrix<Field>& A,
-								 const TransposedBlasMatrix< TriangularBlasMatrix<Field> >& B) const
-		{
-			typename Field::Element one;
-			F.init(one, 1UL);
-			linbox_check( B.getMatrix().coldim() == A.coldim() );
-
-			FFLAS::ftrmm((typename Field::Father_t) F, FFLAS::FflasRight,
-				      (FFLAS::FFLAS_UPLO)(B.getMatrix().getUpLo()),
-				      FFLAS::FflasTrans,
-				      (FFLAS::FFLAS_DIAG) (B.getMatrix().getDiag()),
-				      A.rowdim(), A.coldim(),
-				      one,
-				      B.getMatrix().getPointer(), B.getMatrix().getStride(),
-				      A.getPointer(), A.getStride() );
-			return A;
-		}
-
-		BlasMatrix<Field>& operator()( const Field& F,
-								 const TransposedBlasMatrix< TriangularBlasMatrix<Field> >& B,
-								 BlasMatrix<Field>& A) const
-		{
-			linbox_check( B.getMatrix().coldim() == A.rowdim() );
-			typename Field::Element one;
-			F.init(one, 1UL);
-			FFLAS::ftrmm((typename Field::Father_t) F, FFLAS::FflasLeft,
-				      (FFLAS::FFLAS_UPLO) (B.getMatrix().getUpLo()),
-				      FFLAS::FflasTrans,
-				      (FFLAS::FFLAS_DIAG) (B.getMatrix().getDiag()),
-				      A.rowdim(), A.coldim(), one,
-				      B.getMatrix().getPointer(), B.getMatrix().getStride(),
-				      A.getPointer(), A.getStride() );
-			return A;
-		}
-	};
-
-
-
-	/*
-	 * specialization for Operand1 of type TriangularBlasMatrix<Field> and Operand2 of type BlasPermutation
-	 */
-
-	// Matrix permutation product C = A*B
-	template<class Field>
-	class BlasMatrixDomainMul<Field,BlasMatrix<Field>,TriangularBlasMatrix<Field>, BlasPermutation<size_t> > {
-	public:
-		BlasMatrix<Field>& operator()(const Field& F,
-								BlasMatrix<Field>& C,
-								const TriangularBlasMatrix<Field>& A,
-								const BlasPermutation<size_t>& B) const
-		{
-			C = A;
-			return BlasMatrixDomainMulin<Field,BlasMatrix<Field>,BlasPermutation<size_t> >()( F, C, B);
-		}
-	};
-
-	template<class Field>
-	class BlasMatrixDomainMul<Field,BlasMatrix<Field>, BlasPermutation<size_t>,TriangularBlasMatrix<Field> > {
-	public:
-		BlasMatrix<Field>& operator()(const Field& F,
-								BlasMatrix<Field>& C,
-								const BlasPermutation<size_t>& B,
-								const TriangularBlasMatrix<Field>& A) const
-		{
-			C = A;
-			return BlasMatrixDomainMulin<Field,BlasMatrix<Field>,BlasPermutation<size_t> >()( F, B, C);
-		}
-	};
-
-	/*
-	 * Specialization for Operand of type BlasMatrix<Field>
-	 */
-
-	template <class Field>
-	class BlasMatrixDomainLeftSolve<Field,BlasMatrix<Field>,BlasMatrix<Field> > {
-	public:
-		BlasMatrix<Field>& operator() (const Field& F,
-								 BlasMatrix<Field>& X,
-								 const BlasMatrix<Field>& A,
-								 const BlasMatrix<Field>& B) const
-		{
-			LQUPMatrix<Field> LQUP(A);
-			LQUP.left_solve(X,B);
-			return X;
-		}
-
-
-		BlasMatrix<Field>& operator() (const Field& F,
-								 const BlasMatrix<Field>& A,
-								 BlasMatrix<Field>& B) const
-		{
-			LQUPMatrix<Field> LQUP(A);
-			LQUP.left_solve(B);
-			return B;
-		}
-	};
-
-	template <class Field>
-	class BlasMatrixDomainRightSolve<Field,BlasMatrix<Field>,BlasMatrix<Field> > {
-	public:
-		BlasMatrix<Field>& operator() (const Field& F,
-								 BlasMatrix<Field>& X,
-								 const BlasMatrix<Field>& A,
-								 const BlasMatrix<Field>& B) const
-		{
-			LQUPMatrix<Field> LQUP(A);
-			LQUP.right_solve(X,B);
-			return X;
-		}
-
-
-		BlasMatrix<Field>& operator() (const Field& F,
-								 const BlasMatrix<Field>& A,
-								 BlasMatrix<Field>& B) const
-		{
-			LQUPMatrix<Field> LQUP(A);
-			LQUP.right_solve(B);
-			return B;
-		}
-
-	};
-
-	template <class Field>
-	class BlasMatrixDomainRightSolve<Field,BlasSubmatrix<Field>,BlasSubmatrix<Field> > {
-	public:
-		BlasSubmatrix<Field>& operator() (const Field& F,
-								 BlasSubmatrix<Field>& X,
-								 const BlasSubmatrix<Field>& A,
-								 const BlasSubmatrix<Field>& B) const
-		{
-			LQUPMatrix<Field> LQUP(A);
-			LQUP.right_solve(X,B);
-			return X;
-		}
-
-
-		BlasSubmatrix<Field>& operator() (const Field& F,
-					       const BlasSubmatrix<Field>& A,
-					       BlasSubmatrix<Field>& B) const
-		{
-			LQUPMatrix<Field> LQUP(A);
-			LQUP.right_solve(B);
-			return B;
-		}
-
-	};
-
-	/*
-	 * Specialization for Operand of type std::vector<Element>
-	 */
-
-	template <class Field>
-	class BlasMatrixDomainLeftSolve<Field, std::vector<typename Field::Element>, BlasMatrix<Field> > {
-	public:
-		std::vector<typename Field::Element>& operator() (const Field& F,
-								  std::vector<typename Field::Element>& X,
-								  const BlasMatrix<Field>& A,
-								  const std::vector<typename Field::Element>& B) const
-		{
-			LQUPMatrix<Field> LQUP(A);
-			LQUP.left_solve(X,B);
-			return X;
-		}
-
-		std::vector<typename Field::Element>& operator()(const Field& F,
-								 const BlasMatrix<Field>& A,
-								 std::vector<typename Field::Element>& B) const
-		{
-			LQUPMatrix<Field> LQUP(A);
-			LQUP.left_solve(B);
-			return B;
-		}
-
-	};
-
-	template <class Field>
-	class BlasMatrixDomainRightSolve<Field, std::vector<typename Field::Element>, BlasMatrix<Field> > {
-	public:
-		std::vector<typename Field::Element>& operator() (const Field& F,
-								  std::vector<typename Field::Element>& X,
-								  const BlasMatrix<Field>& A,
-								  const std::vector<typename Field::Element>& B) const
-		{
-			LQUPMatrix<Field> LQUP(A);
-			LQUP.right_solve(X,B);
-			return X;
-		}
-
-		std::vector<typename Field::Element>& operator() (const Field& F,
-								  const BlasMatrix<Field>& A,
-								  std::vector<typename Field::Element>& B) const
-		{
-			LQUPMatrix<Field> LQUP(A);
-			LQUP.right_solve(B);
-			return B;
-		}
-
-	};
-
-
-	/*
-	 * ********************************************************
-	 * *** Specialization for TriangularBlasMatrix<Field> ***
-	 * ********************************************************
-	 */
-
-
-	/*
-	 * specialization for Operand of type BlasMatrix<Field>
-	 */
-
-	template <class Field>
-	class BlasMatrixDomainLeftSolve<Field, BlasMatrix<Field>,TriangularBlasMatrix<Field> > {
-	public:
-		BlasMatrix<Field>& operator() (const Field& F,
-								 BlasMatrix<Field>& X,
-								 const TriangularBlasMatrix<Field>& A,
-								 const BlasMatrix<Field>& B) const
-		{
-
-			linbox_check( X.rowdim() == B.rowdim());
-			linbox_check( X.coldim() == B.coldim());
-
-			typename BlasMatrix<Field>::ConstIterator  Biter =   B.Begin();
-			typename BlasMatrix<Field>::Iterator       Xiter =   X.Begin();
-
-			for (; Biter != B.End(); ++Biter,++Xiter)
-				F.assign(*Xiter,*Biter);
-
-			return (*this)(F,A,X);
-
-		}
-
-		BlasMatrix<Field>& operator() (const Field& F,
-								 const TriangularBlasMatrix<Field>& A,
-								 BlasMatrix<Field>& B) const
-		{
-			linbox_check( A.rowdim() == A.coldim());
-			linbox_check( A.coldim() == B.rowdim());
-			// typename Field::Element _One;
-			// F.init(_One,1UL);
-
-			FFLAS::ftrsm((typename Field::Father_t) F,
-				      FFLAS::FflasLeft, (FFLAS::FFLAS_UPLO) A.getUpLo(),
-				      FFLAS::FflasNoTrans,(FFLAS::FFLAS_DIAG) A.getDiag(),
-				      A.rowdim(), B.coldim(),
-				      F.one,A.getPointer(),A.getStride(),
-				      B.getPointer(),B.getStride());
-
-			return B;
-		}
-	};
-
-	template <class Field>
-	class BlasMatrixDomainRightSolve<Field,BlasMatrix<Field>, TriangularBlasMatrix<Field> > {
-	public:
-		BlasMatrix<Field>& operator() (const Field& F,
-								 BlasMatrix<Field>& X,
-								 const TriangularBlasMatrix<Field>& A,
-								 const BlasMatrix<Field>& B) const
-		{
-
-			linbox_check( X.rowdim() == B.rowdim());
-			linbox_check( X.coldim() == B.coldim());
-
-			typename BlasMatrix<Field>::ConstIterator  Biter =   B.Begin();
-			typename BlasMatrix<Field>::Iterator       Xiter =   X.Begin();
-
-			for (; Biter != B.End(); ++Biter,++Xiter)
-				F.assign(*Xiter,*Biter);
-
-			return (*this)(F,A,X);
-		}
-
-		BlasMatrix<Field>& operator() (const Field& F,
-								 const TriangularBlasMatrix<Field>& A,
-								 BlasMatrix<Field>& B) const
-		{
-
-			linbox_check( A.rowdim() == A.coldim());
-			linbox_check( B.coldim() == A.rowdim());
-			// typename Field::Element _One;
-			// F.init(_One,1UL);
-
-			FFLAS::ftrsm((typename Field::Father_t) F,
-				      FFLAS::FflasRight,(FFLAS::FFLAS_UPLO) A.getUpLo(),
-				      FFLAS::FflasNoTrans,(FFLAS::FFLAS_DIAG) A.getDiag() ,
-				      B.rowdim(), A.coldim(),
-				      F.one,A.getPointer(),A.getStride(),
-				      B.getPointer(),B.getStride());
-
-
-			return B;
-		}
-	};
-
-	template <class Field>
-	class BlasMatrixDomainRightSolve<Field,BlasSubmatrix<Field>, TriangularBlasMatrix<Field> > {
-	public:
-		BlasSubmatrix<Field>& operator() (const Field& F,
-						  BlasSubmatrix<Field>& X,
-						  const TriangularBlasMatrix<Field>& A,
-						  const BlasSubmatrix<Field>& B) const
-		{
-
-			linbox_check( X.rowdim() == B.rowdim());
-			linbox_check( X.coldim() == B.coldim());
-
-			typename BlasSubmatrix<Field>::ConstIterator  Biter =   B.Begin();
-			typename BlasSubmatrix<Field>::Iterator       Xiter =   X.Begin();
-
-			for (; Biter != B.End(); ++Biter,++Xiter)
-				F.assign(*Xiter,*Biter);
-
-			return (*this)(F,A,X);
-		}
-
-		BlasSubmatrix<Field>& operator() (const Field& F,
-						  const TriangularBlasMatrix<Field>& A,
-						  BlasSubmatrix<Field>& B) const
-		{
-
-			linbox_check( A.rowdim() == A.coldim());
-			linbox_check( B.coldim() == A.rowdim());
-			// typename Field::Element _One;
-			// F.init(_One,1UL);
-
-			FFLAS::ftrsm((typename Field::Father_t) F,
-				      FFLAS::FflasRight,(FFLAS::FFLAS_UPLO) A.getUpLo(),
-				      FFLAS::FflasNoTrans,(FFLAS::FFLAS_DIAG) A.getDiag() ,
-				      B.rowdim(), A.coldim(),
-				      F.one,A.getPointer(),A.getStride(),
-				      B.getPointer(),B.getStride());
-
-
-			return B;
-		}
-	};
-
-
-
-	/*
-	 * specialization for Operand of type std::vector<Element>
-	 */
-
-	template <class Field>
-	class BlasMatrixDomainLeftSolve<Field, std::vector<typename Field::Element>, TriangularBlasMatrix<Field> > {
-	public:
-		std::vector<typename Field::Element>& operator() (const Field& F,
-								  std::vector<typename Field::Element>& x,
-								  const TriangularBlasMatrix<Field>& A,
-								  const std::vector<typename Field::Element>& b) const
-		{
-
-			linbox_check (x.size() == b.size());
-			typename std::vector<typename Field::Element>::const_iterator biter = b.begin();
-			typename std::vector<typename Field::Element>::iterator       xiter = x.begin();
-			for (;biter!=b.end();++biter,++xiter)
-				F.assign(*xiter,*biter);
-
-			return (*this)(F,A,x);
-		}
-
-		std::vector<typename Field::Element>& operator() (const Field& F,
-								  const TriangularBlasMatrix<Field>& A,
-								  std::vector<typename Field::Element>& b) const
-		{
-
-			linbox_check( A.rowdim() == A.coldim());
-			linbox_check( A.rowdim() == b.size());
-
-			switch (A.getUpLo()) {
-			case LinBoxTag::Upper:
-				switch(A.getDiag()) {
-				case LinBoxTag::Unit:
-					FFLAS::ftrsv((typename Field::Father_t) F,
-						      FFLAS::FflasUpper,FFLAS::FflasNoTrans,FFLAS::FflasUnit,
-						      b.size(),A.getPointer(),A.getStride(),&b[0],1);
-					break;
-				case LinBoxTag::NonUnit:
-					FFLAS::ftrsv((typename Field::Father_t) F,
-						      FFLAS::FflasUpper,FFLAS::FflasNoTrans,FFLAS::FflasNonUnit,
-						      b.size(),A.getPointer(),A.getStride(),&b[0],1);
-					break;
-				default:
-					throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
-				}
-				break;
-			case LinBoxTag::Lower:
-				switch(A.getDiag()) {
-				case LinBoxTag::Unit:
-					FFLAS::ftrsv((typename Field::Father_t) F,
-						      FFLAS::FflasLower,FFLAS::FflasNoTrans,FFLAS::FflasUnit,
-						      b.size(),A.getPointer(),A.getStride(),&b[0],1);
-					break;
-				case LinBoxTag::NonUnit:
-					FFLAS::ftrsv((typename Field::Father_t) F,
-						      FFLAS::FflasLower,FFLAS::FflasNoTrans,FFLAS::FflasNonUnit,
-						      b.size(),A.getPointer(),A.getStride(),&b[0],1);
-					break;
-				default:
-					throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
-				}
-				break;
-			default:
-				throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
-
-			}
-			return b;
-		}
-	};
-
-	template <class Field>
-	class BlasMatrixDomainRightSolve<Field, std::vector<typename Field::Element>, TriangularBlasMatrix<Field> > {
-	public:
-		std::vector<typename Field::Element>& operator() (const Field& F,
-								  std::vector<typename Field::Element>& x,
-								  const TriangularBlasMatrix<Field>& A,
-								  const std::vector<typename Field::Element>& b) const
-		{
-
-			linbox_check (x.size() == b.size());
-			typename std::vector<typename Field::Element>::const_iterator biter = b.begin();
-			typename std::vector<typename Field::Element>::iterator       xiter = x.begin();
-			for (;biter!=b.end();++biter,++xiter)
-				F.assign(*xiter,*biter);
-
-			return (*this)(F,A,x);
-		}
-
-		std::vector<typename Field::Element>& operator() (const Field& F,
-								  const TriangularBlasMatrix<Field>& A,
-								  std::vector<typename Field::Element>& b) const
-		{
-
-			linbox_check( A.rowdim() == A.coldim());
-			linbox_check( A.coldim() == b.size());
-
-
-			switch (A.getUpLo()) {
-			case LinBoxTag::Upper:
-				switch(A.getDiag()) {
-				case LinBoxTag::Unit:
-					FFLAS::ftrsv( (typename Field::Father_t)F,
-						      FFLAS::FflasUpper, FFLAS::FflasTrans, FFLAS::FflasUnit,
-						      b.size(),A.getPointer(),A.getStride(),&b[0],1);
-					break;
-				case LinBoxTag::NonUnit:
-					FFLAS::ftrsv((typename Field::Father_t) F,
-						      FFLAS::FflasUpper,FFLAS::FflasTrans,FFLAS::FflasNonUnit,
-						      b.size(),A.getPointer(),A.getStride(),&b[0],1);
-					break;
-				default:
-					throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
-				}
-				break;
-			case LinBoxTag::Lower:
-				switch(A.getDiag()) {
-				case LinBoxTag::Unit:
-					FFLAS::ftrsv((typename Field::Father_t) F,
-						      FFLAS::FflasLower,FFLAS::FflasTrans,FFLAS::FflasUnit,
-						      b.size(),A.getPointer(),A.getStride(),&b[0],1);
-					break;
-				case LinBoxTag::NonUnit:
-					FFLAS::ftrsv( (typename Field::Father_t)F,
-						      FFLAS::FflasLower,FFLAS::FflasTrans,FFLAS::FflasNonUnit,
-						      b.size(),A.getPointer(),A.getStride(),&b[0],1);
-					break;
-				default:
-					throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
-				}
-				break;
-			default:
-				throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
-
-			}
-			return b;
-		}
-	};
-
-	template< class Field, class Polynomial>
-	class BlasMatrixDomainMinpoly< Field, Polynomial, BlasMatrix<Field> > {
-	public:
-		Polynomial& operator() (const Field &F, Polynomial& P, const BlasMatrix<Field>& A) const
-		{
-			commentator().start ("Modular Dense Minpoly ", "MDMinpoly");
-
-			size_t n = A.coldim();
-			linbox_check( n == A.rowdim());
-			typename Field::Element * X = new typename Field::Element[n*(n+1)];
-			size_t *Perm = new size_t[n];
-			for ( size_t i=0; i<n; ++i)
-				Perm[i] = 0;
-			// (typename Field::Father_t)
-			FFPACK::MinPoly<Field,Polynomial>(  F, P, n, A.getPointer(), A.getStride(), X, n, Perm);
-			commentator().report(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION) << "minpoly with " << P.size() << " coefficients" << std::endl;
-
-			delete[] Perm;
-			delete[] X;
-			commentator().stop ("done",NULL,"MDMinpoly");
-			return P;
-		}
-	};
-
-// #if !defined(__INTEL_COMPILER) && !defined(__CUDACC__) && !defined(__clang__)
-	// template <>
-// #endif
-	template< class Field,  class ContPol >
-	class BlasMatrixDomainCharpoly< Field,  ContPol, BlasMatrix<Field> > {
-	public:
-		ContPol& operator() ( const Field                                	&F,
-				      ContPol                     			&P,
-				      const BlasMatrix<Field> 	&A) const
-		{
-
-			size_t n = A.coldim();
-			P.clear();
-			linbox_check( n == A.rowdim());
-			FFPACK::CharPoly((typename Field::Father_t) F, P, n, A.getPointer(), A.getStride());
-			return P;
-		}
-	};
-
-} //end of namespace LinBox
-
-#endif // __LINBOX_blas_matrix_domain_INL
-
-
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
-
diff --git a/linbox/algorithms/block-coppersmith-domain.h b/linbox/algorithms/block-coppersmith-domain.h
new file mode 100644
index 0000000..3c4cb1f
--- /dev/null
+++ b/linbox/algorithms/block-coppersmith-domain.h
@@ -0,0 +1,875 @@
+/* linbox/algorithms/block-coppersmith-domain.h
+ * Copyright (C) 2012 George Yuhasz
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+
+#ifndef __LINBOX_coppersmith_block_domain_H
+#define __LINBOX_coppersmith_block_domain_H
+
+#include <vector>
+#include <iostream>
+#include <algorithm>
+#include <iomanip>
+
+#include "linbox/util/timer.h"
+
+#include "givaro/givtimer.h"
+#if defined(__LINBOX_USE_OPENMP) and defined(__GIVARO_USE_OPENMP)
+#include <omp.h>
+namespace LinBox {
+    typedef Givaro::OMPTimer CTimer;
+}
+#else
+namespace LinBox {
+    typedef Givaro::Timer CTimer;
+}
+#endif
+
+#include "linbox/util/commentator.h"
+
+#define DEFAULT_BLOCK_EARLY_TERM_THRESHOLD 10
+//Preprocessor variables for the state of BM_iterators
+#define DeltaExceeded  4
+#define SequenceExceeded  3
+#define GeneratorFound  2
+#define GeneratorUnconfirmed  1
+
+namespace LinBox
+{
+	double g_time1=0.0,g_time2=0.0,g_time3=0.0,g_time4=0.0;
+    /** Compute the linear generator of a sequence of matrices.
+     *
+     * This class encapsulates the functionality required for computing
+     * the block minimal polynomial of a matrix.
+     * @bib
+     * Yuhasz thesis ...
+     */
+    template<class _Domain, class _Sequence>
+    class BlockCoppersmithDomain {
+
+    public:
+	typedef _Domain				Domain;
+        typedef typename Domain::Field           Field;
+        typedef typename Domain::Element       Element;
+        typedef _Sequence                     Sequence;
+        typedef typename Domain::OwnMatrix    Coefficient;
+        typedef typename Domain::Matrix         Sub;
+
+
+    protected:
+        Sequence                          *_container;
+        const Domain                      *_MD;
+        unsigned long            EARLY_TERM_THRESHOLD;
+
+
+    public:
+
+        BlockCoppersmithDomain (const BlockCoppersmithDomain<Field,
+Sequence> &Mat, unsigned long ett_default =
+DEFAULT_BLOCK_EARLY_TERM_THRESHOLD) :
+            _container(Mat._container), _MD(Mat._MD),
+            EARLY_TERM_THRESHOLD (ett_default)
+        {}
+        BlockCoppersmithDomain (const Domain& MD, Sequence *D, unsigned long ett_default
+= DEFAULT_BLOCK_EARLY_TERM_THRESHOLD) :
+            _container(D), _MD(&MD),
+EARLY_TERM_THRESHOLD (ett_default)
+        {}
+
+	//matrix domain
+        const Domain &domain    () const { return *_MD; }
+
+        // field of the domain
+        const Field &field    () const { return domain().field(); }
+        const Field &getField    () const { return domain().field(); } // deprecated
+
+        // sequence of the domain
+        Sequence *getSequence () const
+        { return _container; }
+
+        // the principal function
+        std::vector<size_t>  right_minpoly (std::vector<Coefficient> &P);
+
+        // left minimal generating polynomial of the sequence
+        // This _MAY_ get defined eventually.
+        std::vector<size_t> & left_minpoly (std::vector<Coefficient> &P);
+        // { /* transpose seq and transpose result*/ }
+
+        // For compatibility with massey-domain (element sequence case).
+        std::vector<size_t> /* & */ operator()(std::vector<Coefficient> &P)
+        {
+		return right_minpoly(P);
+		}
+
+
+    private:
+
+        // bm-seq.h stuff can go here.
+	class BM_Seq {
+
+	public:
+
+		typedef typename std::list<Coefficient>::const_iterator const_iterator;
+		typedef int size_type;
+
+		inline const Domain &domain() const { return *_MD;}
+		inline const Field &field() const {return domain().field();}
+
+	private:
+		const Domain *_MD;
+		std::list<Coefficient> _seq;
+		size_type _size;
+		size_t _row, _col;
+
+	public:
+		BM_Seq(const Domain & MD, size_t r, size_t c) : _MD(&MD)
+		{
+			_row = r;
+			_col = c;
+			_size = 0;
+		}
+		BM_Seq(const Domain & MD, size_t r) : _MD(&MD)
+		{
+			_row = r;
+			_col = r;
+			_size = 0;
+		}
+		BM_Seq(const Domain &MD, int n, Coefficient& M) : _MD(&MD),  _seq(n, M), _size(n)
+		{
+			_row = M.rowdim();
+			_col = M.coldim();
+		}
+
+		BM_Seq() {}
+
+		BM_Seq(const BM_Seq& S) :
+			 _MD(S._MD), _seq(S._seq), _size(S._size), _row(S._row), _col(S._col)
+		{}
+
+		BM_Seq & operator=(const BM_Seq& S)
+		{
+			if(this != &S){
+				(*this)._size = S._size;
+				(*this)._row = S._row;
+				(*this)._col = S._col;
+				(*this)._MD = S._MD;
+				_seq.clear();
+				for(typename std::list<Coefficient>::const_iterator it = S._seq.begin(); it != S._seq.end(); ++it)
+					_seq.push_back(*it);
+			}
+			return *this;
+		}
+
+
+		size_t rowdim()
+		{
+			return _row;
+		}
+
+		size_t coldim()
+		{
+			return _col;
+		}
+
+		const_iterator begin() const
+		{
+			return _seq.begin();
+		}
+
+		const_iterator end() const
+		{
+			return _seq.end();
+		}
+
+		void push_back(const Coefficient &M)
+		{
+			if(_row==M.rowdim() && _col==M.coldim()){
+				_seq.push_back(M);
+				++_size;
+			}
+		}
+
+		bool operator==(const BM_Seq& l)
+		{
+			typename std::list<Coefficient>::const_iterator it, lit;
+			bool test = false;
+			if(_size==l._size && _row==l._row && _col==l._col){
+				test = true;
+				it = _seq.begin();
+				lit = l._seq.begin();
+				if(_size==0){
+					return test;
+				}
+				else{
+					while(test && it!=_seq.end()){
+						test = domain().areEqual(*it,*lit);
+						++it;
+						++lit;
+					}
+				}
+			}
+			return test;
+		}
+
+		bool operator!=(const BM_Seq& l)
+		{
+			return !(*this == l);
+		}
+
+		size_type size()
+		{
+			return _size;
+		}
+
+		class BM_iterator {
+		public:
+			typedef std::list<Coefficient> value_type;
+
+		private:
+			const Domain *_MD;
+			BM_Seq& _seq;
+			typename BM_Seq::size_type _size;
+			typename BM_Seq::size_type _t;
+			typename BM_Seq::const_iterator _seqel;
+			std::list<Coefficient> _gen;
+			std::vector<size_t> _deg;
+			size_t _delta;
+			size_t _mu;
+			size_t _beta;
+			size_t _sigma;
+			size_t _gensize;
+			size_t _row, _col;
+			size_t _ett;
+			size_t _etc;
+
+		public:
+			// This is an enumeration class that tells what state the berlekamp/massey algoithm iterator is in.
+			// The four states are:
+			// DeltaExceeded = 4
+			// SequenceExceeded = 3
+			// GeneratorFound = 2
+			// GeneratorUnconfirmed = 1
+			class TerminationState{
+			private:
+
+				int _state;
+				friend class BM_iterator;
+				TerminationState() : _state(GeneratorUnconfirmed) {}
+				TerminationState(int m) : _state(m) {}
+			public:
+				TerminationState(const TerminationState& t) : _state(t._state) {}
+				TerminationState & operator=(const TerminationState & t){
+					if(this != &t){
+						(*this)._state = t._state;
+					}
+					return *this;
+				}
+				bool IsGeneratorUnconfirmed(){
+					return _state==GeneratorUnconfirmed;
+				}
+				bool IsGeneratorFound()
+				{
+					return _state==GeneratorFound;
+				}
+				bool IsSequenceExceeded()
+				{
+					return _state==SequenceExceeded;
+				}
+				bool IsDeltaExceeded()
+				{
+					return _state==DeltaExceeded;
+				}
+			}; // TerminationState
+
+		private:
+			TerminationState _state;
+		public:
+			TerminationState state() const
+			{
+				return _state;
+			}
+			void setDelta(int d)
+			{
+				_delta=d;
+				if((/*  _delta < 0 ||*/ _beta < _delta - _sigma + _mu +1) && _state._state!=3){
+					if(_sigma <= _delta /*|| _delta < 0*/)
+						_state._state = GeneratorUnconfirmed;
+					else
+						_state._state = DeltaExceeded;
+				}
+				else{
+					if(_sigma > _delta)
+						_state._state = DeltaExceeded;
+					else
+						_state._state = GeneratorFound;
+				}
+			}
+			//field and matrix domain functions
+			inline const Domain &domain() const { return *_MD;}
+			inline const Field &field() const { return domain().field();}
+			//Constructor
+			explicit BM_iterator(BM_Seq& s,
+                                             unsigned long earlyTermThreshold=DEFAULT_BLOCK_EARLY_TERM_THRESHOLD,
+                                             typename BM_Seq::size_type elinit=0) :
+				 _MD(&s.domain()),  _seq(s)
+			{
+				_row = s.rowdim();
+				_col = s.coldim();
+				_size = _seq.size();
+				_t = elinit;
+				_delta = (size_t)-1; // BB: is it meant ?
+				_seqel = _seq.begin();
+				_deg = std::vector<size_t>(_row+_col);
+                                _ett=earlyTermThreshold;
+                                _etc=0;
+				for(size_t i = _col; i < _row+_col; ++i)
+					_deg[i] = 1;
+				Coefficient gen1(field(),_col,_row+_col);
+				for(size_t i = 0; i<_col; ++i)
+					gen1.setEntry(i,i,field().one);
+				_gen.push_back(gen1);
+				_gensize = 1;
+				if(_size==0 || _t==_size)
+					_state._state = SequenceExceeded;
+				_sigma = 0;
+				_mu = 0;
+				_beta = 1;
+			}
+
+			//Copy constructor
+			BM_iterator(const BM_Seq::BM_iterator & it) :
+				_MD(&it.domain()), _seq(it._seq), _size(it._size), _t(it._t),
+				_seqel(it._seqel), _gen(it._gen), _deg(it._deg),
+				_delta(it._delta), _mu(it._mu), _beta(it._beta),
+				_sigma(it._sigma), _gensize(it._gensize),
+				_row(it._row), _col(it._col),
+				_ett(it._ett), _etc(it._etc), _state(it._state) {}
+
+
+			//Assignment operator not overloaded since BlasMatrix class has overloaded assignment error
+			//Overloaded assignment operator
+			BM_iterator& operator=(const typename BM_Seq::BM_iterator& it)
+			{
+				if(this != &it){
+					(*this)._MD     = it._MD;
+					(*this)._row     = it._row;
+					(*this)._col     = it._col;
+					(*this)._seq     = it._seq;
+					(*this)._size    = it._size;
+					(*this)._t       = it._t;
+					(*this)._seqel   = it._seqel;
+					(*this)._deg     = it._deg;
+					(*this)._gensize = it._gensize;
+					(*this)._delta   = it._delta;
+					(*this)._mu      = it._mu;
+					(*this)._sigma   = it._sigma;
+					(*this)._beta    = it._beta;
+					(*this)._state   = it._state;
+					(*this)._ett     = it._ett;
+					(*this)._etc     = it._etc;
+					_gen.clear();
+					for(typename std::list<Coefficient>::const_iterator git = it._gen.begin(); git != it._gen.end(); ++git)
+						_seq.push_back(*git);
+				}
+				return (*this);
+			}
+
+			bool operator==(const BM_Seq::BM_iterator& it)
+			{
+				TerminationState check = it.state();
+				bool test1 = (_seq==it._seq);
+				bool test2 = (_t==it._t);
+				bool test3 = _delta==it._delta;
+				bool test4 = (_state._state == check._state && _state.IsSequenceExceeded());
+				return (test1  && test2  && (test3 || test4));
+			}
+
+			bool operator!=(const BM_iterator& it)
+			{
+				return !((*this) == it);
+			}
+		private:
+
+			// Column Copy
+			void ColumnCopy(Coefficient &M, Coefficient &A, size_t i)
+			{
+				size_t rowd = A.rowdim();
+				Sub MC(M,0,i,rowd,1);
+				Sub AC(A,0,i,rowd,1);
+				domain().copy(MC,AC);
+			}
+			// Column Swap
+			void ColumnSwap(Coefficient &M, size_t i, size_t j)
+			{
+				size_t rowd = M.rowdim();
+				Sub Ci(M,0,i,rowd,1);
+				Sub Cj(M,0,j,rowd,1);
+				domain().swap(Ci,Cj);
+			}
+			// Column Operation
+			void ColumnAdd(Coefficient &M, size_t i, size_t j, Element el)
+			{
+				size_t rowd = M.rowdim();
+				Coefficient temp(field(),rowd,1);
+				Sub Ci(M,0,i,rowd,1);
+				Sub Cj(M,0,j,rowd,1);
+				domain().mul(temp,Cj,el);
+				domain().addin(Ci,temp);
+
+			}
+			void  Algorithm3dot2(Coefficient &tau, Coefficient &D, std::vector<size_t> &d, size_t &mu, size_t &sigma, size_t &beta)
+			{
+				Element pivel;
+				field().assign(pivel,field().zero);
+				// Retrieve the row and column dimensions of the sequence and the dimension of the discrepancy
+				size_t n = D.rowdim();
+				size_t nm  = D.coldim();
+				size_t m = nm-n;
+				//Initialize tau to the identity matrix
+				for(size_t i = 0; i<nm; ++i)
+					tau.setEntry(i,i,field().one);
+				//Create the set of generator columns
+				std::set<size_t> gen;
+				typedef std::set<size_t>::key_type index_type;
+				for(index_type i=0; i<m; ++i)
+					gen.insert(i);
+				for(index_type i = 0; i<n; ++i){
+					//Compute pi, the columns of D with nonzero entries in row i
+					std::set<size_t> pi;
+					pi.insert(m+i);
+					for(typename std::set<size_t>::iterator genit = gen.begin(); genit != gen.end(); ++genit){
+						if(!field().isZero(D.getEntry(i,*genit)))
+							pi.insert(*genit);
+					}
+
+					//Choose the pivot row with the smallest nominal degree
+					index_type piv = m+i;
+					for(std::set<size_t>::iterator itpi = pi.begin(); itpi != pi.end(); ++itpi){
+						size_t j = *itpi;
+						if(d[j] <= d[piv]){
+							if(d[j]==d[piv]){
+								if(piv < m+i){
+									if(j<piv)
+										piv = j;
+								}
+							}
+							else
+								piv = j;
+						}
+					}
+					pi.erase(piv);
+					field().assign(pivel,D.getEntry(i,piv));
+					//Handle the case when piv=m+i, so no swap is done
+					if(piv==m+i){
+						for(std::set<size_t>::iterator itpi = pi.begin(); itpi != pi.end(); ++itpi){
+							Element temp;
+							field().assign(temp,D.getEntry(i, *itpi));
+							field().negin(temp);
+							field().divin(temp,pivel);
+							ColumnAdd(tau, *itpi, piv, temp);
+							ColumnAdd(D, *itpi, piv, temp);
+						}
+					}
+					else{
+						//Remove column index m+i and handle it separately
+						pi.erase(m+i);
+						//Eliminate nonzero discrepancies in generator columns
+						for(typename std::set<size_t>::iterator itpi = pi.begin(); itpi != pi.end(); ++itpi){
+							Element temp;
+							field().assign(temp,D.getEntry(i, *itpi));
+							field().negin(temp);
+							field().divin(temp,pivel);
+							ColumnAdd(tau, *itpi, piv, temp);
+							ColumnAdd(D, *itpi, piv, temp);
+						}
+						Element auxel;
+						field().assign(auxel,D.getEntry(i,m+i));
+						//Perform a major change and update an initialized auxiliary column
+						if(!field().isZero(auxel)){
+							Element temp;
+							field().assign(temp,D.getEntry(i, m+i));
+							field().negin(temp);
+							field().divin(temp,pivel);
+							ColumnAdd(tau, m+i, piv, temp);
+							ColumnAdd(D, m+i, piv, temp);
+							ColumnSwap(tau,piv, m+i);
+							ColumnSwap(D, piv, m+i);
+						}
+						else{
+							ColumnAdd(tau,m+i,piv,field().one);
+							ColumnAdd(D,m+i,piv,field().one);
+							gen.erase(piv);
+						}
+						size_t tempdeg = d[piv];
+						d[piv] = d[m+i];
+						d[m+i] = tempdeg;
+						if(tempdeg < beta)
+							beta = tempdeg;
+						if(d[piv] > mu)
+							mu = d[piv];
+						sigma = sigma - tempdeg + d[piv];
+					}
+				}
+			}
+		public:
+			BM_iterator& operator++()
+			{
+				//See if a matrix has been pushed on the sequence
+				//if it has, then recompute the seqel since it may
+				//have become corrupt.
+				//Also reset the size to the correct size of the sequence
+				if(_size < _seq.size()){
+					_seqel = _seq.begin();
+					for(int i = 0; i<_t; ++i)
+						++_seqel;
+					_size = _seq.size();
+				}
+				//if the iterator points past the seq elements, do nothing
+				if(_t == _size){
+					return *this;
+				}
+				//Initialize the discrepancy
+				Coefficient disc(field(),_row, _row+_col);
+				//Create two iterators, one for seq, and one for gen
+				typename BM_Seq::const_iterator cseqit;
+				typename std::list<Coefficient>::iterator genit;
+				//get a iterator to the seq element to be processed
+				cseqit = _seqel;
+
+				CTimer start1; start1.start();
+				//Compute the discrepancy
+				std::vector<Coefficient*> coeffVec;
+				std::vector<const Coefficient*> seqPtrVec;
+				for(genit = _gen.begin(); genit!=_gen.end(); ++genit){
+					coeffVec.push_back(&(*genit));
+					seqPtrVec.push_back(&(*cseqit));
+					--cseqit;
+				}
+				int numCoeffs=coeffVec.size();
+				std::vector <Coefficient> discComponents;
+				discComponents.reserve(numCoeffs);
+				for (int i=0;i<numCoeffs;++i) {
+					discComponents.push_back(Coefficient(field(),_row,_row+_col));
+				}
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp parallel for
+#endif
+				for (int i=0;i<numCoeffs;++i) {
+					domain().axpyin(discComponents[i],*(seqPtrVec[i]),*(coeffVec[i]));
+				}
+				for (int i=0;i<numCoeffs;++i) {
+					domain().addin(disc,discComponents[i]);
+				}
+                                start1.stop();
+				g_time2 += start1.realtime();
+
+				CTimer start2; start2.start();
+				//Compute tau with Algorith3.2
+				Coefficient tau(field(), _row+_col, _row+_col);
+				Sub primaryDisc(disc,0,0,_row,_col);
+				if (_MD->isZero(primaryDisc)) {
+					--_etc;
+				} else {
+					_etc=_ett;
+				}
+				Algorithm3dot2(tau, disc, _deg, _mu, _sigma, _beta);
+                                start2.stop();
+				g_time3 += start2.realtime();
+				CTimer start3; start3.start();
+				//Multiply tau into each matrix in the generator
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp parallel for
+#endif
+				for (int i=0;i<numCoeffs;++i) {
+					domain().mulin(*(coeffVec[i]),tau);
+				}
+                                start3.stop();
+				g_time4 += start3.realtime();
+				//Increment the auxiliary degrees and beta
+				for(size_t j = _col; j <_row+_col; ++j)
+					_deg[j]++;
+				++_beta;
+				//Add a zero matrix to the end of the generator if needed.
+				int tmax = (int)_deg[0];
+				for(size_t j = 1; j<_row+_col; ++j)
+					if(tmax < (int)_deg[j])
+						tmax = (int)_deg[j];
+				if(tmax+1 > (int)_gensize){
+					_gen.push_back(Coefficient(field(),_col,_row+_col));
+					++_gensize;
+				}
+				//Mimic multiplication be z in the auxiliary columns
+				typename std::list<Coefficient>::reverse_iterator g1,g2;
+				g1 = _gen.rbegin();
+				g2 = _gen.rbegin();
+				++g1;
+				while(g1!=_gen.rend()){
+					Sub g1aux(*g1,0,_col,_col,_row);
+					Sub g2aux(*g2,0,_col,_col,_row);
+					domain().copy(g2aux,g1aux);
+					++g1;
+					++g2;
+				}
+				genit = _gen.begin();
+				Coefficient z1(field(),_col,_row);
+				Sub genitaux(*genit,0,_col,_col,_row);
+				domain().copy(genitaux,z1);
+				//Increment the t and seqel to the next element
+				++_t;
+				++_seqel;
+				//Update the state
+				if(/*  _delta < 0 || */_beta < _delta - _sigma + _mu +1){
+					if(_t == _size)
+						_state._state = SequenceExceeded;
+					else{
+						if(_sigma > _delta /*  && _delta >= 0*/)
+							_state._state = DeltaExceeded;
+						else
+							_state._state = GeneratorUnconfirmed;
+					}
+				}
+				else{
+					if(_sigma > _delta)
+						_state._state = DeltaExceeded;
+					else
+						_state._state = GeneratorFound;
+				}
+				if (_etc==0) {
+					_state._state=GeneratorFound;
+				}
+
+				return *this;
+			}
+			// Is this working? -AS
+			BM_iterator operator++(int)
+			{
+				//Create a copy of this
+				BM_iterator temp(*this);
+
+				//See if a matrix has been pushed on the sequence
+				//if it has, then recompute the seqel since it may
+				//have become corrupt.
+				//Also reset the size to the correct size of the sequence
+				if(_size < _seq.size()){
+					_seqel = _seq.begin();
+					for(int i = 0; i<_t; ++i)
+						++_seqel;
+					_size = _seq.size();
+				}
+				//if the iterator points past the seq elements, do nothing
+				if(_t == _size){
+					return *this;
+				}
+				//Initialize the discrepancy
+				Coefficient disc(field(),_row, _row+_col);
+				//Create two iterators, one for seq, and one for gen
+				typename BM_Seq::const_iterator cseqit;
+				typename std::list<Coefficient>::iterator genit;
+				//get an iterator to the seq element to be processed
+				cseqit = _seqel;
+				//Compute the discrepancy
+				for(genit = _gen.begin(); genit!=_gen.end(); ++genit, cseqit--){
+					domain().axpyin(disc,*cseqit,*genit);
+				} // cost: k*n^3 (nxn matrix muladds where k is current generator length)
+				  // is a reductive addition over independent muls.
+				//Compute tau with Algorith3.2
+				Coefficient tau(field(), _row+_col, _row+_col);
+				Algorithm3dot2(tau, disc, _deg, _mu, _sigma, _beta);
+				  // cost: n^3 for elim on n x about 2n
+				//Multiply tau into each matrix in the generator
+				for(genit = _gen.begin(); genit!=_gen.end(); ++genit){
+					domain().mulin(*genit,tau);
+				} // cost: k*n^3 (nxn matrix muls where k is current generator length)
+				  // is k independent muls with a shared mat tau.
+				//Increment the auxiliary degrees and beta
+				for(size_t j = _col; j <_row+_col; ++j)
+					_deg[j]++;
+				++_beta;
+				//Add a zero matrix to the end of the generator if needed.
+				int tmax = (int)_deg[0];
+				for(size_t j = 1; j<_row+_col; ++j)
+					if(tmax < _deg[j])
+						tmax = (int)_deg[j];
+				if(tmax+1 > _gensize){
+					_gen.push_back(Coefficient(field(),_col,_row+_col));
+					++_gensize;
+				}
+				//Mimic multiplication by z in the auxiliary columns
+				typename std::list<Coefficient>::reverse_iterator g1,g2;
+				g1 = _gen.rbegin();
+				g2 = _gen.rbegin();
+				++g1;
+				while(g1!=_gen.rend()){
+					Sub g1aux(*g1,0,_col,_col,_row);
+					Sub g2aux(*g2,0,_col,_col,_row);
+					domain().copy(g2aux,g1aux);
+					++g1;
+					++g2;
+				}
+				genit = _gen.begin();
+				Coefficient z1(field(),_col,_row);
+				Sub genitaux(*genit,0,_col,_col,_row);
+				domain().copy(genitaux,z1);
+				//Increment the t and seqel to the next element
+				++_t;
+				++_seqel;
+				//Update the state
+				if(/*  _delta < 0 || */ _beta < _delta - _sigma + _mu +1){
+					if(_t == _size)
+						_state._state = SequenceExceeded;
+					else{
+						if(_sigma > _delta /* && _delta >= 0 */)
+							_state._state = DeltaExceeded;
+						else
+							_state._state = GeneratorUnconfirmed;
+					}
+				}
+				else{
+					if(_sigma > _delta)
+						_state._state = DeltaExceeded;
+					else
+						_state._state = GeneratorFound;
+				}
+
+				return temp;
+			}
+			//return a reference to the current generator, in its algorithmic reversed form
+			value_type& operator*()
+			{
+				return _gen;
+			}
+			//overload the pointer operator
+			value_type* operator->()
+			{
+				return &_gen;
+			}
+			//Return a vector representing the reversal, by nominal degree, of the current generator
+			std::vector<Coefficient> GetGenerator()
+			{
+				std::vector<Coefficient> revgen(_mu+1, Coefficient(field(),_col,_col));
+				for(size_t i = 0; i<_col; ++i){
+					typename std::list<Coefficient>::iterator genit = _gen.begin();
+					for(int j = 0; j < (int)_deg[i]+1; ++j){
+						ColumnCopy(revgen[_deg[i]-j], *genit,i);
+						++genit;
+					}
+				}
+				return revgen;
+			}
+
+			typename BM_Seq::size_type get_t()
+			{
+				return _t;
+			}
+
+			int get_mu()
+			{
+				return _mu;
+			}
+
+			int get_sigma()
+			{
+				return _sigma;
+			}
+			int get_beta()
+			{
+				return _beta;
+			}
+			int get_delta()
+			{
+				return _delta;
+			}
+			std::vector<size_t> get_deg()
+			{
+				std::vector<size_t> gendegree(&_deg[0], &_deg[_col]);
+				return gendegree;
+			}
+		}; //End of BM_iterator
+
+		//return an initialized BM_iterator
+		typename BM_Seq::BM_iterator BM_begin(int earlyTermThreshold)
+		{
+			return typename BM_Seq::BM_iterator(*this,earlyTermThreshold);
+		}
+		//return an initialized BM_iterator that points to one past the end of the sequence
+		typename BM_Seq::BM_iterator BM_end()
+		{
+			return typename BM_Seq::BM_iterator(*this, -1, _size);
+		}
+		/**/
+	};//End of BM_Seq
+
+    }; //end of class BlockCoppersmithDomain
+
+
+	// construct P s.t. \sum_{i}P[i]A^{i}=0
+	template<class _Domain, class _Sequence>
+	std::vector<size_t>  BlockCoppersmithDomain<_Domain,
+	                                            _Sequence>::
+	right_minpoly (std::vector<Coefficient> &P)
+    {
+	    //Get the row and column dimensions
+	    const size_t r = _container->rowdim();
+	    const size_t c = _container->coldim();
+
+	    typename Sequence::const_iterator contiter(_container->begin());
+	    //Create the BM_Seq, that will use the Coppersmith Block Berlekamp Massey Algorithm to compute the minimal generator.
+	    BM_Seq seq(domain(),r,c);
+
+	    //Push the first projection onto the BM_Seq
+	    seq.push_back(*contiter);
+
+	    //Create the BM_Seq iterator whose incrementation performs a step of the generator
+	    typename BM_Seq::BM_iterator bmit(seq.BM_begin(EARLY_TERM_THRESHOLD));
+	    bmit.setDelta((int)(2*_container->getBB()->rowdim()+1));
+	    typename BM_Seq::BM_iterator::TerminationState check = bmit.state();
+	    while(!check.IsGeneratorFound() ){
+		    ++bmit;
+		    check = bmit.state();
+		    if(check.IsSequenceExceeded()){
+			    CTimer start; start.start();
+			    ++contiter;
+                            start.stop();
+			    g_time1+=start.realtime();
+			    seq.push_back(*contiter);
+		    }
+	    }
+	    P = bmit.GetGenerator();
+	    std::vector<size_t> deg(bmit.get_deg());
+	    commentator().report(Commentator::LEVEL_IMPORTANT,TIMING_MEASURE) <<
+		    "Times: " << g_time1 << " " << g_time2 << " " << g_time3 << " " << g_time4<<std::endl;
+	    return deg;
+    }
+
+} // end of namespace LinBox
+
+#endif // __LINBOX_coppersmith_block_domain_H
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/algorithms/block-lanczos.h b/linbox/algorithms/block-lanczos.h
index 1e731e1..9afb84b 100644
--- a/linbox/algorithms/block-lanczos.h
+++ b/linbox/algorithms/block-lanczos.h
@@ -74,10 +74,9 @@ namespace LinBox
 		 *               options for the solver
 		 */
 		BlockLanczosSolver (const Field &F, const BlockLanczosTraits &traits) :
-			_traits (traits), _field (F), _VD (F), _MD (F), _randiter (F), _block (traits.blockingFactor ())
+			_traits (traits), _field (&F), _VD (F), _MD (F), _randiter (F), _block (traits.blockingFactor ())
 		{
 			init_temps ();
-			_field.init (_one, 1);
 		}
 
 		/** Constructor with a random iterator.
@@ -87,10 +86,9 @@ namespace LinBox
 		 * @param r Random iterator to use for randomization
 		 */
 		BlockLanczosSolver (const Field &F, const BlockLanczosTraits &traits, typename Field::RandIter r) :
-			_traits (traits), _field (F), _VD (F), _MD (F), _randiter (r), _block (traits.blockingFactor ())
+			_traits (traits), _field (&F), _VD (F), _MD (F), _randiter (r), _block (traits.blockingFactor ())
 		{
 			init_temps ();
-			_field.init (_one, 1);
 		}
 
 		/** Solve the linear system Ax = b.
@@ -113,6 +111,7 @@ namespace LinBox
 		template <class Blackbox, class Vector>
 		Vector &solve (const Blackbox &A, Vector &x, const Vector &b);
 
+		inline const Field & field() const { return *_field; }
 	private:
 
 		// S_i is represented here as a vector of booleans, where the entry at
@@ -212,7 +211,7 @@ namespace LinBox
 		// Private variables
 
 		const BlockLanczosTraits _traits;
-		const Field              &_field;
+		const Field              *_field;
 		VectorDomain<Field>       _VD;
 		MatrixDomain<Field>       _MD;
 		typename Field::RandIter  _randiter;
@@ -230,7 +229,6 @@ namespace LinBox
 
 		mutable typename Vector<Field>::Dense _tmp;  // N
 
-		typename Field::Element   _one;
 
 		std::vector<size_t>       _indices;          // N
 
diff --git a/linbox/algorithms/block-lanczos.inl b/linbox/algorithms/block-lanczos.inl
index 23e3ae9..cb91cfd 100644
--- a/linbox/algorithms/block-lanczos.inl
+++ b/linbox/algorithms/block-lanczos.inl
@@ -38,7 +38,7 @@
 #include "linbox/blackbox/diagonal.h"
 #include "linbox/blackbox/compose.h"
 #include "linbox/blackbox/transpose.h"
-#include "linbox/randiter/nonzero.h"
+#include <givaro/givranditer.h>
 #include "linbox/util/commentator.h"
 #include "linbox/util/timer.h"
 
@@ -143,8 +143,8 @@ namespace LinBox
 		_matV[2].resize (A.coldim (), _block);
 		_AV.resize (A.coldim (), _block);
 
-		NonzeroRandIter<Field> real_ri (_field, _randiter);
-		RandomDenseStream<Field, Vector, NonzeroRandIter<Field> > stream (_field, real_ri, A.coldim ());
+        Givaro::GeneralRingNonZeroRandIter<Field> real_ri (_randiter);
+		RandomDenseStream<Field, Vector, Givaro::GeneralRingNonZeroRandIter<Field> > stream (field(), real_ri, A.coldim ());
 
 		for (unsigned int i = 0; !success && i < _traits.maxTries (); ++i) {
 			std::ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
@@ -174,7 +174,7 @@ namespace LinBox
 					VectorWrapper::ensureDim (y, A.coldim ());
 
 					stream >> d1;
-					Diagonal<Field> D (_field, d1);
+					Diagonal<Field> D (field(), d1);
 					Compose<Blackbox, Diagonal<Field> > B (&A, &D);
 
 					report << "Random D: ";
@@ -199,7 +199,7 @@ namespace LinBox
 					typedef Compose<PC2, CO1> CO2;
 
 					stream >> d1;
-					PC1 D (_field, d1);
+					PC1 D (field(), d1);
 					PC2 AT (&A);
 					CO1 B1 (&D, &A);
 					CO2 B (&AT, &B1);
@@ -232,8 +232,8 @@ namespace LinBox
 					typedef Compose<PC1, CO3> CO4;
 
 					stream >> d1 >> d2;
-					PC1 D1 (_field, d1);
-					PC1 D2 (_field, d2);
+					PC1 D1 (field(), d1);
+					PC1 D2 (field(), d2);
 					PC2 AT (&A);
 					CO1 B1 (&A, &D1);
 					CO2 B2 (&D2, &B1);
@@ -392,7 +392,7 @@ namespace LinBox
 
 		// i is the index for temporaries where we need to go back to i - 1
 		// j is the index for temporaries where we need to go back to j - 2
-		int i = 0, j = 2, next_j, prev_j = 1, iter = 2;
+		int i = 0, j = 2, prev_j = 1, iter = 2;
 		typename Matrix::ColIterator k;
 
 		TIMER_DECLARE(AV);
@@ -401,7 +401,7 @@ namespace LinBox
 		TIMER_DECLARE(orthogonalization)
 
 		// Get a random fat vector _matV[0]
-		RandomDenseStream<Field, typename Matrix::Col> stream (_field, _randiter, A.coldim ());
+		RandomDenseStream<Field, typename Matrix::Col> stream (field(), _randiter, A.coldim ());
 
 		for (k = _matV[0].colBegin (); k != _matV[0].colEnd (); ++k)
 			stream >> *k;
@@ -537,7 +537,7 @@ namespace LinBox
 
 		// Now we're ready to begin the real iteration
 		while (!_MD.isZero (_matV[j])) {
-			next_j = j + 1;
+			int next_j = j + 1;
 			if (next_j > 2) next_j = 0;
 
 			TIMER_START(AV);
@@ -715,7 +715,7 @@ namespace LinBox
 				S[_indices[row]] = true;  // Use column j of V_i in W_i
 
 				// Give the (j, j) entry unity
-				_field.inv (Mjj_inv, _matM.getEntry (_indices[row], _indices[row]));
+				field().inv (Mjj_inv, _matM.getEntry (_indices[row], _indices[row]));
 				_VD.mulin (*(_matM.rowBegin () + _indices[row]), Mjj_inv);
 
 				// Zero the rest of the column j
@@ -737,10 +737,10 @@ namespace LinBox
 
 				const typename Field::Element &Mjj = _matM.refEntry (_indices[row], _indices[row] + _block);
 
-				linbox_check (!_field.isZero (Mjj));
+				linbox_check (!field().isZero (Mjj));
 
 				// Zero the rest of the column j + N
-				eliminate_col (_matM, row, _block, _indices, _field.inv (Mjj_inv, Mjj));
+				eliminate_col (_matM, row, _block, _indices, field().inv (Mjj_inv, Mjj));
 
 				// Zero row j
 				_VD.subin (*(_matM.rowBegin () + _indices[row]), *(_matM.rowBegin () + _indices[row]));
@@ -844,7 +844,7 @@ namespace LinBox
 				if (*l)
 					_VD.dot (*k, *i, *j);
 				else
-					_field.subin (*k, *k);
+					field().subin (*k, *k);
 			}
 
 			_VD.copy (*i, _tmp);
@@ -909,7 +909,7 @@ namespace LinBox
 		size_t idx = 0;
 
 		for (i = A.rowBegin (); i != A.rowEnd (); ++i, ++idx)
-			_field.addin ((*i)[idx], _one);
+			field().addin ((*i)[idx], field().one);
 
 		return A;
 	}
@@ -969,7 +969,7 @@ namespace LinBox
 
 		for (i = A.rowBegin (), i_idx = 0; i != A.rowEnd (); ++i, ++i_idx) {
 			_VD.subin (*i, *i);
-			_field.assign ((*i)[i_idx], _one);
+			field().assign ((*i)[i_idx], field().one);
 		}
 
 		return A;
@@ -997,7 +997,7 @@ namespace LinBox
 		row_vec = *(_matM.rowBegin () + indices[row]);
 
 		for (idx = row; idx < A.rowdim (); ++idx) {
-			if (!_field.isZero (A.getEntry (indices[idx], indices[row] + col_offset))) {
+			if (!field().isZero (A.getEntry (indices[idx], indices[row] + col_offset))) {
 				if (idx != row) {
 					typename Matrix::Row row1 = *(A.rowBegin () + indices[idx]);
 					std::swap_ranges (row_vec.begin (), row_vec.end (), row1.begin ());
@@ -1029,15 +1029,15 @@ namespace LinBox
 		for (row = 0; row < pivot; ++row) {
 			const typename Field::Element &Aij = A.getEntry (indices[row], indices[pivot] + col_offset);
 
-			if (!_field.isZero (Aij))
-				_VD.axpyin (*(A.rowBegin () + indices[row]), _field.neg (p, Aij), pivot_row);
+			if (!field().isZero (Aij))
+				_VD.axpyin (*(A.rowBegin () + indices[row]), field().neg (p, Aij), pivot_row);
 		}
 
 		for (++row; row < A.rowdim (); ++row) {
 			const typename Field::Element &Aij = A.getEntry (indices[row], indices[pivot] + col_offset);
 
-			if (!_field.isZero (Aij))
-				_VD.axpyin (*(A.rowBegin () + indices[row]), _field.neg (p, Aij), pivot_row);
+			if (!field().isZero (Aij))
+				_VD.axpyin (*(A.rowBegin () + indices[row]), field().neg (p, Aij), pivot_row);
 		}
 	}
 
@@ -1065,21 +1065,19 @@ namespace LinBox
 	{
 		linbox_check (M.rowdim () == M.coldim ());
 
-		typename Field::Element neg_one;
 
-		_field.init (neg_one, -1);
 
 		size_t i, j;
 
 		for (i = 0; i < M.rowdim (); ++i) {
 			for (j = 0; j < M.coldim (); ++j) {
-				if (i != j && !_field.isZero (M.getEntry (i, j))) {
-					if (!_field.isZero (M.getEntry (i, i))) {
+				if (i != j && !field().isZero (M.getEntry (i, j))) {
+					if (!field().isZero (M.getEntry (i, i))) {
 						typename Matrix::ConstRowIterator row = M.rowBegin () + j;
 						if (!_VD.isZero (*row))
 							return false;
 					}
-					else if (!_field.isZero (M.getEntry (j, j))) {
+					else if (!field().isZero (M.getEntry (j, j))) {
 						typename Matrix::ConstColIterator col = M.colBegin () + i;
 						if (!_VD.isZero (*col))
 							return false;
@@ -1087,7 +1085,7 @@ namespace LinBox
 					else
 						return false;
 				}
-				else if (!_field.isZero (M.getEntry (i, j)) && !_field.areEqual (M.getEntry (i, j), neg_one))
+				else if (!field().isZero (M.getEntry (i, j)) && !field().areEqual (M.getEntry (i, j), field().mOne))
 					return false;
 			}
 		}
@@ -1119,7 +1117,7 @@ namespace LinBox
 
 		bool ret = true;
 
-		RandomDenseStream<Field, typename Matrix::Row> stream (_field, _randiter, n);
+		RandomDenseStream<Field, typename Matrix::Row> stream (field(), _randiter, n);
 		typename Matrix::RowIterator i = A.rowBegin ();
 		typename Matrix::ColIterator j = AT.colBegin ();
 
@@ -1187,7 +1185,7 @@ namespace LinBox
 
 		bool ret = true;
 
-		RandomDenseStream<Field, typename Matrix::Row> stream (_field, _randiter, n);
+		RandomDenseStream<Field, typename Matrix::Row> stream (field(), _randiter, n);
 		typename Matrix::RowIterator i = A.rowBegin ();
 		typename Matrix::ColIterator j = AT.colBegin ();
 
@@ -1289,7 +1287,7 @@ namespace LinBox
 
 		bool ret = true;
 
-		RandomDenseStream<Field, typename Matrix::Row> stream (_field, _randiter, n);
+		RandomDenseStream<Field, typename Matrix::Row> stream (field(), _randiter, n);
 		typename Matrix::RowIterator i = A.rowBegin ();
 
 		for (; i != A.rowEnd (); ++i)
@@ -1299,10 +1297,10 @@ namespace LinBox
 		report << "Computed A:" << std::endl;
 		_MD.write (report, A);
 
-		RandomDenseStream<Field, Matrix> stream1 (_field, _randiter, m);
+		RandomDenseStream<Field, Matrix> stream1 (field(), _randiter, m);
 		stream1 >> x;
 
-		RandomDenseStream<Field, Matrix> stream2 (_field, _randiter, n);
+		RandomDenseStream<Field, Matrix> stream2 (field(), _randiter, n);
 		stream1 >> y;
 
 		report << "Computed     x: ";
@@ -1324,14 +1322,14 @@ namespace LinBox
 		_VD.dot (ATxy, ATx, y);
 
 		report << "Computed  ATxy: ";
-		_field.write (report, ATxy) << std::endl;
+		field().write (report, ATxy) << std::endl;
 
 		_VD.dot (xAy, x, Ay);
 
 		report << "Computed   xAy: ";
-		_field.write (report, xAy) << std::endl;
+		field().write (report, xAy) << std::endl;
 
-		if (!_field.areEqual (ATxy, xAy)) {
+		if (!field().areEqual (ATxy, xAy)) {
 			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
 			<< "ERROR: <A^T x, y> != <x, Ay>" << std::endl;
 			ret = false;
diff --git a/linbox/algorithms/block-massey-domain.h b/linbox/algorithms/block-massey-domain.h
index 5987e07..2f0e83b 100644
--- a/linbox/algorithms/block-massey-domain.h
+++ b/linbox/algorithms/block-massey-domain.h
@@ -30,36 +30,61 @@
 
 #include <vector>
 #include <iostream>
+#include <algorithm>
 #include <iomanip>
 
-
 #include "linbox/util/commentator.h"
 #include "linbox/util/timer.h"
-#include "linbox/field/unparametric.h"
+#include <givaro/zring.h>
 #include "linbox/matrix/matrix-domain.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
 #include "linbox/matrix/factorized-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
 #include "linbox/algorithms/sigma-basis.h"
 
 
 #include "linbox/util/timer.h"
 
-//#define  __CHECK_RESULT
-//#define __DEBUG_MAPLE
-//#define __CHECK_LOOP
-//#define __PRINT_MINPOLY
-//#define __CHECK_DISCREPANCY
-//#define __CHECK_TRANSFORMATION
-//#define __CHECK_SIGMA_RESULT
-//#define __PRINT_SEQUENCE
-#define _BM_TIMING
+// #define  __CHECK_RESULT
+// #define __DEBUG_MAPLE
+// #define __CHECK_LOOP
+// #define __PRINT_MINPOLY
+// #define __CHECK_DISCREPANCY
+// #define __CHECK_TRANSFORMATION
+// #define __CHECK_SIGMA_RESULT
+// #define __PRINT_SEQUENCE
+// #define __PRINT_SIGMABASE
+
+//#define _BM_TIMING
+#define DEFAULT_BLOCK_EARLY_TERM_THRESHOLD 10
 
 namespace LinBox
 {
+	template<class Field, class Coefficient>
+		void write_maple(const Field& F, const std::vector<Coefficient> & P)
+		{
+			std::cout<<"Matrix([";
+			for (size_t i=0;i< P[0].rowdim();++i){
+				std::cout<<"[";
+				for (size_t j=0;j< P[0].coldim();++j){
+					F.write(std::cout,P[0].getEntry(i,j));
+					for (size_t k=1;k<P.size();++k){
+						std::cout<<"+ x^"<<k<<"*";
+						F.write(std::cout,P[k].getEntry(i,j));
+					}
+					if (j != P[0].coldim()-1)
+						std::cout<<",";
+				}
+				if (i != P[0].rowdim()-1)
+					std::cout<<"],";
+				else
+					std::cout<<"]";
+			}
+			std::cout<<"]);\n";
+		}
+
 
 
-#define DEFAULT_EARLY_TERM_THRESHOLD 20
 
 
 	/** Compute the linear generator of a sequence of matrices.
@@ -67,7 +92,7 @@ namespace LinBox
 	 * This class encapsulates the functionality required for computing
 	 * the block minimal polynomial of a matrix.
 	 * @bib
-	 * Giorgi, Jeannerod Villard algorithm from ISSAC'03
+	 * Giorgi, Jeannerod, Villard algorithm from ISSAC'03
 	 */
 	template<class _Field, class _Sequence>
 	class BlockMasseyDomain {
@@ -76,12 +101,13 @@ namespace LinBox
 		typedef _Field                           Field;
 		typedef typename Field::Element        Element;
 		typedef _Sequence                     Sequence;
-		typedef BlasMatrix<Field>        Coefficient;
+		typedef BlasMatrix<Field>          Coefficient;
+                typedef BlasSubmatrix<Coefficient>   CoeffView;
 
 
 	private:
 		Sequence                          *_container;
-		Field                                      _field;
+		const Field                           *_field;
 		BlasMatrixDomain<Field>                  _BMD;
 		MatrixDomain<Field>                       _MD;
 		unsigned long            EARLY_TERM_THRESHOLD;
@@ -164,17 +190,18 @@ namespace LinBox
 #endif
 
 
-		BlockMasseyDomain (const BlockMasseyDomain<Field, Sequence> &Mat, unsigned long ett_default = DEFAULT_EARLY_TERM_THRESHOLD) :
-			_container(Mat._container), _field(Mat._field), _BMD(Mat._field),
-			_MD(Mat._field),  EARLY_TERM_THRESHOLD (ett_default)
+		BlockMasseyDomain (const BlockMasseyDomain<Field, Sequence> &Mat, unsigned long ett_default = DEFAULT_BLOCK_EARLY_TERM_THRESHOLD) :
+			_container(Mat._container), _field(Mat._field), _BMD(Mat.field()),
+			_MD(Mat.field()),  EARLY_TERM_THRESHOLD (ett_default)
 		{
 #ifdef _BM_TIMING
 			clearTimer();
 #endif
+
 		}
 
-		BlockMasseyDomain (Sequence *D, unsigned long ett_default = DEFAULT_EARLY_TERM_THRESHOLD) :
-			_container(D), _field(D->getField ()), _BMD(D->getField ()), _MD(D->getField ()), EARLY_TERM_THRESHOLD (ett_default)
+		BlockMasseyDomain (Sequence *D, unsigned long ett_default = DEFAULT_BLOCK_EARLY_TERM_THRESHOLD) :
+			_container(D), _field(&(D->field ())), _BMD(D->field ()), _MD(D->field ()), EARLY_TERM_THRESHOLD (ett_default)
 		{
 #ifdef _BM_TIMING
 			clearTimer();
@@ -183,8 +210,8 @@ namespace LinBox
 
 
 		// field of the domain
-		const Field &getField    () const
-		{ return _field; }
+		const Field &field    () const
+		{ return *_field; }
 
 		// sequence of the domain
 		Sequence *getSequence () const
@@ -220,37 +247,12 @@ namespace LinBox
 
 	private:
 
-		template<class Field>
-		void write_maple(const Field& F, const std::vector<Coefficient> & P)
-		{
-			std::cout<<"Matrix([";
-			for (size_t i=0;i< P[0].rowdim();++i){
-				std::cout<<"[";
-				for (size_t j=0;j< P[0].coldim();++j){
-					F.write(std::cout,P[0].getEntry(i,j));
-					for (size_t k=1;k<P.size();++k){
-						std::cout<<"+ x^"<<k<<"*";
-						F.write(std::cout,P[k].getEntry(i,j));
-					}
-					if (j != P[0].coldim()-1)
-						std::cout<<",";
-				}
-				if (i != P[0].rowdim()-1)
-					std::cout<<"],";
-				else
-					std::cout<<"]";
-			}
-			std::cout<<"]);\n";
-		}
 
 
 		std::vector<size_t> masseyblock_left (std::vector<Coefficient> &P)
 		{
+                        std::ostream& report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
 
-#ifdef _BM_TIMING
-			tSetup.clear();
-			tSetup.start();
-#endif
 			const size_t length = _container->size ();
 			const size_t m = _container->rowdim();
 			const size_t n = _container->coldim();
@@ -263,23 +265,21 @@ namespace LinBox
 			typename Sequence::const_iterator _iter (_container->begin ());
 
 			// Reservation of memory for the entire sequence
-			std::vector<Coefficient> S (length,Coefficient(m,n));
-			//std::vector<Coefficient> S (length); //,Coefficient(m,n));
-
-			Coefficient Unit(m+n,m);
-			const Coefficient Zero(m+n,m);
-			Element one,zero,mOne;
-			_field.init(one,1L);
-			_field.init(zero,0L);
-			_field.init(mOne,-1L);
+                        const Coefficient Zeromn(field(),m,n);
+			std::vector<Coefficient> S (length,Zeromn);
+
+
+			Coefficient Unit(field(),m+n,m);
+			const Coefficient Zero(field(),m+n,m);
+
 			for (size_t i=0;i<m;i++)
-				Unit.setEntry(i,i,one);
+				Unit.setEntry(i,i,field().one);
 			size_t min_mn=(m <n)? m :n;
 
 			// initialization of discrepancy
-			Coefficient Discrepancy(m+n,n);
+			Coefficient Discrepancy(field(),m+n,n);
 			for (size_t i=0;i<n;i++)
-				Discrepancy.setEntry(i+m,i,one);
+				Discrepancy.setEntry(i+m,i,field().one);
 
 			// initialization of sigma base
 			std::vector<Coefficient> SigmaBase(1, Unit);
@@ -293,22 +293,13 @@ namespace LinBox
 			std::vector<long> degree(m+n,0);
 			for (size_t i=0;i<m;++i)
 				degree[i]=0;
-#ifdef _BM_TIMING
-			tSetup.stop();
-			ttSetup += tSetup;
-			tCheckSequence.clear();
-			tCheckSequence.start();
-#endif
+
 			// The first sequence element should be of full rank
 			// this is due to the strategy which say that we can compute
 			// only the first column of the approximation of [ S(x) Id]^T
 			// since the other colums have always lower degree.
 			if (_BMD.rank(*_iter)< min_mn)
 				throw PreconditionFailed (__func__, __LINE__, "Bad random Blocks, abort\n");
-#ifdef _BM_TIMING
-			tCheckSequence.stop();
-			ttCheckSequence += tCheckSequence;
-#endif
 
 			unsigned long early_stop=0;
 			long NN;
@@ -316,52 +307,44 @@ namespace LinBox
 
 				// Get the next coefficient in the sequence
 				S[NN]=*_iter;
-#ifdef  _BM_TIMING
-				if (NN != 0){
-					tGetCoeff.stop();
-					ttGetCoeff += tGetCoeff;
-				}
-				tDiscrepancy.clear();
-				tDiscrepancy.start();
-#endif
 
 				/*
 				 * Compute the new discrepancy (just updating the first m rows)
 				 */
 				// view of m first rows of SigmaBasis[0]
-				Coefficient Sigma(SigmaBase[0],0,0,m,m);
+				CoeffView Sigma(SigmaBase[0],0,0,m,m);
 
 				// view of m first rows of Discrepancy
-				Coefficient Discr(Discrepancy,0,0,m,n);
+				CoeffView Discr(Discrepancy,0,0,m,n);
 
 				_BMD.mul(Discr,Sigma,S[NN]);
+
 				for (size_t i=1;i<SigmaBase.size();i++){
-					Coefficient  Sigmaview(SigmaBase[i],0,0,m,m);
+					CoeffView  Sigmaview(SigmaBase[i],0,0,m,m);
 					_BMD.axpyin(Discr,Sigmaview,S[NN-i]);
 				}
 
-#ifdef _BM_TIMING
-				tDiscrepancy.stop();
-				ttDiscrepancy += tDiscrepancy;
-#endif
-
-				typename Coefficient::Iterator _iter_Discr = Discr.Begin();
-
-				while ((_field.isZero(*_iter_Discr) && _iter_Discr != Discr.End()))
+				typename CoeffView::Iterator _iter_Discr = Discr.Begin();
+				while (_iter_Discr != Discr.End() && (field().isZero(*_iter_Discr)))
 					++_iter_Discr;
+                                if (_iter_Discr!=Discr.End())
+                                        early_stop=0;
+                                else
+                                        early_stop++;
 
 				// maybe there is something to do here
 				// increase the last n rows of orders
 				// multiply by X the last n rows of SigmaBase
-				if (_iter_Discr != Discr.End())
-					early_stop=0;
-				else {
-					early_stop++;
-				}
-#ifdef _BM_TIMING
-				tGetPermutation.clear();
-				tGetPermutation.start();
-#endif
+				//if (_iter_Discr != Discr.End())
+
+                                /*
+                                Coefficient ZeroD(field(),m+n,n);
+                                if (_MD.areEqual(Discrepancy,ZeroD))
+                                        early_stop=0;
+                                else
+                                        early_stop++;
+                                */
+
 				// Computation of the permutation BPerm1 such that BPerm1.order is in increasing order.
 				// order=Perm.order
 				//! @todo factorize this in \c BlasPermutation.
@@ -380,56 +363,30 @@ namespace LinBox
 				}
 				BlasPermutation<size_t> BPerm1(Perm1);
 
-#ifdef _BM_TIMING
-				tGetPermutation.stop();
-				ttGetPermutation += tGetPermutation;
-				tApplyPerm.clear();
-				tApplyPerm.start();
-
-#endif
 				// Discrepancy= BPerm1.Discrepancy
 				_BMD.mulin_right(BPerm1,Discrepancy);
 
-#ifdef _BM_TIMING
-				tApplyPerm.stop();
-				ttApplyPerm += tApplyPerm;
-				tLQUP.clear();
-				tLQUP.start();
-#endif
-
 
 #ifdef __CHECK_DISCREPANCY
-				std::ostream& report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+
 				report<<"Discrepancy"<<NN<<":=Matrix(";
-				Discrepancy.write(report,_field,true)<<");"<<std::endl;
+				Discrepancy.write(report)<<");"<<std::endl;
 #endif
 
-
-
 				// Computation of the LQUP decomposition of the discrepancy
-				Coefficient CopyDiscr;
-				CopyDiscr=Discrepancy;
+				Coefficient CopyDiscr(Discrepancy);
 				BlasPermutation<size_t> Pp (CopyDiscr.coldim());
 				BlasPermutation<size_t> Qt (CopyDiscr.rowdim());
-				LQUPMatrix<Field> LQUP(_field, CopyDiscr,Pp,Qt);
-
-#ifdef _BM_TIMING
-				tLQUP.stop();
-				ttLQUP += tLQUP;
+				LQUPMatrix<Field> LQUP(CopyDiscr,Pp,Qt);
 
-#endif
 				// Get the matrix L of LQUP decomposition
-				TriangularBlasMatrix<Field> L(_field,m+n,m+n, LinBoxTag::Lower, LinBoxTag::Unit );
+				TriangularBlasMatrix<Field> L(field(),m+n,m+n, Tag::Shape::Lower, Tag::Diag::Unit );
 				LQUP.getL(L);
 
 				// Get the tranposed  permutation of Q from LQUP
 				// BlasPermutation<size_t> Qt=LQUP.getQ();
 
 
-#ifdef _BM_TIMING
-				tGetPermutation.clear();
-				tGetPermutation.start();
-#endif
 				// Computation of permutations BPerm2 such that the last n rows of BPerm2.Qt.Discrepancy are non zero.
 				std::vector<size_t> Perm2(m+n);
 				for (size_t i=0;i<n;++i)
@@ -438,65 +395,27 @@ namespace LinBox
 					Perm2[i]=i;
 				BlasPermutation<size_t> BPerm2(Perm2);
 
-#ifdef _BM_TIMING
-				tGetPermutation.stop();
-				ttGetPermutation += tGetPermutation;
-				tInverseL.clear();
-				tInverseL.start();
-#endif
 				// compute the inverse of L
-				TriangularBlasMatrix<Field> invL (_field,m+n,m+n, LinBoxTag::Lower,LinBoxTag::Unit);
-				FFPACK::trinv_left((typename Field::Father_t)_field,m+n,L.getPointer(),L.getStride(),invL.getWritePointer(),invL.getStride());
-
-#ifdef _BM_TIMING
-				tInverseL.stop();
-				ttInverseL += tInverseL;
-#endif
+				TriangularBlasMatrix<Field> invL (field(),m+n,m+n, Tag::Shape::Lower,Tag::Diag::Unit);
+				FFPACK::trinv_left(field(),m+n,L.getPointer(),L.getStride(),invL.getWritePointer(),invL.getStride());
 
 #ifdef 	__CHECK_TRANSFORMATION
-				report<<"invL"<<N<<":=Matrix(";
-				invL.write(report,_field,true)<<");"<<std::endl;
+				report<<"invL"<<NN<<":=Matrix(";
+				invL.write(report)<<");"<<std::endl;
 
 #endif
 				// SigmaBase =  BPerm2.Qt. L^(-1) . BPerm1 . SigmaBase
 				for (size_t i=0;i<SigmaBase.size();i++) {
-#ifdef _BM_TIMING
-					tApplyPerm.clear();
-					tApplyPerm.start();
-#endif
 					_BMD.mulin_right(BPerm1,SigmaBase[i]);
-
-#ifdef _BM_TIMING
-					tApplyPerm.stop();
-					ttApplyPerm +=tApplyPerm;
-
-					tUpdateSigma.clear();
-					tUpdateSigma.start();
-#endif
 					_BMD.mulin_right(invL,SigmaBase[i]);
-#ifdef _BM_TIMING
-					tUpdateSigma.stop();
-					ttUpdateSigma += tUpdateSigma;
-					tApplyPerm.clear();
-					tApplyPerm.start();
-#endif
 					_BMD.mulin_right(Qt,SigmaBase[i]);
 					_BMD.mulin_right(BPerm2,SigmaBase[i]);
-#ifdef _BM_TIMING
-					tApplyPerm.stop();
-					ttApplyPerm +=tApplyPerm;
-#endif
 				}
 
-
-#ifdef _BM_TIMING
-				tApplyPerm.clear();
-				tApplyPerm.start();
-#endif
-
 				// Apply BPerm2 and Qt to the vector of order and increase by 1 the last n rows
-				UnparametricField<long> UF(0);
-				BlasMatrixDomain<UnparametricField<long> > BMDUF(UF);
+				Givaro::ZRing<long> UF(0);
+				// What?
+				BlasMatrixDomain<Givaro::ZRing<long> > BMDUF(UF);
 				BMDUF.mulin_right(Qt,order);
 				BMDUF.mulin_right(BPerm2,order);
 				BMDUF.mulin_right(BPerm1,degree);
@@ -507,12 +426,6 @@ namespace LinBox
 					degree[i]++;
 				}
 
-#ifdef _BM_TIMING
-				tApplyPerm.stop();
-				ttApplyPerm += tApplyPerm;
-				tShiftSigma.clear();
-				tShiftSigma.start();
-#endif
 				// Multiplying the last n row of SigmaBase by x.
 				long max_degree=degree[m];
 				for (size_t i=m+1;i<m+n;++i) {
@@ -530,34 +443,17 @@ namespace LinBox
 				for (int i= (int)size-2;i>=0;i--)
 					for (size_t j=0;j<n;j++)
 						for (size_t k=0;k<n;++k){
-
-							// report << " i+1 item: ";
-							// report << SigmaBase[i+1].getEntry(m+j,k) ;
-							// report << " i item: ";
-					 		// report << SigmaBase[i].getEntry(m+j,k)
-							// << std::endl;
-							// typename Field::Element& x = SigmaBase[i+1].refEntry(m+j,k);
-							// report << &x << " " << x << " &x and x" << std::endl;
-							// x = SigmaBase[i].getEntry(m+j,k);
-							// report << x << " new x" << std::endl;
-							_field.assign(SigmaBase[i+1].refEntry(m+j,k), SigmaBase[i].getEntry(m+j,k));
+							field().assign(SigmaBase[i+1].refEntry(m+j,k), SigmaBase[i].getEntry(m+j,k));
 
 						}
 
 				for (size_t j=0;j<n;j++)
 					for (size_t k=0;k<n;++k)
-						_field.assign(SigmaBase[0].refEntry(m+j,k),zero);
-
-
-#ifdef _BM_TIMING
-				tShiftSigma.stop();
-				ttShiftSigma += tShiftSigma;
-#endif
-
+						field().assign(SigmaBase[0].refEntry(m+j,k),field().zero);
 
 #ifdef __DEBUG_MAPLE
 				report<<"\n\nSigmaBase"<<NN<<":= ";
-				write_maple(_field,SigmaBase);
+				write_maple(field(),SigmaBase);
 
 				report<<"order"<<NN<<":=<";
 				for (size_t i=0;i<m+n;++i){
@@ -580,46 +476,29 @@ namespace LinBox
 				report<<"Sequence size:  "<<NN+1<<std::endl;
 				size_t min_t = (SigmaBase.size() > NN+1)? NN+1: SigmaBase.size();
 				for (size_t i=min_t - 1 ; i<NN+1; ++i){
-					Coefficient Disc(m+n,n);
-					_BMD.mul(Disc,SigmaBase[0],S[i]);
-					for (size_t j=1;j<min_t -1;++j)
+					Coefficient Disc(field(),m+n,n);
+					for (size_t j=0;j<min_t ;++j)
 						_BMD.axpyin(Disc,SigmaBase[j],S[i-j]);
-					Disc.write(report,_field)<<std::endl;
+					Disc.write(report)<<std::endl;
 				}
 #endif
 
-
-#ifdef _BM_TIMING
-				tNewDiscrepancy.clear();
-				tNewDiscrepancy.start();
-#endif
 				// Discrepancy= BPerm2.U.Pp from LQUP
-				Coefficient U(m+n,n);
-				TriangularBlasMatrix<Field> trU(U,LinBoxTag::Upper,LinBoxTag::NonUnit);
+				Coefficient U(field(),m+n,n);
+				TriangularBlasMatrix<Field> trU(U,Tag::Shape::Upper,Tag::Diag::NonUnit);
 				LQUP.getU(trU);
 				//Discrepancy=U;
 				// BlasPermutation<size_t> Pp= LQUP.getP();
 				_BMD.mul(Discrepancy,trU, Pp);
 				_BMD.mulin_right(BPerm2,Discrepancy);
-
-#ifdef _BM_TIMING
-				tNewDiscrepancy.stop();
-				ttNewDiscrepancy+=tNewDiscrepancy;
-
-				// timer in the loop
-				tGetCoeff.clear();
-				tGetCoeff.start();
-#endif
-
 			}
-			std::ostream& report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
 
-			if ( early_stop == EARLY_TERM_THRESHOLD)
+                        if ( early_stop == EARLY_TERM_THRESHOLD)
 				report<<"Early termination is used: stop at "<<NN<<" from "<<length<<" iterations\n\n";
 
 #ifdef __PRINT_SEQUENCE
 			report<<"\n\nSequence:= ";
-			write_maple(_field,S);
+			write_maple(field(),S);
 #endif
 
 
@@ -627,54 +506,35 @@ namespace LinBox
 #ifdef __CHECK_SIGMA_RESULT
 			report<<"Check SigmaBase application\n";
 			for (size_t i=SigmaBase.size()-1 ;i< length ;++i){
-				Coefficient res(m+n,n);
+				Coefficient res(field(),m+n,n);
 				for (size_t k=0;k<SigmaBase.size();++k)
 					_BMD.axpyin(res,SigmaBase[k],S[i-k]);
-				res.write(report,_field)<<std::endl;
+				res.write(report)<<std::endl;
 			}
 
 #endif
 
-#ifdef _BM_TIMING
-			tGetMinPoly.clear();
-			tGetMinPoly.start();
-#endif
 			// Get the reverse matrix polynomial of the first m rows of SigmaBase according to degree.
 			degree=order;
-			long max=degree[0];
-			for (size_t i=1;i<m;i++) {
-				if (degree[i]>max)
-					max=degree[i];
-			}
-			//P = std::vector<Coefficient> (max+1);
-			P.clear();
-			Coefficient tmp(m,m);
-			P.resize(max+1, tmp);
-			//for (long i=0;i< max+1;++i)
-			//	P[i]=tmp;
+			long max= *std::max_element(degree.begin(),degree.end());
 
+			Coefficient tmp(field(),m,m);
+                        P = std::vector<Coefficient> (max+1,tmp);
 			for (size_t i=0;i<m;i++)
 				for (long j=0;j<=degree[i];j++)
 					for (size_t k=0;k<m;k++)
-						_field.assign(P[degree[i]-j].refEntry(i,k), SigmaBase[j].getEntry(i,k));
-#ifdef _BM_TIMING
-			tGetMinPoly.stop();
-			ttGetMinPoly +=tGetMinPoly;
-#endif
-
-
+						field().assign(P[degree[i]-j].refEntry(i,k), SigmaBase[j].getEntry(i,k));
 #ifdef __CHECK_RESULT
 			report<<"Check minimal polynomial application\n";
 			bool valid=true;
 			for (size_t i=0;i< NN - P.size();++i){
-				Coefficient res(m,n);
+				Coefficient res(field(),m,n);
 				_BMD.mul(res,P[0],S[i]);
 				for (size_t k=1,j=i+1;k<P.size();++k,++j)
 					_BMD.axpyin(res,P[k],S[j]);
 				for (size_t j=0;j<m*n;++j)
-					if (!_field.isZero(*(res.getPointer()+j)))
+					if (!field().isZero(*(res.getPointer()+j)))
 						valid= false;
-				//res.write(report,_field)<<std::endl;
 			}
 			if (valid)
 				report<<"minpoly is correct\n";
@@ -684,26 +544,16 @@ namespace LinBox
 
 #ifdef __PRINT_MINPOLY
 			report<<"MinPoly:=";
-			write_maple(_field,P);
-#if 0
+			write_maple(field(),P);
 			Coefficient Mat(*_container->getBB());
 			report<<"A:=Matrix(";
-			Mat.write(report,_field,true);
-#endif
+			Mat.write(report);
 #endif
 
 			std::vector<size_t> deg(m);
 			for (size_t i=0;i<m;++i)
 				deg[i]=(size_t)degree[i];
 
-			//report << "clearing S " << S.size() << std::endl;
-			//S.clear();
-			//report << "cleared S " << S.size() << std::endl;
-			// report << "clearing SigmaBase " << SigmaBase.size() << std::endl;
-			// SigmaBase.resize(SigmaBase.size()-2);
-			// report << "clearing last 4 of SigmaBase " << SigmaBase.size() << std::endl;
-			// SigmaBase.clear();
-			// report << "cleared SigmaBase " << SigmaBase.size() << std::endl;
 			return deg;
 		}
 
@@ -720,26 +570,23 @@ namespace LinBox
 			n = _container->coldim();
 
 			// Set some useful constant
-			Element one;
-			_field.init(one,1UL);
-			const Coefficient Zero(2*m,2*m);
+			const Coefficient Zero(field(),2*m,2*m);
+                        const Coefficient Zeromn(field(),2*m,n);
 
 			// Make the Power Serie from  Sequence (U.A^i.V) and Identity
 			//_container->recompute(); // make sure sequence is already computed
-			std::vector<Coefficient> PowerSerie(length);
+			std::vector<Coefficient> PowerSerie(length,Zeromn);
 			typename Sequence::const_iterator _iter (_container->begin ());
 			for (size_t i=0;i< length; ++i, ++_iter){
-				Coefficient value(2*m,n);
-				PowerSerie[i] = value;
 				for (size_t j=0;j<m;++j)
 					for (size_t k=0;k<n;++k)
 						PowerSerie[i].setEntry(j,k, (*_iter).getEntry(j,k));
 			}
 			for (size_t j=0;j<n;++j)
-				PowerSerie[0].setEntry(m+j, j, one);
+				PowerSerie[0].setEntry(m+j, j, field().one);
 #ifdef __PRINT_SEQUENCE
 			report<<"PowerSerie:=";
-			write_maple(_field,PowerSerie);
+			write_maple(field(),PowerSerie);
 #endif
 
 
@@ -752,7 +599,7 @@ namespace LinBox
 			std::vector<Coefficient> SigmaBase(length,Zero);
 
 			// Compute Sigma Base up to the order length - 1
-			SigmaBasis<Field> SB(_field, PowerSerie);
+			SigmaBasis<Field> SB(field(), PowerSerie);
 			SB.left_basis(SigmaBase, length-1, defect);
 
 			// take the m rows which have lowest defect
@@ -774,9 +621,10 @@ namespace LinBox
 			for (size_t i=0;i<SigmaBase.size();++i)
 				_BMD.mulin_right(BPerm,SigmaBase[i]);
 
-#if 0
+#ifdef __PRINT_SIGMABASE
+                        report<<"order is "<<length-1<<endl;
 			report<<"SigmaBase:=";
-			write_maple(_field,SigmaBase);
+			write_maple(field(),SigmaBase);
 #endif
 			// Compute the reverse polynomial of SigmaBase according to defect of each row
 			size_t max=defect[0];
@@ -784,25 +632,18 @@ namespace LinBox
 				if (defect[i] > max)
 					max=defect[i];
 
-			P = std::vector<Coefficient> (max+1);
-			Coefficient tmp(m,m);
-			for (size_t i=0;i< max+1;++i)
-				P[i]=tmp;
+                        const Coefficient tmp(field(),m,m);
+			P = std::vector<Coefficient> (max+1,tmp);
 			for (size_t i=0;i<m;i++)
 				for (size_t j=0;j<=defect[i];j++)
 					for (size_t k=0;k<m;k++)
-						_field.assign(P[defect[i]-j].refEntry(i,k), SigmaBase[j].getEntry(i,k));
+						field().assign(P[defect[i]-j].refEntry(i,k), SigmaBase[j].getEntry(i,k));
 
 #ifdef __CHECK_RESULT
 			report<<"Check minimal polynomial application\n";
-			//_container->recompute();
-			typename Sequence::const_iterator _ptr (_container->begin ());
-			for (size_t i=0;i< length; ++i, ++_ptr){
-				PowerSerie[i] = *_ptr;
-			}
 			bool valid=true;
 			for (size_t i=0;i< length - P.size();++i){
-				Coefficient res(m,n);
+				Coefficient res(field(),m,n);
 				Coefficient Power(PowerSerie[i],0,0,m,n);
 				_BMD.mul(res,P[0],Power);
 				for (size_t k=1,j=i+1;k<P.size();++k,++j){
@@ -810,10 +651,9 @@ namespace LinBox
 					_BMD.axpyin(res,P[k],Powerview);
 				}
 				for (size_t j=0;j<m*n;++j)
-					if (!_field.isZero(*(res.getPointer()+j)))
+					if (!field().isZero(*(res.getPointer()+j)))
 						valid= false;
-				//res.write(report,_field)<<std::endl;
-			}
+                        }
 			if (valid)
 				report<<"minpoly is correct\n";
 			else
@@ -822,10 +662,7 @@ namespace LinBox
 
 #ifdef __PRINT_MINPOLY
 			report<<"MinPoly:=";
-			write_maple(_field,P);
-			//Coefficient Mat(*_container->getBB());
-			//report<<"A:=Matrix(";
-			//Mat.write(report,_field,true);
+			write_maple(field(),P);
 #endif
 			std::vector<size_t> degree(m);
 			for (size_t i=0;i<m;++i)
diff --git a/linbox/algorithms/block-wiedemann.h b/linbox/algorithms/block-wiedemann.h
index 8203262..e19a073 100644
--- a/linbox/algorithms/block-wiedemann.h
+++ b/linbox/algorithms/block-wiedemann.h
@@ -27,10 +27,12 @@
 #define __LINBOX_block_wiedemann_H
 
 #include <vector>
+#include <iostream>
+
 
 #include "linbox/integer.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
 #include "linbox/algorithms/blackbox-block-container.h"
 #include "linbox/algorithms/block-massey-domain.h"
 #include "linbox/vector/vector-domain.h"
@@ -42,29 +44,30 @@
 namespace LinBox
 {
 
-	template <class _Field>
+	template <class Context_>
 	class BlockWiedemannSolver{
 
 	public:
-		typedef _Field                          Field;
+		typedef typename Context_::Field                 Field;
 		typedef typename Field::Element       Element;
 		typedef typename Field::RandIter     RandIter;
-		typedef std::vector<Element>         Vector;
-		typedef BlasMatrix<Element>           Block;
+		typedef BlasVector<Field>           Vector;
+		typedef BlasMatrix<Field>               Block;
 
 	protected:
-		Field                         _field;
-		BlasMatrixDomain<Field>     _BMD;
+		Context_     _BMD;
 		VectorDomain<Field>         _VDF;
-		RandIter                   _rand;
+		const RandIter                   _rand;
 
 	public:
-		BlockWiedemannSolver (const Field &F) :
-			_field(F), _BMD(F), _VDF(F), _rand(F)
+		const Field & field() const { return _BMD.field(); }
+
+		BlockWiedemannSolver (const Context_ &C) :
+			_BMD(C.field()), _VDF(C.field()), _rand(const_cast<Field&>(C.field()))
 		{}
 
-		BlockWiedemannSolver (const Field &F, const RandIter &rand) :
-			_field(F), _BMD(F), _VDF(F), _rand(rand)
+		BlockWiedemannSolver (const Field &F, RandIter &rand) :
+			_BMD(F), _VDF(F), _rand(rand)
 		{}
 
 		template <class Blackbox>
@@ -84,11 +87,11 @@ namespace LinBox
 			tmp = n;
 			q = tmp.bitsize()-1;
 			//q=sqrt(tmp);
-			std::cout<<"row block: "<<p<<std::endl;
-			std::cout<<"col block: "<<q<<std::endl;
+			//std::cout<<"row block: "<<p<<std::endl;
+			//std::cout<<"col block: "<<q<<std::endl;
 
 
-			Block U(p,m), UA(p-1,m), V(n,q);
+			Block U(field(),p,m), UA(field(),p-1,m), V(field(),n,q);
 
 			for (size_t i=0;i<n;++i)
 				for (size_t j=0;j<q;++j)
@@ -105,28 +108,33 @@ namespace LinBox
 				A.applyTranspose( *iter_U , *iter_UA );
 
 			for (size_t i=0;i<m;++i)
-				U.setEntry(0,i,y[i]);
+				U.setEntry(0,i,y[(size_t)i]);
 
-			BlackboxBlockContainer<Field,Transpose<Blackbox> > Sequence (&A,_field,U,V);
+			BlackboxBlockContainer<Field,Transpose<Blackbox> > Sequence (&A,field(),U,V);
 			BlockMasseyDomain <Field,BlackboxBlockContainer<Field,Transpose<Blackbox> > > MBD(&Sequence);
 
 			std::vector<Block> minpoly;
 			std::vector<size_t> degree;
 			MBD.left_minpoly_rec(minpoly,degree);
-			MBD.printTimer();
+			//MBD.printTimer();
+
+                        //cout<<"minpoly is: \n";
+                        //write_maple(field(),minpoly);
+                        //cout<<endl;
 
 			size_t idx=0;
-			if ( _field.isZero(minpoly[0].getEntry(0,0))) {
+			if ( field().isZero(minpoly[0].getEntry(0,0))) {
 
 				size_t i=1;
-				while ( _field.isZero(minpoly[0].getEntry(i,0)))
+				while (i<p && field().isZero(minpoly[0].getEntry(i,0)))
 					++i;
-				if (i == m)
+				if (i == p)
 					throw LinboxError(" block minpoly: matrix seems to be singular - abort");
 				else
 					idx=i	;
 			}
 
+			typename Blackbox::Field F = A.field();
 
 			bool classic = true;
 			if ( classic) {
@@ -136,39 +144,39 @@ namespace LinBox
 				 * the first element in this row is non zero.
 				 * we use y and UA as projection (UA= U.A)
 				 */
-				size_t deg = degree[idx];
-				std::vector<Vector> combi(p,Vector(deg+1));
+				size_t deg = degree[(size_t)idx];
+				std::vector<Vector> combi(p,Vector(F,deg+1));
 				for (size_t i=0;i<p;++i)
 					for (size_t k=0;k<deg+1;++k)
-						combi[i][k]=minpoly[k].getEntry(idx,i);
+						combi[(size_t)i][k]=minpoly[k].getEntry(idx,i);
 
-				Vector lhs(n);
+				Vector lhs(F,n);
 				A.applyTranspose(lhs,y);
 				_VDF.mulin(lhs,combi[0][deg]);
 				Vector lhsbis(lhs);
-				for (int i = deg-1 ; i > 0;--i) {
-					_VDF.axpy (lhs, combi[0][i], y, lhsbis);
+				for (int i = (int)deg-1 ; i > 0;--i) {
+					_VDF.axpy (lhs, combi[0][(size_t)i], y, lhsbis);
 					A.applyTranspose (lhsbis, lhs);
 				}
 
 				Vector accu (lhs);
 				for (size_t k=1;k<p;++k){
-					Vector row(m);
+					Vector row(F,m);
 					for (size_t j=0;j<m;++j)
 						row[j]=UA.getEntry(k-1,j);
 					A.applyTranspose(lhs,row);
 					_VDF.mulin(lhs,combi[k][deg]);
-					Vector lhsbis(lhs);
-					for (int i = deg-1 ; i >= 0;--i) {
-						_VDF.axpy (lhs, combi[k][i], row, lhsbis);
-						A.applyTranspose (lhsbis, lhs);
+					Vector lhsbis_loc(lhs);
+					for (int i = (int)deg-1 ; i >= 0;--i) {
+						_VDF.axpy (lhs, combi[k][(size_t)i], row, lhsbis_loc);
+						A.applyTranspose (lhsbis_loc, lhs);
 					}
 					_VDF.addin(accu,lhs);
 				}
 				Element scaling;
-				_field.init(scaling);
-				_field.neg(scaling,combi[0][0]);
-				_field.invin(scaling);
+				field().init(scaling);
+				field().neg(scaling,combi[0][0]);
+				field().invin(scaling);
 				_VDF.mul(x,accu,scaling);
 
 			}
@@ -178,24 +186,24 @@ namespace LinBox
 				 * given by the product of the idx-th row of MinPoly and UA.
 				 * this should decrease the number of sparse apply but increase memory requirement.
 				 */
-				size_t deg = degree[idx];
-				Block idx_poly(deg+1,p-1);
+				size_t deg = degree[(size_t)idx];
+				Block idx_poly(field(),deg+1,p-1);
 				for (size_t i=0;i<deg+1;++i)
 					for (size_t j=0;j<p-1;++j)
-						idx_poly.setEntry(i,j,minpoly[i].getEntry(idx,j+1));
+						idx_poly.setEntry(i,j,minpoly[(size_t)i].getEntry(idx,j+1));
 
-				Block Combi(deg+1,m);
+				Block Combi(field(),deg+1,m);
 				_BMD.mul(Combi,idx_poly,UA);
 
-				Vector lhs(n),row(m);
+				Vector lhs(F,n),row(F,m);
 				for (size_t i=0;i<m;++i)
-					row[i]= Combi.getEntry(deg,i);
+					row[(size_t)i]= Combi.getEntry(deg,i);
 
 				A.applyTranspose(lhs,row);
 				Vector lhsbis(lhs);
-				for (int i = deg-1 ; i >= 0;--i) {
+				for (int i = (int)deg-1 ; i >= 0;--i) {
 					for (size_t j=0;j<m;++j)
-						row[j]= Combi.getEntry(i,j);
+						row[j]= Combi.getEntry((size_t)i,j);
 					_VDF.add (lhs,row,lhsbis);
 					A.applyTranspose (lhsbis, lhs);
 				}
@@ -206,15 +214,15 @@ namespace LinBox
 				_VDF.mulin(lhs,minpoly[deg].getEntry(idx,0));
 				lhsbis=lhs;
 				for (size_t i = deg-1 ; i > 0;--i) {
-					_VDF.axpy (lhs,minpoly[i].getEntry(idx,0) , y, lhsbis);
+					_VDF.axpy (lhs,minpoly[(size_t)i].getEntry(idx,0) , y, lhsbis);
 					A.applyTranspose (lhsbis, lhs);
 				}
 
 				_VDF.addin(accu,lhs);
 				Element scaling;
-				_field.init(scaling);
-				_field.neg(scaling,minpoly[0].getEntry(idx,0));
-				_field.invin(scaling);
+				field().init(scaling);
+				field().neg(scaling,minpoly[0].getEntry(idx,0));
+				field().invin(scaling);
 				_VDF.mul(x,accu,scaling);
 			}
 
@@ -231,11 +239,10 @@ namespace LinBox
 
 #endif //__LINBOX_block_wiedemann_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/bm-seq.h b/linbox/algorithms/bm-seq.h
deleted file mode 100644
index 9d9ce52..0000000
--- a/linbox/algorithms/bm-seq.h
+++ /dev/null
@@ -1,716 +0,0 @@
-
-/* linbox/algorithms/bm-seq.h
- * Copyright (C) 2008 George Yuhasz
- *
- * Written by George Yuhasz gyuhasz at math.ncsu.edu
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-
-
-#ifndef __BM_SEQ_H
-#define __BM_SEQ_H
-
-//Preprocessor variables for the state of BM_iterators
-#define DeltaExceeded  4
-#define SequenceExceeded  3
-#define GeneratorFound  2
-#define GeneratorUnconfirmed  1
-
-#include <vector>
-#include <list>
-#include <set>
-
-#include "linbox/util/timer.h"
-#include "linbox/matrix/matrix-domain.h"
-
-
-
-namespace LinBox {
-	template<class _Field>
-	class BM_Seq {
-
-	public:
-
-		typedef _Field Field;
-		typedef BlasMatrix<Field> value_type;
-		typedef typename std::list<value_type>::const_iterator const_iterator;
-		typedef int size_type;
-
-	private:
-
-		Field& _field;
-		std::list<value_type > _seq;
-		size_type _size;
-		size_t _row, _col;
-
-	public:
-		BM_Seq(Field& F, size_t r, size_t c) : _field(F)
-		{
-			_row = r;
-			_col = c;
-			_size = 0;
-		}
-		BM_Seq(Field& F, size_t r) : _field(F)
-		{
-			_row = r;
-			_col = r;
-			_size = 0;
-		}
-		BM_Seq(int n, value_type& M) : _field(M.field()),  _seq(n, M), _size(n)
-		{
-			_row = M.rowdim();
-			_col = M.coldim();
-		}
-
-		BM_Seq() {}
-
-		BM_Seq(const BM_Seq<Field>& S) :
-			_field(S._field), _seq(S._seq), _size(S._size), _row(S._row), _col(S._col)
-		{}
-
-		BM_Seq & operator=(const BM_Seq<Field>& S)
-		{
-			if(this != &S){
-				(*this)._size = S._size;
-				(*this)._row = S._row;
-				(*this)._col = S._col;
-				(*this)._field = S._field;
-				_seq.clear();
-				for(typename std::list<value_type>::const_iterator it = S._seq.begin(); it != S._seq.end(); it++)
-					_seq.push_back(*it);
-			}
-			return *this;
-		}
-
-		Field& field()
-		{
-			return _field;
-		}
-
-		size_t rowdim()
-		{
-			return _row;
-		}
-
-		size_t coldim()
-		{
-			return _col;
-		}
-
-		const_iterator begin() const
-		{
-			return _seq.begin();
-		}
-
-		const_iterator end() const
-		{
-			return _seq.end();
-		}
-
-		void push_back(const value_type &M)
-		{
-			if(_row==M.rowdim() && _col==M.coldim()){
-				_seq.push_back(M);
-				_size++;
-			}
-		}
-
-		bool operator==(const BM_Seq<Field>& l)
-		{
-			typename std::list<value_type>::const_iterator it, lit;
-			bool test = false;
-			if(_size==l._size && _row==l._row && _col==l._col){
-				test = true;
-				MatrixDomain<Field> MD(_field);
-				it = _seq.begin();
-				lit = l._seq.begin();
-				if(_size==0){
-					return test;
-				}
-				else{
-					while(test && it!=_seq.end()){
-						test = MD.areEqual(*it,*lit);
-						it++;
-						lit++;
-					}
-				}
-			}
-			return test;
-		}
-
-		bool operator!=(const BM_Seq<Field>& l)
-		{
-			return !(*this == l);
-		}
-
-		size_type size()
-		{
-			return _size;
-		}
-
-		class BM_iterator {
-		public:
-			typedef std::list<typename BM_Seq<Field>::value_type> value_type;
-
-		private:
-			typedef typename BM_Seq<Field>::value_type matrix_type;
-			Field& _field;
-			BM_Seq<Field>& _seq;
-			typename BM_Seq<Field>::size_type _size;
-			typename BM_Seq<Field>::size_type _t;
-			typename BM_Seq<Field>::const_iterator _seqel;
-			std::list<matrix_type> _gen;
-			std::vector<int> _deg;
-			int _delta;
-			int _mu;
-			int _beta;
-			int _sigma;
-			int _gensize;
-			size_t _row, _col;
-
-		public:
-			// This is an enumeration class that tells what state the berlekamp/massey algoithm iterator is in.
-			// The four states are:
-			// DeltaExceeded = 4
-			// SequenceExceeded = 3
-			// GeneratorFound = 2
-			// GeneratorUnconfirmed = 1
-			class TerminationState{
-			private:
-
-				int _state;
-				friend class BM_iterator;
-				TerminationState() : _state(GeneratorUnconfirmed) {}
-				TerminationState(int m) : _state(m) {}
-			public:
-				TerminationState(const TerminationState& t) : _state(t._state) {}
-				TerminationState & operator=(const TerminationState & t){
-					if(this != &t){
-						(*this)._state = t._state;
-					}
-					return *this;
-				}
-				bool IsGeneratorUnconfirmed(){
-					return _state==GeneratorUnconfirmed;
-				}
-				bool IsGeneratorFound()
-				{
-					return _state==GeneratorFound;
-				}
-				bool IsSequenceExceeded()
-				{
-					return _state==SequenceExceeded;
-				}
-				bool IsDeltaExceeded()
-				{
-					return _state==DeltaExceeded;
-				}
-			};
-
-		private:
-			TerminationState _state;
-		public:
-			TerminationState state() const
-			{
-				return _state;
-			}
-			void setDelta(int d)
-			{
-				_delta=d;
-				if((_delta < 0 || _beta < _delta - _sigma + _mu +1) && _state._state!=3){
-					if(_sigma <= _delta || _delta < 0)
-						_state._state = GeneratorUnconfirmed;
-					else
-						_state._state = DeltaExceeded;
-				}
-				else{
-					if(_sigma > _delta)
-						_state._state = DeltaExceeded;
-					else
-						_state._state = GeneratorFound;
-				}
-			}
-			//Constructor
-			explicit BM_iterator(BM_Seq<Field>& s, typename BM_Seq<Field>::size_type elinit=0) :
-				_field(s.field()), _seq(s)
-			{
-				_row = s.rowdim();
-				_col = s.coldim();
-				_size = _seq.size();
-				_t = elinit;
-				_delta = -1;
-				_seqel = _seq.begin();
-				_deg = std::vector<int>(_row+_col);
-				for(size_t i = _col; i < _row+_col; i++)
-					_deg[i] = 1;
-				typename Field::Element one;
-				_field.init(one,1);
-				matrix_type gen1(_field,_col,_row+_col);
-				for(size_t i = 0; i<_col; i++)
-					gen1.setEntry(i,i,one);
-				_gen.push_back(gen1);
-				_gensize = 1;
-				if(_size==0 || _t==_size)
-					_state._state = SequenceExceeded;
-				_sigma = 0;
-				_mu = 0;
-				_beta = 1;
-			}
-
-			//Copy constructor
-			BM_iterator(const BM_Seq<Field>::BM_iterator & it) :
-				_field(it._field), _seq(it._seq), _size(it._size), _t(it._t),
-				_seqel(it._seqel), _gen(it._gen), _deg(it._deg),
-				_delta(it._delta), _mu(it._mu), _beta(it._beta),
-				_sigma(it._sigma), _gensize(it._gensize),
-				_row(it._row), _col(it._col), _state(it._state) {}
-
-			//Assignment operator not overloaded since BlasMatrix class has overloaded assignment error
-			//Overloaded assignment operator
-			BM_iterator& operator=(const typename BM_Seq<Field>::BM_iterator& it)
-			{
-				if(this != &it){
-					(*this)._field       = it._field;
-					(*this)._row     = it._row;
-					(*this)._col     = it._col;
-					(*this)._seq     = it._seq;
-					(*this)._size    = it._size;
-					(*this)._t       = it._t;
-					(*this)._seqel   = it._seqel;
-					(*this)._deg     = it._deg;
-					(*this)._gensize = it._gensize;
-					(*this)._delta   = it._delta;
-					(*this)._mu      = it._mu;
-					(*this)._sigma   = it._sigma;
-					(*this)._beta    = it._beta;
-					(*this)._state   = it._state;
-					_gen.clear();
-					for(typename std::list<matrix_type>::const_iterator git = it._gen.begin(); git != it._gen.end(); git++)
-						_seq.push_back(*git);
-				}
-				return (*this);
-			}
-
-			bool operator==(const BM_Seq<Field>::BM_iterator& it)
-			{
-				TerminationState check = it.state();
-				bool test1 = (_seq==it._seq);
-				bool test2 = (_t==it._t);
-				bool test3 = _delta==it._delta;
-				bool test4 = (_state._state == check._state && _state.IsSequenceExceeded());
-				return (test1  && test2  && (test3 || test4));
-			}
-
-			bool operator!=(const BM_iterator& it)
-			{
-				return !((*this) == it);
-			}
-		private:
-
-			// Column Copy
-			template <class Matrix>
-			void ColumnCopy(Matrix &M, const Matrix &A, size_t i)
-			{
-				size_t rowd = A.rowdim();
-				for(size_t j = 0; j<rowd; j++){
-					M.setEntry(j,i,A.getEntry(j,i));
-				}
-			}
-			// Column Swap
-			template <class Matrix>
-			void ColumnSwap(Matrix &M, size_t i, size_t j)
-			{
-				typename Matrix::Field F = M.field();
-				typename Matrix::Element t;
-				F.init(t,0);
-				size_t rowd = M.rowdim();
-				for(size_t k = 0; k < rowd; k++){
-					F.assign(t,M.getEntry(k,i));
-					M.setEntry(k,i,M.getEntry(k,j));
-					M.setEntry(k,j,t);
-				}
-			}
-			// Column Operation
-			template <class Matrix>
-			void ColumnAdd(Matrix &M, size_t i, size_t j, typename Matrix::Element el)
-			{
-				typename Matrix::Field F = M.field();
-				typename Matrix::Element t;
-				F.init(t,0);
-				size_t rowd = M.rowdim();
-				for (size_t k=0; k<rowd; k++){
-					F.mul(t, M.getEntry(k,j), el);
-					F.addin(t,M.getEntry(k,i));
-					M.setEntry(k,i,t);
-				}
-			}
-			template <class Matrix>
-			Matrix  Algorithm3dot2(Matrix &D, std::vector<int> &d, int &mu, int &sigma, int &beta)
-			{
-				typename Matrix::Field F = D.field();
-				typename Matrix::Element one, pivel;
-				F.init(one, 1);
-				F.init(pivel,0);
-				// Retrieve the row and column dimensions of the sequence and the dimension of the discrepancy
-				size_t n = D.rowdim();
-				size_t nm  = D.coldim();
-				size_t m = nm-n;
-				//Initialize tau to the identity matrix
-				Matrix tau(F,nm,nm);
-				for(size_t i = 0; i<nm; i++)
-					tau.setEntry(i,i,one);
-				//Create the set of generator columns
-				std::set<size_t> gen;
-				typedef std::set<size_t>::key_type index_type;
-				for(index_type i=0; i<m; i++)
-					gen.insert(i);
-				for(index_type i = 0; i<n; i++){
-					//Compute pi, the columns of D with nonzero entries in row i
-					std::set<size_t> pi;
-					pi.insert(m+i);
-					for(typename std::set<size_t>::iterator genit = gen.begin(); genit != gen.end(); genit++){
-						if(!F.isZero(D.getEntry(i,*genit)))
-							pi.insert(*genit);
-					}
-
-					//Choose the pivot row with the smallest nominal degree
-					index_type piv = m+i;
-					for(std::set<size_t>::iterator itpi = pi.begin(); itpi != pi.end(); itpi++){
-						size_t j = *itpi;
-						if(d[j] <= d[piv]){
-							if(d[j]==d[piv]){
-								if(piv < m+i){
-									if(j<piv)
-										piv = j;
-								}
-							}
-							else
-								piv = j;
-						}
-					}
-					pi.erase(piv);
-					F.assign(pivel,D.getEntry(i,piv));
-					//Handle the case when piv=m+i, so no swap is done
-					if(piv==m+i){
-						for(std::set<size_t>::iterator itpi = pi.begin(); itpi != pi.end(); itpi++){
-							typename Matrix::Element temp;
-							F.init(temp,D.getEntry(i, *itpi));
-							F.negin(temp);
-							F.divin(temp,pivel);
-							ColumnAdd(tau, *itpi, piv, temp);
-							ColumnAdd(D, *itpi, piv, temp);
-						}
-					}
-					else{
-						//Remove column index m+i and handle it separately
-						pi.erase(m+i);
-						//Eliminate nonzero discrepancies in generator columns
-						for(typename std::set<size_t>::iterator itpi = pi.begin(); itpi != pi.end(); itpi++){
-							typename Matrix::Element temp;
-							F.init(temp,D.getEntry(i, *itpi));
-							F.negin(temp);
-							F.divin(temp,pivel);
-							ColumnAdd(tau, *itpi, piv, temp);
-							ColumnAdd(D, *itpi, piv, temp);
-						}
-						typename Matrix::Element auxel;
-						F.init(auxel,D.getEntry(i,m+i));
-						//Perform a major change and update an initialized auxiliary column
-						if(!F.isZero(auxel)){
-							typename Matrix::Element temp;
-							F.init(temp,D.getEntry(i, m+i));
-							F.negin(temp);
-							F.divin(temp,pivel);
-							ColumnAdd(tau, m+i, piv, temp);
-							ColumnAdd(D, m+i, piv, temp);
-							ColumnSwap(tau,piv, m+i);
-							ColumnSwap(D, piv, m+i);
-						}
-						else{
-							ColumnAdd(tau,m+i,piv,one);
-							ColumnAdd(D,m+i,piv,one);
-							gen.erase(piv);
-						}
-						int tempdeg = d[piv];
-						d[piv] = d[m+i];
-						d[m+i] = tempdeg;
-						if(tempdeg < beta)
-							beta = tempdeg;
-						if(d[piv] > mu)
-							mu = d[piv];
-						sigma = sigma - tempdeg + d[piv];
-					}
-				}
-				return tau;
-			}
-		public:
-			BM_iterator& operator++()
-			{
-				//See if a matrix has been pushed on the sequence
-				//if it has, then recompute the seqel since it may
-				//have become corrupt.
-				//Also reset the size to the correct size of the sequence
-				if(_size < _seq.size()){
-					_seqel = _seq.begin();
-					for(int i = 0; i<_t; i++)
-						_seqel++;
-					_size = _seq.size();
-				}
-				//if the iterator points past the seq elements, do nothing
-				if(_t == _size){
-					return *this;
-				}
-				//Initialize the discrepancy
-				matrix_type disc(_field,_row, _row+_col);
-				//Create two iterators, one for seq, and one for gen
-				typename BM_Seq<Field>::const_iterator cseqit;
-				typename std::list<matrix_type>::iterator genit;
-				//get a iterator to the seq element to be processed
-				cseqit = _seqel;
-				//Create a matrix domain for addition and multiplication
-				MatrixDomain<Field> MD(_field);
-				//Compute the discrepancy
-				for(genit = _gen.begin(); genit!=_gen.end(); genit++){
-					MD.axpyin(disc,*cseqit,*genit);
-					cseqit--;
-				}
-				//Compute tau with Algorith3.2
-				matrix_type tau(Algorithm3dot2(disc, _deg, _mu, _sigma, _beta));
-				//Multiply tau into each matrix in the generator
-				for(genit = _gen.begin(); genit!=_gen.end(); genit++){
-					MD.mulin(*genit,tau);
-				}
-				//Increment the auxiliary degrees and beta
-				for(size_t j = _col; j <_row+_col; j++)
-					_deg[j]++;
-				_beta++;
-				//Add a zero matrix to the end of the generator if needed.
-				int tmax = _deg[0];
-				for(size_t j = 1; j<_row+_col; j++)
-					if(tmax < _deg[j])
-						tmax = _deg[j];
-				if(tmax+1 > _gensize){
-					_gen.push_back(matrix_type(_field,_col,_row+_col));
-					_gensize++;
-				}
-				//Mimic multiplication be z in the auxiliary columns
-				typename std::list<matrix_type>::reverse_iterator g1,g2;
-				g1 = _gen.rbegin();
-				g2 = _gen.rbegin();
-				g1++;
-				while(g1!=_gen.rend()){
-					for(size_t k = _col; k < _row+_col; k++){
-						ColumnCopy(*g2,*g1,k);
-					}
-					g1++;
-					g2++;
-				}
-				genit = _gen.begin();
-				matrix_type z1(_field,_col,_row+_col);
-				for(size_t k = _col; k < _row+_col; k++)
-					ColumnCopy(*genit, z1,k);
-				//Increment the t and seqel to the next element
-				_t++;
-				_seqel++;
-				//Update the state
-				if(_delta < 0 || _beta < _delta - _sigma + _mu +1){
-					if(_t == _size)
-						_state._state = SequenceExceeded;
-					else{
-						if(_sigma > _delta && _delta >= 0)
-							_state._state = DeltaExceeded;
-						else
-							_state._state = GeneratorUnconfirmed;
-					}
-				}
-				else{
-					if(_sigma > _delta)
-						_state._state = DeltaExceeded;
-					else
-						_state._state = GeneratorFound;
-				}
-
-				return *this;
-			}
-			BM_iterator operator++(int)
-			{
-				//Create a copy of this
-				BM_iterator temp(*this);
-
-				//See if a matrix has been pushed on the sequence
-				//if it has, then recompute the seqel since it may
-				//have become corrupt.
-				//Also reset the size to the correct size of the sequence
-				if(_size < _seq.size()){
-					_seqel = _seq.begin();
-					for(int i = 0; i<_t; i++)
-						_seqel++;
-					_size = _seq.size();
-				}
-				//if the iterator points past the seq elements, do nothing
-				if(_t == _size){
-					return *this;
-				}
-				//Initialize the discrepancy
-				matrix_type disc(_field,_row, _row+_col);
-				//Create two iterators, one for seq, and one for gen
-				typename BM_Seq<Field>::const_iterator cseqit;
-				typename std::list<matrix_type>::iterator genit;
-				//get an iterator to the seq element to be processed
-				cseqit = _seqel;
-				//Create a matrix domain for addition and multiplication
-				MatrixDomain<Field> MD(_field);
-				//Compute the discrepancy
-				for(genit = _gen.begin(); genit!=_gen.end(); genit++, cseqit--){
-					MD.axpyin(disc,*cseqit,*genit);
-				} // cost: k*n^3 (nxn matrix muladds where k is current generator length)
-				  // is a reductive addition over independent muls.
-				//Compute tau with Algorith3.2
-				matrix_type tau(Algorithm3dot2(disc, _deg, _mu, _sigma, _beta));
-				  // cost: n^3 for elim on n x about 2n
-				//Multiply tau into each matrix in the generator
-				for(genit = _gen.begin(); genit!=_gen.end(); genit++){
-					MD.mulin(*genit,tau);
-				} // cost: k*n^3 (nxn matrix muls where k is current generator length)
-				  // is k independent muls with a shared mat tau.
-				//Increment the auxiliary degrees and beta
-				for(size_t j = _col; j <_row+_col; j++)
-					_deg[j]++;
-				_beta++;
-				//Add a zero matrix to the end of the generator if needed.
-				int tmax = _deg[0];
-				for(size_t j = 1; j<_row+_col; j++)
-					if(tmax < _deg[j])
-						tmax = _deg[j];
-				if(tmax+1 > _gensize){
-					_gen.push_back(matrix_type(_field,_col,_row+_col));
-					_gensize++;
-				}
-				//Mimic multiplication by z in the auxiliary columns
-				typename std::list<matrix_type>::reverse_iterator g1,g2;
-				g1 = _gen.rbegin();
-				g2 = _gen.rbegin();
-				g1++;
-				while(g1!=_gen.rend()){
-					for(size_t k = _col; k < _row+_col; k++){
-						ColumnCopy(*g2,*g1,k);
-					}
-					g1++;
-					g2++;
-				}
-				genit = _gen.begin();
-				matrix_type z1(_field,_col,_row+_col);
-				for(size_t k = _col; k < _row+_col; k++)
-					ColumnCopy(*genit, z1,k);
-				//Increment the t and seqel to the next element
-				_t++;
-				_seqel++;
-				//Update the state
-				if(_delta < 0 || _beta < _delta - _sigma + _mu +1){
-					if(_t == _size)
-						_state._state = SequenceExceeded;
-					else{
-						if(_sigma > _delta && _delta >= 0)
-							_state._state = DeltaExceeded;
-						else
-							_state._state = GeneratorUnconfirmed;
-					}
-				}
-				else{
-					if(_sigma > _delta)
-						_state._state = DeltaExceeded;
-					else
-						_state._state = GeneratorFound;
-				}
-
-				return temp;
-			}
-			//return a reference to the current generator, in its algorithmic reversed form
-			value_type& operator*()
-			{
-				return _gen;
-			}
-			//overload the pointer operator
-			value_type* operator->()
-			{
-				return &_gen;
-			}
-			//Return a vector representing the reversal, by nominal degree, of the current generator
-			std::vector<matrix_type> GetGenerator()
-			{
-				std::vector<matrix_type> revgen(_mu+1, matrix_type(_field,_col,_col));
-				for(size_t i = 0; i<_col; i++){
-					typename std::list<matrix_type>::iterator genit = _gen.begin();
-					for(int j = 0; j < _deg[i]+1; j++){
-						ColumnCopy(revgen[_deg[i]-j], *genit,i);
-						genit++;
-					}
-				}
-				return revgen;
-			}
-
-			typename BM_Seq<Field>::size_type get_t()
-			{
-				return _t;
-			}
-
-			int get_mu()
-			{
-				return _mu;
-			}
-
-			int get_sigma()
-			{
-				return _sigma;
-			}
-			int get_beta()
-			{
-				return _beta;
-			}
-			int get_delta()
-			{
-				return _delta;
-			}
-		};
-		//return an initialized BM_iterator
-		typename BM_Seq<Field>::BM_iterator BM_begin()
-		{
-			return typename BM_Seq<Field>::BM_iterator(*this);
-		}
-		//return an initialized BM_iterator that points to one past the end of the sequence
-		typename BM_Seq<Field>::BM_iterator BM_end()
-		{
-			return typename BM_Seq<Field>::BM_iterator(*this, _size);
-		}
-		/**/
-	};
-}
-
-#endif
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/algorithms/charpoly-rational.h b/linbox/algorithms/charpoly-rational.h
index 9322628..13ce385 100644
--- a/linbox/algorithms/charpoly-rational.h
+++ b/linbox/algorithms/charpoly-rational.h
@@ -27,10 +27,9 @@
 
 #include "linbox/util/commentator.h"
 #include "linbox/util/timer.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 
 //#include "linbox/field/gmp-rational.h"
-#include "linbox/field/PID-integer.h"
 #include "linbox/blackbox/rational-matrix-factory.h"
 #include "linbox/algorithms/cra-early-multip.h"
 #include "linbox/algorithms/cra-domain.h"
@@ -165,7 +164,6 @@ namespace LinBox
 								const MyMethod &Met=  Method::Hybrid())
 	{
 
-		typedef Modular<double> myModular;
 		typedef typename Rationals::Element Quotient;
 
 		commentator().start ("Rational Charpoly", "Rminpoly");
@@ -176,32 +174,32 @@ namespace LinBox
 		std::vector<Integer> M(A.rowdim()+1,1);
 		std::vector<Integer> Di(A.rowdim());
 
-		RationalMatrixFactory<PID_integer,Rationals,BlasMatrix<Rationals > > FA(&A);
+		RationalMatrixFactory<Givaro::ZRing<Integer>,Rationals,BlasMatrix<Rationals > > FA(&A);
 		Integer da=1, di=1; Integer D=1;
 		FA.denominator(da);
 
-		for (int i=M.size()-2; i >= 0 ; --i) {
+		for (int i=(int)M.size()-2; i >= 0 ; --i) {
 			//c[m]=1, c[0]=det(A);
 			FA.denominator(di,i);
 			D *=di;
-			Di[i]=di;
-			M[i] = M[i+1]*da;
+			Di[(size_t)i]=di;
+			M[(size_t)i] = M[(size_t)i+1]*da;
 		}
-		for (int i=0; i < M.size() ; ++i ) {
-			gcd(M[i],M[i],D);
+		for (int i=0; i < (int) M.size() ; ++i ) {
+			gcd(M[(size_t)i],M[(size_t)i],D);
 		}
 
-		PID_integer Z;
-		BlasMatrix<PID_integer> Atilde(Z,A.rowdim(), A.coldim());
+		Givaro::ZRing<Integer> Z;
+		BlasMatrix<Givaro::ZRing<Integer> > Atilde(Z,A.rowdim(), A.coldim());
 		FA.makeAtilde(Atilde);
 
-		ChineseRemainder< EarlyMultipCRA<Modular<double> > > cra(4UL);
+		ChineseRemainder< EarlyMultipCRA<Givaro::Modular<double> > > cra(4UL);
 		MyRationalModularCharpoly<BlasMatrix<Rationals > , MyMethod> iteration1(A, Met, M);
-		MyIntegerModularCharpoly<BlasMatrix<PID_integer>, MyMethod> iteration2(Atilde, Met, Di, M);
+		MyIntegerModularCharpoly<BlasMatrix<Givaro::ZRing<Integer> >, MyMethod> iteration2(Atilde, Met, Di, M);
 		MyModularCharpoly<MyRationalModularCharpoly<BlasMatrix<Rationals > , MyMethod>,
-		MyIntegerModularCharpoly<BlasMatrix<PID_integer>, MyMethod> >  iteration(&iteration1,&iteration2);
+		MyIntegerModularCharpoly<BlasMatrix<Givaro::ZRing<Integer> >, MyMethod> >  iteration(&iteration1,&iteration2);
 
-		RReconstruction<PID_integer, ClassicMaxQRationalReconstruction<PID_integer> > RR;
+		RReconstruction<Givaro::ZRing<Integer>, ClassicMaxQRationalReconstruction<Givaro::ZRing<Integer> > > RR;
 
 		std::vector<Integer> PP; // use of integer due to non genericity of cra. PG 2005-08-04
 		UserTimer t1,t2;
@@ -231,27 +229,27 @@ namespace LinBox
 			Integer m; //Integer r; Integer a,b;
 			cra.getModulus(m);
 			cra.result(PP);//need to divide
-			for (int i=0; i < PP.size(); ++i) {
+			for (int i=0; i < (int)PP.size(); ++i) {
 				Integer D_1;
-				inv(D_1,M[i],m);
-				PP[i] = (PP[i]*D_1) % m;
+				inv(D_1,M[(size_t)i],m);
+				PP[(size_t)i] = (PP[(size_t)i]*D_1) % m;
 			}
 			Integer den,den1;
 			std::vector<Integer> num(A.rowdim()+1);
 			std::vector<Integer> num1(A.rowdim()+1);
-			if (RR.reconstructRational(num,den,PP,m,-1)) {//performs reconstruction strating form c[m], use c[i] as prec for c[i-1]
+			if (RR.reconstructRational(num,den,PP,m,-1)) {//performs reconstruction strating form c[m], use c[(size_t)i] as prec for c[(size_t)i-1]
 				cra(1,PP,iteration,genprime);
 				cra.getModulus(m);
-				for (int i=0; i < PP.size(); ++i) {
+				for (int i=0; i < (int)PP.size(); ++i) {
 					Integer D_1;
-					inv(D_1,M[i],m);
-					PP[i] = (PP[i]*D_1) % m;
+					inv(D_1,M[(size_t)i],m);
+					PP[(size_t)i] = (PP[(size_t)i]*D_1) % m;
 				}
-				bool terminated = true;
 				if (RR.reconstructRational(num1,den1,PP,m,-1)) {
+					bool terminated = true;
 					if (den==den1) {
-						for (int i=0; i < num.size(); ++i) {
-							if (num[i] != num1[i]) {
+						for (int i=0; i < (int)num.size(); ++i) {
+							if (num[(size_t)i] != num1[(size_t)i]) {
 								terminated =false;
 								break;
 							}
@@ -271,7 +269,7 @@ namespace LinBox
 						typename Vector <typename Rationals::Element>::iterator it;
 						Rationals Q;
 						for (it= p.begin(); it != p.end(); ++it, ++i) {
-							A.field().init(*it, num[i],den);
+							A.field().init(*it, num[(size_t)i],den);
 							Q.get_den(t,*it);
 							if (it != p.begin()) Q.get_den(tt,*(it-1));
 							else tt = 1;
@@ -279,7 +277,7 @@ namespace LinBox
 
 						}
 						return p;
-						break;
+						// break;
 					}
 				}
 			}
@@ -290,9 +288,9 @@ namespace LinBox
 		size_t i =0;
 		integer t,tt;
 		integer err;
-		size_t max_res=0;int max_i;
+		// size_t max_res=0;int max_i;
 		// double rel;
-		size_t max_resu=0; int max_iu;
+		// size_t max_resu=0; int max_iu;
 		// size_t max_err = 0;
 		Quotient qerr;
 		p.resize(PP.size());
@@ -301,27 +299,27 @@ namespace LinBox
 
 		Rationals Q;
 		for (it= p.begin(); it != p.end(); ++it, ++i) {
-			A.field().init(*it, PP[i],M[i]);
+			A.field().init(*it, PP[(size_t)i],M[(size_t)i]);
 			Q.get_den(t, *it);
 			Q.get_num(tt,*it);
-			err = M[i]/t;
-			size_t resi = err.bitsize() + tt.bitsize() -1;
-			size_t resu = t.bitsize() + tt.bitsize() -1;
-			if (resi > max_res) {max_res = resi; max_i=i;}
-			if (resu > max_resu) {max_resu = resu; max_iu =i;}
+			err = M[(size_t)i]/t;
+			// size_t resi = err.bitsize() + tt.bitsize() -1;
+			// size_t resu = t.bitsize() + tt.bitsize() -1;
+			// if (resi > max_res) {max_res = resi; max_i=i;}
+			// if (resu > max_resu) {max_resu = resu; max_iu =i;}
 			//size_t resu = t.bitsize() + tt.bitsize() -1;
 			//if (err.bitsize() > max_err) max_err = err.bitsize();
 		}
 
-		max_res=0;
+		// max_res=0;
 		for (it= p.begin()+1; it != p.end(); ++it) {
-			//A.field().init(*it, PP[i],M[i]);
+			//A.field().init(*it, PP[(size_t)i],M[(size_t)i]);
 			Q.get_den(t, *it);
 			Q.get_den(tt, *(it-1));
 			Q.init(qerr,t,tt);
 			Q.get_num(tt, *it);
-			size_t resi = Q.bitsize(t,qerr) + tt.bitsize() -2;
-			if (resi > max_res) {max_res = resi; max_i=i;}
+			// size_t resi = Q.bitsize(t,qerr) + tt.bitsize() -2;
+			// if (resi > max_res) {max_res = resi; max_i=i;}
 			//if (err.bitsize() > max_err) max_err = err.bitsize();
 		}
 
diff --git a/linbox/algorithms/cia.h b/linbox/algorithms/cia.h
index aa61e1c..24f2672 100644
--- a/linbox/algorithms/cia.h
+++ b/linbox/algorithms/cia.h
@@ -27,11 +27,11 @@
 #ifndef __LINBOX_cia_H
 #define __LINBOX_cia_H
 
-#include "linbox/ring/givaro-polynomial.h"
-#include "linbox/field/modular.h"
+#include <givaro/givpoly1factor.h>
+#include "linbox/ring/modular.h"
 #include "linbox/randiter/random-prime.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
 #include "linbox/solutions/minpoly.h"
 
 namespace LinBox
@@ -52,12 +52,12 @@ namespace LinBox
 		commentator().start ("Integer Givaro::Dense Charpoly ", "CIA");
 
 		typename Blackbox::Field intRing = A.field();
-		typedef Modular<double>                                                 Field;
-		typedef typename Blackbox::template rebind<Field>::other            FBlackbox;
-		typedef GivPolynomialRing<typename Blackbox::Field, Givaro::Dense> IntPolyDom;
-		typedef GivPolynomialRing<Field, Givaro::Dense>                  FieldPolyDom;
-		typedef typename IntPolyDom::Element                                  IntPoly;
-		typedef typename FieldPolyDom::Element                              FieldPoly;
+		typedef Givaro::Modular<double> Field;
+		typedef typename Blackbox::template rebind<Field>::other FBlackbox;
+		typedef Givaro::Poly1FactorDom<typename Blackbox::Field, Givaro::Dense> IntPolyDom;
+		typedef Givaro::Poly1FactorDom<Field, Givaro::Dense>                  FieldPolyDom;
+		typedef typename IntPolyDom::Element IntPoly;
+		typedef typename FieldPolyDom::Element FieldPoly;
 
 		IntPolyDom IPD(intRing);
 
@@ -67,8 +67,8 @@ namespace LinBox
 		minpoly (intMinPoly, A, RingCategories::IntegerTag(), M);
 
 		/* Factorization over the integers */
-		std::vector<IntPoly*> intFactors;
-		std::vector<unsigned long> mult;
+		std::vector<IntPoly> intFactors;
+		std::vector<uint64_t> mult;
 		IPD.factor (intFactors, mult, intMinPoly);
 		size_t nf = intFactors.size();
 
@@ -76,7 +76,7 @@ namespace LinBox
 		RandomPrimeIterator primeg (22);
 		++primeg;
 		Field F(*primeg);
-		FBlackbox fbb(F, (int)A.rowdim(), (int)A.coldim());
+		FBlackbox fbb(F, A.rowdim(), A.coldim());
 		MatrixHom::map(fbb, A);
 		charpoly (fieldCharPoly, fbb, M);
 		/* Determination of the multiplicities */
@@ -84,11 +84,11 @@ namespace LinBox
 		std::vector<FieldPoly> fieldFactors (nf);
 		integer tmp_convert; // PG 2005-08-04
 		for (size_t i = 0; i < nf; ++i){
-			size_t d= intFactors[i]->size();
+			size_t d= intFactors[i].size();
 			fieldFactors[i].resize(d);
 			for (size_t j = 0; j < d; ++j)
 				//F.init ((fieldFactors[i])[j], (*intFactors[i])[j]);
-				F.init ((fieldFactors[i])[j], intRing.convert(tmp_convert,(*intFactors[i])[j]));// PG 2005-08-04
+				F.init ((fieldFactors[i])[j], intRing.convert(tmp_convert,(intFactors[i])[j]));// PG 2005-08-04
 		}
 
 		FieldPoly currPol = fieldCharPoly;
@@ -108,13 +108,13 @@ namespace LinBox
 		}
 
 		IntPoly intCharPoly (A.coldim());
-		intRing.init (intCharPoly[0], 1);
+		intRing.assign (intCharPoly[0], intRing.one);
 		for (size_t i = 0; i < nf; ++i){
-			IPD.pow( P, *intFactors[i], multip[i] );
+			IPD.pow( P, intFactors[i], multip[i] );
 			IPD.mulin( intCharPoly, P );
 		}
-		for (size_t i = 0; i < nf; ++i)
-			delete intFactors[i];
+		//for (size_t i = 0; i < nf; ++i)
+		//delete intFactors[i];
 		commentator().stop ("done", NULL, "CIA");
 
 		return P = intCharPoly;
@@ -124,11 +124,10 @@ namespace LinBox
 #endif // __LINBOX_cia_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/classic-rational-reconstruction.h b/linbox/algorithms/classic-rational-reconstruction.h
index 90da6f6..1de07be 100644
--- a/linbox/algorithms/classic-rational-reconstruction.h
+++ b/linbox/algorithms/classic-rational-reconstruction.h
@@ -244,8 +244,8 @@ namespace LinBox
 			}
 
 			bool reconstructRational(Element& a, Element& b, const Element& x, const Element& m, const Element& a_bound) const{
-				bool res= false;
-				return res = ClassicRationalReconstruction<Ring>::reconstructRational(a,b,x,m,a_bound);
+				// bool res= false;
+				return /*  res =*/ ClassicRationalReconstruction<Ring>::reconstructRational(a,b,x,m,a_bound);
 			}
 
 		protected:
@@ -263,7 +263,7 @@ namespace LinBox
 				Element T = m.bitsize();
 				int c = 5;	//should be changed here to enhance probability of correctness
 
-				while((a>0) && (r0.bitsize() > T.bitsize() + c))
+				while((a>0) && (r0.bitsize() > T.bitsize() + (unsigned long)c))
 				{
 					q = r0;
 					_intRing.divin(q,a);        // r0/num
@@ -272,7 +272,7 @@ namespace LinBox
 						amax = a;
 						bmax = b;
 						qmax = q;
-						if (qmax.bitsize() > T.bitsize() + c) break;
+						if (qmax.bitsize() > T.bitsize() + (unsigned long)c) break;
 					}
 
 					u = a;
@@ -307,7 +307,7 @@ namespace LinBox
 				//Element T = m.bitsize();
 				//int c = 20;
 				//T=0;c=0;
-				if (qmax.bitsize() > T.bitsize() + c) {
+				if (qmax.bitsize() > T.bitsize() + (unsigned long)c) {
 					return true;
 				}
 				else return false;
@@ -320,11 +320,10 @@ namespace LinBox
 	}
 #endif //__LINBOX_classic_reconstruction_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/coppersmith-invariant-factors.h b/linbox/algorithms/coppersmith-invariant-factors.h
new file mode 100644
index 0000000..29efa8a
--- /dev/null
+++ b/linbox/algorithms/coppersmith-invariant-factors.h
@@ -0,0 +1,193 @@
+/* linbox/algorithms/coppersmith-invariant-factors.h
+ * Copyright (C) 2014 Alex Stachnik
+ *
+ * Written by Alex Stachnik <stachnik at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_coppersmith_invariant_factors_H
+#define __LINBOX_coppersmith_invariant_factors_H
+
+#include "linbox/algorithms/block-coppersmith-domain.h"
+#include "linbox/algorithms/blackbox-block-container.h"
+//#include "linbox/algorithms/alt-blackbox-block-container.h"
+#include "linbox/matrix/random-matrix.h"
+
+#include <givaro/givpoly1.h>
+#include <linbox/ring/givaro-poly.h>
+#include <linbox/algorithms/smith-form-kannan-bachem.h>
+#include <linbox/algorithms/smith-form-iliopoulos.h>
+#include <linbox/algorithms/poly-det.h>
+#include "linbox/ring/givaro-poly-mod-poly.h"
+
+#include <omp.h>
+
+namespace LinBox
+{
+
+template<class Field_,class Blackbox_,class Field2_=Field_>
+class CoppersmithInvariantFactors {
+public:
+	typedef Field_ Field;
+	typedef Blackbox_ Blackbox;
+	typedef MatrixDomain<Field> Domain;
+	typedef typename Domain::OwnMatrix Block;
+	typedef typename Field::RandIter RandIter;
+	typedef Givaro::Poly1Dom<Field,Givaro::Dense> PolyDom;
+	typedef GivaroPoly<PolyDom> PolyRing;
+	typedef typename PolyRing::Element PolyElement;
+	typedef MatrixDomain<PolyRing> PolyMatDom;
+	typedef typename PolyMatDom::OwnMatrix PolyBlock;
+
+	CoppersmithInvariantFactors():
+		M_(NULL), n_(0), b_(0) {}
+
+	void init(Field& F, const Blackbox& M, size_t b) {
+		F_=F;
+		M_=M;
+		n_=M.rowdim();
+		MD_=Domain(F);
+		U_=Block(F,b,M.rowdim());
+		V_=Block(F,M.rowdim(),b);
+		b_=b;
+
+		RandIter RI(F_);
+		RandomDenseMatrix<RandIter,Field> RDM(F_,RI);
+		RDM.random(U_);
+		RDM.random(V_);
+	}
+
+	CoppersmithInvariantFactors(Field& F, const Blackbox& M, size_t b):
+		MD_(F), F_(F), M_(&M), n_(M.rowdim()), b_(b),
+		U_(F,b,M.rowdim()), V_(F,M.rowdim(),b)
+	{
+		RandIter RI(F_);
+		RandomDenseMatrix<RandIter,Field> RDM(F_,RI);
+		RDM.random(U_);
+		RDM.random(V_);
+	}
+
+	template <class Mat1, class Mat2>
+	CoppersmithInvariantFactors(Field& F, const Blackbox& M, size_t b,
+	                            const Mat1& U, const Mat2& V):
+		MD_(F), F_(F), M_(&M), n_(M.rowdim()), b_(b),
+		U_(F,b,M.rowdim()), V_(F,M.rowdim(),b)
+	{
+		MD_.copy(U_,U);
+		MD_.copy(V_,V);
+	}
+
+	template <class PolyRingVector>
+	size_t computeFactors(PolyRingVector& diag, int earlyTerm=10)
+	{
+		//typedef AltBlackboxBlockContainer<Field,Blackbox,typename MatrixDomain<Field2_>::OwnMatrix > BBC;
+		typedef BlackboxBlockContainer<Field,Blackbox> BBC;
+		typedef BlockCoppersmithDomain<MatrixDomain<Field2_>,BBC> BCD;
+		BBC blockSeq(M_,F_,U_,V_);
+		MatrixDomain<Field2_> BMD(F_);
+		BCD coppersmith(BMD,&blockSeq,earlyTerm);
+
+		std::vector<size_t> deg;
+		std::vector<typename MatrixDomain<Field2_>::OwnMatrix > gen;
+		deg=coppersmith.right_minpoly(gen);
+		commentator().report(Commentator::LEVEL_IMPORTANT,PROGRESS_REPORT)
+			<<"Finished computing minpoly"<<std::endl;
+
+		PolyDom PD(F_,"x");
+		PolyRing R(PD);
+		PolyMatDom PMD(R);
+		size_t d=gen.size();
+		PolyBlock MM(R,b_,b_);
+		PolyElement temp,detPoly;
+		PD.init(temp,d-1);
+
+#ifdef OUTPUT_CHECKPOINTS
+		{
+			ofstream oF("checkpoint.txt");
+			for (int i=0;i<d;++i) {
+				BMD.write(oF,gen[i]);
+			}
+			oF.close();
+		}
+#endif
+
+		for (uint32_t i = 0; i < b_; ++i) {
+			for (uint32_t j = 0; j < b_; ++j) {
+				for (uint32_t k = 0; k < d; ++k) {
+					PD.setEntry(temp,gen[k].getEntry(i,j),k);
+				}
+				MM.setEntry(i,j,temp);
+			}
+		}
+		
+#ifdef OUTPUT_CHECKPOINTS
+		computePolyDetExtension(detPoly,F_,MM);
+		
+		{
+			ofstream oF("polyDetCheckpoint.txt");
+			PD.write(oF,detPoly);
+			oF << std::endl;
+			oF.close();
+		}
+
+		{
+			GivaroPolyModPoly<Field2_> GPMPD(F_,detPoly);
+			GivaroPoly<typename GivaroPolyModPoly<Field2_>::Parent_t > GPMPDW(*(GPMPD.getExtension()));
+			MatrixDomain<GivaroPoly<GivaroPolyModPoly<Field2_> > > GPMPDWMD(GPMPDW);
+			typename MatrixDomain<GivaroPoly<GivaroPolyModPoly<Field2_> > >::OwnMatrix MMCopy(GPMPDW,b_,b_);
+			for (int i=0;i<b_;++i) {
+				for (int j=0;j<b_;++j) {
+					for (int k=0;k<d;++k) {
+						PD.setEntry(temp,gen[k].getEntry(i,j),k);
+					}
+					MMCopy.setEntry(i,j,temp);
+				}
+			}
+			SmithFormIliopoulos::solve(diag,MMCopy);
+		}
+#endif
+		SmithFormKannanBachemDomain<PolyMatDom> SFKB(PMD);
+		diag.resize(b_);
+		SFKB.solve(diag,MM);
+
+		for (uint32_t i = 0; i < diag.size(); ++i) {
+			R.normalizeIn(diag[i]);
+		}
+
+		return diag.size();
+	}
+
+protected:
+
+	Domain MD_;
+
+	Field F_;
+
+	const Blackbox *M_;
+
+	size_t n_,b_;
+
+	Block U_,V_;
+};
+
+}
+
+
+#endif //__LINBOX_coppersmith_invariant_factors_H
diff --git a/linbox/algorithms/coppersmith.h b/linbox/algorithms/coppersmith.h
new file mode 100644
index 0000000..53acf26
--- /dev/null
+++ b/linbox/algorithms/coppersmith.h
@@ -0,0 +1,479 @@
+/* linbox/algorithms/coppersmith.h
+ * evolved from block-wiedemann.h by George Yuhasz
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+#ifndef __LINBOX_coppersmith_H
+#define __LINBOX_coppersmith_H
+
+#include <vector>
+#include <numeric>
+#include <algorithm>
+#include <iostream>
+#include <givaro/givpoly1crt.h>
+
+
+#include "linbox/integer.h"
+#include "linbox/util/commentator.h"
+#include "linbox/algorithms/blackbox-block-container.h"
+#include "linbox/algorithms/block-coppersmith-domain.h"
+#include "linbox/solutions/det.h"
+
+#include "linbox/util/error.h"
+#include "linbox/util/debug.h"
+
+namespace LinBox
+{
+
+	template <class _Domain>
+	class CoppersmithSolver{
+
+	public:
+		typedef _Domain 			Domain;
+		typedef typename Domain::Field                    Field;
+		typedef typename Domain::Element       Element;
+		typedef typename Domain::OwnMatrix 	Block;
+		typedef typename Domain::Matrix 	Sub;
+
+		inline const Domain & domain() const { return *_MD; }
+		inline const Field & field() const { return domain().field(); }
+	protected:
+		const Domain     *_MD;
+		size_t		blocking;
+
+	public:
+		CoppersmithSolver(const Domain &MD, size_t blocking_ = 0) :
+			 _MD(&MD), blocking(blocking_)
+		{}
+
+
+		template <class Vector, class Blackbox>
+		Vector &solveNonSingular (Vector &x, const Blackbox &B, const Vector &y) const
+		{
+			commentator().start ("Coppersmith solveNonSingular", "solveNonSingular");
+#if 1
+			std::ostream& report = commentator().report(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+#endif
+
+			//Set up the projection matrices and their dimensions
+			size_t d = B.coldim();
+			size_t r,c;
+			integer tmp = d;
+
+			//Set the blocking size, Using Pascal Giorgi's convention
+			if(blocking==0){
+				r=tmp.bitsize()-1;
+				c=tmp.bitsize()-1;
+			}else
+				r=c=blocking;
+
+			//Create the block
+			Block U(field(),r,d);
+			Block W(field(),d,c-1);
+			Block V(field(),d,c);
+
+			//Pick random entries for U and W. W will become the last c-1 columns of V
+
+			U.random();
+			W.random();
+
+			//Multiply W by B on the left and place it in the last c-1 columns of V
+			Sub V2(V,0,1,d,c-1);
+			domain().mul(V2,B,W);
+
+			//Make the first column of V a copy of the right side of the system, y
+			for(size_t i=0; i<d; i++)
+				V.setEntry(i,0,y[i]);
+
+			//Create the sequence container and its iterator that will compute the projection
+			BlackboxBlockContainer<Field, Blackbox > blockseq(&B,field(),U,V);
+
+			//Get the generator of the projection using the Coppersmith algorithm (slightly modified by Yuhasz)
+			BlockCoppersmithDomain<Domain, BlackboxBlockContainer<Field, Blackbox> > BCD(domain(), &blockseq,d);
+			std::vector<Block> gen;
+			std::vector<size_t> deg;
+			deg = BCD.right_minpoly(gen);
+			report << "Size of blockseq " << blockseq.size() << std::endl;
+			report << "Size of gen " << gen.size() << std::endl;
+			for(size_t i = 0; i < gen[0].coldim(); i++)
+				report << "Column " << i << " has degree " << deg[i] << std::endl;
+
+			//Reconstruct the solution
+			//Pick a column of the generator with a nonzero element in the first row of the constant coefficient
+			size_t idx = 0;
+			if(field().isZero(gen[0].getEntry(0,0))){
+				size_t i = 1;
+				while(i<c && field().isZero(gen[0].getEntry(0,i)))
+					i++;
+				if(i==c)
+					throw LinboxError(" block minpoly: matrix seems to be singular - abort");
+				else
+					idx=i;
+			}
+
+			//from 1 to the degree of the index column, multiply A^(i-1)V times the idx column of the generator coefficient x^i
+			//Accumulate these results in xm
+			size_t mu = deg[idx];
+			Block BVo(V);
+			Block BVe(field(),d,c);
+			Block xm(field(),d,1);
+			bool odd = true;
+			for(size_t i = 1; i < mu+1; i++){
+				Sub gencol(gen[i],0,idx,c,1); // BB changed d,1 to c,1
+				Block BVgencol(field(),d,1);
+				if(odd){
+					domain().mul(BVgencol,BVo,gencol);
+					domain().addin(xm, BVgencol);
+					domain().mul(BVe,B,BVo);
+					odd=false;
+				}
+				else{
+					domain().mul(BVgencol,BVe,gencol);
+					domain().addin(xm, BVgencol);
+					domain().mul(BVo,B,BVe);
+					odd=true;
+				}
+
+			}
+
+			//For the constant coefficient, loop over the elements in the idx column except the first row
+			//Multiply the corresponding column of W (the last c-1 columns of V before application of B) by the generator element
+			//Accumulate the results in xm
+			for(size_t i = 1; i < c; i++){
+				Sub Wcol(W,0,i-1,d,1);
+				Block Wcolgen0(field(),d,1);
+				domain().mul(Wcolgen0, Wcol, gen[0].getEntry(i,idx));
+				domain().addin(xm,Wcolgen0);
+			}
+
+			//Multiply xm by -1(move to the correct side of the equation) and divide the the 0,idx entry of the generator constant
+			Element gen0inv;
+			field().inv(gen0inv,gen[0].getEntry(0,idx));
+			field().negin(gen0inv);
+			domain().mulin(xm, gen0inv);
+
+#if 0
+			//Test to see if the answer works with U
+			Block Bxm(field(),d,1), UBxm(field(),r,1), Uycol(field(), r,1);
+			Sub ycol(V,0,0,d,1);
+			domain().mul(Uycol, U, ycol);
+			domain().mul(Bxm, B, xm);
+			domain().mul(UBxm, U, Bxm);
+
+			if(domain().areEqual(UBxm, Uycol))
+				report << "The solution matches when projected by U" << endl;
+			else
+				report << "The solution does not match when projected by U" << endl;
+#endif
+
+
+			//Copy xm into x (Change type from 1 column matrix to Vector)
+			for(size_t i =0; i<d; i++)
+				x[i]=xm.getEntry(i,0);
+
+			commentator().stop ("done", NULL, "solveNonSingular");
+			return x;
+		}
+
+
+
+
+	}; // end of class CoppersmithSolver
+
+	template <class _Domain>
+	class CoppersmithRank{
+
+	public:
+		typedef _Domain 			Domain;
+		typedef typename Domain::Field                    Field;
+		typedef typename Domain::Element       Element;
+		typedef typename Domain::Matrix 	Block;
+		typedef typename Domain::Submatrix 	Sub;
+		typedef typename Field::RandIter	Random;
+
+		inline const Domain & domain() const { return *_MD; }
+		inline const Field & field() const { return domain().field(); }
+	protected:
+		const Domain     *_MD;
+		Random		iter;
+		size_t		blocking;
+
+		//Compute the determinant of a polynomial matrix at the given set of evaluation points
+		//Store the results in the vector dets.
+		void EvalPolyMat(std::vector<Element> &dets, std::vector<Element> &values, std::vector<Block> & mat) const {
+
+			size_t deg = mat.size() -1;
+			size_t numv = values.size();
+			//Compute the determinant of the evaluation at values[i] for each i
+			for(size_t i = 0; i<numv; i++){
+				//copy the highest matrix coefficient
+				Block evalmat(field(), mat[0].rowdim(), mat[0].coldim());
+				domain().copy(evalmat,mat[deg]);
+				//Evaluate using a horner style evaluation
+				typename std::vector<Block>::reverse_iterator addit =  mat.rbegin();
+				addit++;
+				for(addit; addit != mat.rend(); addit++){
+					domain().mulin(evalmat,values[i]);
+					domain().addin(evalmat,*addit);
+				}//end loop computing horner evaluation
+				//Compute the determinant of the evaluation and store it in dets[i]
+				dets[i] = det(dets[i],evalmat);
+			}//end loop over evaluation points
+		}//end evaluation of polynominal matrix determinant
+
+	public:
+		CoppersmithRank(const Domain &MD, size_t blocking_ = 0) :
+			 _MD(&MD), blocking(blocking_), iter(MD.field())
+		{}
+
+
+		template <class Blackbox>
+		size_t rank (const Blackbox &B) const
+		{
+			commentator().start ("Coppersmith rank", "rank");
+#if 1
+			std::ostream& report = commentator().report(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+#endif
+
+			//Set up the projection matrices and their dimensions
+			size_t d = B.coldim();
+			size_t r,c;
+			integer tmp = d;
+
+			//Set the blocking size, Using Pascal Giorgi's convention
+			if(blocking==0){
+				r=tmp.bitsize()-1;
+				c=tmp.bitsize()-1;
+			}else
+				r=c=blocking;
+
+			//Create the block
+			Block U(field(),r,d);
+			Block V(field(),d,c);
+
+			//Pick random entries for U and W. W will become the last c-1 columns of V
+
+			U.random();
+			V.random();
+
+
+			BlackboxBlockContainer<Field, Blackbox > blockseq(&B,field(),U,V);
+
+			//Get the generator of the projection using the Coppersmith algorithm (slightly modified by Yuhasz)
+			BlockCoppersmithDomain<Domain, BlackboxBlockContainer<Field, Blackbox> > BCD(domain(), &blockseq,d);
+			std::vector<Block> gen;
+			std::vector<size_t> deg;
+			deg = BCD.right_minpoly(gen);
+			for(size_t i = 0; i < gen[0].coldim(); i++)
+				report << "Column " << i << " has degree " << deg[i] << std::endl;
+
+			//Compute the rank via the determinant of the generator
+			//Get the sum of column degrees
+			//This is the degree of the determinant via Yuhasz thesis
+			//size_t detdeg = std::accumulate(deg.begin(), deg.end(), 0);
+			size_t detdeg= 0;
+			for(size_t i = 0; i < gen[0].coldim(); i++)
+				detdeg+=deg[i];
+			//Set up interpolation with one more evaluation point than degree
+			size_t numpoints = d+1;
+			std::vector<Element> evalpoints(numpoints), evaldets(numpoints);
+			for(typename std::vector<Element>::iterator evalit = evalpoints.begin(); evalit != evalpoints.end(); evalit++){
+				do{
+					//do iter.random(*evalit); while(field().isZero(*evalit));
+					iter.random(*evalit);
+				}while ((std::find(evalpoints.begin(), evalit, *evalit) != evalit));
+			}//end evaluation point construction loop
+
+			//Evaluate the generator determinant at the points
+			EvalPolyMat(evaldets, evalpoints, gen);
+			for(size_t k = 0; k <numpoints; k++)
+				report << evalpoints[k] << "  " << evaldets[k] << std::endl;
+			//Construct the polynomial using Givare interpolation
+			//Stolen from Pascal Giorgi, linbox/examples/omp-block-rank.C
+			typedef Givaro::Poly1CRT< Field >  PolyCRT;
+			PolyCRT Interpolator(field(), evalpoints, "x");
+			typename PolyCRT::Element Determinant;
+			Interpolator.RnsToRing(Determinant,evaldets);
+			Givaro::Degree intdetdeg;
+			Interpolator.getpolydom().degree(intdetdeg,Determinant);
+			Givaro::Degree intdetval;
+			Interpolator.getpolydom().val(intdetval,Determinant);
+			if(detdeg != (size_t) intdetdeg.value()){
+				report << "sum of column degrees " << detdeg << std::endl;
+				report << "interpolation degree " << intdetdeg.value() << std::endl;
+			}
+			report << "sum of column degrees " << detdeg << std::endl;
+			report << "interpolation degree " << intdetdeg.value() << std::endl;
+			report << "valence (trailing degree) " << intdetval.value() << std::endl;
+			for(size_t k = 0; k<gen.size(); k++)
+				domain().write(report, gen[k]) << "x^" << k << std::endl;
+			Interpolator.write(report << "Interpolated determinant: ", Determinant) << std::endl;
+			size_t myrank = size_t(intdetdeg.value() - intdetval.value());
+			commentator().stop ("done", NULL, "Coppersmith rank");
+			return myrank;
+		}
+
+
+
+
+	}; // end of class CoppersmithRank
+
+	//Use the coppersmith block wiedemann to compute the determinant
+	template <class _Domain>
+	class CoppersmithDeterminant{
+
+	public:
+		typedef _Domain 			Domain;
+		typedef typename Domain::Field                    Field;
+		typedef typename Domain::Element       Element;
+		typedef typename Domain::Matrix 	Block;
+		typedef typename Domain::Submatrix 	Sub;
+		typedef typename Field::RandIter	Random;
+
+		inline const Domain & domain() const { return *_MD; }
+		inline const Field & field() const { return domain().field(); }
+	protected:
+		const Domain     *_MD;
+		Random		iter;
+		size_t		blocking;
+
+		//Compute the determinant of a polynomial matrix at the given set of evaluation points
+		//Store the results in the vector dets.
+		void EvalPolyMat(std::vector<Element> &dets, std::vector<Element> &values, std::vector<Block> & mat) const {
+
+			size_t deg = mat.size() -1;
+			size_t numv = values.size();
+			//Compute the determinant of the evaluation at values[i] for each i
+			for(size_t i = 0; i<numv; i++){
+				//copy the highest matrix coefficient
+				Block evalmat(mat[deg]);
+				//Evaluate using a horner style evaluation
+				typename std::vector<Block>::reverse_iterator addit =  mat.rbegin();
+				addit++;
+				for(addit; addit != mat.rend(); addit++){
+					domain().mulin(evalmat,values[i]);
+					domain().addin(evalmat,*addit);
+				}//end loop computing horner evaluation
+				//Compute the determinant of the evaluation and store it in dets[i]
+				dets[i] = det(dets[i],evalmat);
+			}//end loop over evaluation points
+		}//end evaluation of polynominal matrix determinant
+
+	public:
+		CoppersmithDeterminant(const Domain &MD, size_t blocking_ = 0) :
+			 _MD(&MD), blocking(blocking_), iter(MD.field())
+		{}
+
+
+		template <class Blackbox>
+		Element det (const Blackbox &B) const
+		{
+			commentator().start ("Coppersmith determinant", "determinant");
+#if 1
+			std::ostream& report = commentator().report(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+#endif
+
+			//Set up the projection matrices and their dimensions
+			size_t d = B.coldim();
+			size_t r,c;
+			integer tmp = d;
+
+			//Use given blocking size, if not given use Pascal Giorgi's convention
+			if(blocking==0){
+				r=tmp.bitsize()-1;
+				c=tmp.bitsize()-1;
+			}else
+				r=c=blocking;
+
+			//Create the block
+			Block U(field(),r,d);
+			Block V(field(),d,c);
+
+			//Pick random entries for U and W. W will become the last c-1 columns of V
+
+			U.random();
+			V.random();
+
+			//Multiply V by B on the left
+			domain().leftMulin(B,V);
+
+			//Create the sequence container and its iterator that will compute the projection
+			BlackboxBlockContainer<Field, Blackbox > blockseq(&B,field(),U,V);
+
+			//Get the generator of the projection using the Coppersmith algorithm (slightly modified by Yuhasz)
+			BlockCoppersmithDomain<Domain, BlackboxBlockContainer<Field, Blackbox> > BCD(domain(), &blockseq,d);
+			std::vector<Block> gen;
+			std::vector<size_t> deg;
+			deg = BCD.right_minpoly(gen);
+
+			//Compute the determinant via the constant coefficient of the determinant of the generator
+			//Get the sum of column degrees
+			//This is the degree of the determinant via Yuhasz thesis
+			//size_t detdeg = std::accumulate(deg.begin(), deg.end(), 0);
+			size_t detdeg= 0;
+			for(size_t i = 0; i < gen[0].coldim(); i++)
+				detdeg+=deg[i];
+			//Set up interpolation with one more evaluation point than degree
+			size_t numpoints = 2*d;
+			std::vector<Element> evalpoints(numpoints), evaldets(numpoints);
+			for(typename std::vector<Element>::iterator evalit = evalpoints.begin(); evalit != evalpoints.end(); evalit++){
+				do{
+					do iter.random(*evalit); while(field().isZero(*evalit));
+				}while ((std::find(evalpoints.begin(), evalit, *evalit) != evalit));
+			}//end evaluation point construction loop
+
+			//Evaluate the generator determinant at the points
+			EvalPolyMat(evaldets, evalpoints, gen);
+			//Construct the polynomial using Givare interpolation
+			//Stolen from Pascal Giorgi, linbox/examples/omp-block-rank.C
+			typedef Givaro::Poly1CRT<Field>  PolyCRT;
+			PolyCRT Interpolator(field(), evalpoints, "x");
+			typename PolyCRT::Element Determinant;
+			Interpolator.RnsToRing(Determinant,evaldets);
+			Givaro::Degree intdetdeg;
+			Interpolator.getpolydom().degree(intdetdeg,Determinant);
+			Givaro::Degree intdetval(0);
+			Interpolator.getpolydom().val(intdetval,Determinant);
+			if(d != (size_t)intdetdeg.value()){
+				report << "The matrix is singular, determinant is zero" << std::endl;
+				return field(0).zero;
+			}
+			Interpolator.write(report << "Interpolated determinant: ", Determinant) << std::endl;
+			Element intdeterminant(field().zero);
+			Interpolator.getpolydom().getEntry(intdeterminant,intdetval,Determinant);
+			commentator().stop ("done", NULL, "Coppersmith determinant");
+			return intdeterminant;
+		}
+
+	}; // end of class CoppersmithDeterminant
+
+
+}// end of namespace LinBox
+
+#endif //__LINBOX_coppersmith_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/cra-domain-omp.h b/linbox/algorithms/cra-domain-omp.h
index 5648f85..38c4c99 100644
--- a/linbox/algorithms/cra-domain-omp.h
+++ b/linbox/algorithms/cra-domain-omp.h
@@ -34,8 +34,9 @@
 #define __LINBOX_omp_cra_H
 // commentator is not thread safe
 #define DISABLE_COMMENTATOR
-#include "linbox/algorithms/cra-domain-seq.h"
+#include <omp.h>
 #include <set>
+#include "linbox/algorithms/cra-domain-seq.h"
 
 namespace LinBox
 {
@@ -58,9 +59,14 @@ namespace LinBox
 		template<class Function, class PrimeIterator>
 		Integer& operator() (Integer& res, Function& Iteration, PrimeIterator& primeiter)
 		{
+			//! @bug why why why ???
+			/** erreur: ‘omp_get_max_threads’ has not been declared
+			 * ../linbox/algorithms/cra-domain-omp.h:152:16: note: suggested alternative:
+			 * /usr/lib/gcc/x86_64-linux-gnu/4.6/include/omp.h:64:12: note:   ‘Givaro::omp_get_max_threads’
+			 */
 			size_t NN = omp_get_max_threads();
 			//std::cerr << "Blocs: " << NN << " iterations." << std::endl;
-			// commentator().start ("Parallel OMP Modular iteration", "mmcrait");
+			// commentator().start ("Parallel OMP Givaro::Modular iteration", "mmcrait");
 			if (NN == 1) return Father_t::operator()(res,Iteration,primeiter);
 
 			int coprime =0;
@@ -150,7 +156,7 @@ namespace LinBox
 			typedef typename CRATemporaryVectorTrait<Function, DomainElement>::Type_t ElementContainer;
 			size_t NN = omp_get_max_threads();
 			//std::cerr << "Blocs: " << NN << " iterations." << std::endl;
-			// commentator().start ("Parallel OMP Modular iteration", "mmcrait");
+			// commentator().start ("Parallel OMP Givaro::Modular iteration", "mmcrait");
 			if (NN == 1) return Father_t::operator()(res,Iteration,primeiter);
 
 			int coprime =0;
diff --git a/linbox/algorithms/cra-domain-seq.h b/linbox/algorithms/cra-domain-seq.h
index 96001ca..12c3838 100644
--- a/linbox/algorithms/cra-domain-seq.h
+++ b/linbox/algorithms/cra-domain-seq.h
@@ -1,7 +1,7 @@
 /* linbox/algorithms/cra-domain-seq.h
  * Copyright (C) 1999-2010 The LinBox group
  *
- * Time-stamp: <01 Apr 11 15:47:48 Jean-Guillaume.Dumas at imag.fr>
+ * Time-stamp: <29 Jun 15 18:59:17 Jean-Guillaume.Dumas at imag.fr>
  *
  * ========LICENCE========
  * This file is part of the library LinBox.
@@ -29,12 +29,13 @@
 
 #ifndef __LINBOX_sequential_cra_H
 #define __LINBOX_sequential_cra_H
+#include "linbox/linbox-config.h"
 #include "linbox/util/timer.h"
-#include <stdlib.h>
 #include "linbox/integer.h"
 #include "linbox/solutions/methods.h"
-#include <vector>
+#include "linbox/vector/blas-vector.h"
 #include <utility>
+#include <stdlib.h>
 #include "linbox/util/commentator.h"
 
 //$define _LB_CRATIMING
@@ -42,8 +43,8 @@
 namespace LinBox
 {
 
-	template<class Function, class Element> struct CRATemporaryVectorTrait {
-		typedef std::vector<Element> Type_t;
+	template<class Function, class Field> struct CRATemporaryVectorTrait {
+		typedef BlasVector<Field> Type_t;
 	};
 
 
@@ -61,7 +62,7 @@ namespace LinBox
 
 		template<class Param>
 		ChineseRemainderSeq(const Param& b) :
-			Builder_(b)
+			Builder_(b) //! @bug test-cra-domain/clang++ emits a warning
 		{
 			IterCounter=0;
 		}
@@ -94,7 +95,7 @@ namespace LinBox
 		template<class Function, class PrimeIterator>
 		Integer& operator() (Integer& res, Function& Iteration, PrimeIterator& primeiter)
 		{
-			commentator().start ("Modular iteration", "mmcrait");
+			commentator().start ("Givaro::Modular iteration", "mmcrait");
 			if (IterCounter==0) {
 				++IterCounter;
 				Domain D(*primeiter);
@@ -106,7 +107,7 @@ namespace LinBox
 				Builder_.initialize( D, Iteration(r, D) );
 			}
 
-			int coprime =0;
+			int coprime =0, nbprimes=0;
 			int maxnoncoprime = 1000;
 
 			while( ! Builder_.terminated() ) {
@@ -115,14 +116,14 @@ namespace LinBox
 					++primeiter;
 					++coprime;
 					if (coprime > maxnoncoprime) {
-						std::cout << "you are running out of primes. " << maxnoncoprime << " coprime primes found";
+						commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_ERROR) << "you are running out of primes. " << nbprimes << " used and " << maxnoncoprime << " coprime primes tried for a new one.";
 						return Builder_.result(res);
 					}
 				}
 				coprime =0;
 				Domain D(*primeiter);
 				commentator().report(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION) << "With prime " << *primeiter << std::endl;
-                                ++primeiter;
+				++primeiter; ++nbprimes;
 				DomainElement r; D.init(r);
 				Builder_.progress( D, Iteration(r, D) );
 			}
@@ -150,7 +151,7 @@ namespace LinBox
 				Builder_.initialize( D, Iteration(r, D) );
 			}
 
-			int coprime =0;
+			int coprime =0, nbprimes=0;
 			int maxnoncoprime = 1000;
 
 			while ((k <0) || (i < k)) {
@@ -160,7 +161,7 @@ namespace LinBox
 					++primeiter;
 					++coprime;
 					if (coprime > maxnoncoprime) {
-						std::cout << "you are running out of primes. " << maxnoncoprime << " coprime primes found";
+						commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_ERROR) << "you are running out of primes. " << nbprimes << " used and " << maxnoncoprime << " coprime primes tried for a new one.";
 						return true ;//term
 					}
 				}
@@ -168,7 +169,7 @@ namespace LinBox
 
 				Domain D(*primeiter);
 				commentator().report(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION) << "With prime " << *primeiter << std::endl;
-				++primeiter;
+				++primeiter; ++nbprimes;
 				DomainElement r; D.init(r);
 				Builder_.progress( D, Iteration(r, D) );
 			}
@@ -181,17 +182,16 @@ namespace LinBox
 		template<class Iterator, class Function, class PrimeIterator>
 		Iterator& operator() (Iterator& res, Function& Iteration, PrimeIterator& primeiter)
 		{
-			commentator().start ("Modular vectorized iteration", "mmcravit");
+			commentator().start ("Givaro::Modular vectorized iteration", "mmcravit");
 
 			if (IterCounter==0) {
 				Domain D(*primeiter);
 				commentator().report(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION) << "With prime " << *primeiter << std::endl;
 				++primeiter;
-				typename CRATemporaryVectorTrait<Function, DomainElement>::Type_t r;
+				typename CRATemporaryVectorTrait<Function, Domain>::Type_t r(D);
 				Builder_.initialize( D, Iteration(r, D) );
 			}
-
-			int coprime =0;
+			int coprime =0, nbprimes=0;
 			int maxnoncoprime = 1000;
 
 			while( ! Builder_.terminated() ) {
@@ -200,15 +200,15 @@ namespace LinBox
 					++primeiter;
 					++coprime;
 					if (coprime > maxnoncoprime) {
-						std::cout << "you are running out of primes. " << maxnoncoprime << " coprime primes found";
+						commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_ERROR) << "you are running out of primes. " << nbprimes << " used and " << maxnoncoprime << " coprime primes tried for a new one.";
 						return Builder_.result(res);
 					}
 				}
-
+                                coprime = 0;
                                 Domain D(*primeiter);
 				commentator().report(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION) << "With prime " << *primeiter << std::endl;
-                                ++primeiter;
-				typename CRATemporaryVectorTrait<Function, DomainElement>::Type_t r;
+                                ++primeiter; ++nbprimes;
+				typename CRATemporaryVectorTrait<Function, Domain>::Type_t r(D);
 				Builder_.progress( D, Iteration(r, D) );
 			}
 			commentator().stop ("done", NULL, "mmcravit");
@@ -218,7 +218,6 @@ namespace LinBox
 		/*
 		 *progress for k iterations
 		 */
-
 		template<class Iterator, class Function, class PrimeIterator>
 		bool operator() (const int k, Iterator& res, Function& Iteration, PrimeIterator& primeiter)
 		{
@@ -230,11 +229,11 @@ namespace LinBox
 				Domain D(*primeiter);
 				commentator().report(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION) << "With prime " << *primeiter << std::endl;
 				++primeiter;
-				typename CRATemporaryVectorTrait<Function, DomainElement>::Type_t r;
+				typename CRATemporaryVectorTrait<Function, Domain>::Type_t r;
 				Builder_.initialize( D, Iteration(r, D) );
 			}
 
-			int coprime =0;
+			int coprime =0, nbprimes=0;
 			int maxnoncoprime = 1000;
 
 			while( (k <0 ) || (i < k)) {
@@ -246,16 +245,16 @@ namespace LinBox
 					++primeiter;
 					++coprime;
 					if (coprime > maxnoncoprime) {
-						std::cout << "you are runnig out of primes. " << maxnoncoprime << " coprime primes found";
+						commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_ERROR) << "you are running out of primes. " << nbprimes << " used and " << maxnoncoprime << " coprime primes tried for a new one.";
 						return true;//term
 					}
 				}
 
 				coprime =0;
 				Domain D(*primeiter);
-				++primeiter;
+				++primeiter; ++nbprimes;
 
-				typename CRATemporaryVectorTrait<Function, DomainElement>::Type_t r;
+				typename CRATemporaryVectorTrait<Function, Domain>::Type_t r;
 				Builder_.progress( D, Iteration(r, D) );
 			}
 			Builder_.result(res);
@@ -337,11 +336,11 @@ namespace LinBox
 
 #endif //__LINBOX_sequential_cra_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
 
diff --git a/linbox/algorithms/cra-domain.h b/linbox/algorithms/cra-domain.h
index de8506e..4324d5b 100644
--- a/linbox/algorithms/cra-domain.h
+++ b/linbox/algorithms/cra-domain.h
@@ -31,11 +31,12 @@
  * @ingroup algorithms
  * @ingroup CRA
  *
- * If _OPENMP is defined, the we use ChineseRemainderOMP, else
+ * If LINBOX_USES_OPENMP is defined, the we use ChineseRemainderOMP, else
  * we fall back to ChineseRemainderSeq
  */
 
-#ifdef _OPENMP
+#include "linbox/integer.h"
+#ifdef LINBOX_USES_OPENMP
 
 #include "linbox/algorithms/cra-domain-omp.h"
 namespace LinBox
@@ -43,7 +44,7 @@ namespace LinBox
 	/*! @brief Wrapper around OMP/SEQ version of ChineseRemainderXXX<CRABase>.
 	 * \ingroup CRA
 	 *
-	 * If _OPENMP is defined, the we use ChineseRemainderOMP, else
+	 * If LINBOX_USES_OPENMP is defined, the we use ChineseRemainderOMP, else
 	 * we fall back to ChineseRemainderSeq
 	 *
 	 * This is the OMP version
@@ -73,7 +74,7 @@ namespace LinBox
 	/*! @brief Wrapper around OMP/SEQ version of ChineseRemainderXXX<CRABase>.
 	 * \ingroup CRA
 	 *
-	 * If _OPENMP is defined, the we use ChineseRemainderOMP, else
+	 * If LINBOX_USES_OPENMP is defined, the we use ChineseRemainderOMP, else
 	 * we fall back to ChineseRemainderSeq
 	 *
 	 * This is the SEQ version
diff --git a/linbox/algorithms/cra-early-multip.h b/linbox/algorithms/cra-early-multip.h
index 979303c..e40ba50 100644
--- a/linbox/algorithms/cra-early-multip.h
+++ b/linbox/algorithms/cra-early-multip.h
@@ -59,6 +59,7 @@ namespace LinBox
 		// of the elements to be reconstructed
 		std::vector< unsigned long >      	randv;
 
+		Integer& result(Integer &d) { std::cout << "should not be called" << std::endl; return d ;} ; // DON'T TOUCH
 	public:
 
 		EarlyMultipCRA(const unsigned long EARLY=DEFAULT_EARLY_TERM_THRESHOLD) :
@@ -75,6 +76,7 @@ namespace LinBox
 			EarlySingleCRA<Domain>::getResidue(m);
 			return m;
 		}
+
 		template<template<class T> class Vect>
 		Vect<Integer>& getResidue(Vect<Integer>& m)
 		{
@@ -82,6 +84,7 @@ namespace LinBox
 			return m;
 		}
 
+		//! Init
 		template<template<class T> class Vect>
 		void initialize (const Integer& D, const Vect<Integer>& e)
 		{
@@ -114,6 +117,26 @@ namespace LinBox
 			FullMultipCRA<Domain>::initialize(D, e);
 		}
 
+		template<class OKDomain>
+		void initialize (const Domain& D, const BlasVector<OKDomain>& e)
+		{
+			// Random coefficients for a linear combination
+			// of the elements to be reconstructed
+			srand48(BaseTimer::seed());
+			randv. resize ( e.size() );
+			for ( std::vector<unsigned long>::iterator int_p = randv. begin();
+			      int_p != randv. end(); ++ int_p)
+				*int_p = ((unsigned long)lrand48()) % 20000;
+			DomainElement z;
+			// Could be much faster
+			// - do not compute twice the product of moduli
+			// - reconstruct one element of e until Early Termination,
+			//   then only, try a random linear combination.
+			EarlySingleCRA<Domain>::initialize(D,dot(z, D, e, randv) );
+			FullMultipCRA<Domain>::initialize(D, e);
+		}
+
+		//! Progress
 		template<template<class T> class Vect>
 		void progress (const Integer& D, const Vect<Integer>& e)
 		{
@@ -123,24 +146,49 @@ namespace LinBox
 			FullMultipCRA<Domain>::progress(D, e);
 		}
 
+#if 1
 		template<template <class> class Alloc, template<class, class> class Vect>
 		void progress (const Domain& D, const Vect<DomainElement, Alloc<DomainElement> >& e)
 		{
+			// DomainElement z;
+			/*!@todo Could be much faster
+			  - do not compute twice the product of moduli
+			  - reconstruct one element of e until Early Termination,
+			  then only, try a random linear combination.
+			*/
+			// EarlySingleCRA<Domain>::progress(D, dot(z, D, e, randv));
+			// FullMultipCRA<Domain>::progress(D, e);
+			BlasVector<Domain> d(D,e);
+			this->progress(D,d);
+		}
+#endif
+
+		template<class OKDomain>
+		void progress (const Domain& D, const BlasVector<OKDomain>& e)
+		{
 			DomainElement z;
-			// Could be much faster
-			// - do not compute twice the product of moduli
-			// - reconstruct one element of e until Early Termination,
-			//   then only, try a random linear combination.
+			/*!@todo Could be much faster
+			  - do not compute twice the product of moduli
+			  - reconstruct one element of e until Early Termination,
+			  then only, try a random linear combination.
+			*/
 			EarlySingleCRA<Domain>::progress(D, dot(z, D, e, randv));
 			FullMultipCRA<Domain>::progress(D, e);
 		}
 
+		//! Result
 		template<template <class> class Alloc, template<class, class> class Vect>
 		Vect<Integer, Alloc<Integer> >& result(Vect<Integer, Alloc<Integer> >& d)
 		{
 			return FullMultipCRA<Domain>::result(d);
 		}
 
+		BlasVector<Givaro::ZRing<Integer> >& result(BlasVector<Givaro::ZRing<Integer> >& d)
+		{
+			return FullMultipCRA<Domain>::result(d);
+		}
+
+		//! terminate
 		bool terminated()
 		{
 			return EarlySingleCRA<Domain>::terminated();
@@ -213,7 +261,7 @@ namespace LinBox
 				    const Vect2& v2)
 		{
 
-			D.init(z,0); DomainElement tmp;
+			D.assign(z,D.zero); DomainElement tmp;
 			typename Vect1<DomainElement, Alloc<DomainElement> >::const_iterator v1_p;
 			typename Vect2::const_iterator v2_p;
 			for (v1_p  = v1. begin(), v2_p = v2. begin();
@@ -225,16 +273,35 @@ namespace LinBox
 			//             commentator().report(Commentator::LEVEL_ALWAYS, INTERNAL_DESCRIPTION) << "z: " << z << std::endl;
 			return z;
 		}
+
+		template <class Vect2, class OKDomain>
+		DomainElement& dot (DomainElement& z, const Domain& D,
+				    const BlasVector<OKDomain>& v1,
+				    const Vect2& v2)
+		{
+
+			D.assign(z,D.zero); DomainElement tmp;
+			typename BlasVector<Domain>::const_iterator v1_p;
+			typename Vect2::const_iterator v2_p;
+			for (v1_p  = v1. begin(), v2_p = v2. begin();
+			     v1_p != v1. end();
+			     ++ v1_p, ++ v2_p)
+				D.axpyin(z, (*v1_p), D.init(tmp, (*v2_p)));
+
+			//             commentator().report(Commentator::LEVEL_ALWAYS, INTERNAL_DESCRIPTION) << "v: " << v2 << std::endl;
+			//             commentator().report(Commentator::LEVEL_ALWAYS, INTERNAL_DESCRIPTION) << "z: " << z << std::endl;
+			return z;
+		}
+
 	};
 }
 #endif //__LINBOX_cra_early_multip_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/cra-early-single.h b/linbox/algorithms/cra-early-single.h
index 3c3496a..0aba016 100644
--- a/linbox/algorithms/cra-early-single.h
+++ b/linbox/algorithms/cra-early-single.h
@@ -69,8 +69,8 @@ namespace LinBox
 	public:
 
 		EarlySingleCRA(const unsigned long EARLY=DEFAULT_EARLY_TERM_THRESHOLD) :
-			primeProd_(1UL),
-			nextM_(1UL),
+			primeProd_(1U),
+			nextM_(1U),
 			occurency_(0U),
 			EARLY_TERM_THRESHOLD((unsigned)EARLY-1)
 		{
@@ -97,7 +97,7 @@ namespace LinBox
 			tInit.start();
 #endif
 			primeProd_ = D;
-			nextM_ = 1UL;
+			nextM_ = 1U;
 			residue_ = e;
 			occurency_ = 1;
 #ifdef CRATIMING
@@ -113,7 +113,7 @@ namespace LinBox
 			tInit.start();
 #endif
 			D.characteristic( primeProd_ );
-			nextM_ = 1UL;
+			nextM_ = 1U;
 			D.convert( residue_, e);
 			occurency_ = 1;
 #ifdef CRATIMING
diff --git a/linbox/algorithms/cra-full-multip-fixed.h b/linbox/algorithms/cra-full-multip-fixed.h
index 74f7955..206b8ec 100644
--- a/linbox/algorithms/cra-full-multip-fixed.h
+++ b/linbox/algorithms/cra-full-multip-fixed.h
@@ -61,7 +61,7 @@ namespace LinBox
 		typedef std::vector<double>::iterator        DoubleVect_Iterator ;
 		typedef std::vector< bool >::iterator          BoolVect_Iterator ;
 		typedef std::vector< LazyProduct >::iterator   LazyVect_Iterator ;
-		typedef std::vector< Integer >                           IntVect ;
+		typedef BlasVector< Givaro::ZRing<Integer> >                        IntVect ;
 		typedef IntVect::iterator                       IntVect_Iterator ;
 		typedef std::vector< IntVect >::iterator    IntVectVect_Iterator ;
 		typedef IntVect::const_iterator            IntVect_ConstIterator ;
@@ -77,7 +77,8 @@ namespace LinBox
 		{
 			this->RadixSizes_.resize(1);
 			this->RadixPrimeProd_.resize(1);
-			this->RadixResidues_.resize(1);
+			Givaro::ZRing<Integer> ZZ ;
+			this->RadixResidues_.resize(1,BlasVector<Givaro::ZRing<Integer>>(ZZ));
 			this->RadixOccupancy_.resize(1);
 			this->RadixOccupancy_.front() = false;
 		}
@@ -122,7 +123,8 @@ namespace LinBox
 			IntVectVect_Iterator _tab_it = this->RadixResidues_.begin();
 			BoolVect_Iterator    _occ_it = this->RadixOccupancy_.begin();
 
-			IntVect ri(this->size);
+			Givaro::ZRing<Integer> ZZ;
+			IntVect ri(ZZ,this->size);
 			LazyProduct mi;
 			double di;
 			if (*_occ_it) {
@@ -310,7 +312,7 @@ namespace LinBox
 		typedef std::vector<double>::iterator        DoubleVect_Iterator ;
 		typedef std::vector< bool >::iterator          BoolVect_Iterator ;
 		typedef std::vector< LazyProduct >::iterator   LazyVect_Iterator ;
-		typedef std::vector< Integer >                           IntVect ;
+		typedef BlasVector< Givaro::ZRing<Integer> >                        IntVect ;
 		typedef IntVect::iterator                       IntVect_Iterator ;
 		typedef std::vector< IntVect >::iterator    IntVectVect_Iterator ;
 		typedef IntVect::const_iterator            IntVect_ConstIterator ;
@@ -326,7 +328,8 @@ namespace LinBox
 		{
 			this->RadixSizes_.resize(1);
 			this->RadixPrimeProd_.resize(1);
-			this->RadixResidues_.resize(1);
+			Givaro::ZRing<Integer> ZZ ;
+			this->RadixResidues_.resize(1,BlasVector<Givaro::ZRing<Integer>>(ZZ));
 			this->RadixOccupancy_.resize(1);
 			this->RadixOccupancy_.front() = false;
 		}
@@ -368,7 +371,8 @@ namespace LinBox
 			IntVectVect_Iterator _tab_it = this->RadixResidues_.begin();
 			BoolVect_Iterator    _occ_it = this->RadixOccupancy_.begin();
 
-			IntVect ri(this->size);
+			Givaro::ZRing<Integer> ZZ;
+			IntVect ri(ZZ,this->size);
 			LazyProduct mi;
 			double di;
 			if (*_occ_it) {
diff --git a/linbox/algorithms/cra-full-multip.h b/linbox/algorithms/cra-full-multip.h
index 4377702..ec2da34 100644
--- a/linbox/algorithms/cra-full-multip.h
+++ b/linbox/algorithms/cra-full-multip.h
@@ -34,7 +34,7 @@
 #include <stdlib.h>
 #include "linbox/integer.h"
 #include "linbox/solutions/methods.h"
-#include <vector>
+#include "linbox/vector/blas-vector.h"
 #include <utility>
 
 #include "linbox/algorithms/lazy-product.h"
@@ -58,7 +58,7 @@ namespace LinBox
 	protected:
 		std::vector< double >           	RadixSizes_;
 		std::vector< LazyProduct >      	RadixPrimeProd_;
-		std::vector< std::vector<Integer> >    	RadixResidues_;
+		std::vector< BlasVector<Givaro::ZRing<Integer> > >  RadixResidues_;
 		std::vector< bool >             	RadixOccupancy_;
 		const double				LOGARITHMIC_UPPER_BOUND;
 		double					totalsize;
@@ -72,7 +72,8 @@ namespace LinBox
 
 		Integer& getModulus(Integer& m)
 		{
-			std::vector<Integer> r; result(r);
+			Givaro::ZRing<Integer> ZZ;
+			BlasVector<Givaro::ZRing<Integer> > r(ZZ); result(r);
 			return m=RadixPrimeProd_.back()();
 		}
 
@@ -83,25 +84,28 @@ namespace LinBox
 			return r;
 		}
 
+		//! init
 		template<class Vect>
 		void initialize (const Integer& D, const Vect& e)
 		{
 			RadixSizes_.resize(1);
 			RadixPrimeProd_.resize(1);
-			RadixResidues_.resize(1);
+			Givaro::ZRing<Integer> ZZ ;
+			const BlasVector<Givaro::ZRing<Integer> >z(ZZ);
+			RadixResidues_.resize(1,z);
 			RadixOccupancy_.resize(1); RadixOccupancy_.front() = false;
 			progress( D, e);
 #if 0
 			std::vector< double >::iterator  _dsz_it = RadixSizes_.begin();
 			std::vector< LazyProduct >::iterator _mod_it = RadixPrimeProd_.begin();
-			std::vector< std::vector<Integer> >::iterator _tab_it = RadixResidues_.begin();
+			std::vector< BlasVector<Givaro::ZRing<Integer> > >::iterator _tab_it = RadixResidues_.begin();
 			std::vector< bool >::iterator    _occ_it = RadixOccupancy_.begin();
 			_mod_it->initialize(D);
 			*_dsz_it =  Givaro::naturallog(D);
 
 			typename Vect::const_iterator e_it = e.begin();
 			_tab_it->resize(e.size());
-			std::vector<Integer>::iterator t0_it= _tab_it->begin();
+			BlasVector<Givaro::ZRing<Integer> >::iterator t0_it= _tab_it->begin();
 			for( ; e_it != e.end(); ++e_it, ++ t0_it)
 				*t0_it = *e_it;
 			*_occ_it = true;
@@ -114,11 +118,24 @@ namespace LinBox
 		{
 			RadixSizes_.resize(1);
 			RadixPrimeProd_.resize(1);
-			RadixResidues_.resize(1);
+			Givaro::ZRing<Integer> ZZ;
+			RadixResidues_.resize(1,BlasVector<Givaro::ZRing<Integer> >(ZZ));
 			RadixOccupancy_.resize(1); RadixOccupancy_.front() = false;
 			progress(D, e);
 		}
 
+		template<class OKDomain>
+		void initialize (const Domain& D, const BlasVector<OKDomain>& e)
+		{
+			RadixSizes_.resize(1);
+			RadixPrimeProd_.resize(1);
+			Givaro::ZRing<Integer> ZZ ;
+			RadixResidues_.resize(1,BlasVector<Givaro::ZRing<Integer> >(ZZ));
+			RadixOccupancy_.resize(1); RadixOccupancy_.front() = false;
+			progress(D, e);
+		}
+
+		//! progress
 		/* Used in the case where D is a big Integer and Domain cannot be constructed */
 		// template<template<class T> class Vect>
 		template< template<class, class> class Vect, template <class> class Alloc>
@@ -126,13 +143,15 @@ namespace LinBox
 		{
 			std::vector< double >::iterator  _dsz_it = RadixSizes_.begin();
 			std::vector< LazyProduct >::iterator _mod_it = RadixPrimeProd_.begin();
-			std::vector< std::vector<Integer> >::iterator _tab_it = RadixResidues_.begin();
+			std::vector< BlasVector<Givaro::ZRing<Integer> > >::iterator _tab_it = RadixResidues_.begin();
 			std::vector< bool >::iterator    _occ_it = RadixOccupancy_.begin();
-			std::vector<Integer> ri(e.size()); LazyProduct mi; double di;
+			BlasVector<Givaro::ZRing<Integer> > ri(e.field(),e.size());
+			LazyProduct mi;
+			double di;
 			if (*_occ_it) {
 				typename Vect<Integer,Alloc<Integer> >::const_iterator  e_it = e.begin();
-				std::vector<Integer>::iterator       ri_it = ri.begin();
-				std::vector<Integer>::const_iterator t0_it = _tab_it->begin();
+				BlasVector<Givaro::ZRing<Integer> >::iterator       ri_it = ri.begin();
+				BlasVector<Givaro::ZRing<Integer> >::const_iterator t0_it = _tab_it->begin();
 				Integer invprod; precomputeInvProd(invprod, D, _mod_it->operator()());
 				for( ; e_it != e.end(); ++e_it, ++ri_it, ++ t0_it) {
 					*ri_it =* e_it;
@@ -150,7 +169,69 @@ namespace LinBox
 				*_dsz_it = Givaro::naturallog(tmp);
 				typename Vect<Integer, Alloc<Integer> >::const_iterator e_it = e.begin();
 				_tab_it->resize(e.size());
-				std::vector<Integer>::iterator t0_it= _tab_it->begin();
+				BlasVector<Givaro::ZRing<Integer> >::iterator t0_it= _tab_it->begin();
+				for( ; e_it != e.end(); ++e_it, ++ t0_it)
+					*t0_it = *e_it;
+				*_occ_it = true;
+				return;
+			}
+			for(++_dsz_it, ++_mod_it, ++_tab_it, ++_occ_it ; _occ_it != RadixOccupancy_.end() ; ++_dsz_it, ++_mod_it, ++_tab_it, ++_occ_it) {
+				if (*_occ_it) {
+					BlasVector<Givaro::ZRing<Integer> >::iterator      ri_it = ri.begin();
+					BlasVector<Givaro::ZRing<Integer> >::const_iterator t_it= _tab_it->begin();
+					Integer invprod; precomputeInvProd(invprod, mi(), _mod_it->operator()());
+					for( ; ri_it != ri.end(); ++ri_it, ++ t_it)
+						smallbigreconstruct(*ri_it, *t_it, invprod);
+					mi.mulin(*_mod_it);
+					di += *_dsz_it;
+					*_occ_it = false;
+				}
+				else {
+					*_dsz_it = di;
+					*_mod_it = mi;
+					*_tab_it = ri;
+					*_occ_it = true;
+					return;
+				}
+			}
+
+			RadixSizes_.push_back( di );
+			RadixResidues_.push_back( ri );
+			RadixPrimeProd_.push_back( mi );
+			RadixOccupancy_.push_back ( true );
+		}
+
+		// spec for BlasVector
+		void progress (const Integer& D, const BlasVector<Givaro::ZRing<Integer> >& e)
+		{
+			std::vector< double >::iterator  _dsz_it = RadixSizes_.begin();
+			std::vector< LazyProduct >::iterator _mod_it = RadixPrimeProd_.begin();
+			std::vector< BlasVector<Givaro::ZRing<Integer> > >::iterator _tab_it = RadixResidues_.begin();
+			std::vector< bool >::iterator    _occ_it = RadixOccupancy_.begin();
+			BlasVector<Givaro::ZRing<Integer> > ri(e.field(),e.size());
+			LazyProduct mi; double di;
+			if (*_occ_it) {
+				typename BlasVector<Givaro::ZRing<Integer> >::const_iterator  e_it = e.begin();
+				BlasVector<Givaro::ZRing<Integer> >::iterator       ri_it = ri.begin();
+				BlasVector<Givaro::ZRing<Integer> >::const_iterator t0_it = _tab_it->begin();
+				Integer invprod; precomputeInvProd(invprod, D, _mod_it->operator()());
+				for( ; e_it != e.end(); ++e_it, ++ri_it, ++ t0_it) {
+					*ri_it =* e_it;
+					smallbigreconstruct(*ri_it,  *t0_it, invprod );
+				}
+				Integer tmp = D;
+				di = *_dsz_it + Givaro::naturallog(tmp);
+				mi.mulin(tmp);
+				mi.mulin(*_mod_it);
+				*_occ_it = false;
+			}
+			else {
+				Integer tmp = D;
+				_mod_it->initialize(tmp);
+				*_dsz_it = Givaro::naturallog(tmp);
+				typename BlasVector<Givaro::ZRing<Integer> >::const_iterator e_it = e.begin();
+				_tab_it->resize(e.size());
+				BlasVector<Givaro::ZRing<Integer> >::iterator t0_it= _tab_it->begin();
 				for( ; e_it != e.end(); ++e_it, ++ t0_it)
 					*t0_it = *e_it;
 				*_occ_it = true;
@@ -158,8 +239,8 @@ namespace LinBox
 			}
 			for(++_dsz_it, ++_mod_it, ++_tab_it, ++_occ_it ; _occ_it != RadixOccupancy_.end() ; ++_dsz_it, ++_mod_it, ++_tab_it, ++_occ_it) {
 				if (*_occ_it) {
-					std::vector<Integer>::iterator      ri_it = ri.begin();
-					std::vector<Integer>::const_iterator t_it= _tab_it->begin();
+					BlasVector<Givaro::ZRing<Integer> >::iterator      ri_it = ri.begin();
+					BlasVector<Givaro::ZRing<Integer> >::const_iterator t_it= _tab_it->begin();
 					Integer invprod; precomputeInvProd(invprod, mi(), _mod_it->operator()());
 					for( ; ri_it != ri.end(); ++ri_it, ++ t_it)
 						smallbigreconstruct(*ri_it, *t_it, invprod);
@@ -188,16 +269,18 @@ namespace LinBox
 			// Radix shelves
 			std::vector< double >::iterator  _dsz_it = RadixSizes_.begin();
 			std::vector< LazyProduct >::iterator _mod_it = RadixPrimeProd_.begin();
-			std::vector< std::vector<Integer> >::iterator _tab_it = RadixResidues_.begin();
+			std::vector< BlasVector<Givaro::ZRing<Integer> > >::iterator _tab_it = RadixResidues_.begin();
 			std::vector< bool >::iterator    _occ_it = RadixOccupancy_.begin();
-			std::vector<Integer> ri(e.size()); LazyProduct mi; double di;
+			Givaro::ZRing<Integer> ZZ;
+			BlasVector<Givaro::ZRing<Integer> > ri(ZZ,e.size());
+			LazyProduct mi; double di;
 			if (*_occ_it) {
 				// If lower shelf is occupied
 				// Combine it with the new residue
 				// The for loop will try to put the resulting combination on the upper shelf
 				typename Vect<DomainElement, Alloc<DomainElement> >::const_iterator  e_it = e.begin();
-				std::vector<Integer>::iterator       ri_it = ri.begin();
-				std::vector<Integer>::const_iterator t0_it = _tab_it->begin();
+				BlasVector<Givaro::ZRing<Integer> >::iterator       ri_it = ri.begin();
+				BlasVector<Givaro::ZRing<Integer> >::const_iterator t0_it = _tab_it->begin();
 				DomainElement invP0; precomputeInvP0(invP0, D, _mod_it->operator()() );
 				for( ; ri_it != ri.end(); ++e_it, ++ri_it, ++ t0_it)
 					fieldreconstruct(*ri_it, D, *e_it, *t0_it, invP0, (*_mod_it).operator()() );
@@ -219,7 +302,97 @@ namespace LinBox
 				totalsize += ltp;
 				typename Vect<DomainElement, Alloc<DomainElement> >::const_iterator e_it = e.begin();
 				_tab_it->resize(e.size());
-				std::vector<Integer>::iterator t0_it= _tab_it->begin();
+				BlasVector<Givaro::ZRing<Integer> >::iterator t0_it= _tab_it->begin();
+				for( ; e_it != e.end(); ++e_it, ++ t0_it)
+					D.convert(*t0_it, *e_it);
+				*_occ_it = true;
+				return;
+			}
+
+			// We have a combination to put in the upper shelf
+			for(++_dsz_it, ++_mod_it, ++_tab_it, ++_occ_it ; _occ_it != RadixOccupancy_.end() ; ++_dsz_it, ++_mod_it, ++_tab_it, ++_occ_it) {
+				if (*_occ_it) {
+					// This shelf is occupied
+					// Combine it with the new combination
+					// The loop will try to put it on the upper shelf
+					BlasVector<Givaro::ZRing<Integer> >::iterator      ri_it = ri.begin();
+					BlasVector<Givaro::ZRing<Integer> >::const_iterator t_it= _tab_it->begin();
+
+					Integer invprod; precomputeInvProd(invprod, mi(), _mod_it->operator()());
+					for( ; ri_it != ri.end(); ++ri_it, ++ t_it)
+						smallbigreconstruct(*ri_it, *t_it, invprod);
+
+					// Product (lazy) computation
+					mi.mulin(*_mod_it);
+
+					// Moding out
+					for(ri_it = ri.begin() ; ri_it != ri.end(); ++ri_it) {
+						*ri_it %= mi();
+					}
+
+					di += *_dsz_it;
+					*_occ_it = false;
+				}
+				else {
+					// This shelf is free
+					// Put the new combination here and exit
+					*_dsz_it = di;
+					*_mod_it = mi;
+					*_tab_it = ri;
+					*_occ_it = true;
+					return;
+				}
+			}
+			// All the shelfves were occupied
+			// We create a new top shelf
+			// And put the new combination there
+			RadixSizes_.push_back( di );
+			RadixResidues_.push_back( ri );
+			RadixPrimeProd_.push_back( mi );
+			RadixOccupancy_.push_back ( true );
+		}
+
+		// spec for BlasVector
+		template<class OKDomain>
+		void progress (const Domain& D, const BlasVector<OKDomain >& e)
+		{
+			// Radix shelves
+			std::vector< double >::iterator  _dsz_it = RadixSizes_.begin();
+			std::vector< LazyProduct >::iterator _mod_it = RadixPrimeProd_.begin();
+			std::vector< BlasVector<Givaro::ZRing<Integer> > >::iterator _tab_it = RadixResidues_.begin();
+			std::vector< bool >::iterator    _occ_it = RadixOccupancy_.begin();
+			Givaro::ZRing<Integer> ZZ;
+			LazyProduct mi; double di;
+			BlasVector<Givaro::ZRing<Integer> > ri(ZZ,e.size());
+			if (*_occ_it) {
+				// If lower shelf is occupied
+				// Combine it with the new residue
+				// The for loop will try to put the resulting combination on the upper shelf
+				typename BlasVector<Domain>::const_iterator  e_it = e.begin();
+				BlasVector<Givaro::ZRing<Integer> >::iterator       ri_it = ri.begin();
+				BlasVector<Givaro::ZRing<Integer> >::const_iterator t0_it = _tab_it->begin();
+				DomainElement invP0; precomputeInvP0(invP0, D, _mod_it->operator()() );
+				for( ; ri_it != ri.end(); ++e_it, ++ri_it, ++ t0_it)
+					fieldreconstruct(*ri_it, D, *e_it, *t0_it, invP0, (*_mod_it).operator()() );
+				Integer tmp; D.characteristic(tmp);
+				double ltp = Givaro::naturallog(tmp);
+				di = *_dsz_it + ltp;
+				totalsize += ltp;
+				mi.mulin(tmp);
+				mi.mulin(*_mod_it);
+				*_occ_it = false;
+			}
+			else {
+				// Lower shelf is free
+				// Put the new residue here and exit
+				Integer tmp; D.characteristic(tmp);
+				double ltp =  Givaro::naturallog(tmp);
+				_mod_it->initialize(tmp);
+				*_dsz_it = ltp;
+				totalsize += ltp;
+				typename BlasVector<Domain>::const_iterator e_it = e.begin();
+				_tab_it->resize(e.size());
+				BlasVector<Givaro::ZRing<Integer> >::iterator t0_it= _tab_it->begin();
 				for( ; e_it != e.end(); ++e_it, ++ t0_it)
 					D.convert(*t0_it, *e_it);
 				*_occ_it = true;
@@ -232,8 +405,8 @@ namespace LinBox
 					// This shelf is occupied
 					// Combine it with the new combination
 					// The loop will try to put it on the upper shelf
-					std::vector<Integer>::iterator      ri_it = ri.begin();
-					std::vector<Integer>::const_iterator t_it= _tab_it->begin();
+					BlasVector<Givaro::ZRing<Integer> >::iterator      ri_it = ri.begin();
+					BlasVector<Givaro::ZRing<Integer> >::const_iterator t_it= _tab_it->begin();
 
 					Integer invprod; precomputeInvProd(invprod, mi(), _mod_it->operator()());
 					for( ; ri_it != ri.end(); ++ri_it, ++ t_it)
@@ -269,12 +442,91 @@ namespace LinBox
 			RadixOccupancy_.push_back ( true );
 		}
 
+
+		//! result
 		template<template<class, class> class Vect, template <class> class Alloc>
 		Vect<Integer, Alloc<Integer> >& result (Vect<Integer, Alloc<Integer> > &d)
 		{
 			d.resize( (RadixResidues_.front()).size() );
 			std::vector< LazyProduct >::iterator          _mod_it = RadixPrimeProd_.begin();
-			std::vector< std::vector< Integer > >::iterator _tab_it = RadixResidues_.begin();
+			std::vector< BlasVector< Givaro::ZRing<Integer> > >::iterator _tab_it = RadixResidues_.begin();
+			std::vector< bool >::iterator                _occ_it = RadixOccupancy_.begin();
+			LazyProduct Product;
+			// We have to find to lowest occupied shelf
+			for( ; _occ_it != RadixOccupancy_.end() ; ++_mod_it, ++_tab_it, ++_occ_it) {
+				if (*_occ_it) {
+					// Found the lowest occupied shelf
+					Product = *_mod_it;
+					BlasVector<Givaro::ZRing<Integer> >::iterator t0_it = d.begin();
+					BlasVector<Givaro::ZRing<Integer> >::iterator t_it = _tab_it->begin();
+					if (++_occ_it == RadixOccupancy_.end()) {
+						// It is the only shelf of the radix
+						// We normalize the result and output it
+						for( ; t0_it != d.end(); ++t0_it, ++t_it)
+							normalize(*t0_it = *t_it, *t_it, _mod_it->operator()());
+						//RadixPrimeProd_.resize(1);
+						return d;
+					}
+					else {
+						// There are other shelves
+						// The result is initialized with this shelf
+						// The for loop will combine the other shelves m with the actual one
+						for( ; t0_it != d.end(); ++t0_it, ++t_it)
+							*t0_it  = *t_it;
+						++_mod_it; ++_tab_it;
+						break;
+					}
+				}
+			}
+			for( ; _occ_it != RadixOccupancy_.end() ; ++_mod_it, ++_tab_it, ++_occ_it) {
+				if (*_occ_it) {
+					// This shelf is occupied
+					// We need to combine it with the actual value of the result
+					BlasVector<Givaro::ZRing<Integer> >::iterator t0_it = d.begin();
+					BlasVector<Givaro::ZRing<Integer> >::const_iterator t_it = _tab_it->begin();
+					Integer invprod;
+					precomputeInvProd(invprod, Product(), _mod_it->operator()() );
+
+					for( ; t0_it != d.end(); ++t0_it, ++t_it)
+						smallbigreconstruct(*t0_it, *t_it, invprod);
+
+					// Overall product computation
+					Product.mulin(*_mod_it);
+
+					// Moding out and normalization
+					for(t0_it = d.begin();t0_it != d.end(); ++t0_it) {
+						*t0_it %= Product();
+						Integer tmp(*t0_it);
+						normalize(*t0_it, tmp, Product());
+					}
+
+				}
+			}
+
+			// We put it also the final prime product in the first shelf of products
+			// JGD : should we also put the result
+			//       in the first shelf of residues and resize it to 1
+			//       and set to true the first occupancy and resize it to 1
+			//       in case result is not the last call (more progress to go) ?
+			RadixPrimeProd_.resize(1);
+			RadixPrimeProd_.front() = Product;
+			RadixSizes_.resize(1);
+			RadixSizes_.front() =  Givaro::naturallog(Product());
+			Givaro::ZRing<Integer> ZZ;
+			RadixResidues_.resize(1,BlasVector<Givaro::ZRing<Integer> >(ZZ));
+			RadixResidues_.front() = d;
+			RadixOccupancy_.resize(1);
+			RadixOccupancy_.front() = true;
+
+			return d;
+		}
+
+		// spec for BlasVector
+		BlasVector<Givaro::ZRing<Integer> >& result (BlasVector<Givaro::ZRing<Integer> > &d)
+		{
+			d.resize( (RadixResidues_.front()).size() );
+			std::vector< LazyProduct >::iterator          _mod_it = RadixPrimeProd_.begin();
+			std::vector< BlasVector< Givaro::ZRing<Integer> > >::iterator _tab_it = RadixResidues_.begin();
 			std::vector< bool >::iterator                _occ_it = RadixOccupancy_.begin();
 			LazyProduct Product;
 			// We have to find to lowest occupied shelf
@@ -282,8 +534,8 @@ namespace LinBox
 				if (*_occ_it) {
 					// Found the lowest occupied shelf
 					Product = *_mod_it;
-					std::vector<Integer>::iterator t0_it = d.begin();
-					std::vector<Integer>::iterator t_it = _tab_it->begin();
+					BlasVector<Givaro::ZRing<Integer> >::iterator t0_it = d.begin();
+					BlasVector<Givaro::ZRing<Integer> >::iterator t_it = _tab_it->begin();
 					if (++_occ_it == RadixOccupancy_.end()) {
 						// It is the only shelf of the radix
 						// We normalize the result and output it
@@ -307,8 +559,8 @@ namespace LinBox
 				if (*_occ_it) {
 					// This shelf is occupied
 					// We need to combine it with the actual value of the result
-					std::vector<Integer>::iterator t0_it = d.begin();
-					std::vector<Integer>::const_iterator t_it = _tab_it->begin();
+					BlasVector<Givaro::ZRing<Integer> >::iterator t0_it = d.begin();
+					BlasVector<Givaro::ZRing<Integer> >::const_iterator t_it = _tab_it->begin();
 					Integer invprod;
 					precomputeInvProd(invprod, Product(), _mod_it->operator()() );
 
@@ -337,7 +589,8 @@ namespace LinBox
 			RadixPrimeProd_.front() = Product;
 			RadixSizes_.resize(1);
 			RadixSizes_.front() =  Givaro::naturallog(Product());
-			RadixResidues_.resize(1);
+			Givaro::ZRing<Integer> Z;
+			RadixResidues_.resize(1,BlasVector<Givaro::ZRing<Integer> >(Z));
 			RadixResidues_.front() = d;
 			RadixOccupancy_.resize(1);
 			RadixOccupancy_.front() = true;
@@ -345,6 +598,7 @@ namespace LinBox
 			return d;
 		}
 
+
 		bool terminated()
 		{
 			return totalsize > LOGARITHMIC_UPPER_BOUND;
@@ -421,11 +675,10 @@ namespace LinBox
 
 #endif //__LINBOX_cra_full_multip_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/cra-givrnsfixed.h b/linbox/algorithms/cra-givrnsfixed.h
index c3d9592..23623f3 100644
--- a/linbox/algorithms/cra-givrnsfixed.h
+++ b/linbox/algorithms/cra-givrnsfixed.h
@@ -1,7 +1,7 @@
 /* linbox/algorithms/cra-full-multip.h
  * Copyright (C) 1999-2010 The LinBox group
  *
- * Time-stamp: <05 Apr 11 10:49:43 Jean-Guillaume.Dumas at imag.fr>
+ * Time-stamp: <29 May 13 09:57:18 Jean-Guillaume.Dumas at imag.fr>
  *
  * ========LICENCE========
  * This file is part of the library LinBox.
@@ -31,6 +31,7 @@
 #define __LINBOX_cra_givrnsfix_H
 
 #include <stdlib.h>
+#include "linbox/vector/blas-vector.h"
 #include <givaro/givrnsfixed.h>
 
 namespace LinBox
@@ -51,7 +52,7 @@ namespace LinBox
 		const size_t				nbloops;
 		size_t					iterationnumber;
 
-		std::vector< std::vector< integer > > 	residues;
+		std::vector< BlasVector< Givaro::ZRing<Integer> > > 	residues;
 		integer _product;
 		integer _midprod;
 
@@ -59,14 +60,28 @@ namespace LinBox
 		GivaroRnsFixedCRA(const std::vector<integer>& primes)
 				: Father_t(primes),
 				  nbloops(primes.size()),
-				  iterationnumber(0),
-				  _product(1)
+				  iterationnumber(0)
+				  , residues(0,BlasVector<Givaro::ZRing<Integer> >(Givaro::ZRing<Integer>()))
+				  , _product(1)
 		{
 			for(size_t i=0; i<primes.size(); ++i)
 				_product *= primes[i];
-		 Givaro::Integer::div(_midprod,_product,2);
+			Givaro::Integer::div(_midprod,_product,2);
 		}
 
+		GivaroRnsFixedCRA(const BlasVector<Givaro::ZRing<Integer> >& primes)
+				: Father_t(primes.getRep()), // refRep ?
+				  nbloops(primes.size()),
+				  iterationnumber(0)
+				  , residues(0,BlasVector<Givaro::ZRing<Integer> >(Givaro::ZRing<Integer>()))
+				  , _product(1)
+		{
+			for(size_t i=0; i<primes.size(); ++i)
+				_product *= primes[i];
+			Givaro::Integer::div(_midprod,_product,2);
+		}
+
+
 		Integer& getModulus(Integer& m)
 		{
 			return m=_product;
@@ -85,6 +100,15 @@ namespace LinBox
 			this->progress(D,e);
 		}
 
+		void initialize (const Domain& D, const BlasVector<Domain >& e)
+		{
+			Givaro::ZRing<Integer> ZZ;
+			BlasVector<Givaro::ZRing<Integer> > Z(ZZ);
+			residues.resize(e.size(),Z);
+			this->progress(D,e);
+		}
+
+
 		template< template<class, class> class Vect, template <class> class Alloc>
 		void progress (const Domain& D, const Vect<DomainElement, Alloc<DomainElement> >& e)
 		{
@@ -100,11 +124,43 @@ namespace LinBox
 
 		}
 
+		void progress (const Domain& D, const BlasVector<Domain>& e)
+		{
+			++iterationnumber;
+			typename BlasVector<Domain >::const_iterator eit=e.begin();
+			std::vector<BlasVector< Givaro::ZRing<Integer> > >::iterator rit = residues.begin();
+
+			for( ; eit != e.end(); ++eit, ++rit) {
+				Integer tmp;
+				D.convert(tmp, *eit);
+				rit->push_back(tmp);
+			}
+
+		}
+
+
 		template<template<class, class> class Vect, template <class> class Alloc>
 		Vect<Integer, Alloc<Integer> >& result (Vect<Integer, Alloc<Integer> > &d)
 		{
 			d.resize(0);
-			for(std::vector<std::vector< Integer > >::const_iterator rit = residues.begin(); rit != residues.end(); ++rit) {
+			for(typename Vect<Integer, Alloc<Integer> >::const_iterator rit = residues.begin(); rit != residues.end(); ++rit) {
+				Integer tmp;
+				RnsToRing(tmp, *rit);
+				linbox_check(tmp>=0);
+				linbox_check(tmp<_product);
+				if (tmp>_midprod)
+					tmp -= _product ;
+				linbox_check(tmp<=_midprod);
+				d.push_back(tmp);
+			}
+			return d;
+		}
+
+
+		BlasVector<Givaro::ZRing<Integer> >& result (BlasVector<Givaro::ZRing<Integer> > &d)
+		{
+			d.resize(0);
+			for(std::vector<BlasVector< Givaro::ZRing<Integer> > >::const_iterator rit = residues.begin(); rit != residues.end(); ++rit) {
 				Integer tmp;
 				RnsToRing(tmp, *rit);
 				linbox_check(tmp>=0);
diff --git a/linbox/algorithms/cra-mpi.h b/linbox/algorithms/cra-mpi.h
index 8618b85..c7a6fda 100644
--- a/linbox/algorithms/cra-mpi.h
+++ b/linbox/algorithms/cra-mpi.h
@@ -94,11 +94,11 @@ namespace LinBox
 					primes[i - 1] = *primeg;
 					_commPtr->send(primes[i - 1], i);
 				}
-				int idle_process = 0;
 				bool first_time = true;
 				int poison_pills_left = procs - 1;
 				//  loop until all execution is complete
 				while( poison_pills_left > 0 ){
+					int idle_process = 0;
 					//  receive sub-answers from child procs
 					_commPtr->recv(r, MPI_ANY_SOURCE);
 					idle_process = (_commPtr->get_stat()).MPI_SOURCE;
@@ -177,9 +177,9 @@ namespace LinBox
 					_commPtr->send(primes[i - 1], i);
 				}
 				Builder_.initialize( D, Iteration(r, D) );
-				int idle_process = 0;
 				int poison_pills_left = procs - 1;
 				while(poison_pills_left > 0 ){
+					int idle_process = 0;
 					//  receive the beginnin and end of a vector in heapspace
 					_commPtr->recv(r.begin(), r.end(), MPI_ANY_SOURCE, 0);
 					//  determine which process sent answer
diff --git a/linbox/algorithms/cra.doxy b/linbox/algorithms/cra.doxy
index 195c065..bbb7d1b 100644
--- a/linbox/algorithms/cra.doxy
+++ b/linbox/algorithms/cra.doxy
@@ -1,4 +1,4 @@
-// Copyright (C) 2010 Brice Boyer, part of LinBox, GNU LGPL, see COPYING
+// Copyright (C) 2010 Brice Boyer (briceboyer), part of LinBox, GNU LGPL, see COPYING
 /*
  * ========LICENCE========
  * This file is part of the library LinBox.
diff --git a/linbox/algorithms/dense-container.h b/linbox/algorithms/dense-container.h
index ab9e77b..10abf17 100644
--- a/linbox/algorithms/dense-container.h
+++ b/linbox/algorithms/dense-container.h
@@ -6,20 +6,20 @@
  *
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -119,9 +119,9 @@ namespace LinBox
 				// Copy of v into a row of U
 				it = v.begin();
 				i=0;
-				for (; it!=v.end(); it++, i++){
+				for (; it!=v.end(); ++it, ++i){
 					*(Up+i) = *it;
-					_field.convert(tmp,*it);
+					field().convert(tmp,*it);
 					cerr<<" copie of "<<tmp;
 				}
 				cerr<<endl;
@@ -144,8 +144,8 @@ namespace LinBox
 				// Copy of v into a row of U
 				it = w.begin();
 				i=0;
-				for (; it!=w.end(); it++, i++){
-					_field.convert(tmp,*it);
+				for (; it!=w.end(); ++it, ++i){
+					field().convert(tmp,*it);
 					cerr<<" copie of "<<tmp;
 					*(Up+i) = *it;
 				}
diff --git a/linbox/algorithms/dense-nullspace.h b/linbox/algorithms/dense-nullspace.h
index 082066d..5eacfdf 100644
--- a/linbox/algorithms/dense-nullspace.h
+++ b/linbox/algorithms/dense-nullspace.h
@@ -1,5 +1,5 @@
 /* Copyright (C) 2010 LinBox
- * Written by <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  *
  *
  *
@@ -36,37 +36,13 @@
 #define __LINBOX_dense_nullspace_H
 
 
-#include "linbox/algorithms/linbox-tags.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/linbox-tags.h"
+#include "linbox/matrix/dense-matrix.h"
 
 namespace LinBox
 {
 
-	/** Computes the kernel of a dense matrix using \c LQUP.
-	 *
-	 * Acccording to the dimensions of the input matrix, we chose different methods.
-	 * @warning timings may vary and these choices were made on an experimental basis.
-	 *
-	 * @param F  Field
-	 * @param Side  left or right from \c LinBox::SideTag
-	 * @param m rows
-	 * @param n cols
-	 * @param A input matrix
-	 * @param lda leading dimension of A
-	 * @param Ker Kernel. \c NULL if \c kerdim==0
-	 * @param ldk leading dimension of the kernel.
-	 * @param kerdim dimension of the kernel.
-	 * @return dimension of the kernel.
-	 *
-	 * @warning A is modified.
-	 */
-	template<class Field>
-	size_t
-	NullSpaceBasis (const Field& F, const LinBoxTag::Side Side,
-			const size_t & m, const size_t & n,
-			typename Field::Element * A, const size_t & lda,
-			typename Field::Element *& Ker, size_t& ldk,
-			size_t & kerdim) ;
+
 
 	/*! Nullspace of a dense matrix on a finite field.
 	 * A is modified.
@@ -76,14 +52,24 @@ namespace LinBox
 	 * @param[out]    Ker Nullspace of the matrix (Allocated in the routine)
 	 * @param[out]    kerdim rank of the kernel
 	 * @return \p kerdim
+	 *
+	 * @todo make it work for BlasSubmatrix too
 	 */
 	template<class Field>
 	size_t&
-	NullSpaceBasis (const Field& F, const LinBoxTag::Side Side,
-			BlasMatrix<typename Field::Element> & A,
-			BlasMatrix<typename Field::Element> & Ker,
+	NullSpaceBasisIn (const LINBOX_enum(Tag::Side) Side,
+			BlasMatrix<Field> & A,
+			BlasMatrix<Field> & Ker,
 			size_t & kerdim) ;
 
+	template<class DenseMat>
+	size_t&
+	NullSpaceBasisIn (const LINBOX_enum(Tag::Side) Side,
+			BlasSubmatrix<DenseMat> & A,
+			BlasMatrix<typename DenseMat::Field> & Ker,
+			size_t & kerdim) ;
+
+
 	/*! Nullspace of a dense matrix on a finite field.
 	 * A is preserved.
 	 * @param      F field
@@ -92,18 +78,23 @@ namespace LinBox
 	 * @param[out] Ker Nullspace of the matrix (Allocated in the routine)
 	 * @param[out] kerdim rank of the kernel
 	 * @return \p kerdim
+	 *
+	 * @todo make it work for BlasSubmatrix too
 	 */
 	template<class Field>
 	size_t&
-	NullSpaceBasis (const Field& F, const LinBoxTag::Side Side,
-			const BlasMatrix<typename Field::Element> & A,
-			BlasMatrix<typename Field::Element> & Ker,
-			size_t & kerdim)
-	{
-		BlasMatrix<typename Field::Element> B (A);
-		return NullSpaceBasis<Field>(F,Side,B,Ker,kerdim);
+	NullSpaceBasis (const LINBOX_enum(Tag::Side) Side,
+			const BlasMatrix<Field> & A,
+			BlasMatrix<Field> & Ker,
+			size_t & kerdim) ;
+
+	template<class DenseMat>
+	size_t&
+	NullSpaceBasis (const LINBOX_enum(Tag::Side) Side,
+			const BlasSubmatrix<DenseMat> & A,
+			BlasMatrix<typename DenseMat::Field> & Ker,
+			size_t & kerdim);
 
-	}
 
 
 } // LinBox
@@ -113,11 +104,10 @@ namespace LinBox
 #endif // __LINBOX_dense_nullspace_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/dense-nullspace.inl b/linbox/algorithms/dense-nullspace.inl
index 87e5184..bbb2844 100644
--- a/linbox/algorithms/dense-nullspace.inl
+++ b/linbox/algorithms/dense-nullspace.inl
@@ -1,5 +1,5 @@
 /* Copyright (C) 2010 LinBox
- * Written by <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  *
  *
  *
@@ -25,438 +25,353 @@
 #ifndef __LINBOX_dense_nullspace_INL
 #define __LINBOX_dense_nullspace_INL
 
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
 
 #include "fflas-ffpack/ffpack/ffpack.h" // LU
 #include "fflas-ffpack/fflas/fflas.h" // trsm
 
-//#include "Matio.h" // write_field ;
+#include <fflas-ffpack/utils/Matio.h> // write_field ;
 #include <iostream>
 #include <cassert>
 
 namespace LinBox
 {
 
-	/**
-	 * @brief
-	 *
-	 * @param F
-	 * @param Z
-	 * @param ldZ
-	 * @param lig1
-	 * @param col1
-	 * @param lig2
-	 * @param col2
-	 */
-	template <class Field >
-	void Zero(const Field & F,
-		  typename Field::Element * Z, const size_t ldZ,
-		  const size_t lig1, const size_t col1,
-		  const size_t lig2, const size_t col2)
-	{
-		assert(lig1<lig2);
-		assert(col1<col2);
-		assert(col2<=ldZ);
-		typename Field::Element zero;
-		F.init(zero,0UL);
-
-		for (size_t i = lig1 ; i < lig2 ; ++i)
-			for (size_t j = col1; j < col2 ; ++j) // F.assign(*(Id+i*ldI+j),zero)
-				*(Z+i*ldZ+j) = zero ;
-		return;
-	}
-
-
-	/*! Creates identity matrix in \p F of size \p dim1 \p x \p dim2.
-	 * @warning diag_num peut être < 0 !
-	 * @bug     long et size_t ne cohabitent pas bien.
-	 */
-	template <class Field >
-	void Identity(const Field & F,
-		      typename Field::Element * Id, const size_t ldI,
-		      const size_t lig1, const size_t col1,
-		      const size_t lig2, const size_t col2)
-	{
-		assert(lig1<lig2);
-		assert(col1<col2);
-		assert(col2<=ldI);
-		typename Field::Element one,zero;
-		F.init(one,1UL);
-		F.init(zero,0UL);
-		for (size_t i = lig1 ; i < lig2 ; ++i)
-			for (size_t j = col1; j < col2 ; ++j) // F.assign(*(Id+i*ldI+j),zero)
-				*(Id+i*ldI+j) = zero ;
-		// Zero(F,Id,ldI,lig1,col1,lig2,col2);
-		size_t nb_un = std::min(col2-col1,lig2-lig1)-1;
-
-		typename Field::Element * Un_ici = Id+lig1*ldI+col1 ;
-		for (size_t i = 0 ; i < nb_un ; ++i){
-			*(Un_ici) = one ;
-			Un_ici += ldI ;
-			++Un_ici;
+	namespace Protected {
+
+		/**
+		 * @brief
+		 *
+		 * @param F
+		 * @param Z
+		 * @param ldZ
+		 * @param lig1
+		 * @param col1
+		 * @param lig2
+		 * @param col2
+		 */
+		template <class Field >
+		void Zero(const Field & F,
+			  typename Field::Element * Z, const size_t ldZ,
+			  const size_t lig1, const size_t col1,
+			  const size_t lig2, const size_t col2)
+		{
+			assert(lig1<lig2);
+			assert(col1<col2);
+			assert(col2<=ldZ);
+
+			//! @todo use fzero
+			for (size_t i = lig1 ; i < lig2 ; ++i)
+				for (size_t j = col1; j < col2 ; ++j) // F.assign(*(Id+i*ldI+j),zero)
+					*(Z+i*ldZ+j) = F.zero ;
+			return;
 		}
-		*(Un_ici) = one ;
-		return;
-	}
 
 
-	/*!
-	 * @brief The right or left nullspace (kernel or cokernel) of a matrix A
-	 * We use the LU decomposition
-	 * @param F the field in which \p A lives
-	 * @param A is a matrix whose nullspace we look for.
-	 * @param M number of lines in \p A
-	 * @param N number of column of \p A
-	 * @param lda the leading dimension of matrix \p A
-	 * @param ker_dim the dimension of the kernel
-	 * @tparam Field -
-	 * @return a matrix of leading dimension ker_dim whose column vectors span the nullspace of A. Returns \p NULL (and not \f$\mathbf{0}\f$) if <code> ker_dim == 0 </code>.
-	 */
-	template<class Field>
-	typename Field::Element *
-	RightNullspaceDirect ( const Field & F,		// in place
-			       typename Field::Element * A,
-			       const size_t & M, // rows
-			       const size_t & N, // colm
-			       const size_t & lda, // leading dimension
-			       //typename  Field::Element &* V ,
-			       size_t & ker_dim )
-	{
-		size_t *P = new size_t[N];
-		size_t *Qt = new size_t[M];
-		size_t R = FFPACK::LUdivine ((typename Field::Father_t)F, FFLAS::FflasNonUnit, FFLAS::FflasNoTrans,
-					     M, N, A, lda, P, Qt, FFPACK::FfpackLQUP);
-		delete[] Qt;
-
-		ker_dim = N-R ;								// dimension of kernel
-		if (ker_dim == 0) {
-			delete[] P ;
-			return NULL ;							// only 0 in kernel
-		}
-		typename Field::Element * V = new typename Field::Element[ker_dim*N];	// Result here.
-		size_t ldV = ker_dim ;
-		if (R == 0) {
-			delete[] P ;
-			Identity(F,V,ldV,0,0,N,ker_dim);
-			return V ;
-		}
-
-		for (size_t i = 0 ; i < R ; ++i)					// V <- U2
-			FFLAS::fcopy ((typename Field::Father_t)F, ker_dim, V + i * ldV, 1, A + R + i*lda, 1);
-		typename Field::Element one ;
-		F.init(one,1UL);
-		FFLAS::ftrsm((typename Field::Father_t)F, FFLAS::FflasLeft, FFLAS::FflasUpper,
-			     FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
-			     R, ker_dim, one,  A, lda , V, ldV) ;			// (V = U2, A = U1) : U2 <- inv(U1)*U2 ;
-
-		typename Field::Element minus_one, zero;
-		F.init(zero,0UL);
-		F.neg(minus_one, one);
-		for ( size_t i = R ; i < N; ++i){					// filling the rest of V with -Id
-			for (size_t j = 0 ; j < ker_dim ; ++j)
-				*(V+ker_dim*i+j) = zero ;
-			*(V+ker_dim*i+i-R) = minus_one ;
-			/* // FIXME : faster ?
-			   for (size_t j = 0 ; j < ker_dim ; ++j) {
-
-			   if (i-R == j)
-			 *(V+ker_dim*i+j) = minus_one ;
-			 else
-			 *(V+ker_dim*i+j) = zero ;
-			 }
-			 */
-
+		/*! Creates identity matrix in \p F of size \p dim1 \p x \p dim2.
+		 * @warning diag_num peut être < 0 !
+		 * @bug     long et size_t ne cohabitent pas bien.
+		 */
+		template <class Field >
+		void Identity(const Field & F,
+			      typename Field::Element * Id, const size_t ldI,
+			      const size_t lig1, const size_t col1,
+			      const size_t lig2, const size_t col2)
+		{
+			assert(lig1<lig2);
+			assert(col1<col2);
+			assert(col2<=ldI);
+			for (size_t i = lig1 ; i < lig2 ; ++i)
+				for (size_t j = col1; j < col2 ; ++j) // F.assign(*(Id+i*ldI+j),zero)
+					*(Id+i*ldI+j) = F.zero ;
+			// Zero(F,Id,ldI,lig1,col1,lig2,col2);
+			size_t nb_un = std::min(col2-col1,lig2-lig1)-1;
+
+			typename Field::Element * Un_ici = Id+lig1*ldI+col1 ;
+			for (size_t i = 0 ; i < nb_un ; ++i){
+				*(Un_ici) = F.one ;
+				Un_ici += ldI ;
+				++Un_ici;
+			}
+			*(Un_ici) = F.one ;
+			return;
 		}
-		FFPACK::applyP((typename Field::Father_t)F, FFLAS::FflasLeft, FFLAS::FflasTrans,
-			       ker_dim, 0, (int)R, V, ldV , P);				//  X = P^{-1}V
-		delete[] P;
-		return V;
-
-	}
-
-	template<class Field>
-	typename Field::Element *
-	RightNullspaceIndirect ( const Field & F,		// in place
-				 typename Field::Element * A,
-				 const size_t & M, // rows
-				 const size_t & N, // colm
-				 const size_t & lda, // leading dimension
-				 //typename  Field::Element &* V ,
-				 size_t & ker_dim )
-	{
-		size_t *P = new size_t[M];
-		size_t *Qt = new size_t[N];
-		size_t R = FFPACK::LUdivine ((typename Field::Father_t)F, FFLAS::FflasNonUnit, FFLAS::FflasTrans,
-					     M, N, A, lda, P, Qt, FFPACK::FfpackLQUP);
 
 
-		// write_field (F, std::cout<<"ALU :="<<std::endl, A, M, N, N, true);
-		// PrintLQUP (F,FFLAS::FflasNonUnit,FFLAS::FflasTrans,M,N,A,R,std::cout<<"L.Q.U.P"<<std::endl,Qt,P,true);
+		/*!
+		 * @brief The right or left nullspace (kernel or cokernel) of a matrix A
+		 * We use the LU decomposition
+		 * @param F the field in which \p A lives
+		 * @param A is a matrix whose nullspace we look for.
+		 * @param M number of lines in \p A
+		 * @param N number of column of \p A
+		 * @param lda the leading dimension of matrix \p A
+		 * @param ker_dim the dimension of the kernel
+		 * @tparam Field -
+		 * @return a matrix of leading dimension ker_dim whose column vectors span the nullspace of A. Returns \p NULL (and not \f$\mathbf{0}\f$) if <code> ker_dim == 0 </code>.
+		 */
+		template<class Field>
+		typename Field::Element *
+		RightNullspaceDirect ( const Field & F,		// in place
+				       typename Field::Element * A,
+				       const size_t & M, // rows
+				       const size_t & N, // colm
+				       const size_t & lda, // leading dimension
+				       //typename  Field::Element &* V ,
+				       size_t & ker_dim )
+		{
+			typename Field::Element * NS;
+			FFPACK::NullSpaceBasis(F, FFLAS::FflasRight, M, N, A, lda, NS, ker_dim);
+			return NS ;
 
-		// std::cout << "ker_dim = " << ker_dim << std::endl;
+		}
 
-		delete[] P;
+		template<class Field>
+		typename Field::Element *
+		RightNullspaceIndirect ( const Field & F,		// in place
+					 typename Field::Element * A,
+					 const size_t & M, // rows
+					 const size_t & N, // colm
+					 const size_t & lda, // leading dimension
+					 //typename  Field::Element &* V ,
+					 size_t & ker_dim )
+		{
+			size_t *P = new size_t[M];
+			size_t *Qt = new size_t[N];
+			size_t R = FFPACK::LUdivine (F, FFLAS::FflasNonUnit, FFLAS::FflasTrans,
+						     M, N, A, lda, P, Qt);//, FFPACK::FfpackLQUP);
+
+
+			// write_field (F, std::cout<<"ALU :="<<std::endl, A, M, N, N, true);
+			// PrintLQUP (F,FFLAS::FflasNonUnit,FFLAS::FflasTrans,M,N,A,R,std::cout<<"L.Q.U.P"<<std::endl,Qt,P,true);
+
+			// std::cout << "ker_dim = " << ker_dim << std::endl;
+
+			delete[] P;
+
+			ker_dim = N-R ;								// dimension of kernel
+			if (ker_dim == 0) {
+				delete[] Qt ;
+				return NULL ;							// only 0 in kernel
+			}
+			size_t ldV = ker_dim ;
+			typename Field::Element * V = new typename Field::Element[ker_dim*N];	// Result here.
+			if (R == 0) {
+				delete[] Qt ;
+				Identity(F,V,ker_dim,0,0,N,ker_dim);
+				return V ;
+			}
 
-		ker_dim = N-R ;								// dimension of kernel
-		if (ker_dim == 0) {
-			delete[] Qt ;
-			return NULL ;							// only 0 in kernel
-		}
-		size_t ldV = ker_dim ;
-		typename Field::Element * V = new typename Field::Element[ker_dim*N];	// Result here.
-		if (R == 0) {
-			delete[] Qt ;
-			Identity(F,V,ker_dim,0,0,N,ker_dim);
-			return V ;
-		}
+			//////////////////////////
 
-		//////////////////////////
+			Zero    (F,V,ldV,0,0,R,ker_dim);
+			Identity(F,V,ldV,R,0,N,ker_dim);
+			// write_field (F, std::cout<<"V init   ="<<std::endl, V, N, ker_dim, ker_dim,true);
+			FFPACK::applyP(F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
+				       ker_dim, 0, (int)R, V, ldV, Qt);			//  V = Q V
 
-		Zero    (F,V,ldV,0,0,R,ker_dim);
-		Identity(F,V,ldV,R,0,N,ker_dim);
-		// write_field (F, std::cout<<"V init   ="<<std::endl, V, N, ker_dim, ker_dim,true);
-		FFPACK::applyP((typename Field::Father_t)F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
-			       ker_dim, 0, (int)R, V, ldV, Qt);			//  V = Q V
+			// write_field (F, std::cout<<"V reordered   ="<<std::endl, V, N,ker_dim, ker_dim,true);
 
-		// write_field (F, std::cout<<"V reordered   ="<<std::endl, V, N,ker_dim, ker_dim,true);
+			// actually we just select a line in the inverse of L.
+			//size_t wda = M ;
 
-		// actually we just select a line in the inverse of L.
-		//size_t wda = M ;
 
-		typename Field::Element one, zero;
-		F.init(zero,0UL);
-		F.init(one,1UL);
-		// F.neg(minus_one, one);
+			if (N <= M) { // on a de la place...
+				for ( size_t i=0; i< M; ++i ) {
+					size_t j = 0 ;
+					for ( ; j<std::min(i,N); ++j )
+						*(A+i*N+j) = F.zero;
+					if (i==j)
+						*(A+i*N+j) = F.zero;
+				}
 
-		if (N <= M) { // on a de la place...
-			for ( size_t i=0; i< M; ++i ) {
-				size_t j = 0 ;
-				for ( ; j<std::min(i,N); ++j )
-					*(A+i*N+j) = zero;
-				if (i==j)
-					*(A+i*N+j) = zero;
+				//FFPACK::applyP( F, FFLAS::FflasRight, FFLAS::FflasNoTrans, M,0,M, A, N, Q );
+				FFPACK::applyP( F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
+					       N,0,(int)N, A, N, Qt );
+				for ( size_t i=0; i< N; ++i )
+					*(A+N*i+i) = F.one ;
+
+				//write_field (F, std::cout<<"A avant trsm   ="<<std::endl, A, M, N, N,true);
+				FFLAS::ftrsm(F, FFLAS::FflasLeft, FFLAS::FflasUpper,
+					     FFLAS::FflasNoTrans, FFLAS::FflasUnit,
+					     N, ker_dim, F.one,  A, lda , V, ldV) ; // V = inv(Lower) V ;
+				//write_field (F, std::cout<<"V if after trsm  ="<<std::endl, V, N,ker_dim, ker_dim,true);
 			}
-
-			//FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasRight, FFLAS::FflasNoTrans, M,0,M, A, N, Q );
-			FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
-					N,0,(int)N, A, N, Qt );
-			for ( size_t i=0; i< N; ++i )
-				*(A+N*i+i) = one ;
-
-			//write_field (F, std::cout<<"A avant trsm   ="<<std::endl, A, M, N, N,true);
-			FFLAS::ftrsm((typename Field::Father_t)F, FFLAS::FflasLeft, FFLAS::FflasUpper,
-				     FFLAS::FflasNoTrans, FFLAS::FflasUnit,
-				     N, ker_dim, one,  A, lda , V, ldV) ; // V = inv(Lower) V ;
-			//write_field (F, std::cout<<"V if after trsm  ="<<std::endl, V, N,ker_dim, ker_dim,true);
-		}
-		else { // N > M we can't ftrsm because we can't add 0's to the lower part...
-			typename Field::Element * L = new typename Field::Element[N*N];					// L_inf
-			// début de L
-			size_t i = 0 ;
-			for ( ; i< M; ++i ){
-				size_t j=0;
-				for (; j< std::min(i,N) ; ++j )
-					*(L+i*N+j) = zero ;
-				if (i==j) {
-					*(L+i*N+j) = zero ;
-					j++;
-					for (; j<N; ++j )
-						*(L+i*N+j) = *(A+N*i+j);
+			else { // N > M we can't ftrsm because we can't add 0's to the lower part...
+				typename Field::Element * L = new typename Field::Element[N*N];					// L_inf
+				// début de L
+				size_t i = 0 ;
+				for ( ; i< M; ++i ){
+					size_t j=0;
+					for (; j< std::min(i,N) ; ++j )
+						*(L+i*N+j) = F.zero ;
+					if (i==j) {
+						*(L+i*N+j) = F.zero ;
+						j++;
+						for (; j<N; ++j )
+							*(L+i*N+j) = *(A+N*i+j);
+					}
 				}
+				for ( ; i< N; ++i )
+					for (size_t j = 0 ; j<N; ++j )
+						*(L+i*N+j) = F.zero ;
+
+				FFPACK::applyP( F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
+					       N,0,(int)R, L, N, Qt );
+				for ( size_t ii=0; ii< N; ++ii )
+					*(L+N*ii+ii) = F.one ;
+				// fin de L.
+				//write_field (F, std::cout<<"U_1="<<std::endl, L, M, M, M,true);
+				FFLAS::ftrsm(F, FFLAS::FflasLeft, FFLAS::FflasUpper,
+					     FFLAS::FflasNoTrans, FFLAS::FflasUnit,
+					     N, ker_dim, F.one,  L, N , V, ldV); 	// V = inv(Lower) V ;
+
+				// write_field (F, std::cout<<"V else after trsm   ="<<std::endl, V, N,ker_dim, ker_dim,true);
+
+				delete[] L;
 			}
-			for ( ; i< N; ++i )
-				for (size_t j = 0 ; j<N; ++j )
-					*(L+i*N+j) = zero ;
-
-			FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
-					N,0,(int)R, L, N, Qt );
-			for ( size_t ii=0; ii< N; ++ii )
-				*(L+N*ii+ii) = one ;
-			// fin de L.
-			//write_field (F, std::cout<<"U_1="<<std::endl, L, M, M, M,true);
-			FFLAS::ftrsm((typename Field::Father_t)F, FFLAS::FflasLeft, FFLAS::FflasUpper,
-				     FFLAS::FflasNoTrans, FFLAS::FflasUnit,
-				     N, ker_dim, one,  L, N , V, ldV); 	// V = inv(Lower) V ;
-
-			// write_field (F, std::cout<<"V else after trsm   ="<<std::endl, V, N,ker_dim, ker_dim,true);
-
-			delete[] L;
-		}
-		//write_field (F, std::cout<<"V final   ="<<std::endl, V, ker_dim, M, M,true);
-		delete[] Qt ;
-		return V;
-
-	}
+			//write_field (F, std::cout<<"V final   ="<<std::endl, V, ker_dim, M, M,true);
+			delete[] Qt ;
+			return V;
 
-	template<class Field>
-	typename Field::Element *
-	LeftNullspaceIndirect ( const Field & F,		// in place
-				typename Field::Element * A,
-				const size_t & M, // rows
-				const size_t & N, // colm
-				const size_t & lda, // leading dimension
-				//typename  Field::Element &* V ,
-				size_t & coker_dim )
-	{
-		size_t *P = new size_t[M];
-		size_t *Qt = new size_t[N];
-		size_t R = FFPACK::LUdivine ((typename Field::Father_t)F, FFLAS::FflasNonUnit, FFLAS::FflasTrans,
-					     M, N, A, lda, P, Qt, FFPACK::FfpackLQUP);
-		delete[] Qt;
-
-		coker_dim = M-R ;			// dimension of kernel
-		if (coker_dim == 0) {
-			delete[] P ;
-			return NULL ;			// only 0 in kernel
-		}
-		size_t ldV = M ;
-		typename Field::Element * V = new typename Field::Element[coker_dim*M];	// Result here.
-		if (R == 0) {
-			delete[] P ;
-			Identity(F,V,ldV,0,0,coker_dim,M);
-			return V ;
 		}
 
-		for (size_t i = 0 ; i < coker_dim ; ++i)	// copy U2 to result V before updating with U1
-			FFLAS::fcopy ((typename Field::Father_t)F, R, V + i * ldV, 1, A + (R + i)*lda, 1);
-		typename Field::Element one, minus_one ;
-		F.init(one,1UL);
-		F.neg(minus_one, one);
-		FFLAS::ftrsm((typename Field::Father_t)F, FFLAS::FflasRight, FFLAS::FflasLower,
-			     FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
-			     coker_dim, R, minus_one,  A, lda , V, ldV) ;	// V = U2  ; A = U1 ; U2 <- inv(U1)*U2 ;
-
-		typename Field::Element zero;
-		F.init(zero,0UL);
-		Identity(F,V,ldV,0,R,coker_dim,M);
-#if 0
-		for ( size_t i = 0 ; i < coker_dim ; ++i){	/* filling the rest of V with minus identity */
-			for (size_t j = R ; j < M ; ++j)
-				*(V+i*M+j) = zero ;
-			*(V+i*M+i+R) = one ;
-#if 0 /* FIXME : faster ? */
-			for (size_t j = R ; j < M ; ++j) {
-				if (j == i+R)
-					*(V+M*i+j) = one ;
-				else
-					*(V+M*i+j) = zero ;
-			}
-#endif
+		template<class Field>
+		typename Field::Element *
+		LeftNullspaceIndirect ( const Field & F,		// in place
+					typename Field::Element * A,
+					const size_t & M, // rows
+					const size_t & N, // colm
+					const size_t & lda, // leading dimension
+					//typename  Field::Element &* V ,
+					size_t & coker_dim )
+		{
+			typename Field::Element * NS;
+			FFPACK::NullSpaceBasis(F, FFLAS::FflasLeft, M, N, A, lda, NS, coker_dim);
+			return NS ;
 		}
-#endif
-
-		FFPACK::applyP((typename Field::Father_t)F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
-			       coker_dim, 0,(int) R, V, ldV , P);		// X = P^{-1}V
-		delete[] P;
-		return V;
-
-	}
 
-	// directement à gauche (X LQUP noyau de U puis invQ invL...)
-	template<class Field>
-	typename Field::Element *
-	LeftNullspaceDirect ( const Field & F,		// in place
-			      typename Field::Element * A,
-			      const size_t & M, // rows
-			      const size_t & N, // colm
-			      const size_t & lda, // leading dimension
-			      size_t & coker_dim)
-	{
-
-		size_t *P = new size_t[N];
-		size_t *Q = new size_t[M];
-
-		//write_field (F, std::cout<<"A avant LU   ="<<std::endl, A, M, N, N, true);
-		size_t R = FFPACK::LUdivine ((typename Field::Father_t)F, FFLAS::FflasNonUnit, FFLAS::FflasNoTrans,
-					     M, N, A, lda, P, Q, FFPACK::FfpackLQUP);
-		assert(R<=std::min(M,N));
-
-		//write_field (F, std::cout<<"ALU :="<<std::endl, A, M, N, N, true);
-		//PrintLapackPermutation(P,N,std::cout<<"Permutation P := ");
-		//PrintPermutation(F , FFLAS::FflasNoTrans, P, N, 0, N, std::cout, true);
-		//PrintLapackPermutation(Q,M,std::cout<<"Permutation Q := ");
-		//PrintPermutation(F , FFLAS::FflasTrans, Q, M, 0, M, std::cout, true);
-		//PrintLQUP (F,FFLAS::FflasUnit,FFLAS::FflasNoTrans,M,N,A,R,std::cout<<"L.Q.U.P"<<std::endl,Q,P,true);
-		coker_dim = M -R ; // dimension of co-kernel.
-		//std::cout << "coker_dim = " << coker_dim << std::endl;
-		delete[] P; // on s'en fout de P !
-		if (coker_dim == 0){
-			delete[] Q ;
-			return NULL;	// CoKernel is \f$\{\mathbf{0}_n\}\f$
-		}
+		// directement à gauche (X LQUP noyau de U puis invQ invL...)
+		template<class Field>
+		typename Field::Element *
+		LeftNullspaceDirect ( const Field & F,		// in place
+				      typename Field::Element * A,
+				      const size_t & M, // rows
+				      const size_t & N, // colm
+				      const size_t & lda, // leading dimension
+				      size_t & coker_dim)
+		{
+
+			size_t *P = new size_t[N];
+			size_t *Q = new size_t[M];
+
+			//write_field (F, std::cout<<"A avant LU   ="<<std::endl, A, M, N, N, true);
+			size_t R = FFPACK::LUdivine (F, FFLAS::FflasNonUnit, FFLAS::FflasNoTrans,
+						     M, N, A, lda, P, Q);//, FFPACK::FfpackLQUP);
+			assert(R<=std::min(M,N));
+
+			//write_field (F, std::cout<<"ALU :="<<std::endl, A, M, N, N, true);
+			//PrintLapackPermutation(P,N,std::cout<<"Permutation P := ");
+			//PrintPermutation(F , FFLAS::FflasNoTrans, P, N, 0, N, std::cout, true);
+			//PrintLapackPermutation(Q,M,std::cout<<"Permutation Q := ");
+			//PrintPermutation(F , FFLAS::FflasTrans, Q, M, 0, M, std::cout, true);
+			//PrintLQUP (F,FFLAS::FflasUnit,FFLAS::FflasNoTrans,M,N,A,R,std::cout<<"L.Q.U.P"<<std::endl,Q,P,true);
+			coker_dim = M -R ; // dimension of co-kernel.
+			//std::cout << "coker_dim = " << coker_dim << std::endl;
+			delete[] P; // on s'en fout de P !
+			if (coker_dim == 0){
+				delete[] Q ;
+				return NULL;	// CoKernel is \f$\{\mathbf{0}_n\}\f$
+			}
 
-		typename Field::Element one, zero ; // 1,0 dans le corps
-		F.init(one,1UL);
-		F.init(zero,0UL);
 
-		size_t ldV = M ;
-		typename Field::Element * V = new typename Field::Element[coker_dim * M]; // le résultat sera ici.
-		if (R == 0) {
-			delete[] Q ;
-			Identity(F,V,ldV,0,0,coker_dim,M);
-			return V ;
-		}
-		Zero    (F,V,ldV,0,0,coker_dim,R);
-		Identity(F,V,ldV,0,R,coker_dim,M);
-		// write_field (F, std::cout<<"V init   ="<<std::endl, V, coker_dim, M, M,true);
-		FFPACK::applyP((typename Field::Father_t)F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
-			       coker_dim, 0, (int)R, V, ldV, Q); // V = V  tQ
-
-		//write_field (F, std::cout<<"V reordered   ="<<std::endl, V, coker_dim, M, M,true);
-
-		// actually we just select a line in the inverse of L.
-		//size_t wda = M ;
-		if (M <= N) {
-			for ( size_t i=0; i< M; ++i )
-				for (size_t j = i ; j<N; ++j )
-					*(A+i*N+j) = zero;
-
-			FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
-					M,0,(int)M, A, N, Q );
-			for ( size_t i=0; i< M; ++i )
-				*(A+N*i+i) = one ;
-
-			//write_field (F, std::cout<<"A avant trsm   ="<<std::endl, A, M, N, N,true);
-			FFLAS::ftrsm((typename Field::Father_t)F, FFLAS::FflasRight, FFLAS::FflasLower,
-				     FFLAS::FflasNoTrans, FFLAS::FflasUnit,
-				     coker_dim , M , one,  A, lda , V, ldV) ; // V = V inv(Lower) ;
-		}
-		else { // M > N we can't ftrsm because we can't add 0's to the lower part...
-			typename Field::Element * L = new typename Field::Element[M*M]; // L_inf
-
-			for ( size_t i=0; i< M; ++i ){ // copying A_inf to L
-				size_t j=0;
-				for (; j< std::min(i,N) ; ++j )
-					*(L+i*M+j) = *(A+N*i+j);
-				for (; j<M; ++j )
-					*(L+i*M+j) = zero;
+			size_t ldV = M ;
+			typename Field::Element * V = new typename Field::Element[coker_dim * M]; // le résultat sera ici.
+			if (R == 0) {
+				delete[] Q ;
+				Identity(F,V,ldV,0,0,coker_dim,M);
+				return V ;
 			}
-			FFPACK::applyP((typename Field::Father_t) F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
-					M,0,(int)R, L, M, Q );
-			for ( size_t i=0; i< M; ++i )
-				*(L+M*i+i) = one ;
+			Zero    (F,V,ldV,0,0,coker_dim,R);
+			Identity(F,V,ldV,0,R,coker_dim,M);
+			// write_field (F, std::cout<<"V init   ="<<std::endl, V, coker_dim, M, M,true);
+			FFPACK::applyP(F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
+				       coker_dim, 0, (int)R, V, ldV, Q); // V = V  tQ
+
+			//write_field (F, std::cout<<"V reordered   ="<<std::endl, V, coker_dim, M, M,true);
+
+			//size_t wda = M ;
+			if (M <= N) {
+				for ( size_t i=0; i< M; ++i )
+					for (size_t j = i ; j<N; ++j )
+						*(A+i*N+j) = F.zero;
+
+				FFPACK::applyP( F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
+					       M,0,(int)M, A, N, Q );
+				for ( size_t i=0; i< M; ++i )
+					*(A+N*i+i) = F.one ;
+
+				//write_field (F, std::cout<<"A avant trsm   ="<<std::endl, A, M, N, N,true);
+				FFLAS::ftrsm(F, FFLAS::FflasRight, FFLAS::FflasLower,
+					     FFLAS::FflasNoTrans, FFLAS::FflasUnit,
+					     coker_dim , M , F.one,  A, lda , V, ldV) ; // V = V inv(Lower) ;
+			}
+			else { // M > N we can't ftrsm because we can't add 0's to the lower part...
+				typename Field::Element * L = new typename Field::Element[M*M]; // L_inf
+
+				for ( size_t i=0; i< M; ++i ){ // copying A_inf to L
+					size_t j=0;
+					for (; j< std::min(i,N) ; ++j )
+						*(L+i*M+j) = *(A+N*i+j);
+					for (; j<M; ++j )
+						*(L+i*M+j) = F.zero;
+				}
+				FFPACK::applyP( F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
+					       M,0,(int)R, L, M, Q );
+				for ( size_t i=0; i< M; ++i )
+					*(L+M*i+i) = F.one ;
 
-			//write_field (F, std::cout<<"U_1="<<std::endl, L, M, M, M,true);
-			FFLAS::ftrsm((typename Field::Father_t)F, FFLAS::FflasRight, FFLAS::FflasLower,
-				     FFLAS::FflasNoTrans, FFLAS::FflasUnit,
-				     coker_dim , M , one,  L, M , V, ldV) ; // V = V inv(Lower) ;
+				//write_field (F, std::cout<<"U_1="<<std::endl, L, M, M, M,true);
+				FFLAS::ftrsm(F, FFLAS::FflasRight, FFLAS::FflasLower,
+					     FFLAS::FflasNoTrans, FFLAS::FflasUnit,
+					     coker_dim , M , F.one,  L, M , V, ldV) ; // V = V inv(Lower) ;
 
-			delete[] L;
+				delete[] L;
+			}
+			//write_field (F, std::cout<<"V final   ="<<std::endl, V, coker_dim, M, M,true);
+			delete[] Q ;
+			return V;
 		}
-		//write_field (F, std::cout<<"V final   ="<<std::endl, V, coker_dim, M, M,true);
-		delete[] Q ;
-		return V;
-	}
-
+	} // Protected
+
+		/** Computes the kernel of a dense matrix using \c LQUP.
+		 *
+		 * Acccording to the dimensions of the input matrix, we chose different methods.
+		 * @warning timings may vary and these choices were made on an experimental basis.
+		 *
+		 * @param F  Field
+		 * @param Side  left or right from \c LinBox::SideTag
+		 * @param m rows
+		 * @param n cols
+		 * @param A input matrix
+		 * @param lda leading dimension of A
+		 * @param Ker Kernel. \c NULL if \c kerdim==0
+		 * @param ldk leading dimension of the kernel.
+		 * @param kerdim dimension of the kernel.
+		 * @return dimension of the kernel.
+		 *
+		 * @warning A is modified.
+		 */
 	template<class Field>
 	size_t
-	NullSpaceBasis (const Field& F, const LinBoxTag::Side Side,
+	NullSpaceBasisIn ( const Field & F, const LINBOX_enum(Tag::Side) Side,
 			const size_t & m, const size_t & n,
 			typename Field::Element * A, const size_t & lda,
 			typename Field::Element *& Ker, size_t& ldk,
 			size_t & kerdim)
 	{
-		if (Side == LinBoxTag::Right){
+#if 0
+		if (Side == Tag::Side::Right){
 			if (m < n)
 				Ker = RightNullspaceDirect(F,A,m,n,lda,kerdim) ;
 			else
@@ -471,43 +386,88 @@ namespace LinBox
 				Ker = LeftNullspaceIndirect(F,A,m,n,lda,kerdim) ;
 			ldk = m;
 		}
+#else
+
+		FFPACK::NullSpaceBasis ( F, (FFLAS::FFLAS_SIDE) Side,
+						 m,n, A, lda, Ker, ldk, kerdim);
+#endif
 		return kerdim;
 	}
 
-	template<class Field>
+
+	//!@todo uses too much memory
+	template<class DenseMat>
 	size_t&
-	NullSpaceBasis (const Field& F, const LinBoxTag::Side Side,
-			BlasMatrix<typename Field::Element> & A,
-			BlasMatrix<typename Field::Element> & Ker,
+	NullSpaceBasisIn (const LINBOX_enum(Tag::Side) Side,
+			BlasSubmatrix<DenseMat> & A,
+			BlasMatrix<typename DenseMat::Field> & Ker,
 			size_t & kerdim)
 	{
 
+		typedef typename DenseMat::Field Field;
+
 		typename Field::Element * Ker_ptr;
 		size_t ldk;
-		NullSpaceBasis(F,Side,A.rowdim(),A.coldim(), A.getWritePointer(),A.getStride(), Ker_ptr,ldk,kerdim);
-		if (Side == LinBoxTag::Right){
-			Ker = BlasMatrix<typename Field::Element>(A.rowdim(),kerdim);
+		NullSpaceBasisIn(A.field(),Side,A.rowdim(),A.coldim(), A.getWritePointer(),A.getStride(), Ker_ptr,ldk,kerdim);
+		if (Side == Tag::Side::Right){
+			Ker.resize(A.coldim(),kerdim);
 		}
 		else {
-			Ker = BlasMatrix<typename Field::Element>(kerdim,A.coldim());
+			assert(Side == Tag::Side::Left);
+			Ker.resize(kerdim,A.rowdim());
 		}
-		//! @todo this is slow : use a constructor from Ker ?
-		for(typename BlasMatrix<typename Field::Element>::Iterator it=Ker.Begin(); it!= Ker.End(); ++it,++Ker_ptr)
-			*it=*Ker_ptr;
+		//! @todo use copy
+		const typename Field::Element * Ker_ptri = Ker_ptr;
+		for(typename BlasMatrix<Field>::Iterator it=Ker.Begin(); it!= Ker.End(); ++it,++Ker_ptri)
+			A.field().assign(*it,*Ker_ptri);
+
 		delete[] Ker_ptr ;
+
 		return kerdim;
 	}
 
+	template<class Field>
+	size_t&
+	NullSpaceBasisIn (const LINBOX_enum(Tag::Side) Side,
+			BlasMatrix<Field> & A,
+			BlasMatrix<Field> & Ker,
+			size_t & kerdim)
+	{
+		BlasSubmatrix< BlasMatrix<Field>  > Asub(A);
+		return NullSpaceBasisIn(Side,Asub,Ker,kerdim);
+	}
+
+	template<class Field>
+	size_t&
+	NullSpaceBasis (const LINBOX_enum(Tag::Side) Side,
+			const BlasMatrix<Field> & A,
+			BlasMatrix<Field> & Ker,
+			size_t & kerdim)
+	{
+		const BlasSubmatrix<BlasMatrix<Field> > Asub (A);
+		return NullSpaceBasis<Field>(Side,Asub,Ker,kerdim);
+	}
+
+	template<class DenseMat>
+	size_t&
+	NullSpaceBasis (const LINBOX_enum(Tag::Side) Side,
+			const BlasSubmatrix<DenseMat> & A,
+			BlasMatrix<typename DenseMat::Field> & Ker,
+			size_t & kerdim)
+	{
+		BlasMatrix<typename DenseMat::Field> B (A);
+		return NullSpaceBasisIn<typename DenseMat::Field>(Side,B,Ker,kerdim);
+	}
+
 
 } // LinBox
 
 #endif // __LINBOX_dense_nullspace_INL
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/density.h b/linbox/algorithms/density.h
new file mode 100644
index 0000000..d1c5db9
--- /dev/null
+++ b/linbox/algorithms/density.h
@@ -0,0 +1,85 @@
+/* Copyright (C) 2010 LinBox
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+
+#ifndef __LINBOX_density_H
+#define __LINBOX_density_H
+#include "linbox/vector/vector-traits.h"
+
+namespace LinBox
+{
+
+	/** \brief Estimate nonzero entries in a vector, used in parallel elimination */
+	template<class Vector>
+	inline long density(const Vector& v)
+	{
+
+		return density(v, VectorTraits<Vector>::VectorCategory());
+	}
+
+	template<class Vector, class VectorCategory>
+	inline long density(const Vector&, VectorCategory);
+
+	template<class Vector>
+	inline long density(const Vector& v, VectorCategories::DenseVectorTag)
+	{
+
+		return v.size();
+	}
+
+
+	template<class Vector>
+	inline long density(const Vector& v, VectorCategories::SparseSequenceVectorTag)
+	{
+
+		return v.size();
+	}
+
+
+	template<class Vector>
+	inline long density(const Vector& v, VectorCategories::SparseAssociativeVectorTag)
+	{
+
+		return v.size();
+	}
+
+
+	template<class Vector>
+	inline long density(const Vector& v, VectorCategories::SparseParallelVectorTag) {
+
+
+		return v.first.size();
+	}
+}
+
+#endif //__LINBOX_density_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/algorithms/det-rational.h b/linbox/algorithms/det-rational.h
index 26ffdd6..42592d1 100644
--- a/linbox/algorithms/det-rational.h
+++ b/linbox/algorithms/det-rational.h
@@ -27,10 +27,10 @@
 
 #include "linbox/util/commentator.h"
 #include "linbox/util/timer.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 
 //#include "linbox/field/gmp-rational.h"
-#include "linbox/field/PID-integer.h"
+#include "givaro/givinteger.h"
 #include "linbox/blackbox/rational-matrix-factory.h"
 #include "linbox/algorithms/varprec-cra-early-single.h"
 #include "linbox/algorithms/cra-domain.h"
@@ -164,18 +164,18 @@ namespace LinBox
 						   const MyMethod                 &Met=  Method::Hybrid())
 	{
 
-		typedef Modular<double> myModular;
-		typedef typename Rationals::Element Quotient;
+// 		typedef typename Rationals::Element Quotient;
+		typedef BlasVector<Givaro::IntegerDom>       IVect ;
 
 		commentator().start ("Rational Det", "Rdeterminant");
 
-		RandomPrimeIterator genprime( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
+		RandomPrimeIterator genprime( (unsigned int)(26-(int)ceil(log((double)A.rowdim())*0.7213475205)));
 
 		Integer F = 1;
 		Integer M = 1;
 
 		//BlasMatrixBase<Quotient> ABase(A);
-		RationalMatrixFactory<PID_integer,Rationals, BlasMatrix<Rationals > > FA(&A);
+		RationalMatrixFactory<Givaro::IntegerDom,Rationals, BlasMatrix<Rationals > > FA(&A);
 		Integer di=1;
 
 		for (int i=(int)A.rowdim()-1; i >= 0 ; --i) {
@@ -183,33 +183,35 @@ namespace LinBox
 			M *=di;
 		}
 
-		PID_integer Z;
-		BlasMatrix<PID_integer> Atilde(Z,A.rowdim(), A.coldim());
+		Givaro::IntegerDom Z;
+		BlasMatrix<Givaro::IntegerDom> Atilde(Z,A.rowdim(), A.coldim());
 		FA.makeAtilde(Atilde);
 
-		UserTimer t0, t1,t2;bool term = false;
+		UserTimer t0, t1,t2;
+		bool term = false;
 		t0.clear();
 		t0.start();
 
 		corrections(Atilde,F);
 
-		ChineseRemainder< VarPrecEarlySingleCRA<Modular<double> > > cra(3UL);
+		ChineseRemainder< VarPrecEarlySingleCRA<Givaro::Modular<double> > > cra(3UL);
 		MyRationalModularDet<BlasMatrix<Rationals > , MyMethod> iteration1(A, Met, M, F);
-		MyIntegerModularDet<BlasMatrix<PID_integer>, MyMethod> iteration2(Atilde, Met);
+		MyIntegerModularDet<BlasMatrix<Givaro::IntegerDom>, MyMethod> iteration2(Atilde, Met);
 		MyModularDet<MyRationalModularDet<BlasMatrix<Rationals > , MyMethod>,
-		MyIntegerModularDet<BlasMatrix<PID_integer>, MyMethod> >  iteration(&iteration1,&iteration2);
+		MyIntegerModularDet<BlasMatrix<Givaro::IntegerDom>, MyMethod> >  iteration(&iteration1,&iteration2);
 
-		RReconstruction<PID_integer, ClassicMaxQRationalReconstruction<PID_integer> > RR;
+		RReconstruction<Givaro::IntegerDom, ClassicMaxQRationalReconstruction<Givaro::IntegerDom> > RR;
 
 		Integer dd; // use of integer due to non genericity of cra. PG 2005-08-04
 		size_t k = 4;
 		t1.clear();
 		t2.clear();
 		t1.start();
-		term =  cra((int)k,dd,iteration1,genprime);
+		//BB added |= because term was not used.
+		term |=  cra((int)k,dd,iteration1,genprime);
 		t1.stop();
 		t2.start();
-		term =  cra((int)k,dd,iteration2,genprime);
+		term |=  cra((int)k,dd,iteration2,genprime);
 		t2.stop();
 
 		double s1 = t1.time(), s2 = t2.time();
@@ -225,7 +227,7 @@ namespace LinBox
 		}
 
 		//switch: LIF
-		std::vector<typename PID_integer::Element> v(A.rowdim()), r(A.rowdim());
+		IVect v(Z,A.rowdim()), r(Z,A.rowdim());
 		++genprime;
 		for(size_t i=0; i < v.size(); ++i) {
 			v[i] = rand() % (*genprime) ;
@@ -240,9 +242,9 @@ namespace LinBox
 		Integer lif = 1;
 		if ((s1 > 4*s2) && (!term)){
 			//cout << "lif " << std::flush;
-			RationalSolver < PID_integer , Modular<double>, RandomPrimeIterator, DixonTraits > RSolver;
-			LastInvariantFactor < PID_integer ,RationalSolver < PID_integer, Modular<double>, RandomPrimeIterator, DixonTraits > >  LIF(RSolver);
-			std::vector<Integer> r_num2 (Atilde. coldim());
+			RationalSolver < Givaro::IntegerDom , Givaro::Modular<double>, RandomPrimeIterator, DixonTraits > RSolver;
+			LastInvariantFactor < Givaro::IntegerDom ,RationalSolver < Givaro::IntegerDom, Givaro::Modular<double>, RandomPrimeIterator, DixonTraits > >  LIF(RSolver);
+			IVect r_num2 (Z,Atilde. coldim());
 			t1.clear();
 			t1.start();
 			if (LIF.lastInvariantFactor1(lif, r_num2, Atilde)==0) {
@@ -334,11 +336,10 @@ namespace LinBox
 #endif //__LINBOX_det_rational_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/diophantine-solver.C b/linbox/algorithms/diophantine-solver.C
index b714644..defdbb5 100644
--- a/linbox/algorithms/diophantine-solver.C
+++ b/linbox/algorithms/diophantine-solver.C
@@ -22,6 +22,7 @@
  */
 
 
+#include "linbox/linbox-config.h"
 #include "linbox/algorithms/diophantine-solver.h"
 
 namespace LinBox
@@ -32,11 +33,10 @@ namespace LinBox
 
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/diophantine-solver.h b/linbox/algorithms/diophantine-solver.h
index 419057f..8c3628a 100644
--- a/linbox/algorithms/diophantine-solver.h
+++ b/linbox/algorithms/diophantine-solver.h
@@ -67,7 +67,9 @@ namespace LinBox
 		 * @param rs  a rationalSolver
 		 */
 		DiophantineSolver (QSolver& rs) :
-			_rationalSolver(rs), _ring(rs.getRing()), lastCertificate(_ring, 0)
+			_rationalSolver(rs), _ring(rs.getRing())
+			,numSolutionsNeeded(0),numFailedCallsToSolver(0),numRevelantSolutions (0)
+			, lastCertificate(_ring, 0)
 		{ }
 
 		/** Solve a linear system \c Ax=b over quotient field of a ring.
@@ -132,14 +134,17 @@ namespace LinBox
 }
 #include "linbox/algorithms/diophantine-solver.inl"
 
+#ifdef LinBoxSrcOnly
+#include "linbox/algorithms/diophantine-solver.C"
+#endif
+
 #endif //__LINBOX_diophantine_solver_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/diophantine-solver.inl b/linbox/algorithms/diophantine-solver.inl
index bd82dcf..f3d30b9 100644
--- a/linbox/algorithms/diophantine-solver.inl
+++ b/linbox/algorithms/diophantine-solver.inl
@@ -25,7 +25,7 @@
 #ifndef __LINBOX_diophantine_solver_INL
 #define __LINBOX_diophantine_solver_INL
 
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/blackbox/lambda-sparse.h"
 #include "linbox/algorithms/rational-solver.h"
 #include "linbox/algorithms/vector-fraction.h"
@@ -102,7 +102,7 @@ namespace LinBox
 		if (level >= SL_LASVEGAS)
 			lowerDenBound = _rationalSolver.lastCertifiedDenFactor;
 		else
-			_ring.init(lowerDenBound, 1);
+			_ring.assign(lowerDenBound, _ring.one);
 #ifdef DEBUG_DIO
 		std::cout << "lower bound on denominator: " << lowerDenBound << std::endl;
 		std::cout << "upper bound on denominator: " << upperDenBound << std::endl;
@@ -187,11 +187,10 @@ namespace LinBox
 #endif //__LINBOX_diophantine_solver_INL
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/double-det.h b/linbox/algorithms/double-det.h
index 7a010a5..1d057db 100644
--- a/linbox/algorithms/double-det.h
+++ b/linbox/algorithms/double-det.h
@@ -35,7 +35,6 @@
 #include "linbox/randiter/random-prime.h"
 #include "linbox/solutions/solve.h"
 #include "linbox/solutions/methods.h"
-#include <vector>
 
 namespace LinBox
 {
@@ -60,12 +59,12 @@ namespace LinBox
 		size_t* P = new size_t[N];
 		size_t* Qt = new size_t[N-1];
 
-		FFPACK::LUdivine ((typename Field::Father_t)F, FFLAS::FflasUnit, FFLAS::FflasNoTrans, N-1, N,
+		FFPACK::LUdivine (F, FFLAS::FflasUnit, FFLAS::FflasNoTrans, N-1, N,
 				  A, lda, P, Qt);
 		typename Field::Element d;
 
 		// Multiplying all (N-1) first pivots)
-		F.init(d, 1UL);
+		F.assign(d, F.one);
 		for (size_t i=0; i<N-1; ++i)
 			F.mulin (d, *(A + i*(lda+1)));
 
@@ -76,14 +75,14 @@ namespace LinBox
 			F.negin(d);
 
 		// Trick: instead of Right-Trans, do Left-NoTrans in order to use inc*
-		FFPACK::applyP ((typename Field::Father_t)F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
+		FFPACK::applyP (F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
 				1, 0,(int) N-1, b, incb, P);
-		FFPACK::applyP ((typename Field::Father_t)F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
+		FFPACK::applyP (F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
 				1, 0,(int) N-1, c, incc, P);
-		FFLAS::ftrsv ((typename Field::Father_t)F, FFLAS::FflasUpper, FFLAS::FflasTrans,
+		FFLAS::ftrsv (F, FFLAS::FflasUpper, FFLAS::FflasTrans,
 			      FFLAS::FflasUnit,
 			      N, A, lda, b, (int)incb);
-		FFLAS::ftrsv ((typename Field::Father_t)F, FFLAS::FflasUpper, FFLAS::FflasTrans,
+		FFLAS::ftrsv (F, FFLAS::FflasUpper, FFLAS::FflasTrans,
 			      FFLAS::FflasUnit,
 			      N, A, lda, c, (int)incc);
 
@@ -109,8 +108,8 @@ namespace LinBox
 		{}
 
 		template<class Field>
-		std::vector<typename Field::Element>&
-		operator () (std::vector<typename Field::Element>& dd,
+		BlasVector<Field>&
+		operator () (BlasVector<Field>& dd,
 			     const Field& F) const
 		{
 
@@ -241,9 +240,9 @@ namespace LinBox
 		typename BlackBox::Field F = A.field();
 		IntegerDoubleDetIteration<BlackBox> iteration(A, s1, s2);
 		// 0.7213475205 is an upper approximation of 1/(2log(2))
-		RandomPrimeIterator genprime( 25-(int)ceil(log((double)A.rowdim())*0.7213475205));
+		RandomPrimeIterator genprime( (unsigned int)(25-(int)ceil(log((double)A.rowdim())*0.7213475205)));
 
-		std::vector<typename BlackBox::Field::Element> dd;
+		BlasVector<typename BlackBox::Field> dd(A.field());
 		if (proof) {
 			integer bound;
 			double logbound;
@@ -255,7 +254,7 @@ namespace LinBox
 			//t_hd.stop();
 			//std::cerr<<"Hadamard bound = : "<<logbound<<" in "<<t_hd.usertime()<<"s"<<std::endl;
 
-			ChineseRemainder <FullMultipCRA <Modular <double> > > cra(logbound);
+			ChineseRemainder <FullMultipCRA <Givaro::Modular <double> > > cra(logbound);
 
 			//t_hd.clear();
 			//t_cra.start();
@@ -265,7 +264,7 @@ namespace LinBox
 
 		}
 		else {
-			ChineseRemainder <EarlyMultipCRA <Modular<double> > > cra(4UL);
+			ChineseRemainder <EarlyMultipCRA <Givaro::Modular<double> > > cra(4UL);
 			cra (dd, iteration, genprime);
 		}
 		F.mul (d1, dd[0], s1);
@@ -295,7 +294,7 @@ namespace LinBox
 		const size_t N = A.coldim();
 		BlasMatrix<typename BlackBox::Field> B (A.field(),N,N);
 		typename BlackBox::Field::Element den1, den2;
-		std::vector<typename BlackBox::Field::Element> x1(N);
+		BlasVector<typename BlackBox::Field> x1(A.field(),N);
 		for (size_t i=0; i<N; ++i){
 			x1[i] = 0;
 			for (size_t j=0; j<N; ++j)
@@ -304,7 +303,7 @@ namespace LinBox
 		// 		for (size_t i=0; i<N; ++i)
 		// 			B.setEntry (i, N-1, b[i]);
 
-		std::vector<typename BlackBox::Field::Element> c(N);
+		BlasVector<typename BlackBox::Field> c(A.field(),N);
 		for (size_t i=0; i<N; ++i)
 			c[i] = A.getEntry (N, i);
 		//Timer tim;
@@ -314,7 +313,7 @@ namespace LinBox
 		//tim.stop();
 		//std::cerr<<"Solve took "<<tim.usertime()<<std::endl;
 
-		den1 = den1;
+		// den1 = den1;
 		// Should work:
 		// den (y[n]) = den (-den1/x[n]) = x[n]
 		den2 = -x1[N-1];
@@ -331,11 +330,10 @@ namespace LinBox
 #endif // __LINBOX_doubledet_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/dyadic-to-rational.h b/linbox/algorithms/dyadic-to-rational.h
index e1ced43..ffdb3ce 100644
--- a/linbox/algorithms/dyadic-to-rational.h
+++ b/linbox/algorithms/dyadic-to-rational.h
@@ -1,5 +1,6 @@
-#ifndef __DYADICTORATIONAL_H
-#define __DYADICTORATIONAL_H
+#ifndef __LINBOX_algorithms_dyadic_to_rational_H
+#define __LINBOX_algorithms_dyadic_to_rational_H
+
 /* dyadic-to-rational.h
  *
  * dyadicToRational reconstructs a rational a/b from dyadic approximation n/2^k.
@@ -34,12 +35,12 @@
 
 #include <stack>
 #include <assert.h>
-#include <vector>
 
 //#include "linbox/integer.h"
 
 namespace LinBox{
-
+template<class Ring>
+bool partial_hegcd(Ring& Z, typename Ring::Element& e, typename Ring::Element& b, const typename Ring::Element& n, const typename Ring::Element& d, const typename Ring::Element& denBound);
 /** Rational reconstruction of a/b from n/d with denominator bound B.
  * We give a/b, the continued fraction approximant of n/d that
  * satisfies |a/b - n/d| < 1/2d (well approximated) and 0 < b <= B.
@@ -95,8 +96,7 @@ int dyadicToRational (
 	// now a/b is solution but signs may be wrong
 	Z.abs(a,a);
 	Z.abs(b,b);
-	Int zero; Z.init(zero, 0);
-	if (Z.compare(n, zero) < 0)  Z.negin(a); // a = -a;
+	if (Z.compare(n, Z.zero) < 0)  Z.negin(a); // a = -a;
 
 //std::cout << "DtR in n, d " << n << " "<< d << ", bound " << B << ", out a, b " << a << " " << b << std::endl;
 	bool guarantee = b*B < d;
@@ -124,10 +124,10 @@ bool partial_hegcd(Ring& Z, typename Ring::Element& e, typename Ring::Element& b
 	Int quo, r, tmp;  Z.init(quo); Z.init(r); Z.init(tmp);
 	bool withinbound, wellapproximated;
 
-	Int b0; Z.init(b0, 1); // and a0 = -0
-	Int r0; Z.init(r0, n); // so that r0 = b0*n - a0*d
-	Int b1; Z.init(b1, -0); // and a1 = 1
-	Int r1; Z.init(r1, d); // so that r1 = b1*n - a1*d
+	Int b0; Z.init(b0); Z.assign(b0, Z.one); // and a0 = -0
+	Int r0; Z.init(r0); Z.assign(r0, n); // so that r0 = b0*n - a0*d
+	Int b1; Z.init(b1); Z.assign(b1, Z.zero); // and a1 = 1
+	Int r1; Z.init(r1); Z.assign(r1, d); // so that r1 = b1*n - a1*d
 //std::cout << "init 1 -0: " << b0 << " " << b1 << std::endl;
 
 	do {
@@ -157,24 +157,23 @@ bool partial_hegcd(Ring& Z, typename Ring::Element& e, typename Ring::Element& b
 template<class Ring>
 int dyadicToRational(
 	const Ring& Z,
-	std::vector<typename Ring::Element>& num, typename Ring::Element& den,
-	std::vector<typename Ring::Element>& numx, typename Ring::Element& denx,
+	BlasVector<Ring>& num, typename Ring::Element& den,
+	BlasVector<Ring>& numx, typename Ring::Element& denx,
 	typename Ring::Element& denBound)
 {
 	typedef typename Ring::Element Int;
 	Int q, rem, tmp_den, nx;
 	Z.init(q); Z.init(rem); Z.init(tmp_den); Z.init(nx);
-	Int one; Z.init(one, 1);
-	Int two; Z.init(two, 2);
-	Int denx2;
-	Z.init(denx2, denx); Z.divin(denx2, two);// denx2 = denx/2, for balancing remainders.
+	Int two; Z.init(two, int64_t(2));
+	Int denx2; Z.init(denx2);
+	Z.assign(denx2, denx); Z.divin(denx2, two);// denx2 = denx/2, for balancing remainders.
 	std::stack<std::pair<size_t, Int> > S;
 	Int tmp; Z.init(tmp);
 
-	Int den_lcm; Z.init(den_lcm, 1);
+	Int den_lcm; Z.init(den_lcm); Z.assign(den_lcm, Z.one);
 	den = den_lcm; // = 1.
 
-	S.push(std::pair<int, Int>(0, 1));
+	S.push(std::pair<int, Int>(0, Z.one));
 	Int e; Z.init(e);// e for error
 	int ret = 2; // 2 means guaranteed, 1 possible, 0 fail.
 	for (size_t i = 0; i < num.size(); ++i) {
@@ -183,7 +182,7 @@ int dyadicToRational(
 		Z.quoRem(num[i], e, tmp, denx); //nx*den - num[i]*denx = e, with num[i] and e nonneg.
 		// we need |nx/denx - num[i]/den| == e/den*denx <= 1/2denx, so 2e <= den.
 		// adjust to balanced remainder e.
-		if (Z.compare(e, denx2) >= 0) {Z.subin(e, denx), Z.addin(num[i], one); }
+		if (Z.compare(e, denx2) >= 0) {Z.subin(e, denx), Z.addin(num[i], Z.one); }
 		//nx*den = num[i]*denx + e , thus |nx/denx - num[i]/den| = e/denx*den
 
 	// can try e < den && 2*e < den for speed
@@ -208,19 +207,18 @@ int dyadicToRational(
 			if (Z.compare(den, denBound)>0) return false; // den > denBound
 		}
 
-		Int zero; Z.init(zero);
-		if (Z.compare(numx[i], zero) < 0) Z.negin(num[i]); // numx[i] < 0
+		if (Z.compare(numx[i], Z.zero) < 0) Z.negin(num[i]); // numx[i] < 0
 
 	}
 	// now fix shorties
-	Int t; Z.init(t, 1);
+	Int t; Z.assign(t, Z.one);
 	while ( S.size() > 1 ) {
 		Z.mulin(t, S.top().second);
 		int k = (int)S.top().first;
 		S.pop();
 		int j = (int)S.top().first;
 		for (int i = k-1; i >= j; --i) {
-			Z.mulin(num[i], t);
+			Z.mulin(num[(size_t)i], t);
 		}
 	}
 	S.pop();
@@ -231,7 +229,7 @@ int dyadicToRational(
 #if 0
 // vector rational reconstruction building num, den from numx, denx
 // This one -- very inefficient -- just reconstructs each one, then goes thru to fix for lcm.
-void rational_reconstruction(std::vector<integer>& num, integer& den, std::vector<integer>& numx, integer& denx, integer& denBound) {
+void rational_reconstruction(BlasVector<Givaro::ZRing<Integer> >& num, integer& den, BlasVector<Givaro::ZRing<Integer> >& numx, integer& denx, integer& denBound) {
 	integer den_tmp, missing_factor;
 	den = 1;
 	for (size_t i = 0; i < numx.size(); ++i) {
@@ -249,15 +247,14 @@ void rational_reconstruction(std::vector<integer>& num, integer& den, std::vecto
 #endif
 
 }// LinBox
-#endif // __DYADICTORATIONAL_H
+#endif // __LINBOX_algorithms_dyadic_to_rational_H
 
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
diff --git a/linbox/algorithms/echelon-form.h b/linbox/algorithms/echelon-form.h
index 1423e53..da5a0cf 100644
--- a/linbox/algorithms/echelon-form.h
+++ b/linbox/algorithms/echelon-form.h
@@ -30,8 +30,8 @@
 #ifndef __LINBOX_echelon_form_H
 #define __LINBOX_echelon_form_H
 
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
 
 #include "linbox/matrix/matrix-domain.h"
 #include "linbox/matrix/factorized-matrix.h"
@@ -45,7 +45,7 @@ namespace LinBox
 
 	private:
 
-		Field                      _field;
+		const Field                      *_field;
 		BlasMatrixDomain<Field>  _BMD;
 		MatrixDomain<Field>       _MD;
 
@@ -54,7 +54,7 @@ namespace LinBox
 
 		// constructor
 		EchelonFormDomain(const Field &F) :
-			_field(F), _BMD(F), _MD(F)
+			_field(&F), _BMD(F), _MD(F)
 		{}
 
 
@@ -70,13 +70,13 @@ namespace LinBox
 			n = A.coldim();
 
 			// get the transposed of A
-			BlasMatrix<Field> At(_field,n, m);
+			BlasMatrix<Field> At(field(),n, m);
 			for (size_t i=0;i<m;++i)
 				for (size_t j=0;j<n;++j)
 					At.setEntry(j,i,A.getEntry(i,j));
 
 
-			rank = columnEchelon(At);
+			rank = (size_t)columnEchelon(At);
 
 			// read the transpose of the echelon form from the rank 1st column of L
 			for (size_t i=0; i<rank;++i)
@@ -99,12 +99,12 @@ namespace LinBox
 			n = A.coldim();
 
 			// get the transposed of A
-			BlasMatrix<Field> At(_field,n, m);
+			BlasMatrix<Field> At(field(),n, m);
 			for (size_t i=0;i<m;++i)
 				for (size_t j=0;j<n;++j)
 					At.setEntry(j,i,A.getEntry(i,j));
 
-			rank = columnReducedEchelon(At);
+			rank = (size_t)columnReducedEchelon(At);
 
 			// read the transpose of the echelon form from the rank 1st column of At
 			for (size_t i=0; i<rank;++i)
@@ -158,9 +158,6 @@ namespace LinBox
 			size_t m,n, rank;
 			m = E.rowdim();
 			n = E.coldim();
-			// Element zero, one;
-			// _field.init(zero,0);
-			// _field.init(one,1);
 
 			BlasPermutation<size_t> P(E.coldim());
 			BlasPermutation<size_t> Qt(E.rowdim());
@@ -176,11 +173,11 @@ namespace LinBox
 			// Zero out upper triangular part of E
 			for (size_t i=0;i<m;++i)
 				for (size_t j=i;j<n;++j)
-					E.setEntry(i,j,_field.zero);
+					E.setEntry(i,j,field().zero);
 
 			// put one inplace of pivot
 			for (size_t i=0;i<rank;++i){
-				E.setEntry(*(Qt.getPointer()+i),i,_field.one);
+				E.setEntry(*(Qt.getPointer()+i),i,field().one);
 			}
 
 			return (int)rank;
@@ -194,9 +191,6 @@ namespace LinBox
 
 			m = E.rowdim();
 			n = E.coldim();
-			// Element zero, one;
-			// _field.init(zero,0);
-			// _field.init(one,1);
 
 			// compute the LQUP of E
 			BlasPermutation<size_t> P(E.coldim());
@@ -213,26 +207,26 @@ namespace LinBox
 			// Zero out upper triangular part of E
 			for (size_t i=0;i<m;++i)
 				for (size_t j=i;j<n;++j)
-					E.setEntry(i,j,_field.zero);
+					E.setEntry(i,j,field().zero);
 
 			// permute E with Qt
 			_BMD.mulin_right(Qt,E);
 
 			// put one inplace of pivot
 			for (size_t i=0;i<rank;++i)
-				E.setEntry(i,i, _field.one);//*(Qt.getPointer()+i),one);
+				E.setEntry(i,i, field().one);//*(Qt.getPointer()+i),one);
 
 			// Update the first r columns of E by Err^(-1)
 			// BlasSubmatrix<Field> Er(E,0,0,rank,rank);
 			BlasMatrix<Field> Er(E,0,0,rank,rank);
-			TriangularBlasMatrix<Field> Err(Er, LinBoxTag::Lower, LinBoxTag::Unit);
-			BlasSubmatrix<Field> En(E,rank,0,m-rank,rank);
+			TriangularBlasMatrix<Field> Err(Er, Tag::Shape::Lower, Tag::Diag::Unit);
+			BlasSubmatrix<BlasMatrix<Field> > En(E,rank,0,m-rank,rank);
 
 			_BMD.right_solve(Err, En);
 
 			for (size_t i=0;i<rank;++i){
 				for (size_t j=0;j<i;++j)
-					E.setEntry(i,j,_field.zero);
+					E.setEntry(i,j,field().zero);
 			}
 
 			// permute L such that L<-Q.E
@@ -254,15 +248,16 @@ namespace LinBox
 			for (size_t i=0;i<m-1;++i){
 				std::cout<<"[";
 				for (size_t j=0;j<n-1;++j)
-					_field.write(std::cout,A.getEntry(i,j))<<",";
-				_field.write(std::cout, A.getEntry(i,n-1))<<"] , ";
+					field().write(std::cout,A.getEntry(i,j))<<",";
+				field().write(std::cout, A.getEntry(i,n-1))<<"] , ";
 			}
 			std::cout<<"[";
 			for (size_t j=0;j<n-1;++j)
-				_field.write(std::cout,A.getEntry(m-1,j))<<",";
-			_field.write(std::cout, A.getEntry(m-1,n-1))<<"]]);\n ";
+				field().write(std::cout,A.getEntry(m-1,j))<<",";
+			field().write(std::cout, A.getEntry(m-1,n-1))<<"]]);\n ";
 		}
 
+		const Field & field() { return *_field; }
 	};
 
 }
diff --git a/linbox/algorithms/eliminator.h b/linbox/algorithms/eliminator.h
index b315f77..efb8b40 100644
--- a/linbox/algorithms/eliminator.h
+++ b/linbox/algorithms/eliminator.h
@@ -37,6 +37,7 @@
 #include "linbox/vector/vector-domain.h"
 #include "linbox/blackbox/archetype.h"
 #include "linbox/solutions/methods.h"
+#include "linbox/matrix/dense-matrix.h"
 
 
 namespace LinBox
@@ -179,7 +180,8 @@ namespace LinBox
 		*/
 		std::ostream &writePermutation (std::ostream &out, const Permutation &P) const;
 
-	private:
+		const Field & field() { return _MD.field() ; }
+
 		// Compute the kth indexed Gauss-Jordan transform of the input
 		Matrix &kthGaussJordan (unsigned int                  &r,
 					typename Field::Element       &d,
@@ -219,13 +221,12 @@ namespace LinBox
 								 unsigned int dim, const std::vector<unsigned int> &profile);
 
 		// Private variables
+	private:
 
-		const Field                      &_field;
 		VectorDomain<Field>               _VD;
 		MatrixDomain<Field>               _MD;
 		unsigned int                      _number;
 
-		typename Field::Element           _one;
 
 		// Temporaries used in the computation
 
diff --git a/linbox/algorithms/eliminator.inl b/linbox/algorithms/eliminator.inl
index a1399fd..d0d9816 100644
--- a/linbox/algorithms/eliminator.inl
+++ b/linbox/algorithms/eliminator.inl
@@ -38,7 +38,6 @@
 #include "linbox/blackbox/diagonal.h"
 #include "linbox/blackbox/compose.h"
 #include "linbox/blackbox/transpose.h"
-#include "linbox/randiter/nonzero.h"
 #include "linbox/util/commentator.h"
 #include "linbox/util/timer.h"
 
@@ -65,9 +64,8 @@ namespace LinBox
 
 	template <class Field, class Matrix>
 	Eliminator<Field, Matrix>::Eliminator (const Field &F, unsigned int N) :
-		_field (F), _VD (F), _MD (F), _number (N), _indepRows (N), _indepCols (N)
+		 _VD (F), _MD (F), _number (N), _indepRows (N), _indepCols (N)
 	{
-		_field.init (_one, 1);
 	}
 
 	template <class Field, class Matrix>
@@ -108,7 +106,7 @@ namespace LinBox
 		_perm.clear ();
 		_profile_idx = 0;
 
-		kthGaussJordan (rank, d, 0, 0, A.coldim (), _one);
+		kthGaussJordan (rank, d, 0, 0, A.coldim (), field().one);
 
 		buildMinimalPermutation (P, rank, A.rowdim (), _perm);
 		buildMinimalPermutationFromProfile (Q, rank, A.coldim (), _profile);
@@ -122,7 +120,7 @@ namespace LinBox
 
 		BlasMatrix<Field> Ainv1 (Ainv, 0, 0, rank, rank);
 		BlasMatrix<Field> U1 (_matU, 0, 0, rank, rank);
-		_field.inv (dinv, d);
+		field().inv (dinv, d);
 		_MD.mul (Ainv1, U1, dinv);
 
 		BlasMatrix<Field> Tv1 (Tv, 0, rank, rank, A.coldim () - rank);
@@ -215,7 +213,7 @@ namespace LinBox
 
 		/* Run the computation */
 
-		kthGaussJordan (rank, d, 0, 0, _matA.coldim (), _one);
+		kthGaussJordan (rank, d, 0, 0, _matA.coldim (), fiedl().one);
 
 		/* Set _indepRows based on the permutation */
 		std::fill (_indepRows.begin (), _indepRows.begin () + rank, true);
@@ -231,7 +229,7 @@ namespace LinBox
 		_MD.permuteColumns (_matU, _perm.rbegin (), _perm.rend ());
 
 		/* Divide _matU by the determinant and copy to W */
-		_field.invin (d);
+		field().invin (d);
 		_MD.mulin (_matU, d);
 
 		_MD.subin (W, W);
@@ -295,7 +293,7 @@ namespace LinBox
 		_perm.clear ();
 		_MD.copy (_matA, A);
 		_profile_idx = 0;
-		kthGaussJordan (rank, det, 0, 0,  (unsigned int) A.coldim (), _one);
+		kthGaussJordan (rank, det, 0, 0,  (unsigned int) A.coldim (), field().one);
 
 		buildMinimalPermutation (P, rank,  (unsigned int) A.rowdim (), _perm);
 		buildMinimalPermutationFromProfile (Q, rank,  (unsigned int) A.coldim (), _profile);
@@ -309,7 +307,7 @@ namespace LinBox
 
 		BlasMatrix<Field> Ainv1 (U, 0, 0, rank, rank);
 		BlasMatrix<Field> U1 (_matU, 0, 0, rank, rank);
-		_field.inv (dinv, det);
+		field().inv (dinv, det);
 		_MD.mul (Ainv1, U1, dinv);
 
 		BlasMatrix<Field> Tv1 (Tv, 0, rank, rank, A.coldim () - rank);
@@ -368,7 +366,6 @@ namespace LinBox
 	 unsigned int                   m,
 	 const typename Field::Element &d0)
 	{
-		unsigned int i;
 
 #ifdef ELIM_DETAILED_TRACE
 		commentator().start ("kth indexed Gauss-Jordan transform", "Eliminator::kthGaussJordan");
@@ -387,12 +384,13 @@ namespace LinBox
 
 		if (_MD.isZero (Ap)) {
 			r = 0;
-			_field.assign (d, d0);
+			field().assign (d, d0);
 		}
 		else if (m == 1) {
+			unsigned int i;
 			// Find minimal index i > k with _matA[i, 1] != 0
 			for (i = 0; i < _matA.rowdim (); ++i)
-				if (_indices[i] >= k && !_field.isZero (_matA.getEntry (_indices[i], s)))
+				if (_indices[i] >= k && !field().isZero (_matA.getEntry (_indices[i], s)))
 					break;
 
 			linbox_check (i < _matA.rowdim ());
@@ -404,12 +402,12 @@ namespace LinBox
 			r = 1;
 			_matA.getEntry (d, _indices[i], s);
 
-			typename Matrix::ColIterator Uk = _matU.colBegin () + k;
-			typename Matrix::ColIterator A1 = _matA.colBegin () + s;
+			typename Matrix::ColIterator Uk = _matU.colBegin () + (int)k;
+			typename Matrix::ColIterator A1 = _matA.colBegin () + (int)s;
 
 			_VD.neg (*Uk, *A1);
-			_field.assign ((*Uk)[_indices[i]], (*Uk)[k]);
-			_field.assign ((*Uk)[k], d0);
+			field().assign ((*Uk)[_indices[i]], (*Uk)[k]);
+			field().assign ((*Uk)[k], d0);
 
 			std::swap (_indices[i], _indices[k]);
 
@@ -447,7 +445,7 @@ namespace LinBox
 			BlasMatrix<Field> f (_matA,    k,      s + m1, r1, m2);
 			BlasMatrix<Field> g (_matA,    k + r1, s + m1, l1, m2);
 
-			_field.inv (d0inv, d0);
+			field().inv (d0inv, d0);
 
 			_MD.mul (et, a, f);
 			_MD.mulin (e, d1);
@@ -476,7 +474,7 @@ namespace LinBox
 
 			BlasMatrix<Field> U1 (_matU, 0, k, _matU.rowdim (), r1);
 
-			_field.neg (d1neg, d1);
+			field().neg (d1neg, d1);
 			adddIN (_matU, d1neg);
 			_MD.permuteRows (U1, _perm.begin () + P_end, _perm.end ());
 			adddIN (_matU, d1);
@@ -509,7 +507,7 @@ namespace LinBox
 			BlasMatrix<Field> u2    (_matU, k + r1, k + r1, r2, r2);
 			BlasMatrix<Field> c2    (_matU, k + r,  k + r1, l2, r2);
 
-			_field.inv (d1inv, d1);
+			field().inv (d1inv, d1);
 
 			_MD.mul (a11t, a2, c1);
 			_MD.mulin (a1, d);
@@ -539,8 +537,8 @@ namespace LinBox
 
 		typename Field::Element dinv, d0inv;
 
-		_field.inv (dinv, d);
-		_field.inv (d0inv, d0);
+		field().inv (dinv, d);
+		field().inv (d0inv, d0);
 
 		BlasMatrix<Field> R (_matA.rowdim () - k, _matA.coldim () - s);
 		BlasMatrix<Field> Atest (Acopy, k, s, _matA.rowdim () - k, _matA.coldim () - s);
@@ -573,7 +571,7 @@ namespace LinBox
 		unsigned int idx;
 
 		for (i = A.rowBegin (), idx = 0; i != A.rowEnd (); ++i, ++idx)
-			_field.addin ((*i)[idx], d);
+			A.field().addin ((*i)[idx], d);
 
 		return A;
 	}
@@ -589,7 +587,7 @@ namespace LinBox
 
 		for (i = A.rowBegin (), i_idx = 0; i != A.rowEnd (); ++i, ++i_idx) {
 			_VD.subin (*i, *i);
-			_field.assign ((*i)[i_idx], _one);
+			A.field().assign ((*i)[i_idx], A.field().one);
 		}
 
 		return A;
@@ -693,7 +691,7 @@ namespace LinBox
 		idx2 = dim - 1;
 
 		while (idx < rank && idx2 >= rank) {
-			while (_indepRows[idx] && idx < rank) ++idx;
+			while (idx < rank && _indepRows[idx]) ++idx;
 			while (!_indepRows[idx2] && idx2 >= rank) --idx2;
 
 			if (idx < rank && idx2 >= rank)
diff --git a/linbox/algorithms/fast-rational-reconstruction.h b/linbox/algorithms/fast-rational-reconstruction.h
index a405352..0562bbd 100644
--- a/linbox/algorithms/fast-rational-reconstruction.h
+++ b/linbox/algorithms/fast-rational-reconstruction.h
@@ -125,7 +125,7 @@ namespace LinBox
 		Element& powtwo(Element& h, const size_t log_h) const
 		{
 			h = 1;
-			if (log_h <= 0) return h;
+			// if (log_h <= 0) return h;
 			h<<=log_h;
 			return h;
 		}
@@ -146,7 +146,6 @@ namespace LinBox
 
 			if (!fastEEA (ai,bi,ci,di,m,log_m,x,bound, log_bound)) return false;
 
-			int K=0;
 
 			Element init_ainext = cur_ainext;
 			Element init_qinext = cur_qinext;
@@ -154,6 +153,7 @@ namespace LinBox
 			Element init_ri = cur_ri;
 			/* correction if $K <> bound = 2^log_bound */
 			if (cur_rinext > 0) {
+				int K=0;
 				while (cur_ainext <= d_bound) {
 					++K;
 					Element tmp;
@@ -350,15 +350,15 @@ namespace LinBox
 				aistar=distar=1;
 				bistar=cistar=0;
 
-				Element mstar = m >> (long unsigned int) lambda;
-				Element nstar = n >> (long unsigned int) lambda;
+				Element mstar = m >> (uint64_t) lambda;
+				Element nstar = n >> (uint64_t) lambda;
 
 				size_t log_mstar = 2*h+1;
 				if (nstar > 0) if (!fastEEA(aistar, bistar, cistar, distar, mstar, log_mstar,nstar, powh, h)) return false;
 
-				int K=2;//reatreat steps;
 
 				if ((aistar > 1) && (distar > 0)) { //we have to go back 2 steps
+					int K=2;//reatreat steps;
 					Element aprev,bprev,cprev,dprev;
 					for (int i=0; i < K; ++i) {
 						prevEEA(aprev,bprev,cprev,dprev,aistar,bistar,cistar,distar);
@@ -403,9 +403,9 @@ namespace LinBox
 				Element ri = cur_ri;
 				Element rinext = cur_rinext;
 
-				size_t log_m;
 
 				if ((rinext > 0) && (cur_ainext <= powh)){
+				size_t log_m;
 					log_m = rinext.bitsize()-1;
 					Element m2, n2;
 					m2 = rinext;
@@ -424,12 +424,12 @@ namespace LinBox
 
 					int k = (int)a1.bitsize()-1 ;
 					int _k;
-					if (h-k > 2)
-						_k = (int)(h-k-2);
+					if ((int)h-k > 2)
+						_k = ((int)h-k-2);
 					else _k = 0;
 					if (n2 >0) {
 						if (a1 < powh) {
-							if (!fastEEA(a2,b2,c2,d2,m2,log_m,n2, powtwo(sqrth,_k), _k)) return false;
+							if (!fastEEA(a2,b2,c2,d2,m2,log_m,n2, powtwo(sqrth,(size_t)_k), (size_t)_k)) return false;
 						}
 						else {
 							ai = a1; bi = b1; ci=c1; di = d1;
@@ -545,7 +545,7 @@ namespace LinBox
 				}
 
 				Element ainext, binext, cinext,dinext;
-				ainext=dinext=1;
+				dinext=1;
 				binext=cinext=0;
 				ainext = cur_ainext;
 				int K=-1;
@@ -659,7 +659,7 @@ namespace LinBox
 			a = tmpa; b = tmpb; c = tmpc; d = tmpd;
 		}
 
-		QMatrix& max(const QMatrix& max1, const QMatrix max2) {
+		QMatrix /* & */ max(const QMatrix& max1, const QMatrix max2) {
 			if (max1.q >= max2.q) return QMatrix(max1);
 			else return QMatrix(max2);
 		}
@@ -695,7 +695,7 @@ namespace LinBox
 			if (_size+1 < _maxSize) {
 				this->push_back(bottom);
 				return false;
-				++_size;
+				// ++_size;
 			}
 			else {
 				if (!this->empty()) {
@@ -733,6 +733,7 @@ namespace LinBox
 
 		FastMaxQRationalReconstruction(const Ring& Z) :
 			FastRationalReconstruction<Ring>(Z), _intRing(Z)
+			,c(0)
 		{}
 
 		bool reconstructRational(Element& a, Element& b, const Element& x, const Element& m) const
@@ -743,8 +744,8 @@ namespace LinBox
 
 		bool reconstructRational(Element& a, Element& b, const Element& x, const Element& m, const Element& a_bound) const
 		{
-			bool res= false;
-			return res = FastRationalReconstruction<Ring>::reconstructRational(a,b,x,m,a_bound);
+			// bool res= false;
+			return /*  res = */ FastRationalReconstruction<Ring>::reconstructRational(a,b,x,m,a_bound);
 		}
 
 	protected:
@@ -795,13 +796,13 @@ namespace LinBox
 			d = maxQ.a;
 
 			//Element T = m.bitsize();int c = 5;
-			if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+			if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
 			else return false;
 		}
 
 		bool classicQMaxEEA(Element& ai, Element& bi, Element& ci, Element& di, const Element& r0, const Element& r1,const Element& powh, myQueue<Ring >&  queueMax, QMatrix<Ring>& maxQ) const
 		{
-			if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+			if (maxQ.q.bitsize() > T.bitsize() + (size_t) c) return true;
 			Element ri, rinext;
 			ri = r0; rinext = r1;
 			ai =di = 1;
@@ -820,7 +821,7 @@ namespace LinBox
 				if (queueMax.pushpop(top, newQ)) {
 					if (maxQ.q < top.q) {
 						maxQ = top;
-						if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+						if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
 					}
 				}
 
@@ -865,7 +866,7 @@ namespace LinBox
 				 const Element& m, const size_t d, const Element& n,
 				 const Element& powh, const size_t& h, myQueue<Ring >&  queueMax, QMatrix<Ring>& maxQ) const
 		{
-			if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+			if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
 			ai=Element(1);
 			di=Element(1);
 			bi=Element(0);
@@ -882,7 +883,7 @@ namespace LinBox
 				if (queueMax.pushpop(top, newQ)) {
 					if (maxQ.q < top.q) {
 						maxQ = top;
-						if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+						if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
 					}
 				}
 				return true;
@@ -911,7 +912,7 @@ namespace LinBox
 					if (queueMax.pushpop(top, newQ)) {
 						if (maxQ.q < top.q) {
 							maxQ = top;
-							if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+							if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
 						}
 					}
 
@@ -934,7 +935,7 @@ namespace LinBox
 					if (queueMax.pushpop(top, newQ)) {
 						if (maxQ.q < top.q) {
 							maxQ = top;
-							if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+							if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
 						}
 					}
 				}
@@ -960,14 +961,14 @@ namespace LinBox
 				aistar=distar=1;
 				bistar=cistar=0;
 
-				Element mstar = m >> (long unsigned int) lambda;
-				Element nstar = n >> (long unsigned int) lambda;
+				Element mstar = m >> (uint64_t) lambda;
+				Element nstar = n >> (uint64_t) lambda;
 
 				size_t log_mstar = 2*h+1;
 
 				queueMax._maxSize +=2;
 				if (nstar > 0) if (!fastQMaxEEA(aistar, bistar, cistar, distar, mstar, log_mstar,nstar, powh, h, queueMax, maxQ)) return false;
-				if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+				if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
 				if (queueMax._size > 1) {
 					queueMax.pop_back();
 					QMatrix<Ring> Q_i_2 (queueMax.back());
@@ -1016,14 +1017,13 @@ namespace LinBox
 				this->powtwo(sqrth, logsqrth);
 
 				if (!fastQMaxEEA(a1,b1,c1,d1,m,d,n,sqrth, logsqrth, queueMax, maxQ)) return false;
-				if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+				if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
 
 				ai = a1; bi = b1; ci=c1; di = d1;
 
 				Element ri = cur_ri;
 				Element rinext = cur_rinext;
 
-				size_t log_m;
 
 				myQueue<Ring> queueTmp (queueMax._maxSize);
 				QMatrix<Ring> maxQTmp(_intRing);
@@ -1034,10 +1034,11 @@ namespace LinBox
 					if (queueMax.pushpop(top, newQ)) {
 						if (maxQ.q < top.q) {
 							maxQ = top;
-							if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+							if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
 						}
 					}
 
+				size_t log_m;
 					log_m = rinext.bitsize()-1;
 					Element m2, n2;
 					m2 = rinext;
@@ -1062,7 +1063,7 @@ namespace LinBox
 					if (n2 >0) {
 						if (a1 < powh) {
 							if (!fastQMaxEEA(a2,b2,c2,d2,m2,log_m,n2,
-									 this->powtwo(sqrth,_k), _k, queueTmp,maxQTmp))
+									 this->powtwo(sqrth,(size_t)_k), (size_t)_k, queueTmp,maxQTmp))
 								return false;
 						}
 						else {
@@ -1137,7 +1138,7 @@ namespace LinBox
 				if (maxQ.q < maxQTmp.q) {
 					maxQTmp.leftmultiply(Q_i);
 					maxQ = maxQTmp;
-					if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+					if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
 				}
 				int K=0;
 				QMatrix<Ring > Q(_intRing);
@@ -1171,7 +1172,7 @@ namespace LinBox
 						if (queueMax.pushpop(top, Q)) {
 							if (maxQ.q < top.q) {
 								maxQ = top;
-								if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+								if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
 							}
 						}
 					}
@@ -1213,7 +1214,7 @@ namespace LinBox
 			}
 
 			Element ainext, binext, cinext,dinext;
-			ainext=dinext=1;
+			dinext=1;
 			binext=cinext=0;
 			ainext = cur_ainext;
 			int K=-1;
@@ -1234,7 +1235,7 @@ namespace LinBox
 					if (queueMax.pushpop(top, Q)) {
 						if (maxQ.q < top.q) {
 							maxQ = top;
-							if (maxQ.q.bitsize() > T.bitsize() + c) return true;
+							if (maxQ.q.bitsize() > T.bitsize() + (size_t)c) return true;
 						}
 					}
 
diff --git a/linbox/algorithms/gauss.h b/linbox/algorithms/gauss.h
index c853e2c..c1bad75 100644
--- a/linbox/algorithms/gauss.h
+++ b/linbox/algorithms/gauss.h
@@ -12,20 +12,20 @@
  * Move function definitions to gauss.inl
  * -----------------------------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -46,15 +46,14 @@
 #include "linbox/util/commentator.h"
 #include "linbox/field/archetype.h"
 #include "linbox/field/gf2.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/matrix/sparse.h"
-#include "linbox/matrix/matrix-domain.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/matrix/archetype.h"
 #include "linbox/solutions/methods.h"
 
 /** @file algorithms/gauss.h
  * @brief  Gauss elimination and applications for sparse matrices.
  * Rank, nullspace, solve...
+ * @warning this codes expects SparseSeq matrices
  */
 
 namespace LinBox
@@ -73,7 +72,7 @@ namespace LinBox
 		typedef typename Field::Element Element;
 
 	private:
-		const Field         &_field;
+		const Field         *_field;
 
 	public:
 
@@ -81,7 +80,7 @@ namespace LinBox
 		 * over which to perform computations
 		 */
 		GaussDomain (const Field &F) :
-			_field (F)
+			_field (&F)
 		{}
 
 		//Copy constructor
@@ -92,7 +91,7 @@ namespace LinBox
 
 		/** accessor for the field of computation
 		*/
-		const Field &field () const { return _field; }
+		const Field &field () const { return *_field; }
 
 		/** @name rank
 		  Callers of the different rank routines\\
@@ -182,6 +181,16 @@ namespace LinBox
 				      unsigned long Ni,
 				      unsigned long Nj) const;
 
+		template <class Matrix, class Perm>
+		unsigned long& DenseQLUPin(unsigned long &rank,
+				      Element& determinant,
+				      std::deque<std::pair<size_t,size_t> > &invQ,
+				      Matrix	    &L,
+				      Matrix        &U,
+				      Perm	    &P,
+				      unsigned long Ni,
+				      unsigned long Nj) const;
+
 		template <class Matrix, class Perm, class Vector1, class Vector2>
 		Vector1& solve(Vector1& x, Vector1& w, unsigned long rank, const Perm& Q, const Matrix& L, const Matrix& U, const Perm& P, const Vector2& b)  const;
 
@@ -348,8 +357,32 @@ Using : FindPivot and LU
 		template <class Vector>
 		void FindPivot (Vector &lignepivot, unsigned long &k, long &indpermut) const;
 
+		template <class Matrix, class Perm>
+		unsigned long& SparseContinuation(unsigned long &rank,
+				      Element& determinant,
+				      std::deque<std::pair<size_t,size_t> > &invQ,
+				      Matrix	    &L,
+				      Matrix        &U,
+				      Perm	    &P,
+				      unsigned long Ni,
+				      unsigned long Nj) const;
+
+        
+		template <class Matrix, class Perm, bool hasFFLAS>
+        struct Continuation {
+            unsigned long& operator()(
+                unsigned long &rank,
+                Element& determinant,
+                std::deque<std::pair<size_t,size_t> > &invQ,
+                Matrix	    &L,
+                Matrix        &U,
+                Perm	    &P,
+                unsigned long Ni,
+                unsigned long Nj, bool) const;
+        };
 	};
 
+
 } // namespace LinBox
 
 #include "linbox/algorithms/gauss/gauss.inl"
diff --git a/linbox/algorithms/gauss/Makefile.in b/linbox/algorithms/gauss/Makefile.in
deleted file mode 100644
index 86f1b94..0000000
--- a/linbox/algorithms/gauss/Makefile.in
+++ /dev/null
@@ -1,585 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-#  ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/algorithms/gauss
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/algorithms/gauss
-pkgincludesub_HEADERS = \
-    gauss.inl                   \
-    gauss-det.inl               \
-    gauss-rank.inl              \
-    gauss-solve.inl             \
-    gauss-nullspace.inl         \
-    gauss-elim.inl              \
-    gauss-pivot.inl             \
-    gauss-gf2.inl               \
-    gauss-elim-gf2.inl          \
-    gauss-rank-gf2.inl          \
-    gauss-pivot-gf2.inl         \
-    gauss-solve-gf2.inl
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/algorithms/gauss/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps linbox/algorithms/gauss/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
-	done
-
-uninstall-pkgincludesubHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
-	for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool ctags distclean distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-pkgincludesubHEADERS install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/algorithms/gauss/gauss-elim-gf2.inl b/linbox/algorithms/gauss/gauss-elim-gf2.inl
index abd99b5..91c913c 100644
--- a/linbox/algorithms/gauss/gauss-elim-gf2.inl
+++ b/linbox/algorithms/gauss/gauss-elim-gf2.inl
@@ -3,20 +3,20 @@
  *
  * Time-stamp: <21 Jan 10 15:08:59 Jean-Guillaume.Dumas at imag.fr>
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -60,7 +60,7 @@ namespace LinBox
 						if ( static_cast<long>(*pin_it) != indpermut) {
 							--pin_it;
 							// Only k there
-							*kin_it = indpermut;
+							*kin_it = (size_t)indpermut;
 							typename Vector::value_type etmp = *kin_it;
 							typename Vector::iterator current = kin_it;
 							typename Vector::iterator next = kin_it; ++next;
@@ -72,7 +72,7 @@ namespace LinBox
 					else {
 						--pin_it;
 						// Only k there
-						*kin_it = indpermut;
+						*kin_it = (size_t)indpermut;
 						typename Vector::value_type etmp = *kin_it;
 						typename Vector::iterator current = kin_it;
 						typename Vector::iterator next = kin_it; ++next;
@@ -142,26 +142,26 @@ namespace LinBox
 			unsigned long j_head = 0;
 
 			for (; j_head < nj; ++j_head) {
-				if (static_cast<long>(lignecourante[j_head]) >= indpermut) break;
+				if (static_cast<long>(lignecourante[(size_t)j_head]) >= indpermut) break;
 #if 0
 				std::cerr << "ELIMINATE, j_head: " << j_head << std::endl;
 #endif
 			}
 
 			if (j_head < nj) {
-				if (static_cast<long>(lignecourante[j_head]) == indpermut) {
+				if (static_cast<long>(lignecourante[(size_t)j_head]) == indpermut) {
 					// -------------------------------------------
 					// Permutation
 					if ( indpermut != static_cast<long>(k)) {
 						if (lignecourante[0] != k) {
 							// zero <--> non zero
-							E tmp = lignecourante[j_head];
+							E tmp = lignecourante[(size_t)j_head];
 							--columns[tmp];
 							++columns[k];
 							tmp = k;
 
-							for (long l = j_head; l > 0; l--)
-								lignecourante[l] = lignecourante[l-1];
+							for (long l = (long)j_head; l > 0; l--)
+								lignecourante[(size_t)l] = lignecourante[(size_t)l-1];
 
 							lignecourante[0] = tmp;
 						}
@@ -179,15 +179,14 @@ namespace LinBox
 
 					// A[i,k] <-- - A[i,k] / A[k,k]
 					headpivot = true;
-					--columns[lignecourante[j_head] ];
+					--columns[lignecourante[(size_t)j_head] ];
 
 					// if A[k,j]=0, then A[i,j] <-- A[i,j]
 					while (j < j_head) {
-						construit[j] = lignecourante[j];
+						construit[j] = lignecourante[(size_t)j];
 						++j;
 					}
 
-					unsigned long j_piv;
 
 					unsigned long l = 0;
 
@@ -196,15 +195,16 @@ namespace LinBox
 
 					// for all j such that (j>k) and A[k,j]!=0
 					while (l < npiv) {
+					unsigned long j_piv;
 						j_piv = lignepivot[l];
 
 						// if A[k,j]=0, then A[i,j] <-- A[i,j]
-						while ((m < nj) && (lignecourante[m] < j_piv))
-							construit[j++] = lignecourante[m++];
+						while ((m < nj) && (lignecourante[(size_t)m] < j_piv))
+							construit[j++] = lignecourante[(size_t)m++];
 
 						// if A[i,j]!=0, then A[i,j] <-- A[i,j] - A[i,k]*A[k,j]
-						if ((m < nj) && (lignecourante[m] == j_piv)) {
-							--columns[lignecourante[m++]];
+						if ((m < nj) && (lignecourante[(size_t)m] == j_piv)) {
+							--columns[lignecourante[(size_t)m++]];
 						}
 						else {
 							++columns[j_piv];
@@ -216,7 +216,7 @@ namespace LinBox
 
 					// if A[k,j]=0, then A[i,j] <-- A[i,j]
 					while (m<nj)
-						construit[j++] = lignecourante[m++];
+						construit[j++] = lignecourante[(size_t)m++];
 
 					construit.resize (j);
 					lignecourante = construit;
@@ -239,18 +239,18 @@ namespace LinBox
 							unsigned long l = 0;
 
 							for (; l < nj; ++l)
-								if (lignecourante[l] >= k) break;
+								if (lignecourante[(size_t)l] >= k) break;
 
-							if ((l < nj) && (lignecourante[l] == k))  {
+							if ((l < nj) && (lignecourante[(size_t)l] == k))  {
 								// non zero <--> zero
-								E tmp = lignecourante[l];
+								E tmp ; // = (E)lignecourante[(size_t)l];
 								--columns[k];
-								++columns[indpermut];
-								tmp = indpermut;
+								++columns[(size_t)indpermut];
+								tmp = (E)indpermut;
 
 								unsigned long bjh = j_head-1;
 								for (; l < bjh; ++l)
-									lignecourante[l] = lignecourante[l + 1];
+									lignecourante[(size_t)l] = lignecourante[(size_t)l + 1];
 
 								lignecourante[bjh] = tmp;
 							} // else // zero <--> zero
@@ -274,18 +274,18 @@ namespace LinBox
 					unsigned long l = 0;
 
 					for (; l < nj; ++l)
-						if (lignecourante[l] >= k) break;
+						if (lignecourante[(size_t)l] >= k) break;
 
-					if ((l < nj) && (lignecourante[l] == k))  {
+					if ((l < nj) && (lignecourante[(size_t)l] == k))  {
 						// non zero <--> zero
-						E tmp = lignecourante[l];
+						E tmp ; // = (E) lignecourante[(size_t)l];
 						--columns[k];
-						++columns[indpermut];
-						tmp = indpermut;
+						++columns[(size_t)indpermut];
+						tmp = (E) indpermut;
 
 						unsigned long bjh = nj - 1;
 						for (; l < bjh; ++l)
-							lignecourante[l] = lignecourante[l + 1];
+							lignecourante[(size_t)l] = lignecourante[(size_t)l + 1];
 
 						lignecourante[bjh] = tmp;
 					} // else
@@ -323,11 +323,10 @@ namespace LinBox
 #endif // __LINBOX_gauss_elim_gf2_INL
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/gauss/gauss-elim.inl b/linbox/algorithms/gauss/gauss-elim.inl
index 4f11f9d..6ffac37 100644
--- a/linbox/algorithms/gauss/gauss-elim.inl
+++ b/linbox/algorithms/gauss/gauss-elim.inl
@@ -3,20 +3,20 @@
  *
  * Time-stamp: <21 Jan 10 15:06:11 Jean-Guillaume.Dumas at imag.fr>
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -127,6 +127,7 @@ namespace LinBox
 	{
 
 		typedef typename Vector::value_type E;
+		typedef typename E::first_type E1;
 
 		unsigned long k = indcol - 1;
 		unsigned long nj = lignecourante.size () ;
@@ -148,30 +149,30 @@ namespace LinBox
 			unsigned long j_head = 0;
 
 			for (; j_head < nj; ++j_head) {
-				if (static_cast<long>(lignecourante[j_head].first) >= indpermut) break;
+				if (static_cast<long>(lignecourante[(size_t)j_head].first) >= indpermut) break;
 #if 0
 				std::cerr << "ELIMINATE, j_head: " << j_head << std::endl;
 #endif
 				}
 
 			if (j_head < nj) {
-				if (static_cast<long>(lignecourante[j_head].first) == indpermut) {
+				if (static_cast<long>(lignecourante[(size_t)j_head].first) == indpermut) {
 					// -------------------------------------------
 					// Permutation
 					if ( indpermut != static_cast<long>(k)) {
 						if (lignecourante[0].first == k) {
 							// non zero  <--> non zero
-							std::swap( lignecourante[0].second, lignecourante[j_head].second);
+							std::swap( lignecourante[0].second, lignecourante[(size_t)j_head].second);
 						}
 						else {
 							// zero <--> non zero
-							E tmp = lignecourante[j_head];
-							--columns[tmp.first];
-							++columns[k];
-							tmp.first = (unsigned)k;
+							E tmp = lignecourante[(size_t)j_head];
+							--columns[(size_t)tmp.first];
+							++columns[(size_t)k];
+							tmp.first = (E1)k;
 
 							for (long l = (long)j_head; l > 0; --l)
-								lignecourante[l] = lignecourante[l-1];
+								lignecourante[(size_t)l] = lignecourante[(size_t)l-1];
 
 							lignecourante[0] = tmp;
 						}
@@ -190,18 +191,17 @@ namespace LinBox
 
 					// A[i,k] <-- - A[i,k] / A[k,k]
 					Element headcoeff;
-					_field.divin (_field.neg (headcoeff, lignecourante[j_head].second),
+					field().divin (field().neg (headcoeff, lignecourante[(size_t)j_head].second),
 						  lignepivot[0].second);
 
-					--columns[lignecourante[j_head].first];
+					--columns[lignecourante[(size_t)j_head].first];
 
 					// if A[k,j]=0, then A[i,j] <-- A[i,j]
 					while (j < j_head) {
-						construit[j] = lignecourante[j];
+						construit[j] = lignecourante[(size_t)j];
 						j++;
 					}
 
-					unsigned long j_piv;
 
 					unsigned long l = 0;
 
@@ -210,6 +210,7 @@ namespace LinBox
 
 					// for all j such that (j>k) and A[k,j]!=0
 					while (l < npiv) {
+					unsigned long j_piv;
 						j_piv = lignepivot[l].first;
 
 						// if A[k,j]=0, then A[i,j] <-- A[i,j]
@@ -220,11 +221,11 @@ namespace LinBox
 						if ((m < nj) && (lignecourante[m].first == j_piv)) {
 							Element tmp;
 
-							_field.axpy (tmp, headcoeff, lignepivot[l].second,
+							field().axpy (tmp, headcoeff, lignepivot[l].second,
 								 lignecourante[m].second);
 
-							if (! _field.isZero (tmp)) {
-								_field.assign (lignecourante[m].second, tmp);
+							if (! field().isZero (tmp)) {
+								field().assign (lignecourante[m].second, tmp);
 								construit[j++] = lignecourante[m++];
 							}
 							else
@@ -233,9 +234,9 @@ namespace LinBox
 						else {
 							Element tmp;
 
-							_field.mul (tmp, headcoeff, lignepivot[l].second);
+							field().mul (tmp, headcoeff, lignepivot[l].second);
 
-							// if (! _field.isZero (tmp)) {
+							// if (! field().isZero (tmp)) {
 							++columns[j_piv];
 							construit[j++] = E ((unsigned)j_piv, tmp);
 							// }
@@ -272,18 +273,18 @@ namespace LinBox
 							unsigned long l = 0;
 
 							for (; l < nj; ++l)
-								if (lignecourante[l].first >= k) break;
+								if (lignecourante[(size_t)l].first >= k) break;
 
-							if ((l < nj) && (lignecourante[l].first == k))  {
+							if ((l < nj) && (lignecourante[(size_t)l].first == k))  {
 								// non zero <--> zero
-								E tmp = lignecourante[l];
+								E tmp = lignecourante[(size_t)l];
 								--columns[k];
-								++columns[indpermut];
-								tmp.first = (unsigned)indpermut;
+								++columns[(size_t)indpermut];
+								tmp.first = (E1)indpermut;
 
 								unsigned long bjh = j_head-1;
 								for (; l < bjh; ++l)
-									lignecourante[l] = lignecourante[l + 1];
+									lignecourante[(size_t)l] = lignecourante[(size_t)l + 1];
 
 								lignecourante[bjh] = tmp;
 							} // else // zero <--> zero
@@ -307,18 +308,18 @@ namespace LinBox
 					unsigned long l = 0;
 
 					for (; l < nj; ++l)
-						if (lignecourante[l].first >= k) break;
+						if (lignecourante[(size_t)l].first >= k) break;
 
-					if ((l < nj) && (lignecourante[l].first == k))  {
+					if ((l < nj) && (lignecourante[(size_t)l].first == k))  {
 						// non zero <--> zero
-						E tmp = lignecourante[l];
+						E tmp = lignecourante[(size_t)l];
 						--columns[k];
-						++columns[indpermut];
-						tmp.first = (unsigned)indpermut;
+						++columns[(size_t)indpermut];
+						tmp.first = (E1)indpermut;
 
 						unsigned long bjh = nj - 1;
 						for (; l < bjh; ++l)
-							lignecourante[l] = lignecourante[l + 1];
+							lignecourante[(size_t)l] = lignecourante[(size_t)l + 1];
 
 						lignecourante[bjh] = tmp;
 					} // else
@@ -358,6 +359,7 @@ namespace LinBox
 	{
 
 		typedef typename Vector::value_type E;
+		typedef typename E::first_type E1;
 
 		unsigned long k = indcol - 1;
 		unsigned long nj = lignecourante.size () ;
@@ -379,30 +381,30 @@ namespace LinBox
 			unsigned long j_head = 0;
 
 			for (; j_head < nj; ++j_head) {
-				if (static_cast<long>(lignecourante[j_head].first) >= indpermut) break;
+				if (static_cast<long>(lignecourante[(size_t)j_head].first) >= indpermut) break;
 #if 0
 				std::cerr << "ELIMINATE, j_head: " << j_head << std::endl;
 #endif
 				}
 
 			if (j_head < nj) {
-				if (static_cast<long>(lignecourante[j_head].first) == indpermut) {
+				if (static_cast<long>(lignecourante[(size_t)j_head].first) == indpermut) {
 					// -------------------------------------------
 					// Permutation
 					if ( indpermut != static_cast<long>(k)) {
 						if (lignecourante[0].first == k) {
 							// non zero  <--> non zero
-							std::swap( lignecourante[0].second, lignecourante[j_head].second);
+							std::swap( lignecourante[0].second, lignecourante[(size_t)j_head].second);
 						}
 						else {
 							// zero <--> non zero
-							E tmp = lignecourante[j_head];
+							E tmp = lignecourante[(size_t)j_head];
 							--columns[tmp.first];
 							++columns[k];
-							tmp.first = (unsigned)k;
+							tmp.first = (E1)k;
 
 							for (long l = (long)j_head; l > 0; --l)
-								lignecourante[l] = lignecourante[l-1];
+								lignecourante[(size_t)l] = lignecourante[(size_t)l-1];
 
 							lignecourante[0] = tmp;
 						}
@@ -420,21 +422,20 @@ namespace LinBox
 
 					// A[i,k] <-- - A[i,k] / A[k,k]
 					Element headcoeff;
-					_field.div( headpivot, lignecourante[j_head].second,
+					field().div( headpivot, lignecourante[(size_t)j_head].second,
 						lignepivot[0].second);
-					_field.neg(headcoeff, headpivot);
-					//                     _field.divin (_field.neg (headcoeff, lignecourante[j_head].second),
+					field().neg(headcoeff, headpivot);
+					//                     field().divin (field().neg (headcoeff, lignecourante[(size_t)j_head].second),
 					//                               lignepivot[0].second);
 
-					--columns[lignecourante[j_head].first];
+					--columns[lignecourante[(size_t)j_head].first];
 
 					// if A[k,j]=0, then A[i,j] <-- A[i,j]
 					while (j < j_head) {
-						construit[j] = lignecourante[j];
+						construit[j] = lignecourante[(size_t)j];
 						j++;
 					}
 
-					unsigned long j_piv;
 
 					unsigned long l = 0;
 
@@ -443,6 +444,7 @@ namespace LinBox
 
 					// for all j such that (j>k) and A[k,j]!=0
 					while (l < npiv) {
+						unsigned long j_piv;
 						j_piv = lignepivot[l].first;
 
 						// if A[k,j]=0, then A[i,j] <-- A[i,j]
@@ -453,11 +455,11 @@ namespace LinBox
 						if ((m < nj) && (lignecourante[m].first == j_piv)) {
 							Element tmp;
 
-							_field.axpy (tmp, headcoeff, lignepivot[l].second,
+							field().axpy (tmp, headcoeff, lignepivot[l].second,
 								 lignecourante[m].second);
 
-							if (! _field.isZero (tmp)) {
-								_field.assign (lignecourante[m].second, tmp);
+							if (! field().isZero (tmp)) {
+								field().assign (lignecourante[m].second, tmp);
 								construit[j++] = lignecourante[m++];
 							}
 							else
@@ -466,9 +468,9 @@ namespace LinBox
 						else {
 							Element tmp;
 
-							_field.mul (tmp, headcoeff, lignepivot[l].second);
+							field().mul (tmp, headcoeff, lignepivot[l].second);
 
-							// if (! _field.isZero (tmp)) {
+							// if (! field().isZero (tmp)) {
 							++columns[j_piv];
 							construit[j++] = E ((unsigned)j_piv, tmp);
 							// }
@@ -505,18 +507,18 @@ namespace LinBox
 							unsigned long l = 0;
 
 							for (; l < nj; ++l)
-								if (lignecourante[l].first >= k) break;
+								if (lignecourante[(size_t)l].first >= k) break;
 
-							if ((l < nj) && (lignecourante[l].first == k))  {
+							if ((l < nj) && (lignecourante[(size_t)l].first == k))  {
 								// non zero <--> zero
-								E tmp = lignecourante[l];
+								E tmp = lignecourante[(size_t)l];
 								--columns[k];
-								++columns[indpermut];
-								tmp.first = (unsigned)indpermut;
+								++columns[(size_t)indpermut];
+								tmp.first = (E1)indpermut;
 
 								unsigned long bjh = j_head-1;
 								for (; l < bjh; ++l)
-									lignecourante[l] = lignecourante[l + 1];
+									lignecourante[(size_t)l] = lignecourante[(size_t)l + 1];
 
 								lignecourante[bjh] = tmp;
 							} // else // zero <--> zero
@@ -540,18 +542,18 @@ namespace LinBox
 					unsigned long l = 0;
 
 					for (; l < nj; ++l)
-						if (lignecourante[l].first >= k) break;
+						if (lignecourante[(size_t)l].first >= k) break;
 
-					if ((l < nj) && (lignecourante[l].first == k))  {
+					if ((l < nj) && (lignecourante[(size_t)l].first == k))  {
 						// non zero <--> zero
-						E tmp = lignecourante[l];
+						E tmp = lignecourante[(size_t)l];
 						--columns[k];
-						++columns[indpermut];
-						tmp.first = (unsigned)indpermut;
+						++columns[(size_t)indpermut];
+						tmp.first = (E1)indpermut;
 
 						unsigned long bjh = nj - 1;
 						for (; l < bjh; ++l)
-							lignecourante[l] = lignecourante[l + 1];
+							lignecourante[(size_t)l] = lignecourante[(size_t)l + 1];
 
 						lignecourante[bjh] = tmp;
 					} // else
@@ -587,6 +589,7 @@ namespace LinBox
 					const long &indpermut) const
 	{
 		typedef typename Vector::value_type E;
+		typedef typename E::first_type E1;
 
 		unsigned long k = indcol - 1;
 		unsigned long nj = lignecourante.size () ;
@@ -595,23 +598,23 @@ namespace LinBox
 			unsigned long j_head = 0;
 
 			for (; j_head < nj; ++j_head)
-				if (static_cast<long>(lignecourante[j_head].first) >= indpermut) break;
+				if (static_cast<long>(lignecourante[(size_t)j_head].first) >= indpermut) break;
 
 			if (j_head < nj) {
-				if (static_cast<long>(lignecourante[j_head].first) == indpermut) {
+				if (static_cast<long>(lignecourante[(size_t)j_head].first) == indpermut) {
 					// -------------------------------------------
 					// Permutation
 					if (indpermut != static_cast<long>(k)) {
 						if (lignecourante[0].first == k) {
 							// non zero  <--> non zero
-							std::swap( lignecourante[0].second, lignecourante[j_head].second);
+							std::swap( lignecourante[0].second, lignecourante[(size_t)j_head].second);
 						}
 						else {
 							// zero <--> non zero
-							E tmp = lignecourante[j_head];
-							tmp.first = k;
+							E tmp = lignecourante[(size_t)j_head];
+							tmp.first = (E1)k;
 							for (long l = (long)j_head; l > 0; --l)
-								lignecourante[l] = lignecourante[l-1];
+								lignecourante[(size_t)l] = lignecourante[(size_t)l-1];
 							lignecourante[0] = tmp;
 						}
 
@@ -630,16 +633,15 @@ namespace LinBox
 					// A[i,k] <-- - A[i,k] / A[k,k]
 
 					Element headcoeff;
-					_field.divin (_field.neg (headcoeff, lignecourante[j_head].second),
+					field().divin (field().neg (headcoeff, lignecourante[(size_t)j_head].second),
 						  lignepivot[0].second);
 
 					// if A[k,j]=0, then A[i,j] <-- A[i,j]
 					while (j < j_head) {
-						construit[j] = lignecourante[j];
+						construit[j] = lignecourante[(size_t)j];
 						j++;
 					}
 
-					unsigned long j_piv;
 					unsigned long l = 0;
 
 					for (; l < npiv; l++)
@@ -647,6 +649,7 @@ namespace LinBox
 
 					// for all j such that (j>k) and A[k,j]!=0
 					while (l < npiv) {
+					unsigned long j_piv;
 						j_piv = lignepivot[l].first;
 
 						// if A[k,j]=0, then A[i,j] <-- A[i,j]
@@ -656,11 +659,11 @@ namespace LinBox
 						// if A[i,j]!=0, then A[i,j] <-- A[i,j] - A[i,k]*A[k,j]
 						if ((m < nj) && (lignecourante[m].first == j_piv)) {
 							Element tmp;
-							_field.axpy (tmp, headcoeff, lignepivot[l].second,
+							field().axpy (tmp, headcoeff, lignepivot[l].second,
 								 lignecourante[m].second);
 
-							if (! _field.isZero (tmp)) {
-								_field.assign (lignecourante[m].second, tmp);
+							if (! field().isZero (tmp)) {
+								field().assign (lignecourante[m].second, tmp);
 								construit[j++] = lignecourante[m++];
 							}
 							else
@@ -669,8 +672,8 @@ namespace LinBox
 						}
 						else {
 							Element tmp;
-							_field.mul (tmp, headcoeff, lignepivot[l].second);
-							// if (! _field.isZero (tmp))
+							field().mul (tmp, headcoeff, lignepivot[l].second);
+							// if (! field().isZero (tmp))
 							construit[j++] = E (j_piv, tmp);
 							// else
 							// std::cerr << "NEVER HAPPENED" << std::endl;
@@ -694,16 +697,16 @@ namespace LinBox
 							unsigned long l = 0;
 
 							for (; l < nj; ++l)
-								if (lignecourante[l].first >= k) break;
+								if (lignecourante[(size_t)l].first >= k) break;
 
-							if ((l < nj) && (lignecourante[l].first == k))  {
+							if ((l < nj) && (lignecourante[(size_t)l].first == k))  {
 								// non zero <--> zero
-								E tmp = lignecourante[l];
-								tmp.first = indpermut;
+								E tmp = lignecourante[(size_t)l];
+								tmp.first = (E1) indpermut;
 
 								unsigned long bjh = j_head -1;
 								for (; l < bjh; l++)
-									lignecourante[l] = lignecourante[l + 1];
+									lignecourante[(size_t)l] = lignecourante[(size_t)l + 1];
 
 								lignecourante[bjh] = tmp;
 							} // else // zero <--> zero
@@ -728,16 +731,16 @@ namespace LinBox
 					unsigned long l = 0;
 
 					for (; l < nj; ++l)
-						if (lignecourante[l].first >= k) break;
+						if (lignecourante[(size_t)l].first >= k) break;
 
-					if ((l < nj) && (lignecourante[l].first == k))  {
+					if ((l < nj) && (lignecourante[(size_t)l].first == k))  {
 						// non zero <--> zero
-						E tmp = lignecourante[l];
-						tmp.first = indpermut;
+						E tmp = lignecourante[(size_t)l];
+						tmp.first = (E1) indpermut;
 
 						unsigned long bjh = nj - 1;
 						for (; l < bjh; l++)
-							lignecourante[l] = lignecourante[l + 1];
+							lignecourante[(size_t)l] = lignecourante[(size_t)l + 1];
 
 						lignecourante[bjh] = tmp;
 					} // else
@@ -772,49 +775,49 @@ void GaussDomain<_Field>::permute (Vector              &lignecourante,
 	// precondition indpermut != k
 	unsigned long nj = lignecourante.size () ;
 	if (nj > 0) {
-		Element tmp; _field.init(tmp);
+		Element tmp; field().init(tmp);
 		unsigned long kin = 0;
 		for (; kin < nj; ++kin)
 			if (static_cast<long>(lignecourante[kin].first) >= k) break;
 		if (kin < nj) {
 			unsigned long pin = kin;
 			for (; pin < nj; ++pin)
-				if (static_cast<long>(lignecourante[pin].first) >= indpermut) break;
+				if (static_cast<long>(lignecourante[(size_t)pin].first) >= indpermut) break;
 			if ( static_cast<long>(lignecourante[kin].first) == k) {
 				if (pin < nj) {
-					if ( static_cast<long>(lignecourante[pin].first) == indpermut) {
+					if ( static_cast<long>(lignecourante[(size_t)pin].first) == indpermut) {
 						// Both there
-						std::swap( lignecourante[kin].second, lignecourante[pin].second);
+						std::swap( lignecourante[kin].second, lignecourante[(size_t)pin].second);
 					}
 					else {
 						// Only k there
-						lignecourante[kin].first = indpermut;
+						lignecourante[kin].first = (E1)indpermut;
 						typename Vector::value_type etmp = lignecourante[kin];
 						--pin;
 						for(size_t i=kin; i<pin; ++i)
-							lignecourante[i] = lignecourante[i+1];
-						lignecourante[pin] = etmp;
+							lignecourante[(size_t)i] = lignecourante[(size_t)i+1];
+						lignecourante[(size_t)pin] = etmp;
 					}
 				}
 				else {
 					pin = nj-1;
 					// Only k there
-					lignecourante[kin].first = indpermut;
+					lignecourante[kin].irst = indpermut;
 					typename Vector::value_type etmp = lignecourante[kin];
 					for(size_t i=kin; i<pin; ++i)
-						lignecourante[i] = lignecourante[i+1];
-					lignecourante[pin] = etmp;
+						lignecourante[(size_t)i] = lignecourante[(size_t)i+1];
+					lignecourante[(size_t)pin] = etmp;
 
 				}
 			}
 			else {
 				if (pin < nj) {
-					if ( static_cast<long>(lignecourante[pin].first) == indpermut) {
+					if ( static_cast<long>(lignecourante[(size_t)pin].first) == indpermut) {
 						// Only indpermut there
-						lignecourante[pin].first = k;
-						typename Vector::value_type etmp = lignecourante[pin];
+						lignecourante[(size_t)pin].first = (E1)k;
+						typename Vector::value_type etmp = lignecourante[(size_t)pin];
 						for(size_t i = pin; i>kin; --i)
-							lignecourante[i] = lignecourante[i-1];
+							lignecourante[(size_t)i] = lignecourante[(size_t)i-1];
 						lignecourante[kin] = etmp;
 					} // else Nobody
 				} // else Nobody
diff --git a/linbox/algorithms/gauss/gauss-gf2.inl b/linbox/algorithms/gauss/gauss-gf2.inl
index 68320d3..9a63203 100644
--- a/linbox/algorithms/gauss/gauss-gf2.inl
+++ b/linbox/algorithms/gauss/gauss-gf2.inl
@@ -3,20 +3,20 @@
  *
  * Time-stamp: <15 Jun 10 16:20:16 Jean-Guillaume.Dumas at imag.fr>
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -76,9 +76,9 @@ namespace LinBox
 		// assignment of LigneA with the domain object
 		for (unsigned long jj = 0; jj < Ni; ++jj)
 			for (unsigned long k = 0; k < LigneA[jj].size (); k++)
-				++col_density[LigneA[jj][k]];
+				++col_density[LigneA[jj][(size_t)k]];
 
-		long last = Ni - 1;
+		long last = (long)Ni - 1;
 		long c;
 		Rank = 0;
 
@@ -104,7 +104,7 @@ namespace LinBox
 #ifdef __LINBOX_FILLIN__
 					long sl(0);
 					for (size_t l = 0; l < Ni; ++l)
-						sl += LigneA[l].size ();
+						sl += LigneA[(size_t)l].size ();
 
 					commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
 					<< "Fillin (" << Rank << "/" << Ni << ") = "
@@ -117,24 +117,25 @@ namespace LinBox
 
 			long l;
 			for(l = k; l < static_cast<long>(Ni); ++l) {
-				if ( (s = LigneA[l].size()) != 0 ) {
+				if ( (s = (long)LigneA[(size_t)l].size()) != 0 ) {
 					p = l;
 					break;
 				}
 			}
 
 			if (s) {
-				long sl;
 				// Row permutation for the sparsest row
-				for (; l < static_cast<long>(Ni); ++l)
-					if (((sl = LigneA[l].size ()) < s) && (sl)) {
+				for (; l < static_cast<long>(Ni); ++l) {
+				long sl;
+					if (((sl = (long)LigneA[(size_t)l].size ()) < s) && (sl)) {
 						s = sl;
 						p = l;
 					}
+					}
 
 				if (p != k) {
 					//                         std::cerr << "Permuting rows: " << k << " <--> " << p << std::endl;
-					std::swap( *LigneA_k, LigneA[p]);
+					std::swap( *LigneA_k, LigneA[(size_t)p]);
 				}
 
 
@@ -143,14 +144,14 @@ namespace LinBox
 				if (c != -1) {
 					long ll;
 					if ( c != (static_cast<long>(Rank)-1) ) {
-						P.permute(Rank-1,c);
+						P.permute(Rank-1,(size_t)c);
 						for (ll=0      ; ll < k ; ++ll)
-							permuteBinary( LigneA[ll], Rank, c);
+							permuteBinary( LigneA[(size_t)ll], Rank, c);
 					}
-					long npiv=LigneA_k->size();
+					long npiv=(long)LigneA_k->size();
 					for (ll = k+1; ll < static_cast<long>(Ni); ++ll) {
 						bool elim=false;
-						eliminateBinary (elim, LigneA[ll], *LigneA_k, Rank, c, npiv, col_density);
+						eliminateBinary (elim, LigneA[(size_t)ll], *LigneA_k, Rank, c, (size_t)npiv, col_density);
 					}
 				}
 
@@ -159,20 +160,20 @@ namespace LinBox
 				nbelem += LigneA_k->size ();
 #endif
 			}
-			// LigneA.write(rep << "U:= ", FORMAT_MAPLE) << std::endl;
+			// LigneA.write(rep << "U:= ", Tag::FileFormat::Maple) << std::endl;
 		}//for k
 
-		SparseFindPivotBinary ( LigneA[last], Rank, c, determinant);
+		SparseFindPivotBinary ( LigneA[(size_t)last], Rank, c, determinant);
 		if (c != -1) {
 			if ( c != (static_cast<long>(Rank)-1) ) {
-				P.permute(Rank-1,c);
+				P.permute(Rank-1,(size_t)c);
 				for (long ll=0      ; ll < last ; ++ll)
-					permuteBinary( LigneA[ll], Rank, c);
+					permuteBinary( LigneA[(size_t)ll], Rank, c);
 			}
 		}
 
 #ifdef __LINBOX_COUNT__
-		nbelem += LigneA[last].size ();
+		nbelem += LigneA[(size_t)last].size ();
 		commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
 		<< "Left elements : " << nbelem << std::endl;
 #endif
@@ -180,7 +181,7 @@ namespace LinBox
 #ifdef __LINBOX_FILLIN__
 		long sl(0);
 		for (size_t l=0; l < Ni; ++l)
-			sl += LigneA[l].size ();
+			sl += LigneA[(size_t)l].size ();
 
 		commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
 		<< "Fillin (" << Rank << "/" << Ni << ") = " << sl
@@ -195,7 +196,7 @@ namespace LinBox
 		<< "Determinant : " << determinant
 		<< " over GF (2)" << std::endl;
 
-		// LigneA.write(rep << "U:= ", FORMAT_MAPLE) << ':' << std::endl;
+		// LigneA.write(rep << "U:= ", Tag::FileFormat::Maple) << ':' << std::endl;
 
 		commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
 		<< "Rank : " << Rank
@@ -252,9 +253,9 @@ namespace LinBox
 		// assignment of LigneA with the domain object
 		for (unsigned long jj = 0; jj < Ni; ++jj)
 			for (unsigned long k = 0; k < LigneA[jj].size (); k++)
-				++col_density[LigneA[jj][k]];
+				++col_density[LigneA[jj][(size_t)k]];
 
-		long last = Ni - 1;
+		long last = (long)Ni - 1;
 		long c;
 		Rank = 0;
 
@@ -280,7 +281,7 @@ namespace LinBox
 #ifdef __LINBOX_FILLIN__
 					long sl(0);
 					for (size_t l = 0; l < Ni; ++l)
-						sl += LigneA[l].size ();
+						sl += LigneA[(size_t)l].size ();
 
 					commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
 					<< "Fillin (" << Rank << "/" << Ni << ") = "
@@ -293,26 +294,27 @@ namespace LinBox
 
 			long l;
 			for(l = k; l < static_cast<long>(Ni); ++l) {
-				if ( (s = LigneA[l].size()) ) {
+				if ( (s = (long)LigneA[(size_t)l].size()) ) {
 					p = l;
 					break;
 				}
 			}
 
 			if (s) {
-				long sl;
 				// Row permutation for the sparsest row
-				for (; l < static_cast<long>(Ni); ++l)
-					if (((sl = LigneA[l].size ()) < s) && (sl)) {
+				for (; l < static_cast<long>(Ni); ++l){
+				long sl;
+					if (((sl = (long) LigneA[(size_t)l].size ()) < s) && (sl)) {
 						s = sl;
 						p = l;
 					}
+					}
 
 				if (p != k) {
 					//                         std::cerr << "Permuting rows: " << k << " <--> " << p << std::endl;
-					invQ.push_front( std::pair<size_t,size_t>(k,p) );
-					std::swap( *LigneA_k, LigneA[p]);
-					std::swap( LigneL[k], LigneL[p]);
+					invQ.push_front( std::pair<size_t,size_t>((size_t)k,(size_t)p) );
+					std::swap( *LigneA_k, LigneA[(size_t)p]);
+					std::swap( LigneL[(size_t)k], LigneL[(size_t)p]);
 				}
 
 
@@ -321,15 +323,15 @@ namespace LinBox
 				if (c != -1) {
 					long ll;
 					if ( c != (static_cast<long>(Rank)-1) ) {
-						P.permute(Rank-1,c);
+						P.permute(Rank-1,(size_t)c);
 						for (ll=0      ; ll < k ; ++ll)
-							permuteBinary( LigneA[ll], Rank, c);
+							permuteBinary( LigneA[(size_t)ll], Rank, c);
 					}
-					long npiv=LigneA_k->size();
+					long npiv=(long)LigneA_k->size();
 					for (ll = k+1; ll < static_cast<long>(Ni); ++ll) {
 						E hc; hc=Rank-1; bool elim=false;
-						eliminateBinary (elim, LigneA[ll], *LigneA_k, Rank, c, npiv, col_density);
-						if(elim) LigneL[ll].push_back(hc);
+						eliminateBinary (elim, LigneA[(size_t)ll], *LigneA_k, Rank, c, (size_t)npiv, col_density);
+						if(elim) LigneL[(size_t)ll].push_back(hc);
 					}
 				}
 
@@ -338,24 +340,24 @@ namespace LinBox
 				nbelem += LigneA_k->size ();
 #endif
 			}
-			LigneL[k].push_back(k);
-			//  LigneL.write(rep << "L:= ", FORMAT_MAPLE) << std::endl;
-			//  LigneA.write(rep << "U:= ", FORMAT_MAPLE) << std::endl;
+			LigneL[(size_t)k].push_back((size_t)k);
+			//  LigneL.write(rep << "L:= ", Tag::FileFormat::Maple) << std::endl;
+			//  LigneA.write(rep << "U:= ", Tag::FileFormat::Maple) << std::endl;
 		}//for k
 
-		SparseFindPivotBinary ( LigneA[last], Rank, c, determinant);
+		SparseFindPivotBinary ( LigneA[(size_t)last], Rank, c, determinant);
 		if (c != -1) {
 			if ( c != (static_cast<long>(Rank)-1) ) {
-				P.permute(Rank-1,c);
+				P.permute(Rank-1,(size_t)c);
 				for (long ll=0      ; ll < last ; ++ll)
-					permuteBinary( LigneA[ll], Rank, c);
+					permuteBinary( LigneA[(size_t)ll], Rank, c);
 			}
 		}
 
-		LigneL[last].push_back(last);
+		LigneL[(size_t)last].push_back((size_t)last);
 
 #ifdef __LINBOX_COUNT__
-		nbelem += LigneA[last].size ();
+		nbelem += LigneA[(size_t)last].size ();
 		commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
 		<< "Left elements : " << nbelem << std::endl;
 #endif
@@ -363,7 +365,7 @@ namespace LinBox
 #ifdef __LINBOX_FILLIN__
 		long sl(0);
 		for (size_t l=0; l < Ni; ++l)
-			sl += LigneA[l].size ();
+			sl += LigneA[(size_t)l].size ();
 
 		commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
 		<< "Fillin (" << Rank << "/" << Ni << ") = " << sl
@@ -382,10 +384,10 @@ namespace LinBox
 			Q.permute( it->first, it->second );
 
 #if 0
-		Q.write(rep << "Q:= ", FORMAT_MAPLE) << ':' << std::endl;
-		LigneL.write(rep << "L:= ", FORMAT_MAPLE) << ':' << std::endl;
-		LigneA.write(rep << "U:= ", FORMAT_MAPLE) << ':' << std::endl;
-		P.write(rep << "P:= ", FORMAT_MAPLE) << ':' << std::endl;
+		Q.write(rep << "Q:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+		LigneL.write(rep << "L:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+		LigneA.write(rep << "U:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+		P.write(rep << "P:= ", Tag::FileFormat::Maple) << ':' << std::endl;
 #endif
 		commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
 		<< "Rank : " << Rank
@@ -402,11 +404,10 @@ namespace LinBox
 
 #endif // __LINBOX_gauss_gf2_INL
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
diff --git a/linbox/algorithms/gauss/gauss-nullspace.inl b/linbox/algorithms/gauss/gauss-nullspace.inl
index 4f072f6..0f46c5b 100644
--- a/linbox/algorithms/gauss/gauss-nullspace.inl
+++ b/linbox/algorithms/gauss/gauss-nullspace.inl
@@ -4,20 +4,20 @@
  * Written by Jean-Guillaume Dumas <Jean-Guillaume.Dumas at imag.fr>
  * Time-stamp: <21 Jun 10 14:43:11 Jean-Guillaume.Dumas at imag.fr>
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -28,7 +28,7 @@
 #ifndef __LINBOX_gauss_nullspace_INL
 #define __LINBOX_gauss_nullspace_INL
 
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/algorithms/gauss.h"
 #include "linbox/algorithms/triangular-solve.h"
 #include "linbox/blackbox/permutation.h"
@@ -46,13 +46,13 @@ namespace LinBox
 	{
 		if (Rank == 0) {
 			for(size_t i=0; i<U.coldim(); ++i)
-				x.setEntry(i,i,_field.one);
+				x.setEntry(i,i,field().one);
 		}
 		else {
 			unsigned long nullity = U.coldim()-Rank;
 			if (nullity != 0) {
 				// compute U2T s.t. U = [ U1 | -U2T^T ]
-				Matrix U2T(_field,nullity,Rank);
+				Matrix U2T(field(),nullity,Rank);
 
 				for(typename Matrix::ConstIndexedIterator uit=U.IndexedBegin();
 				    uit != U.IndexedEnd(); ++uit) {
@@ -61,7 +61,7 @@ namespace LinBox
 				}
 				for(typename Matrix::Iterator u2it=U2T.Begin();
 				    u2it != U2T.End(); ++u2it)
-					_field.negin(*u2it);
+					field().negin(*u2it);
 
 
 				// Compute the basis vector by vector
@@ -71,17 +71,17 @@ namespace LinBox
 					// Solve for upper part of basis
 					upperTriangularSparseSolve(W1Ti, Rank, U, U2T[i]);
 					// Add identity for lower part
-					W1Ti.push_back( typename SparseVect::Element((unsigned)(Rank+i), _field.one ) );
+					W1Ti.push_back( typename SparseVect::Element((unsigned)(Rank+i), field().one ) );
 
 					for(size_t j=0; j<W1Ti.size(); ++j) {
 						// P.applyTranspose(x[i],W1T[i]);
 						// Transposein(x)
-						x.setEntry( P.getStorage()[ W1Ti[j].first ], i, W1Ti[j].second );
+						x.setEntry( (size_t)P.getStorage()[ (size_t)W1Ti[(size_t)j].first ], i, W1Ti[j].second );
 					}
 				}
 			}
 		}
-		// x.write( std::cerr << "X:=", FORMAT_MAPLE ) << ';' << std::endl;
+		// x.write( std::cerr << "X:=", Tag::FileFormat::Maple ) << ';' << std::endl;
 		return x;
 	}
 
@@ -102,13 +102,13 @@ namespace LinBox
 		unsigned long Rank;
 		size_t Ni(A.rowdim()),Nj(A.coldim());
 
-		Permutation<Field> P((int)Nj,_field);
+		Permutation<Field> P((int)Nj,field());
 
-		// A.write( std::cerr << "A:=", FORMAT_MAPLE ) << ';' << std::endl;
+		// A.write( std::cerr << "A:=", Tag::FileFormat::Maple ) << ';' << std::endl;
 		this->InPlaceLinearPivoting(Rank, Det, A, P, Ni, Nj );
 
-		// P.write( std::cerr << "P:=", FORMAT_MAPLE ) << ';' << std::endl;
-		// A.write( std::cerr << "Ua:=", FORMAT_MAPLE ) << ';' << std::endl;
+		// P.write( std::cerr << "P:=", Tag::FileFormat::Maple ) << ';' << std::endl;
+		// A.write( std::cerr << "Ua:=", Tag::FileFormat::Maple ) << ';' << std::endl;
 
 		for(size_t i=0; i< Ni; ++i) {
 			if (A[i].size() == 0) {
@@ -123,7 +123,7 @@ namespace LinBox
 			}
 		}
 
-		// A.write( std::cerr << "Ub:=", FORMAT_MAPLE ) << ';' << std::endl;
+		// A.write( std::cerr << "Ub:=", Tag::FileFormat::Maple ) << ';' << std::endl;
 
 		return this->nullspacebasis(x, Rank, A, P);
 	}
@@ -132,7 +132,7 @@ namespace LinBox
 	template <class Matrix, class Block> inline Block&
 	GaussDomain<_Field>::nullspacebasis(Block& x, const Matrix& A)  const
 	{
-		SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq> A1 (A);
+		SparseMatrix<Field, SparseMatrixFormat::SparseSeq> A1 (A);
 		return this->nullspacebasisin(x, A1);
 	}
 
diff --git a/linbox/algorithms/gauss/gauss-pivot-gf2.inl b/linbox/algorithms/gauss/gauss-pivot-gf2.inl
index c110120..2094b64 100644
--- a/linbox/algorithms/gauss/gauss-pivot-gf2.inl
+++ b/linbox/algorithms/gauss/gauss-pivot-gf2.inl
@@ -3,20 +3,20 @@
  *
  * Time-stamp: <21 Jan 10 15:08:59 Jean-Guillaume.Dumas at imag.fr>
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -48,15 +48,16 @@ namespace LinBox
 #endif
 		typedef typename Vector::value_type E;
 
-		long nj =  lignepivot.size ();
+		long nj =  (long)lignepivot.size ();
 
 		if (nj > 0) {
-			indpermut = lignepivot.front();
+			indpermut = (long)lignepivot.front();
 
-			long ds = --columns[indpermut], dl, p = 0;
+			long ds = (long) --columns[(size_t)indpermut], p = 0;
 
 			for (long j = 1; j < nj; ++j) {
-				if ((dl = --columns[lignepivot[j]]) < ds) {
+				long dl;
+				if ((dl = (long) --columns[lignepivot[(size_t)j]]) < ds) {
 					ds = dl;
 					p = j;
 				}
@@ -64,14 +65,14 @@ namespace LinBox
 
 			if (p != 0) {
 				if (indpermut == static_cast<long>(indcol)) {
-					indpermut = lignepivot[p];
+					indpermut = (long)lignepivot[(size_t)p];
 				}
 				else {
-					E ttm = lignepivot[p];
-					indpermut = ttm;
+					E ttm = (E)lignepivot[(size_t)p];
+					indpermut = (long)ttm;
 
 					for (long m = p; m; --m)
-						lignepivot[m] = lignepivot[m-1];
+						lignepivot[(size_t)m] = lignepivot[(size_t)m-1];
 
 					lignepivot[0] = ttm;
 				}
@@ -103,10 +104,10 @@ namespace LinBox
 						 long &indpermut,
 						 bool& ) const // determinant
 	{
-		long nj = lignepivot.size ();
+		long nj = (long)lignepivot.size ();
 
 		if (nj > 0) {
-			indpermut = lignepivot.front();
+			indpermut = (long)lignepivot.front();
 			if (indpermut != static_cast<long>(indcol)){
 				lignepivot.front() = indcol;
 			}
@@ -122,11 +123,10 @@ namespace LinBox
 #endif // __LINBOX_gauss_pivot_gf2_INL
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
diff --git a/linbox/algorithms/gauss/gauss-pivot.inl b/linbox/algorithms/gauss/gauss-pivot.inl
index 579ca73..6ea301e 100644
--- a/linbox/algorithms/gauss/gauss-pivot.inl
+++ b/linbox/algorithms/gauss/gauss-pivot.inl
@@ -2,20 +2,20 @@
  * Copyright (C) 2009,2010 The LinBox group
  * Written by JG Dumas <Jean-Guillaume.Dumas at imag.fr>
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -48,17 +48,18 @@ namespace LinBox
 		//         std::cerr << "]" << std::endl;
 		typedef typename Vector::value_type E;
 
-		long nj =  lignepivot.size ();
+		long nj = (long) lignepivot.size ();
 
-		bool pivoting = false;
 
 		if (nj > 0) {
-			indpermut = lignepivot[0].first;
+			bool pivoting = false;
+			indpermut = (long)lignepivot[0].first;
 
-			long ds = --columns[indpermut], dl, p = 0;
+			long ds = (long) --columns[(size_t)indpermut], p = 0;
 
 			for (long j = 1; j < nj; ++j) {
-				if ((dl = --columns[lignepivot[j].first]) < ds) {
+				long dl;
+				if ((dl =(long) --columns[lignepivot[(size_t)j].first]) < ds) {
 					ds = dl;
 					p = j;
 				}
@@ -67,21 +68,21 @@ namespace LinBox
 			if (p != 0) {
 				pivoting = true;
 				if (indpermut == static_cast<long>(indcol)) {
-					indpermut = lignepivot[p].first;
-					std::swap( lignepivot[p].second, lignepivot[0].second);
+					indpermut =(long) lignepivot[(size_t)p].first;
+					std::swap( lignepivot[(size_t)p].second, lignepivot[0].second);
 				}
 				else {
-					E ttm = lignepivot[p];
-					indpermut = ttm.first;
+					E ttm = lignepivot[(size_t)p];
+					indpermut = (long)ttm.first;
 
 					for (long m = p; m; --m)
-						lignepivot[m] = lignepivot[m-1];
+						lignepivot[(size_t)m] = lignepivot[(size_t)m-1];
 
 					lignepivot[0] = ttm;
 				}
 			}
 
-			_field.mulin(determinant, lignepivot[0].second);
+			field().mulin(determinant, lignepivot[0].second);
 			if (indpermut != static_cast<long>(indcol)) {
 				// std::cerr << "Permuting col: " << indpermut << " <--> " << indcol << std::endl;
 				// no need to decrement/increment, already done during the search
@@ -89,7 +90,7 @@ namespace LinBox
 				pivoting = true;
 			}
 
-			if (pivoting) _field.negin(determinant);
+			if (pivoting) field().negin(determinant);
 			++indcol;
 		}
 		else
@@ -111,15 +112,15 @@ namespace LinBox
 					      long &indpermut,
 					      Element& determinant) const
 	{
-		long nj = lignepivot.size ();
+		long nj = (long)lignepivot.size ();
 
 		if (nj > 0) {
-			indpermut = lignepivot[0].first;
-			_field.mulin(determinant, lignepivot[0].second);
+			indpermut = (long) lignepivot[0].first;
+			field().mulin(determinant, lignepivot[0].second);
 			if (indpermut != static_cast<long>(indcol)){
 				// std::cerr << "Permuting col: " << lignepivot[0].first << " <--> " << indcol << std::endl;
 				lignepivot[0].first = (unsigned)indcol;
-				_field.negin(determinant);
+				field().negin(determinant);
 			}
 			++indcol;
 		}
@@ -138,16 +139,16 @@ namespace LinBox
 		long j = (long)k;
 
 		for (; j < n ; ++j )
-			if (!_field.isZero (lignepivot[j])) break ;
+			if (!field().isZero (lignepivot[(size_t)j])) break ;
 
 		if (j == n )
 			indpermut = -1 ;
 		else {
 			indpermut = j ;
 			if (indpermut != (long)k) {
-				typename Vector::value_type tmp = lignepivot[k] ;
-				lignepivot[k] = lignepivot[j] ;
-				lignepivot[j] = tmp ;
+				typename Vector::value_type tmp = lignepivot[(size_t)k] ;
+				lignepivot[(size_t)k] = lignepivot[(size_t)j] ;
+				lignepivot[(size_t)j] = tmp ;
 			}
 
 			++k;
diff --git a/linbox/algorithms/gauss/gauss-solve-gf2.inl b/linbox/algorithms/gauss/gauss-solve-gf2.inl
old mode 100644
new mode 100755
index 31f7e91..31b7b6b
--- a/linbox/algorithms/gauss/gauss-solve-gf2.inl
+++ b/linbox/algorithms/gauss/gauss-solve-gf2.inl
@@ -2,22 +2,22 @@
  * Copyright (C) LinBox 2009
  *
  * Written by Jean-Guillaume Dumas <Jean-Guillaume.Dumas at imag.fr>
- * Time-stamp: <23 Mar 12 17:32:19 Jean-Guillaume.Dumas at imag.fr>
+ * Time-stamp: <29 Oct 15 20:18:20 Jean-Guillaume.Dumas at imag.fr>
+ *
  *
- * 
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -43,7 +43,8 @@ namespace LinBox
 					 const Vector2& b) const
 	{
 
-		Vector2 y(U.rowdim()), v(U.rowdim());
+                const GF2 F2;
+		Vector2 y(F2, U.rowdim()), v(F2, U.rowdim());
 
 		Q.applyTranspose(y, b);
 
@@ -69,10 +70,10 @@ namespace LinBox
 
 		this->QLUPin(Rank, Det, Q, L, A, P, A.rowdim(), A.coldim() );
 
-		Vector1 w(A.coldim());
+		Vector1 w(F2, A.coldim());
 
-        for(typename Vector1::iterator it=w.begin()+Rank;it!=w.end();++it)
-				F2.init(*it,0);
+        for(typename Vector1::iterator it=w.begin()+(ptrdiff_t)Rank;it!=w.end();++it)
+				F2.assign(*it,F2.zero);
 
 		return this->solve(x, w, Rank, Q, L, A, P, b);
 	}
@@ -93,10 +94,10 @@ namespace LinBox
 
 		this->QLUPin(Rank, Det, Q, L, A, P, A.rowdim(), A.coldim() );
 
-		Vector1 w(A.coldim());
+		Vector1 w(F2, A.coldim());
 
         for(typename Vector1::iterator it=w.begin()+Rank;it!=w.end();++it)
-            generator.random( *it );        
+            generator.random( *it );
 
 		return this->solve(x, w, Rank, Q, L, A, P, b);
 	}
diff --git a/linbox/algorithms/gauss/gauss-solve.inl b/linbox/algorithms/gauss/gauss-solve.inl
index ea011a1..f504ad4 100644
--- a/linbox/algorithms/gauss/gauss-solve.inl
+++ b/linbox/algorithms/gauss/gauss-solve.inl
@@ -2,7 +2,7 @@
  * Copyright (C) LinBox 2008
  *
  * Written by Jean-Guillaume Dumas <Jean-Guillaume.Dumas at imag.fr>
- * Time-stamp: <23 Mar 12 17:33:46 Jean-Guillaume.Dumas at imag.fr>
+ * Time-stamp: <09 Jul 13 14:09:52 Jean-Guillaume.Dumas at imag.fr>
  *
  *
  * ========LICENCE========
@@ -40,15 +40,19 @@ namespace LinBox
 	template <class Matrix, class Perm, class Vector1, class Vector2> inline Vector1&
 	GaussDomain<_Field>::solve(Vector1& x, Vector1& w, unsigned long Rank, const Perm& Q, const Matrix& L, const Matrix& U, const Perm& P, const Vector2& b)  const
 	{
+            // Q L U P x = b
+		Vector2 y(U.field(),U.rowdim()), v(U.field(),U.rowdim());
 
-		Vector2 y(U.rowdim()), v(U.rowdim());
-
+            // L U P x = y = Q^T b
 		Q.applyTranspose(y, b);
 
+            // U P x = v = L^{-1} y
 		lowerTriangularUnitarySolve(v, L, y);
 
+            // P x = w = U^{-1} v, only for the upper part of w
 		upperTriangularSolve(w, U, v);
 
+            // x = P^T w = P^T U^{-1} L^{-1} Q^T b
 		return P.applyTranspose(x, w);
 	}
 
@@ -59,9 +63,9 @@ namespace LinBox
 
 		typename Field::Element Det;
 		unsigned long Rank;
-		Matrix L(_field, A.rowdim(), A.rowdim());
-		Permutation<Field> Q((int)A.rowdim(),_field);
-		Permutation<Field> P((int)A.coldim(),_field);
+		Matrix L(field(), A.rowdim(), A.rowdim());
+		Permutation<Field> Q((int)A.rowdim(),field());
+		Permutation<Field> P((int)A.coldim(),field());
 
 		this->QLUPin(Rank, Det, Q, L, A, P, A.rowdim(), A.coldim() );
 
@@ -82,10 +86,10 @@ namespace LinBox
 			}
 		}
 
-		Vector1 w(A.coldim());
+		Vector1 w(A.field(),A.coldim());
 
-		for(typename Vector1::iterator it=w.begin()+Rank;it!=w.end();++it)
-			_field.init(*it,0);
+		for(typename Vector1::iterator it=w.begin()+(ptrdiff_t)Rank;it!=w.end();++it)
+			field().assign(*it,field().zero);
 
 		return this->solve(x, w, Rank, Q, L, A, P, b);
 	}
@@ -94,18 +98,16 @@ namespace LinBox
 	template <class Matrix, class Vector1, class Vector2, class Random> inline Vector1&
 	GaussDomain<_Field>::solvein(Vector1& x, Matrix& A, const Vector2& b, Random& generator)  const
 	{
-		THIS_CODE_MAY_NOT_COMPILE_AND_IS_NOT_TESTED;
-
 		typename Field::Element Det;
 		unsigned long Rank;
-		Matrix L(_field, A.rowdim(), A.rowdim());
-		Permutation<Field> Q((int)A.rowdim(),_field);
-		Permutation<Field> P((int)A.coldim(),_field);
+		Matrix L(field(), A.rowdim(), A.rowdim());
+		Permutation<Field> Q((int)A.rowdim(),field());
+		Permutation<Field> P((int)A.coldim(),field());
 
 		this->QLUPin(Rank, Det, Q, L, A, P, A.rowdim(), A.coldim() );
 
-		Vector1 w(A.coldim());
-		for(typename Vector1::iterator it=w.begin()+Rank;it!=w.end();++it)
+                Vector1 w(A.field(),A.coldim());
+		for(typename Vector1::iterator it=w.begin()+(ptrdiff_t)Rank;it!=w.end();++it)
 			generator.random( *it );
 
 		return this->solve(x, w, Rank, Q, L, A, P, b);
diff --git a/linbox/algorithms/gauss/gauss.inl b/linbox/algorithms/gauss/gauss.inl
index 137ef01..38820a1 100644
--- a/linbox/algorithms/gauss/gauss.inl
+++ b/linbox/algorithms/gauss/gauss.inl
@@ -2,22 +2,22 @@
  * Copyright (C) 1999 Jean-Guillaume Dumas
  *
  * Written by Jean-Guillaume Dumas <Jean-Guillaume.Dumas at imag.fr>
- * Time-stamp: <18 Jun 10 15:48:38 Jean-Guillaume.Dumas at imag.fr>
+ * Time-stamp: <18 Jun 15 14:42:01 Jean-Guillaume.Dumas at imag.fr>
+ *
  *
- * 
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -34,7 +34,10 @@
 
 #include "linbox/algorithms/gauss.h"
 #include "linbox/util/commentator.h"
+#include <givaro/zring.h>
+#include <givaro/ring-interface.h>
 #include <utility>
+#include <type_traits>
 
 #ifdef __LINBOX_ALL__
 #define __LINBOX_COUNT__
@@ -42,681 +45,932 @@
 #define __LINBOX_FILLIN__
 #endif
 
+#ifdef __LINBOX_SpD_SWITCH__
+#include <linbox/matrix/dense-matrix.h>
+#include <numeric>
+#  ifndef __LINBOX_SpD_MAXSPARSITY__
+// Sparsity less than 1% --> switch to dense
+#  define __LINBOX_SpD_MAXSPARSITY__ 0.01
+#  endif
+#endif
+
 namespace LinBox
 {
-	template <class _Field>
-	template <class Matrix, class Perm> inline unsigned long&
-	GaussDomain<_Field>::QLUPin (unsigned long &Rank,
-				     Element       &determinant,
-				     Perm          &Q,
-				     Matrix        &LigneL,
-				     Matrix        &LigneA,
-				     Perm          &P,
-				     unsigned long Ni,
-				     unsigned long Nj) const
-	{
-		linbox_check( Q.coldim() == Q.rowdim() );
-		linbox_check( P.coldim() == P.rowdim() );
-		linbox_check( LigneL.coldim() == LigneL.rowdim() );
-		linbox_check( Q.coldim() == LigneL.rowdim() );
-		linbox_check( LigneL.coldim() == LigneA.rowdim() );
-		linbox_check( LigneA.coldim() == P.rowdim() );
-
-		typedef typename Matrix::Row        Vector;
-		typedef typename Vector::value_type E;
-
-		// Requirements : LigneA is an array of sparse rows
-		// In place (LigneA is modified)
-		// With reordering (D is a density type. Density is allocated here)
-		//    long Ni = LigneA.n_row (), Nj = LigneA.n_col ();
-		commentator().start ("Gaussian elimination with reordering",
-				   "IPLR", Ni);
-		commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
-		<< "Gaussian QLUP elimination on " << Ni << " x " << Nj << " matrix" << std::endl;
+    template <class _Field>
+    template <class Matrix, class Perm> inline unsigned long&
+    GaussDomain<_Field>::QLUPin (unsigned long &Rank,
+                     Element       &determinant,
+                     Perm          &Q,
+                     Matrix        &LigneL,
+                     Matrix        &LigneA,
+                     Perm          &P,
+                     unsigned long Ni,
+                     unsigned long Nj) const
+    {
+        linbox_check( Q.coldim() == Q.rowdim() );
+        linbox_check( P.coldim() == P.rowdim() );
+        linbox_check( LigneL.coldim() == LigneL.rowdim() );
+        linbox_check( Q.coldim() == LigneL.rowdim() );
+        linbox_check( LigneL.coldim() == LigneA.rowdim() );
+        linbox_check( LigneA.coldim() == P.rowdim() );
+
+        typedef typename Matrix::Row        Vector;
+        typedef typename Vector::value_type E;
+
+        // Requirements : LigneA is an array of sparse rows
+        // In place (LigneA is modified)
+        // With reordering (D is a density type. Density is allocated here)
+        //    long Ni = LigneA.n_row (), Nj = LigneA.n_col ();
+        commentator().start ("QLUPin Gaussian elimination with reordering",
+                     "IPLR", Ni);
+        commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
+        << "Gaussian QLUP elimination on " << Ni << " x " << Nj << " matrix" << std::endl;
 
 #ifdef __LINBOX_COUNT__
-		long long nbelem = 0;
+        long long nbelem = 0;
 #endif
 
-		Element Eone; _field.init(Eone,1UL);
-		_field.init(determinant,1UL);
-		// allocation of the column density
-		std::vector<size_t> col_density (Nj);
+        field().assign(determinant,field().one);
+        // allocation of the column density
+        std::vector<size_t> col_density (Nj);
 
 
-		for(typename Matrix::RowIterator LigneL_it = LigneL.rowBegin() ;
-		    LigneL_it != LigneL.rowEnd(); ++LigneL_it)
-			LigneL_it->reserve(16);
+        for(typename Matrix::RowIterator LigneL_it = LigneL.rowBegin() ;
+            LigneL_it != LigneL.rowEnd(); ++LigneL_it)
+            LigneL_it->reserve(16);
 
-		std::deque<std::pair<size_t,size_t> > invQ;
+        std::deque<std::pair<size_t,size_t> > invQ;
 
-		// assignment of LigneA with the domain object
-		for (unsigned long jj = 0; jj < Ni; ++jj)
-			for (unsigned long k = 0; k < LigneA[jj].size (); k++)
-				++col_density[LigneA[jj][k].first];
+        // assignment of LigneA with the domain object
+        for (unsigned long jj = 0; jj < Ni; ++jj)
+            for (unsigned long k = 0; k < LigneA[(size_t)jj].size (); k++)
+                ++col_density[LigneA[(size_t)jj][k].first];
 
-		long last = (long)Ni - 1;
-		long c;
-		Rank = 0;
+        const long last = (long)Ni - 1;
+        long c;
+        Rank = 0;
+        bool degeneratedense=false;
 
 #ifdef __LINBOX_OFTEN__
-		long sstep = last/40;
-		if (sstep > __LINBOX_OFTEN__) sstep = __LINBOX_OFTEN__;
+        long sstep = last/40;
+        if (sstep > __LINBOX_OFTEN__) sstep = __LINBOX_OFTEN__;
 #else
-		long sstep = 1000;
+#  ifdef __LINBOX_FILLIN__
+        long sstep = 100;
+#  else    
+        long sstep = 1000;
+#  endif
 #endif
-		// Elimination steps with reordering
-
-		typename Matrix::RowIterator LigneA_k = LigneA.rowBegin(), LigneA_p;
-		for (long k = 0; k < last; ++k, ++LigneA_k) {
-			long p = k, s = 0;
-
-#ifdef __LINBOX_FILLIN__
-			if ( ! (k % 100) )
-#else
-			if ( ! (k % sstep) )
+        
+        // Elimination steps with reordering
+
+        typename Matrix::RowIterator LigneA_k = LigneA.rowBegin(), LigneA_p;
+        for (long k = 0; k < last; ++k, ++LigneA_k) {
+            
+#ifdef __LINBOX_SpD_MAXSPARSITY__
+            
+            if (accumulate(col_density.begin()+Rank,col_density.end(),0)>(Ni*Nj*__LINBOX_SpD_MAXSPARSITY__)) {
+#  ifdef _LB_DEBUG
+                std::cerr << "Dense switch: " << accumulate(col_density.begin()+Rank,col_density.end(),0) << '>' << Ni << '*' << Nj << '*' << __LINBOX_SpD_MAXSPARSITY__ << std::endl;
+#  endif
+                degeneratedense=std::is_base_of<Givaro::FiniteRingInterface<Element>,_Field>::value && true; break;
+            }
 #endif
-			{
-				commentator().progress (k);
+            
+            long p = k, s = 0;
+
+            if ( ! (k % sstep) )
+            {
+                    commentator().progress (k);
 #ifdef __LINBOX_FILLIN__
-				long sl(0);
-				for (size_t l = 0; l < Ni; ++l)
-					sl += LigneA[l].size ();
-
-				commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
-				<< "Fillin (" << Rank << "/" << Ni << ") = "
-				<< sl
-				<< " (" << double(sl)*100.0/double(Ni-k)/double(Nj-k) << "%, "
-				<< double(sl)/double(Ni-k) << " avg)"
-				<< std::endl;
+                    long sl(0);
+                    for (size_t l = 0; l < Ni; ++l)
+                        sl +=(long) LigneA[(size_t)l].size ();
+
+                    commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
+                    << "Fillin (" << Rank << "/" << Ni << ") = "
+                    << sl
+                    << " (" << double(sl)*100.0/double(Ni-k)/double(Nj-k) << "%, "
+                    << double(sl)/double(Ni-k) << " avg)"
+                    << std::endl;
 #endif
-			}
-
-			long l;
-			for(l = k; l < static_cast<long>(Ni); ++l) {
-				if ( (s = LigneA[l].size()) ) {
-					p = l;
-					break;
-				}
-			}
-
-			if (s) {
-				long sl;
-				// Row permutation for the sparsest row
-				for (; l < static_cast<long>(Ni); ++l)
-					if (((sl = LigneA[l].size ()) < s) && (sl)) {
-						s = sl;
-						p = l;
-					}
-
-				if (p != k) {
-					// std::cerr << "Permuting rows: " << k << " <--> " << p << std::endl;
-					invQ.push_front( std::pair<size_t,size_t>((size_t)k,(size_t)p) );
-					_field.negin(determinant);
-					std::swap( *LigneA_k, LigneA[p]);
-					std::swap( LigneL[k], LigneL[p]);
-				}
-
-
-				SparseFindPivot (*LigneA_k, Rank, c, col_density, determinant);
-
-				if (c != -1) {
-					long ll;
-					if ( c != (static_cast<long>(Rank)-1) ) {
-						P.permute(Rank-1,c);
-						for (ll=0      ; ll < k ; ++ll)
-							permute( LigneA[ll], Rank, c);
-					}
-					long npiv=LigneA_k->size();
-					for (ll = k+1; ll < static_cast<long>(Ni); ++ll) {
-						E hc;
-						hc.first=(unsigned)Rank-1;
-						eliminate (hc.second, LigneA[ll], *LigneA_k, Rank, c, npiv, col_density);
-						if(! _field.isZero(hc.second)) LigneL[ll].push_back(hc);
-					}
-				}
-
-				//                     LigneA.write(std::cerr << "AFT " )<<std::endl;
+            }
+
+            long l;
+            for(l = k; l < static_cast<long>(Ni); ++l) {
+                if ( (s = (long) LigneA[(size_t)l].size()) ) {
+                    p = l;
+                    break;
+                }
+            }
+
+            if (s) {
+                // Row permutation for the sparsest row
+                for (; l < static_cast<long>(Ni); ++l) {
+                    long sl;
+                    if (((sl =(long) LigneA[(size_t)l].size ()) < s) && (sl)) {
+                        s = sl;
+                        p = l;
+                    }
+                }
+
+                if (p != k) {
+                    // std::cerr << "Permuting rows: " << k << " <--> " << p << std::endl;
+                    invQ.push_front( std::pair<size_t,size_t>((size_t)k,(size_t)p) );
+                    field().negin(determinant);
+                    std::swap( *LigneA_k, LigneA[(size_t)p]);
+                    std::swap( LigneL[(size_t)k], LigneL[(size_t)p]);
+                }
+
+
+                SparseFindPivot (*LigneA_k, Rank, c, col_density, determinant);
+
+                if (c != -1) {
+                    long ll;
+                    if ( c != (static_cast<long>(Rank)-1) ) {
+                        P.permute(Rank-1,(size_t)c);
+                        for (ll=0      ; ll < k ; ++ll)
+                            permute( LigneA[(size_t)ll], Rank, c);
+                    }
+                    long npiv=(long)LigneA_k->size();
+                    for (ll = k+1; ll < static_cast<long>(Ni); ++ll) {
+                        E hc;
+                        hc.first=(unsigned)Rank-1;
+                        eliminate (hc.second, LigneA[(size_t)ll], *LigneA_k, Rank, c, (size_t)npiv, col_density);
+                        if(! field().isZero(hc.second)) LigneL[(size_t)ll].push_back(hc);
+                    }
+                }
+
+                //                     LigneA.write(std::cerr << "AFT " )<<std::endl;
 #ifdef __LINBOX_COUNT__
-				nbelem += LigneA_k->size ();
+                nbelem += LigneA_k->size ();
 #endif
-			}
-			E one((unsigned)k,Eone);
-			LigneL[k].push_back(one);
-			//                 LigneL.write(rep << "L:= ", FORMAT_MAPLE) << std::endl;
-			//                 LigneA.write(rep << "U:= ", FORMAT_MAPLE) << std::endl;
-		}//for k
-
-		SparseFindPivot ( LigneA[last], Rank, c, determinant);
-		if (c != -1) {
-			if ( c != (static_cast<long>(Rank)-1) ) {
-				P.permute(Rank-1,c);
-				for (long ll=0      ; ll < last ; ++ll)
-					permute( LigneA[ll], Rank, c);
-			}
-		}
-
-		E one((unsigned)last,Eone);
-		LigneL[last].push_back(one);
+            }
+            E one((unsigned)k,field().one);
+            LigneL[(size_t)k].push_back(one);
+           
+
+//             LigneL.write(std::cerr << "L:= ", Tag::FileFormat::Maple) << std::endl;
+//             LigneA.write(std::cerr << "U:= ", Tag::FileFormat::Maple) << std::endl;
+            
+        }//for k
+
+//         if (std::is_base_of<Givaro::FiniteRingInterface<Element>,_Field>::value && degeneratedense) {
+//             DenseQLUPin(Rank,determinant,invQ,LigneL,LigneA,P,Ni,Nj);
+            
+//         } else {
+
+//             SparseFindPivot ( LigneA[(size_t)last], Rank, c, determinant);
+//             if (c != -1) {
+//                 if ( c != (static_cast<long>(Rank)-1) ) {
+//                     P.permute(Rank-1,(size_t)c);
+//                     for (long ll=0      ; ll < last ; ++ll)
+//                         permute( LigneA[(size_t)ll], Rank, c);
+//                 }
+//             }
+            
+//             E one((unsigned)last,field().one);
+//             LigneL[(size_t)last].push_back(one);
+//         }
+        Continuation<Matrix,Perm,
+            std::is_base_of<Givaro::FiniteRingInterface<Element>,_Field>::value>
+            ()(*this, Rank,determinant,invQ,LigneL,LigneA,P,Ni,Nj,degeneratedense);
 
 #ifdef __LINBOX_COUNT__
-		nbelem += LigneA[last].size ();
-		commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
-		<< "Left elements : " << nbelem << std::endl;
+        nbelem += LigneA[(size_t)(Ni-1)].size ();
+        commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
+        << "Left elements : " << nbelem << std::endl;
 #endif
 
 #ifdef __LINBOX_FILLIN__
-		long sl(0);
-		for (size_t l=0; l < Ni; ++l)
-			sl += LigneA[l].size ();
+        long sl(0);
+        for (size_t l=0; l < Ni; ++l)
+            sl += (long) LigneA[(size_t)l].size ();
 
-		commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
-		<< "Fillin (" << Rank << "/" << Ni << ") = " << sl
-		<< std::endl;
+        commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
+        << "Fillin (" << Rank << "/" << Ni << ") = " << sl
+        << std::endl;
 #endif
 
-		if ((Rank < Ni) || (Rank < Nj) || (Ni == 0) || (Nj == 0))
-			_field.init(determinant,0UL);
-
-		integer card;
-		_field.write(commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
-			 << "Determinant : ", determinant)
-		<< " over GF (" << _field.cardinality (card) << ")" << std::endl;
-
-		for(std::deque<std::pair<size_t,size_t> >::const_iterator it = invQ.begin(); it!=invQ.end();++it)
-			Q.permute( it->first, it->second );
-
-
-		//             std::ostream& rep = commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT);
-		//             Q.write(rep << "Q:= ", FORMAT_MAPLE) << ':' << std::endl;
-		//             LigneL.write(rep << "L:= ", FORMAT_MAPLE) << ':' << std::endl;
-		//             LigneA.write(rep << "U:= ", FORMAT_MAPLE) << ':' << std::endl;
-		//             P.write(rep << "P:= ", FORMAT_MAPLE) << ':' << std::endl;
-
-		commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
-		<< "Rank : " << Rank
-		<< " over GF (" << card << ")" << std::endl;
-		commentator().stop ("done", 0, "IPLR");
-
-
-
-		return Rank;
-	}
-
-	template <class _Field>
-	template <class Matrix> inline unsigned long&
-	GaussDomain<_Field>::InPlaceLinearPivoting (unsigned long &Rank,
-						    Element        &determinant,
-						    Matrix         &LigneA,
-						    unsigned long   Ni,
-						    unsigned long   Nj) const
-	{
-		typedef typename Matrix::Row        Vector;
-		typedef typename Vector::value_type E;
-
-		// Requirements : LigneA is an array of sparse rows
-		// In place (LigneA is modified)
-		// With reordering (D is a density type. Density is allocated here)
-		//    long Ni = LigneA.n_row (), Nj = LigneA.n_col ();
-		commentator().start ("Gaussian elimination with reordering",
-				   "IPLR", Ni);
-		_field.write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
-			  << "Gaussian elimination on " << Ni << " x " << Nj << " matrix, over: ") << std::endl;
+        if ((Rank < Ni) || (Rank < Nj) || (Ni == 0) || (Nj == 0))
+            field().assign(determinant,field().zero);
+
+        integer card;
+        field().write(field().write(commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
+                  << "Determinant : ", determinant)
+        << " over ") << std::endl;
+
+        for(std::deque<std::pair<size_t,size_t> >::const_iterator it = invQ.begin(); it!=invQ.end();++it)
+            Q.permute( it->first, it->second );
+
+
+        std::ostream& rep = commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT);
+        Q.write(rep << "Q:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+        LigneL.write(rep << "L:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+        LigneA.write(rep << "U:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+        P.write(rep << "P:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+        
+        commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
+        << "Rank : " << Rank
+        << " over GF (" << card << ")" << std::endl;
+        commentator().stop ("done", 0, "IPLR");
+
+
+
+        return Rank;
+    }
+
+
+
+    template <class _Field>
+    template <class Matrix, class Perm> inline unsigned long&
+    GaussDomain<_Field>::SparseContinuation (unsigned long &Rank,
+                     Element       &determinant,
+                     std::deque<std::pair<size_t,size_t> > &invQ,
+                     Matrix        &LigneL,
+                     Matrix        &LigneA,
+                     Perm          &P,
+                     unsigned long Ni,
+                     unsigned long Nj) const
+    {
+        typedef typename Matrix::Row        Vector;
+        typedef typename Vector::value_type E;
+
+        const long last = Ni-1;
+        long c;
+        SparseFindPivot ( LigneA[(size_t)last], Rank, c, determinant);
+        if (c != -1) {
+            if ( c != (static_cast<long>(Rank)-1) ) {
+                P.permute(Rank-1,(size_t)c);
+                for (long ll=0      ; ll < last ; ++ll)
+                    permute( LigneA[(size_t)ll], Rank, c);
+            }
+        }
+        
+        E one((unsigned)last,field().one);
+        LigneL[(size_t)last].push_back(one);
+        return Rank;
+    }
+    
+
+    template <class _Field>
+    template<class Matrix, class Perm> 
+    struct GaussDomain<_Field>::Continuation<Matrix,Perm,false> {
+        unsigned long& operator()(
+            const GaussDomain<_Field>& GD,
+            unsigned long &Rank, 
+            typename GaussDomain<_Field>::Element       &determinant,
+            std::deque<std::pair<size_t,size_t> > &invQ,
+            Matrix        &LigneL,
+            Matrix        &LigneA,
+            Perm          &P,
+            unsigned long Ni,
+            unsigned long Nj,
+            bool degeneratedense) const 
+            {
+                return GD.SparseContinuation(Rank,determinant,invQ,LigneL,LigneA,P,Ni,Nj);
+            }
+    };
+    
+    template <class _Field>
+    template <class Matrix, class Perm> 
+    struct GaussDomain<_Field>::Continuation<Matrix,Perm,true> {
+        unsigned long& operator()(
+            const GaussDomain<_Field>& GD,
+            unsigned long &Rank,
+            typename GaussDomain<_Field>::Element       &determinant,
+            std::deque<std::pair<size_t,size_t> > &invQ,
+            Matrix        &LigneL,
+            Matrix        &LigneA,
+            Perm          &P,
+            unsigned long Ni,
+            unsigned long Nj,
+            bool degeneratedense) const
+            {
+                if (degeneratedense) {
+                    return GD.DenseQLUPin(Rank,determinant,invQ,LigneL,LigneA,P,Ni,Nj);
+                } else {
+                    return GD.SparseContinuation(Rank,determinant,invQ,LigneL,LigneA,P,Ni,Nj);
+                }
+            }
+    };
+    
+
+
+
+
+
+    template <class _Field>
+    template <class Matrix, class Perm> inline unsigned long&
+    GaussDomain<_Field>::DenseQLUPin (unsigned long &Rank,
+                     Element       &determinant,
+                     std::deque<std::pair<size_t,size_t> > &dinvQ,
+                     Matrix        &dLigneL,
+                     Matrix        &dLigneA,
+                     Perm          &dP,
+                     unsigned long Ni,
+                     unsigned long Nj) const
+    {
+        linbox_check( dP.coldim()      == dP.rowdim() );
+        linbox_check( dLigneL.coldim() == dLigneL.rowdim() );
+        linbox_check( dLigneL.coldim() == dLigneA.rowdim() );
+        linbox_check( dLigneA.coldim() == dP.rowdim() );
+
+//         std::deque<std::pair<size_t,size_t> > dinvQ(invQ);
+//         Matrix dLigneL(LigneL, this->field());
+//         Matrix dLigneA(LigneA, this->field());
+//         Perm dP(P);
+        
+//         { Perm dQ(Ni);
+//           for(std::deque<std::pair<size_t,size_t> >::const_iterator it = dinvQ.begin(); it!=dinvQ.end();++it)
+//               dQ.permute( it->first, it->second );
+//           dQ.write(std::cerr << "dQ:= ") << ';' << std::endl;
+//         }
+//         dLigneL.write(std::cerr << "dL:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+//         dLigneA.write(std::cerr << "dU:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+//         dP.write(std::cerr << "dP:= ") << ';' << std::endl;
+        
+
+        size_t sNi=Ni-Rank, sNj=Nj-Rank;
+//         std::cerr << "Dense switch: " << sNi << 'x' << sNj << std::endl;
+        BlasMatrix<_Field> A(this->field(), sNi, sNj);
+        
+        for(size_t di=Rank;di<Ni;++di) {
+            for(size_t dj=0;dj<dLigneA[di].size();++dj)
+                A.setEntry(di-Rank,dLigneA[di][dj].first-Rank, dLigneA[di][dj].second);
+            dLigneA[di].resize(0);
+        }
+        
+        
+//         A.write(std::cerr << "A:= ", Tag::FileFormat::Maple) << std::endl;
+        
+        enum FFLAS::FFLAS_DIAG diag = FFLAS::FflasNonUnit;
+        size_t *P2 = FFLAS::fflas_new<size_t>(sNi);
+        size_t *Q2 = FFLAS::fflas_new<size_t>(sNj);
+        for (size_t j=0;j<sNi;j++) P2[j]=0;
+        for (size_t j=0;j<sNj;j++) Q2[j]=0;
+        size_t R2 = FFPACK::PLUQ(this->field(), diag, sNi, sNj, A.getPointer(), sNj, P2, Q2);
+//         std::cerr << "Rank:" << Rank << '+' << R2 << '=' << (Rank+R2) << std::endl;
+        
+        
+//         std::cerr << dLigneL.rowdim() << 'x' << dLigneL.coldim() << std::endl;
+        
+//         { Perm dQ(Ni);
+//           for(std::deque<std::pair<size_t,size_t> >::const_iterator it = dinvQ.begin(); it!=dinvQ.end();++it)
+//               dQ.permute( it->first, it->second );
+//           dQ.write(std::cerr << "dQ:= ") << ';' << std::endl;
+//         }
+//         dLigneL.write(std::cerr << "dL:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+//         dLigneA.write(std::cerr << "dU:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+//         dP.write(std::cerr << "dP:= ") << ';' << std::endl;
+        
+
+        Givaro::ZRing<long> Z;
+
+//         std::cerr << '['; for (size_t j=0;j<sNi;j++) 
+//             std::cerr << P2[j] << ' ';
+//         std::cerr << ']' << std::endl;
+            // Left-Trans: P2^T * G
+        for (int i=sNi;--i>=0;) 
+            if(i != static_cast<int>(P2[i])) {
+                dinvQ.push_front( std::pair<size_t,size_t>(Rank+(size_t)i,Rank+P2[i]) );
+                this->field().negin(determinant);
+                std::swap(dLigneL[i+Rank],dLigneL[P2[i]+Rank]);
+            }
+        
+            // Put L2 in bottom right corner
+        for(size_t i=0; i<sNi; ++i)
+            for(size_t j=0; j<i; ++j)
+                if (!this->field().isZero(A.getEntry(i,j)))
+                    dLigneL[Rank+i].push_back(std::pair<size_t, Element>(Rank+j,A.getEntry(i,j)));
+        for(size_t i=0; i<R2; ++i)
+            dLigneL[Rank+i].push_back(std::pair<size_t, Element>(Rank+i,this->field().one));
+
+
+            // Put U2 in bottom right corner
+        for(size_t i=0; i<sNi; ++i)
+            for(size_t j=i; j<sNj; ++j)
+                if (!this->field().isZero(A.getEntry(i,j)))
+                    dLigneA[Rank+i].push_back(std::pair<size_t, Element>(Rank+j,A.getEntry(i,j)));
+        for(size_t i=0; i<R2; ++i)
+            this->field().mulin(determinant,A.getEntry(i,i));
+
+//         std::cerr << '['; for (size_t j=0;j<sNj;++j) 
+//             std::cerr << Q2[j] << ' ';
+//         std::cerr << ']' << std::endl;
+        
+            // Right-Trans: H * Q2^T
+        for (size_t j=0;j<sNj;++j) 
+            if(j != Q2[j]) {
+                this->field().negin(determinant);
+                for (size_t l=0; l<Rank; ++l) 
+                    permute( dLigneA[l], j+Rank+1, Q2[j]+Rank);
+            }
+        
+        FFPACK::applyP(Z,FFLAS::FflasLeft,FFLAS::FflasNoTrans,1,0,sNj,&(*(dP.getStorage().begin()))+Rank,1,Q2);
+
+//         { Perm dQ(Ni);
+//           for(std::deque<std::pair<size_t,size_t> >::const_iterator it = dinvQ.begin(); it!=dinvQ.end();++it)
+//               dQ.permute( it->first, it->second );
+//           dQ.write(std::cerr << "dQ:= ") << ';' << std::endl;
+//         }
+//         dLigneL.write(std::cerr << "dL:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+//         dLigneA.write(std::cerr << "dU:= ", Tag::FileFormat::Maple) << ':' << std::endl;
+//         dP.write(std::cerr << "dP:= ") << ';' << std::endl;
+
+
+       
+
+        return Rank+=R2;
+    }
+    
+
+    template <class _Field>
+    template <class Matrix> inline unsigned long&
+    GaussDomain<_Field>::InPlaceLinearPivoting (unsigned long &Rank,
+                            Element        &determinant,
+                            Matrix         &LigneA,
+                            unsigned long   Ni,
+                            unsigned long   Nj) const
+    {
+        typedef typename Matrix::Row        Vector;
+
+        // Requirements : LigneA is an array of sparse rows
+        // In place (LigneA is modified)
+        // With reordering (D is a density type. Density is allocated here)
+        //    long Ni = LigneA.n_row (), Nj = LigneA.n_col ();
+        commentator().start ("IPLR Gaussian elimination with reordering",
+                     "IPLR", Ni);
+        field().write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
+                   << "Gaussian elimination on " << Ni << " x " << Nj << " matrix, over: ") << std::endl;
 
 #ifdef __LINBOX_COUNT__
-		long long nbelem = 0;
+        long long nbelem = 0;
 #endif
 
-		_field.init(determinant,1UL);
-		Vector Vzer (0);
-		// allocation of the column density
-		std::vector<size_t> col_density (Nj);
+        field().assign(determinant,field().one);
+        Vector Vzer(0) ;
+
+        // allocation of the column density
+        std::vector<size_t> col_density (Nj);
 
-		// assignment of LigneA with the domain object
-		for (unsigned long jj = 0; jj < Ni; ++jj)
-			for (unsigned long k = 0; k < LigneA[jj].size (); k++)
-				++col_density[LigneA[jj][k].first];
+        // assignment of LigneA with the domain object
+        for (unsigned long jj = 0; jj < Ni; ++jj)
+            for (unsigned long k = 0; k < LigneA[(size_t)jj].size (); k++)
+                ++col_density[LigneA[(size_t)jj][k].first];
 
-		long last = (long)Ni - 1;
-		long c;
-		Rank = 0;
+        const long last = (long)Ni - 1;
+        long c;
+        Rank = 0;
 
 #ifdef __LINBOX_OFTEN__
-		long sstep = last/40;
-		if (sstep > __LINBOX_OFTEN__) sstep = __LINBOX_OFTEN__;
+        long sstep = last/40;
+        if (sstep > __LINBOX_OFTEN__) sstep = __LINBOX_OFTEN__;
 #else
-		long sstep = 1000;
+        long sstep = 1000;
 #endif
-		// Elimination steps with reordering
-		for (long k = 0; k < last; ++k) {
-			unsigned long l;
-			long p = k, s = LigneA[k].size (), sl;
+        // Elimination steps with reordering
+        for (long k = 0; k < last; ++k) {
+            long p = k, s = (long)LigneA[(size_t)k].size ();
 
 #ifdef __LINBOX_FILLIN__
-			if ( ! (k % 100) ) {
+            if ( ! (k % 100) ) {
+                unsigned long l;
+                long sl;
+                commentator().progress (k);
+                for (sl = 0, l = 0; l < Ni; ++l)
+                    sl += (long)LigneA[(size_t)l].size ();
+
+                commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
+                << "Fillin (" << Rank << "/" << Ni << ") = "
+                << sl
+                << " (" << double(sl)*100.0/double(Ni-k)/double(Nj-k) << "%, "
+                << double(sl)/double(Ni-k) << " avg)"
+                << std::endl;
+            }
 #else
-				if ( ! (k % sstep) ) {
-#endif
-					commentator().progress (k);
-#ifdef __LINBOX_FILLIN__
-					for (sl = 0, l = 0; l < Ni; ++l)
-						sl += LigneA[l].size ();
-
-					commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
-					<< "Fillin (" << Rank << "/" << Ni << ") = "
-					<< sl
-					<< " (" << double(sl)*100.0/double(Ni-k)/double(Nj-k) << "%, "
-					<< double(sl)/double(Ni-k) << " avg)"
-					<< std::endl;
+            if ( ! (k % sstep) ) {
+                commentator().progress (k);
+            }
 #endif
-				}
-
-				if (s) {
-					// Row permutation for the sparsest row
-					for (l = (unsigned long)k + 1; l < (unsigned long)Ni; ++l)
-						if (((sl = LigneA[l].size ()) < s) && (sl)) {
-							s = sl;
-							p = (long)l;
-						}
-
-					if (p != k) {
-						_field.negin(determinant);
-						Vector vtm = LigneA[k];
-						LigneA[k] = LigneA[p];
-						LigneA[p] = vtm;
-					}
-
-					//                     LigneA.write(std::cerr << "BEF, k:" << k << ", Rank:" << Rank << ", c:" << c)<<std::endl;
-
-					SparseFindPivot (LigneA[k], Rank, c, col_density, determinant);
-					//                     LigneA.write(std::cerr << "PIV, k:" << k << ", Rank:" << Rank << ", c:" << c)<<std::endl;
-					if (c != -1) {
-						for (l = (unsigned long)k + 1; l < (unsigned long)Ni; ++l)
-							eliminate (LigneA[l], LigneA[k], Rank, c, col_density);
-					}
-
-					//                     LigneA.write(std::cerr << "AFT " )<<std::endl;
+
+            if (s) {
+                unsigned long l;
+                // Row permutation for the sparsest row
+                for (l = (unsigned long)k + 1; l < (unsigned long)Ni; ++l) {
+                long sl;
+                    if (((sl = (long)LigneA[(size_t)l].size ()) < s) && (sl)) {
+                        s = sl;
+                        p = (long)l;
+                    }
+                }
+
+                if (p != k) {
+                    field().negin(determinant);
+                    Vector vtm = LigneA[(size_t)k];
+                    LigneA[(size_t)k] = LigneA[(size_t)p];
+                    LigneA[(size_t)p] = vtm;
+                }
+
+                //                     LigneA.write(std::cerr << "BEF, k:" << k << ", Rank:" << Rank << ", c:" << c)<<std::endl;
+
+                SparseFindPivot (LigneA[(size_t)k], Rank, c, col_density, determinant);
+                //                     LigneA.write(std::cerr << "PIV, k:" << k << ", Rank:" << Rank << ", c:" << c)<<std::endl;
+                if (c != -1) {
+                    for (l = (unsigned long)k + 1; l < (unsigned long)Ni; ++l)
+                        eliminate (LigneA[(size_t)l], LigneA[(size_t)k], Rank, c, col_density);
+                }
+
+                //                     LigneA.write(std::cerr << "AFT " )<<std::endl;
 #ifdef __LINBOX_COUNT__
-					nbelem += LigneA[k].size ();
+                nbelem += LigneA[(size_t)k].size ();
 #endif
-					LigneA[k] = Vzer;
-				}
+                LigneA[(size_t)k] = Vzer;
+            }
 
-			}//for k
+        }//for k
 
-			SparseFindPivot (LigneA[last], Rank, c, determinant);
+        SparseFindPivot (LigneA[(size_t)last], Rank, c, determinant);
 
 #ifdef __LINBOX_COUNT__
-			nbelem += LigneA[last].size ();
-			commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
-			<< "Left elements : " << nbelem << std::endl;
+        nbelem += LigneA[(size_t)last].size ();
+        commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
+        << "Left elements : " << nbelem << std::endl;
 #endif
 
 #ifdef __LINBOX_FILLIN__
-			long sl(0);
-			for (size_t l=0; l < Ni; ++l)
-				sl += LigneA[l].size ();
+        long sl(0);
+        for (size_t l=0; l < Ni; ++l)
+            sl += (long)LigneA[(size_t)l].size ();
 
-			commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
-			<< "Fillin (" << Rank << "/" << Ni << ") = " << sl
-			<< std::endl;
+        commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
+        << "Fillin (" << Rank << "/" << Ni << ") = " << sl
+        << std::endl;
 #endif
 
-			integer card;
-
-			if ((Rank < Ni) || (Rank < Nj) || (Ni == 0) || (Nj == 0))
-				_field.init(determinant,0UL);
-
-			_field.write(commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
-				 << "Determinant : ", determinant)
-			<< " over GF (" << _field.cardinality (card) << ")" << std::endl;
-
-			commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
-			<< "Rank : " << Rank
-			<< " over GF (" << card << ")" << std::endl;
-			commentator().stop ("done", 0, "IPLR");
-			return Rank;
-		}
-
-		template <class _Field>
-		template <class Matrix, class Perm> inline unsigned long&
-		GaussDomain<_Field>::InPlaceLinearPivoting (unsigned long &Rank,
-							    Element        &determinant,
-							    Matrix         &LigneA,
-							    Perm           &P,
-							    unsigned long   Ni,
-							    unsigned long   Nj) const
-		{
-			typedef typename Matrix::Row        Vector;
-			typedef typename Vector::value_type E;
-
-			// Requirements : LigneA is an array of sparse rows
-			// In place (LigneA is modified)
-			// With reordering (D is a density type. Density is allocated here)
-			//    long Ni = LigneA.n_row (), Nj = LigneA.n_col ();
-			commentator().start ("Gaussian elimination with reordering",
-					   "IPLR", Ni);
-			_field.write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
-				  << "Gaussian elimination on " << Ni << " x " << Nj << " matrix, over: ") << std::endl;
+        integer card;
+
+        if ((Rank < Ni) || (Rank < Nj) || (Ni == 0) || (Nj == 0))
+            field().assign(determinant,field().zero);
+
+        field().write(commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
+                  << "Determinant : ", determinant)
+        << " over GF (" << field().cardinality (card) << ")" << std::endl;
+
+        commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
+        << "Rank : " << Rank
+        << " over GF (" << card << ")" << std::endl;
+        commentator().stop ("done", 0, "IPLR");
+        return Rank;
+    }
+
+
+
+    template <class _Field>
+    template <class Matrix, class Perm> inline unsigned long&
+    GaussDomain<_Field>::InPlaceLinearPivoting (unsigned long &Rank,
+                            Element        &determinant,
+                            Matrix         &LigneA,
+                            Perm           &P,
+                            unsigned long   Ni,
+                            unsigned long   Nj) const
+    {
+        typedef typename Matrix::Row        Vector;
+
+        // Requirements : LigneA is an array of sparse rows
+        // In place (LigneA is modified)
+        // With reordering (D is a density type. Density is allocated here)
+        //    long Ni = LigneA.n_row (), Nj = LigneA.n_col ();
+        commentator().start ("IPperm Gaussian elimination with reordering",
+                     "IPLR", Ni);
+        field().write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
+                   << "Gaussian elimination on " << Ni << " x " << Nj << " matrix, over: ") << std::endl;
 
 #ifdef __LINBOX_COUNT__
-			long long nbelem = 0;
+        long long nbelem = 0;
 #endif
 
-			_field.init(determinant,1UL);
-			// allocation of the column density
-			std::vector<size_t> col_density (Nj);
+        field().assign(determinant,field().one);
+        // allocation of the column density
+        std::vector<size_t> col_density (Nj);
 
-			// assignment of LigneA with the domain object
-			for (unsigned long jj = 0; jj < Ni; ++jj)
-				for (unsigned long k = 0; k < LigneA[jj].size (); k++)
-					++col_density[LigneA[jj][k].first];
+        // assignment of LigneA with the domain object
+        for (unsigned long jj = 0; jj < Ni; ++jj)
+            for (unsigned long k = 0; k < LigneA[(size_t)jj].size (); k++)
+                ++col_density[LigneA[(size_t)jj][k].first];
 
-			long last = (long)Ni - 1;
-			long c;
-			Rank = 0;
+        const long last = (long)Ni - 1;
+        long c;
+        Rank = 0;
 
 #ifdef __LINBOX_OFTEN__
-			long sstep = last/40;
-			if (sstep > __LINBOX_OFTEN__) sstep = __LINBOX_OFTEN__;
+        long sstep = last/40;
+        if (sstep > __LINBOX_OFTEN__) sstep = __LINBOX_OFTEN__;
 #else
-			long sstep = 1000;
+        long sstep = 1000;
 #endif
-			// Elimination steps with reordering
-			for (long k = 0; k < last; ++k) {
-				unsigned long l;
-				long p = k, s = LigneA[k].size (), sl;
+        // Elimination steps with reordering
+        for (long k = 0; k < last; ++k) {
+            long p = k, s =(long) LigneA[(size_t)k].size ();
 
 #ifdef __LINBOX_FILLIN__
-				if ( ! (k % 100) )
+            if ( ! (k % 100) )
+            {
+                unsigned long l;
+                long sl;
+                commentator().progress (k);
+                for (sl = 0, l = 0; l < Ni; ++l)
+                    sl +=(long) LigneA[(size_t)l].size ();
+
+                commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
+                << "Fillin (" << Rank << "/" << Ni << ") = "
+                << sl
+                << " (" << double(sl)*100.0/double(Ni-k)/double(Nj-k) << "%, "
+                << double(sl)/double(Ni-k) << " avg)"
+                << std::endl;
+
+            }
 #else
-				if ( ! (k % sstep) )
-#endif
-				{
-					commentator().progress (k);
-#ifdef __LINBOX_FILLIN__
-					for (sl = 0, l = 0; l < Ni; ++l)
-						sl += LigneA[l].size ();
-
-					commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
-					<< "Fillin (" << Rank << "/" << Ni << ") = "
-					<< sl
-					<< " (" << double(sl)*100.0/double(Ni-k)/double(Nj-k) << "%, "
-					<< double(sl)/double(Ni-k) << " avg)"
-					<< std::endl;
+            if ( ! (k % sstep) )
+            {
+                commentator().progress (k);
+            }
 #endif
-				}
-
-				if (s) {
-					// Row permutation for the sparsest row
-					for (l = (unsigned long)k + 1; l < (unsigned long)Ni; ++l)
-						if (((sl = LigneA[l].size ()) < s) && (sl)) {
-							s = sl;
-							p = (long)l;
-						}
-
-					if (p != k) {
-						_field.negin(determinant);
-						Vector vtm = LigneA[k];
-						LigneA[k] = LigneA[p];
-						LigneA[p] = vtm;
-					}
-
-					//                     LigneA.write(std::cerr << "BEF, k:" << k << ", Rank:" << Rank << ", c:" << c)<<std::endl;
-
-					SparseFindPivot (LigneA[k], Rank, c, col_density, determinant);
-					//                     LigneA.write(std::cerr << "PIV, k:" << k << ", Rank:" << Rank << ", c:" << c)<<std::endl;
-					if (c != -1) {
-						if ( c != (static_cast<long>(Rank)-1) )
-							P.permute(Rank-1,c);
-						for (long ll=0; ll < k ; ++ll)
-							permute( LigneA[ll], Rank, c);
-
-						for (l = (unsigned long)k + 1; l < (unsigned long)Ni; ++l)
-							eliminate (LigneA[l], LigneA[k], Rank, c, col_density);
-					}
-
-					//                     LigneA.write(std::cerr << "AFT " )<<std::endl;
+
+
+            if (s) {
+                unsigned long l;
+                // Row permutation for the sparsest row
+                for (l = (unsigned long)k + 1; l < (unsigned long)Ni; ++l) {
+                long sl;
+                    if (((sl =(long) LigneA[(size_t)l].size ()) < s) && (sl)) {
+                        s = sl;
+                        p = (long)l;
+                    }
+                    }
+
+                if (p != k) {
+                    field().negin(determinant);
+                    Vector vtm = LigneA[(size_t)k];
+                    LigneA[(size_t)k] = LigneA[(size_t)p];
+                    LigneA[(size_t)p] = vtm;
+                }
+
+                //                     LigneA.write(std::cerr << "BEF, k:" << k << ", Rank:" << Rank << ", c:" << c)<<std::endl;
+
+                SparseFindPivot (LigneA[(size_t)k], Rank, c, col_density, determinant);
+                //                     LigneA.write(std::cerr << "PIV, k:" << k << ", Rank:" << Rank << ", c:" << c)<<std::endl;
+                if (c != -1) {
+                    if ( c != (static_cast<long>(Rank)-1) )
+                        P.permute(Rank-1,(size_t)c);
+                    for (long ll=0; ll < k ; ++ll)
+                        permute( LigneA[(size_t)ll], Rank, c);
+
+                    for (l = (unsigned long)k + 1; l < (unsigned long)Ni; ++l)
+                        eliminate (LigneA[(size_t)l], LigneA[(size_t)k], Rank, c, col_density);
+                }
+
+                //                     LigneA.write(std::cerr << "AFT " )<<std::endl;
 #ifdef __LINBOX_COUNT__
-					nbelem += LigneA[k].size ();
+                nbelem += LigneA[(size_t)k].size ();
 #endif
-				}
+            }
 
-			}//for k
+        }//for k
 
-			SparseFindPivot (LigneA[last], Rank, c, determinant);
-			if ( (c != -1) && (c != (static_cast<long>(Rank)-1) ) ) {
-				P.permute(Rank-1,c);
-				for (long ll=0; ll < last ; ++ll)
-					permute( LigneA[ll], Rank, c);
-			}
+        SparseFindPivot (LigneA[(size_t)last], Rank, c, determinant);
+        if ( (c != -1) && (c != (static_cast<long>(Rank)-1) ) ) {
+            P.permute(Rank-1,(size_t)c);
+            for (long ll=0; ll < last ; ++ll)
+                permute( LigneA[(size_t)ll], Rank, c);
+        }
 
 
 #ifdef __LINBOX_COUNT__
-			nbelem += LigneA[last].size ();
-			commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
-			<< "Left elements : " << nbelem << std::endl;
+        nbelem += LigneA[(size_t)last].size ();
+        commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
+        << "Left elements : " << nbelem << std::endl;
 #endif
 
 #ifdef __LINBOX_FILLIN__
-			long sl(0);
-			for (size_t l=0; l < Ni; ++l)
-				sl += LigneA[l].size ();
+        long sl(0);
+        for (size_t l=0; l < Ni; ++l)
+            sl +=(long) LigneA[(size_t)l].size ();
 
-			commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
-			<< "Fillin (" << Rank << "/" << Ni << ") = " << sl
-			<< std::endl;
+        commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
+        << "Fillin (" << Rank << "/" << Ni << ") = " << sl
+        << std::endl;
 #endif
 
-			integer card;
-
-			if ((Rank < Ni) || (Rank < Nj) || (Ni == 0) || (Nj == 0))
-				_field.init(determinant,0UL);
-
-			_field.write(commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
-				 << "Determinant : ", determinant)
-			<< " over GF (" << _field.cardinality (card) << ")" << std::endl;
-
-			commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
-			<< "Rank : " << Rank
-			<< " over GF (" << card << ")" << std::endl;
-			commentator().stop ("done", 0, "IPLR");
-			return Rank;
-		}
-
-		template <class _Field>
-		template <class Matrix> inline unsigned long&
-		GaussDomain<_Field>::NoReordering (unsigned long &res,
-						   Element       &determinant,
-						   Matrix        &LigneA,
-						   unsigned long  Ni,
-						   unsigned long  Nj) const
-		{
-			// Requirements : SLA is an array of sparse rows
-			// IN PLACE.
-			// Without reordering (Pivot is first non-zero in row)
-			//     long Ni = SLA.n_row (), Nj = SLA.n_col ();
-			//    long Ni = LigneA.n_row (), Nj = LigneA.n_col ();
-			commentator().start ("Gaussian elimination (no reordering)",
-					   "NoRe", Ni);
-			commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
-			<< "Gaussian elimination on " << Ni << " x " << Nj << " matrix" << std::endl;
-
-			typedef typename Matrix::Row          Vector;
-			typedef typename Vector::value_type   E;
-			// typedef typename Matrix::Element      Elem;
+        integer card;
+
+        if ((Rank < Ni) || (Rank < Nj) || (Ni == 0) || (Nj == 0))
+            field().assign(determinant,field().zero);
+
+        field().write(commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
+                  << "Determinant : ", determinant)
+        << " over GF (" << field().cardinality (card) << ")" << std::endl;
+
+        commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
+        << "Rank : " << Rank
+        << " over GF (" << card << ")" << std::endl;
+        commentator().stop ("done", 0, "IPLR");
+        return Rank;
+    }
+
+    template <class _Field>
+    template <class Matrix> inline unsigned long&
+    GaussDomain<_Field>::NoReordering (unsigned long &res,
+                       Element       &determinant,
+                       Matrix        &LigneA,
+                       unsigned long  Ni,
+                       unsigned long  Nj) const
+    {
+        // Requirements : SLA is an array of sparse rows
+        // IN PLACE.
+        // Without reordering (Pivot is first non-zero in row)
+        //     long Ni = SLA.n_row (), Nj = SLA.n_col ();
+        //    long Ni = LigneA.n_row (), Nj = LigneA.n_col ();
+        commentator().start ("Gaussian elimination (no reordering)",
+                     "NoRe", Ni);
+        commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
+        << "Gaussian elimination on " << Ni << " x " << Nj << " matrix" << std::endl;
+
+        typedef typename Matrix::Row          Vector;
+        // typedef typename Vector::value_type   E;
+        // typedef typename Matrix::Element      Elem;
 
 #ifdef __LINBOX_COUNT__
-			long long nbelem = 0;
+        long long nbelem = 0;
 #endif
-			Vector Vzer (0);
+        Vector Vzer (0);
 
-			_field.init(determinant,1UL);
-			long last = (long)Ni - 1;
-			long c;
-			unsigned long indcol (0);
+        field().assign(determinant,field().one);
+        const long last = (long)Ni - 1;
+        long c;
+        unsigned long indcol (0);
 
-			for (long k = 0; k < last; ++k) {
-				if (!(k % 1000))
-					commentator().progress (k);
+        for (long k = 0; k < last; ++k) {
+            if (!(k % 1000))
+                commentator().progress (k);
 
-				unsigned long l;
 
-				if (!LigneA[k].empty ()) {
-					SparseFindPivot (LigneA[k], indcol, c, determinant);
-					if (c !=  -1)
-						for (l = (unsigned long)k + 1; l < (unsigned long)Ni; ++l)
-							eliminate (LigneA[l], LigneA[k], indcol, c);
+            if (!LigneA[(size_t)k].empty ()) {
+                SparseFindPivot (LigneA[(size_t)k], indcol, c, determinant);
+                if (c !=  -1) {
+                    unsigned long l;
+                    for (l = (unsigned long)k + 1; l < (unsigned long)Ni; ++l)
+                        eliminate (LigneA[(size_t)l], LigneA[(size_t)k], indcol, c);
+                }
 
 #ifdef __LINBOX_COUNT__
-					nbelem += LigneA[k].size ();
+                nbelem += LigneA[(size_t)k].size ();
 #endif
-					LigneA[k] = Vzer;
-				}
-			}
+                LigneA[(size_t)k] = Vzer;
+            }
+        }
 
-			SparseFindPivot ( LigneA[last], indcol, c, determinant);
+        SparseFindPivot ( LigneA[(size_t)last], indcol, c, determinant);
 
 #ifdef __LINBOX_COUNT__
-			nbelem += LigneA[last].size ();
-			commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
-			<< "Left elements : " << nbelem << std::endl;
+        nbelem += LigneA[(size_t)last].size ();
+        commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
+        << "Left elements : " << nbelem << std::endl;
 #endif
 
-			res = indcol;
-
-			if ((res < Ni) || (res < Nj))
-				if ((res < Ni) || (res < Nj) || (Ni == 0) || (Nj == 0))
-					_field.init(determinant,0UL);
-
-			integer card;
-
-			_field.write(commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
-				 << "Determinant : ", determinant)
-			<< " over GF (" << _field.cardinality (card) << ")" << std::endl;
-
-			commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
-			<< "Rank : " << res
-			<< " over GF (" << card << ")" << std::endl;
-			commentator().stop ("done", 0, "NoRe");
-			return res;
-		}
-
-
-		template <class _Field>
-		template<class Vector> inline void
-		GaussDomain<_Field>::Upper (Vector        &lignecur,
-					    const Vector  &lignepivot,
-					    unsigned long  indcol,
-					    long  indpermut) const
-		{
-			static typename _Field::Element zero = _field.init(zero);
-
-			long n = lignecur.size () ;
-			long k = (long) indcol - 1 ;
-
-			// permutation if one has been performed to compute the pivot
-			if (indpermut != k) {
-				typename Vector::value_type tmp = lignecur[k];
-				lignecur[k] = lignecur[indpermut];
-				lignecur[indpermut] = tmp;
-			}
-
-			typename Vector::value_type headcoeff;
-			_field.divin (_field.neg (headcoeff, lignecur[k]), lignepivot[k]);
-
-
-
-			// LU in place
-			_field.assign (lignecur[k], zero);
-			for (long j = k; ++j < n;)
-				_field.axpyin (lignecur[j], headcoeff, lignepivot[j]) ;
-		}
-
-		template <class _Field>
-		template <class Vector> inline void
-		GaussDomain<_Field>::LU (Vector        &lignecur,
-					 const Vector  &lignepivot,
-					 unsigned long  indcol,
-					 long  indpermut) const
-		{
-			long n = lignecur.size ();
-			long k = (long) indcol - 1;
-
-			// permutation if one has been performed to compute the pivot
-			if (indpermut != k) {
-				typename Vector::value_type tmp = lignecur[k];
-				lignecur[k] = lignecur[indpermut];
-				lignecur[indpermut] = tmp;
-			}
-
-			typename Vector::value_type headcoeff;
-			// LU in place
-			_field.div (headcoeff, lignecur[k], lignepivot[k]);
-			_field.assign (lignecur[k], headcoeff);
-			_field.negin (headcoeff);
-			for (long j = k; ++j < n;)
-				_field.axpyin (lignecur[j],headcoeff,lignepivot[j]);
-		}
-
-
-		template <class _Field>
-		template <class Matrix> inline unsigned long &
-		GaussDomain<_Field>::upperin (unsigned long &res, Matrix &A) const
-		{
-			// Requirements : A is an array of rows
-			// In place (A is modified)
-			// Without reordering (Pivot is first non-zero in row)
-			long Ni = A.rowdim ();
-			long last = Ni - 1;
-			long c;
-			unsigned long indcol = 0;
-
-			for (long k = 0; k < last; ++k) {
-				FindPivot (A[k], indcol, c);
-				if (c != -1)
-					for (long l = k + 1; l < Ni; ++l)
-						Upper (A[l], A[k], indcol, c);
-			}
-
-			FindPivot (A[last], indcol, c);
-			return res = indcol;
-		}
-
-		template <class _Field>
-		template <class Matrix> inline unsigned long &
-		GaussDomain<_Field>::LUin (unsigned long &res, Matrix &A) const
-		{
-			// Requirements : A is an array of rows
-			// In place (A is modified)
-			// Without reordering (Pivot is first non-zero in row)
-
-			long Ni = A.rowdim ();
-			long last = Ni - 1;
-			long c;
-			unsigned long indcol = 0;
-
-			for (long k = 0; k < last; ++k) {
-				FindPivot (A[k], indcol, c);
-				if (c != -1)
-					for (long l = k + 1; l < Ni; ++l)
-						LU (A[l], A[k], indcol, c);
-			}
-
-			FindPivot (A[last], indcol, c);
-			return res = indcol;
-		}
-
-
-	} // namespace LinBox
+        res = indcol;
+
+        if ((res < Ni) || (res < Nj))
+            if ((res < Ni) || (res < Nj) || (Ni == 0) || (Nj == 0))
+                field().assign(determinant,field().zero);
+
+        integer card;
+
+        field().write(commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
+                  << "Determinant : ", determinant)
+        << " over GF (" << field().cardinality (card) << ")" << std::endl;
+
+        commentator().report (Commentator::LEVEL_NORMAL, PARTIAL_RESULT)
+        << "Rank : " << res
+        << " over GF (" << card << ")" << std::endl;
+        commentator().stop ("done", 0, "NoRe");
+        return res;
+    }
+
+
+    template <class _Field>
+    template<class Vector> inline void
+    GaussDomain<_Field>::Upper (Vector        &lignecur,
+                    const Vector  &lignepivot,
+                    unsigned long  indcol,
+                    long  indpermut) const
+    {
+
+        long n = lignecur.size () ;
+        long k = (long) indcol - 1 ;
+
+        // permutation if one has been performed to compute the pivot
+        if (indpermut != k) {
+            typename Vector::value_type tmp = lignecur[k];
+            lignecur[k] = lignecur[indpermut];
+            lignecur[indpermut] = tmp;
+        }
+
+        typename Vector::value_type headcoeff;
+        field().divin (field().neg (headcoeff, lignecur[k]), lignepivot[k]);
+
+
+
+        // LU in place
+        field().assign (lignecur[k], field().zero);
+        for (long j = k; ++j < n;)
+            field().axpyin (lignecur[j], headcoeff, lignepivot[j]) ;
+    }
+
+    template <class _Field>
+    template <class Vector> inline void
+    GaussDomain<_Field>::LU (Vector        &lignecur,
+                 const Vector  &lignepivot,
+                 unsigned long  indcol,
+                 long  indpermut) const
+    {
+        long n = lignecur.size ();
+        long k = (long) indcol - 1;
+
+        // permutation if one has been performed to compute the pivot
+        if (indpermut != k) {
+            typename Vector::value_type tmp = lignecur[k];
+            lignecur[k] = lignecur[indpermut];
+            lignecur[indpermut] = tmp;
+        }
+
+        typename Vector::value_type headcoeff;
+        // LU in place
+        field().div (headcoeff, lignecur[k], lignepivot[k]);
+        field().assign (lignecur[k], headcoeff);
+        field().negin (headcoeff);
+        for (long j = k; ++j < n;)
+            field().axpyin (lignecur[j],headcoeff,lignepivot[j]);
+    }
+
+
+    template <class _Field>
+    template <class Matrix> inline unsigned long &
+    GaussDomain<_Field>::upperin (unsigned long &res, Matrix &A) const
+    {
+        // Requirements : A is an array of rows
+        // In place (A is modified)
+        // Without reordering (Pivot is first non-zero in row)
+        long Ni = A.rowdim ();
+        const long last = Ni - 1;
+        long c;
+        unsigned long indcol = 0;
+
+        for (long k = 0; k < last; ++k) {
+            FindPivot (A[k], indcol, c);
+            if (c != -1)
+                for (long l = k + 1; l < Ni; ++l)
+                    Upper (A[l], A[k], indcol, c);
+        }
+
+        FindPivot (A[last], indcol, c);
+        return res = indcol;
+    }
+
+    template <class _Field>
+    template <class Matrix> inline unsigned long &
+    GaussDomain<_Field>::LUin (unsigned long &res, Matrix &A) const
+    {
+        // Requirements : A is an array of rows
+        // In place (A is modified)
+        // Without reordering (Pivot is first non-zero in row)
+
+        long Ni = A.rowdim ();
+        const long last = Ni - 1;
+        long c;
+        unsigned long indcol = 0;
+
+        for (long k = 0; k < last; ++k) {
+            FindPivot (A[k], indcol, c);
+            if (c != -1)
+                for (long l = k + 1; l < Ni; ++l)
+                    LU (A[l], A[k], indcol, c);
+        }
+
+        FindPivot (A[last], indcol, c);
+        return res = indcol;
+    }
+
+
+} // namespace LinBox
+
 
 #endif // __LINBOX_gauss_INL
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/hybrid-det.h b/linbox/algorithms/hybrid-det.h
index 1376bbc..3f67bd1 100644
--- a/linbox/algorithms/hybrid-det.h
+++ b/linbox/algorithms/hybrid-det.h
@@ -29,12 +29,12 @@
 #include "linbox/linbox-config.h"
 #include "linbox/util/debug.h"
 
-#include "linbox/blackbox/sparse.h"
-#include "linbox/field/PID-integer.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "givaro/zring.h"
 #include "linbox/randiter/random-prime.h"
 #include "linbox/algorithms/rational-solver.h"
 #include "linbox/algorithms/last-invariant-factor.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 #include "linbox/algorithms/cra-domain.h"
 #include "linbox/randiter/random-prime.h"
 #include "linbox/algorithms/matrix-hom.h"
@@ -49,19 +49,21 @@ namespace LinBox
 	struct IntegerModularDetReduced {
 	private:
 
-		const Blackbox &A;
-		const MyMethod &M;
+		const                        Blackbox &A;
+		const                        MyMethod &M;
 		/* contains the factor by which to divide det */
-		integer beta;
+		integer                             beta;
 
-		size_t factor;
-		size_t iter_count;
-		size_t iter_count2;
-		typename Vector<PID_integer>::Dense moduli;
+		size_t                            factor;
+		Givaro::ZRing<Integer>                           ZZ; //! @todo is it \c A.field()?
+		size_t                        iter_count;
+		size_t                       iter_count2;
+		typedef  BlasVector<Givaro::ZRing<Integer> >  IVect ;
+		IVect                            moduli ;
 
 	public:
 
-		typename Vector<PID_integer>::Dense primes;
+		IVect                            primes ;
 
 		size_t iterations()
 		{
@@ -74,18 +76,15 @@ namespace LinBox
 		}
 
 
-#if 0
-		int iter_count;
-		int iter_count2;
-		Vector <PID_integer>:: Dense moduli;
-		Vector <PID_integer>:: Dense primes;
-#endif
-
-		IntegerModularDetReduced(const Blackbox& b, const MyMethod& n, const integer& divisor, const size_t& f) :
-			A(b), M(n), beta(divisor), factor(f)
+		IntegerModularDetReduced(const Blackbox& b, const MyMethod& n, const integer& divisor, const size_t& fs) :
+			A(b), M(n)
+			, beta(divisor)
+			, factor(fs)
+			,ZZ(Givaro::ZRing<Integer>())
+			,moduli(ZZ,fs),primes(ZZ,fs)
 		{
-			moduli.resize(factor);
-			primes.resize(factor);
+			// moduli.resize(factor);
+			// primes.resize(factor);
 			iter_count = 0;
 			iter_count2 = 0;
 
@@ -155,7 +154,7 @@ namespace LinBox
 							 const MyMethod                            &M)
 	{
 		//commentator().setReportStream(std::cout);
-		typedef Modular<double> myModular;
+		typedef Givaro::Modular<double> mymodular;
 		typedef typename Blackbox::Field Integers;
 		typedef typename Integers::Element Integer_t;
 
@@ -174,7 +173,7 @@ namespace LinBox
 
 		RandomPrimeIterator genprime( (Integer_t)p_size );
 		//cout << "prime size: " << p_size << "\n";
-		EarlySingleCRA<myModular> cra(4UL);
+		EarlySingleCRA<mymodular> cra(4UL);
 		IntegerModularDetReduced<Blackbox,MyMethod> iteration(A, M, beta,myfactor);
 
 #if 0
@@ -195,10 +194,10 @@ namespace LinBox
 #endif
 		{
 			++genprime;
-			myModular D(*genprime);
+			mymodular D(*genprime);
 			iteration.primes[early_counter] = *genprime;
-			myModular::Element r;
-			D.init(r,0);
+			mymodular::Element r;
+			D.assign(r,D.zero);
 			cra.initialize( D, iteration(r, D));
 			++early_counter;
 		}
@@ -206,11 +205,11 @@ namespace LinBox
 		while ( early_counter < myfactor && !cra.terminated() ) {
 			++genprime;
 			while (cra.noncoprime(*genprime)) ++genprime;
-			myModular D(*genprime);
+			mymodular D(*genprime);
 			iteration.primes[early_counter] = *genprime;
 			// prime(p, early_counter);
-			myModular::Element r;
-			D.init(r,0);
+			mymodular::Element r;
+			D.assign(r,D.zero);
 			cra.progress( D, iteration(r, D));
 			++early_counter;
 		}
@@ -236,11 +235,11 @@ namespace LinBox
 		if (A.rowdim() < 50 ) {
 			while ( !cra.terminated() ) {
 				genprime.randomPrime(p);
-				myModular D(p);
+				mymodular D(p);
 				iteration.primes[early_counter] = p;
 				//		prime(p, early_counter);
-				myModular::Element r;
-				D.init(r,0);
+				mymodular::Element r;
+				D.assign(r,D.zero);
 				cra.progress( D, iteration(r, D));
 				++early_counter;
 			}
@@ -252,13 +251,13 @@ namespace LinBox
 
 		RandomPrime genprime1( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
 		Integers ZZ;
-		RationalSolver < Integers , myModular, RandomPrime, DixonTraits > RSolver(A. field(), genprime);
+		RationalSolver < Integers , mymodular, RandomPrime, DixonTraits > RSolver(A. field(), genprime);
 #endif
-		RationalSolver < Integers , myModular, RandomPrimeIterator, DixonTraits > RSolver;
+		RationalSolver < Integers , mymodular, RandomPrimeIterator, DixonTraits > RSolver;
 
-		typename Vector<Integers>:: Dense r_num1 (A. coldim());
+		BlasVector<Integers> r_num1 (A.field(),A. coldim());
 
-		LastInvariantFactor < Integers ,RationalSolver < Integers, myModular, RandomPrimeIterator, DixonTraits > >  LIF(RSolver);
+		LastInvariantFactor < Integers ,RationalSolver < Integers, mymodular, RandomPrimeIterator, DixonTraits > >  LIF(RSolver);
 #ifdef _LB_H_DET_TIMING
 		BT.start();
 #endif
@@ -297,14 +296,14 @@ namespace LinBox
 		iteration.Beta(beta);
 
 		//RandomPrime genprime2( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
-		EarlySingleCRA< Modular<double> > cra2(4UL);
+		EarlySingleCRA< Givaro::Modular<double> > cra2(4UL);
 		Integer_t k = 1;
 
 		early_counter = 0;
 		while ( early_counter < myfactor && !cra2.terminated() ) {
-			myModular D(iteration.primes[early_counter]);
-			myModular::Element r;
-			D.init(r,0);
+			mymodular D(iteration.primes[early_counter]);
+			mymodular::Element r;
+			D.assign(r,D.zero);
 			cra2.progress( D, iteration(r, D) );
 			++early_counter;
 		}
@@ -318,7 +317,7 @@ namespace LinBox
 
 		}
 		else  if (0/* time2 < a*log2(lif)*time1/p_size*/) {
-			typename Vector<Integers>:: Dense r_num2 (A. coldim());
+			BlasVector<Integers> r_num2 (A.field(),A. coldim());
 			Integer_t lif2=1;
 			LIF.lastInvariantFactor1(lif2,r_num2,A);
 			LIF.bonus(bonus,lif, lif2, r_num1,r_num2);
@@ -334,13 +333,13 @@ namespace LinBox
 				//iteration.Moduli(moduli);
 				//iteration.Primes(primes);
 				k=1;
-				EarlySingleCRA< Modular<double> > cra3(4UL);
+				EarlySingleCRA< Givaro::Modular<double> > cra3(4UL);
 
 				early_counter = 0;
 				while ( (early_counter < myfactor) && (!cra3.terminated() )) {
-					myModular D(iteration.primes[early_counter]);
-					myModular::Element r;
-					D.init(r,0);
+					mymodular D(iteration.primes[early_counter]);
+					mymodular::Element r;
+					D.assign(r,D.zero);
 					cra3.progress( D, iteration(r, D));
 					++early_counter;
 					//iteration.Inc();
@@ -361,9 +360,9 @@ namespace LinBox
 					while (!cra3.terminated()) {
 						++genprime;
 						while (cra3.noncoprime(*genprime)) ++genprime;
-						myModular D(*genprime);
-						myModular::Element r;
-						D.init(r,0);
+						mymodular D(*genprime);
+						mymodular::Element r;
+						D.assign(r,D.zero);
 						cra3.progress( D, iteration(r, D));
 					}
 					cra3.result(k);
@@ -378,9 +377,9 @@ namespace LinBox
 				while (!cra2.terminated()) {
 					++genprime;
 					while (cra2.noncoprime(*genprime)) ++genprime;
-					myModular D(*genprime);
-					myModular::Element r;
-					D.init(r,0);
+					mymodular D(*genprime);
+					mymodular::Element r;
+					D.assign(r,D.zero);
 					cra2.progress( D, iteration(r, D));
 				}
 				cra2.result(k);
@@ -393,9 +392,9 @@ namespace LinBox
 			while (!cra2.terminated()) {
 				++genprime;
 				while (cra2.noncoprime(*genprime)) ++genprime;
-				myModular D(*genprime);
-				myModular::Element r;
-				D.init(r,0);
+				mymodular D(*genprime);
+				mymodular::Element r;
+				D.assign(r,D.zero);
 				cra2.progress( D, iteration(r, D));
 			}
 			cra2.result(k);
@@ -437,8 +436,8 @@ namespace LinBox
 	{
 
 		//commentator().setReportStream(std::cout);
-		typedef Modular<double> myModular;
-		//typedef PID_integer Integers;
+		typedef Givaro::Modular<double> mymodular;
+		//typedef Givaro::ZRing<Integer> Integers;
 		typedef typename Integers::Element Integer;
 
 		commentator().start ("Integer Determinant - hybrid version for sparse matrices", "det");
@@ -456,7 +455,7 @@ namespace LinBox
 
 		RandomPrime genprime( (Integer)p_size );
 		commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION) << "prime size: " << p_size << "\n";
-		ChineseRemainder< myModular > cra(3UL);
+		ChineseRemainder< mymodular > cra(3UL);
 		IntegerModularDetReduced<SparseMatrix<Integers >,MyMethod> iteration(A, M, beta,myfactor);
 #if 0
 		if (A.rowdim() < 200 ) {
@@ -475,21 +474,21 @@ namespace LinBox
 		BT.start();
 
                 genprime.randomPrime(p);
-                myModular D(p);
+                mymodular D(p);
                 iteration.primes[early_counter] = p;
-                myModular::Element r;
-                D.init(r,0);
+                mymodular::Element r;
+                D.assign(r,D.zero);
                 cra.initialize( D, iteration(r, D));
                 ++early_counter;
 
 		while ( early_counter < myfactor && !cra.terminated() ) {
 			genprime.randomPrime(p);
 			while (cra.noncoprime(p)) genprime.randomPrime(p);
-			myModular D(p);
+			mymodular D(p);
 			iteration.primes[early_counter] = p;
 			//          prime(p, early_counter);
-			myModular::Element r;
-			D.init(r,0);
+			mymodular::Element r;
+			D.assign(r,D.zero);
 			cra.progress( D, iteration(r, D));
 			++early_counter;
 		}
@@ -512,11 +511,11 @@ namespace LinBox
 		if (A.rowdim() < 50 ) {
 			while ( !cra.terminated() ) {
 				genprime.randomPrime(p);
-				myModular D(p);
+				mymodular D(p);
 				iteration.primes[early_counter] = p;
 				//          prime(p, early_counter);
-				myModular::Element r;
-				D.init(r,0);
+				mymodular::Element r;
+				D.assign(r,D.zero);
 				cra.progress( D, iteration(r, D));
 				++early_counter;
 			}
@@ -529,7 +528,7 @@ namespace LinBox
 		RandomPrime genprime1( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
 		Integers ZZ;
 #endif
-		typedef RationalSolver < Integers , myModular, RandomPrime, BlockHankelTraits > Solver;
+		typedef RationalSolver < Integers , mymodular, RandomPrime, BlockHankelTraits > Solver;
 		Solver RSolver(A. field(), genprime);
 
 		typename Vector<Integers>:: Dense r_num1 (A. coldim());
@@ -568,14 +567,14 @@ namespace LinBox
 		iteration.Beta(beta);
 
 		//RandomPrime genprime2( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
-		ChineseRemainder< Modular<double> > cra2(3UL);
+		ChineseRemainder< Givaro::Modular<double> > cra2(3UL);
 		Integer k = 1;
 
 		early_counter = 0;
 		while ( early_counter < myfactor && !cra2.terminated() ) {
-			myModular D(iteration.primes[early_counter]);
-			myModular::Element r;
-			D.init(r,0);
+			mymodular D(iteration.primes[early_counter]);
+			mymodular::Element r;
+			D.assign(r,D.zero);
 			cra2.progress( D, iteration(r, D));
 			++early_counter;
 		}
@@ -605,13 +604,13 @@ namespace LinBox
 				//iteration.Moduli(moduli);
 				//iteration.Primes(primes);
 				k=1;
-				ChineseRemainder< Modular<double> > cra3(3UL);
+				ChineseRemainder< Givaro::Modular<double> > cra3(3UL);
 
 				early_counter = 0;
 				while ( (early_counter < myfactor) && (!cra3.terminated() )) {
-					myModular D(iteration.primes[early_counter]);
-					myModular::Element r;
-					D.init(r,0);
+					mymodular D(iteration.primes[early_counter]);
+					mymodular::Element r;
+					D.assign(r,D.zero);
 					cra3.progress( D, iteration(r, D));
 					++early_counter;
 					//iteration.Inc();
@@ -632,9 +631,9 @@ namespace LinBox
 					while (!cra3.terminated()) {
 						genprime.randomPrime(p);
 						while (cra3.noncoprime(p)) genprime.randomPrime(p);
-						myModular D(p);
-						myModular::Element r;
-						D.init(r,0);
+						mymodular D(p);
+						mymodular::Element r;
+						D.assign(r,D.zero);
 						cra3.progress( D, iteration(r, D));
 					}
 					cra3.result(k);
@@ -649,9 +648,9 @@ namespace LinBox
 				while (!cra2.terminated()) {
 					genprime.randomPrime(p);
 					while (cra2.noncoprime(p)) genprime.randomPrime(p);
-					myModular D(p);
-					myModular::Element r;
-					D.init(r,0);
+					mymodular D(p);
+					mymodular::Element r;
+					D.assign(r,D.zero);
 					cra2.progress( D, iteration(r, D));
 				}
 				cra2.result(k);
@@ -664,9 +663,9 @@ namespace LinBox
 			while (!cra2.terminated()) {
 				genprime.randomPrime(p);
 				while (cra2.noncoprime(p)) genprime.randomPrime(p);
-				myModular D(p);
-				myModular::Element r;
-				D.init(r,0);
+				mymodular D(p);
+				mymodular::Element r;
+				D.assign(r,D.zero);
 				cra2.progress( D, iteration(r, D));
 			}
 			cra2.result(k);
@@ -709,11 +708,10 @@ namespace LinBox
 
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/iml.doxy b/linbox/algorithms/iml.doxy
new file mode 100644
index 0000000..53fe717
--- /dev/null
+++ b/linbox/algorithms/iml.doxy
@@ -0,0 +1,29 @@
+// Copyright (C) 2013 LinBox, GNU LGPL, see COPYING for licence information
+/*
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/** @ingroup algorithms
+  @defgroup iml IML
+  @brief NO DOC YET
+
+
+ */
+
+// vim:syntax=doxygen
diff --git a/linbox/algorithms/invariant-factors.h b/linbox/algorithms/invariant-factors.h
new file mode 100644
index 0000000..9a96bb1
--- /dev/null
+++ b/linbox/algorithms/invariant-factors.h
@@ -0,0 +1,271 @@
+/* linbox/algorithms/coppersmith-invariant-factors.h
+ * Copyright (C) 2015 Gavin Harrison
+ *
+ * Written by Gavin Harrison <gavin.har at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_invariant_factors_H
+#define __LINBOX_invariant_factors_H
+
+#include "linbox/algorithms/block-coppersmith-domain.h"
+#include "linbox/algorithms/blackbox-block-container.h"
+#include "linbox/matrix/random-matrix.h"
+
+#include <givaro/givpoly1.h>
+#include <linbox/ring/givaro-poly.h>
+#include <linbox/algorithms/smith-form-kannan-bachem.h>
+#include <linbox/algorithms/smith-form-iliopoulos2.h>
+
+#include <givaro/givtimer.h>
+
+namespace LinBox
+{
+
+template<class _Field, class _Blackbox>
+class InvariantFactors {
+public:
+	typedef _Field Field;
+	typedef _Blackbox Blackbox;
+	typedef MatrixDomain<Field> Domain;
+	typedef typename Domain::OwnMatrix Block;
+	typedef typename Field::RandIter RandIter;
+	typedef Givaro::Poly1Dom<Field,Givaro::Dense> PolyDom;
+	typedef GivaroPoly<PolyDom> PolyRing;
+	typedef typename PolyRing::Element PolyElement;
+	typedef MatrixDomain<PolyRing> PolyMatDom;
+	typedef typename PolyMatDom::OwnMatrix PolyBlock;
+	typedef RandomDenseMatrix<RandIter, Field> RandomMatrix;
+	typedef SmithFormKannanBachemDomain<PolyMatDom> SmithKbDomain;
+	typedef BlackboxBlockContainer<Field,Blackbox> Sequence;
+	typedef BlockCoppersmithDomain<Domain, Sequence> CoppersmithDomain;
+	typedef IliopoulosDomain<PolyRing> IliopoulosDom;
+	
+protected:
+	Domain _MD;
+	Field _F;
+	RandIter _RI;
+	RandomMatrix _RDM;
+	PolyDom _PD;
+	PolyRing _R;
+	PolyMatDom _PMD;
+	SmithKbDomain _SFKB;
+	IliopoulosDom _SFI;
+	Givaro::Timer timer;
+	
+public:
+	InvariantFactors(Field &F, PolyRing &R) :
+		_MD(F),
+		_F(F),
+		_RI(F),
+		_RDM(F, _RI),
+		_PD(R.domain()),
+		_R(R),
+		_PMD(R),
+		_SFKB(_PMD),
+		_SFI(R)
+	{
+	}
+
+//protected:
+	void computeGenerator(
+		std::vector<Block> &gen,
+		const Blackbox &M,
+		size_t b,
+		int earlyTerm)
+	{
+		size_t n = M.rowdim();
+		Block U(_F, b, n);
+		Block V(_F, n, b);
+		
+		_RDM.random(U);
+		_RDM.random(V);
+		
+		Sequence blockSeq(&M, _F, U, V);
+		CoppersmithDomain coppersmith(_MD, &blockSeq, earlyTerm);
+		
+		coppersmith.right_minpoly(gen);
+	}
+	
+	void convertSequenceToPolyMatrix(
+		PolyBlock &MM,
+		const std::vector<Block> &gen)
+	{
+		PolyElement temp;
+		size_t d = gen.size();
+		_PD.init(temp, d-1);
+		
+		size_t b = MM.rowdim();
+		for (uint32_t i = 0; i < b; i++) {
+			for (uint32_t j = 0; j < b; j++) {
+				for (uint32_t k = 0; k < d; k++) {
+					_PD.setEntry(temp, gen[k].getEntry(i,j), k);
+				}
+				MM.setEntry(i,j,temp);
+			}
+		}
+	}
+	
+	void modMatrix(PolyBlock &M, const PolyElement &d)
+	{
+		size_t n = M.coldim();
+		
+		for (size_t i = 0; i < n; i++) {
+			for (size_t j = 0; j < n; j++) {
+				PolyElement tmp;
+				M.getEntry(tmp, i, j);
+				_R.modin(tmp, d);
+				M.setEntry(i, j, tmp);
+			}
+		}
+	}
+	
+	template <class PolyRingVector>
+	void computeSmithForm(PolyRingVector &diag, const PolyBlock &M, size_t b)
+	{
+		diag.resize(b);
+		_SFKB.solve(diag, M);
+		
+		for (uint32_t i = 0; i < diag.size(); i++) {
+			_R.normalizeIn(diag[i]);
+		}
+	}
+	
+	template <class PolyRingVector>
+	void computeSmithForm(
+		PolyRingVector &diag,
+		const PolyBlock &M,
+		const PolyElement &d,
+		size_t b)
+	{
+		diag.resize(b);
+		_SFI.smithForm(diag, M, d);
+	}
+	
+	template <class PolyRingVector>
+	void computeFactors(
+		PolyRingVector &diag,
+		const Blackbox &M,
+		size_t b,
+		int earlyTerm = 10)
+	{
+		timer.clear();
+		timer.start();
+		std::vector<Block> gen;
+		computeGenerator(gen, M, b, earlyTerm);
+		timer.stop();
+		
+		std::cout << "Time to compute first generator: "  << timer.usertime();
+		std::cout << std::endl;
+		
+		timer.clear();
+		
+		timer.start();
+		PolyBlock MM(_R, b, b);
+		convertSequenceToPolyMatrix(MM, gen);
+		timer.stop();
+		
+		//std::cout << "Time to convert first matrix to poly matrix: "  << timer.usertime();
+		//std::cout << std::endl;
+		
+		timer.clear();
+		
+		timer.start();
+		computeSmithForm(diag, MM, b);
+		timer.stop();
+		
+		std::cout << "Time to compute smith form kb: " << timer.usertime();
+		std::cout << std::endl;
+	}
+	
+	template <class PolyRingVector>
+	void computeFactors(
+		PolyRingVector &diag,
+		const Blackbox &M,
+		const PolyElement &d,
+		size_t b,
+		int earlyTerm = 10)
+	{
+		timer.clear();
+		timer.start();
+		std::vector<Block> gen;
+		computeGenerator(gen, M, b, earlyTerm);
+		timer.stop();
+		
+		std::cout << "Time to compute second generator: " << timer.usertime();
+		std::cout << std::endl;
+		
+		timer.clear();
+		timer.start();
+		PolyBlock MM(_R, b, b);
+		convertSequenceToPolyMatrix(MM, gen);
+		timer.stop();
+		
+		//std::cout << "Time to convert second matrix to poly matrix: " << timer.usertime();
+		//std::cout << std::endl;
+		
+		timer.clear();
+		timer.start();
+		modMatrix(MM, d);
+		computeSmithForm(diag, MM, d, b);
+		timer.stop();
+		
+		std::cout << "Time to compute smith form iliopoulos: " << timer.usertime();
+		std::cout << std::endl;
+	}
+
+public:
+	template <class PolyRingVector>
+	void solve(
+		PolyRingVector &diag,
+		const Blackbox &M,
+		size_t b,
+		size_t b1,
+		size_t r,
+		int earlyTerm = 10)
+	{
+		// Compute first b1 factors
+		PolyRingVector partialResult;
+		computeFactors(partialResult, M, b1, earlyTerm);
+		
+		// get r-th factor
+		PolyElement d;
+		_R.assign(d, partialResult[b1 - r]);
+		
+		// Compute factors mod r-th factor
+		computeFactors(diag, M, d, b, earlyTerm);
+		
+		// Fill in zeros before r-th factor with r-th factor
+		for (size_t i = 0; i < b - r; i++) {
+			if (_R.isZero(diag[i])) {
+				_R.assign(diag[i], d);
+			}
+		}
+		
+		// Fill in remaining factors with original values
+		for (size_t i = b - r; i < b; i++) {
+			diag[i] = partialResult[i - b + b1];
+		}
+	}
+};
+
+}
+
+#endif //__LINBOX_invariant_factors_H
diff --git a/linbox/algorithms/la-block-lanczos.h b/linbox/algorithms/la-block-lanczos.h
index 8221a25..655fb4b 100644
--- a/linbox/algorithms/la-block-lanczos.h
+++ b/linbox/algorithms/la-block-lanczos.h
@@ -52,7 +52,7 @@ namespace LinBox
 	 * mutual orthogonality properties. This algorithm was proposed by
 	 * Bradford Hovinen.
 	 */
-	template <class Field, class Matrix = BlasMatrix<typename Field::Element> >
+	template <class Field, class Matrix = BlasMatrix<Field> >
 	class LABlockLanczosSolver {
 	public:
 
@@ -65,7 +65,7 @@ namespace LinBox
 		 */
 		LABlockLanczosSolver (const Field &F,
 				      const BlockLanczosTraits &traits) :
-			_traits (traits), _field (F), _VD (F), _MD (F), _randiter (F),
+			_traits (traits), _field (&F), _VD (F), _MD (F), _randiter (F),
 			_uAv (this), _eliminator (F, _traits.blockingFactor ())
 		{ init_temps (); }
 
@@ -78,7 +78,7 @@ namespace LinBox
 		LABlockLanczosSolver (const Field &F,
 				      const BlockLanczosTraits &traits,
 				      typename Field::RandIter r) :
-			_traits (traits), _field (F), _VD (F), _MD (F), _randiter (r),
+			_traits (traits), _field (const_cast<Field*>(&F)), _VD (F), _MD (F), _randiter (r),
 			_uAv (this),
 			_eliminator (F, (unsigned int)  _traits.blockingFactor ())
 		{ init_temps (); }
@@ -178,8 +178,7 @@ namespace LinBox
 		};
 
 		// Structure representing an iterate
-		struct Iterate
-		{
+		struct Iterate {
 			// Record of the pseudoinverse
 			Matrix _udotAvbarinv;       // N x N
 			Matrix _ubarAvdotinv;       // N x N
@@ -208,16 +207,21 @@ namespace LinBox
 			bool _done;
 
 			Iterate (LABlockLanczosSolver &solver, size_t n, size_t N, unsigned int iter) :
-				_udotAvbarinv (N, N), _ubarAvdotinv (N, N),
-				_u (n, N), _v (n, N), _udot (n, N), _vdot (n, N),
+				_udotAvbarinv (solver.field(),N, (uint32_t)N),
+				_ubarAvdotinv (solver.field(),N, (uint32_t)N),
+				_u (solver.field(),n, (uint32_t)N),
+			       	_v (solver.field(),n, (uint32_t)N),
+				_udot (solver.field(),n, (uint32_t)N),
+				_vdot (solver.field(),n, (uint32_t)N),
 				_sigma_u (solver,  (unsigned int) N),
 			       	_sigma_v (solver,  (unsigned int) N),
-				_udotAv (N, N), _uAvdot (N, N)
+				_udotAv (solver.field(),N, (uint32_t)N),
+			       	_uAvdot (solver.field(),N, (uint32_t)N)
 			{ init (iter); }
 
 			void init (unsigned int iter)
 			{
-				_iter = iter;
+				_iter = (int)iter;
 				_rho_u = _rho_v = 0;
 				_done = false;
 				_sigma_u.reset ();
@@ -313,10 +317,13 @@ namespace LinBox
 			return (a < b) ? a : b;
 		}
 
+		inline Field & field() { return *_field; }
+	private:
+
 		// Private variables
 
 		const BlockLanczosTraits  _traits;
-		const Field               &_field;
+		/*const*/ Field               *_field;
 		VectorDomain<Field>        _VD;
 		MatrixDomain<Field>        _MD;
 		typename Field::RandIter   _randiter;
diff --git a/linbox/algorithms/la-block-lanczos.inl b/linbox/algorithms/la-block-lanczos.inl
index c94bfe8..93f9bee 100644
--- a/linbox/algorithms/la-block-lanczos.inl
+++ b/linbox/algorithms/la-block-lanczos.inl
@@ -42,7 +42,6 @@
 #include "linbox/blackbox/diagonal.h"
 #include "linbox/blackbox/compose.h"
 #include "linbox/blackbox/transpose.h"
-#include "linbox/randiter/nonzero.h"
 #include "linbox/util/commentator.h"
 #include "linbox/util/timer.h"
 #include "linbox/algorithms/la-block-lanczos.h"
@@ -153,7 +152,7 @@ namespace LinBox
 		_VD.copy (*(_v0.colBegin ()), b);
 
 		// Fill the remaining columns of _v0 with random data
-		RandomDenseStream<Field, typename Matrix::Col> stream (_field, _randiter, A.coldim ());
+		RandomDenseStream<Field, typename Matrix::Col> stream (field(), _randiter, A.coldim ());
 		typename Matrix::ColIterator iter = _v0.colBegin ();
 
 		for (++iter; iter != _v0.colEnd (); ++iter)
@@ -230,7 +229,7 @@ namespace LinBox
 		_Av.resize (A.coldim (), _traits.blockingFactor ());
 
 		// Fill y with random data
-		RandomDenseStream<Field, typename Matrix::Col> stream (_field, _randiter, A.coldim ());
+		RandomDenseStream<Field, typename Matrix::Col> stream (field(), _randiter, A.coldim ());
 		typename Matrix::ColIterator iter;
 
 		for (iter = _y.colBegin (); iter != _y.colEnd (); ++iter)
@@ -301,7 +300,7 @@ namespace LinBox
 		_Av.resize (A.coldim (), _traits.blockingFactor ());
 
 		// Fill v0 with random data
-		RandomDenseStream<Field, typename Matrix::Col> stream (_field, _randiter, A.coldim ());
+		RandomDenseStream<Field, typename Matrix::Col> stream (field(), _randiter, A.coldim ());
 		typename Matrix::ColIterator iter;
 
 		for (iter = _y.colBegin (); iter != _y.colEnd (); ++iter)
@@ -352,7 +351,7 @@ namespace LinBox
 
 		unsigned int dead_iters = 0;
 		Integer c;
-		_field.characteristic (c);
+		field().characteristic (c);
 		double logc = log (double (c));
 		unsigned int max_dead_iters = (unsigned int) ceil (3 * log (double (A.rowdim ())) / (N * logc)) + 2;
 
@@ -390,7 +389,7 @@ namespace LinBox
 		next_iterate = getNextIterate (0);
 
 		// Get a random fat vectors _blockV[0] and _blockU[0]
-		RandomDenseStream<Field, typename Matrix::Col> stream (_field, _randiter, A.coldim ());
+		RandomDenseStream<Field, typename Matrix::Col> stream (field(), _randiter, A.coldim ());
 		typename Matrix::ColIterator u_iter;
 
 		for (u_iter = next_iterate->_u.colBegin (); u_iter != next_iterate->_u.colEnd (); ++u_iter)
@@ -398,6 +397,7 @@ namespace LinBox
 
 		_MD.copy (next_iterate->_v, _v0);
 
+		//! @bug what is this ?
 #ifdef LABL_DETAILED_TRACE
 		Matrix    u0 (A.rowdim (), _traits.blockingFactor ());
 		Matrix    v0 (A.rowdim (), _traits.blockingFactor ());
@@ -442,21 +442,21 @@ namespace LinBox
 			TIMER_STOP(AV);
 
 			TIMER_START(innerProducts);
-			_MD.mul (*_uAv.get (_iter, _iter), transpose (iterate_here->_u), _Av);
-			_MD.mul (*_uAv.get (_iter + 1, _iter), uTA, _Av);
+			_MD.mul (*_uAv.get ((int)_iter, (int)_iter), transpose (iterate_here->_u), _Av);
+			_MD.mul (*_uAv.get ((int)_iter + 1, (int)_iter), uTA, _Av);
 			TIMER_STOP(innerProducts);
 
-			if (_MD.isZero (*_uAv.get (_iter, _iter)) && _MD.isZero (*_uAv.get (_iter + 1, _iter)))
+			if (_MD.isZero (*_uAv.get ((int)_iter, (int)_iter)) && _MD.isZero (*_uAv.get ((int)_iter + 1, (int)_iter)))
 				++dead_iters;
 			else
 				dead_iters = 0;
 
 			TIMER_START(updateInnerProducts);
-			_MD.copy (*_uAv.get (_iter, _iter + 1), *_uAv.get (_iter + 1, _iter));
+			_MD.copy (*_uAv.get ((int)_iter, (int)_iter + 1), *_uAv.get ((int)_iter + 1, (int)_iter));
 
 			for (j = _history.begin (); j != _history.end () && *j != iterate_here; ++j) {
-				_MD.copy (*_uAv.get (_iter + 1, (*j)->_iter), *_uAv.get (_iter, (*j)->_iter + 1));
-				_MD.copy (*_uAv.get ((*j)->_iter, _iter + 1), *_uAv.get ((*j)->_iter + 1, _iter));
+				_MD.copy (*_uAv.get ((int)_iter + 1, (int)(*j)->_iter), *_uAv.get ((int)_iter, (int)(*j)->_iter + 1));
+				_MD.copy (*_uAv.get ((int)(*j)->_iter, (int)_iter + 1), *_uAv.get ((int)(*j)->_iter + 1, (int)_iter));
 				compute_alphaAvip1 (j, _iter);
 				compute_uip1Abeta (j, _iter);
 			}
@@ -484,7 +484,7 @@ namespace LinBox
 				BlasMatrix<Field> udot ((*j)->_udot, 0, 0, A.rowdim (), (*j)->_rho_v);
 				BlasMatrix<Field> vdot ((*j)->_vdot, 0, 0, A.rowdim (), (*j)->_rho_u);
 
-				_MD.copy (_T1, *_uAv.get (_iter + 1, (*j)->_iter));
+				_MD.copy (_T1, *_uAv.get ((int)_iter + 1, (*j)->_iter));
 				(*j)->_sigma_v.apply (_T1, false);
 
 				BlasMatrix<Field> uip1Avbarj (_T1, 0, 0, N, (*j)->_rho_v);
@@ -500,7 +500,7 @@ namespace LinBox
 				_MD.write (reportN, udotAvbarinv);
 #endif
 
-				_MD.copy (_T1, *_uAv.get ((*j)->_iter, _iter + 1));
+				_MD.copy (_T1, *_uAv.get ((*j)->_iter, (int)_iter + 1));
 				(*j)->_sigma_u.apply (_T1, true);
 
 				BlasMatrix<Field> ubarjAvip1 (_T1, 0, 0, (*j)->_rho_u, N);
@@ -606,8 +606,8 @@ namespace LinBox
 
 		BlasMatrix<Field> udotAv ((*l)->_udotAv, 0, 0, Cu.coldim (), N);
 		BlasMatrix<Field> uAvdot ((*l)->_uAvdot, 0, 0, N, Cv.rowdim ());
-		_MD.axpyin (*_uAv.get (iter + 1, (*l)->_iter), Cu, udotAv);
-		_MD.axpyin (*_uAv.get ((*l)->_iter, iter + 1), uAvdot, Cv);
+		_MD.axpyin (*_uAv.get ((int)iter + 1, (*l)->_iter), Cu, udotAv);
+		_MD.axpyin (*_uAv.get ((*l)->_iter, (int)iter + 1), uAvdot, Cv);
 
 #ifdef LABL_DETAILED_TRACE
 		std::ostream &reportN = commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION);
@@ -720,7 +720,7 @@ namespace LinBox
 				_MD.negin (ujAvietamu);
 				_MD.axpyin (*_uAv.get ((*j)->_iter, i->_iter), ujAvietamu, ultildeAvi);
 
-				adjust_alphaAvip1 (j, (*j)->_steps.back (), i->_iter);
+				adjust_alphaAvip1 (j, (*j)->_steps.back (), (unsigned int)i->_iter);
 			}
 
 			if (*l != i) {
@@ -844,7 +844,7 @@ namespace LinBox
 				_MD.negin (nuTuizetaAvj);
 				_MD.axpyin (*_uAv.get (i->_iter, (*j)->_iter), uiAvltilde, nuTuizetaAvj);
 
-				adjust_uip1Abeta (j, (*j)->_steps.back (), i->_iter);
+				adjust_uip1Abeta (j, (*j)->_steps.back (), (unsigned int)i->_iter);
 			}
 
 			if (*l != i) {
@@ -1024,12 +1024,12 @@ namespace LinBox
 
 		BlasMatrix<Field> nuukAvj (*step._nuukAvj, 0, 0, step._rhop, N);
 
-		_MD.copy (_T1, *_uAv.get (iter + 1, step._l->_iter));
+		_MD.copy (_T1, *_uAv.get ((int)iter + 1, step._l->_iter));
 		step._l->_sigma_v.apply (_T1, false);
 
 		BlasMatrix<Field> uip1Avltilde (_T1, 0, step._rho, N, step._rhop);
 
-		_MD.axpyin (*_uAv.get (iter + 1, (*j)->_iter), uip1Avltilde, nuukAvj);
+		_MD.axpyin (*_uAv.get ((int)iter + 1, (*j)->_iter), uip1Avltilde, nuukAvj);
 	}
 
 	template <class Field, class Matrix>
@@ -1071,12 +1071,12 @@ namespace LinBox
 
 		BlasMatrix<Field> ujAvkmu (*step._ujAvkmu, 0, 0, N, step._rhop);
 
-		_MD.copy (_T1, *_uAv.get (step._l->_iter, iter + 1));
+		_MD.copy (_T1, *_uAv.get (step._l->_iter, (int)iter + 1));
 		step._l->_sigma_u.apply (_T1, true);
 
 		BlasMatrix<Field> ultildeAvip1 (_T1, step._rho, 0, step._rhop, N);
 
-		_MD.axpyin (*_uAv.get ((*j)->_iter, iter + 1), ujAvkmu, ultildeAvip1);
+		_MD.axpyin (*_uAv.get ((*j)->_iter, (int)iter + 1), ujAvkmu, ultildeAvip1);
 	}
 
 	template <class Field, class Matrix>
@@ -1401,10 +1401,10 @@ namespace LinBox
 		linbox_check ((unsigned int) i < _base + _blocks.size ());
 		linbox_check ((unsigned int) j < _base + _blocks.front ().size ());
 
-		Matrix *ret = _blocks[i - _base][j - _base];
+		Matrix *ret = _blocks[(size_t)i - _base][(size_t)j - _base];
 
 		if (ret == NULL)
-			ret = _blocks[i - _base][j - _base] = _solver->newBlock ();
+			ret = _blocks[(size_t)i - _base][(size_t)j - _base] = _solver->newBlock ();
 
 		linbox_check (ret != NULL);
 
@@ -1419,7 +1419,7 @@ namespace LinBox
 		Matrix *ret;
 
 		if (_ip_trashcan.empty ())
-			ret = new Matrix (_traits.blockingFactor (), _traits.blockingFactor ());
+			ret = new Matrix (field(),_traits.blockingFactor (), _traits.blockingFactor ());
 		else {
 			ret = _ip_trashcan.top ();
 			_ip_trashcan.pop ();
@@ -1547,7 +1547,7 @@ namespace LinBox
 		_matW.resize (_traits.blockingFactor (), _traits.blockingFactor ());
 		_Cu.resize (_traits.blockingFactor (), _traits.blockingFactor ());
 		_Cv.resize (_traits.blockingFactor (), _traits.blockingFactor ());
-		_field.init (_one, 1);
+		field().init (_one, 1);
 	}
 
 } // namespace LinBox
diff --git a/linbox/algorithms/lanczos.h b/linbox/algorithms/lanczos.h
index e80cfd2..0d05a5b 100644
--- a/linbox/algorithms/lanczos.h
+++ b/linbox/algorithms/lanczos.h
@@ -57,7 +57,7 @@ namespace LinBox
 		 *               options for the solver
 		 */
 		LanczosSolver (const Field &F, const LanczosTraits &traits) :
-			_traits (traits), _field (F), _randiter (F), _VD (F)
+			_traits (traits), _field (&F), _randiter (F), _VD (F)
 		{}
 
 		/** @brief Constructor with a random iterator
@@ -67,7 +67,7 @@ namespace LinBox
 		 * @param r Random iterator to use for randomization
 		 */
 		LanczosSolver (const Field &F, const LanczosTraits &traits, typename Field::RandIter r) :
-			_traits (traits), _field (F), _randiter (r), _VD (F)
+			_traits (traits), _field (&F), _randiter (r), _VD (F)
 		{}
 
 		/** Solve the linear system Ax = b.
@@ -90,6 +90,7 @@ namespace LinBox
 		template <class Blackbox>
 		Vector &solve (const Blackbox &A, Vector &x, const Vector &b);
 
+		inline const Field & field() const { return *_field; }
 	private:
 
 		// Run the Lanczos iteration and return the result. Return false
@@ -98,7 +99,7 @@ namespace LinBox
 		bool iterate (const Blackbox &A, Vector &x, const Vector &b);
 
 		const LanczosTraits &_traits;
-		const Field                       &_field;
+		const Field                       *_field;
 		typename Field::RandIter           _randiter;
 		VectorDomain<Field>                _VD;
 
diff --git a/linbox/algorithms/lanczos.inl b/linbox/algorithms/lanczos.inl
index e4509b5..97dccd8 100644
--- a/linbox/algorithms/lanczos.inl
+++ b/linbox/algorithms/lanczos.inl
@@ -86,8 +86,8 @@ namespace LinBox
 		VectorWrapper::ensureDim (_w[1], A.coldim ());
 		VectorWrapper::ensureDim (_Aw, A.coldim ());
 
-		NonzeroRandIter<Field> real_ri (_field, _randiter);
-		RandomDenseStream<Field, LVector, NonzeroRandIter<Field> > stream (_field, real_ri, A.coldim ());
+		Givaro::GeneralRingNonZeroRandIter<Field> real_ri (_randiter);
+		RandomDenseStream<Field, LVector, Givaro::GeneralRingNonZeroRandIter<Field> > stream (field(), real_ri, A.coldim ());
 
 		for (unsigned int i = 0; !success && i < _traits.maxTries (); ++i) {
 			std::ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
@@ -117,7 +117,7 @@ namespace LinBox
 					VectorWrapper::ensureDim (y, A.coldim ());
 
 					stream >> d1;
-					Diagonal<Field, typename VectorTraits<LVector>::VectorCategory> D (_field, d1);
+					Diagonal<Field, typename VectorTraits<LVector>::VectorCategory> D (field(), d1);
 					Compose<Blackbox, Diagonal<Field, typename VectorTraits<LVector>::VectorCategory> > B (&A, &D);
 
 					report << "Random D: ";
@@ -136,7 +136,7 @@ namespace LinBox
 					VectorWrapper::ensureDim (bp, A.coldim ());
 
 					stream >> d1;
-					Diagonal<Field, typename VectorTraits<LVector>::VectorCategory> D (_field, d1);
+					Diagonal<Field, typename VectorTraits<LVector>::VectorCategory> D (field(), d1);
 					Transpose<Blackbox> AT (&A);
 					Compose<Diagonal<Field, typename VectorTraits<LVector>::VectorCategory>, Blackbox> B1 (&D, &A);
 					Compose<Transpose<Blackbox>, Compose<Diagonal<Field, typename VectorTraits<LVector>::VectorCategory>, Blackbox> > B (&AT, &B1);
@@ -162,8 +162,8 @@ namespace LinBox
 					VectorWrapper::ensureDim (y, A.coldim ());
 
 					stream >> d1 >> d2;
-					Diagonal<Field, typename VectorTraits<LVector>::VectorCategory> D1 (_field, d1);
-					Diagonal<Field, typename VectorTraits<LVector>::VectorCategory> D2 (_field, d2);
+					Diagonal<Field, typename VectorTraits<LVector>::VectorCategory> D1 (field(), d1);
+					Diagonal<Field, typename VectorTraits<LVector>::VectorCategory> D2 (field(), d2);
 					Transpose<Blackbox> AT (&A);
 
 					Compose<Blackbox,
@@ -278,7 +278,7 @@ namespace LinBox
 		_VD.subin (_w[0], _w[0]);
 
 		// Get a random vector _w[1]
-		RandomDenseStream<Field, LVector> stream (_field, _randiter, A.coldim ());
+		RandomDenseStream<Field, LVector> stream (field(), _randiter, A.coldim ());
 		stream >> _w[1];
 
 		std::ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
@@ -288,28 +288,28 @@ namespace LinBox
 		A.apply (_Aw, _w[j]);                // Aw_j
 		_VD.dot (delta[j], _w[j], _Aw);      // delta_j <- <w_j, Aw_j>
 
-		if (_field.isZero (delta[j])) {
+		if (field().isZero (delta[j])) {
 			commentator().stop ("FAILED", "<w_1, Aw_1> = 0", "LanczosSolver::iterate");
 			return false;
 		}
 
 		_VD.dot (alpha, _Aw, _Aw);           //   alpha <- -<Aw_j, Aw_j> / delta_j
-		_field.divin (alpha, delta[j]);
-		_field.negin (alpha);
+		field().divin (alpha, delta[j]);
+		field().negin (alpha);
 
-		_field.subin (beta, beta);               //    beta <- 0
+		field().subin (beta, beta);               //    beta <- 0
 
 		_VD.dot (wb, _w[j], b);              //       x <- <w_j, b> / delta_j w_j
-		_field.divin (wb, delta[j]);
+		field().divin (wb, delta[j]);
 		_VD.mul (x, _w[j], wb);
 
-		while (!_field.isZero (delta[j])) {
+		while (!field().isZero (delta[j])) {
 			commentator().progress ();
 
 			report << "Total matrix-vector products so far: " << prods << std::endl;
 
-			// 		traceReport (report, _field, "alpha", iter, alpha);
-			// 		traceReport (report, _field, "beta", iter, alpha);
+			// 		traceReport (report, field(), "alpha", iter, alpha);
+			// 		traceReport (report, field(), "beta", iter, alpha);
 			traceReport (report, _VD, "w", iter - 1, _w[1 - j]);
 			traceReport (report, _VD, "w", iter, _w[j]);
 
@@ -326,19 +326,19 @@ namespace LinBox
 
 			_VD.dot (delta[j], _w[j], _Aw); // delta_j <- <w_j, Aw_j>
 
-			// 		traceReport (report, _field, "delta", iter - 1, delta[1 - j]);
-			// 		traceReport (report, _field, "delta", iter, delta[j]);
+			// 		traceReport (report, field(), "delta", iter - 1, delta[1 - j]);
+			// 		traceReport (report, field(), "delta", iter, delta[j]);
 
-			if (!_field.isZero (delta[j])) {
+			if (!field().isZero (delta[j])) {
 				_VD.dot (alpha, _Aw, _Aw);             // alpha <- -<Aw_j, Aw_j> / delta_j
-				_field.divin (alpha, delta[j]);
-				_field.negin (alpha);
+				field().divin (alpha, delta[j]);
+				field().negin (alpha);
 
-				_field.div (beta, delta[j], delta[1 - j]); //  beta <- -delta_j / delta_j-1
-				_field.negin (beta);
+				field().div (beta, delta[j], delta[1 - j]); //  beta <- -delta_j / delta_j-1
+				field().negin (beta);
 
 				_VD.dot (wb, _w[j], b);                //     x <- x + <w_j, b> / delta_j w_j
-				_field.divin (wb, delta[j]);
+				field().divin (wb, delta[j]);
 				_VD.axpyin (x, wb, _w[j]);
 			}
 
diff --git a/linbox/algorithms/last-invariant-factor.h b/linbox/algorithms/last-invariant-factor.h
index 3b0916c..1083304 100644
--- a/linbox/algorithms/last-invariant-factor.h
+++ b/linbox/algorithms/last-invariant-factor.h
@@ -28,6 +28,7 @@
 #include "linbox/util/debug.h"
 #include "linbox/algorithms/default.h"
 #include "linbox/algorithms/rational-solver.h"
+#include "linbox/vector/blas-vector.h"
 #include <utility>
 
 namespace LinBox
@@ -50,7 +51,9 @@ namespace LinBox
 
 	protected:
 
+		typedef BlasVector<Ring>         DVect;
 		Ring        r;
+        mutable typename Ring::RandIter _gen;
 		Solver solver;
 		int threshold;
 
@@ -62,7 +65,7 @@ namespace LinBox
 		LastInvariantFactor(const Solver& _solver = Solver(),
 				    const Ring& _r =Ring(),
 				    int _threshold =DEFAULTLIFTHRESHOLD) :
-			r(_r),solver(_solver), threshold(_threshold)
+                r(_r), _gen(r),solver(_solver), threshold(_threshold)
 		{
 
 			if ( _threshold <= 1) threshold = DEFAULTLIFTHRESHOLD;
@@ -99,11 +102,12 @@ namespace LinBox
 					     const Vector& PrimeL) const
 		{
 
-			r.init(lif, 1);
+			r.assign(lif, r.one);
 			int count = 0;
 			SolverReturnStatus tmp;
 			// Storage of rational solution
-			std::vector<Integer> r_num (A. coldim()); Integer r_den;
+			DVect r_num (r,A. coldim());
+			Integer r_den;
 			//std::vector<std::pair<Integer, Integer> > result (A.coldim());
 			//typename std::vector<std::pair<Integer, Integer> >::iterator result_p;
 			// vector b, RHS, 32-bit int is good enough
@@ -111,20 +115,22 @@ namespace LinBox
 			typename std::vector<int>::iterator b_p;
 			typename Vector::const_iterator Prime_p;
 
-			Integer pri, quo, rem;
+			Integer pri, quo, rem, itmp;
 
 			for (; count < threshold; ++ count) {
 				// assign b to be a random vector
 				for (b_p = b.begin(); b_p != b.end(); ++ b_p) {
-					* b_p = rand() % 268435456 - 134217728; // may need to change to use ring's random gen.
-					// dpritcha, 2004-07-26
+// 					* b_p = rand() % 268435456 - 134217728; // may need to change to use ring's random gen.
+// 					// dpritcha, 2004-07-26
+                    _gen( itmp );
+                    * b_p = (int)itmp;
 				}
 
 				// try to solve Ax = b over Ring
 				tmp = solver.solveNonsingular(r_num, r_den, A, b);
 				// If no solution found
 				if (tmp != SS_OK) {
-					r.init (lif, 0);
+					r.assign (lif, r.zero);
 					break;
 				}
 
@@ -135,7 +141,7 @@ namespace LinBox
 				for ( Prime_p = PrimeL.begin();
 				      Prime_p != PrimeL.end();
 				      ++ Prime_p) {
-					r.init (pri, (unsigned long) *Prime_p);
+					r.init (pri, *Prime_p);
 					do {
 						r.quoRem(quo,rem,lif,pri);
 						if (r.isZero(rem)) r.assign(lif,quo);
@@ -157,12 +163,13 @@ namespace LinBox
 						   const Vector& PrimeL) const
 		{
 
-			r. init(lif, 1);
-			r. init (Bonus, 1);
+			r. assign(lif, r.one);
+			r. assign(Bonus, r.one);
 			int count = 0;
 			SolverReturnStatus tmp1, tmp2;
 			// Storage of rational solution
-			std::vector<Integer> r1_num (A. coldim()), r2_num (A. coldim()); Integer r1_den, r2_den;
+			DVect r1_num (r,A. coldim()), r2_num (r,A. coldim());
+			Integer r1_den, r2_den;
 			//std::vector<std::pair<Integer, Integer> > result (A.coldim());
 			//typename std::vector<std::pair<Integer, Integer> >::iterator result_p;
 			// vector b, RHS, 32-bit int is good enough
@@ -174,17 +181,19 @@ namespace LinBox
 			for (; count < (threshold + 1) / 2; ++ count) {
 				// assign b to be a random vector
 				for (b_p = b1. begin(); b_p != b1. end(); ++ b_p) {
-					* b_p = rand();
+// 					* b_p = rand();
+                                        *b_p = _gen.random();//(* b_p);
 				}
 				for (b_p = b2. begin(); b_p != b2. end(); ++ b_p) {
-					* b_p = rand();
+// 					* b_p = rand();
+                                        *b_p = _gen.random();//(* b_p);
 				}
 				// try to solve Ax = b1, b2 over Ring
 				tmp1 = solver. solveNonsingular(r1_num, r1_den, A, b1);
 				tmp2 = solver. solveNonsingular(r2_num, r2_den, A, b2);
 				// If no solution found
 				if ((tmp1 != SS_OK) || (tmp2 != SS_OK)){
-					r.init (lif, 0);
+					r.assign (lif, r.zero);
 					break;
 				}
 
@@ -193,18 +202,20 @@ namespace LinBox
 
 				// compute the Bonus
 				Integer g, d, a11, a12, a21, a22, l, c_bonus, c_l;
-				typename std::vector<Integer>::iterator num1_p, num2_p;
-				std::vector<Integer> r1 (A. rowdim());
-				std::vector<Integer> r2 (A. rowdim());
-				typename std::vector<Integer>::iterator r1_p, r2_p;
-				r. init (l, 0);
+				typename DVect::iterator num1_p, num2_p;
+				DVect r1 (r,A. rowdim());
+				DVect r2 (r,A. rowdim());
+				typename DVect::iterator r1_p, r2_p;
+				r. assign (l, r.zero);
 				int i;
 				for (i = 0; i < 20; ++ i) {
 					for (r1_p = r1. begin(), r2_p = r2. begin(); r1_p != r1. end(); ++ r1_p, ++ r2_p) {
-						r. init (*r1_p, rand());
-						r. init (*r2_p, rand());
+// 						r. init (*r1_p, rand());
+// 						r. init (*r2_p, rand());
+						r. init (*r1_p); _gen(*r1_p);
+						r. init (*r2_p); _gen(*r2_p);
 					}
-					r. init (a11, 0); r. init (a12, 0); r. init (a21, 0); r. init (a22, 0);
+					r. assign(a11, r.zero); r. assign (a12, r.zero); r. assign (a21, r.zero); r. assign (a22, r.zero);
 					for (r1_p = r1. begin(), num1_p = r1_num. begin(); r1_p != r1. end(); ++ r1_p, ++ num1_p)
 						r. axpyin (a11, *r1_p, *num1_p);
 					for (r1_p = r1. begin(), num2_p = r2_num. begin(); r1_p != r1. end(); ++ r1_p, ++ num2_p)
@@ -263,16 +274,18 @@ namespace LinBox
 
 			if (r_num.size()!=A. coldim()) return lif=0;
 			Integer r_den;
-			std::vector<Integer> b(A.rowdim());
-			typename std::vector<Integer>::iterator b_p;
+			DVect b(r,A.rowdim());
+			typename DVect::iterator b_p;
 			//typename Vector::const_iterator Prime_p;
 
 			Integer pri, quo, rem;
 
 			// assign b to be a random vector
 			for (b_p = b.begin(); b_p != b.end(); ++ b_p) {
-				* b_p = rand() % 268435456 - 134217728; // may need to change to use ring's random gen.
-				// dpritcha, 2004-07-26
+// 				* b_p = rand() % 268435456 - 134217728; // may need to change to use ring's random gen.
+// 				// dpritcha, 2004-07-26
+                _gen( * b_p );
+                
 			}
 			//report <<"try to solve Ax = b over Ring";
 			// try to solve Ax = b over Ring
@@ -280,7 +293,7 @@ namespace LinBox
 			tmp = solver.solveNonsingular(r_num, r_den, A, b,oldMatrix);
 			// If no solution found
 			if (tmp != SS_OK) {
-				//r.init (lif, 0);
+				//r.assign (lif, r.zero);
 				//break;
 				return lif=0;
 			}
@@ -291,7 +304,7 @@ namespace LinBox
 				Integer den,t;
 				r. lcm(den,r_den,lif);
 				r. div(t, den, r_den);
-				typename std::vector<Integer>::iterator num_p = r_num.begin();
+				typename DVect::iterator num_p = r_num.begin();
 				for (; num_p != r_num. end(); ++num_p) {
 					r. mulin(*num_p, t);
 				}
@@ -305,18 +318,20 @@ namespace LinBox
 			if (Bonus==0) Bonus=1;
 			if (r1_num.size() != r2_num.size()) return Bonus=0;
 			Integer g, d, a11, a12, a21, a22, c_bonus, l, c_l;
-			typename std::vector<Integer>::iterator num1_p, num2_p;
-			std::vector<Integer> r1 (r1_num. size());
-			std::vector<Integer> r2 (r2_num. size());
-			typename std::vector<Integer>::iterator r1_p, r2_p;
-			r. init (l, 0);
+			typename DVect::iterator num1_p, num2_p;
+			DVect r1 (r,r1_num. size());
+			DVect r2 (r,r2_num. size());
+			typename DVect::iterator r1_p, r2_p;
+			r. assign (l, r.zero);
 			int i;
 			for (i = 0; i < 20; ++ i) {
 				for (r1_p = r1. begin(), r2_p = r2. begin(); r1_p != r1. end(); ++ r1_p, ++ r2_p) {
-					r. init (*r1_p, rand());
-					r. init (*r2_p, rand());
+// 					r. init (*r1_p, rand());
+// 					r. init (*r2_p, rand());
+					r. init (*r1_p); _gen(*r1_p);
+					r. init (*r2_p); _gen(*r2_p);
 				}
-				r. init (a11, 0); r. init (a12, 0); r. init (a21, 0); r. init (a22, 0);
+				r. assign (a11, r.zero); r. assign (a12, r.zero); r. assign (a21, r.zero); r. assign (a22, r.zero);
 				for (r1_p = r1. begin(), num1_p = r1_num. begin(); r1_p != r1. end(); ++ r1_p, ++ num1_p)
 					r. axpyin (a11, *r1_p, *num1_p);
 				for (r1_p = r1. begin(), num2_p = r2_num. begin(); r1_p != r1. end(); ++ r1_p, ++ num2_p)
@@ -349,7 +364,7 @@ namespace LinBox
 		Integer& lastInvariantFactor(Integer& lif, const IMatrix& A)  const
 		{
 
-			std::vector<Integer> empty_v;
+			DVect empty_v(r);
 			lastInvariantFactor (lif, A, empty_v);
 			return lif;
 		}
@@ -360,7 +375,7 @@ namespace LinBox
 		Integer& lastInvariantFactor_Bonus(Integer& lif, Integer& Bonus, const IMatrix& A)  const
 		{
 
-			std::vector<Integer> empty_v;
+			DVect empty_v(r);
 			lastInvariantFactor_Bonus (lif, Bonus, A, empty_v);
 			return lif;
 		}
@@ -372,11 +387,10 @@ namespace LinBox
 #endif //__LINBOX_last_invariant_factor_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/lattice.doxy b/linbox/algorithms/lattice.doxy
index 760d636..0aabe2c 100644
--- a/linbox/algorithms/lattice.doxy
+++ b/linbox/algorithms/lattice.doxy
@@ -1,4 +1,4 @@
-// Copyright (C) 2011 Brice Boyer, part of LinBox, GNU LGPL, see COPYING
+// Copyright (C) 2011 Brice Boyer (briceboyer), part of LinBox, GNU LGPL, see COPYING
 /*
  * Coypright (c) LinBox
  * ========LICENCE========
diff --git a/linbox/algorithms/lattice.h b/linbox/algorithms/lattice.h
index 3585d0f..8bf0584 100644
--- a/linbox/algorithms/lattice.h
+++ b/linbox/algorithms/lattice.h
@@ -1,6 +1,6 @@
 /* linbox/algorithms/lattice.h
  * Copyright (C) 2011 The LinBox group
- * Written by Brice Boyer <bboyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  *
  * ========LICENCE========
  * This file is part of the library LinBox.
@@ -33,7 +33,7 @@
  *
  * @todo Create a BlasMatrix<NTL_ZZ> that is just like a mat_ZZ !
  * @todo Create a BlasMatrix<FPLLL_ZZ> that is just like a IntMatrix !
- * @todo This will avoid copy back/forth a BlasMatrix<PID_integer>
+ * @todo This will avoid copy back/forth a BlasMatrix<Givaro::ZRing<Integer> >
  */
 
 #if !defined(__LINBOX_HAVE_FPLLL) && !defined(__LINBOX_HAVE_NTL)
@@ -48,18 +48,7 @@
 
 
 #ifdef __LINBOX_HAVE_FPLLL
-// this is a damn FPLLL bug !!!
-namespace FPLLL {
-#define round
-#define trunc
 #include <fplll/fplll.h>
-#include <fplll/heuristic.h>
-#include <fplll/proved.h>
-#include <fplll/wrapper.h>
-#undef round
-#undef trunc
-}
-
 #endif
 
 
diff --git a/linbox/algorithms/lattice.inl b/linbox/algorithms/lattice.inl
index 820a308..f29ed0b 100644
--- a/linbox/algorithms/lattice.inl
+++ b/linbox/algorithms/lattice.inl
@@ -1,6 +1,6 @@
 /* linbox/algorithms/lattice.inl
  * Copyright (C) 2011 The LinBox group
- * Written by Brice Boyer <bboyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  *
  * ========LICENCE========
  * This file is part of the library LinBox.
@@ -335,31 +335,32 @@ namespace LinBox
 		if (withU)
 			throw NotImplementedYet("not U");
 		// Convert H
-		FPLLL::ZZ_mat<ZT> B(H.rowdim(),H.coldim()) ;
+		fplll::ZZ_mat<ZT> B(H.rowdim(),H.coldim()) ;
 		for (size_t i = 0 ; i < H.rowdim() ; ++i) {
 			for (size_t j = 0 ; j < H.coldim() ; ++j) {
-				B.Set(i,j,FPLLL::Z_NR<ZT>(H.getEntry(i,j)) );
+                                fplll::Z_NR<ZT> x = H.getEntry(i,j);
+                                B.Set((int)i,(int)j,x);
 			}
 		}
 		// LLL()
 		switch (meth.getMeth()) {
 		case (latticeMethod::latticeFPLLL::P) :
 			{
-				FPLLL::proved<ZT,double> lllMethod(&B,meth.getPrecision(),
+				fplll::proved<ZT,double> lllMethod(&B,meth.getPrecision(),
 							      meth.getEta(),meth.getDelta());
 				lllMethod.LLL();
 			}
 			break;
 		case (latticeMethod::latticeFPLLL::W) :
 			{
-				FPLLL::wrapper lllMethod(&B,meth.getPrecision(),
+				fplll::wrapper lllMethod(&B,meth.getPrecision(),
 						    meth.getEta(),meth.getDelta());
 				lllMethod.LLL();
 			}
 			break;
 		case (latticeMethod::latticeFPLLL::H) :
 			{
-				FPLLL::heuristic<ZT,double> lllMethod(&B,meth.getPrecision(),
+				fplll::heuristic<ZT,double> lllMethod(&B,meth.getPrecision(),
 								 meth.getEta(),meth.getDelta(),
 								 meth.getSiegel());
 				lllMethod.LLL();
diff --git a/linbox/algorithms/lifting-container.h b/linbox/algorithms/lifting-container.h
index e30449b..18d1ea8 100644
--- a/linbox/algorithms/lifting-container.h
+++ b/linbox/algorithms/lifting-container.h
@@ -45,7 +45,7 @@
 #include "linbox/vector/vector-domain.h"
 #include "linbox/blackbox/compose.h"
 #include "linbox/blackbox/block-hankel-inverse.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
 #include "linbox/field/hom.h"
 #include "linbox/matrix/transpose-matrix.h"
 #include "linbox/blackbox/transpose.h"
@@ -72,15 +72,13 @@ namespace LinBox
 		//size_t m, n, col=0;
 		//n=A.coldim();
 		//m=A.rowdim();
-		R.init(H_col_sqr, 1);
-		Integer_t zero;
-		R.init(zero,0UL);
+		R.assign(H_col_sqr, R.one);
 
 		typename ItMatrix::ConstRowIterator row= A.rowBegin();
-		std::vector<Integer_t> tmp(A.coldim(), zero);
-		for (; row != A.rowEnd(); row++){
+		std::vector<Integer_t> tmp(A.coldim(), R.zero);
+		for (; row != A.rowEnd(); ++row){
 			typename ItMatrix::ConstRow::const_iterator elm= row->begin();
-			for (size_t i=0; elm != row->end(); elm++, ++i)
+			for (size_t i=0; elm != row->end(); ++elm, ++i)
 				R.axpyin(tmp[i], *elm, *elm);
 		}
 
@@ -92,10 +90,10 @@ namespace LinBox
 		   typename ItMatrix::ConstColIterator colIter;
 		   colIter = A.colBegin();
 
-		   for (; colIter != A.colEnd(); colIter++, col++) {
+		   for (; colIter != A.colEnd(); ++colIter, ++col) {
 		   typename ItMatrix::ConstCol::const_iterator elm;
-		   R.init(sqsum, 0);
-		   for (elm = colIter->begin(); elm != colIter->end(); elm++)
+		   R.assign(sqsum, R.zero);
+		   for (elm = colIter->begin(); elm != colIter->end(); ++elm)
 		   R.axpyin(sqsum, *elm, *elm);
 		   R.mulin(H_col_sqr, sqsum);
 		   if (col == 0 || sqsum < short_col_sqr)
@@ -114,10 +112,10 @@ namespace LinBox
 	}
 
 	// in other solvers we generally use BlasMatrix which inherits from BlasSubmatrix
-	template <class Ring>
-	void BoundBlackbox(const Ring& R, typename Ring::Element& H_col_sqr,
-			   typename Ring::Element& short_col_sqr,
-			   const BlasSubmatrix<Ring>& A)
+	template <class Matrix>
+	void BoundBlackbox(const typename Matrix::Field& R, typename Matrix::Element& H_col_sqr,
+			   typename Matrix::Element& short_col_sqr,
+			   const BlasSubmatrix<Matrix>& A)
 	{
 		SpecialBound(R, H_col_sqr, short_col_sqr, A);
 	}
@@ -130,27 +128,25 @@ namespace LinBox
 	{
 
 		typedef typename Ring::Element Integer_t;
-		Integer_t one,zero,sqsum;
+		Integer_t sqsum;
 		size_t m,n;
 		n=A.coldim();
 		m=A.rowdim();
-		R.init(one,1);
-		R.init(zero,0);
-		R.init(H_col_sqr, 1);
+		R.assign(H_col_sqr, R.one);
 		typename std::vector<Integer_t>::const_iterator iter;
-		std::vector<Integer_t> e(n,zero),tmp(m);
+		std::vector<Integer_t> e(n,R.zero),tmp(m);
 
-		for (size_t i=0;i<n;i++){
-			e[i]=one;
+		for (size_t i=0;i<n;++i){
+			e[i]=R.one;
 			A.apply(tmp,e);
-			sqsum=zero;
+			sqsum=R.zero;
 			for (iter=tmp.begin();iter!=tmp.end();++iter){
 				sqsum += (*iter)*(*iter);
 			}
 			R.mulin(H_col_sqr, sqsum);
 			if (i==0 || sqsum < short_col_sqr)
 				short_col_sqr = sqsum;
-			e[i]=zero;
+			e[i]=R.zero;
 		}
 	}
 
@@ -160,25 +156,23 @@ namespace LinBox
 			    const Compose<Matrix1,Matrix2> & A)
 	{
 		typedef typename Ring::Element Integer_t;
-		Integer_t one,zero,sqsum;
+		Integer_t sqsum;
 		size_t m,n;
 		n=A.coldim();
 		m=A.rowdim();
-		R.init(one,1);
-		R.init(zero,0);
-		R.init(H_col_sqr, 1);
+		R.assign(H_col_sqr, R.one);
 		typename std::vector<Integer_t>::const_iterator iter;
-		std::vector<Integer_t> e(n,zero),tmp(m);
-		for (size_t i=0;i<n;i++){
-			e[i]=one;
+		std::vector<Integer_t> e(n,R.zero),tmp(m);
+		for (size_t i=0;i<n;++i){
+			e[i]=R.one;
 			A.apply(tmp,e);
-			sqsum=zero;
+			sqsum=R.zero;
 			for (iter=tmp.begin();iter!=tmp.end();++iter)
 				sqsum += (*iter)*(*iter);
 			R.mulin(H_col_sqr, sqsum);
 			if (i==0 || sqsum < short_col_sqr)
 				short_col_sqr = sqsum;
-			e[i]=zero;
+			e[i]=R.zero;
 		}
 	}
 
@@ -188,25 +182,23 @@ namespace LinBox
 			    const Transpose<Matrix> & A)
 	{
 		typedef typename Ring::Element Integer_t;
-		Integer_t one,zero,sqsum;
+		Integer_t sqsum;
 		size_t m,n;
 		n=A.coldim();
 		m=A.rowdim();
-		R.init(one,1);
-		R.init(zero,0);
-		R.init(H_col_sqr, 1);
+		R.assign(H_col_sqr, R.one);
 		typename std::vector<Integer_t>::const_iterator iter;
-		std::vector<Integer_t> e(n,zero),tmp(m);
-		for (size_t i=0;i<n;i++){
-			e[i]=one;
+		std::vector<Integer_t> e(n,R.zero),tmp(m);
+		for (size_t i=0;i<n;++i){
+			e[i]=R.one;
 			A.applyTranspose(tmp,e);
-			sqsum=zero;
+			sqsum=R.zero;
 			for (iter=tmp.begin();iter!=tmp.end();++iter)
 				sqsum += (*iter)*(*iter);
 			R.mulin(H_col_sqr, sqsum);
 			if (i==0 || sqsum < short_col_sqr)
 				short_col_sqr = sqsum;
-			e[i]=zero;
+			e[i]=R.zero;
 		}
 	}
 
@@ -223,25 +215,23 @@ namespace LinBox
 	   void BoundBlackbox (const Ring& R, typename Ring::Element& H_col_sqr,
 			       typename Ring::Element& short_col_sqr, const IMatrix& A) {
 		   typedef typename Ring::Element Integer_t;
-		   Integer_t one,zero,sqsum;
+		   Integer_t sqsum;
 		   size_t m,n;
 		   n=A.coldim();
 		   m=A.rowdim();
-		   R.init(one,1);
-		   R.init(zero,0);
-		   R.init(H_col_sqr, 1);
+		   R.assign(H_col_sqr, R.one);
 		   typename std::vector<Integer_t>::const_iterator iter;
-		   std::vector<Integer_t> e(n,zero),tmp(m);
-		   for (size_t i=0;i<n;i++){
-			   e[i]=one;
+		   std::vector<Integer_t> e(n,R.zero),tmp(m);
+		   for (size_t i=0;i<n;++i){
+			   e[i]=R.one;
 			   A.apply(tmp,e);
-			   sqsum=zero;
+			   sqsum=R.zero;
 			   for (iter=tmp.begin();iter!=tmp.end();++iter)
 				   sqsum += (*iter)*(*iter);
 			   R.mulin(H_col_sqr, sqsum);
 			   if (i==0 || sqsum < short_col_sqr)
 				   short_col_sqr = sqsum;
-			   e[i]=zero;
+			   e[i]=R.zero;
 		   }
 	   }
 #endif
@@ -257,19 +247,18 @@ namespace LinBox
 	void ApplyBound(const Ring& R, typename Ring::Element& bound_A, const ItMatrix& A)
 	{
 		typedef typename Ring::Element Integer_t;
-		Integer_t possum, negsum, zero;
-		R.init(bound_A, 0);
-		R.init(zero, 0);
+		Integer_t possum, negsum;
+		R.assign(bound_A, R.zero);
 
 		typename ItMatrix::ConstRowIterator rowIter;
 		rowIter = A.rowBegin();
 
-		for (; rowIter != A.rowEnd(); rowIter++) {
+		for (; rowIter != A.rowEnd(); ++rowIter) {
 			typename ItMatrix::ConstRow::const_iterator elm;
-			R.init(possum, 0);
-			R.init(negsum, 0);
-			for (elm = rowIter->begin(); elm != rowIter->end(); elm++)
-				if (*elm > zero)
+			R.assign(possum, R.zero);
+			R.assign(negsum, R.zero);
+			for (elm = rowIter->begin(); elm != rowIter->end(); ++elm)
+				if (*elm > R.zero)
 					R.addin(possum, *elm);
 				else
 					R.subin(negsum, *elm);
@@ -310,21 +299,21 @@ namespace LinBox
 		typedef _IMatrix                  IMatrix;
 		typedef _Ring                        Ring;
 		typedef typename _Ring::Element   Integer_t;
-		typedef std::vector<Integer_t>      IVector;
+		typedef BlasVector<_Ring>      IVector;
 #ifdef RSTIMING
 		mutable Timer ttSetup, tRingApply, tRingOther, ttRingOther, ttRingApply;
 #endif
 
 	protected:
 
-		const IMatrix&            _matA;
-		Ring                      _intRing;
-		Integer_t                   _p;
-		IVector                   _b;
-		VectorDomain<Ring>      _VDR;
-		size_t               _length;
-		Integer_t            _numbound;
-		Integer_t            _denbound;
+		const IMatrix&                    _matA;
+		Ring                           _intRing;
+		Integer_t                            _p;
+		IVector                              _b;
+		VectorDomain<Ring>                 _VDR;
+		size_t                          _length;
+		Integer_t                     _numbound;
+		Integer_t                     _denbound;
 		MatrixApplyDomain<Ring,IMatrix>    _MAD;
 		//BlasApply<Ring>          _BA;
 
@@ -350,7 +339,7 @@ namespace LinBox
 
 		template <class Prime_Type, class Vector1>
 		LiftingContainerBase (const Ring& R, const IMatrix& A, const Vector1& b, const Prime_Type& p):
-			_matA(A), _intRing(R), _VDR(R), _MAD(R,A)
+			_matA(A), _intRing(R), _b(R,b.size()),_VDR(R), _MAD(R,A)
 		{
 
 #ifdef RSTIMING
@@ -372,18 +361,18 @@ namespace LinBox
 
 
 			// initialize res = b
-			_b.resize(b.size());
-			typename Vector1::const_iterator         b_iter    = b.begin();
-			typename std::vector<Integer_t>::iterator  res_iter  = _b.begin() ;
+			// _b.resize(b.size());
+			typename Vector1::const_iterator     b_iter    = b.begin();
+			typename BlasVector<Ring>::iterator  res_iter  = _b.begin() ;
 			for (; b_iter != b.end(); ++res_iter, ++b_iter)
-				this->_intRing.init(*res_iter, *b_iter);
+				this->_intRing.init(*res_iter, int64_t(*b_iter));
 
 			Integer_t had_sq, short_sq;
 			BoundBlackbox(this->_intRing, had_sq, short_sq, A);
 
-			typename std::vector<Integer_t>::const_iterator iterb = _b.begin();
+			typename BlasVector<Ring>::const_iterator iterb = _b.begin();
 			Integer_t normb_sq;
-			this->_intRing.init(normb_sq, 0);
+			this->_intRing.assign(normb_sq, this->_intRing.zero);
 			for (;iterb!=_b.end();++iterb)
 				normb_sq += (*iterb)*(*iterb);
 
@@ -395,7 +384,7 @@ namespace LinBox
 			D = sqrt(had_sqi) + 1;
 			N = sqrt(had_sqi * normb_sqi / short_sqi) + 1;
 			L = N * D * 2;
-			_length = logp(L,Prime) + 1;   // round up instead of down
+			_length = (size_t)logp(L,Prime) + 1;   // round up instead of down
 #ifdef DEBUG_LC
 			std::cout<<" norms computed, p = "<<_p<<"\n";
 			std::cout<<" N = "<<N<<", D = "<<D<<", length = "<<_length<<"\n";
@@ -424,7 +413,7 @@ namespace LinBox
 
 		class const_iterator {
 		private:
-			std::vector<Integer_t>          _res;
+			BlasVector<Ring>              _res;
 			const LiftingContainerBase    &_lc;
 			size_t                   _position;
 		public:
@@ -458,7 +447,7 @@ namespace LinBox
 				/*  prepare for updating residu */
 
 				// compute v2 = _matA * digit
-				IVector v2 (_lc._matA.coldim());
+				IVector v2 (_lc.ring(),_lc._matA.coldim());
 				_lc._MAD.applyV(v2,digit, _res);
 
 #ifdef DEBUG_LC
@@ -477,7 +466,7 @@ namespace LinBox
 
 				// update _res -= v2
 				_lc._VDR.subin (_res, v2);
-				typename std::vector<Integer_t>::iterator p0;
+				typename BlasVector<Ring>::iterator p0;
 				// update _res = _res / p
 				int index=0;
 				for ( p0 = _res.begin(); p0 != _res.end(); ++ p0, ++index){
@@ -492,7 +481,7 @@ namespace LinBox
 				}
 
 				// increase position of the iterator
-				_position++;
+				++_position;
 #ifdef RSTIMING
 				_lc.tRingOther.stop();
 				_lc.ttRingOther += _lc.tRingOther;
@@ -615,14 +604,14 @@ namespace LinBox
 		typedef _IMatrix                           IMatrix;
 		typedef _FMatrix                           FMatrix;
 		typedef typename Field::Element            Element;
-		typedef typename IMatrix::Element          Integer_t;
-		typedef std::vector<Integer_t>               IVector;
-		typedef std::vector<Element>               FVector;
+		typedef typename IMatrix::Element        Integer_t;
+		typedef BlasVector<Ring>                   IVector;
+		typedef BlasVector<Field>                  FVector;
 
 	protected:
 
 		const FMatrix&                  _Ap;
-		Field                            _field;
+		const Field                 *_field;
 		const VectorDomain<Field>      _VDF;
 		mutable FVector              _res_p;
 		mutable FVector            _digit_p;
@@ -640,14 +629,14 @@ namespace LinBox
 				       const FMatrix&   Ap,
 				       const VectorIn&   b,
 				       const Prime_Type& p) :
-			LiftingContainerBase<Ring,IMatrix> (R,A,b,p), _Ap(Ap), _field(F), _VDF(F),
-			_res_p(b.size()), _digit_p(A.coldim()), _BA(F)
+			LiftingContainerBase<Ring,IMatrix> (R,A,b,p), _Ap(Ap), _field(&F), _VDF(F),
+			_res_p(F,b.size()), _digit_p(F,A.coldim()), _BA(F)
 		{
 
 			for (size_t i=0; i< _res_p.size(); ++i)
-				_field.init(_res_p[i]);
+				field().init(_res_p[i]);
 			for (size_t i=0; i< _digit_p.size(); ++i)
-				_field.init(_digit_p[i]);
+				field().init(_digit_p[i]);
 
 			//
 #ifdef RSTIMING
@@ -656,7 +645,7 @@ namespace LinBox
 #endif
 #ifdef DEBUG_LC
 			std::cout<<"Primes: ";
-			_field.write(std::cout);
+			field().write(std::cout);
 			std::cout<<"\n Matrix: \n";
 			A.write(std::cout);
 			std::cout<<"\n Matrix mod p: \n";
@@ -673,27 +662,31 @@ namespace LinBox
 		// return the field
 		const Field& field() const
 		{
-			return _field;
+			return *_field;
 		}
 
 	protected:
 
 		virtual IVector& nextdigit(IVector& digit, const IVector& residu) const
 		{
+			linbox_check(digit.size()==residu.size());
 #ifdef RSTIMING
 			tGetDigitConvert.start();
 #endif
 			LinBox::integer tmp;
 
-			Hom<Ring, Field> hom(this->_intRing, _field);
+			Hom<Ring, Field> hom(this->_intRing, field());
 			// res_p =  residu mod p
-			//VectorHom::map (_res_p, residu, _field, this->_intRing);
+			//VectorHom::map (_res_p, residu, field(), this->_intRing);
 			{
-				typename FVector::iterator iter_p = _res_p.begin();
+				// std::cout << digit.size() << std::endl;
+				typename FVector::iterator     iter_p = _res_p.begin();
 				typename IVector::const_iterator iter = residu.begin();
-				for ( ;iter != residu. end(); ++iter, ++iter_p)
-					//_field. init (*iter_p, this->_intRing.convert(tmp,*iter));
-					hom.image(*iter_p, *iter);//std::cout<<*iter_p<<"= "<< *iter<<" mod "<<this->_p<<"\n";
+				for ( ;iter != residu. end(); ++iter, ++iter_p) {
+					//field(). init (*iter_p, this->_intRing.convert(tmp,*iter));
+					hom.image(*iter_p, *iter);
+					// std::cout<<*iter_p<<"= "<< *iter<<" mod "<<this->_p<<"\n";
+				}
 			}
 #ifdef RSTIMING
 			tGetDigitConvert.stop();
@@ -710,13 +703,13 @@ namespace LinBox
 			tGetDigitConvert.start();
 #endif
 			// digit = digit_p
-			//VectorHom::map(digit, _digit_p, this->_intRing, _field);
+			//VectorHom::map(digit, _digit_p, this->_intRing, field());
 			{
 				typename FVector::const_iterator iter_p = _digit_p.begin();
 				typename IVector::iterator iter = digit.begin();
 
 				for ( ; iter_p!= _digit_p.end(); ++iter_p, ++iter)
-					//this->_intRing.init(*iter, _field.convert(tmp,*iter_p));
+					//this->_intRing.init(*iter, field().convert(tmp,*iter_p));
 					hom.preimage(*iter, *iter_p);
 			}
 
@@ -749,7 +742,7 @@ namespace LinBox
 
 		const FMatrix                  &_Ap;
 		mutable FPolynomial        _MinPoly;
-		Field                            _field;
+		const Field                 *_field;
 		const VectorDomain<Field>      _VDF;
 		mutable FVector              _res_p;
 		mutable FVector            _digit_p;
@@ -768,14 +761,14 @@ namespace LinBox
 					   const FPolynomial& MinPoly,
 					   const VectorIn& b,
 					   const Prime_Type& p) :
-			LiftingContainerBase<Ring,IMatrix> (R,A,b,p), _Ap(Ap), _MinPoly(MinPoly), _field(F), _VDF(F), _res_p(b.size()), _digit_p(A.coldim()), _rand(F)
+			LiftingContainerBase<Ring,IMatrix> (R,A,b,p), _Ap(Ap), _MinPoly(MinPoly), _field(&F), _VDF(F), _res_p(b.size()), _digit_p(A.coldim()), _rand(F)
 		{
 
 			// Normalize the minimal polynomial as f(x)=1- a1/a0 x - a2/a0 x^2 - ...
 			FPolyIterator iter=_MinPoly.begin();
 			while(++iter != _MinPoly.end ()){
-				_field.divin (*iter, _MinPoly.front ());
-				_field.negin (*iter);
+				field().divin (*iter, _MinPoly.front ());
+				field().negin (*iter);
 			}
 #ifdef RSTIMING
 			ttGetDigit.clear();
@@ -788,7 +781,7 @@ namespace LinBox
 		// return the field
 		const Field& field() const
 		{
-			return _field;
+			return *_field;
 		}
 
 	protected:
@@ -805,7 +798,7 @@ namespace LinBox
 				typename FVector::iterator iter_p = _res_p.begin();
 				typename IVector::const_iterator iter = residu.begin();
 				for ( ;iter != residu. end(); ++iter, ++iter_p)
-					_field. init (*iter_p, this->_intRing.convert(tmp,*iter));
+					field(). init (*iter_p, this->_intRing.convert(tmp,*iter));
 			}
 #ifdef RSTIMING
 			tGetDigitConvert.stop();
@@ -830,17 +823,17 @@ namespace LinBox
 			bool nosolution = false;
 			int nosolution_threshold=5;
 			int nst=0;
-			size_t minpoly_degree;
 			// until the digit is incorrect update the minpoly and recompute the digit
 			while (!_VDF.areEqual(error,_res_p) && !nosolution ){
+				size_t minpoly_degree;
 				minpoly_degree=_MinPoly.size();
 				FPolynomial Poly;
 				unsigned long deg;
 				unsigned long size= (_Ap.rowdim() - _MinPoly.size())<<1 ;
-				BlackboxContainer<Field, FMatrix > Sequence(&_Ap,_field,error,size);
+				BlackboxContainer<Field, FMatrix > Sequence(&_Ap,field(),error,size);
 				MasseyDomain<Field,BlackboxContainer<Field, FMatrix > > MD(&Sequence);
 				MD.minpoly(Poly,deg);
-				if (_field.isZero(Poly.front())) {
+				if (field().isZero(Poly.front())) {
 					// here we should stop the execution but not yet implemented
 					std::cout<<" the prime was not good \n, result will be wrong";
 					break;
@@ -849,17 +842,15 @@ namespace LinBox
 				// denormalize the minimal polynomial
 				FPolyIterator iter=_MinPoly.begin();
 				while (++iter != _MinPoly.end()) {
-					_field.mulin (*iter, _MinPoly.front());
-					_field.negin (*iter);
+					field().mulin (*iter, _MinPoly.front());
+					field().negin (*iter);
 				}
 
 				// update the minimal polynomial
-				Element zero;
-				_field.init(zero,0);
-				FPolynomial newMinPoly(_MinPoly.size()+Poly.size()-1,zero);
-				for (size_t i=0; i < _MinPoly.size(); i++)
-					for (size_t j=0 ; j < Poly.size(); j++)
-						_field.axpyin(newMinPoly[i+j],_MinPoly[i],Poly[j]);
+				FPolynomial newMinPoly(_MinPoly.size()+Poly.size()-1,field().zero);
+				for (size_t i=0; i < _MinPoly.size(); ++i)
+					for (size_t j=0 ; j < Poly.size(); ++j)
+						field().axpyin(newMinPoly[i+j],_MinPoly[i],Poly[j]);
 				_MinPoly.clear();
 				Poly.clear();
 				_MinPoly=newMinPoly;
@@ -867,8 +858,8 @@ namespace LinBox
 				// normalize the new minimal polynomial
 				iter=_MinPoly.begin ();
 				while (++iter != _MinPoly.end ()) {
-					_field.divin (*iter, _MinPoly.front ());
-					_field.negin (*iter);
+					field().divin (*iter, _MinPoly.front ());
+					field().negin (*iter);
 				}
 
 				_VDF.mul (_digit_p, _res_p, _MinPoly.back ());
@@ -884,7 +875,7 @@ namespace LinBox
 					nst=0;std::cout<<"updating minpoly\n";
 				}
 				else {
-					if (nst < nosolution_threshold) nst++;
+					if (nst < nosolution_threshold) ++nst;
 					else{
 						nosolution=true;
 						throw PreconditionFailed (__func__, __LINE__, "system is inconsistent or the choosen prime leads to inconsistent resolution");
@@ -901,7 +892,7 @@ namespace LinBox
 				typename FVector::const_iterator iter_p = _digit_p.begin();
 				typename IVector::iterator iter = digit.begin();
 				for ( ; iter_p!= _digit_p.end(); ++iter_p, ++iter)
-					this->_intRing.init(*iter, _field.convert(tmp,*iter_p));
+					this->_intRing.init(*iter, field().convert(tmp,*iter_p));
 			}
 
 #ifdef RSTIMING
@@ -937,7 +928,7 @@ namespace LinBox
 	protected:
 
 		const FMatrix                       &_Ap;
-		Field                                 _field;
+		const Field                     * _field;
 		const VectorDomain<Field>           _VDF;
 		mutable FVector                   _res_p;
 		mutable FVector                 _digit_p;
@@ -966,7 +957,7 @@ namespace LinBox
 						const size_t                        m,
 						const size_t                        n) :
 			LiftingContainerBase<Ring,IMatrix> (R,A,b,p), _Ap(Ap),
-			_field(F),
+			_field(&F),
 			_VDF(F),
 			_res_p(b.size()),
 			_digit_p(A.coldim()),
@@ -993,10 +984,10 @@ namespace LinBox
 
 
 			std::cout<<"U:\n";
-			UU.write(std::cout, _field);
+			UU.write(std::cout, field());
 
 			std::cout<<"V:\n";
-			V.write(std::cout, _field);
+			V.write(std::cout, field());
 
 			Block UAp(_m, _row);
 
@@ -1010,10 +1001,10 @@ namespace LinBox
 				_rand.random(UAp.refEntry(0,i));
 
 
-			_Seq = new Sequence (&Ap, _field, UAp,V);
+			_Seq = new Sequence (&Ap, field(), UAp,V);
 			std::cout<<"Sequence:\n";
 			for (size_t i=0;i<_Seq->getRep().size();++i)
-				_Seq->getRep()[i].write(std::cout,_field)<<"\n";
+				_Seq->getRep()[i].write(std::cout,field())<<"\n";
 			std::cout<<"\n";
 
 
@@ -1040,7 +1031,7 @@ namespace LinBox
 		}
 
 		// return the field
-		const Field& field() const { return _field; }
+		const Field& field() const { return *_field; }
 
 	protected:
 
@@ -1056,7 +1047,7 @@ namespace LinBox
 				typename FVector::iterator iter_p = _res_p.begin();
 				typename IVector::const_iterator iter = residu.begin();
 				for ( ;iter != residu. end(); ++iter, ++iter_p)
-					_field. init (*iter_p, this->_intRing.convert(tmp,*iter));
+					field(). init (*iter_p, this->_intRing.convert(tmp,*iter));
 			}
 #ifdef RSTIMING
 			tGetDigitConvert.stop();
@@ -1066,7 +1057,7 @@ namespace LinBox
 
 			std::cout<<"residue:\n";
 			for (size_t i=0;i<_res_p.size();++i)
-				_field.write(std::cout,_res_p[i])<<",";
+				field().write(std::cout,_res_p[i])<<",";
 			std::cout<<"\n";
 
 
@@ -1076,7 +1067,7 @@ namespace LinBox
 			_Seq->recompute();
 			std::cout<<"Modified Sequence:\n";
 			for (size_t i=0;i<_Seq->getRep().size();++i)
-				_Seq->getRep()[i].write(std::cout,_field)<<"\n";
+				_Seq->getRep()[i].write(std::cout,field())<<"\n";
 			std::cout<<"\n";
 
 			FBlockPolynomial minpoly;
@@ -1092,13 +1083,13 @@ namespace LinBox
 #endif
 			std::cout<<"Block Minpoly:\n";
 			for (size_t i=0;i<minpoly.size();++i)
-				minpoly[i].write(std::cout,_field)<<"\n";
+				minpoly[i].write(std::cout,field())<<"\n";
 			std::cout<<"\n";
 
 			size_t idx=0;
-			if ( _field.isZero(minpoly[0].getEntry(0,0))) {
+			if ( field().isZero(minpoly[0].getEntry(0,0))) {
 				size_t i=1;
-				while ( _field.isZero(minpoly[0].getEntry(i,0)))
+				while ( field().isZero(minpoly[0].getEntry(i,0)))
 					++i;
 				if (i == _m)
 					throw LinboxError(" block minpoly: matrix seems to be singular - abort");
@@ -1107,12 +1098,12 @@ namespace LinBox
 			}
 
 			size_t deg = degree[idx];
-			BlasMatrix<Field> idx_poly(_field,deg+1,_m-1);
+			BlasMatrix<Field> idx_poly(field(),deg+1,_m-1);
 			for (size_t i=0;i<deg+1;++i)
 				for (size_t j=0;j<_m-1;++j)
 					idx_poly.setEntry(i,j,minpoly[i].getEntry(idx,j+1));
 
-			BlasMatrix<Field> Combi(_field,deg+1,_row);
+			BlasMatrix<Field> Combi(field(),deg+1,_row);
 			_BMD.mul(Combi,idx_poly,UU);
 
 
@@ -1140,9 +1131,9 @@ namespace LinBox
 
 			_VDF.addin(accu,lhs);
 			Element scaling;
-			_field.init(scaling);
-			_field.neg(scaling,minpoly[0].getEntry(idx,0));
-			_field.invin(scaling);
+			field().init(scaling);
+			field().neg(scaling,minpoly[0].getEntry(idx,0));
+			field().invin(scaling);
 			_VDF.mul(_digit_p,accu,scaling);
 
 
@@ -1165,7 +1156,7 @@ namespace LinBox
 				typename FVector::const_iterator iter_p = _digit_p.begin();
 				typename IVector::iterator iter = digit.begin();
 				for ( ; iter_p!= _digit_p.end(); ++iter_p, ++iter)
-					this->_intRing.init(*iter, _field.convert(tmp,*iter_p));
+					this->_intRing.init(*iter, field().convert(tmp,*iter_p));
 			}
 
 #ifdef RSTIMING
@@ -1197,9 +1188,9 @@ namespace LinBox
 	protected:
 
 		const FMatrix&                      _Ap;
-		const Diagonal<Field>               &_diagMat;
+		const Diagonal<Field>         &_diagMat;
 		const BlockHankelInverse<Field>  &_Hinv;
-		Field                                _field;
+		const Field                     *_field;
 		mutable FVector                  _res_p;
 		mutable FVector                _digit_p;
 		std::vector<std::vector<Element> >   _u;
@@ -1208,7 +1199,6 @@ namespace LinBox
 		size_t                        _numblock;
 		VectorDomain<Field>                 _VD;
 		BlasMatrixDomain<Field>            _BMD;
-		Element                           _zero;
 
 	public:
 #ifdef RSTIMING
@@ -1228,16 +1218,16 @@ namespace LinBox
 					     const Block&      V,
 					     const VectorIn&   b,
 					     const Prime_Type& p) :
-			LiftingContainerBase<Ring,IMatrix> (R,A,b,p), _Ap(Ap), _Hinv(Hinv), _field(F),
+			LiftingContainerBase<Ring,IMatrix> (R,A,b,p), _Ap(Ap), _Hinv(Hinv), _field(&F),
 			_res_p(b.size()), _digit_p(A.coldim()),  _block(U.rowdim()), _numblock(A.coldim()/_block) , _VD(F), _BMD(F), _diagMat(D)
 		{
 			tApplyU.clear();
 			tApplyH.clear();
 			tApplyV.clear();
 			for (size_t i=0; i< _res_p.size(); ++i)
-				_field.init(_res_p[i]);
+				field().init(_res_p[i]);
 			for (size_t i=0; i< _digit_p.size(); ++i)
-				_field.init(_digit_p[i]);
+				field().init(_digit_p[i]);
 
 			// size_t block= U.rowdim();
 
@@ -1246,10 +1236,9 @@ namespace LinBox
 
 			for (size_t i=0;i<_block;++i)
 				for (size_t j=0;j<_numblock;++j){
-					_field.assign(_u[i][j], U.getEntry(0, i*_numblock+j));
-					_field.assign(_v[i][j], V.getEntry(i*_numblock+j, i));
+					field().assign(_u[i][j], U.getEntry(0, i*_numblock+j));
+					field().assign(_v[i][j], V.getEntry(i*_numblock+j, i));
 				}
-			_field.init(_zero,0);
 
 			//Ap.write(std::cout,F);
 #ifdef RSTIMING
@@ -1258,7 +1247,7 @@ namespace LinBox
 #endif
 #ifdef DEBUG_LC
 			std::cout<<"Primes: ";
-			_field.write(std::cout);
+			field().write(std::cout);
 #endif
 
 		}
@@ -1276,7 +1265,7 @@ namespace LinBox
 		// return the field
 		const Field& field() const
 		{
-			return _field;
+			return *_field;
 		}
 
 	protected:
@@ -1288,14 +1277,14 @@ namespace LinBox
 #endif
 			//LinBox::integer tmp;
 
-			Hom<Ring, Field> hom(this->_intRing, _field);
+			Hom<Ring, Field> hom(this->_intRing, field());
 			// res_p =  residu mod p
-			//VectorHom::map (_res_p, residu, _field, this->_intRing);
+			//VectorHom::map (_res_p, residu, field(), this->_intRing);
 			{
 				typename FVector::iterator iter_p = _res_p.begin();
 				typename IVector::const_iterator iter = residu.begin();
 				for ( ;iter != residu. end(); ++iter, ++iter_p)
-					//_field. init (*iter_p, this->_intRing.convert(tmp,*iter));
+					//field(). init (*iter_p, this->_intRing.convert(tmp,*iter));
 					hom.image(*iter_p, *iter);
 			}
 #ifdef RSTIMING
@@ -1317,8 +1306,8 @@ namespace LinBox
 #if 0
 			std::cout<<"b:=<";
 			for (size_t i=0;i<_res_p.size()-1;++i)
-				_field.write(std::cout,_res_p[i])<<",";
-			_field.write(std::cout,_res_p[_res_p.size()-1])<<">;\n";
+				field().write(std::cout,_res_p[i])<<",";
+			field().write(std::cout,_res_p[_res_p.size()-1])<<">;\n";
 #endif
 
 			size_t n = _Ap.coldim();
@@ -1326,9 +1315,9 @@ namespace LinBox
 			FVector z0(n), b0(n), b1(n);
 			_diagMat.apply(b0, _res_p);
 			_res_p=b0;
-			BlasMatrix<Field> Apib(_field,n, _numblock);
+			BlasMatrix<Field> Apib(field(),n, _numblock);
 			for (size_t i=0;i<n;++i){
-				_field.assign(Apib.refEntry(i,0), _res_p[i]);
+				field().assign(Apib.refEntry(i,0), _res_p[i]);
 			}
 
 			int swi=1;
@@ -1336,22 +1325,22 @@ namespace LinBox
 				if (swi){
 					_Ap.apply(b1, b0);
 					for (size_t i=0;i<n;++i)
-						_field.assign(Apib.refEntry(i,j), b1[i]);
+						field().assign(Apib.refEntry(i,j), b1[i]);
 					swi=0;
 				}
 				else{
 					_Ap.apply(b0, b1);
 					for (size_t i=0;i<n;++i)
-						_field.assign(Apib.refEntry(i,j), b0[i]);
+						field().assign(Apib.refEntry(i,j), b0[i]);
 					swi=1;
 				}
 
 			FVector tmp(_numblock);
 			for (size_t i=0; i<_block; ++i){
-				BlasMatrix<Field> T(_field,Apib, i*_numblock, 0, _numblock, _numblock);
+				BlasMatrix<Field> T(field(),Apib, i*_numblock, 0, _numblock, _numblock);
 				_BMD.mul(tmp, _u[i], T);
 				for (size_t j=0;j<_numblock;++j){
-					this->_field.assign(z0[j*_block+i], tmp[j]);
+					this->field().assign(z0[j*_block+i], tmp[j]);
 				}
 			}
 #ifdef RSTIMING
@@ -1374,14 +1363,14 @@ namespace LinBox
 			   std::cout<<" Hinv U b mod p done\n";
 			   std::cout<<"\n y:=<";
 			   for (size_t i=0;i<_digit_p.size()-1;++i)
-			   _field.write(std::cout,z1[i])<<",";
-			   _field.write(std::cout,z1[_digit_p.size()-1])<<">;\n";
+			   field().write(std::cout,z1[i])<<",";
+			   field().write(std::cout,z1[_digit_p.size()-1])<<">;\n";
 #endif
 
 			// compute digit_p  = [V^T AV^T ... A^k]^T.z1
 			FVector b_bar(n), b_hat(_numblock);
 			for (size_t i=0;i<n;++i)
-				_field.assign(_digit_p[i], _zero);
+				field().assign(_digit_p[i], field().zero);
 
 			for (int i= _numblock-1;i>=0; --i){
 				_Ap.apply(b1, _digit_p);
@@ -1389,7 +1378,7 @@ namespace LinBox
 				for (size_t j=0;j<_block;++j){
 					_VD.mul(b_hat, _v[j], z1[i*_block+j]);
 					for (size_t k=0;k<_numblock;++k)
-						_field.assign(b_bar[j*_numblock+k], b_hat[k]);
+						field().assign(b_bar[j*_numblock+k], b_hat[k]);
 				}
 				_VD.addin(_digit_p, b_bar);
 			}
@@ -1402,8 +1391,8 @@ namespace LinBox
 			   std::cout<<" V Hinv U b mod p done\n";
 			   std::cout<<"\n x:=<";
 			   for (size_t i=0;i<_digit_p.size()-1;++i)
-			   _field.write(std::cout,_digit_p[i])<<",";
-			   _field.write(std::cout,_digit_p[_digit_p.size()-1])<<">;\n";
+			   field().write(std::cout,_digit_p[i])<<",";
+			   field().write(std::cout,_digit_p[_digit_p.size()-1])<<">;\n";
 #endif
 
 #ifdef RSTIMING
@@ -1412,12 +1401,12 @@ namespace LinBox
 			tGetDigitConvert.start();
 #endif
 			// digit = digit_p
-			//VectorHom::map(digit, _digit_p, this->_intRing, _field);
+			//VectorHom::map(digit, _digit_p, this->_intRing, field());
 			{
 				typename FVector::const_iterator iter_p = _digit_p.begin();
 				typename IVector::iterator iter = digit.begin();
 				for ( ; iter_p!= _digit_p.end(); ++iter_p, ++iter)
-					//this->_intRing.init(*iter, _field.convert(tmp,*iter_p));
+					//this->_intRing.init(*iter, field().convert(tmp,*iter_p));
 					hom.preimage(*iter, *iter_p);
 			}
 
@@ -1442,8 +1431,8 @@ namespace LinBox
 		typedef _FMatrix                           FMatrix;
 		typedef typename Field::Element            Element;
 		typedef typename IMatrix::Element          Integer_t;
-		typedef std::vector<Integer_t>               IVector;
-		typedef std::vector<Element>               FVector;
+		typedef BlasVector<Ring>               IVector;
+		typedef BlasVector<Field>               FVector;
 
 	protected:
 
@@ -1452,7 +1441,7 @@ namespace LinBox
 		const Permutation<_Field>&           QQ;
 		const Permutation<_Field>&           PP;
 		unsigned long                     _rank;
-		Field                                _field;
+		const Field                     *_field;
 		mutable FVector                  _res_p;
 		mutable FVector                _digit_p;
 		GaussDomain<Field>                  _GD;
@@ -1472,20 +1461,20 @@ namespace LinBox
 					  unsigned long   rank,
 					  const VectorIn&    b,
 					  const Prime_Type&  p) :
-			LiftingContainerBase<Ring,IMatrix> (R,A,b,p), LL(L),QQ(Q),UU(U), PP(P), _rank(rank),
-			_field(F), _res_p(b.size()), _digit_p(A.coldim()), _GD(F)
+			LiftingContainerBase<Ring,IMatrix> (R,A,b,p), LL(L),UU(U),QQ(Q), PP(P), _rank(rank),
+			_field(&F), _res_p(F,b.size()), _digit_p(F,A.coldim()), _GD(F)
 		{
 			for (size_t i=0; i< _res_p.size(); ++i)
-				_field.init(_res_p[i]);
+				field().init(_res_p[i]);
 			for (size_t i=0; i< _digit_p.size(); ++i)
-				_field.init(_digit_p[i]);
+				field().init(_digit_p[i]);
 		}
 
 
 		virtual ~SparseLULiftingContainer() {}
 
 		// return the field
-		const Field& field() const { return _field; }
+		const Field& field() const { return *_field; }
 
 	protected:
 
@@ -1493,7 +1482,7 @@ namespace LinBox
 		{
 
 			// compute residu mod p
-			Hom<Ring, Field> hom(this->_intRing, _field);
+			Hom<Ring, Field> hom(this->_intRing, field());
 			{
 				typename FVector::iterator iter_p = _res_p.begin();
 				typename IVector::const_iterator iter = residu.begin();
@@ -1501,8 +1490,9 @@ namespace LinBox
 					hom.image(*iter_p, *iter);
 			}
 
+                        FVector w(field(), UU.coldim());
 			// solve the system mod p using L.Q.U.P Factorization
-			_GD.solve(_digit_p, _rank, QQ,LL,UU,PP, _res_p);
+			_GD.solve(_digit_p, w, _rank, QQ,LL,UU,PP, _res_p);
 
 
 			// promote new solution mod p to integers
@@ -1510,7 +1500,7 @@ namespace LinBox
 				typename FVector::const_iterator iter_p = _digit_p.begin();
 				typename IVector::iterator iter = digit.begin();
 				for ( ; iter_p!= _digit_p.end(); ++iter_p, ++iter)
-					//this->_intRing.init(*iter, _field.convert(tmp,*iter_p));
+					//this->_intRing.init(*iter, field().convert(tmp,*iter_p));
 					hom.preimage(*iter, *iter_p);
 			}
 
@@ -1525,7 +1515,6 @@ namespace LinBox
 
 #endif //__LINBOX_lifting_container_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
diff --git a/linbox/algorithms/linbox-tags.h b/linbox/algorithms/linbox-tags.h
deleted file mode 100644
index e5133cb..0000000
--- a/linbox/algorithms/linbox-tags.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/* Copyright (C) 2010,2011,2012 LinBox
- * Written by <brice.boyer at imag.fr>
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*! @file algorithms/linbox-tags.h
- * @ingroup algorithms
- * @brief Provides tags for various algorithms/solutions, à la \c FFLAS.
- * This is a subset of Fflas* enums.
- */
-
-#ifndef __LINBOX_linbox_tags_H
-#define __LINBOX_linbox_tags_H
-
-#include <fflas-ffpack/fflas/fflas.h>
-
-namespace LinBox
-{
-
-	/*! Structure for tags.
-	 * Tags are simple enums that set a choice in a routine.
-	 * For instance, if the user wants a <i>right</i> nullspace,
-	 * she will use a \c LinBoxTag::Right parameter.
-	 *
-	 * There it total compatiblity with \c FFLAS tags (cross link)
-	 * For instance, in LinBox, it is similar to use \c LinBoxTag::Upper and
-	 * <code>(LinBoxTag::Shape) FFLAS::FflasUpper</code>.
-	 *
-	 * @note Tags are not Methods.
-	 */
-	struct LinBoxTag {
-		//! Left/Right Tag
-		enum Side {
-			Left  = FFLAS::FflasLeft, //!< Left
-			Right = FFLAS::FflasRight  //!< Right
-		};
-
-		//! (No)Transpose Tag
-		enum Transpose {
-			NoTrans = FFLAS::FflasNoTrans,
-			Trans   = FFLAS::FflasTrans
-		};
-
-		//! (Upp/Low)er Tag
-		enum Shape {
-			Upper = FFLAS::FflasUpper,
-			Lower = FFLAS::FflasLower
-		} ;
-
-		//! (Non)Unit Diagonal Tag
-		enum Diag {
-			NonUnit = FFLAS::FflasNonUnit,
-			Unit    = FFLAS::FflasUnit
-		} ;
-
-		//! Dense format (table) output Tag
-		enum  Format {
-			FormatPlain = 0,
-			FormatMaple = 1,
-			FormatHTML  = 2,
-			FormatLaTeX = 3
-		} ;
-	} ;
-
-}
-
-#endif // __LINBOX_linbox_tags_H
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/algorithms/massey-domain.h b/linbox/algorithms/massey-domain.h
index decfec7..99fce7a 100644
--- a/linbox/algorithms/massey-domain.h
+++ b/linbox/algorithms/massey-domain.h
@@ -12,20 +12,20 @@
  *
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -81,7 +81,7 @@ namespace LinBox
 	class MasseyDomain {
 	private:
 		Sequence            *_container;
-		Field                _field;
+		const Field                *_field;
 		VectorDomain<Field>  _VD;
 		unsigned long         EARLY_TERM_THRESHOLD;
 
@@ -98,32 +98,36 @@ namespace LinBox
 		MasseyDomain (unsigned long ett_default = DEFAULT_EARLY_TERM_THRESHOLD) :
 			_container           (),
 			_field                   (),
-			_VD                  (_field),
+			_VD                  (),
 			EARLY_TERM_THRESHOLD (ett_default)
 		{}
 
 		MasseyDomain (const MasseyDomain<Field, Sequence> &Mat, unsigned long ett_default = DEFAULT_EARLY_TERM_THRESHOLD) :
 			_container           (Mat._container),
 			_field                   (Mat._field),
-			_VD                  (Mat._field),
+			_VD                  (Mat.field()),
 			EARLY_TERM_THRESHOLD (ett_default)
 		{}
 
 		MasseyDomain (Sequence *D, unsigned long ett_default = DEFAULT_EARLY_TERM_THRESHOLD) :
 			_container           (D),
-			_field                   (D->getField ()),
-			_VD                  (D->getField ()),
+			_field                   (&(D->field ())),
+			_VD                  (D->field ()),
 			EARLY_TERM_THRESHOLD (ett_default)
 		{}
 
 		MasseyDomain (Sequence *MD, const Field &F, unsigned long ett_default = DEFAULT_EARLY_TERM_THRESHOLD) :
 			_container           (MD),
-			_field                   (F),
+			_field                   (&F),
 			_VD                  (F),
 			EARLY_TERM_THRESHOLD (ett_default)
 		{}
 
-		//-- Principal method
+		/*-- Principal method
+		 * C is set to the minpoly when full_poly = true.
+		 * full_poly = false saves 2 iterations. Then C is sometimes not the minpoly,
+		 * but is a poly sufficient for rank deduction.
+	     */
 		template<class Polynomial>
 		long operator () (Polynomial &C, bool full_poly = false)
 		{
@@ -131,7 +135,8 @@ namespace LinBox
 		}
 
 		//-- Domains access
-		const Field &getField    () const { return _field; }
+		const Field &field    () const { return *_field; }
+		const Field &getField    () const { return *_field; } // deprecated
 		Sequence    *getSequence () const { return _container; }
 
 #ifdef INCLUDE_TIMING
@@ -150,18 +155,18 @@ namespace LinBox
 		template <class V>
 		long v_degree (V& v)
 		{
-			long i = v.size()-1;
+			long i = (long)v.size()-1;
 
 			if (i == _DEGINFTY_)
 				return _DEGINFTY_;
 
-			else if (!_field.isZero (v[i]))
+			else if (!field().isZero (v[(size_t)i]))
 				return i;
 
 			// We must re-compute the degree :
 			for (long j = i - 1; j >= 0; j--) {
-				if (!_field.isZero (v[j])) {
-					v.resize (j + 1);
+				if (!field().isZero (v[(size_t)j])) {
+					v.resize ((size_t)j + 1);
 					return j;
 				}
 			}
@@ -173,17 +178,17 @@ namespace LinBox
 		template <class V>
 		long v_val(V& v)
 		{
-			long i = v.size() - 1;
+			long i = (long)v.size() - 1;
 
 			if (i == _DEGINFTY_)
 				return _DEGINFTY_;
 
-			else if (!_field.isZero (v[0]))
+			else if (!field().isZero (v[0]))
 				return 0;
 
 			// We must compute the valuation :
 			for (long j = 1; j <= i; j++)
-				if (!_field.isZero ((v)[j])) return j ;
+				if (!field().isZero ((v)[(size_t)j])) return j ;
 
 			return _DEGINFTY_ ;
 		}
@@ -208,26 +213,31 @@ namespace LinBox
 
 			integer card;
 
-			commentator().start ("Massey", "masseyd", END);
+			commentator().start ("Massey", "masseyd", (unsigned int)END);
 
 			// ====================================================
 			// Sequence and iterator initialization
 			//
 			typename Sequence::const_iterator _iter (_container->begin ());
-			Polynomial S (END + 1);
+			Polynomial S (field(),(size_t)END + 1);
 
 			// -----------------------------------------------
 			// Preallocation. No further allocation.
 			//
-			C.reserve    (n + 1); C.resize (1); _field.assign (C[0], _field.one);
-			Polynomial B (n + 1); B.resize (1); _field.assign (B[0], _field.one);
+			C.reserve    ((size_t)n + 1);
+			C.resize (1);
+			field().assign (C[0], field().one);
+
+			Polynomial B (field(),(size_t)n + 1);
+			B.resize (1);
+			field().assign (B[0], field().one);
 
 			long L = 0;
 			Element b, d, Ds;
 			long x = 1, b_deg = 0, c_deg = 0, l_deg;
 			long COMMOD = (END > 40) ? (END / 20) : 2;
 
-			_field.assign (b, _field.one);
+			field().assign (b, field().one);
 
 
 			for (long NN = 0; NN < END && x < (long) EARLY_TERM_THRESHOLD; ++NN, ++_iter) {
@@ -239,7 +249,7 @@ namespace LinBox
 				// Next coefficient in the sequence
 				// Discrepancy computation
 				//
-				S[NN] = *_iter;
+				S[(size_t)NN] = *_iter;
 
 				//
 #ifdef INCLUDE_TIMING
@@ -252,7 +262,7 @@ namespace LinBox
 				ReverseVector<Subvector<typename Polynomial::iterator> > Spp (Sp);
 				_VD.dot (d, Cp, Spp);
 
-				_field.addin (d, S[NN]);
+				field().addin (d, S[(size_t)NN]);
 
 #ifdef INCLUDE_TIMING
 				timer.stop ();
@@ -262,68 +272,62 @@ namespace LinBox
 				timer.start ();
 #endif // INCLUDE_TIMING
 
-				if (_field.isZero (d)) {
+				if (field().isZero (d)) {
 					++x;
-				}
-				else {
+				} else {
 					if (L > (NN >> 1)) {
 						// -----------------------------------------------
 						// C = C + (Polynome(X,x,-d/b) * B);
 						//
-						_field.divin (_field.neg (Ds, d), b);
+						field().divin (field().neg (Ds, d), b);
 						long i = l_deg = (x + b_deg);
 						if (l_deg > c_deg) {
-							C.resize (l_deg + 1);
+							C.resize ((size_t)l_deg + 1);
 							if (x > c_deg) {
 								for (; i >= x; --i)
-									_field.mul (C[i], Ds, B[i-x]);
+									field().mul (C[(size_t)i], Ds, B[(size_t)(i-x)]);
 								for (; i > c_deg; --i)
-									_field.assign (C[i], _field.zero);
-							}
-							else {
+									field().assign (C[(size_t)i], field().zero);
+							} else {
 								for (; i > c_deg; --i)
-									_field.mul (C[i], Ds, B[i-x]);
+									field().mul (C[(size_t)i], Ds, B[(size_t)(i-x)]);
 								for (; i >= x; --i)
-									_field.axpyin (C[i], Ds, B[i-x]);
+									field().axpyin (C[(size_t)i], Ds, B[(size_t)(i-x)]);
 							}
-						}
-						else {
+						} else {
 							for (; i >= x; --i)
-								_field.axpyin (C[i], Ds, B[i-x]);
+								field().axpyin (C[(size_t)i], Ds, B[(size_t)(i-x)]);
 						}
 						// -----------------------------------------------
 						c_deg = v_degree(C);
 						++x;
-					}
-					else {
+					} else {
 						// -----------------------------------------------
 						// C = C + (Polynome(X,x,-d/b) * B); 					//
-						_field.divin (_field.neg (Ds, d), b);
+						field().divin (field().neg (Ds, d), b);
 						long i = l_deg = x + b_deg;
 						B.resize (C.size ());
 						if (l_deg > c_deg) {
-							C.resize (l_deg+1);
+							C.resize ((size_t)l_deg+1);
 							if (x > c_deg) {
 								for (; i >= x; --i)
-									_field.mul (C[i], Ds, B[i-x]);
+									field().mul (C[(size_t)i], Ds, B[(size_t)(i-x)]);
 								for (; i > c_deg; --i)
-									_field.assign (C[i], _field.zero);
-							}
-							else {
+									field().assign (C[(size_t)i], field().zero);
+							} else {
 								for (; i > c_deg; --i)
-									_field.mul (C[i], Ds, B[i-x]);
+									field().mul (C[(size_t)i], Ds, B[(size_t)(i-x)]);
 								for (; i >= x; --i)
-									_field.axpy (C[i], Ds, B[i-x], _field.assign(B[i],C[i]) );
+									field().axpy (C[(size_t)i], Ds, B[(size_t)(i-x)], field().assign(B[(size_t)i],C[(size_t)i]) );
 							}
-						}
-						else {
+						} else {
 							for (i = c_deg; i > l_deg; --i)
-								_field.assign(B[i],C[i]);
+								field().assign(B[(size_t)i],C[(size_t)i]);
 							for (; i >= x; --i)
-								_field.axpy (C[i], Ds, B[i-x], _field.assign(B[i],C[i]) );
+								field().axpy (C[(size_t)i], Ds, B[(size_t)(i-x)], field().assign(B[(size_t)i],C[(size_t)i]) );
 						}
 
-						for (; i >= 0; --i) _field.assign(B[i],C[i]);
+						for (; i >= 0; --i) field().assign(B[(size_t)i],C[(size_t)i]);
 
 						// -----------------------------------------------
 						L = NN+1-L;
@@ -354,7 +358,7 @@ namespace LinBox
 		//
 		void pseudo_rank (unsigned long &rank)
 		{
-			std::vector<Element> phi;
+			BlasVector<Field> phi(field());
 			massey (phi, 0);
 			rank = v_degree (phi) - v_val (phi);
 		}
@@ -363,7 +367,7 @@ namespace LinBox
 		{
 			commentator().start ("Valence", "LinBox::MasseyDomain::valence");
 
-			std::vector<Element> phi;
+			BlasVector<Field> phi(field());
 			massey (phi, 1);
 			rank = v_degree (phi) - v_val (phi);
 			Valence = phi[v_degree (phi)];
@@ -374,18 +378,17 @@ namespace LinBox
 		template<class Polynomial>
 		unsigned long pseudo_minpoly (Polynomial &phi, unsigned long &rank, bool full_poly = true)
 		{
-			unsigned long L = massey (phi, full_poly);
+			unsigned long L = (unsigned long)massey (phi, full_poly);
 			long dp = v_degree(phi);
-			rank = dp - v_val (phi);
+			rank = (unsigned long) (dp - v_val (phi));
 			if (phi.size()) {
 				for(long i = dp >> 1;i > 0; --i) {
-					phi[0] = phi[i];
-					phi[i] = phi[dp-i];
-					phi[dp-i] = phi[0];
+					phi[0] = phi[(size_t)i];
+					phi[(size_t)i] = phi[(size_t)(dp-i)];
+					phi[(size_t)(dp-i)] = phi[0];
 				}
-				phi[0] = phi[dp];
-// 				_field.init (phi[dp], 1UL);
-				_field.assign (phi[dp], _field.one);
+				phi[0] = phi[(size_t)dp];
+				field().assign (phi[(size_t)dp], field().one);
 			}
 			return L;
 		}
@@ -394,16 +397,16 @@ namespace LinBox
 		void minpoly (Polynomial &phi, unsigned long &rank, bool full_poly = true)
 		{
 			long dp = massey (phi, full_poly);
-			rank = v_degree(phi) - v_val (phi);
+			rank = (unsigned long) (v_degree(phi) - v_val (phi));
 			if (phi.size () > 0) {
-				phi.resize (dp+1);
+				phi.resize ((size_t)dp+1);
 				for (long i = dp >> 1; i > 0; --i)
-					std::swap (phi[i], phi[dp-i]);
-				phi[0] = phi[dp];
-// 				_field.init (phi[dp], 1UL);
-				_field.assign(phi[dp], _field.one);
+					std::swap (phi[(size_t)i], phi[(size_t)(dp-i)]);
+				phi[0] = phi[(size_t)dp];
+				field().assign(phi[(size_t)dp], field().one);
 			}
 		}
+
 	};
 
 }
@@ -411,11 +414,10 @@ namespace LinBox
 #endif // __LINBOX_massey_domain_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/matpoly-mult.h b/linbox/algorithms/matpoly-mult.h
index e63d52f..93ce6d4 100644
--- a/linbox/algorithms/matpoly-mult.h
+++ b/linbox/algorithms/matpoly-mult.h
@@ -27,7 +27,7 @@
 #define __LINBOX_matpoly_mult_H
 
 #include "linbox/randiter/random-fftprime.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
 #include "linbox/matrix/matrix-domain.h"
 #include "linbox/util/error.h"
 #include "linbox/util/debug.h"
@@ -99,8 +99,9 @@ namespace LinBox
 		template< class Polynomial1, class Polynomial2, class Polynomial3>
 		void midproduct (Polynomial1 &a, const Polynomial2 &b, const Polynomial3 &c)
 		{
-			linbox_check( 2*a.size() == c.size()+1);
-			linbox_check( 2*b.size() == c.size()+1);
+			// Need to be check somewhere else (SigmaBasis)
+                        //linbox_check( 2*a.size() == c.size()+1);
+			//linbox_check( 2*b.size() == c.size()+1);
 
 			size_t d = b.size()+c.size();
 			//std::cout<<"midp "<<a.size()<<" = "<<b.size()<<" x "<<c.size()<<"...\n";
@@ -126,7 +127,8 @@ namespace LinBox
 		template< class Polynomial1, class Polynomial2, class Polynomial3>
 		void midproductgen (Polynomial1 &a, const Polynomial2 &b, const Polynomial3 &c)
 		{
-			linbox_check( a.size()+b.size() == c.size()+1);
+			// Need to be check somewhere else (SigmaBasis)
+                        //linbox_check( a.size()+b.size() == c.size()+1);
 
 			size_t d = b.size()+c.size();
 			//std::cout<<"midp "<<a.size()<<" = "<<b.size()<<" x "<<c.size()<<"...\n";
@@ -154,14 +156,16 @@ namespace LinBox
 	template <class Field>
 	class ClassicMulDomain {
 	private:
-		Field                       _field;
+		const Field            *_field;
 		BlasMatrixDomain<Field>   _BMD;
 		MatrixDomain<Field>        _MD;
 
 	public:
 
+		inline const Field & field() const { return *_field; }
+
 		ClassicMulDomain(const Field &F) :
-			_field(F), _BMD(F), _MD(F)
+			_field(&F), _BMD(F), _MD(F)
 		{}
 
 		template< class Polynomial1, class Polynomial2, class Polynomial3>
@@ -170,7 +174,7 @@ namespace LinBox
 			linbox_check(a.size() >= (b.size()+c.size()-1));
 			for (size_t i=0;i<b.size();++i){
 				for (size_t j=0;j<c.size();++j)
-					_BMD.axpyin(a[i+j],b[i],c[j]);
+					_BMD.axpyin(a[(size_t)i+j],b[(size_t)i],c[j]);
 			}
 		}
 
@@ -182,7 +186,7 @@ namespace LinBox
 			for (size_t i=0;i<b.size();++i){
 				for (size_t j=0;j<c.size();++j){
 					if ((i+j<2*a.size()-1) && (i+j>=a.size()-1)){
-						_BMD.axpyin(a[i+j - a.size()+1],b[i],c[j]);
+						_BMD.axpyin(a[(size_t)i+j - a.size()+1],b[(size_t)i],c[j]);
 					}
 				}
 			}
@@ -195,7 +199,7 @@ namespace LinBox
 			for (size_t i=0;i<b.size();++i){
 				for (size_t j=0;j<c.size();++j){
 					if ((i+j>=a.size()-1) && (i+j<=c.size()-1)){
-						_BMD.axpyin(a[i+j - a.size()+1],b[i],c[j]);
+						_BMD.axpyin(a[(size_t)i+j - a.size()+1],b[(size_t)i],c[j]);
 					}
 				}
 			}
@@ -209,14 +213,15 @@ namespace LinBox
 	public:
 		typedef _Field                         Field;
 	private:
-		Field                       _field;
+		const Field           *_field;
 		BlasMatrixDomain<Field>   _BMD;
 		MatrixDomain<Field>        _MD;
 		size_t                    _mul;
 	public:
+		inline const Field & field() const { return *_field; }
 
 		KaratsubaMulDomain(const Field &F) :
-			_field(F), _BMD(F), _MD(F)
+			_field(&F), _BMD(F), _MD(F)
 		{_mul=0;}
 
 		template< class Polynomial1, class Polynomial2, class Polynomial3>
@@ -227,14 +232,16 @@ namespace LinBox
 
 		template< class Polynomial1, class Polynomial2, class Polynomial3>
 		void midproduct(Polynomial1 &a, const Polynomial2 &b, const Polynomial3 &c) {
-			linbox_check( 2*a.size() == c.size()+1);
-			linbox_check( 2*b.size() == c.size()+1);
+			// problem with sigma basis need to be checked
+                        //linbox_check( 2*a.size() == c.size()+1);
+			//linbox_check( 2*b.size() == c.size()+1);
 			midproduct_Karatsuba(a, b, c);
 		}
 
 		template< class Polynomial1, class Polynomial2, class Polynomial3>
 		void midproductgen(Polynomial1 &a, const Polynomial2 &b, const Polynomial3 &c) {
-			linbox_check(a.size()+b.size() == c.size()+1);
+			// problem with sigma basis need to be checked
+                        //linbox_check(a.size()+b.size() == c.size()+1);
 			midproduct_Karatsubagen(a, b, c);
 		}
 
@@ -246,9 +253,9 @@ namespace LinBox
 				   const Polynomial3 &B, size_t shiftB, size_t degB){
 
 			typedef  typename Polynomial1::value_type Coefficient;
-			const Coefficient ZeroC(C[0].rowdim(), C[0].coldim());
-			const Coefficient ZeroA(A[0].rowdim(), A[0].coldim());
-			const Coefficient ZeroB(B[0].rowdim(), B[0].coldim());
+			const Coefficient ZeroC(field(), C[0].rowdim(), C[0].coldim());
+			const Coefficient ZeroA(field(), A[0].rowdim(), A[0].coldim());
+			const Coefficient ZeroB(field(), B[0].rowdim(), B[0].coldim());
 
 			if ((degA == 1) || (degB == 1)) {
 
@@ -288,34 +295,34 @@ namespace LinBox
 
 				// add low and high degrees of A
 				for (size_t i=0;i<degA_low;++i)
-					A_tmp[i]=A[shiftA+i];
+					A_tmp[(size_t)i]=A[shiftA+i];
 				if ( degA_high != 0)
 					for (size_t i=0;i<degA_high;++i)
-						_MD.addin(A_tmp[i],A[shiftA+degSplit+i]);
+						_MD.addin(A_tmp[(size_t)i],A[shiftA+degSplit+i]);
 
 				// add low and high degrees of B
 				for (size_t i=0;i<degB_low;++i)
-					B_tmp[i]=B[shiftA+i];
+					B_tmp[(size_t)i]=B[shiftA+i];
 				if ( degB_high != 0)
 					for (size_t i=0;i<degB_high;++i)
-						_MD.addin(B_tmp[i],B[shiftB+degSplit+i]);
+						_MD.addin(B_tmp[(size_t)i],B[shiftB+degSplit+i]);
 
 				//  multiply the sums
 				Karatsuba_mul(C_tmp, 0, A_tmp, 0, degA_low, B_tmp, 0, degB_low);
 
 				// subtract the low product from the product of sums
 				for (size_t i=0;i< C_tmp.size();++i)
-					_MD.subin(C_tmp[i], C[shiftC+i]);
+					_MD.subin(C_tmp[(size_t)i], C[shiftC+i]);
 
 				// subtract the high product from the product of sums
 				if ((degA_high !=0) && (degB_high != 0))
 					for (size_t i=0;i< degA_high+degB_high-1; ++i)
-						_MD.subin(C_tmp[i], C[shiftC+(degSplit << 1)+i]);
+						_MD.subin(C_tmp[(size_t)i], C[shiftC+(degSplit << 1)+i]);
 
 				// add the middle term of the product
 				size_t mid= (degA_low+degB_high > degB_low+degA_high)? degA_low+degB_high :degB_low+degA_high;
 				for (size_t i=0;i< mid-1; ++i)
-					_MD.addin(C[shiftC+degSplit+i], C_tmp[i]);
+					_MD.addin(C[shiftC+degSplit+i], C_tmp[(size_t)i]);
 			}
 		}
 
@@ -331,50 +338,50 @@ namespace LinBox
 				size_t k1= A.size()-k0;
 
 				typedef  typename Polynomial1::value_type Coefficient;
-				const Coefficient ZeroC(C[0].rowdim(), C[0].coldim());
-				const Coefficient ZeroA(A[0].rowdim(), A[0].coldim());
-				const Coefficient ZeroB(B[0].rowdim(), B[0].coldim());
+				const Coefficient ZeroC(field(), C[0].rowdim(), C[0].coldim());
+				const Coefficient ZeroA(field(), A[0].rowdim(), A[0].coldim());
+				const Coefficient ZeroB(field(), B[0].rowdim(), B[0].coldim());
 
 				std::vector<Coefficient> alpha(k1,ZeroC), beta(k1,ZeroC), gamma(k0,ZeroC);
 				std::vector<Coefficient> A_low(k0, ZeroA), A_high(k1,ZeroA);
 				std::vector<Coefficient> B1(2*k1-1,ZeroB), B2(2*k1-1,ZeroB);
 
 				for (size_t i=0;i<k0;++i)
-					A_low[i] = A[i];
+					A_low[(size_t)i] = A[(size_t)i];
 
 				for (size_t i=k0;i<A.size();++i)
-					A_high[i-k0] = A[i];
+					A_high[(size_t)i-k0] = A[(size_t)i];
 
 				for (size_t i=0;i<2*k1-1;++i){
-					B1[i] = B[i];
-					B2[i] = B[i+k1];
-					_MD.addin(B1[i],B2[i]);
+					B1[(size_t)i] = B[(size_t)i];
+					B2[(size_t)i] = B[(size_t)i+k1];
+					_MD.addin(B1[(size_t)i],B2[(size_t)i]);
 				}
 				midproduct_Karatsuba(alpha, A_high, B1);
 
 				if (k0 == k1) {
 					for (size_t i=0;i<k1;++i)
-						_MD.subin(A_high[i],A_low[i]);
+						_MD.subin(A_high[(size_t)i],A_low[(size_t)i]);
 					midproduct_Karatsuba(beta, A_high, B2);
 				}
 				else {
 					for (size_t i=1;i<k1;++i)
-						_MD.subin(A_high[i],A_low[i-1]);
+						_MD.subin(A_high[(size_t)i],A_low[(size_t)i-1]);
 					midproduct_Karatsuba(beta, A_high, B2);
 				}
 
 				std::vector<Coefficient> B3(2*k0-1,ZeroB);
 				for (size_t i=0;i<2*k0-1;++i)
-					_MD.add(B3[i],B[i+2*k1],B[i+k1]);
+					_MD.add(B3[(size_t)i],B[(size_t)i+2*k1],B[(size_t)i+k1]);
 
 				midproduct_Karatsuba(gamma, A_low, B3);
 
 				for (size_t i=0;i<k1;++i)
-					_MD.sub(C[i],alpha[i],beta[i]);
+					_MD.sub(C[(size_t)i],alpha[(size_t)i],beta[(size_t)i]);
 
 				for (size_t i=0;i<k0;++i){
-					C[k1+i]=gamma[i];
-					_MD.addin(C[k1+i],beta[i]);
+					C[k1+i]=gamma[(size_t)i];
+					_MD.addin(C[k1+i],beta[(size_t)i]);
 				}
 			}
 		}
@@ -384,7 +391,7 @@ namespace LinBox
 
 			if (A.size() == 1){
 				for (size_t i=0;i<B.size();i++)
-					_BMD.mul(C[i],A[0],B[i]);
+					_BMD.mul(C[(size_t)i],A[0],B[(size_t)i]);
 			}
 			else {
 				size_t dA=A.size();
@@ -396,9 +403,9 @@ namespace LinBox
 				std::cout<<C.size()<<" "<<A.size()<<" "<<B.size()<<"("<<Bk0<<","<<Bk1<<")\n";
 
 				typedef  typename Polynomial1::value_type Coefficient;
-				const Coefficient ZeroC(C[0].rowdim(), C[0].coldim());
-				const Coefficient ZeroA(A[0].rowdim(), A[0].coldim());
-				const Coefficient ZeroB(B[0].rowdim(), B[0].coldim());
+				const Coefficient ZeroC(field(), C[0].rowdim(), C[0].coldim());
+				const Coefficient ZeroA(field(), A[0].rowdim(), A[0].coldim());
+				const Coefficient ZeroB(field(), B[0].rowdim(), B[0].coldim());
 
 				std::vector<Coefficient> A_low(Ak0,ZeroA), A_high(Ak1,ZeroA);
 				std::vector<Coefficient> alpha(Bk1,ZeroC), beta(Bk1,ZeroC), gamma(Bk0,ZeroC);
@@ -406,43 +413,43 @@ namespace LinBox
 
 
 				for (size_t i=0;i<Ak0;++i)
-					A_low[i] = A[i];
+					A_low[(size_t)i] = A[(size_t)i];
 
 				for (size_t i=Ak0;i<dA;++i)
-					A_high[i-Ak0] = A[i];
+					A_high[(size_t)i-Ak0] = A[(size_t)i];
 
 				for (size_t i=0;i<Ak1+Bk1-1;++i){
-					B1[i] = B[i];
-					B2[i] = B[i+Ak1];
-					_MD.addin(B1[i],B2[i]);
+					B1[(size_t)i] = B[(size_t)i];
+					B2[(size_t)i] = B[(size_t)i+Ak1];
+					_MD.addin(B1[(size_t)i],B2[(size_t)i]);
 				}
 				midproduct_Karatsubagen(alpha, A_high, B1);
 
 				if (Ak0 == Ak1) {
 					for (size_t i=0;i<Ak1;++i)
-						_MD.subin(A_high[i],A_low[i]);
+						_MD.subin(A_high[(size_t)i],A_low[(size_t)i]);
 					midproduct_Karatsubagen(beta, A_high, B2);
 				}
 				else {
 					for (size_t i=1;i<Ak1;++i)
-						_MD.subin(A_high[i],A_low[i-1]);
+						_MD.subin(A_high[(size_t)i],A_low[(size_t)i-1]);
 					midproduct_Karatsubagen(beta, A_high, B2);
 				}
 
 
 				if (Bk0>0) {
 					for (size_t i=0;i<Ak0+Bk0-1;++i)
-						_MD.add(B3[i],B[i+Ak0+Bk1],B[i+Ak0]);
+						_MD.add(B3[(size_t)i],B[(size_t)i+Ak0+Bk1],B[(size_t)i+Ak0]);
 					midproduct_Karatsubagen(gamma, A_low, B3);
 				}
 
 
 				for (size_t i=0;i<Bk1;++i)
-					_MD.sub(C[i],alpha[i],beta[i]);
+					_MD.sub(C[(size_t)i],alpha[(size_t)i],beta[(size_t)i]);
 
 				for (size_t i=0;i<Bk0;++i){
-					C[Bk1+i]=gamma[i];
-					_MD.addin(C[Bk1+i],beta[i]);
+					C[Bk1+i]=gamma[(size_t)i];
+					_MD.addin(C[Bk1+i],beta[(size_t)i]);
 				}
 			}
 		}
@@ -463,17 +470,18 @@ namespace LinBox
 		typedef SpecialFFTMulDomain<Field>  FFTDomainBase;
 
 	private:
-		Field                _field;
+		const Field                *_field;
 		integer              _p;
 		size_t         _fftsize;
 
 	public:
+		inline const Field & field() const { return *_field; }
 
 		FFTMulDomain (const Field &F) :
-			_field(F)
+			_field(&F)
 		{
 
-			_field.characteristic(_p);
+			field().characteristic(_p);
 
 			_fftsize=0;
 			//check if field is based on fft prime
@@ -492,13 +500,13 @@ namespace LinBox
 			size_t pts =1; while (pts < deg) { pts= pts<<1; ++lpts; }
 
 			typedef  typename Polynomial1::value_type Coefficient;
-			const Coefficient ZeroC(c[0].rowdim(), c[0].coldim());
-			const Coefficient ZeroA(a[0].rowdim(), a[0].coldim());
-			const Coefficient ZeroB(b[0].rowdim(), b[0].coldim());
+			const Coefficient ZeroC(field(), c[0].rowdim(), c[0].coldim());
+			const Coefficient ZeroA(field(), a[0].rowdim(), a[0].coldim());
+			const Coefficient ZeroB(field(), b[0].rowdim(), b[0].coldim());
 
 			// check if fft prime and good enough
 			if (lpts < _fftsize){
-				FFTDomainBase fftdomain(_field);
+				FFTDomainBase fftdomain(field());
 				fftdomain.mul(a, b, c);
 			}
 			else {
@@ -514,20 +522,21 @@ namespace LinBox
 				size_t bit = std::max((53-ln)>>1, _p.bitsize());
 
 				// get number of necessary primes
-				integer ibound = n * _p * _p * std::max(b.size(), c.size());
-				integer primesprod=1; size_t nbrprimes=1;
-				RandomFFTPrime fftprime((int)bit, FFT_PRIME_SEED);
+				integer ibound = uint64_t(n) * _p * _p * std::max(b.size(), c.size());
+				integer primesprod;
+				size_t nbrprimes=1;
+				RandomFFTPrime fftprime((size_t)bit, FFT_PRIME_SEED);
 				std::vector<integer> lprimes(10); lprimes.resize(nbrprimes);
-				lprimes[0] = fftprime.randomPrime();
+				lprimes[0] = fftprime.generatePrime();
 				primesprod = lprimes[0];
 				while (primesprod < ibound) {
 					++nbrprimes;
 					lprimes.resize(nbrprimes);
-					do {lprimes[nbrprimes-1] = fftprime.randomPrime();} while (primesprod % lprimes[nbrprimes-1] == 0);
+					do {lprimes[nbrprimes-1] = fftprime.generatePrime();} while (primesprod % lprimes[nbrprimes-1] == 0);
 					primesprod *= lprimes[nbrprimes-1];
 				}
 #ifdef FFT_TIMING
-				std::cout<<"num of primes "<<nbrprimes<<"\n";
+				std::cout<<"num of primes "<<nbrprimes<< std::endl;
 #endif
 				// allocate fftprime fields
 				Field * f_i = new Field[nbrprimes];
@@ -537,11 +546,11 @@ namespace LinBox
 
 				// set fftprimes, fftdomains, polynomial matrix results
 				for (size_t i=0; i< nbrprimes; ++i){
-					f_i[i] = Field(lprimes[i]);
-					FFTDomainBase fftdomain(f_i[i]);
-					a_i[i] = std::vector<Coefficient>(a.size(), ZeroA);
+					f_i[(size_t)i] = Field(lprimes[(size_t)i]);
+					FFTDomainBase fftdomain(f_i[(size_t)i]);
+					a_i[(size_t)i] = std::vector<Coefficient>(a.size(), ZeroA);
 					// does not work if original field representation is not Fp seen as integers mod p
-					fftdomain.mul(a_i[i], b ,c);
+					fftdomain.mul(a_i[(size_t)i], b ,c);
 				}
 
 				Timer chrono;
@@ -551,7 +560,7 @@ namespace LinBox
 					for (size_t kk=0;kk<a.size();++kk)
 						for (size_t i=0;i<a[0].rowdim();++i)
 							for (size_t j=0;j<a[0].coldim();++j){
-								_field.init(a[kk].refEntry(i,j), a_i[0][kk].getEntry(i,j));
+								field().init(a[kk].refEntry(i,j), a_i[0][kk].getEntry(i,j));
 							}
 				}
 				else {
@@ -559,9 +568,9 @@ namespace LinBox
 					Element * crt_inv = new Element[nbrprimes];
 					Element tmp;
 					for (size_t i=0;i<nbrprimes; ++i){
-						crt[i]=primesprod/lprimes[i];
-						f_i[i].init(tmp,crt[i]);
-						f_i[i].inv(crt_inv[i], tmp);
+						crt[(size_t)i]=primesprod/lprimes[(size_t)i];
+						f_i[(size_t)i].init(tmp,crt[(size_t)i]);
+						f_i[(size_t)i].inv(crt_inv[(size_t)i], tmp);
 					}
 
 					integer res,acc;
@@ -576,7 +585,7 @@ namespace LinBox
 									if (acc > primesprod)
 										acc-= primesprod;
 								}
-								_field.init(a[kk].refEntry(i,j), acc);
+								field().init(a[kk].refEntry(i,j), acc);
 							}
 #ifdef FFT_TIMING
 					chrono.stop();std::cout<<"reconstruction time: "<<chrono<<"\n";
@@ -591,8 +600,9 @@ namespace LinBox
 
 		template< class Polynomial1, class Polynomial2, class Polynomial3>
 		void midproduct(Polynomial1 &a, const Polynomial2 &b, const Polynomial3 &c) {
-			linbox_check(2*a.size() == c.size()+1 );
-			linbox_check(2*b.size() == c.size()+1 );
+			// need to be checked for sigmabasis
+                        //linbox_check(2*a.size() == c.size()+1 );
+			//linbox_check(2*b.size() == c.size()+1 );
 			linbox_check(b[0].coldim() == c[0].rowdim());
 
 			size_t mm = b[0].rowdim();
@@ -600,7 +610,7 @@ namespace LinBox
 			size_t nn = c[0].coldim();
 
 			typedef  typename Polynomial1::value_type Coefficient;
-			const Coefficient ZeroA(mm,nn), ZeroB(mm,kk), ZeroC(kk,nn);
+			const Coefficient ZeroA(field(), mm,nn), ZeroB(field(), mm,kk), ZeroC(field(), kk,nn);
 
 			size_t deg  = c.size()+1;
 			size_t lpts = 0;
@@ -608,7 +618,7 @@ namespace LinBox
 
 			// check if fft prime and good enough
 			if (lpts < _fftsize){
-				FFTDomainBase fftdomain(_field);
+				FFTDomainBase fftdomain(field());
 				fftdomain.midproduct(a, b, c);
 			}
 			else {
@@ -628,16 +638,17 @@ namespace LinBox
 				size_t bit = std::max((53-ln)>>1, _p.bitsize());
 
 				// get number of necessary primes
-				integer ibound = n * _p * _p * std::max(b.size(), c.size());
-				integer primesprod=1; size_t nbrprimes=1;
-				RandomFFTPrime fftprime((int)bit, FFT_PRIME_SEED);
+				integer ibound = uint64_t(n) * _p * _p * std::max(b.size(), c.size());
+				integer primesprod;
+				size_t nbrprimes=1;
+				RandomFFTPrime fftprime(bit, FFT_PRIME_SEED);
 				std::vector<integer> lprimes(10); lprimes.resize(nbrprimes);
-				lprimes[0] = fftprime.randomPrime();
+				lprimes[0] = fftprime.generatePrime();
 				primesprod = lprimes[0];
 				while (primesprod < ibound) {
 					++nbrprimes;
 					lprimes.resize(nbrprimes);
-					do {lprimes[nbrprimes-1] = fftprime.randomPrime();} while (primesprod % lprimes[nbrprimes-1] == 0);
+					do {lprimes[nbrprimes-1] = fftprime.generatePrime();} while (primesprod % lprimes[nbrprimes-1] == 0);
 					primesprod *= lprimes[nbrprimes-1];
 				}
 
@@ -653,11 +664,11 @@ namespace LinBox
 
 				// set fftprimes, fftdomains, polynomial matrix results
 				for (size_t i=0; i< nbrprimes; ++i){
-					f_i[i] = Field(lprimes[i]);
-					FFTDomainBase fftdomain(f_i[i]);
-					a_i[i] = std::vector<Coefficient>(a.size(), ZeroA);
+					f_i[(size_t)i] = Field(lprimes[(size_t)i]);
+					FFTDomainBase fftdomain(f_i[(size_t)i]);
+					a_i[(size_t)i] = std::vector<Coefficient>(a.size(), ZeroA);
 					// does not work if original field representation is not Fp seen as integers mod p
-					fftdomain.midproduct(a_i[i], b ,c);
+					fftdomain.midproduct(a_i[(size_t)i], b ,c);
 				}
 
 				Timer chrono;
@@ -667,7 +678,7 @@ namespace LinBox
 					for (size_t k=0;k<a.size();++k)
 						for (size_t i=0;i<a[0].rowdim();++i)
 							for (size_t j=0;j<a[0].coldim();++j){
-								_field.init(a[k].refEntry(i,j), a_i[0][k].getEntry(i,j));
+								field().init(a[k].refEntry(i,j), a_i[0][k].getEntry(i,j));
 							}
 				}
 				else {
@@ -675,9 +686,9 @@ namespace LinBox
 					Element * crt_inv = new Element[nbrprimes];
 					Element tmp;
 					for (size_t i=0;i<nbrprimes; ++i){
-						crt[i]=primesprod/lprimes[i];
-						f_i[i].init(tmp,crt[i]);
-						f_i[i].inv(crt_inv[i], tmp);
+						crt[(size_t)i]=primesprod/lprimes[(size_t)i];
+						f_i[(size_t)i].init(tmp,crt[(size_t)i]);
+						f_i[(size_t)i].inv(crt_inv[(size_t)i], tmp);
 					}
 
 					integer res,acc;
@@ -692,7 +703,7 @@ namespace LinBox
 									if (acc > primesprod)
 										acc-= primesprod;
 								}
-								_field.init(a[k].refEntry(i,j), acc);
+								field().init(a[k].refEntry(i,j), acc);
 							}
 					delete [] crt;
 					delete [] crt_inv;
@@ -711,24 +722,25 @@ namespace LinBox
 
 	// Specialization for extension field GFqDom
 	template <>
-	class FFTMulDomain<GivaroGfq> {
+	class FFTMulDomain<Givaro::GFq> {
 	public:
-		typedef GivaroGfq                                   Field;
-		typedef Modular<double>                      ModularField;
+		typedef Givaro::GFq                                   Field;
+		typedef Givaro::Modular<double>                      ModularField;
 		typedef typename Field::Element                   Element;
 		typedef typename ModularField::Element     ModularElement;
 		typedef SpecialFFTMulDomain<ModularField>   FFTDomainBase;
 
 	private:
-		Field                _field;
+		const Field     *_field;
 		integer              _p;
 		size_t         _fftsize;
 
 	public:
+		inline const Field & field() const { return *_field; }
 
-		FFTMulDomain (const Field &F) :  _field(F){
+		FFTMulDomain (const Field &F) :  _field(&F){
 
-			_field.characteristic(_p);
+			field().characteristic(_p);
 
 			_fftsize=0;
 			//check if field is based on fft prime
@@ -747,9 +759,9 @@ namespace LinBox
 			size_t pts =1; while (pts < deg) { pts= pts<<1; ++lpts; }
 
 			typedef  typename Polynomial1::value_type Coefficient;
-			const Coefficient ZeroC(c[0].rowdim(), c[0].coldim());
-			const Coefficient ZeroA(a[0].rowdim(), a[0].coldim());
-			const Coefficient ZeroB(b[0].rowdim(), b[0].coldim());
+			const Coefficient ZeroC(field(), c[0].rowdim(), c[0].coldim());
+			const Coefficient ZeroA(field(), a[0].rowdim(), a[0].coldim());
+			const Coefficient ZeroB(field(), b[0].rowdim(), b[0].coldim());
 
 
 			// computation done using CRT with few fft primes
@@ -768,12 +780,12 @@ namespace LinBox
 			integer primesprod=1; size_t nbrprimes=1;
 			RandomFFTPrime fftprime(bit, FFT_PRIME_SEED);
 			std::vector<integer> lprimes(10); lprimes.resize(nbrprimes);
-			lprimes[0] = fftprime.randomPrime();
+			lprimes[0] = fftprime.generatePrime();
 			primesprod = lprimes[0];
 			while (primesprod < ibound) {
 				++nbrprimes;
 				lprimes.resize(nbrprimes);
-				do {lprimes[nbrprimes-1] = fftprime.randomPrime();} while (primesprod % lprimes[nbrprimes-1] == 0);
+				do {lprimes[nbrprimes-1] = fftprime.generatePrime();} while (primesprod % lprimes[nbrprimes-1] == 0);
 				primesprod *= lprimes[nbrprimes-1];
 			}
 #ifdef FFT_TIMING
@@ -790,14 +802,14 @@ namespace LinBox
 
 			// set fftprimes, fftdomains, polynomial matrices
 			for (size_t i=0; i< nbrprimes; ++i){
-				f_i[i] = Field(lprimes[i]);
-				FFTDomainBase fftdomain(f_i[i]);
-				a_i[i] = std::vector<Coefficient>(a.size(), ZeroA);
-				b_i[i] = std::vector<Coefficient>(b.size(), ZeroB);
-				c_i[i] = std::vector<Coefficient>(c.size(), ZeroC);
+				f_i[(size_t)i] = Field(lprimes[(size_t)i]);
+				FFTDomainBase fftdomain(f_i[(size_t)i]);
+				a_i[(size_t)i] = std::vector<Coefficient>(a.size(), ZeroA);
+				b_i[(size_t)i] = std::vector<Coefficient>(b.size(), ZeroB);
+				c_i[(size_t)i] = std::vector<Coefficient>(c.size(), ZeroC);
 
 				// does not work if original field representation is not Fp seen as integers mod p
-				fftdomain.mul(a_i[i], b ,c);
+				fftdomain.mul(a_i[(size_t)i], b ,c);
 			}
 
 			Timer chrono;
@@ -807,7 +819,7 @@ namespace LinBox
 				for (size_t k=0;k<a.size();++k)
 					for (size_t i=0;i<a[0].rowdim();++i)
 						for (size_t j=0;j<a[0].coldim();++j){
-							_field.init(a[k].refEntry(i,j), a_i[0][k].getEntry(i,j));
+							field().init(a[k].refEntry(i,j), a_i[0][k].getEntry(i,j));
 						}
 			}
 			else {
@@ -815,9 +827,9 @@ namespace LinBox
 				Element * crt_inv = new Element[nbrprimes];
 				Element tmp;
 				for (size_t i=0;i<nbrprimes; ++i){
-					crt[i]=primesprod/lprimes[i];
-					f_i[i].init(tmp,crt[i]);
-					f_i[i].inv(crt_inv[i], tmp);
+					crt[(size_t)i]=primesprod/lprimes[(size_t)i];
+					f_i[(size_t)i].init(tmp,crt[(size_t)i]);
+					f_i[(size_t)i].inv(crt_inv[(size_t)i], tmp);
 				}
 
 				integer res,acc;
@@ -832,7 +844,7 @@ namespace LinBox
 								if (acc > primesprod)
 									acc-= primesprod;
 							}
-							_field.init(a[k].refEntry(i,j), acc);
+							field().init(a[k].refEntry(i,j), acc);
 						}
 #ifdef FFT_TIMING
 				chrono.stop();std::cout<<"reconstruction time: "<<chrono<<"\n";
@@ -847,8 +859,9 @@ namespace LinBox
 
 		template< class Polynomial1, class Polynomial2, class Polynomial3>
 		void midproduct(Polynomial1 &a, const Polynomial2 &b, const Polynomial3 &c) {
-			linbox_check(2*a.size() == c.size()+1 );
-			linbox_check(2*b.size() == c.size()+1 );
+			// need to be checked for sigmabasis
+                        //linbox_check(2*a.size() == c.size()+1 );
+			//linbox_check(2*b.size() == c.size()+1 );
 			linbox_check(b[0].coldim() == c[0].rowdim());
 
 			size_t m = b[0].rowdim();
@@ -856,7 +869,7 @@ namespace LinBox
 			size_t n = c[0].coldim();
 
 			typedef  typename Polynomial1::value_type Coefficient;
-			const Coefficient ZeroA(m,n), ZeroB(m,k), ZeroC(k,n);
+			const Coefficient ZeroA(field(), m,n), ZeroB(field(), m,k), ZeroC(field(), k,n);
 
 			size_t deg  = c.size()+1;
 			size_t lpts = 0;
@@ -864,7 +877,7 @@ namespace LinBox
 
 			// check if fft prime and good enough
 			if (lpts < _fftsize){
-				FFTDomainBase fftdomain(_field);
+				FFTDomainBase fftdomain(field());
 				fftdomain.midproduct(a, b, c);
 			}
 			else {
@@ -884,12 +897,12 @@ namespace LinBox
 				integer primesprod=1; size_t nbrprimes=1;
 				RandomFFTPrime fftprime(bit, FFT_PRIME_SEED);
 				std::vector<integer> lprimes(10); lprimes.resize(nbrprimes);
-				lprimes[0] = fftprime.randomPrime();
+				lprimes[0] = fftprime.generatePrime();
 				primesprod = lprimes[0];
 				while (primesprod < ibound) {
 					++nbrprimes;
 					lprimes.resize(nbrprimes);
-					do {lprimes[nbrprimes-1] = fftprime.randomPrime();} while (primesprod % lprimes[nbrprimes-1] == 0);
+					do {lprimes[nbrprimes-1] = fftprime.generatePrime();} while (primesprod % lprimes[nbrprimes-1] == 0);
 					primesprod *= lprimes[nbrprimes-1];
 				}
 
@@ -905,11 +918,11 @@ namespace LinBox
 
 				// set fftprimes, fftdomains, polynomial matrix results
 				for (size_t i=0; i< nbrprimes; ++i){
-					f_i[i] = Field(lprimes[i]);
-					FFTDomainBase fftdomain(f_i[i]);
-					a_i[i] = std::vector<Coefficient>(a.size(), ZeroA);
+					f_i[(size_t)i] = Field(lprimes[(size_t)i]);
+					FFTDomainBase fftdomain(f_i[(size_t)i]);
+					a_i[(size_t)i] = std::vector<Coefficient>(a.size(), ZeroA);
 					// does not work if original field representation is not Fp seen as integers mod p
-					fftdomain.midproduct(a_i[i], b ,c);
+					fftdomain.midproduct(a_i[(size_t)i], b ,c);
 				}
 
 				Timer chrono;
@@ -919,7 +932,7 @@ namespace LinBox
 					for (size_t k=0;k<a.size();++k)
 						for (size_t i=0;i<a[0].rowdim();++i)
 							for (size_t j=0;j<a[0].coldim();++j){
-								_field.init(a[k].refEntry(i,j), a_i[0][k].getEntry(i,j));
+								field().init(a[k].refEntry(i,j), a_i[0][k].getEntry(i,j));
 							}
 				}
 				else {
@@ -927,9 +940,9 @@ namespace LinBox
 					Element * crt_inv = new Element[nbrprimes];
 					Element tmp;
 					for (size_t i=0;i<nbrprimes; ++i){
-						crt[i]=primesprod/lprimes[i];
-						f_i[i].init(tmp,crt[i]);
-						f_i[i].inv(crt_inv[i], tmp);
+						crt[(size_t)i]=primesprod/lprimes[(size_t)i];
+						f_i[(size_t)i].init(tmp,crt[(size_t)i]);
+						f_i[(size_t)i].inv(crt_inv[(size_t)i], tmp);
 					}
 
 					integer res,acc;
@@ -944,7 +957,7 @@ namespace LinBox
 									if (acc > primesprod)
 										acc-= primesprod;
 								}
-								_field.init(a[k].refEntry(i,j), acc);
+								field().init(a[k].refEntry(i,j), acc);
 							}
 					delete [] crt;
 					delete [] crt_inv;
@@ -969,7 +982,7 @@ namespace LinBox
 		typedef typename Field::Element                 Element;
 
 	private:
-		Field                      _field;
+		const Field           *_field;
 		integer                    _p;
 		long                      _pl;
 		MatrixDomain<Field>       _MD;
@@ -977,12 +990,13 @@ namespace LinBox
 		double fftadd, fftmul, fftcopy;
 		mutable             long _gen;
 	public:
+		inline const Field & field() const { return *_field; }
 
 		SpecialFFTMulDomain(const Field &F) :
-			_field(F), _MD(F), _BMD(F)
+			_field(&F), _MD(F), _BMD(F)
 		{
 			F.characteristic(_p);
-			_pl = _p;
+			_pl = int64_t(_p);
 			fftadd= fftmul = fftcopy=0.;
 
 			// find a pseudo primitive element of the multiplicative group _p -1
@@ -1026,7 +1040,7 @@ namespace LinBox
 			size_t k = b[0].coldim();
 			size_t n = c[0].coldim();
 			typedef  typename Polynomial1::value_type Coefficient;
-			const Coefficient ZeroA(m,n), ZeroB(m,k), ZeroC(k,n);
+			const Coefficient ZeroA(field(), m,n), ZeroB(field(), m,k), ZeroC(field(), k,n);
 
 			size_t deg     = b.size()+c.size()-1;
 			size_t lpts = 0;
@@ -1044,7 +1058,7 @@ namespace LinBox
 			// find a pseudo nth primitive root of unity
 			for (;;) {
 				// compute the nth primitive root
-				w=  (long) Givaro::powmod(_gen, _pl>>lpts, _p);
+				w=  (int64_t) Givaro::powmod(int64_t(_gen), int64_t(_pl>>lpts), _p);
 				if ((w !=1) && (w != _pl-1))
 					break;
 
@@ -1077,24 +1091,25 @@ namespace LinBox
 			long inv_w;
 
 			// compute w^(-1) mod p using extended euclidean algorithm
-			long x_int, y_int, q, tx, ty, temp;
-			x_int = (long) _p;
-			y_int = (long) w;
+			long x_int, y_int, tx, ty;
+			x_int = (int64_t) _p;
+			y_int = (int64_t) w;
 			tx = 0; ty = 1;
 			while (y_int != 0) {
+				long q,temp;
 				q = x_int / y_int; // integer quotient
 				temp = y_int; y_int = x_int - q * y_int;
 				x_int = temp;
 				temp = ty; ty = tx - q * ty;
 				tx = temp;
 			}
-			if (tx < 0) tx += (long) _p;
+			if (tx < 0) tx += (int64_t) _p;
 			inv_w = tx;
 
 
 			Element _w, _inv_w;
-			_field.init(_w, w);
-			_field.init(_inv_w, inv_w);
+			field().init(_w, w);
+			field().init(_inv_w, inv_w);
 			std::vector<Element> pow_w(pts);
 			std::vector<Element> pow_inv_w(pts);
 
@@ -1102,29 +1117,29 @@ namespace LinBox
 			//std::cout<<"degree: "<<pts<<"\n";
 
 			// compute power of w and w^(-1)
-			_field.init(pow_w[0],1);
-			_field.init(pow_inv_w[0],1);
+			field().assign(pow_w[0],field().one);
+			field().assign(pow_inv_w[0],field().one);
 			for (size_t i=1;i<pts;++i){
-				_field.mul(pow_w[i], pow_w[i-1], _w);
-				_field.mul(pow_inv_w[i], pow_inv_w[i-1], _inv_w);
+				field().mul(pow_w[(size_t)i], pow_w[(size_t)i-1], _w);
+				field().mul(pow_inv_w[(size_t)i], pow_inv_w[(size_t)i-1], _inv_w);
 			}
 
 			// compute reverse bit ordering
 			// size_t revbit[pts];
 			std::vector<size_t> revbit(pts);
-			for (long i = 0, j = 0; i < static_cast<long>(pts); i++, j = RevInc(j, lpts))
+			for (long i = 0, j = 0; i < static_cast<long>(pts); i++, j = RevInc(j, (long)lpts))
 				revbit[(size_t)i]=(size_t)j;
 
 			// set the data
 			std::vector<Coefficient> fft_a(pts, ZeroA), fft_b(pts, ZeroB), fft_c(pts,ZeroC);
 			for (size_t i=0;i<b.size();++i)
-				fft_b[i]=b[i];
+				fft_b[(size_t)i]=b[(size_t)i];
 			for (size_t i=b.size();i<pts;++i)
-				fft_b[i]=ZeroB;
+				fft_b[(size_t)i]=ZeroB;
 			for (size_t i=0;i<c.size();++i)
-				fft_c[i]=c[i];
+				fft_c[(size_t)i]=c[(size_t)i];
 			for (size_t i=c.size();i<pts;++i)
-				fft_c[i]=ZeroC;
+				fft_c[(size_t)i]=ZeroC;
 
 
 
@@ -1161,13 +1176,13 @@ namespace LinBox
 				// 				{chrono_mul[omp_get_thread_num()].start();
 				// #endif
 				// #endif
-				_BMD.mul(fft_a[i], fft_b[i], fft_c[i]);
+				_BMD.mul(fft_a[(size_t)i], fft_b[(size_t)i], fft_c[(size_t)i]);
 #ifdef FFT_TIMING
 			chrono.stop();
 #ifdef __LINBOX_HAVE_OPENMP
 			//chrono_mul[omp_get_thread_num()].stop();chrono_mul_t[omp_get_thread_num()]+=chrono_mul[omp_get_thread_num()];}
 			//for (size_t i=0;i<omp_get_max_threads();i++)
-			//std::cout<<"FFT: componentwise mul thread["<<i<<"] -> "<<chrono_mul_t[i]<<std::endl;
+			//std::cout<<"FFT: componentwise mul thread["<<i<<"] -> "<<chrono_mul_t[(size_t)i]<<std::endl;
 #endif
 			std::cout<<"FFT: componentwise mul total      : "<<chrono<<"\n";
 			chrono.clear();
@@ -1182,13 +1197,13 @@ namespace LinBox
 			// #pragma omp parallel for shared(fft_a,revbit) private(Element) schedule(runtime)
 			// #endif
 			for (size_t i=0; i< pts; ++i){
-				if (revbit[i]>i){
-					typename Coefficient::Iterator it_a1=fft_a[i].Begin();
-					typename Coefficient::Iterator it_a2=fft_a[revbit[i]].Begin();
-					for (; it_a1 != fft_a[i].End(); ++it_a1, ++it_a2){
-						_field.assign(swapping,*it_a1);
-						_field.assign(*it_a1, *it_a2);
-						_field.assign(*it_a2,swapping);
+				if (revbit[(size_t)i]>i){
+					typename Coefficient::Iterator it_a1=fft_a[(size_t)i].Begin();
+					typename Coefficient::Iterator it_a2=fft_a[revbit[(size_t)i]].Begin();
+					for (; it_a1 != fft_a[(size_t)i].End(); ++it_a1, ++it_a2){
+						field().assign(swapping,*it_a1);
+						field().assign(*it_a1, *it_a2);
+						field().assign(*it_a2,swapping);
 					}
 				}
 			}
@@ -1216,17 +1231,17 @@ namespace LinBox
 
 			// set the result according to bitreverse ordering and multiply by 1/pts
 			Element inv_pts;
-			_field.init(inv_pts, pts);
-			_field.invin(inv_pts);
+			field().init(inv_pts, pts);
+			field().invin(inv_pts);
 
 			// #ifdef __LINBOX_HAVE_OPENMP
 			// #pragma omp parallel for shared(a,fft_a,revbit,inv_pts) schedule(stati
 			// #endif
 
 			for (long i=0; i< static_cast<long>(deg); ++i){
-				//a[i] = fft_a[revbit[i]];
-				//_MD.mulin(a[i], inv_pts);
-				_MD.mul(a[i],fft_a[revbit[i]],inv_pts);
+				//a[(size_t)i] = fft_a[revbit[(size_t)i]];
+				//_MD.mulin(a[(size_t)i], inv_pts);
+				_MD.mul(a[(size_t)i],fft_a[revbit[(size_t)i]],inv_pts);
 			}
 #ifdef FFT_TIMING
 			chrono.stop();
@@ -1238,16 +1253,16 @@ namespace LinBox
 		// middle product: a[0..n-1] = (b.c)[n..2n-1]
 		template< class Polynomial1, class Polynomial2, class Polynomial3>
 		void midproduct (Polynomial1 &a, const Polynomial2 &b, const Polynomial3 &c) {
-
-			linbox_check(2*a.size() == c.size()+1 );
-			linbox_check(2*b.size() == c.size()+1 );
+                        // need to be checked for sigmabasis
+			//linbox_check(2*a.size() == c.size()+1 );
+			//linbox_check(2*b.size() == c.size()+1 );
 			linbox_check(b[0].coldim() == c[0].rowdim());
 
 			size_t m = b[0].rowdim();
 			size_t k = b[0].coldim();
 			size_t n = c[0].coldim();
 			typedef  typename Polynomial1::value_type Coefficient;
-			const Coefficient ZeroA(m,n), ZeroB(m,k), ZeroC(k,n);
+			const Coefficient ZeroA(field(), m,n), ZeroB(field(), m,k), ZeroC(field(), k,n);
 
 			size_t deg  = c.size()+1;
 			size_t lpts = 0;
@@ -1263,7 +1278,7 @@ namespace LinBox
 			for (;;) {
 
 				// compute the nth primitive root
-				w=  (long) Givaro::powmod(_gen, _pl>>lpts, _p);
+				w=  (int64_t) Givaro::powmod(int64_t(_gen), int64_t(_pl>>lpts), _p);
 				//std::cout<<w<<" : "<<_gen<<"\n"<<(_pl>>lpts)<<"\n";
 
 				if ((w !=1) && (w != _pl-1))
@@ -1298,52 +1313,53 @@ namespace LinBox
 			long inv_w;
 
 			// compute w^(-1) mod p using extended euclidean algorithm
-			long x_int, y_int, q, tx, ty, temp;
-			x_int = (long) _p;
-			y_int = (long) w;
+			long x_int, y_int, tx, ty;
+			x_int = (int64_t) _p;
+			y_int = (int64_t) w;
 			tx = 0; ty = 1;
 			while (y_int != 0) {
+				long q,temp;
 				q = x_int / y_int; // integer quotient
 				temp = y_int; y_int = x_int - q * y_int;
 				x_int = temp;
 				temp = ty; ty = tx - q * ty;
 				tx = temp;
 			}
-			if (tx < 0) tx += (long) _p;
+			if (tx < 0) tx += (int64_t) _p;
 			inv_w = tx;
 
 
 			Element _w, _inv_w;
-			_field.init(_w,w);
-			_field.init(_inv_w, inv_w);
+			field().init(_w,w);
+			field().init(_inv_w, inv_w);
 			std::vector<Element> pow_w(pts);
 			std::vector<Element> pow_inv_w(pts);
 
 			// compute power of w and w^(-1)
-			_field.init(pow_w[0],1);
-			_field.init(pow_inv_w[0],1);
+			field().assign(pow_w[0],field().one);
+			field().assign(pow_inv_w[0],field().one);
 			for (size_t i=1;i<pts;++i){
-				_field.mul(pow_w[i], pow_w[i-1], _w);
-				_field.mul(pow_inv_w[i], pow_inv_w[i-1], _inv_w);
+				field().mul(pow_w[(size_t)i], pow_w[(size_t)i-1], _w);
+				field().mul(pow_inv_w[(size_t)i], pow_inv_w[(size_t)i-1], _inv_w);
 			}
 
 			// compute reverse bit ordering
 			// XXX this is C99 extension
 			// size_t revbit[pts];
 			std::vector<size_t> revbit(pts);
-			for (long i = 0, j = 0; i < static_cast<long>(pts); i++, j = RevInc(j, lpts))
+			for (long i = 0, j = 0; i < static_cast<long>(pts); i++, j = RevInc(j, (long)lpts))
 				revbit[(size_t)i]=(size_t)j;
 
 			// set the data
 			std::vector<Coefficient> fft_a(pts, ZeroA), fft_b(pts, ZeroB), fft_c(pts, ZeroC);
 			for (size_t i=0;i<b.size();++i)
-				fft_b[i]=b[b.size()-i-1];// reverse b
+				fft_b[(size_t)i]=b[b.size()-i-1];// reverse b
 			for (size_t i=b.size();i<pts;++i)
-				fft_b[i]=ZeroB;;
+				fft_b[(size_t)i]=ZeroB;;
 			for (size_t i=0;i<c.size();++i)
-				fft_c[i]=c[i];
+				fft_c[(size_t)i]=c[(size_t)i];
 			for (size_t i=c.size();i<pts;++i)
-				fft_c[i]=ZeroC;
+				fft_c[(size_t)i]=ZeroC;
 
 
 			// compute the DFT of b and DFT^-1 of c (parallel if __LINBOX_HAVE_OPENMP)
@@ -1357,7 +1373,7 @@ namespace LinBox
 #pragma omp parallel for shared(fft_a,fft_b,fft_c) schedule(dynamic)
 #endif
 			for (long i=0;i<static_cast<long>(pts);++i)
-				_BMD.mul(fft_a[i], fft_b[i], fft_c[i]);
+				_BMD.mul(fft_a[(size_t)i], fft_b[(size_t)i], fft_c[(size_t)i]);
 
 			Element swapping;
 			// reorder the term in the FFT according to reverse bit ordering
@@ -1365,13 +1381,13 @@ namespace LinBox
 			// #pragma omp parallel for shared(fft_a,revbit,inv_pts) schedule(runtime)
 			// #endif
 			for (size_t i=0; i< pts; ++i){
-				if (revbit[i]>i){
-					typename Coefficient::Iterator it_a1=fft_a[i].Begin();
-					typename Coefficient::Iterator it_a2=fft_a[revbit[i]].Begin();
-					for (; it_a1 != fft_a[i].End(); ++it_a1, ++it_a2){
-						_field.assign(swapping,*it_a1);
-						_field.assign(*it_a1, *it_a2);
-						_field.assign(*it_a2,swapping);
+				if (revbit[(size_t)i]>i){
+					typename Coefficient::Iterator it_a1=fft_a[(size_t)i].Begin();
+					typename Coefficient::Iterator it_a2=fft_a[revbit[(size_t)i]].Begin();
+					for (; it_a1 != fft_a[(size_t)i].End(); ++it_a1, ++it_a2){
+						field().assign(swapping,*it_a1);
+						field().assign(*it_a1, *it_a2);
+						field().assign(*it_a2,swapping);
 					}
 				}
 			}
@@ -1382,14 +1398,14 @@ namespace LinBox
 
 			// set the result according to bitreverse ordering and multiply by 1/pts
 			Element inv_pts;
-			_field.init(inv_pts, pts);
-			_field.invin(inv_pts);
+			field().init(inv_pts, pts);
+			field().invin(inv_pts);
 			// #ifdef __LINBOX_HAVE_OPENMP
 			// #pragma omp parallel for shared(fft_a,revbit,inv_pts) schedule(static)
 			// #endif
 			for (long i=0; i< static_cast<long>(a.size()); ++i){
-				a[i] = fft_a[revbit[i]];
-				_MD.mulin(a[i], inv_pts);
+				a[(size_t)i] = fft_a[revbit[(size_t)i]];
+				_MD.mulin(a[(size_t)i], inv_pts);
 			}
 		}
 
@@ -1405,7 +1421,7 @@ namespace LinBox
 			size_t k = b[0].coldim();
 			size_t n = c[0].coldim();
 			typedef  typename Polynomial1::value_type Coefficient;
-			const Coefficient ZeroA(m,n), ZeroB(m,k), ZeroC(k,n);
+			const Coefficient ZeroA(field(), m,n), ZeroB(field(), m,k), ZeroC(field(), k,n);
 
 			size_t deg  = c.size()+1;
 			size_t lpts = 0;
@@ -1421,7 +1437,7 @@ namespace LinBox
 			for (;;) {
 
 				// compute the nth primitive root
-				w=  (long) Givaro::powmod(_gen, _pl>>lpts, _p);
+				w=  (int64_t) Givaro::powmod(_gen, int64_t(_pl>>lpts), _p);
 				//std::cout<<w<<" : "<<_gen<<"\n"<<(_pl>>lpts)<<"\n";
 
 				if ((w !=1) && (w != _pl-1))
@@ -1456,11 +1472,12 @@ namespace LinBox
 			long inv_w;
 
 			// compute w^(-1) mod p using extended euclidean algorithm
-			long x_int, y_int, q, tx, ty, temp;
+			long x_int, y_int, tx, ty;
 			x_int = (long) _p;
 			y_int = (long) w;
 			tx = 0; ty = 1;
 			while (y_int != 0) {
+				long q,temp;
 				q = x_int / y_int; // integer quotient
 				temp = y_int; y_int = x_int - q * y_int;
 				x_int = temp;
@@ -1472,17 +1489,17 @@ namespace LinBox
 
 
 			Element _w, _inv_w;
-			_field.init(_w,w);
-			_field.init(_inv_w, inv_w);
+			field().init(_w,w);
+			field().init(_inv_w, inv_w);
 			std::vector<Element> pow_w(pts);
 			std::vector<Element> pow_inv_w(pts);
 
 			// compute power of w and w^(-1)
-			_field.init(pow_w[0],1);
-			_field.init(pow_inv_w[0],1);
+			field().assign(pow_w[0],field().one);
+			field().assign(pow_inv_w[0],field().one);
 			for (size_t i=1;i<pts;++i){
-				_field.mul(pow_w[i], pow_w[i-1], _w);
-				_field.mul(pow_inv_w[i], pow_inv_w[i-1], _inv_w);
+				field().mul(pow_w[(size_t)i], pow_w[(size_t)i-1], _w);
+				field().mul(pow_inv_w[(size_t)i], pow_inv_w[(size_t)i-1], _inv_w);
 			}
 
 			// compute reverse bit ordering
@@ -1494,13 +1511,13 @@ namespace LinBox
 			// set the data
 			std::vector<Coefficient> fft_a(pts, ZeroA), fft_b(pts, ZeroB), fft_c(pts, ZeroC);
 			for (size_t i=0;i<b.size();++i)
-				fft_b[i]=b[b.size()-i-1];// reverse b
+				fft_b[(size_t)i]=b[b.size()-i-1];// reverse b
 			for (size_t i=b.size();i<pts;++i)
-				fft_b[i]=ZeroB;;
+				fft_b[(size_t)i]=ZeroB;;
 			for (size_t i=0;i<c.size();++i)
-				fft_c[i]=c[i];
+				fft_c[(size_t)i]=c[(size_t)i];
 			for (size_t i=c.size();i<pts;++i)
-				fft_c[i]=ZeroC;
+				fft_c[(size_t)i]=ZeroC;
 
 
 			// compute the DFT of b and DFT^-1 of c (parallel if __LINBOX_HAVE_OPENMP)
@@ -1515,7 +1532,7 @@ namespace LinBox
 #pragma omp parallel for shared(fft_a,fft_b,fft_c) schedule(dynamic)
 #endif
 			for (long i=0;i<(long)pts;++i)
-				_BMD.mul(fft_a[i], fft_b[i], fft_c[i]);
+				_BMD.mul(fft_a[(size_t)i], fft_b[(size_t)i], fft_c[(size_t)i]);
 
 			Element swapping;
 			// reorder the term in the FFT according to reverse bit ordering
@@ -1523,13 +1540,13 @@ namespace LinBox
 			// #pragma omp parallel for shared(fft_a,revbit,inv_pts) schedule(runtime)
 			// #endif
 			for (size_t i=0; i< pts; ++i){
-				if (revbit[i]>i){
-					typename Coefficient::Iterator it_a1=fft_a[i].Begin();
-					typename Coefficient::Iterator it_a2=fft_a[revbit[i]].Begin();
-					for (; it_a1 != fft_a[i].End(); ++it_a1, ++it_a2){
-						_field.assign(swapping,*it_a1);
-						_field.assign(*it_a1, *it_a2);
-						_field.assign(*it_a2,swapping);
+				if (revbit[(size_t)i]>i){
+					typename Coefficient::Iterator it_a1=fft_a[(size_t)i].Begin();
+					typename Coefficient::Iterator it_a2=fft_a[revbit[(size_t)i]].Begin();
+					for (; it_a1 != fft_a[(size_t)i].End(); ++it_a1, ++it_a2){
+						field().assign(swapping,*it_a1);
+						field().assign(*it_a1, *it_a2);
+						field().assign(*it_a2,swapping);
 					}
 				}
 			}
@@ -1540,14 +1557,14 @@ namespace LinBox
 
 			// set the result according to bitreverse ordering and multiply by 1/pts
 			Element inv_pts;
-			_field.init(inv_pts, pts);
-			_field.invin(inv_pts);
+			field().init(inv_pts, pts);
+			field().invin(inv_pts);
 			// #ifdef __LINBOX_HAVE_OPENMP
 			// #pragma omp parallel for shared(fft_a,revbit,inv_pts) schedule(static)
 			// #endif
 			for (long i=0; i< a.size(); ++i){
-				a[i] = fft_a[revbit[i]];
-				_MD.mulin(a[i], inv_pts);
+				a[(size_t)i] = fft_a[revbit[(size_t)i]];
+				_MD.mulin(a[(size_t)i], inv_pts);
 			}
 		}
 
@@ -1575,10 +1592,10 @@ namespace LinBox
 			typename Coeff::Iterator it_b= B.Begin();
 			Element tmp;
 			for (; it_a != A.End(); ++it_a, ++it_b){
-				_field.assign(tmp,*it_a);
-				_field.addin(*it_a, *it_b);
-				_field.sub(*it_b, tmp, *it_b);
-				_field.mulin(*it_b, alpha);
+				field().assign(tmp,*it_a);
+				field().addin(*it_a, *it_b);
+				field().sub(*it_b, tmp, *it_b);
+				field().mulin(*it_b, alpha);
 			}
 		}
 
@@ -1589,7 +1606,7 @@ namespace LinBox
 			Element       *aptr = A.getPointer();
 			const Element *bptr = B.getPointer();
 			for (size_t i=0;i<n2;++i){
-				aptr[i]+= bptr[i];
+				aptr[(size_t)i]+= bptr[(size_t)i];
 			}
 		}
 
@@ -1600,9 +1617,9 @@ namespace LinBox
 			Element *bptr = B.getPointer();
 			Element tmp;
 			for (size_t i=0;i<n2;++i){
-				tmp = aptr[i];
-				_field.addin(aptr[i],bptr[i]);
-				_field.sub(bptr[i], tmp, bptr[i]);
+				tmp = aptr[(size_t)i];
+				field().addin(aptr[(size_t)i],bptr[(size_t)i]);
+				field().sub(bptr[(size_t)i], tmp, bptr[(size_t)i]);
 			}
 		}
 
@@ -1671,19 +1688,18 @@ namespace LinBox
 				//_MD.addin(fft[shift],fft[shift+n2]);
 				//_MD.sub(fft[shift+n2], tmp, fft[shift+n2]);
 				//myAddSub(fft[shift],fft[shift+n2]);
-				Element one;_field.init(one,integer(1));
-				Butterfly(fft[shift],fft[shift+n2],one);
+				Butterfly(fft[shift],fft[shift+n2],field().one);
 
 				for (size_t i=1; i< n2; ++i){
-					Butterfly(fft[shift+i],fft[shift+i+n2],pow_w[idx_w*i]);
+					Butterfly(fft[shift+i],fft[shift+i+n2],pow_w[(size_t)idx_w*i]);
 
 					//_MD.copy(tmp, fft[shift+i]);
 					//_MD.addin(fft[shift+i],fft[shift+i+n2]);
 					//_MD.sub(fft[shift+i+n2], tmp, fft[shift+i+n2]);
 					//myAddSub(fft[shift+i],fft[shift+i+n2]);
 
-					//_MD.mulin(fft[shift+i+n2],  pow_w[idx_w*i]);
-					//FFLAS::fscal(_field, mn, pow_w[idx_w*i], fft[shift+i+n2].getPointer(), 1);
+					//_MD.mulin(fft[shift+i+n2],  pow_w[(size_t)idx_w*i]);
+					//FFLAS::fscal(field(), mn, pow_w[(size_t)idx_w*i], fft[shift+i+n2].getPointer(), 1);
 				}
 				FFT(fft, n2, pow_w, idx_w<<1, shift);
 				FFT(fft, n2, pow_w, idx_w<<1, shift+n2);
@@ -1695,7 +1711,7 @@ namespace LinBox
 		void iterative_FFT (Polynomial &fft, size_t n, size_t ln, const std::vector<Element> &pow_w){
 
 			typedef  typename Polynomial::value_type Coefficient;
-			Coefficient tmp(fft[0].rowdim(), fft[0].coldim());
+			Coefficient tmp(field(), fft[0].rowdim(), fft[0].coldim());
 
 			if (ln == 0)
 				return;
@@ -1708,9 +1724,9 @@ namespace LinBox
 
 			// bottom level s = 1
 			for (size_t i=0; i< n; i+=2) {
-				_MD.copy(tmp, fft[i]);
-				_MD.addin(fft[i], fft[i+1]);
-				_MD.sub(fft[i+1], tmp, fft[i+1]);
+				_MD.copy(tmp, fft[(size_t)i]);
+				_MD.addin(fft[(size_t)i], fft[(size_t)i+1]);
+				_MD.sub(fft[(size_t)i+1], tmp, fft[(size_t)i+1]);
 			}
 
 			// others levels s = 2..ln-1
@@ -1725,16 +1741,16 @@ namespace LinBox
 
 					Coefficient *t, *t1,  *tt, *tt1, *u, *u1, *uu, *uu1;
 
-					t  = &fft[i+m2];
-					u  = &fft[i];
-					t1 = &fft[i+1+m2]; _MD.mulin(*t1, pow_w[w]);
-					u1 = &fft[i+1];
+					t  = &fft[(size_t)i+m2];
+					u  = &fft[(size_t)i];
+					t1 = &fft[(size_t)i+1+m2]; _MD.mulin(*t1, pow_w[w]);
+					u1 = &fft[(size_t)i+1];
 
 					for (size_t j=0; j<m2-2; j+=2){
-						tt  = &fft[i+j+2+m2];_MD.mulin(*tt, pow_w[(j+2)*w]);
-						uu  = &fft[i+j+2];
-						tt1 = &fft[i+j+3+m2];_MD.mulin(*tt1, pow_w[(j+3)*w]);
-						uu1 = &fft[i+j+3];
+						tt  = &fft[(size_t)i+j+2+m2];_MD.mulin(*tt, pow_w[(j+2)*w]);
+						uu  = &fft[(size_t)i+j+2];
+						tt1 = &fft[(size_t)i+j+3+m2];_MD.mulin(*tt1, pow_w[(j+3)*w]);
+						uu1 = &fft[(size_t)i+j+3];
 
 						_MD.copy(tmp, *u);
 						_MD.addin(*u, *t);
diff --git a/linbox/algorithms/matrix-blas3/Makefile.am b/linbox/algorithms/matrix-blas3/Makefile.am
index 9d9c538..5fb4f86 100644
--- a/linbox/algorithms/matrix-blas3/Makefile.am
+++ b/linbox/algorithms/matrix-blas3/Makefile.am
@@ -1,5 +1,5 @@
 # Copyright (c) 2010 the LinBox group
-# written by bb <bboyer at imag.fr>
+# written by Brice Boyer <boyer.brice at gmail.com>
 # ========LICENCE========
 # This file is part of the library LinBox.
 #
@@ -25,6 +25,8 @@ pkgincludesubdir=$(pkgincludedir)/algorithms/matrix-blas3
 
 pkgincludesub_HEADERS = mul.h \
 	mul-naive.inl \
+	mul-flint.inl \
+	mul-cra.inl \
 	mul-toomcook.inl
 
 EXTRA_DIST =                    \
diff --git a/linbox/algorithms/matrix-blas3/Makefile.in b/linbox/algorithms/matrix-blas3/Makefile.in
deleted file mode 100644
index fd9dadc..0000000
--- a/linbox/algorithms/matrix-blas3/Makefile.in
+++ /dev/null
@@ -1,579 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# written by bb <bboyer at imag.fr>
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/algorithms/matrix-blas3
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/algorithms/matrix-blas3
-pkgincludesub_HEADERS = mul.h \
-	mul-naive.inl \
-	mul-toomcook.inl
-
-EXTRA_DIST = \
-             blas3.doxy
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/algorithms/matrix-blas3/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps linbox/algorithms/matrix-blas3/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
-	done
-
-uninstall-pkgincludesubHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
-	for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool ctags distclean distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-pkgincludesubHEADERS install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/algorithms/matrix-blas3/blas3.doxy b/linbox/algorithms/matrix-blas3/blas3.doxy
index 2a69597..fed10c0 100644
--- a/linbox/algorithms/matrix-blas3/blas3.doxy
+++ b/linbox/algorithms/matrix-blas3/blas3.doxy
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2012 LinBox
- * written by bb <bboyer at imag.fr>
+ * written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  *
  * ========LICENCE========
  * This file is part of the library LinBox.
diff --git a/linbox/algorithms/matrix-blas3/mul-cra.inl b/linbox/algorithms/matrix-blas3/mul-cra.inl
new file mode 100644
index 0000000..0740d28
--- /dev/null
+++ b/linbox/algorithms/matrix-blas3/mul-cra.inl
@@ -0,0 +1,191 @@
+/*  Copyright (C) 2014 the members of the LinBox group
+ *
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * This file is part of the LinBox library.
+ *
+ * ========LICENCE========
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * LinBox 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *
+ */
+
+#ifndef __LINBOX_matrix_blas3_mul_cra_INL
+#define __LINBOX_matrix_blas3_mul_cra_INL
+
+#include "linbox/algorithms/cra-domain.h"
+#include "linbox/algorithms/cra-full-multip-fixed.h"
+
+#include "givaro/random-integer.h"
+#include "linbox/randiter/random-prime.h"
+
+
+namespace LinBox { namespace BLAS3 { namespace Protected {
+
+	struct IntegerCraMatMul {
+
+
+		typedef Givaro::Modular<double>     Field;
+		typedef Field::Element      Element;
+		typedef BlasMatrix<Field>   ModularMatrix ;
+		typedef BlasMatrix<Givaro::ZRing<Integer> > IntegerMatrix ;
+
+#ifdef _LB_MM_TIMING
+#ifdef _OPENMP
+		typedef LinBox::OMPTimer Mytime;
+#else
+		typedef LinBox::Timer    Mytime;
+#endif
+#endif
+
+		const IntegerMatrix &_A_, &_B_;
+
+#ifdef _LB_MM_TIMING
+		mutable Mytime chrono;
+#endif
+
+		IntegerCraMatMul(const IntegerMatrix& A, const IntegerMatrix& B) :
+			_A_(A), _B_(B)
+		{
+#ifdef _LB_MM_TIMING
+			chrono.clear();
+#endif
+			linbox_check(A.getPointer() == _A_.getPointer());
+		}
+
+		IntegerCraMatMul(IntegerMatrix& A, IntegerMatrix& B) :
+			_A_(A), _B_(B)
+		{
+#ifdef _LB_MM_TIMING
+			chrono.clear();
+#endif
+			linbox_check(A.getPointer() == _A_.getPointer());
+		}
+
+		ModularMatrix& operator()(ModularMatrix& Cp, const Field& F) const
+		{
+			BlasMatrixDomain<Field>   BMD(F);
+
+			/*  intialisation */
+			// ModularMatrix Cpp(_A_.rowdim(),_B_.coldim());
+			// Cp = Cpp ;
+			ModularMatrix Ap(_A_, F);
+			ModularMatrix Bp(_B_, F);
+			Cp.resize(Ap.rowdim(),Bp.coldim());
+
+			/*  multiplication mod p */
+
+#ifdef _LB_MM_TIMING
+			Mytime matmul; matmul.clear(); matmul.start();
+#endif
+			BMD.mul(Cp,Ap,Bp);
+			// BMD.axpyin(Cp,Ap,Bp);
+#if 0
+			// BMD.mul( static_cast<BlasMatrix<double>&>(Cp),Ap,Bp);
+			if (FAM_TYPE == _axpy)
+				BMD.axpyin(Cp,Ap,Bp);
+			else if (FAM_TYPE == _axmy)
+				BMD.axmyin(Cp,Ap,Bp);
+			else if (FAM_TYPE == _maxpy)
+				BMD.maxpyin(Cp,Ap,Bp);
+#endif
+#ifdef _LB_MM_TIMING
+			matmul.stop();
+			this->chrono+=matmul;
+#endif
+#if 0
+			if (Ap.rowdim() <= 20 && Ap.coldim() <= 20) {
+				Integer chara;
+				F.characteristic(chara);
+				F.write(cout) << endl;
+				cout << "p:=" << chara << ';' << std::endl;
+				A.write(cout<< "A:=",true) << ';' << std::endl;
+				Ap.write(cout << "Ap:=", F, true) << ';' << endl;
+				Bp.write(cout << "Bp:=", F, true) << ';' << endl;
+				Cp.write(cout<< "Cp:=", F, true) << ';' << endl;
+			}
+#endif
+			return Cp;
+		}
+
+
+
+	};
+
+} // Protected
+} // BLAS3
+} // LinBox
+
+namespace LinBox {
+	template<class Field>
+	struct CRATemporaryVectorTrait<BLAS3::Protected::IntegerCraMatMul, Field> {
+		// typedef typename std::vector<double>::iterator Type_t ;
+		typedef typename LinBox::BlasMatrix<Field > Type_t;
+	};
+} // LinBox
+
+
+namespace LinBox { namespace BLAS3 {
+	template<class _anyMatrix>
+	_anyMatrix & mul (_anyMatrix& C,
+			  const _anyMatrix& A,
+			  const _anyMatrix& B,
+			  const mulMethod::CRA &)
+	{
+
+		size_t PrimeSize = 22; //! @todo pourqoi ?
+
+		integer mA, mB ;
+		BlasMatrixDomain<typename _anyMatrix::Field> BMD(A.field());
+		BMD.Magnitude(mA,A);
+		BMD.Magnitude(mB,B);
+		double logC = Givaro::naturallog(mA*mB*A.coldim());
+
+		typedef Givaro::Modular<double> ModularField ;
+
+		{
+
+			RandomPrimeIterator genprime( (unsigned int)PrimeSize );
+			ChineseRemainder< FullMultipBlasMatCRA< ModularField > > cra( std::pair<size_t,double>(C.rowdim()*C.coldim(), logC) );
+			Protected::IntegerCraMatMul iteration(A,B);
+
+			cra(C, iteration, genprime);
+
+#ifdef _LB_DEBUG
+#ifdef _LB_MM_TIMING
+			std::cout << "Sole modular matrix multiplications: " << iteration.chrono << std::endl;
+#endif
+
+			Integer mC; BMD.Magnitude(mC, C);
+			std::cout << "C max: " << logtwo(mC) <<  " (" << LinBox::naturallog(mC) << ')' << std::endl;
+#endif
+
+		}
+
+		return C;
+
+	}
+} // BLAS3
+} // LinBox
+
+#endif // __LINBOX_matrix_blas3_mul_cra_INL
+
+//Local Variables:
+//mode: C++
+//tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/matrix-blas3/mul-flint.inl b/linbox/algorithms/matrix-blas3/mul-flint.inl
new file mode 100644
index 0000000..bd4e705
--- /dev/null
+++ b/linbox/algorithms/matrix-blas3/mul-flint.inl
@@ -0,0 +1,116 @@
+/*  Copyright (C) 2012 the members of the LinBox group
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * This file is part of the LinBox library.
+ *
+ * ========LICENCE========
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * LinBox 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *
+ */
+
+#ifndef __LINBOX_matrix_blas3_mul_flint_INL
+#define __LINBOX_matrix_blas3_mul_flint_INL
+
+
+namespace LinBox {
+	namespace BLAS3 {
+		namespace Protected {
+			template<class _ZZ>
+			void getFlintMatrix(BlasMatrix<_ZZ> &C , const FLINT::fmpz_mat_t Cf)
+			{
+				Integer toto(0) ;
+				for (size_t i = 0 ; i< C.rowdim() ; ++i)
+					for (size_t j = 0 ; j< C.coldim() ; ++j) {
+						FLINT::fmpz_get_mpz(toto.get_mpz(), fmpz_mat_entry(Cf,i,j));
+						C.setEntry(i,j, toto );
+					}
+			}
+
+			template<class _ZZ>
+			void setFlintMatrix(FLINT::fmpz_mat_t Cf, const BlasMatrix<_ZZ> &C )
+			{
+				Integer toto(0) ;
+				for (size_t i = 0 ; i< C.rowdim() ; ++i)
+					for (size_t j = 0 ; j< C.coldim() ; ++j) {
+						FLINT::fmpz_set_mpz(fmpz_mat_entry(Cf,i,j), C.getEntry(i,j).get_mpz_const());
+					}
+			}
+
+#if 0
+			template<class _Mat>
+			void getFlintMatrix(BlasSubmatrix<_Mat> &C , const FLINT::fmpz_mat_t Cf)
+			{
+				Integer toto(0) ;
+				for (size_t i = 0 ; i< C.rowdim() ; ++i)
+					for (size_t j = 0 ; j< C.coldim() ; ++j) {
+						FLINT::fmpz_get_mpz(toto.get_mpz(), fmpz_mat_entry(Cf,i,j));
+						C.setEntry(i,j, toto );
+					}
+			}
+
+
+			template<class _ZZ>
+			void setFlintMatrix(FLINT::fmpz_mat_t Cf, const BlasSubmatrix<_ZZ> &C )
+			{
+				Integer toto(0) ;
+				for (size_t i = 0 ; i< C.rowdim() ; ++i)
+					for (size_t j = 0 ; j< C.coldim() ; ++j) {
+						FLINT::fmpz_set_mpz(fmpz_mat_entry(Cf,i,j), C.getEntry(i,j).get_mpz_const());
+					}
+			}
+#endif
+
+		}
+
+		template<class DenseIntMat>
+		DenseIntMat &
+		mul (DenseIntMat& C,
+		     const DenseIntMat& A,
+		     const DenseIntMat& B,
+		     const mulMethod::FLINT & )
+		{
+			FLINT::fmpz_mat_t Af ;
+			FLINT::fmpz_mat_t Bf ;
+			FLINT::fmpz_mat_t Cf ;
+			FLINT::fmpz_mat_init(Af, A.rowdim(), A.coldim());
+			FLINT::fmpz_mat_init(Bf, B.rowdim(), B.coldim());
+			FLINT::fmpz_mat_init(Cf, C.rowdim(), C.coldim());
+			Protected::setFlintMatrix<typename DenseIntMat::Field>(Af,A);
+			Protected::setFlintMatrix<typename DenseIntMat::Field>(Bf,B);
+			// Timer Tim ;Tim.clear(); Tim.start();
+			FLINT::fmpz_mat_mul(Cf,Af,Bf);
+			// Tim.stop() ; std::cout << "inside : " << Tim << std::endl;
+			Protected::getFlintMatrix<typename DenseIntMat::Field>(C,Cf);
+			FLINT::fmpz_mat_clear(Af);
+			FLINT::fmpz_mat_clear(Bf);
+			FLINT::fmpz_mat_clear(Cf);
+
+			return C;
+		}
+	} // BLAS3
+}
+
+
+#endif //  __LINBOX_matrix_blas3_mul_flint_INL
+
+//Local Variables:
+//mode: C++
+//tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+
diff --git a/linbox/algorithms/matrix-blas3/mul-naive.inl b/linbox/algorithms/matrix-blas3/mul-naive.inl
index 49ab820..08e56a6 100644
--- a/linbox/algorithms/matrix-blas3/mul-naive.inl
+++ b/linbox/algorithms/matrix-blas3/mul-naive.inl
@@ -1,5 +1,5 @@
 /*  Copyright (C) 2012 the members of the LinBox group
- * Written by B. Boyer < bboyer at imag.fr >
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  *
  * This file is part of the LinBox library.
  *
@@ -25,31 +25,30 @@
 #define __LINBOX_matrix_blas3_mul_naive_INL
 
 
-namespace LinBox {
-	namespace BLAS3 {
-		template<class _anyMatrix, class _otherMatrix1, class _otherMatrix2>
-		_anyMatrix & mul (_anyMatrix& C,
-				  const _otherMatrix1& A,
-				  const _otherMatrix2& B,
-				  const mulMethod::naive &)
-		{
-			// TODO check sizes
-			// TODO check fields
-			// TODO check get/set Entry
-			typedef typename _anyMatrix::Field Field;
-			const Field &F = B.field();
-			for (size_t i = 0 ; i <C.rowdim(); ++i)
-				for (size_t j = 0 ; j <C.coldim(); ++j) {
-					C.setEntry(i,j,F.zero);
-					for (size_t k = 0 ; k <B.rowdim(); ++k)
-						F.axpyin(C.refEntry(i,j),
-							 A.getEntry(i, k),
-							 B.getEntry(k, j));
-				}
-			return C;
-		}
+namespace LinBox { namespace BLAS3 {
+	template<class _anyMatrix, class _otherMatrix1, class _otherMatrix2>
+	_anyMatrix & mul (_anyMatrix& C,
+			  const _otherMatrix1& A,
+			  const _otherMatrix2& B,
+			  const mulMethod::naive &)
+	{
+		// TODO check sizes
+		// TODO check fields
+		// TODO check get/set Entry
+		typedef typename _anyMatrix::Field Field;
+		const Field &F = B.field();
+		for (size_t i = 0 ; i <C.rowdim(); ++i)
+			for (size_t j = 0 ; j <C.coldim(); ++j) {
+				C.setEntry(i,j,F.zero);
+				for (size_t k = 0 ; k <B.rowdim(); ++k)
+					F.axpyin(C.refEntry(i,j),
+						 A.getEntry(i, k),
+						 B.getEntry(k, j));
+			}
+		return C;
 	}
-}
+} // BLAS3
+} // LinBox
 
 
 #endif //  __LINBOX_matrix_blas3_mul_naive_INL
diff --git a/linbox/algorithms/matrix-blas3/mul-toomcook.inl b/linbox/algorithms/matrix-blas3/mul-toomcook.inl
index ca72c9b..baaf37d 100644
--- a/linbox/algorithms/matrix-blas3/mul-toomcook.inl
+++ b/linbox/algorithms/matrix-blas3/mul-toomcook.inl
@@ -1,5 +1,5 @@
 /*  Copyright (C) 2012 the members of the LinBox group
- * Written by B. Boyer < bboyer at imag.fr >
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  *
  * This file is part of the LinBox library.
  *
@@ -35,303 +35,328 @@
 
 #include <fflas-ffpack/fflas/fflas.h>
 #include <fflas-ffpack/ffpack/ffpack.h>
+#include "linbox/algorithms/matrix-hom.h"
 
-namespace LinBox {
-	namespace BLAS3 {
+namespace LinBox { namespace BLAS3 {
 
-		template<class Zpz>
-		BlasMatrix<Zpz>& ToomCook(BlasMatrix<Zpz>& TC, BlasMatrix<Zpz>& iTC)
-		{
-			linbox_check(TC.rowdim() == TC.coldim());
-			size_t l = TC.rowdim();
+	template<class Zpz>
+	BlasMatrix<Zpz>& ToomCook(BlasMatrix<Zpz>& TC, BlasMatrix<Zpz>& iTC)
+	{
+		linbox_check(TC.rowdim() == TC.coldim());
+		size_t l = TC.rowdim();
 
-			for (size_t i = 0 ; i < l ; ++i)
-				for (size_t j = 0 ; j < l ; ++j) {
-					TC.field().init(TC.refEntry(i,j), pow((Integer)i,j));
-				}
-			BlasMatrixDomain<Zpz> BMD(TC.field()) ;
-			// TC.write(std::cout << "TC ") << std::endl;
-			// BMD.invert(iTC, TC);
-			int null;
-			FFPACK::Invert((typename Field::Father_t)TC.field(),l,TC.getPointer(),l,iTC.getWritePointer(),l,null);
-			// iTC.write(std::cout << "TC^(-1) ") << std::endl;
-			// TC.write(std::cout << "TC ") << std::endl;
-			return TC;
-		}
+		for (size_t i = 0 ; i < l ; ++i)
+			for (size_t j = 0 ; j < l ; ++j) {
+				TC.field().init(TC.refEntry(i,j), pow((Integer)i,j));
+			}
+		BlasMatrixDomain<Zpz> BMD(TC.field()) ;
+		// TC.write(std::cout << "TC ") << std::endl;
+		// BMD.invert(iTC, TC);
+		int null;
+		FFPACK::Invert(TC.field(),l,TC.getPointer(),l,iTC.getWritePointer(),l,null);
+		// iTC.write(std::cout << "TC^(-1) ") << std::endl;
+		// TC.write(std::cout << "TC ") << std::endl;
+		return TC;
+	}
 
-		namespace Protected {
+	namespace Protected {
 
 
-			template<class Zpz, class GFpe>
-			BlasMatrix<Zpz >& mul (BlasMatrix<Zpz>      & CMatBloc,
-								   const BlasMatrix<Zpz>& AMatBloc,
-								   const BlasMatrix<Zpz>& BMatBloc,
-								   const size_t m,
-								   const size_t k,
-								   const size_t n,
-								   const mulMethod::ToomCook<GFpe> & T)
-			{
+		template<class Zpz, class GFpe>
+		BlasMatrix<Zpz >& mul (BlasMatrix<Zpz>      & CMatBloc,
+							   const BlasMatrix<Zpz>& AMatBloc,
+							   const BlasMatrix<Zpz>& BMatBloc,
+							   const size_t m,
+							   const size_t k,
+							   const size_t n,
+							   const mulMethod::ToomCook<GFpe> & T)
+		{
 #if (__LINBOX_FFLAS_FFPACK_VERSION < 10501)
 #warning "Invert is buggy in your fflas-ffpack version. please consider upgrading to >=1.5.1."
 #endif
-				const Zpz & F  = CMatBloc.field();
-				const GFpe& GF = T._myF ;
-				// linbox_check(T._myF.characacteristic() == F.characteristic());
-				// TODO si e = 1 on matmul !
-				size_t e = (size_t) GF.exponent() ; // extension degree
-				size_t l = 2*e - 1 ; // sure ?
-
-				BlasMatrix<Zpz> TC    (F,l,l);
-				BlasMatrix<Zpz> iTC   (F,l,l);
-				BlasMatrix<Zpz> iEval (F,l,l);
-				// FWD = Matrix(K, l, l, [K(i**j) for i in range(l) for j in range(l)])
-				ToomCook(TC,iTC);
-				// each row is a result matrix
-				BlasMatrix<Zpz> TMatBloc( F, l, m*n);
-
-
-				// AY = [sum(FWD[i,j]*A[j] for j in range(len(A))) for i in range(l)]
-				// BY = [sum(FWD[i,j]*B[j] for j in range(len(B))) for i in range(l)]
-				if (!T.memory_unlimited)	{			/* space efficient */
-					BlasMatrix<Zpz> AEval( F , m, k);
-					BlasMatrix<Zpz> BEval( F , k, n);
-
-
-					for (size_t i = 0 ; i < l ; ++i) {
-						FFLAS::fgemv((typename Field::Father_t)F, FFLAS::FflasTrans,
-									 e, m*k,
-									 F.one,
-									 AMatBloc.getPointer(), m*k,
-									 TC.getPointer()+ i*l, 1,
-									 F.zero,
-									 AEval.getWritePointer(), 1);
-
-						FFLAS::fgemv((typename Field::Father_t)F, FFLAS::FflasTrans,
-									 e, k*n,
-									 F.one,
-									 BMatBloc.getPointer(), k*n,
-									 TC.getPointer()+ i*l, 1,
-									 F.zero,
-									 BEval.getWritePointer(), 1);
-
-						FFLAS::fgemm((typename Field::Father_t)F,
-									 FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
-									 // m, k , n,
-									 m,n,k,
-									 F.one,
-									 AEval.getPointer(), AEval.coldim(), //lda
-									 BEval.getPointer(), BEval.coldim(), //ldb
-									 F.zero,
-									 TMatBloc.getWritePointer()+i*m*n, n);
-					}
-				}
-				else { /* time efficient (matmul) */
-					BlasMatrix<Zpz> AEval( F , l, m*k);
-					BlasMatrix<Zpz> BEval( F , l, k*n);
-
-
-					FFLAS::fgemm((typename Field::Father_t)F,
-								 FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
-								 // m, k , n,
-								 l,m*k,e,
+			const Zpz & F  = CMatBloc.field();
+			const GFpe& GF = T._myF ;
+			// linbox_check(T._myF.characacteristic() == F.characteristic());
+			// TODO si e = 1 on matmul !
+			size_t e = (size_t) GF.exponent() ; // extension degree
+			size_t l = 2*e - 1 ; // sure ?
+
+			BlasMatrix<Zpz> TC    (F,l,l);
+			BlasMatrix<Zpz> iTC   (F,l,l);
+			BlasMatrix<Zpz> iEval (F,l,l);
+			// FWD = Matrix(K, l, l, [K(i**j) for i in range(l) for j in range(l)])
+			ToomCook(TC,iTC);
+			// each row is a result matrix
+			BlasMatrix<Zpz> TMatBloc( F, l, m*n);
+
+
+			// AY = [sum(FWD[i,j]*A[j] for j in range(len(A))) for i in range(l)]
+			// BY = [sum(FWD[i,j]*B[j] for j in range(len(B))) for i in range(l)]
+			if (!T.memory_unlimited)	{			/* space efficient */
+				BlasMatrix<Zpz> AEval( F , m, k);
+				BlasMatrix<Zpz> BEval( F , k, n);
+
+
+				for (size_t i = 0 ; i < l ; ++i) {
+					FFLAS::fgemv(F, FFLAS::FflasTrans,
+								 e, m*k,
 								 F.one,
-								 // AEval.getPointer(), AEval.coldim(), //lda
-								 TC.getPointer(),l,
 								 AMatBloc.getPointer(), m*k,
+								 TC.getPointer()+ i*l, 1,
+								 F.zero,
+								 AEval.getWritePointer(), 1);
+
+					FFLAS::fgemv(F, FFLAS::FflasTrans,
+								 e, k*n,
+								 F.one,
+								 BMatBloc.getPointer(), k*n,
+								 TC.getPointer()+ i*l, 1,
 								 F.zero,
-								 AEval.getWritePointer(), m*k);
-					// TMatBloc.getWritePointer()+i*m*n, n);
+								 BEval.getWritePointer(), 1);
 
-					FFLAS::fgemm((typename Field::Father_t)F,
+					FFLAS::fgemm(F,
 								 FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
 								 // m, k , n,
-								 l,n*k,e,
+								 m,n,k,
 								 F.one,
-								 // AEval.getPointer(), AEval.coldim(), //lda
-								 TC.getPointer(),l,
-								 BMatBloc.getPointer(), n*k,
+								 AEval.getPointer(), AEval.coldim(), //lda
+								 BEval.getPointer(), BEval.coldim(), //ldb
 								 F.zero,
-								 BEval.getWritePointer(), n*k);
-
-					for (size_t i = 0 ; i < l ; ++i) {
-
-						FFLAS::fgemm((typename Field::Father_t)F,
-									 FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
-									 // m, k , n,
-									 m,n,k,
-									 F.one,
-									 AEval.getPointer()+i*m*k, k, //lda
-									 BEval.getPointer()+i*n*k, n, //ldb
-									 F.zero,
-									 TMatBloc.getWritePointer()+i*m*n, n);
-					}
+								 TMatBloc.getWritePointer()+i*m*n, n);
 				}
+			}
+			else { /* time efficient (matmul) */
+				BlasMatrix<Zpz> AEval( F , l, m*k);
+				BlasMatrix<Zpz> BEval( F , l, k*n);
 
-				std::vector<double>  minpoly_vector  =  GF.irreducible() ;
-				for (size_t i = 0 ; i < minpoly_vector.size(); ++i)
-					F.negin(minpoly_vector[i]);
-
-				// BlasSubmatrix<Zpz> CompMat(CMatBloc,0,0,l,l);
-				BlasMatrix<Zpz> CompMat(F,l,l);
-				for (size_t i = 0 ; i < e ; ++i) { // degree == l ?
-					CompMat.setEntry(i,i,F.one);
-				}
-				for (size_t j = 0 ; j < e-1 ; ++j) {
-					CompMat.setEntry(j,e,minpoly_vector[j]);
-				}
-				typename Zpz::Element coeff ;
-				typename Zpz::Element tmp_coeff, tmp_coeff2 ;
-				F.init(tmp_coeff);
-				for (size_t i = 1 ; i < e-1 ; ++i){
-					for (size_t j = 1 ; j < e+1 ; ++j) {
-						CompMat.setEntry(j, i + e, CompMat.getEntry((j-1),i - 1 + e) ) ;
-					}
-					if (!F.isZero(CompMat.getEntry(e,i+e))){
-						F.init(coeff, CompMat.getEntry( e, i + e) );
-						for(size_t j = 0 ; j < e-1 ; ++j){
-							F.mul(tmp_coeff, coeff,minpoly_vector[j]);
-							F.init(tmp_coeff2,CompMat.getEntry(j,i+e));
-							F.addin(tmp_coeff2, tmp_coeff);
-							CompMat.setEntry(j,i+e, tmp_coeff2 );
-						}
-					}
-				}
 
-				// BCK = ~FWD
-				// XXX some stuff here
-				FFLAS::fgemm((typename Field::Father_t)F,
+				FFLAS::fgemm(F,
 							 FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
-							 l, l, l, F.one,
-							 CompMat.getPointer(), l,
-							 iTC.getPointer(), l,
+							 // m, k , n,
+							 l,m*k,e,
+							 F.one,
+							 // AEval.getPointer(), AEval.coldim(), //lda
+							 TC.getPointer(),l,
+							 AMatBloc.getPointer(), m*k,
 							 F.zero,
-							 iEval.getWritePointer(), l);
-
+							 AEval.getWritePointer(), m*k);
+				// TMatBloc.getWritePointer()+i*m*n, n);
 
-				// Y = [sum(BCK[i,j]*Y[j] for j in range(l)) for i in range(l)]
-				FFLAS::fgemm((typename Field::Father_t)F,
+				FFLAS::fgemm(F,
 							 FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
-							 e,m*n,l,
+							 // m, k , n,
+							 l,n*k,e,
 							 F.one,
-							 iEval.getPointer(), l,
-							 TMatBloc.getPointer(), m*n,
+							 // AEval.getPointer(), AEval.coldim(), //lda
+							 TC.getPointer(),l,
+							 BMatBloc.getPointer(), n*k,
 							 F.zero,
-							 CMatBloc.getWritePointer(), m*n);
-				return CMatBloc;
+							 BEval.getWritePointer(), n*k);
 
-			}
-		}
+				for (size_t i = 0 ; i < l ; ++i) {
 
-		template<class Zpz, class GF>
-		std::vector<BlasMatrix<Zpz> >& mul (std::vector<BlasMatrix<Zpz> >& C,
-											const std::vector<BlasMatrix<Zpz> >& A,
-											const std::vector<BlasMatrix<Zpz> >& B,
-											const mulMethod::ToomCook<GF> & T)
-		{
-			size_t m = C[0].rowdim();
-			size_t k = B[0].rowdim();
-			size_t n = C[0].coldim();
-			const Zpz & F = C[0].field();
-			BlasMatrix<Zpz> Cbloc(F,C.size(),m*n);
-			BlasMatrix<Zpz> Abloc(F,C.size(),m*k);
-			BlasMatrix<Zpz> Bbloc(F,C.size(),k*n);
-			// convert
-			for (size_t l = 0 ; l < C.size() ; ++l){
-				for (size_t i = 0 ; i < m ; ++i) {
-					for (size_t j = 0 ; j < k ; ++j) {
-						Abloc.setEntry(l,i*k+j,A[l].getEntry(i,j));
-					}
+					FFLAS::fgemm(F,
+								 FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+								 // m, k , n,
+								 m,n,k,
+								 F.one,
+								 AEval.getPointer()+i*m*k, k, //lda
+								 BEval.getPointer()+i*n*k, n, //ldb
+								 F.zero,
+								 TMatBloc.getWritePointer()+i*m*n, n);
 				}
 			}
 
-			for (size_t l = 0 ; l < C.size() ; ++l){
-				for (size_t i = 0 ; i < k ; ++i) {
-					for (size_t j = 0 ; j < n ; ++j) {
-						Bbloc.setEntry(l,i*n+j,B[l].getEntry(i,j));
+			typedef typename Zpz::Element Element;
+			std::vector<Element>  minpoly_vector  =  GF.irreducible() ;
+			for (size_t i = 0 ; i < minpoly_vector.size(); ++i)
+				F.negin(minpoly_vector[i]);
+
+			// BlasSubmatrix<Zpz> CompMat(CMatBloc,0,0,l,l);
+			BlasMatrix<Zpz> CompMat(F,l,l);
+			for (size_t i = 0 ; i < e ; ++i) { // degree == l ?
+				CompMat.setEntry(i,i,F.one);
+			}
+			for (size_t j = 0 ; j < e-1 ; ++j) {
+				CompMat.setEntry(j,e,minpoly_vector[j]);
+			}
+			typename Zpz::Element coeff ;
+			typename Zpz::Element tmp_coeff, tmp_coeff2 ;
+			F.init(tmp_coeff);
+			for (size_t i = 1 ; i < e-1 ; ++i){
+				for (size_t j = 1 ; j < e+1 ; ++j) {
+					CompMat.setEntry(j, i + e, CompMat.getEntry((j-1),i - 1 + e) ) ;
+				}
+				if (!F.isZero(CompMat.getEntry(e,i+e))){
+					F.init(coeff, CompMat.getEntry( e, i + e) );
+					for(size_t j = 0 ; j < e-1 ; ++j){
+						F.mul(tmp_coeff, coeff,minpoly_vector[j]);
+						F.init(tmp_coeff2,CompMat.getEntry(j,i+e));
+						F.addin(tmp_coeff2, tmp_coeff);
+						CompMat.setEntry(j,i+e, tmp_coeff2 );
 					}
 				}
 			}
 
+			// BCK = ~FWD
+			// XXX some stuff here
+			FFLAS::fgemm(F,
+						 FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+						 l, l, l, F.one,
+						 CompMat.getPointer(), l,
+						 iTC.getPointer(), l,
+						 F.zero,
+						 iEval.getWritePointer(), l);
+
+
+			// Y = [sum(BCK[i,j]*Y[j] for j in range(l)) for i in range(l)]
+			FFLAS::fgemm(F,
+						 FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+						 e,m*n,l,
+						 F.one,
+						 iEval.getPointer(), l,
+						 TMatBloc.getPointer(), m*n,
+						 F.zero,
+						 CMatBloc.getWritePointer(), m*n);
+			return CMatBloc;
 
-			Protected::mul(Cbloc,Abloc,Bbloc,m,k,n,T);
+		}
+	}
 
-			for (size_t l = 0 ; l < C.size() ; ++l){
-				for (size_t i = 0 ; i < m ; ++i) {
-					for (size_t j = 0 ; j < n ; ++j) {
-						C[l].setEntry(i,j,Cbloc.getEntry(l,i*n+j));
-					}
+	template<class Zpz, class GF>
+	std::vector<BlasMatrix<Zpz> >& mul (std::vector<BlasMatrix<Zpz> >& C,
+										const std::vector<BlasMatrix<Zpz> >& A,
+										const std::vector<BlasMatrix<Zpz> >& B,
+										const mulMethod::ToomCook<GF> & T)
+	{
+		size_t m = C[0].rowdim();
+		size_t k = B[0].rowdim();
+		size_t n = C[0].coldim();
+		const Zpz & F = C[0].field();
+		BlasMatrix<Zpz> Cbloc(F,C.size(),m*n);
+		BlasMatrix<Zpz> Abloc(F,C.size(),m*k);
+		BlasMatrix<Zpz> Bbloc(F,C.size(),k*n);
+		// convert
+		for (size_t l = 0 ; l < C.size() ; ++l){
+			for (size_t i = 0 ; i < m ; ++i) {
+				for (size_t j = 0 ; j < k ; ++j) {
+					Abloc.setEntry(l,i*k+j,A[l].getEntry(i,j));
 				}
 			}
-			// convert back
 		}
 
-		template<class Zpz>
-		BlasMatrix<GivaroExtension<Zpz> >&
-		mul (BlasMatrix<GivaroExtension<Zpz> >& C,
-			 const BlasMatrix<GivaroExtension<Zpz> >& A,
-			 const BlasMatrix<GivaroExtension<Zpz> >& B,
-			 const mulMethod::ToomCook<GivaroExtension<Zpz> > & T)
-		{
-			size_t m = C.rowdim();
-			size_t k = B.rowdim();
-			size_t n = C.coldim();
-			Zpz F ( A.field().characteristic() ); // BaseField ?
-			size_t e = (size_t) A.field().exponent();
-			BlasMatrix<Zpz> Cbloc(F,e,m*n);
-			BlasMatrix<Zpz> Abloc(F,e,m*k);
-			BlasMatrix<Zpz> Bbloc(F,e,k*n);
-
-
-			for (size_t l = 0 ; l < e ; ++l){
-				for (size_t i = 0 ; i < m ; ++i) {
-					for (size_t j = 0 ; j < k ; ++j) {
-						if (l< A.getEntry(i,j).size())
-							Abloc.setEntry(l,i*k+j,
-										   A.getEntry(i,j)[l]);
-					}
+		for (size_t l = 0 ; l < C.size() ; ++l){
+			for (size_t i = 0 ; i < k ; ++i) {
+				for (size_t j = 0 ; j < n ; ++j) {
+					Bbloc.setEntry(l,i*n+j,B[l].getEntry(i,j));
 				}
 			}
-			// for (size_t l = 0 ; l < e ; ++l){
-				// std::cout << Abloc.getEntry(l,0) << ';';
-			// }
-			// std::cout << std::endl;
-
-			for (size_t l = 0 ; l < e ; ++l){
-				for (size_t i = 0 ; i < k ; ++i) {
-					for (size_t j = 0 ; j < n ; ++j) {
-						if (l< B.getEntry(i,j).size())
-							Bbloc.setEntry(l,i*n+j,B.getEntry(i,j)[l]);
-					}
+		}
+
+
+		Protected::mul(Cbloc,Abloc,Bbloc,m,k,n,T);
+
+		for (size_t l = 0 ; l < C.size() ; ++l){
+			for (size_t i = 0 ; i < m ; ++i) {
+				for (size_t j = 0 ; j < n ; ++j) {
+					C[l].setEntry(i,j,Cbloc.getEntry(l,i*n+j));
 				}
 			}
+		}
+		// convert back
+	}
+
+	template<class Zpz>
+	BlasMatrix<Givaro::Extension<Zpz> >&
+	mul (BlasMatrix<Givaro::Extension<Zpz> >& C,
+		 const BlasMatrix<Givaro::Extension<Zpz> >& A,
+		 const BlasMatrix<Givaro::Extension<Zpz> >& B,
+		 const mulMethod::ToomCook<Givaro::Extension<Zpz> > & T)
+	{
+
+		size_t e = (size_t) A.field().exponent() ; // extension degree
+
+		size_t m = C.rowdim();
+		size_t k = B.rowdim();
+		size_t n = C.coldim();
+
+		Zpz F ( (Integer) A.field().characteristic() ); // BaseField ?
+
+
+		if (e == 1) {
+			BlasMatrix<Zpz> Af(A,F);
+			BlasMatrix<Zpz> Bf(B,F);
+			BlasMatrix<Zpz> Cf(C,F);
+			FFLAS::fgemm(F,
+						 FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+						 // m, k , n,
+						 m,n,k,
+						 F.one,
+						 Af.getPointer(), A.getStride(), //lda
+						 Bf.getPointer(), B.getStride(), //ldb
+						 F.zero,
+						 Cf.getWritePointer(), C.getStride());
+			MatrixHom::map(C,Cf);
+			return C;
+		}
 
-			// C.field().init(C.refEntry(0,0));
+		BlasMatrix<Zpz> Cbloc(F,e,m*n);
+		BlasMatrix<Zpz> Abloc(F,e,m*k);
+		BlasMatrix<Zpz> Bbloc(F,e,k*n);
 
-			Protected::mul(Cbloc,Abloc,Bbloc,m,k,n,T);
-			// convert back
 
-			typedef typename GivaroExtension<Zpz>::Element Element ;
+		for (size_t l = 0 ; l < e ; ++l){
 			for (size_t i = 0 ; i < m ; ++i) {
+				for (size_t j = 0 ; j < k ; ++j) {
+					if (l< A.getEntry(i,j).size())
+						Abloc.setEntry(l,i*k+j,
+									   A.getEntry(i,j)[l]);
+				}
+			}
+		}
+		// for (size_t l = 0 ; l < e ; ++l){
+		// std::cout << Abloc.getEntry(l,0) << ';';
+		// }
+		// std::cout << std::endl;
+
+		for (size_t l = 0 ; l < e ; ++l){
+			for (size_t i = 0 ; i < k ; ++i) {
 				for (size_t j = 0 ; j < n ; ++j) {
-					Element x(e) ;
-					for (size_t l = 0 ; l < e ; ++l){
-						x[l] = Cbloc.getEntry(l,i*n+j);
-					}
-					C.field().polynomial_domain().modin(x,C.field().irreducible());
-					// A.field().convert((Element&)C.refEntry(i,j),x);
-					// A.field().init(x);
-					C.setEntry(i,j,x);
+					if (l< B.getEntry(i,j).size())
+						Bbloc.setEntry(l,i*n+j,B.getEntry(i,j)[l]);
 				}
 			}
-			// for (size_t l = 0 ; l < e ; ++l){
-				// std::cout << Cbloc.getEntry(l,0) << ';';
-			// }
-			// std::cout << std::endl;
+		}
+
+		// C.field().init(C.refEntry(0,0));
 
+		Protected::mul(Cbloc,Abloc,Bbloc,m,k,n,T);
+		// convert back
+
+		typedef typename Givaro::Extension<Zpz>::Element Element ;
+		for (size_t i = 0 ; i < m ; ++i) {
+			for (size_t j = 0 ; j < n ; ++j) {
+				Element x(e) ;
+				for (size_t l = 0 ; l < e ; ++l){
+					x[l] = Cbloc.getEntry(l,i*n+j);
+				}
+				C.field().polynomial_domain().modin(x,C.field().irreducible());
+				// A.field().convert((Element&)C.refEntry(i,j),x);
+				// A.field().init(x);
+				C.setEntry(i,j,x);
+			}
 		}
+		// for (size_t l = 0 ; l < e ; ++l){
+		// std::cout << Cbloc.getEntry(l,0) << ';';
+		// }
+		// std::cout << std::endl;
+		//
+		return C ;
 
 	}
-}
+
+} // BLAS3
+} // LinBox
 
 #endif // __LINBOX_matrix_blas3_mul_toomcook_INL
 
diff --git a/linbox/algorithms/matrix-blas3/mul.h b/linbox/algorithms/matrix-blas3/mul.h
index a65914d..1ebbf2a 100644
--- a/linbox/algorithms/matrix-blas3/mul.h
+++ b/linbox/algorithms/matrix-blas3/mul.h
@@ -1,5 +1,5 @@
 /*  Copyright (C) 2012 the members of the LinBox group
- * Written by B. Boyer < bboyer at imag.fr >
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  *
  * This file is part of the LinBox library.
  *
@@ -32,8 +32,9 @@
 
 #include <vector>
 #include "linbox/integer.h"
-#include <linbox/field/givaro.h>
-#include <linbox/matrix/blas-matrix.h>
+#include <givaro/extension.h>
+#include <linbox/matrix/dense-matrix.h>
+
 
 
 // Methods
@@ -54,6 +55,10 @@ namespace LinBox {
 			} ; //! Toom-Cook method.
 
 			struct naive {};
+
+			struct FLINT {};
+
+			struct CRA {} ;
 		}
 	}
 }
@@ -74,7 +79,7 @@ namespace LinBox {
 
 		/** @brief Toom-Cook multiplication for GF(p^e)
 		 * A matrix over GF(p^e) is represented by a polynomial of Z/pZ matrices.
-		 * @tparam Zpz is some modular field, GFq is GivaroExtension (or the like)
+		 * @tparam Zpz is some modular field, GFq is Givaro::Extension (or the like)
 		 * @param [out] C result
 		 * @param A matrix
 		 * @param B matrix
@@ -89,7 +94,7 @@ namespace LinBox {
 
 		/** @brief Toom-Cook multiplication for GF(p^e)
                  *
-		 * @tparam Zpz is some modular field, GFq is GivaroExtension (or the like)
+		 * @tparam Zpz is some modular field, GFq is Givaro::Extension (or the like)
 		 * @param [out] C result
 		 * @param A matrix
 		 * @param B matrix
@@ -97,11 +102,11 @@ namespace LinBox {
                  * @warning p should not be too small, and e>1 (you've been warned...)
 		 */
 		template<class Zpz>
-		BlasMatrix<GivaroExtension<Zpz> >&
-		mul (BlasMatrix<GivaroExtension<Zpz> >& C,
-			 const BlasMatrix<GivaroExtension<Zpz> >& A,
-			 const BlasMatrix<GivaroExtension<Zpz> >& B,
-			 const mulMethod::ToomCook<GivaroExtension<Zpz> > & T);
+		BlasMatrix<Givaro::Extension<Zpz> >&
+		mul (BlasMatrix<Givaro::Extension<Zpz> >& C,
+			 const BlasMatrix<Givaro::Extension<Zpz> >& A,
+			 const BlasMatrix<Givaro::Extension<Zpz> >& B,
+			 const mulMethod::ToomCook<Givaro::Extension<Zpz> > & T);
 
 #if 0 /* Generic method */
 		template<class ZpzMatrix>
@@ -142,6 +147,49 @@ namespace LinBox {
 }
 #include "linbox/algorithms/matrix-blas3/mul-naive.inl"
 
+// flint
+
+#ifdef __LINBOX_HAVE_FLINT
+namespace FLINT {
+	extern "C" {
+		// #include "longlong.h"
+#define __GMP_BITS_PER_MP_LIMB GMP_LIMB_BITS
+#include "flint/flint.h"
+#include "flint/fmpz_mat.h"
+	}
+}
+
+namespace LinBox {
+	namespace BLAS3 {
+
+		//! Wrapper to FLINT mat-mul
+		template<class DenseIntMat>
+		DenseIntMat &
+		mul (DenseIntMat& C,
+			 const DenseIntMat& A,
+			 const DenseIntMat& B,
+			 const mulMethod::FLINT & );
+
+	}
+}
+#include "linbox/algorithms/matrix-blas3/mul-flint.inl"
+#endif // __LINBOX_HAVE_FLINT
+
+
+// CRA
+namespace LinBox {
+	namespace BLAS3 {
+	template<class DenseIntMat>
+		DenseIntMat &
+		mul (DenseIntMat& C,
+			 const DenseIntMat& A,
+			 const DenseIntMat& B,
+			 const mulMethod::CRA & );
+
+	}
+}
+#include "linbox/algorithms/matrix-blas3/mul-cra.inl"
+
 // <+other algo+>
 namespace LinBox {
 	namespace BLAS3 {
diff --git a/linbox/algorithms/matrix-hom.h b/linbox/algorithms/matrix-hom.h
index d0cb9b0..af616e3 100644
--- a/linbox/algorithms/matrix-hom.h
+++ b/linbox/algorithms/matrix-hom.h
@@ -34,224 +34,85 @@
 #ifndef __LINBOX_matrix_hom_H
 #define __LINBOX_matrix_hom_H
 
+//! @bug it is dangerous to include matrices defs that include hom for their rebind...
 #include "linbox/integer.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/blackbox/compose.h"
-#include "linbox/blackbox/polynomial.h"
-#include "linbox/blackbox/scalar-matrix.h"
 #include "linbox/field/hom.h"
 #include "linbox/matrix/matrix-category.h"
-
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/blackbox/blackbox.h"
+#include "linbox/vector/blas-vector.h"
 
 namespace LinBox
 {
 
-	// try to map a blackbox over a homorphic ring
-	// The most suitable type
-	template <class Blackbox, class Field>
-	struct MatrixHomTrait {
-		//typedef ... FBlackbox
-		// donot know
-		typedef Blackbox value_type;
-	};
-
-#if 0
-	// Vector<Ring>::Sparse = Vector<Ring>::SparsePar
-	template <class Ring, class Field>
-	struct Convert<SparseMatrix<Ring, typename Vector<Ring>::Sparse>, Field> {
-		typedef SparseMatrix<Field, typename Vector<Field>::Sparse> value_type;
-	};
-#endif
-
-	template <class Ring, class Field>
-	struct MatrixHomTrait<SparseMatrix<Ring, typename Vector<Ring>::SparseSeq>, Field> {
-		typedef SparseMatrix<Field, typename Vector<Field>::SparseSeq> value_type;
-	};
-
-	template <class Ring, class Field>
-	struct MatrixHomTrait<SparseMatrix<Ring, typename Vector<Ring>::SparsePar>, Field> {
-		typedef SparseMatrix<Field, typename Vector<Field>::SparsePar> value_type;
-	};
-
-	template <class Ring, class Field>
-	struct MatrixHomTrait<SparseMatrix<Ring, typename Vector<Ring>::SparseMap>, Field> {
-		typedef SparseMatrix<Field, typename Vector<Field>::SparseMap> value_type;
-	};
-
-	template <class Ring, class Field>
-	struct MatrixHomTrait<BlasMatrix<Ring>, Field> {
-		typedef BlasMatrix<Field> value_type;
-	};
-
 	/// \brief Limited doc so far. Used in RationalSolver.
 	namespace MatrixHom
 	{
-
-		//public:
-
-		template<class FMatrix, class IMatrix>
-		void map (FMatrix & Ap, const IMatrix& A)
-		{
-			typename IMatrix::template rebind<typename FMatrix::Field>()( Ap, A);
-		}
-
-		// construct a sparse matrix over finite field, such that Ap = A mod p, where F = Ring / <p>
-		template<class Field, class Vect, class IMatrix>
-		void map (SparseMatrix<Field, Vect> &Ap, const IMatrix& A, const Field &F);
-
-		// construct a sparse matrix over finite field, such that Ap = A mod p, where F = Ring / <p>
-		template<class Ring, class Vect1, class Field, class Vect2>
-		void map (SparseMatrix<Field, Vect2>& Ap, const SparseMatrix<Ring, Vect1>& A)
-		{
-			typename SparseMatrix<Ring,Vect1>::template rebind<Field,Vect2>()( Ap, A);
-		}
-
-
-
 		// function class to hanle map to BlasMatrix (needed to allow partial specialization)
 		template< class Field, class IMatrix, class Type>
 		class BlasMatrixMAP {
 		public:
-			void operator() (BlasMatrix<Field> &Ap, const IMatrix& A, const Field& F, Type type);
+			template<class _Rep>
+			void operator() (BlasMatrix<Field,_Rep> &Ap, const IMatrix& A, Type type);
 		};
 
-		// construct a BlasMatrix over finite fiel, such that Ap - A mod p, where F = Ring / <p>
-
-		template<class Ring, class Field>
-		void map (BlasMatrix<Field> &Ap, const BlasMatrix<Ring>& A )
-		{
-			typename BlasMatrix<Ring>::template rebind<Field>()( Ap, A);
-		}
-
-
-		template <class Field, class IMatrix>
-		void map (BlasMatrix<Field> &Ap, const IMatrix &A, const Field &F)
-		{
-			BlasMatrixMAP<Field, IMatrix, typename MatrixContainerTrait<IMatrix>::Type> ()(Ap, A, F, typename MatrixContainerTrait<IMatrix>::Type());
-		}
-
-		template <class Field, class IPoly, class IMatrix>
-		void map (PolynomialBB< typename IMatrix::template rebind<Field>::other,
-			 typename IPoly::template rebind<Field>::other> &Ap,
-			  const PolynomialBB<IMatrix, IPoly> &A, const Field & F)
-		{
-			typename PolynomialBB<IMatrix,IPoly>::template rebind<Field>() (Ap, A, F);
-		}
-
-		template <class Field, class Ring>
-		void map (ScalarMatrix<Field> &Ap,
-			  const ScalarMatrix<Ring> &A)
-		{
-			typename ScalarMatrix<Ring>::template rebind<Field>() (Ap, A);
-		}
-
-	}
-
-	template <class Field, class Vect, class IMatrix>
-	void MatrixHom::map (SparseMatrix<Field, Vect> &Ap, const IMatrix& A, const Field &F)
-	{
-
-		// 		Ap = new SparseMatrix<Field, Vect>(F, A.rowdim(), A.coldim());
-
-		typedef typename IMatrix::Field Ring;
-
-		Ring r = A.field();
-
-		typename Ring::Element one, zero;
-
-		r. init(one, 1);
-
-		r. init(zero, 0);
-
-		std::vector<typename Ring::Element> e(A.coldim(), zero), tmp(A.rowdim());
-
-		typename std::vector<typename Ring::Element>::iterator iter, e_p;
-
-		typename Field::Element val;
-
-		int i = 0;
-
-		Hom<Ring, Field> hom(A. field(), F);
-
-		for (e_p=e.begin();e_p != e.end(); ++e_p,i++){
-			r.assign(*e_p, one);
-			A.apply(tmp,e);
-			int j;
-			for (iter=tmp.begin(),j=0; iter != tmp.end(); ++iter,j++) {
-				hom. image (val, *iter);
-				if (!F.isZero(val))
-					Ap.setEntry (j,i, val);
-
-			}
-			r.assign(*e_p, zero);
-		}
-
-	}
-
-	namespace MatrixHom
-	{
-
 		template<class Field, class IMatrix>
 		class BlasMatrixMAP<Field, IMatrix, MatrixContainerCategory::Blackbox> {
 		public:
-			void operator() (BlasMatrix<Field> &Ap, const IMatrix &A,  const Field &F, MatrixContainerCategory::Blackbox type)
+			template<class _Rep>
+			void operator() (BlasMatrix<Field,_Rep> &Ap, const IMatrix &A, MatrixContainerCategory::Blackbox type)
 			{
 
-				// 				Ap = new BlasMatrix<Field>(F, A.rowdim(), A.coldim());
 
 				typedef typename IMatrix::Field Ring;
 				Ring r = A.field();
 
-				typename Ring::Element one, zero;
-				r. init(one, 1);
-				r. init(zero, 0);
 
-				std::vector<typename Ring::Element> e(A.coldim(), zero), tmp(A.rowdim());
+				std::vector<typename Ring::Element> e(A.coldim(), r.zero), tmp(A.rowdim());
 
-				typename BlasMatrix<Field>::ColIterator col_p;
+				typename BlasMatrix<Field,_Rep>::ColIterator col_p;
 
-				typename BlasMatrix<Field>::Col::iterator elt_p;
+				typename BlasMatrix<Field,_Rep>::Col::iterator elt_p;
 
 				typename std::vector<typename Ring::Element>::iterator e_p, tmp_p;
 
-				Hom<Ring, Field> hom(A. field(), F);
+				Hom<Ring, Field> hom(A. field(), Ap.field());
 
 				for (col_p = Ap.colBegin(), e_p = e.begin();
 				     e_p != e.end(); ++ col_p, ++ e_p) {
 
-					r.assign(*e_p, one);
+					r.assign(*e_p, r.one);
 					A.apply (tmp, e);
 
 					for (tmp_p = tmp.begin(), elt_p = col_p -> begin();
 					     tmp_p != tmp.end(); ++ tmp_p, ++ elt_p)
 						hom.image (*elt_p, *tmp_p);
-					r.assign(*e_p, zero);
+					r.assign(*e_p, r.zero);
 				}
 			}
 		};
 
-
 		template<class Field, class IMatrix>
 		class BlasMatrixMAP<Field, IMatrix, MatrixContainerCategory::Container> {
 		public:
-			void operator() (BlasMatrix<Field> &Ap, const IMatrix &A, const Field &F, MatrixContainerCategory::Container type)
+			template<class _Rep>
+			void operator() (BlasMatrix<Field,_Rep> &Ap, const IMatrix &A,  MatrixContainerCategory::Container type)
 			{
-				// 				Ap = new BlasMatrix<Field>(F, A.rowdim(), A.coldim());
-				Hom<typename IMatrix::Field , Field> hom(A.field(), F);
-				typename Field::Element e, zero;
-				F.init(zero,0UL);
+				Hom<typename IMatrix::Field , Field> hom(A.field(), Ap.field());
+				typename Field::Element e;
 				for( typename IMatrix::ConstIndexedIterator indices = A.IndexedBegin();
 				     (indices != A.IndexedEnd()) ;
 				     ++indices ) {
 
 					hom. image (e, A.getEntry(indices.rowIndex(),indices.colIndex()) );
 
-					if (!F.isZero(e))
+					if (!Ap.field().isZero(e))
 						Ap.setEntry (indices.rowIndex(),
 							     indices.colIndex(), e);
 					else
 						Ap.setEntry (indices.rowIndex(),
-							     indices.colIndex(), zero);
+							     indices.colIndex(), Ap.field().zero);
 				}
 
 			}
@@ -260,32 +121,32 @@ namespace LinBox
 		template<class Field, class IMatrix>
 		class BlasMatrixMAP<Field, IMatrix, MatrixContainerCategory::BlasContainer> {
 		public:
-			void operator() (BlasMatrix<Field> &Ap, const IMatrix &A, const Field &F, MatrixContainerCategory::BlasContainer type)
+			template<class _Rep>
+			void operator() (BlasMatrix<Field,_Rep> &Ap, const IMatrix &A, MatrixContainerCategory::BlasContainer type)
 			{
-				//Ap = new BlasMatrix<Field>(F, A.rowdim(), A.coldim());
-				Hom<typename IMatrix::Field , Field> hom(A.field(), F);
+				Hom<typename IMatrix::Field , Field> hom(A.field(), Ap.field());
 
 				typename IMatrix::ConstIterator        iterA  = A.Begin();
-				typename BlasMatrix<Field>::Iterator iterAp = Ap.Begin();
+				typename BlasMatrix<Field,_Rep>::Iterator iterAp = Ap.Begin();
 
-				for(; iterA != A.End(); iterA++, iterAp++)
+				for(; iterA != A.End(); ++iterA, ++iterAp)
 					hom. image (*iterAp, *iterA);
 			}
 		};
 
-		template<class Field>
-		class BlasMatrixMAP<Field, BlasMatrix<PID_integer>, MatrixContainerCategory::BlasContainer> {
+		template<class Field, class _Rep>
+		class BlasMatrixMAP<Field, BlasMatrix<Givaro::ZRing<Integer>,_Rep>, MatrixContainerCategory::BlasContainer> {
 		public:
-			void operator() (BlasMatrix<Field> &Ap, const BlasMatrix<PID_integer> &A, const Field &F, MatrixContainerCategory::BlasContainer type)
+			template<class _Rep2>
+			void operator() (BlasMatrix<Field,_Rep2> &Ap, const BlasMatrix<Givaro::ZRing<Integer>,_Rep> &A, MatrixContainerCategory::BlasContainer type)
 			{
-				//Ap = new BlasMatrix<Field>(F, A.rowdim(), A.coldim());
-				PID_integer ZZ ;
-				Hom<PID_integer , Field> hom(ZZ, F);
+				Givaro::ZRing<Integer> ZZ ;
+				Hom<Givaro::ZRing<Integer> , Field> hom(ZZ, Ap.field());
 
-				typename BlasMatrix<PID_integer>::ConstIterator        iterA  = A.Begin();
-				typename BlasMatrix<Field>::Iterator iterAp = Ap.Begin();
+				typename BlasMatrix<Givaro::ZRing<Integer>,_Rep>::ConstIterator        iterA  = A.Begin();
+				typename BlasMatrix<Field,_Rep2>::Iterator iterAp = Ap.Begin();
 
-				for(; iterA != A.End(); iterA++, iterAp++)
+				for(; iterA != A.End(); ++iterA, ++iterAp)
 					hom. image (*iterAp, *iterA);
 			}
 		};
@@ -294,38 +155,123 @@ namespace LinBox
 		template< class IMatrix>
 		class BlasMatrixMAP<MultiModDouble, IMatrix, MatrixContainerCategory::BlasContainer > {
 		public:
-			void operator() (BlasMatrix<MultiModDouble> &Ap, const IMatrix &A, const MultiModDouble &F,  MatrixContainerCategory::BlasContainer type)
+			template<class _Rep>
+			void operator() (BlasMatrix<MultiModDouble,_Rep> &Ap, const IMatrix &A,  MatrixContainerCategory::BlasContainer type)
 			{
-				// Ap = new BlasMatrix<MultiModDouble>(F, A.rowdim(), A.coldim());
-				for (size_t i=0; i<F.size();++i)
-					MatrixHom::map(Ap.getMatrix(i), A, F.getBase(i));
+				for (size_t i=0; i<Ap.field().size();++i)
+					MatrixHom::map(Ap.getMatrix(i), A);
 			}
 		};
 
 		template< class IMatrix>
 		class BlasMatrixMAP<MultiModDouble, IMatrix, MatrixContainerCategory::Container > {
 		public:
-			void operator() (BlasMatrix<MultiModDouble> &Ap, const IMatrix &A, const MultiModDouble &F,  MatrixContainerCategory::Container type)
+			template<class _Rep>
+			void operator() (BlasMatrix<MultiModDouble,_Rep> &Ap, const IMatrix &A,  MatrixContainerCategory::Container type)
 			{
-				// Ap = new BlasMatrix<MultiModDouble>(F, A.rowdim(), A.coldim());
-				for (size_t i=0; i<F.size();++i)
-					MatrixHom::map(Ap.getMatrix(i), A, F.getBase(i));
+				for (size_t i=0; i<Ap.field().size();++i)
+					MatrixHom::map(Ap.getMatrix(i), A);
 			}
 		};
 
 		template< class IMatrix>
 		class BlasMatrixMAP<MultiModDouble, IMatrix, MatrixContainerCategory::Blackbox > {
 		public:
-			void operator() (BlasMatrix<MultiModDouble> &Ap, const IMatrix &A, const MultiModDouble &F,  MatrixContainerCategory::Blackbox type)
+			template<class _Rep>
+			void operator() (BlasMatrix<MultiModDouble,_Rep> &Ap, const IMatrix &A,  MatrixContainerCategory::Blackbox type)
 			{
-				// Ap = new BlasMatrix<MultiModDouble>(F, A.rowdim(), A.coldim());
-				for (size_t i=0; i<F.size();++i)
-					MatrixHom::map(Ap.getMatrix(i), A, F.getBase(i));
+				for (size_t i=0; i<Ap.field().size();++i)
+					MatrixHom::map(Ap.getMatrix(i), A);
 			}
 		};
 #endif
-	}
-}
+	} // MatrixHom
+
+	namespace MatrixHom
+	{
+
+
+		template<class FMatrix, class IMatrix>
+		void map (FMatrix & Ap, const IMatrix& A)
+		{
+			typename IMatrix::template rebind<typename FMatrix::Field>()( Ap, A);
+		}
+
+		// construct a sparse matrix over finite field, such that Ap = A mod p, where F = Ring / <p>
+		template<class Ring, class Vect1, class Field, class Vect2>
+		void map (SparseMatrix<Field, Vect2>& Ap, const SparseMatrix<Ring, Vect1>& A)
+		{
+			// typename SparseMatrix<Ring,Vect1>::template rebind<Field, typename SparseVectorTranslate<Field,Vect2>::other_t >()( Ap, A);
+			typename SparseMatrix<Ring,Vect1>::template rebind<Field,Vect2>()( Ap, A);
+		}
+
+
+		// construct a BlasMatrix over finite field, such that Ap - A mod p, where F = Ring / <p>
+		template<class Ring, class Field, class _Rep>
+		void map (BlasMatrix<Field,_Rep> &Ap, const BlasMatrix<Ring,_Rep>& A )
+		{
+			typename BlasMatrix<Ring,_Rep>::template rebind<Field>()( Ap, A);
+		}
+
+		template <class Field, class IMatrix, class _Rep>
+		void map (BlasMatrix<Field,_Rep> &Ap, const IMatrix &A)
+		{
+			BlasMatrixMAP<Field, IMatrix, typename MatrixContainerTrait<IMatrix>::Type> ()(Ap, A, typename MatrixContainerTrait<IMatrix>::Type());
+		}
+
+		template <class Field, class IPoly, class IMatrix>
+		void map (PolynomialBB< typename IMatrix::template rebind<Field>::other,
+			  typename IPoly::template rebind<Field>::other> &Ap,
+			  const PolynomialBB<IMatrix, IPoly> &A)
+		{
+			typename PolynomialBB<IMatrix,IPoly>::template rebind<Field>() (Ap, A);
+		}
+
+		template <class Field, class Ring>
+		void map (ScalarMatrix<Field> &Ap,
+			  const ScalarMatrix<Ring> &A)
+		{
+			typename ScalarMatrix<Ring>::template rebind<Field>() (Ap, A);
+		}
+
+		// construct a sparse matrix over finite field, such that Ap = A mod p, where F = Ring / <p>
+		template <class Field, class Vect, class IMatrix>
+		void map (SparseMatrix<Field, Vect> &Ap, const IMatrix& A)
+		{
+
+			typedef typename IMatrix::Field Ring;
+
+			Ring r = A.field();
+
+			BlasVector<Ring> e(r,A.coldim()), tmp(r,A.rowdim());
+
+			typename BlasVector<Ring>::iterator iter, e_p;
+
+			typename Field::Element val;
+
+			int i = 0;
+
+			Hom<Ring, Field> hom(A. field(), Ap.field());
+
+			for (e_p=e.begin();e_p != e.end(); ++e_p,++i){
+				r.assign(*e_p, r.one);
+				A.apply(tmp,e);
+				int j;
+				for (iter=tmp.begin(),j=0; iter != tmp.end(); ++iter,++j) {
+					hom. image (val, *iter);
+					if (!Ap.field().isZero(val))
+						Ap.setEntry ((size_t)j,(size_t)i, val);
+
+				}
+				r.assign(*e_p, r.zero);
+			}
+
+		}
+
+
+	} // MatrixHom
+
+} // LinBox
 
 #endif //__LINBOX_matrix_hom_H
 
diff --git a/linbox/algorithms/matrix-inverse.h b/linbox/algorithms/matrix-inverse.h
index 9d537d6..23e2281 100644
--- a/linbox/algorithms/matrix-inverse.h
+++ b/linbox/algorithms/matrix-inverse.h
@@ -55,6 +55,7 @@ namespace LinBox
 			//typedef typename AnyDenseMatrix::Field Field;
 
 			// step1 PLU Inplcae, actually, LPA = U.
+			// XXX Permutation
 			std::vector<std::pair<int,int> > P;
 			P.reserve (A.rowdim());
 
@@ -128,33 +129,29 @@ namespace LinBox
 
 
 			//2a compute inverse of PA, by solving upper-triangeular system, PA = U^{-1} L.
-			typename Field::Element Zero;
-			typename Field::Element N_one;
-			F.init(Zero,0);
-			F.init(N_one, -1);
 
 			offset = 0;
 			for(cur_c = A.colBegin();cur_c != A. colEnd(); ++ cur_c, ++ offset) {
 
 				for (cur_cp = cur_c -> begin();
 				     cur_cp != cur_c -> begin() + offset; ++ cur_cp)
-					F.assign (*cur_cp, Zero);
+					F.assign (*cur_cp, F.zero);
 
-				F.assign(*cur_cp, N_one); ++ cur_cp;
+				F.assign(*cur_cp, F.mOne); ++ cur_cp;
 
 				for (; cur_cp != cur_c -> end(); ++ cur_cp)
 					F.negin(*cur_cp);
 
 				//matrix is indexed by 0, instead of 1.
 
-				for (cur_cp = cur_c -> begin() + (A.rowdim() - 1),
+				for (cur_cp = cur_c -> begin() + (ptrdiff_t)(A.rowdim() - 1),
 				     tmp_r = tmp.rowBegin() + ( (int)A.rowdim() - 1);
 				     cur_cp != cur_c -> begin() - 1;
 				     -- cur_cp, -- tmp_r) {
 
 					F.assign (tmp_e, *cur_cp);
 
-					for(tmp_cp = cur_c -> begin() + (A.rowdim() - 1), tmp_rp = tmp_r -> begin() + ( A.rowdim() -1);
+					for(tmp_cp = cur_c -> begin() + (ptrdiff_t) (A.rowdim() - 1), tmp_rp = tmp_r -> begin() + (ptrdiff_t) ( A.rowdim() -1);
 					    tmp_cp != cur_cp; -- tmp_cp, -- tmp_rp)
 						F.axpyin(tmp_e, *tmp_cp, *tmp_rp);
 
diff --git a/linbox/algorithms/matrix-rank.h b/linbox/algorithms/matrix-rank.h
index 359adf9..4fb0cba 100644
--- a/linbox/algorithms/matrix-rank.h
+++ b/linbox/algorithms/matrix-rank.h
@@ -32,7 +32,7 @@
 #define __LINBOX_matrix_rank_H
 
 #include "linbox/util/debug.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/solutions/rank.h"
 
 #include "linbox/algorithms/matrix-hom.h"
@@ -77,11 +77,13 @@ namespace LinBox
 		long rank(const IMatrix& A) const
 		{
 
+			rp.template setBitsField<Field>();
+
 			Field F ((unsigned long)*rp);
 
 			BlasMatrix<Field> Ap(F, A.rowdim(), A.coldim());
 
-			MatrixHom::map(Ap, A, F);
+			MatrixHom::map(Ap, A);
 
 			long result;
 
@@ -100,12 +102,14 @@ namespace LinBox
 		long rank(const BlasMatrix<IRing>& A) const
 		{
 
-			Field F ((unsigned long)*rp);
+			rp.template setBitsField<_Field>();
+
+			Field F ((integer)*rp);
 			//! bug the following should work :
 			// BlasMatrix<Field>  Ap(F,A);
 			BlasMatrix<Field> Ap(F, A.rowdim(), A.coldim());
 
-			MatrixHom::map(Ap, A, F);
+			MatrixHom::map(Ap, A);
 
 
 			long result;
@@ -125,6 +129,7 @@ namespace LinBox
 		template <class Row>
 		long rank(const SparseMatrix<Ring, Row>& A) const
 		{
+			rp.template setBitsField<Field>();
 
 			Field F (*rp);
 			typename SparseMatrix<Ring, Row>::template rebind<Field>::other Ap(A, F);
@@ -231,7 +236,7 @@ namespace LinBox
 
 			LinBox::rank(result, A, A.field());
 
-			return result;
+			return (long)result;
 		}
 
 	};
diff --git a/linbox/algorithms/mg-block-lanczos.h b/linbox/algorithms/mg-block-lanczos.h
index c65b900..37b17a9 100644
--- a/linbox/algorithms/mg-block-lanczos.h
+++ b/linbox/algorithms/mg-block-lanczos.h
@@ -39,6 +39,7 @@
 #include "linbox/vector/vector-domain.h"
 #include "linbox/blackbox/archetype.h"
 #include "linbox/solutions/methods.h"
+#include "linbox/matrix/dense-matrix.h"
 
 // I'm putting everything inside the LinBox namespace so that I can drop all of
 // this in to LinBox easily at a later date, without any messy porting.
@@ -46,6 +47,7 @@
 namespace LinBox
 {
 
+
 	/** \brief Block Lanczos iteration
 	 *
 	 * This is a blocked version of the iteration given in @ref LanczosSolver. The
@@ -62,7 +64,7 @@ namespace LinBox
 	 * Currently, only dense vectors are supported for this iteration, and it is
 	 * unlikely any other vector archetypes will be supported in the future.
 	 */
-	template <class Field, class Matrix = BlasMatrix<typename Field::Element> >
+	template <class Field, class Matrix = BlasMatrix<Field,typename RawVector<typename Field::Element >::Dense> >
 	class MGBlockLanczosSolver {
 	public:
 
@@ -74,10 +76,11 @@ namespace LinBox
 		 *               options for the solver
 		 */
 		MGBlockLanczosSolver (const Field &F, const BlockLanczosTraits &traits) :
-			_traits (traits), _field (F), _VD (F), _MD (F), _randiter (F), _block (traits.blockingFactor ())
+			_traits (traits), _field (&F), _VD (F), _MD (F), _randiter (F)
+			,_AV(F)
+			, _block (traits.blockingFactor ())
 		{
 			init_temps ();
-			_field.init (_one, 1);
 		}
 
 		/** Constructor with a random iterator
@@ -87,10 +90,11 @@ namespace LinBox
 		 * @param r Random iterator to use for randomization
 		 */
 		MGBlockLanczosSolver (const Field &F, const BlockLanczosTraits &traits, typename Field::RandIter r) :
-			_traits (traits), _field (F), _VD (F), _MD (F), _randiter (r), _block (traits.blockingFactor ())
+			_traits (traits), _field (&F), _VD (F), _MD (F), _randiter (r)
+			,_AV(F)
+			, _block (traits.blockingFactor ())
 		{
 			init_temps ();
-			_field.init (_one, 1);
 		}
 
 		/** Solve the linear system Ax = b.
@@ -218,20 +222,25 @@ namespace LinBox
 		// Initialize the temporaries used in computation
 		void init_temps ();
 
+		// are we public?
+		inline const Field & field() const { return *_field; }
+
 		// Private variables
 
 		const BlockLanczosTraits _traits;
-		const Field              &_field;
+		const Field              *_field;
 		VectorDomain<Field>       _VD;
 		MatrixDomain<Field>       _MD;
 		typename Field::RandIter  _randiter;
 
 		// Temporaries used in the computation
 
-		Matrix  _matV[3];             // n x N
+		// Matrix  _matV[3];             // n x N
+		std::vector<Matrix> _matV;
 		Matrix  _AV;               // n x N
 		Matrix  _VTAV;             // N x N
-		Matrix  _Winv[2];          // N x N
+		// Matrix  _Winv[2];          // N x N
+		std::vector<Matrix> _Winv ;
 		Matrix  _AVTAVSST_VTAV;    // N x N
 		Matrix  _matT;                // N x N
 		Matrix  _DEF;              // N x N
@@ -244,7 +253,6 @@ namespace LinBox
 		mutable Matrix _tmp;       // N x <=N
 		mutable Matrix _tmp1;      // N x <=N
 
-		typename Field::Element   _one;
 
 		std::vector<size_t>       _indices;          // N
 
@@ -286,11 +294,11 @@ namespace LinBox
 
 #endif // __LINBOX_mg_block_lanczos_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
 
diff --git a/linbox/algorithms/mg-block-lanczos.inl b/linbox/algorithms/mg-block-lanczos.inl
index 8a5566a..8d305b1 100644
--- a/linbox/algorithms/mg-block-lanczos.inl
+++ b/linbox/algorithms/mg-block-lanczos.inl
@@ -38,7 +38,7 @@
 #include "linbox/blackbox/diagonal.h"
 #include "linbox/blackbox/compose.h"
 #include "linbox/blackbox/transpose.h"
-#include "linbox/randiter/nonzero.h"
+#include <givaro/givranditer.h>
 #include "linbox/util/commentator.h"
 #include "linbox/util/timer.h"
 #include "linbox/algorithms/mg-block-lanczos.h"
@@ -136,7 +136,8 @@ namespace LinBox
 		commentator().start ("Solving linear system (Montgomery's block Lanczos)", "MGBlockLanczosSolver::solve");
 
 		bool success = false;
-		Vector d1, d2, b1, b2, bp, y, Ax, ATAx, ATb;
+		Field F = A.field();
+		Vector d1(F), d2(F), b1(F), b2(F), bp(F), y(F), Ax(F), ATAx(F), ATb(F);
 
 		// Get the temporaries into the right sizes
 		_b.resize (b.size (), 1);
@@ -150,8 +151,8 @@ namespace LinBox
 		_matV[2].resize (A.coldim (), _block);
 		_AV.resize (A.coldim (), _block);
 
-		NonzeroRandIter<Field> real_ri (_field, _randiter);
-		RandomDenseStream<Field, Vector, NonzeroRandIter<Field> > stream (_field, real_ri, A.coldim ());
+        Givaro::GeneralRingNonZeroRandIter<Field> real_ri (_randiter);
+		RandomDenseStream<Field, Vector, Givaro::GeneralRingNonZeroRandIter<Field> > stream (field(), real_ri, A.coldim ());
 
 		for (unsigned int i = 0; !success && i < _traits.maxTries (); ++i) {
 			std::ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
@@ -188,7 +189,7 @@ namespace LinBox
 					VectorWrapper::ensureDim (y, A.coldim ());
 
 					stream >> d1;
-					Diagonal<Field> D (_field, d1);
+					Diagonal<Field> D (d1);
 					Compose<Blackbox, Diagonal<Field> > B (&A, &D);
 
 					report << "Random D: ";
@@ -215,7 +216,7 @@ namespace LinBox
 					typedef Compose<PC2, CO1> CO2;
 
 					stream >> d1;
-					PC1 D (_field, d1);
+					PC1 D (d1);
 					PC2 AT (&A);
 					CO1 B1 (&D, &A);
 					CO2 B (&AT, &B1);
@@ -250,8 +251,8 @@ namespace LinBox
 					typedef Compose<PC1, CO3> CO4;
 
 					stream >> d1 >> d2;
-					PC1 D1 (_field, d1);
-					PC1 D2 (_field, d2);
+					PC1 D1 (d1);
+					PC1 D2 (d2);
 					PC2 AT (&A);
 					CO1 B1 (&A, &D1);
 					CO2 B2 (&D2, &B1);
@@ -339,7 +340,6 @@ namespace LinBox
 
 		unsigned int number = 0;
 
-		bool success;
 
 		typename LinBox::Vector<Field>::Dense d1, d2;
 
@@ -358,18 +358,19 @@ namespace LinBox
 
 		typename Matrix::ColIterator xi = x.colBegin ();
 
-		NonzeroRandIter<Field> real_ri (_field, _randiter);
-		RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense, NonzeroRandIter<Field> > d_stream (_field, real_ri, A.coldim ());
+        Givaro::GeneralRingNonZeroRandIter<Field> real_ri (_randiter);
+		RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense, Givaro::GeneralRingNonZeroRandIter<Field> > d_stream (field(), real_ri, A.coldim ());
 
 		TransposeMatrix<Matrix> bT (_b);
 		TransposeMatrix<Matrix> xT (_x);
 
 		for ( unsigned int i = 0; number < x.coldim () && i < _traits.maxTries (); ++i) {
+			// bool success;
 			std::ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
 			report << "in try: " << i << std::endl;
 
 			// Fill y with random data
-			RandomDenseStream<Field, typename Matrix::Col> stream (_field, _randiter, A.coldim ());
+			RandomDenseStream<Field, typename Matrix::Col> stream (field(), _randiter, A.coldim ());
 			typename Matrix::ColIterator iter;
 
 			for (iter = _y.colBegin (); iter != _y.colEnd (); ++iter)
@@ -380,7 +381,8 @@ namespace LinBox
 
 			switch (_traits.preconditioner ()) {
 			case BlockLanczosTraits::NO_PRECONDITIONER:
-				success = iterate (A);
+				// success =
+					iterate (A);
 				break;
 
 			case BlockLanczosTraits::SYMMETRIZE:
@@ -391,7 +393,8 @@ namespace LinBox
 					_MD.blackboxMulRight (xT, transpose (_b), A);
 					_MD.copy (_b, _x);
 
-					success = iterate (B);
+					// success =
+						iterate (B);
 					break;
 				}
 
@@ -400,13 +403,14 @@ namespace LinBox
 					VectorWrapper::ensureDim (d1, A.coldim ());
 
 					d_stream >> d1;
-					Diagonal<Field> D (_field, d1);
+					Diagonal<Field> D (field(), d1);
 					Compose<Blackbox, Diagonal<Field> > B (&A, &D);
 
 					report << "Random D: ";
 					_VD.write (report, d1) << std::endl;
 
-					success = iterate (B);
+					// success =
+						iterate (B);
 
 					_MD.blackboxMulLeft (_b, D, _x);
 					_MD.copy (_x, _b);
@@ -424,7 +428,7 @@ namespace LinBox
 					typedef Compose<PC2, CO1> CO2;
 
 					d_stream >> d1;
-					PC1 D (_field, d1);
+					PC1 D (field(), d1);
 					PC2 AT (&A);
 					CO1 B1 (&D, &A);
 					CO2 B (&AT, &B1);
@@ -435,7 +439,8 @@ namespace LinBox
 					_MD.blackboxMulLeft (_x, D, _b);
 					_MD.blackboxMulRight (bT, transpose (_x), A);
 
-					success = iterate (B);
+					// success =
+						iterate (B);
 
 					break;
 				}
@@ -453,8 +458,8 @@ namespace LinBox
 					typedef Compose<PC1, CO3> CO4;
 
 					d_stream >> d1 >> d2;
-					PC1 D1 (_field, d1);
-					PC1 D2 (_field, d2);
+					PC1 D1 (field(), d1);
+					PC1 D2 (field(), d2);
 					PC2 AT (&A);
 					CO1 B1 (&A, &D1);
 					CO2 B2 (&D2, &B1);
@@ -472,7 +477,8 @@ namespace LinBox
 					_MD.blackboxMulLeft (_x, D1, _b);
 					_MD.copy (_b, _x);
 
-					success = iterate (B);
+					// success =
+					iterate (B);
 
 					_MD.blackboxMulLeft (_b, D1, _x);
 					_MD.copy (_x, _b);
@@ -533,7 +539,7 @@ namespace LinBox
 
 		// i is the index for temporaries where we need to go back to i - 1
 		// j is the index for temporaries where we need to go back to j - 2
-		int i = 0, j = 2, next_j, prev_j = 1, iter = 2;
+		int i = 0, j = 2, prev_j = 1, iter = 2;
 		typename Matrix::ColIterator k;
 
 		TIMER_DECLARE(AV);
@@ -545,7 +551,7 @@ namespace LinBox
 		TIMER_DECLARE(terminationCheck);
 
 		// Get a random fat vector _matV[0]
-		RandomDenseStream<Field, typename Matrix::Col> stream (_field, _randiter, A.coldim ());
+		RandomDenseStream<Field, typename Matrix::Col> stream (field(), _randiter, A.coldim ());
 
 		for (k = _matV[0].colBegin (); k != _matV[0].colEnd (); ++k)
 			stream >> *k;
@@ -565,7 +571,7 @@ namespace LinBox
 		TIMER_STOP(innerProducts);
 
 		TIMER_START(Winv);
-		Ni = compute_Winv_S (_Winv[0], _vecS, _VTAV);
+		Ni = (size_t)compute_Winv_S (_Winv[0], _vecS, _VTAV);
 		TIMER_STOP(Winv);
 
 		// Check for catastrophic breakdown
@@ -646,7 +652,7 @@ namespace LinBox
 		TIMER_STOP(innerProducts);
 
 		TIMER_START(Winv);
-		Ni = compute_Winv_S (_Winv[1], _vecS, _VTAV);
+		Ni = (size_t)compute_Winv_S (_Winv[1], _vecS, _VTAV);
 		TIMER_STOP(Winv);
 
 		// Check for catastrophic breakdown
@@ -709,7 +715,7 @@ namespace LinBox
 
 			if (done) break;
 
-			next_j = j + 1;
+			int next_j = j + 1;
 			if (next_j > 2) next_j = 0;
 
 			TIMER_START(AV);
@@ -734,7 +740,7 @@ namespace LinBox
 			TIMER_STOP(innerProducts);
 
 			TIMER_START(Winv);
-			Ni = compute_Winv_S (_Winv[i], _vecS, _VTAV);
+			Ni = (size_t)compute_Winv_S (_Winv[i], _vecS, _VTAV);
 			TIMER_STOP(Winv);
 
 			// Check for catastrophic breakdown
@@ -751,10 +757,10 @@ namespace LinBox
 #endif
 
 			//		MGBLTraceReport (report, _MD, "AV", iter, _AV);
-			MGBLTraceReport (report, _MD, "F", iter + 1, _DEF);
-			MGBLTraceReport (report, _MD, "V^T AV", iter, _VTAV);
-			MGBLTraceReport (report, _MD, "Winv", iter, _Winv[i]);
-			reportS (report, _vecS, iter);
+			MGBLTraceReport (report, _MD, "F", (size_t)iter + 1, _DEF);
+			MGBLTraceReport (report, _MD, "V^T AV", (size_t)iter, _VTAV);
+			MGBLTraceReport (report, _MD, "Winv", (size_t)iter, _Winv[i]);
+			reportS (report, _vecS, (size_t)iter);
 
 			// Now that we have S_i, finish off with F_i+1
 			TIMER_START(orthogonalization);
@@ -776,7 +782,7 @@ namespace LinBox
 			mul (_AVTAVSST_VTAV, transpose (_AV), _AV, _vecS);
 			TIMER_STOP(innerProducts);
 
-			MGBLTraceReport (report, _MD, "V^T A^2 V", iter, _AVTAVSST_VTAV);
+			MGBLTraceReport (report, _MD, "V^T A^2 V", (size_t)iter, _AVTAVSST_VTAV);
 
 			TIMER_START(orthogonalization);
 			_MD.addin (_AVTAVSST_VTAV, _VTAV);
@@ -786,14 +792,14 @@ namespace LinBox
 			addIN (_DEF);
 			_MD.axpyin (_matV[next_j], _matV[j], _DEF);
 
-			MGBLTraceReport (report, _MD, "D", iter + 1, _DEF);
+			MGBLTraceReport (report, _MD, "D", (size_t)iter + 1, _DEF);
 
 			// Compute E and update V_i+1
 			mul (_DEF, _Winv[1 - i], _VTAV, _vecS);
 			_MD.axpyin (_matV[next_j], _matV[prev_j], _DEF);
 			TIMER_STOP(orthogonalization);
 
-			MGBLTraceReport (report, _MD, "E", iter + 1, _DEF);
+			MGBLTraceReport (report, _MD, "E", (size_t)iter + 1, _DEF);
 
 			// Add AV_i S_i S_i^T
 			TIMER_START(Vnext);
@@ -801,10 +807,10 @@ namespace LinBox
 			TIMER_STOP(Vnext);
 
 			//		MGBLTraceReport (report, _MD, "V", iter + 1, _matV[next_j]);
-			checkAConjugacy (_MD, _AV, _matV[next_j], _DEF, iter, iter + 1);
+			checkAConjugacy (_MD, _AV, _matV[next_j], _DEF, (size_t)iter, (size_t)iter + 1);
 
 #ifdef MGBL_DETAILED_TRACE
-			checkAConjugacy (_MD, AV1_backup, _matV[next_j], _DEF, 1, iter + 1);
+			checkAConjugacy (_MD, AV1_backup, _matV[next_j], _DEF, 1, (size_t)iter + 1);
 #endif
 
 			i = 1 - i;
@@ -812,8 +818,8 @@ namespace LinBox
 			j = next_j;
 			++iter;
 
-			if (!(iter % progress_interval))
-				commentator().progress (total_dim);
+			if (!(iter % (int)progress_interval))
+				commentator().progress ((long)total_dim);
 
 			if (total_dim > A.rowdim ()) {
 				commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
@@ -863,8 +869,10 @@ namespace LinBox
 		_MD.write (report, T);
 #endif
 
-		BlasMatrix<Field> M1 (_matM, 0, 0, T.rowdim (), T.coldim ());
-		BlasMatrix<Field> M2 (_matM, 0, T.coldim (), T.rowdim (), T.coldim ());
+		// BlasMatrix<Field> M1 (_matM, 0, 0, T.rowdim (), T.coldim ());
+		Matrix M1 (_matM, 0, 0, T.rowdim (), T.coldim ());
+		// BlasMatrix<Field> M2 (_matM, 0, T.coldim (), T.rowdim (), T.coldim ());
+		Matrix M2 (_matM, 0, T.coldim (), T.rowdim (), T.coldim ());
 
 		_MD.copy (M1, T);
 		setIN (M2);
@@ -897,7 +905,7 @@ namespace LinBox
 				S[_indices[row]] = true;  // Use column j of V_i in W_i
 
 				// Give the (j, j) entry unity
-				_field.inv (Mjj_inv, _matM.getEntry (_indices[row], _indices[row]));
+				field().inv (Mjj_inv, _matM.getEntry (_indices[row], _indices[row]));
 				_VD.mulin (*(_matM.rowBegin () + (int)_indices[row]), Mjj_inv);
 
 				// Zero the rest of the column j
@@ -919,10 +927,10 @@ namespace LinBox
 
 				const typename Field::Element &Mjj = _matM.refEntry (_indices[row], _indices[row] + _block);
 
-				linbox_check (!_field.isZero (Mjj));
+				linbox_check (!field().isZero (Mjj));
 
 				// Zero the rest of the column j + N
-				eliminate_col (_matM, row, (int)_block, _indices, _field.inv (Mjj_inv, Mjj));
+				eliminate_col (_matM, row, (int)_block, _indices, field().inv (Mjj_inv, Mjj));
 
 				// Zero row j
 				_VD.subin (*(_matM.rowBegin () + (int)_indices[row]), *(_matM.rowBegin () + (int)_indices[row]));
@@ -1028,7 +1036,7 @@ namespace LinBox
 				if (*l)
 					_VD.dot (*k, *i, *j);
 				else
-					_field.subin (*k, *k);
+					field().subin (*k, *k);
 			}
 
 			_VD.copy (*i, tmp);
@@ -1093,7 +1101,7 @@ namespace LinBox
 		size_t idx = 0;
 
 		for (i = A.rowBegin (); i != A.rowEnd (); ++i, ++idx)
-			_field.addin ((*i)[idx], _one);
+			field().addin ((*i)[idx], field().one);
 
 		return A;
 	}
@@ -1153,7 +1161,7 @@ namespace LinBox
 
 		for (i = A.rowBegin (), i_idx = 0; i != A.rowEnd (); ++i, ++i_idx) {
 			_VD.subin (*i, *i);
-			_field.assign ((*i)[i_idx], _one);
+			field().assign ((*i)[i_idx], field().one);
 		}
 
 		return A;
@@ -1181,7 +1189,7 @@ namespace LinBox
 		row_vec = *(_matM.rowBegin () + (int)indices[row]);
 
 		for (idx = row; idx < A.rowdim (); ++idx) {
-			if (!_field.isZero (A.getEntry (indices[idx], indices[row] + col_offset))) {
+			if (!field().isZero (A.getEntry (indices[idx], indices[row] + (size_t)col_offset))) {
 				if (idx != row) {
 					typename Matrix::Row row1 = *(A.rowBegin () + (int)indices[idx]);
 					std::swap_ranges (row_vec.begin (), row_vec.end (), row1.begin ());
@@ -1205,23 +1213,24 @@ namespace LinBox
 		// I'm assuming everything left of the column with the index of the pivot row is 0
 		size_t row;
 
-		typename BlasMatrix<Field>::Row pivot_row;
+		// typename BlasMatrix<Field>::Row pivot_row;
+		typename Matrix::Row pivot_row;
 		typename Field::Element p;
 
 		pivot_row = *(A.rowBegin () + (int)indices[pivot]);
 
 		for (row = 0; row < pivot; ++row) {
-			const typename Field::Element &Aij = A.getEntry (indices[row], indices[pivot] + col_offset);
+			const typename Field::Element &Aij = A.getEntry (indices[row], indices[pivot] + (size_t)col_offset);
 
-			if (!_field.isZero (Aij))
-				_VD.axpyin (*(A.rowBegin () +(int) indices[row]), _field.neg (p, Aij), pivot_row);
+			if (!field().isZero (Aij))
+				_VD.axpyin (*(A.rowBegin () +(int) indices[row]), field().neg (p, Aij), pivot_row);
 		}
 
 		for (++row; row < A.rowdim (); ++row) {
-			const typename Field::Element &Aij = A.getEntry (indices[row], indices[pivot] + col_offset);
+			const typename Field::Element &Aij = A.getEntry (indices[row], indices[pivot] + (size_t)col_offset);
 
-			if (!_field.isZero (Aij))
-				_VD.axpyin (*(A.rowBegin () + (int) indices[row]), _field.neg (p, Aij), pivot_row);
+			if (!field().isZero (Aij))
+				_VD.axpyin (*(A.rowBegin () + (int) indices[row]), field().neg (p, Aij), pivot_row);
 		}
 	}
 
@@ -1248,21 +1257,18 @@ namespace LinBox
 	{
 		linbox_check (M.rowdim () == M.coldim ());
 
-		typename Field::Element neg_one;
-
-		_field.init (neg_one, -1);
 
 		size_t i, j;
 
 		for (i = 0; i < M.rowdim (); ++i) {
 			for (j = 0; j < M.coldim (); ++j) {
-				if (i != j && !_field.isZero (M.getEntry (i, j))) {
-					if (!_field.isZero (M.getEntry (i, i))) {
+				if (i != j && !field().isZero (M.getEntry (i, j))) {
+					if (!field().isZero (M.getEntry (i, i))) {
 						typename Matrix::ConstRowIterator row = M.rowBegin () + j;
 						if (!_VD.isZero (*row))
 							return false;
 					}
-					else if (!_field.isZero (M.getEntry (j, j))) {
+					else if (!field().isZero (M.getEntry (j, j))) {
 						typename Matrix::ConstColIterator col = M.colBegin () + i;
 						if (!_VD.isZero (*col))
 							return false;
@@ -1270,7 +1276,7 @@ namespace LinBox
 					else
 						return false;
 				}
-				else if (!_field.isZero (M.getEntry (i, j)) && !_field.areEqual (M.getEntry (i, j), neg_one))
+				else if (!field().isZero (M.getEntry (i, j)) && !field().areEqual (M.getEntry (i, j), field().mOne))
 					return false;
 			}
 		}
@@ -1298,11 +1304,11 @@ namespace LinBox
 		Matrix ATA (n, n);
 		Matrix W (n, n);
 		Matrix WA (n, n);
-		std::vector<bool> S (n);
+		std::vector<bool> S ((size_t)n);
 
 		bool ret = true;
 
-		RandomDenseStream<Field, typename Matrix::Row> stream (_field, _randiter, n);
+		RandomDenseStream<Field, typename Matrix::Row> stream (field(), _randiter, n);
 		typename Matrix::RowIterator i = A.rowBegin ();
 		typename Matrix::ColIterator j = AT.colBegin ();
 
@@ -1366,11 +1372,11 @@ namespace LinBox
 		Matrix ATA (n, n);
 		Matrix W (n, n);
 		Matrix WA (n, n);
-		std::vector<bool> S (n);
+		std::vector<bool> S ((size_t)n);
 
 		bool ret = true;
 
-		RandomDenseStream<Field, typename Matrix::Row> stream (_field, _randiter, n);
+		RandomDenseStream<Field, typename Matrix::Row> stream (field(), _randiter, n);
 		typename Matrix::RowIterator i = A.rowBegin ();
 		typename Matrix::ColIterator j = AT.colBegin ();
 
@@ -1472,7 +1478,7 @@ namespace LinBox
 
 		bool ret = true;
 
-		RandomDenseStream<Field, typename Matrix::Row> stream (_field, _randiter, n);
+		RandomDenseStream<Field, typename Matrix::Row> stream (field(), _randiter, n);
 		typename Matrix::RowIterator i = A.rowBegin ();
 
 		for (; i != A.rowEnd (); ++i)
@@ -1482,10 +1488,10 @@ namespace LinBox
 		report << "Computed A:" << std::endl;
 		_MD.write (report, A);
 
-		RandomDenseStream<Field, Matrix> stream1 (_field, _randiter, m);
+		RandomDenseStream<Field, Matrix> stream1 (field(), _randiter, m);
 		stream1 >> x;
 
-		RandomDenseStream<Field, Matrix> stream2 (_field, _randiter, n);
+		RandomDenseStream<Field, Matrix> stream2 (field(), _randiter, n);
 		stream1 >> y;
 
 		report << "Computed     x: ";
@@ -1507,14 +1513,14 @@ namespace LinBox
 		_VD.dot (ATxy, ATx, y);
 
 		report << "Computed  ATxy: ";
-		_field.write (report, ATxy) << std::endl;
+		field().write (report, ATxy) << std::endl;
 
 		_VD.dot (xAy, x, Ay);
 
 		report << "Computed   xAy: ";
-		_field.write (report, xAy) << std::endl;
+		field().write (report, xAy) << std::endl;
 
-		if (!_field.areEqual (ATxy, xAy)) {
+		if (!field().areEqual (ATxy, xAy)) {
 			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
 			<< "ERROR: <A^T x, y> != <x, Ay>" << std::endl;
 			ret = false;
diff --git a/linbox/algorithms/minpoly-integer.h b/linbox/algorithms/minpoly-integer.h
index 5e65561..ff31e55 100644
--- a/linbox/algorithms/minpoly-integer.h
+++ b/linbox/algorithms/minpoly-integer.h
@@ -28,7 +28,7 @@
 #define __LINBOX_minpoly_integer_H
 
 #include <iostream>
-#include <math.h>
+#include <cmath>
 
 /*! \file algorithms/minpoly-integer.h
  * Compute the minpoly of a matrix over an integer ring using modular arithmetic
@@ -113,10 +113,7 @@ namespace LinBox
 		typedef typename IMatrix::template rebind<Field>::other FBlackbox;
 		typedef std::vector<Element> FPoly;
 		FPoly fp;
-		integer mmodulus;
-		FieldTraits<Field>::maxModulus(mmodulus);
-		long bits = (long) floor (log((double)mmodulus)/M_LN2);
-		RandomPrimeIterator primeg(bits);
+		RandomPrimeIterator primeg; primeg.template setBitsField<Field>();
 		for (int i = 0; i < n_try; ++ i) {
 			++primeg;
 			Field F(*primeg);
@@ -150,13 +147,10 @@ namespace LinBox
 		typedef typename IMatrix::template rebind<Field>::other FBlackbox;
 		typedef std::vector<Element> FPoly;
 
-		integer mmodulus;
-		FieldTraits<Field>::maxModulus(mmodulus);
-		long bits = (long) floor (log((double)mmodulus)/M_LN2);
+		RandomPrimeIterator primeg; primeg.template setBitsField<Field>();
 
-		RandomPrimeIterator primeg(bits);
 		FPoly fp (degree + 1);
-		typename FPoly::iterator fp_p;
+		// typename FPoly::iterator fp_p;
 		y.resize (degree + 1);
 
 		EarlyMultipCRA< _Field > cra(3UL);
@@ -194,14 +188,10 @@ namespace LinBox
 		typedef typename IMatrix::template rebind<Field>::other FBlackbox;
 		typedef std::vector<Element> FPoly;
 
+		RandomPrimeIterator primeg; primeg.template setBitsField<Field>();
 
-		integer mmodulus;
-		FieldTraits<Field>::maxModulus(mmodulus);
-		long bits = (long) floor (log((double)mmodulus)/M_LN2);
-
-		RandomPrimeIterator primeg(bits);
 		FPoly fp (degree + 1);
-		typename FPoly::iterator fp_p;
+		// typename FPoly::iterator fp_p;
 		y.resize (degree + 1);
 
 		EarlyMultipCRA< _Field > cra(3UL);
@@ -269,18 +259,16 @@ namespace LinBox
 
 		y. resize (degree + 1);
 		size_t n = M. rowdim();
-		integer mmodulus;
-		FieldTraits<Field>::maxModulus(mmodulus);
-		long bit1 = (long) floor (log((double)mmodulus)/M_LN2);
-		long bit2 = (long) floor (log(sqrt(double(4503599627370496LL/n)))/M_LN2);
-		RandomPrimeIterator primeg(bit1 < bit2 ? bit1 : bit2);
+		RandomPrimeIterator primeg;
+		if( ! primeg.template setBitsDelayedField<Field>(n) )
+			primeg.template setBitsField<Field>();
 		Element* FA = new Element [n*n];
 		Element* X = new Element [n*(n+1)];
 		size_t* Perm = new size_t[n];
 		Element* p;
 		typename BlasMatrix<Ring>::ConstIterator raw_p;
 		std::vector<Element> poly (degree + 1);
-		typename std::vector<Element>::iterator poly_ptr;
+		// typename std::vector<Element>::iterator poly_ptr;
 
 		EarlyMultipCRA< _Field > cra(3UL);
 		do {
@@ -315,7 +303,7 @@ namespace LinBox
 		}
 		cra. result(y);
 		//std::cout << "Number of primes needed: " << cra. steps() << std::endl;
-		delete FA; delete X; delete Perm;
+		delete[] FA; delete[] X; delete[] Perm;
 
 		return y;
 	}
@@ -333,11 +321,9 @@ namespace LinBox
 		Element* p;
 		std::vector<Element> Poly;
 
-		integer mmodulus;
-		FieldTraits<Field>::maxModulus(mmodulus);
-		long bit1 = (long) floor (log((double)mmodulus)/M_LN2);
-		long bit2 = (long) floor (log(sqrt(double(4503599627370496LL/n)))/M_LN2);
-		RandomPrimeIterator primeg(bit1 < bit2 ? bit1 : bit2);
+                RandomPrimeIterator primeg;
+                if( ! primeg.template setBitsDelayedField<Field>(n) )
+                        primeg.template setBitsField<Field>();
 
 		typename BlasMatrix<Ring>::ConstIterator raw_p;
 		for (int i = 0; i < n_try; ++ i) {
@@ -352,7 +338,7 @@ namespace LinBox
 			if (degree < Poly. size() - 1)
 				degree = Poly. size() -1;
 		}
-		delete FA; delete X; delete Perm;
+		delete[] FA; delete[] X; delete[] Perm;
 
 		return degree;
 	}
@@ -360,11 +346,10 @@ namespace LinBox
 
 #endif //__LINBOX_minpoly_integer_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/minpoly-rational.h b/linbox/algorithms/minpoly-rational.h
index 4a642ab..002815d 100644
--- a/linbox/algorithms/minpoly-rational.h
+++ b/linbox/algorithms/minpoly-rational.h
@@ -27,10 +27,10 @@
 
 #include "linbox/util/commentator.h"
 #include "linbox/util/timer.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 
 //#include "linbox/field/gmp-rational.h"
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
 #include "linbox/blackbox/rational-matrix-factory.h"
 #include "linbox/algorithms/cra-early-multip.h"
 #include "linbox/algorithms/cra-domain.h"
@@ -164,8 +164,6 @@ namespace LinBox
 							       const BlasMatrix<Rationals > &A,
 							       const MyMethod &Met=  Method::Hybrid())
 	{
-
-		typedef Modular<double> myModular;
 		typedef typename Rationals::Element Quotient;
 
 		commentator().start ("Rational Minpoly", "Rminpoly");
@@ -176,34 +174,34 @@ namespace LinBox
 		std::vector<Integer> M(A.rowdim()+1,1);
 		std::vector<Integer> Di(A.rowdim());
 
-		RationalMatrixFactory<PID_integer,Rationals, BlasMatrix<Rationals > > FA(&A);
+		RationalMatrixFactory<Givaro::ZRing<Integer>,Rationals, BlasMatrix<Rationals > > FA(&A);
 		Integer da=1, di=1; Integer D=1;
 		FA.denominator(da);
 
-		for (int i=M.size()-2; i >= 0 ; --i) {
+		for (int i=(int)M.size()-2; i >= 0 ; --i) {
 			//c[m]=1, c[0]=det(A);
 			FA.denominator(di,i);
 			D *=di;
-			Di[i]=di;
-			M[i] = M[i+1]*da;
+			Di[(size_t)i]=di;
+			M[(size_t)i] = M[(size_t)i+1]*da;
 		}
-		for (int i=0; i < M.size() ; ++i ) {
-			gcd(M[i],M[i],D);
+		for (int i=0; i <(int) M.size() ; ++i ) {
+			gcd(M[(size_t)i],M[(size_t)i],D);
 		}
 
-		PID_integer Z;
-		BlasMatrix<PID_integer> Atilde(Z,A.rowdim(), A.coldim());
+		Givaro::ZRing<Integer> Z;
+		BlasMatrix<Givaro::ZRing<Integer> > Atilde(Z,A.rowdim(), A.coldim());
 		FA.makeAtilde(Atilde);
 
-		ChineseRemainder< EarlyMultipCRA<Modular<double> > > cra(4UL);
+		ChineseRemainder< EarlyMultipCRA<Givaro::Modular<double> > > cra(4UL);
 		MyRationalModularMinpoly<BlasMatrix<Rationals > , MyMethod> iteration1(A, Met, M);
-		MyIntegerModularMinpoly<BlasMatrix<PID_integer>, MyMethod> iteration2(Atilde, Met, Di, M);
+		MyIntegerModularMinpoly<BlasMatrix<Givaro::ZRing<Integer> >, MyMethod> iteration2(Atilde, Met, Di, M);
 		MyModularMinpoly<MyRationalModularMinpoly<BlasMatrix<Rationals > , MyMethod>,
-		MyIntegerModularMinpoly<BlasMatrix<PID_integer>, MyMethod> >  iteration(&iteration1,&iteration2);
+		MyIntegerModularMinpoly<BlasMatrix<Givaro::ZRing<Integer> >, MyMethod> >  iteration(&iteration1,&iteration2);
 
-		RReconstruction<PID_integer, ClassicMaxQRationalReconstruction<PID_integer> > RR;
+		RReconstruction<Givaro::ZRing<Integer>, ClassicMaxQRationalReconstruction<Givaro::ZRing<Integer> > > RR;
 
-		std::vector<Integer> PP,PP2; // use of integer due to non genericity of cra. PG 2005-08-04
+		std::vector<Integer> PP; // use of integer due to non genericity of cra. PG 2005-08-04
 		UserTimer t1,t2;
 		t1.clear();
 		t2.clear();
@@ -229,27 +227,27 @@ namespace LinBox
 			Integer m; //Integer r; Integer a,b;
 			cra.getModulus(m);
 			cra.result(PP);//need to divide
-			for (int i=0; i < PP.size(); ++i) {
+			for (int i=0; i < (int)PP.size(); ++i) {
 				Integer D_1;
-				inv(D_1,M[i],m);
-				PP[i] = (PP[i]*D_1) % m;
+				inv(D_1,M[(size_t)i],m);
+				PP[(size_t)i] = (PP[(size_t)i]*D_1) % m;
 			}
 			Integer den,den1;
 			std::vector<Integer> num(A.rowdim()+1);
 			std::vector<Integer> num1(A.rowdim()+1);
-			if (RR.reconstructRational(num,den,PP,m,-1)) {//performs reconstruction strating form c[m], use c[i] as prec for c[i-1]
+			if (RR.reconstructRational(num,den,PP,m,-1)) {//performs reconstruction strating form c[m], use c[(size_t)i] as prec for c[(size_t)i-1]
 				cra(1,PP,iteration,genprime);
 				cra.getModulus(m);
-				for (int i=0; i < PP.size(); ++i) {
+				for (int i=0; i < (int)PP.size(); ++i) {
 					Integer D_1;
-					inv(D_1,M[i],m);
-					PP[i] = (PP[i]*D_1) % m;
+					inv(D_1,M[(size_t)i],m);
+					PP[(size_t)i] = (PP[(size_t)i]*D_1) % m;
 				}
-				bool terminated = true;
 				if (RR.reconstructRational(num1,den1,PP,m,-1)) {
+					bool terminated = true;
 					if (den==den1) {
-						for (int i=0; i < num.size(); ++i) {
-							if (num[i] != num1[i]) {
+						for (int i=0; i < (int)num.size(); ++i) {
+							if (num[(size_t)i] != num1[(size_t)i]) {
 								terminated =false;
 								break;
 							}
@@ -269,7 +267,7 @@ namespace LinBox
 						typename Vector <typename Rationals::Element>::iterator it;
 						Rationals Q;
 						for (it= p.begin(); it != p.end(); ++it, ++i) {
-							A.field().init(*it, num[i],den);
+							A.field().init(*it, num[(size_t)i],den);
 							Q.get_den(t,*it);
 							if (it != p.begin()) Q.get_den(tt,*(it-1));
 							else tt = 1;
@@ -277,7 +275,7 @@ namespace LinBox
 
 						}
 						return p;
-						break;
+						// break;
 					}
 				}
 			}
@@ -288,9 +286,9 @@ namespace LinBox
 		size_t i =0;
 		integer t,tt;
 		integer err;
-		size_t max_res=0;int max_i;
+		// size_t max_res=0;int max_i;
 		// double rel;
-		size_t max_resu=0; int max_iu;
+		// size_t max_resu=0; int max_iu;
 		// size_t max_err = 0;
 		Quotient qerr;
 		p.resize(PP.size());
@@ -299,24 +297,24 @@ namespace LinBox
 
 		Rationals Q;
 		for (it= p.begin(); it != p.end(); ++it, ++i) {
-			A.field().init(*it, PP[i],M[i]);
+			A.field().init(*it, PP[(size_t)i],M[(size_t)i]);
 			Q.get_den(t, *it);
 			Q.get_num(tt,*it);
-			err = M[i]/t;
-			size_t resi = err.bitsize() + tt.bitsize() -1;
-			size_t resu = t.bitsize() + tt.bitsize() -1;
-			if (resi > max_res) {max_res = resi; max_i=i;}
-			if (resu > max_resu) {max_resu = resu; max_iu =i;}
+			err = M[(size_t)i]/t;
+			// size_t resi = err.bitsize() + tt.bitsize() -1;
+			// size_t resu = t.bitsize() + tt.bitsize() -1;
+			// if (resi > max_res) {max_res = resi; max_i=i;}
+			// if (resu > max_resu) {max_resu = resu; max_iu =i;}
 		}
 
-		max_res=0;
+		// max_res=0;
 		for (it= p.begin()+1; it != p.end(); ++it) {
 			Q.get_den(t, *it);
 			Q.get_den(tt, *(it-1));
 			Q.init(qerr,t,tt);
 			Q.get_num(tt, *it);
-			size_t resi = Q.bitsize(t,qerr) + tt.bitsize() -2;
-			if (resi > max_res) {max_res = resi; max_i=i;}
+			// size_t resi = Q.bitsize(t,qerr) + tt.bitsize() -2;
+			// if (resi > max_res) {max_res = resi; max_i=i;}
 		}
 
 		commentator().stop ("done", NULL, "Iminpoly");
@@ -330,11 +328,10 @@ namespace LinBox
 #endif //__LINBOX_rat_minpoly_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/one-invariant-factor.h b/linbox/algorithms/one-invariant-factor.h
index 1615770..4ec1d3a 100644
--- a/linbox/algorithms/one-invariant-factor.h
+++ b/linbox/algorithms/one-invariant-factor.h
@@ -96,7 +96,7 @@ namespace LinBox
 
 		void setCrossover(double t)
 		{
-			if(0 <= t <= 1)
+			if(0 <= t and t <= 1)
 				crossover = t;
 
 		}
@@ -139,7 +139,7 @@ namespace LinBox
 				return oif;
 			}
 
-			r.init (oif, 0);
+			r.assign (oif, r.zero);
 
 			int count;
 
@@ -236,7 +236,7 @@ namespace LinBox
 				return oif;
 			}
 
-			r.init (oif, 0); r. init (bonus, 0);
+			r.assign (oif, r.zero); r. assign (bonus, r.zero);
 			int count;
 			Integer prev, tmp_i, p_bonus;
 			//typename RandomMatrixTraits<IMatrix>::value_type *L, *U;
diff --git a/linbox/algorithms/opencl-environ.h b/linbox/algorithms/opencl-environ.h
new file mode 100644
index 0000000..0e016f4
--- /dev/null
+++ b/linbox/algorithms/opencl-environ.h
@@ -0,0 +1,375 @@
+/* linbox/algorithms/opencl-environ.h
+ * Copyright (C) 2012 Matthew Wezowicz
+ *
+ * Written by Matthew Wezowicz <mwezz at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+#include <pthread.h>
+
+#include <algorithm>
+#include <istream>
+#include <iterator>
+#include <sstream>
+#include <string>
+#include <vector>
+
+#include <CL/cl.h>
+
+//#include "named-mutex.h"
+
+#ifndef __LINBOX_opencl_environ_H
+#define __LINBOX_opencl_environ_H
+
+namespace LinBox{
+
+	/**
+	 * Container for all pertenant information needed to use an OpenCL device,
+	 * compile kernels for the device, track resource usage, and gain exclusive
+	 * access to the device
+	 *
+	 * Complies to the OpenCL 1.0 spec
+	 */
+	class OpenCLEnviron{
+
+	private:
+		//Platform info
+		std::string platformName;
+		double platformVersion;
+		std::vector<std::string> platformExtensions;
+
+		//Device info
+		std::vector<std::string> deviceExtensions;
+
+		//OpenCL variables
+		cl_context context;
+		cl_device_id device;
+		cl_command_queue commandQueue;
+		cl_int errcode;
+
+		//Memory stats
+		unsigned long memCapacity;
+		unsigned long maxBufferSize;
+		unsigned long memInUse;
+
+		//Device type flags
+		bool CPU;
+		bool GPU;
+		bool ACCEL;
+		bool Other;
+
+		//Lock to control access to environ
+#ifndef __MPI_SHARED
+		pthread_mutex_t* deviceLock;
+#else
+		NamedMutex* deviceLock;
+#endif
+
+		//ID number
+		unsigned int IDnum;
+
+		OpenCLEnviron();
+		OpenCLEnviron(const OpenCLEnviron&);
+		OpenCLEnviron& operator=(const OpenCLEnviron&);
+
+	public:
+		OpenCLEnviron(
+			std::string platformName_,
+			double platformVersion_,
+			std::vector<std::string> platformExtensions_,
+			cl_context context_,
+			cl_device_id device_,
+#ifndef __MPI_SHARED
+			pthread_mutex_t* deviceLock_,
+#else
+			NamedMutex* deviceLock_,
+#endif
+			unsigned int IDnum_) :
+			//Init list starts here
+			platformName(platformName_),
+			platformVersion(platformVersion_),
+			platformExtensions(platformExtensions_),
+			context(context_),
+			device(device_),
+			errcode(CL_SUCCESS),
+			memCapacity(0L),
+			maxBufferSize(0L),
+			memInUse(0L),
+			CPU(false),
+			GPU(false),
+			ACCEL(false),
+			Other(true),
+			deviceLock(deviceLock_),
+			IDnum(IDnum_){
+
+			//Initialize command queue
+			clCreateCommandQueue(
+				context,
+				device,
+				CL_QUEUE_PROFILING_ENABLE,
+				&errcode);
+
+			//Get memory stats
+			errcode = clGetDeviceInfo(
+				device,
+				CL_DEVICE_GLOBAL_MEM_SIZE,
+				sizeof(cl_ulong),
+				&memCapacity,
+				NULL);
+			errcode = clGetDeviceInfo(
+				device,
+				CL_DEVICE_MAX_MEM_ALLOC_SIZE,
+				sizeof(cl_ulong),
+				&maxBufferSize,
+				NULL);
+
+			//Get device type
+			cl_device_type type;
+
+			errcode = clGetDeviceInfo(
+				device,
+				CL_DEVICE_TYPE,
+				sizeof(cl_device_type),
+				&type,
+				NULL);
+
+			CPU = (type == CL_DEVICE_TYPE_CPU);
+			GPU = (type == CL_DEVICE_TYPE_GPU);
+			ACCEL = (type == CL_DEVICE_TYPE_ACCELERATOR);
+			Other = ((CPU || GPU || ACCEL) == false);
+
+			//Enumerate device extensions
+			size_t sizeRet;
+
+			errcode = clGetDeviceInfo(
+				device,
+				CL_DEVICE_EXTENSIONS,
+				0,
+				NULL,
+				&sizeRet);
+
+			char* devExt = new char[sizeRet];
+
+			errcode = clGetDeviceInfo(
+				device,
+				CL_DEVICE_EXTENSIONS,
+				sizeRet,
+				devExt,
+				NULL);
+
+			//Parse out individual extensions into vector
+			std::string devExt2(devExt);
+			std::stringstream strstream(devExt2);
+			std::istream_iterator<std::string> it(strstream);
+			std::istream_iterator<std::string> end;
+
+			for(; it != end; it++){
+				deviceExtensions.push_back(*it);
+			}
+
+			//Deallocate memory
+			delete[] devExt;
+		}
+
+		~OpenCLEnviron(){}
+
+		/**
+		 * getPlatformName() returns string with platform name
+		 */
+		std::string getPlatformName() const{
+			return platformName;
+		}
+
+		/**
+		 * getPlatformVersion() returns double with platform version
+		 */
+		double getPlatformVersion() const{
+			return platformVersion;
+		}
+
+		/**
+		 * getPlatformExtensions() returns a constant reference to the vector with
+		 * the platform extensions supported by this environ
+		 */
+		const std::vector<std::string>& getPlatformExtensions() const{
+			return platformExtensions;
+		}
+
+		/**
+		 * getDeviceExtensions() returns a constant reference to the vector with
+		 * the device extensions supported by this environ
+		 */
+		const std::vector<std::string>& getDeviceExtensions() const{
+			return deviceExtensions;
+		}
+
+		/**
+		 * getIDNum() returns the unsigned int with the OpenCLEnviron ID number
+		 */
+		unsigned int getIDNum() const{
+			return IDnum;
+		}
+
+		/**
+		 * getContext() accessor for the context associated with environ
+		 */
+		cl_context getContext() const{
+			return context;
+		}
+
+		/**
+		 * getDevice() accessor for the device associated with environ
+		 */
+		cl_device_id getDevice() const{
+			return device;
+		}
+
+		/**
+		 * getCommandQueue() accessor for thecommand queue associated with environ
+		 */
+		cl_command_queue getCommandQueue() const{
+			return commandQueue;
+		}
+
+		/**
+		 * getErrorCode() accessor for the error code associated with environ
+		 */
+		cl_int getErrorCode() const{
+			return errcode;
+		}
+
+		/**
+		 * setErrorCode() accessor for setting error code associated with environ
+		 */
+		void setErrorCode(cl_int err){
+			errcode = err;
+		}
+
+		/**
+		 * getMemCapacity() accessor for the memory capacity associated with environ
+		 */
+		unsigned long getMemCapacity() const{
+			return memCapacity;
+		}
+
+		/**
+		 * getMaxBufferSize() accessor for the maximum buffer size associated
+		 * with environ
+		 */
+		unsigned long getMaxBufferSize() const{
+			return maxBufferSize;
+		}
+
+		/**
+		 * getMemInUse() accessor for the memory currently in use by the environ
+		 */
+		unsigned long getMemInUse() const{
+			return memInUse;
+		}
+
+		/**
+		 * getMemAvailable() accessor for the memory available in the environ
+		 */
+		unsigned long getMemAvailable() const{
+			return memCapacity - memInUse;
+		}
+
+		/**
+		 * memAllocated() setter for updating the memory levels
+		 */
+		void memAllocated(unsigned long alloc){
+			memInUse += alloc;
+		}
+
+		/**
+		 * memDeallocated() setter for updating the memory levels
+		 */
+		void memDeallocated(unsigned long dealloc){
+			memInUse -= dealloc;
+		}
+
+		/**
+		 * isCPU() accessor for the device type in the environ
+		 */
+		bool isCPU() const{
+			return CPU;
+		}
+
+		/**
+		 * isGPU() accessor for the device type in the environ
+		 */
+		bool isGPU() const{
+			return GPU;
+		}
+
+		/**
+		 * isAccelerator() accessor for the device type in the environ
+		 */
+		bool isAccelerator() const{
+			return ACCEL;
+		}
+
+		/**
+		 * isOtherDevice() accessor for the device type in the environ
+		 */
+		bool isOtherDevice() const{
+			return Other;
+		}
+
+		/**
+		 * acquireEnviron() accessor for gaining exclusive access to the environ
+		 */
+		void acquireEnviron(){
+#ifndef __MPI_SHARED
+			pthread_mutex_lock(deviceLock);
+#else
+			deviceLock->lock();
+			memInUse = deviceLock->updateLocalValue<unsigned long>("memInUse");
+#endif
+		}
+
+		/**
+		 * releaseEnviron() accessor for releasing exclusive access to the environ
+		 */
+		void releaseEnviron(){
+#ifndef __MPI_SHARED
+			pthread_mutex_unlock(deviceLock);
+#else
+			deviceLock->updateGlobalValue<unsigned long>("memInUse", memInUse);
+			deviceLock->unlock();
+#endif
+		}
+
+		/**
+		 * getDeviceLock() accessor for underlying lock in the environ
+		 */
+#ifndef __MPI_SHARED
+		pthread_mutex_t* getDeviceLock(){
+#else
+		NamedMutex* getDeviceLock(){
+#endif
+			return deviceLock;
+		}
+	};
+
+} /* end of namespace LinBox */
+
+#endif /* __LINBOX_opencl_environ_H */
diff --git a/linbox/algorithms/opencl-kernels/Makefile.am b/linbox/algorithms/opencl-kernels/Makefile.am
new file mode 100644
index 0000000..159c5f6
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/Makefile.am
@@ -0,0 +1,34 @@
+# Copyright (c) 2012 the LinBox group
+#  ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the  GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# ========LICENCE========
+
+
+
+pkgincludesubdir=$(pkgincludedir)/algorithms/opencl-kernels
+
+OCL_HDRS =                      \
+    opencl-domain-kernels.inl
+
+if LINBOX_HAVE_OCL
+USE_OCL_HDRS = $(OCL_HDRS)
+endif
+
+pkgincludesub_HEADERS =         \
+    $(USE_OCL_HDRS)
+
+
diff --git a/linbox/algorithms/opencl-kernels/file-list.txt b/linbox/algorithms/opencl-kernels/file-list.txt
new file mode 100644
index 0000000..c7d7096
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/file-list.txt
@@ -0,0 +1,40 @@
+kernel-modulus-dp-unroll.cl
+kernel-modulus-sp-unroll.cl
+kernel-partial-8-dp-unroll.cl
+kernel-partial-16-sp-unroll.cl
+kernel-partial-32-dp-unroll.cl
+kernel-partial-32-sp-unroll.cl
+kernel-partial-1024-dp-unroll.cl
+kernel-partial-1024-sp-unroll.cl
+kernel-muladd-modulus-dp-unroll.cl
+kernel-muladd-modulus-sp-unroll.cl
+kernel-muladd-partial-8-dp-unroll.cl
+kernel-muladd-partial-16-sp-unroll.cl
+kernel-muladd-partial-32-dp-unroll.cl
+kernel-muladd-partial-32-sp-unroll.cl
+kernel-muladd-partial-1024-dp-unroll.cl
+kernel-muladd-partial-1024-sp-unroll.cl
+kernel-axpy-modulus-dp-unroll.cl
+kernel-axpy-modulus-sp-unroll.cl
+kernel-axpy-partial-8-dp-unroll.cl
+kernel-axpy-partial-16-sp-unroll.cl
+kernel-axpy-partial-32-dp-unroll.cl
+kernel-axpy-partial-32-sp-unroll.cl
+kernel-axpy-partial-1024-dp-unroll.cl
+kernel-axpy-partial-1024-sp-unroll.cl
+kernel-maxpy-modulus-dp-unroll.cl
+kernel-maxpy-modulus-sp-unroll.cl
+kernel-maxpy-partial-8-dp-unroll.cl
+kernel-maxpy-partial-16-sp-unroll.cl
+kernel-maxpy-partial-32-dp-unroll.cl
+kernel-maxpy-partial-32-sp-unroll.cl
+kernel-maxpy-partial-1024-dp-unroll.cl
+kernel-maxpy-partial-1024-sp-unroll.cl
+kernel-axmy-modulus-dp-unroll.cl
+kernel-axmy-modulus-sp-unroll.cl
+kernel-axmy-partial-8-dp-unroll.cl
+kernel-axmy-partial-16-sp-unroll.cl
+kernel-axmy-partial-32-dp-unroll.cl
+kernel-axmy-partial-32-sp-unroll.cl
+kernel-axmy-partial-1024-dp-unroll.cl
+kernel-axmy-partial-1024-sp-unroll.cl
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-dp-unroll.cl
new file mode 100644
index 0000000..3dfe323
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-dp-unroll.cl
@@ -0,0 +1,95 @@
+/*
+ * kernel_axmy_modulus_dp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxmyKernelModular1DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][15] * Bs[15][tx];
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = Dsub - c;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-dp.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-dp.cl
new file mode 100644
index 0000000..f833a1f
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-dp.cl
@@ -0,0 +1,68 @@
+/*
+ * kernel_axmy_modulus_dp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxmyKernelModular1DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+			//Calls fmod everey iteration to normalize the partial sum
+			Dsub = fmod(Dsub, mod);
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = Dsub - c;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-sp-unroll.cl
new file mode 100644
index 0000000..aa0779e
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-sp-unroll.cl
@@ -0,0 +1,94 @@
+/*
+ * kernel_axmy_modulus_sp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxmyKernelModular1SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][15] * Bs[15][tx];
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = Dsub - c;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-sp.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-sp.cl
new file mode 100644
index 0000000..6801316
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-modulus-sp.cl
@@ -0,0 +1,67 @@
+/*
+ * kernel_axmy_modulus_sp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxmyKernelModular1SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+			//Calls fmod everey iteration to normalize the partial sum
+			Dsub = fmod(Dsub, mod);
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = Dsub - c;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-dp-unroll.cl
new file mode 100644
index 0000000..372b0c5
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-dp-unroll.cl
@@ -0,0 +1,93 @@
+/*
+ * kernel_axpy_parital_1024_dp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxmyKernelModular1024DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+
+		mCount++;
+
+		//fmod every 1024 iterations
+		if(mCount == 64){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset in the result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = Dsub - c;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-dp.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-dp.cl
new file mode 100644
index 0000000..1f98e84
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-dp.cl
@@ -0,0 +1,79 @@
+/*
+ * kernel_axpy_parital_1024_dp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxmyKernelModular1024DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		mCount++;
+
+		//fmod every 1024 iterations
+		if(mCount == 64){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset in the result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = Dsub - c;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-sp-unroll.cl
new file mode 100644
index 0000000..095884e
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-sp-unroll.cl
@@ -0,0 +1,92 @@
+/*
+ * kernel_axpy_parital_1024_sp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxmyKernelModular1024SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+
+		mCount++;
+
+		//fmod every 1024 iterations
+		if(mCount == 64){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = Dsub - c;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-sp.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-sp.cl
new file mode 100644
index 0000000..6902ef3
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-1024-sp.cl
@@ -0,0 +1,78 @@
+/*
+ * kernel_axpy_parital_1024_sp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxmyKernelModular1024SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		mCount++;
+
+		//fmod every 1024 iterations
+		if(mCount == 64){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = Dsub - c;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-16-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-16-sp-unroll.cl
new file mode 100644
index 0000000..240c88b
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-16-sp-unroll.cl
@@ -0,0 +1,79 @@
+/*
+ * kernel_axpy_parital_16_sp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxmyKernelModular16SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = Dsub - c;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-16-sp.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-16-sp.cl
new file mode 100644
index 0000000..f96d441
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-16-sp.cl
@@ -0,0 +1,66 @@
+/*
+ * kernel_axpy_parital_16_sp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxmyKernelModular16SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = Dsub - c;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-dp-unroll.cl
new file mode 100644
index 0000000..02688da
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-dp-unroll.cl
@@ -0,0 +1,93 @@
+/*
+ * kernel_axmy_parital_32_dp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxmyKernelModular32DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+
+		mCount++;
+
+		//fmod every 32 iterations
+		if(mCount == 2){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = Dsub - c;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-dp.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-dp.cl
new file mode 100644
index 0000000..8796913
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-dp.cl
@@ -0,0 +1,79 @@
+/*
+ * kernel_axmy_parital_32_dp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxmyKernelModular32DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		mCount++;
+
+		//fmod every 32 iterations
+		if(mCount == 2){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = Dsub - c;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-sp-unroll.cl
new file mode 100644
index 0000000..f077abe
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-sp-unroll.cl
@@ -0,0 +1,92 @@
+/*
+ * kernel_axmy_parital_32_sp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxmyKernelModular32SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+
+		mCount++;
+
+		//fmod every 32 iterations
+		if(mCount == 2){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = Dsub - c;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-sp.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-sp.cl
new file mode 100644
index 0000000..421e8e7
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-32-sp.cl
@@ -0,0 +1,78 @@
+/*
+ * kernel_axmy_parital_32_sp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxmyKernelModular32SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		mCount++;
+
+		//fmod every 32 iterations
+		if(mCount == 2){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = Dsub - c;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-8-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-8-dp-unroll.cl
new file mode 100644
index 0000000..f921176
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-8-dp-unroll.cl
@@ -0,0 +1,82 @@
+/*
+ * kernel_axmy_parital_8_dp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxmyKernelModular8DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub = fmod(Dsub, mod);
+
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = Dsub - c;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axmy-partial-8-dp.cl b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-8-dp.cl
new file mode 100644
index 0000000..ffdf473
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axmy-partial-8-dp.cl
@@ -0,0 +1,71 @@
+/*
+ * kernel_axmy_parital_8_dp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxmyKernelModular8DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE / 2; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		Dsub = fmod(Dsub, mod);
+		for(int i = BLOCK_SIZE / 2; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = Dsub - c;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-dp-unroll.cl
new file mode 100644
index 0000000..02f2f24
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-dp-unroll.cl
@@ -0,0 +1,95 @@
+/*
+ * kernel_axpy_modulus_dp.cl
+ *
+ *  Created on: Dec 20, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxpyKernelModular1DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][15] * Bs[15][tx];
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = Dsub + c;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-dp.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-dp.cl
new file mode 100644
index 0000000..89c1f80
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-dp.cl
@@ -0,0 +1,68 @@
+/*
+ * kernel_axpy_modulus_dp.cl
+ *
+ *  Created on: Dec 20, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxpyKernelModular1DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+			//Calls fmod everey iteration to normalize the partial sum
+			Dsub = fmod(Dsub, mod);
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = Dsub + c;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-sp-unroll.cl
new file mode 100644
index 0000000..10ad0d7
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-sp-unroll.cl
@@ -0,0 +1,94 @@
+/*
+ * kernel_axpy_modulus_sp.cl
+ *
+ *  Created on: Dec 20, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxpyKernelModular1SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][15] * Bs[15][tx];
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = Dsub + c;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-sp.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-sp.cl
new file mode 100644
index 0000000..1349f80
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-modulus-sp.cl
@@ -0,0 +1,67 @@
+/*
+ * kernel_axpy_modulus_sp.cl
+ *
+ *  Created on: Dec 20, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxpyKernelModular1SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+			//Calls fmod everey iteration to normalize the partial sum
+			Dsub = fmod(Dsub, mod);
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = Dsub + c;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-dp-unroll.cl
new file mode 100644
index 0000000..9c15e54
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-dp-unroll.cl
@@ -0,0 +1,93 @@
+/*
+ * kernel_axpy_parital_1024_dp.cl
+ *
+ *  Created on: Dec 20, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxpyKernelModular1024DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+
+		mCount++;
+
+		//fmod every 1024 iterations
+		if(mCount == 64){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset in the result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = Dsub + c;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-dp.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-dp.cl
new file mode 100644
index 0000000..7c99644
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-dp.cl
@@ -0,0 +1,79 @@
+/*
+ * kernel_axpy_parital_1024_dp.cl
+ *
+ *  Created on: Dec 20, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxpyKernelModular1024DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		mCount++;
+
+		//fmod every 1024 iterations
+		if(mCount == 64){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset in the result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = Dsub + c;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-sp-unroll.cl
new file mode 100644
index 0000000..97e5d49
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-sp-unroll.cl
@@ -0,0 +1,92 @@
+/*
+ * kernel_axpy_parital_1024_sp.cl
+ *
+ *  Created on: Dec 20, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxpyKernelModular1024SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+
+		mCount++;
+
+		//fmod every 1024 iterations
+		if(mCount == 64){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = Dsub + c;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-sp.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-sp.cl
new file mode 100644
index 0000000..35714ac
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-1024-sp.cl
@@ -0,0 +1,78 @@
+/*
+ * kernel_axpy_parital_1024_sp.cl
+ *
+ *  Created on: Dec 20, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxpyKernelModular1024SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		mCount++;
+
+		//fmod every 1024 iterations
+		if(mCount == 64){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = Dsub + c;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-16-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-16-sp-unroll.cl
new file mode 100644
index 0000000..30c20d1
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-16-sp-unroll.cl
@@ -0,0 +1,79 @@
+/*
+ * kernel_axpy_parital_16_sp.cl
+ *
+ *  Created on: Dec 20, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxpyKernelModular16SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = Dsub + c;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-16-sp.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-16-sp.cl
new file mode 100644
index 0000000..20e8d1a
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-16-sp.cl
@@ -0,0 +1,66 @@
+/*
+ * kernel_axpy_parital_16_sp.cl
+ *
+ *  Created on: Dec 20, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxpyKernelModular16SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = Dsub + c;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-dp-unroll.cl
new file mode 100644
index 0000000..0bbf796
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-dp-unroll.cl
@@ -0,0 +1,93 @@
+/*
+ * kernel_axpy_parital_32_dp.cl
+ *
+ *  Created on: Dec 20, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxpyKernelModular32DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+
+		mCount++;
+
+		//fmod every 32 iterations
+		if(mCount == 2){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = Dsub + c;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-dp.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-dp.cl
new file mode 100644
index 0000000..736e6d7
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-dp.cl
@@ -0,0 +1,79 @@
+/*
+ * kernel_axpy_parital_32_dp.cl
+ *
+ *  Created on: Dec 20, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxpyKernelModular32DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		mCount++;
+
+		//fmod every 32 iterations
+		if(mCount == 2){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = Dsub + c;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-sp-unroll.cl
new file mode 100644
index 0000000..e67ef4c
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-sp-unroll.cl
@@ -0,0 +1,92 @@
+/*
+ * kernel_axpy_parital_32_sp.cl
+ *
+ *  Created on: Dec 20, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxpyKernelModular32SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+
+		mCount++;
+
+		//fmod every 32 iterations
+		if(mCount == 2){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = Dsub + c;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-sp.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-sp.cl
new file mode 100644
index 0000000..eecd16d
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-32-sp.cl
@@ -0,0 +1,78 @@
+/*
+ * kernel_axpy_parital_32_sp.cl
+ *
+ *  Created on: Dec 20, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixAxpyKernelModular32SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		mCount++;
+
+		//fmod every 32 iterations
+		if(mCount == 2){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = Dsub + c;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-8-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-8-dp-unroll.cl
new file mode 100644
index 0000000..5d9f0aa
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-8-dp-unroll.cl
@@ -0,0 +1,82 @@
+/*
+ * kernel_axpy_parital_8_dp.cl
+ *
+ *  Created on: Dec 20, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxpyKernelModular8DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub = fmod(Dsub, mod);
+
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = Dsub + c;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-axpy-partial-8-dp.cl b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-8-dp.cl
new file mode 100644
index 0000000..985880f
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-axpy-partial-8-dp.cl
@@ -0,0 +1,71 @@
+/*
+ * kernel_axpy_parital_8_dp.cl
+ *
+ *  Created on: Dec 20, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixAxpyKernelModular8DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE / 2; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		Dsub = fmod(Dsub, mod);
+		for(int i = BLOCK_SIZE / 2; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = Dsub + c;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-dp-unroll.cl
new file mode 100644
index 0000000..c29981a
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-dp-unroll.cl
@@ -0,0 +1,95 @@
+/*
+ * kernel_maxpy_modulus_dp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMaxpyKernelModular1DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][15] * Bs[15][tx];
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = c - Dsub;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-dp.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-dp.cl
new file mode 100644
index 0000000..b83c7a5
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-dp.cl
@@ -0,0 +1,68 @@
+/*
+ * kernel_maxpy_modulus_dp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMaxpyKernelModular1DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+			//Calls fmod everey iteration to normalize the partial sum
+			Dsub = fmod(Dsub, mod);
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = c - Dsub;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-sp-unroll.cl
new file mode 100644
index 0000000..bb926f9
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-sp-unroll.cl
@@ -0,0 +1,94 @@
+/*
+ * kernel_maxpy_modulus_sp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMaxpyKernelModular1SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][15] * Bs[15][tx];
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = c - Dsub;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-sp.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-sp.cl
new file mode 100644
index 0000000..34b0e33
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-modulus-sp.cl
@@ -0,0 +1,67 @@
+/*
+ * kernel_maxpy_modulus_sp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMaxpyKernelModular1SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+			//Calls fmod everey iteration to normalize the partial sum
+			Dsub = fmod(Dsub, mod);
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = c - Dsub;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-dp-unroll.cl
new file mode 100644
index 0000000..25ee76e
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-dp-unroll.cl
@@ -0,0 +1,93 @@
+/*
+ * kernel_maxpy_parital_1024_dp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMaxpyKernelModular1024DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+
+		mCount++;
+
+		//fmod every 1024 iterations
+		if(mCount == 64){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset in the result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = c - Dsub;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-dp.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-dp.cl
new file mode 100644
index 0000000..b113602
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-dp.cl
@@ -0,0 +1,79 @@
+/*
+ * kernel_maxpy_parital_1024_dp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMaxpyKernelModular1024DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		mCount++;
+
+		//fmod every 1024 iterations
+		if(mCount == 64){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset in the result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = c - Dsub;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-sp-unroll.cl
new file mode 100644
index 0000000..be73196
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-sp-unroll.cl
@@ -0,0 +1,92 @@
+/*
+ * kernel_maxpy_parital_1024_sp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMaxpyKernelModular1024SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+
+		mCount++;
+
+		//fmod every 1024 iterations
+		if(mCount == 64){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = c - Dsub;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-sp.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-sp.cl
new file mode 100644
index 0000000..733c866
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-1024-sp.cl
@@ -0,0 +1,78 @@
+/*
+ * kernel_maxpy_parital_1024_sp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMaxpyKernelModular1024SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		mCount++;
+
+		//fmod every 1024 iterations
+		if(mCount == 64){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = c - Dsub;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-16-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-16-sp-unroll.cl
new file mode 100644
index 0000000..467ba4d
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-16-sp-unroll.cl
@@ -0,0 +1,79 @@
+/*
+ * kernel_maxpy_parital_16_sp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMaxpyKernelModular16SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = c - Dsub;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-16-sp.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-16-sp.cl
new file mode 100644
index 0000000..a227592
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-16-sp.cl
@@ -0,0 +1,66 @@
+/*
+ * kernel_maxpy_parital_16_sp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMaxpyKernelModular16SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = c - Dsub;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-dp-unroll.cl
new file mode 100644
index 0000000..a98e0c8
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-dp-unroll.cl
@@ -0,0 +1,93 @@
+/*
+ * kernel_maxpy_parital_32_dp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMaxpyKernelModular32DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+
+		mCount++;
+
+		//fmod every 32 iterations
+		if(mCount == 2){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = c - Dsub;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-dp.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-dp.cl
new file mode 100644
index 0000000..488cb64
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-dp.cl
@@ -0,0 +1,79 @@
+/*
+ * kernel_maxpy_parital_32_dp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMaxpyKernelModular32DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		mCount++;
+
+		//fmod every 32 iterations
+		if(mCount == 2){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = c - Dsub;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-sp-unroll.cl
new file mode 100644
index 0000000..e8ef963
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-sp-unroll.cl
@@ -0,0 +1,92 @@
+/*
+ * kernel_maxpy_parital_32_sp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMaxpyKernelModular32SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+
+		mCount++;
+
+		//fmod every 32 iterations
+		if(mCount == 2){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = c - Dsub;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-sp.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-sp.cl
new file mode 100644
index 0000000..1a97e20
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-32-sp.cl
@@ -0,0 +1,78 @@
+/*
+ * kernel_maxpy_parital_32_sp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMaxpyKernelModular32SP(__global float* D, __global float* A, __global float* B,
+		__global float* C, const int widthA, const int widthB, const float mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		mCount++;
+
+		//fmod every 32 iterations
+		if(mCount == 2){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	float c = C[d + ty * widthB + tx];
+	Dsub = c - Dsub;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-8-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-8-dp-unroll.cl
new file mode 100644
index 0000000..7fdfc0b
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-8-dp-unroll.cl
@@ -0,0 +1,82 @@
+/*
+ * kernel_maxpy_parital_8_dp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMaxpyKernelModular8DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub = fmod(Dsub, mod);
+
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = c - Dsub;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-8-dp.cl b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-8-dp.cl
new file mode 100644
index 0000000..0238f4f
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-maxpy-partial-8-dp.cl
@@ -0,0 +1,71 @@
+/*
+ * kernel_maxpy_parital_8_dp.cl
+ *
+ *  Created on: Dec 21, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMaxpyKernelModular8DP(__global double* D, __global double* A, __global double* B,
+		__global double* C, const int widthA, const int widthB, const double mod){
+	//Geet Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indexies for submatrix of A
+	int aBegin= widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B;
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Loop over all the sub-maticies of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matricies from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE / 2; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		Dsub = fmod(Dsub, mod);
+		for(int i = BLOCK_SIZE / 2; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset inthe result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Load, add, and normalize with element from C
+	double c = C[d + ty * widthB + tx];
+	Dsub = c - Dsub;
+	Dsub = fmod((mod + Dsub), mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
\ No newline at end of file
diff --git a/linbox/algorithms/opencl-kernels/kernel-modulus-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-modulus-dp-unroll.cl
new file mode 100644
index 0000000..b32c95b
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-modulus-dp-unroll.cl
@@ -0,0 +1,89 @@
+/*
+ * kernel_modulus_dp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMulKernelModular1DP(__global double* C, __global double* A, __global double* B,
+		const int widthA, const int widthB, const double mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Csub = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Csub += As[ty][0] * Bs[0][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][1] * Bs[1][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][2] * Bs[2][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][3] * Bs[3][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][4] * Bs[4][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][5] * Bs[5][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][6] * Bs[6][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][7] * Bs[7][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][8] * Bs[8][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][9] * Bs[9][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][10] * Bs[10][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][11] * Bs[11][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][12] * Bs[12][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][13] * Bs[13][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][14] * Bs[14][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][15] * Bs[15][tx];
+		Csub = fmod(Csub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset in the result matrix and add the sum to the
+	//appropriate spot
+	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+	C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-modulus-dp.cl b/linbox/algorithms/opencl-kernels/kernel-modulus-dp.cl
new file mode 100644
index 0000000..4a76dd6
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-modulus-dp.cl
@@ -0,0 +1,62 @@
+/*
+ * kernel_modulus_dp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMulKernelModular1DP(__global double* C, __global double* A, __global double* B,
+		const int widthA, const int widthB, const double mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Csub = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Csub += As[ty][i] * Bs[i][tx];
+			//Calls fmod every iteration to normalize the partial sum
+			Csub = fmod(Csub, mod);
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset in the result matrix and add the sum to the
+	//appropriate spot
+	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+	C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-modulus-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-modulus-sp-unroll.cl
new file mode 100644
index 0000000..f9d4c51
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-modulus-sp-unroll.cl
@@ -0,0 +1,88 @@
+/*
+ * kernel_modulus_sp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMulKernelModular1SP(__global float* C, __global float* A, __global float* B,
+		const int widthA, const int widthB, const float mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Csub = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Csub += As[ty][0] * Bs[0][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][1] * Bs[1][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][2] * Bs[2][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][3] * Bs[3][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][4] * Bs[4][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][5] * Bs[5][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][6] * Bs[6][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][7] * Bs[7][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][8] * Bs[8][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][9] * Bs[9][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][10] * Bs[10][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][11] * Bs[11][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][12] * Bs[12][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][13] * Bs[13][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][14] * Bs[14][tx];
+		Csub = fmod(Csub, mod);
+		Csub += As[ty][15] * Bs[15][tx];
+		Csub = fmod(Csub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset in the result matrix and add the sum to the
+	//appropriate spot
+	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+	C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-modulus-sp.cl b/linbox/algorithms/opencl-kernels/kernel-modulus-sp.cl
new file mode 100644
index 0000000..1a4a2be
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-modulus-sp.cl
@@ -0,0 +1,61 @@
+/*
+ * kernel_modulus_sp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMulKernelModular1SP(__global float* C, __global float* A, __global float* B,
+		const int widthA, const int widthB, const float mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Csub = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Csub += As[ty][i] * Bs[i][tx];
+			//Calls fmod every iteration to normalize the partial sum
+			Csub = fmod(Csub, mod);
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset in the result matrix and add the sum to the
+	//appropriate spot
+	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+	C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-dp-unroll.cl
new file mode 100644
index 0000000..27b9c2e
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-dp-unroll.cl
@@ -0,0 +1,109 @@
+/*
+ * kernel_modulus_dp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMuladdKernelModular1DP(__global double* D, double alpha, __global double* A, __global double* B,
+		double beta, __global double* C, const int widthA, const int widthB, const double mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][15] * Bs[15][tx];
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset in the result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Scale Dsub by alpha
+	Dsub = alpha * Dsub;
+	Dsub = fmod(Dsub, mod);
+	if(Dsub < 0){
+		Dsub = mod + Dsub;
+	}
+
+	//Scalse Csub by beta
+	double Csub = C[d + ty * widthB + tx];
+	Csub = beta * Csub;
+	Csub = fmod(Csub, mod);
+	if(Csub < 0){
+		Csub = mod + Csub;
+	}
+
+	//Add Dsub and Dsub
+	Dsub = Dsub + Csub;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-dp.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-dp.cl
new file mode 100644
index 0000000..ee3c983
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-dp.cl
@@ -0,0 +1,82 @@
+/*
+ * kernel_modulus_dp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMuladdKernelModular1DP(__global double* D, double alpha, __global double* A, __global double* B,
+		double beta, __global double* C, const int widthA, const int widthB, const double mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+			//Calls fmod every iteration to normalize the partial sum
+			Dsub = fmod(Dsub, mod);
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset in the result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Scale Dsub by alpha
+	Dsub = alpha * Dsub;
+	Dsub = fmod(Dsub, mod);
+	if(Dsub < 0){
+		Dsub = mod + Dsub;
+	}
+
+	//Scalse Csub by beta
+	double Csub = C[d + ty * widthB + tx];
+	Csub = beta * Csub;
+	Csub = fmod(Csub, mod);
+	if(Csub < 0){
+		Csub = mod + Csub;
+	}
+
+	//Add Dsub and Dsub
+	Dsub = Dsub + Csub;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-sp-unroll.cl
new file mode 100644
index 0000000..ec473e8
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-sp-unroll.cl
@@ -0,0 +1,108 @@
+/*
+ * kernel_modulus_sp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMuladdKernelModular1SP(__global float* D, float alpha, __global float* A, __global float* B,
+		float beta, __global float* C, const int widthA, const int widthB, const float mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub = fmod(Dsub, mod);
+		Dsub += As[ty][15] * Bs[15][tx];
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset in the result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Scale Dsub by alpha
+	Dsub = alpha * Dsub;
+	Dsub = fmod(Dsub, mod);
+	if(Dsub < 0){
+		Dsub = mod + Dsub;
+	}
+
+	//Scalse Csub by beta
+	float Csub = C[d + ty * widthB + tx];
+	Csub = beta * Csub;
+	Csub = fmod(Csub, mod);
+	if(Csub < 0){
+		Csub = mod + Csub;
+	}
+
+	//Add Dsub and Dsub
+	Dsub = Dsub + Csub;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-sp.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-sp.cl
new file mode 100644
index 0000000..0e0a6ab
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-modulus-sp.cl
@@ -0,0 +1,81 @@
+/*
+ * kernel_modulus_sp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMuladdKernelModular1SP(__global float* D, float alpha, __global float* A, __global float* B,
+		float beta, __global float* C, const int widthA, const int widthB, const float mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+			//Calls fmod every iteration to normalize the partial sum
+			Dsub = fmod(Dsub, mod);
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset in the result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Scale Dsub by alpha
+	Dsub = alpha * Dsub;
+	Dsub = fmod(Dsub, mod);
+	if(Dsub < 0){
+		Dsub = mod + Dsub;
+	}
+
+	//Scalse Csub by beta
+	float Csub = C[d + ty * widthB + tx];
+	Csub = beta * Csub;
+	Csub = fmod(Csub, mod);
+	if(Csub < 0){
+		Csub = mod + Csub;
+	}
+
+	//Add Dsub and Dsub
+	Dsub = Dsub + Csub;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-dp-unroll.cl
new file mode 100644
index 0000000..6bf994a
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-dp-unroll.cl
@@ -0,0 +1,107 @@
+/*
+ * kernel_partial_1024_dp.cl
+ *
+ *  Created on: Jul 13, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMuladdKernelModular1024DP(__global double* D, double alpha, __global double* A, __global double* B,
+		double beta, __global double* C, const int widthA, const int widthB, const double mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+
+		mCount++;
+
+		//fmod every 1024 iterations
+		if(mCount == 64){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset in the result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Scale Dsub by alpha
+	Dsub = alpha * Dsub;
+	Dsub = fmod(Dsub, mod);
+	if(Dsub < 0){
+		Dsub = mod + Dsub;
+	}
+
+	//Scalse Csub by beta
+	double Csub = C[d + ty * widthB + tx];
+	Csub = beta * Csub;
+	Csub = fmod(Csub, mod);
+	if(Csub < 0){
+		Csub = mod + Csub;
+	}
+
+	//Add Dsub and Dsub
+	Dsub = Dsub + Csub;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-dp.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-dp.cl
new file mode 100644
index 0000000..6c5192c
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-dp.cl
@@ -0,0 +1,93 @@
+/*
+ * kernel_partial_1024_dp.cl
+ *
+ *  Created on: Jul 13, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMuladdKernelModular1024DP(__global double* D, double alpha, __global double* A, __global double* B,
+		double beta, __global double* C, const int widthA, const int widthB, const double mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		mCount++;
+
+		//fmod every 1024 iterations
+		if(mCount == 64){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset in the result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Scale Dsub by alpha
+	Dsub = alpha * Dsub;
+	Dsub = fmod(Dsub, mod);
+	if(Dsub < 0){
+		Dsub = mod + Dsub;
+	}
+
+	//Scalse Csub by beta
+	double Csub = C[d + ty * widthB + tx];
+	Csub = beta * Csub;
+	Csub = fmod(Csub, mod);
+	if(Csub < 0){
+		Csub = mod + Csub;
+	}
+
+	//Add Dsub and Dsub
+	Dsub = Dsub + Csub;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-sp-unroll.cl
new file mode 100644
index 0000000..3f32eb9
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-sp-unroll.cl
@@ -0,0 +1,106 @@
+/*
+ * kernel_partial_1024_sp.cl
+ *
+ *  Created on: Jul 13, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMuladdKernelModular1024SP(__global float* D, float alpha, __global float* A, __global float* B,
+		float beta, __global float* C, const int widthA, const int widthB, const float mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+
+		mCount++;
+
+		//fmod every 1024 iterations
+		if(mCount == 64){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset in the result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Scale Dsub by alpha
+	Dsub = alpha * Dsub;
+	Dsub = fmod(Dsub, mod);
+	if(Dsub < 0){
+		Dsub = mod + Dsub;
+	}
+
+	//Scalse Csub by beta
+	float Csub = C[d + ty * widthB + tx];
+	Csub = beta * Csub;
+	Csub = fmod(Csub, mod);
+	if(Csub < 0){
+		Csub = mod + Csub;
+	}
+
+	//Add Dsub and Dsub
+	Dsub = Dsub + Csub;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-sp.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-sp.cl
new file mode 100644
index 0000000..abd8731
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-1024-sp.cl
@@ -0,0 +1,92 @@
+/*
+ * kernel_partial_1024_sp.cl
+ *
+ *  Created on: Jul 13, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMuladdKernelModular1024SP(__global float* D, float alpha, __global float* A, __global float* B,
+		float beta, __global float* C, const int widthA, const int widthB, const float mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		mCount++;
+
+		//fmod every 1024 iterations
+		if(mCount == 64){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset in the result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Scale Dsub by alpha
+	Dsub = alpha * Dsub;
+	Dsub = fmod(Dsub, mod);
+	if(Dsub < 0){
+		Dsub = mod + Dsub;
+	}
+
+	//Scalse Csub by beta
+	float Csub = C[d + ty * widthB + tx];
+	Csub = beta * Csub;
+	Csub = fmod(Csub, mod);
+	if(Csub < 0){
+		Csub = mod + Csub;
+	}
+
+	//Add Dsub and Dsub
+	Dsub = Dsub + Csub;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-16-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-16-sp-unroll.cl
new file mode 100644
index 0000000..f839e76
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-16-sp-unroll.cl
@@ -0,0 +1,96 @@
+/*
+ * kernel_partial_sp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMuladdKernelModular16SP(__global float* D, float alpha, __global float* A, __global float* B,
+		float beta, __global float* C, const int widthA, const int widthB, const float mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Setup count for modulus every 32 iterations.
+	int m = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset in the result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Scale Dsub by alpha
+	Dsub = alpha * Dsub;
+	Dsub = fmod(Dsub, mod);
+	if(Dsub < 0){
+		Dsub = mod + Dsub;
+	}
+
+	//Scalse Csub by beta
+	float Csub = C[d + ty * widthB + tx];
+	Csub = beta * Csub;
+	Csub = fmod(Csub, mod);
+	if(Csub < 0){
+		Csub = mod + Csub;
+	}
+
+	//Add Dsub and Dsub
+	Dsub = Dsub + Csub;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-16-sp.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-16-sp.cl
new file mode 100644
index 0000000..97aea8a
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-16-sp.cl
@@ -0,0 +1,83 @@
+/*
+ * kernel_partial_sp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMuladdKernelModular16SP(__global float* D, float alpha, __global float* A, __global float* B,
+		float beta, __global float* C, const int widthA, const int widthB, const float mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Setup count for modulus every 32 iterations.
+	int m = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset in the result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Scale Dsub by alpha
+	Dsub = alpha * Dsub;
+	Dsub = fmod(Dsub, mod);
+	if(Dsub < 0){
+		Dsub = mod + Dsub;
+	}
+
+	//Scalse Csub by beta
+	float Csub = C[d + ty * widthB + tx];
+	Csub = beta * Csub;
+	Csub = fmod(Csub, mod);
+	if(Csub < 0){
+		Csub = mod + Csub;
+	}
+
+	//Add Dsub and Dsub
+	Dsub = Dsub + Csub;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-dp-unroll.cl
new file mode 100644
index 0000000..9d0a1bd
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-dp-unroll.cl
@@ -0,0 +1,107 @@
+/*
+ * kernel_partial_32_dp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMuladdKernelModular32DP(__global double* D, double alpha, __global double* A, __global double* B,
+		double beta, __global double* C, const int widthA, const int widthB, const double mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+
+		mCount++;
+
+		//fmod every 32 iterations
+		if(mCount == 2){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset in the result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Scale Dsub by alpha
+	Dsub = alpha * Dsub;
+	Dsub = fmod(Dsub, mod);
+	if(Dsub < 0){
+		Dsub = mod + Dsub;
+	}
+
+	//Scalse Csub by beta
+	double Csub = C[d + ty * widthB + tx];
+	Csub = beta * Csub;
+	Csub = fmod(Csub, mod);
+	if(Csub < 0){
+		Csub = mod + Csub;
+	}
+
+	//Add Dsub and Dsub
+	Dsub = Dsub + Csub;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-dp.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-dp.cl
new file mode 100644
index 0000000..504d9dc
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-dp.cl
@@ -0,0 +1,93 @@
+/*
+ * kernel_partial_32_dp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMuladdKernelModular32DP(__global double* D, double alpha, __global double* A, __global double* B,
+		double beta, __global double* C, const int widthA, const int widthB, const double mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		mCount++;
+
+		//fmod every 32 iterations
+		if(mCount == 2){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset in the result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Scale Dsub by alpha
+	Dsub = alpha * Dsub;
+	Dsub = fmod(Dsub, mod);
+	if(Dsub < 0){
+		Dsub = mod + Dsub;
+	}
+
+	//Scalse Csub by beta
+	double Csub = C[d + ty * widthB + tx];
+	Csub = beta * Csub;
+	Csub = fmod(Csub, mod);
+	if(Csub < 0){
+		Csub = mod + Csub;
+	}
+
+	//Add Dsub and Dsub
+	Dsub = Dsub + Csub;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-sp-unroll.cl
new file mode 100644
index 0000000..f5b5150
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-sp-unroll.cl
@@ -0,0 +1,106 @@
+/*
+ * kernel_partial_32_sp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMuladdKernelModular32SP(__global float* D, float alpha, __global float* A, __global float* B,
+		float beta, __global float* C, const int widthA, const int widthB, const float mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+
+		mCount++;
+
+		//fmod every 32 iterations
+		if(mCount == 2){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset in the result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Scale Dsub by alpha
+	Dsub = alpha * Dsub;
+	Dsub = fmod(Dsub, mod);
+	if(Dsub < 0){
+		Dsub = mod + Dsub;
+	}
+
+	//Scalse Csub by beta
+	float Csub = C[d + ty * widthB + tx];
+	Csub = beta * Csub;
+	Csub = fmod(Csub, mod);
+	if(Csub < 0){
+		Csub = mod + Csub;
+	}
+
+	//Add Dsub and Dsub
+	Dsub = Dsub + Csub;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-sp.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-sp.cl
new file mode 100644
index 0000000..4200543
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-32-sp.cl
@@ -0,0 +1,92 @@
+/*
+ * kernel_partial_32_sp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMuladdKernelModular32SP(__global float* D, float alpha, __global float* A, __global float* B,
+		float beta, __global float* C, const int widthA, const int widthB, const float mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Dsub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		mCount++;
+
+		//fmod every 32 iterations
+		if(mCount == 2){
+			Dsub = fmod(Dsub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+
+	Dsub = fmod(Dsub, mod);
+
+	//Calculates the offset in the result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Scale Dsub by alpha
+	Dsub = alpha * Dsub;
+	Dsub = fmod(Dsub, mod);
+	if(Dsub < 0){
+		Dsub = mod + Dsub;
+	}
+
+	//Scalse Csub by beta
+	float Csub = C[d + ty * widthB + tx];
+	Csub = beta * Csub;
+	Csub = fmod(Csub, mod);
+	if(Csub < 0){
+		Csub = mod + Csub;
+	}
+
+	//Add Dsub and Dsub
+	Dsub = Dsub + Csub;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-8-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-8-dp-unroll.cl
new file mode 100644
index 0000000..ec670bc
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-8-dp-unroll.cl
@@ -0,0 +1,96 @@
+/*
+ * kernel_partial_8_dp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMuladdKernelModular8DP(__global double* D, double alpha, __global double* A, __global double* B,
+		double beta, __global double* C, const int widthA, const int widthB, const double mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Dsub += As[ty][0] * Bs[0][tx];
+		Dsub += As[ty][1] * Bs[1][tx];
+		Dsub += As[ty][2] * Bs[2][tx];
+		Dsub += As[ty][3] * Bs[3][tx];
+		Dsub += As[ty][4] * Bs[4][tx];
+		Dsub += As[ty][5] * Bs[5][tx];
+		Dsub += As[ty][6] * Bs[6][tx];
+		Dsub += As[ty][7] * Bs[7][tx];
+		Dsub = fmod(Dsub, mod);
+
+		Dsub += As[ty][8] * Bs[8][tx];
+		Dsub += As[ty][9] * Bs[9][tx];
+		Dsub += As[ty][10] * Bs[10][tx];
+		Dsub += As[ty][11] * Bs[11][tx];
+		Dsub += As[ty][12] * Bs[12][tx];
+		Dsub += As[ty][13] * Bs[13][tx];
+		Dsub += As[ty][14] * Bs[14][tx];
+		Dsub += As[ty][15] * Bs[15][tx];
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset in the result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Scale Dsub by alpha
+	Dsub = alpha * Dsub;
+	Dsub = fmod(Dsub, mod);
+	if(Dsub < 0){
+		Dsub = mod + Dsub;
+	}
+
+	//Scalse Csub by beta
+	double Csub = C[d + ty * widthB + tx];
+	Csub = beta * Csub;
+	Csub = fmod(Csub, mod);
+	if(Csub < 0){
+		Csub = mod + Csub;
+	}
+
+	//Add Dsub and Dsub
+	Dsub = Dsub + Csub;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-muladd-partial-8-dp.cl b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-8-dp.cl
new file mode 100644
index 0000000..af3bbcc
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-muladd-partial-8-dp.cl
@@ -0,0 +1,86 @@
+/*
+ * kernel_partial_8_dp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMuladdKernelModular8DP(__global double* D, double alpha, __global double* A, __global double* B,
+		double beta, __global double* C, const int widthA, const int widthB, const double mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Dsub = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE / 2; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		Dsub = fmod(Dsub, mod);
+
+		for(int i = BLOCK_SIZE / 2; i < BLOCK_SIZE; i++){
+			Dsub += As[ty][i] * Bs[i][tx];
+		}
+		Dsub = fmod(Dsub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calculates the offset in the result matrix
+	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+
+	//Scale Dsub by alpha
+	Dsub = alpha * Dsub;
+	Dsub = fmod(Dsub, mod);
+	if(Dsub < 0){
+		Dsub = mod + Dsub;
+	}
+
+	//Scalse Csub by beta
+	double Csub = C[d + ty * widthB + tx];
+	Csub = beta * Csub;
+	Csub = fmod(Csub, mod);
+	if(Csub < 0){
+		Csub = mod + Csub;
+	}
+
+	//Add Dsub and Dsub
+	Dsub = Dsub + Csub;
+	Dsub = fmod(Dsub, mod);
+
+	//Add the sum to the appropriate spot
+	D[d + ty * widthB + tx] = Dsub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-parser.py b/linbox/algorithms/opencl-kernels/kernel-parser.py
new file mode 100644
index 0000000..ada29e8
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-parser.py
@@ -0,0 +1,177 @@
+"""
+/* linbox/algorithms/opencl-domain-setup.inl
+ * Copyright (C) 2011-2012 Matthew Wezowicz
+ *
+ * Written by Matthew Wezowicz <mwezz at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ * 
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This 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
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+"""
+
+import string
+import time
+
+def parse_kernel(file_name, output):
+    # Open the kernel file
+    fp = open(file_name)
+
+    # Begin parsing of the kernel file
+    parsed = []
+
+    # Search for the kernel name in the file
+    # Once found generate the const char* kernel name line
+    for line in fp.readlines():
+        line = string.split(line)
+        if(len(line) > 0 and line[0] == '__kernel'):
+            parsed.append("const char*")
+            temp = string.split(line[2],'(')
+            parsed.append(temp[0])
+            parsed.append("= {\n")
+            break
+    
+    # Join the line with spaces
+    parsed = string.join(parsed)
+
+    # Write the const char* kernel name line to the header file
+    output.write("\t")
+    output.write(parsed)
+
+    # Seek to beginning of the kernel file
+    fp.seek(0,0)
+
+    # Skip over the comment block at the beginning of the kernel file
+    # Write rest of file to the const char* block
+    for line in fp.readlines():
+        temp = string.split(line)
+        if(len(temp) > 0 and (temp[0] == '/*' or temp[0] == '*' or temp[0] == '*/' or temp[0][:2] == '//')):
+            continue
+        if(len(temp) == 0):
+            continue
+        output.write("\t\t\"")
+        output.write(string.rstrip(line))
+        output.write("\\n\"\n")
+
+    # End const char* block
+    output.write("\t};\n\n")
+
+    # Close kernel file
+    fp.close()
+
+    return
+
+def gen_timestamp():
+    # Get the time
+    timestruct = time.localtime()
+
+    # Begin generating the timestamp string
+    timestamp = ""
+    if(timestruct.tm_mon < 10):
+        timestamp = "0" + str(timestruct.tm_mon) + "/"
+    else:
+        timestamp = str(timestruct.tm_mon) + "/"
+
+    if(timestruct.tm_mday < 10):
+        timestamp += "0" + str(timestruct.tm_mday) + "/"
+    else:
+        timestamp += str(timestruct.tm_mday) + "/"
+
+    timestamp += str(timestruct.tm_year) + " "
+
+    if(timestruct.tm_hour < 10):
+        timestamp += "0" + str(timestruct.tm_hour) + ":"
+    else:
+        timestamp += str(timestruct.tm_hour) + ":"
+
+    if(timestruct.tm_min < 10):
+        timestamp += "0" + str(timestruct.tm_min) + ":"
+    else:
+        timestamp += str(timestruct.tm_min) + ":"
+
+    if(timestruct.tm_sec < 10):
+        timestamp += "0" + str(timestruct.tm_sec)
+    else:
+        timestamp += str(timestruct.tm_sec)
+
+    return timestamp
+
+def main():
+    # Open file containing list of all selected kernels
+    fp = open("file-list.txt","r")
+
+    # Create file to write the generated header into
+    output = open("opencl-domain-kernels.inl","w")
+
+    # Add standard comment block to
+    output.write("/* linbox/algorithms/opencl-domain.h\n"
+                 " * Copyright (C) 2012 Matthew Wezowicz\n"
+                 " *\n"
+                 " * Written by Matthew Wezowicz <mwezz at udel.edu>\n"
+                 " *\n"
+                 " * ========LICENCE========\n"
+                 " * This file is part of the library LinBox.\n"
+                 " *\n"
+                 " * LinBox is free software: you can redistribute it and/or modify\n"
+                 " * it under the terms of the  GNU Lesser General Public\n"
+                 " * License as published by the Free Software Foundation; either\n"
+                 " * version 2.1 of the License, or (at your option) any later version.\n"
+                 " *\n"
+                 " * This library is distributed in the hope that it will be useful,\n"
+                 " * but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+                 " * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n"
+                 " * Lesser General Public License for more details.\n"
+                 " *\n"
+                 " * You should have received a copy of the GNU Lesser General Public\n"
+                 " * License along with this library; if not, write to the Free Software\n"
+                 " * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n"
+                 " * ========LICENCE========\n"
+                 " *.\n"
+                 " */\n\n")
+
+    # Add timestamp for generation
+    output.write(" /*###---    Generated On     ---###*/\n")
+    output.write(" /*###--- " + gen_timestamp() + " ---###*/\n\n")
+    
+    # Add header file lines
+    output.write("#ifndef __LINBOX_opencl_matrix_domain_kernels_INL\n")
+    output.write("#define __LINBOX_opencl_matrix_domain_kernels_INL\n\n")
+    output.write("namespace LinBox{\n\n")
+
+    # For every file in the file list generate a const char* and add to the header
+    for file_name in fp.readlines():
+        parse_kernel(string.rstrip(file_name),output)
+
+    # Add end of header lines
+    output.write("} // end of namespace LinBox\n\n")
+    output.write("#endif // __LINBOX_opencl_matrix_domain_kernels_INL\n\n")
+    output.write("// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s\n"
+                 "// Local Variables:\n"
+                 "// mode: C++\n"
+                 "// tab-width: 8\n"
+                 "// indent-tabs-mode: nil\n"
+                 "// c-basic-offset: 8\n"
+                 "// End:\n")
+
+    # Close the files
+    fp.close()
+    output.close()
+
+    return
+
+main()
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-1024-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-partial-1024-dp-unroll.cl
new file mode 100644
index 0000000..9f073e9
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-1024-dp-unroll.cl
@@ -0,0 +1,87 @@
+/*
+ * kernel_partial_1024_dp.cl
+ *
+ *  Created on: Jul 13, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMulKernelModular1024DP(__global double* C, __global double* A, __global double* B,
+		const int widthA, const int widthB, const double mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Csub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Csub += As[ty][0] * Bs[0][tx];
+		Csub += As[ty][1] * Bs[1][tx];
+		Csub += As[ty][2] * Bs[2][tx];
+		Csub += As[ty][3] * Bs[3][tx];
+		Csub += As[ty][4] * Bs[4][tx];
+		Csub += As[ty][5] * Bs[5][tx];
+		Csub += As[ty][6] * Bs[6][tx];
+		Csub += As[ty][7] * Bs[7][tx];
+		Csub += As[ty][8] * Bs[8][tx];
+		Csub += As[ty][9] * Bs[9][tx];
+		Csub += As[ty][10] * Bs[10][tx];
+		Csub += As[ty][11] * Bs[11][tx];
+		Csub += As[ty][12] * Bs[12][tx];
+		Csub += As[ty][13] * Bs[13][tx];
+		Csub += As[ty][14] * Bs[14][tx];
+		Csub += As[ty][15] * Bs[15][tx];
+
+		mCount++;
+
+		//fmod every 1024 iterations
+		if(mCount == 64){
+			Csub = fmod(Csub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Csub = fmod(Csub, mod);
+
+	//Calculates the offset in the result matrix and add the sum to the
+	//appropriate spot
+	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+	C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-1024-dp.cl b/linbox/algorithms/opencl-kernels/kernel-partial-1024-dp.cl
new file mode 100644
index 0000000..d420477
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-1024-dp.cl
@@ -0,0 +1,73 @@
+/*
+ * kernel_partial_1024_dp.cl
+ *
+ *  Created on: Jul 13, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMulKernelModular1024DP(__global double* C, __global double* A, __global double* B,
+		const int widthA, const int widthB, const double mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Csub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Csub += As[ty][i] * Bs[i][tx];
+		}
+		mCount++;
+
+		//fmod every 1024 iterations
+		if(mCount == 64){
+			Csub = fmod(Csub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Csub = fmod(Csub, mod);
+
+	//Calculates the offset in the result matrix and add the sum to the
+	//appropriate spot
+	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+	C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-1024-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-partial-1024-sp-unroll.cl
new file mode 100644
index 0000000..98f1525
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-1024-sp-unroll.cl
@@ -0,0 +1,86 @@
+/*
+ * kernel_partial_1024_sp.cl
+ *
+ *  Created on: Jul 13, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMulKernelModular1024SP(__global float* C, __global float* A, __global float* B,
+		const int widthA, const int widthB, const float mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Csub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Csub += As[ty][0] * Bs[0][tx];
+		Csub += As[ty][1] * Bs[1][tx];
+		Csub += As[ty][2] * Bs[2][tx];
+		Csub += As[ty][3] * Bs[3][tx];
+		Csub += As[ty][4] * Bs[4][tx];
+		Csub += As[ty][5] * Bs[5][tx];
+		Csub += As[ty][6] * Bs[6][tx];
+		Csub += As[ty][7] * Bs[7][tx];
+		Csub += As[ty][8] * Bs[8][tx];
+		Csub += As[ty][9] * Bs[9][tx];
+		Csub += As[ty][10] * Bs[10][tx];
+		Csub += As[ty][11] * Bs[11][tx];
+		Csub += As[ty][12] * Bs[12][tx];
+		Csub += As[ty][13] * Bs[13][tx];
+		Csub += As[ty][14] * Bs[14][tx];
+		Csub += As[ty][15] * Bs[15][tx];
+
+		mCount++;
+
+		//fmod every 1024 iterations
+		if(mCount == 64){
+			Csub = fmod(Csub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Csub = fmod(Csub, mod);
+
+	//Calculates the offset in the result matrix and add the sum to the
+	//appropriate spot
+	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+	C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-1024-sp.cl b/linbox/algorithms/opencl-kernels/kernel-partial-1024-sp.cl
new file mode 100644
index 0000000..421a5bf
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-1024-sp.cl
@@ -0,0 +1,72 @@
+/*
+ * kernel_partial_1024_sp.cl
+ *
+ *  Created on: Jul 13, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMulKernelModular1024SP(__global float* C, __global float* A, __global float* B,
+		const int widthA, const int widthB, const float mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Csub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Csub += As[ty][i] * Bs[i][tx];
+		}
+		mCount++;
+
+		//fmod every 1024 iterations
+		if(mCount == 64){
+			Csub = fmod(Csub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Csub = fmod(Csub, mod);
+
+	//Calculates the offset in the result matrix and add the sum to the
+	//appropriate spot
+	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+	C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-16-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-partial-16-sp-unroll.cl
new file mode 100644
index 0000000..76f7872
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-16-sp-unroll.cl
@@ -0,0 +1,74 @@
+/*
+ * kernel_partial_16_sp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMulKernelModular16SP(__global float* C, __global float* A, __global float* B,
+		const int widthA, const int widthB, const float mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Csub = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Csub += As[ty][0] * Bs[0][tx];
+		Csub += As[ty][1] * Bs[1][tx];
+		Csub += As[ty][2] * Bs[2][tx];
+		Csub += As[ty][3] * Bs[3][tx];
+		Csub += As[ty][4] * Bs[4][tx];
+		Csub += As[ty][5] * Bs[5][tx];
+		Csub += As[ty][6] * Bs[6][tx];
+		Csub += As[ty][7] * Bs[7][tx];
+		Csub += As[ty][8] * Bs[8][tx];
+		Csub += As[ty][9] * Bs[9][tx];
+		Csub += As[ty][10] * Bs[10][tx];
+		Csub += As[ty][11] * Bs[11][tx];
+		Csub += As[ty][12] * Bs[12][tx];
+		Csub += As[ty][13] * Bs[13][tx];
+		Csub += As[ty][14] * Bs[14][tx];
+		Csub += As[ty][15] * Bs[15][tx];
+		Csub = fmod(Csub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+
+	//Calculates the offset in the result matrix and add the sum to the
+	//appropriate spot
+	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+	C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-16-sp.cl b/linbox/algorithms/opencl-kernels/kernel-partial-16-sp.cl
new file mode 100644
index 0000000..83ae102
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-16-sp.cl
@@ -0,0 +1,61 @@
+/*
+ * kernel_partial_16_sp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMulKernelModular16SP(__global float* C, __global float* A, __global float* B,
+		const int widthA, const int widthB, const float mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Csub = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Csub += As[ty][i] * Bs[i][tx];
+		}
+		Csub = fmod(Csub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+
+	//Calculates the offset in the result matrix and add the sum to the
+	//appropriate spot
+	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+	C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-32-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-partial-32-dp-unroll.cl
new file mode 100644
index 0000000..f968bbd
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-32-dp-unroll.cl
@@ -0,0 +1,87 @@
+/*
+ * kernel_partial_32_dp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMulKernelModular32DP(__global double* C, __global double* A, __global double* B,
+		const int widthA, const int widthB, const double mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Csub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Csub += As[ty][0] * Bs[0][tx];
+		Csub += As[ty][1] * Bs[1][tx];
+		Csub += As[ty][2] * Bs[2][tx];
+		Csub += As[ty][3] * Bs[3][tx];
+		Csub += As[ty][4] * Bs[4][tx];
+		Csub += As[ty][5] * Bs[5][tx];
+		Csub += As[ty][6] * Bs[6][tx];
+		Csub += As[ty][7] * Bs[7][tx];
+		Csub += As[ty][8] * Bs[8][tx];
+		Csub += As[ty][9] * Bs[9][tx];
+		Csub += As[ty][10] * Bs[10][tx];
+		Csub += As[ty][11] * Bs[11][tx];
+		Csub += As[ty][12] * Bs[12][tx];
+		Csub += As[ty][13] * Bs[13][tx];
+		Csub += As[ty][14] * Bs[14][tx];
+		Csub += As[ty][15] * Bs[15][tx];
+
+		mCount++;
+
+		//fmod every 32 iterations
+		if(mCount == 2){
+			Csub = fmod(Csub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Csub = fmod(Csub, mod);
+
+	//Calculates the offset in the result matrix and add the sum to the
+	//appropriate spot
+	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+	C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-32-dp.cl b/linbox/algorithms/opencl-kernels/kernel-partial-32-dp.cl
new file mode 100644
index 0000000..edbfc0d
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-32-dp.cl
@@ -0,0 +1,73 @@
+/*
+ * kernel_partial_32_dp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMulKernelModular32DP(__global double* C, __global double* A, __global double* B,
+		const int widthA, const int widthB, const double mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Csub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Csub += As[ty][i] * Bs[i][tx];
+		}
+		mCount++;
+
+		//fmod every 32 iterations
+		if(mCount == 2){
+			Csub = fmod(Csub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Csub = fmod(Csub, mod);
+
+	//Calculates the offset in the result matrix and add the sum to the
+	//appropriate spot
+	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+	C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-32-sp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-partial-32-sp-unroll.cl
new file mode 100644
index 0000000..c598c0e
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-32-sp-unroll.cl
@@ -0,0 +1,86 @@
+/*
+ * kernel_partial_32_sp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMulKernelModular32SP(__global float* C, __global float* A, __global float* B,
+		const int widthA, const int widthB, const float mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Csub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Csub += As[ty][0] * Bs[0][tx];
+		Csub += As[ty][1] * Bs[1][tx];
+		Csub += As[ty][2] * Bs[2][tx];
+		Csub += As[ty][3] * Bs[3][tx];
+		Csub += As[ty][4] * Bs[4][tx];
+		Csub += As[ty][5] * Bs[5][tx];
+		Csub += As[ty][6] * Bs[6][tx];
+		Csub += As[ty][7] * Bs[7][tx];
+		Csub += As[ty][8] * Bs[8][tx];
+		Csub += As[ty][9] * Bs[9][tx];
+		Csub += As[ty][10] * Bs[10][tx];
+		Csub += As[ty][11] * Bs[11][tx];
+		Csub += As[ty][12] * Bs[12][tx];
+		Csub += As[ty][13] * Bs[13][tx];
+		Csub += As[ty][14] * Bs[14][tx];
+		Csub += As[ty][15] * Bs[15][tx];
+
+		mCount++;
+
+		//fmod every 32 iterations
+		if(mCount == 2){
+			Csub = fmod(Csub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Csub = fmod(Csub, mod);
+
+	//Calculates the offset in the result matrix and add the sum to the
+	//appropriate spot
+	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+	C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-32-sp.cl b/linbox/algorithms/opencl-kernels/kernel-partial-32-sp.cl
new file mode 100644
index 0000000..111cfaf
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-32-sp.cl
@@ -0,0 +1,72 @@
+/*
+ * kernel_partial_32_sp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+
+__kernel void matrixMulKernelModular32SP(__global float* C, __global float* A, __global float* B,
+		const int widthA, const int widthB, const float mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local float As[BLOCK_SIZE][BLOCK_SIZE];
+	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	float Csub = 0;
+
+	//Counter for modulus every 32 iterations
+	int mCount = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE; i++){
+			Csub += As[ty][i] * Bs[i][tx];
+		}
+		mCount++;
+
+		//fmod every 32 iterations
+		if(mCount == 2){
+			Csub = fmod(Csub, mod);
+			mCount = 0;
+		}
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+	//Calls fmod once to normalize the sum
+	Csub = fmod(Csub, mod);
+
+	//Calculates the offset in the result matrix and add the sum to the
+	//appropriate spot
+	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+	C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-8-dp-unroll.cl b/linbox/algorithms/opencl-kernels/kernel-partial-8-dp-unroll.cl
new file mode 100644
index 0000000..4cd3eb7
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-8-dp-unroll.cl
@@ -0,0 +1,77 @@
+/*
+ * kernel_partial_8_dp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMulKernelModular8DP(__global double* C, __global double* A, __global double* B,
+		const int widthA, const int widthB, const double mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Csub = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		Csub += As[ty][0] * Bs[0][tx];
+		Csub += As[ty][1] * Bs[1][tx];
+		Csub += As[ty][2] * Bs[2][tx];
+		Csub += As[ty][3] * Bs[3][tx];
+		Csub += As[ty][4] * Bs[4][tx];
+		Csub += As[ty][5] * Bs[5][tx];
+		Csub += As[ty][6] * Bs[6][tx];
+		Csub += As[ty][7] * Bs[7][tx];
+		Csub = fmod(Csub, mod);
+
+		Csub += As[ty][8] * Bs[8][tx];
+		Csub += As[ty][9] * Bs[9][tx];
+		Csub += As[ty][10] * Bs[10][tx];
+		Csub += As[ty][11] * Bs[11][tx];
+		Csub += As[ty][12] * Bs[12][tx];
+		Csub += As[ty][13] * Bs[13][tx];
+		Csub += As[ty][14] * Bs[14][tx];
+		Csub += As[ty][15] * Bs[15][tx];
+		Csub = fmod(Csub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+
+	//Calculates the offset in the result matrix and add the sum to the
+	//appropriate spot
+	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+	C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/kernel-partial-8-dp.cl b/linbox/algorithms/opencl-kernels/kernel-partial-8-dp.cl
new file mode 100644
index 0000000..d0ad449
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/kernel-partial-8-dp.cl
@@ -0,0 +1,67 @@
+/*
+ * kernel_partial_8_dp.cl
+ *
+ *  Created on: Jul 5, 2011
+ *      Author: Matthew Wezowicz
+ */
+
+#define BLOCK_SIZE 16
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+__kernel void matrixMulKernelModular8DP(__global double* C, __global double* A, __global double* B,
+		const int widthA, const int widthB, const double mod){
+	//Get Workgroup ID
+	int bx = get_group_id(0);
+	int by = get_group_id(1);
+
+	//Get Local ID
+	int tx = get_local_id(0);
+	int ty = get_local_id(1);
+
+	//Range of indecies for sub-matrix of A
+	int aBegin = widthA * BLOCK_SIZE * by;
+	int aEnd = aBegin + widthA - 1;
+	int aStep = BLOCK_SIZE;
+
+	//Range of indecies for sub-matrix of B
+	int bBegin = BLOCK_SIZE * bx;
+	int bStep = BLOCK_SIZE * widthB;
+
+	//Local storage of sub-matrices of A and B
+	__local double As[BLOCK_SIZE][BLOCK_SIZE];
+	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];
+
+	//Temporary storage for result
+	double Csub = 0;
+
+	//Loop over all the sub-matrices of A and B required to compute
+	//the result sub-matrix
+	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){
+		//Load the matrices from global memory to local memory
+		//Each thread loads one element of each sub-matrix
+		As[ty][tx] = A[a + widthA * ty + tx];
+		Bs[ty][tx] = B[b + widthB * ty + tx];
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+
+		//Multiply the two sub-matrices together
+		for(int i = 0; i < BLOCK_SIZE / 2; i++){
+			Csub += As[ty][i] * Bs[i][tx];
+		}
+		Csub = fmod(Csub, mod);
+
+		for(int i = BLOCK_SIZE / 2; i < BLOCK_SIZE; i++){
+			Csub += As[ty][i] * Bs[i][tx];
+		}
+		Csub = fmod(Csub, mod);
+
+		//Synchronize threads
+		barrier(CLK_LOCAL_MEM_FENCE);
+	}
+
+	//Calculates the offset in the result matrix and add the sum to the
+	//appropriate spot
+	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;
+	C[c + ty * widthB + tx] = Csub;
+}
diff --git a/linbox/algorithms/opencl-kernels/opencl-domain-kernels.inl b/linbox/algorithms/opencl-kernels/opencl-domain-kernels.inl
new file mode 100644
index 0000000..cdae0c3
--- /dev/null
+++ b/linbox/algorithms/opencl-kernels/opencl-domain-kernels.inl
@@ -0,0 +1,2276 @@
+/* linbox/algorithms/opencl-domain.h
+ * Copyright (C) 2012 Matthew Wezowicz
+ *
+ * Written by Matthew Wezowicz <mwezz at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+ /*###---    Generated On     ---###*/
+ /*###--- 07/24/2012 11:29:38 ---###*/
+
+#ifndef __LINBOX_opencl_matrix_domain_kernels_INL
+#define __LINBOX_opencl_matrix_domain_kernels_INL
+
+namespace LinBox{
+
+	const char* matrixMulKernelModular1DP = {
+		"#define BLOCK_SIZE 16\n"
+		"#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+		"__kernel void matrixMulKernelModular1DP(__global double* C, __global double* A, __global double* B,\n"
+		"		const int widthA, const int widthB, const double mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin = widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	double Csub = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Csub += As[ty][0] * Bs[0][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][1] * Bs[1][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][2] * Bs[2][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][3] * Bs[3][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][4] * Bs[4][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][5] * Bs[5][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][6] * Bs[6][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][7] * Bs[7][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][8] * Bs[8][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][9] * Bs[9][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][10] * Bs[10][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][11] * Bs[11][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][12] * Bs[12][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][13] * Bs[13][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][14] * Bs[14][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][15] * Bs[15][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	C[c + ty * widthB + tx] = Csub;\n"
+		"}\n"
+	};
+
+	const char* matrixMulKernelModular1SP = {
+		"#define BLOCK_SIZE 16\n"
+		"__kernel void matrixMulKernelModular1SP(__global float* C, __global float* A, __global float* B,\n"
+		"		const int widthA, const int widthB, const float mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin = widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	float Csub = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Csub += As[ty][0] * Bs[0][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][1] * Bs[1][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][2] * Bs[2][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][3] * Bs[3][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][4] * Bs[4][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][5] * Bs[5][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][6] * Bs[6][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][7] * Bs[7][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][8] * Bs[8][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][9] * Bs[9][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][10] * Bs[10][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][11] * Bs[11][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][12] * Bs[12][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][13] * Bs[13][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][14] * Bs[14][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][15] * Bs[15][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	C[c + ty * widthB + tx] = Csub;\n"
+		"}\n"
+	};
+
+	const char* matrixMulKernelModular8DP = {
+		"#define BLOCK_SIZE 16\n"
+		"#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+		"__kernel void matrixMulKernelModular8DP(__global double* C, __global double* A, __global double* B,\n"
+		"		const int widthA, const int widthB, const double mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin = widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	double Csub = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Csub += As[ty][0] * Bs[0][tx];\n"
+		"		Csub += As[ty][1] * Bs[1][tx];\n"
+		"		Csub += As[ty][2] * Bs[2][tx];\n"
+		"		Csub += As[ty][3] * Bs[3][tx];\n"
+		"		Csub += As[ty][4] * Bs[4][tx];\n"
+		"		Csub += As[ty][5] * Bs[5][tx];\n"
+		"		Csub += As[ty][6] * Bs[6][tx];\n"
+		"		Csub += As[ty][7] * Bs[7][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		Csub += As[ty][8] * Bs[8][tx];\n"
+		"		Csub += As[ty][9] * Bs[9][tx];\n"
+		"		Csub += As[ty][10] * Bs[10][tx];\n"
+		"		Csub += As[ty][11] * Bs[11][tx];\n"
+		"		Csub += As[ty][12] * Bs[12][tx];\n"
+		"		Csub += As[ty][13] * Bs[13][tx];\n"
+		"		Csub += As[ty][14] * Bs[14][tx];\n"
+		"		Csub += As[ty][15] * Bs[15][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	C[c + ty * widthB + tx] = Csub;\n"
+		"}\n"
+	};
+
+	const char* matrixMulKernelModular16SP = {
+		"#define BLOCK_SIZE 16\n"
+		"__kernel void matrixMulKernelModular16SP(__global float* C, __global float* A, __global float* B,\n"
+		"		const int widthA, const int widthB, const float mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin = widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	float Csub = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Csub += As[ty][0] * Bs[0][tx];\n"
+		"		Csub += As[ty][1] * Bs[1][tx];\n"
+		"		Csub += As[ty][2] * Bs[2][tx];\n"
+		"		Csub += As[ty][3] * Bs[3][tx];\n"
+		"		Csub += As[ty][4] * Bs[4][tx];\n"
+		"		Csub += As[ty][5] * Bs[5][tx];\n"
+		"		Csub += As[ty][6] * Bs[6][tx];\n"
+		"		Csub += As[ty][7] * Bs[7][tx];\n"
+		"		Csub += As[ty][8] * Bs[8][tx];\n"
+		"		Csub += As[ty][9] * Bs[9][tx];\n"
+		"		Csub += As[ty][10] * Bs[10][tx];\n"
+		"		Csub += As[ty][11] * Bs[11][tx];\n"
+		"		Csub += As[ty][12] * Bs[12][tx];\n"
+		"		Csub += As[ty][13] * Bs[13][tx];\n"
+		"		Csub += As[ty][14] * Bs[14][tx];\n"
+		"		Csub += As[ty][15] * Bs[15][tx];\n"
+		"		Csub = fmod(Csub, mod);\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	C[c + ty * widthB + tx] = Csub;\n"
+		"}\n"
+	};
+
+	const char* matrixMulKernelModular32DP = {
+		"#define BLOCK_SIZE 16\n"
+		"#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+		"__kernel void matrixMulKernelModular32DP(__global double* C, __global double* A, __global double* B,\n"
+		"		const int widthA, const int widthB, const double mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin = widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	double Csub = 0;\n"
+		"	int mCount = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Csub += As[ty][0] * Bs[0][tx];\n"
+		"		Csub += As[ty][1] * Bs[1][tx];\n"
+		"		Csub += As[ty][2] * Bs[2][tx];\n"
+		"		Csub += As[ty][3] * Bs[3][tx];\n"
+		"		Csub += As[ty][4] * Bs[4][tx];\n"
+		"		Csub += As[ty][5] * Bs[5][tx];\n"
+		"		Csub += As[ty][6] * Bs[6][tx];\n"
+		"		Csub += As[ty][7] * Bs[7][tx];\n"
+		"		Csub += As[ty][8] * Bs[8][tx];\n"
+		"		Csub += As[ty][9] * Bs[9][tx];\n"
+		"		Csub += As[ty][10] * Bs[10][tx];\n"
+		"		Csub += As[ty][11] * Bs[11][tx];\n"
+		"		Csub += As[ty][12] * Bs[12][tx];\n"
+		"		Csub += As[ty][13] * Bs[13][tx];\n"
+		"		Csub += As[ty][14] * Bs[14][tx];\n"
+		"		Csub += As[ty][15] * Bs[15][tx];\n"
+		"		mCount++;\n"
+		"		if(mCount == 2){\n"
+		"			Csub = fmod(Csub, mod);\n"
+		"			mCount = 0;\n"
+		"		}\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	Csub = fmod(Csub, mod);\n"
+		"	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	C[c + ty * widthB + tx] = Csub;\n"
+		"}\n"
+	};
+
+	const char* matrixMulKernelModular32SP = {
+		"#define BLOCK_SIZE 16\n"
+		"__kernel void matrixMulKernelModular32SP(__global float* C, __global float* A, __global float* B,\n"
+		"		const int widthA, const int widthB, const float mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin = widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	float Csub = 0;\n"
+		"	int mCount = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Csub += As[ty][0] * Bs[0][tx];\n"
+		"		Csub += As[ty][1] * Bs[1][tx];\n"
+		"		Csub += As[ty][2] * Bs[2][tx];\n"
+		"		Csub += As[ty][3] * Bs[3][tx];\n"
+		"		Csub += As[ty][4] * Bs[4][tx];\n"
+		"		Csub += As[ty][5] * Bs[5][tx];\n"
+		"		Csub += As[ty][6] * Bs[6][tx];\n"
+		"		Csub += As[ty][7] * Bs[7][tx];\n"
+		"		Csub += As[ty][8] * Bs[8][tx];\n"
+		"		Csub += As[ty][9] * Bs[9][tx];\n"
+		"		Csub += As[ty][10] * Bs[10][tx];\n"
+		"		Csub += As[ty][11] * Bs[11][tx];\n"
+		"		Csub += As[ty][12] * Bs[12][tx];\n"
+		"		Csub += As[ty][13] * Bs[13][tx];\n"
+		"		Csub += As[ty][14] * Bs[14][tx];\n"
+		"		Csub += As[ty][15] * Bs[15][tx];\n"
+		"		mCount++;\n"
+		"		if(mCount == 2){\n"
+		"			Csub = fmod(Csub, mod);\n"
+		"			mCount = 0;\n"
+		"		}\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	Csub = fmod(Csub, mod);\n"
+		"	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	C[c + ty * widthB + tx] = Csub;\n"
+		"}\n"
+	};
+
+	const char* matrixMulKernelModular1024DP = {
+		"#define BLOCK_SIZE 16\n"
+		"#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+		"__kernel void matrixMulKernelModular1024DP(__global double* C, __global double* A, __global double* B,\n"
+		"		const int widthA, const int widthB, const double mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin = widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	double Csub = 0;\n"
+		"	int mCount = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Csub += As[ty][0] * Bs[0][tx];\n"
+		"		Csub += As[ty][1] * Bs[1][tx];\n"
+		"		Csub += As[ty][2] * Bs[2][tx];\n"
+		"		Csub += As[ty][3] * Bs[3][tx];\n"
+		"		Csub += As[ty][4] * Bs[4][tx];\n"
+		"		Csub += As[ty][5] * Bs[5][tx];\n"
+		"		Csub += As[ty][6] * Bs[6][tx];\n"
+		"		Csub += As[ty][7] * Bs[7][tx];\n"
+		"		Csub += As[ty][8] * Bs[8][tx];\n"
+		"		Csub += As[ty][9] * Bs[9][tx];\n"
+		"		Csub += As[ty][10] * Bs[10][tx];\n"
+		"		Csub += As[ty][11] * Bs[11][tx];\n"
+		"		Csub += As[ty][12] * Bs[12][tx];\n"
+		"		Csub += As[ty][13] * Bs[13][tx];\n"
+		"		Csub += As[ty][14] * Bs[14][tx];\n"
+		"		Csub += As[ty][15] * Bs[15][tx];\n"
+		"		mCount++;\n"
+		"		if(mCount == 64){\n"
+		"			Csub = fmod(Csub, mod);\n"
+		"			mCount = 0;\n"
+		"		}\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	Csub = fmod(Csub, mod);\n"
+		"	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	C[c + ty * widthB + tx] = Csub;\n"
+		"}\n"
+	};
+
+	const char* matrixMulKernelModular1024SP = {
+		"#define BLOCK_SIZE 16\n"
+		"__kernel void matrixMulKernelModular1024SP(__global float* C, __global float* A, __global float* B,\n"
+		"		const int widthA, const int widthB, const float mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin = widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	float Csub = 0;\n"
+		"	int mCount = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Csub += As[ty][0] * Bs[0][tx];\n"
+		"		Csub += As[ty][1] * Bs[1][tx];\n"
+		"		Csub += As[ty][2] * Bs[2][tx];\n"
+		"		Csub += As[ty][3] * Bs[3][tx];\n"
+		"		Csub += As[ty][4] * Bs[4][tx];\n"
+		"		Csub += As[ty][5] * Bs[5][tx];\n"
+		"		Csub += As[ty][6] * Bs[6][tx];\n"
+		"		Csub += As[ty][7] * Bs[7][tx];\n"
+		"		Csub += As[ty][8] * Bs[8][tx];\n"
+		"		Csub += As[ty][9] * Bs[9][tx];\n"
+		"		Csub += As[ty][10] * Bs[10][tx];\n"
+		"		Csub += As[ty][11] * Bs[11][tx];\n"
+		"		Csub += As[ty][12] * Bs[12][tx];\n"
+		"		Csub += As[ty][13] * Bs[13][tx];\n"
+		"		Csub += As[ty][14] * Bs[14][tx];\n"
+		"		Csub += As[ty][15] * Bs[15][tx];\n"
+		"		mCount++;\n"
+		"		if(mCount == 64){\n"
+		"			Csub = fmod(Csub, mod);\n"
+		"			mCount = 0;\n"
+		"		}\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	Csub = fmod(Csub, mod);\n"
+		"	int c = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	C[c + ty * widthB + tx] = Csub;\n"
+		"}\n"
+	};
+
+	const char* matrixMuladdKernelModular1DP = {
+		"#define BLOCK_SIZE 16\n"
+		"#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+		"__kernel void matrixMuladdKernelModular1DP(__global double* D, double alpha, __global double* A, __global double* B,\n"
+		"		double beta, __global double* C, const int widthA, const int widthB, const double mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin = widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	double Dsub = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	Dsub = alpha * Dsub;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	if(Dsub < 0){\n"
+		"		Dsub = mod + Dsub;\n"
+		"	}\n"
+		"	double Csub = C[d + ty * widthB + tx];\n"
+		"	Csub = beta * Csub;\n"
+		"	Csub = fmod(Csub, mod);\n"
+		"	if(Csub < 0){\n"
+		"		Csub = mod + Csub;\n"
+		"	}\n"
+		"	Dsub = Dsub + Csub;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixMuladdKernelModular1SP = {
+		"#define BLOCK_SIZE 16\n"
+		"__kernel void matrixMuladdKernelModular1SP(__global float* D, float alpha, __global float* A, __global float* B,\n"
+		"		float beta, __global float* C, const int widthA, const int widthB, const float mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin = widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	float Dsub = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	Dsub = alpha * Dsub;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	if(Dsub < 0){\n"
+		"		Dsub = mod + Dsub;\n"
+		"	}\n"
+		"	float Csub = C[d + ty * widthB + tx];\n"
+		"	Csub = beta * Csub;\n"
+		"	Csub = fmod(Csub, mod);\n"
+		"	if(Csub < 0){\n"
+		"		Csub = mod + Csub;\n"
+		"	}\n"
+		"	Dsub = Dsub + Csub;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixMuladdKernelModular8DP = {
+		"#define BLOCK_SIZE 16\n"
+		"#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+		"__kernel void matrixMuladdKernelModular8DP(__global double* D, double alpha, __global double* A, __global double* B,\n"
+		"		double beta, __global double* C, const int widthA, const int widthB, const double mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin = widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	double Dsub = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	Dsub = alpha * Dsub;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	if(Dsub < 0){\n"
+		"		Dsub = mod + Dsub;\n"
+		"	}\n"
+		"	double Csub = C[d + ty * widthB + tx];\n"
+		"	Csub = beta * Csub;\n"
+		"	Csub = fmod(Csub, mod);\n"
+		"	if(Csub < 0){\n"
+		"		Csub = mod + Csub;\n"
+		"	}\n"
+		"	Dsub = Dsub + Csub;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixMuladdKernelModular16SP = {
+		"#define BLOCK_SIZE 16\n"
+		"__kernel void matrixMuladdKernelModular16SP(__global float* D, float alpha, __global float* A, __global float* B,\n"
+		"		float beta, __global float* C, const int widthA, const int widthB, const float mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin = widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	float Dsub = 0;\n"
+		"	int m = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	Dsub = alpha * Dsub;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	if(Dsub < 0){\n"
+		"		Dsub = mod + Dsub;\n"
+		"	}\n"
+		"	float Csub = C[d + ty * widthB + tx];\n"
+		"	Csub = beta * Csub;\n"
+		"	Csub = fmod(Csub, mod);\n"
+		"	if(Csub < 0){\n"
+		"		Csub = mod + Csub;\n"
+		"	}\n"
+		"	Dsub = Dsub + Csub;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixMuladdKernelModular32DP = {
+		"#define BLOCK_SIZE 16\n"
+		"#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+		"__kernel void matrixMuladdKernelModular32DP(__global double* D, double alpha, __global double* A, __global double* B,\n"
+		"		double beta, __global double* C, const int widthA, const int widthB, const double mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin = widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	double Dsub = 0;\n"
+		"	int mCount = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		mCount++;\n"
+		"		if(mCount == 2){\n"
+		"			Dsub = fmod(Dsub, mod);\n"
+		"			mCount = 0;\n"
+		"		}\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	Dsub = alpha * Dsub;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	if(Dsub < 0){\n"
+		"		Dsub = mod + Dsub;\n"
+		"	}\n"
+		"	double Csub = C[d + ty * widthB + tx];\n"
+		"	Csub = beta * Csub;\n"
+		"	Csub = fmod(Csub, mod);\n"
+		"	if(Csub < 0){\n"
+		"		Csub = mod + Csub;\n"
+		"	}\n"
+		"	Dsub = Dsub + Csub;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixMuladdKernelModular32SP = {
+		"#define BLOCK_SIZE 16\n"
+		"__kernel void matrixMuladdKernelModular32SP(__global float* D, float alpha, __global float* A, __global float* B,\n"
+		"		float beta, __global float* C, const int widthA, const int widthB, const float mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin = widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	float Dsub = 0;\n"
+		"	int mCount = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		mCount++;\n"
+		"		if(mCount == 2){\n"
+		"			Dsub = fmod(Dsub, mod);\n"
+		"			mCount = 0;\n"
+		"		}\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	Dsub = alpha * Dsub;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	if(Dsub < 0){\n"
+		"		Dsub = mod + Dsub;\n"
+		"	}\n"
+		"	float Csub = C[d + ty * widthB + tx];\n"
+		"	Csub = beta * Csub;\n"
+		"	Csub = fmod(Csub, mod);\n"
+		"	if(Csub < 0){\n"
+		"		Csub = mod + Csub;\n"
+		"	}\n"
+		"	Dsub = Dsub + Csub;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixMuladdKernelModular1024DP = {
+		"#define BLOCK_SIZE 16\n"
+		"#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+		"__kernel void matrixMuladdKernelModular1024DP(__global double* D, double alpha, __global double* A, __global double* B,\n"
+		"		double beta, __global double* C, const int widthA, const int widthB, const double mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin = widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	double Dsub = 0;\n"
+		"	int mCount = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		mCount++;\n"
+		"		if(mCount == 64){\n"
+		"			Dsub = fmod(Dsub, mod);\n"
+		"			mCount = 0;\n"
+		"		}\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	Dsub = alpha * Dsub;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	if(Dsub < 0){\n"
+		"		Dsub = mod + Dsub;\n"
+		"	}\n"
+		"	double Csub = C[d + ty * widthB + tx];\n"
+		"	Csub = beta * Csub;\n"
+		"	Csub = fmod(Csub, mod);\n"
+		"	if(Csub < 0){\n"
+		"		Csub = mod + Csub;\n"
+		"	}\n"
+		"	Dsub = Dsub + Csub;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixMuladdKernelModular1024SP = {
+		"#define BLOCK_SIZE 16\n"
+		"__kernel void matrixMuladdKernelModular1024SP(__global float* D, float alpha, __global float* A, __global float* B,\n"
+		"		float beta, __global float* C, const int widthA, const int widthB, const float mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin = widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	float Dsub = 0;\n"
+		"	int mCount = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		mCount++;\n"
+		"		if(mCount == 64){\n"
+		"			Dsub = fmod(Dsub, mod);\n"
+		"			mCount = 0;\n"
+		"		}\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	Dsub = alpha * Dsub;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	if(Dsub < 0){\n"
+		"		Dsub = mod + Dsub;\n"
+		"	}\n"
+		"	float Csub = C[d + ty * widthB + tx];\n"
+		"	Csub = beta * Csub;\n"
+		"	Csub = fmod(Csub, mod);\n"
+		"	if(Csub < 0){\n"
+		"		Csub = mod + Csub;\n"
+		"	}\n"
+		"	Dsub = Dsub + Csub;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixAxpyKernelModular1DP = {
+		"#define BLOCK_SIZE 16\n"
+		"#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+		"__kernel void matrixAxpyKernelModular1DP(__global double* D, __global double* A, __global double* B,\n"
+		"		__global double* C, const int widthA, const int widthB, const double mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	double Dsub = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	double c = C[d + ty * widthB + tx];\n"
+		"	Dsub = Dsub + c;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixAxpyKernelModular1SP = {
+		"#define BLOCK_SIZE 16\n"
+		"__kernel void matrixAxpyKernelModular1SP(__global float* D, __global float* A, __global float* B,\n"
+		"		__global float* C, const int widthA, const int widthB, const float mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	float Dsub = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	float c = C[d + ty * widthB + tx];\n"
+		"	Dsub = Dsub + c;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixAxpyKernelModular8DP = {
+		"#define BLOCK_SIZE 16\n"
+		"#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+		"__kernel void matrixAxpyKernelModular8DP(__global double* D, __global double* A, __global double* B,\n"
+		"		__global double* C, const int widthA, const int widthB, const double mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	double Dsub = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	double c = C[d + ty * widthB + tx];\n"
+		"	Dsub = Dsub + c;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixAxpyKernelModular16SP = {
+		"#define BLOCK_SIZE 16\n"
+		"__kernel void matrixAxpyKernelModular16SP(__global float* D, __global float* A, __global float* B,\n"
+		"		__global float* C, const int widthA, const int widthB, const float mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	float Dsub = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	float c = C[d + ty * widthB + tx];\n"
+		"	Dsub = Dsub + c;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixAxpyKernelModular32DP = {
+		"#define BLOCK_SIZE 16\n"
+		"#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+		"__kernel void matrixAxpyKernelModular32DP(__global double* D, __global double* A, __global double* B,\n"
+		"		__global double* C, const int widthA, const int widthB, const double mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	double Dsub = 0;\n"
+		"	int mCount = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		mCount++;\n"
+		"		if(mCount == 2){\n"
+		"			Dsub = fmod(Dsub, mod);\n"
+		"			mCount = 0;\n"
+		"		}\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	double c = C[d + ty * widthB + tx];\n"
+		"	Dsub = Dsub + c;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixAxpyKernelModular32SP = {
+		"#define BLOCK_SIZE 16\n"
+		"__kernel void matrixAxpyKernelModular32SP(__global float* D, __global float* A, __global float* B,\n"
+		"		__global float* C, const int widthA, const int widthB, const float mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	float Dsub = 0;\n"
+		"	int mCount = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		mCount++;\n"
+		"		if(mCount == 2){\n"
+		"			Dsub = fmod(Dsub, mod);\n"
+		"			mCount = 0;\n"
+		"		}\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	float c = C[d + ty * widthB + tx];\n"
+		"	Dsub = Dsub + c;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixAxpyKernelModular1024DP = {
+		"#define BLOCK_SIZE 16\n"
+		"#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+		"__kernel void matrixAxpyKernelModular1024DP(__global double* D, __global double* A, __global double* B,\n"
+		"		__global double* C, const int widthA, const int widthB, const double mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	double Dsub = 0;\n"
+		"	int mCount = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		mCount++;\n"
+		"		if(mCount == 64){\n"
+		"			Dsub = fmod(Dsub, mod);\n"
+		"			mCount = 0;\n"
+		"		}\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	double c = C[d + ty * widthB + tx];\n"
+		"	Dsub = Dsub + c;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixAxpyKernelModular1024SP = {
+		"#define BLOCK_SIZE 16\n"
+		"__kernel void matrixAxpyKernelModular1024SP(__global float* D, __global float* A, __global float* B,\n"
+		"		__global float* C, const int widthA, const int widthB, const float mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	float Dsub = 0;\n"
+		"	int mCount = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		mCount++;\n"
+		"		if(mCount == 64){\n"
+		"			Dsub = fmod(Dsub, mod);\n"
+		"			mCount = 0;\n"
+		"		}\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	float c = C[d + ty * widthB + tx];\n"
+		"	Dsub = Dsub + c;\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixMaxpyKernelModular1DP = {
+		"#define BLOCK_SIZE 16\n"
+		"#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+		"__kernel void matrixMaxpyKernelModular1DP(__global double* D, __global double* A, __global double* B,\n"
+		"		__global double* C, const int widthA, const int widthB, const double mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	double Dsub = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	double c = C[d + ty * widthB + tx];\n"
+		"	Dsub = c - Dsub;\n"
+		"	Dsub = fmod((mod + Dsub), mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixMaxpyKernelModular1SP = {
+		"#define BLOCK_SIZE 16\n"
+		"__kernel void matrixMaxpyKernelModular1SP(__global float* D, __global float* A, __global float* B,\n"
+		"		__global float* C, const int widthA, const int widthB, const float mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	float Dsub = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	float c = C[d + ty * widthB + tx];\n"
+		"	Dsub = c - Dsub;\n"
+		"	Dsub = fmod((mod + Dsub), mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixMaxpyKernelModular8DP = {
+		"#define BLOCK_SIZE 16\n"
+		"#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+		"__kernel void matrixMaxpyKernelModular8DP(__global double* D, __global double* A, __global double* B,\n"
+		"		__global double* C, const int widthA, const int widthB, const double mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	double Dsub = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	double c = C[d + ty * widthB + tx];\n"
+		"	Dsub = c - Dsub;\n"
+		"	Dsub = fmod((mod + Dsub), mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixMaxpyKernelModular16SP = {
+		"#define BLOCK_SIZE 16\n"
+		"__kernel void matrixMaxpyKernelModular16SP(__global float* D, __global float* A, __global float* B,\n"
+		"		__global float* C, const int widthA, const int widthB, const float mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	float Dsub = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	float c = C[d + ty * widthB + tx];\n"
+		"	Dsub = c - Dsub;\n"
+		"	Dsub = fmod((mod + Dsub), mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixMaxpyKernelModular32DP = {
+		"#define BLOCK_SIZE 16\n"
+		"#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+		"__kernel void matrixMaxpyKernelModular32DP(__global double* D, __global double* A, __global double* B,\n"
+		"		__global double* C, const int widthA, const int widthB, const double mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	double Dsub = 0;\n"
+		"	int mCount = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		mCount++;\n"
+		"		if(mCount == 2){\n"
+		"			Dsub = fmod(Dsub, mod);\n"
+		"			mCount = 0;\n"
+		"		}\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	double c = C[d + ty * widthB + tx];\n"
+		"	Dsub = c - Dsub;\n"
+		"	Dsub = fmod((mod + Dsub), mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixMaxpyKernelModular32SP = {
+		"#define BLOCK_SIZE 16\n"
+		"__kernel void matrixMaxpyKernelModular32SP(__global float* D, __global float* A, __global float* B,\n"
+		"		__global float* C, const int widthA, const int widthB, const float mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	float Dsub = 0;\n"
+		"	int mCount = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		mCount++;\n"
+		"		if(mCount == 2){\n"
+		"			Dsub = fmod(Dsub, mod);\n"
+		"			mCount = 0;\n"
+		"		}\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	float c = C[d + ty * widthB + tx];\n"
+		"	Dsub = c - Dsub;\n"
+		"	Dsub = fmod((mod + Dsub), mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixMaxpyKernelModular1024DP = {
+		"#define BLOCK_SIZE 16\n"
+		"#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+		"__kernel void matrixMaxpyKernelModular1024DP(__global double* D, __global double* A, __global double* B,\n"
+		"		__global double* C, const int widthA, const int widthB, const double mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	double Dsub = 0;\n"
+		"	int mCount = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		mCount++;\n"
+		"		if(mCount == 64){\n"
+		"			Dsub = fmod(Dsub, mod);\n"
+		"			mCount = 0;\n"
+		"		}\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	double c = C[d + ty * widthB + tx];\n"
+		"	Dsub = c - Dsub;\n"
+		"	Dsub = fmod((mod + Dsub), mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixMaxpyKernelModular1024SP = {
+		"#define BLOCK_SIZE 16\n"
+		"__kernel void matrixMaxpyKernelModular1024SP(__global float* D, __global float* A, __global float* B,\n"
+		"		__global float* C, const int widthA, const int widthB, const float mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	float Dsub = 0;\n"
+		"	int mCount = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		mCount++;\n"
+		"		if(mCount == 64){\n"
+		"			Dsub = fmod(Dsub, mod);\n"
+		"			mCount = 0;\n"
+		"		}\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	float c = C[d + ty * widthB + tx];\n"
+		"	Dsub = c - Dsub;\n"
+		"	Dsub = fmod((mod + Dsub), mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixAxmyKernelModular1DP = {
+		"#define BLOCK_SIZE 16\n"
+		"#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+		"__kernel void matrixAxmyKernelModular1DP(__global double* D, __global double* A, __global double* B,\n"
+		"		__global double* C, const int widthA, const int widthB, const double mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	double Dsub = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	double c = C[d + ty * widthB + tx];\n"
+		"	Dsub = Dsub - c;\n"
+		"	Dsub = fmod((mod + Dsub), mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixAxmyKernelModular1SP = {
+		"#define BLOCK_SIZE 16\n"
+		"__kernel void matrixAxmyKernelModular1SP(__global float* D, __global float* A, __global float* B,\n"
+		"		__global float* C, const int widthA, const int widthB, const float mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	float Dsub = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	float c = C[d + ty * widthB + tx];\n"
+		"	Dsub = Dsub - c;\n"
+		"	Dsub = fmod((mod + Dsub), mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixAxmyKernelModular8DP = {
+		"#define BLOCK_SIZE 16\n"
+		"#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+		"__kernel void matrixAxmyKernelModular8DP(__global double* D, __global double* A, __global double* B,\n"
+		"		__global double* C, const int widthA, const int widthB, const double mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	double Dsub = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	double c = C[d + ty * widthB + tx];\n"
+		"	Dsub = Dsub - c;\n"
+		"	Dsub = fmod((mod + Dsub), mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixAxmyKernelModular16SP = {
+		"#define BLOCK_SIZE 16\n"
+		"__kernel void matrixAxmyKernelModular16SP(__global float* D, __global float* A, __global float* B,\n"
+		"		__global float* C, const int widthA, const int widthB, const float mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	float Dsub = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		Dsub = fmod(Dsub, mod);\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	float c = C[d + ty * widthB + tx];\n"
+		"	Dsub = Dsub - c;\n"
+		"	Dsub = fmod((mod + Dsub), mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixAxmyKernelModular32DP = {
+		"#define BLOCK_SIZE 16\n"
+		"#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+		"__kernel void matrixAxmyKernelModular32DP(__global double* D, __global double* A, __global double* B,\n"
+		"		__global double* C, const int widthA, const int widthB, const double mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	double Dsub = 0;\n"
+		"	int mCount = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		mCount++;\n"
+		"		if(mCount == 2){\n"
+		"			Dsub = fmod(Dsub, mod);\n"
+		"			mCount = 0;\n"
+		"		}\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	double c = C[d + ty * widthB + tx];\n"
+		"	Dsub = Dsub - c;\n"
+		"	Dsub = fmod((mod + Dsub), mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixAxmyKernelModular32SP = {
+		"#define BLOCK_SIZE 16\n"
+		"__kernel void matrixAxmyKernelModular32SP(__global float* D, __global float* A, __global float* B,\n"
+		"		__global float* C, const int widthA, const int widthB, const float mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	float Dsub = 0;\n"
+		"	int mCount = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		mCount++;\n"
+		"		if(mCount == 2){\n"
+		"			Dsub = fmod(Dsub, mod);\n"
+		"			mCount = 0;\n"
+		"		}\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	float c = C[d + ty * widthB + tx];\n"
+		"	Dsub = Dsub - c;\n"
+		"	Dsub = fmod((mod + Dsub), mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixAxmyKernelModular1024DP = {
+		"#define BLOCK_SIZE 16\n"
+		"#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
+		"__kernel void matrixAxmyKernelModular1024DP(__global double* D, __global double* A, __global double* B,\n"
+		"		__global double* C, const int widthA, const int widthB, const double mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local double As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local double Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	double Dsub = 0;\n"
+		"	int mCount = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		mCount++;\n"
+		"		if(mCount == 64){\n"
+		"			Dsub = fmod(Dsub, mod);\n"
+		"			mCount = 0;\n"
+		"		}\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	double c = C[d + ty * widthB + tx];\n"
+		"	Dsub = Dsub - c;\n"
+		"	Dsub = fmod((mod + Dsub), mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+	const char* matrixAxmyKernelModular1024SP = {
+		"#define BLOCK_SIZE 16\n"
+		"__kernel void matrixAxmyKernelModular1024SP(__global float* D, __global float* A, __global float* B,\n"
+		"		__global float* C, const int widthA, const int widthB, const float mod){\n"
+		"	int bx = get_group_id(0);\n"
+		"	int by = get_group_id(1);\n"
+		"	int tx = get_local_id(0);\n"
+		"	int ty = get_local_id(1);\n"
+		"	int aBegin= widthA * BLOCK_SIZE * by;\n"
+		"	int aEnd = aBegin + widthA - 1;\n"
+		"	int aStep = BLOCK_SIZE;\n"
+		"	int bBegin = BLOCK_SIZE * bx;\n"
+		"	int bStep = BLOCK_SIZE * widthB;\n"
+		"	__local float As[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	__local float Bs[BLOCK_SIZE][BLOCK_SIZE];\n"
+		"	float Dsub = 0;\n"
+		"	int mCount = 0;\n"
+		"	for(int a = aBegin, b = bBegin; a < aEnd; a += aStep, b += bStep){\n"
+		"		As[ty][tx] = A[a + widthA * ty + tx];\n"
+		"		Bs[ty][tx] = B[b + widthB * ty + tx];\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"		Dsub += As[ty][0] * Bs[0][tx];\n"
+		"		Dsub += As[ty][1] * Bs[1][tx];\n"
+		"		Dsub += As[ty][2] * Bs[2][tx];\n"
+		"		Dsub += As[ty][3] * Bs[3][tx];\n"
+		"		Dsub += As[ty][4] * Bs[4][tx];\n"
+		"		Dsub += As[ty][5] * Bs[5][tx];\n"
+		"		Dsub += As[ty][6] * Bs[6][tx];\n"
+		"		Dsub += As[ty][7] * Bs[7][tx];\n"
+		"		Dsub += As[ty][8] * Bs[8][tx];\n"
+		"		Dsub += As[ty][9] * Bs[9][tx];\n"
+		"		Dsub += As[ty][10] * Bs[10][tx];\n"
+		"		Dsub += As[ty][11] * Bs[11][tx];\n"
+		"		Dsub += As[ty][12] * Bs[12][tx];\n"
+		"		Dsub += As[ty][13] * Bs[13][tx];\n"
+		"		Dsub += As[ty][14] * Bs[14][tx];\n"
+		"		Dsub += As[ty][15] * Bs[15][tx];\n"
+		"		mCount++;\n"
+		"		if(mCount == 64){\n"
+		"			Dsub = fmod(Dsub, mod);\n"
+		"			mCount = 0;\n"
+		"		}\n"
+		"		barrier(CLK_LOCAL_MEM_FENCE);\n"
+		"	}\n"
+		"	Dsub = fmod(Dsub, mod);\n"
+		"	int d = widthB * BLOCK_SIZE * by + BLOCK_SIZE * bx;\n"
+		"	float c = C[d + ty * widthB + tx];\n"
+		"	Dsub = Dsub - c;\n"
+		"	Dsub = fmod((mod + Dsub), mod);\n"
+		"	D[d + ty * widthB + tx] = Dsub;\n"
+		"}\n"
+	};
+
+} // end of namespace LinBox
+
+#endif // __LINBOX_opencl_matrix_domain_kernels_INL
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
diff --git a/linbox/algorithms/opencl-resource-controller.h b/linbox/algorithms/opencl-resource-controller.h
new file mode 100644
index 0000000..3cf885a
--- /dev/null
+++ b/linbox/algorithms/opencl-resource-controller.h
@@ -0,0 +1,533 @@
+/* linbox/algorithms/opencl-resource-controller.h
+ * Copyright (C) 2012 Matthew Wezowicz
+ *
+ * Written by Matthew Wezowicz <mwezz at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/** @file algorithms/opencl-resource-controller.h
+ */
+
+#include <pthread.h>
+
+#include <algorithm>
+#include <istream>
+#include <iterator>
+#include <map>
+#include <sstream>
+#include <string>
+#include <vector>
+
+#include <CL/cl.h>
+
+//#include "named-mutex.h"
+#include "opencl-environ.h"
+
+#ifndef __LINBOX_opencl_resource_controller_H
+#define __LINBOX_opencl_resource_controller_H
+
+namespace LinBox{
+
+	/**
+	 * Enumerate all of the platforms currently available on the system
+	 */
+	std::vector<cl_platform_id> enumPlatforms(){
+		//Variables
+		cl_int errcode;
+		cl_platform_id* platforms;
+		cl_uint numPlatforms;
+
+		//Get number of platforms on system
+		errcode = clGetPlatformIDs(0, NULL, &numPlatforms);
+		linbox_check(errcode == CL_SUCCESS);
+
+		//Return empty vector if error
+		if(errcode != CL_SUCCESS || numPlatforms <= 0){
+			std::vector<cl_platform_id> ret;
+			return ret;
+		}
+
+		//Allocate memory for platforms IDs
+		platforms = new cl_platform_id[numPlatforms];
+
+		//Read in platform IDs
+		errcode = clGetPlatformIDs(numPlatforms, platforms, NULL);
+		linbox_check(errcode == CL_SUCCESS);
+
+		//Allocate vector for platform IDs
+		std::vector<cl_platform_id> ret;
+
+		//Copy platform IDs into vector
+		for(int i = 0; i < (int)numPlatforms; i++){
+			ret.push_back(platforms[(size_t)i]);
+		}
+
+		//Deallocate memory
+		delete[] platforms;
+
+		return ret;
+	}
+
+	/**
+	 * Get the platform name associated with the platform
+	 */
+	std::string getPlatformName(cl_platform_id platform){
+		//Variables
+		char* tempBuffer;
+		cl_int errcode;
+		size_t sizeRet;
+
+		//Get size of platform name
+		errcode = clGetPlatformInfo(platform, CL_PLATFORM_NAME, 0, NULL, &sizeRet);
+		linbox_check(errcode == CL_SUCCESS);
+
+		//Allocate memory for platform name
+		tempBuffer = new char[sizeRet];
+
+		//Read in platform name
+		errcode = clGetPlatformInfo(
+			platform,
+			CL_PLATFORM_NAME,
+			sizeRet,
+			tempBuffer,
+			NULL);
+		linbox_check(errcode == CL_SUCCESS);
+
+		//Convert platform name to std::string
+		std::string ret(tempBuffer);
+
+		//Deallocate memory
+		delete[] tempBuffer;
+
+		return ret;
+	}
+
+	/**
+	 * Get the platform version associated with the platform
+	 */
+	double getPlatformVersion(cl_platform_id platform){
+		//Variables
+		char* tempBuffer;
+		cl_int errcode;
+		double ret = 0;
+		size_t first;
+		size_t second;
+		size_t sizeRet;
+
+		//Get size of platform version string
+		errcode = clGetPlatformInfo(
+			platform,
+			CL_PLATFORM_VERSION,
+			0,
+			NULL,
+			&sizeRet);
+		linbox_check(errcode == CL_SUCCESS);
+
+		//Allocate memory for platform version string
+		tempBuffer = new char[sizeRet];
+
+		//Read in platform name string
+		errcode = clGetPlatformInfo(
+			platform,
+			CL_PLATFORM_VERSION,
+			sizeRet,
+			tempBuffer,
+			NULL);
+		linbox_check(errcode == CL_SUCCESS);
+
+		//Convert platform version string to std::string
+		std::string versionString(tempBuffer);
+
+		//Isolate the version number in string and convert to double
+		first = versionString.find_first_of(" ", 0);
+		second = versionString.find_first_of(" ", (first + 1));
+		std::string tempString = versionString.substr(first, (second - first));
+		std::stringstream strstream(tempString);
+		strstream >> ret;
+
+		//Deallocate memory
+		delete[] tempBuffer;
+
+		return ret;
+	}
+
+	/**
+	 * Get the platform extensions associated with the platform
+	 */
+	std::vector<std::string> getPlatformExtensions(cl_platform_id platform){
+		//Variables
+		char* tempBuffer;
+		cl_int errcode;
+		size_t sizeRet;
+
+		//Get size of platform extensions string
+		errcode = clGetPlatformInfo(
+			platform,
+			CL_PLATFORM_EXTENSIONS,
+			0,
+			NULL,
+			&sizeRet);
+		linbox_check(errcode == CL_SUCCESS);
+
+		//Allocate memory for platform extensions string
+		tempBuffer = new char[sizeRet];
+
+		//Read in platform extensions string
+		errcode = clGetPlatformInfo(
+			platform,
+			CL_PLATFORM_EXTENSIONS,
+			sizeRet,
+			tempBuffer,
+			NULL);
+		linbox_check(errcode == CL_SUCCESS);
+
+		//Convert platfrom extensions string to std::string
+		std::string tempString(tempBuffer);
+
+		//Parse out the individual extensions and copy into vector
+		std::stringstream strstream(tempString);
+		std::istream_iterator<std::string> it(strstream);
+		std::istream_iterator<std::string> end;
+		std::vector<std::string> ret;
+		for(; it != end; it++){
+			ret.push_back(*it);
+		}
+
+		//Deallocate memory
+		delete[] tempBuffer;
+
+		return ret;
+	}
+
+	/**
+	 * Enumerate all of the devices currently available on the platform
+	 */
+	std::vector<cl_device_id> enumDevices(cl_platform_id platform){
+		//Variables
+		cl_device_id* devices;
+		cl_int errcode;
+		cl_uint numDevices;
+
+		//Get number of devices in platform
+		errcode = clGetDeviceIDs(
+			platform,
+			CL_DEVICE_TYPE_ALL,
+			0,
+			NULL,
+			&numDevices);
+		linbox_check(errcode == CL_SUCCESS);
+
+		//Return empty vector if error
+		if(errcode != CL_SUCCESS || numDevices <= 0){
+			std::vector<cl_device_id> ret;
+			return ret;
+		}
+
+		//Allocate memory for device IDs
+		devices = new cl_device_id[numDevices];
+
+		//Read in device IDs
+		errcode = clGetDeviceIDs(
+			platform,
+			CL_DEVICE_TYPE_ALL,
+			numDevices,
+			devices,
+			NULL);
+		linbox_check(errcode == CL_SUCCESS);
+
+		//Allocate vector for device IDs
+		std::vector<cl_device_id> ret;
+
+		//Copy device IDs into vector
+		for(int i = 0; i < (int)numDevices; i++){
+			ret.push_back(devices[(size_t)i]);
+		}
+
+		//Deallocate memory
+		delete[] devices;
+
+		return ret;
+	}
+
+	/**
+	 * Create an OpenCL context from a platfrom and device
+	 */
+	cl_context createContext(cl_platform_id platform, cl_device_id device){
+		//Variables
+		cl_context ret;
+		cl_int errcode;
+		cl_context_properties props[3] = {
+			CL_CONTEXT_PLATFORM,
+			(cl_context_properties)platform,
+			0};
+
+		//Create context
+		ret = clCreateContext(props, 1, &device, NULL, NULL, &errcode);
+		linbox_check(errcode == CL_SUCCESS);
+
+		return ret;
+	}
+
+	class OpenCLResourceController{
+
+	private:
+		static std::vector<OpenCLEnviron*>* environs;
+
+#ifndef __MPI_SHARED
+		static std::map<unsigned int, unsigned int>* IDsToInstances;
+		static pthread_mutex_t controllerLock;
+#else
+		static std::map<unsigned int, std::string>* IDsToNames;
+		static std::map<std::string, unsigned int>* namesToInstances;
+		static std::vector<NamedMutex*>* mutexs;
+		static NamedMutex controllerLock;
+#endif
+
+		static bool initialized;
+
+		void init(){
+			unsigned int ID = 0;
+
+			environs = new std::vector<OpenCLEnviron*>;
+#ifndef __MPI_SHARED
+			IDsToInstances = new std::map<unsigned int, unsigned int>;
+#else
+			mutexs = new std::vector<NamedMUtex*>;
+			IDsToNames = new std::map<unsigned int, std::string>;
+			namesToInstances = new std::map<std::string, unsigned int>;
+#endif
+
+			std::vector<cl_platform_id> platforms = enumPlatforms();
+
+			for(int i = 0; i < (int)platforms.size(); i++){
+				std::string platformName = getPlatformName(platforms[(size_t)i]);
+
+				double platformVersion = getPlatformVersion(platforms[(size_t)i]);
+
+				std::vector<std::string> platformExtensions =
+					getPlatformExtensions(platforms[(size_t)i]);
+
+				std::vector<cl_device_id> devices = enumDevices(platforms[(size_t)i]);
+
+				for(int j = 0; j < (int)devices.size(); j++){
+					cl_context context = createContext(platforms[(size_t)i], devices[(size_t)j]);
+
+#ifndef __MPI_SHARED
+					//Allocate and initialize device lock
+					pthread_mutex_t* tempMutex = new pthread_mutex_t;
+
+					pthread_mutex_init(tempMutex, NULL);
+
+					//Build OpenCLEnviron
+					OpenCLEnviron* tempEnviron = new OpenCLEnviron(
+						platformName,
+						platformVersion,
+						platformExtensions,
+						context,
+						devices[(size_t)j],
+						tempMutex,
+						ID);
+
+					//Update map of ID numbers to allocated instances
+					(*IDsToInstances)[ID] = 0;
+
+					ID++;
+#else
+					//Build NamedMutex name
+					std::stringstream strstream;
+					strstream << platformName << "_" << j;
+					std::string mutexName(strstream.str());
+
+					//Construct named mutex
+					NamedMutex* tempMutex = new NamedMutex(mutexName);
+					mutexs->push_back(tempMutex);
+
+					//Build OpenCLEnviron with local ID number
+					OpenCLEnviron* tempEnviron = new OpenCLEnviron(
+						platformName,
+						platformVersion,
+						platformExtensions,
+						context,
+						devices[(size_t)j],
+						tempMutex,
+						ID);
+
+					//Update local copy of map with
+					//NamedMutex names to allocated instances
+					unsigned int allocated =
+						controllerLock.updateLocalValue<unsigned int>(mutexName);
+					(*namesToInstances)[mutexName] = allocated;
+
+					//Update local map of ID numbers to NamedMutex names
+					(*IDsToNames)[ID] = mutexName;
+
+					//Update global copy of map with
+					//NamedMutex names to allocated instances
+					controllerLock.updateGlobalValue<unsigned int>(mutexName, allocated);
+
+					ID++;
+#endif
+
+					environs->push_back(tempEnviron);
+				}
+			}
+
+			initialized = true;
+		}
+
+	public:
+
+		OpenCLResourceController(){
+#ifndef __MPI_SHARED
+			pthread_mutex_lock(&controllerLock);
+
+			init();
+			//removeDuplicates();
+
+			pthread_mutex_unlock(&controllerLock);
+#else
+			controllerLock.lock();
+
+			init();
+			//removeDuplicates();
+
+			controllerLock.unlock();
+#endif
+		}
+
+		~OpenCLResourceController(){
+#ifndef __MPI_SHARED
+			for(int i = 0; i < (int)environs->size(); i++){
+				pthread_mutex_destroy(environs->at((size_t)i)->getDeviceLock());
+				delete environs->at((size_t)i)->getDeviceLock();
+				delete environs->at((size_t)i);
+			}
+#else
+			for(int i = 0; i < mutexs->size(); i++){
+				delete mutexs->at((size_t)i);
+			}
+			for(int i = 0; i < environs->size(); i++){
+				delete environs->at((size_t)i);
+			}
+#endif
+		}
+
+		const std::vector<OpenCLEnviron*>* accessEnvirons(){
+			return environs;
+		}
+
+		void acquireController(){
+#ifndef __MPI_SHARED
+			pthread_mutex_lock(&controllerLock);
+#else
+			controllerLock.lock();
+
+			//Update local copy of map with
+			//NamedMutex names to allocated instances
+			///!TODO
+#endif
+		}
+
+		void releaseController(){
+#ifndef __MPI_SHARED
+			pthread_mutex_unlock(&controllerLock);
+#else
+			//Update global copy of map with
+			//NamedMutex names to allocated instances
+			///!TODO
+
+			controllerLock.unlock();
+#endif
+		}
+
+		unsigned int getInstanceCount(unsigned int ID){
+#ifndef __MPI_SHARED
+			return (*IDsToInstances)[ID];
+#else
+			return (*namesToInstances)[(*IDsToNames)[ID]];
+#endif
+		}
+
+		unsigned int allocateInstance(unsigned int ID){
+#ifndef __MPI_SHARED
+			(*IDsToInstances)[ID] += 1;
+			return (*IDsToInstances)[ID];
+#else
+			(*namesToInstances)[(*IDsToNames)[ID]] += 1;
+			return (*namesToInstances)[(*IDsToNames)[ID]];
+#endif
+		}
+
+		unsigned int deallocateInstance(unsigned int ID){
+#ifndef __MPI_SHARED
+			(*IDsToInstances)[ID] -= 1;
+#if 0
+			if((*IDsToInstances)[ID] < 0){ //! @bug BB Toujours faux
+				(*IDsToInstances)[ID] = 0;
+			}
+#endif
+			return (*IDsToInstances)[ID];
+#else
+			(*namesToInstances)[(*IDsToNames)[ID]] -= 1;
+			if((*namesToInstances)[(*IDsToNames)[ID]] < 0){
+				(*namesToInstances)[(*IDsToNames)[ID]] = 0;
+			}
+			return (*namesToInstances)[(*IDsToNames)[ID]];
+#endif
+		}
+
+	}; /* end of class OpenCLResourceController */
+
+	std::vector<OpenCLEnviron*>* OpenCLResourceController::environs = NULL;
+#ifndef __MPI_SHARED
+	std::map<unsigned int, unsigned int>*
+		OpenCLResourceController::IDsToInstances = NULL;
+	pthread_mutex_t OpenCLResourceController::controllerLock =
+		PTHREAD_MUTEX_INITIALIZER;
+#else
+	std::map<unsigned int, std::string>*
+		OpenCLResourceController::IDsToNames = NULL;
+	std::map<std::string, unsigned int>*
+		OpenCLResourceController::namesToInstances = NULL;
+	std::vector<NamedMutex*>*
+		OpenCLResourceController::mutexs = NULL;
+	NamedMutex OpenCLResourceController::controllerLock =
+		NamedMutex("OpenCLResourceContollerLock");
+#endif
+	bool OpenCLResourceController::initialized(false);
+
+	OpenCLResourceController& accessOpenCLResourceController(){
+		static OpenCLResourceController controller;
+		return controller;
+	}
+
+} /* end of namespace LinBox */
+
+#endif // __LINBOX_opencl_resource_controller_H
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/algorithms/poly-det.h b/linbox/algorithms/poly-det.h
new file mode 100644
index 0000000..288886e
--- /dev/null
+++ b/linbox/algorithms/poly-det.h
@@ -0,0 +1,195 @@
+#ifndef __LINBOX_POLY_DET_H
+#define __LINBOX_POLY_DET_H
+/* by Alex Stachnik
+*/
+
+#include <givaro/extension.h>
+#include <linbox/algorithms/poly-interpolation.h>
+#include <linbox/solutions/det.h>
+
+namespace LinBox {
+/*  
+Matrix is a polynomial matrix.  
+result is set to its determinant and returned (a polynomial).
+d is the number of evaluation points.
+
+The method is to compute dets at each evaluation point and interpolate.
+ (note by bds)
+ */
+template <class Field>
+typename Givaro::Poly1Dom<Field,Givaro::Dense>::Element&
+computePolyDet(typename Givaro::Poly1Dom<Field,Givaro::Dense>::Element& result,
+				DenseMatrix<Givaro::Poly1Dom<Field,Givaro::Dense> >& A, 
+               int d)
+{
+	typedef Givaro::Poly1Dom<Field,Givaro::Dense> PolyDom;
+	typedef typename PolyDom::Element PolyElt;
+	typedef typename Field::Element FieldElt;
+	//typedef MatrixDomain<Field> FieldMatDom;
+	typedef DenseMatrix<Field> FieldMat;
+
+	int n=A.coldim(),m=A.rowdim();
+
+	PolyDom BR=A.field();
+	Field F(BR.subDomain()); // coeff field
+
+	std::vector<FieldMat> mats;
+	std::vector<FieldElt> pts(d);
+	FieldElt fieldElt;
+	F.assign(fieldElt,F.zero);
+	for (int i=0;i<d;++i) {
+		mats.push_back(FieldMat(F,m,n));
+		F.init(pts[i],int64_t(i));
+	}
+
+	commentator().report(Commentator::LEVEL_IMPORTANT,PROGRESS_REPORT)
+		<< "Initialized mats" << std::endl;
+
+
+	PolyInterpolation<Field,PolyDom> PI(pts,F,BR);
+#pragma omp parallel for shared(mats,A,PI,BR,F)
+	for (int i=0;i<m;++i) {
+		for (int j=0;j<n;++j) {
+			PolyElt p;
+			A.getEntry(p,i,j);
+			std::vector<FieldElt> vals;
+			PI.evaluate(vals,p,BR,F);
+			for (int k=0;k<d;++k) {
+				mats[k].setEntry(i,j,vals[k]);
+			}
+		}
+	}
+
+	commentator().report(Commentator::LEVEL_IMPORTANT,PROGRESS_REPORT)
+		<< "Finished evaluations" << std::endl;
+
+	std::vector<FieldElt> dets(d);
+#pragma omp parallel for shared(dets,mats)
+	for (int k=0;k<d;++k) {
+		det(dets[k],mats[k],Method::Elimination());
+	}
+
+	PI.interpolate(result,pts,dets,BR,F);
+	return result;
+}
+
+int roundUpPowerOfTwo(unsigned int n)
+{
+	if (n==0) {
+		return 0;
+	} else if (n==1) {
+		return 1;
+	}
+	
+	int bits=0;
+	int loopN=n;
+	while (loopN>0) {
+		loopN = loopN >> 1;
+		++bits;
+	}
+	
+	unsigned int mask=(1<<(bits-1))-1;
+	if ((mask&n)!=0) {
+		return 1<<bits;
+	} else {
+		return 1<<(bits-1);
+	}
+}
+
+template <class Field,class Matrix>
+typename Givaro::Poly1Dom<Field,Givaro::Dense>::Element&
+computePolyDetExtension(typename Givaro::Poly1Dom<Field,Givaro::Dense>::Element& result,
+                        Field& F,
+                        Matrix& A)
+{
+	typedef Givaro::Poly1Dom<Field,Givaro::Dense> BasePolyDom;
+	typedef typename BasePolyDom::Element BasePolyElt;
+
+	BasePolyDom BR=F;
+
+	int n=A.coldim(),m=A.rowdim();
+
+	commentator().report(Commentator::LEVEL_IMPORTANT,PROGRESS_REPORT)
+		<< "Computing d" << std::endl;
+
+	int d=0;
+	BasePolyElt p;
+	for (int i=0;i<m;++i) {
+		int rowMaxD=0;
+		for (int j=0;j<n;++j) {
+			A.getEntry(p,i,j);
+			int t=BR.degree(p).value();
+			rowMaxD=(rowMaxD<t)?t:rowMaxD;
+		}
+		d += rowMaxD;
+	}
+	d=roundUpPowerOfTwo(d+1);
+
+	commentator().report(Commentator::LEVEL_IMPORTANT,PROGRESS_REPORT)
+		<< "Found d" << std::endl;
+
+	int a,e=1;
+	a=F.cardinality();
+	int newCard=a;
+	while (newCard<d) {
+		newCard *= a;
+		++e;
+	}
+	
+	typedef Givaro::Extension<Field> ExtField;
+	typedef Givaro::Poly1Dom<ExtField,Givaro::Dense> ExtPolyDom;
+	typedef typename ExtPolyDom::Element ExtPoly;
+	//typedef typename Matrix::template rebind<ExtPolyDom>::other EPolyMatrix;
+	typedef DenseMatrix<ExtPolyDom> EPolyMatrix;
+
+	ExtField EF(F,e);
+	ExtPolyDom EPD(EF,"x");
+	Hom<Field,Givaro::Extension<Field> > hom(F,EF);
+
+	commentator().report(Commentator::LEVEL_IMPORTANT,PROGRESS_REPORT)
+		<< "Constructed new matrix" << std::endl;
+
+	EPolyMatrix Ap(EPD,m,n);
+	for (int i=0;i<m;++i) {
+		for (int j=0;j<n;++j) {
+			BasePolyElt oldElt;
+			A.getEntry(oldElt,i,j);
+			ExtPoly newElt;
+			if (BR.isZero(oldElt)) {
+				EPD.assign(newElt,EPD.zero);
+			} else {
+				int eltDegree=BR.degree(oldElt).value();
+				EPD.init(newElt,BR.degree(oldElt));
+				for (int k=0;k<eltDegree+1;++k) {
+					hom.image(newElt[k],oldElt[k]);
+				}
+			}
+			Ap.setEntry(i,j,newElt);
+		}
+	}
+
+	commentator().report(Commentator::LEVEL_IMPORTANT,PROGRESS_REPORT)
+		<< "Converted matrix" << std::endl;
+
+	ExtPoly ep;
+	computePolyDet<ExtField>(ep,Ap,d);
+	//computePolyDet(ep,EF,Ap,d);
+
+	commentator().report(Commentator::LEVEL_IMPORTANT,PROGRESS_REPORT)
+		<< "Computed over base field" << std::endl;
+
+	if (EPD.isZero(ep)) {
+		BR.assign(result,BR.zero);
+	} else {
+		int eltDegree=EPD.degree(ep).value();
+		BR.init(result,EPD.degree(ep));
+		for (int k=0;k<eltDegree+1;++k) {
+			hom.preimage(result[k],ep[k]);
+		}
+	}
+	return result;
+}
+
+}
+
+#endif //__LINBOX_POLY_DET_H
diff --git a/linbox/algorithms/poly-interpolation.h b/linbox/algorithms/poly-interpolation.h
new file mode 100644
index 0000000..7bf5d99
--- /dev/null
+++ b/linbox/algorithms/poly-interpolation.h
@@ -0,0 +1,174 @@
+
+#ifndef __LINBOX_POLY_INTERPOLATION_H
+#define __LINBOX_POLY_INTERPOLATION_H
+
+
+#include <omp.h>
+
+#include <linbox/ring/givaro-poly.h>
+
+namespace LinBox {
+
+
+	// Expects pts to have size 2^n, undefined behavior otherwise
+template<class Field, class PolyDom>
+class PolyInterpolation {
+public:
+	typedef GivaroPoly<PolyDom> Ring;
+	typedef typename Ring::Element RingElt;
+	typedef typename Field::Element FieldElt;
+	typedef std::vector<std::vector<RingElt> > ProductTree;
+
+	PolyInterpolation(const std::vector<FieldElt>& pts,
+	                  Field& F,
+	                  PolyDom& PD)
+	{
+		int n=pts.size();
+
+		std::vector<RingElt> mRow;
+		for (int i=0;i<n;++i) {
+			RingElt p;
+			PD.assign(p,PD.one);
+			PD.shiftin(p,1);
+			PD.subin(p,pts[i]);
+			mRow.push_back(p);
+		}
+		Mtree_.push_back(mRow);
+		k_=0;
+		while (Mtree_[k_].size()>1) {
+			std::vector<RingElt> row;
+			for (uint32_t i = 0; i < Mtree_[k_].size()/2; ++i) {
+				RingElt p;
+				PD.mul(p,Mtree_[k_][2*i],Mtree_[k_][2*i+1]);
+				row.push_back(p);
+			}
+			Mtree_.push_back(row);
+			++k_;
+		}
+	}
+
+	RingElt& interpolate(RingElt& poly,
+	                     const std::vector<FieldElt>& pts,
+	                     const std::vector<FieldElt>& vals,
+	                     PolyDom& PD,
+	                     Field& F)
+	{
+		int n=pts.size();
+		std::vector<FieldElt> si;
+		RingElt mprime;
+		PD.diff(mprime,Mtree_[k_][0]);
+		evaluate(si,mprime,PD,F);
+		for (int i=0;i<n;++i) {
+			F.invin(si[i]);
+			F.mulin(si[i],vals[i]);
+		}
+		scaledSum(poly,si,PD);
+		return poly;
+	}
+
+	RingElt& scaledSum(RingElt& comb,
+	                   const std::vector<FieldElt>& cs,
+	                   PolyDom& PD)
+	{
+		int numPts=cs.size();
+		std::vector<RingElt> fRow,tempRow;
+		fRow.resize(numPts);
+		for (int i=0;i<numPts;++i) {
+			PD.assign(fRow[i],cs[i]);
+		}
+
+		for (int i=0;i<k_;++i) {
+			int rowLen=fRow.size();
+			tempRow.resize(rowLen/2);
+			for (int j=0;j<rowLen/2;++j) {
+				RingElt p,q;
+				PD.mul(p,fRow[2*j],Mtree_[i][2*j+1]);
+				PD.mul(q,fRow[2*j+1],Mtree_[i][2*j]);
+				PD.addin(p,q);
+				PD.assign(tempRow[j],p);
+			}
+			fRow.swap(tempRow);
+			tempRow.clear();
+		}
+		PD.assign(comb,fRow[0]);
+		return comb;
+	}
+
+	void evaluate(std::vector<FieldElt>& vals,
+	              const RingElt& poly,
+	              PolyDom& PD,
+	              Field& F)
+	{
+		std::vector<RingElt> fRow,tempRow;
+		fRow.push_back(poly);
+
+		for (int i=k_-1;i>=0;--i) {
+			int rowLen=fRow.size();
+			tempRow.resize(rowLen*2);
+			for (int j=0;j<rowLen;++j) {
+				RingElt p;
+				PD.mod(p,fRow[j],Mtree_[i][2*j]);
+				PD.assign(tempRow[2*j],p);
+				PD.mod(p,fRow[j],Mtree_[i][2*j+1]);
+				PD.assign(tempRow[2*j+1],p);
+			}
+			fRow.swap(tempRow);
+			tempRow.clear();
+		}
+
+		int numPts=fRow.size();
+		vals.resize(numPts);
+		for (int i=0;i<numPts;++i) {
+			FieldElt d;
+			PD.leadcoef(d,fRow[i]);
+			vals[i]=d;
+		}
+	}
+
+
+	static void naiveInterpolate(RingElt& poly,
+	                             const std::vector<FieldElt>& vals,
+	                             const std::vector<FieldElt>& pts,
+	                             GivaroPoly<PolyDom>& R,
+	                             PolyDom& PD,
+	                             Field& F)
+	{
+		typedef GivaroPoly<PolyDom> Ring;
+		typedef typename Ring::Element RingElt;
+		typedef typename Ring::Scalar_t FieldElt;
+
+		int n=vals.size();
+		linbox_check(vals.size()==pts.size());
+		PD.assign(poly,PD.zero);
+		for (int i=0;i<n;++i) {
+			RingElt mulElt;
+			PD.assign(mulElt,PD.one);
+			for (int j=0;j<n;++j) {
+				if (i==j) {
+					continue;
+				}
+				RingElt p;
+				PD.assign(p,PD.one);
+				PD.shiftin(p,1);
+				PD.subin(p,pts[j]);
+				FieldElt d;
+				F.sub(d,pts[i],pts[j]);
+				PD.divin(p,d);
+				PD.mulin(mulElt,p);
+			}
+			PD.mulin(mulElt,vals[i]);
+			PD.addin(poly,mulElt);
+		}
+	}
+protected:
+
+	ProductTree Mtree_;
+
+	int k_;
+
+};
+
+
+}
+
+#endif //__LINBOX_POLY_INTERPOLATION_H
diff --git a/linbox/algorithms/polynomial-matrix/Makefile.am b/linbox/algorithms/polynomial-matrix/Makefile.am
new file mode 100644
index 0000000..a58ec59
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/Makefile.am
@@ -0,0 +1,39 @@
+# Copyright (c) 2010 the LinBox group
+#  ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the  GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# ========LICENCE========
+
+
+
+pkgincludesubdir=$(pkgincludedir)/algorithms/polynomial-matrix
+
+
+pkgincludesub_HEADERS =         \
+	matpoly-add-domain.h	\
+	matpoly-mult-naive.h	\
+	matpoly-mult-fft.h	\
+	matpoly-mult-kara.h	\
+	matpoly-mult-fft-wordsize.inl	\
+	matpoly-mult-fft-wordsize-fast.inl	\
+	matpoly-mult-fft-wordsize-three-primes.inl	\
+	matpoly-mult-fft-multiprecision.inl	\
+	polynomial-fft-transform-simd.inl	\
+	polynomial-fft-transform.h	\
+	polynomial-fft-transform.inl	\
+	polynomial-matrix-domain.h	\
+        simd.h		\
+	order-basis.h
diff --git a/linbox/algorithms/polynomial-matrix/matpoly-add-domain.h b/linbox/algorithms/polynomial-matrix/matpoly-add-domain.h
new file mode 100755
index 0000000..116a04d
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/matpoly-add-domain.h
@@ -0,0 +1,91 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013  Pascal Giorgi
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_matpoly_add_domain_H
+#define __LINBOX_matpoly_add_domain_H
+
+#include <algorithm>
+#include "linbox/matrix/matrix-domain.h"
+
+namespace LinBox {
+
+	template <class Field>
+	class PolynomialMatrixAddDomain {
+	protected:
+		MatrixDomain<Field>      _BMD;
+
+	public:
+		PolynomialMatrixAddDomain(const Field& F)
+			: _BMD(F) {}
+
+		// add function (a must be allocated with the right size)
+		template<typename PMatrix1,typename PMatrix2,typename PMatrix3>
+		void add(PMatrix1 &a, const PMatrix2 &b, const PMatrix3 &c){
+			size_t i=0;
+			for(;i<std::min(b.size(),c.size());i++)
+				_BMD.add(a[i],b[i],c[i]);
+			if (b.size()>c.size()){
+				for(;i<b.size();i++)
+					a[i]=b[i];                                
+			}
+			else{
+				for(;i<c.size();i++)
+					a[i]=c[i];                                
+			}
+		}
+  
+		// addin function (a must be allocated with the right size)
+		template<typename PMatrix1,typename PMatrix2>
+		void addin(PMatrix1 &a, const PMatrix2 &b){	
+			for(size_t i=0;i<b.size();i++)
+				_BMD.addin(a[i],b[i]);
+		}
+  
+		// sub function (a must be allocated with the right size)
+		template<typename PMatrix1,typename PMatrix2,typename PMatrix3>
+		void sub(PMatrix1 &a, const PMatrix2 &b, const PMatrix3 &c){
+			size_t i=0;
+			for(;i<std::min(b.size(),c.size());i++)
+				_BMD.sub(a[i],b[i],c[i]);
+			if (b.size()>c.size()){
+				for(;i<b.size();i++)
+					a[i]=b[i];                                
+			}
+			else{ 
+				for(;i<c.size();i++)
+					_BMD.neg(a[i],c[i]);                                
+			}
+		}
+
+		// subin function (a must be allocated with the right size)
+		template<typename PMatrix1,typename PMatrix2>
+		void subin(PMatrix1 &a, const PMatrix2 &b){
+			for(size_t i=0;i<b.size();i++)
+				_BMD.subin(a[i],b[i]);
+		}
+	};
+}
+#endif
+
diff --git a/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-multiprecision.inl b/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-multiprecision.inl
new file mode 100644
index 0000000..743d14b
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-multiprecision.inl
@@ -0,0 +1,668 @@
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013  Pascal Giorgi
+ *                     Romain Lebreton
+ *
+ * Written by Pascal Giorgi   <pascal.giorgi at lirmm.fr>
+ *            Romain Lebreton <lebreton at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+#ifndef __LINBOX_matpoly_mult_ftt_multiprecision_INL
+#define __LINBOX_matpoly_mult_ftt_multiprecision_INL
+
+#include <givaro/zring.h>
+#include "linbox/ring/modular.h"
+#include "linbox/randiter/random-fftprime.h"
+#include "linbox/randiter/random-prime.h"
+#include <fflas-ffpack/field/rns-double.h>
+#define MB(x) ((x)/(double)(1<<20))
+#ifndef MEMINFO
+#define MEMINFO ""
+#endif
+namespace LinBox{
+
+  /***************************************************
+   **** Polynomial Matrix Multiplication over Z[x] ***
+   ***************************************************/
+  template<>
+  class PolynomialMatrixFFTMulDomain<Givaro::ZRing<integer> > {
+  public:
+    typedef Givaro::ZRing<integer>       IntField;
+    //typedef Givaro::Modular<uint32_t>     ModField;
+    typedef Givaro::Modular<double>                ModField;
+    typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,ModField> MatrixP_F; // Polynomial matrix stored as a matrix of polynomials
+    typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,IntField> MatrixP_I; // Polynomial matrix stored as a matrix of polynomials
+
+  private:
+    const IntField     *_field;
+    integer           _maxnorm;
+
+    template<typename PMatrix1>
+    size_t logmax(const PMatrix1 A) const {
+      size_t mm=A.get(0,0,0).bitsize();
+      for(size_t k=0;k<A.size();k++)
+	for (size_t i=0;i<A.rowdim()*A.coldim();i++){
+	  size_t tmp=A.get(i,k).bitsize();
+	  mm=std::max(mm,tmp);
+	}
+      return mm;
+    }
+
+  public:
+    void getFFTPrime(uint64_t prime_max, size_t lpts, integer bound, std::vector<integer> &bas){
+
+      RandomFFTPrime RdFFT(prime_max);
+      size_t nbp=0;
+      if (!RdFFT.generatePrimes(lpts,bound,bas)){
+	integer MM=1;
+	for(std::vector<integer>::size_type i=0;i<bas.size();i++)
+	  MM*=bas[i];
+	RandomPrimeIter Rd(integer(prime_max).bitsize());
+	integer tmp;
+	do {
+	  do {Rd.random(tmp);}
+	  while (MM%tmp==0);
+	  bas.push_back(tmp);
+	  nbp++;
+	  MM*=tmp;
+	} while (MM<bound);	
+      }
+#ifdef VERBOSE_FFT
+      std::cout<<"MatPoly Multiprecision FFT : using "<<bas.size()-nbp<<" FFT primes and "<<nbp<<" normal primes "<<std::endl;
+#endif
+    }
+
+    
+
+    inline const IntField & field() const { return *_field; }
+
+
+    PolynomialMatrixFFTMulDomain (const IntField &F, const integer maxnorm=0) :
+      _field(&F), _maxnorm(maxnorm) {}
+
+    template<typename PMatrix1, typename PMatrix2, typename PMatrix3>
+    void mul (PMatrix1 &c, const PMatrix2 &a, const PMatrix3 &b) {
+      //compute a bound on the entry of the input matrix a and b
+      FFT_PROFILE_START(2);
+      integer maxA,maxB;
+      maxA=maxB=_maxnorm;			
+      if (_maxnorm==0){
+	maxA=1;maxA<<=uint64_t(logmax(a));
+	maxB=1;maxB<<=uint64_t(logmax(b));
+      }
+      integer bound=2*maxA*maxB*uint64_t(a.coldim())*uint64_t(std::min(a.size(),b.size()));
+      FFT_PROFILING(2,"max norm computation");
+
+      mul_crtla(c,a,b,maxA,maxB,bound);
+    }
+
+    template<typename PMatrix1, typename PMatrix2, typename PMatrix3>
+    void midproduct (PMatrix1 &c, const PMatrix2 &a, const PMatrix3 &b,
+		     bool smallLeft=true, size_t n0=0, size_t n1=0) {
+      //compute a bound on the entry of the input matrix a and b
+      FFT_PROFILE_START(2);
+      integer maxA,maxB;
+      maxA=maxB=_maxnorm;
+      if (_maxnorm==0){
+	maxA=1;maxA<<=uint64_t(logmax(a));
+	maxB=1;maxB<<=uint64_t(logmax(b));
+      }
+      integer bound=2*maxA*maxB*integer((uint64_t)a.coldim())*integer((uint64_t)std::min(a.size(),b.size()));;
+      if (smallLeft)
+	bound*= (uint64_t)a.size();
+      else
+	bound*= (uint64_t)b.size();
+
+      FFT_PROFILING(2,"max norm computation");
+
+      midproduct_crtla(c,a,b,maxA,maxB,bound,smallLeft, n0,n1);
+    }
+
+
+    // template< typename PMatrix1,typename PMatrix2, typename PMatrix3>
+    // void mul_crtla(PMatrix1 &c, const PMatrix2 &a, const PMatrix3 &b,
+    // 		   const integer& maxA, const integer& maxB, const integer& bound) {
+    //   // (convert to MatrixP representation)
+    //   FFT_PROFILE_START;
+    //   MatrixP_I a2(field(),a.rowdim(),a.coldim(),a.size());
+    //   MatrixP_I b2(field(),b.rowdim(),b.coldim(),b.size());
+    //   a2.copy(a,0,a.size()-1);
+    //   b2.copy(b,0,b.size()-1);
+    //   MatrixP_I c2(field(),c.rowdim(),c.coldim(),c.size());
+    //   FFT_PROFILING(2,"converting rep of input matrices");
+    //   mul_crtla(c2,a2,b2,maxA,maxB,bound);
+    //   c.copy(c2,0,c.size()-1);
+    //   FFT_PROFILING(2,"converting rep of output matrices");
+    // }
+
+
+    // void mul_crtla(MatrixP_I &c, const MatrixP_I &a, const MatrixP_I &b,
+    // 		   const integer& maxA, const integer& maxB, const integer& bound){
+
+    // WARNING: Polynomial Matrix should stored as matrix of polynomial with integer coefficient 
+    template< typename PMatrix1,typename PMatrix2, typename PMatrix3>
+    void mul_crtla(PMatrix1 &c, const PMatrix2 &a, const PMatrix3 &b,
+    		   const integer& maxA, const integer& maxB, const integer& bound) {
+
+      FFT_PROFILE_START(2);
+      linbox_check(a.coldim() == b.rowdim());
+      size_t m = a.rowdim();
+      size_t k = a.coldim();
+      size_t n = b.coldim();
+      size_t s= a.size()+b.size()-1;
+      c.resize(s);
+      size_t lpts=0;
+      size_t pts  = 1; while (pts < s) { pts= pts<<1; ++lpts; }
+
+      // compute bit size of feasible prime for FFLAS
+      // size_t _k=k,lk=0;
+      //while ( _k ) {_k>>=1; ++lk;}
+      //size_t prime_bitsize= (53-lk)>>1;
+
+      // compute max prime value for FFLAS      
+      uint64_t prime_max= std::sqrt( (1ULL<<53) / k)+1;
+      std::vector<integer> bas;
+      getFFTPrime(prime_max,lpts,bound,bas);
+      // RandomFFTPrime RdFFT(prime_bitsize);
+      // if (!RdFFT.generatePrimes(lpts,bound,bas)){
+      // 	std::cout<<"COULD NOT FIND ENOUGH FFT PRIME in MatPoly FFTMUL taking normal primes..."<<std::endl;
+      //        exit(1);
+      // }
+	
+      std::vector<double> basis(bas.size());
+      std::copy(bas.begin(),bas.end(),basis.begin());
+      FFPACK::rns_double RNS(basis);
+      size_t num_primes = RNS._size;
+#ifdef FFT_PROFILER
+      //double tMul=0.,tCopy=0;;
+      if (FFT_PROF_LEVEL<3){
+	std::cout << "number of FFT primes :" << num_primes << std::endl;
+	std::cout << "max prime            : "<<prime_max<<" ("<<integer(prime_max).bitsize()<<")"<<std::endl;
+	std::cout << "bitsize of the output: "<<bound.bitsize()
+		  <<"( "<< RNS._M.bitsize()<<" )"<<std::endl;
+	std::cout <<" +++++++++++++++++++++++++++++++"<<std::endl;
+      }
+#endif
+      FFT_PROFILING(2,"init of CRT approach");
+      // reduce t_a and t_b modulo each FFT primes
+      size_t n_ta=m*k*a.size(), n_tb=k*n*b.size();
+      //size_t n_ta=m*k*pts, n_tb=k*n*pts;
+      //std::cout<<"----------------------------------------------"<<std::endl;
+      //std::cout<<"MUL FFT RNS: "<<MEMINFO<<std::endl;
+      std::cout<<"MUL FFT RNS: need "<<MB((m*n*pts+n_ta+n_tb)*num_primes*8 + 2*(m*k+k*n)*pts*8)<<"Mo"<<std::endl;
+      
+      //std::cout<<"MUL FFT RNS: RNS -> allocating "<<MB((n_ta+n_tb)*num_primes*8)<<"Mo"<<std::endl;
+      double* t_a_mod= new double[n_ta*num_primes];
+      double* t_b_mod= new double[n_tb*num_primes];
+      RNS.init(1, n_ta, t_a_mod, n_ta, a.getPointer(), n_ta, maxA);
+      RNS.init(1, n_tb, t_b_mod, n_tb, b.getPointer(), n_tb, maxB);
+      FFT_PROFILING(2,"reduction mod pi of input matrices");
+
+      std::vector<MatrixP_F*> c_i (num_primes);
+      //std::cout<<"MUL FFT RNS: RNS -> allocating "<<MB((m*n*pts)*num_primes*8)<<"Mo"<<std::endl;
+      //std::cout<<"MUL FFT RNS: RNS -> allocating "<<MB((2*(m*k+k*n)*pts)*8)<<"Mo"<<std::endl;
+
+      // FFT_PROFILE_START(2);
+      // auto sp=SPLITTER();
+      // PARFOR1D(l,num_primes,sp,
+      for (size_t l=0;l<num_primes;l++)
+	{
+	  //FFT_PROFILE_START;
+	  ModField f(RNS._basis[l]);
+	  MatrixP_F a_i (f, m, k, pts);
+	  MatrixP_F b_i (f, k, n, pts);
+	
+	  c_i[l] = new MatrixP_F(f, m, n, pts);
+	  // copy reduced data
+	  for (size_t i=0;i<m*k;i++)
+	    for (size_t j=0;j<a.size();j++)
+	      a_i.ref(i,j)=t_a_mod[l*n_ta+j+i*a.size()];
+	  for (size_t i=0;i<k*n;i++)
+	    for (size_t j=0;j<b.size();j++)
+	      b_i.ref(i,j)=t_b_mod[l*n_tb+j+i*b.size()];	
+	  //FFT_PROFILE_GET(tCopy);
+	  //PolynomialMatrixFFTPrimeMulDomain<ModField> fftdomain (f);
+	  PolynomialMatrixThreePrimesFFTMulDomain<ModField> fftdomain (f);       
+	  fftdomain.mul_fft(lpts, *c_i[l], a_i, b_i);	
+	  //FFT_PROFILE_GET(tMul);
+	}
+      //)
+      FFT_PROFILING(2,"FFTprime mult+copying");
+      delete[] t_a_mod;
+      delete[] t_b_mod;
+      //FFT_PROFILE(2,"copying linear reduced matrix",tCopy);
+      //FFT_PROFILE(2,"FFTprime multiplication",tMul);
+      
+      if (num_primes < 2) {
+	FFT_PROFILE_START(2);	
+	c.copy(*c_i[0],0,s-1);
+      } else {
+	FFT_PROFILE_START(2);
+	// construct contiguous storage for c_i
+	size_t n_tc=m*n*s;
+	//std::cout<<"MUL FFT RNS: RNS -> allocating "<<MB(n_tc*num_primes*8)<<"Mo"<<std::endl;
+	double *t_c_mod = new double[n_tc*num_primes];
+	for (size_t l=0;l<num_primes;l++){
+	  for (size_t i=0;i<m*n;i++)
+	    for (size_t j=0;j<s;j++)
+	      t_c_mod[l*n_tc + (j+i*s)]= c_i[l]->get(i,j);
+	  delete c_i[l];
+	}
+	FFT_PROFILING(2,"linearization of results mod pi");
+
+	// reconstruct the result in C
+	RNS.convert(1,n_tc,0,c.getWritePointer(),n_tc, t_c_mod, n_tc);
+	//std::cout<<"MUL FFT RNS: "<<MEMINFO<<std::endl;
+	//std::cout<<"----------------------------------------------"<<std::endl;
+	delete[] t_c_mod;
+
+      }
+      FFT_PROFILING(2,"k prime reconstruction");
+      // std::cout<<"CC:="<<c<<std::endl;
+      // std::cout<<"<-----------------: "<<std::endl;;
+    }
+
+    // WARNING: Polynomial Matrix should stored as matrix of polynomial with integer coefficient 
+    template< typename PMatrix1,typename PMatrix2, typename PMatrix3>
+    void mul_crtla2(PMatrix1 &c, const PMatrix2 &a, const PMatrix3 &b,
+		    const integer& maxA, const integer& maxB, const integer& bound) {
+
+      FFT_PROFILE_START(2);
+      linbox_check(a.coldim() == b.rowdim());
+      size_t m = a.rowdim();
+      size_t k = a.coldim();
+      size_t n = b.coldim();
+      size_t s= a.size()+b.size()-1;
+      c.resize(s);
+      size_t lpts=0;
+      size_t pts  = 1; while (pts < s) { pts= pts<<1; ++lpts; }
+
+      // compute max prime value for FFLAS      
+      uint64_t prime_max= std::sqrt( (1ULL<<53) / k)+1;
+      std::vector<integer> bas;
+      getFFTPrime(prime_max,lpts,bound,bas);
+      
+      std::vector<double> basis(bas.size());
+      std::copy(bas.begin(),bas.end(),basis.begin());
+      FFPACK::rns_double RNS(basis);
+      size_t num_primes = RNS._size;
+
+
+#ifdef FFT_PROFILER
+      //double tMul=0.,tCopy=0;;
+      if (FFT_PROF_LEVEL<3){
+	std::cout << "number of FFT primes :" << num_primes << std::endl;
+	std::cout << "max prime            : "<<prime_max<<" ("<<integer(prime_max).bitsize()<<")"<<std::endl;
+	std::cout << "bitsize of the output: "<<bound.bitsize()
+		  <<"( "<< RNS._M.bitsize()<<" )"<<std::endl;
+	std::cout <<" +++++++++++++++++++++++++++++++"<<std::endl;
+      }
+#endif
+
+
+      FFT_PROFILING(2,"init of CRT approach");
+      // reduce t_a and t_b modulo each FFT primes
+      size_t n_ta=m*k*a.size(), n_tb=k*n*b.size();
+      std::vector<MatrixP_F*> c_i (num_primes);
+
+ 
+      // loop for memory saving
+      size_t CRT_NBPRIME=4;
+      double* t_a_mod= new double[n_ta*CRT_NBPRIME];
+      double* t_b_mod= new double[n_tb*CRT_NBPRIME];
+      std::cout<<"MUL FFT RNS: input/output data: "<< MB((n_ta*(maxA.bitsize()+128) +n_tb*(maxB.bitsize()+128) +m*k*s*(bound.bitsize()+128))/8)<<"Mo"<<std::endl;
+      std::cout<<"MUL FFT RNS: initial need "<<MB((m*n*pts+n_ta+n_tb)*num_primes*8 + 2*(m*k+k*n)*pts*8)<<"Mo"<<std::endl;
+      std::cout<<"MUL FFT RNS: RNS  in: "<<MB( (n_ta+n_tb)*CRT_NBPRIME*8)<<"Mo"<<std::endl;
+      std::cout<<"MUL FFT RNS: RNC com: "<<MB(2*(m*k+k*n)*pts*8)<<"Mo"<<std::endl;
+      std::cout<<"MUL FFT RNS: RNS out: "<<MB((m*n*pts)*num_primes*8 )<<"Mo"<<std::endl;
+      
+      for(size_t loop=0;loop<num_primes;loop+=CRT_NBPRIME){
+	
+	// create chunk of RNS
+	size_t rns_chunk=std::min(CRT_NBPRIME,num_primes-loop); // nbr of primes in the current smallRNS basis
+	std::vector<double> smallBasis(rns_chunk);
+	std::copy(basis.begin()+loop,basis.begin()+loop+rns_chunk,smallBasis.begin());
+	FFPACK::rns_double smallRNS(smallBasis);
+	smallRNS.precompute_cst(RNS._ldm);
+
+	//std::cout<<"MUL FFT RNS: RNS -> allocating "<<MB((n_ta+n_tb)*num_primes*8)<<"Mo"<<std::endl;
+	smallRNS.init(1, n_ta, t_a_mod, n_ta, a.getPointer(), n_ta, maxA);
+	smallRNS.init(1, n_tb, t_b_mod, n_tb, b.getPointer(), n_tb, maxB);
+	FFT_PROFILING(2,"reduction mod pi of input matrices");
+
+	//std::cout<<"MUL FFT RNS: RNS -> allocating "<<MB((m*n*pts)*num_primes*8)<<"Mo"<<std::endl;
+	//std::cout<<"MUL FFT RNS: RNS -> allocating "<<MB((2*(m*k+k*n)*pts)*8)<<"Mo"<<std::endl;
+
+	for (size_t l=0;l<rns_chunk;l++)
+	  {	    
+	    //FFT_PROFILE_START;
+	    //std::cout<<"prime: "<<(long)smallRNS._basis[l]<<std::endl;
+	    ModField f(smallRNS._basis[l]);
+	    MatrixP_F a_i (f, m, k, pts);
+	    MatrixP_F b_i (f, k, n, pts);	
+	    c_i[loop+l] = new MatrixP_F(f, m, n, pts);
+	    // copy reduced data
+	    for (size_t i=0;i<m*k;i++)
+	      for (size_t j=0;j<a.size();j++)
+		a_i.ref(i,j)=t_a_mod[l*n_ta+j+i*a.size()];
+	    for (size_t i=0;i<k*n;i++)
+	      for (size_t j=0;j<b.size();j++)
+		b_i.ref(i,j)=t_b_mod[l*n_tb+j+i*b.size()];	
+	    //FFT_PROFILE_GET(tCopy);
+	    //PolynomialMatrixFFTPrimeMulDomain<ModField> fftdomain (f);
+	    PolynomialMatrixThreePrimesFFTMulDomain<ModField> fftdomain (f);       
+	    fftdomain.mul_fft(lpts, *c_i[loop+l], a_i, b_i);	
+	    //FFT_PROFILE_GET(tMul);
+	  }      
+	FFT_PROFILING(2,"FFTprime mult+copying");
+	//FFT_PROFILE(2,"copying linear reduced matrix",tCopy);
+	//FFT_PROFILE(2,"FFTprime multiplication",tMul);
+
+      } // end of loop for memory saving
+	delete[] t_a_mod;
+	delete[] t_b_mod;
+	
+      
+      if (num_primes < 2) {
+	FFT_PROFILE_START(2);	
+	c.copy(*c_i[0],0,s-1);
+      } else {
+	FFT_PROFILE_START(2);
+	// construct contiguous storage for c_i
+	size_t n_tc=m*n*s;
+	//std::cout<<"MUL FFT RNS: RNS -> allocating "<<MB(n_tc*num_primes*8)<<"Mo"<<std::endl;
+	double *t_c_mod = new double[n_tc*num_primes];
+	for (size_t l=0;l<num_primes;l++){
+	  for (size_t i=0;i<m*n;i++)
+	    for (size_t j=0;j<s;j++)
+	      t_c_mod[l*n_tc + (j+i*s)]= c_i[l]->get(i,j);
+	  delete c_i[l];
+	}
+	FFT_PROFILING(2,"linearization of results mod pi");
+
+	// reconstruct the result in C
+	RNS.convert(1,n_tc,0,c.getWritePointer(),n_tc, t_c_mod, n_tc);
+	//std::cout<<"MUL FFT RNS: "<<MEMINFO<<std::endl;
+	//std::cout<<"----------------------------------------------"<<std::endl;
+	delete[] t_c_mod;
+
+      }
+      FFT_PROFILING(2,"k prime reconstruction");
+      // std::cout<<"CC:="<<c<<std::endl;
+      // std::cout<<"<-----------------: "<<std::endl;;
+    }
+
+
+
+    // template< typename PMatrix1,typename PMatrix2, typename PMatrix3>
+    // void midproduct_crtla(PMatrix1 &c, const PMatrix2 &a, const PMatrix3 &b,
+    // 			  const integer& maxA, const integer& maxB, const integer& bound,
+    // 			  bool smallLeft=true, size_t n0=0, size_t n1=0) {
+    //   // (convert to MatrixP representation)
+    //   MatrixP_I a2(field(),a.rowdim(),a.coldim(),a.size());
+    //   MatrixP_I b2(field(),b.rowdim(),b.coldim(),b.size());
+    //   a2.copy(a,0,a.size()-1);
+    //   b2.copy(b,0,b.size()-1);
+    //   MatrixP_I c2(field(),c.rowdim(),c.coldim(),c.size());
+    //   midproduct_crtla(c2,a2,b2,maxA,maxB,bound,smallLeft,n0,n1);
+    //   c.copy(c2,0,c2.size()-1);
+    // }
+
+    // WARNING: Polynomial Matrix should stored as matrix of polynomial with integer coefficient 
+    template< typename PMatrix1,typename PMatrix2, typename PMatrix3>
+    void midproduct_crtla(PMatrix1 &c, const PMatrix2 &a, const PMatrix3 &b,
+			  const integer& maxA, const integer& maxB, const integer& bound,
+			  bool smallLeft=true, size_t n0=0, size_t n1=0) {
+      // void midproduct_crtla(MatrixP_I &c, const MatrixP_I &a, const MatrixP_I &b,
+      // 			  const integer& maxA, const integer& maxB, const integer& bound,
+      // 			  bool smallLeft=true, size_t n0=0, size_t n1=0) {
+      FFT_PROFILE_START(2);
+      linbox_check(a.coldim() == b.rowdim());
+      size_t m = a.rowdim();
+      size_t k = a.coldim();
+      size_t n = b.coldim();
+      size_t hdeg = (n0==0?c.size():n0);
+      size_t deg  = (n1==0?2*hdeg:n1);
+      linbox_check(c.size()>=deg-hdeg);
+      
+      if (smallLeft){
+      	linbox_check(b.size()<hdeg+deg);
+      }
+      else
+      	linbox_check(a.size()<hdeg+deg);
+
+      //linbox_check(2*c.size()-1 == b.size());
+      //size_t deg= b.size()+1;
+      //size_t hdeg= deg/2;
+      size_t lpts=0;
+      size_t pts  = 1; while (pts < deg) { pts= pts<<1; ++lpts; }
+
+
+      // compute bit size of feasible prime for FFLAS
+      // size_t _k=k,lk=0;
+      //while ( _k ) {_k>>=1; ++lk;}
+      //size_t prime_bitsize= (53-lk)>>1;
+
+      // compute max prime value for FFLAS
+      uint64_t prime_max= std::sqrt( (1ULL<<53) / k)+1;
+      std::vector<integer> bas;
+      getFFTPrime(prime_max,lpts,bound,bas);
+      //RandomFFTPrime RdFFT(prime_bitsize);
+      // if (!RdFFT.generatePrimes(bound,bas)){
+      // 	std::cout<<"COULD NOT FIND ENOUGH FFT PRIME in MatPoly FFTMUL exiting..."<<std::endl;
+      // 	throw LinboxError("LinBox ERROR: not enough FFT Prime\n");
+      // }
+
+      std::vector<double> basis(bas.size());
+      std::copy(bas.begin(),bas.end(),basis.begin());
+      FFPACK::rns_double RNS(basis);
+      size_t num_primes = RNS._size;
+#ifdef FFT_PROFILER
+      double tMul=0.,tCopy=0;;
+      if (FFT_PROF_LEVEL<3){
+	std::cout << "number of FFT primes :" << num_primes << std::endl;
+	std::cout << "max prime            : "<<prime_max<<" ("<<integer(prime_max).bitsize()<<")"<<std::endl;
+	std::cout << "bitsize of the output: "<<bound.bitsize()
+		  <<"( "<< RNS._M.bitsize()<<" )"<<std::endl;
+	std::cout <<" +++++++++++++++++++++++++++++++"<<std::endl;
+      }
+#endif
+      FFT_PROFILING(2,"init of CRT approach");
+      // reduce t_a and t_b modulo each FFT primes
+      size_t n_ta=m*k*a.size(), n_tb=k*n*b.size();
+      double* t_a_mod= new double[n_ta*num_primes];
+      double* t_b_mod= new double[n_tb*num_primes];
+      RNS.init(1, n_ta, t_a_mod, n_ta, a.getPointer(), n_ta, maxA);
+      RNS.init(1, n_tb, t_b_mod, n_tb, b.getPointer(), n_tb, maxB);
+      FFT_PROFILING(2,"reduction mod pi of input matrices");
+
+      //std::cout<<"----------------------------------------------"<<std::endl;
+      //std::cout<<"MIDP FFT RNS: "<<MEMINFO<<std::endl;
+      //std::cout<<"MIDP FFT RNS: need "<<MB((m*n*pts+n_ta+n_tb)*num_primes*8 + 2*(m*k+k*n)*pts*8)<<"Mo"<<std::endl;
+
+      
+      //std::cout<<"MIDP FFT RNS: RNS -> allocating "<<MB((n_ta+n_tb)*num_primes*8)<<"Mo"<<std::endl;
+      //std::cout<<"MIDP FFT RNS: RNS -> allocating "<<MB((m*n)*pts*num_primes*8)<<"Mo"<<std::endl;
+      //std::cout<<"MIDP FFT RNS: "<<MEMINFO<<std::endl;
+
+      std::vector<MatrixP_F*> c_i (num_primes);
+
+      for (size_t l=0;l<num_primes;l++){
+	FFT_PROFILE_START(2);
+	ModField f(RNS._basis[l]);
+	MatrixP_F a_i (f, m, k, pts);
+	MatrixP_F b_i (f, k, n, pts);
+	c_i[l] = new MatrixP_F(f, m, n, pts);
+	// copy reduced data and reversed when necessary according to midproduct algo
+	//std::cout<<"hdeg-size: "<<hdeg<<" <-> "<<a.size()<<std::endl;
+	for (size_t i=0;i<m*k;i++)
+	  for (size_t j=0;j<a.size();j++)
+	    if (smallLeft)
+	      a_i.ref(i,hdeg-1-j)=t_a_mod[l*n_ta+j+i*a.size()];
+	    else
+	      a_i.ref(i,j)=t_a_mod[l*n_ta+j+i*a.size()];
+	for (size_t i=0;i<k*n;i++)
+	  for (size_t j=0;j<b.size();j++)
+	    if (smallLeft)
+	      b_i.ref(i,j)=t_b_mod[l*n_tb+j+i*b.size()];
+	    else
+	      b_i.ref(i,hdeg-1-j)=t_b_mod[l*n_tb+j+i*b.size()];
+	FFT_PROFILE_GET(2,tCopy);
+	//PolynomialMatrixFFTPrimeMulDomain<ModField> fftdomain (f);
+	PolynomialMatrixThreePrimesFFTMulDomain<ModField> fftdomain (f);       
+	fftdomain.midproduct_fft(lpts, *(c_i[l]), a_i, b_i, smallLeft);
+				
+	FFT_PROFILE_GET(2,tMul);
+      }
+      delete[] t_a_mod;
+      delete[] t_b_mod;
+      FFT_PROFILE(2,"copying linear reduced matrix",tCopy);
+      FFT_PROFILE(2,"FFTprime multiplication",tMul);
+
+      if (num_primes < 2) {
+	FFT_PROFILE_START(2);
+	c.copy(*(c_i[0]),0,c.size()-1);
+      } else {
+	FFT_PROFILE_START(2);
+	// construct contiguous storage for c_i
+	double *t_c_mod;
+	size_t n_tc=m*n*c.size();
+	t_c_mod = new double[n_tc*num_primes];
+	for (size_t l=0;l<num_primes;l++){
+	  for (size_t i=0;i<m*n;i++)
+	    for (size_t j=0;j<c.size();j++)
+	      t_c_mod[l*n_tc + (j+i*c.size())]= c_i[l]->get(i,j);
+	  delete c_i[l];
+	}
+	FFT_PROFILING(2,"linearization of results mod pi");
+
+	// reconstruct the result in C
+	RNS.convert(1,n_tc,0,c.getWritePointer(),n_tc, t_c_mod, n_tc);
+	//std::cout<<"MIDP FFT RNS: "<<MEMINFO<<std::endl;
+	delete[] t_c_mod;
+
+	//std::cout<<"MUL FFT RNS: "<<MEMINFO<<std::endl;
+	//std::cout<<"----------------------------------------------"<<std::endl;
+
+	FFT_PROFILING(2,"k prime reconstruction");
+      }
+    }
+  };
+
+
+  /***************************************************************************
+   **** Polynomial Matrix Multiplication over Fp[x], with p multiprecision ***
+   ***************************************************************************/
+  template <>
+  class PolynomialMatrixFFTMulDomain<Givaro::Modular<integer> > {
+  public:
+    typedef Givaro::Modular<integer>              Field;
+    typedef typename Field::Element     Element;
+    typedef Givaro::ZRing<integer>  IntField;
+    // Polynomial matrix stored as a polynomial of matrix
+    typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,Field> MatrixP_F;
+    // Polynomial matrix stored as a polynomial of matrix
+    typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,IntField> MatrixP_I;
+
+  private:
+    const Field            *_field;  // Read only
+    integer                     _p;
+
+  public:
+    inline const Field & field() const { return *_field; }
+
+    PolynomialMatrixFFTMulDomain(const Field &F) : _field(&F) {
+      field().cardinality(_p);
+    }
+
+    template<typename Matrix1, typename Matrix2, typename Matrix3>
+    void mul (Matrix1 &c, const Matrix2 &a, const Matrix3 &b) {
+      FFT_PROFILE_START(2);
+      MatrixP_F a2(field(),a.rowdim(),a.coldim(),a.size());
+      MatrixP_F b2(field(),b.rowdim(),b.coldim(),b.size());
+      MatrixP_F c2(field(),c.rowdim(),c.coldim(),c.size());
+      a2.copy(a,0,a.size()-1);
+      b2.copy(b,0,b.size()-1);
+      FFT_PROFILING(2,"converting rep of input");
+      mul(c2,a2,b2);
+      FFT_PROFILE_START(2);
+      c.copy(c2,0,c.size()-1);
+      FFT_PROFILING(2,"converting rep of output");
+
+    }
+    
+    // Matrix with polynomials  
+    void mul (MatrixP_F &c, const MatrixP_F &a, const MatrixP_F &b) {
+      
+      FFT_PROFILE_START(2);
+      IntField Z;      
+      PolynomialMatrixFFTMulDomain<IntField> Zmul(Z,_p);
+      integer bound=2*_p*_p*integer((uint64_t)a.coldim())*integer((uint64_t)std::min(a.size(),b.size()));
+      //Zmul.mul_crtla(c,a,b,_p,_p,bound);
+      Zmul.mul_crtla2(c,a,b,_p,_p,bound); 
+      
+      // reduce the result mod p
+      FFT_PROFILE_START(2);
+      for (size_t i=0;i<c.rowdim()*c.coldim();i++)
+	for (size_t j=0;j<c.size();j++)
+	  c.ref(i,j)%=_p;
+      FFT_PROFILING(2,"reduction mod p of output");
+    }
+
+    template<typename Matrix1, typename Matrix2, typename Matrix3>
+    void midproduct (Matrix1 &c, const Matrix2 &a, const Matrix3 &b,
+		     bool smallLeft=true, size_t n0=0, size_t n1=0) {
+
+      MatrixP_F a2(field(),a.rowdim(),a.coldim(),a.size());
+      MatrixP_F b2(field(),b.rowdim(),b.coldim(),b.size());
+      a2.copy(a,0,a.size()-1);
+      b2.copy(b,0,b.size()-1);
+      MatrixP_F c2(field(),c.rowdim(),c.coldim(),c.size());
+      midproduct(c2,a2,b2,smallLeft,n0,n1);
+      c.copy(c2,0,c.size()-1);
+    }
+
+    void midproduct (MatrixP_F &c, const MatrixP_F &a, const MatrixP_F &b,
+		     bool smallLeft=true, size_t n0=0, size_t n1=0) {
+      IntField Z;
+      PolynomialMatrixFFTMulDomain<IntField> Zmul(Z,_p);
+      //const MatrixP_I* a2 = reinterpret_cast<const MatrixP_I*>(&a);
+      //const MatrixP_I* b2 = reinterpret_cast<const MatrixP_I*>(&b);
+      //MatrixP_I* c2       = reinterpret_cast<MatrixP_I*>(&c);
+      //Zmul.midproduct(*c2,*a2,*b2,smallLeft,n0,n1);
+      Zmul.midproduct(c,a,b,smallLeft,n0,n1);
+      // reduce the result mod p
+      FFT_PROFILE_START(2);
+      for (size_t i=0;i<c.rowdim()*c.coldim();i++)
+	for (size_t j=0;j<c.size();j++)
+	  c.ref(i,j)%=_p;
+      FFT_PROFILING(2,"reduction mod p of output");
+    }
+  };
+
+
+
+
+
+
+} // end of namespace LinBox
+
+#endif // __LINBOX_matpoly_mult_ftt_multiprecision_INL
diff --git a/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize-fast.inl b/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize-fast.inl
new file mode 100644
index 0000000..50e260d
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize-fast.inl
@@ -0,0 +1,314 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013  Pascal Giorgi
+ *                     Romain Lebreton
+ *
+ * Written by Pascal Giorgi   <pascal.giorgi at lirmm.fr>
+ *            Romain Lebreton <lebreton at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+#ifndef __LINBOX_matpoly_mult_ftt_wordsize_fast_INL
+#define __LINBOX_matpoly_mult_ftt_wordsize_fast_INL
+
+#include "givaro/modular.h"
+#include "fflas-ffpack/fflas-ffpack.h"
+#include "linbox/matrix/polynomial-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/algorithms/polynomial-matrix/polynomial-fft-transform.h"
+
+namespace LinBox {
+
+	/***********************************************************************************
+	 **** Polynomial Matrix Multiplication over Zp[x] with p (FFTPrime, FFLAS prime) ***
+	 ***********************************************************************************/
+	template<class Field>
+	class PolynomialMatrixFFTPrimeMulDomain {
+
+		//typedef Givaro::Modular<T>    Field;
+	public:
+		// Polynomial matrix stored as a matrix of polynomial
+		typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,Field> MatrixP;
+		// Polynomial matrix stored as a polynomial of matrix
+		typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> PMatrix;
+
+	private:
+		const Field              *_field;  // Read only
+		uint64_t                      _p;
+		BlasMatrixDomain<Field>     _BMD;
+
+	public:
+		inline const Field & field() const { return *_field; }
+
+		PolynomialMatrixFFTPrimeMulDomain(const Field &F)
+			: _field(&F), _p(field().cardinality()),  _BMD(F){}
+
+		template<typename Matrix1, typename Matrix2, typename Matrix3>
+		void mul (Matrix1 &c, const Matrix2 &a, const Matrix3 &b) {
+			linbox_check(a.coldim()==b.rowdim());
+			size_t deg  = a.size()+b.size()-1;
+			size_t lpts = 0;
+			size_t pts  = 1; while (pts < deg) { pts= pts<<1; ++lpts; }
+			// padd the input a and b to 2^lpts (convert to MatrixP representation)
+			MatrixP a2(field(),a.rowdim(),a.coldim(),pts);
+			MatrixP b2(field(),b.rowdim(),b.coldim(),pts);
+			a2.copy(a,0,a.size()-1);
+			b2.copy(b,0,b.size()-1);
+			MatrixP c2(field(),c.rowdim(),c.coldim(),pts);
+			mul_fft (lpts,c2, a2, b2);
+			c.copy(c2,0,deg-1);
+		}
+
+		void mul (MatrixP &c, const MatrixP &a, const MatrixP &b) {
+			linbox_check(a.coldim()==b.rowdim());
+			size_t deg  = a.size()+b.size()-1;
+			size_t lpts = 0;
+			size_t pts  = 1; while (pts < deg) { pts= pts<<1; ++lpts; }
+			
+			// padd the input a and b to 2^lpts
+			MatrixP a2(field(),a.rowdim(),a.coldim(),pts);
+			MatrixP b2(field(),b.rowdim(),b.coldim(),pts);
+			a2.copy(a,0,a.size()-1);
+			b2.copy(b,0,b.size()-1);
+			// resize c to 2^lpts
+			c.resize(pts);
+			mul_fft (lpts,c, a2, b2);
+			c.resize(deg);
+		}
+
+		// a,b and c must have size: 2^lpts
+		// -> use TFT to circumvent the padding issue
+		void mul_fft (size_t lpts, MatrixP &c, MatrixP &a, MatrixP &b) {
+			FFT_PROFILE_START(1);
+			size_t m = a.rowdim();
+			size_t k = a.coldim();
+			size_t n = b.coldim();
+			size_t pts=c.size();
+			//std::cout<<"mul : 2^"<<lpts<<std::endl;
+#ifdef FFT_PROFILER
+			Timer totalTime;
+			totalTime.start();
+			if (FFT_PROF_LEVEL==1) std::cout<<"FFT: points "<<pts<<"\n";
+#endif
+
+			if ((_p-1) % pts != 0) {
+				std::cout<<"Error the prime is not a FFTPrime or it has too small power of 2\n";
+				std::cout<<"prime="<<_p<<std::endl;
+				std::cout<<"nbr points="<<pts<<std::endl;
+				throw LinboxError("LinBox ERROR: bad FFT Prime\n");
+			}
+			FFT_transform<Field> FFTer (field(), lpts);
+			FFT_transform<Field> FFTinv (field(), lpts, FFTer.getInvRoot());
+			FFT_PROFILING(1,"init");
+
+			// std::cout<<"FFT Root: "<<FFTer.getRoot()<<std::endl;
+			// std::cout<<"FFT InvRoot: "<<FFTer.getInvRoot()<<std::endl;
+			// std::cout<<a<<std::endl;
+			// std::cout<<b<<std::endl;
+			
+			// FFT transformation on the input matrices
+			for (size_t i = 0; i < m * k; i++)
+				FFTer.FFT_DIF(&(a.ref(i,0)));
+			for (size_t i = 0; i < k * n; i++)
+				FFTer.FFT_DIF(&(b.ref(i,0)));
+			FFT_PROFILING(1,"direct FFT_DIF");
+			
+			//std::cout<<"DIF:  w="<<FFTer._w<<std::endl;
+			//std::cout<<a<<std::endl;
+			//std::cout<<b<<std::endl;
+			
+			
+			// convert the matrix representation to matfirst (with double coefficient)
+			PMatrix vm_c (field(), m, n, pts);
+#ifdef TRY1
+			BlasMatrix<Field> vm_a(field(),m,k);
+			BlasMatrix<Field> vm_b(field(),k,n);
+			FFT_PROFILING(1,"creation of Matfirst");
+
+			// Pointwise multiplication
+			for (size_t i = 0; i < pts; ++i){
+				a.setMatrix(vm_a,i);
+				b.setMatrix(vm_b,i);
+				_BMD.mul(vm_c[i], vm_a, vm_b);
+			}
+			FFT_PROFILING(1,"Pointwise mult");
+			
+#else
+			PMatrix vm_a (field(), m, k, pts);
+			PMatrix vm_b (field(), k, n, pts);
+			FFT_PROFILING(1,"creation of Matfirst");
+			vm_a.copy(a);
+			vm_b.copy(b);
+			FFT_PROFILING(1,"Polfirst to Matfirst");
+
+			// Pointwise multiplication
+			for (size_t i = 0; i < pts; ++i)
+				_BMD.mul(vm_c[i], vm_a[i], vm_b[i]);
+			FFT_PROFILING(1,"Pointwise mult");
+#endif			
+			// Transformation into matrix of polynomials (with int32_t coefficient)
+			c.copy(vm_c);
+			FFT_PROFILING(1,"Matfirst to Polfirst");
+
+			//std::cout<<"pointwise:"<<std::endl;
+			//std::cout<<c<<std::endl;			
+			
+			// Inverse FFT on the output matrix
+			for (size_t i = 0; i < m * n; i++)
+				FFTinv.FFT_DIT(&(c.ref(i,0)));
+			FFT_PROFILING(1,"inverse FFT_DIT");
+
+			// std::cout<<"DIT:"<<std::endl;
+			// std::cout<<c<<std::endl;
+
+			// Divide by pts = 2^lpts
+			typename Field::Element inv_pts;
+			field().init(inv_pts, pts);
+			field().invin(inv_pts);
+			// for (size_t i = 0; i < m * n; i++)
+			// 	for (size_t j = 0; j < pts; j++)
+			// 		field().mulin(c.ref(i,j), inv_pts);
+			FFLAS::fscalin(field(),c.rowdim()*c.coldim()*c.size(), inv_pts,  c.getWritePointer(),1);
+
+			// std::cout<<"SCALIN:"<<std::endl;
+			// std::cout<<c<<std::endl;
+
+			FFT_PROFILING(1,"scaling the result");
+#ifdef FFT_PROFILER
+			totalTime.stop();
+			//std::cout<<"FFT(1): total time : "<<totalTime<<std::endl;
+#endif
+		}
+
+		// compute  c= (a*b x^(-n0-1)) mod x^n1
+		// by defaut: n0=c.size() and n1=2*c.size();
+		template<typename Matrix1, typename Matrix2, typename Matrix3>
+		void midproduct (Matrix1 &c, const Matrix2 &a, const Matrix3 &b,
+				 bool smallLeft=true, size_t n0=0,size_t n1=0) {
+			linbox_check(a.coldim()==b.rowdim());
+			size_t hdeg = (n0==0?c.size():n0);
+			size_t deg  = (n1==0?2*hdeg:n1);
+			linbox_check(c.size()>=deg-hdeg);
+			if (smallLeft){
+				linbox_check(b.size()<hdeg+deg);
+			}
+			else
+				linbox_check(a.size()<hdeg+deg);
+
+			size_t lpts = 0;
+			size_t pts  = 1; while (pts < deg) { pts= pts<<1; ++lpts; }
+			// padd the input a and b to 2^lpts (use MatrixP representation)
+			MatrixP a2(field(),a.rowdim(),a.coldim(),pts);
+			MatrixP b2(field(),b.rowdim(),b.coldim(),pts);
+			MatrixP c2(field(),c.rowdim(),c.coldim(),pts);
+			a2.copy(a,0,a.size()-1);
+			b2.copy(b,0,b.size()-1);
+
+			// reverse the element of the smallest polynomial according to h(x^-1)*x^(hdeg)
+			if (smallLeft)
+				for (size_t j=0;j<a2.rowdim()*a2.coldim();j++)
+					for (size_t i=0;i<hdeg/2;i++)
+						std::swap(a2.ref(j,i),a2.ref(j,hdeg-1-i));
+			else
+				for (size_t j=0;j<b2.rowdim()*b2.coldim();j++)
+					for (size_t i=0;i<hdeg/2;i++)
+						std::swap(b2.ref(j,i),b2.ref(j,hdeg-1-i));
+
+			midproduct_fft (lpts,c2, a2, b2, smallLeft);
+			c.copy(c2,0,c.size()-1);
+		}
+
+		// a,b and c must have size: 2^lpts
+		// -> a must have been already reversed according to the midproduct algorithm
+		void midproduct_fft (size_t lpts, MatrixP &c, MatrixP &a, MatrixP &b,
+				     bool smallLeft=true) {
+			FFT_PROFILE_START(1);
+			size_t m = a.rowdim();
+			size_t k = a.coldim();
+			size_t n = b.coldim();
+			size_t pts=c.size();
+			//cout<<"mid : "<<pts<<endl;
+#ifdef FFT_PROFILER
+			if (FFT_PROF_LEVEL==1) std::cout<<"FFT: points "<<pts<<"\n";
+#endif
+			if ((_p-1) % pts != 0) {
+				std::cout<<"Error the prime is not a FFTPrime or it has too small power of 2\n";
+				std::cout<<"prime="<<_p<<std::endl;
+				std::cout<<"nbr points="<<pts<<std::endl;
+				throw LinboxError("LinBox ERROR: bad FFT Prime\n");
+			}
+			FFT_transform<Field> FFTer (field(), lpts);
+			FFT_transform<Field> FFTinv(field(), lpts, FFTer.getInvRoot());
+			FFT_PROFILING(1,"init");
+
+			// FFT transformation on the input matrices
+			if (smallLeft){
+				for (size_t i = 0; i < m * k; i++)
+					FFTer.FFT_DIF(&(a(i)[0]));
+				for (size_t i = 0; i < k * n; i++)
+					FFTinv.FFT_DIF(&(b(i)[0]));
+			}
+			else {
+				for (size_t i = 0; i < m * k; i++)
+					FFTinv.FFT_DIF(&(a(i)[0]));
+				for (size_t i = 0; i < k * n; i++)
+					FFTer.FFT_DIF(&(b(i)[0]));
+			}
+			FFT_PROFILING(1,"direct FFT_DIF");
+
+			// convert the matrix representation to matfirst (with double coefficient)
+			PMatrix vm_c (field(), m, n, pts);
+			PMatrix vm_a (field(), m, k, pts);
+			PMatrix vm_b (field(), k, n, pts);
+			FFT_PROFILING(1,"creation of Matfirst");
+			vm_a.copy(a);
+			vm_b.copy(b);
+			FFT_PROFILING(1,"Polfirst to Matfirst");
+
+			// Pointwise multiplication
+			for (size_t i = 0; i < pts; ++i)
+				_BMD.mul(vm_c[i], vm_a[i], vm_b[i]);
+			FFT_PROFILING(1,"pointwise mult");
+
+			// Transformation into matrix of polynomials (with int32_t coefficient)
+			c.copy(vm_c);
+			FFT_PROFILING(1,"Matfirst to Polfirst");
+
+			// Inverse FFT on the output matrix
+			for (size_t i = 0; i < m * n; i++)
+				FFTer.FFT_DIT(&(c(i)[0]));
+			FFT_PROFILING(1,"inverse FFT_DIT");
+
+			// Divide by pts = 2^ltps
+			typename Field::Element inv_pts;
+			field().init(inv_pts, pts);
+			field().invin(inv_pts);
+			// for (size_t i = 0; i < m * n; i++)
+			// 	for (size_t j = 0; j < pts; j++)
+			// 		field().mulin(c.ref(i,j), inv_pts);
+			FFLAS::fscalin(field(),c.rowdim()*c.coldim()*c.size(), inv_pts,  c.getWritePointer(),1);
+			FFT_PROFILING(1,"scaling the result");
+		}
+	}; // end of class special FFT mul domain
+
+
+
+}//end of namespace LinBox
+
+#endif // __LINBOX_matpoly_mult_ftt_wordsize_fast_INL
diff --git a/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize-three-primes.inl b/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize-three-primes.inl
new file mode 100644
index 0000000..e68d0dc
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize-three-primes.inl
@@ -0,0 +1,291 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2015  Pascal Giorgi
+ *
+ * Written by Pascal Giorgi   <pascal.giorgi at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+#ifndef __LINBOX_matpoly_mult_ftt_wordsize_three_primes_INL
+#define __LINBOX_matpoly_mult_ftt_wordsize_three_primes_INL
+
+#include "givaro/modular.h"
+#include "fflas-ffpack/fflas-ffpack.h"
+#include "linbox/matrix/polynomial-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/algorithms/polynomial-matrix/polynomial-fft-transform.h"
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize-fast.inl"
+#include "linbox/randiter/random-fftprime.h"
+#include <cmath>
+
+namespace LinBox {
+
+	/***********************************************************************************
+	 **** Polynomial Matrix Multiplication over Zp[x] with p (FFLAS prime) ***
+	 ***********************************************************************************/
+	template<class Field>
+	class PolynomialMatrixThreePrimesFFTMulDomain {
+	public:
+		// Polynomial matrix stored as a matrix of polynomial
+		typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,Field> MatrixP;
+		// Polynomial matrix stored as a polynomial of matrix
+		typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> PMatrix;
+		//typedef Givaro::Modular<double>                ModField;
+		typedef Field ModField;
+	private:
+		const Field              *_field;  // Read only
+		uint64_t                      _p;
+	  
+	public:
+		inline const Field & field() const { return *_field; }
+	  
+		PolynomialMatrixThreePrimesFFTMulDomain(const Field &F)
+			: _field(&F), _p(field().cardinality())
+		{
+			if (integer(_p).bitsize()>29) {
+				std::cout<<"MatPoly MUL FFT 3-primes: error initial prime has more than 29 bits exiting.."<<std::endl;
+				throw LinboxError("LinBox ERROR: too large FFT Prime (more than 29 bits \n");
+			}
+		}
+
+		template<typename Matrix1, typename Matrix2, typename Matrix3>
+		void mul (Matrix1 &c, const Matrix2 &a, const Matrix3 &b) {
+			linbox_check(a.coldim()==b.rowdim());
+			size_t deg  = a.size()+b.size()-1;
+			size_t lpts = 0;
+			size_t pts  = 1; while (pts < deg) { pts= pts<<1; ++lpts; }
+			// padd the input a and b to 2^lpts (convert to MatrixP representation)
+			MatrixP a2(field(),a.rowdim(),a.coldim(),pts);
+			MatrixP b2(field(),b.rowdim(),b.coldim(),pts);
+			a2.copy(a,0,a.size()-1);
+			b2.copy(b,0,b.size()-1);
+			MatrixP c2(field(),c.rowdim(),c.coldim(),pts);
+			mul_fft (lpts,c2, a2, b2);
+			c.copy(c2,0,deg-1);
+		}
+
+		void mul (MatrixP &c, const MatrixP &a, const MatrixP &b) {
+			linbox_check(a.coldim()==b.rowdim());
+			size_t deg  = a.size()+b.size()-1;
+			size_t lpts = 0;
+			size_t pts  = 1; while (pts < deg) { pts= pts<<1; ++lpts; }
+			// padd the input a and b to 2^lpts
+			MatrixP a2(field(),a.rowdim(),a.coldim(),pts);
+			MatrixP b2(field(),b.rowdim(),b.coldim(),pts);
+			a2.copy(a,0,a.size()-1);
+			b2.copy(b,0,b.size()-1);
+			// resize c to 2^lpts
+			c.resize(pts);
+			mul_fft (lpts,c, a2, b2);
+			c.resize(deg);
+		}
+
+		void mul_fft (size_t lpts, MatrixP &c, MatrixP &a, MatrixP &b) {
+			size_t pts=c.size();
+			if ((_p-1) % pts == 0){
+				PolynomialMatrixFFTPrimeMulDomain<ModField> fftprime_domain (field());
+				fftprime_domain.mul_fft(lpts,c,a,b);
+				return;
+			}			
+			//std::cout<<"a:="<<a<<std::endl;
+			//std::cout<<"b:="<<b<<std::endl;			
+			linbox_check(a.coldim() == b.rowdim());
+			size_t m = a.rowdim();
+			size_t k = a.coldim();
+			size_t n = b.coldim();
+			
+
+			integer bound=integer((uint64_t)_p)*integer((uint64_t)_p)*integer((uint64_t)k)*integer((uint64_t)pts);
+			// compute bit size of feasible prime for FFLAS
+			// size_t _k=k,lk=0;
+			// while ( _k ) {_k>>=1; ++lk;}
+			// size_t prime_bitsize= (53-lk)>>1;
+
+			// compute max prime value for FFLAS
+			uint64_t prime_max= std::sqrt( (1ULL<<53) / k)+1;
+			RandomFFTPrime RdFFT(prime_max);
+			std::vector<integer> bas;
+			if (!RdFFT.generatePrimes(lpts,bound,bas)){
+				std::cout<<"COULD NOT FIND ENOUGH FFT PRIME in MatPoly 3-Primes FFT MUL exiting..."<<std::endl;
+				std::cout<<"Parameters : ("<<m<<"x"<<k<<") ("<<k<<"x"<<n<<") with "<<pts<<" points with prime= "<<_p<<std::endl; 
+				throw LinboxError("LinBox ERROR: not enough FFT Prime\n");
+			}
+			//std::cout<<"MUL FFT 3-PRIME found enough prime"<<std::endl;
+			size_t num_primes = bas.size();
+			std::vector<double> basis(num_primes);
+			std::copy(bas.begin(),bas.end(),basis.begin());
+	    
+			std::vector<MatrixP*> c_i (num_primes);
+			std::vector<ModField> f(num_primes,ModField(2));
+			for (size_t l=0;l<num_primes;l++)
+				f[l]=ModField(basis[l]);
+	    
+			for (size_t l=0;l<num_primes;l++){
+				PolynomialMatrixFFTPrimeMulDomain<ModField> fftdomain (f[l]);
+				MatrixP ai(f[l],m,k,pts);
+				MatrixP bi(f[l],k,n,pts);
+				FFLAS::fassign(f[l],m*k*pts,a.getPointer(),1,ai.getWritePointer(),1);
+				FFLAS::fassign(f[l],k*n*pts,b.getPointer(),1,bi.getWritePointer(),1);
+				c_i[l] = new MatrixP(f[l], m, n, pts);
+				fftdomain.mul_fft(lpts, *c_i[l], ai, bi);				
+				//std::cout<<"pi:="<<(uint64_t)basis[l]<<std::endl;
+				//std::cout<<"ci:="<<*c_i[l]<<std::endl;
+			}
+	    
+			// reconstruct the result with MRS
+			typename Field::Element alpha;
+			typename Field::Element beta=field().one;
+			FFLAS::freduce(field(),m*n*c.size(),c_i[0]->getPointer(),1,c.getWritePointer(),1);
+			for (size_t i=1;i<num_primes;i++){
+				for(size_t j=0;j<i;j++){
+					f[i].init(alpha,basis[j]);
+					f[i].invin(alpha);
+					FFLAS::fsubin (f[i],m*n*pts,c_i[j]->getPointer(),1,c_i[i]->getWritePointer(),1);
+					FFLAS::fscalin(f[i],m*n*pts,alpha,c_i[i]->getWritePointer(),1);
+				}
+				field().mulin(beta,basis[i-1]);
+				FFLAS::faxpy(field(),m*n*pts,beta,c_i[i]->getPointer(),1,c.getWritePointer(),1);
+			}
+
+			//std::cout<<"c:="<<c<<std::endl;
+			
+			for (size_t i=1;i<num_primes;i++)
+				delete c_i[i];
+		}
+
+		// compute  c= (a*b x^(-n0-1)) mod x^n1
+		// by defaut: n0=c.size() and n1=2*c.size();
+		template<typename Matrix1, typename Matrix2, typename Matrix3>
+		void midproduct (Matrix1 &c, const Matrix2 &a, const Matrix3 &b,
+				 bool smallLeft=true, size_t n0=0,size_t n1=0) {
+			linbox_check(a.coldim()==b.rowdim());
+			size_t hdeg = (n0==0?c.size():n0);
+			size_t deg  = (n1==0?2*hdeg:n1);
+			linbox_check(c.size()>=deg-hdeg);
+			if (smallLeft){
+				linbox_check(b.size()<hdeg+deg);
+			}
+			else
+				linbox_check(a.size()<hdeg+deg);
+
+			size_t lpts = 0;
+			size_t pts  = 1; while (pts < deg) { pts= pts<<1; ++lpts; }
+			// padd the input a and b to 2^lpts (use MatrixP representation)
+			MatrixP a2(field(),a.rowdim(),a.coldim(),pts);
+			MatrixP b2(field(),b.rowdim(),b.coldim(),pts);
+			MatrixP c2(field(),c.rowdim(),c.coldim(),pts);
+			a2.copy(a,0,a.size()-1);
+			b2.copy(b,0,b.size()-1);
+
+			// reverse the element of the smallest polynomial according to h(x^-1)*x^(hdeg)
+			if (smallLeft)
+				for (size_t j=0;j<a2.rowdim()*a2.coldim();j++)
+					for (size_t i=0;i<hdeg/2;i++)
+						std::swap(a2.ref(j,i),a2.ref(j,hdeg-1-i));
+			else
+				for (size_t j=0;j<b2.rowdim()*b2.coldim();j++)
+					for (size_t i=0;i<hdeg/2;i++)
+						std::swap(b2.ref(j,i),b2.ref(j,hdeg-1-i));
+
+			midproduct_fft (lpts,c2, a2, b2, smallLeft);
+			c.copy(c2,0,c.size()-1);
+		}
+
+		
+		// a,b and c must have size: 2^lpts
+		// -> a must have been already reversed according to the midproduct algorithm
+		void midproduct_fft (size_t lpts, MatrixP &c, MatrixP &a, MatrixP &b,
+				     bool smallLeft=true) {
+			size_t pts=c.size();			
+			if ((_p-1) % pts == 0){
+				PolynomialMatrixFFTPrimeMulDomain<ModField> fftprime_domain (field());
+				fftprime_domain.midproduct_fft(lpts,c,a,b,smallLeft);
+				return;
+			}
+			size_t m = a.rowdim();
+			size_t k = a.coldim();
+			size_t n = b.coldim();
+
+			integer bound=integer(_p)*integer(_p)*integer((uint64_t)k)*integer((uint64_t)pts);
+
+			// compute bit size of feasible prime for FFLAS
+			// size_t _k=k,lk=0;
+			// while ( _k ) {_k>>=1; ++lk;}
+			// size_t prime_bitsize= (53-lk)>>1;
+
+			// compute max prime value for FFLAS
+			uint64_t prime_max= std::sqrt( (1ULL<<53) / k)+1;
+			RandomFFTPrime RdFFT(prime_max);
+
+			std::vector<integer> bas;
+
+			
+			if (!RdFFT.generatePrimes(lpts,bound,bas)){
+				std::cout<<"COULD NOT FIND ENOUGH FFT PRIME  in MatPoly 3-Primes FFT MIDP exiting..."<<std::endl;
+				std::cout<<"Parameters : ("<<m<<"x"<<k<<") ("<<k<<"x"<<n<<") with "<<pts<<" points with prime= "<<_p<<std::endl; 
+				throw LinboxError("LinBox ERROR: not enough FFT Prime\n");
+			}
+			size_t num_primes = bas.size();
+
+			std::vector<double> basis(num_primes);
+			std::copy(bas.begin(),bas.end(),basis.begin());
+	    
+			std::vector<MatrixP*> c_i (num_primes);
+			std::vector<ModField> f(num_primes,ModField(2));
+			for (size_t l=0;l<num_primes;l++)
+				f[l]=ModField(basis[l]);
+	    
+			for (size_t l=0;l<num_primes;l++){
+				PolynomialMatrixFFTPrimeMulDomain<ModField> fftdomain (f[l]);
+				MatrixP ai(f[l],m,k,pts);
+				MatrixP bi(f[l],k,n,pts);
+				FFLAS::fassign(f[l],m*k*pts,a.getPointer(),1,ai.getWritePointer(),1);
+				FFLAS::fassign(f[l],k*n*pts,b.getPointer(),1,bi.getWritePointer(),1);
+				c_i[l] = new MatrixP(f[l], m, n, pts);
+				fftdomain.midproduct_fft(lpts, *c_i[l], ai, bi,smallLeft);				
+				//std::cout<<"pi:="<<(uint64_t)basis[l]<<std::endl;
+				//std::cout<<"ci:="<<*c_i[l]<<std::endl;
+			}
+	    
+			// reconstruct the result with MRS
+			typename Field::Element alpha;
+			typename Field::Element beta=field().one;
+			FFLAS::freduce(field(),m*n*pts,c_i[0]->getPointer(),1,c.getWritePointer(),1);
+			for (size_t i=1;i<num_primes;i++){
+				for(size_t j=0;j<i;j++){
+					f[i].init(alpha,basis[j]);
+					f[i].invin(alpha);
+					FFLAS::fsubin (f[i],m*n*pts,c_i[j]->getPointer(),1,c_i[i]->getWritePointer(),1);
+					FFLAS::fscalin(f[i],m*n*pts,alpha,c_i[i]->getWritePointer(),1);
+				}
+				field().mulin(beta,basis[i-1]);
+				FFLAS::faxpy(field(),m*n*pts,beta,c_i[i]->getPointer(),1,c.getWritePointer(),1);
+			}
+
+			//std::cout<<"c:="<<c<<std::endl;
+			
+			for (size_t i=1;i<num_primes;i++)
+				delete c_i[i];
+		
+		}
+		
+	};
+} // end of namespace LinBox
+
+#endif
diff --git a/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize.inl b/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize.inl
new file mode 100644
index 0000000..c09f31e
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize.inl
@@ -0,0 +1,127 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013  Pascal Giorgi
+ *                     Romain Lebreton
+ *
+ * Written by Pascal Giorgi   <pascal.giorgi at lirmm.fr>
+ *            Romain Lebreton <lebreton at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+#ifndef __LINBOX_matpoly_mult_ftt_wordsize_INL
+#define __LINBOX_matpoly_mult_ftt_wordsize_INL
+
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/matrix/polynomial-matrix.h"
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize-three-primes.inl"
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize-fast.inl"
+namespace LinBox {
+
+	/**************************************************************
+         * Polynomial Matrix Multiplication over Zp[x] with p <2^32 ***
+         **************************************************************/
+        template <class T1, class T2>
+        class PolynomialMatrixFFTMulDomain<Givaro::Modular<T1,T2> > {
+        public:
+                typedef Givaro::Modular<T1,T2>                Field;
+                typedef Givaro::Modular<integer>         LargeField;
+                typedef typename Field::Element             Element;
+                typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,Field>        MatrixP;
+                typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,LargeField> MatrixP_L;
+
+        private:
+                const Field            *_field;  // Read only
+                uint64_t                    _p;
+        public:
+                inline const Field & field() const { return *_field; }
+
+                PolynomialMatrixFFTMulDomain (const Field& F) : _field(&F), _p(F.cardinality()) {}
+
+                template<typename Matrix1, typename Matrix2, typename Matrix3>
+                void mul (Matrix1 &c, const Matrix2 &a, const Matrix3 &b) {
+                        uint64_t pts= 1<<(integer((uint64_t)a.size()+b.size()-1).bitsize());
+                        if ( _p< 536870912ULL  &&  ((_p-1) % pts)==0){
+				PolynomialMatrixFFTPrimeMulDomain<Field> MulDom(field());
+                                MulDom.mul(c,a,b);
+                        }
+                        else {
+				if (_p< 536870912ULL){
+					PolynomialMatrixThreePrimesFFTMulDomain<Field> MulDom(field());
+					MulDom.mul(c,a,b);
+				}
+				else {
+					// use computation with Givaro::Modular<integer>
+					// -> could be optimized in some cases (e.g. output entries less than 2^64)
+					FFT_PROFILE_START(2);
+					LargeField Fp(_p);
+					PolynomialMatrixFFTMulDomain<LargeField> MulDom(Fp);
+					MatrixP_L a2(Fp,a.rowdim(),a.coldim(),a.size());
+					MatrixP_L b2(Fp,b.rowdim(),b.coldim(),b.size());
+					MatrixP_L c2(Fp,c.rowdim(),c.coldim(),c.size());
+					a2.copy(a,0,a.size()-1);
+					b2.copy(b,0,b.size()-1);
+					FFT_PROFILING(2,"converting rep of polynomial matrix input");
+					MulDom.mul(c2,a2,b2);
+					c.copy(c2,0,c.size()-1);
+					FFT_PROFILING(2,"converting rep of polynomial matrix output");
+				}
+                        }
+                }
+
+                template<typename Matrix1, typename Matrix2, typename Matrix3>
+                void midproduct (Matrix1 &c, const Matrix2 &a, const Matrix3 &b,
+                                 bool smallLeft=true, size_t n0=0,size_t n1=0) {
+                        uint64_t pts= 1<<(integer((uint64_t)a.size()+b.size()-1).bitsize());
+                        if (_p< 536870912ULL  &&  ((_p-1) % pts)==0){
+				//std::cout<<"MIDP: Staying with FFT Prime Field"<<std::endl;
+                                PolynomialMatrixFFTPrimeMulDomain<Field> MulDom(field());
+                                MulDom.midproduct(c,a,b,smallLeft,n0,n1);
+                        }
+			else {
+				if (_p< 536870912ULL){
+					PolynomialMatrixThreePrimesFFTMulDomain<Field> MulDom(field());
+					MulDom.midproduct(c,a,b,smallLeft,n0,n1);
+				}
+				else {  // use computation with Givaro::Modular<integer>
+					//-> could be optimized in some cases (e.g. output entries less than 2^64)
+					FFT_PROFILE_START(2);
+					//std::cout<<"MIDP: Switching to Large Field"<<std::endl;
+					LargeField Fp(_p);
+					PolynomialMatrixFFTMulDomain<LargeField> MulDom(Fp);
+					MatrixP_L a2(Fp,a.rowdim(),a.coldim(),a.size());
+					MatrixP_L b2(Fp,b.rowdim(),b.coldim(),b.size());
+					MatrixP_L c2(Fp,c.rowdim(),c.coldim(),c.size());
+					a2.copy(a,0,a.size()-1);
+					b2.copy(b,0,b.size()-1);
+					FFT_PROFILING(2,"converting rep of polynomial matrix input");
+					MulDom.midproduct(c2,a2,b2,smallLeft,n0,n1);
+					c.copy(c2,0,c.size()-1);
+					FFT_PROFILING(2,"converting rep of polynomial matrix output");
+				}
+			}
+		}
+
+
+        };
+
+
+}//end of namespace LinBox
+
+#endif // __LINBOX_matpoly_mult_ftt_wordsize_INL
diff --git a/linbox/algorithms/polynomial-matrix/matpoly-mult-fft.h b/linbox/algorithms/polynomial-matrix/matpoly-mult-fft.h
new file mode 100755
index 0000000..8e7a06d
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/matpoly-mult-fft.h
@@ -0,0 +1,120 @@
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013  Pascal Giorgi
+ *                     Romain Lebreton
+ *
+ * Written by Pascal Giorgi   <pascal.giorgi at lirmm.fr>
+ *            Romain Lebreton <lebreton at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_matpoly_mult_ftt_H
+#define __LINBOX_matpoly_mult_ftt_H
+
+#include "linbox/util/error.h"
+#include "linbox/util/debug.h"
+#include "linbox/util/timer.h"
+
+#include "linbox/integer.h"
+#include <givaro/zring.h>
+#include "linbox/ring/modular.h"
+#include "givaro/givtimer.h"
+
+#ifdef FFT_PROFILER
+#include <iostream>
+#ifndef FFT_PROF_LEVEL
+int  FFT_PROF_LEVEL=1;
+#endif
+Givaro::Timer mychrono[3];
+#define FFT_PROF_MSG_SIZE 35
+#define FFT_PROFILE_START(lvl)  mychrono[lvl].clear();mychrono[lvl].start();
+
+#define FFT_PROFILING(lvl,msg)						\
+  if (lvl>=FFT_PROF_LEVEL) {						\
+    mychrono[lvl].stop();std::cout<<"FFT("<<lvl<<"):";			\
+    std::cout.width(FFT_PROF_MSG_SIZE);std::cout<<std::left<<msg<<" : "; \
+    std::cout.precision(6);std::cout<<mychrono[lvl]<<std::endl;		\
+    mychrono[lvl].clear();mychrono[lvl].start();					\
+}
+  
+#ifdef HAVE_OPENMP								
+#define FFT_PROFILE_GET(lvl,x)						\
+  // mychrono.stop();(x)+=mychrono.realtime();mychrono.clear();mychrono.start();
+#else
+#define FFT_PROFILE_GET(lvl,x)						\
+  mychrono[lvl].stop();(x)+=mychrono[lvl].usertime();mychrono[lvl].clear();mychrono[lvl].start();
+#endif
+#define FFT_PROFILE(lvl,msg,x)						\
+if ((lvl)>=FFT_PROF_LEVEL) {					\
+  std::cout<<"FFT: ";						   \
+  std::cout.width(FFT_PROF_MSG_SIZE);std::cout<<std::left<<msg<<" : ";	\
+  std::cout.precision(6);std::cout<<x<<" s"<<std::endl;			\
+}
+#else
+#define FFT_PROFILE_START(lvl)
+#define FFT_PROFILING(lvl,msg)
+#define FFT_PROFILE_GET(lv,x)
+#define FFT_PROFILE(lvl,msg,x)
+#endif // FFT_PROFILER
+
+
+#ifndef FFT_DEG_THRESHOLD   
+#define FFT_DEG_THRESHOLD   4
+#endif
+
+namespace LinBox
+{
+	// generic handler for multiplication using FFT
+	template <class Field>
+	class PolynomialMatrixFFTMulDomain {
+	public:
+		inline const Field & field() const;
+
+		PolynomialMatrixFFTMulDomain (const Field& F);
+
+		template<typename Matrix1, typename Matrix2, typename Matrix3>
+		void mul (Matrix1 &c, const Matrix2 &a, const Matrix3 &b);
+
+		template<typename Matrix1, typename Matrix2, typename Matrix3>
+		void midproduct (Matrix1 &c, const Matrix2 &a, const Matrix3 &b, bool smallLeft=true, size_t n0=0,size_t n1=0);
+	};
+		
+	
+	//class PolynomialMatrixFFTPrimeMulDomain ;                         // Mul in Zp[x] with p <2^32, (fflas, fourier)
+		
+	// template <class T>
+	// class PolynomialMatrixFFTMulDomain<Givaro::Modular<T> > ;        // Mul in Zp[x] with p^2 storable in type T
+
+	// template<>
+	// class PolynomialMatrixFFTMulDomain<Givaro::ZRing<integer> >;  // Mul in Z[x]
+
+	// template <>
+	// class PolynomialMatrixFFTMulDomain<Givaro::Modular<integer> > ;           // Mul in Zp[x] with p multiprecision
+
+} // end of namespace LinBox
+
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize-fast.inl"
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize-three-primes.inl"
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-fft-multiprecision.inl"
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-fft-recint.inl"
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-fft-wordsize.inl"
+
+#endif // __LINBOX_matpoly_mult_ftt_H
diff --git a/linbox/algorithms/polynomial-matrix/matpoly-mult-kara.h b/linbox/algorithms/polynomial-matrix/matpoly-mult-kara.h
new file mode 100755
index 0000000..1faefea
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/matpoly-mult-kara.h
@@ -0,0 +1,364 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013  Pascal Giorgi
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+#ifndef __LINBOX_matpoly_mult_kara_H
+#define __LINBOX_matpoly_mult_kara_H
+
+#include "linbox/algorithms/polynomial-matrix/matpoly-add-domain.h"
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-naive.h"
+#include <algorithm>
+
+#ifndef KARA_DEG_THRESHOLD 
+#define KARA_DEG_THRESHOLD 4
+#endif
+
+namespace LinBox
+{
+	template<class Field>
+	class PolynomialMatrixKaraDomain {
+	private:
+                const Field                            *_field;
+                PolynomialMatrixAddDomain<Field>          _PMD;
+                PolynomialMatrixNaiveMulDomain<Field>     _NMD;
+                double _timeMul, _timeAdd;
+	public:
+                // Polynomial matrix stored as a matrix of polynomial
+		typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,Field> MatrixP;
+		// Polynomial matrix stored as a polynomial of matrix
+		typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> PMatrix;
+                template <PMStorage S> using _PMatrix = PolynomialMatrix<PMType::matfirst,S,Field>;
+                
+                const Field & field() const { return *_field; }
+
+		 PolynomialMatrixKaraDomain(const Field &F) :
+                         _field(&F), _PMD(F), _NMD(F){}
+
+                // c must be allocated with the right size
+                template<typename Matrix1,typename Matrix2,typename Matrix3>
+                void mul(Matrix1 &c, const Matrix2 &a, const Matrix3 &b)
+                {
+                        PMatrix a2(field(),a.rowdim(),a.coldim(),a.size());
+			PMatrix b2(field(),b.rowdim(),b.coldim(),b.size());
+			a2.copy(a,0,a.size()-1);
+			b2.copy(b,0,b.size()-1);
+			PMatrix c2(field(),c.rowdim(),c.coldim(),a.size()+b.size()-1);
+			mul(c2, a2, b2);
+			c.copy(c2,0,c2.size()-1);
+                }
+		
+                void mul(PMatrix &c, const PMatrix &a, const PMatrix &b){
+			linbox_check(c.size() >= (a.size()+b.size()-1));
+                        typename PMatrix::plain t(*_field,c.rowdim(),c.coldim(),std::max(a.size(),b.size()));
+#ifdef KARA_TIMING
+                        _timeMul=_timeAdd=0.;
+                        Timer chrono;
+                        chrono.start();
+#endif
+                        Karatsuba_mul(c,a,b,t);
+#ifdef KARA_TIMING
+                        cout<<" Karatsuba Multiplication:    add  : "<<_timeAdd<<" s"<<endl;
+                        cout<<" Karatsuba Multiplication:    mul  : "<<_timeMul<<" s"<<endl;
+                        cout<<" Karatsuba Multiplication:  total  : "<<chrono.userElapsedTime()<<" s"<<endl<<endl;
+#endif
+		}
+
+                // c must be of size n
+		// b must be of size 2n-1
+		// a is of size <=n
+		// compute  c= (a*b x^(-n)) mod x^n
+
+                template<typename Matrix1,typename Matrix2,typename Matrix3>
+                void midproduct(Matrix1 &c, const Matrix2 &a, const Matrix3 &b)
+                {
+                        PMatrix a2(field(),a.rowdim(),a.coldim(),a.size());
+			PMatrix b2(field(),b.rowdim(),b.coldim(),b.size());
+			a2.copy(a,0,a.size()-1);
+			b2.copy(b,0,b.size()-1);
+			PMatrix c2(field(),c.rowdim(),c.coldim(),c.size());
+			midproduct(c2, a2, b2);
+			c.copy(c2,0,c2.size()-1);
+                }
+                
+                void midproduct(PMatrix &c, const PMatrix &a, const PMatrix &b){
+			linbox_check(2*c.size()-1==b.size());
+                        typename PMatrix::plain t(field(),c.rowdim(),c.coldim(),3*c.size());
+                        // Rk: if n is a power of two, only 2n-1 extra storage is needed
+                        //     if n is odd, 5(n-1)/2 extra storage is needed
+#ifdef KARA_TIMING
+                        _timeMul=_timeAdd=0.;
+                        Timer chrono;
+                        chrono.start();
+#endif
+                        typename PMatrix::plain a2(field(),a.rowdim(), a.coldim(), c.size());
+                        a2.copy(a,0,a.size()-1);
+                        Karatsuba_midproduct(c,a2,b,t);
+#ifdef KARA_TIMING
+                        cout<<" Karatsuba Multiplication:    add  : "<<_timeAdd<<" s"<<endl;
+                        cout<<" Karatsuba Multiplication:    mul  : "<<_timeMul<<" s"<<endl;
+                        cout<<" Karatsuba Multiplication:  total  : "<<chrono.userElapsedTime()<<" s"<<endl<<endl;
+#endif
+		}
+
+
+	protected:
+
+		template<typename PMatrix1,typename PMatrix2,typename PMatrix3, typename PMatrix4>
+                void Karatsuba_mul(PMatrix1 &C, const PMatrix2 &A, const PMatrix3& B, PMatrix4 &TMP) {
+
+                        //cout<<A.size()<<"x"<<B.size()<<"->"<<C.size()<<" ("<<TMP.size()<<")"<<endl;
+                        Timer chrono;
+                        if ((A.size() <=KARA_DEG_THRESHOLD) || (B.size()<=KARA_DEG_THRESHOLD)) {
+#ifdef KARA_TIMING
+                                chrono.start();
+#endif
+                                _NMD.mul(C,A,B);
+#ifdef KARA_TIMING
+                                _timeMul+=chrono.userElapsedTime();
+#endif
+                        }
+			else {
+#ifdef KARA_TIMING
+                                chrono.start();
+#endif
+				size_t dA, dB, p, p2, q,qA, qB, n2;
+                                dA = A.size();
+                                dB = B.size();
+                                n2=dA+dB;
+                                p=std::max((dA>>1)+(dA&1),(dB>>1) +(dB&1));
+                                p2=p<<1;
+                                qA= dA - p;
+                                qB= dB - p;
+                                q=std::max(qA,qB);
+                                typename PMatrix::const_view Ah,Al;
+                                typename PMatrix::const_view Bh,Bl;
+                                typename PMatrix::view C0,C1,C2,TMP0;
+                                Al=A.at(0,p-1); Ah=A.at(p,dA-1);
+                                Bl=B.at(0,p-1); Bh=B.at(p,dB-1);
+
+				// add low and high terms of A in C[0,p-1]
+                                C0=C.at(0,p-1);
+                                _PMD.add(C0,Al,Ah);
+
+                                // add low and high terms of B in C[p,2p-1]
+                                C1=C.at(p,p2-1);
+                                _PMD.add(C1,Bl,Bh);
+#ifdef KARA_TIMING
+                                _timeAdd+=chrono.userElapsedTime();
+#endif
+                                // multiply the sums in TMP[0,p2-2] using C[p2,n2-2] as temporary
+                                C2=C.at(p2,n2-2);
+                                TMP0=TMP.at(0,p2-2);
+                                Karatsuba_mul(TMP0,C0,C1,C2);
+
+				// multiply high terms in C[p2,n2-2] using C[0,q-1] as temporary
+                                C0=C.at(0,q-1);
+                                Karatsuba_mul(C2, Ah,Bh, C0);
+#ifdef KARA_TIMING
+                                chrono.start();
+#endif
+                                // subtract the high product from the product of the sums
+                                _PMD.subin(TMP0,C2);
+
+                                // add TMP to the result at the right position (add when only necessary)
+                                for (size_t i=p;i<=p2-1;i++) C[i]=TMP[i-p];
+                                if (p>=2){
+                                        C2=C.at(p2,p2+p-2);
+                                        TMP0=TMP.at(p,p2-2);
+                                        _PMD.addin(C2,TMP0);
+                                }
+#ifdef KARA_TIMING
+                                _timeAdd+=chrono.userElapsedTime();
+#endif
+
+                                // multiply low terms in TMP[0,2p-2] using C[2p,n2-2]] as temporary
+                                TMP0=TMP.at(0,p2-2);
+                                C0=C.at(0,p-1);
+                                Karatsuba_mul(TMP0,Al,Bl,C0);
+
+#ifdef KARA_TIMING
+                                chrono.start();
+#endif
+                                // subtract the low product from result at the right place
+                                C1=C.at(p,p+p2-2);
+                                _PMD.subin(C1,TMP0);
+
+                                // add TMP to the result at the right position (add when only necessary)
+                                for (size_t i=0;i<=p-1;i++) C[i]=TMP[i];
+                                if (p>=2){
+                                        C1=C.at(p,p2-2);
+                                        TMP0=TMP.at(p,p2-2);
+                                        _PMD.addin(C1,TMP0);
+                                }
+#ifdef KARA_TIMING
+                                _timeAdd+=chrono.userElapsedTime();
+#endif
+                        }
+                }
+
+                // a is of size n
+		// b is of size 2n-1
+		// c is of size n
+		// compute  c= (a*b x^(-n)) mod x^n
+                // TMP must be of size 2n
+                template<typename PMatrix1,typename PMatrix2,typename PMatrix3>
+                void Karatsuba_midproduct(PMatrix1 &C, const PMatrix2 &A, const PMatrix3& B, PMatrix1 &TMP) {
+
+                        //cout<<A.size()<<"x"<<B.size()<<"->"<<C.size()<<" ("<<TMP.size()<<")\n";
+                        Timer chrono;
+                        if ((A.size() <=KARA_DEG_THRESHOLD) || (B.size()<=KARA_DEG_THRESHOLD)) {
+#ifdef KARA_TIMING
+                                chrono.start();
+#endif
+                                //cout<<"-------------------------------------------------"<<endl;
+                                _NMD.midproduct(C,A,B);
+#ifdef KARA_TIMING
+                                _timeMul+=chrono.userElapsedTime();
+#endif
+                        }
+			else {
+#ifdef KARA_TIMING
+                                chrono.start();
+#endif
+                                //cout<<"* BEGIN ***********************************************"<<endl;
+                                size_t n,n0,n1,s0,s1;
+                                n=C.size();
+                                n0=n>>1; // n0 <= n1
+                                n1=n-n0;
+                                s0=2*n0-1;
+                                s1=2*n1-1;
+                                // cout<<"n="<<n<<endl;
+                                // cout<<"n0="<<n0<<endl;
+                                // cout<<"n1="<<n1<<endl;
+                                // cout<<"s0="<<s0<<endl;
+                                // cout<<"s1="<<s1<<endl;
+                                // cout<<"TMP SIZE:"<<TMP.size()<<endl;
+                                typename PMatrix::const_view Ah,Al;
+                                typename PMatrix::const_view Bh,Bm0,Bm1,Bl;
+                                typename PMatrix::view C0,C1,TMP0,TMP1,TMP2;
+                                Al=A.at(0,n0-1);        // size: n0
+                                Ah=A.at(n0,n-1);        // size: n1
+                                Bl=B.at(0,s1-1);        // size: 2n1-1
+                                Bh=B.at(2*n1,2*n1+s0-1);// size: 2n0-1
+                                Bm0=B.at(n1,n1+s0-1);   // size: 2n0-1
+                                Bm1=B.at(n1,n1+s1-1);   // size: 2n1-1
+                                //cout<<"@@@@@@@@@@@@@@@@"<<endl;
+                                //cout.flush();
+
+				// add Bl and Bm1 in C[0,s1-1]
+
+                                C0=C.at(0,s1-1);
+                                _PMD.add(C0,Bl,Bm1);
+#ifdef KARA_TIMING
+                                _timeAdd+=chrono.userElapsedTime();
+#endif
+                                // 1) TMP[0,n1-1]= midproduct(Ah,Bl+Bm1) using TMP[n1,n1+s1] as temporary
+                                TMP0=TMP.at(0,n1-1);
+                                TMP1=TMP.at(n1,4*n1-1);
+                                Karatsuba_midproduct(TMP0,Ah,C0,TMP1);
+                                //cout<<"alpha=:"<<TMP0<<endl;
+#ifdef KARA_TIMING
+                                chrono.start();
+#endif
+                                // copy TMP[0,n1-1] to C[0,n1-1]
+                                C0=C.at(0,n1-1);
+                                C0.copy(TMP0);
+
+                                if(n0!=n1) {
+                                        TMP[2*n-1]=C[n1-1];
+                                        // compute Ah-x*Al in  C[n0,n-1]
+                                        C1=C.at(n0,n-1);
+                                        C1.copy(Ah,0,n1-1);
+                                        C1=C.at(n1,n-1);
+                                        _PMD.subin(C1,Al);
+                                        C1=C.at(n0,n-1);
+
+                                        // 2) T[0,n1-1]= midproduct(Ah-Al,Bm1) using TMP[n1,n1+s1] as temporary
+                                        Karatsuba_midproduct(TMP0,C1,Bm1,TMP1);
+                                        //cout<<"beta=:"<<TMP0<<endl;
+
+                                        C[n1-1]=TMP[2*n-1];
+
+                                        _PMD.subin(C0,TMP0);
+
+                                        C1=C.at(n1,n-1);
+                                        TMP1=TMP.at(0,n0-1);
+                                        C1.copy(TMP1);
+
+                                        TMP0=TMP.at(0,s0-1);
+                                        TMP1=TMP.at(s0,s0+n0-1);
+                                        TMP2=TMP.at(s0+n0,s0+4*n0-1);
+
+                                        _PMD.add(TMP0,Bm0,Bh);
+
+                                        // 3) T[s0,s0+n0-1]= midproduct(Al,Bm0+Bh) using TMP[s0+n0,2so+n0] as temporary
+                                        Karatsuba_midproduct(TMP1,Al,TMP0,TMP2);
+                                        //cout<<"gamma=:"<<TMP1<<endl;
+
+                                        C1=C.at(n1,n-1);
+                                        _PMD.addin(C1,TMP1);
+                                }
+                                else {
+                                        // add Bh and Bm in TMP[0,s0-1]
+                                        TMP0=TMP.at(0,s0-1);
+                                        _PMD.add(TMP0,Bh,Bm0);
+
+                                        // 2) C[n1,n-1]= midproduct(Al,Bh+Bm0) using TMP[s0,2s0] as temporary
+                                        C1=C.at(n1,n-1);
+                                        TMP1=TMP.at(s0,s0+3*n0-1);
+                                        Karatsuba_midproduct(C1,Al,TMP0,TMP1);
+                                        //cout<<"gamma=:"<<TMP0<<endl;
+
+                                        // compute Ah-Al in  T[0,n1-1]
+                                        TMP0=TMP.at(0,n1-1);
+                                        TMP1=TMP.at(n1,2*n1-1);
+                                        TMP2=TMP.at(2*n1,2*n1+3*n0-1);
+
+                                        _PMD.sub(TMP0,Ah,Al);
+
+                                        // 3) T[n1,2n1-1]= midproduct(Ah-Al,Bm0) using TMP[2n1,2n1+s0] as temporary
+                                        Karatsuba_midproduct(TMP1,TMP0,Bm0,TMP2);
+                                        //cout<<"beta=:"<<TMP1<<endl;
+
+                                        C0=C.at(0,n1-1);
+                                        _PMD.subin(C0,TMP1);
+                                        _PMD.addin(C1,TMP1);
+                                }
+
+                                //cout<<"* END ***********************************************"<<endl;
+                        }
+                }
+
+	}; // end of class KaratsubaMulDomain<Field, Matrix>
+
+} // end of namespace LinBox
+#endif
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/algorithms/polynomial-matrix/matpoly-mult-naive.h b/linbox/algorithms/polynomial-matrix/matpoly-mult-naive.h
new file mode 100755
index 0000000..bc35be0
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/matpoly-mult-naive.h
@@ -0,0 +1,143 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013  Pascal Giorgi
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+#ifndef __LINBOX_MATPOLY_MUL_NAIVE_H
+#define __LINBOX_MATPOLY_MUL_NAIVE_H
+
+#include "linbox/util/error.h"
+#include "linbox/util/debug.h"
+#include "linbox/matrix/matrix-domain.h"
+#include <algorithm>
+namespace LinBox
+{
+        
+	template <class Field>
+	class PolynomialMatrixNaiveMulDomain {
+	private:
+		const Field            *_field;
+		BlasMatrixDomain<Field>   _BMD;
+
+		// Polynomial matrix stored as a matrix of polynomial
+		typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,Field> MatrixP;
+		// Polynomial matrix stored as a polynomial of matrix
+		typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> PMatrix;
+                template <PMStorage S> using _PMatrix = PolynomialMatrix<PMType::matfirst,S,Field>;
+	public:
+
+                inline const Field& field() const { return *_field; }
+
+                PolynomialMatrixNaiveMulDomain(const Field &F) :
+			_field(&F), _BMD(F){}
+                
+
+                void mul(PMatrix&  c, const PMatrix&  a, const PMatrix&  b)
+                {
+                        for (size_t k=0;k<a.size()+b.size()-1;k++){
+                                size_t idx_min= (k+1<b.size()?0:k+1-b.size());
+                                size_t idx_max=std::min(k,a.size()-1);                                
+                                _BMD.mul(c[k],a[idx_min],b[k-idx_min]);
+                                for (size_t i=idx_min+1;i<=idx_max;i++){ 
+                                        _BMD.axpyin(c[k],a[i],b[k-i]);
+                                }
+                        }
+                }                
+
+                // c must be allocated with the right size
+                template<typename Matrix1,typename Matrix2,typename Matrix3>
+                void mul(Matrix1& c, const Matrix2&  a, const Matrix3&  b)
+                {
+                        PMatrix a2(field(),a.rowdim(),a.coldim(),a.size());
+			PMatrix b2(field(),b.rowdim(),b.coldim(),b.size());
+			a2.copy(a,0,a.size()-1);
+			b2.copy(b,0,b.size()-1);
+			PMatrix c2(field(),c.rowdim(),c.coldim(),a.size()+b.size()-1);
+			mul(c2, a2, b2);
+			c.copy(c2,0,c2.size()-1);
+                }                          
+
+
+                
+                // c must be allocated with the right size 
+                // a and b can have a size smaller than required
+                template<typename Matrix1,typename Matrix2,typename Matrix3>
+                void midproduct(Matrix1& c, const Matrix2&  a, const Matrix3&  b,
+                                bool smallLeft=true, size_t n0=0,size_t n1=0) 
+                {
+                        PMatrix a2(field(),a.rowdim(),a.coldim(),a.size());
+			PMatrix b2(field(),b.rowdim(),b.coldim(),b.size());
+			a2.copy(a,0,a.size()-1);
+			b2.copy(b,0,b.size()-1);
+			PMatrix c2(field(),c.rowdim(),c.coldim(),c.size());
+			midproduct(c2, a2, b2, smallLeft, n0, n1);
+			c.copy(c2,0,c2.size()-1);
+                }                          
+                void midproduct(PMatrix&  c, const PMatrix&  a, const PMatrix&  b,
+                                bool smallLeft=true, size_t n0=0,size_t n1=0) {
+                        //cout<<"naive midprod "<<a.size()<<"x"<<b.size()<<"->"<<c.size()<<endl;
+                        size_t hdeg = ((n0==0)?c.size():n0);
+			size_t deg  = ((n1==0)?2*hdeg-1:n1);
+                        //cout<<"("<<hdeg-1<<","<<deg-1<<")"<<endl;
+                        if (smallLeft){
+                                // for (size_t k=hdeg-1;k<std::min(a.size()+b.size()-1,deg);k++){
+                                //         _BMD.mul(c[k-hdeg+1],a[0],b[k]);
+                                //         for (size_t j=1;j<std::min(hdeg,a.size());++j)
+                                //                 _BMD.axpyin(c[k-hdeg+1],a[j],b[k-j]);
+                                //}
+                                for (size_t k=hdeg-1;k<std::min(a.size()+b.size()-1,deg);k++){
+                                        size_t idx_b=std::min(k,b.size()-1);
+                                        size_t idx_a=k-idx_b;
+                                        //cout<<k<<" : "<<idx_a<<"---"<<idx_b<<endl;
+                                        _BMD.mul(c[k-hdeg+1],a[idx_a],b[idx_b]);
+                                        for (size_t j=idx_a+1;j<=std::min(k,a.size()-1);++j){
+                                                //cout<<k<<" : "<<j<<"---"<<k-j<<endl;
+                                                _BMD.axpyin(c[k-hdeg+1],a[j],b[k-j]);
+                                        }
+                                }
+                        }else {
+                                for (size_t k=hdeg-1;k<std::min(a.size()+b.size()-1,deg);k++){
+                                        size_t idx_a=std::min(k,a.size()-1);
+                                        size_t idx_b=k-idx_a;
+                                        _BMD.mul(c[k-hdeg+1],a[idx_a],b[idx_b]);
+                                        for (size_t j=idx_b+1;j<=std::min(k,b.size()-1);++j){
+                                                _BMD.axpyin(c[k-hdeg+1],a[k-j],b[j]);
+                                        }
+                                }
+                        }
+                }               
+        };
+	
+} // end of namespace LinBox
+
+#endif //__LINBOX_MATPOLY_MUL_NAIVE_H
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/algorithms/polynomial-matrix/order-basis.h b/linbox/algorithms/polynomial-matrix/order-basis.h
new file mode 100755
index 0000000..4affeb2
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/order-basis.h
@@ -0,0 +1,641 @@
+/* linbox/algorithms/sigma-basis.h
+ * Copyright (C) 2005,2013 Pascal Giorgi, Romain Lebreton
+ *
+ * Written by Pascal Giorgi pascal.giorgi at lirmm.fr
+ *            Romain Lebreton lebreton at lirmm.fr
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/polynomial-matrix.h"
+#include "linbox/algorithms/polynomial-matrix/polynomial-matrix-domain.h"
+#include <vector>
+#include <algorithm>
+#include <chrono>
+#include "fflas-ffpack/fflas-ffpack.h"
+#define MBASIS_THRESHOLD_LOG 5
+#define MBASIS_THRESHOLD (1<<MBASIS_THRESHOLD_LOG)
+
+namespace LinBox {
+
+#ifdef __CHECK_ORDERBASIS
+#define __CHECK_MBASIS
+#define __CHECK_PMBASIS
+#endif
+        
+#if (__CHECK_MBASIS) or (__CHECK_PMBASIS)
+#include <string>
+        template<typename Field, typename Mat>
+        std::string check_orderbasis(const Field& F, const Mat& sigma,  const Mat& serie, size_t ord){
+                Mat T(F,sigma.rowdim(),serie.coldim(),sigma.size()+serie.size()-1);
+                PolynomialMatrixMulDomain<Field> PMD(F);
+                PMD.mul(T,sigma,serie);
+                MatrixDomain<Field> MD(F);
+                size_t i=0;
+                std::string msg(".....");
+                bool nul_sigma=true;
+                while(i<ord && MD.isZero(T[i])){
+                        if (!MD.isZero(sigma[i])) nul_sigma=false;		
+                        i++;
+                }
+                if (i<ord){
+                        std::cout<<"error at degree="<<i<<std::endl;
+                        T[i].write(std::cout, Tag::FileFormat::Plain);
+                        std::cout<<"***"<<std::endl;
+                        std::cout<<serie<<std::endl;
+                        std::cout<<sigma<<std::endl;
+                        exit(1);
+                }
+	
+	
+                if (i==ord && !nul_sigma)
+                        msg+="done";
+                else
+                        msg+="error";
+                return msg;
+        }
+#endif
+
+        
+        template< size_t K>
+        struct EarlyTerm {
+                size_t _count;
+                size_t _val;
+
+                EarlyTerm():  _count(0),_val(0){}
+
+                void update(size_t r, const std::vector<size_t>& u){
+                        std::vector<size_t> v(u);
+                        sort(v.begin(),v.end());
+                        size_t x=0;
+                        for (size_t i=0;i<r;i++)
+                                x+=v[i];
+                        if (x==_val)
+                                _count++;
+                        else{
+                                _val=x;
+                                _count=0;
+                        }
+                }
+
+                bool terminated() const {return _count>=K;}
+
+                void reset() {_count=0;_val=0;}
+        };
+
+        template<class Field, class ET=EarlyTerm<-1> >
+        class OrderBasis {
+        public:
+                typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,Field> MatrixP;
+                typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> PMatrix;
+        private:
+                const Field*                     _field;
+                PolynomialMatrixMulDomain<Field>   _PMD;
+                BlasMatrixDomain<Field>            _BMD;
+                ET                           _EarlyStop;
+        public:
+#if 1 or (PROFILE_PMBASIS) or (__CHECK_MBASIS)or (__CHECK_PMBASIS)
+                size_t _idx=0;
+                size_t _target=0;
+                double  _eta=0.;
+                std::chrono::time_point<std::chrono::system_clock> _start, _end;
+                bool _started=false;
+#endif
+                OrderBasis(const Field& f) : _field(&f), _PMD(f), _BMD(f) {                 
+                }
+
+                inline const Field& field() const {return *_field;}
+
+                // serie must have exactly order elements (i.e. its degree = order-1)
+                // sigma can have at most order+1 elements (i.e. its degree = order)
+                template<typename PMatrix1, typename PMatrix2>
+                size_t PM_Basis2(PMatrix1                 &sigma,
+                                 const PMatrix2           &serie,
+                                 size_t                    order,
+                                 std::vector<size_t>       &shift){
+                        std::cout<<"COPYING INTIAL SERIE"<<std::endl;
+                        PMatrix2 serie2(serie.field(),serie.rowdim(),serie.coldim(),serie.size());
+                        serie2.copy(serie);
+                        return PM_Basis(sigma,serie2,order,shift);
+                }
+
+                
+                // serie must have exactly order elements (i.e. its degree = order-1)
+                // sigma can have at most order+1 elements (i.e. its degree = order)
+                // BEWARE: serie can be modified
+                template<typename PMatrix1, typename PMatrix2>
+                size_t PM_Basis(PMatrix1                 &sigma,
+                                const PMatrix2           &serie,
+                                size_t                    order,
+                                std::vector<size_t>       &shift)
+                {
+
+#if 1 or (PROFILE_PMBASIS)
+                        //std::cout<<"Start PM-Basis : "<<order<<" ("<<_idx<<"/"<<_target<<")] : "<<std::endl;//MEMINFO<<std::endl;
+                        if (_target==0) _target=order;
+                        if (!_started) {_started=true; _start = std::chrono::system_clock::now();}
+                        std::chrono::time_point<std::chrono::system_clock> _chrono_start=std::chrono::system_clock::now();
+#endif
+                        
+                        if (order <= MBASIS_THRESHOLD) {
+#if 1 or (PROFILE_PMBASIS) or (__CHECK_PMBASIS)
+                                _idx+=order;
+#endif
+                                return M_Basis(sigma, serie, order, shift);                            
+                        }
+                        else {
+#ifdef PROFILE_PMBASIS
+                                Timer chrono;
+                                chrono.start();
+#endif
+                                size_t ord1,ord2,d1,d2;
+                                ord1 = order>>1;
+                                ord2 = order-ord1; // ord1+ord2=order
+                                size_t m,n,k;
+                                m=sigma.rowdim();
+                                n=sigma.coldim();
+                                k=serie.coldim();
+                                integer p;
+
+                                // first recursive call
+                                PMatrix1 sigma1(field(),m,n,ord1+1);                                
+
+#ifdef MEM_PMBASIS
+                                std::cerr<<"[PM-Basis ("<<order<<") "<<_idx<<"/"<<_target<<"] [Sigma1] -> "<<MB(m*n*(ord1+1)*length(field().characteristic(p)))<<"Mo"<<MEMINFO<<std::endl;
+#endif
+                                //typename PMatrix2::const_view serie1=serie.at(0,ord1-1);
+                                PMatrix2 *serie1=new PMatrix2(field(),n,k,ord1);
+#ifdef MEM_PMBASIS
+                                std::cerr<<"[PM-Basis ("<<order<<") "<<_idx<<"/"<<_target<<"] [Serie1] -> "<<MB(n*k*ord1*length(field().characteristic(p)))<<"Mo"<<MEMINFO<<std::endl;
+#endif
+                                serie1->copy(serie,0,ord1-1);
+                                d1 = PM_Basis(sigma1, *serie1, ord1, shift);
+                                delete serie1;                                
+                                if (_EarlyStop.terminated()){
+                                        sigma=sigma1;
+                                        return d1;
+                                }
+                                
+                                // compute the serie update
+                                // TODO: for Block Wiedemann, this step can use only the first column of sigma
+                                PMatrix2 *serie2=new PMatrix2(field(),n,k,ord2);//serie2 size=ord1+1 -> midproduct)
+#ifdef MEM_PMBASIS
+                                std::cerr<<"[PM-Basis ("<<order<<") "<<_idx<<"/"<<_target<<"] [Serie2] -> "<<MB(n*k*ord2*length(field().characteristic(p)))<<"Mo"<<MEMINFO<<std::endl;
+#endif              
+                                _PMD.midproductgen(*serie2, sigma1, serie, true, ord1+1,ord1+ord2);
+#ifdef PROFILE_PMBASIS
+                                //chrono.stop();
+                                //std::cout<<"      -> serie update "<<sigma1.size()<<"x"<<order<<" --> "<<chrono.usertime()<<std::endl;//MEMINFO<<std::endl;
+                                //chrono.clear();chrono.start();
+#endif
+                                // second recursive call
+
+                                PMatrix1 sigma2(field(),m,n,ord2+1);
+#ifdef MEM_PMBASIS
+                                std::cerr<<"[PM-Basis("<<order<<") "<<_idx<<"/"<<_target<<"] [Sigma2] -> "<<MB(m*n*(ord1+1)*length(field().characteristic(p)))<<"Mo"<<MEMINFO<<std::endl;
+#endif
+                                d2 = PM_Basis(sigma2, *serie2, ord2, shift);
+                                delete serie2;                                 
+
+                                // compute the result
+                                _PMD.mul(sigma, sigma2, sigma1);
+                                //sigma.resize(d1+d2+1);
+                                sigma.setsize(d1+d2+1);                               
+#ifdef PROFILE_PMBASIS
+                                //chrono.stop();
+                                //std::cout<<"      -> basis product "<<sigma1.size()<<"x"<<sigma2.size()<<" = "<<d1+d2+1<<" -->"<<chrono.usertime()<<MEMINFO<<std::endl;
+#endif
+
+#ifdef __CHECK_PMBASIS
+                                std::cout<<"PMBASIS: order "<<_idx<<check_orderbasis(field(),sigma,serie,order)<<std::endl;
+#endif
+#ifdef PROFILE_PMBASIS
+                                chrono.stop();
+                                _end = std::chrono::system_clock::now();                                
+                                std::chrono::duration<double> elapsed_beginning = _end-_start;
+                                std::chrono::duration<double> elapsed_comp      = _end-_chrono_start;
+
+                                double magicnumber=double(_target)/double(order)*log(double(_target)/double(order))/log(2.);
+                                double tcomp = elapsed_comp.count();
+                                double telap = elapsed_beginning.count();
+                                
+                                _eta=(_eta!=0.0?std::min(_eta,tcomp*magicnumber):tcomp*magicnumber);
+                                std::cerr<<"[PM-Basis : "<<order<<" ("<<_idx<<"/"<<_target<<")] : "<<chrono.usertime()
+                                         << " (ETA: "<< telap<<"s / "<<_eta<<"s)"<<MEMINFO<<std::endl;
+                                chrono.clear();chrono.start();
+#endif
+
+
+                                return d1+d2;
+                        }
+                }
+                // serie must have exactly order elements (i.e. its degree = order-1)
+                size_t M_Basis(MatrixP              &sigma,
+                               const MatrixP        &serie,
+                               size_t                 order,
+                               std::vector<size_t>   &shift)
+                {
+
+                        PMatrix sigma1(field(),sigma.rowdim(),sigma.coldim(),order+1);
+                        PMatrix serie1(field(),serie.rowdim(),serie.coldim(),order);
+                        serie1.copy(serie,0,order-1);
+                        size_t d= M_Basis(sigma1,serie1,order,shift);
+                        sigma.resize(d+1);
+                        sigma.copy(sigma1,0,d);
+                        return d;
+
+                }
+
+                // serie must have exactly order elements (i.e. its degree = order-1)
+                template<typename PMatrix1, typename PMatrix2>
+                size_t M_Basis(PMatrix1              &sigma,
+                               const PMatrix2        &serie,
+                               size_t                 order,
+                               std::vector<size_t>   &shift)
+                {
+#ifdef __DEBUG_MBASIS
+                        std::cout<<"------------- mba : "<<order<<std::endl;
+                        std::cout<<serie<<std::endl;
+#endif
+                        size_t m=serie.rowdim();
+                        size_t n=serie.coldim();
+                        size_t rank=0;
+                        BlasMatrix<Field> delta(field(),m,n);
+                        size_t max_degree=0;        // a bound on the row degree of sigma
+                        std::vector<size_t> degree(m,0); // a bound on each row degree of sigma
+                        //auto degree=shift;
+                        //size_t max_degree=*std::max_element(degree.begin(),degree.end());
+
+                        // set sigma to identity
+                        for(size_t i=0;i<m*m;i++)
+                                sigma.ref(i,0)=0;
+                        for(size_t i=0;i<m;i++)
+                                sigma.ref(i,i,0)=1;
+
+                        BlasPermutation<size_t> Qt(m), P(n);
+                        TransposedBlasMatrix<BlasPermutation<size_t> > Q(Qt);
+                        typedef BlasSubmatrix<BlasMatrix<Field> > View;
+                        size_t k=0;
+                        for (; k<order && !_EarlyStop.terminated(); k++){
+#ifdef __DEBUG_MBASIS
+                                std::cout<<std::endl<<"****************** "<<k<<std::endl;
+                                std::cout<<"shift=";std::copy(shift.begin(),shift.end(),std::ostream_iterator<size_t>(std::cout,","));std::cout<<std::endl;
+                                std::cout<<"degree=";std::copy(degree.begin(),degree.end(),std::ostream_iterator<size_t>(std::cout,","));std::cout<<std::endl;                                
+                                
+#endif
+                                // sort the shift in ascending order (-> minimize the shifted row-degree of sigma)
+                                // -> store the permutation in Bperm
+                                // -> permute the row degree at the same time
+                                std::vector<size_t> perm(m);
+                                for (size_t i=0;i<m;i++) perm[i]=i;
+                                for (size_t i=0;i<m;++i) {
+                                        size_t idx_min=i;
+                                        for (size_t j=i+1;j<m;++j)
+                                                if (shift[j]< shift[idx_min])
+                                                        idx_min=j;
+                                        std::swap( shift[i],  shift[idx_min]);
+                                        std::swap(degree[i], degree[idx_min]);
+                                        perm[i]=idx_min;
+                                }
+                                BlasPermutation<size_t> Bperm(perm);
+#ifdef __DEBUG_MBASIS
+                                std::cout<<"Bp=";
+                                Bperm.write(std::cout,false);
+                                std::cout<<std::endl;                                
+                                std::cout<<"Bp.shift=";std::copy(shift.begin(),shift.end(),std::ostream_iterator<size_t>(std::cout,","));std::cout<<std::endl;
+                                std::cout<<"Bp.degree=";std::copy(degree.begin(),degree.end(),std::ostream_iterator<size_t>(std::cout,","));std::cout<<std::endl;                                
+#endif
+                                // check if Qt is identity
+                                //size_t lll=0;
+                                //while(lll<m && Qt[lll]==lll) lll++;
+
+                                // permute the row of the current sigma basis
+                                // and compute the new discrepancy
+                                //if (true){
+                                //if (k==0 || lll!=m){
+                                if (k==0 ){ //|| !Qt.isIdentity()){
+                                        _BMD.mulin_right(Bperm, sigma[0]);
+                                        _BMD.mul(delta,sigma[0],serie[k]);
+                                        for(size_t i=1;i<=std::min(k,max_degree);i++){
+                                                _BMD.mulin_right(Bperm, sigma[i]);
+                                                _BMD.axpyin(delta,sigma[i],serie[k-i]);
+                                        }
+                                }
+                                else{
+                                        // if Qt is identity then the first rank rows of delta remain unchanged
+                                        // the first rank rows of Qt.delta remain unchanged
+                                        if (!Qt.isIdentity())
+                                                _BMD.mulin_right(Qt, delta);
+
+                                        View delta1(delta,   rank,0,m-rank,n);
+                                        View sigma1(sigma[0],rank,0,m-rank,m);
+                                        _BMD.mul(delta1,sigma1,serie[k]);                                        
+                                        _BMD.mulin_right(Bperm, sigma[0]);
+                                        for(size_t i=1;i<=std::min(k,max_degree);i++){
+                                                View sigmak(sigma[i],rank,0,m-rank,m);
+                                                _BMD.axpyin(delta1,sigmak,serie[k-i]);
+                                                _BMD.mulin_right(Bperm, sigma[i]);
+                                        }
+                                        _BMD.mulin_right(Bperm, delta);
+                                }
+                                //std::cout<<"******** k="<<k<<std::endl;
+#ifdef __DEBUG_MBASIS
+                                std::cout<<sigma<<std::endl;
+                                delta.write(std::cout,Tag::FileFormat::Maple);
+                                std::cout<<std::endl;                                
+#endif
+                                BlasMatrix<Field> delta_copy(delta);
+                                //delta_copy.write(std::cout,Tag::FileFormat::Plain);
+                                
+#define NEWELIM
+#ifdef NEWELIM
+                                // Compute a column reduced basis of the nullspace of delta
+                                // -> [ L2 I ]                                 
+                                rank= FFPACK::PLUQ (field(), FFLAS::FflasNonUnit, m, n,
+                                                    delta_copy.getWritePointer(),delta_copy.getStride(),
+                                                    Qt.getWritePointer(), P.getWritePointer());
+                                //delta_copy.write(std::cout,Tag::FileFormat::Maple);
+                                //std::cout<<std::endl;                                
+
+                                View L1(delta_copy,0   ,0,  rank,rank);
+                                View L2(delta_copy,rank,0,m-rank,rank);
+                                FFLAS::ftrsm(field(),FFLAS::FflasRight,FFLAS::FflasLower,
+                                             FFLAS::FflasNoTrans,FFLAS::FflasUnit,
+                                             m-rank,rank, field().mOne, L1.getPointer(),L1.getStride(), L2.getWritePointer(),L2.getStride());                                
+#else
+                                LQUPMatrix<Field> LQUP(delta_copy,P,Qt);
+                                // Get L from LQUP
+                                TriangularBlasMatrix<Field> L(field(), m, m, Tag::Shape::Lower, Tag::Diag::Unit);
+                                LQUP.getL(L);
+                                rank=LQUP.getRank();  // the first rank entries of Qt give the pivot row
+                                // inverse L in-place (COULD BE IMPROVED -> only compute the left kernel by trsm)
+                                //FFPACK::ftrtri(field(),FFLAS::FflasLower,FFLAS::FflasUnit,m,L.getPointer(),L.getStride());
+                                View L1(L,0   ,0,  rank,rank);
+                                View L2(L,rank,0,m-rank,rank);
+                                FFLAS::ftrsm(field(),FFLAS::FflasRight,FFLAS::FflasLower,
+                                             FFLAS::FflasNoTrans,FFLAS::FflasUnit,
+                                             m-rank,rank, field().mOne, L1.getPointer(),m, L2.getWritePointer(),m);
+#endif
+                                
+                                // update sigma by L^(-1) (rank sensitive -> use only the left kernel basis)
+                                for(size_t i=0;i<=std::min(k,max_degree);i++){
+                                        // NEED TO APPLY Qt to sigma[i]
+                                        _BMD.mulin_right(Qt, sigma[i]);                                        
+                                        View S1(sigma[i],0,0,rank,m);
+                                        View S2(sigma[i],rank,0,m-rank,m);
+                                        _BMD.axpyin(S2,L2,S1);
+                                        //_BMD.mulin_right(L,sigma[i]);
+                                }
+#ifdef __DEBUG_MBASIS
+                                std::cout<<"Qt=";
+                                Qt.write(std::cout,false);
+                                std::cout<<"\nP=";
+                                P.write(std::cout,false);
+
+                                std::cout<<std::endl<<"rank="<<rank<<" Qt size: "<<Qt.getSize()<<std::endl;
+#endif
+#if 0
+                                size_t dmax=0, smax=0;
+                                // update: the row-degree, the shifted row-degree,
+                                //         the max pivot degree and the maximum row degree
+                                for (size_t i=0;i<rank;++i) {
+                                        //std::cout<<"Qt["<<i<<"]="<<Qt.getPointer()[i]<<std::endl;
+                                        dmax=std::max(dmax, degree[Qt[i]]);
+                                        smax=std::max(smax, shift [Qt[i]]);                                        
+                                        degree[Qt[i]]++;
+                                        shift [Qt[i]]++;
+                                }
+                                //std::cout<<"dmax:"<<dmax<<std::endl;
+                                max_degree=std::max(max_degree,dmax+1);
+                                //std::cout<<"max degree:"<<max_degree<<std::endl;
+                                for (size_t i=rank;i<m;i++){
+                                        degree[Qt[i]]=std::max(dmax, degree[Qt[i]]);
+                                        //THIS LINE IS NOT NEEDED -> shift [Qt[i]]=max(smax, shift [Qt[i]]);
+                                }
+#else
+
+                                size_t dmax=0;
+                                Givaro::ZRing<size_t> Zint;
+                                BlasMatrixDomain<Givaro::ZRing<size_t> > TTT(Zint);
+
+                                TTT.mulin_right(Qt, degree);
+                                TTT.mulin_right(Qt, shift);
+#ifdef __DEBUG_MBASIS
+                                std::cout<<"Qt.Bp.shift=";std::copy(shift.begin(),shift.end(),std::ostream_iterator<size_t>(std::cout,","));std::cout<<std::endl;
+                                std::cout<<"Qt.Bp.degree=";std::copy(degree.begin(),degree.end(),std::ostream_iterator<size_t>(std::cout,","));std::cout<<std::endl;                                
+
+                                std::cout<<std::endl;
+#endif
+#endif
+                                
+                                for (size_t i=0;i<rank;++i) {
+                                        dmax=std::max(dmax, degree[i]);
+                                        degree[i]++;
+                                        shift [i]++;
+                                }
+                                for (size_t i=rank;i<m;i++){
+                                        degree[i]=std::max(degree[i],dmax);
+                                }
+                                max_degree=std::min(order,std::max(max_degree,dmax+1));                     
+#ifdef __DEBUG_MBASIS
+                                std::cout<<"max degree:"<<max_degree<<std::endl;
+                                std::cout<<"Qt.Bp.shift=";std::copy(shift.begin(),shift.end(),std::ostream_iterator<size_t>(std::cout,","));std::cout<<std::endl;
+                                std::cout<<"Qt.Bp.degree=";std::copy(degree.begin(),degree.end(),std::ostream_iterator<size_t>(std::cout,","));std::cout<<std::endl;                                
+                                
+#endif
+                                // shift the pivot row of sigma by x
+                                for (int l=max_degree-1;l>=0;l--)
+                                        for (size_t i=0;i<rank;i++)
+                                                for (size_t j=0;j<m;j++)
+                                                        sigma.ref(i,j,l+1)=sigma.ref(i,j,l);
+                                                        //sigma.ref(Qt[i],j,l+1)=sigma.ref(Qt[i],j,l);
+                                for (size_t i=0;i<rank;i++)
+                                        for (size_t j=0;j<m;j++)
+                                                sigma.ref(i,j,0)=field().zero;
+#ifdef __DEBUG_MBASIS
+                                std::cout<<"max degree="<<max_degree<<std::endl<<std::endl;
+                                std::cout<<"F"<<k<<":="<<sigma<<std::endl<<"******************"<<std::endl;
+                                std::cout<<std::endl;
+#endif
+                                // update Early Termination
+                                //_EarlyStop.update(rank,shift); 
+#ifdef __CHECK_MBASIS
+                                std::cout<<"MBASIS: order "<<k<<check_orderbasis(field(),sigma,serie,k+1)<<std::endl;
+#endif
+                                
+                                _EarlyStop.update(m-rank,shift); // codimension (m-rank) seems better
+                        }
+                        
+                        if (_EarlyStop.terminated()) { 
+                                std::cout<<"OrderBasis: Early Termination at :"<<k<<"/"<<order<<std::endl;
+                        }
+                         
+                        sigma.resize(max_degree+1);
+                        return max_degree;
+                }
+
+
+
+                inline size_t twoValuation(size_t x){
+                        size_t i=0;
+                        while (x!=0 && !(x&0x1)){
+                                i++;
+                                x>>=1;
+                        }
+                        return i;
+                }
+
+                template<class Polynomial1>
+                void update_sigma(size_t m, size_t n, std::list<Polynomial1*>& L, size_t k){
+                        Polynomial1 *P1,*P2,*P3;
+                        for(size_t i=0;i<k;i++){
+                                P2=L.back();L.pop_back();
+                                P3=L.back();L.pop_back();
+                                P1 = new Polynomial1(field(),m,n,P2->size()+P3->size()-1);
+                                _PMD.mul(*P1,*P2,*P3);
+                                L.push_back(P1);
+                                delete P2; delete P3;
+                        }
+                }
+
+                // serie must have exactly order elements (i.e. its degree = order-1)
+                // sigma can have at most order+1 elements (i.e. its degree = order)
+                // Algorithm from [Giorgi, Lebreton ISSAC'2014]
+                template<typename PMatrix1, typename PMatrix2>
+                void oPM_Basis(PMatrix1             &sigma,
+                               const PMatrix2       &serie,
+                               size_t                order,
+                               std::vector<size_t>       &shift)
+                {
+                        size_t m,n,k,l,lp;
+                        m=sigma.rowdim();
+                        n=sigma.coldim();
+                        k=serie.coldim();
+
+                        // log of the order
+                        size_t log_order=integer(order).bitsize();
+
+                        //  leaf size of the recursive PM_Basis algorithm (must be a power of 2)
+                        size_t log_ord = MBASIS_THRESHOLD_LOG;
+                        size_t ord     = std::min(size_t(1)<<log_ord ,order);
+
+                        // prepare the storage for each serie update
+                        std::vector<PMatrix2*> L_serie(log_order+1);
+                        for (size_t i=log_ord;i<log_order;i++)
+                                L_serie[i]= new PMatrix2(field(),n,k,(1<<i));
+                        L_serie[log_order]=const_cast<PMatrix2*>(&serie);
+
+                        typedef typename PMatrix2::const_view cview;
+                        std::list<PMatrix1*>  L_sigma;
+                        PMatrix1*         sigmak;
+                        cview             seriek;
+                        typedef HalflineMPDomain<Field,PMatrix2,PMatrix1,PMatrix2> HFMPD;
+                        std::list<HFMPD*> L_mp;
+                        typename std::list<HFMPD*>::iterator iter, t_iter;
+
+                        // // Reset Early Termination
+                        _EarlyStop.reset();
+
+                        sigmak = new PMatrix1(field(),m,n,ord+1);
+                        seriek = serie.at(0,ord-1);
+                        M_Basis(*sigmak, seriek, ord, shift);
+                        L_sigma.push_back(sigmak);
+                        size_t sss=0;
+                        for(size_t k=ord;k<order &&  !_EarlyStop.terminated();k+=ord,sss++){
+                                //std::cout<<"------------ order="<<k<<std::endl;
+                                l  = twoValuation(k);
+                                lp = twoValuation(k-(1<<l)); lp=(lp==0?log_order:lp);
+                                // compute next element in the original serie and
+                                // update all subsequent computed series
+                                for(iter=L_mp.begin(); iter!=L_mp.end(); ){
+                                        (*iter)->update(ord);
+                                        t_iter=iter;
+                                        ++iter;
+
+                                        if ((*t_iter)->terminated()){
+                                                delete *t_iter;
+                                                L_mp.erase(t_iter);
+                                        }
+                                }
+
+                                // compute the serie update
+                                //seriek = const_cast<const PMatrix2*>(L_serie[lp])->at(0,min(order,(1ULL<<(l+1)))-1);
+
+                                //size_t update_max=min(order,1ULL<<(l+1));
+                                //_PMD.midproductgen(*L_serie[l],*L_sigma.back(), seriek, true, (1ULL<<l)+1,update_max);
+
+ 
+                                /*
+                                  cout<<"---------------"<<endl;
+                                  cout<<"MP "<<(1ULL<<l)<<"x"<<(1ULL<<(l+1))<<endl;
+                                  cout<<*(L_sigma.back())<<endl;
+                                  cout<<lp<<" ----- "<<endl<<*(L_serie[lp])<<endl;
+                                  cout<<"---------------"<<endl;
+                                */
+
+                                //L_mp.push_back(new HFMPD(field(),*(L_serie[l]),*(L_sigma.back()), seriek, 1ULL<<l));
+                                L_mp.push_back(new HFMPD(field(),*(L_serie[l]),*(L_sigma.back()),*(L_serie[lp]), 1ULL<<l));
+
+                                // compute the new sigma
+                                sigmak = new PMatrix(field(),m,n,ord+1);
+                                size_t step= std::min(ord,order-k); // needed if order%ord <> 0
+                                seriek = const_cast<const PMatrix2*>(L_serie[l])->at(0,step-1);
+
+                                // compute the next "step" elements of the serie L_serie[l]
+                                L_mp.back()->update(ord);
+
+                                M_Basis(*sigmak, seriek, step, shift);
+                                L_sigma.push_back(sigmak);
+
+                                // update the sigma list
+                                update_sigma(m, n, L_sigma, twoValuation(k/ord+1));
+                        }
+                        // get the product of all sigma
+                        if (L_sigma.size()>1){
+                                update_sigma(m, n, L_sigma, L_sigma.size()-2);
+                                PMatrix1 *s1,*s2;
+                                s1= L_sigma.back();L_sigma.pop_back();
+                                s2= L_sigma.back();L_sigma.pop_back();
+                                _PMD.mul(sigma,*s1,*s2);
+                                delete s1; delete s2;
+                        }
+                        else {
+                                sigma.resize(L_sigma.back()->size());
+                                sigma.copy(*L_sigma.back(),0,L_sigma.back()->size()-1);
+                                delete L_sigma.back();
+                        }
+                        for (size_t i=0;i<log_order;i++)
+                                delete L_serie[i];
+
+                        // Info about early termination
+                        //if (_EarlyStop.terminated())
+                        //        cout<<"Early termination at order "<<sss<<" ("<<order<<")"<<endl;
+                }
+
+        };
+
+} // end of namespace LinBox
+
+// Local Variables:
+// mode: C++ 
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/polynomial-matrix/polynomial-fft-transform-simd.inl b/linbox/algorithms/polynomial-matrix/polynomial-fft-transform-simd.inl
new file mode 100644
index 0000000..6c5e0f8
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/polynomial-fft-transform-simd.inl
@@ -0,0 +1,817 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2014  Pascal Giorgi, Romain Lebreton
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ *            Romain Lebreton <romain.lebreton at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+#ifndef __LINBOX_polynomial_fft_transform_simd_INL
+#define __LINBOX_polynomial_fft_transform_simd_INL
+
+#include "linbox/algorithms/polynomial-matrix/simd.h"
+
+namespace LinBox {
+
+	
+	/******************************************************************************************************************
+	 ******************************************************************************************************************
+	 ***********************************    FFT with SSE CODE   *******************************************************
+	 ******************************************************************************************************************
+	 ******************************************************************************************************************/
+
+	template <class Field>
+	inline void FFT_transform<Field>::reduce128_modp(uint32_t* ABCD, const _vect128_t& P) {
+		_vect128_t V1,T;
+		// V1=[A B C D], V2=[E F G H]
+		VEC128_LOAD(V1,ABCD);
+		VEC128_MOD_P(V1,V1,P,T);
+		VEC128_STORE(ABCD,V1);
+	}
+
+	/*-----------------------------------*/
+	/*--        Butterflies DIF      ----*/
+	/*-----------------------------------*/
+
+
+	template <class Field>
+	inline void FFT_transform<Field>::Butterfly_DIF_mod2p_4x1_SSE(uint32_t* ABCD, uint32_t* EFGH,
+								      const uint32_t* alpha,
+								      const uint32_t* alphap,
+								      const _vect128_t& P, const _vect128_t& P2)
+	{
+		_vect128_t V1,V2,V3,V4,W,Wp,T;
+		// V1=[A B C D], V2=[E F G H]
+		VEC128_LOAD(V1,ABCD);
+		VEC128_LOAD(V2,EFGH);
+		VEC128_LOAD(W ,alpha);
+		VEC128_LOAD(Wp,alphap);
+		// V3 = V1 + V2 mod
+		VEC128_ADD_MOD(V3,V1,V2,P2,T);
+		VEC128_STORE(ABCD,V3);
+		// V4 = (V1+(2P-V2))alpha mod 2P
+		VEC128_SUB_32(T,V2,P2);
+		VEC128_SUB_32(V4,V1,T);
+		VEC128_MUL_MOD(T,V4,W,P,Wp,V1,V2,V3);// V3 is the result
+		VEC128_STORE(EFGH,T);
+	}
+
+
+	template <class Field>
+	inline void FFT_transform<Field>::Butterfly_DIF_mod2p_4x1_SSE_laststep(uint32_t* ABCD, uint32_t* EFGH, const _vect128_t& P2) {
+		_vect128_t V1,V2,V3,V4,V5;
+		// V1=[A B C D], V2=[E F G H]
+		VEC128_LOAD(V1,ABCD);
+		VEC128_LOAD(V2,EFGH);
+		// V3 = [A C B D], V4 = [E G F H]
+		VEC128_SHUFFLE_32(V3,V1,0xD8);
+		VEC128_SHUFFLE_32(V4,V2,0xD8);
+		// V1 = [A E C G], V2 = [B F D H]
+		VEC128_UNPACK_LO_32(V1,V3,V4);
+		VEC128_UNPACK_HI_32(V2,V3,V4);
+		// V3 = V1 + V2 mod 2P
+		VEC128_ADD_MOD(V3,V1,V2,P2,V5);
+		// V4 = V1 + (2P - V2) mod 2P
+		VEC128_SUB_32(V5,V2,P2);
+		VEC128_SUB_32(V2,V1,V5);
+		VEC128_MOD_P(V4,V2,P2,V5);
+		// V1 = [A C E G], V2 = [B D F H]
+		VEC128_SHUFFLE_32(V1,V3,0xD8);
+		VEC128_SHUFFLE_32(V2,V4,0xD8);
+		// V3 = [A B C D], V4 = [E F G H]
+		VEC128_UNPACK_LO_32(V3,V1,V2);
+		VEC128_UNPACK_HI_32(V4,V1,V2);
+		// Store
+		VEC128_STORE(ABCD,V3);
+		VEC128_STORE(EFGH,V4);
+	}
+
+	template <class Field>
+	inline void FFT_transform<Field>::Butterfly_DIF_mod2p_4x2_SSE(uint32_t* ABCD, uint32_t* EFGH, uint32_t* IJKL, uint32_t* MNOP,
+								      const uint32_t* alpha,  const uint32_t*beta ,  const uint32_t* gamma,
+								      const uint32_t* alphap, const uint32_t*betap , const uint32_t* gammap,
+								      const _vect128_t& P, const _vect128_t& P2) {
+		_vect128_t V1,V2,V3,V4,W,Wp,T1,T2,T3,T4,T5,T6,T7,T8;
+
+		// V1=[A B C D], V2=[E F G H], V3=[I J K L], V4=[M N O P]
+		VEC128_LOAD(V1,ABCD);
+		VEC128_LOAD(V2,IJKL);
+		VEC128_LOAD(W ,alpha);
+		VEC128_LOAD(Wp,alphap);
+		/**************/
+		// T1 = V1 + V2 mod 2P
+		VEC128_ADD_MOD(T1,V1,V2,P2,T8);
+		// T2 = (V1+(2P-V2))alpha mod 2P
+		VEC128_SUB_32(T7,V2,P2);
+		VEC128_SUB_32(T6,V1,T7);
+		VEC128_MUL_MOD(T2,T6,W,P,Wp,T3,T4,T5);
+		/**************/
+		VEC128_LOAD(V3,EFGH);
+		VEC128_LOAD(V4,MNOP);
+		VEC128_LOAD(W ,beta);
+		VEC128_LOAD(Wp,betap);
+		/**************/
+		// T3 = V3 + V4 mod 2P
+		VEC128_ADD_MOD(T3,V3,V4,P2,T8);
+		// T4 = (V3+(2P-V4))beta mod 2P
+		VEC128_SUB_32(T7,V4,P2);
+		VEC128_SUB_32(T6,V3,T7);
+		VEC128_MUL_MOD(T4,T6,W,P,Wp,V1,V2,T8);// T1 is the result
+		/**************/
+		VEC128_LOAD(W ,gamma);
+		VEC128_LOAD(Wp,gammap);
+		/**************/
+		// V1 = T1 + T3 mod 2P
+		VEC128_ADD_MOD(V1,T1,T3,P2,T8);
+		// V3 = (T1+(2P-T3))gamma mod 2P
+		VEC128_SUB_32(T7,T3,P2);
+		VEC128_SUB_32(T6,T1,T7);
+		VEC128_MUL_MOD(V3,T6,W,P,Wp,T3,T5,T8);// T1 is the result
+		/**************/
+		// V2 = T2 + T4 mod 2P
+		VEC128_ADD_MOD(V2,T2,T4,P2,T8);
+		// V4 = (T2+(2P-T4))gamma mod 2P
+		VEC128_SUB_32(T7,T4,P2);
+		VEC128_SUB_32(T6,T2,T7);
+		VEC128_MUL_MOD(V4,T6,W,P,Wp,T1,T3,T8);// T1 is the result
+		/**************/
+		VEC128_STORE(ABCD,V1);
+		VEC128_STORE(EFGH,V3);
+		VEC128_STORE(IJKL,V2);
+		VEC128_STORE(MNOP,V4);
+	}
+
+
+
+	template <class Field>
+	inline void FFT_transform<Field>::Butterfly_DIF_mod2p_4x2_SSE_last2step(uint32_t* ABCD, uint32_t* EFGH,
+										const _vect128_t& W,
+										const _vect128_t& Wp,
+										const _vect128_t& P, const _vect128_t& P2) {
+		_vect128_t V1,V2,V3,V4,V5,V6,V7;
+		// V1=[A B C D], V2=[E F G H]
+		VEC128_LOAD(V1,ABCD);
+		VEC128_LOAD(V2,EFGH);
+		// V3=[A E B F], V4=[C G D H]
+		VEC128_UNPACK_LO_32(V3,V1,V2);
+		VEC128_UNPACK_HI_32(V4,V1,V2);
+		// V1 = V3 + V4 mod 2P
+		// P2 = [2p 2p 2p 2p]
+		VEC128_ADD_MOD(V1,V3,V4,P2,V5);
+		// V2 = (V3+(2P-V4))alpha mod 2P
+		VEC128_SUB_32(V5,V4,P2);
+		VEC128_SUB_32(V6,V3,V5);
+		VEC128_MOD_P(V2,V6,P2,V2);
+		// V4 = [D D H H]
+		VEC128_UNPACK_HI_32(V4,V2,V2);
+		// V6 = V4 * Wp mod 2^64
+		// Wp = [Wp ? Wp ?]
+		VEC128_MUL_32(V7,V4,Wp);
+		VEC128_MUL_LO_32(V5,V7,P);
+		// At this point V4= [? Q_D*p ? Q_H*p]
+		// V5 = [D D H H] * [W W W W] mod 2^32
+		VEC128_MUL_LO_32(V6,V4,W);
+		VEC128_SUB_32(V4,V6,V5);
+		VEC128_SHUFFLE_32(V3,V4,0xDD);
+		//At this point, V2 = [D*Wmodp H*Wmodp D*Wmodp H*Wmodp]
+		// At this time I have V1=[A E B F], V2=[C G ? ?], V3=[? ? D H]
+		// I need V3 = [A C E G], V4 = [B D F H]
+		VEC128_UNPACK_HI_32(V4,V1,V3);
+		VEC128_UNPACK_LO_32(V3,V1,V2);
+		// V1 = V3 + V4 mod 2P
+		VEC128_ADD_MOD(V1,V3,V4,P2,V5);
+		// V2 = V3 + (2P - V4) mod 2P
+		VEC128_SUB_32(V5,V4,P2);
+		VEC128_SUB_32(V6,V3,V5);
+		VEC128_MOD_P(V2,V6,P2,V2);
+		// Result in V1 = [A C E G]  and V2 = [B D F H]
+		// Transform to V3=[A B C D], V4=[E F G H]
+		VEC128_UNPACK_LO_32(V3,V1,V2);
+		VEC128_UNPACK_HI_32(V4,V1,V2);
+		// Store
+		VEC128_STORE(ABCD,V3);
+		VEC128_STORE(EFGH,V4);
+	}
+
+
+	/*-----------------------------------*/
+	/*--        Butterflies DIT      ----*/
+	/*-----------------------------------*/
+
+
+	template <class Field>
+	inline void FFT_transform<Field>::Butterfly_DIT_mod4p_4x1_SSE(uint32_t* ABCD, uint32_t* EFGH,
+								      const uint32_t* alpha,
+								      const uint32_t* alphap,
+								      const _vect128_t& P, const _vect128_t& P2) {
+		_vect128_t V1,V2,V3,V4,W,Wp,T1,T2;
+		// V1=[A B C D], V2=[E F G H]
+		VEC128_LOAD(V1,ABCD);
+		VEC128_LOAD(V2,EFGH);
+		VEC128_LOAD(W ,alpha);
+		VEC128_LOAD(Wp,alphap);
+		// V3 = V1 mod 2P
+		VEC128_MOD_P (V3,V1,P2,T1);
+		// V4 = V2 * W mod P
+		VEC128_MUL_MOD(V4,V2,W,P,Wp,V1,T1,T2);
+		// V1 = V3 + V4
+		VEC128_ADD_32(V1,V3,V4);
+		VEC128_STORE(ABCD,V1);
+		// V2 = V3 - (V4 - 2P)
+		VEC128_SUB_32(T1,V4,P2);
+		VEC128_SUB_32(V2,V3,T1);
+		VEC128_STORE(EFGH,V2);
+	}
+
+	template <class Field>
+	inline void FFT_transform<Field>::Butterfly_DIT_mod4p_4x2_SSE_first2step(uint32_t* ABCD, uint32_t* EFGH,
+										 const _vect128_t& W,
+										 const _vect128_t& Wp,
+										 const _vect128_t& P, const _vect128_t& P2) {
+		_vect128_t V1,V2,V3,V4,T1,T2,T3,T4;
+		// V1=[A B C D], V2=[E F G H]
+		VEC128_LOAD(V1,ABCD);
+		VEC128_LOAD(V2,EFGH);
+		// T1 = [A C B D], T2 = [E G F H]
+		VEC128_SHUFFLE_32(T1,V1,0xD8);
+		VEC128_SHUFFLE_32(T2,V2,0xD8);
+		// V1 = [A E C G], V2 = [B F D H]
+		VEC128_UNPACK_LO_32(V1,T1,T2);
+		VEC128_UNPACK_HI_32(V2,T1,T2);
+		// V3 = V1 + V2
+		// Rk: No need for (. mod 2P) since entries are <P
+		VEC128_ADD_32(V3,V1,V2);
+		// V4 = V1 + (P - V2)
+		// Rk: No need for (. mod 2P) since entries are <P
+		VEC128_SUB_32(T1,V2,P);
+		VEC128_SUB_32(V4,V1,T1);
+		// T1 = [D D H H]
+		VEC128_UNPACK_HI_32(T1,V4,V4);
+		// T2 = T1 * Wp mod 2^64
+		// Wp = [Wp ? Wp ?]
+		VEC128_MUL_32(T2,T1,Wp);
+		VEC128_MUL_LO_32(T3,T2,P);
+		// At this point T3= [? Q_D*p ? Q_H*p]
+		// T4 = [D D H H] * [W W W W] mod 2^32
+		VEC128_MUL_LO_32(T4,T1,W);
+		VEC128_SUB_32(T1,T4,T3);
+		VEC128_SHUFFLE_32(T2,T1,0XDD);
+		//At this point, T2 = [D*Wmodp H*Wmodp D*Wmodp H*Wmodp]
+		// At this time I have V3=[A E C G], V4=[B F ? ?], T2=[? ? D H]
+		// I need V1 = [A B E F], V2 = [C D G H]
+		VEC128_UNPACK_LO_32(V1,V3,V4);
+		VEC128_UNPACK_HI_32(V2,V3,T2);
+		// T1 = V1 + V2
+		VEC128_ADD_32(T1,V1,V2);
+		// T2 = V1 - (V2 - 2P)
+		VEC128_SUB_32(T3,V2,P2);
+		VEC128_SUB_32(T2,V1,T3);
+		// Result in T1 = [A B E F]  and T2 = [C D G H]
+		// Transform to V1=[A C B D], V2=[E G F H]
+		VEC128_UNPACK_LO_32(V1,T1,T2);
+		VEC128_UNPACK_HI_32(V2,T1,T2);
+		// Then T1=[A B C D], T2=[E F G H]
+		VEC128_SHUFFLE_32(T1,V1,0xD8);
+		VEC128_SHUFFLE_32(T2,V2,0xD8);
+		// Store
+		VEC128_STORE(ABCD,T1);
+		VEC128_STORE(EFGH,T2);
+	}
+
+	/*-----------------------------------*/
+	/*--       SSE FFT functions     ----*/
+	/*-----------------------------------*/
+
+	template <class Field>
+	void FFT_transform<Field>::FFT_DIF_Harvey_mod2p_iterative4x1_SSE (uint32_t *fft) {
+		_vect128_t P,P2;
+		P  = _mm_set1_epi32(_pl);
+		P2 = _mm_set1_epi32(_dpl);
+		uint32_t * tab_w = &pow_w [0];
+		uint32_t * tab_wp= &pow_wp[0];
+		size_t w, f;
+		for (w = n >> 1, f = 1; w >= 4; tab_w+=w, tab_wp+=w, w >>= 1, f <<= 1){
+			// w : witdh of butterflies
+			// f : # families of butterflies
+			for (size_t i = 0; i < f; i++)
+				for (size_t j = 0; j < w; j+=4)
+
+#define A0 &fft[0] +  (i << 1)   *w+ j
+#define A4 &fft[0] + ((i << 1)+1)*w+ j
+					Butterfly_DIF_mod2p_4x1_SSE(A0,A4, tab_w+j,tab_wp+j,P,P2);
+#undef A0
+#undef A4
+			//std::cout<<fft<<std::endl;
+		}
+		// Last two steps
+		if (n >= 8) {
+			_vect128_t W,Wp;
+			W = _mm_set1_epi32 ((int)tab_w [1]);
+			Wp= _mm_set1_epi32 ((int)tab_wp[1]);
+
+			for (size_t i = 0; i < f; i+=2)
+#define A0 &fft[0] +  (i << 2)
+#define A4 &fft[0] + ((i << 2)+4)
+				Butterfly_DIF_mod2p_4x2_SSE_last2step(A0,A4,W,Wp,P,P2);
+			//std::cout<<fft<<std::endl;
+#undef A0
+#undef A4
+		} else {
+			for (; w >= 1; tab_w+=w, tab_wp+=w, w >>= 1, f <<= 1)
+				for (size_t i = 0; i < f; i++)
+					for (size_t j = 0; j < w; j++)
+						Butterfly_DIF_mod2p(fft[(i << 1)*w+j], fft[((i << 1)+1)*w+j], tab_w[j], tab_wp[j]);
+		}
+	}
+
+	template <class Field>
+	void FFT_transform<Field>::FFT_DIF_Harvey_mod2p_iterative4x2_SSE (uint32_t *fft) {
+		size_t w, f;
+		_vect128_t P,P2;
+		P  = _mm_set1_epi32(_pl);
+		P2 = _mm_set1_epi32(_dpl);
+		uint32_t * tab_w =  &pow_w[0];
+		uint32_t * tab_wp= &pow_wp[0];
+		for (w = n >> 1, f = 1; w >= 8; tab_w+=w+(w>>1), tab_wp+=w+(w>>1), w >>= 2, f <<= 2)
+			// w : witdh of butterflies
+			// f : # families of butterflies
+			for (size_t i = 0; i < f; i++)
+				for (size_t j = 0; j < (w >> 1); j+=4) {
+#define A0 &fft[0] + (i << 1)    *w+ j
+#define A1 &fft[0] + (i << 1)    *w+(j+(w >> 1))
+#define A2 &fft[0] + ((i << 1)+1)*w+ j
+#define A3 &fft[0] + ((i << 1)+1)*w+(j+(w >> 1))
+
+					Butterfly_DIF_mod2p_4x2_SSE(A0, A1, A2, A3,
+								    tab_w +j, tab_w +j+(w >> 1), tab_w +j+w,
+								    tab_wp+j, tab_wp+j+(w >> 1), tab_wp+j+w,
+								    P,P2);
+#undef A0
+#undef A1
+#undef A2
+#undef A3
+				}
+
+		// Last two steps
+		if (n >= 8) {
+			if (w == 4) {
+				for (size_t i = 0; i < f; i++)
+#define A0 &fft[0] +  (i << 1)   *w
+#define A4 &fft[0] + ((i << 1)+1)*w
+					Butterfly_DIF_mod2p_4x1_SSE(A0,A4, tab_w,tab_wp,P,P2);
+#undef A0
+#undef A4
+				tab_w+=w;
+				tab_wp+=w;
+				w >>= 1;
+				f <<= 1;
+			}
+
+			_vect128_t W,Wp;
+			W = _mm_set1_epi32 ((int)tab_w [1]);
+			Wp= _mm_set1_epi32 ((int)tab_wp[1]);
+
+			for (size_t i = 0; i < f; i+=2)
+#define A0 &fft[0] +  (i << 2)
+#define A4 &fft[0] + ((i << 2)+4)
+				Butterfly_DIF_mod2p_4x2_SSE_last2step(A0,A4,W,Wp,P,P2);
+#undef A0
+#undef A4
+		} else {
+			for (; w >= 1; tab_w+=w, tab_wp+=w, w >>= 1, f <<= 1)
+				for (size_t i = 0; i < f; i++)
+					for (size_t j = 0; j < w; j++)
+						Butterfly_DIF_mod2p(fft[(i << 1)*w+j], fft[((i << 1)+1)*w+j], tab_w[j], tab_wp[j]);
+		}
+	}
+
+	template <class Field>
+	void FFT_transform<Field>::FFT_DIT_Harvey_mod4p_iterative4x1_SSE (uint32_t *fft)
+	{
+		_vect128_t P,P2;
+		VEC128_SET_32(P,_pl);
+		VEC128_SET_32(P2,_dpl);
+		// Last two steps
+		if (n >= 8) {
+			_vect128_t W,Wp;
+			W = _mm_set1_epi32 ((int)pow_w [n-3]);
+			Wp= _mm_set1_epi32 ((int)pow_wp[n-3]);
+
+			for (size_t i = 0; i < n; i+=8)
+				Butterfly_DIT_mod4p_4x2_SSE_first2step(&fft[i],&fft[i+4],W,Wp,P,P2);
+
+			uint32_t * tab_w = &pow_w [n-8];
+			uint32_t * tab_wp= &pow_wp[n-8];
+			for (size_t w = 4, f = n >> 3; f >= 1; w <<= 1, f >>= 1, tab_w-=w, tab_wp-=w){
+				// w : witdh of butterflies
+				// f : # families of butterflies
+				for (size_t i = 0; i < f; i++)
+					for (size_t j = 0; j < w; j+=4)
+#define A0 &fft[0] +  (i << 1)   *w+ j
+#define A4 &fft[0] + ((i << 1)+1)*w+ j
+						Butterfly_DIT_mod4p_4x1_SSE(A0,A4, tab_w+j,tab_wp+j,P,P2);
+
+#undef A0
+#undef A4
+
+			}
+		} else {
+			uint32_t * tab_w = &pow_w [n-2];
+			uint32_t * tab_wp= &pow_wp[n-2];
+			for (size_t w = 1, f = n >> 1; f >= 1; w <<= 1, f >>= 1, tab_w-=w, tab_wp-=w)
+				for (size_t i = 0; i < f; i++)
+					for (size_t j = 0; j < w; j++)
+						Butterfly_DIT_mod4p(fft[(i << 1)*w+j], fft[((i << 1)+1)*w+j], tab_w[j], tab_wp[j]);
+		}
+	}
+
+
+	/******************************************************************************************************************
+	 ******************************************************************************************************************
+	 ***********************************   FFT with AVX 2 CODE  *******************************************************
+	 ******************************************************************************************************************
+	 ******************************************************************************************************************/
+
+
+#ifdef __LINBOX_HAVE_AVX2
+
+	template <class Field>
+	inline void FFT_transform<Field>::reduce256_modp(uint32_t* ABCD, const _vect256_t& P) {
+		_vect256_t V1,T;
+		VEC256_LOADU(V1,ABCD);
+		VEC256_MOD_P(V1,V1,P,T);
+		VEC256_STOREU(ABCD,V1);
+	}
+
+
+	/*---------------------------------------------------*/
+	/*--  implementation of DIF with 256-bits AVX    ----*/
+	/*---------------------------------------------------*/
+
+	template <class Field>
+	inline void FFT_transform<Field>::Butterfly_DIF_mod2p_8x1_AVX(uint32_t* ABCDEFGH, uint32_t* IJKLMNOP,
+								      const uint32_t* alpha,
+								      const uint32_t* alphap,
+								      const _vect256_t& P, const _vect256_t& P2) {
+		_vect256_t V1,V2,V3,V4,W,Wp,T;
+		// V1=[A B C D E F G H], V2=[I J K L M N O P]
+		VEC256_LOADU(V1,ABCDEFGH);
+		VEC256_LOADU(V2,IJKLMNOP);
+		VEC256_LOADU(W ,alpha);
+		VEC256_LOADU(Wp,alphap);
+
+		// V3 = V1 + V2 mod
+		VEC256_ADD_MOD(V3,V1,V2,P2,T);
+		VEC256_STOREU(ABCDEFGH,V3);
+
+		// V4 = (V1+(2P-V2))alpha mod 2P
+		VEC256_SUB_32(T,V2,P2);
+		VEC256_SUB_32(V4,V1,T);
+		VEC256_MUL_MOD(T,V4,W,P,Wp,V1,V2,V3);// V3 is the result
+		VEC256_STOREU(IJKLMNOP,T);
+	}
+
+
+	template <class Field>
+	inline void FFT_transform<Field>::Butterfly_DIF_mod2p_8x3_AVX_last3step(uint32_t* ABCDEFGH, uint32_t* IJKLMNOP,
+										const _vect256_t& alpha,const _vect256_t& alphap,
+										const _vect256_t& beta ,const _vect256_t& betap,
+										const _vect256_t& P    ,const _vect256_t& P2) {
+		_vect256_t V1,V2,V3,V4,V5,V6,V7,Q;
+
+		// V1=[A B C D E F G H], V2=[I J K L M N O P]
+		VEC256_LOADU(V1,ABCDEFGH);
+		VEC256_LOADU(V2,IJKLMNOP);
+
+		/* 1st step */
+		// V3=[A B C D I J K L] V4=[E F G H M N O P]
+		VEC256_UNPACK_LO_128(V3,V1,V2);
+		VEC256_UNPACK_HI_128(V4,V1,V2);
+
+		// V1 = V3 + V4 mod 2P
+		// P2 = [2p 2p 2p 2p]
+		VEC256_ADD_MOD(V1,V3,V4,P2,V5);
+
+		// V2 = (V3+(2P-V4))alpha mod 2P
+		VEC256_SUB_32(V5,V4,P2);
+		VEC256_SUB_32(V6,V3,V5);
+		VEC256_MOD_P(V7,V6,P2,V2);
+		VEC256_MUL_MOD(V2,V7,alpha,P,alphap,V3,V4,V5);
+
+		/* 2nd step */
+
+		// V3=[A E B F I M J N] V4=[C G D H K O L P]
+		VEC256_UNPACK_LO_32(V3,V1,V2);
+		VEC256_UNPACK_HI_32(V4,V1,V2);
+
+		// V1 = V3 + V4 mod 2P
+		// P2 = [2p 2p 2p 2p]
+		VEC256_ADD_MOD(V1,V3,V4,P2,V5);
+
+		// V2 = (V3+(2P-V4))alpha mod 2P
+		// V7 =  (V3+(2P-V4)) mod 2P
+		VEC256_SUB_32(V5,V4,P2);
+		VEC256_SUB_32(V6,V3,V5);
+		VEC256_MOD_P(V7,V6,P2,V2);
+
+		// V4 = [D D H H L L P P ]
+		VEC256_UNPACK_HI_32(V4,V7,V7);
+
+		// Q = V4 * beta mod 2^64 = [* Qd * Qh * Ql * Qp]
+		// with betap= [ betap * betap * betap * betap *]
+		VEC256_MUL_32(Q,V4,betap);
+		// V5 = [* Qd.P * Qh.P * Ql.P * Qp.P]
+		VEC256_MUL_LO_32(V5,Q,P);
+		// V6 = V4 * beta mod 2^32
+		VEC256_MUL_LO_32(V6,V4,beta);
+		// V3 = V6 - V5 = [* (D.beta mod p) * (H.beta mod p) * (L.beta mod p) * (P.beta mod p)]
+		VEC256_SUB_32(V3,V6,V5);
+		// V2=[* * D H * * L P]
+		VEC256_SHUFFLE_32(V2,V3,0xDD);
+
+		/* 3nd step */
+		// At this time I have V1=[A B E F I J M N], V7=[C G * * K O * *], V2=[* * D H * * L P]
+		// I need V3 = [A C E G I K M O], V4=[B D F H J L N P]
+		VEC256_UNPACK_LO_32(V3,V1,V7);
+		VEC256_UNPACK_HI_32(V4,V1,V2);
+
+		// V1 = V3 + V4 mod 2P
+		VEC256_ADD_MOD(V1,V3,V4,P2,V5);
+
+		// V2 = V3 + (2P - V4) mod 2P
+		VEC256_SUB_32(V5,V4,P2);
+		VEC256_SUB_32(V6,V3,V5);
+		VEC256_MOD_P(V2,V6,P2,V2);
+
+		// Result in    V1=[A C E G I K M O] V2=[B D F H J L N P]
+		// Transform to V3=[A B C D I J K L],V4=[E F G H M N O P]
+		VEC256_UNPACK_LO_32(V3,V1,V2);
+		VEC256_UNPACK_HI_32(V4,V1,V2);
+
+		// Transform to V1=[A B C D E F G H], V2=[I J K L M N O P]
+		VEC256_UNPACK_LO_128(V1,V3,V4);
+		VEC256_UNPACK_HI_128(V2,V3,V4);
+
+		// Store
+		VEC256_STOREU(ABCDEFGH,V1);
+		VEC256_STOREU(IJKLMNOP,V2);
+	}
+
+
+
+	template <class Field>
+	void FFT_transform<Field>::FFT_DIF_Harvey_mod2p_iterative8x1_AVX (uint32_t *fft) {
+		_vect256_t P,P2;
+		VEC256_SET_32(P,_pl);
+		VEC256_SET_32(P2,_dpl);
+
+		uint32_t * tab_w = &pow_w [0];
+		uint32_t * tab_wp= &pow_wp[0];
+		size_t w, f;
+		for (w = n >> 1, f = 1; w >= 8; tab_w+=w, tab_wp+=w, w >>= 1, f <<= 1){
+			// w : witdh of butterflies
+			// f : # families of butterflies
+			for (size_t i = 0; i < f; i++)
+				for (size_t j = 0; j < w; j+=8)
+#define A0 &fft[0] +  (i << 1)   *w+ j
+#define A4 &fft[0] + ((i << 1)+1)*w+ j
+					Butterfly_DIF_mod2p_8x1_AVX(A0,A4, tab_w+j,tab_wp+j,P,P2);
+
+#undef A0
+#undef A4
+			//std::cout<<fft<<std::endl;
+		}
+		// Last three steps
+		if (n >= 16) {
+			_vect256_t alpha,alphap,beta,betap;
+			uint32_t tmp[8];
+			tmp[0]=tmp[4]=tab_w[0];
+			tmp[1]=tmp[5]=tab_w[1];
+			tmp[2]=tmp[6]=tab_w[2];
+			tmp[3]=tmp[7]=tab_w[3];
+			VEC256_LOADU(alpha,tmp);
+			tmp[0]=tmp[4]=tab_wp[0];
+			tmp[1]=tmp[5]=tab_wp[1];
+			tmp[2]=tmp[6]=tab_wp[2];
+			tmp[3]=tmp[7]=tab_wp[3];
+			VEC256_LOADU(alphap,tmp);
+			VEC256_SET_32(beta,tab_w [5]);
+			VEC256_SET_32(betap,tab_wp [5]);
+
+			for (size_t i = 0; i < f; i+=2)
+#define A0 &fft[0] + (i << 3)
+#define A4 &fft[0] + (i << 3)+8
+				Butterfly_DIF_mod2p_8x3_AVX_last3step(A0,A4,alpha,alphap,beta,betap,P,P2);
+#undef A0
+#undef A4
+			//std::cout<<fft<<std::endl;
+		} else {
+			for (; w >= 1; tab_w+=w, tab_wp+=w, w >>= 1, f <<= 1)
+				for (size_t i = 0; i < f; i++)
+					for (size_t j = 0; j < w; j++)
+						Butterfly_DIF_mod2p(fft[(i << 1)*w+j], fft[((i << 1)+1)*w+j], tab_w[j], tab_wp[j]);
+		}
+	}
+
+
+	/*---------------------------------------------------*/
+	/*--  implementation of DIF with 256-bits AVX    ----*/
+	/*---------------------------------------------------*/
+
+	template <class Field>
+	inline void FFT_transform<Field>::Butterfly_DIT_mod4p_8x1_AVX(uint32_t* ABCDEFGH, uint32_t* IJKLMNOP,
+								      const uint32_t* alpha,
+								      const uint32_t* alphap,
+								      const _vect256_t& P, const _vect256_t& P2) {
+		_vect256_t V1,V2,V3,V4,W,Wp,T1,T2;
+		// V1=[A B C D E F G H], V2=[I J K L M N O P]
+		VEC256_LOADU(V1,ABCDEFGH);
+		VEC256_LOADU(V2,IJKLMNOP);
+		VEC256_LOADU(W ,alpha);
+		VEC256_LOADU(Wp,alphap);
+
+		// V3 = V1 mod 2P
+		VEC256_MOD_P (V3,V1,P2,T1);
+
+		// V4 = V2 * W mod P
+		VEC256_MUL_MOD(V4,V2,W,P,Wp,V1,T1,T2);
+
+		// V1 = V3 + V4
+		VEC256_ADD_32(V1,V3,V4);
+		VEC256_STOREU(ABCDEFGH,V1);
+
+		// V2 = V3 - (V4 - 2P)
+		VEC256_SUB_32(T1,V4,P2);
+		VEC256_SUB_32(V2,V3,T1);
+		VEC256_STOREU(IJKLMNOP,V2);
+	}
+
+
+	template <class Field>
+	inline void FFT_transform<Field>::Butterfly_DIT_mod4p_8x3_AVX_first3step(uint32_t* ABCDEFGH, uint32_t* IJKLMNOP,
+										 const _vect256_t& alpha,const _vect256_t& alphap,
+										 const _vect256_t& beta ,const _vect256_t& betap,
+										 const _vect256_t& P, const _vect256_t& P2) {
+		_vect256_t V1,V2,V3,V4,V5,V6,V7,Q;
+		// V1=[A B C D E F G H], V2=[I J K L M N O P]
+		VEC256_LOADU(V1,ABCDEFGH);
+		VEC256_LOADU(V2,IJKLMNOP);
+
+
+		/*********************************************/
+		/* 1st STEP */
+		/*********************************************/
+		// Transform to V3=[A I C K E M G O], V4=[B J D L F N H P]
+		VEC256_UNPACK_LO_32(V6,V1,V2); // V6=[A I B J E M F N]
+		VEC256_UNPACK_HI_32(V7,V1,V2); // V7=[C K D L G O H P]
+		VEC256_UNPACK_LO_64(V3,V6,V7); // V3=[A I C K E M G O]
+		VEC256_UNPACK_HI_64(V4,V6,V7); // V4=[B J D L F N H P]
+
+
+
+
+		// V1 = V3 + V4;       V1 = [A I C K E M G O]
+		// Rk: No need for (. mod 2P) since entries are <P
+		VEC256_ADD_32(V1,V3,V4);
+
+		// V2 = V3 + (P - V4); V2 = [B J D L F N H P]
+		// Rk: No need for (. mod 2P) since entries are <P
+		VEC256_SUB_32(V6,V4,P);
+		VEC256_SUB_32(V2,V3,V6);
+
+		/*********************************************/
+		/* 2nd STEP */
+		/*********************************************/
+		// V5 = [D D L L H H P P]
+		VEC256_UNPACK_HI_32(V5,V2,V2);
+		// Q = V5 * alpha mod 2^64 = [* Qd * Qh * Ql * Qp]
+		// with betap= [ alphap * alphap * alphap * alphap *]
+		VEC256_MUL_32(Q,V5,alphap);
+		// V6 = [* Qd.P * Qh.P * Ql.P * Qp.P]
+		VEC256_MUL_LO_32(V6,Q,P);
+		// V7 = V5 * alpha mod 2^32
+		VEC256_MUL_LO_32(V7,V5,alpha);
+		// V3 = V7 - V6 = [* (D.alpha mod p) * (L.alpha mod p) * (H.alpha mod p) * (P.alpha mod p)]
+		VEC256_SUB_32(V3,V7,V6);
+		// V7=[D L * * H P * *]
+		VEC256_SHUFFLE_32(V7,V3,0xFD);
+		// V6 = [B J D L F N H P]
+		VEC256_UNPACK_LO_64(V6,V2,V7);
+		// V3= [A B I J E F M N], V4=[C D K L G H O P]
+		VEC256_UNPACK_LO_32(V3,V1,V6);
+		VEC256_UNPACK_HI_32(V4,V1,V6);
+
+		// V1 = V3+V4
+		VEC256_ADD_32(V1,V3,V4);
+		// V2 = V3 - (V4 - 2P)
+		VEC256_SUB_32(V7,V4,P2);
+		VEC256_SUB_32(V2,V3,V7);
+
+		/*********************************************/
+		/* 3nd STEP */
+		/*********************************************/
+		// V3= [A B C D I J K L] V4= [E F G H M N O P]
+		VEC256_UNPACK_LO_64(V6,V1,V2);
+		VEC256_UNPACK_HI_64(V7,V1,V2);
+		VEC256_UNPACK_LO_128(V3,V6,V7);
+		VEC256_UNPACK_HI_128(V4,V6,V7);
+
+		// V6= V3 mod 2P
+		VEC256_MOD_P(V6,V3,P2,V7);
+
+		// V7= V4.beta mod p
+		VEC256_MUL_MOD(V7,V4,beta,P,betap,V1,V2,V5);
+
+		// V1 = V6+V7
+		VEC256_ADD_32(V1,V6,V7);
+
+		// V2 = V6 - (V7 - 2P)
+		VEC256_SUB_32(V5,V7,P2);
+		VEC256_SUB_32(V2,V6,V5);
+
+		/*********************************************/
+		// V3=[A B C D E F G H] V4=[I J K L M N O P]
+		VEC256_UNPACK_LO_128(V3,V1,V2);
+		VEC256_UNPACK_HI_128(V4,V1,V2);
+
+		// Store
+		VEC256_STOREU(ABCDEFGH,V3);
+		VEC256_STOREU(IJKLMNOP,V4);
+	}
+
+
+
+	template <class Field>
+	void FFT_transform<Field>::FFT_DIT_Harvey_mod4p_iterative8x1_AVX (uint32_t *fft) {
+		_vect256_t P,P2;
+		VEC256_SET_32(P,_pl);
+		VEC256_SET_32(P2,_dpl);
+
+		// first three steps
+		if (n >= 16) {
+			_vect256_t alpha,alphap,beta,betap;
+			VEC256_SET_32(alpha,pow_w[n-3]);
+			VEC256_SET_32(alphap,pow_wp[n-3]);
+			uint32_t tmp[8];
+			tmp[0]=tmp[4]=pow_w[n-8];
+			tmp[1]=tmp[5]=pow_w[n-7];
+			tmp[2]=tmp[6]=pow_w[n-6];
+			tmp[3]=tmp[7]=pow_w[n-5];
+			VEC256_LOADU(beta,tmp);
+			tmp[0]=tmp[4]=pow_wp[n-8];
+			tmp[1]=tmp[5]=pow_wp[n-7];
+			tmp[2]=tmp[6]=pow_wp[n-6];
+			tmp[3]=tmp[7]=pow_wp[n-5];
+			VEC256_LOADU(betap,tmp);
+			for (uint64_t i = 0; i < n; i+=16)
+				Butterfly_DIT_mod4p_8x3_AVX_first3step(&fft[i],&fft[i+8],alpha,alphap,beta,betap,P,P2);
+			uint32_t * tab_w = &pow_w [n-16];
+			uint32_t * tab_wp= &pow_wp[n-16];
+			for (size_t w = 8, f = n >> 4; f >= 1; w <<= 1, f >>= 1, tab_w-=w, tab_wp-=w){
+				// w : witdh of butterflies
+				// f : # families of butterflies
+				for (size_t i = 0; i < f; i++)
+					for (size_t j = 0; j < w; j+=8)
+#define A0 &fft[0] +  (i << 1)   *w+ j
+#define A4 &fft[0] + ((i << 1)+1)*w+ j
+						Butterfly_DIT_mod4p_8x1_AVX(A0,A4, tab_w+j,tab_wp+j,P,P2);
+#undef A0
+#undef A4
+			}
+		} else {
+			uint32_t * tab_w = &pow_w [n-2];
+			uint32_t * tab_wp= &pow_wp[n-2];
+			for (size_t w = 1, f = n >> 1; f >= 1; w <<= 1, f >>= 1, tab_w-=w, tab_wp-=w)
+				for (size_t i = 0; i < f; i++)
+					for (size_t j = 0; j < w; j++)
+						Butterfly_DIT_mod4p(fft[(i << 1)*w+j], fft[((i << 1)+1)*w+j], tab_w[j], tab_wp[j]);
+		}
+	}
+
+
+
+
+#endif // end of AVX2 section
+
+} // enf of namespace LinBox
+
+#endif //end of file
diff --git a/linbox/algorithms/polynomial-matrix/polynomial-fft-transform.h b/linbox/algorithms/polynomial-matrix/polynomial-fft-transform.h
new file mode 100755
index 0000000..bd19bff
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/polynomial-fft-transform.h
@@ -0,0 +1,331 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2014  Pascal Giorgi, Romain Lebreton
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ *            Romain Lebreton <romain.lebreton at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+#ifndef __LINBOX_polynomial_fft_transform_H
+#define __LINBOX_polynomial_fft_transform_H
+
+#include <iostream>
+#include "linbox/linbox-config.h"
+#include "linbox/algorithms/polynomial-matrix/simd.h"
+#include "linbox/util/debug.h"
+#include "givaro/givinteger.h"
+
+// template<typename T>
+// std::ostream& operator<<(std::ostream& os, const std::vector<T> &x){
+// 	std::ostream_iterator<T> out_it (os,", ");
+// 	std::copy ( x.begin(), x.end(), out_it );
+// 	return os;
+// }
+
+#include "fflas-ffpack/utils/align-allocator.h"
+
+namespace LinBox {
+
+
+	// class to handle FFT transform over wordsize prime field Fp (p < 2^29)
+	template <class Field>
+	class FFT_transform {
+	public:
+		typedef typename Field::Element Element;
+
+		const Field                *fld;
+		uint64_t              _pl, _dpl;
+		uint64_t                      n;
+		uint64_t                     ln;
+		//uint64_t                  _logp;
+		//uint64_t                     _I;
+		//double                    _pinv;
+		uint32_t                      _w;
+		uint32_t                   _invw;
+		typedef std::vector<uint32_t,AlignedAllocator<uint32_t, Alignment::DEFAULT> > VECT;
+		VECT    pow_w;
+		VECT   pow_wp; // Precomputations in shoup
+		VECT    _data;
+		Element                      _p;
+		//   pow_w = table of roots of unity. If w = primitive K-th root, then the table is:
+		//           1, w, w^2, ..., w^{K/2-1},
+		//           1, w^2, w^4, ..., w^{K/2-2},
+		//           1, w^4, w^8, ..., w^{K/2-4}
+		//           ...
+		//           1, w^{K/8}, w^{K/4}, w^{3K/8},
+		//           1, w^{K/4},
+		//           1.
+
+		inline const Field & field() const { return *fld; }
+
+		uint64_t find_gen (uint64_t _m, uint64_t _val2p) {
+			// find a primitive 2^k root of unity where
+			// _p - 1 = 2^k * m
+			srand((unsigned int) time(NULL));
+			uint64_t y,z,j;
+			uint64_t _gen;
+			for (;;) {
+				_gen = rand() % _pl; if (_gen <= 0) continue;
+				z = 1;
+				for (unsigned long i=0; i < _m; ++i) z = z*_gen % _pl;
+				if (z == 1) continue;
+				// _gen^i =/ 1 pour 0 <= i < m
+				_gen = z;
+				j = 0;
+				do {
+					y = z;
+					z = y*y % _pl;
+					j++;
+				} while (j != _val2p && z != 1);
+				if (j == _val2p)
+					break;
+			}
+			return _gen;
+		}
+
+		FFT_transform (const Field& fld2, size_t ln2, Element w = 0)
+			: fld (&fld2), n ((1U << ln2)), ln (ln2), pow_w(n - 1), pow_wp(n - 1), _data(n) {
+			_pl = fld->characteristic();
+			_p  = fld->characteristic();
+
+			linbox_check((_pl >> 29) == 0 ); // 8*p < 2^31 for Harvey's butterflies
+			_dpl = (_pl << 1);
+			//_pinv = 1 / (double) _pl;
+							
+			if (w == 0){   // find a pseudo 2^lpts-th primitive root of unity
+				uint64_t _val2p = 0;
+				uint64_t     _m = _pl;
+				uint64_t  _logp = 0;
+				while (_m) {
+					_m >>= 1;
+					_logp++;
+				}
+				_m = _pl - 1;
+				while ((_m & 1) == 0) {
+					_m >>= 1;
+					_val2p++;
+				}
+				//_I = (1L << (_logp << 1)) / _pl;
+				uint64_t _gen = find_gen (_m, _val2p);
+				_w = Givaro::powmod(_gen, 1<<(_val2p-ln), _pl);
+			}
+			else {
+				_w = (uint32_t)w;
+			}
+			
+			// compute w^(-1) mod p = w^(2^lpts - 1)
+			_invw = Givaro::powmod(_w, (1<<ln) - 1, _pl);
+			
+			size_t pos = 0;
+			uint64_t wi = 1;
+			uint64_t __w = _w;
+			if (ln>0){
+				size_t tpts = 1 << (ln - 1);
+				while (tpts > 0) {
+					for (size_t i = 0; i < tpts; i++, pos++) {
+						pow_w[pos] = wi;
+						pow_wp[pos] = ((uint64_t) pow_w[pos] << 32UL) / _pl;
+						wi= (wi*__w)%_pl;
+						//field().mulin(wi, __w);
+					}
+					wi = 1;
+					__w = (__w * __w) % _pl;
+					//field().mulin(__w, __w);
+					tpts >>= 1;
+				}
+			}
+		}
+
+
+		Element getRoot() const {return _w;}
+		Element getInvRoot() const {return _invw;}
+
+		
+		void FFT_DIF_Harvey (uint32_t *fft) {			
+#ifdef __LINBOX_USE_SIMD
+#ifdef __AVX2__
+			FFT_DIF_Harvey_mod2p_iterative8x1_AVX(fft);
+			if (n>=8){
+				_vect256_t P;
+				VEC256_SET_32(P,_pl);
+				for (uint64_t i = 0; i < n; i += 8)
+					reduce256_modp(fft+i,P);
+				return;
+			}
+#else
+			FFT_DIF_Harvey_mod2p_iterative4x2_SSE(fft);
+#endif
+			if (n >=4) {
+				_vect128_t P;
+				VEC128_SET_32(P,_pl);
+				for (uint64_t i = 0; i < n; i += 4)
+					reduce128_modp(fft+i,P);
+			} else {
+				for (uint64_t i = 0; i < n; i++)
+					if (fft[i] >= _pl) fft[i] -= _pl;
+			}
+#else
+			// FALLBACK WHEN NO SIMD VERSION
+			FFT_DIF_Harvey_mod2p_iterative2x2(fft);
+			for (uint64_t i = 0; i < n; i++) {
+				if (fft[i] >= (_pl << 1)) fft[i] -= (_pl << 1);
+				if (fft[i] >= _pl) fft[i] -= _pl;
+			}			
+#endif 
+		}
+		
+		void FFT_DIT_Harvey (uint32_t *fft) {
+#ifdef __LINBOX_USE_SIMD
+#ifdef __AVX2__
+			FFT_DIT_Harvey_mod4p_iterative8x1_AVX(fft);
+			if (n>=8){
+				_vect256_t P,P2;
+				VEC256_SET_32(P, _pl);
+				VEC256_SET_32(P2,_dpl);
+				for (uint64_t i = 0; i < n; i += 8){
+					reduce256_modp(&fft[i],P2);
+					reduce256_modp(&fft[i],P);
+				}
+				return;
+			}
+#else
+			FFT_DIT_Harvey_mod4p_iterative4x1_SSE(fft);
+#endif
+			if (n >=4) {
+				_vect128_t P,P2;
+				VEC128_SET_32(P,_pl);
+				VEC128_SET_32(P2,_dpl);
+				for (uint64_t i = 0; i < n; i += 4){
+					reduce128_modp(&fft[i],P2);
+					reduce128_modp(&fft[i],P);
+				}
+			} else {
+				for (uint64_t i = 0; i < n; i++) {
+					if (fft[i] >= (_pl << 1)) fft[i] -= (_pl << 1);
+					if (fft[i] >= _pl) fft[i] -= _pl;
+				}
+			}
+#else
+			// FALLBACK WHEN NO SIMD VERSION
+			FFT_DIT_Harvey_mod4p_iterative2x2(fft);
+			for (uint64_t i = 0; i < n; i++) {
+				if (fft[i] >= (_pl << 1)) fft[i] -= (_pl << 1);
+				if (fft[i] >= _pl) fft[i] -= _pl;
+			}			
+#endif 
+		}
+		
+		// FFT without conversion
+		template <class T=Element>
+		typename std::enable_if<std::is_same<T,uint32_t>::value>::type
+		FFT_DIF (T *fft) {
+			FFT_DIF_Harvey(fft);
+		}
+		template <class T=Element>
+		typename std::enable_if<std::is_same<T,uint32_t>::value>::type
+		FFT_DIT (T *fft) {
+			FFT_DIT_Harvey(fft);
+		}
+		
+		// FFT with conversion from Element to uint32_t		
+		template <typename T=Element>
+		typename std::enable_if<!std::is_same<T,uint32_t>::value>::type
+		FFT_DIF (T *fft) {
+			for(uint64_t i=0;i<n;i++)
+				_data[i]=fft[i];
+			FFT_DIF_Harvey(&_data[0]);
+			for(uint64_t i=0;i<n;i++)
+				fft[i]=_data[i];
+			
+		}
+		template <typename T=Element>
+		typename std::enable_if<!std::is_same<T,uint32_t>::value>::type
+		FFT_DIT (T *fft) {
+			for(uint64_t i=0;i<n;i++)
+				_data[i]=fft[i];
+			FFT_DIT_Harvey(&_data[0]);
+			for(uint64_t i=0;i<n;i++)
+				fft[i]=_data[i];			
+		}
+				
+		/*
+		 * Different implementations for the butterfly operations
+		 */
+		template <class T>
+		inline void Butterfly_DIT_mod4p(T& A, T& B, const uint32_t& alpha, const uint32_t& alphap);
+		template <class T>
+		inline void Butterfly_DIF_mod2p(T& A, T& B, const uint32_t& alpha, const uint32_t& alphap);
+
+		inline void reduce128_modp(uint32_t*, const __m128i&);
+		inline void Butterfly_DIF_mod2p_4x1_SSE(uint32_t* ABCD, uint32_t* EFGH,const uint32_t* alpha, const uint32_t* alphap, const __m128i& P, const __m128i& P2);
+		inline void Butterfly_DIF_mod2p_4x1_SSE_laststep(uint32_t* ABCD, uint32_t* EFGH, const __m128i& P2);
+		inline void Butterfly_DIF_mod2p_4x2_SSE(uint32_t* , uint32_t* ,uint32_t* , uint32_t* ,
+							const uint32_t* ,const uint32_t* ,const uint32_t* ,
+							const uint32_t* ,const uint32_t* ,const uint32_t* ,
+							const __m128i& P, const __m128i& P2);
+		inline void Butterfly_DIF_mod2p_4x2_SSE_last2step(uint32_t* ABCD, uint32_t* EFGH, const __m128i& W,
+								  const __m128i& Wp, const __m128i& P, const __m128i& P2);
+		inline void Butterfly_DIT_mod4p_4x1_SSE(uint32_t* ABCD, uint32_t* EFGH, const uint32_t* alpha,
+							const uint32_t* alphap,const __m128i& P, const __m128i& P2);
+		inline void Butterfly_DIT_mod4p_4x2_SSE_first2step(uint32_t* ABCD, uint32_t* EFGH, const __m128i& W,
+								   const __m128i& Wp, const __m128i& P, const __m128i& P2);
+#ifdef __AVX2__
+		inline void reduce256_modp(uint32_t*, const __m256i&);
+		inline void Butterfly_DIF_mod2p_8x1_AVX(uint32_t* ABCD, uint32_t* EFGH, const uint32_t* alpha,const uint32_t* alphap,const __m256i& P, const __m256i& P2);
+		inline void Butterfly_DIF_mod2p_8x3_AVX_last3step(uint32_t* ABCDEFGH, uint32_t* IJKLMNOP, const __m256i& alpha,const __m256i& alphap,
+								  const __m256i& beta ,const __m256i& betap, const __m256i& P    ,const __m256i& P2);
+		inline void Butterfly_DIT_mod4p_8x1_AVX(uint32_t* ABCD, uint32_t* EFGH, const uint32_t* alpha,const uint32_t* alphap,
+			const __m256i& P, const __m256i& P2);
+		inline void Butterfly_DIT_mod4p_8x3_AVX_first3step(uint32_t* ABCDEFGH, uint32_t* IJKLMNOP, const __m256i& alpha,const __m256i& alphap,
+								   const __m256i& beta ,const __m256i& betap, const __m256i& P    ,const __m256i& P2);
+
+
+#endif
+
+		/*
+		 * Different implementation of DIF/DIT with Harvey's trick
+		 */
+
+		void FFT_DIF_Harvey_mod2p_iterative    (Element *fft);
+		void FFT_DIF_Harvey_mod2p_iterative2x2 (Element *fft);
+		void FFT_DIF_Harvey_mod2p_iterative3x3 (Element *fft);
+		void FFT_DIT_Harvey_mod4p_iterative2x2 (Element *fft);
+		void FFT_DIT_Harvey_mod4p_iterative3x3 (Element *fft);
+		// SIMD implementations follow
+		void FFT_DIF_Harvey_mod2p_iterative4x1_SSE (uint32_t *fft);
+		void FFT_DIF_Harvey_mod2p_iterative4x2_SSE (uint32_t *fft);
+		void FFT_DIT_Harvey_mod4p_iterative4x1_SSE (uint32_t *fft);
+#ifdef __AVX2__
+		void FFT_DIF_Harvey_mod2p_iterative8x1_AVX (uint32_t *fft);
+		void FFT_DIT_Harvey_mod4p_iterative8x1_AVX (uint32_t *fft);
+#endif
+
+	};
+} // end of namespace LinBox
+
+#include "linbox/algorithms/polynomial-matrix/polynomial-fft-transform.inl"
+#ifdef __LINBOX_USE_SIMD
+#include "linbox/algorithms/polynomial-matrix/polynomial-fft-transform-simd.inl"
+#endif
+#endif // __LINBOX_FFT_H
+
+
diff --git a/linbox/algorithms/polynomial-matrix/polynomial-fft-transform.inl b/linbox/algorithms/polynomial-matrix/polynomial-fft-transform.inl
new file mode 100644
index 0000000..84cc795
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/polynomial-fft-transform.inl
@@ -0,0 +1,238 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2014  Pascal Giorgi, Romain Lebreton
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ *            Romain Lebreton <romain.lebreton at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+namespace LinBox {
+
+	template <class Field>
+	template <class T>
+	inline void FFT_transform<Field>::Butterfly_DIT_mod4p(T& A, T& B, const uint32_t& alpha, const uint32_t& alphap) {
+		// Harvey's algorithm
+		// 0 <= A,B < 4*p, p < 2^32 / 4
+		// alphap = Floor(alpha * 2^ 32 / p])
+		if (A >= _dpl) A -= _dpl;
+		uint32_t tmp = ((uint32_t) alphap * (uint64_t)B) >> 32;
+		tmp = (uint64_t)alpha * B - tmp * _pl;
+		B = A + (_dpl - tmp);
+		//        B &= 0XFFFFFFFF;
+		A += tmp;
+	}
+
+	template <class Field>
+	template <class T>
+	inline void FFT_transform<Field>::Butterfly_DIF_mod2p(T& A, T& B, const uint32_t& alpha, const uint32_t& alphap) {
+		//std::cout<<A<<" $$ "<<B<<"("<<alpha<<","<<alphap<<" ) -> ";
+		// Harvey's algorithm
+		// 0 <= A,B < 2*p, p < 2^32 / 4
+		// alphap = Floor(alpha * 2^ 32 / p])
+		uint64_t tmp = A;
+		A += B;
+		if (A >= _dpl) A -= _dpl;
+		B = tmp + (_dpl - B);		
+		tmp = ((uint32_t) alphap * (uint64_t)B) >> 32;
+		B = (uint64_t)alpha * B - tmp * _pl;
+		//B &= 0xFFFFFFFF;
+		//std::cout<<A<<" $$ "<<B<<"\n ";
+	}
+
+
+	template <class Field>
+	void FFT_transform<Field>::FFT_DIF_Harvey_mod2p_iterative (Element *fft) {
+		for (size_t w = n >> 1, f = 1, pos_w = 0; w != 0; f <<= 1, pos_w += w, w >>= 1)
+			// w : witdh of butterflies
+			// f : # families of butterflies
+			for (size_t i = 0; i < f; i++){
+				for (size_t j = 0; j < w; j++)
+					Butterfly_DIF_mod2p(fft[(i << 1)*w+j], fft[((i << 1)+1)*w+j], pow_w[j*f], pow_wp[j*f]);				
+			}
+	}
+
+	template <class Field>
+	void FFT_transform<Field>::FFT_DIF_Harvey_mod2p_iterative2x2 (Element *fft) {
+		size_t w, f;
+		for (w = n >> 1, f = 1; w >= 2; w >>= 2, f <<= 2)
+			// w : witdh of butterflies
+			// f : # families of butterflies
+			for (size_t i = 0; i < f; i++)
+				for (size_t j = 0; j < (w >> 1); j++) {
+#define A0 fft[(i << 1)    *w+ j          ]
+#define A1 fft[(i << 1)    *w+(j+(w >> 1))]
+#define A2 fft[((i << 1)+1)*w+ j          ]
+#define A3 fft[((i << 1)+1)*w+(j+(w >> 1))]
+					// Base butterfly
+					Butterfly_DIF_mod2p(A0, A2, pow_w[j*f], pow_wp[j*f]);
+					// Same step, same family, index + (w >>1)
+					Butterfly_DIF_mod2p(A1, A3, pow_w[(j+(w >> 1))*f], pow_wp[(j+(w >> 1))*f]);
+					// Next step on first entries of previous butterflies, #family * 2, same index
+					Butterfly_DIF_mod2p(A0, A1, pow_w[j*(f << 1)], pow_wp[j*(f << 1)]);
+					// Next step on second entries of previous butterflies, #family * 2, same index
+					Butterfly_DIF_mod2p(A2, A3, pow_w[j*(f << 1)], pow_wp[j*(f << 1)]);
+#undef A0
+#undef A1
+#undef A2
+#undef A3
+				}
+		// Remaining steps, at most one
+		if (w > 0)
+			// w : witdh of butterflies
+			// f : # families of butterflies
+			for (size_t i = 0; i < f; i++)
+				for (size_t j = 0; j < w; j++)
+					Butterfly_DIF_mod2p(fft[(i << 1)*w+j], fft[((i << 1)+1)*w+j], pow_w[j*f], pow_wp[j*f]);
+	}
+
+	template <class Field>
+	void FFT_transform<Field>::FFT_DIF_Harvey_mod2p_iterative3x3 (Element *fft) {
+		size_t w, f;
+		for (w = n >> 1, f = 1; w >= 4; w >>= 3, f <<= 3)
+			// w : witdh of butterflies
+			// f : # families of butterflies
+			for (size_t i = 0; i < f; i++)
+				for (size_t j = 0; j < (w >> 2); j++) {
+#define A0 fft[(i << 1)    *w+ j            ]
+#define A1 fft[(i << 1)    *w+(j+  (w >> 2))]
+#define A2 fft[(i << 1)    *w+(j+  (w >> 1))]
+#define A3 fft[(i << 1)    *w+(j+3*(w >> 2))]
+#define A4 fft[((i << 1)+1)*w+ j            ]
+#define A5 fft[((i << 1)+1)*w+(j+  (w >> 2))]
+#define A6 fft[((i << 1)+1)*w+(j+  (w >> 1))]
+#define A7 fft[((i << 1)+1)*w+(j+3*(w >> 2))]
+					// First Step
+					Butterfly_DIF_mod2p(A0, A4, pow_w[ j            *f], pow_wp[ j            *f]);
+					Butterfly_DIF_mod2p(A1, A5, pow_w[(j+  (w >> 2))*f], pow_wp[(j+  (w >> 2))*f]);
+					Butterfly_DIF_mod2p(A2, A6, pow_w[(j+  (w >> 1))*f], pow_wp[(j+  (w >> 1))*f]);
+					Butterfly_DIF_mod2p(A3, A7, pow_w[(j+3*(w >> 2))*f], pow_wp[(j+3*(w >> 2))*f]);
+
+					// Second Step
+					Butterfly_DIF_mod2p(A0, A2, pow_w[ j          *(f << 1)], pow_wp[ j          *(f << 1)]);
+					Butterfly_DIF_mod2p(A1, A3, pow_w[(j+(w >> 2))*(f << 1)], pow_wp[(j+(w >> 2))*(f << 1)]);
+					Butterfly_DIF_mod2p(A4, A6, pow_w[ j          *(f << 1)], pow_wp[ j          *(f << 1)]);
+					Butterfly_DIF_mod2p(A5, A7, pow_w[(j+(w >> 2))*(f << 1)], pow_wp[(j+(w >> 2))*(f << 1)]);
+
+					// Third Step
+					Butterfly_DIF_mod2p(A0, A1, pow_w[j*(f << 2)], pow_wp[j*(f << 2)]);
+					Butterfly_DIF_mod2p(A2, A3, pow_w[j*(f << 2)], pow_wp[j*(f << 2)]);
+					Butterfly_DIF_mod2p(A4, A5, pow_w[j*(f << 2)], pow_wp[j*(f << 2)]);
+					Butterfly_DIF_mod2p(A6, A7, pow_w[j*(f << 2)], pow_wp[j*(f << 2)]);
+#undef A0
+#undef A1
+#undef A2
+#undef A3
+#undef A4
+#undef A5
+#undef A6
+#undef A7
+				}
+		// Remaining steps, at most two
+		for (; w > 0; w >>= 1, f <<= 1)
+			// w : witdh of butterflies
+			// f : # families of butterflies
+			for (size_t i = 0; i < f; i++)
+				for (size_t j = 0; j < w; j++)
+					Butterfly_DIF_mod2p(fft[(i << 1)*w+j], fft[((i << 1)+1)*w+j], pow_w[j*f], pow_wp[j*f]);
+	}
+
+
+	template <class Field>
+	void FFT_transform<Field>::FFT_DIT_Harvey_mod4p_iterative2x2 (Element *fft) {
+		size_t w, f;
+		for (w = 1, f = n >> 1; f >= 2; w <<= 2, f >>= 2)
+			// w : witdh of butterflies
+			// f : # families of butterflies
+			for (size_t i = 0; i < (f >> 1); i++)
+				for (size_t j = 0; j < w; j++) {
+#define A0 fft[ (i << 2)   *w+j]
+#define A1 fft[((i << 2)+1)*w+j]
+#define A2 fft[((i << 2)+2)*w+j]
+#define A3 fft[((i << 2)+3)*w+j]
+					Butterfly_DIT_mod4p(A0, A1, pow_w[j*f], pow_wp[j*f]);
+					Butterfly_DIT_mod4p(A2, A3, pow_w[j*f], pow_wp[j*f]);
+
+					Butterfly_DIT_mod4p(A0, A2, pow_w[ j   *(f >> 1)], pow_wp[ j   *(f >> 1)]);
+					Butterfly_DIT_mod4p(A1, A3, pow_w[(j+w)*(f >> 1)], pow_wp[(j+w)*(f >> 1)]);
+#undef A0
+#undef A1
+#undef A2
+#undef A3
+				}
+		// Remaining steps, at most one
+		if (f > 0)
+			// w : witdh of butterflies
+			// f : # families of butterflies
+			for (size_t i = 0; i < f; i++)
+				for (size_t j = 0; j < w; j++)
+					Butterfly_DIT_mod4p(fft[(i << 1)*w+j], fft[((i << 1)+1)*w+j], pow_w[j*f], pow_wp[j*f]);
+	}
+
+	template <class Field>
+	void FFT_transform<Field>::FFT_DIT_Harvey_mod4p_iterative3x3 (Element *fft) {
+		size_t w, f;
+		for (w = 1, f = n >> 1; f >= 4; w <<= 3, f >>= 3)
+			// w : witdh of butterflies
+			// f : # families of butterflies
+			for (size_t i = 0; i < (f >> 2); i++)
+				for (size_t j = 0; j < w; j++) {
+#define A0 fft[ (i << 3)   *w+j]
+#define A1 fft[((i << 3)+1)*w+j]
+#define A2 fft[((i << 3)+2)*w+j]
+#define A3 fft[((i << 3)+3)*w+j]
+#define A4 fft[((i << 3)+4)*w+j]
+#define A5 fft[((i << 3)+5)*w+j]
+#define A6 fft[((i << 3)+6)*w+j]
+#define A7 fft[((i << 3)+7)*w+j]
+					Butterfly_DIT_mod4p(A0, A1, pow_w[j*f], pow_wp[j*f]);
+					Butterfly_DIT_mod4p(A2, A3, pow_w[j*f], pow_wp[j*f]);
+					Butterfly_DIT_mod4p(A4, A5, pow_w[j*f], pow_wp[j*f]);
+					Butterfly_DIT_mod4p(A6, A7, pow_w[j*f], pow_wp[j*f]);
+
+					Butterfly_DIT_mod4p(A0, A2, pow_w[ j   *(f >> 1)], pow_wp[ j   *(f >> 1)]);
+					Butterfly_DIT_mod4p(A1, A3, pow_w[(j+w)*(f >> 1)], pow_wp[(j+w)*(f >> 1)]);
+					Butterfly_DIT_mod4p(A4, A6, pow_w[ j   *(f >> 1)], pow_wp[ j   *(f >> 1)]);
+					Butterfly_DIT_mod4p(A5, A7, pow_w[(j+w)*(f >> 1)], pow_wp[(j+w)*(f >> 1)]);
+
+					Butterfly_DIT_mod4p(A0, A4, pow_w[ j     *(f >> 2)], pow_wp[ j     *(f >> 2)]);
+					Butterfly_DIT_mod4p(A1, A5, pow_w[(j+  w)*(f >> 2)], pow_wp[(j+  w)*(f >> 2)]);
+					Butterfly_DIT_mod4p(A2, A6, pow_w[(j+2*w)*(f >> 2)], pow_wp[(j+2*w)*(f >> 2)]);
+					Butterfly_DIT_mod4p(A3, A7, pow_w[(j+3*w)*(f >> 2)], pow_wp[(j+3*w)*(f >> 2)]);
+#undef A0
+#undef A1
+#undef A2
+#undef A3
+#undef A4
+#undef A5
+#undef A6
+#undef A7
+				}
+		// Remaining steps, at most one
+		for ( ; f > 0; w <<= 1, f >>= 1)
+			// w : witdh of butterflies
+			// f : # families of butterflies
+			for (size_t i = 0; i < f; i++)
+				for (size_t j = 0; j < w; j++)
+					Butterfly_DIT_mod4p(fft[(i << 1)*w+j], fft[((i << 1)+1)*w+j], pow_w[j*f], pow_wp[j*f]);
+	}
+
+
+}
diff --git a/linbox/algorithms/polynomial-matrix/polynomial-matrix-domain.h b/linbox/algorithms/polynomial-matrix/polynomial-matrix-domain.h
new file mode 100755
index 0000000..7274dd3
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/polynomial-matrix-domain.h
@@ -0,0 +1,218 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013  Pascal Giorgi
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+#ifndef __LINBOX_POLYNOMIAL_MATRIX_DOMAIN_H
+#define __LINBOX_POLYNOMIAL_MATRIX_DOMAIN_H
+
+#define KARA_DEG_THRESHOLD  2
+#define FFT_DEG_THRESHOLD   2
+
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-naive.h"
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-kara.h"
+#include "linbox/algorithms/polynomial-matrix/matpoly-mult-fft.h"
+#include <algorithm>
+namespace LinBox
+{
+
+	template <class Field>
+	class PolynomialMatrixMulDomain {
+	public:
+		PolynomialMatrixKaraDomain<Field>       _kara;
+		PolynomialMatrixFFTMulDomain<Field>      _fft;
+		PolynomialMatrixNaiveMulDomain<Field>  _naive;
+		const Field*                           _field;
+	public:
+		PolynomialMatrixMulDomain (const Field &F) :
+			_kara(F), _fft(F), _naive(F), _field(&F) {}
+
+		inline const Field& field() const {return *_field;}
+
+		template< class PMatrix1,class PMatrix2,class PMatrix3>
+		void mul(PMatrix1 &c, const PMatrix2 &a, const PMatrix3 &b)
+		{
+			size_t d = a.size()+b.size();
+                        if (d > FFT_DEG_THRESHOLD){
+                                //std::cout<<"PolMul FFT"<<std::endl;
+				_fft.mul(c,a,b);
+                        }
+			else
+				if ( d > KARA_DEG_THRESHOLD){
+                                        //std::cout<<"PolMul Kara"<<std::endl;
+					_kara.mul(c,a,b);
+                                }
+				else {
+                                        //std::cout<<"PolMul Naive"<<std::endl;
+					_naive.mul(c,a,b);
+                                }
+		}
+
+		template< class PMatrix1,class PMatrix2,class PMatrix3>
+		void midproduct (PMatrix1 &c, const PMatrix2 &a, const PMatrix3 &b)
+		{
+			size_t d = b.size();
+			if (d > FFT_DEG_THRESHOLD)
+				_fft.midproduct(c,a,b);
+			else
+				if ( d > KARA_DEG_THRESHOLD)
+					_kara.midproduct(c,a,b);
+				else
+					_naive.midproduct(c,a,b);
+		}
+
+		template< class PMatrix1,class PMatrix2,class PMatrix3>
+		void midproductgen (PMatrix1 &c, const PMatrix2 &a, const PMatrix3 &b, bool smallLeft=true, size_t n0=0, size_t n1=0)
+		{
+			if ( c.size() <= 4)
+				_naive.midproduct(c,a,b,smallLeft,n0,n1);
+			else
+				_fft.midproduct(c,a,b,smallLeft,n0,n1);
+		}
+	};
+
+	template<class Field>
+	class PolynomialMatrixDomain : public PolynomialMatrixMulDomain<Field>, public PolynomialMatrixAddDomain<Field> {
+	public:
+		PolynomialMatrixDomain (const Field& F) : PolynomialMatrixMulDomain<Field>(F), PolynomialMatrixAddDomain<Field>(F) {}
+	};
+
+
+
+
+	template <typename Field, typename PMatrix1,typename PMatrix2,typename PMatrix3>
+	class HalflineMPDomain {
+	private:
+		PMatrix1                        *_c;
+		const PMatrix2                  *_a;
+		const PMatrix3                  *_b;
+		typename PMatrix3::const_view   _b1;
+		typename PMatrix1::plain       _tmp;
+		size_t                           _i;
+		size_t                           _d;
+		PolynomialMatrixDomain<Field>  _PMD;
+		BlasMatrixDomain<Field>        _BMD;
+	public:
+		double mid;
+		const Field& field(){return _PMD.field();}
+
+		HalflineMPDomain(const Field& F):  _i(1), _d(0), _PMD(F), _BMD(F) {}
+
+		// compute c = x^k ab mod x^2k
+		// a is of sike k+1
+		// b is of size 2k
+		// c is of size k
+		HalflineMPDomain(const Field& F, PMatrix1& c, const PMatrix2& a, const PMatrix3 &b,
+				 size_t k)
+                        : _c(&c), _a(&a), _b(&b), _b1(b,k,std::min(b.size()-1,2*k-1)), _tmp(F,c.rowdim(),c.coldim(),2*k-1),
+                          _i(1), _d(std::min(b.size()-1,2*k-1)-k+1), _PMD(F), _BMD(F), mid(0)
+		{
+			linbox_check(c.size()==k);
+			linbox_check(a.size()<=k+1);
+			//linbox_check(b.size()==2*k);
+			Timer chrono;
+			chrono.start();
+			// compute the high product of c= x^(k-1) a[1,k]b[0,k-1] mod x^2k
+			typename PMatrix2::const_view a0= a.at(1,a.size()-1);
+			typename PMatrix3::const_view b0= b.at(0,k-1);
+			_PMD.mul(_tmp,a0,b0);
+			c.copy(_tmp,k-1,2*k-2);
+			chrono.stop();
+			mid+=chrono.usertime();
+
+		}
+
+		void update(size_t s=1){
+			for (size_t i=0;i<s;i++){
+				++(*this);
+			}
+		}
+
+		void operator++() {
+			if (!terminated()){ // compute product at step _i
+				//cout<<"read coeff <="<<_d+_i-1<<" of "<< 2*_d<<" ..."<<endl;;
+				size_t m = twoValuation(_i);
+				size_t step=  1ULL<<m;
+				//typename PMatrix3::const_view bb = _b->at(0, 2*_d-1);
+
+				if (step<_d) {
+					// cout<<"("<<    0    <<","<< min(2*step-2,_a->size()-1)<<") x";
+					// cout<<"("<< _i-step <<","<<      _i-1 <<") ->";
+					// cout<<"("<< _i-1    <<","<< _i+step-2 <<") "<<endl;;
+
+					typename PMatrix1::view     tmp = _tmp.at(0  , step-1);
+					typename PMatrix1::view       c = _c->at(_i-1, _i+step-2);
+					typename PMatrix2::const_view a = _a->at(0, std::min(2*step-2,_a->size()-1));
+					typename PMatrix3::const_view b = _b1.at(_i-step, _i-1);
+					Timer chrono;
+					chrono.start();
+					_PMD.midproductgen(tmp,a,b,false);//,step,2*step);
+					chrono.stop();
+					_PMD.addin(c,tmp);
+					mid+=chrono.usertime();
+				}
+				else {
+					// compute the last diagonal element
+					for(size_t i=0;i<std::min(_d,_a->size());i++)
+						_BMD.axpyin((*_c)[_d-1],(*_a)[i],_b1[_d-i-1]);
+					/*
+					   cout<<"checking result of online MP ..."<<_d<<"x"<<2*_d<<"...";
+					   PMatrix1 R(field(),_c->rowdim(),_c->coldim(),_c->size());
+					   typename PMatrix3::const_view b = _b->at(0, 2*_d-1);
+					   _PMD.midproductgen(R,*_a, b, true, _d+1,2*_d);
+					   if (R==(*_c))
+					   cout<<"done"<<endl;
+					   else
+					   cout<<"error"<<endl;
+					   */
+				}
+				_i++;
+			}
+		}
+
+		bool terminated() const {return _i>_d;}
+
+		inline size_t twoValuation(size_t x){
+			size_t i=0;
+			while (x!=0 && !(x&0x1)){
+				i++;
+				x>>=1;
+			}
+			return i;
+		}
+
+
+	};
+
+} // end of namespace LinBox
+
+#endif //__LINBOX_matpoly_mult_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/polynomial-matrix/simd.h b/linbox/algorithms/polynomial-matrix/simd.h
new file mode 100644
index 0000000..badcc2d
--- /dev/null
+++ b/linbox/algorithms/polynomial-matrix/simd.h
@@ -0,0 +1,273 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013  Pascal Giorgi
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_SIMD__
+#define __LINBOX_SIMD__
+
+
+//#include <immintrin.h>
+#include "fflas-ffpack/utils/fflas_intrinsic.h"
+#include <iostream>
+
+
+#ifdef __AVX2__
+/* 256 bits CODE HERE */
+#define __LINBOX_HAVE_AVX2
+
+// define 256 bits simd vector type
+typedef __m256i  _vect256_t; 
+
+/* 256 bits CODE HERE */
+// C=C+AB using X as temporary
+#define VEC256_MADD_32(C,A,B,X)					\
+	X= _mm256_mul_epi32(A,B); C= _mm256_add_epi64(C,X);
+
+// C=A*B (2 op 32x32->64)
+#define VEC256_MUL_32(C,A,B)			\
+	C= _mm256_mul_epu32(A,B); 
+
+// C=A*B (4 op 32x32->32 low product)
+#define VEC256_MUL_LO_32(C,A,B)			\
+	C=  _mm256_mullo_epi32(A,B);
+
+// C=A+B
+#define VEC256_ADD_32(C,A,B)			\
+	C= _mm256_add_epi32(A,B);
+// C=A+B
+#define VEC256_ADD_64(C,A,B)			\
+	C= _mm256_add_epi64(A,B);
+
+// A+=B
+#define VEC256_ADDIN_64(A,B)			\
+	A= _mm256_add_epi64(A,B);
+
+// C=A-B
+#define VEC256_SUB_32(C,A,B)			\
+	C= _mm256_sub_epi32(A,B);
+
+// C = A mod P using T as temporary  (A must lie in [0 2P[ )
+#define VEC256_MOD_P(C,A,P,T)						\
+	T=_mm256_cmpgt_epi32(P,A);					\
+	C=_mm256_sub_epi32(A,_mm256_andnot_si256(T,P));			
+// Rk: __m128i _mm_cmpgt_epi64 (__m128d a, __m128d b) // compare a>b si vrai renvoi 0xFFFFFFFFFFFFFFFF
+
+// C = A >> X
+#define VEC256_RSHIFT_64(C,A,X)			\
+	C=_mm256_srli_epi64 (A,X);
+
+// C = A << X
+#define VEC256_LSHIFT_64(C,A,X)			\
+	C=_mm256_slli_epi64 (A,X);
+
+// C = A || X
+#define VEC256_OR(C,A,X)				\
+	C=_mm256_or_si256(A,X);
+
+// C = unpack_lo32(A,B)
+#define VEC256_UNPACK_LO_32(C,A,B)			\
+	 C = _mm256_unpacklo_epi32(A,B);
+
+// C = unpack_hi32(A,B)
+#define VEC256_UNPACK_HI_32(C,A,B)			\
+	 C = _mm256_unpackhi_epi32(A,B);
+
+// C = unpack_lo32(A,B)
+#define VEC256_UNPACK_LO_64(C,A,B)			\
+	 C = _mm256_unpacklo_epi64(A,B);
+
+// C = unpack_hi32(A,B)
+#define VEC256_UNPACK_HI_64(C,A,B)			\
+	 C = _mm256_unpackhi_epi64(A,B);
+
+// C = unpack_lo128(A,B)
+#define VEC256_UNPACK_LO_128(C,A,B)			\
+	C = _mm256_permute2x128_si256(A,B,32);
+
+// C = unpack_hi128(A,B)
+#define VEC256_UNPACK_HI_128(C,A,B)			\
+	C = _mm256_permute2x128_si256(A,B,49);
+ 
+// C= blend_epi32(A,B,X)			
+#define VEC256_BLEND_32(C,A,B,X)		\
+	C = _mm256_blend_epi32(A,B,X);
+
+// C =shuffle_32(A,X)				
+#define VEC256_SHUFFLE_32(C,A,X)		\
+	C = _mm256_shuffle_epi32(A,X);
+
+// C=X[0,1]
+#define VEC256_LOAD(C,X)							\
+	C=_mm256_load_si256(reinterpret_cast<const __m256i*>(X));
+#define VEC256_LOADU(C,X)							\
+	C=_mm256_loadu_si256(reinterpret_cast<const __m256i*>(X));
+// C[0,1]=X
+#define VEC256_STORE(C,X)						\
+	_mm256_store_si256(reinterpret_cast<__m256i*>(C),X);
+#define VEC256_STOREU(C,X)						\
+	_mm256_storeu_si256(reinterpret_cast<__m256i*>(C),X);
+#define VEC256_SET_64(C,X)						\
+	C=_mm256_set1_epi64x(X);
+#define VEC256_SET_32(C,X)						\
+	C=_mm256_set1_epi32(X);
+
+#define VEC256_PRINT_32(X)			\
+	{uint32_t T[8];	VEC256_STORE(T,X);std::cout<<"[ "<<T[0]<<","<<T[1]<<","<<T[2]<<","<<T[3]<<","<<T[4]<<","<<T[5]<<","<<T[6]<<","<<T[7]<<"]";}
+
+#endif
+
+/* 128 bits CODE HERE */
+
+// define 128 bits simd vector type
+typedef __m128i  _vect128_t;
+
+
+// C=C+AB using X as temporary
+#define VEC128_MADD_32(C,A,B,X)				\
+	X= _mm_mul_epi32(A,B); C= _mm_add_epi64(C,X);
+
+// C=A*B (2 op 32x32->64)
+#define VEC128_MUL_32(C,A,B)			\
+	C= _mm_mul_epu32(A,B);
+
+// C=A*B (4 op 32x32->32 low product)
+#define VEC128_MUL_LO_32(C,A,B)			\
+	C=  _mm_mullo_epi32(A,B);
+
+// C=A+B
+#define VEC128_ADD_32(C,A,B)			\
+	C= _mm_add_epi32(A,B);
+
+// C=A+B
+#define VEC128_ADD_64(C,A,B)			\
+	C= _mm_add_epi64(A,B);
+
+// A+=B
+#define VEC128_ADDIN_64(A,B)			\
+	A= _mm_add_epi64(A,B);
+
+// C=A-B
+#define VEC128_SUB_32(C,A,B)			\
+	C= _mm_sub_epi32(A,B);
+
+// C = A mod P using T as temporary  (A must lie in [0 2P[ )
+#define VEC128_MOD_P(C,A,P,T)						\
+	T=_mm_cmplt_epi32(A,P);						\
+	C=_mm_sub_epi32(A,_mm_andnot_si128(T,P));			
+// Rk: __m128i _mm_cmpgt_epi64 (__m128d a, __m128d b) // compare a>b si vrai renvoi 0xFFFFFFFFFFFFFFFF
+
+// C = A >> X
+#define VEC128_RSHIFT_64(C,A,X)			\
+	C=_mm_srli_epi64 (A,X);
+
+// C = A << X
+#define VEC128_LSHIFT_64(C,A,X)			\
+	C=_mm_slli_epi64 (A,X);
+
+// C = A || X
+#define VEC128_OR(C,A,X)				\
+	C=_mm_or_si128(A,X);
+
+// C = unpack_lo32(A,B)
+#define VEC128_UNPACK_LO_32(C,A,B)			\
+	 C = _mm_unpacklo_epi32(A,B);
+
+// C = unpack_hi32(A,B)
+#define VEC128_UNPACK_HI_32(C,A,B)			\
+	 C = _mm_unpackhi_epi32(A,B);
+
+// C = unpack_lo32(A,B)
+#define VEC128_UNPACK_LO_64(C,A,B)			\
+	 C = _mm_unpacklo_epi64(A,B);
+
+// C = unpack_hi32(A,B)
+#define VEC128_UNPACK_HI_64(C,A,B)			\
+	 C = _mm_unpackhi_epi64(A,B);
+
+// C =shuffle_32(A,X)				
+#define VEC128_SHUFFLE_32(C,A,X)			\
+	C = _mm_shuffle_epi32(A,X);
+
+// C=X[0,1]
+#define VEC128_LOAD(C,X)							\
+	C=_mm_load_si128(reinterpret_cast<const __m128i*>(X));
+#define VEC128_LOADU(C,X)							\
+	C=_mm_loadu_si128(reinterpret_cast<const __m128i*>(X));
+// C[0,1]=X
+#define VEC128_STORE(C,X)						\
+	_mm_store_si128(reinterpret_cast<__m128i*>(C),X);
+#define VEC128_STOREU(C,X)						\
+	_mm_storeu_si128(reinterpret_cast<__m128i*>(C),X);
+#define VEC128_SET_64(C,X)				\
+	C=_mm_set1_epi64x(X);
+#define VEC128_SET_32(C,X)				\
+	C=_mm_set1_epi32(X);
+
+#define VEC128_PRINT_32(X)				\
+	{ uint32_t T[4];VEC128_STORE(T,X); cout<<"[ "<<T[0]<<","<<T[1]<<","<<T[2]<<","<<T[3]<<"]";}
+
+// END OF 128 BITS CODE
+
+ 
+// C=A*B (4 op 32x32->32 high product) // A and with a mask can be used to remove the last two shift with C
+#define VEC128_MUL_HI_32(C,A,B,A1,B1)			\
+	VEC128_MUL_32(C,A,B);				\
+	VEC128_RSHIFT_64(A1,A,32);			\
+	VEC128_RSHIFT_64(B1,B,32);			\
+	VEC128_MUL_32(A1,A1,B1);			\
+	VEC128_RSHIFT_64(C,C,32);			\
+	VEC128_RSHIFT_64(A1,A1,32);			\
+	VEC128_LSHIFT_64(A1,A1,32);			\
+	VEC128_OR(C,C,A1);			       
+#define VEC256_MUL_HI_32(C,A,B,A1,B1)			\
+	VEC256_MUL_32(C,A,B);				\
+	VEC256_RSHIFT_64(A1,A,32);			\
+	VEC256_RSHIFT_64(B1,B,32);			\
+	VEC256_MUL_32(A1,A1,B1);			\
+	VEC256_RSHIFT_64(C,C,32);			\
+	VEC256_RSHIFT_64(A1,A1,32);			\
+	VEC256_LSHIFT_64(A1,A1,32);			\
+	VEC256_OR(C,C,A1);			
+	
+// C= A+B mod P using T as temporary
+#define VEC128_ADD_MOD(C,A,B,P,T)			\
+	VEC128_ADD_32(C,A,B); VEC128_MOD_P(C,C,P,T); 
+#define VEC256_ADD_MOD(C,A,B,P,T)			\
+	VEC256_ADD_32(C,A,B); VEC256_MOD_P(C,C,P,T); 
+
+// C= A*X mod P using T1, T2 as temporaries
+#define VEC128_MUL_MOD(C,A,X,P,Xp,Q,T1,T2)		\
+	VEC128_MUL_HI_32(Q,A,Xp,T1,T2);			\
+	VEC128_MUL_LO_32(C,A,X);			\
+	VEC128_MUL_LO_32(T1,Q,P);			\
+	VEC128_SUB_32(C,C,T1);
+#define VEC256_MUL_MOD(C,A,X,P,Xp,Q,T1,T2)		\
+	VEC256_MUL_HI_32(Q,A,Xp,T1,T2);			\
+	VEC256_MUL_LO_32(C,A,X);			\
+	VEC256_MUL_LO_32(T1,Q,P);			\
+	VEC256_SUB_32(C,C,T1);
+
+
+
+#endif // end of file
diff --git a/linbox/algorithms/rational-cra-early-multip.h b/linbox/algorithms/rational-cra-early-multip.h
index 8ba88c6..5634350 100644
--- a/linbox/algorithms/rational-cra-early-multip.h
+++ b/linbox/algorithms/rational-cra-early-multip.h
@@ -25,7 +25,7 @@
 #ifndef __LINBOX_rational_early_multip_cra_H
 #define __LINBOX_rational_early_multip_cra_H
 
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
 #include "linbox/algorithms/rational-cra-early-single.h"
 #include "linbox/algorithms/rational-cra-full-multip.h"
 
@@ -42,6 +42,17 @@ namespace LinBox
 		// of the elements to be reconstructed
 		std::vector< unsigned long >      	randv;
 
+		void initialize (const Integer& D, const Integer& e) {return;}; // DON'T TOUCH
+		void progress (const Integer & D, const Integer & e) {return;};
+		 void initialize (const Domain& D, const DomainElement& e){return;};
+		  Integer& result(Integer& d){return d;};
+		         void progress (const Domain& D, const DomainElement& e){return;};
+
+
+
+
+
+
 	public:
 
 
@@ -49,7 +60,7 @@ namespace LinBox
 			EarlySingleRatCRA<Domain>(EARLY), FullMultipRatCRA<Domain>()
 		{ }
 
-
+		//!init
 		template<template<class, class> class Vect, template <class> class Alloc>
 		void initialize (const Domain& D, const Vect <DomainElement, Alloc<DomainElement> >& e)
 		{
@@ -70,7 +81,26 @@ namespace LinBox
 			FullMultipRatCRA<Domain>::initialize(D, e);
 		}
 
+		void initialize (const Domain& D, const BlasVector<Domain>& e)
+		{
+			// Random coefficients for a linear combination
+			// of the elements to be reconstructed
+			srand48(BaseTimer::seed());
+			randv. resize ( e.size() );
+			for ( std::vector<unsigned long>::iterator int_p = randv. begin();
+			      int_p != randv. end(); ++ int_p)
+				*int_p = ((unsigned long)lrand48()) % 20000;
+
+			DomainElement z;
+			// Could be much faster
+			// - do not compute twice the product of moduli
+			// - reconstruct one element of e until Early Termination,
+			//   then only, try a random linear combination.
+			EarlySingleRatCRA<Domain>::initialize(D,dot(z, D, e, randv) );
+			FullMultipRatCRA<Domain>::initialize(D, e);
+		}
 
+		//!progress
 		template<template<class,class> class Vect, template <class> class Alloc>
 		void progress (const Domain& D, const Vect<DomainElement, Alloc<DomainElement> >& e)
 		{
@@ -83,12 +113,30 @@ namespace LinBox
 			FullMultipRatCRA<Domain>::progress(D, e);
 		}
 
+		void progress (const Domain& D, const BlasVector<Domain>& e)
+		{
+			DomainElement z;
+			// Could be much faster
+			// - do not compute twice the product of moduli
+			// - reconstruct one element of e until Early Termination,
+			//   then only, try a random linear combination.
+			EarlySingleRatCRA<Domain>::progress(D, dot(z, D, e, randv));
+			FullMultipRatCRA<Domain>::progress(D, e);
+		}
+
+		//!result
 		template<template<class, class> class Vect, template <class> class Alloc>
 		Vect<Integer, Alloc<Integer> >& result(Vect<Integer, Alloc<Integer> >& num, Integer& den)
 		{
 			return FullMultipRatCRA<Domain>::result(num, den);
 		}
 
+		BlasVector<Givaro::ZRing<Integer> >& result(BlasVector<Givaro::ZRing<Integer>>& num, Givaro::ZRing<Integer>::Element& den)
+		{
+			return FullMultipRatCRA<Domain>::result(num, den);
+		}
+
+		//!tools
 		bool terminated()
 		{
 			return EarlySingleRatCRA<Domain>::terminated();
@@ -106,7 +154,7 @@ namespace LinBox
 				    const Vect1<DomainElement, Alloc<DomainElement> >& v1, const Vect2& v2)
 		{
 
-			D.init(z,0); DomainElement tmp;
+			D.assign(z,D.zero); DomainElement tmp;
 			typename Vect1<DomainElement, Alloc<DomainElement> >::const_iterator v1_p;
 			typename Vect2::const_iterator v2_p;
 			for (v1_p  = v1. begin(), v2_p = v2. begin();
@@ -119,17 +167,36 @@ namespace LinBox
 #endif
 			return z;
 		}
+
+		template <class Vect2>
+		DomainElement& dot (DomainElement& z, const Domain& D,
+				    const BlasVector<Domain >& v1, const Vect2& v2)
+		{
+
+			D.assign(z,D.zero); DomainElement tmp;
+			typename BlasVector<Domain >::const_iterator v1_p;
+			typename Vect2::const_iterator v2_p;
+			for (v1_p  = v1. begin(), v2_p = v2. begin();
+			     v1_p != v1. end();
+			     ++ v1_p, ++ v2_p)
+				D.axpyin(z, (*v1_p), D.init(tmp, (*v2_p)));
+#if 0
+			commentator().report(Commentator::LEVEL_ALWAYS, INTERNAL_DESCRIPTION) << "v: " << v2 << std::endl;
+			commentator().report(Commentator::LEVEL_ALWAYS, INTERNAL_DESCRIPTION) << "z: " << z << std::endl;
+#endif
+			return z;
+		}
+
 	};
 }
 
 #endif //__LINBOX_rational_early_multip_cra_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/rational-cra-early-single.h b/linbox/algorithms/rational-cra-early-single.h
index 25e838a..4e09b94 100644
--- a/linbox/algorithms/rational-cra-early-single.h
+++ b/linbox/algorithms/rational-cra-early-single.h
@@ -25,7 +25,7 @@
 #ifndef __LINBOX_rational_early_single_cra_H
 #define __LINBOX_rational_early_single_cra_H
 
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
 #include "linbox/algorithms/cra-early-single.h"
 
 namespace LinBox
@@ -37,7 +37,7 @@ namespace LinBox
 		typedef EarlySingleCRA<Domain> 			Father_t;
 		typedef typename Father_t::DomainElement 	DomainElement;
 		typedef EarlySingleRatCRA<Domain>		Self_t;
-		PID_integer _ZZ;
+		Givaro::ZRing<Integer> _ZZ;
 
 		Integer					Numer0;
 		Integer					Denom0;
@@ -140,14 +140,13 @@ namespace LinBox
 	};
 }
 
-#endif
+#endif // __LINBOX_rational_early_single_cra_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/rational-cra-full-multip.h b/linbox/algorithms/rational-cra-full-multip.h
index 89ee540..3a66721 100644
--- a/linbox/algorithms/rational-cra-full-multip.h
+++ b/linbox/algorithms/rational-cra-full-multip.h
@@ -25,7 +25,7 @@
 #ifndef __LINBOX_rational_full_multip_cra_H
 #define __LINBOX_rational_full_multip_cra_H
 
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
 #include "linbox/algorithms/cra-full-multip.h"
 
 namespace LinBox
@@ -48,7 +48,7 @@ namespace LinBox
 		typedef FullMultipCRA<Domain> 			Father_t;
 		typedef typename Father_t::DomainElement 	DomainElement;
 		typedef FullMultipRatCRA<Domain>		Self_t;
-		PID_integer _ZZ;
+		Givaro::ZRing<Integer> _ZZ;
 	public:
 
 		using Father_t::RadixSizes_;
@@ -130,6 +130,72 @@ namespace LinBox
 			return num;
 		}
 
+		BlasVector<Givaro::ZRing<Integer> >& result (BlasVector<Givaro::ZRing<Integer>> &num, Integer& den)
+		{
+			num.resize( (Father_t::RadixResidues_.front()).size() );
+			std::vector< LazyProduct >::iterator            _mod_it = Father_t::RadixPrimeProd_.begin();
+			std::vector< BlasVector<Givaro::ZRing<Integer>> >::iterator _tab_it = Father_t::RadixResidues_.begin();
+			std::vector< bool >::iterator                   _occ_it = Father_t::RadixOccupancy_.begin();
+			LazyProduct Product;
+			for( ; _occ_it != Father_t::RadixOccupancy_.end() ; ++_mod_it, ++_tab_it, ++_occ_it) {
+				if (*_occ_it) {
+					Product = *_mod_it;
+					BlasVector<Givaro::ZRing<Integer>>::iterator t0_it = num.begin();
+					BlasVector<Givaro::ZRing<Integer>>::iterator t_it = _tab_it->begin();
+					if (++_occ_it == Father_t::RadixOccupancy_.end()) {
+						den = 1;
+						Integer s, nd; _ZZ.sqrt(s, _mod_it->operator()());
+						for( ; t0_it != num.end(); ++t0_it, ++t_it) {
+							iterativeratrecon(*t0_it = *t_it, nd, den, _mod_it->operator()(), s);
+							if (nd > 1) {
+								BlasVector<Givaro::ZRing<Integer>>::iterator  t02 = num.begin();
+								for( ; t02 != t0_it ; ++t02)
+									*t02 *= nd;
+								den *= nd;
+							}
+						}
+						return num;
+					}
+					else {
+						for( ; t0_it != num.end(); ++t0_it, ++t_it)
+							*t0_it  = *t_it;
+						++_mod_it; ++_tab_it;
+						break;
+					}
+				}
+			}
+			for( ; _occ_it != Father_t::RadixOccupancy_.end() ; ++_mod_it, ++_tab_it, ++_occ_it) {
+				if (*_occ_it) {
+					BlasVector<Givaro::ZRing<Integer> >::iterator t0_it = num.begin();
+					BlasVector<Givaro::ZRing<Integer> >::const_iterator t_it = _tab_it->begin();
+					Integer invprod;
+					this->precomputeInvProd(invprod, Product(), _mod_it->operator()() );
+					for( ; t0_it != num.end(); ++t0_it, ++t_it)
+						this->smallbigreconstruct(*t0_it, *t_it, invprod );
+					Product.mulin(*_mod_it);
+
+					// Moding out and normalization
+					for(t0_it = num.begin();t0_it != num.end(); ++t0_it) {
+						*t0_it %= Product();
+						Integer tmp(*t0_it);
+						this->normalize(*t0_it, tmp, Product());
+					}
+				}
+			}
+			den = 1;
+			Integer s, nd; _ZZ.sqrt(s, Product.operator()());
+			BlasVector<Givaro::ZRing<Integer> >::iterator t0_it = num.begin();
+			for( ; t0_it != num.end(); ++t0_it) {
+				iterativeratrecon(*t0_it, nd, den, Product.operator()(), s);
+				if (nd > 1) {
+					BlasVector<Givaro::ZRing<Integer> >::iterator  t02 = num.begin();
+					for( ; t02 != t0_it ; ++t02)
+						*t02 *= nd;
+					den *= nd;
+				}
+			}
+			return num;
+		}
 
 	protected:
 		Integer& iterativeratrecon(Integer& u1, Integer& new_den, const Integer& old_den, const Integer& m1, const Integer& s)
@@ -143,11 +209,10 @@ namespace LinBox
 
 #endif //__LINBOX_rational_full_multip_cra_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/rational-cra.h b/linbox/algorithms/rational-cra.h
index 3442235..67863ba 100644
--- a/linbox/algorithms/rational-cra.h
+++ b/linbox/algorithms/rational-cra.h
@@ -26,7 +26,7 @@
 #ifndef __LINBOX_rational_cra_H
 #define __LINBOX_rational_cra_H
 
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
 
 namespace LinBox
 {
@@ -98,6 +98,7 @@ namespace LinBox
 			return Builder_.result(num, den);
 		}
 
+#if 0 /*  marche pas si on remplace le premier Interger par Givaro::ZRing<Integer> :-( spécialise pour BlasVector*/
 		template<template <class, class> class Vect, template <class> class Alloc,  class Function, class RandPrimeIterator>
 		Vect<Integer, Alloc<Integer> > & operator() (Vect<Integer, Alloc<Integer> >& num, Integer& den, Function& Iteration, RandPrimeIterator& genprime)
 		{
@@ -115,16 +116,35 @@ namespace LinBox
 			}
 			return Builder_.result(num, den);
 		}
+#endif
+
+		template<class Function, class RandPrimeIterator>
+		BlasVector<Givaro::ZRing<Integer> > & operator() ( BlasVector<Givaro::ZRing<Integer> >& num, Integer& den, Function& Iteration, RandPrimeIterator& genprime)
+		{
+			++genprime;
+			{
+				Domain D(*genprime);
+				BlasVector<Domain > r(D);
+				Builder_.initialize( D, Iteration(r, D) );
+			}
+			while( ! Builder_.terminated() ) {
+				++genprime; while(Builder_.noncoprime(*genprime) ) ++genprime;
+				Domain D(*genprime);
+				BlasVector<Domain > r(D);
+				Builder_.progress( D, Iteration(r, D) );
+			}
+			return Builder_.result(num, den);
+		}
+
 	};
 }
 
 #endif //__LINBOX_rational_cra_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/rational-cra2.h b/linbox/algorithms/rational-cra2.h
index 89f745c..d04657d 100644
--- a/linbox/algorithms/rational-cra2.h
+++ b/linbox/algorithms/rational-cra2.h
@@ -28,8 +28,8 @@
 #define CRATIMING
 
 
-#include "linbox/field/PID-integer.h"
-
+#include "givaro/zring.h"
+#include "linbox/vector/blas-vector.h"
 #include "linbox/algorithms/rational-reconstruction-base.h"
 #include "linbox/algorithms/classic-rational-reconstruction.h"
 
@@ -56,10 +56,10 @@ namespace LinBox
 	 * Either by Early Termination see [Dumas, Saunder, Villard, JSC 32 (1/2), pp 71-99, 2001],
 	 * Or via a bound on the size of the Integers.
 	 */
-	//typedef PID_Integer Integers;
+	//typedef Givaro::ZRing<Integer> Integers;
 	//typedef Integers::Element Integer;
 
-	template<class RatCRABase, class RatRecon = RReconstruction<PID_integer, ClassicMaxQRationalReconstruction<PID_integer> > >
+	template<class RatCRABase, class RatRecon = RReconstruction<Givaro::ZRing<Integer>, ClassicMaxQRationalReconstruction<Givaro::ZRing<Integer> > > >
 	struct RationalRemainder2 {
 
 
@@ -105,7 +105,8 @@ namespace LinBox
 		  \param[out] den  the rational denominator
 		  */
 		template<class Function, class RandPrimeIterator>
-		Integer & operator() (Integer& num, Integer& den, Function& Iteration, RandPrimeIterator& genprime)
+		Integer & operator() (Integer& num, Integer& den
+				      , Function& Iteration, RandPrimeIterator& genprime)
 		{
 			{
 				++genprime;
@@ -136,7 +137,7 @@ namespace LinBox
 				Domain D(*genprime);
 				DomainElement r; D.init(r);
 				Builder_.progress( D, Iteration(r, D) );
-				if (RR_.scheduled(IterCounter-1)) {
+				if (RR_.scheduled((size_t)IterCounter-1)) {
 					Integer Mint ; Builder_.getModulus(Mint);
 					Integer rint ; Builder_.getResidue(rint);
 					if (RR_.reconstructRational(num,den,rint,Mint)) {
@@ -163,7 +164,8 @@ namespace LinBox
 		 */
 
 		template<class Function, class RandPrimeIterator>
-		bool operator() (const int k, Integer& num, Integer& den, Function& Iteration, RandPrimeIterator& genprime)
+		bool operator() (const int k, Integer& num, Integer& den
+				 , Function& Iteration, RandPrimeIterator& genprime)
 		{
 
 			if ((IterCounter==0) && (k != 0)) {
@@ -231,7 +233,8 @@ namespace LinBox
 		}
 
 		template<template <class, class> class Vect, template<class> class Alloc,  class Function, class RandPrimeIterator>
-		Vect<Integer, Alloc<Integer> > & operator() (Vect<Integer, Alloc<Integer> >& num, Integer& den, Function& Iteration, RandPrimeIterator& genprime)
+		Vect<Integer, Alloc<Integer> > & operator() (Vect<Integer, Alloc<Integer> >& num, Integer& den
+							     , Function& Iteration, RandPrimeIterator& genprime)
 		{
 			{
 				++IterCounter;
@@ -266,7 +269,7 @@ namespace LinBox
 				Vect<DomainElement, Alloc<DomainElement> > r;
 				Builder_.progress( D, Iteration(r, D) );
 
-				if (RR_.scheduled(IterCounter-1) || Builder_.terminated()) {
+				if (RR_.scheduled((size_t)IterCounter-1) || Builder_.terminated()) {
 					Integer Mint ; Builder_.getModulus(Mint);
 					if ( Builder_.terminated() ) {//early or full termination occurred, check reconstruction of the whole vector
 						//early or full termination
@@ -275,7 +278,7 @@ namespace LinBox
 						if (RR_.reconstructRational(num,den,r_v,Mint) ) {
 							Vect<Integer, Alloc<Integer> > vnum(num),vden(m_in.size(),den);
 							for (int i=0; i < (int)vnum.size(); ++ i) {
-								if (vnum[i]==0) vnum[i] = 1; // no prec
+								if (vnum[(size_t)i]==0) vnum[(size_t)i] = 1; // no prec
 							}
 							Builder_.productin(vnum, f_in);
 							Builder_.productin(vden,m_in);
@@ -322,12 +325,108 @@ namespace LinBox
 			return num;
 		}
 
+		template<class Function, class RandPrimeIterator>
+		BlasVector<Givaro::ZRing<Integer> > & operator() (BlasVector<Givaro::ZRing<Integer> >& num, Integer& den
+						      , Function& Iteration, RandPrimeIterator& genprime)
+		{
+			{
+				++IterCounter;
+				++genprime;
+				Domain D(*genprime);
+				BlasVector<Domain> r(D);
+				Builder_.initialize( D, Iteration(r, D) );
+			}
+
+			int coprime =0;
+			int maxnoncoprime = 1000;
+
+			Givaro::ZRing<Integer> Z;
+			BlasVector<Givaro::ZRing<Integer> > f_in(Z),m_in(Z);
+			Builder_.getPreconditioner(f_in,m_in);
+
+			//while( ! Builder_.terminated() )
+			while (1) { // in case of terminated() - checks for RR of the whole vector
+				//++IterCounter;
+				++genprime;
+				while(Builder_.noncoprime(*genprime) ) {
+					++genprime;
+					++coprime;
+					if (coprime > maxnoncoprime) {
+						std::cout << "you are running out of primes. " << maxnoncoprime << " coprime primes found";
+						return num;
+					}
+				}
+				coprime = 0;
+
+
+				Domain D(*genprime);
+				BlasVector<Domain > r(D);
+				Builder_.progress( D, Iteration(r, D) );
+
+				if (RR_.scheduled((size_t)IterCounter-1) || Builder_.terminated()) {
+					Integer Mint ; Builder_.getModulus(Mint);
+					if ( Builder_.terminated() ) {//early or full termination occurred, check reconstruction of the whole vector
+						//early or full termination
+						BlasVector<Givaro::ZRing<Integer> > r_v(Z) ;
+						Builder_.getResidue(r_v);
+						if (RR_.reconstructRational(num,den,r_v,Mint) ) {
+							BlasVector<Givaro::ZRing<Integer> > vnum(num),vden(Z,m_in.size(),den);
+							for (int i=0; i < (int)vnum.size(); ++ i) {
+								if (vnum[(size_t)i]==0) vnum[(size_t)i] = 1; // no prec
+							}
+							Builder_.productin(vnum, f_in);
+							Builder_.productin(vden,m_in);
+							Builder_.changePreconditioner(vnum,vden) ;
+							int k ;
+							Builder_.getThreshold(k);
+							if (this->operator()(k,num,den,Iteration,genprime)) {
+								break;
+							}
+							else {	// back to original preconditioners
+								Builder_.changePreconditioner(f_in,m_in);//not optimal, may restore results
+								Builder_.changeVector();
+							}
+						}
+						else {  //back to original preconditioners
+							Builder_.changePreconditioner(f_in,m_in);
+							Builder_.changeVector();
+						}
+					}
+					else {
+						//heuristics: reconstruction of vector
+						Integer rint ;
+						Builder_.getResidue(rint);
+						Integer n,d;
+						if (RR_.reconstructRational(n,d,rint,Mint)) {
+							BlasVector<Givaro::ZRing<Integer> > vden(Z,m_in.size(),d);
+							Builder_.productin(vden,m_in);
+							Builder_.changePreconditioner(f_in,vden);
+							int k; Builder_.getThreshold(k);
+							if (this->operator()(k,num,den,Iteration,genprime)) { //prob. certify result of RR
+								m_in = vden;
+							}
+							else {	//false result of RR
+								Builder_.changePreconditioner(f_in,m_in);//not optimal, may restore results
+							}
+
+						}
+					}
+				}
+				++IterCounter;
+			}
+			Builder_.result(num,den);
+
+			return num;
+		}
+
+
 		/*
 		 * progress for k>=0 iterations
 		 * run until terminated if k <0
 		 */
 		template<template <class, class> class Vect, template<class> class Alloc, class Function, class RandPrimeIterator>
-		bool operator() (const int k, Vect<Integer, Alloc<Integer>  >& num, Integer& den, Function& Iteration, RandPrimeIterator& genprime)
+		bool operator() (const int k, Vect<Integer, Alloc<Integer>  >& num, Integer& den
+				 , Function& Iteration, RandPrimeIterator& genprime)
 		{
 			if ((IterCounter==0) && (k != 0)) {
 				++IterCounter;
@@ -408,6 +507,93 @@ namespace LinBox
 			else return false;
 		}
 
+
+		// temp. spec. for BlasVector
+		template<class Function, class RandPrimeIterator>
+		bool operator() (const int k, BlasVector<Givaro::ZRing<Integer>  >& num
+				 , Integer& den, Function& Iteration, RandPrimeIterator& genprime)
+		{
+			if ((IterCounter==0) && (k != 0)) {
+				++IterCounter;
+				++genprime;
+				Domain D(*genprime);
+				BlasVector<Domain> r(D);
+				Builder_.initialize( D, Iteration(r, D) );
+			}
+			int coprime =0;
+			int maxnoncoprime = 1000;
+			Givaro::ZRing<Integer> Z;
+
+			BlasVector<Givaro::ZRing<Integer> > f_in(Z),m_in(Z);
+			Builder_.getPreconditioner(f_in,m_in);
+			for (int i=0; ((k<0) && Builder_.terminated()) || (i <k); ++i ) {
+				//++IterCounter;
+				++genprime;
+				while(Builder_.noncoprime(*genprime) ) {
+					++genprime;
+					++coprime;
+					if (coprime > maxnoncoprime) {
+						std::cout << "you are running out of primes. " << maxnoncoprime << " coprime primes found";
+						return false;
+						//return Builder_.result(res);
+					}
+				}
+				coprime = 0;
+				Domain D(*genprime);
+				BlasVector<Domain > r(D);
+				Builder_.progress( D, Iteration(r, D) );
+				//if (RR_.scheduled(IterCounter-1))
+				++IterCounter;
+
+#if 0
+				Integer M ; Builder_.getModulus(M);
+				if ( Builder_.terminated() ) {
+					BlasVector<Givaro::ZRing<Integer> > r ; Builder_.getResidue(r);
+					if (RR_.reconstructRational(num,den,r,M) ) {
+						BlasVector<Givaro::ZRing<Integer> > vnum(num),vden(m_in.size(),den);
+						Builder_.productin(vnum, f_in); Builder_.productin(vden,m_in);
+						if (Builder_.changePreconditioner(vnum,vden)) break;
+						else Builder_.changePreconditioner(f_in,m_in);//not optimal, may restore results
+					}
+				}
+				else {
+					Integer r ; Builder_.getResidue(r);
+					Integer n,d;
+					if (RR_.reconstructRational(n,d,r,M)) {
+						BlasVector<Givaro::ZRing<Integer> > vden(m_in.size(),d);
+						Builder_.productin(vden,m_in);
+						if (Builder_.changePreconditioner(f_in,vden)) break;
+						else Builder_.changePreconditioner(f_in,m_in);//not optimal, may restore results
+					}
+				}
+#endif
+			}
+			if (Builder_.terminated()) {
+				//BlasVector<Givaro::ZRing<Integer> > p_mul, p_div,res, g;
+				//Builder_.getPreconditioner(p_div,p_mul);
+				Builder_.result(num,den);
+#if 0
+				num = Builder_productin(res,p_div);
+				typename BlasVector<Givaro::ZRing<Integer> >::iterator itnum,itden,ittmp;
+				den = 1; Integer denold = 1;
+				for (itnum = num.begin(), itden=p_mul.begin(); itnum != num.end(); ++itnum,++itden) {
+					lcm(den,den,*itden);
+					if (denold != den) {
+						Integer h = den/denold;
+						ittmp = num.begin();
+						for (;itnum != itnum; ++ittmp)  *ittmp *= h;
+					}
+					denold = den;
+				}
+				den = p_mul;
+#endif
+
+				return true;
+			}
+			else return false;
+		}
+
+
 #ifdef CRATIMING
 		std::ostream& reportTimes(std::ostream& os)
 		{
@@ -453,11 +639,10 @@ namespace LinBox
 
 #endif // __LINBOX_rational2_cra_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/rational-reconstruction-base.h b/linbox/algorithms/rational-reconstruction-base.h
index da19fd4..882d662 100644
--- a/linbox/algorithms/rational-reconstruction-base.h
+++ b/linbox/algorithms/rational-reconstruction-base.h
@@ -29,9 +29,9 @@
 
 #include <iostream>
 #include <deque>
-#include <math.h>
+#include <cmath>
 
-#include "linbox/field/PID-integer.h"
+#include <givaro/zring.h>
 
 namespace LinBox
 {
@@ -40,7 +40,7 @@ namespace LinBox
 		INCREMENTAL, QUADRATIC, GEOMETRIC, CERTIFIED
 	};
 
-	template <class Ring=PID_integer>
+	template <class Ring=Givaro::ZRing<Integer> >
 	class RReconstructionBase;
 
 	/*
@@ -48,12 +48,12 @@ namespace LinBox
 	 * together with method reconstructRational(a,b,x,m)
 	 * implements scheduling INCREMENTAL, QUADRATIC, GEOMETRIC, CERTIFIED
 	 * implements vector reconstruction
-	 * _intRing is the integer ring used for reconstruction, default PID_integer
+	 * _intRing is the integer ring used for reconstruction, default Givaro::ZRing<Integer>
 	 * _RR is the rational reconstruction method, see fast-ratioinal-reconstruction.h, classic-rational-reconstruction.h
 	 * THRESHOLD_ - treshold for INCREMENTAL schedule
 	 * rbound_ - min number of iterations for all schedule
 	 */
-	template <class Ring=PID_integer, class RRBase=RReconstructionBase<PID_integer> >
+	template <class Ring=Givaro::ZRing<Integer>, class RRBase=RReconstructionBase<Givaro::ZRing<Integer> > >
 	struct RReconstruction {
 	protected:
 		Ring _intRing;
@@ -70,7 +70,7 @@ namespace LinBox
 		{
 			RecCounter =0;
 			if (_meth == QUADRATIC) {
-				RecCounter = (int)sqrt((double)rbound_);//RecCounter^2 < rbound_ <=(RecCounter+1)^2
+				RecCounter = (size_t)sqrt((double)rbound_);//RecCounter^2 < rbound_ <=(RecCounter+1)^2
 			}
 			else if (_meth == GEOMETRIC) {
 				RecCounter = (size_t) log((double)rbound_) ;//2^RecCounter < rbound_ <=2^(RecCounter+1)
@@ -163,7 +163,7 @@ namespace LinBox
 			else {//if (inc == -1)
 				int i = (int)x.size()-1;
 				for (; i >=0; --i ) {
-					Element x_in(x[i]);
+					Element x_in(x[(size_t)i]);
 					x_in *=old_den;
 					if (x_in <0) {
 						if ((-(x_in)) > m) x_in %= m;
@@ -172,7 +172,7 @@ namespace LinBox
 					else {
 						if (x_in > m) x_in %= m;
 					}
-					if (x_in > 0) res = res && _RR.reconstructRational(a[i], new_den,x_in,m);
+					if (x_in > 0) res = res && _RR.reconstructRational(a[(size_t)i], new_den,x_in,m);
 					else {
 						res = true;
 						*it_a = 0;
@@ -180,10 +180,10 @@ namespace LinBox
 					}
 					if (!res) return res;
 					else {
-						//std::cout << a[i] << "/" << b*new_den << "\n";
+						//std::cout << a[(size_t)i] << "/" << b*new_den << "\n";
 						if (new_den > 1) {
 							for (int j = (int)a.size()-1; j > i ; --j) {
-								a[j] *=new_den;
+								a[(size_t)j] *=new_den;
 							}
 							b *= new_den;
 							old_den *= new_den;
@@ -314,12 +314,12 @@ namespace LinBox
 	};
 
 	/*
-	 * This is the default RReconstruction, using PID_Integer and ClassicRationalReconstruction of Wang
+	 * This is the default RReconstruction, using ZRing<Integer> and ClassicRationalReconstruction of Wang
 	 */
 	template <>
-	class RReconstructionBase<PID_integer> {
+	class RReconstructionBase<Givaro::ZRing<Integer> > {
 	public:
-		typedef PID_integer Ring;
+		typedef Givaro::ZRing<Integer> Ring;
 		Ring _intRing;
 		mutable OpCounter C;
 		typedef Ring::Element Element;
diff --git a/linbox/algorithms/rational-reconstruction.h b/linbox/algorithms/rational-reconstruction.h
index 97c3a76..a14c2f0 100644
--- a/linbox/algorithms/rational-reconstruction.h
+++ b/linbox/algorithms/rational-reconstruction.h
@@ -55,6 +55,33 @@
 #endif
 
 
+namespace Givaro
+{
+    inline void reconstructRational (Integer& a, Integer& b, const Integer& x, const Integer& m, const Integer& bound)
+    {
+        Rational rr(x,m,bound);
+        a = rr.nume();
+        b = rr.deno();
+    }
+    
+    inline void reconstructRational (Integer& a, Integer& b, const Integer& x, const Integer& m)
+    {
+        reconstructRational(a,b, x, m, Givaro::sqrt(m));
+    }
+    
+    inline bool reconstructRational (Integer& a, Integer& b,
+                                     const Integer& x, const Integer& m,
+                                     const Integer& a_bound, const Integer& b_bound)
+    {
+        Integer bound = x/b_bound;
+			// if (bound>a_bound) std::cerr << "a_bound: " << a_bound << ", x/b_bound: " << bound << std::endl;
+        
+        reconstructRational(a,b,x,m, (bound>a_bound?bound:a_bound));
+        
+        return b<= b_bound;
+    }
+    
+}
 
 
 namespace LinBox
@@ -64,6 +91,9 @@ namespace LinBox
 		return ( (m.bitsize()+7 )/8) ;
 	}
 
+
+    
+
 	/*! \brief Limited doc so far.
 	 * Used, for instance, after LiftingContainer.
 	 */
@@ -169,7 +199,7 @@ namespace LinBox
 		{
 			typename InVect1::const_iterator v1_p;
 			typename InVect2::const_iterator v2_p;
-			_r. init (d, 0);
+			_r. assign(d, _r.zero);
 			for (v1_p = v1. begin(), v2_p = v2. begin(); v1_p != v1. end(); ++ v1_p, ++ v2_p)
 				_r. axpyin (d, *v1_p, *v2_p);
 
@@ -209,25 +239,26 @@ namespace LinBox
 			int n   = (int)num. size();
 			int len = (int)_lcontainer. length();
 			Integer prime = _lcontainer.prime();//prime
-			LVector digits; //Store all p-adic digits
-			digits. resize (len); //reserve space for all digits
+			const BlasVector<Ring> zero(_r,(size_t)n);
+			LVector digits((size_t)len,zero); //Store all p-adic digits
+			// digits. resize ((size_t)len); //reserve space for all digits
 			Integer modulus; //store current modulus
 			Integer denbound; // store current bound for den
 			Integer numbound; //store current bound for num
 
-			_r. init (modulus, 1);
-			_r. init (denbound, 1);
-			_r. init (numbound, 1);
+			_r. assign (modulus, _r.one);
+			_r. assign (denbound, _r.one);
+			_r. assign (numbound, _r.one);
 			Integer c1, c2, c1_den, c1_num, c2_den, c2_num;
-			IVector r1(num.size()), r2(num.size());
-			_r. init (c1, 0); _r. init(c1_den, 1); _r. init (c1_num, 0);
-			_r. init (c2, 0); _r. init(c2_den, 1); _r. init (c2_num, 0);
+			IVector r1(_r,num.size()), r2(_r,num.size());
+			_r. assign(c1, _r.zero); _r. assign(c1_den, _r.one); _r. assign (c1_num, _r.zero);
+			_r. assign(c2, _r.zero); _r. assign(c2_den, _r.one); _r. assign (c2_num, _r.zero);
 
 			typename IVector::iterator r_p;
 			for (r_p = r1. begin(); r_p != r1. end(); ++ r_p)
-				_r. init (*r_p, rand());
+				_r. init (*r_p, int64_t(rand()));
 			for (r_p = r2. begin(); r_p != r2. end(); ++ r_p)
-				_r. init (*r_p, rand());
+				_r. init (*r_p, int64_t(rand()));
 
 			//std::cout << "Random vecotor1: " ;
 			//print (r1);
@@ -237,7 +268,7 @@ namespace LinBox
 			Integer pmodulus; //store previous modulus
 			Integer tmp; //temprary integer
 
-			_r. init (den, 1);
+			_r. assign (den, _r.one);
 			typename LiftingContainer::const_iterator iter = _lcontainer.begin();
 
 			Integer tmp_den, tmp_num, rem1, rem2;
@@ -259,12 +290,13 @@ namespace LinBox
 				IVector& dig = *digits_p;
 				++step; ++ digits_p;
 
-				dig. resize (n);
+				// dig. resize ((size_t)n);
 
 				// get next p-adic digit
 				bool nextResult = iter.next(dig);
 				if (!nextResult) {
-					std::cout << "ERROR in lifting container. Are you using <double> ring with large norm? (1)" << std::endl;
+				commentator().report() <<
+					"ERROR in lifting container. Are you using <double> ring with large norm? (1)" << std::endl;
 					return false;
 				}
 				//std::cout << "New digits:\n";
@@ -283,14 +315,14 @@ namespace LinBox
 				if ((step % _threshold) == 0) {
 
 					//std::cout << "Previous (Current) modulus: " << pmodulus << "( " << modulus << ")\n";
-					dot (tmp, r1, dig); _r. remin (tmp, prime); _r. axpyin (c1, tmp, pmodulus);
+					dot (tmp, r1, dig); _r. modin (tmp, prime); _r. axpyin (c1, tmp, pmodulus);
 					//std::cout << "r1 * digit: " << tmp << '\n';
-					dot (tmp, r2, dig); _r. remin (tmp, prime); _r. axpyin (c2, tmp, pmodulus);
+					dot (tmp, r2, dig); _r. modin (tmp, prime); _r. axpyin (c2, tmp, pmodulus);
 					//std::cout << "r2 * digit: " << tmp << '\n';
 					//std::cout << "c1, c2: " << c1 << ", " << c2 << "\n";
 
-					_r. mul (rem1, c1, c1_den); _r. subin (rem1, c1_num); _r. remin (rem1, modulus);
-					_r. mul (rem2, c2, c2_den); _r. subin (rem2, c2_num); _r. remin (rem2, modulus);
+					_r. mul (rem1, c1, c1_den); _r. subin (rem1, c1_num); _r. modin (rem1, modulus);
+					_r. mul (rem2, c2, c2_den); _r. subin (rem2, c2_num); _r. modin (rem2, modulus);
 
 					//Early termination condition is met.
 
@@ -300,21 +332,21 @@ namespace LinBox
 					}
 
 					if (!_r. isZero (rem1)) {
-						int status = (int)_r.reconstructRational(tmp_num, tmp_den, c1, modulus, numbound, denbound);
+						int status = (int)Givaro::reconstructRational(tmp_num, tmp_den, c1, modulus, numbound, denbound);
 						if(status) {
 							_r. assign (c1_den, tmp_den); _r. assign (c1_num, tmp_num);
 						}
 					}
 
 					if (!_r. isZero (rem2)) {
-						int  status =(int)  _r.reconstructRational(tmp_num, tmp_den, c2, modulus, numbound, denbound);
+						int  status =(int) Givaro::reconstructRational(tmp_num, tmp_den, c2, modulus, numbound, denbound);
 						if(status) {
 							_r. assign (c2_den, tmp_den); _r. assign (c2_num, tmp_num);
 						}
 					}
 				}
 			}
-			IVector res (n);
+			IVector res (_r,(size_t)n);
 			typename LVector::const_iterator digit_begin = digits. begin();
 			PolEval (res, digit_begin, (size_t)step, prime);
 			if(step < len) _r. lcm (den, c1_den, c2_den);
@@ -332,11 +364,11 @@ namespace LinBox
 			std::cout << "Start rational reconstruction:\n";
 			typename Vector::iterator num_p; typename IVector::iterator res_p;
 			Integer tmp_res, neg_res, abs_neg, l, g;
-			_r. init (den, 1);
+			_r. assign(den, _r.one);
 			int counter=0;
 			for (num_p = num. begin(), res_p = res. begin(); num_p != num. end(); ++ num_p, ++ res_p) {
 				_r. mul (tmp_res, *res_p, den);
-				_r. remin (tmp_res, modulus);
+				_r. modin (tmp_res, modulus);
 				_r. sub (neg_res, tmp_res, modulus);
 				_r. abs (abs_neg, neg_res);
 
@@ -345,9 +377,10 @@ namespace LinBox
 				else if (_r. compare(abs_neg, numbound) < 0)
 					_r. assign (*num_p, neg_res);
 				else {
-					int status= (int) _r. reconstructRational(tmp_num, tmp_den, *res_p, modulus, numbound, denbound);
+					int status= (int)Givaro::reconstructRational(tmp_num, tmp_den, *res_p, modulus, numbound, denbound);
 					if (!status) {
-						std::cout << "ERROR in reconstruction ? (1)\n" << std::endl;
+						commentator().report() 
+						<< "ERROR in reconstruction ? (1)\n" << std::endl;
 #ifdef DEBUG_RR
 						std::cout<<" try to reconstruct :\n";
 						//	std::cout<<"approximation: "<<*iter_approx<<std::endl;
@@ -400,7 +433,7 @@ namespace LinBox
 #endif
 			linbox_check(num.size() == (size_t)_lcontainer.size());
 
-			_r. init (den, 1);
+			_r. assign (den, _r.one);
 			Integer prime = _lcontainer.prime(); 		        // prime used for lifting
 			std::vector<size_t> accuracy(_lcontainer.size(), 0); 	// accuracy (in powers of p) of each answer so far
 			Vector digit(_lcontainer.size());  		        // to store next digit
@@ -408,9 +441,9 @@ namespace LinBox
 			Integer prev_modulus;       	                        // store previous modulus
 			Integer numbound, denbound;                             // current num/den bound for early termination
 			size_t numConfirmed;                                       // number of reconstructions which passed twice
-			_r.init(modulus, 0);
+			_r.assign(modulus, _r.zero);
 			std::vector<Integer> zz(_lcontainer.size(), modulus);   // stores each truncated p-adic approximation
-			_r.init(modulus, 1);
+			_r.assign(modulus, _r.one);
 
 			size_t len = _lcontainer.length();
 			/* should be ceil(log(2*numbound*denbound)/log(prime))
@@ -457,7 +490,7 @@ namespace LinBox
 					_r.convert(iD, _lcontainer.numbound());
 					_r.convert(iN, _lcontainer.denbound());
 					_r.convert(pPower, prime);
-					pPower = pow(pPower, len-1);
+					pPower = pow(pPower, uint64_t(len)-1);
 
 					tmp = pPower * iN;
 					tmp /= iD;
@@ -501,7 +534,8 @@ namespace LinBox
 				// get next p-adic digit
 				bool nextResult = iter.next(digit);
 				if (!nextResult) {
-					std::cout << "ERROR in lifting container. Are you using <double> ring with large norm? (2)" << std::endl;
+					commentator().report()
+					<< "ERROR in lifting container. Are you using <double> ring with large norm? (2)" << std::endl;
 					return false;
 				}
 #ifdef RSTIMING
@@ -566,7 +600,7 @@ namespace LinBox
 						Integer tmp_num, tmp_den;
 						_r. assign (tmp_den, den);
 						_r. mul (tmp_num, den, *zz_p);
-						_r. remin (tmp_num, modulus);
+						_r. modin (tmp_num, modulus);
 
 						// assign tmp_num = one of tmp_num and tmp_num - modulus with smallest absolute value.
 						Integer n_num;
@@ -595,7 +629,7 @@ namespace LinBox
 						justConfirming = false;
 						// if no answer yet (or last answer became invalid)
 						// try to reconstruct a rational number
-						tmp = _r.reconstructRational(*num_p, tmp_den, *zz_p, modulus, numbound, denbound);
+						tmp = Givaro::reconstructRational(*num_p, tmp_den, *zz_p, modulus, numbound, denbound);
 						// update 'accuracy' according to whether it worked or not
 						if (tmp) {
 							linbox_check (!_r.isZero(tmp_den));
@@ -629,7 +663,7 @@ namespace LinBox
 							// check if the rational number works for _zz_p mod _modulus
 							_r. mul (tmp_i, den, *zz_p);
 							_r. subin (tmp_i, *num_p);
-							_r. remin (tmp_i, modulus);
+							_r. modin (tmp_i, modulus);
 							if (_r.isZero (tmp_i)) {
 								*accuracy_p = i;
 								numConfirmed++;
@@ -637,7 +671,7 @@ namespace LinBox
 							else {
 								// previous result is fake, reconstruct new answer
 								Integer tmp_den;
-								tmp = _r.reconstructRational(*num_p, tmp_den, *zz_p, modulus, numbound, denbound);
+								tmp = Givaro::reconstructRational(*num_p, tmp_den, *zz_p, modulus, numbound, denbound);
 								if (tmp) {
 									linbox_check (!_r.isZero(den));
 									if (! _r. areEqual (tmp_den, den)) {
@@ -672,7 +706,7 @@ namespace LinBox
 
 
 			Integer g;
-			_r. init (g, 0);
+			_r. assign (g, _r.zero);
 			_r. gcdin (g, den);
 			for (num_p = num. begin(); num_p != num. end(); ++ num_p)
 				_r. gcdin (g, *num_p);
@@ -698,27 +732,25 @@ namespace LinBox
 
 			if (deg == 1){
 				for (size_t i=0;i<y.size();++i)
-					_r.assign(y[i],(*Pol)[i]);
+					_r.assign(y[(size_t)i],(*Pol)[(size_t)i]);
 			}
 			else{
 				size_t deg_low, deg_high;
 				deg_high = deg/2;
 				deg_low  = deg - deg_high;
-				Integer zero;
-				_r.init(zero,0);
-				Vector y1(y.size(),zero), y2(y.size(),zero);
+				Vector y1(_r,y.size(),_r.zero), y2(_r,y.size(),_r.zero);
 				Integer x1=x, x2=x;
 
 				PolEval(y1, Pol, deg_low, x1);
 
-				ConstIterator Pol_high= Pol+deg_low;
+				ConstIterator Pol_high= Pol+(ptrdiff_t)deg_low;
 				PolEval(y2, Pol_high, deg_high, x2);
 
 
 				for (size_t i=0;i< y.size();++i){
-					_r.assign(y[i],y1[i]);
-					_r.axpyin(y[i],x1,y2[i]);
-					//_r.axpy(y[i],x1,y2[i],y1[i]);
+					_r.assign(y[(size_t)i],y1[(size_t)i]);
+					_r.axpyin(y[(size_t)i],x1,y2[(size_t)i]);
+					//_r.axpy(y[(size_t)i],x1,y2[(size_t)i],y1[(size_t)i]);
 				}
 
 				_r.mul(x,x1,x2);
@@ -751,20 +783,18 @@ namespace LinBox
 			size_t size= _lcontainer.size();
 
 
-			Integer zero;
-			_r.init(zero,0);
-			Vector zero_digit(_lcontainer.size(),zero);
+			Vector zero_digit(_r,_lcontainer.size(),_r.zero);
 
 			// store approximation as a polynomial and evaluate by baby step giant step
 			std::vector<Vector>  digit_approximation(length,zero_digit);
 
 			// store real approximation
-			Vector real_approximation(size,zero);
+			Vector real_approximation(_r,size,_r.zero);
 
 
 			// store modulus (intially set to 1)
 			Integer modulus;
-			_r.init(modulus, 1);
+			_r.assign(modulus, _r.one);
 
 			// denominator upper bound
 			Integer denbound;
@@ -788,7 +818,7 @@ namespace LinBox
 #endif
 			// Compute all the approximation using liftingcontainer
 			typename LiftingContainer::const_iterator iter = _lcontainer.begin();
-			for (size_t i=0 ; iter != _lcontainer.end() && iter.next(digit_approximation[i]);++i) {
+			for (size_t i=0 ; iter != _lcontainer.end() && iter.next(digit_approximation[(size_t)i]);++i) {
 
 #ifdef LIFTING_PROGRESS
 				lifting_commentator().progress(i);
@@ -796,7 +826,7 @@ namespace LinBox
 #if 0
 				eval_horn.start();
 				for (size_t j=0;j<size;++j)
-					_r.axpyin(real_approximation[j],modulus, digit_approximation[i][j]);
+					_r.axpyin(real_approximation[j],modulus, digit_approximation[(size_t)i][j]);
 				eval_horn.stop();
 				eval_horner+=eval_horn;
 #endif
@@ -809,7 +839,8 @@ namespace LinBox
 
 			// problem occured during lifting
 			if (iter!= _lcontainer.end()){
-				std::cout << "ERROR in lifting container. Are you using <double> ring with large norm? (3)" << std::endl;
+				commentator().report()
+				<< "ERROR in lifting container. Are you using <double> ring with large norm? (3)" << std::endl;
 				return false;
 			}
 
@@ -845,7 +876,7 @@ namespace LinBox
 				for (int i= length -1; i>= skip+sqrt_length; --i)
 					for (size_t j=0;j<size;++j) {
 						_r.mulin(baby_approx[sqrt_length][j] , prime);
-						_r.addin(baby_approx[sqrt_length][j], digit_approximation[i][j]);
+						_r.addin(baby_approx[sqrt_length][j], digit_approximation[(size_t)i][j]);
 					}
 
 				LinBox::integer p_to_sqrt, p;
@@ -859,7 +890,7 @@ namespace LinBox
 				for (int i= sqrt_length; i>= 0; --i)
 					for (size_t j=0;j<size;j++) {
 						_r.mulin(real_approximation[j] , prime_to_sqrt );
-						_r.addin(real_approximation[j], baby_approx[i][j]);
+						_r.addin(real_approximation[j], baby_approx[(size_t)i][j]);
 					}
 			}
 			eval_bsgs.stop();
@@ -896,10 +927,11 @@ namespace LinBox
 				typename Vector::iterator   iter_d  = den_r.begin();
 
 				for (size_t i=0; iter_a != real_approximation.end(); ++iter_a, ++ iter_n, ++iter_d, ++i){
-					if (!_r.reconstructRational(*iter_n, *iter_d,
+					if (!Givaro::reconstructRational(*iter_n, *iter_d,
 								    *iter_a, modulus, numbound, denbound))
 					{
-						std::cout << "ERROR in reconstruction ?\n" << std::endl;
+						commentator().report()
+						<< "ERROR in reconstruction ?\n" << std::endl;
 					}
 				}
 				dumb_ratrecon.stop();
@@ -914,11 +946,11 @@ namespace LinBox
 			Timer ratrecon;
 			ratrecon.start();
 			Integer common_den, common_den_mod_prod, bound,two,tmp;
-			_r.init(common_den,1);
-			_r.init(common_den_mod_prod,1);
-			_r.init(two,2);
+			_r.assign(common_den,_r.one);
+			_r.assign(common_den_mod_prod,_r.one);
+			_r.init(two,int64_t(2));
 
-			Vector denominator(num.size());
+			Vector denominator(_r,num.size());
 
 			int counter=0;
 			typename Vector::iterator   iter_approx = real_approximation.begin();
@@ -932,23 +964,23 @@ namespace LinBox
 			for (size_t i=0; iter_approx != real_approximation.end(); ++iter_approx, ++ iter_num, ++iter_denom, ++i){
 				//_r.mulin( *iter_approx , common_den_mod_prod);
 				_r.mulin( *iter_approx , common_den);
-				_r.remin( *iter_approx , modulus);
+				_r.modin( *iter_approx , modulus);
 				_r. sub (neg_approx, *iter_approx, modulus);
 				_r. abs (abs_approx, neg_approx);
 
 				if ( _r.compare(*iter_approx, numbound) < 0){
 					_r.assign(*iter_num, *iter_approx);
-					_r.init(*iter_denom, 1);
+					_r.assign(*iter_denom, _r.one);
 				}
 				else if (_r.compare(abs_approx, numbound) <0){
 					_r.assign(*iter_num, neg_approx);
-					_r.init(*iter_denom, 1);
+					_r.assign(*iter_denom, _r.one);
 				}
 				else {
-					if  (!_r.reconstructRational(*iter_num, *iter_denom, *iter_approx, modulus, numbound, denbound))
+					if  (!Givaro::reconstructRational(*iter_num, *iter_denom, *iter_approx, modulus, numbound, denbound))
 					{
-						std::cout << "ERROR in reconstruction ? (3)\n" << std::endl;
 #ifdef DEBUG_RR
+						std::cout << "ERROR in reconstruction ? (3)\n" << std::endl;
 						std::cout<<" try to reconstruct :\n";
 						std::cout<<"approximation: "<<*iter_approx<<std::endl;
 						std::cout<<"modulus: "<<modulus<<std::endl;
@@ -975,10 +1007,10 @@ namespace LinBox
 							_r.assign(modulus,tmp);
 							_r.div(tmp,modulus,prime);
 						}
-						_r.rem(tmp , *iter_denom , modulus);
-						_r.remin(common_den_mod_prod , modulus);
+						_r.mod(tmp , *iter_denom , modulus);
+						_r.modin(common_den_mod_prod , modulus);
 						_r.mulin(common_den_mod_prod , tmp);
-						_r.remin(common_den_mod_prod , modulus);
+						_r.modin(common_den_mod_prod , modulus);
 					}
 #endif
 
@@ -986,17 +1018,17 @@ namespace LinBox
 
 			}
 
-			_r.init(tmp,1);
+			_r.assign(tmp,_r.one);
 			for (int i= idx_last_den ; i>=0;--i){
-				_r.mulin(num[i],tmp);
-				_r.mulin(tmp,denominator[i]);
+				_r.mulin(num[(size_t)i],tmp);
+				_r.mulin(tmp,denominator[(size_t)i]);
 			}
 
 
 #if 0
 			typename Vector1::reverse_iterator rev_iter_num   = num.rbegin();
 			typename Vector::reverse_iterator  rev_iter_denom = denominator.rbegin();
-			_r.init(tmp,1);
+			_r.assign(tmp,_r.one);
 			for (; rev_iter_num != num.rend(); ++rev_iter_num, ++rev_iter_denom){
 
 				_r.mulin(*rev_iter_num,tmp);
@@ -1034,7 +1066,7 @@ namespace LinBox
 
 			Integer init_den = den_app;
 			if (den > 0) lcm(init_den,den,den_app);
-			_r. init (den, 1);
+			_r. assign(den, _r.one);
 #ifdef DEBUG_RR
 			cout << "debug: den " << den;
 #endif
@@ -1042,9 +1074,9 @@ namespace LinBox
 			Vector digit(_lcontainer.size());                       // to store next digit
 			Integer modulus;                                        // store modulus (power of prime)
 			Integer prev_modulus;                                   // store previous modulus
-			_r.init(modulus, 0);
+			_r.assign(modulus, _r.zero);
 			std::vector<Integer> zz(_lcontainer.size(), modulus);   // stores each truncated p-adic approximation
-			_r.init(modulus, 1);
+			_r.assign(modulus, _r.one);
 
 			size_t len = _lcontainer.length(); // should be ceil(log(2*numbound*denbound)/log(prime))
 #ifdef DEBUG_RR
@@ -1078,7 +1110,8 @@ namespace LinBox
 				// get next p-adic digit
 				bool nextResult = iter.next(digit);
 				if (!nextResult) {
-					std::cout << "ERROR in lifting container. Are you using <double> ring with large norm? (ET)" << std::endl;
+					commentator().report()
+					<< "ERROR in lifting container. Are you using <double> ring with large norm? (ET)" << std::endl;
 					return false;
 				}
 #ifdef RSTIMING
@@ -1111,7 +1144,7 @@ namespace LinBox
 					terminated = true;
 					for ( zz_p = zz.begin(), num_p = num.begin(); zz_p != zz.end();  ++ zz_p, ++ num_p) {
 						Integer a = *num_p;
-						Integer bx= *zz_p; _r. mulin (bx, den); _r. remin(bx, modulus);
+						Integer bx= *zz_p; _r. mulin (bx, den); _r. modin(bx, modulus);
 						Integer _bx = bx-modulus;
 						if (!_r.areEqual(a,bx) && !_r.areEqual(a,_bx)) {
 							terminated = false;
@@ -1129,8 +1162,8 @@ namespace LinBox
 					Integer tmp_den=0;
 					Integer zz_p_den (*zz_p);
 					_r. mulin (zz_p_den,den);
-					_r. remin (zz_p_den,modulus);
-					bool tmp = RR.reconstructRational(*num_p, tmp_den, zz_p_den, modulus);
+					_r. modin (zz_p_den,modulus);
+					bool tmp = Givaro::reconstructRational(*num_p, tmp_den, zz_p_den, modulus);
 #ifdef RSTIMING
 					++counter;
 #endif
@@ -1158,9 +1191,9 @@ namespace LinBox
 					Integer tmp_den;
 					Integer zz_p_den (*zz_p);
 					_r. mulin (zz_p_den,den);
-					_r. remin (zz_p_den,modulus);
+					_r. modin (zz_p_den,modulus);
 
-					bool tmp = RR.reconstructRational(*num_p, tmp_den, zz_p_den, modulus, _lcontainer.numbound(), _lcontainer.denbound());
+					bool tmp = Givaro::reconstructRational(*num_p, tmp_den, zz_p_den, modulus, _lcontainer.numbound(), _lcontainer.denbound());
 #ifdef RSTIMING
 					++counter;
 #endif
@@ -1173,7 +1206,8 @@ namespace LinBox
 						}
 					}
 					else {
-						std::cout << "ERROR in reconstruction ? (ET)\n" << std::flush;
+						commentator().report()
+						<< "ERROR in reconstruction ? (ET)\n" << std::flush;
 					}
 
 				}
@@ -1189,7 +1223,7 @@ namespace LinBox
 #endif
 			Integer g;
 			Integer abs_num_p(0);
-			_r. init (g, 0);
+			_r. assign(g, _r.zero);
 			_r. gcdin (g, den);
 			for (num_p = num. begin(); num_p != num. end(); ++ num_p) {
 				_r. gcdin (g, *num_p);
@@ -1275,20 +1309,18 @@ namespace LinBox
 			std::cout<<"magnitude time:                 "<<magn<<"\n";
 
 			// some constants
-			Integer zero;
-			_r.init(zero,0);
-			Vector zero_digit(_lcontainer.size(),zero);
+			Vector zero_digit(_lcontainer.size(),_r.zero);
 
 			// store approximation as a polynomial and evaluate by baby step giant step
 			std::vector<Vector>  digit_approximation(length,zero_digit);
 
 			// store real approximation
-			Vector real_approximation(size,zero);
+			Vector real_approximation(size,_r.zero);
 			Vector last_real_approximation;
 
 			// store modulus (intially set to 1)
 			Integer modulus, last_modulus;
-			_r.init(modulus, 1);
+			_r.assign(modulus, _r.one);
 
 			typename LiftingContainer::const_iterator iter = _lcontainer.begin();
 
@@ -1298,11 +1330,11 @@ namespace LinBox
 			size_t endingsteps  =minsteps;
 
 			// switchers
-			bool latticeOK=false, numeratorOK=false, domoresteps=true, domorelattice=true;
+			bool numeratorOK=false, domoresteps=true, domorelattice=true;
 
 			// common denominator
 			Integer common_denom;
-			_r.init(common_denom,1);
+			_r.assign(common_denom,_r.one);
 
 			// bad numerator index
 			size_t bad_num_index=0;
@@ -1327,7 +1359,7 @@ namespace LinBox
 				if (domoresteps){
 
 					// compute the padic digits
-					for (size_t i = startingsteps ;  (i< endingsteps) && (iter.next(digit_approximation[i]));++i) {
+					for (size_t i = startingsteps ;  (i< endingsteps) && (iter.next(digit_approximation[(size_t)i]));++i) {
 						_r.mulin(modulus,prime);
 					}
 
@@ -1343,7 +1375,7 @@ namespace LinBox
 
 					if (startingsteps != 0){
 						for (size_t i=0;i<size;++i){
-							_r.axpyin(last_real_approximation[i],real_approximation[i], last_modulus);
+							_r.axpyin(last_real_approximation[(size_t)i],real_approximation[(size_t)i], last_modulus);
 						}
 						real_approximation=last_real_approximation;
 					}
@@ -1371,16 +1403,16 @@ namespace LinBox
 				// NTL::clear(Lattice);
 				// Lattice[0][0]=1;
 				// for (size_t i= bad_num_index+1;i< bad_num_index+k+1;++i){
-					// Lattice[i][i]=m;//not working when bad index <> 0
-					// _r.convert(tmp_int, real_approximation[i-1]);
+					// Lattice[(size_t)i][(size_t)i]=m;//not working when bad index <> 0
+					// _r.convert(tmp_int, real_approximation[(size_t)i-1]);
 					// tmp=NTL::to_ZZ((std::string(tmp_int)).c_str());
-					// Lattice[0][i]=tmp;//not working when bad index <> 0
+					// Lattice[0][(size_t)i]=tmp;//not working when bad index <> 0
 				// }
 				BlasMatrix<Ring> Lattice(_r,k+1,k+1);
 				Lattice.setEntry(0,0,_r.one);
 				for (size_t i= bad_num_index+1;i< bad_num_index+k+1;++i){
 					Lattice.setEntry(i,i,mod);//not working when bad index <> 0
-					_r.convert(tmp_int, real_approximation[i-1]);
+					_r.convert(tmp_int, real_approximation[(size_t)i-1]);
 					Lattice.setEntry(0,i,tmp_int);//not working when bad index <> 0
 				}
 
@@ -1400,8 +1432,8 @@ namespace LinBox
 
 
 				// check if the 1st row is the short vector
-				// Lattice[i][j] should work. Using standard getEntry though
-				latticeOK=true;
+				// Lattice[(size_t)i][j] should work. Using standard getEntry though
+				bool latticeOK=true;
 				tmp=abs(Lattice.getEntry(0,0))*ratio;
 				for (size_t i=1;i<k+1;++i){
 					for (size_t j=0;j<k+1;++j)
@@ -1431,7 +1463,7 @@ namespace LinBox
 					// integer dd= integer(0);
 					// for(long i = b - 1; i >= 0; --i) {
 						// dd *= base;
-						// dd += integer(byteArray[i]);
+						// dd += integer(byteArray[(size_t)i]);
 					// }
 					// delete [] byteArray;
 					myInteger dd = Lattice.getEntry(0,0);
@@ -1451,15 +1483,15 @@ namespace LinBox
 					numeratorOK=true;
 					// compute the numerators and check their validity according to the numerator  bound
 					for (size_t i=0;i<size;++i){
-						_r.mulin(real_approximation[i], denom);
-						_r.remin(real_approximation[i], modulus);
-						_r. sub (neg_approx, real_approximation[i], modulus);
+						_r.mulin(real_approximation[(size_t)i], denom);
+						_r.modin(real_approximation[(size_t)i], modulus);
+						_r. sub (neg_approx, real_approximation[(size_t)i], modulus);
 						_r. abs (abs_approx, neg_approx);
 
-						if ( _r.compare(real_approximation[i], numbound) < 0)
-							_r.assign(num[i], real_approximation[i]);
+						if ( _r.compare(real_approximation[(size_t)i], numbound) < 0)
+							_r.assign(num[(size_t)i], real_approximation[(size_t)i]);
 						else if (_r.compare(abs_approx, numbound) <0)
-							_r.assign(num[i], neg_approx);
+							_r.assign(num[(size_t)i], neg_approx);
 						else {
 							bad_num_index= std::min(i, size-k);
 							numeratorOK=false;
@@ -1483,7 +1515,7 @@ namespace LinBox
 						}
 
 						// check the validity of the solution according to n.||A||.||num||+ d.||b|| < modulus
-						integer check= size*MagnA*maxnum+dd*Magnb;
+						integer check= uint64_t(size)*MagnA*maxnum+dd*Magnb;
 
 						checksol.stop();
 						std::cout<<"checking solution time :        "<<checksol<<"\n\n";
@@ -1533,7 +1565,7 @@ namespace LinBox
 
 			if (neg_denom){
 				for (size_t i=0;i<size;++i)
-					_r.negin(num[i]);
+					_r.negin(num[(size_t)i]);
 			}
 #ifdef RSTIMING
 			tRecon.stop();
@@ -1618,20 +1650,18 @@ namespace LinBox
 			std::cout<<"magnitude time:                 "<<magn<<"\n";
 
 			// some constants
-			Integer zero;
-			_r.init(zero,0);
-			Vector zero_digit(_lcontainer.size(),zero);
+			Vector zero_digit(_lcontainer.size(),_r.zero);
 
 			// store approximation as a polynomial and evaluate by baby step giant step
 			std::vector<Vector>  digit_approximation(length,zero_digit);
 
 			// store real approximation
-			Vector real_approximation(size,zero);
+			Vector real_approximation(size,_r.zero);
 			Vector last_real_approximation;
 
 			// store modulus (intially set to 1)
 			Integer modulus, last_modulus;
-			_r.init(modulus, 1);
+			_r.assign(modulus, _r.one);
 
 			typename LiftingContainer::const_iterator iter = _lcontainer.begin();
 
@@ -1641,11 +1671,11 @@ namespace LinBox
 			size_t endingsteps  =minsteps;
 
 			// switchers
-			bool latticeOK=false, numeratorOK=false, domoresteps=true, domorelattice=true;
+			bool numeratorOK=false, domoresteps=true, domorelattice=true;
 
 			// common denominator
 			Integer common_denom;
-			_r.init(common_denom,1);
+			_r.assign(common_denom,_r.one);
 
 			// bad numerator index
 			size_t bad_num_index=0;
@@ -1672,7 +1702,7 @@ namespace LinBox
 					linbox_check(startingsteps != endingsteps);
 
 					// compute the padic digits
-					for (size_t i = startingsteps ;  (i< endingsteps) && (iter.next(digit_approximation[i]));++i) {
+					for (size_t i = startingsteps ;  (i< endingsteps) && (iter.next(digit_approximation[(size_t)i]));++i) {
 						_r.mulin(modulus,prime);
 					}
 
@@ -1688,7 +1718,7 @@ namespace LinBox
 
 					if (startingsteps != 0){
 						for (size_t i=0;i<size;++i){
-							_r.axpyin(last_real_approximation[i],real_approximation[i], last_modulus);
+							_r.axpyin(last_real_approximation[(size_t)i],real_approximation[(size_t)i], last_modulus);
 						}
 						real_approximation=last_real_approximation;
 					}
@@ -1711,9 +1741,9 @@ namespace LinBox
 				// ZZ_mat<mpz_t> Lattice(k+1,k+1) ;
 				// Lattice= new mpz_t*[k+2];
 				// for (size_t i=0;i<k+2;++i){
-					// Lattice[i]= new mpz_t[k+2];
+					// Lattice[(size_t)i]= new mpz_t[k+2];
 					// for (size_t j=0;j<k+2;++j)
-						// mpz_init(Lattice[i][j]);
+						// mpz_init(Lattice[(size_t)i][j]);
 				// }
 				BlasMatrix<Ring> Lattice(_r,k+1,k+1);
 
@@ -1724,17 +1754,17 @@ namespace LinBox
 
 				// Lattice.Set(0,0,Z_NR<mpz_t>(tmp.get_mpz()));
 				// for (size_t i=1;i< k+1;++i){
-					// mpz_set(Lattice[i][i],mod.get_mpz());
+					// mpz_set(Lattice[(size_t)i][(size_t)i],mod.get_mpz());
 					// Lattice.Set(i,i, Z_NR<mpz_t>(mod.get_mpz()) );
 					// _r.convert(tmp, real_approximation[bad_num_index+i-1]);
 					// Lattice.Set(0,i,Z_NR<mpz_t>(tmp.get_mpz()));
-					// mpz_set(Lattice[1][i],tmp.get_mpz());
+					// mpz_set(Lattice[1][(size_t)i],tmp.get_mpz());
 				// }
 				Lattice.setEntry(0,0,tmp);
 				for (size_t i=1;i< k+1;++i){
 					Lattice.setEntry(i,i, mod );
 					_r.convert(tmp, real_approximation[bad_num_index+i-1]);
-					Lattice.setEntry(0,i,FPLLL::Z_NR<mpz_t>(tmp.get_mpz()));
+					Lattice.setEntry(0,i,fplll::Z_NR<mpz_t>(tmp.get_mpz()));
 				}
 
 
@@ -1754,7 +1784,7 @@ namespace LinBox
 
 
 				// check if the 1st row is the short vector
-				latticeOK=true;
+				bool latticeOK=true;
 				_r.mul(tmp, Lattice.getEntry(0,0),ratio);
 				// mpz_mul(tmp.get_mpz(), Lattice(0,0).GetData(),ratio.get_mpz());
 				for (size_t i=1;i<k+1;++i){
@@ -1773,8 +1803,8 @@ namespace LinBox
 				//delete the lattice
 				// for (size_t i=0;i<k+2;++i){
 					// for (size_t j=0;j<k+2;++j)
-						// mpz_clear(Lattice[i][j]);
-					// delete[] Lattice[i];
+						// mpz_clear(Lattice[(size_t)i][j]);
+					// delete[] Lattice[(size_t)i];
 				// }
 				// delete[] Lattice;
 
@@ -1801,15 +1831,15 @@ namespace LinBox
 					numeratorOK=true;
 					// compute the numerators and check their validity according to the numerator  bound
 					for (size_t i=0;i<size;++i){
-						_r.mulin(real_approximation[i], common_denom);
-						_r.remin(real_approximation[i], modulus);
-						_r. sub (neg_approx, real_approximation[i], modulus);
+						_r.mulin(real_approximation[(size_t)i], common_denom);
+						_r.modin(real_approximation[(size_t)i], modulus);
+						_r. sub (neg_approx, real_approximation[(size_t)i], modulus);
 						_r. abs (abs_approx, neg_approx);
 
-						if ( _r.compare(real_approximation[i], numbound) < 0)
-							_r.assign(num[i], real_approximation[i]);
+						if ( _r.compare(real_approximation[(size_t)i], numbound) < 0)
+							_r.assign(num[(size_t)i], real_approximation[(size_t)i]);
 						else if (_r.compare(abs_approx, numbound) <0)
-							_r.assign(num[i], neg_approx);
+							_r.assign(num[(size_t)i], neg_approx);
 						else {
 							bad_num_index= std::min(i, size-k);
 							numeratorOK=false;
@@ -1833,7 +1863,7 @@ namespace LinBox
 						}
 
 						// check the validity of the solution according to n.||A||.||num||+ d.||b|| < modulus
-						integer check= size*MagnA*maxnum+dd*Magnb;
+						integer check= uint64_t(size)*MagnA*maxnum+dd*Magnb;
 
 						checksol.stop();
 						std::cout<<"checking solution time :        "<<checksol<<"\n\n";
@@ -1883,7 +1913,7 @@ namespace LinBox
 
 			if (neg_denom){
 				for (size_t i=0;i<size;++i)
-					_r.negin(num[i]);
+					_r.negin(num[(size_t)i]);
 			}
 #ifdef RSTIMING
 			tRecon.stop();
@@ -1960,20 +1990,18 @@ namespace LinBox
 			std::cout<<"magnitude time:                 "<<magn<<"\n";
 
 			// some constants
-			Integer zero;
-			_r.init(zero,0);
-			Vector zero_digit(_lcontainer.size(),zero);
+			Vector zero_digit(_lcontainer.size(),_r.zero);
 
 			// store approximation as a polynomial and evaluate by baby step giant step
 			std::vector<Vector>  digit_approximation(length,zero_digit);
 
 			// store real approximation
-			Vector real_approximation(size,zero);
+			Vector real_approximation(size,_r.zero);
 			Vector last_real_approximation;
 
 			// store modulus (intially set to 1)
 			Integer modulus, last_modulus;
-			_r.init(modulus, 1);
+			_r.assign(modulus, _r.one);
 
 			typename LiftingContainer::const_iterator iter = _lcontainer.begin();
 
@@ -1983,11 +2011,11 @@ namespace LinBox
 			size_t endingsteps  =minsteps;
 
 			// switchers
-			bool latticeOK=false, numeratorOK=false, domoresteps=true, domorelattice=true;
+			bool numeratorOK=false, domoresteps=true, domorelattice=true;
 
 			// common denominator
 			Integer common_denom;
-			_r.init(common_denom,1);
+			_r.assign(common_denom,_r.one);
 
 			// bad numerator index
 			size_t bad_num_index=0;
@@ -2014,7 +2042,7 @@ namespace LinBox
 					linbox_check(startingsteps != endingsteps);
 
 					// compute the padic digits
-					for (size_t i = startingsteps ;  (i< endingsteps) && (iter.next(digit_approximation[i]));++i) {
+					for (size_t i = startingsteps ;  (i< endingsteps) && (iter.next(digit_approximation[(size_t)i]));++i) {
 						_r.mulin(modulus,prime);
 					}
 
@@ -2030,7 +2058,7 @@ namespace LinBox
 
 					if (startingsteps != 0){
 						for (size_t i=0;i<size;++i){
-							_r.axpyin(last_real_approximation[i],real_approximation[i], last_modulus);
+							_r.axpyin(last_real_approximation[(size_t)i],real_approximation[(size_t)i], last_modulus);
 						}
 						real_approximation=last_real_approximation;
 					}
@@ -2056,9 +2084,9 @@ namespace LinBox
 
 				Lattice[0]=tmp;
 				for (size_t i=1;i< k+1;++i){
-					Lattice[i*(k+1)+i]=mod;
+					Lattice[(size_t)i*(k+1)+i]=mod;
 					_r.convert(tmp, real_approximation[bad_num_index+i-1]);
-					Lattice[i]=tmp;
+					Lattice[(size_t)i]=tmp;
 				}
 
 				// ratio to check the validity of the denominator compare to the entries in the reduced lattice
@@ -2075,11 +2103,11 @@ namespace LinBox
 
 
 				// check if the 1st row is the short vector
-				latticeOK=true;
+				bool latticeOK=true;
 				tmp = Givaro::abs(L3[0][0]*ratio);
 				for (size_t i=1;i<k+1;++i){
 					for (size_t j=0;j<k+1;++j)
-						if (tmp > Givaro::abs(L3[i][j])){
+						if (tmp > Givaro::abs(L3[(size_t)i][j])){
 							latticeOK=false;
 							break;
 						}
@@ -2112,15 +2140,15 @@ namespace LinBox
 					numeratorOK=true;
 					// compute the numerators and check their validity according to the numerator  bound
 					for (size_t i=0;i<size;++i){
-						_r.mulin(real_approximation[i], common_denom);
-						_r.remin(real_approximation[i], modulus);
-						_r. sub (neg_approx, real_approximation[i], modulus);
+						_r.mulin(real_approximation[(size_t)i], common_denom);
+						_r.modin(real_approximation[(size_t)i], modulus);
+						_r. sub (neg_approx, real_approximation[(size_t)i], modulus);
 						_r. abs (abs_approx, neg_approx);
 
-						if ( _r.compare(real_approximation[i], numbound) < 0)
-							_r.assign(num[i], real_approximation[i]);
+						if ( _r.compare(real_approximation[(size_t)i], numbound) < 0)
+							_r.assign(num[(size_t)i], real_approximation[(size_t)i]);
 						else if (_r.compare(abs_approx, numbound) <0)
-							_r.assign(num[i], neg_approx);
+							_r.assign(num[(size_t)i], neg_approx);
 						else {
 							bad_num_index= std::min(i, size-k);
 							numeratorOK=false;
@@ -2144,7 +2172,7 @@ namespace LinBox
 						}
 
 						// check the validity of the solution according to n.||A||.||num||+ d.||b|| < modulus
-						integer check= size*MagnA*maxnum+dd*Magnb;
+						integer check= uint64_t(size)*MagnA*maxnum+dd*Magnb;
 
 						checksol.stop();
 						std::cout<<"checking solution time :        "<<checksol<<"\n\n";
@@ -2194,7 +2222,7 @@ namespace LinBox
 
 			if (neg_denom){
 				for (size_t i=0;i<size;++i)
-					_r.negin(num[i]);
+					_r.negin(num[(size_t)i]);
 			}
 #ifdef RSTIMING
 			tRecon.stop();
diff --git a/linbox/algorithms/rational-solver-adaptive.h b/linbox/algorithms/rational-solver-adaptive.h
index b15dc7f..4e8e0fc 100644
--- a/linbox/algorithms/rational-solver-adaptive.h
+++ b/linbox/algorithms/rational-solver-adaptive.h
@@ -30,7 +30,7 @@
 #include "linbox/util/debug.h"
 
 
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 #include "linbox/algorithms/rational-solver.h"
 #include "linbox/randiter/random-prime.h"
 
@@ -43,16 +43,16 @@ namespace LinBox
 		static SolverReturnStatus solveNonsingular(OutVector& num, typename IRing::Element& den, const BlasMatrix<IRing>& M, const InVector& b)
 		{
 			linbox_check ((M. rowdim() == M. coldim()) && (b.size() == M.rowdim()) && (num. size() ==M.coldim()));
-			typedef Modular<int32_t> Field;
-			// typedef Modular<double> Field;
-			RationalSolver<IRing, Field, RandomPrimeIterator, WanTraits> numerical_solver;
-			//RationalSolver<IRing, Field, RandomPrimeIterator, NumericalTraits> numerical_solver;
+			typedef Givaro::Modular<int32_t> Field;
+			// typedef Givaro::Modular<double> Field;
+			RationalSolver<IRing, Field, RandomPrimeIterator, NumSymNormTraits> numerical_solver;
+			//RationalSolver<IRing, Field, RandomPrimeIterator, NumSymOverlapTraits> numerical_solver;
 			SolverReturnStatus ret;
 			ret = numerical_solver. solve(num, den, M, b);
 
 			if (ret != SS_OK) {
 				RationalSolver<IRing, Field, RandomPrimeIterator> solver;
-				std::vector<typename IRing::Element> Ib; Ib.reserve(b.size());
+				BlasVector<IRing> Ib(M.field()); Ib.reserve(b.size());
 				typename IRing::Element tmp;
 				for(typename InVector::const_iterator biter = b.begin();
 				    biter != b.end();
@@ -72,9 +72,9 @@ namespace LinBox
 	struct RationalSolverAdaptiveClass<IRing, OutVector, Container<typename IRing::Element> > {
 		static SolverReturnStatus solveNonsingular(OutVector& num, typename IRing::Element& den, const BlasMatrix<IRing>& M, const Container<typename IRing::Element> & b) {
 			linbox_check ((M. rowdim() == M. coldim()) && (b.size() == M.rowdim()) && (num. size() ==M.coldim()));
-			typedef Modular<int32_t> Field;
-			// typedef Modular<double> Field;
-			RationalSolver<IRing, Field, RandomPrimeIterator, NumericalTraits> numerical_solver;
+			typedef Givaro::Modular<int32_t> Field;
+			// typedef Givaro::Modular<double> Field;
+			RationalSolver<IRing, Field, RandomPrimeIterator, NumSymOverlapTraits> numerical_solver;
 			SolverReturnStatus ret;
 			ret = numerical_solver. solve(num, den, M, b);
 
diff --git a/linbox/algorithms/rational-solver-sn.h b/linbox/algorithms/rational-solver-sn.h
index 1809492..a688b40 100644
--- a/linbox/algorithms/rational-solver-sn.h
+++ b/linbox/algorithms/rational-solver-sn.h
@@ -35,11 +35,11 @@
 #include "linbox/blackbox/archetype.h"
 #include "linbox/algorithms/dyadic-to-rational.h"
 #include "linbox/blackbox/compose.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
 #include "linbox/algorithms/vector-fraction.h"
 #include "linbox/algorithms/matrix-hom.h"
 #include "linbox/util/timer.h"
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
 
 namespace LinBox {
 
@@ -66,17 +66,17 @@ namespace LinBox {
 
 	public:
 		typedef typename Ring::Element Int;
-		typedef std::vector<Int> IVector;
+		typedef BlasVector<Ring> IVector;
 		// note: the type integer is also used.  For instance, we assume shift operator<< works on integer.
 		typedef ParamFuzzy Field;
 		typedef typename Field::Element Float;
-		typedef std::vector<Float> FVector;
+		typedef BlasVector<Field> FVector;
 		typedef BlasMatrix<Field> FMatrix;
 
 	protected:
 		Ring _ring;
 		VectorDomain<Ring> _VDR;
-		Field _field;
+		const Field _field; // we own it, user not expected to provide this handle on floating pt.
 		VectorDomain<Field> _VDF;
 		NumericSolver _numsolver;
 		//inline static int check (int n, const double* M, integer* numx, integer& denx, double* b) ;
@@ -92,9 +92,14 @@ namespace LinBox {
 		bool exact_apply;
 	public:
 
+		inline const Field & field() const { return _field; }
+
 		RationalSolverSN(const Ring& R = Ring(), const NumericSolver& S = NumericSolver(),
 				 bool ea=false) :
-		       	_ring(R), _VDR(R), _field(Field()), _VDF(Field()), _numsolver(S), exact_apply(ea)
+		       	_ring(R), _VDR(R), _field(), _VDF(field()), _numsolver(S)
+			// randow default to 0
+			,shift(0),shift_prev(0),shift_max(0),SHIFT_BOUND(0), HIT(0), MISS(0), iterations(0),sstatus(SHIFT_GROW),searchPeak(false),mnorm(0)
+			, exact_apply(ea)
 		{}
 
 		/**
@@ -116,10 +121,10 @@ namespace LinBox {
 			linbox_check((b.size() == M.rowdim()) && (num. size() == M.coldim()));
 
 			// DM is M as matrix of doubles
-			FMatrix DM(_field, n, n);
+			FMatrix DM(field(), n, n);
 			//  Fix MatrixHom?
 			//FMatrix* DMp = &DM;
-			//MatrixHom::map<FMatrix, IMatrix, Field>(DMp, M, _field);
+			//MatrixHom::map<FMatrix, IMatrix, Field>(DMp, M, field());
 
 			if(n != M. rowdim() || n != M. coldim() || n != num.size()) {
 				// std::cerr << "solve fail 1 - dimension mismatch" << std::endl;
@@ -134,21 +139,21 @@ namespace LinBox {
 			typename FMatrix::Iterator dm_p = DM.Begin();
 			for (typename IMatrix::ConstIterator raw_p = M.Begin();
 			     raw_p != M. End(); ++ raw_p, ++dm_p) {
-				_field.init(*dm_p, *raw_p);
+				field().init(*dm_p, *raw_p);
 			}
 
 			// build a numeric solver from new double matrix
 			_numsolver.init(DM);
 
 			// r is b as vector of doubles.  (r is initial residual)
-			FVector r(n);
-			IVector bi(n);
+			FVector r(field(),n);
+			IVector bi(_ring,n);
 			typename IVector::const_iterator b_p = b.begin();
 			typename IVector::iterator bi_p = bi.begin();
 			typename FVector::iterator r_p = r.begin();
-			for (  ; b_p != b. begin() + n; ++b_p, ++r_p, ++bi_p) {
+			for (  ; b_p != b. begin() + (ptrdiff_t) n; ++b_p, ++r_p, ++bi_p) {
 				*bi_p = *b_p;  //  copy original RHS
-				_field.init(*r_p, *b_p);
+				field().init(*r_p, *b_p);
 			}
 
 			//  denBound is the Hadamard bound, loopBound is roughly twice as much
@@ -167,12 +172,13 @@ namespace LinBox {
 
 			loopBound *= (2*mnorm + zw_dmax((int)n, &*(r.begin()), 1));
 
-			std::vector<integer> numx(n), tnum(n); // numerator of binary expansion
+			Givaro::ZRing<Integer> Z;
+			BlasVector<Givaro::ZRing<Integer> > numx(Z,n), tnum(Z,n); // numerator of binary expansion
 			integer denx = 1, tden; // denominator of binary expansion (denx is a power of 2).
 
-			FVector x(n), xs_int(n), xs_frac(n);
-			FVector lastr(n);
-			IVector lastb(n);
+			FVector x(field(),n), xs_int(field(),n), xs_frac(field(),n);
+			FVector lastr(field(),n);
+			IVector lastb(_ring,n);
 
 			//set initial shift small.
 			shift = 2;
@@ -183,8 +189,6 @@ namespace LinBox {
 			HIT = 0; MISS = 0;
 			iterations = 0;
 			integer ay, be;
-			PID_integer Z;
-			int ret;
 
 			bool recon_success = false;
 			int recon_status = 0;
@@ -199,6 +203,7 @@ namespace LinBox {
 			//size_t rr_count = 0;
 			//solve_timer.clear(); rr_timer.clear();
 			do{
+			int ret;
 				//tt.clear(); tt.start();
 				ret = rat_sol(numx, denx, xs_int, xs_frac, bi, lastb, r, lastr, x, bound, M);
 				//tt.stop(); solve_timer += tt;
@@ -222,7 +227,7 @@ namespace LinBox {
 					bound <<= 2;
 					int rPos = rand()%(int)n;
 					//std::cerr << "At iteration " << iterations << ", ";
-					if(dyadicToRational(Z, ay, be, numx[rPos], denx, denBound) /*== 2*/){
+					if(dyadicToRational(Z, ay, be, numx[(size_t)rPos], denx, denBound) /*== 2*/){
 						//std::cerr << "Random single worked!  ";
 					}
 					else{
@@ -274,7 +279,7 @@ namespace LinBox {
 
 #if 0
 			//  Answer checking
-			IVector y(n), z(n);
+			IVector y(_ring,n), z(_ring,n);
 			M.apply(y, num);
 			_VDR.mul(z, b, den);
 			if ( !_VDR.areEqual(y, z)) {
@@ -331,11 +336,10 @@ namespace LinBox {
 
 #endif // __LINBOX_rational_solver_sn_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/rational-solver-sn.inl b/linbox/algorithms/rational-solver-sn.inl
index 5e54ece..d263fe5 100644
--- a/linbox/algorithms/rational-solver-sn.inl
+++ b/linbox/algorithms/rational-solver-sn.inl
@@ -42,14 +42,14 @@ int zw_shift(NumericSolver & NS_S, size_t n, FVector &r, FVector &x)
 {
 	//  ZW method for calculating shift
 	// compute ax
-	FVector ax(n);
+	FVector ax(field(),n);
 	NS_S.apply(ax, x);
 	// compute ax = ax -r, the negative of residual
 	for(size_t i=0; i<n; i++)
-		_field.sub(ax[i], ax[i], r[i]);
+		field().sub(ax[i], ax[i], r[i]);
 	// compute possible shift
 	int zw_shift_loc;
-	double normr1, normr2, normr3, shift1, shift2;
+	double normr1, normr2, normr3,  shift2;
 	normr1 = zw_dmax(n, &*r.begin(), 1);
 	normr2 = zw_dmax(n, &*ax.begin(), 1);
 	normr3 = zw_dmax(n, &*x.begin(), 1);
@@ -59,7 +59,7 @@ int zw_shift(NumericSolver & NS_S, size_t n, FVector &r, FVector &x)
 	if (normr2 <.0000000001)
 		zw_shift_loc = 30;
 	else {
-		shift1 = floor(log_2 (normr1 / normr2)) - 2;
+		double shift1 = floor(log_2 (normr1 / normr2)) - 2;
 		zw_shift_loc = (int)(30 < shift1 ? 30 : shift1);
 	}
 
@@ -81,10 +81,9 @@ int rat_sol(IVector& numx, Int& denx, FVector& xs_int, FVector& xs_frac, IVector
 	// xs_int: integer part of scaled x.
 	// xs_frac: fractional part of scaled x.
 	// x * 2^shift = xs_int + xs_frac.
-	FVector nextx(n), quo(n);
+	FVector nextx(field(),n), quo(field(),n);
 
 	integer denx_i;
-	typename Field::Element one; _field.init(one, 1);
 
 	//  need to save original r for zw_shift calculation
 	//  TODO: I took out the ZWSHIFT, still need last r??
@@ -111,9 +110,9 @@ int rat_sol(IVector& numx, Int& denx, FVector& xs_int, FVector& xs_frac, IVector
 		for(size_t i=0; i<n; i++){
 			// TODO - analyze logic here
 			//  quo[i] = xs_frac[i] / nextx[i] - 1;
-			//_field.div(quo[i], xs_frac[i], nextx[i]);
-			//_field.subin(quo[i], one);
-			_field.sub(quo[i], xs_frac[i], nextx[i]);
+			//field().div(quo[i], xs_frac[i], nextx[i]);
+			//field().subin(quo[i], field().one);
+			field().sub(quo[i], xs_frac[i], nextx[i]);
 		}
 
 		double q = zw_dmax((int)n, &*quo.begin(), 1);
@@ -251,7 +250,7 @@ inline void update_xs(FVector& xs_int, FVector& xs_frac, FVector& x)
 {
 	Float scalar, tmp;
 	int64_t shifted = ((int64_t)1 << shift);
-	_field.init(scalar, (double) shifted);
+	field().init(scalar, (double) shifted);
 
 	//  make xs_int and xs_frac such that x*scalar = xs_int + xs_frac.
 	for(size_t i = 0; i < xs_int.size(); ++i){
@@ -269,8 +268,8 @@ inline void update_r(FVector& r, FVector& xs_int)
 	Float scalar;
 	size_t n = r.size();
 	int64_t shifted = ((int64_t)1 << shift);
-	_field.init(scalar, (double)shifted);
-	FVector y(n);
+	field().init(scalar, (double)shifted);
+	FVector y(field(),n);
 
 	//update r = r * 2^shift - Mat*xs_int
 	_VDF.mulin(r, scalar);
@@ -284,7 +283,7 @@ template <class IMatrix>
 inline void update_r_exact(IVector& r_exact, FVector& r, FVector& xs_int, IMatrix &IM){
 	size_t n = r.size();
 
-	IVector x_i(n), y_i(n);
+	IVector x_i(_ring,n), y_i(_ring,n);
 
 	typename Ring::Element scalar = ((int64_t)1 << shift);
 
@@ -297,14 +296,14 @@ inline void update_r_exact(IVector& r_exact, FVector& r, FVector& xs_int, IMatri
 
 	int64_t th = ((int64_t)1 << 52);  // double mantissa
 	Float thresh;
-	_field.init(thresh, (double)th);
+	field().init(thresh, (double)th);
 
 	debugneol("vnorm " << vnorm);
 
 	//  r -= Mat * xs_int
-	if(_field.mulin(vnorm, mnorm) < thresh){
+	if(field().mulin(vnorm, mnorm) < thresh){
 		debugneol("Numeric ");
-		FVector y(n);
+		FVector y(field(),n);
 		_numsolver.apply(y, xs_int);
 		for(size_t i = 0; i < n; ++i)
 			_ring.init(y_i[i], y[i]);
@@ -323,12 +322,12 @@ inline void update_r_exact(IVector& r_exact, FVector& r, FVector& xs_int, IMatri
 	typename FVector::iterator rp = r.begin();
 	typename IVector::iterator rep = r_exact.begin();
 	for(; rp!= r.end(); ++rp, ++rep)
-		_field.init(*rp, *rep);
+		field().init(*rp, *rep);
 
 	return;
 } // update_r_exact
 
-// no longer called...
+#if 0 /* no longer called...*/
 inline int HadamardBound(integer& B, FMatrix& DM)
 {
 	size_t n = DM.rowdim();
@@ -336,25 +335,27 @@ inline int HadamardBound(integer& B, FMatrix& DM)
 	B = B * B;
 	double mnorm_loc = zw_dOOnorm(&*DM.Begin(), n, n);
 
+	//! @bug this is not good.
 	// [don't know what this comment is about] should be a check for 2 * mnorm + zw_dmax (n, b, 1);
 	// TODO what is "b"? from copied code it is the RHS array of doubles
 	// zw_max just seems to get abs(max value of b)
 	// next line false, just to compile
-	double *b;
+	double *b = NULL;
 	B *= 2 * mnorm_loc + zw_dmax (n, b, 1); // [don't know what this factor is about]
 	B <<= 1; // [extra factor of 2 for some reason... ]
 	return B;
 }
+#endif
 
 //update num, *num <- *num * 2^shift + d
 inline IVector& update_num (IVector& num, const FVector& d)
 {
 	size_t n = d.size();
-	IVector d_i(n);
+	IVector d_i(_ring,n);
 	for (size_t i = 0; i < n; ++i) {
 		_ring.init(d_i[i], d[i]);
 	}
-	Int scalar; _ring.init(scalar, 1UL << shift);
+	Int scalar; _ring.init(scalar, uint64_t(1 << shift));
 	//  TODO - analyze GMP shifting capability
 	_VDR.mulin(num, scalar);
 	_VDR.addin(num, d_i);
@@ -364,12 +365,12 @@ inline IVector& update_num (IVector& num, const FVector& d)
 //update r = r * shift - M d
 inline static int update_r_ll (double* r, int n, const double* M, const double* d, int shift)
 {
-	long long int tmp;
+	// long long int tmp;
 	double* p1;
 	const double* p2;
 	const double* pd;
 	for (p1 = r, p2 = M; p1 != r + n; ++ p1) {
-		tmp = (long long int) *p1;
+		long long int tmp = (long long int) *p1;
 		tmp <<= shift;
 		for (pd = d; pd != d + n; ++ pd, ++ p2) {
 			tmp -= (long long int)*pd * (long long int) *p2;
@@ -400,10 +401,10 @@ inline static double highAbs(FMatrix M)
 inline static double zw_dOOnorm(const double* M, int m, int n)
 {
 	double norm = 0;
-	double old = 0;
+	// double old = 0;
 	const double* p;
 	for (p = M; p != M + (m * n); ) {
-		old = norm;
+		double old = norm;
 		norm = cblas_dasum (n, p ,1);
 		if (norm < old) norm = old;
 		p += n;
@@ -418,12 +419,12 @@ inline static double zw_dmax (const int N, const double* a, const int inc)
 
 inline static int zw_hbound (integer& b, int m, int n, const double* M)
 {
-	double norm = 0;
+	// double norm = 0;
 	const  double* p;
 	integer tmp;
 	b = 1;
 	for (p = M; p != M + (m * n); ) {
-		norm = cblas_dnrm2 (n, p ,1);
+		double norm = cblas_dnrm2 (n, p ,1);
 		tmp =  norm;
 		integer::mulin (b, tmp);
 		p += n;
@@ -490,11 +491,10 @@ void dumpData(const Matrix &M, const IVector &b, IVector &numx, integer &denx, i
 #endif
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/rational-solver.h b/linbox/algorithms/rational-solver.h
index 1607804..f4df415 100644
--- a/linbox/algorithms/rational-solver.h
+++ b/linbox/algorithms/rational-solver.h
@@ -40,9 +40,9 @@
 // #include "linbox/field/multimod-field.h"
 #include "linbox/solutions/methods.h"
 #include "linbox/blackbox/archetype.h"
+#include "linbox/matrix/dense-matrix.h"
 #include "linbox/blackbox/lambda-sparse.h"
 #include "linbox/blackbox/compose.h"
-#include "linbox/matrix/blas-matrix.h"
 #include "linbox/algorithms/vector-fraction.h"
 #include "linbox/util/timer.h"
 
@@ -272,6 +272,7 @@ namespace LinBox
 			_ring(r), _genprime(rp), _traits(traits)
 		{
 
+			_genprime.template setBitsField<Field>();
 			++_genprime; _prime=*_genprime;
 #ifdef RSTIMING
 			clearTimers();
@@ -386,7 +387,10 @@ namespace LinBox
 		}
 #endif
 
-		void chooseNewPrime() const { ++_genprime; _prime = *_genprime; }
+		void chooseNewPrime() const {
+			_genprime.template setBitsField<Field>();
+			++_genprime; _prime = *_genprime;
+		}
 
 	}; // end of specialization for the class RationalSover with Wiedemann traits
 
@@ -476,6 +480,7 @@ namespace LinBox
 			_ring(r), _genprime(rp), _traits(traits)
 		{
 
+			_genprime.template setBitsField<Field>();
 			++_genprime; _prime=*_genprime;
 #ifdef RSTIMING
 			clearTimers();
@@ -668,6 +673,7 @@ namespace LinBox
 				const RandomPrime& rp = RandomPrime(DEFAULT_PRIMESIZE)) :
 			lastCertificate(r, 0), _genprime(rp), _ring(r)
 		{
+			_genprime.template setBitsField<Field>();
 			++_genprime; _prime=*_genprime;
 #ifdef RSTIMING
 			clearTimers();
@@ -812,6 +818,7 @@ namespace LinBox
 
 		void chooseNewPrime() const
 		{
+			_genprime.template setBitsField<Field>();
 			++_genprime;
 			_prime = *_genprime;
 		}
@@ -904,7 +911,7 @@ namespace LinBox
 		Keep it just for interface consistency.
 	 */
 	template <class Ring, class Field, class RandomPrime>
-	class RationalSolver<Ring, Field, RandomPrime, NumericalTraits>;
+	class RationalSolver<Ring, Field, RandomPrime, NumSymOverlapTraits>;
 
 	/** \brief solver using a hybrid Numeric/Symbolic computation.
 	 *
@@ -920,7 +927,7 @@ namespace LinBox
 	//template argument Field and RandomPrime are not used.
 	//Keep it just for interface consistency.
 	template <class Ring, class Field, class RandomPrime>
-	class RationalSolver<Ring, Field, RandomPrime, WanTraits> ;
+	class RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits> ;
 
 	/*--------------*/
 	/* BLOCK HANKEL */
@@ -953,6 +960,7 @@ namespace LinBox
 				const RandomPrime& rp = RandomPrime(DEFAULT_PRIMESIZE)) :
 			_genprime(rp), _ring(r)
 		{
+			_genprime.template setBitsField<Field>();
 			_prime=_genprime.randomPrime();
 		}
 
@@ -1008,6 +1016,7 @@ namespace LinBox
 				const RandomPrime& rp = RandomPrime(DEFAULT_PRIMESIZE)) :
 			_genprime(rp), _ring(r)
 		{
+			_genprime.template setBitsField<Field>();
 			_prime=_genprime.randomPrime();
 		}
 
@@ -1039,11 +1048,10 @@ namespace LinBox
 
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/rational-solver.inl b/linbox/algorithms/rational-solver.inl
index 08fdf34..7e92d61 100644
--- a/linbox/algorithms/rational-solver.inl
+++ b/linbox/algorithms/rational-solver.inl
@@ -29,7 +29,7 @@
 #include "linbox/util/debug.h"
 #include "linbox/linbox-config.h"
 
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/blackbox/lambda-sparse.h"
 #include "linbox/blackbox/transpose.h"
 #include "linbox/blackbox/diagonal.h"
@@ -49,12 +49,12 @@
 #include "linbox/solutions/methods.h"
 #include "linbox/blackbox/block-hankel-inverse.h"
 
-
+#include "linbox/vector/blas-vector.h"
 
 // #ifdef __LINBOX_BLAS_AVAILABLE
 #include "linbox/config-blas.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
 #include "linbox/matrix/factorized-matrix.h"
 #include "linbox/util/timer.h"
 // #endif
@@ -76,7 +76,7 @@ namespace LinBox
 	}
 
 	template<>
-	inline bool checkBlasPrime(const std::vector<integer> p)
+	inline bool checkBlasPrime(const BlasVector<Givaro::ZRing<Integer> > p)
 	{
 		bool tmp=true;
 		for (size_t i=0;i<p.size();++i)
@@ -113,7 +113,8 @@ namespace LinBox
 			break;
 
 		case SS_SINGULAR:
-			std::cerr<<"switching to singular\n";
+			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR) << "switching to singular" << std::endl;
+			//std::cerr<<"switching to singular\n";
 			status=solveSingular(num, den,A,b);
 			break;
 
@@ -185,23 +186,7 @@ namespace LinBox
 			return SS_SINGULAR;
 		}
 		else {
-#if 0
-			std::cerr<<"A:\n";
-			A.write(std::cerr);
-			std::cerr<<"A mod p:\n";
-			Ap->write(std::cerr);
-			Ring r;
-			VectorDomain<Ring> VD(r);
-			std::cerr<<"b:\n";
-			VD.write(std::cerr,b)<<std::endl;
-			std::cerr<<"prime: "<<_prime<<std::endl;
-
-			std::cerr<<"non singular\n";
-
-			CSRSparseMatrix<Field> csr_Ap(*F,*Ap);
 
-			typedef CSRSparseMatrix<Field> FMatrix;
-#endif
 			typedef SparseMatrix<Field> FMatrix;
 
 			typedef WiedemannLiftingContainer<Ring, Field, IMatrix, FMatrix, FPolynomial> LiftingContainer;
@@ -229,8 +214,7 @@ namespace LinBox
 	{
 		std::cerr<<"in singular solver\n";
 
-		typedef std::vector<typename Field::Element> FVector;
-		typedef std::vector<typename Ring::Element>  IVector;
+		typedef BlasVector<Ring>  IVector;
 		typedef SparseMatrix<Field>                  FMatrix;
 
 		// checking size of system
@@ -280,7 +264,7 @@ namespace LinBox
 		}
 		while(((F->isZero(tmp) || MinPoly.size() <=2) && --badprecondition ));
 		std::cerr<<"minpoly found with size: "<<MinPoly.size()<<std::endl;
-		for (size_t i=0;i<MinPoly.size();i++)
+		for (size_t i=0;i<MinPoly.size();++i)
 			std::cerr<<MinPoly[i]<<"*x^"<<i<<"+";
 		std::cerr<<std::endl;
 
@@ -314,7 +298,7 @@ namespace LinBox
 
 #if 0
 				   typename Ring::Element lden;
-				   _ring. init (lden, 1);
+				   _ring. assign (lden, _ring.one);
 				   typename Vector1::iterator p;
 				   for (p = answer.begin(); p != answer.end(); ++ p)
 				   _ring. lcm (lden, lden, p->second);
@@ -498,7 +482,8 @@ namespace LinBox
 			break;
 
 		case SS_SINGULAR:
-			std::cerr<<"switching to singular\n";
+			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR) << "could switch to singular but not doing it(?)" << std::endl;
+			//std::cerr<<"switching to singular\n";
 			//status=solveSingular(num, den,A,b);
 			break;
 
@@ -517,10 +502,10 @@ namespace LinBox
 	template <class IMatrix, class Vector1, class Vector2>
 	SolverReturnStatus
 	RationalSolver<Ring,Field,RandomPrime,BlockWiedemannTraits>::solveNonsingular (Vector1& num,
-												      Integer& den,
-												      const IMatrix& A,
-												      const Vector2& b,
-												      int maxPrimes) const
+										       Integer& den,
+										       const IMatrix& A,
+										       const Vector2& b,
+										       int maxPrimes) const
 	{
 		// checking if matrix is square
 		linbox_check(A.rowdim() == A.coldim());
@@ -536,7 +521,8 @@ namespace LinBox
 		m = n = sqrt(tmp);
 		m = n = root(tmp,3); // wrong # args to root. -bds
 #endif
-		m = n = root(tmproot, tmp,3);
+		// m = n =
+		root(tmproot, tmp,3);
 		m = n = tmproot;
 		// 		std::cout<<"block factor= "<<m<<"\n";;
 		typedef SparseMatrix<Field> FMatrix;
@@ -608,7 +594,7 @@ namespace LinBox
 					break;
 
 				case SS_FAILED:
-					std::cout <<"nonsingular failed\n";
+					//std::cout <<"nonsingular failed\n";  // BDS: in what sense is this part of the spec of solve?
 					break;
 
 				default:
@@ -626,11 +612,11 @@ namespace LinBox
 	template <class IMatrix, class Vector1, class Vector2>
 	SolverReturnStatus
 	RationalSolver<Ring,Field,RandomPrime,DixonTraits>::solveNonsingular(Vector1& num,
-												     Integer& den,
-												     const IMatrix& A,
-												     const Vector2& b,
-												     bool oldMatrix,
-												     int maxPrimes) const
+									     Integer& den,
+									     const IMatrix& A,
+									     const Vector2& b,
+									     bool oldMatrix,
+									     int maxPrimes) const
 	{
 
 		// std::cout<<"DIXON\n\n\n\n";
@@ -650,7 +636,7 @@ namespace LinBox
 #if 0
 			if (trials == maxPrimes) return SS_SINGULAR;
 			if (trials != 0) chooseNewPrime();
-			trials++;
+			++trials;
 #endif
 #ifdef DEBUG_DIXON
 			//std::cout << "_prime: "<<_prime<<"\n";
@@ -676,7 +662,7 @@ namespace LinBox
 			if (!oldMatrix) {
 				if (trials == maxPrimes) return SS_SINGULAR;
 				if (trials != 0) chooseNewPrime();
-				trials++;
+				++trials;
 
 				// Could delete a non allocated matrix -> segfault
 				if (FMP != NULL) delete FMP;
@@ -689,7 +675,7 @@ namespace LinBox
 
 				FMP = new BlasMatrix<Field>(*F, A.rowdim(),A.coldim());
 
-				MatrixHom::map (*FMP, A, *F); // use MatrixHom to reduce matrix PG 2005-06-16
+				MatrixHom::map (*FMP, A ); // use MatrixHom to reduce matrix PG 2005-06-16
 #if 0
 				typename BlasMatrix<Field>::Iterator iter_p  = FMP->Begin();
 				typename IMatrix::ConstIterator iter  = A.Begin();
@@ -717,8 +703,10 @@ namespace LinBox
 					ttNonsingularSetup += tNonsingularSetup;
 					tNonsingularInv.start();
 #endif
+					assert(FMP != NULL);
 					BMDF.invin(*invA, *FMP, notfr); //notfr <- nullity
-					if (FMP != NULL) delete FMP;
+					// if (FMP != NULL)  // useless
+					delete FMP;
 					FMP = invA;
 #if 0
 					std::cout << "notfr = " << notfr << std::endl;
@@ -818,7 +806,7 @@ namespace LinBox
 		int trials = 0;
 		while (trials < maxPrimes){
 			if (trials != 0) chooseNewPrime();
-			trials++;
+			++trials;
 #ifdef DEBUG_DIXON
 			std::cout << "_prime: "<<_prime<<"\n";
 #endif
@@ -827,7 +815,7 @@ namespace LinBox
 #endif
 
 			// typedef typename Field::Element Element;
-			typedef typename Ring::Element  Integer_t;
+			// typedef typename Ring::Element  Integer_t;
 			typedef DixonLiftingContainer<Ring, Field,
 				BlasMatrix<Ring>, BlasMatrix<Field> > LiftingContainer;
 
@@ -835,10 +823,6 @@ namespace LinBox
 			linbox_check(A.rowdim() == b.size());
 
 			LinBox::integer tmp;
-			Integer_t _rone,_rzero;
-			_ring.init(_rone,1);
-			_ring.init(_rzero,0);
-
 			Field F (_prime);
 			BlasMatrixDomain<Ring>  BMDI(_ring);
 			BlasMatrixDomain<Field> BMDF(F);
@@ -853,18 +837,15 @@ namespace LinBox
 			// such that
 			// - TAS_P . (A|b) . TAS_Q   has nonzero principal minors up to TAS_rank
 			// - TAS_Q permutes b to the (TAS_rank)th column of A iff the system is inconsistent mod p
-
 			BlasMatrix<Field>* TAS_factors = new BlasMatrix<Field>(F, A.coldim()+1, A.rowdim());
 			Hom<Ring, Field> Hmap(_ring, F);
 
 			BlasMatrix<Field> Ap(F, A.rowdim(), A.coldim());
-			MatrixHom::map(Ap, A, F);
-
+			MatrixHom::map(Ap, A);
 			for (size_t i=0;i<A.rowdim();++i)
 				for (size_t j=0;j<A.coldim();++j)
 					TAS_factors->setEntry(j,i, Ap.getEntry(i,j));
 
-
 			for (size_t i=0;i<A.rowdim();++i){
 				typename Field::Element tmpe;
 				F.init(tmpe);
@@ -887,8 +868,8 @@ namespace LinBox
 			// BlasPermutation<size_t>  TAS_Qt = TAS_LQUP->getQ();
 			std::vector<size_t> srcRow(A.rowdim()), srcCol(A.coldim()+1);
 			std::vector<size_t>::iterator sri = srcRow.begin(), sci = srcCol.begin();
-			for (size_t i=0; i<A.rowdim(); i++, sri++) *sri = i;
-			for (size_t i=0; i<A.coldim()+1; i++, sci++) *sci = i;
+			for (size_t i=0; i<A.rowdim(); ++i, ++sri) *sri = i;
+			for (size_t i=0; i<A.coldim()+1; ++i, ++sci) *sci = i;
 			indexDomain iDom;
 			BlasMatrixDomain<indexDomain> BMDs(iDom);
 			BMDs.mulin_right(TAS_Qt, srcCol);
@@ -896,9 +877,9 @@ namespace LinBox
 
 #ifdef DEBUG_INC
 			std::cout << "P takes (0 1 ...) to (";
-			for (size_t i=0; i<A.rowdim(); i++) std::cout << srcRow[i] << ' '; std::cout << ')' << std::endl;
+			for (size_t i=0; i<A.rowdim(); ++i) std::cout << srcRow[i] << ' '; std::cout << ')' << std::endl;
 			std::cout << "Q takes (0 1 ...) to (";
-			for (size_t i=0; i<A.coldim()+1; i++) std::cout << srcCol[i] << ' '; std::cout << ')' << std::endl;
+			for (size_t i=0; i<A.coldim()+1; ++i) std::cout << srcCol[i] << ' '; std::cout << ')' << std::endl;
 #endif
 
 			bool appearsInconsistent = (srcCol[TAS_rank-1] == A.coldim());
@@ -921,29 +902,29 @@ namespace LinBox
 						aEmpty &= _ring.isZero(*iter);
 				}
 				if (aEmpty) {
-					for (size_t i=0; i<b.size(); i++)
-						if (!_ring.areEqual(b[i], _rzero)) {
+					for (size_t i=0; i<b.size(); ++i)
+						if (!_ring.areEqual(b[i], _ring.zero)) {
 							if (level >= SL_CERTIFIED) {
 								lastCertificate.clearAndResize(b.size());
-								_ring.assign(lastCertificate.numer[i], _rone);
+								_ring.assign(lastCertificate.numer[i], _ring.one);
 							}
 							return SS_INCONSISTENT;
 						}
 #if 0
 					// both A and b are all zero.
-					for (size_t i=0; i<answer.size(); i++) {
-						answer[i].first = _rzero;
-						answer[i].second = _rone;
+					for (size_t i=0; i<answer.size(); ++i) {
+						answer[i].first = _ring.zero;
+						answer[i].second = _ring.one;
 					}
 #endif
-					_ring. assign (den, _rone);
+					_ring. assign (den, _ring.one);
 					for (typename Vector1::iterator p = num. begin(); p != num. end(); ++ p)
-						_ring. assign (*p, _rzero);
+						_ring. assign (*p, _ring.zero);
 
 					if (level >= SL_LASVEGAS)
-						_ring.init(lastCertifiedDenFactor, 1);
+						_ring.assign(lastCertifiedDenFactor, _ring.one);
 					if (level == SL_CERTIFIED) {
-						_ring.init(lastZBNumer, 0);
+						_ring.assign(lastZBNumer, _ring.zero);
 						lastCertificate.clearAndResize(b.size());
 					}
 					return SS_OK;
@@ -963,7 +944,7 @@ namespace LinBox
 				Atp_minor_inv = new BlasMatrix<Field>(F, rank, rank);
 
 
-				FFPACK::LQUPtoInverseOfFullRankMinor((typename Field::Father_t)F, rank, TAS_factors->getPointer(), A.rowdim(),
+				FFPACK::LQUPtoInverseOfFullRankMinor(F, rank, TAS_factors->getPointer(), A.rowdim(),
 								     TAS_Qt.getPointer(),
 								     Atp_minor_inv->getPointer(), rank);
 #ifdef RSTIMING
@@ -982,18 +963,19 @@ namespace LinBox
 #ifdef RSTIMING
 				tCheckConsistency.start();
 #endif
-				std::vector<Integer> zt(rank);
-				for (size_t i=0; i<rank; i++)
+				Givaro::ZRing<Integer> Z;
+				BlasVector<Givaro::ZRing<Integer> > zt(Z,rank);
+				for (size_t i=0; i<rank; ++i)
 					_ring.assign(zt[i], A.getEntry(srcRow[rank], srcCol[i]));
 
 				BlasMatrix<Ring> At_minor(_ring, rank, rank);
-				for (size_t i=0; i<rank; i++)
-					for (size_t j=0; j<rank; j++)
+				for (size_t i=0; i<rank; ++i)
+					for (size_t j=0; j<rank; ++j)
 						_ring.assign(At_minor.refEntry(j, i), A.getEntry(srcRow[i], srcCol[j]));
 #ifdef DEBUG_INC
 				At_minor.write(std::cout << "At_minor:" << std::endl);//, _ring);
 				Atp_minor_inv->write(std::cout << "Atp_minor_inv:" << std::endl);//, F);
-				std::cout << "zt: "; for (size_t i=0; i<rank; i++) std::cout << zt[i] <<' '; std::cout << std::endl;
+				std::cout << "zt: "; for (size_t i=0; i<rank; ++i) std::cout << zt[i] <<' '; std::cout << std::endl;
 #endif
 #ifdef RSTIMING
 				tCheckConsistency.stop();
@@ -1004,7 +986,8 @@ namespace LinBox
 
 				RationalReconstruction<LiftingContainer > re(lc);
 
-				Vector1 short_num(rank); Integer short_den;
+				Vector1 short_num(A.field(),rank);
+				Integer short_den;
 
 				if (!re.getRational(short_num, short_den,0))
 					return SS_FAILED;    // dirty, but should not be called
@@ -1018,17 +1001,17 @@ namespace LinBox
 				cert. denom = short_den;
 				cert.numer.resize(b.size());
 				_ring.subin(cert.numer[rank], cert.denom);
-				_ring.init(cert.denom, 1);
+				_ring.assign(cert.denom, _ring.one);
 				BMDI.mulin_left(cert.numer, TAS_P);
 #ifdef DEBUG_INC
 				cert.write(std::cout << "cert:") << std::endl;
 #endif
 
 				bool certifies = true; //check certificate
-				std::vector<Integer> certnumer_A(A.coldim());
+				BlasVector<Ring> certnumer_A(_ring,A.coldim());
 				BAR.applyVTrans(certnumer_A, A_check, cert.numer);
-				typename std::vector<Integer>::iterator cai = certnumer_A.begin();
-				for (size_t i=0; certifies && i<A.coldim(); i++, cai++)
+				typename BlasVector<Ring>::iterator cai = certnumer_A.begin();
+				for (size_t i=0; certifies && i<A.coldim(); ++i, ++cai)
 					certifies &= _ring.isZero(*cai);
 #ifdef RSTIMING
 				tCheckConsistency.stop();
@@ -1038,7 +1021,7 @@ namespace LinBox
 					if (level == SL_CERTIFIED) lastCertificate.copy(cert);
 					return SS_INCONSISTENT;
 				}
-				std::cout<<"system is suspected to be inconsistent but it was only a bad prime\n";
+				commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT) << "system is suspected to be inconsistent but it was only a bad prime" << std::endl;
 				continue; // try new prime. analogous to u.A12 != A22 in Muld.+Storj.
 			}
 
@@ -1054,16 +1037,16 @@ namespace LinBox
 				// use shortcut - transpose Atp_minor_inv to get Ap_minor_inv
 				Element _rtmp;
 				Ap_minor_inv = Atp_minor_inv;
-				for (size_t i=0; i<rank; i++)
-					for (size_t j=0; j<i; j++) {
+				for (size_t i=0; i<rank; ++i)
+					for (size_t j=0; j<i; ++j) {
 						Ap_minor_inv->getEntry(_rtmp, i, j);
 						Ap_minor_inv->setEntry(i, j, Ap_minor_inv->refEntry(j, i));
 						Ap_minor_inv->setEntry(j, i, _rtmp);
 					}
 
 				// permute original entries into A_minor
-				for (size_t i=0; i<rank; i++)
-					for (size_t j=0; j<rank; j++)
+				for (size_t i=0; i<rank; ++i)
+					for (size_t j=0; j<rank; ++j)
 						_ring.assign(A_minor.refEntry(i, j), A_check.getEntry(srcRow[i], srcCol[j]));
 #ifdef RSTIMING
 				tMakeConditioner.stop();
@@ -1072,8 +1055,8 @@ namespace LinBox
 
 				if (makeMinDenomCert && level >= SL_LASVEGAS){
 					B = new BlasMatrix<Ring>(_ring, rank, A.coldim());
-					for (size_t i=0; i<rank; i++)
-						for (size_t j=0; j<A.coldim(); j++)
+					for (size_t i=0; i<rank; ++i)
+						for (size_t j=0; j<A.coldim(); ++j)
 							_ring.assign(B->refEntry(i, j), A_check.getEntry(srcRow[i],j));
 				}
 			}
@@ -1086,8 +1069,8 @@ namespace LinBox
 
 				LinBox::integer tmp2=0;
 				size_t maxBitSize = 0;
-				for (size_t i=0; i<rank; i++)
-					for (size_t j=0; j<A.coldim(); j++){
+				for (size_t i=0; i<rank; ++i)
+					for (size_t j=0; j<A.coldim(); ++j){
 						_ring.assign(B->refEntry(i, j), A_check.getEntry(srcRow[i], j));
 						_ring.convert(tmp2, A_check.getEntry(srcRow[i], j));
 						maxBitSize = std::max(maxBitSize, tmp2.bitsize());
@@ -1110,9 +1093,9 @@ namespace LinBox
 					typename BlasMatrix<Ring>::Iterator iter;
 					for (iter = P->Begin(); iter != P->End(); ++iter) {
 						if (rand() > RAND_MAX/2)
-							_ring.assign(*iter, _rone);
+							_ring.assign(*iter, _ring.one);
 						else
-							_ring.assign(*iter, _rzero);
+							_ring.assign(*iter, _ring.zero);
 					}
 
 					// compute A_minor = B.P
@@ -1124,7 +1107,7 @@ namespace LinBox
 						double *P_dbl= new double[A.coldim()*rank];
 						double *A_minor_dbl = new double[rank*rank];
 						for (size_t i=0;i<rank;++i)
-							for (size_t j=0;j<A.coldim(); j++){
+							for (size_t j=0;j<A.coldim(); ++j){
 								_ring.convert(B_dbl[j+i*A.coldim()], B->getEntry(i,j));
 								_ring.convert(P_dbl[i+j*rank], P->getEntry(j,i));
 							}
@@ -1157,7 +1140,7 @@ namespace LinBox
 					ttMakeConditioner += tMakeConditioner;
 					tInvertBP.start();
 #endif
-					BMDF.inv(*Ap_minor_inv, Ap_minor, nullity);
+					BMDF.inv((BlasMatrix<Field>&)*Ap_minor_inv, (BlasMatrix<Field>&)Ap_minor, nullity);
 #ifdef RSTIMING
 					tInvertBP.stop();
 					ttInvertBP += tInvertBP;
@@ -1165,7 +1148,7 @@ namespace LinBox
 				} while (nullity > 0);
 			}
 			// Compute newb = (TAS_P.b)[0..(rank-1)]
-			std::vector<Integer> newb(b);
+			BlasVector<Ring> newb(b);
 			BMDI.mulin_right(TAS_P, newb);
 			newb.resize(rank);
 
@@ -1183,7 +1166,7 @@ namespace LinBox
 #endif
 			RationalReconstruction<LiftingContainer > re(lc);
 
-			Vector1 short_num(rank); Integer short_den;
+			Vector1 short_num(_ring,rank); Integer short_den;
 
 			if (!re.getRational(short_num, short_den,0))
 				return SS_FAILED;    // dirty, but should not be called
@@ -1198,13 +1181,13 @@ namespace LinBox
 
 			if (!randomSolution) {
 				// short_answer = TAS_Q * short_answer
-				answer_to_vf.numer.resize(A.coldim()+1,_rzero);
+				answer_to_vf.numer.resize(A.coldim()+1,_ring.zero);
 				BMDI.mulin_left(answer_to_vf.numer, TAS_Qt);
 				answer_to_vf.numer.resize(A.coldim());
 			}
 			else {
 				// short_answer = P * short_answer
-				typename Vector<Ring>::Dense newNumer(A.coldim());
+				BlasVector<Ring> newNumer(_ring,A.coldim());
 				BAR.applyV(newNumer, *P, answer_to_vf.numer);
 				//BAR.applyVspecial(newNumer, *P, answer_to_vf.numer);
 
@@ -1213,18 +1196,18 @@ namespace LinBox
 
 			if (level >= SL_LASVEGAS) { //check consistency
 
-				std::vector<Integer> A_times_xnumer(b.size());
+				BlasVector<Ring> A_times_xnumer(_ring,b.size());
 
 				BAR.applyV(A_times_xnumer, A_check, answer_to_vf.numer);
 
 				Integer tmpi;
 
 				typename Vector2::const_iterator ib = b.begin();
-				typename std::vector<Integer>::iterator iAx = A_times_xnumer.begin();
+				typename BlasVector<Ring>::iterator iAx = A_times_xnumer.begin();
 				int thisrow = 0;
 				bool needNewPrime = false;
 
-				for (; !needNewPrime && ib != b.end(); iAx++, ib++, thisrow++)
+				for (; !needNewPrime && ib != b.end(); ++iAx, ++ib, ++thisrow)
 					if (!_ring.areEqual(_ring.mul(tmpi, *ib, answer_to_vf.denom), *iAx)) {
 						// should attempt to certify inconsistency now
 						// as in "if [A31 | A32]y != b3" of step (4)
@@ -1258,15 +1241,15 @@ namespace LinBox
 #endif
 				Integer _rtmp;
 				Element _ftmp;
-				for (size_t i=0; i<rank; i++)
-					for (size_t j=0; j<i; j++) {
+				for (size_t i=0; i<rank; ++i)
+					for (size_t j=0; j<i; ++j) {
 						Ap_minor_inv->getEntry(_ftmp, i, j);
 						Ap_minor_inv->setEntry(i, j, Ap_minor_inv->refEntry(j, i));
 						Ap_minor_inv->setEntry(j, i, _ftmp);
 					}
 
-				for (size_t i=0; i<rank; i++)
-					for (size_t j=0; j<i; j++) {
+				for (size_t i=0; i<rank; ++i)
+					for (size_t j=0; j<i; ++j) {
 						A_minor.getEntry(_rtmp, i, j);
 						A_minor.setEntry(i, j, A_minor.refEntry(j, i));
 						A_minor.setEntry(j, i, _rtmp);
@@ -1289,19 +1272,20 @@ namespace LinBox
 				// so it corresponds to b instead of newb
 
 				//q in {0, 1}^rank
-				std::vector<Integer> q(rank);
-				typename std::vector<Integer>::iterator q_iter;
+				Givaro::ZRing<Integer> Z;
+				BlasVector<Givaro::ZRing<Integer> > q(Z,rank);
+				typename BlasVector<Givaro::ZRing<Integer> >::iterator q_iter;
 
 				bool allzero;
 				do {
 					allzero = true;
 					for (q_iter = q.begin(); q_iter != q.end(); ++q_iter) {
 						if (rand() > RAND_MAX/2) {
-							(*q_iter) = _rone;
+							_ring.assign((*q_iter), _ring.one);
 							allzero = false;
 						}
 						else
-							(*q_iter) = _rzero;
+							(*q_iter) = _ring.zero;
 					}
 				} while (allzero);
 #ifdef RSTIMING
@@ -1312,7 +1296,7 @@ namespace LinBox
 				LiftingContainer lc2(_ring, F, A_minor, *Ap_minor_inv, q, _prime);
 
 				RationalReconstruction<LiftingContainer> rere(lc2);
-				Vector1 u_num(rank); Integer u_den;
+				Vector1 u_num(_ring,rank); Integer u_den;
 				if (!rere.getRational(u_num, u_den,0)) return SS_FAILED;
 
 #ifdef RSTIMING
@@ -1323,18 +1307,18 @@ namespace LinBox
 				VectorFraction<Ring> u_to_vf(_ring, u_num.size());
 				u_to_vf. numer = u_num;
 				u_to_vf. denom = u_den;
-				std::vector<Integer> uB(A.coldim());
+				BlasVector<Ring> uB(_ring,A.coldim());
 				BAR.applyVTrans(uB, *B, u_to_vf.numer);
 
 #if 0
 				std::cout << "BP: ";
 				A_minor.write(std::cout, _ring) << std::endl;
 				std::cout << "q: ";
-				for (size_t i=0; i<rank; i++) std::cout << q[i]; std::cout << std::endl;
+				for (size_t i=0; i<rank; ++i) std::cout << q[i]; std::cout << std::endl;
 				u_to_vf.write(std::cout  << "u: ") << std::endl;
 #endif
 
-				Integer numergcd = _rzero;
+				Integer numergcd = _ring.zero;
 				vectorGcdIn(numergcd, _ring, uB);
 
 				// denom(partial_cert . Mr) = partial_cert_to_vf.denom / numergcd
@@ -1386,29 +1370,25 @@ namespace LinBox
 	template <class IMatrix, class Vector1, class Vector2>
 	SolverReturnStatus
 	RationalSolver<Ring,Field,RandomPrime,BlockHankelTraits>::solveNonsingular(Vector1& num,
-												     Integer& den,
-												     const IMatrix& A,
-												     const Vector2& b,
-												     size_t blocksize,
-												     int maxPrimes) const
+										   Integer& den,
+										   const IMatrix& A,
+										   const Vector2& b,
+										   size_t blocksize,
+										   int maxPrimes) const
 	{
 
 		linbox_check(A.rowdim() == A.coldim());
 		linbox_check(A.rowdim() % blocksize == 0);
 
-		typedef typename Field::Element Element_t;
-
-
 
 		// reduce the matrix mod p
 		Field F(_prime);
 		typedef typename IMatrix::template rebind<Field>::other FMatrix;
-		FMatrix Ap(F, A.rowdim(), A.coldim());
-		typename IMatrix::template rebind<Field>()( Ap, A, F);
+		FMatrix Ap(A, F);
 
 		// precondition Ap  with a random diagonal Matrix
 		typename Field::RandIter G(F,0,123456);
-		std::vector<Element_t> diag(Ap.rowdim());
+		BlasVector<Field> diag(F,Ap.rowdim());
 
 		for(size_t i=0;i<Ap.rowdim();++i){
 			do {
@@ -1418,7 +1398,7 @@ namespace LinBox
 
 
 
-		Diagonal<Field> D(F, diag);
+		Diagonal<Field> D(diag);
 
 		Compose<Diagonal<Field>, FMatrix> DAp(D,Ap);
 
@@ -1453,7 +1433,7 @@ namespace LinBox
 
 		// compute the inverse of the Hankel matrix associated with the Krylov Sequence
 		BlockHankelInverse<Field> Hinv(F, Seq.getRep());
-		std::vector<Element_t> y(n), x(n, 1);
+		BlasVector<Field> y(F,n), x(F,n, F.one);
 
 #ifdef RSTIMING
 		chrono.stop();
@@ -1497,19 +1477,18 @@ namespace LinBox
 		typedef typename Field::Element Element_t;
 
 		// reduce the matrix mod p
-		Field F(_prime);
+		const Field F(_prime);
 		typedef typename IMatrix::template rebind<Field>::other FMatrix;
-		FMatrix Ap(F, A.rowdim(), A.coldim());
-		typename IMatrix::template rebind<Field>()( Ap, A, F);
+		FMatrix Ap(A, F);
 
 		// compute LQUP Factorization
-		Permutation<Field> P(A.coldim(),F),Q(A.rowdim(),F);
+		Permutation<Field> P((int)A.coldim(),F),Q((int)A.rowdim(),F);
 		FMatrix L(F, A.rowdim(), A.rowdim());
 		unsigned long rank;
 		Element_t det;
 
 		GaussDomain<Field> GD(F);
-		GD.QLUPin(rank,det,Q,L,*Ap,P,Ap->rowdim(), Ap->coldim());
+		GD.QLUPin(rank,det,Q,L,Ap,P,Ap.rowdim(), Ap.coldim());
 		if (rank != A.rowdim()) {
 #if 0
 			throw LinboxError ("ERROR in DIXON SparseLU: singular matrix or bad prime");
@@ -1519,8 +1498,8 @@ namespace LinBox
 			// Therefore, prune unnecessary elements
 			// in those last columns of U
 			size_t origNNZ=0,newNNZ=0;
-			for(typename FMatrix::RowIterator row=Ap->rowBegin();
-			    row != Ap->rowEnd(); ++row) {
+			for(typename FMatrix::RowIterator row=Ap.rowBegin();
+			    row != Ap.rowEnd(); ++row) {
 				if (row->size()) {
 					origNNZ += row->size();
 					size_t ns=0;
@@ -1539,7 +1518,7 @@ namespace LinBox
 
 
 		typedef SparseLULiftingContainer<Ring,Field,IMatrix,FMatrix> LiftingContainer;
-		LiftingContainer lc(_ring, F, A, L, Q, *Ap, P, rank, b, _prime);
+		LiftingContainer lc(_ring, F, A, L, Q, Ap, P, rank, b, _prime);
 		RationalReconstruction<LiftingContainer > re(lc);
 
 		if (!re.getRational(num, den, 0))
@@ -1556,11 +1535,10 @@ namespace LinBox
 #endif //__LINBOX_rational_solver_INL
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/rational-solver2.h b/linbox/algorithms/rational-solver2.h
index affb886..1f7e6ae 100644
--- a/linbox/algorithms/rational-solver2.h
+++ b/linbox/algorithms/rational-solver2.h
@@ -36,7 +36,7 @@
 #include <iostream>
 #include <stdio.h>
 #include <stdlib.h>
-#include <math.h>
+#include <cmath>
 #include "linbox/integer.h"
 #include "linbox/algorithms/rational-reconstruction2.h"
 
@@ -56,7 +56,7 @@ namespace LinBox
 	//template argument Field and RandomPrime are not used.
 	//Keep it just for interface consistency.
 	template <class Ring, class Field, class RandomPrime>
-	class RationalSolver<Ring, Field, RandomPrime, WanTraits> {
+	class RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits> {
 
 	protected:
 		Ring r;
@@ -69,7 +69,7 @@ namespace LinBox
 		{}
 
 
-#if  __LINBOX_HAVE_LAPACK
+#ifdef  __LINBOX_HAVE_CLAPACK
 		template <class IMatrix, class OutVector, class InVector>
 		SolverReturnStatus solve(OutVector& num, Integer& den,
 					 const IMatrix& M, const InVector& b) const
@@ -122,6 +122,7 @@ namespace LinBox
 				integer* numx = new integer[n];
 				integer denx;
 				int ret;
+				//!@bug don't use cblas_, we should use only fflas-ffpack (if not interfaced in LinBox::)
 				ret = cblas_rsol (n, DM, numx, denx, Db);
 				delete[] DM; delete[] Db;
 
@@ -169,7 +170,7 @@ namespace LinBox
 		/** compute  the hadamard bound*/
 		inline static int cblas_hbound (integer& b, int m, int n, const double* M);
 
-#if __LINBOX_HAVE_LAPACK
+#if __LINBOX_HAVE_CLAPACK
 		// compute the inverse of a general matrix
 		inline static int cblas_dgeinv(double* M, int n);
 		/* solve Ax = b
@@ -184,16 +185,17 @@ namespace LinBox
 		inline static int cblas_rsol (int n, const double* M, integer* numx, integer& denx, double* b);
 #endif
 	};
-#if __LINBOX_HAVE_LAPACK
+#if __LINBOX_HAVE_CLAPACK
 	template <class Ring, class Field, class RandomPrime>
-	inline int RationalSolver<Ring, Field, RandomPrime, WanTraits>::cblas_dgeinv(double* M, int n)
+	inline int RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits>::cblas_dgeinv(double* M, int n)
 	{
 		enum CBLAS_ORDER order = CblasRowMajor;
 		int lda = n;
 		int *P = new int[n];
 		int ierr = clapack_dgetrf (order, n, n, M, lda, P);
 		if (ierr != 0) {
-			std::cerr << "In RationalSolver::cblas_dgeinv Matrix is not full rank" << std::endl;
+			commentator().report (Commentator::LEVEL_IMPORTANT, PARTIAL_RESULT)
+			/*std::cerr*/ << "In RationalSolver::cblas_dgeinv Matrix is not full rank" << std::endl;
 			delete[] P ;
 			return -1;
 		}
@@ -203,11 +205,11 @@ namespace LinBox
 	}
 
 	template <class Ring, class Field, class RandomPrime>
-	inline int RationalSolver<Ring, Field, RandomPrime, WanTraits>::cblas_rsol (int n, const double* M, integer* numx, integer& denx, double* b)
+	inline int RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits>::cblas_rsol (int n, const double* M, integer* numx, integer& denx, double* b)
 	{
 		if (n < 1) return 0;
 		double* IM = new double[n * n];
-		memcpy ((void*)IM, (const void*)M, sizeof(double)*n*n);
+		memcpy ((void*)IM, (const void*)M, sizeof(double)*(size_t)(n*n));
 		int ret;
 		//compute the inverse by flops
 		ret = cblas_dgeinv (IM, n);
@@ -242,7 +244,7 @@ namespace LinBox
 		//double log2 = log (2.0);
 		double log2 = M_LN2;
 		// r = b
-		memcpy ((void*) r, (const void*) b, sizeof(double)*n);
+		memcpy ((void*) r, (const void*) b, sizeof(double)*(size_t)n);
 
 		do  {
 			cblas_dapply (n, n, IM, r, x);
@@ -251,7 +253,7 @@ namespace LinBox
 			// compute ax = ax -r, the negative of residual
 			cblas_daxpy (n, -1, r, 1, ax, 1);
 			// compute possible shift
-			double normr1, normr2, normr3, shift1, shift2;
+			double normr1, normr2, normr3, shift2;
 			normr1 = cblas_dmax(n, r, 1);
 			normr2 = cblas_dmax(n, ax, 1);
 			normr3 = cblas_dmax(n, x, 1);
@@ -260,7 +262,7 @@ namespace LinBox
 			if (normr2 <.0000000001)
 				shift = 30;
 			else {
-				shift1 = floor(log (normr1 / normr2) / log2) - 2;
+				double shift1 = floor(log (normr1 / normr2) / log2) - 2;
 				shift = (int)(30 < shift1 ? 30 : shift1);
 			}
 
@@ -324,8 +326,8 @@ namespace LinBox
 		++ p_mpz;
 		++ p_x;
 
-		int sgn;
 		for (; p_mpz != num + n; ++ p_mpz, ++ p_x)  {
+		int sgn;
 			sgn = sign (*p_mpz);
 			tmp_mpz = denx * (*p_mpz);
 			tmp_mpz = abs (tmp_mpz);
@@ -420,14 +422,14 @@ namespace LinBox
 
 	template <class Ring, class Field, class RandomPrime>
 	/* apply  y <- Ax */
-	inline int RationalSolver<Ring, Field, RandomPrime, WanTraits>::cblas_dapply (int m, int n, const double* A, const double* x, double* y)
+	inline int RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits>::cblas_dapply (int m, int n, const double* A, const double* x, double* y)
 	{
 		cblas_dgemv (CblasRowMajor, CblasNoTrans, m, n, 1, A, n, x, 1, 0, y, 1);
 		return 0;
 	}
 
 	template <class Ring, class Field, class RandomPrime>
-	inline int RationalSolver<Ring, Field, RandomPrime, WanTraits>::cblas_mpzapply (int m, int n, const double* A, const integer* x, integer* y)
+	inline int RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits>::cblas_mpzapply (int m, int n, const double* A, const integer* x, integer* y)
 	{
 		const double* p_A;
 		const integer* p_x;
@@ -438,7 +440,7 @@ namespace LinBox
 			for (p_x = x; p_x != x + n; ++ p_x, ++ p_A) {
 				//mpz_set_d (tmp, *p_A);
 				//mpz_addmul_si (*p_y, *p_x, (int)(*p_A));
-				tmp = *p_x  * (long long int)(*p_A);
+				tmp = *p_x  * (int64_t)(*p_A);
 				integer::addin (*p_y, tmp);
 			}
 		}
@@ -447,7 +449,7 @@ namespace LinBox
 
 	template <class Ring, class Field, class RandomPrime>
 	template <class Elt>
-	inline int RationalSolver<Ring, Field, RandomPrime, WanTraits>::printvec (const Elt* v, int n)
+	inline int RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits>::printvec (const Elt* v, int n)
 	{
 		const Elt* p;
 		std::cout << '[';
@@ -459,7 +461,7 @@ namespace LinBox
 
 	template <class Ring, class Field, class RandomPrime>
 	//update num, *num <- *num * 2^shift + d
-	inline int RationalSolver<Ring, Field, RandomPrime, WanTraits>::update_num (integer* num, int n, const double* d, int shift)
+	inline int RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits>::update_num (integer* num, int n, const double* d, int shift)
 	{
 		integer* p_mpz;
 		integer tmp_mpz;
@@ -474,13 +476,13 @@ namespace LinBox
 
 	template <class Ring, class Field, class RandomPrime>
 	//update r = r * shift - M d
-	inline int RationalSolver<Ring, Field, RandomPrime, WanTraits>::update_r_int (double* r, int n, const double* M, const double* d, int shift)
+	inline int RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits>::update_r_int (double* r, int n, const double* M, const double* d, int shift)
 	{
-		int tmp;
 		double* p1;
 		const double* p2;
 		const double* pd;
 		for (p1 = r, p2 = M; p1 != r + n; ++ p1) {
+		int tmp;
 			tmp = (int)(long long int) *p1;
 			tmp <<= shift;
 			for (pd = d; pd != d + n; ++ pd, ++ p2) {
@@ -493,13 +495,13 @@ namespace LinBox
 
 	template <class Ring, class Field, class RandomPrime>
 	//update r = r * shift - M d
-	inline int RationalSolver<Ring, Field, RandomPrime, WanTraits>::update_r_ll (double* r, int n, const double* M, const double* d, int shift)
+	inline int RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits>::update_r_ll (double* r, int n, const double* M, const double* d, int shift)
 	{
-		long long int tmp;
 		double* p1;
 		const double* p2;
 		const double* pd;
 		for (p1 = r, p2 = M; p1 != r + n; ++ p1) {
+		long long int tmp;
 			tmp = (long long int) *p1;
 			tmp <<= shift;
 			for (pd = d; pd != d + n; ++ pd, ++ p2) {
@@ -511,12 +513,12 @@ namespace LinBox
 	}
 
 	template <class Ring, class Field, class RandomPrime>
-	inline double RationalSolver<Ring, Field, RandomPrime, WanTraits>::cblas_dOOnorm(const double* M, int m, int n)
+	inline double RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits>::cblas_dOOnorm(const double* M, int m, int n)
 	{
 		double norm = 0;
-		double old = 0;
 		const double* p;
 		for (p = M; p != M + (m * n); ) {
+		double old = 0;
 			old = norm;
 			norm = cblas_dasum (n, p ,1);
 			if (norm < old) norm = old;
@@ -526,19 +528,19 @@ namespace LinBox
 	}
 
 	template <class Ring, class Field, class RandomPrime>
-	inline double RationalSolver<Ring, Field, RandomPrime, WanTraits>::cblas_dmax (const int N, const double* a, const int inc)
+	inline double RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits>::cblas_dmax (const int N, const double* a, const int inc)
 	{
 		return fabs(a[cblas_idamax (N, a, inc)]);
 	}
 
 	template <class Ring, class Field, class RandomPrime>
-	inline int RationalSolver<Ring, Field, RandomPrime, WanTraits>::cblas_hbound (integer& b, int m, int n, const double* M)
+	inline int RationalSolver<Ring, Field, RandomPrime, NumSymNormTraits>::cblas_hbound (integer& b, int m, int n, const double* M)
 	{
-		double norm = 0;
 		const  double* p;
 		integer tmp;
 		b = 1;
 		for (p = M; p != M + (m * n); ) {
+			double norm = 0;
 			norm = cblas_dnrm2 (n, p ,1);
 			tmp =  norm;
 			integer::mulin (b, tmp);
@@ -553,11 +555,10 @@ namespace LinBox
 
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/rns.h b/linbox/algorithms/rns.h
index 0c1188d..c9b603d 100644
--- a/linbox/algorithms/rns.h
+++ b/linbox/algorithms/rns.h
@@ -1,6 +1,6 @@
 
 /* Copyright (C) 2011 LinBox
- * Written by BB <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  *
  *
  *
@@ -52,7 +52,7 @@ namespace LinBox
 	private:
 		typedef std::vector<unsigned long>  Fvect ;
 		typedef std::vector<integer>        Ivect ;
-		typedef Modular<double>             Field ;
+		typedef Givaro::Modular<double>             Field ;
 
 		Fvect               _primes_; //!< vector of integers, pairwise coprime (or pairwise different primes)
 		unsigned long         _size_; //!< number of primes
@@ -128,7 +128,7 @@ namespace LinBox
 	private:
 		typedef std::vector<unsigned long>  Fvect ;
 		typedef std::vector<integer>        Ivect ;
-		typedef Modular<double>             Field ;
+		typedef Givaro::Modular<double>             Field ;
 
 		Fvect               _primes_; //!< vector of integers, pairwise coprime (or pairwise different primes)
 		unsigned long         _size_; //!< number of primes
diff --git a/linbox/algorithms/rns.inl b/linbox/algorithms/rns.inl
index 84aa30c..31d8149 100644
--- a/linbox/algorithms/rns.inl
+++ b/linbox/algorithms/rns.inl
@@ -1,6 +1,6 @@
 
 /* Copyright (C) 2011 LinBox
- * Written by BB <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  *
  *
  *
@@ -263,7 +263,7 @@ namespace LinBox
 		std::vector<std::vector<double> > residues(_size_);
 		for (size_t i = 0 ; i < _size_ ; ++i) {
 			residues[i].resize(result.size());
-			unitCRA(residues[i],Modular<double>(_Primes_[i]));
+			unitCRA(residues[i],Givaro::Modular<double>(_Primes_[i]));
 		}
 
 		for (size_t i = 0 ; i < result.size() ; ++i) {
diff --git a/linbox/algorithms/short-vector.h b/linbox/algorithms/short-vector.h
index 6e122ed..3997972 100644
--- a/linbox/algorithms/short-vector.h
+++ b/linbox/algorithms/short-vector.h
@@ -37,7 +37,7 @@
  */
 
 #include <iostream>
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
 #include "linbox/util/timer.h"
 #include "linbox/integer.h"
 #include <algorithm>
@@ -48,7 +48,7 @@
 #else
 #error "you need fplll here"
 #endif
-#include <math.h>
+#include <cmath>
 
 
 
@@ -151,7 +151,7 @@ namespace LinBox
 		inline void maxpyin(integer r[3], const integer &a, const integer y[3])
 		{
 			if ((a.bitsize()<32) && (a >= 0)){
-				unsigned long aa= a;
+				uint64_t aa= a;
 				mpz_submul_ui(r[0].get_mpz(), y[0].get_mpz_const(), aa);
 				mpz_submul_ui(r[1].get_mpz(), y[1].get_mpz_const(), aa);
 				mpz_submul_ui(r[2].get_mpz(), y[2].get_mpz_const(), aa);
@@ -166,7 +166,7 @@ namespace LinBox
 		inline void axpyin(integer r[3], const integer &a, const integer y[3])
 		{
 			if ((a.bitsize()<32) && (a >= 0)){
-				unsigned long aa= a;
+				uint64_t aa= a;
 				mpz_addmul_ui(r[0].get_mpz(), y[0].get_mpz_const(), aa);
 				mpz_addmul_ui(r[1].get_mpz(), y[1].get_mpz_const(), aa);
 				mpz_addmul_ui(r[2].get_mpz(), y[2].get_mpz_const(), aa);
@@ -446,8 +446,8 @@ namespace LinBox
 
 		void print()
 		{
-			PID_integer Z;
-			BlasMatrix<PID_integer> M(Z,3,3);
+			Givaro::ZRing<Integer> Z;
+			BlasMatrix<Givaro::ZRing<Integer> > M(Z,3,3);
 			M.setEntry(0,0,b1[0]);
 			M.setEntry(0,1,b1[1]);
 			M.setEntry(0,2,b1[2]);
@@ -511,7 +511,7 @@ namespace LinBox
 			else{
 				// x = (_m* 0x1P53);//9007199254740992;
 				x = (_m* 9007199254740992UL);
-				x = x<<(_e-53);
+				x = x<<(int64_t(_e)-53);
 				return x;
 			}
 		}
diff --git a/linbox/algorithms/sigma-basis.h b/linbox/algorithms/sigma-basis.h
index ab4a436..2929cf8 100644
--- a/linbox/algorithms/sigma-basis.h
+++ b/linbox/algorithms/sigma-basis.h
@@ -31,10 +31,10 @@
 
 #include "linbox/util/commentator.h"
 #include "linbox/util/timer.h"
-#include "linbox/algorithms/blas-domain.h"
-#include "linbox/field/unparametric.h"
 #include "linbox/matrix/matrix-domain.h"
-#include "linbox/matrix/blas-matrix.h"
+#include <givaro/zring.h>
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/matrix/dense-matrix.h"
 #include "linbox/matrix/factorized-matrix.h"
 
 #include "linbox/algorithms/matpoly-mult.h"
@@ -48,6 +48,7 @@
 /*! @file algorithms/sigma-basis.h
  * @brief \f$\sigma\f$-basis (minimal basis).
  */
+#define MBASIS_THRESHOLD 16
 
 namespace LinBox
 {
@@ -67,8 +68,9 @@ namespace LinBox
 		typedef typename Field::Element        Element;
 		typedef BlasMatrix<Field>          Coefficient;
 
+		inline const Field & field() const { return *_field; }
 	private:
-		Field                             _field;
+		const Field                    * _field;
 		BlasMatrixDomain<Field>         _BMD;
 		MatrixDomain<Field>              _MD;
 		std::vector<Coefficient>     &_Serie;
@@ -134,7 +136,7 @@ namespace LinBox
 	public:
 
 		SigmaBasis(const Field &F, std::vector<Coefficient> &PowerSerie) :
-			_field(F), _BMD(F), _MD(F), _Serie(PowerSerie), PM_domain(F)
+			_field(&F), _BMD(F), _MD(F), _Serie(PowerSerie), PM_domain(F)
 		{
 #ifdef  _BM_TIMING
 			clearTimer();
@@ -151,7 +153,7 @@ namespace LinBox
 			size_t m = _Serie[0].rowdim();
 			size_t n = _Serie[0].coldim();
 
-			const Coefficient TransposedZero(n,m);
+			const Coefficient TransposedZero(field(),n,m);
 
 			// take the transposed of the Serie and use PM_Basis
 			std::vector<Coefficient> TransposedSerie (length, TransposedZero);
@@ -161,7 +163,7 @@ namespace LinBox
 					for (size_t j=0;j<n;++j)
 						TransposedSerie[k].setEntry(j,i, _Serie[k].getEntry(i,j));
 
-			const Coefficient Zero(n, n);
+			const Coefficient Zero(field(),n, n);
 
 			// Prepare SigmaBase
 			SigmaBase.resize(degree+1, Zero);
@@ -176,7 +178,7 @@ namespace LinBox
 		{
 
 			const size_t m = _Serie[0].rowdim();
-			const Coefficient Zero(m, m);
+			const Coefficient Zero(field(), m, m);
 
 			// Prepare SigmaBase
 			SigmaBase.resize(degree+1, Zero);
@@ -198,8 +200,8 @@ namespace LinBox
 
 			const size_t m = _Serie[0].rowdim();
 			const size_t n = _Serie[0].coldim();
-			const Coefficient Zero(m, m);
-			const Coefficient ZeroSerie(m,n);
+			const Coefficient Zero(field(),m, m);
+			const Coefficient ZeroSerie(field(),m,n);
 
 
 			// Prepare SigmaBases
@@ -238,8 +240,8 @@ namespace LinBox
 			size_t length=_Serie.size();
 			size_t m = _Serie[0].rowdim();
 			size_t n = _Serie[0].coldim();
-			const Coefficient TransposedZero(n,m);
-			const Coefficient Zero(n, n);
+			const Coefficient TransposedZero(field(),n,m);
+			const Coefficient Zero(field(),n, n);
 
 			// take the transposed of the Serie and use PM_Basis
 			std::vector<Coefficient> TransposedSerie (length, TransposedZero);
@@ -295,7 +297,7 @@ namespace LinBox
 
 
 			// transpose the PowerSerie
-			const Coefficient Zero(m,n);
+			const Coefficient Zero(field(),m,n);
 			std::vector<Coefficient> TransPowerSerie(deg,Zero);
 			for (size_t i=0;i<deg;++i){
 				for (size_t j=0;j<m;++j)
@@ -344,7 +346,7 @@ namespace LinBox
 
 
 			// transpose the PowerSerie
-			const Coefficient Zero(m,n);
+			const Coefficient Zero(field(),m,n);
 			std::vector<Coefficient> TransPowerSerie(deg,Zero);
 			for (size_t i=0;i<deg;++i){
 				for (size_t j=0;j<m;++j)
@@ -379,25 +381,24 @@ namespace LinBox
 		//
 		// SigmaBase must be already allocated with degree+1 elements
 		// PowerSerie must have at least degree+1 element
-#define MBASIS_THRESHOLD 16
 
 		template <class Polynomial1, class Polynomial2>
-		void PM_Basis(Polynomial1      &SigmaBase,
+		void PM_Basis(Polynomial1            &SigmaBase,
 			      const Polynomial2     &PowerSerie,
-			      size_t               degree,
-			      std::vector<size_t> &defect)
+			      size_t                     degree,
+			      std::vector<size_t>       &defect)
 		{
 
 			size_t m,n;
 			m = PowerSerie[0].rowdim();
 			n = PowerSerie[0].coldim();
-			const Coefficient ZeroSigma(m,m);
-			const Coefficient ZeroSerie(m,n);
+			const Coefficient ZeroSigma(field(),m,m);
+			const Coefficient ZeroSerie(field(),m,n);
 
 			if (degree == 0) {
-				Coefficient Identity(m,m);
+				Coefficient Identity(field(),m,m);
 				for (size_t i=0;i< m;++i)
-					Identity.setEntry(i,i,_field.one);
+					Identity.setEntry(i,i,field().one);
 				SigmaBase[0]=Identity;
 			}
 
@@ -445,7 +446,7 @@ namespace LinBox
 
 					//PM_domain.midproduct(Serie2,Sigma1,PowerSerie);
 					ComputeNewSerie(Serie2,Sigma1,PowerSerie, degree1, degree2);
-					Serie2.resize(degree2+1);
+					Serie2.resize(degree2+1,ZeroSerie);
 
 #ifdef _BM_TIMING
 					tUpdateSerie.stop();ttUpdateSerie += tUpdateSerie;
@@ -477,7 +478,7 @@ namespace LinBox
 		// algorithm is from Giorgi, Jeannerod and Villard  ISSAC'03
 		template <class Polynomial1, class Polynomial2>
 		void M_Basis(Polynomial1        &SigmaBase,
-			     Polynomial2        PowerSerie,
+			     Polynomial2       &PowerSerie,
 			     size_t                 length,
 			     std::vector<size_t>   &defect)
 		{
@@ -489,15 +490,16 @@ namespace LinBox
 			n = PowerSerie[0].coldim();
 
 			// Set some useful constants
-			const Coefficient Zero(m,m);
+			const Coefficient Zero(field(),m,m);
 
 			// Reserve memory for the Sigma Base and set SigmaBase[0] to Identity
 			SigmaBase.reserve(length+1);
-			SigmaBase.resize(1);
-			Coefficient Identity(m,m);
+			SigmaBase.resize(1,Zero);
+			Coefficient Identity(field(),m,m);
 			for (size_t i=0;i< m;++i)
-				Identity.setEntry(i,i,_field.one);
-			SigmaBase[0]=Identity;
+				Identity.setEntry(i,i,field().one);
+			// SigmaBase.resize(1,Identity) won't work
+			SigmaBase[0] = Identity;
 
 			// Keep track on Sigma Base's row degree
 			// I adjust the degree with the maximal difference between defects
@@ -514,7 +516,7 @@ namespace LinBox
 
 
 			// Discrepancy
-			Coefficient Discrepancy(m,n);
+			Coefficient Discrepancy(field(),m,n);
 			Timer chrono;
 #ifdef  _BM_TIMING
 			int cptr=0;
@@ -533,7 +535,7 @@ namespace LinBox
 				for (size_t i=0;i<m;++i) {
 					size_t idx_min=i;
 					for (size_t j=i+1;j<m;++j)
-						if (defect[j]< defect[idx_min])
+						if (defect[(size_t)j]< defect[idx_min])
 							idx_min=j;
 					std::swap(defect[i], defect[idx_min]);
 					Perm1[i]=idx_min;
@@ -562,10 +564,11 @@ namespace LinBox
 				chrono.start();
 #endif
 				// Compute Discrepancy
-				_BMD.mul(Discrepancy,SigmaBase[0],PowerSerie[k]);
+                                _BMD.mul(Discrepancy,SigmaBase[0],PowerSerie[k]);
 				for (size_t i=1;i<SigmaBase.size();++i){
 					_BMD.axpyin(Discrepancy,SigmaBase[i],PowerSerie[k-i]);
 				}
+
 #ifdef  _BM_TIMING
 				cptr+=SigmaBase.size();
 				chrono.stop();
@@ -575,7 +578,7 @@ namespace LinBox
 #endif
 
 				//std::cout<<"MBasis: Discrepancy\n";
-				//Discrepancy.write(std::cout,_field);
+				//Discrepancy.write(std::cout,field());
 
 
 				// Compute LQUP of Discrepancy
@@ -584,8 +587,8 @@ namespace LinBox
 				LQUPMatrix<Field> LQUP(Discrepancy,P,Qt);
 
 				// Get L from LQUP
-				TriangularBlasMatrix<Field> L(_field, m, m,
-							      LinBoxTag::Lower, LinBoxTag::Unit);
+				TriangularBlasMatrix<Field> L(field(), m, m,
+							      Tag::Shape::Lower, Tag::Diag::Unit);
 				LQUP.getL(L);
 
 				// get the transposed permutation of Q from LQUP
@@ -593,9 +596,9 @@ namespace LinBox
 
 
 				// Compute the inverse of L
-				TriangularBlasMatrix<Field> invL(_field, m, m,
-								 LinBoxTag::Lower, LinBoxTag::Unit);
-				FFPACK::trinv_left((typename Field::Father_t)_field,m,L.getPointer(),L.getStride(),invL.getWritePointer(),invL.getStride());
+				TriangularBlasMatrix<Field> invL(field(), m, m,
+								 Tag::Shape::Lower, Tag::Diag::Unit);
+				FFPACK::trinv_left((const Field &)field(),m,L.getPointer(),L.getStride(),invL.getWritePointer(),invL.getStride());
 
 #ifdef  _BM_TIMING
 				chrono.stop();
@@ -640,11 +643,11 @@ namespace LinBox
 					for (int j= (int) size-2;j>=0; --j){
 						for (size_t l=0;l<m;++l)
 							//BB: #warning Q[i] pour i>r ne veut rien dire...
-							_field.assign(SigmaBase[j+1].refEntry(*(Qt.getPointer()+i),l),
-								  SigmaBase[j].getEntry(*(Qt.getPointer()+i),l));
+							field().assign(SigmaBase[(size_t)j+1].refEntry(*(Qt.getPointer()+i),l),
+								  SigmaBase[(size_t)j].getEntry(*(Qt.getPointer()+i),l));
 					}
 					for (size_t l=0;l<m;++l)
-						_field.assign(SigmaBase[0].refEntry(*(Qt.getPointer()+i),l),_field.zero);
+						field().assign(SigmaBase[0].refEntry(*(Qt.getPointer()+i),l),field().zero);
 				}
 #ifdef  _BM_TIMING
 				chrono.stop();
@@ -670,7 +673,7 @@ namespace LinBox
 			// degree1 >= degree2
 			//size_t size = 2*degree1 + 1;
 
-			const Coefficient ZeroSerie (OldSerie[0].rowdim(), OldSerie[0].coldim());
+			const Coefficient ZeroSerie (field(),OldSerie[0].rowdim(), OldSerie[0].coldim());
 			//const Coefficient ZeroBase  (SigmaBase[0].rowdim(), SigmaBase[0].coldim());
 
 			// Work on a copy of the old  Serie (increase size by one for computation of middle product)
@@ -703,7 +706,7 @@ namespace LinBox
 
 			for (size_t i=0;i<degree2+1;++i)
 				for (size_t j=0;j<degree1+1;++j)
-					_BMD.axpyin(NewSerie[i],SigmaBase[j],OldSerie[degree1+i-j]);
+					_BMD.axpyin(NewSerie[i],SigmaBase[(size_t)j],OldSerie[degree1+i-j]);
 		}
 
 
@@ -731,16 +734,16 @@ namespace LinBox
 			// Initialization of the Serie iterator
 			typename std::vector<Coefficient>::const_iterator _iter (PowerSerie.begin ());
 
-			Coefficient Unit(m+n,m);
-			const Coefficient Zero(m+n,m);
+			Coefficient Unit(field(),m+n,m);
+			const Coefficient Zero(field(),m+n,m);
 			for (size_t i=0;i<m;i++)
-				Unit.setEntry(i,i,_field.one);
+				Unit.setEntry(i,i,field().one);
 			size_t min_mn=(m <n)? m :n;
 
 			// initialization of discrepancy
-			Coefficient Discrepancy(m+n,n);
+			Coefficient Discrepancy(field(),m+n,n);
 			for (size_t i=0;i<n;i++)
-				Discrepancy.setEntry(i+m,i,_field.one);
+				Discrepancy.setEntry(i+m,i,field().one);
 
 
 			// initialization of sigma base
@@ -791,7 +794,7 @@ namespace LinBox
 
 				typename Coefficient::Iterator _iter_Discr = Discr.Begin();
 
-				while ((_field.isZero(*_iter_Discr) && _iter_Discr != Discr.End()))
+				while ((field().isZero(*_iter_Discr) && _iter_Discr != Discr.End()))
 					++_iter_Discr;
 
 				// maybe there is something to do here
@@ -813,7 +816,7 @@ namespace LinBox
 					for (size_t i=0;i<m+n;++i) {
 						size_t idx_min=i;
 						for (size_t j=i+1;j<m+n;++j)
-							if (order[j]< order[idx_min])
+							if (order[(size_t)j]< order[idx_min])
 								idx_min=j;
 						std::swap(order[i],order[idx_min]);
 						Perm1[i]=idx_min;
@@ -835,8 +838,8 @@ namespace LinBox
 				LQUPMatrix<Field> LQUP(CopyDiscr,P,Qt);
 
 				// Get the matrix L of LQUP decomposition
-				TriangularBlasMatrix<Field> L(_field,m+n,m+n,
-							      LinBoxTag::Lower, LinBoxTag::Unit );
+				TriangularBlasMatrix<Field> L(field(),m+n,m+n,
+							      Tag::Shape::Lower, Tag::Diag::Unit );
 				LQUP.getL(L);
 
 				// Get the tranposed  permutation of Q from LQUP
@@ -851,9 +854,9 @@ namespace LinBox
 				BlasPermutation<size_t> BPerm2(Perm2);
 
 				// compute the inverse of L
-				TriangularBlasMatrix<Field> invL (_field,m+n,m+n,
-								  LinBoxTag::Lower,LinBoxTag::Unit);
-				FFPACK::trinv_left((typename Field::Father_t)_field,m+n, L.getPointer(), L.getStride(),
+				TriangularBlasMatrix<Field> invL (field(),m+n,m+n,
+								  Tag::Shape::Lower,Tag::Diag::Unit);
+				FFPACK::trinv_left((const Field &)field(),m+n, L.getPointer(), L.getStride(),
 						   invL.getWritePointer(), invL.getStride());
 
 
@@ -867,8 +870,8 @@ namespace LinBox
 
 
 				// Apply BPerm2 and Qt to the vector of order and increase by 1 the last n rows
-				UnparametricField<long> UF;
-				BlasMatrixDomain<UnparametricField<long> > BMDUF(UF);
+				Givaro::ZRing<long> UF;
+				BlasMatrixDomain<Givaro::ZRing<long> > BMDUF(UF);
 				BMDUF.mulin_right(Qt,order);
 				BMDUF.mulin_right(BPerm2,order);
 				BMDUF.mulin_right(BPerm1,degree);
@@ -895,17 +898,17 @@ namespace LinBox
 				for (int i= (int)size-2;i>=0;i--)
 					for (size_t j=0;j<n;j++)
 						for (size_t k=0;k<n;++k)
-							_field.assign(SigmaBase[i+1].refEntry(m+j,k), SigmaBase[i].getEntry(m+j,k));
+							field().assign(SigmaBase[i+1].refEntry(m+j,k), SigmaBase[i].getEntry(m+j,k));
 
 				for (size_t j=0;j<n;j++)
 					for (size_t k=0;k<n;++k)
-						_field.assign(SigmaBase[0].refEntry(m+j,k),_field.zero);
+						field().assign(SigmaBase[0].refEntry(m+j,k),field().zero);
 
 
 				// Discrepancy= BPerm2.U.P from LQUP
-				Coefficient U(m+n,n);
+				Coefficient U(field(),m+n,n);
 				TriangularBlasMatrix<Field> trU( U,
-								LinBoxTag::Upper,LinBoxTag::NonUnit);
+								Tag::Shape::Upper,Tag::Diag::NonUnit);
 				LQUP.getU(trU);
 				Discrepancy=U;
 				// BlasPermutation<size_t> P= LQUP.getP();
@@ -924,13 +927,13 @@ namespace LinBox
 					max=degree[i];
 			}
 
-			const Coefficient AZero(m,m);
+			const Coefficient AZero(field(),m,m);
 			Approx.resize(max+1, AZero);
 
 			for (size_t i=0;i<m;i++)
 				for (long j=0;j<=degree[i];j++)
 					for (size_t k=0;k<m;k++)
-						_field.assign(Approx[j].refEntry(i,k), SigmaBase[j].getEntry(i,k));
+						field().assign(Approx[(size_t)j].refEntry(i,k), SigmaBase[(size_t)j].getEntry(i,k));
 
 
 		}
@@ -954,16 +957,16 @@ namespace LinBox
 			// Initialization of the Serie iterator
 			typename std::vector<Coefficient>::const_iterator _iter (PowerSerie.begin ());
 
-			Coefficient Unit(m+n,m);
-			const Coefficient Zero(m+n,m);
+			Coefficient Unit(field(),m+n,m);
+			const Coefficient Zero(field(),m+n,m);
 			for (size_t i=0;i<m;i++)
-				Unit.setEntry(i,i,_field.one);
+				Unit.setEntry(i,i,field().one);
 			size_t min_mn=(m <n)? m :n;
 
 			// initialization of discrepancy
-			Coefficient Discrepancy(m+n,n);
+			Coefficient Discrepancy(field(),m+n,n);
 			for (size_t i=0;i<n;i++)
-				Discrepancy.setEntry(i+m,i,_field.one);
+				Discrepancy.setEntry(i+m,i,field().one);
 
 
 			// initialization of sigma base
@@ -1014,7 +1017,7 @@ namespace LinBox
 
 				typename Coefficient::Iterator _iter_Discr = Discr.Begin();
 
-				while ((_field.isZero(*_iter_Discr) && _iter_Discr != Discr.End()))
+				while ((field().isZero(*_iter_Discr) && _iter_Discr != Discr.End()))
 					++_iter_Discr;
 
 				// maybe there is something to do here
@@ -1036,7 +1039,7 @@ namespace LinBox
 					for (size_t i=0;i<m+n;++i) {
 						size_t idx_min=i;
 						for (size_t j=i+1;j<m+n;++j)
-							if (order[j]< order[idx_min])
+							if (order[(size_t)j]< order[idx_min])
 								idx_min=j;
 						std::swap(order[i],order[idx_min]);
 						Perm1[i]=idx_min;
@@ -1058,8 +1061,8 @@ namespace LinBox
 				LQUPMatrix<Field> LQUP(CopyDiscr,P,Qt);
 
 				// Get the matrix L of LQUP decomposition
-				TriangularBlasMatrix<Field> L(_field, m+n,m+n,
-							      LinBoxTag::Lower, LinBoxTag::Unit );
+				TriangularBlasMatrix<Field> L(field(), m+n,m+n,
+							      Tag::Shape::Lower, Tag::Diag::Unit );
 				LQUP.getL(L);
 
 				// Get the tranposed  permutation of Q from LQUP
@@ -1074,9 +1077,9 @@ namespace LinBox
 				BlasPermutation<size_t> BPerm2(Perm2);
 
 				// compute the inverse of L
-				TriangularBlasMatrix<Field> invL (_field,m+n,m+n,
-								  LinBoxTag::Lower,LinBoxTag::Unit);
-				FFPACK::trinv_left((typename Field::Father_t)_field,m+n,L.getPointer(),L.getStride(),
+				TriangularBlasMatrix<Field> invL (field(),m+n,m+n,
+								  Tag::Shape::Lower,Tag::Diag::Unit);
+				FFPACK::trinv_left(field(),m+n,L.getPointer(),L.getStride(),
 						   invL.getWritePointer(),invL.getStride());
 
 
@@ -1090,8 +1093,8 @@ namespace LinBox
 
 
 				// Apply BPerm2 and Qt to the vector of order and increase by 1 the last n rows
-				UnparametricField<long> UF;
-				BlasMatrixDomain<UnparametricField<long> > BMDUF(UF);
+				Givaro::ZRing<long> UF;
+				BlasMatrixDomain<Givaro::ZRing<long> > BMDUF(UF);
 				BMDUF.mulin_right(Qt,order);
 				BMDUF.mulin_right(BPerm2,order);
 				BMDUF.mulin_right(BPerm1,degree);
@@ -1118,16 +1121,16 @@ namespace LinBox
 				for (int i= (int)size-2;i>=0;i--)
 					for (size_t j=0;j<n;j++)
 						for (size_t k=0;k<n;++k)
-							_field.assign(SigmaBase[i+1].refEntry(m+j,k), SigmaBase[i].getEntry(m+j,k));
+							field().assign(SigmaBase[i+1].refEntry(m+j,k), SigmaBase[i].getEntry(m+j,k));
 
 				for (size_t j=0;j<n;j++)
 					for (size_t k=0;k<n;++k)
-						_field.assign(SigmaBase[0].refEntry(m+j,k),_field.zero);
+						field().assign(SigmaBase[0].refEntry(m+j,k),field().zero);
 
 
 				// Discrepancy= BPerm2.U.P from LQUP
-				Coefficient U(m+n,n);
-				TriangularBlasMatrix<Field> trU(U,LinBoxTag::Upper,LinBoxTag::NonUnit);
+				Coefficient U(field(),m+n,n);
+				TriangularBlasMatrix<Field> trU(U,Tag::Shape::Upper,Tag::Diag::NonUnit);
 				LQUP.getU(trU);
 				Discrepancy=U;
 				// BlasPermutation<size_t> P= LQUP.getP();
@@ -1143,13 +1146,13 @@ namespace LinBox
 							max=order[i];
 					}
 
-					const Coefficient AZero(m,m);
+					const Coefficient AZero(field(),m,m);
 					Approx1.resize(max+1, AZero);
 
 					for (size_t i=0;i<m;i++)
 						for (long j=0;j<=order[i];j++)
 							for (size_t k=0;k<m;k++)
-								_field.assign(Approx1[j].refEntry(i,k), SigmaBase[j].getEntry(i,k));
+								field().assign(Approx1[(size_t)j].refEntry(i,k), SigmaBase[(size_t)j].getEntry(i,k));
 				}
 
 			}
@@ -1165,13 +1168,13 @@ namespace LinBox
 					max=degree[i];
 			}
 
-			const Coefficient AZero(m,m);
+			const Coefficient AZero(field(),m,m);
 			Approx2.resize(max+1, AZero);
 
 			for (size_t i=0;i<m;i++)
 				for (long j=0;j<=degree[i];j++)
 					for (size_t k=0;k<m;k++)
-						_field.assign(Approx2[j].refEntry(i,k), SigmaBase[j].getEntry(i,k));
+						field().assign(Approx2[(size_t)j].refEntry(i,k), SigmaBase[(size_t)j].getEntry(i,k));
 		}
 
 
@@ -1190,28 +1193,30 @@ namespace LinBox
 			n = PowerSerie[0].coldim();
 
 			// Set some useful constants
-			const Coefficient Zeromm(m,m);
-			const Coefficient Zeromn(m,n);
+			const Coefficient Zeromm(field(),m,m);
+			const Coefficient Zeromn(field(),m,n);
 
 			// Reserve memory for the Sigma Base
 			SigmaBase.reserve(length+1);
 			SigmaBase.resize(1);
 
 			// set SigmaBase[0] to Identity
-			Coefficient Identity(m,m);
+			Coefficient Identity(field(),m,m);
 			for (size_t i=0;i< m;++i)
-				Identity.setEntry(i,i,_field.one);
+				Identity.setEntry(i,i,field().one);
 			SigmaBase[0]=Identity;
 
 			// Define Truncated Residual
 			std::vector<Coefficient>  Residual(length+1, Zeromn);
 
 			// Set Truncated Residual to PowerSerie mod X^length
+#if 0
 			for (size_t k=0;k<length; ++k)
 				Residual[k] = PowerSerie[k];
+#endif
 
 			// Define Discrepancy
-			Coefficient Discrepancy(m,n);
+			Coefficient Discrepancy(field(),m,n);
 
 			// Row degree of SigmaBase
 			// Keep track on Sigma Base's row degree
@@ -1396,7 +1401,7 @@ namespace LinBox
 				for (size_t i=0;i<m;++i) {
 					size_t idx_min=i;
 					for (size_t j=i+1;j<m;++j)
-						if (defect[j]< defect[idx_min])
+						if (defect[(size_t)j]< defect[idx_min])
 							idx_min=j;
 					std::swap(defect[i], defect[idx_min]);
 					Perm1[i]=idx_min;
@@ -1428,7 +1433,7 @@ namespace LinBox
 #endif
 
 				/* new version : use of columnReducedEchelon */
-				EchelonFormDomain<Field>  EFD(_field);
+				EchelonFormDomain<Field>  EFD(field());
 				size_t rank = EFD.columnReducedEchelon(Discrepancy);
 
 
@@ -1438,7 +1443,7 @@ namespace LinBox
 					perm[i]=i;
 				size_t idx=0;
 				for (size_t i=0;i<rank;++i){
-					while(_field.isZero(Discrepancy.getEntry(idx,i))) idx++;
+					while(field().isZero(Discrepancy.getEntry(idx,i))) idx++;
 					perm[i]=idx;
 					idx++;
 				}
@@ -1485,17 +1490,17 @@ namespace LinBox
 					maxs=std::max(maxs, degree[*(Qt.getPointer()+d)]);
 				maxs=std::min(maxs, SigmaBase.size()-1);
 
-				//Discrepancy.write(std::cout,_field);
+				//Discrepancy.write(std::cout,field());
 
 
 #ifndef OPTMIZED_SIGMA_UPDATE
 				// Compute a Permutation to put all trivial columns of SigmaBase to right part of it
 				std::vector<size_t> PermTrivial(m);
-				bool PTrivial=true;
 				for(size_t i=0;i<m;++i)
 					if (PermPivots[i]>i)
 						std::swap(triv_column[i], triv_column[PermPivots[i]]);
 
+				// bool PTrivial=true; // no need for that here
 				if (nbr_triv > (int)rank) {
 					size_t idx_triv, idx_nontriv;
 					idx_nontriv = 0;
@@ -1504,12 +1509,12 @@ namespace LinBox
 					for (size_t i=0;i<m;++i){
 						if (triv_column[i]!=0){
 							PermTrivial[i]=idx_nontriv;
-							if (i!=idx_nontriv) PTrivial=false;
+							// if (i!=idx_nontriv) PTrivial=false;
 							idx_nontriv++;
 						}
 						else {
 							PermTrivial[i]=idx_triv;
-							if (i!=idx_triv) PTrivial=false;
+							// if (i!=idx_triv) PTrivial=false;
 							idx_triv++;
 						}
 					}
@@ -1549,7 +1554,7 @@ namespace LinBox
 				std::cout<<"\n";
 
 				write_maple("Sigma",SigmaBase);
-				//Discrepancy.write(std::cout,_field);
+				//Discrepancy.write(std::cout,field());
 
 
 
@@ -1558,13 +1563,13 @@ namespace LinBox
 					std::cout<<triv_column[i]<<", ";
 				std::cout<<"\n";
 
-				SigmaBase[0].write(std::cout,_field);
+				SigmaBase[0].write(std::cout,field());
 				_BMD.mulin_right(BPerm1, SigmaBase[0]);
-				SigmaBase[0].write(std::cout,_field);
+				SigmaBase[0].write(std::cout,field());
 				_BMD.mulin_left(SigmaBase[0],PPiv);
-				SigmaBase[0].write(std::cout,_field);
+				SigmaBase[0].write(std::cout,field());
 				_BMD.mulin_left(SigmaBase[0], PTr);
-				SigmaBase[0].write(std::cout,_field);
+				SigmaBase[0].write(std::cout,field());
 				_BMD.mulin_left(SigmaBase[0], PTrT);
 				_BMD.mulin_left(SigmaBase[0],PPivT);
 				TransposedBlasMatrix<BlasPermutation<size_t> > BPerm1T(BPerm1);
@@ -1573,7 +1578,7 @@ namespace LinBox
 
 				// Update SigmaBase
 				for (size_t i=0;i<maxs+1;++i) {
-					//SigmaBase[0].write(std::cout,_field);
+					//SigmaBase[0].write(std::cout,field());
 					// permute SigmaBase
 					_BMD.mulin_right(BPerm1, SigmaBase[i]);
 
@@ -1598,14 +1603,14 @@ namespace LinBox
 					BlasMatrix<Field> S_bottom_left (SigmaBase[i], rank,0,m-rank,lsize);
 #if 0
 					if (i==0){
-						S_bottom_left.write(std::cout,_field);
+						S_bottom_left.write(std::cout,field());
 					}
 #endif
 					// deal with the left part of S_bottom
 					_BMD.axmyin(S_bottom_left, G, S_top_left);
 #if 0
 					if (i==0){
-						S_bottom_left.write(std::cout,_field);
+						S_bottom_left.write(std::cout,field());
 					}
 #endif
 
@@ -1625,7 +1630,7 @@ namespace LinBox
 						_BMD.mulin_right(Q, SigmaBase[i]);
 #if 0
 					if (i==0){
-						S_bottom_left.write(std::cout,_field);
+						S_bottom_left.write(std::cout,field());
 					}
 #endif
 				}
@@ -1780,10 +1785,10 @@ namespace LinBox
 				for (size_t i=0;i<rank;++i){
 					for (int j= (int) size-2;j>=0; --j){
 						for (size_t l=0;l<m;++l)
-							_field.assign(SigmaBase[j+1].refEntry(*(Qt.getPointer()+i),l), SigmaBase[j].getEntry(*(Qt.getPointer()+i),l));
+							field().assign(SigmaBase[(size_t)j+1].refEntry(*(Qt.getPointer()+i),l), SigmaBase[(size_t)j].getEntry(*(Qt.getPointer()+i),l));
 					}
 					for (size_t l=0;l<m;++l)
-						_field.assign(SigmaBase[0].refEntry(*(Qt.getPointer()+i),l),_field.zero);
+						field().assign(SigmaBase[0].refEntry(*(Qt.getPointer()+i),l),field().zero);
 				}
 #ifdef _BM_TIMING
 				chrono.stop();
@@ -1796,7 +1801,7 @@ namespace LinBox
 				for (size_t i=0;i<rank;++i){
 				for (int j= (int) length-2;j>= (int) k; j--){
 				for (size_t l=0;l<n;++l)
-				_field.assign(Residual[j+1].refEntry(*(Qt.getPointer()+i),l), Residual[j].getEntry(*(Qt.getPointer()+i),l));
+				field().assign(Residual[(size_t)j+1].refEntry(*(Qt.getPointer()+i),l), Residual[(size_t)j].getEntry(*(Qt.getPointer()+i),l));
 				}
 				}
 				*/
@@ -1835,14 +1840,14 @@ namespace LinBox
 			size_t m,n;
 			m = PowerSerie[0].rowdim();
 			n = PowerSerie[0].coldim();
-			const Coefficient ZeroSigma(m,m);
-			const Coefficient ZeroSerie(m,n);
+			const Coefficient ZeroSigma(field(),m,m);
+			const Coefficient ZeroSerie(field(),m,n);
 			PowerSerie.resize(degree, ZeroSerie);
 
 			if (degree == 0) {
-				Coefficient Identity(m,m);
+				Coefficient Identity(field(),m,m);
 				for (size_t i=0;i< m;++i)
-					Identity.setEntry(i,i,_field.one);
+					Identity.setEntry(i,i,field().one);
 				SigmaBase[0]=Identity;
 			}
 			else {
@@ -1887,7 +1892,8 @@ namespace LinBox
 					tUpdateSerie.clear();
 					tUpdateSerie.start();
 #endif
-					/*
+
+#if 0
 					//write_maple("Sigma1", Sigma1);
 					Sigma1.resize(degree1+1, ZeroSigma);
 
@@ -1900,10 +1906,10 @@ namespace LinBox
 					Serie[i] = PowerSerie[i];
 
 					PM_domain.midproduct(Serie2, Sigma1, Serie);
-					//ClassicMulDomain<Field, std::vector<Coefficient> > CM_domain(_field);
+					//ClassicMulDomain<Field, std::vector<Coefficient> > CM_domain(field());
 					//CM_domain.midproduct(Serie2, Sigma1, Serie);
 					Serie2.resize(degree2, ZeroSerie);
-					*/
+#endif
 					std::vector<Coefficient> Serie2(degree2,ZeroSerie);
 					UpdateSerie(Serie2, Sigma1, PowerSerie, degree1, degree2);
 
@@ -1979,17 +1985,17 @@ namespace LinBox
 			size_t m,n;
 			m = OldSerie[0].rowdim();
 			n = OldSerie[0].coldim();
-			const Coefficient ZeroSigma(m,m);
-			const Coefficient ZeroSerie(m,n);
+			const Coefficient ZeroSigma(field(),m,m);
+			const Coefficient ZeroSerie(field(),m,n);
 			size_t Ssize = SigmaBase.size();
 
 			if (SigmaBase.size() < 5){
 
 				// do the calculation by hand
 				for (size_t j=degree1;j<degree1+degree2;++j){
-					_BMD.mul(NewSerie[j-degree1], SigmaBase[0], OldSerie[j]);
+					_BMD.mul(NewSerie[(size_t)j-degree1], SigmaBase[0], OldSerie[(size_t)j]);
 					for (size_t i=1;i<Ssize; ++i)
-						_BMD.axpyin(NewSerie[j-degree1], SigmaBase[i], OldSerie[j-i]);
+						_BMD.axpyin(NewSerie[(size_t)j-degree1], SigmaBase[i], OldSerie[(size_t)j-i]);
 				}
 			}
 			else{
@@ -2023,13 +2029,13 @@ namespace LinBox
 			for (size_t i=0;i<m-1;++i){
 				std::cout<<"[";
 				for (size_t j=0;j<n-1;++j)
-					_field.write(std::cout,C.getEntry(i,j))<<",";
-				_field.write(std::cout,C.getEntry(i,n-1))<<"] , ";
+					field().write(std::cout,C.getEntry(i,j))<<",";
+				field().write(std::cout,C.getEntry(i,n-1))<<"] , ";
 			}
 			std::cout<<"[";
 			for (size_t j=0;j<n-1;++j)
-				_field.write(std::cout,C.getEntry(m-1,j))<<",";
-			_field.write(std::cout, C.getEntry(m-1,n-1))<<"]])]); ";
+				field().write(std::cout,C.getEntry(m-1,j))<<",";
+			field().write(std::cout, C.getEntry(m-1,n-1))<<"]])]); ";
 
 		}
 
@@ -2046,26 +2052,26 @@ namespace LinBox
 				for (size_t i=0;i<m-1;++i){
 					std::cout<<"[";
 					for (size_t j=0;j<n-1;++j)
-						_field.write(std::cout,P[k].getEntry(i,j))<<",";
-					_field.write(std::cout, P[k].getEntry(i,n-1))<<"] , ";
+						field().write(std::cout,P[k].getEntry(i,j))<<",";
+					field().write(std::cout, P[k].getEntry(i,n-1))<<"] , ";
 				}
 				std::cout<<"[";
 				for (size_t j=0;j<n-1;++j)
-					_field.write(std::cout,P[k].getEntry(m-1,j))<<",";
-				_field.write(std::cout, P[k].getEntry(m-1,n-1))<<"]]) , ";
+					field().write(std::cout,P[k].getEntry(m-1,j))<<",";
+				field().write(std::cout, P[k].getEntry(m-1,n-1))<<"]]) , ";
 			}
 
 			std::cout<<"Matrix([";
 			for (size_t i=0;i<m-1;++i){
 				std::cout<<"[";
 				for (size_t j=0;j<n-1;++j)
-					_field.write(std::cout,P[P.size()-1].getEntry(i,j))<<",";
-				_field.write(std::cout, P[P.size()-1].getEntry(i,n-1))<<"] , ";
+					field().write(std::cout,P[P.size()-1].getEntry(i,j))<<",";
+				field().write(std::cout, P[P.size()-1].getEntry(i,n-1))<<"] , ";
 			}
 			std::cout<<"[";
 			for (size_t j=0;j<n-1;++j)
-				_field.write(std::cout,P[P.size()-1].getEntry(m-1,j))<<",";
-			_field.write(std::cout, P[P.size()-1].getEntry(m-1,n-1))<<"]])]); \n\n";
+				field().write(std::cout,P[P.size()-1].getEntry(m-1,j))<<",";
+			field().write(std::cout, P[P.size()-1].getEntry(m-1,n-1))<<"]])]); \n\n";
 		}
 
 
@@ -2078,11 +2084,10 @@ namespace LinBox
 #endif //__LINBOX_sigma_basis_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/signature.h b/linbox/algorithms/signature.h
index bc2c274..38b756c 100644
--- a/linbox/algorithms/signature.h
+++ b/linbox/algorithms/signature.h
@@ -26,12 +26,12 @@
 #define __LINBOX_signature_H
 /* Function related to the signature computation of symmetric matrices */
 
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 #include "linbox/algorithms/cra-early-multip.h"
 #include <fflas-ffpack/ffpack/ffpack.h>
 #include "linbox/randiter/random-prime.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
 #include "linbox/solutions/minpoly.h"
 
 namespace LinBox
@@ -49,20 +49,21 @@ namespace LinBox
 		template <class Matrix>
 		static bool isPosDef (const Matrix& M, const BLAS_LPM_Method& meth)
 		{
-			RandomPrimeIterator::setSeed(time(0));
+			RandomPrimeIterator::setSeed((size_t)time(0));
 			size_t n = M. rowdim();
 			std::vector<int> P;
 			symmetricLU (P, M);
 			if (P. size () < n)
 				return false;
 
-			typedef typename Matrix::Field::Element Int;
-			std::vector<Int> D(n);
+			// typedef typename Matrix::Field::Element Int;
+			// std::vector<Int> D(n);
+			BlasVector<typename Matrix::Field> D(M.field(),n);
 			semiD(D, M);
 
 			//std::cout << "All principal minors are: [";
 			//for (int i = 0; i < n; ++ i)
-			//	std::cout << D[i] << ", ";
+			//	std::cout << D[(size_t)i] << ", ";
 			//std::cout << "]\n";
 
 			if (allPos(D)) return true;
@@ -95,10 +96,10 @@ namespace LinBox
 		template <class Matrix>
 		static bool isPosSemiDef (const Matrix& M, const BLAS_LPM_Method& meth)
 		{
-			RandomPrimeIterator::setSeed(time(0));
+			RandomPrimeIterator::setSeed((size_t)time(0));
 			size_t n = M. rowdim();
 			std::vector<int> P;
-			size_t r = rank_random (M);
+			size_t r = (size_t)rank_random (M);
 			//std::clog << "Rank:= " << r << std::endl;
 			if (r == 0)
 				return true;
@@ -118,10 +119,10 @@ namespace LinBox
 				Matrix PM (R, P.size(), P.size());
 				typename Matrix::RowIterator cur_r; int j = 0;
 				for (cur_r = PM. rowBegin(); cur_r != PM. rowEnd(); ++ cur_r, ++j) {
-					typename Matrix::ConstRowIterator m_r = M. rowBegin() + P[j];
+					typename Matrix::ConstRowIterator m_r = M. rowBegin() + P[(size_t)j];
 					for (size_t k = 0; k < P.size(); ++ k)
 						R. assign (cur_r -> operator[] (k),
-							   m_r -> operator[] (P[k]));
+							   m_r -> operator[] ((size_t)P[(size_t)k]));
 				}
 				semiD (D, PM);
 			}
@@ -192,26 +193,28 @@ namespace LinBox
 			//M. write (std::cout);
 			typedef typename Matrix::Field Ring;
 			typedef typename Ring::Element Integer_t;
-			typedef Modular<double> Field;
+			typedef Givaro::Modular<double> Field;
 			typedef Field::Element Element;
 
 			size_t n = M. rowdim();
+	                RandomPrimeIterator primeg;
+                	if( ! primeg.template setBitsDelayedField<Field>(n) )
+                       		primeg.template setBitsField<Field>();
+
 
-			integer mmodulus;
-			FieldTraits<Field>::maxModulus(mmodulus);
-			long bit1 = (long) floor (log((double)mmodulus)/M_LN2);
-			long bit2 = (long) floor (log(sqrt(double(4503599627370496LL/n)))/M_LN2);
-			RandomPrimeIterator primeg(unsigned(bit1 < bit2 ? bit1 : bit2));
 
-			Field::Element* FA = new Field::Element[n*n];
+			Element* FA = new Element[n*n];
 			size_t* P= new size_t[n], *PQ = new size_t[n];
 			size_t* P_p, * PQ_p;
 
-			Field::Element* p; Field::Element tmp;
+			Element* p; Element tmp;
 			EarlyMultipCRA< Field > cra(3UL);
 
 			Integer_t m = 1;
-			std::vector<Field::Element> v(n);
+			// std::vector<Element> v(n);
+			typedef Givaro::ZRing<Element> NoField;
+			NoField unF ;
+			BlasVector<NoField> v(unF,n);
 			size_t j = 0;
 			Field K2;
 			bool faithful = true;
@@ -229,7 +232,7 @@ namespace LinBox
 					K1. init (*p, *raw_p);
 
 				//clog << "\rComputing lup mod " << prime << ". ";
-				FFPACK::LUdivine((typename Field::Father_t)K1, FFLAS::FflasNonUnit, FFLAS::FflasNoTrans, n, n, FA, n, P, PQ, FFPACK::FfpackLQUP);
+				FFPACK::LUdivine(K1, FFLAS::FflasNonUnit, FFLAS::FflasNoTrans, n, n, FA, n, P, PQ);//, FFPACK::FfpackLQUP);
 
 				faithful = true;
 				for ( j = 0, P_p = P, PQ_p = PQ; j < n; ++ j, ++ P_p, ++ PQ_p)
@@ -239,14 +242,16 @@ namespace LinBox
 					}
 
 			} while(! faithful);
-			K2. init (tmp, 1UL);
+			K2. assign(tmp, K2.one);
 
-			typename std::vector<Field::Element>::iterator vp;
+			// typename std::vector<Element>::iterator vp;
+			typename BlasVector<NoField>::iterator vp;
 			for (j = 0, vp = v.begin(); vp != v.end(); ++j, ++vp) {
 				K2.mulin(tmp, *(FA + (j * n + j)));
 				K2.assign(*vp, tmp);
 			}
-			cra. initialize(K2, v);
+			// BlasVector<Field> v2(K2,v);//!@bug should not do it like that...
+			cra. initialize(K2, v );
 
 			while (! cra.terminated() ){
 				// get a prime.
@@ -257,7 +262,7 @@ namespace LinBox
 					K3. init (*p, *raw_p);
 
 				//clog << "\rComputing lup mod " << prime << ". ";
-				FFPACK::LUdivine((typename Field::Father_t)K3, FFLAS::FflasNonUnit, FFLAS::FflasNoTrans, n, n, FA, n, P, PQ, FFPACK::FfpackLQUP);
+				FFPACK::LUdivine(K3, FFLAS::FflasNonUnit, FFLAS::FflasNoTrans, n, n, FA, n, P, PQ);//, FFPACK::FfpackLQUP);
 
 				faithful = true;
 				for ( j = 0, P_p = P, PQ_p = PQ; j < n; ++ j, ++ P_p, ++ PQ_p)
@@ -271,7 +276,7 @@ namespace LinBox
 					continue;
 				}
 
-				K3. init (tmp, 1UL);
+				K3. assign(tmp, K3.one);
 
 				for (j = 0, vp = v.begin(); vp != v.end(); ++j, ++vp) {
 					K3.mulin(tmp, *(FA + (j * n + j)));
@@ -283,6 +288,7 @@ namespace LinBox
 					std::cout << v[l] << ", ";
 				std::cout << "]\n";
 #endif
+				// BlasVector<Field> v3(K3,v); //!@bug should not be doing that...
 				cra. progress(K3, v);
 			}
 
@@ -301,29 +307,28 @@ namespace LinBox
 		static Vector& symmetricLU (Vector& v, const Matrix& IM)
 		{
 
-			typedef Modular<int32_t> Field;
-			// typedef Modular<double> Field;
+			typedef Givaro::Modular<int32_t> Field;
+			// typedef Givaro::Modular<double> Field;
 			typedef Field::Element Element;
 			typedef BlasMatrix<Field> FMatrix;
-			RandomPrimeIterator primeg(20);
-			Field F ((unsigned long)*primeg);
+			RandomPrimeIterator primeg; primeg.template setBitsField<Field>();
+			Field F (*primeg);
 			FMatrix FM(F, IM.rowdim(), IM.coldim());
 			//std::cout << "Random prime " << p << "\n";
 
-			Element zero; F. init (zero, 0);
-			MatrixHom::map (FM, IM, F);
+			MatrixHom::map (FM, IM);
 			VectorDomain<Field> VD(F);
 			FMatrix& M = FM;
 
 			//typename FMatrix::RowIterator cur_r, tmp_r;
-			typedef FMatrix::Row Row;
+			// typedef FMatrix::Row Row;
 			//the index is 0-based.
 			int i = 0;
 			int n = (int) M. rowdim();
-			std::vector<int> P(n);
+			std::vector<int> P((size_t)n);
 
 			for (i = 0; i < n; ++ i)
-				P[i] = i;
+				P[(size_t)i] = i;
 
 			//M. write(std::cout);
 			for (i = 0; i < n; ++ i) {
@@ -331,7 +336,7 @@ namespace LinBox
 				int j;
 				//find a pivot
 				for (j = i; j < n; ++ j) {
-					if (!F. isZero(M[j][j])) break;
+					if (!F. isZero(M[(size_t)j][(size_t)j])) break;
 				}
 
 				//no piviot
@@ -345,15 +350,15 @@ namespace LinBox
 				//std::cout << "Pivot= " << j << '\n';
 				//M. write(std::cout);
 
-				P[i] = j;
+				P[(size_t)i] = j;
 				Element tmp;
-				F. inv (tmp, M[i][i]);
+				F. inv (tmp, M[(size_t)i][(size_t)i]);
 				F. negin(tmp);
 				VD. mulin(*(M. rowBegin() + i), tmp);
 				//M. write(std::cout);
 
 				for (j = i + 1; j < n; ++ j) {
-					F. assign (tmp,  M[j][i]);
+					F. assign (tmp,  M[(size_t)j][(size_t)i]);
 					VD. axpyin (*(M. rowBegin() + j), tmp,
 						    *(M. rowBegin() + i));
 				}
@@ -361,20 +366,20 @@ namespace LinBox
 				//not necessary
 				//M. write(std::cout);
 				for (j = i + 1; j < n; ++ j)
-					F. assign (M[i][j], zero);
+					F. assign (M[(size_t)i][(size_t)j], F.zero);
 			}
 
-			v. resize (n);
+			v. resize ((size_t)n);
 			std::vector<int>::iterator i_p; int j;
 			for (i_p = v. begin(), j = 0; i_p != v. end(); ++ i_p, ++ j)
 				*i_p = j;
 
 			for (j = 0; j < i; ++ j) {
-				if (j != P[j])
-					std::swap (v[j], v[P[j]]);
+				if (j != P[(size_t)j])
+					std::swap (v[(size_t)j], v[(size_t)P[(size_t)j]]);
 			}
 
-			v. resize (i);
+			v. resize ((size_t)i);
 
 			//std::cout << "Pseud-rank: " << i << "\n[";
 			//for (i_p = v. begin(); i_p != v. end(); ++ i_p)
@@ -390,30 +395,28 @@ namespace LinBox
 		static long rank_random (const Matrix& M)
 		{
 
-			typedef typename Matrix::Field Ring;
+			// typedef typename Matrix::Field Ring;
 			// typedef typename Ring::Element Integer_t;
-			typedef Modular<double> Field;
-			typedef Field::Element Element;
+			typedef Givaro::Modular<double> Field;
+			// typedef Field::Element Element;
 
 			int n = (int)M. rowdim();
 
-			integer mmodulus;
-			FieldTraits<Field>::maxModulus(mmodulus);
-			long bit1 = (long) floor (log((double)mmodulus)/M_LN2);
-			long bit2 = (long) floor (log(sqrt(double(4503599627370496LL/n)))/M_LN2);
-			RandomPrimeIterator primeg((unsigned)(bit1 < bit2 ? bit1 : bit2));
-
 			Field::Element* FA = new Field::Element[n*n], *p;
 
 			// get a prime.
 			// Compute the rank mod that prime. Accumulate into v with CRA.
+                        RandomPrimeIterator primeg;
+                        if( ! primeg.template setBitsDelayedField<Field>(n) )
+                                primeg.template setBitsField<Field>();
+
 			Field K(*primeg);
 
 			typename Matrix::ConstIterator raw_p;
 			for (p = FA, raw_p = M. Begin(); p != FA + (n*n); ++ p, ++ raw_p)
 				K. init (*p, *raw_p);
 
-			long r = FFPACK::Rank((typename Field::Father_t) K, n, n, FA, n);
+			long r = (long)FFPACK::Rank( K, (size_t)n, (size_t)n, FA, (size_t)n);
 
 			delete[] FA;
 			return r;
diff --git a/linbox/algorithms/smith-form-adaptive.h b/linbox/algorithms/smith-form-adaptive.h
index ed0a425..d2f66fb 100644
--- a/linbox/algorithms/smith-form-adaptive.h
+++ b/linbox/algorithms/smith-form-adaptive.h
@@ -32,7 +32,7 @@
 
 #include <vector>
 #include "linbox/integer.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
 
 namespace LinBox
 {
@@ -40,7 +40,7 @@ namespace LinBox
 	class SmithFormAdaptive {
 	public:
 
-		static const long prime[];// = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97};
+		static const int64_t prime[];// = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97};
 
 		static const int NPrime;// = 25;
 
@@ -48,18 +48,18 @@ namespace LinBox
 		 * Should work with SparseMatrix and BlasMatrix
 		 */
 		template <class Matrix>
-		static void compute_local_long (std::vector<integer>& s, const Matrix& A, long p, long e);
+		static void compute_local_long (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, int64_t p, int64_t e);
 
-		/* Compute the local smith form at prime p, when modular (p^e) doesnot fit in long
+		/* Compute the local smith form at prime p, when modular (p^e) doesnot fit in int64_t
 		 * Should work with SparseMatrix and BlasMatrix
 		 */
 		template <class Matrix>
-		static void compute_local_big (std::vector<integer>& s, const Matrix& A, long p, long e);
+		static void compute_local_big (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, int64_t p, int64_t e);
 
 		/* Compute the local smith form at prime p
 		*/
 		template <class Matrix>
-		static void compute_local (std::vector<integer>& s, const Matrix& A, long p, long e);
+		static void compute_local (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, int64_t p, int64_t e);
 
 		/* Compute the k-smooth part of the invariant factor, where k = 100.
 		 * @param sev is the exponent part ...
@@ -67,14 +67,14 @@ namespace LinBox
 		 * Should work with SparseMatrix and BlasMatrix
 		 */
 		template <class Matrix>
-		static void smithFormSmooth (std::vector<integer>& s, const Matrix& A, long r, const std::vector<long>& sev);
+		static void smithFormSmooth (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, long r, const std::vector<int64_t>& sev);
 
 		/* Compute the k-rough part of the invariant factor, where k = 100.
 		 * By EGV+ algorithm or Iliopoulos' algorithm for Smith form.
 		 * Should work with BlasMatrix
 		 */
 		template <class Matrix>
-		static void smithFormRough  (std::vector<integer>& s, const Matrix& A, integer m );
+		static void smithFormRough  (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, integer m );
 
 		/* Compute the Smith form via valence algorithms
 		 * Compute the local Smith form at each possible prime
@@ -82,7 +82,7 @@ namespace LinBox
 		 * Should work with SparseMatrix and BlasMatrix
 		 */
 		template <class Matrix>
-		static void smithFormVal (std::vector<integer>&s, const Matrix& A, long r, const std::vector<long>& sev);
+		static void smithFormVal (BlasVector<Givaro::ZRing<Integer> >&s, const Matrix& A, long r, const std::vector<int64_t>& sev);
 
 		/** \brief Smith form of a dense matrix by adaptive algorithm.
 		 *
@@ -91,26 +91,25 @@ namespace LinBox
 		 * Should work with SparseMatrix and BlasMatrix
 		 */
 		template <class Matrix>
-		static void smithForm (std::vector<integer>& s, const Matrix& A);
+		static void smithForm (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A);
 		/** Specialization for dense case*/
 		// template <class IRing>
-		// static void smithForm (std::vector<integer>& s, const BlasMatrix<IRing>& A);
-		template <class IRing>
-		static void smithForm (std::vector<integer>& s, const BlasMatrix<IRing>& A);
+		// static void smithForm (BlasVector<Givaro::ZRing<Integer> >& s, const BlasMatrix<IRing>& A);
+		template <class IRing, class _Rep>
+		static void smithForm (BlasVector<Givaro::ZRing<Integer> >& s, const BlasMatrix<IRing, _Rep>& A);
 
 	};
-	const long SmithFormAdaptive::prime[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97};
+	const int64_t SmithFormAdaptive::prime[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97};
 	const int SmithFormAdaptive::NPrime = 25;
 }
 
 #include "linbox/algorithms/smith-form-adaptive.inl"
 #endif //__LINBOX_smith_form_adaptive_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/smith-form-adaptive.inl b/linbox/algorithms/smith-form-adaptive.inl
index 4011d08..fcfc0a2 100644
--- a/linbox/algorithms/smith-form-adaptive.inl
+++ b/linbox/algorithms/smith-form-adaptive.inl
@@ -26,13 +26,15 @@
 #ifndef __LINBOX_smith_form_adaptive_INL
 #define __LINBOX_smith_form_adaptive_INL
 
-#include <math.h>
+#include <cmath>
 #include <vector>
+#include <givaro/modular-int32.h>
+
 #include "linbox/linbox-config.h"
 #include "linbox/integer.h"
 #include "linbox/util/debug.h"
-#include "linbox/field/PIR-modular-int32.h"
-#include "linbox/field/local2_32.h"
+#include "linbox/ring/pir-modular-int32.h"
+#include "linbox/ring/local2_32.h"
 #include "linbox/algorithms/smith-form-iliopoulos.h"
 #include "linbox/algorithms/smith-form-local.h"
 #include "linbox/algorithms/rational-solver-adaptive.h"
@@ -50,7 +52,7 @@
 
 
 #ifdef __LINBOX_HAVE_NTL
-#include "linbox/field/PIR-ntl-ZZ_p.h"
+#include "linbox/ring/pir-ntl-zz_p.h"
 #endif
 
 namespace LinBox
@@ -59,7 +61,7 @@ namespace LinBox
 	/* Compute the local smith form at prime p, when modular (p^e) fits in long
 	*/
 	template <class Matrix>
-	void SmithFormAdaptive::compute_local_long (std::vector <integer>& s, const Matrix& A, long p, long e)
+	void SmithFormAdaptive::compute_local_long (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, int64_t p, int64_t e)
 	{
 		std::ostream& report = commentator().report (Commentator::LEVEL_IMPORTANT, PROGRESS_REPORT);
 
@@ -73,25 +75,25 @@ namespace LinBox
 			std::list <Local2_32::Element> l;
 			SmithFormLocal<Local2_32> SF;
 			BlasMatrix <Local2_32> A_local(R, A.rowdim(),A.coldim());
-			MatrixHom::map (A_local, A, R);
+			MatrixHom::map (A_local, A);
 			SF (l, A_local, R);
 			std::list <Local2_32::Element>::iterator l_p;
-			std::vector <integer>::iterator s_p;
-			for (s_p = s. begin(), l_p = l. begin(); s_p != s. begin() + order; ++ s_p, ++ l_p)
+			BlasVector<Givaro::ZRing<Integer> >::iterator s_p;
+			for (s_p = s. begin(), l_p = l. begin(); s_p != s. begin() +(ptrdiff_t) order; ++ s_p, ++ l_p)
 				*s_p = *l_p;
 			report << "     Done\n";
 		}
 		else if (e == 1) {
 			report << "      Compute local smith at prime " << p << ", by rank.\n";
 #if 0 /*Meet trouble to call ffpack routine*/
-			Modular<double> F (p); Modular<double>::Element elt;
+			Givaro::Modular<double> F (p); Givaro::Modular<double>::Element elt;
 			int n = A. rowdim(); int m = A. coldim();
-			Modular<double>::Element* A_local = new Modular<double>::Element [n * m];
+			Givaro::Modular<double>::Element* A_local = new Givaro::Modular<double>::Element [n * m];
 			typename Matrix::ConstIndexedIterator rawi_p;
 			typename Matrix::ConstIterator raw_p;
-			Modular<double>::Element* A_local_p;
+			Givaro::Modular<double>::Element* A_local_p;
 			for (A_local_p = A_local; A_local_p != A_local + (n*m); ++ A_local_p)
-				F. init (*A_local_p, 0);
+				F. assign (*A_local_p, F.zero);
 			integer tmp;
 			for (rawi_p = A. IndexedBegin(), raw_p = A. Begin(), A_local_p = A_local; rawi_p != A. IndexedEnd(); ++ rawi_p, ++ raw_p, ++ A_local_p) {
 				//F. init (*A_local_p, *raw_p);
@@ -105,40 +107,40 @@ namespace LinBox
 				std::cout << *(A_local + i) << '\t';
 			std::cout << "\nbegin to call ffpack:\n";
 
-			unsigned int rank = FPACK::Rank ((Modular<double>::Father_t)(F, n, m, A_local, m);
+			unsigned int rank = FPACK::Rank ((Givaro::Modular<double>::Father_t)(F, n, m, A_local, m);
 			std::cout << "Call of ffpack is done\n";
 			delete[] A_local;
 #endif
-			typedef Modular<int32_t> Field;
+			typedef Givaro::Modular<int32_t> Field;
 			typedef BlasMatrix<Field> FMatrix;
 			MatrixRank<typename Matrix::Field, Field> MR;
-			Field F((unsigned long)p);
+			Field F(p);
 			FMatrix A_local(A, F);
 			long rank = MR. rankIn (A_local);
 
-			std::vector <integer>::iterator s_p;
+			BlasVector<Givaro::ZRing<Integer> >::iterator s_p;
 			for (s_p = s. begin(); s_p != s. begin() + (long) rank; ++ s_p)
 				*s_p = 1;
-			for (; s_p != s. begin() + order; ++ s_p)
+			for (; s_p != s. begin() +(ptrdiff_t) order; ++ s_p)
 				*s_p = 0;
 			report << "      Done\n";
 		}
 		else {
 			report << "      Compute local smith at " << p <<'^' << e << " using PIRModular<int32_t>\n";
-			long m = 1;
+			int64_t m = 1;
 			int i = 0;
 			for (i = 0; i < e; ++ i)
 				m *= p;
 			typedef PIRModular<int32_t> PIR;
-			PIR R((unsigned int)m);
+			PIR R((int32_t)m);
 			BlasMatrix <PIR> A_local(R, A.rowdim(), A.coldim());
 			SmithFormLocal <PIR> SF;
 			std::list <PIR::Element> l;
-			MatrixHom::map (A_local, A, R);
+			MatrixHom::map (A_local, A);
 			SF (l, A_local, R);
 			std::list <PIR::Element>::iterator l_p;
-			std::vector <integer>::iterator s_p;
-			for (s_p = s. begin(), l_p = l. begin(); s_p != s. begin() + order; ++ s_p, ++ l_p)
+			BlasVector<Givaro::ZRing<Integer> >::iterator s_p;
+			for (s_p = s. begin(), l_p = l. begin(); s_p != s. begin() +(ptrdiff_t) order; ++ s_p, ++ l_p)
 				*s_p = *l_p;
 			report <<  "      Done\n";
 		}
@@ -149,7 +151,7 @@ namespace LinBox
 	/* Compute the local smith form at prime p, when modular (p^e) doesnot fit in long
 	*/
 	template <class Matrix>
-	void SmithFormAdaptive::compute_local_big (std::vector<integer>& s, const Matrix& A, long p, long e)
+	void SmithFormAdaptive::compute_local_big (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, int64_t p, int64_t e)
 	{
 
 		std::ostream& report = commentator().report (Commentator::LEVEL_IMPORTANT, PROGRESS_REPORT);
@@ -164,25 +166,25 @@ namespace LinBox
 			BlasMatrix <PIR_ntl_ZZ_p> A_local(R, A.rowdim(), A.coldim());
 			SmithFormLocal <PIR_ntl_ZZ_p> SF;
 			std::list <PIR_ntl_ZZ_p::Element> l;
-			MatrixHom::map (A_local, A, R);
+			MatrixHom::map (A_local, A);
 			SF (l, A_local, R);
 			std::list <PIR_ntl_ZZ_p::Element>::iterator l_p;
-			std::vector <integer>::iterator s_p;
-			for (s_p = s. begin(), l_p = l. begin(); s_p != s. begin() + order; ++ s_p, ++ l_p)
+			BlasVector<Givaro::ZRing<Integer> >::iterator s_p;
+			for (s_p = s. begin(), l_p = l. begin(); s_p != s. begin() +(ptrdiff_t) order; ++ s_p, ++ l_p)
 				R. convert(*s_p, *l_p);
 			report << "      Done \n";
 		}
 		else {
-			std::cout << "Compute local smith at " << p << '^' << e << std::endl;
+			std::cerr << "Compute local smith at " << p << '^' << e << std::endl;
 			std::cerr << "Not implemented yet.\n";
 		}
 		return;
 	}
 #else
 	template <class Matrix>
-	void SmithFormAdaptive::compute_local_big (std::vector<integer>& s, const Matrix& A, long p, long e)
+	void SmithFormAdaptive::compute_local_big (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, int64_t p, int64_t e)
 	{
-		throw(LinBoxError("you need NTL to use SmithFormAdaptive",__func__,__FILE__,__LINE__));
+		throw(LinBoxError("you need NTL to use SmithFormAdaptive",LB_FILE_LOC));
 	}
 
 #endif
@@ -190,7 +192,7 @@ namespace LinBox
 	/* Compute the local smith form at prime p
 	*/
 	template <class Matrix>
-	void SmithFormAdaptive::compute_local (std::vector<integer>& s, const Matrix& A, long p, long e)
+	void SmithFormAdaptive::compute_local (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, int64_t p, int64_t e)
 	{
 
 		linbox_check ((p > 0) && ( e >= 0));
@@ -201,7 +203,7 @@ namespace LinBox
 			compute_local_big (s, A, p, e);
 
 		// normalize the answer
-		for (std::vector<integer>::iterator p_it = s. begin(); p_it != s. end(); ++ p_it)
+		for (BlasVector<Givaro::ZRing<Integer> >::iterator p_it = s. begin(); p_it != s. end(); ++ p_it)
 			*p_it = gcd (*p_it, m);
 	}
 
@@ -211,23 +213,25 @@ namespace LinBox
 	 * r >= 2;
 	 */
 	template <class Matrix>
-	void SmithFormAdaptive::smithFormSmooth (std::vector<integer>& s, const Matrix& A, long r, const std::vector<long>& sev)
+	void SmithFormAdaptive::smithFormSmooth (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, long r, const std::vector<int64_t>& sev)
 	{
+		Givaro::ZRing<Integer> Z;
 		//....
 		std::ostream& report = commentator().report (Commentator::LEVEL_IMPORTANT, PROGRESS_REPORT);
 		report << "Computation the k-smooth part of the invariant factors starts(via local and rank):" << std::endl;
 		int order = (int)(A. rowdim() < A. coldim() ? A. rowdim() : A. coldim());
 		linbox_check (s. size() >= (unsigned long)order);
-		std::vector<long>::const_iterator sev_p; const long* prime_p; std::vector<integer>::iterator s_p;
-		std::vector<integer> local(order); std::vector<integer>::iterator local_p;
+		std::vector<int64_t>::const_iterator sev_p; const int64_t* prime_p; BlasVector<Givaro::ZRing<Integer> >::iterator s_p;
+		BlasVector<Givaro::ZRing<Integer> > local(Z,(size_t)order);
+		BlasVector<Givaro::ZRing<Integer> >::iterator local_p;
 
-		for (s_p = s. begin(); s_p != s. begin() + r; ++ s_p)
+		for (s_p = s. begin(); s_p != s. begin() +(ptrdiff_t) r; ++ s_p)
 			*s_p = 1;
 		for (; s_p != s. end(); ++ s_p)
 			*s_p = 0;
 		if (r == 0) return;
 
-		for (sev_p = sev. begin(), prime_p = prime; sev_p != sev. begin() + NPrime; ++ sev_p, ++ prime_p) {
+		for (sev_p = sev. begin(), prime_p = prime; sev_p != sev. begin() +(ptrdiff_t) NPrime; ++ sev_p, ++ prime_p) {
 			int extra = 1;
 			do {
 
@@ -239,11 +243,11 @@ namespace LinBox
 				compute_local (local, A, *prime_p, *sev_p + extra);
 				//check
 				report << "   Check if it agrees with the rank: ";
-				if ((local[r-1] % m != 0 ) && ((r == order) ||(local[r] % m == 0))) {report << "yes.\n"; break;}
+				if ((local[(size_t)r-1] % m != 0 ) && ((r == order) ||(local[(size_t)r] % m == 0))) {report << "yes.\n"; break;}
 				report << "no. \n";
 				extra *= 2;
 			} while (true);
-			for (s_p = s. begin(), local_p = local. begin(); s_p != s. begin() + order; ++ s_p, ++ local_p)
+			for (s_p = s. begin(), local_p = local. begin(); s_p != s. begin() +(ptrdiff_t) order; ++ s_p, ++ local_p)
 				*s_p *= *local_p;
 		}
 		report << "Computation of the smooth part is done.\n";
@@ -256,7 +260,7 @@ namespace LinBox
 	 * By EGV+ algorithm or Iliopoulos' algorithm for Smith form.
 	 */
 	template <class Matrix>
-	void SmithFormAdaptive::smithFormRough  (std::vector<integer>& s, const Matrix& A, integer m)
+	void SmithFormAdaptive::smithFormRough  (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, integer m)
 	{
 
 		std::ostream& report = commentator().report (Commentator::LEVEL_IMPORTANT, PROGRESS_REPORT);
@@ -270,17 +274,17 @@ namespace LinBox
 			report << "    Elimination starts:\n";
 			PIRModular<int32_t> R (m);
 			BlasMatrix<PIRModular<int32_t> > A_ilio(R, A.rowdim(), A.coldim());
-			MatrixHom::map (A_ilio, A, R);
+			MatrixHom::map (A_ilio, A);
 			SmithFormIliopoulos::smithFormIn (A_ilio);
-			int i; std::vector<integer>::iterator s_p;
-			for (i = 0, s_p = s. begin(); s_p != s. begin() + order; ++ i, ++ s_p)
-				R. convert(*s_p, A_ilio[i][i]);
+			int i; BlasVector<Givaro::ZRing<Integer> >::iterator s_p;
+			for (i = 0, s_p = s. begin(); s_p != s. begin() +(ptrdiff_t) order; ++ i, ++ s_p)
+				R. convert(*s_p, A_ilio[(size_t)i][(size_t)i]);
 			report << "    Elimination ends.\n";
 		}
 		// else if bisection possible
 		else if (m > T)  {
 			report << "   Big rough part, bisection starts:\n";
-			typedef Modular<int> Field;
+			typedef Givaro::Modular<int> Field;
 			typedef typename Matrix::Field Ring;
 			typedef RationalSolverAdaptive Solver;
 			typedef LastInvariantFactor<Ring, Solver> LIF;
@@ -288,11 +292,11 @@ namespace LinBox
 			SmithFormBinary<Ring, OIF, MatrixRank<Ring, Field > > sf;;
 			sf. setOIFThreshold (2);
 			sf. setLIFThreshold (2);
-			std::vector<long> primeL (prime, prime + NPrime);
-			std::vector<typename Ring::Element> out (order);
+			std::vector<int64_t> primeL (prime, prime + NPrime);
+			std::vector<typename Ring::Element> out ((size_t)order);
 			sf. smithForm (out, A, primeL);
 			typename std::vector<typename Ring::Element>::iterator out_p;
-			std::vector<integer>::iterator s_p;
+			BlasVector<Givaro::ZRing<Integer> >::iterator s_p;
 			for (s_p = s. begin(), out_p = out. begin(); out_p != out. end(); ++ out_p, ++ s_p)
 				A. field(). convert (*s_p, *out_p);
 			report << "   Big rough part, bisection ends.\n";
@@ -301,20 +305,20 @@ namespace LinBox
 			report << "    Elimination start:\n";
 			PIR_ntl_ZZ_p R (m);
 			BlasMatrix<PIR_ntl_ZZ_p> A_ilio(R, A.rowdim(), A.coldim());
-			MatrixHom::map (A_ilio, A, R);
+			MatrixHom::map (A_ilio, A);
 			SmithFormIliopoulos::smithFormIn (A_ilio);
-			int i; std::vector<integer>::iterator s_p;
-			for (i = 0, s_p = s. begin(); s_p != s. begin() + order; ++ i, ++ s_p)
-				R. convert(*s_p, A_ilio[i][i]);
+			int i; BlasVector<Givaro::ZRing<Integer> >::iterator s_p;
+			for (i = 0, s_p = s. begin(); s_p != s. begin() +(ptrdiff_t) order; ++ i, ++ s_p)
+				R. convert(*s_p, A_ilio[(size_t)i][(size_t)i]);
 			report << "    Elimination ends.\n";
 		}
 		report << "Compuation of the k-rough part of the invariant factors finishes.\n";
 	}
 #else
 	template <class Matrix>
-	void SmithFormAdaptive::smithFormRough  (std::vector<integer>& s, const Matrix& A, integer m)
+	void SmithFormAdaptive::smithFormRough  (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A, integer m)
 	{
-		throw(LinBoxError("you need NTL to use SmithFormAdaptive",__func__,__FILE__,__LINE__));
+		throw(LinBoxError("you need NTL to use SmithFormAdaptive",LB_FILE_LOC));
 	}
 #endif
 
@@ -323,23 +327,30 @@ namespace LinBox
 	 * r >= 2;
 	 */
 	template <class Matrix>
-	void SmithFormAdaptive::smithFormVal (std::vector<integer>&s, const Matrix& A, long r, const std::vector<long>& sev)
+	void SmithFormAdaptive::smithFormVal (BlasVector<Givaro::ZRing<Integer> >&s, const Matrix& A, long r, const std::vector<int64_t>& sev)
 	{
 		//....
+		Givaro::ZRing<Integer> Z;
 		std::ostream& report = commentator().report (Commentator::LEVEL_IMPORTANT, PROGRESS_REPORT);
 		report << "Computation the local smith form at each possible prime:\n";
 		int order = (int)(A. rowdim() < A. coldim() ? A. rowdim() : A. coldim());
 		linbox_check (s. size() >= (unsigned long)order);
-		std::vector<long>::const_iterator sev_p; const long* prime_p; std::vector<integer>::iterator s_p;
-		std::vector<integer> local(order); std::vector<integer>::iterator local_p;
 
-		for (s_p = s. begin(); s_p != s. begin() + r; ++ s_p)
+		std::vector<int64_t>::const_iterator sev_p;
+		const int64_t* prime_p;
+
+		BlasVector<Givaro::ZRing<Integer> >::iterator s_p;
+		BlasVector<Givaro::ZRing<Integer> > local(Z,(size_t)order);
+
+		BlasVector<Givaro::ZRing<Integer> >::iterator local_p;
+
+		for (s_p = s. begin(); s_p != s. begin() +(ptrdiff_t) r; ++ s_p)
 			*s_p = 1;
 		for (; s_p != s. end(); ++ s_p)
 			*s_p = 0;
 		if (r == 0) return;
 
-		for (sev_p = sev. begin(), prime_p = prime; sev_p != sev. begin() + NPrime; ++ sev_p, ++ prime_p) {
+		for (sev_p = sev. begin(), prime_p = prime; sev_p != sev. begin() +(ptrdiff_t) NPrime; ++ sev_p, ++ prime_p) {
 			if (*sev_p <= 0) continue;
 			//only compute the local Smith form at each possible prime
 			int extra = 2;
@@ -356,11 +367,11 @@ namespace LinBox
 				compute_local (local, A, *prime_p, extra);
 				//check
 				report << "   Check if it agrees with the rank: ";
-				if ((local[r-1] % m != 0 ) && ((r == order) ||(local[r] % m == 0))) {report << "yes.\n"; break;}
+				if ((local[(size_t)r-1] % m != 0 ) && ((r == order) ||(local[(size_t)r] % m == 0))) {report << "yes.\n"; break;}
 				report << "no. \n";
 				extra *= 2;
 			} while (true);
-			for (s_p = s. begin(), local_p = local. begin(); s_p != s. begin() + order; ++ s_p, ++ local_p)
+			for (s_p = s. begin(), local_p = local. begin(); s_p != s. begin() +(ptrdiff_t) order; ++ s_p, ++ local_p)
 				*s_p *= *local_p;
 		}
 		report << "Computation of the smith form done.\n";
@@ -374,7 +385,7 @@ namespace LinBox
 	 * then based on that, compute the rough and smooth part, seperately.
 	 */
 	template <class Matrix>
-	void SmithFormAdaptive::smithForm (std::vector<integer>& s, const Matrix& A)
+	void SmithFormAdaptive::smithForm (BlasVector<Givaro::ZRing<Integer> >& s, const Matrix& A)
 	{
 		//commentator().start ("Smith Form starts", "Smithform");
 
@@ -386,20 +397,20 @@ namespace LinBox
 		report << "Computation of the rank starts:\n";
 		typedef typename Matrix::Field Ring;
 		unsigned long r;
-		MatrixRank<Ring, Modular<int32_t> > MR;
+		MatrixRank<Ring, Givaro::Modular<int32_t> > MR;
 		r = MR. rank (A);
 		report << "   Matrix rank over a random prime field: " << r << '\n';
 		report << "Computation of the rank finished.\n";
-		const long* prime_p;
-		std::vector<long> e(NPrime); std::vector<long>::iterator e_p;
+		const int64_t* prime_p;
+		std::vector<int64_t> e(NPrime); std::vector<int64_t>::iterator e_p;
 
 		report <<"   Compute the degree of min poly of AA^T: \n";
-		typedef Modular<int32_t> Field;
+		typedef Givaro::Modular<int32_t> Field;
 		integer Val; Field::Element v; unsigned long degree;
-		RandomPrimeIterator rg ((int)(log( (double)(FieldTraits<Field>::maxModulus()) ) /  M_LN2 - 2));
-		Field F ((unsigned long)*rg);
+		RandomPrimeIterator rg; rg.template setBitsField<Field>();
+		Field F (*rg);
 		typename MatrixHomTrait<Matrix, Field>::value_type Ap(F, A.rowdim(), A.coldim());
-		MatrixHom::map (Ap, A, F);
+		MatrixHom::map (Ap, A);
 		Valence::one_valence (v, degree, Ap);
 		report <<"   Degree of minimal polynomial of AA^T = " << degree << '\n';
 		// if degree is small
@@ -420,6 +431,7 @@ namespace LinBox
 			if (Val == 1) {
 				smithFormVal (s, A, r, e);
 				report << "Computation of the invariant factors ends." << std::endl;
+				//cerr << "Computation of the invariant factors ends." << std::endl;
 				return;
 			}
 			else
@@ -435,7 +447,7 @@ namespace LinBox
 		//Chnage A to BlasMatrix
 		Ring R(A. field());
 		BlasMatrix<Ring> DA(R,A.rowdim(),A.coldim());
-		MatrixHom::map (DA, A, R);
+		MatrixHom::map (DA, A);
 		do {
 			oif. oneInvariantFactor_Bonus (_lif, _bonus, DA, (int)r);
 
@@ -456,13 +468,14 @@ namespace LinBox
 		}
 		// bonus assigns to its rough part
 		bonus = gcd (bonus, r_mod);
-		std::vector<integer> smooth (order), rough (order);
+		Givaro::ZRing<Integer> Z;
+		BlasVector<Givaro::ZRing<Integer> > smooth (Z,(size_t)order), rough (Z,(size_t)order);
 		smithFormRough (rough, DA, bonus);
 		smithFormSmooth (smooth, A, r, e);
 		//fixed the rough largest invariant factor
 		if (r > 0) rough[r-1] = r_mod;
 
-		std::vector<integer>::iterator s_p, rough_p, smooth_p;
+		BlasVector<Givaro::ZRing<Integer> >::iterator s_p, rough_p, smooth_p;
 
 		/*
 		   report << "Smooth part\n";
@@ -470,15 +483,15 @@ namespace LinBox
 		   report<< *smooth_p << ' ';
 		   report<< '\n';
 		   report<<"Rough part\n";
-		   for (rough_p = rough. begin(); rough_p != rough. begin() + r; ++ rough_p)
+		   for (rough_p = rough. begin(); rough_p != rough. begin() +(ptrdiff_t) r; ++ rough_p)
 		   report<< *rough_p << ' ';
 		   report<< '\n';
 		   */
 
-		for (rough_p = rough. begin(); rough_p != rough. begin() + r; ++ rough_p)
+		for (rough_p = rough. begin(); rough_p != rough. begin() +(ptrdiff_t) r; ++ rough_p)
 			if (* rough_p == 0) *rough_p = bonus;
 
-		for (s_p = s. begin(), smooth_p = smooth. begin (), rough_p = rough. begin(); s_p != s. begin() + order; ++s_p, ++ smooth_p, ++ rough_p)
+		for (s_p = s. begin(), smooth_p = smooth. begin (), rough_p = rough. begin(); s_p != s. begin() +(ptrdiff_t) order; ++s_p, ++ smooth_p, ++ rough_p)
 			*s_p = *smooth_p * *rough_p;
 
 		report << "Computation of the invariant factors ends." << std::endl;
@@ -491,33 +504,39 @@ namespace LinBox
 	 * Otherwise, compute the largest invariant factor,
 	 * then based on that, compute the rough and smooth part, seperately.
 	 */
-	template <class IRing>
-	void SmithFormAdaptive::smithForm (std::vector<integer>& s, const BlasMatrix<IRing>& A)
+	template <class IRing, class _Rep>
+	void SmithFormAdaptive::smithForm (BlasVector<Givaro::ZRing<Integer> >& s, const BlasMatrix<IRing, _Rep>& A)
 	{
 		//commentator().start ("Smith Form starts", "Smithform");
+		Givaro::ZRing<Integer> Z;
 
 		std::ostream& report = commentator().report (Commentator::LEVEL_IMPORTANT, PROGRESS_REPORT);
 		report << "Computation of the invariant factors starts (via an adaptive alg):" << std::endl;
+		//cerr << "Computation of the invariant factors starts (via an adaptive alg):" << std::endl;
 
 		// compute the rank over a random prime field.
-		int order = (int)(A. rowdim() < A. coldim() ? A. rowdim() : A. coldim());
-		report << "Computation of the rank starts:\n";
-		typedef typename BlasMatrix<IRing>::Field Ring;
+		const size_t order = (A. rowdim() < A. coldim() ? A. rowdim() : A. coldim());
+
+		report << "Computation of the rank starts:" << std::endl;
+		typedef typename BlasMatrix<IRing,_Rep>::Field Ring;
 		unsigned long r;
-		MatrixRank<Ring, Modular<int32_t> > MR;
-		r = MR. rank (A);
-		report << "   Matrix rank over a random prime field: " << r << '\n';
+		MatrixRank<Ring, Givaro::Modular<int32_t> > MR;
+		r = (unsigned long)MR. rank (A);
+		report << "   Matrix rank over a random prime field: " << r << std::endl;
 		report << "Computation of the rank finished.\n";
-		const long* prime_p;
-		std::vector<long> e(NPrime); std::vector<long>::iterator e_p;
+		// a hack
+		if (r == 0) { for (size_t i = 0; i <  order; ++i) s[i]=0; return; }
+		const int64_t* prime_p;
+		std::vector<int64_t> e(NPrime); std::vector<int64_t>::iterator e_p;
 
 		report <<"   Compute the degree of min poly of AA^T: \n";
-		typedef Modular<int32_t> Field;
-		integer Val; Field::Element v; unsigned long degree;
-		RandomPrimeIterator rg ((int)(log( (double)(FieldTraits<Field>::maxModulus()) ) / M_LN2 - 2));
-		Field F ((unsigned long)*rg);
-		typename MatrixHomTrait<BlasMatrix <IRing>, Field>::value_type Ap(F,A.rowdim(),A.coldim());
-		MatrixHom::map (Ap, A, F);
+		typedef Givaro::Modular<int32_t> Field;
+		integer Val; Field::Element v; size_t degree;
+		//integer Val; Field::Element v; unsigned long degree;
+		RandomPrimeIterator rg; rg.template setBitsField<Field>();
+		Field F (*rg);
+		typename MatrixHomTrait<BlasMatrix <IRing, _Rep>, Field>::value_type Ap(F,A.rowdim(),A.coldim());
+		MatrixHom::map (Ap, A);
 		Valence::one_valence (v, degree, Ap);
 		report <<"   Degree of minial polynomial of AA^T = " << degree << '\n';
 		// if degree is small
@@ -536,7 +555,7 @@ namespace LinBox
 				}
 			}
 			if (Val == 1) {
-				smithFormVal (s, A, r, e);
+				smithFormVal (s, A, (long)r, e);
 				report << "Computation of the invariant factors ends." << std::endl;
 				return;
 			}
@@ -570,13 +589,13 @@ namespace LinBox
 		}
 		// bonus assigns to its rough part
 		bonus = gcd (bonus, r_mod);
-		std::vector<integer> smooth (order), rough (order);
-		smithFormSmooth (smooth, A, r, e);
+		BlasVector<Givaro::ZRing<Integer> > smooth (Z,order), rough (Z,order);
+		smithFormSmooth (smooth, A, (long)r, e);
 		smithFormRough (rough, A, bonus);
 		// fixed the rough largest invariant factor
 		if (r > 0) rough[r-1] = r_mod;
 
-		std::vector<integer>::iterator s_p, rough_p, smooth_p;
+		BlasVector<Givaro::ZRing<Integer> >::iterator s_p, rough_p, smooth_p;
 
 		/*
 		   report << "Smooth part\n";
@@ -584,15 +603,15 @@ namespace LinBox
 		   report<< *smooth_p << ' ';
 		   report<< '\n';
 		   report<<"Rough part\n";
-		   for (rough_p = rough. begin(); rough_p != rough. begin() + r; ++ rough_p)
+		   for (rough_p = rough. begin(); rough_p != rough. begin() +(ptrdiff_t) r; ++ rough_p)
 		   report<< *rough_p << ' ';
 		   report<< '\n';
 		   */
 
-		for (rough_p = rough. begin(); rough_p != rough. begin() + r; ++ rough_p)
+		for (rough_p = rough. begin(); rough_p != rough. begin() + (ptrdiff_t)r; ++ rough_p)
 			if (* rough_p == 0) *rough_p = bonus;
 
-		for (s_p = s. begin(), smooth_p = smooth. begin (), rough_p = rough. begin(); s_p != s. begin() + order; ++s_p, ++ smooth_p, ++ rough_p)
+		for (s_p = s. begin(), smooth_p = smooth. begin (), rough_p = rough. begin(); s_p != s. begin() + (ptrdiff_t)order; ++s_p, ++ smooth_p, ++ rough_p)
 			*s_p = *smooth_p * *rough_p;
 
 		report << "Computation of the invariant factors ends." << std::endl;
@@ -604,11 +623,10 @@ namespace LinBox
 #endif //__LINBOX_smith_form_adaptive_INL
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/smith-form-binary.h b/linbox/algorithms/smith-form-binary.h
index 63dc753..7646403 100644
--- a/linbox/algorithms/smith-form-binary.h
+++ b/linbox/algorithms/smith-form-binary.h
@@ -112,18 +112,16 @@ namespace LinBox
 
 			typename Vector::iterator p;
 
-			Integer zero;
 
 			long Ar = rank.rank(A);
 
 
 			report << "Rank = " << Ar <<'\n';
 
-			r.init (zero,0);
 
 			// set k-th invariant factor to zero for all k > Ar
 			for (p = sf.begin() + Ar; p!= sf.end(); ++p)
-				r.assign(*p,zero);
+				r.assign(*p,r.zero);
 
 
 			// A is a zero matrix
@@ -172,11 +170,11 @@ namespace LinBox
 			}
 
 
-			oif.oneInvariantFactor(sf[Ar - 1], A, (int)Ar, PrimeL);
+			oif.oneInvariantFactor(sf[(size_t)Ar - 1], A, (int)Ar, PrimeL);
 
 			report << "Biggest invariant factor = ";
 
-			r. write (report, sf[Ar - 1]);
+			r. write (report, sf[(size_t)Ar - 1]);
 
 			report << '\n' << std::flush;
 
@@ -221,7 +219,7 @@ namespace LinBox
 		Integer& firstInvariantFactor(Integer& fif, const IMatrix& A, const Vector& PrimeL) const
 		{
 
-			r.init(fif,0);
+			r.assign(fif,r.zero);
 
 			typename IMatrix::ConstIterator A_p;
 
@@ -245,7 +243,7 @@ namespace LinBox
 			// filter out primes in PRIME from lif
 			for ( Prime_p = PrimeL.begin(); Prime_p != PrimeL.end(); ++ Prime_p) {
 
-				r.init (p,(unsigned long) *Prime_p);
+				r.init (p, *Prime_p);
 
 				do {
 					r.quoRem(quo,rem,fif,p);
@@ -263,7 +261,7 @@ namespace LinBox
 
 
 		/** \brief Binary search invariant factors between i and j, missing those factors in PrimeL
-		 *  suppose sf[i - 1], sf [j - 1] are ith and jth invariant factor of A
+		 *  suppose sf[(size_t)i - 1], sf [j - 1] are ith and jth invariant factor of A
 		 *  i <= j
 		 */
 
@@ -282,9 +280,9 @@ namespace LinBox
 			if (j <= i + 1) return sf;
 
 			// if i-th invariant factor == j-th invariant factor
-			if (r.areEqual(sf[i - 1], sf[j - 1])) {
+			if (r.areEqual(sf[(size_t)i - 1], sf[(size_t)j - 1])) {
 				for (p = sf.begin() + i; p != sf.begin() + (j -1); ++ p)
-					r.assign (*p, sf[i-1]);
+					r.assign (*p, sf[(size_t)i-1]);
 				return sf;
 			}
 
@@ -293,11 +291,11 @@ namespace LinBox
 			report << "Start to compute " << mid << "-th invariant factor:\n" << std::flush;
 
 
-			oif.oneInvariantFactor (sf[mid - 1], A, mid, PrimeL);
+			oif.oneInvariantFactor (sf[(size_t)mid - 1], A, mid, PrimeL);
 
 
 			report << mid <<"-th invairant factor of A = " ;
-			r.write (report, sf[mid -1]);
+			r.write (report, sf[(size_t)mid -1]);
 			report << "\n" << std::flush;
 
 
@@ -327,18 +325,16 @@ namespace LinBox
 
 			typename Vector::iterator p;
 
-			Integer zero;
 
 			long Ar = rank.rank(A);
 
 
 			report << "Rank = " << Ar <<'\n';
 
-			r.init (zero,0);
 
 			// set k-th invariant factor to zero for all k > Ar
 			for (p = sf.begin() + Ar; p!= sf.end(); ++p)
-				r.assign(*p,zero);
+				r.assign(*p,r.zero);
 
 
 			// A is a zero matrix
@@ -387,11 +383,11 @@ namespace LinBox
 			}
 
 
-			oif.oneInvariantFactor(sf[Ar - 1], A, Ar, PrimeL);
+			oif.oneInvariantFactor(sf[(size_t)Ar - 1], A, Ar, PrimeL);
 
 			report << "Biggest invariant factor = ";
 
-			r. write (report, sf[Ar - 1]);
+			r. write (report, sf[(size_t)Ar - 1]);
 
 			report << '\n' << std::flush;
 
@@ -431,7 +427,7 @@ namespace LinBox
 	protected:
 
 		/** \brief Binary search invariant factors between i and j, missing those factors in PrimeL
-		 *  suppose sf[i - 1], sf [j - 1] are ith and jth invariant factor of A
+		 *  suppose sf[(size_t)i - 1], sf [j - 1] are ith and jth invariant factor of A
 		 *  i <= j
 		 */
 
@@ -450,9 +446,9 @@ namespace LinBox
 			if (j <= i + 1) return sf;
 
 			// if i-th invariant factor == j-th invariant factor
-			if (r.areEqual(sf[i - 1], sf[j - 1])) {
+			if (r.areEqual(sf[(size_t)i - 1], sf[(size_t)j - 1])) {
 				for (p = sf.begin() + i; p != sf.begin() + (j -1); ++ p)
-					r.assign (*p, sf[i-1]);
+					r.assign (*p, sf[(size_t)i-1]);
 				return sf;
 			}
 
@@ -461,17 +457,17 @@ namespace LinBox
 			report << "Start to compute " << mid << "-th invariant factor:\n" << std::flush;
 
 
-			oif.oneInvariantFactor (sf[mid - 1], A, mid, PrimeL);
+			oif.oneInvariantFactor (sf[(size_t)mid - 1], A, mid, PrimeL);
 
 
 			report << mid <<"-th invairant factor of A = " ;
-			r.write (report, sf[mid -1]);
+			r.write (report, sf[(size_t)mid -1]);
 			report << "\n" << std::flush;
 
 
 			// recursively binary search all k-invariant factors, where i <= k <= mid
 
-			if (r. areEqual (sf[mid-1], sf[j-1]))
+			if (r. areEqual (sf[(size_t)mid-1], sf[(size_t)j-1]))
 				smithFormBinarySearchBackward (sf, A, i, mid, 2 * depth, PrimeL);
 			else
 				smithFormBinarySearchBackward (sf, A, i, mid, depth, PrimeL);
diff --git a/linbox/algorithms/smith-form-iliopoulos.h b/linbox/algorithms/smith-form-iliopoulos.h
index 47231b9..c9bcc3e 100644
--- a/linbox/algorithms/smith-form-iliopoulos.h
+++ b/linbox/algorithms/smith-form-iliopoulos.h
@@ -32,10 +32,10 @@
 namespace LinBox
 {
 
-	/** \brief This is Iliopoulos' algorithm do diagonalize.
+	/** \brief This is Iliopoulos' algorithm to diagonalize.
 
-	 * Compute Smith Form by elimination modulo m, for some modulus m such
-	 * as S(n), the last invariant factor.
+	 * Compute Smith Form by elimination modulo m,
+	 * for m = S(n), the last invariant factor.
 	 * The elimination method is originally described in
 	 * @bib
 	 * <i>Worst Case Complexity Bounds on Algorithms for computing the Canonical
@@ -49,7 +49,9 @@ namespace LinBox
 	protected:
 		/** \brief eliminationRow will make the first row (*, 0, ..., 0)
 		 *  by col operations.
-		 *  It is the implementation of Iliopoulos algorithm
+		 *  It is the implementation of Iliopoulos algorithm.
+		 *  A Ring has basic ring functions 
+		 *  plus gcd, xgcd, isDivisor, isUnit, normalIn
 		 */
 		template<class Matrix, class Ring>
 		static Matrix& eliminationRow (Matrix& A, const Ring& r)
@@ -106,7 +108,10 @@ namespace LinBox
 
 					Element g, s, t;
 
-					r. dxgcd (g, s, t, y2, y1, *row_p1, *row_p2);
+					//r. dxgcd (g, s, t, y2, y1, *row_p1, *row_p2);
+					r. xgcd (g, s, t, *row_p1, *row_p2);
+					r.div(y2, *row_p1, g);
+					r.div(y1, *row_p2, g);
 
 					r. negin (y1);
 
@@ -143,7 +148,7 @@ namespace LinBox
 
 				typename std::vector<Element>::iterator p1, p2;
 
-				r. init(tmp_v[0], 1);
+				r. assign(tmp_v[0], r.one);
 
 				p1 = tmp_v.begin() + 1;
 				p2 = tmp_v.begin() + 1;
@@ -154,7 +159,7 @@ namespace LinBox
 
 				r.assign(g, *row_p2); ++ row_p2;
 
-				r.init(*p1, 1); ++ p1;
+				r.assign(*p1, r.one); ++ p1;
 
 				for (; row_p2 != cur_r -> end(); ++ row_p2, ++ p1) {
 
@@ -183,7 +188,7 @@ namespace LinBox
 
 
 			// after finding the pivot
-			// column operation to make A[p][j] = 0, where k < j
+			// column operation to make A[p][(size_t)j] = 0, where k < j
 
 
 			Element g, tmp;
@@ -265,7 +270,10 @@ namespace LinBox
 
 					col_p2 = col_p1 + 1;
 
-					r.dxgcd(g, s, t, y2, y1, *col_p1, *col_p2);
+					//r.dxgcd(g, s, t, y2, y1, *col_p1, *col_p2);
+					r. xgcd (g, s, t, *col_p1, *col_p2);
+					r.div(y2, *col_p1, g);
+					r.div(y1, *col_p2, g);
 
 					r. negin (y1);
 
@@ -309,11 +317,11 @@ namespace LinBox
 
 				r.assign (g, *col_p2); ++ col_p2;
 
-				r. init (tmp_v[0], 1);
+				r. assign(tmp_v[0], r.one);
 
 				p1 = tmp_v.begin() + 1;
 
-				r.init(*p1,1); ++ p1;
+				r.assign(*p1,r.one); ++ p1;
 
 				for(; col_p2 != cur_c -> end(); ++ col_p2, ++ p1) {
 
@@ -377,7 +385,7 @@ namespace LinBox
 			cur_r = A.rowBegin();
 			row_p = cur_r -> begin();
 
-			tmp = * (A.rowBegin() -> begin());
+			tmp = *row_p;// (A.rowBegin() -> begin());
 
 			if (r.isZero(tmp)) return true;
 
@@ -399,14 +407,15 @@ namespace LinBox
 
 			if (A.rowdim() == 0 || A.coldim() == 0) return A;
 
-
-			do {
+			//eliminationCol (A, r);
+			//if (!check(A, r))
+			  do {
 
 				eliminationRow (A, r);
 
 				eliminationCol (A, r);
-			}
-			while (!check(A, r));
+			  }
+			  while (!check(A, r));
 
 			typedef typename SubMatrixTraits<Matrix>::value_type sub_mat_t ;
 
@@ -422,6 +431,17 @@ namespace LinBox
 
 	public:
 
+		template <class Vector,class Matrix>
+		static void solve(Vector& factors,const Matrix& A)
+		{
+			Matrix B(A);
+			smithFormIn(B);
+			factors.resize(B.rowdim());
+			for (int i=0;i<B.rowdim();++i) {
+				A.field().assign(factors[i],B.getEntry(i,i));
+			}
+		}
+
 		template<class Matrix>
 		static  Matrix& smithFormIn(Matrix& A) {
 
@@ -432,12 +452,6 @@ namespace LinBox
 
 			typename Matrix::RowIterator row_p;
 
-			Element zero, one;
-
-			r. init (zero, 0);
-
-			r. init (one, 1);
-
 			diagonalizationIn(A, r);
 
 			int min = (int)(A.rowdim() <= A.coldim() ? A.rowdim() : A.coldim());
@@ -450,25 +464,25 @@ namespace LinBox
 
 				for ( j = i + 1; j < min; ++ j) {
 
-					if (r. isUnit(A[i][i]))  break;
+					if (r. isUnit(A[(size_t)i][(size_t)i]))  break;
 
-					else if (r. isZero (A[j][j])) continue;
+					else if (r. isZero (A[(size_t)j][(size_t)j])) continue;
 
-					else if (r. isZero (A[i][i])) {
-						std::swap (A[i][i], A[j][j]);
+					else if (r. isZero (A[(size_t)i][(size_t)i])) {
+						std::swap (A[(size_t)i][(size_t)i], A[(size_t)j][(size_t)j]);
 					}
 
 					else {
-						r. gcd (g, A[j][j], A[i][i]);
+						r. gcd (g, A[(size_t)j][(size_t)j], A[(size_t)i][(size_t)i]);
 
-						r. divin (A[j][j], g);
+						r. divin (A[(size_t)j][(size_t)j], g);
 
-						r. mulin (A[j][j], A[i][i]);
+						r. mulin (A[(size_t)j][(size_t)j], A[(size_t)i][(size_t)i]);
 
-						r. assign (A[i][i], g);
+						r. assign (A[(size_t)i][(size_t)i], g);
 					}
 				}
-				r. normalIn (A[i][i]);
+				r. normalIn (A[(size_t)i][(size_t)i]);
 			}
 
 			return A;
diff --git a/linbox/algorithms/smith-form-iliopoulos2.h b/linbox/algorithms/smith-form-iliopoulos2.h
new file mode 100644
index 0000000..25f794b
--- /dev/null
+++ b/linbox/algorithms/smith-form-iliopoulos2.h
@@ -0,0 +1,468 @@
+/* Copyright (C) 2015 LinBox
+ *
+ *  Author: Gavin Harrison
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_smith_form_iliopoulos2_H
+#define __LINBOX_smith_form_iliopoulos2_H
+
+namespace LinBox
+{
+
+template<class _Field>
+class IliopoulosDomain {
+public:
+	typedef _Field Field;
+	typedef MatrixDomain<Field> Domain;
+	typedef typename Domain::OwnMatrix Matrix;
+	typedef typename Field::Element Element;
+
+protected:
+	Domain _MD;
+	Field _F;
+
+public:
+	void xgcd(
+		Element &g,
+		std::vector<Element> &ts,
+		const std::vector<Element> &as)
+	{
+		ts.resize(as.size());
+		_F.assign(ts[0], _F.one);
+		_F.assign(g, as[0]);
+		
+		for (size_t i = 1; i < as.size(); i++) {
+			Element r, t1, t2;
+			_F.gcd(r, t1, t2, g, as[i]);
+			
+			for (size_t j = 0; j < i; j++) {
+				_F.mulin(ts[j], t1);
+			}
+			
+			_F.assign(ts[i], t2);
+			_F.assign(g, r);
+		}
+	}
+	
+	void swapRows(Matrix &A, size_t a, size_t b)
+	{
+		size_t n = A.coldim();
+		
+		Element tmp1, tmp2;
+		for (size_t i = 0; i < n; i++) {
+			A.getEntry(tmp1, a, i);
+			A.getEntry(tmp2, b, i);
+			
+			A.setEntry(a, i, tmp2);
+			A.setEntry(b, i, tmp1);
+		}
+	}
+	
+	void swapCols(Matrix &A, size_t a, size_t b)
+	{
+		size_t n = A.coldim();
+		
+		Element tmp1, tmp2;
+		for (size_t i = 0; i < n; i++) {
+			A.getEntry(tmp1, i, a);
+			A.getEntry(tmp2, i, b);
+			
+			A.setEntry(i, a, tmp2);
+			A.setEntry(i, b, tmp1);
+		}
+	}
+	
+	bool isRowZero(const Matrix &A, size_t p)
+	{
+		size_t n = A.coldim();
+		
+		Element tmp;
+		for (size_t i = p; i < n; i++) {
+			if (!_F.isZero(_MD.getEntry(tmp, p, i))) {
+				return false;
+			}
+		}
+		
+		return true;
+	}
+	
+	bool moveNonzeroRowToPivot(Matrix &A, size_t p)
+	{
+		size_t n = A.coldim();
+		
+		if (!isRowZero(A, p)) {
+			return true;
+		}
+		
+		for (size_t i = p; i < n; i++) {
+			if (!isRowZero(A, i)) {
+				swapRows(A, p, i);
+				return true;
+			}
+		}
+		
+		return false;
+	}
+	
+	bool moveZeroColToPivot(Matrix &A, size_t p)
+	{
+		size_t n = A.coldim();
+		
+		Element tmp;
+		if (_F.isZero(A.getEntry(tmp, p, p))) {
+			return true;
+		}
+		
+		for (size_t i = p+1; i < n; i++) {
+			if (_F.isZero(A.getEntry(tmp, p, i))) {
+				swapCols(A, p, i);
+				return true;
+			}
+		}
+		
+		return false;
+	}
+	
+	void makePivotColZero(Matrix &A, size_t p)
+	{
+		Element r, x1, x2, y1, y2, a, b;
+		
+		A.getEntry(a, p, p);
+		A.getEntry(b, p, p+1);
+		
+		_F.gcd(r, x1, x2, a, b);
+		
+		_F.div(y1, b, r);
+		_F.div(y2, a, r);
+		_F.negin(y2);
+		
+		size_t n = A.coldim();
+		
+		for (size_t i = 0; i < n; i++) {
+			A.getEntry(a, i, p);
+			A.getEntry(b, i, p+1);
+			
+			Element new_a, new_b, tmp;
+			_F.mul(tmp, y1, a);
+			_F.mul(new_a, y2, b);
+			_F.addin(new_a, tmp);
+			
+			_F.mul(tmp, x1, a);
+			_F.mul(new_b, x2, b);
+			_F.addin(new_b, tmp);
+			
+			A.setEntry(i, p, new_a);
+			A.setEntry(i, p+1, new_b);
+		}
+	}
+	
+	void makePivotRowZero(Matrix &A, size_t p)
+	{
+		Element r, x1, x2, y1, y2, a, b;
+		
+		A.getEntry(a, p, p);
+		A.getEntry(b, p+1, p);
+		
+		_F.gcd(r, x1, x2, a, b);
+		_F.div(y1, b, r);
+		_F.div(y2, a, r);
+		_F.negin(y2);
+		
+		size_t n = A.rowdim();
+		
+		for (size_t i = 0; i < n; i++) {
+			A.getEntry(a, p, i);
+			A.getEntry(b, p+1, i);
+			
+			Element new_a, new_b, tmp;
+			_F.mul(tmp, y1, a);
+			_F.mul(new_a, y2, b);
+			_F.addin(new_a, tmp);
+			
+			_F.mul(tmp, x1, a);
+			_F.mul(new_b, x2, b);
+			_F.addin(new_b, tmp);
+			
+			A.setEntry(p, i, new_a);
+			A.setEntry(p+1, i, new_b);
+		}
+	}
+	
+	void scaleAndAddColsToPivotCol(
+		Matrix &A,
+		const std::vector<Element> &ts,
+		size_t p)
+	{	
+		size_t n = A.coldim();
+		
+		// Add cols p+1 to n into p, scaled by ts[i]
+		for (size_t j = p; j < n; j++) {
+			Element a;
+			A.getEntry(a, j, p);
+			
+			for (size_t i = p+1; i < n; i++) {
+				Element b, tmp;
+				A.getEntry(b, j, i);
+				_F.mulin(b, ts[i - p - 1]);
+				_F.addin(a, b);
+			}
+			
+			A.setEntry(j, p, a);
+		}
+	}
+	
+	void eliminateOffPivotCols(Matrix &A, Element &s, size_t p)
+	{
+		size_t n = A.coldim();
+		
+		// zero out other columns entry in pivot row
+		for (size_t i = p+1; i < n; i++) {
+			Element q;
+			A.getEntry(q, p, i);
+			_F.divin(q, s);
+			
+			for (size_t j = p; j < n; j++) {
+				Element a, b, tmp;
+				A.getEntry(a, j, p);
+				A.getEntry(b, j, i);
+				_F.mul(tmp, a, q);
+				_F.subin(b, tmp);
+				A.setEntry(j, i, b);
+			}
+		}
+	}
+	
+	void reduceEntries(Matrix &A, const Element &d, size_t p)
+	{
+		size_t n = A.coldim();
+		
+		// reduce entries mod d
+		for (size_t i = p; i < n; i++) {
+			for (size_t j = p; j < n; j++) {
+				Element tmp;
+				A.getEntry(tmp, i, j);
+				_F.modin(tmp, d);
+				A.setEntry(i, j, tmp);
+			}
+		}
+	}
+	
+	void eliminateRow(Matrix &A, const Element &d, size_t p)
+	{
+		size_t n = A.coldim();
+		
+		if (!moveZeroColToPivot(A, p)) {
+			makePivotColZero(A, p);
+		}
+		
+		std::vector<Element> ks;
+		for (size_t i = p+1; i < n; i++) {
+			Element tmp;
+			A.getEntry(tmp, p, i);
+			ks.push_back(tmp);
+		}
+		
+		Element s;
+		std::vector<Element> ts;
+		xgcd(s, ts, ks);
+		
+		scaleAndAddColsToPivotCol(A, ts, p);
+		
+		eliminateOffPivotCols(A, s, p);
+		
+		reduceEntries(A, d, p);
+	}
+	
+	bool moveZeroRowToPivot(Matrix &A, size_t p)
+	{
+		size_t n = A.rowdim();
+		
+		for (size_t i = p+1; i < n; i++) {
+			Element tmp;
+			A.getEntry(tmp, i, p);
+			
+			if (_F.isZero(tmp)) {
+				swapRows(A, p, i);
+				return true;
+			}
+		}
+		
+		return false;
+	}
+	
+	void scaleAndAddRowsToPivotRow(
+		Matrix &A,
+		const std::vector<Element> &ts,
+		size_t p)
+	{	
+		size_t n = A.coldim();
+		
+		// Add rows p+1 to n into p, scaled by ts[i]
+		for (size_t j = p; j < n; j++) {
+			Element a;
+			A.getEntry(a, p, j);
+			
+			for (size_t i = p+1; i < n; i++) {
+				Element b, tmp;
+				A.getEntry(b, i, j);
+				_F.mulin(b, ts[i - p - 1]);
+				_F.addin(a, b);
+			}
+			
+			A.setEntry(p, j, a);
+		}
+	}
+	
+	void eliminateOffPivotRows(Matrix &A, Element &s, size_t p)
+	{
+		size_t n = A.coldim();
+		
+		// zero out other rows entry in pivot col
+		for (size_t i = p+1; i < n; i++) {
+			Element q;
+			A.getEntry(q, i, p);
+			_F.divin(q, s);
+			
+			for (size_t j = p; j < n; j++) {
+				Element a, b, tmp;
+				A.getEntry(a, p, j);
+				A.getEntry(b, i, j);
+				_F.mul(tmp, a, q);
+				_F.subin(b, tmp);
+				A.setEntry(i, j, b);
+			}
+		}
+	}
+	
+	void eliminateCol(Matrix &A, const Element &d, size_t p)
+	{
+		size_t n = A.coldim();
+		
+		if (!moveZeroRowToPivot(A, p)) {
+			makePivotRowZero(A, p);
+		}
+		
+		std::vector<Element> ks;
+		for (size_t i = p+1; i < n; i++) {
+			Element tmp;
+			A.getEntry(tmp, i, p);
+			ks.push_back(tmp);
+		}
+		ks.push_back(d);
+		
+		Element s;
+		std::vector<Element> ts;
+		xgcd(s, ts, ks);
+		
+		scaleAndAddRowsToPivotRow(A, ts, p);
+		A.setEntry(p, p, s);
+		
+		eliminateOffPivotRows(A, s, p);
+		
+		reduceEntries(A, d, p);
+	}
+	
+	bool pivotDividesRow(Matrix &A, size_t p)
+	{
+		size_t n = A.coldim();
+		
+		Element a;
+		A.getEntry(a, p, p);
+		
+		for (size_t i = p+1; i < n; i++) {
+			Element b;
+			A.getEntry(b, p, i);
+			
+			if (!_F.isDivisor(b, a)) {
+				return false;
+			}
+		}
+		
+		return true;
+	}
+	
+	void zeroOutRow(Matrix &A, size_t p)
+	{
+		size_t n = A.coldim();
+		
+		for (size_t i = p+1; i < n; i++) {
+			A.setEntry(p, i, _F.zero);
+		}
+	}
+
+public:
+	IliopoulosDomain(Field &F) :
+		_MD(F),
+		_F(F)
+	{
+	}
+	
+	void smithFormIn(Matrix &A, const Element &d)
+	{
+		size_t n = A.coldim();
+		
+		for (size_t p = 0; p < n - 1; p++) {
+			do {
+				eliminateRow(A, d, p);
+				eliminateCol(A, d, p);
+			} while(!pivotDividesRow(A, p));
+			zeroOutRow(A, p);
+		}
+		
+		for (size_t p = 0; p < n; p++) {
+			for (size_t q = p+1; q < n; q++) {
+				Element h;
+				A.getEntry(h, p, p);
+				
+				Element Aqq;
+				A.getEntry(Aqq, q, q);
+				
+				Element App;
+				_F.gcd(App, Aqq, h);
+				_F.divin(h, App);
+				_F.mulin(Aqq, h);
+				
+				A.setEntry(p, p, App);
+				A.setEntry(q, q, Aqq);
+			}
+		}
+	}
+	
+	template <class PolyRingVector>
+	void smithForm(PolyRingVector &diag, const Matrix &A, const Element &d)
+	{
+		size_t n = A.coldim();
+		
+		Matrix B(_F, n, n);
+		_MD.copy(B, A);
+		
+		smithFormIn(B, d);
+		
+		for (int i = 0; i < n; i++) {
+			B.getEntry(diag[i], i, i);
+			_F.normalizeIn(diag[i]);
+		}
+	}
+};
+
+}
+
+#endif //__LINBOX_smith_form_iliopoulos2_H
\ No newline at end of file
diff --git a/linbox/algorithms/smith-form-kannan-bachem.h b/linbox/algorithms/smith-form-kannan-bachem.h
new file mode 100644
index 0000000..b3daeb5
--- /dev/null
+++ b/linbox/algorithms/smith-form-kannan-bachem.h
@@ -0,0 +1,358 @@
+
+/* tests/__LINBOX_smith_form_kannan_bachem.h
+ * Copyright (C) 2014 Gavin Harrison,
+ *
+ * Written by Gavin Harrison <gmh33 at drexel.edu>,
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+#include <iostream>
+#include "linbox/matrix/dense-matrix.h"
+
+#ifndef __LINBOX_smith_form_kannan_bachem_domain_H
+#define __LINBOX_smith_form_kannan_bachem_domain_H
+
+namespace LinBox
+{
+	template<class MatrixDomain>
+	class SmithFormKannanBachemDomain
+	{
+	public:
+		typedef typename MatrixDomain::Field Field;
+		typedef typename Field::Element Element;
+		typedef BlasMatrix<Field> Rep;
+
+	private:
+		MatrixDomain _MD;
+		const Field &field() const { return _MD.field(); }
+
+	public:
+		SmithFormKannanBachemDomain(const MatrixDomain &MD) : _MD(MD) {}
+		SmithFormKannanBachemDomain(const SmithFormKannanBachemDomain &D) : _MD(D._MD) {}
+
+	private:
+		void swapRows(Rep &A, int a, int b) const
+		{
+			for (size_t i = 0; i < A.coldim(); i++)
+			{
+				Element tmp1, tmp2;
+
+				A.getEntry(tmp1, a, i);
+				A.getEntry(tmp2, b, i);
+
+				A.setEntry(a, i, tmp2);
+				A.setEntry(b, i, tmp1);
+			}
+		}
+
+		void swapCols(Rep &A, int a, int b) const
+		{
+			for (size_t i = 0; i < A.rowdim(); i++)
+			{
+				Element tmp1, tmp2;
+
+				A.getEntry(tmp1, i, a);
+				A.getEntry(tmp2, i, b);
+
+				A.setEntry(i, a, tmp2);
+				A.setEntry(i, b, tmp1);
+			}
+		}
+
+		// Ensures that if a=b then s=u=v=1 and t=0 to avoid an infinite loop
+		void dxgcd(Element &s, Element &t, Element &u, Element &v, const Element &a, const Element &b) const
+		{
+			if (field().areEqual(a,b))
+			{
+				field().assign(s, field().one);
+				field().assign(t, field().zero);
+				field().assign(u, field().one);
+				field().assign(v, field().one);
+				return;
+			}
+
+			Element g;
+			field().dxgcd(g,s,t,u,v,a,b);
+		}
+
+		bool findPivot(Rep &A, size_t n) const
+		{
+			for (size_t i = n; i < A.rowdim(); i++)
+			{
+				for (size_t j = n; j < A.coldim(); j++)
+				{
+					Element tmp;
+					A.getEntry(tmp, i, j);
+
+					if (!field().isZero(tmp))
+					{
+						if (i != n)
+							swapRows(A, n, i);
+
+						if (j != n)
+							swapCols(A, n, j);
+
+						return true;
+					}
+				}
+			}
+
+			return false;
+		}
+
+		void eliminateCol(Rep &A, int p, int o) const
+		{
+			Element pp, op;
+
+			A.getEntry(op, o, p);
+
+			if (field().isZero(op))
+				return;
+
+			A.getEntry(pp, p, p);
+
+			Element s,t,u,v;
+			dxgcd(s,t,u,v,pp,op);
+
+			for (size_t i = p; i < A.coldim(); i++)
+			{
+				Element pi,oi;
+
+				A.getEntry(pi, p, i);
+				A.getEntry(oi, o, i);
+
+				Element tmp1, tmp2;
+				field().mul(tmp1, s, pi);
+				field().mul(tmp2, t, oi);
+				field().addin(tmp1, tmp2);
+				A.setEntry(p, i, tmp1);
+
+				field().mul(tmp1, pi, v);
+				field().mul(tmp2, oi, u);
+				field().subin(tmp2, tmp1);
+				A.setEntry(o, i, tmp2);
+			}
+		}
+
+		void eliminateRow(Rep &A, int p, int o) const
+		{
+			Element pp, po;
+
+			A.getEntry(po, p, o);
+
+			if (field().isZero(po))
+				return;
+
+			A.getEntry(pp, p, p);
+
+			Element s,t,u,v;
+			dxgcd(s,t,u,v,pp,po);
+
+			for (size_t i = p; i < A.rowdim(); i++)
+			{
+				Element ip, io;
+
+				A.getEntry(ip, i, p);
+				A.getEntry(io, i, o);
+
+				Element tmp1, tmp2;
+
+				field().mul(tmp1, ip, s);
+				field().mul(tmp2, io, t);
+				field().addin(tmp1, tmp2);
+				A.setEntry(i, p, tmp1);
+
+				field().mul(tmp1, ip, v);
+				field().mul(tmp2, io, u);
+				field().subin(tmp2, tmp1);
+				A.setEntry(i, o, tmp2);
+			}
+		}
+
+		void reduceOffDiagonal(Rep &A, int s, int e) const
+		{
+			for (int i = s; i <= e; i++)
+			{
+				Element nii,ii;
+				A.getEntry(ii, i, i);
+				field().normalize(nii,ii);
+
+				Element tmp;
+				field().div(tmp, nii, ii);
+
+				if (field().isOne(tmp))
+					continue;
+
+				// A[i] = A[i,i] * n
+				// where n = normalized(A[i,i]) / A[i,i]
+				A.setEntry(i, i, nii);
+				for (size_t j = i+1; j < A.coldim(); j++)
+				{
+					Element ij;
+					A.getEntry(ij, i, j);
+					field().mulin(ij, tmp);
+					A.setEntry(i, j, ij);
+				}
+			}
+
+			// Ording of reduction here is an improvement to Kannan/Bachem
+			// Introduced by Chou/Collins '82
+			// Reduce from bottom to top and left to right
+			// * 4 5 6
+			// 0 * 2 3
+			// 0 0 * 1
+			// 0 0 0 *
+			for (int i = e-1; i >= s; i--)
+			{
+				for (int j = i+1; j <= e; j++)
+				{
+					Element jj, ij, tmp;
+
+					A.getEntry(ij, i, j);
+					if (field().isZero(ij))
+						continue;
+
+					A.getEntry(jj, j, j);
+					field().quo(tmp, ij, jj);
+
+					// A[i] = A[i] - quo(A[i,j], A[j,j]) * A[j]
+					for (size_t k = j; k < A.coldim(); k++)
+					{
+						Element ik, jk;
+
+						A.getEntry(ik, i, k);
+						A.getEntry(jk, j, k);
+
+						field().mulin(jk, tmp);
+						field().subin(ik, jk);
+
+						A.setEntry(i, k, ik);
+					}
+				}
+			}
+		}
+
+		// Puts the lower-right n-by-n minor of A into Hermite Normal Form
+		void hermite(Rep &A, int n) const
+		{
+			int dim = (int)A.rowdim();
+
+			for (int i = n; i < dim; i++)
+			{
+				for (int j = n; j < i; j++)
+					eliminateCol(A, j, i);
+
+				if (!findPivot(A, i))
+					return;
+
+				reduceOffDiagonal(A, n, i);
+			}
+		}
+
+		bool isRowDiagonalized(const Rep &A, int n) const
+		{
+			for (size_t i = n+1; i < A.coldim(); i++)
+			{
+				Element ni;
+				A.getEntry(ni, n, i);
+				if (!field().isZero(ni))
+					return false;
+			}
+			return true;
+		}
+
+		bool pivotDividesRemaining(Rep &A, int n) const
+		{
+			Element nn;
+			A.getEntry(nn, n, n);
+
+			for (size_t i = n+1; i < A.rowdim(); i++)
+			{
+				for (size_t j = i; j < A.coldim(); j++)
+				{
+					Element ij, g;
+					A.getEntry(ij, i, j);
+
+					if (field().isZero(ij))
+						continue;
+
+					field().gcd(g, nn, ij);
+
+					if (!field().areAssociates(g, nn))
+					{
+						// Add row i to row n
+						for (size_t k = i; k < A.coldim(); k++)
+						{
+							Element ik;
+							A.getEntry(ik, i, k);
+							A.setEntry(n, k, ik);
+						}
+						return false;
+					}
+				}
+			}
+
+			return true;
+		}
+
+	public:
+		template<class Vector>
+		Vector &solve(Vector &S, const Rep &A) const
+		{
+			size_t dim = A.rowdim();
+			linbox_check(A.coldim() == dim && S.size() >= dim);
+
+			Rep B(A);
+
+			for (size_t i = 0; i < dim;)
+			{
+				if (!findPivot(B, i))
+					break;
+
+				for (size_t j = i+1; j < dim; j++)
+					eliminateRow(B, i, j);
+
+				hermite(B, i);
+
+				if (!isRowDiagonalized(B, i))
+					continue;
+
+				if (!pivotDividesRemaining(B, i))
+					continue;
+
+				i++;
+				
+				//std::cout << i << "/" << dim << std::endl;
+			}
+
+			for (size_t i = 0; i < dim; i++)
+			{
+				Element ii;
+				B.getEntry(ii, i, i);
+				S.setEntry(i, ii);
+			}
+
+			return S;
+		}
+	};
+}
+
+#endif // __LINBOX_smith_form_kannan_bachem_domain_H
diff --git a/linbox/algorithms/smith-form-local.h b/linbox/algorithms/smith-form-local.h
index fa2f161..ff85ac6 100644
--- a/linbox/algorithms/smith-form-local.h
+++ b/linbox/algorithms/smith-form-local.h
@@ -5,20 +5,20 @@
  *
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -34,7 +34,7 @@
 //#include <algorithm>
 
 // #include "linbox/field/multimod-field.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
 
 namespace LinBox
 {
@@ -55,7 +55,7 @@ namespace LinBox
 		template<class Matrix>
 		std::list<Elt>& operator()(std::list<Elt>& L, Matrix& A, const LocalPID& R)
 		{
-			Elt d; R.init(d, 1);
+			Elt d; R.assign(d,R.one);
 			return smithStep(L, d, A, R);
 		}
 
@@ -63,10 +63,9 @@ namespace LinBox
 		std::list<Elt>& smithStep(std::list<Elt>& L, Elt& d, Matrix& A, const LocalPID& R)
 		{
 
-			//std::cout << "Dimension: " << A.rowdim() << " " << A.coldim() <<"\n";
 			if ( A.rowdim() == 0 || A.coldim() == 0 ) return L;
 
-			Elt g; R.init(g, 0);
+			Elt g; R.assign(g, R.zero);
 			typename Matrix::RowIterator p;
 			typename Matrix::Row::iterator q, r;
 			for ( p = A.rowBegin(); p != A.rowEnd(); ++p) {
diff --git a/linbox/algorithms/smith-form-local2.inl b/linbox/algorithms/smith-form-local2.inl
index 83cfab3..0a155b7 100644
--- a/linbox/algorithms/smith-form-local2.inl
+++ b/linbox/algorithms/smith-form-local2.inl
@@ -5,20 +5,20 @@
  *
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -34,7 +34,7 @@
 #include <list>
 //#include <algorithm>
 
-#include "linbox/field/local2_32.h"
+#include "linbox/ring/local2_32.h"
 
 namespace LinBox
 {
@@ -54,7 +54,8 @@ namespace LinBox
 
 		template<class Matrix>
 		std::list<Elt>& operator()(std::list<Elt>& L, Matrix& A, const LocalPIR& R)
-		{   Elt d; R.init(d, 1);
+		{
+			Elt d; R.assign(d, R.one);
 			Elt *p = &(A[0][0]);
 			return smithStep(L, d, p, A.rowdim(), A.coldim(), A.getStride(), R);
 		}
@@ -65,8 +66,8 @@ namespace LinBox
 			if ( m == 0 || n == 0 )
 				return L;
 
-			LocalPIR::Exponent g = LocalPIR::Exponent(32); //R.init(g, 0); // must change to 2^31 maybe.
-			size_t i, j, k;
+			LocalPIR::Exponent g = LocalPIR::Exponent(32); //R.init(g); // must change to 2^31 maybe.
+			size_t i, j;
 			/* Arguably this search order should be reversed to increase the likelyhood of no col swap,
 			   assuming row swaps cheaper.  Not so, however on my example. -bds 11Nov */
 			for ( i = 0; i != m; ++i)
@@ -83,13 +84,13 @@ namespace LinBox
 				L.insert(L.end(), (m < n) ? m : n, 0);
 				return L;
 			}
-			if ( i != m ) // g is a unit and, because this is a local ring, 
+			if ( i != m ) // g is a unit and, because this is a local ring,
 			// value at which this first happened also is a unit.
 			{ // put pivot in 0,0 position
 				if ( i != 0 ) // swap rows
 					std::swap_ranges(Ap, Ap+n, Ap + i*stride);
 				if ( j != 0 ) // swap cols
-					for(k = 0; k != m; ++k)
+					for(size_t k = 0; k != m; ++k)
 						std::swap(Ap[k*stride + 0], Ap[k*stride + j]);
 
 				// elimination step - crude and for dense only - fix later
diff --git a/linbox/algorithms/smith-form-sparseelim-local.h b/linbox/algorithms/smith-form-sparseelim-local.h
index f108890..83e9af1 100644
--- a/linbox/algorithms/smith-form-sparseelim-local.h
+++ b/linbox/algorithms/smith-form-sparseelim-local.h
@@ -53,7 +53,7 @@ namespace LinBox
     template <> struct Boolean_Trait<false> {
         typedef float BooleanType;// float does not matter, only that it differs from int
     };
-    
+
     enum {
         PRIVILEGIATE_NO_COLUMN_PIVOTING	= 1,
         PRIVILEGIATE_REDUCING_FILLIN	= 2,
@@ -90,36 +90,36 @@ namespace LinBox
 		template<class Modulu>
 		bool isNZero(const Modulu& a ) const { return (bool)a ;}
 		template<class Modulu>
-		bool isZero(const Modulu& a ) const { return a == 0UL;}
+		bool isZero(const Modulu& a ) const { return a == 0U;}
 
-		template<class Modulo, class Modulo2>
-		Modulo& MY_Zpz_inv (Modulo& u1, const Modulo2 a, const Modulo2 _p) const
+		template<class Modulo, class Modulo2, class Modulo3>
+		Modulo& MY_Zpz_inv (Modulo& u1, const Modulo2 a, const Modulo3 _p) const
 		{
-                    u1 = Modulo(1UL);
-                    Modulo r0(_p), r1(a);
+                    u1 = Modulo(1U);
+                    Modulo r0((Modulo)_p), r1((Modulo)a); //! clang complains for examples/smith.C and examples/smithvalence.C
                     Modulo q(r0/r1);
-                    
+
                     r0 -= q * r1;
                     if ( isZero(r0) ) return u1;
                     Modulo u0 = q;
-                    
+
                     q = r1/r0;
                     r1 -= q * r0;
-                    
+
                     while ( isNZero(r1) ) {
                         u1 += q * u0;
-                        
+
                         q = r0/r1;
                         r0 -= q * r1;
                         if ( isZero(r0) ) return u1;
                         u0 += q * u1;
-                        
+
                         q = r1/r0;
                         r1 -= q * r0;
-                        
+
                     }
-                    
-                    return u1=_p-u0;
+
+                    return u1=(Modulo)_p-u0;
                 }
 		template<class Modulo, class Modulo2>
 		Modulo MY_Zpz_inv (const Modulo a, const Modulo2 _p) const
@@ -143,9 +143,9 @@ namespace LinBox
         template<class Modulo, class Vecteur>
         void SameColumnPivoting(Modulo PRIME,  const Vecteur& lignepivot, unsigned long& indcol, long& indpermut, Boolean_Trait<true>::BooleanType ) {
                 // Try first in the same column
-			unsigned long nj =  lignepivot.size() ;
+			unsigned long nj = (unsigned long)  lignepivot.size() ;
 			if (nj && (indcol == lignepivot[0].first) && (! this->MY_divides(PRIME,lignepivot[0].second) ) ) {
-                indpermut = indcol;
+                indpermut = (long) indcol;
                 ++indcol;
             }
         }
@@ -160,8 +160,8 @@ namespace LinBox
         bool SameColumnPivotingTrait(Modulo PRIME, unsigned long& p, const BB& LigneA, const Mmap& psizes, unsigned long& indcol, long& c, Boolean_Trait<true>::BooleanType truetrait) {
             c=-2;
             for( typename Mmap::const_iterator iter = psizes.begin(); iter != psizes.end(); ++iter) {
-                p = (*iter).second;
-                SameColumnPivoting(PRIME, LigneA[p], indcol, c, truetrait ) ;
+                p = (unsigned long)(*iter).second;
+                SameColumnPivoting(PRIME, LigneA[(size_t)p], indcol, c, truetrait ) ;
                 if (c > -2 ) break;
             }
             if (c > -2)
@@ -174,10 +174,10 @@ namespace LinBox
 		template<class Vecteur>
 		void CherchePivot( Vecteur& lignepivot, unsigned long& indcol , long& indpermut )
 		{
-			unsigned long nj =  lignepivot.size() ;
+			unsigned long nj =  (unsigned long)lignepivot.size() ;
 			if (nj) {
-				indpermut= lignepivot[0].first;
-				if (indpermut != indcol)
+				indpermut= (long)lignepivot[0].first;
+				if (indpermut != (long)indcol)
 					lignepivot[0].first = (indcol);
 				++indcol;
 			}
@@ -192,33 +192,35 @@ namespace LinBox
 		{
 			typedef typename Vecteur::value_type E;
 			typedef typename Field::Element F;
-			long nj =  lignepivot.size() ;
+			long nj =(long)  lignepivot.size() ;
 			if (nj) {
-				indpermut = lignepivot[0].first;
+				indpermut = (long)lignepivot[0].first;
 				long pp=0;
 				for(;pp<nj;++pp)
-					if (! this->MY_divides(PRIME,lignepivot[pp].second) ) break;
+					if (! this->MY_divides(PRIME,lignepivot[(size_t)pp].second) ) break;
 
 				if (pp < nj) {
 
-					long ds = columns[ lignepivot[pp].first ],dl,p=pp,j=pp;
-					for(++j;j<nj;++j)
-						if ( ( (dl=columns[lignepivot[j].first] ) < ds ) && (! MY_divides(PRIME,lignepivot[j].second) ) ) {
+					long ds = (long)columns[ lignepivot[(size_t)pp].first ],p=pp,j=pp;
+					for(++j;j<nj;++j){
+						long dl;
+						if ( ( (dl=(long)columns[(size_t)lignepivot[(size_t)j].first] ) < ds ) && (! MY_divides(PRIME,lignepivot[(size_t)j].second) ) ) {
 							ds = dl;
 							p = j;
 						}
+					}
 					if (p != 0) {
 						if (indpermut == (long)indcol) {
-							F ttm = lignepivot[p].second;
-							indpermut = lignepivot[p].first;
-							lignepivot[p].second = (lignepivot[0].second);
+							F ttm = (F)lignepivot[(size_t)p].second;
+							indpermut = (long)lignepivot[(size_t)p].first;
+							lignepivot[(size_t)p].second = (lignepivot[0].second);
 							lignepivot[0].second = (ttm);
 						}
 						else {
-							E ttm = lignepivot[p];
-							indpermut = ttm.first;
+							E ttm = (E) lignepivot[(size_t)p];
+							indpermut = (long)ttm.first;
 							for(long m=p;m;--m)
-								lignepivot[m] = lignepivot[m-1];
+								lignepivot[(size_t)m] = lignepivot[(size_t)m-1];
 							lignepivot[0] = ttm;
 						}
 					}
@@ -226,7 +228,7 @@ namespace LinBox
 						lignepivot[0].first = (indcol);
 					indcol++ ;
 					for(j=nj;j--;)
-						--columns[ lignepivot[j].first ];
+						--columns[ lignepivot[(size_t)j].first ];
 				}
 				else
 					indpermut = -2;
@@ -261,38 +263,38 @@ namespace LinBox
 
 			typedef typename Signed_Trait<Modulo>::unsigned_type UModulo;
 
-			unsigned long k = indcol - 1;
-			unsigned long nj =  lignecourante.size() ;
+			unsigned long k = (unsigned long)indcol - 1;
+			unsigned long nj = (unsigned long)  lignecourante.size() ;
 			if (nj) {
 				unsigned long j_head(0);
 				for(; j_head<nj; ++j_head)
-					if (long(lignecourante[j_head].first) >= indpermut) break;
+					if (long(lignecourante[(size_t)j_head].first) >= indpermut) break;
 				unsigned long bjh(j_head-1);
-				if ((j_head<nj) && (long(lignecourante[j_head].first) == indpermut)) {
+				if ((j_head<nj) && (long(lignecourante[(size_t)j_head].first) == indpermut)) {
 					// -------------------------------------------
 					// Permutation
 					if (indpermut != (long)k) {
 						if (lignecourante[0].first == k) {
 							// non zero  <--> non zero
-							F tmp = lignecourante[0].second ;
-							lignecourante[0].second = (lignecourante[j_head].second );
-							lignecourante[j_head].second = (tmp);
+							F tmp = (F) lignecourante[0].second ;
+							lignecourante[0].second = (lignecourante[(size_t)j_head].second );
+							lignecourante[(size_t)j_head].second = (tmp);
 						}
 						else {
 							// zero <--> non zero
-							E tmp = lignecourante[j_head];
+							E tmp = (E) lignecourante[(size_t)j_head];
 							--columns[ tmp.first ];
-							++columns[k];
+							++columns[(size_t)k];
 							tmp.first = (k);
-							for(long l=j_head; l>0; l--)
-								lignecourante[l] = lignecourante[l-1];
+							for(long l=(long)j_head; l>0; l--)
+								lignecourante[(size_t)l] = lignecourante[(size_t)l-1];
 							lignecourante[0] = tmp;
 						}
 						j_head = 0;
 					}
 					// -------------------------------------------
 					// Elimination
-					unsigned long npiv = lignepivot.size();
+					unsigned long npiv = (unsigned long) lignepivot.size();
 					Vecteur construit(nj + npiv);
 					// construit : <-- ci
 					// courante  : <-- m
@@ -301,7 +303,7 @@ namespace LinBox
 					Viter ci = construit.begin();
 					unsigned long m=1;
 					unsigned long l(0);
-					// A[i,k] <-- A[i,k] / A[k,k]
+					// A[(size_t)i,k] <-- A[(size_t)i,k] / A[(size_t)k,k]
 					// lignecourante[0].second = (  ((UModulo)( ( MOD-(lignecourante[0].second) ) * ( MY_Zpz_inv( lignepivot[0].second, MOD) ) ) ) % (UModulo)MOD ) ;
 					// F headcoeff = lignecourante[0].second;
 					F headcoeff = MOD-(lignecourante[0].second);
@@ -311,39 +313,39 @@ namespace LinBox
 					lignecourante[0].second = headcoeff;
 					--columns[ lignecourante[0].first ];
 
-					unsigned long j_piv;
 					for(;l<npiv;++l)
-						if (lignepivot[l].first > k) break;
-					// for all j such that (j>k) and A[k,j]!=0
+						if (lignepivot[(size_t)l].first > k) break;
+					// for all j such that (j>k) and A[(size_t)k,j]!=0
 					for(;l<npiv;++l) {
-						j_piv = lignepivot[l].first;
-						// if A[k,j]=0, then A[i,j] <-- A[i,j]
-						for (;(m<nj) && (lignecourante[m].first < j_piv);)
-							*ci++ = lignecourante[m++];
-						// if A[i,j]!=0, then A[i,j] <-- A[i,j] - A[i,k]*A[k,j]
-						if ((m<nj) && (lignecourante[m].first == j_piv)) {
-							//lignecourante[m].second = ( ((UModulo)( headcoeff  *  lignepivot[l].second  + lignecourante[m].second ) ) % (UModulo)MOD );
-							lignecourante[m].second += ( headcoeff  *  lignepivot[l].second );
-						        lignecourante[m].second %= (UModulo)MOD;
-							if (isNZero(lignecourante[m].second))
-								*ci++ = lignecourante[m++];
+						unsigned long j_piv;
+						j_piv = (unsigned long) lignepivot[(size_t)l].first;
+						// if A[(size_t)k,j]=0, then A[(size_t)i,j] <-- A[(size_t)i,j]
+						for (;(m<nj) && (lignecourante[(size_t)m].first < j_piv);)
+							*ci++ = lignecourante[(size_t)m++];
+						// if A[(size_t)i,j]!=0, then A[(size_t)i,j] <-- A[(size_t)i,j] - A[(size_t)i,k]*A[(size_t)k,j]
+						if ((m<nj) && (lignecourante[(size_t)m].first == j_piv)) {
+							//lignecourante[(size_t)m].second = ( ((UModulo)( headcoeff  *  lignepivot[(size_t)l].second  + lignecourante[(size_t)m].second ) ) % (UModulo)MOD );
+							lignecourante[(size_t)m].second += ( headcoeff  *  lignepivot[(size_t)l].second );
+						        lignecourante[(size_t)m].second %= (UModulo)MOD;
+							if (isNZero(lignecourante[(size_t)m].second))
+								*ci++ = lignecourante[(size_t)m++];
 							else
-								--columns[ lignecourante[m++].first ];
+								--columns[ lignecourante[(size_t)m++].first ];
 							//                         m++;
 						}
 						else {
 							F tmp(headcoeff);
-							tmp *= lignepivot[l].second;
+							tmp *= lignepivot[(size_t)l].second;
 							tmp %= (UModulo)MOD;
 							if (isNZero(tmp)) {
-								++columns[j_piv];
+								++columns[(size_t)j_piv];
 								*ci++ =  E(j_piv, tmp );
 							}
 						}
 					}
-					// if A[k,j]=0, then A[i,j] <-- A[i,j]
+					// if A[(size_t)k,j]=0, then A[(size_t)i,j] <-- A[(size_t)i,j]
 					for (;m<nj;)
-						*ci++ = lignecourante[m++];
+						*ci++ = lignecourante[(size_t)m++];
 
 					construit.erase(ci,construit.end());
 					lignecourante = construit;
@@ -354,15 +356,15 @@ namespace LinBox
 					if (indpermut != (long)k) {
 						unsigned long l(0);
 						for(; l<nj; ++l)
-							if (lignecourante[l].first >= k) break;
-						if ((l<nj) && (lignecourante[l].first == k))  {
+							if (lignecourante[(size_t)l].first >= k) break;
+						if ((l<nj) && (lignecourante[(size_t)l].first == k))  {
 							// non zero <--> zero
-							E tmp = lignecourante[l];
+							E tmp = (E) lignecourante[(size_t)l];
 							--columns[tmp.first ];
-							++columns[indpermut];
-							tmp.first = (indpermut);
+							++columns[(size_t)indpermut];
+							tmp.first = (unsigned long) (indpermut);
 							for(;l<bjh;l++)
-								lignecourante[l] = lignecourante[l+1];
+								lignecourante[(size_t)l] = lignecourante[(size_t)l+1];
 							lignecourante[bjh] = tmp;
 						} // else
 						// zero <--> zero
@@ -394,23 +396,23 @@ namespace LinBox
 			// assignment of LigneA with the domain object
 			size_t jj;
 			for(jj=0; jj<Ni; ++jj) {
-				Vecteur tmp = LigneA[jj];
+				Vecteur tmp = LigneA[(size_t)jj];
 				Vecteur toto(tmp.size());
 				unsigned long k=0,rs=0;
 				for(; k<tmp.size(); ++k) {
-					Modulo r = tmp[k].second;
+					Modulo r = tmp[(size_t)k].second;
 					if ((r <0) || (r >= MOD)) r %= MOD ;
 					if (r <0) r += MOD ;
 					if (isNZero(r)) {
-						++col_density[ tmp[k].first ];
-						toto[rs] =tmp[k];
+						++col_density[ tmp[(size_t)k].first ];
+						toto[rs] =tmp[(size_t)k];
 						toto[rs].second = ( r );
 						++rs;
 					}
 				}
 				toto.resize(rs);
-				LigneA[jj] = toto;
-				//                 LigneA[jj].reactualsize(Nj);
+				LigneA[(size_t)jj] = toto;
+				//                 LigneA[(size_t)jj].reactualsize(Nj);
 
 			}
 
@@ -423,7 +425,7 @@ namespace LinBox
 
 
 			for (unsigned long k=0; k<last;++k) {
-				if ( ! (k % maxout) ) commentator().progress (k);
+				if ( ! (k % maxout) ) commentator().progress ((long)k);
 
 
 				unsigned long p=k;
@@ -432,7 +434,7 @@ namespace LinBox
 
 					std::multimap< long, long > psizes;
 					for(p=k; p<Ni; ++p)
-						psizes.insert( psizes.end(), std::pair<long,long>( LigneA[p].size(), p) );
+						psizes.insert( psizes.end(), std::pair<long,long>( (long) LigneA[(size_t)p].size(), (long) p) );
 
 #ifdef  LINBOX_pp_gauss_steps_OUT
 					std::cerr << "------------ ordered rows " << k << " -----------" << std::endl;
@@ -449,16 +451,16 @@ namespace LinBox
                         break;
 
 					for( typename std::multimap< long, long >::const_iterator iter = psizes.begin(); iter != psizes.end(); ++iter) {
-						p = (*iter).second;
+						p = (unsigned long)(*iter).second;
 
-						CherchePivot( PRIME, LigneA[p], indcol, c , col_density) ;
+						CherchePivot( PRIME, LigneA[(size_t)p], indcol, c , col_density) ;
 						if (c > -2 ) break;
 					}
 
 					if (c > -2) break;
 					for(unsigned long ii=k;ii<Ni;++ii)
-						for(unsigned long jjj=LigneA[ii].size();jjj--;)
-							LigneA[ii][jjj].second /= PRIME;
+						for(unsigned long jjj=LigneA[(size_t)ii].size();jjj--;)
+							LigneA[(size_t)ii][(size_t)jjj].second /= PRIME;
 					MOD /= PRIME;
 					ranks.push_back( indcol );
 					++ind_pow;
@@ -472,9 +474,9 @@ namespace LinBox
 #ifdef  LINBOX_pp_gauss_steps_OUT
 					std::cerr << "------------ permuting rows " << p << " and " << k << " ---" << std::endl;
 #endif
-					Vecteur vtm = LigneA[k];
-					LigneA[k] = LigneA[p];
-					LigneA[p] = vtm;
+					Vecteur vtm = LigneA[(size_t)k];
+					LigneA[(size_t)k] = LigneA[(size_t)p];
+					LigneA[(size_t)p] = vtm;
 				}
 #ifdef  LINBOX_pp_gauss_steps_OUT
                 if (c != (long(indcol)-1L))
@@ -482,25 +484,25 @@ namespace LinBox
 #endif
 				if (c != -1)
 					for(unsigned long l=k + 1; l < Ni; ++l)
-						FaireElimination(MOD, LigneA[l], LigneA[k], indcol, c, col_density);
+						FaireElimination(MOD, LigneA[(size_t)l], LigneA[(size_t)k], (long)indcol, c, col_density);
 
 
 #ifdef  LINBOX_pp_gauss_steps_OUT
-				LigneA.write(cerr << "step[" << k << "], pivot: " << c << std::endl) << endl;
+				LigneA.write(std::cerr << "step[" << k << "], pivot: " << c << std::endl) << std::endl;
 #endif
 
-                PreserveUpperMatrixRow(LigneA[k], typename Boolean_Trait<PreserveUpperMatrix>::BooleanType());
+                PreserveUpperMatrixRow(LigneA[(size_t)k], typename Boolean_Trait<PreserveUpperMatrix>::BooleanType());
 			}
 
             c = -2;
-            SameColumnPivoting(PRIME, LigneA[last], indcol, c, typename Boolean_Trait<PrivilegiateNoColumnPivoting>::BooleanType() );
-            if (c == -2) CherchePivot( PRIME, LigneA[last], indcol, c, col_density );
+            SameColumnPivoting(PRIME, LigneA[(size_t)last], indcol, c, typename Boolean_Trait<PrivilegiateNoColumnPivoting>::BooleanType() );
+            if (c == -2) CherchePivot( PRIME, LigneA[(size_t)last], indcol, c, col_density );
 			while( c == -2) {
 				ranks.push_back( indcol );
-				for(long jjj=LigneA[last].size();jjj--;)
-					LigneA[last][jjj].second /= PRIME;
+				for(long jjj=(long)LigneA[(size_t)last].size();jjj--;)
+					LigneA[(size_t)last][(size_t)jjj].second /= PRIME;
 				MOD /= PRIME;
-				CherchePivot( PRIME, LigneA[last], indcol, c, col_density );
+				CherchePivot( PRIME, LigneA[(size_t)last], indcol, c, col_density );
 			}
 			while( MOD > 1) {
 				MOD /= PRIME;
@@ -509,7 +511,7 @@ namespace LinBox
 
 			//             ranks.push_back(indcol);
 #ifdef LINBOX_pp_gauss_steps_OUT
-            LigneA.write(cerr << "step[" << Ni-1 << "], pivot: " << c << std::endl) << endl;
+            LigneA.write(std::cerr << "step[" << Ni-1 << "], pivot: " << c << std::endl) << std::endl;
 #endif
 #ifdef LINBOX_PRANK_OUT
 			std::cerr << "Rank mod " << (unsigned long)FMOD << " : " << indcol << std::endl;
@@ -538,18 +540,19 @@ namespace LinBox
 
 
 		template<class Modulo, class Matrix, template<class, class> class Container, template<class> class Alloc>
-		Container<std::pair<size_t,size_t>, Alloc<std::pair<size_t,size_t> > >& operator()(Container<std::pair<size_t,size_t>, Alloc<std::pair<size_t,size_t> > >& L, Matrix& A, Modulo FMOD, Modulo PRIME, int StaticParameters=0)
+		Container<std::pair<size_t,Modulo>, Alloc<std::pair<size_t,Modulo> > >& operator()(Container<std::pair<size_t,Modulo>, Alloc<std::pair<size_t,Modulo> > >& L, Matrix& A, Modulo FMOD, Modulo PRIME, int StaticParameters=0)
 		{
 			Container<size_t, Alloc<size_t> > ranks;
 			prime_power_rankin( FMOD, PRIME, ranks, A, A.rowdim(), A.coldim(), std::vector<size_t>(),StaticParameters);
 			L.resize( 0 ) ;
 			size_t MOD = 1;
-			size_t num = 0, diff;
+			size_t num = 0;
 			for( typename Container<size_t, Alloc<size_t> >::const_iterator it = ranks.begin(); it != ranks.end(); ++it) {
+				size_t diff;
 				diff = *it-num;
 				if (diff > 0)
-					L.push_back( std::pair<size_t,size_t>(*it-num,MOD) );
-				MOD *= PRIME;
+					L.push_back( std::pair<size_t,Modulo>(*it-num,MOD) );
+				MOD *= (size_t)PRIME;
 				num = *it;
 			}
 			return L;
diff --git a/linbox/algorithms/smith-form-sparseelim-poweroftwo.h b/linbox/algorithms/smith-form-sparseelim-poweroftwo.h
index 636045a..879558a 100644
--- a/linbox/algorithms/smith-form-sparseelim-poweroftwo.h
+++ b/linbox/algorithms/smith-form-sparseelim-poweroftwo.h
@@ -1,7 +1,7 @@
 /* algorithms/smith-form-sparseelim-poweroftwo.h
  * Copyright (C) LinBox
  * Written by JG Dumas
- * Time-stamp: <06 Apr 12 11:50:12 Jean-Guillaume.Dumas at imag.fr>
+ * Time-stamp: <03 Jul 15 13:59:19 Jean-Guillaume.Dumas at imag.fr>
  * ========LICENCE========
  * This file is part of the library LinBox.
  *
@@ -24,11 +24,20 @@
 
 #ifndef __LINBOX_pp_gauss_poweroftwo_H
 #define __LINBOX_pp_gauss_poweroftwo_H
-
 #include <map>
 #include <givaro/givconfig.h> // for Signed_Trait
 #include "linbox/algorithms/smith-form-sparseelim-local.h"
 
+// LINBOX_pp_gauss_intermediate_OUT outputs intermediate matrices
+#ifdef LINBOX_pp_gauss_intermediate_OUT
+
+// LINBOX_pp_gauss_steps_OUT outputs elimination steps
+#  ifndef LINBOX_pp_gauss_steps_OUT
+#  define LINBOX_pp_gauss_steps_OUT
+#  endif
+
+#endif
+
 // LINBOX_pp_gauss_steps_OUT outputs elimination steps
 #ifdef LINBOX_pp_gauss_steps_OUT
 
@@ -53,164 +62,171 @@ namespace LinBox
         const Element zero;
         const Element one;
     public:
-        
+
             /** \brief The field parameter is the domain
              * over which to perform computations
              */
         PowerGaussDomainPowerOfTwo () : zero(0U), one(1U) {}
-        
+
             //Copy constructor
             ///
         PowerGaussDomainPowerOfTwo (const PowerGaussDomainPowerOfTwo &M) {}
-        
-        
-        
+
+
+
             // --------------------------------------------
             // Modulo operators
         bool isNZero(const UInt_t& a ) const { return (bool)a ;}
         bool isZero(const UInt_t& a ) const { return a == 0U;}
         bool isOne(const UInt_t& a ) const { return a == 1U;}
+	/// @todo use Givaro isOdd
         bool isOdd(const UInt_t& b) const {
             return (bool)(b & 1U);
-        }   
-        
+        }
+
         bool MY_divides(const UInt_t& a, const UInt_t& b) const {
             return (!(b%a));
         }
-        
+
+            // [On Newton-Raphson iteration for multiplicative 
+            //  inverses modulo prime powers. J-G. Dumas. 
+            //  IEEE Transactions on Computers, 2013]  
+            // http://doi.ieeecomputersociety.org/10.1109/TC.2013.94
         UInt_t& MY_Zpz_inv (UInt_t& u1, const UInt_t& a, const size_t exponent, const UInt_t& TWOTOEXPMONE) const {
-            static const UInt_t ttep2(TWOTOEXPMONE+3);
+            static const UInt_t ttep2(TWOTOEXPMONE+3U);
             if (this->isOne(a)) return u1=this->one;
-            REQUIRE( (one<<exponent) == (TWOTOEXPMONE+1) );
+            REQUIRE( (one<<exponent) == (TWOTOEXPMONE+1U) );
             REQUIRE( a <= TWOTOEXPMONE );
-            REQUIRE( (a & 1) );
+            REQUIRE( (a & 1U) );
             u1=ttep2-a; // 2-a
             UInt_t xmone(a-1);
             for(size_t i=2; i<exponent; i<<=1) {
-                xmone *= xmone;
+                UInt_t tmp(xmone); xmone *= tmp;
                 xmone &= TWOTOEXPMONE;
                 u1 *= ++xmone; --xmone;
                 u1 &= TWOTOEXPMONE;
             }
-            ENSURE( ((a * u1) & TWOTOEXPMONE) == 1 );
+            ENSURE( ((a * u1) & TWOTOEXPMONE) == 1U );
             return u1;
         }
 
 //         UInt_t& MY_Zpz_inv (UInt_t& u1, const UInt_t a, const UInt_t _p) const {
-//             u1 = 1UL;
+//             u1 = 1U;
 //             UInt_t r0(_p), r1(a);
 //             UInt_t q(r0/r1);
-            
+
 //             r0 -= q * r1;
 //             if ( this->isZero(r0) ) return u1;
 //             UInt_t u0 = q;
-            
+
 //             q = r1/r0;
 //             r1 -= q * r0;
-            
+
 //             while ( this->isNZero(r1) ) {
 //                 u1 += q * u0;
-                
+
 //                 q = r0/r1;
 //                 r0 -= q * r1;
 //                 if ( this->isZero(r0) ) return u1;
 //                 u0 += q * u1;
-                
+
 //                 q = r1/r0;
 //                 r1 -= q * r0;
-                
+
 //             }
-            
+
 //             return u1=_p-u0;
 //         }
 
 //         UInt_t MY_Zpz_inv (const UInt_t a, const UInt_t _p) const {
 //             UInt_t u1; return MY_Zpz_inv(u1,a,_p);
 //         }
-        
-        
+
+
             // ------------------------------------------------
             // Pivot Searchers and column strategy
             // ------------------------------------------------
         template<class Vecteur>
         void SameColumnPivoting(const Vecteur& lignepivot, unsigned long& indcol, long& indpermut, Boolean_Trait<false>::BooleanType ) {}
-        
-        
+
+
         template<class Vecteur>
         void SameColumnPivoting(const Vecteur& lignepivot, unsigned long& indcol, long& indpermut, Boolean_Trait<true>::BooleanType ) {
                 // Try first in the same column
-            unsigned long nj =  lignepivot.size() ;
-            if (nj && (indcol == lignepivot[0].first) && (this->isOdd(lignepivot[0].second) ) ) {
-                indpermut = indcol;
+            unsigned long nj = (unsigned long) lignepivot.size() ;
+            if (nj && (indcol == lignepivot[0].first) && (this->isOdd((UInt_t)lignepivot[0].second) ) ) {
+                indpermut = (long)indcol;
                 ++indcol;
             }
         }
-        
+
         template<class BB, class Mmap>
         bool SameColumnPivotingTrait(unsigned long& p, const BB& LigneA, const Mmap& psizes, unsigned long& indcol, long& indpermut, Boolean_Trait<false>::BooleanType ) {
                 // Do not try first in the same column
             return false;
         }
-        
+
         template<class BB, class Mmap>
         bool SameColumnPivotingTrait(unsigned long& p, const BB& LigneA, const Mmap& psizes, unsigned long& indcol, long& c, Boolean_Trait<true>::BooleanType truetrait) {
             c=-2;
             for( typename Mmap::const_iterator iter = psizes.begin(); iter != psizes.end(); ++iter) {
-                p = (*iter).second;
-                SameColumnPivoting(LigneA[p], indcol, c, truetrait ) ;
+                p = (unsigned long) (*iter).second;
+                SameColumnPivoting(LigneA[(size_t)p], indcol, c, truetrait ) ;
                 if (c > -2 ) break;
             }
             if (c > -2)
                 return true;
             else
                 return false;
-            
+
         }
-        
+
         template<class Vecteur>
         void CherchePivot( Vecteur& lignepivot, unsigned long& indcol , long& indpermut ) {
-            unsigned long nj =  lignepivot.size() ;
+            unsigned long nj = (unsigned long) lignepivot.size() ;
             if (nj) {
-                indpermut= lignepivot[0].first;
-                if (indpermut != indcol)
+                indpermut=(long) lignepivot[0].first;
+                if (indpermut != (long)indcol)
                     lignepivot[0].first = (indcol);
                 ++indcol;
             }
             else
                 indpermut = -1;
         }
-        
-        
-        
+
+
+
         template<class Vecteur, class D>
         void CherchePivot(Vecteur& lignepivot, unsigned long& indcol , long& indpermut, D& columns ) {
             typedef typename Vecteur::value_type E;
-            long nj =  lignepivot.size() ;
+            long nj =  (long) lignepivot.size() ;
             if (nj) {
-                indpermut = lignepivot[0].first;
+                indpermut = (long)lignepivot[0].first;
                 long pp=0;
                 for(;pp<nj;++pp)
-                    if (this->isOdd(lignepivot[pp].second) ) break;
-                
+                    if (this->isOdd((UInt_t)lignepivot[(size_t)pp].second) ) break;
+
                 if (pp < nj) {
-                    long ds = columns[ lignepivot[pp].first ],dl,p=pp,j=pp;
-                    for(++j;j<nj;++j)
-                        if ( ( (dl=columns[lignepivot[j].first] ) < ds ) && (this->isOdd(lignepivot[j].second) ) ) {
+                    long ds = (long)columns[ lignepivot[(size_t)pp].first ],p=pp,j=pp;
+                    for(++j;j<nj;++j){
+			    long dl;
+                        if ( ( (dl=(long)columns[(size_t)lignepivot[(size_t)j].first] ) < ds ) && (this->isOdd((UInt_t)lignepivot[(size_t)j].second) ) ) {
                             ds = dl;
                             p = j;
                         }
+		    }
                     if (p != 0) {
                         if (indpermut == (long)indcol) {
-                            UInt_t ttm = lignepivot[p].second;
-                            indpermut = lignepivot[p].first;
-                            lignepivot[p].second = (lignepivot[0].second);
-                            lignepivot[0].second = (ttm);
+                            UInt_t ttm = (UInt_t)lignepivot[(size_t)p].second;
+                            indpermut = (long)lignepivot[(size_t)p].first;
+                            lignepivot[(size_t)p].second = (lignepivot[0].second);
+                            lignepivot[0].second = (UInt_t)(ttm);
                         }
                         else {
-                            E ttm = lignepivot[p];
-                            indpermut = ttm.first;
+                            E ttm = (E) lignepivot[(size_t)p];
+                            indpermut = (long)ttm.first;
                             for(long m=p;m;--m)
-                                lignepivot[m] = lignepivot[m-1];
+                                lignepivot[(size_t)m] = lignepivot[(size_t)m-1];
                             lignepivot[0] = ttm;
                         }
                     }
@@ -218,7 +234,7 @@ namespace LinBox
                         lignepivot[0].first = (indcol);
                     indcol++ ;
                     for(j=nj;j--;)
-                        --columns[ lignepivot[j].first ];
+                        --columns[ lignepivot[(size_t)j].first ];
                 }
                 else
                     indpermut = -2;
@@ -234,8 +250,8 @@ namespace LinBox
         void PreserveUpperMatrixRow(Vecteur& ligne, Boolean_Trait<false>::BooleanType ) {
             ligne = Vecteur(0);
         }
-        
-        
+
+
         template<class Vecteur, class De>
         void FaireElimination( const size_t EXPONENT, const UInt_t& TWOK, const UInt_t& TWOKMONE,
                                Vecteur& lignecourante,
@@ -243,43 +259,43 @@ namespace LinBox
                                const long& indcol,
                                const long& indpermut,
                                De& columns) {
-            
+
                 //     typedef typename Vecteur::coefficientSpace F;
                 //     typedef typename Vecteur::value_types E;
             typedef typename Vecteur::value_type E;
-            
-            unsigned long k = indcol - 1;
-            unsigned long nj =  lignecourante.size() ;
+
+            unsigned long k  = (unsigned long) indcol - 1;
+            unsigned long nj = (unsigned long) lignecourante.size() ;
             if (nj) {
                 unsigned long j_head(0);
                 for(; j_head<nj; ++j_head)
-                    if (long(lignecourante[j_head].first) >= indpermut) break;
+                    if (long(lignecourante[(size_t)j_head].first) >= indpermut) break;
                 unsigned long bjh(j_head-1);
-                if ((j_head<nj) && (long(lignecourante[j_head].first) == indpermut)) {
+                if ((j_head<nj) && (long(lignecourante[(size_t)j_head].first) == indpermut)) {
                         // -------------------------------------------
                         // Permutation
                     if (indpermut != (long)k) {
                         if (lignecourante[0].first == k) {
                                 // non zero  <--> non zero
-                            UInt_t tmp = lignecourante[0].second ;
-                            lignecourante[0].second = (lignecourante[j_head].second );
-                            lignecourante[j_head].second = (tmp);
+                            UInt_t tmp = (UInt_t) lignecourante[0].second ;
+                            lignecourante[0].second = lignecourante[(size_t)j_head].second;
+                            lignecourante[(size_t)j_head].second = tmp;
                         }
                         else {
                                 // zero <--> non zero
-                            E tmp = lignecourante[j_head];
+                            E tmp = (E) lignecourante[(size_t)j_head];
                             --columns[ tmp.first ];
                             ++columns[k];
                             tmp.first = (k);
-                            for(long l=j_head; l>0; l--)
-                                lignecourante[l] = lignecourante[l-1];
+                            for(long l=(long)j_head; l>0; l--)
+                                lignecourante[(size_t)l] = lignecourante[(size_t)l-1];
                             lignecourante[0] = tmp;
                         }
                         j_head = 0;
                     }
                         // -------------------------------------------
                         // Elimination
-                    unsigned long npiv = lignepivot.size();
+                    unsigned long npiv = (unsigned long) lignepivot.size();
                     Vecteur construit(nj + npiv);
                         // construit : <-- ci
                         // courante  : <-- m
@@ -288,50 +304,60 @@ namespace LinBox
                     Viter ci = construit.begin();
                     unsigned long m=1;
                     unsigned long l(0);
-                        // A[i,k] <-- A[i,k] / A[k,k]
-                    UInt_t headcoeff = TWOK-(lignecourante[0].second);
+                        // A[(size_t)i,k] <-- A[(size_t)i,k] / A[(size_t)k,k]
+
+                    UInt_t headcoeff = TWOK-(UInt_t)(lignecourante[0].second);
+
+                    
 //                     UInt_t invpiv; MY_Zpz_inv(invpiv, lignepivot[0].second, TWOK);
-                    UInt_t invpiv; MY_Zpz_inv(invpiv, lignepivot[0].second, EXPONENT, TWOKMONE);
+                    UInt_t invpiv;
+                    MY_Zpz_inv(invpiv, (UInt_t) (lignepivot[0].second), EXPONENT, TWOKMONE);
                     headcoeff *= invpiv;
                     headcoeff &= TWOKMONE ;
+
+
 //                     lignecourante[0].second = (  ((UModulo)( ( MOD-(lignecourante[0].second) ) * ( MY_Zpz_inv( lignepivot[0].second, MOD) ) ) ) % (UModulo)MOD ) ;
 //                     UInt_t headcoeff = lignecourante[0].second ;
                     --columns[ lignecourante[0].first ];
-                    
-                    unsigned long j_piv;
+
                     for(;l<npiv;++l)
-                        if (lignepivot[l].first > k) break;
-                        // for all j such that (j>k) and A[k,j]!=0
+                        if (lignepivot[(size_t)l].first > k) break;
+                        // for all j such that (j>k) and A[(size_t)k,j]!=0
                     for(;l<npiv;++l) {
-                        j_piv = lignepivot[l].first;
-                            // if A[k,j]=0, then A[i,j] <-- A[i,j]
-                        for (;(m<nj) && (lignecourante[m].first < j_piv);)
-                            *ci++ = lignecourante[m++];
-                            // if A[i,j]!=0, then A[i,j] <-- A[i,j] - A[i,k]*A[k,j]
-                        if ((m<nj) && (lignecourante[m].first == j_piv)) {
-//                             lignecourante[m].second = ( ((UModulo)( headcoeff  *  lignepivot[l].second  + lignecourante[m].second ) ) % (UModulo)MOD );
-                            lignecourante[m].second += ( headcoeff  *  lignepivot[l].second );
-                            lignecourante[m].second &= TWOKMONE;
-                            if (isNZero(lignecourante[m].second))
-                                *ci++ = lignecourante[m++];
+                    unsigned long j_piv;
+                        j_piv = (unsigned long) lignepivot[(size_t)l].first;
+                            // if A[(size_t)k,j]=0, then A[(size_t)i,j] <-- A[(size_t)i,j]
+                        for (;(m<nj) && (lignecourante[(size_t)m].first < j_piv);)
+                            *ci++ = lignecourante[(size_t)m++];
+                            // if A[(size_t)i,j]!=0, then A[(size_t)i,j] <-- A[(size_t)i,j] - A[(size_t)i,k]*A[(size_t)k,j]
+                        if ((m<nj) && (lignecourante[(size_t)m].first == j_piv)) {
+//                             lignecourante[(size_t)m].second = ( ((UModulo)( headcoeff  *  lignepivot[(size_t)l].second  + lignecourante[(size_t)m].second ) ) % (UModulo)MOD );
+                            STATE( UInt_t lcs = lignecourante[(size_t)m].second);
+                            
+
+                            lignecourante[(size_t)m].second += ( headcoeff  *  (UInt_t)lignepivot[(size_t)l].second );
+                            lignecourante[(size_t)m].second &= TWOKMONE;
+
+                            if (isNZero((UInt_t)(lignecourante[(size_t)m].second)))
+                                *ci++ = lignecourante[(size_t)m++];
                             else
-                                --columns[ lignecourante[m++].first ];
+                                --columns[ lignecourante[(size_t)m++].first ];
                                 //                         m++;
                         }
                         else {
                             UInt_t tmp(headcoeff);
-                            tmp *= lignepivot[l].second;
+                            tmp *= (UInt_t)lignepivot[(size_t)l].second;
                             tmp &= TWOKMONE;
                             if (isNZero(tmp)) {
-                                ++columns[j_piv];
-                                *ci++ =  E(j_piv, tmp );
+                                ++columns[(size_t)j_piv];
+                                *ci++ =  E(j_piv, (UInt_t)tmp );
                             }
                         }
                     }
-                        // if A[k,j]=0, then A[i,j] <-- A[i,j]
+                        // if A[(size_t)k,j]=0, then A[(size_t)i,j] <-- A[(size_t)i,j]
                     for (;m<nj;)
-                        *ci++ = lignecourante[m++];
-                    
+                        *ci++ = lignecourante[(size_t)m++];
+
                     construit.erase(ci,construit.end());
                     lignecourante = construit;
                 }
@@ -341,56 +367,61 @@ namespace LinBox
                     if (indpermut != (long)k) {
                         unsigned long l(0);
                         for(; l<nj; ++l)
-                            if (lignecourante[l].first >= k) break;
-                        if ((l<nj) && (lignecourante[l].first == k))  {
+                            if (lignecourante[(size_t)l].first >= k) break;
+                        if ((l<nj) && (lignecourante[(size_t)l].first == k))  {
                                 // non zero <--> zero
-                            E tmp = lignecourante[l];
+                            E tmp = (E) lignecourante[(size_t)l];
                             --columns[tmp.first ];
-                            ++columns[indpermut];
-                            tmp.first = (indpermut);
+                            ++columns[(size_t)indpermut];
+                            tmp.first = (unsigned long)(indpermut);
                             for(;l<bjh;l++)
-                                lignecourante[l] = lignecourante[l+1];
+                                lignecourante[(size_t)l] = lignecourante[(size_t)l+1];
                             lignecourante[bjh] = tmp;
                         } // else
                             // zero <--> zero
                     }
             }
         }
-        
+
             // ------------------------------------------------------
             // Rank calculators, defining row strategy
             // ------------------------------------------------------
-        
+
         template<class BB, class D, class Container, bool PrivilegiateNoColumnPivoting, bool PreserveUpperMatrix>
         void gauss_rankin(size_t EXPONENTMAX, Container& ranks, BB& LigneA, const size_t Ni, const size_t Nj, const D& density_trait)
             {
                 commentator().start ("Gaussian elimination with reordering modulo a prime power of 2",
                                      "PRGEPo2", Ni);
-                
+
                 ranks.resize(0);
-                
+
                 typedef typename BB::Row Vecteur;
                 size_t EXPONENT = EXPONENTMAX;
-                UInt_t TWOK(1UL); TWOK <<= EXPONENT;
+                UInt_t TWOK(1U); TWOK <<= EXPONENT;
                 UInt_t TWOKMONE(TWOK); --TWOKMONE;
-                
+ENSURE( TWOK == (UInt_t(1U) << EXPONENT) );
+ENSURE( TWOKMONE == (TWOK - 1U) );
+
+
+
 #ifdef LINBOX_PRANK_OUT
                 std::cerr << "Elimination mod " << TWOK << std::endl;
 #endif
-                
+
                 D col_density(Nj);
-                
+
                     // assignment of LigneA with the domain object
                 size_t jj;
                 for(jj=0; jj<Ni; ++jj) {
-                    Vecteur tmp = LigneA[jj];
+                    Vecteur tmp = LigneA[(size_t)jj];
                     Vecteur toto(tmp.size());
                     unsigned long k=0,rs=0;
                     for(; k<tmp.size(); ++k) {
-                        UInt_t r = tmp[k].second;
+                        UInt_t r = (UInt_t)tmp[k].second;
 //                         if (r <0) r %= TWOK ;
 //                         if (r <0) r += TWOK ;
-                        if (r >= TWOK) r &= TWOKMONE;
+//                         if (r >= TWOK) r &= TWOKMONE;
+                        r &= TWOKMONE;
                         if (isNZero(r)) {
                             ++col_density[ tmp[k].first ];
                             toto[rs] =tmp[k];
@@ -399,31 +430,31 @@ namespace LinBox
                         }
                     }
                     toto.resize(rs);
-                    LigneA[jj] = toto;
-                        //                 LigneA[jj].reactualsize(Nj);
-                    
+                    LigneA[(size_t)jj] = toto;
+                        //                 LigneA[(size_t)jj].reactualsize(Nj);
+
                 }
-                
+
                 unsigned long last = Ni-1;
                 long c(0);
                 unsigned long indcol(0);
                 unsigned long ind_pow = 1;
                 unsigned long maxout = Ni/100; maxout = (maxout<10 ? 10 : (maxout>1000 ? 1000 : maxout) );
                 unsigned long thres = Ni/maxout; thres = (thres >0 ? thres : 1);
-                
-                
+
+
                 for (unsigned long k=0; k<last;++k) {
-                    if ( ! (k % maxout) ) commentator().progress (k);
-                    
-                    
+                    if ( ! (k % maxout) ) commentator().progress ((long)k);
+
+
                     unsigned long p=k;
                     for(;;) {
-                        
-                        
+
+
                         std::multimap< long, long > psizes;
                         for(p=k; p<Ni; ++p)
-                            psizes.insert( psizes.end(), std::pair<long,long>( LigneA[p].size(), p) );
-                        
+                            psizes.insert( psizes.end(), std::pair<long,long>( (long)LigneA[(size_t)p].size(), (long)p) );
+
 #ifdef  LINBOX_pp_gauss_steps_OUT
                         std::cerr << "------------ ordered rows " << k << " -----------" << std::endl;
                         for( std::multimap< long, long >::const_iterator iter = psizes.begin(); iter != psizes.end(); ++iter)
@@ -432,41 +463,45 @@ namespace LinBox
                         }
                         std::cerr << "---------------------------------------" << std::endl;
 #endif
-                        
-                        
-                        
+
+
+
                         if ( SameColumnPivotingTrait(p, LigneA, psizes, indcol, c, typename Boolean_Trait<PrivilegiateNoColumnPivoting>::BooleanType() ) )
                             break;
-                        
+
                         for( typename std::multimap< long, long >::const_iterator iter = psizes.begin(); iter != psizes.end(); ++iter) {
-                            p = (*iter).second;
-                            
-                            CherchePivot( LigneA[p], indcol, c , col_density) ;
+                            p = (unsigned long) (*iter).second;
+
+                            CherchePivot( LigneA[(size_t)p], indcol, c , col_density) ;
                             if (c > -2 ) break;
                         }
-                        
+
                         if (c > -2) break;
                         for(unsigned long ii=k;ii<Ni;++ii)
-                            for(unsigned long jjj=LigneA[ii].size();jjj--;)
-                                LigneA[ii][jjj].second >>= 1;
+                            for(unsigned long jjj=LigneA[(size_t)ii].size();jjj--;)
+                                LigneA[(size_t)ii][(size_t)jjj].second >>= 1;
                         --EXPONENT;
                         TWOK >>= 1;
                         TWOKMONE >>=1;
+
+ENSURE( TWOK == (UInt_t(1U) << EXPONENT) );
+ENSURE( TWOKMONE == (TWOK - 1U) );
+
                         ranks.push_back( indcol );
                         ++ind_pow;
 #ifdef LINBOX_PRANK_OUT
                         std::cerr << "Rank mod 2^" << ind_pow << " : " << indcol << std::endl;
                         if (TWOK == 1) std::cerr << "wattadayada inhere ?" << std::endl;
 #endif
-                        
+
                     }
                     if (p != k) {
 #ifdef  LINBOX_pp_gauss_steps_OUT
                         std::cerr << "------------ permuting rows " << p << " and " << k << " ---" << std::endl;
 #endif
-                        Vecteur vtm = LigneA[k];
-                        LigneA[k] = LigneA[p];
-                        LigneA[p] = vtm;
+                        Vecteur vtm = LigneA[(size_t)k];
+                        LigneA[(size_t)k] = LigneA[(size_t)p];
+                        LigneA[(size_t)p] = vtm;
                     }
 #ifdef  LINBOX_pp_gauss_steps_OUT
                     if (c != (long(indcol)-1L))
@@ -474,40 +509,46 @@ namespace LinBox
 #endif
                     if (c != -1)
                         for(unsigned long l=k + 1; l < Ni; ++l)
-                            FaireElimination(EXPONENT, TWOK, TWOKMONE, LigneA[l], LigneA[k], indcol, c, col_density);
-                    
-                    
+                            FaireElimination(EXPONENT, TWOK, TWOKMONE, LigneA[(size_t)l], LigneA[(size_t)k], (long)indcol, c, col_density);
+
 #ifdef  LINBOX_pp_gauss_steps_OUT
-                    LigneA.write(cerr << "step[" << k << "], pivot: " << c << std::endl) << endl;
+                    std::cerr << "step[" << k << "], pivot: " << c << std::endl;
 #endif
-                    
-                    PreserveUpperMatrixRow(LigneA[k], typename Boolean_Trait<PreserveUpperMatrix>::BooleanType());
+
+#ifdef  LINBOX_pp_gauss_intermediate_OUT
+                    LigneA.write(std::cerr) << std::endl;
+#endif
+
+                    PreserveUpperMatrixRow(LigneA[(size_t)k], typename Boolean_Trait<PreserveUpperMatrix>::BooleanType());
                 }
-                
+
                 c = -2;
-                SameColumnPivoting(LigneA[last], indcol, c, typename Boolean_Trait<PrivilegiateNoColumnPivoting>::BooleanType() );
-                if (c == -2) CherchePivot( LigneA[last], indcol, c, col_density );
+                SameColumnPivoting(LigneA[(size_t)last], indcol, c, typename Boolean_Trait<PrivilegiateNoColumnPivoting>::BooleanType() );
+                if (c == -2) CherchePivot( LigneA[(size_t)last], indcol, c, col_density );
                 while( c == -2) {
                     ranks.push_back( indcol );
-                    for(long jjj=LigneA[last].size();jjj--;)
-                        LigneA[last][jjj].second >>= 1;
-                    TWOK >>= 1; 
-                    CherchePivot( LigneA[last], indcol, c, col_density );
+                    for(long jjj=(long)LigneA[(size_t)last].size();jjj--;)
+                        LigneA[(size_t)last][(size_t)jjj].second >>= 1;
+                    TWOK >>= 1;
+                    CherchePivot( LigneA[(size_t)last], indcol, c, col_density );
                 }
                 while( TWOK > 1) {
                     TWOK >>= 1;
                     ranks.push_back( indcol );
                 }
-                
+
                     //             ranks.push_back(indcol);
 #ifdef LINBOX_pp_gauss_steps_OUT
-                LigneA.write(cerr << "step[" << Ni-1 << "], pivot: " << c << std::endl) << endl;
+                std::cerr << "step[" << Ni-1 << "], pivot: " << c << std::endl;
+#endif
+#ifdef LINBOX_pp_gauss_intermediate_OUT
+                LigneA.write(std::cerr) << std::endl;
 #endif
 #ifdef LINBOX_PRANK_OUT
-                std::cerr << "Rank mod 2^" << EXPONENT << " : " << indcol << std::endl;
+                std::cerr << "Rank mod 2^" << EXPONENTMAX << " : " << indcol << std::endl;
 #endif
                 commentator().stop ("done", 0, "PRGEPo2");
-                
+
             }
 
         template<class BB, class D, class Container>
@@ -527,16 +568,16 @@ namespace LinBox
             }
         }
 
-        
+
         template<class Matrix, template<class, class> class Container, template<class> class Alloc>
         Container<std::pair<size_t,UInt_t>, Alloc<std::pair<size_t,UInt_t> > >& operator()(Container<std::pair<size_t,UInt_t>, Alloc<std::pair<size_t,UInt_t> > >& L, Matrix& A, size_t EXPONENT, int StaticParameters=0) {
             Container<size_t, Alloc<size_t> > ranks;
             prime_power_rankin( EXPONENT, ranks, A, A.rowdim(), A.coldim(), std::vector<size_t>(),StaticParameters);
             L.resize( 0 ) ;
             UInt_t MOD(1);
-            size_t num = 0, diff;
+            size_t num = 0;
             for( typename Container<size_t, Alloc<size_t> >::const_iterator it = ranks.begin(); it != ranks.end(); ++it) {
-                diff = *it-num;
+                size_t diff = *it-num;
                 if (diff > 0)
                     L.push_back( std::pair<size_t,UInt_t>(*it-num,MOD) );
                 MOD <<= 1;
@@ -544,11 +585,11 @@ namespace LinBox
             }
             return L;
         }
-        
+
     };
-    
-    
-    
+
+
+
 } // end of LinBox namespace
 
 #endif  //__LINBOX_pp_gauss_poweroftwo_H
diff --git a/linbox/algorithms/smith-form-textbook.h b/linbox/algorithms/smith-form-textbook.h
new file mode 100644
index 0000000..ccb8579
--- /dev/null
+++ b/linbox/algorithms/smith-form-textbook.h
@@ -0,0 +1,268 @@
+/* 
+ * Copyright (C) 2014 Gavin Harrison,
+ *
+ * Written by Gavin Harrison <gmh33 at drexel.edu>,
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+#include "linbox/matrix/dense-matrix.h"
+
+#ifndef __LINBOX_smith_form_textbook_domain_H
+#define __LINBOX_smith_form_textbook_domain_H
+
+namespace LinBox
+{
+	template<class MatrixDomain>
+	class SmithFormTextbookDomain {
+	public:
+		typedef typename MatrixDomain::Field Field;
+		typedef typename Field::Element Element;
+		typedef BlasMatrix<Field> Rep;
+
+	private:
+		MatrixDomain _MD;
+
+	public:
+		const Field &field() const { return _MD.field(); }
+		SmithFormTextbookDomain(const MatrixDomain &MD) : _MD(MD) {}
+		SmithFormTextbookDomain(const SmithFormTextbookDomain &D) : _MD(D._MD) {}
+
+	private:
+		void swapRows(Rep &A, int n, int a, int b) const
+		{
+			for (size_t i = n; i < A.coldim(); i++)
+			{
+				Element tmp1, tmp2;
+
+				A.getEntry(tmp1, a, i);
+				A.getEntry(tmp2, b, i);
+
+				A.setEntry(a, i, tmp2);
+				A.setEntry(b, i, tmp1);
+			}
+		}
+
+		void swapCols(Rep &A, int n, int a, int b) const
+		{
+			for (size_t i = n; i < A.rowdim(); i++)
+			{
+				Element tmp1, tmp2;
+
+				A.getEntry(tmp1, i, a);
+				A.getEntry(tmp2, i, b);
+
+				A.setEntry(i, a, tmp2);
+				A.setEntry(i, b, tmp1);
+			}
+		}
+
+		// Ensures that if a=b then s=u=v=1 and t=0 to avoid an infinite loop
+		void dxgcd(Element &s, Element &t, Element &u, Element &v, const Element &a, const Element &b) const
+		{
+			if (field().areEqual(a,b))
+			{
+				field().assign(s, field().one);
+				field().assign(t, field().zero);
+				field().assign(u, field().one);
+				field().assign(v, field().one);
+				return;
+			}
+
+			Element g;
+			field().dxgcd(g,s,t,u,v,a,b);
+		}
+
+		bool findPivot(Rep &A, size_t n) const
+		{
+			for (size_t i = n; i < A.rowdim(); i++)
+			{
+				for (size_t j = n; j < A.coldim(); j++)
+				{
+					Element tmp;
+					A.getEntry(tmp, i, j);
+
+					if (!field().isZero(tmp))
+					{
+						if (i != n)
+							swapRows(A, n, n, i);
+
+						if (j != n)
+							swapCols(A, n, n, j);
+
+						return true;;
+					}
+				}
+			}
+
+			return false;
+		}
+
+		bool eliminateCol(Rep &A, int n) const
+		{
+			bool modified = false;
+
+			for (size_t i = n+1; i < A.rowdim(); i++)
+			{
+				Element nn, in;
+
+				A.getEntry(nn, n, n);
+				A.getEntry(in, i, n);
+
+				if (!field().isZero(in))
+				{
+					modified = true;
+
+					Element s, t, u, v;
+					dxgcd(s, t, u, v, nn, in);
+
+					for (size_t j = n; j < A.coldim(); j++)
+					{
+						Element nj, ij;
+
+						A.getEntry(nj, n, j);
+						A.getEntry(ij, i, j);
+
+						Element tmp1, tmp2;
+
+						field().mul(tmp1, nj, s);
+						field().mul(tmp2, ij, t);
+						field().addin(tmp1, tmp2);
+						A.setEntry(n, j, tmp1);
+
+						field().mul(tmp1, nj, v);
+						field().mul(tmp2, ij, u);
+						field().subin(tmp1, tmp2);
+						A.setEntry(i, j, tmp1);
+					}
+				}
+			}
+
+			return modified;
+		}
+
+		bool eliminateRow(Rep &A, int n) const
+		{
+			int modified = false;
+
+			for (size_t i = n+1; i < A.coldim(); i++)
+			{
+				Element nn, ni;
+
+				A.getEntry(nn, n, n);
+				A.getEntry(ni, n, i);
+
+				if (!field().isZero(ni))
+				{
+					modified = true;
+
+					Element s, t, u, v;
+					dxgcd(s, t, u, v, nn, ni);
+
+					for (size_t j = n; j < A.rowdim(); j++)
+					{
+						Element jn, ji;
+
+						A.getEntry(jn, j, n);
+						A.getEntry(ji, j, i);
+
+						Element tmp1, tmp2;
+
+						field().mul(tmp1, jn, s);
+						field().mul(tmp2, ji, t);
+						field().addin(tmp1, tmp2);
+						A.setEntry(j, n, tmp1);
+
+						field().mul(tmp1, jn, v);
+						field().mul(tmp2, ji, u);
+						field().subin(tmp1, tmp2);
+						A.setEntry(j, i, tmp1);
+					}
+				}
+			}
+
+			return modified;
+		}
+
+		bool fixDiagonal(Rep &A) const
+		{
+			bool fixed = false;
+
+			size_t dim = A.rowdim() < A.coldim() ? A.rowdim() : A.coldim();
+
+			for (size_t i = 0; i < dim-1; i++)
+			{
+				Element tmp1, tmp2;
+
+				A.getEntry(tmp1, i, i);
+				A.getEntry(tmp2, i+1, i+1);
+
+				if (!field().isZero(tmp2))
+				{
+					Element g;
+					field().gcd(g, tmp1, tmp2);
+
+					if (!field().areAssociates(g, tmp1))
+					{
+						A.setEntry(i+1, i, tmp2);
+						fixed = true;
+					}
+				}
+				else
+				{
+					return fixed;
+				}
+			}
+
+			return fixed;
+		}
+
+	public:
+		template<class Vector>
+		Vector &solve(Vector &S, const Rep &A) const
+		{
+			size_t dim = A.rowdim() < A.coldim() ? A.rowdim() : A.coldim();
+
+			linbox_check(S.size() >= dim);
+
+			Rep B(A);
+
+			do
+			{
+				for (size_t n = 0; n < dim && findPivot(B, n); n++)
+				{
+					eliminateCol(B, n);
+					while(eliminateRow(B, n) && eliminateCol(B, n));
+				}
+			} while(fixDiagonal(B));
+
+			for (size_t i = 0; i < dim; i++)
+			{
+				Element tmp;
+				B.getEntry(tmp, i, i);
+				S.setEntry(i, tmp);
+			}
+
+			return S;
+		}
+	};
+}
+
+#endif // __LINBOX_smith_form_direct_domain_H
diff --git a/linbox/algorithms/toeplitz-det.h b/linbox/algorithms/toeplitz-det.h
index 3070da6..b1f005f 100644
--- a/linbox/algorithms/toeplitz-det.h
+++ b/linbox/algorithms/toeplitz-det.h
@@ -38,19 +38,18 @@ namespace LinBox
 	  const typename PField::Element& T, size_t n )
 	{
 		short int sign = 1;
-		typename PField::Coeff one, temp;
+		typename PField::Coeff  temp;
 		const typename PField::CoeffField& CField = F.getCoeffField();
-		CField.init(one,1);
-		CField.init(res,1);
+		CField.assign(res,CField.one);
 		typename PField::Element f1, f2( T ), fi;
-		F.setCoeff( f1, 2*n - 1, one );
-		F.init( fi, one );
+		F.setCoeff( f1, 2*n - 1, CField.one );
+		F.assign( fi, F.one );
 
 		while( F.deg(f2) >= n ) {
 			F.rem( fi, f1, f2 );
 			CField.mulin
 			( res, CField.powin( F.leadCoeff( temp, f2 ),
-					     F.deg(f1) - F.deg(fi) ) );
+					     (long)(F.deg(f1) - F.deg(fi)) ) );
 			if( !((F.deg(f2)-F.deg(f1))%2) && !((F.deg(f1)-n)%2) )
 				sign = (short)-sign;
 			f1 = f2;
@@ -60,14 +59,12 @@ namespace LinBox
 		if( F.deg(f2) == (n-1) ) {
 			CField.mulin
 			( res, CField.powin( F.leadCoeff( temp, f2 ),
-					     F.deg(f1) - F.deg(f2) ) );
+					     (long)(F.deg(f1) - F.deg(f2)) ) );
 			if( sign == -1 ) {
-				typename PField::Coeff negOne;
-				CField.init( negOne, -1 );
-				CField.mulin( res, negOne );
+				CField.mulin( res, CField.mOne);
 			}
 		}
-		else CField.init( res, 0 );
+		else CField.assign( res, CField.zero );
 
 		return res;
 	}
diff --git a/linbox/algorithms/triangular-solve-gf2.h b/linbox/algorithms/triangular-solve-gf2.h
index 824a69d..d2db10b 100644
--- a/linbox/algorithms/triangular-solve-gf2.h
+++ b/linbox/algorithms/triangular-solve-gf2.h
@@ -2,20 +2,20 @@
  * Copyright(C) LinBox 2008
  * Written by Jean-Guillaume Dumas
  * Triangular Solve
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -53,9 +53,9 @@ namespace LinBox
 		//         for( ; (res != x.end()) && (row != U.rowEnd()); ++res, ++row, ++vec) { }
 		size_t last = x.size();
 		if( b.size() < last ) last = b.size();
-		res += last;
-		row += last;
-		vec += last;
+		res += (ptrdiff_t)last;
+		row += (ptrdiff_t)last;
+		vec += (ptrdiff_t) last;
 
 		VectorCategories::DenseZeroOneVectorTag  DZOtag;
 		VectorCategories::SparseZeroOneVectorTag SZOtag;
@@ -72,7 +72,7 @@ namespace LinBox
 
 			VectorDomain<Field> VD(F2);
 			for( ; row != U.begin(); --row, --vec, --res) {
-				F2.init(*res, 0UL);
+				F2.assign(*res, F2.zero);
 				if (row->size()) {
 					typename Field::Element tmp;
 					VD.dotSpecialized(tmp, x, *row, DZOtag, SZOtag);
@@ -87,7 +87,7 @@ namespace LinBox
 					}
 				}
 			}
-			F2.init(*res, 0UL);
+			F2.assign(*res, F2.zero);
 			if (row->size()) {
 				typename Field::Element tmp;
 				VD.dotSpecialized(tmp, x, *row, DZOtag, SZOtag);
@@ -125,7 +125,7 @@ namespace LinBox
 		VectorCategories::SparseZeroOneVectorTag SZOtag;
 		VectorDomain<GF2> VD(F2);
 		for( ; row != L.end(); ++row, ++vec, ++res) {
-			F2.init(*res, 0UL);
+			F2.assign(*res, F2.zero);
 			GF2::Element tmp;
 			VD.dotSpecialized(tmp, *row, x, SZOtag, DZOtag);
 			F2.negin(tmp);
diff --git a/linbox/algorithms/triangular-solve.h b/linbox/algorithms/triangular-solve.h
index 435ffb8..06b6313 100644
--- a/linbox/algorithms/triangular-solve.h
+++ b/linbox/algorithms/triangular-solve.h
@@ -1,20 +1,20 @@
 /* ===================================================================
  * Copyright(C) 2008 LinBox
  * Triangular Solve
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -50,7 +50,7 @@ namespace LinBox
 		// Assume U has form (U1, X | 0, 0), where U1 is invertible.
 		// Discover the rank of U so as to use the bottom of x to seed the solution.
 		for(row = U.rowEnd()-1; row >= U.rowBegin() && row->size() == 0; --row);
-		row++; // now points to first zero row of U.
+		++row; // now points to first zero row of U.
 		res += row - U.rowBegin();
 		vec += row - U.rowBegin();
 
@@ -66,7 +66,7 @@ namespace LinBox
 
 			VectorDomain<Field> VD(F);
 			for( ; row != U.rowBegin(); --row, --vec, --res) {
-				F.init(*res, 0UL);
+				F.assign(*res, F.zero);
 				if (row->size()) {
 					typename Field::Element tmp;
 					VD.dot(tmp, *row, x);
@@ -84,7 +84,7 @@ namespace LinBox
 				}
 			}
 
-			F.init(*res, 0UL);
+			F.assign(*res, F.zero);
 			if (row->size()) {
 				typename Field::Element tmp;
 				VD.dot(tmp, *row, x);
@@ -128,7 +128,8 @@ namespace LinBox
 			vec += b.size(); --vec;
 
 			typename Matrix::ConstRowIterator row=U.rowBegin();
-			row += rank; --row;
+			row += (ptrdiff_t)rank;
+		       	--row;
 
 			VectorDomain<Field> VD(F);
 
@@ -187,7 +188,7 @@ namespace LinBox
 
 		VectorDomain<Field> VD(F);
 		for( ; row != L.rowEnd(); ++row, ++vec, ++res) {
-			F.init(*res, 0UL);
+			F.assign(*res, F.zero);
 			typename Field::Element tmp;
 			VD.dot(tmp, *row, x);
 			F.negin(tmp);
diff --git a/linbox/algorithms/varprec-cra-early-multip.h b/linbox/algorithms/varprec-cra-early-multip.h
index 5f5ccda..e061242 100644
--- a/linbox/algorithms/varprec-cra-early-multip.h
+++ b/linbox/algorithms/varprec-cra-early-multip.h
@@ -28,7 +28,6 @@
 #include "linbox/util/timer.h"
 #include <stdlib.h>
 #include "linbox/integer.h"
-#include "linbox/field/PID-integer.h"
 #include "linbox/field/gmp-rational.h"
 #include "linbox/solutions/methods.h"
 #include <vector>
@@ -49,7 +48,7 @@ namespace LinBox
 	 * FullMulpitCRA should consist of vectors of size 0, but errors happen.
 	 */
 
-	//typedef PID_Integer Integers;
+	//typedef Givaro::ZRing<Integer> Integers;
 	//typedef Integers::Element Integer;
 
 	template<class Domain_Type>
@@ -63,18 +62,19 @@ namespace LinBox
 		typedef VarPrecEarlyMultipCRA<Domain> Self_t;
 
 	protected:
-		std::vector< Integer > vfactor_;
-		std::vector< Integer > vmultip_;
+		BlasVector< Givaro::ZRing<Integer> > vfactor_;
+		BlasVector< Givaro::ZRing<Integer> > vmultip_;
 
 		std::vector< unsigned long > randv;
+		Integer& result(Integer &d) {return d;}; // DON'T TOUCH
 	public:
 		VarPrecEarlyMultipCRA(const unsigned long EARLY = DEFAULT_EARLY_TERM_THRESHOLD, const double b=0.0,
-				      const std::vector<Integer>& vf = std::vector<Integer>(0),
-				      const std::vector<Integer>& vm = std::vector<Integer>(0)) :
+				      const BlasVector<Givaro::ZRing<Integer> >& vf = BlasVector<Givaro::ZRing<Integer> >(Givaro::ZRing<Integer>()),
+				      const BlasVector<Givaro::ZRing<Integer> >& vm = BlasVector<Givaro::ZRing<Integer> >(Givaro::ZRing<Integer>())) :
 			EarlySingleCRA<Domain>(EARLY), FullMultipCRA<Domain>(b), vfactor_(vf), vmultip_(vm)
 		{
 			for (int i=0; i < (int)vfactor_.size(); ++i) {
-				if (vfactor_[i]==0) vfactor_[i]=1;
+				if (vfactor_[(size_t)i]==0) vfactor_[(size_t)i]=1;
 			}
 		}
 
@@ -82,18 +82,18 @@ namespace LinBox
 			EarlySingleCRA<Domain>(other.EARLY_TERM_THRESHOLD), FullMultipCRA<Domain>(other.LOGARITHMIC_UPPER_BOUND), vfactor_(other.vfactor_), vmultip_(other.vmultip_)
 		{
 			for (int i=0; i < vfactor_.size(); ++i) {
-				if (vfactor_[i]==0) vfactor_[i]=1;
+				if (vfactor_[(size_t)i]==0) vfactor_[(size_t)i]=1;
 			}
 		}
 
-		int getThreshold(int& t) {return t = EarlySingleCRA<Domain>::EARLY_TERM_THRESHOLD;}
+		int getThreshold(int& t) {return t = (int)EarlySingleCRA<Domain>::EARLY_TERM_THRESHOLD;}
 
 		Integer& getModulus(Integer& m) {EarlySingleCRA<Domain>::getModulus(m);return m;}
 		Integer& getResidue(Integer& r) {EarlySingleCRA<Domain>::getResidue(r);return r;}
 
 		template<class Vect>
 		Vect& getResidue(Vect& r) {
-			Vect z,vf, vm;
+			Vect z(r.field()),vf(r.field()), vm(r.field());
 			FullMultipCRA<Domain>::result(z);
 
 			typename Vect::const_iterator it,itf,itm;
@@ -176,7 +176,7 @@ namespace LinBox
 		template<class Vect>
 		void progress (const Domain& D, const Vect& e) {
 			//z = (e/ factor mod D)
-			// Could be much faster
+			//!@todo Could be much faster
 			// - do not compute twice the product of moduli
 			// - reconstruct one element of e until Early Termination,
 			//   then only, try a random linear combination.
@@ -192,6 +192,25 @@ namespace LinBox
 			FullMultipCRA<Domain>::progress(D, e);
 		}
 
+		template<class OKDomain>
+		void progress (const Domain& D, const BlasVector<OKDomain>& e) {
+			//z = (e/ factor mod D)
+			//!@todo Could be much faster
+			// - do not compute twice the product of moduli
+			// - reconstruct one element of e until Early Termination,
+			//   then only, try a random linear combination.
+
+			BlasVector<Domain> vz(D,vfactor_.size());
+			inverse(vz,vfactor_,D);
+			productin(vz,vmultip_,D);
+			productin(vz,e,D);
+			DomainElement z;
+			dot(z,D,vz,randv);
+
+			EarlySingleCRA<Domain>::progress(D, z);
+			FullMultipCRA<Domain>::progress(D, e);
+		}
+
 		bool terminated() {
 			bool ET = EarlySingleCRA<Domain>::terminated();
 			if (FullMultipCRA<Domain>::LOGARITHMIC_UPPER_BOUND> 1.0) ET = ET || FullMultipCRA<Domain>::terminated();
@@ -297,7 +316,8 @@ namespace LinBox
 		}
 
 		template<template<class,class> class Vect, template<class> class Alloc>
-		Vect<Integer, Alloc<Integer> >& result(Vect<Integer, Alloc<Integer> >& num, Integer& den) {
+		Vect<Integer, Alloc<Integer> >& result(Vect<Integer, Alloc<Integer> >& num, Integer& den)
+		{
 			if ((FullMultipCRA<Domain>::LOGARITHMIC_UPPER_BOUND> 1.0) && ( FullMultipCRA<Domain>::terminated() )) {
 				FullMultipCRA<Domain>::result(num);
 				den = 1;
@@ -337,8 +357,51 @@ namespace LinBox
 			}
 		}
 
+		BlasVector<Givaro::ZRing<Integer> >& result(BlasVector<Givaro::ZRing<Integer> >& num, Integer& den)
+		{
+			if ((FullMultipCRA<Domain>::LOGARITHMIC_UPPER_BOUND> 1.0) && ( FullMultipCRA<Domain>::terminated() )) {
+				FullMultipCRA<Domain>::result(num);
+				den = 1;
+				return num;
+			}
+			else {
+				Givaro::ZRing<Integer> Z;
+				BlasVector<Givaro::ZRing<Integer> > z(Z),vf(Z), vm(Z);
+				FullMultipCRA<Domain>::result(z);//vector of non prec results
+
+				typename BlasVector<Givaro::ZRing<Integer> >::const_iterator it,itf,itm;
+				typename BlasVector<Givaro::ZRing<Integer> >::iterator itt;
+
+				Integer M; getModulus(M);
+				getPreconditioner(vf,vm);
+
+				BlasVector<Givaro::ZRing<Integer> > residue(Z);//vector of residues
+				getResidue(residue);
+
+				num.clear();
+
+				//getPreconditioner(vf,vm);
+				itf = vf.begin(); itm = vm.begin();it = residue.begin();
+				den = 1; Integer old_den =1;
+				for (; it!= residue.end(); ++it, ++itf,++itm ) {
+					lcm(den,den,*itm);Integer d = den/old_den;
+
+					num.push_back((*itf) * (*it));
+					if (den != old_den) {
+						for (itt=num.begin(); itt !=num.end()-1 ;++itt) {
+							*itt *= d;
+						}
+						*itt = *itt * (den/ (*itm));
+					}
+					old_den = den;
+				}
+				return num;
+			}
+		}
+
 		template<template<class, class> class Vect, template<class> class Alloc>
-		Vect<Quotient, Alloc<Quotient> >& result(Vect<Quotient, Alloc<Quotient> >& q) {
+		Vect<Quotient, Alloc<Quotient> >& result(Vect<Quotient, Alloc<Quotient> >& q)
+		{
 			q.clear();
 			if ((FullMultipCRA<Domain>::LOGARITHMIC_UPPER_BOUND> 1.0) && ( FullMultipCRA<Domain>::terminated() )) {
 				std::vector<Integer> vz;
@@ -346,7 +409,7 @@ namespace LinBox
 
 				typename Vect<Integer, Alloc<Integer> >::const_iterator it = vz.begin();
 				for (; it!= vz.end(); ++it) {
-					q.push_back(Quotient(*it,1UL));
+					q.push_back(Quotient(*it,1));
 				}
 				return q;
 			}
@@ -382,23 +445,24 @@ namespace LinBox
 
 			vfactor_ = vf;
 			for (int i=0; i < (int)vfactor_.size(); ++i) {
-				if (vfactor_[i]==0) vfactor_[i]=1;	//if factor ==0 set no factor
+				if (vfactor_[(size_t)i]==0) vfactor_[(size_t)i]=1;	//if factor ==0 set no factor
 			}
 			vmultip_ = vm;
 
-			Vect e(vfactor_.size());
+			Givaro::ZRing<Integer> Z;
+			Vect e(Z,vfactor_.size());
 
 			//clear CRAEarlySingle;
 			EarlySingleCRA<Domain>::occurency_ = 0;
-			EarlySingleCRA<Domain>::nextM_ = 1UL;
-			EarlySingleCRA<Domain>::primeProd_ = 1UL;
+			EarlySingleCRA<Domain>::nextM_ = 1;
+			EarlySingleCRA<Domain>::primeProd_ = 1;
 			EarlySingleCRA<Domain>::residue_ = 0;
 
 			//Computation of residue_
 
 			//std::vector< double >::iterator  _dsz_it = RadixSizes_.begin();
 			std::vector< LazyProduct >::iterator _mod_it = FullMultipCRA<Domain>::RadixPrimeProd_.end();// list of prime products
-			std::vector< std::vector<Integer> >::iterator _tab_it = FullMultipCRA<Domain>::RadixResidues_.end();// list of residues as vectors of size 1
+			std::vector< BlasVector<Givaro::ZRing<Integer> > >::iterator _tab_it = FullMultipCRA<Domain>::RadixResidues_.end();// list of residues as vectors of size 1
 			std::vector< bool >::iterator    _occ_it = FullMultipCRA<Domain>::RadixOccupancy_.end();//flags of occupied fields
 			int n = (int)FullMultipCRA<Domain>::RadixOccupancy_.size();
 			//std::vector<Integer> ri(1); LazyProduct mi; double di;
@@ -410,7 +474,7 @@ namespace LinBox
 				++shelf;
 				if (*_occ_it) {
 					Integer D = _mod_it->operator()();
-					Vect e_v(vfactor_.size());
+					Vect e_v(Z,vfactor_.size());
 					inverse(e_v,vfactor_,D);
 					productin(e_v,*_tab_it,D);
 					productin(e_v,vmultip_,D);
@@ -423,7 +487,7 @@ namespace LinBox
 					EarlySingleCRA<Domain>::progress(D,z);
 
 					if (prev_residue_ == EarlySingleCRA<Domain>::residue_ ) {
-						EarlySingleCRA<Domain>::occurency_ = EarlySingleCRA<Domain>::occurency_ +  (shelf - prev_shelf);
+						EarlySingleCRA<Domain>::occurency_ = EarlySingleCRA<Domain>::occurency_ + (unsigned int) (shelf - prev_shelf);
 					}
 					if ( EarlySingleCRA<Domain>::terminated() ) {
 						return true;
@@ -451,8 +515,9 @@ namespace LinBox
 		template <template<class> class Alloc, template<class, class> class Vect1, class Vect2>
 		DomainElement& dot (DomainElement& z, const Domain& D,
 				    const Vect1<DomainElement, Alloc<DomainElement> >& v1,
-				    const Vect2& v2) {
-			D.init(z,0); DomainElement tmp;
+				    const Vect2& v2)
+		{
+			D.assign(z,D.zero); DomainElement tmp;
 			typename Vect1<DomainElement, Alloc<DomainElement> >::const_iterator v1_p;
 			typename Vect2::const_iterator v2_p;
 
@@ -461,8 +526,24 @@ namespace LinBox
 			return z;
 		}
 
+		template<class Vect2>
+		DomainElement& dot (DomainElement& z, const Domain& D,
+				    const BlasVector<Domain>& v1,
+				    const Vect2& v2)
+		{
+			D.assign(z,D.zero); DomainElement tmp;
+			typename BlasVector<Domain>::const_iterator v1_p;
+			typename Vect2::const_iterator v2_p;
+
+			for (v1_p  = v1. begin(), v2_p = v2. begin();v1_p != v1. end();++ v1_p, ++ v2_p)
+				D.axpyin(z, (*v1_p), D.init(tmp, (*v2_p)));
+			return z;
+		}
+
+
 		template <template<class> class Alloc, template<class, class> class Vect1, class Vect2>
-		Integer& dot (Integer& z, const Integer& D, const Vect1<Integer, Alloc<Integer> >& v1, const Vect2& v2) {
+		Integer& dot (Integer& z, const Integer& D, const Vect1<Integer, Alloc<Integer> >& v1, const Vect2& v2)
+		{
 			z = 0;
 			typename Vect1<Integer, Alloc<Integer> >::const_iterator v1_p;
 			typename Vect2::const_iterator v2_p;
@@ -472,14 +553,28 @@ namespace LinBox
 			return z;
 		}
 
+		template<class Vect2>
+		Integer& dot (Integer& z, const Integer& D, const BlasVector<Givaro::ZRing<Integer> >& v1, const Vect2& v2)
+		{
+			z = 0;
+			typename BlasVector<Givaro::ZRing<Integer> >::const_iterator v1_p;
+			typename Vect2::const_iterator v2_p;
+			for (v1_p  = v1. begin(), v2_p = v2. begin(); v1_p != v1. end(); ++ v1_p, ++ v2_p) {
+				z = (z + (*v1_p)*int64_t(*v2_p))%D;
+			}
+			return z;
+		}
+
+
 		template<class Vect1, class Vect2>
-		Vect1& inverse(Vect1& vz,const Vect2 vf, const Domain D) {
+		Vect1& inverse(Vect1& vz,const Vect2& vf, const Domain D)
+		{
 			vz.clear();
 			typename Vect2::const_iterator it = vf.begin();
 
 			for (; it != vf.end(); ++it) {
 				DomainElement z,i;
-				D.init(z,1);
+				D.assign(z,D.one);
 				D.init(i,*it);
 				if (!D.isZero(i)) D.inv(z,i);
 				vz.push_back(z);
@@ -489,7 +584,8 @@ namespace LinBox
 		}
 
 		template<class Vect1, class Vect2>
-		Vect1& inverse(Vect1& vz,const Vect2& vf, const Integer& D) {
+		Vect1& inverse(Vect1& vz,const Vect2& vf, const Integer& D)
+		{
 			vz.clear();
 			typename Vect2::const_iterator it = vf.begin();
 
@@ -500,9 +596,10 @@ namespace LinBox
 			}
 			return vz;
 		}
+
 	public:
 		template<class Vect1, class Vect2>
-		Vect1& productin(Vect1& vz, const Vect2 vm, const Domain D) {
+		Vect1& productin(Vect1& vz, const Vect2 &vm, const Domain D) {
 			typename Vect1::iterator v1_p;
 			typename Vect2::const_iterator v2_p;
 
@@ -559,11 +656,10 @@ namespace LinBox
 #endif //__LINBOX_varprec_cra_multip_single_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/varprec-cra-early-single.h b/linbox/algorithms/varprec-cra-early-single.h
index ee290c1..6d6e34d 100644
--- a/linbox/algorithms/varprec-cra-early-single.h
+++ b/linbox/algorithms/varprec-cra-early-single.h
@@ -28,10 +28,8 @@
 #include "linbox/util/timer.h"
 #include <stdlib.h>
 #include "linbox/integer.h"
-#include "linbox/field/PID-integer.h"
 #include "linbox/field/gmp-rational.h"
 #include "linbox/solutions/methods.h"
-#include <vector>
 #include <utility>
 #include "linbox/algorithms/cra-early-single.h"
 #include "linbox/algorithms/cra-full-multip.h"
@@ -51,7 +49,7 @@ namespace LinBox
 	template<class Domain_Type>
 	struct VarPrecEarlySingleCRA: public EarlySingleCRA<Domain_Type>, FullMultipCRA<Domain_Type> {
 
-		//typedef PID_Integer Integers;
+		//typedef Givaro::ZRing<Integer> Integers;
 		//typedef Integers::Element Integer;
 		typedef GMPRationalField Rationals;
 		typedef Rationals::Element Quotient;
@@ -87,7 +85,7 @@ namespace LinBox
 
 		int getThreshold(int& t)
 		{
-			return t = EarlySingleCRA<Domain>::EARLY_TERM_THRESHOLD;
+			return t = (int)EarlySingleCRA<Domain>::EARLY_TERM_THRESHOLD;
 		}
 
 		Integer& getModulus(Integer& m)
@@ -114,7 +112,8 @@ namespace LinBox
 			z%=D;
 
 			EarlySingleCRA<Domain>::initialize(D, z);
-			std::vector<Integer> v;
+			Givaro::ZRing<Integer> ZZ ;
+			BlasVector<Givaro::ZRing<Integer> > v(ZZ);
 			v.push_back(e);
 			FullMultipCRA<Domain>::initialize(D, v);
 		}
@@ -129,7 +128,7 @@ namespace LinBox
 			D.mulin(z,m);
 
 			EarlySingleCRA<Domain>::initialize(D, z);
-			std::vector<DomainElement> v;
+			BlasVector<Domain> v(D);
 			v.push_back(e);
 			FullMultipCRA<Domain>::initialize(D, v);
 		}
@@ -150,7 +149,8 @@ namespace LinBox
 			//z = e / factor mod D;
 			EarlySingleCRA<Domain>::progress(D, z);
 
-			std::vector<Integer> v;
+			Givaro::ZRing<Integer> ZZ ;
+			BlasVector<Givaro::ZRing<Integer> > v(ZZ);
 			v.push_back(e);
 			FullMultipCRA<Domain>::progress(D, v);
 		}
@@ -173,7 +173,7 @@ namespace LinBox
 
 			EarlySingleCRA<Domain>::progress(D, z);
 
-			std::vector<DomainElement> v;
+			BlasVector<Domain> v(D);
 			v.push_back(e);
 
 			FullMultipCRA<Domain>::progress(D, v);
@@ -218,7 +218,8 @@ namespace LinBox
 		Integer& result(Integer& r)
 		{
 			if ((FullMultipCRA<Domain>::LOGARITHMIC_UPPER_BOUND> 1.0) && ( FullMultipCRA<Domain>::terminated() )) {
-				std::vector<Integer> v;
+				Givaro::ZRing<Integer> ZZ ;
+				BlasVector<Givaro::ZRing<Integer> > v(ZZ);
 				FullMultipCRA<Domain>::result(v);
 				return r = v.front();
 			}
@@ -232,7 +233,8 @@ namespace LinBox
 		Quotient& result(Quotient& q)
 		{
 			if ((FullMultipCRA<Domain>::LOGARITHMIC_UPPER_BOUND> 1.0) && ( FullMultipCRA<Domain>::terminated() )) {
-				std::vector<Integer> v;
+				Givaro::ZRing<Integer> ZZ ;
+				BlasVector<Givaro::ZRing<Integer> > v(ZZ);
 				FullMultipCRA<Domain>::result(v);
 				return q = v.front();
 			}
@@ -248,7 +250,8 @@ namespace LinBox
 		{
 			if ((FullMultipCRA<Domain>::LOGARITHMIC_UPPER_BOUND> 1.0) && ( FullMultipCRA<Domain>::terminated() )) {
 				den =1;
-				std::vector<Integer> v;
+				Givaro::ZRing<Integer> ZZ ;
+				BlasVector<Givaro::ZRing<Integer> > v(ZZ);
 				FullMultipCRA<Domain>::result(v);
 				return num = v.front();
 			}
@@ -276,18 +279,18 @@ namespace LinBox
 
 			//clear CRAEarlySingle;
 			EarlySingleCRA<Domain>::occurency_ = 0;
-			EarlySingleCRA<Domain>::nextM_ = 1UL;
-			EarlySingleCRA<Domain>::primeProd_ = 1UL;
+			EarlySingleCRA<Domain>::nextM_ = 1;
+			EarlySingleCRA<Domain>::primeProd_ = 1;
 			EarlySingleCRA<Domain>::residue_ = 0;
 
 			//Computation of residue_
 
 			//std::vector< double >::iterator  _dsz_it = RadixSizes_.begin();//nie wiem
 			std::vector< LazyProduct >::iterator          _mod_it = FullMultipCRA<Domain>::RadixPrimeProd_.end(); // list of prime products
-			std::vector< std::vector<Integer> >::iterator _tab_it = FullMultipCRA<Domain>::RadixResidues_.end();  // list of residues as vectors of size 1
+			std::vector< BlasVector<Givaro::ZRing<Integer> > >::iterator _tab_it = FullMultipCRA<Domain>::RadixResidues_.end();  // list of residues as vectors of size 1
 			std::vector< bool >::iterator                 _occ_it = FullMultipCRA<Domain>::RadixOccupancy_.end(); //flags of occupied fields
 			int n= (int) FullMultipCRA<Domain>::RadixOccupancy_.size();
-			//std::vector<Integer> ri(1); LazyProduct mi; double di;//nie wiem
+			//BlasVector<Givaro::ZRing<Integer> > ri(1); LazyProduct mi; double di;//nie wiem
 			// could be much faster if max occupandy is stored
 			--_mod_it; --_tab_it; --_occ_it;
 			int prev_shelf=0, shelf = 0; Integer prev_residue_ =0;
@@ -308,7 +311,7 @@ namespace LinBox
 					EarlySingleCRA<Domain>::progress(D,e_i);
 
 					if (prev_residue_ == EarlySingleCRA<Domain>::residue_ ) {
-						EarlySingleCRA<Domain>::occurency_ = EarlySingleCRA<Domain>::occurency_ +  (shelf - prev_shelf);
+						EarlySingleCRA<Domain>::occurency_ = EarlySingleCRA<Domain>::occurency_ + (unsigned int)  (shelf - prev_shelf);
 					}
 
 
diff --git a/linbox/algorithms/vector-fraction.h b/linbox/algorithms/vector-fraction.h
index af94e3a..f128a09 100644
--- a/linbox/algorithms/vector-fraction.h
+++ b/linbox/algorithms/vector-fraction.h
@@ -28,6 +28,7 @@
 #include "linbox/linbox-config.h"
 #include "linbox/util/debug.h"
 #include <stdio.h>
+#include "linbox/vector/blas-vector.h"
 #include "linbox/vector/vector-traits.h"
 
 namespace LinBox
@@ -54,7 +55,7 @@ namespace LinBox
 	//this could be replaced by a fancier version that combines elements linearly at random
 	template<class Domain, class Vector>
 	void vectorGcdIn(typename Domain::Element& result, Domain& D, Vector& v) {
-		for (typename Vector::iterator i = v.begin(); i != v.end(); i++)
+		for (typename Vector::iterator i = v.begin(); i != v.end(); ++i)
 			D.gcdin(result, *i);
 	}
 
@@ -63,7 +64,7 @@ namespace LinBox
 	template<class Domain, class Vector>
 	typename Domain::Element vectorGcd(Domain& D, Vector& v) {
 		typename Domain::Element result;
-		D.init(result, 0);
+		D.assign(result, D.zero);
 		vectorGcdIn(result, D, v);
 		return result;
 	}
@@ -71,7 +72,7 @@ namespace LinBox
 
 	/**
 	 * \brief VectorFraction<Domain> is a vector of rational elements with common reduced denominator.
-	 * Here Domain is a ring supporting the gcd, eg NTL_ZZ or PID_integer
+	 * Here Domain is a ring supporting the gcd, eg NTL_ZZ or Givaro::ZRing<Integer>
 	 *	 For compatability with the return type of rationalSolver, it allows conversion from/to
 	 *       std::vector<std::pair<Domain::Element> >.
 	 *       All functions will return the fraction in reduced form, calling reduce() if necessary.
@@ -80,15 +81,14 @@ namespace LinBox
 	template<class Domain>
 	class VectorFraction{
 	public:
-		typedef typename Domain::Element Element;
+		typedef typename Domain::Element              Element;
 		typedef typename std::pair<Element, Element> Fraction;
-		typedef typename std::vector<Fraction> FVector;
-		typedef typename Vector<Domain>::Dense Vector;
+		typedef typename std::vector<Fraction>        FVector;
+		typedef BlasVector<Domain>   Vector;
 
 		Vector numer;
 		Element denom;
 		const Domain& _domain;
-		Element zero;
 
 		/**
 		 * constructor from vector of rational numbers
@@ -102,13 +102,12 @@ namespace LinBox
 			bool alreadyReduced = false;
 			typename FVector::iterator i;
 
-			D.init(zero, 0);
-			D.init(denom, 1);
+			D.assign(denom, D.one);
 			if (!alreadyReduced)
-				for (i=frac.begin(); i!=frac.end(); i++)
+				for (i=frac.begin(); i!=frac.end(); ++i)
 					reduceIn(D, *i);
 
-			for (i=frac.begin(); i!=frac.end(); i++) {
+			for (i=frac.begin(); i!=frac.end(); ++i) {
 				linbox_check(!D.isZero(i->second));
 				D.lcmin(denom, i->second);
 			}
@@ -116,7 +115,7 @@ namespace LinBox
 			numer = Vector(frac.size());
 			typename Vector::iterator j;
 
-			for (i=frac.begin(), j=numer.begin(); i!=frac.end(); i++, j++){
+			for (i=frac.begin(), j=numer.begin(); i!=frac.end(); ++i, ++j){
 				D.mul(*j, denom, i->first);
 				D.divin(*j, i->second);
 			}
@@ -124,20 +123,19 @@ namespace LinBox
 
 		/** allocating constructor, returns [0, 0, ... 0]/1 */
 		VectorFraction(const Domain& D, size_t n) :
-			_domain(D)
+			numer(D,n)
+			,_domain(D)
 		{
-			D.init(zero, 0);
-			D.init(denom, 1);
-			numer = Vector(n);
 			typename Vector::iterator j;
 
-			for (j=numer.begin(); j!=numer.end(); j++)
-				D.assign(*j, zero);
+			for (j=numer.begin(); j!=numer.end(); ++j)
+				D.assign(*j, D.zero);
 		}
 
 		/** copy constructor */
 		VectorFraction(const VectorFraction<Domain>& VF) :
-			_domain(VF._domain)
+			numer(VF._domain)
+			,_domain(VF._domain)
 		{
 			copy(VF);
 		}
@@ -151,18 +149,18 @@ namespace LinBox
 			typename Vector::iterator i;
 			typename Vector::const_iterator j;
 
-			for (i=numer.begin(), j=VF.numer.begin(); i!=numer.end(); i++, j++)
+			for (i=numer.begin(), j=VF.numer.begin(); i!=numer.end(); ++i, ++j)
 				_domain.assign(*i, *j);
 		}
 
 		/** clear and resize without construction */
 		void clearAndResize(size_t size)
 		{
-			_domain.init(denom, 1);
+			_domain.init(denom, (int64_t)1);
 			typename Vector::iterator i;
 			numer.resize(size);
-			for (i=numer.begin(); i!=numer.end(); i++)
-				_domain.init(*i, 0);
+			for (i=numer.begin(); i!=numer.end(); ++i)
+				_domain.assign(*i, _domain.zero);
 		}
 
 		/**
@@ -180,13 +178,13 @@ namespace LinBox
 				return true;
 			}
 			Element s, t, g;
-			_domain.xgcd(g, s, t, denom, other.denom);
+			_domain.gcd(g, s, t, denom, other.denom);
 			if (_domain.areEqual(g, denom)) ; //do nothing
 			else {
 				denom = g;
 				typename Vector::iterator it=numer.begin();
 				typename Vector::const_iterator io=other.numer.begin();
-				for (; it != numer.end(); it++, io++) {
+				for (; it != numer.end(); ++it, ++io) {
 					_domain.mulin(*it, s);
 					_domain.axpyin(*it, t, *io);
 				}
@@ -237,7 +235,7 @@ namespace LinBox
 			_domain.assign(denom, lincomb);
 			typename Vector::iterator it=numer.begin();
 			typename Vector::const_iterator io=other.numer.begin();
-			for (; it != numer.end(); it++, io++)
+			for (; it != numer.end(); ++it, ++io)
 				_domain.axpyin(*it, A, *io);
 			return true;
 		}
@@ -263,7 +261,7 @@ namespace LinBox
 				return true;
 			}
 
-			Element A, g, l, n1d2_g, n2d1_g, lincomb, g2, tmpe, one;
+			Element A, g, l, n1d2_g, n2d1_g, lincomb, g2, tmpe;
 
 			_domain.gcd(g, d1, d2);   //compute gcd
 			_domain.mul(l, d1, d2);
@@ -279,7 +277,6 @@ namespace LinBox
 			integer tmp;
 			_domain.mul(tmpe, denom, other.denom);
 			_domain.convert(tmp, tmpe);
-			_domain.init(one, 1);
 			typename Domain::RandIter randiter(_domain, tmp); //seed omitted
 			// TODO: I don't think this random iterator has high-quality low order bits, which are needed
 			do {
@@ -288,7 +285,7 @@ namespace LinBox
 				_domain.axpyin(lincomb, A, n2d1_g);
 				_domain.gcd(g2, lincomb, l);
 			}
-			while (!_domain.areEqual(one, g2));
+			while (!_domain.areEqual(_domain.one, g2));
 
 			this->axpyin(A, other);
 			_domain.lcmin(d1, d2);
@@ -318,7 +315,7 @@ namespace LinBox
 
 			typename Vector::iterator i = this->numer.begin();
 			typename Vector::const_iterator j = x.numer.begin();
-			for (; i != this->numer.end(); i++, j++) {
+			for (; i != this->numer.end(); ++i, ++j) {
 				_domain.mulin(*i, xdenom_prime);
 				_domain.axpyin(*i, a_prime, *j);
 			}
@@ -333,7 +330,7 @@ namespace LinBox
 		std::ostream& write(std::ostream& os) const
 		{
 			os << "[";
-			for (typename Vector::const_iterator it=numer.begin(); it != numer.end(); it++) {
+			for (typename Vector::const_iterator it=numer.begin(); it != numer.end(); ++it) {
 				if (it != numer.begin()) os << " ";
 				os << *it;
 			}
@@ -346,7 +343,7 @@ namespace LinBox
 			linbox_check(numer.size()==result.size());
 			typename Vector::const_iterator it=numer.begin();
 			typename FVector::iterator ir=result.begin();
-			for (; it != numer.end(); it++, ir++) {
+			for (; it != numer.end(); ++it, ++ir) {
 				_domain.assign(ir->first, *it);
 				_domain.assign(ir->second, denom);
 			}
@@ -362,7 +359,7 @@ namespace LinBox
 			vectorGcdIn(gcd, _domain, numer);
 
 			_domain.divin(denom, gcd);
-			for (i=numer.begin(); i!=numer.end(); i++)
+			for (i=numer.begin(); i!=numer.end(); ++i)
 				_domain.divin(*i, gcd);
 			return (*this);
 		}
diff --git a/linbox/algorithms/whisart_trace.h b/linbox/algorithms/whisart_trace.h
old mode 100644
new mode 100755
index 9875bb9..25ab2f9
--- a/linbox/algorithms/whisart_trace.h
+++ b/linbox/algorithms/whisart_trace.h
@@ -1,7 +1,7 @@
-/* linbox/algorithms/cra-domain.h
+/* linbox/algorithms/whisart_trace.h
  * Copyright (C) 1999-2010 The LinBox group
  *
- * Time-stamp: <19 Apr 10 18:35:14 Jean-Guillaume.Dumas at imag.fr>
+ * Time-stamp: <23 Oct 15 17:07:37 Jean-Guillaume.Dumas at imag.fr>
  * Computes the trace of D1 B D2 B^T D1 or D1 B^T D2 B D1
  *
  * ========LICENCE========
@@ -22,55 +22,27 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  * ========LICENCE========
  */
-#ifndef __LINBOX_whisart_trace_H
-#define __LINBOX_whisart_trace_H
-
-#include "linbox/field/modular.h"
-#include "linbox/blackbox/compose.h"
-#include "linbox/blackbox/transpose.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/blackbox/lambda-sparse.h"
-// #include "linbox/blackbox/subrowmatrix.h"
-#include "linbox/solutions/trace.h"
-
-namespace LinBox
-{
-
-	// Trait to show whether or not the BB class has a Indexed iterator
-	template<class BB> struct IndexedCategory;
 
-	/// limited doc so far
-	namespace IndexedTags
-	{
-		struct HasIndexed{};
-		struct NoIndexed{};
-	}
-
-	template<class BB> struct IndexedCategory {
-		typedef IndexedTags::NoIndexed Tag;
-	};
+/** @file linbox/algorithms/whisart_trace.h
+ * @brief  Whisart trace
+ * Computes the trace of D1 B D2 B^T D1 or D1 B^T D2 B D1
+ */
 
-	template<class Field>
-	struct IndexedCategory< BlasMatrix<Field> > 	{
-		typedef IndexedTags::HasIndexed Tag; };
+#ifndef __LINBOX_whisart_trace_H
+#define __LINBOX_whisart_trace_H
 
+#include "linbox/ring/modular.h"
 
-	template<class Field, class Row>
-	struct IndexedCategory< LambdaSparseMatrix<Field,Row> > 	{
-		typedef IndexedTags::HasIndexed Tag; };
+#include "linbox/matrix/dense-matrix.h"
 
-	template<class Field, class Row>
-	struct IndexedCategory< SparseMatrix<Field,Row> > 	{
-		typedef IndexedTags::HasIndexed Tag; };
+#include "linbox/matrix/sparse-matrix.h"
 
-#if 0
-	template<class Matrix, class MatrixCategory>
-	struct IndexedCategory< SubRowMatrix<Matrix,MatrixCategory> > 	{
-		typedef IndexedTags::HasIndexed Tag;
-	};
-#endif
+#include "linbox/blackbox/blackbox.h"
 
+#include "linbox/solutions/trace.h"
 
+namespace LinBox
+{
 
 	template<class Field, class BB>
 	typename Field::Element& WhisartTrace(
@@ -150,7 +122,7 @@ namespace LinBox
 	{
 		// Trace of ExtD B InD B^T ExtD
 		// is sum ExtD_i^2 B_{i,j} InD_j
-		F.init(tr, 0);
+		F.init(tr);
 		for(typename BB::ConstIndexedIterator it = A.IndexedBegin();
 		    it != A.IndexedEnd(); ++it) {
 			typename Field::Element tmp,e,i;
@@ -168,6 +140,40 @@ namespace LinBox
 	}
 
 	template<class Field, class BB>
+	typename Field::Element& WhisartTrace(
+					      typename Field::Element& tr,
+					      const Field& F,
+					      const LinBox::Diagonal<Field>& ExtD,
+					      const BB& A,
+					      const LinBox::Diagonal<Field>& InD,
+					      IndexedTags::HasNext )
+	{
+		// Trace of ExtD B InD B^T ExtD
+		// is sum ExtD_i^2 B_{i,j} InD_j
+		size_t i,j ;
+		typename Field::Element it ;
+		F.init(tr);
+		A.firstTriple();
+		while ( A.nextTriple(i,j,it) ) {
+			typename Field::Element tmp,e,f;
+			F.init(tmp);
+			F.init(e);
+			F.init(f);
+			F.mul(tmp,it,it);
+			ExtD.getEntry(e, i, i);
+			F.mulin(tmp,e);
+			F.mulin(tmp,e);
+			InD.getEntry(f, j , j);
+			F.mulin(tmp,f);
+			F.addin(tr, tmp);
+		}
+		A.firstTriple();
+		return tr;
+	}
+
+
+
+	template<class Field, class BB>
 	typename Field::Element& WhisartTraceTranspose(
 						       typename Field::Element& tr,
 						       const Field& F,
@@ -178,14 +184,14 @@ namespace LinBox
 	{
 		// Trace of ExtD B^T  InD B ExtD
 		// is sum ExtD_j^2 B_{i,j} InD_i
-		F.init(tr, 0);
+		F.init(tr);
 		for(typename BB::ConstIndexedIterator it = A.IndexedBegin();
 		    it != A.IndexedEnd(); ++it) {
 
 			typename Field::Element tmp,e,i;
-			F.init(tmp,0UL);
-			F.init(e,0UL);
-			F.init(i,0UL);
+			F.init(tmp);
+			F.init(e);
+			F.init(i);
 
 			F.mul(tmp, it.value(),it.value());
 			ExtD.getEntry(e, it.colIndex(),it.colIndex());
@@ -199,17 +205,50 @@ namespace LinBox
 		return tr;
 	}
 
+	template<class Field, class BB>
+	typename Field::Element& WhisartTraceTranspose(
+						       typename Field::Element& tr,
+						       const Field& F,
+						       const LinBox::Diagonal<Field>& ExtD,
+						       const BB& A,
+						       const LinBox::Diagonal<Field>& InD,
+						       IndexedTags::HasNext )
+	{
+		// Trace of ExtD B^T  InD B ExtD
+		// is sum ExtD_j^2 B_{i,j} InD_i
+		F.init(tr);
+		size_t i,j ;
+		typename Field::Element it ;
+		F.init(tr);
+		A.firstTriple();
+		while ( A.nextTriple(i,j,it) ) {
+
+			typename Field::Element tmp,e,f;
+			F.init(tmp);
+			F.init(e);
+			F.init(f);
+
+			F.mul(tmp, it,it);
+			ExtD.getEntry(e,j,j);
+			F.mulin(tmp,e);
+			F.mulin(tmp,e);
+			InD.getEntry(f, i,i);
+			F.mulin(tmp,f);
+			F.addin(tr, tmp);
+		}
+
+		return tr;
+	}
 
 
 }
 #endif //__LINBOX_whisart_trace_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/wiedemann.h b/linbox/algorithms/wiedemann.h
index b3d9180..65bdd2c 100644
--- a/linbox/algorithms/wiedemann.h
+++ b/linbox/algorithms/wiedemann.h
@@ -35,20 +35,20 @@
  * which one to use in different circumstances
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -69,7 +69,7 @@
 
 #include "linbox/blackbox/archetype.h"
 #include "linbox/blackbox/squarize.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/util/debug.h"
 #include "linbox/vector/vector-domain.h"
 #include "linbox/solutions/methods.h"
@@ -130,23 +130,22 @@ namespace LinBox
 #endif // INCLUDE_TIMING
 		}
 
-
-
 		commentator().stop ("done", NULL, "minpoly");
 
 		return P;
 	}
 }
 
-#ifdef __LINBOX_HAVE_GIVARO
 #ifndef LINBOX_EXTENSION_DEGREE_MAX
 #define LINBOX_EXTENSION_DEGREE_MAX 19
 #endif
 
-#include "linbox/blackbox/sparse.h"
-#include "linbox/field/modular.h"
+#include <givaro/extension.h>
+#include <givaro/gfq.h>
+
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/ring/modular.h"
 #include "linbox/algorithms/matrix-hom.h"
-#include "linbox/field/givaro.h"
 #include "linbox/field/map.h"
 
 namespace LinBox
@@ -163,34 +162,34 @@ namespace LinBox
 		const Field& F = A.field();
 		integer a,c; F.cardinality(a); F.characteristic(c);
 		if (a != c) {
-			unsigned long extend = (unsigned long)FF_EXPONENT_MAX(a,(integer)LINBOX_EXTENSION_DEGREE_MAX);
+			uint64_t extend = (uint64_t)FF_EXPONENT_MAX(a,(integer)LINBOX_EXTENSION_DEGREE_MAX);
 			if (extend > 1) {
 				commentator().report (Commentator::LEVEL_ALWAYS,INTERNAL_WARNING) << "Extension of degree " << extend << std::endl;
-				GivaroExtension<Field> EF( F, extend);
+				Givaro::Extension<Field> EF( F, extend);
 
-				typedef typename Blackbox::template rebind< GivaroExtension<Field>  >::other FBlackbox;
+				typedef typename Blackbox::template rebind< Givaro::Extension<Field>  >::other FBlackbox;
 
 				FBlackbox Ap(A, EF);
 
-				std::vector< typename GivaroExtension<Field>::Element > eP;
+				BlasVector< Givaro::Extension<Field> > eP(EF);
 				minpoly(eP, Ap, tag, Method::Wiedemann(M));
 
-				return PreMap<Field, GivaroExtension<Field> >(F,EF)(P, eP);
+				return PreMap<Field, Givaro::Extension<Field> >(F,EF)(P, eP);
 			}
 			else
 				return minpoly(P, A, tag, Method::Wiedemann(M));
-
 		}
 		else {
-			unsigned long extend = (unsigned long)FF_EXPONENT_MAX(c,(integer)LINBOX_EXTENSION_DEGREE_MAX);
+			uint64_t extend = (uint64_t)FF_EXPONENT_MAX(c,(integer)LINBOX_EXTENSION_DEGREE_MAX);
 			if (extend > 1) {
 				commentator().report (Commentator::LEVEL_ALWAYS,INTERNAL_WARNING) << "Word size extension : " << extend << std::endl;
-				GivaroGfq EF( (unsigned long)c, extend);
-				typedef typename Blackbox::template rebind< GivaroGfq >::other FBlackbox;
+				typedef Givaro::GFqDom<int64_t> Fld;
+				Fld EF( (uint64_t)c, extend);
+				typedef typename Blackbox::template rebind< Fld >::other FBlackbox;
 				FBlackbox Ap(A, EF);
-				std::vector< typename GivaroGfq::Element > eP;
+				BlasVector< Fld > eP(EF);
 				minpoly(eP, Ap, tag, Method::Wiedemann(M));
-				return PreMap<Field, GivaroGfq >(F,EF)(P, eP);
+				return PreMap<Field, Fld >(F,EF)(P, eP);
 
 			}
 			else
@@ -198,8 +197,8 @@ namespace LinBox
 		}
 	}
 }
-#else
-namespace LinBox
+
+/*namespace LinBox
 {
 	// The minpoly with BlackBox Method
 	template<class Polynomial, class Blackbox>
@@ -212,8 +211,7 @@ namespace LinBox
 		commentator().report (Commentator::LEVEL_ALWAYS,INTERNAL_WARNING) << " WARNING, no extension available, returning only a factor of the minpoly\n";
 		return minpoly(P, A, tag, Method::Wiedemann (M));
 	}
-}
-#endif
+}*/
 
 namespace LinBox
 {
@@ -240,7 +238,7 @@ namespace LinBox
 		 *               options for the solver
 		 */
 		WiedemannSolver (const Field &F, const WiedemannTraits &traits) :
-			_traits (traits), _field (F), _randiter (F), _VD (F)
+			_traits (traits), _field (&F), _randiter (F), _VD (F)
 		{}
 
 		/*! Constructor with a random iterator.
@@ -253,7 +251,7 @@ namespace LinBox
 		WiedemannSolver (const Field &F,
 				 const WiedemannTraits &traits,
 				 typename Field::RandIter r) :
-			_traits (traits), _field (F), _randiter (r), _VD (F)
+			_traits (traits), _field (&F), _randiter (r), _VD (F)
 		{}
 
 		/// \ingroup algorithms
@@ -354,6 +352,7 @@ namespace LinBox
 
 		//@}
 
+		inline const Field & field() const { return *_field; }
 
 	private:
 
@@ -361,7 +360,7 @@ namespace LinBox
 		SparseMatrix<Field> *makeLambdaSparseMatrix (size_t m);
 
 		WiedemannTraits                      _traits;
-		const Field                         &_field;
+		const Field                         *_field;
 		typename Field::RandIter             _randiter;
 		VectorDomain<Field>                  _VD;
 	};
@@ -373,11 +372,10 @@ namespace LinBox
 #endif //  __LINBOX_wiedemann_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/algorithms/wiedemann.inl b/linbox/algorithms/wiedemann.inl
index 6c98ce5..c3efed3 100644
--- a/linbox/algorithms/wiedemann.inl
+++ b/linbox/algorithms/wiedemann.inl
@@ -29,20 +29,20 @@
  * which one to use in different circumstances
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -65,7 +65,6 @@
 #include "linbox/algorithms/blackbox-container-symmetric.h"
 //#include "linbox/algorithms/blackbox-container-generic.h"
 #include "linbox/algorithms/massey-domain.h"
-#include "linbox/switch/cekstv.h"
 #include "linbox/solutions/rank.h"
 #include "linbox/vector/stream.h"
 
@@ -90,7 +89,7 @@ namespace LinBox
 		if (A.rowdim() != A.coldim() ) _traits.singular (singular = WiedemannTraits::SINGULAR);
 		ReturnStatus status = FAILED;
 
-		unsigned int tries = (int)_traits.maxTries ();
+		unsigned int tries = (unsigned int)_traits.maxTries ();
 
 		unsigned long r = (unsigned long) -1;
 
@@ -113,7 +112,7 @@ namespace LinBox
 					case SINGULAR:
 						commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION)
 						<< "System found to be singular. Reverting to nonsingular solver." << std::endl;
-						tries = (int)_traits.maxTries ();
+						tries = (unsigned int)_traits.maxTries ();
 						singular = WiedemannTraits::SINGULAR;
 						break;
 					default:
@@ -192,13 +191,13 @@ namespace LinBox
 						  const Vector        &b,
 						  bool       useRandIter)
 	{
-		typedef std::vector<typename Field::Element> Polynomial;
+		typedef BlasVector<Field> Polynomial;
 		typedef typename Polynomial::iterator        PolyIterator;
 
 		commentator().start ("Solving nonsingular system (Wiedemann)", "WiedemannSolver::solveNonsingular");
 
-		Polynomial m_A;
-		Vector     z;
+		Polynomial m_A(A.field());
+		Vector     z(A.field());
 		bool       ret = true;
 
 		{
@@ -215,7 +214,7 @@ namespace LinBox
 			_VD.write (report, m_A) << std::endl;
 		}
 
-		if (_field.isZero (m_A.front ())) {
+		if (field().isZero (m_A.front ())) {
 			commentator().stop ("singular", "System found to be singular",
 					  "WiedemannSolver::solveNonsingular");
 			return SINGULAR;
@@ -227,8 +226,8 @@ namespace LinBox
 			PolyIterator iter = m_A.begin ();
 
 			while (++iter != m_A.end ()) {
-				_field.divin (*iter, m_A.front ());
-				_field.negin (*iter);
+				field().divin (*iter, m_A.front ());
+				field().negin (*iter);
 			}
 
 			commentator().stop ("done");
@@ -242,11 +241,11 @@ namespace LinBox
 			VectorWrapper::ensureDim (z, A.rowdim ());
 
 			for (int i = (int) m_A.size () - 1; --i > 0;) {
-				if ((m_A.size () - i) & (0xff == 0))
-					commentator().progress (m_A.size () - i);
+				if (((long)m_A.size () - i) & (0xff == 0))
+					commentator().progress ((long)m_A.size () - i);
 
 				A.apply (z, x);
-				_VD.axpy (x, m_A[i], b, z);
+				_VD.axpy (x, m_A[(size_t)i], b, z);
 			}
 
 			commentator().stop ("done");
@@ -290,7 +289,7 @@ namespace LinBox
 	{
 		commentator().start ("Solving singular system (Wiedemann)", "WiedemannSolver::solveSingular");
 
-		Vector Ax;
+		Vector Ax(A.field());
 		ReturnStatus status = OK, sfrs = OK;
 
 
@@ -299,10 +298,9 @@ namespace LinBox
 			{
 				commentator().start ("Constructing butterfly preconditioner");
 
-				CekstvSwitchFactory<Field> factory (_randiter);
-				typedef Butterfly<Field, CekstvSwitch<Field> > ButterflyP;
-				ButterflyP P(_field, A.rowdim (), factory);
-				ButterflyP Q(_field, A.coldim (), factory);
+				typedef Butterfly<Field> ButterflyP;
+				ButterflyP P(field(), A.rowdim ());
+				ButterflyP Q(field(), A.coldim ());
 				Compose< Blackbox, ButterflyP > AQ(&A, &Q);
 				Compose< ButterflyP, Compose< Blackbox, ButterflyP > > PAQ(&P, &AQ);
 
@@ -430,9 +428,9 @@ namespace LinBox
 		commentator().start ("Solving singular system with generic rank profile (Wiedemann)",
 				   "WiedemannSolver::findRandomSolution");
 
-		Vector v, Avpb, PAvpb, bp, xp, Qinvx;
+		Vector v(A.field()), Avpb(A.field()), PAvpb(A.field()), bp(A.field()), xp(A.field()), Qinvx(A.field());
 
-		RandomDenseStream<Field, Vector> stream (_field, _randiter, A.coldim ());
+		RandomDenseStream<Field, Vector> stream (field(), _randiter, A.coldim ());
 
 		VectorWrapper::ensureDim (v, A.coldim ());
 		VectorWrapper::ensureDim (Avpb, A.rowdim ());
@@ -498,9 +496,9 @@ namespace LinBox
 	{
 		commentator().start ("Finding a nullspace element (Wiedemann)", "WiedemannSolver::findNullspaceElement");
 
-		Vector v, Av, PAv, vp, xp, Qinvx;
+		Vector v(A.field()), Av(A.field()), PAv(A.field()), vp(A.field()), xp(A.field()), Qinvx(A.field());
 
-		RandomDenseStream<Field, Vector> stream (_field, _randiter, A.coldim ());
+		RandomDenseStream<Field, Vector> stream (field(), _randiter, A.coldim ());
 
 		unsigned long r = (A.coldim () < A.rowdim ()) ? A.coldim () : A.rowdim ();
 
@@ -560,7 +558,7 @@ namespace LinBox
 		commentator().start ("Obtaining certificate of inconsistency (Wiedemann)",
 				   "WiedemannSolver::certifyInconsistency");
 
-		Vector PTinvu;
+		// Vector PTinvu(A.field());
 		typename Field::Element uTb;
 
 		WiedemannTraits cert_traits;
@@ -572,14 +570,14 @@ namespace LinBox
 		cert_traits.singular (WiedemannTraits::SINGULAR);
 		cert_traits.maxTries (1);
 
-		WiedemannSolver solver (_field, cert_traits, _randiter);
+		WiedemannSolver solver (field(), cert_traits, _randiter);
 
 		Transpose<Blackbox> AT (&A);
 
 		solver.findNullspaceElement (u, AT);
 		_VD.dot (uTb, u, b);
 
-		if (!_field.isZero (uTb))
+		if (!field().isZero (uTb))
 			ret = true;
 
 		commentator().stop (MSG_STATUS (ret), NULL, "WiedemannSolver::certifyInconsistency");
@@ -594,17 +592,17 @@ namespace LinBox
 		const double             LAMBDA = 3;
 		integer                  card;
 
-		_field.cardinality (card);
+		field().cardinality (card);
 
 		double                   init_p = 1.0 - 1.0 / (double) card;
 		double                   log_m = LAMBDA * log ((double) m) / M_LN2;
-		double                   new_p;
 
-		SparseMatrix<Field>    *P = new SparseMatrix<Field> (_field, m, m);
+		SparseMatrix<Field>    *P = new SparseMatrix<Field> (field(), m, m);
 
-		RandomSparseStream<Field> stream (_field, _randiter, init_p, m, m);
+		RandomSparseStream<Field,typename SparseMatrix<Field>::Row> stream (field(), _randiter, init_p, m, m);
 
 		for (unsigned int i = 0; i < m; ++i) {
+		double                   new_p;
 			new_p = log_m / double(m - i + 1);
 
 			if (init_p < new_p)
@@ -623,11 +621,10 @@ namespace LinBox
 #endif // __LINBOX_wiedemann_INL
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/Makefile.am b/linbox/blackbox/Makefile.am
index f267eb8..df287e8 100644
--- a/linbox/blackbox/Makefile.am
+++ b/linbox/blackbox/Makefile.am
@@ -23,20 +23,22 @@ pkgincludesubdir=$(pkgincludedir)/blackbox
 
 BASIC_HDRS =			\
 	archetype.h               \
+	blackbox.h                \
+	bb.h                \
 	factory.h                 \
 	butterfly.h               \
+	butterfly.inl               \
 	hilbert.h                 \
 	compose.h                 \
 	permutation.h             \
 	squarize.h                \
-	sparse1.h                 \
-	sparse.h                  \
-	sparse.inl                \
 	scalar-matrix.h           \
 	submatrix.h               \
 	inverse.h                 \
 	transpose.h               \
 	sum.h                     \
+	csf.h                     \
+	csf.inl                   \
 	diagonal.h                \
 	diagonal-gf2.h            \
 	moore-penrose.h           \
@@ -48,10 +50,11 @@ BASIC_HDRS =			\
 	frobenius.h               \
 	zero-one.h                \
 	zero-one.inl              \
-	zo.h         zo.inl       \
-	zo-gf2.h     zo-gf2.inl   \
+	zo.h                      \
+	zo.inl                    \
+	zo-gf2.h                  \
+	zo-gf2.inl                \
 	quad-matrix.h             \
-	triplesbb.h               \
 	apply.h                   \
 	submatrix-traits.h        \
 	random-matrix-traits.h    \
@@ -64,37 +67,29 @@ BASIC_HDRS =			\
 	block-toeplitz.h          \
 	block-hankel-inverse.h    \
 	jit-matrix.h              \
-	rational-matrix-factory.h
+	toeplitz.h              \
+	toeplitz.inl            \
+	rational-matrix-factory.h\
+	fibb.h			\
+	pascal.h
 
 NTL_HDRS =			\
-	toeplitz.h ntl-hankel.h ntl-sylvester.h \
-	toeplitz.inl ntl-hankel.inl ntl-sylvester.inl
+	ntl-hankel.h            \
+	ntl-hankel.inl          \
+	ntl-sylvester.h         \
+	ntl-sylvester.inl
 
-GIVARO_HDRS =
-
-LIDIA_HDRS =
 
 if LINBOX_HAVE_NTL
 USE_NTL_HDRS = $(NTL_HDRS)
 endif
 
-if LINBOX_HAVE_GIVARO
-USE_GIVARO_HDRS = $(GIVARO_HDRS)
-endif
-
-if LINBOX_HAVE_LIDIA
-USE_LIDIA_HDRS = $(LIDIA_HDRS)
-endif
 
 pkgincludesub_HEADERS =		\
 	$(BASIC_HDRS)		\
-	$(USE_NTL_HDRS)		\
-	$(USE_GIVARO_HDRS)	\
-	$(USE_LIDIA_HDRS)
+	$(USE_NTL_HDRS)		
 
 EXTRA_DIST = 			\
 	$(NTL_HDRS)		\
-	$(GIVARO_HDRS)		\
-	$(LIDIA_HDRS)		\
 	blackbox.doxy
 
diff --git a/linbox/blackbox/Makefile.in b/linbox/blackbox/Makefile.in
deleted file mode 100644
index c60bb8f..0000000
--- a/linbox/blackbox/Makefile.in
+++ /dev/null
@@ -1,650 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/blackbox
-DIST_COMMON = $(am__pkgincludesub_HEADERS_DIST) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__pkgincludesub_HEADERS_DIST = archetype.h factory.h butterfly.h \
-	hilbert.h compose.h permutation.h squarize.h sparse1.h \
-	sparse.h sparse.inl scalar-matrix.h submatrix.h inverse.h \
-	transpose.h sum.h diagonal.h diagonal-gf2.h moore-penrose.h \
-	direct-sum.h null-matrix.h matrix-blackbox.h dif.h companion.h \
-	frobenius.h zero-one.h zero-one.inl zo.h zo.inl zo-gf2.h \
-	zo-gf2.inl quad-matrix.h triplesbb.h apply.h \
-	submatrix-traits.h random-matrix-traits.h scompose.h \
-	blackbox-interface.h random-matrix.h lambda-sparse.h \
-	polynomial.h block-hankel.h block-toeplitz.h \
-	block-hankel-inverse.h jit-matrix.h rational-matrix-factory.h \
-	toeplitz.h ntl-hankel.h ntl-sylvester.h toeplitz.inl \
-	ntl-hankel.inl ntl-sylvester.inl
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/blackbox
-BASIC_HDRS = \
-	archetype.h               \
-	factory.h                 \
-	butterfly.h               \
-	hilbert.h                 \
-	compose.h                 \
-	permutation.h             \
-	squarize.h                \
-	sparse1.h                 \
-	sparse.h                  \
-	sparse.inl                \
-	scalar-matrix.h           \
-	submatrix.h               \
-	inverse.h                 \
-	transpose.h               \
-	sum.h                     \
-	diagonal.h                \
-	diagonal-gf2.h            \
-	moore-penrose.h           \
-	direct-sum.h              \
-	null-matrix.h             \
-	matrix-blackbox.h         \
-	dif.h                     \
-	companion.h               \
-	frobenius.h               \
-	zero-one.h                \
-	zero-one.inl              \
-	zo.h         zo.inl       \
-	zo-gf2.h     zo-gf2.inl   \
-	quad-matrix.h             \
-	triplesbb.h               \
-	apply.h                   \
-	submatrix-traits.h        \
-	random-matrix-traits.h    \
-	scompose.h                \
-	blackbox-interface.h      \
-	random-matrix.h           \
-	lambda-sparse.h           \
-	polynomial.h              \
-	block-hankel.h            \
-	block-toeplitz.h          \
-	block-hankel-inverse.h    \
-	jit-matrix.h              \
-	rational-matrix-factory.h
-
-NTL_HDRS = \
-	toeplitz.h ntl-hankel.h ntl-sylvester.h \
-	toeplitz.inl ntl-hankel.inl ntl-sylvester.inl
-
-GIVARO_HDRS = 
-LIDIA_HDRS = 
- at LINBOX_HAVE_NTL_TRUE@USE_NTL_HDRS = $(NTL_HDRS)
- at LINBOX_HAVE_GIVARO_TRUE@USE_GIVARO_HDRS = $(GIVARO_HDRS)
- at LINBOX_HAVE_LIDIA_TRUE@USE_LIDIA_HDRS = $(LIDIA_HDRS)
-pkgincludesub_HEADERS = \
-	$(BASIC_HDRS)		\
-	$(USE_NTL_HDRS)		\
-	$(USE_GIVARO_HDRS)	\
-	$(USE_LIDIA_HDRS)
-
-EXTRA_DIST = \
-	$(NTL_HDRS)		\
-	$(GIVARO_HDRS)		\
-	$(LIDIA_HDRS)		\
-	blackbox.doxy
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/blackbox/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps linbox/blackbox/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
-	done
-
-uninstall-pkgincludesubHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
-	for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool ctags distclean distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-pkgincludesubHEADERS install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/blackbox/apply.h b/linbox/blackbox/apply.h
index b133b0a..42cc7ce 100644
--- a/linbox/blackbox/apply.h
+++ b/linbox/blackbox/apply.h
@@ -32,6 +32,7 @@
 #define __LINBOX_apply_H
 
 #include "linbox/linbox-config.h"
+#include "givaro-config.h"
 #include "linbox/integer.h"
 #include "linbox/util/debug.h"
 // #if defined(__LINBOX_field_multimod_field_H) && !defined(__LINBOX_blas_matrix_domain_H)
@@ -40,10 +41,11 @@
 #include "linbox/field/multimod-field.h"
 #include "linbox/field/hom.h"
 #include "linbox/randiter/multimod-randomprime.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
 #include "linbox/algorithms/lifting-container.h"
 #include <vector>
+#include "linbox/vector/blas-vector.h"
 
 
 #include "linbox/util/timer.h"
@@ -84,32 +86,30 @@ namespace LinBox
 	class BlasApply {
 
 	public:
-		typedef typename Domain::Element    Element;
-		typedef std::vector<Element>         Vector;
+		typedef typename Domain::Element   Element;
+		typedef BlasVector<Domain>         Vector;
 
 		BlasApply(const Domain& D) :
 			_domain(D), _MD(D)
 		{
 			_domain.characteristic(_prime);
-			_domain.init(_one,1UL);
-			_domain.init(_zero,0UL);
 		}
 
 
 		//#ifdef __LINBOX_BLAS_AVAILABLE
-		inline Vector& applyV(Vector                       &y,
+		inline Vector& applyV(Vector                        &y,
 				      const BlasMatrix<Domain>     &A,
-				      const Vector                 &x) const
+				      const Vector                  &x) const
 		{
 
 			if (( _prime > 0) && ( _prime <  67108863)) {
 
-				FFLAS::fgemv((typename Domain::Father_t) _domain, FFLAS::FflasNoTrans,
+				FFLAS::fgemv(_domain, FFLAS::FflasNoTrans,
 					      A.rowdim(), A.coldim(),
-					      _one,
+					      _domain.one,
 					      A.getPointer(), A.getStride(),
 					      &x[0],1,
-					      _zero,
+					      _domain.zero,
 					      &y[0],1);
 			}
 			else {
@@ -118,19 +118,19 @@ namespace LinBox
 			return y;
 		}
 
-		inline Vector& applyVTrans(Vector                       &y,
+		inline Vector& applyVTrans(Vector                        &y,
 					   BlasMatrix<Domain>           &A,
-					   const Vector                 &x) const
+					   const Vector                  &x) const
 		{
 
 			if (( _prime > 0) && ( _prime <  67108863)) {
 
-				FFLAS::fgemv((typename Domain::Father_t) _domain, FFLAS::FflasTrans,
+				FFLAS::fgemv(_domain, FFLAS::FflasTrans,
 					      A.rowdim(), A.coldim(),
-					      _one,
+					      _domain.one,
 					      A.getPointer(), A.getStride(),
 					      &x[0],1,
-					      _zero,
+					      _domain.zero,
 					      &y[0],1);
 			}
 			else {
@@ -206,8 +206,8 @@ namespace LinBox
 				    (int) maxword,(int) m,(int) n, 1,
 				    xdbl,(int) n, At_dbl, (int) m, 0, ydbl, (int) m);
 
-			delete At_dbl;
-			delete xdbl;
+			delete[] At_dbl;
+			delete[] xdbl;
 
 			size_t rclen=maxword*4+5;
 			unsigned char* combined1 = new unsigned char[m*rclen];
@@ -243,9 +243,9 @@ namespace LinBox
 				else
 					result = 0;
 
-				importWords(tmp2, (size_t)rclen, -1, 1, 0, 0, combined1+i*rclen);
+				Givaro::Protected::importWords(tmp2, (size_t)rclen, -1, 1, 0, 0, combined1+i*rclen);
 				result += tmp2;
-				importWords(tmp2, (size_t)rclen, -1, 1, 0, 0, combined2+i*rclen);
+				Givaro::Protected::importWords(tmp2, (size_t)rclen, -1, 1, 0, 0, combined2+i*rclen);
 				result += tmp2;
 
 				_domain.init(y[i], result);
@@ -259,10 +259,9 @@ namespace LinBox
 
 
 	private:
-		Domain         _domain;
-		integer    _prime;
-		Element _one,_zero;
-		MatrixDomain<Domain> _MD;
+		Domain            _domain;
+		integer            _prime;
+		MatrixDomain<Domain>  _MD;
 
 
 	};
@@ -272,8 +271,8 @@ namespace LinBox
 	class MatrixApplyDomain {
 
 	public:
-		typedef typename Domain::Element    Element;
-		typedef std::vector<Element>         Vector;
+		typedef typename Domain::Element   Element;
+		typedef BlasVector<Domain>         Vector;
 
 		MatrixApplyDomain(const Domain& D, const IMatrix &Mat) :
 			_domain(D), _matM(Mat)
@@ -322,13 +321,16 @@ namespace LinBox
 		enum ApplyChoice {Classic, MatrixQadic, VectorQadic, CRT};
 
 	public:
-		typedef typename Domain::Element    Element;
-		typedef std::vector<Element>         Vector;
-		typedef IMatrix                       Matrix;
+		typedef typename Domain::Element   Element;
+		typedef BlasVector<Domain>         Vector;
+		typedef IMatrix                      Matrix;
 
 
 		BlasMatrixApplyDomain(const Domain& D, const IMatrix &Mat) :
 			_domain(D), _matM(Mat), _MD(D), _m(Mat.rowdim()), _n(Mat.coldim())
+			,use_chunks(false),use_neg(false),chunk_size(0)
+			,num_chunks(0)
+			,chunks(NULL),vchunks(NULL)
 		{
 			_switcher= Classic;_rns=NULL;
 		}
@@ -378,7 +380,7 @@ namespace LinBox
 			// Check Qadic matrix reprentation possibility
 			LinBox::integer maxChunkVal = 1;
 			maxChunkVal <<= 53;
-			maxChunkVal /= (prime-1) * _n;
+			maxChunkVal /= (prime-1) * uint64_t(_n);
 			chunk_size = maxChunkVal.bitsize();
 			use_chunks = (chunk_size >= 16);
 			//std::cout<<"max bit= "<<maxBitSize<<" "<<maxValue.size_in_base(4)*2<<"\n";std::cout<<"max value= "<<maxValue<<"\n";
@@ -390,7 +392,7 @@ namespace LinBox
 				// Check Qadic vector representation possibility
 				maxChunkVal = 1;
 				maxChunkVal <<= 53;
-				maxChunkVal /= 2*maxValue * _n;
+				maxChunkVal /= 2*maxValue * uint64_t(_n);
 				chunk_size = maxChunkVal.bitsize();
 				use_chunks = (chunk_size >= 16);
 
@@ -486,10 +488,10 @@ namespace LinBox
 			case CRT:
 				if (use_neg){
 					maxValue= maxValue<<1;
-					maxBitSize+=1;
+					// maxBitSize+=1;
 				}
-				integer a_bound= maxValue*_n+1;
-				integer b_bound= sqrt(integer("9007199254740992")/_n);	std::cout<<"max prime: "<<b_bound<<" max rns: "<<a_bound<<std::endl;
+				integer a_bound= maxValue*uint64_t(_n)+1;
+				integer b_bound= sqrt(integer("9007199254740992")/uint64_t(_n));	std::cout<<"max prime: "<<b_bound<<" max rns: "<<a_bound<<std::endl;
 				MultiModRandomPrime mmrp;
 				std::vector<integer> rns_basis = mmrp.createPrimes(b_bound, a_bound);
 				_rns = new MultiModDouble(rns_basis);
@@ -505,13 +507,13 @@ namespace LinBox
 				vchunks = new double[_n*_rns->size()];
 
 				// prepare special CRT
-				Element g, s, q, zero,one,two;
+				Element g, s, q, two;
 				_q= _rns->getCRTmodulo();
-				_domain.init(q,_q);_domain.init(zero,0UL);_domain.init(one,1UL);_domain.init(two,2UL);
-				_domain.xgcd(g, _inv_q, s, q, _prime);
-				if (_domain.compare(_inv_q, zero)<0 ) _domain.addin(_inv_q,_prime);
+				_domain.init(q,_q);_domain.init(two,int64_t(2));
+				_domain.gcd(g, _inv_q, s, q, _prime);
+				if (_domain.compare(_inv_q, _domain.zero)<0 ) _domain.addin(_inv_q,_prime);
 				_domain.mul(_pq,_prime,q);
-				_domain.sub(_h_pq,_pq, one);
+				_domain.sub(_h_pq,_pq, _domain.one);
 				_domain.divin(_h_pq, two);
 
 				break;
@@ -585,8 +587,8 @@ namespace LinBox
 						 */
 						int rclen = (int)num_chunks*2 + 5;
 
-						unsigned char* combined = new unsigned char[rc*_n*rclen];
-						memset(combined, 0, rc*_n*rclen);
+						unsigned char* combined = new unsigned char[(size_t)rc*_n*(size_t)rclen];
+						memset(combined, 0, (size_t)rc*_n*(size_t)rclen);
 
 						//order from major index to minor: combining index, component of sol'n, byte
 						//compute a product (chunk times x) for each chunk
@@ -621,7 +623,7 @@ namespace LinBox
 							for (size_t j=0; j<_n; j++) {
 								// up to 53 bits will be ored-in, to be summed later
 								unsigned char* bitDest = combined;
-								bitDest += rclen*((i % rc)*_n+j);
+								bitDest += (size_t)rclen*((i % (size_t)rc)*_n+j);
 								long long mask = static_cast<long long>(ctd[j]);
 								bitDest += 2*i;
 								*(reinterpret_cast<long long*>(bitDest) ) |= mask;
@@ -640,8 +642,8 @@ namespace LinBox
 							result = 0;
 
 							for (int j=0; j<rc; j++) {
-								unsigned char* thispos = combined + rclen*(j*_n+i);
-								importWords(tmp, (size_t)rclen, -1, 1, 0, 0, thispos);
+								unsigned char* thispos = combined + (size_t)rclen*((size_t)j*_n+i);
+								Givaro::Protected::importWords(tmp, (size_t)rclen, -1, 1, 0, 0, thispos);
 								result += tmp;
 							}
 							_domain.init(y[i], result);
@@ -649,7 +651,7 @@ namespace LinBox
 						// shift back the result
 						if (use_neg) {
 							Element acc;
-							_domain.init(acc,0);
+							_domain.assign(acc,_domain.zero);
 							for (size_t i=0;i<x.size();++i)
 								_domain.addin(acc,x[i]);
 							_domain.mulin(acc,shift);
@@ -739,7 +741,7 @@ namespace LinBox
 								*(reinterpret_cast<long long*>(BitDest) ) |= mask;
 								BitDest+=rc*chunk_byte;
 							}
-							importWords(val, (size_t)rclen, -1, 1, 0, 0, combined);
+							Givaro::Protected::importWords(val, (size_t)rclen, -1, 1, 0, 0, combined);
 							result+=val;
 						}
 						_domain.init(y[i], result);
@@ -748,7 +750,7 @@ namespace LinBox
 					// shift back the result
 					if (use_neg) {
 						Element acc;
-						_domain.init(acc,0);
+						_domain.assign(acc,_domain.zero);
 						for (size_t i=0;i<x.size();++i)
 							_domain.addin(acc,x[i]);
 						_domain.mulin(acc,shift);
@@ -859,10 +861,10 @@ namespace LinBox
 					Element y_cur, b_cur;
 					// finish crt according to b
 					for (size_t i=0;i<_m;++i){
-						_domain.rem(b_cur, b[i], _prime);
+						_domain.mod(b_cur, b[i], _prime);
 						_domain.sub(y_cur, b_cur, y[i]);//std::cout<<"(b-y): "<<y_cur<<std::endl;
 						_domain.mulin(y_cur, _inv_q);//std::cout<<"((b-y)/q): "<<y_cur<<std::endl;
-						_domain.remin(y_cur, _prime);//std::cout<<"((b-y)/q mod p): "<<y_cur<<std::endl;
+						_domain.modin(y_cur, _prime);//std::cout<<"((b-y)/q mod p): "<<y_cur<<std::endl;
 						_domain.axpyin(y[i],_q, y_cur);//std::cout<<"y+p((b-y)/q mod p): "<<y[i]<<std::endl;
 						if ( y[i] > _h_pq) y[i]-=_pq;
 					}
@@ -956,15 +958,15 @@ namespace LinBox
 
 					// cout << "rc= " << rc << ", rclen = " << rclen << endl;
 
-					unsigned char* combined = new unsigned char[rc*_m*_k*rclen];
-					memset(combined, 0, rc*_m*_k*rclen);
+					unsigned char* combined = new unsigned char[(size_t)rc*_m*_k*(size_t)rclen];
+					memset(combined, 0, (size_t)rc*_m*_k*(size_t)rclen);
 
 					//order from major index to minor: combining index, component of sol'n, byte
 
 					//compute a product (chunk times x) for each chunk
 					double* ctd = new double[_m*_k];
 
-					for (size_t i=0; i<num_chunks; i++) {
+					for (size_t i=0; i<num_chunks; i++) {//!@bug why not use FFLAS ?
 						cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,
 							    (int) _m,(int) _k,(int) _n, 1,
 							    chunks+(_m*_n*i),(int) _n, dX, (int) _k, 0, ctd, (int) _k);
@@ -973,7 +975,7 @@ namespace LinBox
 							for (size_t j=0; j<_m*_k; j++) {
 								// up to 53 bits will be ored-in, to be summed later
 								unsigned char* bitDest = combined;
-								bitDest += rclen*((i % rc)*_m*_k+j);
+								bitDest += (unsigned char)rclen*((i % (size_t)rc)*_m*_k+j);
 								long long mask = static_cast<long long>(ctd[j]);
 								bitDest += 2*i;
 								*(reinterpret_cast<long long*>(bitDest) ) |= mask;
@@ -995,8 +997,8 @@ namespace LinBox
 							result = 0;
 
 						for (int j=0; j<rc; j++) {
-							unsigned char* thispos = combined + rclen*(j*_m*_k+i);
-							importWords(tmp, (size_t)rclen, -1, 1, 0, 0, thispos);
+							unsigned char* thispos = combined + (unsigned char) rclen*((size_t)j*_m*_k+i);
+							Givaro::Protected::importWords(tmp, (size_t)rclen, -1, 1, 0, 0, thispos);
 							result += tmp;
 #ifdef DEBUG_CHUNK_APPLYM
 							cout << "rc[" << j << "," << i << "]:" << tmp << endl;
@@ -1091,14 +1093,14 @@ namespace LinBox
 		n  = Mat.coldim();
 		mn = m*n;
 
-		size_t tmpsize, tmpbitsize, j;
 
 
 		if (num_chunks ==1)
 			for (size_t i=0; i<mn; ++i, ++it)
 				D.convert(*(chunks+i), *it);
-		else
+		else {
 			for (size_t i=0; i<mn; ++i, ++it) {
+				size_t tmpsize, tmpbitsize, j;
 				integer tmp;
 				double* pdbl = chunks + i;
 				D.convert(tmp, *it);
@@ -1218,6 +1220,7 @@ namespace LinBox
 #endif
 					}
 			}
+		}
 	}
 
 	/** \brief split an integer vector into a padic chunk representation
@@ -1236,13 +1239,13 @@ namespace LinBox
 		size_t mn;
 		mn = V.size();
 
-		size_t tmpsize, tmpbitsize, j;
 
 		if (num_chunks ==1)
 			for (size_t i=0; i<mn; ++i, ++it)
 				D.convert(*(chunks+i), *it);
-		else
+		else {
 			for (size_t i=0; i<mn; ++i, ++it) {
+				size_t tmpsize, tmpbitsize, j;
 				integer tmp;
 				double* pdbl = chunks + i*num_chunks;
 				D.convert(tmp, *it);
@@ -1356,6 +1359,7 @@ namespace LinBox
 #endif
 					}
 			}
+	}
 
 	}
 
@@ -1375,18 +1379,18 @@ namespace LinBox
 		size_t mn;
 		mn = V.size();
 
-		size_t tmpsize, tmpbitsize, j;
 
 		if (num_chunks ==1)
 			for (size_t i=0; i<mn; ++i, ++it)
 				D.convert(*(chunks+i), *it);
-		else
+		else {
 			for (size_t i=0; i<mn; ++i, ++it) {
+		size_t tmpsize, /*tmpbitsize,*/ j;
 				integer tmp;
 				double* pdbl = chunks + i*num_chunks;
 				D.convert(tmp, *it);
 				tmpsize    = tmp.size();
-				tmpbitsize = tmp.bitsize();
+				//tmpbitsize = tmp.bitsize();
 
 				if (tmp ==0)
 					*pdbl=0;
@@ -1396,6 +1400,7 @@ namespace LinBox
 
 #if __LINBOX_SIZEOF_LONG == 8
 						// specialization for 64bits integer limbs
+						size_t tmpbitsize = tmp.bitsize();
 						for (j=0; j<tmpsize-1; j++) {
 							*pdbl     =  double(tmp[j] & 0xFFFFFFFF);
 							*(pdbl+1) =  double(tmp[j] >> 32);
@@ -1417,6 +1422,7 @@ namespace LinBox
 						++tmp;
 #if __LINBOX_SIZEOF_LONG == 8
 						// specialization for 64bits integer limbs
+						size_t tmpbitsize = tmp.bitsize();
 						for (j=0; j<tmpsize; j++) {
 							*pdbl     = double(0xFFFFFFFF ^ ( tmp[j] & 0xFFFFFFFF));
 							*(pdbl+2) = double(0xFFFFFFFF ^ ( tmp[j] >> 32));
@@ -1454,6 +1460,7 @@ namespace LinBox
 
 					}
 			}
+	}
 
 	}
 
@@ -1504,11 +1511,10 @@ namespace LinBox
 #endif // __LINBOX_apply_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/bb.h b/linbox/blackbox/bb.h
new file mode 100644
index 0000000..cc898cb
--- /dev/null
+++ b/linbox/blackbox/bb.h
@@ -0,0 +1,85 @@
+#ifndef LB_BB_H
+#define LB_BB_H
+/* linbox/blackbox/bb.h
+ * Copyright (C) 2015 bds for LinBox Team.  See linbox/COPYING.LESSER for License info.
+ *
+ * Written by bds
+ *
+ * Blackbox base class for support of separate compilation
+ */
+
+/* blackbox base class
+ *
+ * Algorithms may take BB<Field> parameters and be separately compiled.
+ *
+ * Non-template functions of BB are pure virtual.  Code bloat is avoided.
+ * Template functions may be called by select on the BBType tag.  This 
+ * introduces some code bloat.
+ */
+#include <iostream>
+#include "linbox/util/error.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+namespace LinBox {
+
+// for now, only the FIBB tags.
+enum BBType {diagonal, permutation, triangular, product, lqup, pluq, other};
+
+template <class Ring>
+struct BB 
+{
+	typedef Ring Field;
+	typedef DenseMatrix<Field> ResizableMatrix;
+	//typedef DenseMatrix<Field, std::vector<typename Ring::Element> > ResizableMatrix;
+	typedef DenseMatrix<Field> Matrix;
+
+	virtual ~BB(){}
+
+	virtual BBType bbTag() const 
+	= 0;
+	virtual size_t rowdim() const
+	= 0;
+	virtual size_t coldim() const
+	= 0;
+	virtual const Field& field() const
+	= 0;
+	virtual std::ostream& write(std::ostream& os) const
+	= 0;
+	virtual std::istream& read(std::istream& os) 
+	= 0;
+	virtual Matrix& applyLeft(Matrix& Y, const Matrix& X) const
+	= 0;
+	virtual Matrix& applyRight(Matrix& Y, const Matrix& X) const
+	= 0;
+	template<class OutVector, class InVector>
+	OutVector& apply(OutVector& y, const InVector& x) const
+	{ switch (bbTag()) 
+	  {	//case BBx_tag: static_cast<BBx<Field>*>(this)->apply(y,x); break;
+	  	//case permutation: static_cast<Permutation<Field>*>(this)->apply(y, x)
+	  	default: throw LinboxError("indirect call to apply not supported for BBType " /* bbTag*/);
+	  } 
+	  return y;
+	}
+	template<class OutVector, class InVector>
+	OutVector& applyTranspose(OutVector& y, const InVector& x) const
+	{ switch (bbTag()) 
+	  {	//case BBxtag: static_cast<BBx<Field>*>(this)->applyTranspose(y,x); break;
+	  	default: throw LinboxError("indirect call to applyTranspose not supported for BBType " /* bbTag*/);
+	  } 
+	  return y;
+	}
+
+	template<typename BB2>
+	void map(BB2& A)
+	{ switch (bbTag()) 
+	  {	//case bbxtag: static_cast<bbx<Field>*>(this)->map(A); break;
+	     // using it's struct rebind;
+	  	default: throw LinboxError("indirect call to map not supported for BBType " /* bbTag*/);
+	  }
+	  return A;
+	}
+
+}; // class BB
+
+} // LinBox
+#endif // LB_BB_H
diff --git a/linbox/blackbox/blackbox.doxy b/linbox/blackbox/blackbox.doxy
index bbb13d0..c71eadd 100644
--- a/linbox/blackbox/blackbox.doxy
+++ b/linbox/blackbox/blackbox.doxy
@@ -22,17 +22,17 @@
 
 /** \ingroup linbox
   \defgroup blackbox blackbox
-  \brief These matrix classes adhere to the simple blackbox interface.
+  \brief These matrix classes meet the simple interface needed for blackbox algorithms.
 
   Blackbox matrix algorithms require of the matrix only it's
-  property of being a linear operator.  That is, such algorithms exploit only the
-  capacity to apply the matrix to a vector (column vector on right or row vector on left).
+  property of being a linear operator.  Such algorithms exploit only the
+  capacity to multiply the matrix with a vector or suitably shaped matrix (on right or left).
   The advantage is efficient generic methods particularly applicable to sparse and
-  structured matrix classes in which matrix vector product is fast.  Importantly,
+  structured matrix classes in which matrix-vector product is fast.  Importantly,
   these methods are also space efficient, typically, for an n by n matrix using only O(n) space
   beyond the matrix representation itself.
 
-  These classes all implement the very simple black box
+  These classes all implement the simple black box
   interface as it is defined in the
   LinBox::BlackboxArchetype  base class.  Thus blackbox matrix algorithms may be used on
   objects of any of these classes.  In contrast, classes representing matrices in such
@@ -57,6 +57,17 @@
 \link LinBox::BlackboxArchetype BlackboxArchetype \endlink, so that they may be used as parameters to
 functions compiled with the blackbox archetype.
 
+Blackboxes exist in 3 states: bare, shaped, and ready.
+A bare blackbox results from default construction.  Only shaping functions may be used on bare blackboxes.
+Shaping functions establish the field of the elements and the row and column dimensions.
+Functions field(), rowdim(), coldim(), and initializing functions may be used on shaped matrices.
+initializing functions include read() and, in some cases, setEntry().
+The ready() function converts to the ready state.  For many blackbox classes it is optional, for others it is essential.  Mathematical operations are valid on ready blackboxes (apply(), applyTranspose(), matrixHom()).
+
+The mother model is used for the member field of a blackbox.  The lifetime of the field must enclose the lifetime of a blackbox based on the field.  
+The public field() function of a blackbox returns a "const Field &" and thus may only be called on a shaped blackbox.
+The protected field member is a "const Field *".  
+This convention (1) allows bare blackboxes and (2) avoids proliferation of field copies.  While most fields are tiny objects, a few have a large amount of data.  
  */
 
 // vim:syn=doxygen
diff --git a/linbox/blackbox/blackbox.h b/linbox/blackbox/blackbox.h
new file mode 100644
index 0000000..b93dda4
--- /dev/null
+++ b/linbox/blackbox/blackbox.h
@@ -0,0 +1,69 @@
+/* Copyright (C) 2014 the LinBox group
+ *
+ *
+ * Written by :
+ *          Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/** @file linbox/blackbox/blackbox.h
+ * @brief File including all of LinBox blackboxes.
+ */
+
+
+#ifndef __LINBOX_blackbox_blackbox_H
+#define __LINBOX_blackbox_blackbox_H
+
+#include "linbox/matrix/matrix-traits.h"
+
+#include "linbox/blackbox/compose.h"
+#include "linbox/blackbox/transpose.h"
+#include "linbox/blackbox/lambda-sparse.h"
+// #include "linbox/blackbox/subrowmatrix.h"
+#include "linbox/blackbox/polynomial.h"
+#include "linbox/blackbox/scalar-matrix.h"
+
+namespace LinBox {
+
+	template<class Field, class Row>
+	struct IndexedCategory< LambdaSparseMatrix<Field,Row> >         {
+		typedef IndexedTags::HasIndexed Tag;
+	};
+
+
+#if 0
+	template<class Matrix, class MatrixCategory>
+	struct IndexedCategory< SubRowMatrix<Matrix,MatrixCategory> >   {
+		typedef IndexedTags::HasIndexed Tag;
+	};
+#endif
+
+} // LinBox
+
+#endif // __LINBOX_blackbox_blackbox_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/blackbox_parallel.h b/linbox/blackbox/blackbox_parallel.h
new file mode 100644
index 0000000..8550b1b
--- /dev/null
+++ b/linbox/blackbox/blackbox_parallel.h
@@ -0,0 +1,274 @@
+/* Copyright (C) 2010 LinBox
+ *  Author: Zhendong Wan
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_blackbox_parallel_H
+#define __LINBOX_blackbox_parallel_H
+
+/* parallel apply and apply transpose
+ */
+#include "linbox/vector/subvector.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/algorithms/density.h"
+#include "linbox/blackbox/blackbox-interface.h"
+#include "linbox/blackbox/subrowmatrix.h"
+#include "linbox/blackbox/blackbox_thread.h"
+
+#include <typeinfo>
+
+namespace LinBox
+{
+
+	/** \brief This is a matrix representation supporting a parallel matrix vector product
+	 */
+	template <class Out, class Matrix, class In>
+	Out& BlackboxParallel(Out& out,const Matrix& m,
+			      const In& in, BBBase::BBType type) : public BlackboxInterface
+
+
+	template <class Out, class Matrix, class In>
+	Out& BlackboxParallel(Out& out, const Matrix& cm, const In& in, BBBase::BBType type) : public BlackboxInterface
+	{
+
+		typedef SubRowMatrix<Matrix> SubMatrix;
+
+		typedef typename Out::iterator OutIterator;
+
+		typedef typename In::const_iterator InIterator;
+
+		typename BB_list_list::const_iterator cp;
+
+		const std::type_info * key = & typeid (Out& (*) (Out&, const Matrix&, const In&));
+
+		// search the threads info location
+		cp = cm. sub_list. find (key);
+
+		// allocate threads for this apply function
+		if (cp == cm. sub_list. end()) {
+
+			Matrix& m = const_cast<Matrix&>(cm);
+
+			m. sub_list. insert (std::pair<const std::type_info*,
+						    BB_list>
+						(key, BB_list()));
+
+			typename BB_list_list::iterator p;
+
+			p = m. sub_list. find (key);
+
+			cp = p;
+
+			pthread_sigmask (SIG_BLOCK, &(Thread::sigset), 0);
+
+			const In* inaddr = NULL;
+
+			int nnz = 0;
+
+			int aver_load, cur_load;
+
+			typename Matrix::ConstRowIterator row_p;
+
+			for (row_p = m. rowBegin(); row_p != m. rowEnd(); ++ row_p)
+
+				nnz += density(*row_p);
+
+			aver_load = (int)ceil((double)nnz / (double)LINBOX_NTHR);
+
+			cur_load = 0;
+
+			int len = 0;
+
+			int pos = 0;
+
+			SubMatrix* subp;
+
+			Out* outaddr = NULL;
+
+			BBBase* t;
+
+			for (row_p = m. rowBegin(); row_p != m. rowEnd(); ++ row_p) {
+
+				cur_load += density(*row_p);
+
+				++ len;
+
+				if ((cur_load >= aver_load) || (((size_t)(pos + len) == cm. rowdim()) && (cur_load > 0))) {
+
+					cur_load = 0;
+
+					subp = new SubMatrix(&m, pos, len);
+
+					t = createBBThread(subp, outaddr, inaddr);
+
+					p -> second. push_back (t);
+
+					pos += len;
+
+					len = 0;
+				}
+
+			}
+
+		}
+
+		switch (type) {
+
+		case BBBase::Apply :  {
+
+			std::vector<Subvector<OutIterator>*> outv(cp -> second.size());
+
+			typename std::vector<Subvector<OutIterator>*>::iterator outv_p = outv. begin();
+
+			int len = 0;
+
+			int pos = 0;
+
+			BB_list::const_iterator ti_p;
+
+			const In* inaddr = ∈
+
+			BBBase* bp = NULL;
+
+			// give the input for each threads, and signal them
+			for (ti_p = cp -> second. begin(); ti_p != cp -> second. end(); ++ ti_p, ++ outv_p) {
+
+				bp = *(ti_p);
+
+				len = ((const SubMatrix*)bp -> bb_addr) -> rowdim();
+
+				*outv_p = new Subvector<OutIterator>(out. begin() + pos,
+							  out. begin() + (pos + len));
+
+				bp -> bb_outaddr = (void*) *outv_p;
+
+				bp -> bb_inaddr = (const void*) inaddr;
+
+				bp -> bb_type = BBBase::Apply;
+
+				Thread::signal_thread (bp);
+
+				pos += len;
+			}
+
+			OutIterator out_p;
+
+			for (out_p = out. begin() + pos; out_p != out. end(); ++ out_p)
+
+				cm. field(). assign(*out_p, cm.field().zero);
+
+			for (ti_p = cp ->second. begin(); ti_p != cp -> second. end(); ++ ti_p)
+
+			Thread::wait_thread (*ti_p);
+
+			for (outv_p = outv. begin(); outv_p != outv. end(); ++ outv_p)
+
+			delete (*outv_p);
+
+			break; }
+
+		case BBBase::ApplyTranspose : {
+
+			int nthr = cp -> second. size ();
+
+			OutIterator out_p;
+
+			 for (out_p = out. begin(); out_p != out. end(); ++ out_p)
+
+                                cm. field(). assign(*out_p, cm.field().zero);
+
+			std::vector<std::vector<typename Matrix::Field::Element> > out_v(nthr);
+
+			std::vector<Subvector<InIterator>*> in_v(nthr);
+
+			typename std::vector<std::vector<typename Matrix::Field::Element> >::iterator out_v_p;
+
+			typename std::vector<Subvector<InIterator>*>::iterator in_v_p;
+
+                        int len = 0;
+
+                        int pos = 0;
+
+                        BB_list::const_iterator ti_p;
+
+                        BBBase* bp = NULL;
+
+			for (ti_p = cp -> second. begin (), in_v_p = in_v. begin(), out_v_p = out_v. begin();
+			     ti_p != cp -> second. end();
+		  	     ++ ti_p, ++ in_v_p, ++ out_v_p) {
+
+				bp = *ti_p;
+
+				len = ((const SubMatrix*)bp -> bb_addr) -> rowdim();
+
+				*in_v_p = new Subvector<InIterator>(in. begin() + pos, in. begin() + (pos + len));
+
+				out_v_p -> resize (cm. coldim());
+
+				bp -> bb_outaddr = &(*out_v_p);
+
+				bp -> bb_inaddr = *in_v_p;
+
+				bp -> bb_type = BBBase::ApplyTranspose;
+
+				Thread::signal_thread (bp);
+
+				pos += len;
+			}
+
+			for (ti_p = cp ->second. begin(); ti_p != cp -> second. end(); ++ ti_p)
+
+                       		Thread::wait_thread (*ti_p);
+
+			VectorDomain<typename Matrix::Field> vd(cm. field());
+
+			for (out_v_p = out_v. begin(), in_v_p = in_v. begin();
+			     out_v_p != out_v. end(); ++ out_v_p, ++ in_v_p) {
+
+				vd. addin (out, *out_v_p);
+
+				delete (*in_v_p);
+
+			}
+
+			break; }
+
+		default :
+			break;
+		}
+
+		return out;
+	}
+
+}
+
+#endif //__LINBOX_blackbox_parallel_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/blackbox/blackbox_thread.h b/linbox/blackbox/blackbox_thread.h
new file mode 100644
index 0000000..240f778
--- /dev/null
+++ b/linbox/blackbox/blackbox_thread.h
@@ -0,0 +1,405 @@
+/* Copyright (C) 2010 LinBox
+ * Written by
+ * zhendong wan
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_blackbox_thread_H
+#define __LINBOX_blackbox_thread_H
+
+/* create a thread, which is bound to  a lwp to run matrix apply
+*/
+
+#include "linbox/vector/subvector.h"
+#include <pthread.h>
+#include <signal.h>
+#include <string.h>
+
+namespace LinBox
+{
+
+	/** built on posix threads
+	  \ingroup blackbox
+
+	  This is a thread interface, built on posix threads.
+	  */
+	class Thread {
+
+	public:
+
+#ifdef DEBUG
+		static int count;
+#endif
+
+		// attributes for posix thread
+		static pthread_attr_t attr;
+
+		// a signal set
+		static sigset_t sigset;
+
+		static const int SIGAPPLY;
+
+		static void terminate_thread (const Thread* t) {
+
+			pthread_cancel(t -> getpid());
+
+			pthread_join (t -> getpid(), 0);
+
+		}
+
+		// signal a thread
+		static void signal_thread (const Thread* t) {
+
+			pthread_kill ( t -> getpid(), SIGAPPLY);
+
+		}
+
+		// wait for a signal
+		static void wait_thread (const Thread* t) {
+
+			int err = 0, sig = 0;
+
+			err = sigwait (&sigset, &sig);
+
+			if (err == -1) {
+
+				std::cerr << strerror (errno);
+
+
+				exit (1);
+			}
+
+		}
+
+		// notify the caller
+		static void notify_parent (const Thread* t) {
+
+			pthread_kill ( t -> getppid(), SIGAPPLY);
+
+		}
+
+		// terminate a thread
+		static void terminate_thread (const Thread& t) {
+
+			pthread_cancel(t. getpid());
+
+			pthread_join (t. getpid(), 0);
+
+		}
+
+		static void signal_thread (const Thread& t) {
+
+			pthread_kill ( t. getpid(), SIGAPPLY);
+
+		}
+
+		static void wait_thread (const Thread& t) {
+
+			int err = 0, sig = 0;
+
+			err = sigwait (&sigset, &sig);
+
+			if (err == -1) {
+
+				std::cerr << strerror (errno);
+
+
+				exit (1);
+			}
+
+		}
+
+		static void notify_parent (const Thread& t) {
+
+			pthread_kill ( t. getppid(), SIGAPPLY);
+
+		}
+
+	protected:
+
+		pthread_t pid;
+
+		pthread_t ppid;
+
+	public:
+
+		/** return the unique id associate with the thread.*/
+		pthread_t getpid ( ) const {
+
+			return pid;
+		}
+
+		/** set the unique id associate with the thread.*/
+		void setpid (pthread_t _pid) {
+
+			pid = _pid;
+		}
+
+		/** return caller's id */
+		pthread_t getppid ( ) const {
+
+			return ppid;
+		}
+
+		/** set the caller's id */
+		void setppid (pthread_t _ppid) {
+
+			ppid = _ppid;
+		}
+
+		/** run the thread */
+		virtual void run (void) = 0;
+
+		virtual ~Thread () {
+#ifdef DEBUG
+			--count;
+#endif
+
+		}
+
+		Thread () {
+#ifdef DEBUG
+
+			++ count;
+#endif
+		}
+
+	};
+
+#ifdef DEBUG
+
+	int Thread::count  = 0;
+#endif
+
+	/* initialization of static member of Thread */
+	const int Thread::SIGAPPLY = SIGRTMIN;
+
+	pthread_attr_t Thread::attr = (
+
+				       pthread_attr_init (&(Thread::attr)),
+
+				       pthread_attr_setscope (&(Thread::attr), PTHREAD_SCOPE_SYSTEM),
+
+				       Thread::attr
+				      );
+
+	sigset_t Thread::sigset = (
+
+				   sigemptyset (&(Thread::sigset)),
+
+				   sigaddset (&(Thread::sigset), Thread::SIGAPPLY),
+
+				   (Thread::sigset)
+				  );
+
+
+	/* a posix thread bound to an object of Thread */
+	void* runThread (void* arg) {
+
+		Thread* t = (Thread*) arg;
+
+		pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL);
+
+		pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
+
+		t -> run ( );
+
+		return 0;
+	}
+
+	// blackbox base
+	// a pointer to the address of BB
+	// a pointer to the address of output
+	// a pointer to the address of input
+	struct BBBase : public virtual Thread {
+
+		typedef enum {Apply, ApplyTranspose} BBType;
+
+		BBBase (const void* addr = NULL, void* outaddr = NULL,
+			const void* inaddr = NULL, BBType type = Apply) :
+
+			Thread (),
+			bb_addr (addr),
+			bb_outaddr (outaddr),
+			bb_inaddr (inaddr),
+			bb_type(type){
+
+
+#ifdef DEBUG
+				std::cout << "A blackbox was created with info:\n";
+
+				std::cout << "\tAddress of thread " << bb_addr << '\n';
+
+				std::cout << "\tAddrees of output " << bb_outaddr << '\n';
+
+				std::cout << "\tAddress of input " << bb_inaddr << '\n';
+
+#endif
+			}
+
+		virtual ~BBBase () {
+		}
+
+		const void* bb_addr;
+
+		void*  bb_outaddr;
+
+		const void*  bb_inaddr;
+
+		BBType bb_type;
+
+	};
+
+	class LessTypeInfo {
+
+	public:
+
+		bool operator() (const std::type_info* info1, const std::type_info* info2) const
+		{
+
+			return info1 -> before (*info2);
+		}
+	};
+
+	typedef std::vector<BBBase*> BB_list;
+
+	typedef std::map <const std::type_info*, BB_list, LessTypeInfo> BB_list_list;
+
+	template <class Matrix, class Out, class In>
+
+	class BBThread : public virtual BBBase {
+
+	public:
+
+		typedef Subvector<typename Out::iterator> SubOut;
+
+		typedef Subvector<typename In::const_iterator> SubIn;
+
+		BBThread(const Matrix* _m = NULL, Out* _outaddr = NULL,
+			 const In* _inaddr = NULL, BBBase::BBType type= BBBase::Apply) :
+			Thread(), BBBase ((const void*)_m, (void*)_outaddr, (const void*)_inaddr, type) {
+
+
+#ifdef DEBUG
+				std::cout << "A BB thread was created with properties:\n";
+
+				std::cout << "Matrix: ";
+
+				_m -> write (std::cout);
+
+				std::cout << '\n';
+
+				std::cout << "Out address " << bb_outaddr << '\n';
+
+				std::cout << "In address " << bb_inaddr << '\n';
+
+#endif
+			}
+
+		inline void run (void) {
+
+			const Matrix& matrix = *((const Matrix*)bb_addr);
+
+			while (true) {
+
+				//wait for signal
+				Thread::wait_thread (this);
+
+				switch (bb_type) {
+
+					// Apply request
+				case BBBase::Apply :
+
+					matrix. apply ( *(SubOut*)bb_outaddr,
+							*(const In*)bb_inaddr );
+
+					break;
+
+					// ApplyTranspose request
+				case BBBase::ApplyTranspose :
+
+					matrix. applyTranspose (*(std::vector<typename Matrix::Field::Element>*)bb_outaddr,
+								*(const SubIn*)bb_inaddr);
+
+					break;
+
+					// othre choices
+				default :
+
+					std::cerr << "Unknown command type\n";
+
+					break;
+				}
+
+				Thread::notify_parent (this);
+			}
+		}
+
+		virtual ~BBThread () {
+
+			delete (const Matrix*)bb_addr;
+
+		}
+	};
+
+	/*- create posix thread corresponding a BBThread, and run it */
+	template<class Matrix, class Out, class In>
+
+	BBThread<Matrix, Out, In>* createBBThread ( const Matrix* m, Out* out, const In* in) {
+
+		pthread_t id;
+
+		BBThread<Matrix, Out, In>* t = new BBThread<Matrix, Out, In>(m, out, in);
+
+		int ret = pthread_create (&id, &(Thread::attr), runThread, t);
+
+		if (ret != 0) {
+#ifdef DEBUG
+			std::cout << "Number of thread created: " << Thread::count << '\n';
+#endif
+
+			std::cout << "Not enough resource\n";
+
+			std::cerr << strerror(ret);
+
+			exit (1);
+		}
+
+		t -> setpid (id);
+
+		t -> setppid (pthread_self ());
+
+		return t;
+	}
+
+}
+#endif //__LINBOX_blackbox_thread_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/blackbox/block-hankel-inverse.h b/linbox/blackbox/block-hankel-inverse.h
index 5740711..b994d77 100644
--- a/linbox/blackbox/block-hankel-inverse.h
+++ b/linbox/blackbox/block-hankel-inverse.h
@@ -39,6 +39,7 @@
 //#define PADEMATRIX
 
 
+
 namespace LinBox
 {
 
@@ -48,9 +49,9 @@ namespace LinBox
 	public:
 		typedef _Field                    Field;
 		typedef typename Field::Element Element;
-		typedef BlasMatrix<Element> Coefficient;
+		typedef BlasMatrix<Field> Coefficient;
 	private:
-		Field                   _field;
+		const Field           *_field;
 		VectorDomain<Field>    _VD;
 		BlockHankel<Field>    *_H1;
 		BlockHankel<Field>    *_T1;
@@ -65,8 +66,8 @@ namespace LinBox
 		// Constructor from a stl vector of BlasMatrix reprenting
 		// all different elements in the Hankel representation
 		// vector is of odd size and represent the 1st column and last row append together
-		BlockHankelInverse(const Field &F, const std::vector<BlasMatrix<Element> > &P) :
-			_field(F), _VD(F), _BMD(F)
+		BlockHankelInverse(const Field &F, const std::vector<BlasMatrix<Field> > &P) :
+			_field(&F), _VD(F), _BMD(F)
 		{
 			//write_maple("UAV",P);
 
@@ -75,8 +76,7 @@ namespace LinBox
 			size_t rowblock = (deg+1)>>1;
 			size_t colblock = rowblock;
 			_row = _col = colblock*block;
-			Element one;
-			_field.init(one, 1UL);
+			Element one=field().one;
 			_numblock=rowblock;
 			_block= block;
 
@@ -86,21 +86,34 @@ namespace LinBox
 
 #ifndef PADEMATRIX
 			// construct the matrix polynomial serie  [ P(x)^T  I ]^T and [ P^T(x) I ]
-			std::vector<Coefficient> RightPowerSerie(deg+2), LeftPowerSerie(deg+2), LPS(deg+2), RPS(deg+2);
+			Coefficient Zero1(F,2*block,block);
+			Coefficient ZeroT(F,block,2*block);
+
+			std::vector<Coefficient> RightPowerSerie(deg+2,Zero1), LeftPowerSerie(deg+2,ZeroT);
+			std::vector<Coefficient> LPS(deg+2,Zero1), RPS(deg+2,ZeroT);
+
+			//free memory
+			Zero1.resize(0,0);
+			ZeroT.resize(0,0);
+
 			for (size_t i=0;i< deg+2; ++i){
-				LeftPowerSerie[i]  = Coefficient(2*block, block); LPS[i]= Coefficient(2*block, block);
-				RightPowerSerie[i] = Coefficient(block, 2*block); RPS[i]= Coefficient(block, 2*block);
+				// LeftPowerSerie[i]  = Coefficient(2*block, block); LPS[i]= Coefficient(2*block, block);
+				// RightPowerSerie[i] = Coefficient(block, 2*block); RPS[i]= Coefficient(block, 2*block);
 				if (i <deg) {
 					for (size_t j=0;j<block;++j)
 						for (size_t k=0;k<block;++k){
-							LeftPowerSerie[i].setEntry(j,k,  P[i].getEntry(j,k));LPS[i].setEntry(j,k,  P[i].getEntry(j,k));
-							RightPowerSerie[i].setEntry(j,k, P[i].getEntry(j,k));RPS[i].setEntry(j,k,  P[i].getEntry(j,k));
+							LeftPowerSerie[i]. setEntry(j,k, P[i].getEntry(j,k));
+							LPS[i].            setEntry(j,k, P[i].getEntry(j,k));
+							RightPowerSerie[i].setEntry(j,k, P[i].getEntry(j,k));
+							RPS[i].            setEntry(j,k, P[i].getEntry(j,k));
 						}
 				}
 			}
 			for (size_t j=0;j<block;++j){
-				LeftPowerSerie[0].setEntry(block+j, j , one);	LPS[0].setEntry(block+j, j , one);
-				RightPowerSerie[0].setEntry(j, block+j, one);   RPS[0].setEntry(j, j+block , one);
+				LeftPowerSerie[0]. setEntry(block+j, j , one);
+				LPS[0].            setEntry(block+j, j , one);
+				RightPowerSerie[0].setEntry(j, block+j , one);
+				RPS[0].            setEntry(j, block+j , one);
 			}
 
 			//write_maple("Sx",LeftPowerSerie);
@@ -134,7 +147,7 @@ namespace LinBox
 			//SBL.left_basis  (LP2, deg+1, dlp2);
 			//SBR.right_basis (RP2, deg+1, drp2);
 
-			std::vector<BlasMatrix<Element> > SLP1, SLP2, SRP1, SRP2;
+			std::vector<BlasMatrix<Field> > SLP1, SLP2, SRP1, SRP2;
 
 			extractLeftSigma  (SLP1, LP1, dlp1, block);
 			extractLeftSigma  (SLP2, LP2, dlp2, block);
@@ -150,7 +163,7 @@ namespace LinBox
 				drp[i]=1;
 			}
 
-			Coefficient ZeroSerie(block, block);
+			Coefficient ZeroSerie(field(),block, block);
 			std::vector<Coefficient> Serie(deg+2, ZeroSerie);
 			for (size_t i=0;i<deg;++i)
 				for (size_t j=0;j<block;++j)
@@ -160,14 +173,14 @@ namespace LinBox
 			SigmaBasis<Field> SBL(F, Serie);
 			SigmaBasis<Field> SBR(F, Serie);
 
-			std::vector<BlasMatrix<Element> > SLP1, SLP2, SRP1, SRP2;
+			std::vector<BlasMatrix<Field> > SLP1, SLP2, SRP1, SRP2;
 			SBL.multi_left_PadeMatrix  (SLP1, deg-1, SLP2, deg+1, dlp);
 			SBR.multi_right_PadeMatrix (SRP1, deg-1, SRP2, deg+1, drp);
 
 #endif
 
 
-			BlasMatrix<Element> Res(block,block), Inv(block, block);
+			BlasMatrix<Field> Res(field(),block,block), Inv(field(),block, block);
 
 			int singular;
 			// Normalization of SLP2 (V*)
@@ -229,17 +242,18 @@ namespace LinBox
 			   write_maple("V",SRP2);
 			   */
 
-			std::vector<Coefficient> rev_poly(SRP2.size());
+			Coefficient Zero2(field());
+			std::vector<Coefficient> rev_poly(SRP2.size(),Zero2);
 			for (size_t i=0;i<SRP2.size();++i)
 				rev_poly[i]= SRP2[SRP2.size()-1-i];
 
 			rev_poly.erase(rev_poly.begin());
 
 
-			_H1 = new BlockHankel<Field>  (_field, rev_poly, BlockHankelTag::up); // V
+			_H1 = new BlockHankel<Field>  (field(), rev_poly, BlockHankelTag::up); // V
 
 			rev_poly.resize(SRP2.size());
-			const BlasMatrix<Element> Zero(block,block);
+			const BlasMatrix<Field> Zero(field(),block,block);
 			for (size_t i=0;i<SRP1.size();++i)
 				rev_poly[i]= SRP1[SRP1.size()-1-i];
 			rev_poly[SRP1.size()]= Zero;
@@ -247,15 +261,16 @@ namespace LinBox
 
 
 
-			_H2 = new BlockHankel<Field>  (_field, rev_poly, BlockHankelTag::up); // Q
+			_H2 = new BlockHankel<Field>  (field(), rev_poly, BlockHankelTag::up); // Q
 
-			_T1 = new BlockHankel<Field>  (_field, SLP1, BlockHankelTag::up); // Qstar
+			_T1 = new BlockHankel<Field>  (field(), SLP1, BlockHankelTag::up); // Qstar
 
 			SLP2.erase(SLP2.begin());
-			_T2 = new BlockHankel<Field>  (_field, SLP2, BlockHankelTag::up); // Vstar
+			_T2 = new BlockHankel<Field>  (field(), SLP2, BlockHankelTag::up); // Vstar
 
 		}
 
+		//!@bug copy constructor ??
 
 		~BlockHankelInverse()
 		{
@@ -276,7 +291,7 @@ namespace LinBox
 			// reverse y according to block structure
 			for (size_t i=0; i< _numblock; ++i)
 				for (size_t j=0;j<_block;++j){
-					_field.assign(rev_y[(_numblock-i-1)*_block+j], y[i*_block+j]);
+					field().assign(rev_y[(_numblock-i-1)*_block+j], y[i*_block+j]);
 				}
 
 			_T1->apply(z1, rev_y);
@@ -299,12 +314,12 @@ namespace LinBox
 
 		size_t coldim() const { return _col;}
 
-		const Field& field() const { return _field;}
+		const Field& field() const { return *_field;}
 
 	protected:
 
-		void extractLeftSigma(std::vector<BlasMatrix<Element> >              &S,
-				      std::vector<BlasMatrix<Element> >      &SigmaBase,
+		void extractLeftSigma(std::vector<BlasMatrix<Field> >              &S,
+				      std::vector<BlasMatrix<Field> >      &SigmaBase,
 				      std::vector<size_t>                       &defect,
 				      size_t                                      block) const
 		{
@@ -314,7 +329,7 @@ namespace LinBox
 				std::cout<<defect[i]<<",";
 			std::cout<<"\n";
 			for (size_t i=0;i<SigmaBase.size();++i)
-				SigmaBase[i].write(std::cout,_field);
+				SigmaBase[i].write(std::cout,field());
 #endif
 
 			// take the block rows which have lowest defect
@@ -342,7 +357,7 @@ namespace LinBox
 			size_t idx=0;
 			for (size_t i=0; i<2*block;++i){
 				for (size_t j=0;j<2*block;++j)
-					if (!_field.isZero(SigmaBase[0].getEntry(i,j))){
+					if (!field().isZero(SigmaBase[0].getEntry(i,j))){
 						notnull[idx]=i;
 						++idx;
 						break;
@@ -356,7 +371,7 @@ namespace LinBox
 					max=defect[i];
 
 			// prepare S to receive the sigma base
-			const BlasMatrix<Element> Zero(block,block);
+			const BlasMatrix<Field> Zero(field(),block,block);
 			S.resize(max+1, Zero);
 
 			// extract the sigma base
@@ -369,8 +384,8 @@ namespace LinBox
 		}
 
 
-		void extractRightSigma(std::vector<BlasMatrix<Element> >            &S,
-				       std::vector<BlasMatrix<Element> >    &SigmaBase,
+		void extractRightSigma(std::vector<BlasMatrix<Field> >            &S,
+				       std::vector<BlasMatrix<Field> >    &SigmaBase,
 				       std::vector<size_t>                     &defect,
 				       size_t                                    block) const
 		{
@@ -381,7 +396,7 @@ namespace LinBox
 			std::cout<<"\n";
 
 			for (size_t i=0;i<SigmaBase.size();++i)
-				SigmaBase[i].write(std::cout,_field);
+				SigmaBase[i].write(std::cout,field());
 #endif
 
 			// take the m rows which have lowest defect
@@ -409,7 +424,7 @@ namespace LinBox
 			size_t idx=0;
 			for (size_t i=0; i<2*block;++i){
 			for (size_t j=0;j<2*block;++j)
-			if (!_field.isZero(SigmaBase[0].getEntry(i,j))){
+			if (!field().isZero(SigmaBase[0].getEntry(i,j))){
 			notnull[idx]=i;
 			++idx;
 			break;
@@ -423,7 +438,7 @@ namespace LinBox
 					max=defect[i];
 
 			// prepare S to receive the sigma base
-			const BlasMatrix<Element> Zero(block,block);
+			const BlasMatrix<Field> Zero(field(),block,block);
 			S.resize(max+1, Zero);
 
 			// extract the sigma base
@@ -456,26 +471,26 @@ namespace LinBox
 				for (size_t i=0;i<m-1;++i){
 					std::cout<<"[";
 					for (size_t j=0;j<n-1;++j)
-						_field.write(std::cout,P[k].getEntry(i,j))<<",";
-					_field.write(std::cout, P[k].getEntry(i,n-1))<<"] , ";
+						field().write(std::cout,P[k].getEntry(i,j))<<",";
+					field().write(std::cout, P[k].getEntry(i,n-1))<<"] , ";
 				}
 				std::cout<<"[";
 				for (size_t j=0;j<n-1;++j)
-					_field.write(std::cout,P[k].getEntry(m-1,j))<<",";
-				_field.write(std::cout, P[k].getEntry(m-1,n-1))<<"]]) , ";
+					field().write(std::cout,P[k].getEntry(m-1,j))<<",";
+				field().write(std::cout, P[k].getEntry(m-1,n-1))<<"]]) , ";
 			}
 
 			std::cout<<"Matrix([";
 			for (size_t i=0;i<m-1;++i){
 				std::cout<<"[";
 				for (size_t j=0;j<n-1;++j)
-					_field.write(std::cout,P[P.size()-1].getEntry(i,j))<<",";
-				_field.write(std::cout, P[P.size()-1].getEntry(i,n-1))<<"] , ";
+					field().write(std::cout,P[P.size()-1].getEntry(i,j))<<",";
+				field().write(std::cout, P[P.size()-1].getEntry(i,n-1))<<"] , ";
 			}
 			std::cout<<"[";
 			for (size_t j=0;j<n-1;++j)
-				_field.write(std::cout,P[P.size()-1].getEntry(m-1,j))<<",";
-			_field.write(std::cout, P[P.size()-1].getEntry(m-1,n-1))<<"]])]; \n";
+				field().write(std::cout,P[P.size()-1].getEntry(m-1,j))<<",";
+			field().write(std::cout, P[P.size()-1].getEntry(m-1,n-1))<<"]])]; \n";
 		}
 
 
diff --git a/linbox/blackbox/block-hankel.h b/linbox/blackbox/block-hankel.h
index 175c861..f1b916b 100644
--- a/linbox/blackbox/block-hankel.h
+++ b/linbox/blackbox/block-hankel.h
@@ -26,13 +26,14 @@
 #define __LINBOX_bb_block_hankel_H
 
 #include <vector>
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
 #include "linbox/vector/vector-domain.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
 #include "linbox/util/debug.h"
 
 //#define BHANKEL_TIMER
 
+
 namespace LinBox
 {
 
@@ -45,14 +46,14 @@ namespace LinBox
 	// note that P is done as a mirror
 	// here we compute a^d.P(1/a^d) where d is the degree of P
 	template<class Field>
-	void MatPolyHornerEval (const Field                                               &F,
-				BlasMatrix<typename Field::Element>                       &R,
-				const std::vector<BlasMatrix<typename Field::Element> >   &P,
-				const typename Field::Element                             &a)
+	void MatPolyHornerEval (const Field                             &F,
+				BlasMatrix<Field>                       &R,
+				const std::vector<BlasMatrix<Field> >   &P,
+				const typename Field::Element           &a)
 	{
 		R= P[0];
-		typename BlasMatrix<typename Field::Element>::Iterator it_R;
-		typename BlasMatrix<typename Field::Element>::ConstIterator it_P;
+		typename BlasMatrix<Field>::Iterator it_R;
+		typename BlasMatrix<Field>::ConstIterator it_P;
 		for (size_t k=1; k<P.size(); ++k){
 			it_R = R.Begin();
 			it_P = P[k].Begin();
@@ -88,22 +89,21 @@ namespace LinBox
 	}
 
 	template<class Field>
-	void BlockHankelEvaluation(const Field                                              &F,
-				   std::vector<BlasMatrix<typename Field::Element> >        &E,
-				   const std::vector<BlasMatrix<typename Field::Element> >  &P,
-				   size_t                                                    k)
+	void BlockHankelEvaluation(const Field                            &F,
+				   std::vector<BlasMatrix<Field> >        &E,
+				   const std::vector<BlasMatrix<Field> >  &P,
+				   size_t                                 k)
 	{
 		// do the evaluation of the Block Hankel Matrix using Horner Rules
 		// at k differents points (0,1,2,..,k-1)
 
 		E.resize(k);
 		E[0]=P.back();
-		typename Field::Element a, one;
-		F.init(one,1);
-		F.assign(a,one);
+		typename Field::Element a ;
+		F.assign(a,F.one);
 		for (size_t i=1;i<k;++i){
 			MatPolyHornerEval(F, E[i], P, a);
-			F.addin(a, one);
+			F.addin(a, F.one);
 		}
 	}
 
@@ -115,13 +115,12 @@ namespace LinBox
 	{
 		size_t k=E.size();
 		E[0]=std::vector<typename Field::Element> (P.begin(), P.begin()+block);
-		typename Field::Element a, one;
-		F.init(one,1);
-		F.assign(a,one);
+		typename Field::Element a;
+		F.assign(a,F.one);
 
 		for (size_t i=1;i<k;++i){
 			VectHornelEval (F, E[i], P, block, a);
-			F.addin(a, one);
+			F.addin(a, F.one);
 		}
 	}
 
@@ -132,18 +131,17 @@ namespace LinBox
 				   std::vector<std::vector<typename Field::Element> >  &P,
 				   size_t                                  k)
 	{
-		typename Field::Element one,zero, a;
-		F.init(one,1);F.init(zero,0);
-		F.init(a,0);
+		typename Field::Element  a;
+		F.assign(a,F.zero);
 
 		// compute L:= (x)(x-1)(x-2)(x-3)...(x-k+1) = a1x+a2x^2+...+a(k-1)x^(k-1)
 		std::list<typename Field::Element> L(2);
-		F.assign(L.front(), zero);
-		F.assign(*(++L.begin()), one);
+		F.assign(L.front(), F.zero);
+		F.assign(*(++L.begin()), F.one);
 		for (size_t i=1;i<k;++i){
-			F.subin(a, one);
-			L.push_front(zero);
-			typename std::list<typename Field::Element>::iterator it_next = L.begin();it_next++;
+			F.subin(a, F.one);
+			L.push_front(F.zero);
+			typename std::list<typename Field::Element>::iterator it_next = L.begin();++it_next;
 			typename std::list<typename Field::Element>::iterator it = L.begin();
 			for (;it_next != L.end();++it, ++it_next)
 				F.axpyin(*it, a, *it_next);
@@ -152,9 +150,9 @@ namespace LinBox
 		// compute P[i]:= L/(x-i)
 		P[0]= std::vector<typename Field::Element>(++L.begin(), L.end());
 		size_t deg=L.size();
-		F.init(a,0);
+		F.assign(a,F.zero);
 		for (size_t i=1;i<k;++i){
-			F.addin(a,one);
+			F.addin(a,F.one);
 			P[i].resize(deg-1);
 			typename std::list<typename Field::Element>::const_reverse_iterator rit=L.rbegin();
 			F.assign(P[i][deg-2],*rit);
@@ -165,17 +163,17 @@ namespace LinBox
 
 		// compute P[i]= P[i] / Prod((i-j), j<>i)
 		typename Field::Element prod, ui, uj, tmp;
-		F.init(ui,-1);
+		F.assign(ui,F.mOne);
 		for (size_t i=0;i<k;++i){
-			F.assign(prod,one);
-			F.addin(ui,one);
-			F.assign(uj,zero);
+			F.assign(prod,F.one);
+			F.addin(ui,F.one);
+			F.assign(uj,F.zero);
 			for (size_t j=0;j<k;++j){
 				if (j != i){
 					F.sub(tmp,ui,uj);
 					F.mulin(prod,tmp);
 				}
-				F.addin(uj,one);
+				F.addin(uj,F.one);
 			}
 			F.invin(prod);
 			//std::cout<<"coeff: ";F.write(std::cout, prod)<<"\n";
@@ -216,14 +214,15 @@ namespace LinBox
 		typedef _Field Field;
 		typedef typename Field::Element Element;
 
+		//! is this used ?
 		BlockHankel() {}
 
 		// Constructor from a stl vector of BlasMatrix reprenting
 		// all different elements in the Hankel representation
 		// order of element will depend on first column and/or  last row
 		// (plain->[column|row];  up -> [column]; low -> [row];)
-		BlockHankel (Field &F, const std::vector<BlasMatrix<Element> > &H, BlockHankelTag::shape s= BlockHankelTag::plain) :
-			_field(F), _BMD(F)
+		BlockHankel (Field &F, const std::vector<BlasMatrix<Field> > &H, BlockHankelTag::shape s= BlockHankelTag::plain) :
+			_field(&F), _BMD(F)
 		{
 			linbox_check( H.begin()->rowdim() != H.begin()->coldim());
 
@@ -239,7 +238,7 @@ namespace LinBox
 					_row = _rowblock*_block;
 					_col = _row;
 					_shape = s;
-					BlockHankelEvaluation( _field, _matpoly, H, _deg+_colblock-1);
+					BlockHankelEvaluation( field(), _matpoly, H, _deg+_colblock-1);
 				}
 				break;
 			case BlockHankelTag::up :
@@ -251,7 +250,7 @@ namespace LinBox
 					_row   = _rowblock*_block;
 					_col   = _row;
 					_shape = s;
-					BlockHankelEvaluation( _field, _matpoly, H, _deg+_colblock-1);
+					BlockHankelEvaluation( field(), _matpoly, H, _deg+_colblock-1);
 				}
 				break;
 			case BlockHankelTag::low :
@@ -263,7 +262,7 @@ namespace LinBox
 					_row   = _rowblock*_block;
 					_col   = _row;
 					_shape = s;
-					BlockHankelEvaluation( _field, _matpoly, H, _deg+_colblock-1);
+					BlockHankelEvaluation( field(), _matpoly, H, _deg+_colblock-1);
 				}
 				break;
 			}
@@ -277,18 +276,16 @@ namespace LinBox
 
 			_vecpoly.resize(_numpoints, std::vector<Element>(_block));
 			_veclagrange.resize(_numpoints);
-			BHVectorLagrangeCoeff(_field, _veclagrange, _numpoints);
+			BHVectorLagrangeCoeff(field(), _veclagrange, _numpoints);
 
 
-			_vander     = BlasMatrix<Element> (_numpoints,_numpoints);
-			_inv_vander = BlasMatrix<Element> (_numpoints,_numpoints);
+			_vander     = BlasMatrix<Field> (_field,_numpoints,_numpoints);
+			_inv_vander = BlasMatrix<Field> (_field,_numpoints,_numpoints);
 
 			std::vector<Element> points(_numpoints);
-			Element one;
-			F.init(one,1);
 			for (size_t i=0;i<_numpoints;++i){
 				F.init(points[i],i);
-				_vander.setEntry(i,0, one);
+				_vander.setEntry(i,0, F.one);
 			}
 
 
@@ -301,15 +298,16 @@ namespace LinBox
 
 			_BMD.inv(_inv_vander, _vander);
 
-			_partial_vander= BlasMatrix<Element> (_vander, 0, 0, _numpoints, _colblock);
+			//! @warning memory wasted
+			_partial_vander= BlasMatrix<Field> (_vander, 0, 0, _numpoints, _colblock);
 			size_t shift=_colblock-1;
 			if ( _shape == BlockHankelTag::up)
 				shift=0;
 
-			_partial_inv_vander= BlasMatrix<Element> (_inv_vander, shift, 0, _colblock, _numpoints);
+			_partial_inv_vander= BlasMatrix<Field> (_inv_vander, shift, 0, _colblock, _numpoints);
 
-			_x = BlasMatrix<Element> (_numpoints, _block);
-			_y = BlasMatrix<Element> (_colblock, _block);
+			_x = BlasMatrix<Field> (_field,_numpoints, _block);
+			_y = BlasMatrix<Field> (_field,_colblock, _block);
 
 
 			_Tapply.clear();
@@ -321,6 +319,14 @@ namespace LinBox
 		BlockHankel (const BlockHankel<Field> &H) :
 			_field(H._field()), _matpoly (H._matpoly), _deg(H._deg),
 			_row(H._row), _col(H._col), _rowblock(H._rowblock), _colblock(H._colblock), _block(H._block), _shape(H._shape)
+			// dummy defaults
+			,_vander(BlasMatrix<Field>(*_field))
+			,_partial_vander(BlasMatrix<Field>(*_field))
+			,_inv_vander(BlasMatrix<Field>(*_field))
+			,_partial_inv_vander(BlasMatrix<Field>(*_field))
+			,_y(BlasMatrix<Field>(*_field))
+			,_x(BlasMatrix<Field>(*_field))
+			,_numpoints(0)
 		{}
 
 		// get the column dimension
@@ -329,6 +335,8 @@ namespace LinBox
 		// get the row dimension
 		size_t rowdim() const {return _row;}
 
+		const Field& field() const { return *_field;}
+
 		// get the block dimension
 		size_t blockdim() const {return _block;}
 
@@ -339,13 +347,13 @@ namespace LinBox
 		{
 			linbox_check(this->_coldim == y.size());
 			linbox_check(this->_rowdim == x.size());
-			BlasMatrixDomain<Field> BMD(_field);
+			BlasMatrixDomain<Field> BMD(field());
 #ifdef BHANKEL_TIMER
 			_chrono.clear();
 			_chrono.start();
 #endif
 			// evaluation of the vector seen as a vector polynomial in
-			//BHVectorEvaluation(_field, _vecpoly, y, _block);
+			//BHVectorEvaluation(field(), _vecpoly, y, _block);
 
 			for (size_t i=0;i<_colblock;++i)
 				for (size_t j=0;j<_block;++j)
@@ -355,7 +363,7 @@ namespace LinBox
 
 			for (size_t i=0;i<_numpoints;++i){
 				for (size_t j=0;j<_block; ++j)
-					_field.assign(_vecpoly[i][j], _x.getEntry(i,j));
+					field().assign(_vecpoly[i][j], _x.getEntry(i,j));
 			}
 #ifdef BHANKEL_TIMER
 			_chrono.stop();
@@ -381,7 +389,7 @@ namespace LinBox
 				shift=0;
 
 			// interpolation to get the result vector
-			BHVectorInterpolation(_field, x, x_vecpoly, _veclagrange, shift);
+			BHVectorInterpolation(field(), x, x_vecpoly, _veclagrange, shift);
 #endif
 			for (size_t i=0;i<_numpoints;++i)
 				for (size_t j=0;j<_block;++j)
@@ -391,7 +399,7 @@ namespace LinBox
 
 			for (size_t i=0;i<_colblock;++i)
 				for (size_t j=0;j<_block;++j)
-					_field.assign( x[x.size() - (i+1)*_block +j], _y.getEntry(i,j));
+					field().assign( x[x.size() - (i+1)*_block +j], _y.getEntry(i,j));
 
 #ifdef BHANKEL_TIMER
 			_chrono.stop();
@@ -412,16 +420,16 @@ namespace LinBox
 		}
 
 	private:
-		Field  _field;
-		std::vector<BlasMatrix<Element> >                _matpoly;
+		const Field  *_field;
+		std::vector<BlasMatrix<Field> >                _matpoly;
 		mutable std::vector<std::vector<Element> >       _vecpoly;
 		std::vector<std::vector<Element> >           _veclagrange;
-		BlasMatrix<Element>                               _vander;
-		BlasMatrix<Element>                       _partial_vander;
-		BlasMatrix<Element>                           _inv_vander;
-		BlasMatrix<Element>                   _partial_inv_vander;
-		mutable BlasMatrix<Element>                            _y;
-		mutable BlasMatrix<Element>                            _x;
+		BlasMatrix<Field>                               _vander;
+		BlasMatrix<Field>                       _partial_vander;
+		BlasMatrix<Field>                           _inv_vander;
+		BlasMatrix<Field>                   _partial_inv_vander;
+		mutable BlasMatrix<Field>                            _y;
+		mutable BlasMatrix<Field>                            _x;
 		BlasMatrixDomain<Field>                              _BMD;
 		size_t _deg;
 		size_t _row;
diff --git a/linbox/blackbox/block-toeplitz.h b/linbox/blackbox/block-toeplitz.h
index b546534..e249926 100644
--- a/linbox/blackbox/block-toeplitz.h
+++ b/linbox/blackbox/block-toeplitz.h
@@ -26,12 +26,14 @@
 #define __LINBOX_block_toeplitz_H
 
 #include <vector>
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
 #include "linbox/vector/vector-domain.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
 #include "linbox/util/debug.h"
 #include "linbox/blackbox/block-hankel.h"
 
+THIS_CODE_MAY_NOT_COMPILE_AND_IS_NOT_TESTED
+
 namespace LinBox
 {
 
diff --git a/linbox/blackbox/butterfly.h b/linbox/blackbox/butterfly.h
index 6c16a06..a444fe1 100644
--- a/linbox/blackbox/butterfly.h
+++ b/linbox/blackbox/butterfly.h
@@ -46,16 +46,30 @@
 #ifndef __LINBOX_butterfly_H
 #define __LINBOX_butterfly_H
 
-#include <vector>
 #include "linbox/blackbox/blackbox-interface.h"
+#include "linbox/vector/vector-domain.h"
 
 /*! @file blackbox/butterfly.h
 */
 
-// Namespace in which all LinBox library code resides
 namespace LinBox
 {
 
+
+	/** The default butterfly switch object.
+	 *
+	 * This is a predicate object that is applied
+	 * to two elements to switch them as needed
+	 * by the \ref Butterfly\ Switching\ Network\ BlackBox\ Matrix\ Object
+	 * following the exchange matrix introduced in "Efficient Matrix
+	 * Preconditioners for Black Box Linear Algebra" by Chen, Eberly,
+	 * Kaltofen, Saunders, Turner, and Villard.
+	 */
+	template <class Field> class CekstvSwitch ;
+
+	/// Alternate butterfly switch object for testing.
+	class BooleanSwitch;
+
 	/** @name Butterfly
 	 * @brief Butterfly preconditioner and supporting function
 	 */
@@ -78,7 +92,7 @@ namespace LinBox
 	 * @param Switch switch object type
 	 \ingroup blackbox
 	 */
-	template <class _Field, class Switch>
+	template <class _Field, class Switch = CekstvSwitch<_Field>>
 	class Butterfly : public BlackboxInterface {
 	public:
 		typedef _Field Field;
@@ -88,7 +102,7 @@ namespace LinBox
 		/** No-Op Constructor
 		*/
 		Butterfly (const Field &F, size_t n) :
-			_field (F), _VD (F), _n (n)
+			_field (&F), _VD (F), _n (n)
 		{}
 
 
@@ -159,7 +173,7 @@ namespace LinBox
 
 				for( ; sit != A.switchesEnd(); ++sit) {
 					_Sw1 newsw;
-					typename Switch::template rebind<_Tp1>() (newsw, *sit, Ap.field(), A._field);
+					typename Switch::template rebind<_Tp1>() (newsw, *sit, Ap.field(), A.field());
 					Ap.switches().push_back( newsw );
 				}
 				//             Ap = new other(LAp);
@@ -168,7 +182,7 @@ namespace LinBox
 
 		template<typename _Tp1, typename _Sw1>
 		Butterfly (const Butterfly<_Tp1,_Sw1>& B, const Field &F) :
-			_field (F), _VD (F), _n (B.rowdim())
+			_field (&F), _VD (F), _n (B.rowdim())
 		{
 			typename Butterfly<_Tp1,_Sw1>::template rebind<Field>() (*this, B);
 		}
@@ -191,7 +205,7 @@ namespace LinBox
 		{ return _n; }
 
 		const Field& field() const
-		{return _field;}
+		{return *_field;}
 
 
 		// Required for rebind
@@ -216,7 +230,7 @@ namespace LinBox
 
 
 		// Field over which we are working
-		const Field _field;
+		const Field *_field;
 		VectorDomain<Field> _VD;
 
 		// Number of rows and columns of square matrix.
@@ -239,132 +253,6 @@ namespace LinBox
 
 	}; // template <class Field, class Vector> class Butterfly
 
-	// Implementation of methods
-
-	template <class Field, class Switch>
-	inline Butterfly<Field, Switch>::Butterfly (const Field &F, size_t n, typename Switch::Factory &factory) :
-		_field (F), _VD (F), _n (n)
-	{
-		buildIndices ();
-
-		for (unsigned int i = 0; i < _indices.size (); ++i)
-			_switches.push_back (factory.makeSwitch ());
-	}
-
-	template <class Field, class Switch>
-	template<class OutVector, class InVector>
-	inline OutVector& Butterfly<Field, Switch>::apply (OutVector& y, const InVector& x) const
-	{
-		std::vector< std::pair<size_t, size_t> >::const_iterator idx_iter = _indices.begin ();
-		typename std::vector<Switch>::const_iterator switch_iter = _switches.begin ();
-
-		_VD.copy (y, x);
-
-		for (; idx_iter != _indices.end (); ++idx_iter, ++switch_iter)
-			switch_iter->apply (_field, y[idx_iter->first], y[idx_iter->second]);
-
-		return y;
-	}
-
-	template <class Field, class Switch>
-	template <class OutVector, class InVector>
-	inline OutVector& Butterfly<Field, Switch>::applyTranspose (OutVector& y, const InVector& x) const
-	{
-		std::vector< std::pair<size_t, size_t> >::const_reverse_iterator idx_iter = _indices.rbegin ();
-		typename std::vector<Switch>::const_reverse_iterator switch_iter = _switches.rbegin ();
-
-		_VD.copy (y, x);
-
-		for (; idx_iter != _indices.rend (); ++idx_iter, ++switch_iter)
-			switch_iter->applyTranspose (_field, y[idx_iter->first], y[idx_iter->second]);
-
-		return y;
-	}
-
-	template <class Field, class Switch>
-	void Butterfly<Field, Switch>::buildIndices ()
-	{
-		for (size_t value (_n), l_p (0), n_p (1);
-		     n_p != 0;
-		     value >>= 1, l_p++, n_p <<= 1)
-		{
-			if (value & 1) {
-				_l_vec.push_back (l_p);
-				_n_vec.push_back (n_p);
-			}
-		}
-
-		// Create vector of indices to switch
-		size_t n_p, l_p;   	// size of group and number of levels in group
-		size_t level (0), difference (1);	// track levels done for powers of 2
-
-		// Vector containing indices for last level of last power of 2.
-		std::vector< std::pair< size_t, size_t > > p_ind;
-
-		// Vector and iterator used for computing p_ind.
-		std::vector< std::pair< size_t, size_t > > temp_ind;
-		std::vector< std::pair< size_t, size_t > >::iterator iter;
-
-		// Loop over sub-groups of powers of two
-		for (size_t p (0), start_index (0);
-		     p < _n_vec.size ();
-		     p++, start_index += n_p)
-		{
-			// update size
-			n_p = _n_vec[p];
-			l_p = _l_vec[p];
-
-			// loop over levels of sub-group network
-			for ( ; level < l_p; level++, difference <<= 1) {
-				// Create
-				temp_ind = p_ind;
-
-				// the second sub group is a shift of the first
-				for (iter = temp_ind.begin (); iter != temp_ind.end (); iter++) {
-					iter->first += difference;
-					iter->second += difference;
-				}
-
-				// add the second group to the first
-				p_ind.insert (p_ind.end (), temp_ind.begin (), temp_ind.end ());
-
-				// add switches to mix the two sub groups
-				temp_ind = std::vector< std::pair<size_t, size_t> >
-				(difference, std::pair<size_t, size_t> (0, 0));
-
-				size_t i = 0;
-				for (iter = temp_ind.begin (); iter != temp_ind.end (); i++, iter++) {
-					iter->first += i;
-					iter->second += i + difference;
-				}
-
-				// add the combining group to the first and second
-				p_ind.insert (p_ind.end (), temp_ind.begin (), temp_ind.end ());
-			}
-
-			// Add this level to total list of indices and correct starting point
-			temp_ind = p_ind;
-
-			for (iter = temp_ind.begin (); iter != temp_ind.end (); iter++) {
-				iter->first += start_index;
-				iter->second += start_index;
-			}
-
-			_indices.insert (_indices.end (), temp_ind.begin (), temp_ind.end ());
-
-			// Combine everything so far
-			temp_ind = std::vector< std::pair<size_t, size_t> > (start_index, std::pair<size_t, size_t> (0, 0));
-
-			iter = temp_ind.begin ();
-			for (size_t index = 0; index < start_index; index++, iter++) {
-				iter->first = index;
-				iter->second += index + n_p;
-			}
-
-			_indices.insert (_indices.end (), temp_ind.begin (), temp_ind.end ());
-		}
-	}
-
 	/** A function used with Butterfly Blackbox Matrices.
 	 * This function takes an STL vector x of booleans, and returns
 	 * a vector y of booleans such that setting the switches marked
@@ -384,328 +272,12 @@ namespace LinBox
 	 * @param j offset of contiguous block
 	 */
 	inline std::vector<bool> setButterfly (const std::vector<bool>& x,
-					       size_t j = 0)
-	{
-		size_t n = x.size ();
-
-		commentator().start ("Setting butterfly switches", "setButterfly");
-
-		std::ostream &report = commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION);
+					       size_t j = 0);
 
-		report << "Called set switches with vector of size " << n
-		<< " and offset " << j << std::endl;
-
-		// return empty vector if zero or one elements in x because
-		// no switching will be done.
-		if (x.size () <= 1) {
-			commentator().indent (report);
-			report << "No switches needed. Returning with empty vector." << std::endl;
-
-			commentator().stop ("done");
-			return std::vector<bool> ();
-		}
-
-		commentator().indent (report);
-		report << "Counting the number of switches that exist." << std::endl;
-
-		// break inputs into groups of size powers of 2.
-		// calculate size of groups, and powers of 2 that give sizes
-		// store these values in vectors n and l, respectively
-		std::vector<size_t> l_vec, n_vec;
-
-		for (size_t value (n), l_p (0), n_p (1);
-		     n_p != 0;
-		     value >>= 1, l_p++, n_p <<= 1)
-		{
-			commentator().indent (report);
-			report << "  looping at value = " << value
-			<< ", l_p = " << l_p
-			<< ", n_p = " << n_p << std::endl;
-
-			if (value & 1) {
-				l_vec.push_back (l_p);
-				n_vec.push_back (n_p);
-
-				commentator().indent (report);
-				report << "    inserted value = " << value
-				<< ", l_p = " << l_p
-				<< ", n_p = " << n_p << std::endl;
-			}
-		}
-
-		// Calculate total number of switches required
-		size_t s (0);
-
-		for (size_t ii = 0; ii < n_vec.size (); ii++)
-			s += n_vec[ii] * l_vec[ii] / 2;
-
-		for (size_t ii = 0; ii < n_vec.size () - 1; ii++)
-			for (size_t jj = 0; jj <= ii; jj++)
-				s += n_vec[jj];
-
-		commentator().indent (report);
-		report << "There are a total of " << s << " switches" << std::endl;
-
-		// Set largest power of 2 in decomposition of n = x.size ()
-		size_t n_p (*n_vec.rbegin ());
-
-		commentator().indent (report);
-		report << "Found largest power of 2 in decomposition of " << n
-		<< " as n_p = " << n_p << std::endl;
-
-		if ( (n != n_p) && (j != 0) ) {
-			commentator().indent (report);
-			report << "Non-zero offset " << j
-			<< " used with non-power size."
-			<< "Offset reset to zero." << std::endl;
-
-			j = 0;
-		}
-		else
-			j %= n;
-
-		if (n == n_p) {
-			n_p /= 2;	  // >> is not portable!
-
-			commentator().indent (report);
-			report << "n = " << n << " is a power of two.  "
-			<< "Resetting n_p to be half of n: n_p = " << n_p << std::endl;
-		}
-
-		// count true elements not in largest power of 2 block
-		size_t r_1(0);
-
-		for (std::vector<bool>::const_iterator iter = x.begin ();
-		     iter != x.begin () + (n - n_p);
-		     iter++)
-			if (*iter) r_1++;
-
-		// count total number of true elements in x.
-		size_t r (r_1);
-
-		for (std::vector<bool>::const_iterator iter = x.begin () + (n - n_p);
-		     iter != x.end ();
-		     iter++)
-			if (*iter) r++;
-
-		commentator().indent (report);
-		report << "The vector x will be broken into two sub-vectors,"
-		<< "x_1 = x[0,...," << n - n_p - 1 << "] and x_2 = x["
-		<< n - n_p << ",...," << n - 1 << "]."
-		<< "There are a total of " << r << " true Elements in x, "
-		<< r_1 << " of which occured in the first sub-vector."
-		<< "The output vector will have " << s << " entries and will"
-		<< "switch the true Elements of x into a contiguous block"
-		<< "[" << j << "," << j + r
-		<< ") = [" << j << "," << j + r - 1<< "]." << std::endl;
-
-		if (r == 0) {
-			commentator().indent (report);
-			report << "There are no true Elements in x, so the recursion is"
-			<< "being broken and a vector of false flags returned." << std::endl;
-
-			commentator().stop ("done");
-			return std::vector<bool> (s, false);
-		}
-		else if (r == n) {
-			commentator().indent (report);
-			report << "There are no false Elements in x, so the recursion is"
-			<< "being broken and a vector of false flags returned." << std::endl;
-
-			commentator().stop ("done");
-			return std::vector<bool> (s, false);
-		}
-
-		// Calculate where the true elements are supposed to end up
-		// Here, they will be in a contiguous block starting after the
-		// offset.  s_1 are the true elements after the offset and in the first
-		// sub-group, s_2 are the ones in the second sub group, and s_3 are the
-		// elements that wrap around to the beginning.  s_1 and s_3 cannot both
-		// be non-zero unless s_2 == n_p.  (I.e., the second group is full.)
-		// Also, because for n != 2 n_p the offset is zero, in that case
-		// s_3 must be zero.  Any of them may be zero if the corrsponding block
-		// is empty.
-		// s_2 is only used for tracing the program, so it is not always computed.
-
-		size_t s_1;
-
-		if (j < n - n_p) {
-			if (j + r < n - n_p)
-				s_1 = r;
-			else
-				s_1 = n - n_p - j;
-		}
-		else
-			s_1 = 0;
-
-		size_t s_2 = 0;
-
-		if (commentator().isPrinted (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)) {
-			if (j + r < n - n_p)
-				s_2 = 0;
-			else {
-				if (j + r < n)
-					s_2 = j + r;
-				else
-					s_2 = n;
-
-				if (j < n - n_p)
-					s_2 -= (n - n_p);
-				else
-					s_2 -= j;
-			}
-		}
-
-		size_t s_3 = ((j + r) > n) ? j + r - n : 0;
-
-		commentator().indent (report);
-		report << "The number of Elements in each of the three blocks of "
-		<< "true Elements in the end result are"
-		<< "s_1 = " << s_1
-		<< ", s_2 = " << s_2
-		<< ", and s_3 = " << s_3 << "." << std::endl;
-
-		// Create empty vector for output. y_temp is used to retrieve output
-		// from recursion before inserting into output.
-		std::vector<bool> y_1, y_2, y_3 = std::vector<bool> (n - n_p, false);
-
-		if ((s_1 + s_3) == r_1) {
-			commentator().indent (report);
-			report << "Case I: s_1 + s_3 == r_1 and s_2 == r - r_1."
-			<< "No Elements are moved between the two sub-vectors." << std::endl;
-
-			if (j < (n - n_p)) {
-				commentator().indent (report);
-				report << "  A: j < (n - n_p).  j_1 = j = " << j << ", j_2 = 0";
-
-				y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () + (n - n_p)), j);
-				y_2 = setButterfly (std::vector<bool>(x.begin () + (n - n_p), x.end ()), 0);
-
-			}
-			else {
-				commentator().indent (report);
-				report << "  A: j >= (n - n_p).  j_1 = 0, j_2 = j - (n - n_p) = "
-				<< j - (n - n_p) << std::endl;
-
-				// This case cannot occur for n != 2*n_p because j != 0
-
-				y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () + (n - n_p)), 0);
-				y_2 = setButterfly (std::vector<bool>(x.begin () + (n - n_p), x.end ()), j - (n - n_p));
-			}
-		}
-		else if ((s_1 + s_3) > r_1) {
-			commentator().indent (report);
-			report << "Case II: s_1 + s_3 > r_1 and s_2 < r - r_1."
-			<< "Elements are moved from the right sub-vector to the left." << std::endl;
-
-			// This means that s_2 < n_p, so either s_1 = 0 or s_3 = 0 (or both).
-
-			if (j < (n - n_p)) {
-				commentator().indent (report);
-				report << "  A: j < (n - n_p).  j_1 = j, j_2 = 2*n_p + j + r_1 - n = "
-				<< 2*n_p + j + r_1 - n << std::endl;
-
-				// In this case, s_1 > 0, so s_3 = 0, and wrap-around cannot occur.
-
-				y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () + (n - n_p)), j);
-				y_2 = setButterfly (std::vector<bool>(x.begin () + (n - n_p), x.end ()), 2*n_p + j + r_1 - n);
-
-				for (std::vector<bool>::iterator iter = (y_3.begin () + (j + r_1));
-				     iter != (y_3.begin () + (n - n_p));
-				     iter++)
-					*iter = true;
-			}
-			else {
-				commentator().indent (report);
-				report << "  A: j >= (n - n_p).  j_1 = j + r - n - r_1 = "
-				<< j + r - n - r_1 << ", j_2 = j - (n - n_p) = "
-				<< j - (n - n_p) << std::endl;
-
-				// In this case, s_1 = 0, so s_3 >= 0, and wrap-around may occur.
-				// This case cannot occur for n != 2*n_p because j != 0.
-
-				y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () + (n - n_p)), j + r - n - r_1);
-				y_2 = setButterfly (std::vector<bool>(x.begin () + (n - n_p), x.end ()), j - (n - n_p));
-
-				for (std::vector<bool>::iterator iter = y_3.begin ();
-				     iter != (y_3.begin () + (j + r - n - r_1));
-				     iter++)
-					*iter = true;
-			}
-		}
-		else if ((s_1 + s_3) < r_1) {
-			commentator().indent (report);
-			report << "Case III: s_1 + s_3 < r_1 and s_2 > r - r_1."
-			<< "Elements are moved from the left sub-vector to the right." << std::endl;
-
-			// This case also means that s_1 + s_3 < n - n_p, or the contiguous
-			// block cannot encompass the entire first sub-vector.  For this
-			// reason, this case is not considered when n != 2*n_p (when j = 0).
-
-			if (j < (n - n_p)) {
-				commentator().indent (report);
-				report << "  A: j < (n - n_p).  j_1 = j = " << j
-				<< ", j_2 = j + r_1 - n + n_p = " << j + r_1 - n + n_p << std::endl;
-				// In this case, s_1 > 0, so s_3 = 0, and wrap-around cannot occur.
-
-				y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () + (n - n_p)), j);
-				y_2 = setButterfly (std::vector<bool>(x.begin () + (n - n_p), x.end ()), j + r_1 - n + n_p);
-
-				for (std::vector<bool>::iterator iter = (y_3.begin () + s_3);
-				     iter != (y_3.begin () + (j + r_1 - n + n_p));
-				     iter++)
-					*iter = true;
-			}
-			else {
-				commentator().indent (report);
-				report << "  A: j >= (n - n_p).  j_1 = j + r - n_p - r_1 = "
-				<< j + r - n_p - r_1 << ", j_2 = j - (n - n_p) = "
-				<< j - (n - n_p) << std::endl;
-
-				// In this case, s_1 = 0, so s_3 >= 0, and wrap-around may occur.
-				// This case cannot occur for n != 2*n_p because j != 0.
-
-				y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () + (n - n_p)), j + r - n_p - r_1);
-				y_2 = setButterfly (std::vector<bool>(x.begin () + (n - n_p), x.end ()), j - (n - n_p));
-
-				for (std::vector<bool>::iterator iter (y_3.begin () + (j + r - n_p - r_1));
-				     iter != (y_3.begin () + (n - n_p));
-				     iter++)
-					*iter = true;
-			}
-		}
-
-		// Create output vector.
-		std::vector<bool> y (y_1);
-		y.insert (y.end (), y_2.begin (), y_2.end ());
-		y.insert (y.end (), y_3.begin (), y_3.end ());
-
-		commentator().indent (report);
-		report << "The output vector for n = " << n << " has " << y.size ()
-		<< " entries."
-		<< "  " << y_1.size () << " from the first sub-vector"
-		<< "  " << y_2.size () << " from the second sub-vector"
-		<< "  " << y_3.size () << " from recombining the two"
-		<< "And the output vector y is:"
-		<< "-------------------------- " << std::endl;
-
-		for (size_t i = 0; i < y.size (); i++) {
-			commentator().indent (report);
-			report << "  " << i << ": " << y[i] << std::endl;
-		}
-
-		commentator().indent (report);
-		report << "-------------------------- " << std::endl;
-
-		commentator().stop ("done");
-
-		return y;
-
-	} // std::vector<bool> setButterfly (const std::vector<bool>& x, size_t j)
-
-	//@}
 } // namespace LinBox
 
+#include "butterfly.inl"
+
 #endif // __LINBOX_butterfly_H
 
 
diff --git a/linbox/blackbox/butterfly.inl b/linbox/blackbox/butterfly.inl
new file mode 100644
index 0000000..df97e6f
--- /dev/null
+++ b/linbox/blackbox/butterfly.inl
@@ -0,0 +1,845 @@
+/* linbox/blackbox/butterfly.inl
+ * Copyright (C) 1999-2001 William J Turner,
+ *               2001 Bradford Hovinen
+                 2015 reorg bds
+ *
+ * Written by William J Turner <wjturner at math.ncsu.edu>,
+ *            Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * -----------------------------------------------------------
+ * 2002-09-26  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
+ *
+ * Refactoring: The switch object now only contains the information necessary
+ * for a single 2x2 block. The butterfly black box maintains a vector of switch
+ * objects that it keeps in parallel with its vector of indices. There is a new
+ * lightweight class, called a SwitchFactory, that constructs switches on the
+ * fly. It is defined individually for each switch type, and a instance thereof
+ * is passed to the butterfly, which then uses it to construct its vector.
+ *
+ * This eliminates two problems: first, because switch objects are constructed
+ * by the butterfly itself, there is no need to know a priori the length of the
+ * vector of indices. Second, the switch object itself becomes simpler, as it
+ * need only be responsible for a single 2x2 block.
+ *
+ * -----------------------------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *
+ */
+
+#ifndef __LINBOX_butterfly_INL
+#define __LINBOX_butterfly_INL
+
+#include <vector>
+#include "linbox/blackbox/blackbox-interface.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/field/hom.h"
+
+/** @file blackbox/butterfly.inl
+ *
+ * First linbox block: butterfly method implementations
+ * Second LinBox block: butterfly switch and switch factory impls.
+ *
+ */
+namespace LinBox
+{
+	// Implementation of Butterfly methods
+
+	template <class Field, class Switch>
+	inline Butterfly<Field, Switch>::Butterfly (const Field &F, size_t n, typename Switch::Factory &factory) :
+		_field (&F), _VD (F), _n (n)
+	{
+		buildIndices ();
+
+		for (unsigned int i = 0; i < _indices.size (); ++i)
+			_switches.push_back (factory.makeSwitch ());
+	}
+
+	template <class Field, class Switch>
+	template<class OutVector, class InVector>
+	inline OutVector& Butterfly<Field, Switch>::apply (OutVector& y, const InVector& x) const
+	{
+		std::vector< std::pair<size_t, size_t> >::const_iterator idx_iter = _indices.begin ();
+		typename std::vector<Switch>::const_iterator switch_iter = _switches.begin ();
+
+		_VD.copy (y, x);
+
+		for (; idx_iter != _indices.end (); ++idx_iter, ++switch_iter)
+			switch_iter->apply (field(), y[idx_iter->first], y[idx_iter->second]);
+
+		return y;
+	}
+
+	template <class Field, class Switch>
+	template <class OutVector, class InVector>
+	inline OutVector& Butterfly<Field, Switch>::applyTranspose (OutVector& y, const InVector& x) const
+	{
+		std::vector< std::pair<size_t, size_t> >::const_reverse_iterator idx_iter = _indices.rbegin ();
+		typename std::vector<Switch>::const_reverse_iterator switch_iter = _switches.rbegin ();
+
+		_VD.copy (y, x);
+
+		for (; idx_iter != _indices.rend (); ++idx_iter, ++switch_iter)
+			switch_iter->applyTranspose (field(), y[idx_iter->first], y[idx_iter->second]);
+
+		return y;
+	}
+
+	template <class Field, class Switch>
+	void Butterfly<Field, Switch>::buildIndices ()
+	{
+		for (size_t value (_n), l_p (0), n_p (1);
+		     n_p != 0;
+		     value >>= 1, ++l_p, n_p <<= 1)
+		{
+			if (value & 1) {
+				_l_vec.push_back (l_p);
+				_n_vec.push_back (n_p);
+			}
+		}
+
+		// Create vector of indices to switch
+		size_t n_p ;   	// size of group and number of levels in group
+		size_t level (0), difference (1);	// track levels done for powers of 2
+
+		// Vector containing indices for last level of last power of 2.
+		std::vector< std::pair< size_t, size_t > > p_ind;
+
+		// Vector and iterator used for computing p_ind.
+		std::vector< std::pair< size_t, size_t > > temp_ind;
+		std::vector< std::pair< size_t, size_t > >::iterator iter;
+
+		// Loop over sub-groups of powers of two
+		for (size_t p (0), start_index (0);
+		     p < _n_vec.size ();
+		     ++p, start_index += n_p)
+		{
+			// update size
+			n_p = _n_vec[p];
+			size_t l_p = _l_vec[p];
+
+			// loop over levels of sub-group network
+			for ( ; level < l_p; ++level, difference <<= 1) {
+				// Create
+				temp_ind = p_ind;
+
+				// the second sub group is a shift of the first
+				for (iter = temp_ind.begin (); iter != temp_ind.end (); ++iter) {
+					iter->first += difference;
+					iter->second += difference;
+				}
+
+				// add the second group to the first
+				p_ind.insert (p_ind.end (), temp_ind.begin (), temp_ind.end ());
+
+				// add switches to mix the two sub groups
+				temp_ind = std::vector< std::pair<size_t, size_t> >
+				(difference, std::pair<size_t, size_t> (0, 0));
+
+				size_t i = 0;
+				for (iter = temp_ind.begin (); iter != temp_ind.end (); ++i, ++iter) {
+					iter->first += i;
+					iter->second += i + difference;
+				}
+
+				// add the combining group to the first and second
+				p_ind.insert (p_ind.end (), temp_ind.begin (), temp_ind.end ());
+			}
+
+			// Add this level to total list of indices and correct starting point
+			temp_ind = p_ind;
+
+			for (iter = temp_ind.begin (); iter != temp_ind.end (); ++iter) {
+				iter->first += start_index;
+				iter->second += start_index;
+			}
+
+			_indices.insert (_indices.end (), temp_ind.begin (), temp_ind.end ());
+
+			// Combine everything so far
+			temp_ind = std::vector< std::pair<size_t, size_t> > (start_index, std::pair<size_t, size_t> (0, 0));
+
+			iter = temp_ind.begin ();
+			for (size_t index = 0; index < start_index; ++index, ++iter) {
+				iter->first = index;
+				iter->second += index + n_p;
+			}
+
+			_indices.insert (_indices.end (), temp_ind.begin (), temp_ind.end ());
+		}
+	}
+
+	inline std::vector<bool> setButterfly (const std::vector<bool>& x,
+					       size_t j)
+	{
+		size_t n = x.size ();
+
+		commentator().start ("Setting butterfly switches", "setButterfly");
+
+		std::ostream &report = commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION);
+
+		report << "Called set switches with vector of size " << n
+		<< " and offset " << j << std::endl;
+
+		// return empty vector if zero or one elements in x because
+		// no switching will be done.
+		if (x.size () <= 1) {
+			commentator().indent (report);
+			report << "No switches needed. Returning with empty vector." << std::endl;
+
+			commentator().stop ("done");
+			return std::vector<bool> ();
+		}
+
+		commentator().indent (report);
+		report << "Counting the number of switches that exist." << std::endl;
+
+		// break inputs into groups of size powers of 2.
+		// calculate size of groups, and powers of 2 that give sizes
+		// store these values in vectors n and l, respectively
+		std::vector<size_t> l_vec, n_vec;
+
+		for (size_t value (n), l_p (0), n_p (1);
+		     n_p != 0;
+		     value >>= 1, ++l_p, n_p <<= 1)
+		{
+			commentator().indent (report);
+			report << "  looping at value = " << value
+			<< ", l_p = " << l_p
+			<< ", n_p = " << n_p << std::endl;
+
+			if (value & 1) {
+				l_vec.push_back (l_p);
+				n_vec.push_back (n_p);
+
+				commentator().indent (report);
+				report << "    inserted value = " << value
+				<< ", l_p = " << l_p
+				<< ", n_p = " << n_p << std::endl;
+			}
+		}
+
+		// Calculate total number of switches required
+		size_t s (0);
+
+		for (size_t ii = 0; ii < n_vec.size (); ++ii)
+			s += n_vec[ii] * l_vec[ii] / 2;
+
+		for (size_t ii = 0; ii < n_vec.size () - 1; ++ii)
+			for (size_t jj = 0; jj <= ii; ++jj)
+				s += n_vec[jj];
+
+		commentator().indent (report);
+		report << "There are a total of " << s << " switches" << std::endl;
+
+		// Set largest power of 2 in decomposition of n = x.size ()
+		size_t n_p (*n_vec.rbegin ());
+
+		commentator().indent (report);
+		report << "Found largest power of 2 in decomposition of " << n
+		<< " as n_p = " << n_p << std::endl;
+
+		if ( (n != n_p) && (j != 0) ) {
+			commentator().indent (report);
+			report << "Non-zero offset " << j
+			<< " used with non-power size."
+			<< "Offset reset to zero." << std::endl;
+
+			j = 0;
+		}
+		else
+			j %= n;
+
+		if (n == n_p) {
+			n_p /= 2;	  // >> is not portable!
+
+			commentator().indent (report);
+			report << "n = " << n << " is a power of two.  "
+			<< "Resetting n_p to be half of n: n_p = " << n_p << std::endl;
+		}
+
+		// count true elements not in largest power of 2 block
+		size_t r_1(0);
+
+		for (std::vector<bool>::const_iterator iter = x.begin ();
+		     iter != x.begin () + (ptrdiff_t)(n - n_p);
+		     ++iter)
+			if (*iter) ++r_1;
+
+		// count total number of true elements in x.
+		size_t r (r_1);
+
+		for (std::vector<bool>::const_iterator iter = x.begin () + (ptrdiff_t)(n - n_p);
+		     iter != x.end ();
+		     ++iter)
+			if (*iter) ++r;
+
+		commentator().indent (report);
+		report << "The vector x will be broken into two sub-vectors,"
+		<< "x_1 = x[0,...," << n - n_p - 1 << "] and x_2 = x["
+		<< n - n_p << ",...," << n - 1 << "]."
+		<< "There are a total of " << r << " true Elements in x, "
+		<< r_1 << " of which occured in the first sub-vector."
+		<< "The output vector will have " << s << " entries and will"
+		<< "switch the true Elements of x into a contiguous block"
+		<< "[" << j << "," << j + r
+		<< ") = [" << j << "," << j + r - 1<< "]." << std::endl;
+
+		if (r == 0) {
+			commentator().indent (report);
+			report << "There are no true Elements in x, so the recursion is"
+			<< "being broken and a vector of false flags returned." << std::endl;
+
+			commentator().stop ("done");
+			return std::vector<bool> (s, false);
+		}
+		else if (r == n) {
+			commentator().indent (report);
+			report << "There are no false Elements in x, so the recursion is"
+			<< "being broken and a vector of false flags returned." << std::endl;
+
+			commentator().stop ("done");
+			return std::vector<bool> (s, false);
+		}
+
+		// Calculate where the true elements are supposed to end up
+		// Here, they will be in a contiguous block starting after the
+		// offset.  s_1 are the true elements after the offset and in the first
+		// sub-group, s_2 are the ones in the second sub group, and s_3 are the
+		// elements that wrap around to the beginning.  s_1 and s_3 cannot both
+		// be non-zero unless s_2 == n_p.  (I.e., the second group is full.)
+		// Also, because for n != 2 n_p the offset is zero, in that case
+		// s_3 must be zero.  Any of them may be zero if the corrsponding block
+		// is empty.
+		// s_2 is only used for tracing the program, so it is not always computed.
+
+		size_t s_1;
+
+		if (j < n - n_p) {
+			if (j + r < n - n_p)
+				s_1 = r;
+			else
+				s_1 = n - n_p - j;
+		}
+		else
+			s_1 = 0;
+
+		size_t s_2 = 0;
+
+		if (commentator().isPrinted (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)) {
+			if (j + r < n - n_p)
+				s_2 = 0;
+			else {
+				if (j + r < n)
+					s_2 = j + r;
+				else
+					s_2 = n;
+
+				if (j < n - n_p)
+					s_2 -= (n - n_p);
+				else
+					s_2 -= j;
+			}
+		}
+
+		size_t s_3 = ((j + r) > n) ? j + r - n : 0;
+
+		commentator().indent (report);
+		report << "The number of Elements in each of the three blocks of "
+		<< "true Elements in the end result are"
+		<< "s_1 = " << s_1
+		<< ", s_2 = " << s_2
+		<< ", and s_3 = " << s_3 << "." << std::endl;
+
+		// Create empty vector for output. y_temp is used to retrieve output
+		// from recursion before inserting into output.
+		std::vector<bool> y_1, y_2, y_3 = std::vector<bool> (n - n_p, false);
+
+		if ((s_1 + s_3) == r_1) {
+			commentator().indent (report);
+			report << "Case I: s_1 + s_3 == r_1 and s_2 == r - r_1."
+			<< "No Elements are moved between the two sub-vectors." << std::endl;
+
+			if (j < (n - n_p)) {
+				commentator().indent (report);
+				report << "  A: j < (n - n_p).  j_1 = j = " << j << ", j_2 = 0";
+
+				y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () + (ptrdiff_t)(n - n_p)), j);
+				y_2 = setButterfly (std::vector<bool>(x.begin () + (ptrdiff_t)(n - n_p), x.end ()), 0);
+
+			}
+			else {
+				commentator().indent (report);
+				report << "  A: j >= (n - n_p).  j_1 = 0, j_2 = j - (n - n_p) = "
+				<< j - (n - n_p) << std::endl;
+
+				// This case cannot occur for n != 2*n_p because j != 0
+
+				y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () + (ptrdiff_t)(n - n_p)), 0);
+				y_2 = setButterfly (std::vector<bool>(x.begin () + (ptrdiff_t)(n - n_p), x.end ()), j - (n - n_p));
+			}
+		}
+		else if ((s_1 + s_3) > r_1) {
+			commentator().indent (report);
+			report << "Case II: s_1 + s_3 > r_1 and s_2 < r - r_1."
+			<< "Elements are moved from the right sub-vector to the left." << std::endl;
+
+			// This means that s_2 < n_p, so either s_1 = 0 or s_3 = 0 (or both).
+
+			if (j < (n - n_p)) {
+				commentator().indent (report);
+				report << "  A: j < (n - n_p).  j_1 = j, j_2 = 2*n_p + j + r_1 - n = "
+				<< 2*n_p + j + r_1 - n << std::endl;
+
+				// In this case, s_1 > 0, so s_3 = 0, and wrap-around cannot occur.
+
+				y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () + (ptrdiff_t)(n - n_p)), j);
+				y_2 = setButterfly (std::vector<bool>(x.begin () + (ptrdiff_t)(n - n_p), x.end ()), 2*n_p + j + r_1 - n);
+
+				for (std::vector<bool>::iterator iter = (y_3.begin () + (ptrdiff_t)(j + r_1));
+				     iter != (y_3.begin () + (ptrdiff_t)(n - n_p));
+				     ++iter)
+					*iter = true;
+			}
+			else {
+				commentator().indent (report);
+				report << "  A: j >= (n - n_p).  j_1 = j + r - n - r_1 = "
+				<< j + r - n - r_1 << ", j_2 = j - (n - n_p) = "
+				<< j - (n - n_p) << std::endl;
+
+				// In this case, s_1 = 0, so s_3 >= 0, and wrap-around may occur.
+				// This case cannot occur for n != 2*n_p because j != 0.
+
+				y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () + (ptrdiff_t)(n - n_p)), j + r - n - r_1);
+				y_2 = setButterfly (std::vector<bool>(x.begin () + (ptrdiff_t)(n - n_p), x.end ()), j - (n - n_p));
+
+				for (std::vector<bool>::iterator iter = y_3.begin ();
+				     iter != (y_3.begin () + (ptrdiff_t)(j + r - n - r_1));
+				     ++iter)
+					*iter = true;
+			}
+		}
+		else if ((s_1 + s_3) < r_1) {
+			commentator().indent (report);
+			report << "Case III: s_1 + s_3 < r_1 and s_2 > r - r_1."
+			<< "Elements are moved from the left sub-vector to the right." << std::endl;
+
+			// This case also means that s_1 + s_3 < n - n_p, or the contiguous
+			// block cannot encompass the entire first sub-vector.  For this
+			// reason, this case is not considered when n != 2*n_p (when j = 0).
+
+			if (j < (n - n_p)) {
+				commentator().indent (report);
+				report << "  A: j < (n - n_p).  j_1 = j = " << j
+				<< ", j_2 = j + r_1 - n + n_p = " << j + r_1 - n + n_p << std::endl;
+				// In this case, s_1 > 0, so s_3 = 0, and wrap-around cannot occur.
+
+				y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () +(ptrdiff_t) (n - n_p)), j);
+				y_2 = setButterfly (std::vector<bool>(x.begin () +(ptrdiff_t) (n - n_p), x.end ()), j + r_1 - n + n_p);
+
+				for (std::vector<bool>::iterator iter = (y_3.begin () +(ptrdiff_t) s_3);
+				     iter != (y_3.begin () + (ptrdiff_t)(j + r_1 - n + n_p));
+				     ++iter)
+					*iter = true;
+			}
+			else {
+				commentator().indent (report);
+				report << "  A: j >= (n - n_p).  j_1 = j + r - n_p - r_1 = "
+				<< j + r - n_p - r_1 << ", j_2 = j - (n - n_p) = "
+				<< j - (n - n_p) << std::endl;
+
+				// In this case, s_1 = 0, so s_3 >= 0, and wrap-around may occur.
+				// This case cannot occur for n != 2*n_p because j != 0.
+
+				y_1 = setButterfly (std::vector<bool>(x.begin (), x.begin () + (ptrdiff_t)(n - n_p)), j + r - n_p - r_1);
+				y_2 = setButterfly (std::vector<bool>(x.begin () + (ptrdiff_t)(n - n_p), x.end ()), j - (n - n_p));
+
+				for (std::vector<bool>::iterator iter (y_3.begin () + (ptrdiff_t)(j + r - n_p - r_1));
+				     iter != (y_3.begin () + (ptrdiff_t)(n - n_p));
+				     ++iter)
+					*iter = true;
+			}
+		}
+
+		// Create output vector.
+		std::vector<bool> y (y_1);
+		y.insert (y.end (), y_2.begin (), y_2.end ());
+		y.insert (y.end (), y_3.begin (), y_3.end ());
+
+		commentator().indent (report);
+		report << "The output vector for n = " << n << " has " << y.size ()
+		<< " entries."
+		<< "  " << y_1.size () << " from the first sub-vector"
+		<< "  " << y_2.size () << " from the second sub-vector"
+		<< "  " << y_3.size () << " from recombining the two"
+		<< "And the output vector y is:"
+		<< "-------------------------- " << std::endl;
+
+		for (size_t i = 0; i < y.size (); ++i) {
+			commentator().indent (report);
+			report << "  " << i << ": " << y[i] << std::endl;
+		}
+
+		commentator().indent (report);
+		report << "-------------------------- " << std::endl;
+
+		commentator().stop ("done");
+
+		return y;
+
+	} // std::vector<bool> setButterfly (const std::vector<bool>& x, size_t j)
+
+	//@}
+
+    // Begin cekstv switch
+
+	template <class Field> class CekstvSwitchFactory;
+
+	template <class Field>
+	class CekstvSwitch {
+	public:
+
+		/// Typedef
+		typedef typename Field::Element Element;
+		typedef CekstvSwitch<Field> Self_t;
+		typedef CekstvSwitchFactory<Field> Factory;
+
+		CekstvSwitch () {}
+
+		/** Constructor from a field and a field element.
+		 * @param a vector of switches
+		 */
+		CekstvSwitch (const typename Field::Element &a) :
+		       	_a (a)
+		{}
+
+		/** Destructor.
+		*/
+		~CekstvSwitch () {}
+
+		/** Apply switch function.
+		 * Switches the elements in references according to the
+		 * exchange matrix introduced in "Efficient Matrix
+		 * Preconditioners for Black Box Linear Algebra" by Chen, Eberly,
+		 * Kaltofen, Saunders, Turner, and Villard and the current field element
+		 * specified in the switch object.
+		 * @return bool true if swapped, false otherwise
+		 * @param F
+		 * @param x reference to first element to be switched
+		 * @param y reference to second element to be switched
+		 */
+		bool apply (const Field &F, Element &x, Element &y) const;
+
+		/** Apply switch transpose function.
+		 * Switches the elements in references according to the
+		 * transpose of the exchange matrix introduced in "Efficient Matrix
+		 * Preconditioners for Black Box Linear Algebra" by Chen, Eberly,
+		 * Kaltofen, Saunders, Turner, and Villard and the current field element
+		 * specified in the switch object.
+		 * @return bool true if swapped, false otherwise
+		 * @param F
+		 * @param x reference to first element to be switched
+		 * @param y reference to second element to be switched
+		 */
+		bool applyTranspose (const Field &F, Element &x, Element &y) const;
+
+
+		template<typename _Tp1>
+		struct rebind
+		{
+			typedef CekstvSwitch<_Tp1> other;
+
+			// special rebind operator() with two fields,
+			// indeed local field is not stored in the switch
+			void operator() (other & Ap, const Self_t& A, const _Tp1& T, const Field& F) {
+				Hom<Field, _Tp1>(F,T).image(Ap.getData(), A.getData());
+			}
+		};
+
+		typename Field::Element& getData() { return _a; }
+		const typename Field::Element& getData() const { return _a; }
+
+
+	private:
+
+		// Parameter of this 2x2 block
+		typename Field::Element _a;
+	};
+
+	template <class Field>
+	class CekstvSwitchFactory {
+	public:
+		/** Constructor from an STL vector of bools
+		*/
+		CekstvSwitchFactory (typename Field::RandIter r) :
+		       	_r (r)
+		{}
+
+		/** Construct and return a boolean switch object
+		*/
+		CekstvSwitch<Field> makeSwitch ()
+		{ typename Field::Element a; return CekstvSwitch<Field> (_r.random (a)); }
+
+	private:
+
+		typename Field::RandIter _r;
+	};
+
+	template <class Field>
+	inline bool CekstvSwitch<Field>::apply (const Field             &F,
+						typename Field::Element &x,
+						typename Field::Element &y) const
+	{
+		F.axpyin (x, _a, y);
+		F.addin (y, x);
+
+		return true;
+	}
+
+	template <class Field>
+	inline bool CekstvSwitch<Field>::applyTranspose (const Field             &F,
+							 typename Field::Element &x,
+							 typename Field::Element &y) const
+	{
+		F.addin (x, y);
+		F.axpyin (y, _a, x);
+
+		return true;
+	}
+
+// End cekstv switch
+#if 0
+// Begin specialization of cekstv switch object
+	template <>
+	class CekstvSwitch<GF2>
+	{
+	public:
+		typedef GF2 Field;
+		/// Typedef
+		typedef Field::Element Element;
+		typedef CekstvSwitch<Field> Self_t;
+		typedef CekstvSwitchFactory<Field> Factory;
+
+		/** Constructor from a field and a field element.
+		 * @param F field in which arithmetic is done
+		 * @param switches vector of switches
+		 */
+		CekstvSwitch (const Field::Element &a) :
+			_a (a)
+		{}
+
+		~CekstvSwitch () {}
+
+		bool apply (const Field &F, Element &x, Element &y) const
+		{
+			F.axpyin (x, _a, y);
+			F.addin (y, x);
+			return true;
+		}
+
+		bool applyTranspose (const Field &F, Element &x, Element &y) const
+		{
+			F.addin (x, y);
+			F.axpyin (y, _a, x);
+			return true;
+		}
+
+		bool apply (const Field &F, stdBitReference x, stdBitReference y) const
+		{
+			F.axpyin (x, _a, y);
+			F.addin (y, x);
+			return true;
+		}
+
+		bool applyTranspose (const Field &F, stdBitReference x, stdBitReference y) const
+		{
+			F.addin (x, y);
+			F.axpyin (y, _a, x);
+			return true;
+		}
+
+		template<typename _Tp1>
+		struct rebind
+		{
+			typedef CekstvSwitch<_Tp1> other;
+
+			// special rebind operator() with two fields,
+			// indeed local field is not stored in the switch
+			void operator() (other *& Ap, const Self_t& A, const _Tp1& T, const Field& F) {
+				typename _Tp1::Element u;
+				Hom<Field, _Tp1>(F,T).image(u, A._a);
+				Ap = new other(u);
+			}
+		};
+
+
+	private:
+
+		// Parameter of this 2x2 block
+		Field::Element _a;
+	};
+
+
+// End, specialization of cekstv switch object
+#endif
+// Begin boolean switch
+
+	class BooleanSwitchFactory;
+
+	/** Boolean switch object.
+	 * This is a switch predicate object that is applied
+	 * to two references to elements to switch them as needed
+	 * by the \ref Butterfly\ Switching\ Network\ BlackBox\ Matrix\ Object.
+	 */
+	class BooleanSwitch {
+	public:
+
+		typedef BooleanSwitch Self_t;
+		typedef BooleanSwitchFactory Factory;
+
+		/** Constructor from an STL vector of booleans.
+		 * The switch is applied using the vector of booleans.
+		 * A true value means to swap the two elements, and a false
+		 * value means not to.
+		 * The apply function starts at the beginning of the vector moving
+		 * forward through it, and applyTranspose function starts at the end
+		 * moving backwards.  Both repeat the vector after they pass through it.
+		 * @param s vector of switches
+		 */
+		BooleanSwitch (const bool s) :
+		       	_s (s)
+		{}
+
+		/** Destructor.
+		*/
+		~BooleanSwitch () {}
+
+		/** Apply switch function.
+		 * Switches the elements in references according to current boolean
+		 * value.  Swaps the elements if boolean is true, otherwise does nothing.
+		 * It is templatized by the element type to be swapped.
+		 * @return bool \c true if swapped, \c false otherwise
+		 * @param F
+		 * @param x reference to first element to be switched
+		 * @param y reference to second element to be switched
+		 */
+		template <class Field>
+		bool apply (const Field             &F,
+			    typename Field::Element &x,
+			    typename Field::Element &y) const;
+
+		/** Apply switch transpose function.
+		 * Switches the elements in references according to current boolean
+		 * value.  Swaps the elements if boolean is true, otherwise does nothing.
+		 * It is templatized by the element type to be swapped.
+		 * @return bool \c true if swapped, \c false otherwise
+		 * @param F
+		 * @param x reference to first element to be switched
+		 * @param y reference to second element to be switched
+		 */
+		template <class Field>
+		bool applyTranspose (const Field             &F,
+				     typename Field::Element &x,
+				     typename Field::Element &y) const;
+
+		template<typename _Tp1>
+		struct rebind {
+			typedef BooleanSwitch other;
+
+		};
+
+	protected:
+
+		bool _s;
+
+	}; // class boolean_switch
+
+	/** Boolean switch factory
+	 *
+	 * This class facilitates construction of boolean switch objects by the
+	 * butterfly matrix.
+	 */
+}// linbox
+namespace LinBox {
+
+	class BooleanSwitchFactory {
+	public:
+		/** Constructor from an STL vector of bools
+		*/
+		BooleanSwitchFactory (const std::vector<bool> &switches) :
+		       	_switches (switches), _iter (switches.begin ())
+		{}
+
+		/** Construct and return a boolean switch object
+		 *
+		 * This function walks through the switches object given in the
+		 * constructor, advancing on each invocation. It wraps around to the
+		 * beginning of the vector when it reaches the end.
+		 */
+		BooleanSwitch makeSwitch ()
+		{
+			if (_iter == _switches.end ())
+				_iter = _switches.begin ();
+
+			return BooleanSwitch (*_iter++);
+		}
+
+	private:
+
+		const std::vector<bool> &_switches;
+		std::vector<bool>::const_iterator _iter;
+	};
+
+	template <class Field>
+	inline bool BooleanSwitch::apply (const Field             &F,
+					  typename Field::Element &x,
+					  typename Field::Element &y) const
+	{
+		if (_s)
+			std::swap (x, y);
+
+		return _s;
+	}
+
+	template <class Field>
+	inline bool BooleanSwitch::applyTranspose (const Field             &F,
+						   typename Field::Element &x,
+						   typename Field::Element &y) const
+	{
+		if (_s)
+			std::swap (x, y);
+
+		return _s;
+	}
+
+// End boolean switch
+}// namespace LinBox
+
+#endif // __LINBOX_butterfly_INL
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/blackbox/companion.h b/linbox/blackbox/companion.h
index 6ee04e5..0c40384 100644
--- a/linbox/blackbox/companion.h
+++ b/linbox/blackbox/companion.h
@@ -25,82 +25,90 @@
 #define __LINBOX_companion_H
 
 #include "linbox/blackbox/blackbox-interface.h"
-#include "linbox/blackbox/triplesbb.h"
+// #include "linbox/blackbox/triplesbb.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include <vector>
 
 namespace LinBox
 {
 
 	/** \ingroup blackbox
-	  \brief %Companion matrix of a monic polynomial.
-	  */
-	template<class _Field>
-	struct Companion: public TriplesBB<_Field> {
-		typedef _Field Field;
+	 *  \brief %Companion matrix of a monic polynomial.
+	 *
+	 * @warning companion would be faster if built direct, using one axpy per entry: y_i = x_i-1 + p_i*x_n
+	 */
+	template<class Field_>
+	struct Companion: public SparseMatrix<Field_,SparseMatrixFormat::CSR> {
+		typedef Field_ Field;
+		typedef SparseMatrix<Field,SparseMatrixFormat::CSR> Father_t;
 
 		/// This is the n by n companion matrix of a given polynomial of degree n.
 		template<class Polynomial>
-		Companion(const Field& F =Field(), const Polynomial& P =Polynomial(1)) :
-			TriplesBB<Field>(F, P.size()-1, P.size()-1)
+		Companion(const Field& F , const Polynomial& P ) :
+			Father_t(F, P.size()-1, P.size()-1)
 		{
 			size_t n = P.size() - 1;
-			const size_t indexbase = 1;
-			typename Field::Element one; F.init(one, 1);
 			for (size_t i = 1; i < n; ++i)
-				this->addEntry(one, i+indexbase, i-1+indexbase);
+				this->setEntry(i, i-1, F.one);
 			for (size_t i = 0; i < n; ++i) {
 				typename Field::Element x;
-				F.init(x, 0);
 				F.neg(x, P[i]);
-				this->addEntry(x, i+indexbase, n-1+indexbase);
+				this->setEntry(i, n-1, x);
 			}
 		}// Companion cstor
 
-
+		/// zero matrix
+		Companion(const Field& F) :
+			Father_t(F)
+		{}
 
 
 		/**
 		 * \brief This constructs a random companion matrix.
-
-		 Builds n by n matrix from degree n monic poly with other coefficients random.
+		 *
+		 * Builds n by n matrix from degree n monic poly with other coefficients random.
+		 *
+		 * @warning should it be a constructor ?
 		 */
 		Companion(const Field& F, size_t n,
 			  typename Field::RandIter r ) :
-			TriplesBB<Field>(F, n, n)
+			Father_t(F, n, n)
 		{
 			std::vector<typename Field::Element> p(n+1);
 			for (typename std::vector<typename Field::Element>::iterator i = p.begin(); i != p.end(); ++i)
 				r.random(*i); // we'll pretend p[n] == 1, ok?
 
-			const size_t indexbase = 1;
-			typename Field::Element one; F.init(one, 1);
-			for (size_t i = 1; i < n; ++i) addEntry(one, i+indexbase, i-1+indexbase);
+			for (size_t i = 1; i < n; ++i) this->setEntry(i, i-1, F.one);
 			for (size_t i = 0; i < n; ++i)
 			{	typename Field::Element x;
-				F.init(x, 0);
 				F.neg(x, p[i]);
-				addEntry(x, i+indexbase, n-1+indexbase);
+				this->setEntry(i, n-1, x);
 			}
 
 		}
 
+		/**
+		 * \brief This constructs a random companion matrix.
+		 *
+		 * Builds n by n matrix from degree n monic poly with other coefficients random.
+		 *
+		 * @warning should it be a constructor ?
+		 */
 		Companion(const Field& F, size_t n) :
-			TriplesBB<Field>(F,n,n)
+			Father_t(F,n,n)
 		{
 			typename Field::RandIter r(F);
 			std::vector<typename Field::Element> p(n+1);
 			for (typename std::vector<typename Field::Element>::iterator i = p.begin(); i != p.end(); ++i)
 				r.random(*i); // we'll pretend p[n] == 1, ok?
 
-			const size_t indexbase = 1;
-			typename Field::Element one; F.init(one, 1);
+			// const size_t indexbase = 1;
 			for (size_t i = 1; i < n; ++i)
-				this->addEntry(one, i+indexbase, i-1+indexbase);
+				this->setEntry(i, i-1, F.one);
 			for (size_t i = 0; i < n; ++i)
 			{	typename Field::Element x;
-				F.init(x, 0);
 				F.neg(x, p[i]);
-				this->addEntry(x, i+indexbase, n-1+indexbase);
+				this->setEntry(i, n-1, x);
 			}
 
 		}
@@ -111,9 +119,10 @@ namespace LinBox
 		};
 
 
+		using Father_t::write;
+
 
 
-		// companion would be faster if built direct, using one axpy per entry: y_i = x_i-1 + p_i*x_n
 
 	}; //Companion class
 
@@ -123,11 +132,10 @@ namespace LinBox
 
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/compose.h b/linbox/blackbox/compose.h
index 9578a66..420af80 100644
--- a/linbox/blackbox/compose.h
+++ b/linbox/blackbox/compose.h
@@ -31,7 +31,7 @@
 #include "linbox/util/debug.h"
 #include "linbox/linbox-config.h"
 #include "linbox/blackbox/blackbox-interface.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/vector/blas-vector.h"
 
 namespace LinBox
 {
@@ -81,7 +81,7 @@ namespace LinBox
 		 * @param B blackbox
 		 */
 		Compose (const Blackbox1 &A, const Blackbox2 &B) :
-			_A_ptr(&A), _B_ptr(&B)
+			_A_ptr(&A), _B_ptr(&B),_z(A.field())
 		{
 			// Rich Seagraves - "It seems VectorWrapper somehow
 			// became depricated.  Makes the assumption that
@@ -97,7 +97,7 @@ namespace LinBox
 		 * @param B_ptr blackbox
 		 */
 		Compose (const Blackbox1 *A_ptr, const Blackbox2 *B_ptr) :
-			_A_ptr(A_ptr), _B_ptr(B_ptr)
+			_A_ptr(A_ptr), _B_ptr(B_ptr),_z(A_ptr->field())
 		{
 			linbox_check (A_ptr != (Blackbox1 *) 0);
 			linbox_check (B_ptr != (Blackbox2 *) 0);
@@ -113,8 +113,7 @@ namespace LinBox
 		 * @param[in] Mat blackbox to copy.
 		 */
 		Compose (const Compose<Blackbox1, Blackbox2>& Mat) :
-			_A_ptr ( Mat._A_ptr), _B_ptr ( Mat._B_ptr)
-			//{ VectorWrapper::ensureDim (_z, _A_ptr->coldim ()); }
+			_A_ptr ( Mat._A_ptr), _B_ptr ( Mat._B_ptr),_z(Mat.field())
 		{
 			_z.resize(_A_ptr->coldim());
 		}
@@ -237,7 +236,7 @@ namespace LinBox
 		const Blackbox2 *_B_ptr;
 
 		// local intermediate vector
-		mutable std::vector<Element> _z;
+		mutable BlasVector<Field> _z;
 	};
 
 	/// specialization for _Blackbox1 = _Blackbox2
@@ -298,14 +297,18 @@ namespace LinBox
 			typename std::vector<std::vector<Element> >::reverse_iterator z_p, pz_p;
 			b_p = _BlackboxL.rbegin();
 			pz_p = z_p = _zl.rbegin();
+			typedef BlasSubvector<BlasVector<Field, typename Vector<Field>::Dense> > BSub;
+			BSub pz_p_vec(field(),*pz_p);
 
-			(*b_p) -> apply(*pz_p, x);
+			(*b_p) -> apply(pz_p_vec, x);
 			++ b_p;  ++ z_p;
 
-			for (; z_p != _zl.rend(); ++ b_p, ++ z_p, ++ pz_p)
-				(*b_p) -> apply (*z_p,*pz_p);
+			for (; z_p != _zl.rend(); ++ b_p, ++ z_p, ++ pz_p) {
+				 BSub z_p_vec(field(),*z_p);
+				(*b_p) -> apply (z_p_vec,pz_p_vec);
+			}
 
-			(*b_p) -> apply(y, *pz_p);
+			(*b_p) -> apply(y, pz_p_vec);
 
 			return y;
 		}
@@ -411,16 +414,20 @@ namespace LinBox
 		typedef Compose<IMatrix, IMatrix> value_type;
 	};
 
+
+	template<class Field, class Rep>
+	class BlasMatrix ;
+
 	/// used in smith-binary, for example
-	template<class Field>
-	class ComposeTraits<  BlasMatrix<Field> > {
+	template<class Field, class Rep>
+	class ComposeTraits<  BlasMatrix<Field, Rep> > {
 	public:
 
 		// define the return value type
-		typedef BlasMatrix<Field> value_type;
+		typedef BlasMatrix<Field, Rep> value_type;
 	};
 
-}
+} // LinBox
 
 
 namespace LinBox
@@ -460,6 +467,7 @@ namespace LinBox
 		 */
 		ComposeOwner (const Blackbox1 &A, const Blackbox2 &B) :
 			_A_data(A), _B_data(B)
+			,_z(A.field())
 		{
 			// Rich Seagraves - "It seems VectorWrapper somehow
 			// became depricated.  Makes the assumption that
@@ -474,6 +482,7 @@ namespace LinBox
 		 */
 		ComposeOwner (const Blackbox1 *A_data, const Blackbox2 *B_data) :
 			_A_data(*A_data), _B_data(*B_data)
+			,_z(A_data->field())
 		{
 			linbox_check (A_data != (Blackbox1 *) 0);
 			linbox_check (B_data != (Blackbox2 *) 0);
@@ -490,6 +499,7 @@ namespace LinBox
 		 */
 		ComposeOwner (const ComposeOwner<Blackbox1, Blackbox2>& Mat) :
 			_A_data ( Mat.getLeftData()), _B_data ( Mat.getRightData())
+			,_z(Mat.field())
 		{
 			_z.resize(_A_data.coldim());
 		}
@@ -555,7 +565,7 @@ namespace LinBox
 		ComposeOwner (const Compose<_BBt1, _BBt2> &Mat, const Field& F) :
 			_A_data(*(Mat.getLeftPtr()), F),
 			_B_data(*(Mat.getRightPtr()), F),
-			_z(_A_data.coldim())
+			_z(F,_A_data.coldim())
 		{
 			typename Compose<_BBt1, _BBt2>::template rebind<Field>()(*this,Mat);
 		}
@@ -564,7 +574,7 @@ namespace LinBox
 		ComposeOwner (const ComposeOwner<_BBt1, _BBt2> &Mat, const Field& F) :
 			_A_data(Mat.getLeftData(), F),
 			_B_data(Mat.getRightData(), F) ,
-			_z(_A_data.coldim())
+			_z(F,_A_data.coldim())
 		{
 			typename ComposeOwner<_BBt1, _BBt2>::template rebind<Field>()(*this,Mat);
 		}
@@ -611,20 +621,19 @@ namespace LinBox
 		Blackbox2 _B_data;
 
 		// local intermediate vector
-		mutable std::vector<Element> _z;
+		mutable BlasVector<Field> _z;
 	};
 
-}
+} // LinBox
 
 
 #endif // __LINBOX_compose_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/csf.h b/linbox/blackbox/csf.h
new file mode 100644
index 0000000..5c065f7
--- /dev/null
+++ b/linbox/blackbox/csf.h
@@ -0,0 +1,491 @@
+/* linbox/blackbox/csr.h
+ * Compressed Sparse Format BB
+ * Author: Bryan Youse
+ * overhaul of ./zo.h, a CSR formatted BB for {0,1}-Matrices
+ * ------------------------------------
+ *
+ * Copyright (c) LinBox
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_CSF_H
+#define __LINBOX_CSF_H
+
+#include "linbox/integer.h"
+//#include "linbox/vector/vector-traits.h"
+#include "linbox/util/debug.h"
+#include "linbox/util/matrix-stream.h"
+#include "linbox/ring/modular.h"
+#include "linbox/blackbox/blackbox-interface.h"
+
+// For STL pair in IndexIterator
+#include <utility>
+#include <iterator>
+#include <vector> // For vectors in _col2row and _row2col
+#include <cstdlib> // For randomness in randomized quicksort
+#include <ctime>
+
+namespace LinBox
+{
+	/** \brief Space efficient representation of sparse matrices.
+	 *
+	 * Compressed Sparse Row/Column (CSR/C) involves two arrays of length NNZ (number of non-zeros)
+	 * One of column indices and another of matrix values.
+	 * A third array contains pointers indicating the division of the two NNZ arrays into rows.
+	 * (or vice versa w/r/t rows & columns)
+	 *
+	 \ingroup blackbox
+	 */
+
+	/*
+	bool revLexLess(const std::pair<size_t,size_t>& a, const std::pair<size_t,size_t> b)
+	{ return a.second < b.second || (b.second == a.second && a.first < b.first); }
+	*/
+
+	template<class _Field>
+	class CSF : public BlackboxInterface {
+	public:
+		//  if these are ints, SuperLU can use the data directly
+		//  otherwise they need converted from size_t (8byte v. 4byte)
+		typedef size_t Index;//int64_t Index;
+		typedef CSF<_Field> Self_t;
+		typedef _Field Field;
+		typedef typename _Field::Element Element;
+		typedef std::vector<Index> IndexVector;
+		typedef std::vector<Element> ElementVector;
+		typedef IndexVector PtrVector;
+		typedef std::pair<Index, Index> IndexPair;
+		typedef std::pair<IndexPair, Element> Triple;
+		typedef std::vector<Triple> Data;
+
+		//to denote by which way we sort our matrix
+		enum csformat { csr, csc }; //( true / false )
+
+		// DEFAULT CONSTRUCTOR, do nothing. Matrix will be uninitialized.
+		CSF(){};
+
+		// Destructor, once again do nothing
+		~CSF(){};
+
+		// basic constructor, can be used with subsequent read.
+		CSF(const Field& F) :
+			_field(&F), sorted(true)
+			,_rowdim(0),_coldim(0),isCSR(false)
+		{}
+
+		/* The real constructor /TODO give docs here
+		  assuming entries are sorted in lexicographic order by (row,col) pair.
+		  This depends on an accurate nnz being passed in.
+		  Probably should change to inputting vectors sometime...
+		  */
+		CSF
+		(Field& F, Index* rowP, Index* colP, Element* valP, Index rows, Index cols, Index nnz) :
+			_field(&F), _rowdim(rows), _coldim(cols), sorted(true), isCSR(true)
+		{
+			Data data;
+			for (Index i = 0; i < nnz; ++i, ++rowP, ++colP, ++valP)
+				data.push_back(Triple(IndexPair(static_cast<Index>(*rowP), static_cast<Index>(*colP)), static_cast<Element>(*valP)));
+			init(data);
+		}
+
+		/* constructor from a MatrixStream */
+		CSF( MatrixStream<Field>& ms ) :
+			_field(&(ms.getField()))
+			,isCSR(false),sorted(false)
+		{
+			read(ms);
+		}
+
+		//  copy constructor, easy enough
+		CSF(const CSF<Field>& A) :
+			_field(A._field), _inds(A._inds), _vals(A._vals), _ptrs(A._ptrs), _rowdim(A._rowdim), _coldim(A._coldim), sorted(A.sorted)
+		{ }
+
+		// TODO
+#if 0
+		//switching the way in which the matrix is sorted
+		void switch_sort() const
+		{
+			//std::cout << " -- switch_sort: " << std::endl;
+			Index dim;
+
+			if( sorted ) dim = _coldim;
+			else dim = _rowdim;
+
+			//std::cout << " -- in switch sort, before allocating temp -- " << std::endl;
+			std::vector< IndexVector > temp(dim);
+			//std::cout << temp.size() << std::endl;
+			//IndexVector temp[dim]; //maybe this needs toooooo much memory space when dim is very large
+			//std::cout << " -- in switch sort, after allocating temp -- " << std::endl;
+
+			for( PtrVector::iterator i = _ptrs.begin(); i < _ptrs.end() - 1; ++i )
+				for( IndexVector::iterator j = *i; j != *(i+1); ++j )
+					temp[*j].push_back( (Index)(i - _ptrs.begin()) );
+
+			_inds.clear(); _ptrs.clear();
+			std::back_insert_iterator < std::vector<Index> > colend( _inds) ;
+			for( size_t k = 0; k < dim; ++k )
+			{
+				_ptrs.push_back( _inds.end() );
+				copy( temp[k].begin(), temp[k].end(), colend );
+			}
+
+			_ptrs.push_back( _inds.end() );
+			sorted = !sorted;
+
+			return;
+		}
+#endif
+
+/*
+		template<class OutVector, class InVector>
+		OutVector& applyTranspose(OutVector& y, const InVector& x) const; // y = ATx
+		//OutVector& applyTranspose(OutVector& y, const InVector& x); // y = ATx
+
+		template<class OutVector, class InVector>
+		OutVector& apply(OutVector& y, const InVector& x) const; // y = Ax;
+		//OutVector& apply(OutVector& y, const InVector& x); // y = Ax;
+*/
+		template<class OutVector, class InVector>
+		OutVector & apply(OutVector & y, const InVector & x) const {
+			linbox_check((y.size()==rowdim())&&(x.size()==coldim()));
+
+			FieldAXPY<Field> accum (field());
+
+			typename OutVector::iterator yp;
+			typename InVector::const_iterator xp;
+			// PtrVector::const_iterator ip;
+
+			/*
+			   if( !sorted )
+			   switch_sort();
+			 */
+
+			xp=x.begin();
+			yp=y.begin();
+			accum.reset();
+
+			for(Index i = _ptrs[0]; (size_t)i < _ptrs.size()-1; ++i, ++yp) {
+				for(Index j = _ptrs[i]; j < _ptrs[i+1]; ++j) {
+					accum.mulacc(_vals[j], *(xp + _inds[j]) ); // y = a*x
+				}
+				accum.get(*yp);
+				accum.reset();
+			}
+
+			return y;
+		}
+
+		template<class OutVector, class InVector>
+		OutVector & applyTranspose(OutVector & y, const InVector & x) const {
+			linbox_check((y.size()==coldim())&&(x.size()==rowdim()));
+
+			for(size_t i = 0; i < y.size(); ++i) y[i] = field().zero;
+
+			for(Index i = _ptrs[0]; (size_t)i < _ptrs.size()-1; ++i) {
+				for(Index j = _ptrs[i]; j < _ptrs[i+1]; ++j) {
+				// process row i:  yj += xi Aij , yindsj += xi valsj
+					field().axpyin(y[i], x[_inds[j]], _vals[j]);
+				}
+			}
+
+			return y;
+		}
+
+		Element & getEntry(Element& x, Index i, Index j) {
+			size_t k;
+			for (k = _ptrs[i]; k < _ptrs[i+1]; ++k)
+				if (_inds[k] == j) break;
+			if (k == _ptrs[i+1]) return field().assign(x, field().zero);
+			else return field().copy(x, _vals[k]);
+		}
+
+		Element & setEntry(Index i, Index j, Element& x) {
+			// data must exist.
+			data.push_back(i, j, x);
+		}
+
+		void finalize() { // from data to csf
+			init(_data);
+		}
+
+		double &d00norm(double &norm){
+			norm = 0;
+			double  t;
+			//  maximal row inf (OO) norm
+			for(Index i = _ptrs[0]; (size_t)i < _ptrs.size()-1; ++i) {
+				double old;
+				old = norm;
+				for(Index j = _ptrs[i]; j < _ptrs[i+1]; ++j) {
+					field().convert(t, _vals[j]);
+					norm += abs(t);
+				}
+				if (norm < old) norm = old;
+			}
+
+			return norm;
+		}
+
+		integer &hadamardBound(integer &res){
+			res = 1L;
+			integer tmp;
+
+			//  product of ||A_i||_2 norms for rows A_i
+			for(Index i = _ptrs[0]; (size_t)i < _ptrs.size()-1; ++i) {
+				tmp = 0;
+				for(Index j = _ptrs[i]; j < _ptrs[i+1]; ++j) {
+					tmp += static_cast<integer>(_vals[j]) * _vals[j];
+				}
+				res *= tmp;
+			}
+
+			res = sqrt (res);
+			return res;
+		}
+
+		/** Read the matrix from a matrix stream
+		 *  @param ms Stream from which to read the matrix
+		 */
+		void read(MatrixStream<Field> &ms)
+		{
+			Data d;
+			size_t r, c;
+			Element v;
+
+			int64_t count = 0;
+
+			ms.getDimensions( _rowdim, _coldim );
+
+			while (ms.nextTriple(r, c, v) )
+			{
+				d.push_back(Triple(IndexPair(static_cast<Index>(r), static_cast<Index>(c)), static_cast<Element>(v)));
+				++count;
+			}
+
+			init(d);
+		}
+
+		/*  Accessor methods */
+		size_t rowdim() const
+		{ return _rowdim; }
+
+		size_t coldim() const
+		{ return _coldim; }
+
+		// TODO generecize for csc
+		IndexVector &getRows()
+		{
+			return _ptrs;
+		}
+
+		IndexVector &getCols()
+		{
+			return _inds;
+		}
+
+		ElementVector &getVals()
+		{
+			return _vals;
+		}
+
+		std::ostream& write_summary(std::ostream& out =  std::cout) const
+		{
+			out << "CSF Matrix: _inds.size() " << _inds.size();
+			out << ", _ptrs.size() " << _ptrs.size();
+			out << ", _rowdim " << _rowdim;
+			out << ", _coldim " << _coldim;
+			return out;
+		}
+
+		//  helper to write out triples, essentially sms w/o header/footer
+		std::ostream& write_sms(std::ostream& out =  std::cout) const {
+			Index row = 0;
+			integer val;
+			for(Index i = 0; i < _ptrs.size() - 1; ++i, ++row)
+				for(Index j = _ptrs[i]; j < _ptrs[i+1]; ++j){
+					field().convert(val, _vals[j]);
+					out << row << " " << _inds[j] << " " << val << std::endl;
+				}
+
+			return out;
+		}
+
+		// TODO generecize for CSC format
+		std::ostream& write(std::ostream& out =  std::cout) const {
+			integer val;
+			//  for each row
+			for(Index i=0, k=0; (size_t)i < _ptrs.size() - 1; ++i){
+				k = 0;
+				out << "  [";
+				//  j will be the index in _inds and _vals of data
+				for(Index j = _ptrs[i]; j < _ptrs[i+1]; ++j){
+					//  print zeros up to data
+					for(; k<_inds[j]; ++k) out << " 0";
+					field().convert(val, _vals[j]);
+					//  print data
+					out << " " <<  val;
+					++k;  //  adjust zero printing counter by one
+				}
+				for(; (size_t)k<_coldim; ++k) out << " 0";  // print zeros to end
+				out << " ]";
+			}
+			out << std::endl;
+			return out;
+		}
+
+		const Field& field() const
+		{
+			return *_field;
+		}
+
+		/* Non blackbox function.  Tells the number of nonzero entries */
+		size_t nnz() const
+		{
+			return _inds.size();
+		};
+
+		typedef MatrixCategories::BlackboxTag MatrixCategory;
+
+// TODO come back to these things later.
+#if 0
+		template<typename _Tp1>
+		struct rebind
+		{
+			typedef CSF<_Tp1> other;
+			void operator() (other *& Ap,
+					 const Self_t& A,
+					 const _Tp1& F) {
+				Ap = new other(F, A._inds, A._ptrs, A._rowdim, A._coldim, A.sorted);
+			}
+		};
+#endif
+
+	protected:
+		const Field *_field; // The field used by this class
+		IndexVector _inds; // The nnz indices sorted by row or by col
+		ElementVector _vals; // The values corresonding to nnz indices
+		PtrVector _ptrs; // the pointers to beginning of each (row/col)
+		size_t _rowdim, _coldim;
+
+		// if data is empty, matrix is ready to use.
+		Data _data;
+		bool sorted, isCSR;
+
+		class sort_data_by_col{
+			private:
+				Data _d;
+			public:
+				sort_data_by_col(Data d) : _d(d) {}
+				//  col sorted
+				bool operator()(const Triple &a, const Triple &b){
+					return (a.first.second < b.first.second ||
+						(a.first.second == b.first.second && a.first.first < b.first.first));
+				}
+		};
+
+		//  INITIAL
+		void init(Data& d)
+		{
+			Index nnz = d.size();
+			sort(d.begin(), d.end());
+			//sort(d.begin(), d.end(), sort_data_by_col(d));
+
+			/*
+			typename Data::iterator di = d.begin();
+			for(;di != d.end(); ++di){
+				std::cout << (*di).first.first << " " << (*di).first.second << " " << (*di).second << std::endl;
+			}
+			*/
+
+			// set up _inds and _vals
+			// if CSR, matrix cols represented by _inds and rows rep. by _ptrs
+			for (Index i = 0; i < nnz; ++i){
+				if(isCSR) _inds.push_back(d[i].first.second);
+				else _inds.push_back(d[i].first.first);
+				_vals.push_back(d[i].second);
+			}
+
+			// p represents position in the index/value arrays
+			Index p = 0;
+
+			// set up _ptrs
+			_ptrs.push_back(p);
+
+			typename Data::iterator q = d.begin();
+			//  for all the data we have
+			for (Index i = 0; q != d.end(); ++q, ++p){
+				//  if we see a new row
+				if (i != q->first.first) {
+					//  loop to encapsulate all possible "zero rows"
+					for (Index j = i; j < q->first.first; j++)
+						_ptrs.push_back(p); //add the index for the new row
+					i = q->first.first;  // now we're searching against the new row
+				}
+			}
+			// lastly, a pointer to AFTER last elt.
+			_ptrs.push_back(nnz);
+
+		}  // init()
+
+#if 0
+			// TODO decide between 2 copies and sort switching.
+			 keep another copy is not needed if we can switch sort between row and col
+			// sort by cols first, then do the same as above
+			sort(ip.begin(), ip.end(), revLexLess);
+
+			// set up _row
+			for (Index i = 0; i < NNz; ++i)
+			_row.push_back(ip[i].first);
+
+			// set up _colP
+			p = _row.begin();
+			_colP.push_back(p);
+
+			q =ip.begin();
+			i = q->second;
+			p++;q++;
+
+			for ( ; q != ip.end(); ++q, ++p)
+			if (i != q->second)
+			{
+			for (Index j = i; j < (q+1)->second; j++)
+			_colP.push_back(p);
+			i = q->second;
+			}
+			_colP.push_back(_row.end());
+		}
+#endif
+
+	}; //CSF
+
+}//End of LinBox
+
+//#include "csf.inl"
+
+#endif // __LINBOX_CSF
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/csf.inl b/linbox/blackbox/csf.inl
new file mode 100644
index 0000000..0d5b29d
--- /dev/null
+++ b/linbox/blackbox/csf.inl
@@ -0,0 +1,215 @@
+/*
+ * Copyright (c) LinBox
+ * Written by Bryan Youse
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+namespace LinBox
+{
+	template<class Field>
+	template<class OutVector, class InVector>
+	OutVector & CSF<Field>::apply(OutVector & y, const InVector & x) const
+	{
+		linbox_check((y.size()==rowdim())&&(x.size()==coldim()));
+
+		FieldAXPY<Field> accum (field());
+
+		typename OutVector::iterator yp;
+		typename InVector::const_iterator xp;
+		PtrVector::const_iterator ip;
+
+		/*
+		if( !sorted )
+			switch_sort();
+			*/
+
+		xp=x.begin();
+		yp=y.begin();
+		accum.reset();
+
+		for(Index i = _ptrs[0]; (size_t)i < _ptrs.size()-1; ++i, ++yp) {
+			for(Index j = _ptrs[i]; j < _ptrs[i+1]; ++j)
+			{
+				// y = a*x
+				accum.mulacc(_vals[j], *(xp + _inds[j]) );
+			}
+			accum.get(*yp);
+			accum.reset();
+		}
+
+		return y;
+	}
+
+	/*
+	template<class Field>
+	template<class OutVector, class InVector>
+	OutVector & CSF<Field>::apply(OutVector & y, const InVector & x) const
+	//OutVector & CSF<Field>::apply(OutVector & y, const InVector & x)
+	{
+		//std::cout << endl;
+		//std::cout << " new apply pass " << endl;
+		//std::cout << this->rowdim() << " " << this->coldim() << endl;
+		//std::cout << " inside apply " << endl;
+		//std::cout << x.size() << " " << y.size() << endl;
+
+		linbox_check((y.size()==rowdim())&&(x.size()==coldim()));
+
+		FieldAXPY<Field> accum (field());
+
+		typename OutVector::iterator yp;
+		typename InVector::const_iterator xp;
+		PtrVector::const_iterator ip;
+		IndexVector::const_iterator jp;
+
+		//std::cout << " before sorting " << endl;
+
+		if( !sorted )
+		{
+			//std::cout << " -- apply: switch sort (" << _rowdim << ", " << _coldim << ", " << nnz() << ", " << sorted << " " << &(this->sorted) << ") -- " << std::endl;
+			switch_sort();
+			//std::cout << " -- apply: switch sort (" << _rowdim << ", " << _coldim << ", " << nnz() << ", " << sorted << ") -- " << std::endl;
+		}
+		//std::cout << " -- zo apply: " << this << "(" << _rowdim << ", " << _coldim << ", " << nnz() << ")" << std::endl;
+
+		xp=x.begin();
+		yp=y.begin();
+		accum.reset();
+
+		//std::cout << " before for loop " << endl;
+		//std::cout << _ptrs.end() - _ptrs.begin() << " ";
+		//std::cout << _inds.end() - _inds.begin() << endl;
+
+		//std::cout << " stupid test here " << (*_ptrs.begin()) - _inds.begin() << endl;
+		//cout << &_inds << "  of size ";
+		//cout << sizeof(_inds) << " ";
+		//cout  << &(*_inds.begin()) << endl;
+
+		for(ip = _ptrs.begin(); ip !=_ptrs.end()-1; ++ip, ++yp)
+			//for(ip = _ptrs.begin(); ip < _ptrs.end()-2; ++ip, ++yp)  // zigzag way
+		{
+			//std::cout << " inside the outer for loop " << ip - _ptrs.begin() << endl;
+			for(jp = *ip; jp !=*(ip + 1); ++jp)
+			{
+				//std::cout << jp - _inds.begin() << endl;
+				accum.accumulate_special( *(xp + *jp) );
+			}
+			//std::cout << " accumulate is done for one iteration " << endl;
+			//std::cout << " before accum.get " << yp - y.begin() << endl;
+			accum.get(*yp);
+			//std::cout << " before accum.reset " << endl;
+			accum.reset();
+
+			// /// zigzag way
+			   ++ip;++yp;
+
+			   for(jp = *(ip + 1); jp >*ip; --jp)
+			   accum.accumulate_special( *(xp + *(jp-1)) );
+			   accum.get(*yp);
+			   accum.reset();
+
+
+		}
+
+		return y;
+	}
+*/
+
+
+	/* if you want to keep two copies for the matrix, one of which is sorted by row,
+	 * the other by column, then you want to use this applyTranspose function. In
+	 * this case, un-comment this one and comment out the applyTranspose further down
+	 */
+	/*
+	   template<class Field>
+	   template<class OutVector, class InVector>
+	   OutVector & CSF<Field>::applyTranspose(OutVector & y, const InVector & x) const
+	   {
+	   linbox_check((y.size()==coldim())&&(x.size()==rowdim()));
+
+	   FieldAXPY<Field> accum (field());
+
+	   typename OutVector::iterator yp;
+	   typename InVector::const_iterator xp;
+	   PtrVector::const_iterator ip;
+	   IndexVector::const_iterator jp;
+
+	   xp=x.begin();
+	   yp=y.begin();
+	   accum.reset();
+
+	   for(ip = _colP.begin(); ip < _colP.end()-1; ++ip, ++yp)
+	   {
+	   for(jp = *ip; jp <*(ip + 1); ++jp)
+	   accum.accumulate_special( *(xp + *jp) );
+	   accum.get(*yp);
+	   accum.reset();
+	   }
+
+	   return y;
+
+	   }
+	   */
+
+#if 0
+	template<class Field>
+	template<class OutVector, class InVector>
+	OutVector & CSF<Field>::applyTranspose(OutVector & y, const InVector & x) const
+	{
+		linbox_check((y.size()==coldim())&&(x.size()==rowdim()));
+
+		FieldAXPY<Field> accum (field());
+
+		typename OutVector::iterator yp;
+		typename InVector::const_iterator xp;
+		PtrVector::const_iterator ip;
+		IndexVector::const_iterator jp;
+
+		xp=x.begin();
+		yp=y.begin();
+		accum.reset();
+
+		if( sorted )
+			//{
+			//std::cout << " -- in apply transpose, before switch sort -- " << std::endl;
+			switch_sort();
+		//std::cout << " -- in apply transpose, after switch sort -- " << std::endl;
+		//}
+
+		for(ip = _ptrs.begin(); ip < _ptrs.end()-1; ++ip, ++yp)
+		{
+			for(jp = *ip; jp <*(ip + 1); ++jp)
+				accum.accumulate_special( *(xp + *jp) );
+			accum.get(*yp);
+			accum.reset();
+		}
+		return y;
+	}
+#endif
+}//End of LinBox
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/blackbox/dense-zero-one.h b/linbox/blackbox/dense-zero-one.h
new file mode 100644
index 0000000..1e3fdf8
--- /dev/null
+++ b/linbox/blackbox/dense-zero-one.h
@@ -0,0 +1,405 @@
+/* linbox/blackbox/dense-zero-one.h
+ * Copyright (c) LinBox
+ * written by Nick Messina <nmessina at cis.udel.edu>
+ *
+ * -----------------------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_dense_zero_one_H
+#define __LINBOX_dense_zero_one_H
+
+
+
+#include <iostream>
+//#include "linbox/field/hom.h"
+#include "linbox/linbox-config.h"
+#include <vector>
+#include "linbox/blackbox/blackbox-interface.h"
+
+
+//const size_t SIZE = sizeof(LinBox::uint64_t) * 8;
+#define SIZE  (sizeof(uint64_t) * 8)
+
+
+namespace LinBox
+{
+
+	template <class _MatrixDomain>
+	class DenseZeroOne : public  BlackboxInterface {
+
+	public:
+
+		// The following two typedefs are not useful in LinBox yet, as matrix domains aren't yet defined
+		typedef _MatrixDomain MatrixDomain;
+		typedef typename MatrixDomain::Scalar Scalar;
+		typedef typename MatrixDomain::Block Block;
+		typedef MatrixDomain Field;
+
+		typedef uint64_t PackedUnit;
+		typedef DenseZeroOne<MatrixDomain> Self_t;
+
+		/* Notes:
+		 * _rows gives the number of rows of PackedUnits
+		 * _cols gives the number of bits in each row */
+
+		DenseZeroOne(MatrixDomain MD, size_t m, size_t n) :
+			_MD(MD), _rows(m), _cols(n)
+		{
+			_valPerWord = SIZE;
+			_mask = 1;
+			_rep.resize( _rows * ( ((_cols-1)/_valPerWord) + 1));
+		}
+
+		DenseZeroOne(const Self_t & other) :
+			_MD(other._MD), _rows(other._rows), _cols(other._cols), _valPerWord(other._valPerWord), _rep(other._rep), _mask(other._mask)
+		{}
+
+		/* Constructor for making the blackbox out of a vector of PackedUnits.
+		 * Note that if the vector given is too short for given size(m by n),
+		 * the blackbox is enlarged and padded by 0's added after the given vector.
+		 * If the vector given is too large, the blackbox truncates this vector
+		 * to the appropriate number of PackedUnits.  */
+		template <class Vector>
+		DenseZeroOne(MatrixDomain MD, size_t m, size_t n, Vector & v) :
+			_MD(MD), _rows(m), _cols(n)
+		{
+			_valPerWord = SIZE;
+			_mask = 1;
+			_rep = v;
+			_rep.resize( _rows * ( ((_cols-1)/_valPerWord) + 1));
+		}
+
+
+		Scalar & getEntry(Scalar & x, size_t i, size_t j) const
+		{
+			//Get all index values needed.
+			size_t unitNum = i*(_rep.size()/_rows) + (j/_valPerWord);  //Starts from 0
+			size_t bitPlace = (j%_valPerWord) + 1;                    //Starts from 1
+
+			_MD.init(x, (_rep[unitNum] >> (_valPerWord - bitPlace) ) & _mask );
+			return x;
+		}
+
+		void setEntry(size_t i, size_t j, const Scalar & x)
+		{
+			//Get all index values needed.
+			size_t unitNum = i*(_rep.size()/_rows) + (j/_valPerWord);  //Starts from 0
+			size_t bitPlace = (j%_valPerWord) + 1;                    //Starts from 1
+
+			PackedUnit y = 0;
+			if (_MD.isOne(x))
+				y = 1;
+
+			_rep[unitNum] &= ~(_mask << (_valPerWord - bitPlace));
+			_rep[unitNum] |= (y << (_valPerWord - bitPlace));
+		}
+
+		//Apply Variants
+
+		// matrix-vector product
+		template <class OutVector, class InVector>
+		OutVector & apply(OutVector & y, const InVector & x) const
+		{
+			Scalar sum = 0;
+			std::vector<PackedUnit>::const_iterator p = _rep.begin();
+			typename InVector::const_iterator xp = x.begin();
+
+			for(size_t yi = 0; yi != _rows; ++yi){
+				//	for(; xp != x.end(); ++p)
+				for(; p != _rep.begin() + ((yi+1) * (_rep.size()/_rows)); ++p){
+					for(PackedUnit mask = _mask << (_valPerWord -1); (mask!=0) && (xp!=x.end()); mask>>=1){
+						if(mask & (*p))
+							_MD.addin(sum, (*xp));
+						++xp;
+					}
+				}
+				y[yi] = sum;
+				sum = 0;
+				xp = x.begin();
+			}
+
+			return y;
+		}
+
+
+		//vector-matrix product
+		template <class OutVector, class InVector>
+		OutVector & applyTranspose(OutVector & y, const InVector & x) const
+		{
+			Scalar sum = 0;
+			std::vector<PackedUnit>::const_iterator p = _rep.begin();
+			typename InVector::const_iterator xp = x.begin();
+			PackedUnit mask = _mask << (_valPerWord - 1);
+
+			for(size_t yi = 0; yi != _cols; ++yi){
+				for(; xp != x.end(); ++xp, p+=(_rep.size()/_rows)){
+					if(mask & (*p))
+						_MD.addin(sum, (*xp));
+				}
+				y[yi] = sum;
+				sum = 0;
+				xp = x.begin();
+				p = _rep.begin() + ((yi+1)/_valPerWord);
+				mask >>= 1;
+				if(mask == 0)
+					mask = _mask << (_valPerWord - 1);
+			}
+
+			return y;
+		}
+
+
+		//Block apply
+		Block & apply(Block & Y, Block & X) const
+		{
+			//Let i,j represent current spot in BB, used for Block constructions
+			std::vector<PackedUnit>::const_iterator p = _rep.begin();
+			size_t j = 0;
+			_MD.zero(Y);
+			Block x(X.field(),1, X.coldim()), y(Y.field(),1, Y.coldim());
+
+			for(size_t i = 0; i != _rows; ++i){
+				//! @bug submatrix ?
+				Y.subBlock(y,i,0,1,Y.coldim());
+
+				for(; p != _rep.begin() + ((i+1) * (_rep.size()/_rows)); ++p){
+					for(PackedUnit mask = _mask << (_valPerWord - 1); (mask!=0) && (j != _cols); mask>>=1, ++j){
+						if(mask & (*p))
+							_MD.addin(y, X.subBlock(x,j,0,1,X.coldim()));
+					}
+				}
+				j = 0;
+			}
+
+			return Y;
+		}
+
+
+		//Block applyTranspose
+		Block & applyTranspose(Block & Y, Block & X) const
+		{
+			//Traverse the BB by going through each column.
+			//When BB[i,j] = 1, add the ith column of X
+			//to the jth column of Y
+
+			std::vector<PackedUnit>::const_iterator p = _rep.begin();
+			PackedUnit mask = _mask << (_valPerWord - 1);
+			_MD.zero(Y);
+			Block x(X.rowdim(),1), y(Y.rowdim(),1);
+
+			for(size_t j = 0; j != _cols; ++j){
+				Y.subBlock (y,0,j,Y.rowdim(),1);
+				for(size_t i = 0; i != _rows; ++i, p+=(_rep.size()/_rows)){
+					if(mask & (*p))
+						_MD.addin(y, X.subBlock(x,0,i,X.rowdim(),1));
+				}
+				p = _rep.begin() + ((j+1)/_valPerWord);
+				mask >>= 1;
+				if(mask == 0)
+					mask = _mask << (_valPerWord - 1);
+			}
+
+			return Y;
+		}
+
+
+		//Unpacking apply
+		Block & unpackingApply(Block & Out, Block & In, const size_t U = 1024)
+		{
+			_MD.zero(Out);
+			Block A, B, C;
+			size_t iend, jend, kend;
+
+			for(size_t i = 0; i < _rows; i += U){
+				if(i + U >= _rows) iend = _rows - i;
+				else iend = U;
+
+				for(size_t j = 0; j < In.coldim(); j += U){
+					if (j + U >= In.coldim()) jend = In.coldim() - j;
+					else jend = U;
+
+					Out.subBlock(C,i,j,iend,jend);
+					for(size_t k = 0; k < _cols; k += U){
+						if(k + U >= _cols) kend = _cols - k;
+						else kend = U;
+
+						expandBlock(A,i,k,iend,kend);
+						In.subBlock(B,k,j,kend,jend);
+						_MD.axpyin(C, A, B);
+					}
+				}
+			}
+
+			return Out;
+		}
+
+
+		//Unpacking applyTranspose
+		Block & unpackingApplyTranspose(Block & Out, Block & In, const size_t U = 1024)
+		{
+			_MD.zero(Out);
+			Block A, B, C;
+			size_t iend, jend, kend;
+
+			for(size_t i = 0; i < In.rowdim(); i += U){
+				if(i + U >= In.rowdim()) iend = In.rowdim() - i;
+				else iend = U;
+
+				for(size_t j = 0; j < _cols; j += U){
+					if (j + U >= _cols) jend = _cols - j;
+					else jend = U;
+
+					Out.subBlock(C,i,j,iend,jend);
+					for(size_t k = 0; k < _rows; k += U){
+						if(k + U >= _rows) kend = _rows - k;
+						else kend = U;
+
+						expandBlock(A,k,j,kend,jend);
+						In.subBlock(B,i,k,iend,kend);
+						_MD.axpyin(C, B, A);
+					}
+				}
+			}
+
+			return Out;
+		}
+
+
+		size_t rowdim() const {return _rows;}
+
+		size_t coldim() const {return _cols;}
+
+		MatrixDomain domain() const {return _MD;}
+
+		Field field() const {return _MD;}
+
+		/* Note that if the user calls the following function outside of the range of the
+		 * blackbox, the block returned is padded with zeros for out of range values of the blackbox.
+		 */
+		Block & expandBlock(Block & Out, const size_t i, const size_t j, const size_t numRows, const size_t numCols)
+		{
+			//Check size, and resize if necessary
+			if ( (Out.rowdim() != numRows) || (Out.coldim() != numCols) )
+				Out.resize(numRows, numCols);
+
+			//Index values
+			size_t unitNum = i*(_rep.size()/_rows) + (j/_valPerWord);  //Starts from 0
+			size_t bitPlace = (j%_valPerWord) + 1;                    //Starts from 1
+
+			std::vector<PackedUnit>::const_iterator p;
+			size_t outRow = 0;
+			size_t outCol = 0;
+			Scalar x;
+			size_t bp = bitPlace;
+
+			for(;outRow != numRows; ++outRow){
+				p = _rep.begin() + unitNum + outRow*(_rep.size()/_rows);
+				if(i + outRow >= _rows){
+					for(; outCol != numCols; ++outCol)
+						Out.setEntry(outRow, outCol, _MD._zro);
+				}
+
+				else{
+					for(; outCol != numCols; ++p){
+						for(; (bp != _valPerWord + 1) && (outCol != numCols); ++bp){
+							if (j + outCol >= _cols) x = _MD._zro;
+							else _MD.init(x, ((*p) >> (_valPerWord - bp)) & _mask);
+							Out.setEntry(outRow, outCol, x);
+							++outCol;
+						}
+						bp = 1;
+					}
+				}
+
+				bp = bitPlace;
+				outCol = 0;
+			}
+
+			return Out;
+		}
+
+		std::ostream & write(std::ostream & os, Block & B)
+		{
+			Scalar x;
+			for(size_t i = 0; i!= B.rowdim(); ++i){
+				for(size_t j = 0; j!= B.coldim(); ++j)
+					os << B.getEntry(x,i,j) << ' ';
+				os << std::endl;
+			}
+
+			return os;
+		}
+
+		std::ostream & write(std::ostream & os)
+		{
+			Scalar x;
+			for(size_t i = 0; i != _rows; ++i){
+				for(size_t j = 0; j!= _cols; ++j){
+					os << getEntry(x,i,j) << ' ';
+				}
+				os << std::endl;
+			}
+			return os;
+		}
+
+
+		/** @todo Functions that should be written:
+		 * read()
+		 * rebind()
+		 */
+
+	private:
+
+		//Field which blackbox is over
+		MatrixDomain _MD;
+
+		//Number of rows and columns of the matrix
+		size_t _rows, _cols;
+
+		//Number of bits in a PackedUnit
+		size_t _valPerWord;
+
+		//Representation of the matrix
+		std::vector<PackedUnit> _rep;
+
+		//Mask used
+		PackedUnit _mask;
+
+
+
+	}; // class Dense01Blackbox
+
+} // namespace LinBox
+
+#endif // __LINBOX_dense_zero_one_H
+
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/blackbox/diagonal-gf2.h b/linbox/blackbox/diagonal-gf2.h
index d613e98..84c2da4 100644
--- a/linbox/blackbox/diagonal-gf2.h
+++ b/linbox/blackbox/diagonal-gf2.h
@@ -57,14 +57,14 @@ namespace LinBox
 		typedef BlackboxArchetype         Blackbox;
 		typedef bool                      Element;
 
-		Diagonal (const Field &, const BitVector &y) :
-			_v (y)
+		Diagonal (const Field & F, const BitVector &y) :
+			_field(&F), _v (y)
 		{}
 
 		/// The field.
 		const Field& field() const
 		{
-			return *(new GF2());
+			return *_field;
 		}
 
 		Blackbox *clone() const
@@ -127,7 +127,9 @@ namespace LinBox
 			return (i==j?x=this->_v[i]:x=false);
 		}
 
-	private:
+	protected:
+
+		const Field *_field;
 
 		// Bit vector of elements
 		BitVector _v;
diff --git a/linbox/blackbox/diagonal.h b/linbox/blackbox/diagonal.h
index 24e6321..96ec5dd 100644
--- a/linbox/blackbox/diagonal.h
+++ b/linbox/blackbox/diagonal.h
@@ -45,9 +45,16 @@
 
 #include <vector>
 #include "linbox/vector/vector-traits.h"
+#include "linbox/vector/blas-vector.h"
 #include "linbox/util/debug.h"
 #include "linbox/linbox-config.h"
 #include "linbox/field/hom.h"
+#include "linbox/solutions/solution-tags.h"
+#include "linbox/util/matrix-stream.h"
+#include "linbox/util/write-mm.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/blackbox/fibb.h"
 
 // Namespace in which all LinBox library code resides
 namespace LinBox
@@ -80,29 +87,46 @@ namespace LinBox
 	 * and partial template specialization.
 	 */
 	template<class Field, class Trait = typename VectorTraits<typename
-	LinBox::Vector<Field>::Dense>::VectorCategory > class Diagonal {
+	LinBox::Vector<Field>::Dense>::VectorCategory > 
+	class Diagonal {
 	private:
 		/// empty constructor
-		Diagonal () {} };
+		Diagonal () {}
+	};
 
 	/**
 	  \brief Specialization of Diagonal for application to dense vectors
 	  */
 	template <class _Field>
-	class Diagonal<_Field, VectorCategories::DenseVectorTag> {
+	class Diagonal<_Field, VectorCategories::DenseVectorTag> 
+	: public FIBB<_Field> {
 		typedef Diagonal<_Field, VectorCategories::DenseVectorTag> Self_t;
 	public:
 
-		typedef _Field Field;
-		typedef typename Field::Element    Element;
+		using Father_t = FIBB<_Field>;
+		using Field = _Field;
+		using Element = typename Father_t::Element;
+		using Matrix = typename Father_t::Matrix;
+		using Vector_t = BlasVector<Field>;
+
+		/// \brief cstor ready for a read.
+		Diagonal(const Field &F) :
+			_field(&F)
+			, _n(0)
+			, _v(F)
+		{}
 
 		/// \brief cstor from vector of elements.
-		Diagonal(const Field F, const std::vector<typename Field::Element>& v);
+		// Diagonal(const Field &F, const std::vector<typename Field::Element>& v);
+
+		Diagonal(const Vector_t& v);
 
 		// construct random nonsingular n by n diagonal matrix.
-		Diagonal(const Field F, const size_t n, bool nonsing=true);
+		Diagonal(const Field &F, const size_t n, bool nonsing=true);
+
+		Diagonal(const Field &F, const size_t n, typename Field::RandIter& iter);
 
-		Diagonal(const Field F, const size_t n, typename Field::RandIter& iter);
+		~Diagonal(){}
 
 		template <class OutVector, class InVector>
 		OutVector &apply (OutVector &y, const InVector &x) const;
@@ -110,6 +134,16 @@ namespace LinBox
 		template <class OutVector, class InVector>
 		OutVector &applyTranspose (OutVector &y, const InVector &x) const { return apply (y, x); }
 
+		virtual Matrix& applyRight(Matrix& Y, const Matrix& X) const // Y = AX
+		{   MatrixDomain<Field> MD(field());
+		    return MD.mul(Y, *this, X);
+		}
+
+		Matrix& applyLeft(Matrix& Y, const Matrix& X) const // Y = AX
+		{   MatrixDomain<Field> MD(field());
+		    return MD.mul(Y, X, *this);
+		}
+
 		size_t rowdim(void) const { return _n; }
 
 		size_t coldim(void) const { return _n; }
@@ -118,7 +152,7 @@ namespace LinBox
 		void randomNonsingular();
 
 		/// \brief the field of the entries
-		const Field& field() const{ return _field; }
+		const Field& field() const{ return *_field; }
 
 		/** Get an entry and store it in the given value.
 		 * This form is more in the LinBox style and is provided for interface
@@ -128,10 +162,19 @@ namespace LinBox
 		 * @param j Column index
 		 * @return Reference to x
 		 */
-		Element &getEntry (Element &x, size_t i, size_t j) const {
-			return (i==j?_field.assign(x,_v[i]):_field.init(x,0));
+		Element &getEntry (Element &x, size_t i, size_t j) const
+		{
+			return (i==j?field().assign(x,_v[i]):field().assign(x,field().zero));
 		}
 
+		/** (i,i) entry is set to x.
+		 *
+		 * could throw error if j != i, but now j is ignored.
+		 */
+		void setEntry (size_t i, size_t j, const Element &x)
+		{
+			_v[i] = x;
+		}
 
 		template<typename _Tp1>
 		struct rebind {
@@ -142,8 +185,8 @@ namespace LinBox
 
 				Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
 
-				typename std::vector<typename _Tp1::Element>::iterator nit = Ap.getData().begin();
-				typename std::vector<Element>::const_iterator oit = A.getData().begin();
+				typename BlasVector<_Tp1>::iterator nit = Ap.getData().begin();
+				typename Vector_t::const_iterator oit = A.getData().begin();
 				for( ; oit != A.getData().end() ; ++nit, ++oit)
 					hom.image (*nit, *oit);
 			}
@@ -152,34 +195,199 @@ namespace LinBox
 
 		template<typename _Tp1, typename _Vc1>
 		Diagonal(const Diagonal<_Tp1,_Vc1>& D, const Field& F) :
-			_field(F), _n(D.rowdim()), _v(D.rowdim())
+			_field(&F), _n(D.rowdim()), _v(F,D.rowdim())
 		{
 			typename Diagonal<_Tp1,_Vc1>::template rebind<Field>() (*this, D);
 		}
 
+		std::ostream& write(std::ostream& os) const
+		{
+			writeMMCoordHeader(os, *this, rowdim(), "Diagonal");
+			for (size_t i = 0; i < rowdim(); ++i)
+				field().write(os << i + 1 << " " << i + 1 << " ", _v[i]) << std::endl;
+			return os;
+		}
 
+		std::istream& read(std::istream& is)
+		{
+			MatrixStream<Field> ms(field(), is);
+			size_t c, i, j;
+			if( !ms.getDimensions(_n, c) || c != _n )
+				throw ms.reportError(__FUNCTION__,__LINE__);
+			Element x; field().assign(x, field().zero);
+			_v.resize(_n);
+			for (size_t k = 0; k < _n; ++ k) {
+				ms.nextTriple(i, j, x);
+				if (i != j) throw ms.reportError(__FUNCTION__,__LINE__);
+				setEntry(i, j, x);
+			}
+			return is;
+		}
 
+		Diagonal ( MatrixStream<Field>& ms ):
+			_field(&ms.field())
+			,_n(0)
+			,_v(ms.field())
+		{
+			size_t c, i, j;
+			if( !ms.getDimensions(_n, c) || c != _n )
+				throw ms.reportError(__FUNCTION__,__LINE__);
+			Element x; field().assign(x, field().zero);
+			_v.resize(_n);
+			for (size_t k = 0; k < _n; ++ k) {
+				ms.nextTriple(i, j, x);
+				if (i != j) throw ms.reportError(__FUNCTION__,__LINE__);
+				setEntry(i, j, x);
+			}
+		}
 
-		std::ostream& write(std::ostream& out) {
-			out << "diag(";
-			for (typename std::vector<Element>::iterator p = _v.begin(); p != _v.end(); ++p)
-				_field.write(out, *p) << ", ";
-			return out << "\b\b)";
+		const Vector_t& getData() const { return _v; }
+		Vector_t& getData() { return _v; }
+
+/* FIBB functions */
+/* rank, det, solveRight, solveLeft, solveMPRight, solveMPLeft, 
+nullspaceRandomRight, nullspaceRandomLeft, nullspaceBasisRight, nullspaceBasisLeft */
+
+BBType bbTag() const { return diagonal; }
+
+size_t& rank(size_t& r) const
+{ // assuming square
+	r = 0; 
+	Element x; field().init(x);
+	size_t n = (rowdim() > coldim()) ? rowdim() : coldim();
+	for (size_t i = 0; i < n; ++i) 
+		if (not field().isZero(getEntry(x,i,i))) r++;
+	return r;
+}
+
+Element& det( Element& d) const
+{	if (rowdim() != coldim()) return d = field().zero;
+    Element x; field().init(x);
+	d = field().one;
+	for (size_t i = 0; i < rowdim(); ++i) 
+		field().mulin(d, getEntry(x,i,i));
+	return d;
+}
+
+Matrix& solveRight(Matrix& Y, const Matrix& X) const
+{	 return solveMPRight(Y, X);
+}
+
+Matrix& solveLeft(Matrix& Y, const Matrix& X) const
+{	 return solveMPLeft(Y, X);
+}
+
+Matrix& solveMPRight(Matrix& Y, const Matrix& X) const
+{	BlasMatrixDomain<Field> MD(field());
+	Element x; field().init(x);
+	Element y; field().init(y);
+	Element d; field().init(d);
+	Y.zero();
+	for (size_t i = 0; i < coldim(); ++ i) 
+	{	if ( ! field().isZero( getEntry(x, i, i) ) )
+		{// Todo: do this as a matrix (or vector) level operation	
+			field().inv(d, x);
+			for (size_t j = 0; j < X.coldim(); ++ j) 
+				Y.setEntry(i,j, field().mul(y, d, X.getEntry(x, i, j)));
+		/* this causes a deallocation error ??
+			Matrix Xrow(X, i, 0, 1, coldim());
+			Matrix Yrow(Y, i, 0, 1, coldim());
+			// there should be a scalar mul!
+			Matrix S(field(), 1, 1); 
+			S.setEntry(0,0,field().invin(x));
+			MD.mul(Yrow, S, Xrow);
+		*/
+		}
+	}
+	return Y;
+}
+
+Matrix& solveMPLeft(Matrix& Y, const Matrix& X) const
+{	BlasMatrixDomain<Field> MD(field());
+	Element x; field().init(x);
+	Element y; field().init(y);
+	Element d; field().init(d);
+	Y.zero();
+	for (size_t j = 0; j < rowdim(); ++ j) 
+	{	if (! field().isZero( getEntry(x, j, j) ) )
+		{// Todo: do this as a matrix (or vector) level operation	
+			field().inv(d, x);
+			for (size_t i = 0; i < X.rowdim(); ++ i) 
+				Y.setEntry(i,j, field().mul(y, d, X.getEntry(x, i, j)));
+		/* this causes a deallocation error ??
+			Matrix Xcol(X, 0, j, rowdim(), 1);
+			Matrix Ycol(Y, 0, j, rowdim(), 1);
+			Matrix S(field(), 1, 1); 
+			S.setEntry(0,0,field().invin(x));
+			MD.mul(Ycol, Xcol, S);
+		*/
+		}
+	}
+	return Y;
+}
+
+Matrix& nullspaceRandomRight(Matrix& N) const
+{	N.zero();
+	Element x; field().init(x);
+	for (size_t i = 0; i < rowdim(); ++ i) 
+	{	getEntry(x, i, i);
+		if (field().isZero(x))
+		{	Matrix Nrow(N, i, 0, 1, N.coldim());
+			Nrow.random();
+		}
+	}
+	return N;
+}
+
+Matrix& nullspaceRandomLeft(Matrix& N) const 
+{	N.zero();
+	Element x; field().init(x);
+	for (size_t i = 0; i < rowdim(); ++ i) 
+	{	getEntry(x, i, i);
+		if (field().isZero(x))
+		{	Matrix Ncol(N, 0, i, N.rowdim(), 1);
+			Ncol.random();
 		}
+	}
+	return N;
+}
+
+BlasMatrix<Field>& nullspaceBasisRight(BlasMatrix<Field>& N) const
+{	size_t n = coldim(), r; rank(r);
+	N.resize(rowdim(), n-r, field().zero);
+	Element x; field().init(x);
+	size_t k = 0;
+	for (size_t i = 0; i < N.coldim(); ++i) 
+	{	if (field().isZero( getEntry(x,i,i) )) 
+			N.setEntry(i,k++, field().one);
+
+	}
+	return N;
+}
+
+BlasMatrix<Field>& nullspaceBasisLeft(BlasMatrix<Field>& N) const
+{	size_t m = rowdim(), r; rank(r);
+	N.resize(m-r, coldim(), field().zero);
+	Element x; field().init(x);
+	size_t k = 0;
+	for (size_t i = 0; i < N.rowdim(); ++i) 
+	{	if (field().isZero( getEntry(x,i,i) ))
+			N.setEntry(i,k++, field().one);
 
-		const std::vector<Element>& getData() const { return _v; }
-		std::vector<Element>& getData() { return _v; }
+	}
+	return N;
+}
 
-	private:
+	protected:
 
 		// Field for arithmetic
-		Field _field;
+		const Field *_field;
 
 		// Number of rows and columns of square matrix.
 		size_t _n;
 
 		// STL vector of field elements used in applying matrix.
-		std::vector<Element> _v;
+		Vector_t _v;
 
 	}; // template <Field, Vector> class Diagonal<DenseVectorTag>
 
@@ -194,10 +402,13 @@ namespace LinBox
 
 		typedef _Field Field;
 		typedef typename Field::Element    Element;
+        typedef BlasVector<Field> Vector_t;
 
-		Diagonal(const Field F, const std::vector<typename Field::Element>& v);
+		// Diagonal(const Field &F, const std::vector<typename Field::Element>& v);
 
-		Diagonal(const Field F, const size_t n, typename Field::RandIter& iter);
+		Diagonal(const Vector_t& v);
+
+		Diagonal(const Field &F, const size_t n, typename Field::RandIter& iter);
 
 		template<class OutVector, class InVector>
 		OutVector& apply(OutVector& y, const InVector& x) const;
@@ -207,7 +418,7 @@ namespace LinBox
 
 		size_t rowdim(void) const { return _n; }
 		size_t coldim(void) const { return _n; }
-		const Field& field() const {return _field;}
+		const Field& field() const {return *_field;}
 		/** Get an entry and store it in the given value.
 		 * This form is more in the LinBox style and is provided for interface
 		 * compatibility with other parts of the library
@@ -218,7 +429,7 @@ namespace LinBox
 		 */
 		Element &getEntry (Element &x, size_t i, size_t j) const
 		{
-			return (i==j?_field.assign(x,_v[i]):_field.init(x));
+			return (i==j?field().assign(x,_v[i]):field().init(x));
 		}
 
 
@@ -241,27 +452,27 @@ namespace LinBox
 
 		template<typename _Tp1, typename _Vc1>
 		Diagonal(const Diagonal<_Tp1,_Vc1>& D, const Field& F) :
-			_field(F), _n(D.rowdim()), _v(D.rowdim())
+			_field(&F), _n(D.rowdim()), _v(D.rowdim())
 		{
 			typename Diagonal<_Tp1,_Vc1>::template rebind<Field>() (*this, D, F);
 		}
 
 
 
-		const std::vector<Element>& getData() const { return _v; }
-		std::vector<Element>& getData() { return _v; }
+		const Vector_t& getData() const { return _v; }
+		Vector_t& getData() { return _v; }
 
 
-	private:
+	protected:
 
 		// Field for arithmetic
-		Field _field;
+		const Field *_field;
 
 		// Number of rows and columns of square matrix.
 		size_t _n;
 
 		// STL vector of field elements used in applying matrix.
-		std::vector<Element> _v;
+		Vector_t _v;
 
 	}; // template <Field, Vector> class Diagonal<SparseSequenceVectorTag>
 
@@ -277,10 +488,12 @@ namespace LinBox
 
 		typedef _Field Field;
 		typedef typename Field::Element    Element;
+        typedef BlasVector<Field> Vector_t;
+        
 
-		Diagonal(const Field F, const std::vector<typename Field::Element>& v);
+		Diagonal(const Vector_t& v);
 
-		Diagonal(const Field F, const size_t n, typename Field::RandIter& iter);
+		Diagonal(const Field &F, const size_t n, typename Field::RandIter& iter);
 
 		template<class OutVector, class InVector>
 		OutVector& apply(OutVector& y, const InVector& x) const;
@@ -291,7 +504,7 @@ namespace LinBox
 
 		size_t rowdim(void) const { return _n; }
 		size_t coldim(void) const { return _n; }
-		const Field field() const { return _field; }
+		const Field field() const { return *_field; }
 
 		/** Get an entry and store it in the given value.
 		 * This form is more in the LinBox style and is provided for interface
@@ -303,7 +516,7 @@ namespace LinBox
 		 */
 		Element &getEntry (Element &x, size_t i, size_t j) const
 		{
-			return (i==j?_field.assign(x,_v[i]):_field.init(x));
+			return (i==j?field().assign(x,_v[i]):field().init(x));
 		}
 
 
@@ -330,31 +543,32 @@ namespace LinBox
 			typename Diagonal<_Tp1,_Vc1>::template rebind<Field>() (*this, D, F);
 		}
 
-		const std::vector<Element>& getData() const { return _v; }
-		std::vector<Element>& getData() { return _v; }
+		const Vector_t& getData() const { return _v; }
+		Vector_t& getData() { return _v; }
 
 
 
-	private:
+	protected:
 
 		// Field for arithmetic
-		Field _field;
+		const Field *_field;
 
 		// Number of rows and columns of square matrix.
 		size_t _n;
 
 		// STL vector of field elements used in applying matrix.
-		std::vector<Element> _v;
+		Vector_t _v;
 
 	}; // template <Field, Vector> class Diagonal<SparseAssociativeVectorTag>
 
 	// Method implementations for dense vectors
 	/// constructor from vector
 	template <class Field>
-	inline Diagonal<Field, VectorCategories::DenseVectorTag >::Diagonal(const Field F,
-									    const std::vector<typename Field::Element>& v) :
-		_field(F), _n(v.size()), _v(v)
-	{}
+	inline Diagonal<Field, VectorCategories::DenseVectorTag >::Diagonal( const Vector_t& v) :
+		_field(&v.field()), _n(v.size()), _v(v)
+	{
+		// std::cout << _v.size() << ',' << _v.getPointer() << std::endl;
+	}
 
 
 	/*!
@@ -364,13 +578,12 @@ namespace LinBox
 	 * @param nonsing non-singular matrix ? (no zero on diagonal ?)
 	 */
 	template <class _Field>
-	inline Diagonal<_Field, VectorCategories::DenseVectorTag>::Diagonal(const Field F,
+	inline Diagonal<_Field, VectorCategories::DenseVectorTag>::Diagonal(const Field &F,
 									    const size_t n,
-									    bool nonsing) :
-		_field(F), _n(n), _v(n)
+									    bool nonsing) : //!@bug this should not be bool but enum
+		_field(&F), _n(n), _v(F,n)
 	{
 		typename Field::RandIter r(F);
-		typedef typename std::vector<typename Field::Element>::iterator iter;
 		if (nonsing)
 			randomNonsingular();
 		else
@@ -379,10 +592,10 @@ namespace LinBox
 
 	//! random diagonal matrix of size n
 	template <class Field>
-	inline Diagonal<Field, VectorCategories::DenseVectorTag >::Diagonal(const Field F,
+	inline Diagonal<Field, VectorCategories::DenseVectorTag >::Diagonal(const Field &F,
 									    const size_t n,
 									    typename Field::RandIter& iter) :
-		_field(F), _n(n), _v(n)
+		_field(&F), _n(n), _v(F,n)
 	{
 #if 0
 		for (typename std::vector<typename Field::Element>::iterator
@@ -396,8 +609,8 @@ namespace LinBox
 	template <class _Field>
 	inline void Diagonal<_Field, VectorCategories::DenseVectorTag>::random()
 	{
-		typename Field::RandIter r(_field);
-		typedef typename std::vector<typename Field::Element>::iterator iter;
+		typename Field::RandIter r(field());
+		typedef typename Vector_t::iterator iter;
 		for (iter i = _v.begin(); i < _v.end(); ++i)
 			r.random(*i);
 	}
@@ -406,10 +619,10 @@ namespace LinBox
 	template <class _Field>
 	inline void Diagonal<_Field, VectorCategories::DenseVectorTag>::randomNonsingular()
 	{
-		typename Field::RandIter r(_field);
-		typedef typename std::vector<typename Field::Element>::iterator iter;
+		typename Field::RandIter r(field());
+		typedef typename Vector_t::iterator iter;
 		for (iter i = _v.begin(); i < _v.end(); ++i)
-			while (_field.isZero(r.random(*i))) ;
+			while (field().isZero(r.random(*i))) ;
 	}
 
 	/*! generic apply.
@@ -424,7 +637,7 @@ namespace LinBox
 		linbox_check (_n == x.size ());
 
 		// Create iterators for input, output, and stored vectors
-		typename std::vector<Element>::const_iterator v_iter;
+		typename Vector_t::const_iterator v_iter;
 		typename InVector::const_iterator x_iter;
 		typename OutVector::iterator y_iter;
 
@@ -436,8 +649,8 @@ namespace LinBox
 		// vector elements to create output vector element.
 		for (y_iter = y.begin ();
 		     y_iter != y.end ();
-		     y_iter++, v_iter++, x_iter++)
-			_field.mul (*y_iter, *v_iter, *x_iter);
+		     ++y_iter, ++v_iter, ++x_iter)
+			field().mul (*y_iter, *v_iter, *x_iter);
 
 		return y;
 	} // Vector& Diagonal<DenseVectorTag>::apply(Vector& y, const Vector&) const
@@ -449,9 +662,8 @@ namespace LinBox
 	 * @param v  vector
 	 */
 	template <class Field>
-	inline Diagonal<Field, VectorCategories::SparseSequenceVectorTag >::Diagonal(const Field F,
-										     const std::vector<typename Field::Element>& v) :
-		_field(F), _n(v.size()), _v(v)
+	inline Diagonal<Field, VectorCategories::SparseSequenceVectorTag >::Diagonal( const Vector_t& v) :
+		_field(&v.field()), _n(v.size()), _v(v)
 	{}
 
 	/** apply for sparse sequence vectors.
@@ -467,13 +679,11 @@ namespace LinBox
 		y.clear (); // we'll overwrite using push_backs.
 
 		// create field elements and size_t to be used in calculations
-		size_t i;
-		Element zero, entry;
-		_field.init (zero, 0);
-		_field.init (entry, 0);
+		Element  entry;
+		field().assign (entry, field().zero);
 
 		// Create iterators for input and stored vectors
-		typename std::vector<Element>::const_iterator v_iter;
+		typename Vector_t::const_iterator v_iter;
 		typename InVector::const_iterator x_iter;
 
 		// Start at beginning of _v vector
@@ -482,10 +692,11 @@ namespace LinBox
 		// Iterator over indices of input vector.
 		// For each element, multiply input element with corresponding element
 		// of stored vector and insert non-zero elements into output vector
-		for (x_iter = x.begin (); x_iter != x.end (); x_iter++) {
+		for (x_iter = x.begin (); x_iter != x.end (); ++x_iter) {
+			size_t i;
 			i = (*x_iter).first;
-			_field.mul (entry, *(v_iter + i), (*x_iter).second);
-			if (!_field.isZero (entry)) y.push_back ( std::pair<size_t, Element>(i, entry));
+			field().mul (entry, *(v_iter + i), (*x_iter).second);
+			if (!field().isZero (entry)) y.push_back ( std::pair<size_t, Element>(i, entry));
 		}
 
 		return y;
@@ -498,8 +709,8 @@ namespace LinBox
 	 * @param v  vector
 	 */
 	template <class Field>
-	inline Diagonal<Field, VectorCategories::SparseAssociativeVectorTag >::Diagonal(const Field F, const std::vector<typename Field::Element>& v) :
-		_field(F), _n(v.size()), _v(v)
+	inline Diagonal<Field, VectorCategories::SparseAssociativeVectorTag >::Diagonal(const Vector_t& v) :
+		_field(&v.field()), _n(v.size()), _v(v)
 	{}
 
 	/** apply for sparse associative vectors.
@@ -515,13 +726,11 @@ namespace LinBox
 		y.clear (); // we'll overwrite using inserts
 
 		// create field elements and size_t to be used in calculations
-		size_t i;
-		Element zero, entry;
-		_field.init (zero, 0);
-		_field.init (entry, 0);
+		Element  entry;
+		field().assing (entry, field().zero);
 
 		// Create iterators for input and stored vectors
-		typename std::vector<Element>::const_iterator v_iter;
+		typename Vector_t::const_iterator v_iter;
 		typename InVector::const_iterator x_iter;
 
 		// Start at beginning of _v vector
@@ -530,26 +739,29 @@ namespace LinBox
 		// Iterator over indices of input vector.
 		// For each element, multiply input element with corresponding element
 		// of stored vector and insert non-zero elements into output vector
-		for (x_iter = x.begin (); x_iter != x.end (); x_iter++)
+		for (x_iter = x.begin (); x_iter != x.end (); ++x_iter)
 		{
+		size_t i;
 			i = x_iter->first;
-			_field.mul (entry, *(v_iter + i), (*x_iter).second);
-			if (!_field.isZero (entry)) y.insert (y.end (), std::pair<size_t, Element>(i, entry));
+			field().mul (entry, *(v_iter + i), (*x_iter).second);
+			if (!field().isZero (entry)) y.insert (y.end (), std::pair<size_t, Element>(i, entry));
 		}
 
 		return y;
 	} // Vector& Diagonal<SparseAssociativeVectorTag>::apply(...) const
 
+	template<class Field, class Trait> struct GetEntryCategory<Diagonal<Field, Trait> >
+	{ typedef SolutionTags::Local Tag; };
+
 } // namespace LinBox
 
 #endif // __LINBOX_diagonal_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/direct-sum.h b/linbox/blackbox/direct-sum.h
index 4796706..3cf44f8 100644
--- a/linbox/blackbox/direct-sum.h
+++ b/linbox/blackbox/direct-sum.h
@@ -28,6 +28,7 @@
 
 #include "linbox/blackbox/null-matrix.h"
 #include "linbox/vector/vector-traits.h"
+#include "linbox/matrix/matrix-traits.h"
 #include "linbox/blackbox/blackbox-interface.h"
 #include "linbox/vector/subvector.h"
 #include "linbox/matrix/matrix-domain.h"
@@ -216,6 +217,12 @@ namespace LinBox
 		const Blackbox1* getLeftPtr() const {return  _Ap;}
 		const Blackbox2* getRightPtr() const {return  _Bp;}
 
+		std::ostream & write(std::ostream & os) const
+		{
+		        _Ap->write(os); _Bp->write(os << '+') ;
+			return os ;
+		}
+
 	protected:
 		// the direct summands
 		const Blackbox1* _Ap;
@@ -303,8 +310,8 @@ namespace LinBox
 			int offset_y = 0;
 			typename std::vector<const Blackbox* >::const_iterator bp;
 			for(bp = _VB.begin(); bp != _VB.end(); ++bp){
-				const Subvector<typename InVector::const_iterator> x1(x.begin() + offset_x, x.begin() + (offset_x + (*bp)->coldim()));
-				Subvector<typename OutVector::iterator> y1(y.begin() + offset_y, y.begin() + (offset_y + (*bp)->rowdim()));
+				const Subvector<typename InVector::const_iterator> x1(x.begin() + offset_x, x.begin() + (ptrdiff_t) ((unsigned long)offset_x + (*bp)->coldim()));
+				Subvector<typename OutVector::iterator> y1(y.begin() + offset_y, y.begin() + (ptrdiff_t) ((unsigned long)offset_y + (*bp)->rowdim()));
 				(*bp)->apply(y1,x1);
 				offset_x += (int) (*bp)->coldim();
 				offset_y += (int) (*bp)->rowdim();
@@ -323,8 +330,8 @@ namespace LinBox
 			int offset_y = 0;
 			typename std::vector<const Blackbox* >::const_iterator bp;
 			for(bp = _VB.begin(); bp != _VB.end(); ++bp){
-				const Subvector<typename InVector::const_iterator> x1(x.begin() + offset_x, x.begin() + (offset_x + (*bp)->rowdim()));
-				Subvector<typename OutVector::iterator> y1(y.begin() + offset_y, y.begin() + (offset_y + (*bp)->coldim()));
+				const Subvector<typename InVector::const_iterator> x1(x.begin() + offset_x, x.begin() +(ptrdiff_t) ((unsigned long)offset_x + (*bp)->rowdim()));
+				Subvector<typename OutVector::iterator> y1(y.begin() + offset_y, y.begin() + (ptrdiff_t) ((unsigned long)offset_y + (*bp)->coldim()));
 				(*bp)->applyTranspose(y1,x1);
 				offset_x += (int) (*bp)->rowdim();
 				offset_y += (int) (*bp)->coldim();
@@ -352,6 +359,15 @@ namespace LinBox
 		size_t size() const {
 			return this->_VB.size();
 		}
+		std::ostream & write(std::ostream & os) const
+		{
+			typename std::vector<const Blackbox* >::const_iterator bp;
+			for(bp = _VB.begin(); bp != _VB.end(); ++bp){
+		        (*bp)->write(os);
+			}
+			return os ;
+		}
+
 	protected:
 		std::vector<const Blackbox* > _VB;
 		size_t m;
@@ -360,7 +376,6 @@ namespace LinBox
 
 
 
-	template <class Matrix> struct MatrixTraits;
 
 // #if !defined __INTEL_COMPILER && !defined(__clang__)
 	// template<>
@@ -602,6 +617,9 @@ namespace LinBox
 		DirectSumOwner (const DirectSum<_BBt> &M, const Field& F) :
 			_VB_data( M.size() ), m( M.rowdim() ), n( M.coldim())
 		{
+			// for (size_t i = 0 ; i < M.size() ; ++i)
+				// _VB_data[i].changeField(F);
+
 			typename DirectSum<_BBt>::template rebind<Field>()(*this, M);
 		}
 
@@ -622,8 +640,8 @@ namespace LinBox
 			int offset_y = 0;
 			typename ListBB_t::const_iterator bp;
 			for(bp = _VB_data.begin(); bp != _VB_data.end(); ++bp){
-				const Subvector<typename InVector::const_iterator> x1(x.begin() + offset_x, x.begin() + (offset_x + bp->coldim()));
-				Subvector<typename OutVector::iterator> y1(y.begin() + offset_y, y.begin() + (offset_y + bp->rowdim()));
+				const Subvector<typename InVector::const_iterator> x1(x.begin() + (ptrdiff_t)offset_x, x.begin() + (offset_x + (int)bp->coldim()));
+				Subvector<typename OutVector::iterator> y1(y.begin() + (ptrdiff_t)offset_y, y.begin() + (offset_y + (int)bp->rowdim()));
 				bp->apply(y1,x1);
 				offset_x += (int) bp->coldim();
 				offset_y += (int) bp->rowdim();
@@ -642,8 +660,8 @@ namespace LinBox
 			int offset_y = 0;
 			typename ListBB_t::const_iterator bp;
 			for(bp = _VB_data.begin(); bp != _VB_data.end(); ++bp){
-				const Subvector<typename InVector::const_iterator> x1(x.begin() + offset_x, x.begin() + (offset_x + bp->rowdim()));
-				Subvector<typename OutVector::iterator> y1(y.begin() + offset_y, y.begin() + (offset_y + bp->coldim()));
+				const Subvector<typename InVector::const_iterator> x1(x.begin() +(ptrdiff_t) offset_x, x.begin() + (ptrdiff_t)(offset_x + (int)bp->rowdim()));
+				Subvector<typename OutVector::iterator> y1(y.begin() + (ptrdiff_t)offset_y, y.begin() + (ptrdiff_t)(offset_y + (int)bp->coldim()));
 				bp->applyTranspose(y1,x1);
 				offset_x += (int)bp->rowdim();
 				offset_y += (int)bp->coldim();
@@ -688,11 +706,10 @@ namespace LinBox
 #endif // __LINBOX_direct_sum_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/fibb-product.h b/linbox/blackbox/fibb-product.h
new file mode 100644
index 0000000..e5ed032
--- /dev/null
+++ b/linbox/blackbox/fibb-product.h
@@ -0,0 +1,418 @@
+/* linbox/blackbox/fibb-product.h
+ * Copyright (C) 2015 bds for LinBox Team.  See linbox/COPYING.LESSER for License info.
+ *
+ * Written by bds
+ */
+// todo: possiby merge with compose blackbox
+#ifndef LB_FIBBProduct_H
+#define LB_FIBBProduct_H
+
+#include "linbox/blackbox/fibb.h"
+
+namespace LinBox{
+
+template<class Field_> 
+struct FIBBProduct : public FIBB<Field_> { // Fast Inverse BlackBox
+	typedef Field_ Field;
+	typedef FIBB<Field> Father_t;
+	typedef FIBBProduct<Field> Self_t;
+  protected: 
+	const Field* field_;
+	const FIBB<Field>** factors_;
+	size_t n_;
+	bool alloc_; // true only if new used within construction of factors_
+	bool alloc_members_; // true only if new used to construct members.
+	// (all or nothing ownership of members)
+	const FIBB<Field>& head() const { return *(factors_[0]); }
+	FIBBProduct<Field>& tail (FIBBProduct<Field>& A) const
+	{ A.field_ = field_; 
+	  A.factors_ = factors_ + 1; A.n_ = n_-1; 
+	  A.alloc_ = A.alloc_members_ = false; 
+	  return A;
+	}
+  public:
+    using Element = typename Father_t::Element;
+    using Matrix = typename Father_t::Matrix;
+
+	/* Blackbox functions */
+	BBType bbTag() const { return product; }
+	size_t rowdim() const;
+	size_t coldim() const;
+	const Field& field() const;
+	Matrix& applyRight(Matrix& Y, const Matrix& X) const; // Y = AX
+	Matrix& applyLeft(Matrix& Y, const Matrix& X) const; // Y = XA
+	// todo: rebind - hom support
+	std::istream& read(std::istream& is);
+	std::ostream& write(std::ostream& os) const;
+
+	/* fibb functions */
+	size_t& rank(size_t& r) const;
+
+	Element& det(Element& d) const;
+
+	Matrix& solveRight(Matrix& Y, const Matrix& X) const; 
+	/// Y: YA = X, for this A
+	Matrix& solveLeft(Matrix& Y, const Matrix& X) const; 
+
+	/// N: AN = 0, each col random.
+	Matrix& nullspaceRandomRight(Matrix& N) const; 
+	/// N: NA = 0, each row random.
+	Matrix& nullspaceRandomLeft(Matrix& N) const; 
+
+	/* nullspaceBasisRight and nullspaceBasisLeft */
+	/** B: columns are a right nullspace basis for this A.
+		
+		B is resized and filled so that:
+		(1) AB = 0, (2) Ax = 0 => exists y: x = By, and (3) B has full rank.
+	*/
+	DenseMatrix<Field>& nullspaceBasisRight(DenseMatrix<Field>& B) const; 
+	/// BA= 0 and xA = 0 => exists y: x = yB and B full rank.
+	DenseMatrix<Field>& nullspaceBasisLeft(DenseMatrix<Field>& B) const; 
+
+	/* cstors, dstor, initializers */
+//	FIBBProduct();
+	FIBBProduct(const Field& F);
+//	FIBBProduct(const FIBBProduct<Field>& A);
+	FIBBProduct(const FIBB<Field>& A1, const FIBB<Field>& A2);
+	FIBBProduct(const FIBB<Field>& A1, const FIBB<Field>& A2, 
+				const FIBB<Field>& A3);
+	FIBBProduct(const FIBB<Field>& A1, const FIBB<Field>& A2, 
+				const FIBB<Field>& A3, const FIBB<Field>& A4);
+	FIBBProduct(const FIBB<Field>& A1, const FIBB<Field>& A2, 
+				const FIBB<Field>& A3, const FIBB<Field>& A4, 
+				const FIBB<Field>& A5);
+	~FIBBProduct();
+	FIBBProduct& init(const FIBB<Field>& A1);
+	FIBBProduct& init(const FIBB<Field>& A1, const FIBB<Field>& A2);
+	FIBBProduct& init(const FIBB<Field>& A1, const FIBB<Field>& A2, 
+					  const FIBB<Field>& A3);
+	FIBBProduct& init(const FIBB<Field>& A1, const FIBB<Field>& A2, 
+					  const FIBB<Field>& A3, const FIBB<Field>& A4);
+	FIBBProduct& init(const FIBB<Field>& A1, const FIBB<Field>& A2, 
+					  const FIBB<Field>& A3, const FIBB<Field>& A4, 
+					  const FIBB<Field>& A5);
+    // product and owner of heap allocated FIBBs
+	FIBBProduct& incorporate(const FIBB<Field>* A1,
+			const FIBB<Field>* A2 = NULL, const FIBB<Field>* A3 = NULL,
+			const FIBB<Field>* A4 = NULL, const FIBB<Field>* A5 = NULL);
+	const FIBB<Field>& operator[](size_t i) ;
+
+}; // class FIBBProduct
+}// namespace LinBox
+#endif // LB_FIBBProduct_H
+
+// blackbox/FIBBProduct.inl
+#ifndef LB_FIBBProduct_INL
+#define LB_FIBBProduct_INL
+namespace LinBox {
+
+// Blackbox interface
+template<class Field> size_t FIBBProduct<Field>:: 
+rowdim() const { return n_ > 0 ? factors_[0]->rowdim() : 0; }
+
+template<class Field> size_t FIBBProduct<Field>:: 
+coldim() const { return n_ > 0 ? factors_[n_-1]->coldim() : 0; }
+
+template<class Field> const Field& FIBBProduct<Field>:: 
+field() const { return *field_; }
+
+template<class Field> typename FIBBProduct<Field>::Matrix& FIBBProduct<Field>:: 
+applyRight(typename FIBBProduct<Field>::Matrix& Y, const typename FIBBProduct<Field>::Matrix& X) const
+{	if (n_==0) return Y;
+	if (n_==1) return head().applyRight(Y,X);
+	const FIBB<Field>& A = head();
+	FIBBProduct<Field> B(field()); tail(B);
+	Matrix X1(field(), B.rowdim(), X.coldim());
+	B.applyRight(X1, X);
+	A.applyRight(Y, X1);
+	return Y;
+}
+
+template<class Field> typename FIBBProduct<Field>::Matrix& FIBBProduct<Field>:: 
+applyLeft(typename FIBBProduct<Field>::Matrix& Y, const typename FIBBProduct<Field>::Matrix& X) const
+{	if (n_==0) return Y;
+	if (n_==1) return head().applyLeft(Y,X);
+	const FIBB<Field>& A = head();
+	FIBBProduct<Field> B(field()); tail(B);
+	Matrix X1(field(), X.rowdim(), B.coldim());
+	A.applyLeft(X1, X);
+	B.applyLeft(Y, X1);
+  	return Y;
+}
+
+/* rebind - hom support
+*/
+// todo: read
+template<class Field> std::istream& FIBBProduct<Field>:: 
+read(std::istream& is) 
+{ return is; }
+
+template<class Field> std::ostream& FIBBProduct<Field>:: 
+write(std::ostream& os) const
+{	os << std::endl << "%%MatrixMarket matrix composite integer general" << std::endl;
+	field().write(os << "% written by LinBox::FIBBProduct< ") << " >" << std::endl;
+	os << n_;
+	for (size_t i = 0; i < n_; ++i) 
+		factors_[i]->write(os << std::endl);
+	return os;
+}
+
+template<class Field> size_t& FIBBProduct<Field>:: 
+rank( size_t& r ) const
+{	if (n_ == 0) return r = 0;
+	factors_[0]->rank(r);
+	size_t s;
+	for (size_t i = 1; i < n_; ++i) 
+		r = std::min(r, factors_[i]->rank(s));
+	return r;
+}
+
+template<class Field> typename FIBBProduct<Field>::Element& FIBBProduct<Field>:: 
+det( typename FIBBProduct<Field>::Element& d ) const
+{	if (n_==0) return field().assign(d, field().one);
+	factors_[0]->det(d); 
+	typename Field::Element e; field().init(e);
+	for (size_t i = 1; i < n_; ++i) 
+		field().mulin(d, factors_[i]->det(e));
+	return d;
+}
+
+template<class Field> typename FIBBProduct<Field>::Matrix& FIBBProduct<Field>:: 
+solveRight( typename FIBBProduct<Field>::Matrix& Y, const typename FIBBProduct<Field>::Matrix& X ) const
+{	if (n_==0) return Y;
+	if (n_==1) return head().solveRight(Y,X);
+	const FIBB<Field>& A = head();
+	FIBBProduct<Field> B(field()); tail(B);
+	Matrix Z(field(), A.coldim(), X.coldim());
+	A.solveRight(Z,X); // A1*Z = X
+	return B.solveRight(Y,Z); // A2*Y = Z
+}
+
+template<class Field> typename FIBBProduct<Field>::Matrix& FIBBProduct<Field>:: 
+solveLeft( typename FIBBProduct<Field>::Matrix& Y, const typename FIBBProduct<Field>::Matrix& X ) const
+{	if (n_==0) return Y;
+	if (n_==1) return head().solveLeft(Y,X);
+	const FIBB<Field>& A = head();
+	FIBBProduct<Field> B(field()); tail(B);
+	Matrix Z(field(), X.rowdim(), A.coldim()); 
+	B.solveLeft(Z,X); // Z*A2 = X
+	return A.solveLeft(Y,Z); // Y*A1 = Z
+}
+
+template<class Field> typename FIBBProduct<Field>::Matrix& FIBBProduct<Field>:: 
+nullspaceRandomRight( typename FIBBProduct<Field>::Matrix& N ) const // N: ABN = 0
+{
+ 	if (n_==0) return N;
+	if (n_==1) return head().nullspaceRandomRight(N);
+	size_t r;
+	const FIBB<Field>& A = head();
+	FIBBProduct<Field> B(field()); tail(B);
+	if (A.rowdim() == A.coldim() and A.rank(r) == A.coldim())
+		return B.nullspaceRandomRight(N);
+	else
+	{	Matrix N1(N);
+		A.nullspaceRandomRight(N1);
+		B.solveRight(N,N1);
+		return N;
+		// a solveRightin would be good if B is a perm.
+	}
+}
+
+template<class Field> typename FIBBProduct<Field>::Matrix& FIBBProduct<Field>:: 
+nullspaceRandomLeft( typename FIBBProduct<Field>::Matrix& N ) const
+{	if (n_==0) return N;
+	if (n_==1) return head().nullspaceRandomLeft(N);
+	size_t r;
+	const FIBB<Field>& A = head();
+	FIBBProduct<Field> B(field()); tail(B);
+	if (B.rowdim() == B.coldim() and B.rank(r) == B.coldim())
+		return A.nullspaceRandomLeft(N);
+	else
+	{	Matrix N1(N);
+		B.nullspaceRandomLeft(N1);
+		return A.solveLeft(N,N1);
+		// a solveLeftin would be good if A is a perm.
+	}
+}
+
+/*
+template<class Field> typename FIBBProduct<Field>::Matrix& FIBBProduct<Field>:: 
+genericNullspaceRandomRight( typename FIBBProduct<Field>::Matrix& N ) const
+{	Matrix X(field(), rowdim(), N.coldim());
+	Matrix R(field(), coldim(), N.coldim());
+	R.random();
+	applyRight(X, R); // X: X = AR
+	solveRight(N, X); // N: AN = X = AR
+	return DenseMatrixDomain<Field>(field()).subin(N, R);
+}
+
+template<class Field> Matrix& FIBBProduct<Field>:: 
+genericNullspaceRandomLeft( Matrix& N ) const
+{	Matrix X(field(), N.rowdim(), rowdim());
+	Matrix R(field(), N.rowdim(), coldim());
+	R.random();
+	applyLeft(X, R); // X: X = RA
+	solveLeft(N, X); // N: NA = RA
+	return BlasMatrixDomain<Field>(field()).subin(N, R);
+}
+*/
+
+template<class Field> DenseMatrix<Field>& FIBBProduct<Field>:: 
+nullspaceBasisRight( DenseMatrix<Field>& N ) const
+{	if (n_==0) { N.resize(0,0); return N; }
+	if (n_==1) return head().nullspaceBasisRight(N);
+	size_t r;
+	const FIBB<Field>& A = head();
+	FIBBProduct<Field> B(field()); tail(B);
+	if (A.rowdim() == A.coldim() and A.rank(r) == A.rowdim())
+	 	B.nullspaceBasisRight(N);
+	else 
+	{	Matrix N1(field());
+		A.nullspaceBasisRight(N1);
+		N.resize(N1.rowdim(), N1.coldim());
+		B.solveRight(N, N1);
+	}
+	return N;
+}
+
+template<class Field> DenseMatrix<Field>& FIBBProduct<Field>:: 
+nullspaceBasisLeft( DenseMatrix<Field>& N ) const
+{	if (n_==0) { N.resize(0,0); return N; }
+	if (n_==1) return head().nullspaceBasisLeft(N);
+	size_t r;
+	const FIBB<Field>& A = head();
+
+	FIBBProduct<Field> B(field()); tail(B);
+	if (B.rowdim() == B.coldim() and B.rank(r) == B.rowdim())
+	 	A.nullspaceBasisLeft(N);
+	else 
+	{	Matrix N1(field());
+		B.nullspaceBasisLeft(N1);
+		N.resize(N1.rowdim(), N1.coldim());
+		A.solveLeft(N, N1);
+	}
+	return N;
+}
+
+/* cstors, dstor */
+template<class Field> FIBBProduct<Field>::
+FIBBProduct(const Field& F) 
+: field_(&F), factors_(0), n_(0), alloc_(false), alloc_members_(false) 
+{}
+
+//template<class Field> FIBBProduct<Field>::
+//FIBBProduct(const FIBBProduct<Field>& A): Ap(A.Ap), Bp(A.Bp), allocA(A.allocA), allocB(A.allocB)
+//{}
+
+template<class Field> FIBBProduct<Field>:: 
+FIBBProduct( const FIBB<Field>& A1, const FIBB<Field>& A2 ) 
+: field_(0), factors_(0), n_(0), alloc_(false), alloc_members_(false) 
+{ init(A1, A2); } 
+
+template<class Field> FIBBProduct<Field>:: 
+FIBBProduct( const FIBB<Field>& A1, const FIBB<Field>& A2, 
+			 const FIBB<Field>& A3 ) 
+: field_(0), factors_(0), n_(0), alloc_(false), alloc_members_(false) 
+{ init(A1, A2, A3); }
+
+template<class Field> FIBBProduct<Field>:: 
+FIBBProduct( const FIBB<Field>& A1, const FIBB<Field>& A2, 
+			 const FIBB<Field>& A3, const FIBB<Field>& A4 ) 
+: field_(0), factors_(0), n_(0), alloc_(false), alloc_members_(false) 
+{ init(A1, A2, A3, A4); }
+
+template<class Field> FIBBProduct<Field>:: 
+FIBBProduct( const FIBB<Field>& A1, const FIBB<Field>& A2, 
+			 const FIBB<Field>& A3, const FIBB<Field>& A4, 
+			 const FIBB<Field>& A5 ) 
+: field_(0), factors_(0), n_(0), alloc_(false), alloc_members_(false) 
+{ init(A1, A2, A3, A4, A5); }
+
+template<class Field> FIBBProduct<Field>:: 
+~FIBBProduct()
+{	if (alloc_members_) 
+		for(size_t i = 0; i < n_; ++i) delete factors_[i];
+	if (alloc_) delete[] factors_; 
+}
+
+/* initializers */
+
+template<class Field> FIBBProduct<Field>& FIBBProduct<Field>:: 
+init( const FIBB<Field>& A )
+{	field_ = &(A.field()); 
+	if (alloc_ and factors_) delete[] factors_;
+	factors_ = new const FIBB<Field>*[1]; n_ = 1; 
+	alloc_ = true; alloc_members_ = false;
+	factors_[0] = &A;
+	return *this;
+}
+
+template<class Field> FIBBProduct<Field>& FIBBProduct<Field>:: 
+init( const FIBB<Field>& A1, const FIBB<Field>& A2 )
+{	field_ = &(A1.field()); 
+	if (alloc_ and factors_) delete[] factors_;
+	factors_ = new const FIBB<Field>*[2]; n_ = 2; 
+	alloc_ = true; alloc_members_ = false;
+	factors_[0] = &A1; factors_[1] = &A2; 
+	return *this;
+}
+
+template<class Field> FIBBProduct<Field>& FIBBProduct<Field>:: 
+init( const FIBB<Field>& A1, const FIBB<Field>& A2, 
+	  const FIBB<Field>& A3 )
+{	field_ = &(A1.field()); 
+	if (alloc_ and factors_) delete[] factors_;
+	factors_ = new const FIBB<Field>*[3]; n_ = 3; 
+	alloc_ = true; alloc_members_ = false;
+	factors_[0] = &A1; factors_[1] = &A2; 
+	factors_[2] = &A3; 
+	return *this;
+}
+
+template<class Field> FIBBProduct<Field>& FIBBProduct<Field>:: 
+init( const FIBB<Field>& A1, const FIBB<Field>& A2, 
+	  const FIBB<Field>& A3, const FIBB<Field>& A4 )
+{	field_ = &(A1.field()); 
+	if (alloc_ and factors_) delete[] factors_;
+	factors_ = new const FIBB<Field>*[4]; n_ = 4; 
+	alloc_ = true; alloc_members_ = false;
+	factors_[0] = &A1; factors_[1] = &A2; 
+	factors_[2] = &A3; factors_[3] = &A4; 
+	return *this;
+}
+
+template<class Field> FIBBProduct<Field>& FIBBProduct<Field>:: 
+init( const FIBB<Field>& A1, const FIBB<Field>& A2, 
+	  const FIBB<Field>& A3, const FIBB<Field>& A4, 
+  	  const FIBB<Field>& A5 )
+{	field_ = &(A1.field()); 
+	if (alloc_ and factors_) delete[] factors_;
+	factors_ = new const FIBB<Field>*[5]; n_ = 5; 
+	alloc_ = true; alloc_members_ = false;
+	factors_[0] = &A1; factors_[1] = &A2; 
+	factors_[2] = &A3; factors_[3] = &A4; 
+	factors_[4] = &A5;
+	return *this;
+}
+
+template<class Field> FIBBProduct<Field>& FIBBProduct<Field>:: 
+incorporate(const FIBB<Field>* A1,
+			const FIBB<Field>* A2, const FIBB<Field>* A3,
+			const FIBB<Field>* A4, const FIBB<Field>* A5)
+{
+	if (A2 == NULL) init(*A1);
+	if (A3 == NULL) init(*A1,*A2);
+	if (A4 == NULL) init(*A1,*A2,*A3);
+	if (A5 == NULL) init(*A1,*A2,*A3,*A4);
+	else 			init(*A1,*A2,*A3,*A4,*A5);
+	alloc_members_ = true;
+	return *this;
+}
+
+template<class Field> const FIBB<Field>& FIBBProduct<Field>::
+operator[](size_t i) 
+{ return *(factors_[i]); }
+
+}// namespace LinBox
+
+#endif // LB_FIBBProduct_INL
diff --git a/linbox/blackbox/fibb.h b/linbox/blackbox/fibb.h
new file mode 100644
index 0000000..c49a337
--- /dev/null
+++ b/linbox/blackbox/fibb.h
@@ -0,0 +1,111 @@
+/* linbox/blackbox/fibb.h
+ * Copyright (C) 2015 bds for LinBox Team.  See linbox/COPYING.LESSER for License info.
+ *
+ * Written by bds
+ */
+#ifndef LB_FIBB_H
+#define LB_FIBB_H
+
+/*
+FIBB: Fast Inverse BlackBox
+
+The FIBB functions are those of a blackbox plus rank, det, and the solvers: 
+Solve, NullSpaceRandom, NullSpaceBasis. 
+The solvers have left and right forms.
+
+THe FIBBs are Diagonal, Permutation, Triangular, and products of FIBBs in which one or both are nonsingular.
+*/
+#include "linbox/blackbox/bb.h"
+namespace LinBox{
+
+template <class Ring>
+struct FIBB : public BB<Ring> 
+{
+	using Field = Ring;
+	using Element = typename Ring::Element;
+	using ResizableMatrix = DenseMatrix<Field>;
+	using Matrix = DenseMatrix<Field>;
+
+//	virtual const Field& field() const = 0;
+
+	virtual ~FIBB(){}
+
+	virtual size_t& rank(size_t& r) const
+	= 0;
+
+	virtual Element& det( Element& d) const
+	= 0;
+
+	// solveRight and solveLeft
+	/** @brief Y: AY = X, for this A.
+		Solve nonsingular or consistent singular system.  
+		If it is consistent singular, an arbitrary solution is provided.  
+		X and Y must have identical shape.
+
+		Note that Y+Z is a random sample of the solution space after
+		{solveRight(Y, X); nullspaceRandomRight(Z);}.
+
+		Behaviour is unspecified for inconsistent systems (see solveMP).
+	*/
+	virtual Matrix& solveRight(Matrix& Y, const Matrix& X) const 
+	= 0;
+	/// Y: YA = X, for this A
+	virtual Matrix& solveLeft(Matrix& Y, const Matrix& X) const 
+	= 0;
+
+	/// N: AN = 0, each col random.
+	virtual Matrix& nullspaceRandomRight(Matrix& N) const 
+	= 0;
+	/// N: NA = 0, each row random.
+	virtual Matrix& nullspaceRandomLeft(Matrix& N) const 
+	= 0;
+	// this generic is virtual so that it may be specialized for performance
+
+	// nullspaceBasisRight and nullspaceBasisLeft
+
+	/** B: columns are a right nullspace basis for this A.
+		
+		B is resized and filled so that:
+		(1) AB = 0, (2) Ax = 0 => exists y: x = By, and (3) B has full rank.
+	*/
+	virtual ResizableMatrix& nullspaceBasisRight(ResizableMatrix& B) const 
+	= 0;
+	/// BA= 0 and xA = 0 => exists y: x = yB and B full rank.
+	virtual ResizableMatrix& nullspaceBasisLeft(ResizableMatrix& B) const 
+	= 0;
+}; // class FIBB
+
+/// N: AN = 0, each col random.
+template<class Field>
+DenseMatrix<Field>& genericNullspaceRandomRight(DenseMatrix<Field>& N, const FIBB<Field>& A)
+//DenseMatrix<Field, std::vector<typename Field::Element> >& genericNullspaceRandomRight(DenseMatrix<Field, std::vector<typename Field::Element> >& N, const FIBB<Field>& A)
+{	typedef DenseMatrix<Field> ResizableMatrix;
+	typedef DenseMatrix<Field> Matrix;
+	ResizableMatrix Xb(A.field(), N.rowdim(), N.coldim());
+	ResizableMatrix Yb(A.field(), A.rowdim(), N.coldim());
+	Matrix X(Xb); X.random();
+	Matrix Y(Yb); 
+	A.applyRight(Y, X); // Y = AX
+	A.solveRight(N, Y); // AN = AX
+	BlasMatrixDomain<Field> MD(A.field());
+	return MD.subin(N, X);
+}
+
+/// N: NA = 0, each row random.
+template<class Field>
+DenseMatrix<Field>& genericNullspaceRandomLeft(DenseMatrix<Field>& N, const FIBB<Field>& A)
+//DenseMatrix<Field, std::vector<typename Field::Element> >& genericNullspaceRandomLeft(DenseMatrix<Field, std::vector<typename Field::Element> >& N, const FIBB<Field>& A)
+{	typedef DenseMatrix<Field> ResizableMatrix;
+	typedef DenseMatrix<Field> Matrix;
+	ResizableMatrix Xb(A.field(), N.rowdim(), N.coldim());
+	ResizableMatrix Yb(A.field(), N.rowdim(), A.coldim());
+	Matrix X(Xb); X.random();
+	Matrix Y(Yb); 
+	A.applyLeft(Y, X); // Y = XA
+	A.solveLeft(N, Y); // NA = XA
+	BlasMatrixDomain<Field> MD(A.field());
+	return MD.subin(N, X);
+}
+
+} // namespace LinBox
+#endif // LB_FIBB_H
diff --git a/linbox/blackbox/frobenius.h b/linbox/blackbox/frobenius.h
index c3871e0..365fd2b 100644
--- a/linbox/blackbox/frobenius.h
+++ b/linbox/blackbox/frobenius.h
@@ -37,9 +37,11 @@
 namespace LinBox
 {
 	/// \ingroup blackbox
-	template <class _Field>
-	class Frobenius: public BlackboxInterface, public DirectSum<Companion<_Field> > {
+	template <class Field_>
+	class Frobenius: public BlackboxInterface, public DirectSum<Companion<Field_> > {
 	public:
+		typedef Field_ Field;
+
 		Frobenius() { }   // default constructor
 
 		/** Constructor.
@@ -49,7 +51,7 @@ namespace LinBox
 		 *    @param vlist diagonal-block sizes, positive ints in non-increasing order
 		 */
 		template <class VDegList>
-		Frobenius( const _Field &F, const VDegList &vlist)
+		Frobenius( const Field &F, const VDegList &vlist)
 		{ }
 
 		/** Constructor.
@@ -60,15 +62,15 @@ namespace LinBox
 		 *    @param pend   iterator pointing after end   of a list of polynomials
 		 */
 		template <class PolyIterator>
-		Frobenius( const _Field &F, PolyIterator pbegin, PolyIterator pend)
+		Frobenius( const Field &F, PolyIterator pbegin, PolyIterator pend)
 		{
-			this->_VB.resize(pend - pbegin);
+			this->_VB.resize((size_t)(pend - pbegin));
 			PolyIterator pp = pbegin;
-			typename std::vector<const Companion<_Field>* >::iterator vp;
+			typename std::vector<const Companion<Field>* >::iterator vp;
 			this->m = 0;
 			this->n = 0;
 			for(vp = this->_VB.begin(); vp != this->_VB.end(); ++vp,++pp)  {
-				*vp = new  Companion<_Field>(F,*pp);
+				*vp = new  Companion<Field>(F,*pp);
 				this->m += (*vp) -> rowdim();
 				this->n += (*vp) -> coldim();
 			}
@@ -78,7 +80,7 @@ namespace LinBox
 		/// destructor
 		~Frobenius()
 		{
-			typename std::vector< const Companion<_Field>* >::iterator vp;
+			typename std::vector< const Companion<Field>* >::iterator vp;
 			for(vp = this->_VB.begin(); vp != this->_VB.end(); ++vp)
 				delete (*vp);
 		}
diff --git a/linbox/blackbox/hilbert.h b/linbox/blackbox/hilbert.h
index 79dc467..eb34712 100644
--- a/linbox/blackbox/hilbert.h
+++ b/linbox/blackbox/hilbert.h
@@ -8,20 +8,20 @@
  * The original hilbert.h, providing one of the first blackbox examples, but not using the JIT feature,
  * was written by Will Turner.
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -39,6 +39,8 @@
 
 #include <vector>
 #include "linbox/blackbox/jit-matrix.h"
+#include "linbox/util/matrix-stream.h"
+#include "linbox/util/write-mm.h"
 
 
 namespace LinBox
@@ -53,7 +55,9 @@ namespace LinBox
 		typedef typename _Field::Element Element;
 
 		/// set up vector of 1/(i+1)
-		Hilbert_JIT_Entry(Field& F, size_t m, size_t n);
+		void init(const Field& F, size_t m, size_t n);
+
+		Hilbert_JIT_Entry(const Field& F, size_t m, size_t n) {init(F, m, n);}
 
 		/// return 1/(i+j+2), zero based indexing.
 		Element& operator()(Element &entry, size_t i, size_t j) const
@@ -68,11 +72,10 @@ namespace LinBox
 
 	/// constructor
 	template<typename _Field>
-	Hilbert_JIT_Entry<_Field>::Hilbert_JIT_Entry(_Field& F, size_t m, size_t n) {
+	void Hilbert_JIT_Entry<_Field>::init(const _Field& F, size_t m, size_t n) {
 
-		Element temp, one;
-		F.init(one, 1);
-		F.init(temp, 0);
+		Element temp;
+		F.assign(temp, F.zero);
 
 		_vecH = std::vector<Element>(m+n, temp);
 
@@ -80,7 +83,7 @@ namespace LinBox
 
 		// the ith entry of _vecH = 1/(i+1)
 		for (iter=_vecH.begin(); iter != _vecH.end(); iter++) {
-			F.addin(temp, one);
+			F.addin(temp, F.one);
 			F.inv(*iter, temp);
 		}
 
@@ -96,25 +99,48 @@ namespace LinBox
 	 */
 	template<typename _Field>
 	class Hilbert : public JIT_Matrix<_Field, Hilbert_JIT_Entry<_Field> > {
+		using JIT_Matrix<_Field, Hilbert_JIT_Entry<_Field> >::_m;
+		using JIT_Matrix<_Field, Hilbert_JIT_Entry<_Field> >::_n;
+		using JIT_Matrix<_Field, Hilbert_JIT_Entry<_Field> >::_gen;
 
 	public:
+		typedef _Field Field;
+		using JIT_Matrix<_Field, Hilbert_JIT_Entry<_Field> >::field;
+		using JIT_Matrix<_Field, Hilbert_JIT_Entry<_Field> >::rowdim;
+		using JIT_Matrix<_Field, Hilbert_JIT_Entry<_Field> >::coldim;
 		/** Constructor from field and size.
 		 * @param F the field.
 		 * @param n the size : size_t integer number of rows and columns of matrix.
 		 */
-		Hilbert(_Field& F, size_t n) :
-			JIT_Matrix<_Field, Hilbert_JIT_Entry<_Field> >(F, n, n, Hilbert_JIT_Entry<_Field>(F, n, n))
+		Hilbert(const Field& F, size_t n = 0) :
+			JIT_Matrix<Field, Hilbert_JIT_Entry<Field> >(F, n, n, Hilbert_JIT_Entry<Field>(F, n, n))
 		{};
 
-	};
+		std::ostream& write(std::ostream& os) const
+		{
+			return writeMMPatternHeader(os, *this, 0, "Hilbert");
+		}
 
+		std::istream& read(std::istream& is)
+		{
+			MatrixStream<Field> ms(field(), is);
+			ms.getDimensions(_m, _n);
+			_gen.init(field(), _m, _n);
+			return is;
+		}
 
+		Hilbert(MatrixStream<_Field> &ms) :
+			JIT_Matrix<_Field,Hilbert_JIT_Entry<_Field> >(ms.field())
+		{
+			ms.getDimensions(_m, _n);
+			_gen.init(field(), _m, _n);
+		}
+	};
 
 }//LinBox Namespace
 
 #endif //__LINBOX_hilbert_H
 
-
 // vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
diff --git a/linbox/blackbox/inverse.h b/linbox/blackbox/inverse.h
index 6d9b266..5e98449 100644
--- a/linbox/blackbox/inverse.h
+++ b/linbox/blackbox/inverse.h
@@ -60,13 +60,16 @@ namespace LinBox
 
 		typedef typename Blackbox::Field Field;
 		typedef typename Field::Element   Element;
-		typedef std::vector<Element>      Polynomial;
+		typedef BlasVector<Field>      Polynomial;
 
 		/** Constructor from field and dense vector of field elements.
 		 * @param BB   Black box of which to get the inverse
 		 */
 		Inverse (const Blackbox *BB) :
 			_VD (BB->field()), _BB (BB)
+			, _minpoly(BB->field())
+			, _transposeMinpoly(BB->field())
+			, _z(BB->field())
 		{
 			linbox_check ((BB->rowdim ()) == (BB->coldim ()));
 
@@ -81,7 +84,11 @@ namespace LinBox
 		 * another black box
 		 */
 		Inverse (const Inverse &BB) :
-			_VD (BB->field()), _BB (BB._BB), _minpoly (BB._minpoly)
+			_VD (BB->field()), _BB (BB._BB)
+			, _minpoly (BB._minpoly)
+			, _z(BB->field())
+			, _transposeMinpoly(BB->field())
+
 		{
 			_z.resize (_BB->coldim ());
 		}
@@ -102,7 +109,7 @@ namespace LinBox
 			int i;
 
 			if (_minpoly.empty ()) {
-				Polynomial _mp1;
+				Polynomial _mp1(field());
 				Element a0;
 
 				minpoly (_mp1, *_BB);
@@ -113,16 +120,16 @@ namespace LinBox
 				field().negin (a0);
 
 				for (i = 1; i < (int) _mp1.size (); i++)
-					field().mul (_minpoly[i-1], _mp1[i], a0);
+					field().mul (_minpoly[(size_t)i-1], _mp1[(size_t)i], a0);
 			}
 
 			int n = (int) _minpoly.size () - 1;
 
-			_VD.mul (y, x, _minpoly[n]);
+			_VD.mul (y, x, _minpoly[(size_t)n]);
 
 			for (i = n - 1; i >= 0; i--) {
 				_BB->apply (_z, y);
-				_VD.axpy (y, _minpoly[i], x, _z);
+				_VD.axpy (y, _minpoly[(size_t)i], x, _z);
 			}
 
 			return y;
@@ -143,7 +150,7 @@ namespace LinBox
 			int i;
 
 			if (_transposeMinpoly.empty ()) {
-				Polynomial _mp1;
+				Polynomial _mp1(field());
 				Element a0;
 
 				Transpose<Blackbox> BBT (_BB);
@@ -156,16 +163,16 @@ namespace LinBox
 				field().negin (a0);
 
 				for (i = 1; i < (int) _mp1.size (); i++)
-					field().mul (_transposeMinpoly[i-1], _mp1[i], a0);
+					field().mul (_transposeMinpoly[(size_t)i-1], _mp1[(size_t)i], a0);
 			}
 
 			int n = (int) _transposeMinpoly.size () - 1;
 
-			_VD.mul (y, x, _transposeMinpoly[n]);
+			_VD.mul (y, x, _transposeMinpoly[(size_t)n]);
 
 			for (i = n - 1; i >= 0; i--) {
 				_BB->applyTranspose (_z, y);
-				_VD.axpy (y, _transposeMinpoly[i], x, _z);
+				_VD.axpy (y, _transposeMinpoly[(size_t)i], x, _z);
 			}
 
 			return y;
@@ -197,7 +204,7 @@ namespace LinBox
 
 		const Field& field() const
 		{ return _BB->field();}
-	private:
+	protected:
 
 		const VectorDomain<Field>  _VD;
 		const Blackbox             *_BB;
@@ -215,11 +222,10 @@ namespace LinBox
 #endif // __LINBOX_inverse_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
diff --git a/linbox/blackbox/jit-matrix.h b/linbox/blackbox/jit-matrix.h
index 5662418..9de9458 100644
--- a/linbox/blackbox/jit-matrix.h
+++ b/linbox/blackbox/jit-matrix.h
@@ -1,64 +1,71 @@
-/* linbox/blackbox/jit-matrix.h
- * Copyright (c) LinBox
+/*
+ * copyright (c) LinBox
  *
  * bds, jpm
  *
- * 
- * ========LICENCE========
- * This file is part of the library LinBox.
- * 
+ *
+ * ========licence========
+ * this file is part of the library LinBox.
+ *
  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This 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
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
+ * it under the terms of the  gnu lesser general public
+ * license as published by the free software foundation; either
+ * version 2.1 of the license, or (at your option) any later version.
+ *
+ * this 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
+ * lesser general public license for more details.
+ *
+ * you should have received a copy of the gnu lesser general public
+ * license along with this library; if not, write to the free software
+ * foundation, inc., 51 franklin street, fifth floor, boston, ma  02110-1301  usa
+ * ========licence========
  *.
  */
 
-#ifndef __LINBOX_jitmatrix_H
-#define __LINBOX_jitmatrix_H
+/** @file linbox/blackbox/jit-matrix.h
+ * @brief nodoc
+ */
+
+#ifndef __LINBOX_jitmatrix_h
+#define __LINBOX_jitmatrix_h
 
+#include "linbox/matrix/matrix-category.h"
 #include "linbox/blackbox/blackbox-interface.h"
 
 namespace LinBox
 {
 
 	/**
-
-	  \brief   Example of a blackbox that is space efficient, though not time efficient.
-
-	  \ingroup blackbox
-	  Just In Time Matrix.
-
-	  The matrix itself is not stored in memory.  Rather, an EntryGenerator
-	  function is called to provide the entries.  The entry generator is
-	  called once for each entry during an apply or applyTranspose
-	  operation.
-
-	  An toy example of its use is the Hilbert matrix, whose \f$i,j\f$ entry is
-	  generated by the formula \f$1/(i+j+2)\f$ in zero based indexing.
-	  The motivating examples were matrices also defined by formula, the Paley type matrices.
-	  \sa{MSW07}% ISSAC 07 paper
-	  In that context block structured turned out to be essential and the
-	  JIT_Matrix class is primarily intended for block structured matrices,
-	  the JIT entries being matrix blocks.
-
-	  @param _Field only need provide the \c init() and \c axpyin() functions.
-
-	  @param JIT_EntryGenerator \c gen() is a function object defining the
-	  matrix by  providing <code>gen(e, i, j)</code> which sets field element e to the \c i,j entry
-	  of the matrix. Indexing is zero based.
-
-*/
+	 *
+	 * \brief   example of a blackbox that is space efficient, though not
+	 * time efficient.
+	 *
+	 *\ingroup blackbox
+	 *  just in time matrix.
+	 *
+	 * the matrix itself is not stored in memory.  rather, an
+	 * entrygenerator function is called to provide the entries.  the entry
+	 * generator is called once for each entry during an apply or
+	 * applytranspose operation.
+	 *
+	 * An toy example of its use is the Hilbert matrix, whose \f$i,j\f$
+	 * entry is generated by the formula \f$1/(i+j+2)\f$ in zero based
+	 * indexing.  The motivating examples were matrices also defined by
+	 * formula, the Paley type matrices.  \sa{MSW07}% ISSAC 07 paper In
+	 * that context block structured turned out to be essential and the
+	 * JIT_Matrix class is primarily intended for block structured
+	 * matrices, the JIT entries being matrix blocks.
+	 *
+	 * @param _Field only need provide the \c init() and \c axpyin()
+	 * functions.
+	 *
+	 * @param JIT_EntryGenerator \c gen() is a function object defining the
+	 * matrix by  providing <code>gen(e, i, j)</code> which sets field
+	 * element e to the \c i,j entry of the matrix. Indexing is zero based.
+	 *
+	 */
 
 
 	template <class _Field, class JIT_EntryGenerator>
@@ -76,27 +83,24 @@ namespace LinBox
 		 * and must be valid for 0 <= i < m, 0 <= j < n.
 		 **/
 
-		JIT_Matrix (_Field& F, const size_t m, const size_t n,
+		JIT_Matrix (const _Field& F, const size_t m, const size_t n,
 			    const JIT_EntryGenerator& JIT) :
-			_field(F), _m(m), _n(n), _gen(JIT)
+			_field(&F), _m(m), _n(n), _gen(JIT)
 		{};
 
 		template<class OutVector, class InVector>
-		OutVector& apply (OutVector& y, const InVector& x) ;
-		//OutVector& apply (OutVector& y, const InVector& x) const;
-
+		OutVector& apply (OutVector& y, const InVector& x) const;
 
 		template<class OutVector, class InVector>
-		OutVector& applyTranspose (OutVector& y, const InVector& x);
-		//OutVector& applyTranspose (OutVector& y, const InVector& x) const;
+		OutVector& applyTranspose (OutVector& y, const InVector& x) const;
 		size_t rowdim (void) const { return _m; }
 		size_t coldim (void) const { return _n; }
-		const Field& field() const { return _field; }
+		const Field& field() const { return *_field; }
 
 	protected:
 
 		// Field for arithmetic
-		Field _field;
+		const Field *_field;
 
 		// Number of rows and columns of matrix.
 		size_t _m;
@@ -112,16 +116,16 @@ namespace LinBox
 
 	template <class Field, class JIT_EntryGenerator>
 	template <class OutVector, class InVector>
-	inline OutVector& JIT_Matrix<Field, JIT_EntryGenerator>::apply (OutVector& y, const InVector& x)
+	inline OutVector& JIT_Matrix<Field, JIT_EntryGenerator>::apply (OutVector& y, const InVector& x) const
 	{
 		Element entry;
-		_field.init(entry,0);
+		field().assign(entry,field().zero);
 		for (size_t i = 0; i < _m; ++i) {
-			_field.init(y[i], 0);
+			field().assign(y[i], field().zero);
 			for (size_t j = 0; j < _n; ++j) {
 				_gen(entry, i, j);
 
-				_field.axpyin (y[i], entry, x[j]);
+				field().axpyin (y[i], entry, x[j]);
 			}
 		}
 		return y;
@@ -130,14 +134,14 @@ namespace LinBox
 
 	template <class Field, class JIT_EntryGenerator>
 	template <class OutVector, class InVector>
-	inline OutVector& JIT_Matrix<Field, JIT_EntryGenerator>::applyTranspose (OutVector& y, const InVector& x)
+	inline OutVector& JIT_Matrix<Field, JIT_EntryGenerator>::applyTranspose (OutVector& y, const InVector& x) const
 	{
 		Element entry;
-		_field.init(entry,0);
+		field().assign(entry,field().zero);
 		for (size_t i = 0; i < _m; ++i) {
-			_field.init(y[i], 0);
+			field().assign(y[i], field().zero);
 			for (size_t j = 0; j < _n; ++j) {
-				_field.axpyin ( y[i], x[j], _gen(entry, j, i) );
+				field().axpyin ( y[i], x[j], _gen(entry, j, i) );
 			}
 		}
 		return y;
diff --git a/linbox/blackbox/lambda-sparse.h b/linbox/blackbox/lambda-sparse.h
index ea7d224..e67b30f 100644
--- a/linbox/blackbox/lambda-sparse.h
+++ b/linbox/blackbox/lambda-sparse.h
@@ -26,7 +26,7 @@
 #ifndef __LINBOX_lambda_sparse_H
 #define __LINBOX_lambda_sparse_H
 
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/blackbox/archetype.h"
 #include "linbox/vector/stream.h"
 #include "linbox/vector/vector-traits.h"
@@ -61,11 +61,11 @@ namespace LinBox
 			typename Field::RandIter _randiter(F);
 			double                   init_p = 1.0 - 1.0 / (double) card;
 			double                   log_m = LAMBDA * log ((double) m) / M_LN2;
-			double                   new_p;
 
 			RandomSparseStream<Field,typename Vector<Field>::SparseSeq> stream (F, _randiter, init_p, n, m );
 
 			for (unsigned int i = 0; i < m; ++i) {
+			double                   new_p;
 				new_p = log_m / double(m - i);
 
 				if (init_p < new_p)
@@ -86,11 +86,11 @@ namespace LinBox
 			typename Field::RandIter _randiter(F,size,0);
 			double init_p = 1.0 - 1.0 / (double) size;
 			double log_m = LAMBDA * log ((double) m) / M_LN2;
-			double new_p;
 
 			RandomSparseStream<Field,typename Vector<Field>::SparseSeq> stream (F, _randiter, init_p, n, m );
 
 			for (unsigned int i = 0; i < m; ++i) {
+			double new_p;
 				new_p = log_m / double(m - i);
 
 				if (init_p < new_p)
@@ -139,7 +139,7 @@ namespace LinBox
 			for (; iter != this->End(); ++iter)
 				if (*iter > max) max=*iter;
 
-			this->_field.convert(norm,max);
+			this->field().convert(norm,max);
 			return norm;
 		}
 
@@ -154,11 +154,10 @@ namespace LinBox
 
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/matrix-blackbox.h b/linbox/blackbox/matrix-blackbox.h
index 76ceaee..89687ae 100644
--- a/linbox/blackbox/matrix-blackbox.h
+++ b/linbox/blackbox/matrix-blackbox.h
@@ -32,7 +32,7 @@
 #include "linbox/blackbox/blackbox-interface.h"
 #include "linbox/blackbox/archetype.h"
 #include "linbox/matrix/matrix-domain.h"
-#include "linbox/matrix/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/field/rebind.h"
 
 // Namespace in which all LinBox library code resides
@@ -65,7 +65,7 @@ namespace LinBox
 		 * @param  rep  Matrix from which to construct the black box
 		 */
 		MatrixBlackbox (const Field &F, Matrix &Rep) :
-			_field (F), _MD (F), _matA (Rep)
+			_field (&F), _MD (F), _matA (Rep)
 		{}
 
 		/** Constructor with size
@@ -77,7 +77,7 @@ namespace LinBox
 		 * @param  n  Column dimension
 		 */
 		MatrixBlackbox (const Field &F, size_t m, size_t n) :
-			_field (F), _MD (F), _matA (F, m, n)
+			_field (&F), _MD (F), _matA (F, m, n)
 		{}
 
 		/** Constructor
@@ -90,13 +90,13 @@ namespace LinBox
 		 */
 		template <class Row>
 		MatrixBlackbox (const Field &F, VectorStream<Row> &stream) :
-			_field (F), _MD (F), _matA (stream)
+			_field (&F), _MD (F), _matA (stream)
 		{}
 
 		/** Copy constructor
 		*/
 		MatrixBlackbox (const MatrixBlackbox &B) :
-			_field (B._field), _MD (B._field), _matA (B._matA)
+			_field (B._field), _MD (*(B._field)), _matA (B._matA)
 		{}
 
 		/** Destructor. */
@@ -183,7 +183,7 @@ namespace LinBox
 
 		/** Return a reference to the base field
 		*/
-		inline const Field &field () const { return _field;}
+		inline const Field &field () const { return *_field;}
 
 		/** Return a reference to the underlying representation
 		*/
@@ -191,7 +191,7 @@ namespace LinBox
 
 	private:
 
-		const Field         &_field;      // Field used for all arithmetic
+		const Field         *_field;      // Field used for all arithmetic
 		MatrixDomain<Field>  _MD;     // Matrix domain for matrix-vector
 		// operations
 		Matrix               _matA;      // Underlying matrix representation
diff --git a/linbox/blackbox/moore-penrose.h b/linbox/blackbox/moore-penrose.h
index 62fe954..b474872 100644
--- a/linbox/blackbox/moore-penrose.h
+++ b/linbox/blackbox/moore-penrose.h
@@ -86,9 +86,10 @@ namespace LinBox
 			_matGGT    = new Compose<Submatrix<Blackbox>, Transpose<Submatrix<Blackbox> > > (_matGG, _matGT);
 			_matFTFinv = new Inverse<Compose<Transpose<Submatrix<Blackbox> >,Submatrix<Blackbox> > > ( _matFTF);
 			_matGGTinv = new Inverse<Compose<Submatrix<Blackbox>, Transpose<Submatrix<Blackbox> > > > ( _matGGT);
-			}
+		}
 
 		/** Copy constructor
+		 * @bug Value of pointer '_matB1', which points to allocated memory, is copied in copy constructor instead of allocating new memory.
 		*/
 		MoorePenrose (const MoorePenrose &A) :
 			_matA      ( A._matA),
@@ -211,11 +212,10 @@ namespace LinBox
 #endif // __LINBOX_moore_penrose_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/ntl-hankel.h b/linbox/blackbox/ntl-hankel.h
index 41bec72..fe871e2 100644
--- a/linbox/blackbox/ntl-hankel.h
+++ b/linbox/blackbox/ntl-hankel.h
@@ -28,6 +28,7 @@
 
 #include "linbox/blackbox/blackbox-interface.h"
 #include "toeplitz.h" // we inherit everything from ntl-toeplitz
+// #include "linbox/vector/blas-vector.h"
 
 //#define DBGMSGS 1
 
@@ -45,17 +46,35 @@ namespace LinBox
 		typedef _Field Field;
 		typedef typename Field::Element Element;
 
+		typedef Toeplitz<_Field> TBase;
+		typedef TBase Father_t;
+                using TBase::P;
+                using TBase::rowDim;
+                using TBase::colDim;
+                using TBase::sysDim;
+                using TBase::shape;
+                using TBase::pdata;
+                using TBase::rpdata;
+                using TBase::field_;
+                using TBase::field;
+
+
 		template<typename _Tp1>
 		struct rebind
 		{ typedef Hankel<_Tp1> other; };
 
 		//------- CONSTRUCTORS AND DESTRUCTORS
 
-		~Hankel();                // Destructor
-		Hankel();                 // Zero Param Constructor
-		Hankel( const Field F,    // Cnstr. with Field and STL vec. of elems
-			const std::vector<Element>&v);
+		~Hankel();
+		// Hankel();// : Toeplitz<_Field>(){}
+		Hankel( const Field F) : Father_t (F) {};
+		// Cnstr. with Field and STL vec. of elems
+		Hankel( const Field F,    const std::vector<Element>&v);// : Toeplitz<_Field>(F, v){}
+		Hankel( const BlasVector<Field>&v);// : Toeplitz<_Field>(F, v){}
+
+		Hankel( const Field F,    size_t n);// : Toeplitz<_Field>(F, n) {}
 		//	  Hankel(char *dataFileName ); // read from a file
+		//void init( const Field F,    size_t n) { Toeplitz<_Field>::init(F, n) }
 
 		//------- INHERITED READ-ONLY ACCESSOR, and OBSERVER METHODS
 
@@ -66,11 +85,6 @@ namespace LinBox
 		 *      inline size_t sysdim() const;// Max of rows & columns;
 		 */
 
-		//------- MUTATOR METHODS
-
-		void setToUniModUT() ;      // Convert to UTriang matrix with det 1
-		void setToUniModLT() ;      // Convert to LTriang matrix with det 1
-
 		//------ SERVICE METHODS
 		template<class OutVector, class InVector>
 		OutVector& apply( OutVector &v_out, const InVector& v_in) const;
@@ -87,11 +101,10 @@ namespace LinBox
 #endif //__LINBOX_ntl_hankel_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/ntl-hankel.inl b/linbox/blackbox/ntl-hankel.inl
index 8eb82fa..326d4b6 100644
--- a/linbox/blackbox/ntl-hankel.inl
+++ b/linbox/blackbox/ntl-hankel.inl
@@ -56,6 +56,7 @@ namespace LinBox
 
 
 
+#if 0
 	/*-----------------------------------------------------------------
 	 *----    Default Constructor
 	 *----------------------------------------------------------------*/
@@ -69,6 +70,7 @@ namespace LinBox
 #endif
 
 	}//----- Zero Param Constructor ---- [Tested 6/14/02 -- Works]
+#endif
 
 
 
@@ -78,21 +80,21 @@ namespace LinBox
 	 *----------------------------------------------------------------*/
 	template <class Field>
 	Hankel<Field>::Hankel( const Field F,
-			       const std::vector<typename Field::Element>&v)
+			       const std::vector<typename Field::Element>&v) : Father_t(F)
 	{
 		// Assumes that the input is a vector of ZZ_p else things will FAIL
-		if ( (1 & v.size()) == 0)
+		if ( isEven(v.size()) )
 		{
 			std::cout << "There must be an ODD number of entries in the input vector " <<
 			"The length given is " << v.size();
 		}
-		assert( (1 & v.size()) == 1);
+		assert( isOdd(v.size()) );
 
 		this->rowDim = (1+v.size())/2; // The vector is 0..2n-2;
 		this->colDim = (1+v.size())/2;
 		this->sysDim = (1+v.size())/2;
 
-		this->pdata.SetMaxLength( v.size());
+		this->pdata.SetMaxLength( (long) v.size());
 		//		rpdata.SetMaxLength( v.size());
 		for (unsigned int i=0; i< v.size(); i++)
 		{
@@ -107,6 +109,37 @@ namespace LinBox
 
 	}//----- Constructor given a vector----
 
+	/*-----------------------------------------------------------------
+	 *----- Constructor With User-Supplied First Row And Column
+	 *----------------------------------------------------------------*/
+	template <class Field>
+	Hankel<Field>::Hankel( const BlasVector<Field>&v ) :
+	       	Father_t(v.field())
+	{
+		//! @warning Assumes that the input is a vector of ZZ_p else things will FAIL
+		if ( isEven( v.size() ) )
+		{
+			std::cout << "There must be an ODD number of entries in the input vector " <<
+			"The length given is " << v.size();
+		}
+		assert(  isOdd(v.size())  );
+
+		this->rowDim = (1+v.size())/2; // The vector is 0..2n-2;
+		this->colDim = (1+v.size())/2;
+		this->sysDim = (1+v.size())/2;
+
+		this->pdata.SetMaxLength( (long) v.size());
+		for (unsigned int i=0; i< v.size(); i++)
+		{
+			this->P.setCoeff( this->pdata, i, v[i]);
+		}
+
+#ifdef DBGMSGS
+		std::cout << "Hankel::Hankel(F,V):\tCreated a " << this->rowDim << "x"<< this->colDim<<
+						   " Hankel matrix "<< std::endl;
+#endif
+
+	}//----- Constructor given a vector----
 
 
 	/*-----------------------------------------------------------------
@@ -115,14 +148,16 @@ namespace LinBox
 	template <class Field>
 	void Hankel<Field>::print(std::ostream& os) const
 	{
-		register size_t i, N, j;
+		size_t N;
 
 		os<< this->rowDim << " " << this->colDim << " " << this->shape.shape() << std::endl;
 		N = (this->rowDim-1)<<1;
 
 		if ( N < 20 ) {            // Print small matrices in dense format
 			Element tmp;
+			size_t i;
 			for (i = N ; i >= this->colDim-1; i--) {
+				size_t j;
 				for ( j = 0; j < this->colDim ; j++)
 					os << " " << this->P.getCoeff(tmp, this->pdata,i-j) ;
 				os << std::endl;
@@ -179,21 +214,19 @@ namespace LinBox
 	 *    Make the matrix LOWER triangular with determinant 1.
 	 *    i.e. clear the last this->coldim-1 elements in the this->data vector
 	 *----------------------------------------------------------------*/
+#if 0
 	template <class Field>
 	void Hankel<Field>::setToUniModLT()
 	{
 		int L = int(this->rowDim-1)<<1;
 		this->shape.shape(BlackboxSpecifier::UNIMOD_LT);
 
-		Element one,zero;
-		this->K.init(one,1);
-		this->K.init(zero,0);
 		for (int i= int(this->rowDim)-1; i <= L; i++ ) {
 			// zero out the below-diagonal entries
-			this->P.setCoeff(this->pdata,i,zero);
+			this->P.setCoeff(this->pdata,i,field().zero);
 		}
 		// set the antidiagonal to 1
-		this->P.setCoeff( this->pdata, this->rowDim-1, one);       // update the corresponding coeff of this->pdata
+		this->P.setCoeff( this->pdata, this->rowDim-1, field().one);       // update the corresponding coeff of this->pdata
 		//reverse(rpdata,this->pdata);        // no need to construct the transpose
 		return;
 	}//
@@ -210,23 +243,19 @@ namespace LinBox
 	{
 		this->shape.shape(BlackboxSpecifier::UNIMOD_UT);
 
-		Element one,zero;
-		this->K.init(one,1);
-		this->K.init(zero,0);
-
 		for (size_t i=0; i < this->rowDim-1; i++ ) {
 			// zero out the below-antidiagonal entries
-			this->P.setCoeff(this->pdata, i , zero);
+			this->P.setCoeff(this->pdata, i , field().zero);
 		}
 
 		// set antidiagonal to 1
-		this->P.setCoeff(this->pdata,this->rowDim-1, one);      // update the corresponding coeff of this->pdata
+		this->P.setCoeff(this->pdata,this->rowDim-1, field().one);      // update the corresponding coeff of this->pdata
 		//reverse(rpdata,this->pdata);    // no need to construct the transpose
 
 		return;
 	}//
 
-
+#endif
 
 	/*-----------------------------------------------------------------
 	 *    Apply the matrix to a vector Here the input and output
@@ -248,7 +277,7 @@ namespace LinBox
 		       (v_in.size() == this->coldim()))  ;
 
 		NTL::ZZ_pX pxOut, pxIn;
-		pxIn.SetMaxLength( v_in.size()-1);
+		pxIn.SetMaxLength( (long) v_in.size()-1);
 		for (unsigned int i=0; i< v_in.size(); i++)
 			this->P.setCoeff( pxIn, i, v_in[i]);
 
@@ -263,7 +292,7 @@ namespace LinBox
 #endif
 		int N = (int)this->rowdim();
 		for ( int i= 0; i < N; i++)
-			this->P.getCoeff(v_out[N-1-i], pxOut, N-1+i);
+			this->P.getCoeff(v_out[(size_t)(N-1-i)], pxOut, (size_t)(N-1+i));
 
 		return v_out;
 
@@ -291,11 +320,10 @@ namespace LinBox
 
 #endif //__LINBOX_bb_ntl_hankel_INL
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/ntl-sylvester.h b/linbox/blackbox/ntl-sylvester.h
index 958cc32..a588fa6 100644
--- a/linbox/blackbox/ntl-sylvester.h
+++ b/linbox/blackbox/ntl-sylvester.h
@@ -47,10 +47,13 @@ namespace LinBox
 		typedef _Field Field;
 		typedef typename Field::Element element;      // Currently restricted to ZZ_p
 		~Sylvester();                                 // Destructor
-		Sylvester();                                  // Default Constructor
+		Sylvester( const Field &F );                                  // Default Constructor
 		Sylvester( const Field F,
 			   const std::vector<element> &vpx,
 			   const std::vector<element> &vpy ); // Constructor given 2 polys and Field
+		Sylvester(
+			   const BlasVector<Field> &vpx,
+			   const BlasVector<Field> &vpy );
 
 
 		void   print( std::ostream& os = std::cout ) const; // Print to stream or stdout
@@ -75,8 +78,12 @@ namespace LinBox
 
 		//Sylvester(char *dataFileName ); // read from a file -- not implemented yet
 
+		std::ostream& write(std::ostream & os)
+		{
+			os << "NOT YET" ;
+			return os ;
+		}
 	protected:
-		Field         K;
 
 		size_t        rowDim,
 			      colDim,
@@ -92,6 +99,7 @@ namespace LinBox
 		size_t qxdeg() const { return qdata.size() - 1; }
 
 
+		const Field       &   K;
 
 	};// End, Sylvester
 }
diff --git a/linbox/blackbox/ntl-sylvester.inl b/linbox/blackbox/ntl-sylvester.inl
index e007e8e..1578c79 100644
--- a/linbox/blackbox/ntl-sylvester.inl
+++ b/linbox/blackbox/ntl-sylvester.inl
@@ -53,7 +53,8 @@ namespace LinBox
 	 *    Default constructor.
 	 *---------------------------------------------------------------------*/
 	template <class Field>
-	Sylvester<Field>::Sylvester()
+	Sylvester<Field>::Sylvester( const Field & F) :
+		pdata(0),qdata(0),K(F)
 	{
 		sysDim =               // Default dimension is 0
 		rowDim =               // Default row dim is 0
@@ -79,7 +80,7 @@ namespace LinBox
 				    const std::vector<typename Field::Element> &vp,
 				    const std::vector<typename Field::Element> &vq
 				   ) :
-		pdata(vp), qdata(vq)
+		pdata(vp), qdata(vq), K(F)
 	{
 
 		// Set the row, col, and system dimensions
@@ -88,14 +89,14 @@ namespace LinBox
 		sysDim = vp.size() + vq.size()-2;  // square system with dimension deg(px)+deg(qx)
 
 		// Copy the vector to a polynomial representation, for px
-		pxdata.SetMaxLength( vp.size() );
+		pxdata.SetMaxLength((long) vp.size() );
 		for (size_t ip=0; ip< vp.size(); ip++ )
-			SetCoeff( pxdata, ip, vp[ip]);
+			SetCoeff( pxdata, (long)ip, vp[ip]);
 
 		// Copy the vector to a polynomial representation, for qx
-		qxdata.SetMaxLength( vq.size() );
+		qxdata.SetMaxLength((long) vq.size() );
 		for ( size_t iq=0; iq< vq.size(); iq++ )
-			SetCoeff( qxdata, iq, vq[iq] );
+			SetCoeff( qxdata, (long)iq, vq[iq] );
 
 
 #ifdef DBGMSGS
@@ -103,17 +104,61 @@ namespace LinBox
 							   "x"<< colDim<< " Sylvester matrix "<< std::endl;
 #endif
 
-		/* Inserted for a timing calculation with the gcd
-		 *  double start_time = GetTime();
-		 *	  ZZ_pX gx;
-		 *	  GCD( gx, pxdata, qxdata);
-		 *
-		 *	  double end_time = GetTime();
-		 *	  cout << gx << endl;
-		 *	  std::cout << "Time for gcd = " << end_time-start_time << " sec\n";
-		 */
+		/* Inserted for a timing calculation with the gcd */
+#if 0
+		double start_time = GetTime();
+		ZZ_pX gx;
+		GCD( gx, pxdata, qxdata);
+
+		double end_time = GetTime();
+		cout << gx << endl;
+		std::cout << "Time for gcd = " << end_time-start_time << " sec\n";
+#endif
+
 	}// Sylvester()
 
+	template <class Field>
+	Sylvester<Field>::Sylvester(
+				    const BlasVector<Field> &vp,
+				    const BlasVector<Field> &vq
+				   ) :
+		 pdata(vp.size()), qdata(vq.size()), K(vp.field())
+	{
+		std::copy(vp.begin(), vp.end(), pdata.begin());
+		std::copy(vq.begin(), vq.end(), qdata.begin());
+
+		// Set the row, col, and system dimensions
+		rowDim =
+		colDim =
+		sysDim = vp.size() + vq.size()-2;  // square system with dimension deg(px)+deg(qx)
+
+		// Copy the vector to a polynomial representation, for px
+		pxdata.SetMaxLength((long) vp.size() );
+		for (size_t ip=0; ip< vp.size(); ip++ )
+			SetCoeff( pxdata, (long)ip, vp[ip]);
+
+		// Copy the vector to a polynomial representation, for qx
+		qxdata.SetMaxLength((long) vq.size() );
+		for ( size_t iq=0; iq< vq.size(); iq++ )
+			SetCoeff( qxdata, (long)iq, vq[iq] );
+
+
+#ifdef DBGMSGS
+		std::cout << "Sylvester::Sylvester(F,v,w):\tCreated a " << rowDim <<
+							   "x"<< colDim<< " Sylvester matrix "<< std::endl;
+#endif
+
+#if 0
+		double start_time = GetTime();
+		ZZ_pX gx;
+		GCD( gx, pxdata, qxdata);
+
+		double end_time = GetTime();
+		cout << gx << endl;
+		std::cout << "Time for gcd = " << end_time-start_time << " sec\n";
+#endif
+
+	}// Sylvester()
 
 
 	/*----------------------------------------------------------------------
@@ -279,28 +324,28 @@ namespace LinBox
 		NTL::ZZ_pX txOut, txIn;
 
 		/*--------------- Convert input vector to a polynomial ---------*/
-		txIn.SetMaxLength( v_in.size() -1 );
+		txIn.SetMaxLength( (long)v_in.size() -1 );
 		for ( size_t i=0; i < v_in.size(); i++ )
-			SetCoeff( txIn, i, v_in[i] );
+			SetCoeff( txIn, (long)i, v_in[i] );
 
 		/*--------------  Poly multiply the upper Sylvester poly by input ------*/
 		mul( txOut, txIn, pxdata);
-		int Nq = qxdeg();
-		int m  = pxdeg();
+		const size_t Nq = qxdeg();
+		const size_t m  = pxdeg();
 		/*--------------  vout[0..deg(q)-1] <--- txout[deg(qx)...2deg(qx)-1] --- */
-		for ( int i=0; i < Nq; ++i )
-			GetCoeff(v_out[i], txOut, m+i);
+		for ( size_t i=0; i < Nq; ++i )
+			GetCoeff(v_out[i], txOut, (long)(m+i));
 
 		/*--------------  Poly multiply the lower Sylvester poly by input -----*/
 		mul( txOut, txIn, qxdata);
 
-		int Np = pxdeg();
-		int n  = qxdeg();
+		const size_t Np = pxdeg();
+		const size_t n  = qxdeg();
 
 		/*--------------  vout[deg(qx)..deg(qx)+deg(px)-1] <---
 		 *                              txout[deg(qx)...deg(qx)+deg(px)-1] --- */
-		for ( int i=0; i < Np; ++i )
-			GetCoeff(v_out[Nq+i], txOut, n+i );
+		for ( size_t i=0; i < Np; ++i )
+			GetCoeff(v_out[Nq+i], txOut, (long)(n+i) );
 
 
 		return v_out;
@@ -338,22 +383,22 @@ namespace LinBox
 
 		/*--------- We need to reverse the input vector           -----------*/
 		/*--------- txIn[0...m-1] <--- vin[m-1...0]               ----------*/
-		txIn.SetMaxLength( qxdeg()-1 );
+		txIn.SetMaxLength((long) qxdeg()-1 );
 		for ( size_t i=0; i < qxdeg(); i++ )
-			SetCoeff( txIn, qxdeg()-1-i, v_in[i] );
+			SetCoeff( txIn, (long)(qxdeg()-1-i), v_in[i] );
 
 		mul( txOut, txIn, pxdata);     // Do the poly multiply
 
 		/*--------- We need to reverse the output vector           -----------*/
 		/*-------  v_out[0..N-1] <--- txOut[N-1...0]                  --------*/
 		for (size_t i=0; i < v_out.size(); i++)
-			GetCoeff(v_out[i], txOut, sysdim()-1-i); // Extract the coeffs
+			GetCoeff(v_out[i], txOut, (long)(sysdim()-1-i)); // Extract the coeffs
 
 		/*--------- We need to reverse the input vector           -----------*/
 		/*--------- txIn[m ... m+n-1] <--- vin[m+n-1 ... m]       -----------*/
-		txIn.SetMaxLength( pxdeg()-1 );
+		txIn.SetMaxLength((long) pxdeg()-1 );
 		for ( size_t i=0; i < pxdeg(); i++ )
-			SetCoeff( txIn,pxdeg()-1-i, v_in[qxdeg()+i] );
+			SetCoeff( txIn, (long)(pxdeg()-1-i), v_in[qxdeg()+i] );
 
 		mul( txOut, txIn, qxdata);    // do the poly multiply
 
@@ -361,7 +406,7 @@ namespace LinBox
 		/*-------  v_out[0..N-1] <--- txOut[N-1...0]                  --------*/
 
 		for (size_t i=0; i < v_out.size(); i++) {
-			GetCoeff(tval, txOut, sysdim()-1-i);
+			GetCoeff(tval, txOut, (long)(sysdim()-1-i));
 			add( v_out[i], v_out[i], tval ); // add to the accumulated output
 		}
 
diff --git a/linbox/blackbox/pascal.h b/linbox/blackbox/pascal.h
new file mode 100644
index 0000000..92e82ba
--- /dev/null
+++ b/linbox/blackbox/pascal.h
@@ -0,0 +1,278 @@
+
+#ifndef __LINBOX_pascal_H
+#define __LINBOX_pascal_H
+
+#include <iostream>
+#include <vector>
+#include <limits>
+#include <algorithm>
+
+#ifdef __LINBOX_USE_OPENMP
+#include <omp.h>
+#endif
+
+#include "linbox/util/debug.h"
+#include "linbox/matrix/sliced3.h"
+
+#define PASCAL_BASECASE_THRESH 81
+
+namespace LinBox {
+
+template <class Field>
+class ModularNChooseK {
+public:
+	typedef typename Field::Element Element;
+
+	int reduceZeros(int x)
+	{
+		while ((x>0)&&(x%q_==0)) {
+			x/=q_;
+		}
+		return x;
+	}
+
+	void initFactorials()
+	{
+		factList_.resize(maxN_+1);
+		Element d;
+		F_.assign(factList_[0],F_.one);
+		for (int i=1;i<maxN_+1;++i) {
+			F_.init(d,reduceZeros(i));
+			if (d==0) {
+				F_.assign(factList_[i],factList_[i-1]);
+			} else {
+				F_.mul(factList_[i],factList_[i-1],d);
+			}
+		}
+	}
+
+	void initPowerList()
+	{
+		powerList_.resize(maxN_+1);
+		for (int i=0;i<maxN_+1;++i) {
+			powerList_[i]=0;
+		}
+		for (int k=q_;k<maxN_;k*=q_) {
+			for (int i=k-1;i<maxN_;i+=k) {
+				++powerList_[i+1];
+			}
+		}
+		
+		int sum=0;
+		for (int i=0;i<maxN_+1;++i) {
+			sum+=powerList_[i];
+			powerList_[i]=sum;
+		}
+	}
+
+	ModularNChooseK(Field& F, int q, int maxN) :
+		F_(F), q_(q), maxN_(maxN)
+	{
+		
+		initPowerList();
+		initFactorials();
+	}
+
+	Element& compute(Element& d,int n,int k)
+	{
+		int denomPower=powerList_[k]+powerList_[n-k];
+		int numerPower=powerList_[n];
+		if (numerPower>denomPower) {
+			F_.assign(d,F_.zero);
+		} else {
+			linbox_check(numerPower==denomPower);
+			F_.mul(d,factList_[n-k],factList_[k]);
+			F_.div(d,factList_[n],d);
+		}
+		return d;
+		
+	}
+protected:
+	Field F_;
+	int q_;
+	std::vector<int> powerList_;
+	std::vector<Element> factList_;
+	int maxN_;
+};
+
+template <class Field>
+class PascalBlackbox {
+public:
+	typedef typename Field::Element Element;
+
+	template <class Vector>
+	PascalBlackbox(int r,
+	               int c,
+	               const Vector& polyCoeffs,
+	               Field& F) :
+		polyCoeffs_(polyCoeffs),
+		rowdim_(r),coldim_(c),
+		F_(F)
+	{
+		initPowersOfThree();
+		initBaseCase();
+	}
+
+	void initBaseCase()
+	{
+		ModularNChooseK<Field> Choose(F_,3,std::max(rowdim_+coldim_,2*PASCAL_BASECASE_THRESH)+1);
+		nonZeroRows_.clear();
+		nonZeroCols_.clear();
+		nonZerosUnflipped_.clear();
+		nonZerosFlipped_.clear();
+		int r=PASCAL_BASECASE_THRESH;
+		Element two;
+		F_.add(two,F_.one,F_.one);
+		for (int k=0;k<(2*r)-1;++k) {
+			for (int j=(k<r)?0:(1+k-4);j<std::min(k+1,r);++j) {
+				Element d;
+				int i=k-j;
+				Choose.compute(d,k,j);
+				if (!F_.isZero(d)) {
+					nonZeroRows_.push_back(i);
+					nonZeroCols_.push_back(j);
+					nonZerosUnflipped_.push_back(d);
+					F_.mulin(d,two);
+					nonZerosFlipped_.push_back(d);
+				}
+			}
+		}
+	}
+
+	template <class Mat1, class Mat2>
+	Mat1& applyLeft(Mat1& lhs,const Mat2& rhs) const
+	{
+		int r=std::max(PASCAL_BASECASE_THRESH,
+		               nextPowerOfThree(std::max(rowdim_,coldim_)));
+		lhs.zero();
+		applyLeft(0,0,r,lhs,const_cast<Mat2&>(rhs),false,1);
+		return lhs;
+	}
+
+	template<class Mat1, class Mat2>
+	void applyLeft(int i0, int j0, int r, Mat1& lhs,Mat2& rhs, bool flip, int numThreads) const
+	{
+		if (i0 > rowdim_ || j0 > coldim_) return;
+		if (r<=PASCAL_BASECASE_THRESH) {
+			if (flip) {
+				applyHelper(i0,j0,r,lhs,rhs,nonZerosFlipped_);
+			} else {
+				applyHelper(i0,j0,r,lhs,rhs,nonZerosUnflipped_);
+			}
+		} else {
+			int r3=r/3;
+
+//CP: removing all explicit OMP calls
+//    to be replaced by calls to FFLAS-FFPACK's DSL
+
+// #ifdef __LINBOX_USE_OPENMP
+// 			int threadLimit=omp_get_max_threads();
+// 			//int threadLimit=4;
+// #endif
+
+// #pragma omp parallel sections if (numThreads+2<=threadLimit) shared(lhs,rhs)
+// 			{
+// #pragma omp section
+				applyLeft(i0,j0,r3,lhs,rhs,flip,numThreads+2);
+// #pragma omp section
+				applyLeft(i0+r3,j0,r3,lhs,rhs,flip,numThreads+2);
+// #pragma omp section
+				applyLeft(i0+2*r3,j0,r3,lhs,rhs,flip,numThreads+2);
+// 			}
+
+// #pragma omp parallel sections if (numThreads+1<=threadLimit) shared(lhs,rhs)
+// 			{
+// #pragma omp section
+				applyLeft(i0,j0+r3,r3,lhs,rhs,flip,numThreads+1);
+// #pragma omp section
+				applyLeft(i0+r3,j0+r3,r3,lhs,rhs,!flip,numThreads);
+			// }
+
+
+			applyLeft(i0,j0+2*r3,r3,lhs,rhs,flip,numThreads+1);
+
+		}
+	}
+
+	template<class SlicedDom>
+	void applyHelper(int i0,int j0,int r,Sliced<SlicedDom>& lhs,Sliced<SlicedDom>& rhs,
+	                 const std::vector<uint16_t>& nonZeros) const
+	{
+		int nnz=nonZeroRows_.size();
+		for (int l=0;l<nnz;++l) {
+			int i=nonZeroRows_[l]+i0;
+			int j=nonZeroCols_[l]+j0;
+			int k=i+j;
+			if (i>=rowdim_ || j>=coldim_) {
+				continue;
+			}
+			if (F_.isZero(polyCoeffs_[k])) {
+				continue;
+			}
+			Element d;
+			d=nonZeros[l];
+			F_.mul(d,d,polyCoeffs_[k]);
+			typename Sliced<SlicedDom>::RawIterator Ab(lhs.rowBegin(i)),
+				Ae(lhs.rowEnd(i)), Bb(rhs.rowBegin(j));
+			lhs.axpyin(Ab,Ae,d,Bb);
+		}
+	}
+
+	template<class Mat1, class Mat2>
+	void applyHelper(int i0,int j0,int r,Mat1& lhs,Mat2& rhs,const std::vector<uint16_t>& nonZeros) const
+	{
+		int nnz=nonZeroRows_.size();
+		int w=rhs.coldim();
+		for (int l=0;l<nnz;++l) {
+			int i=nonZeroRows_[l]+i0;
+			int j=nonZeroCols_[l]+j0;
+			int k=i+j;
+			if (i>=rowdim_ || j>=coldim_) {
+				continue;
+			}
+			if (F_.isZero(polyCoeffs_[k])) {
+				continue;
+			}
+			Element d;
+			d=nonZeros[l];
+			F_.mul(d,d,polyCoeffs_[k]);
+			typename Mat2::constSubMatrixType Xr(rhs,j,0,1,w);
+			typename Mat1::subMatrixType Yr(lhs,i,0,1,w);
+			lhs._MD.saxpyin(Yr,d,Xr);
+		}
+	}
+
+	size_t rowdim() const {return rowdim_;}
+	size_t coldim() const {return coldim_;}
+
+	const Field& field() const {
+		return F_;
+	}
+	
+protected:
+	std::vector<Element> polyCoeffs_;
+	int rowdim_,coldim_;
+	Field F_;
+	std::vector<int> powersOfThree_;
+	std::vector<uint16_t> nonZeroRows_,nonZeroCols_,nonZerosFlipped_,nonZerosUnflipped_;
+
+	void initPowersOfThree()
+	{
+		int x=1;
+		while (x<std::numeric_limits<int>::max()/3) {
+			powersOfThree_.push_back(x);
+			x*=3;
+		}
+		powersOfThree_.push_back(x);
+	}
+	int nextPowerOfThree(int x) const
+	{
+		int i=0;
+		while (powersOfThree_[i] < x) {++i;}
+		return powersOfThree_[i];
+	}
+};
+
+}
+
+#endif //__LINBOX_pascal_H
diff --git a/linbox/blackbox/permutation.h b/linbox/blackbox/permutation.h
index ad4b3ba..81cef09 100644
--- a/linbox/blackbox/permutation.h
+++ b/linbox/blackbox/permutation.h
@@ -6,7 +6,7 @@
  * ========LICENCE========
  * This file is part of the library LinBox.
  *
-  * LinBox is free software: you can redistribute it and/or modify
+ * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
@@ -26,72 +26,94 @@
 #define __LINBOX_bb_permutation_H
 
 #include <utility>
-#ifndef __LINBOX_PERMUTATION_STORAGE
-// #include "linbox/vector/light_container.h"
-// #define __LINBOX_PERMUTATION_STORAGE LightContainer< long >
-#include <vector>
-#define __LINBOX_PERMUTATION_STORAGE std::vector< long >
-#endif
+#include <algorithm>
 
-#include "linbox/util/debug.h"
 #include "linbox/linbox-config.h"
-#include "linbox/blackbox/blackbox-interface.h"
-
-#ifdef __LINBOX_XMLENABLED
-
-#include "linbox/util/xml/linbox-reader.h"
-#include "linbox/util/xml/linbox-writer.h"
-
-#include <iostream>
-#include <string>
-
-#endif //__LINBOX_XMLENABLED
+#include "linbox/linbox-tags.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h" 
+#include "linbox/randiter/mersenne-twister.h"
+#include "linbox/blackbox/fibb.h"
 
-
-// Namespace in which all LinBox library code resides
 namespace LinBox
 {
 
-	/** \brief size is n.
+	/** \brief 
 
 	  \ingroup blackbox
-	 * @param Storage \ref LinBox dense or sparse vector of field elements
 	 */
-	template<class _Field, class _Storage = __LINBOX_PERMUTATION_STORAGE >
-	class Permutation : public  BlackboxInterface {
-		const _Field& _field;
+	template<class _Field, class _Matrix=DenseMatrix<_Field>>
+	class Permutation : public  FIBB<_Field>
+	{ 
+	public:
+		typedef _Field					Field;
+		typedef typename Field::Element	Element;
+		typedef Permutation<Field>		Self_t;
+		typedef LightContainer<long>	Storage;
+		typedef _Matrix					Matrix;
+	protected:
+		Storage _indices; // Vector of indices
+		bool alloc; //
+		const Field* _field;
 	public:
-		typedef Permutation<_Field, _Storage>	Self_t;
-		typedef _Storage 			Storage;
-		typedef _Field				Field;
-		typedef typename Field::Element 	Element;
 
 		/** Constructor from a vector of indices.
 		 * This constructor creates a permutation matrix based on a vector of indices
 		 * @param F
 		 * @param indices Vector of indices representing the permutation
+		 * Permutation P has 1 in the P_{i, _indices[i]} positions.
 		 */
 		Permutation (Storage & indices, const Field& F = Field()) :
-			_field(F), _indices (indices)
+			_field(&F), _indices (indices)
 		{}
 
-		/** Constructor from a dimension.
-		 * This constructor creates an n x n permutation matrix, initialized to be the identity
-		 * @param n The dimension of hte matrix to create
-		 * @param F
+		Self_t& init(size_t* P, size_t n) 
+		{	_indices.resize(n); 
+			for (size_t i = 0; i < n; ++i) 
+				_indices[i] = P[i]; 
+			return *this;
+		}
+
+		Permutation (size_t* P, size_t n, const Field& F = Field()) 
+		: _field(&F) 
+		{ init(P, n); }
+
+		/** \brief n x n permutation matrix, initially the identity.
+		 * @param n The dimension of the matrix 
+		 * @param F field or ring
 		 */
 		Permutation (int n, const Field& F = Field()) :
-			_field(F)
+			_field(&F)
 		{
 			identity(n);
 		}
 
+		Permutation (const Field& F = Field(), size_t n=0, size_t m = 0) :
+			_field(&F)
+		{
+			identity((int)n);
+		}
+
 
+		//!@bug should be size_t
 		void identity(int n)
 		{
-			this->_indices.resize (n);
+			this->_indices.resize ((size_t)n);
 			for (typename Storage::value_type i=0; i < n; ++i)
-				_indices[i] = i;
+				_indices[(size_t)i] = i;
+		}
+
+		//void random(size_t n)
+		void random()
+		{
+			size_t n = rowdim();
+			identity((int)n);
+			MersenneTwister r((unsigned int)time(NULL));
+			// Knuth construction
+			for (size_t i = 0; i < n-1; ++i) {
+				size_t j = i + r.randomInt()%(n-i);
+				std::swap(_indices[(size_t)i], _indices[(size_t)j]);
+			}
 		}
 
 
@@ -103,21 +125,6 @@ namespace LinBox
 			_field(Mat._field),_indices (Mat._indices)
 		{}
 
-#ifdef __LINBOX_XMLENABLED
-		Permutation(LinBox::Reader &R)
-		{
-			if(!R.expectTagName("MatrixOver")) return;
-			if(!R.expectChildTag()) return;
-			R.traverseChild();
-
-			if(!R.expectTagName("permutation") || !R.expectTagNumVector(_indices)) return;
-
-			R.upToParent();
-			return;
-		}
-#endif
-
-
 		// Destructor
 		~Permutation (void) {}
 
@@ -141,7 +148,7 @@ namespace LinBox
 			linbox_check (y.size () == _indices.size ());
 
 			for (i = 0; i < x.size(); ++i)
-				_field.assign(y[i], x[_indices[i]]);
+				field().assign(y[(size_t)i], x[(size_t)_indices[(size_t)i]]);
 
 			return y;
 		}
@@ -167,16 +174,114 @@ namespace LinBox
 			linbox_check (y.size () == _indices.size ());
 
 			for (i = 0; i < _indices.size (); ++i)
-				_field.assign(y[_indices[i]], x[i]);
+				field().assign(y[(size_t)_indices[(size_t)i]], x[(size_t)i]);
 
 			return y;
 		}
+#if 1
+		Matrix& applyRight(Matrix& Y, const Matrix& X) const
+		{
+			Element x; field().init(x);
+			for (size_t i = 0; i < Y.rowdim(); ++i){
+				size_t k = _indices[i];
+				for (size_t j = 0; j < Y.coldim(); ++j)
+					Y.setEntry(i,j, X.getEntry(x, k, j));
+			}
+		/* desired form
+			for (size_t i = 0; i < rowdim(); ++i)
+			{
+				Matrix Yrow(Y, i, 0, 1, Y.coldim());
+				Matrix Xrow(X, _indices[i], 0, 1, X.coldim());
+				Yrow.copy(Xrow); // right kind of copy?
+			}
+		*/
+			return Y; 
+		}
+		Matrix& applyLeft(Matrix& Y, const Matrix& X) const
+		{
+			Element x; field().init(x);
+			for (size_t i = 0; i < Y.coldim(); ++i){
+				size_t k = _indices[i];
+				for (size_t j = 0; j < Y.rowdim(); ++j)
+					Y.setEntry(j,k, X.getEntry(x, j, i));
+			}
+		/* desired form
+			for (size_t i = 0; i < coldim(); ++i)
+			{
+				Matrix Ycol(Y, 0, _indices[i], Y.rowdim(), 1);
+				Matrix Xcol(X, 0, i, X.rowdim(), 1);
+				Ycol.copy(Xcol); 
+			}
+		*/
+			return Y; 
+		}
+		/* FIBB functions */
 
+		BBType bbTag() const { return permutation; }
 
+		size_t& rank(size_t& r) const 
+		{ return r = rowdim(); }
+
+		Element& det(Element& d) const
+		{	size_t b = 0, i, j, k;
+			Storage marks(_indices.size());
+			for (i = 0; i < _indices.size(); ++i) 
+			if (not marks[i]) 
+			{	for (k = 1, j = _indices[i]; i != j; ++k, j = _indices[j])
+				;  
+				b &= k;
+			}
+			return d = b&1 ? field().mOne : field().one; 
+		}
+		
+		Matrix& solveRight(Matrix& Y, const Matrix& X) const
+		{	Element x; field().init(x);
+			for (size_t i = 0; i < Y.rowdim(); ++i){
+				size_t k = _indices[i];
+				for (size_t j = 0; j < Y.coldim(); ++j)
+					Y.setEntry(k,j, X.getEntry(x, i, j));
+			}
+		/* desired form
+		 	for (size_t i = 0; i < rowdim(); ++i)
+			{
+				Matrix Yrow(Y, _indices[i], 0, 1, Y.coldim());
+				Matrix Xrow(X, i, 0, 1, X.coldim());
+				Yrow.copy(Xrow); 
+			}
+		*/
+			return Y; 
+		}
+		Matrix& solveLeft(Matrix& Y, const Matrix& X) const
+		{	Element x; field().init(x);
+			for (size_t i = 0; i < Y.coldim(); ++i){
+				size_t k = _indices[i];
+				for (size_t j = 0; j < Y.rowdim(); ++j)
+					Y.setEntry(j,i, X.getEntry(x, j, k));
+			}
+		/* desired form
+			for (size_t i = 0; i < coldim(); ++i)
+			{
+				Matrix Ycol(Y, 0, i, Y.rowdim(), 1);
+				Matrix Xcol(X, 0, _indices[i], X.rowdim(), 1);
+				Ycol.copy(Xcol); 
+			}
+		*/
+			return Y; 
+		}
+		Matrix& nullspaceRandomRight(Matrix& N) const 
+		{	N.zero(); return N; }
+		Matrix& nullspaceRandomLeft(Matrix& N) const 
+		{	N.zero(); return N; }
+		Matrix& nullspaceBasisRight(Matrix& N) const
+		{	N.resize(rowdim(), 0); return N; }
+		Matrix& nullspaceBasisLeft(Matrix& N) const
+		{	N.resize(0, coldim()); return N; }
+		/* end FIBB section */
+#endif
 
 		template<typename _Tp1>
 		struct rebind {
-			typedef Permutation<_Tp1, Storage> other;
+			typedef Permutation<_Tp1> other;
 			void operator() (other & Ap, const Self_t& A, const _Tp1& F) {
 				Ap->setStorage( A.getStorage() );
 			}
@@ -206,98 +311,162 @@ namespace LinBox
 		}
 
 		/**
-		 * Add a transposition to the matrix
-		*/
-		void permute (size_t row1, size_t row2)
+		 * this <-- transposition(i,j)*this
+		 * indices (i = 0, j = 1): 
+		 * 0 2 1 * 1 0 2 = 1 2 0
+		 * matrices (corresponding):
+		 * 1 0 0   0 1 0   0 1 0
+		 * 0 0 1 * 1 0 0 = 0 0 1
+		 * 0 1 0   0 0 1   1 0 0
+		 */
+		void permute (size_t i, size_t j)
 		{
-			linbox_check (/*  row1 >= 0 &&*/ row1 < _indices.size ());
-			linbox_check (/*  row2 >= 0 &&*/ row2 < _indices.size ());
-			std::swap (_indices[row1], _indices[row2]);
-
+			linbox_check (/*  i >= 0 &&*/ i < _indices.size ());
+			linbox_check (/*  j >= 0 &&*/ j < _indices.size ());
+			std::swap (_indices[i], _indices[j]);
 		}
 
-		const Field& field() { return _field; }
+        size_t operator[](size_t i) const {
+            return _indices[i];
+        }        
 
-#ifdef __LINBOX_XMLENABLED
+		const Field& field() const { return *_field; }
 
-		std::ostream &write(std::ostream &out) const
-		{
-			LinBox::Writer W;
-			if( toTag(W) )
-				W.write(out);
+		//!@bug needs a read. (needed by test-blackbox.h)
+		std::istream &read(std::istream &os) 
+		{ return read(os, Tag::FileFormat::Plain); }
 
-			return out;
-		}
+		//!@bug needs a MM version
+		std::ostream &write(std::ostream &os) const
+		{ return write(os, Tag::FileFormat::Plain); }
 
-		bool toTag(LinBox::Writer &W) const
-		{
-			std::string s;
-			W.setTagName("MatrixOver");
-			W.setAttribute("rows", LinBox::Writer::numToString(s, _indices.size()));
-			W.setAttribute("cols", LinBox::Writer::numToString(s, _indices.size()));
-			W.setAttribute("implDetail", "permutation");
-
-			W.addTagChild();
-			W.setTagName("permutation");
-			W.addNumericalList(_indices);
-			W.upToParent();
-
-			return true;
-		}
-#else
-		std::ostream &write(std::ostream &os, FileFormatTag format = FORMAT_MAPLE) const
+		std::ostream &write(std::ostream &os, LINBOX_enum(Tag::FileFormat) format) const
 		{
-			// 		for (typename Storage::const_iterator it=_indices.begin(); it!=_indices.end(); ++it)
-			//                     std::cerr << *it << ' ';
-			typename Field::Element one, zero; _field.init(one,1UL);_field.init(zero,0UL);
-			os << "[";
-			bool firstrow=true;
-			long nmu = _indices.size()-1;
-			for (typename Storage::const_iterator it=_indices.begin(); it!=_indices.end(); ++it) {
-				if (firstrow) {
-					os << "[";
-					firstrow =false;
-				}
-				else
-					os << ", [";
 
-				long i=0;
-				for( ; i< *it ; ++i) {
-					_field.write(os, zero);
-					if (i < nmu) os << ',';
+			// Avoid unneeded overhead in the case that this
+			// printing is disabled
+			if (not os)
+				return os;
+
+			switch (format) {
+			case Tag::FileFormat::Maple:
+				{
+					os << '[';
+					bool firstrow=true;
+					long nmu = (long)_indices.size()-1;
+					for (typename Storage::const_iterator it=_indices.begin(); it!=_indices.end(); ++it) {
+						if (firstrow) {
+							os << '[';
+							firstrow =false;
+						}
+						else
+							os << ", [";
+
+						long i=0;
+						for( ; i< *it ; ++i) {
+							field().write(os, field().zero);
+							if (i < nmu) os << ',';
+						}
+						field().write(os, field().one);
+						if (i < nmu) os << ',';
+						for(++i ; i< static_cast<long>(_indices.size()) ; ++i) {
+							field().write(os, field().zero);
+							if (i < nmu) os << ',';
+						}
+						os << ']';
+
+					}
+					os << ']';
+					break;
 				}
-				_field.write(os, one);
-				if (i < nmu) os << ',';
-				for(++i ; i< static_cast<long>(_indices.size()) ; ++i) {
-					_field.write(os, zero);
-					if (i < nmu) os << ',';
+			case Tag::FileFormat::Pretty:
+				{
+					for (typename Storage::const_iterator it=_indices.begin(); it!=_indices.end(); ++it) {
+						os << "  [";
+
+						long i=0;
+						for( ; i< *it ; ++i) {
+							field().write(os << ' ', field().zero);
+						}
+						field().write(os << ' ', field().one);
+						for(++i ; i< static_cast<long>(_indices.size()) ; ++i) {
+							field().write(os << ' ', field().zero);
+						}
+						os << " ]" << std::endl;
+
+					}
+					break;
 				}
-				os << " ]";
+
+			default:
+				os << '{';
+				for (typename Storage::const_iterator it=_indices.begin(); it!=_indices.end(); ++it)
+					os << *it << ' ';
+				os << '}';
+				break;
+
+
 			}
 
-			return os << "]";
+
+
+			return os;
+		}
+
+		//!@bug there is no read here. (needed by test-blackbox.h)
+		std::istream &read(std::istream &is, LINBOX_enum(Tag::FileFormat) format)
+		{
+            switch (format) {
+                case Tag::FileFormat::Plain:
+                {
+                    char t;
+                    is >> t;
+                    Storage::value_type val;
+                    _indices.resize(0);
+                    while( t != '}') {
+                        is >> val;
+                        _indices.push_back(val);                        
+                        is >> t; 
+                        if (t!='}') is.putback (t);
+                    }
+                    break;
+                    
+                }
+                default:
+                    throw NotImplementedYet();
+            }
+			return is ;
 		}
-#endif
 
-		Storage& setStorage(const Storage& s) { return _indices=s; }
-		const Storage& getStorage() const { return _indices; }
 
-	private:
-		// Vector of indices
-		Storage _indices;
+	Storage& setStorage(const Storage& s) { return _indices=s; }
+	const Storage& getStorage() const { return _indices; }
+	Storage& getStorage() { return _indices; }
 
-	}; // template <Vector> class Permutation
+	/// Generate next permutation in lex order.
+	void next()
+	{
+		int n = _indices.size();
+		if (n == 1) return;
+		int i, j;
+		for (i = n-2; i >= 0 and _indices[(size_t)i] >= _indices[(size_t)i+1]; --i);
+		if (i < 0) {identity(n); return; }
+		for (j = i+2; j < n and _indices[(size_t)i] <= _indices[(size_t)j]; ++j);
+		std::swap(_indices[(size_t)i], _indices[(size_t)j-1]);
+		std::reverse(_indices.begin() + i + 1, _indices.end());
+	}
+
+}; // template <Vector> class Permutation
 
 } // namespace LinBox
 
 #endif // __LINBOX_bb_permutation_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/polynomial.h b/linbox/blackbox/polynomial.h
index f9f8603..04c3934 100644
--- a/linbox/blackbox/polynomial.h
+++ b/linbox/blackbox/polynomial.h
@@ -93,7 +93,7 @@ namespace LinBox
 		inline Vector1 &apply (Vector1 &y, const Vector2 &x) const
 		{
 			Vector2 u (x);
-			Vector2 v(u.size());
+			Vector2 v(field(),u.size());
 			_VD.mul( y, x, _P_ptr->operator[](0) );
 			for (size_t i=1; i<_P_ptr->size(); ++i){
 				_A_ptr->apply( v, u );
@@ -117,7 +117,7 @@ namespace LinBox
 		inline Vector1 &applyTranspose (Vector1 &y, const Vector2 &x) const
 		{
 			Vector2 u( x );
-			Vector2 v(u.size());
+			Vector2 v(field(),u.size());
 			_VD.mul( y, x, _P_ptr->operator[](0));
 			for (size_t i=1; i<_P_ptr->size(); ++i){
 				_A_ptr->applyTranspose( v, u );
@@ -238,7 +238,7 @@ namespace LinBox
 		inline Vector1 &apply (Vector1 &y, const Vector2 &x) const
 		{
 			Vector2 u (x);
-			Vector2 v(u.size());
+			Vector2 v(field(),u.size());
 			_VD.mul( y, x, _P_data[0] );
 			for (size_t i=1; i<_P_data.size(); ++i){
 				_A_data.apply( v, u );
@@ -262,7 +262,7 @@ namespace LinBox
 		inline Vector1 &applyTranspose (Vector1 &y, const Vector2 &x) const
 		{
 			Vector2 u( x );
-			Vector2 v(u.size());
+			Vector2 v(field(), u.size());
 			_VD.mul( y, x, _P_data[0]);
 			for (size_t i=1; i<_P_data.size(); ++i){
 				_A_data.applyTranspose( v, u );
diff --git a/linbox/blackbox/quad-matrix.h b/linbox/blackbox/quad-matrix.h
index 1fc9dd4..51f6f13 100644
--- a/linbox/blackbox/quad-matrix.h
+++ b/linbox/blackbox/quad-matrix.h
@@ -34,6 +34,8 @@
 #include "linbox/blackbox/blackbox-interface.h"
 #include "linbox/blackbox/scalar-matrix.h"
 #include "linbox/blackbox/zo.h"
+#include "linbox/vector/subvector.h"
+#include "linbox/vector/blas-vector.h"
 //#include "linbox/blackbox/side-by-side.h"
 //#include "linbox/blackbox/over-under.h"
 
@@ -64,28 +66,31 @@ namespace LinBox
 
 	  \ingroup blackbox
 
+	  @bug needs read for test-blackbox.h
 */
 	template <typename _Field>
 	class ZOQuad {
+	public:
+		typedef _Field Field;
+		typedef typename Field::Element Element;
+		typedef size_t Index;
+		typedef std::vector<Index> IndexVector;
+		typedef std::vector<IndexVector::iterator> PointerVector;
 		//friend class ZeroOne<_Field>;
+	protected:
 		enum BBtype {zo, sbs, ou};
 		const void* _BBp;
 		BBtype _tag;
 		size_t _r, _c;
 		static const unsigned int smallThreshold = 60000;
 
-	protected:
-		_Field _field;
+		const Field *_field;
 	public:
-		typedef _Field Field;
-
-		typedef size_t Index;
-		typedef std::vector<Index> IndexVector;
-		typedef std::vector<IndexVector::iterator> PointerVector;
 
 		// constructors
 		ZOQuad() :
 			_BBp(0), _r(0), _c(0)
+			,_tag(zo),_field(NULL)
 		{}
 #if 0
 		ZOQuad(const ScalarMatrix<Field>&  A) :
@@ -94,9 +99,11 @@ namespace LinBox
 #endif
 		ZOQuad(const SideBySide<Field>& A) :
 			_BBp(&A), _tag(sbs), _r(A.rowdim()), _c(A.coldim())
+			,_field(&A.field())
 		{}
 		ZOQuad(const OverUnder<Field>& A) :
 			_BBp(&A), _tag(ou), _r(A.rowdim()), _c(A.coldim())
+			,_field(&A.field())
 		{}
 		ZOQuad(const ZeroOne<Field>& A) //:
 		// _BBp(&A), _tag(zo), _r(A.rowdim()), _c(A.coldim())
@@ -167,8 +174,8 @@ namespace LinBox
 				   PointerVector firstHalfP;
 				   std::back_insert_iterator< IndexVector > first(firstHalf);
 				   std::back_insert_iterator< PointerVector > firstP(firstHalfP);
-				   copy( A._index.begin(), *(A._indexP.begin() + A._indexP.size()/2), first);
-				   copy( A._indexP.begin(), A._indexP.begin() + A._indexP.size()/2 + 1, firstP);
+				   copy( A._index.begin(), *(A._indexP.begin() +(ptrdiff_t) A._indexP.size()/2), first);
+				   copy( A._indexP.begin(), A._indexP.begin() +(ptrdiff_t) A._indexP.size()/2 + 1, firstP);
 				   ZeroOne<Field> L(F, firstHalf, firstHalfP, A._rowdim, firstHalfP.size()-1, A.sorted);
 				   ZOQuad<Field> *LL = new ZOQuad<Field>(L);
 
@@ -176,8 +183,8 @@ namespace LinBox
 				   PointerVector secondHalfP;
 				   std::back_insert_iterator< IndexVector > second(secondHalf);
 				   std::back_insert_iterator< PointerVector > secondP(secondHalfP);
-				   copy( *(A._indexP.begin() + A._indexP.size()/2), A._index.end(), second);
-				   copy( A._indexP.begin() + A._indexP.size()/2, A._indexP.end(), secondP);
+				   copy( *(A._indexP.begin() +(ptrdiff_t) A._indexP.size()/2), A._index.end(), second);
+				   copy( A._indexP.begin() +(ptrdiff_t) A._indexP.size()/2, A._indexP.end(), secondP);
 				   ZeroOne<Field> R(F, secondHalf, secondHalfP, A._rowdim, secondHalfP.size()-1, A.sorted);
 				   ZOQuad<Field> *RR = new ZOQuad<Field>(R);
 
@@ -192,6 +199,13 @@ namespace LinBox
 			   }
 			   //*/
 		}
+
+
+		std::istream &read (std::istream &is)
+		{
+			throw(LinBoxError("no read in ZOQuad"));
+		}
+
 		std::ostream & write(std::ostream & out) const
 		{
 			switch (_tag)
@@ -439,14 +453,14 @@ namespace LinBox
 
 		template <typename InVector, typename OutVector>
 		OutVector& apply(OutVector& y, const InVector& x) const
-		//OutVector& apply(OutVector& y, const InVector& x)
 		{
 			std::vector<typename Field::Element> z(y.size());
+			// BlasVector<Field> z(field(),y.size());
 			VectorDomain<Field> VD(field());
-			//std::vector<typename Field::Element> x_1( x.begin(), x.begin() + _quadLeft->coldim() );
-			//std::vector<typename Field::Element> x_2( x.begin() + _quadLeft->coldim(), x.end() );
-			Subvector<typename InVector::const_iterator> x_1(x.begin(), x.begin()+_quadLeft->coldim());
-			Subvector<typename InVector::const_iterator> x_2(x.begin()+_quadLeft->coldim(), x.end());
+			Subvector<typename InVector::const_iterator> x_1(x.begin(), x.begin()+(ptrdiff_t)_quadLeft->coldim());
+			// BlasSubvector<Field> x_1(x.begin(), x.begin()+(ptrdiff_t)_quadLeft->coldim());
+			Subvector<typename InVector::const_iterator> x_2(x.begin()+(ptrdiff_t)_quadLeft->coldim(), x.end());
+			// BlasSubvector<Field> x_2(x.begin()+(ptrdiff_t)_quadLeft->coldim(), x.end());
 			//std::cout << " side-by-side apply size of x: " << x.size() << " " << " size of y: " << y.size() << endl;
 			//std::cout << " side-by-side apply size of x_1: " << x_1.size() << " " << " size of x_2: " << x_2.size() << endl;
 			_quadLeft->apply (y, x_1);
@@ -458,16 +472,16 @@ namespace LinBox
 
 		template <typename InVector, typename OutVector>
 		OutVector& applyTranspose(OutVector& y, const InVector& x) const
-		//OutVector& applyTranspose(OutVector& y, const InVector& x)
 		{
-			//std::vector<typename Field::Element> y_1( y.begin(), y.begin() + _quadLeft->coldim() );
-			//std::vector<typename Field::Element> y_2( y.begin() + _quadLeft->coldim(), y.end() );
-			Subvector<typename OutVector::iterator, typename OutVector::const_iterator> y_1(y.begin(), y.begin()+_quadLeft->coldim());
-			Subvector<typename OutVector::iterator, typename OutVector::const_iterator> y_2(y.begin()+_quadLeft->coldim(), y.end());
+			Subvector<typename OutVector::iterator, typename OutVector::const_iterator> y_1(y.begin(), y.begin()+(ptrdiff_t)_quadLeft->coldim());
+			// BlasSubvector<Field> y_1(y.begin(), y.begin()+(ptrdiff_t)_quadLeft->coldim());
+			Subvector<typename OutVector::iterator, typename OutVector::const_iterator> y_2(y.begin()+(ptrdiff_t)_quadLeft->coldim(), y.end());
+
+			// BlasSubvector<Field> y_2(y.begin()+(ptrdiff_t)_quadLeft->coldim(), y.end());
 			_quadLeft->applyTranspose (y_1, x);
 			_quadRight->applyTranspose (y_2, x);
 			copy(y_1.begin(), y_1.end(), y.begin());
-			copy(y_2.begin(), y_2.end(), y.begin() + y_1.size());
+			copy(y_2.begin(), y_2.end(), y.begin() +(ptrdiff_t) y_1.size());
 			return y;
 		}
 
@@ -489,31 +503,29 @@ namespace LinBox
 
 		template <typename InVector, typename OutVector>
 		OutVector& apply(OutVector& y, const InVector& x) const
-		//OutVector& apply(OutVector& y, const InVector& x)
 		{
 			//std::vector<typename Field::Element> y_1( y.begin(), y.begin() + _quadUp->rowdim() );
 			//std::vector<typename Field::Element> y_2( y.begin() + _quadUp->rowdim(), y.end() );
-			Subvector<typename OutVector::iterator, typename OutVector::const_iterator> y_1(y.begin(), y.begin()+_quadUp->rowdim());
-			Subvector<typename OutVector::iterator, typename OutVector::const_iterator> y_2(y.begin()+_quadUp->rowdim(), y.end());
+			Subvector<typename OutVector::iterator, typename OutVector::const_iterator> y_1(y.begin(), y.begin()+(ptrdiff_t)_quadUp->rowdim());
+			Subvector<typename OutVector::iterator, typename OutVector::const_iterator> y_2(y.begin()+(ptrdiff_t)_quadUp->rowdim(), y.end());
 			//if ((_A_ptr == 0) || (_B_ptr == 0)) { throw error }
 			//std::cout << " over-under apply size of x: " << x.size() << " " << " size of y: " << y.size() << endl;
 			//std::cout << " over-under apply size of y_1: " << y_1.size() << " " << " size of y_2: " << y_2.size() << endl;
 			_quadUp->apply (y_1, x);
 			_quadDown->apply (y_2, x);
 			//copy(y_1.begin(), y_1.end(), y.begin());
-			//copy(y_2.begin(), y_2.end(), y.begin() + y_1.size());
+			//copy(y_2.begin(), y_2.end(), y.begin() +(ptrdiff_t) y_1.size());
 
 			return y;
 		}
 
 		template <typename InVector, typename OutVector>
 		OutVector& applyTranspose(OutVector& y, const InVector& x) const
-		//OutVector& applyTranspose(OutVector& y, const InVector& x)
 		{
 			std::vector<typename Field::Element> z(y.size());
 			VectorDomain<Field> VD(field());
-			std::vector<typename Field::Element> x_1( x.begin(), x.begin() + _quadUp->rowdim() );
-			std::vector<typename Field::Element> x_2( x.begin() + _quadUp->rowdim(), x.end() );
+			std::vector<typename Field::Element> x_1( x.begin(), x.begin() + (ptrdiff_t)_quadUp->rowdim() );
+			std::vector<typename Field::Element> x_2( x.begin() + (ptrdiff_t)_quadUp->rowdim(), x.end() );
 			//Subvector<typename InVector::iterator, typename InVector::const_iterator> x_1(x.begin(), x.begin()+_quadUp->rowdim());
 			//Subvector<typename InVector::iterator, typename InVector::const_iterator> x_2(x.begin()+_quadUp->rowdim(), x.end());
 			_quadUp->applyTranspose (y, x_1);
@@ -534,11 +546,10 @@ namespace LinBox
 #endif // __LINBOX_quad_matrix_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/random-matrix.h b/linbox/blackbox/random-matrix.h
index 03d40db..557db32 100644
--- a/linbox/blackbox/random-matrix.h
+++ b/linbox/blackbox/random-matrix.h
@@ -28,7 +28,7 @@
 #define __LINBOX_blackbox_random_matrix_H
 
 #include "linbox/blackbox/blackbox-interface.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 
 namespace LinBox
 {
@@ -54,28 +54,27 @@ namespace LinBox
 							  int rowdim, int coldim )
 		{
 
-			Ap = new BlasMatrix<Field>(f, rowdim, coldim);
+			Ap = new BlasMatrix<Field>(f, (size_t)rowdim, (size_t)coldim);
 			typename BlasMatrix<Field>::Iterator Ap_p;
-			typename Field::Element zero, one, elt;
-			f. init (one, 1); f. init (zero, 0);
+			typename Field::Element  elt;
 
 			for (Ap_p = Ap -> Begin(); Ap_p != Ap -> End(); ++ Ap_p)
-				f. assign (*Ap_p, zero);
+				f. assign (*Ap_p, f.zero);
 
 			if (rowdim < coldim)
 				for (int i = 0; i < rowdim; ++ i) {
-					Ap -> setEntry (i, i, one);
+					Ap -> setEntry ((size_t)i,(size_t) i, f.one);
 					for (int j = rowdim; j < coldim; ++ j){
-						f. init (elt, rand()%10);
-						Ap -> setEntry (i, j, elt);
+						f. init (elt, (uint64_t)(rand()%10));
+						Ap -> setEntry ((size_t)i, (size_t)j, elt);
 					}
 				}
 			else
 				for (int i = 0; i < coldim; ++ i) {
-					Ap -> setEntry (i, i, one);
+					Ap -> setEntry ((size_t)i,(size_t) i, f.one);
 					for (int j = coldim; j < rowdim; ++ j) {
-						f. init (elt, rand()%10);
-						Ap -> setEntry (j, i, elt);
+						f. init (elt, (uint64_t)(rand()%10));
+						Ap -> setEntry ((size_t)j,(size_t) i, elt);
 					}
 				}
 
@@ -92,7 +91,7 @@ namespace LinBox
 							   int rowdim, int coldim)
 		{
 
-			Ap = new SparseMatrix<Field>(f, rowdim, coldim);
+			Ap = new SparseMatrix<Field>(f, (size_t)rowdim, (size_t)coldim);
 
 			const int m = rowdim < coldim ? rowdim : coldim;
 
@@ -100,11 +99,11 @@ namespace LinBox
 
 			typename Field::Element elt;
 
-			f. init (elt, 1);
+			f. assign(elt, f.one);
 
 			for ( i = 0; i < m; ++ i)
 
-				Ap -> setEntry (i, i, elt);
+				Ap -> setEntry ((size_t)i, (size_t)i, elt);
 
 
 			if ( m < rowdim ) {
@@ -119,7 +118,7 @@ namespace LinBox
 
 						f.init(elt, rand() % 10 + 1);
 
-						Ap -> setEntry (i, j, elt);
+						Ap -> setEntry ((size_t)i, (size_t)j, elt);
 					}
 				}
 			}
@@ -138,7 +137,7 @@ namespace LinBox
 
 						f.init(elt, rand() % 10 + 1);
 
-						Ap -> setEntry (i, j, elt);
+						Ap -> setEntry ((size_t)i, (size_t)j, elt);
 					}
 				}
 			}
diff --git a/linbox/blackbox/rational-matrix-factory.h b/linbox/blackbox/rational-matrix-factory.h
index 55e34b7..16f53f1 100644
--- a/linbox/blackbox/rational-matrix-factory.h
+++ b/linbox/blackbox/rational-matrix-factory.h
@@ -26,8 +26,7 @@
 
 #include "linbox/blackbox/factory.h"
 //#include "linbox/field/gmp-rational.h"
-#include "linbox/field/PID-integer.h"
-#include "linbox/integer.h"
+#include "givaro/zring.h"
 
 #include <vector>
 
@@ -49,9 +48,6 @@ namespace LinBox
 	class RationalMatrixFactory /*: public MatrixFactory<Integers,typename Rationals::Element >*/ {
 		//typedef GMPRationalField Rationals;
 		typedef typename Rationals::Element Quotient;
-		//typedef PID_integer Integers;
-		//typedef typename PID_integer::Element Integer;
-		//
 
 	private:
 		const QMatrix*  _matA;
@@ -77,9 +73,9 @@ namespace LinBox
 		double maxNorm(double& res) const {
 			typename QMatrix::ConstIterator i;
 			res = 0.0;
-			double tmp;
 
 			for( i = _matA->Begin(); i != _matA->End(); ++i ) {
+				double tmp;
 				Integer d,n;
 				_ratField.get_den(d,*i);
 				_ratField.get_num(n,*i);
@@ -94,9 +90,9 @@ namespace LinBox
 			typename QMatrix::ConstRow::const_iterator c;
 
 			res = 1.0;
-			double temp;
 
 			for( r = _matA->rowBegin(); r != _matA->rowEnd(); ++r ) {
+			double temp;
 				temp = 0.0;
 				for( c = r->begin(); c != r->end(); ++c ) {
 					Integer d,n;
@@ -119,7 +115,6 @@ namespace LinBox
 		Integer& denominator(Integer& da) const {
 			if (_denA ==1 ) {
 				ConstIterator i;
-				//_denA = 1L;
 				for (i = _matA->Begin (); i != _matA->End (); ++i) {
 					Integer d;
 					_ratField.get_den(d,*i);
@@ -130,24 +125,23 @@ namespace LinBox
 		}
 
 		/*
-		 * returns common denominator _denAi[i] of i-th row
+		 * returns common denominator _denAi[(size_t)i] of i-th row
 		 */
 		Integer& denominator(Integer& di, const int i) const {
-			if (_denAi[i]==1) {
-				typedef typename QMatrix::ConstRow::const_iterator EltIterator;
+			if (_denAi[(size_t)i]==1) {
 				for (size_t j=0; j < _matA->coldim(); ++j) {
 					Integer d;
-					_ratField.get_den(d,_matA->getEntry(i,j));
-					lcm(_denAi[i],_denAi[i],d);
+					_ratField.get_den(d,_matA->getEntry((size_t)i,(size_t)j));
+					lcm(_denAi[(size_t)i],_denAi[(size_t)i],d);
 				}
 			}
-			return di=_denAi[i];
+			return di=_denAi[(size_t)i];
 		}
 
 		//returns max of abs(numerators) and denominators of _matA
 		Integer& rationalNorm(Integer& res) const {
 			ConstIterator i;
-			res = 0L;
+			res = int64_t(0);
 			Integer tmp;
 			for (i = _matA->Begin (); i != _matA->End (); ++i) {
 				Integer n ;
@@ -173,9 +167,9 @@ namespace LinBox
 			return res;
 		}
 
-		//returns norm of tilde{A} = diag(_denAi[i])_matA
+		//returns norm of tilde{A} = diag(_denAi[(size_t)i])_matA
 		Integer& normAtilde(Integer& res) const {
-			res = 0L;
+			res = int64_t(0);
 			double dres = 0;
 			//int i=0;
 			Integer tmp;
@@ -202,21 +196,20 @@ namespace LinBox
 		 * optimization: computes normAprim, normAprim, rationalNormat the same time
 		 */
 		Integer getNorms(Integer& ratnorm, Integer& normaprim, Integer& normatilde) const {
-			typedef typename QMatrix::ConstRow::const_iterator EltIterator;
-			ratnorm = 0L; normaprim=0L; normatilde= 0L;
-			Integer da=1L;
-			std::vector<integer> di(_matA->rowdim(),1L);
+			ratnorm = int64_t(0); normaprim=int64_t(0); normatilde= int64_t(0);
+			Integer da=int64_t(1);
+			std::vector<integer> di(_matA->rowdim(),int64_t(1));
 
 			for (size_t i=0; i < _matA->rowdim(); ++i)  {
-				if (_denAi[i]==1) {
+				if (_denAi[(size_t)i]==1) {
 					for (size_t j=0; j < _matA->coldim(); ++j ) {
 						Integer d ;
 						_ratField.get_den(d,_matA->getEntry(i,j));
-						lcm(_denAi[i],_denAi[i],d);
+						lcm(_denAi[(size_t)i],_denAi[(size_t)i],d);
 					}
 				}
-				di[i] = _denAi[i];
-				lcm(_denA,_denA,di[i]);
+				di[(size_t)i] = _denAi[(size_t)i];
+				lcm(_denA,_denA,di[(size_t)i]);
 			}
 			da = _denA;
 
@@ -231,7 +224,7 @@ namespace LinBox
 					if (tmp > ratnorm) ratnorm = tmp;
 					if (d > ratnorm) ratnorm = d;
 
-					Integer tmp2 = (di[i]) / d;
+					Integer tmp2 = (di[(size_t)i]) / d;
 					tmp2 *=tmp;
 					if (tmp2 > normatilde) normatilde = tmp2;
 
@@ -271,7 +264,7 @@ namespace LinBox
 		}
 
 		/*
-		 * Creates Atilde = diag(_denAi[i]) * _matA
+		 * Creates Atilde = diag(_denAi[(size_t)i]) * _matA
 		 */
 		template <class Matrix>
 		Matrix& makeAtilde(Matrix& Atilde) const {
@@ -279,7 +272,7 @@ namespace LinBox
 			Atilde.resize(_matA->rowdim(),_matA->coldim());
 			std::vector<integer> di(_matA->rowdim());
 			for (size_t i=0; i < (size_t)_matA->rowdim(); ++i)
-				denominator(di[(int)i],(int)i);
+				denominator(di[(size_t)i],(int)i);
 
 			for( size_t i=0; i < _matA->rowdim(); ++i) {
 				for (size_t j=0; j < _matA->coldim(); ++j) {
@@ -288,7 +281,7 @@ namespace LinBox
 					_ratField.get_num(n,Aij);
 					Integer d ;
 					_ratField.get_den(d,Aij);
-					Integer tmp = di[i]/d;
+					Integer tmp = di[(size_t)i]/d;
 					tmp *=n;
 					typename Matrix::Field F=Atilde.field();
 					typename Matrix::Field::Element ftmp; F.init(ftmp,tmp);
diff --git a/linbox/blackbox/scalar-matrix.h b/linbox/blackbox/scalar-matrix.h
index 0590449..f9d7666 100644
--- a/linbox/blackbox/scalar-matrix.h
+++ b/linbox/blackbox/scalar-matrix.h
@@ -33,12 +33,14 @@
 #define __LINBOX_scalar_H
 
 #include <algorithm>
+#include <iostream>
 #include "linbox/field/hom.h"
 #include "linbox/vector/vector-traits.h"
-#include "linbox/util/debug.h"
 #include "linbox/linbox-config.h"
-#include "linbox/field/hom.h"
 #include "linbox/blackbox/blackbox-interface.h"
+#include "linbox/solutions/solution-tags.h"
+#include "linbox/util/matrix-stream.h"
+#include "linbox/util/write-mm.h"
 
 namespace LinBox
 {
@@ -50,13 +52,13 @@ namespace LinBox
 	 * The matrix itself is not stored in memory, just the scalar and the dimensions.
 	 * \ingroup blackbox
 	 */
-	template <class _Field>
+	template <class Field_>
 	class ScalarMatrix : public  BlackboxInterface {
 	public:
 
-		typedef _Field Field;
+		typedef Field_ Field;
 		typedef typename Field::Element        Element;
-		typedef ScalarMatrix<_Field> Self_t;
+		typedef ScalarMatrix<Field> Self_t;
 
 		/*  In each specialization, I must define suitable constructor(s) and
 		 *  BlackboxArchetype<Vector> * clone() const;
@@ -69,18 +71,60 @@ namespace LinBox
 		 */
 
 		/// Constructs an initially 0 by 0 matrix.
+		//! @bug this should not be allowed (unknown field)
 		ScalarMatrix ()	:
-			_n(0)
+			field_(NULL),
+			n_(0)
+		{}
+
+		ScalarMatrix( MatrixStream<Field> & ms) :
+			field_(&ms.field())
+			,n_(0)
+		{
+			size_t c, i, j;
+			if( !ms.getDimensions(n_, c) || c != n_ )
+				throw ms.reportError(__FUNCTION__,__LINE__);
+			ms.nextTriple(i, j, v_);
+			if (i != j) throw ms.reportError(__FUNCTION__,__LINE__);
+			// finalize();
+		}
+
+		void changeField(const Field &F)
+		{
+			field_ = &F ;
+		}
+
+		/** Constructor of readable scalar matrix.
+		 * @param F	field in which to do arithmetic.
+		 */
+		ScalarMatrix (const Field &F) :
+			field_(&F),
+			n_(0)
 		{}
 
+#if 0
 		/** Scalar matrix Constructor from an element.
 		 * @param F	field in which to do arithmetic.
 		 * @param n	size of the matrix.
 		 * @param s	scalar, a field element, to be used as the diagonal of the matrix.
+		 * @bug this is a wrong constructor, should be the following...
 		 */
 		ScalarMatrix (const Field &F, const size_t n, const Element &s) :
-			_field(F), _n(n), _v(s)
+			field_(&F), n_(n), v_(s)
 		{}
+#endif
+
+		ScalarMatrix (const Field &F, const size_t n, const size_t m, const Element &s) :
+			field_(&F), n_(n), v_(s)
+		{
+			linbox_check(n ==m);
+		}
+
+		ScalarMatrix (const Field &F, const size_t n, const size_t m) :
+			field_(&F), n_(n), v_(0)
+		{
+			linbox_check(m==n);
+		}
 
 		/** Constructor from a random element.
 		 * @param F    field in which to do arithmetic.
@@ -88,14 +132,20 @@ namespace LinBox
 		 * @param iter Random iterator from which to get the diagonal scalar element.
 		 */
 		ScalarMatrix (const Field &F, const size_t n, const typename Field::RandIter& iter) :
-			_field(F), _n(n)
-		{ iter.random(_v); }
+			field_(&F), n_(n)
+		{ iter.random(v_); }
 
 		ScalarMatrix(const ScalarMatrix<Field> &Mat) :
-			_field(Mat._field)
+			field_(Mat.field_)
+			, n_(Mat.n_), v_(Mat.v_)
+		{
+			//n_ = Mat.n_;
+			//v_ = Mat.v_;
+		}
+
+		void setScalar(Element & x)
 		{
-			_n = Mat._n;
-			_v = Mat._v;
+			field().assign(v_, x) ;
 		}
 
 
@@ -128,48 +178,74 @@ namespace LinBox
 			{
 				Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
 				typename _Tp1::Element e;
-				Ap.field().init(e,0UL);
-				hom.image (e, A._v);
+				Ap.field().assign(e,Ap.field().zero);
+				hom.image (e, A.v_);
 				Ap.setScalar(e);
 			}
 		};
 
 		template<typename _Tp1>
 		ScalarMatrix (const ScalarMatrix<_Tp1>& S, const Field &F) :
-			_field(F), _n(S.rowdim())
+			field_(&F), n_(S.rowdim())
 		{
 			typename ScalarMatrix<_Tp1>::template rebind<Field>() (*this, S);
 		}
 
 
-		size_t rowdim(void) const { return _n; }
+		size_t rowdim(void) const { return n_; }
 
-		size_t coldim(void) const { return _n; }
+		size_t coldim(void) const { return n_; }
 
-		const Field& field() const {return _field;}
+		const Field& field() const {return *field_;}
+
+		// for specialized solutions
 
-		// for a specialization in solutions
 		Element& trace(Element& t) const
-		{	Element n; _field.init(n, _n);
-			return _field.mul(t, _v, n);
+		{	Element n; field().init(n, n_);
+			return field().mul(t, v_, n);
 		}
 
 		Element& getEntry(Element& x, const size_t i, const size_t j) const
 		{
-			return (i==j?_field.assign(x,_v):_field.init(x,0));
+			// return (i==j ? field().assign(x,v_) : field().assign(x,field().zero));
+			return (i==j ? field().assign(x,v_) : field().assign(x,field().zero));
+		}
+
+		Element& det(Element& d) const
+		{
+			return pow(field(), d, v_, n_);
+		}
+
+		long int& rank(long int& r) const
+		{
+			return r = (field().isZero(v_) ? 0 : n_);
 		}
 
+		Element& getScalar(Element& x) const { return this->field().assign(x,this->v_); }
+		Element& setScalar(const Element& x) { return this->field().assign(this->v_,x); }
+		std::ostream& write(std::ostream& os) const {
+			writeMMCoordHeader(os, *this, 1, "ScalarMatrix");
+			field().write(os << "1 1 ", v_) << std::endl;
+			return os;
+		}
 
-		Element& getScalar(Element& x) const { return this->_field.assign(x,this->_v); }
-		Element& setScalar(const Element& x) { return this->_field.assign(this->_v,x); }
+		std::istream& read(std::istream& is) {
+			MatrixStream<Field> ms(field(), is);
+			size_t c, i, j;
+			if( !ms.getDimensions(n_, c) || c != n_ )
+				throw ms.reportError(__FUNCTION__,__LINE__);
+			ms.nextTriple(i, j, v_);
+			if (i != j) throw ms.reportError(__FUNCTION__,__LINE__);
+			return is;
+		}
 
 	protected:
 
-		Field _field;   // Field for arithmetic
+		const Field *field_;   // Field for arithmetic
 
-		size_t _n;  // Number of rows and columns of square matrix.
+		size_t n_;  // Number of rows and columns of square matrix.
 
-		Element _v; // the scalar used in applying matrix.
+		Element v_; // the scalar used in applying matrix.
 
 		// dense vector _app for apply
 		template<class OutVector, class InVector>
@@ -186,6 +262,13 @@ namespace LinBox
 		template<class OutVector, class InVector>
 		OutVector& _app (OutVector &y, const InVector &x, VectorCategories::SparseAssociativeVectorTag) const;
 
+		// p <- a^e.  Really should be a field op
+		Element& pow(Field& F, Element& p, const Element& a, const size_t e) {
+			Element x; F.init(x);
+			if (e == 0) return F.assign(p, F.one);
+			if (e%2 == 0) return pow(F, p, F.mul(x, a, a), e/2);
+			else /* (e%2 == 1)*/ return F.mul(p, a, pow(F, p, a, e-1));
+		}
 	}; // template <Field> class ScalarMatrix
 
 	// dense vector _app
@@ -194,18 +277,18 @@ namespace LinBox
 	inline OutVector &ScalarMatrix<Field>::
 	_app(OutVector& y, const InVector& x, VectorCategories::DenseVectorTag t) const
 	{
-		linbox_check (x.size() >= _n);
-		linbox_check (y.size() >= _n);
+		linbox_check (x.size() >= n_);
+		linbox_check (y.size() >= n_);
 		typename OutVector::iterator y_iter = y.begin ();
 
-		if (_field.isZero(_v)) // just write zeroes
-			for ( ; y_iter != y.end ();  ++y_iter) *y_iter = _v;
-		else if (_field.isOne(_v) ) // just copy
-			copy(x.begin(), x.end(), y.begin());
+		if (field().isZero(v_)) // just write zeroes
+			for ( ; y_iter != y.end ();  ++y_iter) *y_iter = v_;
+		else if (field().isOne(v_) ) // just copy
+			std::copy(x.begin(), x.end(), y.begin());
 		else // use actual muls
 		{   typename InVector::const_iterator x_iter = x.begin ();
 			for (  ; y_iter != y.end () ; ++y_iter, ++x_iter )
-				_field.mul (*y_iter, _v, *x_iter);
+				field().mul (*y_iter, v_, *x_iter);
 		}
 		return y;
 
@@ -218,20 +301,20 @@ namespace LinBox
 	inline OutVector &ScalarMatrix<Field>::
 	_app(OutVector& y, const InVector& x, VectorCategories::SparseSequenceVectorTag t) const
 	{
-		//linbox_check ((!x.empty ()) && (_n < x.back ().first));
+		//linbox_check ((!x.empty ()) && (n_ < x.back ().first));
 		// neither is required of x ?
 
 		y.clear (); // we'll overwrite using push_backs.
 
 		// field element to be used in calculations
 		Element entry;
-		_field.init (entry, 0); // needed?
+		field().assign(entry, field().zero);
 
 		// For each element, multiply input element with corresponding element
 		// of stored scalar and insert non-zero elements into output vector
 		for ( typename InVector::const_iterator x_iter = x.begin (); x_iter != x.end (); ++x_iter)
-		{	_field.mul (entry, _v, x_iter->second);
-			if (!_field.isZero (entry)) y.push_back (make_pair (x_iter->first, entry));
+		{	field().mul (entry, v_, x_iter->second);
+			if (!field().isZero (entry)) y.push_back (make_pair (x_iter->first, entry));
 		}
 
 		return y;
@@ -247,29 +330,45 @@ namespace LinBox
 
 		// create field elements and size_t to be used in calculations
 		Element entry;
-		_field.init (entry, 0);
+		field().assign(entry, field().zero);
 
 		// Iterator over indices of input vector.
 		// For each element, multiply input element with
 		// stored scalar and insert non-zero elements into output vector
 		for ( typename InVector::const_iterator x_iter = x.begin (); x_iter != x.end (); ++x_iter)
-		{	_field.mul (entry, _v, x_iter->second);
-			if (!_field.isZero (entry)) y.insert (y.end (), make_pair (x_iter->first, entry));
+		{	field().mul (entry, v_, x_iter->second);
+			if (!field().isZero (entry)) y.insert (y.end (), make_pair (x_iter->first, entry));
 		}
 
 		return y;
 	} // sparse associative vector _app
 
+	// let solutions know we have getEntry() and trace().
+	template <class Field>
+	struct GetEntryCategory<ScalarMatrix<Field> >
+	{ typedef SolutionTags::Local Tag; };
+
+	template <class Field>
+	struct TraceCategory<ScalarMatrix<Field> >
+	{ typedef SolutionTags::Local Tag; };
+
+	template <class Field>
+	struct DetCategory<ScalarMatrix<Field> >
+	{ typedef SolutionTags::Local Tag; };
+
+	template <class Field>
+	struct RankCategory<ScalarMatrix<Field> >
+	{ typedef SolutionTags::Local Tag; };
+
 } // namespace LinBox
 
 #endif // __LINBOX_scalar_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/scompose.h b/linbox/blackbox/scompose.h
index 606faf9..6cc76fc 100644
--- a/linbox/blackbox/scompose.h
+++ b/linbox/blackbox/scompose.h
@@ -86,13 +86,16 @@ namespace LinBox
 
 			typename BlasMatrix<Field>::RowIterator row_p;
 
-			std::vector<typename Field::Element> tmp(R.rowdim());
+			// std::vector<typename Field::Element> tmp(R.rowdim());
+			BlasVector<Field> tmp(R.field(),R.rowdim());
 
 			for (row_p = LAR -> rowBegin(), crow_p = L.rowBegin();
 			     row_p != LAR -> rowEnd(); ++ row_p, ++ crow_p) {
 
 				A.applyTranspose(tmp, *crow_p);
 
+				// BlasSubvector<BlasVector<Field> > row_p_v(R.field(),*row_p); //! @warning should not be necessary (RowIterator should be a BlasSubvector...).
+				// R.applyTranspose(row_p_v, tmp);
 				R.applyTranspose(*row_p, tmp);
 			}
 
diff --git a/linbox/blackbox/sparse.h b/linbox/blackbox/sparse.h
deleted file mode 100644
index 5b89ecf..0000000
--- a/linbox/blackbox/sparse.h
+++ /dev/null
@@ -1,443 +0,0 @@
-/* linbox/blackbox/sparse.h
- * Copyright (C) 1999-2005 William J Turner,
- *               2001-2002 Bradford Hovinen
- *
- * Written by W. J. Turner <wjturner at acm.org>,
- *            Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * ------------------------------------
- * 2002-08-06  Bradford Hovinen  <hovinen at cis.udel.edu>
- *
- * Renamed to sparse.h from sparse0.h
- * ------------------------------------
- * Modified by Bradford Hovinen <hovinen at cis.udel.edu>
- * Modified by Jean-Guillaume Dumas <Jean-Guillaume.Dumas at imag.fr>
- * 	       28.08.2002 : added back : field()
- *
- * Refactoring:
- *   - Eliminated SparseMatrixAux and moved that functionality into Sparse0
- *   - Made SparseMatrixBase parameterized only on the element type
- *   - New read/write implementations for SparseMatrixBase, supporting multiple
- *     formats
- *   - Eliminated Gaussian elimination code
- *   - Added iterators, including ColOfRowsIterator, Iterator, and
- *     IndexIterator
- *   - Eliminated operator []; added getEntry; changed put_value to setEntry
- * ------------------------------------
- * Modified by W. J. Turner <wjturner at acm.org>
- *	24.06.2005 : Removed using declarations
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_blackbox_sparse_H
-#define __LINBOX_blackbox_sparse_H
-
-#include "linbox/linbox-config.h"
-#include "linbox/blackbox/blackbox-interface.h"
-#include "linbox/matrix/sparse.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/vector/vector-traits.h"
-#include "linbox/vector/stream.h"
-#include "linbox/util/field-axpy.h"
-#include "linbox/field/hom.h"
-#include "linbox/field/rebind.h"
-
-namespace LinBox
-{
-
-	/** \brief vector of sparse rows.
-
-	 * This is a generic black box for a sparse matrix. It inherits
-	 * LinBox::SparseMatrixBase, which implements all of the underlying
-	 * accessors and iterators.
-	 * \ingroup blackbox
-	 */
-	template <class _Field,
-	class _Row    = typename LinBox::Vector<_Field>::Sparse>
-	class SparseMatrix : public BlackboxInterface, public SparseMatrixBase<typename _Field::Element, _Row> {
-	public:
-
-		typedef _Field Field;
-		typedef typename Field::Element Element;
-		typedef typename SparseMatrixBase<typename Field::Element, _Row>::Row Row;
-		typedef typename SparseMatrixBase<typename Field::Element, _Row>::Rep Rep;
-		typedef SparseMatrix<_Field, _Row> Self_t;
-
-
-#ifdef __LINBOX_PARALLEL
-		BB_list_list sub_list;
-#endif
-
-		FileFormatTag Format;
-
-		typedef typename SparseMatrixBase<typename Field::Element, _Row>::Iterator Iterator;
-		typedef typename SparseMatrixBase<typename Field::Element, _Row>::IndexedIterator IndexedIterator;
-		typedef typename SparseMatrixBase<typename Field::Element, _Row>::ConstIterator ConstIterator;
-		typedef typename SparseMatrixBase<typename Field::Element, _Row>::ConstIndexedIterator ConstIndexedIterator;
-
-		/** Constructor.
-		 * Builds a zero m x n matrix
-		 * Note: the copy constructor and operator= will work as intended
-		 *       because of STL's container design
-		 * @param  F  Field over which entries exist
-		 * @param  m  Row dimension
-		 * @param  n  Column dimension
-		 */
-#if 0
-		SparseMatrix (const Field &F) :
-			SparseMatrixBase<Element, _Row> (0,0), _field (F), _VD (F), _MD (F), _AT (*this)
-		{
-			std::cerr << "default cstor" << std::endl;
-		}
-
-		SparseMatrix (const Field &F, size_t m, size_t n) :
-			SparseMatrixBase<Element, _Row> (m, n), _field (F), _VD (F), _MD (F), _AT (*this)
-		{
-			std::cerr << "default cstor : " <<  m << "x" << n << std::endl;
-		}
-#endif
-		SparseMatrix (const Field &F, size_t m=0, size_t n=0) :
-			SparseMatrixBase<Element, _Row> (m, n), _field (F), _VD (F), _MD (F), _AT (*this)
-		{ }
-
-		/** Constructor from a vector stream
-		 * @param  F  Field over which entries exist
-		 * @param  stream  Stream with which to generate row vectors
-		 */
-		template<class VectStream>
-		SparseMatrix (const Field &F, VectStream &stream) :
-			SparseMatrixBase<Element, _Row> (stream.size (), stream.dim ()),
-			_field (F), _VD (F), _MD (F), _AT (*this)
-		{
-			typename SparseMatrixBase<Element, _Row>::RowIterator i;
-
-			for (i = SparseMatrixBase<Element, _Row>::rowBegin (); i != SparseMatrixBase<Element, _Row>::rowEnd (); ++i)
-				stream >> *i;
-		}
-
-
-		/** Constructor from a MatrixStream
-		 * @param ms A matrix stream properly initialized
-		 */
-		SparseMatrix( MatrixStream<Field>& ms ) :
-			SparseMatrixBase<Element,_Row>(ms), _field(ms.getField()), _VD(ms.getField()), _MD(ms.getField()), _AT(*this)
-		{ }
-
-		/** Copy constructor
-		*/
-		SparseMatrix (const SparseMatrix<Field, Row> &B) :
-			SparseMatrixBase<Element, _Row> (B), _field (B._field), _VD (B._field), _MD (B._field), _AT (*this)
-		{ }
-
-		/** Row type Converter constructor
-		*/
-		template<class VectorType>
-		SparseMatrix (const SparseMatrix<Field, VectorType> &B) :
-			SparseMatrixBase<Element, _Row> (B), _field (B._field), _VD (B._field), _MD (B._field), _AT (*this)
-		{ }
-
-		/** Destructor. */
-		~SparseMatrix () {
-#ifdef __LINBOX_PARALLEL
-
-			BB_list_list::iterator p;
-
-			BB_list::iterator e_p;
-
-			for (p = sub_list. begin(); p != sub_list. end(); ++ p)
-				for (e_p = p -> second. begin();
-				     e_p != p -> second. end(); ++ e_p) {
-
-					Thread::terminate_thread (*e_p);
-
-					delete (*e_p);
-				}
-#endif
-		}
-
-		/** Matrix-vector product
-		 * \f$y = A x\f$.
-		 * @return reference to output vector y
-		 * @param  x input vector
-		 * @param y
-		 */
-		template <class OutVector, class InVector>
-		OutVector &apply (OutVector &y, const InVector &x) const
-		{
-#ifdef __LINBOX_PARALLEL
-			return BlackboxParallel (y, *this, x, BBBase::Apply);
-#else
-			return _MD.vectorMul (y, *this, x);
-#endif
-		}
-
-		/** Transpose matrix-vector product
-		 * \f$ y = A^T x\f$.
-		 * @return reference to output vector y
-		 * @param  x input vector
-		 * @param y
-		 */
-		template <class OutVector, class InVector>
-		OutVector &applyTranspose (OutVector& y, const InVector &x) const
-		{
-#ifdef __LINBOX_PARALLEL
-			return BlackboxParallel (y, *this, x, BBBase::ApplyTranspose);
-#else
-			return _MD.vectorMul (y, _AT, x);
-#endif
-		}
-
-
-		template<typename _Tp1, typename _Rw1 = typename Rebind<_Row, _Tp1>::other>
-		struct rebind {
-			typedef SparseMatrix<_Tp1, _Rw1> other;
-
-			void operator() (other & Ap, const Self_t& A) {
-				// Ap = new other(F, A.rowdim(), A.coldim());
-
-				typename _Tp1::Element e;
-
-				Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
-				for( typename Self_t::ConstIndexedIterator
-				     indices = A.IndexedBegin();
-				     (indices != A.IndexedEnd()) ;
-				     ++indices ) {
-					// hom. image (e, A.getEntry(indices.rowIndex(),indices.colIndex()) );
-					hom. image (e, indices.value() );
-					if (!Ap.field().isZero(e))
-						Ap.setEntry (indices.rowIndex(),
-							     indices.colIndex(), e);
-				}
-			}
-		};
-
-		template<typename _Tp1, typename _Rw1>
-		SparseMatrix (const SparseMatrix<_Tp1, _Rw1> &Mat, const Field& F) :
-			SparseMatrixBase<Element, _Row> (Mat.rowdim(),Mat.coldim()),
-			_field (F), _VD (F), _MD (F), _AT (*this) {
-				typename SparseMatrix<_Tp1,_Rw1>::template rebind<Field,_Row>()(*this, Mat);
-			}
-
-
-
-
-		/** Retreive row dimensions of Sparsemat matrix.
-		 * @return integer number of rows of SparseMatrix0Base matrix.
-		 */
-		size_t rowdim () const
-		{ return SparseMatrixBase<Element, _Row>::_m; }
-
-		/** Retreive column dimensions of Sparsemat matrix.
-		 * @return integer number of columns of SparseMatrix0Base matrix.
-		 */
-		size_t coldim () const
-		{ return SparseMatrixBase<Element, _Row>::_n; }
-
-		/** Read the matrix from a stream in the given format
-		 * @param is Input stream from which to read the matrix
-		 * @param format Format of input matrix
-		 * @return Reference to input stream
-		 */
-		std::istream &read (std::istream &is, FileFormatTag format = FORMAT_DETECT)
-		{ return SparseMatrixBase<Element, _Row>::read (is, _field, format); }
-
-		/** Write the matrix to a stream in the given format
-		 * @param os Output stream to which to write the matrix
-		 * @param format Format of output
-		 * @return Reference to output stream
-		 */
-		std::ostream &write (std::ostream &os, FileFormatTag format = FORMAT_PRETTY) const
-		{ return SparseMatrixBase<Element, _Row>::write (os, _field, format); }
-
-		// JGD 28.08.2002
-		/** Access to the base field
-		*/
-		const Field& field () const
-		{ return _field;}
-
-	protected:
-
-		const Field                             _field;      // Field used for all arithmetic
-		VectorDomain<Field>                     _VD;     // Vector domain for matrix operations
-		MatrixDomain<Field>                     _MD;     // Matrix domain for matrix operations
-
-		TransposeMatrix<SparseMatrix<_Field, _Row> > _AT;
-
-		template<class F, class R> friend class SparseMatrix;
-		};
-
-	/** Sparse matrix factory
-	 * This class inherits \ref BlackboxFactory and provides a method for using a
-	 * \ref SparseMatrixBase object with integer or rational data type as input to
-	 * the high-level integer and rational solutions functions.
-	 */
-
-	template <class Field,
-	class BElement = typename Field::Element,
-	class Row      = typename LinBox::Vector<Field>::Sparse,
-	class BRow     = typename LinBox::RawVector<BElement>::Sparse>
-	class SparseMatrixFactory : public BlackboxFactory<Field,SparseMatrix<Field,Row> > {//otot
-		const SparseMatrixBase<BElement, BRow> &_matA;
-
-	public:
-
-		SparseMatrixFactory (const SparseMatrixBase<BElement, BRow> &A) :
-			_matA (A)
-		{}
-
-		// FIXME: This function assumes basically that the matrix is over the integers
-
-		SparseMatrix<Field,Row> *makeBlackbox (const Field &F);
-
-		integer &maxNorm (integer &res)
-		{
-			typename SparseMatrixBase<BElement, BRow>::ConstIterator i;
-
-			res = 0L;
-
-			integer tmp;
-
-			for (i = _matA.Begin (); i != _matA.End (); ++i) {
-				tmp = abs (*i);
-
-				if (res < tmp)
-					res = tmp;
-			}
-
-			return res;
-		}
-
-		size_t rowdim ()
-		{ return _matA.rowdim (); }
-		size_t coldim ()
-		{ return _matA.coldim (); }
-
-		// A better bound for determinant of an integer sparse matrix, ZW
-		integer &hadamardBound (integer& res) const
-		{
-			return hadamardBound (res, typename VectorTraits<Row>::VectorCategory());
-		}
-
-		integer &hadamardBound (integer& res,  VectorCategories::SparseParallelVectorTag) const
-		{
-			typedef typename SparseMatrixBase<BElement, BRow>::ConstRowIterator RowIterator;
-			typedef typename SparseMatrixBase<BElement, BRow>::ConstRow::second_type::const_iterator EltIterator;
-
-			res = 1L;
-
-			integer tmp;
-			RowIterator row_p;
-			EltIterator elt_p;
-
-			for (row_p = _matA. rowBegin(); row_p != _matA. rowEnd(); ++ row_p) {
-				tmp = 0;
-
-				for (elt_p = row_p -> second. begin(); elt_p != row_p -> second. end(); ++ elt_p)
-					tmp += static_cast<integer>(*elt_p) * (*elt_p);
-
-				res *=tmp;
-			}
-
-			res = sqrt (res);
-			return res;
-		}
-
-		integer &hadamardBound (integer& res,  VectorCategories::SparseSequenceVectorTag) const{
-			typedef typename SparseMatrixBase<BElement, BRow>::ConstRowIterator RowIterator;
-			typedef typename SparseMatrixBase<BElement, BRow>::ConstRow::const_iterator EltIterator;
-
-			res = 1L;
-
-			integer tmp;
-			RowIterator row_p;
-
-			for ( row_p = _matA. rowBegin(); row_p != _matA. rowEnd(); ++ row_p) {
-				tmp = 0;
-
-				for (EltIterator elt_p = row_p -> begin(); elt_p != row_p -> end(); ++ elt_p)
-					tmp += static_cast<integer>(elt_p -> second) * (elt_p -> second);
-
-				res *=tmp;
-			}
-
-			res = sqrt (res);
-			return res;
-		}
-
-		integer &hadamardBound (integer& res,  VectorCategories::SparseAssociativeVectorTag) const
-		{
-			typedef typename SparseMatrixBase<BElement, BRow>::ConstRowIterator RowIterator;
-			typedef typename SparseMatrixBase<BElement, BRow>::ConstRow::const_iterator EltIterator;
-
-			res = 1L;
-
-			integer tmp;
-			RowIterator row_p;
-			EltIterator elt_p;
-
-			for ( row_p = _matA. rowBegin(); row_p != _matA. rowEnd(); ++ row_p) {
-				tmp = 0;
-
-				for (elt_p = row_p -> begin(); elt_p != row_p -> end(); ++ elt_p)
-					tmp += static_cast<integer>(elt_p -> second) * (elt_p -> second);
-
-				res *=tmp;
-			}
-
-			res = sqrt (res);
-			return res;
-		}
-	};
-
-// #if !defined(__INTEL_COMPILER) && !defined(__CUDACC__) && !defined(__clang__)
-	// template <>
-// #endif
-	template <class Field, class _Row>
-	struct MatrixTraits< SparseMatrix<Field, _Row> >
-	{
-		typedef SparseMatrix<Field, _Row> MatrixType;
-		typedef MatrixCategories::RowMatrixTag MatrixCategory;
-	};
-
-	template <class Field, class _Row>
-	struct MatrixTraits< const SparseMatrix<Field, _Row> >
-	{
-		typedef const SparseMatrix<Field, _Row> MatrixType;
-		typedef MatrixCategories::RowMatrixTag MatrixCategory;
-	};
-
-} // namespace LinBox
-
-#include "linbox/blackbox/sparse.inl"
-
-#endif // __LINBOX_blackbox_sparse_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/blackbox/sparse.inl b/linbox/blackbox/sparse.inl
deleted file mode 100644
index 57f9380..0000000
--- a/linbox/blackbox/sparse.inl
+++ /dev/null
@@ -1,77 +0,0 @@
-/* linbox/blackbox/sparse.inl
- * Copyright (C) 1999-2001 William J Turner,
- *               2001-2002 Bradford Hovinen
- *
- * Written by William J Turner <wjturner at math.ncsu.edu>,
- *            Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * ------------------------------------
- * Modified by Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * Refactoring:
- *   - Eliminated SparseMatrixAux and moved that functionality into Sparse0
- *   - Made SparseMatrixBase parameterized only on the element type
- *   - New read/write implementations for SparseMatrixBase, supporting multiple
- *     formats
- *   - Eliminated Gaussian elimination code
- *   - Added iterators, including ColOfRowsIterator, Iterator, and
- *     IndexIterator
- *   - Eliminated operator []; added getEntry; changed put_value to setEntry
- * ------------------------------------
- *
- * 
- * ========LICENCE========
- * This file is part of the library LinBox.
- * 
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This 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
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_blackbox_sparse_INL
-#define __LINBOX_blackbox_sparse_INL
-
-#include "linbox/blackbox/sparse.h"
-
-namespace LinBox
-{
-
-	template <class Field, class BElement,  class _Row, class BRow>
-	SparseMatrix<Field,_Row> *SparseMatrixFactory<Field, BElement, _Row, BRow>::makeBlackbox (const Field &F)
-	{
-		SparseMatrix<Field, _Row> *A = new SparseMatrix<Field, _Row> (F, rowdim (), coldim ());
-
-		typename SparseMatrixBase<BElement, BRow>::ConstIterator i;
-		typename SparseMatrixBase<BElement, BRow>::ConstIndexedIterator j;
-
-		for (i = _matA.Begin (), j = _matA.IndexedBegin (); i != _matA.End (); ++i, ++j)
-			F.init (A->refEntry (j.rowIndex (), j.colIndex ()), *i);
-
-		return A;
-	}
-
-}
-
-#endif // __LINBOX_blackbox_sparse_INL
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/blackbox/sparse1.h b/linbox/blackbox/sparse1.h
deleted file mode 100644
index 4a3e7da..0000000
--- a/linbox/blackbox/sparse1.h
+++ /dev/null
@@ -1,463 +0,0 @@
-/* Copyright (C) 1999,2005 LinBox
- * Written by  JG Dumas
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-#ifndef __LINBOX_sparse_bb_domain_H
-#define __LINBOX_sparse_bb_domain_H
-
-// Linbox wrapper for sparse vectors
-
-#include "linbox/vector/sparse.h"
-
-#ifndef _SP_BB_VECTOR_
-#ifdef _IBB_VECTOR_
-#define _SP_BB_VECTOR_ _IBB_VECTOR_
-#else
-#include <vector>
-#define _SP_BB_VECTOR_ std::vector
-#endif // _IBB_VECTOR_
-#endif // _SP_BB_VECTOR_
-
-template <class Domain, class I = unsigned long>
-class SparseBlackBoxDom {
-public:
-	typedef          Domain                                     Domain_t;
-	typedef          Domain                                     Field;
-	typedef typename Domain::Element                            Type_t;
-	typedef          _SP_BB_VECTOR_<Sparse_Vector<Type_t, I> >  Element;
-	typedef          Sparse_Vector<Type_t, I>                   Row_t;
-	typedef          Sparse_Vector<Type_t, I>                   value_type;
-	typedef          SparseBlackBoxDom< Domain, I >             Self_t;
-	typedef          _SP_BB_VECTOR_< Type_t >                   PreferredInMatrix_t;
-	typedef          _SP_BB_VECTOR_< Type_t >                   PreferredOutMatrix_t;
-protected:
-	typedef          Sparse_Vector<Type_t, I>                   SV_t;
-	typedef          Element                                    Rep;
-	Domain_t _domain;
-	//- As a BlackBox is a singleton we can store the only representation
-	I _row_dim, _col_dim, _nz_elem;
-	double _lognormdet;
-	Rep _container;
-
-public:
-	//--- Default cstors:
-	SparseBlackBoxDom() :
-		_domain(),_nz_elem(0)
-	{};
-	SparseBlackBoxDom(const Domain& D) :
-		_domain(D),_nz_elem(0)
-	{ }
-	SparseBlackBoxDom(const Domain& D, char * mat_file) :
-		_domain(D),_nz_elem(0)
-	{ read(mat_file) ; }
-
-	//--- Cstor of recopy: compiler's generated
-	SparseBlackBoxDom(const Self_t& M) :
-		_domain(M._domain),_row_dim(M.n_row()),_col_dim(M.n_col()),_nz_elem(0),_container(M._container)
-	{}
-
-	//--- Usefull to use the same domain to perform other operations
-	const Domain_t& getdomain() const { return _domain; }
-	const Domain_t& field() const { return _domain; }
-
-	//--- BlackBox size
-	size_t n_row(const Rep& a) const { return a.size(); }
-	size_t n_col(const Rep& a) const { if (a.size() ) return a[0].actualsize(); else return 0; }
-	size_t n_elem(const Rep& a) const
-	{
-		long tot=0;
-		for(long s=a.size();s--;)
-			tot+=a[s].size();
-		return tot;
-	}
-
-	size_t  size() const { return _row_dim; }
-	size_t n_row() const { return _row_dim; }
-	size_t n_col() const { return _col_dim; }
-	size_t rowdim() const { return _row_dim; }
-	size_t coldim() const { return _col_dim; }
-	size_t n_elem() const { return _nz_elem; }
-	double lognorm() const { return _lognormdet; }
-
-
-	template<typename _Tp1>
-	struct rebind
-	{ typedef SparseBlackBoxDom<_Tp1> other; };
-
-	//--- initializations
-	Rep& init(Rep& a, char * mat_file) const {
-		I ni,nj,ne;  double lognorm;
-		return read(a,ni,nj,ne,lognorm,mat_file);
-	}
-
-	//    Rep& init(Rep& a) const { return a = _container; }
-	void init(Rep& a) { _container = a; _row_dim = n_row(a); _col_dim = n_col(a); _nz_elem = n_elem(a); }
-	Rep& init(char * mat_file) { return read(mat_file); }
-
-	// ***********************************************************
-	// Access to the sparse matrix representation of the black-box
-	// Reads to a file in the sparse format if the entries can be
-	// converted to %ld, otherwise ?
-
-	Rep& read (Rep& ca, I& ni, I& nj, I& ne, double& lognorm, char * mat_file) const {
-		char *UT, *File_Name;
-		int is_gzipped = 0;
-		size_t s = strlen(mat_file);
-		if ((mat_file[--s] == 'z') && (mat_file[--s] == 'g') && (mat_file[--s] == '.')) {
-			is_gzipped = 1;
-			File_Name = tempnam("/tmp","bbx_");
-			UT = new char[s+34+strlen(File_Name)];
-			sprintf(UT,"gunzip -c %s > %s", mat_file, File_Name);
-			system(UT);
-			sprintf(UT,"\\rm %s", File_Name);
-		}
-		else
-			File_Name = mat_file;
-
-		FILE* FileDes = fopen(File_Name, "r");
-		if (FileDes != NULL) {
-			char * tmp = new char[200]; unsigned long tni, tnj;
-			fscanf(FileDes,"%ld %ld %s\n",&tni, &tnj, &tmp) ;
-			ni = tni; nj =tnj;
-			// delete [] tmp;
-			ca.resize( ni ); ne=0;
-
-			long i,j;
-			long val;
-			fscanf(FileDes,"%ld %ld %ld\n",&i, &j, &val) ;
-			typename Domain_t::Element cour;
-
-			lognorm = 0.0;
-			double normrow = 0.0;
-
-			for(unsigned long ii=0; ii<ni; ++ii) {
-				// No non-zero element yet
-				normrow = 0.0;
-				ca[ii].resize(0);
-				ca[ii].reactualsize(nj);
-				while (i == (ii+1)) {
-					_domain.init( cour, val );
-					if (! _domain.isZero( cour )) {
-						ca[ii].push_back( SV_t::value_type(j-1, cour ) );
-						++ne;
-						normrow += double(cour) * double(cour);
-
-					}
-					fscanf(FileDes,"%ld %ld %ld\n",&i, &j, &val) ;
-				}
-				if (normrow > 1.0) lognorm += log( normrow )/2.0;
-			}
-
-			fclose(FileDes);
-			if (is_gzipped) {
-				system(UT);
-			}
-		}
-
-		return ca;
-	}
-
-
-	void read (I& ni, I& nj, char * mat_file) const {
-		char *UT, *File_Name;
-		int is_gzipped = 0;
-		size_t s = strlen(mat_file);
-		if ((mat_file[--s] == 'z') && (mat_file[--s] == 'g') && (mat_file[--s] == '.')) {
-			is_gzipped = 1;
-			File_Name = tempnam("/tmp","bbx_");
-			UT = new char[s+44+strlen(File_Name)];
-			sprintf(UT,"gunzip -c %s | head -1 > %s", mat_file, File_Name);
-			system(UT);
-			sprintf(UT,"\\rm %s", File_Name);
-		}
-		else
-			File_Name = mat_file;
-
-		FILE* FileDes = fopen(File_Name, "r");
-		if (FileDes != NULL) {
-			char * tmp = new char[200]; unsigned long tni, tnj;
-			fscanf(FileDes,"%ld %ld %s\n",&tni, &tnj, &tmp) ;
-			ni = tni; nj =tnj;
-		}
-
-		fclose(FileDes);
-		if (is_gzipped) {
-			system(UT);
-		}
-	}
-
-	Rep& read (char * mat_file) { return read(_container,_row_dim,_col_dim,_nz_elem, _lognormdet, mat_file); }
-
-	Rep& read_transpose (Rep& ca, I& ni, I& nj, I& ne, char * mat_file)  {
-		char *UT, *File_Name;
-		int is_gzipped = 0;
-		size_t s = strlen(mat_file);
-		if ((mat_file[--s] == 'z') && (mat_file[--s] == 'g') && (mat_file[--s] == '.')) {
-			is_gzipped = 1;
-			File_Name = tempnam("/tmp","bbx_");
-			UT = new char[s+34+strlen(File_Name)];
-			sprintf(UT,"gunzip -c %s > %s", mat_file, File_Name);
-			system(UT);
-			sprintf(UT,"\\rm %s", File_Name);
-		}
-		else
-			File_Name = mat_file;
-
-		FILE* FileDes = fopen(File_Name, "r");
-		if (FileDes != NULL) {
-			char * tmp = new char[200]; unsigned long tni, tnj;
-			fscanf(FileDes,"%ld %ld %s\n",&tni, &tnj, &tmp) ;
-			ni = tnj; nj =tni;
-			ca.resize(ni); ne = 0;
-			for(long l=0; l<ni; ++l)
-			{ ca[l].reactualsize(nj); ca[l].resize(0); }
-
-			long i,j;
-			long val;
-			fscanf(FileDes,"%ld %ld %ld\n",&i, &j, &val) ;
-			typename Domain_t::Element cour;
-
-			for(long ii=0; ii<nj; ++ii)
-				while (i == (ii+1)) {
-					_domain.init( cour, val );
-					if (! _domain.isZero( cour )) {
-						ca[j-1].push_back( SV_t::value_type(I(ii), cour ) );
-						++ne;
-					}
-					fscanf(FileDes,"%ld %ld %ld\n",&i, &j, &val) ;
-				}
-		}
-
-		fclose(FileDes);
-		if (is_gzipped) {
-			system(UT);
-		}
-	}
-
-	Rep& read_transpose (char * mat_file) { return read_transpose(_container, _row_dim, _col_dim, _nz_elem, mat_file); }
-
-
-	void write(char * O_File_Name, const Rep& ca ) const {
-		FILE* FileDes = fopen(O_File_Name, "w");
-		if (FileDes != 0) {
-			I nr=n_row(ca),nc=n_col(ca);
-			fprintf(FileDes,"%ld %ld M\n",nr,nc);
-			typename SV_t::value_type _entry;
-			for (long i=0; i<nr; i++)
-				for (long j=0; j< ca[i].size(); j++) {
-					_entry=ca[i][j];
-					fprintf(FileDes,"%ld %ld %ld\n",i+1,_entry.getindex() +1,_domain.write( _entry.getvalue() ));
-				}
-			fprintf(FileDes,"%ld %ld %ld\n",0,0,0);
-		}
-		fclose(FileDes);
-	}
-
-	void write(char * O_File_Name) const { write(O_File_Name, _container) ; }
-
-
-	// ***********************************************************
-	// Access to the sparse matrix representation of the black-box
-	// Reads from a stream in the sparse format if the entries
-	// read from long
-	// GV - PG
-
-	Rep& read (std::istream& is, Rep& ca, I& ni, I& nj, I& ne) const {
-
-		char * tmp = new char[200];
-
-		is >> ni;
-		is >> nj;
-		is >> tmp;
-
-		// delete [] tmp;
-		ca.resize( ni ); ne=0;
-		//          ca = Rep( ni ); ne=0;
-
-		long i,j;
-		long val;
-		is >> i >> j >> val ;
-		typename Domain_t::Element cour;
-
-		for(unsigned long ii=0; ii<ni; ++ii) {
-			// No non-zero element yet
-			//                ca[ii] = SV_t(0,nj);
-			ca[ii].resize(0);
-			ca[ii].reactualsize(nj);
-			while (i == (ii+1)) {
-				_domain.init( cour, val );
-				if (! _domain.isZero( cour )) {
-					ca[ii].push_back( SV_t::value_type(j-1, cour ) );
-					++ne;
-				}
-				is >> i >> j >> val ;
-			}
-		}
-
-		return ca;
-	}
-
-
-	Rep& read (std::istream& is)
-	{ return read(is, _container, _row_dim, _col_dim, _nz_elem); }
-
-
-
-	// ***********************************************************
-	// Write a sparse matrix to an output stream
-	// GV - PG
-	// JGD : removed -1
-
-	std::ostream& write(std::ostream& os, const Rep& ca ) const {
-
-		I nr=n_row(ca),nc=n_col(ca);
-		os << nr << " " << nc << "\n";
-		typename SV_t::value_type _entry;
-		for (long i=0; i<nr; i++)
-			for (long j=0; j< ca[i].size(); j++) {
-				_entry=ca[i][j];
-				os << i+1 << " " << _entry.getindex() +1 << " ";
-				_domain.write(os, _entry.getvalue() );
-				os << "\n";
-			}
-		return os << "\n";
-	}
-
-	std::ostream& write(std::ostream& os) const { return write(os, _container) ; }
-
-
-
-
-	//-- BlackBox methods
-
-	template<class OutMatrix, class InMatrix>
-	OutMatrix& apply(OutMatrix& res, const InMatrix& vect, const Rep& ca ) const {
-		typename SV_t::value_type toto;
-		I k,i;
-		res.resize(n_row());
-		for(k=n_row(); k-- ; )
-			for( res[k]=_domain.zero, i=ca[k].size(); i-- ; ) {
-				toto = ca[k][i];
-				_domain.axpyin(res[k],toto.getvalue(),vect[toto.getindex()]);
-			}
-		return res;
-	}
-
-	template<class OutMatrix, class InMatrix>
-	OutMatrix& apply(OutMatrix& res, const InMatrix& vect) const {
-		return apply(res, vect, _container);
-	}
-
-	template<class OutMatrix, class InMatrix>
-	OutMatrix& applyTranspose(OutMatrix& res, const InMatrix& vect, const Rep& ca) const {
-		typename SV_t::value_type toto;
-		I k,i;
-		res.resize(n_col());
-		for(i=res.size(); i-- ; )
-			res[i] = _domain.zero;
-		for(k=ca.size(); k-- ; )
-			for(i=ca[k].size(); i-- ; ) {
-				toto = ca[k][i];
-				_domain.axpyin(res[ toto.getindex() ],toto.getvalue(), vect[k]);
-			}
-		return res;
-	}
-
-	template<class OutMatrix, class InMatrix>
-	OutMatrix& applyTranspose(OutMatrix& res, const InMatrix& vect) const {
-		return applyTranspose(res, vect, _container);
-	}
-
-	//-- Special Methods
-
-	const Row_t& operator[] (const I i)  const { return _container[i]; }
-	Row_t& operator[] (const I i) { return _container[i]; } ;
-
-
-	template<class Left, class Right>
-	Rep& rank_precondition(const Left& l, const Right& r, Rep& ca) const {
-		Type_t tmp;
-		for(long ii=ca.size()-1; ii>=0; --ii)
-			for(long jj=ca[ii].size()-1; jj>=0; --jj)
-				ca[ii][jj].change_value( _domain.mulin( _domain.mul(tmp, l[ii], ca[ii][jj].getvalue()), r[ca[ii][jj].getindex()] ) );
-		return ca;
-	}
-
-	template<class Left, class Right>
-	Rep& rank_precondition(const Left& l, const Right& r) {
-		return rank_precondition(l, r, _container);
-	}
-
-	template<class RandGen>
-	void precondition(RandGen& g) {
-		I ll=0;
-		PreferredOutMatrix_t diag_left(_row_dim);
-		for(; ll<_row_dim; ++ll)
-			_domain.nonzerorandom(g, diag_left[ll]);
-
-		PreferredInMatrix_t diag_right(_col_dim);
-		for(ll=0;ll<_col_dim; ++ll)
-			_domain.nonzerorandom(g, diag_right[ll]);
-
-		rank_precondition(diag_left, diag_right);
-	}
-
-
-	Type_t& trace(Type_t& t, const Rep& ca) {
-		t = _domain.zero;
-		for(long ii=ca.size()-1; ii>=0; --ii)
-			for(long jj=ca[ii].size()-1; jj>=0; --jj)
-				if (ca[ii][jj].getindex() == (ii))
-					_domain.addin(t, ca[ii][jj].getvalue());
-		return t;
-	}
-
-	Type_t& trace(Type_t& t) {
-		return trace(t, _container);
-	}
-
-	Type_t& trace_ata(Type_t& t, const Rep& ca) {
-		t = _domain.zero;
-		for(long ii=ca.size()-1; ii>=0; --ii)
-			for(long jj=ca[ii].size()-1; jj>=0; --jj)
-				_domain.axpyin(t, ca[ii][jj].getvalue(), ca[ii][jj].getvalue());
-		return t;
-	}
-
-	Type_t& trace_ata(Type_t& t) {
-		return trace_ata(t, _container);
-	}
-
-};
-
-#endif // __LINBOX_sparse_bb_domain_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/blackbox/squarize.h b/linbox/blackbox/squarize.h
index 4ce6f96..39054dd 100644
--- a/linbox/blackbox/squarize.h
+++ b/linbox/blackbox/squarize.h
@@ -59,13 +59,13 @@ namespace LinBox
 		Squarize (const Blackbox& A) :
 			_A_ptr(&A)
 		{
-			_A_ptr->field().init(_Zero,0UL);
+			_A_ptr->field().assign(_Zero,_A_ptr->field().zero);
 		}
 
 		Squarize (const Blackbox *A_ptr) :
 			_A_ptr(A_ptr)
 		{
-			_A_ptr->field().init(_Zero,0UL);
+			_A_ptr->field().assign(_Zero,_A_ptr->field().zero);
 			// create new copies of matrices in dynamic memory
 			//linbox_check (A_ptr != NULL);
 			//_A_ptr = A_ptr->clone ();
@@ -78,7 +78,7 @@ namespace LinBox
 		Squarize (const Squarize<Blackbox> &M) :
 			_A_ptr(M._A_ptr)
 		{
-			_A_ptr->field().init(_Zero,0UL);
+			_A_ptr->field().assign(_Zero,_A_ptr->field().zero);
 			// create new copies of matrices in dynamic memory
 			//linbox_check (M._A_ptr != NULL);
 			//_A_ptr = M._A_ptr->clone ();
@@ -106,13 +106,14 @@ namespace LinBox
 		 * @return reference to vector y containing output.
 		 * @param  x constant reference to vector to contain input
 		 * @param y
+		 * @todo use field().zero
 		 */
 		template <class Vector1, class Vector2>
 		inline Vector1 &apply (Vector1 &y, const Vector2 &x) const
 		{
 			if (_A_ptr != 0) _A_ptr->apply (y, x);
 			if (_A_ptr->rowdim () < y.size()) {
-				for(typename Vector1::iterator yit=y.begin()+_A_ptr->rowdim ();
+				for(typename Vector1::iterator yit=y.begin()+(ptrdiff_t)_A_ptr->rowdim ();
 				    yit != y.end(); ++yit)
 					*yit = _Zero;
 			}
@@ -128,13 +129,14 @@ namespace LinBox
 		 * @return reference to vector y containing output.
 		 * @param  x constant reference to vector to contain input
 		 * @param y
+		 * @todo use field().zero
 		 */
 		template <class Vector1, class Vector2>
 		inline Vector1 &applyTranspose (Vector1 &y, const Vector2 &x) const
 		{
 			if (_A_ptr != 0) _A_ptr->applyTranspose (y, x);
 			if (_A_ptr->coldim () < y.size()) {
-				for(typename Vector1::iterator yit=y.begin()+_A_ptr->rcoldim ();
+				for(typename Vector1::iterator yit=y.begin()+(ptrdiff_t)_A_ptr->rcoldim ();
 				    yit != y.end(); ++yit)
 					*yit = _Zero;
 			}			return y;
diff --git a/linbox/blackbox/submatrix.h b/linbox/blackbox/submatrix.h
index da3eece..79ab150 100644
--- a/linbox/blackbox/submatrix.h
+++ b/linbox/blackbox/submatrix.h
@@ -44,7 +44,7 @@
 #include "linbox/util/debug.h"
 #include "linbox/util/error.h"
 #include "linbox/vector/vector-domain.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
 #include "linbox/blackbox/blackbox-interface.h"
 
 
@@ -140,12 +140,12 @@ namespace LinBox
 		template<class OutVector, class InVector>
 		OutVector& apply (OutVector &y, const InVector& x) const
 		{
-			std::fill (_z.begin (), _z.begin () + _col, _BB->field().zero);
-			std::fill (_z.begin () + _col + _coldim, _z.end (), _BB->field().zero);
+			std::fill (_z.begin (), _z.begin () + (ptrdiff_t)_col, _BB->field().zero);
+			std::fill (_z.begin () + (ptrdiff_t)(_col + _coldim), _z.end (), _BB->field().zero);
 
-			copy (x.begin (), x.end (), _z.begin () + _col);  // Copying. Yuck.
+			copy (x.begin (), x.end (), _z.begin () + (ptrdiff_t)_col);  // Copying. Yuck.
 			_BB->apply (_y, _z);
-			copy (_y.begin () + _row, _y.begin () + _row + _rowdim, y.begin ());
+			copy (_y.begin () + (ptrdiff_t)_row, _y.begin () + (ptrdiff_t)(_row + _rowdim), y.begin ());
 			return y;
 		}
 
@@ -161,12 +161,12 @@ namespace LinBox
 		template<class OutVector, class InVector>
 		OutVector& applyTranspose (OutVector &y, const InVector& x) const
 		{
-			std::fill (_y.begin (), _y.begin () + _row, _BB->field().zero);
-			std::fill (_y.begin () + _row + _rowdim, _y.end (), _BB->field().zero);
+			std::fill (_y.begin (), _y.begin () + (ptrdiff_t)_row, _BB->field().zero);
+			std::fill (_y.begin () + (ptrdiff_t)(_row + _rowdim), _y.end (), _BB->field().zero);
 
-			copy (x.begin (), x.end (), _y.begin () + _row);  // Copying. Yuck.
+			copy (x.begin (), x.end (), _y.begin () + (ptrdiff_t)_row);  // Copying. Yuck.
 			_BB->applyTranspose (_z, _y);
-			copy (_z.begin () + _col, _z.begin () + _col + _coldim, y.begin ());
+			copy (_z.begin () + (ptrdiff_t)_col, _z.begin () + (ptrdiff_t)(_col + _coldim), y.begin ());
 			return y;
 		}
 
@@ -265,12 +265,13 @@ namespace LinBox
 
 	/** Specialization for BlasMatrix */
 	template<class _Field>
-	class Submatrix<BlasMatrix<_Field>, VectorCategories::DenseVectorTag> : public BlasSubmatrix<_Field> {
+	class Submatrix<BlasMatrix<_Field>, VectorCategories::DenseVectorTag> : public BlasSubmatrix<BlasMatrix<_Field> > {
 	public:
 
 		typedef _Field Field;
-		typedef Submatrix<BlasMatrix<_Field>, VectorCategories::DenseVectorTag> Self_t;
-		typedef BlasSubmatrix<_Field> Father_t;
+		typedef BlasMatrix<_Field> Matrix ;
+		typedef Submatrix<Matrix, VectorCategories::DenseVectorTag> Self_t;
+		typedef BlasSubmatrix<Matrix> Father_t;
 
 	private:
 
@@ -294,7 +295,7 @@ namespace LinBox
 			   size_t col,
 			   size_t Rowdim,
 			   size_t Coldim) :
-			BlasSubmatrix<Field>(const_cast<BlasMatrix<Field>& >(*Mat), row, col, Rowdim, Coldim),
+			BlasSubmatrix<Matrix>(const_cast<BlasMatrix<Field>& >(*Mat), row, col, Rowdim, Coldim),
 			f(Mat -> field()), vd(Mat -> field())
 		{ }
 
@@ -310,7 +311,7 @@ namespace LinBox
 			   size_t col,
 			   size_t Rowdim,
 			   size_t Coldim) :
-			BlasSubmatrix<Field>(const_cast<BlasMatrix<Field>& >(Mat), row, col, Rowdim, Coldim),
+			BlasSubmatrix<Matrix>(const_cast<BlasMatrix<Field>& >(Mat), row, col, Rowdim, Coldim),
 			f(Mat.field()), vd(Mat.field())
 		{ }
 
@@ -327,10 +328,10 @@ namespace LinBox
 			   size_t col,
 			   size_t Rowdim,
 			   size_t Coldim ) :
-			BlasSubmatrix<Field> (const_cast<Submatrix<BlasMatrix<Field> >&>(*SM), row, col, Rowdim, Coldim),
+			BlasSubmatrix<Matrix> (const_cast<Submatrix<BlasMatrix<Field> >&>(*SM), row, col, Rowdim, Coldim),
 			f (SM ->  field()), vd(SM -> field())
 		{
-		}
+			}
 
 		/** Constructor from an existing submatrix and dimensions
 		 * @param SM reference to Submatrix from which to
@@ -345,7 +346,7 @@ namespace LinBox
 			   size_t col,
 			   size_t Rowdim,
 			   size_t Coldim ) :
-			BlasSubmatrix<Field> (const_cast<Submatrix<BlasMatrix<Field> >&>(SM), row, col, Rowdim, Coldim),
+			BlasSubmatrix<Matrix> (const_cast<Submatrix<BlasMatrix<Field> >&>(SM), row, col, Rowdim, Coldim),
 			f (SM. field()), vd(SM. field())
 		{ }
 
@@ -360,7 +361,7 @@ namespace LinBox
 		std::istream& read (std::istream& is)
 		{
 
-			BlasSubmatrix<Field>::read (is, f);
+			BlasSubmatrix<Matrix>::read (is, f);
 
 			return is;
 		}
@@ -369,7 +370,7 @@ namespace LinBox
 		std::ostream& write (std::ostream& os) const
 		{
 
-			BlasSubmatrix<Field>::write (os, f);
+			BlasSubmatrix<Matrix>::write (os, f);
 
 			return os;
 		}
@@ -385,7 +386,7 @@ namespace LinBox
 		Vect1 &apply (Vect1 &y, const Vect2 &x) const
 		{
 
-			typename BlasSubmatrix<Field>::ConstRowIterator p;
+			typename BlasSubmatrix<Matrix>::ConstRowIterator p;
 
 			typename Vect1::iterator p_y = y.begin ();
 
@@ -407,7 +408,7 @@ namespace LinBox
 		Vect1 &applyTranspose (Vect1 &y, const Vect2 &x) const
 		{
 
-			typename BlasSubmatrix<Field>::ConstColIterator colp;
+			typename BlasSubmatrix<Matrix>::ConstColIterator colp;
 
 			typename Vect1::iterator p_y = y.begin ();
 
@@ -486,12 +487,12 @@ namespace LinBox
 		template<class OutVector, class InVector>
 		OutVector& apply (OutVector &y, const InVector& x) const
 		{
-			std::fill (_z.begin (), _z.begin () + _col, _BB_data.field().zero);
-			std::fill (_z.begin () + _col + _coldim, _z.end (), _BB_data.field().zero);
+			std::fill (_z.begin (), _z.begin () + (ptrdiff_t)_col, _BB_data.field().zero);
+			std::fill (_z.begin () + (ptrdiff_t)(_col + _coldim), _z.end (), _BB_data.field().zero);
 
-			copy (x.begin (), x.end (), _z.begin () + _col);  // Copying. Yuck.
+			copy (x.begin (), x.end (), _z.begin () +(ptrdiff_t) _col);  // Copying. Yuck.
 			_BB_data.apply (_y, _z);
-			copy (_y.begin () + _row, _y.begin () + _row + _rowdim, y.begin ());
+			copy (_y.begin () +(ptrdiff_t) _row, _y.begin () +(ptrdiff_t) (_row + _rowdim), y.begin ());
 			return y;
 		}
 
@@ -507,12 +508,12 @@ namespace LinBox
 		template<class OutVector, class InVector>
 		OutVector& applyTranspose (OutVector &y, const InVector& x) const
 		{
-			std::fill (_y.begin (), _y.begin () + _row, _BB_data.field().zero);
-			std::fill (_y.begin () + _row + _rowdim, _y.end (), _BB_data.field().zero);
+			std::fill (_y.begin (), _y.begin () +(ptrdiff_t) _row, _BB_data.field().zero);
+			std::fill (_y.begin () +(ptrdiff_t)( _row + _rowdim), _y.end (), _BB_data.field().zero);
 
-			copy (x.begin (), x.end (), _y.begin () + _row);  // Copying. Yuck.
+			copy (x.begin (), x.end (), _y.begin () + (ptrdiff_t)_row);  // Copying. Yuck.
 			_BB_data.applyTranspose (_z, _y);
-			copy (_z.begin () + _col, _z.begin () + _col + _coldim, y.begin ());
+			copy (_z.begin () + (ptrdiff_t)_col, _z.begin () + (ptrdiff_t)(_col + _coldim), y.begin ());
 			return y;
 		}
 
@@ -619,4 +620,3 @@ namespace LinBox
 // c-basic-offset: 8
 // End:
 // vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
-
diff --git a/linbox/blackbox/subrowmatrix.h b/linbox/blackbox/subrowmatrix.h
new file mode 100644
index 0000000..da961fe
--- /dev/null
+++ b/linbox/blackbox/subrowmatrix.h
@@ -0,0 +1,219 @@
+/* linbox/blackbox/companion.h
+ * Copyright(c) LinBox
+ *
+ * Author: Zhendong wan
+ *
+ *  ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+#ifndef __LINBOX_subrowmatrix_H
+#define __LINBOX_subrowmatrix_H
+
+THIS_CODE_MAY_NOT_COMPILE_AND_IS_NOT_TESTED
+
+
+#include <iostream>
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/blackbox/blackbox-interface.h"
+
+namespace LinBox
+{
+	/**
+	 * \brief submatrix consisting contiguous rows of a row based matrix.
+
+	 \ingroup blackbox
+	 * submatrix consisting of rows [i1, ..., i2] of a row based matrix.
+	 */
+	//@{
+	template<class Matrix,
+	class MatrixCategory = typename MatrixTraits<Matrix>::MatrixCategory>
+
+	class SubRowMatrix: public BlackboxInterface ;
+
+	/** matrix with RowMatrixTag
+	 * Support Row, apply, applyTranspose
+	 */
+	template <class Matrix>
+	class SubRowMatrix<Matrix, MatrixCategories::RowMatrixTag> : public BlackboxInterface {
+
+	public:
+		typedef typename Matrix::Field Field;
+
+	protected:
+
+		/* try to use const Matrix*
+		 * but getting too much compiling error messages.
+		 * Maybe do it in future.
+		 * Z. Wan
+		 */
+		Matrix* _BB;
+
+		size_t _row;
+
+		size_t _rowdim;
+
+		MatrixDomain<Field> _MD;
+
+	public:
+
+		typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
+
+		typedef typename Field::Element Element;
+
+		typedef typename Matrix::RowIterator            RowIterator;
+		typedef typename Matrix::ConstRowIterator       ConstRowIterator;
+		typedef typename Matrix::Row                    Row;
+		typedef typename Matrix::ConstRow               ConstRow;
+
+		typedef typename Matrix::ConstIterator Iterator;
+		typedef typename Matrix::ConstIterator ConstIterator;
+		typedef typename Matrix::ConstIndexedIterator IndexedIterator;
+		typedef typename Matrix::ConstIndexedIterator ConstIndexedIterator;
+
+		SubRowMatrix (const Matrix* BB,
+			      size_t row,
+			      size_t rowdim) :
+			_row(row), _rowdim(rowdim), _MD(BB->field())
+		{
+
+			_BB = const_cast<Matrix*&>(BB);
+
+		}
+
+
+		virtual ~SubRowMatrix ( ) {}
+
+		size_t rowdim ( ) const
+		{
+
+			return _rowdim;
+		}
+
+		size_t coldim ( ) const
+		{
+
+			return _BB -> coldim();
+		}
+
+		const Field& field( ) const
+		{
+
+			return _BB -> field ();
+		}
+
+		template <class OutVector, class InVector>
+		OutVector &apply (OutVector &y, const InVector &x) const
+		{
+
+
+			return _MD.vectorMul (y, *this, x);
+		}
+
+
+		template <class OutVector, class InVector>
+		OutVector &applyTranspose (OutVector& y, const InVector &x) const
+		{
+
+			return _MD.vectorMul (y, TransposeMatrix<SubRowMatrix> (*this), x);
+		}
+
+
+
+		template<typename _Tp1>
+		struct rebind
+		{ typedef SubRowMatrix<Matrix::rebind<_Tp1>::other, MatrixCategory> other; };
+
+
+
+		RowIterator rowBegin () {
+
+			return _BB -> rowBegin() + _row;
+
+		}
+
+		RowIterator rowEnd () {
+
+			return _BB -> rowBegin() + (_row + rowdim);
+		}
+
+
+		ConstRowIterator rowBegin () const
+		{
+
+			return _BB -> rowBegin() + _row;
+		}
+
+		ConstRowIterator rowEnd () const
+		{
+
+			return _BB -> rowBegin() + (_row + _rowdim);
+		}
+
+
+		std::ostream& write (std::ostream& out) const
+		{
+
+#ifdef DEBUG
+
+			std::cout << "Row, Col " << rowdim () << ' ' << coldim () << '\n';
+#endif
+
+			ConstRowIterator row_p;
+
+			VectorDomain<Field> vd (field());
+
+
+			for (row_p = rowBegin(); row_p != rowEnd(); ++ row_p) {
+
+				vd. write (out, *row_p);
+
+				std::cout << '\n';
+
+			}
+
+			return out;
+
+		}
+
+		/* I do not need them currently now,
+		 * I maybe implement in future
+		 */
+#if 0
+		Iterator Begin ();
+		Iterator End ();
+		ConstIterator Begin () const;
+		ConstIterator End () const;
+#endif
+	};
+	//@}
+}
+
+#endif //__LINBOX_subrowmatrix_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/blackbox/sum.h b/linbox/blackbox/sum.h
index 8782d67..44a11f7 100644
--- a/linbox/blackbox/sum.h
+++ b/linbox/blackbox/sum.h
@@ -72,7 +72,7 @@ namespace LinBox
 		 * @param A, B:  black box matrices.
 		 */
 		Sum (const Blackbox1 &A, const Blackbox2 &B) :
-			_A_ptr(&A), _B_ptr(&B), VD( field() )
+			_A_ptr(&A), _B_ptr(&B), VD( A.field() )
 		{
 			linbox_check (A.coldim () == B.coldim ());
 			linbox_check (A.rowdim () == B.rowdim ());
@@ -87,7 +87,7 @@ namespace LinBox
 		 * @param A_ptr, B_ptr:  pointers to black box matrices.
 		 */
 		Sum (const Blackbox1 *A_ptr, const Blackbox2 *B_ptr) :
-			_A_ptr(A_ptr), _B_ptr(B_ptr), VD( field() )
+			_A_ptr(A_ptr), _B_ptr(B_ptr), VD( A_ptr->field() )
 		{
 			// create new copies of matrices in dynamic memory
 			linbox_check (A_ptr != 0);
@@ -189,6 +189,11 @@ namespace LinBox
 
 		const Blackbox2* getRightPtr() const {return  _B_ptr;}
 
+		std::ostream & write(std::ostream & os) const
+		{
+		        _A_ptr->write(os); _B_ptr->write(os << '+') ;
+			return os ;
+		}
 	protected:
 
 		// use a copy of the input field for faster performance (no pointer dereference).
@@ -232,7 +237,7 @@ namespace LinBox
 		 * @param A, B:  black box matrices.
 		 */
 		SumOwner (const Blackbox1 &A, const Blackbox2 &B) :
-			_A_data(&A), _B_data(&B), VD( field() )
+			_A_data(&A), _B_data(&B), VD( A.field() )
 		{
 			linbox_check (A.coldim () == B.coldim ());
 			linbox_check (A.rowdim () == B.rowdim ());
@@ -247,7 +252,7 @@ namespace LinBox
 		 * @param A_data, B_data:  pointers to black box matrices.
 		 */
 		SumOwner (const Blackbox1 *A_data, const Blackbox2 *B_data) :
-			_A_data(A_data), _B_data(B_data), VD( field() )
+			_A_data(A_data), _B_data(B_data), VD( A_data->field() )
 		{
 			// create new copies of matrices in dynamic memory
 			linbox_check (A_data != 0);
@@ -392,6 +397,12 @@ namespace LinBox
 			return  _B_data;
 		}
 
+		std::ostream & write(std::ostream & os) const
+		{
+		        _A_data.write(os); _B_data.write(os << '+') ;
+			return os ;
+		}
+
 	protected:
 
 		// use a copy of the input field for faster performance (no pointer dereference).
diff --git a/linbox/blackbox/toeplitz.h b/linbox/blackbox/toeplitz.h
index dbab05c..e14cf70 100644
--- a/linbox/blackbox/toeplitz.h
+++ b/linbox/blackbox/toeplitz.h
@@ -31,11 +31,12 @@
 #include <vector>
 #include "linbox/vector/vector-traits.h"
 #include "linbox/solutions/methods.h"  // for shape
+#include "linbox/solutions/solution-tags.h"  // to offer trace, det
 #include "linbox/linbox-config.h"
 #include "linbox/blackbox/blackbox-interface.h"
 
 #ifdef __LINBOX_HAVE_NTL
-#include "linbox/field/ntl.h"
+#include "linbox/ring/ntl.h"
 #endif
 
 //#define DBGMSGS 1
@@ -49,27 +50,27 @@
 
 namespace LinBox
 {
-	template <class _Field, class _PField>
+	template <class _Field, class _PRing>
 	class ToeplitzBase : public  BlackboxInterface {
-	protected: // Constructors etc. are protected because instances of this
-		// class should not be instantiated; use Toeplitz instead.
-		typedef _PField PField;
-		typedef typename _PField::Element Poly;
+	protected: // Constructors etc. are protected because stand-alone instances of this
+		// class should not be constructed; use Toeplitz instead.
+		typedef _PRing PRing;
+		typedef typename _PRing::Element Poly;
 
-		typedef typename _PField::CoeffField Field;
+		typedef typename _PRing::CoeffField Field;
 
-		typedef typename _PField::Coeff Element;
+		typedef typename _PRing::Coeff Element;
 
 		//------- CONSTRUCTORS AND DESTRUCTORS
 
 		virtual ~ToeplitzBase();                // Destructor
-		ToeplitzBase();                 // Zero Param Constructor
+		// ToeplitzBase();                 // Zero Param Constructor
 		ToeplitzBase( const Field& F);// Field only cstr. JGD 30.09.2003
-		ToeplitzBase( const PField& PF );
+		ToeplitzBase( const PRing& PF );
 		// Constructor using a polynomial field, a polynomial in that
 		// field representing the matrix, and the matrix dimensions
 		// If no n is given, it will default to the same as m.
-		ToeplitzBase( const PField& PF, const Poly& p,
+		ToeplitzBase( const PRing& PF, const Poly& p,
 			      size_t m, size_t n=0 );
 
 
@@ -84,9 +85,9 @@ namespace LinBox
 
 		inline size_t rowdim() const { return rowDim; }// Number of Rows
 		inline size_t coldim() const { return colDim; }// Number of Cols
-		inline size_t sysdim() const { return sysDim; }
-		// Max of rows & columns;
-		const Field& field() const {return K;}
+		inline size_t sysdim() const { return sysDim; } // Max of rows & columns;
+		const Field& field() const {return *field_;}
+
 		//------- MUTATOR METHODS
 
 		void setToUniModUT() ;      // Convert to UTriang matrix with det 1
@@ -96,8 +97,8 @@ namespace LinBox
 
 		//      void convert(NTL::ZZ_pX &pout, const std::vector<Element> &vin);
 	protected:
-		PField P; 	  // Polynomial field
-		Field K;           // Field parameter (coefficient field)
+		PRing P; 	  // Polynomial field
+		const Field *field_;           // Field parameter (coefficient field)
 
 		size_t rowDim;             // row dimension
 		size_t colDim;             // col dimension
@@ -112,7 +113,7 @@ namespace LinBox
 		//std::vector<NTL::ZZ_p> data;    // The vector of coeffs of the polynomial
 
 		/* These were only used by the XML stuff and are more or less
-		 * obsolete with the presence of polynomial fields.
+		 * obsolete with the presence of polynomial rings.
 
 		 void convert(Poly &pout, const std::vector<Element> &vin);
 		// CONVERTS the input vector of field Elements to a ZZ_pX
@@ -121,6 +122,17 @@ namespace LinBox
 		// Converts from polynomial rep to a vector rep
 		// inverse of the convert from Element to ZZ_pX
 		*/
+	public:
+		std::ostream & write(std::ostream & out) const
+		{
+			return out << "NO WRITE IMPLEMENTED" << std::endl;
+		}
+
+	void read(std::istream & in)
+	{
+		throw(NotImplementedYet());
+	}
+
 
 	}; //  class ToeplitzBase
 
@@ -128,92 +140,93 @@ namespace LinBox
 
 	  \ingroup blackbox
 	 * It stores the 2n-1 values of the first row and column.
-	 * The apply is a call to polynomial multiplication and for large n
-	 * will be FFT based, running in O(lg(n)) time.
-	 * The _PField template parameter should be a polynomial field;
-	 * computations on the matrix will be performed using this polynomial.
+	 * The _PRing template parameter should be a polynomial ring.
+	 * Computations on the matrix will be performed using this polynomial ring.
+	 * The apply is a call to polynomial multiplication and if the poly ring is
+	 * FFT based for large n, apply will run in O(n lg(n)) time.
 	 */
 #ifdef __LINBOX_HAVE_NTL
-	template< class _CField, class _PField = NTL_ZZ_pX >
+	template< class _CField, class _PRing = NTL_ZZ_pX >
 	#else
-	template< class _CField, class _PField >
+	template< class _CField, class _PRing >
 	#endif
-	class Toeplitz :public ToeplitzBase<_CField,_PField> {
+	class Toeplitz : public ToeplitzBase<_CField,_PRing> {
 	protected:
-		typedef ToeplitzBase<_CField,_PField> TBase;
+		typedef ToeplitzBase<_CField,_PRing> Father_t;
 	public:
-		typedef typename TBase::PField PField;
-		typedef typename TBase::Poly Poly;
+		typedef typename Father_t::PRing PRing;
+		typedef typename Father_t::Poly Poly;
 
-		typedef typename TBase::Field Field;
+		typedef typename Father_t::Field Field;
 
-		typedef typename TBase::Element Element;
+		typedef typename Father_t::Element Element;
 
-		Toeplitz() :
-			TBase()
-		{}
 		Toeplitz(const Field& F) :
-			TBase(F)
+			Father_t(F)
 		{}
-		Toeplitz( const PField& PF ) :
-			TBase(PF)
+		Toeplitz( const PRing& PF ) :
+			Father_t(PF)
 		{}
-		Toeplitz( const PField& PF, const Poly& p,
+		Toeplitz( const PRing& PF, const Poly& p,
 			  size_t m, size_t n=0 ) :
-			TBase(PF,p,m,n)
+			Father_t(PF,p,m,n)
 		{}
 
+		using Father_t::field_;
+		using Father_t::field;
 	}; // end of class Toeplitz
 
 	/** Specialization for when the field of matrix elements is the same
 	 * as the coefficient field of the polynomial field.
 	 */
-	template< class _PField >
-	class Toeplitz< typename _PField::CoeffField, _PField > : public ToeplitzBase< typename _PField::CoeffField, _PField > {
+	template< class _PRing >
+	class Toeplitz< typename _PRing::CoeffField, _PRing > : public ToeplitzBase< typename _PRing::CoeffField, _PRing > {
 	protected:
-		typedef ToeplitzBase< typename _PField::CoeffField, _PField > TBase;
-		using TBase::P;
-		using TBase::rowDim;
-		using TBase::colDim;
-		using TBase::sysDim;
-		using TBase::shape;
-		using TBase::pdata;
-		using TBase::rpdata;
-		using TBase::K;
+		typedef ToeplitzBase< typename _PRing::CoeffField, _PRing > Father_t;
+		using Father_t::P;
+		using Father_t::rowDim;
+		using Father_t::colDim;
+		using Father_t::sysDim;
+		using Father_t::shape;
+		using Father_t::pdata;
+		using Father_t::rpdata;
+		using Father_t::field_;
 	public:
-		using TBase::rowdim;
-		using TBase::coldim;
-		typedef typename TBase::PField PField;
-		typedef typename TBase::Poly Poly;
+		using Father_t::rowdim;
+		using Father_t::coldim;
+		typedef typename Father_t::PRing PRing;
+		typedef typename Father_t::Poly Poly;
 
-		typedef typename TBase::Field Field;
+		typedef typename Father_t::Field Field;
 
-		typedef typename TBase::Element Element;
+		typedef typename Father_t::Element Element;
 
 		//------- CONSTRUCTORS AND DESTRUCTORS
-		Toeplitz() :
-			TBase()
-		{}
 		Toeplitz(const Field& F) :
-			TBase(F)
+			Father_t(F)
 		{}
-		Toeplitz( const PField& PF ) :
-			TBase(PF)
+		Toeplitz( const PRing& PF ) :
+			Father_t(PF)
 		{}
-		Toeplitz( const PField& PF, const Poly& p,
+		Toeplitz( const PRing& PF, const Poly& p,
 			  size_t m, size_t n=0 ) :
-			TBase(PF,p,m,n)
+			Father_t(PF,p,m,n)
 		{}
 
 		Toeplitz( const Field& F,    // Cnstr. with Field and STL vec. of elems
 			  const std::vector<Element>& v) :
-			TBase(F)
+			Father_t(F)
 		{ init_vector(v); }
 
+		Toeplitz( const Field& F,    // Cnstr. with Field and STL vec. of elems
+			  const BlasVector<Field>& v) :
+			Father_t(F)
+		{ init_vector(v.getRep()); }
 
-		void   print( std::ostream& os = std::cout) const;        // Print the contents to the screen
+		//! @bug this is not MM format at all
+		std::ostream & write( std::ostream& os = std::cout) const;        // Print the contents to the screen
 
-		void   print( char *outFileName) const;
+		void   write( char *outFileName) const;
 		// Print the contents to a file
 
 		template<class OutVector, class InVector>
@@ -224,6 +237,9 @@ namespace LinBox
 
 		// Get the determinant of the matrix
 		Element& det( Element& res ) const;
+
+		Element& trace( Element& res ) const;
+
 	protected:
 		// initialization via a vector. Usually called by a constructor
 		// Moved in a separate protected function to enable easier
@@ -231,20 +247,25 @@ namespace LinBox
 		void init_vector( const std::vector<Element>& v );
 	}; //  Toeplitz specialization
 
+	template<class Field, class PD>
+	struct DetCategory<Toeplitz<Field,PD> >	{ typedef typename SolutionTags::Local Tag; };
+
+	template<class Field, class PD>
+	struct TraceCategory<Toeplitz<Field,PD> >	{ typedef typename SolutionTags::Local Tag; };
+
+
+
 } // namespace LinBox
 
 #include "linbox/blackbox/toeplitz.inl"
-// Hide the implementation; include it here because
-// older compilers want everything in one template file
 
 #endif //__LINBOX_toeplitz_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/toeplitz.inl b/linbox/blackbox/toeplitz.inl
index 1978f0f..acf6c3c 100644
--- a/linbox/blackbox/toeplitz.inl
+++ b/linbox/blackbox/toeplitz.inl
@@ -27,9 +27,6 @@
  *    partial template  specialization for toeplitz matrices that
  *    are manipulated in fields and rings according to the arithmetic
  *    in the ntl package from V. Shoup
- *
- *    Everything is in the Linbox namespace by virtue of the #include
- *    in ntl-Toeplitz.h
  *-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
 
 #ifndef __LINBOX_bb_toeplitz_INL
@@ -37,7 +34,7 @@
 
 #include <iostream>
 #include <fstream>
-#include <cassert> // JGD 26.09.2003
+// #include <clinbox_check> // JGD 26.09.2003
 #include "linbox/algorithms/toeplitz-det.h"
 
 namespace LinBox
@@ -45,12 +42,12 @@ namespace LinBox
 	/*-----------------------------------------------------------------
 	 *----    Destructor
 	 *----------------------------------------------------------------*/
-	template <class _CField, class _PField>
-	inline ToeplitzBase<_CField,_PField>::~ToeplitzBase()
+	template <class _CField, class _PRing>
+	inline ToeplitzBase<_CField,_PRing>::~ToeplitzBase()
 	{
 #ifdef DBGMSGS
-		std::cout << "Toeplitz::~Toeplitz():\tDestroyed a " << rowDim << "x"<< this->colDim<<
-						     " Toeplitz matrix "<< std::endl;
+		std::cout << "Toeplitz::~Toeplitz():\tDestroyed a " << rowdim() << "x"<< this->coldim()<<
+		" Toeplitz matrix "<< std::endl;
 #endif
 	}//---- Destructor ---- [Tested 6/14/02 -- Works]
 
@@ -59,9 +56,9 @@ namespace LinBox
 	/*-----------------------------------------------------------------
 	 *----    Field-only Constructor
 	 *----------------------------------------------------------------*/
-	template <class _CField, class _PField>
-	ToeplitzBase<_CField, _PField>::ToeplitzBase(const Field& F) :
-		P(F), K(F)
+	template <class _CField, class _PRing>
+	ToeplitzBase<_CField, _PRing>::ToeplitzBase(const Field& F) :
+		P(F), field_(&F)
 	{
 		sysDim =               // Default dimension is 0
 		rowDim =               // Default row dim is 0
@@ -69,18 +66,19 @@ namespace LinBox
 		shape.shape(BlackboxSpecifier::TOEPLITZ);
 #ifdef DBGMSGS
 		std::cout << "Toeplitz::Toeplitz():\tCreated a " << rowDim << "x"<< this->colDim<<
-						    " Toeplitz matrix "<< std::endl;
+		" Toeplitz matrix "<< std::endl;
 #endif
 
 	}//----- Field-only Constructor
 
 
+#if 0
 	/*-----------------------------------------------------------------
 	 *----    Zero Parameter Constructor
 	 *----------------------------------------------------------------*/
-	template <class _CField, class _PField>
-	ToeplitzBase<_CField, _PField>::ToeplitzBase() :
-		P(0), K(0)
+	template <class _CField, class _PRing>
+	ToeplitzBase<_CField, _PRing>::ToeplitzBase() :
+		P(0), field_(0)
 	{
 		sysDim =               // Default dimension is 0
 		rowDim =               // Default row dim is 0
@@ -88,17 +86,15 @@ namespace LinBox
 		shape.shape(BlackboxSpecifier::TOEPLITZ);
 #ifdef DBGMSGS
 		std::cout << "Toeplitz::Toeplitz():\tCreated a " << rowDim << "x"<< this->colDim<<
-						    " Toeplitz matrix "<< std::endl;
+		" Toeplitz matrix "<< std::endl;
 #endif
 
 	}//----- Zero Param Constructor ---- [Tested 6/14/02 -- Works]
+#endif
 
-	/*-----------------------------------------------------------------
-	 *------ Polynomial Field constructor
-	 *-----------------------------------------------------------------*/
-	template< class _CField, class _PField >
-	ToeplitzBase<_CField,_PField>::ToeplitzBase( const PField& PF ) :
-		P(PF), K(PF.getCoeffField())
+	template <class _CField, class _PRing>
+	ToeplitzBase<_CField, _PRing>::ToeplitzBase(const _PRing& PF) :
+		P(PF), field_(&(PF.getCoeffField()))
 	{
 		sysDim = rowDim = this->colDim = 0;
 		shape.shape(BlackboxSpecifier::TOEPLITZ);
@@ -108,27 +104,27 @@ namespace LinBox
 	/*-----------------------------------------------------------------
 	 *------ Polynomial constructor
 	 *-----------------------------------------------------------------*/
-	template< class _CField, class _PField >
-	ToeplitzBase<_CField,_PField>::ToeplitzBase
-	( const PField& PF, const Poly& p, size_t m, size_t n ) :
-		P(PF), K(PF.getCoeffField()), rowDim(m), colDim(n), pdata(p)
+	template< class _CField, class _PRing >
+	ToeplitzBase<_CField,_PRing>::ToeplitzBase ( const PRing& PF
+						     , const Poly& p
+						     , size_t m
+						     , size_t n ) :
+		P(PF), field_(&(PF.getCoeffField())), rowDim(m), colDim(n), pdata(p)
 	{
 		shape.shape(BlackboxSpecifier::TOEPLITZ);
 		if( n == 0 ) this->colDim = rowDim;
 		if( rowDim >= this->colDim ) sysDim = rowDim;
 		else sysDim = this->colDim;
 
-		assert( P.deg(p) <= rowDim + this->colDim - 2 );
+		linbox_check( P.deg(p) <= rowDim + this->colDim - 2 );
 
 		P.rev(rpdata, pdata);
 
 		// Account for possible trailing zeroes
 		if( P.deg(pdata) < rowDim + this->colDim - 2 ) {
 			Poly x;
-			P.init(x,0);
-			Element one;
-			K.init(one,1);
-			P.setCoeff(x, (rowDim + this->colDim - 2 - P.deg(pdata)), one);
+			P.assign(x,P.zero);
+			P.setCoeff(x, (rowDim + this->colDim - 2 - P.deg(pdata)), field().one);
 			P.mulin( rpdata, x );
 		}
 
@@ -138,15 +134,15 @@ namespace LinBox
 	/*-----------------------------------------------------------------
 	 *----- Constructor With User-Supplied First Row And Column
 	 *----------------------------------------------------------------*/
-	template <class _PField>
-	void Toeplitz<typename _PField::CoeffField, _PField>::init_vector( const std::vector<Element>&v)
+	template <class _PRing>
+	void Toeplitz<typename _PRing::CoeffField, _PRing>::init_vector( const std::vector<Element>&v)
 	{
 		if ( (1 & v.size()) == 0)
 		{
 			std::cout << "There must be an ODD number of entries in the input vector " <<
 			"The length given is " << v.size();
 		}
-		assert( (1 & v.size()) == 1);
+		linbox_check( (1 & v.size()) == 1);
 
 		this->P.init(this->pdata, v);
 		this->P.rev(this->rpdata, this->pdata);
@@ -154,10 +150,8 @@ namespace LinBox
 		// Account for possible trailing zeroes
 		if( this->P.deg(this->pdata) < v.size() - 1 ) {
 			Poly x;
-			this->P.init(x,0);
-			Element one;
-			this->K.init(one,1);
-			this->P.setCoeff(x, (v.size() - 1 - this->P.deg(this->pdata)), one);
+			this->P.assign(x,this->P.zero);
+			this->P.setCoeff(x, (v.size() - 1 - this->P.deg(this->pdata)), this->field().one);
 			this->P.mulin( this->rpdata, x );
 		}
 
@@ -167,7 +161,7 @@ namespace LinBox
 
 #ifdef DBGMSGS
 		std::cout << "Toeplitz::Toeplitz(F,V):\tCreated a " << rowDim << "x"<< this->colDim<<
-						       " Toeplitz matrix "<< std::endl;
+		" Toeplitz matrix "<< std::endl;
 #endif
 
 	}//----- Constructor given a vector---- [Tested 6/14/02 -- Works]
@@ -177,44 +171,45 @@ namespace LinBox
 	/*-----------------------------------------------------------------
 	 *-----    Print The Matrix To Screen
 	 *----------------------------------------------------------------*/
-	template <class _PField>
-	void Toeplitz<typename _PField::CoeffField,_PField>::print(std::ostream& os) const
+	template <class _PRing>
+	std::ostream & Toeplitz<typename _PRing::CoeffField,_PRing>::write(std::ostream& os) const
 	{
 
-		register int i, N;
-		register unsigned int j;
+		int N;
 		Element temp;
 
-		os<< this->rowDim << " " << this->colDim << " " << this->shape.shape() << std::endl;
-		N = (int) (this->rowDim + this->colDim) -1;
+		os<< this->rowdim() << " " << this->coldim() << " " << this->shape.shape() << std::endl;
+		N = (int) (this->rowdim() + this->coldim()) -1;
 
 		if ( N < 20 )             // Print small matrices in dense format
 		{
-			for (i = (int)this->colDim-1; i < N; i++)
+			int i;
+			unsigned int j;
+			for (i = (int)this->coldim()-1; i < N; i++)
 			{
-				for ( j = 0; j < this->colDim ; j++)
+				for ( j = 0; j < this->coldim() ; j++)
 					os << " " ;
-				this->K.write(os,this->P.getCoeff(temp,this->pdata,static_cast<size_t>(i-j))) ;
+				this->field().write(os,this->P.getCoeff(temp,this->pdata,static_cast<size_t>((unsigned int)i-j))) ;
 				os << std::endl;
 			}
 		}
 		else
 		{                    // Print large matrices' first row and col
 			os << "[";
-			for (size_t ii = this->rowDim + this->colDim - 2; ii> 0;ii--)
-				this->K.write(os, this->P.getCoeff(temp,this->pdata,ii) ) << " ";
-			this->K.write(os,this->P.getCoeff(temp,this->pdata,0)) << "]\n";
+			for (size_t ii = this->rowdim() + this->coldim() - 2; ii> 0;ii--)
+				this->field().write(os, this->P.getCoeff(temp,this->pdata,ii) ) << " ";
+			this->field().write(os,this->P.getCoeff(temp,this->pdata,0)) << "]\n";
 			this->P.write(os, this->pdata) << std::endl;
 		} //[v(2n-2),....,v(0)]; where v(0) is the top right entry of the matrix
 
-		return;
-	} //---- print()----- [Tested 6/14/02 -- Works]
+		return os;
+	} //---- write()----- [Tested 6/14/02 -- Works]
 
 
+#if 0
 	// 	/*-----------------------------------------------------------------
 	// 	 *----    The infamous clone has been created here
 	// 	 *----------------------------------------------------------------*/
-#if 0
 	template <class Field, class Vector>
 	BlackboxArchetype<Vector>* Toeplitz<Field, Vector>::clone() const
 	{
@@ -225,50 +220,49 @@ namespace LinBox
 	/*-----------------------------------------------------------------
 	 *----    Save To File, Given Destination Filename
 	 *----------------------------------------------------------------*/
-	template <class _PField>
-	void Toeplitz<typename _PField::CoeffField, _PField>::print( char *outFileName) const
+	template <class _PRing>
+	void Toeplitz<typename _PRing::CoeffField, _PRing>::write( char *outFileName) const
 	{
 		Element temp;
 
 		std::cout << "Printing toeplitz matrix to " << outFileName << std::endl;
 
 		if ( outFileName == NULL )
-			print();    // Print to stdout if no file is specified
+			write();    // Print to stdout if no file is specified
 		else
 		{
 			std::ofstream o_fp(outFileName, std::ios::out);
-			o_fp << this->rowDim << " " << this->colDim << " " << this->shape.shape() << std::endl ;
+			o_fp << this->rowdim() << " " << this->coldim() << " " << this->shape.shape() << std::endl ;
 			o_fp << "[";
-			for (size_t i = this->rowDim + this->colDim - 1 ; i-- ; )
-				this->K.write(o_fp,this->P.getCoeff(temp,this->pdata,i))
+			for (size_t i = this->rowdim() + this->coldim() - 1 ; i-- ; )
+				this->field().write(o_fp,this->P.getCoeff(temp,this->pdata,i))
 				<< " ";
 			o_fp << "]\n";
 
 			o_fp.close();
 		}
 		return;
-	} // print(char *) [Tested 6/14/02 -- Works]
+	} // write(char *) [Tested 6/14/02 -- Works]
 
 
+#if 0 //dated material with no known use -bds 2012Jul
 	/*-----------------------------------------------------------------
 	 *    Make the matrix upper triangular with determinant 1.
 	 *    i.e. clear the last N-1 elements in the data vector
 	 *----------------------------------------------------------------*/
-	template <class _CField, class _PField>
-	void ToeplitzBase<_CField, _PField>::setToUniModUT()
+	template <class _CField, class _PRing>
+	void ToeplitzBase<_CField, _PRing>::setToUniModUT()
 	{
-		typename PField::Coeff zero, one;
-		P.getCoeffField().init(zero,0);
-		P.getCoeffField().init(one,1);
+		const PRing & PF = P.getCoeffField() ;
 
-		for( size_t i = sysDim; i <= P.deg(pdata); ++i )
-			P.setCoeff(pdata,i,zero);
+		for( size_t i = sysdim(); i <= P.deg(pdata); ++i )
+			P.setCoeff(pdata,i,PF.zero);
 
 		for( size_t i = 0; i < sysDim - 1; ++i )
-			P.setCoeff(rpdata,i,zero);
+			P.setCoeff(rpdata,i,PF.zero);
 
-		P.setCoeff(pdata,sysDim-1,one);
-		P.setCoeff(rpdata,sysDim-1,one);
+		P.setCoeff(pdata,sysDim-1,PF.one);
+		P.setCoeff(rpdata,sysDim-1,PF.one);
 
 		shape.shape(BlackboxSpecifier::UNIMOD_UT);
 		return;
@@ -280,57 +274,69 @@ namespace LinBox
 	 *    Make matrix a unimodular Lower Triangular with det 1
 	 *    i.e. clear the first N-1 elements in the data vector
 	 *----------------------------------------------------------------*/
-	template <class _CField, class _PField>
-	void ToeplitzBase<_CField, _PField>::setToUniModLT()
+	template <class _CField, class _PRing>
+	void ToeplitzBase<_CField, _PRing>::setToUniModLT()
 	{
-		typename PField::Coeff zero, one;
-		P.getCoeffField().init(zero,0);
-		P.getCoeffField().init(one,1);
+		const PRing & PF = P.getCoeffField() ;
 
 		for( size_t i = sysDim; i <= P.deg(rpdata); ++i )
-			P.setCoeff(rpdata,i,zero);
+			P.setCoeff(rpdata,i,PF.zero);
 
 		for( size_t i = 0; i < sysDim - 1; ++i )
-			P.setCoeff(pdata,i,zero);
+			P.setCoeff(pdata,i,PF.zero);
 
-		P.setCoeff(pdata,sysDim-1,one);
-		P.setCoeff(rpdata,sysDim-1,one);
+		P.setCoeff(pdata,sysDim-1,PF.one);
+		P.setCoeff(rpdata,sysDim-1,PF.one);
 
 		shape.shape(BlackboxSpecifier::UNIMOD_LT);
 		return;
 	}// [UNCOMMENTED PART Tested 6/14/02 -- Works]
 
+#endif
 
 	/*-----------------------------------------------------------------
 	 *     Compute the determinant of the matrix
 	 *-----------------------------------------------------------------*/
-	template<class _PField>
-	typename Toeplitz<typename _PField::CoeffField,_PField>::Element&
-	Toeplitz<typename _PField::CoeffField,_PField>::det
+	template<class _PRing>
+	typename Toeplitz<typename _PRing::CoeffField,_PRing>::Element&
+	Toeplitz<typename _PRing::CoeffField,_PRing>::det
 	( Element& res ) const
 	{
 		return toeplitz_determinant( this->P, res, this->pdata, this->sysDim );
 	}
 
+	/*-----------------------------------------------------------------
+	 *     Compute the trace of the matrix
+	 *-----------------------------------------------------------------*/
+	/*-----------------------------------------------------------------
+	 *     Compute the trace of the matrix
+	 *-----------------------------------------------------------------*/
+	/*-----------------------------------------------------------------
+	 *     Compute the trace of the matrix
+	 *-----------------------------------------------------------------*/
+	template<class _PRing>
+	typename Toeplitz<typename _PRing::CoeffField,_PRing>::Element&
+	Toeplitz<typename _PRing::CoeffField,_PRing>::trace
+	( Element& res ) const
+	{
+		Element x; this->field().init(x, min(rowdim(), coldim()));
+		this->P.getCoeff(res, pdata, rowdim()-1);
+		return this->field().mulin(res, x);
+	}
+
 
 
 	/*-----------------------------------------------------------------
 	 *    Apply the matrix to a vector
 	 *----------------------------------------------------------------*/
-	template <class _PField>
+	template <class _PRing>
 	template <class OutVector, class InVector>
-	OutVector& Toeplitz<typename _PField::CoeffField,_PField>::apply( OutVector &v_out,
-									  const InVector& v_in) const
+	OutVector& Toeplitz<typename _PRing::CoeffField,_PRing>::apply( OutVector &v_out,
+									const InVector& v_in) const
 	{
 
-		if (v_out.size() != this->rowdim())
-			std::cout << "\tToeplitz::apply()\t output vector not correct size, at "
-			<< v_out.size() << ". System rowdim is" <<  this->rowdim() << std::endl;
-		if ( v_in.size() != this->coldim() )
-			std::cout << "\tToeplitz::apply()\t input vector not correct size at "
-			<< v_in.size() << ". System colDim is" <<  this->coldim() << std::endl;
-		assert((v_out.size() == this->rowdim()) &&
-		       (v_in.size() == this->coldim()))  ;
+		linbox_check((v_out.size() == this->rowdim()) &&
+			     (v_in.size() == this->coldim()))  ;
 
 		Poly pOut, pIn;
 		this->P.init( pIn, v_in );
@@ -360,10 +366,10 @@ namespace LinBox
 	/*-----------------------------------------------------------------
 	 *    Apply the transposed matrix to a vector
 	 *----------------------------------------------------------------*/
-	template <class _PField>
+	template <class _PRing>
 	template<class OutVector, class InVector>
-	OutVector& Toeplitz<typename _PField::CoeffField,_PField>::applyTranspose( OutVector &v_out,
-										   const InVector& v_in) const
+	OutVector& Toeplitz<typename _PRing::CoeffField,_PRing>::applyTranspose( OutVector &v_out,
+										 const InVector& v_in) const
 	{
 
 		if (v_out.size() != this->coldim())
@@ -372,8 +378,8 @@ namespace LinBox
 		if ( v_in.size() != this->rowdim() )
 			std::cout << "\tToeplitz::apply()\t input vector not correct size at "
 			<< v_in.size() << ". System colDim is" <<  this->rowdim() << std::endl;
-		assert((v_out.size() == this->coldim()) &&
-		       (v_in.size() == this->rowdim()))  ;
+		linbox_check((v_out.size() == this->coldim()) &&
+			     (v_in.size() == this->rowdim()))  ;
 
 		Poly pOut, pIn;
 		this->P.init( pIn, v_in );
@@ -401,11 +407,10 @@ namespace LinBox
 
 #endif //__LINBOX_bb_toeplitz_INL
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/transpose.h b/linbox/blackbox/transpose.h
index 4c4fb8c..8433de1 100644
--- a/linbox/blackbox/transpose.h
+++ b/linbox/blackbox/transpose.h
@@ -26,6 +26,7 @@
 #ifndef __LINBOX_transpose_H
 #define __LINBOX_transpose_H
 
+#include "linbox/util/error.h"
 #include "linbox/blackbox/blackbox-interface.h"
 
 namespace LinBox
@@ -50,6 +51,7 @@ namespace LinBox
 	  \ingroup blackbox
 
 	 * @param Vector \ref LinBox dense or sparse vector of field elements
+	 * @bug no write here. test-blackbox.h requires it
 	 */
 	template <class Blackbox>
 	class Transpose : public BlackboxInterface {
@@ -66,6 +68,10 @@ namespace LinBox
 		 * matrix A
 		 * @param A pointer to black box matrix.
 		 */
+		Transpose (Blackbox& A) :
+			_A_ptr(&A)
+		{}
+
 		Transpose (const Blackbox& A) :
 			_A_ptr(&A)
 		{}
@@ -163,7 +169,26 @@ namespace LinBox
 
 		// accessors to the blackboxes
 		const Blackbox* getPtr() const {return  _A_ptr;}
-	private:
+
+		Element& getEntry(Element& x, size_t i, size_t j) const
+		{
+			return _A_ptr->getEntry(x, j, i);
+		}
+
+		void setEntry(size_t i, size_t j, const Element& x)
+		{
+			const_cast<Blackbox_t*>(_A_ptr)->setEntry( j, i, x);
+		}
+
+		std::ostream &write(std::ostream & os) const {
+			return _A_ptr->write(os << "transpose of:");
+		}
+		std::istream &read(std::istream & is) {
+			throw LinboxError("you don't want to call read here");
+			return is;
+		}
+
+	protected:
 
 		// Pointers to the matrix
 		const Blackbox *_A_ptr;
diff --git a/linbox/blackbox/triangular-fibb.h b/linbox/blackbox/triangular-fibb.h
new file mode 100644
index 0000000..328ded6
--- /dev/null
+++ b/linbox/blackbox/triangular-fibb.h
@@ -0,0 +1,322 @@
+/* linbox/blackbox/triangular-fibb.h
+ * bds
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_triangular_fibb_H
+#define __LINBOX_triangular_fibb_H
+
+#include <utility>
+#include <algorithm>
+
+#include "linbox/linbox-config.h"
+#include "linbox/linbox-tags.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h" 
+#include "linbox/randiter/mersenne-twister.h"
+#include "linbox/blackbox/fibb.h"
+
+namespace LinBox
+{
+
+	/** \brief 
+
+	  \ingroup blackbox
+	 */
+	template<class Field_>
+	struct TriangularFIBB : public  FIBB<Field_>
+	{
+		typedef Field_			Field;
+	protected:
+		typedef TriangularBlasMatrix<Field> Rep_t;
+		Rep_t * rep_;
+		const Field* field_;
+	public:
+		typedef TriangularFIBB<Field>	Self_t;
+		typedef typename Field::Element	Element;
+		typedef DenseMatrix<Field> Matrix;
+
+		Self_t& init(Rep_t& T) const
+		{ rep_ = &T; field_ = &(T.field()); return *this; }
+
+		TriangularFIBB(const Field& F): field_(&F) {}
+		/// Constructor from a TriangularBlasMatrix
+		TriangularFIBB(Rep_t& T): rep_(&T), field_(&T.field()) {}
+
+		void random() { rep_->random(); }
+		/*
+		void random(size_t n)
+		{
+			size_t n = rowdim();
+			rep_->identity((int)n);
+			MersenneTwister r((unsigned int)time(NULL));
+			// Knuth construction
+			for (size_t i = 0; i < n-1; ++i) {
+				size_t j = i + r.randomInt()%(n-i);
+				std::swap(rep_->_indices[i], rep_->_indices[j]);
+			}
+		}
+		*/
+
+
+		/* Copy constructor.
+		 * Creates new black box objects in dynamic memory.
+		 * @param M constant reference to compose black box matrix
+		 */
+		TriangularFIBB (const TriangularFIBB &Mat) :
+			rep_(Mat.rep_)
+		{}
+
+		// Destructor
+		~TriangularFIBB (void) {}
+
+		Matrix& applyRight(Matrix& B, const Matrix& A) const 
+		{	return applyMatrix(B, A, FFLAS::FflasLeft);   }
+
+		Matrix& applyLeft(Matrix& B, const Matrix& A) const 
+		{	return applyMatrix(B, A, FFLAS::FflasRight);   }
+
+		Matrix& applyMatrix(Matrix& B, const Matrix& A, const FFLAS::FFLAS_SIDE side) const {
+			B.copy(A);
+			FFLAS::ftrmm<Field> (field(), 
+				side,
+				FFLAS::FFLAS_UPLO(rep_->getUpLo()), //const FFLAS_UPLO Uplo,
+		    	FFLAS::FflasNoTrans, //const FFLAS_TRANSPOSE TransA,
+				FFLAS::FFLAS_DIAG(rep_->getDiag()), //const FFLAS_DIAG Diag,
+				B.rowdim(), //const size_t M, 
+				B.coldim(), //const size_t N,
+				field().one, //const typename Field::Element alpha,
+				rep_->getPointer(), //typename Field::Element_ptr A, 
+				rep_->getStride(), //const size_t lda,
+				B.getPointer(), //typename Field::Element_ptr B, 
+				B.getStride() //const size_t ldb)
+			);
+			return B;
+		}
+
+#if 0
+		// will want better base case
+		Matrix& applyRight(Matrix& Y, const Matrix& X) const
+		{
+			Element x; field().init(x);
+			if (rowdim() == 1) ...//TODO == quit here
+			for (size_t i = 0; i < Y.rowdim(); ++i){
+				size_t k = rep_->_indices[i];
+				for (size_t j = 0; j < Y.coldim(); ++j)
+					Y.setEntry(i,j, X.getEntry(x, k, j));
+			}
+		/* desired form
+			for (size_t i = 0; i < rowdim(); ++i)
+			{
+				Matrix Yrow(Y, i, 0, 1, Y.coldim());
+				Matrix Xrow(X, rep_->_indices[i], 0, 1, X.coldim());
+				Yrow.copy(Xrow); // right kind of copy?
+			}
+		*/
+			return Y; 
+		}
+		Matrix& applyLeft(Matrix& Y, const Matrix& X) const
+		{
+			Element x; field().init(x);
+			for (size_t i = 0; i < Y.coldim(); ++i){
+				size_t k = rep_->_indices[i];
+				for (size_t j = 0; j < Y.rowdim(); ++j)
+					Y.setEntry(j,k, X.getEntry(x, j, i));
+			}
+		/* desired form
+			for (size_t i = 0; i < coldim(); ++i)
+			{
+				Matrix Ycol(Y, 0, rep_->_indices[i], Y.rowdim(), 1);
+				Matrix Xcol(X, 0, i, X.rowdim(), 1);
+				Ycol.copy(Xcol); 
+		*/
+			return Y; 
+		}
+#endif
+		/* FIBB functions */
+
+		BBType bbTag() const { return triangular; }
+
+		size_t& rank(size_t& r) const 
+		{	size_t m = rowdim(), n = coldim();
+			size_t k = m < n ? m : n;
+			if (rep_->getDiag() == Tag::Diag::Unit) {
+				r = k;
+			} else {
+				// assume trapezoid for now, later fix to allow echelon 
+				Element x;
+				r = 0;
+				while (r < k and not field().isZero(rep_->getEntry(x,r,r))) 
+					++r;
+			}
+			return r;
+		}
+
+		Element& det(Element& d) const
+		{	size_t m = rowdim(), n = coldim();
+			if (m != n) {
+				field().assign(d,field().zero);
+			} else if (rep_->getDiag() == Tag::Diag::Unit) {
+				field().assign(d,field().one);
+			} else {
+				Element x;
+				field().assign(d, field().one);
+				for (size_t i = 0; i < m; ++i) 
+					field().mulin(d,rep_->getEntry(x,i,i));
+			}
+			return d;
+		}
+
+		Matrix& solveRight(Matrix& B, const Matrix& A) const
+		{	return solveMatrix(B, A, Tag::Side::Left);	}
+
+		Matrix& solveLeft(Matrix& B, const Matrix& A) const
+		{	return solveMatrix(B, A, Tag::Side::Right);	}
+
+		Matrix& solveMatrix(Matrix& B, const Matrix& A, const Tag::Side side) const 
+		{
+			B.copy(A);
+			FFLAS::ftrsm<Field> (field(), FFLAS::FFLAS_SIDE(side),
+				FFLAS::FFLAS_UPLO(rep_->getUpLo()), //const FFLAS_UPLO Uplo,
+		    	FFLAS::FflasNoTrans, //const FFLAS_TRANSPOSE TransA,
+				FFLAS::FFLAS_DIAG(rep_->getDiag()), //const FFLAS_DIAG Diag,
+				B.rowdim(), //const size_t M, 
+				B.coldim(), //const size_t N,
+				field().one, //const typename Field::Element alpha,
+				rep_->getPointer(), //typename Field::Element_ptr A, 
+				rep_->getStride(), //const size_t lda,
+				B.getPointer(), //typename Field::Element_ptr B, 
+				B.getStride() //const size_t ldb)
+			);
+			return B;
+		}
+
+#if 0
+		Matrix& solveRight(Matrix& Y, const Matrix& X) const
+		{	Element x; field().init(x);
+			for (size_t i = 0; i < Y.rowdim(); ++i){
+				size_t k = rep_->_indices[i];
+				for (size_t j = 0; j < Y.coldim(); ++j)
+					Y.setEntry(k,j, X.getEntry(x, i, j));
+			}
+		/* desired form
+		 	for (size_t i = 0; i < rowdim(); ++i)
+			{
+				Matrix Yrow(Y, rep_->_indices[i], 0, 1, Y.coldim());
+				Matrix Xrow(X, i, 0, 1, X.coldim());
+				Yrow.copy(Xrow); 
+			}
+		*/
+			return Y; 
+		}
+		Matrix& solveLeft(Matrix& Y, const Matrix& X) const
+		{	Element x; field().init(x);
+			for (size_t i = 0; i < Y.coldim(); ++i){
+				size_t k = rep_->_indices[i];
+				for (size_t j = 0; j < Y.rowdim(); ++j)
+					Y.setEntry(j,i, X.getEntry(x, j, k));
+			}
+		/* desired form
+			for (size_t i = 0; i < coldim(); ++i)
+			{
+				Matrix Ycol(Y, 0, i, Y.rowdim(), 1);
+				Matrix Xcol(X, 0, rep_->_indices[i], X.rowdim(), 1);
+				Ycol.copy(Xcol); 
+			}
+		*/
+			return Y; 
+		}
+#endif
+		Matrix& nullspaceRandomRight(Matrix& N) const 
+		{	N.zero(); return N; }
+		Matrix& nullspaceRandomLeft(Matrix& N) const 
+		{	N.zero(); return N; }
+		BlasMatrix<Field>& nullspaceBasisRight(BlasMatrix<Field>& N) const
+		{	N.resize(rowdim(), 0); return N; }
+		BlasMatrix<Field>& nullspaceBasisLeft(BlasMatrix<Field>& N) const
+		{	N.resize(0, coldim()); return N; }
+		/* end FIBB section */
+
+		template<typename _Tp1>
+		struct rebind {
+			typedef TriangularFIBB<_Tp1> other;
+			void operator() (other & Ap, const Self_t& A, const _Tp1& F) {
+				Ap->setStorage( A.getStorage() );
+			}
+		};
+
+
+
+		/* Retreive row dimensions of BlackBox matrix.
+		 * This may be needed for applying preconditioners.
+		 * Required by abstract base class.
+		 * @return integer number of rows of black box matrix.
+		 */
+		/// rowdim
+		size_t rowdim (void) const
+		{
+			return rep_->rowdim();
+		}
+
+		/* Retreive column dimensions of BlackBox matrix.
+		 * Required by abstract base class.
+		 * @return integer number of columns of black box matrix.
+		 */
+		/// coldim
+		size_t coldim (void) const
+		{
+			return rep_->coldim();
+		}
+
+		const Field& field() const { return rep_->field(); }
+		const Field& ring() const { return rep_->field(); }
+
+		//!@bug needs a MM version
+		std::ostream &write(std::ostream &os) const
+		{ return rep_->write(os, Tag::FileFormat::Plain); }
+
+		std::ostream &write(std::ostream &os, LINBOX_enum(Tag::FileFormat) format) const
+		{ return rep_->write(os, format); }
+
+		//!@bug there is no read here. (needed by test-blackbox.h)
+		std::istream &read(std::istream &is) 
+		{ return is; }
+		std::istream &read(std::istream &is) const
+		{ return is; }
+		std::istream &read(std::istream &is, LINBOX_enum(Tag::FileFormat) format) const
+		{
+			throw NotImplementedYet();
+			return is ;
+		}
+
+}; // template <Vector> class TriangularFIBB
+
+
+} // namespace LinBox
+
+#endif // __LINBOX_triangular_fibb_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/triplesbb.h b/linbox/blackbox/triplesbb.h
deleted file mode 100644
index 973b4f5..0000000
--- a/linbox/blackbox/triplesbb.h
+++ /dev/null
@@ -1,348 +0,0 @@
-/* linbox/blackbox/triplesbb.h
- * Copyright (c) Linbox
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
-
- * Written by Rich Seagraves <seagrave at cis.udel.edu>
- * with mods by bds
- */
-
-/** @file blackbox/triplesbb.h
- * @ingroup blackbox
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_triplesbb_H
-#define __LINBOX_triplesbb_H
-
-#include <algorithm>
-using std::max;
-#include "linbox/linbox-config.h"
-#include "linbox/util/debug.h"
-#include "linbox/util/field-axpy.h"
-#include "linbox/blackbox/blackbox-interface.h"
-#include "linbox/field/hom.h"
-
-#include <vector>
-
-namespace LinBox
-{
-
-	/** \brief wrapper for NAG Sparse Matrix format.
-	 *
-	 \ingroup blackbox
-	 * This class acts as a wrapper for a pre-existing NAGSparse Matrix.
-	 * To be used for interface between LinBox and computer algebra systems such
-	 * as Maple that can encode sparse matrices in the NAGSparse format
-	 */
-	template<class _Field>
-	class TriplesBB : public BlackboxInterface{
-
-	public:
-		typedef _Field Field;
-		typedef typename Field::Element Element;
-		typedef TriplesBB<Field> Self_t;
-
-
-		// Default constructor.
-		TriplesBB() {}
-
-		// Takes 3 vectors and copies(bad) them.
-		TriplesBB(	Field F,
-				std::vector<Element> values,
-				std::vector<size_t> rowP,
-				std::vector<size_t> colP,
-				size_t rows,
-				size_t cols,
-				bool RowSortFlag = false,
-				bool ColSortFlag = false);
-
-		// Alternate constructor.  Allows for use of addEntry operation.
-		TriplesBB(Field F, size_t rows, size_t cols, size_t reserve = 0);
-
-		~TriplesBB() {};
-
-		// Copy Constructor
-		TriplesBB(const TriplesBB<Field> &);
-
-		// Assignment operator for use in STL map
-		const TriplesBB<Field> & operator=(const TriplesBB<Field> & );
-
-		template<class OutVector, class InVector>
-		OutVector & apply(OutVector &, const InVector &) const; // y = Ax;
-
-		template<class OutVector, class InVector>
-		OutVector & applyTranspose(OutVector &, const InVector &) const; // y = ATx
-		size_t rowdim() const { return _rows; }
-
-		size_t coldim() const { return _cols; }
-
-		template<typename _Tp1>
-		struct rebind {
-			typedef TriplesBB<_Tp1> other;
-			void operator() (other & Ap, const Self_t& A, const _Tp1& F)
-			{
-				Hom <typename Self_t::Field, _Tp1> hom( A.field(), F);
-
-				typedef typename _Tp1::Element otherElt;
-				typedef typename std::vector<otherElt> othervec;
-				typedef typename std::vector<Element> selfvec;
-				typedef typename othervec::iterator otheriter;
-				typedef typename selfvec::const_iterator selfiter;
-				otheriter vp_p; selfiter v_p;
-
-				Ap._values.resize(A._values.size());
-				for (v_p = A._values.begin(), vp_p = Ap._values.begin();
-				     v_p != A._values.end(); ++ v_p, ++ vp_p)
-					hom.image (*vp_p, *v_p);
-			}
-		};
-
-		template<typename _Tp1>
-		TriplesBB(const TriplesBB<_Tp1>& T, const Field& F) :
-			_field(F), _values(T.size()), _RowV(T.getRows()), _ColV(T.getCols()), _rows(T.rowdim()), _cols(T.coldim()), _faxpy(max(T.getRows(),T.getCols()), FieldAXPY<Field>(F)), _RowSortFlag(T.isRowSorted()), _ColSortFlag(T.isColSorted())
-		{}
-
-
-
-		/* Returns number of non-zero entries */
-		size_t size() const { return _values.size(); }
-
-		// Add entry function, element e is added in the i,j position.  Zero based?
-		void addEntry(const Element & e, const size_t i, const size_t j);
-
-		const Field & field() const { return _field; }
-
-		/* Data accessors.  Used to access the 3 vectors containing Matrix data
-		*/
-		const std::vector<Element> & getData() const { return _values; }
-		const std::vector<size_t> & getRows() const { return _RowV; }
-		const std::vector<size_t> & getCols() const { return _ColV; }
-		bool isRowSorted() { return _RowSortFlag; }
-		bool isColSorted() { return _ColSortFlag; }
-
-
-	protected:
-		Field _field; // The field used by this class
-
-		/// _values contains the nonzero elements of the BlackBox
-		std::vector<Element> _values;
-
-		/// _RowV & _ColV are vectors containing the row & column indices
-		std::vector<size_t> _RowV, _ColV;
-
-		/// The number of rows, columns
-		size_t _rows, _cols;
-
-		/* _apply is the generic apply utility funtion called by apply() and
-		 * applyTranspose().  Walks through the non-zero elements of the Matrix and
-		 * performs the proper calculation using a vector of FieldAxpy's
-		 */
-		template<class OutVector, class InVector>
-		void _apply(OutVector &, const InVector &, std::vector<size_t>::const_iterator, std::vector<size_t>::const_iterator) const;
-
-		/* STL vector of FieldAXPY objects.  Supports delayed modding out, a feature
-		 * which contributes a significant speed boost when performing apply &
-		 * applyTranspose calculations over a field of multi-precision integers
-		 */
-
-		mutable std::vector<FieldAXPY<Field> > _faxpy;
-
-		/* Sort flag.  Used by the sort function to determine whether a sort
-		 * operation is needed.  Also used by _apply for a slightly optimized
-		 * apply operation.  Note, "sorted" is considered sorted if the
-		 * matrix is row-sorted, IE if the entries go row 1, row 1, row 1, row 2, row 2, etc
-		 */
-		bool _RowSortFlag, _ColSortFlag;
-
-
-	};
-
-	/*  Constructor for the TriplesBB class.  This is the constructor that is
-	 * expected to be used.  To use it, you must pass in a field element that
-	 * will work over the data (F), pointers to the 3 arrays used by the NAGSparse
-	 * format (values, rowP, colP), the number of rows and columns (rows and
-	 * cols), the number of non-zero elements (NNz) and the ordering, which
-	 * defaults to 0 (no ordering implied).
-	 */
-	template<class Field>
-	TriplesBB<Field>::TriplesBB(Field F,
-				    std::vector<Element> values,
-				    std::vector<size_t> RowV,
-				    std::vector<size_t> ColV,
-				    size_t rows,
-				    size_t cols,
-				    bool RowSortFlag,
-				    bool ColSortFlag) :
-		_field(F), _values(values), _RowV(RowV), _ColV(ColV), _rows(rows), _cols(cols), _faxpy(max(rows,cols), FieldAXPY<Field>(F)), _RowSortFlag(RowSortFlag), _ColSortFlag(ColSortFlag)
-	{}
-
-	/* Better constructor that only takes the field, m, n and recommended
-	 * reserve (optional arguement) for use with STL vector reserve option
-	 * (reduce the number of memory management moves).  Meant to be used in
-	 * conjuction with the addEntry() method
-	 */
-	template<class Field>
-	TriplesBB<Field>::TriplesBB( Field F, size_t rows, size_t cols, size_t res):
-		_field(F), _rows(rows), _cols(cols), _faxpy( max(rows, cols), FieldAXPY<Field>(F)), _RowSortFlag(false), _ColSortFlag(false)
-	{
-		if(res != 0) {
-			_values.reserve(res);
-			_RowV.reserve(res);
-			_ColV.reserve(res);
-		}
-	}
-
-
-
-	template<class Field>
-	TriplesBB<Field>::TriplesBB(const TriplesBB<Field> &In) :
-		_faxpy( max(In._rows, In._cols), FieldAXPY<Field>(In._field)),
-		_field ( In._field ),
-		_values ( In._values ),
-		_RowV ( In._RowV ),
-		_ColV ( In._ColV ),
-		_rows ( In._rows ),
-		_cols ( In._cols ),
-		_RowSortFlag ( In._RowSortFlag ),
-		_ColSortFlag ( In._ColSortFlag )
-	{ }
-
-
-	template<class Field>
-	const TriplesBB<Field> & TriplesBB<Field>::operator=(const TriplesBB<Field> & rhs)
-	{
-		_field = rhs._field;
-		_values = rhs._values;
-		_RowV = rhs._RowV;
-		_ColV = rhs._ColV;
-		_rows = rhs._rows; _cols = rhs._cols;
-		_RowSortFlag = rhs._RowSortFlag;
-		_ColSortFlag  = rhs._ColSortFlag;
-
-		_faxpy.resize(rhs._faxpy.size(), FieldAXPY<Field>(_field));
-
-		return *this;
-	}
-
-
-	template<class Field>
-	template<class OutVector, class InVector>
-	OutVector & TriplesBB<Field>::apply(OutVector & y, const InVector & x) const
-	{
-
-		_apply( y, x, _RowV.begin(), _ColV.begin() );
-		return y;
-	}
-
-	/* BlackBoxArchetype applyTranspose function.  Performs the y = ATx, where
-	 * y and x are vectors passed in applyTranspose(y,x), and A is the present
-	 * Matrix.  Returns a reference to y.  As this is a tranpose calculation,
-	 * the indexing is reversed, so y is indexed by the columns, while x is indexed
-	 * by the rows.  Thus, as in apply above, takes advantage of this fact by
-	 * switching on the ordering.
-	 */
-	template<class Field>
-	template<class OutVector, class InVector>
-	OutVector & TriplesBB<Field>::applyTranspose(OutVector & y, const InVector & x) const
-	{
-		_apply( y, x, _ColV.begin(), _RowV.begin() );
-		return y;
-	}
-
-
-	template<class Field>
-	template<class OutVector, class InVector>
-	void TriplesBB<Field>::_apply(OutVector & y, const InVector & x, std::vector<size_t>::const_iterator i, std::vector<size_t>::const_iterator j) const
-	{
-		typename OutVector::iterator yp;
-		typename InVector::const_iterator xp;
-		typename Field::Element zero;
-		typename std::vector<Element>::const_iterator v;
-		typename std::vector<FieldAXPY<Field> >::iterator fa_i;
-
-		_field.init(zero,0);
-
-		for(fa_i = _faxpy.begin(); fa_i != _faxpy.end(); ++fa_i)
-			fa_i->assign(zero);
-
-		for( v = _values.begin(), fa_i = _faxpy.begin() - 1, xp = x.begin() - 1; v != _values.end(); ++i, ++j, ++v)
-			(fa_i + *i)->mulacc(*v,  *(xp + *j));
-
-
-
-		for(fa_i = _faxpy.begin(), yp = y.begin(); yp != y.end(); ++yp, ++fa_i)
-			fa_i->get(*yp);
-
-
-
-	}
-
-
-	/* addEntry method.  Allows user to add entries on the fly.  Meant to be used
-	 * with the "copyless" constructor above.  Note, will automatically set the
-	 * _sortFlag to false, as you can't be sure the entries are still sorted afterwards
-	 */
-	template<class Field>
-	void TriplesBB<Field>::addEntry(const Element &Elem, const size_t i, const size_t j)
-	{
-		_RowSortFlag = _ColSortFlag = false;
-		_values.push_back(Elem);
-		_RowV.push_back(i);
-		_ColV.push_back(j);
-	}
-
-#if 0
-	template<class Field, class Vector>
-	void TriplesBB<Field, Vector>::SortByRow()
-	{
-		RowWiseLessThan<Field,Vector> rwlt;
-		if(_RowSortFlag) return; // If already sorted, bail
-
-		std::sort( IndexedBegin(), IndexedEnd(), rwlt  );
-		_RowSortFlag = true;     // Sets the row sort flag
-		_ColSortFlag = false;    // Unset the col sort flag
-
-	}
-
-	template<class Field, class Vector>
-	void TriplesBB<Field, Vector>::SortByCol()
-	{
-
-		ColWiseLessThan<Field,Vector> cwlt;
-		if(_ColSortFlag) return;  // If already sorted, bail
-
-		std::sort( IndexedBegin(), IndexedEnd(), cwlt );
-		_ColSortFlag = true;     // Sets the Col sort flag
-		_RowSortFlag = false;    // Unset the Row sort flag
-	}
-#endif
-
-} // namespace LinBox
-
-#endif // __LINBOX_triplesbb_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/blackbox/zero-one.h b/linbox/blackbox/zero-one.h
index a1734a3..83294e7 100644
--- a/linbox/blackbox/zero-one.h
+++ b/linbox/blackbox/zero-one.h
@@ -35,7 +35,7 @@
 #include "linbox/integer.h"
 #include "linbox/vector/vector-traits.h"
 #include "linbox/util/debug.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 #include "linbox/blackbox/blackbox-interface.h"
 
 // For STL pair in IndexIterator
@@ -72,7 +72,7 @@ namespace LinBox
 		// Default constructor, do nothing.
 		ZeroOne(const Field& F);
 		// The real constructor /todo give docs here
-		ZeroOne(Field F, Index* rowP, Index* colP, Index rows, Index cols, Index NNz, bool rowSort = false, bool colSort = false);
+		ZeroOne(Field &F, Index* rowP, Index* colP, Index rows, Index cols, Index NNz, bool rowSort = false, bool colSort = false);
 		// Destructor, once again do nothing
 		~ZeroOne();
 
@@ -86,7 +86,7 @@ namespace LinBox
 		template<class OutVector, class InVector>
 		OutVector& apply(OutVector& y, const InVector& x) const // y = Ax;
 		{
-			return applySpecialization(y,x,getType(_field));
+			return applySpecialization(y,x,getType(field()));
 		}
 
 		/** applyTranspose.
@@ -100,7 +100,7 @@ namespace LinBox
 		template<class OutVector, class InVector>
 		OutVector& applyTranspose(OutVector& y, const InVector& x) const // y = ATx
 		{
-			return applyTransposeSpecialization(y,x,getType(_field));
+			return applyTransposeSpecialization(y,x,getType(field()));
 		}
 
 		size_t rowdim() const
@@ -125,7 +125,7 @@ namespace LinBox
 
 		template<typename _Tp1>
 		ZeroOne(const ZeroOne<_Tp1>& Z, const Field& F) :
-			_field(F),
+			_field(&F),
 			_rows(Z.rowdim()), _cols(Z.coldim()), _nnz(Z.nnz()),
 			_rowP(new Index[Z.nnz()]), _colP(new Index[Z.nnz()]),
 			_rowSort(Z.isRowSorted()), _colSort(Z.isColSorted()),
@@ -168,17 +168,20 @@ namespace LinBox
 		 */
 		std::istream &read (std::istream &is)
 		{
-			size_t i, j, k, m, n;
+			size_t i=0, j=0, m=0, n=0;
 
+            // This trick is used to get the entire line
+            // whatever way it is written: "m n M" or "m n nnz"
 			char buf[80];
 			buf[0]=0;
 			is.getline (buf, 80);
 			std::istringstream str (buf);
-			str >> m >> n >> k;
+			str >> m >> n;
 			_rows = m;
 			_cols = n;
+			
 			std::vector<size_t> rowP, colP;
-			size_t x;
+			size_t x=0;
 			while (is >> i >> j >> x) {
 				if (i == 0 || i == (size_t) -1) break;
 				if (x == 1UL) {
@@ -189,26 +192,30 @@ namespace LinBox
 			_nnz = rowP.size();
 			_rowP = new size_t[_nnz];
 			_colP = new size_t[_nnz];
-			copy(rowP.begin(), rowP.end(), _rowP);
-			copy(colP.begin(), colP.end(), _colP);
+			std::copy(rowP.begin(), rowP.end(), _rowP);
+			std::copy(colP.begin(), colP.end(), _colP);
 			return is;
 		}
 
-		std::ostream& write(std::ostream& out =std::cout)
+		std::ostream& write(std::ostream& out = std::cout)
 		{
 			size_t* i=_rowP;
 			size_t* j=_colP;
-			std::cout<<"Row dim: "<<rowdim()
-			<<" Col dim: "<<coldim()
-			<<" Total nnz: "<<nnz()<<"\n";
-			for(;i<_rowP+nnz();++i,++j)
-				std::cout<<*i<<" "<<*j<<"\n";
+
+			out << "Row dim: " << rowdim()
+			    << " Col dim: " << coldim()
+			    << " Total nnz: " << nnz() << std::endl;
+
+            auto lastIndex = _rowP + nnz();
+			for(; i < lastIndex; ++i, ++j)
+				out << *i << " " << *j << std::endl;
+
 			return out;
 		}
 
 		const Field& field() const
 		{
-			return _field;
+			return *_field;
 		}
 
 		bool isRowSorted() const
@@ -229,7 +236,7 @@ namespace LinBox
 	protected:
 
 
-		Field _field; //!< @internal The field used by this class
+		const Field *_field; //!< @internal The field used by this class
 
 		/*! @internal A temporary element used for initalization for the Begin() and
 		 * End() methods of the ZeroOne class.  Is used to initalize a 1
@@ -267,7 +274,7 @@ namespace LinBox
 			return NormField();
 		}
 
-		Mod32Field getType(const Modular<uint32_t> &) const
+		Mod32Field getType(const Givaro::Modular<uint32_t> &) const
 		{
 			return Mod32Field();
 		}
diff --git a/linbox/blackbox/zero-one.inl b/linbox/blackbox/zero-one.inl
index 5252d5e..8bea38b 100644
--- a/linbox/blackbox/zero-one.inl
+++ b/linbox/blackbox/zero-one.inl
@@ -6,20 +6,20 @@
  * Modified by Zhendong Wan, -bds
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -98,25 +98,25 @@ namespace LinBox
 	template<class Field> typename
 	ZeroOne<Field>::Iterator ZeroOne<Field>::Begin()
 	{
-	       	return Iterator( 0, _field.init(_tmp, 1) );
+	       	return Iterator( 0, field().assign(_tmp, field().one) );
 	}
 
 	template<class Field> typename
 	ZeroOne<Field>::Iterator ZeroOne<Field>::End()
 	{
-	       	return Iterator( _nnz, _field.init(_tmp, 1) );
+	       	return Iterator( _nnz, field().assign(_tmp, field().one) );
 	}
 
 	template<class Field>
 	const typename ZeroOne<Field>::Iterator ZeroOne<Field>::Begin() const
 	{
-	       	return Iterator(0, _field.init(_tmp, 1) );
+	       	return Iterator(0, field().assign(_tmp, field().one) );
 	}
 
 	template<class Field>
 	const typename ZeroOne<Field>::Iterator ZeroOne<Field>::End() const
 	{
-	       	return Iterator(_nnz, _field.init(_tmp, 1) );
+	       	return Iterator(_nnz, field().assign(_tmp, field().one) );
 	}
 
 	/*! IndexIterator.
@@ -207,16 +207,16 @@ namespace LinBox
 
 	template<class Field>
 	ZeroOne<Field>::ZeroOne(const Field& F) :
-	       	_field(F)
+	       	_field(&F)
        	{
 		srand((unsigned int) time(NULL) );
 		dynamic = false;
 	}
 
 	template<class Field>
-	ZeroOne<Field>::ZeroOne(Field F, Index* rowP, Index* colP,
+	ZeroOne<Field>::ZeroOne(Field& F, Index* rowP, Index* colP,
 				Index rows, Index cols, Index NNz, bool RowSort, bool ColSort):
-		_field(F), _rows(rows), _cols(cols), _nnz(NNz), _rowP(rowP), _colP(colP), _rowSort(RowSort), _colSort(ColSort) , dynamic(false)
+		_field(&F), _rows(rows), _cols(cols), _nnz(NNz), _rowP(rowP), _colP(colP), _rowSort(RowSort), _colSort(ColSort) , dynamic(false)
 	{
 	       	srand((unsigned)time(NULL));
 	}
@@ -233,9 +233,11 @@ namespace LinBox
 	template<class Field>
 	void ZeroOne<Field>::rowSort() const
 	{
-		int mode = 0;
 		if( _rowSort) return;  // Already sorted, we're done
-		else _qsort( (size_t) 0, _nnz, mode);
+		else {
+			int mode = 0;
+			_qsort( (size_t) 0, _nnz, mode);
+		}
 		_rowSort = true;
 		return;
 	}
@@ -243,9 +245,11 @@ namespace LinBox
 	template<class Field>
 	void ZeroOne<Field>::colSort() const
 	{
-		int mode = 1;
 		if( _colSort) return; // Already sorted, good to go
-		else _qsort( (size_t) 0, _nnz, mode);
+		else {
+			int mode = 1;
+			_qsort( (size_t) 0, _nnz, mode);
+		}
 		_colSort = true; _rowSort = false;
 		return;
 	}
@@ -253,13 +257,13 @@ namespace LinBox
 	template<class Field>
 	void ZeroOne<Field>::_qsort(size_t p, size_t e, int &mode) const
 	{
-		int i;
 		if( (e - p) <= 1) ;
 		else
 		{
+			int i;
 			i = 1 + (int)_part(p, e, mode);
-			_qsort(p, i, mode);
-			_qsort(i, e, mode);
+			_qsort(p, (size_t)i, mode);
+			_qsort((size_t)i, e, mode);
 		}
 	}
 
@@ -267,7 +271,7 @@ namespace LinBox
 	size_t ZeroOne<Field>::_part(size_t p, size_t e, int &mode) const
 	{
 		size_t rtemp, ctemp, rowval, colval;
-		int i = int(p +(int) rand() % (e - p)), j =(int) e;
+		int i = int(p +(size_t) rand() % (e - p)), j =(int) e;
 		rtemp = _rowP[p];
 		ctemp = _colP[p];
 		_rowP[p] = _rowP[i];
@@ -293,7 +297,7 @@ namespace LinBox
 					_rowP[i] = rtemp;
 					_colP[i] = ctemp;
 				}
-				else return j;
+				else return (size_t)j;
 			}
 		}
 		else
@@ -310,7 +314,7 @@ namespace LinBox
 					_rowP[i] = rtemp;
 					_colP[i] = ctemp;
 				}
-				else return j;
+				else return (size_t)j;
 			}
 		}
 	}
@@ -327,7 +331,7 @@ namespace LinBox
 
 		// 0 out y.  Note, this implementation assumes a dense vector.
 		for(yp = y.begin(); yp != y.end(); ++yp)
-			_field.init(*yp , 0);
+			field().assign(*yp , field().zero);
 
 		rowSort();
 
@@ -337,25 +341,25 @@ namespace LinBox
 		jp=_colP;
 		size_t rowI =0;
 
-		for(; ip <_rowP+nnz(); ++ip,++jp)
+        auto ipEnd = _rowP + nnz();
+		for(; ip < ipEnd; ++ip,++jp)
 		{
 			if( *ip == rowI)
-				_field.addin(*yp,*(xp + *jp));
+				field().addin(*yp,*(xp +(ptrdiff_t) *jp));
 			else
 			{
 				if((*ip-rowI)==1)
 					++yp;
 				else
-					yp=y.begin()+*ip;
+					yp=y.begin()+(ptrdiff_t)*ip;
 
 				rowI=*ip;
-				_field.addin(*yp,*(xp + *jp));
+				field().addin(*yp,*(xp +(ptrdiff_t) *jp));
 			}
 		}
 		return y;
 	}
 
-
 	template<class Field>
 	template<class OutVector, class InVector>
 	OutVector & ZeroOne<Field>::applySpecialization(OutVector & y, const InVector & x, const Mod32Field& m) const
@@ -369,7 +373,7 @@ namespace LinBox
 		Index* ip, *jp;
 
 		for(yp = y.begin(); yp != y.end(); ++yp)
-			_field.init(*yp , 0);
+			field().assign(*yp , field().zero);
 
 		rowSort();
 
@@ -380,7 +384,7 @@ namespace LinBox
 		size_t rowI =0;
 		integer _prime;
 
-		_field.characteristic(_prime);
+		field().characteristic(_prime);
 
 		uint32_t prime = static_cast<uint32_t>(_prime);
 
@@ -389,17 +393,17 @@ namespace LinBox
 		for(; ip <_rowP+nnz(); ++ip,++jp)
 		{
 			if( *ip == rowI)
-				accum=accum+*(xp + *jp);
+				accum=accum+*(xp +(ptrdiff_t) *jp);
 			else
 			{
 				*yp= (val_t)(accum % prime);
 				if((*ip-rowI)==1)
 					++yp;
 				else
-					yp=y.begin()+*ip;
+					yp=y.begin()+(ptrdiff_t)*ip;
 
 				rowI=*ip;
-				accum=*(xp+*jp);
+				accum=*(xp+(ptrdiff_t)*jp);
 			}
 		}
 		if(rowI)
@@ -421,7 +425,7 @@ namespace LinBox
 
 		// 0 out y.  Note, this implementation assumes a dense vector.
 		for(yp = y.begin(); yp != y.end(); ++yp)
-			_field.init(*yp , 0);
+			field().assign(*yp , field().zero);
 
 		rowSort();
 
@@ -434,16 +438,16 @@ namespace LinBox
 		for(; ip <_rowP+nnz(); ++ip,++jp)
 		{
 			if( *ip == rowI)
-				_field.addin(*(yp+*jp),*xp);
+				field().addin(*(yp+(ptrdiff_t)*jp),*xp);
 			else
 			{
 				if((*ip-rowI)==1)
 					++xp;
 				else
-					xp=x.begin()+*ip;
+					xp=x.begin()+(ptrdiff_t)*ip;
 
 				rowI=*ip;
-				_field.addin(*(yp+*jp),*xp);
+				field().addin(*(yp+(ptrdiff_t)*jp),*xp);
 			}
 		}
 
@@ -477,21 +481,21 @@ namespace LinBox
 		for(; ip <_rowP+nnz(); ++ip,++jp)
 		{
 			if( *ip == rowI) {
-				*(y_cp+*jp) += *xp;
+				*(y_cp+(ptrdiff_t)*jp) += *xp;
 			}
 			else {
 				if((*ip-rowI)==1)
 					++xp;
 				else
-					xp=x.begin()+*ip;
+					xp=x.begin()+(ptrdiff_t)*ip;
 
 				rowI=*ip;
-				*(y_cp+*jp) += *xp;
+				*(y_cp+(ptrdiff_t)*jp) += *xp;
 			}
 		}
 
 		integer _prime;
-		_field.characteristic(_prime);
+		field().characteristic(_prime);
 		uint32_t prime = static_cast<uint32_t>(_prime);
 
 		yp=y.begin();
diff --git a/linbox/blackbox/zo-gf2.h b/linbox/blackbox/zo-gf2.h
index 84d8443..29d2193 100644
--- a/linbox/blackbox/zo-gf2.h
+++ b/linbox/blackbox/zo-gf2.h
@@ -30,10 +30,10 @@
 #include <algorithm>
 #include "linbox/blackbox/zero-one.h"
 #include "linbox/field/gf2.h"
-#include "linbox/field/unparametric.h"
+#include <givaro/zring.h>
 #include "linbox/util/matrix-stream.h"
 #include "linbox/vector/stream.h"
-#include "linbox/matrix/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/vector/light_container.h"
 
 namespace LinBox
@@ -54,7 +54,7 @@ namespace LinBox
 		typedef ZeroOne<GF2> Self_t;
 		typedef GF2 Field;
 
-		const GF2 _field;
+		const GF2 *_field;
 
 		ZeroOne(const GF2& ) :
 			_nnz(0)
@@ -119,9 +119,9 @@ namespace LinBox
 		 *  @return Reference to input stream
 		 */
 		std::istream &read (std::istream &is) ;
-		std::ostream& write (std::ostream& out, FileFormatTag format=FORMAT_GUILLAUME) const ;
+		std::ostream& write (std::ostream& out, LINBOX_enum(Tag::FileFormat) format=Tag::FileFormat::Guillaume) const ;
 
-		const Field& field() const { return _field; }
+		const Field& field() const { return *_field; }
 
 		template<typename _Tp1>
 		struct rebind {
diff --git a/linbox/blackbox/zo-gf2.inl b/linbox/blackbox/zo-gf2.inl
old mode 100644
new mode 100755
index fa18cfd..fdc7e70
--- a/linbox/blackbox/zo-gf2.inl
+++ b/linbox/blackbox/zo-gf2.inl
@@ -42,11 +42,12 @@ namespace LinBox
 			_field(F), _x(x)
 		{}
 
+
 		bool operator()(const typename Blackbox::Row_t& row) const
 		{
 			bool tmp(false);
 			for(typename Blackbox::Row_t::const_iterator loc = row.begin(); loc != row.end(); ++loc) {
-				_field.addin(tmp,_x[*loc]);
+				_field.addin(tmp,_x.at(*loc));
 			}
 			return tmp;
 		}
@@ -56,7 +57,7 @@ namespace LinBox
 	template<class OutVector, class InVector>
 	inline OutVector & ZeroOne<GF2>::apply(OutVector & y, const InVector & x) const
 	{
-		dotp<Self_t,InVector> mydp(this->_field, x);
+		dotp<Self_t,InVector> mydp(this->field(), x);
 		std::transform(this->begin(), this->end(), y.begin(), mydp );
 		return y;
 	}
@@ -70,7 +71,7 @@ namespace LinBox
 		for( ; row != this->end(); ++yit, ++row) {
 			bool tmp(false);
 			for(Row_t::const_iterator loc = row->begin();loc != row->end(); ++loc)
-				_field.addin(tmp,x[*loc]);
+				field().addin(tmp,x[*loc]);
 			*yit = tmp;
 		}
 		return y;
@@ -85,7 +86,7 @@ namespace LinBox
 		Self_t::const_iterator row = this->begin();
 		for( ; row != this->end(); ++row, ++xit) {
 			for(typename Self_t::Row_t::const_iterator loc = row->begin(); loc != row->end(); ++loc) {
-				_field.addin(y[*loc],*xit);
+				field().addin(y[*loc],*xit);
 			}
 		}
 		return y;
@@ -95,7 +96,7 @@ namespace LinBox
 	inline void ZeroOne<GF2>::setEntry(size_t i, size_t j, const Element& v) {
 		Row_t& rowi = this->operator[](i);
 		Row_t::iterator there = std::lower_bound(rowi.begin(), rowi.end(), j);
-		if (! _field.isZero(v) ) {
+		if (! field().isZero(v) ) {
 			if ( (there == rowi.end() ) || (*there != j) ) {
 				rowi.insert(there, j);
 				++_nnz;
@@ -116,7 +117,7 @@ namespace LinBox
 		if (there != rowi.end() )
 			return r=*there;
 		else
-			return r=_field.zero;
+			return r=field().zero;
 	}
 
 	inline const ZeroOne<GF2>::Element& ZeroOne<GF2>::getEntry(size_t i, size_t j) const
@@ -126,13 +127,13 @@ namespace LinBox
 		if (there != rowi.end() )
 			return reinterpret_cast<const ZeroOne<GF2>::Element&>(*there);
 		else
-			return _field.zero;
+			return field().zero;
 	}
 
 	inline std::istream &ZeroOne<GF2>::read (std::istream &is) {
 		// Reads a long int and take it mod 2 afterwards (v&1)
-		UnparametricField<long> Ints;
-		MatrixStream<UnparametricField<long> > S(Ints, is);
+		Givaro::ZRing<long> Ints;
+		MatrixStream<Givaro::ZRing<long> > S(Ints, is);
 		S.getDimensions( _rowdim, _coldim );
 		this->resize(_rowdim);
 		Index r, c;
@@ -149,9 +150,9 @@ namespace LinBox
 		return is;
 	}
 
-	inline std::ostream& ZeroOne<GF2>::write (std::ostream& out, FileFormatTag format) const
+	inline std::ostream& ZeroOne<GF2>::write (std::ostream& out, LINBOX_enum(Tag::FileFormat) format) const
 	{
-		if (format == FORMAT_GUILLAUME) {
+		if (format == Tag::FileFormat::Guillaume) {
 			out << _rowdim << ' ' << _coldim << " M\n";
 			for(size_t i=0; i<_rowdim; ++i) {
 				const Row_t& rowi = this->operator[](i);
@@ -160,7 +161,7 @@ namespace LinBox
 			}
 			return out << "0 0 0" << std::endl;
 		}
-		else if (format == FORMAT_MAPLE) {
+		else if (format == Tag::FileFormat::Maple) {
 			out << '[';
 			bool firstrow=true;
 			for (const_iterator i = begin (); i != end (); ++i) {
@@ -255,22 +256,22 @@ namespace LinBox
 	 */
 	inline ZeroOne<GF2>::Iterator ZeroOne<GF2>::Begin()
 	{
-		return Iterator( 0, _field.one );
+		return Iterator( 0, field().one );
 	}
 
 	inline ZeroOne<GF2>::Iterator ZeroOne<GF2>::End()
 	{
-		return Iterator( _nnz, _field.one );
+		return Iterator( _nnz, field().one );
 	}
 
 	inline const ZeroOne<GF2>::Iterator ZeroOne<GF2>::Begin() const
 	{
-		return Iterator(0, _field.one );
+		return Iterator(0, field().one );
 	}
 
 	inline const ZeroOne<GF2>::Iterator ZeroOne<GF2>::End() const
 	{
-		return Iterator(_nnz, _field.one );
+		return Iterator(_nnz, field().one );
 	}
 
 	/*! IndexIterator.
@@ -398,10 +399,10 @@ namespace LinBox
 
 
 // Specialization of getentry
-#include "linbox/solutions/getentry.h"
+#include "linbox/solutions/solution-tags.h"
 namespace LinBox
 {
-	template<> struct GetEntryCategory<ZeroOne<GF2> > { typedef GetEntryTags::Local Tag; };
+	template<> struct GetEntryCategory<ZeroOne<GF2> > { typedef SolutionTags::Local Tag; };
 	} // end of namespace LinBox
 
 #endif //__LINBOX_zo_gf2_INL
diff --git a/linbox/blackbox/zo.h b/linbox/blackbox/zo.h
index 8f3300a..fbeb373 100644
--- a/linbox/blackbox/zo.h
+++ b/linbox/blackbox/zo.h
@@ -2,20 +2,20 @@
  * Copyright (c) LinBox
  * by Hui Wang, assisted by bds
  * ------------------------------------
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -34,10 +34,10 @@
 
 
 #include "linbox/integer.h"
-//#include "linbox/vector/vector-traits.h"
 #include "linbox/util/debug.h"
+#include "linbox/matrix/matrix-category.h"
 #include "linbox/util/matrix-stream.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 #include "linbox/blackbox/blackbox-interface.h"
 #include "linbox/blackbox/quad-matrix.h"
 
@@ -50,7 +50,7 @@
 
 namespace LinBox
 {
-	bool revLexLess(const std::pair<size_t,size_t>& a, const std::pair<size_t,size_t> b)
+	bool revLexLess(const std::pair<size_t,size_t>& a, const std::pair<size_t,size_t> & b)
 	{ return a.second < b.second || (b.second == a.second && a.first < b.first); }
 
 	/** \brief Time and space efficient representation of sparse {0,1}-matrices.
@@ -86,13 +86,15 @@ namespace LinBox
 
 		// basic constructor, can be used with subsequent read.
 		ZeroOne(const Field& F) :
-		       	_field(F), sorted(true)
+			_field(&F)
+			,_rowdim(0),_coldim(0)
+			, sorted(true)
 		{}
 
 		// constructor for use by ZOQuad.  Needs work.
 		ZeroOne (const Field& F, IndexVector& index, PointerVector& indexP,
 			 Index Rowdim, Index Coldim, bool sortedBy) :
-			_field(F), _index(index), _indexP(indexP),
+			_field(&F), _index(index), _indexP(indexP),
 			_rowdim(Rowdim), _coldim(Coldim), sorted(sortedBy)
 		{
 			std::ptrdiff_t diff = _index.begin() - index.begin();
@@ -115,7 +117,7 @@ namespace LinBox
 		  */
 		ZeroOne
 		(Field& F, Index* rowP, Index* colP, Index rows, Index cols, Index NNz) :
-			_field(F), _rowdim(rows), _coldim(cols), sorted(true)
+			_field(&F), _rowdim(rows), _coldim(cols), sorted(true)
 		{
 			std::vector<std::pair<Index, Index> > indexPairs;
 			for (Index i = 0; i < NNz; ++i, ++rowP, ++colP)
@@ -205,13 +207,13 @@ namespace LinBox
 
 			std::vector<std::pair<Index, Index> >::iterator q = ip.begin();
 			Index i = q->first;
-			p++;q++; //start from the second place
+			++p;++q; //start from the second place
 
 			for (; q != ip.end(); ++q, ++p)
 				if (i != q->first)
 				{
-					//for (Index j = i; j < (q+1)->first; j++)//difference may be more than 1
-					for (Index j = i; j < q->first; j++)//difference may be more than 1
+					//for (Index j = i; j < (q+1)->first; ++j)//difference may be more than 1
+					for (Index j = i; j < q->first; ++j)//difference may be more than 1
 						_indexP.push_back(p);
 					i = q->first; //we should change i after the for loop, otherwise the
 					//for loop will not run at all
@@ -232,12 +234,12 @@ namespace LinBox
 
 			q =ip.begin();
 			i = q->second;
-			p++;q++;
+			++p;++q;
 
 			for ( ; q != ip.end(); ++q, ++p)
 			if (i != q->second)
 			{
-			for (Index j = i; j < (q+1)->second; j++)
+			for (Index j = i; j < (q+1)->second; ++j)
 			_colP.push_back(p);
 			i = q->second;
 			}
@@ -301,7 +303,7 @@ namespace LinBox
 			std::vector<std::pair<Index, Index> > indexPairs;
 			Index r, c;
 			Element v;
-			MatrixStream<Field> S(_field, is);
+			MatrixStream<Field> S(field(), is);
 			long count = 0;
 
 			// /*
@@ -325,7 +327,6 @@ namespace LinBox
 			   */
 			std::cout << " -- read: " << count << std::endl;
 
-			//S.getRows(_rowdim); S.getColumns(_coldim);
 			init(indexPairs);
 			return is;
 		}
@@ -339,7 +340,7 @@ namespace LinBox
 		}
 
 		const Field& field() const
-		{ return _field; }
+		{ return *_field; }
 
 		/* Non blackbox function.  Tells the number of nonzero entries
 		*/
@@ -351,7 +352,7 @@ namespace LinBox
 
 	protected:
 
-		Field _field; // The field used by this class
+		const Field *_field; // The field used by this class
 
 		/* _indexP is a pointer to an array of row indexes.  _colP is a pointer
 		 * to an array of column indexes. These two are the other arrays of a
@@ -399,11 +400,10 @@ namespace LinBox
 #endif // __LINBOX_zero_one_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/blackbox/zo.inl b/linbox/blackbox/zo.inl
index 0cf73a4..061accc 100644
--- a/linbox/blackbox/zo.inl
+++ b/linbox/blackbox/zo.inl
@@ -6,20 +6,20 @@
  * Modified by Zhendong Wan, -bds
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -67,7 +67,7 @@ namespace LinBox
 
 		linbox_check((y.size()==rowdim())&&(x.size()==coldim()));
 
-		FieldAXPY<Field> accum (_field);
+		FieldAXPY<Field> accum (field());
 
 		typename OutVector::iterator yp;
 		typename InVector::const_iterator xp;
@@ -106,7 +106,7 @@ namespace LinBox
 			for(jp = *ip; jp !=*(ip + 1); ++jp)
 			{
 				//std::cout << jp - _index.begin() << endl;
-				accum.accumulate_special( *(xp + *jp) );
+				accum.accumulate_special( *(xp + (ptrdiff_t)*jp) );
 			}
 			//std::cout << " accumulate is done for one iteration " << endl;
 			//std::cout << " before accum.get " << yp - y.begin() << endl;
@@ -139,7 +139,7 @@ namespace LinBox
 	   {
 	   linbox_check((y.size()==coldim())&&(x.size()==rowdim()));
 
-	   FieldAXPY<Field> accum (_field);
+	   FieldAXPY<Field> accum (field());
 
 	   typename OutVector::iterator yp;
 	   typename InVector::const_iterator xp;
@@ -169,7 +169,7 @@ namespace LinBox
 	{
 		linbox_check((y.size()==coldim())&&(x.size()==rowdim()));
 
-		FieldAXPY<Field> accum (_field);
+		FieldAXPY<Field> accum (field());
 
 		typename OutVector::iterator yp;
 		typename InVector::const_iterator xp;
@@ -190,7 +190,7 @@ namespace LinBox
 		for(ip = _indexP.begin(); ip < _indexP.end()-1; ++ip, ++yp)
 		{
 			for(jp = *ip; jp <*(ip + 1); ++jp)
-				accum.accumulate_special( *(xp + *jp) );
+				accum.accumulate_special( *(xp +(ptrdiff_t) *jp) );
 			accum.get(*yp);
 			accum.reset();
 		}
diff --git a/linbox/blackbox/zoi.inl b/linbox/blackbox/zoi.inl
new file mode 100644
index 0000000..1d854ef
--- /dev/null
+++ b/linbox/blackbox/zoi.inl
@@ -0,0 +1,244 @@
+/* linbox/blackbox/nag-sparse.h
+ * Copyright (C) 2002 Rich Seagraves
+ *
+ * Written by Rich Seagraves <seagrave at cis.udel.edu>
+ * Modified by Zhendong Wan, -bds
+ * ------------------------------------
+ *
+ * 
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ * 
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This 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
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_bb_zoi_INL
+#define __LINBOX_bb_zoi_INL
+
+#if 0
+#ifndef _ZOI_OUTERLOOP_CHUNK_SIZE
+#include "test-zo-openmp-chunksize.h" // BB: where is this file ?
+#endif
+#endif
+
+namespace LinBox
+{
+
+	/*
+	// for GF(310), apply to packvec will do adds with periodic normalizations
+	template<>
+	template<Field>
+	Packvec<typename Field::Accumulator>& ZeroOne<Field>::apply<Packvec<typename Field::Accumulator>, Packvec<typename Field::Accumulator> >
+	(Pacvec<typename Field::Accumulator>& y,
+	Pacvec<typename Field::Accumulator>& x)
+	{	return y; }
+
+	// more stuff for paley graphs
+	template<class OutVector, class InVector>
+	template<>
+	OutVector & ZeroOne<Special3_10Field>::apply(OutVector & y, const InVector & x) const
+	{
+	typedef Special3_10Field Field;
+	typedef typename Packvec<Field::Accumulator> Vector;
+	Vector xx, yy;
+	field().convert(xx, x);
+	apply(yy, xx);
+	field().convert(y, yy);
+	}
+	*/
+
+	template<class Field>
+	template<class OutVector, class InVector>
+	OutVector & ZeroOne<Field>::apply(OutVector & y, const InVector & x) const
+	//OutVector & ZeroOne<Field>::apply(OutVector & y, const InVector & x)
+	{
+
+		//std::cout << endl;
+		//std::cout << " new apply pass " << endl;
+		//std::cout << this->rowdim() << " " << this->coldim() << endl;
+		//std::cout << " inside apply " << endl;
+		//std::cout << x.size() << " " << y.size() << endl;
+
+		linbox_check((y.size()==rowdim())&&(x.size()==coldim()));
+
+		typename OutVector::iterator yp;
+		typename InVector::const_iterator xp;
+		//PointerVector::const_iterator ip;
+		int i; // for index version of loop suitable for openMP
+		int ilimit; // for index version of loop suitable for openMP
+		IndexVector::const_iterator jp;
+
+
+		//std::cout << " before sorting " << endl;
+
+		if( !sorted )
+		{
+			//std::cout << " -- apply: switch sort (" << _rowdim << ", " << _coldim << ", " << nnz() << ", " << sorted << " " << &(this->sorted) << ") -- " << std::endl;
+			switch_sort();
+			//std::cout << " -- apply: switch sort (" << _rowdim << ", " << _coldim << ", " << nnz() << ", " << sorted << ") -- " << std::endl;
+		}
+		//std::cout << " -- zo apply: " << this << "(" << _rowdim << ", " << _coldim << ", " << nnz() << ")" << std::endl;
+
+		xp=x.begin();
+		yp=y.begin();
+		//    accum.reset();
+
+
+		// outer loop to parallelize
+
+		//  Timer timer;
+		//  timer.start();
+		ilimit = _indexP.size() -1;
+		//  std::cout << std::endl << "Using ilimit: " << ilimit << std::endl;
+
+
+#ifdef _RUNOPENMP
+		//     std:: cout<< "_ZOI_OUTERLOOP_CHUNK_SIZE is:" << _ZOI_OUTERLOOP_CHUNK_SIZE << std:: endl;
+		//  std::cout<<"number of threads is " << omp_get_num_threads() << std ::endl;
+#pragma omp parallel
+		{
+#pragma omp for firstprivate(xp, ilimit) private(jp, i) schedule(static, _ZOI_OUTERLOOP_CHUNK_SIZE)
+#endif
+
+			for(i = 0; i < ilimit; ++i)
+
+				//for(i = 0; i < _indexP.size()-1; ++i)
+				//for(ip = _indexP.begin(); ip !=_indexP.end()-1; ++ip, ++yp)
+			{
+
+				FieldAXPY<Field> accum (field());
+
+#ifdef _RUNOPENMP
+				//#pragma omp critical
+				//	{
+				//	  if (i%5000==0)
+				//	    std::cout<< ":i/thread no.:" << i << ":" << omp_get_thread_num() << std::endl;
+				//	}
+#endif
+
+				for(jp = _indexP[i]; jp !=_indexP[i+1]; ++jp)
+				{
+					//std::cout << jp - _index.begin() << endl;
+
+					accum.accumulate_special( *(xp + *jp) );
+
+				}
+
+				//std::cout << " accumulate is done for one iteration " << endl;
+				//std::cout << " before accum.get " << yp - y.begin() << endl;
+				accum.get(y[i]);
+				//std::cout << " before accum.reset " << endl;
+				//	        accum.reset();
+			}
+#ifdef _RUNOPENMP
+		}
+#endif
+
+		// timer.stop();
+
+		// std::cout << "time:" << timer << std::endl;
+		// std::cout << "user/sys/real/threads/chunksize:" << timer.usertime() << "/" <<
+		// timer.systime() << "/" << timer.realtime() <<
+		// "/" << omp_get_max_threads() << "/" << _ZOI_OUTERLOOP_CHUNK_SIZE << std::endl;
+
+		return y;
+	}
+
+	/* if you want to keep two copies for the matrix, one of which is sorted by row,
+	 * the other by column, then you want to use this applyTranspose function. In
+	 * this case, un-comment this one and comment out the applyTranspose further down
+	 */
+	/*
+	   template<class Field>
+	   template<class OutVector, class InVector>
+	   OutVector & ZeroOne<Field>::applyTranspose(OutVector & y, const InVector & x) const
+	   {
+	   linbox_check((y.size()==coldim())&&(x.size()==rowdim()));
+
+	   FieldAXPY<Field> accum (field());
+
+	   typename OutVector::iterator yp;
+	   typename InVector::const_iterator xp;
+	   PointerVector::const_iterator ip;
+	   IndexVector::const_iterator jp;
+
+	   xp=x.begin();
+	   yp=y.begin();
+	   accum.reset();
+
+	   for(ip = _colP.begin(); ip < _colP.end()-1; ++ip, ++yp)
+	   {
+	   for(jp = *ip; jp <*(ip + 1); ++jp)
+	   accum.accumulate_special( *(xp + *jp) );
+	   accum.get(*yp);
+	   accum.reset();
+	   }
+
+	   return y;
+
+	   }
+	   */
+
+	template<class Field>
+	template<class OutVector, class InVector>
+	OutVector & ZeroOne<Field>::applyTranspose(OutVector & y, const InVector & x) const
+	{
+		linbox_check((y.size()==coldim())&&(x.size()==rowdim()));
+
+		FieldAXPY<Field> accum (field());
+
+		typename OutVector::iterator yp;
+		typename InVector::const_iterator xp;
+		PointerVector::const_iterator ip;
+		IndexVector::const_iterator jp;
+
+		xp=x.begin();
+		yp=y.begin();
+		accum.reset();
+
+		if( sorted )
+			//{
+			//std::cout << " -- in apply transpose, before switch sort -- " << std::endl;
+			switch_sort();
+		//std::cout << " -- in apply transpose, after switch sort -- " << std::endl;
+		//}
+
+		for(ip = _indexP.begin(); ip < _indexP.end()-1; ++ip, ++yp)
+		{
+			for(jp = *ip; jp <*(ip + 1); ++jp)
+				accum.accumulate_special( *(xp + *jp) );
+			accum.get(*yp);
+			accum.reset();
+		}
+		return y;
+	}
+
+}//End of LinBox
+
+//#undef _ZOI_OUTERLOOP_CHUNK_SIZE
+
+#endif //__LINBOX_bb_zoi_INL
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/element/Makefile.in b/linbox/element/Makefile.in
deleted file mode 100644
index c926d64..0000000
--- a/linbox/element/Makefile.in
+++ /dev/null
@@ -1,582 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/element
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-#/
-pkgincludesubdir = $(pkgincludedir)/element
-EXTRA_DIST = \
-	element.doxy
-
-pkgincludesub_HEADERS = \
-	abstract.h			\
-	archetype.h			\
-	envelope.h			\
-	gmp-rational.h
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/element/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps linbox/element/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
-	done
-
-uninstall-pkgincludesubHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
-	for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool ctags distclean distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-pkgincludesubHEADERS install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Copyright (c) 2010 the LinBox group
-# This file is part of LinBox
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
- LinBox is free software: you can redistribute it and/or modify
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/element/abstract.h b/linbox/element/abstract.h
index b1aa86f..5f96f41 100644
--- a/linbox/element/abstract.h
+++ b/linbox/element/abstract.h
@@ -77,11 +77,10 @@ namespace LinBox
 
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/element/envelope.h b/linbox/element/envelope.h
index e8838ff..6b61eee 100644
--- a/linbox/element/envelope.h
+++ b/linbox/element/envelope.h
@@ -114,11 +114,10 @@ namespace LinBox
 #endif // __LINBOX_element_envelope_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/field/Givaro/Makefile.am b/linbox/field/Givaro/Makefile.am
deleted file mode 100644
index 9065a7b..0000000
--- a/linbox/field/Givaro/Makefile.am
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-
-
-pkgincludesubdir=$(pkgincludedir)/field/Givaro
-
-GIVARO_HDRS =           \
-    givaro-zpz.h        \
-    givaro-montg.h      \
-    givaro-zpz.inl      \
-    givaro-gfq.h        \
-    givaro-extension.h  \
-    givaro-field.h      \
-    givaro-field-gf2.h  \
-    givaro-rational.h
-
-if LINBOX_HAVE_GIVARO
-USE_GIVARO_HDRS = $(GIVARO_HDRS)
-endif
-
-pkgincludesub_HEADERS =     \
-    $(USE_GIVARO_HDRS)
-
-#  EXTRA_DIST =            \
-    #  givaro.doxy
diff --git a/linbox/field/Givaro/Makefile.in b/linbox/field/Givaro/Makefile.in
deleted file mode 100644
index e270249..0000000
--- a/linbox/field/Givaro/Makefile.in
+++ /dev/null
@@ -1,591 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/field/Givaro
-DIST_COMMON = $(am__pkgincludesub_HEADERS_DIST) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__pkgincludesub_HEADERS_DIST = givaro-zpz.h givaro-montg.h \
-	givaro-zpz.inl givaro-gfq.h givaro-extension.h givaro-field.h \
-	givaro-field-gf2.h givaro-rational.h
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/field/Givaro
-GIVARO_HDRS = \
-    givaro-zpz.h        \
-    givaro-montg.h      \
-    givaro-zpz.inl      \
-    givaro-gfq.h        \
-    givaro-extension.h  \
-    givaro-field.h      \
-    givaro-field-gf2.h  \
-    givaro-rational.h
-
- at LINBOX_HAVE_GIVARO_TRUE@USE_GIVARO_HDRS = $(GIVARO_HDRS)
-pkgincludesub_HEADERS = \
-    $(USE_GIVARO_HDRS)
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/field/Givaro/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps linbox/field/Givaro/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
-	done
-
-uninstall-pkgincludesubHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
-	for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool ctags distclean distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-pkgincludesubHEADERS install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-#  EXTRA_DIST =            \
-#    #  givaro.doxy
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/field/Givaro/givaro-extension.h b/linbox/field/Givaro/givaro-extension.h
deleted file mode 100644
index 2031d19..0000000
--- a/linbox/field/Givaro/givaro-extension.h
+++ /dev/null
@@ -1,321 +0,0 @@
-/* linbox/field/givaro-gfq.h
- * Copyright (C) 2005 JGD
- *
- * Time-stamp: <22 Jun 10 10:02:34 Jean-Guillaume.Dumas at imag.fr>
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-/*! @file field/Givaro/givaro-extension.h
- * @ingroup field
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_field_givaro_extension_H
-#define __LINBOX_field_givaro_extension_H
-
-
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/util/debug.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/field/Givaro/givaro-gfq.h"
-
-#ifdef __LINBOX_XMLENABLED
-
-#include "linbox/util/xml/linbox-reader.h"
-#include "linbox/util/xml/linbox-writer.h"
-
-#include <iostream>
-#include <string>
-#include <vector>
-
-#endif //__LINBOX_XMLENABLED
-
-//---------------------------------------------
-// Files of Givaro library
-#include <givaro/givextension.h>
-#include <givaro/giv_randiter.h>
-//---------------------------------------------
-// To convert linbox fields to Givaro interface
-#include "linbox/field/Givaro/givaro-field.h"
-
-//---------------------------------------------
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	template< class BaseField>
-	class GivaroExtension;
-
-// #if !defined(__INTEL_COMPILER) && !defined(__CUDACC__) && !defined(__clang__)
-	// template<>
-// #endif
-	template< class BaseField>
-	struct ClassifyRing<GivaroExtension<BaseField> > {
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-// #if !defined(__INTEL_COMPILER) && !defined(__CUDACC__) && !defined(__clang__)
-	// template<>
-// #endif
-	template< class BaseField>
-	struct FieldTraits< GivaroExtension<BaseField> > {
-		typedef RingCategories::ModularTag categoryTag;
-
-		static integer& maxModulus( integer& i )
-		{
-			return  FieldTraits<BaseField>::maxModulus(i);
-		}
-
-		static bool goodModulus( const integer& i )
-		{
-			return  FieldTraits<BaseField>::goodModulus(i);
-		}
-
-		// After that degree might not be correct ...
-		static integer& maxExponent( integer& i )
-		{
-			return i = 2147483648UL;
-		}
-		static bool goodExponent( const integer& i )
-		{
-			integer max;
-			return ( i >= 1 && i <= maxExponent( max ) );
-		}
-	};
-
-
-	/** This template class is defined to be in phase with the LinBox
-	 *  archetype.
-	 *  Most of all methods are inherited from Extension  class
-	 *  of Givaro.
-	 *  These class allow to construct only extension field with a prime characteristic.
-	 */
-	template< class BaseField = LinBox::GivaroGfq>
-	class GivaroExtension : public Givaro::Extension<GivaroField<BaseField> >, public FieldInterface {
-
-		typedef GivaroExtension<GivaroField<BaseField> > Self_t;
-		typedef Givaro::Extension<GivaroField<BaseField> >       Extension_t;
-	public:
-		/** Element type.
-		 *  This type is inherited from the Givaro class Extension
-		 */
-		typedef typename Givaro::Extension<GivaroField<BaseField> >::Element Element;
-
-		typedef Givaro::             Extension<GivaroField<BaseField> > Father_t;
-
-		using Extension_t::zero;
-		using Extension_t::one;
-		using Extension_t::mOne;
-
-		/** RandIter type.
-		 *  This type is inherited from the Givaro class GFqDom<TAG>
-		 */
-		typedef Givaro::GIV_ExtensionrandIter< Givaro::Extension<GivaroField<BaseField> >, LinBox::integer >  RandIter;
-
-
-		GivaroExtension()
-		{}
-
-
-		/** Constructor from an integer.
-		*/
-		GivaroExtension(const integer& p, const integer& k=1) :
-		 Givaro::Extension<GivaroField<BaseField> >(static_cast<typename Givaro::Extension< GivaroField< BaseField > >::Residu_t >(int32_t(p)), static_cast<typename Givaro::Extension< GivaroField< BaseField > >::Residu_t>(int32_t(k)))
-		{
-		}
-
-		/** Constructor extension of a base field.
-		*/
-		GivaroExtension(const BaseField& bF, const integer& ext=1) :
-		 Givaro::Extension<GivaroField<BaseField> >( GivaroField<BaseField>(bF),
-								      static_cast<typename Givaro::Extension< GivaroField< BaseField > >::Residu_t>(int32_t(ext)))
-		{
-		}
-
-
-		/** Copy Constructor
-		*/
-		GivaroExtension(const Self_t& F) :
-		 Givaro::Extension<GivaroField<BaseField> >(F) {
-			}
-
-
-		using Givaro::Extension<GivaroField<BaseField> >::               characteristic ;
-#if (GIVARO_VERSION<30403)
-		long unsigned int & characteristic(long unsigned int & c) const
-		{
-			return  c = (long unsigned)Givaro::Extension<GivaroField<BaseField> >::characteristic() ;
-		}
-#else
-		long unsigned int & characteristic(long unsigned int & c) const
-		{
-			return  Givaro::Extension<GivaroField<BaseField> >::characteristic(c) ;
-		}
-#endif
-
-	}; // class GivaroExtension
-
-
-
-	/** This template class is define just to be in phase with the LinBox
-	 *  archetype.
-	 *  Most of all methods are inherited from Extension  class
-	 *  of Givaro.
-	 *  these class allow to construct only extension field with a prime characteristic.
-	 */
-// #ifndef __INTEL_COMPILER
-	template<>
-// #endif
-	class GivaroExtension<LinBox::GivaroGfq> : public Givaro::Extension< Givaro::GFqDom<int32_t> >, public FieldInterface {
-
-		typedef GivaroExtension<GivaroGfq> Self_t;
-		typedef Givaro::Extension< Givaro::GFqDom<int32_t>  >       Extension_t;
-	public:
-
-		/** Element type.
-		 *  This type is inherited from the Givaro class Extension
-		 */
-		typedef Givaro::Extension< Givaro::GFqDom<int32_t> >::Element Element;
-		typedef Givaro::Extension< Givaro::GFqDom<int32_t> > Father_t;
-
-		using Extension_t::zero;
-		using Extension_t::one;
-		using Extension_t::mOne;
-
-
-		/** RandIter type.
-		 *  This type is inherited from the Givaro class GFqDom<TAG>
-		 */
-		typedef Givaro::GIV_ExtensionrandIter< Givaro::Extension< Givaro::GFqDom<int32_t> >, LinBox::integer >  RandIter;
-
-		/** Constructor from an integer.
-		*/
-		GivaroExtension(const integer& p, const integer& k=1) :
-		 Givaro::Extension< Givaro::GFqDom<int32_t> >(static_cast< Givaro::Extension< Givaro::GFqDom<int32_t> >::Residu_t>(int32_t(p)),
-						  static_cast< Givaro::Extension< Givaro::GFqDom<int32_t> >::Residu_t>(int32_t(k)))
-		{
-		}
-
-		/** Constructor extension of a base field.
-		*/
-		GivaroExtension(const GivaroGfq& bF, const integer& ext=1) :
-		 Givaro::Extension< Givaro::GFqDom<int32_t> >( static_cast< const Givaro::Extension< Givaro::GFqDom< int32_t > >::BaseField_t &>(bF),
-						   static_cast< Givaro::Extension< Givaro::GFqDom<int32_t> >::Residu_t >(int32_t(ext)))
-		{
-		}
-
-
-		/** Copy Constructor.
-		*/
-		GivaroExtension(const Self_t& F) :
-		 Givaro::Extension< Givaro::GFqDom<int32_t> >(F)
-		{ }
-
-
-	}; // class GivaroExtension
-
-
-
-} // namespace LinBox
-
-
-
-// Specialization of homomorphism for basefield
-#include "linbox/field/hom.h"
-namespace LinBox
-{
-	///  NO DOC
-	template< class BaseField>
-	class Hom < BaseField, GivaroExtension<BaseField> > {
-		typedef BaseField Source;
-		typedef GivaroExtension<BaseField> Target;
-	public:
-		typedef typename Source::Element SrcElt;
-		typedef typename Target::Element Elt;
-
-		//Hom(){}
-		/** Constructor.
-		 * Construct a homomorphism from a specific source ring S and target
-		 * field T with Hom(S, T).  The default behaviour is error.
-		 * Specializations define all actual homomorphisms.
-		 */
-		Hom(const Source& S, const Target& T) :
-			_source(S), _target(T)
-		{}
-
-		/** Image.
-		 * image(t, s) implements the homomorphism, assigning the
-		 * t the value of the image of s under the mapping.
-		 *
-		 * The default behaviour is a no-op.
-		 */
-		Elt& image(Elt& t, const SrcElt& s) const
-		{
-			return _target.assign(t, s);
-		}
-
-		/** Preimage.
-		 * If possible, preimage(s,t) assigns a value to s such that
-		 * the image of s is t.  Otherwise behaviour is unspecified.
-		 * An error may be thrown, a conventional value may be set, or
-		 * an arb value set.
-		 *
-		 * The default behaviour is a no-op.
-		 */
-		SrcElt& preimage(SrcElt& s, const Elt& t) const
-		{
-			//                     return _target.getEntry(s, Degree(0), t);
-			return _target.convert(s, t);
-		}
-
-		const Source& source() const
-		{
-			return _source;
-		}
-		const Target& target() const
-		{
-			return _target;
-		}
-
-	private:
-		Source _source;
-		Target _target;
-	}; // end Hom
-}
-#endif // __LINBOX_field_givaro_extension_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Givaro/givaro-field-gf2.h b/linbox/field/Givaro/givaro-field-gf2.h
deleted file mode 100644
index 750f808..0000000
--- a/linbox/field/Givaro/givaro-field-gf2.h
+++ /dev/null
@@ -1,218 +0,0 @@
-/* linbox/field/givaro-field.h
- * Copyright (C) 2009 JGD
- *
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_givaro_field_gf2_H
-#define __LINBOX_givaro_field_gf2_H
-
-#include "linbox/field/gf2.h"
-#include "linbox/field/Givaro/givaro-field.h"
-
-// Specialization of GivaroField for GF2
-namespace LinBox
-{
-
-	/**
-	  \brief give LinBox fields an allure of Givaro Fields
-	  \ingroup field
-
-	 *  This class adds the necessary requirements allowing
-	 *  the construction of an extension of a LinBox field.
-	 */
-	template<>
-	struct GivaroField<LinBox::GF2> : public LinBox::GF2 {
-		typedef LinBox::GF2 BaseField;
-		typedef BaseField::Element TT;
-		typedef Signed_Trait<TT>::unsigned_type UTT;
-		typedef TT Rep;
-		typedef GivaroField<BaseField> Self_t;
-		typedef Rep Element;
-		typedef UTT Residu_t;
-
-		Element zero, one;
-		GivaroField(const BaseField& bf) :
-			BaseField(bf)
-		{
-			this->init(zero,0UL);
-			this->init(one, 1UL);
-		}
-
-
-		// -- amxy: r <- c - a * b mod p
-		Rep& amxy (Rep& r, const Rep a, const Rep b, const Rep c) const
-		{
-			Rep tmp;
-			this->mul(tmp, a, b);
-			this->assign(r,c);
-			return this->subin(r,tmp);
-		}
-		stdBitReference amxy (stdBitReference r, const Rep a, const Rep b, const Rep c) const
-		{
-			Rep tmp;
-			this->mul(tmp, a, b);
-			this->assign(r,c);
-			return this->subin(r,tmp);
-		}
-
-
-		// -- maxpy: r <- y - a * x
-		Rep& maxpy (Rep& r, const Rep a, const Rep x, const Rep y) const
-		{
-			Rep tmp; this->mul(tmp, a, x);
-			return this->sub(r,y,tmp);
-		}
-		stdBitReference maxpy (stdBitReference r, const Rep a, const Rep x, const Rep y) const
-		{
-			Rep tmp; this->mul(tmp, a, x);
-			return this->sub(r,y,tmp);
-		}
-		// -- axmyin: r <-  a * x - r
-		Rep& axmyin (Rep& r, const Rep a, const Rep x) const
-		{
-			maxpyin(r,a,x);
-			return negin(r);
-		}
-		stdBitReference axmyin (stdBitReference r, const Rep a, const Rep x) const
-		{
-			maxpyin(r,a,x);
-			return negin(r);
-		}
-		// -- maxpyin: r <- r - a * x
-		Rep& maxpyin (Rep& r, const Rep a, const Rep x) const
-		{
-			Rep tmp; this->mul(tmp, a, x);
-			return this->subin(r,tmp);
-		}
-		stdBitReference maxpyin (stdBitReference r, const Rep a, const Rep x) const
-		{
-			Rep tmp; this->mul(tmp, a, x);
-			return this->subin(r,tmp);
-		}
-
-
-
-		bool areNEqual ( const Rep a, const Rep b) const
-		{
-			return ! this->areEqual(a,b);
-		}
-
-		// Access to the modulus, characteristic, size, exponent
-		UTT residu() const
-		{
-			integer c;
-			BaseField::characteristic(c);
-			return UTT(c);
-		}
-
-		UTT characteristic() const
-		{
-			integer c; BaseField::characteristic(c); return UTT(c);
-		}
-		UTT cardinality() const
-		{
-			integer c; BaseField::cardinality(c); return UTT(c);
-		}
-		UTT exponent() const
-		{
-			return 1;
-		}
-		UTT size() const
-		{
-			integer c;
-			BaseField::cardinality(c);
-			return UTT(c);
-		}
-
-
-		// ----- random generators
-		template<class RandIter> Rep& random(RandIter& g, Rep& r) const
-		{
-			return r = g() ;
-		}
-		template<class RandIter> Rep& random(RandIter& g, Rep& r, long s) const
-		{
-			return r = g() ;
-		}
-		template<class RandIter> Rep& random(RandIter& g, Rep& r, const Rep& b) const
-		{
-			return r = g() ;
-		}
-		template<class RandIter> Rep& nonzerorandom(RandIter& g, Rep& r) const
-		{
-			return r = g() ;
-		}
-		template<class RandIter> Rep& nonzerorandom(RandIter& g, Rep& r, long s) const
-		{
-			return r = g() ;
-		}
-		template<class RandIter> Rep& nonzerorandom(RandIter& g, Rep& r, const Rep& b) const
-		{
-			return r = g() ;
-		}
-
-		template<class RandIter> stdBitReference random(RandIter& g, stdBitReference r) const
-		{
-			return r = g() ;
-		}
-		template<class RandIter> stdBitReference random(RandIter& g, stdBitReference r, long s) const
-		{
-			return r = g() ;
-		}
-		template<class RandIter> stdBitReference random(RandIter& g, stdBitReference r, const stdBitReference b) const
-		{
-			return r = g() ;
-		}
-		template<class RandIter> stdBitReference nonzerorandom(RandIter& g, stdBitReference r) const
-		{
-			return r = g() ;
-		}
-		template<class RandIter> stdBitReference nonzerorandom(RandIter& g, stdBitReference r, long s) const
-		{
-			return r = g() ;
-		}
-		template<class RandIter> stdBitReference nonzerorandom(RandIter& g, stdBitReference r, const Rep& b) const
-		{
-			return r = g() ;
-		}
-		template<class RandIter> stdBitReference nonzerorandom(RandIter& g, stdBitReference r, const stdBitReference b) const
-		{
-			return r = g() ;
-		}
-
-	};
-
-}
-
-#endif // __LINBOX_givaro_field_gf2_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Givaro/givaro-field.h b/linbox/field/Givaro/givaro-field.h
deleted file mode 100644
index e911211..0000000
--- a/linbox/field/Givaro/givaro-field.h
+++ /dev/null
@@ -1,200 +0,0 @@
-/* linbox/field/givaro-field.h
- * Copyright (C) 2009 JGD
- *
- * ------------------------------------
- *
- * 
- * ========LICENCE========
- * This file is part of the library LinBox.
- * 
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This 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
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_givaro_field_H
-#define __LINBOX_givaro_field_H
-
-#include <givaro/givconfig.h>
-#include "linbox/integer.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/field/field-interface.h"
-
-namespace LinBox
-{
-
-	/**
-	  \brief give LinBox fields an allure of Givaro Fields
-	  \ingroup field
-
-	 *  This class adds the necessary requirements allowing
-	 *  the construction of an extension of a LinBox field
-	 *  or a givaro polynomial of a LinBox field ...
-	 */
-	template< class BaseField >
-	struct GivaroField : public BaseField {
-		typedef typename BaseField::Element TT;
-		typedef typename Signed_Trait<TT>::unsigned_type UTT;
-		typedef TT Rep;
-		typedef GivaroField<BaseField> Self_t;
-		typedef Rep Element;
-		typedef UTT Residu_t;
-
-		Element zero, one, mOne;
-		GivaroField() :
-			BaseField()
-		{
-			this->init(zero,0UL);
-			this->init(one, 1UL);
-			this->init(mOne);
-			this->neg(mOne,one);
-		}
-
-		GivaroField(const BaseField& bf) :
-			BaseField(bf)
-		{
-			this->init(zero,0UL);
-			this->init(one, 1UL);
-			this->init(mOne);
-			this->neg(mOne,one);
-			// neg(init(mOne),one);
-		}
-
-
-		// -- axmy: r <- a * x - y
-		Rep& axmy (Rep& r, const Rep a, const Rep x, const Rep y) const
-		{
-			Rep tmp; this->mul(tmp, a, x);
-			return this->sub(r,tmp,y);
-		}
-
-		// -- maxpy: r <- y - a * x
-		Rep& maxpy (Rep& r, const Rep a, const Rep x, const Rep y) const
-		{
-			Rep tmp; this->mul(tmp, a, x);
-			return this->sub(r,y,tmp);
-		}
-
-		// -- axmyin: r <-  a * x - r
-		Rep& axmyin (Rep& r, const Rep a, const Rep x) const
-		{
-			maxpyin(r,a,x);
-			return negin(r);
-		}
-
-		// -- maxpyin: r <- r - a * x
-		Rep& maxpyin (Rep& r, const Rep a, const Rep x) const
-		{
-			Rep tmp; this->mul(tmp, a, x);
-			return this->subin(r,tmp);
-		}
-
-		bool areNEqual ( const Rep a, const Rep b) const
-		{
-			return ! this->areEqual(a,b);
-		}
-
-		// Access to the modulus, characteristic, size, exponent
-		UTT residu() const
-		{
-			integer c;
-			BaseField::characteristic(c);
-			return UTT(c);
-		}
-
-		UTT characteristic() const
-		{
-			integer c;
-			BaseField::characteristic(c);
-			return UTT(c);
-		}
-
-		integer& characteristic(integer& i) const
-		{
-			return BaseField::characteristic(i);
-		}
-
-		UTT cardinality() const
-		{
-			integer c;
-			BaseField::cardinality(c);
-			return UTT(c);
-		}
-
-		UTT exponent() const
-		{
-			return 1;
-		}
-
-		UTT size() const
-		{
-			integer c;
-			BaseField::cardinality(c);
-			return UTT(c);
-		}
-
-
-		// ----- random generators
-		template<class RandIter> Rep& random(RandIter& g, Rep& r) const
-		{
-			return this->init(r,g()) ;
-		}
-
-		template<class RandIter> Rep& random(RandIter& g, Rep& r, long s) const
-		{
-			return this->init(r,g()) ;
-		}
-
-		template<class RandIter> Rep& random(RandIter& g, Rep& r, const Rep& b) const
-		{
-			return this->init(r,g()) ;
-		}
-
-		template<class RandIter> Rep& nonzerorandom(RandIter& g, Rep& r) const
-		{
-			do { this->init(r,g()); } while( this->isZero(r) );
-			return r;
-		}
-
-		template<class RandIter> Rep& nonzerorandom(RandIter& g, Rep& r, long s) const
-		{
-			do { this->init(r,g()); } while( this->isZero(r) );
-			return r;
-		}
-
-		template<class RandIter> Rep& nonzerorandom(RandIter& g, Rep& r, const Rep& b) const
-		{
-			do { this->init(r,g()); } while( this->isZero(r) ); return r;
-		}
-
-	};
-
-
-
-} // end namespace LinBox
-//! @bug the following line is a bug.
-#include "linbox/field/Givaro/givaro-field-gf2.h"
-
-#endif // __LINBOX_givaro_field_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Givaro/givaro-gfq.h b/linbox/field/Givaro/givaro-gfq.h
deleted file mode 100644
index 7361dff..0000000
--- a/linbox/field/Givaro/givaro-gfq.h
+++ /dev/null
@@ -1,283 +0,0 @@
-/* linbox/field/givaro-gfq.h
- * Copyright (C) 2002 Pascal Giorgi
- *
- * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- * JGD 12.06.2002 : -- I don't see the need of *(new in convert
- * JGD 19.09.2003 : added isZero
- * WJT 24.06.2005 : Removed using declarations
- *
- * ------------------------------------
- *
- * 
- * ========LICENCE========
- * This file is part of the library LinBox.
- * 
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This 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
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-/*! @file field/Givaro/givaro-gfq.h
- *
- * @warning This wrapper works only with an improved version of Givaro ;
- * This version of givaro won't be available for public yet ;
- * But it is available on my web page ;
- * You can send me a mail to get it or for others details.
- */
-
-#ifndef __LINBOX_field_givaro_gfq_H
-#define __LINBOX_field_givaro_gfq_H
-
-
-#include "linbox/linbox-config.h"
-#include "linbox/util/debug.h"
-#include "linbox/integer.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/field/field-interface.h"
-
-
-//------------------------------------
-// Files of Givaro library
-
-
-#include <givaro/givtablelimits.h>
-#include <givaro/givgfq.h>
-#include <givaro/giv_randiter.h>
-#include <givaro/givpoly1factor.h>
-//------------------------------------
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	class GivaroGfq;
-
-	template<>
-	struct ClassifyRing<GivaroGfq> {
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-
-	template<>
-	inline integer& FieldTraits<GivaroGfq>::maxModulus( integer& i )
-	{
-		return i = integer( 32749 );  // prevprime( 2^15 )
-	}
-
-	template<>
-	inline bool FieldTraits<GivaroGfq>::goodModulus( const integer& i )
-	{
-		integer max;
-		if( i < 2 || i > FieldTraits<GivaroGfq>::maxModulus(max) )
-			return false;
-		return probab_prime( i, 10 );
-	}
-
-	template<>
-	inline integer& FieldTraits<GivaroGfq>::maxExponent( integer& i )
-	{
-		return i = _GIVARO_FF_MAXEXPONENT_;  // Cardinality must be <= 2^21
-	}
-
-
-	/** Wrapper of Givaro's GFqDom<int32_t>  class.
-	  \ingroup field
-
-	 *  This class allows to construct only extension fields with a prime characteristic.
-	 */
-	class GivaroGfq : public Givaro::GFqDom<int32_t>, public FieldInterface {
-
-	public:
-
-		typedef Givaro::GFqDom<int32_t> Father_t ;
-
-		using Father_t::one ;
-		using Father_t::zero;
-		using Father_t::mOne;
-		/** Element type.
-		 *  This type is inherited from the Givaro class GFqDom<int32_t>
-		 */
-		typedef  Givaro::GFqDom<int32_t>::Rep Element;
-
-		/** RandIter type
-		 *  This type is inherited from the Givaro class GFqDom<TAG>
-		 */
-		typedef Givaro::GIV_randIter< Givaro::GFqDom<int32_t>, LinBox::integer >  RandIter;
-
-		/** Empty Constructor
-		*/
-		GivaroGfq() :
-		 Givaro::GFqDom<int32_t>()
-		{
-			// Givaro::GFqDom<int32_t>::init(one,1);
-			// Givaro::GFqDom<int32_t>::init(mOne,-1);
-			// Givaro::GFqDom<int32_t>::init(zero,0);
-		}
-
-		/** Constructor from an integer
-		 *  this constructor use the ZpzDom<TAG> constructor
-		 */
-		GivaroGfq(const integer& p, const integer& k=1) :
-		 Givaro::GFqDom<int32_t>(static_cast<UTT>(int32_t(p)), static_cast<UTT>(int32_t(k)))
-		{
-			//enforce that the cardinality must be <2^16, for givaro-gfq
-			int32_t pl=p;
-			for(int32_t i=1;i<k;++i) pl*=(int32_t)p;
-			if(!FieldTraits<GivaroGfq>::goodModulus(p)) {
-				throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus be between 2 and 2^15 and prime");
-			}
-			else if(pl>(1<<_GIVARO_FF_MAXEXPONENT_))  {
-                            std::stringstream MSGFFMAXE;
-                            MSGFFMAXE << "cardinality must be < 2^" << _GIVARO_FF_MAXEXPONENT_;       
-				throw PreconditionFailed(__func__,__FILE__,__LINE__,MSGFFMAXE.str().c_str());
-			}
-			// Givaro::GFqDom<int32_t>::init(one,1);
-			// Givaro::GFqDom<int32_t>::init(mOne,-1);
-			// Givaro::GFqDom<int32_t>::init(zero,0);
-
-		}
-
-		// This constructor takes a vector of ints that represent the polynomial
-		// to use (for modular arithmetic on the extension field).
-		GivaroGfq(const integer& p, const integer& k, const std::vector<integer>& modPoly) :
-		 Givaro::GFqDom<int32_t>(static_cast<UTT>(int32_t(p)), static_cast<UTT>(int32_t(k)), modPoly)
-		{
-		}
-
-		/** Characteristic.
-		 * Return integer representing characteristic of the domain.
-		 * Returns a positive integer to all domains with finite characteristic,
-		 * and returns 0 to signify a domain of infinite characteristic.
-		 * @return integer representing characteristic of the domain.
-		 */
-		integer& characteristic(integer& c) const
-		{
-			return c=integer(static_cast<int32_t>( Givaro::GFqDom<int32_t>::characteristic()));
-		}
-
-		int32_t characteristic() const
-		{
-			return static_cast<int32_t>( Givaro::GFqDom<int32_t>::characteristic());
-		}
-
-#if (GIVARO_VERSION<30403)
-		unsigned long characteristic(unsigned long & c) const
-		{
-			return c = static_cast<int32_t>( Givaro::GFqDom<int32_t>::characteristic());
-		}
-#else
-		unsigned long characteristic(unsigned long & c) const
-		{
-			return Givaro::GFqDom<int32_t>::characteristic(c);
-		}
-#endif
-
-		/** Cardinality.
-		 * Return integer representing cardinality of the domain.
-		 * Returns a non-negative integer for all domains with finite
-		 * cardinality, and returns -1 to signify a domain of infinite
-		 * cardinality.
-		 * @return integer representing cardinality of the domain
-		 */
-		integer& cardinality(integer& c) const
-		{
-			return c=integer(static_cast<int32_t>( Givaro::GFqDom<int32_t>::size()));
-		}
-
-
-		integer cardinality() const
-		{
-			return integer(static_cast<int32_t>( Givaro::GFqDom<int32_t>::cardinality()));
-		}
-
-
-		/** Initialization of field base Element from an integer.
-		 * Behaves like C++ allocator construct.
-		 * This function assumes the output field base Element x has already been
-		 * constructed, but that it is not already initialized.
-		 * We assume that the type of Element is short int.
-		 * this methos is just a simple cast.
-		 * @return reference to field base Element.
-		 * @param x field base Element to contain output (reference returned).
-		 * @param y integer.
-		 */
-		Element& init(Element& x , const integer& y = 0) const
-		{
-			return Givaro::GFqDom<int32_t>::init( x, int32_t(y % (integer) _q));
-		}
-
-		// TO BE OPTIMIZED
-		Element& init(Element& x , const float y) const
-		{
-			return Givaro::GFqDom<int32_t>::init( x, (double)y);
-		}
-
-		template<class YYY>
-		Element& init(Element& x , const YYY& y) const
-		{
-			return Givaro::GFqDom<int32_t>::init( x, y);
-		}
-
-		/** Conversion of field base Element to an integer.
-		 * This function assumes the output field base Element x has already been
-		 * constructed, but that it is not already initialized.
-		 * @return reference to an integer.
-		 * @param x integer to contain output (reference returned).
-		 * @param y constant field base Element.
-		 */
-		integer& convert(integer& x, const Element& y) const
-		{
-			int32_t tmp;
-			return x = integer( Givaro::GFqDom<int32_t>::convert(tmp,y));
-		}
-		// TO BE OPTIMIZED
-		float& convert(float& x, const Element& y) const
-		{
-			double tmp;
-		 Givaro::GFqDom<int32_t>::convert( tmp, y);
-			return x = (float)tmp;
-		}
-
-		template<class XXX>
-		XXX& convert(XXX& x, const Element& y) const
-		{
-			return Givaro::GFqDom<int32_t>::convert( x, y);
-		}
-
-		//bool isZero(const Element& x) const { return Givaro::GFqDom<int32_t>::isZero(x); }
-
-
-	}; // class GivaroGfq
-
-
-
-
-
-} // namespace LinBox
-
-#endif // __LINBOX_field_givaro_gfq_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Givaro/givaro-montg.h b/linbox/field/Givaro/givaro-montg.h
deleted file mode 100644
index 51d82ca..0000000
--- a/linbox/field/Givaro/givaro-montg.h
+++ /dev/null
@@ -1,207 +0,0 @@
-/* linbox/field/givaro-gfq.h
- * Copyright (C) 2004 Jean-Guillaume Dumas
- *
- * Written by Jean-Guillaume Dumas <Jean-Guillaume.Dumas at imag.fr>
- *
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-/* WARNING this wrapper works only with an improved version of Givaro.
- * This version of givaro won't be available for public yet.
- * But it is available on my web page.
- * You can send me a mail to get it or for others details.
- */
-
-#ifndef __LINBOX_field_givaro_montgomery_H
-#define __LINBOX_field_givaro_montgomery_H
-
-
-#include "linbox/integer.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/util/debug.h"
-#include "linbox/linbox-config.h"
-#include "linbox/field/field-traits.h"
-
-//------------------------------------
-// Files of Givaro library
-
-
-#include <givaro/givmontg32.h>
-#include <givaro/giv_randiter.h>
-//------------------------------------
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	class GivaroMontg;
-
-	template<>
-	struct ClassifyRing<GivaroMontg> {
-		typedef RingCategories::ModularTag categoryTag;
-	};
-	/**
-	 \brief wrapper of Givaro's Givaro::Montgomery< Givaro::Std32>.
-	 \ingroup field
-
-	 *  This class is a modular representation with a Givaro::Montgomery reduction
-	 */
-	class GivaroMontg : public Givaro::Montgomery< Givaro::Std32>, public FieldInterface {
-
-	public:
-
-		/** Element type.
-		 *  This type is inherited from the Givaro class Givaro::Montgomery< Givaro::Std32>
-		 */
-		typedef Givaro::Montgomery< Givaro::Std32> Father_t ;
-		typedef  Father_t::Rep Element;
-		using Father_t::one;
-		using Father_t::mOne;
-		using Father_t::zero;
-
-		/** RandIter type
-		 *  This type is inherited from the Givaro class Givaro::Montgomery< Givaro::Std32>
-		 */
-		typedef Givaro::GIV_randIter< Givaro::Montgomery< Givaro::Std32>, LinBox::integer >  RandIter;
-
-		/** Constructor from an integer
-		 *  this constructor use the ZpzDom<TAG> constructor
-		 */
-		GivaroMontg(const integer& p) :
-		 Givaro::Montgomery< Givaro::Std32>(static_cast<uint32_t>(long(p)))
-		{ }
-
-		/** Constructor from an integer (takes degree of extension as 2nd parameter, must be 1)
-		 *  this constructor use the ZpzDom<TAG> constructor
-		 */
-	  	GivaroMontg(const integer& p, const integer& k) :
-		 Givaro::Montgomery< Givaro::Std32>(static_cast<uint32_t>(long(p)))
-		{
-
-			if (k!=1)
-				throw PreconditionFailed(__func__,__FILE__,__LINE__,"exponent must be 1");
-		}
-
-		/** Characteristic.
-		 * Return integer representing characteristic of the domain.
-		 * Returns a positive integer to all domains with finite characteristic,
-		 * and returns 0 to signify a domain of infinite characteristic.
-		 * @return integer representing characteristic of the domain.
-		 */
-		integer& characteristic(integer& c) const
-		{
-			return c=integer(static_cast<long>( Givaro::Montgomery< Givaro::Std32>::characteristic()));
-		}
-
-		long characteristic() const
-		{
-			return static_cast<long>( Givaro::Montgomery< Givaro::Std32>::characteristic());
-		}
-
-
-		/** Cardinality.
-		 * Return integer representing cardinality of the domain.
-		 * Returns a non-negative integer for all domains with finite
-		 * cardinality, and returns -1 to signify a domain of infinite
-		 * cardinality.
-		 * @return integer representing cardinality of the domain
-		 */
-		integer& cardinality(integer& c) const
-		{
-		       	return c=integer(static_cast<long>( Givaro::Montgomery< Givaro::Std32>::size()));
-		}
-
-		long cardinality() const
-		{
-			return static_cast<long>( Givaro::Montgomery< Givaro::Std32>::size());
-		}
-
-		/** Initialization of field base Element from an integer.
-		 * Behaves like C++ allocator construct.
-		 * This function assumes the output field base Element x has already been
-		 * constructed, but that it is not already initialized.
-		 * We assume that the type of Element is short int.
-		 * this methos is just a simple cast.
-		 * @return reference to field base Element.
-		 * @param x field base Element to contain output (reference returned).
-		 * @param y integer.
-		 */
-		Element& init(Element& x , const integer& y=0) const
-		{
-			return Givaro::Montgomery< Givaro::Std32>::init( x,long(y % (integer)_p));
-		}
-
-		Element& init(Element& x , const double y) const
-		{
-		       	return Givaro::Montgomery< Givaro::Std32>::init( x, y);
-		}
-
-		/** Conversion of field base element to an integer.
-		 * This function assumes the output field base element x has already been
-		 * constructed, but that it is not already initialized.
-		 * @return reference to an integer.
-		 * @param x integer to contain output (reference returned).
-		 * @param y constant field base element.
-		 */
-		integer& convert(integer& x, const Element& y) const
-		{
-			long tmp;
-			//	return x = *(new integer(Montgomery< Givaro::Std32>::convert(tmp,y)));
-			return x = integer( Givaro::Montgomery< Givaro::Std32>::convert(tmp,y));
-		}
-
-		double& convert(double& x, const Element& y) const
-		{
-			return Givaro::Montgomery< Givaro::Std32>::convert( x, y);
-		}
-
-#if 0 /*  isZero */
-		bool isZero(const Element& x) const
-		{
-		       	return Givaro::Montgomery< Givaro::Std32>::isZero(x);
-		}
-#endif
-
-		static inline int getMaxModulus() { return 40504; }
-
-	}; // class GivaroMontg
-
-
-
-} // namespace LinBox
-
-#endif // __LINBOX_field_givaro_montgomery_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Givaro/givaro-rational.h b/linbox/field/Givaro/givaro-rational.h
deleted file mode 100644
index 9b4178b..0000000
--- a/linbox/field/Givaro/givaro-rational.h
+++ /dev/null
@@ -1,229 +0,0 @@
-/* linbox/field/givaro-rational.h
- * Copyright (C) 2004 Gilles Villard
- *
- * Created  Gilles Villard < Gilles.Villard at ens-lyon.fr>
- * ven oct  8 13:30:05 CEST 2004
- *  ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-
-#ifndef __LINBOX_givaro_rational_H
-#define __LINBOX_givaro_rational_H
-
-
-#include "linbox/integer.h"
-#include "linbox/field/unparametric.h"
-#include "linbox/field/field-traits.h"
-
-
-//------------------------------------
-// Files of Givaro library
-
-#include "givaro/givrational.h"
-//------------------------------------
-
-
-namespace LinBox
-{
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	class GivaroRational;
-
-	template<>
-	struct ClassifyRing<GivaroRational> {
-		typedef RingCategories::RationalTag categoryTag;
-	};
-
-	class GivaroRational : public UnparametricField< Givaro::Rational> {
-
-	public:
-
-		/** Element type.
-		 *
-		 */
-		typedef  Givaro::Rational Element;
-		Element zero,one,mOne;
-
-
-		Element& init(Element& x , const integer& y) const
-		{
-			return x=Element(y);
-		}
-
-		Element& init(Element& x , const integer& n,const integer& d) const
-		{
-			return x=Element(n,d);
-		}
-
-		template<class XX>
-		Element& init(Element& x , const XX& y) const
-		{
-			return x=Element(y);
-		}
-
-        std::istream &read(std::istream & s, Element &a) const
-		{
-            s >> a;
-            return s;
-		}
-
-		integer& convert(integer& i, const Element& r) const
-		{
-			return i=r.nume();
-		}
-
-
-		Element& assign(Element& x , const Element& y) const
-		{
-			return x=y;
-		}
-
-		// x = numerator of y
-		integer& get_num (integer& x, const Element& y)  const
-		{
-			return x = y.nume();
-		}
-
-		// x = denominator of y
-		integer& get_den (integer& x, const Element& y) const
-		{
-			return x = y.deno();
-		}
-
-
-	}; // class
-
-
-
-} // namespace LinBox
-
-
-// Specialization of homomorphism for basefield
-#include "linbox/field/hom.h"
-namespace LinBox
-{
-	template <class _Target>
-	class Hom<GivaroRational, _Target> {
-
-	public:
-		typedef GivaroRational Source;
-		typedef _Target Target;
-		typedef typename Source::Element SrcElt;
-		typedef typename Target::Element Elt;
-
-		Hom(const Source& S, const Target& T) :
-			_source (S), _target(T)
-		{
-		}
-		Elt& image(Elt& t, const SrcElt& s)
-		{
-			_source. get_num (num, s);
-			_source. get_den (den, s);
-			if (den == 1) {
-				return _target.init(t,num);
-			}
-			else if (num == 1) {
-				_target.init(t,den);
-				return _target.invin(t);
-			}
-			else {
-				_target. init (tmp, den);
-				_target. init (t, num);
-				return _target. divin (t, tmp);
-
-			}
-			// 			_target. init (t, den);
-			// 			return _target. invin (t);
-
-		}
-		SrcElt& preimage(SrcElt& s, const Elt& t)
-		{
-			_target. convert (num, t);
-			_source. init (s, num);
-			return s;
-
-		}
-		const Source& source()
-		{
-			return _source;
-		}
-		const Target& target()
-		{
-			return _target;
-		}
-
-	protected:
-		integer num, den;
-		Elt tmp;
-		Source _source;
-		Target _target;
-	}; // end Hom
-
-	template <>
-	class Hom<GivaroRational,GivaroRational> {
-
-	public:
-		typedef GivaroRational Source;
-		typedef Source Target;
-		typedef Source::Element SrcElt;
-		typedef Target::Element Elt;
-
-		Hom(const Source& S, const Target& T) :
-			_source (S), _target(T)
-		{
-}
-		Elt& image(Elt& t, const SrcElt& s) {
-			_target.assign(t, s);
-			return t;
-
-
-}
-		SrcElt& preimage(SrcElt& s, const Elt& t)
-		{
-			_source.assign(s, t);
-			return s;
-
-}
-		const Source& source() {
-return _source;
-}
-		const Target& target() {
-return _target;
-}
-
-	protected:
-		Source _source;
-		Target _target;
-	}; // end Hom
-
-}
-
-#endif // __LINBOX_givaro_rational_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Givaro/givaro-zpz.h b/linbox/field/Givaro/givaro-zpz.h
deleted file mode 100644
index 6fa4230..0000000
--- a/linbox/field/Givaro/givaro-zpz.h
+++ /dev/null
@@ -1,518 +0,0 @@
-/* linbox/field/givaro-zpz.h
- * Copyright (C) 2002 Pascal Giorgi
- *
- * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- *
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-/* WARNING this wrapper works only with an improved version of Givaro.
- * This version of givaro won't be available for public yet.
- * But it is available on my web page.
- * You can send me a mail to get it or for others details.
- */
-
-#ifndef __LINBOX_field_givaro_zpz_H
-#define __LINBOX_field_givaro_zpz_H
-
-
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/util/debug.h"
-#include "linbox/vector/vector-domain.h"
-//-------------------------------------
-// Files of Givaro library
-#include <givaro/givzpz.h>
-#include <givaro/giv_randiter.h>
-#include "linbox/field/field-traits.h"
-
-//--------------------------------------
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
-	/*  This wrappers allows to use three sorts of givaro fields :
-	 *  Elements represent by a 32 bits integer
-	 *  Elements represent by a 16 bits integer
-	 *  Elements represent in Zech log representation by a 16 bits integer
-	 *
-	 *  To use this fields with the wrapper below just replace the template
-	 *  parameter by the Tag appropriated.
-	 *  "Givaro::Std16"  for 16 bits integer
-	 *  "Givaro::Std32"  for 32 bits integer
-	 *  "Givaro::Log16"  for Zech log representation in 16 bits
-	 */
-	template<class Field>
-	class DotProductDomain;
-	template<class Field>
-	class FieldAXPY;
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	template <class TAG>
-	class GivaroZpz;
-
-	template<class Tag>
-	struct ClassifyRing<GivaroZpz<Tag> > {
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-	/** \brief wrapper of Givaro's ZpzDom.
-	  \ingroup field
-
-	 *  Most methods are inherited from Givaro::ZpzDom< Givaro::Std16>, Givaro::ZpzDom< Givaro::Std32>
-	 *  and Givaro::ZpzDom<log16> classes of Givaro.
-	 *  These classes allow to construct only finite field with a prime modulus.
-	 */
-	template <class TAG>
-	class GivaroZpz : public Givaro::ZpzDom<TAG>, public FieldInterface {
-
-	private:
-
-		/*		friend class DotProductDomain<GivaroZpz<TAG> > ;
-				friend class FieldAXPY<GivaroZpz<TAG> >; */
-
-	public:
-
-		//typedef integer Integer;
-
-		/** Element type.
-		 *  This type is inherited from the Givaro class Givaro::ZpzDom<TAG>
-		 */
-		typedef typename Givaro::ZpzDom<TAG>::Rep Element;
-		// Element zero,one,mOne;
-		typedef Givaro::ZpzDom<TAG> Father_t ;
-		typedef GivaroZpz<TAG>      Self_t ;
-		using  Father_t::one ;
-		using  Father_t::zero ;
-		using  Father_t::mOne ;
-
-		/** RandIter type
-		 *  This type is inherited from the Givaro class Givaro::ZpzDom<TAG>
-		 */
-		typedef Givaro::GIV_randIter< Givaro::ZpzDom<TAG>, integer > RandIter;
-
-		/** Constructor from an integer
-		 *  this constructor use the Givaro::ZpzDom<TAG> constructor
-		 */
-		GivaroZpz (const integer &p) :
-		 Givaro::ZpzDom<TAG> (static_cast<typename Givaro::ZpzDom<TAG>::Residu_t> (p))
-		{}
-
-
-		/** Constructor from an integer (takes degree of extension as 2nd parameter, must be 1)
-		 *  this constructor use the Givaro::ZpzDom<TAG> constructor
-		 */
-		GivaroZpz (const integer &p, const integer& k) :
-		 Givaro::ZpzDom<TAG> (static_cast<typename Givaro::ZpzDom<TAG>::Residu_t> (p))
-		{
-
-			if (k!=1)
-				throw PreconditionFailed(__func__,__FILE__,__LINE__,"exponent must be 1");
-		}
-
-		/** Copy constructor.
-		 * This copy constructor use the Givaro::ZpzDom<TAG> copy constructor
-		 */
-		GivaroZpz (const GivaroZpz<TAG>& F) :
-		 Givaro::ZpzDom<TAG> (F)
-		{}
-
-
-#if 0
-		// Rich Seagraves 7-16-2003
-		// As is, this operator is an infinite loop
-		// By not providing an operator= in GivaroZpz,
-		// the operator= in the base class ( Givaro::ZpzDom<TAG>) is called
-		// automatically by the rules of C++, which I'm guessing is
-		// the "Right Thing" for this operator
-		//
-		/** Operator =
-		*/
-		/*
-		   GivaroZpz<TAG>& operator= (const GivaroZpz<TAG>& F)
-		   {
-		   return (*this)=F;
-		   }
-		   */
-#endif
-
-		/** Characteristic.
-		 * Return integer representing characteristic of the domain.
-		 * @return integer representing characteristic of the domain.
-		 */
-		integer &characteristic (integer &c) const
-		{
-			return c = integer ( Givaro::ZpzDom<TAG>::size ());
-		}
-		unsigned long &characteristic (unsigned long &c) const
-		{
-			return c = (unsigned long) ( Givaro::ZpzDom<TAG>::size ());
-		}
-
-		long characteristic() const
-		{
-			return static_cast<int>( Givaro::ZpzDom<TAG>::size());
-		}
-
-		/** Cardinality.
-		 * Return integer representing cardinality of the domain.
-		 * @return integer representing cardinality of the domain
-		 */
-		integer &cardinality (integer &c) const
-		{
-			return c = integer ( Givaro::ZpzDom<TAG>::size ());
-		}
-
-		integer cardinality () const
-		{
-			return integer ( Givaro::ZpzDom<TAG>::size ());
-		}
-
-		/** Conversion of field base element to an integer.
-		 * This function assumes the output field base element x has already been
-		 * constructed, but that it is not already initialized.
-		 * @return reference to an integer.
-		 * @param x integer to contain output (reference returned).
-		 * @param y constant field base element.
-		 */
-		integer &convert (integer &x, const Element &y) const
-		{
-			return x = integer (y);
-		}
-
-		double &convert (double& x, const Element& y) const
-		{
-			return x = static_cast<double>(y);
-		}
-
-		template<class Type>
-		Type &convert (Type& x, const Element& y) const
-		{
-			return x = static_cast<Type>(y);
-		}
-
-
-		/** Initialization of field base element from an integer.
-		 * Behaves like C++ allocator construct.
-		 * This function assumes the output field base element x has already been
-		 * constructed, but that it is not already initialized.
-		 * @return reference to field base element.
-		 * @param x field base element to contain output (reference returned).
-		 * @param y integer.
-		 */
-		Element &init (Element &x , const integer &y = 0) const
-		{
-			//
-			//	AU 28/03/07 no cast to long allows to use Givaro::ZpzDom<integer>
-			//
-			//Givaro::ZpzDom<TAG>::init (x, (long) (y% integer(this->_p)));
-			Givaro::ZpzDom<TAG>::init (x, (y% integer(this->_p)));
-			return x;
-		}
-
-		Element &init (Element &x , const long &y ) const
-		{
-			return Givaro::ZpzDom<TAG>::init (x, y ) ;
-
-		}
-		Element &init (Element &x , const int &y ) const
-		{
-			return Givaro::ZpzDom<TAG>::init (x, y ) ;
-
-		}
-
-		Element &init (Element &x , const unsigned&y ) const
-		{
-			return Givaro::ZpzDom<TAG>::init (x, y ) ;
-
-		}
-
-		Element &init (Element &x , const unsigned long &y ) const
-		{
-			return Givaro::ZpzDom<TAG>::init (x, y ) ;
-
-		}
-
-		Element &init (Element &x , const double &y ) const
-		{
-			double z = fmod(y, (double) this->_p);
-			if (z < 0) z += (double) this->_p;
-			z += 0.5;
-			return x = static_cast<Element>(z); //rounds towards 0
-		}
-
-		static uint64_t getMaxModulus();
-
-	}; // class GivaroZpz<TAG>
-
-
-	template <> uint64_t GivaroZpz< Givaro::Std32>::getMaxModulus() { return 46339; } // 2^15.5-1
-	template <> uint64_t GivaroZpz< Givaro::Std64>::getMaxModulus() { return 3037000499ULL; } // 2^15.5-1
-	template <> uint64_t GivaroZpz< Givaro::Unsigned32>::getMaxModulus() { return 65535; } // 2^16-1
-	template <> uint64_t GivaroZpz< Givaro::Std16>::getMaxModulus() { return 255; }   // 2^8-1
-	template <> uint64_t GivaroZpz< Givaro::Log16>::getMaxModulus() { return 32767; } // 2^15 - 1
-
-	/** Specialisation of the convert function for the zech log representation
-	 *	of givaro-zpz (GivaroZpz< Givaro::Log16>.
-	 *  this function translates the internal representation to the real
-	 *	value of the element.
-	 *	This can have no sense but can be usefull
-	 *  NB : the init function for this specialisation does the same thing.
-	 *  the function transaltes the values to her internal representation.
-	 */
-	template <> integer& GivaroZpz< Givaro::Log16>::convert(integer& x, const Element& y) const
-	{
-		if (y>=this->_p) return x = 0;
-		int tmp = _tab_rep2value[y];
-		return x = integer (tmp);
-	}
-
-	template <> double& GivaroZpz< Givaro::Log16>::convert(double& x, const Element& y) const
-	{
-		if (y>=this->_p) return x = 0.0;
-		int tmp = _tab_rep2value[y];
-		return x = (double) tmp;
-	}
-
-	template <> GivaroZpz< Givaro::Log16>::Element& GivaroZpz< Givaro::Log16>::init(GivaroZpz< Givaro::Log16>::Element& x, const double& y) const
-	{
-		double z = fmod(y, (double) this->_p);
-		if (z < 0) z += this->_p;
-		z += 0.5;
-		return x = _tab_value2rep[static_cast<long>(z)]; //rounds towards 0
-	}
-
-	template <> GivaroZpz< Givaro::Log16>::Element& GivaroZpz< Givaro::Log16>::init(GivaroZpz< Givaro::Log16>::Element& x, const integer& y) const
-	{
-		int tmp =(int) (y % (integer)this->_p);
-		if (tmp < 0 ) tmp += this->_p;
-		return x = _tab_value2rep[tmp];
-	}
-
-	/* Specialization of FieldAXPY for GivaroZpz< Givaro::Std32> Field */
-
-	template <>
-	class FieldAXPY<GivaroZpz< Givaro::Std32> > {
-	public:
-
-		typedef GivaroZpz< Givaro::Std32>::Element Element;
-		typedef GivaroZpz< Givaro::Std32> Field;
-
-		FieldAXPY (const Field &F) :
-			_field (F) , Corr(uint64_t(-1) % (uint64_t)F.characteristic() +1)
-		{ _y = 0; }
-		FieldAXPY (const FieldAXPY &faxpy) :
-			_field (faxpy._field), _y (0) , Corr(faxpy.Corr)
-		{}
-
-		FieldAXPY<GivaroZpz< Givaro::Std32> > &operator = (const FieldAXPY &faxpy)
-		{ _field = faxpy._field; _y = faxpy._y; Corr = faxpy.Corr; return *this; }
-
-		inline uint64_t& mulacc (const Element &a, const Element &x)
-		{
-			uint64_t t = (uint64_t) a * (uint64_t) x;
-			_y += t;
-			if (_y < t)
-				return _y += Corr;
-			else
-				return _y;
-		}
-
-		inline uint64_t& accumulate (const Element &t)
-		{
-			_y += t;
-			if (_y < (uint64_t)t)
-				return _y += Corr;
-			else
-				return _y;
-		}
-
-		inline Element &get (Element &y) {
-			_y %= (uint64_t) _field.characteristic();
-			if ((int64_t) _y < 0) _y += _field.characteristic();
-			y = (uint32_t) _y;
-			return y;
-		}
-
-		inline FieldAXPY &assign (const Element y)
-		{ _y = y; return *this; }
-
-		inline void reset() {
-			_y = 0;
-		}
-
-	private:
-
-		Field _field;
-		uint64_t _y;
-		uint64_t Corr;
-	};
-
-
-	/* Specialization of FieldAXPY for GivaroZpz< Givaro::Std32> Field */
-
-	template <>
-	class FieldAXPY<GivaroZpz< Givaro::Std16> > {
-	public:
-
-		typedef GivaroZpz< Givaro::Std16>::Element Element;
-		typedef GivaroZpz< Givaro::Std16> Field;
-
-		FieldAXPY (const Field &F) :
-			_field (F) , Corr(uint32_t(-1) % (uint32_t)F.characteristic() +1)
-		{
-			_y = 0;
-		}
-		FieldAXPY (const FieldAXPY &faxpy) :
-			_field (faxpy._field), _y (0) , Corr(faxpy.Corr)
-		{}
-
-		FieldAXPY<GivaroZpz< Givaro::Std16> > &operator = (const FieldAXPY &faxpy)
-		{
-			_field = faxpy._field;
-			_y = faxpy._y;
-			Corr = faxpy.Corr;
-			return *this;
-		}
-
-		inline uint32_t& mulacc (const Element &a, const Element &x)
-		{
-			uint32_t t = (uint32_t) a * (uint32_t) x;
-			_y += t;
-
-			if (_y < t)
-				return _y += Corr;
-			else
-				return _y;
-		}
-
-		inline uint32_t& accumulate (const Element &t)
-		{
-			_y += t;
-
-			if (_y < (uint32_t)t)
-				return _y += Corr;
-			else
-				return _y;
-		}
-
-		inline Element &get (Element &y)
-		{
-			_y %= (uint32_t) _field.characteristic();
-			if ((int32_t) _y < 0)
-				_y += (Element) _field.characteristic();
-			y = (uint16_t) _y;
-			return y;
-		}
-
-		inline FieldAXPY &assign (const Element y)
-		{
-			_y = y;
-			return *this;
-		}
-
-		inline void reset()
-		{
-			_y = 0;
-		}
-
-	private:
-
-		Field _field;
-		uint32_t _y;
-		uint32_t Corr;
-	};
-
-	// Specialization of DotProductDomain for GivaroZpz< Givaro::Std32> field
-
-	template <>
-	class DotProductDomain<GivaroZpz< Givaro::Std32> > :  private virtual VectorDomainBase<GivaroZpz< Givaro::Std32> > {
-
-	public:
-
-		typedef GivaroZpz< Givaro::Std32>::Element Element;
-
-		DotProductDomain (const GivaroZpz< Givaro::Std32> &F) :
-			VectorDomainBase<GivaroZpz< Givaro::Std32> > (F) ,
-			Corr(uint64_t(-1) % (uint64_t)F.characteristic() +1),
-			Max(uint64_t(-1))
-		{}
-
-	protected:
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const;
-
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const;
-
-	private:
-		uint64_t Corr;
-		uint64_t Max;
-	};
-
-	// Specialization of DotProductDomain for GivaroZpz< Givaro::Std16> field
-
-	template <>
-	class DotProductDomain<GivaroZpz< Givaro::Std16> > :  private virtual VectorDomainBase<GivaroZpz< Givaro::Std16> > {
-
-	public:
-
-		typedef GivaroZpz< Givaro::Std16>::Element Element;
-
-		DotProductDomain (const GivaroZpz< Givaro::Std16> &F) :
-			VectorDomainBase<GivaroZpz< Givaro::Std16> > (F) ,
-			Corr(uint32_t(-1) % (uint32_t)F.characteristic() +1),
-			Max(uint32_t(-1))
-		{}
-
-	protected:
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const;
-
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const;
-
-	private:
-		uint32_t Corr;
-		uint32_t Max;
-	};
-
-} // namespace LinBox
-
-#include "linbox/field/Givaro/givaro-zpz.inl"
-
-#endif // __LINBOX_field_givaro_zpz_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Givaro/givaro-zpz.inl b/linbox/field/Givaro/givaro-zpz.inl
deleted file mode 100644
index f247992..0000000
--- a/linbox/field/Givaro/givaro-zpz.inl
+++ /dev/null
@@ -1,288 +0,0 @@
-/* linbox/field/givaro-zpz.inl
- * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- *
- * ------------------------------------
- *
- * Copyright (c) LinBox
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-/*!@internal
- * @file linbox/field/Givaro/givaro-zpz.inl
- * @brief implementation of givaro-zpz.h.
- */
-
-
-#ifndef __LINBOX_givaro_zpz_INL
-#define __LINBOX_givaro_zpz_INL
-
-
-#include <iostream>
-#include "linbox/integer.h"
-
-namespace LinBox
-{
-
-
-
-	template <class Vector1, class Vector2>
-	inline GivaroZpz< Givaro::Std32>::Element &DotProductDomain<GivaroZpz< Givaro::Std32> >::dotSpecializedDD
-	(GivaroZpz< Givaro::Std32>::Element &res, const Vector1 &v1, const Vector2 &v2) const
-	{
-		typedef typename GivaroZpz<Givaro::Std32>::Element Elem;
-		uint64_t inter,best ;
-		inter=best=0;
-		if (v1.size()==0)
-			return res=Elem(0);
-		else {
-
-			uint64_t size      = v1.size();
-			uint64_t min       = Max / (Corr+ (uint64_t)(_field.characteristic()-1)*(uint64_t)(_field.characteristic()-1));
-			uint64_t min_size  =  (size < min ? size : min);
-			uint64_t good1     = (size > min_size ?  size - min_size: 0);
-			uint64_t good2     = (long)(size / min_size)* min_size ;
-			uint64_t good_size = (good1 > good2 ? good1 : good2 );
-
-			typename Vector1::const_iterator i=v1.begin();
-			typename Vector2::const_iterator j=v2.begin();
-
-			unsigned long k=0;
-
-			for (;k<min_size;i++,j++,k++)
-				best+=(uint64_t)*i * (uint64_t)*j;
-
-			for (inter=best;k<good_size;inter=best) {
-				for (unsigned long l=0;l<min_size;i++,j++,k++,l++)
-					best+= (uint64_t)*i * (uint64_t)*j;
-				if (inter > best) best+=Corr;
-			}
-
-			for (;k<size;i++,j++,k++)
-				best+= (uint64_t)*i * (uint64_t)*j;
-			if (inter > best) best+=Corr;
-
-
-			return res =  Elem(best % (uint64_t)_field.characteristic());
-		}
-	}
-
-	template <class Vector1, class Vector2>
-	inline GivaroZpz< Givaro::Std32>::Element &DotProductDomain<GivaroZpz< Givaro::Std32> >::dotSpecializedDSP
-	(GivaroZpz< Givaro::Std32>::Element &res, const Vector1 &v1, const Vector2 &v2) const
-	{
-		uint64_t inter,best ;
-		inter=best=0;
-		if ((v1.first).size()== 0)
-			return res=GivaroZpz< Givaro::Std32>::Element(0);
-		else {
-			uint64_t size      = (v1.first).size();
-			uint64_t min       = Max / (Corr+ (uint64_t)(_field.characteristic()-1)*(uint64_t)(_field.characteristic()-1));
-			uint64_t min_size  =  (size < min ? size : min);
-			uint64_t good1     = (size > min_size ?  size - min_size: 0);
-			uint64_t good2     = (long)(size / min_size)* min_size ;
-			uint64_t good_size = (good1 > good2 ? good1 : good2 );
-
-			typename Vector1::first_type::const_iterator i_idx  =  v1.first.begin ();
-			typename Vector1::second_type::const_iterator i_elt =  v1.second.begin ();
-
-			unsigned long k=0;
-
-			for (;k<min_size;i_idx++,i_elt++,k++)
-				best+=(uint64_t)*i_elt * (uint64_t)v2[*i_idx];
-
-			for (inter=best;k<good_size;inter=best) {
-				for (unsigned long l=0;l<min_size;i_idx++,i_elt++,k++,l++)
-					best+= (uint64_t)*i_elt * (uint64_t)v2[*i_idx];
-				if (inter > best) best+=Corr;
-			}
-
-			for (;k<size;i_idx++,i_elt++,k++)
-				best+= (uint64_t)*i_elt * (uint64_t)v2[*i_idx];
-			if (inter > best) best+=Corr;
-
-			return res =  best % _field.characteristic();
-		}
-	}
-
-
-
-	template <class Vector1, class Vector2>
-	inline GivaroZpz< Givaro::Std16>::Element &DotProductDomain<GivaroZpz< Givaro::Std16> >::dotSpecializedDD
-	(GivaroZpz< Givaro::Std16>::Element &res, const Vector1 &v1, const Vector2 &v2) const
-	{
-		uint32_t inter,best ;
-		inter=best=0;
-		if (v1.size() == 0)
-			return  res=GivaroZpz< Givaro::Std16>::Element(0);
-		else {
-			uint32_t size      = v1.size();
-			uint32_t min       = Max / (Corr+ ((uint32_t)_field.characteristic()-1)*(uint32_t)(_field.characteristic()-1));
-			uint32_t min_size  =  (size < min ? size : min);
-			uint32_t good1     = (size > min_size ?  size - min_size: 0);
-			uint32_t good2     = (long)(size / min_size)* min_size ;
-			uint32_t good_size = (good1 > good2 ? good1 : good2 );
-
-
-			typename Vector1::const_iterator i=v1.begin();
-			typename Vector2::const_iterator j=v2.begin();
-
-			uint32_t k=0;
-
-			for (;k<min_size;i++,j++,k++)
-				best+=(uint32_t)*i * (uint32_t)*j;
-
-			for (inter=best;k<good_size;inter=best) {
-				for (unsigned long l=0;l<min_size;i++,j++,k++,l++)
-					best+= (uint32_t)*i * (uint32_t)*j;
-				if (inter > best) best+=Corr;
-			}
-
-			for (;k<size;i++,j++,k++)
-				best+= (uint32_t)*i * (uint32_t)*j;
-			if (inter > best) best+=Corr;
-
-			return res = best % (uint32_t)_field.characteristic();
-		}
-	}
-
-	template <class Vector1, class Vector2>
-	inline GivaroZpz< Givaro::Std16>::Element &DotProductDomain<GivaroZpz< Givaro::Std16> >::dotSpecializedDSP
-	(GivaroZpz< Givaro::Std16>::Element &res, const Vector1 &v1, const Vector2 &v2) const
-	{
-		uint32_t inter,best ;
-		inter=best=0;
-		if ((v1.first).size()==0)
-			return  res=GivaroZpz< Givaro::Std16>::Element(0);
-		else {
-			uint32_t size      = (v1.first).size();
-			uint32_t min       = Max / (Corr+ (uint32_t)(_field.characteristic()-1)*(uint32_t)(_field.characteristic()-1));
-			uint32_t min_size  =  (size < min ? size : min);
-			uint32_t good1     = (size > min_size ?  size - min_size: 0);
-			uint32_t good2     = (long)(size / min_size)* min_size ;
-			uint32_t good_size = (good1 > good2 ? good1 : good2 );
-
-			typename Vector1::first_type::const_iterator i_idx  =  v1.first.begin ();
-			typename Vector1::second_type::const_iterator i_elt =  v1.second.begin ();
-			uint32_t k=0;
-
-			for (;k<min_size;i_idx++,i_elt++,k++)
-				best+=(uint32_t)*i_elt * (uint32_t)v2[*i_idx];
-
-			for (inter=best;k<good_size;inter=best) {
-				for (unsigned long l=0;l<min_size;i_idx++,i_elt++,k++,l++)
-					best+= (uint32_t)*i_elt * (uint32_t)v2[*i_idx];
-				if (inter > best) best+=Corr;
-			}
-
-			for (;k<size;i_idx++,i_elt++,k++)
-				best+= (uint32_t)*i_elt * (uint32_t)v2[*i_idx];
-			if (inter > best) best+=Corr;
-
-			return res =  best % (uint32_t)_field.characteristic();
-		}
-	}
-
-
-#ifdef XMLENABLED
-
-	template<>
-	bool GivaroZpz< Givaro::Std16>::toTag(Writer &W) const
-	{
-		string s;
-		int16_t m = ZpzDom< Givaro::Std16>::residu();
-
-		W.setTagName("field");
-		W.setAttribute("implDetail", "givaro-zpz-std16");
-		W.setAttribute("cardinality", Writer::numToString(s, m));
-
-		W.addTagChild();
-		W.setTagName("finite");
-
-		W.addTagChild();
-		W.setTagName("characteristic");
-		W.addNum(m);
-		W.upToParent();
-		W.upToParent();
-
-		return true;
-	}
-
-	template <>
-	bool GivaroZpz< Givaro::Std32>::toTag(Writer &W) const
-	{
-		string s;
-		int32_t m = ZpzDom< Givaro::Std32>::residu();
-
-		W.setTagName("field");
-		W.setAttribute("implDetail", "givaro-zpz-std32");
-		W.setAttribute("cardinality", Writer::numToString(s, m));
-
-		W.addTagChild();
-		W.setTagName("finite");
-
-		W.addTagChild();
-		W.setTagName("characteristic");
-		W.addNum(m);
-		W.upToParent();
-
-		W.upToParent();
-
-		return true;
-	}
-
-	template <>
-	bool GivaroZpz<Log16>::toTag(Writer &W) const
-	{
-		string s;
-		int16_t m = ZpzDom<Log16>::residu();
-
-		W.setTagName("field");
-		W.setAttribute("implDetail", "givaro-zpz-log16");
-		W.setAttribute("cardinality", Writer::numToString(s, m));
-
-		W.addTagChild();
-		W.setTagName("finite");
-
-		W.addTagChild();
-		W.setTagName("characteristic");
-		W.addNum(m);
-		W.upToParent();
-
-		W.upToParent();
-
-		return true;
-	}
-#endif
-
-
-}
-
-#endif //__LINBOX_givaro_zpz_INL
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Makefile.am b/linbox/field/Makefile.am
index 08fae88..648d61b 100644
--- a/linbox/field/Makefile.am
+++ b/linbox/field/Makefile.am
@@ -21,8 +21,6 @@
 
 pkgincludesubdir=$(pkgincludedir)/field
 
-SUBDIRS=NTL Givaro Modular
-
 BASIC_HDRS =            \
     field-interface.h   \
     field-traits.h      \
@@ -30,58 +28,16 @@ BASIC_HDRS =            \
     abstract.h          \
     archetype.h         \
     envelope.h          \
-    unparametric.h      \
     param-fuzzy.h       \
     gmp-rational.h      \
-    modular.h           \
-    modular-balanced.h  \
     gf2.h               \
     gf2.inl             \
     hom.h               \
     map.h               \
-    PIR-modular-int32.h \
-    local2_32.h         \
-    PID-integer.h       \
-    PID-double.h        \
-    block-ring.h        \
     multimod-field.h
 
-NTL_HDRS =              \
-    ntl.h               \
-    PID-ntl-zz_p.h     \
-    PIR-ntl-ZZ_p.h
-
-GIVARO_HDRS =           \
-    givaro.h
-
-LIDIA_HDRS =            \
-    lidia.h             \
-    lidia-gfq.h
-
-if LINBOX_HAVE_NTL
-USE_NTL_HDRS = $(NTL_HDRS)
-endif
-
-if LINBOX_HAVE_GIVARO
-USE_GIVARO_HDRS = $(GIVARO_HDRS)
-endif
-
-if LINBOX_HAVE_LIDIA
-USE_LIDIA_HDRS = $(LIDIA_HDRS)
-endif
-
 pkgincludesub_HEADERS =     \
-    $(BASIC_HDRS)           \
-    $(USE_NTL_HDRS)         \
-    $(USE_GIVARO_HDRS)      \
-    $(USE_LIDIA_HDRS)
+    $(BASIC_HDRS)           
 
 EXTRA_DIST =            \
-    $(NTL_HDRS)         \
-    $(GIVARO_HDRS)      \
-    $(LIDIA_HDRS)       \
-    field.doxy          \
-    modular.doxy        \
-    integers.doxy       \
-    lidia.doxy          \
-    ntl.doxy
+    field.doxy          
diff --git a/linbox/field/Makefile.in b/linbox/field/Makefile.in
deleted file mode 100644
index 9c752bd..0000000
--- a/linbox/field/Makefile.in
+++ /dev/null
@@ -1,782 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-#  ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/field
-DIST_COMMON = $(am__pkgincludesub_HEADERS_DIST) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-dvi-recursive install-exec-recursive \
-	install-html-recursive install-info-recursive \
-	install-pdf-recursive install-ps-recursive install-recursive \
-	installcheck-recursive installdirs-recursive pdf-recursive \
-	ps-recursive uninstall-recursive
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__pkgincludesub_HEADERS_DIST = field-interface.h field-traits.h \
-	rebind.h abstract.h archetype.h envelope.h unparametric.h \
-	param-fuzzy.h gmp-rational.h modular.h modular-balanced.h \
-	gf2.h gf2.inl hom.h map.h PIR-modular-int32.h local2_32.h \
-	PID-integer.h PID-double.h block-ring.h multimod-field.h ntl.h \
-	PID-ntl-zz_p.h PIR-ntl-ZZ_p.h givaro.h lidia.h lidia-gfq.h
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
-  distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
-	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
-	distdir
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/field
-SUBDIRS = NTL Givaro Modular
-BASIC_HDRS = \
-    field-interface.h   \
-    field-traits.h      \
-    rebind.h            \
-    abstract.h          \
-    archetype.h         \
-    envelope.h          \
-    unparametric.h      \
-    param-fuzzy.h       \
-    gmp-rational.h      \
-    modular.h           \
-    modular-balanced.h  \
-    gf2.h               \
-    gf2.inl             \
-    hom.h               \
-    map.h               \
-    PIR-modular-int32.h \
-    local2_32.h         \
-    PID-integer.h       \
-    PID-double.h        \
-    block-ring.h        \
-    multimod-field.h
-
-NTL_HDRS = \
-    ntl.h               \
-    PID-ntl-zz_p.h     \
-    PIR-ntl-ZZ_p.h
-
-GIVARO_HDRS = \
-    givaro.h
-
-LIDIA_HDRS = \
-    lidia.h             \
-    lidia-gfq.h
-
- at LINBOX_HAVE_NTL_TRUE@USE_NTL_HDRS = $(NTL_HDRS)
- at LINBOX_HAVE_GIVARO_TRUE@USE_GIVARO_HDRS = $(GIVARO_HDRS)
- at LINBOX_HAVE_LIDIA_TRUE@USE_LIDIA_HDRS = $(LIDIA_HDRS)
-pkgincludesub_HEADERS = \
-    $(BASIC_HDRS)           \
-    $(USE_NTL_HDRS)         \
-    $(USE_GIVARO_HDRS)      \
-    $(USE_LIDIA_HDRS)
-
-EXTRA_DIST = \
-    $(NTL_HDRS)         \
-    $(GIVARO_HDRS)      \
-    $(LIDIA_HDRS)       \
-    field.doxy          \
-    modular.doxy        \
-    integers.doxy       \
-    lidia.doxy          \
-    ntl.doxy
-
-all: all-recursive
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/field/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps linbox/field/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
-	done
-
-uninstall-pkgincludesubHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    $(am__make_dryrun) \
-	      || test -d "$(distdir)/$$subdir" \
-	      || $(MKDIR_P) "$(distdir)/$$subdir" \
-	      || exit 1; \
-	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-	    $(am__relativize); \
-	    new_distdir=$$reldir; \
-	    dir1=$$subdir; dir2="$(top_distdir)"; \
-	    $(am__relativize); \
-	    new_top_distdir=$$reldir; \
-	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-	    ($(am__cd) $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$new_top_distdir" \
-	        distdir="$$new_distdir" \
-		am__remove_distdir=: \
-		am__skip_length_check=: \
-		am__skip_mode_fix=: \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(HEADERS)
-installdirs: installdirs-recursive
-installdirs-am:
-	for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
-	install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-	all all-am check check-am clean clean-generic clean-libtool \
-	ctags ctags-recursive distclean distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-pkgincludesubHEADERS install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	installdirs-am maintainer-clean maintainer-clean-generic \
-	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
-	ps ps-am tags tags-recursive uninstall uninstall-am \
-	uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/field/Modular/Makefile.am b/linbox/field/Modular/Makefile.am
deleted file mode 100644
index 9c9b370..0000000
--- a/linbox/field/Modular/Makefile.am
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-
-
-pkgincludesubdir=$(pkgincludedir)/field/Modular
-
-BASIC_HDRS =            \
-    modular-unsigned.h  \
-    modular.inl         \
-    modular-int32.h     \
-    modular-int64.h     \
-    modular-short.h     \
-    modular-byte.h      \
-    modular-balanced-double.h   \
-    modular-balanced-float.h    \
-    modular-balanced-int32.h    \
-    modular-balanced-int64.h    \
-    modular-crooked-double.h    \
-    modular-double.h    \
-    modular-float.h
-
-
-pkgincludesub_HEADERS =     \
-    $(BASIC_HDRS)
-
-#  EXTRA_DIST =            \
-    #  modular.doxy
diff --git a/linbox/field/Modular/Makefile.in b/linbox/field/Modular/Makefile.in
deleted file mode 100644
index 41645ae..0000000
--- a/linbox/field/Modular/Makefile.in
+++ /dev/null
@@ -1,592 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/field/Modular
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/field/Modular
-BASIC_HDRS = \
-    modular-unsigned.h  \
-    modular.inl         \
-    modular-int32.h     \
-    modular-int64.h     \
-    modular-short.h     \
-    modular-byte.h      \
-    modular-balanced-double.h   \
-    modular-balanced-float.h    \
-    modular-balanced-int32.h    \
-    modular-balanced-int64.h    \
-    modular-crooked-double.h    \
-    modular-double.h    \
-    modular-float.h
-
-pkgincludesub_HEADERS = \
-    $(BASIC_HDRS)
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/field/Modular/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps linbox/field/Modular/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
-	done
-
-uninstall-pkgincludesubHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
-	for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool ctags distclean distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-pkgincludesubHEADERS install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-#  EXTRA_DIST =            \
-#    #  modular.doxy
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/field/Modular/modular-balanced-double.h b/linbox/field/Modular/modular-balanced-double.h
deleted file mode 100644
index 839f65d..0000000
--- a/linbox/field/Modular/modular-balanced-double.h
+++ /dev/null
@@ -1,342 +0,0 @@
-/* linbox/field/modular-balanced-double.h
- * Copyright (C) 2003 Pascal Giorgi
- *               2005,2008 Clement Pernet
- * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- * and Clement Pernet <Clement.Pernet at imag.fr>
- *
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-/*! @file field/Modular/modular-balanced-double.h
- * @ingroup field
- * @brief Balanced representation of <code>Z/mZ</code> over \c double .
- */
-
-#ifndef __LINBOX_modular_balanced_double_H
-#define __LINBOX_modular_balanced_double_H
-
-#ifdef __INTEL_COMPILER
-#define FmodF fmodf
-#else
-#define FmodF fmod
-#endif
-
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/util/field-axpy.h"
-#include "linbox/util/debug.h"
-#include <math.h>
-#include "linbox/field/field-traits.h"
-#include "linbox/randiter/modular-balanced.h"
-#include "linbox/randiter/nonzero.h"
-
-#include <fflas-ffpack/field/modular-balanced-double.h>
-
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
-	template< class Element >
-	class ModularBalanced;
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	template <class Element>
-	struct ClassifyRing<ModularBalanced<Element> >;
-
-	template <>
-	struct ClassifyRing<ModularBalanced<double> > {
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-	class MultiModDouble;
-
-	/*! \ingroup modular
-	 * Centered representation of \f$\mathbf{Z}/m\mathbf{Z}\f$.
-	 * If \c m is the modulus, then elements are represented in \f[ \left
-	 * \llbracket \left \lceil -\frac{m-1}{2} \right \rceil, \left \lceil
-	 * \frac{m-1}{2} \right \rceil \right \rrbracket.\f] This
-	 * representation allows more accumulations before a reduction is
-	 * necessary, at the cost of a more expensive reduction.
-	 */
-	template<>
-	class ModularBalanced<double> : public FieldInterface,
-	      public FFPACK::ModularBalanced<double> {
-
-	      public:
-		      typedef FFPACK::ModularBalanced<double> Father_t ;
-		      friend class FieldAXPY<ModularBalanced<double> >;
-		      friend class DotProductDomain<ModularBalanced<double> >;
-		      friend class MultiModDouble;
-
-		      typedef double Element;
-		      typedef ModularBalancedRandIter<double> RandIter;
-
-		      static ClassifyRing <ModularBalanced<double> >::categoryTag getCategory()
-		      {
-			      return ClassifyRing<ModularBalanced<double> >::categoryTag();
-		      }
-
-		      ModularBalanced (const integer& p, int e = 1) :
-			      Father_t((unsigned long)p)
-		      {
-#ifdef DEBUG
-			      if (p > (integer) ULONG_MAX)
-				      throw PreconditionFailed(__func__,__FILE__,__LINE__,"prime too big");
-			      if(modulus <= 1)
-				      throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be > 1");
-			      if(modulus > getMaxModulus())
-				      throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus is too big");
-#endif
-
-		      }
-
-		      using Father_t::cardinality ;
-		      integer &cardinality (integer &c) const
-		      {
-			      return c = integer(modulus);
-		      }
-
-		      using Father_t::characteristic ;
-		      integer &characteristic (integer &c) const
-		      {
-			      return c = integer(modulus);
-		      }
-
-		      using Father_t::convert ;
-		      integer &convert (integer &x, const Element &y) const
-		      {
-			      return x = integer (y);
-		      }
-
-		      using Father_t::init ;
-		      Element &init (Element &x, const integer &y) const
-		      {
-			      x = (Element)(y%lmodulus);
-			      if (x<mhalf_mod) return x += modulus ;
-			      else if (x>half_mod) return x -= modulus ;
-			      return  x ;
-		      }
-
-		      Element &init(Element &x) const
-		      {
-			      return x = 0 ;
-		      }
-
-		      //! @bug faux si modulus==2
-		      inline bool isMinusOne (const Element &x) const
-		      {
-			      return (x == -1.);
-		      }
-
-		      unsigned long AccBound(const Element&r) const
-		      {
-			      // Element one, zero ; init(one,1UL) ; init(zero,0UL);
-			      double max_double = (double) (1ULL<<DBL_MANT_DIG) - modulus ;
-			      double p = std::max(half_mod,-mhalf_mod) ;
-			      if (areEqual(zero,r))
-				      return (unsigned long) (double(max_double)/p) ;
-			      else if (areEqual(one,r))
-			      {
-				      if (modulus>= getMaxModulus())
-					      return 0 ;
-				      else
-					      return (unsigned long) (double(max_double)/(p*p)) ;
-			      }
-			      else
-				      throw LinboxError("Bad input, expecting 0 or 1");
-			      return 0;
-		      }
-
-	      };
-
-	//! Specialization  of FieldAXPY.
-	template <>
-	class FieldAXPY<ModularBalanced<double> > {
-	public:
-
-		typedef double Element;
-		typedef ModularBalanced<double> Field;
-
-		FieldAXPY (const Field &F) :
-			_field (F),
-			_y(0.) , _bound( (double) ((1ULL << 53) - (int) (_field.modulus*_field.modulus)))
-		{}
-
-		FieldAXPY (const FieldAXPY &faxpy) :
-			_field (faxpy._field),
-			_y(faxpy._y), _bound(faxpy._bound)
-		{}
-
-		FieldAXPY<ModularBalanced<double> > &operator = (const FieldAXPY &faxpy)
-		{
-			_field = faxpy._field;
-			_y= faxpy._y;
-			_bound= faxpy._bound;
-			return *this;
-		}
-
-		inline Element& mulacc (const Element &a, const Element &x)
-		{
-			//                 Element tmp= a*x;
-			//                 return accumulate(tmp);
-			return accumulate(a*x);
-		}
-
-		inline Element& accumulate (const Element &tmp)
-		{
-			_y += tmp;
-			if (_y > _bound)
-				return _y = fmod (_y, _field.modulus);
-			else
-				return _y;
-		}
-		inline Element& subumulate (const Element &tmp)
-		{
-			_y -= tmp;
-			if (_y < 0)
-				return _y += _field.modulus;
-			else
-				return _y;
-		}
-
-		inline Element& get (Element &y) {
-			_y = fmod (_y, _field.modulus);
-			return y=_y ;
-		}
-
-		inline FieldAXPY &assign (const Element y) {
-			_y = y;
-			return *this;
-		}
-
-		inline void reset() {
-			_y = 0.;
-		}
-
-		inline Element& set (const Element &tmp) {
-			_y = tmp;
-			if (_y > _bound)
-				return _y = fmod (_y, _field.modulus);
-			else
-				return _y;
-		}
-
-	private:
-
-		Field _field;
-		double _y;
-		double _bound;
-	};
-
-
-	//! Specialization  of DotProductDomain.
-	template <>
-	class DotProductDomain<ModularBalanced<double> > : private virtual VectorDomainBase<ModularBalanced<double> > {
-	private:
-		double _bound;
-		size_t _nmax;
-
-	public:
-		typedef double Element;
-		DotProductDomain (const ModularBalanced<double> &F) :
-			VectorDomainBase<ModularBalanced<double> > (F), _bound( (double) ( (1ULL<<53) - (int) (_field.modulus*_field.modulus)))
-		{
-			_nmax= (size_t)floor((double(1<<26)* double(1<<26)*2.)/ (_field.modulus * _field.modulus));
-		}
-
-	protected:
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-
-			double y = 0.;
-			double t = 0.;
-			if (v1.size() < _nmax) {
-				for (size_t i = 0; i< v1.size();++i)
-					y += v1[i] * v2[i] ;
-				y = fmod(y, _field.modulus);
-			}
-			else{
-				size_t i=0;
-				for (;i< v1.size()- _nmax ;i=i+_nmax){
-					for (size_t j=i;j<i+_nmax;++j)
-						y += v1[j] * v2[j];
-					t+=fmod(y, _field.modulus);
-					y=0.;
-				}
-				for (;i < v1.size();++i)
-					y += v1[i] * v2[i];
-				t+=fmod(y, _field.modulus);
-				y = fmod(t, _field.modulus);
-			}
-			return res = y;
-		}
-
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-
-			double y = 0.;
-			double t =0.;
-
-
-			if (v1.first.size() < _nmax) {
-				for (size_t i=0;i<v1.first.size();++i)
-					y+= v1.second[i] * v2[v1.first[i]];
-				y = fmod(y, _field.modulus);
-			}
-			else {
-				size_t i=0;
-				for (;i< v1.first.size()- _nmax ;i=i+_nmax){
-					for (size_t j=i;j<i+_nmax;++j)
-						y += v1.second[j] * v2[v1.first[j]];
-					t+=fmod(y, _field.modulus);
-					y=0.;
-				}
-				for (;i < v1.first.size();++i)
-					y += v1.second[i] * v2[v1.first[i]];
-				t+= fmod(y, _field.modulus);
-				y = fmod(t, _field.modulus);
-			}
-			return res = y;
-		}
-	};
-}
-
-#endif //__LINBOX_modular_balanced_double_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular-balanced-float.h b/linbox/field/Modular/modular-balanced-float.h
deleted file mode 100644
index 0d8f4f4..0000000
--- a/linbox/field/Modular/modular-balanced-float.h
+++ /dev/null
@@ -1,336 +0,0 @@
-/* field/modular-balanced-float.h
- * Copyright (C) 2003 Pascal Giorgi
- *               2005,2008 Clement Pernet
- * Written by Clement Pernet <clement.pernet at gmail.com>
- *            Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- * Modified   Brice Boyer <bboyer at imag.fr>
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-/*! @file field/Modular/modular-balanced-float.h
- * @ingroup field
- * @brief Balanced  representation of <code>Z/mZ</code> over \c float .
- */
-
-#ifndef __LINBOX_modular_balanced_float_H
-#define __LINBOX_modular_balanced_float_H
-
-#ifdef __INTEL_COMPILER
-#define FmodF fmodf
-#else
-#define FmodF fmod
-#endif
-
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/util/field-axpy.h"
-#include "linbox/util/debug.h"
-#include <math.h>
-#include "linbox/field/field-traits.h"
-#include "linbox/randiter/modular-balanced.h"
-#include "linbox/randiter/nonzero.h"
-
-#include <fflas-ffpack/field/modular-balanced-float.h>
-
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
-	template< class Element >
-	class ModularBalanced;
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	template <class Element>
-	struct ClassifyRing<ModularBalanced<Element> >;
-
-	template <>
-	struct ClassifyRing<ModularBalanced<float> > {
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-	class MultiModFloat;
-
-	/// \ingroup field
-	template <>
-	class ModularBalanced<float> : public FieldInterface,
-	      public FFPACK::ModularBalanced<float> {
-	      public :
-		      typedef float Element;
-		      typedef FFPACK::ModularBalanced<float> Father_t ;
-
-		      friend class FieldAXPY<ModularBalanced<Element> >;
-		      friend class DotProductDomain<ModularBalanced<Element> >;
-		      friend class MultiModFloat;
-
-		      typedef ModularBalancedRandIter<Element> RandIter;
-
-		      static ClassifyRing <ModularBalanced<Element> >::categoryTag
-		      getCategory()
-		      {
-			      return ClassifyRing<ModularBalanced<Element> >::categoryTag();
-		      }
-
-		      ModularBalanced (const integer& p, int e = 1) :
-			      Father_t((unsigned long)p)
-		      {
-#ifdef DEBUG
-			      if(modulus <= 1)
-				      throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be > 1");
-			      if(modulus > getMaxModulus())
-				      throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus is too big");
-			      // check integer not too big.
-#endif
-
-		      }
-
-
-		      using Father_t::cardinality ;
-		      inline integer &cardinality (integer &c) const
-		      {
-			      return c = integer(modulus);
-		      }
-
-		      using Father_t::characteristic ;
-		      inline integer &characteristic (integer &c) const
-		      {
-			      return c = integer(modulus);
-		      }
-
-		      using Father_t::convert ;
-		      inline integer &convert (integer &x, const Element &y) const
-		      {
-			      // if ( y < 0. )
-				      // return x = integer (y + modulus) ;
-			      // else
-				      return x = integer (y);
-		      }
-
-		      using Father_t::init ;
-		      inline Element &init (Element &x, const integer &y) const
-		      {
-			      x = (Element)(y%lmodulus);
-			      if (x > half_mod) return   x -= modulus;
-			      else if (x < mhalf_mod) return x += modulus;
-
-			      return x;
-		      }
-
-		      Element &init(Element &x) const
-		      {
-			      return x = 0 ;
-		      }
-
-		      inline bool isMinusOne (const Element &x) const
-		      {
-			      return (x == -1.);
-		      }
-
-		      unsigned long AccBound(const Element&r) const
-		      {
-			      // Element one, zero ; init(one,1UL) ; init(zero,0UL);
-			      double max_double = (double) (1ULL<<FLT_MANT_DIG) - modulus ;
-			      double p = std::max(half_mod,-mhalf_mod) ;
-			      if (areEqual(zero,r))
-				      return (unsigned long) (double(max_double)/p) ;
-			      else if (areEqual(one,r))
-			      {
-				      if (modulus>= getMaxModulus())
-					      return 0 ;
-				      else
-					      return (unsigned long) (double(max_double)/(p*p)) ;
-			      }
-			      else
-				      throw LinboxError("Bad input, expecting 0 or 1");
-			      return 0;
-		      }
-
-	      };
-
-	template <>
-	class FieldAXPY<ModularBalanced<float> > {
-	public:
-		typedef float Element;
-		typedef ModularBalanced<Element> Field;
-
-		FieldAXPY (const Field &F) :
-			_field (F),
-			_y(0.) , _bound( (Element) (((1ULL << 24) - (int) (_field.modulus*_field.modulus))))
-		{}
-
-		FieldAXPY (const FieldAXPY &faxpy) :
-			_field (faxpy._field),
-			_y(faxpy._y), _bound(faxpy._bound)
-		{}
-
-		FieldAXPY<ModularBalanced<Element> > &operator = (const FieldAXPY &faxpy) {
-			_field = faxpy._field;
-			_y= faxpy._y;
-			_bound= faxpy._bound;
-			return *this;
-		}
-
-		inline Element& mulacc (const Element &a, const Element &x) {
-			//                 Element tmp= a*x;
-			//                 return accumulate(tmp);
-			return accumulate(a*x);
-		}
-
-		inline Element& accumulate (const Element &tmp) {
-			_y += tmp;
-			if (_y > _bound)
-				return _y = fmodf (_y, _field.modulus);
-			else
-				return _y;
-		}
-		inline Element& subumulate (const Element &tmp) {
-			_y -= tmp;
-			if (_y < 0)
-				return _y += _field.modulus;
-			else
-				return _y;
-		}
-
-		inline Element& get (Element &y) {
-			_y =  fmodf (_y, _field.modulus);
-			return y=_y ;
-		}
-
-		inline FieldAXPY &assign (const Element y) {
-			_y = y;
-			return *this;
-		}
-
-		inline void reset() {
-			_y = 0.;
-		}
-
-		inline Element& set (const Element &tmp) {
-			_y = tmp;
-			if (_y > _bound)
-				return _y =  fmodf (_y, _field.modulus);
-			else
-				return _y;
-		}
-
-	private:
-		Field _field;
-		Element _y;
-		Element _bound;
-	};
-
-
-	template <>
-	class DotProductDomain<ModularBalanced<float> > : private virtual VectorDomainBase<ModularBalanced<float> > {
-	public:
-		typedef float Element;
-		DotProductDomain (const ModularBalanced<Element> &F) :
-			VectorDomainBase<ModularBalanced<Element> > (F), _bound( (Element) ( (1ULL<<24) - (int) (_field.modulus*_field.modulus)))
-		{
-			_nmax= (size_t)floor((Element(1<<11)* Element(1<<11)*2.)/ (_field.modulus * _field.modulus));
-		}
-
-	protected:
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-
-			Element y = 0.;
-			Element t = 0.;
-			if (v1.size() < _nmax) {
-				for (size_t i = 0; i< v1.size();++i)
-					y += v1[i] * v2[i] ;
-				y =  fmodf(y, _field.modulus);
-			}
-			else{
-				size_t i=0;
-				for (;i< v1.size()- _nmax ;i=i+_nmax){
-					for (size_t j=i;j<i+_nmax;++j)
-						y += v1[j] * v2[j];
-					t+= fmodf(y, _field.modulus);
-					y=0.;
-				}
-				for (;i < v1.size();++i)
-					y += v1[i] * v2[i];
-				t+= fmodf(y, _field.modulus);
-				y = fmodf(t, _field.modulus);
-			}
-			return res = y;
-		}
-
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-
-			Element y = 0.;
-			Element t =0.;
-
-
-			if (v1.first.size() < _nmax) {
-				for (size_t i=0;i<v1.first.size();++i)
-					y+= v1.second[i] * v2[v1.first[i]];
-				y = fmodf(y, _field.modulus);
-			}
-			else {
-				size_t i=0;
-				for (;i< v1.first.size()- _nmax ;i=i+_nmax){
-					for (size_t j=i;j<i+_nmax;++j)
-						y += v1.second[j] * v2[v1.first[j]];
-					t+=fmodf(y, _field.modulus);
-					y=0.;
-				}
-				for (;i < v1.first.size();++i)
-					y += v1.second[i] * v2[v1.first[i]];
-				t+= fmodf(y, _field.modulus);
-				y = fmodf(t, _field.modulus);
-			}
-			return res = y;
-		}
-	private:
-		Element _bound;
-		size_t _nmax;
-
-	};
-} // Namespace LinBox
-
-#include "linbox/randiter/modular-balanced.h"
-#include "linbox/randiter/nonzero.h"
-
-#undef FmodF
-
-#endif //__LINBOX_modular_balanced_float_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular-balanced-int32.h b/linbox/field/Modular/modular-balanced-int32.h
deleted file mode 100644
index 82282a3..0000000
--- a/linbox/field/Modular/modular-balanced-int32.h
+++ /dev/null
@@ -1,336 +0,0 @@
-/* Copyright (C) 2009 LinBox
- * Written by C Pernet
- * updated to compilable condition by <brice.boyer at imag.fr>
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-
-/*! @file field/Modular/modular-balanced-int32.h
- * @ingroup field
- * @brief Balanced representation of <code>Z/mZ</code> over \c int32_t .
- */
-
-#ifndef __LINBOX_modular_balanced_int32_H
-#define __LINBOX_modular_balanced_int32_H
-
-
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/util/field-axpy.h"
-#include "linbox/util/debug.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/field/Modular/modular-int32.h"
-
-#include <fflas-ffpack/field/modular-balanced-int32.h>
-
-#ifndef LINBOX_MAX_INT /* 2147483647 */
-#define LINBOX_MAX_INT INT32_MAX
-#endif
-
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
-	template< class Element >
-	class ModularBalanced;
-	template< class Element >
-	class ModularBalancedRandIter;
-	template< class Field, class RandIter >
-	class NonzeroRandIter;
-
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	template<class Element>
-	struct ClassifyRing<ModularBalanced<Element> >;
-
-	template<>
-	struct ClassifyRing<ModularBalanced<int32_t> > {
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-	/// \ingroup field
-	template <>
-	class ModularBalanced<int32_t> : public FieldInterface,
-	      public FFPACK::ModularBalanced<int32_t>	{
-
-	public:
-		typedef FFPACK::ModularBalanced<int32_t> Father_t ;
-
-		friend class FieldAXPY<ModularBalanced<int32_t> >;
-		friend class DotProductDomain<ModularBalanced<int32_t> >;
-
-		typedef int32_t Element;
-		typedef ModularBalancedRandIter<int32_t> RandIter;
-
-		ModularBalanced(int32_t p, int32_t e=1) :
-			Father_t(p,e)
-		{}
-
-		using Father_t::cardinality ;
-		integer &cardinality (integer &c) const
-		{
-			return c = modulus;
-		}
-
-		using Father_t::characteristic ;
-		integer &characteristic (integer &c) const
-		{
-		       	return c = modulus;
-		}
-
-		using Father_t::convert;
-		// this function converts an int to a natural number ?
-		integer &convert (integer &x, const Element &y) const
-		{
-			if(y >= 0)
-				return x = y;
-			else
-				return x = y + modulus;
-		}
-
-		using Father_t::init ;
-		Element &init (Element &x, const integer &y) const
-		{
-			x = Element(y % (long)modulus);
-
-			if (x < mhalf_mod)
-				x += modulus;
-			else if (x > half_mod)
-				x -= modulus;
-
-			return x;
-		}
-
-		Element &init(Element &x) const
-		{
-			return x = 0 ;
-		}
-
-	};
-
-	template <>
-	class FieldAXPY<ModularBalanced<int32_t> > {
-	public:
-
-		typedef int32_t Element;
-		typedef ModularBalanced<int32_t> Field;
-
-		FieldAXPY (const Field &F) :
-			_field (F),_y(0),_times(0)
-		{ }
-
-
-		FieldAXPY (const FieldAXPY &faxpy) :
-			_field (faxpy._field), _y (0),_times(0)
-		{}
-
-		FieldAXPY<ModularBalanced<int32_t> > &operator = (const FieldAXPY &faxpy)
-		{
-			_field = faxpy._field;
-			_y = faxpy._y;
-			_times = faxpy._times;
-			return *this;
-		}
-
-		inline int64_t& mulacc (const Element &a, const Element &x)
-		{
-			int64_t t = (int64_t) a * (int64_t)   x;
-			if (_times < blocksize) {
-				++_times;
-				return _y += t;
-			}
-
-			else {
-				_times = 1;
-				normalize();
-				return _y += t;
-			}
-		}
-
-		inline int64_t& accumulate (const Element &t)
-		{
-			if (_times < blocksize) {
-				++_times;
-				return _y += t;
-			}
-
-			else {
-				_times = 1;
-				normalize();
-				return _y += t;
-			}
-		}
-
-		inline Element& get (Element &y)
-		{
-
-			normalize();
-
-			y = Element(_y);
-
-			if (y > _field.half_mod)
-				y -= _field.modulus;
-			else if (y < _field.mhalf_mod)
-				y += _field.modulus;
-
-			return y;
-		}
-
-		inline FieldAXPY &assign (const Element y)
-		{
-			_y = y;
-			return *this;
-		}
-
-		inline void reset()
-		{
-			_y = 0;
-		}
-
-	private:
-
-		Field _field;
-		int64_t _y;
-		int32_t _times;
-		static const int32_t blocksize = 32;
-
-		inline void normalize() {
-			_y = (int32_t)_y -(int32_t)(int64_t)((double) _y * _field.modulusinv) * (int32_t)_field.modulus;
-		}
-
-	};
-
-
-	template <>
-	class DotProductDomain<ModularBalanced<int32_t> > : private virtual VectorDomainBase<ModularBalanced<int32_t> > {
-
-	private:
-		const int32_t blocksize;
-
-	public:
-		typedef int32_t Element;
-		DotProductDomain (const ModularBalanced<int32_t> &F) :
-			VectorDomainBase<ModularBalanced<int32_t> > (F) ,blocksize(32)
-		{ }
-
-	protected:
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-
-			typename Vector1::const_iterator pv1,pv1e;
-			typename Vector2::const_iterator pv2;
-
-			int64_t y = 0;
-			int64_t t;
-			// int32_t times = 0;
-
-			pv1 = pv1e = v1.begin();
-			pv2 = v2.begin();
-
-			for(size_t i = 0; i < v1.size() / blocksize ;++i) {
-				pv1e = pv1e + blocksize;
-				for(;pv1 != pv1e;++pv1,++pv2) {
-					t = (((int64_t) *pv1 ) * ((int64_t) *pv2 ));
-					y += t;
-				}
-				normalize(y);
-			}
-
-			for(;pv1 != v1.end(); ++pv1, ++pv2) {
-				t = (((int64_t) *pv1 ) * ((int64_t) *pv2 ));
-				y += t;
-			}
-
-			normalize(y);
-			res = (Element) y;
-
-			if (res > _field.half_mod) res -= _field.modulus;
-			else if(res < _field.mhalf_mod) res += _field.modulus;
-
-			return res;
-
-		}
-
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-
-			typename Vector1::first_type::const_iterator i_idx, i_idxe;
-			typename Vector1::second_type::const_iterator i_elt;
-
-			int64_t y = 0;
-			int64_t t;
-
-			i_idx = i_idxe = v1.first.begin();
-			i_elt = v1.second.begin();
-
-			for(size_t i = 0; i < v1.first.size() / blocksize ; ++i) {
-				i_idxe = i_idxe + blocksize;
-				for(;i_idx!= i_idxe;++i_idx, ++i_elt) {
-					t = ( (int64_t) *i_elt ) * ( (int64_t) v2[*i_idx] );
-					y += t;
-				}
-				normalize(y);
-			}
-
-
-			for(;i_idx!= v1.first.end();++i_idx, ++i_elt) {
-				t = ( (int64_t) *i_elt ) * ( (int64_t) v2[*i_idx] );
-				y += t;
-			}
-
-			normalize(y);
-
-			res = (Element) y;
-			if (res > _field.half_mod) res -= _field.modulus;
-			else if(res < _field.mhalf_mod) res += _field.modulus;
-
-			return res;
-		}
-
-		inline void normalize(int64_t& _y) const
-		{
-			_y = (int32_t)_y -(int32_t)(int64_t)((double) _y * _field.modulusinv) * (int32_t)_field.modulus;
-		}
-
-	};
-}
-
-#include "linbox/randiter/modular-balanced.h"
-#endif //__LINBOX_modular_balanced_int32_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular-balanced-int64.h b/linbox/field/Modular/modular-balanced-int64.h
deleted file mode 100644
index 4a25eb3..0000000
--- a/linbox/field/Modular/modular-balanced-int64.h
+++ /dev/null
@@ -1,345 +0,0 @@
-/* Copyright (C) 2010 LinBox
- * Adapted by B Boyer <brice.boyer at imag.fr>
- * (from other modular-balanced* files)
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-
-/*! @file field/Modular/modular-balanced-int64.h
- * @ingroup field
- * @brief Balanced representation of <code>Z/mZ</code> over \c int64_t .
- */
-
-#ifndef __LINBOX_modular_balanced_int64_H
-#define __LINBOX_modular_balanced_int64_H
-
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/util/field-axpy.h"
-#include "linbox/util/debug.h"
-#include "linbox/field/field-traits.h"
-
-#include <fflas-ffpack/field/modular-balanced-int64.h>
-
-#ifndef LINBOX_MAX_INT64
-#ifdef __x86_64__
-#define LINBOX_MAX_INT64 INT64_MAX
-#else
-#define LINBOX_MAX_INT64 INT64_MAX
-#endif
-#endif
-
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
-	template< class Element >
-	class ModularBalanced;
-	template< class Element >
-	class ModularBalancedRandIter;
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	template<class Element>
-	struct ClassifyRing<ModularBalanced<Element> >;
-
-	template<>
-	struct ClassifyRing<ModularBalanced<int64_t> > {
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-	/// \ingroup field
-	template <>
-	class ModularBalanced<int64_t> : public FieldInterface
-	      public FFPACK::ModularBalanced<int64_t>	{
-
-	public:
-
-		friend class FieldAXPY<ModularBalanced<int64_t> >;
-		friend class DotProductDomain<ModularBalanced<int64_t> >;
-
-		typedef FFPACK::ModularBalanced<int64_t> Father_t ;
-
-		typedef int64_t Element;
-		typedef ModularBalancedRandIter<int64_t> RandIter;
-
-		using Father_t:: cardinality;
-		integer &cardinality (integer &c) const
-		{
-			return c = modulus;
-		}
-
-		using Father_t:: characteristic;
-		integer &characteristic (integer &c) const
-		{
-		       	return c = modulus;
-		}
-
-		using Father_t:: convert;
-		// this function converts an int to a natural number ?
-		integer &convert (integer &x, const Element &y) const
-		{
-			if(y >= 0)
-				return x = y;
-			else
-				return x = y + modulus;
-		}
-
-		using Father_t:: init;
-		Element &init (Element &x, const integer &y) const
-		{
-			x = y % (long) (modulus);
-			if (x < mhalf_mod) x += modulus;
-			else if (x > half_mod) x -= modulus;
-			return x;
-		}
-
-		Element &init(Element &x) const
-		{
-			return x = 0 ;
-		}
-
-	private:
-
-	};
-
-	template <>
-	class FieldAXPY<ModularBalanced<int64_t> > {
-	public:
-
-		typedef int64_t Element;
-		typedef ModularBalanced<int64_t> Field;
-
-		FieldAXPY (const Field &F) :
-			_field (F),_y(0),_times(0)
-		{
-		}
-
-
-		FieldAXPY (const FieldAXPY &faxpy) :
-			_field (faxpy._field), _y (0),_times(0)
-		{}
-
-		FieldAXPY<ModularBalanced<int64_t> > &operator = (const FieldAXPY &faxpy)
-		{
-			_field = faxpy._field;
-			_y = faxpy._y;
-			_times = faxpy._times;
-			return *this;
-		}
-
-		inline int64_t& mulacc (const Element &a, const Element &x)
-		{
-			int64_t t = (int64_t) a * (int64_t)   x;
-			if (_times < blocksize)
-			{
-				++_times;
-				return _y += t;
-			}
-
-			else {
-				_times = 1;
-				normalize();
-				return _y += t;
-			}
-		}
-
-		inline int64_t& accumulate (const Element &t)
-		{
-			if (_times < blocksize)
-			{
-				++_times;
-				return _y += t;
-			}
-
-			else {
-				_times = 1;
-				normalize();
-				return _y += t;
-			}
-		}
-
-		inline Element& get (Element &y)
-		{
-
-			normalize();
-
-			y = _y;
-
-			if (y > _field.half_mod)
-				y -= _field.modulus;
-			else if (y < _field.mhalf_mod)
-				y += _field.modulus;
-
-			return y;
-		}
-
-		inline FieldAXPY &assign (const Element y)
-		{
-			_y = y;
-			return *this;
-		}
-
-		inline void reset()
-		{
-			_y = 0;
-		}
-
-	private:
-
-		Field _field;
-		int64_t _y;
-		int64_t _times;
-		//!@todo tune me ?
-		static const int64_t blocksize = 32;
-
-		inline void normalize()
-		{
-			_y = (int64_t)_y -(int64_t)(int64_t)((double) _y * _field.modulusinv) * (int64_t)_field.modulus;
-		}
-
-	};
-
-
-	template <>
-	class DotProductDomain<ModularBalanced<int64_t> > : private virtual VectorDomainBase<ModularBalanced<int64_t> > {
-
-	private:
-		const int64_t blocksize;
-
-	public:
-		typedef int64_t Element;
-		DotProductDomain (const ModularBalanced<int64_t> &F) :
-			VectorDomainBase<ModularBalanced<int64_t> > (F) ,blocksize(32)
-		{ }
-
-	protected:
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-
-			typename Vector1::const_iterator pv1,pv1e;
-			typename Vector2::const_iterator pv2;
-
-			int64_t y = 0;
-			int64_t t;
-			int64_t times = 0;
-
-			pv1 = pv1e = v1.begin();
-			pv2 = v2.begin();
-
-			for(int i = 0; i < v1.size() / blocksize ;++i)
-			{
-				pv1e = pv1e + blocksize;
-				for(;pv1 != pv1e;++pv1,++pv2)
-				{
-					t = (((int64_t) *pv1 ) * ((int64_t) *pv2 ));
-					y += t;
-				}
-				normalize(y);
-			}
-
-			for(;pv1 != v1.end(); ++pv1, ++pv2)
-			{
-				t = (((int64_t) *pv1 ) * ((int64_t) *pv2 ));
-				y += t;
-			}
-
-			normalize(y);
-			res = y;
-
-			if (res > _field.half_mod) res -= _field.modulus;
-			else if(res < _field.mhalf_mod) res += _field.modulus;
-
-			return res;
-
-		}
-
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-
-			typename Vector1::first_type::const_iterator i_idx, i_idxe;
-			typename Vector1::second_type::const_iterator i_elt;
-
-			int64_t y = 0;
-			int64_t t;
-
-			i_idx = i_idxe = v1.first.begin();
-			i_elt = v1.second.begin();
-
-			for(int i = 0; i < v1.first.size() / blocksize ; ++i)
-			{
-				i_idxe = i_idxe + blocksize;
-				for(;i_idx!= i_idxe;++i_idx, ++i_elt)
-				{
-					t = ( (int64_t) *i_elt ) * ( (int64_t) v2[*i_idx] );
-					y += t;
-				}
-				normalize(y);
-			}
-
-
-			for(;i_idx!= v1.first.end();++i_idx, ++i_elt)
-			{
-				t = ( (int64_t) *i_elt ) * ( (int64_t) v2[*i_idx] );
-				y += t;
-			}
-
-			normalize(y);
-
-			res = y;
-			if (res > _field.half_mod) res -= _field.modulus;
-			else if(res < _field.mhalf_mod) res += _field.modulus;
-
-			return res;
-		}
-
-		inline void normalize(int64_t& _y) const
-		{
-			_y = (int64_t)_y -(int64_t)(int64_t)((double) _y * _field.modulusinv) * (int64_t)_field.modulus;
-		}
-
-	};
-}
-
-#undef LINBOX_MAX_INT64
-
-#include "linbox/randiter/modular.h" // do not unse _LB_MAX inside this one !
-
-
-#endif //__LINBOX_modular_balanced_int64_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular-byte.h b/linbox/field/Modular/modular-byte.h
deleted file mode 100644
index b49f9f4..0000000
--- a/linbox/field/Modular/modular-byte.h
+++ /dev/null
@@ -1,773 +0,0 @@
-/* Copyright (C) 2010 LinBox
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*! @file field/Modular/modular-byte.h
- * @ingroup field
- * @brief  representation of <code>Z/mZ</code> over \c byte .
- */
-#ifndef __LINBOX_modular_bit_H
-#define __LINBOX_modular_bit_H
-
-
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/util/debug.h"
-#include "linbox/field/field-traits.h"
-
-#ifndef LINBOX_MAX_INT8 /* 127 */
-#define LINBOX_MAX_INT8 INT8_MAX
-#endif
-
-#ifdef __ICC
-#pragma warning(disable:2259)
-#endif
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
-	template<class Element>
-	class Modular;
-
-	template<class Element>
-	class ModularRandIter;
-
-	template<class Field>
-	class FieldAXPY;
-
-	template<class Field>
-	class DotProductDomain;
-
-	template<class Field>
-	class MVProductDomain;
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	template <class Element>
-	struct ClassifyRing<Modular<Element> >;
-
-	template <>
-	struct ClassifyRing<Modular<int8_t> >{
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-	/** \brief Specialization of Modular to signed 8 bit element type with efficient dot product.
-	 *
-	 * Efficient element operations for dot product, mul, axpy, by using floating point
-	 * inverse of modulus (borrowed from NTL) and some use of non-normalized intermediate values.
-	 *
-	 * Requires: modulus < 2^7.
-	 * Intended use: prime modulus < 2^7.
-	 \ingroup field
-	 */
-	template <>
-	class Modular<int8_t> : public FieldInterface {
-	public:
-		typedef int8_t Element;
-	protected:
-		Element modulus;
-		unsigned long lmodulus ;
-		double modulusinv;
-	public:
-		const Element one,zero,mOne;
-		friend class FieldAXPY<Modular<Element> >;
-		friend class DotProductDomain<Modular<Element> >;
-		friend class MVProductDomain<Modular<Element> >;
-
-		typedef ModularRandIter<Element> RandIter;
-
-		//default modular field,taking 65521 as default modulus
-		Modular () :
-			modulus(13),lmodulus(13)
-			,one((Element)1),zero((Element)0),mOne(Element(modulus-(Element)1))
-		{
-			modulusinv=1/(double)13;
-		}
-
-		Modular (int value, int exp = 1)  :
-			modulus(Element(value)),lmodulus((unsigned int)value)
-			,one((Element)1),zero((Element)0),mOne(Element(modulus-(Element)1))
-		{
-			modulusinv = 1 / ((double) value);
-#ifdef DEBUG
-			if(exp != 1) throw PreconditionFailed(__func__,__FILE__,__LINE__,"exponent must be 1");
-			if(value <= 1) throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be > 1");
-			integer max;
-			if(value > FieldTraits< Modular<Element> >::maxModulus(max)) throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus is too big");
-#endif
-		}
-
-		Modular(const Modular<Element>& mf) :
-			modulus(mf.modulus),lmodulus(mf.lmodulus),modulusinv(mf.modulusinv)
-			,one(mf.one),zero(mf.zero),mOne(mf.mOne)
-		{}
-
-		Modular &operator=(const Modular<Element> &F)
-		{
-			modulus    = F.modulus;
-			lmodulus   = F.lmodulus;
-			modulusinv = F.modulusinv;
-			F.assign(const_cast<Element&>(one),F.one);
-			F.assign(const_cast<Element&>(zero),F.zero);
-			F.assign(const_cast<Element&>(mOne),F.mOne);
-
-			return *this;
-		}
-
-
-		inline integer &cardinality (integer &c) const
-		{
-			return c = modulus;
-		}
-
-		inline integer &characteristic (integer &c) const
-		{
-			return c = modulus;
-		}
-
-		inline unsigned long cardinality () const
-		{
-			return  lmodulus;
-		}
-
-		inline unsigned  long characteristic () const
-		{
-			return  lmodulus;
-		}
-
-
-		inline integer &convert (integer &x, const Element &y) const
-		{
-			return x = y;
-		}
-
-		inline std::ostream &write (std::ostream &os) const
-		{
-			return os << "Element mod " << (int)modulus;
-		}
-
-		inline std::istream &read (std::istream &is)
-		{
-			int prime;
-			is >> prime;
-			modulus = (Element) prime;
-			modulusinv = 1 /((double) modulus );
-#ifdef DEBUG
-			if(prime <= 1) throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be > 1");
-			integer max;
-			if(prime > FieldTraits< Modular<Element> >::maxModulus(max)) throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus is too big");
-#endif
-
-			return is;
-		}
-
-		inline std::ostream &write (std::ostream &os, const Element &x) const
-		{
-			return os << x;
-		}
-
-		inline std::istream &read (std::istream &is, Element &x) const
-		{
-			integer tmp;
-			is >> tmp;
-			init(x,tmp);
-			return is;
-		}
-
-
-		inline Element &init (Element &x, const integer &y) const
-		{
-			x =(Element)((int16_t) (y % (long) (modulus)));
-			if (x < 0) x=Element(x+modulus);
-			return x;
-		}
-
-		inline Element& init(Element& x, int y ) const
-		{
-			x = Element(y % int(modulus));
-			if ( x < 0 ) x=Element(x+modulus);
-			return x;
-		}
-
-		inline Element& init(Element& x, long y) const
-		{
-			x = Element(y % long(modulus));
-			if ( x < 0 ) x=Element(x+modulus);
-			return x;
-		}
-
-	inline Element& init(Element& x, long unsigned y) const
-		{
-			x = Element (y % lmodulus);
-			if ( x < 0 ) x=Element(x+modulus);
-			return x;
-		}
-
-
-	Element& init(Element&x) const
-	{
-		return x = 0 ;
-	}
-
-		inline Element& assign(Element& x, const Element& y) const
-		{
-			return x=y;
-		}
-
-
-		inline bool areEqual (const Element &x, const Element &y) const
-		{
-			return x == y;
-		}
-
-		inline  bool isZero (const Element &x) const
-		{
-			return x == 0;
-		}
-
-		inline bool isOne (const Element &x) const
-		{
-			return x == 1;
-		}
-
-		inline Element &add (Element &x, const Element &y, const Element &z) const
-		{
-			x = Element(y + z);
-			if ( (uint8_t)x >= modulus )
-				x =Element(( (uint8_t)x )- modulus);
-			return x;
-		}
-
-		inline Element &sub (Element &x, const Element &y, const Element &z) const
-		{
-			x = Element(y - z);
-			if (x < 0) x=Element(x+modulus);
-			return x;
-		}
-
-		inline Element &mul (Element &x, const Element &y, const Element &z) const
-		{
-			Element q;
-
-			double ab=((double) y)* ((double) z);
-			q  = (Element)(ab*modulusinv);  // q could be off by (+/-) 1
-			x = (Element) (ab - ((double) q )* ((double) modulus));
-
-
-			if (x >= modulus)
-				x=Element(x-modulus);
-			else if (x < 0)
-				x=Element(x+modulus);
-
-			return x;
-		}
-
-		inline Element &div (Element &x, const Element &y, const Element &z) const
-		{
-			Element temp;
-			inv (temp, z);
-			return mul (x, y, temp);
-		}
-
-		inline Element &neg (Element &x, const Element &y) const
-		{
-			if(y==0) return x=0;
-			else return x=Element(modulus-y);
-		}
-
-		inline Element &inv (Element &x, const Element &y) const
-		{
-			Element d, t;
-			XGCD(d, x, t, y, modulus);
-#ifdef DEBUG
-			if (d != 1)
-				throw PreconditionFailed(__func__,__FILE__,__LINE__,"InvMod: inverse undefined");
-#endif
-			if (x < 0)
-				return x=Element(x+modulus);
-			else
-				return x;
-		}
-
-		inline Element &axpy (Element &r,
-				      const Element &a,
-				      const Element &x,
-				      const Element &y) const
-		{
-			Element q;
-
-			double ab = ((double) a)* ((double) x) + y;
-			q  = (Element)(ab*modulusinv);  // q could be off by (+/-) 1
-			r = (Element) (ab - ((double) q )* ((double) modulus));
-
-
-			if (r >= modulus)
-				r=Element(r-modulus);
-			else if (x < 0)
-				r=Element(r+modulus);
-
-			return r;
-
-		}
-
-		inline Element &addin (Element &x, const Element &y) const
-		{
-			x = Element(x+y);
-			if ( ((uint8_t) x) >= modulus )
-				x = Element( ((uint8_t) x)-modulus );
-			return x;
-		}
-
-		inline Element &subin (Element &x, const Element &y) const
-		{
-			x = Element(x-y);
-			if (x < 0) x=Element(x+modulus);
-			return x;
-		}
-
-		inline Element &mulin (Element &x, const Element &y) const
-		{
-			return mul(x,x,y);
-		}
-
-		inline Element &divin (Element &x, const Element &y) const
-		{
-			return div(x,x,y);
-		}
-
-		inline Element &negin (Element &x) const
-		{
-			if (x == 0) return x;
-			else return x = Element(modulus - x);
-		}
-
-		inline Element &invin (Element &x) const
-		{
-			return inv (x, x);
-		}
-
-		inline Element &axpyin (Element &r, const Element &a, const Element &x) const
-		{
-
-
-			Element q;
-
-			double ab = ((double) a)* ((double) x) + r;
-			q  = (Element)(ab*modulusinv);  // q could be off by (+/-) 1
-			r = (Element) (ab - ((double) q )* ((double) modulus));
-
-
-			if (r >= modulus)
-				r=Element(r-modulus);
-			else if (x < 0)
-				r=Element(r+modulus);
-
-			return r;
-		}
-
-		static inline Element getMaxModulus()
-		{
-		       	return INT8_MAX;
-		} // 2^7-1
-
-
-	private:
-
-		static void XGCD(Element& d, Element& s, Element& t, Element a, Element b)
-		{
-			int32_t u, v, u0, v0, u1, v1, u2, v2, q, r;
-
-			Element aneg = 0, bneg = 0;
-
-			if (a < 0) {
-#ifdef DEBUG
-				if (a < -LINBOX_MAX_INT8) throw PreconditionFailed(__func__,__FILE__,__LINE__,"XGCD: integer overflow");
-#endif
-				a = Element(-a);
-				aneg = 1;
-			}
-
-			if (b < 0) {
-#ifdef DEBUG
-				if (b < -LINBOX_MAX_INT8) throw PreconditionFailed(__func__,__FILE__,__LINE__,"XGCD: integer overflow");
-#endif
-				b = (Element)-b;
-				bneg = 1;
-			}
-
-			u1 = 1; v1 = 0;
-			u2 = 0; v2 = 1;
-			u = a; v = b;
-
-			while (v != 0) {
-				q = u / v;
-				r = u % v;
-				u = v;
-				v = r;
-				u0 = u2;
-				v0 = v2;
-				u2 =  u1 - q*u2;
-				v2 = v1- q*v2;
-				u1 = u0;
-				v1 = v0;
-			}
-
-			if (aneg)
-				u1 = -u1;
-
-			if (bneg)
-				v1 = -v1;
-
-			d = Element(u);
-			s = Element(u1);
-			t = Element(v1);
-		}
-
-	};
-
-	template <>
-	class FieldAXPY<Modular<int8_t> > {
-	public:
-
-		typedef int8_t Element;
-		typedef Modular<int8_t> Field;
-
-		FieldAXPY (const Field &F) :
-			_field (F),_y(0)
-		{
-		}
-
-		FieldAXPY (const FieldAXPY &faxpy) :
-			_field (faxpy._field), _y (0)
-		{}
-
-		FieldAXPY<Modular<int8_t> > &operator = (const FieldAXPY &faxpy)
-		{
-			_field = faxpy._field;
-			_y = faxpy._y;
-
-			return *this;
-		}
-
-		inline uint64_t& mulacc (const Element &a, const Element &x)
-		{
-			uint64_t t = ( (uint16_t) a ) * ( (uint16_t) x );
-			return _y +=t;
-		}
-
-		inline uint64_t& accumulate (const Element &t)
-		{
-			return _y += (uint64_t)t;
-		}
-
-		inline Element& get (Element &y)
-		{
-			y = Element(_y % (uint64_t) _field.modulus);
-			return y;
-		}
-
-		inline FieldAXPY &assign (const Element y)
-		{
-			_y = (uint64_t) y;
-			return *this;
-		}
-
-		inline void reset()
-		{
-			_y = 0;
-		}
-
-	private:
-
-		Field _field;
-		uint64_t _y;
-		uint8_t _two_64;
-	};
-
-
-	template <>
-	class DotProductDomain<Modular<int8_t> > : private virtual VectorDomainBase<Modular<int8_t> > {
-
-	public:
-		typedef int8_t Element;
-		DotProductDomain (const Modular<int8_t> &F) :
-			VectorDomainBase<Modular<int8_t> > (F)
-		{ }
-
-	protected:
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-
-			typename Vector1::const_iterator i;
-			typename Vector2::const_iterator j;
-
-			uint64_t y = 0;
-			// uint64_t t;
-
-			for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j) {
-				y  += ( (uint16_t) *i ) * ( (uint16_t) *j );
-			}
-
-
-			y %= (uint64_t) _field.modulus;
-
-			return res = (Element) y;
-
-		}
-
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-			typename Vector1::first_type::const_iterator i_idx;
-			typename Vector1::second_type::const_iterator i_elt;
-
-			uint64_t y = 0;
-
-			for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt) {
-				y += ( (uint16_t) *i_elt ) * ( (uint16_t) v2[*i_idx] );
-			}
-
-			y %= (uint64_t) _field.modulus;
-
-			return res = (Element)y;
-
-		}
-
-	};
-
-
-	template <>
-	class MVProductDomain<Modular<int8_t> >
-	{
-	public:
-
-		typedef int8_t Element;
-
-	protected:
-		template <class Vector1, class Matrix, class Vector2>
-		inline Vector1 &mulColDense
-		(const VectorDomain<Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
-		{
-			return mulColDenseSpecialized
-			(VD, w, A, v, VectorTraits<typename Matrix::Column>::VectorCategory ());
-		}
-
-	private:
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::DenseVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseSequenceVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseAssociativeVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseParallelVectorTag) const;
-
-		mutable std::vector<uint64_t> _tmp;
-	};
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<int8_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::DenseVectorTag) const
-	{
-
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::const_iterator k;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i) {
-			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
-				t = ((uint16_t) *k) * ((uint16_t) *j);
-
-				*l += t;
-
-			}
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l % VD.field ().modulus;
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<int8_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseSequenceVectorTag) const
-	{
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::const_iterator k;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i) {
-			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
-				t = ((uint16_t) k->second) * ((uint16_t) *j);
-
-				_tmp[k->first] += t;
-
-			}
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l % VD.field ().modulus;
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<int8_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseAssociativeVectorTag) const
-	{
-
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::const_iterator k;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i) {
-			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
-				t = ((uint16_t) k->second) * ((uint16_t) *j);
-
-				_tmp[k->first] += t;
-
-			}
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l % VD.field ().modulus;
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<int8_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseParallelVectorTag) const
-	{
-
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::first_type::const_iterator k_idx;
-		typename Matrix::Column::second_type::const_iterator k_elt;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i) {
-			for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
-			     k_idx != i->first.end ();
-			     ++k_idx, ++k_elt, ++l)
-			{
-				t = ((uint16_t) *k_elt) * ((uint16_t) *j);
-
-				_tmp[*k_idx] += t;
-
-			}
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l % VD.field ().modulus;
-
-		return w;
-	}
-
-}
-
-#ifdef __ICC
-#pragma warning(enable:2259)
-#endif
-
-#include "linbox/randiter/modular.h"
-#endif //__LINBOX_modular_bit_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular-crooked-double.h b/linbox/field/Modular/modular-crooked-double.h
deleted file mode 100644
index 2ce863d..0000000
--- a/linbox/field/Modular/modular-crooked-double.h
+++ /dev/null
@@ -1,616 +0,0 @@
-
-/* linbox/field/modular-crooked-double.h
- * Copyright (C) 2010 LinBox
- *
- * adapted from field/modular-balanced-double.h
- * by Brice Boyer <brice.boyer at imag.fr>
- *
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-/*! @file field/Modular/modular-crooked-double.h
- * @ingroup field
- * @brief Crooked  representation of <code>Z/mZ</code> over \c double .
- * This is a balanced representation with more positive (or negative) representants.
- * Being tested.
- */
-#ifndef __LINBOX_modular_crooked_double_H
-#define __LINBOX_modular_crooked_double_H
-
-
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/util/field-axpy.h"
-#include "linbox/util/debug.h"
-#include <cmath>
-#include "linbox/field/field-traits.h"
-#include "linbox/randiter/modular-crooked.h"
-#include "linbox/randiter/nonzero.h"
-#include <iostream>
-
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-	template< class Element >
-	class ModularCrooked;
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	template <class Element>
-	struct ClassifyRing<ModularCrooked<Element> >;
-
-	template <>
-	struct ClassifyRing<ModularCrooked<double> >
-	{
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-	class MultiModDouble;
-
-	/// \ingroup field
-	template <>
-	class ModularCrooked<double> : public FieldInterface {
-
-	protected:
-
-		double  modulus;
-		double up_mod;
-		double lo_mod;
-		unsigned long   lmodulus;
-
-	public:
-
-		friend class FieldAXPY<ModularCrooked<double> >;
-		friend class DotProductDomain<ModularCrooked<double> >;
-		friend class MultiModDouble;
-
-		typedef double Element;
-		const Element zero,one,mOne;
-		typedef ModularCrookedRandIter<double> RandIter;
-
-		static ClassifyRing <ModularCrooked<double> >::categoryTag
-		getCategory()
-		{
-			return ClassifyRing<ModularCrooked<double> >::categoryTag();
-		}
-
-		ModularCrooked ()
-			: zero(0),one(1),mOne(-1)
-		{}
-
-		ModularCrooked (int32_t p, float f = 0.5, int exp = 1) :
-			modulus((Element)p), up_mod( std::ceil((p-1.)*f) ), lo_mod( up_mod-modulus+1 ),lmodulus (p)
-			,zero(0),one(1),mOne(-1)
-		{
-#ifdef DEBUG
-			if(modulus <= 1)
-				throw PreconditionFailed(__func__,
-							 __LINE__,
-							 "modulus must be > 1");
-			if( exp != 1 ) throw PreconditionFailed(__func__,
-								__LINE__,
-								"exponent must be 1");
-			integer max;
-			if (modulus > (double) FieldTraits<ModularCrooked<double> >::maxModulus(max))
-				throw PreconditionFailed (__func__,
-							  __LINE__,
-							  "modulus is too big");
-#endif
-		}
-
-		ModularCrooked (double p, float f = 0.5) :
-			modulus((Element)p), up_mod( std::ceil((p-1.)*f) ), lo_mod( up_mod-modulus+1 ),lmodulus ((unsigned long)p)
-			,zero(0),one(1),mOne(-1)
-		{
-#ifdef DEBUG
-			if (modulus <= 1)
-				throw PreconditionFailed(__func__,
-							 __LINE__,
-							 "modulus must be > 1");
-			integer max;
-			if (modulus > (double) FieldTraits<ModularCrooked<double> >::maxModulus(max))
-				throw PreconditionFailed (__func__,
-							  __LINE__,
-							  "modulus is too big");
-#endif
-		}
-
-		ModularCrooked (long int p, float f = 0.5) :
-			modulus((double)p), up_mod( std::ceil((double)(p-1)*f) ), lo_mod(  up_mod-modulus+1 ),lmodulus ((unsigned long)p)
-			,zero(0),one(1),mOne(-1)
-		{
-#ifdef DEBUG
-			if ((double) modulus <= 1)
-				throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be > 1");
-			integer max;
-			if ((double) modulus > (double) FieldTraits<ModularCrooked<double> >::maxModulus(max))
-				throw PreconditionFailed (__func__,
-							  __LINE__,
-							  "modulus is too big");
-#endif
-		}
-
-		ModularCrooked (const integer& p, float f = 0.5)  :
-			modulus((double)p), up_mod( std::ceil((double)(p-1)*f) ), lo_mod(  up_mod-modulus+1 ),lmodulus (p)
-			,zero(0),one(1),mOne(-1)
-		{
-#ifdef DEBUG
-			if(modulus <= 1)
-				throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be > 1");
-			if(modulus > getMaxModulus())
-				throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus is too big");
-#endif
-
-		}
-
-		ModularCrooked (const ModularCrooked<double>& mf) :
-			modulus (mf.modulus)
-			,up_mod (mf.up_mod)
-			,lo_mod (mf.lo_mod)
-			,lmodulus (mf.lmodulus)
-			,zero(mf.zero),one(mf.one),mOne(mf.mOne)
-		{}
-
-#if 1
-		const ModularCrooked &operator= (const ModularCrooked<double> &F)
-		{
-			modulus = F.modulus;
-			up_mod = F.up_mod;
-			lo_mod = F.lo_mod;
-			lmodulus= F.lmodulus;
-			return *this;
-		}
-#endif
-
-
-		inline integer &cardinality (integer &c) const
-		{
-			return c = integer(modulus);
-		}
-
-		inline integer &characteristic (integer &c) const
-		{
-			return c = integer(modulus);
-		}
-
-		inline unsigned long &characteristic (unsigned long &c) const
-		{
-			return c = (unsigned long)lmodulus;
-		}
-
-		inline size_t characteristic () const
-		{
-			return (size_t)modulus;
-		}
-
-
-		inline integer &convert (integer &x, const Element &y) const
-		{
-			if ( y < 0. ) return x = integer (y + modulus) ;
-			else return x = integer (y);
-		}
-
-		inline double &convert (double &x, const Element& y) const
-		{
-			return x=y;
-		}
-
-		inline float &convert (float &x, const Element& y) const
-		{
-			return x=(float)y;
-		}
-
-		std::ostream &write (std::ostream &os) const
-		{
-			// os << modulus << '(' << lo_mod << ',' << up_mod << ')' << std::endl;
-			os << "crooked double mod " << int(modulus) << " @ " ;
-			os.precision(2) ;
-			os << (double)up_mod/(modulus-1);
-			os.precision();
-			return os ;
-		}
-
-		std::istream &read (std::istream &is)
-		{
-			is >> modulus;
-#ifdef DEBUG
-			if(modulus <= 1)
-				throw PreconditionFailed (__func__,
-							  __LINE__,
-							  "modulus must be > 1");
-			if(modulus > getMaxModulus())
-				throw PreconditionFailed (__func__,
-							  __LINE__,
-							  "modulus is too big");
-#endif
-			return is;
-		}
-
-		std::ostream &write (std::ostream &os, const Element &x) const
-		{
-			return os << int(x);
-		}
-
-		std::istream &read (std::istream &is, Element &x) const
-		{
-			integer tmp;
-			// JGD : should'nt it be double tmp ???
-			is >> tmp;
-			init(x,tmp);
-			return is;
-		}
-
-
-		inline Element &init (Element &x, const integer &y) const  {
-			x = (Element)(y%lmodulus);
-			if (x < lo_mod) return x += modulus;
-			if (x > up_mod) x -= modulus;
-
-			return x;
-		}
-
-		inline Element& init(Element& x, const double y=0) const
-		{
-
-			// x = (Element)((long unsigned)y)%(lmodulus);
-			// x = ((long int)y) % (lmodulus);
-			x = fmod(y,modulus);
-			if (x < lo_mod) return x += modulus;
-			if (x > up_mod) x -= modulus;
-			return x;
-		}
-
-		inline Element& assign(Element& x, const Element& y) const
-		{
-			return x = y;
-		}
-
-		inline bool areEqual (const Element &x, const Element &y) const
-		{
-			return x == y;
-		}
-
-		inline  bool isZero (const Element &x) const
-		{
-			return x == 0.;
-		}
-
-		inline bool isOne (const Element &x) const
-		{
-			return x == 1.;
-		}
-
-		inline bool isMinusOne (const Element &x) const
-		{
-			return (x == -1.);
-		}
-
-		inline Element &add (Element &x,
-				     const Element &y,
-				     const Element &z) const
-		{
-			x = y + z;
-			if ( x < lo_mod ) return x += modulus;
-			if ( x > up_mod ) x -= modulus;
-			return x;
-		}
-
-		inline Element &sub (Element &x,
-				     const Element &y,
-				     const Element &z) const
-		{
-			x = y - z;
-			if (x < lo_mod ) return x += modulus;
-			if (x > up_mod ) x -= modulus;
-			return x;
-		}
-
-		inline Element &mul (Element &x, const Element &y, const Element &z) const
-		{
-			x = y * z;
-			return init (x,x);
-		}
-
-		inline Element &div (Element &x, const Element &y, const Element &z) const
-		{
-			Element temp;
-			inv (temp, z);
-			return mul (x, y, temp);
-		}
-
-		inline Element &neg (Element &x, const Element &y) const
-		{
-			return x = -y;
-		}
-
-		inline Element &inv (Element &x, const Element &y) const
-		{
-			// The extended Euclidean algoritm
-			int x_int, y_int, q, tx, ty, temp;
-			x_int = int (modulus);
-			y_int = (y < 0.) ? int(y + modulus) : int(y);
-			tx = 0;
-			ty = 1;
-
-			while (y_int != 0) {
-				// always: gcd (modulus,residue) = gcd (x_int,y_int)
-				//         sx*modulus + tx*residue = x_int
-				//         sy*modulus + ty*residue = y_int
-				q = x_int / y_int; // integer quotient
-				temp = y_int; y_int = x_int - q * y_int;
-				x_int = temp;
-				temp = ty; ty = tx - q * ty;
-				tx = temp;
-			}
-			if ( tx < lo_mod ) return x = tx + modulus;
-			if ( tx > up_mod ) return x = tx - modulus;
-			return x = (double) tx;
-		}
-
-		inline Element &axpy (Element &r,
-				      const Element &a,
-				      const Element &x,
-				      const Element &y) const
-		{
-			r = a * x + y;
-			return init (r, r);
-		}
-
-		inline Element &addin (Element &x, const Element &y) const
-		{
-			x += y;
-			if ( x < lo_mod ) return x += modulus;
-			if ( x > up_mod ) x -= modulus;
-			return x;
-		}
-
-		inline Element &subin (Element &x, const Element &y) const
-		{
-			x -= y;
-			if ( x < lo_mod ) return x += modulus;
-			if ( x > up_mod ) x -= modulus;
-			return x;
-		}
-
-		inline Element &mulin (Element &x, const Element &y) const
-		{
-			return mul(x,x,y);
-		}
-
-		inline Element &divin (Element &x, const Element &y) const
-		{
-			return div(x,x,y);
-		}
-
-		inline Element &negin (Element &x) const
-		{
-			return x = -x;
-		}
-
-		inline Element &invin (Element &x) const
-		{
-			return inv (x, x);
-		}
-
-		inline Element &axpyin (Element &r, const Element &a, const Element &x) const
-		{
-			r += a * x;
-			return init (r, r);
-		}
-
-		unsigned long AccBound(const Element&r) const
-		{
-			double max_double = (double) (1ULL<<DBL_MANT_DIG) - modulus ;
-			double p = std::max(up_mod,-lo_mod) ;
-			if (areEqual(zero,r))
-				return (unsigned long) (double(max_double)/p) ;
-			else if (areEqual(one,r))
-			{
-				if (modulus>= getMaxModulus())
-					return 0 ;
-				else
-					return (unsigned long) (double(max_double)/(p*p)) ;
-			}
-			else
-				throw LinboxError("Bad input, expecting 0 or 1");
-			return 0;
-		}
-
-
-		static inline double getMaxModulus()
-		{ return 67108864.0; } // 2^26
-
-	};
-
-#define SQR(A) \
-	((A)*(A))
-
-	template <>
-	class FieldAXPY<ModularCrooked<double> > {
-	public:
-
-		typedef double Element;
-		typedef ModularCrooked<double> Field;
-
-		FieldAXPY (const Field &F) :
-			_field (F), _y(0.) , _bound( (double) ((1ULL << 53) - (int) (SQR(std::max(_field.up_mod,-_field.lo_mod)))))
-		{}
-
-		FieldAXPY (const FieldAXPY &faxpy) :
-			_field (faxpy._field),
-			_y(faxpy._y), _bound(faxpy._bound)
-		{}
-
-		FieldAXPY<ModularCrooked<double> > &operator = (const FieldAXPY &faxpy)
-		{
-			_field = faxpy._field;
-			_y= faxpy._y;
-			_bound= faxpy._bound;
-			return *this;
-		}
-
-		inline Element& mulacc (const Element &a, const Element &x) {
-			//                 Element tmp= a*x;
-			//                 return accumulate(tmp);
-			return accumulate(a*x);
-		}
-
-		inline Element& accumulate (const Element &tmp) {
-			_y += tmp;
-			if (_y > _bound)
-				return _y = drem (_y, _field.modulus);
-			else
-				return _y;
-		}
-		inline Element& subumulate (const Element &tmp) {
-			_y -= tmp;
-			if (_y < 0)
-				return _y += _field.modulus;
-			else
-				return _y;
-		}
-
-		inline Element& get (Element &y) {
-			_y = drem (_y, _field.modulus);
-			return y=_y ;
-		}
-
-		inline FieldAXPY &assign (const Element y) {
-			_y = y;
-			return *this;
-		}
-
-		inline void reset() {
-			_y = 0.;
-		}
-
-		inline Element& set (const Element &tmp) {
-			_y = tmp;
-			if (_y > _bound)
-				return _y = drem (_y, _field.modulus);
-			else
-				return _y;
-		}
-
-	private:
-
-		Field _field;
-		double _y;
-		double _bound;
-	};
-
-	template <>
-	class DotProductDomain<ModularCrooked<double> > : private virtual VectorDomainBase<ModularCrooked<double> > {
-	private:
-		double _bound;
-		size_t _nmax;
-
-	public:
-		typedef double Element;
-		DotProductDomain (const ModularCrooked<double> &F) :
-			VectorDomainBase<ModularCrooked<double> > (F), _bound( (double) ( (1ULL<<53) - (int) (SQR(std::max(_field.up_mod,-_field.lo_mod)))))
-		{
-			_nmax= (size_t)floor((double(1<<26)* double(1<<26)*2.)/ (SQR(std::max(_field.up_mod,-_field.lo_mod))));
-		}
-
-	protected:
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-
-			double y = 0.;
-			double t = 0.;
-			if (v1.size() < _nmax) {
-				for (size_t i = 0; i< v1.size();++i)
-					y += v1[i] * v2[i] ;
-				y = drem(y, _field.modulus);
-			}
-			else{
-				size_t i=0;
-				for (;i< v1.size()- _nmax ;i=i+_nmax){
-					for (size_t j=i;j<i+_nmax;++j)
-						y += v1[j] * v2[j];
-					t+=drem(y, _field.modulus);
-					y=0.;
-				}
-				for (;i < v1.size();++i)
-					y += v1[i] * v2[i];
-				t+=drem(y, _field.modulus);
-				y = drem(t, _field.modulus);
-			}
-			return res = y;
-		}
-
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-
-			double y = 0.;
-			double t =0.;
-
-
-			if (v1.first.size() < _nmax) {
-				for (size_t i=0;i<v1.first.size();++i)
-					y+= v1.second[i] * v2[v1.first[i]];
-				y = drem(y, _field.modulus);
-			}
-			else {
-				size_t i=0;
-				for (;i< v1.first.size()- _nmax ;i=i+_nmax){
-					for (size_t j=i;j<i+_nmax;++j)
-						y += v1.second[j] * v2[v1.first[j]];
-					t+=drem(y, _field.modulus);
-					y=0.;
-				}
-				for (;i < v1.first.size();++i)
-					y += v1.second[i] * v2[v1.first[i]];
-				t+= drem(y, _field.modulus);
-				y = drem(t, _field.modulus);
-			}
-			return res = y;
-		}
-	};
-
-	template<class T>
-	std::ostream& operator<< (std::ostream & o, const ModularCrooked<T> & F)
-	{
-		return F.write(o);
-	}
-
-}
-#endif //__LINBOX_modular_crooked_double_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular-double.h b/linbox/field/Modular/modular-double.h
deleted file mode 100644
index d630b37..0000000
--- a/linbox/field/Modular/modular-double.h
+++ /dev/null
@@ -1,381 +0,0 @@
-/* linbox/field/modular-double.h
- * Copyright (C) 2003 Pascal Giorgi
- *
- * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- *
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-/*! @file field/Modular/modular-double.h
- * @ingroup field
- * @brief Standard representation of <code>Z/mZ</code> over \c double .
- */
-
-#ifndef __LINBOX_modular_double_H
-#define __LINBOX_modular_double_H
-
-
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/util/field-axpy.h"
-#include "linbox/util/debug.h"
-#include <math.h>
-#include "linbox/randiter/nonzero.h"
-#include "linbox/randiter/modular.h"
-
-#include <fflas-ffpack/field/modular-double.h>
-
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
-	template< class Element >
-	class Modular;
-
-	template< class Element >
-	class ModularRandIter;
-
-	template< class Field, class RandIter >
-	class NonzeroRandIter;
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	template <class Element>
-	struct ClassifyRing<Modular<Element> >;
-
-	template <>
-	struct ClassifyRing<Modular<double> > {
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-	class MultiModDouble;
-
-	/*! \ingroup modular
-	 * Standard representation of \f$\mathbf{Z}/m\mathbf{Z}\f$.
-	 * If \c m is the modulus, then elements are represented in \f[ \left
-	 * \llbracket 0, m-1  \right \rrbracket.\f]
-	 */
-	template <>
-	class Modular<double> :
-	      public FFPACK::Modular<double>,public FieldInterface	{
-	      public:
-		      typedef double Element;
-
-	      protected:
-
-	      public:
-		      typedef FFPACK::Modular<double> Father_t;
-		      friend class FieldAXPY<Modular<Element> >;
-		      friend class DotProductDomain<Modular<Element> >;
-		      friend class MultiModDouble;
-
-	      public:
-
-		      typedef ModularRandIter<Element> RandIter;
-
-		      static ClassifyRing<Modular<Element> >::categoryTag getCategory()
-		      {
-			      return ClassifyRing<Modular<Element> >::categoryTag();
-		      }
-
-		      Modular (const integer& p, int e=1) :
-			      Father_t((unsigned long) p)
-		      {
-			      linbox_check(e==1);
-#ifdef DEBUG
-			      if(modulus <= 1)
-				      throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be > 1");
-			      if(modulus > getMaxModulus())
-				      throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus is too big");
-#endif
-		      }
-
-		      Modular () : Father_t() {};
-
-		      using Father_t ::cardinality ;
-		      integer &cardinality (integer &c) const
-		      {
-			      return c = integer(modulus);
-		      }
-
-		      using Father_t ::characteristic;
-		      integer &characteristic (integer &c) const
-		      {
-			      return c = integer(modulus);
-		      }
-
-		      using Father_t ::convert;
-		      integer &convert (integer &x, const Element &y) const
-		      {
-			      return x = integer(y);
-		      }
-
-
-
-		      //!@bug use FFPACK operator
-		      const Modular<double> &operator=(const Modular<double> &F)
-		      {
-			      if ( this == &F)
-				      return *this;
-			      modulus  = F.modulus;
-			      lmodulus = F.lmodulus;
-
-			      F.assign(const_cast<Element&>(one),F.one);
-			      F.assign(const_cast<Element&>(zero),F.zero);
-			      F.assign(const_cast<Element&>(mOne),F.mOne);
-			      return *this;
-		      }
-
-
-		      using Father_t ::init;
-		      Element &init (Element &x, const integer &y) const
-		      {
-			      x = (Element)(y%lmodulus);
-			      if (x<0) x+= modulus ;
-			      linbox_check(x < lmodulus);
-			      linbox_check(!(x < 0));
-			      return x  ;
-		      }
-
-		      Element &init (Element &x) const
-		      {
-			      return x = 0 ;
-		      }
-
-		       bool isMinusOne (const Element &x) const
-		      {
-			      return (x == mOne);
-		      }
-
-		      /** Max number of operations before reducing
-		       * @param r if \c r=0, we consider how many \c += are performable.
-		       * if \c r=1, then we look for the maximum \c axpy operations doable.
-		       * @return \p 0 if the field is too big, a positive number otherwise, \p -1 if infinity
-		       * on general fields, it is \p 1.
-		       */
-		      unsigned long AccBound(const Element r) const
-		      {
-			      // Element One, Zero ; init(One,1UL) ; init(Zero,0UL);
-			      Element max_Element = (Element) (1ULL<<DBL_MANT_DIG) - modulus ; /* other wise 2^52+(2^52-1) */
-			      Element p = modulus-1 ;
-			      if (areEqual(zero,r))
-				      return (unsigned long) (Element(max_Element)/p) ;
-			      else if (areEqual(one,r))
-			      {
-				      if (modulus>= getMaxModulus())
-					      return 0 ;
-				      else
-					      return (unsigned long) (Element(max_Element)/(modulus*modulus)) ;
-			      }
-			      else
-				      throw LinboxError("Bad input, expecting 0 or 1");
-			      return 0;
-		      }
-
-	      };
-
-} // LinBox
-
-// FieldAXPY/DotProductDomain
-namespace LinBox
-{
-
-	template <>
-	class FieldAXPY<Modular<double> > {
-	public:
-
-		typedef double Element;
-		typedef Modular<double> Field;
-
-		FieldAXPY (const Field &F) :
-			_field (F) , //_invmod(1./_field.modulus),
-			_y(0.) , _bound( (double) ((1ULL << 53) - (unsigned long int) (_field.modulus*_field.modulus)))
-		{}
-
-		FieldAXPY (const FieldAXPY &faxpy) :
-			_field (faxpy._field),// _invmod(faxpy._invmod) ,
-			_y(faxpy._y), _bound(faxpy._bound)
-		{}
-
-#if 0
-		FieldAXPY<Modular<double> > &operator = (const FieldAXPY &faxpy)
-		{
-			_field = faxpy._field;
-			//_invmod= faxpy._invmod;
-			_y= faxpy._y;
-			_bound= faxpy._bound;
-			return *this;
-		}
-#endif
-
-		 Element& mulacc (const Element &a, const Element &x)
-		{
-			//                 Element tmp= a*x;
-			//                 return accumulate(tmp);
-			return accumulate(a*x);
-		}
-
-		 Element& accumulate (const Element &tmp)
-		{
-			_y += tmp;
-			if (_y > _bound)
-				return _y = fmod (_y, _field.modulus);
-			else
-				return _y;
-		}
-
-		 Element& subumulate (const Element &tmp)
-		{
-			_y -= tmp;
-			if (_y < 0)
-				return _y += _field.modulus;
-			else
-				return _y;
-		}
-
-		 Element& get (Element &y)
-		{
-			_y = fmod (_y, _field.modulus);
-			return y=_y ;
-		}
-
-		 FieldAXPY &assign (const Element y)
-		{
-			_y = y;
-			return *this;
-		}
-
-		 void reset()
-		{
-			_y = 0.;
-		}
-
-		 Element& set (const Element &tmp)
-		{
-			_y = tmp;
-			if (_y > _bound)
-				return _y = fmod (_y, _field.modulus);
-			else
-				return _y;
-		}
-
-	private:
-
-		Field _field;
-		//double _invmod;
-		double _y;
-		double _bound;
-	};
-
-	template <>
-	class DotProductDomain<Modular<double> > : private virtual VectorDomainBase<Modular<double> > {
-	private:
-		double _bound;
-		size_t _nmax;
-		//double _invmod;
-
-	public:
-		typedef double Element;
-		DotProductDomain (const Modular<double> &F) :
-			VectorDomainBase<Modular<double> > (F), _bound( (double) ( (1ULL<<53) - (unsigned long int) (F.modulus*F.modulus)))//, _invmod(1./_field.modulus)
-		{
-			_nmax= (size_t)floor((double(1<<26)* double(1<<26)*2.)/ (F.modulus * F.modulus));
-			_nmax = (_nmax>0?_nmax:1);
-		}
-
-	protected:
-		template <class Vector1, class Vector2>
-		 Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-
-			double y = 0.;
-			double t = 0.;
-			if (v1.size() < _nmax) {
-				for (size_t i = 0; i< v1.size();++i)
-					y += v1[i] * v2[i] ;
-				y = fmod(y, _field.modulus);
-			}
-			else{
-				size_t i=0;
-				for (;i< v1.size()- _nmax ;i=i+_nmax){
-					for (size_t j=i;j<i+_nmax;++j)
-						y += v1[j] * v2[j];
-					t+=fmod(y, _field.modulus);
-					y=0.;
-				}
-				for (;i < v1.size();++i)
-					y += v1[i] * v2[i];
-				t+=fmod(y, _field.modulus);
-				y = fmod(t, _field.modulus);
-			}
-			return res = y;
-		}
-
-		template <class Vector1, class Vector2>
-		 Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-
-			double y = 0.;
-			double t =0.;
-
-
-			if (v1.first.size() < _nmax) {
-				for (size_t i=0;i<v1.first.size();++i)
-					y+= v1.second[i] * v2[v1.first[i]];
-				y = fmod(y, _field.modulus);
-			}
-			else {
-				size_t i=0;
-				for (;i< v1.first.size()- _nmax ;i=i+_nmax){
-					for (size_t j=i;j<i+_nmax;++j)
-						y += v1.second[j] * v2[v1.first[j]];
-					t+=fmod(y, this->_field.modulus);
-					y=0.;
-				}
-				for (;i < v1.first.size();++i)
-					y += v1.second[i] * v2[v1.first[i]];
-				t+= fmod(y, _field.modulus);
-				y = fmod(t, _field.modulus);
-			}
-			return res = y;
-		}
-	};
-}
-
-
-#endif //__LINBOX_modular_double_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular-float.h b/linbox/field/Modular/modular-float.h
deleted file mode 100644
index 8c4c5db..0000000
--- a/linbox/field/Modular/modular-float.h
+++ /dev/null
@@ -1,335 +0,0 @@
-/* linbox/field/modular-float.h
- * Copyright (C) 2003 Pascal Giorgi
- *               2007 Clement Pernet
- * Written by Clement Pernet <cpernet at uwaterloo.ca>
- *
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-/*! @file field/Modular/modular-float.h
- * @ingroup field
- * @brief  representation of <code>Z/mZ</code> over \c float .
- */
-
-#ifndef __LINBOX_modular_float_H
-#define __LINBOX_modular_float_H
-
-#ifdef __INTEL_COMPILER
-#define FmodF fmodf
-#else
-#define FmodF fmod
-#endif
-
-
-
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/util/field-axpy.h"
-#include "linbox/util/debug.h"
-#include <math.h>
-#include "linbox/field/field-traits.h"
-#include "linbox/randiter/nonzero.h"
-
-#include <fflas-ffpack/field/modular-float.h>
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
-	template< class Element >
-	class Modular;
-	template< class Element >
-	class ModularRandIter;
-
-	template< class Field, class RandIter >
-	class NonzeroRandIter;
-
-	template <class Ring>
-	struct ClassifyRing;
-	template <class Element>
-	struct ClassifyRing<Modular<Element> >;
-	template <>
-	struct ClassifyRing<Modular<float> > {
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-	class MultiModFloat;
-
-	/// \ingroup field
-	template <>
-	class Modular<float> : public FieldInterface,
-	      public FFPACK::Modular<float>	{
-
-	      public :
-		      typedef float Element;
-		      typedef FFPACK::Modular<float> Father_t ;
-		      using Father_t::one ;
-		      using Father_t::zero ;
-		      using Father_t::mOne ;
-
-	      public:
-		      friend class FieldAXPY<Modular<Element> >;
-		      friend class DotProductDomain<Modular<Element> >;
-		      friend class MultiModFloat;
-
-		      typedef ModularRandIter<Element> RandIter;
-
-		      static ClassifyRing<Modular<Element> >::categoryTag getCategory()
-		      {
-			      return ClassifyRing<Modular<Element> >::categoryTag();
-		      }
-
-		      Modular (const integer& p, int e = 1) :
-			      Father_t((unsigned long)p)
-		      {
-#ifdef DEBUG
-			      if(modulus <= 1)
-				      throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be > 1");
-			      integer max;
-			      if(modulus > (Element) FieldTraits<Modular<Element> >::maxModulus(max))
-				      throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus is too big");
-#endif
-
-		      }
-
-		      using Father_t ::cardinality ;
-		      integer &cardinality (integer &c) const
-		      {
-			      return c = integer(modulus);
-		      }
-
-		      using Father_t ::characteristic;
-		      integer &characteristic (integer &c) const
-		      {
-			      return c = integer(modulus);
-		      }
-
-		      using Father_t ::convert;
-		      integer &convert (integer &x, const Element &y) const
-		      {
-			      return x = integer(y);
-		      }
-
-		      using Father_t ::init;
-		      Element &init (Element &x, const integer &y) const
-		      {
-			      x = (Element)(y%lmodulus);
-
-			      if (x<0) return x+=modulus ;
-			      return x;
-		      }
-
-		      Element &init(Element &x) const
-		      {
-			      return x = 0 ;
-		      }
-
-		      unsigned long AccBound(const Element&r) const
-		      {
-			      double max_double = (double) (1ULL<<FLT_MANT_DIG) - modulus ;
-			      double p = modulus-1 ;
-			      if (areEqual(zero,r))
-				      return (unsigned long) (double(max_double)/p) ;
-			      else if (areEqual(one,r))
-			      {
-				      if (modulus>= getMaxModulus())
-					      return 0 ;
-				      else
-					      return (unsigned long) (double(max_double)/(modulus*modulus)) ;
-			      }
-			      else
-				      throw LinboxError("Bad input, expecting 0 or 1");
-			      return 0;
-		      }
-
-	      };
-
-	template <>
-	class FieldAXPY<Modular<float> > {
-	public:
-
-		typedef float Element;
-		typedef Modular<float> Field;
-
-		FieldAXPY (const Field &F) :
-			_field (F) , //_invmod(1./_field.modulus),
-			_y(0.) , _bound( (float) ( (1UL << 23) - (unsigned long int) (_field.modulus*_field.modulus)))
-		{}
-
-		FieldAXPY (const FieldAXPY &faxpy) :
-			_field (faxpy._field),// _invmod(faxpy._invmod) ,
-			_y(faxpy._y), _bound(faxpy._bound)
-		{}
-
-#if 0
-		FieldAXPY<Modular<float> > &operator = (const FieldAXPY &faxpy)
-		{
-			_field    = faxpy._field ;
-			//_invmod= faxpy._invmod;
-			_y    = faxpy._y;
-			_bound= faxpy._bound;
-			return *this;
-		}
-#endif
-
-		inline Element& mulacc (const Element &a, const Element &x)
-		{
-			Element tmp= a*x;
-			return accumulate(tmp);
-		}
-
-		inline Element& accumulate (const Element &tmp)
-		{
-			_y += tmp;
-			if (_y > _bound)
-				return _y = fmodf (_y, _field.modulus);
-			else
-				return _y;
-		}
-
-		inline Element& get (Element &y)
-		{
-			_y = fmodf (_y, _field.modulus);
-			return y=_y ;
-		}
-
-		inline FieldAXPY &assign (const Element y)
-		{
-			_y = y;
-			return *this;
-		}
-
-		inline void reset()
-		{
-			_y = 0.;
-		}
-
-	private:
-
-		Field _field;
-		//float _invmod;
-		float _y;
-		float _bound;
-	};
-
-
-	template <>
-	class DotProductDomain<Modular<float> > : private virtual VectorDomainBase<Modular<float> > {
-	private:
-		float _bound;
-		size_t _nmax;
-		//float _invmod;
-
-	public:
-		typedef float Element;
-		DotProductDomain (const Modular<float> &F) :
-			VectorDomainBase<Modular<float> > (F)
-			, _bound( (float) ( (1<<23) - (int) (_field.modulus*_field.modulus)))
-			//, _invmod(1./_field.modulus)
-		{
-			_nmax= (size_t)floor((float(1<<11)* float(1<<12))/ (_field.modulus * _field.modulus));
-		}
-
-	protected:
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-
-			float y = 0.;
-			float t = 0.;
-			if (v1.size() < _nmax)
-			{
-				for (size_t i = 0; i< v1.size();++i)
-					y += v1[i] * v2[i] ;
-				y = fmodf(y, _field.modulus);
-			}
-			else
-			{
-				size_t i=0;
-				for (;i< v1.size()- _nmax ;i=i+_nmax)
-				{
-					for (size_t j=i;j<i+_nmax;++j)
-						y += v1[j] * v2[j];
-					t+=fmodf(y, _field.modulus);
-					y=0.;
-				}
-				for (;i < v1.size();++i)
-					y += v1[i] * v2[i];
-				t+=fmodf(y, _field.modulus);
-				y = fmodf(t, _field.modulus);
-			}
-			return res = y;
-		}
-
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-
-			float y = 0.;
-			float t =0.;
-
-
-			if (v1.first.size() < _nmax)
-			{
-				for (size_t i=0;i<v1.first.size();++i)
-					y+= v1.second[i] * v2[v1.first[i]];
-				y = fmodf(y, _field.modulus);
-			}
-			else
-			{
-				size_t i=0;
-				for (;i< v1.first.size()- _nmax ;i=i+_nmax)
-				{
-					for (size_t j=i;j<i+_nmax;++j)
-						y += v1.second[j] * v2[v1.first[j]];
-					t+=fmodf(y, _field.modulus);
-					y=0.;
-				}
-				for (;i < v1.first.size();++i)
-					y += v1.second[i] * v2[v1.first[i]];
-				t+= fmodf(y, _field.modulus);
-				y = fmodf(t, _field.modulus);
-			}
-			return res = y;
-		}
-	};
-}
-
-#include "linbox/randiter/modular.h"
-
-#undef FmodF
-
-#endif //__LINBOX_modular_float_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular-int32.h b/linbox/field/Modular/modular-int32.h
deleted file mode 100644
index dbb69ba..0000000
--- a/linbox/field/Modular/modular-int32.h
+++ /dev/null
@@ -1,526 +0,0 @@
-/* Copyright (C) 2010 LinBox
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*! @file field/Modular/modular-int32.h
- * @ingroup field
- * @brief  representation of <code>Z/mZ</code> over \c int32_t .
- */
-#ifndef __LINBOX_modular_int32_H
-#define __LINBOX_modular_int32_H
-
-
-#include <math.h>
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/util/debug.h"
-#include "linbox/field/field-traits.h"
-
-#include <fflas-ffpack/field/modular-int32.h>
-
-#ifndef LINBOX_MAX_INT /* 2147483647 */
-#define LINBOX_MAX_INT INT32_MAX
-#endif
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
-	template< class Element >
-	class Modular;
-	template< class Element >
-	class ModularRandIter;
-	template< class Field, class RandIter >
-	class NonzeroRandIter;
-
-	template<class Field>
-	class DotProductDomain;
-	template<class Field>
-	class FieldAXPY;
-	template<class Field>
-	class MVProductDomain;
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	template <class Element>
-	struct ClassifyRing<Modular<Element> >;
-
-	template <>
-	struct ClassifyRing<Modular<int32_t> > {
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-
-
-	/** \brief Specialization of Modular to int32_t element type with efficient dot product.
-	 *
-	 * Efficient element operations for dot product, mul, axpy, by using floating point
-	 * inverse of modulus (borrowed from NTL) and some use of non-normalized intermediate values.
-	 *
-	 * For some uses this is the most efficient field for primes in the range from half word
-	 * to 2^30.
-	 *
-	 * Requires: Modulus < 2^30.
-	 * Intended use: 2^15 < prime modulus < 2^30.
-	 \ingroup field
-	 */
-	template <>
-	class Modular<int32_t> : public FieldInterface ,
-	      public ::FFPACK::Modular<int32_t> {
-
-	protected:
-
-	public:
-
-		friend class FieldAXPY<Modular<int32_t> >;
-		friend class DotProductDomain<Modular<int32_t> >;
-		friend class MVProductDomain<Modular<int32_t> >;
-
-		typedef FFPACK::Modular<int32_t> Father_t;
-
-		typedef int32_t Element;
-		typedef ModularRandIter<int32_t> RandIter;
-
-		Modular (integer &p) :
-			Father_t((unsigned long)p)
-		{}
-
-	       	Modular (int32_t value, int32_t exp=1) :
-			Father_t(value,exp)
-		      {}
-#if (FFLAFLAS_VERSIONW>10400)
-		Modular (long value) :
-			Father_t(value)
-		      {}
-#endif
-
-		Modular (unsigned long value) :
-			Father_t(value)
-		      {}
-
-		using Father_t ::cardinality;
-		 integer &cardinality (integer &c) const
-		{
-			return c = modulus;
-		}
-
-		 using Father_t ::characteristic;
-		 integer &characteristic (integer &c) const
-		{
-		       	return c = modulus;
-		}
-
-
-
-		 using Father_t ::convert;
-		 integer &convert (integer &x, const Element &y) const
-		{
-			return x = y;
-		}
-
-
-		 using Father_t ::init;
-		 Element &init (Element &x, const integer &y) const
-		{
-			x = Element (y % lmodulus);
-			if (x < 0) x += modulus;
-			return x;
-		}
-
-		unsigned long AccBound(const Element&r) const
-		{
-			// Element one, zero ; init(one,1UL) ; init(zero,0UL);
-			double max_double = (double) (INT_MAX) - modulus ;
-			double p = modulus-1 ;
-			if (areEqual(zero,r))
-				return (unsigned long) (max_double/p) ;
-			else if (areEqual(one,r))
-			{
-				if (modulus>= getMaxModulus())
-					return 0 ;
-				else
-					return (unsigned long) max_double/(unsigned long)(modulus*modulus) ;
-			}
-			else
-				throw LinboxError("Bad input, expecting 0 or 1");
-			return 0;
-		}
-
-	private:
-
-	};
-
-	template <>
-	class FieldAXPY<Modular<int32_t> > {
-	public:
-
-		typedef int32_t Element;
-		typedef Modular<int32_t> Field;
-
-		FieldAXPY (const Field &F) :
-			_field (F),_y(0)
-		{ }
-
-
-		FieldAXPY (const FieldAXPY &faxpy) :
-			_field (faxpy._field), _y (0)
-		{}
-
-		FieldAXPY<Modular<int32_t> > &operator = (const FieldAXPY &faxpy)
-		{
-			_field = faxpy._field;
-			_y = faxpy._y;
-			return *this;
-		}
-
-		 uint64_t& mulacc (const Element &a, const Element &x)
-		{
-			uint64_t t = (uint64_t) a * (uint64_t) x;
-			_y += t;
-			if (_y < t) {
-				 _y += (uint64_t)_field._two64;
-				 return _y ;
-			}
-			else
-				return _y;
-		}
-
-		 uint64_t& accumulate (const Element &t)
-		{
-			_y += (uint64_t) t;
-			if (_y < (uint64_t)t)
-				return _y += (uint64_t) _field._two64;
-			else
-				return _y;
-		}
-
-		 Element& get (Element &y)
-		{
-			y = Element (_y % (uint64_t) _field.modulus);
-			return y;
-		}
-
-		 FieldAXPY &assign (const Element y)
-		{
-			_y = (uint64_t) y;
-			return *this;
-		}
-
-		 void reset()
-		{
-			_y = 0;
-		}
-
-	protected:
-		Field _field;
-		uint64_t _y;
-	};
-
-
-	template <>
-	class DotProductDomain<Modular<int32_t> > : private virtual VectorDomainBase<Modular<int32_t> > {
-
-	public:
-		typedef int32_t Element;
-		DotProductDomain (const Modular<int32_t> &F) :
-			VectorDomainBase<Modular<int32_t> > (F)
-		{}
-
-
-	protected:
-		template <class Vector1, class Vector2>
-		 Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-
-			typename Vector1::const_iterator i;
-			typename Vector2::const_iterator j;
-
-			uint64_t y = 0;
-			uint64_t t;
-
-			for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j)
-			{
-				t = ( (uint64_t) *i ) * ( (uint64_t) *j );
-				y += t;
-
-				if (y < t)
-					y += (uint64_t) _field._two64;
-			}
-
-			y %= (uint64_t) _field.modulus;
-			return res = Element(y);
-
-		}
-
-		template <class Vector1, class Vector2>
-		 Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-			typename Vector1::first_type::const_iterator i_idx;
-			typename Vector1::second_type::const_iterator i_elt;
-
-			uint64_t y = 0;
-			uint64_t t;
-
-			for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt)
-			{
-				t = ( (uint64_t) *i_elt ) * ( (uint64_t) v2[*i_idx] );
-				y += t;
-
-				if (y < t)
-					y += (uint64_t) _field._two64;
-			}
-
-
-			y %= (uint64_t) _field.modulus;
-
-			return res = (Element) y;
-		}
-	};
-
-	// Specialization of MVProductDomain for int32_t modular field
-
-	template <>
-	class MVProductDomain<Modular<int32_t> > {
-	public:
-
-		typedef int32_t Element;
-
-	protected:
-		template <class Vector1, class Matrix, class Vector2>
-		 Vector1 &mulColDense
-		(const VectorDomain<Modular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
-		{
-			return mulColDenseSpecialized
-			(VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
-		}
-
-	private:
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::DenseVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseSequenceVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseAssociativeVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseParallelVectorTag) const;
-
-		mutable std::vector<uint64_t> _tmp;
-	};
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<int32_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::DenseVectorTag) const
-	{
-
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::const_iterator k;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i)
-		{
-			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
-			{
-				t = ((uint64_t) *k) * ((uint64_t) *j);
-
-				*l += t;
-
-				if (*l < t)
-					*l += (uint64_t) VD.field ()._two64;
-			}
-		}
-
-		typename Vector1::iterator w_j;
-		typedef typename Vector1::value_type elements ;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = elements(*l % VD.field ().modulus);
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<int32_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseSequenceVectorTag) const
-	{
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator       i = A.colBegin ();
-		typename Vector2::const_iterator        j;
-		typename Matrix::Column::const_iterator k;
-		std::vector<uint64_t>::iterator         l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i) {
-			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
-				t = ((uint64_t) k->second) * ((uint64_t) *j);
-
-				_tmp[k->first] += t;
-
-				if (_tmp[k->first] < t)
-					_tmp[k->first] += VD.field ()._two64;
-			}
-		}
-
-		typename Vector1::iterator w_j;
-		typedef typename Vector1::value_type val_t;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = (val_t)( *l % VD.field ().modulus );
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<int32_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseAssociativeVectorTag) const
-	{
-
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::const_iterator k;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i)
-		{
-			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
-			{
-				t = ((uint64_t) k->second) * ((uint64_t) *j);
-
-				_tmp[k->first] += t;
-
-				if (_tmp[k->first] < t)
-					_tmp[k->first] += VD.field ()._two64;
-			}
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l % VD.field ().modulus;
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<int32_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseParallelVectorTag) const
-	{
-
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::first_type::const_iterator k_idx;
-		typename Matrix::Column::second_type::const_iterator k_elt;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i)
-		{
-			for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
-			     k_idx != i->first.end ();
-			     ++k_idx, ++k_elt, ++l)
-			{
-				t = ((uint64_t) *k_elt) * ((uint64_t) *j);
-
-				_tmp[*k_idx] += t;
-
-				if (_tmp[*k_idx] < t)
-					_tmp[*k_idx] += VD.field ()._two64;
-			}
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l % VD.field ().modulus;
-
-		return w;
-	}
-
-
-}
-
-#include "linbox/randiter/modular.h"
-
-#endif //__LINBOX_modular_int32_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular-int64.h b/linbox/field/Modular/modular-int64.h
deleted file mode 100644
index 8a0e35d..0000000
--- a/linbox/field/Modular/modular-int64.h
+++ /dev/null
@@ -1,505 +0,0 @@
-/* Copyright (C) 2010 LinBox
- * Adapted by B Boyer <brice.boyer at imag.fr>
- * (from other modular-balanced* files)
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*! @file field/Modular/modular-int64.h
- * @ingroup field
- * @brief  representation of <code>Z/mZ</code> over \c int64_t .
- */
-#ifndef __LINBOX_modular_int64_H
-#define __LINBOX_modular_int64_H
-
-
-#include <math.h>
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/util/debug.h"
-#include "linbox/field/field-traits.h"
-
-#include <fflas-ffpack/field/modular-int64.h>
-
-#ifndef LINBOX_MAX_INT64 /*  18446744073709551615L(L) is UINT64_MAX*/
-#ifdef __x86_64__
-#define LINBOX_MAX_INT64 INT64_MAX
-#else
-#define LINBOX_MAX_INT64 INT64_MAX
-#endif
-#endif
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
-	template< class Element >
-	class Modular;
-	template< class Element >
-	class ModularRandIter;
-	template<class Field>
-	class DotProductDomain;
-	template<class Field>
-	class FieldAXPY;
-	template<class Field>
-	class MVProductDomain;
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	template <class Element>
-	struct ClassifyRing<Modular<Element> >;
-
-	template <>
-	struct ClassifyRing<Modular<int64_t> > {
-	       	typedef RingCategories::ModularTag categoryTag;
-	};
-
-
-
-	/** \brief Specialization of Modular to int64_t element type with efficient dot product.
-	 *
-	 * Efficient element operations for dot product, mul, axpy, by using floating point
-	 * inverse of modulus (borrowed from NTL) and some use of non-normalized intermediate values.
-	 *
-	 * For some uses this is the most efficient field for primes in the range from half word
-	 * to 2^62.
-	 *
-	 * Requires: Modulus < 2^62.
-	 * Intended use: 2^30 < prime modulus < 2^62.
-	 \ingroup field
-	 */
-	template <>
-	class Modular<int64_t> : public FieldInterface,
-	      public FFPACK::Modular<int64_t>	{
-
-	public:
-		typedef int64_t Element;
-
-		typedef FFPACK::Modular<int64_t> Father_t
-		friend class FieldAXPY<Modular<int64_t> >;
-		friend class DotProductDomain<Modular<int64_t> >;
-		friend class MVProductDomain<Modular<int64_t> >;
-
-		typedef ModularRandIter<int64_t> RandIter;
-
-		using Father_t ::cardinality;
-		inline integer &cardinality (integer &c) const
-		{
-			return c = modulus;
-		}
-
-		using Father_t ::characteristic;
-		inline integer &characteristic (integer &c) const
-		{
-			return c = modulus;
-		}
-
-		inline integer characteristic () const
-		{
-			return modulus;
-		}
-
-		using Father_t ::convert;
-		inline integer &convert (integer &x, const Element &y) const
-		{
-			return x = y;
-		}
-
-		using Father_t ::init;
-		inline Element &init (Element &x, const integer &y) const
-		{
-			x = Element (y % lmodulus);
-			if (x < 0) x += modulus;
-			return x;
-		}
-
-
-	private:
-
-
-	};
-
-	template <>
-	class FieldAXPY<Modular<int64_t> > {
-	public:
-
-		typedef int64_t Element;
-		typedef Modular<int64_t> Field;
-
-		FieldAXPY (const Field &F) :
-			_field (F),_y(0)
-		{}
-
-
-		FieldAXPY (const FieldAXPY &faxpy) :
-			_field (faxpy._field), _y (0)
-		{}
-
-		FieldAXPY<Modular<int64_t> > &operator = (const FieldAXPY &faxpy)
-		{
-			_field = faxpy._field;
-			_y = faxpy._y;
-			return *this;
-		}
-
-		inline uint64_t& mulacc (const Element &a, const Element &x)
-		{
-			uint64_t t = (uint64_t) a * (uint64_t) x;
-			_y += t;
-			if (_y < t)
-				return _y += _field._two64;
-			else
-				return _y;
-		}
-
-		inline uint64_t& accumulate (const Element &t)
-		{
-			_y += t;
-			if (_y < (uint64_t)t)
-				return _y += _field._two64;
-			else
-				return _y;
-		}
-
-		inline Element& get (Element &y)
-		{
-			y =_y % (uint64_t) _field.modulus;
-			return y;
-		}
-
-		inline FieldAXPY &assign (const Element y)
-		{
-			_y = y;
-			return *this;
-		}
-
-		inline void reset()
-		{
-			_y = 0;
-		}
-
-	protected:
-		Field _field;
-		uint64_t _y;
-	};
-
-
-	template <>
-	class DotProductDomain<Modular<int64_t> > : private virtual VectorDomainBase<Modular<int64_t> > {
-
-	public:
-		typedef int64_t Element;
-		DotProductDomain (const Modular<int64_t> &F) :
-			VectorDomainBase<Modular<int64_t> > (F)
-		{}
-
-
-	protected:
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-
-			typename Vector1::const_iterator i;
-			typename Vector2::const_iterator j;
-
-			uint64_t y = 0;
-			uint64_t t;
-
-			for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j)
-			{
-				t = ( (uint64_t) *i ) * ( (uint64_t) *j );
-				y += t;
-
-				if (y < t)
-					y += _field._two64;
-			}
-
-			y %= (uint64_t) _field.modulus;
-			return res = y;
-
-		}
-
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-			typename Vector1::first_type::const_iterator i_idx;
-			typename Vector1::second_type::const_iterator i_elt;
-
-			uint64_t y = 0;
-			uint64_t t;
-
-			for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt)
-			{
-				t = ( (uint64_t) *i_elt ) * ( (uint64_t) v2[*i_idx] );
-				y += t;
-
-				if (y < t)
-					y += _field._two64;
-			}
-
-
-			y %= (uint64_t) _field.modulus;
-
-			return res = y;
-		}
-	};
-
-	// Specialization of MVProductDomain for int64_t modular field
-
-	template <>
-	class MVProductDomain<Modular<int64_t> > {
-	public:
-
-		typedef int64_t Element;
-
-	protected:
-		template <class Vector1, class Matrix, class Vector2>
-		inline Vector1 &mulColDense
-		(const VectorDomain<Modular<int64_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
-		{
-			return mulColDenseSpecialized
-			(VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
-		}
-
-	private:
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<int64_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::DenseVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<int64_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseSequenceVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<int64_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseAssociativeVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<int64_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseParallelVectorTag) const;
-
-		mutable std::vector<uint64_t> _tmp;
-	};
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 & MVProductDomain<Modular<int64_t> >::
-	mulColDenseSpecialized (const VectorDomain<Modular<int64_t> > &VD,
-				Vector1 &w,
-				const Matrix &A,
-				const Vector2 &v,
-				VectorCategories::DenseVectorTag) const
-	{
-
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::const_iterator k;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i)
-		{
-			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
-			{
-				t = ((uint64_t) *k) * ((uint64_t) *j);
-
-				*l += t;
-
-				if (*l < t)
-					*l += VD.field ()._two64;
-			}
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l % VD.field ().modulus;
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<int64_t> >::
-	mulColDenseSpecialized (const VectorDomain<Modular<int64_t> > &VD,
-				Vector1 &w,
-				const Matrix &A,
-				const Vector2 &v,
-				VectorCategories::SparseSequenceVectorTag) const
-	{
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::const_iterator k;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i)
-		{
-			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
-			{
-				t = ((uint64_t) k->second) * ((uint64_t) *j);
-
-				_tmp[k->first] += t;
-
-				if (_tmp[k->first] < t)
-					_tmp[k->first] += VD.field ()._two64;
-			}
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l % VD.field ().modulus;
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<int64_t> > ::
-	mulColDenseSpecialized(const VectorDomain<Modular<int64_t> > &VD,
-			       Vector1 &w,
-			       const Matrix &A,
-			       const Vector2 &v,
-			       VectorCategories::SparseAssociativeVectorTag) const
-	{
-
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::const_iterator k;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i)
-		{
-			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
-			{
-				t = ((uint64_t) k->second) * ((uint64_t) *j);
-
-				_tmp[k->first] += t;
-
-				if (_tmp[k->first] < t)
-					_tmp[k->first] += VD.field ()._two64;
-			}
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l % VD.field ().modulus;
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<int64_t> > ::
-	mulColDenseSpecialized (const VectorDomain<Modular<int64_t> > &VD,
-				Vector1 &w,
-				const Matrix &A,
-				const Vector2 &v,
-				VectorCategories::SparseParallelVectorTag) const
-	{
-
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::first_type::const_iterator k_idx;
-		typename Matrix::Column::second_type::const_iterator k_elt;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i)
-		{
-			for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
-			     k_idx != i->first.end ();
-			     ++k_idx, ++k_elt, ++l)
-			{
-				t = ((uint64_t) *k_elt) * ((uint64_t) *j);
-
-				_tmp[*k_idx] += t;
-
-				if (_tmp[*k_idx] < t)
-					_tmp[*k_idx] += VD.field ()._two64;
-			}
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l % VD.field ().modulus;
-
-		return w;
-	}
-
-
-}
-
-#undef LINBOX_MAX_INT64
-
-#include "linbox/randiter/modular.h"
-
-#endif //__LINBOX_modular_int64_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular-short.h b/linbox/field/Modular/modular-short.h
deleted file mode 100644
index e3236e2..0000000
--- a/linbox/field/Modular/modular-short.h
+++ /dev/null
@@ -1,794 +0,0 @@
-/* Copyright (C) 2010 LinBox
- * Written by <?>
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*! @file field/Modular/modular-short.h
- * @ingroup field
- * @brief  representation of <code>Z/mZ</code> over \c short .
- */
-#ifndef __LINBOX_modular_short_H
-#define __LINBOX_modular_short_H
-
-
-#include "math.h"
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/util/debug.h"
-#include "linbox/field/field-traits.h"
-
-#ifndef LINBOX_MAX_INT16 /* 32767 */
-#define LINBOX_MAX_INT16 INT16_MAX
-#endif
-
-#ifdef __ICC /*  pas content avec x = -x par exemple */
-#pragma warning(disable:2259)
-#endif
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
-	template<class Element>
-	class Modular;
-
-	template<class Element>
-	class ModularRandIter;
-
-	template<class Field>
-	class FieldAXPY;
-
-	template<class Field>
-	class DotProductDomain;
-
-	template<class Field>
-	class MVProductDomain;
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	template <class Element>
-	struct ClassifyRing<Modular<Element> >;
-
-	template <>
-	struct ClassifyRing<Modular<short> >{
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-	/** \brief Specialization of Modular to short element type with efficient dot product.
-	 *
-	 * Efficient element operations for dot product, mul, axpy, by using floating point
-	 * inverse of modulus (borrowed from NTL) and some use of non-normalized intermediate values.
-	 *
-	 * Requires: modulus < 2^15.
-	 * Intended use: 2^7 < prime modulus < 2^15.
-	 \ingroup field
-	 */
-	template <>
-	class Modular<int16_t> : public FieldInterface {
-	public:
-		typedef int16_t Element;
-	protected:
-		Element modulus;
-		unsigned long lmodulus;
-		double modulusinv;
-
-	public:
-		const Element one,zero,mOne;
-		friend class FieldAXPY<Modular<Element> >;
-		friend class DotProductDomain<Modular<Element> >;
-		friend class MVProductDomain<Modular<Element> >;
-
-		typedef ModularRandIter<Element> RandIter;
-
-		//default modular field,taking 251 as default modulus
-		Modular () :
-			modulus(251),lmodulus((unsigned long)modulus)
-			,one((Element)1),zero((Element)0),mOne(Element(modulus-(Element)1))
-		{
-			modulusinv=1/(double)modulus;
-		}
-
-		Modular (int value, int exp = 1)  :
-			modulus((Element)value),lmodulus((unsigned long) value)
-			,one((Element)1),zero((Element)0),mOne(Element(modulus-(Element)1))
-		{
-			modulusinv = 1 / ((double) value);
-#ifdef DEBUG
-			if(value<=1)
-				throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be > 1");
-			integer max;
-			if(value>FieldTraits< Modular<Element> >::maxModulus(max))
-				throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus is too big");
-			if(exp != 1)
-				throw PreconditionFailed(__func__,__FILE__,__LINE__,"exponent must be 1");
-#endif
-		}
-
-		Modular(const Modular<Element>& mf) :
-			modulus(mf.modulus),lmodulus(mf. lmodulus),modulusinv(mf.modulusinv)
-			,one(mf.one),zero(mf.zero),mOne(mf.mOne)
-		{}
-
-		const Modular &operator=(const Modular<Element> &F)
-		{
-			modulus    = F. modulus;
-			lmodulus   = F. lmodulus ;
-			modulusinv = F. modulusinv;
-			F.assign(const_cast<Element&>(one),F.one);
-			F.assign(const_cast<Element&>(zero),F.zero);
-			F.assign(const_cast<Element&>(mOne),F.mOne);
-
-
-			return *this;
-		}
-
-		inline integer &cardinality (integer &c) const
-		{
-			return c = modulus;
-		}
-
-		inline integer &characteristic (integer &c) const
-		{
-			return c = modulus;
-		}
-
-		inline unsigned long cardinality () const
-		{
-			return  lmodulus;
-		}
-
-		inline unsigned  long characteristic () const
-		{
-			return  lmodulus;
-		}
-
-
-		inline integer &convert (integer &x, const Element &y) const
-		{
-			return x = y;
-		}
-
-		inline std::ostream &write (std::ostream &os) const
-		{
-			return os << "Element mod " << modulus;
-		}
-
-		inline std::istream &read (std::istream &is)
-		{
-			int prime;
-			is >> prime;
-#ifdef DEBUG
-			if(prime <= 1) throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be > 1");
-			integer max;
-			if(prime > FieldTraits< Modular<Element> >::maxModulus(max)) throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus is too big");
-#endif
-			modulus = (Element) prime;
-			modulusinv = 1 /((double) modulus );
-
-			return is;
-		}
-
-		inline std::ostream &write (std::ostream &os, const Element &x) const
-		{
-			return os << x;
-		}
-
-		inline std::istream &read (std::istream &is, Element &x) const
-		{
-			integer tmp;
-			is >> tmp;
-			init(x,tmp);
-			return is;
-		}
-
-		template<class T>
-		inline Element &init (Element &x, const T& y) const
-		{
-			return init( x, static_cast<integer>(y) );
-		}
-
-		inline Element &init (Element &x, const integer &y) const
-		{
-			x = Element(y % lmodulus);
-			if (x < 0)
-				x = Element((int) x + (int)modulus);
-			return x;
-		}
-
-		inline Element& init(Element& x, int y) const
-		{
-			x = (Element)(y % int(modulus));
-			if ( x < 0 )
-				x = Element((int) x + (int)modulus);
-			return x;
-		}
-
-		inline Element& init(Element& x, long y) const
-		{
-			x = Element(y % (long)modulus);
-			if ( x < 0 )
-				x = Element((int) x + (int)modulus);
-			return x;
-		}
-
-		inline Element &init (Element & x, const double &y) const
-		{
-			double z = fmod(y, (double)modulus);
-			if (z < 0) z += (double)modulus;
-			//z += 0.5; // C Pernet Sounds nasty and not necessary
-			return x = static_cast<Element>(z); //rounds towards 0
-		}
-
-		inline Element &init (Element &x, const float &y) const
-		{
-			return init (x, (double) y);
-		}
-
-		Element &init(Element &x) const
-		{
-			return x = 0 ;
-		}
-		inline Element& assign(Element& x, const Element& y) const
-		{
-			return x = y;
-		}
-
-
-		inline bool areEqual (const Element &x, const Element &y) const
-		{
-			return x == y;
-		}
-
-		inline  bool isZero (const Element &x) const
-		{
-			return x == 0;
-		}
-
-		inline bool isOne (const Element &x) const
-		{
-			return x == 1;
-		}
-
-		inline Element &add (Element &x, const Element &y, const Element &z) const
-		{
-			x = Element((int)y + (int)z);
-			if ( (uint16_t)x >= (uint16_t)modulus )
-				x = (Element) (( (uint16_t)x )- modulus);
-			return x;
-		}
-
-		inline Element &sub (Element &x, const Element &y, const Element &z) const
-		{
-			x = Element(y - z);
-			if (x < 0)
-				x = Element((int) x + (int)modulus);
-			return x;
-		}
-
-		inline Element &mul (Element &x, const Element &y, const Element &z) const
-		{
-			Element q;
-
-			double ab=((double) y)* ((double) z);
-			q  = (Element)(ab*modulusinv);  // q could be off by (+/-) 1
-			x = (Element) (ab - ((double) q )* ((double) modulus));
-
-
-			if (x >= modulus)
-				x = Element((int) x - (int)modulus);
-			else if (x < 0)
-				x = Element((int) x + (int)modulus);
-
-			return x;
-		}
-
-		inline Element &div (Element &x, const Element &y, const Element &z) const
-		{
-			Element temp;
-			inv (temp, z);
-			return mul (x, y, temp);
-		}
-
-		inline Element &neg (Element &x, const Element &y) const
-		{
-			if(y==0)
-				return x=0;
-			else
-				return x= Element(modulus-y);
-		}
-
-		inline Element &inv (Element &x, const Element &y) const
-		{
-			Element d, t;
-			XGCD(d, x, t, y, modulus);
-#ifdef DEBUG
-			if (d != 1)
-				throw PreconditionFailed(__func__,__FILE__,__LINE__,"InvMod: inverse undefined");
-#endif
-			if (x < 0)
-				return x = Element((int) x + (int)modulus);
-			else
-				return x;
-
-		}
-
-		inline Element &axpy (Element &r,
-				      const Element &a,
-				      const Element &x,
-				      const Element &y) const
-		{
-			Element q;
-
-			double ab=((double) a)* ((double) x) + ( double ) y;
-			q  = (Element)(ab*modulusinv);  // q could be off by (+/-) 1
-			r = (Element) (ab - ((double) q )* ((double) modulus));
-
-
-			if (r >= modulus)
-				r = Element((int) r - (int)modulus);
-			else if (r < 0)
-				r = Element((int) r + (int)modulus);
-
-			return r;
-
-		}
-
-		inline Element &addin (Element &x, const Element &y) const
-		{
-			x = Element(x+y);
-			if ( ((uint16_t) x) >= (uint16_t)modulus )
-				x = Element( ((uint16_t) x)-modulus );
-			return x;
-		}
-
-		inline Element &subin (Element &x, const Element &y) const
-		{
-			x = Element(x - y);
-			if (x < 0) x = Element(x+modulus);
-			return x;
-		}
-
-		inline Element &mulin (Element &x, const Element &y) const
-		{
-			return mul(x,x,y);
-		}
-
-		inline Element &divin (Element &x, const Element &y) const
-		{
-			return div(x,x,y);
-		}
-
-		inline Element &negin (Element &x) const
-		{
-			if (x == 0) return x;
-			else return x = Element(modulus - x);
-		}
-
-		inline Element &invin (Element &x) const
-		{
-			return inv (x, x);
-		}
-
-		inline Element &axpyin (Element &r, const Element &a, const Element &x) const
-		{
-
-			Element q;
-
-			double ab = ((double) a)* ((double) x) + ( double ) r;
-			q  = (Element)(ab*modulusinv);  // q could be off by (+/-) 1
-			r = (Element) (ab - ((double) q )* ((double) modulus));
-
-
-			if (r >= modulus)
-				r = Element(r - modulus);
-			else if (r < 0)
-				r = Element( r + modulus );
-
-			return r;
-		}
-
-		static inline Element getMaxModulus()
-		{
-			return 32767;  // 2^15 - 1
-			// linbox_check(180*181 < INT16_MAX);
-			// return 181 ;
-		}
-
-	private:
-
-		static void XGCD(int16_t& d, int16_t& s, int16_t& t, int16_t a, int16_t b)
-		{
-			int32_t u, v, u0, v0, u1, v1, u2, v2, q, r;
-
-			Element aneg = 0, bneg = 0;
-
-			if (a < 0) {
-#ifdef DEBUG
-				if (a < -LINBOX_MAX_INT16) throw PreconditionFailed(__func__,__FILE__,__LINE__,"XGCD: integer overflow");
-#endif
-				a = Element(-a);
-				aneg = 1;
-			}
-
-			if (b < 0) {
-#ifdef DEBUG
-				if (b < -LINBOX_MAX_INT16) throw PreconditionFailed(__func__,__FILE__,__LINE__,"XGCD: integer overflow");
-#endif
-				b = Element(-b);
-				bneg = 1;
-			}
-
-			u1 = 1; v1 = 0;
-			u2 = 0; v2 = 1;
-			u = a; v = b;
-
-
-			while (v != 0) {
-				q = u / v;
-				r = Element(u % v);
-				u = v;
-				v = r;
-				u0 = u2;
-				v0 = v2;
-				u2 =  u1 - q*u2;
-				v2 = v1- q*v2;
-				u1 = u0;
-				v1 = v0;
-			}
-
-			if (aneg)
-				u1 = -u1;
-
-			if (bneg)
-				v1 = -v1;
-
-			d = Element(u);
-			s = Element(u1);
-			t = Element(v1);
-		}
-
-	};
-
-	template <>
-	class FieldAXPY<Modular<int16_t> > {
-	public:
-
-		typedef int16_t Element;
-		typedef Modular<int16_t> Field;
-
-		FieldAXPY (const Field &F) :
-			_field (F),_y(0)
-		{
-		}
-
-		FieldAXPY (const FieldAXPY &faxpy) :
-			_field (faxpy._field), _y (0)
-		{}
-
-		FieldAXPY<Modular<int16_t> > &operator = (const FieldAXPY &faxpy)
-		{
-			_field = faxpy._field;
-			_y = faxpy._y;
-			return *this;
-		}
-
-		inline uint64_t& mulacc (const Element &a, const Element &x)
-		{
-			uint64_t t = ( (uint32_t) a ) * ( (uint32_t) x );
-			return _y+=t;
-		}
-
-		inline uint64_t& accumulate (const Element &t)
-		{
-			return _y += (uint64_t) t;
-		}
-
-		inline Element& get (Element &y)
-		{
-			y = Element(_y % (uint64_t) _field.modulus);
-			return y;
-		}
-
-		inline FieldAXPY &assign (const Element y)
-		{
-			_y = (uint64_t) y;
-			return *this;
-		}
-
-		inline void reset()
-		{
-			_y = 0;
-		}
-
-	private:
-
-		Field _field;
-		uint64_t _y;
-		uint16_t _two_64;
-	};
-
-
-	template <>
-	class DotProductDomain<Modular<int16_t> > : private virtual VectorDomainBase<Modular<int16_t> > {
-
-	public:
-		typedef int16_t Element;
-		DotProductDomain (const Modular<int16_t> &F) :
-			VectorDomainBase<Modular<int16_t> > (F)
-		{ }
-
-
-	protected:
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-
-			typename Vector1::const_iterator i;
-			typename Vector2::const_iterator j;
-
-			uint64_t y = 0;
-			// uint64_t t;
-
-			for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j) {
-				y  += ( (uint32_t) *i ) * ( (uint32_t) *j );
-			}
-
-			y %= (uint64_t) _field.modulus;
-
-			return res = (Element) y;
-
-		}
-
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-			typename Vector1::first_type::const_iterator i_idx;
-			typename Vector1::second_type::const_iterator i_elt;
-
-			uint64_t y = 0;
-
-			for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt) {
-				y += ( (uint32_t) *i_elt ) * ( (uint32_t) v2[*i_idx] );
-			}
-
-			y %= (uint64_t) _field.modulus;
-
-			return res = (Element) y;
-		}
-
-	};
-	// Specialization of MVProductDomain for int16_t modular field
-
-	template <>
-	class MVProductDomain<Modular<int16_t> >
-	{
-	public:
-
-		typedef int16_t Element;
-
-	protected:
-		template <class Vector1, class Matrix, class Vector2>
-		inline Vector1 &mulColDense
-		(const VectorDomain<Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
-		{
-			return mulColDenseSpecialized
-			(VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
-		}
-
-	private:
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::DenseVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseSequenceVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseAssociativeVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseParallelVectorTag) const;
-
-		mutable std::vector<uint64_t> _tmp;
-	};
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<int16_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::DenseVectorTag) const
-	{
-
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::const_iterator k;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i) {
-			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
-				t = ((uint32_t) *k) * ((uint32_t) *j);
-
-				*l += t;
-
-			}
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l % VD.field ().modulus;
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<int16_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseSequenceVectorTag) const
-	{
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::const_iterator k;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i) {
-			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
-				t = ((uint32_t) k->second) * ((uint32_t) *j);
-
-				_tmp[k->first] += t;
-
-			}
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l % VD.field ().modulus;
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<int16_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseAssociativeVectorTag) const
-	{
-
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::const_iterator k;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i) {
-			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
-				t = ((uint32_t) k->second) * ((uint32_t) *j);
-
-				_tmp[k->first] += t;
-
-			}
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l % VD.field ().modulus;
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<int16_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseParallelVectorTag) const
-	{
-
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::first_type::const_iterator k_idx;
-		typename Matrix::Column::second_type::const_iterator k_elt;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i) {
-			for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
-			     k_idx != i->first.end ();
-			     ++k_idx, ++k_elt, ++l)
-			{
-				t = ((uint32_t) *k_elt) * ((uint32_t) *j);
-
-				_tmp[*k_idx] += t;
-
-			}
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l % VD.field ().modulus;
-
-		return w;
-	}
-
-
-}
-
-#ifdef __ICC
-#pragma warning(enable:2259)
-#endif
-
-#include "linbox/randiter/modular.h"
-#endif //__LINBOX_modular_short_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular-unsigned.h b/linbox/field/Modular/modular-unsigned.h
deleted file mode 100644
index f407611..0000000
--- a/linbox/field/Modular/modular-unsigned.h
+++ /dev/null
@@ -1,1102 +0,0 @@
-/* linbox/field/modular.h
- * Copyright (C) 1999-2001 William J Turner,
- *               2001 Bradford Hovinen
- * Copyright (C) 2011 LinBox
- *
- * Written by William J Turner <wjturner at math.ncsu.edu>,
- *            Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * ------------------------------------
- * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * LargeModular is now replace by a class Modular parameterized on the element
- * type. So, the old LargeModular is equivalent to Modular<integer>. All other
- * interface details are exactly the same.
- *
- * Renamed from large-modular.h to modular.h
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_field_modular_unsigned_H
-#define __LINBOX_field_modular_unsigned_H
-namespace LinBox
-{
-	/** @brief Allows compact storage when the modulus is less than 2^8.
-	 *
-	 *  Requires <code>1 < modulus < 2^8</code>, normally prime.  See \ref
-	 *  FieldArchetype for member specifications.
-	 */
-	template <>
-	class Modular<uint8_t> : public FieldInterface, public ModularBase<uint8_t> {
-	public:
-		typedef uint8_t Element;
-		const Element zero,one, mOne;
-
-		Modular () :
-			zero(0),one(1),mOne(0),_k (0)
-		{}
-		Modular (uint32_t modulus) :
-			ModularBase<Element> (modulus),
-			zero(0),one(1),mOne((Element)(modulus-1)),
-			_k (((uint64_t) -1LL) / ((modulus - 1) * (modulus - 1))),
-			_pinv (1.0 / (double) ((Element) modulus))
-		{
-			linbox_check(modulus < UINT8_MAX);
-		}
-		Modular (const integer &modulus) :
-			ModularBase<Element> ((unsigned long) modulus),
-			zero(0),one(1),mOne(modulus-1),
-			_k (((uint64_t) -1LL) / (((Element)modulus - 1) * ((Element)modulus - 1))),
-			_pinv (1.0 / (double) ((Element) modulus))
-		{
-			linbox_check(modulus < UINT8_MAX);
-		}
-
-		const Modular &operator=(const Modular &F)
-		{
-			ModularBase<Element>::_modulus = F._modulus;
-			_k = F._k;
-			_pinv = F._pinv;
-			F.assign(const_cast<Element&>(one),F.one);
-			F.assign(const_cast<Element&>(zero),F.zero);
-			F.assign(const_cast<Element&>(mOne),F.mOne);
-
-
-			return *this;
-		}
-
-		Element &init (Element &x, const integer &y = 0) const
-		{
-			x = (Element) (abs (y) % integer (ModularBase<Element>::_modulus));
-			if (y < 0)
-				x = Element(ModularBase<Element>::_modulus - x);
-			return x;
-		}
-
-		Element &init (Element &x, const double &y) const
-		{
-			double z = fmod(y, (double)_modulus);
-			if (z < 0) z += (double) _modulus;
-			return x = (Element) (z);
-		}
-
-		Element &init (Element &x, const long int &y ) const
-		{
-			x = (Element)(abs (y) % (long int) (ModularBase<Element>::_modulus));
-			if (y < 0L)
-				x = Element(ModularBase<Element>::_modulus - x);
-			return x;
-		}
-
-		Element &init (Element &x, const int &y ) const
-		{
-			x = (Element)(abs (y) % (int) (ModularBase<Element>::_modulus));
-			if (y < 0)
-				x = Element(ModularBase<Element>::_modulus - x);
-			return x;
-		}
-
-		/*! add elements
-		 * @todo is it faster to use uint32 and multiple casts ?
-		 */
-		Element &add (Element &x, const Element &y, const Element &z) const
-		{
-			uint32_t t = (uint32_t) y + (uint32_t) z;
-			if (t >= (uint32_t) ModularBase<Element>::_modulus)
-				t -= ModularBase<Element>::_modulus;
-			return x = (Element)t;
-		}
-
-		Element &sub (Element &x, const Element &y, const Element &z) const
-		{
-			int32_t t = (int32_t) y - (int32_t) z;
-			if (t < 0)
-				t += ModularBase<Element>::_modulus;
-			return x =  (Element)t;
-		}
-
-		Element &mul (Element &x, const Element &y, const Element &z) const
-		{
-			return x = Element( ((uint32_t) y * (uint32_t) z) % (uint32_t) ModularBase<Element>::_modulus );
-		}
-
-		Element &div (Element &x, const Element &y, const Element &z) const
-		{
-			Element temp;
-			inv (temp, z);
-			return mul (x, y, temp);
-		}
-
-		Element &neg (Element &x, const Element &y) const
-		{
-			if (y == 0)
-				return x = y;
-			else
-				return x = (Element) (ModularBase<Element>::_modulus - y);
-		}
-
-		Element &inv (Element &x, const Element &y) const
-		{
-			// The extended Euclidean algoritm
-			int32_t x_int, y_int, q, tx, ty, temp;
-			x_int = ModularBase<Element>::_modulus;
-			y_int = y;
-			tx = 0;
-			ty = 1;
-
-			while (y_int != 0) {
-				// always: gcd (modulus,residue) = gcd (x_int,y_int)
-				//         sx*modulus + tx*residue = x_int
-				//         sy*modulus + ty*residue = y_int
-				q = x_int / y_int; // integer quotient
-				temp = y_int; y_int = x_int - q * y_int;
-				x_int = temp;
-				temp = ty; ty = tx - q * ty;
-				tx = temp;
-			}
-
-			if (tx < 0) tx += ModularBase<Element>::_modulus;
-
-			// now x_int = gcd (modulus,residue)
-			return x = (Element) tx;
-		}
-
-		Element &axpy (Element &r,
-			       const Element &a,
-			       const Element &x,
-			       const Element &y) const
-		{
-			r = Element(((uint32_t) a * (uint32_t) x + (uint32_t) y) % (uint32_t) ModularBase<Element>::_modulus) ;
-			return r;
-		}
-
-		Element &addin (Element &x, const Element &y) const
-		{
-			uint32_t t = uint32_t((long) x + (long) y);
-			if (t >= (uint32_t) ModularBase<Element>::_modulus) t -= ModularBase<Element>::_modulus;
-			return x = (Element) t;
-		}
-
-		/*! subin.
-		 * @todo why \c long here ?
-		 */
-		Element &subin (Element &x, const Element &y) const
-		{
-			long t = x - y;
-			if (t < 0) t += ModularBase<Element>::_modulus;
-			return x = (Element) t;
-		}
-
-		Element &mulin (Element &x, const Element &y) const
-		{
-			x = (Element)( ((uint32_t) x * (uint32_t) y) % (uint32_t) ModularBase<Element>::_modulus );
-			return x;
-		}
-
-		Element &divin (Element &x, const Element &y) const
-		{
-			Element temp;
-			inv (temp, y);
-			return mulin (x, temp);
-		}
-
-		Element &negin (Element &x) const
-		{
-			if (x == 0)
-				return x;
-			else
-				return x = Element(ModularBase<Element>::_modulus - x);
-		}
-
-		Element &invin (Element &x) const
-		{
-			return inv (x, x);
-		}
-
-		Element &axpyin (Element &r, const Element &a, const Element &x) const
-		{
-			r = (Element)( ((uint32_t) r + (uint32_t) a * (uint32_t) x) % (uint32_t) ModularBase<Element>::_modulus);
-			return r;
-		}
-
-	private:
-
-		friend class FieldAXPY<Modular<Element> >;
-		friend class DotProductDomain<Modular<Element> >;
-		friend class MVProductDomain<Modular<Element> >;
-
-		// Number of times one can perform an axpy into a long long
-		// before modding out is mandatory.
-		uint64_t _k;
-
-		// Inverse of modulus in floating point
-		double _pinv;
-
-	}; // class Modular<uint8_t>
-
-	/*! Specialization of FieldAXPY for uint8_t modular field */
-
-	template <>
-	class FieldAXPY<Modular<uint8_t> > {
-	public:
-
-		typedef uint8_t Element;
-		typedef Modular<uint8_t> Field;
-
-		FieldAXPY (const Field &F) :
-			_field (F),
-			i ( (int)F._k)
-		{
-			_y = 0;
-		}
-
-		FieldAXPY (const FieldAXPY &faxpy) :
-			_field (faxpy._field),
-			_y (0),
-			i ((int)faxpy._field._k)
-		{}
-
-		FieldAXPY<Modular<uint8_t> > &operator = (const FieldAXPY &faxpy)
-		{
-			_field = faxpy._field;
-			_y = faxpy._y;
-			return *this;
-		}
-
-		inline uint64_t& mulacc (const Element &a, const Element &x)
-		{
-			uint32_t t = (uint32_t) a * (uint32_t) x;
-
-			if (!i--) {
-				i = int(_field._k);
-				return _y = _y % (uint32_t) _field._modulus + t;
-			}
-			else
-				return _y += t;
-		}
-
-		inline uint64_t& accumulate (const Element &t)
-		{
-
-			if (!i--) {
-				i = int( _field._k );
-				return _y = _y % (uint32_t) _field._modulus + t;
-			}
-			else
-				return _y += t;
-		}
-
-		inline Element &get (Element &y)
-		{
-			_y %= (uint32_t) _field._modulus;
-			if ((int32_t) _y < 0) _y += _field._modulus;
-			y = (uint8_t) _y;
-			i = int(_field._k);
-			return y;
-		}
-
-		inline FieldAXPY &assign (const Element y)
-		{
-			_y = y;
-			i = int(_field._k);
-			return *this;
-		}
-
-		inline void reset()
-		{
-			_y = 0;
-		}
-
-	private:
-
-		Field _field;
-		uint64_t _y;
-		int i;
-	};
-
-	//! Specialization of DotProductDomain for unsigned short modular field
-
-	template <>
-	class DotProductDomain<Modular<uint8_t> > : private virtual VectorDomainBase<Modular<uint8_t> > {
-	public:
-
-		typedef uint8_t Element;
-
-		DotProductDomain (const Modular<uint8_t> &F) :
-			VectorDomainBase<Modular<uint8_t> > (F)
-		{}
-
-	protected:
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const;
-
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const;
-	};
-
-	//! Specialization of MVProductDomain for uint8_t modular field
-
-	template <>
-	class MVProductDomain<Modular<uint8_t> > {
-	public:
-
-		typedef uint8_t Element;
-
-	protected:
-		template <class Vector1, class Matrix, class Vector2>
-		inline Vector1 &mulColDense
-		(const VectorDomain<Modular<uint8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
-		{
-			return mulColDenseSpecialized (VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
-		}
-
-	private:
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<uint8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::DenseVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<uint8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseSequenceVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<uint8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseAssociativeVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<uint8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseParallelVectorTag) const;
-
-		mutable std::vector<uint32_t> _tmp;
-	};
-
-}
-
-namespace LinBox
-{
-	/** @brief Specialization of class Modular for uint16_t element type */
-	template <>
-	class Modular<uint16_t> : public FieldInterface, public ModularBase<uint16_t> {
-	public:
-
-		typedef uint16_t Element;
-
-		const Element zero,one, mOne;
-
-		Modular () :
-			zero(0),one(1),mOne(0),_k (0)
-		{}
-		Modular (uint32_t modulus) :
-			ModularBase<Element> (modulus),
-			zero(0),one(1),mOne((Element)(modulus-1)),
-			_k (((uint64_t) -1LL) / ((ModularBase<Element>::_modulus - 1) * (ModularBase<Element>::_modulus - 1))),
-			_pinv (1.0 / (double) ((Element) ModularBase<Element>::_modulus))
-		{
-			linbox_check(modulus<UINT16_MAX);
-		}
-		Modular (const integer &modulus) :
-			ModularBase<Element> ((unsigned long) modulus),
-			zero(0),one(1),mOne(Element(modulus-1)),
-			_k (((uint64_t) -1LL) / ((ModularBase<Element>::_modulus - 1) * (ModularBase<Element>::_modulus - 1))),
-			_pinv (1.0 / (double) ((Element) ModularBase<Element>::_modulus))
-		{
-			linbox_check(modulus<UINT16_MAX);
-		}
-
-		const Modular &operator=(const Modular &F)
-		{
-			ModularBase<Element>::_modulus = F._modulus;
-			_k = F._k;
-			_pinv = F._pinv;
-			F.assign(const_cast<Element&>(one),F.one);
-			F.assign(const_cast<Element&>(zero),F.zero);
-			F.assign(const_cast<Element&>(mOne),F.mOne);
-			return *this;
-		}
-
-		Element &init (Element &x, const integer &y) const
-		{
-			x = abs (y) % integer (ModularBase<Element>::_modulus);
-			if (y < 0)
-				x = Element(ModularBase<Element>::_modulus - x);
-			return x;
-		}
-
-		Element &init (Element &x, const double &y) const
-		{
-			double z = fmod(y, (double)_modulus);
-			if (z < 0)
-				z += (double) _modulus;
-			return x = (Element) (z);
-		}
-
-		Element &init (Element &x, const long int &y ) const
-		{
-			x = Element(abs (y) % (long int) (ModularBase<Element>::_modulus));
-			if (y < 0)
-				x = Element(ModularBase<Element>::_modulus - x);
-			return x;
-		}
-
-		Element &init (Element &x, const int &y ) const
-		{
-			x = Element(abs (y) % (int) (ModularBase<Element>::_modulus));
-			if (y < 0)
-				x = Element(ModularBase<Element>::_modulus - x);
-			return x;
-		}
-
-		Element &init(Element &x) const
-		{
-			return x = 0 ;
-		}
-
-		Element &add (Element &x, const Element &y, const Element &z) const
-		{
-			uint32_t t = (uint32_t) y + (uint32_t) z;
-			if (t >= (uint32_t) ModularBase<Element>::_modulus)
-				t -= ModularBase<Element>::_modulus;
-			return x = (Element) t;
-		}
-
-		Element &sub (Element &x, const Element &y, const Element &z) const
-		{
-			int32_t t = (int32_t) y - (int32_t) z;
-			if (t < 0) t += ModularBase<Element>::_modulus;
-			return x =  (Element) t;
-		}
-
-		Element &mul (Element &x, const Element &y, const Element &z) const
-		{
-			return x = (Element) ( ((uint32_t) y * (uint32_t) z) % (uint32_t) ModularBase<Element>::_modulus);
-		}
-
-		Element &div (Element &x, const Element &y, const Element &z) const
-		{
-			Element temp;
-			inv (temp, z);
-			return mul (x, y, temp);
-		}
-
-		Element &neg (Element &x, const Element &y) const
-		{
-			if (y == 0)
-				return x = y;
-			else
-				return x = (Element)(  ModularBase<Element>::_modulus - y);
-		}
-
-		Element &inv (Element &x, const Element &y) const
-		{
-			// The extended Euclidean algoritm
-			int32_t x_int, y_int, q, tx, ty, temp;
-			x_int = ModularBase<Element>::_modulus;
-			y_int = y;
-			tx = 0;
-			ty = 1;
-
-			while (y_int != 0) {
-				// always: gcd (modulus,residue) = gcd (x_int,y_int)
-				//         sx*modulus + tx*residue = x_int
-				//         sy*modulus + ty*residue = y_int
-				q = x_int / y_int; // integer quotient
-				temp = y_int; y_int = x_int - q * y_int;
-				x_int = temp;
-				temp = ty; ty = tx - q * ty;
-				tx = temp;
-			}
-
-			if (tx < 0) tx += ModularBase<Element>::_modulus;
-
-			// now x_int = gcd (modulus,residue)
-			return x = (Element)  tx;
-		}
-
-		Element &axpy (Element &r,
-			       const Element &a,
-			       const Element &x,
-			       const Element &y) const
-		{
-			r =  (Element)( ((uint32_t) a * (uint32_t) x + (uint32_t) y) % (uint32_t) ModularBase<Element>::_modulus );
-			return r;
-		}
-
-		Element &addin (Element &x, const Element &y) const
-		{
-			uint32_t t = uint32_t( (long) x + (long) y );
-			if (t >= (uint32_t) ModularBase<Element>::_modulus) t -= ModularBase<Element>::_modulus;
-			return x = (Element)  t;
-		}
-
-		Element &subin (Element &x, const Element &y) const
-		{
-			long t = x - y;
-			if (t < 0) t += ModularBase<Element>::_modulus;
-			return x =  (Element) t;
-		}
-
-		Element &mulin (Element &x, const Element &y) const
-		{
-			x =  (Element)( ((uint32_t) x * (uint32_t) y) % (uint32_t) ModularBase<Element>::_modulus);
-			return x;
-		}
-
-		Element &divin (Element &x, const Element &y) const
-		{
-			Element temp;
-			inv (temp, y);
-			return mulin (x, temp);
-		}
-
-		Element &negin (Element &x) const
-		{
-			if (x == 0)
-				return x;
-			else
-				return x = (Element) ( ModularBase<Element>::_modulus - x);
-		}
-
-		Element &invin (Element &x) const
-		{
-			return inv (x, x);
-		}
-
-		Element &axpyin (Element &r, const Element &a, const Element &x) const
-		{
-			r = (Element) ( ((uint32_t) r + (uint32_t) a * (uint32_t) x) % (uint32_t) ModularBase<Element>::_modulus);
-			return r;
-		}
-
-	private:
-
-		friend class FieldAXPY<Modular<Element> >;
-		friend class DotProductDomain<Modular<Element> >;
-		friend class MVProductDomain<Modular<Element> >;
-
-		// Number of times one can perform an axpy into a long long
-		// before modding out is mandatory.
-		uint64_t _k;
-
-		// Inverse of modulus in floating point
-		double _pinv;
-
-	}; // class Modular<uint16_t>
-
-	/*! Specialization of FieldAXPY for uint16_t modular field */
-	template <>
-	class FieldAXPY<Modular<uint16_t> > {
-	public:
-
-		typedef uint16_t Element;
-		typedef Modular<uint16_t> Field;
-
-		FieldAXPY (const Field &F) :
-			_field (F),
-			i ((int)F._k)
-		{ _y = 0; }
-		FieldAXPY (const FieldAXPY &faxpy) :
-			_field (faxpy._field), _y (0), i ((int) faxpy._field._k)
-		{}
-
-		FieldAXPY<Modular<uint16_t> > &operator = (const FieldAXPY &faxpy)
-		{
-			_field = faxpy._field;
-			_y = faxpy._y;
-			return *this;
-		}
-
-		inline uint64_t& mulacc (const Element &a, const Element &x)
-		{
-			uint64_t t = (uint64_t) ((long long) a * (long long) x);
-
-			if (!i--) {
-				i = (int) _field._k;
-				return _y = _y % (uint64_t) _field._modulus + t;
-			}
-			else
-				return _y += t;
-		}
-
-		inline uint64_t& accumulate (const Element &t)
-		{
-			if (!i--) {
-				i = (int) _field._k;
-				return _y = _y % (uint64_t) _field._modulus + t;
-			}
-			else
-				return _y += t;
-		}
-
-		inline Element &get (Element &y)
-		{
-			_y %= (uint64_t) _field._modulus;
-			if ((int64_t) _y < 0) _y += _field._modulus;
-			y = (uint16_t) _y;
-			i = (int) _field._k;
-			return y;
-		}
-
-		inline FieldAXPY &assign (const Element y)
-		{
-			_y = y;
-			i = (int) _field._k;
-			return *this;
-		}
-
-		inline void reset()
-		{
-			_y = 0;
-		}
-
-	private:
-
-		Field _field;
-		uint64_t _y;
-		int i;
-	};
-
-	//! Specialization of DotProductDomain for unsigned short modular field
-
-	template <>
-	class DotProductDomain<Modular<uint16_t> > : private virtual VectorDomainBase<Modular<uint16_t> > {
-	public:
-
-		typedef uint16_t Element;
-
-		DotProductDomain (const Modular<uint16_t> &F) :
-			VectorDomainBase<Modular<uint16_t> > (F)
-		{}
-
-	protected:
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const;
-
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const;
-	};
-
-	//! Specialization of MVProductDomain for uint16_t modular field
-
-	template <>
-	class MVProductDomain<Modular<uint16_t> > {
-	public:
-
-		typedef uint16_t Element;
-
-	protected:
-		template <class Vector1, class Matrix, class Vector2>
-		inline Vector1 &mulColDense
-		(const VectorDomain<Modular<uint16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
-		{
-			return mulColDenseSpecialized (VD, w, A, v, VectorTraits<typename Matrix::Column>::VectorCategory ());
-		}
-
-	private:
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<uint16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::DenseVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<uint16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseSequenceVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<uint16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseAssociativeVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<uint16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseParallelVectorTag) const;
-
-		mutable std::vector<uint64_t> _tmp;
-	};
-
-}
-
-namespace LinBox
-{
-	/** @brief Specialization of class Modular for uint32_t element type */
-	template <>
-	class Modular<uint32_t> : public FieldInterface, public ModularBase<uint32_t> {
-	public:
-
-		typedef uint32_t Element;
-		typedef Modular<Element>     Self_t;
-		// typedef ModularBase<Element> Father_t;
-		typedef Modular<uint32_t> Father_t;
-		typedef ModularBase<Element>::RandIter RandIter;
-
-		const Element zero,one,mOne ;
-
-		Modular () :
-			zero(0),one(1),mOne(0)
-		{}
-		Modular (uint32_t modulus)  :
-			ModularBase<uint32_t> (modulus),zero(0),one(1),mOne(modulus-1)
-		{
-			init_two_64 ();
-		}
-		Modular (const integer &modulus) :
-			ModularBase<uint32_t> (modulus),zero(0),one(1),mOne(modulus-1)
-		{
-			init_two_64 ();
-		}
-
-		const Modular &operator=(const Modular &F)
-		{
-			ModularBase<Element>::_modulus = F._modulus;
-			_two_64 = F._two_64;
-			F.assign(const_cast<Element&>(one),F.one);
-			F.assign(const_cast<Element&>(zero),F.zero);
-			F.assign(const_cast<Element&>(mOne),F.mOne);
-
-			return *this;
-		}
-
-		Element &init (Element &x, const integer &y ) const
-		{
-			x = abs (y) % integer (ModularBase<Element>::_modulus);
-			if (y < 0) x = ModularBase<Element>::_modulus - x;
-			return x;
-		}
-
-		Element &init (Element &x, const long int &y ) const
-		{
-			x = abs (y) % integer (ModularBase<Element>::_modulus);
-			if (y < 0) x = ModularBase<Element>::_modulus - x;
-			return x;
-		}
-
-		Element &init (Element &x, const int &y ) const
-		{
-			x = abs (y) % integer (ModularBase<Element>::_modulus);
-			if (y < 0) x = ModularBase<Element>::_modulus - x;
-			return x;
-		}
-
-		Element &init (Element &x, const long unsigned int &y ) const
-		{
-			x = Element(y %  (ModularBase<Element>::_modulus));
-			return x;
-		}
-
-		Element &init (Element &x, const double &y) const
-		{
-			double z = fmod(y, (double)_modulus);
-			if (z < 0) z += (double) _modulus;
-			return x = (Element) (z);
-		}
-
-		template< class XXX>
-		Element& init(Element & x, const XXX & y) const
-		{
-			return init(x,double(y));
-		}
-
-		Element &init (Element &x) const
-		{
-			return x = zero ;
-		}
-
-
-		Element &add (Element &x, const Element &y, const Element &z) const
-		{
-			x = y + z;
-			if ((uint32_t) x >= (uint32_t) ModularBase<Element>::_modulus) x -= ModularBase<Element>::_modulus;
-			return x;
-		}
-
-		Element &sub (Element &x, const Element &y, const Element &z) const
-		{
-			x = y - z;
-			if ((int32_t) x < 0) x += ModularBase<Element>::_modulus;
-			return x;
-		}
-
-		Element &mul (Element &x, const Element &y, const Element &z) const
-		{
-			return x = Element( ((uint64_t) y * (uint64_t) z) % (uint64_t) ModularBase<Element>::_modulus);
-		}
-
-		Element &div (Element &x, const Element &y, const Element &z) const
-		{
-			Element temp;
-			inv (temp, z);
-			return mul (x, y, temp);
-		}
-
-		Element &neg (Element &x, const Element &y) const
-		{
-			if (y == 0)
-				return x = y;
-			else
-				return x = ModularBase<Element>::_modulus - y;
-		}
-
-		Element &inv (Element &x, const Element &y) const
-		{
-			// The extended Euclidean algoritm
-			int64_t x_int, y_int, q, tx, ty, temp;
-			x_int = ModularBase<Element>::_modulus;
-			y_int = y;
-			tx = 0;
-			ty = 1;
-
-			while (y_int != 0) {
-				// always: gcd (modulus,residue) = gcd (x_int,y_int)
-				//         sx*modulus + tx*residue = x_int
-				//         sy*modulus + ty*residue = y_int
-				q = x_int / y_int; // integer quotient
-				temp = y_int;  y_int  = x_int  - q * y_int;
-				x_int  = temp;
-				temp = ty; ty = tx - q * ty;
-				tx = temp;
-			}
-
-			if (tx < 0) tx += ModularBase<Element>::_modulus;
-
-			// now x_int = gcd (modulus,residue)
-			return x = Element(tx);
-		}
-
-		Element &axpy (Element &r,
-			       const Element &a,
-			       const Element &x,
-			       const Element &y) const
-		{
-			r = Element( ((uint64_t) a * (uint64_t) x + (uint64_t) y) % (uint64_t) ModularBase<Element>::_modulus );
-			if ((int32_t) r < 0) r += ModularBase<Element>::_modulus;
-			return r;
-		}
-
-		Element &addin (Element &x, const Element &y) const
-		{
-			x += y;
-			if ((uint32_t) x >= (uint32_t) ModularBase<Element>::_modulus) x -= ModularBase<Element>::_modulus;
-			return x;
-		}
-
-		Element &subin (Element &x, const Element &y) const
-		{
-			x -= y;
-			if ((int32_t) x < 0) x += ModularBase<Element>::_modulus;
-			return x;
-		}
-
-		Element &mulin (Element &x, const Element &y) const
-		{
-			x = Element( ((uint64_t) x * (uint64_t) y) % (uint64_t) ModularBase<Element>::_modulus );
-			return x;
-		}
-
-		Element &divin (Element &x, const Element &y) const
-		{
-			Element temp;
-			inv (temp, y);
-			return mulin (x, temp);
-		}
-
-		Element &negin (Element &x) const
-		{
-			if (x == 0)
-				return x;
-			else
-				return x = ModularBase<Element>::_modulus - x;
-		}
-
-		Element &invin (Element &x) const
-		{
-			return inv (x, x);
-		}
-
-		Element &axpyin (Element &r, const Element &a, const Element &x) const
-		{
-			r = Element( ((uint64_t) r + (uint64_t) a * (uint64_t) x) % (uint64_t) ModularBase<Element>::_modulus );
-			if ((int32_t) r < 0) r += ModularBase<Element>::_modulus;
-			return r;
-		}
-
-	private:
-
-		void init_two_64 ()
-		{
-			uint64_t two_64 = 2;
-
-			for (int i = 0; i < 6; ++i)
-				two_64 = (two_64 * two_64) % ModularBase<Element>::_modulus;
-
-			_two_64 = (Element) two_64;
-		}
-
-		friend class FieldAXPY<Modular<uint32_t> >;
-		friend class DotProductDomain<Modular<uint32_t> >;
-		friend class MVProductDomain<Modular<uint32_t> >;
-
-		Element _two_64;
-
-	}; // class Modular<uint32_t>
-
-	/*! Specialization of FieldAXPY for unsigned short modular field */
-
-	template <>
-	class FieldAXPY<Modular<uint32_t> > {
-	public:
-
-		typedef uint32_t Element;
-		typedef Modular<uint32_t> Field;
-
-		FieldAXPY (const Field &F) :
-			_field (F), _y(0)
-		{ }
-
-		FieldAXPY (const FieldAXPY &faxpy) :
-			_field (faxpy._field), _y (0)
-		{}
-
-		FieldAXPY<Modular<uint32_t> > &operator = (const FieldAXPY &faxpy)
-		{
-			_field = faxpy._field;
-			_y = faxpy._y;
-			return *this;
-		}
-
-		inline uint64_t& mulacc (const Element &a, const Element &x)
-		{
-			uint64_t t = (uint64_t) a * (uint64_t) x;
-			_y += t;
-
-			if (_y < t)
-				return _y += _field._two_64;
-			else
-				return _y;
-		}
-
-		inline uint64_t& accumulate (const Element &t)
-		{
-			_y += t;
-
-			if (_y < t)
-				return _y += _field._two_64;
-			else
-				return _y;
-		}
-
-		inline uint64_t& accumulate_special (const Element &t)
-		{
-			return _y += t;
-		}
-
-		inline Element &get (Element &y) {
-			_y %= (uint64_t) _field._modulus;
-			//if ((int64_t) _y < 0) _y += _field._modulus;
-			return y = (uint32_t) _y;
-		}
-
-		inline FieldAXPY &assign (const Element y)
-		{
-			_y = y;
-			return *this;
-		}
-
-		inline void reset() {
-			_y = 0;
-		}
-
-	private:
-
-		Field _field;
-		uint64_t _y;
-	};
-
-	//! Specialization of DotProductDomain for uint32_t modular field
-
-	template <>
-	class DotProductDomain<Modular<uint32_t> > : private virtual VectorDomainBase<Modular<uint32_t> > {
-	public:
-
-		typedef uint32_t Element;
-
-		DotProductDomain (const Modular<uint32_t> &F) :
-			VectorDomainBase<Modular<uint32_t> > (F)
-		{}
-
-	protected:
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const;
-
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const;
-	};
-
-	//! Specialization of MVProductDomain for uint32_t modular field
-
-	template <>
-	class MVProductDomain<Modular<uint32_t> > {
-	public:
-
-		typedef uint32_t Element;
-
-	protected:
-		template <class Vector1, class Matrix, class Vector2>
-		inline Vector1 &mulColDense
-		(const VectorDomain<Modular<uint32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
-		{
-			return mulColDenseSpecialized (VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
-		}
-
-	private:
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<uint32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::DenseVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<uint32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseSequenceVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<uint32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseAssociativeVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<Modular<uint32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseParallelVectorTag) const;
-
-		mutable std::vector<uint64_t> _tmp;
-	};
-
-}
-
-#include "linbox/field/Modular/modular.inl"
-#endif // __LINBOX_field_modular_unsigned_H
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/Modular/modular.inl b/linbox/field/Modular/modular.inl
deleted file mode 100644
index 8223eeb..0000000
--- a/linbox/field/Modular/modular.inl
+++ /dev/null
@@ -1,771 +0,0 @@
-/* linbox/field/modular.inl
- * Copyright (C) 2002 Bradford Hovinen
- * Copyright (C) 2002 Ahmet Duran
- * Copyright (C) 2002 B. David Saunders
- *
- * Written by Bradford Hovinen <hovinen at cis.udel.edu>,
- *            Ahmet Duran <duran at cis.udel.edu>,
- *            Dave Saunders <saunders at cis.udel.edu>
- *
- * ------------------------------------
- *
- * 
- * ========LICENCE========
- * This file is part of the library LinBox.
- * 
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This 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
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_field_modular_INL
-#define __LINBOX_field_modular_INL
-
-//Dan Roche 7-2-04
-#ifndef __LINBOX_MIN
-#define __LINBOX_MIN(a,b) ( (a) < (b) ? (a) : (b) )
-#endif
-
-#include <iostream>
-
-namespace LinBox {
-
-	template <class Vector1, class Vector2>
-	inline uint8_t &DotProductDomain<Modular<uint8_t> >::dotSpecializedDD
-	(uint8_t &res, const Vector1 &v1, const Vector2 &v2) const
-	{
-		typename Vector1::const_iterator i = v1.begin ();
-		typename Vector2::const_iterator j = v2.begin ();
-
-		typename Vector1::const_iterator iterend = v1.begin () + v1.size() % _field._k;
-
-		uint64_t y = 0;
-
-		for (; i != iterend; ++i, ++j)
-			y += (uint64_t) *i * (uint64_t) *j;
-
-		y %= (uint64_t) _field._modulus;
-
-		for (; iterend != v1.end (); j += _field._k) {
-			typename Vector1::const_iterator iter_i = iterend;
-			typename Vector2::const_iterator iter_j;
-
-			iterend += _field._k;
-
-			for (iter_j = j; iter_i != iterend; ++iter_i, ++iter_j)
-				y += (uint64_t) *iter_i * (uint64_t) *j;
-
-			y %= (uint64_t) _field._modulus;
-		}
-
-		return res = (uint8_t) y;
-	}
-
-	template <class Vector1, class Vector2>
-	inline uint8_t &DotProductDomain<Modular<uint8_t> >::dotSpecializedDSP
-	(uint8_t &res, const Vector1 &v1, const Vector2 &v2) const
-	{
-		typename Vector1::first_type::const_iterator i_idx = v1.first.begin ();
-		typename Vector1::second_type::const_iterator i_elt = v1.second.begin ();
-
-		uint64_t y = 0;
-
-		if (v1.first.size () < _field._k) {
-			for (; i_idx != v1.first.end (); ++i_idx, ++i_elt)
-				y += (uint64_t) *i_elt * (uint64_t) v2[*i_idx];
-
-			return res = uint8_t (y % (uint64_t) _field._modulus);
-		}
-		else {
-			typename Vector1::first_type::const_iterator iterend = v1.first.begin () + v1.first.size() % _field._k;
-
-			for (; i_idx != iterend; ++i_idx, ++i_elt)
-				y += (uint64_t) *i_elt * (uint64_t) v2[*i_idx];
-
-			y %= (uint64_t) _field._modulus;
-
-			while (iterend != v1.first.end ()) {
-				typename Vector1::first_type::const_iterator iter_i_idx = iterend;
-				typename Vector1::second_type::const_iterator iter_i_elt = i_elt;
-
-				iterend += _field._k;
-				i_elt += _field._k;
-
-				for (; iter_i_idx != iterend; ++iter_i_idx, ++iter_i_elt)
-					y += (uint64_t) *iter_i_elt * (uint64_t) v2[*iter_i_idx];
-
-				y %= (uint64_t) _field._modulus;
-			}
-
-			return res = (uint8_t) y;
-		}
-	}
-
-	template <class Vector1, class Vector2>
-	inline uint16_t &DotProductDomain<Modular<uint16_t> >::dotSpecializedDD
-	(uint16_t &res, const Vector1 &v1, const Vector2 &v2) const
-	{
-		typename Vector1::const_iterator i = v1.begin ();
-		typename Vector2::const_iterator j = v2.begin ();
-
-		typename Vector1::const_iterator iterend = v1.begin () + v1.size() % _field._k;
-
-		uint64_t y = 0;
-
-		for (; i != iterend; ++i, ++j)
-			y += (uint64_t) *i * (uint64_t) *j;
-
-		y %= (uint64_t) _field._modulus;
-
-		for (; iterend != v1.end (); j += _field._k) {
-			typename Vector1::const_iterator iter_i = iterend;
-			typename Vector2::const_iterator iter_j;
-
-			iterend += _field._k;
-
-			for (iter_j = j; iter_i != iterend; ++iter_i, ++iter_j)
-				y += (uint64_t) *iter_i * (uint64_t) *j;
-
-			y %= (uint64_t) _field._modulus;
-		}
-
-		return res = (uint16_t) y;
-	}
-
-	template <class Vector1, class Vector2>
-	inline uint16_t &DotProductDomain<Modular<uint16_t> >::dotSpecializedDSP
-	(uint16_t &res, const Vector1 &v1, const Vector2 &v2) const
-	{
-		typename Vector1::first_type::const_iterator i_idx = v1.first.begin ();
-		typename Vector1::second_type::const_iterator i_elt = v1.second.begin ();
-
-		uint64_t y = 0;
-
-		if (v1.first.size () < _field._k) {
-			for (; i_idx != v1.first.end (); ++i_idx, ++i_elt)
-				y += (uint64_t) *i_elt * (uint64_t) v2[*i_idx];
-
-			return res = (uint16_t) (y % (uint64_t) _field._modulus);
-		}
-		else {
-			typename Vector1::first_type::const_iterator iterend = v1.first.begin () + v1.first.size() % _field._k;
-
-			for (; i_idx != iterend; ++i_idx, ++i_elt)
-				y += (uint64_t) *i_elt * (uint64_t) v2[*i_idx];
-
-			y %= (uint64_t) _field._modulus;
-
-			while (iterend != v1.first.end ()) {
-				typename Vector1::first_type::const_iterator iter_i_idx = iterend;
-				typename Vector1::second_type::const_iterator iter_i_elt = i_elt;
-
-				iterend += _field._k;
-				i_elt += _field._k;
-
-				for (; iter_i_idx != iterend; ++iter_i_idx, ++iter_i_elt)
-					y += (uint64_t) *iter_i_elt * (uint64_t) v2[*iter_i_idx];
-
-				y %= (uint64_t) _field._modulus;
-			}
-
-			return res = (Element) y;
-		}
-	}
-
-	template <class Vector1, class Vector2>
-	inline uint32_t &DotProductDomain<Modular<uint32_t> >::dotSpecializedDD
-	(uint32_t &res, const Vector1 &v1, const Vector2 &v2) const
-	{
-		typename Vector1::const_iterator i;
-		typename Vector2::const_iterator j;
-
-		uint64_t y = 0;
-		uint64_t t;
-
-		for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j) {
-			t = (uint64_t) *i * (uint64_t) *j;
-			y += t;
-
-			if (y < t)
-				y += _field._two_64;
-		}
-
-		y %= (uint64_t) _field._modulus;
-
-		return res = (uint32_t) y;
-	}
-
-	template <class Vector1, class Vector2>
-	inline uint32_t &DotProductDomain<Modular<uint32_t> >::dotSpecializedDSP
-	(uint32_t &res, const Vector1 &v1, const Vector2 &v2) const
-	{
-		typename Vector1::first_type::const_iterator i_idx;
-		typename Vector1::second_type::const_iterator i_elt;
-
-		uint64_t y = 0;
-		uint64_t t;
-
-		for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt) {
-			t = (uint64_t) *i_elt * (uint64_t) v2[*i_idx];
-			y += t;
-
-			if (y < t)
-				y += _field._two_64;
-		}
-
-		y %= (uint64_t) _field._modulus;
-
-		return res = (uint32_t)y;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<uint8_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<uint8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::DenseVectorTag) const
-	{
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j, j_end;
-		typename Matrix::Column::const_iterator k;
-		std::vector<uint32_t>::iterator l, l_end;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		l_end = _tmp.begin () + w.size ();
-
-		do {
-			j = v.begin ();
-			j_end = j + __LINBOX_MIN (A->coldim (), VD.field ()._k);
-
-			for (; j != j_end; ++j, ++i)
-				for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
-					*l += *k * *j;
-
-			j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.field ()._k);
-
-			for (l =_tmp.begin (); l != l_end; ++l)
-				*l %= VD.field ()._modulus;
-
-		} while (j_end != v.end ());
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l;
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<uint8_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<uint8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseSequenceVectorTag) const
-	{
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j, j_end;
-		typename Matrix::Column::const_iterator k;
-		std::vector<uint32_t>::iterator l, l_end;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		l_end = _tmp.begin () + w.size ();
-
-
-		do {
-			j = v.begin ();
-			j_end = j + __LINBOX_MIN (A->coldim (), VD.field ()._k);
-
-			for (; j != j_end; ++j, ++i)
-				for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
-					_tmp[k->first] += k->second * *j;
-
-			j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.field ()._k);
-
-			for (l =_tmp.begin (); l != l_end; ++l)
-				*l %= VD.field ()._modulus;
-
-		} while (j_end != v.end ());
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l;
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<uint8_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<uint8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseAssociativeVectorTag) const
-	{
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j, j_end;
-		typename Matrix::Column::const_iterator k;
-		std::vector<uint32_t>::iterator l, l_end;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		l_end = _tmp.begin () + w.size ();
-
-		do {
-			j = v.begin ();
-			j_end = j + __LINBOX_MIN (A->coldim (), VD.field ()._k);
-
-			for (; j != j_end; ++j, ++i)
-				for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
-					_tmp[k->first] += k->second * *j;
-
-			j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.field ()._k);
-
-			for (l =_tmp.begin (); l != l_end; ++l)
-				*l %= VD.field ()._modulus;
-
-		} while (j_end != v.end ());
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l;
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<uint8_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<uint8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseParallelVectorTag) const
-	{
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j, j_end;
-		typename Matrix::Column::first_type::const_iterator k_idx;
-		typename Matrix::Column::second_type::const_iterator k_elt;
-		std::vector<uint32_t>::iterator l, l_end;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		l_end = _tmp.begin () + w.size ();
-
-		do {
-			j = v.begin ();
-			j_end = j + __LINBOX_MIN (uint64_t (A.coldim ()), VD.field ()._k);
-
-			for (; j != j_end; ++j, ++i)
-				for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
-				     k_idx != i->first.end ();
-				     ++k_idx, ++k_elt, ++l)
-					_tmp[*k_idx] += *k_elt * *j;
-
-			j_end += __LINBOX_MIN (uint64_t (A.coldim () - (j_end - v.begin ())), VD.field ()._k);
-
-			for (l =_tmp.begin (); l != l_end; ++l)
-				*l %= VD.field ()._modulus;
-
-		} while (j_end != v.end ());
-
-		typename Vector1::iterator w_j;
-		typedef typename Vector1::value_type val_t ;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = (val_t) *l;
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<uint16_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<uint16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::DenseVectorTag) const
-	{
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j = v.begin (), j_end;
-		typename Matrix::Column::const_iterator k;
-		// Dan Roche, 7-1-04
-		// std::vector<uint32_t>::iterator l, l_end;
-		std::vector<uint64_t>::iterator l, l_end;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		l_end = _tmp.begin () + w.size ();
-
-		do {
-			j = v.begin ();
-			j_end = j + __LINBOX_MIN (A->coldim (), VD.field ()._k);
-
-			for (; j != j_end; ++j, ++i)
-				for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
-					*l += *k * *j;
-
-			j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.field ()._k);
-
-			for (l =_tmp.begin (); l != l_end; ++l)
-				*l %= VD.field ()._modulus;
-
-		} while (j_end != v.end ());
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l;
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<uint16_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<uint16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseSequenceVectorTag) const
-	{
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j, j_end;
-		typename Matrix::Column::const_iterator k;
-		// Dan Roche, 7-1-04
-		// std::vector<uint32_t>::iterator l, l_end;
-		std::vector<uint64_t>::iterator l, l_end;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		l_end = _tmp.begin () + w.size ();
-
-		do {
-			j = v.begin ();
-			j_end = j + __LINBOX_MIN (A->coldim (), VD.field ()._k);
-
-			for (; j != j_end; ++j, ++i)
-				for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
-					_tmp[k->first] += k->second * *j;
-
-			j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.field ()._k);
-
-			for (l =_tmp.begin (); l != l_end; ++l)
-				*l %= VD.field ()._modulus;
-
-		} while (j_end != v.end ());
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l;
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<uint16_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<uint16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseAssociativeVectorTag) const
-	{
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j, j_end;
-		typename Matrix::Column::const_iterator k;
-		// Dan Roche, 7-1-04
-		// std::vector<uint32_t>::iterator l, l_end;
-		std::vector<uint64_t>::iterator l, l_end;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		l_end = _tmp.begin () + w.size ();
-
-		do {
-			j = v.begin ();
-			j_end = j + __LINBOX_MIN (A->coldim (), VD.field ()._k);
-
-			for (; j != j_end; ++j, ++i)
-				for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
-					_tmp[k->first] += k->second * *j;
-
-			j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.field ()._k);
-
-			for (l =_tmp.begin (); l != l_end; ++l)
-				*l %= VD.field ()._modulus;
-
-		} while (j_end != v.end ());
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l;
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<uint16_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<uint16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseParallelVectorTag) const
-	{
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j, j_end;
-		typename Matrix::Column::first_type::const_iterator k_idx;
-		typename Matrix::Column::second_type::const_iterator k_elt;
-		// Dan Roche, 7-1-04
-		// std::vector<uint32_t>::iterator l, l_end;
-		std::vector<uint64_t>::iterator l, l_end;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		l_end = _tmp.begin () + w.size ();
-
-		do {
-			j = v.begin ();
-			//Dan Roche, 7-2-04
-			//j_end = j + __LINBOX_MIN (A->coldim (), VD.field ()._k);
-			j_end = j + __LINBOX_MIN (A.coldim (), VD.field ()._k);
-
-			for (; j != j_end; ++j, ++i)
-				for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
-				     k_idx != i->first.end ();
-				     ++k_idx, ++k_elt, ++l)
-					_tmp[*k_idx] += *k_elt * *j;
-
-			//j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.field ()._k);
-			j_end += __LINBOX_MIN (A.coldim () - (j_end - v.begin ()), VD.field ()._k);
-
-			for (l =_tmp.begin (); l != l_end; ++l)
-				*l %= VD.field ()._modulus;
-
-		} while (j_end != v.end ());
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l;
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<uint32_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<uint32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::DenseVectorTag) const
-	{
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::const_iterator k;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i) {
-			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
-				t = ((uint64_t) *k) * ((uint64_t) *j);
-
-				*l += t;
-
-				if (*l < t)
-					*l += VD.field ()._two_64;
-			}
-		}
-
-		typename Vector1::iterator w_j;
-		typedef typename Vector1::value_type element;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = (element)(*l % VD.field ()._modulus);
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<uint32_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<uint32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseSequenceVectorTag) const
-	{
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::const_iterator k;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i) {
-			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
-				t = ((uint64_t) k->second) * ((uint64_t) *j);
-
-				_tmp[k->first] += t;
-
-				if (_tmp[k->first] < t)
-					_tmp[k->first] += VD.field ()._two_64;
-			}
-		}
-
-		typename Vector1::iterator             w_j;
-		typedef typename Vector1::value_type val_t;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = val_t(*l % VD.field ()._modulus);
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<uint32_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<uint32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseAssociativeVectorTag) const
-	{
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::const_iterator k;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i) {
-			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
-				t = ((uint64_t) k->second) * ((uint64_t) *j);
-
-				_tmp[k->first] += t;
-
-				if (_tmp[k->first] < t)
-					_tmp[k->first] += VD.field ()._two_64;
-			}
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l % VD.field ()._modulus;
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Modular<uint32_t> >::mulColDenseSpecialized
-	(const VectorDomain<Modular<uint32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseParallelVectorTag) const
-	{
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::first_type::const_iterator k_idx;
-		typename Matrix::Column::second_type::const_iterator k_elt;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i) {
-			for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
-			     k_idx != i->first.end ();
-			     ++k_idx, ++k_elt, ++l)
-			{
-				t = ((uint64_t) *k_elt) * ((uint64_t) *j);
-
-				_tmp[*k_idx] += t;
-
-				if (_tmp[*k_idx] < t)
-					_tmp[*k_idx] += VD.field ()._two_64;
-			}
-		}
-
-		typename Vector1::iterator     w_j;
-		typedef typename Vector1::value_type val_t;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = val_t(*l % VD.field ()._modulus);
-
-		return w;
-	}
-
-}
-
-#endif // __LINBOX_field_modular_INL
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/NTL/Makefile.am b/linbox/field/NTL/Makefile.am
deleted file mode 100644
index f42b93d..0000000
--- a/linbox/field/NTL/Makefile.am
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-
-
-pkgincludesubdir=$(pkgincludedir)/field/NTL
-
-
-NTL_HDRS =              \
-    ntl-RR.h            \
-    ntl-ZZ_p.h          \
-    ntl-ZZ_pE.h         \
-    ntl-ZZ_pX.h         \
-    ntl-lzz_p.h         \
-    ntl-ZZ.h            \
-    ntl-lzz_pE.h        \
-    ntl-lzz_pX.h        \
-    ntl-GF2E.h
-
-
-if LINBOX_HAVE_NTL
-USE_NTL_HDRS = $(NTL_HDRS)
-endif
-
-
-pkgincludesub_HEADERS =     \
-    $(USE_NTL_HDRS)
-
-#  EXTRA_DIST =            \
-    #  ntl.doxy
diff --git a/linbox/field/NTL/Makefile.in b/linbox/field/NTL/Makefile.in
deleted file mode 100644
index 520e9ee..0000000
--- a/linbox/field/NTL/Makefile.in
+++ /dev/null
@@ -1,592 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/field/NTL
-DIST_COMMON = $(am__pkgincludesub_HEADERS_DIST) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__pkgincludesub_HEADERS_DIST = ntl-RR.h ntl-ZZ_p.h ntl-ZZ_pE.h \
-	ntl-ZZ_pX.h ntl-lzz_p.h ntl-ZZ.h ntl-lzz_pE.h ntl-lzz_pX.h \
-	ntl-GF2E.h
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/field/NTL
-NTL_HDRS = \
-    ntl-RR.h            \
-    ntl-ZZ_p.h          \
-    ntl-ZZ_pE.h         \
-    ntl-ZZ_pX.h         \
-    ntl-lzz_p.h         \
-    ntl-ZZ.h            \
-    ntl-lzz_pE.h        \
-    ntl-lzz_pX.h        \
-    ntl-GF2E.h
-
- at LINBOX_HAVE_NTL_TRUE@USE_NTL_HDRS = $(NTL_HDRS)
-pkgincludesub_HEADERS = \
-    $(USE_NTL_HDRS)
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/field/NTL/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps linbox/field/NTL/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
-	done
-
-uninstall-pkgincludesubHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
-	for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool ctags distclean distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-pkgincludesubHEADERS install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-#  EXTRA_DIST =            \
-#    #  ntl.doxy
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/field/NTL/ntl-GF2E.h b/linbox/field/NTL/ntl-GF2E.h
deleted file mode 100644
index 6b3add3..0000000
--- a/linbox/field/NTL/ntl-GF2E.h
+++ /dev/null
@@ -1,242 +0,0 @@
-/* linbox/field/ntl-z_pE.h
- * Copyright (C) 2004  Pascal Giorgi
- * Copyright (C) 2011 LinBox
- *
- * Written by  Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- *
- * Modified by W. J. Turner <wjturner at acm.org>
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*! @file field/NTL/ntl-GF2E.h
- * @ingroup field
- * @ingroup NTL
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_field_ntl_gf2e_H
-#define __LINBOX_field_ntl_gf2e_H
-
-#ifndef __LINBOX_HAVE_NTL
-#error "you need NTL here"
-#endif
-
-#include <NTL/GF2XFactoring.h>
-#include <NTL/GF2E.h>
-#include <time.h>
-
-#include "linbox/linbox-config.h"
-#include "linbox/util/debug.h"
-
-#include "linbox/field/unparametric.h"
-#include "linbox/randiter/unparametric.h"
-#include "linbox/field/field-traits.h"
-
-
-#include "linbox/integer.h"
-
-namespace Givaro
-{
-	template<>
-	//	NTL::GF2E& UnparametricField<NTL::GF2E>::init (NTL::GF2E &x, const Integer &y) const
-	NTL::GF2E& Caster(NTL::GF2E &x, const Integer &y)
-	{
-		x=NTL::to_GF2E(static_cast<long>(y));
-		return x;
-	}
-	template<>
-	//	NTL::GF2E& UnparametricField<NTL::GF2E>::init (NTL::GF2E &x, const double &y) const
-	NTL::GF2E& Caster(NTL::GF2E &x, const double &y)
-	{
-		x=NTL::to_GF2E(static_cast<long>(y));
-		return x;
-	}
-
-
-	template<>
-	//	Integer& UnparametricField<NTL::GF2E>::convert (Integer& x, const NTL::GF2E &y) const	{
-	Integer& Caster(Integer& x, const NTL::GF2E &y)
-	{
-		NTL::GF2X poly = rep(y);
-
-		long i;
-		x = 0;
-		for(i = deg(poly); i >= 0; --i) {
-			x <<= 1;
-			x += rep(coeff(poly, i));
-		}
-		return x;
-	}
-
-} // namespace Givaro
-
-
-
-
-// Namespace in which all LinBox library code resides
-namespace LinBox
-{
-	/// \ingroup field
-
-	class NTL_GF2E_Initialiser {
-	public :
-		NTL_GF2E_Initialiser( const Integer & p, size_t k = 1) {
-			linbox_check(p == 2);
-			// if(p != 2) throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be 2");
-			NTL::GF2X irredPoly = NTL::BuildSparseIrred_GF2X((long) k);
-			NTL::GF2E::init(irredPoly);
-
-		}
-
-		// template <class ElementInt>
-		// NTL_GF2E_Initialiser(const ElementInt& d) {
-			// NTL::ZZ_p::init (NTL::to_ZZ(d));
-		// }
-
-		// NTL_GF2E_Initialiser (const NTL::ZZ& d) {
-			// NTL::ZZ_p::init(d);
-		// }
-
-	};
-
-
-	/*
-	 * Define a parameterized class to easily handle UnparametricField<NTL::GF2E> field
-	 */
-
-	class NTL_GF2E :  public NTL_GF2E_Initialiser, public FFPACK::UnparametricOperations<NTL::GF2E> {
-	public:
-		typedef NTL::GF2E Element ;
-		typedef FFPACK::UnparametricOperations<Element> Father_t ;
-		typedef UnparametricRandIter<Element> RandIter;
-
-		const Element zero,one,mOne ;
-
-		NTL_GF2E (const integer &p, const integer &k) :
-			NTL_GF2E_Initialiser(p,k),Father_t ()
-			,zero( NTL::to_GF2E(0)),one( NTL::to_GF2E(1)),mOne(-one)
-		{ }
-
-		bool isZero (const Element& a) const
-		{
-			return NTL::IsZero(a);
-		}
-
-
-		bool isOne (const Element& a) const
-		{
-			return NTL::IsOne(a);
-		}
-
-		integer& characteristic (integer &c) const
-		{
-			return c = 2;
-		}
-
-		integer& cardinality(integer& c) const
-		{
-			c=1;
-			c<<= Element::degree();
-			return c;
-		}
-
-		Element& inv(Element& x, const Element& y) const
-		{
-			x=NTL::to_GF2E(1)/y;
-			return x;
-		}
-
-		Element& invin(Element& x) const
-		{
-			x=NTL::to_GF2E(1)/x;
-			return x;
-		}
-
-		std::istream& read(std::istream& is, Element& x) const
-		{
-			long tmp;
-			is>>tmp;
-			x=NTL::to_GF2E(tmp);
-			return is;
-		}
-	}; // end o class NTL_GF2E
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	template <class Element>
-	struct ClassifyRing<UnparametricRandIter<Element> >;
-
-	template <>
-	struct ClassifyRing<UnparametricRandIter<NTL::GF2E> > {
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-	template<>
-	class UnparametricRandIter<NTL::GF2E> {
-	public:
-		typedef NTL::GF2E Element;
-		UnparametricRandIter<NTL::GF2E>(const NTL_GF2E & F,
-						const size_t& size = 0,
-						const size_t& seed = 0
-					       ) :
-			_size(size), _seed(seed)
-		{
-			if(_seed == 0)
-				NTL::SetSeed(NTL::to_ZZ(time(0)));
-			else
-				NTL::SetSeed(NTL::to_ZZ(_seed));
-		}
-
-		UnparametricRandIter<NTL::GF2E>(const UnparametricRandIter<NTL::GF2E>& R) :
-			_size(R._size), _seed(R._seed)
-
-		{
-			if(_seed == 0)
-				NTL::SetSeed(NTL::to_ZZ(time(0)));
-			else
-				NTL::SetSeed(NTL::to_ZZ(_seed));
-		}
-
-		Element& random (Element& x) const
-		{
-			NTL::random(x);
-			return x;
-		}
-
-	protected:
-		size_t _size;
-		size_t _seed;
-	};
-
-
-}
-
-#endif //__LINBOX_ntl_gf2e_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/NTL/ntl-RR.h b/linbox/field/NTL/ntl-RR.h
deleted file mode 100644
index d15ce01..0000000
--- a/linbox/field/NTL/ntl-RR.h
+++ /dev/null
@@ -1,334 +0,0 @@
-/* linbox/field/ntl-RR.h
- * Copyright (C) 1999-2005 William J Turner,
- *               2001 Bradford Hovinen
- * Copyright (C) 2011 LinBox
- *
- * Written by W. J. Turner <wjturner at acm.org>,
- *            Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-/*! @file field/NTL/ntl-RR.h
- * @ingroup field
- * @ingroup NTL
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_field_ntl_rr_H
-#define __LINBOX_field_ntl_rr_H
-
-#include "linbox/linbox-config.h"
-
-#ifndef __LINBOX_HAVE_NTL
-#error "you need NTL here"
-#endif
-
-
-#include <NTL/tools.h>
-#include <NTL/RR.h>
-
-#include "linbox/util/debug.h"
-
-#include "linbox/field/unparametric.h"
-#include "linbox/randiter/unparametric.h"
-#include "linbox/field/field-traits.h"
-
-#include "linbox/integer.h"
-
-namespace Givaro
-{
-	/** Initialization of field element from an integer.
-	 * Behaves like C++ allocator construct.
-	 * This function assumes the output field element x has already been
-	 * constructed, but that it is not already initialized.
-	 * For now, this is done by converting the integer type to a C++
-	 * long and then to the element type through the use of static cast and
-	 * NTL's to_RR function.
-	 * This, of course, assumes such static casts are possible.
-	 * This function should be changed in the future to avoid using long.
-	 * @return reference to field element.
-	 * @param x field element to contain output (reference returned).
-	 * @param y integer.
-	 */
-	template <>
-	NTL::RR& Caster(NTL::RR& x, const Integer& y)
-	{
-		return x = NTL::to_RR(static_cast<const long&>(y));
-	}
-	template <>
-	NTL::RR& Caster(NTL::RR& x, const double& y)
-	{
-		return x = NTL::to_RR((long)(y));
-	}
-	template <>
-	NTL::RR& Caster(NTL::RR& x, const int& y)
-	{
-		return x = NTL::to_RR((long)(y));
-	}
-
-	template <>
-	NTL::RR& Caster(NTL::RR& x, const long int& y)
-	{
-		return x = NTL::to_RR((long)(y));
-	}
-
-	/** Conversion of field element to an integer.
-	 * This function assumes the output field element x has already been
-	 * constructed, but that it is not already initialized.
-	 * For now, this is done by converting the element type to a C++
-	 * long and then to the integer type through the use of static cast and
-	 * NTL's to_long function.
-	 * This, of course, assumes such static casts are possible.
-	 * This function should be changed in the future to avoid using long.
-	 * @return reference to integer.
-	 * @param x reference to integer to contain output (reference returned).
-	 * @param y constant reference to field element.
-	 */
-	template <>
-	Integer& Caster(Integer& x, const NTL::RR& y)
-	{
-		return x = static_cast<Integer>(to_long(y));
-	}
-} // namespace Givaro
-
-
-
-
-// Namespace in which all LinBox library code resides
-namespace LinBox
-{
-
-	class NTL_RR_Initialiser {
-	public :
-		NTL_RR_Initialiser () { }
-	};
-
-
-
-	/** @name class RR.
-	  \brief
-	 * Rational number field.
-	 * This field is provided as a convenience in a few places.
-	 * Use with caution because expression swell.
-	 *
-	 * This specialization allows the \ref UnparametricField template class to be
-	 * used to wrap NTL's RR class as a LinBox field.
-	 \ingroup field
-	 */
-	//@{
-
-
-	struct NTL_RR: public NTL_RR_Initialiser, public FFPACK::UnparametricOperations<NTL::RR> {
-		typedef NTL::RR Element ;
-		typedef FFPACK::UnparametricOperations<Element> Father_t ;
-		typedef UnparametricRandIter<Element> RandIter;
-
-		const Element zero,one,mOne ;
-
-		NTL_RR() :
-			NTL_RR_Initialiser(),Father_t ()
-			,zero( NTL::to_RR(0)),one( NTL::to_RR(1)),mOne(-one)
-		{
-			// no default - allow initialization of ZZ_p directly by user.
-		}
-
-
-		/** Multiplicative Inverse.
-		 * x = 1 / y
-		 * This function assumes both field elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field element (reference returned).
-		 * @param  y field element.
-		 */
-		Element& inv(Element& x, const Element& y) const
-		{
-			return x = NTL::inv(y);
-		}
-
-		/** Zero equality.
-		 * Test if field element is equal to zero.
-		 * This function assumes the field element has already been
-		 * constructed and initialized.
-		 * In this specialization, NTL's IsZero function is called.
-		 * @return boolean true if equals zero, false if not.
-		 * @param  x field element.
-		 */
-		bool isZero(const Element& x) const
-		{
-			return static_cast<bool>(IsZero(x));
-		}
-
-		/** One equality.
-		 * Test if field element is equal to one.
-		 * This function assumes the field element has already been
-		 * constructed and initialized.
-		 * In this specialization, NTL's IsOne function is called.
-		 * @return boolean true if equals one, false if not.
-		 * @param  x field element.
-		 */
-		bool isOne(const Element& x) const
-		{
-			return static_cast<bool>(IsOne(x));
-		}
-
-		/** Inplace Multiplicative Inverse.
-		 * x = 1 / x
-		 * This function assumes both field elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field element (reference returned).
-		 */
-		Element& invin(Element& x) const
-		{
-			return x = NTL::inv(x);
-		}
-
-		/** Print field.
-		 * @return output stream to which field is written.
-		 * @param  os  output stream to which field is written.
-		 */
-		std::ostream& write(std::ostream& os) const
-		{
-			return os << "unparameterized field Element";
-		}
-
-		integer & cardinality(integer &c) const
-		{
-			return c = -1L;
-		}
-
-		integer & characteristic(integer &c) const
-		{
-			return c = 0UL;
-		}
-
-		std::ostream &write (std::ostream &os, const Element &x) const {
-			return FFPACK::UnparametricOperations<Element>::write(os,x);
-		}
-
-		Element& init (Element& x) const
-		{
-			return x;
-		}
-
-		template <typename Src>
-		Element& init (Element& x, const Src& s) const
-		{
-			return Caster (x, s);
-		}
-
-		template <typename T>
-		T& convert (T &x, const Element &y) const
-		{
-			return Caster (x,y);
-		}
-
-
-	};
-
-	template <>
-	class UnparametricRandIter<NTL::RR> {
-		typedef NTL::RR Element ;
-	protected:
-		integer _size,_seed;
-	public:
-
-		UnparametricRandIter<NTL::RR> (const NTL_RR & F,
-					       const integer& size = 0,
-					       const integer& seed = 0) :
-			_size(size), _seed(seed)
-		{
-			if (_seed == integer(0)) _seed = integer(time(NULL));
-
-			// integer cardinality;
-			// F.cardinality(cardinality);
-			// if (_size > cardinality)
-				// _size = 0;
-
-#ifdef TRACE
-			std::cout << "created random generator with size " << _size
-			<< " and seed " << _seed << std::endl;
-#endif // TRACE
-
-			// Seed random number generator
-			NTL::SetSeed(NTL::to_ZZ(static_cast<long>(_seed)));
-		}
-
-
-		/** Random field element creator.
-		 * This returns a random field element from the information supplied
-		 * at the creation of the generator.
-		 * This generator uses the built-in C++ random number generator instead of
-		 * NTL's random function because the NTL function does not allow as much
-		 * control over the sampling size as the generic LinBox template.  This
-		 * specialization is included only to allow conversion to an NTL
-		 * object.
-		 * @return random field element
-		 */
-		Element& random(Element &elt) const
-		{
-			// NTL::random(elt);
-			// Create new random elements
-			if (_size == 0)
-				elt = rand();
-			else
-				elt = static_cast<double>((double(rand())/RAND_MAX)*double(_size));
-
-#ifdef TRACE
-			double temp ;
-			NTL::conv(temp, elt);
-			std::cout << "random double = " << temp << "    random Element = " << elt << std::endl;
-#endif // TRACE
-
-			return elt;
-
-		} // element& operator() (void)
-
-	};
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	template<class Element>
-	struct ClassifyRing<UnparametricField<Element> >;
-
-	template<>
-	struct ClassifyRing<NTL_RR >{
-		typedef RingCategories::ModularTag categoryTag;
-	};
-	//@}
-} // namespace LinBox
-
-#endif // __LINBOX_field_ntl_rr_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/NTL/ntl-ZZ.h b/linbox/field/NTL/ntl-ZZ.h
deleted file mode 100644
index ab6053f..0000000
--- a/linbox/field/NTL/ntl-ZZ.h
+++ /dev/null
@@ -1,771 +0,0 @@
-/* Copyright (C) LinBox
- *  Author: Zhendong Wan
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/** @file field/NTL/ntl-ZZ.h
- * @ingroup field
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_ntl_zz_H
-#define __LINBOX_ntl_zz_H
-
-#include <NTL/ZZ.h>
-#include "linbox/integer.h"
-#include <iostream>
-#include "linbox/util/debug.h"
-#include "linbox/randiter/ntl-ZZ.h"
-#include "linbox/field/field-traits.h"
-
-namespace LinBox
-{
-
-	template <class Ring>
-	struct ClassifyRing ;
-
-	class NTL_ZZ;
-
-	template <>
-	struct ClassifyRing<NTL_ZZ>
-	{
-		typedef RingCategories::IntegerTag categoryTag;
-	};
-
-	template<class Field>
-	class FieldAXPY;
-
-	/// \brief the integer ring. \ingroup ring
-	class NTL_ZZ {
-
-	public:
-		typedef NTL_ZZRandIter RandIter;
-		typedef NTL_ZZ Father_t ;
-
-		typedef NTL::ZZ Element;
-		Element zero,one,mOne;
-
-		NTL_ZZ(int p = 0, int exp = 1)
-		{
-			if( p != 0 ) throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be 0 (no modulus)");
-			if( exp != 1 ) throw PreconditionFailed(__func__,__FILE__,__LINE__,"exponent must be 1");
-		}
-
-		inline integer& cardinality (integer& c) const
-		{
-			return c = -1;
-		}
-
-		inline integer& characteristic (integer& c)const
-		{
-			return c = 0;
-		}
-
-		template<class IntType>
-		inline IntType & characteristic (IntType& c)const
-		{
-			return c = 0;
-		}
-
-		std::ostream& write (std::ostream& out) const
-		{
-			return out << "NTL ZZ Ring";
-		}
-
-		std::istream& read (std::istream& in) const
-		{
-			return in;
-		}
-
-		/** @brief
-		 *  Init x from y.
-		 */
-		template<class Element2>
-		inline Element& init (Element& x,  const Element2& y) const
-		{
-
-			NTL::conv (x, y);
-
-			return x;
-		}
-
-		/** @brief
-		 *   Init from a NTL::ZZ
-		 */
-		inline Element& init (Element& x, const Element& y) const
-		{
-
-			x = y;
-
-			return x;
-		}
-
-		/** @brief
-		 *   Init from an int64_t
-		 */
-		inline Element& init (Element& x, const int64_t& y) const
-		{
-			bool isNeg = false;
-			uint64_t t;
-			if( y < 0 ) {
-				isNeg = true;
-				t = uint64_t(y * -1);
-			}
-			else t = (uint64_t) y;
-			init(x,t);
-			if( isNeg ) x *= -1;
-			return x;
-		}
-
-		/** @brief
-		 *   Init from a uint64_t
-		 */
-		inline Element& init (Element& x, const uint64_t& y) const
-		{
-			uint64_t shift = (uint64_t)1 << 32;
-			uint32_t temp = uint32_t(y % shift);
-			NTL::conv (x,temp);
-			x <<= 32;
-			temp = (uint32_t)(y / shift);
-			x += temp;
-			return x;
-		}
-
-		/** @brief
-		 *  I don't  know how to init from integer efficiently.
-		 */
-		// c_str is safer than data, Z. W and BDS
-		inline Element& init (Element& x, const integer& y) const
-		{
-
-			return x=NTL::to_ZZ((std::string(y)).c_str());
-		}
-
-		/** @brief
-		 *  Convert y to an Element.
-		 */
-		inline integer& convert (integer& x, const Element& y) const
-		{
-			bool Neg=false;
-			if (sign(y) <0)
-				Neg=true;
-			long b = NumBytes(y);
-			unsigned char* byteArray;
-			byteArray = new unsigned char[(size_t)b ];
-			BytesFromZZ(byteArray, y, b);
-
-			integer base(256);
-			x= integer(0);
-
-			for(long i = b - 1; i >= 0; --i) {
-				x *= base;
-				x += integer(byteArray[i]);
-			}
-			delete [] byteArray;
-			if (Neg)
-				x=-x;
-			return x;
-		}
-
-		inline double& convert (double& x, const Element& y) const
-		{
-			return x=NTL::to_double(y);
-		}
-
-
-
-		/** @brief
-		 *  x = y.
-		 */
-		inline Element&  assign (Element& x, const Element& y)  const
-		{
-			return x = y;
-		}
-
-		/** @brief
-		 *  Test if x == y
-		 */
-		inline bool areEqual (const Element& x ,const Element& y) const
-		{
-			return x == y;
-		}
-
-		/** @brief
-		 *  Test if x == 0
-		 */
-		inline bool isZero (const Element& x) const
-		{
-			return NTL::IsZero (x);
-		}
-
-		/** @brief
-		 *  Test if x == 1
-		 */
-		inline bool isOne (const Element& x) const
-		{
-			return NTL::IsOne (x);
-		}
-
-		// arithmetic
-
-		/** @brief
-		 *  return x = y + z
-		 */
-		inline Element& add (Element& x, const Element& y, const Element& z) const
-		{
-
-			NTL::add (x, y, z);
-
-			return x;
-		}
-
-		/** @brief
-		 *  return x = y - z
-		 */
-		inline Element& sub (Element& x, const Element& y, const Element& z) const
-		{
-
-			NTL::sub (x, y, z);
-
-			return x;
-		}
-
-		/** @brief
-		 *  return x = y * z
-		 */
-		template <class Int>
-		inline Element& mul (Element& x, const Element& y, const Int& z) const
-		{
-
-			NTL::mul (x, y, z);
-
-			return x;
-		}
-
-		/** @brief
-		 *  If z divides y, return x = y / z,
-		 *  otherwise, throw an exception
-		 */
-		inline Element& div (Element& x, const Element& y, const Element& z) const
-		{
-
-			Element q, r;
-
-			NTL::DivRem (q, r, y, z);
-
-			if (NTL::IsZero (r))
-				return x = q;
-
-			else
-				throw PreconditionFailed(__func__,__FILE__,__LINE__,"Div: not dividable");
-		}
-
-		/** @brief
-		 *  If y is a unit, return x = 1 / y,
-		 *  otherwsie, throw an exception
-		 */
-		inline Element& inv (Element& x, const Element& y) const
-		{
-
-			if ( NTL::IsOne (y)) return x = y;
-
-			else if ( NTL::IsOne (-y)) return x = y;
-
-			else
-				throw PreconditionFailed(__func__,__FILE__,__LINE__,"Inv: Not invertible");
-		}
-
-		/** @brief
-		 *  return x = -y;
-		 */
-		inline Element& neg (Element& x, const Element& y) const
-		{
-
-			NTL::negate (x, y);
-
-			return x;
-		}
-
-
-		/** @brief
-		 *  return r = a x + y
-		 */
-		template <class Int>
-		inline Element& axpy (Element& r, const Element& a, const Int& x, const Element& y) const
-		{
-
-			NTL::mul (r, a, x);
-
-			return r += y;
-		}
-
-
-		// inplace operator
-
-		/** @brief
-		 *  return x += y;
-		 */
-		inline Element& addin (Element& x, const Element& y) const
-		{
-
-			return x += y;
-		}
-
-		/** @brief
-		 *  return x -= y;
-		 */
-		inline Element& subin (Element& x, const Element& y)  const
-		{
-
-			return x -= y;
-		}
-
-		/** @brief
-		 *  return x *= y;
-		 */
-		template<class Int>
-		inline Element& mulin (Element& x, const Int& y)  const
-		{
-
-			return x *= y;
-		}
-
-		/** @brief
-		 *  If y divides x, return x /= y,
-		 *  otherwise throw an exception
-		 */
-		inline Element& divin (Element& x, const Element& y) const
-		{
-
-			div (x, x, y);
-
-			return x;
-		}
-
-		/** @brief
-		 *  If x is a unit, x = 1 / x,
-		 *  otherwise, throw an exception.
-		 */
-		inline Element& invin (Element& x) {
-
-			if (NTL::IsOne (x)) return x;
-
-			else if (NTL::IsOne (-x)) return x;
-
-			else throw PreconditionFailed(__func__,__FILE__,__LINE__,"Div: not dividable");
-		}
-
-		/** @brief
-		 *  return x = -x;
-		 */
-		inline Element& negin (Element& x) const
-		{
-
-			NTL::negate (x, x);
-
-			return x;
-		}
-
-		/** @brief
-		 *  return r += a x
-		 */
-		template <class Int>
-		inline Element& axpyin (Element& r, const Element& a, const Int& x) const
-		{
-
-			return r += a * x;
-		}
-
-
-		// IO
-
-		/** @brief
-		 *  out << y;
-		 */
-		std::ostream& write(std::ostream& out,const Element& y) const
-		{
-
-			out << y;
-
-			return out;
-		}
-
-
-		/** @brief
-		 *  read x from istream in
-		 */
-		std::istream& read(std::istream& in, Element& x) const
-		{
-
-			return in >> x;
-		}
-
-
-		/** some PIR function
-		*/
-
-		/** @brief
-		 *  Test if x is a unit.
-		 */
-		inline bool isUnit (const Element& x) const
-		{
-
-			return (NTL::IsOne (x) || NTL::IsOne (-x));
-		}
-
-		/** @brief
-		 *  return g = gcd (a, b)
-		 */
-		inline Element& gcd (Element& g, const Element& a, const Element& b) const
-		{
-
-			NTL::GCD (g, a, b);
-
-			return g;
-		}
-
-		/** @brief
-		 *  return g = gcd (g, b)
-		 */
-		inline Element& gcdin (Element& g, const Element& b) const
-		{
-
-			NTL::GCD (g, g, b);
-
-			return g;
-		}
-
-		/** @brief
-		 *  g = gcd(a, b) = a*s + b*t.
-		 *  The coefficients s and t are defined according to the standard
-		 *  Euclidean algorithm applied to |a| and |b|, with the signs then
-		 *  adjusted according to the signs of a and b.
-		 */
-		inline Element& xgcd (Element& g, Element& s, Element& t, const Element& a, const Element& b)const
-		{
-
-			NTL::XGCD (g,s,t,a,b);
-
-			return g;
-		}
-
-		/** @brief
-		 *  c = lcm (a, b)
-		 */
-		inline Element& lcm (Element& c, const Element& a, const Element& b) const
-		{
-
-
-			if (NTL::IsZero (a) || NTL::IsZero (b)) return c = NTL::ZZ::zero();
-
-			else {
-				Element g;
-
-				NTL::GCD (g, a, b);
-
-				NTL::mul (c, a, b);
-
-				c /= g;
-
-				NTL::abs (c, c);
-
-				return c;
-			}
-		}
-
-		/** @brief
-		 *  l = lcm (l, b)
-		 */
-		inline Element& lcmin (Element& l, const Element& b) const
-		{
-
-			if (NTL::IsZero (l) || NTL::IsZero (b))
-
-				return l = NTL::ZZ::zero();
-
-			else {
-
-				Element g;
-
-				NTL::GCD (g, l, b);
-
-				l *= b;
-
-				l /= g;
-
-				NTL::abs (l, l);
-
-				return l;
-			}
-		}
-
-
-
-
-
-		// some specail function
-
-		/** @brief
-		 *  x = floor ( sqrt(y)).
-		 */
-
-		inline Element& sqrt (Element& x, const Element& y) const
-		{
-
-			NTL::SqrRoot(x,y);
-
-			return x;
-		}
-
-		/** @brief
-		 *  Requires 0 <= x < m, m > 2 * a_bound * b_bound,
-		 *  a_bound >= 0, b_bound > 0
-		 *   This routine either returns 0, leaving a and b unchanged,
-		 *   or returns 1 and sets a and b so that
-		 *  (1) a = b x (mod m),
-		 *  (2) |a| <= a_bound, 0 < b <= b_bound, and
-		 *  (3) gcd(m, b) = gcd(a, b).
-		 */
-
-		inline long reconstructRational (Element& a, Element& b, const Element& x, const Element& m,
-						 const Element& a_bound, const Element& b_bound) const
-		{
-
-			return NTL::ReconstructRational(a,b,x,m,a_bound,b_bound);
-		}
-
-
-		/** @brief
-		 *  q = floor (x/y);
-		 */
-		inline Element& quo (Element& q, const Element& a, const Element& b) const
-		{
-
-			NTL::div (q, a, b);
-
-			return q;
-		}
-
-		/** @brief
-		 *  r = remindar of  a / b
-		 */
-		inline Element& rem (Element& r, const Element& a, const Element& b) const
-		{
-
-			NTL::rem (r, a, b);
-
-			return r;
-		}
-
-		/** @brief
-		 *  a = quotient (a, b)
-		 */
-		inline Element& quoin (Element& a, const Element& b) const
-		{
-
-			return a /= b;
-
-		}
-
-		/** @brief
-		 *  a = quotient (a, b)
-		 */
-		inline Element& remin (Element& x, const Element& y)  const
-		{
-			return x %= y;
-		}
-
-
-		/** @brief
-		 * q = [a/b], r = a - b*q
-		 * |r| < |b|, and if r != 0, sign(r) = sign(b)
-		 */
-		inline void quoRem (Element& q, Element& r, const Element& a, const Element& b) const
-		{
-
-			NTL::DivRem(q,r,a,b);
-		}
-
-		/** @brief
-		 *  Test if b | a.
-		 */
-		inline bool isDivisor (const Element& a, const Element& b) const
-		{
-
-			if ( NTL::IsZero (a) ) return true;
-
-			else if (NTL::IsZero (b)) return false;
-
-			else {
-				Element r;
-
-				NTL::rem (r, a, b); //weird order changed, dpritcha 2004-07-19
-
-				return NTL::IsZero (r);
-			}
-		}
-
-		/** compare two elements, a and b
-		 * return 1, if a > b
-		 * return 0, if a = b;
-		 * return -1. if a < b
-		 */
-		inline long compare (const Element& a, const Element& b) const
-		{
-
-			return NTL::compare (a, b);
-		}
-
-		/** return the absolute value
-		 * x = abs (a);
-		 */
-		inline Element& abs (Element& x, const Element& a) const
-		{
-
-			NTL::abs (x, a);
-
-			return x;
-		}
-
-
-		static inline int getMaxModulus()
-		{
-			return 0;
-		} // no modulus
-
-	};
-
-
-	template<>
-	class FieldAXPY<NTL_ZZ> {
-	public:
-		typedef NTL_ZZ Field;
-		typedef Field::Element Element;
-
-		/** Constructor.
-		 * A faxpy object if constructed from a Field and a field element.
-		 * Copies of this objects are stored in the faxpy object.
-		 * @param F field F in which arithmetic is done
-		 */
-		FieldAXPY (const Field &F) :
-			_field (F)
-		{
-			_y = 0;
-		}
-
-		/** Copy constructor.
-		 * @param faxpy
-		 */
-		FieldAXPY (const FieldAXPY<Field> &faxpy) :
-			_field (faxpy._field), _y (faxpy._y)
-		{}
-
-		/** Assignment operator
-		 * @param faxpy
-		 */
-		FieldAXPY<Field> &operator = (const FieldAXPY &faxpy)
-		{
-			_y = faxpy._y;
-			return *this;
-		}
-
-		/** Add a*x to y
-		 * y += a*x.
-		 * @param a constant reference to element a
-		 * @param x constant reference to element x
-		 * allow optimal multiplication, such as integer * int
-		 */
-		template<class Element1>
-		inline Element& mulacc  (const Element &a, const Element1 &x)
-		{
-			return _y += a * x;
-		}
-
-		inline Element& accumulate (const Element &t)
-		{
-			return _y += t;
-		}
-
-		/** Add a*x to y
-		 * y += a*x.
-		 * @param a constant reference to element a
-		 * @param x constant reference to element x
-		 * allow optimal multiplication, such as integer * int
-		 */
-		template<class Element1>
-		inline Element& mulacc (const Element1 &a, const Element &x)
-		{
-			return _y += a * x;
-		}
-
-		inline Element& mulacc (const Element& a, const Element& b)
-		{
-
-			return _y += a * b;
-		}
-
-
-		/** Retrieve y
-		 *
-		 * Performs the delayed modding out if necessary
-		 */
-		inline Element &get (Element &y) { y = _y; return y; }
-
-		/** Assign method.
-		 * Stores new field element for arithmetic.
-		 * @return reference to self
-		 * @param y constant reference to element a
-		 */
-		inline FieldAXPY &assign (const Element& y)
-		{
-			_y = y;
-			return *this;
-		}
-
-		inline void reset()
-		{
-			_y = 0;
-		}
-
-	private:
-
-		/// Field in which arithmetic is done
-		/// Not sure why it must be mutable, but the compiler complains otherwise
-		Field _field;
-
-		/// Field element for arithmetic
-		Element _y;
-
-	};
-}
-
-#endif //__LINBOX_ntl_zz_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/NTL/ntl-ZZ_p.h b/linbox/field/NTL/ntl-ZZ_p.h
deleted file mode 100644
index 332f96b..0000000
--- a/linbox/field/NTL/ntl-ZZ_p.h
+++ /dev/null
@@ -1,500 +0,0 @@
-/* linbox/field/ntl.h
- * Copyright (C) 1999-2005 William J Turner,
- *               2001 Bradford Hovinen
- * Copyright (C) 2011 LinBox
- *
- * Written by W. J. Turner <wjturner at acm.org>,
- *            Bradford Hovinen <hovinen at cis.udel.edu>
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-/*! @file field/NTL/ntl-ZZ_p.h
- * @ingroup field
- * @ingroup NTL
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_field_ntl_zz_p_H
-#define __LINBOX_field_ntl_zz_p_H
-
-#ifndef __LINBOX_HAVE_NTL
-#error "you need NTL here"
-#endif
-
-#include <sys/time.h>
-#include <NTL/ZZ_p.h>
-#include <NTL/ZZ.h>
-
-#include "linbox/linbox-config.h"
-#include "linbox/util/debug.h"
-
-#include "linbox/field/unparametric.h"
-#include "linbox/randiter/unparametric.h"
-#include "linbox/field/field-traits.h"
-
-
-
-#include "linbox/integer.h"
-
-namespace Givaro
-{
-
-
-	/** Conversion of field element to an Integer.
-	 * This function assumes the output field element x has already been
-	 * constructed, but that it is not already initialized.
-	 * This done by converting to a std::string : inefficient but correct.
-	 * @return reference to Integer.
-	 * @param x reference to Integer to contain output (reference returned).
-	 * @param y constant reference to field element.
-	 */
-	template <>
-	Integer& Caster(Integer& x, const NTL::ZZ_p& y)
-	{
-		NTL::ZZ iy = y._ZZ_p__rep;
-
-		long nb = NTL::NumBytes(iy);
-		unsigned char *txt;
-		typedef unsigned char u_char;
-		txt = new u_char[nb + 68];
-		// 			   if (!txt) Error("out of memory");
-		BytesFromZZ(txt, iy, nb);
-
-		x = 0;
-		for (long i = 0; i < nb; i++) {
-			x += Integer( (unsigned long)txt[i] )<<(8*i) ;
-		}
-		delete [] txt;
-		return x;
-	}
-
-	//dpritcha
-	template<>
-	double& Caster(double& x, const NTL::ZZ_p& y)
-	{
-		x = NTL::to_double(NTL::rep(y));
-		return x;
-	}
-
-	/**\brief Initialization of field element from an Integer.
-	 * Behaves like C++ allocator construct.
-	 * This function assumes the output field element x has already been
-	 * constructed, but that it is not already initialized.
-	 * This done by converting to a std::string : inefficient but correct.
-	 * @return reference to field element.
-	 * @param x field element to contain output (reference returned).
-	 * @param y Integer.
-	 \ingroup field
-	 */
-	template <>
-	NTL::ZZ_p& Caster(NTL::ZZ_p& x, const Integer& y)
-	{
-		return x = NTL::to_ZZ_p( NTL::to_ZZ( (static_cast<const std::string>(y)).c_str() ) );
-	}
-	template <>
-	NTL::ZZ_p& Caster(NTL::ZZ_p& x, const double& y)
-	{
-		return x = NTL::to_ZZ_p( NTL::to_ZZ((long)(y) ) );
-	}
-	template <>
-	NTL::ZZ_p& Caster(NTL::ZZ_p& x, const int& y)
-	{
-		return x = NTL::to_ZZ_p( NTL::to_ZZ((long)(y) ) );
-	}
-	template <>
-	NTL::ZZ_p& Caster(NTL::ZZ_p& x, const unsigned long& y)
-	{
-		return x = NTL::to_ZZ_p( NTL::to_ZZ((long)(y) ) );
-	}
-	template <>
-	NTL::ZZ_p& Caster(NTL::ZZ_p& x, const unsigned int& y)
-	{
-		return x = NTL::to_ZZ_p( NTL::to_ZZ((long)(y) ) );
-	}
-} // namespace Givaro
-
-
-// Namespace in which all LinBox library code resides
-namespace LinBox
-{
-
-
-	class NTL_ZZ_p_Initialiser {
-	public :
-		NTL_ZZ_p_Initialiser( const Integer & q, size_t e = 1) {
-			linbox_check(e == 1);
-			if ( q > 0 )
-				NTL::ZZ_p::init(NTL::to_ZZ((std::string(q)).data())); // it's an error if q not prime, e not 1
-		}
-
-		template <class ElementInt>
-		NTL_ZZ_p_Initialiser(const ElementInt& d) {
-			NTL::ZZ_p::init (NTL::to_ZZ(d));
-		}
-
-		NTL_ZZ_p_Initialiser (const NTL::ZZ& d) {
-			NTL::ZZ_p::init(d);
-		}
-
-		NTL_ZZ_p_Initialiser () { }
-
-	};
-
-	/**
-	 *
-	 * @brief Wrapper of zz_p from NTL.
-	 * Uses nice mod p via floating pt trick.
-	 *
-	 */
-	struct NTL_ZZ_p: public NTL_ZZ_p_Initialiser, public FFPACK::UnparametricOperations<NTL::ZZ_p> {
-		typedef NTL::ZZ_p Element ;
-		typedef FFPACK::UnparametricOperations<Element> Father_t ;
-
-		typedef UnparametricRandIter<Element> RandIter;
-
-		const Element zero,one,mOne ;
-
-		/** @name NTL_ZZ_p
-		 * @brief Arbitrary precision integers modulus a positive integer.
-
-		 * While NTL allows any integer to serve as the modulus, only prime
-		 * moduli yield fields.  Therefore, while arthmetic operations may be
-		 * valid for any modulus, only prime moduli are supported in this
-		 * implementation.  The primality of the modulus will not be checked, so
-		 * it is the programmer's responsibility to supply a prime modulus.
-		 * These specializations allow the \ref UnparametricField template class to be
-		 * used to wrap NTL's <code>ZZ_p</code> class as a LinBox field.
-		 */
-		//@{
-		//! @param q,e
-		NTL_ZZ_p(integer q, size_t e = 1) :
-			NTL_ZZ_p_Initialiser(q,e),Father_t ()
-			,zero( NTL::to_ZZ_p(0)),one( NTL::to_ZZ_p(1)),mOne(-one)
-		{
-			// no default - allow initialization of ZZ_p directly by user.
-		}
-
-		//! @param d,e
-		NTL_ZZ_p( NTL::ZZ d, size_t e = 1) :
-			NTL_ZZ_p_Initialiser(d),Father_t()
-			,zero( NTL::to_ZZ_p(0)),one( NTL::to_ZZ_p(1)),mOne(-one)
-		{
-			linbox_check(e == 1);
-		}
-
-		//! NULL constructor
-		NTL_ZZ_p() :
-			NTL_ZZ_p_Initialiser(), Father_t()
-			,zero( NTL::to_ZZ_p(0)),one( NTL::to_ZZ_p(1)),mOne(-one)
-		{}
-		//@}
-
-		Element& init(Element& x, const integer& y) const
-		{
-			return Caster(x,y);
-		}
-
-		Element& init(Element& x, const double& y) const
-		{
-			double z = fmod(y,NTL::to_double(Element::modulus()));
-			if (z > 0) z += 0.5;
-			else z -= 0.5;
-			return x = NTL::to_ZZ_p(static_cast<long>(z)); //rounds towards 0
-		}
-
-		/** Specialization for NTL::ZZ
-		 *
-		 * @return reference to field element.
-		 * @param x field element to contain output (reference returned)
-		 * @param y NTL::ZZ.
-		 */
-		Element& init(Element& x, const NTL::ZZ& y) const
-		{
-			return x = NTL::to_ZZ_p( y );
-		}
-
-		Element& init(Element& x) const
-		{
-			return x = NTL::to_ZZ_p( 0L );
-		}
-
-		Element& init(Element& x, const Element& y) const
-		{
-			return x = y ;
-		}
-
-		template <class ANY> //dpritcha--FIX
-		Element& init(Element& x, const ANY& y) const
-		{
-			return x = NTL::to_ZZ_p((long)(y));
-		}
-
-		/** Specialization for NTL::ZZ.
-		 *
-		 * @return reference to  NTL::ZZ
-		 * @param x  NTL::ZZ to contain output (reference returned).
-		 * @param y constant reference to field element.
-		 */
-		NTL::ZZ& convert(NTL::ZZ& x, const Element& y) const
-		{
-			return x = y._ZZ_p__rep;
-		}
-
-		/** Conversion of field element to an integer.
-		 * This function assumes the output field element x has already been
-		 * constructed, but that it is not already initialized.
-		 * This done by converting to a std::string : inefficient but correct.
-		 * @return reference to integer.
-		 * @param x reference to integer to contain output (reference returned).
-		 * @param y constant reference to field element.
-		 */
-		integer& convert(integer& x, const Element& y) const
-		{
-			NTL::ZZ iy = y._ZZ_p__rep;
-
-			long nb = NTL::NumBytes(iy);
-			unsigned char *txt;
-			typedef unsigned char u_char;
-			txt = new u_char[nb + 68];
-			// 			   if (!txt) Error("out of memory");
-			BytesFromZZ(txt, iy, nb);
-
-			x = 0;
-			for (long i = 0; i < nb; i++) {
-				x += LinBox::integer( (unsigned long)txt[i] )<<(8*i) ;
-			}
-			delete [] txt;
-			return x;
-		};
-
-		double& convert(double& x, const Element& y) const
-		{
-			x = NTL::to_double(NTL::rep(y));
-			return x;
-		}
-
-		template <class ANY>
-		ANY& convert(ANY& x, const Element& y) const
-		{
-			return x = (ANY)(rep(y));
-		}
-
-		static inline integer getMaxModulus()
-		{
-			return integer( -1 );
-		}
-
-		Element& pow( Element& res, const Element& x, long exp ) const
-		{
-			NTL::power( res, x, exp );
-			return res;
-		}
-
-		Element& powin( Element& x, long exp ) const
-		{
-			return x = NTL::power(x,exp);
-		}
-
-		/** Cardinality.
-		 * Return integer representing cardinality of the field.
-		 * Returns the modulus of the field, which should be prime.
-		 * @return integer representing cardinality of the field
-		 */
-		integer& cardinality(integer& c) const
-		{
-			return c = static_cast<integer>(to_long(Element::modulus()));
-		}
-
-		integer cardinality() const
-		{
-			return static_cast<integer>(to_long(Element::modulus()));
-		}
-
-		/** Characteristic.
-		 * Return integer representing characteristic of the field.
-		 * Returns the modulus of the field, which should be prime.
-		 * @return integer representing characteristic of the field.
-		 */
-		integer& characteristic(integer& c) const
-		//FIXME we shouldn't go thru long here as p may be larger than that.
-		// check if NTL has cast ZZp to gmp integers.
-		{
-			return c = static_cast<integer>(to_long(Element::modulus()));
-		}
-
-		size_t& characteristic(size_t & c) const
-		{
-			return c = to_long(Element::modulus());
-		}
-
-		integer characteristic() const
-		{
-			return static_cast<integer>(to_long(Element::modulus()));
-		}
-
-		/** Multiplicative Inverse.
-		 * x = 1 / y
-		 * This function assumes both field elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field element (reference returned).
-		 * @param  y field element.
-		 */
-		Element&
-		inv(Element& x, const Element& y) const
-		{
-			return x = NTL::inv(y);
-		}
-
-		/** Zero equality.
-		 * Test if field element is equal to zero.
-		 * This function assumes the field element has already been
-		 * constructed and initialized.
-		 * In this specialization, NTL's IsZero function is called.
-		 * @return boolean true if equals zero, false if not.
-		 * @param  x field element.
-		 */
-		bool isZero(const Element& x) const
-		{
-			return static_cast<bool>(IsZero(x));
-		}
-
-		/** One equality.
-		 * Test if field element is equal to one.
-		 * This function assumes the field element has already been
-		 * constructed and initialized.
-		 * In this specialization, NTL's IsOne function is called.
-		 * @return boolean true if equals one, false if not.
-		 * @param  x field element.
-		 */
-		bool isOne(const Element& x) const
-		{
-			return static_cast<bool>(IsOne(x));
-		}
-
-		/** Inplace Multiplicative Inverse.
-		 * x = 1 / x
-		 * This function assumes both field elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field element (reference returned).
-		 */
-		Element& invin(Element& x) const
-		{
-			return x = NTL::inv(x);
-		}
-
-		/** Print field.
-		 * @return output stream to which field is written.
-		 * @param  os  output stream to which field is written.
-		 */
-		std::ostream& write(std::ostream& os) const
-		{
-			return os << "unparameterized field Element with p = "
-			<< Element::modulus();
-		}
-
-		/** Print field.
-		 * @return output stream to which field is written.
-		 * @param os  output stream to which field is written.
-		 * @param x
-		 */
-		std::ostream &write (std::ostream &os, const Element &x) const
-		{
-		   	return FFPACK::UnparametricOperations<Element>::write(os,x);
-		}
-	};
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	template <>
-	struct ClassifyRing<NTL_ZZ_p > {
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-	/// Constructor for random field element generator
-	template <>
-	class UnparametricRandIter<NTL::ZZ_p> {
-	protected:
-		integer _size,_seed;
-	public:
-
-		UnparametricRandIter<NTL::ZZ_p> (const NTL_ZZ_p & F,
-						 const integer& size = 0,
-						 const integer& seed = 0) :
-			_size(size), _seed(seed)
-		{
-			if (_seed == integer(0)) _seed = integer(time(NULL));
-
-			integer cardinality;
-			F.cardinality(cardinality);
-			if (_size > cardinality)
-				_size = 0;
-
-#ifdef TRACE
-			std::cout << "created random generator with size " << _size
-			<< " and seed " << _seed << std::endl;
-#endif // TRACE
-
-			// Seed random number generator
-			NTL::SetSeed(NTL::to_ZZ(static_cast<long>(_seed)));
-		}
-
-		// UnparametricRandIter<NTL::ZZ_p>(const NTL_ZZ_p& R) :
-			// _size(R._size), _seed(R._seed)
-		// {
-			// if(_seed == 0)
-				// NTL::SetSeed(NTL::to_ZZ(time(0)));
-			// else
-				// NTL::SetSeed(NTL::to_ZZ( static_cast<long>(_seed)) );
-		// }
-
-
-		/// Random field element creator.
-		NTL::ZZ_p& random(NTL::ZZ_p& x) const
-		{
-			if (_size == 0) {
-				return x = NTL::random_ZZ_p();
-			}
-			else {
-				return x = NTL::to_ZZ_p(NTL::RandomBnd(static_cast<long>(_size)));
-			}
-		}
-
-
-	};
-
-
-} // namespace LinBox
-
-#endif // __LINBOX_field_ntl_zz_p_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/NTL/ntl-ZZ_pE.h b/linbox/field/NTL/ntl-ZZ_pE.h
deleted file mode 100644
index 15234e8..0000000
--- a/linbox/field/NTL/ntl-ZZ_pE.h
+++ /dev/null
@@ -1,419 +0,0 @@
-/* Copyright (C) LinBox
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*! @file field/NTL/ntl-ZZ_pE.h
- * @ingroup field
- * @ingroup NTL
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_field_ntl_zz_pe_H
-#define __LINBOX_field_ntl_zz_pe_H
-
-#ifndef __LINBOX_HAVE_NTL
-#error "you need NTL here"
-#endif
-
-#include <time.h>
-#include "linbox/linbox-config.h"
-#include "linbox/util/debug.h"
-#include <NTL/ZZ_pXFactoring.h>
-#include <NTL/ZZ_pE.h>
-#include <NTL/ZZ.h>
-
-#include "linbox/field/unparametric.h"
-#include "linbox/randiter/unparametric.h"
-#include "linbox/field/field-traits.h"
-
-#ifdef __LINBOX_XMLENABLED
-
-#include "linbox/util/xml/linbox-reader.h"
-#include "linbox/util/xml/linbox-writer.h"
-
-#include <iostream>
-#include <sstream>
-#include <string>
-#include <vector>
-
-#endif //__LINBOX_XMLENABLED
-
-
-
-#include "linbox/integer.h"
-
-namespace Givaro
-{
-
-	template<>
-	NTL::ZZ_pE& Caster(NTL::ZZ_pE &x, const Integer &y)
-	{
-		x=NTL::to_ZZ_pE(static_cast<long>(y));
-		return x;
-	}
-	template<>
-	NTL::ZZ_pE& Caster(NTL::ZZ_pE &x, const double &y)
-	{
-		x=NTL::to_ZZ_pE(static_cast<long>(y));
-		return x;
-	}
-
-	// Rich Seagraves, 7-15-03
-	// On the orders of Dr Saunders, I'm re-writing init & convert so that
-	// they convert a ZZpE into a padic number, ie a0 + a1x + a2x^2 +... ->
-	// a0 + a1*p + a2*p^2 + ...
-	//
-
-	Integer& Caster(Integer& c, const NTL::ZZ_pE& e)
-	{
-		NTL::ZZ_pX poly = rep(e);
-		//Integer base = _p;
-		Integer base = static_cast<Integer>(to_long(NTL::ZZ_p::modulus()));
-		long i;
-
-		c = 0;
-		for(i = deg(poly); i >= 0; --i) {
-			c *= base;
-			c +=  NTL::to_long(rep(coeff(poly, i)));
-		}
-
-		return c;
-	}
-} // namespace Givaro
-
-// Namespace in which all LinBox library code resides
-namespace LinBox
-{
-
-	class NTL_ZZ_pE_Initialiser {
-	public :
-		NTL_ZZ_pE_Initialiser( const Integer & p, size_t k ) {
-			// linbox_check(e == 1);
-			// if ( q > 0 )
-			// NTL::ZZ_p::init(NTL::to_ZZ((std::string(q)).data())); // it's an error if q not prime, e not 1
-			NTL::ZZ_p::init(NTL::to_ZZ(std::string(p).data()));
-			NTL::ZZ_pX irredPoly = NTL::BuildIrred_ZZ_pX ((long) k);
-			NTL::ZZ_pE::init(irredPoly);
-
-		}
-
-		// template <class ElementInt>
-		// NTL_ZZ_pE_Initialiser(const ElementInt& d) {
-			// NTL::ZZ_p::init (NTL::to_ZZ(d));
-		// }
-
-		// NTL_ZZ_pE_Initialiser (const NTL::ZZ& d) {
-			// NTL::ZZ_p::init(d);
-		// }
-
-	};
-
-
-
-	/**
-	 * @brief Wrapper of ZZ_pE from NTL
-	 * Define a parameterized class to handle easily UnparametricField<NTL::ZZ_pE> field
-	 */
-	class NTL_ZZ_pE : public NTL_ZZ_pE_Initialiser, public UnparametricOperations<NTL::ZZ_pE> {
-	public:
-		typedef NTL::ZZ_pE Element ;
-		typedef FFPACK::UnparametricOperations<Element> Father_t ;
-
-		const Element zero,one,mOne ;
-
-
-		NTL_ZZ_pE (const integer &p, const integer &k) :
-			NTL_ZZ_pE_Initialiser(p,k),Father_t ()
-			,zero( NTL::to_ZZ_pE(0)),one( NTL::to_ZZ_pE(1)),mOne(-one)
-
-
-		{
-
-				}
-
-
-	bool isZero (const Element& a) const
-	{
-		return NTL::IsZero(a);
-	}
-
-
-	bool isOne (const Element& a) const
-	{
-		return NTL::IsOne(a);
-	}
-
-
-
-	integer& characteristic (integer &c) const
-	{
-		return c=static_cast<integer>(to_long(NTL::ZZ_p::modulus()));
-		//NTL::ZZ_p::modulus();
-	}
-
-
-	integer& cardinality(integer& c) const
-	{
-		c=static_cast<integer>(to_long(NTL::ZZ_p::modulus()));
-		c=pow(c,Element::degree());
-		return c;
-	}
-
-	Element& inv(Element& x, const Element& y) const
-	{
-		x=NTL::to_ZZ_pE(1)/y;
-		return x;
-	}
-
-	Element& invin(Element& x) const
-	{
-		x=NTL::to_ZZ_pE(1)/x;
-		return x;
-	}
-
-
-	std::istream& read(std::istream& is, Element& x) const
-	{
-		long tmp;
-		is>>tmp;
-		x=NTL::to_ZZ_pE(tmp);
-		return is;
-	}
-
-
-
-#ifdef __LINBOX_XMLENABLED
-
-
-	bool toTag(LinBox::Writer &W) const
-	{
-		std::string s;
-		NTL::ZZ_pX poly = Element::modulus();
-		long i;
-
-		W.setTagName("field");
-		W.setAttribute("implDetail", "ntl-ZZpE");
-		W.setAttribute("cardinality", LinBox::Writer::numToString(s, _card));
-
-		W.addTagChild();
-		W.setTagName("finite");
-
-		W.addTagChild();
-		W.setTagName("characteristic");
-		W.addNum(_p);
-		W.upToParent();
-
-		W.addTagChild();
-		W.setTagName("extension");
-		W.addNum(deg(poly) + 1);
-		W.upToParent();
-
-		W.addTagChild();
-		W.setTagName("polynomial");
-
-		for(i = 0; i <= deg(poly); ++i) {
-			W.addNum(coeff(poly, i));
-		}
-		W.upToParent();
-		W.upToParent();
-		W.upToParent();
-
-		return true;
-	}
-
-
-	std::ostream &write(std::ostream &os) const
-	{
-		LinBox::Writer W;
-		if( toTag(W) )
-			W.write(os);
-
-		return os;
-	}
-
-
-	// Elemnt Reading & writing functions
-	// BIG NOTE:  It was decided that for extension fields, the elements
-	// would be represented using a single number that has the following
-	// property:  for an element e in ZZp[x], with e = a0 + a1x + a2x^2 + ...,
-	// represent e as "<cn>n</cn>" where n = a0 + a1 * p + a2 * p^2 + ...
-	//
-
-
-	bool toTag(LinBox::Writer &W, const Element &e) const
-	{
-		NTL::ZZ_pX poly = rep(e);
-		NTL::ZZ accum, base = NTL::ZZ_p::modulus();
-		long i;
-		std::string s;
-
-		accum = 0;
-		for(i = deg(poly); i >= 0; --i) {
-			accum *= base;
-			accum += rep(coeff(poly, i));
-		}
-
-
-		W.setTagName("cn");
-		W.addDataChild(LinBox::Writer::numToString(s, accum));
-
-		return true;
-	}
-
-
-	std::ostream &write(std::ostream &os, const Element &e) const
-	{
-
-		LinBox::Writer W;
-		if( toTag(W, e))
-			W.write(os);
-
-		return os;
-	}
-
-
-
-
-	bool fromTag(LinBox::Reader &R, Element &e) const
-	{
-		NTL::ZZ total, base = NTL::ZZ_p::modulus(), rem;
-		std::stringstream ss;
-
-		if(!R.expectTagName("cn") || !R.expectChildTextNum(total))
-			return false;
-
-		ss << "[";
-		while(total > 0) {
-			rem = total % base;
-			total /= base;
-			ss << rem;
-			if(total > 0) ss << " ";
-		}
-
-		ss << "]";
-
-		ss >> e; // use the extraction stream operator
-
-		return true;
-	}
-
-
-	std::istream &read(std::istream &is, Element &e) const
-	{
-		LinBox::Reader R(is);
-		if( !fromTag(R, e)) {
-			is.setstate(std::istream::failbit);
-			if(!R.initalized()) {
-				is.setstate(std::istream::badbit);
-			}
-		}
-
-		return is;
-	}
-
-
-#endif
-
-
-	}; // end of class NTL_ZZ_pE
-
-
-
-
-
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	template<>
-	struct ClassifyRing<UnparametricRandIter<NTL::ZZ_pE> > {
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-
-
-}
-
-namespace LinBox
-{
-
-
-	template<>
-	class UnparametricRandIter<NTL::ZZ_pE> {
-	public:
-		typedef NTL::ZZ_pE Element;
-		UnparametricRandIter<NTL::ZZ_pE>(const NTL_ZZ_pE & F ,
-						 const integer& size =0,
-						 const integer& seed =0
-						) :
-			_size(size), _seed(seed)
-		{
-			if(_seed == 0)
-				NTL::SetSeed(NTL::to_ZZ(time(0)));
-			else
-				NTL::SetSeed( NTL::to_ZZ(static_cast<long>(seed)) );
-		}
-
-#ifdef __LINBOX_XMLENABLED
-		UnparametricRandIter<NTL::ZZ_pE>(LinBox::Reader &R)
-		{
-			if(!R.expectTagName("randiter")) return;
-			if(!R.expectAttributeNum("seed", _seed) || !R.expectAttributeNum("size", _size)) return;
-
-			if(_seed == 0) _seed = time(NULL);
-
-			NTL::SetSeed(NTL::to_ZZ(_seed));
-		}
-#endif
-
-
-		UnparametricRandIter<NTL::ZZ_pE>(const UnparametricRandIter<NTL::ZZ_pE>& R) :
-			_size(R._size), _seed(R._seed)
-
-		{
-			if(_seed == 0)
-				NTL::SetSeed(NTL::to_ZZ(time(0)));
-			else
-				NTL::SetSeed(NTL::to_ZZ( static_cast<long>(_seed)) );
-		}
-
-		NTL::ZZ_pE& random (NTL::ZZ_pE& x) const
-		{
-			NTL::random(x);
-			return x;
-		}
-
-	protected:
-		size_t _size;
-		size_t _seed;
-	};
-}
-#endif //__LINBOX_field_ntl_zz_pe_H
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/NTL/ntl-ZZ_pX.h b/linbox/field/NTL/ntl-ZZ_pX.h
deleted file mode 100644
index e7a0003..0000000
--- a/linbox/field/NTL/ntl-ZZ_pX.h
+++ /dev/null
@@ -1,341 +0,0 @@
-/* Copyright (C) 2005 LinBox
- * written by Daniel Roche, August 2005
- * Copyright (C) 2011 LinBox
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*! @file field/NTL/ntl-ZZ_p.h
- * @ingroup field
- * @ingroup NTL
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_field_ntl_zz_px_H
-#define __LINBOX_field_ntl_zz_px_H
-
-#ifndef __LINBOX_HAVE_NTL
-#error "you need NTL here"
-#endif
-
-#include <vector>
-#include <NTL/ZZ_pX.h>
-
-#include "linbox/linbox-config.h"
-#include "linbox/util/debug.h"
-
-#include "linbox/field/unparametric.h"
-#include "linbox/field/NTL/ntl-ZZ_p.h"
-#include "linbox/integer.h"
-
-
-// namespace in which all LinBox code resides
-namespace LinBox
-{
-	class NTL_ZZ_pX_Initialiser {
-	public :
-		NTL_ZZ_pX_Initialiser( const Integer & q, size_t e = 1) {
-			// linbox_check(e == 1);
-			if ( q > 0 )
-				NTL::ZZ_p::init(NTL::to_ZZ((std::string(q)).data())); // it's an error if q not prime, e not 1
-		}
-
-		// template <class ElementInt>
-		// NTL_ZZ_p_Initialiser(const ElementInt& d) {
-		// NTL::ZZ_p::init (NTL::to_ZZ(d));
-		// }
-
-		// NTL_ZZ_p_Initialiser (const NTL::ZZ& d) {
-		// NTL::ZZ_p::init(d);
-		// }
-
-	};
-
-	/** Ring (in fact, a unique factorization domain) of polynomial with
-	 * coefficients in class NTL_ZZ_p (integers mod a wordsize prime).
-	 * All the same functions as any other ring, with the addition of:
-	 * Coeff (type), CoeffField (type), getCoeffField, setCoeff, getCoeff,
-	 * leadCoeff, deg
-	 */
-	class NTL_ZZ_pX : public NTL_ZZ_pX_Initialiser, public FFPACK::UnparametricOperations<NTL::ZZ_pX> {
-	public:
-		typedef NTL::ZZ_pX Element ;
-		typedef FFPACK::UnparametricOperations<Element> Father_t ;
-		typedef UnparametricRandIter<Element> RandIter;
-
-		const Element zero,one,mOne ;
-
-
-		typedef NTL_ZZ_p CoeffField;
-		typedef NTL::ZZ_p Coeff;
-		// typedef NTL::ZZ_pX Element;
-
-		/** Standard LinBox field constructor.  The paramters here
-		 * (prime, exponent) are only used to initialize the coefficient field.
-		 */
-		NTL_ZZ_pX( const integer& p, size_t e = 1 ) :
-			NTL_ZZ_pX_Initialiser(p,e),Father_t ()
-			, zero( NTL::to_ZZ_pX(0)),one( NTL::to_ZZ_pX(1)),mOne(-one)
-			, _CField(p,e)
-		{}
-
-		/** Constructor from a coefficient field */
-		NTL_ZZ_pX( CoeffField cf ) :
-			NTL_ZZ_pX_Initialiser(cf.cardinality()),Father_t ()
-			,zero( NTL::to_ZZ_pX(0)),one( NTL::to_ZZ_pX(1)),mOne(-one)
-			,_CField(cf)
-		{}
-
-		/** Initialize p to the constant y (p = y*x^0) */
-		template <class ANY>
-		Element& init( Element& p, const ANY& y ) const
-		{
-			Coeff temp;
-			_CField.init( temp, y );
-			return p = temp;
-		}
-
-		/** Initialize p to the constant y (p = y*x^0) */
-		Element& init( Element& p, const Coeff& y ) const
-		{
-			return p = y;
-		}
-
-		/** Initialize p from a vector of coefficients.
-		 * The vector should be ordered the same way NTL does it: the front
-		 * of the vector corresponds to the trailing coefficients, and the back
-		 * of the vector corresponds to the leading coefficients.  That is,
-		 * v[i] = coefficient of x^i.
-		 */
-		template <class ANY>
-		Element& init( Element& p, const std::vector<ANY>& v ) const
-		{
-			p = 0;
-			Coeff temp;
-			for( long i = 0; i < (long)v.size(); ++i ) {
-				_CField.init( temp, v[ (size_t) i ] );
-				if( !_CField.isZero(temp) )
-					NTL::SetCoeff( p, i, temp );
-			}
-			return p;
-		}
-
-		/** Initialize p from a vector of coefficients.
-		 * The vector should be ordered the same way NTL does it: the front
-		 * of the vector corresponds to the trailing coefficients, and the back
-		 * of the vector corresponds to the leading coefficients.  That is,
-		 * v[i] = coefficient of x^i.
-		 */
-		Element& init( Element& p, const std::vector<Coeff>& v ) const
-		{
-			p = 0;
-			for( long i = 0; i < (long)v.size(); ++i )
-				NTL::SetCoeff( p, i, v[ (size_t) i ] );
-			return p;
-		}
-
-		/** Convert p to a vector of coefficients.
-		 * The vector will be ordered the same way NTL does it: the front
-		 * of the vector corresponds to the trailing coefficients, and the back
-		 * of the vector corresponds to the leading coefficients.  That is,
-		 * v[i] = coefficient of x^i.
-		 */
-		template< class ANY >
-		std::vector<ANY>& convert( std::vector<ANY>& v, const Element& p ) const
-		{
-			v.clear();
-			ANY temp;
-			for( long i = 0; i <= this->deg(p); ++i ) {
-				_CField.convert( temp, NTL::coeff( p, i ) );
-				v.push_back( temp );
-			}
-			return v;
-		}
-
-		/** Convert p to a vector of coefficients.
-		 * The vector will be ordered the same way NTL does it: the front
-		 * of the vector corresponds to the trailing coefficients, and the back
-		 * of the vector corresponds to the leading coefficients.  That is,
-		 * v[i] = coefficient of x^i.
-		 */
-		std::vector<Coeff>& convert( std::vector<Coeff>& v, const Element& p ) const
-		{
-			v.clear();
-			for( long i = 0; i <= (long)this->deg(p); ++i )
-				v.push_back( NTL::coeff(p,i) );
-			return v;
-		}
-
-		/** Test if an element equals zero */
-		bool isZero( const Element& x ) const
-		{
-			return ( (this->deg(x) == 0) &&
-				 ( _CField.isZero( NTL::ConstTerm(x) ) ) );
-		}
-
-		/** Test if an element equals one */
-		bool isOne( const Element& x ) const
-		{
-			return ( (this->deg(x) == 0) &&
-				 ( _CField.isOne( NTL::ConstTerm(x) ) ) );
-		}
-
-		/** The LinBox field for coefficients */
-		const CoeffField& getCoeffField() const
-		{
-			return _CField;
-		}
-
-		/** Get the degree of a polynomial
-		 * Unlike NTL, deg(0)=0.
-		 */
-		size_t deg( const Element& p ) const
-		{
-			long temp = NTL::deg(p);
-			if( temp == -1 ) return 0;
-			else return static_cast<size_t>(temp);
-		}
-
-		/** r will be set to the reverse of p. */
-		Element& rev( Element& r, const Element& p ) {
-			NTL::reverse(r,p);
-			return r;
-		}
-
-		/** r is itself reversed. */
-		Element& revin( Element& r ) {
-			return r = NTL::reverse(r);
-		}
-
-		/** Get the leading coefficient of this polynomial. */
-		Coeff& leadCoeff( Coeff& c, const Element& p ) const
-		{
-			c = NTL::LeadCoeff(p);
-			return c;
-		}
-
-		/** Get the coefficient of x^i in a given polynomial */
-		Coeff& getCoeff( Coeff& c, const Element& p, size_t i ) const
-		{
-			c = NTL::coeff( p, (long)i );
-			return c;
-		}
-
-		/** Set the coefficient of x^i in a given polynomial */
-		Element& setCoeff( Element& p, size_t i, const Coeff& c ) const
-		{
-			NTL::SetCoeff(p,(long)i,c);
-			return p;
-		}
-
-		/** Get the quotient of two polynomials */
-		Element& quo( Element& res, const Element& a, const Element& b ) const
-		{
-			NTL::div(res,a,b);
-			return res;
-		}
-
-		/** a = quotient of a, b */
-		Element& quoin( Element& a, const Element& b ) const
-		{
-			return a /= b;
-		}
-
-		/** Get the remainder under polynomial division */
-		Element& rem( Element& res, const Element& a, const Element& b ) const
-		{
-			NTL::rem(res,a,b);
-			return res;
-		}
-
-		/** a = remainder of a,b */
-		Element& remin( Element& a, const Element& b ) const
-		{
-			return a %= b;
-		}
-
-		/** Get the quotient and remainder under polynomial division */
-		void quorem( Element& q, Element& r,
-			     const Element& a, const Element& b ) const
-		{
-			NTL::DivRem(q,r,a,b);
-		}
-
-		/** Get characteristic of the field - same as characteristic of
-		 * coefficient field. */
-		integer& characteristic( integer& c ) const
-		{
-			return _CField.characteristic(c);
-		}
-
-		/** Get the cardinality of the field.  Since the cardinality is
-		 * infinite, by convention we return -1.
-		 */
-		integer& cardinality( integer& c ) const
-		{
-			return c = static_cast<integer>(-1);
-		}
-
-		static inline integer getMaxModulus()
-		{
-			return CoeffField::getMaxModulus();
-		}
-
-		/** Write a description of the field */
-		// Oustide of class definition so write(ostream&,const Element&) from
-		// UnparametricField still works.
-		std::ostream& write( std::ostream& os ) const
-		{
-			return os << "Polynomial ring using NTL::ZZ_pX";
-		}
-
-		std::ostream &write (std::ostream &os, const Element &x) const { return FFPACK::UnparametricOperations<Element>::write(os,x); }
-
-
-	private:
-		/** Conversion to scalar types doesn't make sense and should not be
-		 * used.  Use getCoeff or leadCoeff to get the scalar values of
-		 * specific coefficients, and then convert them using coeffField()
-		 * if needed.
-		 */
-		template< class ANY >
-		ANY& convert( ANY& x, const Element& y ) const
-		{
-			return x;
-		}
-
-		CoeffField _CField;
-	}; // end of class NTL_ZZ_pX
-
-
-} // end of namespace LinBox
-
-#endif // __LINBOX_field_ntl_zz_px_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/NTL/ntl-lzz_p.h b/linbox/field/NTL/ntl-lzz_p.h
deleted file mode 100644
index 17dd533..0000000
--- a/linbox/field/NTL/ntl-lzz_p.h
+++ /dev/null
@@ -1,348 +0,0 @@
-/* linbox/field/ntl-lzz_p.h
- * Copyright (C) 1999-2005 W. J. Turner,
- *               2001 Bradford Hovinen
- * Copyright (C) 2011 LinBox
- *
- * Written by W. J. Turner <wjturner at acm.org>,
- *            Bradford Hovinen <hovinen at cis.udel.edu>
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- *
- */
-
-/*! @file field/NTL/ntl-lzz_p.h
- * @ingroup field
- * @ingroup NTL
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_field_ntl_lzz_p_H
-#define __LINBOX_field_ntl_lzz_p_H
-
-#ifndef __LINBOX_HAVE_NTL
-#error "you need NTL here"
-#endif
-
-#include <time.h>
-#include "linbox/linbox-config.h"
-#include "linbox/util/debug.h"
-#include <NTL/lzz_p.h>
-#include <NTL/ZZ.h>
-
-#include "linbox/field/unparametric.h"
-#include "linbox/randiter/unparametric.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/integer.h"
-
-#include "linbox/integer.h"
-
-namespace Givaro
-{
-
-	/** Initialization of field element from an integer.
-	 * This Uses NTL's <code>to_zz_p</code> function.
-	 *
-	 * @return reference to field element.
-	 * @param x field element to contain output (reference returned).
-	 * @param y Integer.
-	 */
-	template <>
-	NTL::zz_p& Caster(NTL::zz_p& x, const Integer& y)
-	{
-		return x = NTL::to_zz_p( y%NTL::zz_p::modulus() );
-	}
-	template <>
-	NTL::zz_p& Caster(NTL::zz_p& x, const double& y)
-	{
-		return x = NTL::to_zz_p((long)(y)%NTL::zz_p::modulus());
-	}
-
-	/** Conversion of field element to an Integer.
-	 * This function assumes the output field element x has already been
-	 * constructed, but that it is not already initialized.
-	 * For now, this is done by converting the element type to a C++
-	 * long and then to the Integer type through the use of static cast and
-	 * NTL's to_long function.
-	 * This, of course, assumes such static casts are possible.
-	 * This function should be changed in the future to avoid using long.
-	 * @return reference to Integer.
-	 * @param x reference to Integer to contain output (reference returned).
-	 * @param y constant reference to field element.
-	 */
- 	template <>
-	Integer& Caster(Integer& x, const NTL::zz_p& y)
-	{
-		return x = static_cast<Integer>(rep(y));
-	}
-} // namespace Givaro
-
-// Namespace in which all LinBox library code resides
-namespace LinBox
-{
-
-	class NTL_zz_p_Initialiser {
-	public :
-		NTL_zz_p_Initialiser( const Integer & q, size_t e = 1) {
-			linbox_check(e == 1);
-			if ( q > 0 )
-				// NTL::zz_p::init(NTL::to_ZZ((std::string(q)).data())); // it's an error if q not prime, e not 1
-				NTL::zz_p::init(q); // it's an error if q not prime, e not 1
-		}
-
-		template <class ElementInt>
-		NTL_zz_p_Initialiser(const ElementInt& d) {
-			NTL::zz_p::init (NTL::to_ZZ(d));
-		}
-
-		NTL_zz_p_Initialiser () { }
-
-	};
-
-	/**
-	 * \brief long ints modulo a positive integer.
-	 *
-	 * While NTL allows any int to serve as the modulus, only prime
-	 * moduli yield fields.  The primality of the modulus will not be checked, so
-	 * it is the programmer's responsibility to supply a prime modulus if a field is
-	 * wanted.
-	 * These specializations allow the \ref UnparametricField template class to be
-	 * used to wrap NTL's <code>zz_p</code> class as a LinBox field.
-	 * Uses nice trick for mod p via floating point.
-	 \ingroup field
-	 */
-	struct NTL_zz_p: public NTL_zz_p_Initialiser, public FFPACK::UnparametricOperations<NTL::zz_p> {
-		typedef NTL::zz_p Element ;
-		typedef FFPACK::UnparametricOperations<Element> Father_t ;
-		typedef UnparametricRandIter<NTL::zz_p> RandIter;
-
-		const Element zero,one,mOne ;
-
-
-		//public UnparametricField<Element> {
-		NTL_zz_p(integer p, size_t e = 1) :
-			NTL_zz_p_Initialiser(p,e),Father_t ()
-			,zero( NTL::to_zz_p(0)),one( NTL::to_zz_p(1)),mOne(-one)
-		{}
-
-		NTL_zz_p() :
-			NTL_zz_p_Initialiser(2,1), Father_t()
-			,zero( NTL::to_zz_p(0)),one( NTL::to_zz_p(1)),mOne(-one)
-		{}
-
-		Element& init(Element& x, const double& y) const
-		{
-			double z = fmod(y,(double)Element::modulus());
-			if (z > 0) z += 0.5;
-			else z -= 0.5;
-			return x = NTL::to_zz_p(static_cast<long>(z)); //rounds towards 0
-		}
-
-		Element &init (Element &x, const integer &y=0) const
-		{
-			NTL::ZZ tmp= NTL::to_ZZ(std::string(y).data());
-			return x = NTL::to_zz_p(tmp);
-		}
-
-		template <class ANY>
-		Element& init(Element& x, const ANY& y) const
-		{
-			return x = NTL::to_zz_p((long)(y));
-		}
-
-		template <class ANY>
-		ANY& convert(ANY& x, const Element& y) const
-		{
-			return x = (ANY)(rep(y));
-		}
-
-		static inline integer getMaxModulus()
-		{
-			return integer( NTL_SP_BOUND );
-		}
-
-		Element& pow( Element& res, const Element& x, long exp ) const
-		{
-			NTL::power( res, x, exp );
-			return res;
-		}
-
-		Element& powin( Element& x, long exp ) const
-		{
-			return x = NTL::power(x,exp);
-		}
-		/** Cardinality.
-		 * Return integer representing cardinality of the field.
-		 * Returns the modulus of the field, which should be prime.
-		 * @return integer representing cardinality of the field
-		 */
-
-		integer& cardinality(integer& c) const
-		{
-			return c = static_cast<integer>(Element::modulus());
-		}
-
-		integer cardinality() const
-		{
-			return static_cast<integer>(Element::modulus());
-		}
-
-		/** Characteristic.
-		 * Return integer representing characteristic of the field.
-		 * Returns the modulus of the field, which should be prime.
-		 * @return integer representing characteristic of the field.
-		 */
-
-		integer& characteristic(integer& c) const
-		{
-			return c = static_cast<integer>(Element::modulus());
-		}
-
-		integer characteristic() const
-		{
-			return static_cast<integer>(Element::modulus());
-		}
-
-		/** Multiplicative Inverse.
-		 * x = 1 / y
-		 * This function assumes both field elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field element (reference returned).
-		 * @param  y field element.
-		 */
-		Element&
-		inv(Element& x, const Element& y) const
-		{
-			return x = NTL::inv(y);
-		}
-
-		/** Zero equality.
-		 * Test if field element is equal to zero.
-		 * This function assumes the field element has already been
-		 * constructed and initialized.
-		 * In this specialization, NTL's IsZero function is called.
-		 * @return boolean true if equals zero, false if not.
-		 * @param  x field element.
-		 */
-		bool isZero(const Element& x) const
-		{
-			return static_cast<bool>(NTL::IsZero(x));
-		}
-
-		/** One equality.
-		 * Test if field element is equal to one.
-		 * This function assumes the field element has already been
-		 * constructed and initialized.
-		 * In this specialization, NTL's IsOne function is called.
-		 * @return boolean true if equals one, false if not.
-		 * @param  x field element.
-		 */
-		bool isOne(const Element& x) const
-		{
-			return static_cast<bool>(NTL::IsOne(x));
-		}
-
-		/** Inplace Multiplicative Inverse.
-		 * x = 1 / x
-		 * This function assumes both field elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field element (reference returned).
-		 */
-		Element& invin(Element& x) const
-		{
-			return x = NTL::inv(x);
-		}
-
-		/** Print field.
-		 * @return output stream to which field is written.
-		 * @param  os  output stream to which field is written.
-		 */
-		std::ostream& write(std::ostream& os) const
-		{
-			return os << "unparameterized field Element with p = "
-			<< Element::modulus();
-		}
-
-		std::ostream &write (std::ostream &os, const Element &x) const { return FFPACK::UnparametricOperations<Element>::write(os,x); }
-	};
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	template <>
-	struct ClassifyRing<NTL_zz_p> {
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-	template<>
-	class UnparametricRandIter<NTL::zz_p> {
-	public:
-		/// Constructor for random field element generator
-
-		UnparametricRandIter<NTL::zz_p> (const NTL_zz_p & F=NTL_zz_p(),
-						 const integer& size=0,
-						 const integer& seed=0) :
-			_size(size), _seed(seed)
-		{
-			if (_seed == integer(0)) _seed = integer(time(NULL));
-
-			integer cardinality;
-			F.cardinality(cardinality);
-			if (_size > cardinality)
-				_size = 0;
-
-#ifdef TRACE
-			std::cout << "created random generator with size " << _size
-			<< " and seed " << _seed << std::endl;
-#endif // TRACE
-
-			// Seed random number generator
-			NTL::SetSeed(NTL::to_ZZ(static_cast<long>(_seed)));
-		}
-
-		/// Random field element creator.
-		NTL::zz_p& random(NTL::zz_p& x) const
-		{
-			if (_size == 0) {
-				return x = NTL::random_zz_p();
-			}
-			else {
-				return x = NTL::to_zz_p(NTL::RandomBnd(static_cast<long>(_size)));
-			}
-		}
-	protected :
-		integer _size,_seed ;
-	};
-
-} // namespace LinBox
-
-#endif // __LINBOX_field_ntl_lzz_p_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/NTL/ntl-lzz_pE.h b/linbox/field/NTL/ntl-lzz_pE.h
deleted file mode 100644
index bc81612..0000000
--- a/linbox/field/NTL/ntl-lzz_pE.h
+++ /dev/null
@@ -1,268 +0,0 @@
-/* linbox/field/ntl-z_pE.h
- * Copyright (C) 2004  Pascal Giorgi
- * Copyright (C) 2011 LinBox
- *
- * Written by  Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- *
- * Modified by W. J. Turner <wjturner at acm.org>
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*! @file field/NTL/ntl-lzz_pE.h
- * @ingroup field
- * @ingroup NTL
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_field_ntl_lzz_pe_H
-#define __LINBOX_field_ntl_lzz_pe_H
-
-#ifndef __LINBOX_HAVE_NTL
-#error "you need NTL here"
-#endif
-
-#include <NTL/lzz_pXFactoring.h>
-#include <NTL/lzz_pE.h>
-#include <time.h>
-#include "linbox/linbox-config.h"
-#include "linbox/util/debug.h"
-
-#include "linbox/field/unparametric.h"
-#include "linbox/randiter/unparametric.h"
-#include "linbox/field/field-traits.h"
-
-
-
-#include "linbox/integer.h"
-
-namespace Givaro
-{
-	template<>
-	NTL::zz_pE& Caster(NTL::zz_pE &x, const Integer &y)
-	{
-		x=NTL::to_zz_pE(static_cast<long>(y));
-		return x;
-	}
-	template<>
-	NTL::zz_pE& Caster(NTL::zz_pE &x, const double &y)
-	{
-		x=NTL::to_zz_pE(static_cast<long>(y));
-		return x;
-	}
-
-	template<>
-	Integer& Caster (Integer& x, const NTL::zz_pE &y) {
-		NTL::zz_pX poly = rep(y);
-		Integer base = static_cast<Integer>(NTL::zz_p::modulus());
-		long i = deg(poly)+1;
-		x = 0;
-		for( ; i-- ; ) {
-			x *= base;
-			x +=  NTL::to_long(rep(coeff(poly, i)));
-		}
-		return x;
-	}
-} // namespace Givaro
-
-
-
-// Namespace in which all LinBox library code resides
-namespace LinBox
-{
-
-	//! use ZZ_pEBak mechanism too ?
-	class NTL_zz_pE_Initialiser {
-	public :
-		NTL_zz_pE_Initialiser( const Integer & p, const Integer & k) {
-			NTL::zz_p::init( (long) p);
-			NTL::zz_pX irredPoly = NTL::BuildIrred_zz_pX ((long) k);
-			NTL::zz_pE::init(irredPoly);
-
-		}
-
-		// template <class ElementInt>
-		// NTL_zz_pE_Initialiser(const ElementInt& d) {
-			// NTL::ZZ_p::init (NTL::to_ZZ(d));
-		// }
-
-		// NTL_zz_pE_Initialiser (const NTL::ZZ& d) {
-			// NTL::ZZ_p::init(d);
-		// }
-
-	};
-
-
-
-
-
-	/*! @brief zz_pE
-	 * Define a parameterized class to easily handle UnparametricField<NTL::zz_pE> field
-	 */
-
-	/// \brief for large cardinality, small prime.  \ingroup field
-	class NTL_zz_pE : public NTL_zz_pE_Initialiser, public FFPACK::UnparametricOperations<NTL::zz_pE> {
-	public:
-		typedef NTL::zz_pE Element ;
-		typedef FFPACK::UnparametricOperations<Element> Father_t ;
-		typedef UnparametricRandIter<Element> RandIter;
-
-		const Element zero,one,mOne ;
-
-		NTL_zz_pE (const integer &p, const integer &k) :
-			NTL_zz_pE_Initialiser(p,k),Father_t ()
-			,zero( NTL::to_zz_pE(0)),one( NTL::to_zz_pE(1)),mOne(-one)
-
-		{
-
-		}
-
-		Element& random (Element& x) const
-		{
-			NTL::random(x);
-			return x;
-		}
-
-
-		bool isZero (const Element& a) const
-		{
-			return NTL::IsZero(a);
-		}
-
-
-		bool isOne (const Element& a) const
-		{
-			return NTL::IsOne(a);
-		}
-
-
-
-		integer& characteristic (integer &c) const
-		{
-			return c = static_cast<integer>(NTL::zz_p::modulus());
-		}
-
-
-		integer& cardinality(integer& c) const
-		{
-			NTL::ZZ card = Element::cardinality();
-			long b = NumBytes(card);
-			unsigned char* byteArray;
-			byteArray = new unsigned char[(size_t)b ];
-			BytesFromZZ(byteArray, card, b);
-
-			integer base(256);
-			c= integer(0);
-
-			for(long i = b - 1; i >= 0; --i) {
-				c *= base;
-				c += integer(byteArray[i]);
-			}
-			delete [] byteArray;
-
-			return c;
-		}
-
-
-
-		Element& inv(Element& x, const Element& y) const
-		{
-			x=one/y;
-			return x;
-		}
-
-		Element& invin(Element& x) const
-		{
-			x=one/x;
-			return x;
-		}
-
-
-
-		std::istream& read(std::istream& is, Element& x) const
-		{
-			long tmp;
-			is>>tmp;
-			x=NTL::to_zz_pE(tmp);
-			return is;
-		}
-	}; // end o class NTL_zz_pE
-
-
-
-
-
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	template<>
-	struct ClassifyRing<UnparametricRandIter<NTL::zz_pE> > {
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-	template<>
-	class UnparametricRandIter<NTL::zz_pE> {
-	public:
-		typedef NTL::zz_pE Element;
-		UnparametricRandIter<NTL::zz_pE>(const NTL_zz_pE & F ,
-						 const size_t& size = 0,
-						 const size_t& seed = 0
-						) :
-			_size(size), _seed(seed)
-		{
-			if(_seed == 0)
-				NTL::SetSeed(NTL::to_ZZ(time(0)));
-			else
-				NTL::SetSeed(NTL::to_ZZ(_seed));
-		}
-
-		UnparametricRandIter<NTL::zz_pE>(const UnparametricRandIter<NTL::zz_pE>& R) :
-			_size(R._size), _seed(R._seed)
-
-		{
-			if(_seed == 0)
-				NTL::SetSeed(NTL::to_ZZ(time(0)));
-			else
-				NTL::SetSeed(NTL::to_ZZ(_seed));
-		}
-
-		Element& random (Element& x) const
-		{
-			NTL::random(x);
-			return x;
-		}
-
-	protected:
-		size_t _size;
-		size_t _seed;
-	};
-}
-
-#endif //__LINBOX_ntl_lzz_pe_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/NTL/ntl-lzz_pX.h b/linbox/field/NTL/ntl-lzz_pX.h
deleted file mode 100644
index 74167d4..0000000
--- a/linbox/field/NTL/ntl-lzz_pX.h
+++ /dev/null
@@ -1,329 +0,0 @@
-/* Copyright (C) 2005 LinBox
- * Copyright (C) 2011 LinBox
- *
- *
- * Written by Daniel Roche, August 2005
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*! @file field/NTL/ntl-lzz_pX.h
- * @ingroup field
- * @ingroup NTL
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_field_ntl_lzz_px_H
-#define __LINBOX_field_ntl_lzz_px_H
-
-#ifndef __LINBOX_HAVE_NTL
-#error "you need NTL here"
-#endif
-
-#include <vector>
-#include <NTL/lzz_pX.h>
-
-
-#include "linbox/linbox-config.h"
-#include "linbox/util/debug.h"
-
-#include "linbox/field/unparametric.h"
-#include "linbox/field/NTL/ntl-lzz_p.h"
-#include "linbox/integer.h"
-
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-	class NTL_zz_pX_Initialiser {
-	public :
-		NTL_zz_pX_Initialiser( const Integer & q, size_t e = 1) {
-			linbox_check(e == 1);
-			if ( q > 0 )
-				NTL::zz_p::init(q); // it's an error if q not prime, e not 1
-		}
-
-		// template <class ElementInt>
-		// NTL_zz_pX_Initialiser(const ElementInt& d) {
-			// NTL::ZZ_p::init (NTL::to_ZZ(d));
-		// }
-
-		NTL_zz_pX_Initialiser () { }
-
-	};
-
-	/** Ring (in fact, a unique factorization domain) of polynomial with
-	 * coefficients in class NTL_zz_p (integers mod a wordsize prime).
-	 * All the same functions as any other ring, with the addition of:
-	 * Coeff (type), CoeffField (type), getCoeffField, setCoeff, getCoeff,
-	 * leadCoeff, deg
-	 */
-	class NTL_zz_pX :  public NTL_zz_pX_Initialiser, public FFPACK::UnparametricOperations<NTL::zz_pX> {
-	public:
-		typedef NTL::zz_pX Element ;
-		typedef FFPACK::UnparametricOperations<Element> Father_t ;
-		typedef UnparametricRandIter<Element> RandIter;
-
-
-		typedef NTL_zz_p CoeffField;
-		typedef NTL::zz_p Coeff;
-		// typedef NTL::zz_pX Element;
-
-		const Element zero,one,mOne ;
-
-
-		/** Standard LinBox field constructor.  The paramters here
-		 * (prime, exponent) are only used to initialize the coefficient field.
-		 */
-		NTL_zz_pX( const integer& p, size_t e = 1 ) :
-			// UnparametricField<NTL::zz_pX>(p, e), _CField(p,e)
-			NTL_zz_pX_Initialiser(p,e),Father_t ()
-			, zero( NTL::to_zz_pX(0)),one( NTL::to_zz_pX(1)),mOne(-one)
-			, _CField(p,e)
-		{}
-
-		/** Constructor from a coefficient field */
-		NTL_zz_pX( CoeffField cf ) :
-			NTL_zz_pX_Initialiser(cf.cardinality()),Father_t ()
-			,zero( NTL::to_zz_pX(0)),one( NTL::to_zz_pX(1)),mOne(-one)
-			,_CField(cf)
-		{}
-
-		/** Initialize p to the constant y (p = y*x^0) */
-		template <class ANY>
-		Element& init( Element& p, const ANY& y ) const
-		{
-			Coeff temp;
-			_CField.init( temp, y );
-			return p = temp;
-		}
-
-		/** Initialize p to the constant y (p = y*x^0) */
-		Element& init( Element& p, const Coeff& y ) const
-		{
-			return p = y;
-		}
-
-		/** Initialize p from a vector of coefficients.
-		 * The vector should be ordered the same way NTL does it: the front
-		 * of the vector corresponds to the trailing coefficients, and the back
-		 * of the vector corresponds to the leading coefficients.  That is,
-		 * v[i] = coefficient of x^i.
-		 */
-		template <class ANY>
-		Element& init( Element& p, const std::vector<ANY>& v ) const
-		{
-			p = 0;
-			Coeff temp;
-			for( long i = 0; i < (long)v.size(); ++i ) {
-				_CField.init( temp, v[ (size_t) i ] );
-				if( !_CField.isZero(temp) )
-					NTL::SetCoeff( p, i, temp );
-			}
-			return p;
-		}
-
-		/** Initialize p from a vector of coefficients.
-		 * The vector should be ordered the same way NTL does it: the front
-		 * of the vector corresponds to the trailing coefficients, and the back
-		 * of the vector corresponds to the leading coefficients.  That is,
-		 * v[i] = coefficient of x^i.
-		 */
-		Element& init( Element& p, const std::vector<Coeff>& v ) const
-		{
-			p = 0;
-			for( long i = 0; i < (long)v.size(); ++i )
-				NTL::SetCoeff( p, i, v[ (size_t) i ] );
-			return p;
-		}
-
-		/** Convert p to a vector of coefficients.
-		 * The vector will be ordered the same way NTL does it: the front
-		 * of the vector corresponds to the trailing coefficients, and the back
-		 * of the vector corresponds to the leading coefficients.  That is,
-		 * v[i] = coefficient of x^i.
-		 */
-		template< class ANY >
-		std::vector<ANY>& convert( std::vector<ANY>& v, const Element& p ) const
-		{
-			v.clear();
-			ANY temp;
-			for( long i = 0; i <= this->deg(p); ++i ) {
-				_CField.convert( temp, NTL::coeff( p, i ) );
-				v.push_back( temp );
-			}
-			return v;
-		}
-
-		/** Convert p to a vector of coefficients.
-		 * The vector will be ordered the same way NTL does it: the front
-		 * of the vector corresponds to the trailing coefficients, and the back
-		 * of the vector corresponds to the leading coefficients.  That is,
-		 * v[i] = coefficient of x^i.
-		 */
-		std::vector<Coeff>& convert( std::vector<Coeff>& v, const Element& p ) const
-		{
-			v.clear();
-			for( long i = 0; i <= (long)this->deg(p); ++i )
-				v.push_back( NTL::coeff(p,i) );
-			return v;
-		}
-
-		/** Test if an element equals zero */
-		bool isZero( const Element& x ) const
-		{
-			return ( (this->deg(x) == 0) &&
-				 ( _CField.isZero( NTL::ConstTerm(x) ) ) );
-		}
-
-		/** Test if an element equals one */
-		bool isOne( const Element& x ) const
-		{
-			return ( (this->deg(x) == 0) &&
-				 ( _CField.isOne( NTL::ConstTerm(x) ) ) );
-		}
-
-		/** The LinBox field for coefficients */
-		const CoeffField& getCoeffField() const
-		{ return _CField; }
-
-		/** Get the degree of a polynomial
-		 * Unlike NTL, deg(0)=0.
-		 */
-		size_t deg( const Element& p ) const
-		{
-			long temp = NTL::deg(p);
-			if( temp == -1 ) return 0;
-			else return static_cast<size_t>(temp);
-		}
-
-		/** r will be set to the reverse of p. */
-		Element& rev( Element& r, const Element& p ) {
-			NTL::reverse(r,p);
-			return r;
-		}
-
-		/** r is itself reversed. */
-		Element& revin( Element& r ) {
-			return r = NTL::reverse(r);
-		}
-
-		/** Get the leading coefficient of this polynomial. */
-		Coeff& leadCoeff( Coeff& c, const Element& p ) const
-		{
-			c = NTL::LeadCoeff(p);
-			return c;
-		}
-
-		/** Get the coefficient of x^i in a given polynomial */
-		Coeff& getCoeff( Coeff& c, const Element& p, size_t i ) const
-		{
-			c = NTL::coeff( p, (long)i );
-			return c;
-		}
-
-		/** Set the coefficient of x^i in a given polynomial */
-		Element& setCoeff( Element& p, size_t i, const Coeff& c ) const
-		{
-			NTL::SetCoeff(p,(long)i,c);
-			return p;
-		}
-
-		/** Get the quotient of two polynomials */
-		Element& quo( Element& res, const Element& a, const Element& b ) const
-		{
-			NTL::div(res,a,b);
-			return res;
-		}
-
-		/** a = quotient of a, b */
-		Element& quoin( Element& a, const Element& b ) const
-		{
-			return a /= b;
-		}
-
-		/** Get the remainder under polynomial division */
-		Element& rem( Element& res, const Element& a, const Element& b ) const
-		{
-			NTL::rem(res,a,b);
-			return res;
-		}
-
-		/** a = remainder of a,b */
-		Element& remin( Element& a, const Element& b ) const
-		{
-			return a %= b;
-		}
-
-		/** Get the quotient and remainder under polynomial division */
-		void quorem( Element& q, Element& r,
-			     const Element& a, const Element& b ) const
-		{
-			NTL::DivRem(q,r,a,b);
-		}
-
-		/** Get characteristic of the field - same as characteristic of
-		 * coefficient field. */
-		integer& characteristic( integer& c ) const
-		{ return _CField.characteristic(c); }
-
-		/** Get the cardinality of the field.  Since the cardinality is
-		 * infinite, by convention we return -1.
-		 */
-		integer& cardinality( integer& c ) const
-		{ return c = static_cast<integer>(-1); }
-
-		static inline integer getMaxModulus()
-		{ return CoeffField::getMaxModulus(); }
-		/** Write a description of the field */
-		// Oustide of class definition so write(ostream&,const Element&) from
-		// UnparametricField still works.
-		std::ostream& write( std::ostream& os ) const
-		{
-			return os << "Polynomial ring using NTL::zz_pX";
-		}
-
-	private:
-		/** Conversion to scalar types doesn't make sense and should not be
-		 * used.  Use getCoeff or leadCoeff to get the scalar values of
-		 * specific coefficients, and then convert them using coeffField()
-		 * if needed.
-		 */
-		template< class ANY >
-		ANY& convert( ANY& x, const Element& y ) const
-		{ return x; }
-
-		CoeffField _CField;
-	}; // end of class NTL_zz_pX
-
-
-
-} // end of namespace LinBox
-
-#endif // __LINBOX_field_ntl_lzz_px_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/PID-double.h b/linbox/field/PID-double.h
deleted file mode 100644
index 790f126..0000000
--- a/linbox/field/PID-double.h
+++ /dev/null
@@ -1,347 +0,0 @@
-/* linbox/field/PID-double.h
- * Copyright (C) 2004 Pascal Giorgi
- *
- * Written by :
- *               Pascal Giorgi  pascal.giorgi at ens-lyon.fr
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-
-/*!  @file field/PID-double.h
- * @ingroup field
- * @brief NO DOC
- */
-
-#ifndef __LINBOX_pid_double_H
-#define __LINBOX_pid_double_H
-
-#include "linbox/field/unparametric.h"
-#include "linbox/field/field-traits.h"
-
-namespace LinBox
-{
-
-
-	/*! \ingroup integers
-	 * @brief NO DOC
-	 */
-	class PID_double : public UnparametricField<double> {
-
-	public:
-
-		typedef double Element;
-
-		/// test if unit (1 or -1)
-		inline static bool isUnit (const Element& x)
-		{
-
-			return (x == double(1))  || (x== double(-1));
-		}
-
-		/// return absolute value
-		inline static Element& abs (Element& x, const Element& a)
-		{
-			x= (a>0)? a: -a;
-			return x;
-		}
-
-		/// return absolute value
-		inline static Element abs (const Element& a)
-		{
-			return (a>0)? a: -a;
-		}
-
-		/** compare two elements, a and b.
-		 * return 1, if a > b
-		 * return 0, if a = b;
-		 * return -1. if a < b
-		 */
-		inline long compare (const Element& a, const Element& b) const
-		{
-
-			return (a>b)? 1: ((a<b)? -1 : 0);
-		}
-
-
-		/** @brief gcd (g, a, b).
-		 *  return g = gcd (a, b)
-		 */
-		inline static Element& gcd (Element& g, const Element& a, const Element& b)
-		{
-
-			double  u, v, q, r;
-			u = a; v = b;
-
-			if (u < 0) {
-				u = -u;
-			}
-
-			if (v < 0) {
-				v = -v;
-			}
-
-			while (v != 0) {
-				q = floor(u/v);
-				r = u -q*v;
-				u = v;
-				v = r;
-			}
-
-			g = u;
-
-			return g;
-		}
-
-		/** @brief gcding (g, b).
-		 *  return g = gcd (g, b)
-		 */
-		inline static Element& gcdin (Element& g, const Element& b)
-		{
-
-			gcd(g, g, b);
-
-			return g;
-		}
-
-		/** @brief xgcd (g, s, t, a, b)
-		 *  g = gcd(a, b) = a*s + b*t.
-		 *  The coefficients s and t are defined according to the standard
-		 *  Euclidean algorithm applied to |a| and |b|, with the signs then
-		 *  adjusted according to the signs of a and b.
-		 */
-		inline static Element& xgcd (Element& g, Element& s, Element& t, const Element& a, const Element& b)
-		{
-			double  u, v, u0, v0, u1, v1, u2, v2, q, r;
-
-			int aneg = 0, bneg = 0;
-			u = a; v = b;
-			if (u < 0) {
-				u = -u;
-				aneg = 1;
-			}
-
-			if (v < 0) {
-				v = -v;
-				bneg = 1;
-			}
-
-			u1 = 1; v1 = 0;
-			u2 = 0; v2 = 1;
-
-
-			while (v != 0) {
-				q = floor(u / v);
-				r = u -q*v;
-				u = v;
-				v = r;
-				u0 = u2;
-				v0 = v2;
-				u2 =  u1 - q*u2;
-				v2 = v1- q*v2;
-				u1 = u0;
-				v1 = v0;
-			}
-
-			if (aneg)
-				u1 = -u1;
-
-			if (bneg)
-				v1 = -v1;
-
-			g = u;
-			s = u1;
-			t = v1;
-
-			return g;
-		}
-
-		/** @brief lcm (c, a, b)
-		 *  c = lcm (a, b)
-		 */
-		inline static Element& lcm (Element& c, const Element& a, const Element& b)
-		{
-
-			if ((a==0.) || (b==0.)) return c = 0.;
-
-			else {
-				Element g;
-
-				gcd (g, a, b);
-
-				c= a*b;
-				c /= g;
-
-				if (c<0) c = -c; //no abs for double, dpritcha
-				// c=abs (c);
-
-				return c;
-			}
-		}
-
-		/** @brief lcmin (l, b)
-		 *  l = lcm (l, b)
-		 */
-		inline static Element& lcmin (Element& l, const Element& b)
-		{
-
-			if ((l==0.) || (b==0.)) return l = 0.;
-
-			else {
-				Element g;
-
-				gcd (g, l, b);
-
-				l*= b;
-				l/= g;
-
-				//l=abs (l);
-				if (l < 0) l = -l;
-				return l;
-			}
-
-		}
-
-
-		inline static long reconstructRational (Element& a, Element& b, const Element& x, const Element& m,
-							const Element& a_bound, const Element& b_bound)
-		{
-
-			double  u, v, u0, u1, u2, q, r;
-
-			u1 = 0;
-			u2 = 1;
-			u = m; v = x;
-
-			while ((v != 0) && ( v > a_bound)) {
-				q = floor(u / v);
-				r = u -q*v;
-				u = v;
-				v = r;
-				u0 = u2;
-				u2 =  u1 - q*u2;
-				u1 = u0;
-			}
-
-			if (u2 < 0.) { u2= -u2; v=-v;}
-			a = v;
-			b = u2;
-
-			return  (b > b_bound)? 0: 1;
-
-		}
-
-
-		/** @brief quo (q, x, y)
-		 *  q = floor (x/y);
-		 */
-		inline static Element& quo (Element& q, const Element& a, const Element& b)
-		{
-			return  q = floor (a/b);
-		}
-
-		/** @brief rem (r, a, b)
-		 *  r = remindar of  a / b
-		 */
-		inline static Element& rem (Element& r, const Element& a, const Element& b)
-		{
-			Element q;
-			return r= a - quo(q,a,b)*b  ;
-		}
-
-		/** @brief quoin (a, b)
-		 *  a = quotient (a, b)
-		 */
-		inline static Element& quoin (Element& a, const Element& b)
-		{
-			return quo(a,a,b);
-		}
-
-		/** @brief quoin (a, b)
-		 *  a = quotient (a, b)
-		 */
-		inline static Element& remin (Element& a, const Element& b)
-		{
-			return rem(a,a,b);
-		}
-
-
-		/** @brief quoRem (q, r, a, b)
-		 * q = [a/b], r = a - b*q
-		 * |r| < |b|, and if r != 0, sign(r) = sign(b)
-		 */
-		inline static void quoRem (Element& q, Element& r, const Element& a, const Element& b)
-		{
-			quo(q,a,b);
-			r = a - q*b;
-		}
-
-		/** @brief isDivisor (a, b)
-		 *  Test if a | b.
-		 */
-		inline static bool isDivisor (const Element& a, const Element& b)
-		{
-			double r;
-			return rem(r,a,b)==0.;
-		}
-
-		// some specializations and conversions
-		double& convert(double& x, const Element& y) const
-		{
-			return x=y;
-		}
-
-		Element& init(Element& x, const double& y) const
-		{
-			return x=y;
-		}
-
-		integer& convert(integer& x, const Element& y) const
-		{
-			return x=(integer)y;
-		}
-
-		Element& init(Element& x, const integer& y) const
-		{
-			return x=(double)y;
-		}
-
-
-	}; //end of class PID_double
-
-	template<>
-	std::ostream &UnparametricField<double>::write (std::ostream &os) const
-	{
-		return os << "unparam<double>";
-	}
-
-} //end of namespace LinBox
-#endif //__LINBOX_pid_double_H
-
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/PID-integer.h b/linbox/field/PID-integer.h
deleted file mode 100644
index 19262c5..0000000
--- a/linbox/field/PID-integer.h
+++ /dev/null
@@ -1,576 +0,0 @@
-/* linbox/field/PID-integer.h
- * Copyright (C) 2004 Pascal Giorgi
- *
- * Written by :
- *               Pascal Giorgi  pascal.giorgi at ens-lyon.fr
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/** @file field/PID-integer.h
- * @ingroup field
- * @brief NO DOC
-*/
-
-#ifndef __LINBOX_pid_integer_H
-#define __LINBOX_pid_integer_H
-
-#include <limits.h>
-#include <iostream>
-// #include <gmp++/gmp++_int.h>
-#include "linbox/integer.h"
-#include "linbox/field/unparametric.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/field/gmp-rational.h"
-
-
-namespace LinBox
-{
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	/*! \ingroup integers
-	 * @brief Domain for integer operations.
-	 */
-	class PID_integer : public LinBox::UnparametricField<integer>
-	{
-
-	public:
-
-		//PID_integer(){}
-		//PID_integer& operator=(PID_integer& K) { return *this; }
-
-		typedef integer Element;
-
-		/// axpyin
-		inline Element& axpyin (integer &r, const integer& a, const integer& x) const
-		{
-			return Integer::axpyin(r,a,x);
-		}
-
-		/// axmyin
-		inline Element& axmyin (integer &r, const integer& a, const integer& x) const
-		{
-			return Integer::axmyin(r,a,x);
-		}
-
-		/// maxpyin
-		inline Element& maxpyin (integer &r, const integer& a, const integer& x) const
-		{
-			// return Integer::maxpyin(r,a,x);
-			return Integer::axpyin(r,-a,x);
-		}
-
-		/// axpy
-		inline Element& axpy (integer &r, const integer& a, const integer& x, const integer& y) const
-		{
-			return Integer::axpy(r,a,x,y);//r = ax+y
-		}
-
-		/// isUnit
-		inline  bool isUnit (const Element& x) const
-		{
-
-			return (x == Element(1))  || (x== Element(-1));
-		}
-
-		/// abs
-		inline  Element& abs(Element& x, const Element& a) const
-		{
-			x= (a>0)? a: -a;
-			return x;
-		}
-
-		/// abs
-		inline  Element abs(const Element& a) const
-		{
-			return (a>0)? a: -a;
-		}
-
-		/** compare two elements, a and b.
-		 * return 1, if a > b
-		 * return 0, if a = b;
-		 * return -1. if a < b
-		 */
-		inline long compare (const Element& a, const Element& b) const
-		{
-
-			return (a>b)? 1: ((a<b)? -1 : 0);
-		}
-
-		/** @brief gcd (g, a, b)
-		 *  return g = gcd (a, b)
-		 */
-		inline  Element& gcd (Element& g, const Element& a, const Element& b) const
-		{
-			return Givaro::gcd(g,a,b);
-		}
-
-		/** @brief gcdin(g, b)
-		 *  return g = gcd (g, b)
-		 */
-		inline  Element& gcdin (Element& g, const Element& b) const
-		{
-			gcd(g, g, b);
-			return g;
-		}
-
-		/** @brief xgcd (g, s, t, a, b)
-		 *  g = gcd(a, b) = a*s + b*t.
-		 *  The coefficients s and t are defined according to the standard
-		 *  Euclidean algorithm applied to |a| and |b|, with the signs then
-		 *  adjusted according to the signs of a and b.
-		 */
-		inline  Element& xgcd (Element& g, Element& s, Element& t, const Element& a, const Element& b) const
-		{
-#if (GIVARO_VERSION < 30500) // newer givaro has gcd with constant signature "guvab"
-			return Givaro::gcd(g,a,b,s,t);
-#else
-			return Givaro::gcd(g,s,t,a,b);
-#endif
-		}
-
-		/** @brief lcm (c, a, b)
-		 *  c = lcm (a, b)
-		 */
-		inline  Element& lcm (Element& c, const Element& a, const Element& b) const
-		{
-
-			if ((a==Element(0)) || (b==Element(0))) return c = Element(0);
-
-			else {
-				Element g;
-				gcd (g, a, b);
-				c= a*b;
-				c /= g;
-				c=abs (c);
-				return c;
-			}
-		}
-
-		/** @brief lcmin (l, b)
-		 *  l = lcm (l, b)
-		 */
-		inline  Element& lcmin (Element& l, const Element& b) const
-		{
-
-			if ((l==Element(0)) || (b==Element(0))) return l = Element(0);
-
-			else {
-				Element g;
-				gcd (g, l, b);
-				l*= b;
-				l/= g;
-				l=abs (l);
-				return l;
-			}
-		}
-
-		inline  void reconstructRational (Element& a, Element& b, const Element& x, const Element& m) const
-		{
-			RationalReconstruction(a,b, x, m, Givaro::sqrt(m), true, true);
-		}
-
-		inline  void reconstructRational (Element& a, Element& b, const Element& x, const Element& m, const Element& bound) const
-		{
-			RationalReconstruction(a,b, x, m, bound, true, true);
-		}
-
-		inline  long reconstructRational (Element& a, Element& b,
-						  const Element& x, const Element& m,
-						  const Element& a_bound, const Element& b_bound) const
-		{
-			Element bound = x/b_bound;
-			// if (bound>a_bound) std::cerr << "a_bound: " << a_bound << ", x/b_bound: " << bound << std::endl;
-
-			RationalReconstruction(a,b,x,m, (bound>a_bound?bound:a_bound), true, false);
-			return  (b > b_bound)? 0: 1;
-		}
-
-
-
-		/** @brief quo (q, x, y)
-		 *  q = floor (x/y);
-		 */
-		inline  Element& quo (Element& q, const Element& a, const Element& b) const
-		{
-			return  q = a/b;
-		}
-
-		/** @brief rem (r, a, b)
-		 *  r = remindar of  a / b
-		 */
-		inline  Element& rem (Element& r, const Element& a, const Element& b)  const
-		{
-			return Integer::mod(r,a,b);
-		}
-
-		/** @brief quoin (a, b)
-		 *  a = quotient (a, b)
-		 */
-		inline  Element& quoin (Element& a, const Element& b)  const
-		{
-			return quo(a,a,b);
-		}
-
-		/** @brief quoin (a, b)
-		 *  a = quotient (a, b)
-		 */
-		inline  Element& remin (Element& a, const Element& b)  const
-		{
-			return rem(a,a,b);
-		}
-
-
-		/** @brief quoRem (q, r, a, b)
-		 * q = [a/b], r = a - b*q
-		 * |r| < |b|, and if r != 0, sign(r) = sign(b)
-		 */
-		inline  void quoRem (Element& q, Element& r, const Element& a, const Element& b) const
-		{
-			quo(q,a,b);
-			r = a - q*b;
-		}
-
-		/** @brief isDivisor (a, b)
-		 *  Test if b | a.
-		 */
-		inline  bool isDivisor (const Element& a, const Element& b) const
-		{
-			Element r;
-			return rem(r,a,b)==Element(0);
-		}
-
-		/** @brief sqrt(x,y)
-		 *  x=floor(sqrt(y))
-		 */
-		inline Element& sqrt(Element& x, const Element& y) const
-		{
-			return Givaro::sqrt(x,y);
-		}
-
-		inline  Element powtwo(Element& z, const Element& x) const
-		{
-			z = 1;
-			if (x < 0) return z;
-			if (x < ULONG_MAX) {
-				z<<=(unsigned long int)x;
-				//cout << "z"<< z;
-				return z;
-			}
-			else {
-				Element n,m;
-				quoRem(n,m,x,(Element)(LONG_MAX-1));
-				for (int i=0; i < n; ++i) {
-					z <<=(long int)(LONG_MAX-1);
-				}
-				z <= (long int)m;
-				return z;
-			}
-
-			//for (Element i=0; i < x; ++i) {
-			//      z <<= 1;
-			//}
-			//return z; // BB peut pas !
-		}
-
-		inline  Element logtwo(Element& z, const Element& x) const
-		{
-			z = x.bitsize()-1;
-			return z;
-			/*
-			   if (x<1) return z=-1;
-			   z = 0;
-			   Element cur = x;
-			   cur >>=1;//cout << "cur" << cur;
-			   while (cur > 0) {
-			//cout << "cur" << cur;
-			++z;
-			cur >>=1;
-			}
-			//cout << "z" << z;
-			return z;
-			*/
-		}
-
-
-
-		// some specializations and conversions
-		inline double& convert(double& x, const Element& y) const
-		{
-			return x= (double)y;
-		}
-
-		inline Element& init(Element& x, const double& y) const
-		{
-			return x=Element(y);
-		}
-
-		inline Element& init(Element& x, const unsigned long& y) const
-		{
-			return x=Element(y);
-		}
-
-		inline Element& init(Element& x, const long& y) const
-		{
-			return x=Element(y);
-		}
-
-		inline Element& init(Element& x, const unsigned int & y) const
-		{
-			return x=Element(y);
-		}
-
-		inline Element& init(Element& x, const int& y) const
-		{
-			return x=Element(y);
-		}
-
-
-
-		inline integer& convert(integer& x, const Element& y) const
-		{
-			return x=y;
-		}
-
-		inline Element& init(Element& x, const integer& y = 0) const
-		{
-			return x=y;
-		}
-		/*
-		 * aniau at astronet.pl 06/2009 initialization form GMPRationalElement
-		 */
-		inline Element& init(Element& x, const GMPRationalElement& q) const
-		{
-			GMPRationalField Q;
-			return Q.convert(x,q);
-		}
-
-		inline std::ostream &write (std::ostream &os) const
-		{
-			return os << "PID_integer extends unparam<integer>";
-		}
-
-		inline std::ostream &write (std::ostream &os, const Integer& I) const
-		{
-			return os << I;
-		}
-
-	protected:
-		/*! Rational number reconstruction.
-		* \f$\frac{n}{d} \equiv f \mod m\f$, with \f$\vert n
-		 \vert <k\f$ and \f$0 < \vert d \vert \leq \frac{f}{k}\f$.
-		* @bib
-		* - von zur Gathen & Gerhard, <i>Modern Computer Algebra</i>,
-		*      5.10, Cambridge Univ. Press 1999
-		*/
-		inline void RationalReconstruction( Element& a, Element& b,
-						    const Element& f, const Element& m,
-						    const Element& k,
-						    bool reduce, bool recursive ) const
-		{
-			Element x(f);
-			if (x<0) {
-				if ((-x)>m)
-					x %= m;
-				if (x<0)
-					x += m;
-			}
-			else {
-				if (x>m)
-					x %= m;
-			}
-
-			if (x == 0) {
-				a = 0;
-				b = 1;
-			}
-			else {
-				bool res = ratrecon(a,b,x,m,k, reduce, recursive);
-				if (recursive)
-					for( Element newk = k + 1; (!res) && (newk<f) ; ++newk)
-						res = ratrecon(a,b,x,m,newk,reduce, true);
-			}
-		}
-
-		// Precondition f is suppposed strictly positive and strictly less than m
-		inline  bool ratrecon( Element& num, Element& den,
-				       const Element& f, const Element& m,
-				       const Element& k,
-				       bool reduce, bool recursive ) const
-		{
-
-			//std::cerr << "RatRecon : " << f << " " << m << " " << k << std::endl;
-			Element  r0, t0, q, u;
-			r0=m;
-			t0=0;
-			num=f;
-			den=1;
-			while(num>=k)
-			{
-				q = r0;
-				q /= num;   // r0/num
-				u = num;
-				num = r0;  	// num <-- r0
-				r0 = u;	// r0 <-- num
-				maxpyin(num,u,q);
-				//Integer::maxpyin(num,u,q);
-				if (num == 0) return false;
-
-				u = den;
-				den = t0;  	// num <-- r0
-				t0 = u;	// r0 <-- num
-				maxpyin(den,u,q);
-				//Integer::maxpyin(den,u,q);
-			}
-
-			if (reduce) {
-				// [GG, MCA, 1999] Theorem 5.26
-
-				// (ii)
-				Element gg;
-				if (gcd(gg,num,den) != 1) {
-
-					Element ganum, gar2;
-					for( q = 1, ganum = r0-num, gar2 = r0 ; (ganum < k) && (gar2>=k); ++q ) {
-						ganum -= num;
-						gar2 -= num;
-					}
-
-					maxpyin(r0,q,num);
-					//Integer::maxpyin(r0,q,num);
-					maxpyin(t0,q,den);
-					//Integer::maxpyin(t0,q,den);
-
-					if (t0 < 0) {
-						num = -r0;
-						den = -t0;
-					}
-					else {
-						num = r0;
-						den = t0;
-					}
-
-					// if (t0 > m/k)
-					if (den > m/k) {
-						if (!recursive)
-							std::cerr
-							<< "*** Error *** No rational reconstruction of "
-							<< f
-							<< " modulo "
-							<< m
-							<< " with denominator <= "
-							<< (m/k)
-							<< std::endl;
-					}
-					if (gcd(gg,num,den) != 1) {
-						if (!recursive)
-							std::cerr
-							<< "*** Error *** There exists no rational reconstruction of "
-							<< f
-							<< " modulo "
-							<< m
-							<< " with |numerator| < "
-							<< k
-							<< std::endl
-							<< "*** Error *** But "
-							<< num
-							<< " = "
-							<< den
-							<< " * "
-							<< f
-							<< " modulo "
-							<< m
-							<< std::endl;
-						return false;
-					}
-				}
-			}
-			// (i)
-			if (den < 0) {
-				Integer::negin(num);
-				Integer::negin(den);
-			}
-
-			// std::cerr << "RatRecon End " << num << "/" << den << std::endl;
-			return true;
-		}
-
-	}; //end of class PID_integer
-
-	template<>
-	struct ClassifyRing<PID_integer> {
-		typedef RingCategories::IntegerTag categoryTag;
-	};
-
-
-#if 0 // Specialization for Homomorphism
-	template <class _Target>
-	class Hom<PID_integer, _Target>
-	{
-	public:
-		typedef PID_integer Source;
-		typedef _Target Target;
-		typedef typename Source::Element SrcElt;
-		typedef typename Target::Element Elt;
-
-		Hom(const Source& S, const Target& T) :
-			_source (S), _target(T)
-		{}
-
-		Elt& image(Elt& t, const SrcElt& s) {
-			if  (s.bitsize() > 52 )
-				_target.init(t,s);
-			else
-				_target.init(t, (double)s);
-			return t;
-		}
-
-		SrcElt& preimage(SrcElt& s, const Elt& t) {
-			_source.convert(s,t);
-			return s;
-		}
-
-		const Source& source() { return _source;}
-
-		const Target& target() { return _target;}
-
-	protected:
-		double tmp;
-		Source _source;
-		Target _target;
-
-	};
-
-#endif
-} //end of namespace LinBox
-
-#endif //__LINBOX_pid_integer_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/PID-ntl-zz_p.h b/linbox/field/PID-ntl-zz_p.h
deleted file mode 100644
index e48429d..0000000
--- a/linbox/field/PID-ntl-zz_p.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Copyright (C) 2010 LinBox
- * written by bds
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-
-#ifndef __LINBOX_ntl_pid_zz_p_H
-#define __LINBOX_ntl_pid_zz_p_H
-
-#include "linbox/field/NTL/ntl-lzz_p.h"
-#include "linbox/util/debug.h"
-#include "linbox/linbox-config.h"
-#include <NTL/ZZ.h>
-#include "linbox/field/field-traits.h"
-
-// Namespace in which all LinBox library code resides
-namespace LinBox
-{
-	template <class Ring>
-	struct ClassifyRing;
-
-	class NTL_PID_zz_p;
-
-	template<>
-	struct ClassifyRing<NTL_PID_zz_p> {
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-	/** \brief extend Wrapper of zz_p from NTL.  Add PID functions
-	  \ingroup field
-	  */
-	struct NTL_PID_zz_p: public NTL_zz_p
-	{
-	protected: long _modulus;
-	public:
-		   NTL_PID_zz_p(long pp, int exp = 1) :
-			   NTL_zz_p(pp), _modulus(pp)
-		{
-			if( exp != 1 ) throw PreconditionFailed(__func__,__FILE__,__LINE__,"exponent must be 1");
-		}
-
-		   Element& gcd(Element& g, const Element& a, const Element& b) const
-		   {   g = NTL::GCD(NTL::rep(a), NTL::rep(b));
-			   g = NTL::GCD(NTL::rep(g), _modulus);
-			   return g;
-		   }
-
-		   Element& gcdin(Element& a, const Element& b) const
-		   {   return gcd(a,a, b);  }
-
-		   bool isUnit(const Element& a) const
-		   {   return 1 == NTL::GCD(NTL::rep(a), _modulus);  }
-
-		   Element& div(Element& c, const Element& a, const Element& b) const
-		   {   return c = NTL::rep(a)/NTL::GCD(NTL::rep(a),NTL::rep(b));   }
-		   Element& divin(Element& a, const Element& b) const
-		   {   return div(a, a, b);   }
-
-		   static inline double getMaxModulus() { return (double)NTL_SP_BOUND; }
-	};
-
-} // namespace LinBox
-
-#endif // __LINBOX_ntl_pid_zz_p_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/PIR-modular-int32.h b/linbox/field/PIR-modular-int32.h
deleted file mode 100644
index ae1168a..0000000
--- a/linbox/field/PIR-modular-int32.h
+++ /dev/null
@@ -1,700 +0,0 @@
-/* Copyright (C) 2010 LinBox
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-
-#ifndef __LINBOX_pir_modular_int32_H
-#define __LINBOX_pir_modular_int32_H
-
-#include "linbox/field/modular.h"
-#ifndef LINBOX_MAX_INT
-#define LINBOX_MAX_INT 2147483647
-#endif
-
-#ifndef LINBOX_MAX_MODULUS
-#define LINBOX_MAX_MODULUS 1073741824
-#endif
-#include "linbox/field/field-traits.h"
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-
-	template< class Element>
-	class PIRModular;
-
-	template< class Element >
-	class ModularRandIter;
-
-	template<class Field>
-	class DotProductDomain;
-
-	template<class Field>
-	class FieldAXPY;
-
-	template<class Field>
-	class MVProductDomain;
-
-	template <class Ring>
-	struct ClassifyRIng;
-
-	template <class Element>
-	struct ClassifyRIng<PIRModular<Element> >;
-
-	template <>
-	struct ClassifyRIng<PIRModular<int32_t> >  {
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-	/// \ingroup ring
-	template <>
-	class PIRModular<int32_t> : public Modular<int32_t> {
-
-	public:
-
-		friend class FieldAXPY<PIRModular<int32_t> >;
-
-		friend class DotProductDomain<PIRModular<int32_t> >;
-
-		friend class MVProductDomain<PIRModular<int32_t> >;
-
-		typedef int32_t Element;
-
-		typedef ModularRandIter<int32_t> RandIter;
-
-		//default modular field,taking 65521 as default modulus
-		PIRModular () :
-			Modular<int32_t>(65521)
-		{
-		}
-
-		PIRModular (int32_t value, int32_t exp = 1) :
-			Modular<int32_t>(value,exp)
-		{ }
-
-
-		/** PIR functions, gcd, xgcd, dxgcd */
-
-		Element& gcd (Element& g, const Element& a, const Element& b) const
-		{
-
-			GCD (g, a, b);
-
-			return g;
-
-		}
-
-		Element& xgcd (Element& g, Element& s, Element& t, const Element& a, const Element& b) const
-		{
-
-			XGCD (g, s, t, a, b);
-
-			if (s < 0)
-				s += modulus;
-
-			if (t < 0)
-				t += modulus;
-
-
-			return g;
-		}
-
-		Element& dxgcd (Element& g, Element& s, Element& t, Element& a1, Element& b1,
-				const Element& a, const Element& b) const
-		{
-
-
-			xgcd (g, s, t, a, b);
-
-			if (g != 0) {
-
-				a1 = a / g;
-
-				b1 = b / g;
-			}
-
-			else {
-
-				a1 = s;
-
-				b1 = t;
-			}
-
-
-			return g;
-
-		}
-
-		bool isDivisor (const Element& a, const Element& b) const
-		{
-
-			Element g;
-
-			if (a == 0) return false;
-
-			else if (b == 0) return true;
-
-			else {
-
-				gcd (g, a, modulus);
-
-				return (b % g) == 0;
-			}
-
-		}
-
-		Element& div (Element& d, const Element& a, const Element& b) const
-		{
-
-			Element g, s;
-
-			HXGCD (g, s, b, modulus);
-
-			Element r;
-
-			r = a % g;
-
-			if (r != 0) throw PreconditionFailed(__func__,__FILE__,__LINE__,"Div: not dividable");
-
-			else {
-
-				d = a / g;
-
-				mulin (d, s);
-			}
-
-			return d;
-
-		}
-
-		Element& normal (Element& a, const Element& b) const
-		{
-
-			if (b == 0) return a = 0;
-			else {
-				GCD (a, b, modulus);
-
-				return a;
-			}
-		}
-
-
-		Element& gcdin (Element& a, const Element& b) const
-		{
-
-			GCD (a, a, b);
-
-
-			return a;
-		}
-
-		Element& normalIn (Element& a) const
-		{
-			if (a == 0) return a;
-			else {
-				GCD (a, a, modulus);
-
-				return a;
-			}
-
-		}
-
-
-		Element& divin (Element& a, const Element& b) const
-		{
-
-			div (a, a, b);
-
-			return a;
-		}
-
-
-		bool isUnit(const Element& a) const
-		{
-
-			Element g;
-
-			GCD (g, a, modulus);
-
-
-			//	std::cout << a << " is a unit or not " << g;
-
-			//		std::cout << "modulus = " << modulus <<"\n";
-
-			return g == 1;
-
-		}
-
-	private:
-		static void GCD (int32_t& g, int32_t a, int32_t b) {
-
-			int32_t  u, v, /*  q,*/ r;
-
-			if (a < 0) {
-				if (a < -LINBOX_MAX_INT) throw PreconditionFailed(__func__,__FILE__,__LINE__,"XGCD: integer overflow");
-				a = -a;
-
-			}
-
-			if (b < 0) {
-				if (b < -LINBOX_MAX_INT) throw PreconditionFailed(__func__,__FILE__,__LINE__,"XGCD: integer overflow");
-				b = -b;
-			}
-
-			u = a; v = b;
-
-			while (v != 0) {
-				// q = u / v;
-				r = u % v;
-				u = v;
-				v = r;
-			}
-
-			g = u;
-
-		}
-
-		static void XGCD(int32_t& d, int32_t& s, int32_t& t, int32_t a, int32_t b) {
-			int32_t  u, v, u0, v0, u1, v1, u2, v2, q, r;
-
-			int32_t aneg = 0, bneg = 0;
-
-			if (a < 0) {
-				if (a < -LINBOX_MAX_INT) throw PreconditionFailed(__func__,__FILE__,__LINE__,"XGCD: integer overflow");
-				a = -a;
-				aneg = 1;
-			}
-
-			if (b < 0) {
-				if (b < -LINBOX_MAX_INT) throw PreconditionFailed(__func__,__FILE__,__LINE__,"XGCD: integer overflow");
-				b = -b;
-				bneg = 1;
-			}
-
-			u1 = 1; v1 = 0;
-			u2 = 0; v2 = 1;
-			u = a; v = b;
-
-			while (v != 0) {
-				q = u / v;
-				r = u % v;
-				u = v;
-				v = r;
-				u0 = u2;
-				v0 = v2;
-				u2 =  u1 - q*u2;
-				v2 = v1- q*v2;
-				u1 = u0;
-				v1 = v0;
-			}
-
-			if (aneg)
-				u1 = -u1;
-
-			if (bneg)
-				v1 = -v1;
-
-			d = u;
-			s = u1;
-			t = v1;
-		}
-
-
-		static void HXGCD (int32_t& d, int32_t& s, int32_t a, int32_t b) {
-
-			int32_t  u, v, u0, u1, u2, q, r;
-
-			int32_t aneg = 0;
-
-			if (a < 0) {
-				if (a < -LINBOX_MAX_INT) throw PreconditionFailed(__func__,__FILE__,__LINE__,"XGCD: integer overflow");
-				a = -a;
-				aneg = 1;
-			}
-
-			if (b < 0) {
-				if (b < -LINBOX_MAX_INT) throw PreconditionFailed(__func__,__FILE__,__LINE__,"XGCD: integer overflow");
-				b = -b;
-			}
-
-			u1 = 1;
-			u2 = 0;
-			u = a; v = b;
-
-			while (v != 0) {
-				q = u / v;
-				r = u % v;
-				u = v;
-				v = r;
-				u0 = u2;
-
-				u2 =  u1 - q*u2;
-
-				u1 = u0;
-
-			}
-
-			if (aneg)
-				u1 = -u1;
-
-
-			d = u;
-			s = u1;
-
-		}
-
-	};
-
-	template <>
-	class FieldAXPY<PIRModular<int32_t> > {
-	public:
-
-		typedef int32_t Element;
-		typedef PIRModular<int32_t> Field;
-
-		FieldAXPY (const Field &F) :
-			_field (F),_y(0)
-		{}
-
-
-		FieldAXPY (const FieldAXPY &faxpy) :
-			_field (faxpy._field), _y (0)
-		{}
-
-		FieldAXPY<PIRModular<int32_t> > &operator = (const FieldAXPY &faxpy) {
-			_field = faxpy._field;
-			_y = faxpy._y;
-			return *this;
-		}
-
-		inline uint64_t& mulacc (const Element &a, const Element &x) {
-			uint64_t t = (uint64_t) a * (uint64_t) x;
-			_y += t;
-			if (_y < t)
-				return _y += _field._two64;
-			else
-				return _y;
-		}
-
-		inline uint64_t& accumulate (const Element &t) {
-			_y += t;
-			if (_y < (uint64_t)t)
-				return _y += _field._two64;
-			else
-				return _y;
-		}
-
-		inline Element& get (Element &y) {
-			y = Element(_y % (uint64_t) _field.modulus);
-			return y;
-		}
-
-		inline FieldAXPY &assign (const Element y) {
-			_y = y;
-			return *this;
-		}
-
-		inline void reset() {
-			_y = 0;
-		}
-
-
-	protected:
-		Field _field;
-		uint64_t _y;
-	};
-
-
-	template <>
-	class DotProductDomain<PIRModular<int32_t> > : public virtual VectorDomainBase<PIRModular<int32_t> > {
-
-	public:
-		typedef int32_t Element;
-		DotProductDomain (const PIRModular<int32_t> &F) :
-			VectorDomainBase<PIRModular<int32_t> > (F)
-		{}
-
-
-	protected:
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-
-			typename Vector1::const_iterator i;
-			typename Vector2::const_iterator j;
-
-			uint64_t y = 0;
-			uint64_t t;
-
-			for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j) {
-				t = ( (uint64_t) *i ) * ( (uint64_t) *j );
-				y += t;
-
-				if (y < t)
-					y += _field._two64;
-			}
-
-			y %= (uint64_t) _field.modulus;
-			return res = Element(y);
-
-		}
-
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-			typename Vector1::first_type::const_iterator i_idx;
-			typename Vector1::second_type::const_iterator i_elt;
-
-			uint64_t y = 0;
-			uint64_t t;
-
-			for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt) {
-				t = ( (uint64_t) *i_elt ) * ( (uint64_t) v2[*i_idx] );
-				y += t;
-
-				if (y < t)
-					y += _field._two64;
-			}
-
-
-			y %= (uint64_t) _field.modulus;
-
-			return res = (Element)y;
-		}
-	};
-
-
-	// Specialization of MVProductDomain for int32_t modular field
-	template <>
-	class MVProductDomain<PIRModular<int32_t> > {
-	public:
-
-		typedef int32_t Element;
-
-	protected:
-		template <class Vector1, class Matrix, class Vector2>
-		inline Vector1 &mulColDense
-		(const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
-		{
-			return mulColDenseSpecialized
-			(VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
-		}
-
-	private:
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::DenseVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseSequenceVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseAssociativeVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseParallelVectorTag) const;
-
-		mutable std::vector<uint64_t> _tmp;
-	};
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<PIRModular<int32_t> >::mulColDenseSpecialized
-	(const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::DenseVectorTag) const
-	{
-
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::const_iterator k;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i) {
-			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
-				t = ((uint64_t) *k) * ((uint64_t) *j);
-
-				*l += t;
-
-				if (*l < t)
-					*l += VD.field ()._two64;
-			}
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l % VD.field ().modulus;
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<PIRModular<int32_t> >::mulColDenseSpecialized
-	(const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseSequenceVectorTag) const
-	{
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::const_iterator k;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i) {
-			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
-				t = ((uint64_t) k->second) * ((uint64_t) *j);
-
-				_tmp[k->first] += t;
-
-				if (_tmp[k->first] < t)
-					_tmp[k->first] += VD.field ()._two64;
-			}
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l % VD.field ().modulus;
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<PIRModular<int32_t> >::mulColDenseSpecialized
-	(const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseAssociativeVectorTag) const
-	{
-
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::const_iterator k;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i) {
-			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
-				t = ((uint64_t) k->second) * ((uint64_t) *j);
-
-				_tmp[k->first] += t;
-
-				if (_tmp[k->first] < t)
-					_tmp[k->first] += VD.field ()._two64;
-			}
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l % VD.field ().modulus;
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<PIRModular<int32_t> >::mulColDenseSpecialized
-	(const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseParallelVectorTag) const
-	{
-
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::first_type::const_iterator k_idx;
-		typename Matrix::Column::second_type::const_iterator k_elt;
-		std::vector<uint64_t>::iterator l;
-
-		uint64_t t;
-
-		if (_tmp.size () < w.size ())
-			_tmp.resize (w.size ());
-
-		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
-
-		for (j = v.begin (); j != v.end (); ++j, ++i) {
-			for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
-			     k_idx != i->first.end ();
-			     ++k_idx, ++k_elt, ++l)
-			{
-				t = ((uint64_t) *k_elt) * ((uint64_t) *j);
-
-				_tmp[*k_idx] += t;
-
-				if (_tmp[*k_idx] < t)
-					_tmp[*k_idx] += VD.field ()._two64;
-			}
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
-			*w_j = *l % VD.field ().modulus;
-
-		return w;
-	}
-
-
-}
-
-#include "linbox/randiter/modular.h"
-#endif //__LINBOX_pir_modular_int32_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/PIR-ntl-ZZ_p.h b/linbox/field/PIR-ntl-ZZ_p.h
deleted file mode 100644
index 8575a02..0000000
--- a/linbox/field/PIR-ntl-ZZ_p.h
+++ /dev/null
@@ -1,905 +0,0 @@
-/* Copyright (C) 2010 LinBox
- * written by Zhendong Wan
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-
-#ifndef __LINBOX_pir_ntl_zz_p_H
-#define __LINBOX_pir_ntl_zz_p_H
-
-#include "linbox/field/unparametric.h"
-#include "linbox/linbox-config.h"
-#include "linbox/util/debug.h"
-#include <NTL/ZZ.h>
-#include <NTL/ZZ_p.h>
-#include "linbox/field/NTL/ntl-ZZ_p.h"
-#include "linbox/vector/vector-domain.h"
-#include <sstream>
-#include "linbox/integer.h"
-#include "linbox/field/field-traits.h"
-
-namespace LinBox
-{
-
-	template<class Field>
-	class FieldAXPY;
-
-	template <class Ring>
-	struct ClassifyRIng;
-
-	class PIR_ntl_ZZ_p;
-
-	template <>
-	struct ClassifyRIng<PIR_ntl_ZZ_p> {
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-	/** \brief extend Wrapper of ZZ_p from NTL.  Add PIR functions
-	  \ingroup field
-	  */
-
-	class PIR_ntl_ZZ_p :  public NTL_ZZ_p {
-		//public UnparametricField<NTL::ZZ_p> {
-
-		// typedef UnparametricField<NTL::ZZ_p> Father_t ;
-		typedef NTL_ZZ_p Father_t ;
-	public:
-		typedef Father_t::Element Element;
-
-		template <class Int_t>
-		PIR_ntl_ZZ_p(const Int_t& d) :
-			Father_t(d)
-		{
-			// NTL::ZZ_p::init (NTL::to_ZZ(d));
-		}
-
-		PIR_ntl_ZZ_p (const NTL::ZZ& d) :
-		Father_t(d)
-		{
-			// NTL::ZZ_p::init(d);
-		}
-
-		PIR_ntl_ZZ_p (const integer& d, int e = 1 )  :
-			Father_t(d,e)
-		{
-
-			// if(e != 1) throw PreconditionFailed(__func__,__FILE__,__LINE__,"exponent must be 1");
-			linbox_check(e == 1);
-
-			// NTL::ZZ_p::init (NTL::to_ZZ(((std::string)d). c_str()));
-
-		}
-
-		inline static integer& cardinality (integer& c) {
-
-			std::stringstream io;
-
-			io << NTL::ZZ_p::modulus();
-
-			io >> c;
-
-			return c;
-		}
-
-		inline static NTL::ZZ& cardinality (NTL::ZZ& c) {
-
-			return c = NTL::ZZ_p::modulus();
-		}
-
-		inline static integer& characteristic (integer& c) {
-
-			std::stringstream  io;
-
-			io << NTL::ZZ_p::modulus();
-
-			io >> c;
-
-			return c;
-		}
-
-		static std::ostream& write (std::ostream& out)  {
-			return out << "PIR_NTL_ZZ_p Ring";
-		}
-
-		std::istream& read (std::istream& in)  {
-			return in;
-		}
-
-		/** @brief
-		 *  Init x from y.
-		 */
-		template<class Element2>
-		inline static Element& init (Element& x,  const Element2& y) {
-
-			NTL::conv (x, y);
-
-			return x;
-		}
-
-		/** @brief
-		 *   Init from a NTL::ZZ_p
-		 */
-		inline static Element& init (Element& x, const Element& y) {
-
-			x = y;
-
-			return x;
-		}
-
-		/** @brief
-		 *  I don't  know how to init from integer.
-		 */
-		inline static Element& init (Element& x, const integer& y) {
-
-
-			NTL::conv(x, NTL::to_ZZ( (static_cast<const std::string>(y)).c_str() ) );
-			return x;
-		}
-
-		/** @brief
-		 *  Convert y to an Element.
-		 */
-		static integer& convert (integer& x, const Element& y) {
-			bool neg=false;
-			if (NTL::sign(NTL::rep(y)) <0)
-				neg=true;
-			long b = NTL::NumBytes(NTL::rep(y));
-			unsigned char* byteArray; byteArray = new unsigned char[(size_t)b ];
-			NTL::BytesFromZZ(byteArray, NTL::rep(y), b);
-			integer base(256);
-			x= integer(0);
-			for(long i = b - 1; i >= 0; --i) {
-				x *= base;
-				x += integer(byteArray[i]);
-			}
-			delete [] byteArray;
-			if (neg)
-				x=-x;
-			return x;
-		}
-
-
-		/** @brief
-		 *  x = y.
-		 */
-		inline static Element&  assign (Element& x, const Element& y)  {
-			return x = y;
-		}
-
-		/** @brief
-		 *  Test if x == y
-		 */
-		inline static bool areEqual (const Element& x ,const Element& y)  {
-			return x == y;
-		}
-
-		/** @brief
-		 *  Test if x == 0
-		 */
-		inline static bool isZero (const Element& x)  {
-
-			return NTL::IsZero (x);
-		}
-
-		/** @brief
-		 *  Test if x == 1
-		 */
-		inline static bool isOne (const Element& x)  {
-
-			return NTL::IsOne (x);
-		}
-
-		// arithmetic
-
-		/** @brief
-		 *  return x = y + z
-		 */
-		inline static Element& add (Element& x, const Element& y, const Element& z)  {
-
-			NTL::add (x, y, z);
-
-			return x;
-		}
-
-		/** @brief
-		 *  return x = y - z
-		 */
-		inline static Element& sub (Element& x, const Element& y, const Element& z)  {
-
-			NTL::sub (x, y, z);
-
-			return x;
-		}
-
-		/** @brief
-		 *  return x = y * z
-		 */
-		template <class Int>
-		inline static Element& mul (Element& x, const Element& y, const Int& z)  {
-
-			NTL::mul (x, y, z);
-
-			return x;
-		}
-
-		/** @brief
-		 *  If exists a, such that a * z =y,
-		 *  return x = one of them.
-		 *  Otherwise, throw an exception
-		 */
-		inline static Element& div (Element& x, const Element& y, const Element& z) {
-
-			NTL::ZZ g, s, t;
-
-			NTL::XGCD (g, s, t, NTL::rep(z), NTL::ZZ_p::modulus());
-
-			NTL::ZZ q, r;
-
-			NTL::DivRem (q, r, NTL::rep(y), g);
-
-			if (NTL::IsZero (r)) {
-
-				Element tmp1, tmp2;
-
-				NTL::conv (tmp1, s);
-
-				NTL::conv (tmp2, q);
-
-				NTL::mul (x, tmp1, tmp2);
-
-			}
-
-			else
-				throw PreconditionFailed(__func__,__FILE__,__LINE__,"Div: not dividable");
-
-
-			return x;
-
-		}
-
-		/** @brief
-		 *  If y is a unit, return x = 1 / y,
-		 *  otherwsie, throw an exception
-		 */
-		inline static Element& inv (Element& x, const Element& y) {
-
-			NTL::inv (x, y);
-
-			return x;
-		}
-
-		/** @brief
-		 *  return x = -y;
-		 */
-		inline static Element& neg (Element& x, const Element& y)  {
-
-			NTL::negate (x, y);
-
-			return x;
-		}
-
-
-		/** @brief
-		 *  return r = a x + y
-		 */
-
-		template <class Int>
-		inline static Element& axpy (Element& r, const Element& a, const Int& x, const Element& y)  {
-
-			NTL::mul (r, a, x);
-
-			return r += y;
-		}
-
-
-		// inplace operator
-
-		/** @brief
-		 *  return x += y;
-		 */
-		inline static Element& addin (Element& x, const Element& y) {
-
-			return x += y;
-		}
-
-		/** @brief
-		 *  return x -= y;
-		 */
-		inline static Element& subin (Element& x, const Element& y)  {
-
-			return x -= y;
-		}
-
-		/** @brief
-		 *  return x *= y;
-		 */
-		template<class Int>
-		inline static Element& mulin (Element& x, const Int& y)  {
-
-			return x *= y;
-		}
-
-		/** @brief
-		 *  If y divides x, return x /= y,
-		 *  otherwise throw an exception
-		 */
-		inline static Element& divin (Element& x, const Element& y) {
-
-			div (x, x, y);
-
-			return x;
-		}
-
-		/** @brief
-		 *  If x is a unit, x = 1 / x,
-		 *  otherwise, throw an exception.
-		 */
-		inline static Element& invin (Element& x) {
-
-			return x = NTL::inv(x);
-		}
-
-		/** @brief
-		 *  return x = -x;
-		 */
-		inline static Element& negin (Element& x)  {
-
-			NTL::negate (x, x);
-
-			return x;
-		}
-
-		/** @brief
-		 *  return r += a x
-		 */
-		template <class Int>
-		inline static Element& axpyin (Element& r, const Element& a, const Int& x)  {
-
-			return r += a * x;
-		}
-
-
-		// IO
-
-		/** @brief
-		 *  out << y;
-		 */
-		static std::ostream& write(std::ostream& out,const Element& y)  {
-
-			out << y;
-
-			return out;
-		}
-
-
-		/** @brief
-		 *  read x from istream in
-		 */
-		static std::istream& read(std::istream& in, Element& x) {
-
-			return in >> x;
-		}
-
-
-		/** some PIR function
-		*/
-
-		/** @brief
-		 *  Test if x is a unit.
-		 */
-		inline static bool isUnit (const Element& x) {
-
-			NTL::ZZ g;
-
-			NTL::GCD (g, NTL::rep(x), NTL::ZZ_p::modulus());
-
-			return NTL::IsOne (g);
-		}
-
-		/** @brief
-		 *  return g = gcd (a, b)
-		 */
-		inline static Element& gcd (Element& g, const Element& a, const Element& b) {
-
-			NTL::ZZ d;
-
-			NTL::GCD (d, NTL::rep(a), NTL::rep(b));
-
-			NTL::conv (g, d);
-
-			return g;
-		}
-
-		/** @brief
-		 *  return g = gcd (g, b)
-		 */
-		inline static Element& gcdin (Element& g, const Element& b) {
-
-			gcd (g, g, b);
-
-			return g;
-		}
-
-		/** @brief
-		 *  g = gcd(a, b) = a*s + b*t.
-		 *  and gcd (s, t) is a unit.
-		 */
-		inline static Element& xgcd (Element& g, Element& s, Element& t, const Element& a, const Element& b){
-
-			NTL::ZZ g1, s1, t1;
-
-			NTL::XGCD (g1, s1, t1, NTL::rep(a), NTL::rep(b));
-
-			NTL::conv (g, g1);
-
-			NTL::conv (s, s1);
-
-			NTL::conv (t, t1);
-
-			return g;
-		}
-
-		/** @brief
-		 *  g = gcd(a, b) = a*s + b*t.
-		 *  and gcd (s, t) is a unit.
-		 *  s * a1 + t * b1 = a unit.
-		 */
-		inline static Element& dxgcd (Element& g, Element& s, Element& t, Element& a1, Element& b1,
-					      const Element& a, const Element& b){
-
-			NTL::ZZ g1, s1, t1, a2, b2;
-
-			NTL::XGCD (g1, s1, t1, NTL::rep(a), NTL::rep(b));
-
-			NTL::conv (g, g1);
-
-			NTL::conv (s, s1);
-
-			NTL::conv (t, t1);
-
-			if (NTL::IsZero (g1)) {
-
-				a1 = s;
-
-				b1 = t;
-			}
-
-			else {
-
-				NTL::div (a2, NTL::rep(a), g1);
-
-				NTL::div (b2, NTL::rep(b), g1);
-
-				NTL::conv (a1, a2);
-
-				NTL::conv (b1, b2);
-			}
-
-			return g;
-		}
-
-		/** @brief
-		 *  Test if a | b.
-		 */
-		inline static bool isDivisor (const Element& a, const Element& b) {
-
-			if ( NTL::IsZero (a) ) return false;
-
-			else if (NTL::IsZero (b)) return true;
-
-			else {
-				NTL::ZZ g, r;
-
-				NTL::GCD (g, NTL::rep(a), NTL::ZZ_p::modulus());
-
-				NTL::rem (r, NTL::rep(b), g);
-
-				return NTL::IsZero (r);
-			}
-		}
-
-		/** @brief
-		 *  a = normalization of b.
-		 */
-
-		inline static Element& normal (Element& a,  const Element& b) {
-
-			NTL::ZZ a1;
-
-			NTL::GCD (a1, NTL::rep(b), NTL::ZZ_p::modulus());
-
-			NTL::conv (a, a1);
-
-			return a;
-		}
-
-		/** @brief
-		*/
-
-		inline static Element& normalIn (Element& a) {
-
-
-			NTL::ZZ a1;
-
-			NTL::GCD (a1, NTL::rep(a), NTL::ZZ_p::modulus());
-
-			NTL::conv (a, a1);
-
-			return a;
-		}
-
-		inline static integer getMaxModulus()
-		{ return integer( "4294967295" ); } // 2^32 - 1
-
-	};
-
-
-
-	template <>
-	class FieldAXPY<PIR_ntl_ZZ_p>  {
-	public:
-		typedef PIR_ntl_ZZ_p Field;
-		typedef Field::Element Element;
-
-		/** Constructor.
-		 * A faxpy object if constructed from a Field.
-		 * Copies of this objects are stored in the faxpy object.
-		 * @param F field F in which arithmetic is done
-		 */
-		FieldAXPY (const Field &F) :
-		       	_field (F)
-		{ _y = NTL::ZZ::zero(); }
-
-		/** Copy constructor.
-		 * @param faxpy
-		 */
-		FieldAXPY (const FieldAXPY<Field> &faxpy) :
-		       	_field (faxpy._field), _y (faxpy._y)
-	       	{}
-
-		/** Assignment operator
-		 * @param faxpy
-		 */
-		FieldAXPY<Field> &operator = (const FieldAXPY &faxpy)
-		{ _y = faxpy._y; return *this; }
-
-		/** Add a*x to y
-		 * y += a*x.
-		 * @param a constant reference to element a
-		 * @param x constant reference to element x
-		 */
-		inline NTL::ZZ& mulacc (const Element &a, const Element &x)
-		{
-			return _y +=  NTL::rep(a) * NTL::rep(x) ;
-		}
-
-		inline NTL::ZZ& accumulate (const Element &t)
-		{
-			return _y += NTL::rep(t);
-		}
-
-		/** Retrieve y
-		 *
-		 * Performs the delayed modding out if necessary
-		 */
-		inline Element &get (Element &y) { NTL::conv (y,  _y); return y; }
-
-		/** Assign method.
-		 * Stores new field element for arithmetic.
-		 * @return reference to self
-		 * @param y constant reference to element a
-		 */
-		inline FieldAXPY &assign (const Element& y)
-		{
-			_y = NTL::rep(y);
-
-			return *this;
-		}
-
-		inline void reset() {
-			_y = NTL::ZZ::zero();
-		}
-
-	private:
-
-		/// Field in which arithmetic is done
-		/// Not sure why it must be mutable, but the compiler complains otherwise
-		Field _field;
-
-		/// Field element for arithmetic
-		NTL::ZZ _y;
-
-	};
-
-	template<class Field>
-	class DotProductDomain;
-
-	template <>
-	class DotProductDomain<PIR_ntl_ZZ_p> : private virtual VectorDomainBase<PIR_ntl_ZZ_p> {
-
-	public:
-		typedef PIR_ntl_ZZ_p::Element Element;
-		DotProductDomain (const PIR_ntl_ZZ_p& F) :
-			VectorDomainBase<PIR_ntl_ZZ_p> (F) {}
-
-
-	protected:
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-
-			typename Vector1::const_iterator i;
-			typename Vector2::const_iterator j;
-
-			NTL::ZZ y;
-			//NTL::ZZ t;
-
-			for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j) {
-
-				y += NTL::rep (*i) * NTL::rep(*j);
-
-			}
-
-			//NTL::rem (t, y, NTL::ZZ_p::modulus());
-
-			NTL::conv (res, y);
-
-			return res;
-
-		}
-
-		template <class Vector1, class Vector2>
-		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
-		{
-			typename Vector1::first_type::const_iterator i_idx;
-			typename Vector1::second_type::const_iterator i_elt;
-
-			NTL::ZZ y;
-			y = (long)0;
-			//NTL::ZZ t;
-
-			for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt) {
-
-				y += NTL::rep(*i_elt) * NTL::rep(v2[*i_idx]);
-
-			}
-
-
-			//NTL::rem (t, y, NTL::ZZ_p::modulus());
-
-			NTL::conv (res, y);
-
-			return res;
-		}
-	};
-
-	// Specialization of MVProductDomain for  PIR_ntl_ZZ_p field
-
-	template <class Field>
-	class MVProductDomain;
-
-	template <>
-	class MVProductDomain<PIR_ntl_ZZ_p>
-	{
-	public:
-
-		typedef PIR_ntl_ZZ_p::Element Element;
-
-	protected:
-		template <class Vector1, class Matrix, class Vector2>
-		inline Vector1 &mulColDense
-		(const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
-		{
-			return mulColDenseSpecialized
-			(VD, w, A, v, VectorTraits<typename Matrix::Column>::VectorCategory ());
-		}
-
-	private:
-
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::DenseVectorTag) const;
-
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseSequenceVectorTag) const;
-
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseAssociativeVectorTag) const;
-
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColDenseSpecialized
-		(const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-		 VectorCategories::SparseParallelVectorTag) const;
-
-	};
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<PIR_ntl_ZZ_p>::mulColDenseSpecialized
-	(const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::DenseVectorTag) const
-	{
-
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::const_iterator k;
-		std::vector<NTL::ZZ>::iterator l;
-		std::vector<NTL::ZZ> _tmp(w.size());
-
-		//NTL::ZZ t;
-
-		for (j = v.begin (); j != v.end (); ++j, ++i) {
-			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
-
-				*l += NTL::rep (*k) + NTL::rep (*j);
-
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l) {
-
-			//NTL::rem (t, *l, NTL::ZZ_p::modulus());
-
-			NTL::conv (*w_j, *l);
-		}
-
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<PIR_ntl_ZZ_p>::mulColDenseSpecialized
-	(const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseSequenceVectorTag) const
-	{
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::const_iterator k;
-		std::vector<NTL::ZZ>::iterator l;
-		std::vector<NTL::ZZ> _tmp(w.size());
-
-		//NTL::ZZ t;
-
-		for (j = v.begin (); j != v.end (); ++j, ++i) {
-			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
-
-				_tmp[k->first] += NTL::rep (k->second) * NTL::rep (*j);
-
-			}
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l) {
-
-			//NTL::rem (t, *l, NTL::ZZ_p::modulus());
-
-			NTL::conv (*w_j, *l);
-		}
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<PIR_ntl_ZZ_p >::mulColDenseSpecialized
-	(const VectorDomain<PIR_ntl_ZZ_p > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseAssociativeVectorTag) const
-	{
-
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::const_iterator k;
-		std::vector<NTL::ZZ>::iterator l;
-
-		std::vector<NTL::ZZ> _tmp(w.size());
-
-		//NTL::ZZ t;
-
-		for (j = v.begin (); j != v.end (); ++j, ++i) {
-			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
-
-				_tmp[k->first] += NTL::rep(k -> second) * NTL::rep(*j);
-
-			}
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l) {
-
-			//NTL::rem (t, *l, NTL::ZZ_p::modulus());
-
-			NTL::conv (*w_j, *l);
-		}
-
-
-		return w;
-	}
-
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<PIR_ntl_ZZ_p>::mulColDenseSpecialized
-	(const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
-	 VectorCategories::SparseParallelVectorTag) const
-	{
-
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j;
-		typename Matrix::Column::first_type::const_iterator k_idx;
-		typename Matrix::Column::second_type::const_iterator k_elt;
-		std::vector<NTL::ZZ>::iterator l;
-
-		std::vector<NTL::ZZ> _tmp(w.size());
-		//NTL::ZZ t;
-
-		for (j = v.begin (); j != v.end (); ++j, ++i) {
-			for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
-			     k_idx != i->first.end ();
-			     ++k_idx, ++k_elt, ++l)
-
-				_tmp[*k_idx] += NTL::rep(*k_elt) * NTL::rep(*j);
-
-		}
-
-		typename Vector1::iterator w_j;
-
-		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l) {
-
-			//NTL::rem (t, *l, NTL::ZZ_p::modulus());
-
-			NTL::conv (*w_j, *l);
-		}
-
-		return w;
-	}
-
-
-
-}
-
-#endif //__LINBOX_pir_ntl_zz_p_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/abstract.h b/linbox/field/abstract.h
index 8b41378..a82614b 100644
--- a/linbox/field/abstract.h
+++ b/linbox/field/abstract.h
@@ -285,6 +285,16 @@ namespace LinBox
 		 */
 		virtual bool isOne (const Element &x) const = 0;
 
+		/** MOne equality.
+		 * Test if field element is equal to one.
+		 * This function assumes the field element has already been
+		 * constructed and initialized.
+		 * Purely virtual.
+		 * @return boolean true if equals one, false if not.
+		 * @param  x field element.
+		 */
+		virtual bool isMOne (const Element &x) const = 0;
+
 		/** Inplace Addition.
 		 * x += y
 		 * This function assumes both field elements have already been
@@ -375,13 +385,6 @@ namespace LinBox
 		 */
 		virtual std::ostream &write (std::ostream &os) const = 0;
 
-		/** Read field.
-		 * Purely virtual.
-		 * @return input stream from which field is read.
-		 * @param  is  input stream from which field is read.
-		 */
-		virtual std::istream &read (std::istream &is) = 0;
-
 		/** Print field element.
 		 * This function assumes the field element has already been
 		 * constructed and initialized.
diff --git a/linbox/field/archetype.h b/linbox/field/archetype.h
index 03136e8..7f5ae61 100644
--- a/linbox/field/archetype.h
+++ b/linbox/field/archetype.h
@@ -44,6 +44,8 @@
 #define __LINBOX_field_archetype_H
 
 #include <iostream>
+#include "linbox/linbox-config.h"
+#include "linbox/util/error.h"
 #include "linbox/util/debug.h"
 #include "linbox/field/field-interface.h"
 #include "linbox/field/abstract.h"
@@ -54,8 +56,6 @@
 #include "linbox/randiter/abstract.h"
 #include "linbox/randiter/envelope.h"
 #include "linbox/integer.h"
-#include "linbox/linbox-config.h"
-#include "linbox/util/error.h"
 
 namespace LinBox
 {
@@ -110,9 +110,10 @@ namespace LinBox
 		FieldArchetype (const FieldArchetype &F) :
 			one(F.one),zero(F.zero),mOne(F.mOne)
 		{
-			if (F._field_ptr != 0) _field_ptr = F._field_ptr->clone ();
-			if (F._elem_ptr != 0) _elem_ptr = F._elem_ptr->clone ();
+			if (F._field_ptr    != 0) _field_ptr    = F._field_ptr   ->clone ();
+			if (F._elem_ptr     != 0) _elem_ptr     = F._elem_ptr    ->clone ();
 			if (F._randIter_ptr != 0) _randIter_ptr = F._randIter_ptr->clone ();
+
 		}
 
 		/** \brief Destructor.
@@ -128,9 +129,11 @@ namespace LinBox
 		 */
 		~FieldArchetype (void)
 		{
-			if (_field_ptr != 0) delete _field_ptr;
-			if (_elem_ptr != 0) delete _elem_ptr;
-			if (_randIter_ptr != 0) delete _randIter_ptr;
+			if (_field_ptr    != NULL) delete    _field_ptr;
+			if (_elem_ptr     != NULL) delete     _elem_ptr;
+			if (_randIter_ptr != NULL) delete _randIter_ptr;
+
+
 		}
 
 		/** \brief Assignment operator.
@@ -145,13 +148,16 @@ namespace LinBox
 		FieldArchetype &operator=(const FieldArchetype &F)
 		{
 			if (this != &F) { // guard against self-assignment
-				if (_field_ptr != 0) delete _field_ptr;
-				if (_elem_ptr != 0) delete _elem_ptr;
-				if (_randIter_ptr != 0) delete _randIter_ptr;
-				if (F._field_ptr != 0) _field_ptr = F._field_ptr->clone ();
-				if (F._elem_ptr != 0) _elem_ptr = F._elem_ptr->clone ();
+
+				if (_field_ptr      != 0) delete _field_ptr;
+				if (_elem_ptr       != 0) delete _elem_ptr;
+				if (_randIter_ptr   != 0) delete _randIter_ptr;
+
+				if (F._field_ptr    != 0) _field_ptr    = F._field_ptr   ->clone ();
+				if (F._elem_ptr     != 0) _elem_ptr     = F._elem_ptr    ->clone ();
 				if (F._randIter_ptr != 0) _randIter_ptr = F._randIter_ptr->clone ();
-				one = F.one ;
+
+				one  = F.one ;
 				zero = F.zero ;
 				mOne = F.mOne ;
 			}
@@ -180,7 +186,7 @@ namespace LinBox
 			// if (x._elem_ptr != 0) delete x._elem_ptr;
 			// x._elem_ptr = _elem_ptr->clone ();
 			if (x._elem_ptr == 0)
-				x._elem_ptr = _elem_ptr->clone ();
+			x._elem_ptr = _elem_ptr->clone ();
 			_field_ptr->init (*x._elem_ptr, n);
 			return x;
 		}
@@ -420,6 +426,21 @@ namespace LinBox
 		 */
 		bool isOne (const Element &x) const
 		{ return _field_ptr->isOne (*x._elem_ptr); }
+
+		/** MOne equality.
+		 * Test if field element is equal to one.
+		 * This function assumes the field element has already been
+		 * constructed and initialized.
+		 *
+		 * In this implementation, this means the <tt> _elem_ptr</tt>
+		 *of x exists and does not point to null.
+		 *
+		 * @return boolean true if equals one, false if not.
+		 * @param  x field element.
+		 */
+		bool isMOne (const Element &x) const
+		{ return _field_ptr->isMOne (*x._elem_ptr); }
+
 		//@}
 
 		/** @name Inplace Arithmetic Operations
@@ -565,13 +586,7 @@ namespace LinBox
 		 * @return output stream to which field is written.
 		 * @param  os  output stream to which field is written.
 		 */
-		std::ostream &write (std::ostream &os) const { return _field_ptr->write (os); }
-
-		/** Read field.
-		 * @return input stream from which field is read.
-		 * @param  is  input stream from which field is read.
-		 */
-		std::istream &read (std::istream &is) { return _field_ptr->read (is); }
+		std::ostream &write (std::ostream &os) const { return _field_ptr->write (os<<"Archetype of "); }
 
 		/** Print field element.
 		 * This function assumes the field element has already been
@@ -627,12 +642,11 @@ namespace LinBox
 		 */
 		FieldArchetype (FieldAbstract    *field_ptr,
 				ElementAbstract  *elem_ptr,
-				RandIterAbstract *randIter_ptr = 0) :
+				RandIterAbstract *randIter_ptr) :
 			_field_ptr (field_ptr->clone ()),
-			_elem_ptr (elem_ptr->clone ())
-		{
-			if (randIter_ptr != 0) _randIter_ptr = randIter_ptr->clone ();
-		}
+			_elem_ptr (elem_ptr->clone ()),
+                        _randIter_ptr (randIter_ptr->clone ())
+                        {}
 
 
 		/** Constructor.
@@ -687,9 +701,18 @@ namespace LinBox
 			_field_ptr    = field_ptr->clone ();
 			_elem_ptr     = static_cast<ElementAbstract*>  (new typename Field_qcq::Element ());
 			_randIter_ptr = static_cast<RandIterAbstract*> (new typename Field_qcq::RandIter (*field_ptr));
-			one  = static_cast<ElementAbstract*>  (new typename Field_qcq::Element (field_ptr->one) );
-			zero = static_cast<ElementAbstract*>  (new  typename Field_qcq::Element (field_ptr->zero ) );
-			mOne = static_cast<ElementAbstract*>  (new  typename Field_qcq::Element (field_ptr->mOne ) );
+
+			//! @bug leaks here (new not deleted)
+			// one  = field_ptr->one .clone();
+			// zero = field_ptr->zero.clone();
+			// mOne = field_ptr->mOne.clone();
+			one  = & field_ptr->one;
+			zero = & field_ptr->zero;
+			mOne = & field_ptr->mOne;
+
+			// one  = static_cast<ElementAbstract*>  (new  typename Field_qcq::Element (field_ptr->one  ) );
+			// zero = static_cast<ElementAbstract*>  (new  typename Field_qcq::Element (field_ptr->zero ) );
+			// mOne = static_cast<ElementAbstract*>  (new  typename Field_qcq::Element (field_ptr->mOne ) );
 		}
 
 		/** Template method for constructing archetype from a class not derived
diff --git a/linbox/field/block-ring.h b/linbox/field/block-ring.h
deleted file mode 100644
index a4252da..0000000
--- a/linbox/field/block-ring.h
+++ /dev/null
@@ -1,622 +0,0 @@
-/* linbox/fields/blas-ring.h
- * Copyright (C) 2007 LinBox Team
- *
- * Written by JP May, with tweaks by D. Saunders, Z. Wan
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-
-#ifndef __LINBOX_blockring_H
-#define __LINBOX_blockring_H
-#include <iostream>
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/algorithms/blas-domain.h"
-#include <fflas-ffpack/fflas/fflas.h>
-
-namespace LinBox
-{
-
-
-	/** Elements are wrapped BlasMatrix objects.
-
-	  Operations expect conformal sizes for inputs and outputs.
-
-	  You can expect good performance due to BLAS usage,
-	  especially when the Field is Modular<double> or Modular<float>.
-	  */
-
-	template < class _Field >
-	class BlockRing : public FieldInterface {
-	public:
-		_Field _field;
-		BlasMatrixDomain<_Field> _blasMatrixDomain;
-		size_t _b;
-
-		typedef BlasMatrix<_Field> Matrix;
-		typedef typename _Field::Element Scalar;
-
-
-
-		/// default constructable wrapper for BlasMatrix
-		class Element {
-
-		public:
-
-			typedef _Field Field;
-			typedef Scalar Entry;
-
-			Element() :
-				matrix(0)
-			{}
-
-			~Element() {
-				release();
-			}
-
-			// copy constructor
-			Element(const Element& e) :
-				matrix(0)
-			{
-				if (e.matrix != 0) {
-					matrix = new Matrix(*(e.matrix));
-					// memory leak of previous value?
-				}
-			}
-
-			// overload assignment
-			Element& operator= (const Element& e) {
-				if (matrix == e.matrix) {
-					return *this;
-				}
-				else if (e.matrix == 0) {
-					release();
-					return *this;
-				}
-				else {
-					//set(new Matrix(*(e.matrix))); // does this really copy?
-					clone(e);
-					return *this;
-				}
-			}
-
-			void clone(const Element& A) {
-				// make this a deep copy of A
-				// BlasMatrix copy constructor is shallow!
-
-				release();
-
-				if(A.matrix == 0) return;
-
-				size_t rows = A.matrix->rowdim();
-				size_t cols = A.matrix->coldim();
-
-				set(new Matrix(A.matrix->field(),rows, cols));
-
-				Scalar* a=A.matrix->getPointer();
-				Scalar* b=  matrix->getPointer();
-
-				for(size_t i=0; i < rows*cols; ++i) {
-					*b=*a;
-					++a; ++b;
-				}
-
-
-			}
-
-			// cleanly deletes the current stored value
-			// before assigning to the new value
-			void set(Matrix* thematrix) {
-				this -> release();
-				matrix = thematrix;
-			}
-
-			Matrix* matrix;
-
-		private:
-
-			void release() {
-				if (matrix != 0 )
-					delete matrix;
-				matrix = 0;
-			}
-
-		}; // class Element
-
-		Element one,zero,mOne;
-
-		class RandIter {
-			typedef typename _Field::RandIter FieldRandIter;
-
-			FieldRandIter r;
-			size_t dim;
-
-		public:
-			RandIter(const BlockRing<_Field>& BR,
-				 const integer size=0,
-				 const integer seed=0) :
-				r(BR._field, size, seed), dim(BR._b) {}
-
-			Element& random(Element& e) const
-			{
-				// e must be init'd
-				for(size_t i=0; i < e. matrix -> rowdim(); ++i)
-					for(size_t j=0; j < e. matrix -> coldim(); ++j)
-						r.random(e.matrix->refEntry(i,j));
-				return e;
-			}
-
-		}; //class RandIter
-
-
-		BlockRing(const _Field& F, size_t d=1) :
-			_field(F), _blasMatrixDomain(F), _b(d)
-		{
-			one.set(new Matrix(_field,d,d));
-			zero.set(new Matrix(_field,d,d));
-			mOne.set(new Matrix(_field,d,d)) ;
-			_blasMatrixDomain.setIdentity(*(one.matrix));
-			_blasMatrixDomain.setZero(*(zero.matrix));
-			for (size_t i = 0 ;i < d ;++i)
-				mOne.matrix->setEntry(i,i,_field.mOne);
-		}
-
-		Element& init(Element& B) const
-		{
-			// B is garbage from memory
-			B.set(new Matrix(_field,_b,_b));
-			return B;
-		}
-
-		template <typename ints>
-		Element& init(Element& B, ints n, size_t r = 0, size_t c = 0) const
-		// n supposed to be integer, r num rows, c num cols
-		{
-			// default block dim is default dim of ring, but others are allowed.
-			if (r == 0) r = _b;
-			if (c == 0) c = _b;
-
-			B.set(new Matrix(_field,r,c));
-
-			size_t k = ( (r < c) ? r : c );
-
-			typename _Field::Element N; _field.init(N, n);
-
-			for (size_t i = 0; i < k; ++i) (B.matrix)->setEntry(i, i, N);
-
-			return B;
-
-		}
-
-
-		template <typename ints>
-		ints& convert(ints& x) const
-		{
-			return _field.convert(x);
-		}
-
-
-		template <typename ints>
-		ints& convert(ints& x, const Element &A) const
-		{
-			return _field.convert(x, *(A.matrix->getPointer()));
-		}
-
-		Element& assign(Element &A, const Element &B) const
-		{
-			return A = B;
-		}
-
-
-		integer& cardinality(integer &c) const
-		{
-			// c = p^(b^2)
-
-			_field.cardinality(c);
-
-			if(c > 1) // _field is a finite field
-			{
-				integer tmp, n;
-				n = _b*_b;
-				c = expt(tmp, c, n);
-			} // else c  = -1
-
-			return c;
-		}
-
-		integer& characteristic(integer &c) const
-		{
-			return _field.characteristic(c);
-		}
-
-		unsigned long cardinality() const
-		{
-			return _field. cardinality() ;
-		}
-
-		unsigned long characteristic() const
-		{
-			return _field. characteristic() ;
-		}
-
-
-
-		size_t dim() const
-		{
-			return _b;
-		}
-
-
-		//Operations
-		//
-		// All operations will work for matrices of dim != _b
-		// but assume that the dimensions of all the given matrices
-		// are compatible with the dimensions of the A operand.
-
-		//Operations from the Matrix Domain:
-
-		Element& mul(Element& C, const Element& A, const Element& B) const
-		{
-			_blasMatrixDomain.mul(*(C.matrix), *(A.matrix), *(B.matrix));
-			return C;
-		}
-
-
-		//non-commutative: use mulin_left: A = A*B
-		Element& mulin(Element& A, const Element& B) const
-		{
-			_blasMatrixDomain.mulin_left(*(A.matrix), *(B.matrix));
-			return A;
-		}
-
-		// D = A*X+Y
-		Element& axpy(Element& D, const Element& A, const Element& X, const Element& Y) const
-		{
-			_blasMatrixDomain.axpy(*(D.matrix), *(A.matrix), *(X.matrix), *(Y.matrix));
-			return D;
-		}
-
-		// R = A*X+R
-		Element& axpyin(Element& R, const Element& A, const Element& X) const
-		{
-			_blasMatrixDomain.axpyin(*(R.matrix), *(A.matrix), *(X.matrix));
-			return R;
-		}
-
-
-		// These operations will not work for all elements
-		// and no checks are provided!
-
-		// B = A^{-1}
-		Element& inv(Element& B, const Element& A) const
-		{
-
-			int nullflag = 0;
-
-			_blasMatrixDomain.inv(*(B.matrix), *(A.matrix), nullflag);
-
-			if (nullflag)
-				throw PreconditionFailed(__func__,__FILE__,__LINE__,"InvMatrix: inverse undefined");
-
-			return B;
-		}
-
-		// A=A^{-1} not really inplace!
-		Element& invin(Element& A) const
-		{
-
-			int nullflag = 0;
-
-			//_blasMatrixDomain.invin(A, A, nullflag);
-
-			Element B;  init(B, A.matrix->rowdim(), A.matrix->coldim());
-			_blasMatrixDomain.inv(*(B.matrix), *(A.matrix), nullflag);
-
-			if (nullflag)
-				throw PreconditionFailed(__func__,__FILE__,__LINE__,"InvMatrix: inverse undefined");
-
-			A=B;
-
-			return A;
-		}
-
-
-		// C = A*B^{-1}
-		Element& div(Element& C, const Element& A, const Element& B) const
-		{
-
-			_blasMatrixDomain.right_solve(*(C.matrix),*(B.matrix),*(A.matrix));
-			return C;
-		}
-
-
-		//A = A*B^{-1};
-		Element& divin( Element& A, const Element& B) const
-		{
-			_blasMatrixDomain.right_solve(*(B.matrix),*(A.matrix));
-			return A;
-		}
-
-
-
-
-		// Unwrapped operations using simple loops:
-
-		// C = A + B
-		Element& add(Element& C, const Element& A, const Element& B) const
-		{
-			size_t rows = A.matrix->rowdim();
-			size_t cols = A.matrix->coldim();
-
-			Scalar* a=A.matrix->getPointer();
-			Scalar* b=B.matrix->getPointer();
-			Scalar* c=C.matrix->getPointer();
-
-			//FFLAS::fcopy((typename Field::Father_t)_field, rows*cols, b, 1, c, 1); // C = B
-
-
-			for(size_t i=0; i < rows*cols; ++i) {
-				_field.add(*c,*a,*b);
-				++a; ++b; c++;
-			}
-
-			//Scalar alpha; _field.init(alpha, 1);
-			//FFLAS::faxpy((typename Field::Father_t)_field, rows*cols, alpha, a, 1, c, 1);
-
-			return C;
-		}
-
-		// A = A + B
-		Element& addin(Element& A, const Element& B) const
-		{
-			size_t r = A.matrix->rowdim();
-			size_t c = A.matrix->coldim();
-
-			Scalar* a=A.matrix->getPointer();
-			Scalar* b=B.matrix->getPointer();
-
-			for(size_t i=0; i < r*c; ++i) {
-				_field.addin(*a,*b);
-				++a; ++b;
-			}
-
-			return A;
-
-		}
-
-
-		// C = A - B
-		Element& sub(Element& C, const Element& A, const Element& B) const
-		{
-			size_t rows = A.matrix->rowdim();
-			size_t cols = A.matrix->coldim();
-
-			Scalar* a=A.matrix->getPointer();
-			Scalar* b=B.matrix->getPointer();
-			Scalar* c=C.matrix->getPointer();
-
-
-			for(size_t i=0; i < rows*cols; ++i) {
-				_field.sub(*c,*a,*b);
-				++a; ++b; c++;
-			}
-
-			return C;
-		}
-
-
-		// A = A - B
-		Element& subin(Element& A, const Element& B) const
-		{
-			size_t r = A.matrix->rowdim();
-			size_t c = A.matrix->coldim();
-
-			Scalar* a=A.matrix->getPointer();
-			Scalar* b=B.matrix->getPointer();
-
-			for(size_t i=0; i < r*c; ++i) {
-				_field.subin(*a,*b);
-				++a; ++b;
-			}
-
-			return A;
-		}
-
-
-		//B = -1*A
-		Element& neg(Element& B, const Element& A) const
-		{
-			size_t r = A.matrix->rowdim();
-			size_t c = A.matrix->coldim();
-
-			Scalar* a=A.matrix->getPointer();
-			Scalar* b=B.matrix->getPointer();
-
-			for(size_t i=0; i < r*c; ++i) {
-				_field.neg(*b,*a);
-				++a; ++b;
-			}
-
-			return B;
-		}
-
-
-		//A = -1*A
-		Element& negin(Element& A) const
-		{
-			size_t r = A.matrix->rowdim();
-			size_t c = A.matrix->coldim();
-
-			Scalar* a=A.matrix->getPointer();
-
-			for(size_t i=0; i < r*c; ++i) {
-				_field.negin(*a);
-				++a;
-			}
-
-			return A;
-		}
-
-		bool areEqual(const Element& A, const Element& B) const
-		{
-
-			size_t r = A.matrix->rowdim();
-			size_t c = A.matrix->coldim();
-
-			Scalar* a=A.matrix->getPointer();
-			Scalar* b=B.matrix->getPointer();
-
-			for(size_t i=0; i < r*c; ++i) {
-
-				if(!_field.areEqual(*a,*b)) {
-					return false;
-				}
-
-				++a; ++b;
-			}
-			return true;
-		}
-
-
-		bool isOne(const Element& X) const
-		{
-			size_t n = X.matrix->rowdim();
-
-			if(n != X.matrix->coldim()) {
-				return false;
-			}
-
-			Scalar* x=X.matrix->getPointer();
-
-			for(size_t i=1; i <= n; ++i)
-				for(size_t j=1; j <= n; ++j)
-				{
-					if(i==j) { // on the diagonal
-						if(!_field.isOne(*x)) {
-							return false;
-						}
-					}
-					else {
-						if(!_field.isZero(*x)) {
-							return false;
-						}
-					}
-
-					x++;
-				}
-
-
-			return true;
-		}
-
-
-		bool isZero(const Element& X) const
-		{
-
-			size_t r = X.matrix->rowdim();
-			size_t c = X.matrix->coldim();
-
-			Scalar* x=X.matrix->getPointer();
-
-			for(size_t i=0; i < r*c; ++i)
-			{
-				if(!_field.isZero(*x)) {
-					return false;
-				}
-
-				x++;
-			}
-
-			return true;
-		}
-
-
-		//stubs for read and write field
-		std::ostream& write(std::ostream& os) const
-		{
-			return _field.write(os << "Dimension " << _b << " square matrices over ");
-		}
-
-
-
-		std::istream& read(std::istream& is)
-		{
-			return is;
-		}
-
-		// wrapped read and write element
-		std::ostream& write(std::ostream& os, const Element& A) const
-		{
-			return (A.matrix)->write(os << std::endl);
-		}
-
-
-		std::istream& read(std::istream& is, const Element& A) const
-		{
-
-			return (A.matrix)->read(is, _field);
-		}
-
-
-	private:
-
-
-		// recursive helper to compute exponentiation of integers
-		static	  integer& expt (integer& res, integer& a, integer& n)
-		{
-			if (n == 0) {
-				res=1;
-			}
-			else if (n == 1) {
-				res=a;
-			}
-			else if (n[0] & 1) {
-				n -= 1;
-				expt(res, a, n);
-				res*=a;
-			}
-			else {
-				n /= 2;
-				expt(res, a, n);
-				res*=res;
-			}
-
-			return res;
-		}
-
-
-
-	}; // BlockRing
-
-} // LinBox
-
-#endif // __LINBOX_blockring_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/envelope.h b/linbox/field/envelope.h
index 497e593..902c238 100644
--- a/linbox/field/envelope.h
+++ b/linbox/field/envelope.h
@@ -381,6 +381,17 @@ namespace LinBox
 		bool isOne (const ElementAbstract& x) const
 		{ return _field.isOne (static_cast<const ElementEnvelope<Field>&> (x)._elem); }
 
+		/** MOne equality.
+		 * Test if field base element is equal to one.
+		 * This function assumes the field base element has already been
+		 * constructed and initialized.
+		 * @return boolean true if equals one, false if not.
+		 * @param  x field base element.
+		 */
+		bool isMOne (const ElementAbstract& x) const
+		{ return _field.isMOne (static_cast<const ElementEnvelope<Field>&> (x)._elem); }
+
+
 		/** Inplace Addition.
 		 * x += y
 		 * This function assumes both field base elements have already been
@@ -499,12 +510,6 @@ namespace LinBox
 		 */
 		std::ostream& write (std::ostream& os) const { return _field.write (os); }
 
-		/** Read field.
-		 * @return input stream from which field is read.
-		 * @param  is  input stream from which field is read.
-		 */
-		std::istream& read (std::istream& is) { return _field.read (is); }
-
 		/** Print field base element.
 		 * This function assumes the field base element has already been
 		 * constructed and initialized.
diff --git a/linbox/field/field-interface.h b/linbox/field/field-interface.h
index 641c8ec..a68fc25 100644
--- a/linbox/field/field-interface.h
+++ b/linbox/field/field-interface.h
@@ -37,7 +37,7 @@ namespace LinBox
 	 *   \c convert(), \c init(), \c assign(), \c characteristic(), \c cardinality().
 	 *
 	 * Predicates on field elements:
-	 *   \c areEqual(), \c isZero(), \c isOne().
+	 *   \c areEqual(), \c isZero(), \c isOne(),  \c isMOne().
 	 *
 	 * Basic arithmetic functions:
 	 *   \c axpy(), \c add(), \c neg(), \c sub(), \c mul(), \c inv(),\c  div().
diff --git a/linbox/field/field-traits.h b/linbox/field/field-traits.h
index af9c9c2..903b2c2 100644
--- a/linbox/field/field-traits.h
+++ b/linbox/field/field-traits.h
@@ -23,6 +23,10 @@
 #define __LINBOX_field_traits_H
 
 #include "linbox/integer.h"
+#include <givaro/givcaster.h>
+#include <givaro/givinteger.h>
+#include <givaro/givrational.h>
+#include <givaro/zring.h>
 
 // Namespace in which all LinBox library code resides
 namespace LinBox {
@@ -43,6 +47,8 @@ namespace LinBox {
 		struct GenericTag{};
 		//! If it is isomorphic to Z/mZ, for some m or its extensions.
 		struct ModularTag : public virtual GenericTag{};
+		//! Galois Field  GF(p^e)
+		struct GaloisTag : public virtual GenericTag {};
 		//! If it is isomorphic to Z
 		struct IntegerTag : public virtual GenericTag{};
 		//! If it is isomorphic to Q
@@ -56,30 +62,57 @@ namespace LinBox {
 		typedef	RingCategories::GenericTag categoryTag;
 	};
 
+	using Givaro::Caster;
+
+        template<>
+        struct ClassifyRing<Givaro::QField<Givaro::Rational>> {
+                typedef RingCategories::RationalTag categoryTag;
+        };
+        template<>
+        struct ClassifyRing<Givaro::ZRing<Givaro::Integer>> {
+                typedef RingCategories::IntegerTag categoryTag;
+        };
+        template<>
+        struct ClassifyRing<Givaro::IntegerDom> {
+                typedef RingCategories::IntegerTag categoryTag;
+        };
+
+
 	/*! FieldTrait.
 	 */
 	template <class Field>
 	struct FieldTraits {
+
 		typedef typename ClassifyRing<Field>::categoryTag categoryTag;
 
 		static integer& maxModulus( integer& i )
 		{
-			return i = static_cast<integer>(Field::getMaxModulus());
+            		return Caster(i, Field::maxCardinality());
 		}
 
 		static uint64_t & maxModulus( uint64_t& i )
 		{
-			return i = static_cast<uint64_t>(Field::getMaxModulus());
+            		return Caster(i, Field::maxCardinality());
+// 			return i = static_cast<uint64_t>(Field::maxCardinality());
 		}
 
 		static uint32_t & maxModulus( uint32_t& i )
 		{
-			return i = static_cast<uint32_t>(Field::getMaxModulus());
+            		return Caster(i, Field::maxCardinality());
+// 			return i = static_cast<uint32_t>(Field::maxCardinality());
+		}
+
+		template<class T>
+		static T & maxModulus( T & i )
+		{
+			return i = static_cast<T>(Field::maxCardinality());
 		}
 
 		static integer maxModulus()
 		{
-			return static_cast<integer>(Field::getMaxModulus());
+            		integer maxm;
+            		return Caster(maxm, Field::maxCardinality());
+// 			return static_cast<integer>(Field::maxCardinality());
 		}
 
 		static bool goodModulus( const integer& i )
@@ -108,6 +141,7 @@ namespace LinBox {
 			else
 				return ( i >= 1 && i <= max );
 		}
+
 	};
 
 
@@ -147,11 +181,11 @@ namespace LinBox { /*  areFieldEqual  */
 
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
 
diff --git a/linbox/field/gf2.h b/linbox/field/gf2.h
index 79a4b36..97c039b 100644
--- a/linbox/field/gf2.h
+++ b/linbox/field/gf2.h
@@ -5,20 +5,20 @@
  *
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -29,11 +29,11 @@
 #ifndef __LINBOX_field_gf2_H
 #define __LINBOX_field_gf2_H
 
+#include "linbox/linbox-config.h"
 #include <iostream>
 #include <climits>
 #include <cmath>
 
-#include "linbox/linbox-config.h"
 #include "linbox/util/debug.h"
 #include "linbox/integer.h"
 #include "linbox/field/field-interface.h"
@@ -41,7 +41,7 @@
 #include "linbox/field/field-traits.h"
 // #include "linbox/vector/vector-domain.h"
 
-#ifndef __PATHCC__
+#if !defined(__PATHCC__) && !(defined(__APPLE__) && defined(__clang__))
 #define stdBitReference std::_Bit_reference
 #else
 #define stdBitReference std::vector<bool>::reference
@@ -81,6 +81,7 @@ namespace LinBox
 		/** Element type
 		*/
 		typedef bool Element;
+		typedef bool Residu_t;
 
 		/** Random iterator generator type.
 		 * It must meet the common object interface of random element generators
@@ -100,15 +101,15 @@ namespace LinBox
 		GF2 (int p, int exp = 1) :
 			zero(false),one(true),mOne(true)
 		{
-			if(p != 2) throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be 2");
-			if(exp != 1) throw PreconditionFailed(__func__,__FILE__,__LINE__,"exponent must be 1");
+			if(p != 2) throw PreconditionFailed(LB_FILE_LOC,"modulus must be 2");
+			if(exp != 1) throw PreconditionFailed(LB_FILE_LOC,"exponent must be 1");
 		}
 
 		/** Copy constructor.
-		 * Constructs Modular object by copying the field.
+		 * Constructs Givaro::Modular object by copying the field.
 		 * This is required to allow field objects to be passed by value
 		 * into functions.
-		 * @param  F Modular object.
+		 * @param  F Givaro::Modular object.
 		 */
 		GF2 (const GF2 & F ) :
 			zero(false),one(true),mOne(true) {}
@@ -116,10 +117,10 @@ namespace LinBox
 		/** Assignment operator.
 		 * Required by the archetype
 		 *
-		 * @param F constant reference to Modular object
-		 * @return reference to Modular object for self
+		 * @param F constant reference to Givaro::Modular object
+		 * @return reference to Givaro::Modular object for self
 		 */
-		const GF2 &operator = (const GF2 &F)
+		GF2 &operator = (const GF2 &F)
 		{
 			return *this;
 		}
@@ -134,16 +135,17 @@ namespace LinBox
 		 * @param x field base element to contain output (reference returned).
 		 * @param y integer.
 		 */
-		Element &init (Element &x, const int &y ) const
+		Element &init (Element &x, const int64_t &y ) const
 		{
 			return x = y & 1;
 		}
 
-		Element &init (Element &x, const unsigned int &y ) const
+		Element &init (Element &x, const uint64_t &y ) const
 		{
 			return x = y & 1;
 		}
 
+/*
 		Element &init (Element &x, const long &y ) const
 		{
 			return x = y & 1;
@@ -159,6 +161,7 @@ namespace LinBox
 			return x = static_cast<unsigned char>(y) & 1;
 		}
 
+*/
 		Element &init (Element &x, const double &y) const
 		{
 			return x = static_cast<unsigned char>(y) & 1;
@@ -166,7 +169,8 @@ namespace LinBox
 
 		Element &init (Element &x, const integer &y) const
 		{
-			return x = static_cast<long>(y) & 1;
+			//return x = static_cast<long>(y) & 1;
+			return x = y & (uint32_t)1;
 		}
 
 
@@ -177,12 +181,12 @@ namespace LinBox
 
 		BitVector::reference init (BitVector::reference x, const integer &y = 0) const
 		{
-			return x = long (y) & 1;
+			return x = y & (uint32_t)1;
 		}
 
 		stdBitReference init (stdBitReference x, const integer &y = 0) const
 		{
-			return x = long (y) & 1;
+			return x = y & (uint32_t)1;
 		}
 
 		/** Conversion of field base element to a template class T.
@@ -331,6 +335,18 @@ namespace LinBox
 			return x;
 		}
 
+		/** MOne equality.
+		 * Test if field base element is equal to one.
+		 * This function assumes the field base element has already been
+		 * constructed and initialized.
+		 * @return boolean true if equals one, false if not.
+		 * @param  x field base element.
+		 */
+		bool isMOne (Element x) const
+		{
+			return x;
+		}
+
 		//@} Arithmetic Operations
 
 		/** @name Input/Output Operations */
@@ -392,7 +408,11 @@ namespace LinBox
 		 * @return  \c is
 		 */
 		std::istream &read (std::istream &is, stdBitReference x) const
-		{ bool a; is >> a; x=a; return is;
+		{
+			bool a = true;
+			is >> a;
+			x=a;
+			return is;
 		}
 
 		//@}
@@ -962,13 +982,18 @@ namespace LinBox
 
 		//@} Inplace Arithmetic Operations
 
-		static inline int getMaxModulus()
+		static inline int maxCardinality()
 		{
 			return 2;
 		}
 
 	}; // class GF2
 
+        template<>
+        struct DenseVectorChooser<GF2> {
+                typedef BitVector type;
+        };
+
 } // namespace LinBox
 
 // #define LINBOX_field_gf2_H
@@ -978,8 +1003,14 @@ namespace LinBox
 // Specialization of homomorphism for basefield
 #include "linbox/randiter/gf2.h"
 
+#if __cplusplus >= 201103L
+#if defined( __APPLE__) && defined(__clang__)
+#include <__bit_reference>
+#else
+#include <bits/stl_bvector.h>
+#endif /* __clang__ */
+#else
 // #include <bits/stl_bvector.h>
-namespace std
 {
 	//! @todo JGD 05.11.2009 : it should be in bits/stl_bvector.h  ...
 	inline void swap(stdBitReference __x, stdBitReference __y)
@@ -989,6 +1020,7 @@ namespace std
 		__y = __tmp;
 	}
 }
+#endif
 
 
 #include "linbox/field/gf2.inl"
diff --git a/linbox/field/givaro.h b/linbox/field/givaro.h
deleted file mode 100644
index 6f35ff4..0000000
--- a/linbox/field/givaro.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* linbox/field/givaro.h
- * Copyright (C) 2002 Pascal Giorgi
- *
- * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- *
- * 
- * ========LICENCE========
- * This file is part of the library LinBox.
- * 
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This 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
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_field_givaro_H
-#define __LINBOX_field_givaro_H
-
-#include "linbox/field/field-traits.h"
-#include "linbox/field/Givaro/givaro-zpz.h"
-#include "linbox/field/Givaro/givaro-montg.h"
-#include "linbox/field/Givaro/givaro-gfq.h"
-#include "linbox/field/Givaro/givaro-rational.h"
-#include "linbox/field/Givaro/givaro-extension.h"
-#include "linbox/field/Givaro/givaro-field.h"
-#include "linbox/field/Givaro/givaro-field-gf2.h"
-
-#endif // __LINBOX_field_givaro_H
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/gmp-rational.h b/linbox/field/gmp-rational.h
index c300923..011f317 100644
--- a/linbox/field/gmp-rational.h
+++ b/linbox/field/gmp-rational.h
@@ -5,20 +5,20 @@
  *
  * ----------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -41,7 +41,6 @@
 #include "linbox/util/debug.h"
 #include "linbox/field/field-traits.h"
 
-// Namespace in which all LinBox library code resides
 namespace LinBox
 {
 
@@ -155,34 +154,40 @@ namespace LinBox
 			return x;
 		}
 
+		/* this is assign(x,y)
 		Element &init (Element &x, const Element &y) const
 		{
 			mpq_set (x.rep, y.rep);
 			return x;
-		}
+		}*/
+
+		/*
+		Element &init (Element &x, int32_t &y ) const
 
-		Element &init (Element &x, const int &y ) const
 		{
 			mpq_set_si (x. rep, (long)y,1L);
 			//mpq_canonicalize (x.rep);
 			return x;
 		}
+		*/
 
-		Element &init (Element &x, const long int &y ) const
+		Element &init (Element &x, const int64_t &y ) const
 		{
 			mpq_set_si (x. rep, (long)y,1L);
 			//mpq_canonicalize (x.rep);
 			return x;
 		}
 
-		Element &init (Element &x, const unsigned int &y ) const
+		/*
+		Element &init (Element &x, const uint32_t &y ) const
 		{
 			mpq_set_ui (x. rep, (unsigned long)y,1L);
 			//mpq_canonicalize (x.rep);
 			return x;
 		}
+		*/
 
-		Element &init (Element &x, const long unsigned int &y ) const
+		Element &init (Element &x, const uint64_t &y ) const
 		{
 			mpq_set_ui (x. rep, (long unsigned)y,1L);
 			//mpq_canonicalize (x.rep);
@@ -428,6 +433,19 @@ namespace LinBox
 		bool isOne (const Element &x) const
 		{ return mpq_cmp_ui (x.rep, 1L, 1L) == 0; }
 
+		/** MOne equality.
+		 * Test if field element is equal to one.
+		 * This function assumes the field element has already been
+		 * constructed and initialized.
+		 * In this implementation, this means the _elem_ptr of x
+		 * exists and does not point to null.
+		 * @return boolean true if equals one, false if not.
+		 * @param  x field element.
+		 */
+		bool isMOne (const Element &x) const
+		{ return mpq_cmp_ui (x.rep, 1L, 1L) == 0; }
+
+
 		/** Inplace Addition.
 		 * x += y
 		 * This function assumes both field elements have already been
@@ -751,12 +769,12 @@ namespace LinBox
 			_cardinality (0), _characteristic (0), _zero (0), _one (1), _mOne (-1),
 			zero (_zero, _one), one (_one, _one), mOne (_mOne, _one)
 		{
-			if(p != 0) throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be 0 (no modulus)");
-			if(exp != 1) throw PreconditionFailed(__func__,__FILE__,__LINE__,"exponent must be 1");
+			if(p != 0) throw PreconditionFailed(LB_FILE_LOC,"modulus must be 0 (no modulus)");
+			if(exp != 1) throw PreconditionFailed(LB_FILE_LOC,"exponent must be 1");
 		}
 
 		/// max modulus.
-		static inline int getMaxModulus() { return 0; } // no modulus
+		static inline int maxCardinality() { return 0; } // no modulus
 
 		/*! get numerator.
 		 * @param x  numerator of y
@@ -793,11 +811,11 @@ namespace LinBox
 		 * @param q
 		 * @return \c bs
 		 */
-		integer& bitsize(integer& bs, const Element q) const
+		integer& bitsize(integer& bs, const Element & q) const
 		{
 			integer y; get_den(y,q);
 			integer x; get_num(x,q);
-			bs = x.bitsize() + y.bitsize();
+			bs = uint64_t (x.bitsize() + y.bitsize());
 			return bs;
 		}
 
@@ -833,11 +851,10 @@ namespace LinBox
 
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/field/hom.h b/linbox/field/hom.h
index 76e9e51..a46b0ce 100644
--- a/linbox/field/hom.h
+++ b/linbox/field/hom.h
@@ -1,20 +1,20 @@
 /* linbox/field/hom.h
  * Copyright(C) LinBox
  * Written by David Saunders
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -26,14 +26,19 @@
 #define __LINBOX_hom_H
 
 #include "linbox/linbox-config.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/PID-integer.h"
 #include "linbox/util/error.h"
+#include "linbox/integer.h"
+#include <givaro/givcaster.h>
+#include <givaro/givrational.h>
+#include <givaro/modular.h>
+#include <givaro/zring.h>
 
 #ifdef __LINBOX_HAVE_NTL
-#include "linbox/field/NTL/ntl-ZZ.h"
+#include "linbox/ring/ntl/ntl-zz.h"
 #endif //__LINBOX_HAVE_NTL
 
+#include "givaro/givrational.h"
+
 namespace LinBox
 {
 	/// Error object for attempt to establish a Hom that cannot exist.
@@ -46,16 +51,16 @@ namespace LinBox
 	 * to a ring (usually field) of type Target.  The intended use is that
 	 * it will be a natural mapping.  For instance:
 	 *
-	 * Hom<Unparametric<Integers>, Modular<integer> >(Z, Zp) nat; // is the mod p mapping.
+	 * Hom<Unparametric<Integers>, Givaro::Modular<integer> >(Z, Zp) nat; // is the mod p mapping.
 	 *
-	 * Hom<<NTL_ZZp, Modular<integer> >(Zp, Mp) nat;
+	 * Hom<<NTL_ZZp, Givaro::Modular<integer> >(Zp, Mp) nat;
 	 *
 	 * // is an isomorphism, provided the Zp and Mp have same characteristic.
 	 * Hom<Unparametric<NTL_ZZp, Unparameteric<NTL_ZZpEx> >(Z3, Z27) nat;
 	 * // is the embedding of the prime field in the extension.
 	 */
 
-	template< class Source, class Target >
+	template< class Source, class Target, class Enabled = void > // Enabled is just for std::enable_if 
 	class Hom {
 	public:
 		typedef typename Source::Element SrcElt;
@@ -96,8 +101,8 @@ namespace LinBox
 
 	private:
 		integer tmp;
-		Source _source;
-		Target _target;
+		const Source& _source;
+		const Target& _target;
 	}; // end Hom
 
 
@@ -115,127 +120,98 @@ namespace LinBox
 		Hom(const Source& S, const Target& T) :
 			_source (S)
 		{}
+
 		Elt& image(Elt& t, const SrcElt& s)
 		{
-			_source. assign (t, s);
+			_source.assign (t, s);
 			return t;
 		}
+
 		SrcElt& preimage(SrcElt& s, const Elt& t)
 		{
-			_source. assign (s, t);
+			_source.assign (s, t);
 			return s;
 		}
+
 		const Source& source() { return _source;}
 		const Target& target() { return _source;}
 
 	protected:
-		Source _source;
-	}; // end Hom
+		const Source& _source;
+	};
 
 
 }
 
-#ifdef __LINBOX_field_modular_H
-// including specialization to modular
-//#include "linbox/field/modular.h"
-/// Specialization to Modular<uint16_t> --> Modular<uint_32>.
-// Just a trial.  delete this when better examples exist.
-namespace LinBox
-{
-	template<> inline Hom<Modular<uint16_t>, Modular<uint32_t> >::
-	Hom(const Modular<uint16_t>& S, const Modular<uint32_t>& T ) :
-		_source(S),_target(T)
-	{
-		integer ps, pt;
-		if (S.characteristic(ps) != T.characteristic(pt)) throw NoHomError();
-	}
-
-	template<> inline Modular<uint32_t>::Element& Hom<Modular<uint16_t>, Modular<uint32_t> >::
-	image(Modular<uint32_t>::Element& t, const Modular<uint16_t>::Element& s)
-	{
-	       	return t = s;
-	}
-
-	// assumes t normalized.
-	template<> inline Modular<uint16_t>::Element& Hom<Modular<uint16_t>, Modular<uint32_t> >::
-	preimage(Modular<uint16_t>::Element& s, const Modular<uint32_t>::Element& t)
-	{
-		linbox_check(t < UINT8_MAX) ;
-	       	return s = (uint16_t) t;
-	}
-
-}// namespace LinBox
-#endif //__LINBOX_field_modular_H
-
-#ifdef __LINBOX_field_unparametric_H
+// // Specialization to modular
+// namespace LinBox
+// {
+//     // GENERIC SPECIALISATION FOR MODULAR HOMORMOPHISM
+//     // The enable_if is to protect undetermination with Hom<Source, Source>
+// 	template<typename T1, typename C1, typename T2, typename C2>
+// 	class Hom<Givaro::Modular<T1, C1>, Givaro::Modular<T2, C2>,
+//         typename std::enable_if<!std::is_same<Givaro::Modular<T1, C1>, Givaro::Modular<T2, C2>>::value>::type>
+//     {
+// 	public:
+// 	    using Element1 = typename Givaro::Modular<T1, C1>::Element;
+// 	    using Element2 = typename Givaro::Modular<T2, C2>::Element;
+	
+// 		Hom(const Givaro::Modular<T1, C1>& S, const Givaro::Modular<T2, C2>& T)
+// 		{
+// 			integer ps, pt;
+// 			if (S.characteristic(ps) != T.characteristic(pt)) throw NoHomError();
+// 		}
+		
+// 		inline Element2& image(Element2& t, const Element1& s) const
+// 		{
+// 			return Givaro::Caster<Element2,Element1>(t,s);
+// 		}
+		
+// 		// assumes t normalized.
+// 		inline Element1& preimage(Element1& s, const Element2& t) const
+// 		{
+// 			return Givaro::Caster<Element1,Element2>(s,t);
+// 		}
+// 	};
+// }// namespace LinBox
+
 namespace LinBox
 {
 
-	template<class _Target>
-	class Hom<UnparametricField<integer>, _Target> {
+    template<class _Source>
+	class Hom<_Source, Givaro::ZRing<Integer> > {
 
 	public:
-		typedef UnparametricField<integer> Source;
-		typedef _Target Target;
+        typedef Givaro::ZRing<Integer> Target;
+		typedef _Source Source;
 		typedef typename Source::Element SrcElt;
-		typedef typename Target::Element Elt;
+		typedef Integer Elt;
 
 		Hom(const Source& S, const Target& T) :
 			_source (S), _target (T)
 		{}
-		inline Elt& image(Elt& t, const SrcElt& s)
+		inline Integer& image(Integer& t, const SrcElt& s)
 		{
-			_target. init (t, s);
-			return t;
+			return Givaro::Caster(t,s);
 		}
-		inline SrcElt& preimage(SrcElt& s, const Elt& t)
+		inline SrcElt& preimage(SrcElt& s, const Integer& t)
 		{
-			_target. convert (s, t);
-			return s;
+                        return Givaro::Caster(s,t);
 		}
 		const Source& source() { return _source;}
 		const Target& target() { return _target;}
 
 	protected:
-		Source _source;
-		Target _target;
-	}; // end Hom
-
-	template<>
-	class Hom<UnparametricField<integer>, UnparametricField<integer> > {
-
-	public:
-		typedef UnparametricField<integer> Source;
-		typedef UnparametricField<integer> Target;
-		typedef Source::Element SrcElt;
-		typedef Target::Element Elt;
-
-		Hom(const Source& S, const Target& T) :
-			_source (S), _target (T)
-		{}
-		inline Elt& image(Elt& t, const SrcElt& s)
-		{
-			t = s;
-			return t;
-		}
-		inline SrcElt& preimage(SrcElt& s, const Elt& t)
-		{
-			s = t;
-			return s;
-		}
-		const Source& source() { return _source;}
-		const Target& target() { return _target;}
-
-	protected:
-		Source _source;
-		Target _target;
+		const Source& _source;
+		const Target& _target;
 	}; // end Hom
 
+        
 	template<class _Target>
-	class Hom<PID_integer, _Target> {
+	class Hom<Givaro::ZRing<Integer>, _Target> {
 
 	public:
-		typedef PID_integer Source;
+		typedef Givaro::ZRing<Integer> Source;
 		typedef _Target Target;
 		typedef typename Source::Element SrcElt;
 		typedef typename Target::Element Elt;
@@ -243,11 +219,13 @@ namespace LinBox
 		Hom(const Source& S, const Target& T) :
 			_source (S), _target (T)
 		{}
-		inline Elt& image(Elt& t, const SrcElt& s) {
+		inline Elt& image(Elt& t, const SrcElt& s)
+		{
 			_target. init (t, s);
 			return t;
 		}
-		inline SrcElt& preimage(SrcElt& s, const Elt& t) {
+		inline SrcElt& preimage(SrcElt& s, const Elt& t)
+		{
 			_target. convert (s, t);
 			return s;
 		}
@@ -255,80 +233,82 @@ namespace LinBox
 		const Target& target() { return _target;}
 
 	protected:
-		Source _source;
-		Target _target;
+		const Source& _source;
+		const Target& _target;
 	}; // end Hom
 
-
 	template<>
-	class Hom<PID_integer, PID_integer> {
+	class Hom<Givaro::ZRing<Integer>, Givaro::ZRing<Integer> > {
 
 	public:
-		typedef PID_integer Source;
+		typedef Givaro::ZRing<Integer> Source;
 		typedef Source Target;
-		typedef Source::Element SrcElt;
-		typedef Target::Element Elt;
+		typedef Integer SrcElt;
+		typedef Integer Elt;
 
 		Hom(const Source& S, const Target& T) :
 			_source (S), _target (T)
 		{}
 		inline Elt& image(Elt& t, const SrcElt& s)
-		{
-			_target. assign (t, s);
-			return t;
+        {   
+			return t=s;
 		}
-		inline SrcElt& preimage(SrcElt& s, const Elt& t) {
-			_target. assign (s, t);
-			return s;
+		inline SrcElt& preimage(SrcElt& s, const Elt& t)
+		{
+			return s=t;
 		}
 		const Source& source() { return _source;}
 		const Target& target() { return _target;}
 
 	protected:
-		Source _source;
-		Target _target;
+		const Source& _source;
+		const Target& _target;
 	}; // end Hom
 
-
-#if 0
-#ifdef __FIELD_MODULAR_H
-	// Dan Roche mapping from UnparametricField to Modular - for integer
-	// computations that use mod one or more primes and possibly chinese
-	// remaindering.
-	template<class _INT1, class _INT2>
-	class Hom<UnparametricField<_INT1 >,Modular<_INT2 > > {
+	template <class _Target>
+	class Hom<Givaro::QField<Givaro::Rational>, _Target> {
 
 	public:
-		typedef UnparametricField<_INT1 > Source;
-		typedef Modular<_INT2 > Target;
-		typedef _INT1 SrcElt;
-		typedef _INT2 Elt;
+		typedef Givaro::QField<Givaro::Rational> Source;
+		typedef _Target Target;
+		typedef typename Source::Element SrcElt;
+		typedef typename Target::Element Elt;
 
 		Hom(const Source& S, const Target& T) :
-			_source(S), _target(T)
-		{}
-
-		inline Elt& image(Elt& t, const SrcElt& s) {
-			integer temp;
-			return _target.init(t,_source.convert(temp,s));
+			_source (S), _target(T)
+		{ }
+		Elt& image(Elt& t, const SrcElt& s) {
+			if (_source.isOne(s.deno())) {
+				return _target.init(t,s.nume());
+			}
+			else if (_source.isOne(s.nume())) {
+				_target.init(t,s.deno());
+				return _target.invin(t);
+			}
+			else {
+				_target. init (tmp, s.deno());
+				_target. init (t, s.nume());
+				return _target. divin (t, tmp);
+			}
 		}
-		inline SrcElt& preimage(SrcElt& s, const Elt& t) {
-			integer temp;
-			return _source.init(s,_source.convert(temp,t));
+            // Warning, by default convert only the numerator
+		SrcElt& preimage(SrcElt& s, const Elt& t) {
+			_target. convert (s.nume(), t);
+			_source. init (s, s.nume());
+			return s;
 		}
-		const Source& source() { return _source; }
-		const Target& target() { return _target; }
+		const Source& source() { return _source;}
+		const Target& target() { return _target;}
 
 	protected:
+		Elt tmp;
 		Source _source;
 		Target _target;
 	}; // end Hom
 
-#endif // __FIELD_MODULAR_H
-#endif
 
 } // namespace LinBox
-#endif //__LINBOX_field_unparametric_H
+
 
 #ifdef __LINBOX_HAVE_NTL
 namespace LinBox
@@ -356,7 +336,7 @@ namespace LinBox
 		const Target& target() { return _target;}
 
 	protected:
-		integer tmp;
+		Integer tmp;
 		Source _source;
 		Target _target;
 	}; // end Hom
@@ -389,83 +369,6 @@ namespace LinBox
 }
 #endif //__LINBOX_HAVE_NTL
 
-#ifdef __LINBOX_field_gmp_rational_H
-namespace LinBox
-{
-	template <class _Target>
-	class Hom<GMPRationalField, _Target> {
-
-	public:
-		typedef GMPRationalField Source;
-		typedef _Target Target;
-		typedef typename Source::Element SrcElt;
-		typedef typename Target::Element Elt;
-
-		Hom(const Source& S, const Target& T) :
-			_source (S), _target(T)
-		{ }
-		Elt& image(Elt& t, const SrcElt& s) {
-			_source. get_num (num, s);
-			_source. get_den (den, s);
-			if (den == 1) {
-				return _target.init(t,num);
-			}
-			else if (num == 1) {
-				_target.init(t,den);
-				return _target.invin(t);
-			}
-			else {
-				_target. init (tmp, den);
-				_target. init (t, num);
-				return _target. divin (t, tmp);
-			}
-			// 			_target. init (t, den);
-			// 			return _target. invin (t);
-		}
-		SrcElt& preimage(SrcElt& s, const Elt& t) {
-			_target. convert (num, t);
-			_source. init (s, num);
-			return s;
-		}
-		const Source& source() { return _source;}
-		const Target& target() { return _target;}
-
-	protected:
-		integer num, den;
-		Elt tmp;
-		Source _source;
-		Target _target;
-	}; // end Hom
-
-	template <>
-	class Hom<GMPRationalField, GMPRationalField> {
-
-	public:
-		typedef GMPRationalField Source;
-		typedef Source Target;
-		typedef Source::Element SrcElt;
-		typedef Target::Element Elt;
-
-		Hom(const Source& S, const Target& T) :
-			_source (S), _target(T)
-		{}
-		Elt& image(Elt& t, const SrcElt& s) {
-			_target.assign(t, s);
-			return t;
-		}
-		SrcElt& preimage(SrcElt& s, const Elt& t) {
-			_source.assign(s, t);
-			return s;
-		}
-		const Source& source() { return _source;}
-		const Target& target() { return _target;}
-
-	protected:
-		Source _source;
-		Target _target;
-	}; // end Hom
-}
-#endif //__LINBOX_field_gmp_rational_H
 
 #ifdef __LINBOX_field_gf2_H
 namespace LinBox
@@ -545,13 +448,14 @@ namespace LinBox
 
 }
 
-#include "linbox/field/Givaro/givaro-extension.h"
+#include <givaro/extension.h>
+
 namespace LinBox
 {
 	template<>
-	class Hom < GF2, GivaroExtension<GF2> > {
+	class Hom < GF2, Givaro::Extension<GF2> > {
 		typedef GF2 Source;
-		typedef GivaroExtension<GF2> Target;
+		typedef Givaro::Extension<GF2> Target;
 	public:
 		typedef Source::Element SrcElt;
 		typedef Target::Element Elt;
@@ -614,10 +518,10 @@ namespace LinBox
 namespace LinBox
 {
 	template<>
-	class Hom <GivaroGfq,GivaroGfq> {
+	class Hom <Givaro::GFq,Givaro::GFq> {
 	public:
-		typedef GivaroGfq Source;
-		typedef GivaroGfq Target;
+		typedef Givaro::GFq Source;
+		typedef Givaro::GFq Target;
 
 		typedef Source::Element SrcElt;
 		typedef Target::Element Elt;
@@ -636,7 +540,7 @@ namespace LinBox
 		 * image(t, s) implements the homomorphism, assigning the
 		 * t the value of the image of s under the mapping.
 		 *
-		 * The default behaviour goes through integers.
+		 * The default behaviour goes through Integers.
 		 */
 		Elt& image(Elt& t, const SrcElt& s)
 		{
@@ -648,7 +552,7 @@ namespace LinBox
 		 * An error may be thrown, a conventional value may be set, or
 		 * an arb value set.
 		 *
-		 * The default behaviour goes through integers.
+		 * The default behaviour goes through Integers.
 		 */
 		SrcElt& preimage(SrcElt& s, const Elt& t)
 		{
@@ -658,7 +562,7 @@ namespace LinBox
 		const Target& target() { return _target;}
 
 	private:
-		integer tmp;
+		Integer tmp;
 		Source _source;
 		Target _target;
 	}; // end Hom
diff --git a/linbox/field/image-field.h b/linbox/field/image-field.h
new file mode 100644
index 0000000..135a9ac
--- /dev/null
+++ b/linbox/field/image-field.h
@@ -0,0 +1,86 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/* linbox/field/image-field.h
+ * Written by David Saunders
+ * See COPYING for license information.
+ */
+
+#ifndef __IMAGE_FIELD_H
+#define __IMAGE_FIELD_H
+
+#include "linbox/field/hom.h"
+namespace LinBox
+{
+
+/**
+ * ImageFields are fields which are targets of a ring homomorphism from a source ring.
+ * Usually the source ring is ZZ or another field.
+ * The ImageField can be viewed as a module over the source ring.  Hence we could think
+ * of the source as the scalar domain.  Thus a mul of a source element times a
+ * image element can be thought of as a scalar multiplication and we call the op smul().
+ * Often this can be done faster than taking the image of the scalar and multiplying
+ * in the image field.
+ *
+ * ImageFields provide smul() and saxpy() as well as the image() and preimage() maps of the
+ * homomorphism.
+ *
+ * The generic default is to build the ImageField functions directly from a Hom object,
+ * but the intention is to provide efficient specializations for specific cases.
+ *
+ * Issues abound.  How do we convey that the scalars are small so a implementation
+ * of a modular image can be efficient in that case?
+ */
+template<class Source, class Target>
+class ImageField: public Target
+{   protected:
+	typedef typename Target::Element Elt;
+	typedef typename Source::Element SrcElt;
+	Hom<Source, Target> _nat;
+    public:
+	ImageField(){}
+	ImageField(Hom<Source, Target> nat):Target(nat.target()),_nat(nat) {}
+
+	ImageField(Source& S, Target& T) : Target(T),_nat(Hom<Source,Target>(S, T)) {}
+
+	Elt & image(Elt& t, const SrcElt& s)
+	{ return _nat.image(t, s); }
+
+	SrcElt& preimage(SrcElt& s, const Elt& t)
+	{ return _nat.preimage(s, t); }
+
+	/// y <-- a*x
+	Elt& smul(Elt& y, const SrcElt& a, const Elt& x)
+	{ Elt w;mul(y,_nat.image(w,a),x);}
+
+	/// x <-- a*x
+	Elt& smulin(Elt& x, const SrcElt& a)
+	{ Elt w;   return this->mulin(x, _nat.image(w, a)); }
+
+	/// z <-- a*x + y
+	Elt& saxpy(Elt& z, const SrcElt& a, const Elt& x, const Elt& y)
+	{ Elt w;   return this->axpy(z, _nat.image(w, a), x, y); }
+
+	/// y <-- a*x + y
+	Elt& saxpyin(Elt& y, const SrcElt& a, const Elt& x)
+	{ Elt w;   return this->axpyin(y, _nat.image(w, a), x); }
+
+	/*
+	/// dot product of source vector and image vector
+	Elt& dot(vector of src, vector of target)
+	{ allocate vector of target; map vector of src to it; target dot }
+
+	/// accumulator of source * target product (i.e accum results of smul's).
+	accumulator...
+	*/
+}; // ImageField<Source, Target>
+
+
+// Trial specialization.  Try one member. one could similarly do other member functions.
+// Delete this when better examples are available later.
+//
+template<> uint32_t& ImageField<Givaro::Modular<uint16_t>, Givaro::Modular<uint32_t> >::
+smul(uint32_t& y, const uint16_t& a, const uint32_t & x)
+	{ return mul(y, static_cast<uint32_t>(a), x); }
+
+}// namespace LinBox
+#endif // __IMAGE_FIELD_H
diff --git a/linbox/field/integers.doxy b/linbox/field/integers.doxy
index df1b199..9ca2a2e 100644
--- a/linbox/field/integers.doxy
+++ b/linbox/field/integers.doxy
@@ -29,9 +29,8 @@
  * LinBox provides :
  * - LinBox::Integer is the Givaro representation of an integer (Givaro::Integer).
  * - LinBox::integer is a synonym
- * - LinBox::PID_integer is a domain (ref ???) to perform integers operation on.
- * - Others ?
- *
+ * 
+ * The Ring of integers is provided by Givaro: Givaro::ZRing<Integer>
  *
  * other use of integers ?
  *
diff --git a/linbox/field/lidia-gfq.h b/linbox/field/lidia-gfq.h
deleted file mode 100644
index 9a4d5f4..0000000
--- a/linbox/field/lidia-gfq.h
+++ /dev/null
@@ -1,776 +0,0 @@
-/* linbox/field/lidia-gfq.h
- * Copyright (C) 2002 Pascal Giorgi
- *
- * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- *
- * ------------------------------------
- *
- * 
- * ========LICENCE========
- * This file is part of the library LinBox.
- * 
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This 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
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-
-#ifndef __LINBOX_lidia_gfq_H
-#define __LINBOX_lidia_gfq_H
-
-//-----------------------------------
-// Files of C/C++ library
-#include <iostream>
-
-//-----------------------------------
-// Files of LiDIA library
-#include "LiDIA/gf_element.h"
-#include "LiDIA/bigint.h"
-
-//-----------------------------------
-// Files of LinBox library
-#include "linbox/integer.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/randiter/lidia-gfq.h"
-#include "linbox/linbox-config.h"
-#include "linbox/field/field-traits.h"
-
-#ifdef __LINBOX_XMLENABLED
-
-#include "linbox/util/xml/linbox-reader.h"
-#include "linbox/util/xml/linbox-writer.h"
-
-#include <string>
-#include <vector>
-
-#endif
-
-//------------------------------------
-
-/*! @file field/lidia-gfq.h
- * @brief LiDIA : NO DOC
-* \ingroup field
-*/
-
-// Namespace in which all LinBox library code resides
-namespace LinBox
-{
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	class LidiaGfq;
-
-	template<>
-	struct ClassifyRing<LidiaGfq> {
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-	/** @brief defines the  Galois Field GF(p<sup>k</sup>).
-
-	* Inherits from \c galois_field of \ref LiDIA.
-	 * @pre \p p must be prime.
-	\ingroup field
-	 */
-	class LidiaGfq  : public LiDIA::galois_field, public FieldInterface {
-	public:
-
-		/** Element type.
-		 *  This type is inherited from the LiDIA class LiDIA::gf_element
-		 */
-		typedef LiDIA::gf_element  Element;
-
-
-		/** Random element generator which is define in the wrapper LIDIA_randiter
-		 */
-		typedef LidiaGfqRandIter<LidiaGfq>  RandIter;
-
-
-
-		/** Default constructor of the field
-		 */
-		LidiaGfq() {}
-
-
-		/** @brief Constructor of GF(p^k).
-
-		 *  A GF(p^k) field is constructed through
-		 *  the constructor of LiDIA LiDIA::galois_field
-		 *  We need a double cast to pass integer arguments to the LiDIA constructor
-		 */
-		LidiaGfq(const integer& p , const integer& k=1) :
-			LiDIA::galois_field(static_cast<LiDIA::bigint>(double(p)),
-				     static_cast<LiDIA::lidia_size_t>(int(k))) {}
-
-
-		/** Copy constructor
-		 */
-		LidiaGfq(const LidiaGfq& F) :
-		       	LiDIA::galois_field(F)
-		{}
-
-#ifdef __LINBOX_XMLENABLED
-		// XML LinBox::Reader constructor
-		LidiaGfq(LinBox::Reader &R) :
-		       	LiDIA::galois_field()
-		{
-			integer p, k;
-			if(!R.expectTagName("field") || !R.expectChildTag()) return;
-			R.traverseChild();
-			if(!R.expectTagName("finite") || !R.expectChildTag()) return;
-			R.traverseChild();
-			if(!R.expectTagName("characteristic") || !R.expectChildTag()) return;
-			R.traverseChild();
-			if(!R.expectTagNum(p)) return;
-			R.upToParent();
-			R.upToParent();
-
-			if(R.getNextChild()) {
-				if(!R.expectChildTag()) return;
-				R.traverseChild();
-				if(!R.expectTagName("extension") || !R.expectChildTag()) return;
-				R.traverseChild();
-				if(!R.expectTagNum(k)) return;
-
-				R.upToParent();
-				R.upToParent();
-				R.getPrevChild();
-			}
-			else {
-				k = Integer(1);
-			}
-			R.upToParent();
-
-			LidiaGfq oth(p, k);
-			*this = oth;
-
-			return;
-
-		}
-#endif
-
-
-		/** Destructor
-		 */
-		~LidiaGfq() {}
-
-
-
-
-		/** Assignment operator.
-		 * Assigns unparam_field object F to field.
-		 * @param  F unparam_field object.
-		 */
-		LidiaGfq& operator=(const LidiaGfq& F)
-		{
-			return *this = F;
-		}
-
-		/** @name Object management
-		 */
-
-		//@{
-
-
-		/** Initialization of field Element from an integer.
-		 * Behaves like C++ allocator construct.
-		 * This function assumes the output field Element x has already been
-		 * constructed, but that it is not already initialized.
-		 * We also need to define the Element over the field.
-		 * So what we always initialize the Element with the zero field value.
-		 * If an integer different from zero is passed to the function the Element
-		 * is initialized to a constant polynom of Z/pZ
-		 * @return reference to field Element.
-		 * @param x field Element to contain output (reference returned).
-		 * @param y integer.
-		 */
-		Element& init(Element& x , const integer& y=0) const
-		{
-			x.assign_zero(*this);
-			if (y==1)
-				x.assign_one(*this);
-			else
-				{
-					if (y!=0)
-						if (this->degree() > 1)
-							{
-								LiDIA::Fp_polynomial Pol;
-								LiDIA::bigint p=static_cast<const LiDIA::galois_field&>(*this).characteristic();
-								Pol.set_modulus(p);
-								//Pol.set_max_degree((x.get_field()).degree());
-
-								//integer rem, quo,tmp=y;
-								LiDIA::bigint rem, quo ,tmp;
-								LiDIA::string_to_bigint(std::string(y).data(),tmp);
-								LiDIA::lidia_size_t deg = this->degree();
-								for(LiDIA::lidia_size_t i=0;i<deg;i++)
-								 	{
-										quo=tmp/p;
-										rem=tmp%p;
-										tmp=quo;
-										if (rem != LiDIA::bigint(0))
-											Pol.set_coefficient(rem,i);
-									}
-								//Element e(x.get_field());
-								x.set_polynomial_rep(Pol);
-								//x.assign(e);
-							}
-						else {
-							LiDIA::bigint tmp;
-							LiDIA::string_to_bigint(std::string(y).data(),tmp);
-							x.assign(tmp);
-						}
-				}
-			return x;
-		}
-
-
-
-		/** Conversion of field base Element to an integer.
-		 * This function assumes the output field base Element x has already been
-		 * constructed, but that it is not already initialized.
-		 * As Elements are represented by polynom the convert function return
-		 * the valuation of polynom in characteristic by the Horner Method.
-		 * That keeps unicity of each Element.
-		 * @return reference to an integer.
-		 * @param x integer to contain output (reference returned).
-		 * @param y constant field base Element.
-		 */
-		integer& convert(integer& x , const Element& y ) const
-		{
-			LiDIA::bigint fx(0) , X((y.get_field()).characteristic());
-			LiDIA::bigint tmp;
-
-
-			for(int i=(int)(y.get_field()).degree();i>0;i--)
-				{
-					(y.polynomial_rep()).get_coefficient(tmp,i);
-					fx=fx+tmp;
-					fx=fx*X;
-				}
-			(y.polynomial_rep()).get_coefficient(tmp,0);
-			fx= fx + tmp;
-
-			//long i;
-			//fx.longify(i);
-			unsigned int size= fx.bit_length();
-
-			char s[(size>>2)+4];
-			LiDIA::bigint_to_string(fx,s);
-
-			return x=integer(s);
-		}
-
-
-
-
-		/** Assignment of one field Element to another.
-		 * This function assumes both field Elements have already been
-		 * constructed and initialized.
-		 * @return reference to x
-		 * @param  x field Element (reference returned).
-		 * @param  y field Element.
-		 */
-		Element& assign(Element& x, const Element& y) const
-		{
-			x.assign(y);
-			return x;
-		}
-
-
-
-
-		/** Cardinality.
-		 * Return integer representing cardinality of the field.
-		 * Returns  p^k.
-		 * @return constant reference to integer representing cardinality
-		 *	       of the field.
-		 */
-		integer& cardinality(integer& c) const
-		{
-			LiDIA::bigint tmp=number_of_elements();
-			unsigned int size= tmp.bit_length();
-			char s[(size>>2)+4];
-			LiDIA::bigint_to_string(tmp,s);
-
-			return c=integer(s);
-
-		}
-
-
-
-		/** Characteristic.
-		 * Return integer representing characteristic of the field.
-		 * Returns p.
-		 * @return constant reference to integer representing characteristic
-		 * 	       of the field.
-		 */
-		integer& characteristic(integer& c) const
-		{
-
-			LiDIA::bigint tmp = static_cast<const LiDIA::galois_field&>(*this).characteristic();
-			unsigned int size= tmp.bit_length();
-			char s[(size>>2)+4];
-			LiDIA::bigint_to_string(tmp,s);
-
-			return c= integer(s);
-		}
-
-
-		//@} Object Management
-
-		/** @name Arithmetic Operations
-		 * x <- y op z; x <- op y
-		 * These operations require all Elements, including x, to be initialized
-		 * before the operation is called.  Uninitialized field Elements will
-		 * give undefined results.
-		 */
-		//@{
-
-		/** Equality of two Elements.
-		 * This function assumes both field Elements have already been
-		 * constructed and initialized.
-		 * @return boolean true if equal, false if not.
-		 * @param  x field Element
-		 * @param  y field Element
-		 */
-		bool areEqual(const Element& x, const Element& y) const
-		{
-			return x==y;
-		}
-
-
-		/** Addition.
-		 * x = y + z
-		 * This function assumes all the field Elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field Element (reference returned).
-		 * @param  y field Element.
-		 * @param  z field Element.
-		 */
-		Element& add(Element& x, const Element& y, const Element& z) const
-		{
-			LiDIA::add(x,y,z);
-			return x;
-		}
-
-		/** Subtraction.
-		 * x = y - z
-		 * This function assumes all the field Elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field Element (reference returned).
-		 * @param  y field Element.
-		 * @param  z field Element.
-		 */
-		Element& sub(Element& x, const Element& y, const Element& z) const
-		{
-			LiDIA::subtract(x,y,z);
-			return x;
-		}
-
-		/** Multiplication.
-		 * x = y * z
-		 * This function assumes all the field Elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field Element (reference returned).
-		 * @param  y field Element.
-		 * @param  z field Element.
-		 */
-		Element& mul(Element& x, const Element& y, const Element& z) const
-		{
-			LiDIA::multiply(x,y,z);
-			return x;
-		}
-
-		/** Division.
-		 * x = y / z
-		 * This function assumes all the field Elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field Element (reference returned).
-		 * @param  y field Element.
-		 * @param  z field Element.
-		 */
-		Element& div(Element& x, const Element& y, const Element& z) const
-		{
-			LiDIA::divide(x,y,z);
-			return x;
-		}
-
-
-		/** Additive Inverse (Negation).
-		 * x = - y
-		 * This function assumes both field Elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field Element (reference returned).
-		 * @param  y field Element.
-		 */
-		Element& neg(Element& x, const Element& y) const
-		{
-			LiDIA::negate(x,y);
-			return x;
-		}
-
-
-
-		/** Multiplicative Inverse.
-		 * x = 1 / y
-		 * This function assumes both field Elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field Element (reference returned).
-		 * @param  y field Element.
-		 */
-		Element& inv(Element& x, const Element& y) const
-		{
-			LiDIA::invert(x,y);
-			return x;
-		}
-
-
-
-		/** Natural AXPY.
-		 * r  = a * x + y
-		 * This function assumes all field Elements have already been
-		 * constructed and initialized.
-		 * @return reference to r.
-		 * @param  r field Element (reference returned).
-		 * @param  a field Element.
-		 * @param  x field Element.
-		 * @param  y field Element.
-		 */
-		Element& axpy(Element& r,
-			      const Element& a,
-			      const Element& x,
-			      const Element& y) const
-		{
-			return r=a*x+y;
-		}
-
-
-
-		/** Zero equality.
-		 * Test if field Element is equal to zero of field.
-		 * This function assumes the field Element has already been
-		 * constructed and initialized.
-		 * @return boolean true if equals zero of field, false if not.
-		 * @param  x field Element.
-		 */
-		bool isZero(const Element& x) const
-		{
-			return x.is_zero();
-		}
-
-
-
-		/** One equality.
-		 * Test if field Element is equal to one of field.
-		 * This function assumes the field Element has already been
-		 * constructed and initialized.
-		 * @return boolean true if equals one of field, false if not.
-		 * @param  x field Element.
-		 */
-		bool isOne(const Element& x) const
-		{
-			return x.is_one();
-		}
-
-
-
-		/** Inplace Addition.
-		 * x += y
-		 * This function assumes both field Elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field Element (reference returned).
-		 * @param  y field Element.
-		 */
-		Element& addin(Element& x, const Element& y) const {
-			return x+=y;
-		}
-
-		/** Inplace Subtraction.
-		 * x -= y
-		 * This function assumes both field Elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field Element (reference returned).
-		 * @param  y field Element.
-		 */
-		Element& subin(Element& x, const Element& y) const {
-			return x-=y;
-		}
-
-		/** Inplace Multiplication.
-		 * x *= y
-		 * This function assumes both field Elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field Element (reference returned).
-		 * @param  y field Element.
-		 */
-		Element& mulin(Element& x, const Element& y) const {
-			return x*=y;
-		}
-
-		/** Inplace Division.
-		 * x /= y
-		 * This function assumes both field Elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field Element (reference returned).
-		 * @param  y field Element.
-		 */
-		Element& divin(Element& x, const Element& y) const {
-			return x/=y;
-		}
-
-
-		/** Inplace Additive Inverse (Inplace Negation).
-		 * x = - x
-		 * This function assumes the field Element has already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field Element (reference returned).
-		 */
-		Element& negin(Element& x) const
-		{
-			x.negate();
-			return x;
-		}
-
-
-
-		/** Inplace Multiplicative Inverse.
-		 * x = 1 / x
-		 * This function assumes the field Elementhas already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field Element (reference returned).
-		 */
-		Element& invin(Element& x) const
-		{
-			x.invert();
-			return x;
-		}
-
-
-
-		/** Inplace AXPY.
-		 * r  += a * x
-		 * This function assumes all field Elements have already been
-		 * constructed and initialized.
-		 * @return reference to r.
-		 * @param  r field Element (reference returned).
-		 * @param  a field Element.
-		 * @param  x field Element.
-		 */
-		Element& axpyin(Element& r, const Element& a, const Element& x) const
-		{
-			return  r+=a*x;
-		}
-
-		//@} Inplace Arithmetic Operations
-
-#ifndef __LINBOX_XMLENABLED
-		/** @name Input/Output Operations */
-		//@{
-
-		/** Print field.
-		 * @return output stream to which field is written.
-		 * @param  os  output stream to which field is written.
-		 */
-		std::ostream& write(std::ostream& os) const
-		{
-			integer c;
-			return os<<"corps de Galois GF("<<
-				characteristic(c)<<"^"<<degree()<<")";
-		}
-
-
-		/** Read field.
-		 * @return input stream from which field is read.
-		 * @param  is  input stream from which field is read.
-		 */
-		std::istream& read(std::istream& is) const
-		{
-			return is ;
-		}
-
-
-		/** Print field Element like a polynom.
-		 * @return output stream to which field Element is written.
-		 * @param  os  output stream to which field Element is written.
-		 * @param  e   field Element.
-		 */
-		std::ostream& write(std::ostream& os,const Element& e) const
-		{
-			/*integer tmp;
-			  (*this).convert(tmp,e);
-			  return os<<tmp;
-			*/
-			return os<<e;
-		}
-
-
-
-		/** Read field Element.
-		 * @return input stream from which field Element is read.
-		 * @param  is  input stream from which field Element is read.
-		 * @param  e   field Element.
-		 */
-		std::istream& read(std::istream& is, Element& e) const
-		{
-			// return is>>e;
-			integer tmp;
-			is>> tmp;
-			(*this).init(e,tmp);
-			return is;
-
-		}
-
-		//@}
-
-#else
-		std::ostream &write(std::ostream &os) const
-		{
-			LinBox::Writer W;
-			if( toTag(W))
-				W.write(os);
-
-			return os;
-		}
-
-		bool toTag(LinBox::Writer &W) const
-		{
-			LiDIA::bigint card, charac;
-			LiDIA::lidia_size_t deg;
-			std::string s;
-
-			W.setTagName("field");
-			W.setAttribute("implDetail", "lidia-gfq");
-
-			card = LiDIA::galois_field::number_of_elements();
-			W.setAttribute("cardinality", LinBox::Writer::numToString(s, card));
-			W.addTagChild();
-			W.setTagName("finite");
-
-			W.addTagChild();
-			W.setTagName("characteristic");
-			charac = LiDIA::galois_field::characteristic();
-			W.addNum(charac);
-			W.upToParent();
-
-			W.addTagChild();
-			W.setTagName("extension");
-			deg = LiDIA::galois_field::degree();
-			W.addNum(deg);
-			W.upToParent();
-
-			W.upToParent();
-
-			return true;
-		}
-
-		std::ostream &write(std::ostream &os, const Element &e) const
-		{
-			LinBox::Writer W;
-			if (toTag(W, e))
-				W.write(os);
-
-			return os;
-		}
-
-		bool toTag(LinBox::Writer &W, const Element &e) const
-		{
-			std::string s;
-			LiDIA::Fp_polynomial poly = e.polynomial_rep();
-			LiDIA::bigint accum = 0, base = LiDIA::galois_field::characteristic();
-			LiDIA::lidia_size_t i;
-
-			for(i = poly.degree(); i >= 0; i--) {
-				accum *= base;
-				accum += poly[i];
-			}
-
-			W.setTagName("cn");
-			W.addDataChild(LinBox::Writer::numToString(s, accum));
-
-			return true;
-		}
-
-		std::istream &read(std::istream &is, Element &e) const
-		{
-			LinBox::Reader R(is);
-			if( !fromTag(R, e)) {
-				is.setstate(std::istream::failbit);
-				if(!R.initalized())
-					is.setstate(std::istream::badbit);
-			}
-
-			return is;
-		}
-
-		bool fromTag(LinBox::Reader &R, Element &e) const
-		{
-			LiDIA::bigint total, base = LiDIA::galois_field::characteristic();
-			LiDIA::lidia_size_t deg = LiDIA::galois_field::degree(), i = 0;
-
-			if(!R.expectTagName("cn") || !R.expectTextNum(total)) return false;
-			LiDIA::Fp_polynomial f;
-			f.set_modulus(base);
-			f.set_max_degree(deg); // ensure the poly is correct size
-
-			// initalize the polynomial
-			while(total > 0) {
-				f[i] = total % base;
-				total /= base;
-				++i;
-			}
-
-
-			e.set_polynomial_rep(f);
-
-			return true;
-		}
-#endif
-
-
-		static inline integer getMaxModulus()
-		{ return integer( "9007199254740881" ); } // prevprime(2^53)
-
-	}; // class lidia-gfq
-
-	integer& FieldTraits< LidiaGfq >::maxExponent( integer& i )
-	{ return i = integer(2147483647); } // 2^31-1
-
-} // namespace LinBox
-
-
-#endif // __LINBOX_lidia_gfq_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/lidia.doxy b/linbox/field/lidia.doxy
deleted file mode 100644
index 55c60a4..0000000
--- a/linbox/field/lidia.doxy
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (C) 2010 Brice Boyer, part of LinBox, GNU LGPL, see COPYING
-/*
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*! @ingroup field
- at defgroup LiDIA LiDIA
-
- at brief NO DOC
-
-*/
-
-// vim:syntax=doxygen
diff --git a/linbox/field/lidia.h b/linbox/field/lidia.h
deleted file mode 100644
index 0574b13..0000000
--- a/linbox/field/lidia.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* linbox/field/lidia.h
- * Copyright (C) 2002 Pascal Giorgi
- *
- * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
- *
- * 
- * ========LICENCE========
- * This file is part of the library LinBox.
- * 
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This 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
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_field_lidia_H
-#define __LINBOX_field_lidia_H
-
-#include "linbox/field/lidia-gfq.h"
-
-#endif // __LINBOX_field_lidia_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/local2_32.h b/linbox/field/local2_32.h
deleted file mode 100644
index d8ef40a..0000000
--- a/linbox/field/local2_32.h
+++ /dev/null
@@ -1,337 +0,0 @@
-/* Copyright (C) 2010 LinBox
- * written by bds, wan
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-
-#ifndef __LINBOX_local2_32_H
-#define __LINBOX_local2_32_H
-
-#include "linbox/field/unparametric.h"
-#include "linbox/util/debug.h"
-#include "linbox/linbox-config.h"
-#include "linbox/field/field-traits.h"
-#include "linbox/integer.h"
-#include "linbox/field/field-traits.h"
-
-namespace LinBox
-{
-
-	template<typename Ring>
-	struct ClassifyRing;
-
-	struct Local2_32;
-
-	template<>
-	struct ClassifyRing<Local2_32> {
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-	/** \brief Fast arithmetic mod 2^32, including gcd.
-	 *
-	 * Extend UnparametricField<uint32_t> which is a representation
-	 * of Z_2^32. It is especially fast because it uses hardware arithmetic
-	 * directly.  This ring is a Local Principal Ideal Ring.
-	 *
-	 * These needed PIR functions are added:
-	 * gcdin(), isUnit(), also inv() is modified to work correctly.
-	 * The type Exponent is added: more effective rep of the powers of 2,
-	 * which are important because gcds are powers of 2).
-	 * This entails some new versions of divin(), mulin(), isUnit().
-	 *
-	 * Those are the function needed for the LocalSmith algorithm.
-	 * Further appropriate PIR functions may be added later.
-	 * \ingroup field
-	 */
-
-	struct Local2_32: public UnparametricField<uint32_t>
-	{
-	public:
-
-		typedef UnparametricField<uint32_t>::Element Element;
-		typedef enum {_min=0,_max=32} Exponent; // enum?
-		//Exponent& init(Exponent& a) { return a = 32; }
-
-		Local2_32 (int p=2, int exp=32) :
-			UnparametricField<uint32_t>(p,exp)
-		{
-			if(p != 2) throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be 2");
-			if(exp != 32) throw PreconditionFailed(__func__,__FILE__,__LINE__,"exponent must be 32");
-		}
-
-		/*
-		   static inline Element& gcd(Element& c, Element& a, const Element& b)
-		   {   c = a | b; Exponent k = 0;
-		   while (! (c & 1)) {c >>= 1; ++k;}
-		//gcdin (k, b);
-		cout << "gcd called" << endl;
-		return c = 1 << k;
-		}
-
-*/
-		// assume k is an exponent of 2.
-		static inline Exponent& gcdin(Exponent& k, const Element& b)
-		{   /*
-		       Element c = b >> k;
-		       c <<= k;
-		       Element d = b;
-		       std::cout << "c, b" << c << " " << b <<  "\n";
-		       if (c != b)  for(k = 0; ! (d & 1); ++k) d >>= 1;
-		       std::cout << "g, b =" << (int)k << " " << b << "\n";
-		       */
-			Element d = b;
-			int i;
-			for ( i = 0; (i < k) && (!(d&1)); ++ i) d >>= 1;
-			return k = Exponent(i);
-		}
-
-		static inline bool isUnit(const Exponent& a)
-		{   return a == 0;   }
-
-		static inline bool isZero(const Element& a)
-		{   return a == 0;   }
-
-		static inline bool isZero(const Exponent& a)
-		{   return a >= 32;   }
-
-		// not used ...
-		static inline bool isUnit(const Element& a)
-		{   return a & 1;   }
-
-		//Element& div(Element& c, const Element& a, const Element& b) const
-		//{   return c = NTL::rep(a)/NTL::GCD(NTL::rep(a),NTL::rep(b));   }
-		//
-
-		static inline Element& mulin(Element& a, const Exponent& k)
-		{
-			if (k >= 32) return a = 0;
-			else return a <<= k;
-		}
-
-		static inline Element& mulin(Element& a, const Element& b)  {
-			return a *= b;
-		}
-
-		static inline Element& axpyin(Element& r, const Element& x, const Element& y) {
-			return r += x * y;
-		}
-
-		/*
-		   static inline bool isDivisor(Element a, Element b)
-		   {   while (! (a ^ 1))
-		   {   if (b ^ 1) return false;
-		   a = a >> 1; b = b >> 1;
-		   }
-		   return true;
-		   }
-		   */
-
-		// assume k is an exponent of 2 and the power of 2 exactly divides a
-		static inline Element& divin(Element& a, const Exponent& k)
-		{   return a >>= k;   }
-
-		static inline Element& inv(Element& a, const Element& b) {
-
-			if (!isUnit(b))
-				throw PreconditionFailed(__func__,__FILE__,__LINE__,"inv: not a unit");
-			else {
-
-				Element g, s, t;
-
-				xgcd(g, s, t, b, -b);
-
-				return a = s - t;
-			}
-		}
-
-		static inline integer getMaxModulus()
-		{ return integer( "4294967296" ); } // 2^32
-
-	protected:
-
-		static  Element& xgcd(Element& d, Element& s, Element& t, const Element& a, const Element& b)
-		{
-
-			Element  u, v, u0, v0, u1, v1, u2, v2, q, r;
-
-			u1 = 1; v1 = 0;
-			u2 = 0; v2 = 1;
-			u = a; v = b;
-
-			while (v != 0) {
-				q = u / v;
-				//r = u % v;
-				r = u - q*v;
-				u = v;
-				v = r;
-				u0 = u2;
-				v0 = v2;
-				u2 =  u1 - q*u2;
-				v2 = v1- q*v2;
-				u1 = u0;
-				v1 = v0;
-			}
-
-
-			d = u;
-			s = u1;
-			t = v1;
-			//std::cout << "XGCD is called: d, s, t, a, b, sa + tb: " << d << ' '
-			//	<< s << ' ' << t << ' ' << a << ' ' << b << ' ' << s * a + t * b << '\n';
-			return d;
-
-			/*
-
-			//Element  u, v, u0, v0, u1, v1, u2, v2, q, r;
-
-			Element u, v, q, r;
-
-			int64_t  u0, u1, u2;
-
-			u1 = 1; //v1 = 0;
-			u2 = 0; //v2 = 1;
-			u = a; v = b;
-
-			if ( b == 0) {
-			s = 1;
-			t = 0;
-			return d = a ;
-			}
-
-			if (v != 0) {
-			q = u / v;
-			//r = u % v;
-			r = u - q*v;
-			u = v;
-			v = r;
-			u0 = u2;
-			//v0 = v2;
-			u2 =  u1 - q * u2;
-			//v2 = v1- q * v2;
-			u1 = u0;
-			//v1 = v0;
-
-			}
-
-			while (v != 0) {
-			r = u;
-			while ( r >= v) {
-			r = u - v;
-
-			u2 = u1 - u2;
-			}
-			u0 = u2;
-			u1 = u0;
-			u = v;
-			v = r;
-
-
-			}
-
-
-			while (v != 0) {
-			q = u / v;
-			//r = u % v;
-			r = u - q*v;
-			u = v;
-			v = r;
-
-			u0 = u2;
-			//v0 = v2;
-			u2 =  u1 - q * u2;
-			//v2 = v1- q * v2;
-			u1 = u0;
-			//v1 = v0;
-			}
-
-
-			d = u;
-			s = u1;
-
-			t = ((int64_t) d - u1 * (int64_t) a) / (int64_t)b;
-
-			//std::cout << "XGCD is called: d, s, t, a, b, sa + tb: " << d << ' '
-			//<< s << ' ' << t << ' ' << a << ' ' << b << ' ' << s * a + t * b << '\n';
-			return d;
-
-
-			*/
-		}
-
-
-		/** @brief
-		 * Half GCD
-		 * g = gcd (a, b).
-		 * exists t, such that: s * a + t * b = g.
-		 * return g.
-		 */
-		static Element& HGCD (Element& g, Element& s, const Element& a, const  Element& b) {
-
-			Element  u, v, u0, u1, u2, q, r;
-
-			u1 = 1;
-			u2 = 0;
-			u = a; v = b;
-
-			while (v != 0) {
-				q = u / v;
-				//r = u % v;
-				r = u - q*v;
-				u = v;
-				v = r;
-
-				u0 = u2;
-
-				u2 =  u1 - q*u2;
-
-				u1 = u0;
-
-			}
-
-
-			g = u;
-			s = u1;
-
-			return g;
-
-		}
-
-	};
-
-	template<>
-	bool FieldTraits< Local2_32 >::goodModulus( const integer& i ) {
-		return i == Local2_32::getMaxModulus();
-	}
-
-} // namespace LinBox
-
-#endif // __LINBOX_local2_32_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/modular-balanced.h b/linbox/field/modular-balanced.h
deleted file mode 100644
index 5dd8d17..0000000
--- a/linbox/field/modular-balanced.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* linbox/field/modular-balanced.h
- * Copyright (C) 2010 LinBox
- * Written by Brice Boyer <brice.boyer at imag.fr>
- *
- * 
- * ========LICENCE========
- * This file is part of the library LinBox.
- * 
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This 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
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-/** @file field/modular-balanced.h
- * @ingroup field
- * @brief Common header for any modular-balanced field.
- * Use <code>\#include<modular-balanced></code> to get access to any modular
- * balanced representation.
- */
-
-#ifndef __LINBOX_modular_balanced_H
-#define __LINBOX_modular_balanced_H
-
-#include "linbox/field/Modular/modular-balanced-float.h"
-#include "linbox/field/Modular/modular-balanced-double.h"
-#include "linbox/field/Modular/modular-balanced-int32.h"
-#ifdef __LINBOX_HAVE_INT64
-#include "linbox/field/Modular/modular-balanced-int64.h"
-#endif
-
-#endif
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/modular.doxy b/linbox/field/modular.doxy
deleted file mode 100644
index 19ec321..0000000
--- a/linbox/field/modular.doxy
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (C) 2010 Brice Boyer, part of LinBox, GNU LGPL, see COPYING
-/*
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*! @ingroup field
-  @defgroup modular Modular
-
-  @brief Modular Field is a representation of \f$\mathbf{Z}/p\mathbf{Z}\f$.
-
-  - Modular
-  - Modular Balanced
-
- */
-
-// vim:syntax=doxygen
-
diff --git a/linbox/field/modular.h b/linbox/field/modular.h
deleted file mode 100644
index b98f955..0000000
--- a/linbox/field/modular.h
+++ /dev/null
@@ -1,842 +0,0 @@
-/* linbox/field/modular.h
- * Copyright (C) 1999-2001 William J Turner,
- *               2001 Bradford Hovinen
- *
- * Written by William J Turner <wjturner at math.ncsu.edu>,
- *            Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * ------------------------------------
- * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * LargeModular is now replace by a class Modular parameterized on the element
- * type. So, the old LargeModular is equivalent to Modular<integer>. All other
- * interface details are exactly the same.
- *
- * Renamed from large-modular.h to modular.h
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-/*! @file field/modular.h
- * @ingroup field
- * @brief A Modular field is a representations of <code>Z/mZ</code>.
- * This file groups many implementations/specialisations of modular fields.
- *   - Modular arithmetic is provided in the <code>ModularXXX<T></code> classes.
- *   - Specialisations for \ref FieldAXPY, \ref MVProductDomain, \ref DotProductDomain.
- *   - Random Iterators
- *   .
- *
- * @bug move Element& init(const Element&) to FFPACK. use using more..
- */
-
-#ifndef __LINBOX_field_modular_H
-#define __LINBOX_field_modular_H
-
-#include <iostream>
-#include <climits>
-#include <cmath>
-
-#include "linbox/integer.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/matrix/matrix-domain.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/util/field-axpy.h"
-#include "linbox/vector/vector-traits.h"
-#include "linbox/linbox-config.h"
-#include "linbox/field/field-traits.h"
-
-
-// Namespace in which all LinBox code resides
-namespace LinBox
-{
-	template <class Element>
-	class Modular;
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	template <class Element>
-	struct ClassifyRing<Modular<Element> >
-	{
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-	template <class Element>
-	struct ClassifyRing<Modular<Element> const>
-	{
-		typedef RingCategories::ModularTag categoryTag;
-	};
-
-
-	/** * <!-- @name ModularBase-->
-	 * \brief Base for prime fields where the elements are represented by various primitive types (and their operations).
-	 * \ingroup field
-	 * \defgroup Fields Fields <!--for old \ref Fields...-->
-	 *
-	 *
-	 * Normally use it's children.  This class is of interest for the
-	 * developer of a new field representation.
-	 *
-	 *
-	 * This parameterized field can be used to construct any prime field.
-	 * Typical use would be Modular<integer> for integers modulo a large
-	 * prime, Modular<long> Modular<long long> for integers modulo a wordsize
-	 * prime, etc. for integers modulo a half-wordsize prime.
-	 */
-	template <class _Element>
-	class ModularBase {
-	public:
-
-		/*- Element type
-		*/
-		typedef _Element Element;
-
-		/*- Random iterator generator type.
-		 * It must meet the common object interface of random element generators
-		 * as given in the the archetype RandIterArchetype.
-		 */
-		class RandIter;
-
-		/*- @name Object Management
-		*/
-		//@{
-
-		/*- Default constructor.
-		*/
-		ModularBase (void) {}
-
-		/*- Constructor from an element type.
-		 * Sets the modulus of the field throug the static member of the
-		 * element type.
-		 * @param modulus constant reference to integer prime modulus
-		 */
-		ModularBase (unsigned long modulus, int e = 1) :
-			_modulus ((Element)modulus)
-		{}
-
-		/*- Constructor from an integer.
-		 * Sets the modulus of the field throug the static member of the
-		 * element type.
-		 * @param modulus constant reference to integer prime modulus
-		 */
-		ModularBase (const integer &modulus) :
-			_modulus ((Element) modulus)
-		{}
-
-		/*- Copy constructor.
-		 * Constructs Modular object by copying the field.
-		 * This is required to allow field objects to be passed by value
-		 * into functions.
-		 * @param  F Modular object.
-		 */
-		ModularBase (const ModularBase<Element> &F) :
-			_modulus (F._modulus)
-		{}
-
-		/*- Conversion of field base element to a template class T.
-		 * This function assumes the output field base element x has already been
-		 * constructed, but that it is not already initialized.
-		 * @return reference to template class T.
-		 * @param x template class T to contain output (reference returned).
-		 * @param y constant field base element.
-		 */
-		integer &convert (integer &x, const Element &y) const
-		{
-			return x = y;
-		}
-
-		double &convert (double& x, const Element &y) const
-		{
-			return  x= (double) y;
-		}
-
-		float &convert (float& x, const Element &y) const
-		{
-			return  x= (float) y;
-		}
-
-		/*- Assignment of one field base element to another.
-		 * This function assumes both field base elements have already been
-		 * constructed and initialized.
-		 * @return reference to x
-		 * @param  x field base element (reference returned).
-		 * @param  y field base element.
-		 */
-		Element &assign (Element &x, const Element &y) const
-		{
-			return x = y;
-		}
-
-		/*- Cardinality.
-		 * Return integer representing cardinality of the domain.
-		 * Returns a non-negative integer for all domains with finite
-		 * cardinality, and returns -1 to signify a domain of infinite
-		 * cardinality.
-		 * @return integer representing cardinality of the domain
-		 */
-		integer &cardinality (integer &c) const
-		{
-			return c = _modulus;
-		}
-
-		integer cardinality () const
-		{
-			return  _modulus;
-		}
-
-		/*- Characteristic.
-		 * Return integer representing characteristic of the domain.
-		 * Returns a positive integer to all domains with finite characteristic,
-		 * and returns 0 to signify a domain of infinite characteristic.
-		 * @return integer representing characteristic of the domain.
-		 */
-		integer &characteristic (integer &c) const
-		{
-			return c = _modulus;
-		}
-
-		unsigned long &characteristic (unsigned long &c) const
-		{
-			return c = _modulus;
-		}
-
-
-		integer characteristic () const
-		{
-			return  _modulus;
-		}
-
-		//@} Object Management
-
-		/*- @name Arithmetic Operations
-		 * x <- y op z; x <- op y
-		 * These operations require all elements, including x, to be initialized
-		 * before the operation is called.  Uninitialized field base elements will
-		 * give undefined results.
-		 */
-		//@{
-
-		/*- Equality of two elements.
-		 * This function assumes both field base elements have already been
-		 * constructed and initialized.
-		 * @return boolean true if equal, false if not.
-		 * @param  x field base element
-		 * @param  y field base element
-		 */
-		bool areEqual (const Element &x, const Element &y) const
-		{
-			return x == y;
-		}
-
-		/*- Zero equality.
-		 * Test if field base element is equal to zero.
-		 * This function assumes the field base element has already been
-		 * constructed and initialized.
-		 * @return boolean true if equals zero, false if not.
-		 * @param  x field base element.
-		 */
-		bool isZero (const Element &x) const
-		{
-			return x == 0;
-		}
-
-		/*- One equality.
-		 * Test if field base element is equal to one.
-		 * This function assumes the field base element has already been
-		 * constructed and initialized.
-		 * @return boolean true if equals one, false if not.
-		 * @param  x field base element.
-		 */
-		bool isOne (const Element &x) const
-		{
-			return x == 1;
-		}
-
-
-		//@} Arithmetic Operations
-
-		/*- @name Input/Output Operations */
-		//@{
-
-		/*- Print field.
-		 * @return output stream to which field is written.
-		 * @param  os  output stream to which field is written.
-		 */
-		std::ostream &write (std::ostream &os) const
-		{
-			return os << "Modular field, mod " << _modulus;
-		}
-
-		/*- Read field.
-		 * @return input stream from which field is read.
-		 * @param  is  input stream from which field is read.
-		 */
-		std::istream &read (std::istream &is) {
-			return is >> _modulus;
-		}
-
-
-		/*- Print field base element.
-		 * This function assumes the field base element has already been
-		 * constructed and initialized.
-		 * @return output stream to which field base element is written.
-		 * @param  os  output stream to which field base element is written.
-		 * @param  x   field base element.
-		 */
-		std::ostream &write (std::ostream &os, const Element &x) const
-		{
-			return os << (int) x;
-		}
-
-
-		/*- Read field base element.
-		 * This function assumes the field base element has already been
-		 * constructed and initialized.
-		 * @return input stream from which field base element is read.
-		 * @param  is  input stream from which field base element is read.
-		 * @param  x   field base element.
-		 */
-		std::istream &read (std::istream &is, Element &x) const
-		{
-			integer tmp;
-
-			is >> tmp;
-
-			x = abs (tmp) % integer (_modulus);
-			if (tmp < 0) x = _modulus - x;
-
-			return is;
-		}
-
-		//@}
-
-	protected:
-
-		/// Private (non-static) element for modulus
-		Element _modulus;
-
-	}; // class ModularBase
-
-	/* .. such comments as here should be on specialization...
-	 * @param element Element type, e.g. long or integer
-	 * @param Intermediate Type to use for intermediate computations. This
-	 *                     should be a data type that can support integers
-	 *                     twice the length of the maximal modulus used.
-	 *
-	 * The primality of the modulus will not be checked, so it is the
-	 * programmer's responsibility to supply a prime modulus.  This class
-	 * implements a field of unparameterized integers modulo a prime integer.
-	 * Field has (non-static) member to contain modulus of field.
-	 */
-
-	/** @brief Prime fields of positive characteristic implemented directly in LinBox.
-	 *
-	 * This parameterized field can be used to construct prime fields.
-	 * Typical use would be Modular<integer> for integers modulo a large
-	 * prime, Modular<uint32_t>, Modular<int32_t>, or Modular<double> for
-	 * integers modulo a wordsize prime.  Each of those has specialized
-	 * performance features suitable to certain applications.
-	 */
-	template <class _Element>
-	class Modular : public ModularBase<_Element> {
-	public:
-		typedef _Element Element;
-		typedef Modular<_Element>     Self_t;
-		typedef ModularBase<_Element> Father_t;
-		typedef typename ModularBase<_Element>::RandIter RandIter;
-		const Element zero,one, mOne;
-
-		/*- @name Object Management
-		 * @brief see \ref FieldArchetype  for member specs.
-		 */
-		//@{
-
-		//private:
-		/*- Default constructor.
-		*/
-		Modular () :
-			zero(0),one(1),mOne(0)
-		{}
-
-		/*- Constructor from an element type
-		 * Sets the modulus of the field throug the static member of the
-		 * element type.
-		 * @param modulus constant reference to integer prime modulus
-		 */
-		Modular (unsigned long modulus, unsigned long = 1) :
-			ModularBase<_Element> (modulus),zero(0),one(1),mOne(modulus-1)
-		{}
-
-
-		/*- Constructor from an integer
-		 * Sets the modulus of the field throug the static member of the
-		 * element type.
-		 * @param modulus constant reference to integer prime modulus
-		 */
-		Modular (const integer &modulus) :
-			ModularBase<_Element> (modulus),zero(0),one(1),mOne(modulus-1)
-		{}
-
-		/* Assignment operator
-		 * Required by the archetype
-		 *
-		 * @param F constant reference to Modular object
-		 * @return reference to Modular object for self
-		 */
-		const Modular &operator=(const Modular &F)
-		{
-			ModularBase<Element>::_modulus = F._modulus;
-			F.assign(const_cast<Element&>(one),F.one);
-			F.assign(const_cast<Element&>(zero),F.zero);
-			F.assign(const_cast<Element&>(mOne),F.mOne);
-
-			return *this;
-		}
-	public:
-
-		static inline Element getMaxModulus()
-		{
-			return Element((1ULL<<(sizeof(Element)*8-1))-1);
-		}
-
-
-		/*- Initialization of field base element from an integer.
-		 * Behaves like C++ allocator construct.
-		 * This function assumes the output field base element x has already been
-		 * constructed, but that it is not already initialized.
-		 * This is not a specialization of the template function because
-		 * such a specialization is not allowed inside the class declaration.
-		 * @return reference to field base element.
-		 * @param x field base element to contain output (reference returned).
-		 * @param y integer.
-		 */
-		Element &init (Element &x, const integer &y ) const
-		{
-			x = y % ModularBase<Element>::_modulus;
-			if (x < 0) x += ModularBase<Element>::_modulus;
-			return x;
-		}
-
-		Element &init (Element &x, const size_t &y ) const
-		{
-			x = (Element) y % ModularBase<Element>::_modulus;
-			if (x < 0) x += ModularBase<Element>::_modulus;
-			return x;
-		}
-
-		Element &init (Element &x, const int y ) const
-		{
-			x = y % ModularBase<Element>::_modulus;
-			if (x < 0) x += ModularBase<Element>::_modulus;
-			return x;
-		}
-
-		Element &init (Element &x, const long int y) const
-		{
-			x = y % ModularBase<Element>::_modulus;
-			if (x < 0) x += ModularBase<Element>::_modulus;
-			return x;
-		}
-
-		/*- Initialization of field base element from a double.
-		 * Behaves like C++ allocator construct.
-		 * This function assumes the output field base element x has already been
-		 * constructed, but that it is not already initialized.
-		 * This is not a specialization of the template function because
-		 * such a specialization is not allowed inside the class declaration.
-		 * @return reference to field base element.
-		 * @param x field base element to contain output (reference returned).
-		 * @param y integer.
-		 */
-		Element &init (Element &x, const double &y) const
-		{
-			double z = fmod(y, (double)ModularBase<Element>::_modulus);
-			if (z < 0) z += (double) ModularBase<Element>::_modulus;
-			return x = (Element) (z+.5);
-		}
-
-		Element &init (Element &x, const float &y) const
-		{
-			float z = fmod(y, (float)ModularBase<Element>::_modulus);
-			if (z < 0) z += (float) ModularBase<Element>::_modulus;
-			return x = (Element) (z+.5);
-		}
-
-		Element &init(Element &x) const
-		{
-			return x = 0 ;
-		}
-
-		//@}
-		/*- @name Arithmetic Operations
-		 * @brief see \ref FieldArchetype  for member specs.
-		 * x <- y op z; x <- op y
-		 * These operations require all elements, including x, to be initialized
-		 * before the operation is called.  Uninitialized field base elements will
-		 * give undefined results.
-		 */
-		//@{
-
-		/*- Addition.
-		 * x = y + z
-		 * This function assumes all the field base elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field base element (reference returned).
-		 * @param  y field base element.
-		 * @param  z field base element.
-		 */
-		Element &add (Element &x, const Element &y, const Element &z) const
-		{
-			x = y + z;
-			if (x >= ModularBase<Element>::_modulus) x -= ModularBase<Element>::_modulus;
-			return x;
-		}
-
-		/* Subtraction.
-		 * x = y - z
-		 * This function assumes all the field base elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field base element (reference returned).
-		 * @param  y field base element.
-		 * @param  z field base element.
-		 */
-		Element &sub (Element &x, const Element &y, const Element &z) const
-		{
-			x = y - z;
-			if (x < 0) x += ModularBase<Element>::_modulus;
-			return x;
-		}
-
-		/* Multiplication.
-		 * x = y * z
-		 * This function assumes all the field base elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field base element (reference returned).
-		 * @param  y field base element.
-		 * @param  z field base element.
-		 */
-		Element &mul (Element &x, const Element &y, const Element &z) const
-		{
-			return x = (y * z) % ModularBase<Element>::_modulus;
-		}
-
-		/* Division.
-		 * x = y / z
-		 * This function assumes all the field base elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field base element (reference returned).
-		 * @param  y field base element.
-		 * @param  z field base element.
-		 */
-		Element &div (Element &x, const Element &y, const Element &z) const
-		{
-			Element temp;
-			inv (temp, z);
-			return mul (x, y, temp);
-		}
-
-		/* Additive Inverse (Negation).
-		 * x = - y
-		 * This function assumes both field base elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field base element (reference returned).
-		 * @param  y field base element.
-		 */
-		Element &neg (Element &x, const Element &y) const
-		{
-			if (y == 0)
-				return x = y;
-			else
-				return x = ModularBase<Element>::_modulus - y;
-		}
-
-		/* Multiplicative Inverse.
-		 * x = 1 / y
-		 * This function assumes both field base elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field base element (reference returned).
-		 * @param  y field base element.
-		 */
-		Element &inv (Element &x, const Element &y) const
-		{
-			// The extended Euclidean algoritm
-			Element x_int, y_int, q, tx, ty, temp;
-			x_int = ModularBase<Element>::_modulus;
-			y_int = y;
-			tx = 0;
-			ty = 1;
-
-			while (y_int != 0) {
-				// always: gcd (modulus,residue) = gcd (x_int,y_int)
-				//         sx*modulus + tx*residue = x_int
-				//         sy*modulus + ty*residue = y_int
-				q = x_int / y_int; // integer quotient
-				temp = y_int;  y_int  = x_int  - q*y_int;  x_int  = temp;
-				temp = ty; ty = tx - q*ty; tx = temp;
-			}
-
-			// now x_int = gcd (modulus,residue)
-			x = tx;
-			if (x < 0) x += ModularBase<Element>::_modulus;
-
-			return x;
-		}
-
-		/* Natural AXPY.
-		 * r  = a * x + y
-		 * This function assumes all field elements have already been
-		 * constructed and initialized.
-		 * @return reference to r.
-		 * @param  r field element (reference returned).
-		 * @param  a field element.
-		 * @param  x field element.
-		 * @param  y field element.
-		 */
-		Element &axpy (Element &r,
-			       const Element &a,
-			       const Element &x,
-			       const Element &y) const
-		{
-			r = (a * x + y) % ModularBase<Element>::_modulus;
-			if (r < 0) r += ModularBase<Element>::_modulus;
-			return r;
-		}
-
-		//@} Arithmetic Operations
-
-		/*- @name Inplace Arithmetic Operations
-		 * @brief see \ref FieldArchetype  for member specs.
-		 * x <- x op y; x <- op x
-		 */
-		//@{
-
-		/*- Inplace Addition.
-		 * x += y
-		 * This function assumes both field base elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field base element (reference returned).
-		 * @param  y field base element.
-		 */
-		Element &addin (Element &x, const Element &y) const
-		{
-			x += y;
-			if (x >= ModularBase<Element>::_modulus) x -= ModularBase<Element>::_modulus;
-			return x;
-		}
-
-		/* Inplace Subtraction.
-		 * x -= y
-		 * This function assumes both field base elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field base element (reference returned).
-		 * @param  y field base element.
-		 */
-		Element &subin (Element &x, const Element &y) const
-		{
-			x -= y;
-			if (x < 0) x += ModularBase<Element>::_modulus;
-			return x;
-		}
-
-		/* Inplace Multiplication.
-		 * x *= y
-		 * This function assumes both field base elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field base element (reference returned).
-		 * @param  y field base element.
-		 */
-		Element &mulin (Element &x, const Element &y) const
-		{
-			x *= y;
-			x %= ModularBase<Element>::_modulus;
-			return x;
-		}
-
-		/* Inplace Division.
-		 * x /= y
-		 * This function assumes both field base elements have already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field base element (reference returned).
-		 * @param  y field base element.
-		 */
-		Element &divin (Element &x, const Element &y) const
-		{
-			Element temp;
-			inv (temp, y);
-			return mulin (x, temp);
-		}
-
-		/* Inplace Additive Inverse (Inplace Negation).
-		 * x = - x
-		 * This function assumes the field base element has already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field base element (reference returned).
-		 */
-		Element &negin (Element &x) const
-		{
-			if (x == 0)
-				return x;
-			else
-				return x = ModularBase<Element>::_modulus - x;
-		}
-
-		/* Inplace Multiplicative Inverse.
-		 * x = 1 / x
-		 * This function assumes the field base elementhas already been
-		 * constructed and initialized.
-		 * @return reference to x.
-		 * @param  x field base element (reference returned).
-		 */
-		Element &invin (Element &x) const
-		{
-			return inv (x, x);
-		}
-
-		/* Inplace AXPY.
-		 * r  += a * x
-		 * This function assumes all field elements have already been
-		 * constructed and initialized.
-		 * Purely virtual
-		 * @return reference to r.
-		 * @param  r field element (reference returned).
-		 * @param  a field element.
-		 * @param  x field element.
-		 */
-		Element &axpyin (Element &r, const Element &a, const Element &x) const
-		{
-			r = (r + a * x) % ModularBase<Element>::_modulus;
-			if (r < 0) r += ModularBase<Element>::_modulus;
-			return r;
-		}
-
-		//@} Inplace Arithmetic Operations
-
-	private:
-
-		friend class FieldAXPY<Modular<Element> >;
-
-	}; // class Modular
-
-
-	/*! Specialization of FieldAXPY for parameterized modular field */
-
-	template <class _Element>
-	class FieldAXPY<Modular<_Element> > {
-	public:
-
-		typedef _Element Element;
-		typedef Modular<_Element> Field;
-
-		FieldAXPY (const Field &F) :
-			_field (F)
-		{ _y = 0; }
-		FieldAXPY (const FieldAXPY<Modular<Element> > &faxpy) :
-			_field (faxpy._field), _y (faxpy._y)
-		{}
-
-		FieldAXPY<Modular <Element> > &operator = (const FieldAXPY &faxpy)
-		{
-			_field = faxpy._field;
-			_y = faxpy._y;
-			return *this;
-		}
-
-		inline Element& mulacc (const Element &a, const Element &x)
-		{
-			return accumulate(a * x);
-		}
-
-		inline Element& accumulate (const Element &t)
-		{
-			return _y+=t;
-		}
-
-		inline Element &get (Element &y) { _y %= _field._modulus; y = _y; return y;
-		}
-
-		inline FieldAXPY &assign (const Element y)
-		{
-			_y = y;
-			return *this;
-		}
-
-		inline void reset() {
-			_field.init(_y, 0);
-		}
-
-	private:
-
-		Field _field;
-		Element _y;
-	};
-
-
-	template <>
-	inline std::ostream& ModularBase<Integer>::write (std::ostream &os) const
-	{
-		return os << "GMP integers mod " << _modulus;
-	}
-
-	template <>
-	inline integer& Modular<integer>::init (integer& x, const double& y) const
-	{
-		integer tmp = (integer)y % _modulus;
-		if (tmp<0) tmp += _modulus;
-		return x = tmp;
-	}
-
-
-} // namespace LinBox
-
-#include "linbox/field/Modular/modular-unsigned.h"
-#include "linbox/randiter/modular.h"
-#include "linbox/field/Modular/modular-int32.h"
-#ifdef __LINBOX_HAVE_INT64
-#include "linbox/field/Modular/modular-int64.h"
-#endif
-#include "linbox/field/Modular/modular-short.h"
-#include "linbox/field/Modular/modular-byte.h"
-#include "linbox/field/Modular/modular-double.h"
-#include "linbox/field/Modular/modular-float.h"
-
-#endif // __LINBOX_field_modular_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/multimod-field.h b/linbox/field/multimod-field.h
index 7c0ff36..20a2ee7 100644
--- a/linbox/field/multimod-field.h
+++ b/linbox/field/multimod-field.h
@@ -5,20 +5,20 @@
  *
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -36,7 +36,7 @@
 #include "linbox/linbox-config.h"
 #include "linbox/util/debug.h"
 #include "linbox/integer.h"
-#include "linbox/field/modular.h"
+#include <givaro/modular.h>
 
 #include "linbox/vector/vector-domain.h"
 #include "linbox/field/field-interface.h"
@@ -67,7 +67,7 @@ namespace LinBox
 
 	protected:
 
-		std::vector<Modular<double> >              _fields;
+		std::vector<Givaro::Modular<double> >              _fields;
 		size_t                                       _size;
 		std::vector<integer>                 _crt_constant;
 		std::vector<double >                  _crt_inverse;
@@ -93,7 +93,7 @@ namespace LinBox
 		{
 			_crt_modulo=1;
 			for (size_t i=0; i<_size; ++i){
-				_fields[i]   .assign( Modular<double> (primes[i]) );
+				_fields[i] = ( Givaro::Modular<double> (primes[i]) );
 				_crt_modulo *= primes[i];
 			}
 			double tmp;
@@ -112,7 +112,7 @@ namespace LinBox
 		{
 			_crt_modulo=1;
 			for (size_t i=0; i<_size; ++i){
-				_fields[i]  .assign( Modular<double> (primes[i]) );
+				_fields[i] = ( Givaro::Modular<double> (primes[i]) );
 				_crt_modulo *= primes[i];
 			}
 			double tmp;
@@ -129,7 +129,7 @@ namespace LinBox
 			_crt_constant(F._crt_constant), _crt_inverse(F._crt_inverse),
 			_crt_modulo(F._crt_modulo) {}
 
-		const MultiModDouble &operator=(const MultiModDouble &F)
+		MultiModDouble &operator=(const MultiModDouble &F)
 		{
 			_fields       = F._fields;
 			_size         = F._size;
@@ -143,11 +143,11 @@ namespace LinBox
 		size_t size() const
 		{return this->_size;}
 
-		const Modular<double>& getBase(size_t i) const
+		const Givaro::Modular<double>& getBase(size_t i) const
 		{ return this->_fields[i]; }
 
-		double getModulo(size_t i) const
-		{ return this->_fields[i].modulus;}
+		Givaro::Modular<double>::Residu_t getModulo(size_t i) const
+		{ return this->_fields[i].characteristic();}
 
 
 		const integer& getCRTmodulo() const
@@ -157,7 +157,7 @@ namespace LinBox
 		{
 			c=1;
 			for (size_t i=0; i<_size; ++i){
-				c*=_fields[i].modulus;
+				c*=getModulo(i);
 			}
 			return c;
 		}
@@ -192,8 +192,8 @@ namespace LinBox
 		{
 			os << "multimod double (";
 			for (size_t i=0;i<_size-1;++i)
-				os<<integer(_fields[i].modulus)<<",";
-			os<<integer(_fields[_size-1].modulus)<<")\n";
+				os<<integer(getModulo(i))<<",";
+			os<<integer(getModulo(_size-1))<<")\n";
 			return os;
 		}
 
@@ -201,9 +201,9 @@ namespace LinBox
 #if 0
 			is >> modulus;
 			if(modulus <= 1)
-				throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus must be > 1");
+				throw PreconditionFailed(LB_FILE_LOC,"modulus must be > 1");
 			if(modulus > 94906265)
-				throw PreconditionFailed(__func__,__FILE__,__LINE__,"modulus is too big");
+				throw PreconditionFailed(LB_FILE_LOC,"modulus is too big");
 #endif
 			return is;
 		}
@@ -264,6 +264,11 @@ namespace LinBox
 			return x == std::vector<double>(_size, 1.);
 		}
 
+		inline bool isMOne (const Element &x) const
+		{
+			return x == std::vector<double>(_size, -1.); // bug
+		}
+
 		inline Element &add (Element &x, const Element &y, const Element &z) const
 		{
 			for (size_t i=0;i<_size;++i) {
@@ -379,7 +384,7 @@ namespace LinBox
 			return r;
 		}
 
-		static inline double getMaxModulus()
+		static inline double maxCardinality()
 		{ return 94906265.0; } // floor( 2^26.5 )
 
 	};// end of class MultiModField
@@ -392,16 +397,21 @@ namespace LinBox
 
 		MultiModRandIter(const MultiModDouble &F,
 				 const integer   &size=0,
-				 const integer   &seed=0) :
+				 const size_t   &seed=0) :
 			_field(F), _size(size), _seed(seed), _randiter(F._size)
 		{
 			for (size_t i=0;i< F._size;++i)
-				_randiter[i] = new Modular<double>::RandIter(F._fields[i],size,seed) ;
+				_randiter[i] = new Givaro::Modular<double>::RandIter(F._fields[i],seed) ;
 		}
 
-		~MultiModRandIter() {for  (size_t i=0;i< _randiter.size();++i) delete _randiter[i]; }
+		~MultiModRandIter()
+		{
+			for (size_t i=0;i< _randiter.size();++i) 
+				if (_randiter[i])
+					delete _randiter[i];
+		}
 
-		const MultiModRandIter& operator= (const MultiModRandIter &R)
+		MultiModRandIter& operator= (const MultiModRandIter &R)
 		{
 			_seed  = R._seed;
 			_size  = R._size;
@@ -420,14 +430,14 @@ namespace LinBox
 	protected:
 		MultiModDouble        _field;
 		integer                _size;
-		integer                _seed;
-		std::vector<Modular<double>::RandIter*> _randiter;
+		size_t                 _seed;
+		std::vector<Givaro::Modular<double>::RandIter*> _randiter;
 
 	}; // end of class MultiModRandIter
 
 #if 0
 	template <>
-	class DotProductDomain<MultiModDouble > : private virtual VectorDomainBase<MultiModDouble> {
+	class DotProductDomain<MultiModDouble > : private  VectorDomainBase<MultiModDouble> {
 	private:
 		//std::vector<double> _bound;
 		std::vector<size_t>  _nmax;
@@ -514,11 +524,10 @@ namespace LinBox
 #endif // __LINBOX_multimod_field_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/field/ntl.doxy b/linbox/field/ntl.doxy
deleted file mode 100644
index bc64a83..0000000
--- a/linbox/field/ntl.doxy
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (C) 2010 Brice Boyer, part of LinBox, GNU LGPL, see COPYING
-/*
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*! @ingroup field
- at defgroup NTL NTL
-
- at brief NO DOC
-
-*/
-
-
-// vim:syntax=doxygen
diff --git a/linbox/field/ntl.h b/linbox/field/ntl.h
deleted file mode 100644
index 627cc17..0000000
--- a/linbox/field/ntl.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* linbox/field/ntl.h
- * Copyright (C) 1999-2002 William J Turner,
- *               2001 Bradford Hovinen
- *
- * Written by William J Turner <wjturner at math.ncsu.edu>,
- *            Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * ------------------------------------
- * Modified by William J. Turner <wjturner at acm.org>. 4 April 2002.
- *
- * Broke NTL field wrappers into separate files.
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_field_ntl_H
-#define __LINBOX_field_ntl_H
-
-#include "linbox/field/NTL/ntl-RR.h"
-#include "linbox/field/NTL/ntl-ZZ_p.h"
-#include "linbox/field/NTL/ntl-ZZ.h"
-#include "linbox/field/NTL/ntl-ZZ_pX.h"
-#include "linbox/field/NTL/ntl-lzz_p.h"
-#include "linbox/field/NTL/ntl-lzz_pX.h"
-#include "linbox/field/NTL/ntl-ZZ_pE.h"
-#include "linbox/field/NTL/ntl-lzz_pE.h"
-#include "linbox/field/NTL/ntl-GF2E.h"
-
-
-#endif // __LINBOX_field_ntl_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/field/param-fuzzy.h b/linbox/field/param-fuzzy.h
index 52e1c66..6a77dd8 100644
--- a/linbox/field/param-fuzzy.h
+++ b/linbox/field/param-fuzzy.h
@@ -86,7 +86,7 @@ namespace LinBox
 		 * @param  F ParamFuzzy object.
 		 */
 		ParamFuzzy (const ParamFuzzy &F) :
-			_fuzz (F._fuzz)
+			_fuzz (F.fuzz())
 			,one(F.one),zero(F.zero),mOne(F.mOne)
 		{}
 
@@ -95,7 +95,13 @@ namespace LinBox
 		 * @param F constant reference to ParamFuzzy object
 		 */
 		ParamFuzzy &operator= (const ParamFuzzy &F)
-		{ return *this; }
+		{
+			if (&F == this)
+				return *this ;
+			this->_fuzz = F.fuzz() ;
+
+			return *this;
+		}
 
 		/** Initialization of field base element from an integer.
 		 * Behaves like C++ allocator construct.
@@ -291,6 +297,13 @@ namespace LinBox
 		bool isOne (const Element &x) const
 		{ return ( ( x - 1 <= _fuzz ) && ( 1 - x <= _fuzz ) ); }
 
+		bool isMOne (const Element& x) const
+		{
+			Element y ; neg(y,x);
+			return isOne(y);
+		}
+
+
 		/** Inplace Addition.
 		 * x += y
 		 * This function assumes both field base elements have already been
@@ -406,6 +419,10 @@ namespace LinBox
 
 		//@}
 
+		double fuzz() const
+		{
+			return _fuzz ;
+		}
 	private:
 
 		/// Private static double for fuzz value
@@ -424,11 +441,10 @@ namespace LinBox
 #endif // __LINBOX_param_fuzzy_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/field/rebind.h b/linbox/field/rebind.h
index 5c3ada5..f4c5318 100644
--- a/linbox/field/rebind.h
+++ b/linbox/field/rebind.h
@@ -30,7 +30,7 @@ namespace LinBox
 
 	/** \brief used in support of Hom, MatrixHom
 
-	  Helps define rebind for vector types.  See blackbox/sparse.h for example of use.
+	  Helps define rebind for vector types.  See matrix/sparse-matrix.h for example of use.
 	  */
 	template<class XXX, class U>
 	struct Rebind
diff --git a/linbox/field/unparametric.h b/linbox/field/unparametric.h
deleted file mode 100644
index 9aec440..0000000
--- a/linbox/field/unparametric.h
+++ /dev/null
@@ -1,337 +0,0 @@
-
-/* linbox/field/unparametric.h
- * Copyright (C) 1999-2005 William J Turner,
- *               2001 Bradford Hovinen
- *               2005 Clement Pernet
- *
- * Written by W. J. Turner <wjturner at acm.org>,
- *            Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-#ifndef __LINBOX_field_unparametric_H
-#define __LINBOX_field_unparametric_H
-#include <typeinfo>
-
-#include <string>
-#include <algorithm>
-
-
-#include "linbox/linbox-config.h"
-#include "linbox/integer.h"
-#include "linbox/field/field-interface.h"
-#include "linbox/randiter/unparametric.h"
-#include "linbox/field/field-traits.h"
-#include <fflas-ffpack/field/unparametric.h>
-#include "linbox/randiter/nonzero.h"
-//#if __LINBOX_HAVE_NTL
-//#include "linbox/field/ntl-RR.h"
-//#endif // __LINBOX_HAVE_NTL
-
-
-namespace LinBox
-{
-
-    using Givaro::Caster;
-
-#if 0
-#if __LINBOX_HAVE_NTL
-	typedef NTL::RR Targ;
-	template <>
-	Targ& Caster<Targ, int> (Targ& t, const int& s)
-	{
-		return t = s;
-	}
-#endif // __LINBOX_HAVE_NTL
-#endif
-
-	template <class Ring>
-	struct ClassifyRing;
-
-	template <class K>
-	class UnparametricField;
-
-	// using FFPACK::UnparametricField ;
-	using FFPACK::UnparametricOperations;
-
-	template <class K>
-	struct ClassifyRing<UnparametricField<K> > {
-		typedef RingCategories::GenericTag categoryTag;
-	};
-
-	template <>
-	struct ClassifyRing<UnparametricField<integer> > {
-		typedef RingCategories::IntegerTag categoryTag;
-	};
-
-
-	/** \brief Unparameterized field adapter.
-	 * \ingroup field
-	 * \defgroup UnparametricField UnparametricField
-	 *
-	 * A field having an interface similar to that of floats is adapted to
-	 * LinBox.
-	 *
-	 *  Used to generate efficient field classes for unparameterized fields
-	 *  (or hidden parameter fields).
-	 *
-	 *  Some fields are implemented by definition of the C++ arithmetic
-	 *  operators, such as <code>z = x*y</code>, for \c x, \c y, \c z
-	 *  instances of a type \c K.  The LinBox field LinBox::Unparametric<K>
-	 *  is the adaptation to LinBox.
-	 *
-	 *  For a typical unparametric field, some of the methods must be
-	 *  defined in a specialization.
-	 */
-	template <class K>
-	class UnparametricField : public FieldInterface,
-		public  FFPACK::UnparametricField<K> {
-	protected:
-		integer _p; integer _card;
-	public:
-		typedef typename FFPACK::UnparametricField<K> Father_t ;
-
-		/** @name Common Object Interface for a LinBox Field.
-		 * These methods and member types are required of all LinBox fields.
-		 * See \ref FieldArchetype  for detailed specifications.
-		 */
-		//@{
-
-		/** The field's element type.
-		 * Type K must provide a default constructor,
-		 * a copy constructor, a destructor, and an assignment operator.
-		 */
-
-		typedef K Element;
-
-		/// Type of random field element generators.
-		typedef UnparametricRandIter<K> RandIter;
-
-		/** @name Field Object Basics.
-		*/
-		//@{
-
-		/** Builds this field to have characteristic q and cardinality q<sup>e</sup>.
-		 *  This constructor must be defined in a specialization.
-		 */
-		UnparametricField(integer q = 0, size_t e = 1) :
-			Father_t(q, e),
-			//Father_t((unsigned long)q,(unsigned long)e)
-			_p(q),
-			_card(q == 0 ?
-			integer(-1) :
-			pow(q, e) )
-			{}  // assuming q is a prime or zero.
-
-		/// construct this field as copy of F.
-		UnparametricField (const UnparametricField &F) :
-			Father_t(F),_p(F._p), _card(F._card)
-		{}
-
-
-		// field/ntl-ZZ_p.h me les demande... //
-
-		using Father_t::inv ;
-		//using Father_t::read ;
-		std::istream &read(std::istream & is) { return Father_t::read(is); }
-
-        std::istream &read(std::istream & s, Element &a) const
-		{
-            Integer tmp;
-            s >> tmp;
-            init(a, tmp);
-            return s;
-		}
-		using Father_t::invin;
-		using Father_t::write;
-		using Father_t::isZero;
-		using Father_t::isOne;
-
-		template<typename Src>
-		Element&init(Element&x, const Src&s) const
-		{
-			return Caster (x, s);
-		}
-		Element&init(Element&x)const
-		{
-			return Caster (x, 0);
-		}
-		template<typename T>
-		T&convert(T&x, const Element&y) const
-		{
-			return Caster(x,y);
-		}
-
-		// fin des trucs zarbs //
-
-		/// c := cardinality of this field (-1 if infinite).
-		using Father_t::cardinality ;
-		integer &cardinality (integer &c) const
-		{
-			return c = _card;
-		}
-
-		/// c := characteristic of this field (zero or prime).
-		using Father_t::characteristic;
-		integer &characteristic (integer &c) const
-		{
-			return c = _p;
-		}
-
-		//@} Data Object Management
-
-
-
-
-		//@} Common Object Interface
-
-		/** @name Implementation-Specific Methods.
-		 * These methods are not required of all LinBox fields
-		 * and are included only for the implementation of this field
-		 * template.
-		 */
-		//@{
-
-		//- Default constructor
-		//UnparametricField (void) {}
-
-		/** Constructor from field object.
-		 * @param  A unparameterized field object
-		 */
-		UnparametricField (const K &A) {}
-
-		/** Constant access operator.
-		 * @return constant reference to field object
-		 */
-		const K &operator () (void) const
-		{
-			return Element ();
-		}
-
-		/** Access operator.
-		 * @return reference to field object
-		 */
-		K &operator () (void)
-		{
-			return Element ();
-		}
-
-		//@} Implementation-Specific Methods
-
-	}; // template <class K> class UnparametricField
-
-	template<class Field>
-	class FieldAXPY;
-
-	/*! @ingroup integers
-	 * @brief NO DOc
-	 */
-	template<>
-	class FieldAXPY<UnparametricField<integer> >  {
-	public:
-		typedef UnparametricField<integer> Field;
-		typedef integer Element;
-
-		/** Constructor.
-		 * A faxpy object if constructed from a Field and a field element.
-		 * Copies of this objects are stored in the faxpy object.
-		 * @param F field F in which arithmetic is done
-		 */
-		FieldAXPY (const Field &F) :
-			_field (F)
-		{ _y = 0; }
-
-		/** Copy constructor.
-		 * @param faxpy
-		 */
-		FieldAXPY (const FieldAXPY<Field> &faxpy) :
-			_field (faxpy._field), _y (faxpy._y)
-		{}
-
-		/** Assignment operator
-		 * @param faxpy
-		 */
-		FieldAXPY<Field> &operator = (const FieldAXPY &faxpy)
-		{ _y = faxpy._y; return *this; }
-
-		/** Add a*x to y
-		 * y += a*x.
-		 * @param a constant reference to element a
-		 * @param x constant reference to element x
-		 * allow optimal multiplication, such as integer * int
-		 */
-		template<class Element1>
-		inline Element&  mulacc (const Element &a, const Element1 &x)
-		{
-			return _y += (a * x);
-		}
-
-		template<class Element1>
-		inline Element& accumulate (const Element1 &t)
-		{
-			return _y += t;
-		}
-
-		/** Retrieve y
-		 *
-		 * Performs the delayed modding out if necessary
-		 */
-		inline Element &get (Element &y) { y = _y; return y; }
-
-		/** Assign method.
-		 * Stores new field element for arithmetic.
-		 * @return reference to self
-		 * @param y constant reference to element a
-		 */
-		inline FieldAXPY &assign (const Element& y)
-		{
-			_y = y;
-			return *this;
-		}
-
-		inline void reset() {
-			_y = 0;
-		}
-
-	private:
-
-		/// Field in which arithmetic is done
-		Field _field;
-
-		/// Field element for arithmetic
-		Element _y;
-
-	};
-
-} // namespace LinBox
-
-#include "linbox/randiter/unparametric.h"
-
-#endif // __LINBOX_field_unparametric_H
-
-
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
-
diff --git a/linbox/integer.h b/linbox/integer.h
index f810e82..92bcdd2 100644
--- a/linbox/integer.h
+++ b/linbox/integer.h
@@ -35,34 +35,15 @@
  * It is a wrapper of <a href=http://gmplib.org>GMP</a> integers.  Arithmetic operations are via
  * \c C++ infix operator forms (eg. \c a*b) . It is for ``casual'' uses such as characteristics and
  * cardinalities and when initializing field elements.  The integers are also represented as a
- * LinBox ring for use in integer matrix computation, see PID-integer.h  or see  field/ntl-ZZ.h.
+ * ring for use in integer matrix computation, see <givaro/zring.h> or ring/ntl/ntl-zz.h.
  */
 
 #ifndef __LINBOX_integer_H
 #define __LINBOX_integer_H
 
-//#include <cstdint>
+#include <givaro/givconfig.h>
 #include "linbox/linbox-config.h"
-#include "givaro/givconfig.h"
-#include "gmp++/gmp++.h"
-#include <cfloat> // BB : needed on some rare platforms...
-
-
-#ifdef __LINBOX_HAVE_STDINT_H
-#ifndef __STDC_LIMIT_MACROS
-#define __STDC_LIMIT_MACROS
-// else ??
-#endif
-#include <stdint.h>
-#ifndef INT32_MAX
-#error "INT32_MAX is not defined. It should at least be defined in Givaro..."
-#endif
-#endif
-
-
-#ifndef FFLAFLAS_VERSION
-#define FFLAFLAS_VERSION __LINBOX_FFLAFFLAS_VERSION
-#endif
+#include <gmp++/gmp++.h>
 
 
 namespace LinBox
@@ -74,83 +55,35 @@ namespace LinBox
 	typedef Givaro::Integer integer;
 	typedef Givaro::Integer Integer;
 
-#if 0
-// These integer types are defined by Givaro
-	/// int8_t.
-	typedef signed __LINBOX_INT8 int8_t;
-	/// int16_t.
-	typedef signed __LINBOX_INT16 int16_t;
-
-	/** @brief This is a representation of 32 bit ints, usually equivalent to \c int.
-	 *
-	 * The use of \c int32_t ensures you are working with
-	 * 32 bit signed ints, \f$[-2^{31}\dots2^{31})\f$.  Similarly, \ref int8_t, \ref int16_t, and \ref int64_t are defined.
-	 */
-	typedef signed __LINBOX_INT32 int32_t;
-
-	/// int64_t.
-	typedef signed __LINBOX_INT64 int64_t;
-
-	/// unsigned int8_t.
-	typedef unsigned __LINBOX_INT8 uint8_t;
-	/// unsigned int16_t.
-	typedef unsigned __LINBOX_INT16 uint16_t;
-
-	/** This is a representation of 32 bit unsigned ints, usually
-	 * equivalent to `<code>unsigned int</code>'.
-	 *
-	 * The use of `uint32_t' ensures you are working with
-	 * 32 bit unsigned ints, \f$[0\cdots 2^32[\f$.  Similarly, uint8_t, uint16_t, and uint64_t are defined.
-	 */
-	typedef unsigned __LINBOX_INT32 uint32_t;
-
-	/// unsigned int64_t.
-	typedef unsigned __LINBOX_INT64 uint64_t;
-
-#endif
-
 	// Huh? -bds
 	template< class T >
 	T abs( const T& a ) { return( a <= 0 ? a * -1 : a ); }
 
+} // LinBox namespace
 
 
-        /*! @internal
+// Dependency to GIVARO >= 3.7.2
+#include <givaro/givspyinteger.h>
+
+namespace LinBox
+{
+
+    /*! @internal
 	 * Spy structure to have access to protected members of Givaro::Integer.
 	 */
-	struct SpyInteger
-	{
+    using Givaro::SpyInteger;
 
-	    struct InHeritsInteger : public integer {
-	    protected:
-	        friend struct SpyInteger;
-	    };
+} // LinBox namespace
 
-	    static const InHeritsInteger::Rep* get_rep(const integer& i) {
-        	return static_cast<const InHeritsInteger&>(i).get_rep();
-	    }
 
-	    static mpz_ptr get_mpz(integer& i) {
-	        return static_cast<InHeritsInteger&>(i).get_mpz();
-	    }
-	    static mpz_ptr get_mpz(const integer& i) {
-	        return const_cast<InHeritsInteger&>(static_cast<const InHeritsInteger&>(i)).get_mpz();
-	    }
-	    static mpz_srcptr get_mpz_const(const integer& i) {
-	        return static_cast<const InHeritsInteger&>(i).get_mpz_const();
-	    }
-        };
 
 
-}
-
 // Dependency to GIVARO >= 3.3.4
 /* givaro/givconfig.h so provides the fixed width integer types such as
  * int16_t, uint8_t, etc.  The typenames int16, uint8, etc are no longer used
  * in LinBox or Givaro.
  */
 #include <givaro/givconfig.h>
-#include <math.h>
 
 #ifndef GIVARO_VERSION
 #error "Givaro didn't tell us about his version !"
@@ -165,19 +98,16 @@ namespace LinBox
 	 * @param a integer.
 	 * @return  ln(a).
 	 */
-#if (GIVARO_VERSION < 30305)
-	inline double naturallog(const Givaro::Integer& a) {
-		signed long int exp;
-		double d = (double)mpz_get_d_2exp( &exp, (mpz_srcptr)(LinBox::SpyInteger::get_rep(a) ) );
-		return (double)exp*0.69314718055994531+log(d);
-	}
-#else
 	inline double naturallog(const Givaro::Integer& a) {
 		return Givaro::naturallog(a);
 	}
-#endif
 }
 
+
+#include <givaro/givcaster.h>
+
+
+
 namespace LinBox { /*  signedness of integers */
 	/*! Positiveness of an integer.
 	 * Essentially usefull in debug mode to avoid compiler warnings
@@ -213,28 +143,99 @@ namespace LinBox { /*  signedness of integers */
 		return true ;
 	}
 	//@}
-}
 
-#if (GIVARO_VERSION < 30601)
-namespace Givaro {
-	template <typename Target, typename Source>
-	Target& Caster (Target& t, const Source& s) {
-		return t = static_cast<Target>(s);
+	template<class U>
+	inline bool IsNegative(const U & p)
+	{
+		return (!isPositive<U>(p));
+	}
+
+	//! @todo or use integer_traits<T>::is_unsigned ??
+	template<>
+	inline bool IsNegative(const uint8_t & p)
+	{
+		return false;
+	}
+
+	template<>
+	inline bool IsNegative(const uint16_t & p)
+	{
+		return false;
+	}
+
+	template<>
+	inline bool IsNegative(const uint32_t & p)
+	{
+		return false;
 	}
+
+	template<>
+	inline bool IsNegative(const uint64_t & p)
+	{
+		return false;
+	}
+
+	template<class T>
+	bool isOdd ( const T & p)
+	{
+		return Givaro::isOdd(p) ;
+	}
+
+	template<class T>
+	bool isEven ( const T & p)
+	{
+		return ! isOdd(p) ;
+	}
+
+}
+
+namespace LinBox
+{ /*  indexDomain : used only once in linbox/algorithms/rational-solver.inl */
+
+
+	/** Class used for permuting indices.
+	 * For example, create a vector <code>(0 1 2 ...)</code> over \c
+	 * size_t, then apply a permutation to it using a \c BlasMatrixDomain to
+	 * get the natural representation of the permutation.
+	 * @bug does not belong here
+	 */
+	class indexDomain
+	{
+	public:
+		typedef size_t Element;
+		typedef Element* Element_ptr ;
+		typedef const Element* ConstElement_ptr ;
+
+	public:
+		typedef indexDomain Father_t;
+		indexDomain() {};
+		
+		size_t init(size_t& dst) const {
+			return dst = static_cast<size_t>(0);
+		}
+		
+		template <class ANY>
+		size_t init(size_t& dst, const ANY& src) const {
+			return dst = static_cast<size_t>(src);
+		}
+		
+		template <class ANY>
+		size_t assign(ANY& dst, const size_t& src) const {
+			return dst = static_cast<ANY>(src);
+		}
+
+		int characteristic() const { return 0 ; }
+	};
 }
-#else
-#include <givaro/givcaster.h>
-#endif
 
 
 #endif // __LINBOX_integer_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/iterators/Makefile.am b/linbox/iterators/Makefile.am
new file mode 100644
index 0000000..369794b
--- /dev/null
+++ b/linbox/iterators/Makefile.am
@@ -0,0 +1,26 @@
+# Copyright (c) 2010 the LinBox group
+# This file is part of LinBox
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the  GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# ========LICENCE========
+#/
+
+pkgincludesubdir=$(pkgincludedir)/iterators
+
+pkgincludesub_HEADERS=\
+	blackbox-symmetrize-iterator.h		\
+	blackbox-symmetric-iterator.h
diff --git a/linbox/iterators/blackbox-symmetric-iterator.h b/linbox/iterators/blackbox-symmetric-iterator.h
new file mode 100644
index 0000000..7e8ea5a
--- /dev/null
+++ b/linbox/iterators/blackbox-symmetric-iterator.h
@@ -0,0 +1,91 @@
+/* Copyright (C) 1999 LinBox
+ * Written by <Jean-Guillaume.Dumas at imag.fr>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+// ================================================================
+// Black Box iterator and container
+// For symmetric matrix with same left and right vector
+// the sequence is u^t v, u^t A v, ...,  u^t A^n v,
+// ================================================================
+
+
+#ifndef __LINBOX_bbcontainer_symmetric_H
+#define __LINBOX_bbcontainer_symmetric_H
+
+#error "this file will never compile !"
+
+#include <LinBox/lin_rand.h>
+#include <LinBox/lin_base_bbit.h>
+
+template<class BlackBoxDomain, class Vecteur = typename BlackBoxDomain::PreferredInMatrix_t, class RandIter = Random>
+class BB_Symmetric_Container : public Base_BB_Container< BlackBoxDomain, Vecteur > {
+public:
+	BB_Symmetric_Container() {}
+
+	BB_Symmetric_Container(BlackBoxDomain_t * D, const Vecteur& u0) :
+		Base_BB_Container< BlackBoxDomain, Vecteur>(D) { init(u0,u0); }
+
+	BB_Symmetric_Container(BlackBoxDomain_t * D, RandIter& g ) :
+		Base_BB_Container< BlackBoxDomain, Vecteur>(D) { init(g); }
+
+protected:
+	void _launch () {
+		if (casenumber > 0) {
+			if (casenumber == 1) {
+				casenumber = 2;
+				_BB_domain->Apply( v, u);  // v <- B(B^i u_0) = B^(i+1) u_0
+				DOTPROD(_value,u,v);       // t <- u^t v = u_0^t B^(2i+1) u_0
+			}
+			else {
+				casenumber = -1;
+				DOTPROD(_value,v,v);       // t <- v^t v = u_0^t B^(2i+2) u_0
+			}
+		}
+		else {
+			if (casenumber == 0) {
+				casenumber = 1;
+				DOTPROD(_value,u,u);       // t <- u^t u = u_0^t B^(2i+4) u_0
+			}
+			else {
+				casenumber = 0;
+				_BB_domain->Apply( u, v);  // u <- B(B^(i+1) u_0) = B^(i+2) u_0
+				DOTPROD(_value,v,u);       // t <- v^t u = u_0^t B^(2i+3) u_0
+			}
+		}
+	}
+
+	void _wait () {}
+};
+
+
+#endif // __LINBOX_bbcontainer_symmetric_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/iterators/blackbox-symmetrize-iterator.h b/linbox/iterators/blackbox-symmetrize-iterator.h
new file mode 100644
index 0000000..8cf9527
--- /dev/null
+++ b/linbox/iterators/blackbox-symmetrize-iterator.h
@@ -0,0 +1,84 @@
+/* linbox/algorithms/blackbox-symmetrize-iterator.h
+ * Copyright (C) 1999, 2001, 2003 Jean-Guillaume Dumas
+ *
+ * Written by Jean-Guillaume Dumas <Jean-Guillaume.Dumas at imag.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_bbcontainer_symmetrize_H
+#define __LINBOX_bbcontainer_symmetrize_H
+
+// ================================================================
+// Symmetrizing iterator (for rank computations)
+// Same left and right vector
+// A is supposed to have tranpose-vector product
+// the sequence is u^t u, (A u)^t (A u) = u^t (A^t A) u,
+// (A^t (A u))^t (A^t (A u)) = u^t (A^t A)^2 u , etc.
+// ================================================================
+
+
+#include "linbox/algorithms/blackbox-container-base.h"
+
+namespace LinBox
+{
+
+	template<class Field, class Vector>
+	class BlackboxSymmetrizeIterator : public BlackboxContainerBase< Field, Vector > {
+	public:
+		BlackboxSymmetrizeIterator() {}
+
+		BlackboxSymmetrizeIterator(Blackbox * D, const Field& F, const Vector& u0) :
+			BlackboxContainerBase< Field, Vector >(D, F) { init(u0); }
+
+		BlackboxSymmetrizeIterator(Blackbox * D, const Field& F) :
+			BlackboxContainerBase< Field, Vector >(D, F) { init( Field::RandIter(_field) ); }
+
+	private:
+		void _launch () {
+			if (casenumber) {
+				casenumber = 0;
+				_BB_domain->Apply(v, u);
+				DOTPROD(_value,v,v);
+			}
+			else {
+				casenumber = 1;
+				_BB_domain->ApplyTrans( u, v);
+				DOTPROD(_value,u,u);
+			}
+		}
+
+		void _wait () {}
+
+	};
+
+};
+
+
+#endif // __LINBOX_bbcontainer_symmetrize_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/linbox-config.h b/linbox/linbox-config.h
index f516211..2aadc0b 100644
--- a/linbox/linbox-config.h
+++ b/linbox/linbox-config.h
@@ -1,269 +1,99 @@
-#ifndef _LINBOX_LINBOX_CONFIG_H
-#define _LINBOX_LINBOX_CONFIG_H 1
- 
-/* linbox/linbox-config.h. Generated automatically at end of configure. */
-/* config.h.  Generated from config.h.in by configure.  */
-/* config.h.in.  Generated from configure.ac by autoheader.  */
-
-/* Define if building universal (internal helper macro) */
-/* #undef __LINBOX_AC_APPLE_UNIVERSAL_BUILD */
-
-/* what version of FFLAS-FFPACK is installed */
-#ifndef __LINBOX_FFLAS_FFPACK_VERSION 
-#define __LINBOX_FFLAS_FFPACK_VERSION  10600 
-#endif
-
-/* Define if GMP is version 3.xxx */
-/* #undef __LINBOX_GMP_VERSION_3 */
-
-/* Define that architecture uses big endian storage */
-/* #undef __LINBOX_HAVE_BIG_ENDIAN */
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#ifndef __LINBOX_HAVE_DLFCN_H 
-#define __LINBOX_HAVE_DLFCN_H  1 
-#endif
-
-/* Define if FFLAS-FFPACK is installed */
-#ifndef __LINBOX_HAVE_FFLAS_FFPACK 
-#define __LINBOX_HAVE_FFLAS_FFPACK  1 
-#endif
-
-/* Define to 1 if you have the <float.h> header file. */
-#ifndef __LINBOX_HAVE_FLOAT_H 
-#define __LINBOX_HAVE_FLOAT_H  1 
-#endif
-
-/* Define if FPLLL is installed */
-#ifndef __LINBOX_HAVE_FPLLL 
-#define __LINBOX_HAVE_FPLLL  1 
-#endif
-
-/* ps2pdf available as external program */
-#ifndef __LINBOX_HAVE_GHOSTSCRIPT 
-#define __LINBOX_HAVE_GHOSTSCRIPT  1 
-#endif
-
-/* Define if GIVARO is installed */
-#ifndef __LINBOX_HAVE_GIVARO 
-#define __LINBOX_HAVE_GIVARO  1 
-#endif
-
-/* Define if GMP is installed */
-#ifndef __LINBOX_HAVE_GMP 
-#define __LINBOX_HAVE_GMP  1 
-#endif
-
-/* gnuplot available as external program */
-#ifndef __LINBOX_HAVE_GNUPLOT 
-#define __LINBOX_HAVE_GNUPLOT  1 
-#endif
-
-/* Define if IML is installed */
-#ifndef __LINBOX_HAVE_IML 
-#define __LINBOX_HAVE_IML  1 
-#endif
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#ifndef __LINBOX_HAVE_INTTYPES_H 
-#define __LINBOX_HAVE_INTTYPES_H  1 
-#endif
-
-/* Define if LAPACK is available */
-/* #undef __LINBOX_HAVE_LAPACK */
-
-/* Define if LIDIA is installed */
-/* #undef __LINBOX_HAVE_LIDIA */
-
-/* Define to 1 if you have the <limits.h> header file. */
-#ifndef __LINBOX_HAVE_LIMITS_H 
-#define __LINBOX_HAVE_LIMITS_H  1 
-#endif
-
-/* Define that architecture uses little endian storage */
-#ifndef __LINBOX_HAVE_LITTLE_ENDIAN 
-#define __LINBOX_HAVE_LITTLE_ENDIAN  1 
-#endif
-
-/* Define if M4RI is installed */
-#ifndef __LINBOX_HAVE_M4RI 
-#define __LINBOX_HAVE_M4RI  1 
-#endif
-
-/* Define if M4RIE is installed */
-#ifndef __LINBOX_HAVE_M4RIE 
-#define __LINBOX_HAVE_M4RIE  1 
-#endif
-
-/* Define if MAPLE is installed */
-/* #undef __LINBOX_HAVE_MAPLE */
-
-/* Define to 1 if you have the <memory.h> header file. */
-#ifndef __LINBOX_HAVE_MEMORY_H 
-#define __LINBOX_HAVE_MEMORY_H  1 
-#endif
-
-/* Define if MPFR is installed */
-#ifndef __LINBOX_HAVE_MPFR 
-#define __LINBOX_HAVE_MPFR  1 
-#endif
-
-/* Define if NTL is installed */
-#ifndef __LINBOX_HAVE_NTL 
-#define __LINBOX_HAVE_NTL  1 
-#endif
-
-/* Define if SACLIB is installed */
-/* #undef __LINBOX_HAVE_SACLIB */
-
-/* Define to 1 if you have the <stddef.h> header file. */
-#ifndef __LINBOX_HAVE_STDDEF_H 
-#define __LINBOX_HAVE_STDDEF_H  1 
-#endif
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#ifndef __LINBOX_HAVE_STDINT_H 
-#define __LINBOX_HAVE_STDINT_H  1 
-#endif
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#ifndef __LINBOX_HAVE_STDLIB_H 
-#define __LINBOX_HAVE_STDLIB_H  1 
-#endif
-
-/* Define to 1 if you have the <strings.h> header file. */
-#ifndef __LINBOX_HAVE_STRINGS_H 
-#define __LINBOX_HAVE_STRINGS_H  1 
-#endif
-
-/* Define to 1 if you have the <string.h> header file. */
-#ifndef __LINBOX_HAVE_STRING_H 
-#define __LINBOX_HAVE_STRING_H  1 
-#endif
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#ifndef __LINBOX_HAVE_SYS_STAT_H 
-#define __LINBOX_HAVE_SYS_STAT_H  1 
-#endif
-
-/* Define to 1 if you have the <sys/time.h> header file. */
-#ifndef __LINBOX_HAVE_SYS_TIME_H 
-#define __LINBOX_HAVE_SYS_TIME_H  1 
-#endif
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#ifndef __LINBOX_HAVE_SYS_TYPES_H 
-#define __LINBOX_HAVE_SYS_TYPES_H  1 
-#endif
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#ifndef __LINBOX_HAVE_UNISTD_H 
-#define __LINBOX_HAVE_UNISTD_H  1 
-#endif
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
-   */
-#ifndef __LINBOX_LT_OBJDIR 
-#define __LINBOX_LT_OBJDIR  ".libs/" 
-#endif
-
-/* define is the version of Maple have access function to gmp data */
-/* #undef __LINBOX_MAPLE_GMP_ACCESS */
-
-/* Name of package */
-#ifndef __LINBOX_PACKAGE 
-#define __LINBOX_PACKAGE  "linbox" 
-#endif
-
-/* Define to the address where bug reports for this package should be sent. */
-#ifndef __LINBOX_PACKAGE_BUGREPORT 
-#define __LINBOX_PACKAGE_BUGREPORT  "linbox-use at googlegroups.com" 
-#endif
-
-/* Define to the full name of this package. */
-#ifndef __LINBOX_PACKAGE_NAME 
-#define __LINBOX_PACKAGE_NAME  "LinBox" 
-#endif
-
-/* Define to the full name and version of this package. */
-#ifndef __LINBOX_PACKAGE_STRING 
-#define __LINBOX_PACKAGE_STRING  "LinBox 1.3.2" 
-#endif
-
-/* Define to the one symbol short name of this package. */
-#ifndef __LINBOX_PACKAGE_TARNAME 
-#define __LINBOX_PACKAGE_TARNAME  "linbox" 
-#endif
-
-/* Define to the home page for this package. */
-#ifndef __LINBOX_PACKAGE_URL 
-#define __LINBOX_PACKAGE_URL  "http://www.linalg.org/" 
-#endif
-
-/* Define to the version of this package. */
-#ifndef __LINBOX_PACKAGE_VERSION 
-#define __LINBOX_PACKAGE_VERSION  "1.3.2" 
-#endif
-
-/* The size of `char', as computed by sizeof. */
-#ifndef __LINBOX_SIZEOF_CHAR 
-#define __LINBOX_SIZEOF_CHAR  1 
+/* Copyright (C) 2013 the members of the LinBox group
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * This file is part of the LinBox library.
+ *
+ * ========LICENCE========
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * LinBox 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *
+ */
+
+#ifndef __LINBOX_linbox_config_H
+#define __LINBOX_linbox_config_H
+
+/** @file linbox-config.h
+ * @brief linbox base configuration file
+ */
+#include <fflas-ffpack/fflas-ffpack-config.h>
+#include "config.h"
+// #include "linbox-configuration.h"
+
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647L)
+#endif
+
+//#include <cstdint>
+// #include <givaro/givconfig.h>
+// #include <gmp++/gmp++.h>
+#include <cfloat> // BB : needed on some rare platforms...
+#include <cmath>
+
+#include <cctype>
+#include <iostream>
+
+using std::ptrdiff_t;
+
+
+#ifdef __LINBOX_HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS
+// else ??
+#endif
+#include <stdint.h>
+#ifndef INT32_MAX
+#error "INT32_MAX is not defined. It should at least be defined in Givaro..."
+#endif
+#endif
+
+#ifdef __FFLASFFPACK_USE_SIMD
+#define __LINBOX_USE_SIMD
+#else
+#define __LINBOX_NO_SIMD
 #endif
 
-/* The size of `int', as computed by sizeof. */
-#ifndef __LINBOX_SIZEOF_INT 
-#define __LINBOX_SIZEOF_INT  4 
-#endif
 
-/* The size of `long', as computed by sizeof. */
-#ifndef __LINBOX_SIZEOF_LONG 
-#define __LINBOX_SIZEOF_LONG  8 
-#endif
+namespace LinBox {
 
-/* The size of `long long', as computed by sizeof. */
-#ifndef __LINBOX_SIZEOF_LONG_LONG 
-#define __LINBOX_SIZEOF_LONG_LONG  8 
-#endif
+	typedef ptrdiff_t index_t;
 
-/* The size of `short', as computed by sizeof. */
-#ifndef __LINBOX_SIZEOF_SHORT 
-#define __LINBOX_SIZEOF_SHORT  2 
-#endif
+	const int BlasBound = 1 << 26;
 
-/* The size of `__int64', as computed by sizeof. */
-#ifndef __LINBOX_SIZEOF___INT64 
-#define __LINBOX_SIZEOF___INT64  0 
-#endif
+	//! used to separate BLAS2 and BLAS3 operations
+	struct ContainerCategories {
+		struct Any {} ;
+		struct Vector : public Any {};
+		struct Matrix : public Any {};
+		struct Other  : public Any {};
+	} ;
 
-/* Define to 1 if you have the ANSI C header files. */
-#ifndef __LINBOX_STDC_HEADERS 
-#define __LINBOX_STDC_HEADERS  1 
-#endif
+	//! Trait for the Category
+	template<class Container>
+	struct ContainerTraits {
+		typedef ContainerCategories::Any  ContainerCategory ;
+	} ;
+}
 
-/* Version number of package */
-#ifndef __LINBOX_VERSION 
-#define __LINBOX_VERSION  "1.3.2" 
-#endif
 
-/* optimized threshold for switching to strassen matrix multiplication */
-#ifndef __LINBOX_WINOTHRESHOLD 
-#define __LINBOX_WINOTHRESHOLD  1896 
-#endif
+#endif // __LINBOX_linbox_config_H
 
-/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
-   significant byte first (like Motorola and SPARC, unlike Intel). */
-#if defined AC_APPLE_UNIVERSAL_BUILD
-# if defined __BIG_ENDIAN__
-#  define WORDS_BIGENDIAN 1
-# endif
-#else
-# ifndef WORDS_BIGENDIAN
-/* #  undef WORDS_BIGENDIAN */
-# endif
-#endif
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
 
-/* Define if Expat is installed */
-/* #undef __LINBOX_XMLENABLED */
- 
-/* once: _LINBOX_LINBOX_CONFIG_H */
-#endif
diff --git a/linbox/linbox-tags.h b/linbox/linbox-tags.h
new file mode 100644
index 0000000..a307ccc
--- /dev/null
+++ b/linbox/linbox-tags.h
@@ -0,0 +1,139 @@
+/* Copyright (C) 2010,2011,2012 LinBox
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file linbox-tags.h
+ * @ingroup algorithms
+ * @brief Provides tags for various algorithms/solutions, à la \c FFLAS.
+ * This is a subset of Fflas* enums.
+ */
+
+#ifndef __LINBOX_linbox_tags_H
+#define __LINBOX_linbox_tags_H
+
+#include <fflas-ffpack/fflas/fflas_enum.h>
+#include "linbox/linbox-config.h"
+
+#define LINBOX_enum(name) name
+
+#if HAVE_CXX11
+#define SCOPED(name) struct name : int32_t
+#else
+#define SCOPED(name) name 
+#endif
+
+namespace LinBox
+{
+
+	/*! Structure for tags.
+	 * Tags are simple enums that set a choice in a routine.
+	 * For instance, if the user wants a <i>right</i> nullspace,
+	 * she will use a \c Tag::Right parameter.
+	 *
+	 * There it total compatiblity with \c FFLAS tags (cross link)
+	 * For instance, in LinBox, it is similar to use \c Tag::Upper and
+	 * <code>(Tag::Shape) FFLAS::FflasUpper</code>.
+	 *
+	 * @note Tags are not Methods.
+	 */
+	namespace Tag {
+		//! Left/Right Tag
+		enum SCOPED(Side)
+			{
+				Left  = FFLAS::FflasLeft, //!< Left
+				Right = FFLAS::FflasRight  //!< Right
+			};
+
+					   //! (No)Transpose Tag
+		enum SCOPED(Transpose)
+		{
+
+			NoTrans = FFLAS::FflasNoTrans,
+			Trans   = FFLAS::FflasTrans
+		};
+
+		//! (Upp/Low)er Tag
+		enum SCOPED(UpLo)
+		{
+			Upper = FFLAS::FflasUpper,
+			Lower = FFLAS::FflasLower
+		} ;
+
+		using Shape = UpLo;
+
+		//! (Non)Unit Diagonal Tag
+		enum SCOPED(Diag)
+		{
+			NonUnit = FFLAS::FflasNonUnit,
+			Unit    = FFLAS::FflasUnit
+		} ;
+
+		//! Dense format (table) output Tag
+		enum SCOPED(FileFormat)
+		{
+			Plain = 0,
+			Maple = 1,
+			HTML  = 2,
+			LaTeX = 3,
+			Detect,
+			Guillaume,
+			Turner,
+			Matlab,
+			Pretty,
+			MagmaCpt,
+			OneBased,
+			MatrixMarket
+
+		} ;
+
+
+
+		enum SCOPED(Direction)
+		{
+			Row = 10 ,
+			Col = 11
+		} ;
+
+		enum SCOPED(Sign)
+		{
+			Positive    = 500 , //! is  >0 (strictement positif)
+			Negative    = 501 , //! is  <0 (strictement négatif)
+			NonNegative = 502 , //! is >=0 (positif)
+			NonPositive = 503 , //! is <=0 (négatif)
+			NonZero     = 504 , //! is !=0 (non nul)
+			Zero        = 505   //! is ==0 (nul)
+
+		};
+
+	} // namespace Tag
+
+} // namespace LinBox
+#undef SCOPE
+#endif // __LINBOX_linbox_tags_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/Makefile.am b/linbox/matrix/Makefile.am
index 7cd215d..6cfe185 100644
--- a/linbox/matrix/Makefile.am
+++ b/linbox/matrix/Makefile.am
@@ -18,50 +18,48 @@
 # ========LICENCE========
 
 
-
 pkgincludesubdir=$(pkgincludedir)/matrix
 
-BASIC_HDRS =                                     \
-    archetype.h                                  \
-    matrix-category.h                            \
-    sparse.h             sparse.inl              \
-    transpose-matrix.h                           \
-    dense-rows-matrix.h                          \
-    matrix-domain.h      matrix-domain.inl       \
-    matrix-domain-gf2.h                          \
-    blas-matrix.h                                \
-    blas-matrix.inl      blas-submatrix.inl      \
-    blas-matrix-multimod.h                       \
-    factorized-matrix.h  factorized-matrix.inl   \
-    blas-triangularmatrix.inl                    \
-    permutation-matrix.h permutation-matrix.inl  \
-    random-matrix.h      random-matrix.inl
+SUBDIRS= sparsematrix densematrix matrixdomain sliced3
+
+BASIC_HDRS =                  \
+	archetype.h               \
+	matrix-category.h         \
+	matrix-traits.h           \
+	transpose-matrix.h        \
+	plain-matrix.h            \
+	dense-matrix.h            \
+	matrix-domain.h           \
+	sparse-matrix.h           \
+	sparse-formats.h          \
+	factorized-matrix.h       \
+	factorized-matrix.inl     \
+	permutation-matrix.h      \
+	permutation-matrix.inl    \
+	abnormal-matrix.h         \
+	abnormal-helpers.h        \
+	random-matrix.h           \
+	random-matrix.inl         \
+	sliced3.h		  \
+	polynomial-matrix.h                
 
 NTL_HDRS =
-GIVARO_HDRS =
-LIDIA_HDRS =
 
 if LINBOX_HAVE_NTL
 USE_NTL_HDRS = $(NTL_HDRS)
 endif
 
-if LINBOX_HAVE_GIVARO
-USE_GIVARO_HDRS = $(GIVARO_HDRS)
-endif
-
-if LINBOX_HAVE_LIDIA
-USE_LIDIA_HDRS = $(LIDIA_HDRS)
-endif
-
 pkgincludesub_HEADERS =     \
     $(BASIC_HDRS)           \
-    $(USE_NTL_HDRS)         \
-    $(USE_GIVARO_HDRS)      \
-    $(USE_LIDIA_HDRS)
+    $(USE_NTL_HDRS)
 
 EXTRA_DIST =            \
     $(NTL_HDRS)         \
-    $(GIVARO_HDRS)      \
-    $(LIDIA_HDRS)       \
-    matrix.doxy
+    matrix.doxy \
+    sparse-matrix.doxy \
+    dense-matrix.doxy \
+    sliced3.doxy \
+    permutation-matrix.doxy \
+    matrix-domain.doxy \
+    matrix-iterators.doxy
 
diff --git a/linbox/matrix/Makefile.in b/linbox/matrix/Makefile.in
deleted file mode 100644
index 7c54307..0000000
--- a/linbox/matrix/Makefile.in
+++ /dev/null
@@ -1,605 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/matrix
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/matrix
-BASIC_HDRS = \
-    archetype.h                                  \
-    matrix-category.h                            \
-    sparse.h             sparse.inl              \
-    transpose-matrix.h                           \
-    dense-rows-matrix.h                          \
-    matrix-domain.h      matrix-domain.inl       \
-    matrix-domain-gf2.h                          \
-    blas-matrix.h                                \
-    blas-matrix.inl      blas-submatrix.inl      \
-    blas-matrix-multimod.h                       \
-    factorized-matrix.h  factorized-matrix.inl   \
-    blas-triangularmatrix.inl                    \
-    permutation-matrix.h permutation-matrix.inl  \
-    random-matrix.h      random-matrix.inl
-
-NTL_HDRS = 
-GIVARO_HDRS = 
-LIDIA_HDRS = 
- at LINBOX_HAVE_NTL_TRUE@USE_NTL_HDRS = $(NTL_HDRS)
- at LINBOX_HAVE_GIVARO_TRUE@USE_GIVARO_HDRS = $(GIVARO_HDRS)
- at LINBOX_HAVE_LIDIA_TRUE@USE_LIDIA_HDRS = $(LIDIA_HDRS)
-pkgincludesub_HEADERS = \
-    $(BASIC_HDRS)           \
-    $(USE_NTL_HDRS)         \
-    $(USE_GIVARO_HDRS)      \
-    $(USE_LIDIA_HDRS)
-
-EXTRA_DIST = \
-    $(NTL_HDRS)         \
-    $(GIVARO_HDRS)      \
-    $(LIDIA_HDRS)       \
-    matrix.doxy
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/matrix/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps linbox/matrix/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
-	done
-
-uninstall-pkgincludesubHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
-	for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool ctags distclean distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-pkgincludesubHEADERS install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/matrix/abnormal-helpers.h b/linbox/matrix/abnormal-helpers.h
new file mode 100644
index 0000000..fc5b8f2
--- /dev/null
+++ b/linbox/matrix/abnormal-helpers.h
@@ -0,0 +1,171 @@
+/* Copyright (C) 2013 LinBox
+ * Written by AJS <stachnik at udel.edu>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file   linbox/matrix/abnormal-helpers.h
+ * @ingroup linbox/matrix
+ * @brief
+ */
+
+#ifndef __LINBOX_ABNORMAL_HELPERS_H
+#define __LINBOX_ABNORMAL_HELPERS_H
+
+#include <stdlib.h>
+#include <fstream>
+
+namespace LinBox
+{
+
+template <class Field>
+class AbnormalHelper {
+public:
+        typedef typename Field::Element Element;
+	typedef typename Field::Element Abnormal;
+
+	AbnormalHelper () {}
+
+	AbnormalHelper(const Field& F) : field_(&F) {}
+
+	void init(const Field& field) { field_=&field; }
+
+	inline Abnormal& mulacc(Abnormal& x, const Element& y, const Element& z) const {
+		field_->mulacc(x,y,z);
+		return x;
+	}
+
+	inline Element normalize(Abnormal& elt) const {
+		Element d;
+		field_->init(d,elt);
+		return d;
+	}
+
+protected:
+	Field* field_;
+};
+
+template <>
+class AbnormalHelper<Givaro::Modular<double> > {
+public:
+	typedef Givaro::Modular<double> Field;
+        typedef double Element;
+	typedef double Abnormal;
+
+	AbnormalHelper () {}
+
+	AbnormalHelper(const Field& field) {init(field);}
+
+	void init(const Field& field) {
+		modulus_=(double)field.characteristic();
+		unsigned long long maxDouble = 1ULL<<52;
+		bound_=(double)maxDouble;
+		field_=&field;
+	}
+
+	inline Abnormal& mulacc(Abnormal& x, const Element& y, const Element& z) const
+        {
+		Element d;
+		d=y*z;//at most (2**26-1)**2
+		x=x+d;//at most (2**26-1)**2+(2**52-1)<2**53
+                maybeNormalize(x);
+                return x;
+        }
+
+	inline Element& normalize(Abnormal& elt) const
+	{
+		return elt=fmod(elt,modulus_);
+	}
+
+protected:
+	inline Abnormal& maybeNormalize(Abnormal& elt) const
+	{
+		if (elt>=bound_) {
+			elt=fmod(elt,modulus_);
+		}
+		return elt;
+	}
+
+	double modulus_;
+
+	double bound_;
+
+	const Field* field_;
+};
+
+template <>
+class AbnormalHelper<Givaro::Modular<uint64_t> > {
+public:
+	typedef Givaro::Modular<uint64_t> Field;
+        typedef uint64_t Element;
+	typedef uint64_t Abnormal;
+
+	AbnormalHelper () {}
+
+	AbnormalHelper(const Field& field) {init(field);}
+
+	void init(const Field& field) {
+		modulus_=field.characteristic();
+		bound_=(uint64_t)(1ULL<<62);
+		field_=&field;
+	}
+
+	inline Abnormal& mulacc(Abnormal& x, const Element& y, const Element& z) const
+        {
+		Abnormal d;
+		d=y*z;
+		x=x+d;
+                maybeNormalize(x);
+                return x;
+        }
+
+	inline Element normalize(Abnormal& elt) const
+	{
+		return elt=elt%modulus_;
+	}
+
+protected:
+	inline Abnormal& maybeNormalize(Abnormal& elt) const
+	{
+		if (elt>=bound_) {
+                        elt=elt%modulus_;
+		}
+		return elt;
+	}
+
+	Abnormal modulus_;
+
+	Abnormal bound_;
+
+	const Field* field_;
+};
+
+}
+
+#endif // __LINBOX_ABNORMAL_HELPERS_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/abnormal-matrix.h b/linbox/matrix/abnormal-matrix.h
new file mode 100644
index 0000000..97115a7
--- /dev/null
+++ b/linbox/matrix/abnormal-matrix.h
@@ -0,0 +1,107 @@
+/* Copyright (C) 2013 LinBox
+ * Written by AJS <stachnik at udel.edu>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file   linbox/matrix/abnormal-matrix.h
+ * @ingroup matrix
+ * @brief
+ */
+
+#ifndef __LINBOX_ABNORMAL_MATRIX
+#define __LINBOX_ABNORMAL_MATRIX
+
+#include <stdlib.h>
+#include <fstream>
+#include "linbox/matrix/abnormal-helpers.h"
+
+namespace LinBox
+{
+
+template <class Field, class Matrix>
+class AbnormalMatrix {
+public:
+	typedef size_t Index;
+	typedef typename Field::Element Element;
+
+	AbnormalMatrix() {}
+
+	AbnormalMatrix(const Field& F, Matrix& mat) {init(F,mat);}
+
+	void init (const Field& F, Matrix& mat) {
+		mat_=&mat;
+		cols_=mat_->coldim();
+		rows_=mat_->rowdim();
+		field_=&F;
+		helper_.init(F);
+	}
+
+	inline Element& getEntry(Element& e, Index i, Index j) {
+		return mat_->getEntry(e,i,j);
+	}
+
+	inline void setEntry(Index i, Index j, const Element& e) {
+		mat_->setElement(i,j,e);
+	}
+
+	template <class Mat2>
+	void saxpyin(const Element& e, const Mat2& rhs,
+		     Index startRow, Index startCol,
+		     Index numRows, Index numCols) {
+		for (Index i=0;i<numRows;++i) {
+			for (Index j=0;j<numCols;++j) {
+				helper_.mulacc(mat_->refEntry(i+startRow,j+startCol),
+					       e,
+					       rhs.getEntry(i,j));
+			}
+		}
+	}
+
+	void normalize() {
+		for (Index i=0;i<rows_;++i) {
+			for (Index j=0;j<cols_;++j) {
+				helper_.normalize(mat_->refEntry(i,j));
+			}
+		}
+	}
+
+protected:
+	Matrix* mat_;
+
+	AbnormalHelper<Field> helper_;
+
+	const Field* field_;
+
+	Index cols_, rows_;
+};
+
+}
+
+#endif // __LINBOX_ABNORMAL_MATRIX
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/blas-matrix-multimod.h b/linbox/matrix/blas-matrix-multimod.h
deleted file mode 100644
index db588a4..0000000
--- a/linbox/matrix/blas-matrix-multimod.h
+++ /dev/null
@@ -1,218 +0,0 @@
-/* linbox/matrix/blas-matrix-multimod.h
- * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
- *
- * Written by :
- *               Pascal Giorgi  pascal.giorgi at ens-lyon.fr
- *               Clément Pernet clement.pernet at imag.fr
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*! @file matrix/blas-matrix-multimod.h
- * @ingroup matrix
- * A \c BlasMatrix<\c _Field > represents a matrix as an array of
- * <code>_Field::Element</code>s. It also has the BlasBlackbox interface.
- *
- */
-
-/*! @file matrix/blas-matrix-multimod.h
- * @brief specialisation for mutlimod field.
- */
-
-#ifndef __LINBOX_blas_matrix_multimod_H
-#define __LINBOX_blas_matrix_multimod_H
-
-#include "linbox/util/debug.h"
-
-#include "linbox/vector/subiterator.h"
-#include "linbox/vector/subvector.h"
-
-#include "linbox/matrix/matrix-category.h"
-#include "linbox/algorithms/linbox-tags.h"
-#include "linbox/matrix/blas-matrix.h"
-
-THIS_CODE_MAY_NOT_COMPILE_AND_IS_NOT_TESTED
-
-namespace LinBox
-{ /*  Specialisation of BlasMatrix for MultiModDouble field */
-
-	/*! No Doc.
-	*/
-	template<>
-	class BlasMatrix<MultiModDouble> {
-
-	public:
-
-		typedef MultiModDouble         Field;
-		typedef std::vector<double>  Element;
-		typedef BlasMatrix<MultiModDouble> Self_t;
-
-	protected:
-
-		MultiModDouble                 _field;
-		const std::vector<MatrixDomain<Modular<double> > >   _MD;
-		size_t                  _row,_col;
-		Element                _One,_Zero;
-		std::vector<BlasMatrix<Modular<double> >* > _rep;
-		std::vector<double>       _entry;
-	public:
-
-
-		//BlasMatrix () {}
-
-		BlasMatrix (const MultiModDouble& F) :
-			_field(F) , _rep(F.size()), _entry(F.size())
-		{}
-
-		BlasMatrix (const Field& F, size_t m, size_t n, bool alloc=true) :
-			_field(F), _row(m) , _col(n) , _rep(F.size()),  _entry(F.size())
-		{
-			for (size_t i=0;i<_rep.size();++i)
-				_rep[i] =  new BlasMatrix<Modular<double> > (F.getBase(i), m, n);
-		}
-
-		BlasMatrix (const BlasMatrix<MultiModDouble> & A):
-			_field(A._field),_row(A._row), _col(A._col),
-			_rep(A._rep.size()), _entry(A._entry)
-		{
-
-			for (size_t i=0;i<_rep.size();++i)
-				_rep[i]= new  BlasMatrix<Modular<double> > (const_cast<BlasMatrix<Modular<double> >& >( *A._rep[i]));
-		}
-
-
-		const BlasMatrix<MultiModDouble>& operator=(const BlasMatrix<MultiModDouble> & A)
-		{
-			_field   = A._field;
-			_row = A._row;
-			_col = A._col;
-			_rep = std::vector<BlasMatrix<Modular<double> >* >(A._rep.size());
-			_entry = A._entry;
-			for (size_t i=0;i<_rep.size();++i)
-				_rep[i]= new  BlasMatrix<Modular<double> > (const_cast<BlasMatrix<Modular<double> >& >( *A._rep[i]));
-			return *this;
-		}
-
-
-		~BlasMatrix() {for (size_t i=0; i< _rep.size();++i) {delete _rep[i];} }
-
-		template <class Vector1, class Vector2>
-		Vector1&  apply (Vector1& y, const Vector2& x) const
-		{
-			for (size_t i=0;i<_rep.size();++i) {
-				std::vector<double> x_tmp(x.size()), y_tmp(y.size());
-				for (size_t j=0;j<x.size();++j)
-					x_tmp[j]= x[j][i];
-
-				_rep[i]->apply(y_tmp, x_tmp);
-
-				for (size_t j=0;j<y.size();++j){
-					y[j][i]=y_tmp[j];
-
-				}
-			}
-
-			return y;
-		}
-
-		template <class Vector1, class Vector2>
-		Vector1&  applyTranspose (Vector1& y, const Vector2& x) const
-		{
-			for (size_t i=0;i<_rep.size();++i) {
-				std::vector<double> x_tmp(x.size()), y_tmp(y.size());
-				for (size_t j=0;j<x.size();++j)
-					x_tmp[i]= x[j][i];
-
-				_rep[i]->applyTranspose(y_tmp, x_tmp);
-
-				for (size_t j=0;j<y.size();++j)
-					y[j][i]=y_tmp[i];
-			}
-
-			return y;
-		}
-
-#if 0
-		template<typename _Tp1>
-		struct rebind
-		{
-			typedef BlasMatrix<_Tp1> other;
-
-			void operator() (other *& Ap, const Self_t& A, const _Tp1& F) {
-				Ap = new other(F, A.rowdim(), A.coldim());
-				Hom<Field, _Tp1> hom(A. field(), F);
-
-				hom.image (*Ap_p, *A_p);
-			}
-		};
-#endif
-
-		size_t rowdim() const {return _row;}
-
-		size_t coldim() const {return _col;}
-
-
-		const Field &field() const  {return _field;}
-
-
-		std::ostream& write(std::ostream& os) const
-		{
-			for (size_t i=0;i<_rep.size();++i)
-				_rep[i]->write(os);
-			return os;
-		}
-
-
-		void setEntry (size_t , size_t j, const Element &a_ij)
-		{
-			for (size_t i=0; i< _rep.size();++i)
-				_rep[i]->setEntry(i,j,a_ij[i]);
-		}
-
-
-		const Element& getEntry (size_t , size_t j)
-		{
-			for (size_t i=0; i< _rep.size();++i)
-				_entry[i]=_rep[i]->getEntry(i,j);
-			return _entry;
-		}
-
-		BlasMatrix<Modular<double> >*& getMatrix(size_t i) {return _rep[i];}
-
-	};
-
-
-	template <>
-	class MatrixContainerTrait<BlasMatrix<MultiModDouble> > {
-	public:
-		typedef MatrixContainerCategory::Blackbox Type;
-	};
-} // LinBox
-
-#endif // __LINBOX_blas_matrix_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/matrix/blas-matrix.h b/linbox/matrix/blas-matrix.h
deleted file mode 100644
index c7f8b59..0000000
--- a/linbox/matrix/blas-matrix.h
+++ /dev/null
@@ -1,1210 +0,0 @@
-/* linbox/matrix/blas-matrix.h
- * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
- *
- * Written by :
- *               Pascal Giorgi  pascal.giorgi at ens-lyon.fr
- *               Clément Pernet clement.pernet at imag.fr
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*! @file matrix/blas-matrix.h
- * @ingroup matrix
- * A \c BlasMatrix<\c _Field > represents a matrix as an array of
- * <code>_Field::Element</code>s. It also has the BlasBlackbox interface.
- *
- */
-
-#ifndef __LINBOX_blas_matrix_H
-#define __LINBOX_blas_matrix_H
-
-#include "linbox/vector/subiterator.h"
-#include "linbox/vector/subvector.h"
-
-#include "linbox/util/debug.h"
-#include "linbox/matrix/matrix-category.h"
-#include "linbox/algorithms/linbox-tags.h"
-
-namespace LinBox
-{ /*  not generic wrt Field (eg NTL_ZZ_p) */
-	namespace Protected
-	{
-
-		template <class Field>
-		bool checkBlasApply(const Field &F, size_t n)
-		{
-
-			integer chara, card;
-			F.characteristic(chara);
-			F.cardinality(card);
-
-			if ((chara != card) || chara == 0)
-				return false;
-			else
-				if (n*chara*chara < integer("9007199254740992"))
-					return true;
-				else
-					return false;
-		}
-	}
-}
-
-namespace LinBox
-{ /*  Blas Matrix */
-	template<class _Field>
-	class BlasSubmatrix ;
-
-	/*! Dense matrix representation.
-	 * @ingroup matrix
-	 * A BlasMatrix is a matrix of \p _Field::Element, with the structure of BLAS matrices.
-	 * It is basically a vector of \p _Field::Element.
-	 * In the Mother model, a BlasMatrix is allocated by the user.
-	 */
-	template <class _Field>
-	class BlasMatrix {
-		// private :
-
-	public:
-		typedef _Field                                Field;
-		typedef typename Field::Element             Element;    //!< Element type
-		typedef typename RawVector<Element>::Dense      Rep;    //!< Actually a <code>std::vector<Element></code> (or alike.)
-		typedef typename Rep::pointer               pointer;    //!< pointer type to elements
-		typedef const pointer                 const_pointer;    //!< const pointer type
-		typedef BlasMatrix<_Field>                   Self_t;    //!< Self type
-
-	protected:
-		size_t			    _row;
-		size_t			    _col;
-		Rep			    _rep;
-		pointer			    _ptr;
-		const Field		    & _field;
-		const MatrixDomain<Field>    _MD;
-		const VectorDomain<Field>    _VD;
-		bool		     _use_fflas ;
-
-
-	private:
-
-#if 0
-		void makePointer()
-		{
-#if 0
-			if (_row && _col) {
-				_ptr = malloc( _row*_col*sizeof(_Element) ) ;
-				linbox_check(_ptr);
-			}
-			else
-				_ptr = NULL ;
-#endif
-			_rep = Rep(_row*_col);
-			_ptr = &_rep[0];
-		}
-#endif
-
-		/*! @internal
-		 * @name create BlasMatrix
-		 * @{ */
-
-		/*! @internal
-		 * Copy data according to blas container structure.
-		 * Specialisation for BlasContainer.
-		 */
-		void createBlasMatrix (const BlasMatrix<_Field> & A) ;
-
-		/*! @internal
-		 * Copy data according to blas container structure.
-		 * Specialisation for BlasContainer.
-		 */
-		template <class _Matrix>
-		void createBlasMatrix (const _Matrix& A, MatrixContainerCategory::BlasContainer) ;
-
-		/*! @internal
-		 * Copy data according to Matrix container structure.
-		 * Specialisation for Container
-		 */
-		template <class Matrix>
-		void createBlasMatrix (const Matrix& A, MatrixContainerCategory::Container) ;
-
-		/*! @internal
-		 * Copy data according to blackbox structure.
-		 * Specialisation for Blackbox.
-		 */
-		template <class Matrix>
-		void createBlasMatrix (const Matrix& A, MatrixContainerCategory::Blackbox) ;
-
-		/*! @internal
-		 * Copy data according to Matrix container structure (allow submatrix).
-		 * Specialisation for Container
-		 */
-		template <class _Matrix>
-		void createBlasMatrix (const _Matrix& A,
-				       const size_t i0,const size_t j0,
-				       const size_t m, const size_t n,
-				       MatrixContainerCategory::Container) ;
-
-		/*! @internal
-		 * Copy data according to Matrix container structure (allow submatrix).
-		 * Specialisation for BlasContainer.
-		 */
-		template <class Matrix>
-		void createBlasMatrix (const Matrix& A,
-				       const size_t i0,const size_t j0,
-				       const size_t m, const size_t n,
-				       MatrixContainerCategory::BlasContainer) ;
-
-		/*! @internal
-		 * Copy data according to blackbox structure (allow submatrix).
-		 * Specialisation for Blackbox matrices
-		 * @todo need to be implemented by succesive apply
-		 */
-		template <class Matrix>
-		void createBlasMatrix (const Matrix& A,
-				       const size_t i0,const size_t j0,
-				       const size_t m, const size_t n,
-				       MatrixContainerCategory::Blackbox) ;
-
-		/*!@internal constructor from vector of elements.
-		 * @param v pointer to \c Element s
-		 */
-		void createBlasMatrix ( const Element * v) ;
-
-		/*!@internal constructor from vector of elements.
-		 * @param v std::vector of \c Element s
-		 */
-		void createBlasMatrix ( const std::vector<Element> & v) ;
-		/*! @internal
-		 * @}
-		 */
-
-	public:
-
-		//////////////////
-		// CONSTRUCTORS //
-		//////////////////
-
-
-		/*! Allocates a new \f$ 0 \times 0\f$ matrix.
-		*/
-		BlasMatrix (const _Field &F) ;
-
-		/*! Allocates a new \f$ 0 \times 0\f$ matrix.
-		*/
-		BlasMatrix () ;
-
-		/*! Allocates a new \f$ m \times n\f$ matrix.
-		 * @param F
-		 * @param m rows
-		 * @param n cols
-		 */
-		//@{
-#ifdef __GNUC__
-#ifndef __x86_64__
-#if (__GNUC__ == 4 && __GNUC_MINOR__ ==4 && __GNUC_PATCHLEVEL__==5)
-		template<class T>
-		BlasMatrix (const _Field &F, const long &m, const T &n) ;
-#endif
-#endif
-#endif
-
-		// Pascal Giorgi: fix a bug with MAC OSX
-		// MAC OSX defines in stdint.h the int64_t to be a long long which causes trouble here
-		// might be useful to add signed type either but need to resolve conflict with pathch version above for GCC-4.4.5
-#ifdef __APPLE__
-
-		template<class T>
-		BlasMatrix (const _Field &F, const unsigned long &m, const T &n) ;
-#endif
-
-		template<class T>
-		BlasMatrix (const _Field &F, const uint64_t &m, const T &n) ;
-
-		template<class T>
-		BlasMatrix (const _Field &F, const int64_t &m, const T &n) ;
-
-		template<class T>
-		BlasMatrix (const _Field &F, const uint32_t &m, const T  &n) ;
-
-		template<class T>
-		BlasMatrix (const _Field &F, const int32_t &m, const T &n) ;
-
-		template<class T>
-		BlasMatrix (const _Field &F, const Integer & m, const T &n) ;
-
-		//@}
-
-
-		/*! Constructor from a matrix stream.
-		 * @param ms matrix stream.
-		 */
-		BlasMatrix(MatrixStream<_Field>& ms) ;
-
-		/*! Generic copy constructor from either a blackbox or a matrix container.
-		 * @param A matrix to be copied
-		 */
-		template <class Matrix>
-		BlasMatrix (const Matrix &A) ;
-
-		/*! Generic copy constructor from either a blackbox or a matrix container (allow submatrix).
-		 * @param A matrix to be copied
-		 * @param i0
-		 * @param j0
-		 * @param m rows
-		 * @param n columns
-		 */
-		template <class Matrix>
-		BlasMatrix (const Matrix& A,
-			    const size_t i0, const size_t j0,
-			    const size_t m,  const size_t n) ;
-
-		/*! Constructor.
-		 * @param A matrix to be copied
-		 * @param F Field
-		 */
-		template<class _Matrix>
-		BlasMatrix (const _Matrix &A,  const _Field &F) ;
-
-		/*! Copy Constructor of a matrix (copying data).
-		 * @param A matrix to be copied.
-		 */
-		BlasMatrix (const BlasMatrix<_Field>& A) ;
-
-		/*- Copy Constructor of a matrix (copying data).
-		 * @param A matrix to be copied.
-		 */
-		// BlasMatrix (const BlasSubmatrix<_Field>& A) ;
-
-		/*! Create a BlasMatrix from a vector of elements
-		 * @param F
-		 * @param v
-		 * @param m
-		 * @param n
-		 */
-		BlasMatrix (const _Field &F, const std::vector<Element>& v,
-			    size_t m, size_t n) ;
-
-		/*! Create a BlasMatrix from an array of elements
-		 * @param F
-		 * @param v
-		 * @param m
-		 * @param n
-		 */
-		BlasMatrix (const _Field &F, const Element * v,
-			    size_t m, size_t n) ;
-
-
-		/** Constructor using a finite vector stream (stream of the rows).
-		 * @param  F The field of entries; passed so that arithmetic may be done
-		 *           on elements
-		 * @param  stream A vector stream to use as a source of vectors for this
-		 *                matrix
-		 */
-		template <class StreamVector>
-		BlasMatrix (const Field &F, VectorStream<StreamVector> &stream) ;
-
-		/// Destructor.
-		~BlasMatrix () ;
-
-		//! operator = (copying data)
-		BlasMatrix<_Field>& operator= (const BlasMatrix<_Field>& A) ;
-
-		//! Rebind operator
-		template<typename _Tp1>
-		struct rebind ;
-
-		//////////////////
-		//  DIMENSIONS  //
-		//////////////////
-
-		/** Get the number of rows in the matrix.
-		 * @returns Number of rows in matrix
-		 */
-		size_t rowdim() const ;
-
-		/** Get the number of columns in the matrix.
-		 * @returns Number of columns in matrix
-		 */
-		size_t coldim() const ;
-
-		/*! Get the stride of the matrix.
-		 */
-		size_t getStride() const;
-
-		/*!Get a reference to the stride of the matrix.
-		 * Modify stride this way.
-		 */
-		size_t& getWriteStride();
-
-
-		/** Resize the matrix to the given dimensions.
-		 * The state of the matrix's entries after a call to this method is
-		 * undefined
-		 * @param m Number of rows
-		 * @param n Number of columns
-		 * @param val
-		 */
-		void resize (size_t m, size_t n, const Element& val = Element()) ;
-
-		//////////////////
-		//   ELEMENTS   //
-		//////////////////
-
-		/*! @internal
-		 * Get read-only pointer to the matrix data.
-		 */
-		pointer getPointer() const ;
-
-		const_pointer &getConstPointer() const ;
-
-
-		/*! @internal
-		 * Get write pointer to the matrix data.
-		 * Data may be changed this way.
-		 */
-		pointer& getWritePointer() ;
-
-		/** Set the entry at the (i, j) position to a_ij.
-		 * @param i Row number, 0...rowdim () - 1
-		 * @param j Column number 0...coldim () - 1
-		 * @param a_ij Element to set
-		 */
-		void setEntry (size_t i, size_t j, const Element &a_ij) ;
-
-		/** Get a writeable reference to the entry in the (i, j) position.
-		 * @param i Row index of entry
-		 * @param j Column index of entry
-		 * @returns Reference to matrix entry
-		 */
-		Element &refEntry (size_t i, size_t j) ;
-
-		/** Get a read-only reference to the entry in the (i, j) position.
-		 * @param i Row index
-		 * @param j Column index
-		 * @returns Const reference to matrix entry
-		 */
-		const Element &getEntry (size_t i, size_t j) const ;
-
-		/** Copy the (i, j) entry into x, and return a reference to x.
-		 * This form is more in the Linbox style and is provided for interface
-		 * compatibility with other parts of the library
-		 * @param x Element in which to store result
-		 * @param i Row index
-		 * @param j Column index
-		 * @returns Reference to x
-		 */
-		Element &getEntry (Element &x, size_t i, size_t j) const ;
-
-		///////////////////
-		// TRANSPOSE &AL //
-		///////////////////
-
-		/*! Creates a transposed matrix of \c *this.
-		 * @param[in] tM
-		 * @return the transposed matrix of this.
-		 */
-		BlasMatrix<_Field> transpose(BlasMatrix<_Field> & tM) const ;
-
-
-		/*! Transpose (inplace).
-		 * If rows and columns agree, we can transpose inplace.
-		 */
-		template<bool _IP>
-		void transpose() ;
-
-		void transpose() ;
-
-		/*! Reverse the rows of a matrix.
-		 * This is done inplace.
-		 * Let J=antiDiag(1) (or the matrix of the reverse
-		 * permutation or the matrix (i,j) = (i+j+1==m)). Then,
-		 * we compute A <- J.A;
-		 */
-		void reverseRows() ;
-
-		/*! Reverse the columns of a matrix.
-		 * This is done inplace.
-		 * This is A <- J.A
-		 */
-		void reverseCols() ;
-
-		/*! Reverse the rows/columns of a matrix.
-		 * This is done inplace.
-		 * This is A <- J.A.J
-		 */
-		void reverse() ;
-
-		///////////////////
-		//      I/O      //
-		///////////////////
-
-		/** Read the matrix from an input stream.
-		 * The stream is in SMS or DENSE format and is autodetected.
-		 * @param file Input stream from which to read
-		 */
-		std::istream &read (std::istream &file);
-
-		/** Write the matrix to an output stream.
-		 * @param os Output stream to which to write
-		 * @param f write in some format (@ref LinBoxTag::Format). Default is Maple's.
-		 */
-		std::ostream &write (std::ostream &os,
-				     enum LinBoxTag::Format f = LinBoxTag::FormatMaple) const;
-
-		/*! @deprecated Only for compatiblity.
-		 */
-		std::ostream &write (std::ostream &os,
-				     bool mapleFormat) const
-		{
-			if (mapleFormat)
-				return write(os,LinBoxTag::FormatMaple);
-			else
-				return write(os);
-		}
-
-
-
-
-		///////////////////
-		//   ITERATORS   //
-		///////////////////
-
-		/** @name Column of rows iterator
-		 * \brief
-		 * The column of rows iterator traverses the rows of the
-		 * matrix in ascending order. Dereferencing the iterator yields
-		 * a row vector in dense format
-		 */
-		//@{
-		typedef Subvector<typename Rep::iterator, typename Rep::const_iterator> Row;
-		typedef Subvector<typename Rep::const_iterator>                    ConstRow;
-
-		/*!  Row Iterator.
-		 * @ingroup iterators
-		 * @brief NO DOC
-		 */
-		class RowIterator;
-		/*! Const Row Iterator.
-		 * @ingroup iterators
-		 * @brief NO DOC
-		 */
-		class ConstRowIterator;
-
-		RowIterator      rowBegin ();
-		RowIterator      rowEnd ();
-		ConstRowIterator rowBegin () const;
-		ConstRowIterator rowEnd   () const;
-		//@}
-
-		/** @name Row of columns iterator
-		 * \brief
-		 * The row of columns iterator traverses the columns of the
-		 * matrix in ascending order. Dereferencing the iterator yields
-		 * a column vector in dense format
-		 */
-		//@{
-		typedef Subvector<Subiterator<typename Rep::iterator> >            Col;
-		typedef Subvector<Subiterator<typename Rep::const_iterator> > ConstCol;
-		typedef Col           Column;
-		typedef ConstCol ConstColumn;
-
-		/*! Col Iterator.
-		 * @ingroup iterators
-		 * @brief NO DOC
-		 */
-		class ColIterator;
-		/*! Const Col Iterator.
-		 * @ingroup iterators
-		 * @brief NO DOC
-		 */
-		class ConstColIterator;
-
-		ColIterator      colBegin ();
-		ColIterator      colEnd ();
-		ConstColIterator colBegin () const;
-		ConstColIterator colEnd ()   const;
-		//@}
-
-		/** @name Iterator
-		 * \brief
-		 *
-		 * The iterator is a method for accessing all entries in the matrix
-		 * in some unspecified order. This can be used, e.g. to reduce all
-		 * matrix entries modulo a prime before passing the matrix into an
-		 * algorithm.
-		 */
-		//@{
-		typedef typename Rep::iterator Iterator;
-		typedef typename Rep::const_iterator ConstIterator;
-
-		Iterator      Begin ();
-		Iterator      End   ();
-		ConstIterator Begin () const;
-		ConstIterator End   () const;
-		//@}
-
-		/** @name Raw Indexed iterator
-		 * \brief
-		 *
-		 * Like the raw iterator, the indexed iterator is a method for
-		 * accessing all entries in the matrix in some unspecified order.
-		 * At each position of the the indexed iterator, it also provides
-		 * the row and column indices of the currently referenced entry.
-		 * This is provided through it's \c rowIndex() and \c colIndex() functions.
-		 */
-		//@{
-		class IndexedIterator;
-		/*! Const Indexed Iterator.
-		 * @ingroup iterators
-		 * @brief NO DOC
-		 */
-		class ConstIndexedIterator;
-
-		IndexedIterator      IndexedBegin ();
-		IndexedIterator      IndexedEnd   ();
-		ConstIndexedIterator IndexedBegin () const;
-		ConstIndexedIterator IndexedEnd   () const;
-		//@}
-
-		/** Retrieve a reference to a row.
-		 * Since rows may also be indexed, this allows A[i][j] notation
-		 * to be used.
-		 * @param i Row index
-		 */
-		//@{
-		Row      operator[] (size_t i) ;
-		ConstRow operator[] (size_t i) const ;
-		//@}
-
-		///////////////////
-		//     MISC     //
-		///////////////////
-
-
-		/** Compute column density.
-		 * @param v
-		 */
-		template <class Vector>
-		Vector &columnDensity (Vector &v) const ;
-
-		///////////////////
-		//   BLACK BOX   //
-		///////////////////
-
-
-		template <class Vector1, class Vector2>
-		Vector1&  apply (Vector1& y, const Vector2& x) const ;
-
-		template <class Vector1, class Vector2>
-		Vector1&  applyTranspose (Vector1& y, const Vector2& x) const ;
-
-		const _Field& field() const;
-		_Field& field() ;
-		// void setField(const _Field & F) { _field = F ; };
-
-		template<class uselessTag>
-		void changeFieldSpecialised( _Field & G,
-					     MatrixDomain<_Field> & MD,
-					     VectorDomain<_Field> & VD,
-					     const _Field & F,
-					     const uselessTag & m)
-		{
-			return;
-		}
-
-		void changeFieldSpecialised(      _Field & G,
-						  MatrixDomain<_Field> & MD,
-						  VectorDomain<_Field> & VD,
-					    const _Field & F,
-					    const RingCategories::ModularTag & m)
-		{
-			G=F ;
-			MD = MatrixDomain<_Field>(F);
-			VD = VectorDomain<_Field>(F);
-			return;
-		}
-
-
-		void changeField(const _Field &F)
-		{
-			changeFieldSpecialised(const_cast<_Field&>(_field),
-					       const_cast<MatrixDomain<_Field>&>(_MD),
-					       const_cast<VectorDomain<_Field>&>(_VD),
-					       F,
-					       typename FieldTraits<_Field>::categoryTag());
-		}
-
-
-
-	}; // end of class BlasMatrix
-
-	template <class _Field>
-	struct MatrixTraits< BlasMatrix<_Field> > {
-		typedef BlasMatrix<_Field> MatrixType;
-		typedef typename MatrixCategories::RowColMatrixTag MatrixCategory;
-	};
-
-	template <class _Field>
-	struct MatrixTraits< const BlasMatrix<_Field> > {
-		typedef const BlasMatrix<_Field> MatrixType;
-		typedef typename MatrixCategories::RowColMatrixTag MatrixCategory;
-	};
-
-	/*! Write a matrix to a stream.
-	 * The \c C++ way using <code>operator<<</code>
-	 * @param o output stream
-	 * @param Mat matrix to write.
-	 */
-	template<class T>
-	std::ostream& operator<< (std::ostream & o, const BlasMatrix<T> & Mat)
-	{
-		return Mat.write(o);
-	}
-
-} // end of namespace LinBox
-
-namespace LinBox
-{ /* Blas Submatrix */
-	/*! Dense Submatrix representation.
-	 * @ingroup matrix
-	 * A @ref BlasSubmatrix is a matrix of \p _Field::Element, with the structure of BLAS matrices.
-	 * It is basically a read/write view on a vector of \p _Field::Element.
-	 * In the Mother model, a @ref BlasSubmatrix is not allocated.
-	 * <p>
-	 * This matrix type conforms to the same interface as @ref BlasMatrix,
-	 * except that you cannot resize it. It represents a submatrix of a dense
-	 * matrix. Upon construction, one can freely manipulate the entries in the
-	 * DenseSubmatrix, and the corresponding entries in the underlying
-	 * @ref BlasMatrix will be modified.
-
-
-	 */
-	template <class _Field>
-	class BlasSubmatrix {
-	public :
-		typedef _Field                       Field;
-		typedef typename Field::Element      Element;      //!< Element type
-		typedef BlasSubmatrix<_Field>        Self_t;       //!< Self type
-		typedef typename RawVector<Element>::Dense      Rep;    //!< Actually a <code>std::vector<Element></code> (or alike.)
-		typedef typename Rep::pointer        pointer;    //!< pointer type to elements
-		typedef const pointer                const_pointer;    //!< const pointer type
-
-
-	protected:
-		BlasMatrix<_Field> *_Mat;       //!< Parent BlasMatrix (ie raw vector)
-		size_t _row;                   //!< row dimension of Submatrix
-		size_t _col;                   //!< col dimension of Submatrix
-		size_t _r0;                    //!< upper left corner row of Submatrix in \p _Mat
-		size_t _c0;                    //!< upper left corner row of Submatrix in \p _Mat
-		size_t _stride ;               //!< number of columns in \p _Mat (or stride of \p _Mat)
-		size_t _off;
-
-	public:
-
-		//////////////////
-		// CONSTRUCTORS //
-		//////////////////
-
-
-		/*  constructors */
-
-		/** NULL constructor.  */
-		BlasSubmatrix () ;
-
-		/** Constructor from an existing @ref BlasMatrix and dimensions.
-		 * \param M Pointer to @ref BlasMatrix of which to construct submatrix
-		 * \param rowbeg Starting row
-		 * \param colbeg Starting column
-		 * \param Rowdim Row dimension
-		 * \param Coldim Column dimension
-		 */
-		BlasSubmatrix (const BlasMatrix<_Field> &M,
-			       size_t rowbeg,
-				size_t colbeg,
-				size_t Rowdim,
-				size_t Coldim);
-
-		/** Constructor from an existing @ref BlasMatrix
-		 * \param M Pointer to @ref BlasMatrix of which to construct submatrix
-		 */
-		BlasSubmatrix (const BlasMatrix<_Field> &M);
-
-
-		/** Constructor from an existing submatrix and dimensions
-		 * @param SM Constant reference to BlasSubmatrix from which to
-		 *           construct submatrix
-		 * @param rowbeg Starting row
-		 * @param colbeg Starting column
-		 * @param Rowdim Row dimension
-		 * @param Coldim Column dimension
-		 */
-		BlasSubmatrix (const BlasSubmatrix<_Field> &SM,
-				size_t rowbeg,
-				size_t colbeg,
-				size_t Rowdim,
-				size_t Coldim);
-
-		/** Copy constructor.
-		 * @param SM Submatrix to copy
-		 */
-		BlasSubmatrix (const BlasSubmatrix<_Field> &SM);
-
-
-		/*  Members  */
-
-		/** Assignment operator.
-		 * Assign the given submatrix to this one
-		 * This is <i>only</i> renaming !
-		 * There is no copy because BlasSubmatrix owns nothing.
-		 * @param SM Submatrix to assign
-		 * @return Reference to this submatrix
-		 */
-		BlasSubmatrix &operator = (const BlasSubmatrix<_Field> &SM);
-
-		template<typename _Tp1>
-		struct rebind ;
-
-		//////////////////
-		//  DIMENSIONS  //
-		//////////////////
-
-		/** Get the number of rows in the matrix
-		 * @return Number of rows in matrix
-		 */
-		size_t rowdim () const;
-
-		/** Get the number of columns in the matrix
-		 * @return Number of columns in matrix
-		 */
-		size_t coldim () const ;
-
-		/*! Get the stride of the matrix.
-		 * @return stride of submatrix (number of cols of dense base matrix)
-		 */
-		size_t getStride() const;
-
-
-		///////////////////
-		//      I/O      //
-		///////////////////
-
-		/** Read the matrix from an input stream.
-		 * @param file Input stream from which to read
-		 * @bug reading a submatrix should not be allowed !!
-		 */
-		// template<class Field>
-		std::istream& read (std::istream &file/*, const Field& field*/);
-
-
-		/** Write the matrix to an output stream.
-		 * @param os Output stream to which to write
-		 * @param f write in some format (@ref LinBoxTag::Format). Default is Maple's.
-		 */
-		std::ostream &write (std::ostream &os,
-				     enum LinBoxTag::Format f = LinBoxTag::FormatMaple) const;
-
-		/*! @deprecated Only for compatiblity.
-		 */
-		std::ostream &write (std::ostream &os,
-				     bool mapleFormat) const
-		{
-			if (mapleFormat)
-				return write(os,LinBoxTag::FormatMaple);
-			else
-				return write(os);
-		}
-
-		//////////////////
-		//   ELEMENTS   //
-		//////////////////
-
-		/*! @internal
-		 * Get read-only pointer to the matrix data.
-		 */
-		pointer getPointer() const ;
-
-		const_pointer &getConstPointer() const ;
-
-
-		/*! @internal
-		 * Get write pointer to the matrix data.
-		 * Data may be changed this way.
-		 */
-		pointer& getWritePointer() ;
-
-
-		/** Set the entry at (i, j).
-		 * @param i Row number, 0...rowdim () - 1
-		 * @param j Column number 0...coldim () - 1
-		 * @param a_ij Element to set
-		 */
-		void setEntry (size_t i, size_t j, const Element &a_ij) ;
-
-		/** Get a writeable reference to an entry in the matrix.
-		 * @param i Row index of entry
-		 * @param j Column index of entry
-		 * @return Reference to matrix entry
-		 */
-		Element &refEntry (size_t i, size_t j) ;
-
-		/** Get a read-only individual entry from the matrix.
-		 * @param i Row index
-		 * @param j Column index
-		 * @return Const reference to matrix entry
-		 */
-		const Element &getEntry (size_t i, size_t j) const ;
-
-		/** Get an entry and store it in the given value.
-		 * This form is more in the Linbox style and is provided for interface
-		 * compatibility with other parts of the library
-		 * @param x Element in which to store result
-		 * @param i Row index
-		 * @param j Column index
-		 * @return Reference to x
-		 */
-		Element &getEntry (Element &x, size_t i, size_t j) const ;
-
-
-		///////////////////
-		//   ITERATORS   //
-		///////////////////
-
-		//! @name Forward declaration of Raw Iterators.
-		//@{
-		class Iterator  ;
-		class ConstIterator ;
-
-		class IndexedIterator ;
-		class ConstIndexedIterator ;
-		//@}
-
-
-		/** @name typedef'd Row Iterators.
-		 *\brief
-		 * The row iterator gives the rows of the
-		 * matrix in ascending order. Dereferencing the iterator yields
-		 * a row vector in dense format
-		 * @{
-		 */
-		typedef typename BlasMatrix<_Field>::RowIterator            RowIterator;
-		typedef typename BlasMatrix<_Field>::ConstRowIterator       ConstRowIterator;
-		typedef typename BlasMatrix<_Field>::Row                    Row;
-		typedef typename BlasMatrix<_Field>::ConstRow               ConstRow;
-		//@} Row Iterators
-
-		/** @name typedef'd Column Iterators.
-		 *\brief
-		 * The columns iterator gives the columns of the
-		 * matrix in ascending order. Dereferencing the iterator yields
-		 * a column vector in dense format
-		 * @{
-		 */
-		typedef typename BlasMatrix<_Field>::ColIterator            ColIterator;
-		typedef typename BlasMatrix<_Field>::ConstColIterator       ConstColIterator;
-		typedef typename BlasMatrix<_Field>::Col                    Col;
-		typedef typename BlasMatrix<_Field>::Column                 Column;
-		typedef typename BlasMatrix<_Field>::ConstCol               ConstCol;
-		//@} // Column Iterators
-
-
-
-		RowIterator      rowBegin ();        //!< iterator to the begining of a row
-		RowIterator      rowEnd ();          //!< iterator to the end of a row
-		ConstRowIterator rowBegin () const;  //!< const iterator to the begining of a row
-		ConstRowIterator rowEnd ()   const;  //!< const iterator to the end of a row
-
-		ColIterator      colBegin ();
-		ColIterator      colEnd ();
-		ConstColIterator colBegin () const;
-		ConstColIterator colEnd ()   const;
-
-		Iterator      Begin ();
-		Iterator      End ();
-		ConstIterator Begin () const;
-		ConstIterator End ()   const;
-
-
-		IndexedIterator      IndexedBegin();
-		IndexedIterator      IndexedEnd();
-		ConstIndexedIterator IndexedBegin() const;
-		ConstIndexedIterator IndexedEnd()   const;
-
-		/*!  operator[].
-		 * Retrieve a reference to a row
-		 * @param i Row index
-		 */
-		Row      operator[] (size_t i) ;
-		ConstRow operator[] (size_t i) const ;
-
-		///////////////////
-		//   BLACK BOX   //
-		///////////////////
-
-
-		template <class Vector1, class Vector2>
-		Vector1&  apply (Vector1& y, const Vector2& x) const
-		{
-			//_stride ?
-			if (_Mat->_use_fflas){
-				//!@bug this supposes &x[0]++ == &x[1]
-				FFLAS::fgemv((typename Field::Father_t) _Mat->_field, FFLAS::FflasNoTrans,
-					      _row, _col,
-					      _Mat->_field.one,
-					      _Mat->_ptr, getStride(),
-					      &x[0],1,
-					      _Mat->_field.zero,
-					      &y[0],1);
-			}
-			else {
-				_Mat->_MD. vectorMul (y, *this, x);
-#if 0
-				typename BlasMatrix<_Field>::ConstRowIterator i = this->rowBegin ();
-				typename Vector1::iterator j = y.begin ();
-
-				for (; j != y.end (); ++j, ++i)
-					_VD.dot (*j, *i, x);
-#endif
-			}
-			return y;
-		}
-
-		template <class Vector1, class Vector2>
-		Vector1&  applyTranspose (Vector1& y, const Vector2& x) const
-		{
-
-			//_stride ?
-			if (_Mat->_use_fflas) {
-				FFLAS::fgemv((typename Field::Father_t) _Mat->_field, FFLAS::FflasTrans,
-					      _row, _col,
-					      _Mat->_field.one,
-					      _Mat->_ptr, getStride(),
-					      &x[0],1,
-					      _Mat->_field.zero,
-					      &y[0],1);
-			}
-			else {
-				typename BlasMatrix<_Field>::ConstColIterator i = this->colBegin ();
-				typename Vector1::iterator j = y.begin ();
-				for (; j != y.end (); ++j, ++i)
-					_Mat->_VD.dot (*j, x, *i);
-			}
-
-			return y;
-		}
-
-		const _Field& field() const { return _Mat->field() ;}
-		_Field & field() { return _Mat->field(); }
-	};
-
-	template <class _Field>
-	struct MatrixTraits< BlasSubmatrix<_Field> > {
-		typedef BlasSubmatrix<_Field> MatrixType;
-		typedef typename MatrixCategories::RowColMatrixTag MatrixCategory;
-	};
-
-	template <class _Field>
-	struct MatrixTraits< const BlasSubmatrix<_Field> > {
-		typedef const BlasSubmatrix<_Field> MatrixType;
-		typedef typename MatrixCategories::RowColMatrixTag MatrixCategory;
-	};
-
-	/*! Write a matrix to a stream.
-	 * The C++ way using <code>operator<<</code>
-	 * @param o output stream
-	 * @param Mat matrix to write.
-	 */
-	template<class T>
-	std::ostream& operator<< (std::ostream & o, const BlasSubmatrix<T> & Mat)
-	{
-		return Mat.write(o);
-	}
-
-}
-
-namespace LinBox
-{ /* Triangular, Transposed Matrix */
-	//! Triangular BLAS matrix.
-	template <class _Field>
-	class TriangularBlasMatrix: public BlasMatrix<_Field> {
-
-	protected:
-
-		LinBoxTag::Shape          _uplo; //!< upper or lower triangular
-		LinBoxTag::Diag           _diag; //!< unit or non unit diagonal
-
-	public:
-		typedef _Field                       Field;
-		typedef typename Field::Element      Element;      //!< Element type
-		typedef BlasMatrix<_Field>           Father_t;
-		typedef TriangularBlasMatrix<_Field> Self_t;
-
-
-		/*! Constructor for a new \c TriangularBlasMatrix.
-		 * @param F
-		 * @param m rows
-		 * @param n cols
-		 * @param y (non)unit diagonal
-		 * @param x (upp/low)er matrix
-		 */
-		TriangularBlasMatrix (const Field & F,
-				      const size_t m, const size_t n,
-				      LinBoxTag::Shape x=LinBoxTag::Upper,
-				      LinBoxTag::Diag y= LinBoxTag::NonUnit) ;
-
-		/*! Constructor from a \c BlasMatrix (copy).
-		 * @param A matrix
-		 * @param y (non)unit diagonal
-		 * @param x (upp/low)er matrix
-		 */
-		TriangularBlasMatrix (const BlasMatrix<_Field>& A,
-				      LinBoxTag::Shape x=LinBoxTag::Upper,
-				      LinBoxTag::Diag y= LinBoxTag::NonUnit) ;
-
-		/*! Constructor from a \c BlasMatrix (no copy).
-		 * @param A matrix
-		 * @param y (non)unit diagonal
-		 * @param x (upp/low)er matrix
-		 */
-		TriangularBlasMatrix (BlasMatrix<_Field>& A,
-				      LinBoxTag::Shape x=LinBoxTag::Upper,
-				      LinBoxTag::Diag y= LinBoxTag::NonUnit) ;
-
-		/*! Constructor from a \c TriangularBlasMatrix (copy).
-		 * @param A matrix
-		 */
-		TriangularBlasMatrix (const TriangularBlasMatrix<_Field>& A) ;
-
-		/*! Generic constructor from a \c Matrix (no copy).
-		 * @param A matrix
-		 * @param y (non)unit diagonal
-		 * @param x (upp/low)er matrix
-		 */
-		template<class Matrix>
-		TriangularBlasMatrix (const Matrix& A,
-				      LinBoxTag::Shape x=LinBoxTag::Upper,
-				      LinBoxTag::Diag y= LinBoxTag::NonUnit) ;
-
-		/// get the shape of the matrix (upper or lower)
-		LinBoxTag::Shape getUpLo() const ;
-
-		/// Is the diagonal implicitly unit ?
-		LinBoxTag::Diag getDiag() const ;
-
-	}; // end of class TriangularBlasMatrix
-
-} // LinBox
-
-namespace LinBox
-{ /*  indexDomain : used only once in linbox/algorithms/rational-solver.inl */
-
-
-	/** Class used for permuting indices.
-	 * For example, create a vector <code>(0 1 2 ...)</code> over \c
-	 * size_t, then apply a permutation to it using a \c BlasMatrixDomain to
-	 * get the natural representation of the permutation.
-	 */
-	class indexDomain {
-	public:
-		typedef size_t Element;
-	public:
-		typedef indexDomain Father_t;
-		indexDomain() {};
-		template <class ANY>
-		size_t init(size_t& dst, const ANY& src) const {
-			return dst = static_cast<size_t>(src);
-		}
-		template <class ANY>
-		size_t assign(ANY& dst, const size_t& src) const {
-			return dst = static_cast<ANY>(src);
-		}
-		int characteristic() const { return 0 ; }
-	};
-}
-
-namespace LinBox
-{ /*  Transposed Matrix */
-	/*! TransposedBlasMatrix.
-	 * NO DOC
-	 */
-	template< class Matrix >
-	class TransposedBlasMatrix {
-
-	public:
-
-		/*! NO DOC
-		 * @param Mat
-		 */
-		TransposedBlasMatrix ( Matrix& Mat ) :
-			_Mat(Mat)
-		{}
-
-		/*! NO DOC
-		*/
-		Matrix& getMatrix() const
-		{
-			return _Mat;
-		}
-
-	protected:
-		Matrix& _Mat; //!< NO DOC
-	};
-
-	/*! TransposedBlasMatrix.
-	 * NO DOC
-	 */
-#if !defined(__INTEL_COMPILER) && !defined(__CUDACC__) & !defined(__clang__)
-	template <>
-#endif
-	template< class Matrix >
-	class TransposedBlasMatrix< TransposedBlasMatrix< Matrix > > : public Matrix {
-
-	public:
-		/*! TransposedBlasMatrix.
-		 * NO DOC
-		 */
-		TransposedBlasMatrix ( Matrix& Mat ) :
-			Matrix(Mat)
-		{}
-
-		/*! TransposedBlasMatrix.
-		 * NO DOC
-		 */
-		TransposedBlasMatrix ( const Matrix& Mat ) :
-			Matrix(Mat)
-		{}
-
-	};
-
-
-}
-
-
-#include "blas-matrix.inl"
-#include "blas-submatrix.inl"
-#include "blas-triangularmatrix.inl"
-
-#endif // __LINBOX_blas_matrix_H
-
-
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
-
diff --git a/linbox/matrix/blas-matrix.inl b/linbox/matrix/blas-matrix.inl
deleted file mode 100644
index 6400e00..0000000
--- a/linbox/matrix/blas-matrix.inl
+++ /dev/null
@@ -1,1742 +0,0 @@
-/* linbox/matrix/blas-matrix.h
- * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
- *
- * Written by :
- *               Pascal Giorgi  <pascal.giorgi at ens-lyon.fr>
- *               Clément Pernet <clement.pernet at imag.fr>
- *               Brice Boyer    <bboyer at imag.fr>
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*!@internal
- * @file matrix/blas-matrix.inl
- * @ingroup matrix
- * A \c BlasMatrix<\c _Field > represents a matrix as an array of
- * <code>_Field</code>s.
- */
-
-#ifndef __LINBOX_blas_matrix_INL
-#define __LINBOX_blas_matrix_INL
-
-/////////////////
-//   PRIVATE   //
-/////////////////
-
-namespace LinBox
-{
-	template<class _Field>
-	void BlasMatrix<_Field>::createBlasMatrix (const BlasMatrix<_Field>& A)
-	{
-#ifndef NDEBUG
-		if (!areFieldEqual(A.field(),_field)) {
-			A.field().write(std::cout) << "!=" ;
-			_field.write(std::cout) << std::endl;
-		}
-#endif
-		linbox_check( areFieldEqual(A.field(),_field));
-		createBlasMatrix(A,MatrixContainerCategory::BlasContainer());
-	}
-
-	template<class _Field>
-	void BlasMatrix<_Field>::createBlasMatrix (const Element * v)
-	{
-		const_pointer iter_v = v ;
-		const_pointer v_end = v+(_col*_row) ;
-		Iterator  iter_addr = this->Begin();
-		for (; v != v_end ; ++v, ++iter_addr)
-			_field.init(*iter_addr,*v);
-	}
-
-	template<class _Field>
-	void BlasMatrix<_Field>::createBlasMatrix (const std::vector<Element> & v)
-	{
-		typename std::vector< Element>::const_iterator iter_value = v.begin();
-		Iterator  iter_addr = this->Begin();
-		for (;iter_value != v.end(); ++iter_value,++iter_addr)
-			_field.init(*iter_addr,*iter_value);
-	}
-
-
-	template<class _Field>
-	template <class _Matrix>
-	void BlasMatrix<_Field>::createBlasMatrix (const _Matrix& A,
-						   MatrixContainerCategory::BlasContainer)
-	{
-		linbox_check( areFieldEqual(A.field(),_field));
-		typename _Matrix::ConstIterator         iter_value = A.Begin();
-		Iterator  iter_addr = this->Begin();
-		for (;iter_value != A.End(); ++iter_value,++iter_addr)
-			_field.init(*iter_addr, *iter_value);
-	}
-
-	template<class _Field>
-	template <class Matrix>
-	void BlasMatrix<_Field>::createBlasMatrix (const Matrix& A,
-						   MatrixContainerCategory::Container)
-	{
-		linbox_check( areFieldEqual(A.field(),_field));
-		// const Field & F = A.field();
-		//!@bug With both iterators, it is Segfaulting !!!!
-		typename Matrix::ConstIndexedIterator  iter_index = A.IndexedBegin();
-		for (;iter_index != A.IndexedEnd(); ++iter_index)
-			setEntry( iter_index.rowIndex(),
-				  iter_index.colIndex(),
-				  A.getEntry(iter_index.rowIndex(),iter_index.colIndex())
-				);
-	}
-
-	template<class _Field>
-	template <class Matrix>
-	void BlasMatrix<_Field>::createBlasMatrix (const Matrix& A,
-						   MatrixContainerCategory::Blackbox)
-	{
-		linbox_check( areFieldEqual(A.field(),_field) );
-
-		std::vector<Element> e(A.coldim(), _field.zero), tmp(A.rowdim());
-		ColIterator col_p;
-
-		typename BlasMatrix< _Field>::Col::iterator elt_p;
-		typename std::vector<Element>::iterator e_p, tmp_p;
-
-
-		for (col_p = colBegin(), e_p = e.begin();
-		     e_p != e.end(); ++ col_p, ++ e_p)
-		{
-
-			_field.assign(*e_p, _field.one);
-
-			A.apply (tmp, e);
-
-			for (tmp_p = tmp.begin(), elt_p = col_p -> begin();
-			     tmp_p != tmp.end(); ++ tmp_p, ++ elt_p)
-
-				_field.assign(*elt_p, *tmp_p);
-
-			_field.assign(*e_p, _field.zero);
-		}
-	}
-
-	template<class _Field>
-	template <class _Matrix>
-	void BlasMatrix<_Field>::createBlasMatrix (const _Matrix& A,
-						   const size_t i0,const size_t j0,
-						   const size_t m, const size_t n,
-						   MatrixContainerCategory::Container)
-	{
-		linbox_check( areFieldEqual(A.field(),_field ) );
-
-		typename _Matrix::ConstIterator         iter_value = A.Begin();
-		typename _Matrix::ConstIndexedIterator  iter_index = A.IndexedBegin();
-
-		for (;iter_value != A.End(); ++iter_value,++iter_index){
-			int i,j;
-			i=(int)iter_index.rowIndex()-(int)i0;
-			j=(int)iter_index.colIndex()-(int)j0;
-			if (( i >= 0)  && (j >= 0) && (i< (int)m) && (j < (int)n))
-				setEntry(i, j, *iter_value);
-		}
-	}
-
-	template<class _Field>
-	template <class Matrix>
-	void BlasMatrix<_Field>::createBlasMatrix (const Matrix& A,
-						   const size_t i0,const size_t j0,
-						   const size_t m, const size_t n,
-						   MatrixContainerCategory::BlasContainer)
-	{
-		linbox_check( areFieldEqual(A.field(),_field ) );
-
-		typename Matrix::ConstIterator         iter_value = A.Begin();
-		typename Matrix::ConstIndexedIterator  iter_index = A.IndexedBegin();
-
-		for (;iter_value != A.End(); ++iter_value,++iter_index){
-			int i,j;
-			i=(int)iter_index.rowIndex()-(int)i0;
-			j=(int)iter_index.colIndex()-(int)j0;
-			if ( (i>=0) && (j>=0) && (i< (int)m) && (j < (int)n))
-				setEntry(i, j, *iter_value);
-		}
-	}
-
-	template<class _Field>
-	template <class Matrix>
-	void BlasMatrix<_Field>::createBlasMatrix (const Matrix& A,
-						   const size_t i0,const size_t j0,
-						   const size_t m, const size_t n,
-						   MatrixContainerCategory::Blackbox)
-	{
-		linbox_check( areFieldEqual(A.field(),_field ) );
-
-
-		std::vector<Element> e(A.coldim(), _field.zero), tmp(A.rowdim());
-		ColIterator col_p;
-
-		typename BlasMatrix< _Field>::Col::iterator elt_p;
-		typename std::vector<Element>::iterator e_p, tmp_p;
-
-
-		for (col_p = colBegin(), e_p = e.begin()+j0;
-		     e_p != e.begin()+j0+n; ++ col_p, ++ e_p) {
-
-			_field.assign(*e_p, _field.one);
-
-			A.apply (tmp, e);
-
-			for (tmp_p = tmp.begin()+i0, elt_p = col_p -> begin();
-			     elt_p != col_p.end(); ++ tmp_p, ++ elt_p) {
-				_field.assign(*elt_p, *tmp_p);
-			}
-
-			_field.assign(*e_p, _field.zero);
-		}
-	}
-
-} // LinBox
-
-//////////////////
-// CONSTRUCTORS //
-//////////////////
-
-namespace LinBox
-{
-
-
-	template <class _Field>
-	BlasMatrix< _Field>::BlasMatrix (const _Field &F) :
-		_row(0),_col(0),_rep(0),_ptr(NULL),
-		_field(F),_MD(F),_VD(F),_use_fflas(false)
-	{ }
-
-	template <class _Field>
-	BlasMatrix< _Field>::BlasMatrix () :
-			_row(0),_col(0),_rep(0),_ptr(NULL),
-			_field(Field()),_MD(_field ),_VD(_field )
-		{}
-
-
-	template <class _Field>
-	template<class T>
-	BlasMatrix< _Field>::BlasMatrix ( const _Field &F, const uint32_t& m, const T& n) :
-		_row(m),_col(n),_rep(_row*_col),_ptr(&_rep[0]),
-		_field(F),_MD(F),_VD(F)
-	{
-		_use_fflas = Protected::checkBlasApply(_field,_col);
-	}
-
-	template <class _Field>
-	template<class T>
-	BlasMatrix< _Field>::BlasMatrix (const _Field &F, const int64_t& m, const T& n) :
-		_row((size_t)m),_col((size_t)n),_rep(_row*_col),_ptr(&_rep[0]),
-		_field(F),_MD(F),_VD(F)
-	{
-		linbox_check(n>=0);
-		linbox_check(m>=0);
-		_use_fflas = Protected::checkBlasApply(_field,_col);
-	}
-
-#ifdef __GNUC__
-#ifndef __x86_64__
-#if (__GNUC__ == 4 && __GNUC_MINOR__ ==4 && __GNUC_PATCHLEVEL__==5)
-	template <class _Field>
-	template<class T>
-	BlasMatrix< _Field>::BlasMatrix (const _Field &F, const long & m, const T& n) :
-		_row(m),_col(n),_rep(_row*_col),_ptr(&_rep[0]),
-		_field(F),_MD(F),_VD(F)
-	{
-		linbox_check(n>=0);
-		linbox_check(m>=0);
-		_use_fflas = Protected::checkBlasApply(_field,_col);
-	}
-#endif
-#endif
-#endif
-
-#ifdef __APPLE__
-	template <class _Field>
-	template<class T>
-	BlasMatrix< _Field>::BlasMatrix (const _Field &F, const unsigned long & m, const T& n) :
-		_row(m),_col(n),_rep(_row*_col),_ptr(&_rep[0]),
-		_field(F),_MD(F),_VD(F)
-	{
-		linbox_check(n>=0);
-		linbox_check(m>=0);
-		_use_fflas = Protected::checkBlasApply(_field,_col);
-	}
-#endif
-
-
-	template <class _Field>
-	template<class T>
-	BlasMatrix< _Field>::BlasMatrix (const _Field &F, const uint64_t &m, const T & n) :
-		_row(m),_col(n),_rep(_row*_col),_ptr(&_rep[0]),
-		_field(F),_MD(F),_VD(F)
-	{
-		//!@todo
-		// linbox_check_non_neg(n);
-		// linbox_check(n>=0);
-		// makePointer();
-		_use_fflas = Protected::checkBlasApply(_field, _col);
-	}
-
-	template <class _Field>
-	template<class T>
-	BlasMatrix< _Field>::BlasMatrix (const _Field &F, const int32_t & m, const T &n) :
-		_row((size_t) m),_col((size_t)n),_rep(_row*_col),_ptr(&_rep[0]),
-		_field(F),_MD(F),_VD(F)
-	{
-		linbox_check(isPositive<T>(n));
-		linbox_check(m>=0);
-		// makePointer();
-		_use_fflas = Protected::checkBlasApply(_field, _col);
-	}
-
-	template <class _Field>
-	template<class T>
-	BlasMatrix< _Field>::BlasMatrix ( const _Field &F, const Integer & m, const T &n) :
-		_row(m),_col(n),_rep(_row*_col),_ptr(&_rep[0]),
-		_field(F),_MD(F),_VD(F)
-	{
-		//!@todo check m,n not too big ?
-		linbox_check(n>=0);
-		linbox_check(m>=0);
-		// makePointer();
-		_use_fflas = Protected::checkBlasApply(_field, _col);
-	}
-
-
-
-	template <class _Field>
-	BlasMatrix< _Field>::BlasMatrix(MatrixStream<_Field>& ms) :
-		_row(0),_col(0),_rep(0),
-		_field(ms.getField()),_MD(_field ),_VD(_field )
-	{
-		if( !ms.getArray(_rep) || !ms.getRows(_row) || !ms.getColumns(_col) )
-			throw ms.reportError(__FUNCTION__,__LINE__);
-		_ptr = &_rep[0];
-		_use_fflas = Protected::checkBlasApply(_field, _col);
-	}
-
-	template <class _Field>
-	template <class StreamVector>
-	BlasMatrix< _Field>::BlasMatrix (const Field &F, VectorStream<StreamVector> &stream) :
-		_row(stream.size ()), _col(stream.dim ()), _rep(_row*_col), _ptr(&_rep[0]),
-		_field (F), _MD (F), _VD(F)
-	{
-		StreamVector tmp;
-		typename BlasMatrix<Field>::RowIterator p;
-
-		VectorWrapper::ensureDim (tmp, stream.dim ());
-
-		for (p = BlasMatrix<Field>::rowBegin (); p != BlasMatrix<Field>::rowEnd (); ++p) {
-			stream >> tmp;
-			_VD.copy (*p, tmp);
-		}
-		_use_fflas = Protected::checkBlasApply(_field, _col);
-	}
-
-
-	template <class _Field>
-	template <class Matrix>
-	BlasMatrix< _Field>::BlasMatrix (const Matrix &A) :
-		_row(A.rowdim()),_col(A.coldim()),_rep(_row*_col),_ptr(&_rep[0]),
-		_field(A.field()),_MD(_field ),_VD(_field )
-	{
-		// makePointer();
-		_use_fflas = Protected::checkBlasApply(_field, _col);
-		createBlasMatrix(A, typename MatrixContainerTrait<Matrix>::Type());
-	}
-
-	template <class _Field>
-	template <class Matrix>
-	BlasMatrix< _Field>::BlasMatrix (const Matrix& A,
-					 const size_t i0, const size_t j0,
-					 const size_t m, const size_t n) :
-		_row(m),_col(n),_rep(_row*_col),_ptr(&_rep[0]),
-		_field(A.field()),_MD(_field ),_VD(_field )
-	{
-		_use_fflas = Protected::checkBlasApply(_field, _col);
-		// makePointer();
-		createBlasMatrix(A, i0, j0, m, n,
-				 typename MatrixContainerTrait<Matrix>::Type());
-	}
-
-	template <class _Field>
-	template<class _Matrix>
-	BlasMatrix< _Field>::BlasMatrix (const _Matrix &A,  const _Field &F) :
-		_row(A.rowdim()), _col(A.coldim()),_rep(_row*_col),_ptr(&_rep[0]),
-		_field(F),_MD(_field ),_VD(_field )
-	{
-		_use_fflas = Protected::checkBlasApply(_field, _col);
-		typename _Matrix::template rebind<_Field>()(*this,A);
-	}
-
-	template <class _Field>
-	BlasMatrix< _Field>::BlasMatrix (const BlasMatrix< _Field>& A) :
-		_row(A.rowdim()), _col(A.coldim()),_rep(_row*_col),_ptr(&_rep[0]),
-		_field(A.field()),_MD(_field ),_VD(_field )
-	{
-		_use_fflas = Protected::checkBlasApply(_field, _col);
-		// makePointer();
-		createBlasMatrix(A);
-	}
-
-	template <class _Field>
-	BlasMatrix< _Field>::BlasMatrix (const _Field &F,
-					 const std::vector<typename _Field::Element>& v,
-					 size_t m, size_t n) :
-		_row(m), _col(n),_rep(_row*_col),_ptr(&_rep[0]),
-		_field(F),_MD(_field ),_VD(_field )
-	{
-		linbox_check(v.size() == m*n);
-		// makePointer();
-		_use_fflas = Protected::checkBlasApply(_field, _col);
-		createBlasMatrix(v);
-	}
-
-	template <class _Field>
-	BlasMatrix< _Field>::BlasMatrix (const _Field &F,
-					 const typename _Field::Element * v,
-					 size_t m, size_t n) :
-		_row(m), _col(n),_rep(_row*_col),_ptr(&_rep[0]),
-		_field(F), _MD(_field ),_VD(_field )
-	{
-		// makePointer();
-		_use_fflas = Protected::checkBlasApply(_field, _col);
-		createBlasMatrix(_field,v);
-	}
-
-	template <class _Field>
-	BlasMatrix< _Field>::~BlasMatrix ()
-	{
-		// if (_ptr)
-		// free(_ptr);
-	}
-
-} // LinBox
-
-///////////////////
-//      I/O      //
-///////////////////
-
-namespace LinBox
-{
-
-	template <class _Field>
-	// template <class Field>
-	std::istream &BlasMatrix< _Field>::read (std::istream &file)
-	{
-#if 0
-		Iterator p;
-		int m,n;
-		char c;
-		file>>m>>n>>c;
-
-		if (m*n < _row*_col)
-			cerr<<"NOT ENOUGH ELEMENT TO READ\n";
-		else {
-			for (p = Begin (); p != End (); ++p) {
-				integer tmp;
-				file>>tmp;cout<<tmp<<endl;
-				//file.ignore(1);
-				F.read (file, *p);
-			}
-		}
-#endif
-
-
-		Iterator p;
-		int m,n;
-		char c;
-		file>>m>>n>>c;
-		// std::cout << m << 'x' << n << ':' << c << std::endl;
-		_row = m; _col = n;
-
-		// _ptr.resize(_row * _col, zero);
-		resize(_row,_col);
-
-		if ((c != 'M') && (c != 'm')) {
-			for (p = Begin (); p != End (); ++p) {
-				//file.ignore(1);
-				_field.read (file, *p);
-			}
-		}
-		else { // sparse file format - needs fixing
-			int i, j;
-			while (true) {
-				file >> i >> j;
-				//file.ignore(1);
-				//if (! file) break;
-				if (i+j <= 0) break;
-				// std::cout << i << ',' << j << ':' ;
-				_field.read (file, _ptr[_col*(i-1) + j-1]);
-				// std::cout << _ptr[_col*(i-1) + j-1] << std::endl;
-			}
-		}
-
-		return file;
-	}
-
-	template <class _Field>
-	std::ostream& BlasMatrix< _Field>::write (std::ostream &os,
-						  enum LinBoxTag::Format f) const
-	{
-
-		ConstRowIterator p;
-
-		switch(f) {
-		case (LinBoxTag::FormatPlain) : /*  raw output */
-			{
-				integer c;
-				int wid;
-
-				_field.cardinality (c);
-
-				if (c >0) {
-					wid = (int) ceil (log ((double) c) / M_LN10);
-				}
-				else {
-					integer tmp;
-					size_t max=0;
-					ConstIterator it = Begin();
-					for (; it != End(); ++it){
-						_field.convert(tmp,*it);
-						if (tmp.bitsize() > max)
-							max= tmp.bitsize();
-					}
-					wid= (int) ceil ((double)max / M_LN10)+1;
-				}
-
-				for (p = rowBegin (); p != rowEnd ();++p) {
-					typename ConstRow::const_iterator pe;
-
-					os << "  [ ";
-
-					for (pe = p->begin (); pe != p->end (); ++pe) {
-						os.width (wid);
-						/*!  @warning
-						 * matrix base does not provide this field(), maybe should?
-						 * _Mat.field ().write (os, *pe);
-						 * os << *pe;
-						 * fixed by using extra field
-						 */
-
-						_field.write (os, *pe);
-						os << " ";
-					}
-
-					os << "]" << std::endl;
-				}
-			}
-			break;
-		case (LinBoxTag::FormatMaple) : /*  maple format */
-			{
-				os << "Matrix( " << rowdim() << ',' << coldim() << ",[" ;
-				for (p = rowBegin (); p != rowEnd (); ) {
-					typename ConstRow::const_iterator pe;
-
-					os << " [ ";
-
-					for (pe = p->begin (); pe != p->end (); ) {
-						_field.write (os, *pe);
-						++pe ;
-						if (pe != p->end())
-							os << ", ";
-					}
-
-					os << "]" ;
-					++p ;
-					if (p != rowEnd() )
-						os << ',' << std::endl;;
-
-				}
-				os << "])" ;
-			}
-			break;
-		case (LinBoxTag::FormatHTML) : /*  html format */
-			{
-				os << "<table border=\"1\">" ;
-				for (p = rowBegin (); p != rowEnd (); ) {
-					typename ConstRow::const_iterator pe;
-
-					os << "<tr>";
-
-					for (pe = p->begin (); pe != p->end (); ) {
-						_field.write (os << "<td>", *pe)<<"</td>";
-						++pe ;
-					}
-
-					os << "</tr>" << std::endl;
-					++p ;
-				}
-				os << "</table>" ;
-			}
-			break;
-		case (LinBoxTag::FormatLaTeX) : /*  latex format (pmatrix) */
-			{
-
-				os << "\\begin{pmatrix} " << std::endl;
-				for (p = rowBegin (); p != rowEnd (); ) {
-					typename ConstRow::const_iterator pe;
-
-
-					for (pe = p->begin (); pe != p->end (); ) {
-						_field.write (os, *pe);
-						++pe ;
-						if (pe != p->end())
-							os << "& ";
-					}
-
-					os << "\\\\" << std::endl;
-					++p ;
-
-				}
-				os << "\\end{pmatrix}" ;
-			}
-			break;
-		default : /*  this is an error */
-			{
-				throw LinBoxError("unknown format to write matrix in");
-			}
-		}
-		return os;
-	}
-
-	template <class _Field>
-	BlasMatrix< _Field>& BlasMatrix< _Field>::operator= (const BlasMatrix< _Field>& A)
-	{
-		if ( &A == this)
-			return *this;
-
-		_col = A.coldim();
-		_row = A.rowdim();
-		_rep = Rep(_row*_col);
-		_ptr = &_rep[0] ;
-		// const_cast<_Field&>(_field ) = A.field();
-		// changeField( A.field() );
-		createBlasMatrix(A);
-
-		return *this;
-	}
-
-#if 0 /*  loop rebind */
-	template <class _Field>
-	template<typename _Tp1>
-	struct BlasMatrix< _Field>::rebind {
-		typedef BlasMatrix<_Tp1> other;
-
-		void operator() (other & Ap, const Self_t& A, const _Tp1& F) {
-			// typedef typename BlasMatrix< _Field>::ConstIndexedIterator ConstIndexedIterator ;
-			// typedef typename BlasMatrix< _Field>::ConstIterator ConstIterator ;
-			ConstIterator         iter_value = A.Begin();
-			ConstIndexedIterator  iter_index = A.IndexedBegin();
-			typename _Tp1::Element tmp;
-			for (;iter_value != A.End(); ++iter_value,++iter_index){
-				Ap.field().init(  tmp, *iter_value );
-				Ap.setEntry(iter_index.rowIndex(), iter_index.colIndex(),tmp);
-			}
-		}
-		};
-#endif
-
-#if 1 /*  HOM */
-	template <class _Field>
-	template<typename _Tp1>
-	struct BlasMatrix< _Field>::rebind {
-		typedef BlasMatrix<_Tp1> other;
-
-		void operator() (other & Ap, const Self_t& A) {
-			typedef typename BlasMatrix<_Field>::ConstIterator ConstSelfIterator ;
-			typedef typename other::Iterator OtherIterator ;
-			OtherIterator    Ap_i = Ap.Begin();
-			ConstSelfIterator A_i = A.Begin();
-			Hom<Field, _Tp1> hom(A. field(), Ap. field()) ;
-			for ( ; A_i != A. End(); ++ A_i, ++ Ap_i)
-				hom.image (*Ap_i, *A_i);
-		}
-	};
-#endif
-
-
-	} // LinBox
-
-//////////////////
-//  DIMENSIONS  //
-//////////////////
-
-namespace LinBox
-{
-
-	template <class _Field>
-	size_t BlasMatrix< _Field>::rowdim() const
-	{
-		return _row ;
-	}
-
-	template <class _Field>
-	size_t BlasMatrix< _Field>::coldim() const
-	{
-		return _col ;
-	}
-
-	template <class _Field>
-	size_t  BlasMatrix< _Field>::getStride() const
-	{
-		return _col;
-	}
-
-	template <class _Field>
-	size_t&  BlasMatrix< _Field>::getWriteStride()
-	{
-		return _col;
-	}
-
-	template <class _Field>
-	void BlasMatrix< _Field>::resize (size_t m, size_t n, const Element& val )
-	{
-#ifndef NDEBUG
-		if (_col != n)
-			std::cerr << " ***Warning*** you are resizing a matrix, possibly loosing data. " << std::endl;
-#endif
-		_row = m;
-		_col = n;
-		_rep.resize (m * n, val);
-#if 0
-		if (_ptr) {
-			if (m && n)
-				realloc(_ptr,m*n*sizeof(Element));
-			else {
-				free(_ptr);
-				_ptr=NULL ;
-			}
-		}
-		else
-			makePointer();
-#endif
-	}
-
-} // LinBox
-
-//////////////////
-//   ELEMENTS   //
-//////////////////
-
-namespace LinBox
-{
-
-
-	template <class _Field>
-	typename BlasMatrix< _Field>::pointer
-	BlasMatrix< _Field>::getPointer() const
-	{
-		return _ptr;
-	}
-
-	template <class _Field>
-	typename BlasMatrix< _Field>::const_pointer &
-	BlasMatrix< _Field>::getConstPointer() const
-	{
-		return (const_pointer)_ptr;
-	}
-
-
-	template <class _Field>
-	typename BlasMatrix< _Field>::pointer&
-	BlasMatrix< _Field>::getWritePointer()
-	{
-		return _ptr;
-	}
-
-	template <class _Field>
-	void BlasMatrix< _Field>::setEntry (size_t i, size_t j, const Element &a_ij)
-	{
-		_ptr[i * _col + j] = a_ij;
-	}
-
-	template <class _Field>
-	typename _Field::Element & BlasMatrix< _Field>::refEntry (size_t i, size_t j)
-	{
-		return _ptr[i * _col + j];
-	}
-
-	template <class _Field>
-	const typename _Field::Element & BlasMatrix< _Field>::getEntry (size_t i, size_t j) const
-	{
-		return _ptr[i * _col + j];
-	}
-
-	template <class _Field>
-	typename _Field::Element & BlasMatrix< _Field>::getEntry (Element &x, size_t i, size_t j) const
-	{
-		x = _ptr[i * _col + j];
-		return x;
-	}
-
-} // LinBox
-
-///////////////////
-// TRANSPOSE &AL //
-///////////////////
-
-namespace LinBox
-{
-	template <class _Field>
-	BlasMatrix< _Field> BlasMatrix< _Field>::transpose(BlasMatrix< _Field> & tM) const
-	{
-		size_t r = this->rowdim() ;
-		size_t c = this->coldim() ;
-		linbox_check(tM.coldim() == r );
-		linbox_check(tM.rowdim() == c);
-		for (size_t i = 0 ; i < r ; ++i)
-			for (size_t j = 0 ; j < c ; ++j)
-				tM.setEntry(j,i,this->getEntry(i,j));
-		return tM;
-	}
-
-	namespace Protected
-	{
-		/*! @internal
-		 *  @brief In-Place Tranpose.
-		* Adapted from the Wikipedia article.
-		* @todo make it for strides and Submatrices
-		* @todo use specialized versions when available (eg dgetmi)
-		* @todo make transpose have an inplace=true default parameter
-		* (execpt maybe when below a threshold).
-		* @param m pointer to the beginning of a row-major matrix vector
-		* @param w rows in the matrix
-		* @param h cols in the matrix
-		*/
-		template<class T>
-		void transposeIP(T *m, size_t h, size_t w)
-		{
-			size_t start, next, i;
-			T tmp;
-
-			for (start = 0; start <= w * h - 1; ++start) {
-				next = start;
-				i = 0;
-				do {
-					++i;
-					next = (next % h) * w + next / h;
-				} while (next > start);
-				if (next < start || i == 1)
-					continue;
-
-				tmp = m[next = start];
-				do {
-					i = (next % h) * w + next / h;
-					m[next] = (i == start) ? tmp : m[i];
-					next = i;
-				} while (next > start);
-			}
-		}
-	} // Protected
-
-	template <class _Field>
-	template<bool _IP>
-	void BlasMatrix< _Field>::transpose()
-	{
-		size_t r = this->rowdim() ;
-		size_t c = this->coldim() ;
-
-		if ( r == c) {
-			for (size_t i = 0 ; i < r ; ++i)
-				for (size_t j = i+1 ; j < c ; ++j)
-					std::swap(this->refEntry(i,j),this->refEntry(j,i));
-		}
-		else {
-			if (!_IP) {
-				BlasMatrix<_Field> MM(*this);
-				std::swap(_row,_col);
-				// iterating row first seems faster.
-#ifdef _BLOCKIT
-				size_t B ;
-				B =  1024;
-
-				for (size_t bi = 0 ; bi < r/B ; ++bi) {
-					for (size_t bj = 0 ; bj < c/B ; ++bj){
-						for (size_t i = 0 ; i < B ; ++i)
-							for (size_t j = 0 ; j < B ; ++j)
-								this->setEntry(bj*B+j,bi*B+i,
-									       MM.getEntry(bi*B+i,bj*B+j));
-					}
-				}
-				for (size_t i = r/B*B ; i < r ; ++i)
-					for (size_t j = c/B*B ; j < c ; ++j)
-						this->setEntry(j,i,
-							       MM.getEntry(i,j));
-#else
-				for (size_t i = 0 ; i < r ; ++i)
-					for (size_t j = 0 ; j < c ; ++j)
-						this->setEntry(j,i,
-							       MM.getEntry(i,j));
-#endif
-
-			}
-			else {
-				Protected::transposeIP<Element>(_ptr,_row,_col);
-				std::swap(_row,_col);
-			}
-		}
-	}
-
-	template <class _Field>
-	void BlasMatrix< _Field>::transpose()
-	{
-		this->transpose<false>();
-	}
-
-	template <class _Field>
-	void BlasMatrix< _Field>::reverseRows()
-	{
-		size_t r = this->rowdim()/2 ;
-		for (size_t i = 0 ; i <  r ; ++i) {
-			_VD.swap( this->rowBegin()+i,
-				 this->rowBegin()+(r-1-i) );
-		}
-
-	}
-
-	template <class _Field>
-	void BlasMatrix< _Field>::reverseCols()
-	{
-		size_t r = this->rowdim() ;
-		size_t c = this->coldim()/2 ;
-		for (size_t j = 0 ; j < c ; ++j) {
-			for (size_t i = 0 ; i < r ; ++i) {
-				std::swap(this->refEntry(i,j),
-					  this->refEntry(i,c-j-1));
-
-			}
-		}
-	}
-
-	template <class _Field>
-	void BlasMatrix< _Field>::reverse()
-	{
-		size_t r = this->rowdim() ;
-		size_t c = this->coldim() ;
-		for (size_t j = 0 ; j < c ; ++j) {
-			for (size_t i = 0 ; i < r ; ++i) {
-				std::swap(this->refEntry(i,j),
-					  this->refEntry(r-i-1,c-j-1));
-
-			}
-		}
-	}
-} // LinBox
-
-///////////////////
-//   ITERATORS   //
-///////////////////
-
-namespace LinBox
-{
-
-	template <class _Field>
-	class BlasMatrix< _Field>::ConstRowIterator {
-	public:
-		ConstRowIterator (const typename Rep::const_iterator& p, size_t len, size_t d) :
-			_row (p, p + len), _dis (d)
-		{}
-
-		ConstRowIterator () {}
-
-		ConstRowIterator (const ConstRowIterator& colp) :
-			_row (colp._row), _dis (colp._dis)
-		{}
-
-		ConstRowIterator& operator = (const ConstRowIterator& colp)
-		{
-			_row = colp._row;
-			_dis = colp._dis;
-			return *this;
-		}
-
-		ConstRowIterator& operator --()
-		{
-			_row = ConstRow (_row.begin () - _dis, _row.end () - _dis);
-			return *this;
-		}
-
-		ConstRowIterator  operator-- (int)
-		{
-			ConstRowIterator tmp (*this);
-			--*this;
-			return tmp;
-		}
-
-
-		ConstRowIterator& operator++ ()
-		{
-			_row = ConstRow (_row.begin () + _dis, _row.end () + _dis);
-			return *this;
-		}
-
-		ConstRowIterator  operator++ (int)
-		{
-			ConstRowIterator tmp (*this);
-			++*this;
-			return tmp;
-		}
-
-		ConstRowIterator operator+ (int i)
-		{
-			return ConstRowIterator (_row.begin () + _dis * i, _row.size (), _dis);
-		}
-
-		ConstRowIterator& operator += (int i)
-		{
-			_row = ConstRow (_row.begin () + _dis * i, _row.end () + _dis * i);
-			return *this;
-		}
-
-		ConstRow operator[] (int i) const
-		{
-			return ConstRow (_row.begin () + _dis * i, _row.end () + _dis * i);
-		}
-
-		ConstRow* operator-> ()
-		{
-			return &_row;
-		}
-
-		ConstRow& operator* ()
-		{
-			return _row;
-		}
-
-		bool operator!= (const ConstRowIterator& c) const
-		{
-			return (_row.begin () != c._row.begin ()) || (_row.end () != c._row.end ()) || (_dis != c._dis);
-		}
-
-	private:
-		ConstRow _row;
-		size_t _dis;
-	};
-
-	template <class _Field>
-	class BlasMatrix< _Field>::RowIterator {
-	public:
-		RowIterator (const typename Rep::iterator& p, size_t len, size_t d) :
-			_row (p, p + len), _dis (d)
-		{}
-
-		RowIterator () {}
-
-		RowIterator (const RowIterator& colp) :
-			_row (colp._row), _dis (colp._dis)
-		{}
-
-		RowIterator& operator = (const RowIterator& colp)
-		{
-			_row = colp._row;
-			_dis = colp._dis;
-			return *this;
-		}
-
-		RowIterator& operator ++ ()
-		{
-			_row = Row (_row.begin () + _dis, _row.end () + _dis);
-			return *this;
-		}
-
-		RowIterator  operator ++ (int)
-		{
-			RowIterator tmp (*this);
-			++*this;
-			return tmp;
-		}
-
-		RowIterator& operator -- ()
-		{
-			_row = Row (_row.begin () - _dis, _row.end () - _dis);
-			return *this;
-		}
-
-		RowIterator  operator -- (int)
-		{
-			RowIterator tmp (*this);
-			--*this;
-			return tmp;
-		}
-
-		RowIterator operator + (int i)
-		{
-			return RowIterator (_row.begin () + _dis * i, _row.size (), _dis);
-		}
-
-		RowIterator& operator += (int i)
-		{
-			_row = Row (_row.begin () + _dis * i, _row.end () + _dis * i);
-			return *this;
-		}
-
-		Row operator[] (int i) const
-		{
-			return Row (const_cast<Row&> (_row).begin () + _dis * i,
-				    const_cast<Row&> (_row).end () + _dis * i);
-		}
-
-		Row* operator-> ()
-		{
-			return &_row;
-		}
-
-		Row& operator* ()
-		{
-			return _row;
-		}
-
-		bool operator!= (const RowIterator& c) const
-		{
-			return (_row.begin () != c._row.begin ()) || (_row.end () != c._row.end ()) || (_dis != c._dis);
-		}
-
-		operator ConstRowIterator ()
-		{
-			return ConstRowIterator (_row.begin (), _row.size (), _dis);
-		}
-
-	private:
-		Row _row;
-		size_t _dis;
-	};
-
-	template <class _Field>
-	class BlasMatrix< _Field>::ConstColIterator {
-	public:
-		ConstColIterator (typename Rep::const_iterator p, size_t stride, size_t len) :
-			_col (Subiterator<typename Rep::const_iterator> (p, stride),
-			      Subiterator<typename Rep::const_iterator> (p + len * stride, stride)),
-			_stride (stride)
-		{}
-
-		ConstColIterator (const ConstCol& col, size_t stride) :
-			_col (col),
-			_stride (stride)
-		{}
-
-		ConstColIterator () {}
-
-		ConstColIterator (const ConstColIterator& rowp) :
-			_col (rowp._col)
-		{}
-
-		ConstColIterator& operator= (const ConstColIterator& rowp)
-		{
-			_col = rowp._col;
-			_stride = rowp._stride;
-			return *this;
-		}
-
-		ConstColIterator& operator++ ()
-		{
-			_col = ConstCol (Subiterator<typename Rep::const_iterator> (_col.begin ().operator-> () + 1, _stride),
-					 Subiterator<typename Rep::const_iterator> (_col.end ().operator-> () + 1, _stride));
-			return *this;
-		}
-
-		ConstColIterator  operator++ (int)
-		{
-			ConstColIterator old(*this);
-			this->operator++ ();
-			return old;
-		}
-
-		ConstColIterator operator + (int i)
-		{
-			return ConstColIterator (_col.begin ().operator-> () + i, _stride, _col.size ());
-		}
-
-		ConstColIterator& operator += (int i)
-		{
-			_col = ConstCol (Subiterator<typename Rep::const_iterator> (_col.begin ().operator-> () + i, _stride),
-					 Subiterator<typename Rep::const_iterator> (_col.end ().operator-> () + i, _stride));
-			return *this;
-		}
-
-		ConstCol operator[] (int i) const
-		{
-			return ConstCol (Subiterator<typename Rep::const_iterator> (_col.begin ().operator-> () + i, _stride),
-					 Subiterator<typename Rep::const_iterator> (_col.end ().operator-> () + i, _stride));
-		}
-
-		ConstCol* operator-> ()
-		{
-			return &_col;
-		}
-
-		ConstCol& operator* ()
-		{
-			return _col;
-		}
-
-		bool operator!= (const ConstColIterator& c) const
-		{
-			return (_col.begin () != c._col.begin ()) || (_col.end () != c._col.end ());
-		}
-
-	private:
-		ConstCol _col;
-		size_t _stride;
-	};
-
-	template <class _Field>
-	class BlasMatrix< _Field>::ColIterator {
-	public:
-		ColIterator (typename Rep::iterator p, size_t stride, size_t len) :
-			_col (Subiterator<typename Rep::iterator> (p, stride),
-			      Subiterator<typename Rep::iterator> (p + len * stride, stride)), _stride (stride)
-		{}
-
-		ColIterator () {}
-
-		ColIterator (const ColIterator& rowp) :
-			_col (rowp._col)
-		{}
-
-		ColIterator& operator= (const ColIterator& rowp)
-		{
-			_col = rowp._col;
-			_stride = rowp._stride;
-			return *this;
-		}
-
-		const ColIterator& operator= (const ColIterator& rowp) const
-		{
-			const_cast<ColIterator*> (this)->_col = rowp._col;
-			return *this;
-		}
-
-		ColIterator& operator++ ()
-		{
-			_col = Col (Subiterator<typename Rep::iterator> (_col.begin ().operator-> () + 1, _stride),
-				    Subiterator<typename Rep::iterator> (_col.end ().operator-> () + 1, _stride));
-			return *this;
-		}
-
-		ColIterator  operator++ (int)
-		{
-			Col tmp (_col);
-			this->operator++ ();
-			return tmp;
-		}
-
-		ColIterator operator + (int i)
-		{
-			return ColIterator (_col.begin ().operator-> () + i, _stride, _col.size ());
-		}
-
-		ColIterator& operator += (int i)
-		{
-			_col = Col (Subiterator<typename Rep::iterator> (_col.begin ().operator-> () + i, _stride),
-				    Subiterator<typename Rep::iterator> (_col.end ().operator-> () + i, _stride));
-			return *this;
-		}
-
-		Col operator[] (int i) const
-		{
-			return Col (Subiterator<typename Rep::iterator> (const_cast<Col&> (_col).begin ().operator-> () + i, _stride),
-				    Subiterator<typename Rep::iterator> (const_cast<Col&> (_col).end ().operator-> () + i, _stride));
-		}
-
-		Col* operator-> ()
-		{
-			return &_col;
-		}
-
-		Col& operator* ()
-		{
-			return _col;
-		}
-
-		bool operator!= (const ColIterator& c) const
-		{
-			return (_col.begin () != c._col.begin ()) || (_col.end () != c._col.end ());
-		}
-
-		operator ConstColIterator ()
-		{
-			return ConstColIterator (reinterpret_cast<ConstCol&> (_col) , _stride);
-		}
-
-	private:
-
-		Col _col;
-		size_t _stride;
-	};
-
-	/*!   Indexed Iterator.
-	 * @ingroup iterators
-	 * @brief NO DOC
-	 */
-	template <class _Field>
-	class BlasMatrix< _Field>::IndexedIterator {
-		size_t _r_index;
-		size_t _c_index;
-		size_t _dim;
-		typename Rep::iterator _begin;
-		typedef typename _Field::Element value_type;
-
-	public:
-		IndexedIterator (const size_t  &dim,
-				 const size_t  &r_index,
-				 const size_t  &c_index,
-				 const typename Rep::iterator &begin) :
-			_r_index (r_index), _c_index (c_index), _dim (dim), _begin (begin)
-		{}
-
-		IndexedIterator () :
-			_r_index (0), _c_index (0), _dim (1), _begin (0)
-		{}
-
-		IndexedIterator (const IndexedIterator& r) :
-			_r_index (r._r_index), _c_index (r._c_index), _dim (r._dim), _begin (r._begin)
-		{}
-
-		IndexedIterator& operator = (const IndexedIterator &iter)
-		{
-			_r_index = iter._r_index;
-			_c_index = iter._c_index;
-			_dim = iter._dim;
-			_begin = iter._begin;
-			return *this;
-		}
-
-		bool operator == (const IndexedIterator &iter) const
-		{
-			return (_r_index == iter._r_index) &&
-			(_c_index == iter._c_index) &&
-			(_dim == iter._dim) &&
-			(_begin==iter._begin);
-		}
-
-		bool operator != (const IndexedIterator& iter) const
-		{
-			return (_r_index != iter._r_index) ||
-			(_c_index != iter._c_index) ||
-			(_dim != iter._dim) ||
-			(_begin!=iter._begin);
-		}
-
-		IndexedIterator &operator ++ ()
-		{
-			++_c_index;
-
-			if (_c_index == _dim) {
-				_c_index = 0;
-				++_r_index;
-			}
-
-			return *this;
-		}
-
-
-		IndexedIterator operator ++ (int)
-		{
-			IndexedIterator tmp = *this;
-			++(*this);
-			return tmp;
-		}
-
-		IndexedIterator &operator -- ()
-		{
-			if (_c_index)
-				--_c_index;
-			else {
-				--_r_index;
-				_c_index = _dim - 1;
-			}
-
-			return *this;
-		}
-
-
-		IndexedIterator operator -- (int)
-		{
-			IndexedIterator tmp = *this;
-			--(*this);
-			return tmp;
-		}
-
-		value_type &operator * () const
-		{
-			return *(_begin + (_r_index * _dim + _c_index));
-		}
-
-
-		value_type * operator -> () const
-		{
-			return _begin + (_r_index * _dim + _c_index);
-		}
-
-
-		size_t rowIndex () const
-		{
-			return _r_index;
-		}
-
-		size_t colIndex () const
-		{
-			return _c_index;
-		}
-
-		const value_type &value () const
-		{
-			return *(_begin + (_r_index * _dim + _c_index));
-		}
-
-
-	};
-
-	template <class _Field>
-	class BlasMatrix< _Field>::ConstIndexedIterator {
-		size_t _r_index;
-		size_t _c_index;
-		size_t _dim;
-		typedef typename _Field::Element value_type;
-		typename Rep::const_iterator _begin;
-
-	public:
-		ConstIndexedIterator (const size_t  &my_dim,
-				      const size_t  &r_index,
-				      const size_t  &c_index,
-				      const typename Rep::const_iterator &begin) :
-			_r_index (r_index), _c_index (c_index), _dim (my_dim), _begin (begin)
-		{}
-
-		ConstIndexedIterator () :
-			_r_index (0), _c_index (0), _dim (1), _begin (0)
-		{}
-
-		ConstIndexedIterator (const ConstIndexedIterator& r) :
-			_r_index (r._r_index), _c_index (r._c_index), _dim (r._dim), _begin (r._begin)
-		{}
-
-		ConstIndexedIterator& operator = (const ConstIndexedIterator &iter)
-		{
-			_r_index = iter._r_index;
-			_c_index = iter._c_index;
-			_dim = iter._dim;
-			_begin = iter._begin;
-			return *this;
-		}
-
-		bool operator == (const ConstIndexedIterator &iter) const
-		{
-			return (_r_index == iter._r_index) &&
-			(_c_index == iter._c_index) &&
-			(_dim == iter._dim) &&
-			(_begin==iter._begin);
-		}
-
-		bool operator != (const ConstIndexedIterator& iter) const
-		{
-			return (_r_index != iter._r_index) ||
-			(_c_index != iter._c_index) ||
-			(_dim != iter._dim) ||
-			(_begin!=iter._begin);
-		}
-
-		ConstIndexedIterator &operator ++ ()
-		{
-			++_c_index;
-
-			if (_c_index == _dim) {
-				_c_index = 0;
-				++_r_index;
-			}
-
-			return *this;
-		}
-
-
-		ConstIndexedIterator operator ++ (int)
-		{
-			ConstIndexedIterator tmp = *this;
-			++(*this);
-			return tmp;
-		}
-
-		ConstIndexedIterator &operator -- ()
-		{
-			if (_c_index)
-				--_c_index;
-			else {
-				--_r_index;
-				_c_index = _dim - 1;
-			}
-
-			return *this;
-		}
-
-		ConstIndexedIterator operator -- (int)
-		{
-			ConstIndexedIterator tmp = *this;
-			--(*this);
-			return tmp;
-		}
-
-		const value_type &operator * () const
-		{
-			return *(_begin + (_r_index * _dim + _c_index));
-		}
-
-		const value_type *operator -> () const
-		{
-			return _begin + (_r_index * _dim + _c_index);
-		}
-
-		size_t rowIndex () const
-		{
-			return _r_index;
-		}
-
-		size_t colIndex () const
-		{
-			return _c_index;
-		}
-
-		const value_type &value() const
-		{
-			return *(_begin + (_r_index * _dim + _c_index));
-		}
-	};
-
-	/*   */
-
-	// Entry access  view.  Size m*n vector in C (row major) order.
-	template <class _Field>
-	typename BlasMatrix< _Field>::Iterator BlasMatrix< _Field>::Begin ()
-	{
-		return _rep.begin ();
-	}
-
-	template <class _Field>
-	typename BlasMatrix< _Field>::Iterator BlasMatrix< _Field>::End ()
-	{
-		return _rep.end ();
-	}
-
-	template <class _Field>
-	typename BlasMatrix< _Field>::ConstIterator BlasMatrix< _Field>::Begin () const
-	{
-		return _rep.begin ();
-	}
-
-	template <class _Field>
-	typename BlasMatrix< _Field>::ConstIterator BlasMatrix< _Field>::End () const
-	{
-		return _rep.end ();
-	}
-
-	/*   Indexed  */
-
-	template <class _Field>
-	typename BlasMatrix< _Field>::IndexedIterator BlasMatrix< _Field>::IndexedBegin ()
-	{
-		return IndexedIterator (coldim (), 0, 0, _rep.begin ());
-	}
-
-	template <class _Field>
-	typename BlasMatrix< _Field>::IndexedIterator BlasMatrix< _Field>::IndexedEnd ()
-	{
-		return IndexedIterator (coldim (), rowdim (), 0, _rep.begin ());
-	}
-
-	template <class _Field>
-	typename BlasMatrix< _Field>::ConstIndexedIterator BlasMatrix< _Field>::IndexedBegin () const
-	{
-		return ConstIndexedIterator (coldim (), 0, 0, _rep.begin ());
-	}
-
-	template <class _Field>
-	typename BlasMatrix< _Field>::ConstIndexedIterator BlasMatrix< _Field>::IndexedEnd () const
-	{
-		return ConstIndexedIterator (coldim (), rowdim (), 0, _rep.begin ());
-	}
-
-	/*  Row  */
-
-	template <class _Field>
-	typename BlasMatrix< _Field>::RowIterator BlasMatrix< _Field>::rowBegin ()
-	{
-		return RowIterator (_rep.begin (), _col, _col);
-	}
-
-	template <class _Field>
-	typename BlasMatrix< _Field>::RowIterator BlasMatrix< _Field>::rowEnd ()
-	{
-		return RowIterator (_rep.end (), _col, _col);
-	}
-
-	template <class _Field>
-	typename BlasMatrix< _Field>::ConstRowIterator BlasMatrix< _Field>::rowBegin () const
-	{
-		return ConstRowIterator (_rep.begin (), _col, _col);
-	}
-
-	template <class _Field>
-	typename BlasMatrix< _Field>::ConstRowIterator BlasMatrix< _Field>::rowEnd () const
-	{
-		return ConstRowIterator (_rep.end (), _col, _col);
-	}
-
-	/*  Col */
-
-	template <class _Field>
-	typename BlasMatrix< _Field>::ColIterator BlasMatrix< _Field>::colBegin ()
-	{
-		return  typename BlasMatrix< _Field>::ColIterator (_rep.begin (), _col, _row);
-	}
-
-	template <class _Field>
-	typename BlasMatrix< _Field>::ColIterator BlasMatrix< _Field>::colEnd ()
-	{
-		return  typename BlasMatrix< _Field>::ColIterator (_rep.begin ()+_col, _col, _row);
-	}
-
-	template <class _Field>
-	typename BlasMatrix< _Field>::ConstColIterator BlasMatrix< _Field>::colBegin () const
-	{
-		return  typename BlasMatrix< _Field>::ConstColIterator (_rep.begin (), _col, _row);
-	}
-
-	template <class _Field>
-	typename BlasMatrix< _Field>::ConstColIterator BlasMatrix< _Field>::colEnd () const
-	{
-		return  typename BlasMatrix< _Field>::ConstColIterator (_rep.begin ()+_col, _col, _row);
-	}
-
-	/*  operators */
-	template <class _Field>
-	typename BlasMatrix< _Field>::Row BlasMatrix< _Field>::operator[] (size_t i)
-	{
-		return Row (_rep.begin () + i * _col, _rep.begin () + (i * _col +_col));
-	}
-
-	template <class _Field>
-	typename BlasMatrix< _Field>::ConstRow BlasMatrix< _Field>::operator[] (size_t i) const
-	{
-		return Row (_rep.begin () + i * _col, _rep.begin () + ( i * _col + _col));
-	}
-
-} // LinBox
-
-//////////////////
-//     MISC     //
-//////////////////
-
-namespace LinBox
-{
-	template <class _Field>
-	template <class Vector>
-	Vector& BlasMatrix< _Field>::columnDensity (Vector &v) const
-	{
-		std::fill (v.begin (), v.end (), _row);
-		return v;
-	}
-
-} // LinBox
-
-///////////////////
-//   BLACK BOX   //
-///////////////////
-
-namespace LinBox
-{
-	template <class _Field>
-	template <class Vector1, class Vector2>
-	Vector1&  BlasMatrix< _Field>::apply (Vector1& y, const Vector2& x) const
-	{
-		//_stride ?
-		if (_use_fflas){
-			//!@bug this supposes &x[0]++ == &x[1]
-			FFLAS::fgemv((typename Field::Father_t) _field, FFLAS::FflasNoTrans,
-				      _row, _col,
-				      _field.one,
-				      _ptr, getStride(),
-				      &x[0],1,
-				      _field.zero,
-				      &y[0],1);
-		}
-		else {
-			_MD. vectorMul (y, *this, x);
-#if 0
-			typename BlasMatrix<_Field>::ConstRowIterator i = this->rowBegin ();
-			typename Vector1::iterator j = y.begin ();
-
-			for (; j != y.end (); ++j, ++i)
-				_VD.dot (*j, *i, x);
-#endif
-		}
-		return y;
-	}
-
-	template <class _Field>
-	template <class Vector1, class Vector2>
-	Vector1&  BlasMatrix< _Field>::applyTranspose (Vector1& y, const Vector2& x) const
-	{
-
-		//_stride ?
-		if (_use_fflas) {
-			FFLAS::fgemv((typename Field::Father_t) _field, FFLAS::FflasTrans,
-				      _row, _col,
-				      _field.one,
-				      _ptr, getStride(),
-				      &x[0],1,
-				      _field.zero,
-				      &y[0],1);
-		}
-		else {
-			typename BlasMatrix<_Field>::ConstColIterator i = this->colBegin ();
-			typename Vector1::iterator j = y.begin ();
-			for (; j != y.end (); ++j, ++i)
-				_VD.dot (*j, x, *i);
-		}
-
-		return y;
-	}
-
-	template <class _Field>
-	const _Field& BlasMatrix< _Field>::field() const
-	{
-		return _field;
-	}
-
-	template <class _Field>
-	_Field& BlasMatrix< _Field>::field()
-	{
-		return const_cast<_Field&>(_field );
-	}
-}
-
-
-#endif // __LINBOX_blas_matrix_INL
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/matrix/blas-submatrix.inl b/linbox/matrix/blas-submatrix.inl
deleted file mode 100644
index 7abbe54..0000000
--- a/linbox/matrix/blas-submatrix.inl
+++ /dev/null
@@ -1,1085 +0,0 @@
-/* linbox/matrix/blas-matrix.h
- * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
- *
- * Written by :
- *               Pascal Giorgi  <pascal.giorgi at ens-lyon.fr>
- *               Clément Pernet <clement.pernet at imag.fr>
- *               Brice Boyer    <bboyer at imag.fr>
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*!@internal
- * @file matrix/blas-matrix.inl
- * @ingroup matrix
- * A \c BlasMatrix<\c _Field > represents a matrix as an array of
- * <code>_Field</code>s.
- */
-
-#ifndef __LINBOX_blas_submatrix_INL
-#define __LINBOX_blas_submatrix_INL
-
-/////////////////
-//   PRIVATE   //
-/////////////////
-
-namespace LinBox
-{
-}
-
-//////////////////
-// CONSTRUCTORS //
-//////////////////
-
-namespace LinBox
-{
-	template <class _Field>
-	BlasSubmatrix<_Field>::BlasSubmatrix () :
-			_Mat(NULL),_row(0),_col(0),_r0(0),_c0(0),_stride(0),_off(0)
-		{
-#ifndef NDEBUG
-			std::cerr << "***Warning*** you are creating a NULL BlasSubmatrix. You are stuck with it now." << std::endl;
-#endif
-		}
-
-	template <class _Field>
-	BlasSubmatrix<_Field>::BlasSubmatrix (const BlasMatrix<_Field> &Mat,
-						size_t row,
-						size_t col,
-						size_t Rowdim,
-						size_t Coldim) :
-		_Mat (&(const_cast<BlasMatrix<Field>& >(Mat))),
-		_row (Rowdim), _col(Coldim),
-		_r0(row),_c0(col),
-		_stride(Mat.coldim()),_off(row*_stride+col)
-	{
-		linbox_check ( _r0  <= Mat.rowdim() ); // allow for NULL matrix
-		linbox_check ( _c0  <= Mat.coldim() );
-		// linbox_check ( _row <= Mat.rowdim() );
-		linbox_check ( _off <= Mat.rowdim()*Mat.coldim() );
-		linbox_check ( _col <= Mat.coldim() );
-	}
-
-
-	template <class _Field>
-	BlasSubmatrix<_Field>::BlasSubmatrix (const BlasMatrix<_Field> &Mat) :
-		_Mat(&(const_cast<BlasMatrix<Field>& >(Mat))),
-		_row(Mat.rowdim()), _col(Mat.coldim()),
-		_r0(0), _c0(0),
-		_stride(Mat.coldim()),_off(0)
-	{}
-
-
-
-	template <class _Field>
-	BlasSubmatrix<_Field>::BlasSubmatrix (const BlasSubmatrix<_Field> &SM,
-						size_t row,
-						size_t col,
-						size_t Rowdim,
-						size_t Coldim) :
-		_Mat (SM._Mat),
-		_row ( Rowdim ),      _col ( Coldim ) ,
-		_r0  ( SM._r0 + row ), _c0 ( SM._c0 + col ),
-		_stride(SM._stride),_off(SM._off+(row*_stride+col))
-	{
-		linbox_check ( _r0  <= SM._Mat->rowdim() ); // allow for NULL matrix
-		linbox_check ( _c0  <= SM._stride );
-		linbox_check ( _row <= SM._Mat->rowdim() );
-		linbox_check ( _col <= SM._stride );
-		linbox_check ( _off <= SM._Mat->rowdim()*(SM._Mat->coldim()+1) );
-	}
-
-	template <class _Field>
-	BlasSubmatrix<_Field>::BlasSubmatrix (const BlasSubmatrix<_Field> &SM) :
-		_Mat (SM._Mat),
-		_row ( SM._row ),  _col ( SM._col ) ,
-		_r0  ( SM._r0 ),    _c0 (SM._c0 ),
-		_stride(SM._stride),_off(SM._off)
-	{
-		linbox_check ( _r0  <=  SM._Mat->rowdim() ); // allow for NULL matrix
-		linbox_check ( _c0  <=  SM._stride );
-		linbox_check ( _row <= SM._Mat->rowdim() );
-		linbox_check ( _col <= SM._stride );
-		linbox_check ( _off <= SM._Mat->rowdim()*(SM._Mat->coldim()+1) );
-	}
-
-	template <class _Field>
-	BlasSubmatrix<_Field>& BlasSubmatrix<_Field>::operator=(const BlasSubmatrix<_Field> &SM)
-	{
-		if ( &SM == this)
-			return *this ;
-
-		_Mat   = SM._Mat  ;
-		_r0  = SM._r0 ;
-		_row = SM._row;
-		_c0  = SM._c0 ;
-		_col = SM._col;
-		_stride = SM._stride;
-		_off = SM._off ;
-
-		return *this;
-	}
-
-} // LinBox
-
-
-//////////////////
-//  DIMENSIONS  //
-//////////////////
-
-namespace LinBox
-{
-
-	template <class _Field>
-	size_t BlasSubmatrix< _Field>::rowdim() const
-	{
-		return _row ;
-	}
-
-	template <class _Field>
-	size_t BlasSubmatrix< _Field>::coldim() const
-	{
-		return _col ;
-	}
-
-	template <class _Field>
-	size_t  BlasSubmatrix< _Field>::getStride() const
-	{
-		return _stride;
-	}
-
-
-} // LinBox
-
-//////////////////
-//   ELEMENTS   //
-//////////////////
-
-namespace LinBox
-{
-
-
-	template <class _Field>
-	typename BlasSubmatrix< _Field>::pointer
-	BlasSubmatrix< _Field>::getPointer() const
-	{
-		return _Mat->getPointer()+_off;
-	}
-
-	template <class _Field>
-	typename BlasSubmatrix< _Field>::const_pointer &
-	BlasSubmatrix< _Field>::getConstPointer() const
-	{
-		return _Mat->getConstPointer()+_off;
-	}
-
-
-	template <class _Field>
-	typename BlasSubmatrix< _Field>::pointer&
-	BlasSubmatrix< _Field>::getWritePointer()
-	{
-		return _Mat->getWritePointer()+_off;
-	}
-
-	template <class _Field>
-	void BlasSubmatrix< _Field>::setEntry (size_t i, size_t j, const Element &a_ij)
-	{
-		_Mat->setEntry (_r0 + i, _c0 + j, a_ij);
-	}
-
-	template <class _Field>
- typename _Field:: Element &BlasSubmatrix< _Field>::refEntry (size_t i, size_t j)
-	{
-		return _Mat->refEntry ( _r0+i, _c0+j );
-	}
-
-	template <class _Field>
-	const typename _Field:: Element &BlasSubmatrix< _Field>::getEntry (size_t i, size_t j) const
-	{
-		return _Mat->getEntry ( _r0+i , _c0+j );
-	}
-
-	template <class _Field>
-typename _Field:: Element &BlasSubmatrix< _Field>::getEntry (Element &x, size_t i, size_t j) const
-	{
-		return _Mat->getEntry (x, _r0+i , _c0+j );
-	}
-
-}
-
-///////////////////
-// TRANSPOSE &AL //
-///////////////////
-
-namespace LinBox
-{
-}
-
-///////////////////
-//   ITERATORS   //
-///////////////////
-
-namespace LinBox
-{
-
-
-	/*! Raw Iterators.
-	 * @ingroup iterators
-	 *
-	 * The raw iterator is a method for accessing all entries in the matrix
-	 * in some unspecified order. This can be used, e.g. to reduce all
-	 * matrix entries modulo a prime before passing the matrix into an
-	 * algorithm.
-	 */
-	template <class _Field>
-	class BlasSubmatrix<_Field>::Iterator {
-	public:
-		Iterator (){}
-
-		/*! @internal
-		 * @brief NO DOC
-		 */
-		Iterator (const typename BlasMatrix<_Field>::Iterator& cur,
-			     const size_t c_dim,
-			     const size_t stride,
-			     const size_t c_idx) :
-			_cur (cur), _c_dim (c_dim), _stride(stride), _c_idx (c_idx)
-		{}
-
-		/*! @internal
-		 * @brief copy operator.
-		 * @param r Iterator to copy.
-		 */
-		Iterator& operator = (const Iterator& r)
-		{
-			_cur    = r._cur;
-			_c_dim  = r._c_dim;
-			_stride = r._stride;
-			_c_idx  = r._c_idx;
-			return *this;
-		}
-
-		/*! @internal
-		 * increment.
-		 * ??
-		 */
-		Iterator& operator ++()
-		{
-			if (_c_idx < _c_dim - 1){
-				++_cur; ++_c_idx;
-			}
-			else {
-				_cur = _cur + _stride - _c_dim + 1;
-				_c_idx = 0;
-			}
-
-			return *this;
-		}
-
-		/*! @internal
-		 * increment.
-		 * ??
-		 */
-		Iterator& operator++ (int)
-		{
-			return this->operator++ ();
-		}
-
-
-		/*! @internal
-		 * @brief  operator !=.
-		 * @param r Iterator to test inequaltity from.
-		 */
-		bool operator != (const Iterator& r) const
-		{
-			return (_cur != r._cur || _c_dim != r._c_dim) || (_stride != r._stride) || (_c_idx != r._c_idx);
-		}
-
-		//! @internal operator *.
-		_Field& operator * ()
-		{
-			return *_cur;
-		}
-
-		//! @internal operator *.
-		const _Field& operator * () const
-		{
-			return *_cur;
-		}
-
-	protected:
-		typename BlasMatrix<_Field>::Iterator _cur;
-		size_t _c_dim;
-		size_t _stride;
-		size_t _c_idx;
-	};
-
-	/*! Raw Iterators (const version).
-	 * @ingroup iterators
-	 * The raw iterator is a method for accessing all entries in the matrix
-	 * in some unspecified order. This can be used, e.g. to reduce all
-	 * matrix entries modulo a prime before passing the matrix into an
-	 * algorithm.
-	 */
-	template <class _Field>
-	class BlasSubmatrix<_Field>::ConstIterator {
-	public:
-		//! @internal Null constructor
-		ConstIterator (){}
-
-
-		/*! @internal
-		 * @brief NO DOC
-		 */
-		ConstIterator (const typename BlasMatrix<_Field>::ConstIterator& cur,
-				  const size_t c_dim,
-				  const size_t stride,
-				  const size_t c_idx) :
-			_cur (cur), _c_dim (c_dim), _stride(stride), _c_idx (c_idx)
-		{}
-
-		/*! @internal
-		 * @brief copy operator.
-		 * @param r Iterator to copy.
-		 */
-		ConstIterator& operator = (const ConstIterator& r)
-		{
-			_cur = r._cur;
-			_c_dim = r._c_dim;
-			_stride = r._stride;
-			_c_idx = r._c_idx;
-			return *this;
-		}
-
-		/*! @internal
-		 * increment.
-		 * ??
-		 */
-		ConstIterator& operator ++()
-		{
-			if (_c_idx < _c_dim - 1){
-				++_cur; ++_c_idx;
-			}
-			else {
-				_cur = _cur + _stride - _c_dim + 1;
-				_c_idx = 0;
-			}
-
-			return *this;
-		}
-
-		/*! @internal
-		 * increment.
-		 * ??
-		 */
-		ConstIterator& operator++ (int)
-		{
-			return this->operator++ ();
-		}
-
-		/*! @internal
-		 * @brief  operator !=.
-		 * @param r Iterator to test inequaltity from.
-		 */
-		bool operator != (const ConstIterator& r) const
-		{
-			return (_cur != r._cur) || (_c_dim != r._c_dim) || (_stride != r._stride) || (_c_idx != r._c_idx);
-		}
-
-		//! @internal operator *.
-		const _Field& operator * () const
-		{
-			return *_cur;
-		}
-
-	protected:
-		typename BlasMatrix<_Field>::ConstIterator _cur;
-		size_t _c_dim;
-		size_t _stride;
-		size_t _c_idx;
-	};
-
-#if 0
-	template <class _Field>
-	class BlasSubmatrix< _Field>::ConstIterator {
-	public:
-		ConstIterator (){}
-
-		ConstIterator ( const typename BlasMatrix< _Field>::ConstIterator& cur,
-				   size_t cont_len,
-				   size_t gap_len) :
-			_beg (beg), _cur (cur), _cont_len (cont_len), _gap_len (gap_len)
-		{}
-
-		ConstIterator& operator = (const Iterator& r)
-		{
-			_cur = r._cur;
-			_beg = r._beg;
-			_cont_len = r._cont_len;
-			_gap_len = r._gap_len;
-			return *this;
-		}
-
-		ConstIterator& operator = (const ConstIterator& r)
-		{
-			_cur = r._cur;
-			_beg = r._beg;
-			_cont_len = r._cont_len;
-			_gap_len = r._gap_len;
-			return *this;
-		}
-
-		ConstIterator& operator++()
-		{
-			if (((_cur - _beg + 1) % _cont_len) != 0)
-				++_cur;
-			else {
-				_cur = _cur + _gap_len + 1;
-				_beg = _beg + _gap_len + _cont_len;
-			}
-			return *this;
-		}
-
-		ConstIterator operator++(int)
-		{
-			ConstIterator tmp = *this;
-			this->operator++();
-			return tmp;
-		}
-
-		bool operator != (const ConstIterator& r) const
-		{
-			return (_cur != r._cur) || (_beg != r._beg) || (_cont_len != r._cont_len) || (_gap_len != r._gap_len);
-		}
-
-		const _Field& operator*()
-		{ return *_cur; }
-
-	 _Field& operator*()
-		{ return *_cur; }
-
-		const _Field& operator*() const
-		{ return *_cur; }
-
-	protected:
-		typename BlasMatrix< _Field>::ConstIterator _beg;
-		typename BlasMatrix< _Field>::ConstIterator _cur;
-		size_t _cont_len;
-		size_t _gap_len;
-	};
-#endif
-
-	template <class _Field>
-	typename BlasSubmatrix<_Field>::Iterator BlasSubmatrix<_Field>::Begin ()
-	{
-		return Iterator (_Mat->Begin () + ( _off ),
-				    _col, _stride, 0);
-	}
-
-	template <class _Field>
-	typename BlasSubmatrix<_Field>::Iterator BlasSubmatrix<_Field>::End ()
-	{
-		return Iterator (_Mat->Begin () + ( (_row) * _stride + _off ),
-				    _col, _stride, 0);
-	}
-
-	template <class _Field>
-	typename BlasSubmatrix<_Field>::ConstIterator BlasSubmatrix<_Field>::Begin () const
-	{
-		return ConstIterator (_Mat->Begin () + ( _off ),
-					 _col, _stride, 0);
-	}
-
-	template <class _Field>
-	typename BlasSubmatrix<_Field>::ConstIterator BlasSubmatrix<_Field>::End () const
-	{
-		return ConstIterator (_Mat->Begin () + ( (_row) * _stride + _off ),
-					 _col, _stride, 0);
-	}
-
-#if 0
-	template <class _Field>
-	typename BlasSubmatrix< _Field>::ConstIterator BlasSubmatrix< _Field>::Begin () const
-	{
-		return ConstIterator (_Mat->Begin () + ( _off ),
-					 _Mat->Begin () + ( _off ),
-					 _col, _stride - _col);
-	}
-
-	template <class _Field>
-	typename BlasSubmatrix< _Field>::ConstIterator BlasSubmatrix< _Field>::End () const
-	{
-		return ConstIterator (_Mat->Begin () + ( (_row) * _stride + _off ),
-					 _Mat->Begin () + ( (_row) * _stride + _off ),
-					 _col, _stride - _col);
-	}
-#endif
-
-	/*! Raw Indexed Iterator.
-	 * @ingroup iterators
-	 *
-	 * Like the raw iterator, the indexed iterator is a method for
-	 * accessing all entries in the matrix in some unspecified order.
-	 * At each position of the the indexed iterator, it also provides
-	 * the row and column indices of the currently referenced entry.
-	 * This is provided through it's \c rowIndex() and \c colIndex() functions.
-	 */
-	template <class _Field>
-	class BlasSubmatrix<_Field>::IndexedIterator {
-	public:
-		IndexedIterator (){}
-
-		IndexedIterator (const typename BlasMatrix<_Field>::Iterator& cur,
-				    size_t c_dim,
-				    size_t stride,
-				    size_t r_idx,
-				    size_t c_idx) :
-			_cur (cur), _c_dim (c_dim), _stride (stride), _r_idx(r_idx), _c_idx (c_idx)
-		{}
-
-		IndexedIterator& operator = (const IndexedIterator& r)
-		{
-			_cur = r._cur;
-			_stride = r._stride;
-			_c_dim = r._c_dim;
-			_r_idx = r._r_idx;
-			_c_idx = r._c_idx;
-			return *this;
-		}
-
-		IndexedIterator& operator++()
-		{
-			if (_c_idx < _c_dim - 1){
-				++_c_idx;
-				++_cur;
-			}
-			else {
-				_cur = _cur + _stride - _c_dim + 1;
-				_c_idx = 0;
-				++_r_idx;
-			}
-			return *this;
-		}
-
-		IndexedIterator& operator--()
-		{
-			if (_c_idx > 0){
-				--_c_idx;
-				--_cur;
-			}
-			else {
-				_cur = _cur - _stride + _c_dim -1;
-				_c_idx = 0;
-				--_r_idx;
-			}
-			return *this;
-		}
-
-		IndexedIterator operator++(int)
-		{
-			IndexedIterator tmp = *this;
-			this->operator++();
-			return tmp;
-		}
-
-		IndexedIterator operator--(int)
-		{
-			IndexedIterator tmp = *this;
-			this->operator--();
-			return tmp;
-		}
-
-		bool operator != (const IndexedIterator& r) const
-		{
-			return ((_c_idx != r._c_idx) || (_r_idx != r._r_idx) ||(_stride != r._stride) || (_c_dim != r._c_dim) );
-		}
-
-		const _Field& operator*() const {return *_cur;}
-
-		_Field& operator*() {return *_cur;}
-
-		size_t rowIndex () const { return _r_idx; }
-
-		size_t colIndex () const { return _c_idx; }
-
-		const _Field& value () const {return *_cur;}
-
-	protected:
-		typename BlasMatrix<_Field>::Iterator _cur;
-		size_t _stride;
-		size_t _c_dim;
-		size_t _r_idx;
-		size_t _c_idx;
-	};
-
-	template <class _Field>
-	typename BlasSubmatrix<_Field>::IndexedIterator BlasSubmatrix<_Field>::IndexedBegin ()
-	{
-		return IndexedIterator (_Mat->Begin () + ( (_off) ),
-					   _col , _stride, 0, 0);
-	}
-
-	template <class _Field>
-	typename BlasSubmatrix<_Field>::IndexedIterator BlasSubmatrix<_Field>::IndexedEnd ()
-	{
-		return IndexedIterator (_Mat->Begin () + ( (_row) * _stride + (_col+_off) ),
-					   _col, _stride, _row-1, _col-1);
-	}
-
-	/*! Raw Indexed Iterator (const version).
-	 * @ingroup iterators
-	 *
-	 * Like the raw iterator, the indexed iterator is a method for
-	 * accessing all entries in the matrix in some unspecified order.
-	 * At each position of the the indexed iterator, it also provides
-	 * the row and column indices of the currently referenced entry.
-	 * This is provided through it's \c rowIndex() and \c colIndex() functions.
-	 */
-	template <class _Field>
-	class BlasSubmatrix<_Field>::ConstIndexedIterator {
-	public:
-		ConstIndexedIterator (){}
-
-		ConstIndexedIterator (const typename BlasMatrix<_Field>::ConstIterator& cur,
-					 size_t c_dim,
-					 size_t stride,
-					 size_t r_idx,
-					 size_t c_idx) :
-			_cur (cur), _stride (stride), _c_dim (c_dim), _r_idx(r_idx), _c_idx (c_idx)
-		{}
-
-		ConstIndexedIterator& operator = (const IndexedIterator& r)
-		{
-			_cur = r._cur;
-			_stride = r._stride;
-			_c_dim = r._c_dim;
-			_r_idx = r._r_idx;
-			_c_idx = r._c_idx;
-			return *this;
-		}
-
-		ConstIndexedIterator& operator = (const ConstIndexedIterator& r)
-		{
-			_cur = r._cur;
-			_stride = r._stride;
-			_c_dim = r._c_dim;
-			_r_idx = r._r_idx;
-			_c_idx = r._c_idx;
-			return *this;
-		}
-
-		ConstIndexedIterator& operator++()
-		{
-			if (_c_idx < _c_dim - 1){
-				++_c_idx;
-				++_cur;
-			}
-			else {
-				_cur = _cur + _stride - _c_dim +1;
-				_c_idx = 0;
-				++_r_idx;
-			}
-			return *this;
-		}
-
-		IndexedIterator& operator--()
-		{
-			if (_c_idx > 0){
-				--_c_idx;
-				--_cur;
-			}
-			else {
-				_cur = _cur - _stride + _c_dim -1;
-				_c_idx = 0;
-				--_r_idx;
-			}
-			return *this;
-		}
-
-		ConstIndexedIterator operator++(int)
-		{
-			ConstIndexedIterator tmp = *this;
-			this->operator++();
-			return tmp;
-		}
-
-		ConstIndexedIterator operator--(int)
-		{
-			ConstIndexedIterator tmp = *this;
-			this->operator--();
-			return tmp;
-		}
-
-		size_t rowIndex () const
-		{
-			return _r_idx;
-		}
-
-		size_t colIndex () const
-		{
-			return _c_idx;
-		}
-
-		bool operator != (const ConstIndexedIterator& r) const
-		{
-			return ((_c_idx != r._c_idx) || (_r_idx != r._r_idx) ||(_stride != r._stride) || (_c_dim != r._c_dim) );
-		}
-
-		const _Field& operator*() const
-		{
-			return *_cur;
-		}
-
-
-		friend std::ostream& operator<<(std::ostream& out, const ConstIndexedIterator m)
-		{
-			return out /* << m._cur << ' ' */
-			<< m._stride << ' '
-			<< m._c_dim << ' '
-			<< m._r_idx << ' '
-			<< m._c_idx;
-		}
-
-		const _Field & value() const
-		{
-			return this->operator*();
-
-		}
-
-	protected:
-		typename BlasMatrix<_Field>::ConstIterator _cur;
-		size_t _stride;
-		size_t _c_dim;
-		size_t _r_idx;
-		size_t _c_idx;
-	};
-
-	template <class _Field>
-	typename BlasSubmatrix<_Field>::ConstIndexedIterator BlasSubmatrix<_Field>::IndexedBegin () const
-	{
-		return ConstIndexedIterator (_Mat->Begin () + ( _off ),
-						_row, _stride, 0, 0);
-	}
-
-	template <class _Field>
-	typename BlasSubmatrix<_Field>::ConstIndexedIterator BlasSubmatrix<_Field>::IndexedEnd () const
-	{
-		return ConstIndexedIterator (_Mat->Begin () + ( (_row) * _stride + (_off+_col) ),
-						_col, _stride, _row-1, _col-1);
-	}
-
-	////////
-	template <class _Field>
-	typename BlasSubmatrix<_Field>::RowIterator BlasSubmatrix<_Field>::rowBegin ()
-	{
-		return RowIterator (_Mat->Begin () + ( _off  ),
-				    _col, _stride);
-	}
-
-	template <class _Field>
-	typename BlasSubmatrix<_Field>::RowIterator BlasSubmatrix<_Field>::rowEnd ()
-	{
-		return RowIterator (_Mat->Begin () + ( (_row) * _stride + _off ),
-				    _col, _stride);
-	}
-
-	template <class _Field>
-	typename BlasSubmatrix<_Field>::ConstRowIterator BlasSubmatrix<_Field>::rowBegin () const
-	{
-		return ConstRowIterator (_Mat->Begin () + ( _off ),
-					 _col, _stride);
-	}
-
-	template <class _Field>
-	typename BlasSubmatrix<_Field>::ConstRowIterator BlasSubmatrix<_Field>::rowEnd () const
-	{
-		return ConstRowIterator (_Mat->Begin () + ( (_row) * _stride + _off ),
-					 _col, _stride);
-	}
-
-	template <class _Field>
-	typename BlasSubmatrix<_Field>::ColIterator BlasSubmatrix<_Field>::colBegin ()
-	{
-		return ColIterator (_Mat->Begin () + ( _off ),
-				    _stride, _row);
-	}
-
-	template <class _Field>
-	typename BlasSubmatrix<_Field>::ColIterator BlasSubmatrix<_Field>::colEnd ()
-	{
-		return ColIterator (_Mat->Begin () + ( (_col) + _off ),
-				    _stride, _row);
-	}
-
-	template <class _Field>
-	typename BlasSubmatrix<_Field>::ConstColIterator BlasSubmatrix<_Field>::colBegin () const
-	{
-		return ConstColIterator (_Mat->Begin () + ( _off ),
-					 _stride, _row);
-	}
-
-	template <class _Field>
-	typename BlasSubmatrix<_Field>::ConstColIterator BlasSubmatrix<_Field>::colEnd () const
-	{
-		return ConstColIterator (_Mat->Begin () + ( (_col) + _off ),
-					 _stride, _row);
-	}
-
-	/*  operators */
-	template <class _Field>
-	typename BlasSubmatrix< _Field>::Row BlasSubmatrix< _Field>::operator[] (size_t i)
-	{
-		return Row (_Mat->Begin () + (_r0+i) * _stride, _Mat->Begin () + ((_r0+i) * _stride + _stride) );
-	}
-
-	template <class _Field>
-	typename BlasSubmatrix< _Field>::ConstRow BlasSubmatrix< _Field>::operator[] (size_t i) const
-	{
-		return Row (_Mat->Begin () + (_r0+i) * _stride, _Mat->Begin () + ((_r0+i) * _stride + _stride) );
-	}
-
-} // LinBox
-
-///////////////////
-//      I/O      //
-///////////////////
-
-namespace LinBox
-{
-
-	template <class _Field>
-	std::istream& BlasSubmatrix< _Field>::read (std::istream &file)
-	{
-#if 0
-		Iterator p;
-		int m,n;
-		char c;
-		file>>m>>n>>c;
-
-		if (m*n < _row*_col)
-			cerr<<"NOT ENOUGH ELEMENT TO READ\n";
-		else {
-			for (p = Begin (); p != End (); ++p) {
-				integer tmp;
-				file>>tmp;cout<<tmp<<endl;
-				//file.ignore(1);
-				_Mat->_field.read (file, *p);
-			}
-		}
-#endif
-
-
-		Iterator p;
-		int m,n;
-		char c;
-		file>>m>>n>>c;
-		// std::cout << m << 'x' << n << ':' << c << std::endl;
-		_row = m; _col = n;
-
-		_Field zero;
-		_Mat->_field.init(zero,0UL);
-		// resize(_row,_col);
-
-		if ((c != 'M') && (c != 'm')) {
-		for (p = Begin (); p != End (); ++p) {
-				//file.ignore(1);
-				_Mat->_field.read (file, *p);
-			}
-
-		}
-		else { // sparse file format - needs fixing
-			int i, j;
-			while (true)
-			{
-				file >> i >> j;
-				//file.ignore(1);
-				//if (! file) break;
-				if (i+j <= 0) break;
-				// std::cout << i << ',' << j << ':' ;
-				_Mat->_field.read (file, _Mat->refEntry(i-1, j-1));
-			}
-		}
-
-		return file;
-	}
-
-	template <class _Field>
-	std::ostream &BlasSubmatrix< _Field>::write (std::ostream &os,
-						     enum LinBoxTag::Format f) const
-	{
-
-		ConstRowIterator p;
-		switch(f) {
-		case (LinBoxTag::FormatPlain) : /*  raw output */
-			{
-				integer c;
-				int wid;
-
-
-
-
-				_Mat->_field.cardinality (c);
-
-				if (c >0)
-					wid = (int) ceil (log ((double) c) / M_LN10);
-				else {
-					integer tmp;
-					size_t max=0;
-					ConstIterator it = Begin();
-					for (; it != End(); ++it){
-						_Mat->_field.convert(tmp,*it);
-						if (tmp.bitsize() > max)
-							max= tmp.bitsize();
-					}
-					wid= (int) ceil ((double)max / M_LN10)+1;
-				}
-
-				for (p = rowBegin (); p != rowEnd ();++p) {
-					typename ConstRow::const_iterator pe;
-
-					os << "  [ ";
-
-					for (pe = p->begin (); pe != p->end (); ++pe) {
-						os.width (wid);
-						/*!  @warning
-						 * matrix base does not provide this field(), maybe should?
-						 * _Mat.field ().write (os, *pe);
-						 * os << *pe;
-						 * fixed by using extra field
-						 */
-
-						_Mat->_field.write (os, *pe);
-						os << " ";
-					}
-
-					os << "]" << std::endl;
-				}
-			}
-			break;
-		case (LinBoxTag::FormatMaple) : /*  maple format */
-			{
-
-				os << "Matrix( " << rowdim() << ',' << coldim() << ",[" ;
-				for (p = rowBegin (); p != rowEnd (); ) {
-					typename ConstRow::const_iterator pe;
-
-					os << " [ ";
-
-					for (pe = p->begin (); pe != p->end (); ) {
-						_Mat->_field.write (os, *pe);
-						++pe ;
-						if (pe != p->end())
-							os << ", ";
-					}
-
-					os << "]" ;
-					++p ;
-					if (p != rowEnd() )
-						os << ',' << std::endl;;
-
-				}
-				os << "])" ;
-			}
-			break;
-		case (LinBoxTag::FormatHTML) : /*  HTML format */
-			{
-
-				os << "<table border=\"1\">" ;
-				for (p = rowBegin (); p != rowEnd (); ) {
-					typename ConstRow::const_iterator pe;
-
-					os << "<tr>";
-
-					for (pe = p->begin (); pe != p->end (); ) {
-						_Mat->_field.write (os<< "<td>", *pe)<<"</td>";
-						++pe ;
-					}
-
-					os << "</tr>" << std::endl;
-					++p ;
-
-				}
-				os << "</table>" ;
-			}
-			break;
-		case (LinBoxTag::FormatLaTeX) : /*  LaTex format */
-			{
-				os << "\\begin{pmatrix} " << std::endl;
-				for (p = rowBegin (); p != rowEnd (); ) {
-					typename ConstRow::const_iterator pe;
-
-					for (pe = p->begin (); pe != p->end (); ) {
-						_Mat->_field.write (os, *pe);
-						++pe ;
-						if (pe != p->end())
-							os << "& ";
-					}
-
-					os << "\\\\" << std::endl;
-					++p ;
-
-				}
-				os << "\\end{pmatrix}" ;
-			}
-			break;
-		default : /*  this is an error */
-			{
-				throw LinBoxError("unknown format to write matrix in");
-			}
-		}
-
-		return os;
-	}
-
-	template <class _Field>
-	template<typename _Tp1>
-	struct BlasSubmatrix< _Field>::rebind {
-		typedef BlasMatrix<_Tp1> other;
-
-		void operator() (other & Ap, const Self_t& A) {
-			typedef typename BlasSubmatrix<_Field>::ConstIterator ConstSelfIterator ;
-			typedef typename other::Iterator OtherIterator ;
-			OtherIterator    Ap_i;
-			ConstSelfIterator A_i;
-			Hom<Field, _Tp1> hom(A. field(), Ap. field());
-			for (A_i = A. Begin(), Ap_i = Ap.Begin();
-			     A_i != A. End(); ++ A_i, ++ Ap_i)
-				hom.image (*Ap_i, *A_i);
-		}
-	};
-
-} // LinBox
-
-//////////////////
-//     MISC     //
-//////////////////
-
-namespace LinBox
-{
-} // LinBox
-#endif // __LINBOX_blas_submatrix_INL
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/matrix/blas-triangularmatrix.inl b/linbox/matrix/blas-triangularmatrix.inl
deleted file mode 100644
index 0bae2cd..0000000
--- a/linbox/matrix/blas-triangularmatrix.inl
+++ /dev/null
@@ -1,144 +0,0 @@
-/* linbox/matrix/blas-matrix.h
- * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
- *
- * Written by :
- *               Pascal Giorgi  <pascal.giorgi at ens-lyon.fr>
- *               Clément Pernet <clement.pernet at imag.fr>
- *               Brice Boyer    <bboyer at imag.fr>
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*!@internal
- * @file matrix/blas-matrix.inl
- * @ingroup matrix
- * A \c BlasMatrix<\c _Field > represents a matrix as an array of
- * <code>_Field</code>s.
- */
-
-#ifndef __LINBOX_blas_triangularmatrix_INL
-#define __LINBOX_blas_triangularmatrix_INL
-namespace LinBox
-{
-	template<class _Field>
-		TriangularBlasMatrix<_Field>::TriangularBlasMatrix (const _Field & F, const size_t m, const size_t n,
-				      LinBoxTag::Shape x,
-				      LinBoxTag::Diag y) :
-			BlasMatrix<_Field>(F, m, n ) , _uplo(x), _diag(y)
-		{}
-
-		template<class _Field>
-		TriangularBlasMatrix<_Field>::TriangularBlasMatrix (const BlasMatrix<_Field>& A,
-				      LinBoxTag::Shape x,
-				      LinBoxTag::Diag y) :
-			BlasMatrix<_Field>(A) , _uplo(x), _diag(y)
-		{}
-
-		template<class _Field>
-		TriangularBlasMatrix<_Field>::TriangularBlasMatrix (BlasMatrix<_Field>& A,
-				LinBoxTag::Shape x,
-				LinBoxTag::Diag y) :
-			BlasMatrix<_Field>(A), _uplo(x), _diag(y)
-		{}
-
-		template<class _Field>
-		TriangularBlasMatrix<_Field>::TriangularBlasMatrix (const TriangularBlasMatrix<_Field>& A) :
-			BlasMatrix<_Field>(A.field(), A.rowdim(),A.coldim()), _uplo(A._uplo), _diag(A._diag)
-		{
-			switch (A._uplo) {
-			case LinBoxTag::Upper:
-				{
-					for (size_t i=0;i<A.rowdim();++i)
-						for (size_t j=i;j<A.coldim();++j)
-							this->setEntry(i,j,A.getEntry(i,j));
-					break;
-				}
-			case LinBoxTag::Lower:
-				{
-					for (size_t i=0;i<A.rowdim();++i) {
-						for (size_t j=0;j<=i;++j)
-							this->setEntry(i,j,A.getEntry(i,j));
-					}
-
-					break;
-				}
-			default:
-				throw LinboxError ("Error in copy constructor of TriangularBlasMatrix (incorrect argument)");
-			}
-		}
-
-		template<class _Field>
-		template<class Matrix>
-		TriangularBlasMatrix<_Field>::TriangularBlasMatrix (const Matrix& A,
-				LinBoxTag::Shape x,
-				LinBoxTag::Diag y) :
-			BlasMatrix<_Field>(A.field(),A.rowdim(),A.coldim()), _uplo(x), _diag(y)
-		{
-			switch (x) {
-			case LinBoxTag::Upper:
-				{
-					for (size_t i=0;i<A.rowdim();++i){
-						for (size_t j=i;j<A.coldim();++j) {
-							Element tmp = A.getEntry(i,j) ;
-							this->setEntry(i,j,tmp);
-						}
-					}
-					break;
-				}
-			case LinBoxTag::Lower:
-				{
-					for (size_t i=0;i<A.rowdim();++i) {
-						for (size_t j=0;j<=i;++j) {
-							Element tmp = A.getEntry(i,j);
-							this->setEntry(i,j,tmp);
-						}
-					}
-
-					break;
-				}
-			default:
-				throw LinboxError ("Error in copy constructor of TriangularBlasMatrix (incorrect argument)");
-			}
-		}
-
-		template<class _Field>
-		LinBoxTag::Shape TriangularBlasMatrix<_Field>::getUpLo() const
-		{
-			return _uplo;
-		}
-
-		template<class _Field>
-		LinBoxTag::Diag TriangularBlasMatrix<_Field>::getDiag() const
-		{
-			return _diag;
-		}
-
-}
-#endif // __LINBOX_blas_triangularmatrix_INL
-
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/matrix/dense-matrix.doxy b/linbox/matrix/dense-matrix.doxy
new file mode 100644
index 0000000..e6c22bb
--- /dev/null
+++ b/linbox/matrix/dense-matrix.doxy
@@ -0,0 +1,32 @@
+// Copyright 2014 LinBox. See COPYING for licence information.
+/*
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/**  \ingroup matrix
+ * \defgroup densematrix Dense Matrix
+ * \brief These are dense matrix reprensentations
+ *
+ * NO DOC YET
+ *
+ */
+
+// vim:syn=doxygen
diff --git a/linbox/matrix/dense-matrix.h b/linbox/matrix/dense-matrix.h
new file mode 100644
index 0000000..b352f5c
--- /dev/null
+++ b/linbox/matrix/dense-matrix.h
@@ -0,0 +1,190 @@
+/* linbox/matrix/dense-matrix.h
+ * Copyright (C) 2014 the LinBox
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/dense-matrix.h
+ * @ingroup densematrix
+ * @brief NODOC
+ */
+
+#ifndef __LINBOX_matrix_dense_matrix_H
+#define __LINBOX_matrix_dense_matrix_H
+
+
+//! @bug those are not just traits:
+#include "linbox/linbox-config.h"
+#include "linbox/vector/vector-traits.h"
+#include "linbox/matrix/matrix-traits.h"
+
+namespace LinBox { /*  forward declarations */
+
+	template <class _Field, class _blasRep=typename Vector<_Field>::Dense >
+	class BlasMatrix ;
+
+	template <class _Field>
+	using DenseMatrix = BlasMatrix<_Field> ;
+
+	template<class _Matrix>
+	class BlasSubmatrix ;
+
+	template <class _Field>
+	using DenseSubmatrix = BlasSubmatrix<DenseMatrix<_Field> > ;
+
+	template <class _Field, class _Storage=typename Vector<_Field>::Dense >
+	class TriangularBlasMatrix ;
+
+	template <class _Field>
+	using TriangularMatrix = TriangularBlasMatrix<_Field> ;
+
+	/*! Write a matrix to a stream.
+	 * The \c C++ way using <code>operator<< </code>
+	 * @param o output stream
+	 * @param Mat matrix to write.
+	 */
+	template <class _Field, class _Storage>
+	std::ostream& operator<< (std::ostream & os, const BlasMatrix<_Field,_Storage> & Mat)
+	{
+		return Mat.write(os);
+	}
+
+	template <class _Matrix>
+	std::ostream& operator<< (std::ostream & os, const BlasSubmatrix<_Matrix> & Mat)
+	{
+		return Mat.write(os);
+	}
+
+}
+
+#include "linbox/matrix/densematrix/blas-matrix.h"
+// #include "linbox/matrix/densematrix/blas-matrix-multimod.h"
+// #include "linbox/matrix/densematrix/m4ri-matrix.h"
+
+namespace LinBox { /*  MatrixContainerTrait */
+
+
+	template <class Field, class Rep>
+	class MatrixContainerTrait<BlasMatrix<Field,Rep> > {
+	public:
+		typedef MatrixContainerCategory::BlasContainer Type;
+	};
+
+	template <class Field, class Rep>
+	class MatrixContainerTrait<const BlasMatrix<Field,Rep> > {
+	public:
+		typedef MatrixContainerCategory::BlasContainer Type;
+	};
+
+	template <class _Matrix>
+	class MatrixContainerTrait<BlasSubmatrix<_Matrix> > {
+	public:
+		typedef MatrixContainerCategory::BlasContainer Type;
+	};
+
+	template <class _Matrix>
+	class MatrixContainerTrait<const BlasSubmatrix<_Matrix> > {
+	public:
+		typedef MatrixContainerCategory::BlasContainer Type;
+	};
+
+} // LinBox
+
+namespace LinBox { /*  MatrixTraits */
+
+	template <class _Field, class _Rep>
+	struct MatrixTraits< BlasMatrix<_Field,_Rep> > {
+		typedef BlasMatrix<_Field,_Rep> MatrixType;
+		typedef typename MatrixCategories::RowColMatrixTag MatrixCategory;
+	};
+
+	template <class _Field, class _Rep>
+	struct MatrixTraits< const BlasMatrix<_Field,_Rep> > {
+		typedef const BlasMatrix<_Field,_Rep> MatrixType;
+		typedef typename MatrixCategories::RowColMatrixTag MatrixCategory;
+	};
+
+	template <class _Matrix>
+	struct MatrixTraits< BlasSubmatrix<_Matrix> > {
+		typedef BlasSubmatrix<_Matrix> MatrixType;
+		typedef typename MatrixCategories::RowColMatrixTag MatrixCategory;
+	};
+
+	template <class _Matrix>
+	struct MatrixTraits< const BlasSubmatrix<_Matrix> > {
+		typedef const BlasSubmatrix<_Matrix> MatrixType;
+		typedef typename MatrixCategories::RowColMatrixTag MatrixCategory;
+	};
+
+}
+
+namespace LinBox { /*  MatrixHomTrait */
+
+	//non working partial specialisation
+	// template <class Ring, class Field, class _Rep>
+	// struct MatrixHomTrait<BlasMatrix<Ring, _Rep>, Field> {
+		// typedef BlasMatrix<Field,_Rep> value_type;
+	// };
+
+	template <class Ring, class Field>
+	struct MatrixHomTrait<BlasMatrix<Ring, typename Vector<Ring>::Dense >, Field> {
+		typedef BlasMatrix<Field,typename Vector<Field>::Dense > value_type;
+	};
+
+
+}
+
+namespace LinBox { /*  IndexedCategory  */
+
+	//! @bug this is trait, not a Category
+	template<class Field, class _Rep>
+	struct IndexedCategory< BlasMatrix<Field,_Rep> > {
+		typedef IndexedTags::HasIndexed Tag;
+	};
+
+} // LinBox
+
+namespace LinBox { /*  ContainerTraits */
+
+	// this could also be a member of BlasVector
+	template<class _Field, class _Rep>
+	struct ContainerTraits<BlasMatrix<_Field,_Rep> > {
+		typedef ContainerCategories::Matrix ContainerCategory ;
+	};
+
+	template<class _Matrix>
+	struct ContainerTraits<BlasSubmatrix<_Matrix> > {
+		typedef ContainerCategories::Matrix ContainerCategory ;
+	};
+
+}
+
+#endif // __LINBOX_matrix_dense_matrix_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/dense-rows-matrix.h b/linbox/matrix/dense-rows-matrix.h
deleted file mode 100644
index 329aedf..0000000
--- a/linbox/matrix/dense-rows-matrix.h
+++ /dev/null
@@ -1,264 +0,0 @@
-/* linbox/matrix/dense-rows-matrix.h
- * Copyright (C) 2003 Bradford Hovinen
- *
- * Written by Bradford Hovinen <bghovinen at math.uwaterloo.ca>
- *
- * --------------------------------------------------------
- *
- * 
- * ========LICENCE========
- * This file is part of the library LinBox.
- * 
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This 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
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_dense_rows_matrix_H
-#define __LINBOX_dense_rows_matrix_H
-
-#include <vector>
-#include <utility>
-#include <iostream>
-#include <algorithm>
-
-#include "linbox/blackbox/factory.h"
-#include "linbox/vector/vector-traits.h"
-#include "linbox/util/debug.h"
-#include "linbox/matrix/matrix-domain.h"
-
-namespace LinBox
-{
-
-	/** @brief Dense row-wise matrix container
-	 *
-	 * This class implements a dense matrix, storing the data as a vector of vectors
-	 * of the given type, in the same manner as @ref SparseMatrixBase. It provides
-	 * only row iterators.
-	 *
-	 * @param Vector Row vector type
-	 */
-	template <class _Row>
-	class DenseRowsMatrix {
-	public:
-
-		typedef _Row Row;
-		typedef typename Row::value_type Element;
-		typedef typename std::vector<Row> Rep;
-
-		/** Constructor.
-		 * Note: the copy constructor and operator= will work as intended
-		 *       because of STL's container design
-		 * @param  m  row dimension
-		 * @param  n  column dimension
-		 */
-		DenseRowsMatrix (size_t m, size_t n);
-
-		/** Copy constructor.
-		*/
-		DenseRowsMatrix (const DenseRowsMatrix &A) :
-		       	_Mat (A._Mat), _m (A._m), _n (A._n)
-		{}
-
-		/** Destructor. */
-		~DenseRowsMatrix () {}
-
-		/** Retreive row dimension of the matrix.
-		 * @return integer number of rows of DenseRowsMatrix matrix.
-		 */
-		size_t rowdim () const { return _m; }
-
-		/** Retreive column dimension of matrix.
-		 * @return integer number of columns of DenseRowsMatrix matrix.
-		 */
-		size_t coldim () const { return _n; }
-
-		/** @name Input and output
-		*/
-		//@{
-
-		/** Read a matrix from the given input stream using field read/write
-		 * @param is Input stream from which to read the matrix
-		 * @param F Field with which to read
-		 */
-		template <class Field>
-		std::istream &read (std::istream &is, const Field &F);
-
-		/** Read a matrix from the given input stream using standard operators
-		 * @param is Input stream from which to read the matrix
-		 */
-		std::istream &read (std::istream &is);
-
-		/** Write a matrix to the given output stream using field read/write
-		 * @param os Output stream to which to write the matrix
-		 * @param F Field with which to write
-		 */
-		template <class Field>
-		std::ostream &write (std::ostream &os, const Field &F) const;
-
-		/** Write a matrix to the given output stream using standard operators
-		 * @param os Output stream to which to write the matrix
-		 */
-		std::ostream &write (std::ostream &os) const;
-
-		//@}
-
-		/** @name Access to matrix elements
-		*/
-		//@{
-
-		/** Set an individual entry
-		 * Setting the entry to 0 will remove it from the matrix
-		 * @param i Row index of entry
-		 * @param j Column index of entry
-		 * @param value Value of the new entry
-		 */
-		void setEntry (size_t i, size_t j, const Element &value)
-		{ _Mat[i][j] = value; }
-
-		/** Get a writeable reference to an entry in the matrix
-		 * If there is no entry at the position (i, j), then a new entry
-		 * with a value of zero is inserted and a reference  to it is
-		 * returned.
-		 * @param i Row index of entry
-		 * @param j Column index of entry
-		 * @return Reference to matrix entry
-		 */
-		Element &refEntry (size_t i, size_t j)
-		{ return _Mat[i][j]; }
-
-		/** Get a read-only individual entry from the matrix
-		 * @param i Row index
-		 * @param j Column index
-		 * @return Const reference to matrix entry
-		 */
-		const Element &getEntry (size_t i, size_t j) const
-		{ return _Mat[i][j]; }
-
-		/** Get an entry and store it in the given value
-		 * This form is more in the Linbox style and is provided for interface
-		 * compatibility with other parts of the library
-		 * @param x Element in which to store result
-		 * @param i Row index
-		 * @param j Column index
-		 * @return Reference to x
-		 */
-		Element &getEntry (Element &x, size_t i, size_t j) const
-		{ return x = _Mat[i][j]; }
-
-		/** @name Columns of rows iterator
-		 * The columns of row iterator gives each of the rows of the
-		 * matrix in ascending order. Dereferencing the iterator yields
-		 * a row vector in sparse sequence format
-		 */
-
-		typedef typename Rep::iterator RowIterator;
-		typedef typename Rep::const_iterator ConstRowIterator;
-
-		///
-		RowIterator rowBegin () { return _Mat.begin (); }
-		///
-		RowIterator rowEnd () { return _Mat.end (); }
-		///
-		ConstRowIterator rowBegin () const { return _Mat.begin (); }
-		///
-		ConstRowIterator rowEnd () const { return _Mat.end (); }
-
-		/** @name Raw iterator
-		 * The raw iterator is a method for accessing all nonzero
-		 * entries in the matrix in some unspecified order. This can be
-		 * used, e.g. to reduce all matrix entries modulo a prime before
-		 * passing the matrix into an algorithm.
-		 */
-
-		///
-		class Iterator;
-		///
-		class ConstIterator;
-
-		/// Begin
-		Iterator Begin ();
-		/// End
-		Iterator End ();
-		/// const Begin
-		ConstIterator Begin () const;
-		/// const End
-		ConstIterator End () const;
-
-		/** @name Index iterator
-		 * The index iterator gives the row, column indices of all matrix
-		 * elements in the same order as the raw iterator above. Its value type
-		 * is an STL pair with the row and column indices, starting at 0, in the
-		 * first and second positions, respectively.
-		 */
-
-		/// IndexedIterator
-		class IndexedIterator;
-		/// ConstIndexedIterator
-		class ConstIndexedIterator;
-
-		/// IndexedBegin
-		IndexedIterator IndexedBegin ();
-		/// IndexedEnd
-		IndexedIterator IndexedEnd ();
-		/// const IndexedBegin
-		ConstIndexedIterator IndexedBegin () const;
-		/// const IndexedEnd
-		ConstIndexedIterator IndexedEnd () const;
-
-		/** Retrieve a row as a writeable reference
-		 * @param i Row index
-		 */
-		Row &getRow (size_t i)
-		{ return _Mat[i]; }
-
-		/** Construct the transpose of this matrix and place it in the
-		 * DenseRowsMatrix given.
-		 * @param AT
-		 */
-		DenseRowsMatrix &transpose (DenseRowsMatrix &AT) const;
-
-		//@}
-
-	protected:
-
-		friend class SparseMatrixWriteHelper<Element, Row>;
-		friend class SparseMatrixReadWriteHelper<Element, Row>;
-
-		Rep               _Mat;
-		size_t            _m;
-		size_t            _n;
-	};
-
-	template <class Row>
-	struct MatrixTraits< DenseRowsMatrix<Row> >
-	{
-		typedef DenseRowsMatrix<Row> MatrixType;
-		typedef typename MatrixCategories::RowMatrixTag<MatrixTraits<MatrixType> > MatrixCategory;
-	};
-
-} // namespace LinBox
-
-#endif // __LINBOX_dense_rows_matrix_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/matrix/densematrix/Makefile.am b/linbox/matrix/densematrix/Makefile.am
new file mode 100644
index 0000000..d82fb95
--- /dev/null
+++ b/linbox/matrix/densematrix/Makefile.am
@@ -0,0 +1,34 @@
+# Copyright (c) 2014 the LinBox group
+# written by BB
+#  ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the  GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# ========LICENCE========
+
+
+
+pkgincludesubdir=$(pkgincludedir)/matrix/densematrix
+
+
+pkgincludesub_HEADERS =         \
+		blas-matrix.h \
+		blas-submatrix.inl \
+		blas-matrix.inl \
+		blas-triangularmatrix.inl \
+		blas-transposed-matrix.h \
+		blas-matrix-multimod.h
+
+
diff --git a/linbox/matrix/densematrix/blas-matrix-multimod.h b/linbox/matrix/densematrix/blas-matrix-multimod.h
new file mode 100644
index 0000000..1fec123
--- /dev/null
+++ b/linbox/matrix/densematrix/blas-matrix-multimod.h
@@ -0,0 +1,217 @@
+/* linbox/matrix/blas-matrix-multimod.h
+ * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
+ *
+ * Written by :
+ *               Pascal Giorgi  pascal.giorgi at ens-lyon.fr
+ *               Clément Pernet clement.pernet at imag.fr
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/blas-matrix-multimod.h
+ * @ingroup matrix
+ * A \c BlasMatrix<\c _Field > represents a matrix as an array of
+ * <code>_Field::Element</code>s. It also has the BlasBlackbox interface.
+ *
+ */
+
+/*! @file matrix/blas-matrix-multimod.h
+ * @brief specialisation for mutlimod field.
+ */
+
+#ifndef __LINBOX_blas_matrix_multimod_H
+#define __LINBOX_blas_matrix_multimod_H
+
+#include "linbox/util/debug.h"
+
+// #include "linbox/vector/subiterator.h"
+// #include "linbox/vector/subvector.h"
+
+#include "linbox/matrix/matrix-category.h"
+#include "linbox/linbox-tags.h"
+#include "linbox/matrix/dense-matrix.h"
+
+THIS_CODE_MAY_NOT_COMPILE_AND_IS_NOT_TESTED
+
+namespace LinBox
+{ /*  Specialisation of BlasMatrix for MultiModDouble field */
+
+	/*! No Doc.
+	*/
+	template<>
+	class BlasMatrix<MultiModDouble> {
+
+	public:
+
+		typedef MultiModDouble         Field;
+		typedef std::vector<double>  Element;
+		typedef BlasMatrix<MultiModDouble> Self_t;
+
+	protected:
+
+		MultiModDouble                 _field;
+		const std::vector<MatrixDomain<Givaro::Modular<double> > >   _MD;
+		size_t                  _row,_col;
+		Element                _One,_Zero; //! @warning used ?
+		std::vector<BlasMatrix<Givaro::Modular<double> >* > _rep;
+		std::vector<double>       _entry;
+	public:
+
+
+		//BlasMatrix () {}
+
+		BlasMatrix (const MultiModDouble& F) :
+			_field(F) , _rep(F.size()), _entry(F.size())
+		{}
+
+		BlasMatrix (const Field& F, size_t m, size_t n, bool alloc=true) :
+			_field(F), _row(m) , _col(n) , _rep(F.size()),  _entry(F.size())
+		{
+			for (size_t i=0;i<_rep.size();++i)
+				_rep[i] =  new BlasMatrix<Givaro::Modular<double> > (F.getBase(i), m, n);
+		}
+
+		BlasMatrix (const BlasMatrix<MultiModDouble> & A):
+			_field(A._field),_row(A._row), _col(A._col),
+			_rep(A._rep.size()), _entry(A._entry)
+		{
+
+			for (size_t i=0;i<_rep.size();++i)
+				_rep[i]= new  BlasMatrix<Givaro::Modular<double> > (const_cast<BlasMatrix<Givaro::Modular<double> >& >( *A._rep[i]));
+		}
+
+
+		const BlasMatrix<MultiModDouble>& operator=(const BlasMatrix<MultiModDouble> & A)
+		{
+			_field   = A._field;
+			_row = A._row;
+			_col = A._col;
+			_rep = std::vector<BlasMatrix<Givaro::Modular<double> >* >(A._rep.size());
+			_entry = A._entry;
+			for (size_t i=0;i<_rep.size();++i)
+				_rep[i]= new  BlasMatrix<Givaro::Modular<double> > (const_cast<BlasMatrix<Givaro::Modular<double> >& >( *A._rep[i]));
+			return *this;
+		}
+
+
+		~BlasMatrix() {for (size_t i=0; i< _rep.size();++i) {delete _rep[i];} }
+
+		template <class Vector1, class Vector2>
+		Vector1&  apply (Vector1& y, const Vector2& x) const
+		{
+			for (size_t i=0;i<_rep.size();++i) {
+				std::vector<double> x_tmp(x.size()), y_tmp(y.size());
+				for (size_t j=0;j<x.size();++j)
+					x_tmp[j]= x[j][i];
+
+				_rep[i]->apply(y_tmp, x_tmp);
+
+				for (size_t j=0;j<y.size();++j){
+					y[j][i]=y_tmp[j];
+
+				}
+			}
+
+			return y;
+		}
+
+		template <class Vector1, class Vector2>
+		Vector1&  applyTranspose (Vector1& y, const Vector2& x) const
+		{
+			for (size_t i=0;i<_rep.size();++i) {
+				std::vector<double> x_tmp(x.size()), y_tmp(y.size());
+				for (size_t j=0;j<x.size();++j)
+					x_tmp[i]= x[j][i];
+
+				_rep[i]->applyTranspose(y_tmp, x_tmp);
+
+				for (size_t j=0;j<y.size();++j)
+					y[j][i]=y_tmp[i];
+			}
+
+			return y;
+		}
+
+#if 0
+		template<typename _Tp1>
+		struct rebind
+		{
+			typedef BlasMatrix<_Tp1> other;
+
+			void operator() (other *& Ap, const Self_t& A, const _Tp1& F) {
+				Ap = new other(F, A.rowdim(), A.coldim());
+				Hom<Field, _Tp1> hom(A. field(), F);
+
+				hom.image (*Ap_p, *A_p);
+			}
+		};
+#endif
+
+		size_t rowdim() const {return _row;}
+
+		size_t coldim() const {return _col;}
+
+
+		const Field &field() const  {return _field;}
+
+
+		std::ostream& write(std::ostream& os) const
+		{
+			for (size_t i=0;i<_rep.size();++i)
+				_rep[i]->write(os);
+			return os;
+		}
+
+
+		void setEntry (size_t , size_t j, const Element &a_ij)
+		{
+			for (size_t i=0; i< _rep.size();++i)
+				_rep[i]->setEntry(i,j,a_ij[i]);
+		}
+
+
+		const Element& getEntry (size_t , size_t j)
+		{
+			for (size_t i=0; i< _rep.size();++i)
+				_entry[i]=_rep[i]->getEntry(i,j);
+			return _entry;
+		}
+
+		BlasMatrix<Givaro::Modular<double> >*& getMatrix(size_t i) {return _rep[i];}
+
+	};
+
+
+	template <>
+	class MatrixContainerTrait<BlasMatrix<MultiModDouble> > {
+	public:
+		typedef MatrixContainerCategory::Blackbox Type;
+	};
+} // LinBox
+
+#endif // __LINBOX_blas_matrix_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/densematrix/blas-matrix.h b/linbox/matrix/densematrix/blas-matrix.h
new file mode 100644
index 0000000..8c45d7f
--- /dev/null
+++ b/linbox/matrix/densematrix/blas-matrix.h
@@ -0,0 +1,1254 @@
+/*
+ * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
+ *               2013, 2014 the LinBox group
+ *
+ * Written by :
+ *               Pascal Giorgi  pascal.giorgi at ens-lyon.fr
+ *               Clément Pernet clement.pernet at imag.fr
+ *               Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/densematrix/blas-matrix.h
+ * @ingroup densematrix
+ * A \c BlasMatrix<\c _Field > represents a matrix as an array of
+ * <code>_Field::Element</code>s. It also has the BlasBlackbox interface.
+ *
+ */
+
+#ifndef __LINBOX_matrix_densematrix_blas_matrix_H
+#define __LINBOX_matrix_densematrix_blas_matrix_H
+
+#include <linbox/linbox-config.h>
+#include "linbox/util/debug.h"
+#include "linbox/linbox-tags.h"
+#include "linbox/vector/stream.h"
+#include "linbox/field/hom.h"
+#include "linbox/vector/blas-vector.h"
+
+#include "linbox/matrix/matrix-category.h"
+#include "linbox/matrix/matrix-traits.h"
+#include "linbox/util/matrix-stream.h"
+
+#include "linbox/ring/modular.h" // just for checkBlasApply
+#include <givaro/modular-balanced.h> // just for checkBlasApply
+#include "givaro/zring.h"
+//! @bug this does not belong here.
+#include "blas-transposed-matrix.h"
+#include "linbox/matrix/matrixdomain/matrix-domain.h"
+#include "linbox/matrix/matrixdomain/apply-domain.h"
+
+#include <givaro/modular.h>
+
+namespace LinBox
+{ /*  not generic wrt Field (eg NTL_ZZ_p) */
+	namespace Protected
+	{
+
+		//!@bug this does not seem right for float or any non M/modular field: doing blas wherever we have a fflas-ffpack field (?)
+		//! @bug should return true for some Givaro::ZRing
+		template <class Field>
+		bool checkBlasApply(const Field &F, size_t n)
+		{
+
+			return false;
+			// integer chara, card;
+			// F.characteristic(chara);
+			// F.cardinality(card);
+
+			// if ((chara != card) || chara == 0)
+				// return false;
+			// else
+				// if (n*chara*chara < integer("9007199254740992"))
+					// return true;
+				// else
+					// return false;
+		}
+
+		template<>
+		bool checkBlasApply(const Givaro::Modular<double> &, size_t)
+		{
+			return true;
+		}
+
+		template<>
+		bool checkBlasApply(const Givaro::ModularBalanced<double> &, size_t)
+		{
+			return true;
+		}
+
+		template<>
+		bool checkBlasApply(const Givaro::Modular<float> &, size_t)
+		{
+			return true;
+		}
+
+		template<>
+		bool checkBlasApply(const Givaro::ModularBalanced<float> &, size_t)
+		{
+			return true;
+		}
+
+		template<>
+		bool checkBlasApply(const Givaro::Modular<int64_t> &, size_t)
+		{
+			return true;
+		}
+
+		template<>
+		bool checkBlasApply(const Givaro::ModularBalanced<int64_t> &, size_t)
+		{
+			return true;
+		}
+
+		template<>
+		bool checkBlasApply(const Givaro::Modular<int32_t> &, size_t)
+		{
+			return true;
+		}
+
+		template<>
+		bool checkBlasApply(const Givaro::ModularBalanced<int32_t> &, size_t)
+		{
+			return true;
+		}
+		template<>
+		bool checkBlasApply(const Givaro::Modular<int16_t> &, size_t)
+		{
+			return true;
+		}
+
+		template<>
+		bool checkBlasApply(const Givaro::ModularBalanced<int16_t> &, size_t)
+		{
+			return true;
+		}
+
+	}
+}
+
+namespace LinBox
+{ /*  Blas Matrix */
+	template<class Matrix>
+	class MatrixDomain;
+
+	/*! Dense matrix representation.
+	 * @ingroup matrix
+	 * A \p BlasMatrix is a matrix of \p _Field::Element, with the structure of BLAS matrices.
+	 * It is basically a vector of \p _Field::Element.
+	 * In the Mother model, a \p BlasMatrix is allocated by the user.
+	 *@bug why not BlasMatrixDomain ?
+	 */
+	template <class _Field, class _Storage>
+	class BlasMatrix {
+		// private :
+
+	public:
+		typedef _Field                                  Field;
+		typedef typename Field::Element               Element;    //!< Element type
+		typedef _Storage                                  Rep;    //!< Actually a <code>std::vector<Element></code> (or alike: cstor(n), cstor(n, val), operator[], resize(n).)
+		typedef typename Rep::pointer                 pointer;    //!< pointer type to elements
+		typedef const pointer                   const_pointer;    //!< const pointer type
+		typedef BlasMatrix<Field,Rep>                  Self_t;    //!< Self typeype
+		typedef const BlasMatrix<Field,Rep>       constSelf_t;    //!< Self typeype
+
+                typedef BlasSubmatrix<Self_t>           subMatrixType;    //!< Submatrix type
+		typedef BlasSubmatrix<constSelf_t> constSubMatrixType;    //!< Submatrix type
+                typedef Self_t                             matrixType;    //!< matrix type
+                typedef constSelf_t                   constMatrixType;    //!< matrix type
+                typedef Self_t                               blasType;    //!< blas matrix type
+
+	protected:
+		size_t			    _row;
+		size_t			    _col;
+		Rep			    _rep;
+	public:
+		bool		     _use_fflas ; //! @bug why public ?
+	//protected:
+		pointer			    _ptr;
+	public:
+	// protected:
+	       	const Field		    * _field; //! @bug why public ?
+		MatrixDomain<Field>    _MD; //! @bug why public ?
+		VectorDomain<Field>    _VD;
+		// applyDomain<subMatrixType>    _AD; //! @bug why public ?
+		// applyDomain<Self_t>    _AD; //! @bug why public ?
+
+
+	private:
+
+#if 0
+		void makePointer()
+		{
+#if 0
+			if (_row && _col) {
+				_ptr = malloc( _row*_col*sizeof(_Element) ) ;
+				linbox_check(_ptr);
+			}
+			else
+				_ptr = NULL ;
+#endif
+			_rep = Rep(_row*_col);
+			_ptr = &_rep[0];
+		}
+#endif
+
+		/*! @internal
+		 * @name create BlasMatrix
+		 * @{ */
+
+		/*! @internal
+		 * Copy data according to blas container structure.
+		 * Specialisation for BlasContainer.
+		 */
+		void createBlasMatrix (const Self_t & A) ;
+
+		/*! @internal
+		 * Copy data according to blas container structure.
+		 * Specialisation for BlasContainer.
+		 */
+		template <class _Matrix>
+		void createBlasMatrix (const _Matrix& A, MatrixContainerCategory::BlasContainer) ;
+
+		/*! @internal
+		 * Copy data according to Matrix container structure.
+		 * Specialisation for Container
+		 */
+		template <class Matrix>
+		void createBlasMatrix (const Matrix& A, MatrixContainerCategory::Container) ;
+
+		/*! @internal
+		 * Copy data according to blackbox structure.
+		 * Specialisation for Blackbox.
+		 */
+		template <class Matrix>
+		void createBlasMatrix (const Matrix& A, MatrixContainerCategory::Blackbox) ;
+
+		/*! @internal
+		 * Copy data according to Matrix container structure (allow submatrix).
+		 * Specialisation for Container
+		 */
+		template <class _Matrix>
+		void createBlasMatrix (const _Matrix& A,
+				       const size_t i0,const size_t j0,
+				       const size_t m, const size_t n,
+				       MatrixContainerCategory::Container) ;
+
+		/*! @internal
+		 * Copy data according to Matrix container structure (allow submatrix).
+		 * Specialisation for BlasContainer.
+		 */
+		template <class Matrix>
+		void createBlasMatrix (const Matrix& A,
+				       const size_t i0,const size_t j0,
+				       const size_t m, const size_t n,
+				       MatrixContainerCategory::BlasContainer) ;
+
+		/*! @internal
+		 * Copy data according to blackbox structure (allow submatrix).
+		 * Specialisation for Blackbox matrices
+		 * @todo need to be implemented by succesive apply
+		 */
+		template <class Matrix>
+		void createBlasMatrix (const Matrix& A,
+				       const size_t i0,const size_t j0,
+				       const size_t m, const size_t n,
+				       MatrixContainerCategory::Blackbox) ;
+
+		/*!@internal constructor from vector of elements.
+		 * @param v pointer to \c Element s
+		 */
+		void createBlasMatrix ( const Element * v) ;
+
+		/*!@internal constructor from vector of elements.
+		 * @param v std::vector of \c Element s
+		 */
+		void createBlasMatrix ( const std::vector<Element> & v) ;
+		/*! @internal
+		 * @}
+		 */
+
+	public:
+
+		//////////////////
+		// CONSTRUCTORS //
+		//////////////////
+
+
+		/*! Allocates a new \f$ 0 \times 0\f$ matrix (shaped and ready).
+		*/
+		BlasMatrix (const _Field &F) ;
+
+		// /*! Allocates a new bare \f$ 0 \times 0\f$ matrix (unshaped, unready).
+		// */
+		// BlasMatrix () ;
+
+		/// (Re)allocates a new \f$ m \times n\f$ zero matrix (shaped and ready).
+		void init(const _Field & F, const size_t & r = 0, const size_t & c = 0);
+
+		/*! Allocates a new \f$ m \times n\f$ zero matrix (shaped and ready).
+		 * @param F
+		 * @param m rows
+		 * @param n cols
+		 */
+		//@{
+
+		BlasMatrix (const _Field &F, const size_t & m, const size_t &n) ;
+
+		//@}
+
+
+		/*! Constructor from a matrix stream.
+		 * @param ms matrix stream.
+		 */
+		BlasMatrix(MatrixStream<_Field>& ms) ;
+
+		/*! Generic copy constructor from either a blackbox or a matrix container.
+		 * @param A matrix to be copied
+		 */
+		template <class Matrix>
+		BlasMatrix (const Matrix &A) ;
+
+		/*! Generic copy constructor from either a blackbox or a matrix container (allow submatrix).
+		 * @param A matrix to be copied
+		 * @param i0
+		 * @param j0
+		 * @param m rows
+		 * @param n columns
+		 */
+		template <class Matrix>
+		BlasMatrix (const Matrix& A,
+			    const size_t & i0, const size_t & j0,
+			    const size_t & m,  const size_t & n) ;
+
+		/*! Constructor.
+		 * @param A matrix to be copied
+		 * @param F Field
+		 */
+		template<class _Matrix>
+		BlasMatrix (const _Matrix &A,  const _Field &F) ;
+
+		/*! Copy Constructor of a matrix (copying data).
+		 * @param A matrix to be copied.
+		 */
+		BlasMatrix (const Self_t & A) ;
+
+		/*- Copy Constructor of a matrix (copying data).
+		 * @param A matrix to be copied.
+		 */
+		// BlasMatrix (const BlasSubmatrix<Field,Rep>& A) ;
+
+		/*! Create a BlasMatrix from a vector of elements
+		 * @param F
+		 * @param v
+		 * @param m
+		 * @param n
+		 */
+		BlasMatrix (const _Field &F, const std::vector<Element>& v,
+			    const size_t &m , const size_t &n) ;
+
+		/*! Create a BlasMatrix from an array of elements
+		 * @param F
+		 * @param v
+		 * @param m
+		 * @param n
+		 */
+		BlasMatrix (const _Field &F, const Element * v,
+			    const size_t & m, const size_t & n) ;
+
+
+		/** Constructor using a finite vector stream (stream of the rows).
+		 * @param  F The field of entries; passed so that arithmetic may be done
+		 *           on elements
+		 * @param  stream A vector stream to use as a source of vectors for this
+		 *                matrix
+		 */
+		template <class StreamVector>
+		BlasMatrix (const Field &F, VectorStream<StreamVector> &stream) ;
+
+		/// Destructor.
+		~BlasMatrix () ;
+
+		//! operator = (copying data)
+		Self_t& operator= (const Self_t& A) ;
+
+		/// Make this a (deep)copy of B. Assumes same shape.
+		//! make sure we actually copy
+		template<class Matrix>
+		BlasMatrix &copy( const Matrix & B)
+		{
+			Element x; field().init(x);
+			for (size_t i = 0 ; i < rowdim() ; ++i)
+				for (size_t j = 0 ; j < coldim() ; ++j) {
+					setEntry(i,j,B.getEntry(x,i,j));
+				}
+			return *this;
+
+		}
+
+
+		//! Rebind operator
+		template<typename _Tp1>
+		struct rebind ;
+
+		//////////////////
+		//  DIMENSIONS  //
+		//////////////////
+
+		/** Get the number of rows in the matrix.
+		 * @returns Number of rows in matrix
+		 */
+		size_t rowdim() const ;
+
+		/** Get the number of columns in the matrix.
+		 * @returns Number of columns in matrix
+		 */
+		size_t coldim() const ;
+
+		/*! Get the stride of the matrix.
+		 */
+		size_t getStride() const;
+		size_t stride() const { return getStride() ;}
+
+		/*!Get a reference to the stride of the matrix.
+		 * Modify stride this way.
+		 */
+		size_t& getWriteStride();
+
+
+		/** Resize the matrix to the given dimensions.
+		 * The state of the matrix's entries after a call to this method is
+		 * undefined
+		 * @param m Number of rows
+		 * @param n Number of columns
+		 * @param val
+		 */
+		void resize (const size_t &m, const size_t &n, const Element& val = Element()) ;
+
+		//////////////////
+		//   ELEMENTS   //
+		//////////////////
+
+		/*! @internal
+		 * Get read-only pointer to the matrix data.
+		 */
+		pointer getPointer() const ;
+
+		const_pointer &getConstPointer() const ;
+
+		Rep & refRep() { return _rep ;}
+		const Rep & getRep() const { return _rep ;}
+
+
+		/*! @internal
+		 * Get write pointer to the matrix data.
+		 * Data may be changed this way.
+		 */
+		pointer& getWritePointer() ;
+
+		/** Set the entry at the (i, j) position to a_ij.
+		 * @param i Row number, 0...rowdim () - 1
+		 * @param j Column number 0...coldim () - 1
+		 * @param a_ij Element to set
+		 */
+		void setEntry (size_t i, size_t j, const Element &a_ij) ;
+
+		/** Get a writeable reference to the entry in the (i, j) position.
+		 * @param i Row index of entry
+		 * @param j Column index of entry
+		 * @returns Reference to matrix entry
+		 */
+		Element &refEntry (size_t i, size_t j) ;
+
+		/** Get a read-only reference to the entry in the (i, j) position.
+		 * @param i Row index
+		 * @param j Column index
+		 * @returns Const reference to matrix entry
+		 */
+		const Element &getEntry (size_t i, size_t j) const ;
+
+		/** Copy the (i, j) entry into x, and return a reference to x.
+		 * This form is more in the Linbox style and is provided for interface
+		 * compatibility with other parts of the library
+		 * @param x Element in which to store result
+		 * @param i Row index
+		 * @param j Column index
+		 * @returns Reference to x
+		 */
+		Element &getEntry (Element &x, size_t i, size_t j) const ;
+
+		///////////////////
+		// TRANSPOSE &AL //
+		///////////////////
+
+		/*! Creates a transposed matrix of \c *this.
+		 * @param[in] tM
+		 * @return the transposed matrix of this.
+		 */
+		Self_t transpose(Self_t & tM) const ;
+
+
+		/*! Transpose (inplace).
+		 * If rows and columns agree, we can transpose inplace.
+		 */
+		template<bool _IP>
+		void transpose() ;
+
+		void transpose() ;
+
+		/*! Reverse the rows of a matrix.
+		 * This is done inplace.
+		 * Let J=antiDiag(1) (or the matrix of the reverse
+		 * permutation or the matrix (i,j) = (i+j+1==m)). Then,
+		 * we compute A <- J.A;
+		 */
+		void reverseRows() ;
+
+		/*! Reverse the columns of a matrix.
+		 * This is done inplace.
+		 * This is A <- J.A
+		 */
+		void reverseCols() ;
+
+		/*! Reverse the rows/columns of a matrix.
+		 * This is done inplace.
+		 * This is A <- J.A.J
+		 */
+		void reverse() ;
+
+		// init to field zero elements
+		void zero() ;
+		// init to random field elements
+		void random()
+		{
+			subMatrixType B(*this, 0, 0, rowdim(), coldim());
+			B.random();
+		}
+
+		template<class Rand>
+		void random(const Rand&)
+		{
+			return random();
+		}
+
+		///////////////////
+		//      I/O      //
+		///////////////////
+
+		/** Read the matrix from an input stream.
+		 * The stream is in SMS, DENSE, or MatrixMarket format and is autodetected.
+		 * @param file Input stream from which to read
+		 */
+		std::istream &read (std::istream &file);
+
+		/// Write the matrix in MatrixMarket format.
+		std::ostream &write (std::ostream &os) const
+		{
+			// std::cout << "writing" << std::endl;
+			constSubMatrixType B(*this, 0, 0, rowdim(), coldim());
+			// std::cout << "......." << std::endl;
+			return B.write(os);
+		}
+
+		/** Write the matrix to an output stream.
+		 * @param os Output stream to which to write
+		 * @param f write in some format (@ref Tag::FileFormat::Format). Default is Maple's.
+		 */
+		std::ostream &write (std::ostream &os,
+				     LINBOX_enum (Tag::FileFormat) f/* = Tag::FileFormat::Maple*/) const
+		{
+			constSubMatrixType B(*this, 0, 0, rowdim(), coldim());
+			return B.write(os, f);
+		}
+
+		/*! @deprecated Only for compatiblity.
+		 */
+		std::ostream &write (std::ostream &os,
+				     bool mapleFormat) const
+		{
+			constSubMatrixType B(*this, 0, 0, rowdim(), coldim());
+			return B.write(os, mapleFormat);
+		}
+
+
+
+
+		///////////////////
+		//   ITERATORS   //
+		///////////////////
+
+		/** @name Column of rows iterator
+		 * \brief
+		 * The column of rows iterator traverses the rows of the
+		 * matrix in ascending order. Dereferencing the iterator yields
+		 * a row vector in dense format
+		 */
+		//@{
+		typedef Subvector<typename Rep::iterator, typename Rep::const_iterator> Row;
+		typedef Subvector<typename Rep::const_iterator>                    ConstRow;
+
+		/*!  Row Iterator.
+		 * @ingroup iterators
+		 * @brief NO DOC
+		 */
+		class RowIterator;
+		/*! Const Row Iterator.
+		 * @ingroup iterators
+		 * @brief NO DOC
+		 */
+		class ConstRowIterator;
+
+		RowIterator      rowBegin ();
+		RowIterator      rowEnd ();
+		ConstRowIterator rowBegin () const;
+		ConstRowIterator rowEnd   () const;
+		//@}
+
+		/** @name Row of columns iterator
+		 * \brief
+		 * The row of columns iterator traverses the columns of the
+		 * matrix in ascending order. Dereferencing the iterator yields
+		 * a column vector in dense format
+		 */
+		//@{
+		typedef Subvector<Subiterator<typename Rep::iterator> >            Col;
+		typedef Subvector<Subiterator<typename Rep::const_iterator> > ConstCol;
+		typedef Col           Column;
+		typedef ConstCol ConstColumn;
+
+		/*! Col Iterator.
+		 * @ingroup iterators
+		 * @brief NO DOC
+		 */
+		class ColIterator;
+		/*! Const Col Iterator.
+		 * @ingroup iterators
+		 * @brief NO DOC
+		 */
+		class ConstColIterator;
+
+		ColIterator      colBegin ();
+		ColIterator      colEnd ();
+		ConstColIterator colBegin () const;
+		ConstColIterator colEnd ()   const;
+		//@}
+
+		/** @name Iterator
+		 * \brief
+		 *
+		 * The iterator is a method for accessing all entries in the matrix
+		 * in some unspecified order. This can be used, e.g. to reduce all
+		 * matrix entries modulo a prime before passing the matrix into an
+		 * algorithm.
+		 */
+		//@{
+		typedef typename Rep::iterator Iterator;
+		typedef typename Rep::const_iterator ConstIterator;
+
+		Iterator      Begin ();
+		Iterator      End   ();
+		ConstIterator Begin () const;
+		ConstIterator End   () const;
+		//@}
+
+		/** @name Raw Indexed iterator
+		 * \brief
+		 *
+		 * Like the raw iterator, the indexed iterator is a method for
+		 * accessing all entries in the matrix in some unspecified order.
+		 * At each position of the the indexed iterator, it also provides
+		 * the row and column indices of the currently referenced entry.
+		 * This is provided through it's \c rowIndex() and \c colIndex() functions.
+		 */
+		//@{
+		class IndexedIterator;
+		/*! Const Indexed Iterator.
+		 * @ingroup iterators
+		 * @brief NO DOC
+		 */
+		class ConstIndexedIterator;
+
+		IndexedIterator      IndexedBegin ();
+		IndexedIterator      IndexedEnd   ();
+		ConstIndexedIterator IndexedBegin () const;
+		ConstIndexedIterator IndexedEnd   () const;
+		//@}
+
+		/** Retrieve a reference to a row.
+		 * Since rows may also be indexed, this allows A[i][j] notation
+		 * to be used.
+		 * @param i Row index
+		 * @bug Rows and Cols should be BlasVectors
+		 */
+		//@{
+		Row      operator[] (size_t i) ;
+		ConstRow operator[] (size_t i) const ;
+		//@}
+
+		///////////////////
+		//     MISC     //
+		///////////////////
+
+
+		/** Compute column density.
+		 * @param v
+		 */
+		template <class Vector>
+		Vector &columnDensity (Vector &v) const ;
+
+		size_t size()
+		{
+			return _row * _col;
+		}
+
+                void finalize() {}
+
+		///////////////////
+		//   BLACK BOX   //
+		///////////////////
+
+
+		template <class Vector1, class Vector2>
+		Vector1&  apply (Vector1& y, const Vector2& x) const ;
+
+		template<class _VRep>
+		BlasVector<Field,_VRep>&  apply (BlasVector<Field,_VRep>& y, const BlasVector<Field,_VRep>& x) const ;
+
+		template <class Vector1, class Vector2>
+		Vector1&  applyTranspose (Vector1& y, const Vector2& x) const ;
+
+		subMatrixType& applyRight(subMatrixType& Y, const subMatrixType& X)
+		{ return Y; } // temp
+		subMatrixType& applyLeft(subMatrixType& Y, const subMatrixType& X)
+		{ return Y; } // temp
+
+		const _Field& field() const;
+		//_Field& field() ;
+		// void setField(const _Field & F) { _field = F ; };
+
+		template<class uselessTag>
+		void changeFieldSpecialised( _Field & G,
+					     // MatrixDomain<_Field> & MD,
+					     VectorDomain<_Field> & VD,
+					     const _Field & F,
+					     const uselessTag & m)
+		{
+			// don't do anything (?)
+			return;
+		}
+
+		void changeFieldSpecialised(      _Field & G,
+						  // MatrixDomain<_Field> & MD,
+						  VectorDomain<_Field> & VD,
+					    const _Field & F,
+					    const RingCategories::ModularTag & m)
+		{
+			G=F ;
+			// _MD = MatrixDomain<_Field>(F);
+			VD = VectorDomain<_Field>(F);
+			return;
+		}
+
+
+		void changeField(const _Field &F)
+		{
+			changeFieldSpecialised(const_cast<_Field&>(_field),
+					       // const_cast<MatrixDomain<_Field>&>(_MD),
+					       const_cast<VectorDomain<_Field>&>(_VD),
+					       F,
+					       typename FieldTraits<_Field>::categoryTag());
+		}
+
+
+
+	}; // end of class BlasMatrix
+
+
+} // end of namespace LinBox
+
+namespace LinBox
+{ /* Blas Submatrix */
+	/*! Dense Submatrix representation.
+	 * @ingroup matrix
+	 * A @ref BlasSubmatrix is a matrix of \p _Field::Element, with the structure of BLAS matrices.
+	 * It is basically a read/write view on a vector of \p _Field::Element.
+	 * In the Mother model, a @ref BlasSubmatrix is not allocated.
+	 * <p>
+	 * This matrix type conforms to the same interface as @ref BlasMatrix,
+	 * except that you cannot resize it. It represents a submatrix of a dense
+	 * matrix. Upon construction, one can freely manipulate the entries in the
+	 * DenseSubmatrix, and the corresponding entries in the underlying
+	 * @ref BlasMatrix will be modified.
+
+
+	 */
+	template <class _Matrix>
+	class BlasSubmatrix {
+	public :
+		typedef typename _Matrix::Field           Field;
+		typedef typename Field::Element         Element;    //!< Element type
+		typedef typename _Matrix::Rep               Rep;    
+		typedef BlasSubmatrix<_Matrix>              Self_t;         //!< Self type
+		typedef const BlasSubmatrix<typename _Matrix::constSelf_t>   constSelf_t;    //!< Self type (const)
+
+		typedef typename Rep::pointer           pointer;    //!< pointer type to elements
+		typedef const pointer             const_pointer;    //!< const pointer type
+                typedef Self_t                    subMatrixType;    //!< Submatrix type
+                typedef constSelf_t          constSubMatrixType;    //!< Submatrix type (const)
+                typedef typename _Matrix::Self_t     matrixType;    //!< non const matrix type
+                typedef typename _Matrix::constSelf_t  constMatrixType;    //!< matrix type (const)
+                typedef matrixType                     blasType;    //!< blas matrix type
+                typedef BlasVector<Field,Rep>        vectorType;    //!< blas matrix type
+
+
+	protected:
+		_Matrix &_Mat;       //!< Parent BlasMatrix (ie encapsulated raw std::vector)
+		size_t _row;                   //!< row dimension of Submatrix
+		size_t _col;                   //!< col dimension of Submatrix
+		size_t _r0;                    //!< upper left corner row of Submatrix in \p _Mat
+		size_t _c0;                    //!< upper left corner row of Submatrix in \p _Mat
+		size_t _stride ;               //!< number of columns in \p _Mat (or stride of \p _Mat)
+		size_t _off;                   //!< offset in \p _Mat, precomputed \c (_row*_stride+_col)
+
+		// applyDomain<matrixType>    _AD;
+		applyDomain<constMatrixType>    _AD;
+	public:
+		VectorDomain<Field>    _VD; //!@bug NOT HERE
+
+		//////////////////
+		// CONSTRUCTORS //
+		//////////////////
+
+
+		/*  constructors */
+
+		// /** NULL constructor.  */
+		// BlasSubmatrix () ;
+
+		/** Constructor from an existing @ref BlasMatrix and dimensions.
+		 * \param M Pointer to @ref BlasMatrix of which to construct submatrix
+		 * \param rowbeg Starting row
+		 * \param colbeg Starting column
+		 * \param Rowdim Row dimension
+		 * \param Coldim Column dimension
+		 */
+		BlasSubmatrix (constMatrixType &M,
+			       size_t rowbeg,
+				size_t colbeg,
+				size_t Rowdim,
+				size_t Coldim);
+
+		BlasSubmatrix (matrixType &M,
+			       size_t rowbeg,
+				size_t colbeg,
+				size_t Rowdim,
+				size_t Coldim);
+
+
+
+		/** Constructor from an existing @ref BlasMatrix
+		 * \param M Pointer to @ref BlasMatrix of which to construct submatrix
+		 */
+		BlasSubmatrix (constMatrixType &M);
+
+		BlasSubmatrix (matrixType &M);
+
+		//! @todo  BlasSub from (sub)Vector
+		// BlasSubmatrix (const vectorType &V);
+
+
+		/** Constructor from an existing submatrix and dimensions
+		 * @param SM Constant reference to BlasSubmatrix from which to
+		 *           construct submatrix
+		 * @param rowbeg Starting row
+		 * @param colbeg Starting column
+		 * @param Rowdim Row dimension
+		 * @param Coldim Column dimension
+		 */
+		BlasSubmatrix (constSelf_t  &SM,
+				size_t rowbeg,
+				size_t colbeg,
+				size_t Rowdim,
+				size_t Coldim);
+
+		BlasSubmatrix (Self_t  &SM,
+				size_t rowbeg,
+				size_t colbeg,
+				size_t Rowdim,
+				size_t Coldim);
+
+		/** Copy constructor.
+		 * @param SM Submatrix to copy
+		 */
+		BlasSubmatrix (constSelf_t &SM);
+		BlasSubmatrix (Self_t &SM);
+
+
+		/*  Members  */
+
+		/** Assignment operator.
+		 * Assign the given submatrix to this one
+		 * This is <i>only</i> renaming !
+		 * There is no copy because BlasSubmatrix owns nothing.
+		 * @param SM Submatrix to assign
+		 * @return Reference to this submatrix
+		 */
+		BlasSubmatrix &operator = (const BlasSubmatrix<_Matrix> &SM);
+
+		// function for repurposing Submatrices.
+		BlasSubmatrix &submatrix(constSelf_t &SM,
+				size_t rowbeg,
+				size_t colbeg,
+				size_t Rowdim,
+				size_t Coldim);
+
+		/// This is deep copy of the data, operator= is a shallow copy.
+		template<class Matrix>
+		BlasSubmatrix &copy( const Matrix & B);
+
+		/// Swap contents.  Shapes must be the same.
+		BlasSubmatrix &swap( Self_t & B);
+
+		/// Overwrite with zeroes.
+		BlasSubmatrix &zero();
+
+		/// Overwrite with random elements.
+		void random();
+
+		template<class T>
+		void random(const T&)
+		{
+			return random() ;
+		}
+
+		template<typename _Tp1, class _Rep2 = Rep>
+		struct rebind ;
+
+		//////////////////
+		//  DIMENSIONS  //
+		//////////////////
+
+		/** Get the number of rows in the matrix
+		 * @return Number of rows in matrix
+		 */
+		size_t rowdim () const;
+
+		/** Get the number of columns in the matrix
+		 * @return Number of columns in matrix
+		 */
+		size_t coldim () const ;
+
+		/*! Get the stride of the matrix.
+		 * @return stride of submatrix (number of cols of dense base matrix)
+		 */
+		size_t getStride() const;
+		size_t stride() const { return getStride() ;}
+		size_t offset() const { return _off ; }
+
+
+		///////////////////
+		//      I/O      //
+		///////////////////
+
+		/** Read the matrix from an input stream.
+		 * @param file Input stream from which to read
+		 * @bug reading a submatrix should not be allowed !!
+		 */
+		// template<class Field>
+		std::istream& read (std::istream &file); // autodetect ?
+
+
+		/** Write the matrix to an output stream.
+		 * @param os Output stream to which to write
+		 * @param f write in some format (@ref Tag::FileFormat::Format). Default is MM's.
+		 */
+		std::ostream &write (std::ostream &os,
+				     LINBOX_enum (Tag::FileFormat) f = Tag::FileFormat::MatrixMarket )const;
+
+		//////////////////
+		//   ELEMENTS   //
+		//////////////////
+
+		/*! @internal
+		 * Get read-only pointer to the matrix data.
+		 */
+		pointer getPointer() const ;
+
+		const_pointer &getConstPointer() const ;
+
+
+		/*! @internal
+		 * Get write pointer to the matrix data.
+		 * Data may be changed this way.
+		 */
+		pointer/* & */ getWritePointer() ;
+
+
+		/** Set the entry at (i, j).
+		 * @param i Row number, 0...rowdim () - 1
+		 * @param j Column number 0...coldim () - 1
+		 * @param a_ij Element to set
+		 */
+		void setEntry (size_t i, size_t j, const Element &a_ij) ;
+
+		/** Get a writeable reference to an entry in the matrix.
+		 * @param i Row index of entry
+		 * @param j Column index of entry
+		 * @return Reference to matrix entry
+		 */
+		Element &refEntry (size_t i, size_t j) ;
+
+		/** Get a read-only individual entry from the matrix.
+		 * @param i Row index
+		 * @param j Column index
+		 * @return Const reference to matrix entry
+		 */
+		const Element &getEntry (size_t i, size_t j) const ;
+
+		/** Get an entry and store it in the given value.
+		 * This form is more in the Linbox style and is provided for interface
+		 * compatibility with other parts of the library
+		 * @param x Element in which to store result
+		 * @param i Row index
+		 * @param j Column index
+		 * @return Reference to x
+		 */
+		Element &getEntry (Element &x, size_t i, size_t j) const ;
+
+
+		///////////////////
+		//   ITERATORS   //
+		///////////////////
+
+		//! @name Forward declaration of Raw Iterators.
+		//@{
+		class Iterator  ;
+		class ConstIterator ;
+
+		class IndexedIterator ;
+		class ConstIndexedIterator ;
+		//@}
+
+
+		/** @name typedef'd Row Iterators.
+		 *\brief
+		 * The row iterator gives the rows of the
+		 * matrix in ascending order. Dereferencing the iterator yields
+		 * a row vector in dense format
+		 * @{
+		 */
+		typedef typename matrixType::RowIterator            RowIterator;
+		typedef typename matrixType::ConstRowIterator       ConstRowIterator;
+		typedef typename matrixType::Row                    Row;
+		typedef typename matrixType::ConstRow               ConstRow;
+		//@} Row Iterators
+
+		/** @name typedef'd Column Iterators.
+		 *\brief
+		 * The columns iterator gives the columns of the
+		 * matrix in ascending order. Dereferencing the iterator yields
+		 * a column vector in dense format
+		 * @{
+		 */
+		typedef typename matrixType::ColIterator            ColIterator;
+		typedef typename matrixType::ConstColIterator       ConstColIterator;
+		typedef typename matrixType::Col                    Col;
+		typedef typename matrixType::Column                 Column;
+		typedef typename matrixType::ConstCol               ConstCol;
+		//@} // Column Iterators
+
+
+
+		RowIterator      rowBegin ();        //!< iterator to the begining of a row
+		RowIterator      rowEnd ();          //!< iterator to the end of a row
+		ConstRowIterator rowBegin () const;  //!< const iterator to the begining of a row
+		ConstRowIterator rowEnd ()   const;  //!< const iterator to the end of a row
+
+		ColIterator      colBegin ();
+		ColIterator      colEnd ();
+		ConstColIterator colBegin () const;
+		ConstColIterator colEnd ()   const;
+
+		Iterator      Begin ();
+		Iterator      End ();
+		ConstIterator Begin () const;
+		ConstIterator End ()   const;
+
+
+
+		IndexedIterator      IndexedBegin();
+		IndexedIterator      IndexedEnd();
+		ConstIndexedIterator IndexedBegin() const;
+		ConstIndexedIterator IndexedEnd()   const;
+
+		/*!  operator[].
+		 * Retrieve a reference to a row
+		 * @param i Row index
+		 */
+		Row      operator[] (size_t i) ;
+		ConstRow operator[] (size_t i) const ;
+
+		///////////////////
+		//   BLACK BOX   //
+		///////////////////
+
+
+		//!@bug every vector we use here should have a stride/be blas vectors so it's not really templated by Vector1 Vector2 in general
+		template <class Vector1, class Vector2>
+		Vector1&  apply (Vector1& y, const Vector2& x) const
+		{
+			// std::cout << "prepare apply  subMatrix" << std::endl;
+			// constSelf_t A(*this);
+			// std::cout << "........................" << std::endl;
+			// _AD.apply(Tag::Transpose::NoTrans,y,field().one,A,field().zero,x);
+			_AD.apply(Tag::Transpose::NoTrans,y,field().one,*this,field().zero,x);
+			// std::cout << "........done............" << std::endl;
+			return y;
+		}
+
+		//! @bug use Matrix domain
+		template <class Vector1, class Vector2>
+		Vector1&  applyTranspose (Vector1& y, const Vector2& x) const
+		{
+			// std::cout << "prepare applyT subMatrix" << std::endl;
+			// constSelf_t A(*this);
+			// std::cout << "........................" << std::endl;
+			// _AD.apply(Tag::Transpose::Trans,y,field().one,A,field().zero,x);
+			_AD.apply(Tag::Transpose::Trans,y,field().one,*this,field().zero,x);
+			// std::cout << "........done............" << std::endl;
+
+			return y;
+		}
+
+		const Field& field() const { return _Mat.field() ;}
+		// Field & field() { return _Mat.field(); }
+	};
+
+}
+
+namespace LinBox
+{ /* Triangular Matrix */
+	//! Triangular BLAS matrix.
+	template <class _Field, class _Storage >
+	class TriangularBlasMatrix: public BlasMatrix<_Field,_Storage> {
+
+	protected:
+
+		LINBOX_enum (Tag::Shape)          _uplo; //!< upper or lower triangular
+		LINBOX_enum (Tag::Diag)           _diag; //!< unit or non unit diagonal
+
+	public:
+		typedef _Field                       Field;
+		typedef _Storage                         Rep;
+		typedef typename Field::Element      Element;      //!< Element type
+		typedef BlasMatrix<Field,Rep>           Father_t;
+		typedef TriangularBlasMatrix<Field,Rep> Self_t;
+
+
+		/*! Constructor for a new \c TriangularBlasMatrix.
+		 * @param F
+		 * @param m rows
+		 * @param n cols
+		 * @param y (non)unit diagonal
+		 * @param x (upp/low)er matrix
+		 */
+		TriangularBlasMatrix (const Field & F,
+				      const size_t m, const size_t n,
+				      LINBOX_enum (Tag::Shape) x=Tag::Shape::Upper,
+				      LINBOX_enum (Tag::Diag) y= Tag::Diag::NonUnit) ;
+
+		/*! Constructor from a \c BlasMatrix (copy).
+		 * @param A matrix
+		 * @param y (non)unit diagonal
+		 * @param x (upp/low)er matrix
+		 */
+		TriangularBlasMatrix (const BlasMatrix<Field,Rep>& A,
+				      LINBOX_enum (Tag::Shape) x=Tag::Shape::Upper,
+				      LINBOX_enum (Tag::Diag) y= Tag::Diag::NonUnit) ;
+
+		/*! Constructor from a \c BlasMatrix (no copy).
+		 * @param A matrix
+		 * @param y (non)unit diagonal
+		 * @param x (upp/low)er matrix
+		 */
+		TriangularBlasMatrix (BlasMatrix<Field,Rep>& A,
+				      LINBOX_enum (Tag::Shape) x=Tag::Shape::Upper,
+				      LINBOX_enum (Tag::Diag) y= Tag::Diag::NonUnit) ;
+
+		/*! Constructor from a \c TriangularBlasMatrix (copy).
+		 * @param A matrix
+		 */
+		TriangularBlasMatrix (const TriangularBlasMatrix<Field,Rep>& A) ;
+
+		/*! Generic constructor from a \c Matrix (no copy).
+		 * @param A matrix
+		 * @param y (non)unit diagonal
+		 * @param x (upp/low)er matrix
+		 */
+		template<class Matrix>
+		TriangularBlasMatrix (const Matrix& A,
+				      LINBOX_enum (Tag::Shape) x=Tag::Shape::Upper,
+				      LINBOX_enum (Tag::Diag) y= Tag::Diag::NonUnit) ;
+
+		/// get the shape of the matrix (upper or lower)
+		LINBOX_enum (Tag::Shape) getUpLo() const ;
+
+		/// Is the diagonal implicitly unit ?
+		LINBOX_enum (Tag::Diag) getDiag() const ;
+
+	}; // end of class TriangularBlasMatrix
+
+} // LinBox
+
+#include <givaro/zring.h>
+
+namespace LinBox
+{
+	//! @bug does not work for submatrices.
+	//! @todo b should be the random generator
+	template<>
+	template<>
+	void BlasMatrix<Givaro::ZRing<Integer>, Vector<Givaro::ZRing<Integer>>::Dense >::random<size_t>(const size_t & b)
+	{
+		// std::cout << "randomized " <<  b << std::endl;
+        typedef Givaro::ZRing<Integer> ZZ_t;
+        ZZ_t::RandIter R(ZZ_t(), b);
+		for (size_t i = 0 ; i < rowdim() ; ++i)
+			for (size_t j = 0 ; j < coldim() ; ++j)
+				R.random(refEntry(i,j));
+
+	}
+
+} // LinBox
+
+#include "blas-matrix.inl"
+#include "blas-submatrix.inl"
+#include "blas-triangularmatrix.inl"
+
+#endif // __LINBOX_densematrix_blas_matrix_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/densematrix/blas-matrix.inl b/linbox/matrix/densematrix/blas-matrix.inl
new file mode 100644
index 0000000..0888411
--- /dev/null
+++ b/linbox/matrix/densematrix/blas-matrix.inl
@@ -0,0 +1,1548 @@
+/*
+ * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
+ *               2013, 2014 the LinBox group
+ *
+ * Written by :
+ *               Pascal Giorgi  <pascal.giorgi at ens-lyon.fr>
+ *               Clément Pernet <clement.pernet at imag.fr>
+ *               Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*!@internal
+ * @file matrix/densematrix/blas-matrix.inl
+ * @ingroup densematrix
+ * A \c BlasMatrix<\c _Field > represents a matrix as an array of
+ * <code>_Field</code>s.
+ */
+
+#ifndef __LINBOX_densematrix_blas_matrix_INL
+#define __LINBOX_densematrix_blas_matrix_INL
+
+/////////////////
+//   PRIVATE   //
+/////////////////
+
+namespace LinBox
+{
+	template<class _Field, class _Rep>
+	void BlasMatrix< _Field, _Rep >::createBlasMatrix (const BlasMatrix< _Field, _Rep >& A)
+	{
+#ifndef NDEBUG
+		if (!areFieldEqual(A.field(),field())) {
+			A.field().write(std::cout) << "!=" ;
+			field().write(std::cout) << std::endl;
+		}
+#endif
+		linbox_check( areFieldEqual(A.field(),field()));
+		createBlasMatrix(A,MatrixContainerCategory::BlasContainer());
+	}
+
+	template<class _Field, class _Rep>
+	void BlasMatrix< _Field, _Rep >::createBlasMatrix (const Element * v)
+	{
+		// Element * iter_v = const_cast<Element*>(v) ;
+		Element * v_end = const_cast<Element*>(v+(_col*_row)) ;
+		// Iterator  iter_addr = this->Begin();
+		Element * iter_addr = _ptr ;
+		for (; v != v_end ; ++v, ++iter_addr)
+		{
+			field().init(*iter_addr);
+			field().assign(*iter_addr,*v);
+		}
+	}
+
+	template<class _Field, class _Rep>
+	void BlasMatrix< _Field, _Rep >::createBlasMatrix (const std::vector<Element> & v)
+	{
+		typename std::vector< Element>::const_iterator iter_value = v.begin();
+		Iterator  iter_addr = this->Begin();
+		for (;iter_value != v.end(); ++iter_value,++iter_addr)
+		{
+			field().init(*iter_addr);
+			field().assign(*iter_addr,*iter_value);
+		}
+	}
+
+
+	template<class _Field, class _Rep>
+	template <class _Matrix>
+	void BlasMatrix< _Field, _Rep >::createBlasMatrix (const _Matrix& A,
+							   MatrixContainerCategory::BlasContainer)
+	{
+		// std::cout << "creator 4" << std::endl;
+		linbox_check( areFieldEqual(A.field(),field()));
+#if 0
+		typename _Matrix::ConstIterator         iter_value = A.Begin();
+		Iterator  iter_addr = this->Begin();
+		for (;iter_value != A.End(); ++iter_value,++iter_addr)
+		{
+			field().init(*iter_addr);
+			field().assign(*iter_addr, *iter_value);
+		}
+#else
+		for (size_t i = 0  ; i < A.rowdim() ; ++i)
+			for (size_t j = 0  ; j < A.coldim() ; ++j)
+				_rep[i*_col+j] = A.getEntry(i,j) ;
+#endif
+	}
+
+	template<class _Field, class _Rep>
+	template <class Matrix>
+	void BlasMatrix< _Field, _Rep >::createBlasMatrix (const Matrix& A,
+							   MatrixContainerCategory::Container)
+	{
+		// std::cout << "creator 5" << std::endl;
+		linbox_check( areFieldEqual(A.field(),field()));
+		// const Field & F = A.field();
+		//!@bug With both iterators, it is Segfaulting !!!!
+		typename Matrix::ConstIndexedIterator  iter_index = A.IndexedBegin();
+		for (;iter_index != A.IndexedEnd(); ++iter_index)
+			setEntry( iter_index.rowIndex(),
+				  iter_index.colIndex(),
+				  A.getEntry(iter_index.rowIndex(),iter_index.colIndex())
+				);
+	}
+
+	template<class _Field, class _Rep>
+	template <class Matrix>
+	void BlasMatrix< _Field, _Rep >::createBlasMatrix (const Matrix& A,
+							   MatrixContainerCategory::Blackbox)
+	{
+		// std::cout << "creator 6" << std::endl;
+		linbox_check( areFieldEqual(A.field(),field()) );
+
+		BlasVector<Field> e(A.field(),A.coldim(), field().zero), tmp(A.field(),A.rowdim());
+		ColIterator col_p;
+
+		typename BlasMatrix< _Field, _Rep >::Col::iterator elt_p;
+		typename BlasVector<Field>::iterator e_p, tmp_p;
+
+
+		for (col_p = colBegin(), e_p = e.begin();
+		     e_p != e.end(); ++ col_p, ++ e_p)
+		{
+
+			field().assign(*e_p, field().one);
+
+			A.apply (tmp, e);
+
+			for (tmp_p = tmp.begin(), elt_p = col_p -> begin();
+			     tmp_p != tmp.end(); ++ tmp_p, ++ elt_p)
+
+				field().assign(*elt_p, *tmp_p);
+
+			field().assign(*e_p, field().zero);
+		}
+	}
+
+	template<class _Field, class _Rep>
+	template <class _Matrix>
+	void BlasMatrix< _Field, _Rep >::createBlasMatrix (const _Matrix& A,
+							   const size_t i0,const size_t j0,
+							   const size_t m, const size_t n,
+							   MatrixContainerCategory::Container)
+	{
+		linbox_check( areFieldEqual(A.field(),field() ) );
+
+		typename _Matrix::ConstIterator         iter_value = A.Begin();
+		typename _Matrix::ConstIndexedIterator  iter_index = A.IndexedBegin();
+
+		for (;iter_value != A.End(); ++iter_value,++iter_index){
+			int i,j;
+			i=(int)iter_index.rowIndex()-(int)i0;
+			j=(int)iter_index.colIndex()-(int)j0;
+			if (( i >= 0)  && (j >= 0) && (i< (int)m) && (j < (int)n))
+				setEntry(i, j, *iter_value);
+		}
+	}
+
+	template<class _Field, class _Rep>
+	template <class Matrix>
+	void BlasMatrix< _Field, _Rep >::createBlasMatrix (const Matrix& A,
+							   const size_t i0,const size_t j0,
+							   const size_t m, const size_t n,
+							   MatrixContainerCategory::BlasContainer)
+	{
+		linbox_check( areFieldEqual(A.field(),field() ) );
+
+		typename Matrix::ConstIterator         iter_value = A.Begin();
+		typename Matrix::ConstIndexedIterator  iter_index = A.IndexedBegin();
+
+		for (;iter_value != A.End(); ++iter_value,++iter_index){
+			int i,j;
+			i=(int)iter_index.rowIndex()-(int)i0;
+			j=(int)iter_index.colIndex()-(int)j0;
+			if ( (i>=0) && (j>=0) && (i< (int)m) && (j < (int)n))
+				setEntry((size_t)i, (size_t)j, *iter_value);
+		}
+	}
+
+	template<class _Field, class _Rep>
+	template <class Matrix>
+	void BlasMatrix< _Field, _Rep >::createBlasMatrix (const Matrix& A,
+							   const size_t i0,const size_t j0,
+							   const size_t m, const size_t n,
+							   MatrixContainerCategory::Blackbox)
+	{
+		linbox_check( areFieldEqual(A.field(),field() ) );
+
+
+		BlasVector<Field> e(A.field(),A.coldim(), field().zero), tmp(A.field(),A.rowdim());
+		ColIterator col_p;
+
+		typename BlasMatrix< _Field, _Rep >::Col::iterator elt_p;
+		typename BlasVector<Element>::iterator e_p, tmp_p;
+
+
+		for (col_p = colBegin(), e_p = e.begin()+(ptrdiff_t)j0;
+		     e_p != e.begin()+(ptrdiff_t)(j0+n); ++ col_p, ++ e_p) {
+
+			field().assign(*e_p, field().one);
+
+			A.apply (tmp, e);
+
+			for (tmp_p = tmp.begin()+(ptrdiff_t)i0, elt_p = col_p -> begin();
+			     elt_p != col_p.end(); ++ tmp_p, ++ elt_p) {
+				field().assign(*elt_p, *tmp_p);
+			}
+
+			field().assign(*e_p, field().zero);
+		}
+	}
+
+} // LinBox
+
+//////////////////
+// CONSTRUCTORS //
+//////////////////
+
+namespace LinBox
+{
+
+
+	template < class _Field, class _Rep >
+	BlasMatrix< _Field, _Rep >::BlasMatrix (const _Field &F) :
+		_row(0),_col(0),_rep(0)
+		// ,_use_fflas(false)
+		,_ptr(NULL)
+		,_field(&F),_MD(F),_VD(F)
+		// ,_AD(F)
+	{
+                //std::cout << "cstor 1 called" << std::endl;
+		_use_fflas = Protected::checkBlasApply(field(),_col);
+	}
+
+#if 0
+	template < class _Field, class _Rep >
+	BlasMatrix< _Field, _Rep >::BlasMatrix () :
+		_row(0),_col(0),_rep(0),_ptr(NULL),
+		_field(Field()),_MD(_field ),_VD(_field )
+	{}
+#endif
+
+	template < class _Field, class _Rep >
+	void BlasMatrix< _Field, _Rep >::init(const _Field &F, const size_t & r, const size_t & c)
+	{
+		_field = &F; _row = r; _col = c;
+		_rep.resize(r*c, F.zero);
+		_ptr = &_rep[0];
+		_VD.init(F); _MD.init(F);
+		// _AD.init(F);
+	}
+
+	template < class _Field, class _Rep >
+	BlasMatrix< _Field, _Rep >::BlasMatrix ( const _Field &F, const size_t & m, const size_t & n) :
+		_row(m),_col(n),_rep(_row*_col, F.zero),_ptr(&_rep[0]),
+		_field(&F),_MD(F),_VD(F)
+		// ,_AD(F)
+	{
+		// std::cout << "cstor 2 called" << std::endl;
+		_use_fflas = Protected::checkBlasApply(field(),_col);
+	}
+
+
+	template < class _Field, class _Rep >
+	BlasMatrix< _Field, _Rep >::BlasMatrix(MatrixStream<_Field>& ms) :
+		_row(0),_col(0),_rep(0),
+		_field(&(ms.getField())),_MD(field() ),_VD(field() )
+		// ,_AD(field())
+	{
+		// std::cout << "cstor 3 called" << std::endl;
+		if( !ms.getArray(_rep) || !ms.getDimensions(_row, _col) )
+			throw ms.reportError(__FUNCTION__,__LINE__);
+		_ptr = &_rep[0];
+		_use_fflas = Protected::checkBlasApply(field(), _col);
+	}
+
+	template < class _Field, class _Rep >
+	template <class StreamVector>
+	BlasMatrix< _Field, _Rep >::BlasMatrix (const Field &F, VectorStream<StreamVector> &stream) :
+		_row(stream.size ()), _col(stream.dim ()), _rep(_row*_col), _ptr(&_rep[0]),
+		_field (&F), _MD (F), _VD(F)
+		// ,_AD(F)
+	{
+		// std::cout << "cstor 4 called" << std::endl;
+		StreamVector tmp(F);
+		typename BlasMatrix<Field,_Rep>::RowIterator p;
+
+		VectorWrapper::ensureDim (tmp, stream.dim ());
+
+		for (p = BlasMatrix<Field,_Rep>::rowBegin (); p != BlasMatrix<Field,_Rep>::rowEnd (); ++p) {
+			stream >> tmp;
+			_VD.copy (*p, tmp);
+		}
+		_use_fflas = Protected::checkBlasApply(field(), _col);
+	}
+
+	template < class _Field, class _Rep >
+	template <class Matrix>
+	BlasMatrix< _Field, _Rep >::BlasMatrix (const Matrix &A) :
+		_row(A.rowdim()),_col(A.coldim()),_rep(_row*_col),_ptr(&_rep[0]),
+		_field(&(A.field())),_MD(field() ),_VD(field() )
+		// ,_AD(field())
+	{
+		// std::cout << "cstor 5 called" << std::endl;
+		// makePointer();
+		_use_fflas = Protected::checkBlasApply(field(), _col);
+		createBlasMatrix(A, typename MatrixContainerTrait<Matrix>::Type());
+	}
+
+	template < class _Field, class _Rep >
+	template <class Matrix>
+	BlasMatrix< _Field, _Rep >::BlasMatrix (const Matrix& A,
+						const size_t &i0, const size_t &j0,
+						const size_t &m,  const size_t &n) :
+		_row(m),_col(n),_rep(_row*_col),_ptr(&_rep[0]),
+		_field(&(A.field())),_MD(field() ),_VD(field() )
+		// ,_AD(field())
+	{
+		// std::cout << "cstor 6 called" << std::endl;
+		_use_fflas = Protected::checkBlasApply(field(), _col);
+		// makePointer();
+		createBlasMatrix(A, i0, j0, m, n,
+				 typename MatrixContainerTrait<Matrix>::Type());
+	}
+
+	template < class _Field, class _Rep >
+	template<class _Matrix>
+	BlasMatrix< _Field, _Rep >::BlasMatrix (const _Matrix &A,  const _Field &F) :
+		_row(A.rowdim()), _col(A.coldim()),_rep(_row*_col),_ptr(&_rep[0]),
+		_field(&F),_MD(field() ),_VD(field() )
+		// ,_AD(field())
+	{
+		// std::cout << "cstor 7 called" << std::endl;
+		_use_fflas = Protected::checkBlasApply(field(), _col);
+		typename _Matrix::template rebind<_Field>()(*this,A);
+	}
+
+	template < class _Field, class _Rep >
+	BlasMatrix< _Field, _Rep >::BlasMatrix (const BlasMatrix< _Field, _Rep >& A) :
+		_row(A.rowdim()), _col(A.coldim()),_rep(_row*_col),_ptr(&_rep[0]),
+		_field(&(A.field())),_MD(field() ),_VD(field() )
+		// ,_AD(field())
+	{
+		// std::cout << "cstor 8 called" << std::endl;
+		_use_fflas = Protected::checkBlasApply(field(), _col);
+		// makePointer();
+		createBlasMatrix(A);
+	}
+
+	template < class _Field, class _Rep >
+	BlasMatrix< _Field, _Rep >::BlasMatrix (const _Field &F,
+						const std::vector<typename _Field::Element>& v,
+						const size_t & m, const size_t & n) :
+		_row(m), _col(n),_rep(_row*_col),_ptr(&_rep[0]),
+		_field(&F),_MD(field() ),_VD(field() )
+		// ,_AD(field())
+	{
+		// std::cout << "cstor 9 called" << std::endl;
+		linbox_check(v.size() == m*n);
+		// makePointer();
+		_use_fflas = Protected::checkBlasApply(field(), _col);
+		createBlasMatrix(v);
+	}
+
+	template < class _Field, class _Rep >
+	BlasMatrix< _Field, _Rep >::BlasMatrix (const _Field &F,
+						const typename _Field::Element * v,
+						const size_t & m, const size_t & n) :
+		_row(m), _col(n),_rep(_row*_col),_ptr(&_rep[0]),
+		_field(&F), _MD(field() ),_VD(field() )
+		// ,_AD(field())
+	{
+		// std::cout << "cstor 10 called" << std::endl;
+		// makePointer();
+		_use_fflas = Protected::checkBlasApply(field(), _col);
+		createBlasMatrix(v);
+	}
+
+	template < class _Field, class _Rep >
+	BlasMatrix< _Field, _Rep >::~BlasMatrix ()
+	{
+                // if (_ptr)
+		// free(_ptr);
+	}
+
+	template < class _Field, class _Rep >
+	void BlasMatrix< _Field, _Rep >::zero()
+	{
+		typename _Field::Element x; field().init(x);
+		for (size_t i = 0; i < rowdim(); ++i)
+			for (size_t j = 0; j < coldim(); ++j)
+				setEntry(i, j, field().zero);
+	}
+
+} // LinBox
+
+///////////////////
+//      I/O      //
+///////////////////
+
+namespace LinBox
+{
+
+	template < class _Field, class _Rep >
+	std::istream &BlasMatrix< _Field, _Rep >::read (std::istream &file)
+	{
+		MatrixStream<Field> ms(field(), file);
+		if( !ms.getArray(_rep) || !ms.getDimensions(_row, _col) )
+			throw ms.reportError(__FUNCTION__,__LINE__);
+		_ptr = &_rep[0];
+		_use_fflas = Protected::checkBlasApply(field(), _col);
+		return file;
+	}
+
+	template < class _Field, class _Rep >
+	BlasMatrix< _Field, _Rep >& BlasMatrix< _Field, _Rep >::operator= (const BlasMatrix< _Field, _Rep >& A)
+	{
+		if ( &A == this)
+			return *this;
+
+		_col = A.coldim();
+		_row = A.rowdim();
+		_rep = Rep(_row*_col);
+		_ptr = &_rep[0] ;
+		// const_cast<_Field&>(_field ) = A.field();
+		// changeField( A.field() );
+		createBlasMatrix(A);
+
+		return *this;
+	}
+
+#if 0 /*  loop rebind */
+	template < class _Field, class _Rep >
+	template<typename _Tp1>
+	struct BlasMatrix< _Field, _Rep >::rebind {
+		typedef BlasMatrix<_Tp1> other;
+
+		void operator() (other & Ap, const Self_t& A, const _Tp1& F) {
+			// typedef typename BlasMatrix< _Field, _Rep >::ConstIndexedIterator ConstIndexedIterator ;
+			// typedef typename BlasMatrix< _Field, _Rep >::ConstIterator ConstIterator ;
+			ConstIterator         iter_value = A.Begin();
+			ConstIndexedIterator  iter_index = A.IndexedBegin();
+			typename _Tp1::Element tmp;
+			for (;iter_value != A.End(); ++iter_value,++iter_index){
+				Ap.field().init(tmp);
+				Ap.field().assign(tmp, *iter_value);
+				Ap.setEntry(iter_index.rowIndex(), iter_index.colIndex(),tmp);
+			}
+		}
+	};
+#endif
+
+#if 1 /*  HOM */
+	//! @bug other rep
+	template < class _Field, class _Rep >
+	template<typename _Tp1>
+	struct BlasMatrix< _Field, _Rep >::rebind {
+		typedef BlasMatrix<_Tp1,typename Vector<_Tp1>::Dense> other;
+
+		void operator() (other & Ap, const Self_t& A) {
+			// typedef Self_t::ConstIterator ConstSelfIterator ;
+			typedef typename BlasMatrix< _Field, _Rep >::ConstIterator ConstSelfIterator ;
+			typedef typename other::Iterator OtherIterator ;
+			OtherIterator    Ap_i = Ap.Begin();
+			ConstSelfIterator A_i = A.Begin();
+			Hom<Field, _Tp1> hom(A. field(), Ap. field()) ;
+			for ( ; A_i != A. End(); ++ A_i, ++ Ap_i)
+				hom.image (*Ap_i, *A_i);
+		}
+	};
+#endif
+
+
+} // LinBox
+
+//////////////////
+//  DIMENSIONS  //
+//////////////////
+
+namespace LinBox
+{
+
+	template < class _Field, class _Rep >
+	size_t BlasMatrix< _Field, _Rep >::rowdim() const
+	{
+		return _row ;
+	}
+
+	template < class _Field, class _Rep >
+	size_t BlasMatrix< _Field, _Rep >::coldim() const
+	{
+		return _col ;
+	}
+
+	template < class _Field, class _Rep >
+	size_t  BlasMatrix< _Field, _Rep >::getStride() const
+	{
+		return _col;
+	}
+
+	template < class _Field, class _Rep >
+	size_t&  BlasMatrix< _Field, _Rep >::getWriteStride()
+	{
+		return _col;
+	}
+
+	template < class _Field, class _Rep >
+	void BlasMatrix< _Field, _Rep >::resize (const size_t & m, const size_t & n, const Element& val )
+	{
+#ifndef NDEBUG
+		if (_col > 0 && _col != n)
+			std::cerr << " ***Warning*** you are resizing a matrix, possibly loosing data. " << std::endl;
+#endif
+		_row = m;
+		_col = n;
+		_rep.resize (m * n, val);
+		_ptr = (m*n == 0 ?  0 : &_rep[0]);
+#if 0
+		if (_ptr) {
+			if (m && n)
+				realloc(_ptr,m*n*sizeof(Element));
+			else {
+				free(_ptr);
+				_ptr=NULL ;
+			}
+		}
+		else
+			makePointer();
+#endif
+	}
+
+} // LinBox
+
+//////////////////
+//   ELEMENTS   //
+//////////////////
+
+namespace LinBox
+{
+
+
+	template < class _Field, class _Rep >
+	typename BlasMatrix< _Field, _Rep >::pointer
+	BlasMatrix< _Field, _Rep >::getPointer() const
+	{
+		return _ptr;
+	}
+
+	template < class _Field, class _Rep >
+	typename BlasMatrix< _Field, _Rep >::const_pointer &
+	BlasMatrix< _Field, _Rep >::getConstPointer() const
+	{
+		return (const_pointer)_ptr;
+	}
+
+
+	template < class _Field, class _Rep >
+	typename BlasMatrix< _Field, _Rep >::pointer&
+	BlasMatrix< _Field, _Rep >::getWritePointer()
+	{
+		return _ptr;
+	}
+
+	template < class _Field, class _Rep >
+	void BlasMatrix< _Field, _Rep >::setEntry (size_t i, size_t j, const Element &a_ij)
+	{
+		_ptr[i * _col + j] = a_ij;
+	}
+
+	template < class _Field, class _Rep >
+	typename _Field::Element & BlasMatrix< _Field, _Rep >::refEntry (size_t i, size_t j)
+	{
+		return _ptr[i * _col + j];
+	}
+
+	template < class _Field, class _Rep >
+	const typename _Field::Element & BlasMatrix< _Field, _Rep >::getEntry (size_t i, size_t j) const
+	{
+		return _rep[i * _col + j];
+	}
+
+	template < class _Field, class _Rep >
+	typename _Field::Element & BlasMatrix< _Field, _Rep >::getEntry (Element &x, size_t i, size_t j) const
+	{
+		return x = _rep[i * _col + j];
+	}
+
+} // LinBox
+
+///////////////////
+// TRANSPOSE &AL //
+///////////////////
+
+namespace LinBox
+{
+	template < class _Field, class _Rep >
+	BlasMatrix< _Field, _Rep > BlasMatrix< _Field, _Rep >::transpose(BlasMatrix< _Field, _Rep > & tM) const
+	{
+		size_t r = this->rowdim() ;
+		size_t c = this->coldim() ;
+		linbox_check(tM.coldim() == r );
+		linbox_check(tM.rowdim() == c);
+		for (size_t i = 0 ; i < r ; ++i)
+			for (size_t j = 0 ; j < c ; ++j)
+				tM.setEntry(j,i,this->getEntry(i,j));
+		return tM;
+	}
+
+	namespace Protected
+	{
+		/*! @internal
+		 *  @brief In-Place Tranpose.
+		 * Adapted from the Wikipedia article.
+		 * @todo make it for strides and Submatrices
+		 * @todo use specialized versions when available (eg dgetmi)
+		 * @todo make transpose have an inplace=true default parameter
+		 * (execpt maybe when below a threshold).
+		 * @param m pointer to the beginning of a row-major matrix vector
+		 * @param w rows in the matrix
+		 * @param h cols in the matrix
+		 */
+		template<class T>
+		void transposeIP(T *m, size_t h, size_t w)
+		{
+			size_t start;
+			T tmp;
+
+			for (start = 0; start <= w * h - 1; ++start) {
+				size_t next, i ;
+				next = start;
+				i = 0;
+				do {
+					++i;
+					next = (next % h) * w + next / h;
+				} while (next > start);
+				if (next < start || i == 1)
+					continue;
+
+				tmp = m[next = start];
+				do {
+					i = (next % h) * w + next / h;
+					m[next] = (i == start) ? tmp : m[i];
+					next = i;
+				} while (next > start);
+			}
+		}
+	} // Protected
+
+	template < class _Field, class _Rep >
+	template<bool _IP>
+	void BlasMatrix< _Field, _Rep >::transpose()
+	{
+		size_t r = this->rowdim() ;
+		size_t c = this->coldim() ;
+
+		if ( r == c) {
+			for (size_t i = 0 ; i < r ; ++i)
+				for (size_t j = i+1 ; j < c ; ++j)
+					std::swap(this->refEntry(i,j),this->refEntry(j,i));
+		}
+		else {
+			if (!_IP) {
+				BlasMatrix< _Field, _Rep > MM(*this);
+				std::swap(_row,_col);
+				// iterating row first seems faster.
+#ifdef _BLOCKIT
+				size_t B ;
+				B =  1024;
+
+				for (size_t bi = 0 ; bi < r/B ; ++bi) {
+					for (size_t bj = 0 ; bj < c/B ; ++bj){
+						for (size_t i = 0 ; i < B ; ++i)
+							for (size_t j = 0 ; j < B ; ++j)
+								this->setEntry(bj*B+j,bi*B+i,
+									       MM.getEntry(bi*B+i,bj*B+j));
+					}
+				}
+				for (size_t i = r/B*B ; i < r ; ++i)
+					for (size_t j = c/B*B ; j < c ; ++j)
+						this->setEntry(j,i,
+							       MM.getEntry(i,j));
+#else
+				for (size_t i = 0 ; i < r ; ++i)
+					for (size_t j = 0 ; j < c ; ++j)
+						this->setEntry(j,i,
+							       MM.getEntry(i,j));
+#endif
+
+			}
+			else {
+				Protected::transposeIP<Element>(_ptr,_row,_col);
+				std::swap(_row,_col);
+			}
+		}
+	}
+
+	template < class _Field, class _Rep >
+	void BlasMatrix< _Field, _Rep >::transpose()
+	{
+		this->transpose<false>();
+	}
+
+	template < class _Field, class _Rep >
+	void BlasMatrix< _Field, _Rep >::reverseRows()
+	{
+		size_t r = this->rowdim()/2 ;
+		for (size_t i = 0 ; i <  r ; ++i) {
+			_VD.swap( this->rowBegin()+i,
+				  this->rowBegin()+(r-1-i) );
+		}
+
+	}
+
+	template < class _Field, class _Rep >
+	void BlasMatrix< _Field, _Rep >::reverseCols()
+	{
+		size_t r = this->rowdim() ;
+		size_t c = this->coldim()/2 ;
+		for (size_t j = 0 ; j < c ; ++j) {
+			for (size_t i = 0 ; i < r ; ++i) {
+				std::swap(this->refEntry(i,j),
+					  this->refEntry(i,c-j-1));
+
+			}
+		}
+	}
+
+	template < class _Field, class _Rep >
+	void BlasMatrix< _Field, _Rep >::reverse()
+	{
+		size_t r = this->rowdim() ;
+		size_t c = this->coldim() ;
+		for (size_t j = 0 ; j < c ; ++j) {
+			for (size_t i = 0 ; i < r ; ++i) {
+				std::swap(this->refEntry(i,j),
+					  this->refEntry(r-i-1,c-j-1));
+
+			}
+		}
+	}
+} // LinBox
+
+///////////////////
+//   ITERATORS   //
+///////////////////
+
+namespace LinBox
+{
+
+	template < class _Field, class _Rep >
+	class BlasMatrix< _Field, _Rep >::ConstRowIterator {
+	public:
+		ConstRowIterator (const typename Rep::const_iterator& p, size_t len, size_t d) :
+			_row (p, p + (ptrdiff_t)len), _dis (d)
+		{}
+
+		ConstRowIterator () {}
+
+		ConstRowIterator (const ConstRowIterator& colp) :
+			_row (colp._row), _dis (colp._dis)
+		{}
+
+		ConstRowIterator& operator = (const ConstRowIterator& colp)
+		{
+			_row = colp._row;
+			_dis = colp._dis;
+			return *this;
+		}
+
+		ConstRowIterator& operator --()
+		{
+			_row = ConstRow (_row.begin () - (ptrdiff_t)_dis, _row.end () - (ptrdiff_t)_dis);
+			return *this;
+		}
+
+		ConstRowIterator  operator-- (int)
+		{
+			ConstRowIterator tmp (*this);
+			--*this;
+			return tmp;
+		}
+
+
+		ConstRowIterator& operator++ ()
+		{
+			_row = ConstRow (_row.begin () + (ptrdiff_t)_dis, _row.end () + (ptrdiff_t) _dis);
+			return *this;
+		}
+
+		ConstRowIterator  operator++ (int)
+		{
+			ConstRowIterator tmp (*this);
+			++*this;
+			return tmp;
+		}
+
+		ConstRowIterator operator+ (int i)
+		{
+			return ConstRowIterator (_row.begin () + (ptrdiff_t)((int)_dis * i), _row.size (), _dis);
+		}
+
+		ConstRowIterator& operator += (int i)
+		{
+			_row = ConstRow (_row.begin () + (ptrdiff_t)((int)_dis * i), _row.end () + (ptrdiff_t)((int)_dis * i));
+			return *this;
+		}
+
+		ConstRow operator[] (int i) const
+		{
+			return ConstRow (_row.begin () + (ptrdiff_t)((int)_dis * i), _row.end () + (ptrdiff_t)((int)_dis * i));
+		}
+
+		ConstRow* operator-> ()
+		{
+			return &_row;
+		}
+
+		ConstRow& operator* ()
+		{
+			return _row;
+		}
+
+		bool operator!= (const ConstRowIterator& c) const
+		{
+			return (_row.begin () != c._row.begin ()) || (_row.end () != c._row.end ()) || (_dis != c._dis);
+		}
+
+	private:
+		ConstRow _row;
+		size_t _dis;
+	};
+
+	template < class _Field, class _Rep >
+	class BlasMatrix< _Field, _Rep >::RowIterator {
+	public:
+		RowIterator (const typename Rep::iterator& p, size_t len, size_t d) :
+			_row (p, p + (ptrdiff_t)len), _dis (d)
+		{}
+
+		RowIterator () {}
+
+		RowIterator (const RowIterator& colp) :
+			_row (colp._row), _dis (colp._dis)
+		{}
+
+		RowIterator& operator = (const RowIterator& colp)
+		{
+			_row = colp._row;
+			_dis = colp._dis;
+			return *this;
+		}
+
+		RowIterator& operator ++ ()
+		{
+			_row = Row (_row.begin () + (ptrdiff_t)_dis, _row.end () + (ptrdiff_t)_dis);
+			return *this;
+		}
+
+		RowIterator  operator ++ (int)
+		{
+			RowIterator tmp (*this);
+			++*this;
+			return tmp;
+		}
+
+		RowIterator& operator -- ()
+		{
+			_row = Row (_row.begin () - (ptrdiff_t)_dis, _row.end () - (ptrdiff_t)_dis);
+			return *this;
+		}
+
+		RowIterator  operator -- (int)
+		{
+			RowIterator tmp (*this);
+			--*this;
+			return tmp;
+		}
+
+		RowIterator operator + (int i)
+		{
+			return RowIterator (_row.begin () + (ptrdiff_t)((int)_dis * i), _row.size (), _dis);
+		}
+
+		RowIterator& operator += (int i)
+		{
+			_row = Row (_row.begin () + (ptrdiff_t)((int)_dis * i), _row.end () + (ptrdiff_t)((int)_dis * i));
+			return *this;
+		}
+
+		Row operator[] (int i) const
+		{
+			return Row (const_cast<Row&> (_row).begin () + (ptrdiff_t)((int)_dis * i),
+				    const_cast<Row&> (_row).end () + (ptrdiff_t)((int)_dis * i));
+		}
+
+		Row* operator-> ()
+		{
+			return &(this->_row);
+		}
+
+		Row& operator* ()
+		{
+			return _row;
+		}
+
+		bool operator!= (const RowIterator& c) const
+		{
+			return (_row.begin () != c._row.begin ()) || (_row.end () != c._row.end ()) || (_dis != c._dis);
+		}
+
+		operator ConstRowIterator ()
+		{
+			return ConstRowIterator (_row.begin (), _row.size (), _dis);
+		}
+
+	private:
+		Row _row;
+		size_t _dis;
+	};
+
+	template < class _Field, class _Rep >
+	class BlasMatrix< _Field, _Rep >::ConstColIterator {
+	public:
+		ConstColIterator (typename Rep::const_iterator p, size_t stride, size_t len) :
+			_col (Subiterator<typename Rep::const_iterator> (p, (ptrdiff_t)stride),
+			      Subiterator<typename Rep::const_iterator> (p + (ptrdiff_t)(len * stride), (ptrdiff_t)stride)),
+			_stride (stride)
+		{}
+
+		ConstColIterator (const ConstCol& col, size_t stride) :
+			_col (col),
+			_stride (stride)
+		{}
+
+		ConstColIterator () {}
+
+		ConstColIterator (const ConstColIterator& rowp) :
+			_col (rowp._col)
+		{}
+
+		ConstColIterator& operator= (const ConstColIterator& rowp)
+		{
+			_col = rowp._col;
+			_stride = rowp._stride;
+			return *this;
+		}
+
+		ConstColIterator& operator++ ()
+		{
+			_col = ConstCol (Subiterator<typename Rep::const_iterator> (_col.begin ().operator-> () + 1, (ptrdiff_t)_stride),
+					 Subiterator<typename Rep::const_iterator> (_col.end ().operator-> () + 1, (ptrdiff_t)_stride));
+			return *this;
+		}
+
+		ConstColIterator  operator++ (int)
+		{
+			ConstColIterator old(*this);
+			this->operator++ ();
+			return old;
+		}
+
+		ConstColIterator operator + (int i)
+		{
+			return ConstColIterator (_col.begin ().operator-> () + i, _stride, _col.size ());
+		}
+
+		ConstColIterator& operator += (int i)
+		{
+			_col = ConstCol (Subiterator<typename Rep::const_iterator> (_col.begin ().operator-> () + i, _stride),
+					 Subiterator<typename Rep::const_iterator> (_col.end ().operator-> () + i, _stride));
+			return *this;
+		}
+
+		ConstCol operator[] (int i) const
+		{
+			return ConstCol (Subiterator<typename Rep::const_iterator> (_col.begin ().operator-> () + i, _stride),
+					 Subiterator<typename Rep::const_iterator> (_col.end ().operator-> () + i, _stride));
+		}
+
+		ConstCol* operator-> ()
+		{
+			return &_col;
+		}
+
+		ConstCol& operator* ()
+		{
+			return _col;
+		}
+
+		bool operator!= (const ConstColIterator& c) const
+		{
+			return (_col.begin () != c._col.begin ()) || (_col.end () != c._col.end ());
+		}
+
+	private:
+		ConstCol _col;
+		size_t _stride;
+	};
+
+	template < class _Field, class _Rep >
+	class BlasMatrix< _Field, _Rep >::ColIterator {
+	public:
+		ColIterator (typename Rep::iterator p, size_t stride, size_t len) :
+			_col (Subiterator<typename Rep::iterator> (p, (long)stride),
+			      Subiterator<typename Rep::iterator> (p + (ptrdiff_t)(len * stride),(long) stride)), _stride (stride)
+		{}
+
+		ColIterator () {}
+
+		ColIterator (const ColIterator& rowp) :
+			_col (rowp._col)
+		{}
+
+		ColIterator& operator= (const ColIterator& rowp)
+		{
+			_col = rowp._col;
+			_stride = rowp._stride;
+			return *this;
+		}
+
+		const ColIterator& operator= (const ColIterator& rowp) const
+		{
+			const_cast<ColIterator*> (this)->_col = rowp._col;
+			return *this;
+		}
+
+		ColIterator& operator++ ()
+		{
+			_col = Col (Subiterator<typename Rep::iterator> (_col.begin ().operator-> () + 1, (const long)_stride),
+				    Subiterator<typename Rep::iterator> (_col.end ().operator-> () + 1,(const long) _stride));
+			return *this;
+		}
+
+		ColIterator  operator++ (int)
+		{
+			Col tmp (_col);
+			this->operator++ ();
+			return tmp;
+		}
+
+		ColIterator operator + (int i)
+		{
+			return ColIterator (_col.begin ().operator-> () + i, _stride, _col.size ());
+		}
+
+		ColIterator& operator += (int i)
+		{
+			_col = Col (Subiterator<typename Rep::iterator> (_col.begin ().operator-> () + i, _stride),
+				    Subiterator<typename Rep::iterator> (_col.end ().operator-> () + i, _stride));
+			return *this;
+		}
+
+		Col operator[] (int i) const
+		{
+			return Col (Subiterator<typename Rep::iterator> (const_cast<Col&> (_col).begin ().operator-> () + i, _stride),
+				    Subiterator<typename Rep::iterator> (const_cast<Col&> (_col).end ().operator-> () + i, _stride));
+		}
+
+		Col* operator-> ()
+		{
+			return &(this->_col);
+		}
+
+		Col& operator* ()
+		{
+			return _col;
+		}
+
+		bool operator!= (const ColIterator& c) const
+		{
+			return (_col.begin () != c._col.begin ()) || (_col.end () != c._col.end ());
+		}
+
+		operator ConstColIterator ()
+		{
+			return ConstColIterator (reinterpret_cast<ConstCol&> (_col) , _stride);
+		}
+
+	private:
+
+		Col _col;
+		size_t _stride;
+	};
+
+	/*!   Indexed Iterator.
+	 * @ingroup iterators
+	 * @brief NO DOC
+	 */
+	template < class _Field, class _Rep >
+	class BlasMatrix< _Field, _Rep >::IndexedIterator {
+		size_t _r_index;
+		size_t _c_index;
+		size_t _dim;
+		typename Rep::iterator _begin;
+		typedef typename _Field::Element value_type;
+
+	public:
+		IndexedIterator (const size_t  &dim,
+				 const size_t  &r_index,
+				 const size_t  &c_index,
+				 const typename Rep::iterator &begin) :
+			_r_index (r_index), _c_index (c_index), _dim (dim), _begin (begin)
+		{}
+
+		IndexedIterator () :
+			_r_index (0), _c_index (0), _dim (1), _begin (0)
+		{}
+
+		IndexedIterator (const IndexedIterator& r) :
+			_r_index (r._r_index), _c_index (r._c_index), _dim (r._dim), _begin (r._begin)
+		{}
+
+		IndexedIterator& operator = (const IndexedIterator &iter)
+		{
+			_r_index = iter._r_index;
+			_c_index = iter._c_index;
+			_dim = iter._dim;
+			_begin = iter._begin;
+			return *this;
+		}
+
+		bool operator == (const IndexedIterator &iter) const
+		{
+			return (_r_index == iter._r_index) &&
+			(_c_index == iter._c_index) &&
+			(_dim == iter._dim) &&
+			(_begin==iter._begin);
+		}
+
+		bool operator != (const IndexedIterator& iter) const
+		{
+			return (_r_index != iter._r_index) ||
+			(_c_index != iter._c_index) ||
+			(_dim != iter._dim) ||
+			(_begin!=iter._begin);
+		}
+
+		IndexedIterator &operator ++ ()
+		{
+			++_c_index;
+
+			if (_c_index == _dim) {
+				_c_index = 0;
+				++_r_index;
+			}
+
+			return *this;
+		}
+
+
+		IndexedIterator operator ++ (int)
+		{
+			IndexedIterator tmp = *this;
+			++(*this);
+			return tmp;
+		}
+
+		IndexedIterator &operator -- ()
+		{
+			if (_c_index)
+				--_c_index;
+			else {
+				--_r_index;
+				_c_index = _dim - 1;
+			}
+
+			return *this;
+		}
+
+
+		IndexedIterator operator -- (int)
+		{
+			IndexedIterator tmp = *this;
+			--(*this);
+			return tmp;
+		}
+
+		value_type &operator * () const
+		{
+			return *(_begin +(ptrdiff_t) (_r_index * _dim + _c_index));
+		}
+
+
+		value_type * operator -> () const
+		{
+			return _begin + (ptrdiff_t)(_r_index * _dim + _c_index);
+		}
+
+
+		size_t rowIndex () const
+		{
+			return _r_index;
+		}
+
+		size_t colIndex () const
+		{
+			return _c_index;
+		}
+
+		const value_type &value () const
+		{
+			return *(_begin + (ptrdiff_t)(_r_index * _dim + _c_index));
+		}
+
+
+	};
+
+	template < class _Field, class _Rep >
+	class BlasMatrix< _Field, _Rep >::ConstIndexedIterator {
+		size_t _r_index;
+		size_t _c_index;
+		size_t _dim;
+		typedef typename _Field::Element value_type;
+		typename Rep::const_iterator _begin;
+
+	public:
+		ConstIndexedIterator (const size_t  &my_dim,
+				      const size_t  &r_index,
+				      const size_t  &c_index,
+				      const typename Rep::const_iterator &begin) :
+			_r_index (r_index), _c_index (c_index), _dim (my_dim), _begin (begin)
+		{}
+
+		ConstIndexedIterator () :
+			_r_index (0), _c_index (0), _dim (1), _begin (0)
+		{}
+
+		ConstIndexedIterator (const ConstIndexedIterator& r) :
+			_r_index (r._r_index), _c_index (r._c_index), _dim (r._dim), _begin (r._begin)
+		{}
+
+		ConstIndexedIterator& operator = (const ConstIndexedIterator &iter)
+		{
+			_r_index = iter._r_index;
+			_c_index = iter._c_index;
+			_dim = iter._dim;
+			_begin = iter._begin;
+			return *this;
+		}
+
+		bool operator == (const ConstIndexedIterator &iter) const
+		{
+			return (_r_index == iter._r_index) &&
+			(_c_index == iter._c_index) &&
+			(_dim == iter._dim) &&
+			(_begin==iter._begin);
+		}
+
+		bool operator != (const ConstIndexedIterator& iter) const
+		{
+			return (_r_index != iter._r_index) ||
+			(_c_index != iter._c_index) ||
+			(_dim != iter._dim) ||
+			(_begin!=iter._begin);
+		}
+
+		ConstIndexedIterator &operator ++ ()
+		{
+			++_c_index;
+
+			if (_c_index == _dim) {
+				_c_index = 0;
+				++_r_index;
+			}
+
+			return *this;
+		}
+
+
+		ConstIndexedIterator operator ++ (int)
+		{
+			ConstIndexedIterator tmp = *this;
+			++(*this);
+			return tmp;
+		}
+
+		ConstIndexedIterator &operator -- ()
+		{
+			if (_c_index)
+				--_c_index;
+			else {
+				--_r_index;
+				_c_index = _dim - 1;
+			}
+
+			return *this;
+		}
+
+		ConstIndexedIterator operator -- (int)
+		{
+			ConstIndexedIterator tmp = *this;
+			--(*this);
+			return tmp;
+		}
+
+		const value_type &operator * () const
+		{
+			return *(_begin + (ptrdiff_t)(_r_index * _dim + _c_index));
+		}
+
+		const value_type *operator -> () const
+		{
+			return _begin + (ptrdiff_t)(_r_index * _dim + _c_index);
+		}
+
+		size_t rowIndex () const
+		{
+			return _r_index;
+		}
+
+		size_t colIndex () const
+		{
+			return _c_index;
+		}
+
+		const value_type &value() const
+		{
+			return *(_begin + (ptrdiff_t)(_r_index * _dim + _c_index));
+		}
+	};
+
+	/*   */
+
+	// Entry access  view.  Size m*n vector in C (row major) order.
+	template < class _Field, class _Rep >
+	typename BlasMatrix< _Field, _Rep >::Iterator BlasMatrix< _Field, _Rep >::Begin ()
+	{
+		return _rep.begin ();
+	}
+
+	template < class _Field, class _Rep >
+	typename BlasMatrix< _Field, _Rep >::Iterator BlasMatrix< _Field, _Rep >::End ()
+	{
+		return _rep.end ();
+	}
+
+	template < class _Field, class _Rep >
+	typename BlasMatrix< _Field, _Rep >::ConstIterator BlasMatrix< _Field, _Rep >::Begin () const
+	{
+		return _rep.begin ();
+	}
+
+	template < class _Field, class _Rep >
+	typename BlasMatrix< _Field, _Rep >::ConstIterator BlasMatrix< _Field, _Rep >::End () const
+	{
+		return _rep.end ();
+	}
+
+	/*   Indexed  */
+
+	template < class _Field, class _Rep >
+	typename BlasMatrix< _Field, _Rep >::IndexedIterator BlasMatrix< _Field, _Rep >::IndexedBegin ()
+	{
+		return IndexedIterator (coldim (), 0, 0, _rep.begin ());
+	}
+
+	template < class _Field, class _Rep >
+	typename BlasMatrix< _Field, _Rep >::IndexedIterator BlasMatrix< _Field, _Rep >::IndexedEnd ()
+	{
+		return IndexedIterator (coldim (), rowdim (), 0, _rep.begin ());
+	}
+
+	template < class _Field, class _Rep >
+	typename BlasMatrix< _Field, _Rep >::ConstIndexedIterator BlasMatrix< _Field, _Rep >::IndexedBegin () const
+	{
+		return ConstIndexedIterator (coldim (), 0, 0, _rep.begin ());
+	}
+
+	template < class _Field, class _Rep >
+	typename BlasMatrix< _Field, _Rep >::ConstIndexedIterator BlasMatrix< _Field, _Rep >::IndexedEnd () const
+	{
+		return ConstIndexedIterator (coldim (), rowdim (), 0, _rep.begin ());
+	}
+
+	/*  Row  */
+
+	template < class _Field, class _Rep >
+	typename BlasMatrix< _Field, _Rep >::RowIterator BlasMatrix< _Field, _Rep >::rowBegin ()
+	{
+		return RowIterator (_rep.begin (), _col, _col);
+	}
+
+	template < class _Field, class _Rep >
+	typename BlasMatrix< _Field, _Rep >::RowIterator BlasMatrix< _Field, _Rep >::rowEnd ()
+	{
+		return RowIterator (_rep.end (), _col, _col);
+	}
+
+	template < class _Field, class _Rep >
+	typename BlasMatrix< _Field, _Rep >::ConstRowIterator BlasMatrix< _Field, _Rep >::rowBegin () const
+	{
+		return ConstRowIterator (_rep.begin (), _col, _col);
+	}
+
+	template < class _Field, class _Rep >
+	typename BlasMatrix< _Field, _Rep >::ConstRowIterator BlasMatrix< _Field, _Rep >::rowEnd () const
+	{
+		return ConstRowIterator (_rep.end (), _col, _col);
+	}
+
+	/*  Col */
+
+	template < class _Field, class _Rep >
+	typename BlasMatrix< _Field, _Rep >::ColIterator BlasMatrix< _Field, _Rep >::colBegin ()
+	{
+		return  typename BlasMatrix< _Field, _Rep >::ColIterator (_rep.begin (), _col, _row);
+	}
+
+	template < class _Field, class _Rep >
+	typename BlasMatrix< _Field, _Rep >::ColIterator BlasMatrix< _Field, _Rep >::colEnd ()
+	{
+		return  typename BlasMatrix< _Field, _Rep >::ColIterator (_rep.begin ()+(ptrdiff_t)_col, _col, _row);
+	}
+
+	template < class _Field, class _Rep >
+	typename BlasMatrix< _Field, _Rep >::ConstColIterator BlasMatrix< _Field, _Rep >::colBegin () const
+	{
+		return  typename BlasMatrix< _Field, _Rep >::ConstColIterator (_rep.begin (), _col, _row);
+	}
+
+	template < class _Field, class _Rep >
+	typename BlasMatrix< _Field, _Rep >::ConstColIterator BlasMatrix< _Field, _Rep >::colEnd () const
+	{
+		return  typename BlasMatrix< _Field, _Rep >::ConstColIterator (_rep.begin ()+(ptrdiff_t)_col, _col, _row);
+	}
+
+	/*  operators */
+	template < class _Field, class _Rep >
+	typename BlasMatrix< _Field, _Rep >::Row BlasMatrix< _Field, _Rep >::operator[] (size_t i)
+	{
+		return Row (_rep.begin () +(ptrdiff_t)( i * _col), _rep.begin () + (ptrdiff_t)(i * _col +_col));
+	}
+
+	template < class _Field, class _Rep >
+	typename BlasMatrix< _Field, _Rep >::ConstRow BlasMatrix< _Field, _Rep >::operator[] (size_t i) const
+	{
+		return Row (_rep.begin () +(ptrdiff_t) (i * _col), _rep.begin () + (ptrdiff_t)( i * _col + _col));
+	}
+
+} // LinBox
+
+//////////////////
+//     MISC     //
+//////////////////
+
+namespace LinBox
+{
+	template < class _Field, class _Rep >
+	template <class Vector>
+	Vector& BlasMatrix< _Field, _Rep >::columnDensity (Vector &v) const
+	{
+		std::fill (v.begin (), v.end (), _row);
+		return v;
+	}
+
+} // LinBox
+
+///////////////////
+//   BLACK BOX   //
+///////////////////
+
+namespace LinBox
+{
+#if 1
+	template < class _Field, class _Rep >
+	template <class Vector1, class Vector2>
+	Vector1&  BlasMatrix< _Field, _Rep >::apply (Vector1& y, const Vector2& x) const
+	{
+		// std::cout << "prepare apply1 Matrix" << std::endl;
+		BlasSubmatrix<constSelf_t> A(*this);
+		// std::cout << "...................." << std::endl;
+		A.apply(y,x);
+		// std::cout << ".......done........." << std::endl;
+		return y;
+	}
+#endif
+
+#if 1
+	template < class _Field, class _Rep >
+	template<class _Vrep>
+	BlasVector<_Field,_Vrep>&  BlasMatrix< _Field, _Rep >::apply (BlasVector<_Field,_Vrep>& y, const BlasVector<_Field,_Vrep>& x) const
+	{
+		// std::cout << "prepare apply2 Matrix" << std::endl;
+		BlasSubmatrix<constSelf_t> A(*this);
+		// std::cout << "...................." << std::endl;
+		A.apply(y,x);
+		// std::cout << ".......done........." << std::endl;
+
+		return y;
+	}
+#endif
+
+	template < class _Field, class _Rep >
+	template <class Vector1, class Vector2>
+	Vector1&  BlasMatrix< _Field, _Rep >::applyTranspose (Vector1& y, const Vector2& x) const
+	{
+		// std::cout << "prepare applyT Matrix" << std::endl;
+		BlasSubmatrix<constSelf_t> A(*this);
+		// std::cout << "...................." << std::endl;
+		A.applyTranspose(y,x);
+		// std::cout << ".......done........." << std::endl;
+
+		return y;
+	}
+
+	template < class _Field, class _Rep >
+	const _Field& BlasMatrix< _Field, _Rep >::field() const
+	{
+		return *_field;
+	}
+
+#if 0 /* why not ? */
+	template < class _Field, class _Rep >
+	_Field& BlasMatrix< _Field, _Rep >::field()
+	{
+		return const_cast<_Field&>(_field );
+	}
+#endif
+}
+
+
+#endif // __LINBOX_densematrix_blas_matrix_INL
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/densematrix/blas-submatrix.inl b/linbox/matrix/densematrix/blas-submatrix.inl
new file mode 100644
index 0000000..aa5234a
--- /dev/null
+++ b/linbox/matrix/densematrix/blas-submatrix.inl
@@ -0,0 +1,1239 @@
+/*
+ * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
+ *               2013, 2014 the LinBox group
+ *
+ * Written by :
+ *               Pascal Giorgi  <pascal.giorgi at ens-lyon.fr>
+ *               Clément Pernet <clement.pernet at imag.fr>
+ *               Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*!@internal
+ * @file matrix/densematrix/blas-matrix.inl
+ * @ingroup densematrix
+ * A \c BlasMatrix<\c _Field > represents a matrix as an array of
+ * <code>_Field</code>s.
+ */
+
+#ifndef __LINBOX_densematrix_blas_submatrix_INL
+#define __LINBOX_densematrix_blas_submatrix_INL
+
+/////////////////
+//   PRIVATE   //
+/////////////////
+
+namespace LinBox
+{
+}
+
+//////////////////
+// CONSTRUCTORS //
+//////////////////
+
+namespace LinBox
+{
+#if 0
+	template < class _Matrix >
+	BlasSubmatrix<_Matrix>::BlasSubmatrix () :
+			_Mat(NULL),_row(0),_col(0),_r0(0),_c0(0),_stride(0),_off(0)
+		{
+		}
+#endif
+
+	template < class _Matrix >
+	BlasSubmatrix<_Matrix>::BlasSubmatrix (typename BlasSubmatrix<_Matrix>::matrixType &Mat,
+						size_t row,
+						size_t col,
+						size_t Rowdim,
+						size_t Coldim) :
+		_Mat (Mat),
+		_row (Rowdim), _col(Coldim),
+		_r0(row),_c0(col),
+		_stride(Mat.coldim()),_off(row*_stride+col)
+		,_AD(Mat.field())
+		,_VD(Mat.field())
+	{
+		// std::cout << "sub cstor 0 called" << std::endl;
+		linbox_check ( _r0  <= Mat.rowdim() ); // allow for NULL matrix
+		linbox_check ( _c0  <= Mat.coldim() );
+		// linbox_check ( _row <= Mat.rowdim() );
+		linbox_check ( _off <= Mat.rowdim()*Mat.coldim() );
+		linbox_check ( _col <= Mat.coldim() );
+	}
+
+	template < class _Matrix >
+	BlasSubmatrix<_Matrix>::BlasSubmatrix (typename BlasSubmatrix<_Matrix>::constMatrixType &Mat,
+						size_t row,
+						size_t col,
+						size_t Rowdim,
+						size_t Coldim) :
+		_Mat (Mat),
+		_row (Rowdim), _col(Coldim),
+		_r0(row),_c0(col),
+		_stride(Mat.coldim()),_off(row*_stride+col)
+		,_AD(Mat.field())
+		,_VD(Mat.field())
+	{
+		// std::cout << "sub const cstor 0 called" << std::endl;
+		linbox_check ( _r0  <= Mat.rowdim() ); // allow for NULL matrix
+		linbox_check ( _c0  <= Mat.coldim() );
+		// linbox_check ( _row <= Mat.rowdim() );
+		linbox_check ( _off <= Mat.rowdim()*Mat.coldim() );
+		linbox_check ( _col <= Mat.coldim() );
+	}
+
+
+	template < class _Matrix >
+	BlasSubmatrix<_Matrix>::BlasSubmatrix (typename BlasSubmatrix<_Matrix>::matrixType &Mat) :
+		_Mat (Mat),
+		_row(Mat.rowdim()), _col(Mat.coldim()),
+		_r0(0), _c0(0),
+		_stride(Mat.coldim()),_off(0)
+		,_AD(Mat.field())
+		,_VD(Mat.field())
+	{
+		// std::cout << "sub cstor 2 called" << std::endl;
+	}
+
+	template < class _Matrix >
+	BlasSubmatrix<_Matrix>::BlasSubmatrix (typename BlasSubmatrix<_Matrix>::constMatrixType &Mat) :
+		_Mat (Mat),
+		_row(Mat.rowdim()), _col(Mat.coldim()),
+		_r0(0), _c0(0),
+		_stride(Mat.coldim()),_off(0)
+		,_AD(Mat.field())
+		,_VD(Mat.field())
+	{
+		// std::cout << "sub const cstor 2 called" << std::endl;
+	}
+
+	template < class _Matrix >
+	BlasSubmatrix<_Matrix>::BlasSubmatrix (typename BlasSubmatrix<_Matrix>::constSubMatrixType &SM,
+						size_t row,
+						size_t col,
+						size_t Rowdim,
+						size_t Coldim) :
+		_Mat (SM._Mat),
+		_row ( Rowdim ),      _col ( Coldim ) ,
+		_r0  ( SM._r0 + row ), _c0 ( SM._c0 + col ),
+		_stride(SM._stride),_off(SM._off+(row*_stride+col))
+		,_AD(SM.field())
+		,_VD(SM.field())
+	{
+		// std::cout << "sub const cstor 3 called" << std::endl;
+		linbox_check ( _r0  <= SM._Mat.rowdim() ); // allow for NULL matrix
+		linbox_check ( _c0  <= SM._stride );
+		linbox_check ( _row <= SM._Mat.rowdim() );
+		linbox_check ( _col <= SM._stride );
+		linbox_check ( _off <= SM._Mat.rowdim()*(SM._Mat.coldim()+1) );
+	}
+
+
+	template < class _Matrix >
+	BlasSubmatrix<_Matrix>::BlasSubmatrix (typename BlasSubmatrix<_Matrix>::subMatrixType &SM,
+						size_t row,
+						size_t col,
+						size_t Rowdim,
+						size_t Coldim) :
+		_Mat (SM._Mat),
+		_row ( Rowdim ),      _col ( Coldim ) ,
+		_r0  ( SM._r0 + row ), _c0 ( SM._c0 + col ),
+		_stride(SM._stride),_off(SM._off+(row*_stride+col))
+		,_AD(SM.field())
+		,_VD(SM.field())
+	{
+		// std::cout << "sub cstor 3 called" << std::endl;
+		linbox_check ( _r0  <= SM._Mat.rowdim() ); // allow for NULL matrix
+		linbox_check ( _c0  <= SM._stride );
+		linbox_check ( _row <= SM._Mat.rowdim() );
+		linbox_check ( _col <= SM._stride );
+		linbox_check ( _off <= SM._Mat.rowdim()*(SM._Mat.coldim()+1) );
+	}
+
+	template < class _Matrix >
+	BlasSubmatrix<_Matrix>::BlasSubmatrix (typename BlasSubmatrix<_Matrix>::subMatrixType &SM) :
+		_Mat (SM._Mat),
+		_row ( SM._row ),  _col ( SM._col ) ,
+		_r0  ( SM._r0 ),    _c0 (SM._c0 ),
+		_stride(SM._stride),_off(SM._off)
+		,_AD(SM.field())
+		,_VD(SM.field())
+	{
+		// std::cout << "sub cstor 4 called" << std::endl;
+		linbox_check ( _r0  <=  SM._Mat.rowdim() ); // allow for NULL matrix
+		linbox_check ( _c0  <=  SM._stride );
+		linbox_check ( _row <= SM._Mat.rowdim() );
+		linbox_check ( _col <= SM._stride );
+		linbox_check ( _off <= SM._Mat.rowdim()*(SM._Mat.coldim()+1) );
+	}
+
+	template < class _Matrix >
+	BlasSubmatrix<_Matrix>::BlasSubmatrix (typename BlasSubmatrix<_Matrix>::constSubMatrixType &SM) :
+		_Mat (SM._Mat),
+		_row ( SM._row ),  _col ( SM._col ) ,
+		_r0  ( SM._r0 ),    _c0 (SM._c0 ),
+		_stride(SM._stride),_off(SM._off)
+		,_AD(SM.field())
+		,_VD(SM.field())
+	{
+		// std::cout << "sub const cstor 4 called" << std::endl;
+		linbox_check ( _r0  <=  SM._Mat.rowdim() ); // allow for NULL matrix
+		linbox_check ( _c0  <=  SM._stride );
+		linbox_check ( _row <= SM._Mat.rowdim() );
+		linbox_check ( _col <= SM._stride );
+		linbox_check ( _off <= SM._Mat.rowdim()*(SM._Mat.coldim()+1) );
+	}
+
+	// shallow copy
+	template < class _Matrix >
+	BlasSubmatrix<_Matrix>& BlasSubmatrix<_Matrix>::operator=(const BlasSubmatrix<_Matrix> &SM)
+	{
+		if ( &SM == this)
+			return *this ;
+
+		_Mat   = SM._Mat  ;
+		_r0  = SM._r0 ;
+		_row = SM._row;
+		_c0  = SM._c0 ;
+		_col = SM._col;
+		_stride = SM._stride;
+		_off = SM._off ;
+		_AD  = SM._AD ;
+		_VD  = SM._VD ;
+
+		return *this;
+	}
+
+	// function for repurposing Submatrices.
+	template < class _Matrix >
+	BlasSubmatrix<_Matrix>& BlasSubmatrix<_Matrix>::submatrix(typename BlasSubmatrix<_Matrix>::constSelf_t &SM,
+			size_t row, size_t col, size_t Rowdim, size_t Coldim)
+	{
+		_Mat   = SM._Mat;
+		_row = Rowdim; _col = Coldim;
+		_r0  = SM._r0 + row; _c0 = SM._c0 + col;
+		_stride = SM._stride; _off = SM._off+(row*_stride+col);
+		_AD = SM._AD;
+		_VD = SM._VD;
+
+		return *this;
+	}
+
+	// deep copy
+	template < class _Matrix >
+	template<class Matrix>
+	BlasSubmatrix<_Matrix>& BlasSubmatrix<_Matrix>::copy( const Matrix & B)
+	{
+		for (size_t i = 0 ; i < rowdim() ; ++i)
+		for (size_t j = 0 ; j < coldim() ; ++j) {
+			setEntry(i,j,B.getEntry(i,j));
+		}
+		return *this;
+	}
+
+	template < class _Matrix >
+	BlasSubmatrix<_Matrix> &BlasSubmatrix<_Matrix>::swap( typename BlasSubmatrix<_Matrix>::Self_t & B)
+	{
+		Element temp; _Mat.field().init(temp);
+		Element hold; _Mat.field().init(hold);
+		for (size_t i = 0 ; i < rowdim() ; ++i)
+		for (size_t j = 0 ; j < coldim() ; ++j) {
+			getEntry(hold,i,j);
+			setEntry(i,j,B.getEntry(temp,i,j));
+			B.setEntry(i,j,hold);
+		}
+		return *this;
+	}
+
+	template < class _Matrix >
+	BlasSubmatrix<_Matrix> &BlasSubmatrix<_Matrix>::zero()
+	{
+		for (size_t i = 0 ; i < rowdim() ; ++i)
+		for (size_t j = 0 ; j < coldim() ; ++j) {
+			setEntry(i,j,_Mat.field().zero);
+		}
+		return *this;
+	}
+
+	template < class _Matrix >
+	void BlasSubmatrix<_Matrix>::random()
+	{
+		typename Field::RandIter r(_Mat.field());
+		Element temp; _Mat.field().init(temp);
+		for (size_t i = 0 ; i < rowdim() ; ++i)
+			for (size_t j = 0 ; j < coldim() ; ++j) {
+				setEntry(i,j,r.random(temp));
+		}
+		return ;
+	}
+
+} // LinBox
+
+
+//////////////////
+//  DIMENSIONS  //
+//////////////////
+
+namespace LinBox
+{
+
+	template < class _Matrix >
+	size_t BlasSubmatrix<_Matrix>::rowdim() const
+	{
+		return _row ;
+	}
+
+	template < class _Matrix >
+	size_t BlasSubmatrix<_Matrix>::coldim() const
+	{
+		return _col ;
+	}
+
+	template < class _Matrix >
+	size_t  BlasSubmatrix<_Matrix>::getStride() const
+	{
+		return _stride;
+	}
+
+
+} // LinBox
+
+//////////////////
+//   ELEMENTS   //
+//////////////////
+
+namespace LinBox
+{
+
+
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::pointer
+	BlasSubmatrix<_Matrix>::getPointer() const
+	{
+		return _Mat.getPointer()+_off;
+	}
+
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::const_pointer &
+	BlasSubmatrix<_Matrix>::getConstPointer() const
+	{
+		return _Mat.getConstPointer()+_off;
+	}
+
+
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::pointer
+	BlasSubmatrix<_Matrix>::getWritePointer()
+	{
+		return (_Mat.getWritePointer()+_off);
+	}
+
+	template < class _Matrix >
+	void BlasSubmatrix<_Matrix>::setEntry (size_t i, size_t j, const Element &a_ij)
+	{
+		_Mat.setEntry (_r0 + i, _c0 + j, a_ij);
+	}
+
+	template < class _Matrix >
+		typename  LinBox::BlasSubmatrix<_Matrix>::Element &BlasSubmatrix<_Matrix>::refEntry (size_t i, size_t j)
+	{
+		return _Mat.refEntry ( _r0+i, _c0+j );
+	}
+
+	template < class _Matrix >
+	const typename  LinBox::BlasSubmatrix<_Matrix>::Element &BlasSubmatrix<_Matrix>::getEntry (size_t i, size_t j) const
+	{
+		return _Mat.getEntry ( _r0+i , _c0+j );
+	}
+
+	template < class _Matrix >
+typename  LinBox::BlasSubmatrix<_Matrix>::Element &BlasSubmatrix<_Matrix>::getEntry (Element &x, size_t i, size_t j) const
+	{
+		return _Mat.getEntry (x, _r0+i , _c0+j );
+	}
+
+}
+
+///////////////////
+// TRANSPOSE &AL //
+///////////////////
+
+namespace LinBox
+{
+}
+
+///////////////////
+//   ITERATORS   //
+///////////////////
+
+namespace LinBox
+{
+
+
+	/*! Raw Iterators.
+	 * @ingroup iterators
+	 *
+	 * The raw iterator is a method for accessing all entries in the matrix
+	 * in some unspecified order. This can be used, e.g. to reduce all
+	 * matrix entries modulo a prime before passing the matrix into an
+	 * algorithm.
+	 */
+	template < class _Matrix >
+	class BlasSubmatrix<_Matrix>::Iterator {
+	public:
+		Iterator (){}
+
+		/*! @internal
+		 * @brief NO DOC
+		 */
+		Iterator (const typename BlasMatrix<typename _Matrix::Field, typename _Matrix::Rep>::Iterator& cur,
+			     const size_t c_dim,
+			     const size_t stride,
+			     const size_t c_idx) :
+			_cur (cur), _c_dim (c_dim), _stride(stride), _c_idx (c_idx)
+		{}
+
+		/*! @internal
+		 * @brief copy operator.
+		 * @param r Iterator to copy.
+		 */
+		Iterator& operator = (const Iterator& r)
+		{
+			_cur    = r._cur;
+			_c_dim  = r._c_dim;
+			_stride = r._stride;
+			_c_idx  = r._c_idx;
+			return *this;
+		}
+
+		/*! @internal
+		 * increment.
+		 * ??
+		 */
+		Iterator& operator ++()
+		{
+			if (_c_idx < _c_dim - 1){
+				++_cur; ++_c_idx;
+			}
+			else {
+				_cur = _cur + _stride - _c_dim + 1;
+				_c_idx = 0;
+			}
+
+			return *this;
+		}
+
+		/*! @internal
+		 * increment.
+		 * ??
+		 */
+		Iterator& operator++ (int)
+		{
+			return this->operator++ ();
+		}
+
+
+		/*! @internal
+		 * @brief  operator !=.
+		 * @param r Iterator to test inequaltity from.
+		 */
+		bool operator != (const Iterator& r) const
+		{
+			return (_cur != r._cur || _c_dim != r._c_dim) || (_stride != r._stride) || (_c_idx != r._c_idx);
+		}
+
+		//! @internal operator *.
+		typename _Matrix::Element& operator * ()
+		{
+			return *_cur;
+		}
+
+		//! @internal operator *.
+		const typename _Matrix::Element& operator * () const
+		{
+			return *_cur;
+		}
+
+	protected:
+		typename BlasMatrix<typename _Matrix::Field,typename _Matrix::Rep>::Iterator _cur;
+		size_t _c_dim;
+		size_t _stride;
+		size_t _c_idx;
+	};
+
+	/*! Raw Iterators (const version).
+	 * @ingroup iterators
+	 * The raw iterator is a method for accessing all entries in the matrix
+	 * in some unspecified order. This can be used, e.g. to reduce all
+	 * matrix entries modulo a prime before passing the matrix into an
+	 * algorithm.
+	 */
+	template < class _Matrix >
+	class BlasSubmatrix<_Matrix>::ConstIterator {
+	public:
+		//! @internal Null constructor
+		ConstIterator (){}
+
+
+		/*! @internal
+		 * @brief NO DOC
+		 */
+		ConstIterator (const typename BlasMatrix<typename _Matrix::Field, typename _Matrix::Rep>::ConstIterator& cur,
+				  const size_t c_dim,
+				  const size_t stride,
+				  const size_t c_idx) :
+			_cur (cur), _c_dim (c_dim), _stride(stride), _c_idx (c_idx)
+		{}
+
+		/*! @internal
+		 * @brief copy operator.
+		 * @param r Iterator to copy.
+		 */
+		ConstIterator& operator = (const ConstIterator& r)
+		{
+			_cur = r._cur;
+			_c_dim = r._c_dim;
+			_stride = r._stride;
+			_c_idx = r._c_idx;
+			return *this;
+		}
+
+		/*! @internal
+		 * increment.
+		 * ??
+		 */
+		ConstIterator& operator ++()
+		{
+			if (_c_idx < _c_dim - 1){
+				++_cur; ++_c_idx;
+			}
+			else {
+				linbox_check(_stride > _c_dim);
+				_cur = _cur + (ptrdiff_t)(_stride - _c_dim + 1);
+				_c_idx = 0;
+			}
+
+			return *this;
+		}
+
+		/*! @internal
+		 * increment.
+		 * ??
+		 */
+		ConstIterator& operator++ (int)
+		{
+			return this->operator++ ();
+		}
+
+		/*! @internal
+		 * @brief  operator !=.
+		 * @param r Iterator to test inequaltity from.
+		 */
+		bool operator != (const ConstIterator& r) const
+		{
+			return (_cur != r._cur) || (_c_dim != r._c_dim) || (_stride != r._stride) || (_c_idx != r._c_idx);
+		}
+
+		//! @internal operator *.
+		const typename BlasSubmatrix<_Matrix>::Element& operator * () const
+		{
+			return *_cur;
+		}
+
+	protected:
+		typename BlasMatrix<typename _Matrix::Field, typename _Matrix::Rep>::ConstIterator _cur;
+		size_t _c_dim;
+		size_t _stride;
+		size_t _c_idx;
+	};
+
+#if 0
+	template < class _Matrix >
+	class BlasSubmatrix<_Matrix>::ConstIterator {
+	public:
+		ConstIterator (){}
+
+		ConstIterator ( const typename BlasMatrix< _Field>::ConstIterator& cur,
+				   size_t cont_len,
+				   size_t gap_len) :
+			_beg (beg), _cur (cur), _cont_len (cont_len), _gap_len (gap_len)
+		{}
+
+		ConstIterator& operator = (const Iterator& r)
+		{
+			_cur = r._cur;
+			_beg = r._beg;
+			_cont_len = r._cont_len;
+			_gap_len = r._gap_len;
+			return *this;
+		}
+
+		ConstIterator& operator = (const ConstIterator& r)
+		{
+			_cur = r._cur;
+			_beg = r._beg;
+			_cont_len = r._cont_len;
+			_gap_len = r._gap_len;
+			return *this;
+		}
+
+		ConstIterator& operator++()
+		{
+			if (((_cur - _beg + 1) % _cont_len) != 0)
+				++_cur;
+			else {
+				_cur = _cur + _gap_len + 1;
+				_beg = _beg + _gap_len + _cont_len;
+			}
+			return *this;
+		}
+
+		ConstIterator operator++(int)
+		{
+			ConstIterator tmp = *this;
+			this->operator++();
+			return tmp;
+		}
+
+		bool operator != (const ConstIterator& r) const
+		{
+			return (_cur != r._cur) || (_beg != r._beg) || (_cont_len != r._cont_len) || (_gap_len != r._gap_len);
+		}
+
+		const typename _Field::Element& operator*()
+		{ return *_cur; }
+
+	 _Field& operator*()
+		{ return *_cur; }
+
+		const _Field& operator*() const
+		{ return *_cur; }
+
+	protected:
+		typename BlasMatrix< _Field>::ConstIterator _beg;
+		typename BlasMatrix< _Field>::ConstIterator _cur;
+		size_t _cont_len;
+		size_t _gap_len;
+	};
+#endif
+
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::Iterator BlasSubmatrix<_Matrix>::Begin ()
+	{
+		return Iterator (_Mat.Begin () + (ptrdiff_t)( _off ),
+				    _col, _stride, 0);
+	}
+
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::Iterator BlasSubmatrix<_Matrix>::End ()
+	{
+		return Iterator (_Mat.Begin () +(ptrdiff_t) ( (_row) * _stride + _off ),
+				    _col, _stride, 0);
+	}
+
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::ConstIterator BlasSubmatrix<_Matrix>::Begin () const
+	{
+		return ConstIterator (_Mat.Begin () +(ptrdiff_t) ( _off ),
+					 _col, _stride, 0);
+	}
+
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::ConstIterator BlasSubmatrix<_Matrix>::End () const
+	{
+		return ConstIterator (_Mat.Begin () +(ptrdiff_t) ( (_row) * _stride + _off ),
+					 _col, _stride, 0);
+	}
+
+#if 0
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::ConstIterator BlasSubmatrix<_Matrix>::Begin () const
+	{
+		return ConstIterator (_Mat.Begin () +(ptrdiff_t) ( _off ),
+					 _Mat.Begin () +(ptrdiff_t) ( _off ),
+					 _col, _stride - _col);
+	}
+
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::ConstIterator BlasSubmatrix<_Matrix>::End () const
+	{
+		return ConstIterator (_Mat.Begin () +(ptrdiff_t) ( (_row) * _stride + _off ),
+					 _Mat.Begin () +(ptrdiff_t) ( (_row) * _stride + _off ),
+					 _col, _stride - _col);
+	}
+#endif
+
+	/*! Raw Indexed Iterator.
+	 * @ingroup iterators
+	 *
+	 * Like the raw iterator, the indexed iterator is a method for
+	 * accessing all entries in the matrix in some unspecified order.
+	 * At each position of the the indexed iterator, it also provides
+	 * the row and column indices of the currently referenced entry.
+	 * This is provided through it's \c rowIndex() and \c colIndex() functions.
+	 */
+	template < class _Matrix >
+	class BlasSubmatrix<_Matrix>::IndexedIterator {
+	public:
+		IndexedIterator (){}
+
+		IndexedIterator (const typename BlasMatrix<typename _Matrix::Field,typename _Matrix::Rep>::Iterator& cur,
+				    size_t c_dim,
+				    size_t stride,
+				    size_t r_idx,
+				    size_t c_idx) :
+			_cur (cur), _c_dim (c_dim), _stride (stride), _r_idx(r_idx), _c_idx (c_idx)
+		{}
+
+		IndexedIterator& operator = (const IndexedIterator& r)
+		{
+			_cur = r._cur;
+			_stride = r._stride;
+			_c_dim = r._c_dim;
+			_r_idx = r._r_idx;
+			_c_idx = r._c_idx;
+			return *this;
+		}
+
+		IndexedIterator& operator++()
+		{
+			if (_c_idx < _c_dim - 1){
+				++_c_idx;
+				++_cur;
+			}
+			else {
+				_cur = _cur + _stride - _c_dim + 1;
+				_c_idx = 0;
+				++_r_idx;
+			}
+			return *this;
+		}
+
+		IndexedIterator& operator--()
+		{
+			if (_c_idx > 0){
+				--_c_idx;
+				--_cur;
+			}
+			else {
+				_cur = _cur - _stride + _c_dim -1;
+				_c_idx = 0;
+				--_r_idx;
+			}
+			return *this;
+		}
+
+		IndexedIterator operator++(int)
+		{
+			IndexedIterator tmp = *this;
+			this->operator++();
+			return tmp;
+		}
+
+		IndexedIterator operator--(int)
+		{
+			IndexedIterator tmp = *this;
+			this->operator--();
+			return tmp;
+		}
+
+		bool operator != (const IndexedIterator& r) const
+		{
+			return ((_c_idx != r._c_idx) || (_r_idx != r._r_idx) ||(_stride != r._stride) || (_c_dim != r._c_dim) );
+		}
+
+		const typename _Matrix::Field& operator*() const {return *_cur;}
+
+		typename _Matrix::Element& operator*() {return *_cur;}
+
+		size_t rowIndex () const { return _r_idx; }
+
+		size_t colIndex () const { return _c_idx; }
+
+		const typename _Matrix::Element& value () const {return *_cur;}
+
+	protected:
+		typename BlasMatrix<typename _Matrix::Field, typename _Matrix::Rep>::Iterator _cur;
+		size_t _stride;
+		size_t _c_dim;
+		size_t _r_idx;
+		size_t _c_idx;
+	};
+
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::IndexedIterator BlasSubmatrix<_Matrix>::IndexedBegin ()
+	{
+		return IndexedIterator (_Mat.Begin () +(ptrdiff_t) ( (_off) ),
+					   _col , _stride, 0, 0);
+	}
+
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::IndexedIterator BlasSubmatrix<_Matrix>::IndexedEnd ()
+	{
+		return IndexedIterator (_Mat.Begin () +(ptrdiff_t) ( (_row) * _stride + (_col+_off) ),
+					   _col, _stride, _row-1, _col-1);
+	}
+
+	/*! Raw Indexed Iterator (const version).
+	 * @ingroup iterators
+	 *
+	 * Like the raw iterator, the indexed iterator is a method for
+	 * accessing all entries in the matrix in some unspecified order.
+	 * At each position of the the indexed iterator, it also provides
+	 * the row and column indices of the currently referenced entry.
+	 * This is provided through it's \c rowIndex() and \c colIndex() functions.
+	 */
+	template < class _Matrix >
+	class BlasSubmatrix<_Matrix>::ConstIndexedIterator {
+	public:
+		ConstIndexedIterator (){}
+
+		ConstIndexedIterator (const typename BlasMatrix<typename _Matrix::Field, typename _Matrix::Rep>::ConstIterator& cur,
+					 size_t c_dim,
+					 size_t stride,
+					 size_t r_idx,
+					 size_t c_idx) :
+			_cur (cur), _stride (stride), _c_dim (c_dim), _r_idx(r_idx), _c_idx (c_idx)
+		{}
+
+		ConstIndexedIterator& operator = (const IndexedIterator& r)
+		{
+			_cur = r._cur;
+			_stride = r._stride;
+			_c_dim = r._c_dim;
+			_r_idx = r._r_idx;
+			_c_idx = r._c_idx;
+			return *this;
+		}
+
+		ConstIndexedIterator& operator = (const ConstIndexedIterator& r)
+		{
+			_cur = r._cur;
+			_stride = r._stride;
+			_c_dim = r._c_dim;
+			_r_idx = r._r_idx;
+			_c_idx = r._c_idx;
+			return *this;
+		}
+
+		ConstIndexedIterator& operator++()
+		{
+			if (_c_idx < _c_dim - 1){
+				++_c_idx;
+				++_cur;
+			}
+			else {
+				_cur = _cur + _stride - _c_dim +1;
+				_c_idx = 0;
+				++_r_idx;
+			}
+			return *this;
+		}
+
+		IndexedIterator& operator--()
+		{
+			if (_c_idx > 0){
+				--_c_idx;
+				--_cur;
+			}
+			else {
+				_cur = _cur - _stride + _c_dim -1;
+				_c_idx = 0;
+				--_r_idx;
+			}
+			return *this;
+		}
+
+		ConstIndexedIterator operator++(int)
+		{
+			ConstIndexedIterator tmp = *this;
+			this->operator++();
+			return tmp;
+		}
+
+		ConstIndexedIterator operator--(int)
+		{
+			ConstIndexedIterator tmp = *this;
+			this->operator--();
+			return tmp;
+		}
+
+		size_t rowIndex () const
+		{
+			return _r_idx;
+		}
+
+		size_t colIndex () const
+		{
+			return _c_idx;
+		}
+
+		bool operator != (const ConstIndexedIterator& r) const
+		{
+			return ((_c_idx != r._c_idx) || (_r_idx != r._r_idx) ||(_stride != r._stride) || (_c_dim != r._c_dim) );
+		}
+
+		const typename _Matrix::Element& operator*() const
+		{
+			return *_cur;
+		}
+
+
+		friend std::ostream& operator<<(std::ostream& out, const ConstIndexedIterator m)
+		{
+			return out /* << m._cur << ' ' */
+			<< m._stride << ' '
+			<< m._c_dim << ' '
+			<< m._r_idx << ' '
+			<< m._c_idx;
+		}
+
+		const typename _Matrix::Element & value() const
+		{
+			return this->operator*();
+
+		}
+
+	protected:
+		typename BlasMatrix<typename _Matrix::Field, typename _Matrix::Rep>::ConstIterator _cur;
+		size_t _stride;
+		size_t _c_dim;
+		size_t _r_idx;
+		size_t _c_idx;
+	};
+
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::ConstIndexedIterator BlasSubmatrix<_Matrix>::IndexedBegin () const
+	{
+		return ConstIndexedIterator (_Mat.Begin () +(ptrdiff_t) ( _off ),
+						_row, _stride, 0, 0);
+	}
+
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::ConstIndexedIterator BlasSubmatrix<_Matrix>::IndexedEnd () const
+	{
+		return ConstIndexedIterator (_Mat.Begin () +(ptrdiff_t) ( (_row) * _stride + (_off+_col) ),
+						_col, _stride, _row-1, _col-1);
+	}
+
+	////////
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::RowIterator BlasSubmatrix<_Matrix>::rowBegin ()
+	{
+		return RowIterator (_Mat.Begin () +(ptrdiff_t) ( _off  ),
+				    _col, _stride);
+	}
+
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::RowIterator BlasSubmatrix<_Matrix>::rowEnd ()
+	{
+		return RowIterator (_Mat.Begin () +(ptrdiff_t) ( (_row) * _stride + _off ),
+				    _col, _stride);
+	}
+
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::ConstRowIterator BlasSubmatrix<_Matrix>::rowBegin () const
+	{
+		return ConstRowIterator (_Mat.Begin () + (ptrdiff_t)( _off ),
+					 _col, _stride);
+	}
+
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::ConstRowIterator BlasSubmatrix<_Matrix>::rowEnd () const
+	{
+		return ConstRowIterator (_Mat.Begin () + (ptrdiff_t)( (_row) * _stride + _off ),
+					 _col, _stride);
+	}
+
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::ColIterator BlasSubmatrix<_Matrix>::colBegin ()
+	{
+		return ColIterator (_Mat.Begin () + (ptrdiff_t)( _off ),
+				    _stride, _row);
+	}
+
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::ColIterator BlasSubmatrix<_Matrix>::colEnd ()
+	{
+		return ColIterator (_Mat.Begin () + (ptrdiff_t)( (_col) + _off ),
+				    _stride, _row);
+	}
+
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::ConstColIterator BlasSubmatrix<_Matrix>::colBegin () const
+	{
+		return ConstColIterator (_Mat.Begin () + (ptrdiff_t)( _off ),
+					 _stride, _row);
+	}
+
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::ConstColIterator BlasSubmatrix<_Matrix>::colEnd () const
+	{
+		return ConstColIterator (_Mat.Begin () + (ptrdiff_t)( (_col) + _off ),
+					 _stride, _row);
+	}
+
+	/*  operators */
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::Row BlasSubmatrix<_Matrix>::operator[] (size_t i)
+	{
+		return Row (_Mat.Begin () +(ptrdiff_t) (_r0+i) * _stride, _Mat.Begin () + (ptrdiff_t)((_r0+i) * _stride + _stride) );
+	}
+
+	template < class _Matrix >
+	typename BlasSubmatrix<_Matrix>::ConstRow BlasSubmatrix<_Matrix>::operator[] (size_t i) const
+	{
+		return Row (_Mat.Begin () + (ptrdiff_t)(_r0+i) * _stride, _Mat.Begin () + (ptrdiff_t)((_r0+i) * _stride + _stride) );
+	}
+
+} // LinBox
+
+///////////////////
+//      I/O      //
+///////////////////
+
+namespace LinBox
+{
+
+	template < class _Matrix >
+	std::istream& BlasSubmatrix<_Matrix>::read (std::istream &file)
+	{
+#if 0
+		Iterator p;
+		int m,n;
+		char c;
+		file>>m>>n>>c;
+
+		if (m*n < _row*_col)
+			cerr<<"NOT ENOUGH ELEMENT TO READ\n";
+		else {
+			for (p = Begin (); p != End (); ++p) {
+				integer tmp;
+				file>>tmp;cout<<tmp<<endl;
+				//file.ignore(1);
+				_Mat.field().read (file, *p);
+			}
+		}
+#endif
+
+
+		Iterator p;
+		int m=0,n=0;
+		char c='\0';
+		file>>m>>n>>c;
+		// std::cout << m << 'x' << n << ':' << c << std::endl;
+
+		// this is bogus!! -bds
+		_row = m; _col = n;
+
+		// resize(_row,_col);
+
+		if ((c != 'M') && (c != 'm')) {
+		for (p = Begin (); p != End (); ++p) {
+				//file.ignore(1);
+				_Mat.field().read (file, *p);
+			}
+
+		}
+		else { // sparse file format - needs fixing
+			int i=0, j=0;
+			while (true)
+			{
+				file >> i >> j;
+				//file.ignore(1);
+				//if (! file) break;
+				if (i+j <= 0) break;
+				// std::cout << i << ',' << j << ':' ;
+				_Mat.field().read (file, _Mat.refEntry(i-1, j-1));
+			}
+		}
+
+		return file;
+	}
+
+	template <class _Matrix>
+	std::ostream &BlasSubmatrix< _Matrix >::write (std::ostream &os,
+						     LINBOX_enum (Tag::FileFormat) f ) const
+	{
+
+		ConstRowIterator p;
+		switch(f) {
+			case (Tag::FileFormat::MatrixMarket ) : /* Matrix Market */
+				{
+					writeMMArray(os, *this, "BlasSubmatrix");
+				}
+				break;
+			case (Tag::FileFormat::Plain) : /*  raw output */
+				{
+					integer c;
+					int wid;
+
+					_Mat.field().cardinality (c);
+
+					if (c >0)
+						wid = (int) ceil (log ((double) c) / M_LN10);
+					else {
+// 						integer tmp;
+// 						size_t max=0;
+// 						ConstIterator it = Begin();
+// 						for (; it != End(); ++it){
+// 							_Mat.field().convert(tmp,*it);
+// 							if (tmp.bitsize() > max)
+// 								max= tmp.bitsize();
+// 						}
+// 						wid= (int) ceil ((double)max / M_LN10)+1;
+                                            wid=1000;
+
+					}
+
+					for (p = rowBegin (); p != rowEnd ();++p) {
+						typename ConstRow::const_iterator pe;
+
+						os << "  [ ";
+
+						for (pe = p->begin (); pe != p->end (); ++pe) {
+							os.width (wid);
+							/*!  @warning
+							 * matrix base does not provide this field(), maybe should?
+							 * _Mat.field ().write (os, *pe);
+							 * os << *pe;
+							 * fixed by using extra field
+							 */
+
+							_Mat.field().write (os, *pe);
+							os << " ";
+						}
+
+						os << "]" << std::endl;
+					}
+				}
+				break;
+			case (Tag::FileFormat::Maple) : /*  maple format */
+				{
+
+					os << "Matrix( " << rowdim() << ',' << coldim() << ",\n[" ;
+					for (p = rowBegin (); p != rowEnd (); ) {
+						typename ConstRow::const_iterator pe;
+                                                if (p!=rowBegin()) os << ' ';
+						os << "[ ";
+
+						for (pe = p->begin (); pe != p->end (); ) {
+							_Mat.field().write (os, *pe);
+							++pe ;
+							if (pe != p->end())
+								os << ", ";
+						}
+
+						os << "]" ;
+						++p ;
+						if (p != rowEnd() )
+							os << ',' << std::endl;;
+
+					}
+					os << "])" ;
+				}
+				break;
+			case (Tag::FileFormat::HTML) : /*  HTML format */
+				{
+
+					os << "<table border=\"1\">" ;
+					for (p = rowBegin (); p != rowEnd (); ) {
+						typename ConstRow::const_iterator pe;
+
+						os << "<tr>";
+
+						for (pe = p->begin (); pe != p->end (); ) {
+							_Mat.field().write (os<< "<td>", *pe)<<"</td>";
+							++pe ;
+						}
+
+						os << "</tr>" << std::endl;
+						++p ;
+
+					}
+					os << "</table>" ;
+				}
+				break;
+			case (Tag::FileFormat::LaTeX) : /*  LaTex format */
+				{
+					os << "\\begin{pmatrix} " << std::endl;
+					for (p = rowBegin (); p != rowEnd (); ) {
+						typename ConstRow::const_iterator pe;
+
+						for (pe = p->begin (); pe != p->end (); ) {
+							_Mat.field().write (os, *pe);
+							++pe ;
+							if (pe != p->end())
+								os << "& ";
+						}
+
+						os << "\\\\" << std::endl;
+						++p ;
+
+					}
+					os << "\\end{pmatrix}" ;
+				}
+				break;
+			default : /*  this is an error */
+				{
+					throw LinBoxError("unknown format to write matrix in");
+				}
+		}
+
+		return os;
+	}
+
+	template <class _Matrix>
+	template<typename _Tp1, class _Rep2>
+	struct BlasSubmatrix< _Matrix>::rebind {
+		typedef BlasMatrix<_Tp1,_Rep2> other;
+
+		void operator() (other & Ap, const Self_t& A) {
+			typedef typename BlasSubmatrix<_Matrix>::ConstIterator ConstSelfIterator ;
+			typedef typename other::Iterator OtherIterator ;
+			OtherIterator    Ap_i;
+			ConstSelfIterator A_i;
+			Hom<Field, _Tp1> hom(A. field(), Ap. field());
+			for (A_i = A. Begin(), Ap_i = Ap.Begin();
+			     A_i != A. End(); ++ A_i, ++ Ap_i)
+				hom.image (*Ap_i, *A_i);
+		}
+	};
+
+} // LinBox
+
+//////////////////
+//     MISC     //
+//////////////////
+
+namespace LinBox
+{
+} // LinBox
+#endif // __LINBOX_densematrix_blas_submatrix_INL
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/matrix/densematrix/blas-transposed-matrix.h b/linbox/matrix/densematrix/blas-transposed-matrix.h
new file mode 100644
index 0000000..7eb1bb9
--- /dev/null
+++ b/linbox/matrix/densematrix/blas-transposed-matrix.h
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2004,2014 Pascal Giorgi, Clément Pernet, the LinBox group
+ *
+ * Written by :
+ *               Pascal Giorgi  pascal.giorgi at ens-lyon.fr
+ *               Clément Pernet clement.pernet at imag.fr
+ *               Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/densematrix/blas-tranposed-matrix.h
+ * @ingroup densematrix
+ * @brief Transposed Matrix
+ * not much.
+ *
+ */
+
+#ifndef __LINBOX_matrix_densematrix_blas_transposed_matrix_H
+#define __LINBOX_matrix_densematrix_blas_transposed_matrix_H
+
+
+namespace LinBox
+{ /*  Transposed Matrix */
+	/*! TransposedBlasMatrix.
+	 * NO DOC
+	 */
+	template< class Matrix >
+	class TransposedBlasMatrix {
+
+	public:
+
+		/*! NO DOC
+		 * @param Mat
+		 */
+		TransposedBlasMatrix ( Matrix& Mat ) :
+			_Mat(Mat)
+		{}
+
+		/*! NO DOC
+		*/
+		Matrix& getMatrix() const
+		{
+			return _Mat;
+		}
+
+	protected:
+		Matrix& _Mat; //!< NO DOC
+	};
+
+	/*! TransposedBlasMatrix.
+	 * NO DOC
+	 */
+#if !defined(__INTEL_COMPILER) && !defined(__CUDACC__) & !defined(__clang__)
+	template <>
+#endif
+	template< class Matrix >
+	class TransposedBlasMatrix< TransposedBlasMatrix< Matrix > > : public Matrix {
+
+	public:
+		/*! TransposedBlasMatrix.
+		 * NO DOC
+		 */
+		TransposedBlasMatrix ( Matrix& Mat ) :
+			Matrix(Mat)
+		{}
+
+		/*! TransposedBlasMatrix.
+		 * NO DOC
+		 */
+		TransposedBlasMatrix ( const Matrix& Mat ) :
+			Matrix(Mat)
+		{}
+
+	};
+
+
+}
+
+#endif // __LINBOX_matrix_densematrix_blas_transposed_matrix_H
+
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/densematrix/blas-triangularmatrix.inl b/linbox/matrix/densematrix/blas-triangularmatrix.inl
new file mode 100644
index 0000000..c46656d
--- /dev/null
+++ b/linbox/matrix/densematrix/blas-triangularmatrix.inl
@@ -0,0 +1,145 @@
+/* linbox/matrix/blas-triangularmatrix.inl
+ * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
+ *
+ * Written by :
+ *               Pascal Giorgi  <pascal.giorgi at ens-lyon.fr>
+ *               Clément Pernet <clement.pernet at imag.fr>
+ *               Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*!@internal
+ * @file matrix/blas-triangularmatrix.inl
+ * @ingroup matrix
+ * A \c BlasMatrix<\c _Field > represents a matrix as an array of
+ * <code>_Field</code>s.
+ */
+
+#ifndef __LINBOX_blas_triangularmatrix_INL
+#define __LINBOX_blas_triangularmatrix_INL
+
+namespace LinBox
+{
+	template < class _Field, class _Rep >
+	TriangularBlasMatrix< _Field, _Rep >::TriangularBlasMatrix (const _Field & F, const size_t m, const size_t n,
+							    LINBOX_enum (Tag::Shape) x,
+							    LINBOX_enum (Tag::Diag) y) :
+		BlasMatrix< _Field, _Rep >(F, m, n ) , _uplo(x), _diag(y)
+	{}
+
+	template < class _Field, class _Rep >
+	TriangularBlasMatrix< _Field, _Rep >::TriangularBlasMatrix (const BlasMatrix< _Field, _Rep >& A,
+							    LINBOX_enum (Tag::Shape) x,
+							    LINBOX_enum (Tag::Diag) y) :
+		BlasMatrix< _Field, _Rep >(A) , _uplo(x), _diag(y)
+	{}
+
+	template < class _Field, class _Rep >
+	TriangularBlasMatrix< _Field, _Rep >::TriangularBlasMatrix (BlasMatrix< _Field, _Rep >& A,
+							    LINBOX_enum (Tag::Shape) x,
+							    LINBOX_enum (Tag::Diag) y) :
+		BlasMatrix< _Field, _Rep >(A), _uplo(x), _diag(y)
+	{}
+
+	template < class _Field, class _Rep >
+	TriangularBlasMatrix< _Field, _Rep >::TriangularBlasMatrix (const TriangularBlasMatrix< _Field, _Rep >& A) :
+		BlasMatrix< _Field, _Rep >(A.field(), A.rowdim(),A.coldim()), _uplo(A._uplo), _diag(A._diag)
+	{
+		switch (A._uplo) {
+		case Tag::Shape::Upper:
+			{
+				for (size_t i=0;i<A.rowdim();++i)
+					for (size_t j=i;j<A.coldim();++j)
+						this->setEntry(i,j,A.getEntry(i,j));
+				break;
+			}
+		case Tag::Shape::Lower:
+			{
+				for (size_t i=0;i<A.rowdim();++i) {
+					for (size_t j=0;j<=i;++j)
+						this->setEntry(i,j,A.getEntry(i,j));
+				}
+
+				break;
+			}
+		default:
+			throw LinboxError ("Error in copy constructor of TriangularBlasMatrix (incorrect argument)");
+		}
+	}
+
+	template < class _Field, class _Rep >
+	template<class Matrix>
+	TriangularBlasMatrix< _Field, _Rep >::TriangularBlasMatrix (const Matrix& A,
+							    LINBOX_enum (Tag::Shape) x,
+							    LINBOX_enum (Tag::Diag) y) :
+		BlasMatrix< _Field, _Rep >(A.field(),A.rowdim(),A.coldim()), _uplo(x), _diag(y)
+	{
+		switch (x) {
+		case Tag::Shape::Upper:
+			{
+				for (size_t i=0;i<A.rowdim();++i){
+					for (size_t j=i;j<A.coldim();++j) {
+						Element tmp = A.getEntry(i,j) ;
+						this->setEntry(i,j,tmp);
+					}
+				}
+				break;
+			}
+		case Tag::Shape::Lower:
+			{
+				for (size_t i=0;i<A.rowdim();++i) {
+					for (size_t j=0;j<=i;++j) {
+						Element tmp = A.getEntry(i,j);
+						this->setEntry(i,j,tmp);
+					}
+				}
+
+				break;
+			}
+		default:
+			throw LinboxError ("Error in copy constructor of TriangularBlasMatrix (incorrect argument)");
+		}
+	}
+
+	template < class _Field, class _Rep >
+	LINBOX_enum (Tag::Shape) TriangularBlasMatrix< _Field, _Rep >::getUpLo() const
+	{
+		return _uplo;
+	}
+
+	template < class _Field, class _Rep >
+	LINBOX_enum (Tag::Diag) TriangularBlasMatrix< _Field, _Rep >::getDiag() const
+	{
+		return _diag;
+	}
+
+}
+
+#endif // __LINBOX_blas_triangularmatrix_INL
+
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/factorized-matrix.h b/linbox/matrix/factorized-matrix.h
index 0f6e129..347344e 100644
--- a/linbox/matrix/factorized-matrix.h
+++ b/linbox/matrix/factorized-matrix.h
@@ -31,9 +31,9 @@
 
 #include <vector>
 
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
-#include <fflas-ffpack/ffpack/ffpack.h>
+#include <fflas-ffpack/fflas-ffpack.h>
+
+#include "linbox/matrix/densematrix/blas-matrix.h"
 
 #include "linbox/matrix/permutation-matrix.h"
 
@@ -63,6 +63,7 @@ namespace LinBox
 	 * a finite field.  There are methods for retrieving \p L,\p Q,\p U and \p P
 	 * matrices and methods for solving systems.
 	 */
+	//! @bug Should really be tempalted by Matrix and be a (sub)domain
 	template <class Field>
 	class LQUPMatrix {
 
@@ -73,7 +74,7 @@ namespace LinBox
 	protected:
 
 		Field                     _field;
-		BlasMatrix<Field>       &_factLU;
+		BlasMatrix<Field,typename Vector<Field>::Dense >       &_factLU;
 		BlasPermutation<size_t> &_permP;
 		BlasPermutation<size_t> &_permQ;  //note: this is actually Qt!
 		size_t                    _m;
@@ -86,8 +87,8 @@ namespace LinBox
 
 #if 0
 		//! Contruction of LQUP factorization of A (making a copy of A)
-		LQUPMatrix (const Field& F, const BlasMatrix<Field>& A) :
-			_field(F), _factLU(*(new BlasMatrix<Field> (A))) ,
+		LQUPMatrix (const Field& F, const BlasMatrix<Field,_Rep>& A) :
+			_field(F), _factLU(*(new BlasMatrix<Field,_Rep> (A))) ,
 			_permP(*(new BlasPermutation<size_t>(A.coldim()))),
 			_permQ(*(new BlasPermutation<size_t>(A.rowdim()))),
 			_m(A.rowdim()), _n(A.coldim()),
@@ -95,7 +96,7 @@ namespace LinBox
 		{
 			//std::cerr<<"Je passe par le constructeur const"<<std::endl;
 
-			_rank= FFPACK::LUdivine((typename Field::Father_t) _field,FFLAS::FflasNonUnit,  FFLAS::FflasNoTrans, _m, _n,
+			_rank= FFPACK::LUdivine( _field,FFLAS::FflasNonUnit,  FFLAS::FflasNoTrans, _m, _n,
 						 _factLU.getPointer(),_factLU.getStride(),
 						 _permP.getWritePointer(), _permQ.getWritePointer(), FFPACK::FfpackLQUP );
 			_permP.setOrder(_rank);
@@ -104,7 +105,7 @@ namespace LinBox
 		}
 
 		//! Contruction of LQUP factorization of A (in-place in A)
-		LQUPMatrix (const Field& F, BlasMatrix<Field>& A) :
+		LQUPMatrix (const Field& F, BlasMatrix<Field,_Rep>& A) :
 			_field(F), _factLU(A) ,
 			_permP(*(new BlasPermutation<size_t>(A.coldim()))),
 			_permQ(*(new BlasPermutation<size_t>(A.rowdim()))),
@@ -117,21 +118,20 @@ namespace LinBox
 			}
 			else {
 				//std::cerr<<"Je passe par le constructeur non const"<<std::endl;
-				_rank= FFPACK::LUdivine((typename Field::Father_t) _field,FFLAS::FflasNonUnit, FFLAS::FflasNoTrans, _m, _n,
-							 _factLU.getPointer(),_factLU.getStride(),
+				_rank= FFPACK::LUdivine( _field,FFLAS::FflasNonUnit, FFLAS::FflasNoTrans, _m, _n,
+                                                         _factLU.getPointer(),_factLU.getStride(),
 							 _permP.getWritePointer(), _permQ.getWritePointer(), FFPACK::FfpackLQUP );
-			}
+                        }
 			_permP.setOrder(_rank);
 			_permQ.setOrder(_rank);
-
 		}
 
 		/*! Contruction of LQUP factorization of A (making a copy of A).
 		 * P and Q are arguments !
 		 */
-		LQUPMatrix (const BlasMatrix<Field>& A,
+		LQUPMatrix (const BlasMatrix<Field,_Rep>& A,
 			    BlasPermutation<size_t> & P, BlasPermutation<size_t> & Q) :
-			_field(F), _factLU(*(new BlasMatrix<Field> (A))) ,
+			_field(F), _factLU(*(new BlasMatrix<Field,_Rep> (A))) ,
 			_permP(P), _permQ(Q),
 			_m(A.rowdim()), _n(A.coldim()),
 			_alloc(true),_plloc(false)
@@ -140,7 +140,7 @@ namespace LinBox
 
 			linbox_check(_permQ.getOrder()==A.rowdim());
 			linbox_check(_permP.getOrder()==A.coldim());
-			_rank= FFPACK::LUdivine((typename Field::Father_t) _field,FFLAS::FflasNonUnit,  FFLAS::FflasNoTrans, _m, _n,
+			_rank= FFPACK::LUdivine( _field,FFLAS::FflasNonUnit,  FFLAS::FflasNoTrans, _m, _n,
 						 _factLU.getPointer(),_factLU.getStride(),
 						 _permP.getWritePointer(), _permQ.getWritePointer(), FFPACK::FfpackLQUP );
 			_permP.setOrder(_rank);
@@ -152,7 +152,7 @@ namespace LinBox
 		/*! Contruction of LQUP factorization of A (in-place in A).
 		 * P and Q are arguments !
 		 */
-		LQUPMatrix ( BlasMatrix<Field>& A,
+		LQUPMatrix ( BlasMatrix<Field,_Rep>& A,
 			    BlasPermutation<size_t> & P, BlasPermutation<size_t> & Q) :
 			_field(F), _factLU(A) , _permP(P), _permQ(Q),
 			_m(A.rowdim()), _n(A.coldim()),
@@ -166,7 +166,7 @@ namespace LinBox
 			if (_permP.getOrder() == 0)
 				_permP.resize(A.coldim());
 
-			_rank= FFPACK::LUdivine((typename Field::Father_t) _field,FFLAS::FflasNonUnit, FFLAS::FflasNoTrans, _m, _n,
+			_rank= FFPACK::LUdivine( _field,FFLAS::FflasNonUnit, FFLAS::FflasNoTrans, _m, _n,
 						 _factLU.getPointer(),_factLU.getStride(),
 						 _permP.getWritePointer(), _permQ.getWritePointer(), FFPACK::FfpackLQUP );
 			_permP.setOrder(_rank);
@@ -175,23 +175,27 @@ namespace LinBox
 		}
 #endif
 		//! Contruction of LQUP factorization of A (making a copy of A)
-		LQUPMatrix (const BlasMatrix<Field>& A) ;
+		template<class _Rep>
+		LQUPMatrix (const BlasMatrix<Field,_Rep>& A) ;
 
 		//! Contruction of LQUP factorization of A (in-place in A)
-		LQUPMatrix (BlasMatrix<Field>& A) ;
+		template<class _Rep>
+		LQUPMatrix (BlasMatrix<Field,_Rep>& A) ;
 
 
 		/*! Contruction of LQUP factorization of A (making a copy of A).
 		 * P and Q are arguments !
 		 */
-		LQUPMatrix (const BlasMatrix<Field>& A,
+		template<class _Rep>
+		LQUPMatrix (const BlasMatrix<Field,_Rep>& A,
 			    BlasPermutation<size_t> & P, BlasPermutation<size_t> & Q) ;
 
 		/*! Contruction of LQUP factorization of A (in-place in A).
 		 * P and Q are arguments !
 		 * @bug in place ?
 		 */
-		LQUPMatrix (BlasMatrix<Field>& A,
+		template<class _Rep>
+		LQUPMatrix (BlasMatrix<Field,_Rep>& A,
 			    BlasPermutation<size_t> & P, BlasPermutation<size_t> & Q) ;
 
 		//! destructor.
@@ -244,17 +248,21 @@ namespace LinBox
 		 * else \c L is form \c LQUP decomposition.
 		 * @pre \c L has unit diagonal
 		 */
-		TriangularBlasMatrix<Field>& getL(TriangularBlasMatrix<Field>& L, bool _QLUP = false) const;
+
+		template<class _Rep>
+		TriangularBlasMatrix<Field,_Rep>& getL(TriangularBlasMatrix<Field,_Rep>& L, bool _QLUP = false) const;
 
 		/*! get the matrix  \c  U.
 		 * @pre \c   U has non-unit diagonal
 		 */
-		TriangularBlasMatrix<Field>& getU(TriangularBlasMatrix<Field>& U) const;
+		template<class _Rep>
+		TriangularBlasMatrix<Field,_Rep>& getU(TriangularBlasMatrix<Field,_Rep>& U) const;
 
 		/*! get the matrix S.
 		 *  from the LSP factorization of A deduced from LQUP)
 		 */
-		BlasMatrix<Field>& getS( BlasMatrix<Field>& S) const;
+		template<class _Rep>
+		BlasMatrix<Field,_Rep>& getS( BlasMatrix<Field,_Rep>& S) const;
 
 		/*! @internal get a pointer to the begin of storage.
 		*/
@@ -266,7 +274,7 @@ namespace LinBox
 
 		/*!
 		 * Solvers with matrices or vectors
-		 * Operand can be a BlasMatrix<Field> or a std::vector<Element>
+		 * Operand can be a BlasMatrix<Field,_Rep> or a std::vector<Element>
 		 */
 		//@{
 		// solve AX=B
diff --git a/linbox/matrix/factorized-matrix.inl b/linbox/matrix/factorized-matrix.inl
index a24af3e..e508ca8 100644
--- a/linbox/matrix/factorized-matrix.inl
+++ b/linbox/matrix/factorized-matrix.inl
@@ -29,30 +29,42 @@
 
 namespace LinBox
 {
+
 	namespace Protected
 	{
 		/// @internal
-		template <class Field, class Operand>
+		template <class Field, class Operand1, class Operand2=Operand1>
 		class FactorizedMatrixLeftSolve {
 		public:
-			Operand& operator() ( const Field& F,
-					      const LQUPMatrix<Field>& A,
-					      Operand& X, const Operand& B ) const;
-			Operand& operator() ( const Field& F,
-					      const LQUPMatrix<Field>& A,
-					      Operand& B ) const;
+			Operand1& operator() ( const Field& F,
+					       const LQUPMatrix<Field>& A,
+					       Operand1& X,
+					       const Operand2& B ) const;
+		}; // end of class FactorizedMatrixLeftSolve
+		template <class Field, class Operand1>
+		class FactorizedMatrixLeftSolveIP {
+		public:
+			Operand1& operator() ( const Field& F,
+					       const LQUPMatrix<Field>& A,
+					       Operand1& B ) const;
 		}; // end of class FactorizedMatrixLeftSolve
 
 		/// @internal
-		template <class Field, class Operand>
+		template <class Field, class Operand1, class Operand2=Operand1>
 		class FactorizedMatrixRightSolve {
 		public:
-			Operand& operator() ( const Field& F,
-					      const LQUPMatrix<Field>& A,
-					      Operand& X, const Operand& B ) const;
-			Operand& operator() ( const Field& F,
-					      const LQUPMatrix<Field>& A,
-					      Operand& B ) const;
+			Operand1& operator() ( const Field& F,
+					       const LQUPMatrix<Field>& A,
+					       Operand1& X,
+					       const Operand2& B ) const;
+		};
+		template <class Field, class Operand1>
+		class FactorizedMatrixRightSolveIP {
+		public:
+
+			Operand1& operator() ( const Field& F,
+					       const LQUPMatrix<Field>& A,
+					       Operand1& B ) const;
 		}; // end of class FactorizedMatrixRightSolve
 
 		/// @internal
@@ -104,120 +116,136 @@ namespace LinBox
 		}; // end of class FactorizedMatrixRightUSolve
 
 		/*
-		 * Solvers with Matrices: Operand=BlasMatrix<Field>
+		 * Solvers with Matrices: Operand= BlasMatrix<Field,_Rep>
 		 */
 
-		template <class Field>
-		class FactorizedMatrixLeftSolve<Field, BlasMatrix<Field> > {
-		public:
-
-			BlasMatrix<Field>& operator() (const Field& F,
+		template <class Field, class Matrix1, class Matrix2>
+		Matrix1&
+		FactorizedMatrixLeftSolve<Field,Matrix1,Matrix2>::operator() ( const Field& F,
 						       const LQUPMatrix<Field>& A,
-						       BlasMatrix<Field>& X,
-						       const BlasMatrix<Field>& B) const
-			{
-				linbox_check (A.coldim() == X.rowdim());
-				linbox_check (A.rowdim() == B.rowdim());
-				linbox_check (B.coldim() == X.coldim());
-				int info;
-
-				FFPACK::fgetrs ((typename Field::Father_t)F, FFLAS::FflasLeft, A.rowdim(), A.coldim(), B.coldim(), A.getRank(),
-						A.getPointer(), A.getStride(), A.getP().getPointer(), A.getQ().getPointer(),
-						X.getPointer(), X.getStride(),
-						B.getPointer(), B.getStride(), &info);
-				if (info > 0)
-					throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
-
-				return X;
-			}
-
-			BlasMatrix<Field>& operator() (const Field& F,
-						       const LQUPMatrix<Field>& A,
-						       BlasMatrix<Field>& B) const
-			{
-
-				int info;
-				linbox_check (A.coldim() == A.rowdim());
-				linbox_check (A.coldim() == B.rowdim());
-
-				FFPACK::fgetrs ((typename Field::Father_t)F, FFLAS::FflasLeft, B.rowdim(), B.coldim(), A.getRank(),
-						A.getPointer(), A.getStride(),
-						A.getP().getPointer(), A.getQ().getPointer(),
-						B.getPointer(), B.getStride(), &info);
-				if (info > 0)
-					throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
+						       Matrix1& X,
+						       const Matrix2& B) const
+		{
+			linbox_check (A.coldim() == X.rowdim());
+			linbox_check (A.rowdim() == B.rowdim());
+			linbox_check (B.coldim() == X.coldim());
+			int info;
+			// we don't really need that...
+			typedef typename Matrix1::subMatrixType subMatrixType ;
+			typedef typename Matrix1::constSubMatrixType constSubMatrixType ;
+			subMatrixType X_v(X);
+			constSubMatrixType B_v(B);
+
+
+			FFPACK::fgetrs (F, FFLAS::FflasLeft, A.rowdim(), A.coldim(), B_v.coldim(), A.getRank(),
+					A.getPointer(), A.getStride(), A.getP().getPointer(), A.getQ().getPointer(),
+					X_v.getPointer(), X_v.getStride(),
+					B_v.getPointer(), B_v.getStride(), &info);
+			if (info > 0)
+				throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
+
+			return X;
+		}
 
-				return B;
-			}
-		}; // end of class FactorizedMatrixLeftSolve
+		template <class Field, class Matrix1>
+		Matrix1&
+		FactorizedMatrixLeftSolveIP<Field,Matrix1>::operator() ( const Field& F,
+									 const LQUPMatrix<Field>& A,
+									 Matrix1& B ) const
+		{
 
-		template <class Field>
-		class FactorizedMatrixRightSolve<Field, BlasMatrix<Field> > {
-		public:
+			int info;
+			linbox_check (A.coldim() == A.rowdim());
+			linbox_check (A.coldim() == B.rowdim());
 
-			BlasMatrix<Field>& operator() ( const Field& F,
-							const LQUPMatrix<Field>& A,
-							BlasMatrix<Field>& X,
-							const BlasMatrix<Field>& B ) const
-			{
-				linbox_check (A.rowdim() == X.coldim());
-				linbox_check (A.coldim() == B.coldim());
-				linbox_check (B.rowdim() == X.rowdim());
-				int info;
+			typedef typename Matrix1::subMatrixType subMatrixType ;
+			subMatrixType B_v(B);
 
-				FFPACK::fgetrs ((typename Field::Father_t)F, FFLAS::FflasRight, A.rowdim(), A.coldim(), B.rowdim(), A.getRank(),
-						A.getPointer(), A.getStride(),
-						A.getP().getPointer(), A.getQ().getPointer(),
-						X.getPointer(), X.getStride(),
-						B.getPointer(), B.getStride(), &info);
-				if (info > 0)
-					throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
 
-				return X;
-			}
+			FFPACK::fgetrs (F, FFLAS::FflasLeft, B_v.rowdim(), B_v.coldim(), A.getRank(),
+					A.getPointer(), A.getStride(),
+					A.getP().getPointer(), A.getQ().getPointer(),
+					B_v.getPointer(), B_v.getStride(), &info);
+			if (info > 0)
+				throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
 
-			BlasMatrix<Field>& operator() ( const Field& F,
-							const LQUPMatrix<Field>& A,
-							BlasMatrix<Field>& B ) const
-			{
-
-				int info;
-				linbox_check (A.coldim() == A.rowdim());
-				linbox_check (A.rowdim() == B.coldim());
-
-				FFPACK::fgetrs ((typename Field::Father_t)F, FFLAS::FflasRight, B.rowdim(), B.coldim(), A.getRank(),
-						A.getPointer(), A.getStride(),
-						A.getP().getPointer(), A.getQ().getPointer(),
-						B.getPointer(), B.getStride(), &info);
-				if (info > 0)
-					throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
+			return B;
+		}
+		// end of class FactorizedMatrixLeftSolve
+
+		template <class Field, class Matrix1, class Matrix2>
+		Matrix1&
+		FactorizedMatrixRightSolve<Field,Matrix1,Matrix2>::operator() ( const Field& F,
+										const LQUPMatrix<Field>& A,
+										Matrix1& X,
+										const Matrix2& B ) const
+		{
+			linbox_check (A.rowdim() == X.coldim());
+			linbox_check (A.coldim() == B.coldim());
+			linbox_check (B.rowdim() == X.rowdim());
+			int info;
+			typedef typename Matrix1::subMatrixType subMatrixType ;
+			typedef typename Matrix1::constSubMatrixType constSubMatrixType ;
+			subMatrixType X_v(X);
+			constSubMatrixType B_v(B);
+
+			FFPACK::fgetrs (F, FFLAS::FflasRight, A.rowdim(), A.coldim(), B_v.rowdim(), A.getRank(),
+					A.getPointer(), A.getStride(),
+					A.getP().getPointer(), A.getQ().getPointer(),
+					X_v.getPointer(), X_v.getStride(),
+					B_v.getPointer(), B_v.getStride(), &info);
+			if (info > 0)
+				throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
+
+			return X;
+		}
 
-				return B;
-			}
+		template <class Field, class Matrix1>
+		Matrix1&
+		FactorizedMatrixRightSolveIP<Field,Matrix1>::operator() ( const Field& F,
+										const LQUPMatrix<Field>& A,
+										Matrix1& B ) const
+		{
+
+			int info;
+			linbox_check (A.coldim() == A.rowdim());
+			linbox_check (A.rowdim() == B.coldim());
+			typedef typename Matrix1::subMatrixType subMatrixType ;
+			subMatrixType B_v(B);
+
+			FFPACK::fgetrs (F, FFLAS::FflasRight, B_v.rowdim(), B_v.coldim(), A.getRank(),
+					A.getPointer(), A.getStride(),
+					A.getP().getPointer(), A.getQ().getPointer(),
+					B_v.getPointer(), B_v.getStride(), &info);
+			if (info > 0)
+				throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
+
+			return B;
+		}
 
-		}; // end of class FactorizedMatrixRightSolve
+		 // end of class FactorizedMatrixRightSolve
 
-		template <class Field>
-		class FactorizedMatrixLeftLSolve<Field, BlasMatrix<Field> > {
+		template <class Field,class _Rep>
+		class FactorizedMatrixLeftLSolve<Field, BlasMatrix<Field,_Rep> > {
 		public:
-			BlasMatrix<Field>& operator() ( const Field& F,
+		 BlasMatrix<Field,_Rep>& operator() ( const Field& F,
 							const LQUPMatrix<Field>& A,
-							BlasMatrix<Field>& X,
-							const BlasMatrix<Field>& B ) const
+						 BlasMatrix<Field,_Rep>& X,
+							const BlasMatrix<Field,_Rep>& B ) const
 			{
 				linbox_check (A.rowdim() == B.rowdim());
 				X = B;
 				return  (*this)(F, A, X);
 			}
 
-			BlasMatrix<Field>& operator() ( const Field& F,
+		 BlasMatrix<Field,_Rep>& operator() ( const Field& F,
 							const LQUPMatrix<Field>& A,
-							BlasMatrix<Field>& B ) const
+						 BlasMatrix<Field,_Rep>& B ) const
 			{
 
 				linbox_check (A.rowdim() == B.rowdim());
 
-				FFPACK::solveLB2 ((typename Field::Father_t)F, FFLAS::FflasLeft, B.rowdim(), B.coldim(), A.getRank(),
+				FFPACK::solveLB2 (F, FFLAS::FflasLeft, B.rowdim(), B.coldim(), A.getRank(),
 						  A.getPointer(), A.getStride(),
 						  A.getQ().getPointer(),
 						  B.getPointer(), B.getStride());
@@ -226,41 +254,41 @@ namespace LinBox
 			}
 		}; // end of class FactorizedMatrixLeftLSolve
 
-		template <class Field>
-		class FactorizedMatrixRightLSolve<Field, BlasMatrix<Field> > {
+		template <class Field, class _Rep>
+		class FactorizedMatrixRightLSolve<Field, BlasMatrix<Field,_Rep> > {
 		public:
-			BlasMatrix<Field>& operator() (const Field& F,
+		 BlasMatrix<Field,_Rep>& operator() (const Field& F,
 						       const LQUPMatrix<Field>& A,
-						       BlasMatrix<Field>& X,
-						       const BlasMatrix<Field>& B) const
+						       BlasMatrix<Field,_Rep>& X,
+						       const BlasMatrix<Field,_Rep>& B) const
 			{
 				linbox_check (A.rowdim() == B.coldim());
 				X = B;
 				return  (*this)( F, A, X );
 			}
 
-			BlasMatrix<Field>& operator() (const Field& F,
-						       const BlasMatrix<Field>& A,
-						       BlasMatrix<Field>& B) const
+		 BlasMatrix<Field,_Rep>& operator() (const Field& F,
+						       const BlasMatrix<Field,_Rep>& A,
+						       BlasMatrix<Field,_Rep>& B) const
 			{
 
 				linbox_check( A.rowdim() == B.coldim() );
 
-				FFPACK::solveLB2 ((typename Field::Father_t)F, FFLAS::FflasRight, B.rowdim(), B.coldim(), A.getRank(),
+				FFPACK::solveLB2 (F, FFLAS::FflasRight, B.rowdim(), B.coldim(), A.getRank(),
 						  A.getPointer(), A.getStride(),
 						  A.getQ().getPointer(), B.getPointer(), B.getStride());
 				return B;
 			}
 		}; // end of class FactorizedMatrixRightLsolve
 
-		template <class Field>
-		class FactorizedMatrixLeftUSolve<Field, BlasMatrix<Field> > {
+		template <class Field, class _Rep>
+		class FactorizedMatrixLeftUSolve<Field, BlasMatrix<Field,_Rep> > {
 		public:
 
-			BlasMatrix<Field>& operator() ( const Field& F,
+		 BlasMatrix<Field,_Rep>& operator() ( const Field& F,
 							const LQUPMatrix<Field>& A,
-							BlasMatrix<Field>& X,
-							const BlasMatrix<Field>& B ) const
+						 BlasMatrix<Field,_Rep>& X,
+							const BlasMatrix<Field,_Rep>& B ) const
 			{
 
 				linbox_check (A.coldim() == X.rowdim());
@@ -282,10 +310,11 @@ namespace LinBox
 
 				// The last rows of B are now supposed to be 0
 
-				for (size_t i=0; i < A.getRank(); ++i)
-					FFLAS::fcopy ((typename Field::Father_t)F, B.coldim(), Xp + i*ldx, 1, Bp + i*ldx,1);
+				// for (size_t i=0; i < A.getRank(); ++i)
+					// FFLAS::fassign (F, B.coldim(), Bp + i*ldx,1, Xp + i*ldx, 1);
+				FFLAS::fassign(F, A.getRank(),B.coldim(),Bp ,ldx, Xp, ldx);
 
-				FFLAS::ftrsm ((typename Field::Father_t)F, FFLAS::FflasLeft, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+				FFLAS::ftrsm (F, FFLAS::FflasLeft, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
 					      A.getRank(), X.coldim(), F.one, A.getPointer(), A.getStride(), X.getPointer(), X.getStride());
 
 				for (size_t i=A.getRank(); i < X.rowdim(); ++i)
@@ -295,9 +324,9 @@ namespace LinBox
 				return X;
 
 			}
-			BlasMatrix<Field>& operator() ( const Field& F,
-							const BlasMatrix<Field>& A,
-							BlasMatrix<Field>& B ) const
+		 BlasMatrix<Field,_Rep>& operator() ( const Field& F,
+							const BlasMatrix<Field,_Rep>& A,
+						 BlasMatrix<Field,_Rep>& B ) const
 			{
 
 				linbox_check (A.coldim() == A.rowdim());
@@ -313,7 +342,7 @@ namespace LinBox
 				if (!consistent)
 					throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
 
-				FFLAS::ftrsm ((typename Field::Father_t)F, FFLAS::FflasLeft, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+				FFLAS::ftrsm (F, FFLAS::FflasLeft, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
 					      A.getRank(), B.coldim(), F.one, A.getPointer(), A.getStride(), Bp, ldb);
 
 				return B;
@@ -321,13 +350,13 @@ namespace LinBox
 
 		}; // end of class FactorizedMatrixLeftUSolve
 
-		template <class Field>
-		class FactorizedMatrixRightUSolve<Field, BlasMatrix<Field> > {
+		template <class Field, class _Rep>
+		class FactorizedMatrixRightUSolve<Field, BlasMatrix<Field,_Rep> > {
 		public:
-			BlasMatrix<Field>& operator() ( const Field& F,
+		 BlasMatrix<Field,_Rep>& operator() ( const Field& F,
 							const LQUPMatrix<Field>& A,
-							BlasMatrix<Field>& X,
-							const BlasMatrix<Field>& B ) const
+						 BlasMatrix<Field,_Rep>& X,
+							const BlasMatrix<Field,_Rep>& B ) const
 			{
 				linbox_check (X.coldim() == A.rowdim());
 				linbox_check (X.rowdim() == B.rowdim());
@@ -338,10 +367,11 @@ namespace LinBox
 				size_t ldb = B.getStride();
 				size_t ldx = X.getStride();
 
-				for (size_t i = 0; i < X.getrowdim(); ++i)
-					FFLAS::fcopy ((typename Field::Father_t)F, R, Xp + i*ldx, 1, Bp + i*ldb,1);
+				// for (size_t i = 0; i < X.getrowdim(); ++i)
+					// FFLAS::fassign (F, R, Xp + i*ldx, 1, Bp + i*ldb,1);
+				FFLAS::fassign (F, R, X.getrowdim(), Bp , ldb, Xp , ldx);
 
-				FFLAS::ftrsm ((typename Field::Father_t)F, FFLAS::FflasRight, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+				FFLAS::ftrsm (F, FFLAS::FflasRight, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
 					      X.rowdim(), R, F.one, A.getPointer(), A.getStride(), X.getPointer(), X.getStride());
 
 				bool consistent = true;
@@ -349,7 +379,7 @@ namespace LinBox
 					typename Field::Element* W = new typename Field::Element [B.rowdim() * (B.coldim() - R)];
 					size_t ldw = B.rowdim();
 
-					FFLAS::fgemm ((typename Field::Father_t) F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+					FFLAS::fgemm ( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
 						      X.rowdim(), B.coldim() - R, R,
 						      F.one, Xp, X.getStride(), A.getPointer() + R, A.getStride,
 						      F.zero, W, ldw);
@@ -361,7 +391,7 @@ namespace LinBox
 					delete[] W;
 				}
 				else {
-					FFLAS::fgemm ((typename Field::Father_t)F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+					FFLAS::fgemm (F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
 						      X.rowdim(), B.coldim() - R, R,
 						      F.one, Xp, X.getStride(), A.getPointer() + R, A.getStride,
 						      F.zero, Xp + R, X.getStride());
@@ -380,9 +410,9 @@ namespace LinBox
 				return X;
 			}
 
-			BlasMatrix<Field>& operator() ( const Field& F,
+		 BlasMatrix<Field,_Rep>& operator() ( const Field& F,
 							const LQUPMatrix<Field>& A,
-							BlasMatrix<Field>& B ) const
+						 BlasMatrix<Field,_Rep>& B ) const
 			{
 				linbox_check (A.coldim() == A.rowdim());
 				linbox_check (B.coldim() == A.rowdim());
@@ -391,10 +421,10 @@ namespace LinBox
 				size_t ldb = B.getStride();
 				size_t R = A.getRank();
 
-				FFLAS::ftrsm ((typename Field::Father_t)F, FFLAS::FflasRight, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+				FFLAS::ftrsm (F, FFLAS::FflasRight, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
 					      B.rowdim(), R, F.one, A.getPointer(), A.getStride(), B.getPointer(), B.getStride());
 
-				FFLAS::fgemm ((typename Field::Father_t)F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+				FFLAS::fgemm (F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
 					      B.rowdim(), B.coldim() - R, R,
 					      F.one, Bp, B.getStride(), A.getPointer() + R, A.getStride,
 					      F.mOne, Bp + R, B.getStride());
@@ -429,7 +459,7 @@ namespace LinBox
 				linbox_check (A.rowdim() == b.size());
 				int info;
 
-				FFPACK::fgetrs ((typename Field::Father_t)F, FFLAS::FflasLeft, A.rowdim(), A.coldim(), 1, A.getRank(),
+				FFPACK::fgetrs (F, FFLAS::FflasLeft, A.rowdim(), A.coldim(), 1, A.getRank(),
 						A.getPointer(), A.getStride(), A.getP().getPointer(), A.getQ().getPointer(),
 						&x[0], 1, &b[0], 1, &info);
 				if (info > 0)
@@ -447,7 +477,7 @@ namespace LinBox
 				linbox_check (A.coldim() == A.rowdim());
 				linbox_check (A.coldim() == b.size());
 
-				FFPACK::fgetrs ((typename Field::Father_t)F, FFLAS::FflasLeft, b.size(), 1, A.getRank(),
+				FFPACK::fgetrs (F, FFLAS::FflasLeft, b.size(), 1, A.getRank(),
 						A.getPointer(), A.getStride(),
 						A.getP().getPointer(), A.getQ().getPointer(),
 						&b[0], 1, &info);
@@ -471,7 +501,7 @@ namespace LinBox
 				linbox_check (A.coldim() == b.size());
 				int info;
 
-				FFPACK::fgetrs ((typename Field::Father_t)F, FFLAS::FflasRight, A.rowdim(), A.coldim(), 1, A.getRank(),
+				FFPACK::fgetrs (F, FFLAS::FflasRight, A.rowdim(), A.coldim(), 1, A.getRank(),
 						A.getPointer(), A.getStride(),
 						A.getP().getPointer(), A.getQ().getPointer(),
 						&x[0], x.size(), &b[0], b.size(), &info);
@@ -490,7 +520,7 @@ namespace LinBox
 				linbox_check (A.coldim() == A.rowdim());
 				linbox_check (A.rowdim() == b.size());
 
-				FFPACK::fgetrs ((typename Field::Father_t)F, FFLAS::FflasRight, 1, b.size(), A.getRank(),
+				FFPACK::fgetrs (F, FFLAS::FflasRight, 1, b.size(), A.getRank(),
 						A.getPointer(), A.getStride(),
 						A.getP().getPointer(), A.getQ().getPointer(),
 						&b[0], b.size(), &info);
@@ -520,7 +550,7 @@ namespace LinBox
 			{
 				linbox_check (A.rowdim() == b.size());
 
-				FFPACK::solveLB2 ((typename Field::Father_t)F, FFLAS::FflasLeft, b.size(), 1, A.getRank(),
+				FFPACK::solveLB2 (F, FFLAS::FflasLeft, b.size(), 1, A.getRank(),
 						  A.getPointer(), A.getStride(),
 						  A.getQ().getPointer(), &b[0], 1);
 
@@ -533,11 +563,11 @@ namespace LinBox
 
 				// To be changed: solveLB is designed for matrices, not for vectors
 				if ( A.rowdim() <= A.coldim() ) {
-				FFPACK::solveLB((typename Field::Father_t) F, FFLAS::FflasLeft, n, 1, r, A.getPointer(), A.getStride(),
+				FFPACK::solveLB( F, FFLAS::FflasLeft, n, 1, r, A.getPointer(), A.getStride(),
 				A.getQ().getPointer(), &b[0], b.size() );
 				}
 				else
-				FFPACK::solveLB2((typename Field::Father_t) F, FFLAS::FflasLeft, n, 1, r, A.getPointer(), A.getStride(),
+				FFPACK::solveLB2( F, FFLAS::FflasLeft, n, 1, r, A.getPointer(), A.getStride(),
 				A.getQ().getPointer(), b.getPointer(), b.getStride() );
 				return b;
 
@@ -564,7 +594,7 @@ namespace LinBox
 			{
 				linbox_check (A.rowdim() == b.size());
 
-				FFPACK::solveLB2 ((typename Field::Father_t)F, FFLAS::FflasRight, 1, b.size(),  A.getRank(),
+				FFPACK::solveLB2 (F, FFLAS::FflasRight, 1, b.size(),  A.getRank(),
 						  A.getPointer(), A.getStride(),
 						  A.getQ().getPointer(), &b[0], b.size());
 				return b;
@@ -583,7 +613,7 @@ namespace LinBox
 				linbox_check (A.rowdim() == b.size());
 
 				bool consistent = true;
-				typename Field::Element * bp = &b[0];           ;
+				// typename Field::Element * bp = &b[0];           ;
 				typename Field::Element * xp = &x[0];
 
 				for (size_t i = A.getRank(); i < b.size(); ++i)
@@ -597,7 +627,7 @@ namespace LinBox
 				for (size_t i=0; i < A.getRank(); ++i)
 					F.assign (x[i], b[i]);
 
-				FFLAS::ftrsv ((typename Field::Father_t)F, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+				FFLAS::ftrsv (F, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
 					      A.getRank(), A.getPointer(), A.getStride(), xp, 1);
 
 				for (size_t i=A.getRank(); i < x.size(); ++i)
@@ -621,7 +651,7 @@ namespace LinBox
 				if (!consistent)
 					throw  LinboxMathInconsistentSystem ("Linear system is inconsistent");
 
-				FFLAS::ftrsv ((typename Field::Father_t)F, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+				FFLAS::ftrsv (F, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
 					      A.getRank(), A.getPointer(), A.getStride(), &b[0], 1);
 
 				return b;
@@ -639,21 +669,21 @@ namespace LinBox
 			{
 				linbox_check (x.size() == A.rowdim());
 				linbox_check (A.coldim() == b.size());
-				typename Field::Element * bp = b.getPointer();
+				// typename Field::Element * bp = b.getPointer();
 				typename Field::Element * xp = x.getPointer();
 				size_t R = A.getRank();
 
 				for (size_t i = 0; i < R; ++i)
 					F.assign (x[i], b[i]);
 
-				FFLAS::ftrsv ((typename Field::Father_t)F, FFLAS::FflasUpper, FFLAS::FflasTrans, FFLAS::FflasNonUnit,
+				FFLAS::ftrsv (F, FFLAS::FflasUpper, FFLAS::FflasTrans, FFLAS::FflasNonUnit,
 					      R, A.getPointer(), A.getStride(), xp, 1);
 
 				bool consistent = true;
 				if (b.size() > x.size()) {
 					typename Field::Element* W = new typename Field::Element [b.size() - R];
 
-					FFLAS::fgemv ((typename Field::Father_t)F, FFLAS::FflasTrans,
+					FFLAS::fgemv (F, FFLAS::FflasTrans,
 						      R, b.size() - R,
 						      F.one, A.getPointer() + R, A.getStride, xp, 1,
 						      F.zero, W, 1);
@@ -664,7 +694,7 @@ namespace LinBox
 					delete[] W;
 				}
 				else {
-					FFLAS::fgemv ((typename Field::Father_t)F, FFLAS::FflasTrans,
+					FFLAS::fgemv (F, FFLAS::FflasTrans,
 						      R, b.size() - R,
 						      F.one, A.getPointer() + R, A.getStride, xp, 1,
 						      F.zero, xp + R, 1);
@@ -691,10 +721,10 @@ namespace LinBox
 				typename Field::Element * bp = &b[0];
 				size_t R = A.getRank();
 
-				FFLAS::ftrsv ((typename Field::Father_t)F, FFLAS::FflasUpper, FFLAS::FflasTrans, FFLAS::FflasNonUnit,
+				FFLAS::ftrsv (F, FFLAS::FflasUpper, FFLAS::FflasTrans, FFLAS::FflasNonUnit,
 					      R, F.one, A.getPointer(), A.getStride(), bp, 1);
 
-				FFLAS::fgemv ((typename Field::Father_t)F, FFLAS::FflasTrans,
+				FFLAS::fgemv (F, FFLAS::FflasTrans,
 					      R, b.size() - R,
 					      F.one, A.getPointer() + R, A.getStride, bp, 1,
 					      F.mOne, bp + R, 1);
@@ -710,6 +740,303 @@ namespace LinBox
 			}
 		}; // end of class FactorizedMatrixRightUSolve
 
+		/*
+		 * Solvers with vectors: Operand=BlasVector<Field>
+		 */
+
+
+		template <class Field>
+		class FactorizedMatrixLeftSolve<Field, BlasVector<Field> > {
+		public:
+			BlasVector<Field>& operator() ( const Field& F,
+									   const LQUPMatrix<Field>& A,
+									   BlasVector<Field>& x,
+									   const BlasVector<Field>& b ) const
+			{
+				linbox_check (A.coldim() == x.size());
+				linbox_check (A.rowdim() == b.size());
+				int info;
+
+				FFPACK::fgetrs (F, FFLAS::FflasLeft, A.rowdim(), A.coldim(), 1, A.getRank(),
+						A.getPointer(), A.getStride(), A.getP().getPointer(), A.getQ().getPointer(),
+						&x[0], 1, &b[0], 1, &info);
+				if (info > 0)
+					throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
+
+				return x;
+			}
+
+			BlasVector<Field>& operator() ( const Field& F,
+									   const LQUPMatrix<Field>& A,
+									   BlasVector<Field>& b ) const
+			{
+
+				int info;
+				linbox_check (A.coldim() == A.rowdim());
+				linbox_check (A.coldim() == b.size());
+
+				FFPACK::fgetrs (F, FFLAS::FflasLeft, b.size(), 1, A.getRank(),
+						A.getPointer(), A.getStride(),
+						A.getP().getPointer(), A.getQ().getPointer(),
+						&b[0], 1, &info);
+				if (info > 0)
+					throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
+
+				return b;
+			}
+		}; // end of class FactorizedMatrixLeftSolve
+
+		template <class Field>
+		class FactorizedMatrixRightSolve<Field, BlasVector<Field> > {
+		public:
+
+			BlasVector<Field>& operator() ( const Field& F,
+									   const LQUPMatrix<Field>& A,
+									   BlasVector<Field>& x,
+									   const BlasVector<Field>& b ) const
+			{
+				linbox_check (A.rowdim() == x.size());
+				linbox_check (A.coldim() == b.size());
+				int info;
+
+				FFPACK::fgetrs (F, FFLAS::FflasRight, A.rowdim(), A.coldim(), 1, A.getRank(),
+						A.getPointer(), A.getStride(),
+						A.getP().getPointer(), A.getQ().getPointer(),
+						&x[0], x.size(), &b[0], b.size(), &info);
+				if (info > 0)
+					throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
+
+				return x;
+			}
+
+			BlasVector<Field>& operator() ( const Field& F,
+									   const LQUPMatrix<Field>& A,
+									   BlasVector<Field>& b ) const
+			{
+
+				int info;
+				linbox_check (A.coldim() == A.rowdim());
+				linbox_check (A.rowdim() == b.size());
+
+				FFPACK::fgetrs (F, FFLAS::FflasRight, 1, b.size(), A.getRank(),
+						A.getPointer(), A.getStride(),
+						A.getP().getPointer(), A.getQ().getPointer(),
+						&b[0], b.size(), &info);
+				if (info > 0)
+					throw LinboxMathInconsistentSystem ("Linear system is inconsistent");
+
+				return b;
+			}
+		}; // end of class FactorizedMatrixRightSolve
+
+		template <class Field>
+		class FactorizedMatrixLeftLSolve<Field, BlasVector<Field> > {
+		public:
+			BlasVector<Field>& operator() ( const Field& F,
+									   const LQUPMatrix<Field>& A,
+									   BlasVector<Field>& x,
+									   const BlasVector<Field>& b ) const
+			{
+				linbox_check( A.rowdim() == b.size() );
+				x = b;
+				return (*this)( F, A, x );
+			}
+
+			BlasVector<Field>& operator() ( const Field& F,
+									   const LQUPMatrix<Field>& A,
+									   BlasVector<Field>& b ) const
+			{
+				linbox_check (A.rowdim() == b.size());
+
+				FFPACK::solveLB2 (F, FFLAS::FflasLeft, b.size(), 1, A.getRank(),
+						  A.getPointer(), A.getStride(),
+						  A.getQ().getPointer(), &b[0], 1);
+
+				return b;
+
+#if 0 /* BB: unreachable  ! */
+				   size_t n = b.size(); // bds: b not B
+				   linbox_check( A.rowdim() == n );
+				   size_t r = A.getRank();
+
+				// To be changed: solveLB is designed for matrices, not for vectors
+				if ( A.rowdim() <= A.coldim() ) {
+				FFPACK::solveLB( F, FFLAS::FflasLeft, n, 1, r, A.getPointer(), A.getStride(),
+				A.getQ().getPointer(), &b[0], b.size() );
+				}
+				else
+				FFPACK::solveLB2( F, FFLAS::FflasLeft, n, 1, r, A.getPointer(), A.getStride(),
+				A.getQ().getPointer(), b.getPointer(), b.getStride() );
+				return b;
+
+#endif
+			}
+		}; // end of class FactorizedMatrixLeftLSolve
+
+		template <class Field>
+		class FactorizedMatrixRightLSolve<Field, BlasVector<Field> > {
+		public:
+			BlasVector<Field>& operator() ( const Field& F,
+									   const LQUPMatrix<Field>& A,
+									   BlasVector<Field>& x,
+									   const BlasVector<Field>& b ) const
+			{
+				linbox_check( A.rowdim() == b.size() );
+				x = b;
+				return (*this)( F, A, x );
+			}
+
+			BlasVector<Field>& operator() ( const Field& F,
+									   const LQUPMatrix<Field>& A,
+									   BlasVector<Field>& b ) const
+			{
+				linbox_check (A.rowdim() == b.size());
+
+				FFPACK::solveLB2 (F, FFLAS::FflasRight, 1, b.size(),  A.getRank(),
+						  A.getPointer(), A.getStride(),
+						  A.getQ().getPointer(), &b[0], b.size());
+				return b;
+			}
+		}; // end of class FactorizedMatrixRightLsolve
+
+		template <class Field>
+		class FactorizedMatrixLeftUSolve<Field, BlasVector<Field> > {
+		public:
+			BlasVector<Field>& operator() ( const Field& F,
+									   const LQUPMatrix<Field>& A,
+									   BlasVector<Field>& x,
+									   const BlasVector<Field>& b ) const
+			{
+				linbox_check (A.coldim() == x.size());
+				linbox_check (A.rowdim() == b.size());
+
+				bool consistent = true;
+				// typename Field::Element * bp = &b[0];           ;
+				typename Field::Element * xp = &x[0];
+
+				for (size_t i = A.getRank(); i < b.size(); ++i)
+					if (!F.isZero (b[i]))
+						consistent = false;
+				if (!consistent)
+					throw  LinboxMathInconsistentSystem ("Linear system is inconsistent");
+
+				// The last rows of B are now supposed to be 0
+
+				for (size_t i=0; i < A.getRank(); ++i)
+					F.assign (x[i], b[i]);
+
+				FFLAS::ftrsv (F, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+					      A.getRank(), A.getPointer(), A.getStride(), xp, 1);
+
+				for (size_t i=A.getRank(); i < x.size(); ++i)
+					F.assign (x[i], F.zero);
+				return x;
+
+			}
+
+			BlasVector<Field>& operator() ( const Field& F,
+									   const LQUPMatrix<Field>& A,
+									   BlasVector<Field>& b ) const
+			{
+
+				linbox_check (A.coldim() == A.rowdim());
+				linbox_check (A.coldim() == b.size());
+				bool consistent = true;
+
+				for (size_t i = A.getRank(); i < b.size(); ++i)
+					if (!F.isZero (b[i]))
+						consistent = false;
+				if (!consistent)
+					throw  LinboxMathInconsistentSystem ("Linear system is inconsistent");
+
+				FFLAS::ftrsv (F, FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+					      A.getRank(), A.getPointer(), A.getStride(), &b[0], 1);
+
+				return b;
+			}
+
+		}; // end of class FactorizedMatrixLeftUSolve
+
+		template <class Field>
+		class FactorizedMatrixRightUSolve<Field, BlasVector<Field> > {
+		public:
+			BlasVector<Field>& operator() ( const Field& F,
+									   const LQUPMatrix<Field>& A,
+									   BlasVector<Field>& x,
+									   const BlasVector<Field>& b ) const
+			{
+				linbox_check (x.size() == A.rowdim());
+				linbox_check (A.coldim() == b.size());
+				// typename Field::Element * bp = b.getPointer();
+				typename Field::Element * xp = x.getPointer();
+				size_t R = A.getRank();
+
+				for (size_t i = 0; i < R; ++i)
+					F.assign (x[i], b[i]);
+
+				FFLAS::ftrsv (F, FFLAS::FflasUpper, FFLAS::FflasTrans, FFLAS::FflasNonUnit,
+					      R, A.getPointer(), A.getStride(), xp, 1);
+
+				bool consistent = true;
+				if (b.size() > x.size()) {
+					typename Field::Element* W = new typename Field::Element [b.size() - R];
+
+					FFLAS::fgemv (F, FFLAS::FflasTrans,
+						      R, b.size() - R,
+						      F.one, A.getPointer() + R, A.getStride, xp, 1,
+						      F.zero, W, 1);
+
+					for (size_t i = 0; i < b.size() - R; ++i)
+						if (!F.areEqual (W[i], b[i + R]))
+							consistent = false;
+					delete[] W;
+				}
+				else {
+					FFLAS::fgemv (F, FFLAS::FflasTrans,
+						      R, b.size() - R,
+						      F.one, A.getPointer() + R, A.getStride, xp, 1,
+						      F.zero, xp + R, 1);
+
+					for (size_t i = R; i < b.size(); ++i)
+						if (!F.areEqual (x[i], b[i]))
+							consistent = false;
+				}
+
+				if (!consistent)
+					throw  LinboxMathInconsistentSystem ("Linear system is inconsistent");
+
+				for (size_t j = R; j < x.size(); ++j)
+					F.assign (x[j], F.zero);
+				return x;
+			}
+			BlasVector<Field>& operator() ( const Field& F,
+									   const LQUPMatrix<Field>& A,
+									   BlasVector<Field>& b ) const
+			{
+				linbox_check (A.coldim() == A.rowdim());
+				linbox_check (b.size() == A.rowdim());
+
+				typename Field::Element * bp = &b[0];
+				size_t R = A.getRank();
+
+				FFLAS::ftrsv (F, FFLAS::FflasUpper, FFLAS::FflasTrans, FFLAS::FflasNonUnit,
+					      R, F.one, A.getPointer(), A.getStride(), bp, 1);
+
+				FFLAS::fgemv (F, FFLAS::FflasTrans,
+					      R, b.size() - R,
+					      F.one, A.getPointer() + R, A.getStride, bp, 1,
+					      F.mOne, bp + R, 1);
+
+				bool consistent = true;
+				for (size_t j = R; j < b.size(); ++j)
+					if (!F.isZero (b[j]))
+						consistent = false;
+				if (!consistent)
+					throw  LinboxMathInconsistentSystem ("Linear system is inconsistent");
+
+				return b;
+			}
+		}; // end of class FactorizedMatrixRightUSolve
 
 	}
 }
@@ -717,8 +1044,9 @@ namespace LinBox
 namespace LinBox
 {
 	template <class Field>
-	LQUPMatrix<Field>::LQUPMatrix (const BlasMatrix<Field>& A) :
-		_field(A.field()), _factLU(*(new BlasMatrix<Field> (A))) ,
+	template <class _Rep>
+	LQUPMatrix<Field>::LQUPMatrix (const BlasMatrix<Field,_Rep>& A) :
+		_field(A.field()), _factLU(*(new BlasMatrix<Field,_Rep> (A))) ,
 		_permP(*(new BlasPermutation<size_t>(A.coldim()))),
 		_permQ(*(new BlasPermutation<size_t>(A.rowdim()))),
 		_m(A.rowdim()), _n(A.coldim()),
@@ -729,11 +1057,11 @@ namespace LinBox
 			_rank = 0 ;
 		}
 		else {
-			_rank= FFPACK::LUdivine((typename Field::Father_t) _field,FFLAS::FflasNonUnit,  FFLAS::FflasNoTrans,
+			_rank= FFPACK::LUdivine( _field,FFLAS::FflasNonUnit,  FFLAS::FflasNoTrans,
 						 _m, _n,
 						 _factLU.getPointer(),_factLU.getStride(),
-						 _permP.getWritePointer(), _permQ.getWritePointer(),
-						 FFPACK::FfpackLQUP );
+						 _permP.getWritePointer(), _permQ.getWritePointer());
+/*						 FFPACK::FfpackLQUP );*/
 		}
 		_permP.setOrder(_rank);
 		_permQ.setOrder(_rank);
@@ -741,8 +1069,9 @@ namespace LinBox
 	}
 
 	template <class Field>
-	LQUPMatrix<Field>::LQUPMatrix (BlasMatrix<Field>& A) :
-		_field(A.field()), _factLU(static_cast<BlasMatrix<Field>&> (A)) ,
+	template <class _Rep>
+	LQUPMatrix<Field>::LQUPMatrix (BlasMatrix<Field,_Rep>& A) :
+		_field(A.field()), _factLU(static_cast<BlasMatrix<Field,_Rep>&> (A)) ,
 		_permP(*(new BlasPermutation<size_t>(A.coldim()))),
 		_permQ(*(new BlasPermutation<size_t>(A.rowdim()))),
 		// _permP(A.coldim()), _permQ(A.rowdim()),
@@ -754,11 +1083,11 @@ namespace LinBox
 			_rank = 0 ;
 		}
 		else {
-			_rank= FFPACK::LUdivine((typename Field::Father_t) _field,FFLAS::FflasNonUnit,  FFLAS::FflasNoTrans,
+			_rank= FFPACK::LUdivine( _field,FFLAS::FflasNonUnit,  FFLAS::FflasNoTrans,
 						 _m, _n,
 						 _factLU.getPointer(),_factLU.getStride(),
-						 _permP.getWritePointer(), _permQ.getWritePointer(),
-						 FFPACK::FfpackLQUP );
+						 _permP.getWritePointer(), _permQ.getWritePointer());
+/*						 FFPACK::FfpackLQUP );*/
 		}
 		_permP.setOrder(_rank);
 		_permQ.setOrder(_rank);
@@ -766,9 +1095,10 @@ namespace LinBox
 	}
 
 	template <class Field>
-	LQUPMatrix<Field>::LQUPMatrix (const BlasMatrix<Field>& A,
+	template <class _Rep>
+	LQUPMatrix<Field>::LQUPMatrix (const BlasMatrix<Field,_Rep>& A,
 				       BlasPermutation<size_t> & P, BlasPermutation<size_t> & Q) :
-		_field(A.field()), _factLU(*(new BlasMatrix<Field> (A))) ,
+		_field(A.field()), _factLU(*(new BlasMatrix<Field,_Rep> (A))) ,
 		_permP(P), _permQ(Q),
 		_m(A.rowdim()), _n(A.coldim()),
 		_alloc(true),_plloc(false)
@@ -778,11 +1108,11 @@ namespace LinBox
 		linbox_check(_permP.getOrder()==A.coldim());
 
 
-		_rank= FFPACK::LUdivine((typename Field::Father_t) _field,FFLAS::FflasNonUnit,  FFLAS::FflasNoTrans,
+		_rank= FFPACK::LUdivine( _field,FFLAS::FflasNonUnit,  FFLAS::FflasNoTrans,
 					 _m, _n,
 					 _factLU.getPointer(),_factLU.getStride(),
-					 _permP.getWritePointer(), _permQ.getWritePointer(),
-					 FFPACK::FfpackLQUP );
+					 _permP.getWritePointer(), _permQ.getWritePointer());
+/*					 FFPACK::FfpackLQUP );*/
 
 		_permP.setOrder(_rank);
 		_permQ.setOrder(_rank);
@@ -790,9 +1120,10 @@ namespace LinBox
 	}
 
 	template <class Field>
-	LQUPMatrix<Field>::LQUPMatrix (BlasMatrix<Field>& A,
+	template <class _Rep>
+	LQUPMatrix<Field>::LQUPMatrix (BlasMatrix<Field,_Rep>& A,
 				       BlasPermutation<size_t> & P, BlasPermutation<size_t> & Q) :
-		_field(A.field()), _factLU(static_cast<BlasMatrix<Field>&> (A)) ,
+		_field(A.field()), _factLU(static_cast<BlasMatrix<Field,_Rep>&> (A)) ,
 		_permP(P), _permQ(Q),
 		_m(A.rowdim()), _n(A.coldim()),
 		_alloc(false),_plloc(false)
@@ -807,11 +1138,14 @@ namespace LinBox
 			_permP.resize(A.coldim());
 
 
-		_rank= FFPACK::LUdivine((typename Field::Father_t) _field,FFLAS::FflasNonUnit,  FFLAS::FflasNoTrans,
-					 _m, _n,
-					 _factLU.getPointer(),_factLU.getStride(),
-					 _permP.getWritePointer(), _permQ.getWritePointer(),
-					 FFPACK::FfpackLQUP );
+		_rank= FFPACK::LUdivine<Field>( _field,FFLAS::FflasNonUnit,  FFLAS::FflasNoTrans,
+                                                _m, _n,
+                                                _factLU.getPointer(),_factLU.getStride(),
+                                                _permP.getWritePointer(), _permQ.getWritePointer());
+
+                /*					 FFPACK::FfpackLQUP );*/
+               
+                       
 		_permP.setOrder(_rank);
 		_permQ.setOrder(_rank);
 
@@ -881,15 +1215,16 @@ namespace LinBox
 
 	// get the Matrix L
 	template <class Field>
-	inline TriangularBlasMatrix<Field>&
-	LQUPMatrix<Field>::getL( TriangularBlasMatrix<Field>& L,
+		template<class _Rep>
+	inline TriangularBlasMatrix<Field,_Rep>&
+	LQUPMatrix<Field>::getL( TriangularBlasMatrix<Field,_Rep>& L,
 				 bool _QLUP ) const
 	{
 
 		linbox_check( L.coldim() == _m);
 		linbox_check( L.rowdim() == _m);
-		linbox_check( L.getUpLo() == LinBoxTag::Lower);
-		linbox_check( L.getDiag() == LinBoxTag::Unit);
+		linbox_check( L.getUpLo() == Tag::Shape::Lower);
+		linbox_check( L.getDiag() == Tag::Diag::Unit);
 
 #if 0
 		if (_m > _n) {
@@ -932,17 +1267,17 @@ namespace LinBox
 #endif
 
 		if (!_permQ.isIdentity())
-			FFPACK::applyP((typename Field::Father_t) _field, FFLAS::FflasRight, FFLAS::FflasNoTrans,
+			FFPACK::applyP( _field, FFLAS::FflasRight, FFLAS::FflasNoTrans,
 					_m,0,(int)_permQ.getOrder(),
 					L.getWritePointer(), _m, _permQ.getPointer() );
 		for ( size_t i=0; i<_m; ++i )
 			L.setEntry( i, i, _field.one );
 		if (_QLUP) {
 			if (!_permQ.isIdentity()) {
-				FFPACK::applyP((typename Field::Father_t) _field, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
+				FFPACK::applyP( _field, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
 						_m,0,(int)_permQ.getOrder(),
 						L.getWritePointer(), _m, _permQ.getPointer() );
-				FFPACK::applyP((typename Field::Father_t) _field, FFLAS::FflasRight, FFLAS::FflasTrans,
+				FFPACK::applyP( _field, FFLAS::FflasRight, FFLAS::FflasTrans,
 						_m,0,(int)_permQ.getOrder(),
 						L.getWritePointer(), _m, _permQ.getPointer() );
 
@@ -955,14 +1290,15 @@ namespace LinBox
 
 	// get the matrix U
 	template <class Field>
-	inline TriangularBlasMatrix<Field>&
-	LQUPMatrix<Field>::getU( TriangularBlasMatrix<Field>& U ) const
+		template<class _Rep>
+	inline TriangularBlasMatrix<Field,_Rep>&
+	LQUPMatrix<Field>::getU( TriangularBlasMatrix<Field,_Rep>& U ) const
 	{
 
 		linbox_check( U.rowdim() == _m);
 		linbox_check( U.coldim() == _n);
-		linbox_check( U.getUpLo() == LinBoxTag::Upper);
-		linbox_check( U.getDiag() == LinBoxTag::NonUnit);
+		linbox_check( U.getUpLo() == Tag::Shape::Upper);
+		linbox_check( U.getDiag() == Tag::Diag::NonUnit);
 		for ( size_t i=0; i<_m; ++i )
 			for ( size_t j=i; j<_n; ++j )
 				U.setEntry( i, j, _factLU.getEntry(i,j) );
@@ -971,8 +1307,9 @@ namespace LinBox
 
 	// get the Matrix S (from the LSP factorization of A deduced from LQUP)
 	template <class Field>
-	inline BlasMatrix<Field>&
-	LQUPMatrix<Field>::getS( BlasMatrix<Field>& S) const
+	template<class _Rep>
+	inline BlasMatrix<Field,_Rep>&
+	LQUPMatrix<Field>::getS( BlasMatrix<Field,_Rep>& S) const
 	{
 
 		linbox_check( S.rowdim() == _m);
@@ -985,7 +1322,7 @@ namespace LinBox
 		}
 
 		if (!_permQ.isIdentity())
-			FFPACK::applyP((typename Field::Father_t) _field, FFLAS::FflasLeft, FFLAS::FflasTrans,
+			FFPACK::applyP( _field, FFLAS::FflasLeft, FFLAS::FflasTrans,
 					_n, 0,(int) _permQ.getOrder(),
 					S.getWritePointer(), _n, _permQ.getPointer() );
 		return S;
@@ -1018,7 +1355,7 @@ namespace LinBox
 	template <class Operand>
 	Operand& LQUPMatrix<Field>::left_solve(Operand& B) const
 	{
-		return Protected::FactorizedMatrixLeftSolve<Field,Operand>()( _field, *this, B );
+		return Protected::FactorizedMatrixLeftSolveIP<Field,Operand>()( _field, *this, B );
 	}
 
 	// solve XA=B
@@ -1034,7 +1371,7 @@ namespace LinBox
 	template <class Operand>
 	Operand& LQUPMatrix<Field>::right_solve(Operand& B) const
 	{
-		return Protected::FactorizedMatrixRightSolve<Field,Operand>()( _field, *this, B );
+		return Protected::FactorizedMatrixRightSolveIP<Field,Operand>()( _field, *this, B );
 	}
 
 	// solve LX=B (L from LQUP)
@@ -1108,11 +1445,10 @@ namespace LinBox
 #endif // __LINBOX_factorized_matrix_INL
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/grid.h b/linbox/matrix/grid.h
new file mode 100644
index 0000000..8fedc54
--- /dev/null
+++ b/linbox/matrix/grid.h
@@ -0,0 +1,612 @@
+/* Copyright (C) LinBox
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_matrix_grid_H
+#define __LINBOX_matrix_grid_H
+
+#include <iostream>
+
+#include <vector>
+#include <queue>
+
+#include "linbox/linbox-config.h"
+#include "linbox/integer.h"
+
+
+namespace LinBox
+{
+
+	template <class Element>
+	class ijElement {
+
+	public:
+		size_t i;
+		size_t j;
+		Element x;
+
+		ijElement(size_t ii, size_t jj, Element xx) {i=ii;j=jj;x=xx;}
+		ijElement(ijElement& Y) {i = Y.i; j = Y.j; x = Y.x;}
+		~ijElement() {};
+		//Element& setElement(Element& y) {return x=y;}
+	};
+
+	template <class Element>
+	class GridElement {
+
+	public:
+		GridElement* prev;
+		GridElement* next;
+		GridElement* down;
+		GridElement* up;
+		ijElement<Element> X;
+
+		GridElement(ijElement<Element>& Y) :
+			X(Y)
+		{
+			prev = NULL;
+			next = NULL;
+			down = NULL;
+			up = NULL;
+		}
+
+		GridElement(size_t i, size_t j, Element x) :
+			X(i,j,x)
+		{
+			prev = NULL;
+			next = NULL;
+			down = NULL;
+			up = NULL;
+		}
+
+		~GridElement()
+		{
+			//prev = NULL; next = NULL; down = NULL; up = NUll;
+		}
+
+		Element& getX() {return X.x;}
+		size_t getI() {return X.i;}
+		size_t getJ() {return X.j;}
+
+		Element& setElement(Element& y) {return X.x=y;}
+		ijElement<Element>& setijElement(size_t i, size_t j, Element& x) {X.i=i; X.j = j; X.x = x; return X;}
+	};
+
+	template <class Field, class Element>
+	class Grid {
+
+	public:
+		Field _field;
+		size_t _n;
+		size_t _m;
+		std::vector<int> rowOcc;
+		//std::vector<Element> rowGcd;
+		std::vector<int> colOcc;
+		//std::vector<Element> colGcd;
+
+		std::queue<size_t> Q; //change to priority queue?
+		std::vector<GridElement<Element>*> A; 	//std::vector of row heads
+		std::vector<GridElement<Element>*> AT;	//std::vector of column heads
+
+		/*
+		 * Creates Grid from file using read procedure
+		 * file is sorted in sms format
+		 */
+		Grid (Field F, std::istream& in, std::vector<int>& mR, std::vector<int>& mC) :
+			_field(F)
+		{
+			read(F, in, mR, mC);
+			in >> _m >> _n;
+		}
+
+
+		/*
+		 * reads the matrix from the file, deletes mC[i]=1 columns
+		 * sets row/col Occ and Gcd
+		 * file is sorted in sms format
+		 */
+		void read(Field F, std::istream& in, std::vector<int>& mR, std::vector<int>& mC)
+		{
+			in >> _m >> _n;
+			/* !!! */
+			//int t= _m;
+			//_m = _n;
+			//_n = t;
+			rowOcc.resize(_m,0);
+			colOcc.resize(_n,0);
+			//rowGcd.resize(_m,0);
+			//colGcd.resize(_n,0);
+			A.resize(_m, NULL);
+			AT.resize(_n, NULL);
+
+			mR.resize(_m);
+			mC.resize(_n);
+			char c;
+			do in >> c; while (isspace (c));
+
+			std::vector<GridElement<Element>*> ends(_n, NULL);
+
+			if (c == 'M') {
+				// size_t i, i_prev, j, j_prev;
+				size_t i = 0, j = 0 ;
+				// i_prev = 0;
+				// j_prev = 0;
+
+				Element x, x_prev; x_prev = 0; x=0;
+				while (in >> i) {
+					in >> j;
+					/* !!! */
+					//int t = i; i=j; j=t;
+					if ( (i > _m) || (j > _n) ) {
+						std::cout << "InvalidMatrixInput \n"<< std::flush;
+						return;
+					}
+					F.read(in, x);
+					if ((j > 0) && (F.isZero(x))) continue;
+					if ((j > 0) && (mC[j-1]==1)){
+						continue;       //mC are to be ignored;
+					}
+					if ((i!=0) && (j !=0 )) {
+						ijElement<Element> X(i-1,j-1,x);
+						ends[j-1] = addElement(ends[j-1], X);
+					}
+					if ((i==0) && (j ==0 )) break;
+				}
+				for (int k=0; k < rowOcc.size(); ++k) {
+					if ((rowOcc[k]==1) && (/*colGcd[A[k]->getJ()]*/1==abs(A[k]->getX()))) {
+						//std::cout << "1 row" << i_prev << "\n";
+						//std::cout << "Adding " << k+1 << " to Q\n" << std::flush;
+						Q.push(k);
+					}
+				}
+			}
+			mC.clear();
+			mC.resize(_n,0);
+
+		}
+
+		/*
+		 * deletes the non-null element Aij
+		 */
+		GridElement<Element>* deleteElement(GridElement<Element>* Aij)
+		{
+			if (Aij->prev != NULL) Aij->prev->next = Aij->next;
+			else A[Aij->getI()] = Aij->next;
+			if (Aij->next != NULL) Aij->next->prev = Aij->prev;
+			if (Aij->down != NULL) Aij->down->up = Aij->up;
+			else AT[Aij->getJ()] = Aij->up;
+			if (Aij->up != NULL)   Aij->up->down = Aij->down;
+			--rowOcc[Aij->getI()];
+			if (rowOcc[Aij->getI()]==1) {
+				//std::cout << "Adding " << Aij->getI()+1 << " to Q\n" << std::flush;
+				if (1/*colGcd[A[Aij->getI()]->getJ()]*/ == abs (A[Aij->getI()]->getX()))
+					Q.push(Aij->getI());
+			}
+			--colOcc[Aij->getJ()];
+			GridElement<Element>* tmp = Aij->up;
+			delete Aij;
+			return tmp;
+		}
+
+		void deleteColumn (size_t j)
+		{
+			colOcc[j] = 0;
+			GridElement<Element>* tmp = AT[j];
+			while (tmp != NULL) {
+				--rowOcc[tmp->getI()];
+				if (rowOcc[tmp->getI()] ==1) {
+					//std::cout << "Adding " << tmp->getI()+1 << " to Q\n" << std::flush;
+					if ( 1/*colGcd[A[tmp->getI()]->getJ()]*/ == abs (A[tmp->getI()]->getX()))
+						Q.push(tmp->getI());
+				}
+				if (tmp->prev != NULL) tmp->prev->next = tmp->next;
+				else A[tmp->getI()] = tmp->next;
+				if (tmp->next != NULL) tmp->next->prev = tmp->prev;
+				GridElement<Element>* tmp2 = tmp->up;
+				delete tmp;
+				tmp = tmp2;
+			}
+		}
+
+		void deleteRow (size_t i)
+		{
+			rowOcc[i] = 0;
+			GridElement<Element>* tmp = A[i];
+			while (tmp != NULL) {
+				--colOcc[tmp->getJ()];
+				if (tmp->down != NULL) tmp->down->up = tmp->up;
+				else AT[tmp->getJ()] = tmp->up;
+				if (tmp->up != NULL) tmp->up->down = tmp->down;
+				GridElement<Element>* tmp2 = tmp->next;
+				delete tmp;
+				tmp = tmp2;
+			}
+		}
+
+		/*
+		 * adds a new Grid Element after (at ''up'') the given GridElement
+		 * if lower==NULL Y should be the lowest element of the column
+		 * returns a pointer to the new element
+		 */
+		GridElement<Element>* addElement(GridElement<Element>* lower, ijElement<Element>& Y)
+		{
+			++rowOcc[Y.i];
+			++colOcc[Y.j];
+			//rowGcd[Y.i]=gcd(rowGcd[Y.i], Y.x);
+			//colGcd[Y.j]=gcd(colGcd[Y.j], Y.x);
+			GridElement<Element>* X = new GridElement<Element>(Y);
+			if (lower != NULL) {
+				GridElement<Element>* tmp = lower->up;
+				lower->up = X;
+				X->down = lower;
+				X->up = tmp;
+				if (tmp != NULL) tmp->down = X;
+				tmp = A[Y.i];
+				A[Y.i] = X;
+				X->next = tmp;
+				if (tmp != NULL) tmp->prev = X;
+			}
+			else {
+				GridElement<Element>* tmp = AT[Y.j];
+				AT[Y.j] = X;
+				X->up = tmp;
+				if (tmp != NULL) tmp->down = X;
+				tmp = A[Y.i];
+				A[Y.i] = X;
+				X->next = tmp;
+				if (tmp != NULL) tmp->prev = X;
+			}
+			return X;
+		}
+
+		/*
+		 * recursive procedure to reduce the grid
+		 * returns precomputed rank
+		 */
+
+		int reduce(int& rank, int S, std::vector<int>& mR, std::vector<int>& mC, std::ostream& os)
+		{
+			std::cout << "rank at begin reduce " << rank << "\n" << std::flush;
+			while (!Q.empty()) {
+				size_t i=Q.front();
+				Q.pop();
+				if (rowOcc[i]==1) {//if row not deleted
+					size_t j = A[i]->getJ();
+					Element x; _field.init(x, A[i]->getX());
+					if (mC[j]==1) {//if col deleted (not needed as we delete at once)
+						mR[i]=2;
+					}
+					else if (abs(x)==1/*colGcd[j]*/) {
+						//std::cout << "Row/column "<< i+1 << "," << j+1<< "," << x << "to reduce\n" <<std::flush;
+						if (abs(x) > 1) std::cout << "adds " << x << "to the diagonal\n"<< std::flush;
+						if (mC[j] !=1 ) {//if col not deleted then delete, update rank
+							++rank;
+							mC[j]=1;
+							mR[i]=1;
+							deleteColumn(j);//do not mark 0 rows
+							//deleteRow(i);//not needed
+						}
+					} //else std::cout << "NOT Row/column "<< i+1 << "," << j+1<< "," << x << "to reduce\n" <<std::flush;
+				}
+			}
+
+			std::cout << "Rank at end reduce/begin elimination" << rank <<"\n" << std::flush;
+
+			size_t ini=0;
+
+			size_t row2;
+			size_t j1,j2;
+			Element x,x1,x2;
+			x1=1;x2=1;x=0;
+
+			while (1) {
+			bool pivotFound;
+				pivotFound =false;
+				if (ini>=mR.size()) ini=0;
+				for (size_t i=ini; i <  mR.size(); ++i) {
+					if (rowOcc[i]==2) {
+						//std::cout << "2 row found " << i <<"\n" << std::flush;
+						j1 = A[i]->getJ();
+						_field.init(x1,A[i]->getX());
+						j2 = A[i]->next->getJ();
+						_field.init(x2,A[i]->next->getX());
+						if ((abs(x1)==1/*rowGcd[i]*/) && (abs(x1)== 1/*colGcd[j1]*/)) {
+							if ((abs(x2)== 1/*rowGcd[i]*/) && (abs(x2)==1/*colGcd[j2]*/) && (colOcc[j1]> colOcc[j2])) {
+								size_t jj = j1;
+								Element xx = x1;
+								j1 =j2;x1=x2;
+								j2 = jj;x2=xx;
+							}
+							pivotFound = true;
+							row2=i;
+							ini = i+1; break;
+						}
+						else
+							if ((abs(x2)==1/*rowGcd[i]*/) && (abs(x2)== 1/*colGcd[j2]*/)) {
+								size_t jj = j1;
+								Element xx = x1;
+								j1 =j2;x1=x2;
+								j2 = jj;x2=xx;
+								pivotFound = true;
+								row2=i;
+								ini = i+1;break;
+							}
+
+					}
+				}
+
+				//pivotFound =false;
+				if (pivotFound) {
+					if (abs(x1)>1) std::cout << "adds " << x1 << "to the diagonal\n" << std::flush;
+					mC[j1]=1;
+					++rank;
+					mR[row2]=1;
+					_field.init(x, -x2/x1);
+					//std::cout << "found " << j1 << "," << x2 << "," << j2 << "," << x2 << "\n"<< std::flush;
+					////std::cout << "reducing column " << j2+1 << " by  (" << j1+1 << "," << x << "}\n" << std::flush;
+					//std::cout << "row " << row2 << "\n"<<std::flush;
+
+					GridElement<Element>* p1=AT[j1];
+					GridElement<Element>* p2=NULL;
+					GridElement<Element>* p2next=AT[j2];
+
+					while (p1 != NULL) {
+						while (p2next != NULL) {
+							if (p2next->getI() >= p1->getI()) break;
+							p2 = p2next;
+							p2next = p2next->up;
+						}
+						Element y; _field.init(y, p1->getX());
+						Element z;
+						if ((p2next!= NULL) && (p2next->getI()==p1->getI()) ) {
+							//std::cout << "updating " << p2next->getI() << " row" << std::flush;
+							_field.init (z, x*y)	;
+							_field.addin(z, p2next->getX());
+							if (z==0) {
+								//std::cout << ".....deleting \n" << std::flush;
+								p2next = deleteElement(p2next);
+							}
+							else {
+								//std::cout << ".....new value\n" << std::flush;
+								p2next->setElement(z);
+								p2 = p2next;
+								p2next = p2next->up;
+							}
+						}
+						else {
+							//std::cout << "adding " << p1->getI() << " row\n" << std::flush;
+							_field.init(z, x*y);
+							ijElement<Element> X(p1->getI(), j2, z);
+							p2=addElement(p2, X);
+						}
+
+						p1 = deleteElement(p1);
+					}
+
+					if (!Q.empty()) {
+						size_t i = Q.front();
+						while (rowOcc[i] != 1) {
+							Q.pop();
+							if (Q.empty()) break;
+							i = Q.front();
+						}
+						if (!Q.empty()) {
+							//std::cout << "Adding " << i+1 << " to Q \n" << std::flush;
+							reduce(rank, S, mR, mC,os);
+							break;
+						}
+					}
+				}
+				else {
+					std::cout << "Elimination of " << S-1<< " rows at rank " <<rank << "\n" << std::flush;
+
+					size_t i =0;
+					// bool tworow=false;
+					int init_rank = rank;
+					while  (1) {
+						while (i < _m) {
+							if (rowOcc[i]==0) ++i;
+							else if (rowOcc[i]<S)  break;
+							else ++i;
+						}
+						if (i>=_m) break;
+						//std::cout << "Elimination of row " << i+1 << std::endl << std::flush;
+						//std::cout << "RowGcd=" << rowGcd[i] << "\n" << std::flush;
+						GridElement<Element>* r_p = A[i];
+						int min_col = _m+1;
+						Element xx1;
+						int j=-1;
+						std::vector<std::pair< size_t, GridElement<Element>*> > j_pts ;
+						std::vector<std::pair< Element, GridElement<Element>*> > jnext_pts ;
+						while (r_p != NULL) {
+							if ((colOcc[r_p->getJ()] < _m+1) && (colOcc[r_p->getJ()] < min_col)) {
+								if ((abs(r_p->getX()) == 1/*rowGcd[i]*/) && (abs(r_p->getX())==1/*colGcd[r_p->getJ()]*/)) {
+									if (j != -1) {
+										j_pts.push_back(std::pair<size_t, GridElement<Element>*>  (j, NULL) );
+										jnext_pts.push_back(std::pair<Element, GridElement<Element>*>  (xx1, AT[j]));
+									}
+									min_col = colOcc[r_p->getJ()];
+									_field.init(xx1, r_p->getX());
+									j = r_p->getJ();
+								}
+								else {
+									j_pts.push_back( std::pair<size_t, GridElement<Element>*>  (r_p->getJ(), NULL));
+									jnext_pts.push_back( std::pair<Element, GridElement<Element>*>  (r_p->getX(), AT[r_p->getJ()]));
+								}
+							}
+							else {
+								j_pts.push_back(std::pair<size_t, GridElement<Element>*>  (r_p->getJ(), NULL));
+								jnext_pts.push_back(std::pair<Element, GridElement<Element>*>  (r_p->getX(), AT[r_p->getJ()]));
+							}
+
+							r_p = r_p->next;
+						}
+
+						j_pts.resize(rowOcc[i]-1);
+						jnext_pts.resize(rowOcc[i]-1);
+						if (j < 0) {
+							++i; continue;
+						}
+
+						if ((abs(xx1) == 1/*rowGcd[i]*/) && (abs(xx1)==1/*colGcd[j]*/)) {
+							if (abs(xx1) > 1) std::cout << "adds " << xx1 << "to the diagonal\n"<<std::flush;
+							//std::cout << "Eliminating row "<< i+1 << " by column "<< j+1 << "\n";
+							//std::cout << "Element x" << x << "\n" << std::flush;
+
+							mR[i] = 1;
+							mC[j] = 1;
+							++rank;
+
+							GridElement<Element>* p1=AT[j];
+
+							while (p1 != NULL) {
+								typename std::vector<std::pair< size_t, GridElement<Element>*> >::iterator p2 = j_pts.begin();
+								typename std::vector<std::pair< Element, GridElement<Element>*> >::iterator p2next = jnext_pts.begin();
+								for (; p2 != j_pts.end(); ++p2, ++p2next) {
+									//std::cout << "eliminating column " << p2->first << "\n" << std::flush;
+									Element x; _field.init(x, -(p2next->first)/xx1);
+
+									while (p2next->second != NULL) {
+										if (p2next->second->getI() >= p1->getI()) break;
+										p2->second = p2next->second;
+										p2next->second = p2next->second->up;
+									}
+									Element y; _field.init(y, p1->getX());
+									Element z;
+									if ((p2next->second!= NULL) && (p2next->second->getI()==p1->getI()) ) {
+										//std::cout << "updating " << p2next->second->getI() << " row" << std::flush;
+										_field.init (z, x*y)        ;
+										_field.addin(z, p2next->second->getX());
+										if (z==0) {
+											//std::cout << ".....deleting \n" << std::flush;
+											p2next->second = deleteElement(p2next->second);
+										}
+										else {
+											//std::cout << ".....new value\n" << std::flush;
+											p2next->second->setElement(z);
+											p2->second = p2next->second;
+											p2next->second = p2next->second->up;
+										}
+									}
+									else {
+										//std::cout << "adding " << p1->getI() << " row\n" << std::flush;
+										_field.init(z, x*y);
+										ijElement<Element> X(p1->getI(), p2->first, z);
+										p2->second=addElement(p2->second, X);
+									}
+								}
+								p1 = deleteElement(p1);
+							}
+						}
+						++i;
+						if (!Q.empty()) {
+							size_t k = Q.front();
+							while (rowOcc[k] != 1) {
+								Q.pop();
+								if (Q.empty()) break;
+								k = Q.front();
+							}
+							if (!Q.empty()) {
+								//std::cout << "breaking at " << i << " row\n" << std::flush;
+								break;
+							}
+						}
+					}
+
+					if ((!Q.empty()) || (rank - init_rank > 100)) {
+						reduce(rank, S, mR, mC,os);
+					}
+					break;
+				}
+			}
+			return rank;
+		}
+
+		void write (std::ostream& out)
+		{
+			size_t Omega =0;
+			out << _n << " " << _m << " M\n";
+			std::vector<int>::iterator occ_iter = colOcc.begin();
+			int j =0;
+			for (;occ_iter != colOcc.end(); ++occ_iter,++j) {
+				if (*occ_iter > 0) {
+					*occ_iter = 0;
+					GridElement<Element>* tmp = AT[j];
+					GridElement<Element>* tmp2;
+					while (tmp != NULL) {
+						++Omega;
+						out << tmp->getJ()+1 <<" " << tmp->getI()+1 << " " << tmp->getX() << "\n";
+						tmp2 = tmp->up;
+						delete tmp;
+						tmp = tmp2;
+					}
+				}
+			}
+			out << "0 0 0\n";
+			std::cout << "Omega: " << Omega << "\n" << std::flush;
+			rowOcc.clear();
+			colOcc.clear();
+			//rowGcd.clear();
+			//colGcd.clear();
+			A.clear();
+			AT.clear();
+
+		}
+
+		~Grid()
+		{
+
+			std::vector<int>::iterator occ_iter = colOcc.begin();
+			int j =0;
+			for (;occ_iter != colOcc.end(); ++occ_iter,++j) {
+				if (*occ_iter > 0) {
+					GridElement<Element>* tmp = AT[j];
+					GridElement<Element>* tmp2;
+					while (tmp != NULL) {
+						tmp2 = tmp->up;
+						delete tmp;
+						tmp = tmp2;
+					}
+				}
+			}
+
+			rowOcc.clear();
+			colOcc.clear();
+			//rowGcd.clear();
+			//colGcd.clear();
+			A.clear();
+			AT.clear();
+
+		}
+	};
+
+}
+
+#endif //__LINBOX_matrix_grid_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/matrix-category.h b/linbox/matrix/matrix-category.h
index 6eed813..675befe 100644
--- a/linbox/matrix/matrix-category.h
+++ b/linbox/matrix/matrix-category.h
@@ -26,20 +26,27 @@
 #ifndef __LINBOX_matrix_category_H
 #define __LINBOX_matrix_category_H
 
-#include "linbox/matrix/sparse.h"
-// #include "linbox/matrix/blas-matrix.h"
-
-#include "linbox/blackbox/sparse.h"
-
 
 namespace LinBox
 {
 
-	template<class _Field>
-	class BlasMatrix ;
 
-	template<class _Field>
-	class BlasSubmatrix ;
+	/** \brief For specializing matrix arithmetic
+	 *
+	 * This class defines matrix categories that allow us to specialize the matrix
+	 * arithmetic in \ref MatrixDomain for different matrix representations. For
+	 * example, a sparse matrix may have an efficient iterator over row vectors but
+	 * not over column vectors. Therefore, an algorithm that tries to iterate over
+	 * column vectors will run very slowly. Hence a specialization that avoids using
+	 * column vectors is used instead.
+	 */
+	struct MatrixCategories {
+		struct BlackboxTag { };
+		struct IndexedMatrixTag : public virtual BlackboxTag { } ;
+		struct RowMatrixTag : public virtual BlackboxTag { };
+		struct ColMatrixTag : public virtual BlackboxTag { };
+		struct RowColMatrixTag : public RowMatrixTag, public ColMatrixTag { };
+	};
 
 
 	struct MatrixContainerCategory {
@@ -48,60 +55,18 @@ namespace LinBox
 		struct Blackbox{};
 	};
 
-	template <class Matrix>
-	class MatrixContainerTrait {
-	public:
-		typedef MatrixContainerCategory::Blackbox Type;
-	};
-
-	template <class Field>
-	class MatrixContainerTrait<BlasMatrix<Field> > {
-	public:
-		typedef MatrixContainerCategory::BlasContainer Type;
-	};
 
-	template <class Field>
-	class MatrixContainerTrait<const BlasMatrix<Field> > {
-	public:
-		typedef MatrixContainerCategory::BlasContainer Type;
-	};
 
-#if 0
-	template <class Field>
-	class MatrixContainerTrait<BlasMatrix<Field> > {
-	public:
-		typedef MatrixContainerCategory::BlasContainer Type;
-	};
-#endif
-
-	template <class Field>
-	class MatrixContainerTrait<const BlasSubmatrix<Field> > {
-	public:
-		typedef MatrixContainerCategory::BlasContainer Type;
-	};
-
-	template <class Element>
-	class MatrixContainerTrait<SparseMatrixBase<Element> > {
-	public:
-		typedef MatrixContainerCategory::Container Type;
-	};
-
-	template <class Field>
-	class MatrixContainerTrait<SparseMatrix<Field> > {
-	public:
-		typedef MatrixContainerCategory::Container Type;
-	};
 
 }
 
 #endif //__LINBOX_matrix_category_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/matrix-domain.doxy b/linbox/matrix/matrix-domain.doxy
new file mode 100644
index 0000000..bbe3348
--- /dev/null
+++ b/linbox/matrix/matrix-domain.doxy
@@ -0,0 +1,32 @@
+// Copyright 2014 LinBox. See COPYING for licence information.
+/*
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/**  \ingroup matrix
+ * \defgroup matrixdomain Matrix Domain
+ * \brief Matrix domain operations
+ *
+ * NO DOC YET
+ *
+ */
+
+// vim:syn=doxygen
diff --git a/linbox/matrix/matrix-domain.h b/linbox/matrix/matrix-domain.h
index 2113b28..f855eb4 100644
--- a/linbox/matrix/matrix-domain.h
+++ b/linbox/matrix/matrix-domain.h
@@ -1,71 +1,50 @@
-/* linbox/matrix/matrix-domain.h
- * Copyright (C) 2002 Zhendong Wan, Bradford Hovinen
- *
- * Written by Zhendong Wan <wan at mail.eecis.udel.edu>,
- *            Bradford Hovinen <bghovinen at math.uwaterloo.ca>
- *
- * ------------------------------------------------------------
- * 2002-11-26  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
- *
- * Added detailed documentation, cleaned up the interface slightly, and added
- * support for matrix traits. Added read, write, neg, negin, axpy, and
- * matrix-vector and matrix-black box operations.
- * ------------------------------------------------------------
+/*
+ * Copyright (C) 2014 the LinBox
  *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  *
  * ========LICENCE========
  * This file is part of the library LinBox.
  *
- * LinBox is free software: you can redistribute it and/or modify
+  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
  *
  * This 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
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  * ========LICENCE========
- *.
  */
 
-#ifndef __LINBOX_matrix_domain_H
-#define __LINBOX_matrix_domain_H
+/*! @file matrix/matrix-domain.h
+ * @ingroup matrixdomain
+ * @brief NODOC
+ */
 
-#include <iostream>
+#ifndef __LINBOX_matrix_matrix_domain_H
+#define __LINBOX_matrix_matrix_domain_H
 
-#include "linbox/blackbox/archetype.h"
+#include <linbox/linbox-config.h>
 #include "linbox/vector/vector-domain.h"
+// #include "linbox/matrix/densematrix/blas-matrix.h"
 
-namespace LinBox
-{
+namespace LinBox {
+#if 1
+	//! @bug necessitates the inclusion of those things after of before. We should not include directly this but just the matrices and they automatically need their domain (for now)
+	template<class Field, class Rep> class BlasMatrix;
+	template<class Matrix> class BlasSubmatrix;
+	template<class _Field, class _Rep> class BlasVector ;
+	template<class Field, class _Rep> class TriangularBlasMatrix ;
+	template<class Matrix> class TransposedBlasMatrix ;
+#endif
 
-	/** \brief For specializing matrix arithmetic
-	 *
-	 * This class defines matrix categories that allow us to specialize the matrix
-	 * arithmetic in \ref MatrixDomain for different matrix representations. For
-	 * example, a sparse matrix may have an efficient iterator over row vectors but
-	 * not over column vectors. Therefore, an algorithm that tries to iterate over
-	 * column vectors will run very slowly. Hence a specialization that avoids using
-	 * column vectors is used instead.
-	 */
-
-	struct MatrixCategories {
-		struct BlackboxTag { };
-		struct RowMatrixTag : public virtual BlackboxTag { };
-		struct ColMatrixTag : public virtual BlackboxTag { };
-		struct RowColMatrixTag : public RowMatrixTag, public ColMatrixTag { };
-	};
-
-	template <class Matrix>
-	struct MatrixTraits {
-		typedef Matrix MatrixType;
-		typedef typename Matrix::MatrixCategory MatrixCategory;
-	};
 
 	/** \brief Helper class to allow specializations of certain matrix-vector products
 	 *
@@ -83,1117 +62,18 @@ namespace LinBox
 		template <class Vector1, class Matrix, class Vector2>
 		inline Vector1 &mulColDense (const VectorDomain<Field> &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const;
 	};
+}
 
-	/** Class of matrix arithmetic functions.
-	 *
-	 * This class encapuslated matrix-matrix and matrix-vector operations, roughly
-	 * equivalent to BLAS levels 2 and 3. The arithmetic methods are parameterized
-	 * by matrix type so that they may be used the same way with sparse matrices,
-	 * dense matrices, and dense submatrices. Except where otherwise noted, they
-	 * require the matrix inputs to meet the \ref BlasMatrix archetype.
-	 *
-	 * These methods are specialized so that they can run efficiently with different
-	 * matrix representations. If a matrix has an efficient row iterator, but not an
-	 * efficient column iterator, a specialization that makes use of the former will
-	 * be selected. This allows a great deal of flexibility when dealing with sparse
-	 * matrix arithmetic.
-	 *
-	 * For all of the arithmetic operations that output matrices, it is assumed that
-	 * the output matrix has an efficient row iterator. In typical use, the output
-	 * matrix will be a \ref BlasMatrix or a \ref BlasSubmatrix, which has
-	 * efficient row and column iterators. In particular, one should not perform
-	 * these arithmetic operations outputting to a \ref SparseMatrixBase.
-	 *
-	 * There are other restrictions. See the method-specific documentation for more
-	 * details.
-	 */
-	template <class Field>
-	class MatrixDomain : public MVProductDomain<Field> {
-	public:
-
-		/// Constructor.
-		//! @param F field for MatrixDomain operations.
-		MatrixDomain (const Field &F) :
-			_field (F), _VD (F)
-		{}
-
-		/// Copy operator.
-		MatrixDomain& operator= (const MatrixDomain& MD)
-		{
-			_field = MD._field;
-			_VD = MD._VD;
-			return *this;
-		}
-
-		/** Retrieve the underlying field.
-		 * Return a reference to the field that this matrix domain
-		 * object uses
-		 * @returns reference to field
-		 */
-		//@{
-		const Field &field () const
-		{
-			return _field;
-		}
-		Field &field ()
-		{
-			return _field;
-		}
-		//@}
-
-		/** Print matrix.
-		 * @param  os  Output stream to which matrix is written.
-		 * @param  A   Matrix.
-		 * @returns reference to os.
-		 */
-		template <class Matrix>
-		inline std::ostream &write (std::ostream &os, const Matrix &A) const
-		{
-			return A.write (os);
-		}
-
-		/** Read matrix.
-		 * @param  is  Input stream from which matrix is read.
-		 * @param  A   Matrix.
-		 * @returns reference to is.
-		 */
-		template <class Matrix>
-		inline std::istream &read (std::istream &is, Matrix &A) const
-		{
-			return A.read (is, _field);
-		}
-
-		/** Matrix copy
-		 * B <- A.
-		 * Copy the contents of the matrix B to the matrix A
-		 *
-		 * Both matrices must support the same iterators, row or column.
-		 *
-		 * @param B Matrix B
-		 * @param A Matrix A
-		 * @returns Reference to B
-		 */
-		template <class Matrix1, class Matrix2>
-		inline Matrix1 &copy (Matrix1 &B, const Matrix2 &A) const
-		{
-			return copySpecialized (B, A,
-						typename MatrixTraits<Matrix1>::MatrixCategory (),
-						typename MatrixTraits<Matrix2>::MatrixCategory ());
-		}
-
-		/** Matrix equality.
-		 * Test whether the matrices A and B are equal
-		 * @param A Input vector
-		 * @param B Input vector
-		 * @returns true if and only if the matrices A and B are equal
-		 */
-		template <class Matrix1, class Matrix2>
-		bool areEqual (const Matrix1 &A, const Matrix2 &B) const
-		{
-			return areEqualSpecialized (B, A,
-						    typename MatrixTraits<Matrix1>::MatrixCategory (),
-						    typename MatrixTraits<Matrix2>::MatrixCategory ());
-		}
-
-		/** Matrix equality with zero.
-		 * @param A Input matrix
-		 * @returns true if and only if the matrix A is zero
-		 */
-		template <class Matrix>
-		inline bool isZero (const Matrix &A) const
-		{
-			return isZeroSpecialized (A, typename MatrixTraits<Matrix>::MatrixCategory ());
-		}
-
-		/** Matrix-matrix addition
-		 * C <- A + B.
-		 *
-		 * Each of A, B, and C must support the same iterator, either row or
-		 * column
-		 *
-		 * @param C Output matrix C
-		 * @param A Input matrix A
-		 * @param B Input matrix B
-		 * @returns Reference to C
-		 */
-		template <class Matrix1, class Matrix2, class Matrix3>
-		inline Matrix1& add (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
-		{
-			return addSpecialized (C, A, B,
-					       typename MatrixTraits<Matrix1>::MatrixCategory (),
-					       typename MatrixTraits<Matrix2>::MatrixCategory (),
-					       typename MatrixTraits<Matrix3>::MatrixCategory ());
-		}
-
-		/** Matrix-matrix in-place addition
-		 * A <- A + B.
-		 *
-		 * Each of A and B must support the same iterator, either row or column
-		 *
-		 * @param A Input matrix A
-		 * @param B Input matrix B
-		 * @returns Reference to A
-		 */
-		template <class Matrix1, class Matrix2>
-		inline Matrix1& addin (Matrix1 &A, const Matrix2 &B) const
-		{
-			return addinSpecialized (A, B,
-						 typename MatrixTraits<Matrix1>::MatrixCategory (),
-						 typename MatrixTraits<Matrix2>::MatrixCategory ());
-		}
-
-		/** Matrix-matrix subtraction
-		 * C <- A - B.
-		 *
-		 * Each of A, B, and C must support the same iterator, either row or
-		 * column
-		 *
-		 * @param C Output matrix C
-		 * @param A Input matrix A
-		 * @param B Input matrix B
-		 * @returns Reference to C
-		 */
-		template <class Matrix1, class Matrix2, class Matrix3>
-		inline Matrix1 &sub (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
-		{
-			return subSpecialized (C, A, B,
-					       typename MatrixTraits<Matrix1>::MatrixCategory (),
-					       typename MatrixTraits<Matrix2>::MatrixCategory (),
-					       typename MatrixTraits<Matrix3>::MatrixCategory ());
-		}
-
-		/** Matrix-matrix in-place subtraction
-		 * A <- A - B.
-		 *
-		 * Each of A and B must support the same iterator, either row or column
-		 *
-		 * @param A Input matrix A
-		 * @param B Input matrix B
-		 * @returns Reference to A
-		 */
-		template <class Matrix1, class Matrix2>
-		inline Matrix1 &subin (Matrix1 &A, const Matrix2 &B) const
-		{
-			return subinSpecialized (A, B,
-						 typename MatrixTraits<Matrix1>::MatrixCategory (),
-						 typename MatrixTraits<Matrix2>::MatrixCategory ());
-		}
-
-		/** Matrix negate
-		 * B <- -A.
-		 *
-		 * Each of A and B must support the same iterator, either row or column
-		 *
-		 * @param B Output matrix B
-		 * @param A Input matrix A
-		 * @returns reference to B
-		 */
-		template <class Matrix1, class Matrix2>
-		inline Matrix1 &neg (Matrix1 &B, const Matrix2 &A) const
-		{
-			return negSpecialized (B, A,
-					       typename MatrixTraits<Matrix1>::MatrixCategory (),
-					       typename MatrixTraits<Matrix2>::MatrixCategory ());
-		}
-
-		/** Matrix in-place negate
-		 * A <- -A.
-		 * @param A Input matrix A; result is stored here
-		 */
-		template <class Matrix>
-		inline Matrix &negin (Matrix &A) const
-		{
-			return neginSpecialized (A, typename MatrixTraits<Matrix>::MatrixCategory ());
-		}
-
-		/** Matrix-matrix multiply
-		 * C <- A * B.
-		 *
-		 * C must support both row and column iterators, and the vector
-		 * representations must be dense. Examples of supported matrices are
-		 * \ref BlasMatrix and \ref BlasSubmatrix.
-		 *
-		 * Either A or B, or both, may have limited iterators. However, either A
-		 * must support row iterators or B must support column iterators. If
-		 * both A and B lack support for an iterator (either row or column),
-		 * then C must support the same type of iterator as A and B.
-		 *
-		 * @param C Output matrix C
-		 * @param A Input matrix A
-		 * @param B Input matrix B
-		 * @returns Reference to C
-		 */
-		template <class Matrix1, class Matrix2, class Matrix3>
-		inline Matrix1 &mul (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
-		{
-			return mulSpecialized (C, A, B,
-					       typename MatrixTraits<Matrix1>::MatrixCategory (),
-					       typename MatrixTraits<Matrix2>::MatrixCategory (),
-					       typename MatrixTraits<Matrix3>::MatrixCategory ());
-		}
-
-		/** Matrix-matrix in-place multiply on the left
-		 * B <- A * B.
-		 *
-		 * B should support both row and column iterators, and must be dense. A
-		 * must support row iterators.
-		 *
-		 * @param A Input matrix A
-		 * @param B Input matrix B
-		 * @returns Reference to B
-		 */
-		template <class Matrix1, class Matrix2>
-		inline Matrix2 &leftMulin (const Matrix1 &A, Matrix2 &B) const;
-
-		/** Matrix-matrix in-place multiply on the right
-		 * A <- A * B.
-		 *
-		 * A should support both row and column iterators, and must be dense. B
-		 * must support column iterators.
-		 *
-		 * @param A Input matrix A
-		 * @param B Input matrix B
-		 * @returns Reference to A
-		 */
-		template <class Matrix1, class Matrix2>
-		inline Matrix1 &rightMulin (Matrix1 &A, const Matrix2 &B) const;
-
-		/** Matrix-matrix in-place multiply
-		 * A <- A * B.
-		 *
-		 * This is an alias for \ref rightMulin
-		 *
-		 * @param A Input matrix A
-		 * @param B Input matrix B
-		 * @returns Reference to A
-		 */
-		template <class Matrix1, class Matrix2>
-		inline Matrix1 &mulin (Matrix1 &A, const Matrix2 &B) const
-		{
-			return rightMulin (A, B);
-		}
-
-		/** Matrix-scalar multiply
-		 * C <- B * a.
-		 *
-		 * Multiply B by the scalar element a and store the result in C. B and C
-		 * must support the same iterators.
-		 *
-		 * @param C Output matrix C
-		 * @param B Input matrix B
-		 * @param a Input scalar a
-		 * @returns Reference to C
-		 */
-		template <class Matrix1, class Matrix2>
-		inline Matrix1 &mul (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a) const
-		{
-			return mulSpecialized (C, B, a,
-					       typename MatrixTraits<Matrix1>::MatrixCategory (),
-					       typename MatrixTraits<Matrix2>::MatrixCategory ());
-		}
-
-		/** Matrix-scalar in-place multiply
-		 * B <- B * a.
-		 *
-		 * Multiply B by the scalar element a in-place.
-		 *
-		 * @param B Input matrix B
-		 * @param a Input scalar a
-		 * @returns Reference to B
-		 */
-		template <class Matrix>
-		inline Matrix &mulin (Matrix &B, const typename Field::Element &a) const
-		{
-			return mulinSpecialized (B, a, typename MatrixTraits<Matrix>::MatrixCategory ());
-		}
-
-		/** Matrix-matrix in-place axpy
-		 * Y <- Y + A*X.
-		 *
-		 * This function combines \ref mul and \ref add, eliminating the need
-		 * for an additional temporary in expressions of the form $Y = Y +
-		 * AX$. Only one row of additional storage is required. Y may have
-		 * either efficient row iterators or efficient column iterators, and the
-		 * same restrictions on A and X apply as in \ref mul.
-		 *
-		 * Note that no out-of-place axpy is provided, since it gives no
-		 * benefit. One may just as easily multiply into the result and call
-		 * \ref addin.
-		 *
-		 * @param Y Input matrix Y; result is stored here
-		 * @param A Input matrix A
-		 * @param X Input matrix X
-		 */
-		template <class Matrix1, class Matrix2, class Matrix3>
-		inline Matrix1 &axpyin (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
-		{
-			return axpyinSpecialized (Y, A, X,
-						  typename MatrixTraits<Matrix1>::MatrixCategory (),
-						  typename MatrixTraits<Matrix2>::MatrixCategory (),
-						  typename MatrixTraits<Matrix3>::MatrixCategory ());
-		}
-
-		//! Y <- AX-Y
-		template <class Matrix1, class Matrix2, class Matrix3>
-		inline Matrix1 &axmyin (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
-		{
-			negin(Y);
-			axpyin(Y,A,X);
-			return Y;
-		}
-
-
-		/*!  General matrix multiply
-		 * \f$ D \gets \alpha A B + \beta C\f$.
-		 * @todo not efficient...
-		 */
-		template <class Matrix1, class Matrix2, class Matrix3>
-		inline Matrix1 &muladd (Matrix1                       & D,
-					const typename Field::Element & beta,
-					const Matrix1                 & C,
-					const typename Field::Element & alpha,
-					const Matrix2                 & A,
-					const Matrix3                 & B) const
-		{
-			mul(D,A,B); // D = AB
-			mulin(D,alpha); // D = alpha D
-			Matrix1 CC(C);
-			mulin(CC,beta);   // C = beta C
-			addin(D,CC);   // D = D+C
-			return D;
-		}
-
-		/*! @todo Need documentation of these methods */
-		//@{
-		template<class Matrix1, class Matrix2>
-		Matrix1 &pow_apply (Matrix1 &M1, const Matrix2 &M2, unsigned long int k) const;
-
-		template<class Matrix1, class Matrix2>
-		Matrix1 &pow_horn (Matrix1 &M1, const Matrix2 &M2, unsigned long int k) const;
-		//@}
-
-
-		/*! @name Matrix-vector arithmetic operations
-		 * These operations take a matrix satisfying the \ref DenseMatrix
-		 * archetype and LinBox vectors as inputs. They involve matrix-vector
-		 * product and matrix-vector AXPY
-		 */
-		//@{
-		/** Matrix-vector multiply
-		 * w <- A * v.
-		 *
-		 * The vectors v and w must be of the same representation (dense, sparse
-		 * sequence, sparse associative, or sparse parallel), but they may be of
-		 * different types. The matrix A may have any representation.
-		 *
-		 * @param w Output vector w
-		 * @param A Input matrix A
-		 * @param v Input vector v
-		 * @returns Reference to w
-		 */
-		template <class Vector1, class Matrix, class Vector2>
-		inline Vector1 &vectorMul (Vector1 &w, const Matrix &A, const Vector2 &v) const
-		{
-			return mulSpecialized (w, A, v, typename MatrixTraits<Matrix>::MatrixCategory ());
-		}
-
-		/** Matrix-vector in-place axpy
-		 * \f$y \gets y + A x\f$.
-		 *
-		 * This function eliminates the requirement for temporary storage when
-		 * one is computing an expression of the form given above.
-		 *
-		 * The vectors y and x must be of the same representation (dense, sparse
-		 * sequence, sparse associative, or sparse parallel), but they may be of
-		 * different types. The matrix A may have any representation.
-		 *
-		 * Note that out-of-place axpy is not provided since it provides no
-		 * benefit -- one can use mul and then addin to exactly the same effect,
-		 * with no additional storage or performance cost.
-		 *
-		 * @param y Input vector y; result is stored here
-		 * @param A Input matrix A
-		 * @param x Input vector x
-		 */
-		template <class Vector1, class Matrix, class Vector2>
-		inline Vector1 &vectorAxpyin (Vector1 &y, const Matrix &A, const Vector2 &x) const
-		{
-			return axpyinSpecialized (y, A, x, typename MatrixTraits<Matrix>::MatrixCategory ());
-		}
-		//@}
-
-		/*! @name Matrix-black box arithmetic operations
-		 * These operations mimic the matrix-matrix arithmetic operations above,
-		 * but one of the parameters is a \ref BlackboxArchetype.
-		 */
-		//@{
-		/** Matrix-black box left-multiply
-		 * C <- A * B.
-		 *
-		 * Both C and B must support column iterators
-		 *
-		 * @param C Output matrix
-		 * @param A Black box for A
-		 * @param B Matrix B
-		 */
-		template <class Matrix1, class Blackbox, class Matrix2>
-		inline Matrix1 &blackboxMulLeft (Matrix1 &C, const Blackbox &A, const Matrix2 &B) const;
-
-		/** Matrix-black box right-multiply
-		 * C <- A * B.
-		 *
-		 * Both C and A must support row iterators
-		 *
-		 * @param C Output matrix
-		 * @param A Matrix A
-		 * @param B Black box for B
-		 */
-		template <class Matrix1, class Matrix2, class Blackbox>
-		inline Matrix1 &blackboxMulRight (Matrix1 &C, const Matrix2 &A, const Blackbox &B) const;
-		//@}
-
-		/*! @name Matrix permutations
-		 * @brief
-		 * These operations permute the rows or columns of a matrix based on
-		 * the given permutation. They are intended for use with Gauss-Jordan
-		 * elimination
-		 */
-		//@{
-		/// Transposition.
-		typedef std::pair<unsigned int, unsigned int> Transposition;
-		/** Permutation.
-		 *
-		 * A permutation is represented as a vector of pairs, each
-		 * pair representing a transposition.
-		 */
-		typedef std::vector<Transposition> Permutation;
-
-
-		/** Permute the rows of the given matrix.
-		 *
-		 * @param A Output matrix
-		 * @param P_start Start of permutation
-		 * @param P_end End of permutation
-		 * @returns Reference to A
-		 */
-		template <class Matrix, class Iterator>
-		inline Matrix &permuteRows (Matrix   &A,
-					    Iterator  P_start,
-					    Iterator  P_end) const
-		{
-			return permuteRowsSpecialized (A, P_start, P_end,
-						       typename MatrixTraits<Matrix>::MatrixCategory ());
-		}
-
-		/** Permute the columns of the given matrix.
-		 *
-		 * @param A Output matrix
-		 * @param P_start Start of permutation
-		 * @param P_end End of permutation
-		 * @returns Reference to A
-		 */
-		template <class Matrix, class Iterator>
-		inline Matrix &permuteColumns (Matrix   &A,
-					       Iterator  P_start,
-					       Iterator  P_end) const
-		{
-			return permuteColsSpecialized (A, P_start, P_end,
-						       typename MatrixTraits<Matrix>::MatrixCategory ());
-		}
-		//@}
-
-	private:
-
-		// Specialized function implementations
-		template <class Matrix1, class Matrix2> Matrix1 &copyRow (Matrix1 &B, const Matrix2 &A) const;
-		template <class Matrix1, class Matrix2> Matrix1 &copyCol (Matrix1 &B, const Matrix2 &A) const;
-
-		template <class Matrix1, class Matrix2>
-		inline Matrix1 &copySpecialized (Matrix1 &B, const Matrix2 &A,
-						 MatrixCategories::RowMatrixTag,
-						 MatrixCategories::RowMatrixTag) const
-		{
-			return copyRow (B, A);
-		}
-		template <class Matrix1, class Matrix2>
-		inline Matrix1 &copySpecialized (Matrix1 &B, const Matrix2 &A,
-						 MatrixCategories::ColMatrixTag,
-						 MatrixCategories::ColMatrixTag) const
-		{
-			return copyCol (B, A);
-		}
-		template <class Matrix1, class Matrix2>
-		inline Matrix1 &copySpecialized (Matrix1 &B, const Matrix2 &A,
-						 MatrixCategories::RowColMatrixTag,
-						 MatrixCategories::RowColMatrixTag) const
-		{
-			return copyRow (B, A);
-		}
-
-		template <class Matrix1, class Matrix2> bool areEqualRow (const Matrix1 &A, const Matrix2 &B) const;
-		template <class Matrix1, class Matrix2> bool areEqualCol (const Matrix1 &A, const Matrix2 &B) const;
-
-		template <class Matrix1, class Matrix2>
-		inline bool areEqualSpecialized (const Matrix1 &A, const Matrix2 &B,
-						 MatrixCategories::RowMatrixTag,
-						 MatrixCategories::RowMatrixTag) const
-		{
-			return areEqualRow (A, B);
-		}
-		template <class Matrix1, class Matrix2>
-		inline bool areEqualSpecialized (const Matrix1 &A, const Matrix2 &B,
-						 MatrixCategories::ColMatrixTag,
-						 MatrixCategories::ColMatrixTag) const
-		{
-			return areEqualCol (A, B);
-		}
-		template <class Matrix1, class Matrix2>
-		inline bool areEqualSpecialized (const Matrix1 &A, const Matrix2 &B,
-						 MatrixCategories::RowColMatrixTag,
-						 MatrixCategories::RowColMatrixTag) const
-		{
-			return areEqualRow (A, B);
-		}
-
-		template <class Matrix> bool isZeroRow (const Matrix &v) const;
-		template <class Matrix> bool isZeroCol (const Matrix &v) const;
-
-		template <class Matrix>
-		bool isZeroSpecialized (const Matrix &A, MatrixCategories::RowMatrixTag) const
-		{
-			return isZeroRow (A);
-		}
-		template <class Matrix>
-		bool isZeroSpecialized (const Matrix &A, MatrixCategories::ColMatrixTag) const
-		{
-			return isZeroCol (A);
-		}
-		template <class Matrix>
-		bool isZeroSpecialized (const Matrix &A, MatrixCategories::RowColMatrixTag) const
-		{
-			return isZeroRow (A);
-		}
-
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1& addRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1& addCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
-
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1& addSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
-					 MatrixCategories::RowMatrixTag,
-					 MatrixCategories::RowMatrixTag,
-					 MatrixCategories::RowMatrixTag) const
-		{
-			return addRow (C, A, B);
-		}
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1& addSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
-					 MatrixCategories::ColMatrixTag,
-					 MatrixCategories::ColMatrixTag,
-					 MatrixCategories::ColMatrixTag) const
-		{
-			return addCol (C, A, B);
-		}
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1& addSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
-					 MatrixCategories::RowColMatrixTag,
-					 MatrixCategories::RowColMatrixTag,
-					 MatrixCategories::RowColMatrixTag) const
-		{
-			return addRow (C, A, B);
-		}
-
-		template <class Matrix1, class Matrix2> Matrix1& addinRow (Matrix1 &A, const Matrix2 &B) const;
-		template <class Matrix1, class Matrix2> Matrix1& addinCol (Matrix1 &A, const Matrix2 &B) const;
-
-		template <class Matrix1, class Matrix2>
-		inline Matrix1& addinSpecialized (Matrix1 &A, const Matrix2 &B,
-						  MatrixCategories::RowMatrixTag,
-						  MatrixCategories::RowMatrixTag) const
-		{
-			return addinRow (A, B);
-		}
-		template <class Matrix1, class Matrix2>
-		inline Matrix1& addinSpecialized (Matrix1 &A, const Matrix2 &B,
-						  MatrixCategories::ColMatrixTag,
-						  MatrixCategories::ColMatrixTag) const
-		{
-			return addinCol (A, B);
-		}
-		template <class Matrix1, class Matrix2>
-		inline Matrix1& addinSpecialized (Matrix1 &A, const Matrix2 &B,
-						  MatrixCategories::RowColMatrixTag,
-						  MatrixCategories::RowColMatrixTag) const
-		{
-			return addinRow (A, B);
-		}
-
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1& subRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1& subCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
-
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1& subSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
-					 MatrixCategories::RowMatrixTag,
-					 MatrixCategories::RowMatrixTag,
-					 MatrixCategories::RowMatrixTag) const
-		{
-			return subRow (C, A, B);
-		}
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1& subSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
-					 MatrixCategories::ColMatrixTag,
-					 MatrixCategories::ColMatrixTag,
-					 MatrixCategories::ColMatrixTag) const
-		{
-			return subCol (C, A, B);
-		}
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1& subSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
-					 MatrixCategories::RowColMatrixTag,
-					 MatrixCategories::RowColMatrixTag,
-					 MatrixCategories::RowColMatrixTag) const
-		{
-			return subRow (C, A, B);
-		}
-
-		template <class Matrix1, class Matrix2> Matrix1& subinRow (Matrix1 &A, const Matrix2 &B) const;
-		template <class Matrix1, class Matrix2> Matrix1& subinCol (Matrix1 &A, const Matrix2 &B) const;
-
-		template <class Matrix1, class Matrix2>
-		Matrix1& subinSpecialized (Matrix1 &A, const Matrix2 &B,
-					   MatrixCategories::RowMatrixTag,
-					   MatrixCategories::RowMatrixTag) const
-		{
-			return subinRow (A, B);
-		}
-		template <class Matrix1, class Matrix2>
-		Matrix1& subinSpecialized (Matrix1 &A, const Matrix2 &B,
-					   MatrixCategories::ColMatrixTag,
-					   MatrixCategories::ColMatrixTag) const
-		{
-			return subinCol (A, B);
-		}
-		template <class Matrix1, class Matrix2>
-		Matrix1& subinSpecialized (Matrix1 &A, const Matrix2 &B,
-					   MatrixCategories::RowColMatrixTag,
-					   MatrixCategories::RowColMatrixTag) const
-		{
-			return subinRow (A, B);
-		}
-
-		template <class Matrix1, class Matrix2> Matrix1& negRow (Matrix1 &A, const Matrix2 &B) const;
-		template <class Matrix1, class Matrix2> Matrix1& negCol (Matrix1 &A, const Matrix2 &B) const;
-
-		template <class Matrix1, class Matrix2>
-		inline Matrix1& negSpecialized (Matrix1 &A, const Matrix2 &B,
-						MatrixCategories::RowMatrixTag,
-						MatrixCategories::RowMatrixTag) const
-		{
-			return negRow (A, B);
-		}
-		template <class Matrix1, class Matrix2>
-		inline Matrix1& negSpecialized (Matrix1 &A, const Matrix2 &B,
-						MatrixCategories::ColMatrixTag,
-						MatrixCategories::ColMatrixTag) const
-		{
-			return negCol (A, B);
-		}
-		template <class Matrix1, class Matrix2>
-		inline Matrix1& negSpecialized (Matrix1 &A, const Matrix2 &B,
-						MatrixCategories::RowColMatrixTag,
-						MatrixCategories::RowColMatrixTag) const
-		{
-			return negRow (A, B);
-		}
-
-		template <class Matrix> Matrix &neginRow (Matrix &A) const;
-		template <class Matrix> Matrix &neginCol (Matrix &A) const;
-
-		template <class Matrix>
-		Matrix &neginSpecialized (Matrix &A, MatrixCategories::RowMatrixTag) const
-		{
-			return neginRow (A);
-		}
-		template <class Matrix>
-		Matrix &neginSpecialized (Matrix &A, MatrixCategories::ColMatrixTag) const
-		{
-			return neginCol (A);
-		}
-		template <class Matrix>
-		Matrix &neginSpecialized (Matrix &A, MatrixCategories::RowColMatrixTag) const
-		{
-			return neginRow (A);
-		}
-
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1 &mulRowRowCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1 &mulColRowCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1 &mulRowRowRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1 &mulColColCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
-
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
-					 MatrixCategories::RowMatrixTag,
-					 MatrixCategories::RowMatrixTag,
-					 MatrixCategories::ColMatrixTag) const
-		{
-			return mulRowRowCol (C, A, B);
-		}
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
-					 MatrixCategories::ColMatrixTag,
-					 MatrixCategories::RowMatrixTag,
-					 MatrixCategories::ColMatrixTag) const
-		{
-			return mulColRowCol (C, A, B);
-		}
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
-					 MatrixCategories::RowColMatrixTag,
-					 MatrixCategories::RowMatrixTag,
-					 MatrixCategories::ColMatrixTag) const
-		{
-			return mulRowRowCol (C, A, B);
-		}
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
-					 MatrixCategories::RowMatrixTag,
-					 MatrixCategories::RowMatrixTag,
-					 MatrixCategories::RowMatrixTag) const
-		{
-			return mulRowRowRow (C, A, B);
-		}
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
-					 MatrixCategories::ColMatrixTag,
-					 MatrixCategories::ColMatrixTag,
-					 MatrixCategories::ColMatrixTag) const
-		{
-			return mulColColCol (C, A, B);
-		}
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
-					 MatrixCategories::RowColMatrixTag,
-					 MatrixCategories::RowColMatrixTag,
-					 MatrixCategories::RowColMatrixTag) const
-		{
-			return mulRowRowCol (C, A, B);
-		}
-
-		template <class Matrix1, class Matrix2>
-		Matrix1 &mulRow (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a) const;
-		template <class Matrix1, class Matrix2>
-		Matrix1 &mulCol (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a) const;
-
-		template <class Matrix1, class Matrix2>
-		Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a,
-					 MatrixCategories::RowMatrixTag,
-					 MatrixCategories::RowMatrixTag) const
-		{
-			return mulRow (C, B, a);
-		}
-		template <class Matrix1, class Matrix2>
-		Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a,
-					 MatrixCategories::ColMatrixTag,
-					 MatrixCategories::ColMatrixTag) const
-		{
-			return mulCol (C, B, a);
-		}
-		template <class Matrix1, class Matrix2>
-		Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a,
-					 MatrixCategories::RowColMatrixTag,
-					 MatrixCategories::RowColMatrixTag) const
-		{
-			return mulRow (C, B, a);
-		}
-
-		template <class Matrix> Matrix &mulinRow (Matrix &B, const typename Field::Element &a) const;
-		template <class Matrix> Matrix &mulinCol (Matrix &B, const typename Field::Element &a) const;
-
-		template <class Matrix>
-		Matrix &mulinSpecialized (Matrix &B, const typename Field::Element &a,
-					  MatrixCategories::RowMatrixTag) const
-		{
-			return mulinRow (B, a);
-		}
-		template <class Matrix>
-		Matrix &mulinSpecialized (Matrix &B, const typename Field::Element &a,
-					  MatrixCategories::ColMatrixTag) const
-		{
-			return mulinCol (B, a);
-		}
-		template <class Matrix>
-		Matrix &mulinSpecialized (Matrix &B, const typename Field::Element &a,
-					  MatrixCategories::RowColMatrixTag) const
-		{
-			return mulinRow (B, a);
-		}
-
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1 &axpyinRowRowCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const;
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1 &axpyinColRowCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const;
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1 &axpyinRowRowRow (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const;
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1 &axpyinColColCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const;
-
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
-					    MatrixCategories::RowMatrixTag,
-					    MatrixCategories::RowMatrixTag,
-					    MatrixCategories::ColMatrixTag) const
-		{
-			return axpyinRowRowCol (Y, A, X);
-		}
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
-					    MatrixCategories::ColMatrixTag,
-					    MatrixCategories::RowMatrixTag,
-					    MatrixCategories::ColMatrixTag) const
-		{
-			return axpyinColRowCol (Y, A, X);
-		}
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
-					    MatrixCategories::RowColMatrixTag,
-					    MatrixCategories::RowMatrixTag,
-					    MatrixCategories::ColMatrixTag) const
-		{
-			return axpyinRowRowCol (Y, A, X);
-		}
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
-					    MatrixCategories::RowMatrixTag,
-					    MatrixCategories::RowMatrixTag,
-					    MatrixCategories::RowMatrixTag) const
-		{
-			return axpyinRowRowRow (Y, A, X);
-		}
-
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
-					    MatrixCategories::ColMatrixTag,
-					    MatrixCategories::ColMatrixTag,
-					    MatrixCategories::ColMatrixTag) const
-		{
-			return axpyinColColCol (Y, A, X);
-		}
-
-		template <class Matrix1, class Matrix2, class Matrix3>
-		Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
-					    MatrixCategories::RowColMatrixTag,
-					    MatrixCategories::RowColMatrixTag,
-					    MatrixCategories::RowColMatrixTag) const
-		{
-			return axpyinRowRowCol (Y, A, X);
-		}
-
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulRowSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
-					    VectorCategories::DenseVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulRowSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
-					    VectorCategories::SparseSequenceVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulRowSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
-					    VectorCategories::SparseAssociativeVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulRowSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
-					    VectorCategories::SparseParallelVectorTag) const;
-
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
-					    VectorCategories::DenseVectorTag,
-					    VectorCategories::DenseVectorTag) const
-		{
-			return this->mulColDense (_VD, w, A, v);
-		}
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
-					    VectorCategories::DenseVectorTag,
-					    VectorCategories::SparseSequenceVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
-					    VectorCategories::DenseVectorTag,
-					    VectorCategories::SparseAssociativeVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulColSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
-					    VectorCategories::DenseVectorTag,
-					    VectorCategories::SparseParallelVectorTag) const;
-
-		template <class Vector1, class Matrix, class Vector2>
-		inline Vector1 &mulColSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
-						   VectorCategories::GenericVectorTag,
-						   VectorCategories::GenericVectorTag) const
-		{
-			typename LinBox::Vector<Field>::Dense y;
-
-			VectorWrapper::ensureDim (y, w.size ());
-
-			VectorWrapper::ensureDim (y, w.size ());
-
-			vectorMul (y, A, v);
-			_VD.copy (w, y);
-
-			return w;
-		}
-
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
-					 MatrixCategories::RowMatrixTag) const
-		{
-			return mulRowSpecialized (w, A, v, typename VectorTraits<Vector1>::VectorCategory ());
-		}
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
-					 MatrixCategories::ColMatrixTag) const
-		{
-			return mulColSpecialized (w, A, v,
-						  typename VectorTraits<Vector1>::VectorCategory (),
-						  typename VectorTraits<Vector2>::VectorCategory ());
-		}
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &mulSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
-					 MatrixCategories::RowColMatrixTag) const
-		{
-			return mulRowSpecialized (w, A, v, typename VectorTraits<Vector1>::VectorCategory ());
-		}
-
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &axpyinRowSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
-					       VectorCategories::DenseVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &axpyinRowSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
-					       VectorCategories::SparseSequenceVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &axpyinRowSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
-					       VectorCategories::SparseAssociativeVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &axpyinRowSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
-					       VectorCategories::SparseParallelVectorTag) const;
-
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &axpyinColSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
-					       VectorCategories::DenseVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &axpyinColSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
-					       VectorCategories::SparseSequenceVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &axpyinColSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
-					       VectorCategories::SparseAssociativeVectorTag) const;
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &axpyinColSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
-					       VectorCategories::SparseParallelVectorTag) const;
-
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &axpyinSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
-					    MatrixCategories::RowMatrixTag) const
-		{
-			return axpyinRowSpecialized (y, A, x, typename VectorTraits<Vector1>::VectorCategory ());
-		}
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &axpyinSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
-					    MatrixCategories::ColMatrixTag) const
-		{
-			return axpyinColSpecialized (y, A, x, typename VectorTraits<Vector1>::VectorCategory ());
-		}
-		template <class Vector1, class Matrix, class Vector2>
-		Vector1 &axpyinSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
-					    MatrixCategories::RowColMatrixTag) const
-		{
-			return axpyinRowSpecialized (y, A, x, typename VectorTraits<Vector1>::VectorCategory ());
-		}
-
-		template <class Matrix, class Iterator>
-		inline Matrix &permuteRowsByRow (Matrix   &A,
-						 Iterator  P_start,
-						 Iterator  P_end) const;
-
-		template <class Matrix, class Iterator>
-		inline Matrix &permuteRowsByCol (Matrix   &A,
-						 Iterator  P_start,
-						 Iterator  P_end) const;
-
-		template <class Matrix, class Iterator>
-		inline Matrix &permuteRowsSpecialized (Matrix   &A,
-						       Iterator  P_start,
-						       Iterator  P_end,
-						       MatrixCategories::RowColMatrixTag) const
-		{
-			return permuteRowsByCol (A, P_start, P_end);
-		}
-
-		template <class Matrix, class Iterator>
-		inline Matrix &permuteRowsSpecialized (Matrix   &A,
-						       Iterator  P_start,
-						       Iterator  P_end,
-						       MatrixCategories::RowMatrixTag) const
-		{
-			return permuteRowsByRow (A, P_start, P_end);
-		}
-
-		template <class Matrix, class Iterator>
-		inline Matrix &permuteRowsSpecialized (Matrix   &A,
-						       Iterator  P_start,
-						       Iterator  P_end,
-						       MatrixCategories::ColMatrixTag) const
-		{
-			return permuteRowsByCol (A, P_start, P_end);
-		}
-
-		template <class Matrix, class Iterator>
-		inline Matrix &permuteColsByRow (Matrix   &A,
-						 Iterator  P_start,
-						 Iterator  P_end) const;
-
-		template <class Matrix, class Iterator>
-		inline Matrix &permuteColsByCol (Matrix   &A,
-						 Iterator  P_start,
-						 Iterator  P_end) const;
-
-		template <class Matrix, class Iterator>
-		inline Matrix &permuteColsSpecialized (Matrix   &A,
-						       Iterator  P_start,
-						       Iterator  P_end,
-						       MatrixCategories::RowColMatrixTag) const
-		{
-			return permuteColsByRow (A, P_start, P_end);
-		}
-
-		template <class Matrix, class Iterator>
-		inline Matrix &permuteColsSpecialized (Matrix   &A,
-						       Iterator  P_start,
-						       Iterator  P_end,
-						       MatrixCategories::RowMatrixTag) const
-		{
-			return permuteColsByRow (A, P_start, P_end);
-		}
-
-		template <class Matrix, class Iterator>
-		inline Matrix &permuteColsSpecialized (Matrix   &A,
-						       Iterator  P_start,
-						       Iterator  P_end,
-						       MatrixCategories::ColMatrixTag) const
-		{
-			return permuteColsByCol (A, P_start, P_end);
-		}
-
-		Field         _field;
-		VectorDomain<Field>  _VD;
-	};
+#include "matrixdomain/matrix-domain.h" // needed by BlasMatrix
+#include "matrixdomain/blas-matrix-domain.h"
+#include "matrixdomain/matrix-domain-gf2.h"
+// #include "matrixdomain/matrix-domain-m4ri.h"
+#include "matrixdomain/plain-domain.h"
 
-}
+#include "matrixdomain/opencl-domain.h"
 
-#include "linbox/matrix/matrix-domain.inl"
 
-#endif // __LINBOX_matrix_domain_H
+#endif // __LINBOX_matrix_matrix_domain_H
 
 
 // Local Variables:
@@ -1203,4 +83,3 @@ namespace LinBox
 // c-basic-offset: 8
 // End:
 // vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
-
diff --git a/linbox/matrix/matrix-domain.inl b/linbox/matrix/matrix-domain.inl
deleted file mode 100644
index edd8a3e..0000000
--- a/linbox/matrix/matrix-domain.inl
+++ /dev/null
@@ -1,1183 +0,0 @@
-
-/* linbox/matrix/matrix-domain.inl
- * Copyright (C) 2002 Bradford Hovinen
- *
- * Written by Bradford Hovinen <bghovinen at math.uwaterloo.ca>
- *
- * ------------------------------------
- *
- * 
- * ========LICENCE========
- * This file is part of the library LinBox.
- * 
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This 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
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_matrix_domain_INL
-#define __LINBOX_matrix_domain_INL
-
-#include "linbox/matrix/transpose-matrix.h"
-
-namespace LinBox
-{
-
-	template <class Field>
-	template <class Matrix1, class Matrix2>
-	Matrix1 &MatrixDomain<Field>::copyRow (Matrix1 &A, const Matrix2 &B) const
-	{
-		linbox_check (A.rowdim () == B.rowdim ());
-		linbox_check (A.coldim () == B.coldim ());
-
-		typename Matrix1::RowIterator i;
-		typename Matrix2::ConstRowIterator j;
-
-		i = A.rowBegin ();
-		j = B.rowBegin ();
-
-		for (; i != A.rowEnd (); ++i, ++j)
-			_VD.copy (*i, *j);
-
-		return A;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2>
-	Matrix1 &MatrixDomain<Field>::copyCol (Matrix1 &A, const Matrix2 &B) const
-	{
-		linbox_check (A.rowdim () == B.rowdim ());
-		linbox_check (A.coldim () == B.coldim ());
-
-		typename Matrix1::ColIterator i;
-		typename Matrix2::ConstColIterator j;
-
-		i = A.colBegin ();
-		j = B.colBegin ();
-
-		for (; i != A.colEnd (); ++i, ++j)
-			_VD.copy (*i, *j);
-
-		return A;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2>
-	bool MatrixDomain<Field>::areEqualRow (const Matrix1 &A, const Matrix2 &B) const
-	{
-		linbox_check (A.rowdim () == B.rowdim ());
-		linbox_check (A.coldim () == B.coldim ());
-
-		typename Matrix1::ConstRowIterator i;
-		typename Matrix2::ConstRowIterator j;
-
-		i = A.rowBegin ();
-		j = B.rowBegin ();
-
-		for (; i != A.rowEnd (); ++i, ++j)
-			if (!_VD.areEqual (*i, *j))
-				return false;
-
-		return true;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2>
-	bool MatrixDomain<Field>::areEqualCol (const Matrix1 &A, const Matrix2 &B) const
-	{
-		linbox_check (A.rowdim () == B.rowdim ());
-		linbox_check (A.coldim () == B.coldim ());
-
-		typename Matrix1::ConstColIterator i;
-		typename Matrix2::ConstColIterator j;
-
-		i = A.colBegin ();
-		j = B.colBegin ();
-
-		for (; i != A.colEnd (); ++i, ++j)
-			if (!_VD.areEqual (*i, *j))
-				return false;
-
-		return true;
-	}
-
-	template <class Field>
-	template <class Matrix>
-	bool MatrixDomain<Field>::isZeroRow (const Matrix &A) const
-	{
-		typename Matrix::ConstRowIterator i;
-
-		i = A.rowBegin ();
-
-		for (; i != A.rowEnd (); ++i)
-			if (!_VD.isZero (*i))
-				return false;
-
-		return true;
-	}
-
-	template <class Field>
-	template <class Matrix>
-	bool MatrixDomain<Field>::isZeroCol (const Matrix &A) const
-	{
-		typename Matrix::ConstColIterator i;
-
-		i = A.colBegin ();
-
-		for (; i != A.colEnd (); ++i)
-			if (!_VD.isZero (*i))
-				return false;
-
-		return true;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2, class Matrix3>
-	Matrix1 &MatrixDomain<Field>::addRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
-	{
-		linbox_check (A.rowdim () == B.rowdim ());
-		linbox_check (A.coldim () == B.coldim ());
-		linbox_check (A.rowdim () == C.rowdim ());
-		linbox_check (A.coldim () == C.coldim ());
-
-		typename Matrix1::RowIterator i;
-		typename Matrix2::ConstRowIterator j;
-		typename Matrix3::ConstRowIterator k;
-
-		i = C.rowBegin ();
-		j = A.rowBegin ();
-		k = B.rowBegin ();
-
-		for (; i != C.rowEnd (); ++i, ++j, ++k)
-			_VD.add (*i, *j, *k);
-
-		return C;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2, class Matrix3>
-	Matrix1 &MatrixDomain<Field>::addCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
-	{
-		linbox_check (A.rowdim () == B.rowdim ());
-		linbox_check (A.coldim () == B.coldim ());
-		linbox_check (A.rowdim () == C.rowdim ());
-		linbox_check (A.coldim () == C.coldim ());
-
-		typename Matrix1::ColIterator i;
-		typename Matrix2::ConstColIterator j;
-		typename Matrix3::ConstColIterator k;
-
-		i = C.colBegin ();
-		j = A.colBegin ();
-		k = B.colBegin ();
-
-		for (; i != C.colEnd (); ++i, ++j, ++k)
-			_VD.add (*i, *j, *k);
-
-		return C;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2>
-	Matrix1 &MatrixDomain<Field>::addinRow (Matrix1 &A, const Matrix2 &B) const
-	{
-		linbox_check (A.rowdim () == B.rowdim ());
-		linbox_check (A.coldim () == B.coldim ());
-
-		typename Matrix1::RowIterator i;
-		typename Matrix2::ConstRowIterator j;
-
-		i = A.rowBegin ();
-		j = B.rowBegin ();
-
-		for (; i != A.rowEnd (); ++i, ++j)
-			_VD.addin (*i, *j);
-
-		return A;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2>
-	Matrix1 &MatrixDomain<Field>::addinCol (Matrix1 &A, const Matrix2 &B) const
-	{
-		linbox_check (A.rowdim () == B.rowdim ());
-		linbox_check (A.coldim () == B.coldim ());
-
-		typename Matrix1::ColIterator i;
-		typename Matrix2::ConstColIterator j;
-
-		i = A.colBegin ();
-		j = B.colBegin ();
-
-		for (; i != A.colEnd (); ++i, ++j)
-			_VD.addin (*i, *j);
-
-		return A;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2, class Matrix3>
-	Matrix1 &MatrixDomain<Field>::subRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
-	{
-		linbox_check (A.rowdim () == B.rowdim ());
-		linbox_check (A.coldim () == B.coldim ());
-		linbox_check (A.rowdim () == C.rowdim ());
-		linbox_check (A.coldim () == C.coldim ());
-
-		typename Matrix1::RowIterator i;
-		typename Matrix2::ConstRowIterator j;
-		typename Matrix3::ConstRowIterator k;
-
-		i = C.rowBegin ();
-		j = A.rowBegin ();
-		k = B.rowBegin ();
-
-		for (; i != C.rowEnd (); ++i, ++j, ++k)
-			_VD.sub (*i, *j, *k);
-
-		return C;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2, class Matrix3>
-	Matrix1 &MatrixDomain<Field>::subCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
-	{
-		linbox_check (A.rowdim () == B.rowdim ());
-		linbox_check (A.coldim () == B.coldim ());
-		linbox_check (A.rowdim () == C.rowdim ());
-		linbox_check (A.coldim () == C.coldim ());
-
-		typename Matrix1::ColIterator i;
-		typename Matrix2::ConstColIterator j;
-		typename Matrix3::ConstColIterator k;
-
-		i = C.colBegin ();
-		j = A.colBegin ();
-		k = B.colBegin ();
-
-		for (; i != C.colEnd (); ++i, ++j, ++k)
-			_VD.sub (*i, *j, *k);
-
-		return C;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2>
-	Matrix1 &MatrixDomain<Field>::subinRow (Matrix1 &A, const Matrix2 &B) const
-	{
-		linbox_check (A.rowdim () == B.rowdim ());
-		linbox_check (A.coldim () == B.coldim ());
-
-		typename Matrix1::RowIterator i;
-		typename Matrix2::ConstRowIterator j;
-
-		i = A.rowBegin ();
-		j = B.rowBegin ();
-
-		for (; i != A.rowEnd (); ++i, ++j)
-			_VD.subin (*i, *j);
-
-		return A;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2>
-	Matrix1 &MatrixDomain<Field>::subinCol (Matrix1 &A, const Matrix2 &B) const
-	{
-		linbox_check (A.rowdim () == B.rowdim ());
-		linbox_check (A.coldim () == B.coldim ());
-
-		typename Matrix1::ColIterator i;
-		typename Matrix2::ConstColIterator j;
-
-		i = A.colBegin ();
-		j = B.colBegin ();
-
-		for (; i != A.colEnd (); ++i, ++j)
-			_VD.subin (*i, *j);
-
-		return A;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2>
-	Matrix1 &MatrixDomain<Field>::negRow (Matrix1 &A, const Matrix2 &B) const
-	{
-		linbox_check (A.rowdim () == B.rowdim ());
-		linbox_check (A.coldim () == B.coldim ());
-
-		typename Matrix1::RowIterator i;
-		typename Matrix2::ConstRowIterator j;
-
-		i = A.rowBegin ();
-		j = B.rowBegin ();
-
-		for (; i != A.rowEnd (); ++i, ++j)
-			_VD.neg (*i, *j);
-
-		return A;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2>
-	Matrix1 &MatrixDomain<Field>::negCol (Matrix1 &A, const Matrix2 &B) const
-	{
-		linbox_check (A.rowdim () == B.rowdim ());
-		linbox_check (A.coldim () == B.coldim ());
-
-		typename Matrix1::ColIterator i;
-		typename Matrix2::ConstColIterator j;
-
-		i = A.colBegin ();
-		j = B.colBegin ();
-
-		for (; i != A.colEnd (); ++i, ++j)
-			_VD.neg (*i, *j);
-
-		return A;
-	}
-
-	template <class Field>
-	template <class Matrix>
-	Matrix &MatrixDomain<Field>::neginRow (Matrix &A) const
-	{
-		typename Matrix::RowIterator i;
-
-		for (i = A.rowBegin (); i != A.rowEnd (); ++i)
-			_VD.negin (*i);
-
-		return A;
-	}
-
-	template <class Field>
-	template <class Matrix>
-	Matrix &MatrixDomain<Field>::neginCol (Matrix &A) const
-	{
-		typename Matrix::ColIterator i;
-
-		for (i = A.colBegin (); i != A.colEnd (); ++i)
-			_VD.negin (*i);
-
-		return A;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2, class Matrix3>
-	Matrix1 &MatrixDomain<Field>::mulRowRowCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
-	{
-		linbox_check (A.coldim () == B.rowdim ());
-		linbox_check (A.rowdim () == C.rowdim ());
-		linbox_check (B.coldim () == C.coldim ());
-
-		typename Matrix2::ConstRowIterator i;
-		typename Matrix3::ConstColIterator j;
-		typename Matrix1::RowIterator l1;
-		typename Matrix1::Row::iterator l2;
-
-		for (i = A.rowBegin (), l1 = C.rowBegin (); i != A.rowEnd (); ++i, ++l1)
-			for (j = B.colBegin (), l2 = l1->begin (); j != B.colEnd (); ++j, ++l2)
-				_VD.dot (*l2, *i, *j);
-
-		return C;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2, class Matrix3>
-	Matrix1 &MatrixDomain<Field>::mulColRowCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
-	{
-		linbox_check (A.coldim () == B.rowdim ());
-		linbox_check (A.rowdim () == C.rowdim ());
-		linbox_check (B.coldim () == C.coldim ());
-
-		typename Matrix2::ConstRowIterator i;
-		typename Matrix3::ConstColIterator j;
-		typename Matrix1::ColIterator l1;
-		typename Matrix1::Col::iterator l2;
-
-		for (j = B.colBegin (), l1 = C.colBegin (); j != B.colEnd (); ++j, ++l1)
-			for (i = A.rowBegin (), l2 = l1->begin (); i != A.rowEnd (); ++i, ++l2)
-				_VD.dot (*l2, *i, *j);
-
-		return C;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2, class Matrix3>
-	Matrix1 &MatrixDomain<Field>::mulRowRowRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
-	{
-		linbox_check (A.coldim () == B.rowdim ());
-		linbox_check (A.rowdim () == C.rowdim ());
-		linbox_check (B.coldim () == C.coldim ());
-
-		typename Matrix2::ConstRowIterator i = A.rowBegin ();
-		typename Matrix1::RowIterator j = C.rowBegin ();
-
-		TransposeMatrix<const Matrix3> BT (B);
-
-		for (; i != A.rowEnd (); ++i, ++j)
-			vectorMul (*j, BT, *i);
-
-		return C;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2, class Matrix3>
-	Matrix1 &MatrixDomain<Field>::mulColColCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
-	{
-		linbox_check (A.coldim () == B.rowdim ());
-		linbox_check (A.rowdim () == C.rowdim ());
-		linbox_check (B.coldim () == C.coldim ());
-
-		typename Matrix3::ConstColIterator i = B.colBegin ();
-		typename Matrix1::ColIterator j = C.colBegin ();
-
-		for (; i != B.colEnd (); ++i, ++j)
-			vectorMul (*j, A, *i);
-
-		return C;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2>
-	Matrix2 &MatrixDomain<Field>::leftMulin (const Matrix1 &A, Matrix2 &B) const
-	{
-		linbox_check (A.rowdim () == A.coldim ());
-		linbox_check (A.coldim () == B.rowdim ());
-
-		typename LinBox::Vector<Field>::Dense t (A.rowdim ());
-
-		typename Matrix2::ColIterator i;
-		typename Matrix1::ConstRowIterator j;
-
-		typename LinBox::Vector<Field>::Dense::iterator k;
-
-		for (i = B.colBegin (); i != B.colEnd (); ++i) {
-			for (j = A.rowBegin (), k = t.begin (); j != A.rowEnd (); ++j, ++k)
-				_VD.dot (*k, *j, *i);
-
-			_VD.copy (*i, t);
-		}
-
-		return B;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2>
-	Matrix1 &MatrixDomain<Field>::rightMulin (Matrix1 &A, const Matrix2 &B) const
-	{
-		linbox_check (A.coldim () == B.rowdim ());
-		linbox_check (B.rowdim () == B.coldim ());
-
-		typename LinBox::Vector<Field>::Dense t (B.coldim ());
-
-		typename Matrix1::RowIterator i;
-		typename Matrix2::ConstColIterator j;
-
-		typename LinBox::Vector<Field>::Dense::iterator k;
-
-		for (i = A.rowBegin (); i != A.rowEnd (); ++i) {
-			for (j = B.colBegin (), k = t.begin (); j != B.colEnd (); ++j, ++k)
-				_VD.dot (*k, *i, *j);
-
-			_VD.copy (*i, t);
-		}
-
-		return A;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2>
-	Matrix1 &MatrixDomain<Field>::mulRow (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a) const
-	{
-		linbox_check (C.rowdim () == B.rowdim ());
-		linbox_check (C.coldim () == B.coldim ());
-
-		typename Matrix1::RowIterator i;
-		typename Matrix2::ConstRowIterator j;
-
-		i = C.rowBegin ();
-		j = B.rowBegin ();
-
-		for (; i != C.rowEnd (); ++i, ++j)
-			_VD.mul (*i, *j, a);
-
-		return C;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2>
-	Matrix1 &MatrixDomain<Field>::mulCol (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a) const
-	{
-		linbox_check (C.rowdim () == B.rowdim ());
-		linbox_check (C.coldim () == B.coldim ());
-
-		typename Matrix1::ColIterator i;
-		typename Matrix2::ConstColIterator j;
-
-		i = C.colBegin ();
-		j = B.colBegin ();
-
-		for (; i != C.colEnd (); ++i, ++j)
-			_VD.mul (*i, *j, a);
-
-		return C;
-	}
-
-	template <class Field>
-	template <class Matrix>
-	Matrix &MatrixDomain<Field>::mulinRow (Matrix &B, const typename Field::Element &a) const
-	{
-		typename Matrix::RowIterator i;
-
-		for (i = B.rowBegin (); i != B.rowEnd (); ++i)
-			_VD.mulin (*i, a);
-
-		return B;
-	}
-
-	template <class Field>
-	template <class Matrix>
-	Matrix &MatrixDomain<Field>::mulinCol (Matrix &B, const typename Field::Element &a) const
-	{
-		typename Matrix::ColIterator i;
-
-		for (i = B.colBegin (); i != B.colEnd (); ++i)
-			_VD.mulin (*i, a);
-
-		return B;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2, class Matrix3>
-	Matrix1 &MatrixDomain<Field>::axpyinRowRowCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
-	{
-		linbox_check (A.coldim () == X.rowdim ());
-		linbox_check (A.rowdim () == Y.rowdim ());
-		linbox_check (X.coldim () == Y.coldim ());
-
-		typename Matrix2::ConstRowIterator i;
-		typename Matrix3::ConstColIterator j;
-		typename Matrix1::RowIterator l1;
-		typename Matrix1::Row::iterator l2;
-
-		typename Field::Element t;
-
-		for (i = A.rowBegin (), l1 = Y.rowBegin (); i != A.rowEnd (); ++i, ++l1) {
-			for (j = X.colBegin (), l2 = l1->begin (); j != X.colEnd (); ++j, ++l2) {
-				_VD.dot (t, *i, *j);
-				_field.addin (*l2, t);
-			}
-		}
-
-		return Y;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2, class Matrix3>
-	Matrix1 &MatrixDomain<Field>::axpyinColRowCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
-	{
-		linbox_check (A.coldim () == X.rowdim ());
-		linbox_check (A.rowdim () == Y.rowdim ());
-		linbox_check (X.coldim () == Y.coldim ());
-
-		typename Matrix2::ConstRowIterator i;
-		typename Matrix3::ConstColIterator j;
-		typename Matrix1::ColIterator l1;
-		typename Matrix1::Col::iterator l2;
-
-		typename Field::Element t;
-
-		for (j = X.colBegin (), l1 = Y.colBegin (); j != X.colEnd (); ++j, ++l1) {
-			for (i = A.rowBegin (), l2 = l1->begin (); i != A.rowEnd (); ++i, ++l2) {
-				_VD.dot (t, *i, *j);
-				_field.addin (*l2, t);
-			}
-		}
-
-		return Y;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2, class Matrix3>
-	Matrix1 &MatrixDomain<Field>::axpyinRowRowRow (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
-	{
-		linbox_check (A.coldim () == X.rowdim ());
-		linbox_check (A.rowdim () == Y.rowdim ());
-		linbox_check (X.coldim () == Y.coldim ());
-
-		typename LinBox::Vector<Field>::Dense t (X.coldim ());
-
-		typename Matrix2::ConstRowIterator i = A.rowBegin ();
-		typename Matrix1::RowIterator j = Y.rowBegin ();
-
-		TransposeMatrix<const Matrix3> XT (X);
-
-		for (; i != A.rowEnd (); ++i, ++j) {
-			vectorMul (t, XT, *i);
-			_VD.addin (*j, t);
-		}
-
-		return Y;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2, class Matrix3>
-	Matrix1 &MatrixDomain<Field>::axpyinColColCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
-	{
-		linbox_check (A.coldim () == X.rowdim ());
-		linbox_check (A.rowdim () == Y.rowdim ());
-		linbox_check (X.coldim () == Y.coldim ());
-
-		typename LinBox::Vector<Field>::Dense t (A.rowdim ());
-
-		typename Matrix3::ConstColIterator i = X.colBegin ();
-		typename Matrix1::ColIterator j = Y.colBegin ();
-
-		for (; i != X.colEnd (); ++i, ++j) {
-			vectorMul (t, A, *i);
-			_VD.addin (*j, t);
-		}
-
-		return Y;
-	}
-
-	template <class Field>
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MatrixDomain<Field>::mulRowSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
-							 VectorCategories::DenseVectorTag) const
-	{
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstRowIterator i = A.rowBegin ();
-		typename Vector1::iterator j = w.begin ();
-
-		// JGD 02.09.2008 : when sizes differ
-		// A must decide if dot is possible, not w
-		// 	for (; j != w.end (); ++j, ++i)
-		// 		_VD.dot (*j, v, *i);
-		for (; i != A.rowEnd (); ++j, ++i) {
-			linbox_check(j != w.end());
-			_VD.dot (*j, v, *i);
-		}
-
-		return w;
-	}
-
-	template <class Field>
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MatrixDomain<Field>::mulRowSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
-							 VectorCategories::SparseSequenceVectorTag) const
-	{
-		typename Matrix::ConstRowIterator i = A.rowBegin ();
-		typename Field::Element t;
-		unsigned int idx = 0;
-
-		w.clear ();
-
-		for (; i != A.rowEnd (); ++i, ++idx) {
-			_VD.dot (t, v, *i);
-
-			if (!_field.isZero (t))
-				w.push_back (std::pair<size_t, typename Field::Element> (idx, t));
-		}
-
-		return w;
-	}
-
-	template <class Field>
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MatrixDomain<Field>::mulRowSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
-							 VectorCategories::SparseAssociativeVectorTag) const
-	{
-		typename Matrix::ConstRowIterator i = A.rowBegin ();
-		typename Field::Element t;
-		unsigned int idx = 0;
-
-		w.clear ();
-
-		for (; i != A.rowEnd (); ++i, ++idx) {
-			_VD.dot (t, v, *i);
-
-			if (!_field.isZero (t))
-				w[idx] = t;
-		}
-
-		return w;
-	}
-
-	template <class Field>
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MatrixDomain<Field>::mulRowSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
-							 VectorCategories::SparseParallelVectorTag) const
-	{
-		typename Matrix::ConstRowIterator i = A.rowBegin ();
-		typename Field::Element t;
-		unsigned int idx = 0;
-
-		w.first.clear ();
-		w.second.clear ();
-
-		for (; i != A.rowEnd (); ++i, ++idx) {
-			_VD.dot (t, v, *i);
-
-			if (!_field.isZero (t)) {
-				w.first.push_back (idx);
-				w.second.push_back (t);
-			}
-		}
-
-		return w;
-	}
-
-	template <class Field>
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MVProductDomain<Field>::mulColDense
-	(const VectorDomain<Field> &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
-	{
-		linbox_check (A.coldim () == v.size ());
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j = v.begin ();
-
-		VD.subin (w, w);
-
-		for (; j != v.end (); ++j, ++i)
-			VD.axpyin (w, *j, *i);
-
-		return w;
-	}
-
-	template <class Field>
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MatrixDomain<Field>::mulColSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
-							 VectorCategories::DenseVectorTag,
-							 VectorCategories::SparseSequenceVectorTag) const
-	{
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Vector2::const_iterator j = v.begin ();
-
-		_VD.subin (w, w);
-
-		for (; j != v.end (); ++j) {
-			typename Matrix::ConstColIterator i = A.colBegin () + j->first;
-			_VD.axpyin (w, j->second, *i);
-		}
-
-		return w;
-	}
-
-	template <class Field>
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MatrixDomain<Field>::mulColSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
-							 VectorCategories::DenseVectorTag,
-							 VectorCategories::SparseAssociativeVectorTag) const
-	{
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Vector2::const_iterator j = v.begin ();
-
-		_VD.subin (w, w);
-
-		for (; j != v.end (); ++j) {
-			typename Matrix::ConstColIterator i = A.colBegin () + j->first;
-			_VD.axpyin (w, j->second, *i);
-		}
-
-		return w;
-	}
-
-	template <class Field>
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MatrixDomain<Field>::mulColSpecialized (Vector1 &w, const Matrix &A, const Vector2 &v,
-							 VectorCategories::DenseVectorTag,
-							 VectorCategories::SparseParallelVectorTag) const
-	{
-		linbox_check (A.rowdim () == w.size ());
-
-		typename Vector2::first_type::const_iterator j_idx = v.first.begin ();
-		typename Vector2::second_type::const_iterator j_elt = v.second.begin ();
-
-		_VD.subin (w, w);
-
-		for (; j_idx != v.first.end (); ++j_idx, ++j_elt) {
-			typename Matrix::ConstColIterator i = A.colBegin () + *j_idx;
-			_VD.axpyin (w, *j_elt, *i);
-		}
-
-		return w;
-	}
-
-	template <class Field>
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MatrixDomain<Field>::axpyinRowSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
-							    VectorCategories::DenseVectorTag) const
-	{
-		linbox_check (A.coldim () == x.size ());
-		linbox_check (A.rowdim () == y.size ());
-
-		typename Matrix::ConstRowIterator i = A.rowBegin ();
-		typename Vector1::iterator j = y.begin ();
-
-		typename Field::Element t;
-
-		for (; j != y.end (); ++j, ++i) {
-			_VD.dot (t, x, *i);
-			_field.addin (*j, t);
-		}
-
-		return y;
-	}
-
-	template <class Field>
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MatrixDomain<Field>::axpyinRowSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
-							    VectorCategories::SparseSequenceVectorTag) const
-	{
-		typename LinBox::Vector<Field>::Dense t1 (A.coldim ()), t2 (A.rowdim ());
-
-		_VD.copy (t1, x);
-		_VD.copy (t2, y);
-		axpyin (t2, A, t1);
-		_VD.copy (y, t2);
-
-		return y;
-	}
-
-	template <class Field>
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MatrixDomain<Field>::axpyinRowSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
-							    VectorCategories::SparseAssociativeVectorTag) const
-	{
-		typename LinBox::Vector<Field>::Dense t1 (A.coldim ()), t2 (A.rowdim ());
-
-		_VD.copy (t1, x);
-		_VD.copy (t2, y);
-		axpyin (t2, A, t1);
-		_VD.copy (y, t2);
-
-		return y;
-	}
-
-	template <class Field>
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MatrixDomain<Field>::axpyinRowSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
-							    VectorCategories::SparseParallelVectorTag) const
-	{
-		typename LinBox::Vector<Field>::Dense t1 (A.coldim ()), t2 (A.rowdim ());
-
-		_VD.copy (t1, x);
-		_VD.copy (t2, y);
-		axpyin (t2, A, t1);
-		_VD.copy (y, t2);
-
-		return y;
-	}
-
-	template <class Field>
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MatrixDomain<Field>::axpyinColSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
-							    VectorCategories::DenseVectorTag) const
-	{
-		linbox_check (A.coldim () == x.size ());
-		linbox_check (A.rowdim () == y.size ());
-
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::const_iterator j = x.begin ();
-
-		for (; j != x.end (); ++j, ++i)
-			_VD.axpyin (y, *j, *i);
-
-		return y;
-	}
-
-	template <class Field>
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MatrixDomain<Field>::axpyinColSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
-							    VectorCategories::SparseSequenceVectorTag) const
-	{
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::iterator j = x.begin ();
-
-		int diff;
-
-		typename LinBox::Vector<Field>::Dense t (A.rowdim ());
-
-		_VD.copy (t, y);
-
-		while (j != x.end ()) {
-			_VD.axpyin (t, j->second, *i);
-			diff = j->first; ++j;
-			diff -= j->first;
-			i -= diff;
-		}
-
-		_VD.copy (y, t);
-
-		return y;
-	}
-
-	template <class Field>
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MatrixDomain<Field>::axpyinColSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
-							    VectorCategories::SparseAssociativeVectorTag) const
-	{
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::iterator j = x.begin ();
-
-		int diff;
-
-		typename LinBox::Vector<Field>::Dense t (A.rowdim ());
-
-		_VD.copy (t, y);
-
-		while (j != x.end ()) {
-			_VD.axpyin (t, j->second, *i);
-			diff = j->first; ++j;
-			diff -= j->first;
-			i -= diff;
-		}
-
-		_VD.copy (y, t);
-
-		return y;
-	}
-
-	template <class Field>
-	template <class Vector1, class Matrix, class Vector2>
-	Vector1 &MatrixDomain<Field>::axpyinColSpecialized (Vector1 &y, const Matrix &A, const Vector2 &x,
-							    VectorCategories::SparseParallelVectorTag) const
-	{
-		typename Matrix::ConstColIterator i = A.colBegin ();
-		typename Vector2::iterator j_idx = x.first.begin ();
-		typename Vector2::iterator j_elt = x.second.begin ();
-
-		int diff;
-
-		typename LinBox::Vector<Field>::Dense t (A.rowdim ());
-
-		_VD.copy (t, y);
-
-		for (; j_idx != x.first.end (); ++j_elt) {
-			_VD.axpyin (t, *j_elt, *i);
-			diff = *j_idx; ++j_idx;
-			diff -= *j_idx;
-			i -= diff;
-		}
-
-		_VD.copy (y, t);
-
-		return y;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Blackbox, class Matrix2>
-	Matrix1 &MatrixDomain<Field>::blackboxMulLeft (Matrix1 &C, const Blackbox &A, const Matrix2 &B) const
-	{
-		linbox_check (A.coldim () == B.rowdim ());
-		linbox_check (A.rowdim () == C.rowdim ());
-		linbox_check (B.coldim () == C.coldim ());
-
-		typename Matrix1::ColIterator i = C.colBegin ();
-		typename Matrix2::ConstColIterator j = B.colBegin ();
-
-		for (; i != C.colEnd (); ++i, ++j)
-			A.apply (*i, *j);
-
-		return C;
-	}
-
-	template <class Field>
-	template <class Matrix1, class Matrix2, class Blackbox>
-	Matrix1 &MatrixDomain<Field>::blackboxMulRight (Matrix1 &C, const Matrix2 &A, const Blackbox &B) const
-	{
-		linbox_check (A.coldim () == B.rowdim ());
-		linbox_check (A.rowdim () == C.rowdim ());
-		linbox_check (B.coldim () == C.coldim ());
-
-		typename Matrix1::RowIterator i = C.rowBegin ();
-		typename Matrix2::ConstRowIterator j = A.rowBegin ();
-
-		for (; i != C.rowEnd (); ++i, ++j)
-			B.applyTranspose (*i, *j);
-
-		return C;
-	}
-
-	template <class Field>
-	template <class Matrix, class Iterator>
-	Matrix &MatrixDomain<Field>::permuteRowsByRow (Matrix   &A,
-						       Iterator  P_start,
-						       Iterator  P_end) const
-	{
-		Iterator i;
-		typename Matrix::RowIterator j, k;
-
-		for (i = P_start; i != P_end; ++i) {
-			j = A.rowBegin () + i->first;
-			k = A.rowBegin () + i->second;
-
-			_VD.swap (*j, *k);
-		}
-
-		return A;
-	}
-
-	template <class Field>
-	template <class Matrix, class Iterator>
-	Matrix &MatrixDomain<Field>::permuteRowsByCol (Matrix   &A,
-						       Iterator  P_start,
-						       Iterator  P_end) const
-	{
-		typename Matrix::ColIterator j;
-
-		for (j = A.colBegin (); j != A.colEnd (); ++j)
-			_VD.permute (*j, P_start, P_end);
-
-		return A;
-	}
-
-	template <class Field>
-	template <class Matrix, class Iterator>
-	Matrix &MatrixDomain<Field>::permuteColsByRow (Matrix   &A,
-						       Iterator  P_start,
-						       Iterator  P_end) const
-	{
-		typename Matrix::RowIterator j;
-
-		for (j = A.rowBegin (); j != A.rowEnd (); ++j)
-			_VD.permute (*j, P_start, P_end);
-
-		return A;
-	}
-
-	template <class Field>
-	template <class Matrix, class Iterator>
-	Matrix &MatrixDomain<Field>::permuteColsByCol (Matrix   &A,
-						       Iterator  P_start,
-						       Iterator  P_end) const
-	{
-		Iterator i;
-		typename Matrix::ColIterator j, k;
-
-		for (i = P_start; i != P_end; ++i) {
-			j = A.colBegin () + i->first;
-			k = A.colBegin () + i->second;
-
-			_VD.swap (*j, *k);
-		}
-
-		return A;
-	}
-
-	/* FIXME: These methods are undocumented, and I'm unclear what they are supposed
-	 * to do
-	 */
-
-#if 0
-
-	/*M1<-M2**k;
-	*/
-	template<class Matrix1, class Matrix2>
-	Matrix1& MatrixDomain::pow_apply(Matrix1& M1, const Matrix2& M2, unsigned long int k) const
-	{
-		linbox_check((M1.rowdim()==M1.coldim())&&
-			     (M2.rowdim()==M2.coldim())&&
-			     (M1.rowdim()==M2.rowdim()));
-
-
-		typename Matrix1::Iterator p=M1.Begin();
-		for(;p!=M1.End();++p)
-			M1.field().init(*p,0);
-		for(p=M1.Begin();p<M1.End();)
-		{
-			M1.field().init(*p,1);
-			p=p+M1.rowdim()+1;
-		}
-
-
-		for(int i=0;i<k;++i)
-			mulin_R(M1,M2);
-
-		return M1;
-	}
-
-
-	template<class Matrix1, class Matrix2>
-	Matrix1& MatrixDomain::pow_horn(Matrix1& M1, const Matrix2& M2, unsigned long int k) const
-	{
-		linbox_check((M1.rowdim()==M1.coldim())&&
-			     (M2.rowdim()==M2.coldim())&&
-			     (M1.rowdim()==M2.rowdim()));
-
-		if(k==0)
-		{
-			typename Matrix1::Iterator p=M1.Begin();
-			for(;p!=M1.End();++p)
-				M1.field().init(*p,0);
-			for(p=M1.Begin();p<M1.End();)
-			{
-				M1.field().init(*p,1);
-				p+=M1.rowdim()+1;
-			}
-			return M1;
-		}
-
-		typename Matrix1::Iterator p1;
-		typename Matrix2::ConstIterator p2;
-		for(p1=M1.Begin(),p2=M2.Begin();p1!=M1.End();++p1,++p2)
-			M1.field().assign(*p1,*p2);
-
-		std::vector<bool> bit;
-		bit.reserve(sizeof(unsigned long)*4);
-		while(k>0)
-		{
-			bit.push_back(k%2);
-			k/=2;
-		};
-
-
-		std::vector<bool>::reverse_iterator p=bit.rbegin();
-		++p;
-		Matrix1 temp(M1);
-		for(;p!=bit.rend();++p)
-		{
-			temp=M1;
-			mulin_L(M1,temp);
-			if(*p)
-				mulin_L(M1,M2);
-
-		}
-
-		return M1;
-	}
-
-#endif
-
-} // namespace LinBox
-
-#endif // __LINBOX_matrix_domain_INL
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/matrix/matrix-iterators.doxy b/linbox/matrix/matrix-iterators.doxy
new file mode 100644
index 0000000..dee40ee
--- /dev/null
+++ b/linbox/matrix/matrix-iterators.doxy
@@ -0,0 +1,45 @@
+// Copyright 2014 LinBox. See COPYING for licence information.
+/*
+ * Written by:
+ *        Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+ /*! @ingroup matrix
+ * @defgroup matrixiterators Iterators
+ * @brief NO DOC YET
+ *
+ * Matrices in general may omit one of the iterators, either the row iterator or
+ *  the column iterator. This is useful for, e.g. sparse matrices that are
+ *  represented by sparse row vectors, since column vectors are computationally
+ *  expensive to compute without directly building the transpose of the matrix.
+ *
+ * \par RowIterator
+ *
+ * \par ColIterator
+ *
+ * \par Iterator
+ *
+ * \par IndexedIterator
+ *
+ */
+
+
+// vim:syn=doxygen
diff --git a/linbox/matrix/matrix-traits.h b/linbox/matrix/matrix-traits.h
new file mode 100644
index 0000000..15a551f
--- /dev/null
+++ b/linbox/matrix/matrix-traits.h
@@ -0,0 +1,92 @@
+/* linbox/matrix/matrix-traits.h
+ * Copyright (C) 2013 the LinBox group
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_matrix_matrix_traits_H
+#define __LINBOX_matrix_matrix_traits_H
+
+#include "linbox/util/debug.h"
+#include "linbox/linbox-config.h"
+#include "linbox/matrix/matrix-category.h"
+
+namespace LinBox {
+
+
+	//! @brief NO DOC.
+	template <class Matrix>
+	struct MatrixTraits {
+		typedef Matrix MatrixType;
+		typedef typename MatrixCategories::BlackboxTag MatrixCategory;
+	};
+
+
+	//! NODOC
+	template <class Matrix>
+	class MatrixContainerTrait {
+	public:
+		typedef MatrixContainerCategory::Blackbox Type;
+	};
+
+
+	//! try to map a blackbox over a homorphic ring
+	//! The most suitable type
+	template <class Blackbox, class Field>
+	struct MatrixHomTrait {
+		// static_assert(false,"should not be instanciated");
+		//typedef ... FBlackbox
+		// donot know
+		// typedef Blackbox value_type;
+	};
+
+	/// limited doc so far
+	namespace IndexedTags
+	{
+		struct HasIndexed{};
+		struct HasNext{};
+		struct NoIndexed{};
+	}
+
+	/// Trait to show whether or not the BB class has a Indexed iterator
+	template<class BB>
+	struct IndexedCategory {
+		typedef IndexedTags::NoIndexed Tag;
+	};
+
+	template<class Field, class Vect>
+	struct SparseVectorTranslate {
+		typedef Vect other_t;
+	};
+
+
+} // LinBox
+
+#endif // __LINBOX_matrix_matrix_traits_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/matrix.doxy b/linbox/matrix/matrix.doxy
index a431893..ab18a33 100644
--- a/linbox/matrix/matrix.doxy
+++ b/linbox/matrix/matrix.doxy
@@ -1,5 +1,8 @@
-// Copyright 2010 LinBox. See COPYING for licence information.
+// Copyright 2010,2014 LinBox. See COPYING for licence information.
 /*
+ * Written by:
+ *        Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
  *
@@ -20,44 +23,38 @@
  */
 
 /**  \ingroup linbox
-  \defgroup matrix matrix
-  \brief These matrix representations provide iterators for element access.
-
-  The class \c LinBox::DenseMatrixBase provides an archetype for matrices that
-  are "directly represented", that is, where the user has direct access to
-  iterators over the rows and columns, and to all of the elements themselves by
-  position.
-
-  The class \c LinBox::SparseMatrixBase provides an archetype for matrices that
-  are partially "directly represented", that is, where the user has direct
-  access to (sparse) iterators over the rows and columns, and to all of the
-  nonzero elements themselves by position.
-
-  The directly represented matrices are pure containers; they provide no matrix
-  arithmetic and do not implement the black box interface (but this is added in
-  their counterparts \c LinBox::DenseMatrix and \c LinBox::SparseMatrix in \ref
-  blackbox) They are parameterized solely by element type. The field is not
-  necessary.
-
-  Matrices in general may omit one of the iterators, either the row iterator or
-  the column iterator. This is useful for, e.g. sparse matrices that are
-  represented by sparse row vectors, since column vectors are computationally
-  expensive to compute without directly building the transpose of the matrix.
-
-  The class \link LinBox::MatrixDomain MatrixDomain \endlink provides a
-  complete suite of matrix arithmetic that works transparently with any class
-  meeting the interface defined by the classes below. This includes
-  matrix-matrix addition and multiplication, matrix-vector multiplication, and
-  matrix-blackbox (c.f. \link LinBox::BlackboxArchetype BlackboxArchetype
-  \endlink ) multiplication.
-
-  @todo talk about Linux::BlasPermutation
+  * \defgroup matrix matrix
+  * \brief  Matrices in LinBox
+  *
+  * All matrices are containers that present the blackbox interface.
+  * (\sa blackbox Interface. )
+  *
+  * Matrices are templated by a Field and a Storage type.
+  *
+  * \par Dense Matrices.
+  * Dense matrices can be represented in the BLAS representation (row major, row
+  * and column dimension, stride).
+  * The container is <code>BlasMatrix<Field,Rep></code> and the view is \c BlasSubmatrix.
+  * @todo vector of rows ?
+  * \sa densematrix.
+  *
+  * \par Sparse Matrices.
+  * Sparse Matrices are reprenseted in various ways. They are
+  * <code>SparseMatrix<Field,Rep></code>.
+  * \sa sparsematrix.
+  *
+  * \par Permutation Matrix
+  * \sa permuation matrix
+  *
+  * \par Matrix Domain.
+  * The class \link LinBox::MatrixDomain MatrixDomain \endlink provides a
+  * complete suite of matrix arithmetic that works transparently with any class
+  * meeting the interface defined by the classes below. This includes
+  * matrix-matrix addition and multiplication, matrix-vector multiplication,
+  * and matrix-blackbox  multiplication.
+  * \sa matrixdomain
  */
 
- /*! @ingroup matrix
- * @defgroup iterators Iterators
- * @brief NO DOC YET
- */
 
 
 // vim:syn=doxygen
diff --git a/linbox/matrix/matrixdomain/Makefile.am b/linbox/matrix/matrixdomain/Makefile.am
new file mode 100644
index 0000000..1846675
--- /dev/null
+++ b/linbox/matrix/matrixdomain/Makefile.am
@@ -0,0 +1,51 @@
+# Copyright (c) 2013 the LinBox group
+# written by BB
+#  ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the  GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# ========LICENCE========
+
+
+
+pkgincludesubdir=$(pkgincludedir)/matrix/matrixdomain
+
+
+OCL_HDRS =                                  \
+    opencl-domain.h                         \
+    opencl-domain.inl                       \
+    opencl-domain-util.inl                  \
+    opencl-domain-memory.inl                \
+    opencl-domain-factory.h
+
+#  if LINBOX_HAVE_OCL // we include them anyway. (for make dist when OCL not available)
+USE_OCL_HDRS = $(OCL_HDRS)
+#  endif
+
+
+
+pkgincludesub_HEADERS =           \
+	matrix-domain.h           \
+	matrix-domain.inl         \
+	matrix-domain-gf2.h       \
+	blas-matrix-domain.h      \
+	blas-matrix-domain.inl    \
+	apply-domain.h            \
+	plain-domain.h            \
+	$(USE_OCL_HDRS)
+
+
+
+
diff --git a/linbox/matrix/matrixdomain/apply-domain.h b/linbox/matrix/matrixdomain/apply-domain.h
new file mode 100644
index 0000000..82d4bb2
--- /dev/null
+++ b/linbox/matrix/matrixdomain/apply-domain.h
@@ -0,0 +1,462 @@
+/*
+ * Copyright (C) 2014 the LinBox group
+ *
+ * Written by:
+ *            Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/** @file linbox/matrix/matrixdomain/apply-domain.h
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_matrixdomain_apply_domain_H
+#define __LINBOX_matrixdomain_apply_domain_H
+
+#include "linbox/integer.h"
+#include "linbox/linbox-tags.h"
+
+namespace LinBox {
+
+	struct applyMethod {
+		struct Sequential {} ;
+		struct OpenMP {} ;
+		struct OpenCL {} ;
+		struct Cuda {};
+	} ;
+
+	template<class _Matrix/*, class Method = applyMethod::Sequential */>
+	class applyDomain {
+	public:
+		typedef typename     _Matrix::Field Field;
+		typedef typename Field::Element Element;
+	private :
+		const Field & _field ;
+		MatrixDomain<Field> _MD ;
+	private :
+		// y = a A x + b y
+		template<class _In, class _Out, class Matrix>
+		_Out& _apply( LINBOX_enum(Tag::Transpose) t
+			     , _Out& y
+			     , const Element & a
+			     , const Matrix & A
+			     , const Element & b
+			     , const _In & x
+			     , typename ContainerCategories::Vector
+			     , typename ContainerCategories::Vector
+			    ) const
+		{
+			if (_field.isZero(a)) {
+				_MD.vectorDomain().mulin(y,b);
+				return y ;
+			}
+
+			if (t == Tag::Transpose::Trans ) {
+#if 0
+				typename Matrix::ConstColIterator i = A.colBegin ();
+				typename _Out::iterator j = y.begin ();
+				for (; j != y.end (); ++j, ++i)
+					A._VD.dot (*j, x, *i);
+#else
+				TransposeMatrix<const Matrix> At(A);
+				if (_field.isZero(b)) { /* y = a A x */
+					_MD.vectorMul(y,At,x); /* y = Ax */
+
+					if (_field.isOne(a)) {
+						// return y ;
+					}
+					else if (_field.isMOne(a) ) { /* y = -y */
+						_MD.vectorDomain().negin(y);
+					}
+					else {/* y = a y */
+						_MD.vectorDomain().mulin(y,a);
+					}
+				}
+				else if (_field.isOne(b)) { /* y = a A x + y */
+					throw LinBoxError("not implemented yet");
+				}
+				else if (_field.isMOne(b)) { /* y = a A x - y */
+					throw LinBoxError("not implemented yet");
+				}
+				else { /* y = a A x + b y */
+					_MD.vectorDomain().mulin(y,b);
+					_In xx(x);
+					_MD.vectorDomain().mulin(xx,a);
+					_MD.vectorAxpyin(y,At,xx) ;
+				}
+#endif
+			}
+			else { /* not Transpose */
+				linbox_check( t == Tag::Transpose::NoTrans ) ;
+				if (_field.isZero(b)) {/* y = a A x */
+					_MD.vectorMul(y,A,x);
+					if (_field.isOne(a)) {
+
+					}
+					else if (_field.isMOne(a) )
+						_MD.vectorDomain().negin(y);
+					else  {
+						_MD.vectorDomain().mulin(y,a);
+					}
+				}
+				else if (_field.isOne(b)) {/* y = a A x + y */
+					throw LinBoxError("not implemented yet");
+				}
+				else if (_field.isMOne(b)) {/* y = a A x - y */
+					throw LinBoxError("not implemented yet");
+				}
+				else {/* y = a A x + b y */
+					_MD.vectorDomain().mulin(y,b);
+					_In xx(x);
+					_MD.vectorDomain().mulin(xx,a);
+					_MD.vectorAxpyin(y,A,xx);
+				}
+
+			}
+			return y ;
+		}
+
+	template<class _In, class _Out, class Matrix>
+		_Out& _apply( LINBOX_enum(Tag::Transpose) t
+			     , _Out& y
+			     , const Element & a
+			     , const Matrix & A
+			     , const Element & b
+			     , const _In & x
+			     , typename ContainerCategories::Any
+			     , typename ContainerCategories::Any
+			     ) const
+		{
+			// linbox_check(_field.isZero(a) && _field.isOne(a));
+			if (t == Tag::Transpose::Trans ) {
+				typename Matrix::ConstColIterator i = A.colBegin ();
+				typename _Out::iterator j = y.begin ();
+				for (; j != y.end (); ++j, ++i)
+					A._VD.dot (*j, x, *i);
+			}
+			else {
+				_MD.vectorMul(y,A,x);
+			}
+			return y;
+		}
+
+	public:
+		applyDomain(const Field & F) :
+			_field(F)
+			, _MD(F)
+		{}
+		/*! Operation \f$y gets a A x + b y\f$ or \f$y gets a A^t x + b y\f$ .
+		 * General axpy with x and y vectors or matrices
+		 */
+		template<class _In, class _Out, class Matrix>
+		_Out& apply( LINBOX_enum(Tag::Transpose) t
+			     , _Out& y
+			     , const Element & a
+			     , const Matrix & A
+			     , const Element & b
+			     , const _In & x
+			     // , Method & m
+			   ) const
+		{
+			// std::cout << "called generic" << std::endl;
+			return _apply(t,y,a,A,b,x
+				      ,typename ContainerTraits<_In> ::ContainerCategory()
+				      ,typename ContainerTraits<_Out>::ContainerCategory()
+				     );
+		}
+
+#if 0
+		/*! Operation \f$y gets a A x + b y\f$ or \f$y gets a A^t x + b y\f$ .
+		 *(can overwrite A, uses less memory that \c apply)
+		 */
+		template<class _In, class _Out>
+		_Out& applyIn( LINBOX_enum(Tag::Transpose) t
+			       , _Out& y
+			       , const Element & a
+			       , Matrix & A
+			       , const Element & b
+			       , const _In & x
+			       // , Method & m
+			     );
+#endif
+
+	};
+
+	template<class T, class R>
+	class applyDomain<const BlasMatrix<Givaro::Modular<T>, R > >{
+	public:
+		typedef Givaro::Modular<T>                 Field;
+		typedef typename Field::Element  Element;
+	private:
+		const Field & _field ;
+
+		// y = a A x + b y
+		template<class _In, class _Out, class Matrix>
+		_Out& _apply( LINBOX_enum(Tag::Transpose) t
+			     , _Out& y
+			     , const Element & a
+			     , const Matrix & A
+			     , const Element & b
+			     , const _In & x
+			     , typename ContainerCategories::Vector
+			     , typename ContainerCategories::Vector ) const
+		{
+			// std::cout << "here V" << std::endl;
+			// A.write(std::cout,Tag::FileFormat::Maple) << std::endl;
+			// std::cout << x << std::endl;
+
+
+			FFLAS::fgemv(_field
+				     , (FFLAS::FFLAS_TRANSPOSE)t,
+				     A.rowdim(), A.coldim(),
+				     _field.one,
+				     A.getPointer(), A.getStride(),
+				     x.getPointer(), x.getStride(),
+				     _field.zero,
+				     y.getWritePointer(),y.getStride());
+
+			// FFLAS::fgemm(_field
+				     // , (FFLAS::FFLAS_TRANSPOSE)t
+				     // , FFLAS::FflasNoTrans
+				     // , A.rowdim(), 1, A.coldim()
+				     // , _field.one,
+				     // A.getPointer(), A.getStride(),
+				     // x.getPointer(),x.getStride(),
+				     // _field.zero,
+				     // y.getWritePointer(),y.getStride());
+
+			// std::cout << y << std::endl;
+
+			return y ;
+		}
+
+
+		// y = a A x + b y
+		template<class Matrix>
+		std::vector<Element>& _apply(LINBOX_enum(Tag::Transpose) t
+		             , std::vector<Element> & y
+		             , const Element & a
+		             , const Matrix & A
+		             , const Element & b
+		             , const std::vector<Element> & x
+			     , typename ContainerCategories::Vector
+			     , typename ContainerCategories::Vector ) const
+		{
+
+			FFLAS::fgemv(_field
+				     , (FFLAS::FFLAS_TRANSPOSE)t,
+				     A.rowdim(), A.coldim(),
+				     _field.one,
+				     A.getPointer(), A.getStride(),
+			             &x[0], 1,
+				     _field.zero,
+			             &y[0],1);
+
+			return y ;
+		}
+
+		// y = a A x + b y
+		template<class _In, class _Out, class Matrix>
+		_Out& _apply( LINBOX_enum(Tag::Transpose) t
+			     , _Out& y
+			     , const Element & a
+			     , const Matrix & A
+			     , const Element & b
+			     , const _In & x
+			     , typename ContainerCategories::Matrix
+			     , typename ContainerCategories::Matrix
+			     ) const
+		{
+			// needs to be debuged (trans?). Never Used.
+			// std::cout << "here M" << std::endl;
+			FFLAS::fgemm(_field
+				     , (FFLAS::FFLAS_TRANSPOSE)t
+				     , FFLAS::FflasNoTrans
+				     , A.rowdim(), x.coldim(), A.coldim()
+				     , _field.one,
+				     A.getPointer(), A.getStride(),
+				     x.getPointer(),x.getStride(),
+				     _field.zero,
+				     y.getWritePointer(),y.getStride());
+
+			return y ;
+		}
+
+	public:
+		applyDomain(const Field & F) :
+			_field(F)
+		{}
+
+		/*! Operation \f$y gets a A x + b y\f$ or \f$y gets a A^t x + b y\f$ .
+		 * General axpy with x and y vectors or matrices
+		 */
+		template<class _In, class _Out, class Matrix>
+		_Out& apply( LINBOX_enum(Tag::Transpose) t
+			     , _Out& y
+			     , const Element & a
+			     , const Matrix & A
+			     , const Element & b
+			     , const _In & x
+			     // , Method & m
+			   ) const
+		{
+			// std::cout << "called Givaro::Modular<T>" << std::endl;
+			return _apply(t,y,a,A,b,x
+				      ,typename ContainerTraits<_In> ::ContainerCategory()
+				      ,typename ContainerTraits<_Out>::ContainerCategory() );
+		}
+
+	};
+
+	template<class T, class R>
+	class applyDomain<const BlasMatrix<Givaro::ModularBalanced<T>, R > >{
+	public:
+		typedef Givaro::ModularBalanced<T>             Field;
+		typedef typename Field::Element      Element;
+	private:
+		const Field & _field ;
+
+		// y = a A x + b y
+		template<class _In, class _Out, class Matrix>
+		_Out& _apply( LINBOX_enum(Tag::Transpose) t
+			     , _Out& y
+			     , const Element & a
+			     , const Matrix & A
+			     , const Element & b
+			     , const _In & x
+			     , typename ContainerCategories::Vector
+			     , typename ContainerCategories::Vector
+			     ) const
+		{
+			// std::cout << "here V" << std::endl;
+			FFLAS::fgemv(_field, (FFLAS::FFLAS_TRANSPOSE)t,
+				     A.rowdim(), A.coldim(),
+				     _field.one,
+				     A.getPointer(), A.getStride(),
+				     x.getPointer(),x.getStride(),
+				     // &x[0],ldx,
+				     _field.zero,
+				     y.getWritePointer(),y.getStride());
+
+			return y ;
+		}
+
+		// y = a A x + b y
+		template<class _In, class _Out, class Matrix>
+		_Out& _apply( LINBOX_enum(Tag::Transpose) t
+			     , _Out& y
+			     , const Element & a
+			     , const Matrix & A
+			     , const Element & b
+			     , const _In & x
+			     , typename ContainerCategories::Matrix
+			     , typename ContainerCategories::Matrix
+			     ) const
+		{
+			// needs to be debuged (trans?). Never Used.
+			// std::cout << "here M" << std::endl;
+			FFLAS::fgemm(_field
+				     , (FFLAS::FFLAS_TRANSPOSE)t
+				     , FFLAS::FflasNoTrans
+				     , A.rowdim(), x.coldim(), A.coldim()
+				     , _field.one,
+				     A.getPointer(), A.getStride(),
+				     x.getPointer(),x.getStride(),
+				     _field.zero,
+				     y.getWritePointer(),y.getStride());
+
+			return y ;
+		}
+
+	public:
+		applyDomain(const Field & F) :
+			_field(F)
+		{}
+
+		/*! Operation \f$y gets a A x + b y\f$ or \f$y gets a A^t x + b y\f$ .
+		 * General axpy with x and y vectors or matrices
+		 */
+		template<class _In, class _Out, class Matrix>
+		_Out& apply( LINBOX_enum(Tag::Transpose) t
+			     , _Out& y
+			     , const Element & a
+			     , const Matrix & A
+			     , const Element & b
+			     , const _In & x
+			     // , Method & m
+			   ) const
+		{
+			// std::cout << "called Givaro::ModularBalanced<T>" << std::endl;
+			return _apply(t,y,a,A,b,x
+				      ,typename ContainerTraits<_In >::ContainerCategory()
+				      ,typename ContainerTraits<_Out>::ContainerCategory() );
+		}
+
+	};
+
+#if 0
+	template<class _Field, class _Rep>
+	class applyDomain<BlasMatrix<_Field,_Rep> > {
+		// dispatch according to field.
+		// if modular and p small -> Givaro::ModularBalanced<float>
+		// if modular and p medium -> Givaro::ModularBalanced<float>
+		// default to triple loop in MatrixDomain
+	};
+
+	template<class _Field, class _Rep>
+	class applyDomain<BlasMatrix<Givaro::Extension<_Field>,_Rep> > {
+		// if large enough: Toom Cook
+	};
+
+	template<class _Rep>
+	class applyDomain<BlasMatrix<Givaro::ZRing<Integer>,_Rep> > {
+		// if large : flint
+	};
+
+	template<class T, class _Rep>
+	class applyDomain<BlasMatrix<Unparametric<T>,_Rep> > {
+		// if T == float/double -> BLAS
+
+	};
+
+	template<class _Rep>
+	class applyDomain<BlasMatrix<Givaro::Modular<double>,_Rep> > {
+		// Blas
+	};
+
+	template<class _Rep>
+	class applyDomain<BlasMatrix<Givaro::Modular<float>,_Rep> > {
+		// Blas
+	};
+#endif
+
+
+} // LinBox
+
+#endif
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/matrixdomain/blas-matrix-domain.h b/linbox/matrix/matrixdomain/blas-matrix-domain.h
new file mode 100644
index 0000000..b28625d
--- /dev/null
+++ b/linbox/matrix/matrixdomain/blas-matrix-domain.h
@@ -0,0 +1,980 @@
+/* linbox/matrix/blas-matrix-domain.h
+ * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
+ *
+ * Written by :
+ *               Pascal Giorgi  pascal.giorgi at ens-lyon.fr
+ *               Clément Pernet clement.pernet at imag.fr
+ *
+ * originally placed as ../algorithms/blas-domain.h
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/matrixdomain/blas-domain.h
+ * @ingroup matrixdomain
+ * @brief NO DOC
+ * @warning A <code>BlasMatrixDomain<Field></code> should be templated by a
+ * \link Givaro::Modular Modular\endlink field. In particular, this domain
+ * is not suitable for integers.
+ * @warning A \e Field does mean here a \e Field and not a general \f$\mathbf{Z}/m\mathbf{Z}\f$ \e ring. You'll be warned...
+ */
+
+#ifndef __LINBOX_blas_matrix_domain_H
+#define __LINBOX_blas_matrix_domain_H
+
+#include <linbox/linbox-config.h>
+#include <iostream>
+#include <vector>
+
+#include <fflas-ffpack/ffpack/ffpack.h>
+#include <fflas-ffpack/fflas/fflas.h>
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/permutation-matrix.h"
+#include "linbox/matrix/factorized-matrix.h"
+
+
+
+namespace LinBox
+{
+
+	/** @internal
+	 * Class handling multiplication of a Matrix by an Operand with accumulation and scaling.
+	 *  Operand can be either a matrix or a vector.
+	 *
+	 *  The only function:  operator () is defined :
+	 *     -  D = beta.C + alpha. A*B
+	 *     -  C = beta.C + alpha. A*B
+	 */
+	template<class Operand1, class Operand2, class Operand3/*, class MatrixVectorType*/>
+	class BlasMatrixDomainMulAdd
+#if 0
+	{
+	public:
+		typedef typename Operand1::Field Field;
+		Operand1 &operator() (//const Field &F,
+				      Operand1 &D,
+				      const typename Field::Element &beta, const Operand1 &C,
+				      const typename Field::Element &alpha, const Operand2 &A, const Operand3 &B) const;
+
+		Operand1 &operator() (//const Field &F,
+				      const typename Field::Element &beta, Operand1 &C,
+				      const typename Field::Element &alpha, const Operand2 &A, const Operand3 &B) const;
+
+
+#if 0 /* compiles without... */
+		// allowing disymetry of Operand2 and Operand3 (only if different type)
+		Operand1 &operator() (const Field &F,
+				      Operand1 &D,
+				      const typename Field::Element &beta, const Operand1 &C,
+				      const typename Field::Element &alpha, const Operand3 &A, const Operand2 &B) const;
+
+		Operand1 &operator() (const Field &F,
+				      const typename Field::Element &beta, Operand1 &C,
+				      const typename Field::Element &alpha, const Operand3 &A, const Operand2 &B) const;
+#endif
+
+
+
+	}
+#endif
+	;
+
+	/*!@internal
+	 * Adding two matrices
+	 */
+	template< class Field, class Operand1, class Operand2, class Operand3>
+	class BlasMatrixDomainAdd {
+	public:
+		Operand1 &operator() (const Field &F,
+				      Operand1 &C, const Operand2 &A, const Operand3 &B) const;
+
+	};
+
+	/*!@internal
+	 * Substracting two matrices
+	 */
+	template< class Field, class Operand1, class Operand2, class Operand3>
+	class BlasMatrixDomainSub {
+	public:
+		Operand1 &operator() (const Field &F,
+				      Operand1 &C, const Operand2 &A, const Operand3 &B) const;
+
+	};
+	//! C -= A
+	template< class Field, class Operand1, class Operand2>
+	class BlasMatrixDomainSubin {
+	public:
+		Operand1 &operator() (const Field &F,
+				      Operand1 &C, const Operand2 &A) const;
+
+	};
+	//! C += A
+	template< class Field, class Operand1, class Operand2>
+	class BlasMatrixDomainAddin {
+	public:
+		Operand1 &operator() (const Field &F,
+				      Operand1 &C, const Operand2 &A) const;
+
+	};
+
+
+	/*!@internal
+	 * Copying a matrix
+	 */
+	template< class Field, class Operand1, class Operand2>
+	class BlasMatrixDomainCopy {
+	public:
+		Operand1 &operator() (const Field &F,
+				      Operand1 &B, const Operand2 &A) const;
+
+	};
+
+	/*!@internal
+	 * multiplying two matrices.
+	 */
+	template< class Field, class Operand1, class Operand2, class Operand3>
+	class BlasMatrixDomainMul {
+	public:
+		Operand1 &operator() (const Field &F,
+				      Operand1 &C, const Operand2 &A, const Operand3 &B) const
+		{
+			return BlasMatrixDomainMulAdd<Operand1,Operand2,Operand3/*,Operand1::MatrixVectorType*/>()(  F.zero, C, F.one, A, B );
+		}
+	};
+
+	/*! @internal
+	 * Class handling in-place multiplication of a Matrix by an Operand.
+	 *  Operand can be either a matrix a permutation or a vector
+	 *
+	 *  only  function:  operator () are defined :
+	 *     -  A = A*B
+	 *     -  B = A*B
+	 *     .
+	 * @note In-place multiplications are proposed for the specialization
+	 * with a matrix and a permutation.
+	 * @warning Using mulin with two matrices is still defined but is
+	 * non-sense
+	 */
+	// Operand 2 is always the type of the matrix which is not modified
+	// ( for example: BlasPermutation TriangularBlasMatrix )
+	template< class Field, class Operand1, class Operand2>
+	class BlasMatrixDomainMulin {
+	public:
+		// Defines a dummy mulin over generic matrices using a temporary
+		Operand1 &operator() (const Field &F,
+				      Operand1 &A, const Operand2 &B) const
+		{
+			Operand1* tmp = new Operand1(A);
+			// Effective copy of A
+			*tmp = A;
+			BlasMatrixDomainMulAdd<Operand1,Operand1,Operand2/*,Operand1::MatrixVectorType()*/>()( F.zero, A, F.one, *tmp, B );
+			delete tmp;
+			return A;
+		}
+
+		Operand1 &operator() (const Field &F,
+				      const Operand2 &A, Operand1 &B ) const
+		{
+			Operand1* tmp = new Operand1(B);
+			// Effective copy of B
+			*tmp = B;
+			BlasMatrixDomainMulAdd<Operand1,Operand1,Operand2/*,Operand1::MatrixVectorType()*/>()(  F.zero, B, F.one, A, *tmp );
+			delete tmp;
+			return B;
+		}
+	};
+
+	namespace Protected {
+		template <class Field, class MatrixView>
+		class BlasMatrixDomainInv;
+		template <class Field, class MatrixView>
+		class BlasMatrixDomainDet;
+		template <class Field, class MatrixView>
+		class BlasMatrixDomainRank;
+	}
+
+	/*! @internal
+	 * Class handling inversion of a Matrix.
+	 *
+	 *  only  function:  operator () are defined :
+	 *    -   Ainv = A^(-1)
+	 *
+	 *  Returns nullity of matrix (0 iff inversion was ok)
+	 *
+	 * @warning Beware, if A is not const this allows an inplace computation
+	 *  and so A will be modified
+	 *
+	 */
+	template< class Field, class Matrix1, class Matrix2>
+	class BlasMatrixDomainInv {
+	public:
+		int operator() (const Field &F, Matrix1 &Ainv, const Matrix2 &A) const ;
+		int operator() (const Field &F, Matrix1 &Ainv, Matrix2 &A) const  ;
+
+	};
+
+	/*! @internal
+	 * Class handling rank computation of a Matrix.
+	 *
+	 *  only  function:  operator () are defined :
+	 *    -  return the rank of A
+	 *
+	 *  @warning Beware, if A is not const this allows an inplace computation
+	 *  and so A will be modified
+	 */
+	template< class Field, class Matrix>
+	class BlasMatrixDomainRank {
+	public:
+		unsigned int operator() (const Field &F, const Matrix& A) const;
+		unsigned int operator() (const Field &F, Matrix& A) const;
+	};
+
+	/*! @internal
+	 * Class handling determinant computation of a Matrix.
+	 *
+	 *  only  function:  operator () are defined :
+	 *     -  return the determinant of A
+	 *
+	 * @warning Beware, if A is not const this allows an inplace computation
+	 *  and so A will be modified
+	 */
+	template< class Field, class Matrix>
+	class BlasMatrixDomainDet {
+			public:
+				typename Field::Element operator() (const Field &F, const Matrix& A) const;
+				typename Field::Element operator() (const Field &F, Matrix& A) const;
+		};
+
+	/*! @internal
+	 * Class handling resolution of linear system of a Matrix.
+	 *  with Operand as right or left and side
+	 *
+	 *  only  function:  operator () are defined :
+	 *    -  X = A^(-1).B
+	 *    -  B = A^(-1).B
+	 */
+	template< class Field, class Operand1, class Matrix, class Operand2=Operand1>
+	class BlasMatrixDomainLeftSolve {
+	public:
+		Operand1 &operator() (const Field &F, Operand1 &X, const Matrix &A, const Operand2 &B) const;
+		Operand1 &operator() (const Field &F, const Matrix &A, Operand1 &B) const;
+	};
+
+	/*! @internal
+	 * Class handling resolution of linear system of a Matrix.
+	 *  with Operand as right or left and side
+	 *
+	 *  only  function:  operator () are defined :
+	 *   -   X = B.A^(-1)
+	 *   -   B = B.A^(-1)
+	 */
+	template< class Field, class Operand1, class Matrix, class Operand2=Operand1>
+	class BlasMatrixDomainRightSolve {
+	public:
+		Operand1 &operator() (const Field &F, Operand1 &X, const Matrix &A, const Operand2 &B) const;
+		Operand1 &operator() (const Field &F, const Matrix &A, Operand1 &B) const;
+	};
+
+	/*! @internal
+	 * Class handling the minimal polynomial  of a Matrix.
+	 */
+	template< class Field, class Polynomial, class Matrix>
+	class BlasMatrixDomainMinpoly {
+	public:
+		Polynomial&  operator() (const Field &F, Polynomial& P, const Matrix& A) const;
+	};
+
+	/*! @internal
+	 * Class handling the characteristic polynomial  of a Matrix.
+	 * \p ContPol is either:
+	 */
+	template< class Field, class ContPol, class Matrix>
+	class BlasMatrixDomainCharpoly {
+	public:
+		ContPol&  operator() (const Field &F, ContPol& P, const Matrix& A) const;
+	};
+
+	template< class Field, class Matrix, class _Vrep>
+	class BlasMatrixDomainCharpoly<Field,BlasVector<Field,_Vrep>,Matrix> {
+	public:
+		BlasVector<Field,_Vrep>&  operator() (const Field &F, BlasVector<Field,_Vrep>& P, const Matrix& A) const;
+	};
+
+	/**
+	 *  Interface for all functionnalities provided
+	 *  for BlasMatrix.
+	 *  @internal
+	 *  Done through specialization of all
+	 *  classes defined above.
+	 */
+	template <class Field_>
+	class BlasMatrixDomain {
+
+	public:
+		typedef Field_ Field;
+		typedef typename Field::Element         Element;
+		typedef typename RawVector<Element >::Dense Rep;
+		typedef BlasMatrix<Field,Rep> OwnMatrix;
+		typedef BlasSubmatrix<OwnMatrix> Matrix;
+		typedef BlasSubmatrix<OwnMatrix> Submatrix;
+
+	protected:
+
+		const Field  * _field;
+
+	public:
+
+		//! Constructor of BlasDomain.
+/*
+		BlasMatrixDomain ()
+		BlasMatrixDomain (const Field& F )
+		void init(const Field& F )
+		BlasMatrixDomain (const BlasMatrixDomain<Field> & BMD)
+		const Field& field() const
+		T1& copy(T1& B, const T2& A) const
+		T1& add(T1& C, const T2& A, const T3& B) const
+		T1& sub(T1& C, const T2& A, const T3& B) const
+		T1& mul(T1& C, const T2& A, const T3& B) const
+		T1& mul(T1& C, const Elt& alpha, const T2& A, const T3& B) const
+		T1& axpy(T1& D, const T2& A, const T3& B, const T1& C) const
+		T1& maxpy(T1& D, const T2& A, const T3& B, const T1& C) const
+		T1& axmy(T1& D, const T2& A, const T3& B, const T1& C) const
+		T1& muladd(T1& D, const Elt& beta, const T1& C, const Elt& alpha, const T2& A, const T3& B) const
+		Matrix& inv( Matrix &B, Matrix &A) const
+		M1& inv( M1 &Ainv, const M2 &A, int& nullity) const // ?
+		Matrix& div( Matrix &C, const Matrix &A, const Matrix &B) const
+		T1& addin(T1& A, const T2& B) const
+		T1& subin(T1& A, const T2& B) const
+		T1& mulin_left(T1& A, const T2& B) const // A <- AB
+		T1& mulin_right(T1& A, const T2& B) const // A <- BA
+		T1& axpyin(T1& C, const T2& A, const T3& B) const
+		T1& maxpyin(T1& C, const T2& A, const T3& B) const
+		T1& axmyin(T1& C, const T2& A, const T3& B) const
+		const
+		T1& muladdin(const Elt& beta, T1& C, const Elt& alpha, const T2& A, const T3& B) const
+
+		Matrix& invin( Matrix &Ainv, Matrix &A) const //?
+		Matrix& invin(Matrix &A) const
+		M1& invin( M1 &Ainv, M2 &A, int& nullity) const
+		unsigned int rank(const Matrix &A) const
+		unsigned int rankin(Matrix &A) const
+		Element det(const Matrix &A) const
+		Element detin(Matrix &A) const
+		T& left_solve (T& X, const Matrix& A, const T& B) const
+		T& left_solve (const Matrix& A, T& B) const
+		T1& right_solve (T1& X, const Matrix& A, const T2& B) const
+		T& right_solve (const Matrix& A, T& B) const
+		Polynomial& minpoly( Polynomial& P, const Matrix& A ) const
+		Polynomial& charpoly( Polynomial& P, const Matrix& A ) const
+		std::list<Polynomial>& charpoly( std::list<Polynomial>& P, const Matrix& A ) const
+		bool isZero(const Matrix1 & A) const
+		bool areEqual(const Matrix1 & A, const Matrix2 & B) const
+		void setIdentity(Matrix & I) const
+		void setZero(Matrix & I) const
+		bool isIdentity(const Matrix1 & A) const
+		bool isIdentityGeneralized(const Matrix1 & A) const
+		Element& Magnitude(Element&r, const myBlasMatrix &A) const
+		inline std::ostream &write (std::ostream &os, const Matrix &A) const
+		inline std::ostream &write (std::ostream &os, const Matrix &A, bool maple_format) const
+		inline std::istream &read (std::istream &is, Matrix &A) const
+*/
+		BlasMatrixDomain () {}
+		BlasMatrixDomain (const Field& F ) { init(F); }
+
+		void init(const Field& F )
+		{
+			_field = &F;
+#if 0 // NO MORE USEFUL
+#ifndef NDEBUG
+			if (!Givaro::probab_prime(F.characteristic())) {
+				std::cout << " *** WARNING *** "                                           << std::endl;
+				std::cout << " You are using a BLAS Domain where your field is not prime " <<
+				F.characteristic() << std::endl;
+			}
+#endif
+#endif
+		}
+
+		//! Copy constructor
+		BlasMatrixDomain (const BlasMatrixDomain<Field> & BMD) :
+			_field(BMD._field)
+		{
+#if 0 // NO MORE USEFUL
+#ifndef NDEBUG
+			if (!Givaro::probab_prime(field().characteristic())) {
+				std::cout << " *** WARNING *** "                                           << std::endl;
+				std::cout << " You are using a BLAS Domain where your field is not prime " << std::endl;
+			}
+#endif
+#endif
+		}
+
+		//! Field accessor
+		const Field& field() const { return *_field; }
+
+		/*
+		 * Basics operation available matrix respecting BlasMatrix interface
+		 */
+
+		//! multiplication.
+		//! C = A*B
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& mul(Operand1& C, const Operand2& A, const Operand3& B) const
+		{
+			return BlasMatrixDomainMul<Field,Operand1,Operand2,Operand3>()(field(),C,A,B);
+		}
+
+		//! addition.
+		//! C = A+B
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& add(Operand1& C, const Operand2& A, const Operand3& B) const
+		{
+			return BlasMatrixDomainAdd<Field,Operand1,Operand2,Operand3>()(field(),C,A,B);
+		}
+
+		//! copy.
+		//! B = A
+		template <class Operand1, class Operand2>
+		Operand1& copy(Operand1& B, const Operand2& A) const
+		{
+			return BlasMatrixDomainCopy<Field,Operand1,Operand2>()(field(),B,A);
+		}
+
+		//! substraction
+		//! C = A-B
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& sub(Operand1& C, const Operand2& A, const Operand3& B) const
+		{
+			return BlasMatrixDomainSub<Field,Operand1,Operand2,Operand3>()(field(),C,A,B);
+		}
+
+		//! substraction (in place)
+		//! C -= B
+		template <class Operand1, class Operand3>
+		Operand1& subin(Operand1& C, const Operand3& B) const
+		{
+			return BlasMatrixDomainSubin<Field,Operand1,Operand3>()(field(),C,B);
+		}
+
+		//! addition (in place)
+		//! C += B
+		template <class Operand1, class Operand3>
+		Operand1& addin(Operand1& C, const Operand3& B) const
+		{
+			return BlasMatrixDomainAddin<Field,Operand1,Operand3>()(field(),C,B);
+		}
+
+		//! multiplication with scaling.
+		//! C = alpha.A*B
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& mul(Operand1& C, const Element& alpha, const Operand2& A, const Operand3& B) const
+		{
+			return muladdin(field().zero,C,alpha,A,B);
+		}
+
+		//! In place multiplication.
+		//! A = A*B
+		template <class Operand1, class Operand2>
+		Operand1& mulin_left(Operand1& A, const Operand2& B ) const
+		{
+			return BlasMatrixDomainMulin<Field,Operand1,Operand2>()(field(),A,B);
+		}
+
+		//! In place multiplication.
+		//! B = A*B
+		template <class Operand1, class Operand2>
+		Operand2& mulin_right(const Operand1& A, Operand2& B ) const
+		{
+			return BlasMatrixDomainMulin<Field,Operand2,Operand1>()(field(),A,B);
+		}
+
+		template <class Matrix1, class Matrix2>
+		inline Matrix1 &mulin (Matrix1 &A, const Matrix2 &B) const
+		{
+			return mulin_left (A, B);
+		}
+
+		//! axpy.
+		//! D = A*B + C
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& axpy(Operand1& D, const Operand2& A, const Operand3& B, const Operand1& C) const
+		{
+			return muladd(D,field().one,C,field().one,A,B);
+		}
+
+		//! axpyin.
+		//! C += A*B
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& axpyin(Operand1& C, const Operand2& A, const Operand3& B) const
+		{
+			return muladdin(field().one,C,field().one,A,B);
+		}
+
+		//! maxpy.
+		//! D = C - A*B
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& maxpy(Operand1& D, const Operand2& A, const Operand3& B, const Operand1& C)const
+		{
+			return muladd(D,field().one,C,field().mOne,A,B);
+		}
+
+		//! maxpyin.
+		//! C -= A*B
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& maxpyin(Operand1& C, const Operand2& A, const Operand3& B) const
+		{
+			return muladdin(field().one,C,field().mOne,A,B);
+		}
+
+		//! axmy.
+		//! D= A*B - C
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& axmy(Operand1& D, const Operand2& A, const Operand3& B, const Operand1& C) const
+		{
+			return muladd(D,field().mOne,C,field().one,A,B);
+		}
+
+		//! axmyin.
+		//! C = A*B - C
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& axmyin(Operand1& C, const Operand2& A, const Operand3& B) const
+		{
+			return muladdin(field().mOne,C,field().one,A,B);
+		}
+
+		//!  general matrix-matrix multiplication and addition with scaling.
+		//! D= beta.C + alpha.A*B
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& muladd(Operand1& D, const Element& beta, const Operand1& C,
+				 const Element& alpha, const Operand2& A, const Operand3& B) const
+		{
+			return BlasMatrixDomainMulAdd<Operand1,Operand2,Operand3/*,Operand1::MatrixVectorType()*/>()(D,beta,C,alpha,A,B);
+		}
+
+		//! muladdin.
+		//! C= beta.C + alpha.A*B.
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& muladdin(const Element& beta, Operand1& C,
+				   const Element& alpha, const Operand2& A, const Operand3& B) const
+		{
+			return BlasMatrixDomainMulAdd<Operand1,Operand2,Operand3/*,Operand1::MatrixVectorType()*/>()(beta,C,alpha,A,B);
+		}
+
+
+		/*!
+		 * @name Solutions available for matrix respecting BlasMatrix interface
+		 */
+		//@{
+
+		//! Inversion
+		template <class Matrix1, class Matrix2>
+		Matrix1& inv( Matrix1 &Ainv, const Matrix2 &A) const
+		{
+			BlasMatrixDomainInv<Field,Matrix1,Matrix2>()(field(),Ainv,A);
+			return Ainv;
+		}
+
+		//! Inversion (in place)
+		template <class Matrix>
+		Matrix& invin( Matrix &Ainv, Matrix &A) const
+		{
+			BlasMatrixDomainInv<Field,Matrix,Matrix>()(field(),Ainv,A);
+			return Ainv;
+		}
+
+		//! Inversion (the matrix A is modified)
+		template <class Matrix>
+		Matrix& invin(Matrix &A) const
+		{
+			Matrix tmp(A);
+			//Matrix tmp(A.rowdim(), A.coldim());
+			//tmp = A;
+			//BlasMatrixDomainInv<Field,Matrix,Matrix>()(field(),A,tmp);
+			return inv(A, tmp);
+		}
+
+
+		/*! Division.
+		 * C = A B^{-1}  ==>  C . B = A
+		 */
+		template <class Matrix>
+		Matrix& div( Matrix &C, const Matrix &A, const Matrix &B) const
+		{
+			return this->right_solve(C,B,A);
+		}
+
+		/** Matrix swap
+		 * B <--> A.  They must already have the same shape.
+		 * @returns Reference to B
+		 */
+		inline Matrix &swap(Matrix &B, Matrix &A) const {
+			return B.swap(A);
+		}
+
+
+		//- Inversion w singular check
+		// template <class Matrix>
+		// Matrix& inv( Matrix &Ainv, const Matrix &A, int& nullity) const
+		// {
+			// nullity = BlasMatrixDomainInv<Field,Matrix,Matrix>()(field(),Ainv,A);
+			// return Ainv;
+		// }
+
+		//! Inversion w singular check
+		template <class Matrix1, class Matrix2>
+		Matrix1& inv( Matrix1 &Ainv, const Matrix2 &A, int& nullity) const
+		{
+			nullity = BlasMatrixDomainInv<Field,Matrix1,Matrix2>()(field(),Ainv,A);
+			return Ainv;
+		}
+
+
+		//! Inversion (the matrix A is modified) w singular check
+		template <class Matrix1, class Matrix2>
+		Matrix1& invin( Matrix1 &Ainv, Matrix2 &A, int& nullity) const
+		{
+			nullity = BlasMatrixDomainInv<Field,Matrix1,Matrix2>()(field(),Ainv,A);
+			return Ainv;
+		}
+
+		//! Rank
+		template <class Matrix>
+		unsigned int rank(const Matrix &A) const
+		{
+			return BlasMatrixDomainRank<Field,Matrix>()(field(),A);
+		}
+
+		//! in-place Rank (the matrix is modified)
+		template <class Matrix>
+		unsigned int rankin(Matrix &A) const
+		{
+			return BlasMatrixDomainRank<Field, Matrix>()(field(),A);
+		}
+
+		//! determinant
+		template <class Matrix>
+		Element det(const Matrix &A) const
+		{
+			return BlasMatrixDomainDet<Field, Matrix>()(field(),A);
+		}
+
+		//! in-place Determinant (the matrix is modified)
+		template <class Matrix>
+		Element detin(Matrix &A) const
+		{
+
+			return BlasMatrixDomainDet<Field, Matrix>()(field(),A);
+		}
+		//@}
+
+		/*!
+		 * @name Solvers for Matrix (respecting BlasMatrix interface)
+		 * with Operand as right or left hand side
+		 */
+		//@{
+		//! linear solve with matrix right hand side.
+		//! AX=B
+		template <class Operand, class Matrix>
+		Operand& left_solve (Operand& X, const Matrix& A, const Operand& B) const
+		{
+			return BlasMatrixDomainLeftSolve<Field,Operand,Matrix>()(field(),X,A,B);
+		}
+
+		//! linear solve with matrix right hand side, the result is stored in-place in B.
+		//! @pre A must be square
+		//! AX=B , (B<-X)
+		template <class Operand,class Matrix>
+		Operand& left_solve (const Matrix& A, Operand& B) const
+		{
+			return BlasMatrixDomainLeftSolve<Field,Operand,Matrix>()(field(),A,B);
+		}
+
+		//! linear solve with matrix right hand side.
+		//! XA=B
+		template <class Operand1, class Matrix, class Operand2>
+		Operand1& right_solve (Operand1& X, const Matrix& A, const Operand2& B) const
+		{
+			return BlasMatrixDomainRightSolve<Field,Operand1,Matrix,Operand2>()(field(),X,A,B);
+		}
+
+		//! linear solve with matrix right hand side, the result is stored in-place in B.
+		//! @pre A must be square
+		//! XA=B , (B<-X)
+		template <class Operand, class Matrix>
+		Operand& right_solve (const Matrix& A, Operand& B) const
+		{
+			return BlasMatrixDomainRightSolve<Field,Operand,Matrix>()(field(),A,B);
+		}
+
+		//! minimal polynomial computation.
+		template <class Polynomial, class Matrix>
+		Polynomial& minpoly( Polynomial& P, const Matrix& A ) const
+		{
+			return BlasMatrixDomainMinpoly<Field, Polynomial, Matrix>()(field(),P,A);
+		}
+
+		//! characteristic polynomial computation.
+		template <class Polynomial,  class Matrix >
+		Polynomial& charpoly( Polynomial& P, const Matrix& A ) const
+		{
+
+			typedef typename Polynomial::Rep PolyRep ;
+			commentator().start ("Givaro::Modular Dense Charpoly ", "MDCharpoly");
+			std::list<PolyRep> P_list;
+			P_list.clear();
+			BlasMatrixDomainCharpoly<Field, std::list<PolyRep>, Matrix >()(field(),P_list,A);
+
+
+			PolyRep tmp(A.rowdim()+1);
+			PolyRep Pt ;
+			typename std::list<PolyRep>::iterator it = P_list.begin();
+			Pt = *(it++);
+			while( it!=P_list.end() ){
+				// Waiting for an implementation of a domain of polynomials
+				mulpoly( tmp, Pt, *it);
+				Pt = tmp;
+				//	delete &(*it);
+				++it;
+			}
+			commentator().stop ("done", NULL, "MDCharpoly");
+
+			P=Pt;
+
+			return P;
+		}
+
+		//! characteristic polynomial computation.
+		template <class Polynomial, class Matrix >
+		std::list<Polynomial>& charpoly( std::list<Polynomial>& P, const Matrix& A ) const
+		{
+			return BlasMatrixDomainCharpoly<Field, std::list<Polynomial>, Matrix >()(field(),P,A);
+		}
+
+		//private:
+		//! @todo Temporary: waiting for an implementation of a domain of polynomial
+		template<class Polynomial>
+		Polynomial &
+		mulpoly(Polynomial &res, const Polynomial & P1, const Polynomial & P2) const
+		{
+			size_t i,j;
+			res.resize(P1.size()+P2.size()-1);
+			for (i=0;i<res.size();i++)
+				field().assign(res[i],field().zero);
+			for ( i=0;i<P1.size();i++)
+				for ( j=0;j<P2.size();j++)
+					field().axpyin(res[i+j],P1[i],P2[j]);
+			return res;
+
+		}
+		//@}
+
+		template<class Matrix1, class Matrix2>
+		bool areEqual(const Matrix1 & A, const Matrix2 & B) const
+		{
+			if ( (A.rowdim() != B.rowdim()) || (A.coldim() != B.coldim()) )
+				return false ;
+			Element a, b; field().init(a); field().init(b);
+			for (size_t i = 0 ; i < A.rowdim() ; ++i)
+				for (size_t j = 0 ; j < A.coldim() ; ++j)
+					if (!field().areEqual(A.getEntry(a,i,j),B.getEntry(b,i,j))) //!@bug use refs
+						return false ;
+			return true ;
+		}
+
+		template<class Matrix>
+		void setIdentity(Matrix & I) const
+		{
+			for (size_t i = 0 ; i< I.rowdim() ; ++i)
+				for (size_t j = 0 ; j < I.coldim() ; ++j) {
+					if (i == j)
+						I.setEntry(i,j,field().one);
+					else
+						I.setEntry(i,j,field().zero);
+				}
+
+		}
+
+		//!@bug use  fflas-ffpack
+		template<class Matrix>
+		void setZero(Matrix & I) const
+		{
+			// use Iterator
+			for (size_t i = 0 ; i< I.rowdim() ; ++i)
+				for (size_t j = 0 ; j < I.coldim() ; ++j) {
+						I.setEntry(i,j,field().zero);
+				}
+		}
+
+		template<class Matrix1>
+		bool isZero(const Matrix1 & A) const
+		{
+			for (size_t i = 0 ; i < A.rowdim() ; ++i)
+				for (size_t j = 0 ; j < A.coldim() ; ++j)
+					if (!field().isZero(A.getEntry(i,j))) //!@bug use refs
+						return false ;
+			return true ;
+		}
+
+		template<class Matrix1>
+		bool isIdentity(const Matrix1 & A) const
+		{
+			if (A.rowdim() != A.coldim())
+				return false ;
+			for (size_t i = 0 ; i < A.rowdim() ; ++i)
+				if (!field().isOne(A.getEntry(i,i)))
+					return false;
+
+			for (size_t i = 0 ; i < A.rowdim() ; ++i)
+				for (size_t j = 0 ; j < i ; ++j)
+					if (!field().isZero(A.getEntry(i,j))) //!@bug use refs
+						return false ;
+			for (size_t i = 0 ; i < A.rowdim() ; ++i)
+				for (size_t j = i+1 ; j < A.coldim() ; ++j)
+					if (!field().isZero(A.getEntry(i,j))) //!@bug use refs
+						return false ;
+			return true ;
+		}
+
+		template<class Matrix1>
+		bool isIdentityGeneralized(const Matrix1 & A) const
+		{
+			size_t mn = std::min(A.rowdim(),A.coldim());
+			for (size_t i = 0 ; i < mn ; ++i)
+				if (!field().isOne(A.getEntry(i,i)))
+					return false;
+
+			for (size_t i = 0 ; i < A.rowdim() ; ++i)
+				for (size_t j = 0 ; j < std::min(i,mn) ; ++j)
+					if (!field().isZero(A.getEntry(i,j))) //!@bug use refs
+						return false ;
+			for (size_t i = 0 ; i < A.rowdim() ; ++i)
+				for (size_t j = i+1 ; j < A.coldim() ; ++j)
+					if (!field().isZero(A.getEntry(i,j))) //!@bug use refs
+						return false ;
+			return true ;
+		}
+
+		// if there is some comparison on the elements, max abs of elements.
+		// whenever a max exists
+		template<class myBlasMatrix>
+		Element& Magnitude(Element&r, const myBlasMatrix &A) const
+		{
+			r = 0;
+			for (size_t i = 0 ; i < A.rowdim(); ++i)
+				for (size_t j = 0 ; j < A.coldim(); ++j) {
+					Element z = A.getEntry(i,j);
+					if (z < 0) z = -z ;
+					if (r < z )
+						r = z;
+				}
+			return r;
+		}
+
+#if 0
+		template<class myBlasMatrix>
+		Integer & Magnitude(Integer &r, const myBlasMatrix1 &A)
+		{
+			r = 0;
+			Integer z;
+			for (size_t i = 0 ; i < A.rowdim(); ++i)
+			for (size_t j = 0 ; j < A.coldim(); ++j) {
+				z = Integer::abs((Integer)A.refEntry(i,j));
+				if (r > z)
+					r = z;
+			}
+			return r;
+		}
+
+		// all entries in A are smaller than a long
+		template<class myBlasMatrix>
+		size_t & Magnitude(size_t &r, const myBlasMatrix1 &A)
+		{
+			r = 0;
+			for (size_t i = 0 ; i < A.rowdim(); ++i)
+			for (size_t j = 0 ; j < A.coldim(); ++j) {
+				if (r > (size_t)std::abs(A.refEntry(i,j)))
+					r = z;
+			}
+			return r;
+		}
+
+		template<class myBlasMatrix>
+		double & Magnitude(double &r, const myBlasMatrix1 &A)
+		{
+			r = 0;
+			for (size_t i = 0 ; i < A.rowdim(); ++i)
+				for (size_t j = 0 ; j < A.coldim(); ++j) {
+					if (r > (double)std::abs(A.refEntry(i,j)))
+						r = z;
+				}
+			return r;
+		}
+#endif
+
+	public:
+
+		/** Print matrix.
+		 * @param  os  Output stream to which matrix is written.
+		 * @param  A   Matrix.
+		 * @returns reference to os.
+		 */
+		template <class Matrix>
+		inline std::ostream &write (std::ostream &os, const Matrix &A) const
+		{
+			return A.write (os);
+		}
+
+		template <class Matrix>
+		inline std::ostream &write (std::ostream &os, const Matrix &A, bool maple_format) const
+		{
+			return A.write (os, field(), maple_format);
+		}
+
+		/** Read matrix
+		 * @param  is  Input stream from which matrix is read.
+		 * @param  A   Matrix.
+		 * @returns reference to is.
+		 */
+		template <class Matrix>
+		inline std::istream &read (std::istream &is, Matrix &A) const
+		{
+			return A.read (is, field());
+		}
+
+	}; /* end of class BlasMatrixDomain */
+
+} /* end of namespace LinBox */
+
+#include "linbox/matrix/matrixdomain/blas-matrix-domain.inl"
+
+#endif /* __LINBOX_blas_matrix_domain_H */
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+
diff --git a/linbox/matrix/matrixdomain/blas-matrix-domain.inl b/linbox/matrix/matrixdomain/blas-matrix-domain.inl
new file mode 100644
index 0000000..2890745
--- /dev/null
+++ b/linbox/matrix/matrixdomain/blas-matrix-domain.inl
@@ -0,0 +1,2101 @@
+/* linbox/matrix/blas-matrix-domain.inl
+ * Copyright (C) 2004 Pascal Giorgi, Clément Pernet
+ *
+ * Written by :
+ *               Pascal Giorgi  pascal.giorgi at ens-lyon.fr
+ *               Clément Pernet clement.pernet at imag.fr
+ *               Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * originally linbox/algorithms/blas-domain.inl
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+
+#ifndef __LINBOX_matrix_matrixdomain_blas_matrix_domain_INL
+#define __LINBOX_matrix_matrixdomain_blas_matrix_domain_INL
+
+namespace LinBox { namespace Protected {
+
+	/*
+	 * **********************************************
+	 * *** Specialization for BlasSubmatrix<Matrix> ***
+	 * the BlasMatrixDomain have template Matrix parameters
+	 * and the specialized one are only for views.
+	 * **********************************************
+	 */
+	// Inversion
+	// dpritcha: now returns nullity. (2004-07-19)
+	// previously returned Ainv but this is passed back anyway.
+	template <class Matrix>
+	class BlasMatrixDomainInv<typename Matrix::Field, BlasSubmatrix<Matrix> > {
+	public:
+
+		int operator() (const typename Matrix::Field &F,
+				BlasSubmatrix<Matrix> &Ainv,
+				BlasSubmatrix<Matrix> &A) const
+		{
+
+			linbox_check( A.rowdim() == A.coldim());
+			linbox_check( A.rowdim() == Ainv.rowdim());
+			linbox_check( A.coldim() == Ainv.coldim());
+			int nullity;
+			FFPACK::Invert2 (F, A.rowdim(), A.getPointer(), A.getStride(),
+					Ainv.getPointer(), Ainv.getStride(),nullity);
+			return nullity;
+		}
+
+	};
+
+	// determinant
+	template <class Matrix>
+	class BlasMatrixDomainDet<typename Matrix::Field, BlasSubmatrix<Matrix> > {
+	public:
+
+		inline typename Matrix::Element operator() (const typename Matrix::Field                             &F,
+							    BlasSubmatrix<Matrix>     &A) const
+		{
+
+			return FFPACK::Det(F, A.rowdim(), A.coldim(), A.getPointer(), A.getStride());
+		}
+	};
+
+
+	// rank
+	template <class Matrix>
+	class 	BlasMatrixDomainRank<typename Matrix::Field, BlasSubmatrix<Matrix> > {
+	public:
+		inline unsigned int operator() (const typename Matrix::Field                                &F,
+						BlasSubmatrix<Matrix>  &A) const
+		{
+			return (unsigned int) FFPACK::Rank(F,
+							   A.rowdim(), A.coldim(), A.getPointer(), A.getStride());
+		}
+	};
+
+} // Protected
+} // LinBox
+
+namespace LinBox
+{ /* Det */
+
+	// Det
+	template< class Field, class Matrix>
+	typename Field::Element
+	BlasMatrixDomainDet<Field, Matrix>::operator() (const Field &F, const Matrix& A) const
+	{
+		typedef typename Matrix::constSubMatrixType constSubMatrixType ;
+		typedef typename Matrix::matrixType       matrixType ;
+		matrixType A_c(A); // do copy
+		constSubMatrixType A_v(A_c);
+		return Protected::BlasMatrixDomainDet<Field, constSubMatrixType>()(F, A_v);
+	}
+
+	template< class Field, class Matrix>
+	typename Field::Element
+	BlasMatrixDomainDet<Field, Matrix>::operator() (const Field &F, Matrix& A) const
+	{
+		typedef typename Matrix::subMatrixType subMatrixType ;
+		subMatrixType A_v(A);
+		return Protected::BlasMatrixDomainDet<Field, subMatrixType>()(F, A_v);
+	}
+
+	template< class Field, class _Rep>
+	// template<class _Rep>
+	class BlasMatrixDomainDet<Field, TriangularBlasMatrix<Field,_Rep> > {
+		typename Field::Element operator() (const Field &F, const TriangularBlasMatrix<Field,_Rep> & A) const
+		{
+			typename Field::Element d ;
+			F.init(d);
+			// is A unit ? return 1
+			// while not 0, mulin
+			return d;
+		}
+	};
+
+} // LinBox
+
+namespace LinBox
+{ /* Rank */
+
+	// what about transpose ?
+
+	// Rank
+	template<class Field, class Matrix>
+	inline unsigned int
+	BlasMatrixDomainRank<Field, Matrix>::operator() (const Field   &F,
+							 const  Matrix  &A) const
+	{
+		typedef typename Matrix::constSubMatrixType constSubMatrixType ;
+		typedef typename Matrix::matrixType       matrixType ;
+		matrixType A_c(A); // do copy
+		constSubMatrixType A_v(A_c);
+
+		return Protected::BlasMatrixDomainRank<Field, constSubMatrixType>()(F, A_v);
+	}
+
+	template<class Field, class Matrix>
+	inline unsigned int
+	BlasMatrixDomainRank<Field, Matrix>::operator() (const Field   &F,
+							 Matrix        &A) const
+	{
+		typedef typename Matrix::subMatrixType subMatrixType ;
+		subMatrixType A_v(A);
+
+		return Protected::BlasMatrixDomainRank<Field, subMatrixType>()(F, A_v);
+	}
+
+} // LinBox
+
+namespace LinBox
+{ /* Inverse */
+	// Inverse
+	template<class Field, class Matrix1, class Matrix2>
+	int BlasMatrixDomainInv<Field, Matrix1, Matrix2>::operator() (const Field &F, Matrix1 &Ainv, const Matrix2 &A) const
+	{
+		typedef typename Matrix1::subMatrixType subMatrixType ;
+		// typedef typename Matrix1::constSubMatrixType constSubMatrixType ;
+		typedef typename Matrix1::matrixType       matrixType ;
+		subMatrixType Ai_v(Ainv);
+		//! @todo check equal submatrix types
+		matrixType A_c(A); // do copy
+		subMatrixType A_v(A_c);
+		return Protected::BlasMatrixDomainInv<Field, subMatrixType>()(F, Ai_v, A_v);
+	}
+
+	template<class Field, class Matrix1, class Matrix2>
+	int BlasMatrixDomainInv<Field, Matrix1, Matrix2>::operator() (const Field &F, Matrix1 &Ainv, Matrix2 &A) const
+	{
+		typedef typename Matrix1::subMatrixType subMatrixType ;
+		subMatrixType Ai_v(Ainv);
+		subMatrixType A_v(A);
+		return Protected::BlasMatrixDomainInv<Field, subMatrixType>()(F, Ai_v, A_v);
+	}
+} // LinBox
+
+namespace LinBox
+{ /* Add Sub */
+
+	// Add
+	template<class Field, class Matrix1, class Matrix2, class Matrix3>
+	Matrix1&
+	BlasMatrixDomainAdd<Field, Matrix1, Matrix2, Matrix3 >::operator()(const Field& F,
+									   Matrix1& C,
+									   const Matrix2& A,
+									   const Matrix3& B) const
+	{
+		linbox_check( A.rowdim() == B.rowdim());
+		linbox_check( C.rowdim() == A.rowdim());
+		linbox_check( A.coldim() == B.coldim());
+		linbox_check( C.coldim() == A.coldim());
+		typedef typename Matrix1::subMatrixType subMatrixType ;
+		typedef typename Matrix1::constSubMatrixType constSubMatrixType ;
+		constSubMatrixType A_v(A);
+		constSubMatrixType B_v(B);
+		subMatrixType C_v(C);
+
+		FFLAS::fadd (F, C_v.rowdim(), C_v.coldim(),
+			     A_v.getPointer(), A_v.getStride(),
+			     B_v.getPointer(), B_v.getStride(),
+			     C_v.getPointer(), C_v.getStride());
+		return C;
+	}
+
+	// AddIn
+	template<class Field, class Matrix1, class Matrix3>
+	Matrix1&
+	BlasMatrixDomainAddin<Field, Matrix1, Matrix3 >::operator()(const Field& F,
+								    Matrix1& C,
+								    const Matrix3& B) const
+	{
+		linbox_check( C.rowdim() == B.rowdim());
+		linbox_check( C.coldim() == B.coldim());
+		typedef typename Matrix1::subMatrixType subMatrixType ;
+		typedef typename Matrix1::constSubMatrixType constSubMatrixType ;
+		constSubMatrixType B_v(B);
+		subMatrixType C_v(C);
+
+		FFLAS::faddin (F, C_v.rowdim(), C_v.coldim(),
+			       B_v.getPointer(), B_v.getStride(),
+			       C_v.getPointer(), C_v.getStride());
+		return C;
+	}
+
+
+	// Sub
+	template<class Field, class Matrix1, class Matrix2, class Matrix3>
+	Matrix1&
+	BlasMatrixDomainSub<Field, Matrix1, Matrix2, Matrix3 >::operator()(const Field& F,
+									   Matrix1& C,
+									   const Matrix2& A,
+									   const Matrix3& B) const
+	{
+		linbox_check( A.rowdim() == B.rowdim());
+		linbox_check( C.rowdim() == A.rowdim());
+		linbox_check( A.coldim() == B.coldim());
+		linbox_check( C.coldim() == A.coldim());
+		typedef typename Matrix1::subMatrixType subMatrixType ;
+		typedef typename Matrix1::constSubMatrixType constSubMatrixType ;
+		constSubMatrixType A_v(A);
+		constSubMatrixType B_v(B);
+		subMatrixType C_v(C);
+
+		FFLAS::fsub (F, C_v.rowdim(), C_v.coldim(),
+			     A_v.getPointer(), A_v.getStride(),
+			     B_v.getPointer(), B_v.getStride(),
+			     C_v.getPointer(), C_v.getStride());
+		return C;
+	}
+
+	// SubIn
+	template<class Field, class Matrix1, class Matrix3>
+	Matrix1&
+	BlasMatrixDomainSubin<Field, Matrix1, Matrix3 >::operator()(const Field& F,
+								    Matrix1& C,
+								    const Matrix3& B) const
+	{
+		linbox_check( C.rowdim() == B.rowdim());
+		linbox_check( C.coldim() == B.coldim());
+		typedef typename Matrix1::subMatrixType subMatrixType ;
+		typedef typename Matrix1::constSubMatrixType constSubMatrixType ;
+		constSubMatrixType B_v(B);
+		subMatrixType C_v(C);
+
+		FFLAS::fsubin (F, C_v.rowdim(), C_v.coldim(),
+			       B_v.getPointer(), B_v.getStride(),
+			       C_v.getPointer(), C_v.getStride());
+		return C;
+	}
+
+} // LinBox
+
+namespace LinBox
+{ /* Copy */
+	//Copy
+	template<class Field, class Matrix1, class Matrix2>
+	Matrix1&
+	BlasMatrixDomainCopy<Field, Matrix1, Matrix2 >::operator()(const Field& F,
+								   Matrix1& B,
+								   const Matrix2& A) const
+	{
+		linbox_check( A.rowdim() == B.rowdim());
+		linbox_check( A.coldim() == B.coldim());
+		typedef typename Matrix1::subMatrixType subMatrixType ;
+		typedef typename Matrix1::constSubMatrixType constSubMatrixType ;
+		constSubMatrixType A_v(A);
+		subMatrixType B_v(B);
+
+		for (size_t i=0; i<A.rowdim(); i++)
+			FFLAS::fassign (F, A_v.coldim(),
+				      A_v.getPointer() + i*A_v.getStride(), 1,
+				      B_v.getPointer() + i*B_v.getStride(), 1);
+		return B;
+	}
+} // LinBox
+
+namespace LinBox
+{ /* MulAdd */
+
+	//  general matrix-matrix multiplication and addition with scaling
+	// D= b11eta.C + alpha.A*B
+#if 0
+	template<class Field>
+	class 	BlasMatrixDomainMulAdd<BlasMatrix<Field, _Rep>, BlasMatrix<Field, _Rep>, BlasMatrix<Field, _Rep> > {
+	public:
+		BlasMatrix<Field, _Rep>&
+		operator()(//const Field                              & F,
+			   BlasMatrix<Field, _Rep>      & D,
+			   const typename Field::Element            & beta,
+			   const BlasMatrix<Field, _Rep>& C,
+			   const typename Field::Element            & alpha,
+			   const BlasMatrix<Field, _Rep>& A,
+			   const BlasMatrix<Field, _Rep>& B) const
+		{
+			linbox_check( A.coldim() == B.rowdim());
+			linbox_check( C.rowdim() == A.rowdim());
+			linbox_check( C.coldim() == B.coldim());
+			linbox_check( D.rowdim() == C.rowdim());
+			linbox_check( D.coldim() == C.coldim());
+
+			D=C;
+
+			FFLAS::fgemm( C.field(), FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+				     C.rowdim(), C.coldim(), A.coldim(),
+				     alpha,
+				     A.getPointer(), A.getStride(),
+				     B.getPointer(), B.getStride(),
+`				     beta,
+				     D.getPointer(), D.getStride());
+			return D;
+		}
+
+
+		BlasMatrix<Field, _Rep>&
+		operator() (//const Field                              & F,
+			    const typename Field::Element            & beta,
+			    BlasMatrix<Field, _Rep>      & C,
+			    const typename Field::Element            & alpha,
+			    const BlasMatrix<Field, _Rep>& A,
+			    const BlasMatrix<Field, _Rep>& B) const
+		{
+			linbox_check( A.coldim() == B.rowdim());
+			linbox_check( C.rowdim() == A.rowdim());
+			linbox_check( C.coldim() == B.coldim());
+
+			FFLAS::fgemm( C.field(), FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+				     C.rowdim(), C.coldim(), A.coldim(),
+				     alpha,
+				     A.getPointer(), A.getStride(),
+				     B.getPointer(), B.getStride(),
+				     beta,
+				     C.getPointer(), C.getStride());
+			return C;
+		}
+	};
+#endif
+
+
+#if 1
+	template<class Matrix1, class Matrix2, class Matrix3>
+	class 	BlasMatrixDomainMulAdd {
+	public:
+		typedef typename Matrix1::Field Field;
+
+		template<class _Rep>
+		Matrix1&
+		operator()( Matrix1                       & D,
+			    const typename Field::Element & beta,
+			    const BlasMatrix<Field, _Rep>       & C,
+			    const typename Field::Element & alpha,
+			    const Matrix1                 & A,
+			    const Matrix2                 & B) const
+		{
+			linbox_check( A.coldim() == B.rowdim());
+			linbox_check( C.rowdim() == A.rowdim());
+			linbox_check( C.coldim() == B.coldim());
+			linbox_check( D.rowdim() == C.rowdim());
+			linbox_check( D.coldim() == C.coldim());
+			typedef typename Matrix1::subMatrixType subMatrixType ;
+			typedef typename Matrix1::constSubMatrixType constSubMatrixType ;
+
+			D.copy(C);
+
+			constSubMatrixType A_v(A);
+			constSubMatrixType B_v(B);
+			constSubMatrixType C_v(C);
+			subMatrixType D_v(D);
+
+                        FFLAS::fgemm( C.field(), FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+				     C_v.rowdim(), C_v.coldim(), A_v.coldim(),
+				     alpha,
+				     A_v.getPointer(), A_v.getStride(),
+				     B_v.getPointer(), B_v.getStride(),
+				     beta,
+				     D_v.getWritePointer(), D_v.getStride());
+			return D;
+		}
+
+		Matrix1&
+		operator() ( const typename Field::Element              & beta,
+			     Matrix1                                    & C,
+			     const typename Field::Element              & alpha,
+			     const Matrix2                              & A,
+			     const Matrix3                              & B) const
+		{
+			linbox_check( A.coldim() == B.rowdim());
+			linbox_check( C.rowdim() == A.rowdim());
+			linbox_check( C.coldim() == B.coldim());
+			typedef typename Matrix1::subMatrixType subMatrixType ;
+			typedef typename Matrix1::constSubMatrixType constSubMatrixType ;
+			constSubMatrixType A_v(A);
+			constSubMatrixType B_v(B);
+			subMatrixType C_v(C);
+
+			FFLAS::fgemm( C.field(), FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+				     C_v.rowdim(), C_v.coldim(), A_v.coldim(),
+				     alpha,
+				     A_v.getPointer(), A_v.getStride(),
+				     B_v.getPointer(), B_v.getStride(),
+				     beta,
+				     C_v.getWritePointer(), C_v.getStride());
+			return C;
+		}
+	};
+
+#endif
+
+	// One specialization with BlasSubmatrix (needed by BlockMasseyDomain
+	// other specialisation need to be done ...
+	template<class Matrix, class _Rep>
+	class 	BlasMatrixDomainMulAdd<BlasSubmatrix<Matrix>, BlasSubmatrix<Matrix>, BlasMatrix<typename Matrix::Field, _Rep> > {
+	public:
+		typedef typename Matrix::Field Field;
+		BlasSubmatrix<Matrix>&
+		operator()( BlasSubmatrix<Matrix>         & D,
+			    const typename Field::Element & beta,
+			    const BlasSubmatrix<Matrix>   & C,
+			    const typename Field::Element & alpha,
+			    const BlasSubmatrix<Matrix>   & A,
+			    const BlasMatrix<Field, _Rep>       & B) const
+		{
+			linbox_check( A.coldim() == B.rowdim());
+			linbox_check( C.rowdim() == A.rowdim());
+			linbox_check( C.coldim() == B.coldim());
+			linbox_check( D.rowdim() == C.rowdim());
+			linbox_check( D.coldim() == C.coldim());
+
+			D.copy(C);
+
+			FFLAS::fgemm( C.field(), FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+				     C.rowdim(), C.coldim(), A.coldim(),
+				     alpha,
+				     A.getPointer(), A.getStride(),
+				     B.getPointer(), B.getStride(),
+				     beta,
+				     D.getPointer(), D.getStride());
+			return D;
+		}
+
+
+		BlasSubmatrix<Matrix>&
+		operator() ( const typename Field::Element & beta,
+			     BlasSubmatrix<Matrix>         & C,
+			     const typename Field::Element & alpha,
+			     const BlasSubmatrix<Matrix>   & A,
+			     const BlasMatrix<Field, _Rep>       & B) const
+		{
+			linbox_check( A.coldim() == B.rowdim());
+			linbox_check( C.rowdim() == A.rowdim());
+			linbox_check( C.coldim() == B.coldim());
+
+			FFLAS::fgemm( C.field(), FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+				     C.rowdim(), C.coldim(), A.coldim(),
+				     alpha,
+				     A.getPointer(), A.getStride(),
+				     B.getPointer(), B.getStride(),
+				     beta,
+				     C.getPointer(), C.getStride());
+			return C;
+		}
+	};
+
+	template<class Matrix>
+	class 	BlasMatrixDomainMulAdd<BlasSubmatrix<Matrix>, BlasSubmatrix<Matrix>, BlasSubmatrix<Matrix> > {
+	public:
+		typedef typename Matrix::Field Field;
+		BlasSubmatrix<Matrix>&
+		operator()( BlasSubmatrix<Matrix>         & D,
+			    const typename Field::Element & beta,
+			    const BlasSubmatrix<Matrix>   & C,
+			    const typename Field::Element & alpha,
+			    const BlasSubmatrix<Matrix>   & A,
+			    const BlasSubmatrix<Matrix>   & B) const
+		{
+			linbox_check( A.coldim() == B.rowdim());
+			linbox_check( C.rowdim() == A.rowdim());
+			linbox_check( C.coldim() == B.coldim());
+			linbox_check( D.rowdim() == C.rowdim());
+			linbox_check( D.coldim() == C.coldim());
+
+			D.copy(C);
+
+			FFLAS::fgemm( C.field(), FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+				     C.rowdim(), C.coldim(), A.coldim(),
+				     alpha,
+				     A.getPointer(), A.getStride(),
+				     B.getPointer(), B.getStride(),
+				     beta,
+				     D.getPointer(), D.getStride());
+			return D;
+		}
+
+
+		BlasSubmatrix<Matrix>&
+		operator() ( const typename Field::Element & beta,
+			     BlasSubmatrix<Matrix>         & C,
+			     const typename Field::Element & alpha,
+			     const BlasSubmatrix<Matrix>   & A,
+			     const BlasSubmatrix<Matrix>   & B) const
+		{
+			linbox_check( A.coldim() == B.rowdim());
+			linbox_check( C.rowdim() == A.rowdim());
+			linbox_check( C.coldim() == B.coldim());
+
+			FFLAS::fgemm( C.field(), FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+				     C.rowdim(), C.coldim(), A.coldim(),
+				     alpha,
+				     A.getPointer(), A.getStride(),
+				     B.getPointer(), B.getStride(),
+				     beta,
+				     C.getWritePointer(), C.getStride());
+			return C;
+		}
+	};
+
+
+	template<class Field, class _Rep>
+	class 	BlasMatrixDomainMulAdd< BlasMatrix<Field, _Rep>, TransposedBlasMatrix<BlasMatrix<Field, _Rep> >, BlasMatrix<Field, _Rep> > {
+	public:
+		BlasMatrix<Field, _Rep>&
+		operator()( BlasMatrix<Field, _Rep>                              & D,
+			    const typename Field::Element                  & beta,
+			    const BlasMatrix<Field, _Rep>                        & C,
+			    const typename Field::Element                  & alpha,
+			    const TransposedBlasMatrix<BlasMatrix<Field, _Rep> > & A,
+			    const BlasMatrix<Field, _Rep>                        & B) const
+		{
+			linbox_check( A.getMatrix().rowdim() == B.rowdim());
+			linbox_check( C.rowdim() == A.getMatrix().coldim());
+			linbox_check( C.coldim() == B.coldim());
+			linbox_check( D.rowdim() == C.rowdim());
+			linbox_check( D.coldim() == C.coldim());
+
+			D=C;
+
+			FFLAS::fgemm( B.field(), FFLAS::FflasTrans, FFLAS::FflasNoTrans,
+				     C.rowdim(), C.coldim(), B.rowdim(),
+				     alpha,
+				     A.getMatrix().getPointer(), A.getMatrix().getStride(),
+				     B.getPointer(), B.getStride(),
+				     beta,
+				     D.getPointer(), D.getStride());
+
+			return D;
+		}
+
+
+		BlasMatrix<Field, _Rep>&
+		operator() ( const typename Field::Element                  & beta,
+			     BlasMatrix<Field, _Rep>                              & C,
+			     const typename Field::Element                  & alpha,
+			     const TransposedBlasMatrix<BlasMatrix<Field, _Rep> > & A,
+			     const BlasMatrix<Field, _Rep>                        & B) const
+		{
+			linbox_check( A.getMatrix().rowdim() == B.rowdim());
+			linbox_check( C.rowdim() == A.getMatrix().coldim());
+			linbox_check( C.coldim() == B.coldim());
+
+			FFLAS::fgemm( B.field(), FFLAS::FflasTrans, FFLAS::FflasNoTrans,
+				     C.rowdim(), C.coldim(), B.rowdim(),
+				     alpha,
+				     A.getMatrix().getPointer(), A.getMatrix().getStride(),
+				     B.getPointer(), B.getStride(),
+				     beta,
+				     C.getPointer(), C.getStride());
+			return C;
+		}
+	};
+
+	template<class Field, class _Rep>
+	class 	BlasMatrixDomainMulAdd< BlasMatrix<Field, _Rep>, TransposedBlasMatrix<BlasMatrix<Field, _Rep> >, TransposedBlasMatrix<BlasMatrix<Field, _Rep> > > {
+	public:
+		BlasMatrix<Field, _Rep>&
+		operator()( BlasMatrix<Field, _Rep>                              & D,
+			    const typename Field::Element                  & beta,
+			    const BlasMatrix<Field, _Rep>                        & C,
+			    const typename Field::Element                  & alpha,
+			    const TransposedBlasMatrix<BlasMatrix<Field, _Rep> > & A,
+			    const TransposedBlasMatrix<BlasMatrix<Field, _Rep> > & B) const
+		{
+			linbox_check( A.getMatrix().rowdim() == B.getMatrix().coldim());
+			linbox_check( C.rowdim() == A.getMatrix().coldim());
+			linbox_check( C.coldim() == B.getMatrix().rowdim());
+			linbox_check( D.rowdim() == C.rowdim());
+			linbox_check( D.coldim() == C.coldim());
+
+			D=C;
+
+			FFLAS::fgemm( C.field(), FFLAS::FflasTrans, FFLAS::FflasTrans,
+				     C.rowdim(), C.coldim(), A.getMatrix().rowdim(),
+				     alpha,
+				     A.getMatrix().getPointer(), A.getMatrix().getStride(),
+				     B.getMatrix().getPointer(), B.getMatrix().getStride(),
+				     beta,
+				     D.getPointer(), D.getStride());
+			return D;
+		}
+
+
+		BlasMatrix<Field, _Rep>&
+		operator() ( const typename Field::Element                  & beta,
+			     BlasMatrix<Field, _Rep>                              & C,
+			     const typename Field::Element                  & alpha,
+			     const TransposedBlasMatrix<BlasMatrix<Field, _Rep> > & A,
+			     const TransposedBlasMatrix<BlasMatrix<Field, _Rep> > & B) const
+		{
+			linbox_check( A.getMatrix().rowdim() == B.getMatrix().coldim());
+			linbox_check( C.rowdim() == A.getMatrix().coldim());
+			linbox_check( C.coldim() == B.getMatrix().rowdim());
+
+			FFLAS::fgemm( C.field(), FFLAS::FflasTrans, FFLAS::FflasTrans,
+				     C.rowdim(), C.coldim(), A.getMatrix().rowdim(),
+				     alpha,
+				     A.getMatrix().getPointer(), A.getMatrix().getStride(),
+				     B.getMatrix().getPointer(), B.getMatrix().getStride(),
+				     beta,
+				     C.getPointer(), C.getStride());
+			return C;
+		}
+	};
+
+	template<class Field, class _Rep>
+	class 	BlasMatrixDomainMulAdd< BlasMatrix<Field, _Rep>, BlasMatrix<Field, _Rep>, TransposedBlasMatrix<BlasMatrix<Field, _Rep> > > {
+	public:
+		BlasMatrix<Field, _Rep>&
+		operator()( BlasMatrix<Field, _Rep>                              & D,
+			    const typename Field::Element                  & beta,
+			    const BlasMatrix<Field, _Rep>                        & C,
+			    const typename Field::Element                  & alpha,
+			    const BlasMatrix<Field, _Rep>                        & A,
+			    const TransposedBlasMatrix<BlasMatrix<Field, _Rep> > & B) const
+		{
+			linbox_check( A.coldim() == B.getMatrix().coldim());
+			linbox_check( C.rowdim() == A.rowdim());
+			linbox_check( C.coldim() == B.getMatrix().rowdim());
+			linbox_check( D.rowdim() == C.rowdim());
+			linbox_check( D.coldim() == C.coldim());
+
+			D=C;
+			FFLAS::fgemm( C.field(), FFLAS::FflasNoTrans, FFLAS::FflasTrans,
+				     C.rowdim(), C.coldim(), A.coldim(),
+				     alpha,
+				     A.getPointer(), A.getStride(),
+				     B.getMatrix().getPointer(), B.getMatrix().getStride(),
+				     beta,
+				     D.getPointer(), D.getStride());
+			return D;
+		}
+
+
+		BlasMatrix<Field, _Rep>&
+		operator() ( const typename Field::Element                  & beta,
+			     BlasMatrix<Field, _Rep>                              & C,
+			     const typename Field::Element                  & alpha,
+			     const BlasMatrix<Field, _Rep>                        & A,
+			     const TransposedBlasMatrix<BlasMatrix<Field, _Rep> > & B) const
+		{
+			linbox_check( A.coldim() == B.getMatrix().coldim());
+			linbox_check( C.rowdim() == A.rowdim());
+			linbox_check( C.coldim() == B.getMatrix().rowdim());
+
+			FFLAS::fgemm( C.field(), FFLAS::FflasNoTrans, FFLAS::FflasTrans,
+				     C.rowdim(), C.coldim(), A.coldim(),
+				     alpha,
+				     A.getPointer(), A.getStride(),
+				     B.getMatrix().getPointer(), B.getMatrix().getStride(),
+				     beta,
+				     C.getPointer(), C.getStride());
+			return C;
+		}
+	};
+
+#if 1
+	/*
+	 * specialization for Operand1 and Operand3 of type std::vector<Element>
+	 * and Operand2 of type BlasMatrix<Field, _Rep>
+	 */
+
+	//  general matrix-vector multiplication and addition with scaling
+	// d = beta.c + alpha.A*b
+	template<class Field, class _Rep>
+	class BlasMatrixDomainMulAdd<std::vector<typename Field::Element>, BlasMatrix<Field, _Rep>, std::vector<typename Field::Element> > {
+	public:
+		std::vector<typename Field::Element>&
+		operator() ( std::vector<typename Field::Element>       & d,
+			     const typename Field::Element              & beta,
+			     const std::vector<typename Field::Element> & c,
+			     const typename Field::Element              & alpha,
+			     const BlasMatrix<Field, _Rep>                    & A,
+			     const std::vector<typename Field::Element> & b) const
+		{
+			linbox_check( A.coldim() == b.size());
+			linbox_check( c.size()   == b.size());
+			linbox_check( d.size()   == c.size());
+			d=c;
+
+			FFLAS::fgemv( A.field(), FFLAS::FflasNoTrans,
+				     A.rowdim(), A.coldim(),
+				     alpha,
+				     A.getPointer(), A.getStride(),
+				     &b[0],1,
+				     beta,
+				     &d[0],1);
+			return d;
+		}
+
+
+		std::vector<typename Field::Element>&
+		operator() ( const typename Field::Element              & beta,
+			     std::vector<typename Field::Element>       & c,
+			     const typename Field::Element              & alpha,
+			     const BlasMatrix<Field, _Rep>                    & A,
+			     const std::vector<typename Field::Element> & b) const
+		{
+			linbox_check( A.coldim() == b.size());
+			linbox_check( A.rowdim() == c.size()); //fixed: dpritcha
+
+			FFLAS::fgemv( A.field(), FFLAS::FflasNoTrans,
+				     A.rowdim(), A.coldim(),
+				     alpha,
+				     A.getPointer(), A.getStride(),
+				     &b[0],1,
+				     beta,
+				     &c[0],1);
+			return c;
+		}
+	};
+
+
+	//  general matrix-vector multiplication and addition with scaling
+	// d = beta.c + alpha.A*b
+	//! what about subvector/submatrices ?
+	template<class Field, class _Rep>
+	class BlasMatrixDomainMulAdd<BlasVector<Field>, BlasMatrix<Field, _Rep>, BlasVector<Field> > {
+	public:
+		BlasVector<Field>&
+		operator() ( BlasVector<Field>             & d,
+			     const typename Field::Element & beta,
+			     const BlasVector<Field>       & c,
+			     const typename Field::Element & alpha,
+			     const BlasMatrix<Field, _Rep>       & A,
+			     const BlasVector<Field>       & b) const
+		{
+			linbox_check( A.coldim() == b.size());
+			linbox_check( c.size()   == b.size());
+			linbox_check( d.size()   == c.size());
+			d=c;
+
+			FFLAS::fgemv( A.field(), FFLAS::FflasNoTrans,
+				     A.rowdim(), A.coldim(),
+				     alpha,
+				     A.getPointer(), A.getStride(),
+				     b.getPointer(),b.getStride(),
+				     beta,
+				     d.getWritePointer(),d.getStride());
+			return d;
+		}
+
+
+		BlasVector<Field>&
+		operator() ( const typename Field::Element & beta,
+			     BlasVector<Field>             & c,
+			     const typename Field::Element & alpha,
+			     const BlasMatrix<Field, _Rep>       & A,
+			     const BlasVector<Field>       & b) const
+		{
+			linbox_check( A.coldim() == b.size());
+			linbox_check( A.rowdim() == c.size()); //fixed: dpritcha
+
+			FFLAS::fgemv( A.field(), FFLAS::FflasNoTrans,
+				     A.rowdim(), A.coldim(),
+				     alpha,
+				     A.getPointer(), A.getStride(),
+				     b.getPointer(),b.getStride(),
+				     beta,
+				     c.getWritePointer(),c.getStride());
+			return c;
+		}
+	};
+
+	//  general vector-matrix multiplication and addition with scaling
+	// d = beta.c + alpha.a*B -- note order of coldim, rowdim passed to fgemv is switched
+	template<class Field, class _Rep>
+	class BlasMatrixDomainMulAdd<std::vector<typename Field::Element>,std::vector<typename Field::Element>, BlasMatrix<Field, _Rep> > {
+	public:
+		std::vector<typename Field::Element>&
+		operator() ( std::vector<typename Field::Element>       & d,
+			     const typename Field::Element              & beta,
+			     const std::vector<typename Field::Element> & c,
+			     const typename Field::Element              & alpha,
+			     const std::vector<typename Field::Element> & a,
+			     const BlasMatrix<Field, _Rep>                    & B) const
+		{
+			linbox_check( B.rowdim() == a.size());
+			linbox_check( B.coldim() == c.size());
+			linbox_check( d.size()   == c.size());
+			d=c;
+
+			FFLAS::fgemv( B.field(), FFLAS::FflasTrans,
+				     B.rowdim(), B.coldim(),
+				     alpha,
+				     B.getPointer(), B.getStride(),
+				     &a[0],1,
+				     beta,
+				     &d[0],1);
+			return d;
+		}
+
+
+		std::vector<typename Field::Element>&
+		operator() ( const typename Field::Element              & beta,
+			     std::vector<typename Field::Element>       & c,
+			     const typename Field::Element              & alpha,
+			     const std::vector<typename Field::Element> & a,
+			     const BlasMatrix<Field, _Rep>                    & B) const
+		{
+			linbox_check( B.rowdim() == a.size());
+			linbox_check( B.coldim() == c.size());
+
+			FFLAS::fgemv( B.field(), FFLAS::FflasTrans,
+				     B.rowdim(), B.coldim(),
+				     alpha,
+				     B.getPointer(), B.getStride(),
+				     &a[0],1,
+				     beta,
+
+				     &c[0],1);
+			return c;
+		}
+	};
+
+	template<class Field, class _Rep>
+	class BlasMatrixDomainMulAdd<BlasVector<Field>, BlasVector<Field>, BlasMatrix<Field, _Rep> > {
+	public:
+		BlasVector<Field>&
+		operator() ( BlasVector<Field>              & d,
+			     const typename Field::Element  & beta,
+			     const BlasVector<Field>        & c,
+			     const typename Field::Element  & alpha,
+			     const BlasVector<Field>        & a,
+			     const BlasMatrix<Field, _Rep>        & B) const
+		{
+			linbox_check( B.rowdim() == a.size());
+			linbox_check( B.coldim() == c.size());
+			linbox_check( d.size()   == c.size());
+			d=c;
+
+			FFLAS::fgemv( B.field(), FFLAS::FflasTrans,
+				     B.rowdim(), B.coldim(),
+				     alpha,
+				     B.getPointer(), B.getStride(),
+				     a.getPonter(),a.getStride(),
+				     beta,
+				     a.getWritePointer(),a.getStride());
+			return d;
+		}
+
+
+		BlasVector<Field>&
+		operator() ( const typename Field::Element              & beta,
+			     BlasVector<Field>                          & c,
+			     const typename Field::Element              & alpha,
+			     const BlasVector<Field>                    & a,
+			     const BlasMatrix<Field, _Rep>                    & B) const
+		{
+			linbox_check( B.rowdim() == a.size());
+			linbox_check( B.coldim() == c.size());
+
+			FFLAS::fgemv( B.field(), FFLAS::FflasTrans,
+				     B.rowdim(), B.coldim(),
+				     alpha,
+				     B.getPointer(), B.getStride(),
+				     a.getPointer(),a.getStride(),
+				     beta,
+				     c.getWritePointer(),c.getStride());
+			return c;
+		}
+	};
+
+#endif
+
+
+	/*
+	 * Specialization for Operand1, Operand2  of type BlasMatrix<Field, _Rep>
+	 * and Operand3 of type BlasPermutation
+	 */
+
+	// Matrix permutation product C = A*B
+	template<class Field, class _Rep>
+	class BlasMatrixDomainMul<Field, BlasMatrix<Field, _Rep>, BlasMatrix<Field, _Rep>, BlasPermutation<size_t> > {
+	public:
+		BlasMatrix<Field, _Rep>& operator()(const Field& F,
+						    BlasMatrix<Field, _Rep>& C,
+						    const BlasMatrix<Field, _Rep>& A,
+						    const BlasPermutation<size_t>& B) const
+		{
+			C = A;
+			return BlasMatrixDomainMulin<Field, BlasMatrix<Field, _Rep>, BlasPermutation<size_t> >()( F, C, B);
+		}
+	};
+
+	template<class Field, class _Rep>
+	class BlasMatrixDomainMul<Field, BlasMatrix<Field, _Rep>, BlasPermutation<size_t>, BlasMatrix<Field, _Rep> > {
+	public:
+		BlasMatrix<Field, _Rep>& operator()(const Field& F,
+						    BlasMatrix<Field, _Rep>& C,
+						    const BlasPermutation<size_t>& B,
+						    const BlasMatrix<Field, _Rep>& A) const
+		{
+			C = A;
+			return BlasMatrixDomainMulin<Field, BlasMatrix<Field,_Rep>, BlasPermutation<size_t> >()( F, B, C);
+		}
+	};
+
+	/*
+	 * specialization for Operand1, Operand2  of type BlasMatrix<Field, _Rep> and Operand3 of type TransposedBlasMatrix<BlasPermutation<size_t> >
+	 */
+
+	// Matrix permutation product C = A*B
+	template<class Field, class _Rep>
+	class BlasMatrixDomainMul<Field, BlasMatrix<Field,_Rep>, BlasMatrix<Field,_Rep>, TransposedBlasMatrix<BlasPermutation<size_t> > > {
+	public:
+		BlasMatrix<Field, _Rep>& operator()(const Field& F,
+						    BlasMatrix<Field, _Rep>& C,
+						    const BlasMatrix<Field, _Rep>& A,
+						    const TransposedBlasMatrix<BlasPermutation<size_t> >& B) const
+		{
+			C = A;
+			return BlasMatrixDomainMulin<Field, BlasMatrix<Field,_Rep>, TransposedBlasMatrix<BlasPermutation<size_t> > >()( F, C, B);
+		}
+	};
+
+	template<class Field, class _Rep>
+	class BlasMatrixDomainMul<Field, BlasMatrix<Field,_Rep>, TransposedBlasMatrix<BlasPermutation<size_t> >, BlasMatrix<Field,_Rep> > {
+	public:
+		BlasMatrix<Field, _Rep>& operator()(const Field& F,
+						    BlasMatrix<Field, _Rep>& C,
+						    const TransposedBlasMatrix<BlasPermutation<size_t> >& B,
+						    const BlasMatrix<Field, _Rep>& A) const
+		{
+			C = A;
+			return BlasMatrixDomainMulin<Field, BlasMatrix<Field,_Rep>, TransposedBlasMatrix<BlasPermutation<size_t> > >()( F, B, C);
+		}
+	};
+
+	/*
+	 * specialization for Operand1 of type BlasMatrix<Field, _Rep> and Operand2 of type BlasPermutation
+	 */
+
+} // LinBox
+
+namespace LinBox
+{ /* Mulin */
+	// In-place matrix permutation product
+	template<class Field, class _Rep>
+	class BlasMatrixDomainMulin<Field, BlasMatrix<Field,_Rep>, BlasPermutation<size_t> > {
+	public:
+		BlasMatrix<Field, _Rep>& operator()( const Field& F,
+						     BlasMatrix<Field, _Rep>& A,
+						     const BlasPermutation<size_t>& B) const
+		{
+			if (B.isIdentity()) return A ;
+			linbox_check( A.coldim() >= B.getSize() );
+			FFPACK::applyP( F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
+				       A.rowdim(), 0,(int) B.getOrder(),
+				       A.getPointer(), A.getStride(), B.getPointer() );
+			return A;
+		}
+
+		BlasMatrix<Field, _Rep>& operator()( const Field& F,
+						     const BlasPermutation<size_t>& B,
+						     BlasMatrix<Field, _Rep>& A) const
+		{                        
+			if (B.isIdentity()) return A ;
+			linbox_check( A.rowdim() >= B.getSize() );
+			FFPACK::applyP( F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
+				       A.coldim(), 0,(int) B.getOrder(), A.getPointer(), A.getStride(), B.getPointer() );
+			return A;
+		}
+
+	};
+
+	template<class Field, class _Rep>
+	class BlasMatrixDomainMulin<Field, BlasMatrix<Field,_Rep>, TransposedBlasMatrix<BlasPermutation<size_t> > > {
+	public:
+		BlasMatrix<Field, _Rep>& operator()( const Field& F,
+						     BlasMatrix<Field, _Rep>& A,
+						     const TransposedBlasMatrix<BlasPermutation<size_t> >& B) const
+		{
+			if (B.getMatrix().isIdentity()) return A ;
+			linbox_check( A.coldim() >= B.getMatrix().getSize() );
+			FFPACK::applyP( F, FFLAS::FflasRight, FFLAS::FflasTrans,
+				       A.rowdim(), 0,(int) B.getMatrix().getOrder(),
+				       A.getPointer(), A.getStride(), B.getMatrix().getPointer() );
+			return A;
+		}
+		BlasMatrix<Field, _Rep>& operator()(  const Field& F,
+						      const TransposedBlasMatrix<BlasPermutation<size_t> >& B,
+						      BlasMatrix<Field, _Rep>& A) const
+		{
+			if (B.getMatrix().isIdentity()) return A ;
+			linbox_check( A.rowdim() >= B.getMatrix().getSize() );
+			FFPACK::applyP( F, FFLAS::FflasLeft, FFLAS::FflasTrans,
+				       A.coldim(), 0,(int) B.getMatrix().getOrder(), A.getPointer(), A.getStride(), B.getMatrix().getPointer() );
+			return A;
+		}
+	};
+
+
+
+#if 1
+	/*
+	 * specialization for Operand1, Operand2  of type std::vector<Element> and Operand3 of type BlasPermutation
+	 */
+
+	// Matrix permutation product C = A*B
+	template<class Field>
+	class BlasMatrixDomainMul<Field,std::vector<typename Field::Element>,std::vector<typename Field::Element>, BlasPermutation<size_t> > {
+	public:
+		std::vector<typename Field::Element>& operator()(const Field& F,
+								 std::vector<typename Field::Element>& C,
+								 const std::vector<typename Field::Element>& A,
+								 const BlasPermutation<size_t>& B) const
+		{
+			C = A;
+			return BlasMatrixDomainMulin<Field,std::vector<typename Field::Element>, BlasPermutation<size_t> >()( F, C, B);
+		}
+	};
+
+	template<class Field>
+	class BlasMatrixDomainMul<Field,std::vector<typename Field::Element>, BlasPermutation<size_t>,std::vector<typename Field::Element> > {
+	public:
+		std::vector<typename Field::Element>& operator()(const Field& F,
+								 std::vector<typename Field::Element>& C,
+								 const BlasPermutation<size_t>& B,
+								 const std::vector<typename Field::Element>& A) const
+		{
+			C = A;
+			return BlasMatrixDomainMulin<Field,std::vector<typename Field::Element>, BlasPermutation<size_t> >()( F, B, C);
+		}
+	};
+
+
+	template<class Field>
+	class BlasMatrixDomainMul<Field, BlasVector<Field >, BlasVector<Field >, BlasPermutation<size_t> > {
+	public:
+		BlasVector<Field >& operator()(const Field& F,
+					       BlasVector<Field >& C,
+					       const BlasVector<Field >& A,
+					       const BlasPermutation<size_t>& B) const
+		{
+			C = A;
+			return BlasMatrixDomainMulin<Field, BlasVector<Field >, BlasPermutation<size_t> >()( F, C, B);
+		}
+	};
+
+	template<class Field>
+	class BlasMatrixDomainMul<Field, BlasVector<Field >, BlasPermutation<size_t>, BlasVector<Field > > {
+	public:
+		BlasVector<Field >& operator()(const Field& F,
+					       BlasVector<Field >& C,
+					       const BlasPermutation<size_t>& B,
+					       const BlasVector<Field >& A) const
+		{
+			C = A;
+			return BlasMatrixDomainMulin<Field, BlasVector<Field >, BlasPermutation<size_t> >()( F, B, C);
+		}
+	};
+
+
+	/*
+	 * specialization for Operand1, Operand2  of type std::vector<Element> and Operand3 of type TransposedBlasMatrix<BlasPermutation<size_t> >
+	 */
+
+	// Matrix permutation product C = A*B
+	template<class Field>
+	class BlasMatrixDomainMul<Field,std::vector<typename Field::Element>,std::vector<typename Field::Element>, TransposedBlasMatrix<BlasPermutation<size_t> > > {
+	public:
+		std::vector<typename Field::Element>& operator()(const Field& F,
+								 std::vector<typename Field::Element>& C,
+								 const std::vector<typename Field::Element>& A,
+								 const TransposedBlasMatrix<BlasPermutation<size_t> >& B) const
+		{
+			C = A;
+			return BlasMatrixDomainMulin<Field,std::vector<typename Field::Element>, TransposedBlasMatrix<BlasPermutation<size_t> > >()( F, C, B);
+		}
+	};
+
+	template<class Field>
+	class BlasMatrixDomainMul<Field,std::vector<typename Field::Element>, TransposedBlasMatrix<BlasPermutation<size_t> >,std::vector<typename Field::Element> > {
+	public:
+		std::vector<typename Field::Element>& operator()(const Field& F,
+								 std::vector<typename Field::Element>& C,
+								 const TransposedBlasMatrix<BlasPermutation<size_t> >& B,
+								 const std::vector<typename Field::Element>& A) const
+		{
+			C = A;
+			return BlasMatrixDomainMulin<Field,std::vector<typename Field::Element>, TransposedBlasMatrix<BlasPermutation<size_t> > >()( F, B, C);
+		}
+	};
+
+	template<class Field>
+	class BlasMatrixDomainMul<Field, BlasVector<Field>, BlasVector<Field>, TransposedBlasMatrix<BlasPermutation<size_t> > > {
+	public:
+		BlasVector<Field>& operator()(const Field& F,
+					      BlasVector<Field>& C,
+					      const BlasVector<Field>& A,
+					      const TransposedBlasMatrix<BlasPermutation<size_t> >& B) const
+		{
+			C = A;
+			return BlasMatrixDomainMulin<Field, BlasVector<Field>, TransposedBlasMatrix<BlasPermutation<size_t> > >()( F, C, B);
+		}
+	};
+
+	template<class Field>
+	class BlasMatrixDomainMul<Field, BlasVector<Field>, TransposedBlasMatrix<BlasPermutation<size_t> >, BlasVector<Field> > {
+	public:
+		BlasVector<Field>& operator()(const Field& F,
+					      BlasVector<Field>& C,
+					      const TransposedBlasMatrix<BlasPermutation<size_t> >& B,
+					      const BlasVector<Field>& A) const
+		{
+			C = A;
+			return BlasMatrixDomainMulin<Field, BlasVector<Field>, TransposedBlasMatrix<BlasPermutation<size_t> > >()( F, B, C);
+		}
+	};
+
+	/*
+	 * specialization for Operand1 of type std::vector<Element> and Operand2 of type BlasPermutation
+	 */
+
+	// In-place matrix permutation product
+	template<class Field>
+	class BlasMatrixDomainMulin<Field,std::vector<typename Field::Element>, BlasPermutation<size_t> > {
+	public:
+		std::vector<typename Field::Element>& operator()( const Field& F,
+								  std::vector<typename Field::Element>& A,
+								  const BlasPermutation<size_t>& B) const
+		{
+			if (B.isIdentity()) return A ;
+                        //linbox_check( A.size() == B.getSize() );
+                        linbox_check( A.size() == B.getOrder() );
+			FFPACK::applyP( F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
+				       1, 0,(int) B.getOrder(), &A[0], 1, B.getPointer() );
+			return A;
+		}
+
+		std::vector<typename Field::Element>& operator()( const Field& F,
+								  const BlasPermutation<size_t>& B,
+								  std::vector<typename Field::Element>& A) const
+		{
+			if (B.isIdentity()) return A ;
+			//linbox_check( A.size() >= B.getSize() );
+                        linbox_check( A.size() == B.getOrder() );
+			FFPACK::applyP( F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
+				       1, 0,(int) B.getOrder(), &A[0], 1, B.getPointer() );
+			return A;
+		}
+
+	};
+
+	template<class Field>
+	class BlasMatrixDomainMulin<Field, BlasVector<Field>, BlasPermutation<size_t> > {
+	public:
+		BlasVector< Field >& operator()( const Field& F,
+						 BlasVector< Field>& A,
+						 const BlasPermutation<size_t>& B) const
+		{
+			if (B.isIdentity()) return A ;
+			linbox_check( A.size() == B.getSize() );
+			FFPACK::applyP( F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
+				       1, 0,(int) B.getOrder(), A.getPointer(), 1, B.getPointer() );
+			return A;
+		}
+
+		BlasVector< Field >& operator()( const Field& F,
+						 const BlasPermutation<size_t>& B,
+						 BlasVector< Field>& A) const
+		{
+			if (B.isIdentity()) return A ;
+			linbox_check( A.size() >= B.getSize() );
+			FFPACK::applyP( F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
+				       1, 0,(int) B.getOrder(), A.getPointer(), 1, B.getPointer() );
+			return A;
+		}
+
+	};
+
+	template<class Field>
+	class BlasMatrixDomainMulin<Field,std::vector<typename Field::Element>, TransposedBlasMatrix<BlasPermutation<size_t> > > {
+	public:
+		std::vector<typename Field::Element>& operator()( const Field& F,
+								  std::vector<typename Field::Element>& A,
+								  const TransposedBlasMatrix<BlasPermutation<size_t> >& B) const
+		{
+			if (B.getMatrix().isIdentity()) return A ;
+			linbox_check( A.size() >= B.getMatrix().getSize() );
+			FFPACK::applyP( F, FFLAS::FflasRight, FFLAS::FflasTrans,
+				       1, 0,(int) B.getMatrix().getOrder(),
+				       &A[0], 1, B.getMatrix().getPointer() );
+			return A;
+		}
+		std::vector<typename Field::Element>& operator()(  const Field& F,
+								   const TransposedBlasMatrix<BlasPermutation<size_t> >& B,
+								   std::vector<typename Field::Element>& A) const
+		{
+			if (B.getMatrix().isIdentity()) return A ;
+			linbox_check( A.size() >= B.getMatrix().getSize() );
+			FFPACK::applyP( F, FFLAS::FflasLeft, FFLAS::FflasTrans,
+				       1, 0,(int) B.getMatrix().getOrder(), &A[0], 1, B.getMatrix().getPointer() );
+			return A;
+		}
+	};
+
+	template<class Field>
+	class BlasMatrixDomainMulin<Field, BlasVector<Field>, TransposedBlasMatrix<BlasPermutation<size_t> > > {
+	public:
+		BlasVector<Field>& operator()( const Field& F,
+					       BlasVector<Field>& A,
+					       const TransposedBlasMatrix<BlasPermutation<size_t> >& B) const
+		{
+			if (B.getMatrix().isIdentity()) return A ;
+			linbox_check( A.size() >= B.getMatrix().getSize() );
+			FFPACK::applyP( F, FFLAS::FflasRight, FFLAS::FflasTrans,
+				       1, 0,(int) B.getMatrix().getOrder(),
+				       &A[0], 1, B.getMatrix().getPointer() );
+			return A;
+		}
+		BlasVector<Field>& operator()(  const Field& F,
+						const TransposedBlasMatrix<BlasPermutation<size_t> >& B,
+						BlasVector<Field>& A) const
+		{
+			if (B.getMatrix().isIdentity()) return A ;
+			linbox_check( A.size() >= B.getMatrix().getSize() );
+			FFPACK::applyP( F, FFLAS::FflasLeft, FFLAS::FflasTrans,
+				       1, 0,(int) B.getMatrix().getOrder(), &A[0], 1, B.getMatrix().getPointer() );
+			return A;
+		}
+	};
+
+#endif
+
+	/*
+	 * specialization for Operand1 of type BlasMatrix<Field, _Rep> and Operand2
+	 * of type TriangularBlasMatrix<Field,_Rep>
+	 */
+
+	// Matrix/Triangular product C = A*B
+	template<class Field, class _Rep>
+	class BlasMatrixDomainMul<Field, BlasMatrix<Field,_Rep>, BlasMatrix<Field,_Rep>, TriangularBlasMatrix<Field,_Rep> > {
+	public:
+		BlasMatrix<Field, _Rep>& operator()(const Field& F,
+						    BlasMatrix<Field, _Rep>& C,
+						    const BlasMatrix<Field, _Rep>& A,
+						    const TriangularBlasMatrix<Field,_Rep>& B) const
+		{
+			C = A;
+			return BlasMatrixDomainMulin<Field, BlasMatrix<Field,_Rep>, TriangularBlasMatrix<Field,_Rep> >()( F, C, B);
+		}
+	};
+
+	template<class Field, class _Rep>
+	class BlasMatrixDomainMul<Field, BlasMatrix<Field,_Rep>, TriangularBlasMatrix<Field,_Rep>, BlasMatrix<Field,_Rep> > {
+	public:
+		BlasMatrix<Field, _Rep>& operator()(const Field& F,
+						    BlasMatrix<Field, _Rep>& C,
+						    const TriangularBlasMatrix<Field,_Rep>& B,
+						    const BlasMatrix<Field, _Rep>& A) const
+		{
+			C = A;
+			return BlasMatrixDomainMulin<Field, BlasMatrix<Field,_Rep>, TriangularBlasMatrix<Field,_Rep> >()( F, B, C);
+		}
+	};
+
+	/*
+	 * specialization for Operand1 of type BlasMatrix<Field, _Rep> and Operand2 of type TriangularBlasMatrix<Field,_Rep>
+	 */
+
+	// In-place matrix*triangular matrix product
+	template<class Field, class _Rep>
+	class BlasMatrixDomainMulin<Field, BlasMatrix<Field,_Rep>,
+	      TriangularBlasMatrix<Field,_Rep> >{
+	      public:
+		      BlasMatrix<Field, _Rep>& operator()( const Field& F,
+							   BlasMatrix<Field, _Rep>& A,
+							   const TriangularBlasMatrix<Field,_Rep>& B) const
+		      {
+			      linbox_check( A.coldim() == B.rowdim() );
+
+			      FFLAS::ftrmm( F, FFLAS::FflasRight, (FFLAS::FFLAS_UPLO) (B.getUpLo()),
+					   FFLAS::FflasNoTrans,(FFLAS::FFLAS_DIAG) (B.getDiag()),
+					   A.rowdim(), A.coldim(), F.one,
+					   B.getPointer(), B.getStride(), A.getPointer(), A.getStride() );
+			      return A;
+		      }
+
+		      BlasMatrix<Field, _Rep>& operator()( const Field& F,
+							   const TriangularBlasMatrix<Field,_Rep>& B,
+							   BlasMatrix<Field, _Rep>& A) const
+		      {
+			      linbox_check( B.coldim() == A.rowdim() );
+			      FFLAS::ftrmm( F, FFLAS::FflasLeft, (FFLAS::FFLAS_UPLO)(B.getUpLo()),
+					   FFLAS::FflasNoTrans, (FFLAS::FFLAS_DIAG) (B.getDiag()),
+					   A.rowdim(), A.coldim(), F.one,
+					   B.getPointer(), B.getStride(),
+					   A.getPointer(), A.getStride() );
+			      return A;
+		      }
+	      };
+
+
+	/*! @internal In-place matrix*triangular matrix product with transpose.
+	*/
+	template<class Field, class _Rep>
+	class BlasMatrixDomainMulin<Field, BlasMatrix<Field,_Rep>,
+	      TransposedBlasMatrix<TriangularBlasMatrix<Field,_Rep> > >{
+	      public:
+		      BlasMatrix<Field, _Rep>& operator()( const Field& F,
+							   BlasMatrix<Field, _Rep>& A,
+							   const TransposedBlasMatrix< TriangularBlasMatrix<Field,_Rep> >& B) const
+		      {
+			      linbox_check( B.getMatrix().coldim() == A.coldim() );
+
+			      FFLAS::ftrmm( F, FFLAS::FflasRight,
+					   (FFLAS::FFLAS_UPLO)(B.getMatrix().getUpLo()),
+					   FFLAS::FflasTrans,
+					   (FFLAS::FFLAS_DIAG) (B.getMatrix().getDiag()),
+					   A.rowdim(), A.coldim(),
+					   F.one,
+					   B.getMatrix().getPointer(), B.getMatrix().getStride(),
+					   A.getPointer(), A.getStride() );
+			      return A;
+		      }
+
+		      BlasMatrix<Field, _Rep>& operator()( const Field& F,
+							   const TransposedBlasMatrix< TriangularBlasMatrix<Field,_Rep> >& B,
+							   BlasMatrix<Field, _Rep>& A) const
+		      {
+			      linbox_check( B.getMatrix().coldim() == A.rowdim() );
+			      FFLAS::ftrmm( F, FFLAS::FflasLeft,
+					   (FFLAS::FFLAS_UPLO) (B.getMatrix().getUpLo()),
+					   FFLAS::FflasTrans,
+					   (FFLAS::FFLAS_DIAG) (B.getMatrix().getDiag()),
+					   A.rowdim(), A.coldim(), F.one,
+					   B.getMatrix().getPointer(), B.getMatrix().getStride(),
+					   A.getPointer(), A.getStride() );
+			      return A;
+		      }
+	      };
+
+
+
+	/*
+	 * specialization for Operand1 of type TriangularBlasMatrix<Field,_Rep> and Operand2 of type BlasPermutation
+	 */
+
+	// Matrix permutation product C = A*B
+	template<class Field, class _Rep>
+	class BlasMatrixDomainMul<Field, BlasMatrix<Field,_Rep>, TriangularBlasMatrix<Field,_Rep>, BlasPermutation<size_t> > {
+	public:
+		BlasMatrix<Field, _Rep>& operator()(const Field& F,
+						    BlasMatrix<Field, _Rep>& C,
+						    const TriangularBlasMatrix<Field,_Rep>& A,
+						    const BlasPermutation<size_t>& B) const
+		{
+			C = A;
+			return BlasMatrixDomainMulin<Field, BlasMatrix<Field,_Rep>, BlasPermutation<size_t> >()( F, C, B);
+		}
+	};
+
+	template<class Field, class _Rep>
+	class BlasMatrixDomainMul<Field, BlasMatrix<Field,_Rep>, BlasPermutation<size_t>, TriangularBlasMatrix<Field,_Rep> > {
+	public:
+		BlasMatrix<Field, _Rep>& operator()(const Field& F,
+						    BlasMatrix<Field, _Rep>& C,
+						    const BlasPermutation<size_t>& B,
+						    const TriangularBlasMatrix<Field,_Rep>& A) const
+		{
+			C = A;
+			return BlasMatrixDomainMulin<Field, BlasMatrix<Field,_Rep>, BlasPermutation<size_t> >()( F, B, C);
+		}
+	};
+
+} // LinBox
+
+namespace LinBox
+{ /* Solve */
+
+	/*
+	 * Specialization for Operand of type BlasMatrix<Field, _Rep>
+	 */
+
+	template <class Field, class Operand1, class Matrix, class Operand2>
+	Operand1&
+	BlasMatrixDomainLeftSolve<Field, Operand1, Matrix, Operand2 >::operator() (const Field& F,
+										   Operand1& X,
+										   const Matrix& A,
+										   const Operand2& B) const
+	{
+		LQUPMatrix<Field> LQUP(A);
+		LQUP.left_solve(X, B);
+		return X;
+	}
+
+	template <class Field, class Operand1, class Matrix, class Operand2>
+	Operand1&
+	BlasMatrixDomainLeftSolve<Field, Operand1, Matrix, Operand2 >::operator() (const Field& F,
+										   const Matrix& A,
+										   Operand1& B) const
+	{
+		LQUPMatrix<Field> LQUP(A);
+		LQUP.left_solve(B);
+		return B;
+	}
+
+	template <class Field, class Operand1, class Matrix, class Operand2>
+	Operand1&
+	BlasMatrixDomainRightSolve<Field, Operand1, Matrix, Operand2 >::operator() (const Field& F,
+										    Operand1& X,
+										    const Matrix& A,
+										    const Operand2& B) const
+	{
+		// typename Matrix::subMatrixType subMatrixType ;
+		LQUPMatrix<Field> LQUP(A);
+		LQUP.right_solve(X, B);
+		return X;
+	}
+
+	template <class Field, class Operand1, class Matrix, class Operand2>
+	Operand1&
+	BlasMatrixDomainRightSolve<Field, Operand1, Matrix, Operand2 >::operator() (const Field& F,
+										    const Matrix& A,
+										    Operand1& B) const
+	{
+		LQUPMatrix<Field> LQUP(A);
+		LQUP.right_solve(B);
+		return B;
+	}
+
+
+	template <class Matrix>
+	class BlasMatrixDomainRightSolve<typename Matrix::Field, BlasSubmatrix<Matrix>, BlasSubmatrix<Matrix> > {
+	public:
+		typedef typename Matrix::Field Field;
+		BlasSubmatrix<Matrix>& operator() (const Field& F,
+						   BlasSubmatrix<Matrix>& X,
+						   const BlasSubmatrix<Matrix>& A,
+						   const BlasSubmatrix<Matrix>& B) const
+		{
+			LQUPMatrix<Field> LQUP(A);
+			LQUP.right_solve(X, B);
+			return X;
+		}
+
+
+		BlasSubmatrix<Matrix>& operator() (const Field& F,
+						   const BlasSubmatrix<Matrix>& A,
+						   BlasSubmatrix<Matrix>& B) const
+		{
+			LQUPMatrix<Field> LQUP(A);
+			LQUP.right_solve(B);
+			return B;
+		}
+
+	};
+
+#if 1
+	/*
+	 * Specialization for Operand of type std::vector<Element>
+	 */
+
+	template <class Field, class _Rep>
+	class BlasMatrixDomainLeftSolve<Field, std::vector<typename Field::Element>, BlasMatrix<Field, _Rep> > {
+	public:
+		std::vector<typename Field::Element>& operator() (const Field& F,
+								  std::vector<typename Field::Element>& X,
+								  const BlasMatrix<Field, _Rep>& A,
+								  const std::vector<typename Field::Element>& B) const
+		{
+			LQUPMatrix<Field> LQUP(A);
+			LQUP.left_solve(X, B);
+			return X;
+		}
+
+		std::vector<typename Field::Element>& operator()(const Field& F,
+								 const BlasMatrix<Field, _Rep>& A,
+								 std::vector<typename Field::Element>& B) const
+		{
+			LQUPMatrix<Field> LQUP(A);
+			LQUP.left_solve(B);
+			return B;
+		}
+
+	};
+
+	template <class Field, class _Rep>
+	class BlasMatrixDomainRightSolve<Field, std::vector<typename Field::Element>, BlasMatrix<Field, _Rep> > {
+	public:
+		std::vector<typename Field::Element>& operator() (const Field& F,
+								  std::vector<typename Field::Element>& X,
+								  const BlasMatrix<Field, _Rep>& A,
+								  const std::vector<typename Field::Element>& B) const
+		{
+			LQUPMatrix<Field> LQUP(A);
+			LQUP.right_solve(X, B);
+			return X;
+		}
+
+		std::vector<typename Field::Element>& operator() (const Field& F,
+								  const BlasMatrix<Field, _Rep>& A,
+								  std::vector<typename Field::Element>& B) const
+		{
+			LQUPMatrix<Field> LQUP(A);
+			LQUP.right_solve(B);
+			return B;
+		}
+
+	};
+
+	template <class Field, class _Rep>
+	class BlasMatrixDomainLeftSolve<Field, BlasVector<Field>, BlasMatrix<Field, _Rep> > {
+	public:
+		BlasVector<Field>& operator() (const Field& F,
+					       BlasVector<Field>& X,
+					       const BlasMatrix<Field, _Rep>& A,
+					       const BlasVector<Field>& B) const
+		{
+			LQUPMatrix<Field> LQUP(A);
+			LQUP.left_solve(X, B);
+			return X;
+		}
+
+		BlasVector<Field>& operator()(const Field& F,
+					      const BlasMatrix<Field, _Rep>& A,
+					      BlasVector<Field>& B) const
+		{
+			LQUPMatrix<Field> LQUP(A);
+			LQUP.left_solve(B);
+			return B;
+		}
+
+	};
+
+	template <class Field, class _Rep>
+	class BlasMatrixDomainRightSolve<Field, BlasVector<Field>, BlasMatrix<Field, _Rep> > {
+	public:
+		BlasVector<Field>& operator() (const Field& F,
+					       BlasVector<Field>& X,
+					       const BlasMatrix<Field, _Rep>& A,
+					       const BlasVector<Field>& B) const
+		{
+			LQUPMatrix<Field> LQUP(A);
+			LQUP.right_solve(X, B);
+			return X;
+		}
+
+		BlasVector<Field>& operator() (const Field& F,
+					       const BlasMatrix<Field, _Rep>& A,
+					       BlasVector<Field>& B) const
+		{
+			LQUPMatrix<Field> LQUP(A);
+			LQUP.right_solve(B);
+			return B;
+		}
+
+	};
+
+#endif
+
+
+	/*
+	 * ********************************************************
+	 * *** Specialization for TriangularBlasMatrix<Field,_Rep> ***
+	 * ********************************************************
+	 */
+
+
+	/*
+	 * specialization for Operand of type BlasMatrix<Field, _Rep>
+	 */
+
+	template <class Field, class _Rep>
+	class BlasMatrixDomainLeftSolve<Field, BlasMatrix<Field, _Rep>, TriangularBlasMatrix<Field,_Rep> > {
+	public:
+		BlasMatrix<Field, _Rep>& operator() (const Field& F,
+						     BlasMatrix<Field, _Rep>& X,
+						     const TriangularBlasMatrix<Field,_Rep>& A,
+						     const BlasMatrix<Field, _Rep>& B) const
+		{
+
+			linbox_check( X.rowdim() == B.rowdim());
+			linbox_check( X.coldim() == B.coldim());
+
+			//! @bug use copy
+			typename BlasMatrix<Field, _Rep>::ConstIterator  Biter =   B.Begin();
+			typename BlasMatrix<Field, _Rep>::Iterator       Xiter =   X.Begin();
+
+			for (; Biter != B.End(); ++Biter,++Xiter)
+				F.assign(*Xiter,*Biter);
+
+			return (*this)(F, A, X);
+
+		}
+
+		BlasMatrix<Field, _Rep>& operator() (const Field& F,
+						     const TriangularBlasMatrix<Field,_Rep>& A,
+						     BlasMatrix<Field, _Rep>& B) const
+		{
+			linbox_check( A.rowdim() == A.coldim());
+			linbox_check( A.coldim() == B.rowdim());
+
+			FFLAS::ftrsm( F,
+				     FFLAS::FflasLeft, (FFLAS::FFLAS_UPLO) A.getUpLo(),
+				     FFLAS::FflasNoTrans,(FFLAS::FFLAS_DIAG) A.getDiag(),
+				     A.rowdim(), B.coldim(),
+				     F.one, A.getPointer(), A.getStride(),
+				     B.getPointer(), B.getStride());
+
+			return B;
+		}
+	};
+
+	template <class Field, class _Rep>
+	class BlasMatrixDomainRightSolve<Field, BlasMatrix<Field,_Rep>, TriangularBlasMatrix<Field,_Rep> > {
+	public:
+		BlasMatrix<Field, _Rep>& operator() (const Field& F,
+						     BlasMatrix<Field, _Rep>& X,
+						     const TriangularBlasMatrix<Field,_Rep>& A,
+						     const BlasMatrix<Field, _Rep>& B) const
+		{
+
+			linbox_check( X.rowdim() == B.rowdim());
+			linbox_check( X.coldim() == B.coldim());
+
+			typename BlasMatrix<Field, _Rep>::ConstIterator  Biter =   B.Begin();
+			typename BlasMatrix<Field, _Rep>::Iterator       Xiter =   X.Begin();
+
+			for (; Biter != B.End(); ++Biter,++Xiter)
+				F.assign(*Xiter,*Biter);
+
+			return (*this)(F, A, X);
+		}
+
+		BlasMatrix<Field, _Rep>& operator() (const Field& F,
+						     const TriangularBlasMatrix<Field,_Rep>& A,
+						     BlasMatrix<Field, _Rep>& B) const
+		{
+
+			linbox_check( A.rowdim() == A.coldim());
+			linbox_check( B.coldim() == A.rowdim());
+
+			FFLAS::ftrsm( F,
+				     FFLAS::FflasRight,(FFLAS::FFLAS_UPLO) A.getUpLo(),
+				     FFLAS::FflasNoTrans,(FFLAS::FFLAS_DIAG) A.getDiag() ,
+				     B.rowdim(), A.coldim(),
+				     F.one, A.getPointer(), A.getStride(),
+				     B.getPointer(), B.getStride());
+
+
+			return B;
+		}
+	};
+
+	template <class Matrix, class _Rep>
+	class BlasMatrixDomainRightSolve<typename Matrix::Field, BlasSubmatrix<Matrix>, TriangularBlasMatrix<typename Matrix::Field, _Rep> > {
+	public:
+		typedef typename Matrix::Field Field;
+		BlasSubmatrix<Matrix>& operator() (const typename Matrix::Field& F,
+						   BlasSubmatrix<Matrix>& X,
+						   const TriangularBlasMatrix<Field,_Rep>& A,
+						   const BlasSubmatrix<Matrix>& B) const
+		{
+
+			linbox_check( X.rowdim() == B.rowdim());
+			linbox_check( X.coldim() == B.coldim());
+
+			typename BlasSubmatrix<Matrix>::ConstIterator  Biter =   B.Begin();
+			typename BlasSubmatrix<Matrix>::Iterator       Xiter =   X.Begin();
+
+			for (; Biter != B.End(); ++Biter,++Xiter)
+				F.assign(*Xiter,*Biter);
+
+			return (*this)(F, A, X);
+		}
+
+		BlasSubmatrix<Matrix>& operator() (const typename Matrix::Field& F,
+						   const TriangularBlasMatrix<Field,_Rep>& A,
+						   BlasSubmatrix<Matrix>& B) const
+		{
+
+			linbox_check( A.rowdim() == A.coldim());
+			linbox_check( B.coldim() == A.rowdim());
+
+			FFLAS::ftrsm( F,
+				     FFLAS::FflasRight,(FFLAS::FFLAS_UPLO) A.getUpLo(),
+				     FFLAS::FflasNoTrans,(FFLAS::FFLAS_DIAG) A.getDiag() ,
+				     B.rowdim(), A.coldim(),
+				     F.one, A.getPointer(), A.getStride(),
+				     B.getPointer(), B.getStride());
+
+
+			return B;
+		}
+	};
+
+
+#if 1
+
+	/*
+	 * specialization for Operand of type std::vector<Element>
+	 */
+
+	template <class Field, class _Rep>
+	class BlasMatrixDomainLeftSolve<Field, std::vector<typename Field::Element>, TriangularBlasMatrix<Field,_Rep> > {
+	public:
+		std::vector<typename Field::Element>& operator() (const Field& F,
+								  std::vector<typename Field::Element>& x,
+								  const TriangularBlasMatrix<Field,_Rep>& A,
+								  const std::vector<typename Field::Element>& b) const
+		{
+
+			linbox_check (x.size() == b.size());
+			typename std::vector<typename Field::Element>::const_iterator biter = b.begin();
+			typename std::vector<typename Field::Element>::iterator       xiter = x.begin();
+			for (;biter!=b.end();++biter,++xiter)
+				F.assign(*xiter,*biter);
+
+			return (*this)(F, A,x);
+		}
+
+		std::vector<typename Field::Element>& operator() (const Field& F,
+								  const TriangularBlasMatrix<Field,_Rep>& A,
+								  std::vector<typename Field::Element>& b) const
+		{
+
+			linbox_check( A.rowdim() == A.coldim());
+			linbox_check( A.rowdim() == b.size());
+
+			switch (A.getUpLo()) {
+			case Tag::Shape::Upper:
+			switch(A.getDiag()) {
+			case Tag::Diag::Unit:
+			FFLAS::ftrsv( F,
+				     FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasUnit,
+				     b.size(), A.getPointer(), A.getStride(),&b[0],1);
+			break;
+			case Tag::Diag::NonUnit:
+			FFLAS::ftrsv( F,
+				     FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+				     b.size(), A.getPointer(), A.getStride(),&b[0],1);
+			break;
+			default:
+			throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+			}
+			break;
+			case Tag::Shape::Lower:
+			switch(A.getDiag()) {
+			case Tag::Diag::Unit:
+			FFLAS::ftrsv( F,
+				     FFLAS::FflasLower, FFLAS::FflasNoTrans, FFLAS::FflasUnit,
+				     b.size(), A.getPointer(), A.getStride(),&b[0],1);
+			break;
+			case Tag::Diag::NonUnit:
+			FFLAS::ftrsv( F,
+				     FFLAS::FflasLower, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+				     b.size(), A.getPointer(), A.getStride(),&b[0],1);
+			break;
+			default:
+			throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+			}
+			break;
+			default:
+			throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+
+			}
+			return b;
+		}
+	};
+
+	template <class Field, class _Rep>
+	class BlasMatrixDomainRightSolve<Field, std::vector<typename Field::Element>, TriangularBlasMatrix<Field,_Rep> > {
+	public:
+		std::vector<typename Field::Element>& operator() (const Field& F,
+								  std::vector<typename Field::Element>& x,
+								  const TriangularBlasMatrix<Field,_Rep>& A,
+								  const std::vector<typename Field::Element>& b) const
+		{
+
+			linbox_check (x.size() == b.size());
+			typename std::vector<typename Field::Element>::const_iterator biter = b.begin();
+			typename std::vector<typename Field::Element>::iterator       xiter = x.begin();
+			for (;biter!=b.end();++biter,++xiter)
+				F.assign(*xiter,*biter);
+
+			return (*this)(F, A,x);
+		}
+
+		std::vector<typename Field::Element>& operator() (const Field& F,
+								  const TriangularBlasMatrix<Field,_Rep>& A,
+								  std::vector<typename Field::Element>& b) const
+		{
+
+			linbox_check( A.rowdim() == A.coldim());
+			linbox_check( A.coldim() == b.size());
+
+
+			switch (A.getUpLo()) {
+			case Tag::Shape::Upper:
+			switch(A.getDiag()) {
+			case Tag::Diag::Unit:
+			FFLAS::ftrsv( F,
+				      FFLAS::FflasUpper, FFLAS::FflasTrans, FFLAS::FflasUnit,
+				      b.size(), A.getPointer(), A.getStride(),&b[0],1);
+			break;
+			case Tag::Diag::NonUnit:
+			FFLAS::ftrsv( F,
+				     FFLAS::FflasUpper, FFLAS::FflasTrans, FFLAS::FflasNonUnit,
+				     b.size(), A.getPointer(), A.getStride(),&b[0],1);
+			break;
+			default:
+			throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+			}
+			break;
+			case Tag::Shape::Lower:
+			switch(A.getDiag()) {
+			case Tag::Diag::Unit:
+			FFLAS::ftrsv( F,
+				     FFLAS::FflasLower, FFLAS::FflasTrans, FFLAS::FflasUnit,
+				     b.size(), A.getPointer(), A.getStride(),&b[0],1);
+			break;
+			case Tag::Diag::NonUnit:
+			FFLAS::ftrsv( F,
+				      FFLAS::FflasLower, FFLAS::FflasTrans, FFLAS::FflasNonUnit,
+				      b.size(), A.getPointer(), A.getStride(),&b[0],1);
+			break;
+			default:
+			throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+			}
+			break;
+			default:
+			throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+
+			}
+			return b;
+		}
+	};
+
+	template <class Field, class _Rep>
+	class BlasMatrixDomainLeftSolve<Field, BlasVector<Field>, TriangularBlasMatrix<Field,_Rep> > {
+	public:
+		BlasVector<Field>& operator() (const Field& F,
+					       BlasVector<Field>& x,
+					       const TriangularBlasMatrix<Field,_Rep>& A,
+					       const BlasVector<Field>& b) const
+		{
+
+			linbox_check (x.size() == b.size());
+			typename BlasVector<Field>::const_iterator biter = b.begin();
+			typename BlasVector<Field>::iterator       xiter = x.begin();
+			for (;biter!=b.end();++biter,++xiter)
+				F.assign(*xiter,*biter);
+
+			return (*this)(F, A,x);
+		}
+
+		BlasVector<Field>& operator() (const Field& F,
+					       const TriangularBlasMatrix<Field,_Rep>& A,
+					       BlasVector<Field>& b) const
+		{
+
+			linbox_check( A.rowdim() == A.coldim());
+			linbox_check( A.rowdim() == b.size());
+
+			switch (A.getUpLo()) {
+			case Tag::Shape::Upper:
+			switch(A.getDiag()) {
+			case Tag::Diag::Unit:
+			FFLAS::ftrsv( F,
+				     FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasUnit,
+				     b.size(), A.getPointer(), A.getStride(),&b[0],1);
+			break;
+			case Tag::Diag::NonUnit:
+			FFLAS::ftrsv( F,
+				     FFLAS::FflasUpper, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+				     b.size(), A.getPointer(), A.getStride(),&b[0],1);
+			break;
+			default:
+			throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+			}
+			break;
+			case Tag::Shape::Lower:
+			switch(A.getDiag()) {
+			case Tag::Diag::Unit:
+			FFLAS::ftrsv( F,
+				     FFLAS::FflasLower, FFLAS::FflasNoTrans, FFLAS::FflasUnit,
+				     b.size(), A.getPointer(), A.getStride(),&b[0],1);
+			break;
+			case Tag::Diag::NonUnit:
+			FFLAS::ftrsv( F,
+				     FFLAS::FflasLower, FFLAS::FflasNoTrans, FFLAS::FflasNonUnit,
+				     b.size(), A.getPointer(), A.getStride(),&b[0],1);
+			break;
+			default:
+			throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+			}
+			break;
+			default:
+			throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+
+			}
+			return b;
+		}
+	};
+
+	template <class Field, class _Rep>
+	class BlasMatrixDomainRightSolve<Field, BlasVector<Field>, TriangularBlasMatrix<Field,_Rep> > {
+	public:
+		BlasVector<Field>& operator() (const Field& F,
+					       BlasVector<Field>& x,
+					       const TriangularBlasMatrix<Field,_Rep>& A,
+					       const BlasVector<Field>& b) const
+		{
+
+			linbox_check (x.size() == b.size());
+			typename BlasVector<Field>::const_iterator biter = b.begin();
+			typename BlasVector<Field>::iterator       xiter = x.begin();
+			for (;biter!=b.end();++biter,++xiter)
+				F.assign(*xiter,*biter);
+
+			return (*this)(F, A,x);
+		}
+
+		BlasVector<Field>& operator() (const Field& F,
+					       const TriangularBlasMatrix<Field,_Rep>& A,
+					       BlasVector<Field>& b) const
+		{
+
+			linbox_check( A.rowdim() == A.coldim());
+			linbox_check( A.coldim() == b.size());
+
+
+			switch (A.getUpLo()) {
+			case Tag::Shape::Upper:
+			switch(A.getDiag()) {
+			case Tag::Diag::Unit:
+			FFLAS::ftrsv( F,
+				      FFLAS::FflasUpper, FFLAS::FflasTrans, FFLAS::FflasUnit,
+				      b.size(), A.getPointer(), A.getStride(),&b[0],1);
+			break;
+			case Tag::Diag::NonUnit:
+			FFLAS::ftrsv( F,
+				     FFLAS::FflasUpper, FFLAS::FflasTrans, FFLAS::FflasNonUnit,
+				     b.size(), A.getPointer(), A.getStride(),&b[0],1);
+			break;
+			default:
+			throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+			}
+			break;
+			case Tag::Shape::Lower:
+			switch(A.getDiag()) {
+			case Tag::Diag::Unit:
+			FFLAS::ftrsv( F,
+				     FFLAS::FflasLower, FFLAS::FflasTrans, FFLAS::FflasUnit,
+				     b.size(), A.getPointer(), A.getStride(),&b[0],1);
+			break;
+			case Tag::Diag::NonUnit:
+			FFLAS::ftrsv( F,
+				      FFLAS::FflasLower, FFLAS::FflasTrans, FFLAS::FflasNonUnit,
+				      b.size(), A.getPointer(), A.getStride(),&b[0],1);
+			break;
+			default:
+			throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+			}
+			break;
+			default:
+			throw LinboxError ("Error in BlasMatrixDomain (triangular matrix not well defined)");
+
+			}
+			return b;
+		}
+	};
+
+#endif
+
+} // LinBox
+
+namespace LinBox
+{ /* Minpoly Charpoly */
+
+	template< class Field, class Polynomial, class Matrix>
+	Polynomial&
+	BlasMatrixDomainMinpoly< Field, Polynomial, Matrix >::operator() (const Field &F, Polynomial& P, const Matrix& A) const
+	{
+		commentator().start ("Givaro::Modular Dense Minpoly ", "MDMinpoly");
+
+		size_t n = A.coldim();
+		linbox_check( n == A.rowdim());
+		typename Field::Element * X = new typename Field::Element[n*(n+1)];
+		size_t *Perm = new size_t[n];
+		for ( size_t i=0; i<n; ++i)
+			Perm[i] = 0;
+		// 
+		typedef typename Matrix::constSubMatrixType constSubMatrixType ;
+		constSubMatrixType A_v(A);
+
+		FFPACK::MinPoly<Field, Polynomial>(  F, P, n, A_v.getPointer(), A_v.getStride(), X, n, Perm);
+
+		commentator().report(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION) << "minpoly with " << P.size() << " coefficients" << std::endl;
+
+		delete[] Perm;
+		delete[] X;
+		commentator().stop ("done", NULL, "MDMinpoly");
+		return P;
+	}
+
+	template< class Field,  class ContPol, class Matrix >
+	ContPol&
+	BlasMatrixDomainCharpoly<Field, ContPol, Matrix>::operator() ( const Field    &F,
+								       ContPol        &P,
+								       const Matrix   &A) const
+	{
+
+		size_t n = A.coldim();
+		P.clear();
+		linbox_check( n == A.rowdim());
+		typedef typename Matrix::constSubMatrixType constSubMatrixType ;
+		constSubMatrixType A_v(A);
+
+		FFPACK::CharPoly( F, P, n, A_v.getPointer(), A_v.getStride());
+
+		return P;
+	}
+
+	template< class Field,  class Matrix, class _Vrep >
+	BlasVector<Field, _Vrep> &
+	BlasMatrixDomainCharpoly<Field, BlasVector<Field, _Vrep>, Matrix>::operator() ( const Field    &F,
+											BlasVector<Field, _Vrep> &P,
+											const Matrix   &A) const
+	{
+
+		size_t n = A.coldim();
+		P.clear();
+		linbox_check( n == A.rowdim());
+		typedef typename Matrix::constSubMatrixType constSubMatrixType ;
+		constSubMatrixType A_v(A);
+
+		linbox_check(P.stride() == 1);
+		FFPACK::CharPoly( F, P.getWritePointer(), n, A_v.getPointer(), A_v.getStride());
+
+		return P;
+	}
+
+
+} //end of namespace LinBox
+
+#endif // __LINBOX_matrix_matrixdomain_blas_matrix_domain_INL
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=
diff --git a/linbox/matrix/matrix-domain-gf2.h b/linbox/matrix/matrixdomain/matrix-domain-gf2.h
similarity index 100%
rename from linbox/matrix/matrix-domain-gf2.h
rename to linbox/matrix/matrixdomain/matrix-domain-gf2.h
diff --git a/linbox/matrix/matrixdomain/matrix-domain.h b/linbox/matrix/matrixdomain/matrix-domain.h
new file mode 100644
index 0000000..41a570c
--- /dev/null
+++ b/linbox/matrix/matrixdomain/matrix-domain.h
@@ -0,0 +1,1245 @@
+/*
+ * Copyright (C) 2002 Zhendong Wan, Bradford Hovinen
+ * Copyright (C) 2013,2014 the LinBox group
+ *
+ * Written by Zhendong Wan <wan at mail.eecis.udel.edu>,
+ *            Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *            Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ------------------------------------------------------------
+ * 2002-11-26  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
+ *
+ * Added detailed documentation, cleaned up the interface slightly, and added
+ * support for matrix traits. Added read, write, neg, negin, axpy, and
+ * matrix-vector and matrix-black box operations.
+ * ------------------------------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/** @file linbox/matrix/matrixdomain/matrix-domain.h
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_matrixdomain_matrix_domain_H
+#define __LINBOX_matrixdomain_matrix_domain_H
+
+#include <linbox/linbox-config.h>
+#include <iostream>
+#include <vector>
+
+#include "linbox/blackbox/archetype.h"
+#include "linbox/matrix/matrix-traits.h"
+// #include "linbox/vector/blas-vector.h"
+
+namespace LinBox
+{
+
+
+	/** Class of matrix arithmetic functions.
+	 *
+	 * This class encapuslated matrix-matrix and matrix-vector operations, roughly
+	 * equivalent to BLAS levels 2 and 3. The arithmetic methods are parameterized
+	 * by matrix type so that they may be used the same way with sparse matrices,
+	 * dense matrices, and dense submatrices. Except where otherwise noted, they
+	 * require the matrix inputs to meet the \ref BlasMatrix archetype.
+	 *
+	 * These methods are specialized so that they can run efficiently with different
+	 * matrix representations. If a matrix has an efficient row iterator, but not an
+	 * efficient column iterator, a specialization that makes use of the former will
+	 * be selected. This allows a great deal of flexibility when dealing with sparse
+	 * matrix arithmetic.
+	 *
+	 * For all of the arithmetic operations that output matrices, it is assumed that
+	 * the output matrix has an efficient row iterator. In typical use, the output
+	 * matrix will be a \ref BlasMatrix or a \ref BlasSubmatrix, which has
+	 * efficient row and column iterators. In particular, one should not perform
+	 * these arithmetic operations outputting to a \ref SparseMatrixBase.
+	 *
+	 * There are other restrictions. See the method-specific documentation for more
+	 * details.
+	 */
+	template <class Field_ >
+	class MatrixDomain : public MVProductDomain<Field_> {
+	public:
+		typedef size_t Index;
+		typedef Field_ Field;
+		typedef typename Field::Element Element;
+		typedef Element Scalar;
+		//! @bug should be BlasVector
+		typedef typename Vector<Field>::Dense Rep_;
+		// typedef Rep_ DenseVector;
+		typedef BlasVector<Field_,Rep_> DenseVector;
+		typedef BlasMatrix<Field,Rep_> OwnMatrix;
+		typedef BlasSubmatrix<OwnMatrix> Matrix;
+
+		// MatrixDomain () {/*std::cerr << "MD def cstor" << std::endl;*/ }
+
+		void init(const Field & F) { _field = &F; _VD.init(F); }
+
+		MatrixDomain() {}
+
+		/// Constructor.
+		//! @param F field for MatrixDomain operations.
+		MatrixDomain (const Field &F) :
+			_field (&F), _VD (F)
+		{ /*std::cerr << "MD cstor " << this << std::endl;*/ }
+
+		/// Copy operator.
+		MatrixDomain& operator= (const MatrixDomain& MD)
+		{
+			_field = MD._field;
+			_VD = MD._VD;
+			return *this;
+		}
+
+		/** Retrieve the underlying field.
+		 * Return a reference to the field that this matrix domain
+		 * object uses
+		 * @returns reference to field
+		 */
+		//@{
+		const Field &field () const
+		{
+			return *_field;
+		}
+
+		//@}
+
+		/** Print matrix.
+		 * @param  os  Output stream to which matrix is written.
+		 * @param  A   Matrix.
+		 * @returns reference to os.
+		 */
+		template <class Matrix_>
+		inline std::ostream &write (std::ostream &os, const Matrix_ &A) const
+		{
+			return A.write (os);
+		}
+
+		/** Read matrix.
+		 * @param  is  Input stream from which matrix is read.
+		 * @param  A   Matrix.
+		 * @returns reference to is.
+		 */
+		template <class Matrix_>
+		inline std::istream &read (std::istream &is, Matrix_ &A) const
+		{
+			return A.read (is, _field);
+		}
+
+		/** Matrix copy
+		 * B <- A.
+		 * Copy the contents of the matrix B to the matrix A
+		 *
+		 * Both matrices must support the same iterators, row or column.
+		 *
+		 * @param B Matrix B
+		 * @param A Matrix A
+		 * @returns Reference to B
+		 */
+		template <class Matrix1, class Matrix2>
+		inline Matrix1 &copy (Matrix1 &B, const Matrix2 &A) const
+		{
+			return copySpecialized (B, A,
+						typename MatrixTraits<Matrix1>::MatrixCategory (),
+						typename MatrixTraits<Matrix2>::MatrixCategory ());
+		}
+		/// B <-- A.  They must already have the same shape.
+		inline Matrix &copy (Matrix &B, const Matrix &A) const {
+			return B.copy(A);
+		}
+
+		/** Matrix swap
+		 * B <--> A.  They must already have the same shape.
+		 * @returns Reference to B
+		 */
+		inline Matrix &swap(Matrix &B, Matrix &A) const {
+			return B.swap(A);
+		}
+
+		/** Matrix equality.
+		 * Test whether the matrices A and B are equal
+		 * @param A Input vector
+		 * @param B Input vector
+		 * @returns true if and only if the matrices A and B are equal
+		 */
+		template <class Matrix1, class Matrix2>
+		bool areEqual (const Matrix1 &A, const Matrix2 &B) const
+		{
+			return areEqualSpecialized (B, A,
+						    typename MatrixTraits<Matrix1>::MatrixCategory (),
+						    typename MatrixTraits<Matrix2>::MatrixCategory ());
+		}
+
+		/** Matrix equality with zero.
+		 * @param A Input matrix
+		 * @returns true if and only if the matrix A is zero
+		 */
+		template <class Matrix_>
+		inline bool isZero (const Matrix_ &A) const
+		{
+			return isZeroSpecialized (A, typename MatrixTraits<Matrix_>::MatrixCategory ());
+		}
+
+		/** Matrix-matrix addition
+		 * C <- A + B.
+		 *
+		 * Each of A, B, and C must support the same iterator, either row or
+		 * column
+		 *
+		 * @param C Output matrix C
+		 * @param A Input matrix A
+		 * @param B Input matrix B
+		 * @returns Reference to C
+		 */
+		template <class Matrix1, class Matrix2, class Matrix3>
+		inline Matrix1& add (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
+		{
+			return addSpecialized (C, A, B,
+					       typename MatrixTraits<Matrix1>::MatrixCategory (),
+					       typename MatrixTraits<Matrix2>::MatrixCategory (),
+					       typename MatrixTraits<Matrix3>::MatrixCategory ());
+		}
+
+		/** Matrix-matrix in-place addition
+		 * A <- A + B.
+		 *
+		 * Each of A and B must support the same iterator, either row or column
+		 *
+		 * @param A Input matrix A
+		 * @param B Input matrix B
+		 * @returns Reference to A
+		 */
+		template <class Matrix1, class Matrix2>
+		inline Matrix1& addin (Matrix1 &A, const Matrix2 &B) const
+		{
+			return addinSpecialized (A, B,
+						 typename MatrixTraits<Matrix1>::MatrixCategory (),
+						 typename MatrixTraits<Matrix2>::MatrixCategory ());
+		}
+
+		/** Matrix-matrix subtraction
+		 * C <- A - B.
+		 *
+		 * Each of A, B, and C must support the same iterator, either row or
+		 * column
+		 *
+		 * @param C Output matrix C
+		 * @param A Input matrix A
+		 * @param B Input matrix B
+		 * @returns Reference to C
+		 */
+		template <class Matrix1, class Matrix2, class Matrix3>
+		inline Matrix1 &sub (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
+		{
+			return subSpecialized (C, A, B,
+					       typename MatrixTraits<Matrix1>::MatrixCategory (),
+					       typename MatrixTraits<Matrix2>::MatrixCategory (),
+					       typename MatrixTraits<Matrix3>::MatrixCategory ());
+		}
+
+		/** Matrix-matrix in-place subtraction
+		 * A <- A - B.
+		 *
+		 * Each of A and B must support the same iterator, either row or column
+		 *
+		 * @param A Input matrix A
+		 * @param B Input matrix B
+		 * @returns Reference to A
+		 */
+		template <class Matrix1, class Matrix2>
+		inline Matrix1 &subin (Matrix1 &A, const Matrix2 &B) const
+		{
+			return subinSpecialized (A, B,
+						 typename MatrixTraits<Matrix1>::MatrixCategory (),
+						 typename MatrixTraits<Matrix2>::MatrixCategory ());
+		}
+
+		/** Matrix negate
+		 * B <- -A.
+		 *
+		 * Each of A and B must support the same iterator, either row or column
+		 *
+		 * @param B Output matrix B
+		 * @param A Input matrix A
+		 * @returns reference to B
+		 */
+		template <class Matrix1, class Matrix2>
+		inline Matrix1 &neg (Matrix1 &B, const Matrix2 &A) const
+		{
+			return negSpecialized (B, A,
+					       typename MatrixTraits<Matrix1>::MatrixCategory (),
+					       typename MatrixTraits<Matrix2>::MatrixCategory ());
+		}
+
+		/** Matrix in-place negate
+		 * A <- -A.
+		 * @param A Input matrix A; result is stored here
+		 */
+		template <class Matrix_>
+		inline Matrix_ &negin (Matrix_ &A) const
+		{
+			return neginSpecialized (A, typename MatrixTraits<Matrix_>::MatrixCategory ());
+		}
+
+		/** Matrix-matrix multiply
+		 * C <- A * B.
+		 *
+		 * C must support both row and column iterators, and the vector
+		 * representations must be dense. Examples of supported matrices are
+		 * \ref BlasMatrix and \ref BlasSubmatrix.
+		 *
+		 * Either A or B, or both, may have limited iterators. However, either A
+		 * must support row iterators or B must support column iterators. If
+		 * both A and B lack support for an iterator (either row or column),
+		 * then C must support the same type of iterator as A and B.
+		 *
+		 * @param C Output matrix C
+		 * @param A Input matrix A
+		 * @param B Input matrix B
+		 * @returns Reference to C
+		 */
+		template <class Matrix1, class Matrix2, class Matrix3>
+		inline Matrix1 &mul (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
+		{
+			return mulSpecialized (C, A, B,
+					       typename MatrixTraits<Matrix1>::MatrixCategory (),
+					       typename MatrixTraits<Matrix2>::MatrixCategory (),
+					       typename MatrixTraits<Matrix3>::MatrixCategory ());
+		}
+
+		/** Matrix-matrix in-place multiply on the left
+		 * B <- A * B.
+		 *
+		 * B should support both row and column iterators, and must be dense. A
+		 * must support row iterators.
+		 *
+		 * @param A Input matrix A
+		 * @param B Input matrix B
+		 * @returns Reference to B
+		 */
+		template <class Matrix1, class Matrix2>
+		inline Matrix2 &leftMulin (const Matrix1 &A, Matrix2 &B) const;
+
+		/** Matrix-matrix in-place multiply on the right
+		 * A <- A * B.
+		 *
+		 * A should support both row and column iterators, and must be dense. B
+		 * must support column iterators.
+		 *
+		 * @param A Input matrix A
+		 * @param B Input matrix B
+		 * @returns Reference to A
+		 */
+		template <class Matrix1, class Matrix2>
+		inline Matrix1 &rightMulin (Matrix1 &A, const Matrix2 &B) const;
+
+		/** Matrix-matrix in-place multiply
+		 * A <- A * B.
+		 *
+		 * This is an alias for \ref rightMulin
+		 *
+		 * @param A Input matrix A
+		 * @param B Input matrix B
+		 * @returns Reference to A
+		 */
+		template <class Matrix1, class Matrix2>
+		inline Matrix1 &mulin (Matrix1 &A, const Matrix2 &B) const
+		{
+			return rightMulin (A, B);
+		}
+
+		/** Matrix-scalar multiply
+		 * C <- B * a.
+		 *
+		 * Multiply B by the scalar element a and store the result in C. B and C
+		 * must support the same iterators.
+		 *
+		 * @param C Output matrix C
+		 * @param B Input matrix B
+		 * @param a Input scalar a
+		 * @returns Reference to C
+		 */
+		template <class Matrix1, class Matrix2>
+		inline Matrix1 &mul (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a) const
+		{
+			return mulSpecialized (C, B, a,
+					       typename MatrixTraits<Matrix1>::MatrixCategory (),
+					       typename MatrixTraits<Matrix2>::MatrixCategory ());
+		}
+
+		/** Matrix-scalar in-place multiply
+		 * B <- B * a.
+		 *
+		 * Multiply B by the scalar element a in-place.
+		 *
+		 * @param B Input matrix B
+		 * @param a Input scalar a
+		 * @returns Reference to B
+		 */
+		template <class Matrix_>
+		inline Matrix_ &mulin (Matrix_ &B, const typename Field::Element &a) const
+		{
+			return mulinSpecialized (B, a, typename MatrixTraits<Matrix_>::MatrixCategory ());
+		}
+
+		/** Matrix-matrix in-place axpy
+		 * Y <- Y + A*X.
+		 *
+		 * This function combines \ref mul and \ref add, eliminating the need
+		 * for an additional temporary in expressions of the form $Y = Y +
+		 * AX$. Only one row of additional storage is required. Y may have
+		 * either efficient row iterators or efficient column iterators, and the
+		 * same restrictions on A and X apply as in \ref mul.
+		 *
+		 * Note that no out-of-place axpy is provided, since it gives no
+		 * benefit. One may just as easily multiply into the result and call
+		 * \ref addin.
+		 *
+		 * @param Y Input matrix Y; result is stored here
+		 * @param A Input matrix A
+		 * @param X Input matrix X
+		 */
+		template <class Matrix1, class Matrix2, class Matrix3>
+		inline Matrix1 &axpyin (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
+		{
+			return axpyinSpecialized (Y, A, X,
+						  typename MatrixTraits<Matrix1>::MatrixCategory (),
+						  typename MatrixTraits<Matrix2>::MatrixCategory (),
+						  typename MatrixTraits<Matrix3>::MatrixCategory ());
+		}
+
+		//! Y <- AX-Y
+		template <class Matrix1, class Matrix2, class Matrix3>
+		inline Matrix1 &axmyin (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
+		{
+			negin(Y);
+			axpyin(Y,A,X);
+			return Y;
+		}
+
+		// Y <- Y + aX
+		template <class Matrix1, class Matrix3>
+		inline Matrix1 &saxpyin (Matrix1 &Y, const Element &a, const Matrix3 &X) const
+		{	// a crude hack for now
+			Element x, y;
+			for (size_t i = 0; i < X.rowdim(); ++i)
+			for (size_t j = 0; j < X.coldim(); ++j)
+				Y.setEntry(i,j,field().axpyin(Y.getEntry(y,i,j), a, X.getEntry(x, i, j)));
+			return Y;
+		}
+
+		/*!  General matrix multiply
+		 * \f$ D \gets \alpha A B + \beta C\f$.
+		 * @todo not efficient...
+		 */
+		template <class Matrix1, class Matrix2, class Matrix3>
+		inline Matrix1 &muladd (Matrix1                       & D,
+					const typename Field::Element & beta,
+					const Matrix1                 & C,
+					const typename Field::Element & alpha,
+					const Matrix2                 & A,
+					const Matrix3                 & B) const
+		{
+			mul(D,A,B); // D = AB
+			mulin(D,alpha); // D = alpha D
+			Matrix1 CC(C);
+			mulin(CC,beta);   // C = beta C
+			addin(D,CC);   // D = D+C
+			return D;
+		}
+
+		/*! @todo Need documentation of these methods */
+		//@{
+		template<class Matrix1, class Matrix2>
+		Matrix1 &pow_apply (Matrix1 &M1, const Matrix2 &M2, unsigned long int k) const;
+
+		template<class Matrix1, class Matrix2>
+		Matrix1 &pow_horn (Matrix1 &M1, const Matrix2 &M2, unsigned long int k) const;
+		//@}
+
+
+		/*! @name Matrix-vector arithmetic operations
+		 * These operations take a matrix satisfying the \ref DenseMatrix
+		 * archetype and LinBox vectors as inputs. They involve matrix-vector
+		 * product and matrix-vector AXPY
+		 */
+		//@{
+		/** Matrix-vector multiply
+		 * w <- A * v.
+		 *
+		 * The vectors v and w must be of the same representation (dense, sparse
+		 * sequence, sparse associative, or sparse parallel), but they may be of
+		 * different types. The matrix A may have any representation.
+		 *
+		 * @param w Output vector w
+		 * @param A Input matrix A
+		 * @param v Input vector v
+		 * @returns Reference to w
+		 */
+		template <class Vector1, class Matrix_, class Vector2>
+		inline Vector1 &vectorMul (Vector1 &w, const Matrix_ &A, const Vector2 &v) const
+		{
+			return mulSpecialized (w, A, v, typename MatrixTraits<Matrix_>::MatrixCategory ());
+		}
+
+		/** Matrix-vector in-place axpy
+		 * \f$y \gets y + A x\f$.
+		 *
+		 * This function eliminates the requirement for temporary storage when
+		 * one is computing an expression of the form given above.
+		 *
+		 * The vectors y and x must be of the same representation (dense, sparse
+		 * sequence, sparse associative, or sparse parallel), but they may be of
+		 * different types. The matrix A may have any representation.
+		 *
+		 * Note that out-of-place axpy is not provided since it provides no
+		 * benefit -- one can use mul and then addin to exactly the same effect,
+		 * with no additional storage or performance cost.
+		 *
+		 * @param y Input vector y; result is stored here
+		 * @param A Input matrix A
+		 * @param x Input vector x
+		 */
+		template <class Vector1, class Matrix_, class Vector2>
+		inline Vector1 &vectorAxpyin (Vector1 &y, const Matrix_ &A, const Vector2 &x) const
+		{
+			return axpyinSpecialized (y, A, x, typename MatrixTraits<Matrix_>::MatrixCategory ());
+		}
+		//@}
+
+		/*! @name Matrix-black box arithmetic operations
+		 * These operations mimic the matrix-matrix arithmetic operations above,
+		 * but one of the parameters is a \ref BlackboxArchetype.
+		 */
+		//@{
+		/** Matrix-black box left-multiply
+		 * C <- A * B.
+		 *
+		 * Both C and B must support column iterators
+		 *
+		 * @param C Output matrix
+		 * @param A Black box for A
+		 * @param B Matrix B
+		 */
+		template <class Matrix1, class Blackbox, class Matrix2>
+		inline Matrix1 &blackboxMulLeft (Matrix1 &C, const Blackbox &A, const Matrix2 &B) const;
+
+		/** Matrix-black box right-multiply
+		 * C <- A * B.
+		 *
+		 * Both C and A must support row iterators
+		 *
+		 * @param C Output matrix
+		 * @param A Matrix A
+		 * @param B Black box for B
+		 */
+		template <class Matrix1, class Matrix2, class Blackbox>
+		inline Matrix1 &blackboxMulRight (Matrix1 &C, const Matrix2 &A, const Blackbox &B) const;
+		//@}
+
+		/*! @name Matrix permutations
+		 * @brief
+		 * These operations permute the rows or columns of a matrix based on
+		 * the given permutation. They are intended for use with Gauss-Jordan
+		 * elimination
+		 */
+		//@{
+		/// Transposition.
+		typedef std::pair<unsigned int, unsigned int> Transposition;
+		/** Permutation.
+		 *
+		 * A permutation is represented as a vector of pairs, each
+		 * pair representing a transposition.
+		 */
+		typedef std::vector<Transposition> Permutation;
+
+
+		/** Permute the rows of the given matrix.
+		 *
+		 * @param A Output matrix
+		 * @param P_start Start of permutation
+		 * @param P_end End of permutation
+		 * @returns Reference to A
+		 */
+		template <class Matrix_, class Iterator>
+		inline Matrix_ &permuteRows (Matrix_   &A,
+					    Iterator  P_start,
+					    Iterator  P_end) const
+		{
+			return permuteRowsSpecialized (A, P_start, P_end,
+						       typename MatrixTraits<Matrix_>::MatrixCategory ());
+		}
+
+		/** Permute the columns of the given matrix.
+		 *
+		 * @param A Output matrix
+		 * @param P_start Start of permutation
+		 * @param P_end End of permutation
+		 * @returns Reference to A
+		 */
+		template <class Matrix_, class Iterator>
+		inline Matrix_ &permuteColumns (Matrix_   &A,
+					       Iterator  P_start,
+					       Iterator  P_end) const
+		{
+			return permuteColsSpecialized (A, P_start, P_end,
+						       typename MatrixTraits<Matrix_>::MatrixCategory ());
+		}
+		//@}
+
+		const VectorDomain<Field> & vectorDomain() const
+		{
+			return _VD ;
+		}
+	protected:
+
+		// Specialized function implementations
+		template <class Matrix1, class Matrix2> Matrix1 &copyRow (Matrix1 &B, const Matrix2 &A) const;
+		template <class Matrix1, class Matrix2> Matrix1 &copyCol (Matrix1 &B, const Matrix2 &A) const;
+
+		template <class Matrix1, class Matrix2>
+		inline Matrix1 &copySpecialized (Matrix1 &B, const Matrix2 &A,
+						 MatrixCategories::RowMatrixTag,
+						 MatrixCategories::RowMatrixTag) const
+		{
+			return copyRow (B, A);
+		}
+		template <class Matrix1, class Matrix2>
+		inline Matrix1 &copySpecialized (Matrix1 &B, const Matrix2 &A,
+						 MatrixCategories::ColMatrixTag,
+						 MatrixCategories::ColMatrixTag) const
+		{
+			return copyCol (B, A);
+		}
+		template <class Matrix1, class Matrix2>
+		inline Matrix1 &copySpecialized (Matrix1 &B, const Matrix2 &A,
+						 MatrixCategories::RowColMatrixTag,
+						 MatrixCategories::RowColMatrixTag) const
+		{
+			return copyRow (B, A);
+		}
+
+		template <class Matrix1, class Matrix2> bool areEqualBB (const Matrix1 &A, const Matrix2 &B) const;
+		template <class Matrix1, class Matrix2> bool areEqualRow (const Matrix1 &A, const Matrix2 &B) const;
+		template <class Matrix1, class Matrix2> bool areEqualCol (const Matrix1 &A, const Matrix2 &B) const;
+
+		template <class Matrix1, class Matrix2>
+		inline bool areEqualSpecialized (const Matrix1 &A, const Matrix2 &B,
+						 MatrixCategories::BlackboxTag,
+						 MatrixCategories::BlackboxTag) const
+		{
+			return areEqualBB(A, B);
+		}
+		template <class Matrix1, class Matrix2>
+		inline bool areEqualSpecialized (const Matrix1 &A, const Matrix2 &B,
+						 MatrixCategories::RowMatrixTag,
+						 MatrixCategories::RowMatrixTag) const
+		{
+			return areEqualRow (A, B);
+		}
+		template <class Matrix1, class Matrix2>
+		inline bool areEqualSpecialized (const Matrix1 &A, const Matrix2 &B,
+						 MatrixCategories::ColMatrixTag,
+						 MatrixCategories::ColMatrixTag) const
+		{
+			return areEqualCol (A, B);
+		}
+		template <class Matrix1, class Matrix2>
+		inline bool areEqualSpecialized (const Matrix1 &A, const Matrix2 &B,
+						 MatrixCategories::RowColMatrixTag,
+						 MatrixCategories::RowColMatrixTag) const
+		{
+			return areEqualRow (A, B);
+		}
+
+		template <class Matrix_> bool isZeroBB (const Matrix_ &v) const;
+		template <class Matrix_> bool isZeroRow (const Matrix_ &v) const;
+		template <class Matrix_> bool isZeroCol (const Matrix_ &v) const;
+
+		template <class Matrix_>
+		bool isZeroSpecialized (const Matrix_ &A, MatrixCategories::BlackboxTag) const
+		{
+			return isZeroBB (A);
+		}
+		template <class Matrix_>
+		bool isZeroSpecialized (const Matrix_ &A, MatrixCategories::RowMatrixTag) const
+		{
+			return isZeroRow (A);
+		}
+		template <class Matrix_>
+		bool isZeroSpecialized (const Matrix_ &A, MatrixCategories::ColMatrixTag) const
+		{
+			return isZeroCol (A);
+		}
+		template <class Matrix_>
+		bool isZeroSpecialized (const Matrix_ &A, MatrixCategories::RowColMatrixTag) const
+		{
+			return isZeroRow (A);
+		}
+
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1& addRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1& addCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
+
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1& addSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+					 MatrixCategories::RowMatrixTag,
+					 MatrixCategories::RowMatrixTag,
+					 MatrixCategories::RowMatrixTag) const
+		{
+			return addRow (C, A, B);
+		}
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1& addSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+					 MatrixCategories::ColMatrixTag,
+					 MatrixCategories::ColMatrixTag,
+					 MatrixCategories::ColMatrixTag) const
+		{
+			return addCol (C, A, B);
+		}
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1& addSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+					 MatrixCategories::RowColMatrixTag,
+					 MatrixCategories::RowColMatrixTag,
+					 MatrixCategories::RowColMatrixTag) const
+		{
+			return addRow (C, A, B);
+		}
+
+		template <class Matrix1, class Matrix2> Matrix1& addinRow (Matrix1 &A, const Matrix2 &B) const;
+		template <class Matrix1, class Matrix2> Matrix1& addinCol (Matrix1 &A, const Matrix2 &B) const;
+
+		template <class Matrix1, class Matrix2>
+		inline Matrix1& addinSpecialized (Matrix1 &A, const Matrix2 &B,
+						  MatrixCategories::RowMatrixTag,
+						  MatrixCategories::RowMatrixTag) const
+		{
+			return addinRow (A, B);
+		}
+		template <class Matrix1, class Matrix2>
+		inline Matrix1& addinSpecialized (Matrix1 &A, const Matrix2 &B,
+						  MatrixCategories::ColMatrixTag,
+						  MatrixCategories::ColMatrixTag) const
+		{
+			return addinCol (A, B);
+		}
+		template <class Matrix1, class Matrix2>
+		inline Matrix1& addinSpecialized (Matrix1 &A, const Matrix2 &B,
+						  MatrixCategories::RowColMatrixTag,
+						  MatrixCategories::RowColMatrixTag) const
+		{
+			return addinRow (A, B);
+		}
+
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1& subRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1& subCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
+
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1& subSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+					 MatrixCategories::RowMatrixTag,
+					 MatrixCategories::RowMatrixTag,
+					 MatrixCategories::RowMatrixTag) const
+		{
+			return subRow (C, A, B);
+		}
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1& subSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+					 MatrixCategories::ColMatrixTag,
+					 MatrixCategories::ColMatrixTag,
+					 MatrixCategories::ColMatrixTag) const
+		{
+			return subCol (C, A, B);
+		}
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1& subSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+					 MatrixCategories::RowColMatrixTag,
+					 MatrixCategories::RowColMatrixTag,
+					 MatrixCategories::RowColMatrixTag) const
+		{
+			return subRow (C, A, B);
+		}
+
+		template <class Matrix1, class Matrix2> Matrix1& subinRow (Matrix1 &A, const Matrix2 &B) const;
+		template <class Matrix1, class Matrix2> Matrix1& subinCol (Matrix1 &A, const Matrix2 &B) const;
+
+		template <class Matrix1, class Matrix2>
+		Matrix1& subinSpecialized (Matrix1 &A, const Matrix2 &B,
+					   MatrixCategories::RowMatrixTag,
+					   MatrixCategories::RowMatrixTag) const
+		{
+			return subinRow (A, B);
+		}
+		template <class Matrix1, class Matrix2>
+		Matrix1& subinSpecialized (Matrix1 &A, const Matrix2 &B,
+					   MatrixCategories::ColMatrixTag,
+					   MatrixCategories::ColMatrixTag) const
+		{
+			return subinCol (A, B);
+		}
+		template <class Matrix1, class Matrix2>
+		Matrix1& subinSpecialized (Matrix1 &A, const Matrix2 &B,
+					   MatrixCategories::RowColMatrixTag,
+					   MatrixCategories::RowColMatrixTag) const
+		{
+			return subinRow (A, B);
+		}
+
+		template <class Matrix1, class Matrix2> Matrix1& negRow (Matrix1 &A, const Matrix2 &B) const;
+		template <class Matrix1, class Matrix2> Matrix1& negCol (Matrix1 &A, const Matrix2 &B) const;
+
+		template <class Matrix1, class Matrix2>
+		inline Matrix1& negSpecialized (Matrix1 &A, const Matrix2 &B,
+						MatrixCategories::RowMatrixTag,
+						MatrixCategories::RowMatrixTag) const
+		{
+			return negRow (A, B);
+		}
+		template <class Matrix1, class Matrix2>
+		inline Matrix1& negSpecialized (Matrix1 &A, const Matrix2 &B,
+						MatrixCategories::ColMatrixTag,
+						MatrixCategories::ColMatrixTag) const
+		{
+			return negCol (A, B);
+		}
+		template <class Matrix1, class Matrix2>
+		inline Matrix1& negSpecialized (Matrix1 &A, const Matrix2 &B,
+						MatrixCategories::RowColMatrixTag,
+						MatrixCategories::RowColMatrixTag) const
+		{
+			return negRow (A, B);
+		}
+
+		template <class Matrix_> Matrix_ &neginRow (Matrix_ &A) const;
+		template <class Matrix_> Matrix_ &neginCol (Matrix_ &A) const;
+
+		template <class Matrix_>
+		Matrix_ &neginSpecialized (Matrix_ &A, MatrixCategories::RowMatrixTag) const
+		{
+			return neginRow (A);
+		}
+		template <class Matrix_>
+		Matrix_ &neginSpecialized (Matrix_ &A, MatrixCategories::ColMatrixTag) const
+		{
+			return neginCol (A);
+		}
+		template <class Matrix_>
+		Matrix_ &neginSpecialized (Matrix_ &A, MatrixCategories::RowColMatrixTag) const
+		{
+			return neginRow (A);
+		}
+
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1 &mulRowRowCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1 &mulColRowCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1 &mulRowRowRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1 &mulColColCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const;
+
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+					 MatrixCategories::RowMatrixTag,
+					 MatrixCategories::RowMatrixTag,
+					 MatrixCategories::BlackboxTag) const
+		{
+			return blackboxMulRight(C, A, B);
+		}
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+					 MatrixCategories::ColMatrixTag,
+					 MatrixCategories::BlackboxTag,
+					 MatrixCategories::ColMatrixTag) const
+		{
+			return blackboxMulLeft(C, A, B);
+		}
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+					 MatrixCategories::RowMatrixTag,
+					 MatrixCategories::RowMatrixTag,
+					 MatrixCategories::ColMatrixTag) const
+		{
+			return mulRowRowCol (C, A, B);
+		}
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+					 MatrixCategories::ColMatrixTag,
+					 MatrixCategories::RowMatrixTag,
+					 MatrixCategories::ColMatrixTag) const
+		{
+			return mulColRowCol (C, A, B);
+		}
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+					 MatrixCategories::RowColMatrixTag,
+					 MatrixCategories::RowMatrixTag,
+					 MatrixCategories::ColMatrixTag) const
+		{
+			return mulRowRowCol (C, A, B);
+		}
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+					 MatrixCategories::RowMatrixTag,
+					 MatrixCategories::RowMatrixTag,
+					 MatrixCategories::RowMatrixTag) const
+		{
+			return mulRowRowRow (C, A, B);
+		}
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+					 MatrixCategories::ColMatrixTag,
+					 MatrixCategories::ColMatrixTag,
+					 MatrixCategories::ColMatrixTag) const
+		{
+			return mulColColCol (C, A, B);
+		}
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &A, const Matrix3 &B,
+					 MatrixCategories::RowColMatrixTag,
+					 MatrixCategories::RowColMatrixTag,
+					 MatrixCategories::RowColMatrixTag) const
+		{
+			return mulRowRowCol (C, A, B);
+		}
+
+		template <class Matrix1, class Matrix2>
+		Matrix1 &mulRow (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a) const;
+		template <class Matrix1, class Matrix2>
+		Matrix1 &mulCol (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a) const;
+
+		template <class Matrix1, class Matrix2>
+		Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a,
+					 MatrixCategories::RowMatrixTag,
+					 MatrixCategories::RowMatrixTag) const
+		{
+			return mulRow (C, B, a);
+		}
+		template <class Matrix1, class Matrix2>
+		Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a,
+					 MatrixCategories::ColMatrixTag,
+					 MatrixCategories::ColMatrixTag) const
+		{
+			return mulCol (C, B, a);
+		}
+		template <class Matrix1, class Matrix2>
+		Matrix1 &mulSpecialized (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a,
+					 MatrixCategories::RowColMatrixTag,
+					 MatrixCategories::RowColMatrixTag) const
+		{
+			return mulRow (C, B, a);
+		}
+
+		template <class Matrix_> Matrix_ &mulinRow (Matrix_ &B, const typename Field::Element &a) const;
+		template <class Matrix_> Matrix_ &mulinCol (Matrix_ &B, const typename Field::Element &a) const;
+
+		template <class Matrix_>
+		Matrix_ &mulinSpecialized (Matrix_ &B, const typename Field::Element &a,
+					  MatrixCategories::RowMatrixTag) const
+		{
+			return mulinRow (B, a);
+		}
+		template <class Matrix_>
+		Matrix_ &mulinSpecialized (Matrix_ &B, const typename Field::Element &a,
+					  MatrixCategories::ColMatrixTag) const
+		{
+			return mulinCol (B, a);
+		}
+		template <class Matrix_>
+		Matrix_ &mulinSpecialized (Matrix_ &B, const typename Field::Element &a,
+					  MatrixCategories::RowColMatrixTag) const
+		{
+			return mulinRow (B, a);
+		}
+
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1 &axpyinRowRowCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const;
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1 &axpyinColRowCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const;
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1 &axpyinRowRowRow (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const;
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1 &axpyinColColCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const;
+
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
+					    MatrixCategories::RowMatrixTag,
+					    MatrixCategories::RowMatrixTag,
+					    MatrixCategories::ColMatrixTag) const
+		{
+			return axpyinRowRowCol (Y, A, X);
+		}
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
+					    MatrixCategories::ColMatrixTag,
+					    MatrixCategories::RowMatrixTag,
+					    MatrixCategories::ColMatrixTag) const
+		{
+			return axpyinColRowCol (Y, A, X);
+		}
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
+					    MatrixCategories::RowColMatrixTag,
+					    MatrixCategories::RowMatrixTag,
+					    MatrixCategories::ColMatrixTag) const
+		{
+			return axpyinRowRowCol (Y, A, X);
+		}
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
+					    MatrixCategories::RowMatrixTag,
+					    MatrixCategories::RowMatrixTag,
+					    MatrixCategories::RowMatrixTag) const
+		{
+			return axpyinRowRowRow (Y, A, X);
+		}
+
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
+					    MatrixCategories::ColMatrixTag,
+					    MatrixCategories::ColMatrixTag,
+					    MatrixCategories::ColMatrixTag) const
+		{
+			return axpyinColColCol (Y, A, X);
+		}
+
+		template <class Matrix1, class Matrix2, class Matrix3>
+		Matrix1 &axpyinSpecialized (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X,
+					    MatrixCategories::RowColMatrixTag,
+					    MatrixCategories::RowColMatrixTag,
+					    MatrixCategories::RowColMatrixTag) const
+		{
+			return axpyinRowRowCol (Y, A, X);
+		}
+
+		template <class Vector1, class Matrix_, class Vector2>
+		Vector1 &mulRowSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+					    VectorCategories::DenseVectorTag) const;
+		template <class Vector1, class Matrix_, class Vector2>
+		Vector1 &mulRowSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+					    VectorCategories::SparseSequenceVectorTag) const;
+		template <class Vector1, class Matrix_, class Vector2>
+		Vector1 &mulRowSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+					    VectorCategories::SparseAssociativeVectorTag) const;
+		template <class Vector1, class Matrix_, class Vector2>
+		Vector1 &mulRowSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+					    VectorCategories::SparseParallelVectorTag) const;
+
+		template <class Vector1, class Matrix_, class Vector2>
+		Vector1 &mulColSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+					    VectorCategories::DenseVectorTag,
+					    VectorCategories::DenseVectorTag) const
+		{
+			return this->mulColDense (_VD, w, A, v);
+		}
+		template <class Vector1, class Matrix_, class Vector2>
+		Vector1 &mulColSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+					    VectorCategories::DenseVectorTag,
+					    VectorCategories::SparseSequenceVectorTag) const;
+		template <class Vector1, class Matrix_, class Vector2>
+		Vector1 &mulColSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+					    VectorCategories::DenseVectorTag,
+					    VectorCategories::SparseAssociativeVectorTag) const;
+		template <class Vector1, class Matrix_, class Vector2>
+		Vector1 &mulColSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+					    VectorCategories::DenseVectorTag,
+					    VectorCategories::SparseParallelVectorTag) const;
+
+		template <class Vector1, class Matrix_, class Vector2>
+		inline Vector1 &mulColSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+						   VectorCategories::GenericVectorTag,
+						   VectorCategories::GenericVectorTag) const
+		{
+			DenseVector y(field());
+
+			VectorWrapper::ensureDim (y, w.size ());
+
+			VectorWrapper::ensureDim (y, w.size ());
+
+			vectorMul (y, A, v);
+			_VD.copy (w, y);
+
+			return w;
+		}
+
+		template <class Vector1, class Matrix_, class Vector2>
+		Vector1 &mulSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+					 MatrixCategories::RowMatrixTag) const
+		{
+			return mulRowSpecialized (w, A, v, typename VectorTraits<Vector1>::VectorCategory ());
+		}
+		template <class Vector1, class Matrix_, class Vector2>
+		Vector1 &mulSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+					 MatrixCategories::ColMatrixTag) const
+		{
+			return mulColSpecialized (w, A, v,
+						  typename VectorTraits<Vector1>::VectorCategory (),
+						  typename VectorTraits<Vector2>::VectorCategory ());
+		}
+		template <class Vector1, class Matrix_, class Vector2>
+		Vector1 &mulSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+					 MatrixCategories::RowColMatrixTag) const
+		{
+			return mulRowSpecialized (w, A, v, typename VectorTraits<Vector1>::VectorCategory ());
+		}
+
+		template <class Vector1, class Matrix_, class Vector2>
+		Vector1 &axpyinRowSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+					       VectorCategories::DenseVectorTag) const;
+		template <class Vector1, class Matrix_, class Vector2>
+		Vector1 &axpyinRowSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+					       VectorCategories::SparseSequenceVectorTag) const;
+		template <class Vector1, class Matrix_, class Vector2>
+		Vector1 &axpyinRowSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+					       VectorCategories::SparseAssociativeVectorTag) const;
+		template <class Vector1, class Matrix_, class Vector2>
+		Vector1 &axpyinRowSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+					       VectorCategories::SparseParallelVectorTag) const;
+
+		template <class Vector1, class Matrix_, class Vector2>
+		Vector1 &axpyinColSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+					       VectorCategories::DenseVectorTag) const;
+		template <class Vector1, class Matrix_, class Vector2>
+		Vector1 &axpyinColSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+					       VectorCategories::SparseSequenceVectorTag) const;
+		template <class Vector1, class Matrix_, class Vector2>
+		Vector1 &axpyinColSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+					       VectorCategories::SparseAssociativeVectorTag) const;
+		template <class Vector1, class Matrix_, class Vector2>
+		Vector1 &axpyinColSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+					       VectorCategories::SparseParallelVectorTag) const;
+
+		template <class Vector1, class Matrix_, class Vector2>
+		Vector1 &axpyinSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+					    MatrixCategories::RowMatrixTag) const
+		{
+			return axpyinRowSpecialized (y, A, x, typename VectorTraits<Vector1>::VectorCategory ());
+		}
+		template <class Vector1, class Matrix_, class Vector2>
+		Vector1 &axpyinSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+					    MatrixCategories::ColMatrixTag) const
+		{
+			return axpyinColSpecialized (y, A, x, typename VectorTraits<Vector1>::VectorCategory ());
+		}
+		template <class Vector1, class Matrix_, class Vector2>
+		Vector1 &axpyinSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+					    MatrixCategories::RowColMatrixTag) const
+		{
+			return axpyinRowSpecialized (y, A, x, typename VectorTraits<Vector1>::VectorCategory ());
+		}
+
+		template <class Matrix_, class Iterator>
+		inline Matrix_ &permuteRowsByRow (Matrix_   &A,
+						 Iterator  P_start,
+						 Iterator  P_end) const;
+
+		template <class Matrix_, class Iterator>
+		inline Matrix_ &permuteRowsByCol (Matrix_   &A,
+						 Iterator  P_start,
+						 Iterator  P_end) const;
+
+		template <class Matrix_, class Iterator>
+		inline Matrix_ &permuteRowsSpecialized (Matrix_   &A,
+						       Iterator  P_start,
+						       Iterator  P_end,
+						       MatrixCategories::RowColMatrixTag) const
+		{
+			return permuteRowsByCol (A, P_start, P_end);
+		}
+
+		template <class Matrix_, class Iterator>
+		inline Matrix_ &permuteRowsSpecialized (Matrix_   &A,
+						       Iterator  P_start,
+						       Iterator  P_end,
+						       MatrixCategories::RowMatrixTag) const
+		{
+			return permuteRowsByRow (A, P_start, P_end);
+		}
+
+		template <class Matrix_, class Iterator>
+		inline Matrix_ &permuteRowsSpecialized (Matrix_   &A,
+						       Iterator  P_start,
+						       Iterator  P_end,
+						       MatrixCategories::ColMatrixTag) const
+		{
+			return permuteRowsByCol (A, P_start, P_end);
+		}
+
+		template <class Matrix_, class Iterator>
+		inline Matrix_ &permuteColsByRow (Matrix_   &A,
+						 Iterator  P_start,
+						 Iterator  P_end) const;
+
+		template <class Matrix_, class Iterator>
+		inline Matrix_ &permuteColsByCol (Matrix_   &A,
+						 Iterator  P_start,
+						 Iterator  P_end) const;
+
+		template <class Matrix_, class Iterator>
+		inline Matrix_ &permuteColsSpecialized (Matrix_   &A,
+						       Iterator  P_start,
+						       Iterator  P_end,
+						       MatrixCategories::RowColMatrixTag) const
+		{
+			return permuteColsByRow (A, P_start, P_end);
+		}
+
+		template <class Matrix_, class Iterator>
+		inline Matrix_ &permuteColsSpecialized (Matrix_   &A,
+						       Iterator  P_start,
+						       Iterator  P_end,
+						       MatrixCategories::RowMatrixTag) const
+		{
+			return permuteColsByRow (A, P_start, P_end);
+		}
+
+		template <class Matrix_, class Iterator>
+		inline Matrix_ &permuteColsSpecialized (Matrix_   &A,
+						       Iterator  P_start,
+						       Iterator  P_end,
+						       MatrixCategories::ColMatrixTag) const
+		{
+			return permuteColsByCol (A, P_start, P_end);
+		}
+
+		const Field         *_field;
+		VectorDomain<Field>  _VD;
+	}; //MatrixDomain
+
+}
+
+#include "linbox/matrix/matrixdomain/matrix-domain.inl"
+
+#endif // __LINBOX_matrix_domain_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+
diff --git a/linbox/matrix/matrixdomain/matrix-domain.inl b/linbox/matrix/matrixdomain/matrix-domain.inl
new file mode 100644
index 0000000..a057043
--- /dev/null
+++ b/linbox/matrix/matrixdomain/matrix-domain.inl
@@ -0,0 +1,1200 @@
+
+/* linbox/matrix/matrix-domain.inl
+ * Copyright (C) 2002 Bradford Hovinen
+ *
+ * Written by Bradford Hovinen <bghovinen at math.uwaterloo.ca>
+ *
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_matrix_domain_INL
+#define __LINBOX_matrix_domain_INL
+
+#include <linbox/linbox-config.h>
+#include "linbox/matrix/transpose-matrix.h"
+#include "linbox/blackbox/dif.h"
+
+namespace LinBox
+{
+
+	template<class Field>
+	template <class Matrix1, class Matrix2>
+	Matrix1 &MatrixDomain<Field>::copyRow (Matrix1 &A, const Matrix2 &B) const
+	{
+		linbox_check (A.rowdim () == B.rowdim ());
+		linbox_check (A.coldim () == B.coldim ());
+
+		typename Matrix1::RowIterator i;
+		typename Matrix2::ConstRowIterator j;
+
+		i = A.rowBegin ();
+		j = B.rowBegin ();
+
+		for (; i != A.rowEnd (); ++i, ++j)
+			_VD.copy (*i, *j);
+
+		return A;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2>
+	Matrix1 &MatrixDomain<Field>::copyCol (Matrix1 &A, const Matrix2 &B) const
+	{
+		linbox_check (A.rowdim () == B.rowdim ());
+		linbox_check (A.coldim () == B.coldim ());
+
+		typename Matrix1::ColIterator i;
+		typename Matrix2::ConstColIterator j;
+
+		i = A.colBegin ();
+		j = B.colBegin ();
+
+		for (; i != A.colEnd (); ++i, ++j)
+			_VD.copy (*i, *j);
+
+		return A;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2>
+	bool MatrixDomain<Field>::areEqualBB (const Matrix1 &A, const Matrix2 &B) const
+	{ Dif<Matrix1, Matrix2> C(A, B); return isZero(C); }
+
+	template<class Field>
+	template <class Matrix1, class Matrix2>
+	bool MatrixDomain<Field>::areEqualRow (const Matrix1 &A, const Matrix2 &B) const
+	{
+		linbox_check (A.rowdim () == B.rowdim ());
+		linbox_check (A.coldim () == B.coldim ());
+
+		typename Matrix1::ConstRowIterator i;
+		typename Matrix2::ConstRowIterator j;
+
+		i = A.rowBegin ();
+		j = B.rowBegin ();
+
+		for (; i != A.rowEnd (); ++i, ++j)
+			if (!_VD.areEqual (*i, *j))
+				return false;
+
+		return true;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2>
+	bool MatrixDomain<Field>::areEqualCol (const Matrix1 &A, const Matrix2 &B) const
+	{
+		linbox_check (A.rowdim () == B.rowdim ());
+		linbox_check (A.coldim () == B.coldim ());
+
+		typename Matrix1::ConstColIterator i;
+		typename Matrix2::ConstColIterator j;
+
+		i = A.colBegin ();
+		j = B.colBegin ();
+
+		for (; i != A.colEnd (); ++i, ++j)
+			if (!_VD.areEqual (*i, *j))
+				return false;
+
+		return true;
+	}
+
+	template<class Field>
+	template <class Matrix_>
+	bool MatrixDomain<Field>::isZeroBB (const Matrix_ &A) const
+	{
+		VectorDomain<Field> VD(A.field());
+		std::vector<typename Field::Element> x(A.coldim()), y(A.rowdim());
+		VD.random(x);
+		A.apply(y, x);
+		return VD.isZero(y);
+	}
+
+	template<class Field>
+	template <class Matrix_>
+	bool MatrixDomain<Field>::isZeroRow (const Matrix_ &A) const
+	{
+		typename Matrix_::ConstRowIterator i;
+
+		i = A.rowBegin ();
+
+		for (; i != A.rowEnd (); ++i)
+			if (!_VD.isZero (*i))
+				return false;
+
+		return true;
+	}
+
+	template<class Field>
+	template <class Matrix_>
+	bool MatrixDomain<Field>::isZeroCol (const Matrix_ &A) const
+	{
+		typename Matrix::ConstColIterator i;
+
+		i = A.colBegin ();
+
+		for (; i != A.colEnd (); ++i)
+			if (!_VD.isZero (*i))
+				return false;
+
+		return true;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2, class Matrix3>
+	Matrix1 &MatrixDomain<Field>::addRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
+	{
+		linbox_check (A.rowdim () == B.rowdim ());
+		linbox_check (A.coldim () == B.coldim ());
+		linbox_check (A.rowdim () == C.rowdim ());
+		linbox_check (A.coldim () == C.coldim ());
+
+		typename Matrix1::RowIterator i;
+		typename Matrix2::ConstRowIterator j;
+		typename Matrix3::ConstRowIterator k;
+
+		i = C.rowBegin ();
+		j = A.rowBegin ();
+		k = B.rowBegin ();
+
+		for (; i != C.rowEnd (); ++i, ++j, ++k)
+			_VD.add (*i, *j, *k);
+
+		return C;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2, class Matrix3>
+	Matrix1 &MatrixDomain<Field>::addCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
+	{
+		linbox_check (A.rowdim () == B.rowdim ());
+		linbox_check (A.coldim () == B.coldim ());
+		linbox_check (A.rowdim () == C.rowdim ());
+		linbox_check (A.coldim () == C.coldim ());
+
+		typename Matrix1::ColIterator i;
+		typename Matrix2::ConstColIterator j;
+		typename Matrix3::ConstColIterator k;
+
+		i = C.colBegin ();
+		j = A.colBegin ();
+		k = B.colBegin ();
+
+		for (; i != C.colEnd (); ++i, ++j, ++k)
+			_VD.add (*i, *j, *k);
+
+		return C;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2>
+	Matrix1 &MatrixDomain<Field>::addinRow (Matrix1 &A, const Matrix2 &B) const
+	{
+		linbox_check (A.rowdim () == B.rowdim ());
+		linbox_check (A.coldim () == B.coldim ());
+
+		typename Matrix1::RowIterator i;
+		typename Matrix2::ConstRowIterator j;
+
+		i = A.rowBegin ();
+		j = B.rowBegin ();
+
+		for (; i != A.rowEnd (); ++i, ++j)
+			_VD.addin (*i, *j);
+
+		return A;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2>
+	Matrix1 &MatrixDomain<Field>::addinCol (Matrix1 &A, const Matrix2 &B) const
+	{
+		linbox_check (A.rowdim () == B.rowdim ());
+		linbox_check (A.coldim () == B.coldim ());
+
+		typename Matrix1::ColIterator i;
+		typename Matrix2::ConstColIterator j;
+
+		i = A.colBegin ();
+		j = B.colBegin ();
+
+		for (; i != A.colEnd (); ++i, ++j)
+			_VD.addin (*i, *j);
+
+		return A;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2, class Matrix3>
+	Matrix1 &MatrixDomain<Field>::subRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
+	{
+		linbox_check (A.rowdim () == B.rowdim ());
+		linbox_check (A.coldim () == B.coldim ());
+		linbox_check (A.rowdim () == C.rowdim ());
+		linbox_check (A.coldim () == C.coldim ());
+
+		typename Matrix1::RowIterator i;
+		typename Matrix2::ConstRowIterator j;
+		typename Matrix3::ConstRowIterator k;
+
+		i = C.rowBegin ();
+		j = A.rowBegin ();
+		k = B.rowBegin ();
+
+		for (; i != C.rowEnd (); ++i, ++j, ++k)
+			_VD.sub (*i, *j, *k);
+
+		return C;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2, class Matrix3>
+	Matrix1 &MatrixDomain<Field>::subCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
+	{
+		linbox_check (A.rowdim () == B.rowdim ());
+		linbox_check (A.coldim () == B.coldim ());
+		linbox_check (A.rowdim () == C.rowdim ());
+		linbox_check (A.coldim () == C.coldim ());
+
+		typename Matrix1::ColIterator i;
+		typename Matrix2::ConstColIterator j;
+		typename Matrix3::ConstColIterator k;
+
+		i = C.colBegin ();
+		j = A.colBegin ();
+		k = B.colBegin ();
+
+		for (; i != C.colEnd (); ++i, ++j, ++k)
+			_VD.sub (*i, *j, *k);
+
+		return C;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2>
+	Matrix1 &MatrixDomain<Field>::subinRow (Matrix1 &A, const Matrix2 &B) const
+	{
+		linbox_check (A.rowdim () == B.rowdim ());
+		linbox_check (A.coldim () == B.coldim ());
+
+		typename Matrix1::RowIterator i;
+		typename Matrix2::ConstRowIterator j;
+
+		i = A.rowBegin ();
+		j = B.rowBegin ();
+
+		for (; i != A.rowEnd (); ++i, ++j)
+			_VD.subin (*i, *j);
+
+		return A;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2>
+	Matrix1 &MatrixDomain<Field>::subinCol (Matrix1 &A, const Matrix2 &B) const
+	{
+		linbox_check (A.rowdim () == B.rowdim ());
+		linbox_check (A.coldim () == B.coldim ());
+
+		typename Matrix1::ColIterator i;
+		typename Matrix2::ConstColIterator j;
+
+		i = A.colBegin ();
+		j = B.colBegin ();
+
+		for (; i != A.colEnd (); ++i, ++j)
+			_VD.subin (*i, *j);
+
+		return A;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2>
+	Matrix1 &MatrixDomain<Field>::negRow (Matrix1 &A, const Matrix2 &B) const
+	{
+		linbox_check (A.rowdim () == B.rowdim ());
+		linbox_check (A.coldim () == B.coldim ());
+
+		typename Matrix1::RowIterator i;
+		typename Matrix2::ConstRowIterator j;
+
+		i = A.rowBegin ();
+		j = B.rowBegin ();
+
+		for (; i != A.rowEnd (); ++i, ++j)
+			_VD.neg (*i, *j);
+
+		return A;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2>
+	Matrix1 &MatrixDomain<Field>::negCol (Matrix1 &A, const Matrix2 &B) const
+	{
+		linbox_check (A.rowdim () == B.rowdim ());
+		linbox_check (A.coldim () == B.coldim ());
+
+		typename Matrix1::ColIterator i;
+		typename Matrix2::ConstColIterator j;
+
+		i = A.colBegin ();
+		j = B.colBegin ();
+
+		for (; i != A.colEnd (); ++i, ++j)
+			_VD.neg (*i, *j);
+
+		return A;
+	}
+
+	template<class Field>
+	template <class Matrix_>
+	Matrix_ &MatrixDomain<Field>::neginRow (Matrix_ &A) const
+	{
+		typename Matrix_::RowIterator i;
+
+		for (i = A.rowBegin (); i != A.rowEnd (); ++i)
+			_VD.negin (*i);
+
+		return A;
+	}
+
+	template<class Field>
+	template <class Matrix_>
+	Matrix_ &MatrixDomain<Field>::neginCol (Matrix_ &A) const
+	{
+		typename Matrix_::ColIterator i;
+
+		for (i = A.colBegin (); i != A.colEnd (); ++i)
+			_VD.negin (*i);
+
+		return A;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2, class Matrix3>
+	Matrix1 &MatrixDomain<Field>::mulRowRowCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
+	{
+		linbox_check (A.coldim () == B.rowdim ());
+		linbox_check (A.rowdim () == C.rowdim ());
+		linbox_check (B.coldim () == C.coldim ());
+
+		typename Matrix2::ConstRowIterator i;
+		typename Matrix3::ConstColIterator j;
+		typename Matrix1::RowIterator l1;
+		typename Matrix1::Row::iterator l2;
+
+		for (i = A.rowBegin (), l1 = C.rowBegin (); i != A.rowEnd (); ++i, ++l1)
+			for (j = B.colBegin (), l2 = l1->begin (); j != B.colEnd (); ++j, ++l2)
+				_VD.dot (*l2, *i, *j);
+
+		return C;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2, class Matrix3>
+	Matrix1 &MatrixDomain<Field>::mulColRowCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
+	{
+		linbox_check (A.coldim () == B.rowdim ());
+		linbox_check (A.rowdim () == C.rowdim ());
+		linbox_check (B.coldim () == C.coldim ());
+
+		typename Matrix2::ConstRowIterator i;
+		typename Matrix3::ConstColIterator j;
+		typename Matrix1::ColIterator l1;
+		typename Matrix1::Col::iterator l2;
+
+		for (j = B.colBegin (), l1 = C.colBegin (); j != B.colEnd (); ++j, ++l1)
+			for (i = A.rowBegin (), l2 = l1->begin (); i != A.rowEnd (); ++i, ++l2)
+				_VD.dot (*l2, *i, *j);
+
+		return C;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2, class Matrix3>
+	Matrix1 &MatrixDomain<Field>::mulRowRowRow (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
+	{
+		linbox_check (A.coldim () == B.rowdim ());
+		linbox_check (A.rowdim () == C.rowdim ());
+		linbox_check (B.coldim () == C.coldim ());
+
+		typename Matrix2::ConstRowIterator i = A.rowBegin ();
+		typename Matrix1::RowIterator j = C.rowBegin ();
+
+		TransposeMatrix<const Matrix3> BT (B);
+
+		for (; i != A.rowEnd (); ++i, ++j)
+			vectorMul (*j, BT, *i);
+
+		return C;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2, class Matrix3>
+	Matrix1 &MatrixDomain<Field>::mulColColCol (Matrix1 &C, const Matrix2 &A, const Matrix3 &B) const
+	{
+		linbox_check (A.coldim () == B.rowdim ());
+		linbox_check (A.rowdim () == C.rowdim ());
+		linbox_check (B.coldim () == C.coldim ());
+
+		typename Matrix3::ConstColIterator i = B.colBegin ();
+		typename Matrix1::ColIterator j = C.colBegin ();
+
+		for (; i != B.colEnd (); ++i, ++j)
+			vectorMul (*j, A, *i);
+
+		return C;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2>
+	Matrix2 &MatrixDomain<Field>::leftMulin (const Matrix1 &A, Matrix2 &B) const
+	{
+		linbox_check (A.rowdim () == A.coldim ());
+		linbox_check (A.coldim () == B.rowdim ());
+
+		DenseVector t (field(),A.rowdim ());
+
+		typename Matrix2::ColIterator i;
+		typename Matrix1::ConstRowIterator j;
+
+		typename DenseVector::iterator k;
+
+		for (i = B.colBegin (); i != B.colEnd (); ++i) {
+			for (j = A.rowBegin (), k = t.begin (); j != A.rowEnd (); ++j, ++k)
+				_VD.dot (*k, *j, *i);
+
+			_VD.copy (*i, t);
+		}
+
+		return B;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2>
+	Matrix1 &MatrixDomain<Field>::rightMulin (Matrix1 &A, const Matrix2 &B) const
+	{
+		linbox_check (A.coldim () == B.rowdim ());
+		linbox_check (B.rowdim () == B.coldim ());
+
+		DenseVector t (field(),B.coldim ());
+
+		typename Matrix1::RowIterator i;
+		typename Matrix2::ConstColIterator j;
+
+		typename DenseVector::iterator k;
+
+		for (i = A.rowBegin (); i != A.rowEnd (); ++i) {
+			for (j = B.colBegin (), k = t.begin (); j != B.colEnd (); ++j, ++k)
+				_VD.dot (*k, *i, *j);
+
+			_VD.copy (*i, t);
+		}
+
+		return A;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2>
+	Matrix1 &MatrixDomain<Field>::mulRow (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a) const
+	{
+		linbox_check (C.rowdim () == B.rowdim ());
+		linbox_check (C.coldim () == B.coldim ());
+
+		typename Matrix1::RowIterator i;
+		typename Matrix2::ConstRowIterator j;
+
+		i = C.rowBegin ();
+		j = B.rowBegin ();
+
+		for (; i != C.rowEnd (); ++i, ++j)
+			_VD.mul (*i, *j, a);
+
+		return C;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2>
+	Matrix1 &MatrixDomain<Field>::mulCol (Matrix1 &C, const Matrix2 &B, const typename Field::Element &a) const
+	{
+		linbox_check (C.rowdim () == B.rowdim ());
+		linbox_check (C.coldim () == B.coldim ());
+
+		typename Matrix1::ColIterator i;
+		typename Matrix2::ConstColIterator j;
+
+		i = C.colBegin ();
+		j = B.colBegin ();
+
+		for (; i != C.colEnd (); ++i, ++j)
+			_VD.mul (*i, *j, a);
+
+		return C;
+	}
+
+	template<class Field>
+	template <class Matrix_>
+	Matrix_ &MatrixDomain<Field>::mulinRow (Matrix_ &B, const typename Field::Element &a) const
+	{
+		typename Matrix_::RowIterator i;
+
+		for (i = B.rowBegin (); i != B.rowEnd (); ++i)
+			_VD.mulin (*i, a);
+
+		return B;
+	}
+
+	template<class Field>
+	template <class Matrix_>
+	Matrix_ &MatrixDomain<Field>::mulinCol (Matrix_ &B, const typename Field::Element &a) const
+	{
+		typename Matrix_::ColIterator i;
+
+		for (i = B.colBegin (); i != B.colEnd (); ++i)
+			_VD.mulin (*i, a);
+
+		return B;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2, class Matrix3>
+	Matrix1 &MatrixDomain<Field>::axpyinRowRowCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
+	{
+		linbox_check (A.coldim () == X.rowdim ());
+		linbox_check (A.rowdim () == Y.rowdim ());
+		linbox_check (X.coldim () == Y.coldim ());
+
+		typename Matrix2::ConstRowIterator i;
+		typename Matrix3::ConstColIterator j;
+		typename Matrix1::RowIterator l1;
+		typename Matrix1::Row::iterator l2;
+
+		typename Field::Element t;
+
+		for (i = A.rowBegin (), l1 = Y.rowBegin (); i != A.rowEnd (); ++i, ++l1) {
+			for (j = X.colBegin (), l2 = l1->begin (); j != X.colEnd (); ++j, ++l2) {
+				_VD.dot (t, *i, *j);
+				field().addin (*l2, t);
+			}
+		}
+
+		return Y;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2, class Matrix3>
+	Matrix1 &MatrixDomain<Field>::axpyinColRowCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
+	{
+		linbox_check (A.coldim () == X.rowdim ());
+		linbox_check (A.rowdim () == Y.rowdim ());
+		linbox_check (X.coldim () == Y.coldim ());
+
+		typename Matrix2::ConstRowIterator i;
+		typename Matrix3::ConstColIterator j;
+		typename Matrix1::ColIterator l1;
+		typename Matrix1::Col::iterator l2;
+
+		typename Field::Element t;
+
+		for (j = X.colBegin (), l1 = Y.colBegin (); j != X.colEnd (); ++j, ++l1) {
+			for (i = A.rowBegin (), l2 = l1->begin (); i != A.rowEnd (); ++i, ++l2) {
+				_VD.dot (t, *i, *j);
+				field().addin (*l2, t);
+			}
+		}
+
+		return Y;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2, class Matrix3>
+	Matrix1 &MatrixDomain<Field>::axpyinRowRowRow (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
+	{
+		linbox_check (A.coldim () == X.rowdim ());
+		linbox_check (A.rowdim () == Y.rowdim ());
+		linbox_check (X.coldim () == Y.coldim ());
+
+		DenseVector t (field(),X.coldim ());
+
+		typename Matrix2::ConstRowIterator i = A.rowBegin ();
+		typename Matrix1::RowIterator j = Y.rowBegin ();
+
+		TransposeMatrix<const Matrix3> XT (X);
+
+		for (; i != A.rowEnd (); ++i, ++j) {
+			vectorMul (t, XT, *i);
+			_VD.addin (*j, t);
+		}
+
+		return Y;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2, class Matrix3>
+	Matrix1 &MatrixDomain<Field>::axpyinColColCol (Matrix1 &Y, const Matrix2 &A, const Matrix3 &X) const
+	{
+		linbox_check (A.coldim () == X.rowdim ());
+		linbox_check (A.rowdim () == Y.rowdim ());
+		linbox_check (X.coldim () == Y.coldim ());
+
+		DenseVector t (field(),A.rowdim ());
+
+		typename Matrix3::ConstColIterator i = X.colBegin ();
+		typename Matrix1::ColIterator j = Y.colBegin ();
+
+		for (; i != X.colEnd (); ++i, ++j) {
+			vectorMul (t, A, *i);
+			_VD.addin (*j, t);
+		}
+
+		return Y;
+	}
+
+	template<class Field>
+	template <class Vector1, class Matrix_, class Vector2>
+	Vector1 &MatrixDomain<Field>::mulRowSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+							 VectorCategories::DenseVectorTag) const
+	{
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix_::ConstRowIterator i = A.rowBegin ();
+		typename Vector1::iterator j = w.begin ();
+
+		// JGD 02.09.2008 : when sizes differ
+		// A must decide if dot is possible, not w
+		// 	for (; j != w.end (); ++j, ++i)
+		// 		_VD.dot (*j, v, *i);
+		for (; i != A.rowEnd (); ++j, ++i) {
+			linbox_check(j != w.end());
+			this->_VD.dot (*j, v, *i);
+		}
+
+		return w;
+	}
+
+	template<class Field>
+	template <class Vector1, class Matrix_, class Vector2>
+	Vector1 &MatrixDomain<Field>::mulRowSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+							 VectorCategories::SparseSequenceVectorTag) const
+	{
+		typename Matrix_::ConstRowIterator i = A.rowBegin ();
+		typename Field::Element t;
+		unsigned int idx = 0;
+
+		w.clear ();
+
+		for (; i != A.rowEnd (); ++i, ++idx) {
+			_VD.dot (t, v, *i);
+
+			if (!field().isZero (t))
+				w.push_back (std::pair<size_t, typename Field::Element> (idx, t));
+		}
+
+		return w;
+	}
+
+	template<class Field>
+	template <class Vector1, class Matrix_, class Vector2>
+	Vector1 &MatrixDomain<Field>::mulRowSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+							 VectorCategories::SparseAssociativeVectorTag) const
+	{
+		typename Matrix_::ConstRowIterator i = A.rowBegin ();
+		typename Field::Element t;
+		unsigned int idx = 0;
+
+		w.clear ();
+
+		for (; i != A.rowEnd (); ++i, ++idx) {
+			_VD.dot (t, v, *i);
+
+			if (!field().isZero (t))
+				w[idx] = t;
+		}
+
+		return w;
+	}
+
+	template<class Field>
+	template <class Vector1, class Matrix_, class Vector2>
+	Vector1 &MatrixDomain<Field>::mulRowSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+							 VectorCategories::SparseParallelVectorTag) const
+	{
+		typename Matrix_::ConstRowIterator i = A.rowBegin ();
+		typename Field::Element t;
+		unsigned int idx = 0;
+
+		w.first.clear ();
+		w.second.clear ();
+
+		for (; i != A.rowEnd (); ++i, ++idx) {
+			_VD.dot (t, v, *i);
+
+			if (!field().isZero (t)) {
+				w.first.push_back (idx);
+				w.second.push_back (t);
+			}
+		}
+
+		return w;
+	}
+
+	template<class Field>
+	template <class Vector1, class Matrix_, class Vector2>
+	Vector1 &MVProductDomain<Field>::mulColDense
+	(const VectorDomain<Field> &VD, Vector1 &w, const Matrix_ &A, const Vector2 &v) const
+	{
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix_::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j = v.begin ();
+
+		VD.subin (w, w);
+
+		for (; j != v.end (); ++j, ++i)
+			VD.axpyin (w, *j, *i);
+
+		return w;
+	}
+
+	template<class Field>
+	template <class Vector1, class Matrix_, class Vector2>
+	Vector1 &MatrixDomain<Field>::mulColSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+							 VectorCategories::DenseVectorTag,
+							 VectorCategories::SparseSequenceVectorTag) const
+	{
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Vector2::const_iterator j = v.begin ();
+
+		_VD.subin (w, w);
+
+		for (; j != v.end (); ++j) {
+			typename Matrix_::ConstColIterator i = A.colBegin () + j->first;
+			_VD.axpyin (w, j->second, *i);
+		}
+
+		return w;
+	}
+
+	template<class Field>
+	template <class Vector1, class Matrix_, class Vector2>
+	Vector1 &MatrixDomain<Field>::mulColSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+							 VectorCategories::DenseVectorTag,
+							 VectorCategories::SparseAssociativeVectorTag) const
+	{
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Vector2::const_iterator j = v.begin ();
+
+		_VD.subin (w, w);
+
+		for (; j != v.end (); ++j) {
+			typename Matrix_::ConstColIterator i = A.colBegin () + j->first;
+			_VD.axpyin (w, j->second, *i);
+		}
+
+		return w;
+	}
+
+	template<class Field>
+	template <class Vector1, class Matrix_, class Vector2>
+	Vector1 &MatrixDomain<Field>::mulColSpecialized (Vector1 &w, const Matrix_ &A, const Vector2 &v,
+							 VectorCategories::DenseVectorTag,
+							 VectorCategories::SparseParallelVectorTag) const
+	{
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Vector2::first_type::const_iterator j_idx = v.first.begin ();
+		typename Vector2::second_type::const_iterator j_elt = v.second.begin ();
+
+		_VD.subin (w, w);
+
+		for (; j_idx != v.first.end (); ++j_idx, ++j_elt) {
+			typename Matrix_::ConstColIterator i = A.colBegin () + (ptrdiff_t)*j_idx;
+			_VD.axpyin (w, *j_elt, *i);
+		}
+
+		return w;
+	}
+
+	template<class Field>
+	template <class Vector1, class Matrix_, class Vector2>
+	Vector1 &MatrixDomain<Field>::axpyinRowSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+							    VectorCategories::DenseVectorTag) const
+	{
+		linbox_check (A.coldim () == x.size ());
+		linbox_check (A.rowdim () == y.size ());
+
+		typename Matrix_::ConstRowIterator i = A.rowBegin ();
+		typename Vector1::iterator j = y.begin ();
+
+		typename Field::Element t;
+
+		for (; j != y.end (); ++j, ++i) {
+			_VD.dot (t, x, *i);
+			field().addin (*j, t);
+		}
+
+		return y;
+	}
+
+	template<class Field>
+	template <class Vector1, class Matrix_, class Vector2>
+	Vector1 &MatrixDomain<Field>::axpyinRowSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+							    VectorCategories::SparseSequenceVectorTag) const
+	{
+		DenseVector t1 (field(),A.coldim ()), t2 (field(),A.rowdim ());
+
+		_VD.copy (t1, x);
+		_VD.copy (t2, y);
+		axpyin (t2, A, t1);
+		_VD.copy (y, t2);
+
+		return y;
+	}
+
+	template<class Field>
+	template <class Vector1, class Matrix_, class Vector2>
+	Vector1 &MatrixDomain<Field>::axpyinRowSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+							    VectorCategories::SparseAssociativeVectorTag) const
+	{
+		DenseVector t1 (field(),A.coldim ()), t2 (field(),A.rowdim ());
+
+		_VD.copy (t1, x);
+		_VD.copy (t2, y);
+		axpyin (t2, A, t1);
+		_VD.copy (y, t2);
+
+		return y;
+	}
+
+	template<class Field>
+	template <class Vector1, class Matrix_, class Vector2>
+	Vector1 &MatrixDomain<Field>::axpyinRowSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+							    VectorCategories::SparseParallelVectorTag) const
+	{
+		DenseVector t1 (field(),A.coldim ()), t2 (field(),A.rowdim ());
+
+		_VD.copy (t1, x);
+		_VD.copy (t2, y);
+		axpyin (t2, A, t1);
+		_VD.copy (y, t2);
+
+		return y;
+	}
+
+	template<class Field>
+	template <class Vector1, class Matrix_, class Vector2>
+	Vector1 &MatrixDomain<Field>::axpyinColSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+							    VectorCategories::DenseVectorTag) const
+	{
+		linbox_check (A.coldim () == x.size ());
+		linbox_check (A.rowdim () == y.size ());
+
+		typename Matrix_::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j = x.begin ();
+
+		for (; j != x.end (); ++j, ++i)
+			_VD.axpyin (y, *j, *i);
+
+		return y;
+	}
+
+	template<class Field>
+	template <class Vector1, class Matrix_, class Vector2>
+	Vector1 &MatrixDomain<Field>::axpyinColSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+							    VectorCategories::SparseSequenceVectorTag) const
+	{
+		typename Matrix_::ConstColIterator i = A.colBegin ();
+		typename Vector2::iterator j = x.begin ();
+
+
+		DenseVector t (field(),A.rowdim ());
+
+		_VD.copy (t, y);
+
+		while (j != x.end ()) {
+			int diff;
+			_VD.axpyin (t, j->second, *i);
+			diff = j->first; ++j;
+			diff -= j->first;
+			i -= diff;
+		}
+
+		_VD.copy (y, t);
+
+		return y;
+	}
+
+	template<class Field>
+	template <class Vector1, class Matrix_, class Vector2>
+	Vector1 &MatrixDomain<Field>::axpyinColSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+							    VectorCategories::SparseAssociativeVectorTag) const
+	{
+		typename Matrix_::ConstColIterator i = A.colBegin ();
+		typename Vector2::iterator j = x.begin ();
+
+
+		DenseVector t (field(),A.rowdim ());
+
+		_VD.copy (t, y);
+
+		while (j != x.end ()) {
+			int diff;
+			_VD.axpyin (t, j->second, *i);
+			diff = j->first; ++j;
+			diff -= j->first;
+			i -= diff;
+		}
+
+		_VD.copy (y, t);
+
+		return y;
+	}
+
+	template<class Field>
+	template <class Vector1, class Matrix_, class Vector2>
+	Vector1 &MatrixDomain<Field>::axpyinColSpecialized (Vector1 &y, const Matrix_ &A, const Vector2 &x,
+							    VectorCategories::SparseParallelVectorTag) const
+	{
+		typename Matrix_::ConstColIterator i = A.colBegin ();
+		typename Vector2::iterator j_idx = x.first.begin ();
+		typename Vector2::iterator j_elt = x.second.begin ();
+
+
+		DenseVector t (field(),A.rowdim ());
+
+		_VD.copy (t, y);
+
+		for (; j_idx != x.first.end (); ++j_elt) {
+			int diff;
+			_VD.axpyin (t, *j_elt, *i);
+			diff = *j_idx; ++j_idx;
+			diff -= *j_idx;
+			i -= diff;
+		}
+
+		_VD.copy (y, t);
+
+		return y;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Blackbox, class Matrix2>
+	Matrix1 &MatrixDomain<Field>::blackboxMulLeft (Matrix1 &C, const Blackbox &A, const Matrix2 &B) const
+	{
+		linbox_check (A.coldim () == B.rowdim ());
+		linbox_check (A.rowdim () == C.rowdim ());
+		linbox_check (B.coldim () == C.coldim ());
+
+		typename Matrix1::ColIterator i = C.colBegin ();
+		typename Matrix2::ConstColIterator j = B.colBegin ();
+
+		for (; i != C.colEnd (); ++i, ++j)
+			A.apply (*i, *j);
+
+		return C;
+	}
+
+	template<class Field>
+	template <class Matrix1, class Matrix2, class Blackbox>
+	Matrix1 &MatrixDomain<Field>::blackboxMulRight (Matrix1 &C, const Matrix2 &A, const Blackbox &B) const
+	{
+		linbox_check (A.coldim () == B.rowdim ());
+		linbox_check (A.rowdim () == C.rowdim ());
+		linbox_check (B.coldim () == C.coldim ());
+
+		typename Matrix1::RowIterator i = C.rowBegin ();
+		typename Matrix2::ConstRowIterator j = A.rowBegin ();
+
+		for (; i != C.rowEnd (); ++i, ++j)
+			B.applyTranspose (*i, *j);
+
+		return C;
+	}
+
+	template<class Field>
+	template <class Matrix_, class Iterator>
+	Matrix_ &MatrixDomain<Field>::permuteRowsByRow (Matrix_   &A,
+						       Iterator  P_start,
+						       Iterator  P_end) const
+	{
+		Iterator i;
+		typename Matrix_::RowIterator j, k;
+
+		for (i = P_start; i != P_end; ++i) {
+			j = A.rowBegin () + i->first;
+			k = A.rowBegin () + i->second;
+
+			_VD.swap (*j, *k);
+		}
+
+		return A;
+	}
+
+	template<class Field>
+	template <class Matrix_, class Iterator>
+	Matrix_ &MatrixDomain<Field>::permuteRowsByCol (Matrix_   &A,
+						       Iterator  P_start,
+						       Iterator  P_end) const
+	{
+		typename Matrix_::ColIterator j;
+
+		for (j = A.colBegin (); j != A.colEnd (); ++j)
+			_VD.permute (*j, P_start, P_end);
+
+		return A;
+	}
+
+	template<class Field>
+	template <class Matrix_, class Iterator>
+	Matrix_ &MatrixDomain<Field>::permuteColsByRow (Matrix_   &A,
+						       Iterator  P_start,
+						       Iterator  P_end) const
+	{
+		typename Matrix_::RowIterator j;
+
+		for (j = A.rowBegin (); j != A.rowEnd (); ++j)
+			_VD.permute (*j, P_start, P_end);
+
+		return A;
+	}
+
+	template<class Field>
+	template <class Matrix_, class Iterator>
+	Matrix_ &MatrixDomain<Field>::permuteColsByCol (Matrix_   &A,
+						       Iterator  P_start,
+						       Iterator  P_end) const
+	{
+		Iterator i;
+		typename Matrix_::ColIterator j, k;
+
+		for (i = P_start; i != P_end; ++i) {
+			j = A.colBegin () + i->first;
+			k = A.colBegin () + i->second;
+
+			_VD.swap (*j, *k);
+		}
+
+		return A;
+	}
+
+	/* FIXME: These methods are undocumented, and I'm unclear what they are supposed
+	 * to do
+	 */
+
+#if 0
+
+	/*M1<-M2**k;
+	*/
+	template<class Matrix1, class Matrix2>
+	Matrix1& MatrixDomain::pow_apply(Matrix1& M1, const Matrix2& M2, unsigned long int k) const
+	{
+		linbox_check((M1.rowdim()==M1.coldim())&&
+			     (M2.rowdim()==M2.coldim())&&
+			     (M1.rowdim()==M2.rowdim()));
+
+
+		typename Matrix1::Iterator p=M1.Begin();
+		for(;p!=M1.End();++p)
+			M1.field().assign(*p,M1.field().zero);
+		for(p=M1.Begin();p<M1.End();)
+		{
+			M1.field().assign(*p,M1.field().one);
+			p=p+M1.rowdim()+1;
+		}
+
+
+		for(int i=0;i<k;++i)
+			mulin_R(M1,M2);
+
+		return M1;
+	}
+
+
+	template<class Matrix1, class Matrix2>
+	Matrix1& MatrixDomain::pow_horn(Matrix1& M1, const Matrix2& M2, unsigned long int k) const
+	{
+		linbox_check((M1.rowdim()==M1.coldim())&&
+			     (M2.rowdim()==M2.coldim())&&
+			     (M1.rowdim()==M2.rowdim()));
+
+		if(k==0)
+		{
+			typename Matrix1::Iterator p=M1.Begin();
+			for(;p!=M1.End();++p)
+				M1.field().assign(*p,M1.field().zero);
+			for(p=M1.Begin();p<M1.End();)
+			{
+				M1.field().assign(*p,M1.field().one);
+				p+=M1.rowdim()+1;
+			}
+			return M1;
+		}
+
+		typename Matrix1::Iterator p1;
+		typename Matrix2::ConstIterator p2;
+		for(p1=M1.Begin(),p2=M2.Begin();p1!=M1.End();++p1,++p2)
+			M1.field().assign(*p1,*p2);
+
+		std::vector<bool> bit;
+		bit.reserve(sizeof(unsigned long)*4);
+		while(k>0)
+		{
+			bit.push_back(k%2);
+			k/=2;
+		};
+
+
+		std::vector<bool>::reverse_iterator p=bit.rbegin();
+		++p;
+		Matrix1 temp(M1);
+		for(;p!=bit.rend();++p)
+		{
+			temp=M1;
+			mulin_L(M1,temp);
+			if(*p)
+				mulin_L(M1,M2);
+
+		}
+
+		return M1;
+	}
+
+#endif
+
+} // namespace LinBox
+
+#endif // __LINBOX_matrix_domain_INL
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/matrixdomain/opencl-domain-factory.h b/linbox/matrix/matrixdomain/opencl-domain-factory.h
new file mode 100644
index 0000000..9d2a9b2
--- /dev/null
+++ b/linbox/matrix/matrixdomain/opencl-domain-factory.h
@@ -0,0 +1,750 @@
+/*
+ * Copyright (C) 2011-2012 Matthew Wezowicz
+ *
+ * Written by Matthew Wezowicz <mwezz at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+
+/** @file linbox/matrix/MatrixDoamin/opencl-domain-factory.h
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_opencl_matrix_domain_factory_H
+#define __LINBOX_opencl_matrix_domain_factory_H
+
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <pthread.h>
+
+#include <vector>
+
+#include <CL/cl.h>
+
+#include "linbox/matrix/matrixdomain/opencl-domain.h"
+
+#include "linbox/algorithms/opencl-environ.h"
+#include "linbox/algorithms/opencl-resource-controller.h"
+#include "linbox/algorithms/opencl-kernels/opencl-domain-kernels.inl"
+
+
+#define NUM_KERNELS 20
+
+namespace LinBox{
+
+	const char* dpKernelSources[] = {
+			matrixMulKernelModular1DP, matrixMulKernelModular8DP,
+			matrixMulKernelModular32DP, matrixMulKernelModular1024DP,
+			matrixMuladdKernelModular1DP, matrixMuladdKernelModular8DP,
+			matrixMuladdKernelModular32DP, matrixMuladdKernelModular1024DP,
+			matrixAxpyKernelModular1DP, matrixAxpyKernelModular8DP,
+			matrixAxpyKernelModular32DP, matrixAxpyKernelModular1024DP,
+			matrixMaxpyKernelModular1DP, matrixMaxpyKernelModular8DP,
+			matrixMaxpyKernelModular32DP, matrixMaxpyKernelModular1024DP,
+			matrixAxmyKernelModular1DP, matrixAxmyKernelModular8DP,
+			matrixAxmyKernelModular32DP, matrixAxmyKernelModular1024DP};
+
+		const char* dpKernelNames[] = {
+			"matrixMulKernelModular1DP", "matrixMulKernelModular8DP",
+			"matrixMulKernelModular32DP", "matrixMulKernelModular1024DP",
+			"matrixMuladdKernelModular1DP", "matrixMuladdKernelModular8DP",
+			"matrixMuladdKernelModular32DP", "matrixMuladdKernelModular1024DP",
+			"matrixAxpyKernelModular1DP", "matrixAxpyKernelModular8DP",
+			"matrixAxpyKernelModular32DP", "matrixAxpyKernelModular1024DP",
+			"matrixMaxpyKernelModular1DP", "matrixMaxpyKernelModular8DP",
+			"matrixMaxpyKernelModular32DP", "matrixMaxpyKernelModular1024DP",
+			"matrixAxmyKernelModular1DP", "matrixAxmyKernelModular8DP",
+			"matrixAxmyKernelModular32DP", "matrixAxmyKernelModular1024DP"};
+
+		const char* spKernelSources[] = {
+			matrixMulKernelModular1SP, matrixMulKernelModular16SP,
+			matrixMulKernelModular32SP, matrixMulKernelModular1024SP,
+			matrixMuladdKernelModular1SP, matrixMuladdKernelModular16SP,
+			matrixMuladdKernelModular32SP, matrixMuladdKernelModular1024SP,
+			matrixAxpyKernelModular1SP, matrixAxpyKernelModular16SP,
+			matrixAxpyKernelModular32SP, matrixAxpyKernelModular1024SP,
+			matrixMaxpyKernelModular1SP, matrixMaxpyKernelModular16SP,
+			matrixMaxpyKernelModular32SP, matrixMaxpyKernelModular1024SP,
+			matrixAxmyKernelModular1SP, matrixAxmyKernelModular16SP,
+			matrixAxmyKernelModular32SP, matrixAxmyKernelModular1024SP};
+
+		const char* spKernelNames[] = {
+			"matrixMulKernelModular1SP", "matrixMulKernelModular16SP",
+			"matrixMulKernelModular32SP", "matrixMulKernelModular1024SP",
+			"matrixMuladdKernelModular1SP", "matrixMuladdKernelModular16SP",
+			"matrixMuladdKernelModular32SP", "matrixMuladdKernelModular1024SP",
+			"matrixAxpyKernelModular1SP", "matrixAxpyKernelModular16SP",
+			"matrixAxpyKernelModular32SP", "matrixAxpyKernelModular1024SP",
+			"matrixMaxpyKernelModular1SP", "matrixMaxpyKernelModular16SP",
+			"matrixMaxpyKernelModular32SP", "matrixMaxpyKernelModular1024SP",
+			"matrixAxmyKernelModular1SP", "matrixAxmyKernelModular16SP",
+			"matrixAxmyKernelModular32SP", "matrixAxmyKernelModular1024SP"};
+
+	class OpenCLMatrixDomainFactory{
+
+	protected:
+		/*--- This class is a Singleton ---*/
+		//No one can construct the class
+		OpenCLMatrixDomainFactory();
+		//No one can copy the class
+		OpenCLMatrixDomainFactory(const OpenCLMatrixDomainFactory&);
+		//No one can assign the class
+		OpenCLMatrixDomainFactory& operator=(const OpenCLMatrixDomainFactory&);
+		//No one can destroy the class
+		~OpenCLMatrixDomainFactory();
+
+		struct oclEnviron{
+			//OpenCL specific variables
+			cl_context context;
+			cl_device_id device;
+			cl_command_queue commandQue;
+			cl_int errcode;
+
+			//Storage for memory levels
+			unsigned long memCapacity;
+			unsigned long maxBufferSize;
+
+			//Type and status flags
+			bool GPUcontainer;
+			bool CPUcontainer;
+			bool setupCorrect;
+			bool doubleSupported;
+
+			//Storage for kernels
+			cl_kernel* dpKernels;
+			bool* dpKernelsAvailable;
+			cl_kernel* spKernels;
+			bool* spKernelsAvailable;
+
+			//Mutex
+			pthread_mutex_t* deviceLock;
+		};
+
+		public:
+		typedef struct oclEnviron oclEnviron;
+
+		protected:
+
+		//Storage for all OpenCL evironments created by the factory
+		static std::vector<oclEnviron>* environs;
+		static std::vector<int>* instances;
+
+		//Initialization flag
+		static bool initialized;
+
+		//Storage for the error code
+		static cl_int errcode;
+
+		//Factory mutex
+		static pthread_mutex_t factoryLock;
+
+		/**
+		 * @internal
+		 * Picks the platform used
+		 */
+		static cl_int oclGetPlatformID(cl_platform_id& selectedPlatform){
+			//Allocate temporary char array for platform name
+			char chBuffer[256];
+			cl_uint numPlatforms;
+			cl_platform_id* platforms;
+			selectedPlatform = NULL;
+
+			//Get OpenCL platform count
+			//return custom error codes if there are no platforms
+			//or could not get number of platforms
+			errcode = clGetPlatformIDs(0, NULL, &numPlatforms);
+			if(errcode != CL_SUCCESS){
+				return -1000;
+			}
+			if(numPlatforms == 0){
+				return -2000;
+			}
+
+			//Allocate space to store cl_platform_id's
+			platforms = (cl_platform_id*)malloc(numPlatforms * sizeof(cl_platform_id));
+			errcode = clGetPlatformIDs(numPlatforms, platforms, NULL);
+
+			//Search through the platforms looking for a prefered one specified by a
+			//string
+			for(int i = 0; i < (int)numPlatforms; i++){
+				errcode = clGetPlatformInfo(
+					platforms[i],
+					CL_PLATFORM_NAME,
+					256,
+					(void*)chBuffer,
+					NULL);
+
+				if(errcode == CL_SUCCESS && !(strcmp(chBuffer,"NVIDIA CUDA"))){
+					selectedPlatform = platforms[i];
+					break;
+				}
+			}
+
+			//If prefered platform could not be found use first platform
+			if(selectedPlatform == NULL){
+				selectedPlatform = platforms[0];
+			}
+
+			//Clean up memory
+			free(platforms);
+
+			return CL_SUCCESS;
+		}
+
+		/**
+		 * @internal
+		 * Computes a score for all devices
+		 */
+		static std::vector<long> oclComputeDeviceScores(
+			cl_device_id* devices,
+			cl_uint numDevices){
+
+			std::vector<long> ret;
+
+			//For all devices, query information about them and compute a score
+			for(int i = 0; i < (int)numDevices; i++){
+
+				cl_device_type type;
+				errcode = clGetDeviceInfo(
+					devices[i],
+					CL_DEVICE_TYPE,
+					sizeof(cl_device_type),
+					&type,
+					NULL);
+
+				bool GPU = (type == CL_DEVICE_TYPE_GPU);
+
+				cl_uint computeUnits;
+				errcode = clGetDeviceInfo(
+					devices[i],
+					CL_DEVICE_MAX_COMPUTE_UNITS,
+					sizeof(cl_uint),
+					&computeUnits,
+					NULL);
+
+				cl_uint clockFrequency;
+				errcode = clGetDeviceInfo(
+					devices[i],
+					CL_DEVICE_MAX_CLOCK_FREQUENCY,
+					sizeof(cl_uint),
+					&clockFrequency,
+					NULL);
+
+				cl_ulong maxGlobalMemoryAllocSize;
+				errcode = clGetDeviceInfo(
+					devices[i],
+					CL_DEVICE_MAX_MEM_ALLOC_SIZE,
+					sizeof(cl_ulong),
+					&maxGlobalMemoryAllocSize,
+					NULL);
+
+				cl_ulong globalMemory;
+				errcode = clGetDeviceInfo(
+					devices[i],
+					CL_DEVICE_GLOBAL_MEM_SIZE,
+					sizeof(cl_ulong),
+					&globalMemory,
+					NULL);
+
+				long score = (computeUnits * clockFrequency);
+				score *= (GPU ? 8 : 1);
+				score += (maxGlobalMemoryAllocSize / (1024 * 1024));
+				score += (globalMemory / (1024 * 1024));
+
+				ret.push_back(score);
+			}
+
+			return ret;
+		}
+
+		/**
+		 * @internal
+		 * Creates a kernel given a file name and kernel name
+		 * Returns the kernel
+		 */
+		static cl_kernel oclCreateKernel(
+			const char* kernel,
+			const char* kernelName,
+			cl_context& context){
+
+			//find length of the kernel
+			size_t kernelLength = strlen(kernel);
+
+			//Create program from file
+			cl_program program = clCreateProgramWithSource(
+				context,
+				1,
+				(const char**)&kernel,
+				&kernelLength,
+				&errcode);
+
+			//Build the program into executable
+			if(errcode == CL_SUCCESS){
+				const char* options = {"-cl-mad-enable -cl-no-signed-zeros "
+				                       "-cl-finite-math-only\0"};
+				errcode = clBuildProgram(program, 0, NULL, options, NULL, NULL);
+			}
+
+			//Create kernel from executable
+			cl_kernel tempKernel = NULL;
+			if(errcode == CL_SUCCESS){
+				tempKernel = clCreateKernel(program, kernelName, &errcode);
+			}
+
+			//Releasing program
+			clReleaseProgram(program);
+
+			//Return kernel
+			return tempKernel;
+		}
+
+		/**
+		 * @internal
+		 * Builds a single oclEnviron
+		 */
+		static oclEnviron& oclBuildEnviron(
+			oclEnviron& environ,
+			cl_platform_id& platform,
+			cl_device_id& device){
+
+			//Create OpenCL context
+			cl_context_properties properties[3] = {CL_CONTEXT_PLATFORM,
+			                                       (cl_context_properties)platform,
+			                                       0};
+			environ.context = clCreateContext(
+				properties,
+				1,
+				&device,
+				NULL,
+				NULL,
+				&errcode);
+
+			//Assign device to environ
+			environ.device = device;
+
+			//Create OpenCL command queue
+			environ.commandQue = clCreateCommandQueue(
+				environ.context,
+				device,
+				0,
+				&errcode);
+
+			//Get amount of memory that the device has
+			errcode = clGetDeviceInfo(
+				device,
+				CL_DEVICE_GLOBAL_MEM_SIZE,
+				sizeof(cl_ulong),
+				&(environ.memCapacity),
+				NULL);
+			errcode = clGetDeviceInfo(
+				device,
+				CL_DEVICE_MAX_MEM_ALLOC_SIZE,
+				sizeof(cl_ulong),
+				&(environ.maxBufferSize),
+				NULL);
+
+			//Get the device type for the selected device
+			cl_device_type type;
+			errcode = clGetDeviceInfo(
+				device,
+				CL_DEVICE_TYPE,
+				sizeof(cl_device_type),
+				&type,
+				NULL);
+
+			//Set container type
+			environ.GPUcontainer = (type == CL_DEVICE_TYPE_GPU);
+			environ.CPUcontainer = (type == CL_DEVICE_TYPE_CPU);
+
+
+			//Determine double precision support for device by getting a
+			//listing of all OpenCL device extensions supported by the device
+			//and searching through them for the string "cl_khr_fp64"
+			environ.doubleSupported = false;
+
+			size_t sizeReturn;
+
+			errcode = clGetDeviceInfo(
+				device,
+				CL_DEVICE_EXTENSIONS,
+				0,
+				NULL,
+				&sizeReturn);
+			char* deviceExtensions = (char*)malloc(sizeReturn);
+			errcode = clGetDeviceInfo(
+				device,
+				CL_DEVICE_EXTENSIONS,
+				sizeReturn,
+				deviceExtensions,
+				NULL);
+
+			char* exten[200];
+
+			exten[0] = strtok(deviceExtensions, " ");
+
+			if(exten[0] != NULL){
+				for(int i = 1; i < 200; i++){
+					exten[i] = strtok(NULL, " ");
+					if(exten[i] == NULL){
+						break;
+					}
+				}
+
+				for(int i = 0; i < 200; i++){
+					if(exten[i] == NULL){
+						break;
+					}
+					if(!strcmp(exten[i], "cl_khr_fp64")){
+						environ.doubleSupported = true;
+					}
+				}
+			}
+
+			free(deviceExtensions);
+
+			//Copy current errcode to environ as starting errcode
+			environ.errcode = errcode;
+			if(environ.errcode != CL_SUCCESS){
+				environ.setupCorrect = false;
+			}
+			else{
+				environ.setupCorrect = true;
+			}
+
+			//Allocate memory for kernels and kernel flags
+			environ.dpKernels = (cl_kernel*)malloc(NUM_KERNELS * sizeof(cl_kernel));
+			environ.spKernels = (cl_kernel*)malloc(NUM_KERNELS * sizeof(cl_kernel));
+			environ.dpKernelsAvailable = (bool*)malloc(NUM_KERNELS * sizeof(bool));
+			environ.spKernelsAvailable = (bool*)malloc(NUM_KERNELS * sizeof(bool));
+
+			//Set kernel flags to default false
+			for(int i = 0; i < NUM_KERNELS; i++){
+				environ.dpKernelsAvailable[i] = false;
+				environ.spKernelsAvailable[i] = false;
+			}
+
+			//Compile all of the kernels
+			if(errcode == CL_SUCCESS){
+				for(int i = 0; i < NUM_KERNELS; i++){
+					environ.dpKernels[i] = oclCreateKernel(
+						dpKernelSources[i],
+						dpKernelNames[i],
+						environ.context);
+					if(errcode == CL_SUCCESS){environ.dpKernelsAvailable[i] = true;}
+				}
+
+				for(int i = 0; i < NUM_KERNELS; i++){
+					environ.spKernels[i] = oclCreateKernel(
+						spKernelSources[i],
+						spKernelNames[i],
+						environ.context);
+					if(errcode == CL_SUCCESS){environ.spKernelsAvailable[i] = true;}
+				}
+			}
+
+			//Allocate and initialize the device mutex
+			environ.deviceLock = (pthread_mutex_t*)malloc(sizeof(pthread_mutex_t));
+			pthread_mutex_init(environ.deviceLock, NULL);
+
+			return environ;
+		}
+
+		/**
+		 * @internal
+		 * Builds the vector of oclEnvirons
+		 */
+		static std::vector<oclEnviron>* oclGetEnvirons(
+			std::vector<oclEnviron>* myenvirons,
+			cl_platform_id& platform,
+			cl_device_id* devices,
+			cl_uint numDevices){
+
+			//Compute a score for all devices
+			std::vector<long> rankings = oclComputeDeviceScores(devices, numDevices);
+
+			//Find the max score and calculate a lower bound for device selection
+			long maxScore = *(std::max_element(rankings.begin(), rankings.end()));
+			long lowerBound = (long)((double)maxScore * 0.90);
+
+			//Build OpenCL compute environments only for devices within 10% of
+			//the top device. This should keep run times for identical computations
+			//relatively similar across different intstances of OpenCLMatrixDomain
+			//and eliminate the primary graphics adapter if there is one.
+			for(int i = 0; i < (int)numDevices; i++){
+				if(rankings.at((size_t)i) < lowerBound){
+					continue;
+				}
+
+				oclEnviron temp;
+
+				temp = oclBuildEnviron(temp, platform, devices[i]);
+
+				myenvirons->push_back(temp);
+			}
+
+			return myenvirons;
+		}
+
+		/**
+		 * @internal
+		 * Initializes the OpenCL compute environment
+		 */
+		static void oclEnvironInit(){
+			//Declare OpenCL specific variables
+			cl_platform_id platform;
+			cl_uint numDevices = 0;
+			cl_device_id* devices;
+
+			//Get the platform to be used
+			errcode = oclGetPlatformID(platform);
+
+			//Proceed only if successful with previous phase
+			if(errcode == CL_SUCCESS){
+				//Get number of GPU's in the platform
+				errcode = clGetDeviceIDs(
+					platform,
+					CL_DEVICE_TYPE_GPU,
+					0,
+					NULL,
+					&numDevices);
+			}
+
+			//Allocate the oclEnviron and instance count arrays
+			environs = new std::vector<oclEnviron>();
+			instances = new std::vector<int>();
+
+			//Proceed only if successful with previous phase
+			if(errcode == CL_SUCCESS && numDevices != 0){
+				//Allocate memory for device array and read the devices into it
+				devices = (cl_device_id*)malloc(numDevices * sizeof(cl_device_id));
+				errcode = clGetDeviceIDs(
+					platform,
+					CL_DEVICE_TYPE_GPU,
+					numDevices,
+					devices,
+					NULL);
+
+				//Build environs from devices
+				environs = oclGetEnvirons(environs, platform, devices, numDevices);
+
+				//Set intial instance count to zero
+				for(int i = 0; i < (int)environs->size(); i++){
+					instances->push_back(0);
+				}
+
+				free(devices);
+			}
+			//If there are no devices or if an error occured make a default
+			//oclEnviron that disables the OpenCLMatrixDomain and defaults it
+			//to BlasMatrixDomain methods.
+			else{
+				oclEnviron temp;
+
+				temp.context = NULL;
+				temp.device = NULL;
+				temp.commandQue = NULL;
+				temp.errcode = CL_INVALID_PLATFORM;
+				temp.memCapacity = 0UL;
+				temp.maxBufferSize = 0UL;
+				temp.GPUcontainer = false;
+				temp.CPUcontainer = false;
+				temp.setupCorrect = false;
+				temp.doubleSupported = false;
+
+				temp.dpKernels = (cl_kernel*)malloc(NUM_KERNELS * sizeof(cl_kernel));
+				temp.spKernels = (cl_kernel*)malloc(NUM_KERNELS * sizeof(cl_kernel));
+				temp.dpKernelsAvailable = (bool*)malloc(NUM_KERNELS * sizeof(bool));
+				temp.spKernelsAvailable = (bool*)malloc(NUM_KERNELS * sizeof(bool));
+
+				for(int i = 0; i < NUM_KERNELS; i++){
+					temp.dpKernels[i] = NULL;
+					temp.spKernels[i] = NULL;
+					temp.dpKernelsAvailable[i] = false;
+					temp.spKernelsAvailable[i] = false;
+				}
+
+				temp.deviceLock = NULL;
+
+				environs->push_back(temp);
+				instances->push_back(0);
+			}
+
+		}
+
+		/**
+		 * @internal
+		 * Handles the releasing of resources at program exit
+		 */
+		static void oclResourceCleanUp(){
+			//Release all reources held in each oclEnviron
+			for(int i = 0; i < (int)environs->size(); i++){
+				oclEnviron current = environs->at((size_t)i);
+
+				//Release the kernels
+				for(int j = 0; j < NUM_KERNELS; j++){
+					errcode = clReleaseKernel(current.dpKernels[j]);
+					errcode = clReleaseKernel(current.spKernels[j]);
+				}
+
+				//Deallocate the array memory
+				free(current.dpKernels);
+				free(current.spKernels);
+				free(current.dpKernelsAvailable);
+				free(current.spKernelsAvailable);
+
+				//Destroy mutex and deallocate memory
+				if (current.deviceLock != NULL) {
+					pthread_mutex_destroy(current.deviceLock);
+					free(current.deviceLock);
+				}
+
+				//Release the command queue and context
+				errcode = clReleaseCommandQueue(current.commandQue);
+				errcode = clReleaseContext(current.context);
+			}
+
+
+			//Delete vectors
+			delete instances;
+			delete environs;
+
+			//Destroy factory mutex
+			pthread_mutex_destroy(&factoryLock);
+
+			//Set state to unitialized incase exit is aborted
+			initialized = false;
+		}
+
+	public:
+		template <class Field>
+		static void oclMatrixDomainInstance(OpenCLMatrixDomain<Field>* target){
+
+			//Check if the OpenCL environment has been initialized
+			//It will only need to be initialized when the first OpenCLMatrixDomain
+			//instance is created. Double check locking ensures Singleton
+			if(!initialized){
+				pthread_mutex_lock(&factoryLock);
+
+				if(!initialized){
+					oclEnvironInit();
+					initialized = true;
+					atexit(oclResourceCleanUp);
+				}
+
+				pthread_mutex_unlock(&factoryLock);
+			}
+
+			pthread_mutex_lock(&factoryLock);
+
+			//Selected least used oclEnviron
+			int leastUsedIndex = 0;
+			for(int i = 0; i < (int)instances->size(); i++){
+				if(instances->at((size_t)i) < instances->at((size_t)leastUsedIndex)){
+					leastUsedIndex = i;
+				}
+			}
+
+			//Increment use count
+			(instances->at((size_t)leastUsedIndex))++;
+
+			//Copy all of the data required for the OpenCLMatrixDomain instance to
+			//function
+			target->context = environs->at((size_t)leastUsedIndex).context;
+			target->device = environs->at((size_t)leastUsedIndex).device;
+			target->commandQue = environs->at((size_t)leastUsedIndex).commandQue;
+			target->errcode = environs->at((size_t)leastUsedIndex).errcode;
+
+			target->memCapacity = environs->at((size_t)leastUsedIndex).memCapacity;
+			target->maxBufferSize = environs->at((size_t)leastUsedIndex).maxBufferSize;
+
+			target->GPUcontainer = environs->at((size_t)leastUsedIndex).GPUcontainer;
+			target->CPUcontainer = environs->at((size_t)leastUsedIndex).CPUcontainer;
+			target->setupCorrect = environs->at((size_t)leastUsedIndex).setupCorrect;
+			target->doubleSupported = environs->at((size_t)leastUsedIndex).doubleSupported;
+
+			for(int i = 0; i < 20; i++){
+				target->dpKernels[i] = environs->at((size_t)leastUsedIndex).dpKernels[i];
+				target->spKernels[i] = environs->at((size_t)leastUsedIndex).spKernels[i];
+
+				target->dpKernelsAvailable[i] =
+					environs->at((size_t)leastUsedIndex).dpKernelsAvailable[i];
+				target->spKernelsAvailable[i] =
+					environs->at((size_t)leastUsedIndex).spKernelsAvailable[i];
+			}
+
+			//Assign an ID number the OpenCLMatrixDomain instance to be used for
+			//locking and releasing the OpenCL resources
+			target->IDnum = (unsigned int)leastUsedIndex;
+
+			//Point OpenCLMatrixDomain to the mutex
+			target->deviceLock = environs->at((size_t)leastUsedIndex).deviceLock;
+
+			pthread_mutex_unlock(&factoryLock);
+		}
+
+		static void oclMatrixDomainDeallocate(unsigned int IDnum){
+			pthread_mutex_lock(&factoryLock);
+
+			(instances->at(IDnum))--;
+
+			pthread_mutex_unlock(&factoryLock);
+		}
+
+		static int oclGetNumberOfDevices(){
+
+			//Check if the OpenCL environment has been initialized
+			//It will only need to be initialized when the first OpenCLMatrixDomain
+			//instance is created. Double check locking ensures Singleton
+			if(!initialized){
+				pthread_mutex_lock(&factoryLock);
+
+				if(!initialized){
+					oclEnvironInit();
+					initialized = true;
+					atexit(oclResourceCleanUp);
+				}
+
+				pthread_mutex_unlock(&factoryLock);
+			}
+
+			return (int) environs->size();
+
+		}
+	};
+
+	//Static data fields used by OpenCLMatrixDomainFactory
+	std::vector<OpenCLMatrixDomainFactory::oclEnviron>* OpenCLMatrixDomainFactory::environs = NULL;
+	std::vector<int>* OpenCLMatrixDomainFactory::instances = NULL;
+	bool OpenCLMatrixDomainFactory::initialized = false;
+	cl_int OpenCLMatrixDomainFactory::errcode = CL_SUCCESS;
+	pthread_mutex_t OpenCLMatrixDomainFactory::factoryLock = PTHREAD_MUTEX_INITIALIZER;
+}
+
+#endif // __LINBOX_opencl_domain_fatory
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/matrixdomain/opencl-domain-memory.inl b/linbox/matrix/matrixdomain/opencl-domain-memory.inl
new file mode 100644
index 0000000..c52a825
--- /dev/null
+++ b/linbox/matrix/matrixdomain/opencl-domain-memory.inl
@@ -0,0 +1,333 @@
+/*
+ * Copyright (C) 2011-2012 Matthew Wezowicz
+ *
+ * Written by Matthew Wezowicz <mwezz at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/** @internal
+ * @file linbox/matrix/matrixdomain/opencl-domain-setup.inl
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_opencl_matrix_domain_memory_INL
+#define __LINBOX_opencl_matrix_domain_memory_INL
+
+#include <cstdlib>
+
+#include <CL/cl.h>
+
+namespace LinBox{
+
+	/**
+	 * @internal
+	 * Pads a BlasMatrix into a form appropriate for OpenCL use
+	 * and returns the OpenCL buffer
+	 */
+	template <class Field>
+	template <typename T, class Operand1>
+	cl_mem OpenCLMatrixDomain<Field>::oclPadMatrix(
+		cl_mem matrixBuffer,
+		int matrixBufferSize,
+		int newDimX,
+		const Operand1 &matrix) const{
+
+		//Set starting positions
+		int matrixBufferPosition = 0;
+		int dataOffset = 0;
+		int elementsPadded = 0;
+
+		//Allocates a 32mb buffer for padding
+		T* paddingBuffer = (T*)malloc(32 * 1024 * 1024);
+
+		//Calculate the size of the padding buffer in number of elements
+		const int paddingBufferSize = (32 * 1024 * 1024 / (int)sizeof(T));
+
+		//Loops while there is still space in the matrixBuffer
+		while(matrixBufferPosition < matrixBufferSize){
+
+			//Sets the starting position in the buffer
+			int paddingBufferPosition = 0;
+
+			//Loops while there is still space in the buffer
+			while(paddingBufferPosition < paddingBufferSize){
+				int count = 0;
+
+				//Puts one row of data into the buffer while there is space
+				//in the buffer and data left
+				while(count < (int)matrix.coldim() &&
+				      paddingBufferPosition < paddingBufferSize &&
+				      dataOffset < (int)(matrix.coldim() * matrix.rowdim())){
+
+					//Put entry of matrix into the padding buffer
+					int row = (int) ((size_t)dataOffset / matrix.coldim());
+					int col = (int) ((size_t)dataOffset % matrix.coldim());
+					paddingBuffer[paddingBufferPosition] = matrix.getEntry((size_t)row, (size_t)col);
+
+					//Increment the count for the row, paddingBuffer, and matrix
+					count++;
+					paddingBufferPosition++;
+					dataOffset++;
+					elementsPadded++;
+				}
+
+				//Padds 0's until end of padded row while there is still space in the
+				//buffer
+				while(count < newDimX && paddingBufferPosition < paddingBufferSize){
+
+					//Place a zero into the paddingBuffer
+					paddingBuffer[paddingBufferPosition] = 0.0;
+
+					//Increment the count for the rwo and the paddingBuffer
+					count++;
+					paddingBufferPosition++;
+					elementsPadded++;
+				}
+
+				if(elementsPadded >= matrixBufferSize){
+					break;
+				}
+			}
+
+			int transferSize;
+
+			//Transfer the paddingBuffer to the matrixBuffer
+			if((matrixBufferPosition + paddingBufferSize) <= matrixBufferSize){
+				transferSize = (32 * 1024 * 1024);
+			}
+			//Transfer the partial paddingBuffer to the matrixBuffer
+			else{
+				transferSize = (int) ((size_t)(matrixBufferSize - matrixBufferPosition) * sizeof(T));
+			}
+
+			// cl_int tempErrcode;
+			// tempErrcode =
+				clEnqueueWriteBuffer(
+				commandQue,
+				matrixBuffer,
+				CL_TRUE,
+				((size_t)matrixBufferPosition * sizeof(T)),
+				(size_t)transferSize,
+				paddingBuffer,
+				0,
+				NULL,
+				NULL);
+
+			//Increment position in matrixBuffer by the size of the paddingBuffer
+			matrixBufferPosition += paddingBufferSize;
+		}
+
+		//Deallocates buffer
+		free(paddingBuffer);
+
+		return matrixBuffer;
+	}
+
+	/**
+	 * @internal
+	 * Dedads an OpenCL buffer and puts it back into a BlasMatrix
+	 */
+	template <class Field>
+	template <typename T, class Operand1>
+	Operand1& OpenCLMatrixDomain<Field>::oclDepadMatrix(
+		cl_mem matrixBuffer,
+		int matrixBufferSize,
+		int outputSize,
+		int newDimX,
+		Operand1& matrix) const{
+
+		//Set starting positions
+		int matrixBufferPosition = 0;
+		int dataOffset = 0;
+
+		//Allocates a 32mb buffer for depadding
+		T* depaddingBuffer = (T*)malloc(32 * 1024 * 1024);
+
+		//Calculate the size of the depadding buffer in number of elements
+		const int depaddingBufferSize = (32 * 1024 * 1024 / (int)sizeof(T));
+
+		//Loops while there are still elements in the matrixBuffer
+		while(dataOffset < outputSize){
+			int transferSize;
+
+			//Transfer a full depaddingBuffer worth of elements back to the host
+			if((matrixBufferPosition + depaddingBufferSize) <= matrixBufferSize){
+				transferSize = (32 * 1024 * 1024);
+			}
+			//Transfer a partial depaddingBuffer worth of elements back to the host
+			else{
+				transferSize = (int) ( (size_t)(matrixBufferSize - matrixBufferPosition) * sizeof(T) );
+			}
+
+			// cl_int tempErrcode;
+			// tempErrcode =
+				clEnqueueReadBuffer(
+				commandQue,
+				matrixBuffer,
+				CL_TRUE,
+				((size_t)matrixBufferPosition * sizeof(T)),
+				(size_t)transferSize,
+				depaddingBuffer,
+				0,
+				NULL,
+				NULL);
+
+			//Set depaddiingBuffer start position
+			int depaddingBufferPosition = 0;
+
+			//Loops while there are still elements in the depaddingBuffer
+			while(depaddingBufferPosition < depaddingBufferSize){
+				int count = 0;
+
+				//Puts one row of data into the matrix while there are elements in the
+				//depaddingBuffer
+				while(count < (int)matrix.coldim() &&
+				      depaddingBufferPosition < depaddingBufferSize &&
+				      dataOffset < outputSize){
+
+					//Put entry of depadding buffer into the matrix
+					int row = (int) ((size_t)dataOffset / matrix.coldim());
+					int col = (int) ((size_t)dataOffset % matrix.coldim());
+					matrix.setEntry((size_t)row, (size_t)col, depaddingBuffer[depaddingBufferPosition]);
+
+					//Increment the count for the row, depadding buffer, and matrix
+					count++;
+					depaddingBufferPosition++;
+					dataOffset++;
+				}
+
+				//Skip over the padding zero's
+				depaddingBufferPosition += (newDimX - count);
+			}
+
+			//Increment position in matrixBuffer by the size of the paddingBuffer
+			matrixBufferPosition += depaddingBufferSize;
+		}
+
+		//Deallocates buffer
+		free(depaddingBuffer);
+
+		return matrix;
+	}
+
+	/**
+	 * @internal
+	 * Creates an empty matrix buffer on the OpenCL device from
+	 * the dimensions of the matrix
+	 */
+	template <class Field>
+	template <typename T, class Operand1>
+	cl_mem OpenCLMatrixDomain<Field>::oclCreateMatrixBuffer(
+		Operand1& matrix) const{
+
+		//Calculate dimensions after padding of matrix
+		//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+		int newDimX = (int) (((matrix.coldim() + 15) / 16) * 16);
+		int newDimY = (int) (((matrix.rowdim() + 15) / 16) * 16);
+
+		//Allocate buffer
+		cl_int tempErrcode;
+		cl_mem matrixBuffer = clCreateBuffer(
+			context,
+			CL_MEM_READ_WRITE,
+			((size_t)newDimX * (size_t)newDimY * sizeof(T)),
+			0,
+			&tempErrcode);
+
+		return matrixBuffer;
+	}
+
+	/**
+	 * @internal
+	 * Creates a matrix buffer on the OpenCL device from the dimensions
+	 * of the passed in matrix and load the contents of the matrix into
+	 * the matrix buffer
+	 */
+	template<class Field>
+	template<typename T, class Operand1>
+	cl_mem OpenCLMatrixDomain<Field>::oclCreateAndLoadMatrixBuffer(
+		const Operand1 &matrix) const{
+
+		//Calculate dimensions after padding of matrix
+		//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+		int newDimX = (int) (((matrix.coldim() + 15) / 16) * 16);
+		int newDimY = (int) (((matrix.rowdim() + 15) / 16) * 16);
+
+		//Allocate buffer
+		cl_int tempErrcode;
+		cl_mem matrixBuffer = clCreateBuffer(
+			context,
+			CL_MEM_READ_WRITE,
+			((size_t)newDimX * (size_t)newDimY * sizeof(T)),
+			0,
+			&tempErrcode);
+
+		//Calculate number of elements in the matrixBuffer
+		int matrixBufferSize = newDimX * newDimY;
+
+		return oclPadMatrix<T, Operand1>(
+			matrixBuffer,
+			matrixBufferSize,
+			newDimX,
+			matrix);
+	}
+
+	/**
+	 * @internal
+	 * Read back the contents of the matrix buffer into the matrix and
+	 * return a refence to the matrix
+	 */
+	template <class Field>
+	template <typename T, class Operand2>
+	Operand2& OpenCLMatrixDomain<Field>::oclReadMatrixBuffer(
+		cl_mem matrixBuffer,
+		Operand2 &matrix) const{
+
+		//Calculate dimensions after padding of matrix
+		//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+		int newDimX = (int) (((matrix.coldim() + 15) / 16) * 16);
+		int newDimY = (int) (((matrix.rowdim() + 15) / 16) * 16);
+
+		//Calculate number of elements in the matrixBuffer
+		int matrixBufferSize = newDimX * newDimY;
+
+		//Calculate number of elements in the matrix
+		int outputSize = (int)( matrix.coldim() * matrix.rowdim() ); //BB here we assume the size of a matrix is small, not a size_t
+
+		return oclDepadMatrix<T, Operand2>(
+			matrixBuffer,
+			matrixBufferSize,
+			outputSize,
+			newDimX,
+			matrix);
+	}
+
+} //end of namespace LinBox
+
+#endif // __LINBOX_opencl_matrix_domain_memory_INL
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
diff --git a/linbox/matrix/matrixdomain/opencl-domain-util.inl b/linbox/matrix/matrixdomain/opencl-domain-util.inl
new file mode 100644
index 0000000..677b13c
--- /dev/null
+++ b/linbox/matrix/matrixdomain/opencl-domain-util.inl
@@ -0,0 +1,898 @@
+/*
+ * Copyright (C) 2012 Matthew Wezowicz
+ *
+ * Written by Matthew Wezowicz <mwezz at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/** @internal
+ * @file linbox/matrix/matrixdomain/opencl-domain-setup.inl
+ * @brief NO DOC
+ */
+
+
+#ifndef __LINBOX_opencl_matrix_domain_util_INL
+#define __LINBOX_opencl_matrix_domain_util_INL
+
+#include <cstdio>
+
+#include <utility>
+
+#include "linbox/matrix/matrixdomain/opencl-domain-factory.h"
+
+namespace LinBox{
+
+	/**
+	 * @internal
+	 * Initializes the OpenCL compute environment
+	 */
+	template <class Field>
+	void OpenCLMatrixDomain<Field>::oclMatrixDomainAcquire(){
+
+		OpenCLMatrixDomainFactory::oclMatrixDomainInstance(this);
+	}
+
+	/**
+	 * @internal
+	 * Releases OpenCL cumpute resources
+	 */
+	template <class Field>
+	void OpenCLMatrixDomain<Field>::oclMatrixDomainRelease(unsigned int IDnum_){
+
+		OpenCLMatrixDomainFactory::oclMatrixDomainDeallocate(IDnum_);
+	}
+
+	/**
+	 * @internal
+	 * Checks to see if the memory levels required are possible
+	 */
+	template <>
+	template <class Operand1, class Operand2, class Operand3>
+	bool OpenCLMatrixDomain<Givaro::Modular<double> >::oclMemCheck(
+		Operand1& D,
+		const Operand2& A,
+		const Operand3& B,
+		const Operand1& C) const{
+
+		//Calculate dimensions after padding of matrices
+		//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+		int newDDimX = (int) ((D.coldim() + 15) / 16) * 16;
+		int newDDimY = (int) ((D.rowdim() + 15) / 16) * 16;
+		int newADimX = (int) ((A.coldim() + 15) / 16) * 16;
+		int newADimY = (int) ((A.rowdim() + 15) / 16) * 16;
+		int newBDimX = (int) ((B.coldim() + 15) / 16) * 16;
+		int newBDimY = (int) ((B.rowdim() + 15) / 16) * 16;
+		int newCDimX = (int) ((C.coldim() + 15) / 16) * 16;
+		int newCDimY = (int) ((C.rowdim() + 15) / 16) * 16;
+
+		//Determine if each individual matrix will fit in a buffer
+		bool temp = (maxBufferSize >= ((size_t)(newDDimX * newDDimY) * sizeof(cl_double)));
+		temp &= (maxBufferSize >= (size_t)(newADimX * newADimY) * sizeof(cl_double));
+		temp &= (maxBufferSize >= (size_t)(newBDimX * newBDimY) * sizeof(cl_double));
+		temp &= (maxBufferSize >= (size_t)(newCDimX * newCDimY) * sizeof(cl_double));
+
+		//Determine if all three buffers will fit at the same time
+		temp &= (memCapacity >= ((size_t)(newDDimX * newDDimY) + (size_t)(newADimX * newADimY) +
+			      (size_t)(newBDimX * newBDimY) + (size_t)(newCDimX * newCDimY)) * sizeof(cl_double));
+
+		return temp;
+	}
+
+	template <>
+	template <class Operand1, class Operand2, class Operand3>
+	bool OpenCLMatrixDomain<Givaro::Modular<float> >::oclMemCheck(
+		Operand1& D,
+		const Operand2& A,
+		const Operand3& B,
+		const Operand1& C) const{
+
+		//Calculate dimensions after padding of matrices
+		//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+		int newDDimX = (int) ((D.coldim() + 15) / 16) * 16;
+		int newDDimY = (int) ((D.rowdim() + 15) / 16) * 16;
+		int newADimX = (int) ((A.coldim() + 15) / 16) * 16;
+		int newADimY = (int) ((A.rowdim() + 15) / 16) * 16;
+		int newBDimX = (int) ((B.coldim() + 15) / 16) * 16;
+		int newBDimY = (int) ((B.rowdim() + 15) / 16) * 16;
+		int newCDimX = (int) ((C.coldim() + 15) / 16) * 16;
+		int newCDimY = (int) ((C.rowdim() + 15) / 16) * 16;
+
+		//Determine if each individual matrix will fit in a buffer
+		bool temp = (maxBufferSize >= ((size_t)(newDDimX * newDDimY) * sizeof(cl_float)));
+		temp &= (maxBufferSize >= (size_t)(newADimX * newADimY) * sizeof(cl_float));
+		temp &= (maxBufferSize >= (size_t)(newBDimX * newBDimY) * sizeof(cl_float));
+		temp &= (maxBufferSize >= (size_t)(newCDimX * newCDimY) * sizeof(cl_float));
+
+		//Determine if all three buffers will fit at the same time
+		temp &= (memCapacity >= ((size_t)(newDDimX * newDDimY) + (size_t)(newADimX * newADimY) +
+			      (size_t)(newBDimX * newBDimY) + (size_t)(newCDimX * newCDimY)) * sizeof(cl_float));
+
+		return temp;
+	}
+
+	template <>
+	template <>
+	bool OpenCLMatrixDomain<Givaro::Modular<double> >::oclMemCheck<std::pair<int,int> >(
+		std::pair<int,int>& D,
+		std::pair<int,int>& A,
+		std::pair<int,int>& B,
+		std::pair<int,int>& C) const{
+
+		//Calculate dimensions after padding of matrices
+		//((A.second / 16) + (A.second % 16 == 0 ? 0 : 1)) * 16
+		int newDDimX = ((D.second + 15) / 16) * 16;
+		int newDDimY = ((D.first + 15) / 16) * 16;
+		int newADimX = ((A.second + 15) / 16) * 16;
+		int newADimY = ((A.first + 15) / 16) * 16;
+		int newBDimX = ((B.second + 15) / 16) * 16;
+		int newBDimY = ((B.first + 15) / 16) * 16;
+		int newCDimX = ((C.second + 15) / 16) * 16;
+		int newCDimY = ((C.first + 15) / 16) * 16;
+
+		//Determine if each individual matrix will fit in a buffer
+		bool temp = (maxBufferSize >= (size_t)(newDDimX * newDDimY) * sizeof(cl_double));
+		temp &= (maxBufferSize >= (size_t)(newADimX * newADimY) * sizeof(cl_double));
+		temp &= (maxBufferSize >= (size_t)(newBDimX * newBDimY) * sizeof(cl_double));
+		temp &= (maxBufferSize >= (size_t)(newCDimX * newCDimY) * sizeof(cl_double));
+
+		//Determine if all three buffers will fit at the same time
+		temp &= (memCapacity >= ((size_t)(newDDimX * newDDimY) + (size_t)(newADimX * newADimY) +
+			      (size_t)(newBDimX * newBDimY) + (size_t)(newCDimX * newCDimY)) * sizeof(cl_double));
+
+		return temp;
+	}
+
+	template <>
+	template <>
+	bool OpenCLMatrixDomain<Givaro::Modular<float> >::oclMemCheck<std::pair<int,int> >(
+		std::pair<int,int>& D,
+		std::pair<int,int>& A,
+		std::pair<int,int>& B,
+		std::pair<int,int>& C) const{
+
+		//Calculate dimensions after padding of matrices
+		//((A.second / 16) + (A.second % 16 == 0 ? 0 : 1)) * 16
+		int newDDimX = ((D.second + 15) / 16) * 16;
+		int newDDimY = ((D.first + 15) / 16) * 16;
+		int newADimX = ((A.second + 15) / 16) * 16;
+		int newADimY = ((A.first + 15) / 16) * 16;
+		int newBDimX = ((B.second + 15) / 16) * 16;
+		int newBDimY = ((B.first + 15) / 16) * 16;
+		int newCDimX = ((C.second + 15) / 16) * 16;
+		int newCDimY = ((C.first + 15) / 16) * 16;
+
+		//Determine if each individual matrix will fit in a buffer
+		bool temp = (maxBufferSize >= (size_t)(newDDimX * newDDimY) * sizeof(cl_float));
+		temp &= (maxBufferSize >= (size_t)(newADimX * newADimY) * sizeof(cl_float));
+		temp &= (maxBufferSize >= (size_t)(newBDimX * newBDimY) * sizeof(cl_float));
+		temp &= (maxBufferSize >= (size_t) (newCDimX * newCDimY) * sizeof(cl_float));
+
+		//Determine if all three buffers will fit at the same time
+		temp &= (memCapacity >= ((size_t)(newDDimX * newDDimY) + (size_t)(newADimX * newADimY) +
+			      (size_t)(newBDimX * newBDimY) + (size_t)(newCDimX * newCDimY)) * sizeof(cl_float));
+
+		return temp;
+	}
+
+	/**
+	 * @internal
+	 * Functions to call the passed kernel on the passed buffers
+	 */
+	template <class Field>
+	template <typename T, typename U>
+	void OpenCLMatrixDomain<Field>::oclCallKernel(
+		cl_mem bufferC,
+		cl_mem bufferA,
+		cl_mem bufferB,
+		int widthA,
+		int heightA,
+		int widthB,
+		T p,
+		cl_kernel selectedKernel) const{
+
+		//Pass kernel arguments
+		cl_int tempErrcode;
+		tempErrcode = clSetKernelArg(
+			selectedKernel,
+			0,
+			sizeof(cl_mem),
+			(void*)&bufferC);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+		tempErrcode = clSetKernelArg(
+			selectedKernel,
+			1,
+			sizeof(cl_mem),
+			(void*)&bufferA);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+		tempErrcode = clSetKernelArg(
+			selectedKernel,
+			2,
+			sizeof(cl_mem),
+			(void*)&bufferB);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+		tempErrcode = clSetKernelArg(
+			selectedKernel,
+			3,
+			sizeof(cl_int),
+			(void*)&widthA);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+		tempErrcode = clSetKernelArg(
+			selectedKernel,
+			4,
+			sizeof(cl_int),
+			(void*)&widthB);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+		tempErrcode = clSetKernelArg(selectedKernel, 5, sizeof(U), (void*)&p);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+
+		//Set NDRange
+		size_t localWorkSize[2];
+		size_t globalWorkSize[2];
+		localWorkSize[0] = 16;
+		localWorkSize[1] = 16;
+		globalWorkSize[0] = (size_t)widthB;
+		globalWorkSize[1] = (size_t)heightA;
+
+		//Launch kernel
+		tempErrcode = clEnqueueNDRangeKernel(
+			commandQue,
+			selectedKernel,
+			2,
+			NULL,
+			globalWorkSize,
+			localWorkSize,
+			0,
+			NULL,
+			NULL);
+		linbox_check(tempErrcode == CL_SUCCESS);
+	}
+
+	template <class Field>
+	template <typename T, typename U>
+	void OpenCLMatrixDomain<Field>::oclCallKernel(
+		cl_mem bufferD,
+		cl_mem bufferA,
+		cl_mem bufferB,
+		cl_mem bufferC,
+		int widthA,
+		int heightA,
+		int widthB,
+		T p,
+		cl_kernel selectedKernel) const{
+
+		//Pass kernel arguments
+		cl_int tempErrcode;
+		tempErrcode = clSetKernelArg(
+			selectedKernel,
+			0,
+			sizeof(cl_mem),
+			(void*)&bufferD);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+		tempErrcode = clSetKernelArg(
+			selectedKernel,
+			1,
+			sizeof(cl_mem),
+			(void*)&bufferA);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+		tempErrcode = clSetKernelArg(
+			selectedKernel,
+			2,
+			sizeof(cl_mem),
+			(void*)&bufferB);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+		tempErrcode = clSetKernelArg(
+			selectedKernel,
+			3,
+			sizeof(cl_mem),
+			(void*)&bufferC);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+		tempErrcode = clSetKernelArg(
+			selectedKernel,
+			4,
+			sizeof(cl_int),
+			(void*)&widthA);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+		tempErrcode = clSetKernelArg(
+			selectedKernel,
+			5,
+			sizeof(cl_int),
+			(void*)&widthB);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+		tempErrcode = clSetKernelArg(selectedKernel, 6, sizeof(U), (void*)&p);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+		//Set NDRange
+		size_t localWorkSize[2];
+		size_t globalWorkSize[2];
+		localWorkSize[0] = 16;
+		localWorkSize[1] = 16;
+		globalWorkSize[0] = (size_t)widthB;
+		globalWorkSize[1] = (size_t)heightA;
+
+		//Launch kernel
+		tempErrcode = clEnqueueNDRangeKernel(
+			commandQue,
+			selectedKernel,
+			2,
+			NULL,
+			globalWorkSize,
+			localWorkSize,
+			0,
+			NULL,
+			NULL);
+		linbox_check(tempErrcode == CL_SUCCESS);
+	}
+
+	template <class Field>
+	template <typename T, typename U>
+	void OpenCLMatrixDomain<Field>::oclCallKernel(
+		cl_mem bufferD,
+		cl_mem bufferA,
+		cl_mem bufferB,
+		cl_mem bufferC,
+		T alpha,
+		T beta,
+		int widthA,
+		int heightA,
+		int widthB,
+		T p,
+		cl_kernel selectedKernel) const{
+
+		//Pass kernel arguments
+		cl_int tempErrcode;
+		tempErrcode = clSetKernelArg(
+			selectedKernel,
+			0,
+			sizeof(cl_mem),
+			(void*)&bufferD);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+		tempErrcode = clSetKernelArg(
+			selectedKernel,
+			1,
+			sizeof(U),
+			(void*)&alpha);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+		tempErrcode = clSetKernelArg(
+			selectedKernel,
+			2,
+			sizeof(cl_mem),
+			(void*)&bufferA);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+		tempErrcode = clSetKernelArg(
+			selectedKernel,
+			3,
+			sizeof(cl_mem),
+			(void*)&bufferB);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+		tempErrcode = clSetKernelArg(
+			selectedKernel,
+			4,
+			sizeof(U),
+			(void*)&beta);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+		tempErrcode = clSetKernelArg(
+			selectedKernel,
+			5,
+			sizeof(cl_mem),
+			(void*)&bufferC);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+		tempErrcode = clSetKernelArg(
+			selectedKernel,
+			6,
+			sizeof(cl_int),
+			(void*)&widthA);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+		tempErrcode = clSetKernelArg(
+			selectedKernel,
+			7,
+			sizeof(cl_int),
+			(void*)&widthB);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+		tempErrcode = clSetKernelArg(selectedKernel, 8, sizeof(U), (void*)&p);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+
+		//Set NDRange
+		size_t localWorkSize[2];
+		size_t globalWorkSize[2];
+		localWorkSize[0] = 16;
+		localWorkSize[1] = 16;
+		globalWorkSize[0] = (size_t)widthB;
+		globalWorkSize[1] = (size_t)heightA;
+
+		//Launch kernel
+		tempErrcode = clEnqueueNDRangeKernel(
+			commandQue,
+			selectedKernel,
+			2,
+			NULL,
+			globalWorkSize,
+			localWorkSize,
+			0,
+			NULL,
+			NULL);
+		linbox_check(tempErrcode == CL_SUCCESS);
+
+	}
+
+
+	/**
+	 * @internal
+	 * Functions to partition the matrices into submatrix views
+	 */
+	template <class Field>
+	template <class Operand1, class Operand2, class Operand3>
+	std::vector<int> OpenCLMatrixDomain<Field>::oclPartition(
+		Operand1& C,
+		const Operand2& A,
+		const Operand3& B,
+		std::vector<SubmatrixAdapter<Operand1> >& VC,
+		std::vector<SubmatrixAdapter<Operand2> >& VA,
+		std::vector<SubmatrixAdapter<Operand3> >& VB) const{
+
+		std::vector<SubmatrixAdapter<Operand1> > VT;
+		return oclPartition<Operand1,Operand2,Operand3>(C,A,B,C,VT,VA,VB,VC);
+	}
+
+	template <class Field>
+	template <class Operand1, class Operand2, class Operand3>
+	std::vector<int> OpenCLMatrixDomain<Field>::oclPartition(
+		Operand1& D,
+		const Operand2& A,
+		const Operand3& B,
+		const Operand1& C,
+		std::vector<SubmatrixAdapter<Operand1> >& VD,
+		std::vector<SubmatrixAdapter<Operand2> >& VA,
+		std::vector<SubmatrixAdapter<Operand3> >& VB,
+		std::vector<SubmatrixAdapter<Operand1> >& VC) const{
+
+		//Compute if the OpenCL device is capable of working with the required ammounts of memory
+		bool memLevelsAllowed = oclMemCheck<Operand1,Operand2,Operand3>(D,A,B,C);
+
+		std::vector<int> temp;
+
+		if(memLevelsAllowed){
+			// Create Submatrix views
+			SubmatrixAdapter<Operand1> SD(D);
+			SubmatrixAdapter<Operand2> SA(A);
+			SubmatrixAdapter<Operand3> SB(B);
+			SubmatrixAdapter<Operand1> SC(C);
+
+			// Place Submatrices at the beginning of the vectors
+			VD.push_back(SD);
+			VA.push_back(SA);
+			VB.push_back(SB);
+			VC.push_back(SC);
+
+			// Return the block dimensions
+			temp.push_back(1); //DBlocksX & CBlocksX
+			temp.push_back(1); //DBlocksY & CBlocksY
+			temp.push_back(1); //ABlocksY
+			temp.push_back(1); //ABlocksY
+			temp.push_back(1); //CBlocksY
+			temp.push_back(1); //CBlocksY
+
+			return temp;
+		}
+
+		//Begin search for Submatrices small enough to search on the device
+		int DRows = (int) D.rowdim();
+		int DCols = (int) D.coldim();
+		int ARows = (int) A.rowdim();
+		int ACols = (int) A.rowdim();
+		int BRows = (int) B.rowdim();
+		int BCols = (int) B.coldim();
+
+		if(true){ //Default partitioning scheme
+
+			//Loop until Submatrices that fit on the device have been found
+			while(!memLevelsAllowed){
+				int divisionFactor = 1;
+				//Increase the number of subsections
+				divisionFactor++;
+
+				//Compute the number of rows and columns in each subsections
+				int subRows = DRows / divisionFactor;
+				int subCols = DCols / divisionFactor;
+				int subSharedDim = ACols / divisionFactor;
+
+				//Check if adjustment is need for some of the subsections
+				bool addToSubRows = false;
+				bool addToSubCols = false;
+				bool addToSubSharedDim = false;
+
+				if((subRows * divisionFactor) != DRows){
+					addToSubRows = true;
+				}
+				if((subCols * divisionFactor) != DCols){
+					addToSubCols = true;
+				}
+				if((subSharedDim * divisionFactor) != ACols){
+					addToSubSharedDim = true;
+				}
+
+				//Determine of the largest subsections will fit on the device together
+				int largestSubRows = (addToSubRows ? subRows : (subRows + 1));
+				int largestSubCols = (addToSubCols ? subCols : (subCols + 1));
+				int largestSubSharedDim = (addToSubSharedDim ? subSharedDim :
+				                                               (subSharedDim + 1));
+
+				std::pair<int,int> largestSubD(largestSubRows, largestSubCols);
+				std::pair<int,int> largestSubA(largestSubRows, largestSubSharedDim);
+				std::pair<int,int> largestSubB(largestSubSharedDim, largestSubCols);
+				std::pair<int,int> largestSubC(largestSubRows, largestSubCols);
+
+				memLevelsAllowed = oclMemCheck<std::pair<int,int> >(
+					largestSubD,
+					largestSubA,
+					largestSubB,
+					largestSubC);
+
+				//If the largest subsections can fit on the device together
+				//Begin partitioning the input matrices
+				if(memLevelsAllowed){
+					// Return the block dimensions
+					temp.push_back(divisionFactor); //DBlocksX & CBlocksX
+					temp.push_back(divisionFactor); //DBlocksY & CBlocksY
+					temp.push_back(divisionFactor); //ABlocksY
+					temp.push_back(divisionFactor); //ABlocksY
+					temp.push_back(divisionFactor); //CBlocksY
+					temp.push_back(divisionFactor); //CBlocksY
+
+					//Loop through all but the last row
+					for(int blockY = 0; blockY < (divisionFactor - 1); blockY++){
+						int DRowsOffset = blockY * subRows;
+						int ARowsOffset = blockY * subRows;
+						int BRowsOffset = blockY * subSharedDim;
+
+						//Loop through all but the last column
+						for(int blockX = 0; blockX < (divisionFactor - 1); blockX++){
+							int DColsOffset = blockX * subCols;
+							int AColsOffset = blockX * subSharedDim;
+							int BColsOffset = blockX * subCols;
+
+							SubmatrixAdapter<Operand1> SD(
+								D,
+								(size_t)DRowsOffset,
+								(size_t)DColsOffset,
+								(size_t)subRows,
+								(size_t)subCols);
+							SubmatrixAdapter<Operand2> SA(
+								A,
+								(size_t)ARowsOffset,
+								(size_t)AColsOffset,
+								(size_t)subRows,
+								(size_t)subSharedDim);
+							SubmatrixAdapter<Operand3> SB(
+								B,
+								(size_t)BRowsOffset,
+								(size_t)BColsOffset,
+								(size_t)subSharedDim,
+								(size_t)subCols);
+							SubmatrixAdapter<Operand1> SC(
+								C,
+								(size_t)DRowsOffset,
+								(size_t)DColsOffset,
+								(size_t)subRows,
+								(size_t)subCols);
+
+							VD.push_back(SD);
+							VA.push_back(SA);
+							VB.push_back(SB);
+							VC.push_back(SC);
+						}
+
+						int DColsOffset = (divisionFactor - 1) * subCols;
+						int AColsOffset = (divisionFactor - 1) * subSharedDim;
+						int BColsOffset = (divisionFactor - 1) * subCols;
+
+						SubmatrixAdapter<Operand1> SD(
+							D,
+							(size_t)DRowsOffset,
+							(size_t)DColsOffset,
+							(size_t)subRows,
+							(size_t)(DCols - DColsOffset));
+						SubmatrixAdapter<Operand2> SA(
+							A,
+							(size_t)ARowsOffset,
+							(size_t)AColsOffset,
+							(size_t)subRows,
+							(size_t)(ACols - AColsOffset));
+						SubmatrixAdapter<Operand3> SB(
+							B,
+							(size_t)BRowsOffset,
+							(size_t)BColsOffset,
+							(size_t)subSharedDim,
+							(size_t)(BCols - BColsOffset));
+						SubmatrixAdapter<Operand1> SC(
+							C,
+							(size_t)DRowsOffset,
+							(size_t)DColsOffset,
+							(size_t)subRows,
+							(size_t)(DCols - DColsOffset));
+
+						VD.push_back(SD);
+						VA.push_back(SA);
+						VB.push_back(SB);
+						VC.push_back(SC);
+					}
+
+					//Partition the last row
+					int DRowsOffset = (divisionFactor - 1) * subRows;
+					int ARowsOffset = (divisionFactor - 1) * subRows;
+					int BRowsOffset = (divisionFactor - 1) * subSharedDim;
+
+					for(int blockX = 0; blockX < (divisionFactor - 1); blockX++){
+						int DColsOffset = blockX * subCols;
+						int AColsOffset = blockX * subSharedDim;
+						int BColsOffset = blockX * subCols;
+
+						SubmatrixAdapter<Operand1> SD(
+							D,
+							(size_t)DRowsOffset,
+							(size_t)DColsOffset,
+							(size_t)(DRows - DRowsOffset),
+							(size_t)subCols);
+						SubmatrixAdapter<Operand2> SA(
+							A,
+							(size_t)ARowsOffset,
+							(size_t)AColsOffset,
+							(size_t)(ARows - ARowsOffset),
+							(size_t)subSharedDim);
+						SubmatrixAdapter<Operand3> SB(
+							B,
+							(size_t)BRowsOffset,
+							(size_t)BColsOffset,
+							(size_t)(BRows - BRowsOffset),
+							(size_t)subCols);
+						SubmatrixAdapter<Operand1> SC(
+							C,
+							(size_t)DRowsOffset,
+							(size_t)DColsOffset,
+							(size_t)(DRows - DRowsOffset),
+							(size_t)subCols);
+
+						VD.push_back(SD);
+						VA.push_back(SA);
+						VB.push_back(SB);
+						VC.push_back(SC);
+					}
+
+					int DColsOffset = (divisionFactor - 1) * subCols;
+					int AColsOffset = (divisionFactor - 1) * subSharedDim;
+					int BColsOffset = (divisionFactor - 1) * subCols;
+
+					SubmatrixAdapter<Operand1> SD(
+						D,
+						(size_t)DRowsOffset,
+						(size_t)DColsOffset,
+						(size_t)(DRows - DRowsOffset),
+						(size_t)(DCols - DColsOffset));
+					SubmatrixAdapter<Operand2> SA(
+						A,
+						(size_t)ARowsOffset,
+						(size_t)AColsOffset,
+						(size_t)(ARows - ARowsOffset),
+						(size_t)(ACols - AColsOffset));
+					SubmatrixAdapter<Operand3> SB(
+						B,
+						(size_t)BRowsOffset,
+						(size_t)BColsOffset,
+						(size_t)(BRows - BRowsOffset),
+						(size_t)(BCols - BColsOffset));
+					SubmatrixAdapter<Operand1> SC(
+						C,
+						(size_t)DRowsOffset,
+						(size_t)DColsOffset,
+						(size_t)(DRows - DRowsOffset),
+						(size_t)(DCols - DColsOffset));
+
+					VD.push_back(SD);
+					VA.push_back(SA);
+					VB.push_back(SB);
+					VC.push_back(SC);
+
+				}
+			}
+		}
+
+		return temp;
+	}
+
+	//Prints the appropriate error message
+	template <class Field>
+	void OpenCLMatrixDomain<Field>::printClErrstring(cl_int err) const{
+		switch (err) {
+		case CL_SUCCESS:
+			std::cout << "Success!\n";
+			break;
+		case CL_DEVICE_NOT_FOUND:
+			std::cout << "Device not found\n";
+			break;
+		case CL_DEVICE_NOT_AVAILABLE:
+			std::cout << "Device not available\n";
+			break;
+		case CL_COMPILER_NOT_AVAILABLE:
+			std::cout << "Compiler not available\n";
+			break;
+		case CL_MEM_OBJECT_ALLOCATION_FAILURE:
+			std::cout << "Memory object allocation failure\n";
+			break;
+		case CL_OUT_OF_RESOURCES:
+			std::cout << "Out of resources\n";
+			break;
+		case CL_OUT_OF_HOST_MEMORY:
+			std::cout << "Out of host memory\n";
+			break;
+		case CL_PROFILING_INFO_NOT_AVAILABLE:
+			std::cout << "Profiling information not available\n";
+			break;
+		case CL_MEM_COPY_OVERLAP:
+			std::cout << "Memory copy overlap\n";
+			break;
+		case CL_IMAGE_FORMAT_MISMATCH:
+			std::cout << "Image format mismatch\n";
+			break;
+		case CL_IMAGE_FORMAT_NOT_SUPPORTED:
+			std::cout << "Image format not supported\n";
+			break;
+		case CL_BUILD_PROGRAM_FAILURE:
+			std::cout << "Program build failure\n";
+			break;
+		case CL_MAP_FAILURE:
+			std::cout << "Map failure\n";
+			break;
+		case CL_INVALID_VALUE:
+			std::cout << "Invalid value\n";
+			break;
+		case CL_INVALID_DEVICE_TYPE:
+			std::cout << "Invalid device type\n";
+			break;
+		case CL_INVALID_PLATFORM:
+			std::cout << "Invalid platform\n";
+			break;
+		case CL_INVALID_DEVICE:
+			std::cout << "Invalid device\n";
+			break;
+		case CL_INVALID_CONTEXT:
+			std::cout << "Invalid context\n";
+			break;
+		case CL_INVALID_QUEUE_PROPERTIES:
+			std::cout << "Invalid queue properties\n";
+			break;
+		case CL_INVALID_COMMAND_QUEUE:
+			std::cout << "Invalid command queue\n";
+			break;
+		case CL_INVALID_HOST_PTR:
+			std::cout << "Invalid host pointer\n";
+			break;
+		case CL_INVALID_MEM_OBJECT:
+			std::cout << "Invalid memory object\n";
+			break;
+		case CL_INVALID_IMAGE_FORMAT_DESCRIPTOR:
+			std::cout << "Invalid image format descriptor\n";
+			break;
+		case CL_INVALID_IMAGE_SIZE:
+			std::cout << "Invalid image size\n";
+			break;
+		case CL_INVALID_SAMPLER:
+			std::cout << "Invalid sampler\n";
+			break;
+		case CL_INVALID_BINARY:
+			std::cout << "Invalid binary\n";
+			break;
+		case CL_INVALID_BUILD_OPTIONS:
+			std::cout << "Invalid build options\n";
+			break;
+		case CL_INVALID_PROGRAM:
+			std::cout << "Invalid program\n";
+			break;
+		case CL_INVALID_PROGRAM_EXECUTABLE:
+			std::cout << "Invalid program executable\n";
+			break;
+		case CL_INVALID_KERNEL_NAME:
+			std::cout << "Invalid kernel name\n";
+			break;
+		case CL_INVALID_KERNEL_DEFINITION:
+			std::cout << "Invalid kernel definition\n";
+			break;
+		case CL_INVALID_KERNEL:
+			std::cout << "Invalid kernel\n";
+			break;
+		case CL_INVALID_ARG_INDEX:
+			std::cout << "Invalid argument index\n";
+			break;
+		case CL_INVALID_ARG_VALUE:
+			std::cout << "Invalid argument value\n";
+			break;
+		case CL_INVALID_ARG_SIZE:
+			std::cout << "Invalid argument size\n";
+			break;
+		case CL_INVALID_KERNEL_ARGS:
+			std::cout << "Invalid kernel arguments\n";
+			break;
+		case CL_INVALID_WORK_DIMENSION:
+			std::cout << "Invalid work dimension\n";
+			break;
+		case CL_INVALID_WORK_GROUP_SIZE:
+			std::cout << "Invalid work group size\n";
+			break;
+		case CL_INVALID_WORK_ITEM_SIZE:
+			std::cout << "Invalid work item size\n";
+			break;
+		case CL_INVALID_GLOBAL_OFFSET:
+			std::cout << "Invalid global offset\n";
+			break;
+		case CL_INVALID_EVENT_WAIT_LIST:
+			std::cout << "Invalid event wait list\n";
+			break;
+		case CL_INVALID_EVENT:
+			std::cout << "Invalid event\n";
+			break;
+		case CL_INVALID_OPERATION:
+			std::cout << "Invalid operation\n";
+			break;
+		case CL_INVALID_GL_OBJECT:
+			std::cout << "Invalid OpenGL object\n";
+			break;
+		case CL_INVALID_BUFFER_SIZE:
+			std::cout << "Invalid buffer size\n";
+			break;
+		case CL_INVALID_MIP_LEVEL:
+			std::cout << "Invalid mip-map level\n";
+			break;
+		default:
+			std::cout << "Unknown\n";
+			break;
+		}
+	}
+
+} //end of namespace LinBox
+
+#endif // __LINBOX_opencl_matrix_domain_util_INL
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
diff --git a/linbox/matrix/matrixdomain/opencl-domain.h b/linbox/matrix/matrixdomain/opencl-domain.h
new file mode 100644
index 0000000..a73eff7
--- /dev/null
+++ b/linbox/matrix/matrixdomain/opencl-domain.h
@@ -0,0 +1,995 @@
+/*
+ * Copyright (C) 2011      David Saunders
+ *               2011-2012 Matthew Wezowicz
+ *
+ * Written by Matthew Wezowicz <mwezz at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file matrix/matrixdomain/opencl-domain.h
+ * @ingroup matrixdomain
+ * @ingroup opencl
+ * @brief NO DOC
+ * @warning An <code>OpenCLMatrixDomain<Field></code> should be templated by a
+ * Givaro::Modular<double> or Givaro::Modular<float> field only.
+ */
+
+#ifndef __LINBOX_opencl_matrix_domain_H
+#define __LINBOX_opencl_matrix_domain_H
+
+#include <vector>
+#include <iostream>
+#include <pthread.h>
+
+#ifdef __LINBOX_HAVE_OCL
+#include <CL/cl.h>
+#endif
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "linbox/matrix/matrixdomain/blas-matrix-domain.h"
+
+namespace LinBox{
+
+	/**
+	 * Generic submatrix view adapter used internally in the OpenCLMatrixDomain
+	 */
+	template <class _Matrix>
+	class SubmatrixAdapter{
+	public:
+		//Access to underlying types
+		typedef typename _Matrix::Field     Field;
+		typedef typename Field::Element     Element;
+		typedef SubmatrixAdapter<_Matrix>   Self_t;
+
+	private:
+		_Matrix* _Mat;  //!< Parent Matrix (ie raw vector)
+		size_t _row;    //!< row dimension of Submatrix
+		size_t _col;    //!< col dimension of Submatrix
+		size_t _r0;     //!< upper left corner row of Submatrix in \p _Mat
+		size_t _c0;     //!< upper left corner row of Submatrix in \p _Mat
+		size_t _stride; //!< number of columns in \p _Mat (or stride of \p _Mat)
+		size_t _off;    //!< offset from start of parent matrix
+
+	public:
+		/** NULL constructor.  */
+		SubmatrixAdapter() :
+			_Mat(NULL),
+			_row(0),
+			_col(0),
+			_r0(0),
+			_c0(0),
+			_stride(0),
+			_off(0){}
+
+		/** Constructor from an existing @refMatrix
+		 * \param M Pointer to @ref Matrix of which to construct submatrix
+		 */
+		SubmatrixAdapter(const _Matrix& M) :
+			_Mat(&(const_cast<_Matrix&>(M))),
+			_row(M.rowdim()),
+			_col(M.coldim()),
+			_r0(0),
+			_c0(0),
+			_stride(M.coldim()),
+			_off(0){}
+
+		/** Constructor from an existing @ref Matrix and dimensions.
+		 * \param M Pointer to @ref Matrix of which to construct submatrix
+		 * \param row Starting row
+		 * \param col Starting column
+		 * \param Rowdim Row dimension
+		 * \param Coldim Column dimension
+		 */
+		SubmatrixAdapter(
+			const _Matrix& M,
+			size_t row,
+			size_t col,
+			size_t Rowdim,
+			size_t Coldim) :
+			//Init list starts here
+			_Mat(&(const_cast<_Matrix&>(M))),
+			_row(Rowdim),
+			_col(Coldim),
+			_r0(row),
+			_c0(col),
+			_stride(M.coldim()),
+			_off(row * _stride + col){}
+
+		//! BB constructor to reduce warnings in clang
+		SubmatrixAdapter(
+			const _Matrix& M,
+			int row,
+			int col,
+			int Rowdim,
+			int Coldim) :
+			//Init list starts here
+			_Mat(&(const_cast<_Matrix&>(M))),
+			_row((size_t) Rowdim),
+			_col((size_t) Coldim),
+			_r0((size_t) row),
+			_c0((size_t) col),
+			_stride( M.coldim()),
+			_off((size_t) row * _stride + (size_t)col){}
+
+		/** Constructor from an existing @ref SubmatrixAdapter
+		 * \param SM Pointer to @ref SubmatrixAdapter of which to construct submatrix
+		 */
+		SubmatrixAdapter(const SubmatrixAdapter<_Matrix>& SM) :
+			_Mat(SM._Mat),
+			_row(SM._row),
+			_col(SM._col),
+			_r0(SM._r0),
+			_c0(SM._c0),
+			_stride(SM._stride),
+			_off(SM._off){}
+
+		/** Constructor from an existing submatrix and dimensions
+		 * @param SM Constant reference to SubmatrixAdapter from which to
+		 *           construct submatrix
+		 * @param rowbeg Starting row
+		 * @param colbeg Starting column
+		 * @param Rowdim Row dimension
+		 * @param Coldim Column dimension
+		 */
+		SubmatrixAdapter(
+			const SubmatrixAdapter<_Matrix>& SM,
+			size_t row,
+			size_t col,
+			size_t Rowdim,
+			size_t Coldim) :
+			//Init list starts here
+			_Mat(SM._Mat),
+			_row(Rowdim),
+			_col(Coldim),
+			_r0(SM._r0 + row),
+			_c0(SM._c0 + col),
+			_stride(SM._stride),
+			_off(SM._off + (row * _stride + col)){}
+
+		//! BB constructor to reduce warnings in clang
+		SubmatrixAdapter(
+			const SubmatrixAdapter<_Matrix>& SM,
+			int row,
+			int col,
+			int Rowdim,
+			int Coldim) :
+			//Init list starts here
+			_Mat(SM._Mat),
+			_row((size_t)Rowdim),
+			_col((size_t)Coldim),
+			_r0(SM._r0 + (size_t)row),
+			_c0(SM._c0 + (size_t)col),
+			_stride(SM._stride),
+			_off(SM._off + ((size_t)row * _stride + (size_t)col)){}
+
+
+		/** Get the number of rows in the matrix
+		 * @return Number of rows in matrix
+		 */
+		size_t rowdim() const{
+			return _row;
+		}
+
+		/** Get the number of columns in the matrix
+		 * @return Number of columns in matrix
+		 */
+		size_t coldim() const{
+			return _col;
+		}
+
+		/*!�Get the stride of the matrix.
+		 * @return stride of submatrix (number of cols of parent matrix)
+		 */
+		size_t getStride() const{
+			return _stride;
+		}
+
+		/** Set the entry at (i, j).
+		 * @param i Row index of entry, 0...rowdim() - 1
+		 * @param j Column index of entry, 0...coldim() - 1
+		 * @param a_ij Element to set
+		 */
+		void setEntry(size_t i, size_t j, const Element& a_ij){
+			_Mat->setEntry(_r0 + i, _c0 + j, a_ij);
+		}
+
+		/** Get a writeable reference to an entry in the matrix.
+		 * @param i Row index of entry,  0...rowdim() - 1
+		 * @param j Column index of entry, 0...coldim() - 1
+		 * @return Reference to matrix entry
+		 */
+		Element& refEntry(size_t i, size_t j){
+			_Mat->refEntry(_r0 + i, _c0 + j);
+		}
+
+		/** Get a read-only individual entry from the matrix.
+		 * @param i Row index of entry,  0...rowdim() - 1
+		 * @param j Column index of entry, 0...coldim() - 1
+		 * @return Const reference to matrix entry
+		 */
+		const Element& getEntry(size_t i, size_t j) const{
+			return _Mat->getEntry(_r0 + i, _c0 + j);
+		}
+
+		/** Get an entry and store it in the given value.
+		 * This form is more in the Linbox style and is provided for interface
+		 * compatibility with other parts of the library
+		 * @param x Element in which to store result
+		 * @param i Row index of entry,  0...rowdim() - 1
+		 * @param j Column index of entry, 0...coldim() - 1
+		 * @return Reference to x
+		 */
+		Element& getEntry(Element& x, size_t i, size_t j){
+			return _Mat->getEntry(x, _r0 + i, _c0 + j);
+		}
+
+		/** Access the parent matrix
+		 * @return Reference to _Mat
+		 */
+		_Matrix& getMatrix(){
+			return *_Mat;
+		}
+	};
+
+	/**
+	 * Interface for all functionnalities provided
+	 * for BlasMatrix using GPUs.
+	 * @internal
+	 * Done through specialization of some of the member funcions
+	 * defined below.  Otherwise, by default the single processor
+ 	 * BlasMatrixDomain funcions are invoked.
+	 */
+	template <class Field_>
+	class OpenCLMatrixDomain {
+
+	public:
+		typedef Field_                          Field;
+		typedef typename Field::Element         Element;
+		typedef BlasMatrix<Field,typename Vector<Field>::Dense >               Matrix;
+#ifdef __LINBOX_HAVE_OCL
+		friend class OpenCLMatrixDomainFactory;
+#endif
+
+	protected:
+
+		const Field& _F;
+
+#ifdef __LINBOX_HAVE_OCL
+		//OpenCL specific variables
+		cl_context context;
+		cl_device_id device;
+		cl_command_queue commandQue;
+		cl_int errcode;
+
+		//Storage for memory levels
+		unsigned long memCapacity;
+		unsigned long maxBufferSize;
+
+		//Container type flag
+		bool GPUcontainer;
+		bool CPUcontainer;
+		bool setupCorrect;
+		bool doubleSupported;
+
+		//Storage for kernels and flags for availability
+		cl_kernel dpKernels[20];
+		bool dpKernelsAvailable[20];
+		cl_kernel spKernels[20];
+		bool spKernelsAvailable[20];
+
+		//ID number assigned by OpenCLMatrixDomainFactory
+		unsigned int IDnum;
+
+		//Mutex
+		pthread_mutex_t* deviceLock;
+
+		/**
+		 * @internal
+		 * Initializes the OpenCL compute environment
+		 */
+		void oclMatrixDomainAcquire();
+
+		/**
+		 * @internal
+		 * Releases OpenCL cumpute resources
+		 */
+		void oclMatrixDomainRelease(unsigned int IDnum);
+
+		/**
+		 * @internal
+		 * Checks to see if the memory levels required are possible
+		 */
+		template <class Operand1, class Operand2, class Operand3>
+		bool oclMemCheck(
+			Operand1& D,
+			const Operand2& A,
+			const Operand3& B,
+			const Operand1& C) const;
+
+		template <class Operand1>
+		bool oclMemCheck(
+			Operand1& D,
+			Operand1& A,
+			Operand1& B,
+			Operand1& C) const;
+
+		/**
+		 * @internal
+		 * OpenCL memory management functions
+		 */
+		template <typename T, class Operand1>
+		cl_mem oclCreateMatrixBuffer(Operand1 &matrix) const;
+
+		template <typename T, class Operand1>
+		cl_mem oclCreateAndLoadMatrixBuffer(const Operand1 &matrix) const;
+
+		template <typename T, class Operand2>
+		Operand2& oclReadMatrixBuffer(cl_mem buffer, Operand2 &matrix) const;
+
+		template <typename T, class Operand1>
+		cl_mem oclPadMatrix(
+			cl_mem matrixBuffer,
+			int matrixBufferSize,
+			int newDimX,
+			const Operand1 &matrix) const;
+
+		template <typename T, class Operand1>
+		Operand1& oclDepadMatrix(
+			cl_mem matrixBuffer,
+			int matrixBufferSize,
+			int outputSize,
+			int newDimX,
+			Operand1& matrix) const;
+
+		/**
+		 * @internal
+		 * Functions to call the passed kernel on the passed buffers
+		 */
+		template <typename T, typename U>
+		void oclCallKernel(
+			cl_mem bufferC,
+			cl_mem bufferA,
+			cl_mem bufferB,
+			int widthA,
+			int heightA,
+			int widthB,
+			T p,
+			cl_kernel selectedKernel) const;
+
+		template <typename T, typename U>
+		void oclCallKernel(
+			cl_mem bufferD,
+			cl_mem bufferA,
+			cl_mem bufferB,
+			cl_mem bufferC,
+			int widthA,
+			int heightA,
+			int widthB,
+			T p,
+			cl_kernel selectedKernel) const;
+
+		template <typename T, typename U>
+		void oclCallKernel(
+			cl_mem bufferD,
+			cl_mem bufferA,
+			cl_mem bufferB,
+			cl_mem bufferC,
+			T alpha,
+			T beta,
+			int widthA,
+			int heightA,
+			int widthB,
+			T p,
+			cl_kernel selectedKernel) const;
+
+		/**
+		 * @internal
+		 * Functions to partition the matrices into submatrix views
+		 */
+		template <class Operand1, class Operand2, class Operand3>
+		std::vector<int> oclPartition(
+			Operand1& C,
+			const Operand2& A,
+			const Operand3& B,
+			std::vector<SubmatrixAdapter<Operand1> >& VC,
+			std::vector<SubmatrixAdapter<Operand2> >& VA,
+			std::vector<SubmatrixAdapter<Operand3> >& VB) const;
+
+		template <class Operand1, class Operand2, class Operand3>
+		std::vector<int> oclPartition(
+			Operand1& D,
+			const Operand2& A,
+			const Operand3& B,
+			const Operand1& C,
+			std::vector<SubmatrixAdapter<Operand1> >& VD,
+			std::vector<SubmatrixAdapter<Operand2> >& VA,
+			std::vector<SubmatrixAdapter<Operand3> >& VB,
+			std::vector<SubmatrixAdapter<Operand1> >& VC) const;
+
+		void printClErrstring(cl_int err) const;
+#else
+		bool setupCorrect;
+#endif
+	public:
+
+		//! Constructor of OpenCLDomain.
+		OpenCLMatrixDomain(const Field& F ) : _F(F), setupCorrect(false){
+
+#ifndef NDEBUG
+			if(!Givaro::Protected::probab_prime(_F.characteristic())){
+				std::cout << " *** WARNING *** " << std::endl;
+				std::cout << " You are using a OpenCL Matrix Domain"
+				          << " where your field is not prime "
+				          << std::endl;
+			}
+#endif
+
+#ifdef __LINBOX_HAVE_OCL
+			//Initialize OpenCL environment
+			oclMatrixDomainAcquire();
+#endif
+		}
+
+		//! Copy constructor
+		OpenCLMatrixDomain(const OpenCLMatrixDomain<Field> & OMD) :
+			_F(OMD._F),
+			setupCorrect(false){
+
+#ifndef NDEBUG
+			if(!Givaro::Protected::probab_prime(_F.characteristic())){
+				std::cout << " *** WARNING *** " << std::endl;
+				std::cout << " You are using a OpenCL Matrix Domain"
+				          << " where your field is not prime "
+				          << std::endl;
+			}
+#endif
+
+#ifdef __LINBOX_HAVE_OCL
+			//Initialize OpenCL environment
+			oclMatrixDomainAcquire();
+#endif
+		}
+
+		//! Deconstructor
+		~OpenCLMatrixDomain(){
+#ifdef __LINBOX_HAVE_OCL
+			oclMatrixDomainRelease(IDnum);
+#endif
+		}
+
+		//! Field accessor
+		const Field& field() const{
+			return _F;
+		}
+
+		/*
+		 * Basics operation available matrix respecting BlasMatrix interface
+		 */
+
+		//! multiplication.
+		//! C = A*B
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& mul(Operand1& C, const Operand2& A, const Operand3& B) const{
+			return BlasMatrixDomainMul<Field,Operand1,Operand2,Operand3>()(_F,C,A,B);
+		}
+
+		//! addition.
+		//! C = A+B
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& add(Operand1& C, const Operand2& A, const Operand3& B) const{
+			return BlasMatrixDomainAdd<Field,Operand1,Operand2,Operand3>()(_F,C,A,B);
+		}
+
+		//! copy.
+		//! B = A
+		template <class Operand1, class Operand2>
+		Operand1& copy(Operand1& B, const Operand2& A) const{
+			return BlasMatrixDomainCopy<Field,Operand1,Operand2>()(_F,B,A);
+		}
+
+		//! substraction
+		//! C = A-B
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& sub(Operand1& C, const Operand2& A, const Operand3& B) const{
+			return BlasMatrixDomainSub<Field,Operand1,Operand2,Operand3>()(_F,C,A,B);
+		}
+
+		//! substraction (in place)
+		//! C -= B
+		template <class Operand1, class Operand3>
+		Operand1& subin(Operand1& C, const Operand3& B) const{
+			return BlasMatrixDomainSubin<Field,Operand1,Operand3>()(_F,C,B);
+		}
+
+		//! addition (in place)
+		//! C += B
+		template <class Operand1, class Operand3>
+		Operand1& addin(Operand1& C, const Operand3& B) const{
+			return BlasMatrixDomainAddin<Field,Operand1,Operand3>()(_F,C,B);
+		}
+
+		//! multiplication with scaling.
+		//! C = alpha.A*B
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& mul(
+			Operand1& C,
+			const Element& alpha,
+			const Operand2& A,
+			const Operand3& B) const{
+
+			return muladdin(_F.zero,C,alpha,A,B);
+		}
+
+		//! In place multiplication.
+		//! A = A*B
+		template <class Operand1, class Operand2>
+		Operand1& mulin_left(Operand1& A, const Operand2& B) const{
+			return BlasMatrixDomainMulin<Field,Operand1,Operand2>()(_F,A,B);
+		}
+
+		//! In place multiplication.
+		//! B = A*B
+		template <class Operand1, class Operand2>
+		Operand2& mulin_right(const Operand1& A, Operand2& B) const{
+			return BlasMatrixDomainMulin<Field,Operand2,Operand1>()(_F,A,B);
+		}
+
+		//! axpy.
+		//! D = A*B + C
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& axpy(
+			Operand1& D,
+			const Operand2& A,
+			const Operand3& B,
+			const Operand1& C) const{
+
+			return muladd(D,_F.one,C,_F.one,A,B);
+		}
+
+		//! axpyin.
+		//! C += A*B
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& axpyin(Operand1& C, const Operand2& A, const Operand3& B) const{
+			return muladdin(_F.one,C,_F.one,A,B);
+		}
+
+		//! maxpy.
+		//! D = C - A*B
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& maxpy(
+			Operand1& D,
+			const Operand2& A,
+			const Operand3& B,
+			const Operand1& C) const{
+
+			return muladd(D,_F.one,C,_F.mOne,A,B);
+		}
+
+		//! maxpyin.
+		//! C -= A*B
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& maxpyin(Operand1& C, const Operand2& A, const Operand3& B) const{
+			return muladdin(_F.one,C,_F.mOne,A,B);
+		}
+
+		//! axmy.
+		//! D= A*B - C
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& axmy(
+			Operand1& D,
+			const Operand2& A,
+			const Operand3& B,
+			const Operand1& C) const{
+
+			return muladd(D,_F.mOne,C,_F.one,A,B);
+		}
+
+		//! axmyin.
+		//! C = A*B - C
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& axmyin(Operand1& C, const Operand2& A, const Operand3& B) const{
+			return muladdin(_F.mOne,C,_F.one,A,B);
+		}
+
+		//!  general matrix-matrix multiplication and addition with scaling.
+		//! D= beta.C + alpha.A*B
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& muladd(
+			Operand1& D,
+			const Element& beta,
+			const Operand1& C,
+			const Element& alpha,
+			const Operand2& A,
+			const Operand3& B) const{
+
+			return BlasMatrixDomainMulAdd<Operand1,Operand2,Operand3>()(
+				D,
+				beta,
+				C,
+				alpha,
+				A,
+				B);
+		}
+
+		//! muladdin.
+		//! C= beta.C + alpha.A*B.
+		template <class Operand1, class Operand2, class Operand3>
+		Operand1& muladdin(
+			const Element& beta,
+			Operand1& C,
+			const Element& alpha,
+			const Operand2& A,
+			const Operand3& B) const{
+
+			return BlasMatrixDomainMulAdd<Operand1,Operand2,Operand3>()(
+				_F,
+				beta,
+				C,
+				alpha,
+				A,
+				B);
+		}
+
+		/*!
+		 * @name Solutions available for matrix respecting BlasMatrix interface
+		 */
+		//@{
+
+		//! Inversion
+		template <class Matrix>
+		Matrix& inv( Matrix &Ainv, const Matrix &A) const{
+			BlasMatrixDomainInv<Field,Matrix,Matrix>()(_F,Ainv,A);
+			return Ainv;
+		}
+
+		//! Inversion (in place)
+		template <class Matrix>
+		Matrix& invin( Matrix &Ainv, Matrix &A) const{
+			BlasMatrixDomainInv<Field,Matrix,Matrix>()(_F,Ainv,A);
+			return Ainv;
+		}
+
+		//! Inversion (the matrix A is modified)
+		template <class Matrix>
+		Matrix& invin(Matrix &A) const{
+			Matrix tmp(A.rowdim(), A.coldim());
+			tmp = A;
+			BlasMatrixDomainInv<Field,Matrix,Matrix>()(_F,A,tmp);
+			return A;
+		}
+
+		/*! Division.
+		 * C = A B^{-1}  ==>  C . B = A
+		 */
+		template <class Matrix>
+		Matrix& div(Matrix &C, const Matrix &A, const Matrix &B) const{
+			return this->right_solve(C,B,A);
+		}
+
+
+		//! Inversion w singular check
+		template <class Matrix>
+		Matrix& inv(Matrix &Ainv, const Matrix &A, int& nullity) const{
+			nullity = BlasMatrixDomainInv<Field,Matrix,Matrix>()(_F,Ainv,A);
+			return Ainv;
+		}
+
+		//! Inversion (the matrix A is modified) w singular check
+		template <class Matrix>
+		Matrix& invin(Matrix &Ainv, Matrix &A, int& nullity) const{
+			nullity = BlasMatrixDomainInv<Field,Matrix,Matrix>()(_F,Ainv,A);
+			return Ainv;
+		}
+
+		//! Rank
+		template <class Matrix>
+		unsigned int rank(const Matrix &A) const{
+			return BlasMatrixDomainRank<Field,Matrix>()(_F,A);
+		}
+
+		//! in-place Rank (the matrix is modified)
+		template <class Matrix>
+		unsigned int rankin(Matrix &A) const{
+			return BlasMatrixDomainRank<Field, Matrix>()(_F,A);
+		}
+
+		//! determinant
+		template <class Matrix>
+		Element det(const Matrix &A) const{
+			return BlasMatrixDomainDet<Field, Matrix>()(_F,A);
+		}
+
+		//! in-place Determinant (the matrix is modified)
+		template <class Matrix>
+		Element detin(Matrix &A) const{
+			return BlasMatrixDomainDet<Field, Matrix>()(_F,A);
+		}
+		//@}
+
+		/*!
+		 * @name Solvers for Matrix (respecting BlasMatrix interface)
+		 * with Operand as right or left hand side
+		 */
+		//@{
+		//! linear solve with matrix right hand side.
+		//! AX=B
+		template <class Operand, class Matrix>
+		Operand& left_solve (Operand& X, const Matrix& A, const Operand& B) const{
+			return BlasMatrixDomainLeftSolve<Field,Operand,Matrix>()(_F,X,A,B);
+		}
+
+		//! linear solve with matrix right hand side, the result is stored in-place in B.
+		//! @pre A must be square
+		//! AX=B , (B<-X)
+		template <class Operand,class Matrix>
+		Operand& left_solve (const Matrix& A, Operand& B) const{
+			return BlasMatrixDomainLeftSolve<Field,Operand,Matrix>()(_F,A,B);
+		}
+
+		//! linear solve with matrix right hand side.
+		//! XA=B
+		template <class Operand, class Matrix>
+		Operand& right_solve (Operand& X, const Matrix& A, const Operand& B) const{
+			return BlasMatrixDomainRightSolve<Field,Operand,Matrix>()(_F,X,A,B);
+		}
+
+		//! linear solve with matrix right hand side, the result is stored in-place in B.
+		//! @pre A must be square
+		//! XA=B , (B<-X)
+		template <class Operand, class Matrix>
+		Operand& right_solve (const Matrix& A, Operand& B) const{
+			return BlasMatrixDomainRightSolve<Field,Operand,Matrix>()(_F,A,B);
+		}
+
+		//! minimal polynomial computation.
+		template <class Polynomial, class Matrix>
+		Polynomial& minpoly( Polynomial& P, const Matrix& A ) const{
+			return BlasMatrixDomainMinpoly<Field, Polynomial, Matrix>()(_F,P,A);
+		}
+
+		//! characteristic polynomial computation.
+		template <class Polynomial,  class Matrix >
+		Polynomial& charpoly( Polynomial& P, const Matrix& A ) const{
+
+			commentator().start ("Givaro::Modular Dense Charpoly ", "MDCharpoly");
+			std::list<Polynomial> P_list;
+			P_list.clear();
+			BlasMatrixDomainCharpoly<Field, std::list<Polynomial>, Matrix >()(
+				_F,
+				P_list,
+				A);
+
+			Polynomial tmp(A.rowdim() + 1);
+			typename std::list<Polynomial>::iterator it = P_list.begin();
+			P = *(it++);
+			while(it != P_list.end()){
+				// Waiting for an implementation of a domain of polynomials
+				mulpoly(tmp, P, *it);
+				P = tmp;
+				//delete &(*it);
+				++it;
+			}
+			commentator().stop ("done", NULL, "MDCharpoly");
+
+			return P;
+		}
+
+		//! characteristic polynomial computation.
+		template <class Polynomial, class Matrix >
+		std::list<Polynomial>& charpoly(
+			std::list<Polynomial>& P,
+			const Matrix& A ) const{
+
+			return BlasMatrixDomainCharpoly<
+				Field,
+				std::list<Polynomial>,
+				Matrix >()(_F,P,A);
+		}
+
+
+		//private:
+		//! @todo Temporary: waiting for an implementation of a domain of polynomial
+		template<class Polynomial>
+		Polynomial& mulpoly(
+			Polynomial &res,
+			const Polynomial & P1,
+			const Polynomial & P2) const{
+
+			res.resize(P1.size() + P2.size() - 1);
+
+			for(int i = 0; i < res.size(); i++){
+				_F.assign(res[i],_F.zero);
+			}
+
+			for(int i = 0; i < P1.size(); i++){
+				for(int j = 0; j < P2.size(); j++){
+					_F.axpyin(res[i + j],P1[i],P2[j]);
+				}
+			}
+
+			return res;
+		}
+		//@}
+
+		template<class Matrix1, class Matrix2>
+		bool areEqual(const Matrix1 & A, const Matrix2 & B){
+			if((A.rowdim() != B.rowdim()) || (A.coldim() != B.coldim())){
+				return false ;
+			}
+
+			for(size_t i = 0 ; i < A.rowdim() ; ++i){
+				for(size_t j = 0 ; j < A.coldim() ; ++j){
+					if(!_F.areEqual(A.getEntry(i,j),B.getEntry(i,j))){ //!@bug use refs
+						return false ;
+					}
+				}
+			}
+
+			return true ;
+		}
+
+		template<class Matrix>
+		void setIdentity(Matrix & I){
+			for(size_t i = 0 ; i < I.rowdim() ; ++i){
+				for(size_t j = 0 ; j < I.coldim() ; ++j){
+					if(i == j){
+						I.setEntry(i,j,_F.one);
+					}
+					else{
+						I.setEntry(i,j,_F.zero);
+					}
+				}
+			}
+		}
+
+		template<class Matrix>
+		void setZero(Matrix & I){
+			// use Iterator
+			for(size_t i = 0 ; i < I.rowdim() ; ++i){
+				for(size_t j = 0 ; j < I.coldim() ; ++j){
+					I.setEntry(i,j,_F.zero);
+				}
+			}
+		}
+
+		template<class Matrix1>
+		bool isZero(const Matrix1 & A){
+			for(size_t i = 0 ; i < A.rowdim() ; ++i){
+				for(size_t j = 0 ; j < A.coldim() ; ++j){
+					if(!_F.isZero(A.getEntry(i,j))){ //!@bug use refs
+						return false;
+					}
+				}
+			}
+
+			return true ;
+		}
+
+		template<class Matrix1>
+		bool isIdentity(const Matrix1 & A){
+			if(A.rowdim() != A.coldim()){
+				return false;
+			}
+
+			for(size_t i = 0 ; i < A.rowdim() ; ++i){
+				if(!_F.isOne(A.getEntry(i,i))){
+					return false;
+				}
+			}
+
+			for(size_t i = 0 ; i < A.rowdim() ; ++i){
+				for(size_t j = 0 ; j < i ; ++j){
+					if(!_F.isZero(A.getEntry(i,j))){ //!@bug use refs
+						return false;
+					}
+				}
+			}
+
+			for(size_t i = 0 ; i < A.rowdim() ; ++i){
+				for(size_t j = i + 1 ; j < A.coldim() ; ++j){
+					if(!_F.isZero(A.getEntry(i,j))){ //!@bug use refs
+						return false;
+					}
+				}
+			}
+
+			return true ;
+		}
+
+		template<class Matrix1>
+		bool isIdentityGeneralized(const Matrix1 & A){
+			size_t mn = std::min(A.rowdim(),A.coldim());
+			for(size_t i = 0 ; i < mn ; ++i){
+				if(!_F.isOne(A.getEntry(i,i))){
+					return false;
+				}
+			}
+
+			for(size_t i = 0 ; i < A.rowdim() ; ++i){
+				for(size_t j = 0 ; j < std::min(i,mn) ; ++j){
+					if(!_F.isZero(A.getEntry(i,j))){ //!@bug use refs
+						return false;
+					}
+				}
+			}
+
+			for(size_t i = 0 ; i < A.rowdim() ; ++i){
+				for(size_t j = i+1 ; j < A.coldim() ; ++j){
+					if(!_F.isZero(A.getEntry(i,j))){ //!@bug use refs
+						return false;
+					}
+				}
+			}
+
+			return true;
+		}
+
+	//public:
+
+		/** Print matrix.
+		 * @param  os  Output stream to which matrix is written.
+		 * @param  A   Matrix.
+		 * @returns reference to os.
+		 */
+		template <class Matrix>
+		inline std::ostream &write(std::ostream &os, const Matrix &A) const{
+			return A.write(os, _F);
+		}
+
+		template <class Matrix>
+		inline std::ostream &write(std::ostream &os,
+		                           const Matrix &A,
+		                           bool maple_format) const{
+
+			return A.write(os, _F, maple_format);
+		}
+
+		/** Read matrix
+		 * @param  is  Input stream from which matrix is read.
+		 * @param  A   Matrix.
+		 * @returns reference to is.
+		 */
+		template <class Matrix>
+		inline std::istream &read(std::istream &is, Matrix &A) const{
+			return A.read (is, _F);
+		}
+
+	}; /* end of class OpenCLMatrixDomain */
+
+} /* end of namespace LinBox */
+
+#ifdef __LINBOX_HAVE_OCL
+	#include "linbox/matrix/matrixdomain/opencl-domain-factory.h"
+	#include "linbox/matrix/matrixdomain/opencl-domain-util.inl"
+	#include "linbox/matrix/matrixdomain/opencl-domain-memory.inl"
+	#include "linbox/matrix/matrixdomain/opencl-domain.inl"
+#endif
+
+#endif // __LINBOX_opencl_matrix_domain_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/matrixdomain/opencl-domain.inl b/linbox/matrix/matrixdomain/opencl-domain.inl
new file mode 100644
index 0000000..ff6521c
--- /dev/null
+++ b/linbox/matrix/matrixdomain/opencl-domain.inl
@@ -0,0 +1,2459 @@
+/*
+ * Copyright (C) 2011      David Saunders
+ *               2011-2012 Matthew Wezowicz
+ *
+ * Written by Matthew Wezowicz <mwezz at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/** @internal
+ * @file linbox/matrix/matrixdomain/opencl-domain.inl
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_opencl_matrix_domain_INL
+#define __LINBOX_opencl_matrix_domain_INL
+
+#include <pthread.h>
+
+#include "linbox/matrix/densematrix/blas-matrix.h"
+
+#include "CL/cl.h"
+
+namespace LinBox
+{
+
+	/*
+	 * ******************************************************
+	 * *** Specializations for BlasMatrix<Field> where    ***
+	 * *** the Field is Givaro::Modular<float> or Givaro::Modular<double> ***
+	 * ******************************************************
+	 */
+
+	/*
+	 * Specialization of Mul for
+	 * multiplying two general dense matrices
+	 * over a Givaro::Modular<double> Field.
+	 * C = A*B
+	 */
+	template <>
+	template <class Operand1, class Operand2, class Operand3>
+	Operand1& OpenCLMatrixDomain<Givaro::Modular<double> >::mul(
+		Operand1& C,
+		const Operand2& A,
+		const Operand3& B) const{
+
+		//Check if kernels are available
+		bool kernelsAvailable = dpKernelsAvailable[0];
+		kernelsAvailable &= dpKernelsAvailable[1];
+		kernelsAvailable &= dpKernelsAvailable[2];
+		kernelsAvailable &= dpKernelsAvailable[3];
+		kernelsAvailable &= dpKernelsAvailable[8];
+		kernelsAvailable &= dpKernelsAvailable[9];
+		kernelsAvailable &= dpKernelsAvailable[10];
+		kernelsAvailable &= dpKernelsAvailable[11];
+
+		//If it is not capable or not setup properly use default implementation
+		if(!setupCorrect || !doubleSupported || !kernelsAvailable){
+			return BlasMatrixDomainMul<Givaro::Modular<double>,Operand1,Operand2,Operand3>()(
+				_F,
+				C,
+				A,
+				B);
+		}
+
+		//Check dimensions
+		linbox_check( A.coldim() == B.rowdim());
+		linbox_check( C.rowdim() == A.rowdim());
+		linbox_check( C.coldim() == B.coldim());
+
+		//Lock the device
+		pthread_mutex_lock(deviceLock);
+
+		//Partition the input matrices into chuncks that can fit onto the device
+		std::vector<SubmatrixAdapter<Operand1> > VC;
+		std::vector<SubmatrixAdapter<Operand2> > VA;
+		std::vector<SubmatrixAdapter<Operand3> > VB;
+		std::vector<int> partitionDims = oclPartition<Operand1,Operand2,Operand3>(
+			C,
+			A,
+			B,
+			VC,
+			VA,
+			VB);
+
+		//Break out the partitioned dimensions
+		int CBlocksX = partitionDims.at(0);
+		int CBlocksY = partitionDims.at(1);
+		int ABlocksX = partitionDims.at(2);
+		//int ABlocksY = partitionDims.at(3);
+		int BBlocksX = partitionDims.at(4);
+		//nt BBlocksY = partitionDims.at(5);
+
+		double p = (double) _F.characteristic();
+
+		//Select OpenCL kernel based on the size of the modulus factor for
+		//maximum performance
+		//p^2 * n < 2^53
+		cl_kernel selectedMulKernel;
+		cl_kernel selectedAxpyKernel;
+		if(p <= (1 << 21)){
+			selectedMulKernel = dpKernels[3];
+			selectedAxpyKernel = dpKernels[11];
+		}
+		else if(p <= (1 << 24)){
+			selectedMulKernel = dpKernels[2];
+			selectedAxpyKernel = dpKernels[10];
+		}
+		else if(p <= (1 << 25)){
+			selectedMulKernel = dpKernels[1];
+			selectedAxpyKernel = dpKernels[9];
+		}
+		else{
+			selectedMulKernel = dpKernels[0];
+			selectedAxpyKernel = dpKernels[8];
+		}
+
+		for(int blockCol = 0; blockCol < CBlocksX; blockCol++){
+			for(int blockRow = 0; blockRow < CBlocksY; blockRow++){
+
+				SubmatrixAdapter<Operand1> SC = VC.at((size_t)(blockRow * CBlocksX + blockCol));
+				SubmatrixAdapter<Operand2> SA = VA.at((size_t)(blockRow * ABlocksX));
+				SubmatrixAdapter<Operand3> SB = VB.at((size_t)blockCol);
+
+				//Allocate buffers
+				cl_mem bufferC = oclCreateMatrixBuffer<cl_double,
+					SubmatrixAdapter<Operand1> >(SC);
+				cl_mem bufferA = oclCreateAndLoadMatrixBuffer<cl_double,
+					SubmatrixAdapter<Operand2> >(SA);
+				cl_mem bufferB = oclCreateAndLoadMatrixBuffer<cl_double,
+					SubmatrixAdapter<Operand3> >(SB);
+
+				//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+				int widthA  = (int) ((SA.coldim() + 15) / 16) * 16;
+				int heightA = (int) ((SA.rowdim() + 15) / 16) * 16;
+				int widthB  = (int) ((SB.coldim() + 15) / 16) * 16;
+
+				//Call the kernel
+				oclCallKernel<double, cl_double>(
+					bufferC,
+					bufferA,
+					bufferB,
+					widthA,
+					heightA,
+					widthB,
+					p,
+					selectedMulKernel);
+
+				//Block until kernel finishes
+				cl_int tempErrcode;
+				tempErrcode = clFinish(commandQue);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				//Delete OpenCL buffers
+				tempErrcode = clReleaseMemObject(bufferA);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				tempErrcode = clReleaseMemObject(bufferB);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				//Create temporary accumulation buffer
+				cl_mem tempBuffer = oclCreateMatrixBuffer<cl_double,
+					SubmatrixAdapter<Operand1> >(SC);
+
+				for(int sharedDim = 1; sharedDim < ABlocksX; sharedDim++){
+					//Load next blocks onto the device
+					SA = VA.at((size_t)(blockRow * ABlocksX + sharedDim));
+					SB = VB.at((size_t)(blockCol + BBlocksX * sharedDim));
+
+					bufferA = oclCreateAndLoadMatrixBuffer<cl_double,
+						SubmatrixAdapter<Operand2> >(SA);
+					bufferB = oclCreateAndLoadMatrixBuffer<cl_double,
+						SubmatrixAdapter<Operand3> >(SB);
+
+					//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+					int widthA_  = (int) ((SA.coldim() + 15) / 16) * 16;
+					int heightA_ = (int) ((SA.rowdim() + 15) / 16) * 16;
+					int widthB_  = (int) ((SB.coldim() + 15) / 16) * 16;
+
+					//Call the kernel
+					oclCallKernel<double,cl_double>(tempBuffer,
+						bufferA,
+						bufferB,
+						bufferC,
+						widthA_,
+						heightA_,
+						widthB_,
+						p,
+						selectedAxpyKernel);
+
+					//Block until kernel finishes
+					tempErrcode = clFinish(commandQue);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					//Delete OpenCL buffers
+					tempErrcode = clReleaseMemObject(bufferA);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					tempErrcode = clReleaseMemObject(bufferB);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					//Shuffle buffer variables
+					cl_mem placeHolder = bufferC;
+					bufferC = tempBuffer;
+					tempBuffer = placeHolder;
+				}
+
+				//Read back buffer
+				SC = oclReadMatrixBuffer<cl_double,SubmatrixAdapter<Operand1> >(
+					bufferC,
+					SC);
+
+				//Delete OpenCL buffers
+				tempErrcode = clReleaseMemObject(bufferC);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				tempErrcode = clReleaseMemObject(tempBuffer);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+			}
+		}
+
+		//Unlock the device
+		pthread_mutex_unlock(deviceLock);
+
+		return C;
+	}
+
+	/*
+	 * Specialization of Mul for
+	 * multiplying two general dense matrices
+	 * over a Givaro::Modular<float> Field.
+	 * C = A*B
+	 */
+	template <>
+	template <class Operand1, class Operand2, class Operand3>
+	Operand1& OpenCLMatrixDomain<Givaro::Modular<float> >::mul(
+		Operand1& C,
+		const Operand2& A,
+		const Operand3& B) const{
+
+		//Check if kernels are available
+		bool kernelsAvailable = spKernelsAvailable[0];
+		kernelsAvailable &= spKernelsAvailable[1];
+		kernelsAvailable &= spKernelsAvailable[2];
+		kernelsAvailable &= spKernelsAvailable[3];
+		kernelsAvailable &= spKernelsAvailable[8];
+		kernelsAvailable &= spKernelsAvailable[9];
+		kernelsAvailable &= spKernelsAvailable[10];
+		kernelsAvailable &= spKernelsAvailable[11];
+
+		//If it is not capable or not setup properly use default implementation
+		if(!setupCorrect || !kernelsAvailable){
+			return BlasMatrixDomainMul<Givaro::Modular<float>,Operand1,Operand2,Operand3>()(
+				_F,
+				C,
+				A,
+				B);
+		}
+
+		//Check dimensions
+		linbox_check( A.coldim() == B.rowdim());
+		linbox_check( C.rowdim() == A.rowdim());
+		linbox_check( C.coldim() == B.coldim());
+
+		//Lock the device
+		pthread_mutex_lock(deviceLock);
+
+		//Partition the input matrices into chuncks that can fit onto the device
+		std::vector<SubmatrixAdapter<Operand1> > VC;
+		std::vector<SubmatrixAdapter<Operand2> > VA;
+		std::vector<SubmatrixAdapter<Operand3> > VB;
+		std::vector<int> partitionDims = oclPartition<Operand1,Operand2,Operand3>(
+			C,
+			A,
+			B,
+			VC,
+			VA,
+			VB);
+
+		//Break out the partitioned dimensions
+		int CBlocksX = partitionDims.at(0);
+		int CBlocksY = partitionDims.at(1);
+		int ABlocksX = partitionDims.at(2);
+		//int ABlocksY = partitionDims.at(3);
+		int BBlocksX = partitionDims.at(4);
+		//nt BBlocksY = partitionDims.at(5);
+
+		float p = (float) _F.characteristic();
+
+		//Select OpenCL kernel based on the size of the modulus factor for
+		//maximum performance
+		//p^2 * n < 2^53
+		cl_kernel selectedMulKernel;
+		cl_kernel selectedAxpyKernel;
+		if(p <= (1 << 21)){
+			selectedMulKernel = spKernels[3];
+			selectedAxpyKernel = spKernels[11];
+		}
+		else if(p <= (1 << 24)){
+			selectedMulKernel = spKernels[2];
+			selectedAxpyKernel = spKernels[10];
+		}
+		else if(p <= (1 << 25)){
+			selectedMulKernel = spKernels[1];
+			selectedAxpyKernel = spKernels[9];
+		}
+		else{
+			selectedMulKernel = spKernels[0];
+			selectedAxpyKernel = spKernels[8];
+		}
+
+		for(int blockCol = 0; blockCol < CBlocksX; blockCol++){
+			for(int blockRow = 0; blockRow < CBlocksY; blockRow++){
+
+				SubmatrixAdapter<Operand1> SC = VC.at((size_t)(blockRow * CBlocksX + blockCol));
+				SubmatrixAdapter<Operand2> SA = VA.at((size_t)(blockRow * ABlocksX));
+				SubmatrixAdapter<Operand3> SB = VB.at((size_t)blockCol);
+
+				//Allocate buffers
+				cl_mem bufferC = oclCreateMatrixBuffer<cl_float,
+					SubmatrixAdapter<Operand1> >(SC);
+				cl_mem bufferA = oclCreateAndLoadMatrixBuffer<cl_float,
+					SubmatrixAdapter<Operand2> >(SA);
+				cl_mem bufferB = oclCreateAndLoadMatrixBuffer<cl_float,
+					SubmatrixAdapter<Operand3> >(SB);
+
+				//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+				int widthA  = (int) ((SA.coldim() + 15) / 16) * 16;
+				int heightA = (int) ((SA.rowdim() + 15) / 16) * 16;
+				int widthB  = (int) ((SB.coldim() + 15) / 16) * 16;
+
+				//Call the kernel
+				oclCallKernel<float,cl_float>(bufferC,
+					bufferA,
+					bufferB,
+					widthA,
+					heightA,
+					widthB,
+					p,
+					selectedMulKernel);
+
+				//Block until kernel finishes
+				cl_int tempErrcode;
+				tempErrcode = clFinish(commandQue);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				//Delete OpenCL buffers
+				tempErrcode = clReleaseMemObject(bufferA);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				tempErrcode = clReleaseMemObject(bufferB);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				//Create temporary accumulation buffer
+				cl_mem tempBuffer = oclCreateMatrixBuffer<cl_float,
+					SubmatrixAdapter<Operand1> >(SC);
+
+				for(int sharedDim = 1; sharedDim < ABlocksX; sharedDim++){
+					//Load next blocks onto the device
+					SA = VA.at((size_t)(blockRow * ABlocksX + sharedDim));
+					SB = VB.at((size_t)(blockCol + BBlocksX * sharedDim));
+					bufferA = oclCreateAndLoadMatrixBuffer<cl_float,
+						SubmatrixAdapter<Operand2> >(SA);
+					bufferB = oclCreateAndLoadMatrixBuffer<cl_float,
+						SubmatrixAdapter<Operand3> >(SB);
+
+					//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+					int widthA_  = (int) ((SA.coldim() + 15) / 16) * 16;
+					int heightA_ = (int) ((SA.rowdim() + 15) / 16) * 16;
+					int widthB_  = (int) ((SB.coldim() + 15) / 16) * 16;
+
+					//Call the kernel
+					oclCallKernel<float, cl_float>(
+						tempBuffer,
+						bufferA,
+						bufferB,
+						bufferC,
+						widthA_,
+						heightA_,
+						widthB_,
+						p,
+						selectedAxpyKernel);
+
+					//Block until kernel finishes
+					tempErrcode = clFinish(commandQue);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					//Delete OpenCL buffers
+					tempErrcode = clReleaseMemObject(bufferA);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					tempErrcode = clReleaseMemObject(bufferB);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					//Shuffle buffer variables
+					cl_mem placeHolder = bufferC;
+					bufferC = tempBuffer;
+					tempBuffer = placeHolder;
+				}
+
+				//Read back buffer
+				SC = oclReadMatrixBuffer<cl_float,SubmatrixAdapter<Operand1> >(
+					bufferC,
+					SC);
+
+				//Delete OpenCL buffers
+				tempErrcode = clReleaseMemObject(bufferC);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				tempErrcode = clReleaseMemObject(tempBuffer);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+			}
+		}
+
+		//Unlock the device
+		pthread_mutex_unlock(deviceLock);
+
+		return C;
+	}
+
+	/*
+	 * Specialization of mulin_left for
+	 * multiplying two general dense matrices
+	 * over a Givaro::Modular<double> Field.
+	 * Places result into the left matrix.
+	 * A = A*B
+	 */
+	template <>
+	template <class Operand1, class Operand2>
+	Operand1& OpenCLMatrixDomain<Givaro::Modular<double> >::mulin_left(
+		Operand1& A,
+		const Operand2& B) const{
+
+		//Check if kernels are available
+		bool kernelsAvailable = dpKernelsAvailable[0];
+		kernelsAvailable &= dpKernelsAvailable[1];
+		kernelsAvailable &= dpKernelsAvailable[2];
+		kernelsAvailable &= dpKernelsAvailable[3];
+		kernelsAvailable &= dpKernelsAvailable[8];
+		kernelsAvailable &= dpKernelsAvailable[9];
+		kernelsAvailable &= dpKernelsAvailable[10];
+		kernelsAvailable &= dpKernelsAvailable[11];
+
+		//If it is not capable or not setup properly use default implementation
+		if(!setupCorrect || !doubleSupported || !kernelsAvailable){
+			return BlasMatrixDomainMulin<Givaro::Modular<double>,Operand1,Operand2>()(_F,A,B);
+		}
+
+		Operand1 T(A);
+		return mul<Operand1,Operand1,Operand2>(A,T,B);
+	}
+
+	/*
+	 * Specialization of mulin_left for
+	 * multiplying two general dense matrices
+	 * over a Givaro::Modular<float> Field.
+	 * Places the result into the left matrix.
+	 * A = A*B
+	 */
+	template <>
+	template <class Operand1, class Operand2>
+	Operand1& OpenCLMatrixDomain<Givaro::Modular<float> >::mulin_left(
+		Operand1& A,
+		const Operand2& B) const{
+
+		//Check if kernels are available
+		bool kernelsAvailable = spKernelsAvailable[0];
+		kernelsAvailable &= spKernelsAvailable[1];
+		kernelsAvailable &= spKernelsAvailable[2];
+		kernelsAvailable &= spKernelsAvailable[3];
+		kernelsAvailable &= spKernelsAvailable[8];
+		kernelsAvailable &= spKernelsAvailable[9];
+		kernelsAvailable &= spKernelsAvailable[10];
+		kernelsAvailable &= spKernelsAvailable[11];
+
+
+		//If it is not capable or not setup properly use default implementation
+		if(!setupCorrect || !kernelsAvailable){
+			return BlasMatrixDomainMulin<Givaro::Modular<float>,Operand1,Operand2>()(_F,A,B);
+		}
+
+		Operand1 T(A);
+		return mul<Operand1,Operand1,Operand2>(A,T,B);
+	}
+
+	/*
+	 * Specialization of mulin_right for
+	 * multiplying two general dense matrices
+	 * over a Givaro::Modular<double> Field.
+	 * Places the result into the right matrix.
+	 * B = A*B
+	 */
+	template <>
+	template <class Operand1, class Operand2>
+	Operand2& OpenCLMatrixDomain<Givaro::Modular<double> >::mulin_right(
+		const Operand1& A,
+		Operand2& B) const{
+
+		//Check if kernels are available
+		bool kernelsAvailable = dpKernelsAvailable[0];
+		kernelsAvailable &= dpKernelsAvailable[1];
+		kernelsAvailable &= dpKernelsAvailable[2];
+		kernelsAvailable &= dpKernelsAvailable[3];
+		kernelsAvailable &= dpKernelsAvailable[8];
+		kernelsAvailable &= dpKernelsAvailable[9];
+		kernelsAvailable &= dpKernelsAvailable[10];
+		kernelsAvailable &= dpKernelsAvailable[11];
+
+		//If it is not capable or not setup properly use default implementation
+		if(!setupCorrect || !doubleSupported || !kernelsAvailable){
+			return BlasMatrixDomainMulin<Givaro::Modular<double>,Operand2,Operand1>()(_F,A,B);
+		}
+
+		Operand2 T(B);
+		return mul<Operand2,Operand1,Operand2>(B,A,T);
+	}
+
+	/*
+	 * Specialization of mulin_right for
+	 * multiplying two general dense matrices
+	 * over a Givaro::Modular<float> Field.
+	 * Places the result into the right matrix.
+	 * B = A*B
+	 */
+	template <>
+	template <class Operand1, class Operand2>
+	Operand2& OpenCLMatrixDomain<Givaro::Modular<float> >::mulin_right(
+		const Operand1& A,
+		Operand2& B) const{
+
+		//Check if kernels are available
+		bool kernelsAvailable = spKernelsAvailable[0];
+		kernelsAvailable &= spKernelsAvailable[1];
+		kernelsAvailable &= spKernelsAvailable[2];
+		kernelsAvailable &= spKernelsAvailable[3];
+		kernelsAvailable &= spKernelsAvailable[8];
+		kernelsAvailable &= spKernelsAvailable[9];
+		kernelsAvailable &= spKernelsAvailable[10];
+		kernelsAvailable &= spKernelsAvailable[11];
+
+
+		//If it is not capable or not setup properly use default implementation
+		if(!setupCorrect || !kernelsAvailable){
+			return BlasMatrixDomainMulin<Givaro::Modular<float>,Operand2,Operand1>()(_F,A,B);
+		}
+
+		Operand2 T(B);
+		return mul<Operand2,Operand1,Operand2>(B,A,T);
+	}
+
+	/*
+	 * Specialization of general matrix-matrix multiplication and
+	 * addition with scaling over a Givaro::Modular<double> Field
+	 * D = beta.C + alpha.A*B
+	 */
+	template <>
+	template <class Operand1, class Operand2, class Operand3>
+	Operand1& OpenCLMatrixDomain<Givaro::Modular<double> >::muladd(
+		Operand1& D,
+		const double& beta,
+		const Operand1& C,
+		const double& alpha,
+		const Operand2& A,
+		const Operand3& B) const{
+
+		//Check if kernels are available
+		bool kernelsAvailable = dpKernelsAvailable[4];
+		kernelsAvailable &= dpKernelsAvailable[5];
+		kernelsAvailable &= dpKernelsAvailable[6];
+		kernelsAvailable &= dpKernelsAvailable[7];
+
+		//If it is not capable or not setup properly use default implementation
+		if(!setupCorrect || !doubleSupported || !kernelsAvailable){
+			return BlasMatrixDomainMulAdd<//Givaro::Modular<double>,
+				Operand1,
+				Operand2,
+				Operand3>()(D,beta,C,alpha,A,B);
+		}
+
+		//Check dimensions
+		linbox_check( A.coldim() == B.rowdim());
+		linbox_check( C.rowdim() == A.rowdim());
+		linbox_check( C.coldim() == B.coldim());
+		linbox_check( D.rowdim() == C.rowdim());
+		linbox_check( D.coldim() == C.coldim());
+
+		//Lock the device
+		pthread_mutex_lock(deviceLock);
+
+		//Partition the input matrices into chuncks that can fit onto the device
+		std::vector<SubmatrixAdapter<Operand1> > VD;
+		std::vector<SubmatrixAdapter<Operand2> > VA;
+		std::vector<SubmatrixAdapter<Operand3> > VB;
+		std::vector<SubmatrixAdapter<Operand1> > VC;
+		std::vector<int> partitionDims = oclPartition<Operand1,Operand2,Operand3>(
+			D,
+			A,
+			B,
+			C,
+			VD,
+			VA,
+			VB,
+			VC);
+
+		//Break out the partitioned dimensions
+		int DBlocksX = partitionDims.at(0);
+		int DBlocksY = partitionDims.at(1);
+		int ABlocksX = partitionDims.at(2);
+		//int ABlocksY = partitionDims.at(3);
+		int BBlocksX = partitionDims.at(4);
+		//nt BBlocksY = partitionDims.at(5);
+
+		double p = (double) _F.characteristic();
+		double tempAlpha = fmod(alpha, p);
+		double tempBeta = fmod(beta, p);
+
+		// Select OpenCL kernel based on the size of the modulus factor for
+		//maximum performance
+		//p^2 * n < 2^53
+		cl_kernel selectedKernel;
+		if(p <= (1 << 21)){
+			selectedKernel = dpKernels[7];
+		}
+		else if(p <=(1 << 24)){
+			selectedKernel = dpKernels[6];
+		}
+		else if(p <=(1 << 25)){
+			selectedKernel = dpKernels[5];
+		}
+		else{
+			selectedKernel = dpKernels[4];
+		}
+
+		for(int blockCol = 0; blockCol < DBlocksX; blockCol++){
+			for(int blockRow = 0; blockRow < DBlocksY; blockRow++){
+
+				SubmatrixAdapter<Operand1> SD = VD.at((size_t)(blockRow * DBlocksX + blockCol));
+				SubmatrixAdapter<Operand2> SA = VA.at((size_t)(blockRow * ABlocksX));
+				SubmatrixAdapter<Operand3> SB = VB.at((size_t)(blockCol));
+				SubmatrixAdapter<Operand1> SC = VC.at((size_t)(blockRow * DBlocksX + blockCol));
+
+				//Allocate buffers
+				cl_mem bufferD = oclCreateMatrixBuffer<cl_double,
+					SubmatrixAdapter<Operand1> >(SD);
+				cl_mem bufferA = oclCreateAndLoadMatrixBuffer<cl_double,
+					SubmatrixAdapter<Operand2> >(SA);
+				cl_mem bufferB = oclCreateAndLoadMatrixBuffer<cl_double,
+					SubmatrixAdapter<Operand3> >(SB);
+				cl_mem bufferC = oclCreateAndLoadMatrixBuffer<cl_double,
+					SubmatrixAdapter<Operand1> >(SC);
+
+				//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+				int widthA  = (int) ((SA.coldim() + 15) / 16) * 16;
+				int heightA = (int) ((SA.rowdim() + 15) / 16) * 16;
+				int widthB  = (int) ((SB.coldim() + 15) / 16) * 16;
+
+				//Call the kernel
+				oclCallKernel<double,cl_double>(
+					bufferD,
+					bufferA,
+					bufferB,
+					bufferC,
+					tempAlpha,
+					tempBeta,
+					widthA,
+					heightA,
+					widthB,
+					p,
+					selectedKernel);
+
+				//Block until kernel finishes
+				cl_int tempErrcode;
+				tempErrcode = clFinish(commandQue);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				//Delete OpenCL buffers
+				tempErrcode = clReleaseMemObject(bufferA);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				tempErrcode = clReleaseMemObject(bufferB);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				//Create temporary accumulation buffer
+				cl_mem tempBuffer = bufferC;
+				bufferC = bufferD;
+
+				for(int sharedDim = 1; sharedDim < ABlocksX; sharedDim++){
+					//Load next blocks onto the device
+					SA = VA.at((size_t)(blockRow * ABlocksX + sharedDim));
+					SB = VB.at((size_t)(blockCol + BBlocksX * sharedDim));
+					bufferA = oclCreateAndLoadMatrixBuffer<cl_double,
+						SubmatrixAdapter<Operand2> >(SA);
+					bufferB = oclCreateAndLoadMatrixBuffer<cl_double,
+						SubmatrixAdapter<Operand3> >(SB);
+
+					//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+					int widthA_  = (int) ((SA.coldim() + 15) / 16) * 16;
+					int heightA_ = (int) ((SA.rowdim() + 15) / 16) * 16;
+					int widthB_  = (int) ((SB.coldim() + 15) / 16) * 16;
+
+					//Call the kernel
+					oclCallKernel<double,cl_double>(
+						tempBuffer,
+						bufferA,
+						bufferB,
+						bufferC,
+						tempAlpha,
+						_F.one,
+						widthA_,
+						heightA_,
+						widthB_,
+						p,
+						selectedKernel);
+
+					//Block until kernel finishes
+					tempErrcode = clFinish(commandQue);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					//Delete OpenCL buffers
+					tempErrcode = clReleaseMemObject(bufferA);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					tempErrcode = clReleaseMemObject(bufferB);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					//Shuffle buffer variables
+					cl_mem placeHolder = bufferC;
+					bufferC = tempBuffer;
+					tempBuffer = placeHolder;
+				}
+
+				//Read back buffer
+				SD = oclReadMatrixBuffer<cl_double,SubmatrixAdapter<Operand1> >(
+					bufferC,
+					SD);
+
+				//Delete OpenCL buffers
+				tempErrcode = clReleaseMemObject(bufferC);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				tempErrcode = clReleaseMemObject(tempBuffer);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+			}
+		}
+
+		//Unlock the device
+		pthread_mutex_unlock(deviceLock);
+
+		return D;
+	}
+
+	/*
+	 * Specialization of general matrix-matrix multiplication and
+	 * addition with scaling over a Givaro::Modular<float> Field
+	 * D = beta.C + alpha.A*B
+	 */
+	template <>
+	template <class Operand1, class Operand2, class Operand3>
+	Operand1& OpenCLMatrixDomain<Givaro::Modular<float> >::muladd(
+		Operand1& D,
+		const float& beta,
+		const Operand1& C,
+		const float& alpha,
+		const Operand2& A,
+		const Operand3& B) const{
+
+		//Check if kernels are available
+		bool kernelsAvailable = spKernelsAvailable[4];
+		kernelsAvailable &= spKernelsAvailable[5];
+		kernelsAvailable &= spKernelsAvailable[6];
+		kernelsAvailable &= spKernelsAvailable[7];
+
+		//If it is not capable or not setup properly use default implementation
+		if(!setupCorrect || !kernelsAvailable){
+			return BlasMatrixDomainMulAdd<//Givaro::Modular<float>,
+				Operand1,
+				Operand2,
+				Operand3>()(D,beta,C,alpha,A,B);
+		}
+
+		//Check dimensions
+		linbox_check( A.coldim() == B.rowdim());
+		linbox_check( C.rowdim() == A.rowdim());
+		linbox_check( C.coldim() == B.coldim());
+		linbox_check( D.rowdim() == C.rowdim());
+		linbox_check( D.coldim() == C.coldim());
+
+		//Lock the device
+		pthread_mutex_lock(deviceLock);
+
+		//Partition the input matrices into chuncks that can fit onto the device
+		std::vector<SubmatrixAdapter<Operand1> > VD;
+		std::vector<SubmatrixAdapter<Operand2> > VA;
+		std::vector<SubmatrixAdapter<Operand3> > VB;
+		std::vector<SubmatrixAdapter<Operand1> > VC;
+		std::vector<int> partitionDims = oclPartition<Operand1,Operand2,Operand3>(
+			D,
+			A,
+			B,
+			C,
+			VD,
+			VA,
+			VB,
+			VC);
+
+		//Break out the partitioned dimensions
+		int DBlocksX = partitionDims.at(0);
+		int DBlocksY = partitionDims.at(1);
+		int ABlocksX = partitionDims.at(2);
+		//int ABlocksY = partitionDims.at(3);
+		int BBlocksX = partitionDims.at(4);
+		//nt BBlocksY = partitionDims.at(5);
+
+		float p = (float) _F.characteristic();
+		float tempAlpha = fmodf(alpha, p);
+		float tempBeta = fmodf(beta, p);
+
+		// Select OpenCL kernel based on the size of the modulus factor for
+		//maximum performance
+		//p^2 * n < 2^23
+		cl_kernel selectedKernel;
+		if(p <= (1 << 7)){
+			selectedKernel = spKernels[7];
+		}
+		else if(p <=(1 << 9)){
+			selectedKernel = spKernels[6];
+		}
+		else if(p <=(1 << 10)){
+			selectedKernel = spKernels[5];
+		}
+		else{
+			selectedKernel = spKernels[4];
+		}
+
+		for(int blockCol = 0; blockCol < DBlocksX; blockCol++){
+			for(int blockRow = 0; blockRow < DBlocksY; blockRow++){
+
+				SubmatrixAdapter<Operand1> SD = VD.at((size_t)(blockRow * DBlocksX + blockCol));
+				SubmatrixAdapter<Operand2> SA = VA.at((size_t)(blockRow * ABlocksX));
+				SubmatrixAdapter<Operand3> SB = VB.at((size_t)(blockCol));
+				SubmatrixAdapter<Operand1> SC = VC.at((size_t)(blockRow * DBlocksX + blockCol));
+
+				//Allocate buffers
+				cl_mem bufferD = oclCreateMatrixBuffer<cl_float,
+					SubmatrixAdapter<Operand1> >(SD);
+				cl_mem bufferA = oclCreateAndLoadMatrixBuffer<cl_float,
+					SubmatrixAdapter<Operand2> >(SA);
+				cl_mem bufferB = oclCreateAndLoadMatrixBuffer<cl_float,
+					SubmatrixAdapter<Operand3> >(SB);
+				cl_mem bufferC = oclCreateAndLoadMatrixBuffer<cl_float,
+					SubmatrixAdapter<Operand1> >(SC);
+
+				//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+				int widthA  = (int) ((SA.coldim() + 15) / 16) * 16;
+				int heightA = (int) ((SA.rowdim() + 15) / 16) * 16;
+				int widthB  = (int) ((SB.coldim() + 15) / 16) * 16;
+
+				//Call the kernel
+				oclCallKernel<float,cl_float>(
+					bufferD,
+					bufferA,
+					bufferB,
+					bufferC,
+					tempAlpha,
+					tempBeta,
+					widthA,
+					heightA,
+					widthB,
+					p,
+					selectedKernel);
+
+				//Block until kernel finishes
+				cl_int tempErrcode;
+				tempErrcode = clFinish(commandQue);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				//Delete OpenCL buffers
+				tempErrcode = clReleaseMemObject(bufferA);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				tempErrcode = clReleaseMemObject(bufferB);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				//Create temporary accumulation buffer
+				cl_mem tempBuffer = bufferC;
+				bufferC = bufferD;
+
+				for(int sharedDim = 1; sharedDim < ABlocksX; sharedDim++){
+					//Load next blocks onto the device
+					SA = VA.at((size_t)(blockRow * ABlocksX + sharedDim));
+					SB = VB.at((size_t)(blockCol + BBlocksX *sharedDim));
+					bufferA = oclCreateAndLoadMatrixBuffer<cl_float,
+						SubmatrixAdapter<Operand2> >(SA);
+					bufferB = oclCreateAndLoadMatrixBuffer<cl_float,
+						SubmatrixAdapter<Operand3> >(SB);
+
+					//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+					int widthA_  = (int) ((SA.coldim() + 15) / 16) * 16;
+					int heightA_ = (int) ((SA.rowdim() + 15) / 16) * 16;
+					int widthB_  = (int) ((SB.coldim() + 15) / 16) * 16;
+
+					//Call the kernel
+					oclCallKernel<float,cl_float>(
+						tempBuffer,
+						bufferA,
+						bufferB,
+						bufferC,
+						tempAlpha,
+						_F.one,
+						widthA_,
+						heightA_,
+						widthB_,
+						p,
+						selectedKernel);
+
+					//Block until kernel finishes
+					tempErrcode = clFinish(commandQue);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					//Delete OpenCL buffers
+					tempErrcode = clReleaseMemObject(bufferA);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					tempErrcode = clReleaseMemObject(bufferB);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					//Shuffle buffer variables
+					cl_mem placeHolder = bufferC;
+					bufferC = tempBuffer;
+					tempBuffer = placeHolder;
+				}
+
+				//Read back buffer
+				SD = oclReadMatrixBuffer<cl_float,SubmatrixAdapter<Operand1> >(
+					bufferC,
+					SD);
+
+				//Delete OpenCL buffers
+				tempErrcode = clReleaseMemObject(bufferC);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				tempErrcode = clReleaseMemObject(tempBuffer);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+			}
+		}
+
+		//Unlock the device
+		pthread_mutex_unlock(deviceLock);
+
+		return D;
+	}
+
+	/*
+	 * Specialization of general matrix-matrix multiplication and
+	 * addition with scaling over a Givaro::Modular<double> Field
+	 * Places the results into the first genreral dense matrix
+	 * C = beta.C + alpha.A*B
+	 */
+	template <>
+	template <class Operand1, class Operand2, class Operand3>
+	Operand1& OpenCLMatrixDomain<Givaro::Modular<double> >::muladdin(
+		const double& beta,
+		Operand1& C,
+		const double& alpha,
+		const Operand2& A,
+		const Operand3& B) const{
+
+		//Check if kernels are available
+		bool kernelsAvailable = dpKernelsAvailable[4];
+		kernelsAvailable &= dpKernelsAvailable[5];
+		kernelsAvailable &= dpKernelsAvailable[6];
+		kernelsAvailable &= dpKernelsAvailable[7];
+
+		//If it is not capable or not setup properly use default implementation
+		if(!setupCorrect || !doubleSupported || !kernelsAvailable){
+			return BlasMatrixDomainMulAdd<//Givaro::Modular<double>,
+				Operand1,
+				Operand2,
+				Operand3>()(beta,C,alpha,A,B);
+		}
+
+		Operand1 T(C);
+		return muladd<Operand1,Operand2,Operand3>(C,beta,T,alpha,A,B);
+	}
+
+	/*
+	 * Specialization of general matrix-matrix multiplication and
+	 * addition with scaling over a Givaro::Modular<float> Field
+	 * Places the results into the first genreral dense matrix
+	 * C = beta.C + alpha.A*B
+	 */
+	template <>
+	template <class Operand1, class Operand2, class Operand3>
+	Operand1& OpenCLMatrixDomain<Givaro::Modular<float> >::muladdin(
+		const float& beta,
+		Operand1& C,
+		const float& alpha,
+		const Operand2& A,
+		const Operand3& B) const{
+
+		//Check if kernels are available
+		bool kernelsAvailable = spKernelsAvailable[4];
+		kernelsAvailable &= spKernelsAvailable[5];
+		kernelsAvailable &= spKernelsAvailable[6];
+		kernelsAvailable &= spKernelsAvailable[7];
+
+		//If it is not capable or not setup properly use default implementation
+		if(!setupCorrect || !kernelsAvailable){
+			return BlasMatrixDomainMulAdd<//Givaro::Modular<float>,
+				Operand1,
+				Operand2,
+				Operand3>()(beta,C,alpha,A,B);
+		}
+
+		Operand1 T(C);
+		return muladd<Operand1,Operand2,Operand3>(C,beta,T,alpha,A,B);
+	}
+
+	/*
+	 * Specialization of multiplication with scaling over
+	 * a Givaro::Modular<double> Field
+	 * C = alpha.A*B
+	 */
+	template <>
+	template <class Operand1, class Operand2, class Operand3>
+	Operand1& OpenCLMatrixDomain<Givaro::Modular<double> >::mul(
+		Operand1& C,
+		const double& alpha,
+		const Operand2& A,
+		const Operand3& B) const{
+
+		return muladdin<Operand1,Operand2,Operand3>(0,C,alpha,A,B);
+	}
+
+	/*
+	 * Specialization of multiplication with scaling over
+	 * a Givaro::Modular<float> Field
+	 * C = alpha.A*B
+	 */
+	template <>
+	template <class Operand1, class Operand2, class Operand3>
+	Operand1& OpenCLMatrixDomain<Givaro::Modular<float> >::mul(
+		Operand1& C,
+		const float& alpha,
+		const Operand2& A,
+		const Operand3& B) const{
+
+		return muladdin<Operand1,Operand2,Operand3>(0,C,alpha,A,B);
+	}
+
+	/*
+	 * Specialization of apxy for
+	 * multiplying two general dense matrices
+	 * and adding a third general dense matrix
+	 * over a Givaro::Modular<double> Field.
+	 * D = A*B + C
+	 */
+	template <>
+	template <class Operand1, class Operand2, class Operand3>
+	Operand1& OpenCLMatrixDomain<Givaro::Modular<double> >::axpy(
+		Operand1& D,
+		const Operand2& A,
+		const Operand3& B,
+		const Operand1& C) const{
+
+		//Check if kernels are available
+		bool kernelsAvailable = dpKernelsAvailable[8];
+		kernelsAvailable &= dpKernelsAvailable[9];
+		kernelsAvailable &= dpKernelsAvailable[10];
+		kernelsAvailable &= dpKernelsAvailable[11];
+
+		//If it is not capable or not setup properly use default implementation
+		if(!setupCorrect || !doubleSupported || !kernelsAvailable){
+			return BlasMatrixDomainMulAdd<//Givaro::Modular<double>,
+				Operand1,
+				Operand2,
+				Operand3>()(D,_F.one,C,_F.one,A,B);
+		}
+
+		//Check dimensions
+		linbox_check( A.coldim() == B.rowdim());
+		linbox_check( C.rowdim() == A.rowdim());
+		linbox_check( C.coldim() == B.coldim());
+		linbox_check( D.rowdim() == C.rowdim());
+		linbox_check( D.coldim() == C.coldim());
+
+		//Lock the device
+		pthread_mutex_lock(deviceLock);
+
+		//Partition the input matrices into chuncks that can fit onto the device
+		std::vector<SubmatrixAdapter<Operand1> > VD;
+		std::vector<SubmatrixAdapter<Operand2> > VA;
+		std::vector<SubmatrixAdapter<Operand3> > VB;
+		std::vector<SubmatrixAdapter<Operand1> > VC;
+		std::vector<int> partitionDims = oclPartition<Operand1,Operand2,Operand3>(
+			D,
+			A,
+			B,
+			C,
+			VD,
+			VA,
+			VB,
+			VC);
+
+		//Break out the partitioned dimensions
+		int DBlocksX = partitionDims.at(0);
+		int DBlocksY = partitionDims.at(1);
+		int ABlocksX = partitionDims.at(2);
+		//int ABlocksY = partitionDims.at(3);
+		int BBlocksX = partitionDims.at(4);
+		//nt BBlocksY = partitionDims.at(5);
+
+		double p = (double)_F.characteristic();
+
+		// Select OpenCL kernel based on the size of the modulus factor for
+		//maximum performance
+		//p^2 * n < 2^53
+		cl_kernel selectedKernel;
+		if(p <= (1 << 21)){
+			selectedKernel = dpKernels[11];
+		}
+		else if(p <= (1 << 24)){
+			selectedKernel = dpKernels[10];
+		}
+		else if(p <= (1 << 25)){
+			selectedKernel = dpKernels[9];
+		}
+		else{
+			selectedKernel = dpKernels[8];
+		}
+
+		for(int blockCol = 0; blockCol < DBlocksX; blockCol++){
+			for(int blockRow = 0; blockRow < DBlocksY; blockRow++){
+
+				SubmatrixAdapter<Operand1> SD = VD.at((size_t)(blockRow * DBlocksX + blockCol));
+				SubmatrixAdapter<Operand2> SA = VA.at((size_t)(blockRow * ABlocksX));
+				SubmatrixAdapter<Operand3> SB = VB.at((size_t)(blockCol));
+				SubmatrixAdapter<Operand1> SC = VC.at((size_t)(blockRow * DBlocksX + blockCol));
+
+				//Allocate buffers
+				cl_mem bufferD = oclCreateMatrixBuffer<cl_double,
+					SubmatrixAdapter<Operand1> >(SD);
+				cl_mem bufferA = oclCreateAndLoadMatrixBuffer<cl_double,
+					SubmatrixAdapter<Operand2> >(SA);
+				cl_mem bufferB = oclCreateAndLoadMatrixBuffer<cl_double,
+					SubmatrixAdapter<Operand3> >(SB);
+				cl_mem bufferC = oclCreateAndLoadMatrixBuffer<cl_double,
+					SubmatrixAdapter<Operand1> >(SC);
+
+				//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+				int widthA  = (int) ((SA.coldim() + 15) / 16) * 16;
+				int heightA = (int) ((SA.rowdim() + 15) / 16) * 16;
+				int widthB  = (int) ((SB.coldim() + 15) / 16) * 16;
+
+				//Call the kernel
+				oclCallKernel<double,cl_double>(
+					bufferD,
+					bufferA,
+					bufferB,
+					bufferC,
+					widthA,
+					heightA,
+					widthB,
+					p,
+					selectedKernel);
+
+				//Block until kernel finishes
+				cl_int tempErrcode;
+				tempErrcode = clFinish(commandQue);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				//Delete OpenCL buffers
+				tempErrcode = clReleaseMemObject(bufferA);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				tempErrcode = clReleaseMemObject(bufferB);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				//Create temporary accumulation buffer
+				cl_mem tempBuffer = bufferC;
+				bufferC = bufferD;
+
+				for(int sharedDim = 1; sharedDim < ABlocksX; sharedDim++){
+					//Load next blocks onto the device
+					SA = VA.at((size_t)(blockRow * ABlocksX + sharedDim));
+					SB = VB.at((size_t)(blockCol + BBlocksX * sharedDim));
+					bufferA = oclCreateAndLoadMatrixBuffer<cl_double,
+						SubmatrixAdapter<Operand2> >(SA);
+					bufferB = oclCreateAndLoadMatrixBuffer<cl_double,
+						SubmatrixAdapter<Operand3> >(SB);
+
+					//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+					int widthA_  = (int) ((SA.coldim() + 15) / 16) * 16;
+					int heightA_ = (int) ((SA.rowdim() + 15) / 16) * 16;
+					int widthB_  = (int) ((SB.coldim() + 15) / 16) * 16;
+
+					//Call the kernel
+					oclCallKernel<double,cl_double>(
+						tempBuffer,
+						bufferA,
+						bufferB,
+						bufferC,
+						widthA_,
+						heightA_,
+						widthB_,
+						p,
+						selectedKernel);
+
+					//Block until kernel finishes
+					tempErrcode = clFinish(commandQue);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					//Delete OpenCL buffers
+					tempErrcode = clReleaseMemObject(bufferA);
+					linbox_check(tempErrcode == CL_SUCCESS);
+
+					tempErrcode = clReleaseMemObject(bufferB);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					//Shuffle buffer variables
+					cl_mem placeHolder = bufferC;
+					bufferC = tempBuffer;
+					tempBuffer = placeHolder;
+				}
+
+				//Read back buffer
+				SD = oclReadMatrixBuffer<cl_double,SubmatrixAdapter<Operand1> >(
+					bufferC,
+					SD);
+
+				//Delete OpenCL buffers
+				tempErrcode = clReleaseMemObject(bufferC);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				tempErrcode = clReleaseMemObject(tempBuffer);
+				linbox_check(tempErrcode == CL_SUCCESS);
+			}
+		}
+
+		//Unlock the device
+		pthread_mutex_unlock(deviceLock);
+
+		return D;
+	}
+
+	/*
+	 * Specialization of apxy for
+	 * multiplying two general dense matrices
+	 * and adding a third general dense matrix
+	 * over a Givaro::Modular<float> Field.
+	 * D = A*B + C
+	 */
+	template <>
+	template <class Operand1, class Operand2, class Operand3>
+	Operand1& OpenCLMatrixDomain<Givaro::Modular<float> >::axpy(
+		Operand1& D,
+		const Operand2& A,
+		const Operand3& B,
+		const Operand1& C) const{
+
+		//Check if kernels are available
+		bool kernelsAvailable = spKernelsAvailable[8];
+		kernelsAvailable &= spKernelsAvailable[9];
+		kernelsAvailable &= spKernelsAvailable[10];
+		kernelsAvailable &= spKernelsAvailable[11];
+
+		//If it is not capable or not setup properly use default implementation
+		if(!setupCorrect || !kernelsAvailable){
+			return BlasMatrixDomainMulAdd<//Givaro::Modular<float>,
+				Operand1,
+				Operand2,
+				Operand3>()(D,_F.one,C,_F.one,A,B);
+		}
+
+		//Check dimensions
+		linbox_check( A.coldim() == B.rowdim());
+		linbox_check( C.rowdim() == A.rowdim());
+		linbox_check( C.coldim() == B.coldim());
+		linbox_check( D.rowdim() == C.rowdim());
+		linbox_check( D.coldim() == C.coldim());
+
+		//Lock the device
+		pthread_mutex_lock(deviceLock);
+
+		//Partition the input matrices into chuncks that can fit onto the device
+		std::vector<SubmatrixAdapter<Operand1> > VD;
+		std::vector<SubmatrixAdapter<Operand2> > VA;
+		std::vector<SubmatrixAdapter<Operand3> > VB;
+		std::vector<SubmatrixAdapter<Operand1> > VC;
+		std::vector<int> partitionDims = oclPartition<Operand1,Operand2,Operand3>(
+			D,
+			A,
+			B,
+			C,
+			VD,
+			VA,
+			VB,
+			VC);
+
+		//Break out the partitioned dimensions
+		int DBlocksX = partitionDims.at(0);
+		int DBlocksY = partitionDims.at(1);
+		int ABlocksX = partitionDims.at(2);
+		//int ABlocksY = partitionDims.at(3);
+		int BBlocksX = partitionDims.at(4);
+		//nt BBlocksY = partitionDims.at(5);
+
+		float p = (float)_F.characteristic();
+
+		// Select OpenCL kernel based on the size of the modulus factor for
+		//maximum performance
+		//p^2 * n < 2^23
+		cl_kernel selectedKernel;
+		if(p <= (1 << 7)){
+			selectedKernel = spKernels[11];
+		}
+		else if(p <= (1 << 9)){
+			selectedKernel = spKernels[10];
+		}
+		else if(p <= (1 << 10)){
+			selectedKernel = spKernels[9];
+		}
+		else{
+			selectedKernel = spKernels[8];
+		}
+
+		for(int blockCol = 0; blockCol < DBlocksX; blockCol++){
+			for(int blockRow = 0; blockRow < DBlocksY; blockRow++){
+
+				SubmatrixAdapter<Operand1> SD = VD.at((size_t)(blockRow * DBlocksX + blockCol));
+				SubmatrixAdapter<Operand2> SA = VA.at((size_t)(blockRow * ABlocksX));
+				SubmatrixAdapter<Operand3> SB = VB.at((size_t)(blockCol));
+				SubmatrixAdapter<Operand1> SC = VC.at((size_t)(blockRow * DBlocksX + blockCol));
+
+				//Allocate buffers
+				cl_mem bufferD = oclCreateMatrixBuffer<cl_float,
+					SubmatrixAdapter<Operand1> >(SD);
+				cl_mem bufferA = oclCreateAndLoadMatrixBuffer<cl_float,
+					SubmatrixAdapter<Operand2> >(SA);
+				cl_mem bufferB = oclCreateAndLoadMatrixBuffer<cl_float,
+					SubmatrixAdapter<Operand3> >(SB);
+				cl_mem bufferC = oclCreateAndLoadMatrixBuffer<cl_float,
+					SubmatrixAdapter<Operand1> >(SC);
+
+				//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+				int widthA  = (int) ((SA.coldim() + 15) / 16) * 16;
+				int heightA = (int) ((SA.rowdim() + 15) / 16) * 16;
+				int widthB  = (int) ((SB.coldim() + 15) / 16) * 16;
+
+				//Call the kernel
+				oclCallKernel<float,cl_float>(
+					bufferD,
+					bufferA,
+					bufferB,
+					bufferC,
+					widthA,
+					heightA,
+					widthB,
+					p,
+					selectedKernel);
+
+				//Block until kernel finishes
+				cl_int tempErrcode;
+				tempErrcode = clFinish(commandQue);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				//Delete OpenCL buffers
+				tempErrcode = clReleaseMemObject(bufferA);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				tempErrcode = clReleaseMemObject(bufferB);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+
+				//Create temporary accumulation buffer
+				cl_mem tempBuffer = bufferC;
+				bufferC = bufferD;
+
+				for(int sharedDim = 1; sharedDim < ABlocksX; sharedDim++){
+					//Load next blocks onto the device
+					SA = VA.at((size_t)(blockRow * ABlocksX + sharedDim));
+					SB = VB.at((size_t)(blockCol + BBlocksX * sharedDim));
+					bufferA = oclCreateAndLoadMatrixBuffer<cl_float,
+						SubmatrixAdapter<Operand2> >(SA);
+					bufferB = oclCreateAndLoadMatrixBuffer<cl_float,
+						SubmatrixAdapter<Operand3> >(SB);
+
+					//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+					int widthA_  = (int) ((SA.coldim() + 15) / 16) * 16;
+					int heightA_ = (int) ((SA.rowdim() + 15) / 16) * 16;
+					int widthB_  = (int) ((SB.coldim() + 15) / 16) * 16;
+
+					//Call the kernel
+					oclCallKernel<float,cl_float>(
+						tempBuffer,
+						bufferA,
+						bufferB,
+						bufferC,
+						widthA_,
+						heightA_,
+						widthB_,
+						p,
+						selectedKernel);
+
+					//Block until kernel finishes
+					tempErrcode = clFinish(commandQue);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					//Delete OpenCL buffers
+					tempErrcode = clReleaseMemObject(bufferA);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					tempErrcode = clReleaseMemObject(bufferB);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					//Shuffle buffer variables
+					cl_mem placeHolder = bufferC;
+					bufferC = tempBuffer;
+					tempBuffer = placeHolder;
+				}
+
+				//Read back buffer
+				SD = oclReadMatrixBuffer<cl_float,SubmatrixAdapter<Operand1> >(
+					bufferC,
+					SD);
+
+				//Delete OpenCL buffers
+				tempErrcode = clReleaseMemObject(bufferC);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				tempErrcode = clReleaseMemObject(tempBuffer);
+				linbox_check(tempErrcode == CL_SUCCESS);
+			}
+		}
+
+		//Unlock the device
+		pthread_mutex_unlock(deviceLock);
+
+		return D;
+	}
+
+	/*
+	 * Specialization of apxyin for
+	 * multiplying two general dense matrices
+	 * and adding a third general dense matrix
+	 * over a Givaro::Modular<double> Field.
+	 * Places the result into the first matrix.
+	 * C += A*B
+	 */
+	template <>
+	template <class Operand1, class Operand2, class Operand3>
+	Operand1& OpenCLMatrixDomain<Givaro::Modular<double> >::axpyin(
+		Operand1& C,
+		const Operand2& A,
+		const Operand3& B) const{
+
+		//Check if kernels are available
+		bool kernelsAvailable = dpKernelsAvailable[8];
+		kernelsAvailable &= dpKernelsAvailable[9];
+		kernelsAvailable &= dpKernelsAvailable[10];
+		kernelsAvailable &= dpKernelsAvailable[11];
+
+		//If it is not capable or not setup properly use default implementation
+		if(!setupCorrect || !doubleSupported || !kernelsAvailable){
+			return muladdin<Operand1,Operand2,Operand3>(_F.one,C,_F.one,A,B);
+		}
+
+		Operand1 T(C);
+		return axpy<Operand1,Operand2,Operand3>(C,A,B,T);
+	}
+
+	/*
+	 * Specialization of apxyin for
+	 * multiplying two general dense matrices
+	 * and adding a third general dense matrix
+	 * over a Givaro::Modular<float> Field.
+	 * Places the result into the first matrix.
+	 * C += A*B
+	 */
+	template <>
+	template <class Operand1, class Operand2, class Operand3>
+	Operand1& OpenCLMatrixDomain<Givaro::Modular<float> >::axpyin(
+		Operand1& C,
+		const Operand2& A,
+		const Operand3& B) const{
+
+		//Check if kernels are available
+		bool kernelsAvailable = spKernelsAvailable[8];
+		kernelsAvailable &= spKernelsAvailable[9];
+		kernelsAvailable &= spKernelsAvailable[10];
+		kernelsAvailable &= spKernelsAvailable[11];
+
+		//If it is not capable or not setup properly use default implementation
+		if(!setupCorrect || !kernelsAvailable){
+			return muladdin<Operand1,Operand2,Operand3>(_F.one,C,_F.one,A,B);
+		}
+
+		Operand1 T(C);
+		return axpy<Operand1,Operand2,Operand3>(C,A,B,T);
+	}
+
+	/*
+	 * Specialization of maxpy for
+	 * multiplying two general dense matrices
+	 * and subtracts it from a third general dense matrix
+	 * over a Givaro::Modular<double> Field.
+	 * D = C - A*B
+	 */
+	template <>
+	template <class Operand1, class Operand2, class Operand3>
+	Operand1& OpenCLMatrixDomain<Givaro::Modular<double> >::maxpy(
+		Operand1& D,
+		const Operand2& A,
+		const Operand3& B,
+		const Operand1& C) const{
+
+		//Check if kernels are available
+		bool kernelsAvailable = dpKernelsAvailable[12];
+		kernelsAvailable &= dpKernelsAvailable[13];
+		kernelsAvailable &= dpKernelsAvailable[14];
+		kernelsAvailable &= dpKernelsAvailable[15];
+
+		//If it is not capable or not setup properly use default implementation
+		if(!setupCorrect || !doubleSupported || !kernelsAvailable){
+			return BlasMatrixDomainMulAdd<//Givaro::Modular<double>,
+				Operand1,
+				Operand2,
+				Operand3>()(D,_F.one,C,_F.mOne,A,B);
+		}
+
+		//Check dimensions
+		linbox_check( A.coldim() == B.rowdim());
+		linbox_check( C.rowdim() == A.rowdim());
+		linbox_check( C.coldim() == B.coldim());
+		linbox_check( D.rowdim() == C.rowdim());
+		linbox_check( D.coldim() == C.coldim());
+
+		//Lock the device
+		pthread_mutex_lock(deviceLock);
+
+		//Partition the input matrices into chuncks that can fit onto the device
+		std::vector<SubmatrixAdapter<Operand1> > VD;
+		std::vector<SubmatrixAdapter<Operand2> > VA;
+		std::vector<SubmatrixAdapter<Operand3> > VB;
+		std::vector<SubmatrixAdapter<Operand1> > VC;
+		std::vector<int> partitionDims = oclPartition<Operand1,Operand2,Operand3>(
+			D,
+			A,
+			B,
+			C,
+			VD,
+			VA,
+			VB,
+			VC);
+
+		//Break out the partitioned dimensions
+		int DBlocksX = partitionDims.at(0);
+		int DBlocksY = partitionDims.at(1);
+		int ABlocksX = partitionDims.at(2);
+		//int ABlocksY = partitionDims.at(3);
+		int BBlocksX = partitionDims.at(4);
+		//nt BBlocksY = partitionDims.at(5);
+
+		double p = (double)_F.characteristic();
+
+		// Select OpenCL kernel based on the size of the modulus factor for
+		//maximum performance
+		//p^2 * n < 2^53
+		cl_kernel selectedKernel;
+		if(p <= (1 << 21)){
+			selectedKernel = dpKernels[15];
+		}
+		else if(p <= (1 << 24)){
+			selectedKernel = dpKernels[14];
+		}
+		else if(p <= (1 << 25)){
+			selectedKernel = dpKernels[13];
+		}
+		else{
+			selectedKernel = dpKernels[12];
+		}
+
+		for(int blockCol = 0; blockCol < DBlocksX; blockCol++){
+			for(int blockRow = 0; blockRow < DBlocksY; blockRow++){
+
+				SubmatrixAdapter<Operand1> SD = VD.at((size_t)(blockRow * DBlocksX + blockCol));
+				SubmatrixAdapter<Operand2> SA = VA.at((size_t)(blockRow * ABlocksX));
+				SubmatrixAdapter<Operand3> SB = VB.at((size_t)(blockCol));
+				SubmatrixAdapter<Operand1> SC = VC.at((size_t)(blockRow * DBlocksX + blockCol));
+
+				//Allocate buffers
+				cl_mem bufferD = oclCreateMatrixBuffer<cl_double,
+					SubmatrixAdapter<Operand1> >(SD);
+				cl_mem bufferA = oclCreateAndLoadMatrixBuffer<cl_double,
+					SubmatrixAdapter<Operand2> >(SA);
+				cl_mem bufferB = oclCreateAndLoadMatrixBuffer<cl_double,
+					SubmatrixAdapter<Operand3> >(SB);
+				cl_mem bufferC = oclCreateAndLoadMatrixBuffer<cl_double,
+					SubmatrixAdapter<Operand1> >(SC);
+
+				//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+				int widthA  = (int) ((SA.coldim() + 15) / 16) * 16;
+				int heightA = (int) ((SA.rowdim() + 15) / 16) * 16;
+				int widthB  = (int) ((SB.coldim() + 15) / 16) * 16;
+
+				//Call the kernel
+				oclCallKernel<double,cl_double>(
+					bufferD,
+					bufferA,
+					bufferB,
+					bufferC,
+					widthA,
+					heightA,
+					widthB,
+					p,
+					selectedKernel);
+
+				//Block until kernel finishes
+				cl_int tempErrcode;
+				tempErrcode = clFinish(commandQue);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				//Delete OpenCL buffers
+				tempErrcode = clReleaseMemObject(bufferA);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				tempErrcode = clReleaseMemObject(bufferB);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				//Create temporary accumulation buffer
+				cl_mem tempBuffer = bufferC;
+				bufferC = bufferD;
+
+				for(int sharedDim = 1; sharedDim < ABlocksX; sharedDim++){
+					//Load next blocks onto the device
+					SA = VA.at((size_t)(blockRow * ABlocksX + sharedDim));
+					SB = VB.at((size_t)(blockCol + BBlocksX * sharedDim));
+					bufferA = oclCreateAndLoadMatrixBuffer<cl_double,
+						SubmatrixAdapter<Operand2> >(SA);
+					bufferB = oclCreateAndLoadMatrixBuffer<cl_double,
+						SubmatrixAdapter<Operand3> >(SB);
+
+					//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+					int widthA_  = (int) ((SA.coldim() + 15) / 16) * 16;
+					int heightA_ = (int) ((SA.rowdim() + 15) / 16) * 16;
+					int widthB_  = (int) ((SB.coldim() + 15) / 16) * 16;
+
+					//Call the kernel
+					oclCallKernel<double,cl_double>(
+						tempBuffer,
+						bufferA,
+						bufferB,
+						bufferC,
+						widthA_,
+						heightA_,
+						widthB_,
+						p,
+						selectedKernel);
+
+					//Block until kernel finishes
+					tempErrcode = clFinish(commandQue);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					//Delete OpenCL buffers
+					tempErrcode = clReleaseMemObject(bufferA);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					tempErrcode = clReleaseMemObject(bufferB);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					//Shuffle buffer variables
+					cl_mem placeHolder = bufferC;
+					bufferC = tempBuffer;
+					tempBuffer = placeHolder;
+				}
+
+				//Read back buffer
+				SD = oclReadMatrixBuffer<cl_double,SubmatrixAdapter<Operand1> >(
+					bufferC,
+					SD);
+
+				//Delete OpenCL buffers
+				tempErrcode = clReleaseMemObject(bufferC);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				tempErrcode = clReleaseMemObject(tempBuffer);
+				linbox_check(tempErrcode == CL_SUCCESS);
+			}
+		}
+
+		//Unlock the device
+		pthread_mutex_unlock(deviceLock);
+
+		return D;
+	}
+
+	/*
+	 * Specialization of maxpy for
+	 * multiplying two general dense matrices
+	 * and subtracts it from a third general dense matrix
+	 * over a Givaro::Modular<float> Field.
+	 * D = C - A*B
+	 */
+	template <>
+	template <class Operand1, class Operand2, class Operand3>
+	Operand1& OpenCLMatrixDomain<Givaro::Modular<float> >::maxpy(
+		Operand1& D,
+		const Operand2& A,
+		const Operand3& B,
+		const Operand1& C) const{
+
+		//Check if kernels are available
+		bool kernelsAvailable = spKernelsAvailable[12];
+		kernelsAvailable &= spKernelsAvailable[13];
+		kernelsAvailable &= spKernelsAvailable[14];
+		kernelsAvailable &= spKernelsAvailable[15];
+
+		//If it is not capable or not setup properly use default implementation
+		if(!setupCorrect || !kernelsAvailable){
+			return BlasMatrixDomainMulAdd<//Givaro::Modular<float>,
+				Operand1,
+				Operand2,
+				Operand3>()(D,_F.one,C,_F.mOne,A,B);
+		}
+
+		//Check dimensions
+		linbox_check( A.coldim() == B.rowdim());
+		linbox_check( C.rowdim() == A.rowdim());
+		linbox_check( C.coldim() == B.coldim());
+		linbox_check( D.rowdim() == C.rowdim());
+		linbox_check( D.coldim() == C.coldim());
+
+		//Lock the device
+		pthread_mutex_lock(deviceLock);
+
+		//Partition the input matrices into chuncks that can fit onto the device
+		std::vector<SubmatrixAdapter<Operand1> > VD;
+		std::vector<SubmatrixAdapter<Operand2> > VA;
+		std::vector<SubmatrixAdapter<Operand3> > VB;
+		std::vector<SubmatrixAdapter<Operand1> > VC;
+		std::vector<int> partitionDims = oclPartition<Operand1,Operand2,Operand3>(
+			D,
+			A,
+			B,
+			C,
+			VD,
+			VA,
+			VB,
+			VC);
+
+		//Break out the partitioned dimensions
+		int DBlocksX = partitionDims.at(0);
+		int DBlocksY = partitionDims.at(1);
+		int ABlocksX = partitionDims.at(2);
+		//int ABlocksY = partitionDims.at(3);
+		int BBlocksX = partitionDims.at(4);
+		//nt BBlocksY = partitionDims.at(5);
+
+		float p = (float) _F.characteristic();
+
+		// Select OpenCL kernel based on the size of the modulus factor for
+		//maximum performance
+		//p^2 * n < 2^23
+		cl_kernel selectedKernel;;
+		if(p <= (1 << 7)){
+			selectedKernel = spKernels[15];
+		}
+		else if(p <= (1 << 9)){
+			selectedKernel = spKernels[14];
+		}
+		else if(p <= (1 << 10)){
+			selectedKernel = spKernels[13];
+		}
+		else{
+			selectedKernel = spKernels[12];
+		}
+
+		for(int blockCol = 0; blockCol < DBlocksX; blockCol++){
+			for(int blockRow = 0; blockRow < DBlocksY; blockRow++){
+
+				SubmatrixAdapter<Operand1> SD = VD.at((size_t)(blockRow * DBlocksX + blockCol));
+				SubmatrixAdapter<Operand2> SA = VA.at((size_t)(blockRow * ABlocksX));
+				SubmatrixAdapter<Operand3> SB = VB.at((size_t)(blockCol));
+				SubmatrixAdapter<Operand1> SC = VC.at((size_t)(blockRow * DBlocksX + blockCol));
+
+				//Allocate buffers
+				cl_mem bufferD = oclCreateMatrixBuffer<cl_float,
+					SubmatrixAdapter<Operand1> >(SD);
+				cl_mem bufferA = oclCreateAndLoadMatrixBuffer<cl_float,
+					SubmatrixAdapter<Operand2> >(SA);
+				cl_mem bufferB = oclCreateAndLoadMatrixBuffer<cl_float,
+					SubmatrixAdapter<Operand3> >(SB);
+				cl_mem bufferC = oclCreateAndLoadMatrixBuffer<cl_float,
+					SubmatrixAdapter<Operand1> >(SC);
+
+				//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+				int widthA  = (int) ((SA.coldim() + 15) / 16) * 16;
+				int heightA = (int) ((SA.rowdim() + 15) / 16) * 16;
+				int widthB  = (int) ((SB.coldim() + 15) / 16) * 16;
+
+				//Call the kernel
+				oclCallKernel<float,cl_float>(
+					bufferD,
+					bufferA,
+					bufferB,
+					bufferC,
+					widthA,
+					heightA,
+					widthB,
+					p,
+					selectedKernel);
+
+				//Block until kernel finishes
+				cl_int tempErrcode;
+				tempErrcode = clFinish(commandQue);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				//Delete OpenCL buffers
+				tempErrcode = clReleaseMemObject(bufferA);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				tempErrcode = clReleaseMemObject(bufferB);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				//Create temporary accumulation buffer
+				cl_mem tempBuffer = bufferC;
+				bufferC = bufferD;
+
+				for(int sharedDim = 1; sharedDim < ABlocksX; sharedDim++){
+					//Load next blocks onto the device
+					SA = VA.at((size_t)(blockRow * ABlocksX + sharedDim));
+					SB = VB.at((size_t)(blockCol + BBlocksX * sharedDim));
+					bufferA = oclCreateAndLoadMatrixBuffer<cl_float,
+						SubmatrixAdapter<Operand2> >(SA);
+					bufferB = oclCreateAndLoadMatrixBuffer<cl_float,
+						SubmatrixAdapter<Operand3> >(SB);
+
+					//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+					int widthA_  = (int) ((SA.coldim() + 15) / 16) * 16;
+					int heightA_ = (int) ((SA.rowdim() + 15) / 16) * 16;
+					int widthB_  = (int) ((SB.coldim() + 15) / 16) * 16;
+
+					//Call the kernel
+					oclCallKernel<float,cl_float>(
+						tempBuffer,
+						bufferA,
+						bufferB,
+						bufferC,
+						widthA_,
+						heightA_,
+						widthB_,
+						p,
+						selectedKernel);
+
+					//Block until kernel finishes
+					tempErrcode = clFinish(commandQue);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					//Delete OpenCL buffers
+					tempErrcode = clReleaseMemObject(bufferA);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					tempErrcode = clReleaseMemObject(bufferB);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					//Shuffle buffer variables
+					cl_mem placeHolder = bufferC;
+					bufferC = tempBuffer;
+					tempBuffer = placeHolder;
+				}
+
+				//Read back buffer
+				SD = oclReadMatrixBuffer<cl_float,SubmatrixAdapter<Operand1> >(
+					bufferC,
+					SD);
+
+				//Delete OpenCL buffers
+				tempErrcode = clReleaseMemObject(bufferC);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				tempErrcode = clReleaseMemObject(tempBuffer);
+				linbox_check(tempErrcode == CL_SUCCESS);
+			}
+		}
+
+		//Unlock the device
+		pthread_mutex_unlock(deviceLock);
+
+		return D;
+	}
+
+	/*
+	 * Specialization of maxpyin for
+	 * multiplying two general dense matrices
+	 * and subtracts it from a third general dense matrix
+	 * over a Givaro::Modular<double> Field.
+	 * Places the results into the first gernal dense matrix.
+	 * C -= A*B
+	 */
+	template <>
+	template <class Operand1, class Operand2, class Operand3>
+	Operand1& OpenCLMatrixDomain<Givaro::Modular<double> >::maxpyin(
+		Operand1& C,
+		const Operand2& A,
+		const Operand3& B) const{
+
+		//Check if kernels are available
+		bool kernelsAvailable = dpKernelsAvailable[12];
+		kernelsAvailable &= dpKernelsAvailable[13];
+		kernelsAvailable &= dpKernelsAvailable[14];
+		kernelsAvailable &= dpKernelsAvailable[15];
+
+		//If it is not capable or not setup properly use default implementation
+		if(!setupCorrect || !doubleSupported || !kernelsAvailable){
+			return muladdin<Operand1,Operand2,Operand3>(_F.one,C,_F.mOne,A,B);
+		}
+
+		Operand1 T(C);
+		return maxpy<Operand1,Operand2,Operand3>(C,A,B,T);
+	}
+
+	/*
+	 * Specialization of maxpyin for
+	 * multiplying two general dense matrices
+	 * and subtracts it from a third general dense matrix
+	 * over a Givaro::Modular<float> Field.
+	 * Places the results into the first gernal dense matrix.
+	 * C -= A*B
+	 */
+	template <>
+	template <class Operand1, class Operand2, class Operand3>
+	Operand1& OpenCLMatrixDomain<Givaro::Modular<float> >::maxpyin(
+		Operand1& C,
+		const Operand2& A,
+		const Operand3& B) const{
+
+		//Check if kernels are available
+		bool kernelsAvailable = spKernelsAvailable[12];
+		kernelsAvailable &= spKernelsAvailable[13];
+		kernelsAvailable &= spKernelsAvailable[14];
+		kernelsAvailable &= spKernelsAvailable[15];
+
+		//If it is not capable or not setup properly use default implementation
+		if(!setupCorrect || !kernelsAvailable){
+			return muladdin<Operand1,Operand2,Operand3>(_F.one,C,_F.mOne,A,B);
+		}
+
+		Operand1 T(C);
+		return maxpy<Operand1,Operand2,Operand3>(C,A,B,T);
+	}
+
+	/*
+	 * Specialization of axmy for
+	 * multiplying two general dense matrices
+	 * and subtracts a third general dense matrix from it
+	 * over a Givaro::Modular<double> Field.
+	 * D = A*B - C
+	 */
+	template <>
+	template <class Operand1, class Operand2, class Operand3>
+	Operand1& OpenCLMatrixDomain<Givaro::Modular<double> >::axmy(
+		Operand1& D,
+		const Operand2& A,
+		const Operand3& B,
+		const Operand1& C) const{
+
+		//Check if kernels are available
+		bool kernelsAvailable = dpKernelsAvailable[16];
+		kernelsAvailable &= dpKernelsAvailable[17];
+		kernelsAvailable &= dpKernelsAvailable[18];
+		kernelsAvailable &= dpKernelsAvailable[19];
+		kernelsAvailable &= dpKernelsAvailable[8];
+		kernelsAvailable &= dpKernelsAvailable[9];
+		kernelsAvailable &= dpKernelsAvailable[10];
+		kernelsAvailable &= dpKernelsAvailable[11];
+
+		//If it is not capable or not setup properly use default implementation
+		if(!setupCorrect || !doubleSupported || !kernelsAvailable){
+			return BlasMatrixDomainMulAdd<//Givaro::Modular<double>,
+				Operand1,
+				Operand2,
+				Operand3>()(D,_F.mOne,C,_F.one,A,B);
+		}
+
+		//Check dimensions
+		linbox_check( A.coldim() == B.rowdim());
+		linbox_check( C.rowdim() == A.rowdim());
+		linbox_check( C.coldim() == B.coldim());
+		linbox_check( D.rowdim() == C.rowdim());
+		linbox_check( D.coldim() == C.coldim());
+
+		//Lock the device
+		pthread_mutex_lock(deviceLock);
+
+		//Partition the input matrices into chuncks that can fit onto the device
+		std::vector<SubmatrixAdapter<Operand1> > VD;
+		std::vector<SubmatrixAdapter<Operand2> > VA;
+		std::vector<SubmatrixAdapter<Operand3> > VB;
+		std::vector<SubmatrixAdapter<Operand1> > VC;
+		std::vector<int> partitionDims = oclPartition<Operand1,Operand2,Operand3>(
+			D,
+			A,
+			B,
+			C,
+			VD,
+			VA,
+			VB,
+			VC);
+
+		//Break out the partitioned dimensions
+		int DBlocksX = partitionDims.at(0);
+		int DBlocksY = partitionDims.at(1);
+		int ABlocksX = partitionDims.at(2);
+		//int ABlocksY = partitionDims.at(3);
+		int BBlocksX = partitionDims.at(4);
+		//nt BBlocksY = partitionDims.at(5);
+
+		double p = (double)_F.characteristic();
+
+		// Select OpenCL kernel based on the size of the modulus factor for
+		//maximum performance
+		//p^2 * n < 2^53
+		cl_kernel selectedAxmyKernel;
+		cl_kernel selectedAxpyKernel;
+		if(p <= (1 << 21)){
+			selectedAxmyKernel = dpKernels[19];
+			selectedAxpyKernel = dpKernels[11];
+		}
+		else if(p <= (1 << 24)){
+			selectedAxmyKernel = dpKernels[18];
+			selectedAxpyKernel = dpKernels[10];
+		}
+		else if(p <= (1 << 25)){
+			selectedAxmyKernel = dpKernels[17];
+			selectedAxpyKernel = dpKernels[9];
+		}
+		else{
+			selectedAxmyKernel = dpKernels[16];
+			selectedAxpyKernel = dpKernels[8];
+		}
+
+		for(int blockCol = 0; blockCol < DBlocksX; blockCol++){
+			for(int blockRow = 0; blockRow < DBlocksY; blockRow++){
+
+				SubmatrixAdapter<Operand1> SD = VD.at((size_t)(blockRow * DBlocksX + blockCol));
+				SubmatrixAdapter<Operand2> SA = VA.at((size_t)(blockRow * ABlocksX));
+				SubmatrixAdapter<Operand3> SB = VB.at((size_t)(blockCol));
+				SubmatrixAdapter<Operand1> SC = VC.at((size_t)(blockRow * DBlocksX + blockCol));
+
+				//Allocate buffers
+				cl_mem bufferD = oclCreateMatrixBuffer<cl_double,
+					SubmatrixAdapter<Operand1> >(SD);
+				cl_mem bufferA = oclCreateAndLoadMatrixBuffer<cl_double,
+					SubmatrixAdapter<Operand2> >(SA);
+				cl_mem bufferB = oclCreateAndLoadMatrixBuffer<cl_double,
+					SubmatrixAdapter<Operand3> >(SB);
+				cl_mem bufferC = oclCreateAndLoadMatrixBuffer<cl_double,
+					SubmatrixAdapter<Operand1> >(SC);
+
+				//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+				int widthA  = (int) ((SA.coldim() + 15) / 16) * 16;
+				int heightA = (int) ((SA.rowdim() + 15) / 16) * 16;
+				int widthB  = (int) ((SB.coldim() + 15) / 16) * 16;
+
+				//Call the kernel
+				oclCallKernel<double,cl_double>(
+					bufferD,
+					bufferA,
+					bufferB,
+					bufferC,
+					widthA,
+					heightA,
+					widthB,
+					p,
+					selectedAxmyKernel);
+
+				//Block until kernel finishes
+				cl_int tempErrcode;
+				tempErrcode = clFinish(commandQue);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				//Delete OpenCL buffers
+				tempErrcode = clReleaseMemObject(bufferA);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				tempErrcode = clReleaseMemObject(bufferB);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				//Create temporary accumulation buffer
+				cl_mem tempBuffer = bufferC;
+				bufferC = bufferD;
+
+				for(int sharedDim = 1; sharedDim < ABlocksX; sharedDim++){
+					//Load next blocks onto the device
+					SA = VA.at((size_t)(blockRow * ABlocksX + sharedDim));
+					SB = VB.at((size_t)(blockCol + BBlocksX * sharedDim));
+					bufferA = oclCreateAndLoadMatrixBuffer<cl_double,
+						SubmatrixAdapter<Operand2> >(SA);
+					bufferB = oclCreateAndLoadMatrixBuffer<cl_double,
+						SubmatrixAdapter<Operand3> >(SB);
+
+					//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+					int widthA_  = (int) ((SA.coldim() + 15) / 16) * 16;
+					int heightA_ = (int) ((SA.rowdim() + 15) / 16) * 16;
+					int widthB_  = (int) ((SB.coldim() + 15) / 16) * 16;
+
+					//Call the kernel
+					oclCallKernel<double,cl_double>(
+						tempBuffer,
+						bufferA,
+						bufferB,
+						bufferC,
+						widthA_,
+						heightA_,
+						widthB_,
+						p,
+						selectedAxpyKernel);
+
+					//Block until kernel finishes
+					tempErrcode = clFinish(commandQue);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					//Delete OpenCL buffers
+					tempErrcode = clReleaseMemObject(bufferA);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					tempErrcode = clReleaseMemObject(bufferB);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					//Shuffle buffer variables
+					cl_mem placeHolder = bufferC;
+					bufferC = tempBuffer;
+					tempBuffer = placeHolder;
+				}
+
+				//Read back buffer
+				SD = oclReadMatrixBuffer<cl_double,SubmatrixAdapter<Operand1> >(
+					bufferC,
+					SD);
+
+				//Delete OpenCL buffers
+				tempErrcode = clReleaseMemObject(bufferC);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				tempErrcode = clReleaseMemObject(tempBuffer);
+				linbox_check(tempErrcode == CL_SUCCESS);
+			}
+		}
+
+		//Unlock the device
+		pthread_mutex_unlock(deviceLock);
+
+		return D;
+	}
+
+	/*
+	 * Specialization of axmy for
+	 * multiplying two general dense matrices
+	 * and subtracts a third general dense matrix from it
+	 * over a Givaro::Modular<float> Field.
+	 * D = A*B - C
+	 */
+	template <>
+	template <class Operand1, class Operand2, class Operand3>
+	Operand1& OpenCLMatrixDomain<Givaro::Modular<float> >::axmy(
+		Operand1& D,
+		const Operand2& A,
+		const Operand3& B,
+		const Operand1& C) const{
+
+		//Check if kernels are available
+		bool kernelsAvailable = spKernelsAvailable[16];
+		kernelsAvailable &= spKernelsAvailable[17];
+		kernelsAvailable &= spKernelsAvailable[18];
+		kernelsAvailable &= spKernelsAvailable[19];
+		kernelsAvailable &= spKernelsAvailable[8];
+		kernelsAvailable &= spKernelsAvailable[9];
+		kernelsAvailable &= spKernelsAvailable[10];
+		kernelsAvailable &= spKernelsAvailable[11];
+
+		//If it is not capable or not setup properly use default implementation
+		if(!setupCorrect || !kernelsAvailable){
+			return BlasMatrixDomainMulAdd<//Givaro::Modular<float>,
+				Operand1,
+				Operand2,
+				Operand3>()(D,_F.mOne,C,_F.one,A,B);
+		}
+
+		//Check dimensions
+		linbox_check( A.coldim() == B.rowdim());
+		linbox_check( C.rowdim() == A.rowdim());
+		linbox_check( C.coldim() == B.coldim());
+		linbox_check( D.rowdim() == C.rowdim());
+		linbox_check( D.coldim() == C.coldim());
+
+		//Lock the device
+		pthread_mutex_lock(deviceLock);
+
+		//Partition the input matrices into chuncks that can fit onto the device
+		std::vector<SubmatrixAdapter<Operand1> > VD;
+		std::vector<SubmatrixAdapter<Operand2> > VA;
+		std::vector<SubmatrixAdapter<Operand3> > VB;
+		std::vector<SubmatrixAdapter<Operand1> > VC;
+		std::vector<int> partitionDims = oclPartition<Operand1,Operand2,Operand3>(
+			D,
+			A,
+			B,
+			C,
+			VD,
+			VA,
+			VB,
+			VC);
+
+		//Break out the partitioned dimensions
+		int DBlocksX = partitionDims.at(0);
+		int DBlocksY = partitionDims.at(1);
+		int ABlocksX = partitionDims.at(2);
+		//int ABlocksY = partitionDims.at(3);
+		int BBlocksX = partitionDims.at(4);
+		//nt BBlocksY = partitionDims.at(5);
+
+		float p = (float)_F.characteristic();
+
+		// Select OpenCL kernel based on the size of the modulus factor for
+		//maximum performance
+		//p^2 * n < 2^23
+		cl_kernel selectedAxmyKernel;
+		cl_kernel selectedAxpyKernel;
+		if(p <= (1 << 7)){
+			selectedAxmyKernel = spKernels[19];
+			selectedAxpyKernel = spKernels[11];
+		}
+		else if(p <= (1 << 9)){
+			selectedAxmyKernel = spKernels[18];
+			selectedAxpyKernel = spKernels[10];
+		}
+		else if(p <= (1 << 10)){
+			selectedAxmyKernel = spKernels[17];
+			selectedAxpyKernel = spKernels[9];
+		}
+		else{
+			selectedAxmyKernel = spKernels[16];
+			selectedAxpyKernel = spKernels[8];
+		}
+
+		for(int blockCol = 0; blockCol < DBlocksX; blockCol++){
+			for(int blockRow = 0; blockRow < DBlocksY; blockRow++){
+
+				SubmatrixAdapter<Operand1> SD = VD.at((size_t)(blockRow * DBlocksX + blockCol));
+				SubmatrixAdapter<Operand2> SA = VA.at((size_t)(blockRow * ABlocksX));
+				SubmatrixAdapter<Operand3> SB = VB.at((size_t)(blockCol));
+				SubmatrixAdapter<Operand1> SC = VC.at((size_t)(blockRow * DBlocksX + blockCol));
+
+				//Allocate buffers
+				cl_mem bufferD = oclCreateMatrixBuffer<cl_float,
+					SubmatrixAdapter<Operand1> >(SD);
+				cl_mem bufferA = oclCreateAndLoadMatrixBuffer<cl_float,
+					SubmatrixAdapter<Operand2> >(SA);
+				cl_mem bufferB = oclCreateAndLoadMatrixBuffer<cl_float,
+					SubmatrixAdapter<Operand3> >(SB);
+				cl_mem bufferC = oclCreateAndLoadMatrixBuffer<cl_float,
+					SubmatrixAdapter<Operand1> >(SC);
+
+				//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+				int widthA  = (int) ((SA.coldim() + 15) / 16) * 16;
+				int heightA = (int) ((SA.rowdim() + 15) / 16) * 16;
+				int widthB  = (int) ((SB.coldim() + 15) / 16) * 16;
+
+				//Call the kernel
+				oclCallKernel<float,cl_float>(
+					bufferD,
+					bufferA,
+					bufferB,
+					bufferC,
+					widthA,
+					heightA,
+					widthB,
+					p,
+					selectedAxmyKernel);
+
+				//Block until kernel finishes
+				cl_int tempErrcode;
+				tempErrcode = clFinish(commandQue);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				//Delete OpenCL buffers
+				tempErrcode = clReleaseMemObject(bufferA);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				tempErrcode = clReleaseMemObject(bufferB);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				//Create temporary accumulation buffer
+				cl_mem tempBuffer = bufferC;
+				bufferC = bufferD;
+
+				for(int sharedDim = 1; sharedDim < ABlocksX; sharedDim++){
+					//Load next blocks onto the device
+					SA = VA.at((size_t)(blockRow * ABlocksX + sharedDim));
+					SB = VB.at((size_t)(blockCol + BBlocksX * sharedDim));
+					bufferA = oclCreateAndLoadMatrixBuffer<cl_float,
+						SubmatrixAdapter<Operand2> >(SA);
+					bufferB = oclCreateAndLoadMatrixBuffer<cl_float,
+						SubmatrixAdapter<Operand3> >(SB);
+
+					//((A.coldim() / 16) + (A.coldim() % 16 == 0 ? 0 : 1)) * 16
+					int widthA_  = (int) ((SA.coldim() + 15) / 16) * 16;
+					int heightA_ = (int) ((SA.rowdim() + 15) / 16) * 16;
+					int widthB_  = (int) ((SB.coldim() + 15) / 16) * 16;
+
+					//Call the kernel
+					oclCallKernel<float,cl_float>(
+						tempBuffer,
+						bufferA,
+						bufferB,
+						bufferC,
+						widthA_,
+						heightA_,
+						widthB_,
+						p,
+						selectedAxpyKernel);
+
+					//Block until kernel finishes
+					tempErrcode = clFinish(commandQue);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					//Delete OpenCL buffers
+					tempErrcode = clReleaseMemObject(bufferA);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					tempErrcode = clReleaseMemObject(bufferB);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+					//Shuffle buffer variables
+					cl_mem placeHolder = bufferC;
+					bufferC = tempBuffer;
+					tempBuffer = placeHolder;
+				}
+
+				//Read back buffer
+				SD = oclReadMatrixBuffer<cl_float,SubmatrixAdapter<Operand1> >(
+					bufferC,
+					SD);
+
+				//Delete OpenCL buffers
+				tempErrcode = clReleaseMemObject(bufferC);
+				linbox_check(tempErrcode == CL_SUCCESS);
+
+				tempErrcode = clReleaseMemObject(tempBuffer);
+				linbox_check(tempErrcode == CL_SUCCESS);
+			}
+		}
+
+		//Unlock the device
+		pthread_mutex_unlock(deviceLock);
+
+		return D;
+	}
+
+	/*
+	 * Specialization of axmyin for
+	 * multiplying two general dense matrices
+	 * and subtracts a third general dense matrix from it
+	 * over a Givaro::Modular<double> Field.
+	 * Places the results into the first general dense matrix
+	 * C = A*B - C
+	 */
+	template <>
+	template <class Operand1, class Operand2, class Operand3>
+	Operand1& OpenCLMatrixDomain<Givaro::Modular<double> >::axmyin(
+		Operand1& C,
+		const Operand2& A,
+		const Operand3& B) const{
+
+		//Check if kernels are available
+		bool kernelsAvailable = dpKernelsAvailable[16];
+		kernelsAvailable &= dpKernelsAvailable[17];
+		kernelsAvailable &= dpKernelsAvailable[18];
+		kernelsAvailable &= dpKernelsAvailable[19];
+		kernelsAvailable &= dpKernelsAvailable[8];
+		kernelsAvailable &= dpKernelsAvailable[9];
+		kernelsAvailable &= dpKernelsAvailable[10];
+		kernelsAvailable &= dpKernelsAvailable[11];
+
+		//If it is not capable or not setup properly use default implementation
+		if(!setupCorrect || !doubleSupported || !kernelsAvailable){
+			return muladdin<Operand1,Operand2,Operand3>(_F.mOne,C,_F.one,A,B);
+		}
+
+		Operand1 T(C);
+		return axmy<Operand1,Operand2,Operand3>(C,A,B,T);
+	}
+
+	/*
+	 * Specialization of axmyin for
+	 * multiplying two general dense matrices
+	 * and subtracts a third general dense matrix from it
+	 * over a Givaro::Modular<float> Field.
+	 * Places the results into the first general dense matrix
+	 * C = A*B - C
+	 */
+	template <>
+	template <class Operand1, class Operand2, class Operand3>
+	Operand1& OpenCLMatrixDomain<Givaro::Modular<float> >::axmyin(
+		Operand1& C,
+		const Operand2& A,
+		const Operand3& B) const{
+
+		//Check if kernels are available
+		bool kernelsAvailable = spKernelsAvailable[16];
+		kernelsAvailable &= spKernelsAvailable[17];
+		kernelsAvailable &= spKernelsAvailable[18];
+		kernelsAvailable &= spKernelsAvailable[19];
+		kernelsAvailable &= spKernelsAvailable[8];
+		kernelsAvailable &= spKernelsAvailable[9];
+		kernelsAvailable &= spKernelsAvailable[10];
+		kernelsAvailable &= spKernelsAvailable[11];
+
+		//If it is not capable or not setup properly use default implementation
+		if(!setupCorrect || !kernelsAvailable){
+			return muladdin<Operand1,Operand2,Operand3>(_F.mOne,C,_F.one,A,B);
+		}
+
+		Operand1 T(C);
+		return axmy<Operand1,Operand2,Operand3>(C,A,B,T);
+	}
+
+} //end of namespace LinBox
+
+#endif // __LINBOX_opencl_matrix_domain_INL
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/matrixdomain/plain-domain.h b/linbox/matrix/matrixdomain/plain-domain.h
new file mode 100644
index 0000000..22827fa
--- /dev/null
+++ b/linbox/matrix/matrixdomain/plain-domain.h
@@ -0,0 +1,240 @@
+#ifndef __LINBOX_plain_domain_h
+#define __LINBOX_plain_domain_h
+
+#include "linbox/util/error.h"
+#include "linbox/matrix/plain-matrix.h"
+
+namespace LinBox {
+/*
+   PlainDomain is a reference implementation of a matrix domain.
+   It makes a domain from any field by contributing very basic matrix functions using
+   the getEntry/setEntry functions of the DenseMatrix interface.
+
+PlainDomain has a constructor from field,
+it's PlainDomain::Matrix type meets the dense submatrix concept
+and it is the interface for working with dense matrices.  When you need to allocate a new matrix use
+PlainDomain::NewMatrix.
+
+A Blackbox over PlainDomain<Field> is any matrix type that has apply and applyTranspose applicable to PlainDomain<Field>::Matrix.  That is to say the signature of apply is
+  Matrix& Blackbox::apply(Matrix& Y, const Matrix& X)
+
+PlainDomain provides, for dense Submatrices A,B,C
+  mul(C, A, B) // C = A * B
+  axpyin(C, A, B) // C += A * B
+  addin(A, B) // A += B
+
+  functions on Submatrix
+  add sub neg mul div inv axpy (both scalar and matrix
+  inplace forms of those
+  areEqual isZero
+
+  alternative functions
+  gemm (rplace axpy) (trans)
+  additional functions
+  trsm (trans, uplo) trmm(trans, uplo) symm (trans, uplo)
+  (in particular triangular solving must be included
+*/
+
+template<class Field_>
+struct PlainDomain : public Field_
+{
+	typedef PlainDomain<Field_> Self_t;
+	typedef Field_ Father_t;
+	typedef size_t Index;
+	// A domain provides distinct types: Scalar, Matrix, and Blackbox.
+	typedef typename Father_t::Element Scalar;
+	typedef typename Father_t::Element Element;
+	typedef PlainSubmatrix<Self_t> Submatrix;
+	typedef PlainMatrix<Self_t> Matrix;
+	// but matrix should admit triangular forms
+
+	// constructors and assignment
+	//PlainDomain (size_t p = 0, size_t e = 1): Field(p) {}
+	PlainDomain()
+	{}
+	PlainDomain(const Element& p)
+	: Father_t(p) {}
+	PlainDomain(const Father_t& F)
+	: Father_t(F) {}
+	PlainDomain(const PlainDomain<Father_t>& D)
+	: Father_t(D) {}
+	//~PlainDomain()
+	// {} // default dstor is fine.
+	using Father_t::operator=;
+	const Father_t& field() const // transitional
+	{ return *this; }
+
+// A domain provides field functions and (dense) matrix functions.
+
+// field functions
+	using Father_t::init;
+	using Father_t::add;
+	using Father_t::sub;
+	using Father_t::neg;
+	using Father_t::mul;
+	using Father_t::div;
+	using Father_t::inv;
+	using Father_t::axpy;
+	using Father_t::addin;
+	using Father_t::subin;
+	using Father_t::negin;
+	using Father_t::mulin;
+	using Father_t::divin;
+	using Father_t::invin;
+	using Father_t::axpyin;
+	using Father_t::isZero;
+	using Father_t::isOne;
+	using Father_t::areEqual;
+	using Father_t::cardinality;
+	using Father_t::characteristic;
+	using Father_t::write;
+	using Father_t::read;
+
+// matrix arithmetic functions
+
+	Submatrix& add (Submatrix& C, const Submatrix& A, const Submatrix& B) const // C = A + B, where A, B, C have the same shape.
+	{	C = B; return addin(C,A);	}
+	Submatrix& neg (Submatrix& B, const Submatrix& A) const  // B = -A, where B and A have the same shape.
+	{	B = A; return negin(B);		}
+	Submatrix& sub (Submatrix& C, const Submatrix& A, const Submatrix& B) const // C = A - B, where A, B, C have the same shape.
+	{	C = B; return subin(C,A);	}
+	Submatrix& smul (Submatrix& B, const Scalar& a, const Submatrix& A) const // B = a*A.
+	{	B = A; return smulin(B,a);	}
+	Submatrix& saxpy (Submatrix& C, const Scalar& a, const Submatrix& A, const Submatrix& B) const // C = a*A + B.
+	{	C = B; return saxpyin(C,a,A);	}
+	Submatrix& mul (Submatrix& C, const Submatrix& A, const Submatrix& B) const // C = A*B, conformal shapes required.
+	{	for (Index i = 0; i < C.rowdim(); ++i)
+		for (Index j = 0; j < C.coldim(); ++j)
+		{	Scalar x,y,z; field().assign(x, field().zero); field().assign(y,field().zero); field().assign(z,field().zero);
+			for (Index k = 0; k < B.coldim(); ++k)
+				field().axpyin(x, A.getEntry(y,i,k), B.getEntry(z,k,j));
+			C.setEntry(i,j,x);
+		}
+		return C;
+	}
+	Submatrix& inv (Submatrix& B, const Submatrix& A) const // B = A^{-1}
+	{	B = A; return invin(B);		}
+	/*?*/Submatrix& div (Submatrix& C, const Submatrix& A, const Submatrix& B) const // C = A/B, B nonsingular required.
+	{	throw(LinboxError("PlainDomain - what is div?")); return C; }
+	Submatrix& axpy( Submatrix& D, const Submatrix& C, const Submatrix& A, const Submatrix &B) const // D = C + A*B, conformal shapes required.
+	{	D = C; return axpyin(D,A,B);		}
+	Submatrix& addin (Submatrix& B, const Submatrix& A) const // B += A, where B and A have the same shape.
+	{	for (Index i = 0; i < B.rowdim(); ++i)
+		for (Index j = 0; j < B.coldim(); ++j)
+		{	Scalar x = field().zero, y = field().zero;
+			A.getEntry(x,i,j); B.getEntry(y,i,j);
+			B.setEntry(i,j, field().addin(x, y));
+		}
+		return B;
+	}
+	Submatrix& negin (Submatrix& A) const // A = -A.
+	{	for (Index i = 0; i < A.rowdim(); ++i)
+		for (Index j = 0; j < A.coldim(); ++j)
+		{	Scalar x = field().zero;
+			A.getEntry(x,i,j);
+			A.setEntry(i,j,field().negin(x));
+		}
+		return A;
+	}
+	Submatrix& subin (Submatrix& B, const Submatrix& A) const // B -= A, where B and A have the same shape.
+	{	for (Index i = 0; i < B.rowdim(); ++i)
+		for (Index j = 0; j < B.coldim(); ++j)
+		{	Scalar x = field().zero, y = field().zero;
+			A.getEntry(x,i,j);
+			B.setEntry(i,j, field().subin(x, y));
+		}
+		return B;
+	}
+	Submatrix& smulin (Submatrix& B, const Scalar& a) const // B = aB
+	{	for (Index i = 0; i < B.rowdim(); ++i)
+		for (Index j = 0; j < B.coldim(); ++j)
+		{	Scalar x; init(x);
+			B.getEntry(x,i,j);
+			B.setEntry(i,j, mulin(x, a));
+		}
+		// this could use a _private_ refEntry...
+		return B;
+	}
+	Submatrix& saxpyin( Submatrix& A, const Scalar& a, const Submatrix &B) const // A += a*B, shapes must conform.
+	{	for (Index i = 0; i < B.rowdim(); ++i)
+		for (Index j = 0; j < B.coldim(); ++j)
+		{	Scalar x = field().zero, y = field().zero;
+			A.getEntry(x,i,j); B.getEntry(y,i,j);
+			A.setEntry(i,j, field().axpyin(x, a, y));
+		}
+		// this could use a _private_ refEntry...
+		return A;
+	}
+	Submatrix& mulin_left (Submatrix& A, const Submatrix& B) const // A = A*B, for square, same dim A and B.
+	{	Matrix C(*this, B.rowdim(), A.coldim());
+		mul(C,A,B); return A = C;
+	}
+	Submatrix& mulin_right (const Submatrix& A, Submatrix& B) const // B = A*B, for square, same dim A and B.
+	{	Matrix C(*this, B.rowdim(), A.coldim());
+		mul(C,A,B); return B = C;
+	}
+	/*?*/Submatrix& invin (Submatrix& A) const // A = A^{-1}
+	{	throw(LinboxError("PlainDomain invin for nonsing Submatrix not yet impl.")); return A; }
+	/*?*/Submatrix& divin (Submatrix& A, const Submatrix& B) const // A /= B, B nonsingular required.
+	{	throw(LinboxError("PlainDomain what is divin?")); return A; }
+	Submatrix& axpyin( Submatrix& C, const Submatrix& A, const Submatrix &B) const // C += A*B, shapes must conform.
+	{	for (Index i = 0; i < C.rowdim(); ++i)
+		for (Index j = 0; j < C.coldim(); ++j)
+		{	Scalar x,y,z; field().assign(x, field().zero); field().assign(y,field().zero); field().assign(z,field().zero);
+			C.getEntry(x,i,j);
+			for (Index k = 0; k < B.coldim(); ++k)
+				field().axpyin(x, A.getEntry(y,i,k), B.getEntry(z,k,j));
+			C.setEntry(i,j,x);
+		}
+		return C;
+	}
+	//Submatrix& copy(Submatrix &dst, const Submatrix& src) // deep copy, same as assignment
+
+
+	bool areEqual(const Submatrix& A, const Submatrix &B) const // A == B, same shape not required
+	{
+		Scalar a = field().zero, b = field().zero;
+		for (size_t i = 0; i < A.rowdim(); ++i)
+			for (size_t j = 0; j < A.coldim(); ++j)
+			{	A.getEntry(a, i, j);
+				B.getEntry(b, i, j);
+				if (not field().areEqual(a, b) )
+					return false;
+			}
+		return true;
+	}
+
+// simple write
+	std::ostream& write(std::ostream& out, const Submatrix& A) const
+	{
+		Scalar a;
+		//out << "%%MatrixMarketExtended array" << std::endl;
+		out << A.rowdim() << " " << A.coldim() << std::endl;
+		for (size_t i = 0; i < A.rowdim(); ++i){
+			for (size_t j = 0; j < A.coldim(); ++j)
+				write(out, A.getEntry(a, i, j)) << " ";
+			out << std::endl;
+		}
+		return out << std::endl;
+	}
+
+// simple read.  should use matrix reader
+	std::istream& read(std::istream& in, Submatrix& A) const
+	{
+		Scalar a;
+		size_t r, c;
+		in >> r >> c;
+		A.init(r, c);
+		for (size_t i = 0; i < A.rowdim(); ++i)
+			for (size_t j = 0; j < A.coldim(); ++j){
+				read(in, a);
+				A.setEntry(i, j, a);
+			}
+		return in;
+	}
+
+}; // PlainDomain
+
+} // LinBox
+#endif // __LINBOX_plain_domain_h
+
diff --git a/linbox/matrix/permutation-matrix.doxy b/linbox/matrix/permutation-matrix.doxy
new file mode 100644
index 0000000..363d2a4
--- /dev/null
+++ b/linbox/matrix/permutation-matrix.doxy
@@ -0,0 +1,32 @@
+// Copyright 2014 LinBox. See COPYING for licence information.
+/*
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/**  \ingroup matrix
+ * \defgroup permutationmatrix Permutation Matrix
+ * \brief These are permutation matrix reprensentations
+ *
+ * NO DOC YET
+ *
+ */
+
+// vim:syn=doxygen
diff --git a/linbox/matrix/permutation-matrix.h b/linbox/matrix/permutation-matrix.h
index ad3c41d..3ffb1cd 100644
--- a/linbox/matrix/permutation-matrix.h
+++ b/linbox/matrix/permutation-matrix.h
@@ -1,6 +1,6 @@
 
 /* Copyright (C) 2010 LinBox
- * Written by <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  *
  *
  *
@@ -25,6 +25,8 @@
 
 /** @file matrix/permutation-matrix.h
  * @ingroup matrix
+ * @defgroup permutationmatrix
+ *
  * A permutation class for operations on permutations, their representations
  * and matrix row/column permuting.
  *
diff --git a/linbox/matrix/permutation-matrix.inl b/linbox/matrix/permutation-matrix.inl
index 8f5edba..8207d42 100644
--- a/linbox/matrix/permutation-matrix.inl
+++ b/linbox/matrix/permutation-matrix.inl
@@ -1,6 +1,6 @@
 
 /* Copyright (C) 2010 LinBox
- * Written by <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  *
  *
  *
@@ -526,7 +526,7 @@ namespace LinBox
 	template<class _UnsignedInt>
 	void MatrixPermutation<_UnsignedInt>::Invert()
 	{
-		Transpose() ;
+		this->Transpose() ;
 	}
 
 	template<class _UnsignedInt>
diff --git a/linbox/matrix/plain-matrix.h b/linbox/matrix/plain-matrix.h
new file mode 100644
index 0000000..80eb23a
--- /dev/null
+++ b/linbox/matrix/plain-matrix.h
@@ -0,0 +1,203 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+/* linbox/matrix/plain-matrix.h
+ * -bds 2013
+ * See COPYING for license information
+ *
+ * evolved from Dense-submatrix and blas-matrix
+ */
+
+/*! @file matrix/plain-matrix.h
+ * @ingroup matrix
+ * @brief Reference representation of a PlainMatrix (dense, memory allocating) class
+ * and PlainSubmatrix (dense, non-allocating) class.
+ * \c other dense submatrix classes such as LinBox::BlasSubmatrix exihibit this functionality.
+ */
+
+#ifndef __LINBOX_plain_matrix_h
+#define __LINBOX_plain_matrix_h
+
+#include "linbox/util/error.h"
+
+#include "linbox/util/debug.h"
+
+#include "linbox/matrix/matrixdomain/plain-domain.h"
+
+namespace LinBox
+{
+
+	/** @brief to be used in reference matrix domain (PlainDomain).
+
+	 * Matrix variable declaration, sizing, entry initialization may involve one to 3 steps.
+	 * Matrix ops are container ops. (sizing, copying)
+	 *
+	 * Mathematical operations are to be found only in an associated matrix domain ).
+	 * (exceptions are some use of domain scalars in, eg., zero(), random(), setEntry(), getEntry().
+	 *
+	 * A Submatrix does not allocate heap memory.  It shares (subset of) the memory of a (memory allocating) DenseMatrix.
+	 * When a DenseMatrix goes out of scope or is reinitialized with init(), the memory is released
+	 * and all Submatrices of it become invalid.
+	 *
+	 * Allocating:
+	 * Given a matrix domain, MatDom MD,
+
+	 * MatDom::Matrix A(MD, 2, 3); // allocation of mem for 6 entries at construction
+	 * MatDom::Matrix B; B.init(MD, 10, 10); // default constr and subsequent allocation.
+	 *
+	 * Allocation of memory plus entry initialization:
+	 * // a meaningful value of DenseMatrix::Entry x is set by a field.
+	 * MatDom::Matrix B(A); // allocation at copy construction.  A could be a submatrix of another.
+	 * MatDom::Matrix A; A.read(stream); // allocation at read time.
+	 * MatDom::Submatrix A(MD, n, m); A.read(stream); // no allocation at read time. Shape must match.
+	 *
+	 * Nonallocation sizing:
+	 * MatDom::Submatrix S,T;
+	 * S.submatrix(A, 1, 0, 2, A.coldim()); // S is second 2 rows of A
+	 * T.submatrix(S, 0, S.coldim()-2, 2, 2); // T is 2by2 at right end of S, shares mem with S and A.
+	 *
+	 * Entry initialization (and overwriting) in already sized matrices:
+	 * S.setEntry(i, j, x);
+	 * S.copy(B); S = B; // A and B must have the same shape.
+	 * S.read(stream); // A and matrix in stream must have the same shape.
+
+	 * Entry read access. OK on const matrices
+	 * S.getEntry(x,i,j), S.write(stream)
+
+	 \ingroup matrix
+	 */
+	 /* defined here:
+	 class PlainSubmatrix<Dom>;
+	 class PlainMatrix<Dom>: PlainSubmatrix<Dom>;
+	 */
+
+	template<class MatDom>
+	class PlainSubmatrix /*: public DenseMatrixInterface<MatDom>*/ {
+	public:
+		typedef PlainSubmatrix<MatDom> Self_t;
+		typedef MatDom MatrixDomain;
+		typedef size_t Index;
+		typedef typename MatrixDomain::Scalar Entry;
+	protected:
+		Entry *rep_; // matrix entries on the heap.
+		const MatrixDomain* domain_; // scalar, vector, matrix arithmetic context
+		Index rows_;
+		Index cols_;
+		Index row_stride_; // stride from row to row.  Entries in a row are contiguous.
+	public:
+		Index rowdim() const
+		{ return rows_; }
+		Index coldim() const
+		{ return cols_; }
+		inline const MatrixDomain& domain() const
+		{ return *domain_; }
+		const MatrixDomain& field() const // transitional
+		{ return *domain_; }
+
+		Entry& getEntry(Entry& x, Index i, Index j) const
+		{ return x = rep_[i*row_stride_ + j]; }
+		void setEntry(Index i, Index j, const Entry& x )
+		{ rep_[i*row_stride_ + j] = x; }
+
+		void submatrix(const Self_t & A, Index i, Index j, Index m, Index n)
+		{	rep_ = A.rep_ + i*row_stride_ + j;
+			rows_ = m; cols_= n, row_stride_ = A.row_stride_;
+			domain_ = A.domain();
+		}
+
+		Self_t& zero() // set to zeroes, no shape change
+		{	for (Index i = 0; i < rowdim(); ++ i)
+				for (Index j = 0; j < coldim(); ++ j)
+					setEntry(i, j, field().zero);
+		}
+		Self_t& identity() // set to I, must be square, no shape change
+		{	this->zero();
+			for (Index i = 0; i < rowdim(); ++i)
+				setEntry(i, i, field().one);
+		}
+		Self_t& random() // set to random entries, no shape change
+		{	Entry x; field().assign(x,field().zero);
+			typename MatrixDomain::RandIter r(field());
+			for (Index i = 0; i < rowdim(); ++ i)
+				for (Index j = 0; j < coldim(); ++ j)
+					setEntry(i, j, r.random(x));
+		}
+
+		std::istream& read (std::istream &is) // The matrix read must have the same shape.
+		{ throw(LinboxError("no PlainSubmatrix read yet")); return is; }
+		std::ostream& write (std::ostream &os) const
+		{ throw(LinboxError("no PlainSubmatrix write yet")); return os; }
+
+		PlainSubmatrix() :rep_(0), rows_(0), cols_(0), row_stride_(1)
+		{}
+		PlainSubmatrix(const Self_t& A)
+		{ submatrix(A, 0, 0, A.rowdim(), A.coldim()); }
+
+		Self_t& copy(const Self_t& B) // deep copy
+		{	linbox_check(rowdim() == B.rowdim() and coldim() == B.coldim());
+			linbox_check(&(domain()) == &(B.domain()));
+			Entry x; domain().assign(x, domain().zero);
+			for (Index i = 0; i < rowdim(); ++ i)
+				for (Index j = 0; j < coldim(); ++ j)
+					setEntry(i, j, B.getEntry(x, i,j));
+			return *this;
+		}
+		Self_t& operator=(const Self_t& B)
+		{	return copy(B); }
+
+		// can have trace, rank, det, etc.
+
+	}; // PlainSubmatrix
+
+	template<class Domain_>
+	class PlainMatrix : public PlainSubmatrix<Domain_> {
+	public:
+		typedef PlainMatrix<Domain_> Self_t;
+		typedef PlainSubmatrix<Domain_> Father_t;
+		typedef typename Father_t::MatrixDomain MatrixDomain;
+		typedef typename Father_t::Index Index;
+		typedef typename Father_t::Entry Entry;
+	protected:
+		using Father_t::domain_;
+		using Father_t::rep_;
+		using Father_t::rows_;
+		using Father_t::cols_;
+		using Father_t::row_stride_;
+	public:
+		PlainMatrix()
+		: Father_t() {}
+		//~PlainMatrix()
+		//{} // default dstor works
+		PlainMatrix(const MatrixDomain& D, Index m, Index n)
+		: Father_t() { init(D, m, n); }
+		PlainMatrix(const PlainMatrix& A) // deep copy
+		: Father_t() { init(A.domain(), A.rowdim(), A.coldim()); this->copy(A); }
+
+		void init(const MatrixDomain& D, Index m, Index n)
+		{	domain_ = &D;
+			if (rows_*cols_ != m*n) // must replace current mem.
+			{	if (rep_) delete(rep_);
+				rep_ = new(Entry[m*n]);
+			}
+			rows_ = m; cols_ = n; row_stride_ = 1;
+		}
+		PlainMatrix& operator=(const PlainMatrix& A) // deep copy, reallocate if necessary
+		{ init(A.domain(), A.rowdim(), A.coldim()); copy(A); }
+
+		std::istream& read (std::istream &is) // Will be reshaped to match the matrix read.
+		{ throw(LinboxError("no PlainMatrix read yet")); return is; }
+
+		using Father_t::rowdim;
+		using Father_t::coldim;
+		using Father_t::field;
+		using Father_t::domain;
+
+		using Father_t::getEntry;
+		using Father_t::setEntry;
+		using Father_t::submatrix;
+		using Father_t::zero;
+		using Father_t::random;
+		using Father_t::write;
+		using Father_t::copy;
+	}; //PlainMatrix
+} //LinBox
+#endif //__LINBOX_plain_matrix_h
diff --git a/linbox/matrix/polynomial-matrix.h b/linbox/matrix/polynomial-matrix.h
new file mode 100755
index 0000000..afe31cc
--- /dev/null
+++ b/linbox/matrix/polynomial-matrix.h
@@ -0,0 +1,687 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2013  Pascal Giorgi
+ *                     Romain Lebreton
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at lirmm.fr>
+ *            Romain Lebreton <lebreton at lirmm.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+#ifndef __LINBOX_polynomial_matrix_H
+#define __LINBOX_polynomial_matrix_H
+#include <vector>
+#include "linbox/vector/subvector.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/field/hom.h"
+#include "fflas-ffpack/utils/align-allocator.h"
+#include "givaro/modular.h"
+#include <algorithm>
+
+
+#define COPY_BLOCKSIZE 32
+
+namespace LinBox{
+
+	enum PMType {polfirst, matfirst};
+	enum PMStorage {plain, view, const_view};
+
+	// Generic handler class for Polynomial Matrix
+	template<size_t type, size_t storage, class Field>
+	class PolynomialMatrix;
+
+	// Class for Polynomial Matrix stored as a Matrix of Polynomials
+	template<class _Field>
+	class PolynomialMatrix<PMType::polfirst,PMStorage::plain,_Field> {
+	public:
+		typedef _Field Field;
+		typedef typename Field::Element   Element;
+		typedef BlasMatrix<Field>          Matrix;
+		//typedef typename std::vector<Element>::iterator  Iterator;
+		//typedef typename std::vector<Element>::const_iterator  ConstIterator;
+		typedef std::vector<Element,AlignedAllocator<Element, Alignment::DEFAULT>> VECT;
+		typedef typename VECT::iterator  Iterator;
+		typedef typename VECT::const_iterator  ConstIterator;
+		//typedef vector<Element>        Polynomial;
+		typedef Subvector<Iterator,ConstIterator>   Polynomial;
+		typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,_Field>  Self_t;
+		typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,_Field> Other_t;
+
+		//PolynomialMatrix() {}
+
+		// construct a polynomial matrix in f[x]^(m x n) of degree (s-1)
+		PolynomialMatrix(const Field& f, size_t r, size_t c, size_t s, size_t stor=0) :
+			_store((stor?stor:s)), _repview(r*c),_rep(r*c*_store,f.zero), _row(r), _col(c), _size(s), _fld(&f) {
+			for (size_t i=0;i<_row;i++)
+				for (size_t j=0;j<_col;j++)
+					_repview[i*_col+j]= Polynomial(_rep.begin()+(i*_col+j)*_store,_size);
+			//integer p;
+			//std::cout<<"MatrixP allocating : "<<r*c*s*length(f.characteristic(p))/1000000.<<"Mo"<<std::endl;
+		}
+
+		~PolynomialMatrix(){
+			//integer p;
+			//std::cout<<"MatrixP Desallocating : "<<_row*_col*_store*length(_fld->characteristic(p))/1000000.<<"Mo"<<std::endl;
+			
+		}
+			
+		void clear(){
+			_rep.resize(0);
+		}
+
+		// set the matrix A to the matrix of degree k in the polynomial matrix
+		void setMatrix(Matrix& A, size_t k) const {
+			typename Matrix::Iterator it=A.Begin();
+			for(size_t i=0;i<_row*_col;i++,it++)
+				*it = get(i,k);			
+		}
+		// retrieve the matrix of degree k in the polynomial matrix
+		Matrix     operator[](size_t k)const {
+			Matrix A(field(), _row, _col);
+			setMatrix(A,k);
+			return A;
+		}
+		// retrieve the polynomial at entry (i,j) in the matrix
+		inline Polynomial&       operator()(size_t i, size_t j)      {return operator()(i*_col+j);}
+		inline const Polynomial& operator()(size_t i, size_t j)const {return operator()(i*_col+j);}
+		// retrieve the polynomial at the position i in the storage of the matrix
+		inline Polynomial&       operator()(size_t i)      {return _repview[i];}
+		inline const Polynomial& operator()(size_t i)const {return _repview[i];}
+
+		// resize the polynomial length of the polynomial matrix
+		void resize(size_t s){
+			if (s>_store){
+				_rep.resize(s*_row*_col);
+				size_t k=s*_row*_col-1;
+				for(size_t i=0;i<_row*_col;i++){
+					size_t j=s;
+					for(;j>=_size;j--,k--)
+						_rep[k]=_fld->zero;
+					for(;j>size_t(-1);j--,k--)
+						_rep[k]=_rep[i*_store+j];
+				}
+			}
+			else {
+				size_t k=0;
+				for(size_t i=0;i<_row*_col;i++)
+					for (size_t j=0;j<s;j++,k++)
+						_rep[k]=_rep[i*_store+j];
+				_rep.resize(s*_row*_col);
+			}
+			_store=s;
+			setsize(s);
+		}
+
+		void changesize(size_t s){
+			if (s <=_store){			
+				for (size_t i=0;i<_row*_col;i++)
+					_repview[i]= Polynomial(_rep.begin()+i*_store,s);
+				_size=s;
+			}
+			else {
+				std::cerr<<"ERROR: in PolynomialMatrix<polfirs> -> setsize with too large size"<<std::endl;				
+				throw LinboxError("LinBox ERROR: PolynomialMatrix setsize \n");
+			}
+
+		}
+		void setsize(size_t s){
+			if (s <=_store){
+				for(size_t i=0;i<_row*_col;i++){
+					for(size_t j=_size ;j<s;j++)
+						_rep[i*_store+j]=_fld->zero;
+				}
+				for (size_t i=0;i<_row*_col;i++)
+					_repview[i]= Polynomial(_rep.begin()+i*_store,s);
+				_size=s;
+			}
+			else {
+				std::cerr<<"ERROR: in PolynomialMatrix<polfirs> -> setsize with too large size"<<std::endl;				
+				throw LinboxError("LinBox ERROR: PolynomialMatrix setsize \n");
+			}	
+		}
+		
+		
+		// copy elt from M[beg..end], _size must be >= j-i
+		void copy(const Self_t& M, size_t beg, size_t end){
+			//cout<<"copying.....polfirst to polfirst.....same field"<<endl;
+			for (size_t k=0;k<_row*_col;k++){
+				size_t j=0;
+				for (size_t i=beg;i<=end;i++){
+					ref(k,j)=M.get(k,i);
+					j++;
+				}
+			}
+		}
+		template<typename OtherField>
+		void copy(const PolynomialMatrix<PMType::polfirst,PMStorage::plain,OtherField> & M, size_t beg, size_t end){
+			//cout<<"copying.....polfirst to polfirst.....other field"<<endl;
+			Hom<OtherField,Field> hom(M.field(),field()) ;
+			for (size_t k=0;k<_row*_col;k++){
+				size_t j=0;
+				for (size_t i=beg;i<=end;i++,j++){
+					hom.image(ref(k,j),M.get(k,i));
+				}
+			}
+		}
+
+		// copy elt from M[beg..end], _size must be >= end-beg+1
+		// M is stored as a Polynomial of Matrices
+		template <size_t storage>
+		void copy(const PolynomialMatrix<PMType::matfirst,storage,Field>& M, size_t beg, size_t end){
+			//std::cout<<"copying.....matfirst to polfirst.....same field"<<std::endl;
+			const size_t ls = COPY_BLOCKSIZE;
+			for (size_t i = beg; i <= end; i+=ls)
+				for (size_t j = 0; j < _col * _row; j+=ls)
+					// Rk: the two loop must be interchanged in some cases
+					for (size_t _i = i; _i < std::min(end+1, i + ls); _i++)
+						for (size_t _j = j; _j < std::min(_col * _row, j + ls);++_j)
+							ref(_j,_i-beg)= M.get(_j,_i);
+		}
+
+		// copy elt from M[beg..end], _size must be >= end-beg+1
+		// M is stored as a Polynomial of Matrices with a different field
+		template<size_t storage, typename OtherField>
+		void copy(const PolynomialMatrix<PMType::matfirst,storage,OtherField> & M, size_t beg, size_t end){
+			//std::cout<<"copying.....matfirst to polfirst.....other field"<<std::endl;
+			const size_t ls = COPY_BLOCKSIZE;
+			Hom<OtherField,Field> hom(M.field(),field()) ;
+			for (size_t i = beg; i <= end; i+=ls)
+				for (size_t j = 0; j < _col * _row; j+=ls)
+					for (size_t _i = i; _i < std::min(end+1, i + ls); _i++) {
+						for (size_t _j = j; _j < std::min(_col * _row, j + ls);++_j)
+							hom.image(ref(_j,_i-beg),M.get(_j,_i) );
+					}
+		}
+
+		template<typename Mat>
+		void copy(const Mat& M){
+			linbox_check (M.size()==_size && M.rowdim()== _row && M.coldim()== _col);
+			copy(M,0,M.size()-1);
+		}
+
+		// rebind functor to change base field (e.g. apply modulo reduction)
+		template<typename _Tp1>
+		struct rebind {
+			typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain, Field> Self_t;
+			typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain, _Tp1> Other_t;
+
+			void operator() (Other_t& Ap,
+					 const Self_t&  A){
+				Hom<Field, _Tp1> hom(A.field(), Ap.field()) ;
+				for (size_t i = 0; i < A._row * A._col; i++)
+					for (size_t j = 0; j < A._size; j++)
+						hom.image (Ap.ref(i,j), A.get(i,j));
+			}
+		};
+
+		// get access to the the k-th coeff  of the ith matrix entry
+		inline Element& ref(size_t i, size_t k){
+			return _rep[i*_store+k];
+		}
+		inline Element& ref(size_t i, size_t j, size_t k){
+			return ref(i*_col+j,k);
+		}
+		inline Element get(size_t i, size_t k)const {
+			return _rep[i*_store+k];
+		}
+		inline Element get(size_t i, size_t j, size_t k) const{
+			return get(i*_col+j,k);
+		}
+
+		size_t rowdim()  const {return _row;}
+		size_t coldim()  const {return _col;}
+		size_t degree()  const {return _size-1;}
+		size_t size()    const {return _size;}
+		size_t storage() const {return _store;}
+		const Field& field()  const {return *_fld;}
+
+		std::ostream& write(std::ostream& os) const { return write(os,0,_size-1);}
+
+                std::ostream& write(std::ostream& os, size_t deg_min, size_t deg_max) const {
+                        integer c;
+                        int wid=-1,b;
+                        field().cardinality (c);
+
+                        if (c >0){
+                                wid = (int) ceil (log ((double) c) / M_LN10);
+                                b= ((int) ceil (log ((double) _size) / M_LN10));
+                                wid*=10*(b*(b-1)/2.);
+                        }
+			std::cout<<"Matrix([";
+                        for (size_t i = 0; i< _row;++i) {
+                                os << "  [ ";
+                                for (size_t j = 0;j<_col;++j){
+                                        os.width (wid);
+                                        field().write(os,get(i,j,deg_min));
+					for (size_t k=deg_min+1;k<deg_max;++k){
+                                                os<<"+";
+                                                field().write(os,get(i,j,k))<<"*x^"<<k-deg_min;
+                                        }
+                                        if (deg_max-deg_min>0){
+                                                os<<"+";
+                                                field().write(os,get(i,j,deg_max))<<"*x^"<<deg_max-deg_min;
+                                        }
+					os<<(j<_col-1?",":"" );
+                                }
+				os << (i<_row-1?"],":"]" )<< std::endl;
+                        }
+			std::cout<<"]);";
+		
+                	return os;
+                }
+
+		Element* getWritePointer(){return &_rep[0];}
+		const Element* getPointer() const {return &_rep[0];}
+
+		size_t realmeminfo()const { return _rep.capacity()*sizeof(Element)+_repview.capacity()*sizeof(Polynomial);}
+		size_t meminfo()const { return _rep.size()*sizeof(Element);}
+
+		void changeField(const Field& F){_fld=&F;}
+		
+	private:
+		size_t           _store;
+		std::vector<Polynomial> _repview;
+		//std::vector<Element>    _rep;
+		VECT _rep;
+		size_t             _row;
+		size_t             _col;
+		size_t            _size;
+		const Field*       _fld;
+	};
+
+	// Class for Polynomial Matrix stored as a Polynomial of Matrices
+	template<class _Field>
+	class PolynomialMatrix<PMType::matfirst,PMStorage::plain,_Field> {
+	public:
+		typedef _Field Field;
+		typedef typename Field::Element   Element;
+		typedef BlasMatrix<Field>         Matrix;
+		typedef std::vector<Element>       Polynomial;
+		typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,_Field>  Self_t;
+		typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,_Field> Other_t;		
+			       
+		typedef Matrix value_type;
+
+		PolynomialMatrix() {}
+
+		PolynomialMatrix(const Field& f, size_t r, size_t c, size_t s) :
+			_rep(s,Matrix(f)), _row(r), _col(c), _size(s), _fld(&f) {
+			//_row(r), _col(c), _size(s), _fld(&f) {			
+			for(size_t i=0;i<s;i++)
+				_rep[i].init(f,r,c);
+			//integer p;
+			//std::cout<<"PMatrix allocating : "<<r*c*s*length(f.characteristic(p))/1000000.<<"Mo"<<std::endl;
+		}
+
+		~PolynomialMatrix(){
+			//integer p;
+			//std::cout<<"PMatrix Desallocating : "<<_row*_col*_size*length(_fld->characteristic(p))/1000000.<<"Mo"<<std::endl;
+		}
+
+		void clear(){
+			_rep.resize(0,Matrix(*_fld));
+		}
+
+		
+		// retrieve the matrix of degree k in the polynomial matrix
+		inline Matrix&       operator[](size_t k)      {return _rep[k];}
+		inline const Matrix& operator[](size_t k)const {return _rep[k];}
+
+		// retrieve the polynomial at entry (i,j) in the matrix
+		inline Polynomial  operator()(size_t i, size_t j) const {
+			Polynomial A(_size);
+			for(size_t k=0;k<_size;k++)
+				A[k]=_rep[k].getEntry(i,j);
+			return A;
+		}
+		// retrieve the polynomial at psotion (i) in the storage of the matrix
+		inline Polynomial  operator()(size_t i) const {
+			Polynomial A(_size);
+			for(size_t k=0;k<_size;k++)
+				A[k]=*(_rep[k].Begin()+i);
+			return A;
+		}
+
+		// resize the polynomial length of the polynomial matrix
+		void resize(size_t s){
+			_rep.resize(s,Matrix(*_fld));
+			if (s>_size){
+				for(size_t i=_size;i<s;i++)
+					_rep[i].init(field(),_row,_col);
+			}
+			_size=s;
+		}
+
+		void setsize(size_t s){resize(s);}
+		
+		// copy elt from M[beg..end], _size must be >= j-i
+		template <size_t storage>
+		void copy(const PolynomialMatrix<PMType::matfirst,storage,Field>& M, size_t beg, size_t end, size_t start=0){
+			//cout<<"copying.....matfirst to matfirst.....same field"<<endl;
+			for (size_t i=beg;i<=end;i++)
+				_rep[start+i-beg]=M[i];
+
+		}
+
+		template<size_t storage, typename OtherField>
+		void copy(const PolynomialMatrix<PMType::matfirst,storage,OtherField> & M, size_t beg, size_t end, size_t start=0){
+			//cout<<"copying.....matfirst to matfirst.....other field"<<endl;
+			Hom<OtherField,Field> hom(M.field(),field()) ;
+			for (size_t i=beg;i<=end;i++)
+				for (size_t j=0;j<_row*_col;j++)
+					hom.image(ref(j,start+i-beg) , M.get(j,i));
+		}
+
+		// copy elt from M[beg..end], _size must be >= end-beg+1
+		// M is stored as a Matrix of Polynomials
+		void copy(const Other_t& M, size_t beg, size_t end, size_t start=0){
+			//cout<<"copying.....polfirst to matfirst.....same field"<<endl;
+			const size_t ls = COPY_BLOCKSIZE; // Loop unrooling to be more cache-friendly (cache block transposition)
+			for(size_t i = beg; i < end+1; i+=ls)
+				for (size_t j = 0; j < _col * _row; j+=ls)
+					for (size_t _i = i; _i < std::min(end+1, i + ls); _i++) {
+						for (size_t _j = j; _j < std::min(_col * _row, j + ls); _j++)
+							ref(_j,start+_i-beg) = M.get(_j,_i);
+					}
+		}
+
+		// copy elt from M[beg..end], _size must be >= end-beg+1
+		// M is stored as a Matrix of Polynomials with a different field
+		template<typename OtherField>
+		void copy(const PolynomialMatrix<PMType::polfirst,PMStorage::plain,OtherField> & M, size_t beg, size_t end, size_t start=0){
+			//cout<<"copying.....polfirst to matfirst.....other field"<<endl;
+			const size_t ls = COPY_BLOCKSIZE;
+			Hom<OtherField,Field> hom(M.field(),field()) ;
+			for(size_t i = beg; i < end+1; i+=ls)
+				for (size_t j = 0; j < _col * _row; j+=ls)
+					for (size_t _i = i; _i < std::min(end+1, i + ls); _i++) {
+						for (size_t _j = j; _j < std::min(_col * _row, j + ls); _j++)
+							hom.image(ref(_j,start+_i-beg) , M.get(_j,_i));
+					}
+		}
+
+		template<typename Mat>
+		void copy(const Mat& M){
+			linbox_check (M.size()==_size && M.rowdim()== _row && M.coldim()== _col);
+			copy(M,0,M.size()-1);
+		}
+
+		// rebind functor to change base field (e.g. apply modulo reduction)
+		template<typename _Tp1>
+		struct rebind {
+			typedef PolynomialMatrix<PMType::matfirst, PMStorage::plain,Field>  Self_t;
+			typedef PolynomialMatrix<PMType::matfirst, PMStorage::plain,_Tp1>  Other_t;
+
+			template<size_t storage>
+			void operator() (PolynomialMatrix<PMType::matfirst, storage,_Tp1>& Ap,
+					 const PolynomialMatrix<PMType::matfirst, storage,Field>&  A){
+				Hom<Field, _Tp1> hom(A.field(), Ap.field()) ;
+				for (size_t j = 0; j < A._size; j++)
+					for (size_t i = 0; i < A._row * A._col; i++)
+						hom.image (Ap.ref(i,j), A.get(i,j));
+			}
+		};
+
+		typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field>           plain;
+		typedef PolynomialMatrix<PMType::matfirst,PMStorage::view,Field>             view;
+		typedef PolynomialMatrix<PMType::matfirst,PMStorage::const_view,Field> const_view;
+
+		inline view       at(size_t i, size_t j)      {return view(*this,i,j);}
+		inline const_view at(size_t i, size_t j)const {return const_view(*this,i,j);}
+
+
+		// get access to the the k-th coeff  of the ith matrix entry
+		inline Element& ref(size_t i, size_t k){
+			return 	_rep[k].refRep()[i];
+			//return *(_rep[k].Begin()+i);
+		}
+		inline Element& ref(size_t i, size_t j, size_t k){
+			return ref(i*_col+j,k);
+		}
+		inline Element get(size_t i, size_t k)const {
+			return *(_rep[k].Begin()+i);
+		}
+		inline Element get(size_t i, size_t j, size_t k) const{
+			return get(i*_col+j,k);
+		}
+
+		inline size_t rowdim() const {return _row;}
+		inline size_t coldim() const {return _col;}
+		inline size_t degree() const {return _size-1;}
+		inline size_t real_degree() const {
+			MatrixDomain<Field> MD(field());
+			size_t d= _size-1;
+			while(d>0 && MD.isZero(_rep[d])) d--;
+			return d;
+		}
+		inline size_t size()   const {return _size;}
+		inline size_t storage()const {return _size;}
+		
+		inline const Field& field()  const {return *_fld;}
+
+		std::ostream& write(std::ostream& os) const { return write(os,0,real_degree());}
+
+                std::ostream& write(std::ostream& os, size_t deg_min, size_t deg_max) const {
+                        integer c;
+                        int wid,b;
+                        field().cardinality (c);
+
+                        if (c >0)
+                                wid = (int) ceil (log ((double) c) / M_LN10);
+			else
+				wid=(int) ceil (log ((double) _rep[0].getEntry(0,0)) / M_LN10);
+
+			b= ((int) ceil (log ((double) (deg_max-deg_min+1)) / M_LN10));
+			wid*=10*(b*(b-1)/2.);
+			std::cout<<"Matrix([";
+			for (size_t i = 0; i< _row;++i) {
+                                os << "  [ ";
+                                for (size_t j = 0;j<_col;++j){
+                                        os.width (wid);
+                                        field().write(os,_rep[deg_min].getEntry(i,j));
+                                        for (size_t k=deg_min+1;k<deg_max;++k){
+                                                os<<"+";
+                                                field().write(os,_rep[k].getEntry(i,j))<<"*x^"<<k-deg_min;
+                                        }
+                                        if (deg_max-deg_min>0){
+                                                os<<"+";
+                                                field().write(os,_rep[deg_max].getEntry(i,j))<<"*x^"<<deg_max-deg_min;
+                                        }
+					os<<(j<_col-1?",":"" );
+                                }
+                                os << (i<_row-1?"],":"]" )<< std::endl;
+                        }
+			std::cout<<"]);";
+			return os;
+                }
+
+		// NEED FOR YUHASZ
+		typedef typename std::vector<Matrix>::const_iterator const_iterator;
+		const_iterator begin() const {return _rep.begin();}
+
+	private:
+		std::vector<Matrix>     _rep;
+		size_t             _row;
+		size_t             _col;
+		size_t            _size;
+		const Field*       _fld;
+	};
+
+	template<typename _Field, size_t T, size_t S>
+	std::ostream& operator<<(std::ostream& os, const PolynomialMatrix<T,S,_Field>& P) {
+		return P.write(os);
+	}
+
+	// Class to handle the view of a Polynomial Matrix according to some degree range
+	// the view is read/write
+	template<class _Field>
+	class PolynomialMatrix<PMType::matfirst,PMStorage::view,_Field> {
+	public:
+		typedef _Field Field;
+		typedef typename Field::Element   Element;
+		typedef BlasMatrix<Field>          Matrix;
+		typedef std::vector<Element>        Polynomial;
+
+		PolynomialMatrix() {}
+
+		// constructor of a view between i and j from a plain Polynomial Matrix
+		PolynomialMatrix(PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field>& M, size_t i,size_t j)
+			: _ptr(&M), _size(j-i+1), _shift(i)
+		{//cout<<i<<"-"<<j<<" -> "<<M.size()<<endl;
+			linbox_check(i<M.size() && i<=j && j< M.size());}
+
+		// constructor of a view between i and j from a view Polynomial Matrix
+		PolynomialMatrix(PolynomialMatrix<PMType::matfirst,PMStorage::view,Field>& M, size_t i,size_t j)
+			: _ptr(M._ptr), _size(j-i+1), _shift(i+M._shift)
+		{//cout<<i<<"-"<<j<<" -> "<<M.size()<<endl;
+			linbox_check(i<M.size() && i<=j && j< M.size());}
+
+
+		// retrieve the matrix of degree k in the polynomial matrix
+		inline Matrix&       operator[](size_t k)      {return (*_ptr)[k+_shift];}
+		inline const Matrix& operator[](size_t k)const {return (*_ptr)[k+_shift];}
+
+		// retrieve the polynomial at entry (i,j) in the matrix
+		Polynomial    operator()(size_t i, size_t j){
+			Polynomial A(_size, Matrix(_ptr->field()));
+			for(size_t k=0;k<_size;k++)
+				A[k]=(*_ptr)[k+_shift].refEntry(i,j);
+			return A;
+		}
+
+		// get access to the the k-th coeff  of the ith matrix entry
+		inline Element& ref(size_t i, size_t k){
+			return 	_ptr->ref(i,k+_shift);
+		}
+		inline Element& ref(size_t i, size_t j, size_t k){
+			return ref(i*coldim()+j,k);
+		}
+		inline Element get(size_t i, size_t k)const {
+			return 	_ptr->get(i,k+_shift);
+		}
+		inline Element get(size_t i, size_t j, size_t k) const{
+			return get(i*coldim()+j,k);
+		}
+
+		inline size_t rowdim() const {return _ptr->rowdim();}
+		inline size_t coldim() const {return _ptr->coldim();}
+		inline size_t degree() const {return _size-1;}
+		inline size_t size()   const {return _size;}
+		inline const Field& field()  const {return _ptr->field();}
+
+		typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field>           plain;
+		typedef PolynomialMatrix<PMType::matfirst,PMStorage::view,Field>             view;
+		typedef PolynomialMatrix<PMType::matfirst,PMStorage::const_view,Field> const_view;
+
+		template<typename Mat>
+		void copy(const Mat& M){
+			this->copy(M,0,M.size()-1);
+		}
+
+		template<typename Mat>
+		void copy(const Mat& M, size_t beg, size_t end){_ptr->copy(M,beg,end,_shift);}
+
+
+		inline view       at(size_t i, size_t j)      {return view(*this,i,j);}
+		inline const_view at(size_t i, size_t j)const {return const_view(*this,i,j);}
+
+		std::ostream& write(std::ostream& os) const { return _ptr->write(os,_shift,_shift+_size-1);}
+
+		friend class  PolynomialMatrix<PMType::matfirst,PMStorage::const_view,Field>;
+
+	private:
+		PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field>* _ptr;
+		size_t  _size;
+		size_t _shift;
+	};
+
+	// Class to handle the view of a Polynomial Matrix according to some degree range
+	// the view is read only
+	template<class _Field>
+	class PolynomialMatrix<PMType::matfirst,PMStorage::const_view,_Field> {
+	public:
+		typedef _Field Field;
+		typedef typename Field::Element   Element;
+		typedef BlasMatrix<Field>          Matrix;
+		typedef std::vector<Element>        Polynomial;
+
+		PolynomialMatrix() {}
+
+		// constructor of a view between i and j from a plain Polynomial Matrix
+		PolynomialMatrix(const PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field>& M, size_t i,size_t j)
+			: _ptr(&M), _size(j-i+1), _shift(i)
+		{linbox_check(i<M.size() && i<=j && j< M.size());}
+
+		// constructor of a view between i and j from a view Polynomial Matrix
+		PolynomialMatrix(const PolynomialMatrix<PMType::matfirst,PMStorage::view,Field>& M, size_t i,size_t j)
+			: _ptr(M._ptr), _size(j-i+1), _shift(i+M._shift)
+		{linbox_check(i<M.size() && i<=j && j< M.size());}
+
+
+		// constructor of a view between i and j from a view Polynomial Matrix
+		PolynomialMatrix(const PolynomialMatrix<PMType::matfirst,PMStorage::const_view,Field>& M, size_t i,size_t j)
+			: _ptr(M._ptr), _size(j-i+1), _shift(i+M._shift)
+		{//cout<<"("<<i<<","<<j<<") -> "<<M.size()<<endl;
+			linbox_check(i<M.size()&& i<=j && j<= M.size());}
+
+
+		// retrieve the matrix of degree k in the polynomial matrix
+		inline const Matrix& operator[](size_t k)const {return (*_ptr)[k+_shift];}
+
+		// retrieve the polynomial at entry (i,j) in the matrix
+		inline Polynomial    operator()(size_t i, size_t j){
+			Polynomial A(_size, Matrix(_ptr->field()));
+			for(size_t k=0;k<_size;k++)
+				A[k]=(*_ptr)[k+_shift].refEntry(i,j);
+			return A;
+		}
+
+		inline Element get(size_t i, size_t k) const {
+			return 	_ptr->get(i,k+_shift);
+		}
+		inline Element get(size_t i, size_t j, size_t k) const{
+			return get(i*coldim()+j,k);
+		}
+
+
+		inline size_t rowdim() const {return _ptr->rowdim();}
+		inline size_t coldim() const {return _ptr->coldim();}
+		inline size_t degree() const {return _size-1;}
+		inline size_t size()   const {return _size;}
+		inline const Field& field()  const {return _ptr->field();}
+
+		typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field>           plain;
+		typedef PolynomialMatrix<PMType::matfirst,PMStorage::const_view,Field> const_view;
+
+		inline const_view at(size_t i, size_t j)const {return const_view(*this,i,j);}
+		std::ostream& write(std::ostream& os) const { return _ptr->write(os,_shift,_shift+_size-1);}
+
+	private:
+		const PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field>* _ptr;
+		size_t  _size;
+		size_t _shift;
+	};
+
+
+
+
+
+} //end of namespace LinBox
+
+#endif // __LINBOX_polynomial_matrix_H
diff --git a/linbox/matrix/random-matrix.h b/linbox/matrix/random-matrix.h
index eb8650c..7153993 100644
--- a/linbox/matrix/random-matrix.h
+++ b/linbox/matrix/random-matrix.h
@@ -1,5 +1,5 @@
 /* Copyright (C) 2010 LinBox
- * Written by Brice Boyer <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  *
  *
  *
@@ -22,6 +22,9 @@
  * ========LICENCE========
  */
 
+#ifndef __LINBOX_matrix_random_matrix_H
+#define __LINBOX_matrix_random_matrix_H
+
 /** @file matrix/random-matrix.h
  * @ingroup matrix
  * @brief Implementation of random matrices.
@@ -31,19 +34,21 @@
  * and make it easier to write tests/ examples/.
  *
  * @todo à la vector/stream.h
+ * @bug this belongs to algorithms...
  */
 
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/randiter/random-integer.h"
+#include "linbox/matrix/dense-matrix.h"
 #include "linbox/randiter/random-prime.h"
 #include "linbox/matrix/permutation-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
 
 #include "linbox/algorithms/cra-domain.h"
 #include "linbox/algorithms/cra-full-multip-fixed.h"
+#include "linbox/solutions/rank.h"
 
 namespace LinBox
 {
+	template<class Field> class BlasMatrixDomain ;
 
 	// non dependant struct -> out of class.
 	struct RankBuildMethod {
@@ -102,6 +107,12 @@ namespace LinBox
 		template<class Matrix>
 		Matrix & random(Matrix & A) ;
 
+		/*! Create a random matrix with rank=min(rowdim,coldim)
+		 * @param A
+		 */
+		template<class Matrix>
+		Matrix& randomFullRank(Matrix& A);
+
 		/*! provide a matrix with prescribed rank.
 		 * Default method.
 		 * @param A
@@ -144,10 +155,11 @@ namespace LinBox
 
 	/// @todo To be factorized.
 	void RandomBlasPermutation(BlasPermutation<size_t> & P) ;
-}
+} // LinBox
 
 #include "linbox/matrix/random-matrix.inl"
 
+#endif // __LINBOX_matrix_random_matrix_H
 
 // vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
diff --git a/linbox/matrix/random-matrix.inl b/linbox/matrix/random-matrix.inl
index 0760044..760e10c 100644
--- a/linbox/matrix/random-matrix.inl
+++ b/linbox/matrix/random-matrix.inl
@@ -1,5 +1,5 @@
 /* Copyright (C) 2011 LinBox
- * Written by Brice Boyer <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  *
  *
  *
@@ -53,27 +53,24 @@ namespace LinBox
 				rank = (int) ( (double)std::min(m,n)*drand48() );
 			linbox_check(!(rank<0 || rank>(int)std::min(m,n)));
 
-			typedef typename Field::Element Element ;
+			// typedef typename Field::Element Element ;
 
 			// be ready for PLUQ
 			//size_t  * P = new size_t [m]   ;
 			BlasPermutation<size_t> P(m);
 			//Element * L = new Element[m*m] ;
-			//TriangularBlasMatrix<Element> L(m,m,LinBoxTag::Lower,LinBoxTag::Unit);
+			//TriangularBlasMatrix<Field> L(F,m,m,Tag::Lower,Tag::Unit);
 			//! @todo !!!
 			BlasMatrix<Field> L(F,m,m);
 			// Element * U = new Element[m*n] ;
-			// TriangularBlasMatrix<Element> U(m,n,LinBoxTag::Upper,LinBoxTag::NonUnit);
+			// TriangularBlasMatrix<Field> U(F,m,n,Tag::Upper,Tag::NonUnit);
 			//
 			BlasMatrix<Field> U(F,m,n);
 			//size_t  * Q = new size_t [n]   ;
 			BlasPermutation<size_t> Q(n);
 
 			// be ready for random elements
-			NonzeroRandIter<Field> Rnz(F,R);
-			Element one,zero;
-			F.init(one,1UL);
-			F.init(zero,0UL);
+			Givaro::GeneralRingNonZeroRandIter<Field> Rnz(R);
 
 			/* Create L a random invertible lower unit triangular matrix (m x m format) */
 			for (size_t j=0 ; j<m ; ++j)
@@ -84,7 +81,7 @@ namespace LinBox
 				Rnz.random( L.refEntry( i,i ) ); // non zero diagonal
 			for (size_t j=0 ; j<m ; ++j)
 				for (size_t i=0; i<j;++i)
-					L.setEntry( i,j,zero );
+					L.setEntry( i,j,F.zero );
 
 
 #endif
@@ -96,9 +93,9 @@ namespace LinBox
 			for (size_t i = 0; i < (size_t) rank; ++i)
 				Rnz.random( U.refEntry( i,i ) ); // non zero diagonal on rank first lines
 #if 1
-			for (size_t i = rank ; i < m ; ++i)
+			for (size_t i = (size_t)rank ; i < m ; ++i)
 				for (size_t j = i ; j < n ; ++j)
-					U.setEntry( i,j,zero ) ; //  zero on remaining 'triangular' lines
+					U.setEntry( i,j,F.zero ) ; //  zero on remaining 'triangular' lines
 #endif
 
 			/**
@@ -119,7 +116,7 @@ namespace LinBox
 			BMD.mul(A,L,U);
 
 			/*!
-			 * @todo create BMD.applyP(A,P,LinBoxTag::Left) ;
+			 * @todo create BMD.applyP(A,P,Tag::Left) ;
 			 * avec P : BlasPermutation
 			 * ou P : MatrixPermutation
 			 * @todo BlasPermutation a un ordre \p p et une taille \p r distinctes !!!
@@ -143,7 +140,7 @@ namespace LinBox
 			       const RingCategories::IntegerTag & tag)
 		{
 
-			typedef typename Ring::Element Int ;
+			// typedef typename Ring::Element Int ;
 			size_t m = A.rowdim() ;
 			size_t n = A.coldim() ;
 
@@ -163,10 +160,9 @@ namespace LinBox
 			// be ready for random elements
 			Randiter S_(R);
 			S_.setBits(R.getBits()-1);
-			RandomIntegerIter<false> T_(3);
-			NonzeroRandIter<Ring,RandomIntegerIter<false> > U_(ZZ,T_);
+			typename Ring::Randiter T_(ZZ,3);
+			Givaro::GeneralRingNonZeroRandIter<Ring > U_(T_);
 
-			Int one(1),zero(0);
 
 			/* Create L a random invertible lower unit triangular matrix (m x m format) */
 			for (size_t j=0 ; j<m ; ++j)
@@ -177,7 +173,7 @@ namespace LinBox
 				U_.random( L.refEntry( i,i ) ); // non zero diagonal
 			for (size_t j=0 ; j<m ; ++j)
 				for (size_t i=0; i<j;++i)
-					L.setEntry( i,j,zero );
+					L.setEntry( i,j,ZZ.zero );
 
 
 #endif
@@ -189,9 +185,9 @@ namespace LinBox
 			for (size_t i = 0; i < (size_t) rank; ++i)
 				U_.random( U.refEntry( i,i ) ); // non zero diagonal on rank first lines
 #if 1
-			for (size_t i = rank ; i < m ; ++i)
+			for (size_t i = (size_t)rank ; i < m ; ++i)
 				for (size_t j = i ; j < n ; ++j)
-					U.setEntry( i,j,zero ) ; //  zero on remaining 'triangular' lines
+					U.setEntry( i,j,ZZ.zero ) ; //  zero on remaining 'triangular' lines
 #endif
 
 			RandomBlasPermutation(P);
@@ -203,9 +199,6 @@ namespace LinBox
 			// L.write(std::cout << "L:=",true ) << ';' << std::endl;
 			// L.write(std::cout << "U:=",true ) << ';' << std::endl;
 
-			typedef typename Ring::Element Element;
-			// BlasMatrix<Element> A_ptr(A) ;
-
 			MD.mul(A,L,U);
 			// A.write(std::cout << "pre A=",true) << std::endl;
 
@@ -221,10 +214,10 @@ namespace LinBox
 
 #if 0
 		template<class Randiter,class Field>
-		BlasMatrix<typename Field::Element> &
+		BlasMatrix<Field> &
 		random_lu_rank(const Field			   & F,
 			       const Randiter                      & R,
-			       BlasMatrix<typename Field::Element> & A,
+			       BlasMatrix<Field> & A,
 			       int                                 & rank,
 			       const RingCategories::IntegerTag    & tag)
 		{
@@ -258,10 +251,10 @@ namespace LinBox
 		}
 
 		template<class Randiter>
-		BlasBlackbox<PID_integer> &
-		random_rankupdate( PID_integer               & F //!@bug const !
+		BlasBlackbox<Givaro::ZRing<Integer> > &
+		random_rankupdate( Givaro::ZRing<Integer>               & F //!@bug const !
 				   ,const Randiter           & R
-				   ,BlasBlackbox<PID_integer> & A
+				   ,BlasBlackbox<Givaro::ZRing<Integer> > & A
 				   , int                     & rank
 				 )
 		{
@@ -269,16 +262,16 @@ namespace LinBox
 			size_t m = A.rowdim();
 			size_t n = A.coldim();
 
-			BlasBlackbox<PID_integer> D(F,(size_t)m,(size_t)rank) ;
-			BlasBlackbox<PID_integer> G(F,(size_t)rank,(size_t)n) ;
+			BlasBlackbox<Givaro::ZRing<Integer> > D(F,(size_t)m,(size_t)rank) ;
+			BlasBlackbox<Givaro::ZRing<Integer> > G(F,(size_t)rank,(size_t)n) ;
 			Randiter S_(R);
 			S_.setBits(R.getBits()-1);
-			RandomBlasBlackbox<Randiter,PID_integer > RandMatGen(F,S_);
+			RandomBlasBlackbox<Randiter,Givaro::ZRing<Integer> > RandMatGen(F,S_);
 			RandMatGen.random(D) ;
-			RandomIntegerIter<false> T_(3);
-			RandomBlasBlackbox<RandomIntegerIter<false>,PID_integer > RandSmallMatGen(F,T_);
+			Givaro::ZRing<Integer> >::RandIter T_(F,3);
+			RandomBlasBlackbox<Givaro::ZRing<Integer> >::RandIter,Givaro::ZRing<Integer> > RandSmallMatGen(F,T_);
 			RandMatGen.random(G) ;
-			MatrixDomain<PID_integer> MD(F);
+			MatrixDomain<Givaro::ZRing<Integer> > MD(F);
 			MD.mul(A,D,G);
 			return A ;
 		}
@@ -293,7 +286,6 @@ namespace LinBox
 				   , const RingCategories::IntegerTag          &tag
 				 )
 		{
-			typedef typename Field::Element Int ;
 			size_t m = A.rowdim();
 			size_t n = A.coldim();
 
@@ -303,8 +295,8 @@ namespace LinBox
 			S_.setBits(R.getBits()-1);
 			RandomDenseMatrix<Randiter,Field > RandMatGen(F,S_);
 			RandMatGen.random(D) ;
-			RandomIntegerIter<false> T_(3);
-			RandomDenseMatrix<RandomIntegerIter<false>,Field > RandSmallMatGen(F,T_);
+			typename Field::Randiter T_(F,3);
+			RandomDenseMatrix<typename Field::Randiter, Field> RandSmallMatGen(F,T_);
 			RandMatGen.random(G) ;
 
 			MatrixDomain<Field> MD(F);
@@ -319,8 +311,8 @@ namespace LinBox
 			RandomBlasPermutation(P);
 			RandomBlasPermutation(Q);
 
-			PID_integer ZZ ;
-			BlasMatrixDomain< PID_integer > BMD(ZZ) ;
+			Givaro::ZRing<Integer> ZZ ;
+			BlasMatrixDomain< Givaro::ZRing<Integer> > BMD(ZZ) ;
 
 			BMD.mulin_left (A,Q);
 			BMD.mulin_right(P,A);
@@ -336,9 +328,27 @@ namespace LinBox
 	Matrix &
 	RandomDenseMatrix<Randiter, Field>::random( Matrix & A)
 	{
+		typename Field::Element d;
 		for (size_t i = 0 ; i < A.rowdim() ; ++i)
-			for (size_t j = 0 ; j < A.coldim() ; ++j)
-				R_.random(A.refEntry(i,j));
+			for (size_t j = 0 ; j < A.coldim() ; ++j) {
+				R_.random(d);
+				A.setEntry(i,j,d);
+			}
+		return A;
+	}
+
+	template<class Randiter, class Field>
+	template<class Matrix>
+	Matrix&
+	RandomDenseMatrix<Randiter, Field>::randomFullRank(Matrix &A)
+	{
+		long unsigned r,b,m,n;
+		m=A.rowdim();
+		n=A.coldim();
+		b=m<n?m:n;
+		do {
+			random(A);
+		} while(LinBox::rank(r,A,Method::Hybrid()) < b);
 		return A;
 	}
 
@@ -351,7 +361,7 @@ namespace LinBox
 						       int    rank
 						       , const Method & meth )
 	{
-		throw NotImplementedYet(__func__,__FILE__,__LINE__);
+		throw NotImplementedYet(LB_FILE_LOC);
 	}
 #endif
 
diff --git a/linbox/matrix/sliced3.doxy b/linbox/matrix/sliced3.doxy
new file mode 100644
index 0000000..040c2cc
--- /dev/null
+++ b/linbox/matrix/sliced3.doxy
@@ -0,0 +1,32 @@
+// Copyright 2014 LinBox. See COPYING for licence information.
+/*
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/**  \ingroup matrix
+ * \defgroup sliced3 Sliced Matrix
+ * \brief These are files related to a special bitsliced GF(3) representation
+ *
+ * NO DOC YET
+ *
+ */
+
+// vim:syn=doxygen
diff --git a/linbox/matrix/sliced3.h b/linbox/matrix/sliced3.h
new file mode 100644
index 0000000..c4b661f
--- /dev/null
+++ b/linbox/matrix/sliced3.h
@@ -0,0 +1,44 @@
+/* linbox/matrix/sparse-matrix.h
+ * Copyright (C) 2013 the LinBox
+ *
+ * Written by :
+ * bsy <bryouse at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/sliced3.h
+ * @ingroup matrix
+ */
+
+#ifndef __LINBOX_matrix_sliced3_H
+#define __LINBOX_matrix_sliced3_H
+
+#include "sliced3/dense-sliced.h"
+#include "sliced3/sliced-domain.h"
+
+#endif // __LINBOX_matrix_sliced3_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sliced3/Makefile.am b/linbox/matrix/sliced3/Makefile.am
new file mode 100644
index 0000000..225e6d5
--- /dev/null
+++ b/linbox/matrix/sliced3/Makefile.am
@@ -0,0 +1,30 @@
+# Copyright (c) 2013 the LinBox group
+#  ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the  GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# ========LICENCE========
+
+pkgincludesubdir=$(pkgincludedir)/matrix/sliced3
+
+
+pkgincludesub_HEADERS =         \
+	dense-matrix.h			\
+	dense-sliced.h			\
+	dense-sliced.inl		\
+	sliced-domain.h			\
+	sliced-stepper.h		\
+	submat-iterator.h
+
diff --git a/linbox/matrix/sliced3/dense-matrix.h b/linbox/matrix/sliced3/dense-matrix.h
new file mode 100644
index 0000000..e3739f8
--- /dev/null
+++ b/linbox/matrix/sliced3/dense-matrix.h
@@ -0,0 +1,524 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+/* linbox/matrix/dense-matrix.h
+ * Copyright (C) 2011 B. David Saunders,
+ * See COPYING for license information
+ *
+ * evolved from dense-submatrix and blas-matrix by B. David Saunders <saunders at cis.udel.edu>, BSY
+ */
+
+/*! @file matrix/sliced3/dense-submatrix.h
+ * @ingroup matrix
+ * @brief Representation of a submatrix of a dense matrix, not resizeable.
+ * This matrix type conforms to the \c LinBox::DenseMat interface.
+ * \c LinBox::BlasMatrix is an example of DenseSubmatrix.
+ */
+
+#ifndef __LINBOX_dense_matrix_H
+#define __LINBOX_dense_matrix_H
+
+#include <utility>
+#include "linbox/linbox-config.h"
+
+//#include "linbox/util/debug.h"
+//#include "linbox/matrix/matrix-domain.h"
+#include "linbox/vector/subvector.h"
+#include "submat-iterator.h"
+
+namespace LinBox
+{
+
+	/** @brief to be used in standard matrix domain
+	
+	 * Matrix variable declaration, sizing, entry initialization may involve one to 3 steps.
+	 * Matrix ops are container ops. (sizing, copying)  
+	 * Mathematically meaningful operations are to be found only in an associated matrix domain
+	 *
+	 * A matrix may be allocated or not.  A matrix initialized by a submatrix() call is not allocated.
+	 * When an allocated matrix goes out of scope or is reinitialized with init(), the memory is released 
+	 * and all submatrices of it become invalid.
+	 *
+	 * Allocating:
+	 * DenseMat A(2, 3); // allocation of mem for 6 entries at construction
+	 * DenseMat B; B.init(10, 10); // default constr and subsequent allocation for 100 entries.
+	 *
+	 * Allocation of memory plus entry initialization:
+	 * // a meaningful value of DenseMat::Entry x is set by a field or matrix domain.
+	 * DenseMat A(10, 10, x); 
+	 * DenseMat B: B.init(10, 10, x); 
+	 * DenseMat C(A); // allocation at copy construction.  A could be a submatrix of another.
+	 * A.read(istream)
+	 *
+	 * Nonallocation sizing:
+	 * // assume D declared, A initialized, n = A.coldim().
+	 * D.submatrix(A, 0, 1, 2, n-1); // D is 2 by n-1 in upper right of A.
+	 *
+	 * Entry initialization (and overwriting) in already sized matrices:
+	 * A.setEntry(i, j, x);
+	 * A = B; // A and B must have the same shape.
+
+	 * Entry read access. OK on const matrices
+	 * getEntry, write
+
+	 * Under consideration:  Require A.clear() on an allocated matrix before any action that would abandon
+	 * the allocated mem (init or submatrix).
+	 \ingroup matrix
+	 */
+	template<class _Element>
+	class DenseMat {
+		typedef _Element Entry;
+	public: // protected:  //TODO scope
+		Entry *_rep; // matrix entries on the heap.
+		bool _alloc; // iff _alloc, I am responsible for _rep allocation/deallocation.
+		size_t _rows; 
+		size_t _cols;
+		size_t _stride; // stride from row to row.  Entries in a row are contiguous.
+
+	public:
+		size_t rowdim() const { return _rows; } 
+		size_t coldim() const { return _cols; }
+
+		Entry& getEntry(Entry& x, size_t i, size_t j) const { 
+			linbox_check(i < _rows && j < _cols);
+			return x = *(_rep + i*_stride + j); 
+		}
+
+		Entry& setEntry(size_t i, size_t j, const Entry& x ) { 
+			//linbox_check((i < _rows && j < _cols));
+			return *(_rep + i*_stride + j) = x; 
+		}
+		// no refEntry - not well supportable in some matrix domains.
+
+		DenseMat() : _rep(NULL), _alloc(false), _rows(0), _cols(0), _stride(0) {}
+
+		void init(size_t m = 0, size_t n = 0) {
+			//std::cerr << m << " " << n << " <<<<<<" << std::endl;
+			if (_alloc) delete _rep; // abandon any prior def
+			if (m*n != 0) { 
+				_rep = new Entry[m*n]; _alloc = true;
+			} else { 
+				_rep = NULL; _alloc = false; 
+			}
+			size(m, n);
+		}
+
+		void init(size_t m, size_t n, const Entry& filler) {
+			if (_alloc) delete _rep; // abandon any prior def
+			if (m*n != 0) { 
+				_rep = new Entry[m*n]; _alloc = true;
+				for (size_t i = 0; i < m*n; ++i) _rep[i] = filler;
+			} else { 
+				_rep = NULL; _alloc = false; 
+			}
+			size(m, n);
+		}
+
+		/* Copy construction makes this a completely distinct copy of A.  
+		 * Entries of this are stored contiguously even if A is not contiguous (is a submatrix of another).
+		 * 
+		 * If memcpy is not valid for your entry type, specialize DenseMat for it.
+		 */
+		DenseMat(const DenseMat& A)
+		: _rep(new Entry[A._rows*A._cols]), _alloc(true), _rows(A._rows), _cols(A._cols), _stride(A._cols) 
+		{	
+			//std::cout << "copy construction " << _rep << std::endl;
+			//std::cout << "copy cons " << _rows << " " << _cols << std::endl;
+			*this = A; // copy A's data into _rep
+		}
+
+		~DenseMat() {
+			if (_alloc) delete _rep;
+		}
+
+		// For assignment, the matrices must have same size and not overlap in memory.
+		// This restriction could be loosened...
+		DenseMat& operator=(const DenseMat& B) {
+			linbox_check(_rows == B._rows && _cols == B._cols);
+			if (_cols == _stride && B._cols == B._stride) // both are contiguous
+				memcpy(_rep, B._rep, sizeof(Entry)*_rows*_cols);
+			else
+				for (size_t i = 0; i < _rows; ++i) // copy row by row
+					memcpy(_rep + i*_stride, B._rep + i*B._stride, sizeof(Entry)*_cols);
+			return *this;	
+		}
+		
+		/** Set this to be an m by n submatrix of A with upper left corner at i,j position of A.
+		 * Requires i+m <= A.rowdim(), j+n <= A.coldim(). 
+		 *
+		 * For instance, B.submatrix(A, i, 0, 1, A.coldim()) makes B the i-th row of A.
+		 */
+		void submatrix(const DenseMat & A, size_t i, size_t j, size_t m, size_t n) {
+			linbox_check(i+m <= A._rows && j+n <= A._cols);
+			if (_alloc) delete _rep; // abandon any prior def
+			_rep = A._rep + (i*A._stride + j);
+			_alloc = false;
+			_rows = m; _cols = n; _stride = A._stride;
+		}
+
+		/*  SLICED helper functions... maybe shouldn't be public */
+
+		//  size a matrix w/o allocating memory
+		void size(size_t m, size_t n){
+			_rows = m; _cols = _stride = n;
+		}
+
+		template<class vp>
+		int did_swapback(vp &swaps, size_t hot, size_t l, size_t r){
+			for(size_t i=l; i<r; ++i){
+				if(swaps[i].second == hot)
+					return swaps[i].first;
+			}
+			return -1;
+		}
+
+		template<class vp>
+		void flocs(vp & tos, vp & swaps){
+			std::vector<size_t> pos;
+			for(size_t i =0; i < coldim(); ++i)  pos.push_back(i);
+
+			for(int i = coldim()-1; i>= 0; --i){
+				//std::cerr << swaps[i] << std::endl;
+				swap(pos[swaps[i].first], pos[swaps[i].second]);
+			}
+
+			for(size_t i = 0; i < coldim(); ++i){
+				std::pair<size_t, size_t> p(i, pos[i]);
+				tos.push_back(p);
+			}
+		}
+
+		template<class vp>
+		size_t final_loc(vp &swaps, size_t j){
+			//  first check if we were swapped back prior to being reached
+			int to = did_swapback(swaps, j, 0, j+1);
+			if(to >= 0) return to;
+			//  next check if we get swapped back from our immediate neightbor
+			//size_t nbor = swaps[j].second;
+			//to = did_swapback(swaps, nbor, j+1, nbor);
+			//if(to >= 0) return to;
+			//  bad luck, we are chained forward, so 
+			size_t i = j;
+			while(to < 0){
+				size_t lc = swaps[i].first;
+				size_t rc = swaps[i].second;
+				to = did_swapback(swaps, rc, lc+1, rc+1);
+				//std::cerr << j << ": " << to << "= ds(swps, " << rc << "," << lc+1 << "," << rc+1 << ")" << std::endl;
+
+				i = rc;
+				if(to < 0 && rc == swaps.size() - 1){
+					to = swaps.size() - 1;
+				}
+			}
+			return to;
+		}
+
+		void randomColPermutation() {
+			typedef std::pair<size_t, size_t> pair;
+			typedef std::vector<pair> vp;
+			vp swaps;
+			vp tos;
+			vp tos2;
+			//  create pairs
+			for (size_t j = 0; j < coldim(); ++j){
+				// Each iteration swap col j with a random col in range [j..n-1].
+				int k = j + rand()%(coldim()-j);
+				//std::cerr << j << "->" << k << std::endl;
+				pair p(j,k);
+				swaps.push_back(p);
+				//for (size_t i = 0; i < rowdim(); ++i)
+					//swap( _rep[i*_stride + j], _rep[i*_stride + k]);
+			}
+			/*
+			//flocs(tos2, swaps);
+			//  find each final location
+			for(size_t j = 0; j < coldim(); ++j){
+				size_t to = final_loc(swaps, j);
+				pair p(j, to);
+				if(p != tos2[j]){
+					std::cerr << "HOUSTON: PROBLEM" << std::endl;
+				}
+				else{
+					std::cout << "YAY ";
+				}
+				tos.push_back(p);
+			}
+				*/
+			flocs(tos, swaps);
+			//  tos is the correct mapping now permute
+			Entry *perm_row = new Entry[coldim()];
+			for(size_t i = 0; i < rowdim(); ++i){
+				for(vp::iterator ti = tos.begin(); ti!= tos.end(); ++ti)
+					perm_row[(*ti).second] = _rep[i*_stride + (*ti).first];
+				memcpy(&(_rep[i*_stride]), perm_row, coldim()*sizeof(Entry));	
+			}
+			delete[] perm_row;
+			
+			//  CHECKING CODE
+			/*
+			std::cerr << "swaps: ";
+			for(vp::iterator i = swaps.begin(); i!= swaps.end(); ++i){
+				std::cerr << *i << " ";
+			}
+			std::cerr << std::endl;
+			std::cerr << "tos: ";
+			for(vp::iterator i = tos.begin(); i!= tos.end(); ++i){
+				std::cerr << *i << " ";
+			}
+			std::cerr << std::endl;
+			std::vector<int> orig;
+			for(size_t i = 0; i < coldim(); ++i) orig.push_back((int)i);
+			std::vector<int> out(orig);
+			std::vector<int> out2(orig);
+			for(vp::iterator i = swaps.begin(); i!= swaps.end(); ++i){
+				std::swap(out[(*i).first], out[(*i).second]);
+			}
+			for(vp::iterator i = tos.begin(); i!= tos.end(); ++i){
+				out2[(*i).second] = orig[(*i).first];
+			}
+			for(std::vector<int>::iterator i=out.begin(), i2=out2.begin(); i!=out.end(); ++i, ++i2){
+				if(*i != *i2){
+					std::cerr << "LOSER: ";
+					std::cerr << *i << " v " << *i2 << std::endl;
+				}
+			}
+			*/
+		}
+
+		void randomLowerTriangularColTransform() {
+			for (size_t j = 0; j < coldim(); ++j){
+				// Each iteration swap col j with a random col in range [j..n-1].
+				//int l = 1, k = 0;
+				//do { l *= RAND_MAX; k = k*RAND_MAX + rand(); } while (l < j);
+				//k = k%j;
+				int k = rand()%j;
+				for (size_t i = 0; i < rowdim(); ++i)
+					 _rep[i*_stride + j] += _rep[i*_stride + k];
+			}
+		}
+		/*  Iterators */
+
+		typedef SubMatIterator<_Element> RawIterator;
+		typedef ConstSubMatIterator<_Element> ConstRawIterator;
+
+		RawIterator rawBegin() { 
+			return RawIterator(_rep, _cols, _stride); };
+		RawIterator rawEnd() { 
+			return RawIterator(_rep + _rows*_stride); }
+		RawIterator rowBegin(size_t i) { 
+			//return rawBegin() + i*_cols;
+			return RawIterator(_rep+i*_stride, _cols, _stride);
+		}
+		RawIterator rowEnd(size_t i) { 
+			return rowBegin(i + 1); 
+		}
+		/*
+		RawIterator rowBegin(size_t i) { 
+			return rawBegin() + i*_cols; }
+		RawIterator rowEnd(size_t i) { 
+			return rowBegin(i + 1); }
+			*/
+
+		ConstRawIterator rawBegin() const { 
+			return ConstRawIterator(_rep, _cols, _stride); }
+		ConstRawIterator rawEnd() const { 
+			return ConstRawIterator(_rep + _rows*_stride); }
+		ConstRawIterator rowBegin(size_t i) const { 
+			return rawBegin() + i*_cols; }
+		ConstRawIterator rowEnd(size_t i) const { 
+			return rowBegin(i + 1); }
+
+		typedef DenseMat<_Element>   Self_t;       //!< Self type
+
+#if 0  // TODO factor out
+		/** @name typedef'd Row Iterators.
+		 *\brief
+		 * The row iterator gives the rows of the
+		 * matrix in ascending order. Dereferencing the iterator yields
+		 * a row vector in dense format
+		 * @{
+		 */
+		typedef Entry* RowIterator;
+		typedef const Entry* ConstRowIterator;
+		typedef Subvector<Entry*> Row;
+		typedef Subvector<const Entry*> ConstRow;
+		 //@} Row Iterators
+
+		/** @name typedef'd Column Iterators.
+		 *\brief
+		 * The columns iterator gives the columns of the
+		 * matrix in ascending order. Dereferencing the iterator yields
+		 * a column vector in dense format
+		 * @{
+		 */
+		typedef Subiterator<Entry> ColIterator;
+		typedef Subiterator<const Entry> ConstColIterator;
+		typedef Subvector<ColIterator>                   Col;
+		typedef Subvector<ConstColIterator>                   ConstCol;
+		//@} // Column Iterators
+#endif
+
+		template<typename _Tp1>
+		struct rebind {
+			typedef DenseMat<typename _Tp1::Element> other;
+		};
+
+		/** Read the matrix from an input stream.
+		 * @param file Input stream from which to read
+		 * @param field
+		 */
+		template<class Field>
+		std::istream& read (std::istream &file, const Field& field);
+
+		/** Write the matrix to an output stream.
+		 * @param os Output stream to which to write
+		 * @param field
+		 * @param mapleFormat write in Maple(r) format ?
+		 */
+		template<class Field>
+		std::ostream& write (std::ostream &os, const Field& field,
+				     bool mapleFormat = false) const;
+
+		/** Write the matrix to an output stream.
+		 * This a raw version of \c write(os,F) (no field is given).
+		 * @param os Output stream to which to write
+		 * @param mapleFormat write in Maple(r) format ?
+		 */
+		std::ostream& write (std::ostream &os,
+				     bool mapleFormat = false) const;
+
+		/*  TODO factor out row/col iterator
+		RowIterator rowBegin ();
+		RowIterator rowEnd ();
+		ConstRowIterator rowBegin () const;
+		ConstRowIterator rowEnd () const;
+
+		ColIterator colBegin ();
+		ColIterator colEnd ();
+		ConstColIterator colBegin () const;
+		ConstColIterator colEnd () const;
+		*/
+
+};
+	/*! Write a matrix to a stream.
+	 * The C++ way using <code>operator<<</code>
+	 * @param o output stream
+	 * @param Mat matrix to write.
+	 */
+	template<class T>
+	std::ostream& operator<< (std::ostream & o, const DenseMat<T> & Mat)
+	{
+		return Mat.write(o);
+	}
+
+	/*! @internal
+	 * @brief MatrixTraits
+	 */
+	/*  necessary?
+	template <class Element>
+	struct MatrixTraits< DenseMat<Element> > {
+		typedef DenseMat<Element> MatrixType;
+		typedef typename MatrixCategories::RowColMatrixTag MatrixCategory;
+	};
+	*/
+
+	template <class _Element>
+	template <class Field>
+	std::istream& DenseMat<_Element>::read (std::istream &file, const Field& field)
+	{
+		RawIterator p;
+
+		for (p = rawBegin (); p != rawEnd (); ++p) {
+			// each entry is seperated by one space.
+			file.ignore (1);
+			field.read (file, *p);
+		}
+
+		return file;
+	}
+
+	template <class _Element>
+	template <class Field>
+	std::ostream &DenseMat<_Element>::write (std::ostream &os, const Field& field,
+						       bool mapleFormat) const
+	{
+		return os;
+	}
+/*  TODO factor out RowIterator
+		ConstRowIterator p;
+
+		// integer c;
+		//int wid;
+
+		// field.cardinality (c);
+		//wid = (int) ceil (log ((double) c) / M_LN10); //BB : not used !
+
+		typename ConstRow::const_iterator pe;
+
+		if (mapleFormat) os << "[";
+
+		for (p = rowBegin (); p != rowEnd (); ++p) {
+			if (mapleFormat && (p != rowBegin()))
+				os << ',';
+			if (mapleFormat) os << "[";
+
+			for (pe = p->begin (); pe != p->end (); ++pe) {
+				if (mapleFormat && (pe != p->begin())) os << ',';
+				// matrix base does not provide this field(), maybe should?
+				//_M.field ().write (os, *pe);
+				//os << *pe;
+				//fixed by using extra field
+
+				field.write (os, *pe);
+				os << " ";
+			}
+
+			if (!mapleFormat)
+				os << std::endl;
+			else os << ']';
+		}
+
+		if (mapleFormat) os << ']';
+		return os;
+	}
+	*/
+
+	template <class _Element>
+	std::ostream &DenseMat<_Element>::write (std::ostream &os, bool mapleFormat) const
+	{
+		return os;
+	}
+	/*
+		ConstRowIterator p;
+
+
+
+		typename ConstRow::const_iterator pe;
+
+		if (mapleFormat) os << "[";
+
+		for (p = rowBegin (); p != rowEnd (); ++p) {
+			if (mapleFormat && (p != rowBegin()))
+				os << ',';
+			if (mapleFormat) os << "[";
+
+			for (pe = p->begin (); pe != p->end (); ++pe) {
+				if (mapleFormat && (pe != p->begin())) os << ',';
+
+				os << *pe;
+				os << " ";
+			}
+
+			if (!mapleFormat)
+				os << std::endl;
+			else os << ']';
+		}
+
+		if (mapleFormat) os << ']';
+		return os;
+	}
+	*/
+
+} // namespace LinBox
+
+#endif // __LINBOX_dense_matrix_H
+
diff --git a/linbox/matrix/sliced3/dense-sliced.h b/linbox/matrix/sliced3/dense-sliced.h
new file mode 100644
index 0000000..1c739a0
--- /dev/null
+++ b/linbox/matrix/sliced3/dense-sliced.h
@@ -0,0 +1,691 @@
+#ifndef __DENSE_SLICED_H
+#define __DENSE_SLICED_H
+
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/fcntl.h>
+
+/**
+  The matrix class Sliced is defined.
+  It adheres to the LinBox dense matrix interface.
+
+  It depends on SlicedBase, also defined here, which packs GF(3) elements
+  into a pair of ints. The int type is a template parameter.
+*/
+
+#include "dense-matrix.h"
+//#include <linbox/util/timer.h>
+//#include "sliced-stepper.h"
+
+
+namespace LinBox {
+
+/* SLICED BASE CODE
+   SlicedBase implements functios on a vector of GF(3) elements.
+   T is an integer type of some length n.
+   The vectors are of length n, packed into two T words in sliced fashion.
+   (Each element partakes of one bit from b0 and one bit from b1).
+
+   Most of the SlicedBase functios are in C++ operator form.
+ */
+template<class T>
+struct SlicedBase
+{
+public:
+	T& bits0(){return b0;}
+	T& bits1(){return b1;}
+
+	SlicedBase & operator=(const T &rhs){
+		b0 = rhs;
+		b1 = rhs;
+		return *this;
+	}
+
+	SlicedBase & operator=(const SlicedBase &rhs){
+		b0 = rhs.b0;
+		b1 = rhs.b1;
+		return *this;
+	}
+
+	//  only nontrivial multiplication in F(3) is *=2
+	//  which is negation, which is word swap
+	//  between the bits
+	SlicedBase & operator*=(const T &two){
+		//  this is multiplication by two only!!!!
+		//  we never even read the arg.
+		b1 ^= b0;
+		return *this;
+	}
+
+	SlicedBase operator*(const T &two) const{
+		return SlicedBase(*this) *= two;
+	}
+
+	//  used for masking both words
+	SlicedBase & operator&=(const T &mask){
+		b1 &= mask;
+		b0 &= mask;
+		return *this;
+	}
+
+	SlicedBase operator & (const T &rhs){
+		return SlicedBase(*this) &= rhs;
+	}
+
+	//  used for shifting both words
+	SlicedBase & operator>>=(const T &shift){
+		b1 >>= shift;
+		b0 >>= shift;
+		return *this;
+	}
+
+	SlicedBase operator >> (const T &rhs){
+		return SlicedBase(*this) >>= rhs;
+	}
+
+	//  used for shifting both words
+	SlicedBase & operator<<=(const T &shift){
+		b1 <<= shift;
+		b0 <<= shift;
+		return *this;
+	}
+
+	SlicedBase operator << (const T &rhs){
+		return SlicedBase(*this) <<= rhs;
+	}
+
+	//  used for combining value into both words
+	SlicedBase & operator|=(const T &val){
+		b1 |= val;
+		b0 |= val;
+		return *this;
+	}
+
+	//  used for combining two units
+	SlicedBase & operator|=(const SlicedBase &rhs){
+		b1 |= rhs.b1;
+		b0 |= rhs.b0;
+		return *this;
+	}
+
+	SlicedBase & operator+=(const SlicedBase &rhs){
+		T a = b0 ^ rhs.b1;
+		T b = b1 ^ rhs.b0;
+		T s = a ^ b1;
+		T t = b ^ rhs.b1;
+		b1 = a & b;
+		b0 = s | t;
+
+		return *this;
+	}
+
+	const SlicedBase operator+(const SlicedBase &rhs){
+		return SlicedBase(*this) += rhs;
+	}
+
+	//  comparison ops
+	bool operator==(const SlicedBase &rhs){
+		return b0 == rhs.bo && b1 == rhs.b1;
+	}
+
+	//  used for combining two units
+	bool operator!=(const SlicedBase &rhs){
+		return b0 != rhs.b0 || b1 != rhs.b1;
+	}
+
+	SlicedBase & zero(){
+		b0 = 0;
+		b1 = 0;
+		return *this;
+	}
+
+//protected:
+	T b0;
+	T b1;
+};
+
+/**
+	The Sliced Matrix class
+	_Domain must be  a GF(3) rep, BaseT must be an unsigned int type.
+	TODO more docs, discuss row/col slicing
+*/
+template <class _Domain>
+class Sliced : public DenseMat<SlicedBase<typename _Domain::Word_T> >
+{
+public:
+	typedef _Domain Domain;
+	typedef typename Domain::Scalar Scalar;
+	typedef typename Domain::Word_T SlicedWord;
+	typedef SlicedBase<SlicedWord> SlicedUnit;
+
+	typedef DenseMat<SlicedBase<typename _Domain::Word_T> > Base_T;
+	using Base_T::rawBegin;
+	using Base_T::rawEnd;
+	using Base_T::rowBegin;
+	using Base_T::rowEnd;
+	using Base_T::_stride;
+	using Base_T::_rep;
+	using Base_T::_alloc;
+	typedef typename Base_T::RawIterator RawIterator;
+	typedef Base_T Matrix;
+
+	enum op_t { ADD, SMUL, AXPY, ZERO, COPY };
+
+	Sliced() : Matrix(), _domain(Domain()), _m(0), _n(0), _colPacked(false),
+		_SIZE(8*sizeof(SlicedWord)), _sub(false) {}
+
+	Sliced(Domain d) : Matrix(), _domain(d), _m(0), _n(0), _colPacked(false),
+		_SIZE(8*sizeof(SlicedWord)), _sub(false) {}
+
+	//  Constructor taking dims and bool defaulting ROWPACKED
+	Sliced (Domain d, size_t m, size_t n, bool colP = false) :
+		Matrix(), _domain(d), _m(m), _n(n), _colPacked(colP), _i(0),
+			_SIZE(8*sizeof(SlicedWord)),
+		_j(0), _loff(0), _roff(0), _sub(0) {
+			Matrix::init(colP ? (m + _SIZE - 1)/_SIZE : m,
+					colP ? n : (n + _SIZE - 1)/_SIZE);
+	}
+
+	//  need to override parent size, because we are a different size
+	void size(size_t m = 0, size_t n = 0, bool cp = false){
+		_m = m; _n = n; _colPacked = cp;
+		_i = _j = _roff = _loff = _sub = 0;
+
+		if(_colPacked)
+			Matrix::size((m + _SIZE - 1)/_SIZE, n);
+		else
+			Matrix::size(m, (n + _SIZE - 1)/_SIZE);
+	}
+
+	//  need to override parent inits, because we are a different size
+	void init(size_t m = 0, size_t n = 0) {
+		_m = m; _n = n;
+		_i = _j = _roff = _loff = _sub = 0;
+ 		if(_colPacked)
+			Matrix::size((m + _SIZE - 1)/_SIZE, n);
+		else
+			Matrix::init(m, (n + _SIZE - 1)/_SIZE);
+	}
+
+	void init(size_t m, size_t n, const Scalar &filler){
+		init(m,n);
+
+		//  TODO stepper functionality, more efficient.
+		for(size_t i=0; i<m; ++i)
+			for(size_t j=0; j<n; ++j)
+				setEntry(i, j, filler);
+	}
+
+	void shiftSubMatDown(int i) {
+		_i=i+_i;
+		_rep=_rep+i*_stride;
+	}
+
+	Sliced & submatrix(Sliced &other, size_t i, size_t j, size_t m, size_t n){
+		_m = m;
+		_n = n;
+		_colPacked = other._colPacked;
+		_i = i;
+		_sub = true;
+
+		size_t headStart = other._loff ? _SIZE - other._loff : 0;
+		_j = j + headStart;
+		//  determine in which of parents' columns do we begin
+		size_t firstCol =  _j/_SIZE;
+
+		_loff = (_SIZE-(_j%_SIZE))%_SIZE;  // could prob. omit final mod?
+		_roff = (_j+n)%_SIZE;
+
+		// _roff really an offset? or just goes to "parent" matrix's normal end
+		//if( (_j+n) == other.coldim() )
+		//	_roff = 0;
+			//  AND IF our super matrix is < SIZE, special case we don't account for
+			/*  ^ this can cause the writing of a superfluous zero word in s_write_bin
+				if last word is next to first word in a submat */
+
+		//std::cerr << _j << " " << n << other.coldim();
+		//cerr << "LOFF: " << _loff << " ROFF: " << _roff << endl;
+		//std::cerr << "ijmn?" << i << " " << j << " " << m << " " << n << std::endl;
+		//cerr << "firstCol: " << firstCol << " _j: " << _j << " cols(): " << _cols << " other.cols(): " << other.cols() << endl;
+
+		//TODO colpacked version
+		this->Matrix::submatrix(other, i, firstCol, m, (n + (_j%_SIZE) + (_SIZE - 1))/_SIZE);
+
+		return *this;
+	}
+
+	const Domain& field() const {return _domain;}
+	Domain& field() {return _domain;}
+
+	//  blindly assumes "other" matrix is rowpacked...
+	Sliced (Sliced &other, size_t i, size_t j, size_t m, size_t n) : Matrix(), _domain(other._domain) {
+		//  we currently can't handle submatrices that reside entirely within
+		//  a single sliced unit, width-wise...
+		//  meaning < _SIZE columns, while both borders are in the same word
+		size_t begin = j+other._loff;
+		size_t end = begin+n;
+		size_t endTest = other._n < _SIZE ? other._n : _SIZE;
+		//  check if we're small enough, then check if we're on a border (which is OK)
+		if(n < _SIZE && begin%_SIZE && end%endTest){
+			size_t test = other._loff ? other._loff : _SIZE;
+			if((j+n) <= test){
+				std::cerr << "Unsupported submatrix request.  Submatrix entirely within a word" <<
+					" while not aligned with a left or right border" <<	std::endl;
+				//exit(-1);
+			}
+		}
+
+		//  passed the security checkpoint.  on to business
+		submatrix(other, i, j, m, n);
+	}
+
+//  incl functions to handle specialized cases (where submats are not word-aligned)
+#include "dense-sliced.inl"
+
+	//  typical addin, barge right through with the raw iterator
+	Sliced& addin(Sliced &other){
+		if(_loff || _roff)
+			return s_addin(other);
+
+		RawIterator a = rawBegin();
+		RawIterator c = rawEnd();
+		RawIterator b = other.rawBegin();
+
+		//for(; &(*a) != &(*c); ++a, ++b)
+		for(; a != c; ++a, ++b)
+			(*a) += (*b);
+
+		return *this;
+	}
+
+	Sliced& smulin(Scalar &x){
+		if(x == 1)
+			return *this;
+
+		if(_loff || _roff)
+			return s_smulin(x);
+
+		if(x == 0)
+			return zero();
+
+		//  x == 2
+		//int j = 0;
+		//for(RawIterator a = rawBegin(); j < rows()*cols() ; j+=_SIZE, ++a)
+		for(RawIterator a = rawBegin(); a != rawEnd(); ++a)
+			(*a)*=2;
+
+		return *this;
+	}
+
+	/*
+	Sliced& smul(Scalar &x){
+		return Sliced(*this).copy(*this).smulin(x);
+	}
+	*/
+
+	void setEntry(size_t i, size_t j, const Scalar &a_ij){
+		SlicedWord e = static_cast<SlicedWord>(a_ij);
+		//  determine location
+		//  TODO:  THIS SEEMS TO EXCPET _rep isn't adjusted for submatrix
+		//  whereas in dense-matrix.h, submatrix adjusts _rep.  need to study
+		//  the pros/cons of either approach but CANNOT MIX THEM
+		//  I think
+		//size_t word = (_i+i)*_stride + ((j+(_j%_SIZE))/_SIZE);
+		size_t word = i*_stride + ((j+(_j%_SIZE))/_SIZE);
+		//int w = i*Matrix::coldim() + ((j+(_j%_SIZE))/_SIZE);
+		//int w = ((j+(_j%_SIZE))/_SIZE);
+		//RawIterator word = rowBegin(i) + w;
+		//word += w;
+
+		size_t index = (_j+j) % _SIZE;
+
+		SlicedWord b1 = (e & 2) >> 1;
+		SlicedWord b0 = (e & 1) | b1;
+		SlicedWord one = 1;
+
+		//(*word) &= ~(one << index);
+		//(*word).b0 |= b0 << index;
+		//(*word).b1 |= b1 << index;
+
+		_rep[word] &= ~(one << index);
+
+		_rep[word].b0 |= b0 << index;
+		_rep[word].b1 |= b1 << index;
+	}
+
+	Scalar getEntry(size_t i, size_t j) {
+		Scalar retVal;
+		getEntry(retVal,i,j);
+		return retVal;
+	}
+
+	Scalar& getEntry(Scalar &x, size_t i, size_t j){
+		//int w = ((j+(_j%_SIZE))/_SIZE);
+		//  TODO:  see note in setEntry
+		size_t word = (_i+i)*_stride + ((j+(_j%_SIZE))/_SIZE);
+		//RawIterator word = rowBegin(i) + w;
+		//word += w;
+
+		size_t index = (_j+j) % _SIZE;
+
+		//cerr << "(w" << w << ",i" << index << ")";
+		//std::cerr << (*word).b0 << "x" << (*word).b1 << std::endl;
+
+		//int answer = (int)((((*word).b1 >> index) & 1) + (((*word).b0 >> index) & 1));
+		size_t answer = (size_t)(((_rep[word].b1 >> index) & 1) +
+				((_rep[word].b0 >> index) & 1));
+		//_domain.init(x, answer);
+		x = answer;
+		return x;
+	}
+
+	//  begin, end, scalar, other begin
+	Sliced & axpyin(RawIterator &b, RawIterator &e, Scalar &s, RawIterator &ob){
+		RawIterator x = b;
+		RawIterator y = ob;
+
+		switch(static_cast<int>(s)){
+			case 0:
+				return *this;
+			case 1:
+				if(_loff || _roff)
+					return s_axpyin(b, s, ob);
+				for(; x!=e; ++x,++y)
+					(*x) += (*y);
+				return *this;
+			case 2:
+				if(_loff || _roff)
+					return s_axpyin(b, s, ob);
+				for(; x!=e; ++x,++y){
+					(*x) += (*y)*2;
+				}
+				return *this;
+		}
+		return *this;
+	}
+
+	//  MUL:
+	//  become the product of two sliced matrices
+	//  (only seems to work if row packed so far)
+	//  (does not check for compatible sizes)
+	//  (does NOT work yet for two submatrices)
+	template <class Gettable>
+	Sliced & mul(Gettable& A, Sliced& B){
+		zero();
+
+		Scalar a_ij;
+		//  c&b - begin and end
+		RawIterator c_b, c_e, b_b; //, b_e;
+
+		size_t count = 0;
+		//  axpyin to C individual entries of A with rows of B
+		for(; count < rowdim(); ++count){
+			c_b = rowBegin(count);
+			c_e = rowEnd(count);
+
+			//Timer t;
+			//t.clear(); t.start();
+			for(size_t len = 0; len < A.coldim(); ++len){
+				//  element of A goes down rows of A.
+				//  (could improve on speed of method to get this value [step?])
+				a_ij = A.getEntry(a_ij, count, len);
+
+				//  this is axpy'd to THAT row of B.
+				b_b = B.rowBegin(len);
+				axpyin(c_b, c_e, a_ij, b_b);
+			}
+			//t.stop();  std::cerr << t << std::endl;
+		}
+		return *this;
+	}
+
+	std::ostream& write(std::ostream &os = std::cerr, size_t offset = 0){
+		Scalar t;
+		for(size_t i = 0; i<_m; i++){
+			for(size_t q=0; q<offset; ++q)
+				os << "  ";
+			for(size_t j = 0; j<_n; j++){
+				os << (size_t)getEntry(t, i, j);
+				/*  DEBUG _SIZE-BIT BOUNDARIES
+				if(offset && j && ! ((_j+j+1)%_SIZE)){
+				if(j && ! ((_j+j+1)%_SIZE))
+					os << "|";
+				else
+					os << " ";
+				}
+				else
+				*/
+					os << " ";
+			}
+			os << std::endl;
+		}
+		os << std::endl;
+		return os;
+	}
+
+	//  returns an (approximately) random _SIZE-bit word
+	SlicedWord randomLL(){
+		SlicedWord swr = 0;
+		for(size_t i=0; i<(_SIZE/8); ++i)
+			swr |= ((SlicedWord)(rand()%256) << (i << 3));
+		return swr;
+	}
+
+	//  completely randomizes sliced block entries
+	Sliced& random(size_t seed = 0){
+		if(seed) srand(seed);
+		//srand(seed);
+
+		RawIterator a = rawBegin();
+		//  TODO:  problem here is that
+		//  this will cause about 1/2 0's, 1/4 1's & 2's
+		for(; a != rawEnd(); ++a){
+			(*a).b0 = randomLL();
+			(*a).b1 = randomLL() & (*a).b0;
+
+			//std::cerr << (*a).b0 << "x" << (*a).b1 << std::endl;
+		}
+		return *this;
+	}
+
+	//  completely zeros out a sliced block
+	Sliced& zero(){
+		if(_sub && (_loff || _roff)){
+			Scalar t;
+			//  TODO (can do [[[slightly]]] better if we specialize for 0
+			return s_smulin(_domain.init(t,0));
+		}
+
+		//  there has to be a way to use a
+		//  low level mem* function to zero out a memory block
+		RawIterator a = rawBegin();
+		RawIterator b = rawEnd();
+		for(;a != b; ++a)
+			(*a).zero();
+
+		return *this;
+	}
+
+	bool isEqual(Sliced &other){
+        if (rows() != other.rows() || cols() != other.cols()) {
+			//std::cout << "shape mismatch" << std::endl;
+			return false;
+		}
+	//	if(_loff || _roff || other._loff || other._roff){
+			//  very slow... could be improved if both mats are aligned
+			Scalar x, y;
+			for(size_t i = 0; i<rows(); ++i)
+				for(size_t j = 0; j<cols(); ++j){
+					//std::cerr << getEntry(x, i, j) << "vs" << other.getEntry(y, i, j) << std::endl;
+					if(getEntry(x, i, j) != other.getEntry(y, i, j)) {
+						//std::cout << "entry mismatch " << i << " " << j << std::endl;
+						return false;
+					}
+				}
+	/*  fails for very small (1 by 1) matrix.
+		}
+		else{
+			//  otherwise just check _SIZE-bits at a time
+			//  TODO could be faster w/ memcmp, but not applicable for breaks "aligned" submats
+			for(RawIterator a = rawBegin(), b=other.rawBegin(); a != rawEnd(); ++a, ++b){
+				//int count = 0;
+				if((*a) != (*b)){
+					//cerr << (*a).b0 << "ver" << (*b).b0 << endl;
+					//cerr << (*a).b1 << "ver" << (*b).b1 << endl;
+					return false;
+				}
+			}
+		}
+	*/
+		return true;
+	}
+
+	bool isZero(){
+		if(_loff || _roff){
+			Scalar x;
+			for(size_t i = 0; i<rows(); ++i)
+				for(size_t j = 0; j<cols(); ++j)
+					if(getEntry(x, i, j))
+						return false;
+		}
+		else{
+			//  otherwise just check _SIZE-bits at a time
+			//  could prob be faster
+			for(RawIterator a = rawBegin(); a != rawEnd(); ++a){
+				if((*a).b0 || (*a).b1)
+					return false;
+			}
+		}
+		return true;
+	}
+
+	Sliced& deepcopy(Sliced &other){
+		if(_sub) return s_copy(other);
+
+		*this = other;
+		return *this;
+	}
+
+	std::ostream& writeRep(std::ostream &os = std::cerr){
+		for(RawIterator i=rawBegin(); i!=rawEnd(); ++i){
+			os << "0th bits: " << (SlicedWord)(*i).b0 << " 1st bits: " << (SlicedWord)(*i).b1 << std::endl;
+		}
+		os << std::endl;
+		return os;
+	}
+
+	size_t memSize(){
+		size_t bytesPerRow = ((_n + _SIZE-1)/_SIZE) * 2 * sizeof(SlicedWord);
+		return bytesPerRow  * _m;
+	}
+
+	std::ostream& writeBinary(std::ostream &os){
+		if(_sub){ //std::cerr << "\n\nNear death!\n\n" << std::endl;
+			return s_wb(os); } // TODO fix
+
+		size_t bytes = memSize();
+		//std::cerr << "WRITE " << bytes << " BYTES." << std::endl;
+		os.write((char *)&(*_rep), bytes);
+
+		return os;
+	}
+
+	//  assumes we're NOT a submatrix (read into contiguous block)
+	std::istream& readBinary(std::istream& is){
+		if(_sub){ //std::cerr << "\n\nDeath!\n\n" << std::endl;
+			return s_rb(is); }
+		size_t bytes = memSize();
+		is.read((char *)&(*_rep), bytes);
+		// std::cerr << "READ " << bytes << " BYTES." << std::endl;
+		return is;
+	}
+	/*
+	bool writeBinaryFile(const char *file){
+		ofstream bin;
+		bin.open(file, ios::out | ios::binary);
+		if(!bin){ std::cerr << "failure opening " << file << std::endl; return false; }
+		writeBinary(bin);
+		bin.close();
+		return true;
+	}
+
+	bool readBinaryFile(const char *file){
+		ifstream in;
+		in.open(file, ios::in | ios::binary);
+		if(!in){ std::cerr << "failure opening " << file << std::endl; return false; }
+		readBinary(in);
+		in.close();
+		return true;
+	}
+
+    void mmapFile(int fd){
+		if(_alloc){
+			std::cerr << "alloc'd matrix trying to mmap." << std::endl;
+			close(fd);
+			return;
+		}
+        size_t bytes = memSize();
+
+        //_rep = (Sliced::SlicedUnit *)mmap(0, bytes, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+		//TODO MAP_HUGETLB
+        _rep = (Sliced::SlicedUnit *)mmap(0, bytes, PROT_READ | PROT_WRITE, MAP_SHARED , fd, 0);
+        if((void *)_rep == MAP_FAILED) {
+            close(fd);
+            perror("Error mapping the file.");
+        }
+    }
+
+    void mmapBinaryFile(const char *file){
+        int fd = open(file, O_RDWR);
+        if(fd == -1) {
+            perror("Error opening file to mmap.");
+        }
+		mmapFile(fd);
+    }
+	*/
+    void munmapBinaryFile(){
+        size_t bytes = memSize();
+        munmap((void *)_rep, bytes);
+    }
+
+	_Domain& domain(){ return _domain; }
+
+	size_t rows(){ return _m; }
+	size_t cols(){ return _n; }
+	size_t rowdim()const{ return _m; }
+	size_t coldim()const{ return _n; }
+
+	size_t l(){ return _loff; }
+	size_t r(){ return _roff; }
+
+	//  pointer/offset info for debugging
+	void pinfo(){
+		std::cerr << "Matrix @ ";
+		RawIterator i = rawBegin();
+		i.pinfo();
+		std::cerr << "\t" << _m << " x " << _n << std::endl;
+		std::cerr << "\tLO: " << _loff << " RO: " << _roff << std::endl;
+		std::cerr << std::endl;
+	}
+
+	//  size info for debugging
+	void sinfo(){
+		std::cerr << "Matrix " << _m << " by " << _n << std::endl;
+		std::cerr << "... " << _m * _n / 4 << " bytes." << std::endl;
+	}
+
+private:
+	_Domain _domain;
+	size_t _m, _n;
+	bool _colPacked;
+	//  SUBMATRIX
+	size_t _i, _j;
+	size_t _loff, _roff; //left & right offsets
+	size_t _SIZE;
+	bool _sub;
+}; // Sliced
+
+}
+
+#endif // __DENSE_SLICED_H
diff --git a/linbox/matrix/sliced3/dense-sliced.inl b/linbox/matrix/sliced3/dense-sliced.inl
new file mode 100644
index 0000000..72fb645
--- /dev/null
+++ b/linbox/matrix/sliced3/dense-sliced.inl
@@ -0,0 +1,391 @@
+#ifndef SLICED_INL
+#define SLICED_INL
+// This is designed to be included in the middle of the Sliced class declaration.
+
+/*
+	void splitOp(SlicedUnit &a, op_t t, bool first, int offset, int arg = 0, SlicedUnit &b = 0);
+	Sliced& s_addin(Sliced &other);
+	Sliced& s_smulin(Scalar &x);
+	Sliced & s_axpyin(RawIterator &b, RawIterator &e, Scalar &s, RawIterator &ob);
+*/
+
+	//  addin, axpyin, 
+	void compatible(){
+		
+	}
+
+	//  if we're a submatrix, we must not touch bits outside
+	//  our boundary if we begin or end in the middle of a sliced word
+	//  this helper function will do the operation
+	//  a is the input/output sliced word.  t is the operation
+	//  "last" is false if [0,offset] part of word, true if [offset,_SIZE-1]
+	//  arg is in case of smul or axpy, the scalar multiple
+	//  b is the other word in case of a binary operation
+	void splitOp(SlicedUnit &a, op_t t, bool last, int offset, Scalar &arg, SlicedUnit &b){
+		//std::cerr << "DSINL" << std::endl;
+
+		SlicedWord computeMask;
+		SlicedWord one = (SlicedWord)1;
+
+		if(last)
+			computeMask = (one << offset) - 1; // 2^offset - 1
+		else
+			computeMask = ~((one << (_SIZE-offset)) - 1);
+
+		/*
+		cerr << "arg: " << arg << endl;
+		cerr << "COMPUTEMASK: " << computeMask << endl;
+		cerr << "0: " << a.b0 << "  1: " << a.b1 << endl;
+		*/
+
+		SlicedUnit save = a & (~computeMask);
+
+		switch(t){
+			case AXPY:
+				if(arg == 2){
+					a += b*arg;
+					break;
+				}
+				//  else arg will be 1, fall to add
+			case ADD:
+				a += b;
+				break;
+			case SMUL:
+				if(arg){
+					a *= arg;
+					break;
+				}
+				//  else arg will be 0, fall to zero
+			case ZERO:
+				a.zero();
+				break;
+			case COPY:
+				a = b;
+				break;
+		}
+
+		a &= computeMask; // zero out bits that aren't "ours"
+		a |= save;  //  retrieve bits that we "never touched"
+	}
+
+	//  specialized addin, care must be taken at beg. and end of rows
+	Sliced& s_addin(Sliced &other){
+		RawIterator rit = rawBegin();
+		RawIterator o = other.rawBegin();
+		Scalar t;
+
+		size_t i, j;
+		//  loop all rows
+		for(i=0; i<rows(); ++i){
+			j = 0;
+			//  do first elt
+			if(_loff){
+				splitOp(*rit, ADD, false, _loff, t, *o);
+				++rit; ++o;
+				j+=_loff;
+			}
+			//  do "middle" elts
+			for(; j<cols()-_roff; j+=_SIZE, ++rit, ++o)
+				(*rit) += (*o);
+			//  do "last" elt
+			if(_roff){
+				splitOp(*rit, ADD, true, _roff, t, *o);
+				++rit; ++o;
+			}
+		}
+		return *this;
+	}
+
+	//  specialized smulin, care must be taken at beg. and end of rows
+	Sliced& s_smulin(Scalar &x){
+		RawIterator rit = rawBegin();
+		size_t i, j;
+		//  loop all rows
+		for(i=0; i<rows(); ++i){
+			j = 0;
+			//  do first elt
+			if(_loff){
+				splitOp(*rit, SMUL, false, _loff, x, *rit);
+				++rit;
+				j+=_loff;
+			}
+			//  do "middle" elts
+			if(x == 0){
+				for(; j<cols()-_roff; j+=_SIZE, ++rit){
+					//rit.pinfo();
+					(*rit).zero();
+				}
+			}
+			else{
+				for(; j<cols()-_roff; j+=_SIZE, ++rit){
+					(*rit) *= x;
+				}
+			}
+			//  do "last" elt
+			if(_roff){
+				//cerr << "ROFF" <<  _roff << endl;
+				//rit.pinfo();
+				splitOp(*rit, SMUL, true, _roff, x, *rit);
+				++rit;
+			}
+		}
+		return *this;
+	} 
+
+	//  arguments: begin iter, scalar, other mat's begin iter
+	Sliced & s_axpyin(RawIterator &rit, Scalar &s, RawIterator &o){
+		size_t j = 0;
+		//  NO ROWS, WE ASSUME TO WORK ON A SINGLE ROW
+			j = 0;
+			//  do first elt
+			if(_loff){
+				splitOp(*rit, AXPY, false, _loff, s, *o);
+				++rit; ++o;
+				j+=_loff;
+			}
+			//  do "middle" elts
+			if(s == 1){
+				for(; j<cols()-_roff; j+=_SIZE, ++rit, ++o)
+					(*rit) += (*o);
+			}
+			else if(s == 2){
+				for(; j<cols()-_roff; j+=_SIZE, ++rit, ++o)
+					(*rit) += (*o)*2;
+			}
+			//  do "last" elt
+			if(_roff)
+				splitOp(*rit, ADD, true, _roff, s, *o);
+		//  END OF (NO) ROWS
+		return *this;
+	}
+
+	//  specialized copy, care must be taken at beg. and end of rows
+	Sliced & s_copy(Sliced &other){
+		RawIterator rit = rawBegin();
+		RawIterator o = other.rawBegin();
+
+		Scalar t;
+
+		/* for an undeveloped,
+			more complicated but likely faster
+			memcpy for middle of rows
+		int midSection = ((cols()-(_loff+_roff))+_SIZE-1)/_SIZE;
+		int bytes = midSection * 2 * sizeof(SlicedWord);
+		int data_offset = 0;
+		*/
+
+		size_t i, j;
+		//  loop all rows
+		for(i=0; i<rows(); ++i){
+			j = 0;
+			//  do first elt
+			if(_loff){
+				splitOp(*rit, COPY, false, _loff, t, *o);
+				++rit; ++o;
+				j+=_loff;
+			}
+			//  do "middle" elts // TODO could be memcpy -> faster
+			for(; j<cols()-_roff; j+=_SIZE, ++rit, ++o)
+				(*rit) = (*o);
+			//  do "last" elt
+			if(_roff){
+				splitOp(*rit, COPY, true, _roff, t, *o);
+				++rit; ++o;
+			}
+		}
+		return *this;
+	}
+
+	//  IF THERE IS A LEFT OFFSET (RIGHT OFFSET POSSIBLE, TOO)
+	//  specialized copy, care must be taken at beg. and end of rows
+	std::ostream & s_write_bin(std::ostream &os){
+		// how many bits do we have room for?
+		int A = _SIZE - _loff; 
+		int spill = _roff ? _roff - A : _SIZE - A;
+
+		SlicedWord one = (SlicedWord)1;
+		//  lower bits mask
+		SlicedWord mask_lowbits = (one << A) - one;
+		//  for last word, move _roff bits if _roff < A
+		SlicedWord last_mask;
+		last_mask = spill < 0 ? (one << _roff) - one : mask_lowbits;
+
+		//  storing temp values
+		SlicedUnit lower, upper;
+		int SWsize = 2 * sizeof(SlicedWord);
+
+		//  for rare case of only one sliced-word per row (< _SIZE elts)
+		bool onlyOne = false;  //  robusto
+
+		RawIterator rit, e;
+		//  loop all rows
+		for(size_t i=0; i<rows(); ++i){
+
+			rit = rowBegin(i);  // first in the row
+			e = ((rowEnd(i))); // e is after the last in the row
+			--e;  // e is now the last in the row
+			if(rit == e) onlyOne=true; //  if there's only one sliced word in this row
+			else --e;  //  e will now be the 2nd-to-last in the row
+
+			//  iterate until 2nd to last word:
+			for( ; rit!=e; ){
+				//  get "end" of "current" word and make it our beginning
+				lower = (*rit);
+				lower >>=A;
+				//  move to next word
+				++rit;
+				//  get "beginning" of "next" word and make it our end
+				upper = (*rit);
+				(upper &= mask_lowbits) <<= _loff;
+				lower |= upper;	 //  lower now has values we want
+				os.write((char *)&lower, SWsize);  // write to file
+			}
+			//  process the end of the row
+			lower = (*rit);
+			lower >>= A;  
+			//  no further data
+			if(onlyOne){
+				os.write((char *)&lower, SWsize);
+			}
+			else{ // one more word to split up
+				++rit;
+				upper = (*rit);
+				(upper &= last_mask) <<= _loff;
+				lower |= upper;
+				os.write((char *)&lower, SWsize);
+				//  process final word, if necessary
+				if(spill > 0){
+					lower = (*rit);
+					lower >>= A;
+					//  mask to "our" bits
+					if(_roff)
+						lower &= ((one << spill) - one);
+					os.write((char *)&lower, SWsize); // write 2nd-to-final
+				}
+			}
+		}
+		return os;
+	}
+
+	//  IF THERE IS A RIGHT-OFFSET ONLY
+	//  specialized copy, care must only be taken at end of rows
+	std::ostream & s_write_bin_r(std::ostream &os){
+		//  TODO  - I can't just declare these
+		RawIterator rit = rowBegin(0); RawIterator e = rowEnd(0);
+
+		SlicedWord one = (SlicedWord)1;
+		//  lower bits mask
+		SlicedWord right_mask = (one << _roff) - one;
+
+		//  storing last word's temp value
+		SlicedUnit final;
+
+		//  size of a sliced unit
+		int SWsize = 2 * sizeof(SlicedWord);
+		//  accounts for all but the last sliced unit (the -1)
+		int bytesPerRow = (((_n + _SIZE-1)/_SIZE) - 1) * SWsize;
+
+		//  loop all rows
+		for(size_t i=0; i<rows(); ++i){
+			//  set up pointers
+			rit = rowBegin(i);
+			e = (--(rowEnd(i)));  // the last sliced unit
+
+			//  block write all but the last sliced unit:
+			os.write((char *)&(*rit), bytesPerRow); 
+
+			//  process the last unit:
+			final = (*e);
+			final &= right_mask;  //  cut down to size
+			os.write((char *)&final, SWsize);
+		}
+		return os;
+	}
+
+   //  if we're a submatrix
+   std::ostream & s_wb(std::ostream &os){
+      if(_loff) return s_write_bin(os);
+      else if(_roff) return s_write_bin_r(os);
+
+      //  else we're totally aligned, 
+      //  safe to write row at a time
+      int bytesPerRow = ((_n + _SIZE-1)/_SIZE) * 2 * sizeof(SlicedWord);
+
+      for(size_t i = 0; i < _m; ++i){
+         os.write((char *)(&*rowBegin(i)), bytesPerRow);
+      }
+
+      return os;
+   }
+
+	//  ------------------------------------------------------------
+	//  TODO: there is a major major hack here
+	//  TODO: and it's serious.
+	//  right now we're assuming we WANT zeroes in the last word
+	//  there is NO MAINTAINING of the right half of the last word
+	//  the way the fn is written.
+
+	//  IF THERE IS A RIGHT-OFFSET ONLY
+	//  specialized copy, care must only be taken at end of rows
+	std::istream & s_read_bin_r(std::istream &is){
+		//std::cerr << "Well, here we are..." << std::endl;
+		//  TODO  - I can't just declare these
+		RawIterator rit = rowBegin(0); RawIterator e = rowEnd(0);
+
+		//SlicedWord one = (SlicedWord)1;
+		//  lower bits mask
+		//SlicedWord right_mask = (one << _roff) - one;
+		//  storing last word's temp value
+		//SlicedUnit final;
+
+		//  size of a sliced unit
+		int SWsize = 2 * sizeof(SlicedWord);
+		//  accounts for all but the last sliced unit (the -1)
+		int bytesPerRow = (((_n + _SIZE-1)/_SIZE) - 1) * SWsize;
+
+		//  loop all rows
+		for(size_t i=0; i<rows(); ++i){
+			//  set up pointers
+			rit = rowBegin(i);
+			e = (--(rowEnd(i)));  // the last sliced unit
+
+			//  block read all but the last sliced unit:
+			is.read((char *)&(*rit), bytesPerRow); 
+
+			//  read the last one (should have zeros automatically
+			is.read((char *)&(*e), SWsize);
+
+			// should have zeroes automatically... 
+			//  following lines (form above) not needed
+
+			//  process the last unit:
+			//final = (*e);
+			//final &= right_mask;  //  cut down to SWsize
+			//os.write((char *)&final, SWsize);
+		}
+		return is;
+	}
+
+	// if we're a submatrix
+	std::istream& s_rb(std::istream &is){
+		if(_loff){ std::cerr << "MEGA DEATH" << std::endl; exit(-1); }
+		if(_roff) return s_read_bin_r(is);
+
+		//  else we're totally aligned, 
+		//  safe to write row at a time
+		int bytesPerRow = ((_n + _SIZE-1)/_SIZE) * 2 * sizeof(SlicedWord);
+
+		for(size_t i = 0; i < _m; ++i){
+			is.read((char *)(&*rowBegin(i)), bytesPerRow);
+		}
+
+		return is;
+	}
+
+/* //  MUL:
+	Sliced & s_mul(Sliced& A, Sliced& B){
+		return *this;
+	}
+*/
+
+#endif // __SLICED_INL
diff --git a/linbox/matrix/sliced3/sliced-domain.h b/linbox/matrix/sliced3/sliced-domain.h
new file mode 100644
index 0000000..f31f964
--- /dev/null
+++ b/linbox/matrix/sliced3/sliced-domain.h
@@ -0,0 +1,165 @@
+#ifndef __SLICED_DOMAIN_H
+#define __SLICED_DOMAIN_H
+
+#include "dense-sliced.h"
+#include "linbox/matrix/matrix-domain.h"
+
+/*
+The SlicedDomain template over a Field type parameter has constructor from an instance of Field which must represent GF(3).
+The SlicedDomain::Matrix subtype meets the sliced dense matrix concept
+and it is the interface for working with sliced matrices.
+A Blackbox is any matrix type that has apply and applyTranspose applicable to Matrix.  That is to say the signature of apply is 
+  Matrix& Blackbox::apply(Matrix& Y, const Matrix& X)
+
+SlicedDomain provides, for A a Matrix and B a Blackbox(preconditioner) 
+  mulin(A, B) // A *= B
+  addin(A, A2) // A += A2
+*/
+
+namespace LinBox {
+
+template<class Field, class WordT=unsigned long long int>
+class SlicedField : public Field {
+public:
+	SlicedField():Field(3) {}
+	SlicedField(size_t p, size_t e=1) : Field(p)
+	{  if (p != 3 || e != 1) throw LinBoxError("bad field"); }
+};
+
+//template<>
+template<class _Field,class _WordT>
+class MatrixDomain<SlicedField<_Field,_WordT> > : public _Field {
+public:
+	typedef _Field Field;
+	typedef _WordT Word_T;
+	typedef typename _Field::Element Element;
+	typedef Element Scalar;
+	typedef Sliced<MatrixDomain> Matrix;
+	typedef Sliced<MatrixDomain> OwnMatrix;
+
+	MatrixDomain () : Field(3) {}
+	//MatrixDomain (size_t p, size_t e = 1) : Field(p, e) {}
+	MatrixDomain (size_t p, size_t e = 1) : Field(p) 
+	{  if (p != 3 || e != 1) throw LinBoxError("bad field"); }
+	MatrixDomain(const Field& F) : Field(3) {}
+	MatrixDomain(Field& F) : Field(3) {}
+
+	MatrixDomain& operator=(const MatrixDomain<SlicedField<Field, Word_T> >& R) 
+	{ static_cast<Field*>(this)->operator= (R); return *this; }
+
+// A domain provides field functions and (dense) matrix functions.
+
+// field functions
+	using Field::mOne;
+	using Field::zero;
+	using Field::one;
+	using Field::init;
+	using Field::add;	
+	using Field::sub;	
+	using Field::neg;	
+	using Field::mul;	
+	using Field::div;	
+	using Field::inv;	
+	using Field::axpy;	
+	using Field::addin;	
+	using Field::subin;	
+	using Field::negin;	
+	using Field::mulin;	
+	using Field::divin;	
+	using Field::invin;	
+	using Field::axpyin;	
+	using Field::isZero;	
+	using Field::isOne;	
+	using Field::areEqual;	
+	using Field::cardinality;
+	using Field::characteristic;
+	using Field::write;
+	using Field::read;
+
+// matrix functions
+
+	// Y += X, where X and Y are conformally packed (both row or both col).
+	Matrix& addin (Matrix& Y, Matrix& X) { 
+		return Y.addin(X);
+	}	
+
+	// X *= a
+	Matrix& smulin (Matrix& X, Scalar& a) { 
+		return X.smulin(a);
+	}
+
+	// X -= X
+	Matrix& neg (Matrix& X) { 
+		return X.smulin(mOne);
+	}
+
+	//  return C <-- A * B
+	//  is assuming row sliced
+	template <class Gettable> // any matrix rep with getEntry().
+	Matrix & mul (Matrix& C, Gettable& A, Matrix& B){
+		return C.mul(A,B);
+	}
+
+	// A += x*B
+	Matrix& axpyin( Matrix& A, Scalar& x, Matrix &B) {
+		typename Matrix::RawIterator Ab(A.rawBegin()), Ae(A.rawEnd()), Bb(B.rawBegin());
+		return A.axpyin(Ab, Ae, x, Bb);
+	}
+
+	//  C += A * B
+	Matrix& axpyin(Matrix& C, Matrix& A, Matrix &B) {
+		//  temp mat to store mul
+		Matrix T;
+		T.init(A.rowdim(), B.coldim());
+		mul(T, A, B);
+		return addin(C, T);	
+	}
+
+	Matrix& saxpyin(Matrix& Y, Scalar& a, Matrix& B) {
+		return axpyin(Y,a,B);
+	}
+
+	Matrix& random(Matrix &A, size_t seed=0) const {
+		return A.random(seed);
+	}
+
+	Matrix& clear(Matrix &A) const {
+		return A.zero();
+	}
+
+	// assignment operator will not be a deep copy
+	Matrix& deepcopy(Matrix &dst, Matrix& src) const {
+		return dst.deepcopy(src);
+	}
+
+	// submatrix is a Matrix member function, not here.
+	/*
+	Matrix& submatrix(Matrix& super, size_t i, size_t j, size_t m, size_t n) const {
+		return *(new Matrix(super, i, j, m, n));
+	}
+	*/
+
+	bool areEqual(Matrix& A, Matrix &B) const {
+		return A.isEqual(B);
+	}
+
+	std::ostream& write(std::ostream& os, Matrix& A) const { 
+		return A.write(os << A.rowdim() << " " << A.coldim() << std::endl); 
+	}
+	std::istream& read(std::istream& is, Matrix& A) const { 
+		size_t r, c;
+		Element x; init(x);
+		is >> r >> c;
+		A.init(r, c);
+		for (size_t i = 0; i < r; ++i)
+			for (size_t j = 0; j < c; ++j){
+				read(is, x);
+				A.setEntry(i, j, x);
+			}
+		return is; 
+	}
+};
+
+}
+	
+#endif // __SLICED_DOMAIN_H
diff --git a/linbox/matrix/sliced3/sliced-stepper.h b/linbox/matrix/sliced3/sliced-stepper.h
new file mode 100644
index 0000000..f304056
--- /dev/null
+++ b/linbox/matrix/sliced3/sliced-stepper.h
@@ -0,0 +1,63 @@
+#ifndef __SLICED_STEPPER_H
+#define __SLICED_STEPPER_H
+
+#include "dense-sliced.h"
+#include "sliced-domain.h"
+#include <linbox/field/modular.h>
+
+namespace LinBox{
+
+// To fill a sliced vector
+struct stepper {
+
+	typedef SlicedDomain<Givaro::Modular<uint8_t> > Domain;
+	typedef Sliced<Domain > Matrix;
+	typedef Matrix::Scalar Scalar;
+	typedef Matrix::RawIterator RawIterator;
+	typedef Matrix::SlicedUnit SlicedUnit;
+
+	Matrix &_A;
+	RawIterator _r;
+	size_t _i; 
+	const static size_t SIZE = sizeof(Domain::Word_T)*8;
+	Scalar _store[SIZE];
+
+	stepper(Matrix & A) : _A(A), _r(_A.rawBegin()), _i(SIZE-1) { }
+
+	virtual inline void flush(){
+			//_r.pinfo();
+			//std::cerr << std::endl;
+			SlicedUnit &t = (*_r);
+			t.zero();
+			for(size_t i = _i + 1; i < SIZE; ++i){
+				//std::cerr << (int)_store[i] << " ";
+				/*
+				t <<= 1;
+				if(_store[i] > 1) t |= 1;
+				else t.b0 |= _store[i];
+				*/
+				t <<= 1;
+				t.b1 |= ((_store[i] & 2) >> 1); 
+				t.b0 |= ((_store[i] & 1) | t.b1);
+				//std::cerr << (int)t.b0 <<  " & " << (int)t.b1 << std::endl;
+			} 
+			//std::cerr << "----------------" << std::endl;
+			_i = SIZE-1;
+			++_r;
+	}
+
+	inline void step(Scalar e) { 
+		//std::cerr << (int)e << " ";
+		_store[_i--] = e;
+		if(_i > SIZE) flush();
+	}
+
+	inline void row(){
+		if(_i != SIZE-1) flush();
+	}
+
+};
+
+} // LinBox
+
+#endif // __SLICED_STEPPER_H
diff --git a/linbox/matrix/sliced3/submat-iterator.h b/linbox/matrix/sliced3/submat-iterator.h
new file mode 100644
index 0000000..2454296
--- /dev/null
+++ b/linbox/matrix/sliced3/submat-iterator.h
@@ -0,0 +1,125 @@
+#ifndef __LINBOX_sliced3_SMI_H
+#define __LINBOX_sliced3_SMI_H
+
+namespace LinBox{
+
+template<typename E>
+struct SubMatIterator { // periodic gaps iterator
+	E * _me, * _end;
+	size_t _s1; //stride from end of a row to beginning of next.
+	size_t _s2; //stride from one row the next (same position in each).
+
+	SubMatIterator () : _me(0), _end(0), _s1(0), _s2(0) {
+	}
+
+	SubMatIterator (E* loc, size_t c = 0, size_t stride = 0) 
+		: _me(loc), _end(loc+c), _s1(stride - c), _s2(stride) {
+//			std::cerr << "created with " << c << std::endl;
+	}
+
+	SubMatIterator(const SubMatIterator& p) 
+		: _me(p._me), _end(p._end), _s1(p._s1), _s2(p._s2) {
+	}
+
+	SubMatIterator& operator=(const SubMatIterator& p) {
+		_me = p._me; _end = p._end; _s1 = p._s1; _s2 = p._s2;
+		return *this;
+	}
+
+	/*  debugging */
+	void pinfo(){
+		std::cerr << "Iterator info; me: " << _me << " end: " << _end << std::endl;
+	}
+
+	E& operator*() const { return *_me; 
+	}
+
+	// untested
+	SubMatIterator operator+(int n) {
+		SubMatIterator p(*this); return p += n;
+	}
+
+	SubMatIterator& operator+=(size_t n) {
+		size_t q = n/(_s2 - _s1); // q is number of whole rows to jump
+		std::ptrdiff_t r = n - q*(_s2 - _s1);
+		size_t m = q*_s2;
+		_me += m + r; _end += m;
+		if (_end <= _me) { _me += _s1; _end += _s2; }
+		return *this;
+	} 
+
+	SubMatIterator& operator++() { 
+		if (++_me == _end) { _me += _s1;  _end += _s2; } 
+		return *this; 
+		/*
+		bool a = (++_me == _end);
+		_me += (_s1 && a);
+		_end += (_s2 && a)
+		*/
+	}
+
+	// untested
+	SubMatIterator operator++(int) {
+		SubMatIterator p(*this); ++*this; return p;
+	} 
+
+	// untested
+	SubMatIterator& operator--() {
+		//if (--_me == _end + (_s2-_s1) - 1) { _me -= _s1; _end -= _s2; }		
+		//Above broken. I think this fixes it:  Bryan
+		if (--_me == (_end - (_s2-_s1+1))) { _me -= _s1; _end -= _s2; }		
+		return *this;
+	}
+
+	// untested
+	SubMatIterator operator--(int) {
+		SubMatIterator p = *this; --*this; return p;
+	} 
+
+	bool operator==(const SubMatIterator&  b) const { return _me == b._me; 
+	}
+
+	bool operator!=(const SubMatIterator&  b) const { return _me != b._me; 
+	}
+}; // SubMatIterator
+
+template<typename E>
+struct ConstSubMatIterator { // periodic gaps iterator
+	E * _me, * _end;
+	size_t _s1, _s2;
+
+	ConstSubMatIterator () : _me(0), _end(0), _s1(0), _s2(0) {
+	}
+	ConstSubMatIterator (E * loc, size_t c = 0, size_t stride = 0) : _me(loc), _end(loc+c), _s1(stride - c), _s2(stride) {
+	}
+
+	ConstSubMatIterator(const ConstSubMatIterator& p) : _me(p._me), _end(p._end), _s1(p._s1), _s2(p._s2) {
+	}
+
+	const E& operator*() const { 
+		return *_me; 
+	}
+
+	ConstSubMatIterator& operator++() { 
+		++_me; if (_me == _end) { _me += _s1;  _end += _s2; } return *this; 
+	}
+
+	bool operator==(const ConstSubMatIterator&  b) const { 
+		return _me == b._me; 
+	}
+
+	bool operator!=(const ConstSubMatIterator&  b) const { 
+		return _me != b._me; 
+	}
+
+}; // ConstSubMatIterator
+
+/*
+std::ostream& operator<< (std::ostream &out, const SubMatIterator& smi){
+	smi.pinfo();
+}
+*/
+
+} // LinBox
+
+#endif //__LINBOX_sliced3_SMI_H
diff --git a/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrix.h b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrix.h
new file mode 100644
index 0000000..e9e68e1
--- /dev/null
+++ b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrix.h
@@ -0,0 +1,197 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrix_H
+#define __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrix_H
+
+#include <vector>
+#include "linbox/matrix/densematrix/blas-matrix.h"
+#include <givaro/modular.h>
+#include <givaro/givpoly1dense.h>
+#include <givaro/givpoly1denseops.inl>
+
+namespace Linbox
+{
+	template <class _Field, class _Storage, class _MatrixElement = double>
+	class SlicedPolynomialMatrix
+	/*Requirement: variable class _Field must be a representation of a field of order p^n
+	 *and have functions that return p (characteristic()) and p^n(cardinality()).
+	 *For example, GivaroGfq or LidiaGfq can be used.
+	 */
+
+        /*Description: this class implements representation of a matrix over GF
+	 *as a vector of length n of matrices over F (BlasMatrices),
+	 *which corresponds to representation of this matrix as a polynomial of degree n-1 with matrix-coefficients.
+	 */
+	{
+	public:
+		typedef _Field Field;
+		typedef typename Field::Element Element;
+		typedef _Storage Rep;
+		typedef _MatrixElement MatrixElement;
+		typedef Givaro::Modular<MatrixElement, MatrixElement> IntField;
+		typedef SlicedPolynomialMatrix<Field, Rep, MatrixElement> Self_t;
+		typedef Givaro::Poly1Dom<IntField, Dense>::Rep polynomial;
+	private:
+		Field GF;
+		IntField F;
+	private:
+		int n;//GF.cardinality() == p^n
+		std::vector<BlasMatrix<IntField>> V;
+	public:
+		polynomial irreducible;
+	private:
+		polynomial& modulo(polynomial& g, polynomial&h, polynomial& f);
+		bool rabin(int n, int q, int a, int b);
+		void setIrreduciblePlynomial(int max_steps = 1000000);
+
+						////////////////
+		        			//Constructors//
+						////////////////
+
+	public:
+		/*! Allocates a vector of new \f$ 0 \times 0\f$ matrices (shaped and ready). Irreducible polynomial is chosen randomly.
+		 */
+		SlicedPolynomialMatrix (const Field &BF);
+
+		/*Allocates a vector of $ m1 \times m2\f$ zero matrices (shaped and ready). Irreducible polynomial is chosen randomly.
+		 */
+		SlicedPolynomialMatrix (const Field &BF, const size_t & m1, const size_t &m2);
+		
+		/*! Allocates a vector of new \f$ 0 \times 0\f$ matrices (shaped and ready).
+		 */
+		SlicedPolynomialMatrix (const Field &BF, polynomial& pp);
+
+		/*Allocates a vector of $ m1 \times m2\f$ zero matrices (shaped and ready).
+		 */
+		SlicedPolynomialMatrix (const Field &BF, const size_t & m1, const size_t &m2, polynomial& pp);
+
+						///////////////
+						// Destructor//
+						///////////////
+
+	public:
+		~SlicedPolynomialMatrix();
+
+						////////////////////////
+	          				//dimensions of vector//
+						////////////////////////
+
+	public:
+		/*Get length of V.
+		 * @returns length of V
+		 */
+		size_t length() const;
+		
+		/*Get the number of rows in a matrix.
+		 * @returns Number of rows in a matrix
+		 */
+		size_t rowdim() const;
+
+		/* Get the number of columns in a matrix.
+		 * @returns Number of columns in a matrix
+		 */
+		size_t coldim() const;
+		
+	                    			/////////////////
+	                    			//return fields//
+	                    			/////////////////
+	
+	public:
+		const Field& fieldGF() const;
+
+		const IntField& fieldF() const;
+
+						/////////////////////////
+		        			//functions for entries//
+						/////////////////////////
+
+	public:
+		/* Set the entry of the m-th matrix-coefficient at the (i, j) position to a_mij.
+		 * @param m matrix-coefficient number, 0...length() - 1
+		 * @param i Row number, 0...rowdim () - 1
+		 * @param j Column number 0...coldim () - 1
+		 * @param a_mij Element to set
+		 */
+		void setEntry (size_t m, size_t i, size_t j, const MatrixElement &a_mij);
+		
+	private:
+		/* Get a writeable reference to the m-th matrix-coefficient at the (i, j) position.
+		 * @param m matrix-coefficient number, 0...length() - 1
+		 * @param i Row index of entry
+		 * @param j Column index of entry
+		 * @returns Reference to matrix entry
+		 */
+		MatrixElement &refEntry (size_t m, size_t i, size_t j);
+
+	public:
+		/* Get a read-only reference to the m-th matrix-coefficient at the (i, j) position.
+		 * @param m matrix-coefficient number, 0...length() - 1
+		 * @param i Row index
+		 * @param j Column index
+		 * @returns Const reference to matrix entry
+		 */
+		MatrixElement &getEntry (size_t m, size_t i, size_t j);
+		
+						/////////////////////////////////////
+		                		//functions for matrix-coefficients//
+						/////////////////////////////////////
+						
+	public:
+		/* Set the m-th matrix-coefficient to V_m.
+		 * @param m matrix-coefficient number, 0...length() - 1
+		 * @param V_m matrix to set
+		 */
+		void setMatrixCoefficient (size_t m, const BlasMatrix<IntField> &V_m) ;
+
+	private:
+		/* Get a writeable reference to the m-th matrix-coefficient.
+		 * @param m matrix-coefficient number, 0...length() - 1
+		 * @returns Reference to matrix-coefficent
+		 */
+		BlasMatrix<IntField> &refMatrixCoefficient (size_t m) ;
+
+	public:
+		/** Get a read-only reference to the m-th matrix-coefficient
+		 * @param m matrix-coefficient number, 0...length() - 1
+		 * @returns Const reference to matrix-coefficent
+		 */
+		const BlasMatrix<IntField> &getMatrixCoefficient (size_t m) const ;
+
+						/////////
+		                		//swaps//
+						/////////
+
+	public:
+		/* Swap i1-th and i2-th rows of matrices.
+		 * This is done inplace.
+		 */
+		void swapRows(size_t i1, size_t i2);
+
+		/* Swap j1-th and j2-th columns of matrices.
+		 * This is done inplace.
+		 */
+		void swapCols(size_t j1, size_t j2);
+		
+								/////////////
+		                				//transpose//
+								/////////////
+
+	public:
+		/* Creates a transposed polynomial matrix of this.
+		 * @param[in] tV
+		 * @return the transposed polynomial matrix of this.
+		 */
+		Self_t transpose(Self_t & tV) const;
+		
+								//////////////////
+		                				//input / output//
+								//////////////////
+	
+	public:
+		std::istream &read (std::istream &file);
+
+		std::ostream &write (std::ostream &os) const;
+	};
+}
+
+#include "SlicedPolynomialMatrix.inl"
+
+#endif
diff --git a/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrix.inl b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrix.inl
new file mode 100644
index 0000000..59b92be
--- /dev/null
+++ b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrix.inl
@@ -0,0 +1,376 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrix_INL
+#define __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrix_INL
+
+namespace Linbox
+{
+						//////////////////////////
+		        			//irreducible polynomial//
+						//////////////////////////
+
+	template < class _Field, class _Rep, class _MatrixElement >
+	polynomial& SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::modulo(polynomial& g, polynomial&h, polynomial& f)
+	{
+		polynomial w1;
+		Poly1Dom<Domain,Dense>::div(w1, h, f);
+		polynomial w2;
+		Poly1Dom<Domain,Dense>::mul(w2, w1, f);
+		Poly1Dom<Domain,Dense>::sub(g, h, w2);
+		return g;
+	}
+	
+	/*
+	algorithm description
+	http://en.wikipedia.org/wiki/Factorization_of_polynomials_over_finite_fields#Rabin.27s_test_of_irreducibility
+	Algorithm Rabin Irreducibility Test
+	 Input: A monic polynomial f in Fq[x] of degree n, 
+	        p1, ..., pk all distinct prime divisors of n.
+	 Output: Either "f is irreducible" or "f is reducible".
+	 Begin
+	     for j = 1 to k do 
+	        n_j=n/p_j;
+	     for i = 1 to k do 
+	        h:=x^{q^{n_i}}-x \bmod f;
+	        g := gcd(f, h);
+	        if g ? 1, then return 'f is reducible' and STOP;
+	     end for;
+	     h:= x^{q^{n}}-x \bmod f;
+	     if h = 0, then return "f is irreducible", 
+	         else return "f is reducible"
+	 end.
+	 */
+	/*
+	function description
+	 Fq[x], f = x^n + bx + a
+	 returns true if f is irreducible and false if f is reducible
+	 */
+	template < class _Field, class _Rep, class _MatrixElement >
+	bool SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::rabin(int n, int q, int a, int b)
+	{
+		polynomial f(n + 1);
+		f[0] = a;
+		f[1] = b;
+		for (int i = 2; i < n; i++)
+		{
+			f[i] = 0;
+		}
+		f[n] = 1;
+		std::vector<int> pd;
+		factorize(n, pd); //factorizes n into primes 
+		//n = pd[0]^alpha[0] * ... * pd[k - 1]^alpha[k - 1]
+		int k = pd.size();
+		std::vector<int> nd(k);
+		for (int j = 0; j < k; j++)
+		{
+			nd[j] = n / pd[j];
+		}
+		polynomial vector_zero();
+		assign(vector_zero, 0);
+		polynomial vector_one();
+		assign(vector_one, 1);
+		for (int j = 0; j < k; j++)
+		{
+			int h_size = pow(q, nd[j]) + 1;
+			polynomial h(h_size);
+			h[0] = 0;
+			h[1] = -1;
+			for (int i = 2; i < h_size - 1; i++)
+			{
+				h[i] = 0;
+			}
+			h[h_size - 1] = 1;
+			polynomial g;
+			Poly1Dom<IntField, Dense>::gcd (g, f, h);
+			bool g_equals_1 = g.areEqual(vector_one);
+			if (! g_equals_1)
+			{
+				return true; //f is irreducible
+			}
+		}
+		int h_size = pow(q, n) + 1;
+		polynomial h(h_size);
+		h[0] = 0;
+		h[1] = -1;
+		for (int i = 2; i < h_size - 1; i++)
+		{
+			h[i] = 0;
+		}
+		h[h_size - 1] = 1;
+		polynomial g;
+		modulo(g, h, f);//!!!
+		bool g_equals_0 = g.areEqual(vector_zero);
+		return g_equals_0; //if g = 0, then return "f is irreducible", else return "f is reducible" 
+	}
+	
+	template < class _Field, class _Rep, class _MatrixElement >
+	void SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::setIrreduciblePlynomial(int max_steps)
+	{
+		bool found = false;
+		int w = F.characteristic();
+		for (int step = 0; (step < max_steps) && (!found); step++)
+		{
+			int a = rand() % w;
+			int b = rand() % w;
+			if (a + b > 0)
+			{
+				found = rabin(n, w, a, b);
+			}
+		}
+		irreducible.push_back(a);
+		irreducible.push_back(b);
+		for (int i = 1; i < n; i++)
+		{
+			irreducible.push_back(0);
+		}
+		irreducible.push_back(1);
+		return;
+	}
+	
+						////////////////
+		        			//Constructors//
+						////////////////
+
+	template < class _Field, class _Rep, class _MatrixElement >
+	SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::SlicedPolynomialMatrix (const _Field &BF)
+	{
+		GF = BF;
+		F_temp = IntField(GF.characteristic()); //public function to set characteristic?
+		F = F_temp;
+		int n = GF.exponent(); //GF = GF(p^n)
+		for (size_t m = 0; m < n; m++)
+		{
+			V.emplace_back(BlasMatrix<IntField>(F));
+		}
+		setIrreduciblePolynomial();
+	}
+
+	template < class _Field, class _Rep, class _MatrixElement >
+	SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::SlicedPolynomialMatrix (const _Field &BF, const size_t & m1, const size_t &m2)
+	{
+		GF = BF;
+		F_temp = IntField(GF.characteristic()); //public function to set characteristic?
+		F = F_temp;
+		int n = GF.exponent(); //GF = GF(p^n)
+		for (size_t m = 0; m < n; m++)
+		{
+			V.emplace_back(BlasMatrix<IntField>(F, m1, m2));
+		}
+		setIrreduciblePolynomial();
+	}
+	
+	template < class _Field, class _Rep, class _MatrixElement >
+	SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::SlicedPolynomialMatrix (const _Field &BF, polynomial& pp)
+	{
+		GF = BF;
+		F_temp = IntField(GF.characteristic()); //public function to set characteristic?
+		F = F_temp;
+		int n = GF.exponent(); //GF = GF(p^n)
+		for (size_t m = 0; m < n; m++)
+		{
+			V.emplace_back(BlasMatrix<IntField>(F));
+		}
+		irreducible = pp;
+	}
+
+	template < class _Field, class _Rep, class _MatrixElement >
+	SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::SlicedPolynomialMatrix (const _Field &BF, const size_t & m1, const size_t &m2, polynomial& pp)
+	{
+		GF = BF;
+		F_temp = IntField(GF.characteristic()); //public function to set characteristic?
+		F = F_temp;
+		int n = GF.exponent(); //GF = GF(p^n)
+		for (size_t m = 0; m < n; m++)
+		{
+			V.emplace_back(BlasMatrix<IntField>(F, m1, m2));
+		}
+		irreducible = pp;
+	}
+
+						///////////////
+						// Destructor//
+						///////////////
+
+	template < class _Field, class _Rep, class _MatrixElement >
+	SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::~SlicedPolynomialMatrix()
+	{
+		//LidiaGfq has a destructor, GivaroGfq doesn't, so currently field type members GF and F are not destroyed
+		V.~vector();
+		//if some members are added, delete them			
+	}
+						////////////////////////
+		        			//dimensions of vector//
+						////////////////////////
+
+        template < class _Field, class _Rep, class _MatrixElement >
+	size_t SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::length() const
+	{
+		return V.size();				
+	}
+
+	template < class _Field, class _Rep, class _MatrixElement >
+	size_t SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::rowdim() const
+	{
+		return V[0].rowdim();				
+	}
+
+	template < class _Field, class _Rep, class _MatrixElement >
+	size_t SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::coldim() const
+	{
+		return V[0].coldim();				
+	}
+	
+	                    			/////////////////
+	                    			//return fields//
+	                    			/////////////////
+
+	template < class _Field, class _Rep, class _MatrixElement >
+	const Field& SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::fieldGF() const
+	{
+		return GF;
+	}
+
+	template < class _Field, class _Rep, class _MatrixElement >
+	const IntField& SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::fieldF() const
+	{
+		return F;
+	}
+
+						/////////////////////////
+		        			//functions for entries//
+						/////////////////////////
+		
+        template < class _Field, class _Rep, class _MatrixElement >
+	void SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::setEntry (size_t m, size_t i, size_t j, const MatrixElement &a_mij)
+	{
+		V[m].setEntry(i, j, a_mij);
+	}
+
+	template < class _Field, class _Rep, class _MatrixElement >
+	_MatrixElement & SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::refEntry (size_t m, size_t i, size_t j)
+	{
+		return V[m].refEntry(i, j);
+
+	}
+
+	template < class _Field, class _Rep, class _MatrixElement >
+	_MatrixElement & SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::getEntry (size_t m, size_t i, size_t j)
+	{
+		return V[m].getEntry(i, j);
+
+	}
+	
+						/////////////////////////////////////
+		                		//functions for matrix-coefficients//
+						/////////////////////////////////////
+
+	template < class _Field, class _Rep, class _MatrixElement >
+	void SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::setMatrixCoefficient (size_t m, const BlasMatrix<IntField> &V_m)
+	{
+		V[m] = V_m;
+	}
+
+	template < class _Field, class _Rep, class _MatrixElement >
+	BlasMatrix<IntField> &SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::refMatrixCoefficient (size_t m)
+	{
+		return V[m];
+	}
+
+	template < class _Field, class _Rep, class _MatrixElement >
+	const BlasMatrix<IntField> &SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::getMatrixCoefficient (size_t m) const
+	{
+		return V[m];
+	}
+
+						/////////
+		                		//swaps//
+						/////////
+
+	template < class _Field, class _Rep, class _MatrixElement >
+	void SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::swapRows(size_t i1, size_t i2)
+	{
+		for (size_t m = 0; m < this->length(); m++)
+		{
+			for (size_t j = 0; j < this->coldim(); j++)
+			{
+				MatrixElement c = this->getEntry(m, i1, j);
+				this->setEntry(m, i1, j, this->getEntry(m, i2, j));
+				this->setEntry(m, i2, j, c);
+			}
+		}
+	}
+
+	template < class _Field, class _Rep, class _MatrixElement >
+	void SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::swapCols(size_t j1, size_t j2)
+	{
+		for (size_t m = 0; m < this->length(); m++)
+		{
+			for (size_t i = 0; i < this->colrow(); i++)
+			{
+				MatrixElement c = this->getEntry(m, i, j1);
+				this->setEntry(m, i, j1, this->getEntry(m, i, j2));
+				this->setEntry(m, i, j2, c);
+			}
+		}
+	}
+	
+						/////////////
+		                		//transpose//
+						/////////////
+
+	template < class _Field, class _Rep, class _MatrixElement >
+	SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement > SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::transpose(SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement > & tV) const
+	{
+		//check dimensions
+		for (size_t m = 0; m < this->length(); m++)
+		{
+			this->getMatrixCoefficent(m).transpose(tV.refMatrixCoefficent(m));
+		} 
+		return tV;
+	}
+
+						//////////////////
+		                		//input / output//
+						//////////////////	
+	template < class _Field, class _Rep, class _MatrixElement >
+	std::istream& SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::read (std::istream &file)
+	{
+		int K = this->length();
+		int I = this->rowdim();
+		int J = this->coldim();
+		MatrixElement c;
+		for (int k = 0; k < K; k++)
+		{
+			for (int i = 0; i < I; i++)
+			{
+				for (int j = 0; j < J; j++)
+				{
+					file >> c;
+					this->setEntry(k, i, j, c);
+				}
+			}
+		}
+		return file;
+	}
+	
+	template < class _Field, class _Rep, class _MatrixElement >
+	std::ostream& SlicedPolynomialMatrix< _Field, _Rep, _MatrixElement >::write (std::ostream &file)
+	{
+		int K = this->length();
+		int I = this->rowdim();
+		int J = this->coldim();
+		for (int k = 0; k < K; k++)
+		{
+			for (int i = 0; i < I; i++)
+			{
+				for (int j = 0; j < J; j++)
+				{
+					file << this->getEntry(k, i, j) << " ";
+				}
+				file << std::endl;
+			}
+			file << std::endl;
+		}
+		return file;
+	}
+}
+
+#endif
\ No newline at end of file
diff --git a/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixAddSub.h b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixAddSub.h
new file mode 100644
index 0000000..cfdf21b
--- /dev/null
+++ b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixAddSub.h
@@ -0,0 +1,53 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixAddSub_H
+#define __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixAddSub_H
+
+#include <vector>
+#include "linbox/matrix/matrixdomain/blas-matrix-domain.h"
+#include "linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrix.h"
+
+namespace LinBox
+{
+	/* internal
+	 * Adding two matrices
+	 */
+	template< class Field, class Operand1, class Operand2, class Operand3>
+	class SlicedPolynomialMatrixAdd
+	{
+	public:
+		Operand1 &operator() (const Field &F, Operand1 &C, const Operand2 &A, const Operand3 &B) const;
+
+	};
+
+	/* internal
+	 * Substracting two matrices
+	 */
+	template< class Field, class Operand1, class Operand2, class Operand3>
+	class SlicedPolynomialMatrixSub
+	{
+	public:
+		Operand1 &operator() (const Field &F, Operand1 &C, const Operand2 &A, const Operand3 &B) const;
+
+	};
+
+	//! C += A
+	template< class Field, class Operand1, class Operand2>
+	class SlicedPolynomialMatrixAddin
+	{
+	public:
+		Operand1 &operator() (const Field &F, Operand1 &C, const Operand2 &A) const;
+
+	};
+
+	//! C -= A
+	template< class Field, class Operand1, class Operand2>
+	class SlicedPolynomialMatrixSubin
+	{
+	public:
+		Operand1 &operator() (const Field &F, Operand1 &C, const Operand2 &A) const;
+
+	};
+} /* end of namespace LinBox */
+
+#include "SlicedPolynomialMatrixAddSub.inl"
+
+#endif
diff --git a/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixAddSub.inl b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixAddSub.inl
new file mode 100644
index 0000000..0b2f2e3
--- /dev/null
+++ b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixAddSub.inl
@@ -0,0 +1,75 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixAddSub_INL
+#define __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixAddSub_INL
+
+namespace LinBox
+{
+	template<class Field, class Vector1, class Vector2, class Vector3>
+	Vector1& SlicedPolynomialMatrixAdd<Field, Vector1, Vector2, Vector3 >::operator()(const Field& F,
+									   Vector1& C,
+									   const Vector2& A,
+									   const Vector3& B) const
+	{
+		//check dimensions
+		BlasMatrix<Vector1::IntField> M(C.fieldF(), A.rowdim(), B.coldim());
+		for (int m = 0; m < C.length(); m++)
+		{
+			BlasMatrixDomainAdd<Vector1::IntField, BlasMatrix<Vector1::IntField>, BlasMatrix<Vector2::IntField>, BlasMatrix<Vector3::IntField>>()(C.fieldF(),
+				M, A.getMatrixCoefficient(m), B.getMatrixCoefficient(m));
+			C.setMatrixCoefficient(m, M);
+		}
+		return C;
+	}
+
+	template<class Field, class Vector1, class Vector2, class Vector3>
+	Vecto1r& SlicedPolynomialMatrixSub<Field, Vector1, Vector2, Vector3 >::operator()(const Field& F,
+									   Vector1& C,
+									   const Vector2& A,
+									   const Vector3& B) const
+	{
+		//check dimensions
+		BlasMatrix<Vector1::IntField> M(F, A.rowdim(), B.coldim());
+		for (int m = 0; m < C.length(); m++)
+		{
+			BlasMatrixDomainSub<Vector1::IntField, BlasMatrix<Vector1::IntField>, BlasMatrix<Vector2::IntField>, BlasMatrix<Vector3::IntField>>()(C.fieldF(),
+				M, A.getMatrixCoefficient(m), B.getMatrixCoefficient(m));
+			C.setMatrixCoefficient(m, M);
+		}
+		return C;
+	}
+
+	template<class Field, class Vector1, class Vector3>
+	Vector1& SlicedPolynomialMatrixAddin<Field, Vector1, Vector3 >::operator()(const Field& F,
+									   Vector1& C,
+									   const Vector3& B) const
+	{
+		//check dimensions
+		BlasMatrix<Vector1::IntField> M(F, B.rowdim(), B.coldim());
+		for (int m = 0; m < C.length(); m++)
+		{
+			M = C.getMatrixCoefficient(m);
+			BlasMatrixDomainAddin<Vector1::IntField, BlasMatrix<Vector1::IntField>, BlasMatrix<Vector3::IntField>>()(C.fieldF(),
+				M, A.getMatrixCoefficient(m), B.getMatrixCoefficient(m));
+			C.setMatrixCoefficient(m, M);
+		}
+		return C;
+	}
+
+	template<class Field, class Vector1, class Vector3>
+	Vector1& SlicedPolynomialMatrixSubin<Field, Vector1, Vector3 >::operator()(const Field& F,
+									   Vector1& C,
+									   const Vector3& B) const
+	{
+		//check dimensions
+		BlasMatrix<Vector1::IntField> M(F, B.rowdim(), B.coldim());
+		for (int m = 0; m < C.length(); m++)
+		{
+			M = C.getMatrixCoefficient(m);
+			BlasMatrixDomainAddin<Vector1::IntField, BlasMatrix<Vector1::IntField>, BlasMatrix<Vector3::IntField>>()(C.fieldF(),
+				M, A.getMatrixCoefficient(m), B.getMatrixCoefficient(m));
+			C.setMatrixCoefficient(m, M);
+		}
+		return C;
+	}
+} // LinBox
+
+#endif
\ No newline at end of file
diff --git a/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulKaratsuba.h b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulKaratsuba.h
new file mode 100644
index 0000000..93c6e76
--- /dev/null
+++ b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulKaratsuba.h
@@ -0,0 +1,26 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixMulKaratsuba_H
+#define __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixMulKaratsuba_H
+
+#include "SlicedPolynomialMatrix.h"
+#include "SlicedPolynomialMatrixAddSub.h"
+
+namespace LinBox
+{ 
+	template< class Field, class Operand1, class Operand2, class Operand3>
+	class SlicedPolynomialMatrixMulKaratsuba
+	{
+	private:
+		typedef Operand1::IntField IntField;
+		typedef BlasMatrix<IntField> Matrix;
+		typedef std::vector<BlasMatrix<Operand1::IntField>> vec;
+		typedef Operand1::polynomial polynomial;
+		vec& modulo(vec& C, int n, polynomial irreducible);
+		vec& karatsuba(IntField& F, vec& A, vec& B, vec& C);
+	public:
+		Operand1 &operator() (const Field &GF, Operand1 &C, const Operand2 &A, const Operand3 &B) const;
+	}; 
+} /* end of namespace LinBox */
+
+#include "SlicedPolynomialMatrixMulKaratsuba.inl"
+
+#endif
\ No newline at end of file
diff --git a/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulKaratsuba.inl b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulKaratsuba.inl
new file mode 100644
index 0000000..c988bb1
--- /dev/null
+++ b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulKaratsuba.inl
@@ -0,0 +1,258 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixMulKaratsuba_INL
+#define __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixMulKaratsuba_INL
+
+#include <givaro/givpoly1dense.h>
+#include <givaro/givpoly1denseops.inl>
+
+namespace LinBox
+{
+	template<class Field, class Vector3, class Vector1, class Vector2>
+	SlicedPolynomialMatrixMulKaratsuba<Field, Vector3, Vector1, Vector2 >::vec& 
+		SlicedPolynomialMatrixMulKaratsuba<Field, Vector3, Vector1, Vector2 >::modulo(vec& C, int n, polynomial irreducible)
+	{
+		int m = C.size();
+		int mi = C[0].rowdim();
+		int mj = C[0].coldim();
+		vec result(n, mi, mj);
+		for (int i = 0; i < mi; i++)
+		{
+			for (int j = 0; j < mj; j++)
+			{
+				polynomial entry;
+				for (int k = 0; k < mk; k++)
+				{
+					entry.push_back(C[k].getEntry(i, j));
+				}
+				polynomial w1;
+				Poly1Dom<IntField,Dense>::div(w1, entry, irreducible);
+				polynomial w2;
+				Poly1Dom<IntField,Dense>::mul(w2, w1, irreducible);
+				Poly1Dom<IntField,Dense>::sub(w1, entry, w2);
+				for (int k = 0; k < n; k++)
+				{
+					result[k].setEntry(i, j, w1[k]);
+				}
+			}
+		}
+		C = result;
+		return C;
+	}
+
+	template<class Field, class Vector3, class Vector1, class Vector2>
+	SlicedPolynomialMatrixMulKaratsuba<Field, Vector3, Vector1, Vector2 >::vec&
+		SlicedPolynomialMatrixMulKaratsuba<Field, Vector3, Vector1, Vector2 >::karatsuba(IntField& F, vec& C, vec& A, vec& B)
+	{
+		if (A.size() == 1)
+		{
+			for (int i = 0; i <B.size(); i++)
+			{
+				BlasMatrixDomainMul<IntField, Matrix, Matrix, Matrix>()(F, C[i], A[0], B[i]);
+			}
+			return C;
+		}
+		if (B.size() == 1)
+		{
+			for (int i = 0; i < A.size(); i++)
+			{
+				BlasMatrixDomainMul<IntField, Matrix, Matrix, Matrix>()(F, C[i], A[i], B[0]);
+			}
+			return C;
+		}
+		int m = (A.size() < B.size()) ? (B.size() / 2) : (A.size() / 2);
+		if ((m < A.size()) && (m < B.size()))
+		{
+			vec A1(A.begin(), A.begin() + m);
+			vec A2(A.begin() + m, A.end());
+			vec B1(B.begin(), B.begin() + m);
+			vec B2(B.begin() + m, B.end());
+			vec A3;
+			int minlength_a = (A1.size() < A2.size()) ? A1.size() : A2.size();
+			int minlength_a = (A1.size() < A2.size()) ? A2.size() : A1.size();
+			for (int i = 0; i < minlength_a; i++)
+			{
+				Matrix AA(F, A.rowdim(), A.coldim());
+				A3.push_back(BlasMatrixDomainAdd<IntField, Matrix, Matrix, Matrix>()(F, AA, A1[i], A2[i]));
+			}
+			if (maxlength_a == A1.size())
+			{
+				for (int i = minlength_a; i < maxlength_a; i++)
+				{
+					A3.push_back(A1[i]);
+				}
+			}
+			else
+			{
+				for (int i = minlength_a; i < maxlength_a; i++)
+				{
+					A3.push_back(A2[i]);
+				}
+			}
+			vec B3;
+			int minlength_b = (B1.size() < B2.size()) ? B1.size() : B2.size();
+			int maxlength_b = (B1.size() < B2.size()) ? B2.size() : B1.size();
+			for (int i = 0; i < minlength_b; i++)
+			{
+				Matrix BB(F, B.rowdim(), B.coldim());
+				B3.push_back(BlasMatrixDomainAdd<IntField, Matrix, Matrix, Matrix>()(F, BB, B1[i], B2[i]));
+			}
+			if (maxlength_b == B1.size())
+			{
+				for (int i = minlength_b; i < maxlength_b; i++)
+				{
+					B3.push_back(B1[i]);
+				}
+			}
+			else
+			{
+				for (int i = minlength_b; i < maxlength_b; i++)
+				{
+					B3.push_back(B1[i]);
+				}
+			}
+			vec C1;
+			vec C2;
+			vec C3;
+			Matrix CC(F, A.rowdim(), B.coldim());
+			int xx;
+			xx = A1.size() + B1.size() - 1;
+			for (int i = 0; i < xx; i++)
+			{
+				C1.push_back(CC);
+			}
+			xx = A2.size() + B2.size() - 1;
+			for (int i = 0; i < xx; i++)
+			{
+				C2.push_back(CC);
+			}
+			xx = A3.size() + B3.size() - 1;
+			for (int i = 0; i < xx; i++)
+			{
+				C3.push_back(CC);
+			}
+			karatsuba(F, C1, A1, B1);
+			karatsuba(F, C2, A2, B2);
+			karatsuba(F, C3, A3, B3);
+			for (int i = 0; i < C1.size(); i++)
+			{
+				BlasMatrixDomainAddin<IntField, Matrix, Matrix>()(F, C[i], C1[i]);
+			}
+			int mm = 2 * m;
+			for (int i = 0; i < C2.size(); i++)
+			{
+				BlasMatrixDomainAddin<IntField, Matrix, Matrix>()(F, C[mm + i], C2[i]);
+			}
+			for (int i = 0; i < C3.size(); i++)
+			{
+				BlasMatrixDomainAddin()<IntField, Matrix, Matrix>(F, C[m + i], C3[i]);
+			}
+			for (int i = 0; i < C1.size(); i++)
+			{
+				BlasMatrixDomainSubin()<IntField, Matrix, Matrix>(F, C[m + i], C1[i]);
+			}
+			for (int i = 0; i < C2.size(); i++)
+			{
+				BlasMatrixDomainSubin()<IntField, Matrix, Matrix>(F, C[m + i], C2[i]);
+			}
+			return C;
+		}
+		if (A.size() <= m)
+		{
+			vec B1(B.begin(), B.begin() + m);
+			vec B2(B.begin() + m, B.end());
+			vec C1;
+			vec C2;
+			Matrix CC(F, A.rowdim(), B.coldim());
+			int xx;
+			xx = A.size() + B1.size() - 1;
+			for (int i = 0; i < xx; i++)
+			{
+				C1.push_back(CC);
+			}
+			xx = A.size() + B2.size() - 1;
+			for (int i = 0; i < xx; i++)
+			{
+				C2.push_back(CC);
+			}
+			karatsuba(F, C1, A, B1);
+			karatsuba(F, C2, A, B2);
+			for (int i = 0; i < C1.size(); i++)
+			{
+				BlasMatrixDomainAddin<IntField, Matrix, Matrix>()(F, C[i], C1[i]);
+			}
+			for (int i = 0; i < C2.size(); i++)
+			{
+				BlasMatrixDomainAddin<IntField, Matrix, Matrix>()(F, C[m + i], C2[i]);
+			}
+			return C;
+		}
+		if (B.size() <= m)
+		{
+			vec A1(A.begin(), A.begin() + m);
+			vec A2(A.begin() + m, A.end());
+			vec C1;
+			vec C2;
+			Matrix CC(F, A.rowdim(), B.coldim());
+			int xx;
+			xx = A1.size() + B.size() - 1;
+			for (int i = 0; i < xx; i++)
+			{
+				C1.push_back(CC);
+			}
+			xx = A2.size() + B.size() - 1;
+			for (int i = 0; i < xx; i++)
+			{
+				C2.push_back(CC);
+			}
+			karatsuba(F, C1, A1, B);
+			karatsuba(F, C2, A2, B);
+			for (int i = 0; i < C1.size(); i++)
+			{
+				BlasMatrixDomainAddin<IntField, Matrix, Matrix>()(F, C[i], C1[i]);
+			}
+			for (int i = 0; i < C2.size(); i++)
+			{
+				BlasMatrixDomainAddin<IntField, Matrix, Matrix>()(F, C[m + i], C2[i]);
+			}
+			return C;
+		}
+		return C;
+	}
+
+	template<class Field, class Vector3, class Vector1, class Vector2>
+	Vector1& SlicedPolynomialMatrixMulKaratsuba<Field, Vector3, Vector1, Vector2 >::operator()(const Field& GF,
+									   Vector3& C,
+									   const Vector1& A,
+									   const Vector2& B) const
+	{
+		//check dimensions
+		int xx;
+		vec A1;
+		vec B1;
+		xx = A.length();
+		for (int m = 0; m < xx; m++)
+		{
+			A1.push_back(A.getMatrixCoefficient(m));
+		}
+		xx = B.length();
+		for (int m = 0; m < xx; m++)
+		{
+			B1.push_back(B.getMatrixCoefficient(m));
+		}
+		vec C1;
+		xx = A1.size() + B1.size() - 1;
+		Matrix CC(C.fieldF(), A.rowdim(), B.coldim());
+		for (int i = 0; i < xx; i++)
+		{
+			C1.push_back(CC);
+		}
+		karatsuba(C.fieldF(), C1, A1, B1);
+		modulo(C1, C.length(), C.irreducible);
+		for (int m = 0; m < C.length(); m++)
+		{
+			C.setMatrixCoefficient(m, C1[m]);
+		}
+		return C;
+	}
+} // LinBox
+
+#endif
\ No newline at end of file
diff --git a/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulToomCook.h b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulToomCook.h
new file mode 100644
index 0000000..a9450f5
--- /dev/null
+++ b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulToomCook.h
@@ -0,0 +1,29 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixMulToomCook_H
+#define __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixMulToomCook_H
+
+#include "SlicedPolynomialMatrix.h"
+
+namespace LinBox
+{ 
+	template< class Field, class Vector3, class Vector1, class Vector2>
+	class SlicedPolynomialMatrixMulToomCook
+	{
+	private:
+		typedef SlicedPolynomialMatrixtoBlasMatrix<Field, Vector1::Rep, Vector1::MatrixElement, Vector1::IntField, Vector1::Rep> conversionAtoAm;
+		typedef SlicedPolynomialMatrixtoBlasMatrix<Field, Vector2::Rep, Vector2::MatrixElement, Vector2::IntField, Vector2::Rep> conversionBtoBm;
+		typedef Vector3::IntField IntField;
+		typedef BlasMatrix<IntField> Matrix;
+		typedef BlasMatrixtoSlicedPolynomialMatrix<Vector3::IntField, Vector3::Rep, Field, Vector3::Rep, Vector3::MatrixElement> conversionCmtoC;
+		typedef Vector3::polynomial polynomial;
+		Matrix& EvaluationInterpolationMatrices (Matrix& TC, Matrix& iTC);
+		template<class Field, class Vector3, class Vector1, class Vector2>
+		Matrix& mul (IntField& F, Matrix& CMatBloc, const Matrix& AMatBloc, const Matrix& BMatBloc,
+								   const size_t m, const size_t k, const size_t n, const size_t e, polynomial irreducible);
+	public:
+		Operand1 &operator() (const Field &GF, Operand1 &C, const Operand2 &A, const Operand3 &B) const;
+	}; 
+} /* end of namespace LinBox */
+
+#include "SlicedPolynomialMatrixMulToomCook.inl"
+
+#endif
\ No newline at end of file
diff --git a/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulToomCook.inl b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulToomCook.inl
new file mode 100644
index 0000000..e90d5a6
--- /dev/null
+++ b/linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrixMulToomCook.inl
@@ -0,0 +1,188 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixMulToomCook_INL
+#define __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixMulToomCook_INL
+
+#include <fflas-ffpack/fflas/fflas.h>
+#include <fflas-ffpack/ffpack/ffpack.h>
+#include "linbox/algorithms/matrix-hom.h"
+#include <givaro/givpoly1denseops.inl>
+#include "linbox/matrix/SlicedPolynomialMatrix/conversion.h"
+
+namespace LinBox
+{
+	template<class Field, class Vector3, class Vector1, class Vector2>
+	BlasMatrix<Vector3::IntField>&
+	SlicedPolynomialMatrixMulToomCook<Field, Vector3, Vector1, Vector2 >::EvaluationInterpolationMatrices
+				(BlasMatrix<Vector3::IntField>& TC, BlasMatrix<Vector3::IntField>& iTC)
+	{
+		size_t E = TC.rowdim();
+		for (size_t i = 0 ; i < E ; ++i)
+		{
+			for (size_t j = 0 ; j < E ; ++j)
+			{
+				TC.field().init(TC.refEntry(i,j), pow((Integer)i,j));
+			}
+		}
+		int null;
+		FFPACK::Invert(TC.field(),E,TC.getPointer(),E,iTC.getWritePointer(),E,null);
+		return TC;
+	}
+
+	template<class Field, class Vector3, class Vector1, class Vector2>
+		BlasMatrix<Vector3::IntField>&
+		SlicedPolynomialMatrixMulToomCook<Field, Vector3, Vector1, Vector2 >::mul
+								   (Vector3::IntField& F,
+							       BlasMatrix<Vector3::IntField>& CMatBloc,
+								   const BlasMatrix<Vector3::IntField>& AMatBloc,
+								   const BlasMatrix<Vector3::IntField>& BMatBloc,
+								   const size_t m,
+								   const size_t k,
+								   const size_t n, const size_t e,
+								   polynomial irreducible)
+	{
+		#if (__LINBOX_FFLAS_FFPACK_VERSION < 10501)
+				#warning "Invert is buggy in your fflas-ffpack version. please consider upgrading to >=1.5.1."
+		#endif
+		size_t E = 2*e - 1 ;
+
+		Matrix TC    (F, E, E);
+		Matrix iTC   (F, E, E);
+		Matrix iEval (F, E, E);
+		EvaluationInterpolationMatrices(TC, iTC);
+
+		// each row is a result matrix
+		Matrix TMatBloc( F, E, m*n);
+		Matrix AEval( F , E, m*k);
+		Matrix BEval( F , E, k*n);
+
+		FFLAS::fgemm(F,
+					 FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+					 E, m*k, e,
+					 F.one,
+					 TC.getPointer(),E,
+					 AMatBloc.getPointer(), m*k,
+					 F.zero,
+					 AEval.getWritePointer(), m*k);
+
+		FFLAS::fgemm(F,
+					 FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+					 E ,n*k, e,
+					 F.one,
+					 TC.getPointer(),E,
+					 BMatBloc.getPointer(), n*k,
+					 F.zero,
+					 BEval.getWritePointer(), n*k);
+
+		for (size_t i = 0 ; i < E ; ++i)
+		{
+			FFLAS::fgemm(F,
+						 FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+						 m, n, k,
+						 F.one,
+						 AEval.getPointer()+i*m*k, k,
+						 BEval.getPointer()+i*n*k, n,
+						 F.zero,
+						 TMatBloc.getWritePointer()+i*m*n, n);
+		}
+
+		FFLAS::fgemm(F,
+					 FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+				     E, m * n, E,
+					 F.one,
+					 iTC.getPointer(),E, //lda
+					 TMatBloc.getWritePointer()+i*m*n, m*n, //ldb
+					 F.zero,
+					 CMatBloc.getWritePointer()+i*m*n, m*n);
+
+		return CMatBloc;
+	}
+
+	// all matrix classes should be SlicedPolynomialMatrices
+	template<class Field, class Vector3, class Vector1, class Vector2>
+	Vector3& SlicedPolynomialMatrixMulToomCook<Field, Vector3, Vector1, Vector2 >::operator()
+									   (const Field& GF,
+									   Vector3& C,
+									   const Vector1& A,
+									   const Vector2& B)
+	{
+		size_t e = C.length();
+		size_t m = C.rowdim();
+		size_t k = B.rowdim();
+		size_t n = C.coldim();
+
+		IntField F = A.filedF();
+
+		if (e == 1) {
+			BlasMatrix<Vector1::IntField, Vector1::Rep> Am(A.fieldF(), A.rowdim(), A.coldim());
+			conversionAtoAm()(Am, A);
+			BlasMatrix<Vector2::IntField, Vector2::Rep> Bm(B.fieldF(), B.rowdim(), B.coldim());
+			conversionBtoBm()(Bm, B);
+			BlasMatrix<Vector3::IntField, Vector3::Rep> Cm(C.fieldF(), C.rowdim(), C.coldim());
+			Matrix Af(Am,F);
+			Matrix Bf(Bm,F);
+			Matrix Cf(Cm,F);
+			FFLAS::fgemm((typename IntField::Father_t)F,
+						 FFLAS::FflasNoTrans, FFLAS::FflasNoTrans,
+						 // m, k , n,
+						 m,n,k,
+						 F.one,
+						 Af.getPointer(), Am.getStride(), //lda
+						 Bf.getPointer(), Bm.getStride(), //ldb
+						 F.zero,
+						 Cf.getWritePointer(), Cm.getStride());
+			MatrixHom::map(Cm,Cf);
+			conversionCmtoC()(C, Cm); //change when convertation is done
+			return C;
+		}
+
+		Matrix Cbloc(F,e,m*n);
+		Matrix Abloc(F,e,m*k);
+		Matrix Bbloc(F,e,k*n);
+
+
+		for (size_t l = 0 ; l < e ; ++l)
+		{
+			for (size_t i = 0 ; i < m ; ++i)
+			{
+				for (size_t j = 0 ; j < k ; ++j)
+				{
+					Abloc.setEntry(l, i*k+j, A.getEntry(l, i, j));
+				}
+			}
+		}
+
+		for (size_t l = 0 ; l < e ; ++l)
+		{
+			for (size_t i = 0 ; i < k ; ++i)
+			{
+				for (size_t j = 0 ; j < n ; ++j)
+				{
+					Bbloc.setEntry(l, i*n+j, B.getEntry(l, i, j));
+				}
+			}
+		}
+
+		Protected::mul(C.fieldF(), Cbloc, Abloc, Bbloc, m, k, n, e, C.irreducible);
+		
+		size_t E = 2 * E - 1;
+		polynomial x(E);
+		for (size_t i = 0 ; i < m ; ++i)
+		{
+			for (size_t j = 0 ; j < n ; ++j)
+			{
+				for (size_t l = 0 ; l < E ; ++l)
+				{
+					x[l] = Cbloc.getEntry(l, i*n+j);
+				}
+				Poly1Dom<IntField>.modin(x, C.irreducible);
+				for (size_t l = 0 ; l < e ; ++l)
+				{
+					C.setEntry(l, i, j, x[l]);
+				}
+			}
+		}
+
+		return C ;
+	}
+} // LinBox
+
+#endif
\ No newline at end of file
diff --git a/linbox/matrix/slicedpolynomialmatrix/conversion.h b/linbox/matrix/slicedpolynomialmatrix/conversion.h
new file mode 100644
index 0000000..59cf37d
--- /dev/null
+++ b/linbox/matrix/slicedpolynomialmatrix/conversion.h
@@ -0,0 +1,55 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_conversion_H
+#define __LINBOX_matrix_SlicedPolynomialMatrix_conversion_H
+
+#include "SlicedPolynomialMatrix.h"
+#include "linbox/matrix/polynomial-matrix.h"
+#include "linbox/matrix/densematrix/blas-matrix.h"
+#include <givaro/gfq.h>
+
+namespace LinBox
+{
+	//FieldF == SlicedPolynomialMatrix::IntField
+	template <class _FieldGF, class _Storage, class _MatrixElement = double, class _FieldF>
+	class SlicedPolynomialMatrixtoPolynomialMatrix
+	{
+	public:
+		PolynomialMatrix<PMType::polfirst,PMStorage::plain,_FieldF>
+			&operator() (PolynomialMatrix<PMType::polfirst,PMStorage::plain,_FieldF> &PM,
+			SlicedPolynomialMatrix<_FieldGF, _Storage, _MatrixElement> &SPM);
+	};
+
+	//FieldF == SlicedPolynomialMatrix::IntField
+	template <class _FieldF, class _FieldGF, class _Storage, class _MatrixElement = double>
+	class PolynomialMatrixtoSlicedPolynomialMatrix
+	{
+	public:
+		SlicedPolynomialMatrix<_FieldGF, _Storage, _MatrixElement>
+			&operator() (SlicedPolynomialMatrix<_FieldGF, _Storage, _MatrixElement> &SPM),
+			PolynomialMatrix<PMType::polfirst,PMStorage::plain,_FieldF> &PM);
+	};
+
+	template <class _FieldGF, class _Storage1, class _MatrixElement = double, class TT, class _Storage2>
+	class SlicedPolynomialMatrixtoBlasMatrix
+	{
+	private:
+		typedef SlicedPolynomialMatrixtoBlasMatrix<_FieldGF, _Storage1,
+		_MatrixElement, TT, _Storage2> spm;
+	public:
+		BlasMatrix<Givaro::GFqDom<TT>, _Storage2>
+			&operator() (BlasMatrix<Givaro::GFqDom<TT>, _Storage2> &BM,
+			SlicedPolynomialMatrix<_FieldGF, _Storage1, _MatrixElement> &SPM);
+	};
+
+	template <class TT, class _Storage2, class _FieldGF, class _Storage1, class _MatrixElement = double>
+	class BlasMatrixtoSlicedPolynomialMatrix
+	{
+	public:
+		SlicedPolynomialMatrix<_FieldGF, _Storage1, _MatrixElement>
+			&operator() (SlicedPolynomialMatrix<_FieldGF, _Storage1, _MatrixElement> &SPM,
+			BlasMatrix<Givaro::GFqDom<TT>, _Storage2> &BM);
+	};
+} /* end of namespace LinBox */
+
+#include "conversion.inl"
+
+#endif
diff --git a/linbox/matrix/slicedpolynomialmatrix/conversion.inl b/linbox/matrix/slicedpolynomialmatrix/conversion.inl
new file mode 100644
index 0000000..526b281
--- /dev/null
+++ b/linbox/matrix/slicedpolynomialmatrix/conversion.inl
@@ -0,0 +1,114 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_conversion_INL
+#define __LINBOX_matrix_SlicedPolynomialMatrix_conversion_INL
+
+namespace LinBox
+{
+	template <class _FieldGF, class _Storage, class _MatrixElement, class _FieldF>
+	PolynomialMatrix<PMType::polfirst,PMStorage::plain,_FieldF>&
+		SlicedPolynomialMatrixtoPolynomialMatrix<_FieldGF, _Storage,
+		_MatrixElement, _FieldF>::operator()
+			(PolynomialMatrix<PMType::polfirst, PMStorage::plain,_FieldF>& PM,
+			SlicedPolynomialMatrix<_FieldGF, _Storage, _MatrixElement> &SPM)
+	{
+		size_t rd = SPM.rowdim();
+		size_t cd = SPM.coldim();
+		size_t l = SPM.length();
+		for (size_t i = 0; i < rd; i++)
+		{
+			for (size_t j = 0; j < cd; j++)
+			{
+				for (size_t k = 0; k < l; k++)
+				{
+					PM.ref(i, j, k) = SPM.getEntry(k, i, j);
+				}
+			}
+		}
+		return PM;
+	}
+
+	template <class _FieldF, class _FieldGF, class _Storage, class _MatrixElement>
+	SlicedPolynomialMatrix<_FieldGF, _Storage, _MatrixElement>&
+		PolynomialMatrixtoSlicedPolynomialMatrix<_FieldF, _FieldGF,
+		_Storage, _MatrixElement>::operator()
+			(SlicedPolynomialMatrix<_FieldGF, _Storage, _MatrixElement> &SPM,
+			PolynomialMatrix<PMType::polfirst,PMStorage::plain,_FieldF> &PM)
+	{
+		size_t rd = SPM.rowdim();
+		size_t cd = SPM.coldim();
+		size_t l = SPM.length();
+		for (size_t k = 0; k < l; k++)
+		{
+			SPM.setMatrixCoefficient(k, PM[k]);
+		}
+		return SPM;
+	}
+
+	template <class _FieldGF, class _Storage1, class _MatrixElement, class TT, class _Storage2>
+	BlasMatrix<Givaro::GFqDom<TT>, _Storage2>&
+		SlicedPolynomialMatrixtoBlasMatrix<_FieldGF, _Storage1,
+		_MatrixElement, TT, _Storage2>::operator()
+			(BlasMatrix<Givaro::GFqDom<TT>, _Storage2> &BM,
+			SlicedPolynomialMatrix<_FieldGF, _Storage1, _MatrixElement> &SPM)
+	{
+		size_t rd = SPM.rowdim();
+		size_t cd = SPM.coldim();
+		size_t l = SPM.length();
+		GFqDom<TT> GF(SPM.fieldGF().characteristic(), SPM.fieldGF().exponent());
+		GFqDom<TT>::Element el;
+		PolynomialMatrix<PMType::polfirst,PMStorage::plain, spm::IntField> PM(
+			SPM.fieldF(), rd, cd, l);
+		SlicedPolynomialMatrixtoPolynomialMatrix<_FieldGF, _Storage1,
+		_MatrixElement, spm::IntField>()(PM, SPM);
+		for (size_t i = 0; i < rd; i++)
+		{
+			for (size_t j = 0; j < cd; j++)
+			{
+				GF.init(el, PM(i, j));
+				BM.setEntry(i, j, el);
+			}
+		}
+		return BM;
+	}
+
+	template <class TT, class _Storage2, class _FieldGF, class _Storage1, class _MatrixElement>
+	SlicedPolynomialMatrix<_FieldGF, _Storage1, _MatrixElement>&
+		BlasMatrixtoSlicedPolynomialMatrix<TT, _Storage2,
+		_FieldGF, _Storage1, _MatrixElement>::operator()
+			(SlicedPolynomialMatrix<_FieldGF, _Storage1, _MatrixElement> &SPM,
+			BlasMatrix<Givaro::GFqDom<TT>, _Storage2> &BM)
+	{
+		size_t rd = SPM.rowdim();
+		size_t cd = SPM.coldim();
+		size_t l = SPM.length();
+		if (l == 1)
+		{
+			for (size_t i = 0; i < rd; i++)
+			{
+				for (size_t j = 0; j < cd; j++)
+				{
+					SPM.setEntry(0, i, j, BM.getEntry(i, j));
+				}
+			}
+			return SPM;
+		}
+		else
+		{
+			size_t p = SPM.fieldGF().characteristic();
+			for (size_t i = 0; i < rd; i++)
+			{
+				for (size_t j = 0; j < cd; j++)
+				{
+					size_t el = log2pol(BM.getEntry(i, j));
+					for (size_t k = 0; k < l; k++)
+					{
+						SPM.setEntry(k, i, j, el % p);
+						el /= p;
+					}
+				}
+			}
+			return SPM;
+		}
+	}
+} // LinBox
+
+#endif
\ No newline at end of file
diff --git a/linbox/matrix/sparse-formats.h b/linbox/matrix/sparse-formats.h
new file mode 100644
index 0000000..9895ad8
--- /dev/null
+++ b/linbox/matrix/sparse-formats.h
@@ -0,0 +1,98 @@
+/* linbox/matrix/sparse-formats.h
+ * Copyright (C) 2013 the LinBox group
+ *
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>,
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_matrix_sparse_formats_H
+#define __LINBOX_matrix_sparse_formats_H
+
+#include "linbox/linbox-tags.h"
+
+namespace LinBox {
+
+	/** Exception class for invalid matrix input
+	*/
+	namespace Exceptions {
+		class InvalidMatrixInput {};
+	}
+
+
+
+
+	//! Sparse matrix format (memory storage)
+	namespace SparseMatrixFormat {
+		class ANY {} ;
+		// template<typename Row_t>
+		class COO         : public ANY {} ; //!< Cordinate
+		// template<typename Row_t>
+		class COO1        : public ANY {} ; //!< implicit value COO (with only ones, or mones, or..)
+		// template<typename Row_t>
+		class CSR         : public ANY {} ; //!< compressed row
+		// template<typename Row_t>
+		class CSR1        : public ANY {} ; //!< implicit value CSR (with only ones, or mones, or..)
+		// template<typename Row_t>
+		class ELL         : public ANY {} ; //!< ellpack
+		// template<typename Row_t>
+		class ELL_R       : public ANY {} ; //!< ellpack fixed row
+		// template<typename Row_t>
+		class ELL_R1      : public ANY {} ; // ELL_R with only ones (or mones, or..)
+		class DIA         : public ANY {} ; //!< Diagonal
+		class BCSR        : public ANY {} ; //!< Block CSR
+		class HYB         : public ANY {} ; //!< hybrid
+		class TPL         : public ANY {} ; //!< vector of triples
+		class TPL_omp     : public ANY {} ; //!< triplesbb for openmp
+		class LIL         : public ANY {} ; //!< vector of pairs
+		class SMM         : public ANY {} ; //!< Sparse Map of Maps
+
+		// the old sparse matrix reps.
+		// class VVP : public ANY {} ; // vector of vector of pairs
+		// class VPV : public ANY {} ; // vector of pair of vectors
+		// class VMap : public ANY {} ; // vector of index to value maps.
+		// template<class Row_t>
+		class SparseSeq    /* CoP  */ : public ANY {} ;//!< vector/list of pairs (Container of Pairs). SparseSequence.
+		// template<class Row_t>
+		class SparsePar /* CoM  */ : public ANY {} ;//!< vector/list of pairs (Container of Maps). SparseAssociative.
+		// template<class Row_t>
+		class SparseMap    /* PoC  */ : public ANY {} ;//!< pair of vector/list (Pair of Containers). SparseParallel.
+
+	} // SparseMatrixFormat
+
+
+	//! Sparse matrix format (file storage) @bug use the enum!!!!
+	namespace SparseFileFormat {
+		class SMS {} ; // JG format
+		class CSR {} ; // Raleigh 11 format
+		class COO {} ; // more standard coo format
+	} // SparseFileFormat
+}
+
+#endif // __LINBOX_matrix_sparse_formats_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparse-matrix.doxy b/linbox/matrix/sparse-matrix.doxy
new file mode 100644
index 0000000..4846c3b
--- /dev/null
+++ b/linbox/matrix/sparse-matrix.doxy
@@ -0,0 +1,32 @@
+// Copyright 2014 LinBox. See COPYING for licence information.
+/*
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/**  \ingroup matrix
+ * \defgroup sparsematrix Sparse Matrix
+ * \brief These are sparse matrix reprensentations
+ *
+ * NO DOC YET
+ *
+ */
+
+// vim:syn=doxygen
diff --git a/linbox/matrix/sparse-matrix.h b/linbox/matrix/sparse-matrix.h
new file mode 100644
index 0000000..3c563b2
--- /dev/null
+++ b/linbox/matrix/sparse-matrix.h
@@ -0,0 +1,287 @@
+/* linbox/matrix/sparse-matrix.h
+ * Copyright (C) 2013 the LinBox
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/sparse-matrix.h
+ * @ingroup matrix
+ * @ingroup sparsematrix
+ * A <code>SparseMatrix<_Field, _Storage></code> ....
+ */
+
+#ifndef __LINBOX_matrix_sparse_matrix_H
+#define __LINBOX_matrix_sparse_matrix_H
+
+#ifndef index_t
+#define index_t ptrdiff_t
+#endif
+
+#include "linbox/matrix/sparse-formats.h"
+#include "linbox/matrix/matrix-traits.h"
+
+namespace LinBox {
+
+
+	// Forward definition
+	template<class _Field, class _Storage = SparseMatrixFormat::SparseSeq >
+	class SparseMatrix ;
+
+
+	template <class _Field, class _Storage>
+	std::ostream& operator<< (std::ostream & os, const SparseMatrix<_Field,_Storage> & Mat)
+	{
+		return Mat.write(os);
+	}
+
+	template <class _Field, class _Storage>
+	std::istream &operator >> (std::istream &is, SparseMatrix<_Field, _Storage> &A)
+	{
+		return A.read (is);
+	}
+
+
+	template<class _Field, class _Storage>
+	class SparseMatrixDomain ;
+
+} // LinBox
+
+#include "sparsematrix/read-write-sparse.h"
+
+#include "sparsematrix/sparse-generic.h"
+
+#include "sparsematrix/sparse-coo-matrix.h"
+// #include "sparsematrix/sparse-coo-1-matrix.h"
+#include "sparsematrix/sparse-csr-matrix.h"
+// #include "sparsematrix/sparse-csr-1-matrix.h"
+#include "sparsematrix/sparse-ell-matrix.h"
+#include "sparsematrix/sparse-ellr-matrix.h"
+// #include "sparsematrix/sparse-ellr-1-matrix.h"
+// #include "sparsematrix/sparse-bcsr-matrix.h"
+// #include "sparsematrix/sparse-dia-matrix.h"
+// #include "sparsematrix/sparse-hyb-matrix.h"
+
+#include "sparsematrix/sparse-tpl-matrix.h"
+// #ifdef __LINBOX_USES_OPENMP
+#ifdef _OPENMP
+#include "sparsematrix/sparse-tpl-matrix-omp.h"
+#endif
+
+namespace LinBox { /*  MatrixContainerTraits */
+
+	template <class Field, class Storage>
+	class MatrixContainerTrait<SparseMatrix<Field,Storage> > {
+	public:
+                    //typedef MatrixContainerCategory::Blackbox Type;
+                typedef MatrixContainerCategory::Container Type;
+	};
+
+	// template <class _Field, class _Storage>
+	// struct MatrixTraits< SparseMatrix<_Field, _Storage> > {
+		// typedef SparseMatrix<_Field, _Storage>      MatrixType;
+		// typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
+	// };
+
+
+	// template <class _Field, class _Storage>
+	// struct GetEntryCategory<SparseMatrix<_Field,_Storage> > {
+		  // typedef SolutionTags::Local Tag;
+	// };
+}
+
+namespace LinBox { /*  MatrixTraits */
+
+	template <class Field>
+	struct MatrixTraits< SparseMatrix<Field, SparseMatrixFormat::CSR> >
+	{
+		typedef SparseMatrix<Field, SparseMatrixFormat::CSR> MatrixType;
+		typedef typename MatrixCategories::IndexedMatrixTag MatrixCategory;
+	};
+
+	template <class Field>
+	struct MatrixTraits< const SparseMatrix<Field, SparseMatrixFormat::CSR> >
+	{
+		typedef SparseMatrix<Field, SparseMatrixFormat::CSR> MatrixType;
+		typedef typename MatrixCategories::IndexedMatrixTag MatrixCategory;
+	};
+
+	template <class Field>
+	struct MatrixTraits< SparseMatrix<Field, SparseMatrixFormat::SparseMap> >
+	{
+		typedef SparseMatrix<Field, SparseMatrixFormat::SparseMap> MatrixType;
+		typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
+	};
+
+	template <class Field>
+	struct MatrixTraits< const SparseMatrix<Field, SparseMatrixFormat::SparseMap> >
+	{
+		typedef SparseMatrix<Field, SparseMatrixFormat::SparseMap> MatrixType;
+		typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
+	};
+
+	template <class Field>
+	struct MatrixTraits< SparseMatrix<Field, SparseMatrixFormat::SparsePar> >
+	{
+		typedef SparseMatrix<Field, SparseMatrixFormat::SparsePar> MatrixType;
+		typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
+	};
+
+	template <class Field>
+	struct MatrixTraits< const SparseMatrix<Field, SparseMatrixFormat::SparsePar> >
+	{
+		typedef SparseMatrix<Field, SparseMatrixFormat::SparsePar> MatrixType;
+		typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
+	};
+
+	template <class Field>
+	struct MatrixTraits< SparseMatrix<Field, SparseMatrixFormat::SparseSeq> >
+	{
+		typedef SparseMatrix<Field, SparseMatrixFormat::SparseSeq> MatrixType;
+		typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
+	};
+
+	template <class Field>
+	struct MatrixTraits< const SparseMatrix<Field, SparseMatrixFormat::SparseSeq> >
+	{
+		typedef SparseMatrix<Field, SparseMatrixFormat::SparseSeq> MatrixType;
+		typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
+	};
+
+} // LinBox
+
+namespace LinBox { /*  MatrixHomTrait */
+	template <class Ring, class Field>
+	struct MatrixHomTrait<SparseMatrix<Ring, SparseMatrixFormat::SparseSeq>, Field> {
+		typedef SparseMatrix<Field, SparseMatrixFormat::SparseSeq> value_type;
+	};
+
+	template <class Ring, class Field>
+	struct MatrixHomTrait<SparseMatrix<Ring, SparseMatrixFormat::SparsePar>, Field> {
+		typedef SparseMatrix<Field, SparseMatrixFormat::SparsePar> value_type;
+	};
+
+	template <class Ring, class Field>
+	struct MatrixHomTrait<SparseMatrix<Ring, SparseMatrixFormat::SparseMap>, Field> {
+		typedef SparseMatrix<Field, SparseMatrixFormat::SparseMap> value_type;
+	};
+
+} // LinBox
+
+namespace LinBox { /*  IndexedCategory */
+
+	template<class Field, class Row>
+	struct IndexedCategory< SparseMatrix<Field,Row> > 	{
+		typedef IndexedTags::HasIndexed Tag;
+	};
+
+#if 1
+	template<class Field>
+	struct IndexedCategory< SparseMatrix<Field,SparseMatrixFormat::CSR> > 	{
+		typedef IndexedTags::HasNext Tag;
+	};
+
+	template<class Field>
+	struct IndexedCategory< SparseMatrix<Field,SparseMatrixFormat::COO> > 	{
+		typedef IndexedTags::HasNext Tag;
+	};
+
+	template<class Field>
+	struct IndexedCategory< SparseMatrix<Field,SparseMatrixFormat::ELL> > 	{
+		typedef IndexedTags::HasNext Tag;
+	};
+
+	template<class Field>
+	struct IndexedCategory< SparseMatrix<Field,SparseMatrixFormat::ELL_R> > 	{
+		typedef IndexedTags::HasNext Tag;
+	};
+
+#endif
+
+
+
+
+} // LinBox
+
+namespace LinBox { /*  ContainerTraits */
+
+	// this could also be a member of BlasVector
+	template<class _Field>
+	struct ContainerTraits<SparseMatrix<_Field, SparseMatrixFormat::COO> > {
+		typedef ContainerCategories::Matrix ContainerCategory ;
+	};
+
+	template<class _Field>
+	struct ContainerTraits<SparseMatrix<_Field, SparseMatrixFormat::CSR> > {
+		typedef ContainerCategories::Matrix ContainerCategory ;
+	};
+
+	template<class _Field>
+	struct ContainerTraits<SparseMatrix<_Field, SparseMatrixFormat::ELL> > {
+		typedef ContainerCategories::Matrix ContainerCategory ;
+	};
+
+	template<class _Field>
+	struct ContainerTraits<SparseMatrix<_Field, SparseMatrixFormat::ELL_R> > {
+		typedef ContainerCategories::Matrix ContainerCategory ;
+	};
+
+}
+
+namespace LinBox { /* Junk */
+
+#if 1 /* make correspond SparseMatrixFormat::XXXSeq and Vector<Field>::XXXSeq */
+
+		template<class Field>
+		struct SparseVectorTranslate<Field,SparseMatrixFormat::SparseSeq> {
+			typedef typename Vector<Field>::SparseSeq other_t;
+		};
+
+		template<class Field>
+		struct SparseVectorTranslate<Field,typename Vector<Field>::SparseSeq> {
+			typedef SparseMatrixFormat::SparseSeq other_t;
+		};
+
+
+		template<class Field>
+		struct SparseVectorTranslate<Field,SparseMatrixFormat::SparsePar> {
+			typedef typename Vector<Field>::SparsePar other_t;
+		};
+
+		template<class Field>
+		struct SparseVectorTranslate<Field,SparseMatrixFormat::SparseMap> {
+			typedef typename Vector<Field>::SparseMap other_t;
+		};
+
+#endif
+
+} // LinBox
+
+#endif // __LINBOX_matrix_sparse_matrix_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparse.h b/linbox/matrix/sparse.h
deleted file mode 100644
index 3451313..0000000
--- a/linbox/matrix/sparse.h
+++ /dev/null
@@ -1,1724 +0,0 @@
-/* linbox/matrix/sparse.h
- * Copyright (C) 2001-2002 Bradford Hovinen
- *               1999-2001 William J Turner,
- *
- * Written by William J Turner <wjturner at math.ncsu.edu>,
- *            Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * --------------------------------------------------------
- * 2003-01-11  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
- *
- * Move from blackbox/sparse-base.h to matrix/sparse.h
- * ------------------------------------
- * 2002-11-28  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
- *
- *   - Renamed ColOfRowsIterator to RowIterator
- *   - Named template argument _Row rather than Row; add a typedef to Row
- *   - Named template argument _Element rather than Row; add a typedef to Element
- *   - Renamed IndexIterator as IndexedIterator, and adjusted to match
- *     interface in DenseMatrixBase
- * ------------------------------------
- * 2002-08-06  Bradford Hovinen  <hovinen at cis.udel.edu>
- *
- * Renamed to sparse-base.h from sparse0-base.h
- * ------------------------------------
- * Modified by Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * Refactoring:
- *   - Eliminated SparseMatrixAux and moved that functionality into Sparse0
- *   - Made SparseMatrixBase parameterized only on the element type
- *   - New read/write implementations for SparseMatrixBase, supporting multiple
- *     formats
- *   - Eliminated Gaussian elimination code
- *   - Added iterators, including ColOfRowsIterator, Iterator, and
- *     IndexIterator
- *   - Eliminated operator []; added getEntry; changed put_value to setEntry
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_matrix_sparse_H
-#define __LINBOX_matrix_sparse_H
-
-#ifndef _SP_BB_VECTOR_
-#include <vector>
-#define _SP_BB_VECTOR_ std::vector
-#endif
-
-#include <utility>
-#include <iostream>
-#include <algorithm>
-
-#include "linbox/linbox-config.h"
-#include "linbox/blackbox/factory.h"
-#include "linbox/vector/vector-traits.h"
-#include "linbox/util/debug.h"
-#include "linbox/matrix/matrix-domain.h"
-#include "linbox/util/matrix-stream.h"
-
-namespace LinBox
-{
-
-
-	/** Exception class for invalid matrix input
-	*/
-
-	class InvalidMatrixInput {};
-
-	// use this in place of NoField member, to avoid code duplication.
-	// better yet.  Don't do it at all.
-	/// Dummy field for conceptually unclear io.
-	template<class _Element>
-	class FieldIO {
-	public:
-		typedef _Element Element;
-
-		std::istream &read (std::istream &stream, Element &elt) const
-		{
-			return stream >> elt;
-		}
-		std::ostream &write (std::ostream &stream, const Element &elt) const
-		{
-			return stream << elt;
-		}
-	};
-
-	// made global to avoid duplicate code.
-	/// tags for SparseMatrixBase::read() and write()
-	enum FileFormatTag {
-		FORMAT_DETECT, FORMAT_GUILLAUME, FORMAT_TURNER, FORMAT_MATLAB, FORMAT_MAPLE, FORMAT_PRETTY, FORMAT_MAGMACPT, FORMAT_ONE_BASED
-	};
-
-	// Forward declaration
-	template <class _Element,
-		 class _Row   = typename RawVector<_Element>::Sparse,
-		 class Trait  = typename VectorTraits<_Row>::VectorCategory>
-		 class SparseMatrixBase;
-
-
-	// Small helper classes to make read and write easier
-	template <class _Element, class Row, class Trait = typename VectorTraits<Row>::VectorCategory>
-	class SparseMatrixWriteHelper {
-	public:
-		typedef _Element Element;
-
-		// Dummy class to avoid code duplication
-		class NoField {
-		public:
-			typedef _Element Element;
-
-			template<class T>
-			Element & init(Element & a, const T & b = 0) const { return a = b ; }
-
-			std::istream &read (std::istream &stream, Element &elt) const
-			{
-				return stream >> elt;
-			}
-			std::ostream &write (std::ostream &stream, const Element &elt) const
-			{
-				return stream << elt;
-			}
-		};
-
-		template <class Field>
-		static std::ostream &write (const SparseMatrixBase<Element, Row> &A, std::ostream &os, const Field &F, FileFormatTag format);
-	};
-
-	template <class Element, class Row, class Trait = typename VectorTraits<Row>::VectorCategory>
-	class SparseMatrixReadWriteHelper : public SparseMatrixWriteHelper<Element, Row, Trait> {
-		template <class Field>
-		static std::istream &readTurner    (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F, char *buf);
-		template <class Field>
-		static std::istream &readGuillaume (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F, char *buf);
-		template <class Field>
-		static std::istream &readMatlab    (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F, char *buf);
-		template <class Field>
-		static std::istream &readPretty    (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F, char *buf);
-		template <class Field>
-		static std::istream &readMagmaCpt  (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F, char *buf);
-
-	public:
-
-		template <class Field>
-		static std::istream &read (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F, FileFormatTag format);
-	};
-
-	// Specialization of the above for sparse parallel vectors
-	template <class _Element, class Row>
-	class SparseMatrixWriteHelper<_Element, Row, VectorCategories::SparseParallelVectorTag > {
-	public:
-		typedef _Element Element;
-
-		// Dummy class to avoid code duplication
-		class NoField {
-		public:
-			typedef _Element Element;
-
-			template<class T>
-			Element & init(Element & a, const T & b = 0) const { return a = b ; }
-
-			std::istream &read (std::istream &stream, Element &elt) const
-			{
-				return stream >> elt;
-			}
-			std::ostream &write (std::ostream &stream, const Element &elt) const
-			{
-				return stream << elt;
-			}
-		};
-
-		template <class Field>
-		static std::ostream &write (const SparseMatrixBase<Element, Row> &A, std::ostream &os, const Field &F, FileFormatTag format);
-	};
-
-	/** Sparse matrix container
-	 * This class acts as a generic row-wise container for sparse
-	 * matrices. It is designed to provide various methods to access the
-	 * entries of the matrix. In particular, it does not meet the black box
-	 * archetype; see \ref SparseMatrix for an appropriate sparse matrix
-	 * black box.
-	 *
-	 * @param Element Element type
-	 * @param Row     LinBox sparse vector type to use for rows of matrix
-	 \ingroup matrix
-	 */
-	template <class _Element, class _Row, class Trait>
-	class SparseMatrixBase {
-	public:
-
-		typedef _Element Element;
-		typedef _Row Row;
-		typedef const Row ConstRow;
-		typedef typename _SP_BB_VECTOR_<Row> Rep;
-
-		template<typename _Tp1, typename _R1 = typename Rebind<_Row,_Tp1>::other >
-		struct rebind {
-			typedef SparseMatrixBase<typename _Tp1::Element, _R1, Trait> other;
-		};
-
-		/** Constructor.
-		 * Note: the copy constructor and operator= will work as intended
-		 *       because of STL's container design
-		 * @param  m  row dimension
-		 * @param  n  column dimension
-		 */
-		SparseMatrixBase (size_t m, size_t n) :
-			_matA(m), _m(m), _n(n)
-		{};
-
-
-		/** Constructor from a MatrixStream
-		*/
-		template <class Field>
-		SparseMatrixBase ( MatrixStream<Field>& ms );
-
-
-		/** Copy constructor.
-		*/
-		SparseMatrixBase (const SparseMatrixBase<Element, Row, Trait> &A);
-
-		/** Convert constructor.
-		*/
-		template<class VectorType>
-		SparseMatrixBase (const SparseMatrixBase<Element, VectorType, Trait> &A);
-		/** Destructor. */
-		~SparseMatrixBase () {}
-
-		/** Retreive row dimension of the matrix.
-		 * @return integer number of rows of SparseMatrixBase matrix.
-		 */
-		size_t rowdim () const
-		{
-			return _m;
-		}
-
-		/** Retreive column dimension of matrix.
-		 * @return integer number of columns of SparseMatrixBase matrix.
-		 */
-		size_t coldim () const
-		{
-			return _n;
-		}
-
-		/** Retreive number of elements in the matrix.
-		 * @return integer number of elements of SparseMatrixBase matrix.
-		 */
-		size_t size () const
-		{
-			size_t s(0);
-			for(typename Rep::const_iterator it = _matA.begin(); it != _matA.end(); ++it)
-				s+= LinBox::RawVector<_Element>::size(*it);
-			return s;
-		}
-		/** Read a matrix from the given input stream using field read/write
-		 * @param is Input stream from which to read the matrix
-		 * @param F Field with which to read
-		 * @param format Format of input matrix
-		 */
-		template <class Field>
-		std::istream &read (std::istream &is, const Field &F, FileFormatTag format = FORMAT_DETECT);
-		/** Read a matrix from the given input stream using standard operators
-		 * @param is Input stream from which to read the matrix
-		 * @param format Format of input matrix
-		 */
-		std::istream &read (std::istream &is, FileFormatTag format = FORMAT_DETECT);
-
-
-		/** Write a matrix to the given output stream using field read/write
-		 * @param os Output stream to which to write the matrix
-		 * @param F Field with which to write
-		 * @param format Format with which to write
-		 */
-		template <class Field>
-		std::ostream &write (std::ostream &os, const Field &F, FileFormatTag format = FORMAT_PRETTY) const;
-
-		/** Write a matrix to the given output stream using standard operators
-		 * @param os Output stream to which to write the matrix
-		 * @param format Format with which to write
-		 */
-		std::ostream &write (std::ostream &os, FileFormatTag format = FORMAT_PRETTY) const;
-
-		/** Set an individual entry
-		 * Setting the entry to 0 will remove it from the matrix
-		 * @param i Row index of entry
-		 * @param j Column index of entry
-		 * @param value Value of the new entry
-		 */
-		void setEntry (size_t i, size_t j, const Element &value);
-
-		/** Get a writeable reference to an entry in the matrix
-		 * If there is no entry at the position (i, j), then a new entry
-		 * with a value of zero is inserted and a reference  to it is
-		 * returned.
-		 * @param i Row index of entry
-		 * @param j Column index of entry
-		 * @return Reference to matrix entry
-		 */
-		Element &refEntry (size_t i, size_t j);
-
-		/** Get a read-only individual entry from the matrix
-		 * @param i Row index
-		 * @param j Column index
-		 * @return Const reference to matrix entry
-		 */
-		const Element &getEntry (size_t i, size_t j) const;
-
-		/** Get an entry and store it in the given value
-		 * This form is more in the Linbox style and is provided for interface
-		 * compatibility with other parts of the library
-		 * @param x Element in which to store result
-		 * @param i Row index
-		 * @param j Column index
-		 * @return Reference to x
-		 */
-		Element &getEntry (Element &x, size_t i, size_t j) const;
-
-		/** @name Columns of rows iterator
-		 * The columns of row iterator gives each of the rows of the
-		 * matrix in ascending order. Dereferencing the iterator yields
-		 * a row vector in sparse sequence format
-		 */
-
-		typedef typename Rep::iterator RowIterator;
-		typedef typename Rep::const_iterator ConstRowIterator;
-
-		RowIterator rowBegin ();
-		RowIterator rowEnd ();
-		ConstRowIterator rowBegin () const;
-		ConstRowIterator rowEnd () const;
-
-		/** @name Raw iterator
-		 * The raw iterator is a method for accessing all nonzero
-		 * entries in the matrix in some unspecified order. This can be
-		 * used, e.g. to reduce all matrix entries modulo a prime before
-		 * passing the matrix into an algorithm.
-		 */
-
-		class Iterator;
-		class ConstIterator;
-
-		/// Begin.
-		Iterator Begin ();
-		/// End.
-		Iterator End ();
-		/// const Begin.
-		ConstIterator Begin () const;
-		/// const End
-		ConstIterator End () const;
-
-		/** @name Index iterator
-		 * The index iterator gives the row, column indices of all matrix
-		 * elements in the same order as the raw iterator above. Its value type
-		 * is an STL pair with the row and column indices, starting at 0, in the
-		 * first and second positions, respectively.
-		 */
-
-		class IndexedIterator;
-		class ConstIndexedIterator;
-
-		/// IndexedBegin
-		IndexedIterator IndexedBegin ();
-		/// IndexedEnd
-		IndexedIterator IndexedEnd ();
-		/// const IndexedBegin
-		ConstIndexedIterator IndexedBegin () const;
-		/// const IndexedEnd
-		ConstIndexedIterator IndexedEnd () const;
-
-		/** Retrieve a row as a writeable reference
-		 * @param i Row index
-		 */
-		Row &getRow (size_t i);
-
-		/** Retrieve a row as a writeable reference.
-		 * @param i Row index
-		 */
-		Row &operator [] (size_t i);
-
-		/** Retrieve a row as a read-only reference.
-		 * @param i Row index
-		 */
-		ConstRow &operator [] (size_t i) const;
-
-		/** Compute the column density, i.e the number of entries per column.
-		 * @param v Vector in which to store column density
-		 */
-		template <class Vector>
-		Vector &columnDensity (Vector &v) const;
-
-		/** Construct the transpose of this matrix and place it in the
-		 * matrix given.
-		 * @param AT
-		 */
-		SparseMatrixBase &transpose (SparseMatrixBase &AT) const;
-
-	protected:
-
-		friend class SparseMatrixWriteHelper<Element, Row>;
-		friend class SparseMatrixReadWriteHelper<Element, Row>;
-
-		Rep               _matA;
-		size_t            _m;
-		size_t            _n;
-
-		template<class F, class R, class T> friend class SparseMatrixBase;
-	};
-
-	/* Specialization for sparse sequence vectors */
-
-	template <class _Element, class _Row>
-	class SparseMatrixBase<_Element, _Row, VectorCategories::SparseSequenceVectorTag > {
-	public:
-
-		typedef _Element Element;
-		typedef _Row Row;
-		typedef const Row ConstRow;
-		typedef _SP_BB_VECTOR_<Row> Rep;
-
-		template<typename _Tp1, typename _R1 = typename Rebind<_Row,_Tp1>::other >
-		struct rebind {
-			typedef SparseMatrixBase<typename _Tp1::Element, _R1, VectorCategories::SparseSequenceVectorTag> other;
-		};
-
-		SparseMatrixBase (size_t m, size_t n) :
-			_matA (m), _m (m), _n (n)
-		{}
-
-		/** Constructor from a MatrixStream
-		*/
-		template <class Field>
-		SparseMatrixBase ( MatrixStream<Field>& ms );
-
-		SparseMatrixBase (const SparseMatrixBase<Element, Row> &A) :
-			_matA (A._matA), _m (A._m), _n (A._n)
-		{}
-
-		template<class VectorType>
-		SparseMatrixBase (const SparseMatrixBase<Element, VectorType> &A) :
-			_matA(A._m), _m (A._m), _n (A._n)
-		{
-			typename Rep::iterator meit = this->_matA.begin();
-			typename SparseMatrixBase<Element, VectorType>::Rep::const_iterator copit = A._matA.begin();
-			for( ; meit != this->_matA.end(); ++meit, ++copit)
-				LinBox::RawVector<Element>::convert(*meit, *copit);
-		}
-
-		~SparseMatrixBase () {}
-
-		size_t rowdim () const
-		{
-			return _m;
-		}
-		size_t coldim () const
-		{
-			return _n;
-		}
-
-		size_t size () const
-		{
-			size_t s(0);
-			for(typename Rep::const_iterator it = _matA.begin(); it != _matA.end(); ++it)
-				s+= LinBox::RawVector<_Element>::size(*it);
-			return s;
-		}
-
-		template <class Field>
-		std::istream &read (std::istream &is, const Field &F, FileFormatTag format = FORMAT_DETECT)
-		{
-			return SparseMatrixReadWriteHelper<Element, Row>::read
-			(*this, is, F, format);
-		}
-
-		std::istream &read (std::istream &is, FileFormatTag format = FORMAT_DETECT)
-		{
-			return SparseMatrixReadWriteHelper<Element, Row>::read
-			(*this, is, SparseMatrixReadWriteHelper<Element, Row>::NoField (),
-			 format);
-		}
-
-		template <class Field>
-		std::ostream &write (std::ostream &os, const Field &F, FileFormatTag format = FORMAT_PRETTY) const
-		{
-			return SparseMatrixReadWriteHelper<Element, Row>::write
-			(*this, os, F, format);
-		}
-
-		std::ostream &write (std::ostream &os, FileFormatTag format = FORMAT_PRETTY) const
-		{
-			return SparseMatrixReadWriteHelper<Element, Row>::write
-			(*this, os, SparseMatrixReadWriteHelper<Element, Row>::NoField (),
-			 format);
-		}
-
-		std::ostream &write(std::ostream &) const;
-
-		void           setEntry (size_t i, size_t j, const Element &value);
-
-		Element       &refEntry (size_t i, size_t j);
-
-		const Element &getEntry (size_t i, size_t j) const;
-
-		Element       &getEntry (Element &x, size_t i, size_t j) const
-		{
-			return x = getEntry (i, j);
-		}
-
-		typedef typename Rep::iterator RowIterator;
-		typedef typename Rep::const_iterator ConstRowIterator;
-
-		ConstRowIterator rowBegin () const
-		{
-			return _matA.begin ();
-		}
-
-		ConstRowIterator rowEnd () const
-		{
-			return _matA.end ();
-		}
-
-		RowIterator rowBegin ()
-		{
-			return _matA.begin ();
-		}
-
-		RowIterator rowEnd ()
-		{
-			return _matA.end ();
-		}
-
-		template <class RepIterator, class RowIterator, class _I_Element>
-		class _Iterator {
-		public:
-			typedef _I_Element value_type;
-
-			_Iterator (const RepIterator &i, const RowIterator &j, const RepIterator &A_end) :
-				_i (i), _j (j), _A_end (A_end)
-			{
-				if( _i == _A_end ) return;
-				while ( _j == _i->end () ) {
-					if (++_i == _A_end) return;
-					_j = _i->begin ();
-				}
-			}
-
-			_Iterator (const _Iterator &iter) :
-				_i (iter._i), _j (iter._j), _A_end (iter._A_end)
-			{}
-
-			_Iterator () {}
-
-			_Iterator &operator = (const _Iterator &iter)
-			{
-				_i = iter._i;
-				_j = iter._j;
-				_A_end = iter._A_end;
-
-				return *this;
-			}
-
-			bool operator == (const _Iterator &i) const
-			{
-				return (_i == i._i) && (_j == i._j);
-			}
-
-			bool operator != (const _Iterator &i) const
-			{
-				return (_i != i._i) || (_j != i._j);
-			}
-
-			_Iterator &operator ++ ()
-			{
-				++_j;
-				while( _j == _i->end ()) {
-					if (++_i == _A_end) return *this;
-					_j = _i->begin ();
-				}
-
-				// if (++_j == _i->end ())
-				// 				if (++_i != _A_end)
-				// 					_j = _i->begin ();
-				return *this;
-			}
-
-			_Iterator operator ++ (int)
-			{
-				_Iterator tmp = *this;
-				++(*this);
-				return tmp;
-			}
-
-			_Iterator &operator -- ()
-			{
-				while (_j == _i->begin ())
-					_j = (--_i)->end ();
-				--_j;
-				return *this;
-			}
-
-			_Iterator operator -- (int)
-			{
-				_Iterator tmp = *this;
-				--(*this);
-				return tmp;
-			}
-
-			value_type &operator * ()
-			{
-				return _j->second;
-			}
-		// Dan Roche 2005-7-7 I believe this was a memory leak.
-		value_type *operator -> ()
-		{
-			return &(_j->second);
-		}
-		const value_type &operator*() const
-		{
-			return _j->second;
-		}
-		const value_type *operator-> () const
-		{
-			return &(_j->second);
-		}
-
-	private:
-		RepIterator _i;
-		RowIterator _j;
-		RepIterator _A_end;
-	};
-
-	typedef _Iterator<typename Rep::iterator, typename Row::iterator, Element> Iterator;
-	typedef _Iterator<typename Rep::const_iterator, typename Row::const_iterator, const Element> ConstIterator;
-
-	Iterator Begin ()
-	{
-		return Iterator (_matA.begin (), _matA.front ().begin (), _matA.end ());
-	}
-	Iterator End ()
-	{
-		return Iterator (_matA.end (), _matA.back ().end (), _matA.end ());
-	}
-	ConstIterator Begin () const
-	{
-		return ConstIterator (_matA.begin (), _matA.front ().begin (), _matA.end ());
-	}
-	ConstIterator End () const
-	{
-		return ConstIterator (_matA.end (), _matA.back ().end (), _matA.end ());
-	}
-
-
-
-	/* Generic trait for iterators without type */
-	template<typename U>
-	struct IteratorValueType {
-		typedef typename U::value_type value_type;
-	};
-
-	template<typename X>
-	struct IteratorValueType<const X*> {
-		typedef X value_type;
-	};
-
-	/* Generic trait for iterators without type */
-
-
-
-	template <class RepIterator, class RowIdxIterator>
-	class _IndexedIterator {
-	public:
-#if 0
-		typedef std::pair<size_t, size_t> value_type;
-		typedef typename RowIdxIterator/*::value_type*/::second_type value_type;
-		typedef typename RowIdxIterator::value_type::second_type value_type;
-#endif
-		typedef typename IteratorValueType< RowIdxIterator >::value_type::second_type value_type;
-
-		_IndexedIterator (size_t idx, const RepIterator &i, const RowIdxIterator &j, const RepIterator &A_end) :
-			_i (i), _j (j), _A_end (A_end), _r_index (idx)
-		{
-			if( _i == _A_end ) return;
-			while(_j == _i->end ()) {
-				++_r_index;
-				if (++_i == _A_end) return;
-				_j = _i->begin ();
-			}
-			_c_index =_j->first;
-		}
-
-		_IndexedIterator (const _IndexedIterator &iter) :
-			_i (iter._i), _j (iter._j), _A_end (iter._A_end), _r_index (iter._r_index), _c_index (iter._c_index)
-		{}
-
-		_IndexedIterator ()
-		{}
-
-		_IndexedIterator &operator = (const _IndexedIterator &iter)
-		{
-			_A_end = iter._A_end;
-			_i = iter._i;
-			_j = iter._j;
-			_r_index = iter._r_index;
-			_c_index = iter._c_index;
-
-			return *this;
-		}
-
-		bool operator == (const _IndexedIterator &i) const
-		{
-			return (_i == i._i) && (_j == i._j);
-		}
-
-		bool operator != (const _IndexedIterator &i) const
-		{
-			return (_i != i._i) || (_j != i._j);
-		}
-
-		_IndexedIterator &operator ++ ()
-		{
-			++_j;
-			while(_j == _i->end ()){
-				++_r_index;
-				if (++_i == _A_end) return *this;
-				_j = _i->begin ();
-			}
-			_c_index = _j->first;
-#if 0
-			if (++_j == _i->end ()) {
-				if (++_i != _A_end) {
-					_j = _i->begin ();
-					++_r_index;
-				}
-			}
-
-			_c_index = _j->first;
-#endif
-
-			return *this;
-		}
-
-		_IndexedIterator operator ++ (int)
-		{
-			_IndexedIterator tmp = *this;
-			++(*this);
-			return tmp;
-		}
-
-		_IndexedIterator &operator -- ()
-		{
-			while (_j == _i->begin ()) {
-				_j = (--_i)->end ();
-				--_r_index;
-			}
-
-			--_j;
-			_c_index = _j->first;
-			return *this;
-		}
-
-		_IndexedIterator operator -- (int)
-		{
-			_IndexedIterator tmp = *this;
-			--(*this);
-			return tmp;
-		}
-
-		value_type &operator * ()
-		{
-			return _j->second;
-		}
-		const value_type &operator * () const
-		{
-			return _j->second;
-		}
-		value_type *operator -> ()
-		{
-			return &(_j->second);
-		}
-		const value_type *operator -> () const
-		{
-			return &(_j->second);
-		}
-
-		size_t rowIndex () const
-		{
-			return _r_index;
-		}
-		size_t colIndex () const
-		{
-			return _c_index;
-		}
-		const value_type &value() const
-		{
-			return _j->second;
-		}
-
-	private:
-		RepIterator _i;
-		RowIdxIterator _j;
-		RepIterator _A_end;
-
-		mutable size_t _r_index;
-		mutable size_t _c_index;
-	};
-
-	typedef _IndexedIterator<typename Rep::iterator, typename Row::iterator> IndexedIterator;
-	typedef _IndexedIterator<typename Rep::const_iterator, typename Row::const_iterator> ConstIndexedIterator;
-
-	IndexedIterator IndexedBegin ()
-	{
-		return IndexedIterator (0, _matA.begin (), _matA.front ().begin (), _matA.end ());
-	}
-	IndexedIterator IndexedEnd ()
-	{
-		return IndexedIterator (_m, _matA.end (), _matA.back ().end (), _matA.end ());
-	}
-	ConstIndexedIterator IndexedBegin () const
-	{
-		return ConstIndexedIterator (0, _matA.begin (), _matA.front ().begin (), _matA.end ());
-	}
-	ConstIndexedIterator IndexedEnd () const
-	{
-		return ConstIndexedIterator (_m, _matA.end (), _matA.back ().end (), _matA.end ());
-	}
-
-	Row &getRow (size_t i) {
-		return _matA[i];
-	}
-	Row &operator [] (size_t i) {
-		return _matA[i];
-	}
-	ConstRow &operator [] (size_t i) const
-	{
-		return _matA[i];
-	}
-
-	template <class Vector> Vector &columnDensity (Vector &v) const;
-	SparseMatrixBase &transpose (SparseMatrixBase &AT) const;
-
-protected:
-
-	friend class SparseMatrixWriteHelper<Element, Row>;
-	friend class SparseMatrixReadWriteHelper<Element, Row>;
-
-	Rep               _matA;
-	size_t            _m;
-	size_t            _n;
-
-	template<class F, class R, class T> friend class SparseMatrixBase;
-};
-
-/* Specialization for sparse associative vectors */
-
-template <class _Element, class _Row>
-class SparseMatrixBase<_Element, _Row, VectorCategories::SparseAssociativeVectorTag > {
-public:
-
-	typedef _Element Element;
-	typedef _Row Row;
-	typedef const Row ConstRow;
-	typedef _SP_BB_VECTOR_<Row> Rep;
-
-	template<typename _Tp1, typename _R1 = typename Rebind<_Row,_Tp1>::other >
-	struct rebind {
-	       	typedef SparseMatrixBase<typename _Tp1::Element, _R1, VectorCategories::SparseAssociativeVectorTag> other;
-	};
-
-	SparseMatrixBase (size_t m, size_t n) :
-		_matA (m), _m (m), _n (n)
-	{}
-	SparseMatrixBase (const SparseMatrixBase<Element, Row> &A) :
-		_matA (A._matA), _m (A._m), _n (A._n)
-	{}
-
-	template<class VectorType>
-	SparseMatrixBase (const SparseMatrixBase<Element, VectorType> &A) :
-		_matA(A.m), _m (A._m), _n (A._n)
-	{
-		typename Rep::iterator meit = this->_matA.begin();
-		typename SparseMatrixBase<Element, VectorType>::Rep::const_iterator copit = A._matA.begin();
-		for( ; meit != this->_matA.end(); ++meit, ++copit)
-			LinBox::RawVector<Element>::convert(*meit, *copit);
-	}
-
-	/** Constructor from a MatrixStream
-	*/
-	template <class Field>
-	SparseMatrixBase ( MatrixStream<Field>& ms );
-	~SparseMatrixBase () {}
-
-	size_t rowdim () const
-	{
-		return _m;
-	}
-	size_t coldim () const
-	{
-		return _n;
-	}
-	size_t size () const
-	{
-		size_t s(0);
-		for(typename Rep::const_iterator it = _matA.begin(); it != _matA.end(); ++it)
-			s+= LinBox::RawVector<_Element>::size(*it);
-		return s;
-	}
-
-	template <class Field>
-	std::istream &read (std::istream &is, const Field &F, FileFormatTag format = FORMAT_DETECT)
-	{
-		return SparseMatrixReadWriteHelper<Element, Row>::read
-		(*this, is, F, format);
-	}
-	std::istream &read (std::istream &is, FileFormatTag format = FORMAT_DETECT)
-	{
-		return SparseMatrixReadWriteHelper<Element, Row>::read
-		(*this, is, SparseMatrixReadWriteHelper<Element, Row>::NoField (),
-		 format);
-	}
-	template <class Field>
-	std::ostream &write (std::ostream &os, const Field &F, FileFormatTag format = FORMAT_PRETTY) const
-	{
-		return SparseMatrixReadWriteHelper<Element, Row>::write
-		(*this, os, F, format);
-	}
-	std::ostream &write (std::ostream &os, FileFormatTag format = FORMAT_PRETTY) const
-	{
-		return SparseMatrixReadWriteHelper<Element, Row>::write
-		(*this, os, SparseMatrixReadWriteHelper<Element, Row>::NoField (),
-		 format);
-	}
-
-	void           setEntry (size_t i, size_t j, const Element &value) { _matA[i][j] = value;
-	}
-	Element       &refEntry (size_t i, size_t j)                       {
-		return _matA[i][j];
-	}
-	const Element &getEntry (size_t i, size_t j) const;
-	Element       &getEntry (Element &x, size_t i, size_t j) const
-	{
-		return x = _matA[i][j];
-	}
-
-	typedef typename Rep::iterator RowIterator;
-	typedef typename Rep::const_iterator ConstRowIterator;
-
-	ConstRowIterator rowBegin () const
-	{
-		return _matA.begin ();
-	}
-	ConstRowIterator rowEnd () const
-	{
-		return _matA.end ();
-	}
-	RowIterator rowBegin ()
-	{
-		return _matA.begin ();
-	}
-	RowIterator rowEnd ()
-	{
-		return _matA.end ();
-	}
-
-	template <class RepIterator, class RowEltIterator, class _I_Element>
-	class _Iterator {
-	public:
-		typedef _I_Element value_type;
-
-		_Iterator (const RepIterator &i, const RowEltIterator &j, const RepIterator &A_end) :
-			_i (i), _j (j), _A_end (A_end)
-		{
-			if( _i == _A_end ) return;
-			while( _j == _i->end() ) {
-				if( ++_i == _A_end ) return;
-				_j = _i->begin();
-			}
-		}
-
-		_Iterator (const _Iterator &iter) :
-			_i (iter._i), _j (iter._j), _A_end (iter._A_end)
-		{}
-
-		_Iterator () {}
-
-		_Iterator &operator = (const _Iterator &iter)
-		{
-			_i = iter._i;
-			_j = iter._j;
-			_A_end = iter._A_end;
-
-			return *this;
-		}
-
-		bool operator == (const _Iterator &i) const
-		{
-			return (_i == i._i) && (_j == i._j);
-		}
-
-		bool operator != (const _Iterator &i) const
-		{
-			return (_i != i._i) || (_j != i._j);
-		}
-
-		_Iterator &operator ++ ()
-		{
-			while (++_j == _i->end ()) {
-				if (++_i == _A_end ()) return *this;
-				_j = _i->begin ();
-			}
-			return *this;
-		}
-
-		_Iterator operator ++ (int)
-		{
-			_Iterator tmp = *this;
-			++(*this);
-			return tmp;
-		}
-
-		_Iterator &operator -- ()
-		{
-			while (_j == _i->begin ())
-				_j = (--_i)->end ();
-			--_j;
-			return *this;
-		}
-
-		_Iterator operator -- (int)
-		{
-			_Iterator tmp = *this;
-			--(*this);
-			return tmp;
-		}
-
-		value_type &operator * ()
-		{
-			return _j->second;
-		}
-		value_type *operator -> ()
-		{
-			return &(_j->second);
-		}
-
-	private:
-		RepIterator _i;
-		RowEltIterator _j;
-		RepIterator _A_end;
-	};
-
-	typedef _Iterator<typename Rep::iterator, typename Row::iterator, Element> Iterator;
-	typedef _Iterator<typename Rep::const_iterator, typename Row::const_iterator, const Element> ConstIterator;
-
-	Iterator Begin ()
-	{
-		return Iterator (_matA.begin (), _matA.front ().begin (), _matA.end ());
-	}
-	Iterator End ()
-	{
-		return Iterator (_matA.end (), _matA.back ().end (), _matA.end ());
-	}
-	ConstIterator Begin () const
-	{
-		return ConstIterator (_matA.begin (), _matA.front ().begin (), _matA.end ());
-	}
-	ConstIterator End () const
-	{
-		return ConstIterator (_matA.end (), _matA.back ().end (), _matA.end ());
-	}
-
-	template <class RepIterator, class RowIdxIterator>
-	class _IndexedIterator {
-	public:
-		typedef std::pair<size_t, size_t> value_type;
-
-		_IndexedIterator (size_t idx, const RepIterator &i, const RowIdxIterator &j, const RepIterator &A_end) :
-			_i (i), _j (j), _A_end (A_end), _r_index (idx), _c_index (0)
-		{
-			if( _i == _A_end ) return;
-			while( _j == _i->end() ) {
-				++_r_index;
-				if( ++_i == _A_end ) return;
-				_j = _i->begin();
-			}
-			_c_index = _j->second;
-		}
-
-		_IndexedIterator (const _IndexedIterator &iter) :
-			_i (iter._i), _j (iter._j), _A_end (iter._A_end), _r_index (iter._r_index), _c_index (iter._c_index)
-		{}
-
-		_IndexedIterator ()
-		{}
-
-		_IndexedIterator &operator = (const _IndexedIterator &iter)
-		{
-			_A_end = iter._A_end;
-			_i = iter._i;
-			_j = iter._j;
-			_r_index = iter._r_index;
-			_c_index = iter._c_index;
-
-			return *this;
-		}
-
-		bool operator == (const _IndexedIterator &i) const
-		{
-			return (_i == i._i) && (_j == i._j);
-		}
-
-		bool operator != (const _IndexedIterator &i) const
-		{
-			return (_i != i._i) || (_j != i._j);
-		}
-
-		_IndexedIterator &operator ++ ()
-		{
-			++_j;
-			while (_j == _i->end ()) {
-				++_r_index;
-				if (++_i == _A_end ()) return *this;
-				_j = _i->begin ();
-			}
-
-			_c_index = _j->second;
-
-			return *this;
-		}
-
-		_IndexedIterator operator ++ (int)
-		{
-			_IndexedIterator tmp = *this;
-			++(*this);
-			return tmp;
-		}
-
-		_IndexedIterator &operator -- ()
-		{
-			while (_j == _i->begin ()) {
-				_j = (--_i)->end ();
-				--_r_index;
-			}
-
-			--_j;
-			_c_index = _j->second;
-			return *this;
-		}
-
-		_IndexedIterator operator -- (int)
-		{
-			_IndexedIterator tmp = *this;
-			--(*this);
-			return tmp;
-		}
-
-		value_type &operator * ()
-		{
-			return *_j;
-		}
-		const value_type &operator * () const
-		{
-			return *_j;
-		}
-		value_type *operator -> ()
-		{
-			return &(*_j);
-		}
-		const value_type *operator -> () const
-		{
-			return &(*_j);
-		}
-
-		size_t rowIndex () const
-		{
-			return _r_index;
-		}
-		size_t colIndex () const
-		{
-			return _c_index;
-		}
-		const value_type &value() const
-		{
-			return *_j;
-		}
-
-	private:
-		RepIterator _i;
-		RowIdxIterator _j;
-		RepIterator _A_end;
-
-		mutable size_t _r_index;
-		mutable size_t _c_index;
-	};
-
-	typedef _IndexedIterator<typename Rep::iterator, typename Row::iterator> IndexedIterator;
-	typedef _IndexedIterator<typename Rep::const_iterator, typename Row::const_iterator> ConstIndexedIterator;
-
-	IndexedIterator IndexedBegin ()
-	{
-		return IndexedIterator (0, _matA.begin (), _matA.front ().begin (), _matA.end ());
-	}
-	IndexedIterator IndexedEnd ()
-	{
-		return IndexedIterator (_m, _matA.end (), _matA.back ().end (), _matA.end ());
-	}
-	ConstIndexedIterator IndexedBegin () const
-	{
-		return ConstIndexedIterator (0, _matA.begin (), _matA.front ().begin (), _matA.end ());
-	}
-	ConstIndexedIterator IndexedEnd () const
-	{
-		return ConstIndexedIterator (_m, _matA.end (), _matA.back ().end (), _matA.end ());
-	}
-
-	Row &getRow (size_t i) {
-		return _matA[i];
-	}
-	Row &operator [] (size_t i) {
-		return _matA[i];
-	}
-	ConstRow &operator [] (size_t i) const
-	{
-		return _matA[i];
-	}
-
-	template <class Vector> Vector &columnDensity (Vector &v) const;
-	SparseMatrixBase &transpose (SparseMatrixBase &AT) const;
-
-protected:
-
-	friend class SparseMatrixWriteHelper<Element, Row>;
-	friend class SparseMatrixReadWriteHelper<Element, Row>;
-
-	Rep               _matA;
-	size_t            _m;
-	size_t            _n;
-
-	template<class F, class R, class T> friend class SparseMatrixBase;
-};
-
-/* Specialization for sparse parallel vectors */
-
-template <class _Element, class _Row>
-class SparseMatrixBase<_Element, _Row, VectorCategories::SparseParallelVectorTag > {
-public:
-
-	typedef _Element        Element;
-	typedef _Row                Row;
-	typedef const Row      ConstRow;
-	typedef _SP_BB_VECTOR_<Row> Rep;
-
-	template<typename _Tp1, typename _R1 = typename Rebind<_Row,_Tp1>::other >
-	struct rebind {
-		typedef SparseMatrixBase<typename _Tp1::Element, _R1, VectorCategories::SparseParallelVectorTag> other;
-	};
-
-	SparseMatrixBase (size_t m, size_t n) :
-		_matA (m), _m (m), _n (n)
-	{}
-
-	template<class Field>
-	SparseMatrixBase (Field & F, size_t m, size_t n) :
-		_matA (m), _m (m), _n (n)
-	{}
-
-
-	SparseMatrixBase (const SparseMatrixBase<Element, Row> &A) :
-		_matA (A._matA), _m (A._m), _n (A._n)
-	{}
-
-	template<class VectorType>
-	SparseMatrixBase (const SparseMatrixBase<Element, VectorType> &A) :
-		_matA(A._m), _m (A._m), _n (A._n)
-	{
-		typename Rep::iterator meit = this->_matA.begin();
-		typename SparseMatrixBase<Element, VectorType>::Rep::const_iterator copit = A._matA.begin();
-		for( ; meit != this->_matA.end(); ++meit, ++copit)
-			LinBox::RawVector<Element>::convert(*meit, *copit);
-	}
-
-	/** Constructor from a MatrixStream
-	*/
-	template <class Field>
-	SparseMatrixBase ( MatrixStream<Field>& ms );
-
-	~SparseMatrixBase () {}
-
-	size_t rowdim () const
-	{
-		return _m;
-	}
-	size_t coldim () const
-	{
-		return _n;
-	}
-	size_t size () const
-	{
-		size_t s(0);
-		for(typename Rep::const_iterator it = _matA.begin(); it != _matA.end(); ++it)
-			s+= LinBox::RawVector<_Element>::size(*it);
-		return s;
-	}
-
-	template <class Field>
-	std::istream &read (std::istream &is, const Field &F, FileFormatTag format = FORMAT_DETECT)
-	{
-		return SparseMatrixReadWriteHelper<Element, Row>::read
-		(*this, is, F, format);
-	}
-
-	std::istream &read (std::istream &is, FileFormatTag format = FORMAT_DETECT)
-	{
-		return SparseMatrixReadWriteHelper<Element, Row>::read
-		(*this, is, SparseMatrixReadWriteHelper<Element, Row>::NoField (),
-		 format);
-	}
-
-	template <class Field>
-	std::ostream &write (std::ostream &os, const Field &F, FileFormatTag format = FORMAT_PRETTY) const
-	{
-		return SparseMatrixReadWriteHelper<Element, Row>::write
-		(*this, os, F, format);
-	}
-
-	std::ostream &write (std::ostream &os, FileFormatTag format = FORMAT_PRETTY) const
-	{
-		return SparseMatrixReadWriteHelper<Element, Row>::write
-		(*this, os, typename SparseMatrixReadWriteHelper<Element, Row>::NoField (),
-		 format);
-	}
-
-	void           setEntry (size_t i, size_t j, const Element &value);
-	Element       &refEntry (size_t i, size_t j);
-	const Element &getEntry (size_t i, size_t j) const;
-	Element       &getEntry (Element &x, size_t i, size_t j) const
-	{
-		return x = getEntry (i, j);
-	}
-
-	typedef typename Rep::iterator RowIterator;
-	typedef typename Rep::const_iterator ConstRowIterator;
-
-	ConstRowIterator rowBegin () const
-	{
-		return _matA.begin ();
-	}
-	ConstRowIterator rowEnd () const
-	{
-		return _matA.end ();
-	}
-	RowIterator rowBegin ()
-	{
-		return _matA.begin ();
-	}
-	RowIterator rowEnd ()
-	{
-		return _matA.end ();
-	}
-
-	template <class RepIterator, class RowEltIterator, class _I_Element>
-	class _Iterator {
-	public:
-		typedef _I_Element value_type;
-
-		_Iterator (const RepIterator &i, const RowEltIterator &j, const RepIterator &A_end) :
-			_i (i), _j (j), _A_end (A_end)
-		{
-			if( _i == _A_end ) return;
-			while( _j == _i->second.end() ) {
-				if( ++_i == _A_end ) return;
-				_j = _i->second.begin();
-			}
-		}
-
-		_Iterator (const _Iterator &iter) :
-			_i (iter._i), _j (iter._j), _A_end (iter._A_end)
-		{}
-
-		_Iterator () {}
-
-		_Iterator &operator = (const _Iterator &iter)
-		{
-			_i = iter._i;
-			_j = iter._j;
-			_A_end = iter._A_end;
-
-			return *this;
-		}
-
-		bool operator == (const _Iterator &i) const
-		{
-			return (_i == i._i) && (_j == i._j);
-		}
-
-		bool operator != (const _Iterator &i) const
-		{
-			return (_i != i._i) || (_j != i._j);
-		}
-
-		_Iterator &operator ++ ()
-		{
-			++_j;
-			while( _j == _i->second.end() ) {
-				if( ++_i == _A_end ) return *this;
-				_j = _i->second.begin();
-			}
-			return *this;
-		}
-
-		_Iterator operator ++ (int)
-		{
-			_Iterator tmp = *this;
-			++(*this);
-			return tmp;
-		}
-
-		_Iterator &operator -- ()
-		{
-			while (_j == _i->second.begin ())
-				_j = (--_i)->second.end ();
-			--_j;
-			return *this;
-		}
-
-		_Iterator operator -- (int)
-		{
-			_Iterator tmp = *this;
-			--(*this);
-			return tmp;
-		}
-
-		value_type &operator * ()
-		{
-			return static_cast<value_type&>(*_j);
-		}
-		value_type *operator -> ()
-		{
-			return &(*_j);
-		}
-
-	private:
-		RepIterator _i;
-		RowEltIterator _j;
-		RepIterator _A_end;
-	};
-
-	typedef _Iterator<typename Rep::iterator, typename Row::second_type::iterator, Element> Iterator;
-	typedef _Iterator<typename Rep::const_iterator, typename Row::second_type::const_iterator, const Element> ConstIterator;
-
-	Iterator Begin ()
-	{
-		return Iterator (_matA.begin (), _matA.front ().second.begin (), _matA.end ());
-	}
-	Iterator End ()
-	{
-		return Iterator (_matA.end (), _matA.back ().second.end (), _matA.end ());
-	}
-	ConstIterator Begin () const
-	{
-		return ConstIterator (_matA.begin (), _matA.front ().second.begin (), _matA.end ());
-	}
-	ConstIterator End () const
-	{
-		return ConstIterator (_matA.end (), _matA.back ().second.end (), _matA.end ());
-	}
-
-	/* Generic trait for iterators without type */
-	template<typename U>
-	struct IteratorValueType {
-		typedef typename U::value_type value_type;
-	};
-
-	template<typename X>
-	struct IteratorValueType<const X*> {
-		typedef X value_type;
-	};
-
-
-	template <class RepIterator, class RowIdxIterator>
-	class _IndexedIterator {
-	public:
-		typedef typename IteratorValueType<RepIterator>::value_type PairValue ;
-		typedef typename PairValue::second_type::value_type value_type;
-
-		// typedef typename IteratorValueType< RepIterator >::second_type::value_type value_type;
-
-		// Dan Roche 7-6-05 Fixed a seg fault this code was causing
-		_IndexedIterator (size_t idx, const RepIterator &i,
-				const RowIdxIterator &j, const RepIterator &A_end) :
-			_i (i), _j (j), _A_end (A_end), _r_index (idx), _c_index(0), _value_index(0)
-		{
-			if( _i == _A_end ) return;
-			while( _j == _i->first.end() ) {
-				if( ++_i == _A_end ) return;
-				++_r_index;
-				_j = _i->first.begin();
-			}
-
-			_c_index = *_j;
-			_value_index = _j-_i->first.begin();
-		}
-
-		_IndexedIterator (const _IndexedIterator &iter) :
-			_i (iter._i), _j (iter._j),
-			_A_end (iter._A_end), _r_index (iter._r_index),
-			_c_index (iter._c_index), _value_index( iter._value_index )
-		{}
-
-		_IndexedIterator ()
-		{}
-
-		_IndexedIterator &operator = (const _IndexedIterator &iter)
-		{
-			_A_end = iter._A_end;
-			_i = iter._i;
-			_j = iter._j;
-			_r_index = iter._r_index;
-			_c_index = iter._c_index;
-			_value_index = iter._value_index;
-
-			return *this;
-		}
-
-		bool operator == (const _IndexedIterator &i) const
-		{
-			return (_i == i._i) && (_j == i._j);
-		}
-
-		bool operator != (const _IndexedIterator &i) const
-		{
-			return (_i != i._i) || (_j != i._j);
-		}
-
-		_IndexedIterator &operator ++ ()
-		{
-			if(_j != _i->first.end ()) {
-				++_j ;
-				++_value_index;
-			}
-			while(_j == _i->first.end ()) {
-				++_r_index;
-				if (++_i == _A_end) return *this;
-				_j = _i->first.begin ();
-				_value_index = 0;
-			}
-			_c_index = *_j;
-
-			return *this;
-		}
-
-		_IndexedIterator operator ++ (int)
-		{
-			_IndexedIterator tmp = *this;
-			++(*this);
-			return tmp;
-		}
-
-		_IndexedIterator &operator -- ()
-		{
-			while (_j == _i->first.begin ()) {
-				_j = (--_i)->first.end ();
-				_value_index = _i->first.size();
-				--_r_index;
-			}
-
-			--_j;
-			--_value_index;
-			_c_index = *_j;
-			return *this;
-		}
-
-		_IndexedIterator operator -- (int)
-		{
-			_IndexedIterator tmp = *this;
-			--(*this);
-			return tmp;
-		}
-
-#if 0
-		const value_type &operator * () const
-		{
-			return *(_i->second.begin () + _c_index);
-		}
-#endif
-	value_type &operator * ()
-	{
-		return (value_type&)(_i->second)[_value_index];
-	}
-#if 0
-	value_type *operator -> ()
-	{
-		return &(*(_i->second.begin () + _c_index));
-	}
-	const value_type *operator -> () const
-	{
-		return &(*(_i->second.begin () + _c_index));
-	}
-#endif
-
-	size_t rowIndex () const
-	{
-		return _r_index;
-	}
-	size_t colIndex () const
-	{
-		return _c_index;
-	}
-	const value_type &value () const
-	{
-		return (const value_type&)(_i->second)[_value_index];
-	}
-
-	private:
-	RepIterator _i;
-	RowIdxIterator _j;
-	RepIterator _A_end;
-
-	mutable size_t _r_index;
-	mutable size_t _c_index;
-	mutable size_t _value_index;
-	};
-
-	typedef _IndexedIterator<typename Rep::iterator, typename Row::first_type::iterator> IndexedIterator;
-	typedef _IndexedIterator<typename Rep::const_iterator, typename Row::first_type::const_iterator> ConstIndexedIterator;
-
-	IndexedIterator IndexedBegin ()
-	{
-		return IndexedIterator (0, _matA.begin (), _matA.front ().first.begin (), _matA.end ());
-	}
-	IndexedIterator IndexedEnd ()
-	{
-		return IndexedIterator (_m, _matA.end (), _matA.back ().first.end (), _matA.end ());
-	}
-	ConstIndexedIterator IndexedBegin () const
-	{
-		return ConstIndexedIterator (0, _matA.begin (), _matA.front ().first.begin (), _matA.end ());
-	}
-	ConstIndexedIterator IndexedEnd () const
-	{
-		return ConstIndexedIterator (_m, _matA.end (), _matA.back ().first.end (), _matA.end ());
-	}
-
-	Row &getRow (size_t i) {
-		return _matA[i];
-	}
-	Row &operator [] (size_t i) {
-		return _matA[i];
-	}
-	ConstRow &operator [] (size_t i) const
-	{
-		return _matA[i];
-	}
-
-	template <class Vector> Vector &columnDensity (Vector &v) const;
-	SparseMatrixBase &transpose (SparseMatrixBase &AT) const;
-
-protected:
-
-	friend class SparseMatrixWriteHelper<Element, Row>;
-	friend class SparseMatrixReadWriteHelper<Element, Row>;
-
-	Rep               _matA;
-	size_t            _m;
-	size_t            _n;
-
-	template<class F, class R, class T> friend class SparseMatrixBase;
-};
-
-template <class Element, class Row>
-std::ostream &operator << (std::ostream &os, const SparseMatrixBase<Element, Row> &A)
-{
-	return A.write (os);
-}
-
-template <class Element, class Row>
-std::istream &operator >> (std::istream &is, SparseMatrixBase<Element, Row> &A)
-{
-	return A.read (is);
-}
-
-template <class Element, class Row, class Trait>
-struct MatrixTraits< SparseMatrixBase<Element, Row, Trait> >
-{
-	typedef SparseMatrixBase<Element, Row, Trait> MatrixType;
-	typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
-};
-
-template <class Element, class Row, class Trait>
-struct MatrixTraits< const SparseMatrixBase<Element, Row, Trait> >
-{
-	typedef const SparseMatrixBase<Element, Row, Trait> MatrixType;
-	typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
-};
-
-} // namespace LinBox
-
-#include "linbox/matrix/sparse.inl"
-
-#endif // __LINBOX_matrix_sparse_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/matrix/sparse.inl b/linbox/matrix/sparse.inl
deleted file mode 100644
index 3873b9c..0000000
--- a/linbox/matrix/sparse.inl
+++ /dev/null
@@ -1,983 +0,0 @@
-/* linbox/matrix/sparse.inl
- * Copyright (C) 2001-2002 Bradford Hovinen
- *               1999-2001 William J Turner,
- *
- * Written by Bradford Hovinen <hovinen at cis.udel.edu>
- * Based on sparse-base.h by William J Turner <wjturner at math.ncsu.edu>
- *
- * --------------------------------------------------------
- * 2003-01-11  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
- *
- * Move from blackbox/sparse-base.inl to matrix/sparse.inl
- * ------------------------------------
- * 2002-11-28  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
- *
- *   - Renamed ColOfRowsIterator to RowIterator
- *   - Named template argument _Row rather than Row; add a typedef to Row
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_matrix_sparse_INL
-#define __LINBOX_matrix_sparse_INL
-
-#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <sstream>
-#include <algorithm>
-#include <cmath>
-#include <cctype>
-#include <cstring>
-
-#include "linbox/matrix/sparse.h"
-#include "linbox/vector/vector-traits.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/util/debug.h"
-#include "linbox/util/commentator.h"
-
-namespace LinBox
-{
-
-	template <class Element, class Row, class Trait>
-	template <class Field>
-	std::istream &SparseMatrixReadWriteHelper<Element, Row, Trait> ::readTurner (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F, char *buf)
-	{
-		size_t i, j;
-
-		A._matA.clear ();
-		A._matA.resize (A._m);
-
-		do {
-			std::istringstream str (buf);
-
-			str >> i;
-
-			if (i == (size_t) -1) break; // return also if row index is -1
-			str >> j;
-			F.read (str, A.refEntry (i, j));
-
-			is.getline (buf, 80);
-		} while (is);
-
-		return is;
-	}
-
-	template <class Element, class Row, class Trait>
-	template <class Field>
-	std::istream &SparseMatrixReadWriteHelper<Element, Row, Trait> ::readGuillaume (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F, char *buf)
-	{
-		size_t i, j;
-
-		std::istringstream str (buf);
-		str >> A._m >> A._n;
-
-		A._matA.clear ();
-		A._matA.resize (A._m);//cerr<<A.coldim()<<" "<<A.rowdim()<<endl;
-
-		Element x;
-		while (is >> i) {
-			if (i == 0 || i == (size_t) -1) {is >> j; F.read(is, x); break;}
-			is >> j;
-			if (i > A._m || j > A._n)
-				throw InvalidMatrixInput ();
-			F.read (is, x);
-			if (! F.isZero(x)) A.setEntry (i - 1, j - 1, x);
-		}
-
-		return is;
-
-	}
-
-	template <class Element, class Row, class Trait>
-	template <class Field>
-	std::istream &SparseMatrixReadWriteHelper<Element, Row, Trait> ::readMatlab (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F, char *buf)
-	{
-		size_t i = 0, j = 0;
-		char c;
-		Element a_ij;
-
-		while (1) {
-			do is >> c; while (is && !std::isdigit (c));
-			if (!is) break;
-
-			is.putback (c);
-
-			F.read (is, a_ij);
-			A.setEntry (i, j++, a_ij);
-
-			do is >> c; while (is && c != ',' && c != ';' && c != ']');
-			if (!is) break;;
-
-			if (c == ';') {
-				++i;
-				j = 0;
-			}
-			else if (c == ']') break;
-		}
-
-		return is;
-	}
-
-	template <class Element, class Row, class Trait>
-	template <class Field>
-	std::istream &SparseMatrixReadWriteHelper<Element, Row, Trait> ::readPretty (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F, char *buf)
-	{
-		size_t i, j;
-		Element a_ij;
-		char c;
-
-		A._m = 0;
-		A._matA.clear ();
-
-		i = 0;
-
-		do {
-			A._m++;
-			A._matA.push_back (Row ());
-
-			std::istringstream str (buf);
-
-			do str >> c; while (isspace (c));
-			if (c != '[')
-				throw InvalidMatrixInput ();
-
-			j = 0;
-
-			while (str) {
-				do str >> c; while (isspace (c));
-				if (!str || c == ']') break;
-				F.read (str, a_ij);
-
-				j++;
-				if (j > A._n)
-					A._n++;
-
-				if (!F.isZero(a_ij))
-					A.setEntry (i, j, a_ij);
-			}
-
-			is.getline (buf, 80);
-
-			i++;
-		} while (is);
-
-			return is;
-
-	}
-
-	template <class Element, class Row, class Trait>
-	template <class Field>
-	std::istream &SparseMatrixReadWriteHelper<Element, Row, Trait> ::readMagmaCpt (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F, char *buf)
-	{
-		size_t i, j;
-		Element a_ij;
-		char c;
-		const char matrixstart = '[', matrixend = ']';
-		const char rowstart = '[', rowend = ']';
-		const char pairstart = '[', pairend = ']';
-
-		A._m = A._n = 0;
-		A._matA.clear ();
-
-		do {is.get(c);} while (c != matrixstart ); // find matrix start
-		i = 0;
-		while (true)
-		{
-			do {is.get(c);} while (c != matrixend && c != rowstart);
-			if (c == matrixend) return is;
-			else
-			{
-				A._m++;
-				A._matA.push_back (Row ());
-				//processrow(i)
-				while (true)
-				{
-					do {is.get(c);} while (c != pairstart && c != rowend );
-					if (c == rowend) break;
-					else
-					{  //processpair( j v for row i);
-						is >> j;
-						if (j > A._n) A._n = j;
-						do {is.get(c);} while (!std::isdigit(c) && c != '-' && c != '+');
-						is.unget();
-						F.read(is, a_ij);
-						if (!F.isZero(a_ij)) A.setEntry (i, j-1, a_ij);
-						do {is.get(c);} while (c != pairend);
-					}
-				}
-				++i;
-			}
-		}
-		//return is; //BB: unreachable
-	}
-
-	template <class Element, class Row, class Trait>
-	template <class Field>
-	std::istream &SparseMatrixReadWriteHelper<Element, Row, Trait> ::read (SparseMatrixBase<Element, Row> &A, std::istream &is, const Field &F,
-									       FileFormatTag format)
-	{
-		char buf[80];
-		buf[0]=0;
-		char c;
-
-		switch (format) {
-		case FORMAT_DETECT: {
-					    is.getline (buf, 80);
-					    std::istringstream str (buf);
-					    do str >> c; while (isspace (c));
-
-					    if (c == '[') {
-						    if (strchr (buf, ';') != NULL)
-							    readMatlab (A, is, F, buf);
-						    else
-							    readPretty (A, is, F, buf);
-					    }
-					    else if (std::isdigit (c)) {
-						    do str >> c; while (str && (isspace (c) || std::isdigit (c)));
-
-						    if (c == 'M')
-							    return readGuillaume (A, is, F, buf);
-						    else
-							    return readTurner (A, is, F, buf);
-					    }
-					    else
-						    throw InvalidMatrixInput ();
-					    break;
-				    }
-
-		case FORMAT_TURNER:
-				    return readTurner (A, is, F, buf);
-		case FORMAT_GUILLAUME:
-				    return readGuillaume (A, is, F, buf);
-		case FORMAT_MATLAB:
-				    return readMatlab (A, is, F, buf);
-		case FORMAT_PRETTY:
-				    return readPretty (A, is, F, buf);
-		case FORMAT_MAGMACPT:
-				    return readMagmaCpt (A, is, F, buf);
-		default:
-				    throw InvalidMatrixInput();
-		}
-
-		return is;
-	}
-
-	template <class Element, class Row, class Trait>
-	template <class Field>
-	std::ostream &SparseMatrixWriteHelper<Element, Row, Trait> ::write (const SparseMatrixBase<Element, Row> &A, std::ostream &os, const Field &F,
-									    FileFormatTag format)
-	{
-		typename SparseMatrixBase<Element, Row>::Rep::const_iterator i;
-		typename Row::const_iterator j;
-		typename Field::Element zero;
-		size_t i_idx, j_idx;
-		//	int col_width;
-		integer c;
-		bool firstrow;
-
-		// Avoid massive unneeded overhead in the case that this
-		// printing is disabled
-		if (commentator().isNullStream (os))
-			return os;
-
-		switch (format) {
-		case FORMAT_DETECT:
-			throw PreconditionFailed (__func__, __LINE__, "format != FORMAT_DETECT");
-			//break;//BB: unreachable
-
-		case FORMAT_TURNER:
-			// The i j v triples, with zero based indices.
-			for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); i++, i_idx++) {
-				for (j = i->begin (), j_idx = 0; j != i->end (); j++, j_idx++) {
-					os << i_idx << ' ' << j->first << ' ';
-					F.write (os, j->second);
-					os << std::endl;
-				}
-			}
-			break;
-
-		case FORMAT_ONE_BASED:
-			// The i j v triples, with zero based indices.
-			for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); i++, i_idx++) {
-				for (j = i->begin (), j_idx = 0; j != i->end (); j++, j_idx++) {
-					os << i_idx + 1 << ' ' << j->first + 1 << ' ';
-					F.write (os, j->second);
-					os << std::endl;
-				}
-			}
-			break;
-
-		case FORMAT_GUILLAUME:
-			// row col 'M' header line followed by the i j v triples, one based,
-			// followed by 0 0 0.
-			os << A._m << ' ' << A._n << " M" << std::endl;
-
-			for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); i++, i_idx++) {
-				for (j = i->begin (), j_idx = 0; j != i->end (); j++, j_idx++) {
-					os << i_idx + 1 << ' ' << j->first + 1 << ' ';
-					F.write (os, j->second);
-					os << std::endl;
-				}
-			}
-
-			os << "0 0 0" << std::endl;
-
-			break;
-
-		case FORMAT_MATLAB:
-			F.init (zero, 0);
-
-			os << "[";
-
-			for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); i++, i_idx++) {
-				j = i->begin ();
-
-				for (j_idx = 0; j_idx < A._n; j_idx++) {
-					if (j == i->end () || j_idx != j->first)
-						F.write (os, zero);
-					else {
-						F.write (os, j->second);
-						j++;
-					}
-
-					if (j_idx < A._n - 1)
-						os << ", ";
-				}
-
-				os << "; ";
-			}
-
-			os << "]";
-
-			break;
-
-		case FORMAT_MAPLE:
-			F.init (zero, 0);
-
-			os << "[";
-			firstrow=true;
-
-			for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); ++i, ++i_idx) {
-				if (firstrow) {
-					os << "[";
-					firstrow =false;
-				}
-				else
-					os << ", [";
-
-				j = i->begin ();
-
-				for (j_idx = 0; j_idx < A._n; j_idx++) {
-					if (j == i->end () || j_idx != j->first)
-						F.write (os, zero);
-					else {
-						F.write (os, j->second);
-						j++;
-					}
-
-					if (j_idx < A._n - 1)
-						os << ", ";
-				}
-
-				os << " ]";
-			}
-
-			os << "]";
-
-			break;
-
-		case FORMAT_PRETTY:
-			//F.characteristic (c);
-			//col_width = (int) ceil (log ((double) c) / M_LN10);
-			F.init (zero, 0);
-
-			for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); i++, i_idx++) {
-				os << "  [ ";
-
-				j = i->begin ();
-
-				for (j_idx = 0; j_idx < A._n; j_idx++) {
-					//os.width (col_width);
-
-					if (j == i->end () || j_idx != j->first)
-						F.write (os, zero);
-					else {
-						F.write (os, j->second);
-						j++;
-					}
-
-					os << ' ';
-				}
-
-				os << ']' << std::endl;
-			}
-
-			break;
-
-		case FORMAT_MAGMACPT:
-			os << "sparse matrix written in MagmaCpt form is not implemented" << std::endl;
-			break;
-		}
-
-		return os;
-	}
-
-	template <class Element, class Row>
-	template <class Field>
-	std::ostream &SparseMatrixWriteHelper<Element, Row, VectorCategories::SparseParallelVectorTag > ::write (const SparseMatrixBase<Element, Row> &A, std::ostream &os, const Field &F,
-														 FileFormatTag format)
-	{
-		typename SparseMatrixBase<Element, Row>::Rep::const_iterator i;
-		typename Row::first_type::const_iterator j_idx;
-		typename Row::second_type::const_iterator j_elt;
-		typename Field::Element zero;
-		size_t i_idx, j_idx_1, col_idx;
-		//int col_width;
-		integer c;
-		bool firstrow;
-
-		// Avoid massive unneeded overhead in the case that this
-		// printing is disabled
-		if (commentator().isNullStream (os))
-			return os;
-
-		switch (format) {
-		case FORMAT_DETECT:
-			throw PreconditionFailed (__func__, __LINE__, "format != FORMAT_DETECT");
-			//break//BB: unreachable;
-
-		case FORMAT_TURNER:
-			for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); i++, i_idx++) {
-				for (j_idx = i->first.begin (), j_elt = i->second.begin ();
-				     j_idx != i->first.end ();
-				     ++j_idx, ++j_elt)
-				{
-					os << i_idx << ' ' << *j_idx << ' ';
-					F.write (os, *j_elt);
-					os << std::endl;
-				}
-			}
-
-			break;
-
-		case FORMAT_ONE_BASED:
-			for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); i++, i_idx++) {
-				for (j_idx = i->first.begin (), j_elt = i->second.begin ();
-				     j_idx != i->first.end ();
-				     ++j_idx, ++j_elt)
-				{
-					os << i_idx + 1 << ' ' << *j_idx + 1 << ' ';
-					F.write (os, *j_elt);
-					os << std::endl;
-				}
-			}
-
-			break;
-
-		case FORMAT_GUILLAUME:
-			os << A._m << ' ' << A._n << " M" << std::endl;
-
-			for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); i++, i_idx++) {
-				for (j_idx = i->first.begin (), j_elt = i->second.begin ();
-				     j_idx != i->first.end ();
-				     ++j_idx, ++j_elt)
-				{
-					os << i_idx + 1 << ' ' << *j_idx + 1 << ' ';
-					F.write (os, *j_elt);
-					os << std::endl;
-				}
-			}
-
-			os << "0 0 0" << std::endl;
-
-			break;
-
-		case FORMAT_MAPLE:
-			F.init (zero, 0);
-			firstrow=true;
-
-			os << "[";
-
-			for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); i++, i_idx++) {
-				if (firstrow) {
-					os << "[";
-					firstrow =false;
-				}
-				else
-					os << ", [";
-
-				j_idx = i->first.begin ();
-				j_elt = i->second.begin ();
-
-				for (j_idx_1 = 0; j_idx_1 < A._n; j_idx_1++) {
-					if (j_idx == i->first.end () || j_idx_1 != *j_idx)
-						F.write (os, zero);
-					else {
-						F.write (os, *j_elt);
-						++j_idx;
-						++j_elt;
-					}
-
-					if (j_idx_1 < A._n - 1)
-						os << ", ";
-				}
-
-				os << "]";
-			}
-
-			os << "]";
-
-			break;
-
-		case FORMAT_MATLAB:
-			F.init (zero, 0);
-
-			os << "[";
-
-			for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); i++, i_idx++) {
-				j_idx = i->first.begin ();
-				j_elt = i->second.begin ();
-
-				for (j_idx_1 = 0; j_idx_1 < A._n; j_idx_1++) {
-					if (j_idx == i->first.end () || j_idx_1 != *j_idx)
-						F.write (os, zero);
-					else {
-						F.write (os, *j_elt);
-						++j_idx;
-						++j_elt;
-					}
-
-					if (j_idx_1 < A._n - 1)
-						os << ", ";
-				}
-
-				os << "; ";
-			}
-
-			os << "]";
-
-			break;
-
-		case FORMAT_PRETTY:
-			//F.characteristic (c);
-			//col_width = (int) ceil (log ((double) c) / M_LN10);
-			F.init (zero, 0);
-
-			for (i = A._matA.begin (), i_idx = 0; i != A._matA.end (); i++, i_idx++) {
-				os << "  [ ";
-
-				j_idx = i->first.begin ();
-				j_elt = i->second.begin ();
-
-				for (col_idx = 0; col_idx < A._n; col_idx++) {
-					//os.width (col_width);
-
-					if (j_idx == i->first.end () || col_idx != *j_idx)
-						F.write (os, zero);
-					else {
-						F.write (os, *j_elt);
-						++j_idx; ++j_elt;
-					}
-
-					os << ' ';
-				}
-
-				os << ']';
-			}
-
-			break;
-		case FORMAT_MAGMACPT:
-			os << "sparse matrix written in MagmaCpt form is not implemented" << std::endl;
-			break;
-		}
-
-		return os;
-	}
-
-	template <class Element, class Row, class Tag>
-	template <class Field>
-	SparseMatrixBase<Element,Row,Tag> ::SparseMatrixBase( MatrixStream<Field>& ms ) :
-		_matA(0), _m(0), _n(0)
-	{
-		Element val;
-		size_t i, j;
-		while( ms.nextTriple(i,j,val) ) {
-			if( i >= _m ) {
-				_m = i + 1;
-				_matA.resize( _m );
-			}
-			if( j >= _n ) _n = j + 1;
-			setEntry(i,j,val);
-		}
-		if( ms.getError() > END_OF_MATRIX )
-			throw ms.reportError(__func__,__LINE__);
-		if( !ms.getDimensions( i, _n ) )
-			throw ms.reportError(__func__,__LINE__);
-		if( i > _m ) {
-			_m = i;
-			_matA.resize(_m);
-		}
-	}
-
-	template <class Element, class Row>
-	template <class Field>
-	SparseMatrixBase<Element,Row,VectorCategories::SparseSequenceVectorTag> ::SparseMatrixBase( MatrixStream<Field>& ms ) :
-		_matA(0), _m(0), _n(0)
-	{
-		Element val;
-		size_t i, j;
-		while( ms.nextTriple(i,j,val) ) {
-			if( i >= _m ) {
-				_m = i + 1;
-				_matA.resize( _m );
-			}
-			if( j >= _n ) _n = j + 1;
-			setEntry(i,j,val);
-		}
-		if( ms.getError() > END_OF_MATRIX )
-			throw ms.reportError(__func__,__LINE__);
-		if( !ms.getDimensions( i, _n ) )
-			throw ms.reportError(__func__,__LINE__);
-		if( i > _m ) {
-			_m = i;
-			_matA.resize(_m);
-		}
-	}
-
-	template <class Element, class Row>
-	template <class Field>
-	SparseMatrixBase<Element,Row,VectorCategories::SparseAssociativeVectorTag> ::SparseMatrixBase( MatrixStream<Field>& ms ) :
-		_matA(0), _m(0), _n(0)
-	{
-		Element val;
-		size_t i, j;
-		while( ms.nextTriple(i,j,val) ) {
-			if( i >= _m ) {
-				_m = i + 1;
-				_matA.resize( _m );
-			}
-			if( j >= _n ) _n = j + 1;
-			setEntry(i,j,val);
-		}
-		if( ms.getError() > END_OF_MATRIX )
-			throw ms.reportError(__func__,__LINE__);
-		if( !ms.getDimensions( i, _n ) )
-			throw ms.reportError(__func__,__LINE__);
-		if( i > _m ) {
-			_m = i;
-			_matA.resize(_m);
-		}
-	}
-
-	template <class Element, class Row>
-	template <class Field>
-	SparseMatrixBase<Element,Row,VectorCategories::SparseParallelVectorTag> ::SparseMatrixBase( MatrixStream<Field>& ms ) :
-		_matA(0), _m(0), _n(0)
-	{
-		Element val;
-		size_t i, j;
-		while( ms.nextTriple(i,j,val) ) {
-			if( i >= _m ) {
-				_m = i + 1;
-				_matA.resize( _m );
-			}
-			if( j >= _n ) _n = j + 1;
-			setEntry(i,j,val);
-		}
-		if( ms.getError() > END_OF_MATRIX )
-			throw ms.reportError(__func__,__LINE__);
-		if( !ms.getDimensions( i, _n ) )
-			throw ms.reportError(__func__,__LINE__);
-		if( i > _m ) {
-			_m = i;
-			_matA.resize(_m);
-		}
-	}
-
-	template <class Element, class Row>
-	void SparseMatrixBase<Element, Row, VectorCategories::SparseSequenceVectorTag > ::setEntry (size_t i, size_t j, const Element &value)
-	{
-		typedef typename Row::value_type value_type;
-		Row &v = _matA[i];
-		typename Row::iterator iter;
-
-		if (v.size () == 0) {
-			v.push_back ( value_type((unsigned)j, value));
-		}
-		else {
-			iter = std::lower_bound (v.begin (), v.end (), j, VectorWrapper::CompareSparseEntries<Element> ());
-
-			if (iter == v.end () || iter->first != j)
-				iter = v.insert (iter, value_type((unsigned)j, value));
-			else
-				iter->second = value;
-		}
-	}
-
-	template <class Element, class Row>
-	Element &SparseMatrixBase<Element, Row, VectorCategories::SparseSequenceVectorTag > ::refEntry (size_t i, size_t j)
-	{
-		static Element zero;
-
-		Row &v = _matA[i];
-		typename Row::iterator iter;
-
-		if (v.size () == 0) {
-			v.push_back (std::pair <size_t, Element> (j, zero));
-			return v.front ().second;
-		}
-		else {
-			iter = std::lower_bound (v.begin (), v.end (), j, VectorWrapper::CompareSparseEntries<Element> ());
-
-			if (iter == v.end () || iter->first != j)
-				iter = v.insert (iter, std::pair <size_t, Element> (j, zero));
-
-			return iter->second;
-		}
-	}
-
-	template <class Element, class Row>
-	const Element &SparseMatrixBase<Element, Row, VectorCategories::SparseSequenceVectorTag > ::getEntry (size_t i, size_t j) const
-	{
-		static Element zero;
-
-		const Row &v = _matA[i];
-		typename Row::const_iterator iter;
-
-		if (v.size () == 0)
-			return zero;
-		else {
-			iter = std::lower_bound (v.begin (), v.end (), j, VectorWrapper::CompareSparseEntries<Element> ());
-
-			if (iter == v.end () || iter->first != j)
-				return zero;
-			else
-				return iter->second;
-		}
-	}
-
-	template <class Element, class Row>
-	const Element &SparseMatrixBase<Element, Row, VectorCategories::SparseAssociativeVectorTag > ::getEntry (size_t i, size_t j) const
-	{
-		static Element zero;
-
-		const Row &v = _matA[i];
-		typename Row::const_iterator iter;
-
-		if (v.size () == 0)
-			return zero;
-		else {
-			iter = v.find (j);
-
-			if (iter == v.end () || iter->first != j)
-				return zero;
-			else
-				return iter->second;
-		}
-	}
-
-	template <class Element, class Row>
-	void SparseMatrixBase<Element, Row, VectorCategories::SparseParallelVectorTag > ::setEntry (size_t i, size_t j, const Element &value)
-	{
-		while (_matA.size() < i + 1) _matA.push_back(Row());
-		_m = _matA.size();
-
-		Row &v = _matA[i];
-		typename Row::first_type::iterator iter;
-
-		if (v.first.size () == 0) {
-			v.first.push_back (j);
-			v.second.push_back (value);
-		}
-		else {
-			iter = std::lower_bound (v.first.begin (), v.first.end (), j);
-
-			if (iter == v.first.end () || *iter != j) {
-				iter = v.first.insert (iter, j);
-				v.second.insert (v.second.begin () + (iter - v.first.begin ()), value);
-			}
-			else
-				*(v.second.begin () + (iter - v.first.begin ())) = value;
-		}
-	}
-
-	template <class Element, class Row>
-	Element &SparseMatrixBase<Element, Row, VectorCategories::SparseParallelVectorTag > ::refEntry (size_t i, size_t j)
-	{
-		static Element zero;
-
-		Row &v = _matA[i];
-		typename Row::first_type::iterator iter;
-		typename Row::second_type::iterator iter_elt;
-
-		if (v.first.size () == 0) {
-			v.first.push_back (j);
-			v.second.push_back (zero);
-			return v.second.front ();
-		}
-		else {
-			iter = std::lower_bound (v.first.begin (), v.first.end (), j);
-
-			if (iter == v.first.end () || *iter != j) {
-				iter = v.first.insert (iter, j);
-				iter_elt = v.second.insert (v.second.begin () + (iter - v.first.begin ()), zero);
-			}
-			else
-				iter_elt = v.second.begin () + (iter - v.first.begin ());
-
-			return *iter_elt;
-		}
-	}
-
-	template <class Element, class Row>
-	const Element &SparseMatrixBase<Element, Row, VectorCategories::SparseParallelVectorTag > ::getEntry (size_t i, size_t j) const
-	{
-		static Element zero;
-
-		const Row &v = _matA[i];
-		typename Row::first_type::const_iterator iter;
-
-		if (v.first.size () == 0)
-			return zero;
-		else {
-			iter = std::lower_bound (v.first.begin (), v.first.end (), j);
-
-			if (iter == v.first.end () || *iter != j)
-				return zero;
-			else
-				return *(v.second.begin () + (iter - v.first.begin ()));
-		}
-	}
-
-	template <class Element, class Row>
-	template <class Vector>
-	Vector &SparseMatrixBase<Element, Row, VectorCategories::SparseSequenceVectorTag >::columnDensity (Vector &v) const
-	{
-		unsigned int row = 0;
-
-		for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
-			typename Row::const_iterator j = i.begin ();
-
-			for (; j != i->begin (); ++j)
-				++v[j->first];
-		}
-
-		return v;
-	}
-
-	template <class Element, class Row>
-	template <class Vector>
-	Vector &SparseMatrixBase<Element, Row, VectorCategories::SparseParallelVectorTag >::columnDensity (Vector &v) const
-	{
-		unsigned int row = 0;
-
-		for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
-			typename Row::first_type::const_iterator j_idx = i->first.begin ();
-
-			for (; j_idx != i->first.end (); ++j_idx)
-				++v[*j_idx];
-		}
-
-		return v;
-	}
-
-	template <class Element, class Row>
-	template <class Vector>
-	Vector &SparseMatrixBase<Element, Row, VectorCategories::SparseAssociativeVectorTag >::columnDensity (Vector &v) const
-	{
-		unsigned int row = 0;
-
-		for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
-			typename Row::const_iterator j = i.begin ();
-
-			for (; j != i->begin (); ++j)
-				++v[j->first];
-		}
-
-		return v;
-	}
-
-	template <class Element, class Row>
-	SparseMatrixBase<Element, Row, VectorCategories::SparseSequenceVectorTag >
-	&SparseMatrixBase<Element, Row, VectorCategories::SparseSequenceVectorTag >::transpose (SparseMatrixBase &AT) const
-	{
-		unsigned int row = 0;
-
-		for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
-			typename Row::const_iterator j = i.begin ();
-
-			for (; j != i->begin (); ++j)
-				AT._matA[j->first].push_back (std::pair<size_t, Element> (row, j->second));
-		}
-
-		return AT;
-	}
-
-	template <class Element, class Row>
-	SparseMatrixBase<Element, Row, VectorCategories::SparseAssociativeVectorTag >
-	&SparseMatrixBase<Element, Row, VectorCategories::SparseAssociativeVectorTag >::transpose (SparseMatrixBase &AT) const
-	{
-		unsigned int row = 0;
-
-		for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
-			typename Row::const_iterator j = i.begin ();
-
-			for (; j != i->begin (); ++j)
-				AT._matA[j->first][row] = j->second;
-		}
-
-		return AT;
-	}
-
-	template <class Element, class Row>
-	SparseMatrixBase<Element, Row, VectorCategories::SparseParallelVectorTag >
-	&SparseMatrixBase<Element, Row, VectorCategories::SparseParallelVectorTag >::transpose (SparseMatrixBase &AT) const
-	{
-		unsigned int row = 0;
-
-		for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
-			typename Row::first_type::const_iterator j_idx = i->first.begin ();
-			typename Row::second_type::const_iterator j_elt = i->second.begin ();
-
-			for (; j_idx != i->first.end (); ++j_idx, ++j_elt) {
-				AT._matA[*j_idx].first.push_back (row);
-				AT._matA[*j_idx].second.push_back (*j_elt);
-			}
-		}
-
-		return AT;
-	}
-
-} // namespace LinBox
-
-#endif // __LINBOX_matrix_sparse_INL
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/matrix/sparsematrix/Makefile.am b/linbox/matrix/sparsematrix/Makefile.am
new file mode 100644
index 0000000..239659a
--- /dev/null
+++ b/linbox/matrix/sparsematrix/Makefile.am
@@ -0,0 +1,59 @@
+# Copyright (c) 2013 the LinBox group
+#  ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the  GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# ========LICENCE========
+
+
+
+pkgincludesubdir=$(pkgincludedir)/matrix/sparsematrix
+
+
+pkgincludesub_HEADERS =         \
+	sparse-domain.h         \
+	sparse-coo-matrix.h     \
+	sparse-coo-implicit-matrix.h     \
+	sparse-csr-matrix.h     \
+	sparse-ell-matrix.h     \
+	sparse-ellr-matrix.h    \
+	sparse-hyb-matrix.h     \
+	sparse-tpl-matrix.h     \
+	sparse-tpl-matrix.inl   \
+	sparse-tpl-matrix-omp.h  \
+	sparse-tpl-matrix-omp.inl  \
+	sparse-generic.h \
+	sparse-generic.inl \
+	sparse-associative-vector.h      \
+	sparse-associative-vector.inl    \
+        sparse-parallel-vector.h         \
+        sparse-parallel-vector.inl       \
+        sparse-sequence-vector.h         \
+	triples-coord.h  \
+	read-write-sparse.h \
+	read-write-sparse.inl \
+        sparse-sequence-vector.inl
+
+
+
+
+#  sparse-coo-1-matrix.h     \
+#  sparse-csr-1-matrix.h     \
+#  sparse-ellr-1-matrix.h    \
+#  sparse-bcsr-matrix.h    \
+#  sparse-dia-matrix.h    \
+#  sparse-tpl-matrix.h    \
+#  sparse-csc-matrix.h     \
+#
diff --git a/linbox/matrix/sparsematrix/read-write-sparse.h b/linbox/matrix/sparsematrix/read-write-sparse.h
new file mode 100644
index 0000000..e05e7e4
--- /dev/null
+++ b/linbox/matrix/sparsematrix/read-write-sparse.h
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) the LinBox group
+ *
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/** @file linbox/matrix/sparsematrix/read-write-sparse.h
+ * @ingroup sparsematrix
+ * @brief
+ */
+
+#ifndef __LINBOX_matrix_sparse_matrix_read_write_sparse_H
+#define __LINBOX_matrix_sparse_matrix_read_write_sparse_H
+
+#include "linbox/matrix/matrix-traits.h"
+#include "linbox/matrix/matrix-category.h"
+#include "linbox/util/matrix-stream.h"
+
+namespace LinBox {
+
+	//! Write helper
+	template <class Matrix>
+	class SparseMatrixWriteHelper {
+	public:
+		typedef typename Matrix::Field          Field;
+		typedef typename Field::Element       Element;
+
+	private:
+		static std::ostream &writeTriple (const Matrix &A
+						  , std::ostream &os
+						  , MatrixCategories::RowMatrixTag
+						  , bool oneBased = false);
+
+		static std::ostream &writeTriple (const Matrix &A
+						  , std::ostream &os
+						  , MatrixCategories::BlackboxTag
+						  , bool oneBased = false);
+
+
+		static std::ostream &writePretty (const Matrix &A
+						  , std::ostream &os
+						  , std::string begmat
+						  , std::string endmat
+						  , std::string begrow
+						  , std::string endrow
+						  , std::string sepelt
+						  , std::string seprow
+						  , MatrixCategories::RowMatrixTag
+						 );
+
+		static std::ostream &writePretty (const Matrix &A
+						  , std::ostream &os
+						  , std::string begmat
+						  , std::string endmat
+						  , std::string begrow
+						  , std::string endrow
+						  , std::string sepelt
+						  , std::string seprow
+						  , MatrixCategories::BlackboxTag
+						 );
+
+
+
+	public:
+		static std::ostream &write (const Matrix &A
+					    , std::ostream &os
+					    , LINBOX_enum(Tag::FileFormat) format);
+	};
+
+	//! Read helper
+	template <class Matrix>
+	class SparseMatrixReadHelper  {
+
+	public:
+		typedef typename Matrix::Field      Field;
+		typedef typename Field::Element   Element;
+
+	private:
+
+#if 0
+		static std::istream &readTurner    (Matrix &A
+						    , std::istream &is
+						    , char *buf);
+
+		static std::istream &readMagmaCpt  (Matrix &A
+						    , std::istream &is
+						    , char *buf);
+#endif
+
+		static std::istream &readGuillaume (Matrix &A
+						    , std::istream &is
+						    , char *buf);
+
+		static std::istream &readMatlab    (Matrix &A
+						    , std::istream &is
+						    , char *buf);
+
+		static std::istream &readPretty    (Matrix &A
+						    , std::istream &is
+						    , char *buf
+						    , MatrixCategories::RowMatrixTag);
+
+		static std::istream &readPretty    (Matrix &A
+						    , std::istream &is
+						    , char *buf
+						    , MatrixCategories::BlackboxTag);
+
+		static std::istream &readMatrixMarket (Matrix &A
+						    , std::istream &is
+						    , char *buf);
+
+
+
+
+	public:
+		static std::istream &read (Matrix &A
+					   , std::istream &is
+					   , LINBOX_enum(Tag::FileFormat) format)
+		;
+			// return read(A,is,format, typename MatrixTraits<Matrix>::MatrixCategory ());
+	};
+
+
+
+} // LinBox
+
+
+#include "linbox/matrix/sparsematrix/read-write-sparse.inl"
+#endif // __LINBOX_matrix_sparse_matrix_read_write_sparse_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/read-write-sparse.inl b/linbox/matrix/sparsematrix/read-write-sparse.inl
new file mode 100644
index 0000000..fcf73c5
--- /dev/null
+++ b/linbox/matrix/sparsematrix/read-write-sparse.inl
@@ -0,0 +1,604 @@
+/*
+ * Copyright (C) the LinBox group
+ *
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_matrix_sparse_matrix_read_write_sparse_INL
+#define __LINBOX_matrix_sparse_matrix_read_write_sparse_INL
+
+/**** Read Iterators ***/
+namespace LinBox {
+
+#if 0 /* dubious (where are size set, why is it not checked ?) */
+	template<class Matrix>
+	std::istream &SparseMatrixReadHelper<Matrix>::readTurner (Matrix &A, std::istream &is
+								  , char *buf)
+	{
+		size_t i, j;
+
+		A.refRep().clear ();
+		A.refRep().resize (A.rowdim());
+
+		do {
+			std::istringstream str (buf);
+
+			str >> i;
+
+			if (i == (size_t) -1) break; // return also if row index is -1
+			str >> j;
+			A.field().read (str, A.refEntry (i, j));
+
+			is.getline (buf, 80);
+		} while (is);
+
+		return is;
+	}
+#endif
+
+	template<class Matrix>
+	std::istream &SparseMatrixReadHelper<Matrix>::readGuillaume (Matrix &A, std::istream &is
+								     , char *buf)
+	{
+		typedef typename Matrix::Field::Element Element;
+		size_t i = 0, j = 0 ;
+
+		std::istringstream str (buf);
+		size_t m, n ;
+		str >> m >> n;
+		A.resize(m,n);
+
+		Element x;
+		while (is >> i) {
+			if (i == 0 || i == (size_t) -1) {is >> j; A.field().read(is, x); break;}
+			is >> j;
+			if (i > A.rowdim() || j > A.coldim())
+				throw Exceptions::InvalidMatrixInput ();
+			A.field().read (is, x);
+			if (! A.field().isZero(x)) // this is probably tested in setEntry (hopefully)
+			       	A.appendEntry (i - 1, j - 1, x);
+		}
+
+		A.finalize();
+
+		return is;
+
+	}
+
+	//! @bug buf is not used (hence the first line is always lost.
+	template<class Matrix>
+	std::istream &SparseMatrixReadHelper<Matrix>::readMatlab (Matrix &A, std::istream &is
+								  , char *buf)
+	{
+		typedef typename Matrix::Field::Element Element;
+		size_t i = 0, j = 0;
+		char c;
+		Element a_ij;
+
+		while (1) {
+			do is >> c; while (is && !std::isdigit (c));
+			if (!is) break;
+
+			is.putback (c);
+
+			A.field().read (is, a_ij);
+			A.appendEntry (i, j++, a_ij);
+
+			do is >> c; while (is && c != ',' && c != ';' && c != ']');
+			if (!is) break;;
+
+			if (c == ';') {
+				++i;
+				j = 0;
+			}
+			else if (c == ']') break;
+		}
+
+		A.finalize();
+		return is;
+	}
+
+	template<class Matrix>
+	std::istream &SparseMatrixReadHelper<Matrix>::readPretty (Matrix &A
+								  , std::istream &is
+								  , char *buf
+								  , MatrixCategories::RowMatrixTag)
+	{
+		typedef typename Matrix::Field::Element Element;
+		size_t i;
+		Element a_ij;
+
+		A._m = 0;
+		A.refRep().clear ();
+
+		i = 0;
+
+		do {
+			char c;
+			size_t j;
+			++(A._m);
+			A.refRep().push_back ( typename Matrix::Row ());
+
+			std::istringstream str (buf);
+
+			do {str >> c; std::cout << "x" << c << "x" << std::endl;} while (isspace (c));
+			if (c != '[')
+				throw Exceptions::InvalidMatrixInput ();
+
+			j = 0;
+
+			while (str) {
+				do str >> c; while (isspace (c));
+				if (!str || c == ']') break;
+				A.field().read (str, a_ij);
+
+				++j;
+				if (j > A.coldim())
+					++(A._n);
+
+				if (!A.field().isZero(a_ij)) { // probably tested
+					A.appendEntry (i, j, a_ij);
+				}
+			}
+
+			is.getline (buf, 80);
+
+			++i;
+		} while (is);
+
+		A.finalize();
+			return is;
+
+	}
+
+	template<class Matrix>
+	std::istream &SparseMatrixReadHelper<Matrix>::readPretty (Matrix &A
+								  , std::istream &is
+								  , char *buf
+								  , MatrixCategories::BlackboxTag)
+	{
+		typedef typename Matrix::Field::Element Element;
+		size_t i;
+		Element a_ij;
+
+		A.resize(0,0);
+
+		i = 0;
+
+		do {
+			char c;
+			size_t j;
+
+			A.resize(i+1,A.coldim());
+			std::istringstream str (buf);
+
+			do {
+				str >> c;
+			} while (isspace (c));
+
+			if (c != '[')
+				throw Exceptions::InvalidMatrixInput ();
+
+			j = 0;
+
+			while (str) {
+				do str >> c; while (isspace (c));
+				if (!str || c == ']') break;
+				A.field().read (str, a_ij);
+
+				++j;
+
+				if (!A.field().isZero(a_ij)) {
+					if (j >= A.coldim())
+						A.resize(i,j+1);
+
+					A.appendEntry (i, j, a_ij);
+				}
+			}
+
+			is.getline (buf, 80);
+
+			++i;
+		} while (is);
+
+		A.finalize();
+			return is;
+
+	}
+
+#if 0 /* there is no writer for this, no autodetect, should we care ? */
+
+	template<class Matrix>
+	std::istream &SparseMatrixReadHelper<Matrix>::readMagmaCpt (Matrix &A, std::istream &is
+								    , char *buf)
+	{
+		typedef typename Matrix::Field::Element Element;
+		size_t i, j;
+		Element a_ij;
+		char c;
+		const char matrixstart = '[', matrixend = ']';
+		const char rowstart = '[', rowend = ']';
+		const char pairstart = '[', pairend = ']';
+
+		A.resize(0,0);
+
+		do {is.get(c);} while (c != matrixstart ); // find matrix start
+		i = 0;
+		while (true)
+		{
+			do {is.get(c);} while (c != matrixend && c != rowstart);
+			if (c == matrixend) return is;
+			else
+			{
+				++(A._m);
+				A.refRep().push_back (typename Matrix::Row ());
+				//processrow(i)
+				while (true)
+				{
+					do {is.get(c);} while (c != pairstart && c != rowend );
+					if (c == rowend) break;
+					else
+					{  //processpair( j v for row i);
+						is >> j;
+						if (j > A.coldim()) A._n = j;
+						do {is.get(c);} while (!std::isdigit(c) && c != '-' && c != '+');
+						is.unget();
+						A.field().read(is, a_ij);
+						if (!A.field().isZero(a_ij)) A.setEntry (i, j-1, a_ij);
+						do {is.get(c);} while (c != pairend);
+					}
+				}
+				++i;
+			}
+		}
+	}
+#endif
+
+	template<class Matrix>
+	std::istream &SparseMatrixReadHelper<Matrix>::readMatrixMarket (Matrix &A, std::istream &is
+									, char *buf)
+	{
+		typedef typename Matrix::Field   Field;
+		typedef typename Field::Element  Element;
+
+		MatrixStream<Field> ms(A.field(), is);
+		size_t m,n ;
+		if( !ms.getDimensions( m, n ) )
+			throw ms.reportError(__func__,__LINE__);
+		A.resize(m,n);
+		Element val;
+		size_t i, j;
+		while( ms.nextTriple(i,j,val) ) {
+			A.appendEntry(i,j,val);
+		}
+		if( ms.getError() > END_OF_MATRIX )
+			throw ms.reportError(__func__,__LINE__);
+
+		A.finalize();
+		return is;
+	}
+} // LinBox
+
+/**** Write Iterators ***/
+namespace LinBox {
+	template<class Matrix>
+	std::ostream &SparseMatrixWriteHelper<Matrix>::writeTriple (const Matrix &A
+								    , std::ostream &os
+								    , MatrixCategories::RowMatrixTag
+								    , bool oneBased)
+	{
+		typename Matrix::Rep::const_iterator i;
+		typename Matrix::Row::const_iterator j;
+		size_t i_idx, j_idx;
+
+
+		// The i j v triples, with zero based indices.
+		for (i = A.getRep().begin (), i_idx = 0; i != A.getRep().end (); ++i, ++i_idx) {
+			for (j = i->begin (), j_idx = 0; j != i->end (); ++j, ++j_idx) {
+				if (oneBased)
+					os << i_idx + 1 << ' ' << j->first + 1 << ' ';
+				else
+					os << i_idx << ' ' << j->first << ' ';
+				A.field().write (os, j->second);
+				os << std::endl;
+			}
+		}
+		return os;
+
+	}
+
+	template<class Matrix>
+	std::ostream &SparseMatrixWriteHelper<Matrix>::writeTriple (const Matrix &A
+								    , std::ostream &os
+								    , MatrixCategories::BlackboxTag
+								    , bool oneBased)
+	{
+		size_t i,j ;
+		Element e ;
+
+		A.firstTriple();
+
+		while (A.nextTriple(i,j,e)) {
+			if (oneBased)
+				os << i + 1 << ' ' << j + 1 << ' ';
+			else
+				os << i << ' ' << j << ' ';
+			A.field().write (os, e);
+			os << std::endl;
+		}
+		return os;
+	}
+
+
+	template<class Matrix>
+	std::ostream &SparseMatrixWriteHelper<Matrix>::writePretty (const Matrix &A, std::ostream &os
+								    , std::string begmat
+								    , std::string endmat
+								    , std::string begrow
+								    , std::string endrow
+								    , std::string sepelt
+								    , std::string seprow
+								    , MatrixCategories::RowMatrixTag
+								   )
+	{
+		typename Matrix::Rep::const_iterator i;
+		typename Matrix::Row::const_iterator j;
+		size_t i_idx, j_idx;
+		bool firstrow;
+
+		os << begmat;
+		firstrow=true;
+
+		for (i = A.getRep().begin (), i_idx = 0; i != A.getRep().end (); ++i, ++i_idx) {
+			j = i->begin ();
+
+			if (firstrow) {
+				os << begrow;
+				firstrow =false;
+			}
+			else
+				os << seprow << begrow;
+
+
+			for (j_idx = 0; j_idx < A.coldim(); ++j_idx) {
+				if (j == i->end () || j_idx != j->first)
+					A.field().write (os, A.field().zero);
+				else {
+					A.field().write (os, j->second);
+					++j;
+				}
+
+				if (j_idx < A.coldim() - 1)
+					os << sepelt << ' ';
+			}
+
+			os << endrow;
+		}
+
+		os << endmat;
+
+		return os ;
+	}
+
+	template<class Matrix>
+	std::ostream &SparseMatrixWriteHelper<Matrix>::writePretty (const Matrix &A, std::ostream &os
+								    , std::string begmat
+								    , std::string endmat
+								    , std::string begrow
+								    , std::string endrow
+								    , std::string sepelt
+								    , std::string seprow
+								    , MatrixCategories::BlackboxTag
+								   )
+	{
+		size_t i_idx=0, j_idx=0;
+		Element e;
+
+		A.firstTriple();
+
+		os << begmat;
+
+		bool ok = A.nextTriple(i_idx,j_idx,e);
+
+		for (size_t i = 0 ; i < A.rowdim() ; ++i) {
+
+			if (i != 0 ) { /*  not first row */
+				os << seprow ;
+			}
+
+			os << begrow;
+
+			for (size_t j = 0 ; j < A.coldim() ; ++j) {
+				if (ok && i == i_idx && j == j_idx) {
+					A.field().write (os, e);
+					ok = A.nextTriple(i_idx,j_idx,e);
+				}
+				else {
+					A.field().write (os, A.field().zero);
+				}
+				if (j < A.coldim() - 1)
+					os << sepelt << ' ';
+			}
+			os << endrow ;
+		}
+
+		os << endmat;
+
+		return os ;
+	}
+
+} // namespace LinBox
+
+namespace LinBox {
+	// read
+	template<class Matrix>
+	std::istream &SparseMatrixReadHelper<Matrix> ::read (Matrix &A
+							     , std::istream &is
+							     , LINBOX_enum(Tag::FileFormat) format
+							    )
+	{
+		char buf[80];
+		buf[0]=0;
+
+		switch (format) {
+		case Tag::FileFormat::Detect:
+			{
+				char c;
+				is.getline (buf, 80);
+				std::istringstream str (buf);
+				do str >> c; while (isspace (c));
+
+				if (c == '[') {
+					if (strchr (buf, ';') != NULL)
+						readMatlab (A, is, buf);
+					else
+						readPretty (A, is, buf, typename MatrixTraits<Matrix>::MatrixCategory ());
+				}
+				else if (c == '%') {
+					size_t un = (size_t) is.gcount() ;
+					for (size_t i = 0 ; i < un ; ++i)
+						is.unget();
+					readMatrixMarket(A,is,buf);
+				}
+				else if (std::isdigit (c)) {
+					do str >> c; while (str && (isspace (c) || std::isdigit (c)));
+
+					if (c == 'M')
+						return readGuillaume (A, is, buf);
+					// else return readTurner (A, is, buf);
+				}
+				else {
+#ifndef NDEBUG
+					std::cout << "buffer :" << buf << std::endl;
+#endif
+					throw Exceptions::InvalidMatrixInput ();
+				}
+				break;
+			}
+
+			// case Tag::FileFormat::Turner:  return readTurner (A, is, buf);
+		case Tag::FileFormat::Guillaume:
+			return readGuillaume (A, is, buf);
+		case Tag::FileFormat::Matlab:
+			return readMatlab (A, is, buf);
+		case Tag::FileFormat::Pretty:
+			return readPretty (A, is, buf, typename MatrixTraits<Matrix>::MatrixCategory ());
+		// case Tag::FileFormat::MagmaCpt:
+			// return readMagmaCpt (A, is, buf);
+		case Tag::FileFormat::MatrixMarket:
+			return readMatrixMarket (A, is, buf);
+		default:
+			throw Exceptions::InvalidMatrixInput();
+		}
+
+		return is;
+	}
+
+	// write
+	template<class Matrix>
+	std::ostream &SparseMatrixWriteHelper<Matrix> ::write (const Matrix &A
+							       , std::ostream &os
+							       , LINBOX_enum(Tag::FileFormat) format
+							       )
+	{
+		// Avoid massive unneeded overhead in the case that this
+		// printing is disabled
+		if (not os)
+			return os;
+
+		switch (format) {
+		case Tag::FileFormat::Detect:
+			throw PreconditionFailed (__func__, __LINE__, "format != Tag::FileFormat::Detect");
+
+		// case Tag::FileFormat::Turner:
+			// return writeTriple(A,os);
+
+		case Tag::FileFormat::OneBased:
+			return writeTriple(A,os,typename MatrixTraits<Matrix>::MatrixCategory (),true);
+
+		case Tag::FileFormat::Guillaume:
+			// row col 'M' header line followed by the i j v triples, one based,
+			// followed by 0 0 0.
+			os << A.rowdim() << ' ' << A.coldim() << " M" << std::endl;
+			writeTriple(A,os,typename MatrixTraits<Matrix>::MatrixCategory (),true);
+			os << "0 0 0" << std::endl;
+
+			return os;
+
+		case Tag::FileFormat::Matlab:
+			return writePretty(A,os,"[","]","","; ",",","",typename MatrixTraits<Matrix>::MatrixCategory ());
+			// std::string begmat = "[";
+			// std::string endmat = "]";
+			// std::string begrow = "";
+			// std::string endrow = "; ";
+			// std::string sepelt  = ",";
+			// std::string seprow  = "";
+
+		case Tag::FileFormat::Maple:
+			return writePretty(A,os,"[","]","["," ]",",",", ",typename MatrixTraits<Matrix>::MatrixCategory ());
+			// std::string begmat = "[";
+			// std::string endmat = "]";
+			// std::string begrow = "[";
+			// std::string endrow = " ]";
+			// std::string sepelt = ",";
+			// std::string seprow = ", "
+
+			break;
+
+		case Tag::FileFormat::Pretty:
+			return writePretty(A,os,"",""," [ ","]\n"," ","",typename MatrixTraits<Matrix>::MatrixCategory ());
+			// std::string begmat = "";
+			// std::string endmat = "";
+			// std::string begrow = " [ ";
+			// std::string endrow = "]\n";
+			// std::string sepelt  = " ";
+			// std::string seprow  = "";
+
+		case Tag::FileFormat::MatrixMarket:
+			writeMMCoordHeader(os, A, A.size(), "SparseMatrix");
+			return writeTriple(A,os,typename MatrixTraits<Matrix>::MatrixCategory (),true);
+
+
+		case Tag::FileFormat::MagmaCpt:
+			os << "sparse matrix written in MagmaCpt form is not implemented" << std::endl;
+			break;
+
+		default:
+			os << "sparse matrix written in Tag::FileFormat::" << (int)format << " is not implemented" << std::endl;
+		}
+
+		return os;
+	}
+
+} // namespace LinBox
+
+#endif // __LINBOX_matrix_sparse_matrix_read_write_sparse_INL
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-associative-vector.h b/linbox/matrix/sparsematrix/sparse-associative-vector.h
new file mode 100644
index 0000000..266a5c2
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-associative-vector.h
@@ -0,0 +1,672 @@
+/* linbox/matrix/sparse-matrix.h
+ * Copyright (C) 2001-2002 Bradford Hovinen
+ *               1999-2001 William J Turner,
+ *
+ * Written by William J Turner <wjturner at math.ncsu.edu>,
+ *            Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * --------------------------------------------------------
+ * 2003-01-11  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
+ *
+ * Move from blackbox/sparse-base.h to matrix/sparse-matrix.h
+ * ------------------------------------
+ * 2002-11-28  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
+ *
+ *   - Renamed ColOfRowsIterator to RowIterator
+ *   - Named template argument _Row rather than Row; add a typedef to Row
+ *   - Named template argument _Element rather than Row; add a typedef to Element
+ *   - Renamed IndexIterator as IndexedIterator, and adjusted to match
+ *     interface in DenseMatrixBase
+ * ------------------------------------
+ * 2002-08-06  Bradford Hovinen  <hovinen at cis.udel.edu>
+ *
+ * Renamed to sparse-base.h from sparse0-base.h
+ * ------------------------------------
+ * Modified by Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * Refactoring:
+ *   - Eliminated SparseMatrixAux and moved that functionality into Sparse0
+ *   - Made SparseMatrix parameterized only on the element type
+ *   - New read/write implementations for SparseMatrix, supporting multiple
+ *     formats
+ *   - Eliminated Gaussian elimination code
+ *   - Added iterators, including ColOfRowsIterator, Iterator, and
+ *     IndexIterator
+ *   - Eliminated operator []; added getEntry; changed put_value to setEntry
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/** @file linbox/matrix/sparsematrix/sparse-associative-vector.h
+ * @ingroup sparsematrix
+ * @brief
+ */
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_associative_vector_H
+#define __LINBOX_matrix_sparsematrix_sparse_associative_vector_H
+
+
+namespace LinBox { namespace Protected {
+
+	/* Specialization for sparse associative vectors */
+	template <class _Field, class _Row>
+	class SparseMatrixGeneric<_Field, _Row, VectorCategories::SparseAssociativeVectorTag > {
+	public:
+
+		typedef         _Field          Field;
+		typedef typename Field::Element Element;
+
+		typedef _Row Row;
+		typedef const Row ConstRow;
+		typedef _SP_BB_VECTOR_<Row> Rep;
+		typedef VectorCategories::SparseAssociativeVectorTag myTrait;
+		typedef SparseMatrixGeneric<_Field, _Row, myTrait> Self_t;
+
+#ifdef __LINBOX_PARALLEL
+		BB_list_list sub_list;
+#endif
+
+
+		template<typename _Tp1, typename _R1 = typename Rebind<_Row,_Tp1>::other >
+		struct rebind {
+			typedef SparseMatrixGeneric<_Tp1, _R1> other;
+
+			void operator() (other & Ap, const Self_t& A) {
+
+				typename _Tp1::Element e;
+
+				Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+				for( typename Self_t::ConstIndexedIterator
+				     indices = A.IndexedBegin();
+				     (indices != A.IndexedEnd()) ;
+				     ++indices ) {
+					// hom. image (e, A.getEntry(indices.rowIndex(),indices.colIndex()) );
+					hom. image (e, indices.value() );
+					if (!Ap.field().isZero(e))
+						Ap.setEntry (indices.rowIndex(),
+							     indices.colIndex(), e);
+				}
+			}
+
+		};
+
+		template<typename _Tp1, typename _Rw1>
+		SparseMatrixGeneric (const SparseMatrixGeneric<_Tp1, _Rw1, myTrait> &Mat, const Field& F) :
+			_field (F),
+			_MD (F), _AT (*this)
+			, _matA (Mat.rowdim()), _m (Mat.rowdim()), _n (Mat.coldim())
+		{
+			typename SparseMatrixGeneric<_Tp1,_Rw1, myTrait>::template rebind<Field,_Row>()(*this, Mat);
+		}
+
+		SparseMatrixGeneric (const Field & F, size_t m, size_t n) :
+			_field(F),
+			_MD(F),_AT(*this),
+			_matA (m), _m (m), _n (n)
+		{}
+
+		SparseMatrixGeneric (const Field & F) :
+			_field (F),
+			_MD(F),_AT(*this),
+			_matA(0), _m(0), _n(0)
+		{};
+
+
+		SparseMatrixGeneric (const SparseMatrixGeneric<Field, Row> &A) :
+			_field(A.field()),
+			_MD(A.field()),_AT(*this),
+			_matA (A._matA), _m (A._m), _n (A._n)
+		{}
+
+		template<class VectorType>
+		SparseMatrixGeneric (const SparseMatrixGeneric<Field, VectorType> &A) :
+			_field(A.field()),
+			_MD(A.field()),_AT(*this),
+			_matA(A.rowdim()), _m (A.rowdim()), _n (A.coldim())
+		{
+			typename Rep::iterator meit = this->_matA.begin();
+			typename SparseMatrixGeneric<Field, VectorType>::Rep::const_iterator copit = A._matA.begin();
+			for( ; meit != this->_matA.end(); ++meit, ++copit)
+				LinBox::RawVector<Element>::convert(*meit, *copit);
+		}
+
+		/** Constructor from a MatrixStream
+		*/
+		SparseMatrixGeneric ( MatrixStream<Field>& ms );
+
+		template<class VectStream>
+		SparseMatrixGeneric (const Field &F, VectStream &stream) :
+			_field (F), _MD (F), _AT (*this)
+			, _matA (stream.size()), _m (stream.size()), _n (stream.dim())
+		{
+			typename Self_t::RowIterator i;
+
+			for (i = Self_t::rowBegin (); i != Self_t::rowEnd (); ++i)
+				stream >> *i;
+		}
+
+		~SparseMatrixGeneric () {}
+
+		size_t rowdim () const
+		{
+			return _m;
+		}
+
+		size_t coldim () const
+		{
+			return _n;
+		}
+
+		size_t size () const
+		{
+			size_t s(0);
+			for(typename Rep::const_iterator it = _matA.begin(); it != _matA.end(); ++it)
+				s+= LinBox::RawVector<Element>::size(*it);
+			return s;
+		}
+
+		std::istream &read (std::istream &is
+				    , LINBOX_enum(Tag::FileFormat) format  = Tag::FileFormat::Detect)
+		{
+			return SparseMatrixReadHelper<Self_t>::read (*this, is
+									      , format);
+		}
+
+
+		std::ostream &write (std::ostream &os
+				     , LINBOX_enum(Tag::FileFormat) format   = Tag::FileFormat::MatrixMarket) const
+		{
+			return SparseMatrixWriteHelper<Self_t>::write (*this, os, format);
+		}
+
+		void appendEntry(size_t i, size_t j, const Element & value) { setEntry(i,j,value) ;}
+		void finalize(){}
+
+		void  setEntry (size_t i, size_t j, const Element &value)
+		{
+			_matA[i][j] = value;
+		}
+
+		Element  &refEntry (size_t i, size_t j)
+		{
+			return _matA[i][j];
+		}
+
+		const Element &getEntry (size_t i, size_t j) const;
+
+		Element       &getEntry (Element &x, size_t i, size_t j) const
+		{
+			return x = _matA[i][j];
+		}
+
+		typedef typename Rep::iterator RowIterator;
+		typedef typename Rep::const_iterator ConstRowIterator;
+
+		ConstRowIterator rowBegin () const
+		{
+			return _matA.begin ();
+		}
+
+		ConstRowIterator rowEnd () const
+		{
+			return _matA.end ();
+		}
+
+		RowIterator rowBegin ()
+		{
+			return _matA.begin ();
+		}
+
+		RowIterator rowEnd ()
+		{
+			return _matA.end ();
+		}
+
+		template <class RepIterator, class RowEltIterator, class _I_Element>
+		class _Iterator {
+		public:
+			typedef _I_Element value_type;
+
+			_Iterator (const RepIterator &i, const RowEltIterator &j, const RepIterator &A_end) :
+				_i (i), _j (j), _A_end (A_end)
+			{
+				if( _i == _A_end ) return;
+				while( _j == _i->end() ) {
+					if( ++_i == _A_end ) return;
+					_j = _i->begin();
+				}
+			}
+
+			_Iterator (const _Iterator &iter) :
+				_i (iter._i), _j (iter._j), _A_end (iter._A_end)
+			{}
+
+			_Iterator () {}
+
+			_Iterator &operator = (const _Iterator &iter)
+			{
+				_i = iter._i;
+				_j = iter._j;
+				_A_end = iter._A_end;
+
+				return *this;
+			}
+
+			bool operator == (const _Iterator &i) const
+			{
+				return (_i == i._i) && (_j == i._j);
+			}
+
+			bool operator != (const _Iterator &i) const
+			{
+				return (_i != i._i) || (_j != i._j);
+			}
+
+			_Iterator &operator ++ ()
+			{
+				while (++_j == _i->end ()) {
+					if (++_i == _A_end ()) return *this;
+					_j = _i->begin ();
+				}
+				return *this;
+			}
+
+			_Iterator operator ++ (int)
+			{
+				_Iterator tmp = *this;
+				++(*this);
+				return tmp;
+			}
+
+			_Iterator &operator -- ()
+			{
+				while (_j == _i->begin ())
+					_j = (--_i)->end ();
+				--_j;
+				return *this;
+			}
+
+			_Iterator operator -- (int)
+			{
+				_Iterator tmp = *this;
+				--(*this);
+				return tmp;
+			}
+
+			value_type &operator * ()
+			{
+				return _j->second;
+			}
+
+			value_type *operator -> ()
+			{
+				return &(_j->second);
+			}
+
+		private:
+			RepIterator _i;
+			RowEltIterator _j;
+			RepIterator _A_end;
+		};
+
+		typedef _Iterator<typename Rep::iterator, typename Row::iterator, Element> Iterator;
+		typedef _Iterator<typename Rep::const_iterator, typename Row::const_iterator, const Element> ConstIterator;
+
+		Iterator Begin ()
+		{
+			return Iterator (_matA.begin (), _matA.front ().begin (), _matA.end ());
+		}
+		Iterator End ()
+		{
+			return Iterator (_matA.end (), _matA.back ().end (), _matA.end ());
+		}
+		ConstIterator Begin () const
+		{
+			return ConstIterator (_matA.begin (), _matA.front ().begin (), _matA.end ());
+		}
+		ConstIterator End () const
+		{
+			return ConstIterator (_matA.end (), _matA.back ().end (), _matA.end ());
+		}
+
+		//! no doc
+		template <class RepIterator, class RowIdxIterator, class _I_Element>
+		class _IndexedIterator {
+		public:
+			// typedef std::pair<size_t, size_t> value_type;
+			typedef _I_Element value_type;
+
+			_IndexedIterator (size_t idx, const RepIterator &i, const RowIdxIterator &j, const RepIterator &A_end) :
+				_i (i), _j (j), _A_end (A_end), _r_index (idx), _c_index (0)
+			{
+				if( _i == _A_end ) return;
+				while( _j == _i->end() ) {
+					++_r_index;
+					if( ++_i == _A_end ) return;
+					_j = _i->begin();
+				}
+				_c_index = _j->first;
+			}
+
+			_IndexedIterator (const _IndexedIterator &iter) :
+				_i (iter._i), _j (iter._j), _A_end (iter._A_end), _r_index (iter._r_index), _c_index (iter._c_index)
+			{}
+
+			_IndexedIterator ()
+			{}
+
+			_IndexedIterator &operator = (const _IndexedIterator &iter)
+			{
+				_A_end = iter._A_end;
+				_i = iter._i;
+				_j = iter._j;
+				_r_index = iter._r_index;
+				_c_index = iter._c_index;
+
+				return *this;
+			}
+
+			bool operator == (const _IndexedIterator &i) const
+			{
+				return (_i == i._i) && (_j == i._j);
+			}
+
+			bool operator != (const _IndexedIterator &i) const
+			{
+				return (_i != i._i) || (_j != i._j);
+			}
+
+			_IndexedIterator &operator ++ ()
+			{
+				++_j;
+				while (_j == _i->end ()) {
+					++_r_index;
+					if (++_i == _A_end ) return *this;
+					_j = _i->begin ();
+				}
+
+				_c_index = _j->first;
+
+				return *this;
+			}
+
+			_IndexedIterator operator ++ (int)
+			{
+				_IndexedIterator tmp = *this;
+				++(*this);
+				return tmp;
+			}
+
+			_IndexedIterator &operator -- ()
+			{
+				while (_j == _i->begin ()) {
+					_j = (--_i)->end ();
+					--_r_index;
+				}
+
+				--_j;
+				_c_index = _j->second;
+				return *this;
+			}
+
+			_IndexedIterator operator -- (int)
+			{
+				_IndexedIterator tmp = *this;
+				--(*this);
+				return tmp;
+			}
+
+			value_type &operator * ()
+			{
+				return _j->second;
+			}
+			const value_type &operator * () const
+			{
+				return _j->second;
+			}
+			value_type *operator -> ()
+			{
+				return &(_j->second);
+			}
+			const value_type *operator -> () const
+			{
+				return &(_j->second);
+			}
+
+			size_t rowIndex () const
+			{
+				return _r_index;
+			}
+			size_t colIndex () const
+			{
+				return _c_index;
+			}
+			const value_type &value() const
+			{
+				return _j->second;
+			}
+
+		private:
+			RepIterator _i;
+			RowIdxIterator _j;
+			RepIterator _A_end;
+
+			mutable size_t _r_index;
+			mutable size_t _c_index;
+		};
+
+		typedef _IndexedIterator<typename Rep::iterator, typename Row::iterator, Element> IndexedIterator;
+		typedef _IndexedIterator<typename Rep::const_iterator, typename Row::const_iterator, Element> ConstIndexedIterator;
+
+		IndexedIterator IndexedBegin ()
+		{
+			return IndexedIterator (0, _matA.begin (), _matA.front ().begin (), _matA.end ());
+		}
+		IndexedIterator IndexedEnd ()
+		{
+			return IndexedIterator (_m, _matA.end (), _matA.back ().end (), _matA.end ());
+		}
+		ConstIndexedIterator IndexedBegin () const
+		{
+			return ConstIndexedIterator (0, _matA.begin (), _matA.front ().begin (), _matA.end ());
+		}
+		ConstIndexedIterator IndexedEnd () const
+		{
+			return ConstIndexedIterator (_m, _matA.end (), _matA.back ().end (), _matA.end ());
+		}
+
+		Row &getRow (size_t i) {
+			return _matA[i];
+		}
+		Row &operator [] (size_t i) {
+			return _matA[i];
+		}
+		ConstRow &operator [] (size_t i) const
+		{
+			return _matA[i];
+		}
+
+		template <class Vector> Vector &columnDensity (Vector &v) const;
+		SparseMatrixGeneric &transpose (SparseMatrixGeneric &AT) const;
+
+		const Field & field() const
+		{
+			return _field ;
+		}
+		/** Matrix-vector product
+		 * \f$y = A x\f$.
+		 * @return reference to output vector y
+		 * @param  x input vector
+		 * @param y
+		 */
+		template <class OutVector, class InVector>
+		OutVector &apply (OutVector &y, const InVector &x) const
+		{
+#ifdef __LINBOX_PARALLEL
+			return BlackboxParallel (y, *this, x, BBBase::Apply);
+#else
+			return _MD.vectorMul (y, *this, x);
+#endif
+		}
+
+		/** Transpose matrix-vector product
+		 * \f$ y = A^T x\f$.
+		 * @return reference to output vector y
+		 * @param  x input vector
+		 * @param y
+		 */
+		template <class OutVector, class InVector>
+		OutVector &applyTranspose (OutVector& y, const InVector &x) const
+		{
+#ifdef __LINBOX_PARALLEL
+			return BlackboxParallel (y, *this, x, BBBase::ApplyTranspose);
+#else
+			return _MD.vectorMul (y, _AT, x);
+#endif
+		}
+
+		const Rep & getRep() const
+		{
+			return _matA;
+		}
+
+		Rep & refRep()
+		{
+			return _matA;
+		}
+
+		void resize( const size_t & m, const size_t & n, const size_t & z = 0)
+		{
+			_m = m ;
+			_n = n ;
+			_matA.clear();
+			_matA.resize(m);
+
+		}
+
+
+	protected:
+
+		friend class SparseMatrixWriteHelper<Self_t>;
+		friend class SparseMatrixReadHelper<Self_t>;
+
+		const Field & _field;
+
+		MatrixDomain<Field>       _MD; // Matrix domain for matrix operations
+		TransposeMatrix<SparseMatrixGeneric<_Field, _Row> > _AT;
+		Rep               _matA;
+		size_t            _m;
+		size_t            _n;
+
+		// template<class F, class R, class T> friend class SparseMatrix;
+	};
+
+} // namespace Protected
+} // namespace LinBox
+
+#include "linbox/matrix/sparsematrix/sparse-associative-vector.inl"
+
+namespace LinBox
+{ /*  SparseMatrix for SparseMatrixFormat::SparseMap */
+
+	template <class _Field /*, class _Row */  >
+	class SparseMatrix<_Field, SparseMatrixFormat::SparseMap/* <_Row> */ > : public Protected::SparseMatrixGeneric<_Field,/*  _Row */ typename Vector<_Field>::SparseMap,VectorCategories::SparseAssociativeVectorTag> {
+	public:
+		typedef VectorCategories::SparseAssociativeVectorTag  myTrait ;
+		typedef _Field                                       Field ; //!< Field
+		typedef typename _Field::Element                   Element ; //!< Element
+		typedef const Element                         constElement ; //!< const Element
+		typedef typename Vector<_Field>::SparseMap             Row ;
+		typedef SparseMatrixFormat::SparseMap              Storage ; //!< Matrix Storage Format
+		typedef SparseMatrix<_Field,Storage>               Self_t ; //!< Self type
+		typedef Protected::SparseMatrixGeneric<_Field,Row,myTrait >         Father_t ;
+
+	public:
+		template<class VectStream>
+		SparseMatrix (const Field &F, VectStream &stream) :
+			Father_t(F,stream)
+		{}
+
+		SparseMatrix(const Field & F, size_t m, size_t n) :
+			Father_t(F, m, n)
+		{}
+
+		SparseMatrix(const Field & F) :
+			Father_t(F)
+		{}
+
+		SparseMatrix ( MatrixStream<Field>& ms ) :
+			Father_t(ms)
+		{}
+
+		template<class _Tp1, class _Storage>
+		SparseMatrix(const SparseMatrix<_Tp1,_Storage> & Mat, const Field & F) :
+			Father_t(F, Mat.rowdim(), Mat.coldim())
+		{
+			typename SparseMatrix<_Tp1,_Storage>::template rebind<Field,Storage>()(*this, Mat);
+
+		}
+
+
+
+		// using Father_t::RowIterator;
+
+		template<typename _Tp1, typename _R1 = SparseMatrixFormat::SparseMap >
+		struct rebind {
+			typedef SparseMatrix<_Tp1, _R1> other;
+
+			void operator() (other & Ap, const Self_t& A) {
+
+				typename _Tp1::Element e;
+
+				Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+				for( typename Self_t::ConstIndexedIterator
+				     indices = A.IndexedBegin();
+				     (indices != A.IndexedEnd()) ;
+				     ++indices ) {
+					hom. image (e, indices.value() );
+					if (!Ap.field().isZero(e))
+						Ap.setEntry (indices.rowIndex(),
+							     indices.colIndex(), e);
+				}
+			}
+
+		};
+
+
+	} ; // SparseMatrix
+
+
+
+} // namespace LinBox
+
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_associative_vector_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-associative-vector.inl b/linbox/matrix/sparsematrix/sparse-associative-vector.inl
new file mode 100644
index 0000000..2a4e17f
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-associative-vector.inl
@@ -0,0 +1,139 @@
+/* linbox/matrix/sparse.inl
+ * Copyright (C) 2001-2002 Bradford Hovinen
+ *               1999-2001 William J Turner,
+ *
+ * Written by Bradford Hovinen <hovinen at cis.udel.edu>
+ * Based on sparse-base.h by William J Turner <wjturner at math.ncsu.edu>
+ *
+ * --------------------------------------------------------
+ * 2003-01-11  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
+ *
+ * Move from blackbox/sparse-base.inl to matrix/sparse.inl
+ * ------------------------------------
+ * 2002-11-28  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
+ *
+ *   - Renamed ColOfRowsIterator to RowIterator
+ *   - Named template argument _Row rather than Row; add a typedef to Row
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_matrix_sparse_associative_INL
+#define __LINBOX_matrix_sparse_associative_INL
+
+namespace LinBox { namespace Protected {
+
+	template <class Field, class Row>
+	SparseMatrixGeneric<Field,Row,VectorCategories::SparseAssociativeVectorTag> ::SparseMatrixGeneric( MatrixStream<Field>& ms ) :
+		_field(ms.field()),
+		_MD(ms.field()),_AT(*this),
+		_matA(0), _m(0), _n(0)
+	{
+		Element val;
+		size_t i, j;
+		while( ms.nextTriple(i,j,val) ) {
+			if( i >= _m ) {
+				_m = i + 1;
+				_matA.resize( _m );
+			}
+			if( j >= _n ) _n = j + 1;
+			setEntry(i,j,val);
+		}
+		if( ms.getError() > END_OF_MATRIX )
+			throw ms.reportError(__func__,__LINE__);
+		if( !ms.getDimensions( i, _n ) )
+			throw ms.reportError(__func__,__LINE__);
+		if( i > _m ) {
+			_m = i;
+			_matA.resize(_m);
+		}
+	}
+
+
+	template <class Field, class Row>
+	const typename Field::Element &SparseMatrixGeneric<Field, Row, VectorCategories::SparseAssociativeVectorTag > ::getEntry (size_t i, size_t j) const
+	{
+
+		const Row &v = _matA[i];
+		typename Row::const_iterator iter;
+
+		if (v.size () == 0)
+			return field().zero;
+		else {
+			iter = v.find (j);
+
+			if (iter == v.end () || iter->first != j)
+				return field().zero;
+			else
+				return iter->second;
+		}
+	}
+
+
+	template <class Field, class Row>
+	template <class Vector>
+	Vector &SparseMatrixGeneric<Field, Row, VectorCategories::SparseAssociativeVectorTag >::columnDensity (Vector &v) const
+	{
+		unsigned int row = 0;
+
+		for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
+			typename Row::const_iterator j = i.begin ();
+
+			for (; j != i->begin (); ++j)
+				++v[j->first];
+		}
+
+		return v;
+	}
+
+
+	template <class Field, class Row>
+	SparseMatrixGeneric<Field, Row, VectorCategories::SparseAssociativeVectorTag >
+	&SparseMatrixGeneric<Field, Row, VectorCategories::SparseAssociativeVectorTag >::transpose (SparseMatrixGeneric &AT) const
+	{
+		unsigned int row = 0;
+
+		for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
+			typename Row::const_iterator j = i.begin ();
+
+			for (; j != i->begin (); ++j)
+				AT._matA[j->first][row] = j->second;
+		}
+
+		return AT;
+	}
+
+
+} // namespace Protected
+} // namespace LinBox
+
+#endif // __LINBOX_matrix_sparse_INL
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/matrix/sparsematrix/sparse-coo-implicit-matrix.h b/linbox/matrix/sparsematrix/sparse-coo-implicit-matrix.h
new file mode 100644
index 0000000..ecc799b
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-coo-implicit-matrix.h
@@ -0,0 +1,977 @@
+/* linbox/matrix/sparse-csr-matrix.h
+ * Copyright (C) 2013 the LinBox
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/sparsematrix/sparse-coo-implicit-matrix.h
+ * @ingroup sparsematrix
+ * @brief
+ */
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_coo_implicit_matrix_H
+#define __LINBOX_matrix_sparsematrix_sparse_coo_implicit_matrix_H
+
+#include <utility>
+#include <iostream>
+#include <algorithm>
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "sparse-domain.h"
+
+
+namespace LinBox
+{
+
+	/** Sparse matrix, Coordinate storage.
+	 *
+	 * \ingroup matrix
+	 * \ingroup sparse
+	 */
+	template<class _Field>
+	class SparseMatrix<_Field, SparseMatrixFormat::COO::implicit> {
+	public :
+		typedef _Field                                 Field ; //!< Field
+		typedef typename _Field::Element             Element ; //!< Element
+		typedef const Element                   constElement ; //!< const Element
+		typedef SparseMatrixFormat::COO::implicit   Storage ; //!< Matrix Storage Format
+		typedef SparseMatrix<_Field,Storage>         Self_t ; //!< Self type
+
+		/*! Constructors.
+		 * @todo convert from other matrix.
+		 *
+		 */
+		//@{
+		SparseMatrix<_Field, SparseMatrixFormat::COO::implicit> () :
+			_rownb(0),_colnb(0),
+			_nbnz(0),
+			_rowid(0),_colid(0)
+			, _field()
+		{
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::COO::implicit> (const _Field & F) :
+			_rownb(0),_colnb(0),
+			_nbnz(0),
+			_rowid(0),_colid(0),_data(F.zero)
+			, _field(F)
+		{
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::COO::implicit> (const _Field & F, size_t m, size_t n) :
+			_rownb(m),_colnb(n),
+			_nbnz(0),
+			_rowid(0),_colid(0),_data(F.zero)
+			, _field(F)
+		{
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::COO::implicit> (const _Field & F,
+							       size_t m, size_t n,
+							       size_t z) :
+			_rownb(m),_colnb(n),
+			_nbnz(z),
+			_rowid(z),_colid(z),_data(F.zero),
+			_field(F)
+		{
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::COO::implicit> (const SparseMatrix<_Field, SparseMatrixFormat::COO::implicit> & S) :
+			_rownb(S._rownb),_colnb(S._colnb),
+			_nbnz(S._nbnz),
+			_rowid(S._rowid),_colid(S._colid),_data(S._data),
+			_field(S._field)
+		{}
+
+#if 0
+		template<class _OtherField>
+		SparseMatrix<_Field, SparseMatrixFormat::COO::implicit> (const SparseMatrix<_OtherField, SparseMatrixFormat::COO::implicit> & S) :
+			_rownb(S._rownb),_colnb(S._colnb),
+			_nbnz(S._nbnz),
+			_rowid(S._rowid),_colid(S._colid),_data(S._data),
+			_field(S._field)
+		{}
+#endif
+
+		// XXX only for COO::implicit
+		template<typename _Tp1, typename _Rw1 = SparseMatrixFormat::COO::implicit>
+		struct rebind ;
+
+		template<typename _Tp1>
+		struct rebind<_Tp1/*  ,SparseMatrixFormat::COO::implicit */ > {
+			typedef SparseMatrix<_Tp1, SparseMatrixFormat::COO::implicit> other;
+
+			void operator() (other & Ap, const Self_t& A)
+			{
+				// Ap = new other(F, A.rowdim(), A.coldim());
+
+				typename _Tp1::Element e;
+
+				Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+				hom. image ( e, A.getData() );
+				if (!Ap.field().isZero(e)) {
+					Ap.setData(e);
+				}
+			}
+		};
+
+		template<typename _Tp1, typename _Rw1>
+		SparseMatrix (const SparseMatrix<_Tp1, _Rw1> &S, const Field& F) :
+			_rownb(S.rowdim()),_colnb(S.coldim()),
+			_nbnz(S.size()),
+			_rowid(S.size()),_colid(S.size()),_data(S.size()),
+			_field(F)
+		{
+			typename SparseMatrix<_Tp1,_Rw1>::template rebind<Field,SparseMatrixFormat::COO::implicit>()(*this, S);
+		}
+
+
+
+#if  0
+
+		template<class VectStream>
+		SparseMatrix<_Field, SparseMatrixFormat::COO::implicit> (const _Field & F, VectStream & stream) :
+			_rownb(stream.size()),_colnb(stream.dim()),
+			_rowid(0),_colid(0),_data(F.zero)
+			, _nbnz(0)
+			, _field(F)
+		{
+			// VectStream == RandomSparseStream<Field, typename Vector<Field>::SparseSeq>
+			{
+
+			}
+			for (size_t i = 0 ; i< _rownb ; ++i) {
+				typename Vector<Field>::SparseSeq lig_i ;
+				stream >> lig_i ;
+				for (size_t j = 0 ; j < lig_i.size() ; ++j) {
+					size_t nbnz = _nbnz++ ;
+					resize(_nbnz);
+					_rowid[nbnz] = i ;
+					_colid[nbnz] = lig_i[j].first ;
+					F.init(_data[nbnz], lig_i[j].second) ; //!@bug may be 0...
+				}
+			}
+		}
+#endif
+
+
+		void resize(size_t nn)
+		{
+#ifndef NDEBUG
+			if (nn < _nbnz) {
+				std::cerr << "*** Warning *** you are possibly loosing data (COO::implicit resize)" << std::endl;
+				// could be a commentator()...
+			}
+#endif
+			_rowid.resize(nn);
+			_colid.resize(nn);
+			_nbnz = nn ;
+		}
+
+		void resize(const size_t & mm, const size_t & nn, const size_t & zz)
+		{
+			_rownb = mm ;
+			_colnb = nn ;
+			_nbnz = zz;
+
+			_rowid.resize(zz);
+			_colid.resize(zz);
+		}
+
+		/*! Default converter.
+		 * @param S a sparse matrix in any storage.
+		 */
+		template<class _OtherStorage>
+		SparseMatrix<_Field, SparseMatrixFormat::COO::implicit> (const SparseMatrix<_Field, _OtherStorage> & S) :
+			_rownb(S._rownb),_colnb(S._colnb),
+			_rowid(S.size()),_colid(S.size()),_data(S.size()),
+			_field(S._field)
+		{
+			SparseMatrix<_Field,SparseMatrixFormat::CSR> Temp(_field,_rownb,_colnb) ;
+			S.exporte(Temp); // convert S to CSR
+			this->importe(Temp); // convert Temp from COO::implicit
+		}
+
+
+		//@}
+		/*! Conversions.
+		 * Any sparse matrix has a converter to/from CSR.
+		 * A specialisation can skip the temporary CSR matrix created.
+		 */
+		//@{
+		/*! Import a matrix in CSR format to COO::implicit.
+		 * @param S CSR matrix to be converted in COO::implicit
+		 */
+		void importe(const SparseMatrix<_Field,SparseMatrixFormat::CSR> &S)
+		{
+			resize( S.rowdim() , S.coldim() , S.size() );
+			_colid = S.getColid();
+			_data = S.getData();
+			for (size_t i = 0 ; i < _rownb ; ++i)
+				for (size_t j = S.getStart(i) ; j < S.getEnd(i); ++j)
+					_rowid[j] = i ;
+
+		}
+
+		void importe(const SparseMatrix<_Field,SparseMatrixFormat::COO::implicit> &S)
+		{
+			resize( S.rowdim(), S.coldim(), S.size() );
+
+			setRowid(S.getRowid());
+			setColid(S.getColid());
+			setData(S.getData());
+		}
+
+		/*! Export a matrix in CSR format from COO::implicit.
+		 * @param S CSR matrix to be converted from COO::implicit
+		 */
+		SparseMatrix<_Field,SparseMatrixFormat::CSR > &
+		exporte(SparseMatrix<_Field,SparseMatrixFormat::CSR> &S)
+		{
+			S.resize(_rownb,_colnb,_nbnz) ;
+			S.setData( _data ) ;
+			S.setColid (_colid );
+
+			for(size_t i = 0 ; i <= _rownb ; ++i)
+				S.setStart(i,0);
+
+			for (size_t i = 0 ; i < _nbnz ; ++i) {
+				size_t idx = _rowid[i]+1 ;
+				S.setStart(idx,S.getStart(idx) + 1) ;
+			}
+			for (size_t i= 0 ; i < _rownb ; ++i)
+				S.setStart(i+1, S.getEnd(i)+ S.getStart(i)) ;
+
+			return S ;
+		}
+
+		SparseMatrix<_Field,SparseMatrixFormat::COO::implicit > &
+		exporte(SparseMatrix<_Field,SparseMatrixFormat::COO::implicit> &S)
+		{
+			S.resize(_rownb,_colnb,_nbnz) ;
+			S.setData( _data ) ;
+			S.setColid( _colid ) ;
+			S.setRowid( _rowid ) ;
+		}
+
+		//@}
+
+		/*! In place transpose. Not quite...
+		*/
+		void transposeIn()
+		{
+			// SparseMatrix<_Field,SparseMatrixFormat::CSR> Temp(*this);
+			SparseMatrix<_Field,SparseMatrixFormat::COO::implicit> Temp(*this);
+			Temp.transposeIn();
+			importe(Temp);
+		}
+
+		/*! Transpose the matrix.
+		 *  @param S [out] transpose of self.
+		 *  @return a reference to \p S.
+		 */
+		SparseMatrix<_Field,SparseMatrixFormat::COO::implicit> &
+		transpose(SparseMatrix<_Field,SparseMatrixFormat::COO::implicit> &S)
+		{
+			linbox_check(S.rowdim() == _colnb);
+			linbox_check(S.coldim() == _rownb);
+
+			// outStart
+			std::vector<size_t> start (_colnb+1,0);
+			for (size_t i = 0 ; i < size() ; ++i)
+				start[_colid[i]+1] += 1 ;
+			for (size_t i = 0 ; i < _colnb ; ++i)
+				start[i+1] += start[i] ;
+			// inStart;
+			std::vector<size_t> _start (_rownb+1,0);
+			for (size_t i = 0 ; i < size() ; ++i)
+				_start[_rowid[i]+1] += 1 ;
+			for (size_t i = 0 ; i < _rownb ; ++i)
+				_start[i+1] += _start[i] ;
+
+			{
+				size_t i = 0 ;
+				std::vector<size_t> done_col(_colnb,0);
+				for (size_t nextlig = 1 ; nextlig <= _rownb ; ++nextlig) {
+					// treating line before nextlig
+					while (i < _start[nextlig]){
+					size_t cur_place ;
+						cur_place = start[_colid[i]] + done_col[_colid[i]] ;
+						S._data[ cur_place ]  = _data[i] ;
+						S._colid[ cur_place ] = nextlig-1 ;
+						done_col[_colid[i]] += 1 ;
+						++i;
+					}
+				}
+			}
+
+			std::swap(_rownb,_colnb);
+			for (size_t i = 0 ; i < _rownb ; ++i)
+				for (size_t j = start[i] ; j < start[i+1]; ++j)
+					S._rowid[j] = i ;
+		}
+
+		/*! number of rows.
+		 * @return row dimension.
+		 */
+		size_t rowdim() const
+		{
+			return _rownb ;
+		}
+
+		/*! number of columns.
+		 * @return column dimension
+		 */
+		size_t coldim() const
+		{
+			return _colnb ;
+		}
+
+		/*! Number of non zero elements in the matrix.
+		 * or at least the size of the _data if
+		 * @return size of the _data.
+		 */
+		size_t size() const
+		{
+			// return _data.size();
+			return _nbnz ;
+		}
+
+		/** Get a read-only individual entry from the matrix.
+		 * @param i Row _colid
+		 * @param j Column _colid
+		 * @return Const reference to matrix entry
+		 */
+		constElement &getEntry(const size_t &i, const size_t &j) const
+		{
+			// std::cout << "get entry : " << i << ',' << j << std::endl;
+			linbox_check(i<_rownb);
+			linbox_check(j<_colnb);
+			// Could be improved by adding an initial guess j/rodim*size()
+			// typedef typename std::vector<size_t>::iterator myIterator ;
+			typedef typename std::vector<size_t>::const_iterator myConstIterator ;
+
+			std::pair<myConstIterator,myConstIterator> bounds = std::equal_range (_rowid.begin(), _rowid.end(), i);
+			size_t ibeg = (size_t)(bounds.first-_rowid.begin());
+			size_t iend = (size_t)(bounds.second-_rowid.begin())-ibeg;
+			if (!iend) {
+				return field().zero;
+			}
+
+			myConstIterator beg = _colid.begin()+(ptrdiff_t)ibeg ;
+			myConstIterator low = std::lower_bound (beg, beg+(ptrdiff_t)iend, j);
+			if (low == beg+(ptrdiff_t)iend) {
+				return field().zero;
+			}
+			else {
+				// not sure
+				size_t la = (size_t)(low-_colid.begin()) ;
+				return _data[la] ;
+			}
+		}
+
+		Element      &getEntry (Element &x, size_t i, size_t j) const
+		{
+			return x = getEntry (i, j);
+		}
+
+		/** Set an individual entry.
+		 * Setting the entry to 0 will not remove it from the matrix
+		 * @param i Row _colid of entry
+		 * @param j Column _colid of entry
+		 * @param value Value of the new entry
+		 * @todo make it faster if i is 0 or m-1 ?
+		 */
+		void setEntry(const size_t &i, const size_t &j, const Element& e)
+		{
+	linbox_check(i<_rownb);
+			linbox_check(j<_colnb);
+
+			if (field().isZero(e)) {
+				return clearEntry(i,j);
+			}
+			typedef typename std::vector<size_t>::iterator myIterator ;
+			std::pair<myIterator,myIterator> bounds = std::equal_range (_rowid.begin(), _rowid.end(), i);
+			size_t ibeg = bounds.first-_rowid.begin();
+			size_t iend = (bounds.second-_rowid.begin())-ibeg;
+			if (!iend) {
+				_rowid.insert(_rowid.begin()+ibeg,i);
+				_colid.insert(_colid.begin()+ibeg,j);
+				_data.insert( _data.begin() +ibeg,e);
+				return ;
+			}
+			myIterator beg = _colid.begin()+(ptrdiff_t)ibeg ;
+			myIterator low = std::lower_bound (beg, beg+(ptrdiff_t)iend, j);
+			ibeg = low-_colid.begin();
+			if (low == beg+(ptrdiff_t)iend) {
+				_rowid.insert(_rowid.begin()+(ptrdiff_t)ibeg,i);
+				_colid.insert(_colid.begin() +(ptrdiff_t)ibeg,j);
+				_data.insert( _data. begin() +(ptrdiff_t)ibeg,e);
+				return ;
+			}
+			else {
+				_data[ibeg] = e ;
+				return ;
+			}
+		}
+
+
+		/** Get a writeable reference to an entry in the matrix.
+		 * If there is no entry at the position (i, j), then a new entry
+		 * with a value of zero is inserted and a reference  to it is
+		 * returned.
+		 * @param i Row _colid of entry
+		 * @param j Column _colid of entry
+		 * @return Reference to matrix entry
+		 */
+		Element &refEntry(const size_t &i, const size_t&j)
+		{
+			linbox_check(i<_rownb);
+			linbox_check(j<_colnb);
+			// Could be improved by adding an initial guess j/rodim*size()
+			typedef typename std::vector<size_t>::iterator myIterator ;
+
+			std::pair<myIterator,myIterator> bounds = std::equal_range (_rowid.begin(), _rowid.end(), i);
+			size_t ibeg = bounds.first-_rowid.begin();
+			size_t iend = (bounds.second-_rowid.begin())-ibeg;
+			if (!iend) {
+				_rowid.insert(_rowid.begin()+ibeg,i);
+				_colid.insert(_colid.begin()+ibeg,j);
+				_data.insert( _data.begin() +ibeg,field().zero);
+				return _data[ibeg];
+			}
+			myIterator beg = _colid.begin()+ibeg ;
+			myIterator low = std::lower_bound (beg, beg+(ptrdiff_t)iend, j);
+			if (low == beg+(ptrdiff_t)iend) {
+				_rowid.insert(_rowid.begin()+ibeg,i);
+				_colid.insert(_colid.begin()+ibeg,j);
+				_data.insert( _data.begin() +ibeg,field().zero);
+				return _data[ibeg];
+			}
+			else {
+				size_t la = low-_colid.begin() ;
+				return _data[la] ;
+			}
+		}
+
+		/** Write a matrix to the given output stream using field read/write.
+		 * @param os Output stream to which to write the matrix
+		 * @param format Format with which to write
+		 */
+		template<class Format>
+		std::ostream & write(std::ostream &os,
+				     Format = SparseFileFormat::CSR()) const
+		{
+			return this->writeSpecialized(os,Format());
+		}
+
+		std::ostream & write(std::ostream &os,
+				     enum LINBOX_enum(Tag::FileFormat) ff  = Tag::FileFormat::Maple) const
+		{
+			return this->writeSpecialized(os,ff);
+		}
+
+
+		/** Read a matrix from the given input stream using field read/write
+		 * @param file Input stream from which to read the matrix
+		 * @param format Format of input matrix
+		 * @return ref to \p file.
+		 */
+		template<class Format>
+		std::istream& read (std::istream &file,
+				    Format = SparseFileFormat::CSR())
+		{
+			return readSpecialized(file,Format());
+		}
+
+		/*! @internal
+		 * @brief Deletes the entry.
+		 * Deletes \c A(i,j) if it exists.
+		 * @param i row _colid
+		 * @param j col _colid
+		 */
+		void clearEntry(const size_t &i, const size_t &j)
+		{
+			linbox_check(i<_rownb);
+			linbox_check(j<_colnb);
+			// Could be improved by adding an initial guess j/rodim*size()
+			typedef typename std::vector<size_t>::iterator myIterator ;
+
+			std::pair<myIterator,myIterator> bounds = std::equal_range (_rowid.begin(), _rowid.end(), i);
+			size_t ibeg = bounds.first-_rowid.begin();
+			size_t iend = (bounds.second-_rowid.begin())-ibeg;
+			if (!iend)
+				return ;
+
+			myIterator beg = _colid.begin()+ibeg ;
+			myIterator low = std::lower_bound (beg, beg+(ptrdiff_t)iend, j);
+			if (low == beg+(ptrdiff_t)iend)
+				return ;
+			else {
+				// not sure
+				size_t la = low-_colid.begin() ;
+				_rowid.erase(_rowid.begin()+la);
+				_colid.erase(_colid.begin()+la);
+				_data. erase(_data. begin()+la);
+				return  ;
+			}
+		}
+
+		/*! @internal
+		 * @brief cleans 0 entries.
+		 */
+		void clean()
+		{
+			size_t i = 0 ;
+			while ( i < _data.size() ) {
+				if ( field().isZero(_data[i]) ) {
+					_rowid.erase(_rowid.begin()+i);
+					_colid.erase(_colid.begin()+i);
+					_data. erase(_data. begin()+i);
+				}
+				else
+					++i ;
+			}
+			return ;
+		}
+
+		// y = A x + a * y ;
+		template<class Vector>
+		Vector& apply(Vector &y, const Vector& x, const Element & a ) const
+		{
+
+			prepare(field(),y,a);
+
+			for (size_t i = 0 ; i < _nbnz ; ++i)
+				field().axpyin( y[_rowid[i]], _data[i], x[_colid[i]] ); //!@bug may be 0...
+
+			return y;
+		}
+
+			class Helper ; // transpose
+
+		template<class Vector>
+		Vector& applyTranspose(Vector &y, const Vector& x, const Element & a ) const
+		{
+			prepare(field(),y,a);
+
+			for (size_t i = 0 ; i < _nbnz ; ++i)
+				field().axpyin( y[_colid[i]], _data[i], x[_rowid[i]] );
+
+			return y;
+		}
+
+		template<class Vector>
+		Vector& apply(Vector &y, const Vector& x ) const
+		{
+			return apply(y,x,field().zero);
+		}
+		template<class Vector>
+		Vector& applyTranspose(Vector &y, const Vector& x ) const
+		{
+			return apply(y,x,field().zero);
+		}
+
+
+
+		const Field & field()  const
+		{
+			return _field ;
+		}
+
+		//! @todo
+		bool consistent() const
+		{
+			return true ;
+		}
+
+	private :
+
+		std::ostream & writeSpecialized(std::ostream &os,
+						LINBOX_enum(Tag::FileFormat) format) const
+		{
+			switch (format) {
+			case (Tag::FileFormat::Maple):
+				{
+
+					linbox_check(_colnb > 0);
+					os << "[";
+					bool firstrow=true;
+					size_t idx = 0 ;
+
+					linbox_check(_nbnz == _rowid.size());
+					linbox_check(_nbnz == _data.size());
+					linbox_check(_nbnz == _colid.size());
+					for (size_t i = 0 ; i < _rownb ; ++i ) {
+						if (firstrow) {
+							os << "[";
+							firstrow =false;
+						}
+						else
+							os << ", [";
+
+
+						for (size_t j = 0; j < _colnb ; ++j) {
+							if (idx == _nbnz)
+								field().write (os, field().zero);
+							else if (_colid[idx] == j &&
+								 _rowid[idx] ==i) {
+								field().write (os, _data[idx]);
+								++idx;
+							}
+							else {
+								field().write (os, field().zero);
+							}
+
+							if (j < _colnb - 1)
+								os << ", ";
+						}
+
+						os << " ]";
+					}
+
+					os << "]";
+					linbox_check(idx == _nbnz);
+
+					break;
+				}
+			default :
+				os << "I don't know" << std::endl;
+
+			}
+			return os ;
+
+		}
+
+#if 0 /*  not updated and to be cleaned */
+		/*! @internal
+		 * write for CSR format.
+		 */
+		std::ostream & writeSpecialized(std::ostream &os,
+						SparseFileFormat::CSR) const
+		{
+			os << _rownb << ' ' << _colnb  << ' ' << size() << std::endl;
+			size_t lig = 0 ;
+			size_t i = 0 ;
+			while(i < size()) {
+				while(lig < _rowid[i]) {
+					os << "-1" << std::endl;
+					++lig ;
+				}
+				while (lig == _rowid[i]) {
+					field().write(_data[i], os << _colid[i] << ' ') << std::endl;
+					++i;
+				}
+				++lig ;
+			}
+			return os << "0 0 0" << std::endl;
+		}
+
+		/*! @internal
+		 * write for COO::implicit format.
+		 */
+		std::ostream & writeSpecialized(std::ostream &os,
+						SparseFileFormat::COO::implicit) const
+		{
+			os << _rownb << ' ' << _colnb  << ' ' << size() << std::endl;
+			size_t i = 0 ;
+			while(i < size()) {
+				field().write(_data[i], os << _rowid[i] << ' ' << _colid[i] << ' ') << std::endl;
+				++i;
+			}
+			return os << "0 0 0" << std::endl;
+		}
+
+
+
+		/*! @internal
+		 * Read for CSR format.
+		 */
+		std::istream & readSpecialized(std::istream &is,
+					       SparseFileFormat::CSR)
+		{
+			size_t nnz = 0 ;
+			bool sms = true ;
+			std::string firstLine ;
+			std::string x ;
+			getline(is, firstLine);
+			std::istringstream line(firstLine);
+			line >> _rownb >> _colnb >> x ;
+			size_t mem = 10 ;
+			if (!_rownb || _colnb)
+				throw LinBoxError("bad input");
+			if (x.empty() || x.compare("M")) {  /* SMS */
+				// mem = m ;
+				_rowid.reserve(mem);
+				_colid.reserve(mem);
+				_data.reserve(mem);
+			}
+			else { /* SMF */
+				sms = false ;
+				std::istringstream (x) >> nnz ;
+				if (!nnz)
+					throw LinBoxError("bad input");
+				mem = nnz ;
+				_rowid.reserve(nnz);
+				_colid.reserve(nnz);
+				_data.reserve(nnz);
+			}
+			Element z ;
+			if (sms) { /*  SMS */
+				size_t lig = 0 ;
+				nnz = 0 ;
+				int n ;
+				while (is>>n) {
+					if (n == 0)
+						break;
+					while (n == -1) {
+						++lig ;
+						is >> n ;
+					}
+					field().read(is,z)  ;
+					if (n<0 || lig >=_rownb || n >> _colnb)
+						throw LinBoxError("bad input");
+					if (!field().isZero(z)){
+						if (mem == nnz) {
+							mem+=20 ;
+							_rowid.resize(mem);
+							_colid.resize(mem);
+							_data.resize (mem);
+						}
+
+						_rowid[nnz]= lig ;
+						_colid[nnz]= n ;
+						_data[nnz] = z ;
+						++nnz ;
+					}
+				}
+				_rowid.resize(nnz);
+				_colid.resize(nnz);
+				_data.resize (nnz);
+
+			}
+			else { /*  SMF */
+				size_t lig = 0 ;
+				int n ;
+				size_t loc = 0;
+				while (is>>n) {
+					if (n == 0)
+						break;
+					while (n == -1) {
+						++lig ;
+						is >> n ;
+					}
+					field().read(is,z)  ;
+					if (n<0 || lig >=_rownb || n >> _colnb)
+						throw LinBoxError("bad input");
+					if (!field().isZero(z)){
+						_rowid[loc]= lig ;
+						_colid[loc]= n ;
+						_data[loc] = z ;
+						++loc ;
+					}
+				}
+				if (loc > nnz)
+					throw LinBoxError("bad input");
+				_rowid.resize(loc);
+				_colid.resize(loc);
+				_data.resize (loc);
+			}
+			return is ;
+		}
+
+		/*! @internal
+		 * Read for COO::implicit format.
+		 */
+		std::istream & readSpecialized(std::istream &is,
+					       SparseFileFormat::COO::implicit)
+		{
+			size_t nnz = 0;
+			bool sms = true ;
+			std::string firstLine ;
+			getline(is, firstLine);
+			std::istringstream line(firstLine);
+			std::string x ;
+			line >> _rownb >> _colnb >> x ;
+			size_t mem  = 10 ;
+			if (!_rownb || _colnb)
+				throw LinBoxError("bad input");
+			if (x.empty() || x.compare("M")) {  /* SMS */
+				// mem = m ;
+				_rowid.reserve(mem);
+				_colid.reserve(mem);
+				_data.reserve(mem);
+			}
+			else { /* SMF */
+				sms = false ;
+				std::istringstream (x) >> nnz ;
+				if (!nnz)
+					throw LinBoxError("bad input");
+				mem = nnz ;
+				_rowid.reserve(nnz);
+				_colid.reserve(nnz);
+				_data.reserve(nnz);
+			}
+			Element z ;
+			if (sms) { /*  SMS */
+				// size_t lig = 0 ;
+				nnz = 0 ;
+				int m,n ;
+				while (is>>m >> n) {
+					if (m == 0 && n == 0)
+						break;
+					if (n<0 || m<0 ||  m >=_rownb || n >> _colnb)
+						throw LinBoxError("bad input");
+					field().read(is,z)  ;
+					if (!field().isZero(z)){
+						if (mem == nnz) {
+							mem+=20 ;
+							_rowid.resize(mem);
+							_colid.resize(mem);
+							_data.resize (mem);
+						}
+						_rowid[nnz]= m ;
+						_colid[nnz]= n ;
+						_data[nnz] = z ;
+						++nnz ;
+					}
+				}
+				_rowid.resize(nnz);
+				_colid.resize(nnz);
+				_data.resize (nnz);
+
+			}
+			else { /*  SMF */
+				size_t loc = 0 ;
+				int m,n ;
+				while (is>>m >> n) {
+					if (m == 0 && n == 0)
+						break;
+					if (n<0 || m<0 ||  m >=_rownb || n >> _colnb)
+						throw LinBoxError("bad input");
+					field().read(is,z)  ;
+					if (!field().isZero(z)){
+						_rowid[loc]= m ;
+						_colid[loc]= n ;
+						_data[loc] = z ;
+						++loc ;
+					}
+				}
+
+				if (loc > nnz)
+					throw LinBoxError("bad input");
+				_rowid.resize(loc);
+				_colid.resize(loc);
+				_data.resize (loc);
+
+			}
+			return is ;
+		}
+#endif
+
+
+	public:
+		// pseudo iterators
+		size_t getRowid(const size_t & i) const
+		{
+			return _rowid[i];
+		}
+
+		void setRowid(const size_t &i, const size_t & j)
+		{
+			if (i>=_nbnz) this->resize(i);
+			_rowid[i]=j;
+		}
+
+		void setRowid(const std::vector<size_t> &  new_rowid)
+		{
+			// linbox_check(_rowid.size() == new_rowid.size());
+			_rowid = new_rowid ;
+		}
+
+		std::vector<size_t>  getRowid( ) const
+		{
+			return _rowid ;
+		}
+
+		size_t getColid(const size_t & i) const
+		{
+			return _colid[i];
+		}
+
+		void setColid(const size_t & i, const size_t & j)
+		{
+			if (i>=_nbnz) this->resize(i);
+			_colid[i]=j;
+		}
+
+		void setColid(std::vector<size_t> new_colid)
+		{
+			// linbox_check(_colid.size() == new_colid.size());
+			_colid = new_colid ;
+		}
+
+		std::vector<size_t>  getColid( ) const
+		{
+			return _colid ;
+		}
+
+
+
+		void setData(Element & new_data)
+		{
+			_data = new_data ;
+		}
+
+		Element  getData( ) const
+		{
+			return _data ;
+		}
+
+	protected :
+
+		size_t              _rownb ;
+		size_t              _colnb ;
+		size_t               _nbnz ;
+
+		std::vector<size_t> _rowid ;
+		std::vector<size_t> _colid ;
+		Element              _data ;
+
+		const _Field & _field;
+	};
+
+
+
+
+} // namespace LinBox
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_coo_implicit_matrix_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-coo-matrix.h b/linbox/matrix/sparsematrix/sparse-coo-matrix.h
new file mode 100644
index 0000000..65a8f21
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-coo-matrix.h
@@ -0,0 +1,1282 @@
+/* linbox/matrix/sparse-csr-matrix.h
+ * Copyright (C) 2013 the LinBox
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/sparsematrix/sparse-coo-matrix.h
+ * @ingroup sparsematrix
+ * @brief
+ */
+
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_coo_matrix_H
+#define __LINBOX_matrix_sparsematrix_sparse_coo_matrix_H
+
+#include <utility>
+#include <iostream>
+#include <algorithm>
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "linbox/field/hom.h"
+#include "sparse-domain.h"
+
+#ifndef LINBOX_COO_TRANSPOSE
+#define LINBOX_COO_TRANSPOSE 1000
+#endif
+
+namespace LinBox
+{
+
+
+	/** Sparse matrix, Coordinate storage.
+	 *
+	 * \ingroup matrix
+	 * \ingroup sparse
+	 */
+	template<class _Field>
+	class SparseMatrix<_Field, SparseMatrixFormat::COO> {
+	public :
+		typedef _Field                             Field ; //!< Field
+		typedef typename _Field::Element         Element ; //!< Element
+		typedef const Element               constElement ; //!< const Element
+		typedef SparseMatrixFormat::COO         Storage ; //!< Matrix Storage Format
+		typedef SparseMatrix<_Field,Storage>     Self_t ; //!< Self type
+		typedef typename Vector<Field>::SparseSeq    Row ; //!< @warning this is not the row type. Just used for streams.
+		// typedef Vector<_Field,VectorStorage::Sparse> Rep ;
+
+		/*! Constructors.
+		 * @todo convert from other matrix.
+		 *
+		 */
+		//@{
+#if 0 /*  No empty CSTOR */
+		SparseMatrix<_Field, SparseMatrixFormat::COO> () :
+			_rownb(0),_colnb(0)
+			,_nbnz(0)
+			,_rowid(0),_colid(0),_data(0)
+			, _field()
+			, _helper()
+		{
+		}
+#endif
+
+		SparseMatrix<_Field, SparseMatrixFormat::COO> (const _Field & F) :
+			_rownb(0),_colnb(0)
+			,_nbnz(0)
+			,_rowid(0)
+			,_colid(0)
+			,_data(0)
+			, _field(F)
+			, _helper()
+		{
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::COO> (const _Field & F, size_t m, size_t n) :
+			_rownb(m),_colnb(n)
+			,_nbnz(0)
+			,_rowid(0)
+			,_colid(0)
+			,_data(0)
+			, _field(F)
+			, _helper()
+		{
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::COO> (const _Field & F,
+							       size_t m, size_t n,
+							       size_t z) :
+			_rownb(m),_colnb(n)
+			, _nbnz(z)
+			,_rowid(z)
+			, _colid(z)
+			,_data(z)
+			, _field(F)
+			, _helper()
+		{
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::COO> (const SparseMatrix<_Field, SparseMatrixFormat::COO> & S) :
+			_rownb(S._rownb),_colnb(S._colnb)
+			,_nbnz(S._nbnz)
+			,_rowid(S._rowid)
+			, _colid(S._colid)
+			,_data(S._data)
+			, _field(S._field)
+			, _helper()
+		{
+		}
+
+#if 0
+		template<class _OtherField>
+		SparseMatrix<_Field, SparseMatrixFormat::COO> (const SparseMatrix<_OtherField, SparseMatrixFormat::COO> & S) :
+			_rownb(S._rownb),_colnb(S._colnb),
+			_nbnz(S._nbnz),
+			_rowid(S._rowid),_colid(S._colid),_data(S._data),
+			_field(S._field)
+		{}
+#endif
+
+		template<typename _Tp1, typename _Rw1 = SparseMatrixFormat::COO>
+		struct rebind {
+			typedef SparseMatrix<_Tp1, _Rw1> other;
+		private:
+
+			template<class _Rw>
+			void rebindMethod(SparseMatrix<_Tp1, _Rw> & Ap, const Self_t & A  /*, IndexedCategory::HasNext */)
+			{
+				typename _Tp1::Element e;
+				Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+
+				size_t i, j ;
+				Element f ;
+				A.firstTriple();
+				while ( A.nextTriple(i,j,f) ) {
+					linbox_check(i < A.rowdim() && j < A.coldim()) ;
+					hom. image ( e, f) ;
+					if (! Ap.field().isZero(e) )
+						Ap.appendEntry(i,j,e);
+				}
+				A.firstTriple();
+				Ap.finalize();
+			}
+
+			void rebindMethod(SparseMatrix<_Tp1, SparseMatrixFormat::COO>  & Ap, const Self_t & A /*,  IndexedCategory::HasNext*/)
+			{
+				// we don't use nextTriple because we can do better.
+
+				typename _Tp1::Element e;
+
+				Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+				size_t j = 0 ;
+				for (size_t i = 0 ; i < A.size() ; ++i) {
+					hom. image ( e, A.getData(i) );
+					if (!Ap.field().isZero(e)) {
+						Ap.setTriple(j,A.getRowid(i),A.getColid(i),e);
+						++j;
+					}
+				}
+
+
+				if (j != Ap.size())
+					Ap.resize(j);
+
+			}
+
+		public:
+
+			void operator() (other & Ap, const Self_t& A)
+			{
+				rebindMethod(Ap, A );
+
+			}
+
+		};
+
+		template<typename _Tp1, typename _Rw1>
+		SparseMatrix (const SparseMatrix<_Tp1, _Rw1> &S, const Field& F) :
+			_rownb(S.rowdim()),_colnb(S.coldim())
+			,_nbnz(S.size())
+			, _rowid(S.size())
+			, _colid(S.size())
+			,_data(S.size())
+			, _field(F)
+		{
+			typename SparseMatrix<_Tp1,_Rw1>::template rebind<Field,Storage>()(*this, S);
+			finalize();
+		}
+
+
+
+
+		template<class VectStream>
+		SparseMatrix<_Field, SparseMatrixFormat::COO> (const _Field & F, VectStream & stream) :
+			_rownb(stream.size()),_colnb(stream.dim())
+			, _nbnz(0)
+			, _rowid(0)
+			, _colid(0)
+			,_data(0)
+			, _field(F)
+		{
+			{
+
+			}
+			for (size_t i = 0 ; i< _rownb ; ++i) {
+				typename Vector<Field>::SparseSeq lig_i ;
+				stream >> lig_i ;
+				for (size_t j = 0 ; j < lig_i.size() ; ++j) {
+					size_t nbnz = _nbnz++ ;
+					resize(_nbnz);
+					_rowid[nbnz] = i ;
+					_colid[nbnz] = lig_i[j].first ;
+					F.init(_data[nbnz], lig_i[j].second) ; //!@bug may be 0...
+				}
+			}
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::COO> ( MatrixStream<Field>& ms ):
+			_rownb(0),_colnb(0)
+			,_nbnz(0)
+			,_rowid(0)
+			,_colid(0)
+			,_data(0)
+			,_field(ms.field())
+		{
+			firstTriple();
+
+			Element val;
+			size_t i, j;
+			while( ms.nextTriple(i,j,val) ) {
+				if (! field().isZero(val)) {
+					if( i >= _rownb ) {
+						_rownb = i + 1;
+					}
+					if( j >= _colnb ) {
+						_colnb = j + 1;
+					}
+					appendEntry(i,j,val);
+				}
+			}
+			if( ms.getError() > END_OF_MATRIX )
+				throw ms.reportError(__func__,__LINE__);
+			if( !ms.getDimensions( i, j ) )
+				throw ms.reportError(__func__,__LINE__);
+#ifndef NDEBUG
+			if( i != _rownb  || j != _colnb) {
+				std::cout << " ***Warning*** the sizes got changed" << __func__ << ',' << __LINE__ << std::endl;
+				// _rownb = i;
+				// _matA.resize(_m);
+			}
+#endif
+
+			firstTriple();
+			finalize();
+		}
+
+		void resize(size_t nn)
+		{
+#ifndef NDEBUG
+			if (nn < _nbnz) {
+				std::cerr << "*** Warning *** you are possibly loosing data (COO resize)" << std::endl;
+				// could be a commentator()...
+			}
+#endif
+			_rowid.resize(nn);
+			_colid.resize(nn);
+			_data.resize(nn);
+			_nbnz = nn ;
+		}
+
+		void resize(const size_t & mm, const size_t & nn, const size_t & zz = 0)
+		{
+			_rownb = mm ;
+			_colnb = nn ;
+
+			resize(zz);
+		}
+
+		/*! Default converter.
+		 * @param S a sparse matrix in any storage.
+		 */
+		template<class _OtherStorage>
+		SparseMatrix<_Field, SparseMatrixFormat::COO> (const SparseMatrix<_Field, _OtherStorage> & S) :
+			_rownb(S._rownb),_colnb(S._colnb),
+			_rowid(S.size()),_colid(S.size()),_data(S.size()),
+			_field(S._field)
+		{
+			SparseMatrix<_Field,SparseMatrixFormat::CSR> Temp(_field,_rownb,_colnb) ;
+			S.exporte(Temp); // convert S to CSR
+			this->importe(Temp); // convert Temp from COO
+			finalize();
+		}
+
+
+
+		//@}
+		/*! Conversions.
+		 * Any sparse matrix has a converter to/from CSR.
+		 * A specialisation can skip the temporary CSR matrix created.
+		 */
+		//@{
+		/*! Import a matrix in CSR format to COO.
+		 * @param S CSR matrix to be converted in COO
+		 */
+		void importe(const SparseMatrix<_Field,SparseMatrixFormat::CSR> &S)
+		{
+			resize( S.rowdim() , S.coldim() , S.size() );
+			_colid = S.getColid();
+			_data = S.getData();
+			for (size_t i = 0 ; i < _rownb ; ++i)
+				for (size_t j = S.getStart(i) ; j < S.getEnd(i); ++j)
+					_rowid[j] = i ;
+
+		}
+
+		void importe(const SparseMatrix<_Field,SparseMatrixFormat::COO> &S)
+		{
+			resize( S.rowdim(), S.coldim(), S.size() );
+
+			setRowid(S.getRowid());
+			setColid(S.getColid());
+			setData(S.getData());
+		}
+
+		/*! Export a matrix in CSR format from COO.
+		 * @param S CSR matrix to be converted from COO
+		 */
+		SparseMatrix<_Field,SparseMatrixFormat::CSR > &
+		exporte(SparseMatrix<_Field,SparseMatrixFormat::CSR> &S)
+		{
+			linbox_check(consistent());
+
+			S.resize(_rownb, _colnb, _nbnz);
+			S.setData( _data ) ;
+			S.setColid (_colid );
+
+			for(size_t i = 0 ; i <= _rownb ; ++i)
+				S.setStart(i,0);
+
+			for (size_t i = 0 ; i < _nbnz ; ++i) {
+				size_t idx = _rowid[i]+1 ;
+				S.setStart(idx,S.getStart(idx) + 1) ;
+			}
+			for (size_t i= 0 ; i < _rownb ; ++i)
+				S.setStart(i+1, S.getEnd(i)+ S.getStart(i)) ;
+
+			return S ;
+		}
+
+		SparseMatrix<_Field,SparseMatrixFormat::COO > &
+		exporte(SparseMatrix<_Field,SparseMatrixFormat::COO> &S)
+		{
+			S.resize(_rownb, _colnb, _nbnz);
+			S.setData( _data ) ;
+			S.setColid( _colid ) ;
+			S.setRowid( _rowid ) ;
+			S.finalize();
+
+			return S ;
+		}
+
+
+		//@}
+
+		/*! In place transpose. Not quite...
+		*/
+		void transposeIn()
+		{
+			Self_t Temp(*this);
+			Temp.transpose(*this);
+		}
+
+		/*! Transpose the matrix.
+		 *  @param S [out] transpose of self.
+		 *  @return a reference to \p S.
+		 */
+		Self_t &
+		transpose(Self_t &S) const
+		{
+			// outStart
+			std::vector<size_t> start (coldim()+1,0);
+
+			for (size_t i = 0 ; i < size() ; ++i)
+				start[_colid[i]+1] += 1 ;
+
+			for (size_t i = 0 ; i < coldim() ; ++i)
+				start[i+1] += start[i] ;
+
+			// inStart;
+			std::vector<size_t> _start (rowdim()+1,0);
+			for (size_t i = 0 ; i < size() ; ++i)
+				_start[_rowid[i]+1] += 1 ;
+
+			for (size_t i = 0 ; i < rowdim() ; ++i)
+				_start[i+1] += _start[i] ;
+
+			S.resize((size_t)_colnb, (size_t)_rownb, (size_t)_nbnz ); // necessary copy to temp, no const ref
+
+			{
+				size_t i = 0 ;
+				std::vector<size_t> done_col(coldim(),0);
+				for (size_t nextlig = 1 ; nextlig <= rowdim() ; ++nextlig) {
+					// treating line before nextlig
+					while (i < _start[nextlig]){
+						size_t cur_place ;
+						cur_place = start[_colid[i]] + done_col[_colid[i]] ;
+						linbox_check(cur_place < size());
+						S._data [ cur_place ] = _data[i] ;
+						S._colid[ cur_place ] = nextlig-1 ;
+						done_col[ _colid[i] ] += 1 ;
+						++i;
+					}
+				}
+			}
+
+			for (size_t i = 0 ; i < coldim() ; ++i)
+				for (size_t j = start[i] ; j < start[i+1]; ++j)
+					S._rowid[j] = i ;
+
+			S.finalize();
+
+			return S ;
+		}
+
+		/*! number of rows.
+		 * @return row dimension.
+		 */
+		size_t rowdim() const
+		{
+			return _rownb ;
+		}
+
+		/*! number of columns.
+		 * @return column dimension
+		 */
+		size_t coldim() const
+		{
+			return _colnb ;
+		}
+
+		/*! Number of non zero elements in the matrix.
+		 * or at least the size of the _data if
+		 * @return size of the _data.
+		 */
+		size_t size() const
+		{
+			// return _data.size();
+			return _nbnz ;
+		}
+
+		void setSize(const size_t & z)
+		{
+			_nbnz = z ;
+		}
+
+
+		/** Get a read-only individual entry from the matrix.
+		 * @param i Row _colid
+		 * @param j Column _colid
+		 * @return Const reference to matrix entry
+		 */
+		constElement &getEntry(const size_t &i, const size_t &j) const
+		{
+			linbox_check(i<_rownb);
+			linbox_check(j<_colnb);
+			ptrdiff_t nnz =  _triples.next();
+
+			// linbox_check(nnz < _colid.size());
+			// linbox_check(nnz < _rowid.size());
+			// linbox_check(nnz < _data.size());
+
+			if ( nnz < (ptrdiff_t)_nbnz && _colid[nnz] == j && i ==_rowid[nnz] ) { /* sort of nextTriple */
+				linbox_check(!field().isZero(_data[nnz]));
+				return _data[nnz];
+			}
+			else { /* searching */
+				typedef typename std::vector<size_t>::const_iterator myConstIterator ;
+				std::pair<myConstIterator,myConstIterator> bounds = std::equal_range (_rowid.begin(), _rowid.end(), i);
+				size_t ibeg = bounds.first-_rowid.begin();
+				size_t iend = bounds.second-_rowid.begin();
+				if (ibeg == iend) {
+					return field().zero;
+				}
+				// element may exist
+				myConstIterator beg = _colid.begin() + (ptrdiff_t)ibeg ;
+				myConstIterator end = _colid.begin() + (ptrdiff_t)iend ;
+				myConstIterator low = std::lower_bound (beg, end, j);
+				ibeg = (size_t)(low-_colid.begin());
+				// insert
+				if ( low == end || j != _colid[ibeg] ) {
+					return field().zero;
+				}
+				// replace
+				else {
+					_triples._nnz = ibeg ;// just in case it can be used, after all that work...
+					return _data[ibeg];
+				}
+			}
+
+		}
+
+		Element      &getEntry (Element &x, size_t i, size_t j) const
+		{
+			return x = getEntry (i, j);
+		}
+
+		void appendEntry(const size_t &i, const size_t &j, const Element& e)
+		{
+			linbox_check(i < rowdim());
+			linbox_check(j < coldim());
+
+			if (field().isZero(e)) { /* probably already tested */
+				return ;
+			}
+
+#if 0 /*  reserve is slow */
+			if (_nbnz % 10 == 0 ) {
+				_rowid.reserve(_nbnz+10);
+				_colid.reserve(_nbnz+10);
+				_data. reserve(_nbnz+10);
+			}
+#endif
+			_rowid.push_back(i);
+			_colid.push_back(j);
+			_data .push_back(e);
+			++_nbnz ;
+			return;
+
+		}
+
+		/// make matrix ready to use after a sequence of setEntry calls.
+		void finalize()
+		{
+			_triples.reset();
+		} // end construction after a sequence of setEntry calls.
+
+		/** Set an individual entry.
+		 * Setting the entry to 0 will not remove it from the matrix
+		 * @param i Row _colid of entry
+		 * @param j Column _colid of entry
+		 * @param value Value of the new entry
+		 * @todo make it faster if i is 0 or m-1 ?
+		 * @warning if this is used to build a matrix and this matrix is "well formed",
+		 * it can be sped up (no checking that the entry already exists).
+		 */
+		void setEntry(const size_t &i, const size_t &j, const Element& e
+			     )
+		{
+			linbox_check(i<_rownb);
+			linbox_check(j<_colnb);
+
+			if (field().isZero(e)) {
+				return clearEntry(i,j);
+			}
+
+			// nothing has been done yet
+			typedef typename std::vector<size_t>::iterator myIterator ;
+			std::pair<myIterator,myIterator> bounds = std::equal_range (_rowid.begin(), _rowid.end(), i);
+			size_t ibeg = bounds.first-_rowid.begin();
+			size_t iend = bounds.second-_rowid.begin();
+			// element does not exist, insert
+			if (ibeg == iend) {
+				// std::cout << "# insert " << i << ',' << j << ':' << e << std::endl;
+				_rowid.insert(_rowid.begin()+ibeg,i);
+				_colid.insert(_colid.begin()+ibeg,j);
+				_data.insert( _data.begin() +ibeg,e);
+				++_nbnz;
+				return ;
+			}
+			// element may exist
+			myIterator beg = _colid.begin() + (ptrdiff_t)ibeg ;
+			myIterator end = _colid.begin() + (ptrdiff_t)iend ;
+			myIterator low = std::lower_bound (beg, end, j);
+			ibeg = (size_t)(low-_colid.begin());
+			// insert
+			if ( low == end || j != _colid[ibeg] ) {
+				// std::cout << "# 2 insert " << i << ',' << j << ':' << e << std::endl;
+				_rowid.insert(_rowid.begin() + (ptrdiff_t)ibeg,i);
+				_colid.insert(_colid.begin() + (ptrdiff_t)ibeg,j);
+				_data.insert (_data. begin() + (ptrdiff_t)ibeg,e);
+				++_nbnz;
+				return ;
+			}
+			// replace
+			else {
+				// std::cout << "# replace " << i << ',' << j << ':' << e << std::endl;
+				_data[ibeg] = e ;
+				return ;
+			}
+		}
+
+#if 0
+		/** Get a writeable reference to an entry in the matrix.
+		 * If there is no entry at the position (i, j), then a new entry
+		 * with a value of zero is inserted and a reference  to it is
+		 * returned.
+		 * @param i Row _colid of entry
+		 * @param j Column _colid of entry
+		 * @return Reference to matrix entry
+		 */
+		Element &refEntry(const size_t &i, const size_t&j)
+		{
+			linbox_check(i<_rownb);
+			linbox_check(j<_colnb);
+			// Could be improved by adding an initial guess j/rowdim*size()
+			typedef typename std::vector<size_t>::iterator myIterator ;
+
+			std::pair<myIterator,myIterator> bounds = std::equal_range (_rowid.begin(), _rowid.end(), i);
+			size_t ibeg = bounds.first-_rowid.begin();
+			size_t iend = (bounds.second-_rowid.begin())-ibeg;
+			if (!iend) {
+				_rowid.insert(_rowid.begin()+ibeg,i);
+				_colid.insert(_colid.begin()+ibeg,j);
+				_data.insert( _data.begin() +ibeg,field().zero);
+				return _data[ibeg];
+			}
+			myIterator beg = _colid.begin()+ibeg ;
+			myIterator low = std::lower_bound (beg, beg+(ptrdiff_t)iend, j);
+			if (low == beg+(ptrdiff_t)iend) {
+				_rowid.insert(_rowid.begin()+ibeg,i);
+				_colid.insert(_colid.begin()+ibeg,j);
+				_data.insert( _data.begin() +ibeg,field().zero);
+				return _data[ibeg];
+			}
+			else {
+				size_t la = low-_colid.begin() ;
+				return _data[la] ;
+			}
+		}
+#endif
+
+		/** Write a matrix to the given output stream using field read/write.
+		 * @param os Output stream to which to write the matrix
+		 * @param format Format with which to write
+		 */
+		std::ostream & write(std::ostream &os
+				     , LINBOX_enum(Tag::FileFormat) format  = Tag::FileFormat::MatrixMarket) const
+		{
+			return SparseMatrixWriteHelper<Self_t>::write(*this,os,format);
+		}
+
+
+		/** Read a matrix from the given input stream using field read/write
+		 * @param is Input stream from which to read the matrix
+		 * @param format Format of input matrix
+		 * @return ref to \p is.
+		 */
+		std::istream& read (std::istream &is
+				    , LINBOX_enum(Tag::FileFormat) format  = Tag::FileFormat::Detect)
+		{
+			return SparseMatrixReadHelper<Self_t>::read(*this,is,format);
+		}
+
+		/*! @internal
+		 * @brief Deletes the entry.
+		 * Deletes \c A(i,j) if it exists.
+		 * @param i row _colid
+		 * @param j col _colid
+		 */
+		void clearEntry(const size_t &i, const size_t &j)
+		{
+			linbox_check(i<_rownb);
+			linbox_check(j<_colnb);
+			typedef typename std::vector<size_t>::iterator myIterator ;
+
+			std::pair<myIterator,myIterator> bounds = std::equal_range (_rowid.begin(), _rowid.end(), i);
+			size_t ibeg = bounds.first-_rowid.begin();
+			size_t iend = (bounds.second-_rowid.begin());
+			if (ibeg == iend)
+				return ;
+
+			myIterator beg = _colid.begin() +(ptrdiff_t)ibeg;
+			myIterator end = _colid.begin() +(ptrdiff_t)iend;
+			myIterator low = std::lower_bound (beg, end, j);
+			if (low == end)
+				return ;
+			else {
+				// not sure
+				size_t la = low-_colid.begin() ;
+				_rowid.erase(_rowid.begin()+(ptrdiff_t)la);
+				_colid.erase(_colid.begin()+(ptrdiff_t)la);
+				_data. erase(_data. begin()+(ptrdiff_t)la);
+				--_nbnz;
+				return  ;
+			}
+		}
+
+		/*! @internal
+		 * @brief cleans 0 entries.
+		 */
+		void clean()
+		{
+			size_t i = 0 ;
+			while ( i < _data.size() ) {
+				if ( field().isZero(_data[i]) ) {
+					_rowid.erase(_rowid.begin()+i);
+					_colid.erase(_colid.begin()+i);
+					_data. erase(_data. begin()+i);
+				}
+				else
+					++i ;
+			}
+			return ;
+		}
+
+		// y = A x + a * y ;
+		template<class Vector>
+		Vector& apply(Vector &y, const Vector& x, const Element & a ) const
+		{
+			// linbox_check(consistent());
+			prepare(field(),y,a);
+
+			size_t z = 0 ;
+			size_t last_i = 0 ;
+
+#if 0
+			for (size_t i = 0 ; i < _nbnz ; ++i)
+				field().axpyin( y[_rowid[i]], _data[i], x[_colid[i]] );
+#else
+			FieldAXPY<Field> accu(field());
+			while ( z < _nbnz) {
+				if (_rowid[z] == last_i) {
+					accu.mulacc(  _data[z], x[_colid[z]] );
+				}
+				else {
+					accu.get(y[last_i]);
+					last_i = _rowid[z] ;
+					accu.reset();
+					accu.mulacc(  _data[z], x[_colid[z]] );
+				}
+				++z ;
+			}
+			accu.get(y[last_i]);
+#endif
+
+			return y;
+		}
+
+
+		template<class Vector>
+		Vector& applyTranspose(Vector &y, const Vector& x, const Element & a ) const
+		{
+			linbox_check(consistent());
+			if (_helper.optimized(*this)) {
+				return _helper.matrix().apply(y,x,a) ; // NEVER use applyTranspose on that thing.
+			}
+
+			prepare(field(),y,a);
+
+#if 0
+			for (size_t i = 0 ; i < _nbnz ; ++i)
+				field().axpyin( y[_colid[i]], _data[i], x[_rowid[i]] );
+#else
+			const FieldAXPY<Field> accu0(field());
+			std::vector<FieldAXPY<Field> > Y(_colnb, accu0);
+			for (size_t i = 0 ; i < _nbnz ; ++i)
+				Y[_colid[i]].mulacc( _data[i], x[_rowid[i]] );
+			for (size_t i = 0 ; i < _colnb ; ++i)
+				Y[i].get(y[i]) ;
+#endif
+
+
+
+
+			return y;
+		}
+
+
+
+		template<class inVector, class outVector>
+		outVector& apply(outVector &y, const inVector& x ) const
+		{
+			return apply(y,x,field().zero);
+		}
+
+		template<class inVector, class outVector>
+		outVector& applyTranspose(outVector &y, const inVector& x ) const
+		{
+			return applyTranspose(y,x,field().zero);
+		}
+
+		const Field & field()  const
+		{
+			return _field ;
+		}
+
+		//! @todo
+		bool consistent() const
+		{
+			return true ;
+		}
+
+	private :
+
+	class Helper {
+			bool _useable ;
+			bool _optimized ;
+			bool blackbox_usage ;
+			Self_t *_AT ;
+		public:
+
+			Helper() :
+				_useable(false)
+				,_optimized(false)
+				, blackbox_usage(true)
+				, _AT(NULL)
+			{}
+
+			~Helper()
+			{
+				if ( _AT ) {
+					delete _AT ;
+				}
+			}
+
+			bool optimized(const Self_t & A)
+			{
+				if (!_useable) {
+					getHelp(A);
+					_useable = true;
+				}
+				return	_optimized;
+			}
+
+			void getHelp(const Self_t & A)
+			{
+				if ( A.size() > LINBOX_COO_TRANSPOSE ) { // and/or A.rowDensity(), A.coldim(),...
+					// std::cout << "optimizing..." ;
+					_optimized = true ;
+					_AT = new Self_t(A.field(),A.coldim(),A.rowdim());
+					A.transpose(*_AT);
+					// std::cout << "done!" << std::endl;
+				}
+			}
+
+			const Self_t & matrix() const
+			{
+				return *_AT ;
+			}
+
+		};
+
+	public:
+		// pseudo iterators
+		size_t getRowid(const size_t & i) const
+		{
+			return _rowid[i];
+		}
+
+		void setTriple(const size_t &loc, const size_t & i, const size_t & j, const Element & e)
+		{
+			linbox_check(loc <= _nbnz);
+			linbox_check( _rowid.size() == _nbnz);
+			linbox_check( _colid.size() == _nbnz);
+			linbox_check( _data.size() == _nbnz);
+			if (loc==_nbnz) {
+#if 0 /*  reserve is slow */
+				if (loc % 10 == 0) {
+					_rowid.reserve(loc+10);
+					_colid.reserve(loc+10);
+					_data.reserve(loc+10);
+				}
+#endif
+				_rowid.push_back(i);
+				_colid.push_back(j);
+				_data.push_back(e);
+				++_nbnz;
+				return;
+			}
+			_rowid[loc]=i;
+			_colid[loc]=j;
+			_data[loc]=e;
+
+		}
+
+		void setRowid(const std::vector<size_t> &  new_rowid)
+		{
+			_rowid = new_rowid ;
+		}
+
+		std::vector<size_t>  getRowid( ) const
+		{
+			return _rowid ;
+		}
+
+		size_t getColid(const size_t & i) const
+		{
+			return _colid[i];
+		}
+
+
+		void setColid(std::vector<size_t> new_colid)
+		{
+			_colid = new_colid ;
+		}
+
+		std::vector<size_t>  getColid( ) const
+		{
+			return _colid ;
+		}
+
+		const Element & getData(const size_t & i) const
+		{
+			return _data[i];
+		}
+
+
+		void setData(const std::vector<Element> & new_data)
+		{
+			_data = new_data ;
+		}
+
+		std::vector<Element>  getData( ) const
+		{
+			return _data ;
+		}
+
+		void firstTriple() const
+		{
+			_triples.reset();
+		}
+
+		bool nextTriple(size_t & i, size_t &j, Element &e) const
+		{
+			ptrdiff_t idx = _triples.next();
+			if (idx >= (ptrdiff_t)_nbnz) {
+				_triples.reset() ;
+				return false;
+			}
+
+			i = _rowid[(size_t)idx];
+			j = _colid[(size_t)idx];
+			e = _data[(size_t)idx];
+
+			return true;
+		}
+
+		template<class element_iterator, class Element>
+		class _Iterator {
+		private :
+			element_iterator _data_it ;
+			const element_iterator _data_beg ;
+			const element_iterator _data_end ;
+		public:
+			typedef Element value_type ;
+			_Iterator(element_iterator e_beg, element_iterator e_end) :
+				_data_it(e_beg)
+				, _data_beg(e_beg)
+				, _data_end(e_end)
+			{}
+
+			_Iterator (const _Iterator &iter) :
+				_data_it(iter._data_it)
+				, _data_beg(iter._data_beg)
+				, _data_end(iter._data_end)
+			{}
+
+			_Iterator &operator = (const _Iterator &iter)
+			{
+				_data_it  = iter._data_it  ;
+				_data_beg  = iter._data_beg  ;
+				_data_end  = iter._data_end  ;
+
+				return *this;
+			}
+
+			bool operator == (const _Iterator &i) const
+			{
+				return  (_data_it == i._data_it) && (_data_beg == i._data_beg) && (_data_end == i._data_end);
+			}
+
+			bool operator != (const _Iterator &i) const
+			{
+				return  (_data_it != i._data_it) || (_data_beg != i._data_beg) || (_data_end != i._data_end);
+			}
+
+			_Iterator &operator ++ ()
+			{
+				++_data_it ;
+
+				if (_data_it == _data_end)
+					return *this ;
+			}
+
+			_Iterator operator ++ (int)
+			{
+				_Iterator tmp = *this;
+				++(*this);
+				return tmp;
+			}
+
+			_Iterator &operator -- ()
+			{
+				--_data_it ;
+
+				if (_data_it == _data_beg)
+					return *this ;
+			}
+
+			_Iterator operator -- (int)
+			{
+				_Iterator tmp = *this;
+				--(*this);
+				return tmp;
+			}
+
+			value_type &operator * ()
+			{
+				return *_data_it;
+			}
+
+			value_type *operator -> ()
+			{
+				return _data_it ;
+			}
+
+			const value_type &operator*() const
+			{
+				return *_data_it;
+			}
+
+			const value_type *operator -> () const
+			{
+				return _data_it ;
+			}
+
+			const value_type &value() const
+			{
+				return *_data_it;
+			}
+
+		};
+
+		template<class index_iterator, class element_iterator, class Element>
+		class _IndexedIterator {
+		private :
+			typedef  index_iterator    index_it ;
+			typedef  element_iterator  data_it ;
+			index_it _rowid_it ;
+			index_it _colid_it ;
+			data_it _data_it ;
+			const data_it _data_beg ;
+			const data_it _data_end ;
+		public:
+			typedef Element value_type ;
+			_IndexedIterator( const index_it &i
+					  , const index_it &j
+					  , const data_it &e
+					  , const data_it &e_e) :
+				_rowid_it(i)
+				, _colid_it(j)
+				, _data_it(e)
+				, _data_beg(e)
+				, _data_end(e_e)
+			{}
+
+			_IndexedIterator (const _IndexedIterator &iter) :
+				_rowid_it(iter._rowid_it)
+				, _colid_it(iter._colid_it)
+				, _data_it(iter._data_it)
+				, _data_beg(iter._data_beg)
+				, _data_end(iter._data_end)
+			{}
+
+			_IndexedIterator &operator = (const _IndexedIterator &iter)
+			{
+				_rowid_it = iter._rowid_it ;
+				_colid_it = iter._colid_it ;
+				_data_it  = iter._data_it  ;
+				_data_beg = iter._data_beg ;
+				_data_end  = iter._data_end  ;
+
+				return *this;
+			}
+
+			bool operator == (const _IndexedIterator &i) const
+			{
+				// we assume consistency
+				return (_data_it == i._data_it);
+			}
+
+			bool operator != (const _IndexedIterator &i) const
+			{
+				// we assume consistency
+				return  (_data_it != i._data_it) ;
+			}
+
+			_IndexedIterator &operator ++ ()
+			{
+
+				++_data_it  ;
+				if (_data_it == _data_end) {
+					return *this ;
+				}
+				++_colid_it ;
+				++_rowid_it ;
+
+				return *this;
+			}
+
+			_IndexedIterator operator ++ (int)
+			{
+				_IndexedIterator tmp = *this;
+				++(*this);
+				return tmp;
+			}
+
+			_IndexedIterator &operator -- ()
+			{
+				throw NotImplementedYet("not sure");
+				--_data_it  ;
+				if (_data_it == _data_beg) {
+					return *this ;
+				}
+				--_colid_it ;
+				--_rowid_it ;
+
+				return *this;
+			}
+
+			_IndexedIterator operator -- (int)
+			{
+				_IndexedIterator tmp = *this;
+				--(*this);
+				return tmp;
+			}
+
+			value_type &operator * ()
+			{
+				return *_data_it;
+			}
+
+			value_type *operator -> ()
+			{
+				return _data_it ;
+			}
+
+			const value_type &operator*() const
+			{
+				return *_data_it;
+			}
+
+			const value_type *operator -> () const
+			{
+				return _data_it ;
+			}
+
+			size_t rowIndex () const
+			{
+				return *_rowid_it;
+			}
+
+			size_t colIndex () const
+			{
+				return *_colid_it;
+			}
+
+			const value_type &value() const
+			{
+				return *_data_it;
+			}
+
+
+		};
+
+		typedef _Iterator<typename std::vector<Element>::iterator, Element> Iterator;
+		typedef _Iterator<typename std::vector<Element>::const_iterator, constElement> ConstIterator;
+
+		typedef _IndexedIterator<std::vector<size_t>::iterator, typename std::vector<Element>::iterator, Element> IndexedIterator;
+		typedef _IndexedIterator<std::vector<size_t>::const_iterator, typename std::vector<Element>::const_iterator, constElement> ConstIndexedIterator;
+
+
+		Iterator      Begin ()
+		{
+			return Iterator(_data.begin(),_data.end()) ;
+		}
+
+		Iterator      End   ()
+		{
+			return Iterator(_data.end(), _data.end()) ;
+		}
+
+		ConstIterator      Begin () const
+		{
+			return ConstIterator(_data.begin(),_data.end()) ;
+		}
+
+		ConstIterator      End   () const
+		{
+			return ConstIterator(_data.end(), _data.end()) ;
+		}
+
+		IndexedIterator      IndexedBegin ()
+		{
+			return IndexedIterator(_rowid.begin(), _colid.begin(), _data.begin(),_data.end()) ;
+		}
+
+		IndexedIterator      IndexedEnd   ()
+		{
+			return IndexedIterator(_rowid.end(), _colid.end(), _data.end(),_data.end()) ;
+		}
+
+		ConstIndexedIterator      IndexedBegin () const
+		{
+			return ConstIndexedIterator(_rowid.begin(), _colid.begin(), _data.begin(),_data.end()) ;
+		}
+
+		ConstIndexedIterator      IndexedEnd   () const
+		{
+			return ConstIndexedIterator(_rowid.end(), _colid.end(), _data.end(),_data.end()) ;
+		}
+
+
+	protected :
+		friend class SparseMatrixWriteHelper<Self_t >;
+		friend class SparseMatrixReadHelper<Self_t >;
+
+
+		size_t              _rownb ;
+		size_t              _colnb ;
+		size_t               _nbnz ;
+
+		std::vector<size_t> _rowid ;
+		std::vector<size_t> _colid ;
+		std::vector<Element> _data ;
+
+		const _Field & _field;
+
+		mutable Helper _helper ;
+
+		mutable struct _triples {
+			ptrdiff_t _nnz ;
+			_triples() :
+				_nnz(-1)
+			{}
+
+			ptrdiff_t next()
+			{
+				return _nnz +=1 ;
+			}
+
+			void reset()
+			{
+				_nnz = -1 ;
+			}
+		}_triples;
+	};
+
+
+
+
+
+} // namespace LinBox
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_coo_matrix_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-csr-matrix.h b/linbox/matrix/sparsematrix/sparse-csr-matrix.h
new file mode 100644
index 0000000..f60d125
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-csr-matrix.h
@@ -0,0 +1,1615 @@
+/* linbox/matrix/sparse-csr-matrix.h
+ * Copyright (C) 2013 the LinBox
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/sparsematrix/sparse-csr-matrix.h
+ * @ingroup sparsematrix
+ * @brief
+ */
+
+
+#ifndef __LINBOX_sparse_matrix_sparse_csr_matrix_H
+#define __LINBOX_sparse_matrix_sparse_csr_matrix_H
+
+#include <utility>
+#include <iostream>
+#include <algorithm>
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "linbox/field/hom.h"
+#include "sparse-domain.h"
+#include "givaro/zring.h"
+
+#ifndef LINBOX_CSR_TRANSPOSE
+#define LINBOX_CSR_TRANSPOSE 1000
+#endif
+
+namespace LinBox {
+#if 0
+	template<class _Field>
+	struct AutoField {
+		typedef _Field Base ;
+	};
+
+	template<>
+	struct AutoField<Givaro::ZRing<Integer> > {
+		typedef Givaro::ModularBalanced<double> Base ;
+
+	};
+
+	template<Field>
+	struct AutoField<Givaro::Extension<Field>> {
+		// typedef AutoField<Field>::Base Base ;
+		typedef Field Base ;
+	};
+
+	template<>
+	struct AutoField<Givaro::Modular<float> > {
+		typedef Unparametric<float> Base ;
+	};
+
+	template<>
+	struct AutoField<Givaro::ModularBalanced<float> > {
+		typedef Unparametric<float> Base ;
+	};
+
+	template<>
+	struct AutoField<Givaro::Modular<double> > {
+		// sometimes, could be Unparametric<float>...
+		typedef Unparametric<double> Base ;
+	};
+
+	template<>
+	struct AutoField<Givaro::ModularBalanced<double> > {
+		typedef Unparametric<double> Base ;
+	};
+
+
+
+	template<>
+	struct AutoField<Givaro::Modular<float> > {
+		typedef Unparametric<float> Base ;
+	};
+#endif
+
+}
+
+namespace LinBox {
+
+
+	/** Sparse matrix, Coordinate storage.
+	 *
+	 * \ingroup matrix
+	 * \ingroup sparse
+	 */
+	template<class _Field>
+	class SparseMatrix<_Field, SparseMatrixFormat::CSR > {
+	private :
+		typedef std::vector<index_t> svector_t ;
+	public :
+		typedef _Field                             Field ; //!< Field
+		typedef typename _Field::Element         Element ; //!< Element
+		typedef const Element               constElement ; //!< const Element
+		typedef SparseMatrixFormat::CSR          Storage ; //!< Matrix Storage Format
+		typedef SparseMatrix<_Field,Storage>      Self_t ; //!< Self type
+		typedef typename Vector<Field>::SparseSeq    Row ; //!< @warning this is not the row type. Just used for streams.
+		// typedef Vector<_Field,VectorStorage::Sparse> Rep ;
+
+		/*! Constructors.
+		 * @todo convert from other matrix.
+		 *
+		 */
+		//@{
+#if 0 /*  No empty CSTOR */
+		SparseMatrix<_Field, SparseMatrixFormat::CSR> () :
+			_rownb(0),_colnb(0)
+			,_nbnz(0)
+			,_start(1,0),_colid(0),_data(0)
+			, _field()
+			, _helper()
+		{
+			_start[0] = 0 ;
+		}
+#endif
+
+		SparseMatrix<_Field, SparseMatrixFormat::CSR> (const _Field & F) :
+			_rownb(0),_colnb(0)
+			,_nbnz(0)
+			,_start(1,0)
+			,_colid(0)
+			,_data(0)
+			, _field(F)
+			, _helper()
+		{
+			_start[0] = 0 ;
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::CSR> (const _Field & F, size_t m, size_t n) :
+			_rownb(m),_colnb(n)
+			,_nbnz(0)
+			,_start(m+1,0)
+			,_colid(0)
+			,_data(0)
+			, _field(F)
+			, _helper()
+		{
+			_start[0] = 0 ;
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::CSR> (const _Field & F,
+							       size_t m, size_t n,
+							       size_t z) :
+			_rownb(m),_colnb(n)
+			, _nbnz(z)
+			,_start(m+1,0)
+			, _colid(z)
+			,_data(z)
+			, _field(F)
+			, _helper()
+		{
+			_start[0] = 0 ;
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::CSR> (const SparseMatrix<_Field, SparseMatrixFormat::CSR> & S) :
+			_rownb(S._rownb),_colnb(S._colnb)
+			,_nbnz(S._nbnz)
+			,_start(S._start)
+			, _colid(S._colid)
+			,_data(S._data)
+			, _field(S._field)
+			, _helper()
+		{
+		}
+
+#if 0
+		template<class _OtherField>
+		SparseMatrix<_Field, SparseMatrixFormat::COO> (const SparseMatrix<_OtherField, SparseMatrixFormat::COO> & S) :
+			_rownb(S._rownb),_colnb(S._colnb),
+			_nbnz(S._nbnz),
+			_rowid(S._rowid),_colid(S._colid),_data(S._data),
+			_field(S._field)
+		{}
+#endif
+
+		template<typename _Tp1, typename _Rw1 = SparseMatrixFormat::CSR>
+		struct rebind {
+			typedef SparseMatrix<_Tp1, _Rw1> other;
+		private:
+
+			template<class _Rw>
+			void rebindMethod(SparseMatrix<_Tp1, _Rw> & Ap, const Self_t & A  /*, IndexedCategory::HasNext */)
+			{
+				typename _Tp1::Element e;
+				Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+
+				size_t i, j ;
+				Element f ;
+				A.firstTriple();
+				while ( A.nextTriple(i,j,f) ) {
+					linbox_check(i < A.rowdim() && j < A.coldim()) ;
+					hom. image ( e, f) ;
+					if (! Ap.field().isZero(e) )
+						Ap.appendEntry(i,j,e);
+				}
+				A.firstTriple();
+				Ap.finalize();
+			}
+
+			void rebindMethod(SparseMatrix<_Tp1, SparseMatrixFormat::CSR>  & Ap, const Self_t & A /*,  IndexedCategory::HasNext*/)
+			{
+				// we don't use nextTriple because we can do better.
+
+				typename _Tp1::Element e;
+
+				Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+				size_t j = 0 ;
+				Ap.setStart(A.getStart());
+				svector_t offset(A.rowdim()+1,0);
+				bool changed = false ;
+				for (size_t i = 0 ; i < A.rowdim() ; ++i) {
+					for (size_t k = A.getStart(i) ; k < A.getEnd(i) ; ++k) {
+						hom. image ( e, A.getData(k) );
+						if (!Ap.field().isZero(e)) {
+							Ap.setColid(j,A.getColid(k));
+							Ap.setData(j,e);
+							++j;
+						}
+						else
+						{
+							offset[i+1] += 1 ;
+							changed = true ;
+						}
+					}
+				}
+				if (changed) {
+					for (size_t i = 0 ; i < A.rowdim() ; ++i) {
+						offset[i+1] += offset[i] ;
+					}
+					for (size_t i = 1 ; i <= A.rowdim() ; ++i) {
+						Ap.setStart(i,A.getStart(i)-offset[i]);
+					}
+				}
+
+
+				if (j != Ap.size())
+					Ap.resize(j);
+
+			}
+
+		public:
+
+			void operator() (other & Ap, const Self_t& A)
+			{
+				rebindMethod(Ap, A );
+
+			}
+
+		};
+
+		template<typename _Tp1, typename _Rw1>
+		SparseMatrix (const SparseMatrix<_Tp1, _Rw1> &S, const Field& F) :
+			_rownb(S.rowdim()),_colnb(S.coldim())
+			,_nbnz(S.size())
+			, _start(S.rowdim()+1,0)
+			, _colid(S.size())
+			,_data(S.size())
+			, _field(F)
+		{
+			typename SparseMatrix<_Tp1,_Rw1>::template rebind<Field,Storage>()(*this, S);
+			finalize();
+		}
+
+
+#if 0
+		void merge(const SparseMatrix<_Field, SparseMatrixFormat::CSR> & S)
+		{
+			for (size_t i_ex = 0 ; i_ex < S.rowdim() ; ++i_ex)
+				for (size_t k = S.getStart(i_ex) ; k < S.getEnd(i_ex) ; ++k) {
+					// can be faster by iterating over both matrices
+					setEntry(i_ex,S.getColid(k),S.getData(k));
+				}
+		}
+#endif
+
+
+		template<class VectStream>
+		SparseMatrix<_Field, SparseMatrixFormat::CSR> (const _Field & F, VectStream & stream) :
+			_rownb(stream.size()),_colnb(stream.dim())
+			, _nbnz(0)
+			, _start(_rownb+1,0)
+			, _colid(0)
+			,_data(0)
+			, _field(F)
+		{
+			{
+				_start[0] = 0 ;
+			}
+			for (size_t i = 0 ; i< _rownb ; ++i) {
+				typename Vector<Field>::SparseSeq lig_i ;
+				stream >> lig_i ;
+				_start[i+1] = (index_t) lig_i.size();
+				for (size_t j = 0 ; j < lig_i.size() ; ++j) {
+					size_t nbnz = _nbnz++ ;
+					resize(_nbnz);
+					_colid[nbnz] = (index_t)lig_i[j].first ;
+					F.init(_data[nbnz], lig_i[j].second) ; //!@bug may be 0...
+				}
+			}
+			for (size_t i = 0 ; i < rowdim() ; ++i)
+				_start[i+1] += _start[i];
+			linbox_check(_start[rowdim()] == _nbnz );
+
+			finalize();
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::CSR> ( MatrixStream<Field>& ms ):
+			_rownb(0),_colnb(0)
+			,_nbnz(0)
+			,_start(1,0)
+			,_colid(0)
+			,_data(0)
+			,_field(ms.field())
+		{
+			firstTriple();
+
+			Element val;
+			size_t i, j;
+			while( ms.nextTriple(i,j,val) ) {
+				if (! field().isZero(val)) {
+					if( i >= _rownb ) {
+						// _rownb = i + 1;
+						resize(i+1,_colnb,_nbnz);
+					}
+					if( j >= _colnb ) {
+						// _colnb = j + 1;
+						resize(_rownb,j+1,_nbnz);
+					}
+					appendEntry(i,j,val);
+				}
+			}
+			if( ms.getError() > END_OF_MATRIX )
+				throw ms.reportError(__func__,__LINE__);
+			if( !ms.getDimensions( i, j ) )
+				throw ms.reportError(__func__,__LINE__);
+#ifndef NDEBUG
+			if( i != _rownb  || j != _colnb) {
+				std::cout << " ***Warning*** the sizes got changed" << __func__ << ',' << __LINE__ << std::endl;
+			}
+#endif
+
+			firstTriple();
+			finalize();
+		}
+
+		void resize(size_t nn)
+		{
+#ifndef NDEBUG
+			if (nn < _nbnz) {
+				std::cerr << "*** Warning *** you are possibly loosing data (CSR resize)" << std::endl;
+				// could be a commentator()...
+			}
+#endif
+			_colid.resize(nn);
+			_data.resize(nn);
+			_nbnz = nn ;
+		}
+
+		void resize(const size_t & mm, const size_t & nn, const size_t & zz = 0)
+		{
+			_rownb = mm ;
+			_colnb = nn ;
+
+			_start.resize(mm+1);
+			resize(zz);
+		}
+
+		/*! Default converter.
+		 * @param S a sparse matrix in any storage.
+		 */
+		template<class _OtherStorage>
+		SparseMatrix<_Field, SparseMatrixFormat::CSR> (const SparseMatrix<_Field, _OtherStorage> & S) :
+			_rownb(S.rowdim()),_colnb(S.coldim()),
+			_start(S.rowdim()+1,0),_colid(S.size()),_data(S.size()),
+			_field(S.field())
+		{
+			this->importe(S); // convert Temp from anything
+			finalize();
+		}
+
+
+
+		//@}
+		/*! Conversions.
+		 * Any sparse matrix has a converter to/from CSR.
+		 * A specialisation can skip the temporary CSR matrix created.
+		 */
+		//@{
+		/*! Import a matrix in COO format to CSR.
+		 * @param S COO matrix to be converted in CSR
+		 */
+		void importe(const SparseMatrix<_Field,SparseMatrixFormat::COO> &S)
+		{
+			resize(S.rowdim(), S.coldim(), S.size());
+
+			setData(S.getData());
+			setColdim(S.setColdim());
+
+			_start[0] = 0 ;
+			for (size_t i = 0 ; i < _nbnz ; ++i)
+				_start[S.rowid(i)+1] += 1 ;
+
+			finalize();
+
+		}
+
+		/*! Import a matrix in CSR format to CSR.
+		 * @param S CSR matrix to be converted in CSR
+		 */
+
+		void importe(const SparseMatrix<_Field,SparseMatrixFormat::CSR> &S)
+		{
+			resize( S.rowdim(), S.coldim(), S.size() );
+
+			setStart(S.getStart());
+			setColid(S.getColid());
+			setData(S.getData());
+			finalize();
+		}
+
+		/*! Export a matrix in CSR format from COO.
+		 * @param S CSR matrix to be converted from COO
+		 */
+		SparseMatrix<_Field,SparseMatrixFormat::CSR > &
+		exporte(SparseMatrix<_Field,SparseMatrixFormat::CSR> &S)
+		{
+			linbox_check(consistent());
+
+			S.resize(_rownb, _colnb, _nbnz);
+			S.setStart( _start );
+			S.setColid (_colid );
+			S.setData(  _data ) ;
+			S.finalize();
+
+			return S ;
+		}
+
+		SparseMatrix<_Field,SparseMatrixFormat::COO > &
+		exporte(SparseMatrix<_Field,SparseMatrixFormat::COO> &S)
+		{
+			S.resize(_rownb, _colnb, _nbnz);
+			S.setData(  _data ) ;
+			S.setColid( _colid ) ;
+			for(size_t i = 0 ; i < rowdim() ; ++i)
+				for (index_t j = _start[i] ; j < _start[i+1] ; ++j)
+					S.setRowid(j,i);
+			S.finalize();
+
+			return S ;
+		}
+
+
+		//@}
+
+		/*! In place transpose. Not quite...
+		*/
+		void transposeIn()
+		{
+			Self_t Temp(*this);
+			Temp.transpose(*this);
+		}
+
+		/*! Transpose the matrix.
+		 *  @param S [out] transpose of self.
+		 *  @return a reference to \p S.
+		 */
+		Self_t &
+		transpose(Self_t &S) const
+		{
+
+			// outStart
+			for (size_t i = 0 ; i <= coldim() ; ++i)
+				S._start[i] = 0  ;
+
+			for (size_t i = 0 ; i < size() ; ++i)
+				S._start[_colid[i]+1] += 1 ;
+
+			S.resize((size_t)_colnb, (size_t)_rownb, (size_t)_nbnz ); // necessary copy to temp, no const ref
+
+			for (size_t i = 0 ; i < coldim() ; ++i)
+				S._start[i+1] +=  S._start[i] ;
+
+			{
+				size_t i = 0 ;
+				svector_t done_col(S.rowdim(),0);
+				for (size_t nextlig = 1 ; nextlig <= rowdim() ; ++nextlig) {
+					// treating line before nextlig
+					while (i < _start[nextlig]){
+						size_t cur_place ;
+						cur_place = S._start[_colid[i]] + done_col[_colid[i]] ;
+						linbox_check(cur_place < size());
+						S._data [ cur_place ] = _data[i] ;
+						S._colid[ cur_place ] = (index_t) nextlig-1 ;
+						done_col[_colid[i]] += 1 ;
+						++i;
+					}
+				}
+			}
+
+			S.finalize();
+
+			return S;
+
+
+		}
+
+		/*! number of rows.
+		 * @return row dimension.
+		 */
+		size_t rowdim() const
+		{
+			return _rownb ;
+		}
+
+		/*! number of columns.
+		 * @return column dimension
+		 */
+		size_t coldim() const
+		{
+			return _colnb ;
+		}
+
+		/*! Number of non zero elements in the matrix.
+		 * or at least the size of the _data if
+		 * @return size of the _data.
+		 */
+		size_t size() const
+		{
+			// return _data.size();
+			return _nbnz ;
+		}
+
+		void setSize(const size_t & z)
+		{
+			_nbnz = z ;
+		}
+
+
+		/** Get a read-only individual entry from the matrix.
+		 * @param i Row _colid
+		 * @param j Column _colid
+		 * @return Const reference to matrix entry
+		 */
+		constElement &getEntry(const size_t &i, const size_t &j) const
+		{
+			linbox_check(i<_rownb);
+			linbox_check(j<_colnb);
+
+			ptrdiff_t nnz = _triples.next(_start);
+			if ( nnz < (ptrdiff_t)_nbnz && _colid[nnz]  == j && (ptrdiff_t)i == _triples._row ) { /* sort of nextTriple */
+				linbox_check(!field().isZero(_data[nnz]));
+				return _data[nnz];
+			}
+			else { /* searching */
+				typedef typename svector_t::const_iterator myConstIterator ;
+				index_t ibeg = _start[i] ;
+				index_t iend = _start[i+1] ;
+
+				if (ibeg == iend) {
+					return field().zero;
+				}
+				// element may exist
+				myConstIterator beg = _colid.begin() + (ptrdiff_t)ibeg ;
+				myConstIterator end = _colid.begin() + (ptrdiff_t)iend ;
+				myConstIterator low = std::lower_bound (beg, end, j);
+				ibeg = (size_t)(low-_colid.begin());
+				// insert
+				if ( low == end || j != _colid[ibeg] ) {
+					return field().zero;
+				}
+				// replace
+				else {
+					_triples._nnz = ibeg ;// just in case it can be used, after all that work...
+					_triples._row = i ;
+					return _data[ibeg] ;
+				}
+			}
+
+		}
+
+		Element      &getEntry (Element &x, size_t i, size_t j) const
+		{
+			return x = getEntry (i, j);
+		}
+
+		void appendEntry(const size_t &i, const index_t &j, const Element& e)
+		{
+			linbox_check(i < rowdim());
+			linbox_check(j < coldim());
+
+			if (field().isZero(e)) { /* probably already tested */
+				return ;
+			}
+
+			if ( rowdim() +1  != _start.size()) {
+				if (rowdim() % 100 == 0)
+					_start.reserve(rowdim()+100);
+				_start.resize(rowdim()+1,0);
+			}
+
+			_start[i+1] += 1 ;
+#if 0 /*  reserve is slow */
+			if (_nbnz % 100 == 0 ) {
+				_colid.reserve(_nbnz + 100);
+				_data.reserve(_nbnz + 100);
+			}
+#endif
+			_colid.push_back(j);
+			_data .push_back(e);
+			++_nbnz ;
+			return;
+
+		}
+
+		/// make matrix ready to use after a sequence of setEntry calls.
+		void finalize()
+		{
+			if (_start[rowdim()] != _nbnz) { /* if it is so, then all before are 0 and we are fine... */
+				for (size_t i = 2 ; i <= rowdim() ; ++i)
+					_start[i] += _start[i-1];
+				linbox_check(_start[rowdim()] == _nbnz);
+			}
+			_triples.reset();
+
+		} // end construction after a sequence of setEntry calls.
+
+		/** Set an individual entry.
+		 * Setting the entry to 0 will not remove it from the matrix
+		 * @param i Row _colid of entry
+		 * @param j Column _colid of entry
+		 * @param value Value of the new entry
+		 * @todo make it faster if i is 0 or m-1 ?
+		 * @warning if this is used to build a matrix and this matrix is "well formed",
+		 * it can be sped up (no checking that the entry already exists).
+		 */
+		void setEntry(const size_t &i, const size_t &j, const Element& e
+			     )
+		{
+			linbox_check(i<_rownb);
+			linbox_check(j<_colnb);
+			linbox_check(_start.size() == _rownb+1);
+			linbox_check(_start[0] == 0);
+
+			if (field().isZero(e)) {
+				return clearEntry(i,j);
+			}
+
+			// nothing has been done yet
+			typedef typename svector_t::iterator myIterator ;
+			index_t ibeg = _start[i];
+			index_t iend = _start[i+1];
+			// element does not exist, insert
+			if (ibeg == iend) {
+				// std::cout << "# insert " << i << ',' << j << ':' << e << std::endl;
+				for (size_t k = i+1 ; k <= _rownb ; ++k)
+					_start[k] += 1 ;
+				_colid.insert(_colid.begin()+ibeg,j);
+				_data.insert( _data.begin() +ibeg,e);
+				++_nbnz;
+				return ;
+			}
+			// element may exist
+			myIterator beg = _colid.begin() + (ptrdiff_t)ibeg ;
+			myIterator end = _colid.begin() + (ptrdiff_t)iend ;
+			myIterator low = std::lower_bound (beg, end, j);
+			ibeg = (index_t)(low-_colid.begin());
+			// insert
+			if ( low == end || j != _colid[ibeg] ) {
+				// std::cout << "# 2 insert " << i << ',' << j << ':' << e << std::endl;
+				for (size_t k = i+1 ; k <= _rownb ; ++k)
+					_start[k] += 1 ;
+				_colid.insert(_colid.begin() + (ptrdiff_t)ibeg,j);
+				_data.insert (_data. begin() + (ptrdiff_t)ibeg,e);
+				++_nbnz;
+				return ;
+			}
+			// replace
+			else {
+				// std::cout << "# replace " << i << ',' << j << ':' << e << std::endl;
+				_data[ibeg] = e ;
+				return ;
+			}
+		}
+
+#if 0
+		/** Get a writeable reference to an entry in the matrix.
+		 * If there is no entry at the position (i, j), then a new entry
+		 * with a value of zero is inserted and a reference  to it is
+		 * returned.
+		 * @param i Row _colid of entry
+		 * @param j Column _colid of entry
+		 * @return Reference to matrix entry
+		 */
+		Element &refEntry(const size_t &i, const size_t&j)
+		{
+			linbox_check(i<_rownb);
+			linbox_check(j<_colnb);
+			// Could be improved by adding an initial guess j/rowdim*size()
+			typedef typename svector_t::iterator myIterator ;
+
+			size_t ibeg = _start[i];
+			size_t iend = _start[i+1];
+			if (ibeg==iend) {
+				for (size_t k = i+1 ; k <= _rownb ; ++k) _start[k] +=1 ;
+				_colid.insert(_colid.begin()+ibeg,j);
+				_data.insert( _data.begin() +ibeg,field().zero);
+				return _data[ibeg];
+			}
+			myIterator beg = _colid.begin() ;
+			myIterator low = std::lower_bound (beg+(ptrdiff_t)ibeg, beg+(ptrdiff_t)iend, j);
+			if (low == beg+(ptrdiff_t)iend) {
+				for (size_t k = i+1 ; k <= _rownb ; ++k) _start[k] +=1 ;
+				_colid.insert(_colid.begin()+ibeg,j);
+				_data.insert( _data.begin() +ibeg,field().zero);
+				return _data[ibeg];
+			}
+			else {
+				size_t la = low-_colid.begin() ;
+				return _data[la] ;
+			}
+		}
+#endif
+
+		/** Write a matrix to the given output stream using field read/write.
+		 * @param os Output stream to which to write the matrix
+		 * @param format Format with which to write
+		 */
+		std::ostream & write(std::ostream &os
+				     , LINBOX_enum(Tag::FileFormat) format  = Tag::FileFormat::MatrixMarket) const
+		{
+			return SparseMatrixWriteHelper<Self_t>::write(*this,os,format);
+		}
+
+
+		/** Read a matrix from the given input stream using field read/write
+		 * @param is Input stream from which to read the matrix
+		 * @param format Format of input matrix
+		 * @return ref to \p is.
+		 */
+		std::istream& read (std::istream &is
+				    , LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::Detect)
+		{
+			return SparseMatrixReadHelper<Self_t>::read(*this,is,format);
+		}
+
+		/*! @internal
+		 * @brief Deletes the entry.
+		 * Deletes \c A(i,j) if it exists.
+		 * @param i row _colid
+		 * @param j col _colid
+		 */
+		void clearEntry(const size_t &i, const size_t &j)
+		{
+			linbox_check(i<_rownb);
+			linbox_check(j<_colnb);
+			typedef typename svector_t::iterator myIterator ;
+
+			index_t ibeg = _start[i];
+			index_t iend = _start[i+1];
+			if (ibeg == iend)
+				return ;
+
+			myIterator beg = _colid.begin() +(ptrdiff_t)ibeg;
+			myIterator end = _colid.begin() +(ptrdiff_t)iend;
+			myIterator low = std::lower_bound (beg, end, j);
+			if (low == end)
+				return ;
+			else {
+				// not sure
+				size_t la = (size_t)(low-_colid.begin()) ;
+				for (size_t k = i+1 ; k <= _rownb ; ++k)
+					_start[k] -= 1 ;
+				_colid.erase(_colid.begin()+(ptrdiff_t)la);
+				_data. erase(_data. begin()+(ptrdiff_t)la);
+				--_nbnz;
+				return  ;
+			}
+		}
+
+		/*! @internal
+		 * @brief cleans 0 entries.
+		 */
+		void clean()
+		{
+			size_t i = 0 ;
+			while ( i < _data.size() ) {
+				if ( field().isZero(_data[i]) ) {
+					for (size_t k = i+1 ; k <= _rownb ; ++k)
+						_start[k] -= 1 ;
+					_colid.erase(_colid.begin()+i);
+					_data. erase(_data. begin()+i);
+				}
+				else
+					++i ;
+			}
+			return ;
+		}
+
+		// y= Ax
+		// y[i] = sum(A(i,j) x(j)
+		// start(i)<k < start(i+1) : _delta[k] = A(i,colid(k))
+		template<class inVector, class outVector>
+		outVector& apply(outVector &y, const inVector& x, const Element & a ) const
+		{
+			// linbox_check(consistent());
+			prepare(field(),y,a);
+
+
+			// std::cout << "apply" << std::endl;
+			FieldAXPY<Field> accu(field());
+			for (size_t i = 0 ; i < _rownb ; ++i) {
+				accu.reset();
+				for (index_t k = _start[i] ; k < _start[i+1] ; ++k)
+					// field().axpyin( y[i], _data[k], x[_colid[k]] ); //! @todo delay !!!
+					accu.mulacc(_data[k],x[_colid[k]]);
+				accu.get(y[i]);
+			}
+
+			return y;
+		}
+
+
+		// y= A^t x
+		// y[i] = sum(A(j,i) x(j)
+		template<class inVector, class outVector>
+		outVector& applyTranspose(outVector &y, const inVector& x, const Element & a) const
+		{
+			linbox_check(consistent());
+			if (_helper.optimized(*this)) {
+				return _helper.matrix().apply(y,x,a) ; // NEVER use applyTranspose on that thing.
+			}
+
+			prepare(field(),y,a);
+
+			const FieldAXPY<Field> accu0(field());
+			std::vector<FieldAXPY<Field> > Y(_colnb, accu0);
+
+			for (size_t i = 0 ; i < _rownb ; ++i)
+				for (index_t k = _start[i] ; k < _start[i+1] ; ++k) {
+					Y[_colid[k]].mulacc(_data[k], x[i] );
+				}
+
+			for (size_t i = 0 ; i < _colnb ; ++i)
+				Y[i].get(y[i]) ;
+
+			return y;
+		}
+
+
+
+		template<class inVector, class outVector>
+		outVector& apply(outVector &y, const inVector& x ) const
+		{
+			return apply(y,x,field().zero);
+		}
+
+		template<class inVector, class outVector>
+		outVector& applyTranspose(outVector &y, const inVector& x ) const
+		{
+			return applyTranspose(y,x,field().zero);
+		}
+
+		const Field & field()  const
+		{
+			return _field ;
+		}
+
+		//! @todo
+		bool consistent() const
+		{
+			return true ;
+		}
+
+		// Element magnitude() const ;
+
+		size_t maxrow() const
+		{
+			size_t maxr = _start[1]-_start[0] ;
+			for (size_t i = 1 ; i < _rownb ; ++i)
+				maxr = std::max(maxr,(size_t)(_start[i+1]-_start[i]));
+			return maxr;
+		}
+
+	private :
+
+		class Helper {
+			bool _useable ;
+			bool _optimized ;
+			bool blackbox_usage ;
+			Self_t *_AT ;
+		public:
+
+			Helper() :
+				_useable(false)
+				,_optimized(false)
+				, blackbox_usage(true)
+				, _AT(NULL)
+			{}
+
+			~Helper()
+			{
+				if ( _AT ) {
+					delete _AT ;
+				}
+			}
+
+			bool optimized(const Self_t & A)
+			{
+				if (!_useable) {
+					getHelp(A);
+					_useable = true;
+				}
+				return	_optimized;
+			}
+
+			void getHelp(const Self_t & A)
+			{
+				if ( A.size() > LINBOX_CSR_TRANSPOSE ) { // and/or A.rowDensity(), A.coldim(),...
+					// std::cout << "optimizing..." ;
+					_optimized = true ;
+					_AT = new Self_t(A.field(),A.coldim(),A.rowdim());
+					A.transpose(*_AT);
+					// std::cout << "done!" << std::endl;
+				}
+			}
+
+			const Self_t & matrix() const
+			{
+				return *_AT ;
+			}
+
+		};
+
+	public:
+		// pseudo iterators
+		index_t getStart(const size_t & i) const
+		{
+			return _start[i];
+		}
+
+		index_t getEnd(const size_t & i) const
+		{
+			return _start[i+1];
+		}
+
+
+		void setStart(const size_t &i, const index_t & j)
+		{
+			if (i > _rownb) this->resize(i,_colnb,_nbnz);
+			_start[i] = j ;
+		}
+
+		void setStart(const svector_t &  new_start)
+		{
+			// linbox_check(_start.size() == new_start.size());
+			_start = new_start ;
+		}
+
+		svector_t  getStart( ) const
+		{
+			return _start ;
+		}
+
+		size_t rowLength(const size_t & i)
+		{
+			return getEnd(i) - getStart(i) ;
+		}
+
+		// remove empty last lines
+		void compress()
+		{
+			size_t i = rowdim();
+			for ( ; i != 0 ; --i) {
+				if ( _start[i] != _start[i-1] )
+					break;
+			}
+			_rownb = i ;
+
+		}
+
+		size_t getColid(const size_t & i) const
+		{
+			return _colid[i];
+		}
+
+		void setColid(const size_t & i, const size_t & j)
+		{
+			if (i>=_nbnz) this->resize(i+1);
+			linbox_check(i <= _colid.size())
+			_colid[i]=(index_t)j;
+		}
+
+		void setColid(svector_t new_colid)
+		{
+			_colid = new_colid ;
+		}
+
+		svector_t  getColid( ) const
+		{
+			return _colid ;
+		}
+
+		const Element & getData(const size_t & i) const
+		{
+			return _data[i];
+		}
+
+		void setData(const size_t & i, const Element & e)
+		{
+			if (i>=_nbnz) this->resize(i+1);
+			linbox_check(i <= _data.size());
+			field().assign(_data[i],e);
+		}
+
+		void setData(const std::vector<Element> & new_data)
+		{
+			_data = new_data ;
+		}
+
+		std::vector<Element>  getData( ) const
+		{
+			return _data ;
+		}
+
+		void firstTriple() const
+		{
+			_triples.reset();
+		}
+
+		bool nextTriple(size_t & i, size_t &j, Element &e) const
+		{
+			size_t idx = (size_t)_triples.next( _start );
+			i = (size_t)_triples._row ;
+			if (idx >= _nbnz || i >= _rownb ) {
+				_triples.reset() ;
+				return false;
+			}
+
+
+			j = _colid[idx];
+			e = _data[idx];
+
+			return true;
+		}
+
+		template<class element_iterator, class Element>
+		class _Iterator {
+		private :
+			element_iterator _data_it ;
+			const element_iterator _data_beg ;
+			const element_iterator _data_end ;
+		public:
+			typedef Element value_type ;
+			_Iterator(element_iterator e_beg, element_iterator e_end) :
+				_data_it(e_beg)
+				, _data_beg(e_beg)
+				, _data_end(e_end)
+			{}
+
+			_Iterator (const _Iterator &iter) :
+				_data_it(iter._data_it)
+				, _data_beg(iter._data_beg)
+				, _data_end(iter._data_end)
+			{}
+
+			_Iterator &operator = (const _Iterator &iter)
+			{
+				_data_it  = iter._data_it  ;
+				_data_beg  = iter._data_beg  ;
+				_data_end  = iter._data_end  ;
+
+				return *this;
+			}
+
+			bool operator == (const _Iterator &i) const
+			{
+				return  (_data_it == i._data_it) && (_data_beg == i._data_beg) && (_data_end == i._data_end);
+			}
+
+			bool operator != (const _Iterator &i) const
+			{
+				return  (_data_it != i._data_it) || (_data_beg != i._data_beg) || (_data_end != i._data_end);
+			}
+
+			_Iterator &operator ++ ()
+			{
+				++_data_it ;
+
+				if (_data_it == _data_end)
+					return *this ;
+			}
+
+			_Iterator operator ++ (int)
+			{
+				_Iterator tmp = *this;
+				++(*this);
+				return tmp;
+			}
+
+			_Iterator &operator -- ()
+			{
+				--_data_it ;
+
+				if (_data_it == _data_beg)
+					return *this ;
+			}
+
+			_Iterator operator -- (int)
+			{
+				_Iterator tmp = *this;
+				--(*this);
+				return tmp;
+			}
+
+			value_type &operator * ()
+			{
+				return *_data_it;
+			}
+
+			value_type *operator -> ()
+			{
+				return _data_it ;
+			}
+
+			const value_type &operator*() const
+			{
+				return *_data_it;
+			}
+
+			const value_type *operator -> () const
+			{
+				return _data_it ;
+			}
+
+			const value_type &value() const
+			{
+				return *_data_it;
+			}
+
+		};
+
+#if 1
+		// This simplified indexed iterator conquers a bug and 
+		// supports all tested uses.
+
+		/** a forward iterator. 
+		  
+		  Allows traversing the nonzero values, with position info.  
+		  Used, for example, in building an equivalent dense matrix.
+
+		  Preincrement, ++i, is provided, but not postincrement, i++.
+		  Dereference, *i, is replaced by i.rowIndex(), i.colIndex(), i.value().
+
+		  No distinction is made between IndexedIterator and ConstIndexedIterator.  
+		  In particular, value() is not a reference.  
+		  To modify the matrix use setEntry().
+		 */
+		class IndexedIterator {
+			public:
+				typedef SparseMatrix<Field, Storage> CSR_Matrix;
+				typedef CSR_Matrix::Element value_type;
+			private: 
+				const CSR_Matrix *Ap_;
+				index_t row_; // row number, index for Ap_->_start
+				index_t i_; // index for Ap_->_colid, Ap_->_data
+			public:
+				IndexedIterator(){}
+
+				// cstor used by indexedBegin and indexedEnd
+				IndexedIterator(const CSR_Matrix * A, index_t m, index_t n)
+				: Ap_(A), row_(m), i_(n) {}
+
+				IndexedIterator & operator++() {
+					i_ += 1;
+					// Deal with arrival at end
+					if (i_ == Ap_->_data.size()) row_ = Ap_->rowdim();
+					// Attend to empty rows
+					else if (i_ == Ap_->_start[row_+1]) row_ += 1;
+					while(Ap_->_start[row_] == Ap_->_start[row_+1]) ++row_;
+					return *this;
+				}
+
+				index_t rowIndex() const { return  row_; }
+
+				index_t colIndex() const { return Ap_->_colid[i_]; }
+
+				value_type value() const { return Ap_->_data[i_]; }
+
+				bool operator == (const IndexedIterator & I) const {
+					return row_ == I.row_ and i_ == I.i_;
+				}
+
+				bool operator != (const IndexedIterator & I) const {
+					return row_ != I.row_ or i_ != I.i_;
+				}
+		};
+
+		typedef typename Self_t::IndexedIterator ConstIndexedIterator;
+#else
+		template<class index_iterator, class element_iterator, class Element>
+		class _IndexedIterator {
+		private :
+			typedef  index_iterator    index_it ;
+			typedef  element_iterator  data_it ;
+			index_it _start_it ;
+			index_it _start_beg ;
+			index_it _colid_it ;
+			data_it _data_it ;
+			const data_it _data_beg ;
+			const data_it _data_end ;
+		public:
+			typedef Element value_type ;
+			_IndexedIterator( const index_it &i
+					  , const index_it &j
+					  , const data_it &e
+					  , const data_it &e_e) :
+				_start_it(i)
+				, _start_beg(i)
+				, _colid_it(j)
+				, _data_it(e)
+				, _data_beg(e)
+				, _data_end(e_e)
+			{}
+			_IndexedIterator (const _IndexedIterator &iter) :
+				_start_it(iter._start_it)
+				, _start_beg(iter._start_beg)
+				, _colid_it(iter._colid_it)
+				, _data_it(iter._data_it)
+				, _data_beg(iter._data_beg)
+				, _data_end(iter._data_end)
+			{}
+
+			_IndexedIterator &operator = (const _IndexedIterator &iter)
+			{
+				_start_it = iter._start_it ;
+				_start_beg = iter._start_beg ;
+				_colid_it = iter._colid_it ;
+				_data_it  = iter._data_it  ;
+				_data_beg = iter._data_beg ;
+				_data_end  = iter._data_end  ;
+
+				return *this;
+			}
+
+			bool operator == (const _IndexedIterator &i) const
+			{
+				// we assume consistency
+				return  (_data_it == i._data_it);
+			}
+
+			bool operator != (const _IndexedIterator &i) const
+			{
+				// we assume consistency
+				return  (_data_it != i._data_it) ;
+			}
+
+			_IndexedIterator &operator ++ ()
+			{
+
+				++_data_it  ;
+				if (_data_it == _data_end) {
+					return *this ;
+				}
+				++_colid_it ;
+
+				while (std::distance(_data_beg, _data_it) >= *(_start_it+1)) {
+					++_start_it ;
+				}
+				return *this;
+			}
+
+			_IndexedIterator operator ++ (int)
+			{
+				_IndexedIterator tmp = *this;
+				++(*this);
+				return tmp;
+			}
+
+			_IndexedIterator &operator -- ()
+			{
+				throw NotImplementedYet("not sure");
+				--_data_it  ;
+				if (_data_it == _data_beg) {
+					return *this ;
+				}
+				--_colid_it ;
+				while (std::distance(_data_beg, _data_it) > *(_start_it)) {
+					--_start_it ;
+				}
+
+				return *this;
+			}
+
+			_IndexedIterator operator -- (int)
+			{
+				_IndexedIterator tmp = *this;
+				--(*this);
+				return tmp;
+			}
+
+			value_type &operator * ()
+			{
+				return *_data_it;
+			}
+
+			value_type *operator -> ()
+			{
+				return _data_it ;
+			}
+
+			const value_type &operator*() const
+			{
+				return *_data_it;
+			}
+
+			const value_type *operator -> () const
+			{
+				return _data_it ;
+			}
+
+			size_t rowIndex () const
+			{
+				return std::distance(_start_beg, _start_it);
+			}
+
+			size_t colIndex () const
+			{
+				return *_colid_it;
+			}
+
+			const value_type &value() const
+			{
+				return *_data_it;
+			}
+
+
+		};
+#endif
+		typedef _Iterator<typename std::vector<Element>::iterator, Element> Iterator;
+		typedef _Iterator<typename std::vector<Element>::const_iterator, constElement> ConstIterator;
+
+//		typedef _IndexedIterator<svector_t::iterator, typename std::vector<Element>::iterator, Element> IndexedIterator;
+//		typedef _IndexedIterator<svector_t::const_iterator, typename std::vector<Element>::const_iterator, constElement> ConstIndexedIterator;
+
+
+		Iterator      Begin ()
+		{
+			return Iterator(_data.begin(),_data.end()) ;
+		}
+
+		Iterator      End   ()
+		{
+			return Iterator(_data.end(), _data.end()) ;
+		}
+
+		ConstIterator      Begin () const
+		{
+			return ConstIterator(_data.begin(),_data.end()) ;
+		}
+
+		ConstIterator      End   () const
+		{
+			return ConstIterator(_data.end(), _data.end()) ;
+		}
+
+		IndexedIterator      IndexedBegin () const
+		{
+			if (_data.size() == 0) return IndexedEnd();
+			// Take care for empty first row(s).
+			index_t i = 0;
+			while (_start[i] == _start[i+1]) ++i;
+			return IndexedIterator(this, i, 0);
+
+			// bug for empty first row
+			//return IndexedIterator(_start.begin(), _colid.begin(), _data.begin(),_data.end()) ;
+		}
+
+		IndexedIterator      IndexedEnd   () const
+		{
+			return IndexedIterator(this, rowdim(), _data.size());
+			//return IndexedIterator(_start.end(), _colid.end(), _data.end(),_data.end()) ;
+		}
+
+#if 0
+
+		ConstIndexedIterator      IndexedBegin () const
+		{	// bug for empty first row.
+			return ConstIndexedIterator(_start.begin(), _colid.begin(), _data.begin(),_data.end()) ;
+		}
+
+		ConstIndexedIterator      IndexedEnd   () const
+		{
+			return ConstIndexedIterator(_start.end(), _colid.end(), _data.end(),_data.end()) ;
+		}
+#endif
+
+		Integer magnitude() const
+		{
+			Integer M = 0;
+			for (size_t i = 0 ; i < _nbnz ; ++i)
+				M = std::max(M,Givaro::abs(_data[i]));
+					     return M;
+		}
+
+	protected :
+		friend class SparseMatrixWriteHelper<Self_t >;
+		friend class SparseMatrixReadHelper<Self_t >;
+
+		// friend class SparseMatrixDomain<Self_t > ;
+
+		// bool is_upper ;
+		// bool zero_based;
+		// bool implicit_diag ;
+
+		size_t              _rownb ;
+		size_t              _colnb ;
+		size_t               _nbnz ;
+
+		svector_t _start ;
+		svector_t _colid ;
+		std::vector<Element> _data ;
+
+		const _Field & _field;
+
+		mutable Helper _helper ;
+
+		mutable struct _triples {
+			ptrdiff_t _row ;
+			ptrdiff_t _nnz ;
+			_triples() :
+				_row(-1)
+				, _nnz(-1)
+			{}
+
+			ptrdiff_t next( const svector_t & start)
+			{
+				_nnz +=1 ;
+				while (_row+1 < (ptrdiff_t)start.size() && _nnz >= (ptrdiff_t)start[(size_t)_row+1]) {
+					_row += 1;
+				}
+				return _nnz ;
+			}
+
+			void reset()
+			{
+				_row = -1 ;
+				_nnz = -1 ;
+			}
+		}_triples;
+	};
+
+#if 1
+
+	// template<>
+	// template<class inVector, class outVector>
+	// outVector & SparseMatrix<Givaro::Modular<double>, SparseMatrixFormat::CSR >::apply(outVector &Y, const inVector& X, const Element & a ) const
+	// {
+	// 	FFLAS::CSR_sub<typename Field::Element> A ;
+	// 	// FFLAS::CSR_sub<typename Field::Element> A ;
+	// 	A.m = rowdim();
+	// 	A.n = coldim();
+	// 	A.st = const_cast<index_t*>(&_start[0]);
+	// 	A.col = const_cast<index_t*>(&_colid[0]);
+	// 	A.dat = const_cast<typename Field::Element*>(&_data[0]);
+	// 	// A.i0 = 0 ;
+	// 	// A.j0 = 0 ;
+	// 	FFLAS::VECT<typename Field::Element>  x ;
+	// 	x.inc = 1 ;
+	// 	x.m = X.size();
+	// 	x.dat = X.getPointer();
+	// 	FFLAS::VECT<typename Field::Element>  y ;
+	// 	y.inc = 1;
+	// 	y.m = Y.size();
+	// 	y.dat = Y.getWritePointer();
+	// 	// std::cout << "called" << std::endl ;
+	// 	FFLAS::sp_fgemv(field(),  A, x, a, y);
+	// 	return Y ;
+	// }
+
+	// template<>
+	// Integer SparseMatrix<Givaro::ZRing<Integer>, SparseMatrixFormat::CSR >::magnitude() const
+	// {
+	// 	// XXX this is a vector magnitude
+	// 	Integer max_elt(0);
+	// 	for (size_t i = 0 ; i < _nbnz ; ++i)
+	// 		if (max_elt < Givaro::abs(_data[i]))
+	// 			max_elt = Givaro::abs(_data[i]) ;
+	// 	return max_elt ;
+	// }
+#endif
+
+} // LinBox
+
+namespace LinBox {
+
+#if 0
+	template<class _Field>
+	SparseMatrixDomain<SparseMatrix<_Field, SparseMatrixFormat::CSR> {
+	public:
+		typedef typename _Field Field ;
+		typedef typename SparseMatrix<Field, SparseMatrixFormat::CSR> Matrix_t ;
+		typedef typename SparseMatrixDomain<Matrix_t> Self_t ;
+
+		Self_t(Matrix_t & M) :
+			_mat(M)
+		{}
+
+		// template<class inMatrix, class outMatrix>
+		// outMatrix & apply( outMatrix & y, const inMatrix & x, Element & alpha, const LINBOX_enum(Tag::Side) lr)
+
+		template<class inMatrix, class outMatrix>
+		outMatrix & applyLeft( outMatrix & y, const inMatrix & x, Element & alpha)
+		{
+			return applyLeft(y,x,alpha
+					 , typename ContainerTraits<inMatrix>::ContainerCategory()
+					 , typename FieldTraits<typename inMatrix::Field>::categoryTag() );
+		}
+
+		template<class inMatrix, class outMatrix>
+		outMatrix & applyRight( outMatrix & y, const inMatrix & x, Element & alpha)
+		{
+			return applyRight(y,x,alpha
+					  , typename ContainerTraits<inMatrix>::ContainerCategory()
+					 , typename FieldTraits<typename inMatrix::Field>::categoryTag() );
+		}
+
+#if 0 /*  allow y to be transposed */
+		template<class inMatrix, class outMatrix>
+		outMatrix & applyRight( outMatrix & y, const Transpose<inMatrix> & x, Element & alpha)
+		{
+			return applyRight(y,x,alpha,lr, typename ContainerTraits<inMatrix>::ContainerCategory() );
+		}
+#endif
+
+
+	private :
+		// XXX generic Tag
+		// axpy, trans
+
+		// XXX generic Tag
+		// MKL
+
+		// Givaro::Modular Tag
+		// sum of matrices
+		template<class inMatrix, class outMatrix>
+		outMatrix & applyLeft( outMatrix & y, const inMatrix & x, Element & alpha
+				  , typename ContainerCategories::Vector
+				  , typename RingCategories::ModularTag);
+
+		template<class inMatrix, class outMatrix>
+		outMatrix & applyLeft( outMatrix & y, const inMatrix & x, Element & alpha
+				  , typename ContainerCategories::Matrix
+				  , typename RingCategories::ModularTag);
+
+		template<class inMatrix, class outMatrix>
+		outMatrix & applyRight( outMatrix & y, const inMatrix & x, Element & alpha
+				  , typename ContainerCategories::Vector
+				  , typename RingCategories::ModularTag);
+
+		template<class inMatrix, class outMatrix>
+		outMatrix & applyRight( outMatrix & y, const inMatrix & x, Element & alpha
+				  , typename ContainerCategories::Matrix
+				  , typename RingCategories::ModularTag);
+
+
+		// XXX Integer Tag
+		// RNS (needs _Field -> ModularField)
+
+		// XXX Galois Tag
+		// Toom Cook or the like (needs _Field -> Base(_Field)=ModularField)
+
+	private :
+		Matrix_t & _mat ;
+
+		SparseMatrix< AutoField<Field>::Base, SparseMatrixFormat::HYB > N_mat ;
+		SparseMatrix< AutoField<Field>::Base, SparseMatrixFormat::HYB > T_mat ;
+		// Helper
+
+	}
+#endif
+
+
+} // namespace LinBox
+
+
+
+#endif // __LINBOX_sparse_matrix_sparse_csr_matrix_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-domain.h b/linbox/matrix/sparsematrix/sparse-domain.h
new file mode 100644
index 0000000..c7b53dc
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-domain.h
@@ -0,0 +1,70 @@
+/* linbox/matrix/sparse-domain.h
+ * Copyright (C) 2013 the LinBox
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/sparsematrix/sparse-domain.h
+ * @ingroup sparsematrix
+ */
+
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_domain_H
+#define __LINBOX_matrix_sparsematrix_sparse_domain_H
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+
+namespace LinBox {
+
+	/// y <- ay.  @todo Vector knows Field
+	template<class Field, class Vector>
+	Vector & prepare(const Field & F , Vector & y, const typename Field::Element & a) {
+		if ( !F.isOne(a) ) {
+			if ( F.isZero(a) ) {
+				for (size_t i = 0 ; i < y.size() ; ++i)
+					F.assign(y[i],F.zero);
+			}
+			else if (F.isMOne(a)) {
+				for (size_t i = 0 ; i < y.size() ; ++i)
+					F.negin(y[i]);
+			}
+			else {
+				for (size_t i = 0 ; i < y.size() ; ++i)
+					F.mulin(y[i],a);
+			}
+
+		}
+		return y ;
+	}
+
+} // LinBox
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_domain_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-ell-matrix.h b/linbox/matrix/sparsematrix/sparse-ell-matrix.h
new file mode 100644
index 0000000..a4ea65b
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-ell-matrix.h
@@ -0,0 +1,1489 @@
+/* linbox/matrix/sparse-csr-matrix.h
+ * Copyright (C) 2013 the LinBox
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/sparsematrix/sparse-ell-matrix.h
+ * @ingroup sparsematrix
+ * @brief
+ */
+
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_ell_matrix_H
+#define __LINBOX_matrix_sparsematrix_sparse_ell_matrix_H
+
+#include <utility>
+#include <iostream>
+#include <algorithm>
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "linbox/field/hom.h"
+#include "sparse-domain.h"
+
+#ifndef LINBOX_ELL_TRANSPOSE
+#define LINBOX_ELL_TRANSPOSE 1000
+#endif
+
+namespace LinBox
+{
+
+
+	/** Sparse matrix, Coordinate storage.
+	 *
+	 * \ingroup matrix
+	 * \ingroup sparse
+	 */
+	template<class _Field>
+	class SparseMatrix<_Field, SparseMatrixFormat::ELL > {
+	public :
+		typedef _Field                             Field ; //!< Field
+		typedef typename _Field::Element         Element ; //!< Element
+		typedef const Element               constElement ; //!< const Element
+		typedef SparseMatrixFormat::ELL         Storage ; //!< Matrix Storage Format
+		typedef SparseMatrix<_Field,Storage>     Self_t ; //!< Self type
+		typedef typename Vector<Field>::SparseSeq    Row ; //!< @warning this is not the row type. Just used for streams.
+		// typedef Vector<_Field,VectorStorage::Sparse> Rep ;
+
+		/*! Constructors.
+		 * @todo convert from other matrix.
+		 *
+		 */
+		//@{
+#if 0 /*  No empty CSTOR */
+		SparseMatrix<_Field, SparseMatrixFormat::ELL> () :
+			_rownb(0),_colnb(0),_maxc(0)
+			,_nbnz(0)
+			,_colid(0),_data(0)
+			, _field()
+			, _helper()
+		{
+		}
+#endif
+
+		SparseMatrix<_Field, SparseMatrixFormat::ELL> (const _Field & F) :
+			_rownb(0),_colnb(0)
+			,_maxc(0)
+			,_nbnz(0)
+			,_colid(0)
+			,_data(0)
+			, _field(F)
+			, _helper()
+		{
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::ELL> (const _Field & F, size_t m, size_t n) :
+			_rownb(m),_colnb(n)
+			,_maxc(0)
+			,_nbnz(0)
+			,_colid(0)
+			,_data(0)
+			, _field(F)
+			, _helper()
+		{
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::ELL> (const _Field & F,
+							       size_t m, size_t n,
+							       size_t z) :
+			_rownb(m),_colnb(n)
+			, _maxc(0)
+			, _nbnz(z)
+			, _colid(z)
+			,_data(z)
+			, _field(F)
+			, _helper()
+		{
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::ELL> (const SparseMatrix<_Field, SparseMatrixFormat::CSR> & S) :
+			_rownb(S._rownb),_colnb(S._colnb)
+			,_maxc(S._maxc)
+			,_nbnz(S._nbnz)
+			, _colid(S._colid)
+			,_data(S._data)
+			, _field(S._field)
+			, _helper()
+		{
+		}
+
+#if 0
+		template<class _OtherField>
+		SparseMatrix<_Field, SparseMatrixFormat::COO> (const SparseMatrix<_OtherField, SparseMatrixFormat::COO> & S) :
+			_rownb(S._rownb),_colnb(S._colnb),
+			_nbnz(S._nbnz),
+			_rowid(S._rowid),_colid(S._colid),_data(S._data),
+			_field(S._field)
+		{}
+#endif
+
+		template<typename _Tp1, typename _Rw1 = SparseMatrixFormat::ELL>
+		struct rebind {
+			typedef SparseMatrix<_Tp1, _Rw1> other;
+		private:
+
+			template<class _Rw>
+			void rebindMethod(SparseMatrix<_Tp1, _Rw> & Ap, const Self_t & A  /*, IndexedCategory::HasNext */)
+			{
+				typename _Tp1::Element e;
+				Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+
+				size_t i, j ;
+				Element f ;
+				A.firstTriple();
+				while ( A.nextTriple(i,j,f) ) {
+					linbox_check(i < A.rowdim() && j < A.coldim()) ;
+					hom. image ( e, f) ;
+					if (! Ap.field().isZero(e) )
+						Ap.appendEntry(i,j,e);
+				}
+				A.firstTriple();
+				Ap.finalize();
+			}
+
+			void rebindMethod(SparseMatrix<_Tp1, Storage>  & Ap, const Self_t & A /*,  IndexedCategory::HasNext*/)
+			{
+				// we don't use nextTriple because we can do better.
+				linbox_check(A.consistent());
+				// Ap = new other(F, A.rowdim(), A.coldim());
+				Ap.resize(A.rowdim(),A.coldim(),A.size(),A.ld());
+
+				typename _Tp1::Element e;
+
+				Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+				size_t newz = 0 ;
+				for (size_t i = 0 ; i < A.rowdim() ; ++i) {
+					size_t j = 0 ;
+					for (size_t k = 0 ; k < A.ld() ; ++k) {
+						if (A.field().isZero(A.getData(i,k))) {
+							break;
+						}
+						hom. image ( e, A.getData(i,k) );
+						if (!Ap.field().isZero(e)) {
+							Ap.setColid(i,j,A.getColid(i,k));
+							Ap.setData(i,j,e);
+							++j;
+						}
+						else {
+							++newz ;
+						}
+					}
+				}
+				Ap.setSize(Ap.size() - newz) ;
+			}
+
+		public:
+
+			void operator() (other & Ap, const Self_t& A)
+			{
+				rebindMethod(Ap, A );
+
+			}
+
+		};
+
+		template<typename _Tp1, typename _Rw1>
+		SparseMatrix (const SparseMatrix<_Tp1, _Rw1> &S, const Field& F) :
+			_rownb(S.rowdim()),_colnb(S.coldim())
+			,_maxc(0)
+			,_nbnz(S.size())
+			, _colid(0)
+			,_data(0)
+			, _field(F)
+		{
+			typename SparseMatrix<_Tp1,_Rw1>::template rebind<Field,Storage>()(*this, S);
+			finalize();
+		}
+
+
+
+
+		template<class VectStream>
+		SparseMatrix<_Field, SparseMatrixFormat::ELL> (const _Field & F, VectStream & stream) :
+			_rownb(stream.size()),_colnb(stream.dim())
+			, _maxc(0)
+			, _nbnz(0)
+			, _colid(0)
+			,_data(0)
+			, _field(F)
+		{
+			//! @todo
+			SparseMatrix<_Field,SparseMatrixFormat::CSR> Tmp(F,stream);
+			importe(Tmp);
+			finalize();
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::ELL> ( MatrixStream<Field>& ms ):
+			_rownb(0),_colnb(0)
+			,_maxc(0)
+			,_nbnz(0)
+			,_colid(0)
+			,_data(0)
+			,_field(ms.field())
+		{
+			firstTriple();
+
+			Element val;
+			size_t i, j;
+			while( ms.nextTriple(i,j,val) ) {
+				if (! field().isZero(val)) {
+					if( i >= _rownb ) {
+						// _rownb = i + 1;
+						resize(i+1,_colnb,_nbnz,(size_t)_maxc);
+					}
+					if( j >= _colnb ) {
+						// _colnb = j + 1;
+						resize(_rownb,j+1,_nbnz,(size_t)_maxc);
+					}
+					appendEntry(i,j,val);
+				}
+			}
+			if( ms.getError() > END_OF_MATRIX )
+				throw ms.reportError(__func__,__LINE__);
+			if( !ms.getDimensions( i, j ) )
+				throw ms.reportError(__func__,__LINE__);
+#ifndef NDEBUG
+			if( i != _rownb  || j != _colnb) {
+				std::cout << " ***Warning*** the sizes got changed" << __func__ << ',' << __LINE__ << std::endl;
+			}
+#endif
+
+			firstTriple();
+			finalize();
+			linbox_check(consistent());
+		}
+
+
+		void resize(const size_t   mm, const size_t   nn, const size_t   zz = 0, const size_t   ll = 0)
+		{
+			// linbox_check(_rownb*_maxc == _colid.size());
+			// attention RowMajor/ColMajor
+			if (!_maxc || mm == _maxc) {
+				_colid.resize(mm*ll,0);
+				_data .resize(mm*ll,field().zero);
+			}
+			else if ( ll > _maxc) {
+				reshape(ll);
+			}
+			else {
+#ifndef NDEBUG
+				if (_maxc && ll != _maxc)
+					std::cout << " ***Warning*** possibly loosing data in ELL resize " << std::endl;
+#endif
+				_colid.resize(mm*ll,0);
+				_data .resize(mm*ll,field().zero);
+			}
+			_rownb = mm ;
+			_colnb = nn ;
+			_nbnz  = zz;
+			_maxc  = ll;
+
+			linbox_check(_rownb*_maxc == _colid.size());
+		}
+
+		/*! Default converter.
+		 * @param S a sparse matrix in any storage.
+		 */
+		template<class _OtherStorage>
+		SparseMatrix<_Field, SparseMatrixFormat::ELL> (const SparseMatrix<_Field, _OtherStorage> & S) :
+			_rownb(S.rowdim()),_colnb(S.coldim())
+			,_nbnz(S.size())
+			,_maxc(0)
+			,_colid(0)
+			,_data(0)
+			,_field(S.field())
+		{
+			// _nbnz is set there:
+			this->importe(S); // convert Temp from anything
+		}
+
+
+
+		//@}
+		/*! Conversions.
+		 * Any sparse matrix has a converter to/from CSR.
+		 * A specialisation can skip the temporary CSR matrix created.
+		 */
+		//@{
+		/*! Import a matrix in COO format to CSR.
+		 * @param S COO matrix to be converted in CSR
+		 */
+		void importe(const SparseMatrix<_Field,SparseMatrixFormat::CSR> &S)
+		{
+			// can be sped up on multicores.
+			for (size_t i = 0 ; i < S.rowdim() ; ++i)
+				_maxc = std::max(_maxc, (size_t)(S.getEnd(i)-S.getStart(i)));
+
+			resize(S.rowdim(), S.coldim(), S.size(),(size_t)_maxc);
+
+			for (size_t i = 0 ; i < S.rowdim() ; ++i) {
+				size_t k = 0 ;
+				for (size_t j = S.getStart(i) ; j < S.getEnd(i) ; ++j, ++k) {
+					setColid(i,k,S.getColid(j));
+					setData(i,k,S.getData(j));
+				}
+			}
+
+		}
+
+		/*! Import a matrix in CSR format to CSR.
+		 * @param S CSR matrix to be converted in CSR
+		 */
+
+		void importe(const SparseMatrix<_Field,SparseMatrixFormat::ELL> &S)
+		{
+			resize( S.rowdim(), S.coldim(), S.size() , S.ld());
+
+			setColid(S.getColid());
+			setData(S.getData());
+
+		}
+
+		template<class _OtherStorage>
+		void importe(const SparseMatrix<_Field,_OtherStorage> &S)
+		{
+			SparseMatrix<_Field,SparseMatrixFormat::CSR> Tmp(S);
+			this->importe(S);
+
+		}
+
+		/*! Export a matrix in CSR format from COO.
+		 * @param S CSR matrix to be converted from COO
+		 */
+		SparseMatrix<_Field,SparseMatrixFormat::CSR > &
+		exporte(SparseMatrix<_Field,SparseMatrixFormat::CSR> &S) const
+		{
+			linbox_check(consistent());
+
+			S.resize(_rownb, _colnb, _nbnz);
+			S.setStart(0,0);
+			size_t k = 0 ;
+			for (size_t i = 0 ; i < S.rowdim() ; ++i) {
+				for (size_t j = 0  ; j < _maxc; ++j ) {
+					if (field().isZero(getData(i,j)))
+						break;
+					S.setColid(k,getColid(i,j));
+					S.setData(k,getData(i,j));
+					++k;
+				}
+				S.setStart(i+1,k);
+			}
+			linbox_check(k == _nbnz);
+
+			return S ;
+		}
+
+
+		//@}
+
+		/*! In place transpose. Not quite...
+		*/
+		void transposeIn()
+		{
+			Self_t Temp(*this);
+			Temp.transpose(*this);
+		}
+
+		/*! Transpose the matrix.
+		 *  @param S [out] transpose of self.
+		 *  @return a reference to \p S.
+		 */
+		Self_t &
+		transpose(Self_t &S) const
+		{
+			// outStart
+			size_t maxc = 0;
+			{
+				std::vector<size_t> start(coldim(),0);
+
+				for (size_t i = 0 ; i < rowdim() ; ++i) {
+					for (size_t j = 0 ; j < _maxc ; ++j) {
+						if (!field().isZero(getData(i,j)))
+							start[getColid(i,j)] += 1 ;
+						else
+							break;
+					}
+				}
+
+				maxc = start[0] ;
+				for (size_t i = 1 ; i < coldim() ; ++i)
+					maxc= std::max(maxc, start[i]);
+			}
+
+
+
+			S.resize((size_t)_colnb, (size_t)_rownb, (size_t)_nbnz, (size_t)maxc ); // necessary copy to temp, no const ref
+
+			{
+				std::vector<size_t> done_col(coldim(),0);
+
+
+				for (size_t i = 0 ; i < rowdim() ; ++i) {
+					for (size_t j = 0 ; j < _maxc ; ++j) {
+						if (!field().isZero(getData(i,j))) {
+							size_t loc_col = getColid(i,j) ;
+							S.setData (loc_col,done_col[loc_col],getData(i,j));
+							S.setColid(loc_col,done_col[loc_col],i);
+
+							linbox_check(done_col[loc_col] < maxc);
+							done_col[loc_col] += 1 ;
+
+						}
+						else
+							break;
+					}
+				}
+			}
+
+			S.finalize();
+
+
+			return S;
+
+
+		}
+
+		/*! number of rows.
+		 * @return row dimension.
+		 */
+		size_t rowdim() const
+		{
+			return _rownb ;
+		}
+
+		/*! number of columns.
+		 * @return column dimension
+		 */
+		size_t coldim() const
+		{
+			return _colnb ;
+		}
+
+		/*! Number of non zero elements in the matrix.
+		 * or at least the size of the _data if
+		 * @return size of the _data.
+		 */
+		size_t size() const
+		{
+			// return _data.size();
+			return _nbnz ;
+		}
+
+		void setSize(const size_t  z)
+		{
+			_nbnz = z ;
+		}
+
+
+		/** Get a read-only individual entry from the matrix.
+		 * @param i Row _colid
+		 * @param j Column _colid
+		 * @return Const reference to matrix entry
+		 */
+		constElement &getEntry(const size_t &i, const size_t &j) const
+		{
+			ptrdiff_t off = _triples.next(_maxc);
+			size_t ii = i ;
+			while ( field().isZero(_data[ii*_maxc+off]) )  {
+				_triples._off = off = 0;
+				_triples._row = ii  = ii+1 ;
+			}
+			if (  i == ii &&  _colid[ii*_maxc+off]  == j  ) { /* sort of nextTriple */
+				linbox_check(!field().isZero(_data[ii*_maxc+off]));
+				return _data[ii*_maxc+off];
+			}
+			else { /* searching */
+
+				linbox_check(consistent());
+
+				linbox_check(i<_rownb);
+				linbox_check(j<_colnb);
+
+				const size_t * beg = &_colid[i*_maxc];
+				const Element * dat = &_data[i*_maxc];
+				for (size_t k = 0 ; k < _maxc ; ++k) {
+					if ( field().isZero(dat[k])) {
+						return field().zero;
+					}
+					// replace
+					if (beg[k] == j) {
+						_triples._off = k;
+						_triples._row = i;
+						return dat[k];
+					}
+					if (beg[k] > j) {
+						return field().zero;
+					}
+				}
+				return field().zero;
+			}
+
+		}
+
+		Element      &getEntry (Element &x, size_t i, size_t j) const
+		{
+			return x = getEntry (i, j);
+		}
+
+		void appendEntry(const size_t &i, const size_t &j, const Element& e)
+		{
+			linbox_check(i < rowdim());
+			linbox_check(j < coldim());
+			linbox_check(_colid.size() == _data.size());
+			linbox_check(_rownb*_maxc == _colid.size());
+
+			if (field().isZero(e)) {
+				return ;
+			}
+			ptrdiff_t row = _triples._row ;
+			ptrdiff_t off = _triples._off ;
+			if (row != (ptrdiff_t)i) { /* new row */
+				linbox_check((ptrdiff_t)i>row);
+				_triples._row = i ;
+				_triples._off = 0 ;
+				if (_maxc == 0) {
+					insert(i,_maxc,j,e);
+				}
+				else {
+					linbox_check(i*_maxc < _colid.size());
+					_colid[i*_maxc] = j ;
+					_data [i*_maxc] = e ;
+					++_nbnz;
+				}
+			}
+			else { /* same row */
+				linbox_check(_triples._row == i);
+				_triples._off = off = off + 1 ;
+				if (off == (ptrdiff_t)_maxc) {
+					insert(i,_maxc,j,e);
+				}
+				else {
+					linbox_check(i*_maxc+off < _colid.size());
+					_colid[i*_maxc+off] = j ;
+					_data [i*_maxc+off] = e ;
+					++_nbnz;
+				}
+
+			}
+			linbox_check(_rownb*_maxc == _colid.size());
+		}
+
+		/// make matrix ready to use after a sequence of setEntry calls.
+		void finalize(){
+			// could check that maxc is not too large and shrink ? Is is optimize job ?
+			_triples.reset();
+		} // end construction after a sequence of setEntry calls.
+
+		/** Set an individual entry.
+		 * Setting the entry to 0 will not remove it from the matrix
+		 * @param i Row _colid of entry
+		 * @param j Column _colid of entry
+		 * @param value Value of the new entry
+		 * @todo make it faster if i is 0 or m-1 ?
+		 * @warning if this is used to build a matrix and this matrix is "well formed",
+		 * it can be sped up (no checking that the entry already exists).
+		 */
+		void setEntry(const size_t &i, const size_t &j, const Element& e
+			     )
+		{
+			linbox_check(i<_rownb);
+			linbox_check(j<_colnb);
+
+			linbox_check(consistent());
+
+			if (field().isZero(e)) {
+				return clearEntry(i,j);
+			}
+
+			size_t * beg = &_colid[i*_maxc];
+			Element * dat = &_data[i*_maxc];
+			bool found = false;
+			for (size_t k = 0 ; k < _maxc ; ++k) {
+				if ( field().isZero(dat[k])) {
+					field().assign(dat[k], e) ;
+					beg[k] = j;
+					found = true;
+					++_nbnz ;
+					break;
+				}
+				if (beg[k] == j) {
+					if (field().isZero(dat[k])) {
+						++_nbnz ;
+					}
+					field().assign(dat[k], e) ;
+					beg[k] = j;
+					found = true;
+					break;
+				}
+				if (beg[k] > j) {
+					found = true;
+					insert(i,k,j,e);
+					break;
+				}
+			}
+			if (!found) {
+				insert(i,_maxc,j,e);
+			}
+		}
+
+#if 0
+		/** Get a writeable reference to an entry in the matrix.
+		 * If there is no entry at the position (i, j), then a new entry
+		 * with a value of zero is inserted and a reference  to it is
+		 * returned.
+		 * @param i Row _colid of entry
+		 * @param j Column _colid of entry
+		 * @return Reference to matrix entry
+		 */
+		Element &refEntry(const size_t &i, const size_t&j)
+		{
+			linbox_check(i<_rownb);
+			linbox_check(j<_colnb);
+			// Could be improved by adding an initial guess j/rowdim*size()
+
+			size_t ibeg = _start[i];
+			size_t iend = _start[i+1];
+			if (ibeg==iend) {
+				for (size_t k = i+1 ; k <= _rownb ; ++k) _start[k] +=1 ;
+				_colid.insert(_colid.begin()+ibeg,j);
+				_data.insert( _data.begin() +ibeg,field().zero);
+				return _data[ibeg];
+			}
+			typedef typename std::vector<size_t>::iterator myIterator ;
+			myIterator beg = _colid.begin() ;
+			myIterator low = std::lower_bound (beg+(ptrdiff_t)ibeg, beg+(ptrdiff_t)iend, j);
+			if (low == beg+(ptrdiff_t)iend) {
+				for (size_t k = i+1 ; k <= _rownb ; ++k) _start[k] +=1 ;
+				_colid.insert(_colid.begin()+ibeg,j);
+				_data.insert( _data.begin() +ibeg,field().zero);
+				return _data[ibeg];
+			}
+			else {
+				size_t la = low-_colid.begin() ;
+				return _data[la] ;
+			}
+		}
+#endif
+
+		/** Write a matrix to the given output stream using field read/write.
+		 * @param os Output stream to which to write the matrix
+		 * @param format Format with which to write
+		 */
+		std::ostream & write(std::ostream &os
+				     , LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::MatrixMarket) const
+		{
+			return SparseMatrixWriteHelper<Self_t>::write(*this,os,format);
+		}
+
+
+		/** Read a matrix from the given input stream using field read/write
+		 * @param is Input stream from which to read the matrix
+		 * @param format Format of input matrix
+		 * @return ref to \p is.
+		 */
+		std::istream& read (std::istream &is
+				    , LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::Detect)
+		{
+			return SparseMatrixReadHelper<Self_t>::read(*this,is,format);
+		}
+
+		/*! @internal
+		 * @brief Deletes the entry.
+		 * Deletes \c A(i,j) if it exists.
+		 * @param i row _colid
+		 * @param j col _colid
+		 * @bug rows are increasing order => faster search.
+		 */
+		void clearEntry(const size_t &i, const size_t &j)
+		{
+			linbox_check(i<_rownb);
+			linbox_check(j<_colnb);
+
+			size_t k = 0 ;
+			for ( ; k < _maxc ; ++k) {
+				if (_colid[i*_maxc+k] == j)
+					break;
+				if (_colid[i*_maxc+k] > j)
+					return;
+			}
+			if (k == _maxc)
+				return; // not found
+
+			if (field().isZero(_data[i*_maxc+k]) && _colid[i*_maxc+k] == 0)
+				return;
+
+			for (size_t l = k ; l < _maxc-1 ; ++l) {
+				field().assign(_data[i*_maxc+l],_data[i*_maxc+l+1]);
+				_colid[i*_maxc+l] = _colid[i*_maxc+l+1];
+			}
+			field().assign(_data[i*_maxc+_maxc-1],field().zero) ;
+			_colid[i*_maxc+_maxc-1] = 0;
+			--_nbnz;
+		}
+
+		/*! @internal
+		 * @brief cleans 0 entries.
+		 */
+		void clean()
+		{
+#if 0
+			size_t i = 0 ;
+			while(i < _data.size()) {
+				if ( field().isZero(_data[i]) ) {
+					for (size_t k = i+1 ; k <= _rownb ; ++k) _start[k] -= 1 ;
+					_colid.erase(_colid.begin()+i);
+					_data. erase(_data. begin()+i);
+				}
+				else
+					++i ;
+			}
+			return ;
+#endif
+		}
+
+		// y= Ax
+		// y[i] = sum(A(i,j) x(j)
+		template<class Vector>
+		Vector& apply(Vector &y, const Vector& x, const Element & a ) const
+		{
+			// linbox_check(consistent());
+			prepare(field(),y,a);
+
+
+			FieldAXPY<Field> accu(field());
+			for (size_t i = 0 ; i < _rownb ; ++i) {
+				accu.reset();
+				for (size_t k = 0   ; k < _maxc ; ++k)
+					if (!field().isZero(getData(i,k)))
+						// field().axpyin( y[i], getData(i,k), x[getColid(i,k)] ); //! @todo delay !!!
+						accu.mulacc( getData(i,k), x[getColid(i,k)] );
+					else {
+						break;
+					}
+				accu.get(y[i]);
+			}
+
+			return y;
+		}
+
+
+		// y= A^t x
+		// y[i] = sum(A(j,i) x(j)
+		template<class Vector>
+		Vector& applyTranspose(Vector &y, const Vector& x, const Element & a ) const
+		{
+			linbox_check(consistent());
+			if (_helper.optimized(*this)) {
+				return _helper.matrix().apply(y,x,a) ; // NEVER use applyTranspose on that thing.
+			}
+
+			prepare(field(),y,a);
+
+
+#if 0
+			for (size_t i = 0 ; i < _rownb ; ++i)
+				for (size_t k = 0   ; k < _maxc ; ++k)
+					if (!field().isZero(getData(i,k)))
+						field().axpyin(y[getColid(i,k)], getData(i,k), x[i] ); //! @todo delay !!!
+					else
+						break;
+#else
+			const FieldAXPY<Field> accu0(field());
+			std::vector<FieldAXPY<Field> > Y(_colnb, accu0);
+
+
+			for (size_t i = 0 ; i < _rownb ; ++i)
+				for (size_t k = 0   ; k < _maxc ; ++k)
+					if (!field().isZero(getData(i,k)))
+						Y[getColid(i,k)].mulacc( getData(i,k), x[i] );
+					else
+						break;
+
+			for (size_t i = 0 ; i < _colnb ; ++i)
+				Y[i].get(y[i]) ;
+#endif
+
+			return y;
+		}
+
+
+
+		template<class inVector, class outVector>
+		outVector& apply(outVector &y, const inVector& x ) const
+		{
+			return apply(y,x,field().zero);
+		}
+
+		template<class inVector, class outVector>
+		outVector& applyTranspose(outVector &y, const inVector& x ) const
+		{
+			return applyTranspose(y,x,field().zero);
+		}
+
+		const Field & field()  const
+		{
+			return _field ;
+		}
+
+		/** @todo Non element marker.
+		 * We could end up a line with a marker.
+		 * A field F would contain an element that does not belong to
+		 * it. eg a nan for a Givaro::Modular<double>. It could act as a
+		 * marker.
+		 */
+		bool consistent() const
+		{
+			size_t nbnz = 0 ;
+			if (_rownb * _maxc != _data.size()) {
+				std::cout << "bad data size" << std::endl;
+				return false;
+			}
+			if (_data.size() != _colid.size()) {
+				std::cout << "bad colid size" << std::endl;
+				return false;
+			}
+			// bool ok = true ;
+			for (size_t i = 0 ; i < _rownb ; ++i) {
+				// bool row_ok = true ;
+				bool zero = false ;
+				for (size_t j = 0 ; j < _maxc ; ++j) {
+					if (field().isZero(getData(i,j))) {
+						zero = true ;
+					}
+					else {
+						if (zero) {
+							std::cout << "non zero after a 0" << std::endl;
+							return false ; // elements after a 0...
+						}
+						++nbnz ;
+
+					}
+				}
+			}
+			if (nbnz != _nbnz)
+				std::cout << "bad number of non zero" << std::endl;
+			return (nbnz == _nbnz);
+
+		}
+
+
+
+	private :
+
+		class Helper {
+			bool _useable ;
+			bool _optimized ;
+			bool blackbox_usage ;
+			Self_t *_AT ;
+		public:
+
+			Helper() :
+				_useable(false)
+				,_optimized(false)
+				, blackbox_usage(true)
+				, _AT(NULL)
+			{}
+
+			~Helper()
+			{
+				if ( _AT ) {
+					delete _AT ;
+				}
+			}
+
+			bool optimized(const Self_t & A)
+			{
+				if (!_useable) {
+					getHelp(A);
+					_useable = true;
+				}
+				return	_optimized;
+			}
+
+			void getHelp(const Self_t & A)
+			{
+				if ( A.size() > LINBOX_ELL_TRANSPOSE ) { // and/or A.rowDensity(), A.coldim(),...
+					// std::cout << "optimizing..." ;
+					_optimized = true ;
+					_AT = new Self_t(A.field(),A.coldim(),A.rowdim());
+					A.transpose(*_AT);
+					// std::cout << "done!" << std::endl;
+				}
+			}
+
+			const Self_t & matrix() const
+			{
+				return *_AT ;
+			}
+
+		};
+
+
+
+		void reshape(const size_t ll)
+		{
+			linbox_check(_rownb*_maxc == _colid.size());
+			linbox_check(ll > _maxc);
+
+			_data .resize(ll*_rownb);
+			_colid.resize(ll*_rownb);
+			for (size_t i = _rownb ; i>0 ; --i ) {
+				// std::copy(_data.begin()+(i-1)*_maxc, _data.begin()+(i)*_maxc, _data.begin()+(i-1)*ll);
+				std::copy_backward(_data.begin()+(ptrdiff_t)((i-1)*_maxc), _data.begin()+(ptrdiff_t)((i)*_maxc), _data.begin()+(ptrdiff_t)((i-1)*ll+_maxc));
+				for (size_t j = (i-1)*ll+_maxc ; j < (i)*ll ; ++j )
+					_data[j] = field().zero ;
+			}
+			for (size_t i = _rownb ; i>0 ; --i ) {
+				// std::copy(_colid.begin()+(i-1)*_maxc, _colid.begin()+(i)*_maxc, _colid.begin()+(i-1)*ll);
+				std::copy_backward(_colid.begin()+(ptrdiff_t)((i-1)*_maxc), _colid.begin()+(ptrdiff_t)((i)*_maxc), _colid.begin()+(ptrdiff_t)((i-1)*ll+_maxc));
+				for (size_t j = (i-1)*ll+_maxc ; j < (i)*ll ; ++j )
+					_colid[j] = 0 ;
+			}
+
+			_maxc = ll ;
+			linbox_check(_rownb*_maxc == _colid.size());
+		}
+
+	public:
+		// pseudo iterators
+
+		size_t getColid(const size_t & i, const size_t j) const
+		{
+			linbox_check(i < _rownb);
+			linbox_check(_maxc*_rownb == _colid.size());
+			return _colid[i*_maxc+j];
+		}
+
+		void setColid(const size_t & i, const size_t & j, const size_t & k)
+		{
+			linbox_check(i < _rownb);
+			linbox_check(i*_maxc+j < _colid.size());
+			linbox_check(_maxc*_rownb == _colid.size());
+
+			_colid[i*_maxc+j]=k;
+		}
+
+		void setColid(std::vector<size_t> new_colid)
+		{
+			_colid = new_colid ;
+		}
+
+		std::vector<size_t>  getColid( ) const
+		{
+			return _colid ;
+		}
+
+		const Element & getData(const size_t & i, const size_t & j) const
+		{
+			linbox_check(i < _rownb);
+			linbox_check(j < _colnb);
+			linbox_check(_maxc*_rownb == _colid.size());
+			return _data[ i*_maxc+j ];
+		}
+
+		void setData(const size_t & i, const size_t & j, const Element & e)
+		{
+			linbox_check(i*_maxc+j < _data.size());
+			linbox_check(_maxc*_rownb == _colid.size());
+			field().assign(_data[i*_maxc+j],e);
+		}
+
+		void setData(const std::vector<Element> & new_data)
+		{
+			_data = new_data ;
+		}
+
+		std::vector<Element>  getData( ) const
+		{
+			return _data ;
+		}
+
+		size_t ld() const
+		{
+			return _maxc;
+		}
+
+		void firstTriple() const
+		{
+			_triples.reset();
+		}
+
+		// a zero means end of line
+		bool nextTriple(size_t & i, size_t &j, Element &e) const
+		{
+			size_t off = (size_t)_triples.next(_maxc);
+
+			i = (size_t)_triples._row ;
+
+			if (  i >= rowdim() ) {
+				_triples.reset() ;
+				return false ;
+			}
+
+			while ( field().isZero(_data[i*_maxc+off]) )  {
+				off = 0 ; i++;
+				_triples._off = (ptrdiff_t)off ;
+				_triples._row = (ptrdiff_t)i   ;
+				if (i >= rowdim()) {
+					_triples.reset();
+					return false;
+				}
+			}
+
+			j = _colid[i*_maxc+off];
+			e = _data[i*_maxc+off];
+
+			return true;
+		}
+
+		template<class element_iterator, class Field>
+		class _Iterator {
+		private :
+			element_iterator _data_it ;
+			const element_iterator _data_beg ;
+			const element_iterator _data_end ;
+			const Field & _field ;
+			typedef typename Field::Element Element;
+		public:
+			typedef Element value_type ;
+			_Iterator(const Field & F , const element_iterator & e_beg, const element_iterator & e_end) :
+				_data_it(e_beg)
+				, _data_beg(e_beg)
+				, _data_end(e_end)
+				,_field(F)
+			{}
+
+			_Iterator (const _Iterator &iter) :
+				_data_it(iter._data_it)
+				, _data_beg(iter._data_beg)
+				, _data_end(iter._data_end)
+				,_field(iter._field)
+
+			{}
+
+			_Iterator &operator = (const _Iterator &iter)
+			{
+				_data_it  = iter._data_it  ;
+				_data_beg  = iter._data_beg  ;
+				_data_end  = iter._data_end  ;
+				_field  = iter._field  ;
+
+				return *this;
+			}
+
+			bool operator == (const _Iterator &i) const
+			{
+				return  (_data_it == i._data_it) ;
+			}
+
+			bool operator != (const _Iterator &i) const
+			{
+				return  (_data_it != i._data_it) ;
+			}
+
+			_Iterator &operator ++ ()
+			{
+				do {
+					++_data_it ;
+				} while (_data_it  != _data_end && _field.isZero(*_data_it));
+				if (_data_it == _data_end)
+					return *this ;
+			}
+
+			_Iterator operator ++ (int)
+			{
+				_Iterator tmp = *this;
+				++(*this);
+				return tmp;
+			}
+
+			_Iterator &operator -- ()
+			{
+				throw NotImplementedYet("not sure");
+				do {
+					--_data_it ;
+				} while (_data_it  != _data_beg && _field.isZero(*_data_it));
+				if (_data_it == _data_beg)
+					return *this ;
+			}
+
+			_Iterator operator -- (int)
+			{
+				_Iterator tmp = *this;
+				--(*this);
+				return tmp;
+			}
+
+			value_type &operator * ()
+			{
+				return *_data_it;
+			}
+
+			value_type *operator -> ()
+			{
+				return _data_it ;
+			}
+
+			const value_type &operator*() const
+			{
+				return *_data_it;
+			}
+
+			const value_type *operator -> () const
+			{
+				return _data_it ;
+			}
+
+			const value_type &value() const
+			{
+				return *_data_it;
+			}
+
+		};
+
+		template<class index_iterator, class element_iterator, class Field>
+		class _IndexedIterator {
+		private :
+			typedef  index_iterator    index_it ;
+			typedef  element_iterator  data_it ;
+			index_it _colid_beg ;
+			index_it _colid_it ;
+			data_it _data_it ;
+			const data_it _data_beg ;
+			const data_it _data_end ;
+			const Field & _field ;
+			const size_t & _ld ;
+			size_t  _row ;
+			typedef typename Field::Element Element;
+		public:
+			typedef Element value_type ;
+			_IndexedIterator( const Field & F
+					  , const size_t & ld
+					  , const index_it &j
+					  , const data_it &e
+					  , const data_it &e_e) :
+				_colid_beg(j)
+				, _colid_it(j)
+				, _data_it(e)
+				, _data_beg(e)
+				, _data_end(e_e)
+				, _field(F)
+				, _ld(ld)
+				, _row(0)
+			{}
+
+			_IndexedIterator (const _IndexedIterator &iter) :
+				_colid_beg(iter._colid_beg)
+				, _colid_it(iter._colid_it)
+				, _data_it(iter._data_it)
+				, _data_beg(iter._data_beg)
+				, _data_end(iter._data_end)
+				, _field(iter._field)
+				, _ld(iter._ld)
+				, _row(iter._row)
+			{}
+
+			_IndexedIterator &operator = (const _IndexedIterator &iter)
+			{
+				_colid_beg = iter._colid_beg ;
+				_colid_it  = iter._colid_it ;
+				_data_it   = iter._data_it  ;
+				_data_beg  = iter._data_beg ;
+				_data_end  = iter._data_end  ;
+				_field     = iter._field ;
+				_ld        = iter._ld ;
+				_row       = iter._row ;
+
+				return *this;
+			}
+
+			bool operator == (const _IndexedIterator &i) const
+			{
+				// we assume consistency
+				return  (_data_it == i._data_it);
+			}
+
+			bool operator != (const _IndexedIterator &i) const
+			{
+				// we assume consistency
+				return  (_data_it != i._data_it) ;
+			}
+
+			_IndexedIterator &operator ++ ()
+			{
+
+				++_data_it  ;
+				if (_data_it == _data_end) {
+					return *this ;
+				}
+				if (std::distance(_data_beg,_data_it) % _ld == 0)
+					++_row ;
+
+				++_colid_it ;
+				while (_field.isZero(*_data_it)) {
+					++_row ;
+					_data_it = _data_beg + _row * _ld ;
+					_colid_it = _colid_beg + _row * _ld ;
+					if (_data_it == _data_end) {
+						return *this;
+					}
+				}
+
+				return *this;
+			}
+
+			_IndexedIterator operator ++ (int)
+			{
+				_IndexedIterator tmp = *this;
+				++(*this);
+				return tmp;
+			}
+
+			_IndexedIterator &operator -- ()
+			{
+				throw NotImplementedYet("not sure");
+
+				--_data_it  ;
+				if (_data_it == _data_beg) {
+					return *this ;
+				}
+				if (std::distance(_data_beg,_data_it) % _ld == 0)
+					--_row ;
+
+				--_colid_it ;
+				while (_field.isZero(*_data_it)) {
+					--_row ;
+					_data_it = _data_beg + _row * _ld ;
+					_colid_it = _colid_beg + _row * _ld ;
+					if (_data_it == _data_beg) {
+						return *this;
+					}
+				}
+
+				return *this;
+			}
+
+			_IndexedIterator operator -- (int)
+			{
+				_IndexedIterator tmp = *this;
+				--(*this);
+				return tmp;
+			}
+
+			value_type &operator * ()
+			{
+				return *_data_it;
+			}
+
+			value_type *operator -> ()
+			{
+				return _data_it ;
+			}
+
+			const value_type &operator*() const
+			{
+				return *_data_it;
+			}
+
+			const value_type *operator -> () const
+			{
+				return _data_it ;
+			}
+
+			size_t rowIndex () const
+			{
+				return _row;
+			}
+
+			size_t colIndex () const
+			{
+				return *_colid_it;
+			}
+
+			const value_type &value() const
+			{
+				return *_data_it;
+			}
+
+
+		};
+
+		typedef _Iterator<typename std::vector<Element>::iterator, Element> Iterator;
+		typedef _Iterator<typename std::vector<Element>::const_iterator, constElement> ConstIterator;
+
+		typedef _IndexedIterator<std::vector<size_t>::iterator, typename std::vector<Element>::iterator, Field> IndexedIterator;
+		typedef _IndexedIterator<std::vector<size_t>::const_iterator, typename std::vector<Element>::const_iterator, const Field> ConstIndexedIterator;
+
+
+		Iterator      Begin ()
+		{
+			return Iterator(field(),_data.begin(),_data.end()) ;
+		}
+
+		Iterator      End   ()
+		{
+			return Iterator(field(),_data.end(), _data.end()) ;
+		}
+
+		ConstIterator      Begin () const
+		{
+			return ConstIterator(field(),_data.begin(),_data.end()) ;
+		}
+
+		ConstIterator      End   () const
+		{
+			return ConstIterator(field(),_data.end(), _data.end()) ;
+		}
+
+		IndexedIterator      IndexedBegin ()
+		{
+			return IndexedIterator(field(), _maxc , _colid.begin(), _data.begin(),_data.end()) ;
+		}
+
+		IndexedIterator      IndexedEnd   ()
+		{
+			return IndexedIterator(field(), _maxc, _colid.end(), _data.end(),_data.end()) ;
+		}
+
+		ConstIndexedIterator      IndexedBegin () const
+		{
+			return ConstIndexedIterator(field(), _maxc, _colid.begin(), _data.begin(),_data.end()) ;
+		}
+
+		ConstIndexedIterator      IndexedEnd   () const
+		{
+			return ConstIndexedIterator(field(), _maxc, _colid.end(), _data.end(),_data.end()) ;
+		}
+
+
+
+	private:
+
+		void insert (const size_t  i, const size_t  k, const size_t  j, const Element  e)
+		{
+			linbox_check(_rownb*_maxc == _colid.size());
+			if (k == _maxc) {
+				resize(_rownb,_colnb,_nbnz,_maxc+1);
+				linbox_check(_rownb*_maxc == _colid.size());
+				_colid[_maxc*i+k] = j;
+				field().assign(_data[_maxc*i+k],e);
+				++_nbnz;
+				return;
+			}
+			size_t l = k;
+			for ( ; l < _maxc ; ++l)
+				if (field().isZero(_data[i*_maxc+l]))
+					break;
+			if (l == _maxc)
+				resize(_rownb,_colnb,_nbnz,_maxc+1);
+
+			for (size_t u = l ; u > k ; --u) {
+				_colid[_maxc*i+u] = _colid[_maxc*i+u-1] ;
+				field().assign(_data[_maxc*i+u],_data[_maxc*i+u-1]);
+			}
+			_colid[_maxc*i+k] = j;
+			field().assign(_data[_maxc*i+k],e);
+			++_nbnz;
+			linbox_check(_rownb*_maxc == _colid.size());
+			return;
+		}
+
+		void write_raw() const
+		{
+			std::cout << "colids" << std::endl;
+			for (size_t i = 0 ; i < _rownb ; ++i){
+				for (size_t j = 0 ; j < _maxc ; ++j)
+					std::cout << _colid[i*_maxc+j] << ' ' ;
+				std::cout << std::endl;
+			}
+
+			std::cout << "data" << std::endl;
+			for (size_t i = 0 ; i < _rownb ; ++i){
+				for (size_t j = 0 ; j < _maxc ; ++j)
+					std::cout << _data[i*_maxc+j] << ' ' ;
+				std::cout << std::endl;
+			}
+		}
+
+	protected :
+		friend class SparseMatrixWriteHelper<Self_t >;
+		friend class SparseMatrixReadHelper<Self_t >;
+
+
+		size_t              _rownb ;
+		size_t              _colnb ;
+		size_t               _maxc ; //!< longest row
+		size_t               _nbnz ;
+
+		std::vector<size_t> _colid ; //!< \p _colid is \p _rownb x \p _maxc in RowMajor
+		std::vector<Element> _data ; //!< \p _data  is \p _rownb x \p _maxc in RowMajor
+
+		const _Field            & _field;
+
+		mutable Helper _helper ;
+
+		mutable struct _triples {
+			ptrdiff_t _row ;
+			ptrdiff_t _off ;
+			_triples() :
+				_row(-1)
+				, _off(-1)
+			{}
+
+			ptrdiff_t next(size_t maxc)
+			{
+				++ _off ;
+				if (_row == -1) {
+					++_row ;
+					return _off ;
+				}
+				if (_off >= (ptrdiff_t)maxc) {
+					_row += 1 ;
+					_off = 0 ;
+				}
+				return _off;
+			}
+
+			void reset()
+			{
+				_row = -1 ;
+				_off = -1 ;
+			}
+		}_triples;
+	};
+
+
+
+
+
+} // namespace LinBox
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_ell_matrix_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-ellr-matrix.h b/linbox/matrix/sparsematrix/sparse-ellr-matrix.h
new file mode 100644
index 0000000..7aebf80
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-ellr-matrix.h
@@ -0,0 +1,1542 @@
+/* linbox/matrix/sparse-csr-matrix.h
+ * Copyright (C) 2013 the LinBox
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/sparsematrix/sparse-ellr-matrix.h
+ * @ingroup sparsematrix
+ * @brief
+ */
+
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_ellr_matrix_H
+#define __LINBOX_matrix_sparsematrix_sparse_ellr_matrix_H
+
+#include <utility>
+#include <iostream>
+#include <algorithm>
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "linbox/field/hom.h"
+#include "sparse-domain.h"
+
+#ifndef LINBOX_ELLR_TRANSPOSE
+#define LINBOX_ELLR_TRANSPOSE 1000
+#endif
+
+namespace LinBox
+{
+
+
+	/** Sparse matrix, Coordinate storage.
+	 *
+	 * \ingroup matrix
+	 * \ingroup sparse
+	 */
+	template<class _Field>
+	class SparseMatrix<_Field, SparseMatrixFormat::ELL_R > {
+	public :
+		typedef _Field                             Field ; //!< Field
+		typedef typename _Field::Element         Element ; //!< Element
+		typedef const Element               constElement ; //!< const Element
+		typedef SparseMatrixFormat::ELL_R         Storage ; //!< Matrix Storage Format
+		typedef SparseMatrix<_Field,Storage>     Self_t ; //!< Self type
+		typedef typename Vector<Field>::SparseSeq    Row ; //!< @warning this is not the row type. Just used for streams.
+		// typedef Vector<_Field,VectorStorage::Sparse> Rep ;
+
+		/*! Constructors.
+		 * @todo convert from other matrix.
+		 *
+		 */
+		//@{
+#if 0 /*  No empty CSTOR */
+		SparseMatrix<_Field, SparseMatrixFormat::ELL_R> () :
+			_rownb(0),_colnb(0),_maxc(0)
+			,_nbnz(0)
+			,_colid(0),_data(0)
+			,_rowid(0)
+			, _field()
+			, _helper()
+		{
+		}
+#endif
+
+		SparseMatrix<_Field, SparseMatrixFormat::ELL_R> (const _Field & F) :
+			_rownb(0),_colnb(0)
+			,_maxc(0)
+			,_nbnz(0)
+			,_rowid(0)
+			,_colid(0)
+			,_data(0)
+			, _field(F)
+			, _helper()
+		{
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::ELL_R> (const _Field & F, size_t m, size_t n) :
+			_rownb(m),_colnb(n)
+			,_maxc(0)
+			,_nbnz(0)
+			,_rowid(m,0)
+			,_colid(0)
+			,_data(0)
+			, _field(F)
+			, _helper()
+		{
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::ELL_R> (const _Field & F,
+								 size_t m, size_t n,
+								 size_t z) :
+			_rownb(m),_colnb(n)
+			, _maxc(0)
+			, _nbnz(z)
+			, _rowid(m,0)
+			, _colid(z)
+			,_data(z)
+			, _field(F)
+			, _helper()
+		{
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::ELL_R> (const SparseMatrix<_Field, SparseMatrixFormat::CSR> & S) :
+			_rownb(S._rownb),_colnb(S._colnb)
+			,_maxc(S._maxc)
+			,_nbnz(S._nbnz)
+			,_rowid(S._rownb,0)
+			, _colid(S._colid)
+			,_data(S._data)
+			, _field(S._field)
+			, _helper()
+		{
+		}
+
+#if 0
+		template<class _OtherField>
+		SparseMatrix<_Field, SparseMatrixFormat::COO> (const SparseMatrix<_OtherField, SparseMatrixFormat::COO> & S) :
+			_rownb(S._rownb),_colnb(S._colnb),
+			_nbnz(S._nbnz),
+			_rowid(S._rowid),_colid(S._colid),_data(S._data),
+			_field(S._field)
+		{}
+#endif
+
+		template<typename _Tp1, typename _Rw1 = SparseMatrixFormat::ELL_R>
+		struct rebind {
+			typedef SparseMatrix<_Tp1, _Rw1> other;
+		private:
+
+			template<class _Rw>
+			void rebindMethod(SparseMatrix<_Tp1, _Rw> & Ap, const Self_t & A  /*, IndexedCategory::HasNext */)
+			{
+				typename _Tp1::Element e;
+				Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+
+				size_t i, j ;
+				Element f ;
+				A.firstTriple();
+				while ( A.nextTriple(i,j,f) ) {
+					linbox_check(i < A.rowdim() && j < A.coldim()) ;
+					hom. image ( e, f) ;
+					if (! Ap.field().isZero(e) )
+						Ap.appendEntry(i,j,e);
+				}
+				A.firstTriple();
+				Ap.finalize();
+			}
+
+			void rebindMethod(SparseMatrix<_Tp1, Storage>  & Ap, const Self_t & A /*,  IndexedCategory::HasNext*/)
+			{
+				// we don't use nextTriple because we can do better.
+				linbox_check(A.consistent());
+				// Ap = new other(F, A.rowdim(), A.coldim());
+				Ap.resize(A.rowdim(),A.coldim(),A.size(),A.ld());
+
+				typename _Tp1::Element e;
+
+				Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+				size_t newz = 0 ;
+				for (size_t i = 0 ; i < A.rowdim() ; ++i) {
+					size_t j = 0 ;
+					for (size_t k = 0 ; k < A.ld() ; ++k) {
+						if (A.field().isZero(A.getData(i,k))) {
+							Ap.setRowid(i,  k) ;
+							break;
+						}
+						hom. image ( e, A.getData(i,k) );
+						if (!Ap.field().isZero(e)) {
+							Ap.setColid(i,j,A.getColid(i,k));
+							Ap.setData(i,j,e);
+							++j;
+						}
+						else {
+							++newz ;
+						}
+					}
+					if (Ap.getRowid(i) == 0 && j>0)
+						Ap.setRowid(i,  A.ld()) ;
+				}
+				Ap.setSize(Ap.size() - newz) ;
+			}
+
+		public:
+
+			void operator() (other & Ap, const Self_t& A)
+			{
+				rebindMethod(Ap, A );
+
+			}
+
+		};
+
+		template<typename _Tp1, typename _Rw1>
+		SparseMatrix (const SparseMatrix<_Tp1, _Rw1> &S, const Field& F) :
+			_rownb(S.rowdim()),_colnb(S.coldim())
+			,_maxc(0)
+			,_nbnz(S.size())
+			, _rowid(S.rowdim(),0)
+			, _colid(0)
+			,_data(0)
+			, _field(F)
+		{
+			typename SparseMatrix<_Tp1,_Rw1>::template rebind<Field,Storage>()(*this, S);
+			finalize();
+		}
+
+
+
+
+		template<class VectStream>
+		SparseMatrix<_Field, SparseMatrixFormat::ELL_R> (const _Field & F, VectStream & stream) :
+			_rownb(stream.size()),_colnb(stream.dim())
+			, _maxc(0)
+			, _nbnz(0)
+			, _rowid(_rownb,0)
+			, _colid(0)
+			,_data(0)
+			, _field(F)
+		{
+			//! @todo
+			SparseMatrix<_Field,SparseMatrixFormat::CSR> Tmp(F,stream);
+			importe(Tmp);
+			finalize();
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::ELL_R> ( MatrixStream<Field>& ms ):
+			_rownb(0),_colnb(0)
+			,_maxc(0)
+			,_nbnz(0)
+			,_colid(0)
+			,_data(0)
+			,_field(ms.field())
+		{
+			firstTriple();
+
+			Element val;
+			size_t i, j;
+			while( ms.nextTriple(i,j,val) ) {
+				if (! field().isZero(val)) {
+					if( i >= _rownb ) {
+						// _rownb = i + 1;
+						resize(i+1,_colnb,_nbnz,(size_t)_maxc);
+					}
+					if( j >= _colnb ) {
+						// _colnb = j + 1;
+						resize(_rownb,j+1,_nbnz,(size_t)_maxc);
+					}
+					appendEntry(i,j,val);
+				}
+			}
+			if( ms.getError() > END_OF_MATRIX )
+				throw ms.reportError(__func__,__LINE__);
+			if( !ms.getDimensions( i, j ) )
+				throw ms.reportError(__func__,__LINE__);
+#ifndef NDEBUG
+			if( i != _rownb  || j != _colnb) {
+				std::cout << " ***Warning*** the sizes got changed" << __func__ << ',' << __LINE__ << std::endl;
+			}
+#endif
+
+			firstTriple();
+			finalize();
+			linbox_check(consistent());
+		}
+
+
+		void resize(const size_t  mm, const size_t  nn, const size_t  zz = 0, const size_t  ll = 0)
+		{
+			// linbox_check(_rownb*_maxc == _colid.size());
+			// attention RowMajor/ColMajor
+			if (!_maxc || mm == _maxc) {
+				_colid.resize(mm*ll,0);
+				_data .resize(mm*ll,field().zero);
+				_rowid.resize(mm   ,0);
+			}
+			else if ( ll > _maxc) {
+				reshape(ll);
+			}
+			else {
+#ifndef NDEBUG
+				if (_maxc && ll != _maxc)
+					std::cout << " ***Warning*** possibly loosing data in ELL resize " << std::endl;
+#endif
+				_colid.resize(mm*ll,0);
+				_data .resize(mm*ll,field().zero);
+				_rowid.resize(mm   ,0);
+			}
+			_rownb = mm ;
+			_colnb = nn ;
+			_nbnz  = zz;
+			_maxc  = ll;
+
+			linbox_check(_rownb*_maxc == _colid.size());
+		}
+
+		/*! Default converter.
+		 * @param S a sparse matrix in any storage.
+		 */
+		template<class _OtherStorage>
+		SparseMatrix<_Field, SparseMatrixFormat::ELL_R> (const SparseMatrix<_Field, _OtherStorage> & S) :
+			_rownb(S.rowdim()),_colnb(S.coldim())
+			,_nbnz(S.size())
+			,_rowid(S.rowdim(),0)
+			, _maxc(0)
+			,_colid(0)
+			,_data(0)
+			,_field(S.field())
+		{
+			// _nbnz is set there:
+			this->importe(S); // convert Temp from anything
+		}
+
+
+
+		//@}
+		/*! Conversions.
+		 * Any sparse matrix has a converter to/from CSR.
+		 * A specialisation can skip the temporary CSR matrix created.
+		 */
+		//@{
+		/*! Import a matrix in COO format to CSR.
+		 * @param S COO matrix to be converted in CSR
+		 */
+		void importe(const SparseMatrix<_Field,SparseMatrixFormat::CSR> &S)
+		{
+			// can be sped up on multicores.
+			for (size_t i = 0 ; i < S.rowdim() ; ++i)
+				_maxc = std::max(_maxc, (size_t)(S.getEnd(i)-S.getStart(i)));
+
+			resize(S.rowdim(), S.coldim(), S.size(),(size_t)_maxc);
+
+			for (size_t i = 0 ; i < S.rowdim() ; ++i) {
+				size_t k = 0 ;
+				for (size_t j = S.getStart(i) ; j < S.getEnd(i) ; ++j, ++k) {
+					setColid(i,k,S.getColid(j));
+					setData(i,k,S.getData(j));
+				}
+				_rowid[i] = S.getEnd(i)-S.getStart(i);
+			}
+
+		}
+
+		/*! Import a matrix in CSR format to CSR.
+		 * @param S CSR matrix to be converted in CSR
+		 */
+
+		void importe(const SparseMatrix<_Field,SparseMatrixFormat::ELL_R> &S)
+		{
+			resize( S.rowdim(), S.coldim(), S.size() , S.ld());
+
+			setRowid(S.getRowid());
+			setColid(S.getColid());
+			setData(S.getData());
+
+		}
+
+		template<class _OtherStorage>
+		void importe(const SparseMatrix<_Field,_OtherStorage> &S)
+		{
+			SparseMatrix<_Field,SparseMatrixFormat::CSR> Tmp(S);
+			this->importe(S);
+
+		}
+
+		/*! Export a matrix in CSR format from COO.
+		 * @param S CSR matrix to be converted from COO
+		 */
+		SparseMatrix<_Field,SparseMatrixFormat::CSR > &
+		exporte(SparseMatrix<_Field,SparseMatrixFormat::CSR> &S) const
+		{
+			linbox_check(consistent());
+
+			S.resize(_rownb, _colnb, _nbnz);
+			S.setStart(0,0);
+			size_t k = 0 ;
+			for (size_t i = 0 ; i < S.rowdim() ; ++i) {
+				for (size_t j = 0  ; j < _rowid[i]; ++j ) {
+					S.setColid(k,getColid(i,j));
+					S.setData(k,getData(i,j));
+					++k;
+				}
+				S.setStart(i+1,S.getStart(i)+_rowid[i]);
+			}
+			linbox_check(k == _nbnz);
+
+			return S ;
+		}
+
+
+		//@}
+
+		/*! In place transpose. Not quite...
+		*/
+		void transposeIn()
+		{
+			Self_t Temp(*this);
+			Temp.transpose(*this);
+		}
+
+		/*! Transpose the matrix.
+		 *  @param S [out] transpose of self.
+		 *  @return a reference to \p S.
+		 */
+		Self_t &
+		transpose(Self_t &S) const
+		{
+			// outStart
+			size_t maxc = 0;
+			{
+				S._rowid.resize(coldim());
+				for (size_t i = 0 ; i < coldim() ; ++i)
+					S._rowid[i] = 0 ;
+
+				for (size_t i = 0 ; i < rowdim() ; ++i) {
+					for (size_t j = 0 ; j < _maxc ; ++j) {
+						if (!field().isZero(getData(i,j)))
+							S._rowid[getColid(i,j)] += 1 ;
+						else
+							break;
+					}
+				}
+
+				maxc = S._rowid[0] ;
+				for (size_t i = 1 ; i < coldim() ; ++i)
+					maxc= std::max(maxc, S._rowid[i]);
+			}
+
+
+
+			S.resize((size_t)_colnb, (size_t)_rownb, (size_t)_nbnz, (size_t)maxc ); // necessary copy to temp, no const ref
+
+			{
+				std::vector<size_t> done_col(coldim(),0);
+
+
+				for (size_t i = 0 ; i < rowdim() ; ++i) {
+					for (size_t j = 0 ; j < _maxc ; ++j) {
+						if (!field().isZero(getData(i,j))) {
+							size_t loc_col = getColid(i,j) ;
+							S.setData (loc_col,done_col[loc_col],getData(i,j));
+							S.setColid(loc_col,done_col[loc_col],i);
+
+							linbox_check(done_col[loc_col] < maxc);
+							done_col[loc_col] += 1 ;
+
+						}
+						else
+							break;
+					}
+				}
+			}
+
+			S.finalize();
+
+
+			return S;
+
+
+		}
+
+		/*! number of rows.
+		 * @return row dimension.
+		 */
+		size_t rowdim() const
+		{
+			return _rownb ;
+		}
+
+		/*! number of columns.
+		 * @return column dimension
+		 */
+		size_t coldim() const
+		{
+			return _colnb ;
+		}
+
+		/*! Number of non zero elements in the matrix.
+		 * or at least the size of the _data if
+		 * @return size of the _data.
+		 */
+		size_t size() const
+		{
+			// return _data.size();
+			return _nbnz ;
+		}
+
+		void setSize(const size_t  z)
+		{
+			_nbnz = z ;
+		}
+
+
+		/** Get a read-only individual entry from the matrix.
+		 * @param i Row _colid
+		 * @param j Column _colid
+		 * @return Const reference to matrix entry
+		 */
+		constElement &getEntry(const size_t &i, const size_t &j) const
+		{
+			ptrdiff_t off = _triples.next(_rowid);
+			if ( (_triples._row  == (ptrdiff_t)i) && _colid[i*_maxc+off]  == j  ) { /* sort of nextTriple */
+				linbox_check(!field().isZero(_data[i*_maxc+off]));
+				return _data[i*_maxc+off];
+			}
+			else { /* searching */
+
+				linbox_check(consistent());
+
+				linbox_check(i<_rownb);
+				linbox_check(j<_colnb);
+
+				const size_t * beg = &_colid[i*_maxc];
+				const Element * dat = &_data[i*_maxc];
+				for (size_t k = 0 ; k < _maxc ; ++k) {
+					if ( field().isZero(dat[k])) {
+						return field().zero;
+					}
+					// replace
+					if (beg[k] == j) {
+						_triples._off = k;
+						_triples._row = i;
+						return dat[k];
+					}
+					if (beg[k] > j) {
+						return field().zero;
+					}
+				}
+				return field().zero;
+			}
+
+		}
+
+		Element      &getEntry (Element &x, size_t i, size_t j) const
+		{
+			return x = getEntry (i, j);
+		}
+
+		void appendEntry(const size_t &i, const size_t &j, const Element& e)
+		{
+			linbox_check(i < rowdim());
+			linbox_check(j < coldim());
+			linbox_check(_colid.size() == _data.size());
+			linbox_check(_rownb*_maxc == _colid.size());
+
+			if (field().isZero(e)) {
+				return ;
+			}
+			ptrdiff_t row = _triples._row ;
+			ptrdiff_t off = _triples._off ;
+			if (row != (ptrdiff_t)i) { /* new row */
+				linbox_check((ptrdiff_t)i>row);
+				_triples._row = i ;
+				_triples._off = 0 ;
+				if (_maxc == 0) {
+					insert(i,_maxc,j,e);
+				}
+				else {
+					linbox_check(i*_maxc < _colid.size());
+					_colid[i*_maxc] = j ;
+					_data [i*_maxc]  = e ;
+					_rowid[i] +=1;
+					++_nbnz;
+				}
+			}
+			else { /* same row */
+				linbox_check(_triples._row == i);
+				_triples._off = off = off + 1 ;
+				if (off == (ptrdiff_t)_maxc) {
+					insert(i,_maxc,j,e);
+				}
+				else {
+					linbox_check(i*_maxc+off < _colid.size());
+					_colid[i*_maxc+off] = j ;
+					_data [i*_maxc+off] = e ;
+					_rowid[i] +=1;
+					++_nbnz;
+				}
+
+			}
+			linbox_check(_rownb*_maxc == _colid.size());
+		}
+
+		/// make matrix ready to use after a sequence of setEntry calls.
+		void finalize(){
+			// could check that maxc is not too large and shrink ? Is is optimize job ?
+			_triples.reset();
+		} // end construction after a sequence of setEntry calls.
+
+		/** Set an individual entry.
+		 * Setting the entry to 0 will not remove it from the matrix
+		 * @param i Row _colid of entry
+		 * @param j Column _colid of entry
+		 * @param value Value of the new entry
+		 * @todo make it faster if i is 0 or m-1 ?
+		 * @warning if this is used to build a matrix and this matrix is "well formed",
+		 * it can be sped up (no checking that the entry already exists).
+		 */
+		void setEntry(const size_t &i, const size_t &j, const Element& e
+			     )
+		{
+			linbox_check(i<_rownb);
+			linbox_check(j<_colnb);
+
+			linbox_check(consistent());
+
+			if (field().isZero(e)) {
+				return clearEntry(i,j);
+			}
+
+			size_t * beg = &_colid[i*_maxc];
+			Element * dat = &_data[i*_maxc];
+			bool found = false;
+			for (size_t k = 0 ; k < _maxc ; ++k) {
+				if ( field().isZero(dat[k])) {
+					field().assign(dat[k], e) ;
+					beg[k] = j;
+					found = true;
+					_rowid[i] +=1;
+					++_nbnz ;
+					break;
+				}
+				if (beg[k] == j) {
+					if (field().isZero(dat[k])) {
+						_rowid[i] +=1;
+						++_nbnz ;
+					}
+					field().assign(dat[k], e) ;
+					beg[k] = j;
+					found = true;
+					break;
+				}
+				if (beg[k] > j) {
+					found = true;
+					insert(i,k,j,e);
+					break;
+				}
+			}
+			if (!found) {
+				insert(i,_maxc,j,e);
+			}
+		}
+
+#if 0
+		/** Get a writeable reference to an entry in the matrix.
+		 * If there is no entry at the position (i, j), then a new entry
+		 * with a value of zero is inserted and a reference  to it is
+		 * returned.
+		 * @param i Row _colid of entry
+		 * @param j Column _colid of entry
+		 * @return Reference to matrix entry
+		 */
+		Element &refEntry(const size_t &i, const size_t&j)
+		{
+			linbox_check(i<_rownb);
+			linbox_check(j<_colnb);
+			// Could be improved by adding an initial guess j/rowdim*size()
+
+			size_t ibeg = _start[i];
+			size_t iend = _start[i+1];
+			if (ibeg==iend) {
+				for (size_t k = i+1 ; k <= _rownb ; ++k) _start[k] +=1 ;
+				_colid.insert(_colid.begin()+ibeg,j);
+				_data.insert( _data.begin() +ibeg,field().zero);
+				return _data[ibeg];
+			}
+			typedef typename std::vector<size_t>::iterator myIterator ;
+			myIterator beg = _colid.begin() ;
+			myIterator low = std::lower_bound (beg+(ptrdiff_t)ibeg, beg+(ptrdiff_t)iend, j);
+			if (low == beg+(ptrdiff_t)iend) {
+				for (size_t k = i+1 ; k <= _rownb ; ++k) _start[k] +=1 ;
+				_colid.insert(_colid.begin()+ibeg,j);
+				_data.insert( _data.begin() +ibeg,field().zero);
+				return _data[ibeg];
+			}
+			else {
+				size_t la = low-_colid.begin() ;
+				return _data[la] ;
+			}
+		}
+#endif
+
+		/** Write a matrix to the given output stream using field read/write.
+		 * @param os Output stream to which to write the matrix
+		 * @param format Format with which to write
+		 */
+		std::ostream & write(std::ostream &os
+				     , LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::MatrixMarket) const
+		{
+			return SparseMatrixWriteHelper<Self_t>::write(*this,os,format);
+		}
+
+
+		/** Read a matrix from the given input stream using field read/write
+		 * @param is Input stream from which to read the matrix
+		 * @param format Format of input matrix
+		 * @return ref to \p is.
+		 */
+		std::istream& read (std::istream &is
+				    , LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::Detect)
+		{
+			return SparseMatrixReadHelper<Self_t>::read(*this,is,format);
+		}
+
+		/*! @internal
+		 * @brief Deletes the entry.
+		 * Deletes \c A(i,j) if it exists.
+		 * @param i row _colid
+		 * @param j col _colid
+		 * @bug rows are increasing order => faster search.
+		 */
+		void clearEntry(const size_t &i, const size_t &j)
+		{
+			linbox_check(i<_rownb);
+			linbox_check(j<_colnb);
+
+			size_t k = 0 ;
+			for ( ; k < _rowid[i] ; ++k) {
+				if (_colid[i*_maxc+k] == j)
+					break;
+				if (_colid[i*_maxc+k] > j)
+					return;
+			}
+			if (k == _rowid[i])
+				return; // not found
+
+			linbox_check(!field().isZero(_data[i*_maxc+k]));
+			return;
+
+			for (size_t l = k ; l <_rowid[i]-1  ; ++l) {
+				field().assign(_data[i*_maxc+l],_data[i*_maxc+l+1]);
+				_colid[i*_maxc+l] = _colid[i*_maxc+l+1];
+			}
+			field().assign(_data[i*_maxc+_rowid[i]-1],field().zero) ;
+			_colid[i*_maxc+_rowid[i]] = 0;
+			_rowid[i] -= 1 ;
+			--_nbnz;
+		}
+
+		/*! @internal
+		 * @brief cleans 0 entries.
+		 */
+		void clean()
+		{
+#if 0
+			size_t i = 0 ;
+			while(i < _data.size()) {
+				if ( field().isZero(_data[i]) ) {
+					for (size_t k = i+1 ; k <= _rownb ; ++k) _start[k] -= 1 ;
+					_colid.erase(_colid.begin()+i);
+					_data. erase(_data. begin()+i);
+				}
+				else
+					++i ;
+			}
+			return ;
+#endif
+		}
+
+		// y= Ax
+		// y[i] = sum(A(i,j) x(j)
+		template<class Vector>
+		Vector& apply(Vector &y, const Vector& x, const Element & a ) const
+		{
+			// linbox_check(consistent());
+			prepare(field(),y,a);
+
+
+			FieldAXPY<Field> accu(field());
+			for (size_t i = 0 ; i < _rownb ; ++i) {
+				accu.reset();
+				for (size_t k = 0   ; k < _rowid[i] ; ++k)
+					// field().axpyin( y[i], getData(i,k), x[getColid(i,k)] ); //! @todo delay !!!
+					accu.mulacc( getData(i,k), x[getColid(i,k)] );
+				accu.get(y[i]);
+			}
+
+			return y;
+		}
+
+
+		// y= A^t x
+		// y[i] = sum(A(j,i) x(j)
+		template<class Vector>
+		Vector& applyTranspose(Vector &y, const Vector& x, const Element & a ) const
+		{
+			// linbox_check(consistent());
+			if (_helper.optimized(*this)) {
+				return _helper.matrix().apply(y,x,a) ; // NEVER use applyTranspose on that thing.
+			}
+
+			prepare(field(),y,a);
+
+#if 0
+			for (size_t i = 0 ; i < _rownb ; ++i)
+				for (size_t k = 0   ; k < _rowid[i] ; ++k)
+					field().axpyin( y[getColid(i,k)], getData(i,k), x[i] ); //! @todo delay !!!
+#else
+			const FieldAXPY<Field> accu0(field());
+			std::vector<FieldAXPY<Field> > Y(_colnb, accu0);
+
+			for (size_t i = 0 ; i < _rownb ; ++i)
+				for (size_t k = 0   ; k < _rowid[i] ; ++k) {
+					Y[getColid(i,k)].mulacc( getData(i,k), x[i] );
+					// Y[_colid[ i*_maxc+k ]].mulacc( _data[ i*_maxc+k ], x[i] );
+				}
+
+			for (size_t i = 0 ; i < _colnb ; ++i)
+				Y[i].get(y[i]) ;
+#endif
+
+
+
+			return y;
+		}
+
+
+
+		template<class inVector, class outVector>
+		outVector& apply(outVector &y, const inVector& x ) const
+		{
+			return apply(y,x,field().zero);
+		}
+
+		template<class inVector, class outVector>
+		outVector& applyTranspose(outVector &y, const inVector& x ) const
+		{
+			return applyTranspose(y,x,field().zero);
+		}
+
+		const Field & field()  const
+		{
+			return _field ;
+		}
+
+		bool consistent() const
+		{
+			size_t nbnz = 0 ;
+			// bool ok = true ;
+			for (size_t i = 0 ; i < _rownb ; ++i) {
+				// bool row_ok = true ;
+				bool zero = false ;
+				for (size_t j = 0 ; j < _maxc ; ++j) {
+					if (field().isZero(getData(i,j))) {
+						if (_rowid[i] != j && !zero) {
+							std::cout << "@" << i << " : " << _rowid[i] <<"!=" << j << std::endl;
+							return false ;
+						}
+						zero = true ;
+					}
+					else {
+						if (zero) {
+							std::cout <<  "@" << i << " : " << _rowid[i] <<"!= 0 (should be)"  << std::endl;
+							return false ; // elements after a 0...
+						}
+						++nbnz ;
+
+					}
+				}
+				if(!zero)
+					if (_rowid[i] != _maxc) {
+						std::cout <<  "@" << i << " : " << _rowid[i] <<"!= " << _maxc << " (should be)"  << std::endl;
+						return false;
+					}
+			}
+			if (nbnz != _nbnz)
+				std::cout << "bad number of non zero" << std::endl;
+			return (nbnz == _nbnz);
+
+		}
+
+
+
+	private :
+
+		class Helper {
+			bool _useable ;
+			bool _optimized ;
+			bool blackbox_usage ;
+			Self_t *_AT ;
+		public:
+
+			Helper() :
+				_useable(false)
+				,_optimized(false)
+				, blackbox_usage(true)
+				, _AT(NULL)
+			{}
+
+			~Helper()
+			{
+				if ( _AT ) {
+					delete _AT ;
+				}
+			}
+
+			bool optimized(const Self_t & A)
+			{
+				if (!_useable) {
+					getHelp(A);
+					_useable = true;
+				}
+				return	_optimized;
+			}
+
+			void getHelp(const Self_t & A)
+			{
+				if ( A.size() > LINBOX_ELL_TRANSPOSE ) { // and/or A.rowDensity(), A.coldim(),...
+					// std::cout << "optimizing..." ;
+					_optimized = true ;
+					_AT = new Self_t(A.field(),A.coldim(),A.rowdim());
+					A.transpose(*_AT);
+					// std::cout << "done!" << std::endl;
+				}
+			}
+
+			const Self_t & matrix() const
+			{
+				return *_AT ;
+			}
+
+		};
+
+
+		//! @todo much less needs to be copied (faster?)
+		void reshape(const size_t ll)
+		{
+			linbox_check(_rownb*_maxc == _colid.size());
+			linbox_check(ll > _maxc);
+
+			_data .resize(ll*_rownb);
+			_colid.resize(ll*_rownb);
+			for (size_t i = _rownb ; i>0 ; --i ) {
+				// std::copy(_data.begin()+(i-1)*_maxc, _data.begin()+(i)*_maxc, _data.begin()+(i-1)*ll);
+				std::copy_backward(_data.begin()+(ptrdiff_t)((i-1)*_maxc), _data.begin()+(ptrdiff_t)((i)*_maxc), _data.begin()+(ptrdiff_t)((i-1)*ll+_maxc));
+				for (size_t j = (i-1)*ll+_maxc ; j < (i)*ll ; ++j )
+					_data[j] = field().zero ;
+			}
+			for (size_t i = _rownb ; i>0 ; --i ) {
+				// std::copy(_colid.begin()+(i-1)*_maxc, _colid.begin()+(i)*_maxc, _colid.begin()+(i-1)*ll);
+				std::copy_backward(_colid.begin()+(ptrdiff_t)((i-1)*_maxc), _colid.begin()+(ptrdiff_t)((i)*_maxc), _colid.begin()+(ptrdiff_t)((i-1)*ll+_maxc));
+				for (size_t j = (i-1)*ll+_maxc ; j < (i)*ll ; ++j )
+					_colid[j] = 0 ;
+			}
+
+			_maxc = ll ;
+			linbox_check(_rownb*_maxc == _colid.size());
+		}
+
+	public:
+		// pseudo iterators
+		size_t getRowid(const size_t & i) const
+		{
+			return _rowid[i];
+		}
+
+		void setRowid(const size_t & i, const size_t & k)
+		{
+			linbox_check(i <= _rownb);
+			_rowid[i]=k;
+		}
+
+		void setRowid(std::vector<size_t> new_rowid)
+		{
+			_rowid = new_rowid ;
+		}
+
+		size_t getColid(const size_t & i, const size_t j) const
+		{
+			linbox_check(i < _rownb);
+			linbox_check(_maxc*_rownb == _colid.size());
+			return _colid[i*_maxc+j];
+		}
+
+		void setColid(const size_t & i, const size_t & j, const size_t & k)
+		{
+			linbox_check(i < _rownb);
+			linbox_check(i*_maxc+j < _colid.size());
+			linbox_check(_maxc*_rownb == _colid.size());
+
+			_colid[i*_maxc+j]=k;
+		}
+
+		void setColid(std::vector<size_t> new_colid)
+		{
+			_colid = new_colid ;
+		}
+
+		std::vector<size_t>  getColid( ) const
+		{
+			return _colid ;
+		}
+
+		const Element & getData(const size_t & i, const size_t & j) const
+		{
+			linbox_check(i < _rownb);
+			linbox_check(j < _colnb);
+			linbox_check(_maxc*_rownb == _colid.size());
+			return _data[ i*_maxc+j ];
+		}
+
+		void setData(const size_t & i, const size_t & j, const Element & e)
+		{
+			linbox_check(i*_maxc+j < _data.size());
+			linbox_check(_maxc*_rownb == _colid.size());
+			field().assign(_data[i*_maxc+j],e);
+		}
+
+		void setData(const std::vector<Element> & new_data)
+		{
+			_data = new_data ;
+		}
+
+		std::vector<Element>  getData( ) const
+		{
+			return _data ;
+		}
+
+		size_t ld() const
+		{
+			return _maxc;
+		}
+
+		void firstTriple() const
+		{
+			_triples.reset();
+		}
+
+		bool nextTriple(size_t & i, size_t &j, Element &e) const
+		{
+			size_t off = (size_t)_triples.next(_rowid);
+
+			i = (size_t)_triples._row ;
+
+			if (  i >= rowdim() ) {
+				_triples.reset() ;
+				return false ;
+			}
+
+			j = _colid[i*_maxc+off];
+			e = _data[i*_maxc+off];
+
+			return true;
+		}
+
+		template<class element_iterator, class Field>
+		class _Iterator {
+		private :
+			element_iterator _data_it ;
+			const element_iterator _data_beg ;
+			const element_iterator _data_end ;
+			const Field & _field ;
+			const std::vector<size_t> & _rowid ;
+			const size_t & _ld ;
+			size_t _row ;
+			typedef typename Field::Element Element;
+		public:
+			typedef Element value_type ;
+			_Iterator(const Field & F , const std::vector<size_t> & rowid,  const size_t & ld, const element_iterator & e_beg, const element_iterator & e_end) :
+				_data_it(e_beg)
+				, _data_beg(e_beg)
+				, _data_end(e_end)
+				,_field(F)
+				,_rowid (rowid)
+				,_ld(ld)
+				,_row(0)
+
+			{}
+
+			_Iterator (const _Iterator &iter) :
+				_data_it(iter._data_it)
+				, _data_beg(iter._data_beg)
+				, _data_end(iter._data_end)
+				,_field(iter._field)
+				,_rowid(iter._rowid)
+				,_ld(iter._ld)
+				,_row(iter._row)
+
+			{}
+
+			_Iterator &operator = (const _Iterator &iter)
+			{
+				_data_it  = iter._data_it  ;
+				_data_beg  = iter._data_beg  ;
+				_data_end  = iter._data_end  ;
+				_field  = iter._field  ;
+				_rowid = iter._rowid;
+				_ld = iter._ld ;
+				_row = iter._row ;
+
+				return *this;
+			}
+
+			bool operator == (const _Iterator &i) const
+			{
+				return  (_data_it == i._data_it) ;
+			}
+
+			bool operator != (const _Iterator &i) const
+			{
+				return  (_data_it != i._data_it) ;
+			}
+
+			_Iterator &operator ++ ()
+			{
+				size_t idx = std::distance(_data_beg,_data_it) % _ld ;
+				while (_row < _rowid.size() && idx >= _rowid[_row])  {
+					idx = 0 ;
+					++_row ;
+				}
+
+				if (_row == _rowid.size()) {
+					_data_it = _data_end ;
+					return *this;
+				}
+
+				_data_it = _data_beg + _ld * _row + idx ;
+				if (_data_it == _data_end)
+					return *this ;
+			}
+
+			_Iterator operator ++ (int)
+			{
+				_Iterator tmp = *this;
+				++(*this);
+				return tmp;
+			}
+
+			_Iterator &operator -- ()
+			{
+				throw NotImplementedYet("not sure");
+				size_t idx = std::distance(_data_beg,_data_it) % _ld ;
+				while ((ptrdiff_t)_row >= 0 && idx >= _rowid[_row])  {
+					idx = 0 ;
+					--_row ;
+				}
+
+				if ((ptrdiff_t)_row < 0) {
+					_data_it = _data_beg ;
+					return *this;
+				}
+
+				_data_it = _data_beg + _ld * _row + idx ;
+				if (_data_it == _data_beg)
+					return *this ;
+			}
+
+			_Iterator operator -- (int)
+			{
+				_Iterator tmp = *this;
+				--(*this);
+				return tmp;
+			}
+
+			value_type &operator * ()
+			{
+				return *_data_it;
+			}
+
+			value_type *operator -> ()
+			{
+				return _data_it ;
+			}
+
+			const value_type &operator*() const
+			{
+				return *_data_it;
+			}
+
+			const value_type *operator -> () const
+			{
+				return _data_it ;
+			}
+
+			const value_type &value() const
+			{
+				return *_data_it;
+			}
+
+		};
+
+		template<class index_iterator, class element_iterator, class Field>
+		class _IndexedIterator {
+		private :
+			typedef  index_iterator    index_it ;
+			typedef  element_iterator  data_it ;
+			index_it _rowid_it ;
+			index_it _colid_beg ;
+			index_it _colid_it ;
+			data_it _data_it ;
+			const data_it _data_beg ;
+			const data_it _data_end ;
+			const Field & _field ;
+			const size_t & _ld ;
+			size_t  _row ;
+			typedef typename Field::Element Element;
+		public:
+			typedef Element value_type ;
+			_IndexedIterator( const Field & F
+					  , const size_t & ld
+					  , const index_it &i
+					  , const index_it &j
+					  , const data_it &e
+					  , const data_it &e_e) :
+				_rowid_it(i)
+				, _colid_beg(j)
+				, _colid_it(j)
+				, _data_it(e)
+				, _data_beg(e)
+				, _data_end(e_e)
+				, _field(F)
+				, _ld(ld)
+				, _row(0)
+			{}
+
+			_IndexedIterator (const _IndexedIterator &iter) :
+				_rowid_it(iter._rowid_it)
+				, _colid_beg(iter._colid_beg)
+				, _colid_it(iter._colid_it)
+				, _data_it(iter._data_it)
+				, _data_beg(iter._data_beg)
+				, _data_end(iter._data_end)
+				, _field(iter._field)
+				, _ld(iter._ld)
+				, _row(iter._row)
+			{}
+
+			_IndexedIterator &operator = (const _IndexedIterator &iter)
+			{
+				_rowid_it  = iter._rowid_it ;
+				_colid_beg = iter._colid_beg ;
+				_colid_it  = iter._colid_it ;
+				_data_it   = iter._data_it  ;
+				_data_beg  = iter._data_beg ;
+				_data_end  = iter._data_end  ;
+				_field     = iter._field ;
+				_ld        = iter._ld ;
+				_row       = iter._row ;
+
+				return *this;
+			}
+
+			bool operator == (const _IndexedIterator &i) const
+			{
+				// we assume consistency
+				return  (_data_it == i._data_it);
+			}
+
+			bool operator != (const _IndexedIterator &i) const
+			{
+				// we assume consistency
+				return  (_data_it != i._data_it) ;
+			}
+
+			_IndexedIterator &operator ++ ()
+			{
+
+				++_data_it  ;
+				if (_data_it == _data_end) {
+					return *this ;
+				}
+				++_colid_it ;
+
+				bool new_row = false ;
+
+				while (std::distance(_data_beg,_data_it) % _ld >= *_rowid_it) {
+					++_row ;
+					++_rowid_it ;
+					new_row = true;
+				}
+
+				if (new_row) {
+					_data_it  = _data_beg + _row * _ld ;
+					_colid_it = _colid_beg + _row * _ld ;
+				}
+
+				return *this;
+			}
+
+			_IndexedIterator operator ++ (int)
+			{
+				_IndexedIterator tmp = *this;
+				++(*this);
+				return tmp;
+			}
+
+			_IndexedIterator &operator -- ()
+			{
+				throw NotImplementedYet("not sure");
+
+				--_data_it  ;
+				if (_data_it == _data_beg) {
+					return *this ;
+				}
+				--_colid_it ;
+
+				bool new_row = false ;
+
+				// will not work
+				while (std::distance(_data_beg,_data_it) % _ld >= *_rowid_it ) {
+					--_row ;
+					--_rowid_it ;
+					new_row = true;
+				}
+
+				if (new_row) {
+					_data_it  = _data_beg + _row * _ld ;
+					_colid_it = _colid_beg + _row * _ld ;
+				}
+
+				return *this;
+			}
+
+			_IndexedIterator operator -- (int)
+			{
+				_IndexedIterator tmp = *this;
+				--(*this);
+				return tmp;
+			}
+
+			value_type &operator * ()
+			{
+				return *_data_it;
+			}
+
+			value_type *operator -> ()
+			{
+				return _data_it ;
+			}
+
+			const value_type &operator*() const
+			{
+				return *_data_it;
+			}
+
+			const value_type *operator -> () const
+			{
+				return _data_it ;
+			}
+
+			size_t rowIndex () const
+			{
+				return _row;
+			}
+
+			size_t colIndex () const
+			{
+				return *_colid_it;
+			}
+
+			const value_type &value() const
+			{
+				return *_data_it;
+			}
+
+
+		};
+
+		typedef _Iterator<typename std::vector<Element>::iterator, Element> Iterator;
+		typedef _Iterator<typename std::vector<Element>::const_iterator, constElement> ConstIterator;
+
+		typedef _IndexedIterator<std::vector<size_t>::iterator, typename std::vector<Element>::iterator, Field> IndexedIterator;
+		typedef _IndexedIterator<std::vector<size_t>::const_iterator, typename std::vector<Element>::const_iterator, const Field> ConstIndexedIterator;
+
+
+		Iterator      Begin ()
+		{
+			return Iterator(field(),_rowid,_maxc,_data.begin(),_data.end()) ;
+		}
+
+		Iterator      End   ()
+		{
+			return Iterator(field(),_rowid,_maxc,_data.end(), _data.end()) ;
+		}
+
+		ConstIterator      Begin () const
+		{
+			return ConstIterator(field(),_rowid,_maxc,_data.begin(),_data.end()) ;
+		}
+
+		ConstIterator      End   () const
+		{
+			return ConstIterator(field(),_rowid,_maxc,_data.end(), _data.end()) ;
+		}
+
+		IndexedIterator      IndexedBegin ()
+		{
+			return IndexedIterator(field(), _maxc , _rowid.begin(), _colid.begin(), _data.begin(),_data.end()) ;
+		}
+
+		IndexedIterator      IndexedEnd   ()
+		{
+			return IndexedIterator(field(), _maxc,  _rowid.begin(), _colid.end(), _data.end(),_data.end()) ;
+		}
+
+		ConstIndexedIterator      IndexedBegin () const
+		{
+			return ConstIndexedIterator(field(), _maxc, _rowid.begin(),  _colid.begin(), _data.begin(),_data.end()) ;
+		}
+
+		ConstIndexedIterator      IndexedEnd   () const
+		{
+			return ConstIndexedIterator(field(), _maxc,  _rowid.begin(), _colid.end(), _data.end(),_data.end()) ;
+		}
+
+
+
+	private:
+
+		void insert (const size_t i, const size_t k, const size_t j, const Element e)
+		{
+			linbox_check(_rownb*_maxc == _colid.size());
+			if (k == _maxc) {
+				resize(_rownb,_colnb,_nbnz,_maxc+1);
+			linbox_check(_rownb*_maxc == _colid.size());
+				_colid[_maxc*i+k] = j;
+				field().assign(_data[_maxc*i+k],e);
+				++_nbnz;
+				_rowid[i] += 1;
+				return;
+			}
+			size_t l = k;
+			for ( ; l < _maxc ; ++l)
+				if (field().isZero(_data[i*_maxc+l]))
+					break;
+			if (l == _maxc)
+				resize(_rownb,_colnb,_nbnz,_maxc+1);
+
+			for (size_t u = l ; u > k ; --u) {
+				_colid[_maxc*i+u] = _colid[_maxc*i+u-1] ;
+				field().assign(_data[_maxc*i+u],_data[_maxc*i+u-1]);
+			}
+			_colid[_maxc*i+k] = j;
+			field().assign(_data[_maxc*i+k],e);
+			++_nbnz;
+			_rowid[i] += 1;
+			linbox_check(_rownb*_maxc == _colid.size());
+			return;
+		}
+
+		void write_raw() const
+		{
+			std::cout << "rowids" << std::endl;
+			std::cout << _rowid << std::endl;
+			std::cout << "colids" << std::endl;
+			for (size_t i = 0 ; i < _rownb ; ++i){
+				for (size_t j = 0 ; j < _maxc ; ++j)
+					std::cout << _colid[i*_maxc+j] << ' ' ;
+				std::cout << std::endl;
+			}
+
+			std::cout << "data" << std::endl;
+			for (size_t i = 0 ; i < _rownb ; ++i){
+				for (size_t j = 0 ; j < _maxc ; ++j)
+					std::cout << _data[i*_maxc+j] << ' ' ;
+				std::cout << std::endl;
+			}
+		}
+
+	protected :
+		friend class SparseMatrixWriteHelper<Self_t >;
+		friend class SparseMatrixReadHelper<Self_t >;
+
+
+		size_t              _rownb ;
+		size_t              _colnb ;
+		size_t               _maxc ; //!< longest row
+		size_t               _nbnz ;
+
+		std::vector<size_t> _rowid ;
+		std::vector<size_t> _colid ; //!< \p _colid is \p _rownb x \p _maxc in RowMajor
+		std::vector<Element> _data ; //!< \p _data  is \p _rownb x \p _maxc in RowMajor
+
+		const _Field            & _field;
+
+		mutable Helper _helper ;
+
+		mutable struct _triples {
+			ptrdiff_t _row ;
+			ptrdiff_t _off ;
+			_triples() :
+				_row(-1)
+				, _off(-1)
+			{}
+
+			ptrdiff_t next(const std::vector<size_t> & rowid)
+			{
+				++ _off ;
+				if (_row == -1) {
+					++_row ;
+				}
+				while (_off >= (ptrdiff_t)rowid[(size_t)_row]) {
+					_row += 1 ;
+					_off = 0 ;
+					if (_row >= (ptrdiff_t)rowid.size())
+						break;
+				}
+				return _off;
+			}
+
+			void reset()
+			{
+				_row = -1 ;
+				_off = -1 ;
+			}
+		}_triples;
+	};
+
+
+
+
+
+} // namespace LinBox
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_ellr_matrix_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-generic.h b/linbox/matrix/sparsematrix/sparse-generic.h
new file mode 100644
index 0000000..26db2fd
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-generic.h
@@ -0,0 +1,538 @@
+/* linbox/matrix/sparse-matrix.h
+ * Copyright (C) 2001-2002 Bradford Hovinen
+ *               1999-2001 William J Turner,
+ *
+ * Written by William J Turner <wjturner at math.ncsu.edu>,
+ *            Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * --------------------------------------------------------
+ * 2003-01-11  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
+ *
+ * Move from blackbox/sparse-base.h to matrix/sparse-matrix.h
+ * ------------------------------------
+ * 2002-11-28  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
+ *
+ *   - Renamed ColOfRowsIterator to RowIterator
+ *   - Named template argument _Row rather than Row; add a typedef to Row
+ *   - Named template argument _Element rather than Row; add a typedef to Element
+ *   - Renamed IndexIterator as IndexedIterator, and adjusted to match
+ *     interface in DenseMatrixBase
+ * ------------------------------------
+ * 2002-08-06  Bradford Hovinen  <hovinen at cis.udel.edu>
+ *
+ * Renamed to sparse-base.h from sparse0-base.h
+ * ------------------------------------
+ * Modified by Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * Refactoring:
+ *   - Eliminated SparseMatrixAux and moved that functionality into Sparse0
+ *   - Made SparseMatrixGeneric parameterized only on the element type
+ *   - New read/write implementations for SparseMatrixGeneric, supporting multiple
+ *     formats
+ *   - Eliminated Gaussian elimination code
+ *   - Added iterators, including ColOfRowsIterator, Iterator, and
+ *     IndexIterator
+ *   - Eliminated operator []; added getEntry; changed put_value to setEntry
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/** @file linbox/matrix/sparsematrix/sparse-generic.h
+ * @brief
+ */
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_generic_H
+#define __LINBOX_matrix_sparsematrix_sparse_generic_H
+
+
+#ifndef _SP_BB_VECTOR_
+#include <vector>
+#define _SP_BB_VECTOR_ std::vector
+#endif
+
+#include <utility>
+#include <iostream>
+#include <algorithm>
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "linbox/linbox-tags.h"
+#include "linbox/matrix/sparse-formats.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/matrix/transpose-matrix.h"
+#include "linbox/vector/vector-traits.h"
+#include "linbox/util/matrix-stream.h"
+#include "linbox/solutions/solution-tags.h"
+#include "linbox/matrix/matrix-traits.h"
+#include "linbox/field/hom.h"
+
+
+
+
+namespace LinBox { /*  forward declarations  */
+	template<class Field>
+	class MatrixDomain ;
+} // LinBox
+
+namespace LinBox { namespace Protected { /*  SparseMatrixGeneric defaults */
+	template <class _Field,
+		 class _Row   = typename RawVector<typename _Field::Element>::Sparse,
+		 class Trait  = typename VectorTraits<_Row>::VectorCategory >
+	class SparseMatrixGeneric;
+} // Protected
+} // LinBox
+
+namespace LinBox { /*  read write helper  */
+		template<class Matrix>
+		class SparseMatrixWriteHelper ;
+
+		template<class Matrix>
+		class SparseMatrixReadHelper ;
+} // LinBox
+
+namespace LinBox { namespace Protected { /*  SparseMatrixGeneric */
+
+	/** Sparse matrix container
+	 * This class acts as a generic row-wise container for sparse
+	 * matrices. It is designed to provide various methods to access the
+	 * entries of the matrix.
+	 * It meets the blackbox archetype
+	 * @tparam _Field Field type
+	 * @tparam _Row   LinBox sparse vector type to use for rows of matrix
+	 \ingroup matrix
+	 */
+	template <class _Field, class _Row, class Trait>
+	class SparseMatrixGeneric {
+	public:
+
+		typedef         _Field          Field;
+		typedef typename Field::Element Element;
+		typedef _Row Row;
+		typedef const Row ConstRow;
+		typedef typename _SP_BB_VECTOR_<Row> Rep;
+		typedef SparseMatrixGeneric<_Field, _Row, Trait> Self_t;
+
+#ifdef __LINBOX_PARALLEL
+		BB_list_list sub_list;
+#endif
+
+
+
+		/** Constructor.
+		 * Note: the copy constructor and operator= will work as intended
+		 *       because of STL's container design
+		 * @param  m  row dimension
+		 * @param  n  column dimension
+		 */
+		SparseMatrixGeneric (const Field & F,size_t m, size_t n) :
+			_field (F),
+			_MD(F),_AT(*this),
+			_matA(m), _m(m), _n(n)
+		{};
+
+		SparseMatrixGeneric (const Field & F) :
+			_field (F),
+			_MD(F),_AT(*this),
+			_matA(0), _m(0), _n(0)
+		{};
+
+
+
+		/** Constructor from a MatrixStream
+		*/
+		SparseMatrixGeneric ( MatrixStream<Field>& ms );
+
+
+		/** Copy constructor.
+		*/
+		SparseMatrixGeneric (const SparseMatrixGeneric<Field, Row, Trait> &A);
+
+		/** Convert constructor.
+		*/
+		template<class VectorType>
+		SparseMatrixGeneric (const SparseMatrixGeneric<Field, VectorType, Trait> &A);
+
+		template<typename _Tp1, typename _R1 = typename Rebind<_Row,_Tp1>::other >
+		struct rebind {
+			typedef SparseMatrixGeneric<_Tp1, _R1> other;
+
+			void operator() (other & Ap, const Self_t& A) {
+
+				typename _Tp1::Element e;
+
+				Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+				for( typename Self_t::ConstIndexedIterator
+				     indices = A.IndexedBegin();
+				     indices != A.IndexedEnd() ;
+				     ++indices ) {
+					hom. image (e, indices.value() );
+					if (!Ap.field().isZero(e))
+						Ap.setEntry (indices.rowIndex(),
+							     indices.colIndex(), e);
+				}
+			}
+
+		};
+
+		template<typename _Tp1, typename _Rw1, typename _myT>
+		SparseMatrixGeneric (const SparseMatrixGeneric<_Tp1, _Rw1, _myT> &Mat, const Field& F) :
+			_field (&F),
+			_MD (F), _AT (*this)
+			, _matA (Mat.rowdim()), _m (Mat.rowdim()), _n (Mat.coldim())
+		{
+			typename SparseMatrixGeneric<_Tp1,_Rw1, _myT>::template rebind<Field,_Row>()(*this, Mat);
+		}
+
+		template<class VectStream>
+		SparseMatrixGeneric (const Field &F, VectStream &stream) :
+			_field (F), _MD (F), _AT (*this)
+			, _matA (stream.size()), _m (stream.size()), _n (stream.dim())
+		{
+			typename Self_t::RowIterator i;
+
+			for (i = Self_t::rowBegin (); i != Self_t::rowEnd (); ++i)
+				stream >> *i;
+		}
+
+
+
+		/** Destructor. */
+		~SparseMatrixGeneric () {
+#ifdef __LINBOX_PARALLEL
+
+			BB_list_list::iterator p;
+
+			BB_list::iterator e_p;
+
+			for (p = sub_list. begin(); p != sub_list. end(); ++ p)
+				for (e_p = p -> second. begin();
+				     e_p != p -> second. end(); ++ e_p) {
+
+					Thread::terminate_thread (*e_p);
+
+					delete (*e_p);
+				}
+#endif
+
+		}
+
+		/** Retreive row dimension of the matrix.
+		 * @return integer number of rows of SparseMatrixGeneric matrix.
+		 */
+		size_t rowdim () const
+		{
+			return _m;
+		}
+
+		/** Retreive column dimension of matrix.
+		 * @return integer number of columns of SparseMatrixGeneric matrix.
+		 */
+		size_t coldim () const
+		{
+			return _n;
+		}
+
+		/** Retreive number of elements in the matrix.
+		 * @return integer number of elements of SparseMatrixGeneric matrix.
+		 * @bug should it be elements or non zero elements ? @see ELL
+		 */
+		size_t size () const
+		{
+			size_t s(0);
+			for(typename Rep::const_iterator it = _matA.begin(); it != _matA.end(); ++it)
+				s+= LinBox::RawVector<Element>::size(*it);
+			return s;
+		}
+
+		/** Read a matrix from the given input stream using field read/write
+		 * @param is Input stream from which to read the matrix
+		 * @param format Format of input matrix
+		 */
+		std::istream &read (std::istream &is,   LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::Detect );
+
+		/** Write a matrix to the given output stream using field read/write
+		 * @param os Output stream to which to write the matrix
+		 * @param F Field with which to write
+		 * @param format Format with which to write
+		 */
+		std::ostream &write (std::ostream &os,  LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::MatrixMarket) const;
+
+		/** Set an individual entry
+		 * Setting the entry to 0 will remove it from the matrix
+		 * @param i Row index of entry
+		 * @param j Column index of entry
+		 * @param value Value of the new entry
+		 */
+		void setEntry (size_t i, size_t j, const Element &value);
+		void appendEntry(size_t i, size_t j, const Element & value) { setEntry(i,j,value) ;}
+		void finalize(){}
+
+		/** Get a writeable reference to an entry in the matrix
+		 * If there is no entry at the position (i, j), then a new entry
+		 * with a value of zero is inserted and a reference  to it is
+		 * returned.
+		 * @param i Row index of entry
+		 * @param j Column index of entry
+		 * @return Reference to matrix entry
+		 */
+		Element &refEntry (size_t i, size_t j);
+
+		/** Get a read-only individual entry from the matrix
+		 * @param i Row index
+		 * @param j Column index
+		 * @return Const reference to matrix entry
+		 */
+		const Element &getEntry (size_t i, size_t j) const;
+
+		/** Get an entry and store it in the given value
+		 * This form is more in the Linbox style and is provided for interface
+		 * compatibility with other parts of the library
+		 * @param x Element in which to store result
+		 * @param i Row index
+		 * @param j Column index
+		 * @return Reference to x
+		 */
+		Element &getEntry (Element &x, size_t i, size_t j) const;
+
+		/** @name Columns of rows iterator
+		 * The columns of row iterator gives each of the rows of the
+		 * matrix in ascending order. Dereferencing the iterator yields
+		 * a row vector in sparse sequence format
+		 */
+
+		typedef typename Rep::iterator RowIterator;
+		typedef typename Rep::const_iterator ConstRowIterator;
+
+		RowIterator rowBegin ();
+		RowIterator rowEnd ();
+		ConstRowIterator rowBegin () const;
+		ConstRowIterator rowEnd () const;
+
+		/** @name Raw iterator
+		 * The raw iterator is a method for accessing all nonzero
+		 * entries in the matrix in some unspecified order. This can be
+		 * used, e.g. to reduce all matrix entries modulo a prime before
+		 * passing the matrix into an algorithm.
+		 */
+
+		class Iterator;
+		class ConstIterator;
+
+		/// Begin.
+		Iterator Begin ();
+		/// End.
+		Iterator End ();
+		/// const Begin.
+		ConstIterator Begin () const;
+		/// const End
+		ConstIterator End () const;
+
+		/** @name Index iterator
+		 * The index iterator gives the row, column indices of all matrix
+		 * elements in the same order as the raw iterator above. Its value type
+		 * is an STL pair with the row and column indices, starting at 0, in the
+		 * first and second positions, respectively.
+		 */
+
+		class IndexedIterator;
+		class ConstIndexedIterator;
+
+		/// IndexedBegin
+		IndexedIterator IndexedBegin ();
+		/// IndexedEnd
+		IndexedIterator IndexedEnd ();
+		/// const IndexedBegin
+		ConstIndexedIterator IndexedBegin () const;
+		/// const IndexedEnd
+		ConstIndexedIterator IndexedEnd () const;
+
+		/** Retrieve a row as a writeable reference
+		 * @param i Row index
+		 */
+		Row &getRow (size_t i);
+
+		/** Retrieve a row as a writeable reference.
+		 * @param i Row index
+		 */
+		Row &operator [] (size_t i);
+
+		/** Retrieve a row as a read-only reference.
+		 * @param i Row index
+		 */
+		ConstRow &operator [] (size_t i) const;
+
+		/** Compute the column density, i.e the number of entries per column.
+		 * @param v Vector in which to store column density
+		 */
+		template <class Vector>
+		Vector &columnDensity (Vector &v) const;
+
+		/** Construct the transpose of this matrix and place it in the
+		 * matrix given.
+		 * @param AT
+		 */
+		SparseMatrixGeneric &transpose (SparseMatrixGeneric &AT) const;
+
+		const Field & field() const
+		{
+			return _field;
+		}
+
+		/** Matrix-vector product
+		 * \f$y = A x\f$.
+		 * @return reference to output vector y
+		 * @param  x input vector
+		 * @param y
+		 */
+		template <class OutVector, class InVector>
+		OutVector &apply (OutVector &y, const InVector &x) const
+		{
+#ifdef __LINBOX_PARALLEL
+			return BlackboxParallel (y, *this, x, BBBase::Apply);
+#else
+			return _MD.vectorMul (y, *this, x);
+#endif
+		}
+
+		/** Transpose matrix-vector product
+		 * \f$ y = A^T x\f$.
+		 * @return reference to output vector y
+		 * @param  x input vector
+		 * @param y
+		 */
+		template <class OutVector, class InVector>
+		OutVector &applyTranspose (OutVector& y, const InVector &x) const
+		{
+#ifdef __LINBOX_PARALLEL
+			return BlackboxParallel (y, *this, x, BBBase::ApplyTranspose);
+#else
+			return _MD.vectorMul (y, _AT, x);
+#endif
+		}
+
+		const Rep & getRep() const
+		{
+			return _matA;
+		}
+
+		Rep & refRep()
+		{
+			return _matA;
+		}
+
+		void resize( const size_t & m, const size_t & n, const size_t & z = 0)
+		{
+			_m = m ;
+			_n = n ;
+			_matA.clear();
+			_matA.resize(m);
+
+		}
+
+	protected:
+
+		friend class SparseMatrixWriteHelper<Self_t >;
+		friend class SparseMatrixReadHelper<Self_t >;
+
+		Rep               _matA;
+		size_t            _m;
+		size_t            _n;
+		const Field & _field;
+
+		MatrixDomain<Field>       _MD; // Matrix domain for matrix operations
+		TransposeMatrix<SparseMatrixGeneric<_Field, _Row> > _AT;
+
+
+		// template<class F, class R, class T> friend class SparseMatrixGeneric;
+	};
+
+} // Protected
+
+
+} // Linbox
+
+
+#include "linbox/matrix/sparsematrix/sparse-sequence-vector.h"
+#include "linbox/matrix/sparsematrix/sparse-parallel-vector.h"
+#include "linbox/matrix/sparsematrix/sparse-associative-vector.h"
+
+#include "linbox/matrix/sparsematrix/sparse-generic.inl"
+
+namespace LinBox { /*  IO / Traits */
+
+	template <class Field, class Row>
+	std::ostream &operator << (std::ostream &os, const Protected::SparseMatrixGeneric<Field, Row> &A)
+	{
+		return A.write (os);
+	}
+
+	template <class Field, class Row>
+	std::istream &operator >> (std::istream &is, Protected::SparseMatrixGeneric<Field, Row> &A)
+	{
+		return A.read (is);
+	}
+
+	template <class Field, class Row, class Trait>
+	struct MatrixTraits< Protected::SparseMatrixGeneric<Field, Row, Trait> >
+	{
+		typedef Protected::SparseMatrixGeneric<Field, Row, Trait> MatrixType;
+		typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
+	};
+
+	template <class Field, class Row, class Trait>
+	struct MatrixTraits< const Protected::SparseMatrixGeneric<Field, Row, Trait> >
+	{
+		typedef const Protected::SparseMatrixGeneric<Field, Row, Trait> MatrixType;
+		typedef typename MatrixCategories::RowMatrixTag MatrixCategory;
+	};
+
+	template<class A, class B, class C>
+	struct GetEntryCategory<Protected::SparseMatrixGeneric<A,B,C> > {
+		typedef SolutionTags::Local Tag;
+	} ;
+
+	template <class Field, class _Row>
+	struct MatrixTraits< Protected::SparseMatrixGeneric<Field, _Row> >
+	{
+		typedef Protected::SparseMatrixGeneric<Field, _Row> MatrixType;
+		typedef MatrixCategories::RowMatrixTag MatrixCategory;
+	};
+
+	template<class A, class B>
+	struct GetEntryCategory<Protected::SparseMatrixGeneric<A,B> >
+	{
+		typedef SolutionTags::Local Tag;
+	};
+
+} // namespace LinBox
+
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_generic_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-generic.inl b/linbox/matrix/sparsematrix/sparse-generic.inl
new file mode 100644
index 0000000..45e41a7
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-generic.inl
@@ -0,0 +1,100 @@
+/* linbox/matrix/sparse.inl
+ * Copyright (C) 2001-2002 Bradford Hovinen
+ *               1999-2001 William J Turner,
+ *
+ * Written by Bradford Hovinen <hovinen at cis.udel.edu>
+ * Based on sparse-base.h by William J Turner <wjturner at math.ncsu.edu>
+ *
+ * --------------------------------------------------------
+ * 2003-01-11  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
+ *
+ * Move from blackbox/sparse-base.inl to matrix/sparse.inl
+ * ------------------------------------
+ * 2002-11-28  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
+ *
+ *   - Renamed ColOfRowsIterator to RowIterator
+ *   - Named template argument _Row rather than Row; add a typedef to Row
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_matrix_sparse_INL
+#define __LINBOX_matrix_sparse_INL
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <sstream>
+#include <algorithm>
+#include <cmath>
+#include <cctype>
+#include <cstring>
+
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/vector/vector-traits.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/util/debug.h"
+
+
+
+
+
+namespace LinBox { namespace Protected {
+	template <class Field, class Row, class Tag>
+	SparseMatrixGeneric<Field,Row,Tag> ::SparseMatrixGeneric( MatrixStream<Field>& ms ) :
+		_matA(0), _m(0), _n(0)
+	{
+		Element val;
+		size_t i, j;
+		while( ms.nextTriple(i,j,val) ) {
+			if( i >= _m ) {
+				_m = i + 1;
+				_matA.resize( _m );
+			}
+			if( j >= _n ) _n = j + 1;
+			setEntry(i,j,val);
+		}
+		if( ms.getError() > END_OF_MATRIX )
+			throw ms.reportError(__func__,__LINE__);
+		if( !ms.getDimensions( i, _n ) )
+			throw ms.reportError(__func__,__LINE__);
+		if( i > _m ) {
+			_m = i;
+			_matA.resize(_m);
+		}
+	}
+
+
+
+} // namespace LinBox
+} // namespace Protected
+
+#endif // __LINBOX_matrix_sparse_INL
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-hyb-matrix.h b/linbox/matrix/sparsematrix/sparse-hyb-matrix.h
new file mode 100644
index 0000000..32bdc77
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-hyb-matrix.h
@@ -0,0 +1,923 @@
+/* linbox/matrix/sparse-csr-matrix.h
+ * Copyright (C) 2013 the LinBox
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file matrix/sparsematrix/sparse-hyb-matrix.h
+ * @ingroup sparsematrix
+ */
+
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_hyb_matrix_H
+#define __LINBOX_matrix_sparsematrix_sparse_hyb_matrix_H
+
+#include <utility>
+#include <iostream>
+#include <algorithm>
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "sparse-domain.h"
+#include "sparse-coo-matrix.h"
+#include "sparse-csr-matrix.h"
+#include "sparse-ellr-matrix.h"
+
+/*! @todo benchmark me */
+#define HYB_ELL_THRESHOLD 0.9
+/*! @todo benchmark me */
+#define HYB_ELL_COO_THRESHOLD 0.1
+
+namespace LinBox
+{
+
+	template<class Field>
+	class Stats {
+		const SparseMatrix<Field,SparseMatrixFormat::CSR> & _Mat;
+		const Field & _field ;
+	public:
+		size_t one ;
+		size_t mone ;
+		size_t avg ;
+		// size_t avg_one ;
+		// size_t avg_mone ;
+		std::vector<size_t> row ;
+		std::vector<size_t> row_one ;
+		std::vector<size_t> row_mone ;
+		std::vector<size_t> null_row ;
+		// size_t mean ;
+		size_t ell ;
+		size_t ell_nbnz ;
+		size_t ell_one ;
+		size_t ell_mone ;
+	public :
+		Stats( const SparseMatrix<Field,SparseMatrixFormat::CSR> & Mat) :
+			_Mat(Mat),_field(_Mat.field())
+			,one(0),mone(0)
+			,row(Mat.rowdim(),0)
+			,row_one(Mat.rowdim(),0)
+			,row_mone(Mat.rowdim(),0)
+			,null_row(0)
+			,avg(0)
+			,ell(0)
+			,ell_nbnz(0)
+			// ,_off_ell(Mat.rowdim(),0);
+		{
+			if (Mat.size() > 100) { /*! @todo what is small ?  */
+				for (size_t i = 0 ; i < Mat.rowdim() ; ++i) {
+					if (Mat.getStart(i) == Mat.getEnd(i)) {
+						null_row.push_back(i);
+					}
+					for (size_t k = Mat.getStart(i) ; k < Mat.getEnd(i) ; ++k) {
+						if (_field.isOne(Mat.getEntry(k))) {
+							++one ;
+							row_one[i] += 1 ;
+						}
+						else if (_field.isMOne(Mat.getEntry(k))) {
+							++mone ;
+							row_mone[i] += 1 ;
+						}
+						row[i] += 1;
+					}
+				}
+			}
+			avg = std::ceil((Mat.rowdim()-null_row.size())/Mat.size());
+		}
+
+		void getOptimsedFormat(SparseMatrix<Field,SparseMatrixFormat::HYB> & hyb)
+		{
+			// std::sort(row.start(), row.end());
+			// std::vector<size_t>::iterator up;
+			// up= std::upper_bound (row.begin(), row.end(), 0); //
+			// linbox_check(null_row.size() == (size_t)(up-row.begin()));
+			size_t t1 = 0 , t2 = 0 , t3 = 0 ;
+			size_t e1 = avg-1 , e2 = avg , e3 = avg+1 ;
+			for (size_t i = 0 ; i < row.size() ; ++i) {
+				t1 += std::min(e1,row[i]);
+				t2 += std::min(e2,row[i]);
+				t3 += std::min(e3,row[i]);
+			}
+			double r1 =  (double)t1/double(hyb.size()) ;
+			double r2 =  (double)t2/double(hyb.size()) ;
+			double r3 =  (double)t3/double(hyb.size()) ;
+			ell = 0 ;
+			if ( r1 > HYB_ELL_THRESHOLD) {
+				ell = e1 ;
+				ell_nbnz =t1;
+			}
+			if (r2 > std::min(r1, HYB_ELL_THRESHOLD)) { /*! @todo benchmark me */
+				ell = e2 ;
+				ell_nbnz =t2;
+			}
+			if (r3 > std::min( std::min(r2,r1), HYB_ELL_THRESHOLD) ) { /*! @todo benchmark me */
+				ell = e3 ;
+				ell_nbnz =t3;
+			}
+
+			size_t choose_ell = 0 ; // 0 is nothing, 1 is ell, 2 is ellr
+			size_t choose_coo = 0 ; // 0 is nothing, 1 is coo, 2 is csr
+
+			if (ell != 0) {
+				if (ell*hyb.rowdim() == hyb.size())
+					choose_ell = 1 ;
+				else
+					choose_ell = 2 ;
+			}
+
+			size_t rem = (hyb.size()-ell*hyb.rowdim()) ;
+			if (rem > 0) {
+				double r4 = rem/hyb.rowdim();
+				if (r4 < HYB_ELL_COO_THRESHOLD)
+					choose_coo = 1 ;
+				else
+					choose_coo = 2 ;
+			}
+
+			switch(choose_ell) {
+				case (1) :
+					// hyb.newELL();
+				case (2) :
+					hyb.newELL_R();
+				default :
+					{}
+			}
+
+			switch(choose_coo) {
+				case (1) :
+					hyb.newCOO();
+				case (2) :
+					hyb.newCSR();
+				default :
+					{}
+			}
+
+
+			//! @todo ±1 !
+
+		}
+	};
+
+	/** Sparse matrix, Coordinate storage.
+	 *
+	 * \ingroup matrix
+	 * \ingroup sparse
+	 */
+	template<class _Field>
+	class SparseMatrix<_Field, SparseMatrixFormat::HYB > {
+	public :
+		typedef _Field                             Field ; //!< Field
+		typedef typename _Field::Element         Element ; //!< Element
+		typedef const Element               constElement ; //!< const Element
+		typedef SparseMatrixFormat::HYB         Storage ; //!< Matrix Storage Format
+		typedef SparseMatrix<_Field,Storage>     Self_t ; //!< Self type
+		// typedef Vector<_Field,VectorStorage::Sparse> Rep ;
+
+		/*! Constructors.
+		 * @todo convert from other matrix.
+		 *
+		 */
+		//@{
+		SparseMatrix<_Field, SparseMatrixFormat::HYB> () :
+			_rownb(0),_colnb(0) ,_nbnz(0)
+			,_coo(NULL),_csr(NULL),_ell_r(NULL)
+			, _field()
+		{
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::HYB> (const _Field & F) :
+			_rownb(0),_colnb(0) ,_nbnz(0)
+			,_coo(NULL),_csr(NULL),_ell_r(NULL)
+			, _field(F)
+		{
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::HYB> (const _Field & F, size_t m, size_t n) :
+			_rownb(m),_colnb(n) ,_nbnz(0)
+			,_coo(NULL),_csr(NULL),_ell_r(NULL)
+			, _field(F)
+		{
+		}
+
+		SparseMatrix<_Field, SparseMatrixFormat::HYB> (const SparseMatrix<_Field, SparseMatrixFormat::CSR> & S) :
+			_rownb(S._rownb),_colnb(S._colnb), _nbnz(S._nbnz)
+			,_coo(NULL),_csr(NULL),_ell_r(NULL)
+			,_field(S._field)
+		{
+			importe(S);
+
+		}
+
+
+		// XXX only for CSR
+		template<typename _Tp1, typename _Rw1 = SparseMatrixFormat::HYB>
+		struct rebind ;
+
+		template<typename _Tp1>
+		struct rebind<_Tp1 > {
+			typedef SparseMatrix<_Tp1, SparseMatrixFormat::HYB> other;
+
+			void operator() (other & Ap, const Self_t& A)
+			{
+				Ap.resize(A.rowdim(),A.coldim(),A.size());
+				// size might decrease...
+
+				if (A.have_reader()) {
+					Ap.newReader();
+					typename SparseMatrix<Field,SparseMatrixFormat::CSR>::template
+					rebind<_Tp1,SparseMatrixFormat::CSR>()(Ap.reader(),A.reader());
+				}
+
+				if (A.have_coo()) {
+					Ap.newCOO();
+					typename SparseMatrix<Field,SparseMatrixFormat::COO>::template
+					rebind<_Tp1,SparseMatrixFormat::COO>()(Ap.coo(),A.coo());
+				}
+
+				if (A.have_csr()) {
+					Ap.newCSR();
+					typename SparseMatrix<Field,SparseMatrixFormat::CSR>::template
+					rebind<_Tp1,SparseMatrixFormat::CSR>()(Ap.csr(),A.csr());
+				}
+
+				if (A.have_ell_r()) {
+					Ap.newELL_R();
+					typename SparseMatrix<Field,SparseMatrixFormat::ELL_R>::template
+					rebind<_Tp1,SparseMatrixFormat::ELL_R>()(Ap.ell_r(),A.ell_r());
+				}
+			}
+		};
+
+		template<typename _Tp1, typename _Rw1>
+		SparseMatrix (const SparseMatrix<_Tp1, _Rw1> &S, const Field& F) :
+			_rownb(S.rowdim()),_colnb(S.coldim()), _nbnz(S.size())
+			,_coo(NULL)
+			,_csr(NULL)
+			,_ell_r(NULL)
+			,_field(F)
+		{
+			typename SparseMatrix<_Tp1,_Rw1>::template
+			rebind<Field,SparseMatrixFormat::HYB>()(*this, S);
+		}
+
+
+
+
+		template<class VectStream>
+		SparseMatrix<_Field, SparseMatrixFormat::HYB> (const _Field & F, VectStream & stream) :
+			_rownb(stream.size()),_colnb(stream.dim()), _nbnz(0)
+			,_coo(NULL),_csr(NULL),_ell_r(NULL)
+			, _field(F)
+		{
+			_csr = (new SparseMatrix<Field,SparseMatrixFormat::CSR>(F,stream));
+		}
+
+
+		void resize(const size_t & mm, const size_t & nn, const size_t & zz)
+		{
+			_rownb = mm ;
+			_colnb = nn ;
+			_nbnz  = zz;
+		}
+
+		/*! Default converter.
+		 * @param S a sparse matrix in any storage.
+		 */
+		template<class _OtherStorage>
+		SparseMatrix<_Field, SparseMatrixFormat::HYB> (const SparseMatrix<_Field, _OtherStorage> & S) :
+			_rownb(S._rownb),_colnb(S._colnb),_nbnz(S._nbnz)
+			,_coo(NULL),_csr(NULL),_ell_r(NULL)
+			,_field(S._field)
+		{
+			this->importe(S); // convert Temp from anything
+		}
+
+		~SparseMatrix<_Field, SparseMatrixFormat::HYB>()
+		{
+			if(have_coo()) {
+				delete _coo ;
+				_coo = NULL ;
+			}
+			if(have_csr()) {
+				delete _csr;
+				_csr = NULL ;
+			}
+			if(have_reader()) {
+				delete _reader;
+				_reader = NULL ;
+			}
+
+			if(have_ell_r()) {
+				delete _ell_r;
+				_ell_r = NULL ;
+			}
+		}
+
+		//@}
+		/*! Conversions.
+		 * Any sparse matrix has a converter to/from CSR.
+		 * A specialisation can skip the temporary CSR matrix created.
+		 */
+		//@{
+		/*! Import a matrix in CSR format to HYB.
+		 * @param S HYB matrix to be converted in HYB and optimsed
+		 */
+		void importe(const SparseMatrix<_Field,SparseMatrixFormat::CSR> &S)
+		{
+			optimise();
+		}
+
+		void optimise()
+		{
+			Stats<Field> stats(*this);
+			//! @todo ±1 !
+			if (have_ell_r()) {
+				ell_r().resize(rowdim(),coldim(),stats.ell_nbnz,stats.ell);
+				size_t l = 0 ;
+				for (size_t  i = 0 ;  i < rowdim() ;++i) {
+					size_t j = 0 ;
+					ell_r.setRowid(i,std::min(reader().rowLength(i),stats.ell));
+					for (size_t k = reader().getStart(i) ; k < reader().getStart(i)+ell_r.getRowid(i) ; ++k, ++j) {
+						ell_r().setColid(i,j,reader().getColid(k));
+						ell_r().setData (i,j,reader().getData (k));
+
+					}
+					for (size_t k = reader().getStart(i)+ell_r.getRowid(i) ; k < reader.getEnd(i) ; ++k , ++l) {
+						if (have_coo()) {
+							coo().setRowid(l,i);
+							coo().setColid(l,reader().getColid(k));
+							coo().setData (l,reader().getData (k));
+						}
+						else {
+							csr().setEnd(i,csr.getEnd(i)+1);
+							csr().setColid(l,reader().getColid(k));
+							csr().setData (l,reader().getData (k));
+						}
+					}
+				}
+				if (have_csr()) {
+					for (size_t  i = 0 ;  i < rowdim() ;++i) {
+						csr().setEnd(i,csr().getStart(i)+csr().getEnd(i));
+					}
+					csr().compress();
+				}
+
+			}
+			else if (have_csr()) {
+				csr().importe(reader());
+
+			}
+			else if (have_coo()) {
+				coo().importe(reader());
+			}
+		}
+
+		/*! Import a matrix in CSR format to CSR.
+		 * @param S CSR matrix to be converted in CSR
+		 */
+
+		void importe(const SparseMatrix<_Field,SparseMatrixFormat::HYB> &A)
+		{
+			resize( A.rowdim(), A.coldim(), A.size() );
+
+			if (A.have_coo()) {
+				newCOO();
+				coo().importe(A.coo());
+			}
+			if (A.have_csr()) {
+				newCSR();
+				csr().importe(A.csr());
+			}
+			if (A.have_ell_r()) {
+				newELL_R();
+				ell_r().importe(A.ell_r());
+			}
+
+
+		}
+
+		/*! Export a matrix in CSR format from COO.
+		 * @param S CSR matrix to be converted from COO
+		 */
+		SparseMatrix<_Field,SparseMatrixFormat::HYB > &
+		exporte(SparseMatrix<_Field,SparseMatrixFormat::HYB> &S) const
+		{
+
+			// could save memory by doing that iteratively and resize to 0,0,0
+			SparseMatrix<_Field,SparseMatrixFormat::CSR> S1(field());
+			SparseMatrix<_Field,SparseMatrixFormat::CSR> S2(field());
+			SparseMatrix<_Field,SparseMatrixFormat::CSR> S3(field());
+			if (have_coo()) {
+				S1.importe(coo());
+			}
+			if (have_csr()) {
+				S1.importe(csr());
+			}
+			if (have_ell_r()) {
+				S1.importe(ell_r());
+			}
+			S.merge(S1);
+			S.merge(S2);
+			S.merge(S3);
+
+			return S ;
+
+		}
+
+
+		//@}
+
+		/*! In place transpose. Not quite...
+		*/
+		void transposeIn()
+		{
+			if (have_coo()) {
+				coo().transposeIn();
+			}
+			if (have_csr()) {
+				csr().transposeIn();
+			}
+			if (have_ell_r()) {
+				ell_r().transposeIn();
+			}
+			if (have_reader()) {
+				reader().transposeIn();
+			}
+
+		}
+
+		/*! Transpose the matrix.
+		 *  @param S [out] transpose of self.
+		 *  @return a reference to \p S.
+		 */
+		SparseMatrix<_Field,SparseMatrixFormat::HYB> &
+		transpose(SparseMatrix<_Field,SparseMatrixFormat::HYB> &S)
+		{
+			if (have_coo()) {
+				S.newCoo();
+				coo().transpose(S.coo());
+			}
+			if (have_csr()) {
+				S.newCSR();
+				csr().transpose(S.csr());
+			}
+			if (have_ell_r()) {
+				S.newELLR();
+				ell_r().transpose(S.ell_r());
+			}
+			if (have_reader()) {
+				S.newCSR();
+				reader().transpose(S.reader());
+			}
+
+			return S;
+		}
+
+		/*! number of rows.
+		 * @return row dimension.
+		 */
+		size_t rowdim() const
+		{
+			return _rownb ;
+		}
+
+		/*! number of columns.
+		 * @return column dimension
+		 */
+		size_t coldim() const
+		{
+			return _colnb ;
+		}
+
+		/*! Number of non zero elements in the matrix.
+		 * or at least the size of the _data if
+		 * @return size of the _data.
+		 */
+		size_t size() const
+		{
+			// return _data.size();
+			return _nbnz ;
+		}
+
+		void setSize(const size_t & z)
+		{
+			_nbnz = z ;
+		}
+
+		/** Get a read-only individual entry from the matrix.
+		 * @param i Row _colid
+		 * @param j Column _colid
+		 * @return Const reference to matrix entry
+		 */
+		constElement &getEntry(const size_t &i, const size_t &j) const
+		{
+			std::cout << " *** Warning/Error **** un optimised" << std::endl;
+			// get Entry in various opt, then reader
+			return reader().getEntry(i,j);
+		}
+
+
+		Element      &getEntry (Element &x, size_t i, size_t j) const
+		{
+			std::cout << " *** Warning/Error **** un optimised" << std::endl;
+			return x = getEntry (i, j);
+		}
+
+		void finalize(){ optimise(); } // end construction after a sequence of setEntry calls.
+
+		/** Set an individual entry.
+		 * Setting the entry to 0 will not remove it from the matrix
+		 * @param i Row _colid of entry
+		 * @param j Column _colid of entry
+		 * @param value Value of the new entry
+		 * @todo make it faster if i is 0 or m-1 ?
+		 */
+		void setEntry(const size_t &i, const size_t &j, const Element& e)
+		{
+			// only setentry on _reader, destroy other ?
+			// or add in coo/ wherever possible ? (seems doable)
+			std::cout << " *** Warning/Error **** un optimised" << std::endl;
+			return reader().setEntry(i,j,e);
+		}
+
+
+		/** Get a writeable reference to an entry in the matrix.
+		 * If there is no entry at the position (i, j), then a new entry
+		 * with a value of zero is inserted and a reference  to it is
+		 * returned.
+		 * @param i Row _colid of entry
+		 * @param j Column _colid of entry
+		 * @return Reference to matrix entry
+		 */
+		Element &refEntry(const size_t &i, const size_t&j)
+		{
+			// dangerous if ref is 0, but doable.
+			std::cout << " *** Warning/Error **** un optimised" << std::endl;
+			return reader().refEntry(i,j);
+		}
+
+		/** Write a matrix to the given output stream using field read/write.
+		 * @param os Output stream to which to write the matrix
+		 * @param format Format with which to write
+		 */
+		template<class Format>
+		std::ostream & write(std::ostream &os,
+				     Format = SparseFileFormat::CSR()) const
+		{
+			return this->writeSpecialized(os,Format());
+		}
+
+		std::ostream & write(std::ostream &os,
+				     enum LINBOX_enum(Tag::FileFormat) ff  = Tag::FileFormat::Maple) const
+		{
+			return this->writeSpecialized(os,ff);
+		}
+
+
+		/** Read a matrix from the given input stream using field read/write
+		 * @param file Input stream from which to read the matrix
+		 * @param format Format of input matrix
+		 * @return ref to \p file.
+		 */
+		template<class Format>
+		std::istream& read (std::istream &file,
+				    Format fmt = SparseFileFormat::CSR())
+		{
+			if ( ! have_reader() )
+				newReader();
+			return reader().read(file,fmt);
+		}
+
+		/*! @internal
+		 * @brief Deletes the entry.
+		 * Deletes \c A(i,j) if it exists.
+		 * @param i row _colid
+		 * @param j col _colid
+		 */
+		void clearEntry(const size_t &i, const size_t &j)
+		{
+#if 0
+			linbox_check(i<_rownb);
+			linbox_check(j<_colnb);
+
+			size_t ibeg = _start[i];
+			size_t iend = _start[i+1];
+			if (ibeg == iend)
+				return ;
+
+			typedef typename std::vector<size_t>::iterator myIterator ;
+			myIterator beg = _colid.begin() ;
+			myIterator low = std::lower_bound (beg+(ptrdiff_t)ibeg, beg+(ptrdiff_t)iend, j);
+			if (low == beg+(ptrdiff_t)iend)
+				return ;
+			else {
+				// not sure
+				size_t la = low-beg ;
+				for (size_t k = i+1 ; k <= _rownb ; ++k) _start[k] -= 1 ;
+				_colid.erase(_colid.begin()+la);
+				_data. erase(_data. begin()+la);
+				return  ;
+			}
+#endif
+		}
+
+		/*! @internal
+		 * @brief cleans 0 entries.
+		 */
+		void clean()
+		{
+#if 0
+			size_t i = 0 ;
+			while(i < _data.size()) {
+				if ( field().isZero(_data[i]) ) {
+					for (size_t k = i+1 ; k <= _rownb ; ++k) _start[k] -= 1 ;
+					_colid.erase(_colid.begin()+i);
+					_data. erase(_data. begin()+i);
+				}
+				else
+					++i ;
+			}
+			return ;
+#endif
+		}
+
+		// y= Ax
+		// y[i] = sum(A(i,j) x(j)
+		template<class Vector>
+		Vector& apply(Vector &y, const Vector& x, const Element & a ) const
+		{
+			linbox_check(consistent());
+			prepare(field(),y,a);
+
+			bool is_optimised = (have_ell_r() || have_coo() || have_csr());
+			if (is_optimised) {
+				if (have_ell_r())
+					ell_r().apply(y,x,field().one);
+				if (have_coo())
+					coo()  .apply(y,x,field().one);
+				if (have_csr())
+					csr()  .apply(y,x,field().one);
+			}
+			else {
+				reader(). apply(y,x,field().one);
+			}
+
+
+
+			return y;
+		}
+
+		class Helper ; // transpose
+
+		// y= A^t x
+		// y[i] = sum(A(j,i) x(j)
+		template<class Vector>
+		Vector& applyTranspose(Vector &y, const Vector& x, const Element & a ) const
+		{
+			linbox_check(consistent());
+			//! @bug if too big, create transpose.
+			prepare(field(),y,a);
+			bool is_optimised = (have_ell_r() || have_coo() || have_csr());
+			if (is_optimised) {
+
+				if (have_ell_r())
+					ell_r().applyTranspose(y,x,field().one);
+				if (have_coo())
+					coo()  .applyTranspose(y,x,field().one);
+				if (have_csr())
+					csr()  .applyTranspose(y,x,field().one);
+			}
+			else {
+				reader(). applyTranspose(y,x,field().one);
+			}
+
+
+			return y;
+		}
+
+		template<class Vector>
+	Vector& apply(Vector &y, const Vector& x ) const
+		{
+			return apply(y,x,field().zero);
+		}
+		template<class Vector>
+		Vector& applyTranspose(Vector &y, const Vector& x ) const
+		{
+			return apply(y,x,field().zero);
+		}
+
+		const Field & field()  const
+		{
+			return _field ;
+		}
+
+
+		/** @todo Non element marker.
+		 * We could end up a line with a marker.
+		 * A field F would contain an element that does not belong to
+		 * it. eg a nan for a Givaro::Modular<double>. It could act as a
+		 * marker.
+		 */
+		bool consistent() const
+		{
+			size_t nbnz = 0 ;
+			size_t col = 0 ;
+			size_t row = 0 ;
+			if (have_coo()) {
+				if (!coo().consistent()) return false ;
+				nbnz += coo().size();
+				col = std::max(col,coo().coldim());
+				row = std::max(row,coo().rowdim());
+			}
+			if (have_csr()) {
+				if (!csr().consistent()) return false ;
+				nbnz += csr().size();
+				col = std::max(col,csr().coldim());
+				row = std::max(row,csr().rowdim());
+			}
+			if (have_ell_r()) {
+				if (!ell_r().consistent()) return false ;
+				nbnz += ell_r().size();
+				col = std::max(col,ell_r().coldim());
+				row = std::max(row,ell_r().rowdim());
+			}
+			if (nbnz != size())
+				return false ;
+			if (col > coldim())
+				return false;
+			if (row > rowdim())
+				return false;
+
+			return true ;
+		}
+
+
+	private :
+
+		std::ostream & writeSpecialized(std::ostream &os,
+						LINBOX_enum(Tag::FileFormat) format) const
+		{
+			if (have_reader()) {
+				return reader().write(os,format);
+			}
+
+			// SparseMatrix<Field,SparseMatrixFormat::CSR> Temp(field());
+			// this->exporte(Temp);
+			// Temp.write(os,format);
+			return os << "no export yet in HYB" << __FILE__ << ',' <<   __LINE__ ;
+
+		}
+
+
+	public:
+
+
+
+		void newCOO ()
+		{
+			linbox_check (!have_coo())
+			_coo= new SparseMatrix<Field,SparseMatrixFormat::COO>(_field);
+
+		}
+
+		void newCSR ()
+		{
+			linbox_check (!have_csr()) ;
+			_csr= new SparseMatrix<Field,SparseMatrixFormat::CSR>(_field);
+
+		}
+
+		void newELL_R ()
+		{
+			linbox_check (!have_ell_r()) ;
+			_ell_r= new SparseMatrix<Field,SparseMatrixFormat::ELL_R>(_field);
+
+		}
+
+		void newReader ()
+		{
+			linbox_check(!have_reader()) ;
+			_reader= new SparseMatrix<Field,SparseMatrixFormat::CSR>(_field);
+		}
+
+
+
+		bool have_coo() const
+		{
+			return _coo != NULL ;
+		}
+		bool have_csr() const
+		{
+			return _csr != NULL ;
+		}
+		bool have_ell_r() const
+		{
+			return _ell_r != NULL ;
+		}
+		bool have_reader() const
+		{
+			return _reader != NULL ;
+		}
+
+	SparseMatrix<Field,SparseMatrixFormat::COO> & coo(void)
+		{
+			linbox_check(have_coo());
+			return _coo[0] ;
+		}
+
+	const SparseMatrix<Field,SparseMatrixFormat::COO> & coo(void) const
+		{
+			linbox_check(have_coo());
+			return _coo[0] ;
+		}
+
+
+
+		SparseMatrix<Field,SparseMatrixFormat::CSR> & csr(void)
+		{
+			linbox_check(have_csr());
+			return _csr[0] ;
+		}
+
+		const	SparseMatrix<Field,SparseMatrixFormat::CSR> & csr(void) const
+		{
+			linbox_check(have_csr());
+			return _csr[0] ;
+		}
+
+		SparseMatrix<Field,SparseMatrixFormat::ELL_R> & ell_r(void)
+		{
+			linbox_check(have_ell_r());
+			return _ell_r[0] ;
+		}
+
+		const	SparseMatrix<Field,SparseMatrixFormat::ELL_R> & ell_r(void) const
+		{
+			linbox_check(have_ell_r());
+			return _ell_r[0] ;
+		}
+
+		SparseMatrix<Field,SparseMatrixFormat::CSR> & reader(void)
+		{
+			linbox_check(have_reader());
+			return _reader[0] ;
+		}
+
+		const SparseMatrix<Field,SparseMatrixFormat::CSR> & reader(void) const
+		{
+			linbox_check(have_reader());
+			return _reader[0] ;
+		}
+
+
+
+	protected :
+
+
+		size_t              _rownb ;
+		size_t              _colnb ;
+		size_t               _nbnz ;
+
+		SparseMatrix<Field,SparseMatrixFormat::COO>   * _coo  ;
+		SparseMatrix<Field,SparseMatrixFormat::CSR>   * _csr  ;
+		SparseMatrix<Field,SparseMatrixFormat::ELL_R> * _ell_r ;
+
+		SparseMatrix<Field,SparseMatrixFormat::CSR>   * _reader  ;
+
+		const _Field            & _field ;
+
+	};
+
+
+
+
+
+} // namespace LinBox
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_hyb_matrix_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-map-map-matrix.h b/linbox/matrix/sparsematrix/sparse-map-map-matrix.h
new file mode 100644
index 0000000..a0460c1
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-map-map-matrix.h
@@ -0,0 +1,216 @@
+/* Copyright (C) 2013 LinBox
+ * Written by AJS <stachnik at udel.edu>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file   matrix/sparsematrix/sparse-map-map-matrix.h
+ * @ingroup sparsematrix
+ * @brief Supports fast elementary row AND column operations simultaneously
+ */
+
+#ifndef __LINBOX_SPARSE_MAP_MAP_MATRIX_H
+#define __LINBOX_SPARSE_MAP_MAP_MATRIX_H
+
+#include <stdlib.h>
+#include <fstream>
+#include <map>
+#include <iostream>
+
+#include <linbox/linbox-config.h>
+#include <linbox/matrix/sparse-formats.h>
+#include <linbox/util/debug.h>
+#include <linbox/util/field-axpy.h>
+#include <linbox/blackbox/blackbox-interface.h>
+#include <linbox/field/hom.h>
+
+
+namespace LinBox
+{
+
+template<class Field_>
+class SparseMatrix<Field_,SparseMatrixFormat::SMM> : public BlackboxInterface {
+public:
+	typedef Field_ Field;
+	typedef typename Field::Element Element;
+	typedef size_t Index;
+	typedef SparseMatrix<Field_,SparseMatrixFormat::SMM> Self_t;
+	typedef std::map<Index,Element> VectorType;
+	typedef typename VectorType::iterator VectorIt;
+	typedef typename VectorType::const_iterator VectorConstIt;
+	typedef std::map<Index,VectorType> MapType;
+	typedef typename MapType::iterator MapIt;
+	typedef typename MapType::const_iterator MapConstIt;
+
+	SparseMatrix();
+
+	SparseMatrix(const Field& F);
+
+	SparseMatrix(const Field& F, Index r, Index c);
+
+	SparseMatrix(const SparseMatrix& M);
+
+	void init(const Field& F, Index r, Index c);
+
+	void shape(Index r, Index c);
+
+	SparseMatrix& operator=(const SparseMatrix& M);
+
+	~SparseMatrix();
+
+	void finalize() {}
+
+	Index rowdim() const;
+
+	Index coldim() const;
+
+	const Field& field() const;
+
+	void setEntry(Index i, Index j, const Element& e);
+
+	const Element& getEntry(Index i, Index j) const;
+
+	const Element& getEntry(Element& d, Index i, Index j) const;
+
+	// For debugging only
+	bool verify();
+
+	// y <- Ax
+	template<class OutVector, class InVector>
+	OutVector& apply(OutVector& y, const InVector& x) const;
+
+	// y <- xA
+	template<class OutVector, class InVector>
+	OutVector& applyTranspose(OutVector& y, const InVector& x) const;
+
+	//forall r: A_{i,r}<-A_{i,r}+k*A_{j,r}
+	void addRow(const Element& k, Index i, Index j);
+
+	//forall r: A_{r,i}<-A_{r,i}+k*A_{r,j}
+	void addCol(const Element& k, Index i, Index j);
+
+	//forall r: A_{i,r}<-k*A_{i,r}
+	void timesRow(const Element& k, Index i);
+
+	//forall r: A_{r,j}<-k*A_{r,j}
+	void timesCol(const Element& k, Index j);
+
+	void swapRows(Index i, Index j);
+
+	void swapCols(Index i, Index j);
+
+	//forall i,j: A_{i,j} <- k*A_{i,j}
+	void scaleMat(const Element& k);
+
+	// A<-A^{t}
+	void transpose();
+
+	Index nnz() const;
+
+	// A -> A' = SAS^{-1}, and A' has about nnz nonzero entries.
+	void randomSim(Index nnz, int seed = 0);
+
+	// A -> A' = UAV, with U and V nonsingular, and A' has about nnz nonzero entries.
+	void randomEquiv(Index nnz, int seed = 0);
+
+	bool areEqual(Self_t& rhs) const;
+
+	std::istream& read(std::istream& in);
+
+	// Output pretty-printed matrix
+	std::ostream& print(std::ostream& out) const;
+
+	std::ostream& write(std::ostream& out) const;
+
+	// Initialize argument from this matrix using mat.read()
+	template<class Matrix>
+	void copy(Matrix& mat) const;
+
+	// Initialize this matrix from argument using mat.write()
+	template<class Matrix>
+	void copyFrom(Matrix& mat);
+
+	// Initializes the given vector using the entries from this matrix
+	// Requires an n-by-1 or 1-by-n matrix
+	template<class Vector>
+	void toVector(Vector& vec) const;
+
+	// Initializes this matrix from the given vector
+	// For a row vector use r=vec.size(), c=1
+	// For a column vector use c=vec.size(), r=1
+	template<class Vector>
+	void fromVector(const Vector& vec, Index r, Index c);
+
+	// Initialize mat to be a companion matrix of the polynomial
+	// s.t. mat[i,n-1]==coeffs[i]
+	// Assumes mat is n-by-n with n==coeffs.size()
+	static void generateCompanion(Self_t& mat,std::vector<Element>& coeffs);
+
+	// Initializes each entry of mat with a random field element
+	static void generateDenseRandMat(Self_t& mat, int seed=0);
+
+	// Initialize mat with nnz non-zero random elements at random locations
+	// Warning: Very inefficient as nnz approaches n*m (keep nnz < about 0.2 n*m)
+	static void generateRandMat(Self_t& mat, int nnz, int seed=0);
+
+	// Initializes mat to dI
+	static void generateScaledIdent(Self_t& mat, const Element& d);
+
+	// Initializes mat with at least approxNNZ entries
+	// Assumes mat is n-by-n
+	// Mat is guaranteed to be non-singular
+	// Warning: Very inefficient as nnz approaches n*m (keep nnz < about 0.2 n*m)
+	static void generateSparseNonSingular(Self_t& mat, int approxNNZ, int seed=0);
+
+protected:
+
+	static int randRange(int start, int end);
+
+	static Element& nonzerorandom(const Field& F, typename Field::RandIter& r,Element& e);
+
+	MatrixDomain<Field> MD_;
+
+	MapType rowMap_;
+
+	MapType colMap_;
+
+	Index numCols_;
+
+	Index numRows_;
+
+	Index nnz_;
+
+	Element zero_;
+};
+
+}
+
+#include <linbox/matrix/sparsematrix/sparse-map-map-matrix.inl>
+
+#endif // __SPARSE_MAP_MAP_MATRIX_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-map-map-matrix.inl b/linbox/matrix/sparsematrix/sparse-map-map-matrix.inl
new file mode 100644
index 0000000..84e37c8
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-map-map-matrix.inl
@@ -0,0 +1,672 @@
+/* Copyright (C) 2013 LinBox
+ * Written by AJS <stachnik at udel.edu>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file   matrix/sparsematrix/sparse-map-map-matrix.inl
+ * @ingroup sparsematrix
+ * @brief Supports fast elementary row AND column operations simultaneously
+ */
+
+#ifndef __LINBOX_SPARSE_MAP_MAP_MATRIX_INL
+#define __LINBOX_SPARSE_MAP_MAP_MATRIX_INL
+
+#include <stdlib.h>
+#include <fstream>
+#include <sstream>
+#include <set>
+#include <utility>
+#include <linbox/util/matrix-stream.h>
+
+namespace LinBox
+{
+
+template<class Field_>
+SparseMatrix<Field_,SparseMatrixFormat::SMM>::SparseMatrix() : MD_(),numCols_(0), numRows_(0), nnz_(0) {}
+
+template<class Field_>
+SparseMatrix<Field_,SparseMatrixFormat::SMM>::SparseMatrix(const Field& F) :
+	MD_(F),numCols_(0), numRows_(0), nnz_(0) {F.assign(zero_,F.zero);}
+
+template<class Field_>
+SparseMatrix<Field_,SparseMatrixFormat::SMM>::SparseMatrix(const Field& F, Index r, Index c):
+	MD_(F), numCols_(c), numRows_(r), nnz_(0) {F.assign(zero_,F.zero);}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::init(const Field& F, Index r, Index c) {
+        MD_=F;
+        F.assign(zero_,F.zero);
+        shape(r,c);
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::shape(Index r, Index c) {
+        rowMap_.clear();
+        colMap_.clear();
+        numRows_=r;
+        numCols_=c;
+        nnz_=0;
+}
+
+template<class Field_>
+template<class Vector>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::fromVector(const Vector& vec, Index r, Index c) {
+        shape(r,c);
+        if (numCols_==1) {
+                for (Index i=0;i<numRows_;++i) {
+                        setEntry(i,0,vec[i]);
+                }
+        } else {
+                for (Index j=0;j<numCols_;++j) {
+                        setEntry(0,j,vec[j]);
+                }
+        }
+}
+
+template<class Field_>
+SparseMatrix<Field_,SparseMatrixFormat::SMM>::SparseMatrix(const SparseMatrix<Field_,SparseMatrixFormat::SMM>& M):
+        MD_(M.field()),
+	rowMap_(M.rowMap_), colMap_(M.colMap_),
+        numCols_(M.numCols_), numRows_(M.numRows_),
+        nnz_(M.nnz_), zero_(M.zero_) {}
+
+template<class Field_>
+SparseMatrix<Field_,SparseMatrixFormat::SMM>& SparseMatrix<Field_,SparseMatrixFormat::SMM>::operator=(const SparseMatrix<Field_,SparseMatrixFormat::SMM>& rhs)
+{
+	if (rhs==this) return;
+	MD_.init(rhs.MD_);
+	numCols_=rhs.numCols_;
+	numRows_=rhs.numRows_;
+	rowMap_=rhs.rowMap_;
+	colMap_=rhs.colMap_;
+	nnz_=rhs.nnz_;
+	zero_=rhs.zero_;
+
+	return *this;
+}
+
+template<class Field_>
+SparseMatrix<Field_,SparseMatrixFormat::SMM>::~SparseMatrix() {}
+
+template<class Field_>
+const Field_& SparseMatrix<Field_,SparseMatrixFormat::SMM>::field() const
+{
+	return MD_.field();
+}
+
+template<class Field_>
+bool SparseMatrix<Field_,SparseMatrixFormat::SMM>::verify()
+{
+	for (int i=0;i<rowdim();++i) {
+		for (int j=0;j<coldim();++j) {
+			Element d=zero_;
+			MapConstIt row=rowMap_.find(i);
+			if (row != rowMap_.end()) {
+				VectorConstIt entry=(row->second).find(j);
+				if (entry != (row->second.end())) {
+					d=entry->second;
+				}
+			}
+			Element e=zero_;
+			MapConstIt col=colMap_.find(j);
+			if (col != colMap_.end()) {
+				VectorConstIt entry=(col->second).find(i);
+				if (entry != (col->second.end())) {
+					e=entry->second;
+				}
+			}
+			if (d!=e) {
+				return false;
+			}
+		}
+	}
+        return true;
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::setEntry(Index i, Index j, const Element& e)
+{
+	VectorIt it=rowMap_[i].find(j);
+	if (it != rowMap_[i].end()) {
+		--nnz_;
+		rowMap_[i].erase(it);
+		VectorIt colIt=colMap_[j].find(i);
+		colMap_[j].erase(colIt);
+	}
+
+	if (!field().isZero(e)) {
+		++nnz_;
+		field().assign(rowMap_[i][j],e);
+		field().assign(colMap_[j][i],e);
+	}
+}
+
+template<class Field_> const typename SparseMatrix<Field_,SparseMatrixFormat::SMM>::Element&
+SparseMatrix<Field_,SparseMatrixFormat::SMM>::getEntry(Index i, Index j) const
+{
+	MapConstIt row=rowMap_.find(i);
+	if (row != rowMap_.end()) {
+		VectorConstIt entry=(row->second).find(j);
+		if (entry != (row->second.end())) {
+			return (entry->second);
+		}
+	}
+	return zero_;
+}
+
+template<class Field_> const typename SparseMatrix<Field_,SparseMatrixFormat::SMM>::Element&
+SparseMatrix<Field_,SparseMatrixFormat::SMM>::getEntry(Element& d, Index i, Index j) const
+{
+	MapConstIt row=rowMap_.find(i);
+	if (row != rowMap_.end()) {
+		VectorConstIt entry=(row->second).find(j);
+		if (entry != (row->second.end())) {
+			d=entry->second;
+			return (entry->second);
+		}
+	}
+	d=zero_;
+	return zero_;
+}
+
+template<class Field_>
+template<class OutVector, class InVector>
+OutVector& SparseMatrix<Field_,SparseMatrixFormat::SMM>::apply(OutVector& y, const InVector& x) const
+{
+	linbox_check(rowdim()==y.size());
+	linbox_check(coldim()==x.size());
+	for (int i=0;i<rowdim();++i) {
+		Element d,e;
+		field().init(d,0);
+		MapConstIt rowI=rowMap_.find(i);
+		if (rowI != rowMap_.end()) {
+			for (VectorConstIt it=rowI->second.begin();
+			     it!=rowI->second.end();++it) {
+				field().mul(e,it->second,x[it->first]);
+				field().addin(d,e);
+			}
+		}
+		y[i]=d;
+	}
+	return y;
+}
+
+template<class Field_>
+template<class OutVector, class InVector>
+OutVector& SparseMatrix<Field_,SparseMatrixFormat::SMM>::applyTranspose(OutVector& y, const InVector& x) const
+{
+	linbox_check(coldim()==y.size());
+	linbox_check(rowdim()==x.size());
+	for (int i=0;i<coldim();++i) {
+		Element d,e;
+		field().init(d,0);
+		MapConstIt colI=colMap_.find(i);
+		if (colI != colMap_.end()) {
+			for (VectorConstIt it=colI->second.begin();
+			     it!=colI->second.end();++it) {
+				field().mul(e,it->second,x[it->first]);
+				field().addin(d,e);
+			}
+		}
+		y[i]=d;
+	}
+	return y;
+}
+
+//forall r: A_{i,r}<-A_{i,r}+k*A_{j,r}
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::addRow(const Element& k, Index i, Index j)
+{
+	MapIt rowJ=rowMap_.find(j);
+	if (rowJ != rowMap_.end()) {
+		for (VectorIt it=rowJ->second.begin();it!=rowJ->second.end();++it) {
+			Index col=it->first;
+			Element d=getEntry(i,col);
+			field().axpyin(d,k,it->second);
+			setEntry(i,col,d);
+		}
+	}
+}
+
+//forall r: A_{r,i}<-A_{r,i}+k*A_{r,j}
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::addCol(const Element& k, Index i, Index j)
+{
+	MapIt colJ=colMap_.find(j);
+	if (colJ != colMap_.end()) {
+		for (VectorIt it=colJ->second.begin();it!=colJ->second.end();++it) {
+			Index row=it->first;
+			Element d = getEntry(row,i);
+			field().axpyin(d,k,it->second);
+			setEntry(row,i,d);
+		}
+	}
+}
+
+//forall r: A_{i,r}<-k*A_{i,r}
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::timesRow(const Element& k, Index i)
+{
+	linbox_check(!(field().isZero(k)));
+
+	MapIt row=rowMap_.find(i);
+	if (row != rowMap_.end()) {
+		for (VectorIt it=row->second.begin();it!=row->second.end();++it) {
+			Index col=it->first;
+			field().mulin(rowMap_[i][col],k);
+			field().mulin(colMap_[col][i],k);
+		}
+	}
+}
+
+//forall r: A_{r,j}<-k*A_{r,j}
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::timesCol(const Element& k, Index j)
+{
+	linbox_check(!(field().isZero(k)));
+
+	MapIt col=colMap_.find(j);
+	if (col != colMap_.end()) {
+		for (VectorIt it=col->second.begin();it!=col->second.end();++it) {
+			Index row=it->first;
+			field().mulin(rowMap_[row][j],k);
+			field().mulin(colMap_[j][row],k);
+		}
+	}
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::swapRows(Index i, Index j)
+{
+	VectorType oldRowI=rowMap_[i];
+	VectorType oldRowJ=rowMap_[j];
+
+	rowMap_[i].clear();
+	rowMap_[j].clear();
+
+	for (VectorIt it=oldRowI.begin();it!=oldRowI.end();++it) {
+		Index col=it->first;
+		colMap_[col].erase(colMap_[col].find(i));
+	}
+
+	for (VectorIt it=oldRowJ.begin();it!=oldRowJ.end();++it) {
+		Index col=it->first;
+		colMap_[col].erase(colMap_[col].find(j));
+	}
+
+	for (VectorIt it=oldRowI.begin();it!=oldRowI.end();++it) {
+		Index col=it->first;
+		rowMap_[j][col]=oldRowI[col];
+		colMap_[col][j]=oldRowI[col];
+	}
+
+	for (VectorIt it=oldRowJ.begin();it!=oldRowJ.end();++it) {
+		Index col=it->first;
+		rowMap_[i][col]=oldRowJ[col];
+		colMap_[col][i]=oldRowJ[col];
+	}
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::swapCols(Index i, Index j)
+{
+	VectorType oldColI=colMap_[i];
+	VectorType oldColJ=colMap_[j];
+
+	colMap_[i].clear();
+	colMap_[j].clear();
+
+	for (VectorIt it=oldColI.begin();it!=oldColI.end();++it) {
+		Index row=it->first;
+		rowMap_[row].erase(rowMap_[row].find(i));
+	}
+
+	for (VectorIt it=oldColJ.begin();it!=oldColJ.end();++it) {
+		Index row=it->first;
+		rowMap_[row].erase(rowMap_[row].find(j));
+	}
+
+	for (VectorIt it=oldColI.begin();it!=oldColI.end();++it) {
+		Index row=it->first;
+		colMap_[j][row]=oldColI[row];
+		rowMap_[row][j]=oldColI[row];
+	}
+
+	for (VectorIt it=oldColJ.begin();it!=oldColJ.end();++it) {
+		Index row=it->first;
+		colMap_[i][row]=oldColJ[row];
+		rowMap_[row][i]=oldColJ[row];
+	}
+}
+
+template<class Field_>
+typename SparseMatrix<Field_,SparseMatrixFormat::SMM>::Index SparseMatrix<Field_,SparseMatrixFormat::SMM>::nnz() const
+{
+	return nnz_;
+}
+
+// A -> A' = SAS^{-1}, and A' has about nnz nonzero entries.
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::randomSim(Index nz, int seed)
+{	typename Field::Element a;
+	Index i,j;
+	MersenneTwister ri;
+	typename Field::RandIter r(field(),0, seed);
+	//if (seed != 0) { ri.setSeed(seed); r.setSeed(seed); }
+	if (seed != 0)
+	{	ri.setSeed(seed);
+		// ridiculous constructor only seeding!
+		typename Field::RandIter s(field(), 0, seed);
+		r = s;
+	}
+	while (nnz() < nz) {
+		nonzerorandom(field(),r,a);
+		i = ri.randomIntRange(0, rowdim()); j = ri.randomIntRange(0, coldim());
+		if (i!=j) {
+			addCol(a, j, i);
+			//std::cout << nnz() << std::endl;
+			field().negin(a);
+			addRow(a, i, j);
+		}
+	}
+}
+
+// A -> A' = UAV, with U and V nonsingular, and A' has about nnz nonzero entries.
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::randomEquiv(Index nz, int seed)
+{	typename Field::Element a;
+	Index i,j;
+	MersenneTwister ri;
+	typename Field::RandIter r(field(),0,seed);
+	if (seed != 0)
+	{	ri.setSeed(seed);
+		// ridiculous seeding!
+		typename Field::RandIter s(field(), 0, seed);
+		r = s;
+	}
+	bool flip = true;
+	int count=0;
+	while (nnz() < nz) {
+		nonzerorandom(field(),r,a);
+		i = ri.randomIntRange(0, rowdim()); j = ri.randomIntRange(0, coldim());
+		if (i!=j){
+			if (flip) addCol(a, i, j);
+			else addRow(a, i, j);
+			flip = not flip;
+		}
+		++count;
+	}
+}
+
+template<class Field_>
+std::ostream& SparseMatrix<Field_,SparseMatrixFormat::SMM>::print(std::ostream& out) const
+{
+	for (Index i=0;i<numRows_;++i) {
+		for (Index j=0;j<numCols_;++j) {
+			field().write(out,getEntry(i,j));
+			if (j != (numCols_-1)) {
+				out << " ";
+			}
+		}
+		out << std::endl;
+	}
+        return out;
+}
+
+template<class Field_>
+std::ostream& SparseMatrix<Field_,SparseMatrixFormat::SMM>::write(std::ostream& out) const
+{
+	writeMMCoordHeader(out,*this,nnz(),"SparseMatrix<SMM>","");
+
+        for (MapConstIt p = rowMap_.begin(); p != rowMap_.end(); ++p)
+                for (VectorConstIt rp = p->second.begin(); rp != p->second.end(); ++rp)
+                        field().write(out << 1+p->first << " " << 1+rp->first << " ", rp->second) << std::endl;
+        out << std::endl;
+        return out;
+}
+
+template<class Field_>
+std::istream& SparseMatrix<Field_,SparseMatrixFormat::SMM>::read(std::istream& in) {
+        Index r,c;
+        Element d;
+        field().init(d);
+        MatrixStream<Field_> ms(field(),in);
+        ms.getDimensions(r,c);
+        shape(r,c);
+        while (ms.nextTriple(r,c,d)) setEntry(r,c,d);
+        return in;
+}
+
+template<class Field_>
+typename SparseMatrix<Field_,SparseMatrixFormat::SMM>::Index SparseMatrix<Field_,SparseMatrixFormat::SMM>::rowdim() const
+{
+        return numRows_;
+}
+
+template<class Field_>
+typename SparseMatrix<Field_,SparseMatrixFormat::SMM>::Index SparseMatrix<Field_,SparseMatrixFormat::SMM>::coldim() const
+{
+        return numCols_;
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::transpose()
+{
+        rowMap_.swap(colMap_);
+        int temp=numCols_;numCols_=numRows_;numRows_=temp;
+}
+
+template<class Field_>
+template<class Matrix>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::copy(Matrix& mat) const
+{
+        std::stringstream ss;
+        write(ss);
+        mat.read(ss);
+        mat.finalize();
+}
+
+template<class Field_>
+template<class Matrix>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::copyFrom(Matrix& mat)
+{
+        std::stringstream ss;
+        mat.write(ss);
+        read(ss);
+}
+
+template<class Field_>
+template<class Vector>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::toVector(Vector& vec) const
+{
+        if (numCols_ == 1) {
+	        vec.resize(numRows_);
+                for (Index i=0;i<numRows_;++i) {
+                        vec[i]=getEntry(i,0);
+                }
+        } else {
+	        vec.resize(numCols_);
+                for (Index j=0;j<numCols_;++j) {
+                        vec[j]=getEntry(0,j);
+                }
+        }
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::scaleMat(const Element& k)
+{
+        for (size_t i=0;i<numRows_;++i) {
+                timesRow(k,i);
+        }
+}
+
+template<class Field_>
+bool SparseMatrix<Field_,SparseMatrixFormat::SMM>::areEqual(SparseMatrix<Field_,SparseMatrixFormat::SMM>& rhs) const
+{
+        if (rhs.numCols_ != numCols_) {
+                return false;
+        }
+        if (rhs.numRows_ != numRows_) {
+                return false;
+        }
+        if (nnz_ != rhs.nnz_) {
+                return false;
+        }
+
+        for (MapConstIt rowIt=rowMap_.begin();rowIt!=rowMap_.end();++rowIt) {
+                for (VectorConstIt eltIt=rowIt->second.begin();eltIt!=rowIt->second.end();++eltIt) {
+                        if (eltIt->second != rhs.getEntry(rowIt->first,eltIt->first)) {
+                                return false;
+                        }
+                }
+        }
+        return true;
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::generateDenseRandMat(SparseMatrix<Field_,SparseMatrixFormat::SMM>& mat,int seed)
+{
+        typedef typename Field::Element Element;
+
+        size_t m=mat.rowdim(),n=mat.coldim();
+	Element d;
+
+	typename Field::RandIter ri(field(),0,seed);
+
+        for (size_t i=0;i<m;++i) {
+                for (size_t j=0;j<n;++j) {
+	                ri.random(d);
+                        mat.setEntry(i,j,d);
+                }
+        }
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::generateRandMat(SparseMatrix<Field_,SparseMatrixFormat::SMM>& mat, int nnz, int seed)
+{
+        typedef typename Field::Element Element;
+
+        
+        size_t m=mat.rowdim(),n=mat.coldim();
+	Element d;
+	typename Field::RandIter ri(field(),0,seed);
+	srand(seed);
+
+        typedef std::pair<size_t,size_t> CoordPair;
+        typedef std::set<CoordPair> PairSet;
+        PairSet pairs;
+
+	for(int i = 0; i < (int)nnz; ++i) {
+                size_t row,col;
+                do {
+                        row = randRange(0,(int)m);
+                        col = randRange(0,(int)n);
+                } while (pairs.count(CoordPair(row,col))!=0);
+
+                nonzerorandom(field(),ri,d);
+                mat.setEntry(row,col,d);
+                pairs.insert(CoordPair(row,col));
+        }
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::
+generateScaledIdent(SparseMatrix<Field_,SparseMatrixFormat::SMM>& mat,
+                    const typename Field_::Element& d)
+{
+        size_t m=mat.rowdim(),n=mat.coldim();
+        size_t minDim=(m<n)?m:n;
+
+        for (size_t i=0;i<minDim;++i) {
+                mat.setEntry(i,i,d);
+        }
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::generateSparseNonSingular(SparseMatrix<Field_,SparseMatrixFormat::SMM>& mat, int approxNNZ, int seed)
+{
+        typedef typename Field::Element Element;
+        int n=mat.rowdim();
+        linbox_check(mat.rowdim()==mat.coldim());
+
+        typename Field::RandIter r(mat.field(),0,seed);
+
+	Element d;
+
+        for (int i=0;i<n;++i) {
+	        nonzerorandom(field(),r,d);
+                mat.setEntry(i,i,d);
+        }
+
+        mat.randomEquiv(approxNNZ,seed);
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::SMM>::generateCompanion(SparseMatrix<Field_,SparseMatrixFormat::SMM>& mat,std::vector<typename Field::Element>& coeffs)
+{
+        typedef typename Field::Element Element;
+        int n=mat.rowdim();
+        linbox_check(mat.rowdim()==mat.coldim());
+        linbox_check(n==coeffs.size());
+
+	Element d;
+	mat.field().assign(d,mat.field().one);
+        for (int i=1;i<n;++i) {
+                mat.setEntry(i,i-1,d);
+        }
+	for (int i=0;i<n;++i) {
+		mat.setEntry(i,n-1,coeffs[i]);
+	}
+}
+
+template<class Field_>
+int SparseMatrix<Field_,SparseMatrixFormat::SMM>::randRange(int start, int end)
+{
+        double rval = rand();
+        static const double NORMALIZING_CONSTANT = 1.0/(1.0+RAND_MAX);
+        double normedRVal = rval*NORMALIZING_CONSTANT;
+        double rangeSize = end-start;
+        int offset = (int)(rangeSize*normedRVal);
+        return start+offset;
+}
+
+template<class Field_>
+typename Field_::Element&
+SparseMatrix<Field_,SparseMatrixFormat::SMM>::nonzerorandom(const Field_& F,typename Field_::RandIter&r,typename Field_::Element& e)
+{
+	do {
+		r.random(e);
+	} while (F.isZero(e));
+	return e;
+}
+
+}
+
+#endif // __LINBOX_SPARSE_MAP_MAP_MATRIX_INL
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-parallel-vector.h b/linbox/matrix/sparsematrix/sparse-parallel-vector.h
new file mode 100644
index 0000000..9d57a86
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-parallel-vector.h
@@ -0,0 +1,735 @@
+/* linbox/matrix/sparse-matrix.h
+ * Copyright (C) 2001-2002 Bradford Hovinen
+ *               1999-2001 William J Turner,
+ *
+ * Written by William J Turner <wjturner at math.ncsu.edu>,
+ *            Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * --------------------------------------------------------
+ * 2003-01-11  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
+ *
+ * Move from blackbox/sparse-base.h to matrix/sparse-matrix.h
+ * ------------------------------------
+ * 2002-11-28  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
+ *
+ *   - Renamed ColOfRowsIterator to RowIterator
+ *   - Named template argument _Row rather than Row; add a typedef to Row
+ *   - Named template argument _Element rather than Row; add a typedef to Element
+ *   - Renamed IndexIterator as IndexedIterator, and adjusted to match
+ *     interface in DenseMatrixBase
+ * ------------------------------------
+ * 2002-08-06  Bradford Hovinen  <hovinen at cis.udel.edu>
+ *
+ * Renamed to sparse-base.h from sparse0-base.h
+ * ------------------------------------
+ * Modified by Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * Refactoring:
+ *   - Eliminated SparseMatrixAux and moved that functionality into Sparse0
+ *   - Made SparseMatrixGeneric parameterized only on the element type
+ *   - New read/write implementations for SparseMatrixGeneric, supporting multiple
+ *     formats
+ *   - Eliminated Gaussian elimination code
+ *   - Added iterators, including ColOfRowsIterator, Iterator, and
+ *     IndexIterator
+ *   - Eliminated operator []; added getEntry; changed put_value to setEntry
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/** @file linbox/matrix/sparsematrix/sparse-parallel-vector.h
+ * @brief
+ */
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_parallel_vector_H
+#define __LINBOX_matrix_sparsematrix_sparse_parallel_vector_H
+
+
+namespace LinBox {
+
+
+	// Specialization of the above for sparse parallel vectors
+	template <class _Field, class Row>
+	class SparseMatrixWriteHelper<Protected::SparseMatrixGeneric<_Field, Row, VectorCategories::SparseParallelVectorTag > > {
+	public:
+		typedef         _Field          Field;
+		typedef typename Field::Element Element;
+		typedef typename Protected::SparseMatrixGeneric<Field, Row> Matrix ;
+	private:
+		static std::ostream &writeTriple (const Matrix &A, std::ostream &os, bool oneBased = false);
+
+		static std::ostream &writePretty (const Matrix &A, std::ostream &os
+						  , std::string begmat
+						  , std::string endmat
+						  , std::string begrow
+						  , std::string endrow
+						  , std::string sepelt
+						  , std::string seprow
+						 );
+
+
+	public:
+
+		static std::ostream &write (const Matrix &A, std::ostream &os
+					    , LINBOX_enum(Tag::FileFormat) format);
+	};
+
+} // LinBox
+
+
+namespace LinBox { namespace Protected {
+	/* Specialization for sparse parallel vectors */
+	template <class _Field, class _Row>
+	class SparseMatrixGeneric<_Field, _Row, VectorCategories::SparseParallelVectorTag > {
+	public:
+
+		typedef         _Field          Field;
+		typedef typename Field::Element Element;
+
+		typedef _Row                Row;
+		typedef const Row      ConstRow;
+		typedef _SP_BB_VECTOR_<Row> Rep;
+		typedef VectorCategories::SparseParallelVectorTag myTrait;
+		typedef SparseMatrixGeneric<_Field, _Row, myTrait> Self_t;
+
+#ifdef __LINBOX_PARALLEL
+		BB_list_list sub_list;
+#endif
+
+
+		template<typename _Tp1, typename _R1 = typename Rebind<_Row,_Tp1>::other >
+		struct rebind {
+			typedef SparseMatrixGeneric<_Tp1, _R1> other;
+
+			void operator() (other & Ap, const Self_t& A) {
+
+				typename _Tp1::Element e;
+
+				Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+				for( typename Self_t::ConstIndexedIterator
+				     indices = A.IndexedBegin();
+				     (indices != A.IndexedEnd()) ;
+				     ++indices ) {
+					// hom. image (e, A.getEntry(indices.rowIndex(),indices.colIndex()) );
+					hom. image (e, indices.value() );
+					if (!Ap.field().isZero(e))
+						Ap.setEntry (indices.rowIndex(),
+							     indices.colIndex(), e);
+				}
+			}
+
+		};
+
+		template<typename _Tp1, typename _Rw1>
+		SparseMatrixGeneric (const SparseMatrixGeneric<_Tp1, _Rw1, myTrait> &Mat, const Field& F) :
+			_field (F),
+			_MD (F), _AT (*this)
+			, _matA (Mat.rowdim()), _m (Mat.rowdim()), _n (Mat.coldim())
+		{
+			typename SparseMatrixGeneric<_Tp1,_Rw1, myTrait>::template rebind<Field,_Row>()(*this, Mat);
+		}
+
+		SparseMatrixGeneric (const Field & F, size_t m, size_t n) :
+			_field(F),
+			_MD(F),_AT(*this),
+			_matA (m), _m (m), _n (n)
+		{}
+
+		SparseMatrixGeneric (const Field & F) :
+			_field (F),
+			_MD(F),_AT(*this),
+			_matA(0), _m(0), _n(0)
+		{};
+
+
+		SparseMatrixGeneric (const SparseMatrixGeneric<Field, Row> &A) :
+			_field(A.field()),
+			_MD(A.field()),_AT(*this),
+			_matA (A._matA), _m (A._m), _n (A._n)
+		{}
+
+		template<class VectorType>
+		SparseMatrixGeneric (const SparseMatrixGeneric<Field, VectorType> &A) :
+			_field(A.field()),
+			_MD(A.field()),_AT(*this),
+			_matA(A.rowdim()), _m (A.rowdim()), _n (A.coldim())
+		{
+			typename Rep::iterator meit = this->_matA.begin();
+			typename SparseMatrixGeneric<Field, VectorType>::Rep::const_iterator copit = A._matA.begin();
+			for( ; meit != this->_matA.end(); ++meit, ++copit)
+				LinBox::RawVector<Element>::convert(*meit, *copit);
+		}
+
+		/** Constructor from a MatrixStream
+		*/
+		SparseMatrixGeneric ( MatrixStream<Field>& ms );
+
+		template<class VectStream>
+		SparseMatrixGeneric (const Field &F, VectStream &stream) :
+			_field (F), _MD (F), _AT (*this)
+			, _matA (stream.size()), _m (stream.size()), _n (stream.dim())
+		{
+			typename Self_t::RowIterator i;
+
+			for (i = Self_t::rowBegin (); i != Self_t::rowEnd (); ++i)
+				stream >> *i;
+		}
+
+		~SparseMatrixGeneric () {}
+
+		size_t rowdim () const
+		{
+			return _m;
+		}
+
+		size_t coldim () const
+		{
+			return _n;
+		}
+
+		size_t size () const
+		{
+			size_t s(0);
+			for(typename Rep::const_iterator it = _matA.begin(); it != _matA.end(); ++it)
+				s+= LinBox::RawVector<Element>::size(*it);
+			return s;
+		}
+
+		std::istream &read (std::istream &is
+				    , LINBOX_enum(Tag::FileFormat) format  = Tag::FileFormat::Detect )
+		{
+			return SparseMatrixReadHelper<Self_t>::read (*this, is , format);
+		}
+
+
+		std::ostream &write (std::ostream &os
+				     , LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::MatrixMarket ) const
+		{
+			return SparseMatrixWriteHelper<Self_t>::write (*this, os, format);
+		}
+
+		void appendEntry(size_t i, size_t j, const Element & value) { setEntry(i,j,value) ;}
+		void finalize(){}
+
+		void           setEntry (size_t i, size_t j, const Element &value);
+
+
+		Element       &refEntry (size_t i, size_t j);
+
+		const Element &getEntry (size_t i, size_t j) const;
+
+		Element       &getEntry (Element &x, size_t i, size_t j) const
+		{
+			return x = getEntry (i, j);
+		}
+
+		typedef typename Rep::iterator RowIterator;
+		typedef typename Rep::const_iterator ConstRowIterator;
+
+		ConstRowIterator rowBegin () const
+		{
+			return _matA.begin ();
+		}
+
+		ConstRowIterator rowEnd () const
+		{
+			return _matA.end ();
+		}
+
+		RowIterator rowBegin ()
+		{
+			return _matA.begin ();
+		}
+
+		RowIterator rowEnd ()
+		{
+			return _matA.end ();
+		}
+
+		template <class RepIterator, class RowEltIterator, class _I_Element>
+		class _Iterator {
+		public:
+			typedef _I_Element value_type;
+
+			_Iterator (const RepIterator &i, const RowEltIterator &j, const RepIterator &A_end) :
+				_i (i), _j (j), _A_end (A_end)
+			{
+				if( _i == _A_end ) return;
+				while( _j == _i->second.end() ) {
+					if( ++_i == _A_end ) return;
+					_j = _i->second.begin();
+				}
+			}
+
+			_Iterator (const _Iterator &iter) :
+				_i (iter._i), _j (iter._j), _A_end (iter._A_end)
+			{}
+
+			_Iterator () {}
+
+			_Iterator &operator = (const _Iterator &iter)
+			{
+				_i = iter._i;
+				_j = iter._j;
+				_A_end = iter._A_end;
+
+				return *this;
+			}
+
+			bool operator == (const _Iterator &i) const
+			{
+				return (_i == i._i) && (_j == i._j);
+			}
+
+			bool operator != (const _Iterator &i) const
+			{
+				return (_i != i._i) || (_j != i._j);
+			}
+
+			_Iterator &operator ++ ()
+			{
+				++_j;
+				while( _j == _i->second.end() ) {
+					if( ++_i == _A_end ) return *this;
+					_j = _i->second.begin();
+				}
+				return *this;
+			}
+
+			_Iterator operator ++ (int)
+			{
+				_Iterator tmp = *this;
+				++(*this);
+				return tmp;
+			}
+
+			_Iterator &operator -- ()
+			{
+				while (_j == _i->second.begin ())
+					_j = (--_i)->second.end ();
+				--_j;
+				return *this;
+			}
+
+			_Iterator operator -- (int)
+			{
+				_Iterator tmp = *this;
+				--(*this);
+				return tmp;
+			}
+
+			value_type &operator * ()
+			{
+				return static_cast<value_type&>(*_j);
+			}
+
+			value_type *operator -> ()
+			{
+				return &(*_j);
+			}
+
+		private:
+			RepIterator _i;
+			RowEltIterator _j;
+			RepIterator _A_end;
+		};
+
+		typedef _Iterator<typename Rep::iterator, typename Row::second_type::iterator, Element> Iterator;
+		typedef _Iterator<typename Rep::const_iterator, typename Row::second_type::const_iterator, const Element> ConstIterator;
+
+		Iterator Begin ()
+		{
+			return Iterator (_matA.begin (), _matA.front ().second.begin (), _matA.end ());
+		}
+		Iterator End ()
+		{
+			return Iterator (_matA.end (), _matA.back ().second.end (), _matA.end ());
+		}
+		ConstIterator Begin () const
+		{
+			return ConstIterator (_matA.begin (), _matA.front ().second.begin (), _matA.end ());
+		}
+		ConstIterator End () const
+		{
+			return ConstIterator (_matA.end (), _matA.back ().second.end (), _matA.end ());
+		}
+
+		/* Generic trait for iterators without type */
+		template<typename U>
+		struct IteratorValueType {
+			typedef typename U::value_type value_type;
+		};
+
+		template<typename X>
+		struct IteratorValueType<const X*> {
+			typedef X value_type;
+		};
+
+
+		template <class RepIterator, class RowIdxIterator>
+		class _IndexedIterator {
+		public:
+			typedef typename IteratorValueType<RepIterator>::value_type PairValue ;
+			typedef typename PairValue::second_type::value_type value_type;
+
+			typedef _IndexedIterator<RepIterator,RowIdxIterator> Self_t;
+
+			// typedef typename IteratorValueType< RepIterator >::second_type::value_type value_type;
+
+			// Dan Roche 7-6-05 Fixed a seg fault this code was causing
+			_IndexedIterator (size_t idx, const RepIterator &i,
+					  const RowIdxIterator &j, const RepIterator &A_end) :
+				_i (i), _j (j), _A_end (A_end), _r_index (idx), _c_index(0), _value_index(0)
+			{
+				if( _i == _A_end ) return;
+				while( _j == _i->first.end() ) {
+					if( ++_i == _A_end ) return;
+					++_r_index;
+					_j = _i->first.begin();
+				}
+
+				_c_index = *_j;
+				_value_index = (size_t)( _j-_i->first.begin());
+			}
+
+			_IndexedIterator (const _IndexedIterator &iter) :
+				_i (iter._i), _j (iter._j),
+				_A_end (iter._A_end), _r_index (iter._r_index),
+				_c_index (iter._c_index), _value_index( iter._value_index )
+			{}
+
+			_IndexedIterator ()
+			{}
+
+			_IndexedIterator &operator = (const _IndexedIterator &iter)
+			{
+				_A_end = iter._A_end;
+				_i = iter._i;
+				_j = iter._j;
+				_r_index = iter._r_index;
+				_c_index = iter._c_index;
+				_value_index = iter._value_index;
+
+				return *this;
+			}
+
+			bool operator == (const _IndexedIterator &i) const
+			{
+				return (_i == i._i) && (_j == i._j);
+			}
+
+			bool operator != (const _IndexedIterator &i) const
+			{
+				return (_i != i._i) || (_j != i._j);
+			}
+
+			_IndexedIterator &operator ++ ()
+			{
+				if(_j != _i->first.end ()) {
+					++_j ;
+					++_value_index;
+				}
+				while(_j == _i->first.end ()) {
+					++_r_index;
+					if (++_i == _A_end) return *this;
+					_j = _i->first.begin ();
+					_value_index = 0;
+				}
+				_c_index = *_j;
+
+				return *this;
+			}
+
+			_IndexedIterator operator ++ (int)
+			{
+				_IndexedIterator tmp = *this;
+				++(*this);
+				return tmp;
+			}
+
+			_IndexedIterator &operator -- ()
+			{
+				while (_j == _i->first.begin ()) {
+					_j = (--_i)->first.end ();
+					_value_index = _i->first.size();
+					--_r_index;
+				}
+
+				--_j;
+				--_value_index;
+				_c_index = *_j;
+				return *this;
+			}
+
+			_IndexedIterator operator -- (int)
+			{
+				_IndexedIterator tmp = *this;
+				--(*this);
+				return tmp;
+			}
+
+
+#if 0
+			// JGD 26.11.2012
+			// Since some compliers would not choose it even though they are
+			// called via a ConstIterator, const version is removed,
+			// call to const is now only explicit
+			// via call to "value()" below instead
+				const value_type &operator * () const
+					{
+						return *(_i->second.begin () + _c_index);
+					}
+#endif
+
+			value_type &operator * ()
+			{
+				return (_i->second)[_value_index];
+			}
+
+#if 0
+			value_type *operator -> ()
+			{
+				return &(*(_i->second.begin () + _c_index));
+			}
+			const value_type *operator -> () const
+			{
+				return &(*(_i->second.begin () + _c_index));
+			}
+#endif
+
+			size_t rowIndex () const
+			{
+				return _r_index;
+			}
+			size_t colIndex () const
+			{
+				return _c_index;
+			}
+			const value_type &value () const
+			{
+				return (const value_type&)(_i->second)[_value_index];
+			}
+
+		private:
+			RepIterator _i;
+			RowIdxIterator _j;
+			RepIterator _A_end;
+
+			mutable size_t _r_index;
+			mutable size_t _c_index;
+			mutable size_t _value_index;
+		};
+
+		typedef _IndexedIterator<typename Rep::iterator, typename Row::first_type::iterator> IndexedIterator;
+		typedef _IndexedIterator<typename Rep::const_iterator, typename Row::first_type::const_iterator> ConstIndexedIterator;
+
+		IndexedIterator IndexedBegin ()
+		{
+			return IndexedIterator (0, _matA.begin (), _matA.front ().first.begin (), _matA.end ());
+		}
+		IndexedIterator IndexedEnd ()
+		{
+			return IndexedIterator (_m, _matA.end (), _matA.back ().first.end (), _matA.end ());
+		}
+		ConstIndexedIterator IndexedBegin () const
+		{
+			return ConstIndexedIterator (0, _matA.begin (), _matA.front ().first.begin (), _matA.end ());
+		}
+		ConstIndexedIterator IndexedEnd () const
+		{
+			return ConstIndexedIterator (_m, _matA.end (), _matA.back ().first.end (), _matA.end ());
+		}
+
+		Row &getRow (size_t i) {
+			return _matA[i];
+		}
+		Row &operator [] (size_t i) {
+			return _matA[i];
+		}
+		ConstRow &operator [] (size_t i) const
+		{
+			return _matA[i];
+		}
+
+		template <class Vector> Vector &columnDensity (Vector &v) const;
+		SparseMatrixGeneric &transpose (SparseMatrixGeneric &AT) const;
+
+		const Field & field() const
+		{
+			return _field ;
+		}
+		/** Matrix-vector product
+		 * \f$y = A x\f$.
+		 * @return reference to output vector y
+		 * @param  x input vector
+		 * @param y
+		 */
+		template <class OutVector, class InVector>
+		OutVector &apply (OutVector &y, const InVector &x) const
+		{
+#ifdef __LINBOX_PARALLEL
+			return BlackboxParallel (y, *this, x, BBBase::Apply);
+#else
+			return _MD.vectorMul (y, *this, x);
+#endif
+		}
+
+		/** Transpose matrix-vector product
+		 * \f$ y = A^T x\f$.
+		 * @return reference to output vector y
+		 * @param  x input vector
+		 * @param y
+		 */
+		template <class OutVector, class InVector>
+		OutVector &applyTranspose (OutVector& y, const InVector &x) const
+		{
+#ifdef __LINBOX_PARALLEL
+			return BlackboxParallel (y, *this, x, BBBase::ApplyTranspose);
+#else
+			return _MD.vectorMul (y, _AT, x);
+#endif
+		}
+
+		const Rep & getRep() const
+		{
+			return _matA;
+		}
+
+		Rep & refRep()
+		{
+			return _matA;
+		}
+
+	void resize( const size_t & m, const size_t & n, const size_t & z = 0)
+		{
+			_m = m ;
+			_n = n ;
+			_matA.clear();
+			_matA.resize(m);
+
+		}
+
+	protected:
+
+		friend class SparseMatrixWriteHelper<Self_t>;
+		friend class SparseMatrixReadHelper<Self_t>;
+
+		const Field & _field;
+
+		MatrixDomain<Field>       _MD; // Matrix domain for matrix operations
+		TransposeMatrix<SparseMatrixGeneric<_Field, _Row> > _AT;
+		Rep               _matA;
+		size_t            _m;
+		size_t            _n;
+
+		// template<class F, class R, class T> friend class SparseMatrixGeneric;
+	};
+
+} // namespace LinBox
+} // namespace Protected
+
+#include "linbox/matrix/sparsematrix/sparse-parallel-vector.inl"
+
+namespace LinBox
+{
+
+	template <class _Field /*, class _Row */  >
+	class SparseMatrix<_Field, SparseMatrixFormat::SparsePar/* <_Row> */ > : public Protected::SparseMatrixGeneric<_Field,/*  _Row */ typename Vector<_Field>::SparsePar,VectorCategories::SparseParallelVectorTag>
+	{
+	public:
+		typedef VectorCategories::SparseParallelVectorTag  myTrait ;
+		typedef _Field                                       Field ; //!< Field
+		typedef typename _Field::Element                   Element ; //!< Element
+		typedef const Element                         constElement ; //!< const Element
+		typedef typename Vector<_Field>::SparsePar             Row ;
+		typedef SparseMatrixFormat::SparsePar              Storage ; //!< Matrix Storage Format
+		typedef SparseMatrix<_Field,Storage>               Self_t ; //!< Self type
+		typedef Protected::SparseMatrixGeneric<_Field,Row,myTrait >         Father_t ;
+
+	public:
+		template<class VectStream>
+		SparseMatrix (const Field &F, VectStream &stream) :
+			Father_t(F,stream)
+		{}
+
+		SparseMatrix(const Field & F, size_t m, size_t n) :
+			Father_t(F, m, n)
+		{}
+
+		SparseMatrix(const Field & F) :
+			Father_t(F)
+		{}
+
+		SparseMatrix ( MatrixStream<Field>& ms ) :
+			Father_t(ms)
+		{}
+
+		template<class _Tp1, class _Storage>
+		SparseMatrix(const SparseMatrix<_Tp1,_Storage> & Mat, const Field & F) :
+			Father_t(F, Mat.rowdim(), Mat.coldim())
+		{
+			typename SparseMatrix<_Tp1,_Storage>::template rebind<Field,Storage>()(*this, Mat);
+
+		}
+
+
+
+		// using Father_t::RowIterator;
+
+		template<typename _Tp1, typename _R1 = SparseMatrixFormat::SparsePar >
+		struct rebind {
+			typedef SparseMatrix<_Tp1, _R1> other;
+
+			void operator() (other & Ap, const Self_t& A) {
+
+				typename _Tp1::Element e;
+
+				Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+				for( typename Self_t::ConstIndexedIterator
+				     indices = A.IndexedBegin();
+				     indices != A.IndexedEnd() ;
+				     ++indices ) {
+					hom. image (e, indices.value() );
+					if (!Ap.field().isZero(e))
+						Ap.setEntry (indices.rowIndex(),
+							     indices.colIndex(), e);
+				}
+			}
+
+		};
+
+	} ; // SparseMatrix
+
+
+
+} // namespace LinBox
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_parallel_vector_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-parallel-vector.inl b/linbox/matrix/sparsematrix/sparse-parallel-vector.inl
new file mode 100644
index 0000000..28cc788
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-parallel-vector.inl
@@ -0,0 +1,359 @@
+/* linbox/matrix/sparse.inl
+ * Copyright (C) 2001-2002 Bradford Hovinen
+ *               1999-2001 William J Turner,
+ *
+ * Written by Bradford Hovinen <hovinen at cis.udel.edu>
+ * Based on sparse-base.h by William J Turner <wjturner at math.ncsu.edu>
+ *
+ * --------------------------------------------------------
+ * 2003-01-11  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
+ *
+ * Move from blackbox/sparse-base.inl to matrix/sparse.inl
+ * ------------------------------------
+ * 2002-11-28  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
+ *
+ *   - Renamed ColOfRowsIterator to RowIterator
+ *   - Named template argument _Row rather than Row; add a typedef to Row
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_matrix_sparse_parallel_INL
+#define __LINBOX_matrix_sparse_parallel_INL
+
+namespace LinBox {
+
+	template <class Field, class Row>
+	std::ostream &SparseMatrixWriteHelper<Protected::SparseMatrixGeneric<Field, Row,
+	VectorCategories::SparseParallelVectorTag > >::writeTriple (const Protected::SparseMatrixGeneric<Field, Row> &A
+								    , std::ostream &os
+								    , bool oneBased)
+	{
+		typename Matrix::Rep::const_iterator i;
+		typename Row::first_type::const_iterator j_idx;
+		typename Row::second_type::const_iterator j_elt;
+		const Field & F = A.field();
+
+		size_t i_idx;
+		for (i = A.getRep().begin (), i_idx = 0; i != A.getRep().end (); i++, i_idx++) {
+			for (j_idx = i->first.begin (), j_elt = i->second.begin ();
+			     j_idx != i->first.end ();
+			     ++j_idx, ++j_elt)
+			{
+				if (oneBased)
+					os << i_idx +1 << ' ' << *j_idx +1 << ' ';
+				else
+					os << i_idx << ' ' << *j_idx << ' ';
+				F.write (os, *j_elt);
+				os << std::endl;
+			}
+		}
+		return os ;
+
+
+	}
+
+	template <class Field, class Row>
+	std::ostream &SparseMatrixWriteHelper<Protected::SparseMatrixGeneric<Field, Row,
+	VectorCategories::SparseParallelVectorTag > >::writePretty (const Protected::SparseMatrixGeneric<Field, Row> &A
+								    , std::ostream &os
+								    , std::string begmat
+								    , std::string endmat
+								    , std::string begrow
+								    , std::string endrow
+								    , std::string sepelt
+								    , std::string seprow
+								   )
+	{
+		typename Matrix::Rep::const_iterator i;
+		typename Row::first_type::const_iterator j_idx;
+		typename Row::second_type::const_iterator j_elt;
+		const Field & F = A.field();
+
+		size_t i_idx, j_idx_1;
+		bool firstrow=true;
+
+		os << begmat;
+
+		for (i = A.getRep().begin (), i_idx = 0; i != A.getRep().end (); i++, i_idx++) {
+			if (firstrow) {
+				os << begrow;
+				firstrow =false;
+			}
+			else
+				os << seprow << begrow ;
+
+			j_idx = i->first.begin ();
+			j_elt = i->second.begin ();
+
+			for (j_idx_1 = 0; j_idx_1 < A.coldim(); j_idx_1++) {
+				if (j_idx == i->first.end () || j_idx_1 != *j_idx)
+					F.write (os, F.zero);
+				else {
+					F.write (os, *j_elt);
+					++j_idx;
+					++j_elt;
+				}
+
+				if (j_idx_1 < A.coldim() - 1)
+					os << sepelt << ' ';
+			}
+
+			os << endrow;
+		}
+
+		os << endmat;
+
+		return os ;
+	}
+
+
+	//! @bug this is reall the "generic" one
+	template <class Field, class Row>
+	std::ostream &SparseMatrixWriteHelper<Protected::SparseMatrixGeneric<Field, Row,
+	VectorCategories::SparseParallelVectorTag > >::write (const Protected::SparseMatrixGeneric<Field, Row> &A
+							      , std::ostream &os
+							      , LINBOX_enum(Tag::FileFormat) format)
+	{
+
+		// Avoid massive unneeded overhead in the case that this
+		// printing is disabled
+		if (not os)
+			return os;
+
+		switch (format) {
+		case Tag::FileFormat::Detect:
+			throw PreconditionFailed (__func__, __LINE__, "format != Tag::FileFormat::Detect");
+			//break//BB: unreachable;
+
+		case Tag::FileFormat::Turner:
+			return writeTriple(A,os,false);
+
+
+		case Tag::FileFormat::OneBased:
+			return writeTriple(A,os,true);
+
+		case Tag::FileFormat::Guillaume:
+			os << A.rowdim() << ' ' << A.coldim() << " M" << std::endl;
+
+			writeTriple(A,os,true);
+
+			os << "0 0 0" << std::endl;
+
+			return os;
+
+		case Tag::FileFormat::Matlab:
+			return writePretty(A,os,"[","]","","; ",",","");
+			// std::string begmat = "[";
+			// std::string endmat = "]";
+			// std::string begrow = "";
+			// std::string endrow = "; ";
+			// std::string sepelt  = ",";
+			// std::string seprow  = "";
+
+		case Tag::FileFormat::Maple:
+			return writePretty(A,os,"[","]","["," ]",",",", ");
+			// std::string begmat = "[";
+			// std::string endmat = "]";
+			// std::string begrow = "[";
+			// std::string endrow = " ]";
+			// std::string sepelt = ",";
+			// std::string seprow = ", "
+
+		case Tag::FileFormat::Pretty:
+			return writePretty(A,os,"",""," [ ","]\n"," ","");
+			// std::string begmat = "";
+			// std::string endmat = "";
+			// std::string begrow = " [ ";
+			// std::string endrow = "]\n";
+			// std::string sepelt  = " ";
+			// std::string seprow  = "";
+
+		case Tag::FileFormat::MatrixMarket:
+			writeMMCoordHeader(os, A, A.size(), "SparseMatrixGeneric");
+			return writeTriple(A,os,true);
+
+
+		case Tag::FileFormat::MagmaCpt:
+			os << "sparse matrix written in MagmaCpt form is not implemented" << std::endl;
+			break;
+		default:
+			os << "sparse matrix written in Tag::FileFormat::" << (int)format << " is not implemented" << std::endl;
+		}
+
+		return os;
+	}
+
+} // LinBox
+
+namespace LinBox { namespace Protected {
+
+	template <class Field, class Row>
+	SparseMatrixGeneric<Field,Row,VectorCategories::SparseParallelVectorTag> ::SparseMatrixGeneric( MatrixStream<Field>& ms ) :
+		_field(ms.field())
+		,_MD(ms.field()),_AT(*this)
+		,_matA(0), _m(0), _n(0)
+	{
+		Element val;
+		size_t i, j;
+		while( ms.nextTriple(i,j,val) ) {
+			if( i >= _m ) {
+				_m = i + 1;
+				_matA.resize( _m );
+			}
+			if( j >= _n ) _n = j + 1;
+			setEntry(i,j,val);
+		}
+		if( ms.getError() > END_OF_MATRIX )
+			throw ms.reportError(__func__,__LINE__);
+		if( !ms.getDimensions( i, _n ) )
+			throw ms.reportError(__func__,__LINE__);
+		if( i > _m ) {
+			_m = i;
+			_matA.resize(_m);
+		}
+	}
+
+
+	template <class Field, class Row>
+	void SparseMatrixGeneric<Field, Row, VectorCategories::SparseParallelVectorTag > ::setEntry (size_t i, size_t j, const typename Field::Element &value)
+	{
+		while (_matA.size() < i + 1) _matA.push_back(Row());
+		_m = _matA.size();
+
+		Row &v = _matA[i];
+		typename Row::first_type::iterator iter;
+
+		if (v.first.size () == 0) {
+			v.first.push_back (j);
+			v.second.push_back (value);
+		}
+		else {
+			iter = std::lower_bound (v.first.begin (), v.first.end (), j);
+
+			if (iter == v.first.end () || *iter != j) {
+				iter = v.first.insert (iter, j);
+				v.second.insert (v.second.begin () + (iter - v.first.begin ()), value);
+			}
+			else
+				*(v.second.begin () + (iter - v.first.begin ())) = value;
+		}
+	}
+
+	template <class Field, class Row>
+	typename Field::Element &SparseMatrixGeneric<Field, Row, VectorCategories::SparseParallelVectorTag > ::refEntry (size_t i, size_t j)
+	{
+
+		Row &v = _matA[i];
+		typename Row::first_type::iterator iter;
+		typename Row::second_type::iterator iter_elt;
+
+		if (v.first.size () == 0) {
+			v.first.push_back (j);
+			v.second.push_back (field().zero);
+			return v.second.front ();
+		}
+		else {
+			iter = std::lower_bound (v.first.begin (), v.first.end (), j);
+
+			if (iter == v.first.end () || *iter != j) {
+				iter = v.first.insert (iter, j);
+				iter_elt = v.second.insert (v.second.begin () + (iter - v.first.begin ()), field().zero);
+			}
+			else
+				iter_elt = v.second.begin () + (iter - v.first.begin ());
+
+			return *iter_elt;
+		}
+	}
+
+	template <class Field, class Row>
+	const typename Field::Element &SparseMatrixGeneric<Field, Row, VectorCategories::SparseParallelVectorTag > ::getEntry (size_t i, size_t j) const
+	{
+
+		const Row &v = _matA[i];
+		typename Row::first_type::const_iterator iter;
+
+		if (v.first.size () == 0)
+			return field().zero;
+		else {
+			iter = std::lower_bound (v.first.begin (), v.first.end (), j);
+
+			if (iter == v.first.end () || *iter != j)
+				return field().zero;
+			else
+				return *(v.second.begin () + (iter - v.first.begin ()));
+		}
+	}
+
+
+	template <class Field, class Row>
+	template <class Vector>
+	Vector &SparseMatrixGeneric<Field, Row, VectorCategories::SparseParallelVectorTag >::columnDensity (Vector &v) const
+	{
+		unsigned int row = 0;
+
+		for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
+			typename Row::first_type::const_iterator j_idx = i->first.begin ();
+
+			for (; j_idx != i->first.end (); ++j_idx)
+				++v[*j_idx];
+		}
+
+		return v;
+	}
+
+
+
+	template <class Field, class Row>
+	SparseMatrixGeneric<Field, Row, VectorCategories::SparseParallelVectorTag >
+	&SparseMatrixGeneric<Field, Row, VectorCategories::SparseParallelVectorTag >::transpose (SparseMatrixGeneric &AT) const
+	{
+		unsigned int row = 0;
+
+		for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
+			typename Row::first_type::const_iterator j_idx = i->first.begin ();
+			typename Row::second_type::const_iterator j_elt = i->second.begin ();
+
+			for (; j_idx != i->first.end (); ++j_idx, ++j_elt) {
+				AT._matA[*j_idx].first.push_back (row);
+				AT._matA[*j_idx].second.push_back (*j_elt);
+			}
+		}
+
+		return AT;
+	}
+
+
+} // namespace LinBox
+} // namespace Protected
+
+#endif // __LINBOX_matrix_sparse_parallel_INL
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-sequence-vector.h b/linbox/matrix/sparsematrix/sparse-sequence-vector.h
new file mode 100644
index 0000000..07b7a2a
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-sequence-vector.h
@@ -0,0 +1,713 @@
+/* linbox/matrix/sparse-matrix.h
+ * Copyright (C) 1998-2015 Jean-Guillaume Dumas,
+ *
+ * Written by Jean-Guillaume.Dumas at imag.fr
+ *
+ * --------------------------------------------------------
+ * 2003-01-11  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
+ *
+ * Move from blackbox/sparse-base.h to matrix/sparse-matrix.h
+ * ------------------------------------
+ * 2002-11-28  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
+ *
+ *   - Renamed ColOfRowsIterator to RowIterator
+ *   - Named template argument _Row rather than Row; add a typedef to Row
+ *   - Named template argument _Element rather than Row; add a typedef to Element
+ *   - Renamed IndexIterator as IndexedIterator, and adjusted to match
+ *     interface in DenseMatrixBase
+ * ------------------------------------
+ * 2002-08-06  Bradford Hovinen  <hovinen at cis.udel.edu>
+ *
+ * Renamed to sparse-base.h from sparse0-base.h
+ * ------------------------------------
+ * Modified by Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * Refactoring:
+ *   - Eliminated SparseMatrixAux and moved that functionality into Sparse0
+ *   - Made SparseMatrixGeneric parameterized only on the element type
+ *   - New read/write implementations for SparseMatrixGeneric, supporting multiple
+ *     formats
+ *   - Eliminated Gaussian elimination code
+ *   - Added iterators, including ColOfRowsIterator, Iterator, and
+ *     IndexIterator
+ *   - Eliminated operator []; added getEntry; changed put_value to setEntry
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/** @file linbox/matrix/sparsematrix/sparse-sequence-vector.h
+ * @brief
+ */
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_sequence_vector_H
+#define __LINBOX_matrix_sparsematrix_sparse_sequence_vector_H
+
+
+namespace LinBox { namespace Protected {
+
+
+	/* Specialization for sparse sequence vectors */
+	template <class _Field, class _Row>
+	class SparseMatrixGeneric<_Field, _Row, VectorCategories::SparseSequenceVectorTag > {
+	public:
+
+		typedef         _Field          Field;
+		typedef typename Field::Element Element;
+
+		typedef      _Row           Row;
+		typedef const Row           ConstRow;
+		typedef _SP_BB_VECTOR_<Row> Rep;
+		typedef VectorCategories::SparseSequenceVectorTag myTrait;
+		typedef SparseMatrixGeneric<_Field, _Row, myTrait> Self_t;
+
+#ifdef __LINBOX_PARALLEL
+		BB_list_list sub_list;
+#endif
+
+
+		template<typename _Tp1, typename _R1 = typename Rebind<_Row,_Tp1>::other >
+		struct rebind {
+			typedef SparseMatrixGeneric<_Tp1, _R1> other;
+
+			void operator() (other & Ap, const Self_t& A) {
+
+				typename _Tp1::Element e;
+
+				Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+				for( typename Self_t::ConstIndexedIterator
+				     indices = A.IndexedBegin();
+				     (indices != A.IndexedEnd()) ;
+				     ++indices ) {
+					// hom. image (e, A.getEntry(indices.rowIndex(),indices.colIndex()) );
+					hom. image (e, indices.value() );
+					if (!Ap.field().isZero(e))
+						Ap.setEntry (indices.rowIndex(),
+							     indices.colIndex(), e);
+				}
+			}
+
+		};
+
+		template<typename _Tp1, typename _Rw1>
+		SparseMatrixGeneric (const SparseMatrixGeneric<_Tp1, _Rw1, myTrait> &Mat, const Field& F) :
+			_field (F),
+			_MD (F), _AT (*this)
+			, _matA (Mat.rowdim()), _m (Mat.rowdim()), _n (Mat.coldim())
+		{
+			typename SparseMatrixGeneric<_Tp1,_Rw1, myTrait>::template rebind<Field,_Row>()(*this, Mat);
+		}
+
+		SparseMatrixGeneric (const Field & F, size_t m, size_t n) :
+			_field(F),
+			_MD(F),_AT(*this),
+			_matA (m), _m (m), _n (n)
+		{}
+
+		SparseMatrixGeneric (const Field & F) :
+			_field (F),
+			_MD(F),_AT(*this),
+			_matA(0), _m(0), _n(0)
+		{};
+
+
+		SparseMatrixGeneric (const SparseMatrixGeneric<Field, Row> &A) :
+			_field(A.field()),
+			_MD(A.field()),_AT(*this),
+			_matA (A._matA), _m (A._m), _n (A._n)
+		{}
+
+		template<class VectorType>
+		SparseMatrixGeneric (const SparseMatrixGeneric<Field, VectorType> &A) :
+			_field(A.field()),
+			_MD(A.field()),_AT(*this),
+			_matA(A.rowdim()), _m (A.rowdim()), _n (A.coldim())
+		{
+			typename Rep::iterator meit = this->_matA.begin();
+			typename SparseMatrixGeneric<Field, VectorType>::Rep::const_iterator copit = A.getRep().begin();
+			for( ; meit != this->_matA.end(); ++meit, ++copit)
+				LinBox::RawVector<Element>::convert(*meit, *copit);
+		}
+
+		/** Constructor from a MatrixStream
+		*/
+		SparseMatrixGeneric ( MatrixStream<Field>& ms );
+
+		template<class VectStream>
+		SparseMatrixGeneric (const Field &F, VectStream &stream) :
+			_field (F), _MD (F), _AT (*this)
+			, _matA (stream.size()), _m (stream.size()), _n (stream.dim())
+		{
+			typename Self_t::RowIterator i;
+
+			for (i = Self_t::rowBegin (); i != Self_t::rowEnd (); ++i)
+				stream >> *i;
+		}
+
+		~SparseMatrixGeneric () {}
+
+		size_t rowdim () const
+		{
+			return _m;
+		}
+
+		size_t coldim () const
+		{
+			return _n;
+		}
+
+		size_t size () const
+		{
+			size_t s(0);
+			for(typename Rep::const_iterator it = _matA.begin(); it != _matA.end(); ++it)
+				s+= LinBox::RawVector<Element>::size(*it);
+			return s;
+		}
+
+		std::istream &read (std::istream &is
+				    , LINBOX_enum(Tag::FileFormat) format  = Tag::FileFormat::Detect )
+		{
+			return SparseMatrixReadHelper<Self_t>::read (*this, is
+									      , format);
+		}
+
+		std::ostream &write (std::ostream &os
+				     , LINBOX_enum(Tag::FileFormat) format = Tag::FileFormat::MatrixMarket ) const
+		{
+			return SparseMatrixWriteHelper<Self_t>::write (*this, os, format);
+		}
+
+
+		void appendEntry(size_t i, size_t j, const Element & value) { setEntry(i,j,value) ;}
+		void finalize(){}
+
+		void           setEntry (size_t i, size_t j, const Element &value);
+
+
+		Element       &refEntry (size_t i, size_t j);
+
+		const Element &getEntry (size_t i, size_t j) const;
+
+		Element       &getEntry (Element &x, size_t i, size_t j) const
+		{
+			return x = getEntry (i, j);
+		}
+
+		typedef typename Rep::iterator RowIterator;
+		typedef typename Rep::const_iterator ConstRowIterator;
+
+		ConstRowIterator rowBegin () const
+		{
+			return _matA.begin ();
+		}
+
+		ConstRowIterator rowEnd () const
+		{
+			return _matA.end ();
+		}
+
+		RowIterator rowBegin ()
+		{
+			return _matA.begin ();
+		}
+
+		RowIterator rowEnd ()
+		{
+			return _matA.end ();
+		}
+
+		template <class RepIterator, class RowIterator, class _I_Element>
+		class _Iterator {
+		public:
+			typedef _I_Element value_type;
+
+			_Iterator (const RepIterator &i, const RowIterator &j, const RepIterator &A_end) :
+				_i (i), _j (j), _A_end (A_end)
+			{
+				if( _i == _A_end ) return;
+				while ( _j == _i->end () ) {
+					if (++_i == _A_end) return;
+					_j = _i->begin ();
+				}
+			}
+
+			_Iterator (const _Iterator &iter) :
+				_i (iter._i), _j (iter._j), _A_end (iter._A_end)
+			{}
+
+			_Iterator () {}
+
+			_Iterator &operator = (const _Iterator &iter)
+			{
+				_i = iter._i;
+				_j = iter._j;
+				_A_end = iter._A_end;
+
+				return *this;
+			}
+
+			bool operator == (const _Iterator &i) const
+			{
+				return (_i == i._i) && (_j == i._j);
+			}
+
+			bool operator != (const _Iterator &i) const
+			{
+				return (_i != i._i) || (_j != i._j);
+			}
+
+			_Iterator &operator ++ ()
+			{
+				++_j;
+				while( _j == _i->end ()) {
+					if (++_i == _A_end) return *this;
+					_j = _i->begin ();
+				}
+				return *this;
+			}
+
+			_Iterator operator ++ (int)
+			{
+				_Iterator tmp = *this;
+				++(*this);
+				return tmp;
+			}
+
+			_Iterator &operator -- ()
+			{
+				while (_j == _i->begin ())
+					_j = (--_i)->end ();
+				--_j;
+				return *this;
+			}
+
+			_Iterator operator -- (int)
+			{
+				_Iterator tmp = *this;
+				--(*this);
+				return tmp;
+			}
+
+			value_type &operator * ()
+			{
+				return _j->second;
+			}
+
+			// Dan Roche 2005-7-7 I believe this was a memory leak.
+			value_type *operator -> ()
+			{
+				return &(_j->second);
+			}
+
+			const value_type &operator*() const
+			{
+				return _j->second;
+			}
+
+			const value_type *operator-> () const
+			{
+				return &(_j->second);
+			}
+
+		private:
+			RepIterator _i;
+			RowIterator _j;
+			RepIterator _A_end;
+		};
+
+		typedef _Iterator<typename Rep::iterator, typename Row::iterator, Element> Iterator;
+		typedef _Iterator<typename Rep::const_iterator, typename Row::const_iterator, const Element> ConstIterator;
+
+		Iterator Begin ()
+		{
+			return Iterator (_matA.begin (), _matA.front ().begin (), _matA.end ());
+		}
+
+		Iterator End ()
+		{
+			return Iterator (_matA.end (), _matA.back ().end (), _matA.end ());
+		}
+		ConstIterator Begin () const
+		{
+			return ConstIterator (_matA.begin (), _matA.front ().begin (), _matA.end ());
+		}
+		ConstIterator End () const
+		{
+			return ConstIterator (_matA.end (), _matA.back ().end (), _matA.end ());
+		}
+
+
+
+		/* Generic trait for iterators without type */
+		template<typename U>
+		struct IteratorValueType {
+			typedef typename U::value_type value_type;
+		};
+
+		template<typename X>
+		struct IteratorValueType<const X*> {
+			typedef X value_type;
+		};
+
+		/* Generic trait for iterators without type */
+
+
+
+		template <class RepIterator, class RowIdxIterator>
+		class _IndexedIterator {
+		public:
+#if 0
+			typedef std::pair<size_t, size_t> value_type;
+			typedef typename RowIdxIterator/*::value_type*/::second_type value_type;
+			typedef typename RowIdxIterator::value_type::second_type value_type;
+#endif
+			typedef typename IteratorValueType< RowIdxIterator >::value_type::second_type value_type;
+
+			_IndexedIterator (size_t idx, const RepIterator &i, const RowIdxIterator &j, const RepIterator &A_end) :
+				_i (i), _j (j), _A_end (A_end), _r_index (idx)
+			{
+				if( _i == _A_end ) return;
+				while(_j == _i->end ()) {
+					++_r_index;
+					if (++_i == _A_end) return;
+					_j = _i->begin ();
+				}
+				_c_index =_j->first;
+			}
+
+			_IndexedIterator (const _IndexedIterator &iter) :
+				_i (iter._i), _j (iter._j), _A_end (iter._A_end), _r_index (iter._r_index), _c_index (iter._c_index)
+			{}
+
+			_IndexedIterator ()
+			{}
+
+			_IndexedIterator &operator = (const _IndexedIterator &iter)
+			{
+				_A_end = iter._A_end;
+				_i = iter._i;
+				_j = iter._j;
+				_r_index = iter._r_index;
+				_c_index = iter._c_index;
+
+				return *this;
+			}
+
+			bool operator == (const _IndexedIterator &i) const
+			{
+				return (_i == i._i) && (_j == i._j);
+			}
+
+			bool operator != (const _IndexedIterator &i) const
+			{
+				return (_i != i._i) || (_j != i._j);
+			}
+
+			_IndexedIterator &operator ++ ()
+			{
+				++_j;
+				while(_j == _i->end ()){
+					++_r_index;
+					if (++_i == _A_end) return *this;
+					_j = _i->begin ();
+				}
+				_c_index = _j->first;
+#if 0
+				if (++_j == _i->end ()) {
+					if (++_i != _A_end) {
+						_j = _i->begin ();
+						++_r_index;
+					}
+				}
+
+				_c_index = _j->first;
+#endif
+
+				return *this;
+			}
+
+			_IndexedIterator operator ++ (int)
+			{
+				_IndexedIterator tmp = *this;
+				++(*this);
+				return tmp;
+			}
+
+			_IndexedIterator &operator -- ()
+			{
+				while (_j == _i->begin ()) {
+					_j = (--_i)->end ();
+					--_r_index;
+				}
+
+				--_j;
+				_c_index = _j->first;
+				return *this;
+			}
+
+			_IndexedIterator operator -- (int)
+			{
+				_IndexedIterator tmp = *this;
+				--(*this);
+				return tmp;
+			}
+
+			value_type &operator * ()
+			{
+				return *const_cast<value_type*> (&(_j->second));
+				// Ugh.  This hack is because ConstIndexedIterator is not right. -bds
+
+			}
+			const value_type &operator * () const
+			{
+				return _j->second;
+			}
+			value_type *operator -> ()
+			{
+				return &(_j->second);
+			}
+			const value_type *operator -> () const
+			{
+				return &(_j->second);
+			}
+
+			size_t rowIndex () const
+			{
+				return _r_index;
+			}
+			size_t colIndex () const
+			{
+				return _c_index;
+			}
+			const value_type &value() const
+			{
+				return _j->second;
+			}
+
+		private:
+			RepIterator _i;
+			RowIdxIterator _j;
+			RepIterator _A_end;
+
+			mutable size_t _r_index;
+			mutable size_t _c_index;
+		};
+
+		typedef _IndexedIterator<typename Rep::iterator, typename Row::iterator> IndexedIterator;
+		typedef _IndexedIterator<typename Rep::const_iterator, typename Row::const_iterator> ConstIndexedIterator;
+
+		IndexedIterator IndexedBegin ()
+		{
+			return IndexedIterator (0, _matA.begin (), _matA.front ().begin (), _matA.end ());
+		}
+		IndexedIterator IndexedEnd ()
+		{
+			return IndexedIterator (_m, _matA.end (), _matA.back ().end (), _matA.end ());
+		}
+		ConstIndexedIterator IndexedBegin () const
+		{
+			return ConstIndexedIterator (0, _matA.begin (), _matA.front ().begin (), _matA.end ());
+		}
+		ConstIndexedIterator IndexedEnd () const
+		{
+			return ConstIndexedIterator (_m, _matA.end (), _matA.back ().end (), _matA.end ());
+		}
+
+		Row &getRow (size_t i) {
+			return _matA[i];
+		}
+		Row &operator [] (size_t i) {
+			return _matA[i];
+		}
+		ConstRow &operator [] (size_t i) const
+		{
+			return _matA[i];
+		}
+
+		template <class Vector> Vector &columnDensity (Vector &v) const;
+		SparseMatrixGeneric &transpose (SparseMatrixGeneric &AT) const;
+
+		const Field & field() const
+		{
+			return _field ;
+		}
+		/** Matrix-vector product
+		 * \f$y = A x\f$.
+		 * @return reference to output vector y
+		 * @param  x input vector
+		 * @param y
+		 */
+		template <class OutVector, class InVector>
+		OutVector &apply (OutVector &y, const InVector &x) const
+		{
+#ifdef __LINBOX_PARALLEL
+			return BlackboxParallel (y, *this, x, BBBase::Apply);
+#else
+			return _MD.vectorMul (y, *this, x);
+#endif
+		}
+
+		/** Transpose matrix-vector product
+		 * \f$ y = A^T x\f$.
+		 * @return reference to output vector y
+		 * @param  x input vector
+		 * @param y
+		 */
+		template <class OutVector, class InVector>
+		OutVector &applyTranspose (OutVector& y, const InVector &x) const
+		{
+#ifdef __LINBOX_PARALLEL
+			return BlackboxParallel (y, *this, x, BBBase::ApplyTranspose);
+#else
+			return _MD.vectorMul (y, _AT, x);
+#endif
+		}
+
+		const Rep & getRep() const
+		{
+			return _matA;
+		}
+
+		Rep & refRep()
+		{
+			return _matA;
+		}
+
+		void resize( const size_t & m, const size_t & n, const size_t & z = 0)
+		{
+			_m = m ;
+			_n = n ;
+			_matA.clear();
+			_matA.resize(m);
+
+		}
+
+	protected:
+
+		friend class SparseMatrixWriteHelper<Self_t>;
+		friend class SparseMatrixReadHelper<Self_t>;
+
+		const Field & _field;
+
+		MatrixDomain<Field>       _MD; // Matrix domain for matrix operations
+		TransposeMatrix<SparseMatrixGeneric<_Field, _Row> > _AT;
+		Rep               _matA;
+		size_t            _m;
+		size_t            _n;
+
+		// template<class F, class R, class T> friend class SparseMatrixGeneric;
+	};
+
+} // namespace LinBox
+} // namespace Protected
+
+
+
+#include "linbox/matrix/sparsematrix/sparse-sequence-vector.inl"
+
+namespace LinBox
+{
+
+	template <class _Field /*, class _Row */  >
+	class SparseMatrix<_Field, SparseMatrixFormat::SparseSeq/* <_Row> */ > : public Protected::SparseMatrixGeneric<_Field,/*  _Row */ typename Vector<_Field>::SparseSeq ,VectorCategories::SparseSequenceVectorTag>
+	{
+	public:
+		typedef VectorCategories::SparseSequenceVectorTag  myTrait ;
+		typedef _Field                                       Field ; //!< Field
+		typedef typename _Field::Element                   Element ; //!< Element
+		typedef const Element                         constElement ; //!< const Element
+		typedef typename Vector<_Field>::SparseSeq             Row ;
+		typedef SparseMatrixFormat::SparseSeq              Storage ; //!< Matrix Storage Format
+		typedef SparseMatrix<_Field,Storage>               Self_t ; //!< Self type
+		typedef Protected::SparseMatrixGeneric<_Field,Row,myTrait >         Father_t ;
+
+	public:
+		template<class VectStream>
+		SparseMatrix (const Field &F, VectStream &stream) :
+			Father_t(F,stream)
+		{}
+
+		SparseMatrix(const Field & F, size_t m, size_t n) :
+			Father_t(F, m, n)
+		{}
+
+		SparseMatrix(const Field & F) :
+			Father_t(F)
+		{}
+
+		SparseMatrix ( MatrixStream<Field>& ms ) :
+			Father_t(ms)
+		{}
+
+		template<typename _Tp1, typename _Rw1>
+		SparseMatrix (const SparseMatrix<_Tp1, _Rw1> &Mat, const Field& F) :
+			Father_t(F,Mat.rowdim(),Mat.coldim())
+		{
+			typename SparseMatrix<_Tp1,_Rw1>::template rebind<Field,Storage>()(*this, Mat);
+		}
+
+		template<typename _Tp1, typename _Rw1>
+		SparseMatrix (const SparseMatrix<_Tp1, _Rw1> &Mat) :
+			Father_t(Mat.field(),Mat.rowdim(),Mat.coldim())
+		{
+			typename SparseMatrix<_Tp1,_Rw1>::template rebind<Field,Storage>()(*this, Mat);
+		}
+
+
+		template<typename _Tp1, typename _R1 = SparseMatrixFormat::SparseSeq >
+		struct rebind {
+			typedef SparseMatrix<_Tp1, _R1> other;
+
+			void operator() (other & Ap, const Self_t& A) {
+
+				typename _Tp1::Element e;
+
+				Hom<typename Self_t::Field, _Tp1> hom(A.field(), Ap.field());
+				for( typename Self_t::ConstIndexedIterator
+				     indices = A.IndexedBegin();
+				     (indices != A.IndexedEnd()) ;
+				     ++indices ) {
+					// hom. image (e, A.getEntry(indices.rowIndex(),indices.colIndex()) );
+					hom. image (e, indices.value() );
+					if (!Ap.field().isZero(e))
+						Ap.setEntry (indices.rowIndex(),
+							     indices.colIndex(), e);
+				}
+			}
+
+		};
+
+		// using Father_t::rebind;
+	} ; // SparseMatrix
+
+
+} // namespace LinBox
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_sequence_vector_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-sequence-vector.inl b/linbox/matrix/sparsematrix/sparse-sequence-vector.inl
new file mode 100644
index 0000000..5fc69fa
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-sequence-vector.inl
@@ -0,0 +1,179 @@
+/* linbox/matrix/sparse.inl
+ * Copyright (C) 2001-2002 Bradford Hovinen
+ *               1999-2001 William J Turner,
+ *
+ * Written by Bradford Hovinen <hovinen at cis.udel.edu>
+ * Based on sparse-base.h by William J Turner <wjturner at math.ncsu.edu>
+ *
+ * --------------------------------------------------------
+ * 2003-01-11  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
+ *
+ * Move from blackbox/sparse-base.inl to matrix/sparse.inl
+ * ------------------------------------
+ * 2002-11-28  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
+ *
+ *   - Renamed ColOfRowsIterator to RowIterator
+ *   - Named template argument _Row rather than Row; add a typedef to Row
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_matrix_sparse_sequence_INL
+#define __LINBOX_matrix_sparse_sequence_INL
+
+namespace LinBox { namespace Protected {
+
+	template <class Field, class Row>
+	SparseMatrixGeneric<Field,Row,VectorCategories::SparseSequenceVectorTag> ::SparseMatrixGeneric( MatrixStream<Field>& ms ) :
+		_field(ms.field())
+		,_MD(ms.field()),_AT(*this)
+		,_matA(0), _m(0), _n(0)
+
+	{
+		Element val;
+		size_t i, j;
+		while( ms.nextTriple(i,j,val) ) {
+			if( i >= _m ) {
+				_m = i + 1;
+				_matA.resize( _m );
+			}
+			if( j >= _n ) _n = j + 1;
+			setEntry(i,j,val);
+		}
+		if( ms.getError() > END_OF_MATRIX )
+			throw ms.reportError(__func__,__LINE__);
+		if( !ms.getDimensions( i, _n ) )
+			throw ms.reportError(__func__,__LINE__);
+		if( i > _m ) {
+			_m = i;
+			_matA.resize(_m);
+		}
+	}
+
+	template <class Field, class Row>
+	void SparseMatrixGeneric<Field, Row, VectorCategories::SparseSequenceVectorTag > ::setEntry (size_t i, size_t j, const typename Field::Element &value)
+	{
+		typedef typename Row::value_type value_type;
+		Row &v = _matA[i];
+		typename Row::iterator iter;
+
+		if (v.size () == 0) {
+			v.push_back ( value_type((unsigned)j, value));
+		}
+		else {
+			iter = std::lower_bound (v.begin (), v.end (), j, VectorWrapper::CompareSparseEntries<Element> ());
+
+			if (iter == v.end () || iter->first != j)
+				iter = v.insert (iter, value_type((unsigned)j, value));
+			else
+				iter->second = value;
+		}
+	}
+
+	template <class Field, class Row>
+	typename Field::Element &SparseMatrixGeneric<Field, Row, VectorCategories::SparseSequenceVectorTag > ::refEntry (size_t i, size_t j)
+	{
+
+		Row &v = _matA[i];
+		typename Row::iterator iter;
+
+		if (v.size () == 0) {
+			v.push_back (std::pair <size_t, Element> (j, field().zero));
+			return v.front ().second;
+		}
+		else {
+			iter = std::lower_bound (v.begin (), v.end (), j, VectorWrapper::CompareSparseEntries<Element> ());
+
+			if (iter == v.end () || iter->first != j)
+				iter = v.insert (iter, std::pair <size_t, Element> (j, field().zero));
+
+			return iter->second;
+		}
+	}
+
+	template <class Field, class Row>
+	const typename Field::Element &SparseMatrixGeneric<Field, Row, VectorCategories::SparseSequenceVectorTag > ::getEntry (size_t i, size_t j) const
+	{
+
+		const Row &v = _matA[i];
+		typename Row::const_iterator iter;
+
+		if (v.size () == 0)
+			return field().zero;
+		else {
+			iter = std::lower_bound (v.begin (), v.end (), j, VectorWrapper::CompareSparseEntries<Element> ());
+
+			if (iter == v.end () || iter->first != j)
+				return field().zero;
+			else
+				return iter->second;
+		}
+	}
+
+
+	template <class Field, class Row>
+	template <class Vector>
+	Vector &SparseMatrixGeneric<Field, Row, VectorCategories::SparseSequenceVectorTag >::columnDensity (Vector &v) const
+	{
+		unsigned int row = 0;
+
+		for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
+			typename Row::const_iterator j = i.begin ();
+
+			for (; j != i->begin (); ++j)
+				++v[j->first];
+		}
+
+		return v;
+	}
+
+
+	template <class Field, class Row>
+	SparseMatrixGeneric<Field, Row, VectorCategories::SparseSequenceVectorTag >
+	&SparseMatrixGeneric<Field, Row, VectorCategories::SparseSequenceVectorTag >::transpose (SparseMatrixGeneric &AT) const
+	{
+		unsigned int row = 0;
+
+		for (ConstRowIterator i = rowBegin (); i != rowEnd (); ++i, ++row) {
+			typename Row::const_iterator j = i.begin ();
+
+			for (; j != i->begin (); ++j)
+				AT._matA[j->first].push_back (std::pair<size_t, Element> (row, j->second));
+		}
+
+		return AT;
+	}
+
+
+} // namespace LinBox
+} // namespace Protected
+
+#endif // __LINBOX_matrix_sparse_sequence_INL
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-tpl-matrix-omp.h b/linbox/matrix/sparsematrix/sparse-tpl-matrix-omp.h
new file mode 100644
index 0000000..346aaac
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-tpl-matrix-omp.h
@@ -0,0 +1,415 @@
+/* linbox/matrix/sparsematrix/sparse-tpl-matrix-omp.h
+ * Copyright (c) Linbox
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+
+ * Written by Alex Stachnik <stachnik at udel.edu>
+ */
+
+/*! @file matrix/sparsematrix/sparse-tpl-matrix-omp.h
+ * @ingroup sparsematrix
+ * @ingroup omp
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_tpl_matrix_omp_H
+#define __LINBOX_matrix_sparsematrix_sparse_tpl_matrix_omp_H
+
+
+#include <algorithm>
+#include <iostream>
+#include <map>
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "linbox/util/field-axpy.h"
+#include "linbox/blackbox/blackbox-interface.h"
+#include "linbox/field/hom.h"
+#include "linbox/matrix/sparsematrix/triples-coord.h"
+
+#include <vector>
+
+
+namespace LinBox
+{
+
+union TriplesSmallCoord {
+	uint8_t c[8];
+	uint16_t s[4];
+	uint32_t i[2];
+	uint64_t l;
+};
+
+template <class Element>
+struct TriplesBBTriple {
+	TriplesBBTriple(TriplesCoord c):coord_(c) {}
+	TriplesBBTriple(Index r, Index c, const Element& e){init(r, c, e);}
+	void init(Index r, Index c, const Element& e)
+	{
+		row()=r;
+		col()=c;
+		elt_ = e;
+	}
+	inline Index& row() {return coord_.rowCol[0];}
+	inline Index& col() {return coord_.rowCol[1];}
+	inline Element& elt() {return elt_;}
+	inline const Index& getRow() const {return coord_.rowCol[0];}
+	inline const Index& getCol() const {return coord_.rowCol[1];}
+	inline const Element& getElt() const {return elt_;}
+	void toBlock() {coordToBlock(coord_);}
+	void fromBlock() {coordFromBlock(coord_);}
+	static bool compareBlockTriples(const TriplesBBTriple<Element>& lhs,
+					const TriplesBBTriple<Element>& rhs) {
+		return lhs.coord_<rhs.coord_;
+	}
+	TriplesCoord coord_;
+	Element elt_;
+};
+
+struct TriplesBlock {
+	Index start_,end_;
+	TriplesCoord blockStart_, blockEnd_;
+
+	TriplesBlock(Index start,Index end,TriplesCoord blockStart,TriplesCoord blockEnd) :
+		start_(start),end_(end),
+		blockStart_(blockStart),blockEnd_(blockEnd) {
+	}
+	Index nnz() const {return end_-start_;}
+	TriplesCoord blockSize() const {return blockEnd_-blockStart_;}
+	void toBlock() {
+		coordToBlock(blockStart_);
+		coordToBlock(blockEnd_);
+	}
+	void fromBlock() {
+		coordFromBlock(blockStart_);
+		coordFromBlock(blockEnd_);
+
+	}
+	inline const Index& getStartRow() const {
+		return blockStart_.rowCol[0];
+	}
+	inline const Index& getStartCol() const {
+		return blockStart_.rowCol[1];
+	}
+	inline const Index& getEndRow() const {
+		return blockEnd_.rowCol[0];
+	}
+	inline const Index& getEndCol() const {
+		return blockEnd_.rowCol[1];
+	}
+	static bool compareBlockSizes(const TriplesBlock& lhs,
+				      const TriplesBlock& rhs) {
+		return lhs.blockSize()<rhs.blockSize();
+	}
+};
+
+
+template <class Element>
+struct TriplesDataBlock {
+	TriplesCoord blockStart_, blockEnd_, blockSize_;
+	std::vector<TriplesSmallCoord> rowIxs_,colIxs_;
+	std::vector<Element> elts_;
+	int ccf_;
+
+	typedef TriplesBBTriple<Element> Triple;
+	typedef typename std::vector<Triple> TripleList;
+	typedef typename TripleList::const_iterator TripleListIt;
+
+        inline Index getRow(int ix) const {
+                Index retVal=getStartRow();
+                const TriplesSmallCoord *rowIxPtr=&(rowIxs_[ix>>ccf_]);
+                switch (ccf_) {
+                case 0:
+                        return rowIxPtr->l;
+                case 1:
+                        return (retVal|(rowIxPtr->i[ix&1]));
+                case 2:
+                        return (retVal|(rowIxPtr->s[ix&3]));
+                case 3:
+                default:
+                        return (retVal|(rowIxPtr->c[ix&7]));
+                }
+        }
+        inline Index getCol(int ix) const {
+                Index retVal=getStartCol();
+                const TriplesSmallCoord *colIxPtr=&(colIxs_[ix>>ccf_]);
+                switch (ccf_) {
+                case 0:
+                        return colIxPtr->l;
+                case 1:
+                        return (retVal|(colIxPtr->i[ix&1]));
+                case 2:
+                        return (retVal|(colIxPtr->s[ix&3]));
+                case 3:
+                default:
+                        return (retVal|(colIxPtr->c[ix&7]));
+                }
+        }
+
+	void init(TriplesCoord blockStart,
+		  TriplesCoord blockEnd,
+		  TriplesCoord myBlockSize, // blockSize shadows blockSize()
+		  TripleListIt triplesStart,
+		  TripleListIt triplesEnd,
+		  int ccf) {
+		blockStart_=blockStart;
+		blockEnd_=blockEnd;
+		blockSize_=myBlockSize;
+		ccf_=ccf;
+                int numElts=(int)(triplesEnd-triplesStart);
+		rowIxs_.resize(1+(numElts>>ccf));
+		colIxs_.resize(1+(numElts>>ccf));
+		elts_.reserve(numElts);
+
+		int coordOffset=0, coordIx=0;
+		while (triplesStart != triplesEnd) {
+			elts_.push_back(triplesStart->getElt());
+
+			switch (ccf) {
+			case 0:
+				rowIxs_[coordIx].l=(uint64_t)(triplesStart->getRow());
+				colIxs_[coordIx].l=(uint64_t)(triplesStart->getCol());
+				break;
+			case 1:
+				rowIxs_[coordIx].i[coordOffset]=
+					(uint32_t)(triplesStart->getRow());
+				colIxs_[coordIx].i[coordOffset]=
+					(uint32_t)(triplesStart->getCol());
+				break;
+			case 2:
+				rowIxs_[coordIx].s[coordOffset]=
+					(uint16_t)(triplesStart->getRow());
+				colIxs_[coordIx].s[coordOffset]=
+					(uint16_t)(triplesStart->getCol());
+				break;
+			case 3:
+				rowIxs_[coordIx].c[coordOffset]=
+					(uint8_t)(triplesStart->getRow());
+				colIxs_[coordIx].c[coordOffset]=
+					(uint8_t)(triplesStart->getCol());
+				break;
+			}
+
+			++coordOffset;
+			if (coordOffset==(1<<ccf)) {
+				coordOffset=0;
+				++coordIx;
+			}
+			++triplesStart;
+		}
+	}
+
+	inline TriplesCoord blockSize() const {
+		return blockSize_;
+	}
+	inline Index getStartRow() const {
+		return blockStart_.rowCol[0];
+	}
+	inline Index getStartCol() const {
+		return blockStart_.rowCol[1];
+	}
+	inline Index getEndRow() const {
+		return blockEnd_.rowCol[0];
+	}
+	inline Index getEndCol() const {
+		return blockEnd_.rowCol[1];
+	}
+};
+
+
+/**
+ *
+ \ingroup blackbox
+ * Sparse matrix representation which stores nonzero entries by i,j,value triples.
+ */
+template<class Field_>
+class SparseMatrix<Field_, SparseMatrixFormat::TPL_omp> : public BlackboxInterface {
+
+	public:
+        typedef Field_ Field;
+	typedef typename MatrixDomain<Field>::Matrix Matrix;
+	typedef typename Field::Element Element;
+	typedef SparseMatrix<Field, SparseMatrixFormat::TPL_omp> Self_t;
+
+	// Default constructor.
+	SparseMatrix();
+
+	SparseMatrix(const SparseMatrix & B);
+
+	SparseMatrix(const Field& F, std::istream& in);
+
+	std::istream& read(std::istream& in);
+
+	std::ostream& write(std::ostream& out);
+
+	~SparseMatrix();
+
+	SparseMatrix(const Field& F, Index r = 0, Index c = 0);
+
+        void finalize();
+
+	// (re)shape the matrix.  Any prior entries are abandoned.
+	SparseMatrix& shape(const Field& F, Index r = 0, Index c = 0);
+
+	// need cstor from matrix stream, read, write
+
+	// Element e is added in the i,j position.
+	void setEntry(Index i, Index j, const Element & e);
+
+	// Element e is set to the i,j entry.
+	Element& getEntry(Element& e, Index i, Index j) const;
+
+	/** y <- A x.
+	 */
+	template<class OutVector, class InVector>
+	OutVector & apply(OutVector &, const InVector &) const;
+
+        // Mul with this on left: Y <- AX. Requires conformal shapes.
+	// Requires Y != X
+	template<class Mat1, class Mat2>
+	Mat1 & applyLeft(Mat1 &Y, const Mat2 &X) const;
+
+        // Mul with this on right: Y <- XA. Requires conformal shapes.
+	// Requires Y != X
+	template<class Mat1, class Mat2>
+	Mat1 & applyRight(Mat1 &Y, const Mat2 &X) const;
+
+	/** y <- A^T x.
+	 */
+	template<class OutVector, class InVector>
+	OutVector & applyTranspose(OutVector &, const InVector &) const;
+
+	Index rowdim() const;
+
+	Index coldim() const;
+
+	const Field & field() const;
+
+	/* Returns number of non-zero entries */
+	size_t size() const;
+
+	template<typename Tp1_>
+	struct rebind {
+		typedef SparseMatrix<Tp1_> other;
+		// BB : is this working at all ?
+		void operator() (other & Ap, const Self_t& A)
+		{
+			Hom <typename Self_t::Field, Tp1_> hom( A.field(), Ap.field());
+
+			typedef typename Tp1_::Element otherElt;
+			typedef typename std::vector<otherElt> othervec;
+			typedef typename std::vector<Element> selfvec;
+			typedef typename othervec::iterator otheriter;
+			typedef typename selfvec::const_iterator selfiter;
+			otheriter vp_p; selfiter v_p;
+
+			Ap.data_.resize(A.data.size());
+			for (v_p = A.data_.begin(), vp_p = Ap.data_.begin();
+			     v_p != A.data.end(); ++ v_p, ++ vp_p)
+				hom.image (vp_p->elt, v_p->elt);
+		}
+	};
+
+        //For debugging:
+        typename std::vector<std::vector<std::vector<TriplesDataBlock<Element> > > >& getRowBlocks() {
+                return rowBlocks_;
+        }
+
+protected:
+
+	const static Index MAX_BLOCK_NNZ=1024;
+        const static size_t CACHE_ALIGNMENT=64;
+
+        inline static int roundUpIndex(Index val) {
+                int exponent=0;
+                --val;
+                while (val > 0) {
+                        ++exponent;
+                        val=val>>1;
+                }
+                return 1<<exponent;
+        }
+
+	typedef TriplesBBTriple<Element> Triple;
+	typedef TriplesDataBlock<Element> DataBlock;
+
+        typedef std::vector<TriplesBlock> RefBlockList;
+
+        typedef std::vector<DataBlock> BlockList;
+        typedef typename BlockList::iterator BlockListIt;
+        typedef std::vector<BlockList> VectorChunks;
+        typedef typename VectorChunks::iterator VectorChunkIt;
+        typedef std::vector<VectorChunks> SizedChunks;
+
+	typedef std::map<Index,Index> IntervalSet;
+	typedef typename IntervalSet::iterator IntervalIterator;
+	typedef std::pair<Index,Index> Interval;
+
+	void splitBlock(RefBlockList &superBlocks, TriplesBlock block);
+
+	void toDataBlock(const RefBlockList& superBlocks,
+			 BlockList& dataBlocks);
+
+	void computeVectors(SizedChunks &sizedChunks,
+			    BlockList &superBlocks,
+			    const int rowOrCol);
+
+        void combineIntervals(BlockListIt startIt,
+                              BlockListIt endIt,
+                              IntervalSet& intervals,
+                              VectorChunks& chunksOut,
+                              const int rowOrCol);
+
+        void nonOverlappingIntervals(BlockListIt startIt,
+                                     BlockListIt endIt,
+                                     IntervalSet& intervals,
+                                     const int rowOrCol);
+
+	MatrixDomain<Field> MD_;
+
+	std::vector<Triple> data_;
+
+	Index rows_, cols_;
+
+#define TRIPLES_UNSORTED 1
+#define TRIPLES_SORTED 2
+
+	//Either TRIPLES_SORTED or TRIPLES_UNSORTED
+	int sortType_;
+
+#define CHUNK_BY_ROW 1
+#define CHUNK_BY_COL 2
+
+        SizedChunks rowBlocks_;
+
+        SizedChunks colBlocks_;
+  }; // SparseMatrix
+
+} // namespace LinBox
+
+#include "sparse-tpl-matrix-omp.inl"
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_tpl_matrix_omp_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-tpl-matrix-omp.inl b/linbox/matrix/sparsematrix/sparse-tpl-matrix-omp.inl
new file mode 100644
index 0000000..4de533e
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-tpl-matrix-omp.inl
@@ -0,0 +1,614 @@
+/* linbox/matrix/sparsematrix/sparse-tpl-matrix-omp.h
+ * Copyright (c) Linbox
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+
+ * Written by Alex Stachnik <stachnik at udel.edu>
+ */
+
+/** @file matrix/sparsematrix/sparse-tpl-matrix-omp.inl
+ * @ingroup sparsematrix
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_triplesbb_omp_INL
+#define __LINBOX_triplesbb_omp_INL
+
+#include <algorithm>
+#include <iostream>
+#include <omp.h>
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "linbox/util/field-axpy.h"
+#include "linbox/blackbox/blackbox-interface.h"
+#include "linbox/field/hom.h"
+#include "linbox/util/matrix-stream.h"
+#include "linbox/matrix/abnormal-matrix.h"
+
+#include <vector>
+
+namespace LinBox
+{
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::nonOverlappingIntervals(BlockListIt startIt,
+                                              BlockListIt endIt,
+                                              IntervalSet& intervals,
+                                              const int rowOrCol)
+{
+        for (;startIt!=endIt;++startIt) {
+                Index start,end;
+                if (rowOrCol==CHUNK_BY_ROW) {
+                        start=(*startIt).getStartRow();
+                        end=(*startIt).getEndRow();
+                } else {
+                        start=(*startIt).getStartCol();
+                        end=(*startIt).getEndCol();
+                }
+
+		//invariant: no existing interval is dominated by any other
+
+		//if the new interval is not dominated by any other, insert it
+		IntervalIterator it=intervals.lower_bound(start);
+		bool insert=false;
+		if (it == intervals.end()) {
+			insert=true;
+		} else if (it->first == start) {
+			if (it->second < end) {
+				insert=true;
+			}
+		} else {
+			if (it != intervals.begin()) {
+				--it;
+			}
+			if (it->first > start) {
+				insert=true;
+			} else if (it->second < start) {
+				insert=true;
+			}
+		}
+		if (insert) {
+			intervals[start]=end;
+			it=intervals.upper_bound(start);
+
+			//remove all intervals dominated by the new one
+			while ((it!=intervals.end()) && (it->first <= end)) {
+				++it;
+			}
+			intervals.erase(intervals.upper_bound(start),it);
+		}
+	}
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::combineIntervals(BlockListIt startIt,
+                                            BlockListIt endIt,
+                                            IntervalSet& intervals,
+                                            VectorChunks& chunksOut,
+                                            const int rowOrCol)
+{
+	typedef std::map<Index,BlockList> VectorBlockMap;
+
+	VectorBlockMap vectorMap;
+	for (IntervalIterator it=intervals.begin();it!=intervals.end();++it) {
+		vectorMap[it->first];
+	}
+
+        for (;startIt!=endIt;++startIt) {
+                Index start;
+                if (rowOrCol==CHUNK_BY_ROW) {
+                        start=startIt->getStartRow();
+                } else {
+                        start=startIt->getStartCol();
+                }
+
+		IntervalIterator it=intervals.lower_bound(start);
+		if (it != intervals.begin()) {
+			--it;
+		}
+		vectorMap[it->first].push_back(*startIt);
+	}
+
+        chunksOut.clear();
+        for (typename VectorBlockMap::iterator it=vectorMap.begin();
+             it!=vectorMap.end();
+             ++it) {
+                chunksOut.push_back(it->second);
+        }
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::computeVectors(SizedChunks& sizedChunks,
+					  BlockList& superBlocks,
+					  const int rowOrCol)
+{
+	IntervalSet intervals;
+        VectorChunks chunks;
+
+        Index k=0;
+        Index numSuperBlocks=superBlocks.size();
+        while (k<numSuperBlocks) {
+                TriplesCoord blockSize=superBlocks[k].blockSize();
+                BlockListIt start=superBlocks.begin()+k;
+                while (superBlocks[k].blockSize()==blockSize) {
+                        ++k;
+                        if (k>=numSuperBlocks) {
+                                break;
+                        }
+                }
+                BlockListIt end=superBlocks.begin()+k;
+
+                intervals.clear();
+                nonOverlappingIntervals(start,end,intervals,rowOrCol);
+                chunks.clear();
+                combineIntervals(start,end,intervals,chunks,rowOrCol);
+		sizedChunks.push_back(chunks);
+        }
+}
+
+template<class Field_> SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::SparseMatrix() {}
+template<class Field_> SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::~SparseMatrix() {}
+
+template<class Field_> SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::
+SparseMatrix(const Field_& F, std::istream& in) : MD_(F)
+{
+	read(in);
+}
+
+template<class Field_>
+std::istream& SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::read(std::istream& in){
+	Index r, c;
+	typename Field::Element v; field().init(v);
+	MatrixStream<Field> ms(field(), in);
+	ms.getDimensions((size_t&)r, (size_t&)c);
+	shape(field(), r, c);
+	while (ms.nextTriple((size_t&)r, (size_t&)c, v)) setEntry((size_t)r, (size_t)c, v);
+	return in;
+}
+
+template<class Field_>
+std::ostream& SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::write(std::ostream& out){
+	out << "%%MatrixMarket matrix coordinate integer general" << std::endl;
+	out << "% written from a LinBox TriplesBBOMP" << std::endl;
+	out << rowdim() <<" " << coldim() << " " << size() << std::endl;
+	for (Index k = 0; k < size(); ++k) {
+		Triple t = data_[k];
+		field().write(out << t.getRow()+1 << " " << t.getCol()+1 << " ", t.getElt()) << std::endl;
+	}
+	return out;
+}
+
+template<class Field_>
+SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>& SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::shape(const Field& F, Index r, Index c)
+{ MD_=F; data_.clear(); rows_ = r; cols_ = c; sortType_ = TRIPLES_UNSORTED; return *this; }
+
+template<class Field_> SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::
+SparseMatrix(const Field& F, Index r, Index c)
+        : MD_(F), rows_(r), cols_(c),
+          sortType_(TRIPLES_UNSORTED) {}
+
+template<class Field_>
+SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::SparseMatrix(const SparseMatrix<Field_,SparseMatrixFormat::TPL_omp> & B)
+        : MD_(B.MD_), data_ ( B.data_ ),
+          rows_ ( B.rows_ ), cols_ ( B.cols_ ),
+          sortType_ ( B.sortType_ ),
+          rowBlocks_(B.rowBlocks_),colBlocks_(B.colBlocks_)
+{}
+
+// template<class Field_>
+// SparseMatrix<Field_,SparseMatrixFormat::TPL_omp> & SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::operator=(const SparseMatrix<Field_,SparseMatrixFormat::TPL_omp> & rhs)
+// {
+// 	if (rhs == this)
+// 		return *this;
+//         MD_.init(rhs.field);
+// 	data_ = rhs.data_;
+// 	rows_ = rhs.rows_;
+// 	cols_ = rhs.cols_;
+// 	sortType_ = rhs.sortType_;
+//         rowBlocks_=rhs.rowBlocks_;
+//         colBlocks_=rhs.colBlocks_;
+// 	return *this;
+// }
+
+template<class Field_>
+template<class Mat1, class Mat2> Mat1& SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::
+applyLeft(Mat1 &Y, const Mat2 &X) const
+{
+        Y.zero();
+
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp parallel
+#endif
+	{
+		Index numBlockSizes=rowBlocks_.size();
+		for (Index chunkSizeIx=0;chunkSizeIx<numBlockSizes;++chunkSizeIx) {
+			const VectorChunks *rowChunks=&(rowBlocks_[chunkSizeIx]);
+			Index numChunks=rowChunks->size();
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp for schedule (static,1)
+#endif
+			for (Index rowChunk=0;rowChunk<numChunks;++rowChunk) {
+				const BlockList *blocks=&((*rowChunks)[rowChunk]);
+				Index numBlocks=blocks->size();
+				for (Index block=0;block<numBlocks;++block) {
+                                        const DataBlock *dataBlock=&((*blocks)[block]);
+					for (Index k=0;k<dataBlock->elts_.size();++k) {
+                                                const Index row=dataBlock->getRow((int)k);
+                                                const Index col=dataBlock->getCol((int)k);
+                                                typename Matrix::constSubMatrixType Xr(X,col,0,1,X.coldim());
+                                                typename Matrix::subMatrixType Yr(Y,row,0,1,Y.coldim());
+                                                MD_.saxpyin(Yr,dataBlock->elts_[k],Xr);
+                                        }
+                                }
+                        }
+                }
+        }
+        return Y;
+}
+
+template<class Field_>
+template<class Mat1, class Mat2> Mat1& SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::
+applyRight(Mat1 &Y, const Mat2 &X) const
+{
+        Y.zero();
+        typedef AbnormalMatrix<Field_,Mat1> AbnormalMat;
+        AbnormalMat YTemp(field(),Y);
+
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp parallel
+#endif
+	{
+		Index numBlockSizes=colBlocks_.size();
+		for (Index chunkSizeIx=0;chunkSizeIx<numBlockSizes;++chunkSizeIx) {
+			const VectorChunks *colChunks=&(colBlocks_[chunkSizeIx]);
+			Index numChunks=colChunks->size();
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp for schedule (static,1)
+#endif
+			for (Index colChunk=0;colChunk<numChunks;++colChunk) {
+				const BlockList *blocks=&((*colChunks)[colChunk]);
+				Index numBlocks=blocks->size();
+				for (Index block=0;block<numBlocks;++block) {
+                                        const DataBlock *dataBlock=&((*blocks)[block]);
+					for (Index k=0;k<dataBlock->elts_.size();++k) {
+                                                const Index row=dataBlock->getRow((int)k);
+                                                const Index col=dataBlock->getCol((int)k);
+                                                typename Matrix::constSubMatrixType Xc(X,0,row,X.rowdim(),1);
+                                                YTemp.saxpyin(dataBlock->elts_[k],Xc,
+                                                              0,col,Y.rowdim(),1);
+                                        }
+                                }
+                        }
+                }
+        }
+        YTemp.normalize();
+        return Y;
+}
+
+template<class Field_>
+template<class OutVector, class InVector>
+OutVector & SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::apply(OutVector & y, const InVector & x) const
+{
+	linbox_check( coldim() == x.size() );
+	linbox_check( rowdim() == y.size() );
+
+	uint8_t* yTempSpace=new uint8_t[sizeof(Field_)*y.size()+CACHE_ALIGNMENT];
+	size_t spacePtr=(size_t)yTempSpace;
+	FieldAXPY<Field_>* yTemp=(FieldAXPY<Field_>*)(spacePtr+CACHE_ALIGNMENT-(spacePtr%CACHE_ALIGNMENT));
+
+
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp parallel
+#endif
+	{
+                const Field_& fieldRef=field();
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp for schedule (static,1024)
+#endif
+                for (size_t i=0;i<y.size();++i) {
+                        new ((void*)(yTemp+i)) FieldAXPY<Field_>(fieldRef);
+                }
+
+		Index numBlockSizes=rowBlocks_.size();
+		for (Index chunkSizeIx=0;chunkSizeIx<numBlockSizes;++chunkSizeIx) {
+			const VectorChunks *rowChunks=&(rowBlocks_[chunkSizeIx]);
+			Index numChunks=rowChunks->size();
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp for schedule (static,1)
+#endif
+			for (Index rowChunk=0;rowChunk<numChunks;++rowChunk) {
+				const BlockList *blocks=&((*rowChunks)[rowChunk]);
+				Index numBlocks=blocks->size();
+				for (Index block=0;block<numBlocks;++block) {
+                                        const DataBlock *dataBlock=&((*blocks)[block]);
+					for (Index k=0;k<dataBlock->elts_.size();++k) {
+                                                const Index row=dataBlock->getRow((int)k);
+                                                const Index col=dataBlock->getCol((int)k);
+                                                yTemp[row].mulacc(dataBlock->elts_[k],x[col]);
+					}
+				}
+			}
+			//implicit barrier
+		}
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp for schedule (static,1024)
+#endif
+		for (Index i = 0; i < y.size(); ++i) {
+			yTemp[i].get(y[i]);
+			yTemp[i].~FieldAXPY<Field_>();
+		}
+	}
+
+	delete[] yTempSpace;
+        return y;
+}
+
+template<class Field_>
+template<class OutVector, class InVector>
+OutVector & SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::applyTranspose(OutVector & y, const InVector & x) const
+{
+	linbox_check( coldim() == y.size() );
+	linbox_check( rowdim() == x.size() );
+
+	uint8_t* yTempSpace=new uint8_t[sizeof(Field_)*y.size()+CACHE_ALIGNMENT];
+	size_t spacePtr=(size_t)yTempSpace;
+	FieldAXPY<Field_>* yTemp=(FieldAXPY<Field_>*)(spacePtr+CACHE_ALIGNMENT-(spacePtr%CACHE_ALIGNMENT));
+
+
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp parallel
+#endif
+	{
+                const Field_& fieldRef=field();
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp for schedule (static,1024)
+#endif
+                for (size_t i=0;i<y.size();++i) {
+                        new ((void*)(yTemp+i)) FieldAXPY<Field_>(fieldRef);
+                }
+
+		Index numBlockSizes=colBlocks_.size();
+		for (Index chunkSizeIx=0;chunkSizeIx<numBlockSizes;++chunkSizeIx) {
+			const VectorChunks *colChunks=&(colBlocks_[chunkSizeIx]);
+			Index numChunks=colChunks->size();
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp for schedule (static,1)
+#endif
+			for (Index colChunk=0;colChunk<numChunks;++colChunk) {
+				const BlockList *blocks=&((*colChunks)[colChunk]);
+				Index numBlocks=blocks->size();
+				for (Index block=0;block<numBlocks;++block) {
+                                        const DataBlock *dataBlock=&((*blocks)[block]);
+					for (Index k=0;k<dataBlock->elts_.size();++k) {
+                                                const Index row=dataBlock->getRow((int)k);
+                                                const Index col=dataBlock->getCol((int)k);
+                                                yTemp[col].mulacc(dataBlock->elts_[k],x[row]);
+					}
+				}
+			}
+			//implicit barrier
+		}
+#ifdef __LINBOX_USE_OPENMP
+#pragma omp for schedule (static,1024)
+#endif
+		for (Index i = 0; i < y.size(); ++i) {
+			yTemp[i].get(y[i]);
+			yTemp[i].~FieldAXPY<Field_>();
+		}
+	}
+
+	delete[] yTempSpace;
+        return y;
+}
+
+template<class Field_>
+Index SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::rowdim() const { return rows_; }
+
+template<class Field_>
+Index SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::coldim() const { return cols_; }
+
+template<class Field_>
+const Field_& SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::
+field() const { return MD_.field();}
+
+template<class Field_>
+size_t SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::size() const { return data_.size(); }
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::splitBlock(RefBlockList& superBlocks,TriplesBlock startBlock)
+{
+	typedef typename std::vector<Triple>::iterator BlockVecIt;
+
+	std::vector<TriplesBlock> blocks;
+	if (startBlock.nnz()<MAX_BLOCK_NNZ) {
+		--startBlock.blockEnd_;
+		superBlocks.push_back(startBlock);
+	} else {
+		blocks.push_back(startBlock);
+	}
+
+	while(!(blocks.empty())) {
+		TriplesBlock block=blocks.back();
+		blocks.pop_back();
+
+		Triple blockStart(block.blockStart_);
+		Triple blockEnd(block.blockEnd_);
+		TriplesCoord blockSize=block.blockSize();
+		TriplesCoord quarterSize=blockSize>>2;
+		Triple midOne(blockStart.coord_+quarterSize);
+		Triple midTwo(midOne.coord_+quarterSize);
+		Triple midThree(midTwo.coord_+quarterSize);
+
+		BlockVecIt dataBegin=data_.begin()+block.start_;
+		BlockVecIt dataEnd=data_.begin()+block.end_;
+		Index midOneData,midTwoData,midThreeData;
+
+                Triple midOneMM(midOne), midTwoMM(midTwo), midThreeMM(midThree);
+                --midOneMM.coord_; --midTwoMM.coord_; --midThreeMM.coord_;
+		midOneData=std::upper_bound(dataBegin,dataEnd,midOneMM,Triple::compareBlockTriples)-data_.begin();
+		midTwoData=std::upper_bound(dataBegin,dataEnd,midTwoMM,Triple::compareBlockTriples)-data_.begin();
+		midThreeData=std::upper_bound(dataBegin,dataEnd,midThreeMM,Triple::compareBlockTriples)-data_.begin();
+
+		TriplesBlock blockOne(block.start_,midOneData,block.blockStart_,midOne.coord_);
+		TriplesBlock blockTwo(midOneData,midTwoData,midOne.coord_,midTwo.coord_);
+		TriplesBlock blockThree(midTwoData,midThreeData,midTwo.coord_,midThree.coord_);
+		TriplesBlock blockFour(midThreeData,block.end_,midThree.coord_,block.blockEnd_);
+
+		if (blockOne.nnz()<MAX_BLOCK_NNZ) {
+			--blockOne.blockEnd_;
+			superBlocks.push_back(blockOne);
+		} else {
+			blocks.push_back(blockOne);
+		}
+		if (blockTwo.nnz()<MAX_BLOCK_NNZ) {
+			--blockTwo.blockEnd_;
+			superBlocks.push_back(blockTwo);
+		} else {
+			blocks.push_back(blockTwo);
+		}
+		if (blockThree.nnz()<MAX_BLOCK_NNZ) {
+			--blockThree.blockEnd_;
+			superBlocks.push_back(blockThree);
+		} else {
+			blocks.push_back(blockThree);
+		}
+		if (blockFour.nnz()<MAX_BLOCK_NNZ) {
+			--blockFour.blockEnd_;
+			superBlocks.push_back(blockFour);
+		} else {
+			blocks.push_back(blockFour);
+		}
+	}
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::toDataBlock(const RefBlockList& superBlocks,
+				       BlockList& dataBlocks)
+{
+	dataBlocks.clear();
+	dataBlocks.resize(superBlocks.size());
+	for (size_t i=0;i<superBlocks.size();++i) {
+		TriplesBlock block=superBlocks[i];
+		int ccf;
+
+		Index rowDiff=block.getStartRow()^block.getEndRow();
+		Index colDiff=block.getStartCol()^block.getEndCol();
+		Index combinedDiff=rowDiff|colDiff;
+		if ((combinedDiff>>8)==0) {
+			ccf=3;
+		} else if ((combinedDiff>>16) == 0) {
+			ccf=2;
+		} else if ((combinedDiff>>32) == 0) {
+			ccf=1;
+		} else {
+			ccf=0;
+		}
+
+		typename DataBlock::TripleListIt startIt=data_.begin()+block.start_;
+		typename DataBlock::TripleListIt endIt=data_.begin()+block.end_;
+		block.toBlock();
+		TriplesCoord blockSize=block.blockSize();
+                ++blockSize;
+		block.fromBlock();
+		dataBlocks[i].init(block.blockStart_,block.blockEnd_,
+				   blockSize,startIt,endIt,ccf);
+
+	}
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::finalize()
+{
+        if ((sortType_ & TRIPLES_SORTED) != 0) {return; }
+        for (Index k=0; k<data_.size();++k) {
+                data_[k].toBlock();
+        }
+
+        std::stable_sort(data_.begin(),data_.end(),Triple::compareBlockTriples);
+	std::vector<Triple> tempData;
+	tempData.reserve(data_.size());
+	if (!(data_.empty())) {
+		tempData.push_back(data_[0]);
+	}
+	for (size_t k=1;k<data_.size();++k) {
+		if (!(data_[k].coord_==tempData.back().coord_)) {
+			tempData.push_back(data_[k]);
+		}
+	}
+	data_.swap(tempData);
+
+	RefBlockList superBlocks;
+        Index rowBound=roundUpIndex(rowdim());
+        Index colBound=roundUpIndex(coldim());
+        Index rowColBound=(rowBound<colBound)?colBound:rowBound;
+        TriplesCoord startBlockIx(0,0),endBlockIx(0,rowColBound);
+        coordToBlock(endBlockIx);
+        TriplesBlock initialBlock(0,data_.size(),startBlockIx,endBlockIx);
+
+        splitBlock(superBlocks,initialBlock);
+
+        for (Index k=0;k<data_.size();++k) {
+                data_[k].fromBlock();
+        }
+
+        std::sort(superBlocks.begin(),superBlocks.end(),TriplesBlock::compareBlockSizes);
+
+	for (Index i=0;i<superBlocks.size();++i) {
+		superBlocks[i].fromBlock();
+	}
+
+	std::vector<DataBlock> dataBlocks;
+	toDataBlock(superBlocks,dataBlocks);
+
+	rowBlocks_.clear();
+        computeVectors(rowBlocks_,dataBlocks,CHUNK_BY_ROW);
+	colBlocks_.clear();
+        computeVectors(colBlocks_,dataBlocks,CHUNK_BY_COL);
+
+        sortType_=TRIPLES_SORTED;
+}
+
+template<class Field_>
+void SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::setEntry(Index i, Index j, const typename Field::Element & e)
+{
+	sortType_ = TRIPLES_UNSORTED;
+	data_.push_back(Triple(i, j, e));
+}
+
+template<class Field_>
+typename Field_::Element& SparseMatrix<Field_,SparseMatrixFormat::TPL_omp>::
+getEntry(typename Field::Element& e, Index i, Index j) const
+{
+	for (Index k = data_.size(); k > 0; --k)
+		if (data_[k-1].getRow() == i and data_[k-1].getCol() == j)
+			return e = data_[k-1].getElt();
+	return e = field().zero;
+}
+
+} // namespace LinBox
+
+#endif // __LINBOX_triplesbb_INL
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-tpl-matrix.h b/linbox/matrix/sparsematrix/sparse-tpl-matrix.h
new file mode 100644
index 0000000..3aed88d
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-tpl-matrix.h
@@ -0,0 +1,241 @@
+/* linbox/blackbox/matrix/sparsematrix/sparse-tpl-matrix.h
+ * Copyright (c) Linbox
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+
+ * Written by Rich Seagraves <seagrave at cis.udel.edu>
+ * with mods by bds
+ */
+
+/** @file matrix/sparsematrix/sparse-tpl-matrix.h
+ * @ingroup sparsematrix
+ * @brief
+ * A <code>SparseMatrix<_Field, SparseMatrixFormat::TPL ></code>
+ * is a vector of (i,j,value) triples.
+ *
+ * This is a variant of COO format.
+ */
+
+
+#ifndef __LINBOX_matrix_sparsematrix_sparse_tpl_matrix_H
+#define __LINBOX_matrix_sparsematrix_sparse_tpl_matrix_H
+
+#include <algorithm>
+#include <iostream>
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "linbox/util/field-axpy.h"
+#include "linbox/blackbox/blackbox-interface.h"
+#include "linbox/field/hom.h"
+#include "linbox/matrix/matrix-domain.h"
+
+#include <vector>
+
+namespace LinBox
+{
+
+	/** \brief Sparse Matrix in Triples storage
+	 *
+	 \ingroup blackbox
+	 * Sparse matrix representation which stores nonzero entries by i,j,value triples.
+	 */
+  template<class Field_>
+  class SparseMatrix<Field_, SparseMatrixFormat::TPL> : public BlackboxInterface {
+
+	public:
+	typedef Field_ Field;
+	typedef typename MatrixDomain<Field>::Matrix Matrix;
+	typedef typename Field::Element Element;
+	typedef SparseMatrix<Field,SparseMatrixFormat::TPL> Self_t;
+	typedef size_t Index; // would prefer a signed type
+	enum sortPolicy {unsorted, cacheOpt, rowMajor, colMajor};
+
+	// Default constructor.
+	// SparseMatrix();
+
+	SparseMatrix(const SparseMatrix & B);
+
+	SparseMatrix(const Field& F, std::istream& in);
+	SparseMatrix(MatrixStream<Field>& ms);
+
+	std::istream& read(std::istream& in);
+
+	template<class Format>
+	std::ostream& write(std::ostream& out, Format f) const;
+
+	std::ostream& write(std::ostream& out) const;
+
+
+	~SparseMatrix();
+
+	SparseMatrix(const Field& F, Index r = 0, Index c = 0);
+
+	// (re)initialize the matrix.  Any prior entries are abandoned.
+	SparseMatrix& init(const Field& F, Index r = 0, Index c = 0);
+
+	// need cstor from matrix stream, read, write
+
+	// Element e is added in the i,j position.
+	void setEntry(Index i, Index j, const Element & e);
+
+	/// Establish triples order.  Use after setEntry's, before any applies.
+	void finalize(sortPolicy s = cacheOpt);
+
+	// Element e is set to the i,j entry.
+	Element& getEntry(Element& e, Index i, Index j) const;
+
+	const Element /* & */getEntry(Index i, Index j) const
+	{
+		Element x ;
+		getEntry(x,i,j);
+		return x;
+	}
+
+	/// Mul with this on left: Y <- AX. Requires conformal shapes.
+	template<class Mat1, class Mat2>
+	Mat1 & applyLeft(Mat1 &Y, const Mat2 &X) const;
+	//Matrix & applyLeft(Matrix &Y, const Matrix &X) const;
+
+	/// Mul with this on right: Y <- XA. Requires conformal shapes.
+	template<class Mat1, class Mat2>
+	Mat1 & applyRight(Mat1 &Y, const Mat2 &X) const;
+	//Matrix & applyRight(Matrix &Y, const Matrix &X) const;
+
+	/** y <- A x.
+	 *
+	 *  Performance will generally be best if A is in cacheOpt order,
+	 *  and rowMajor, colMajor orders are generally better than random.
+	 *
+	 */
+	template<class OutVector, class InVector>
+	OutVector & apply(OutVector &y, const InVector &x) const;
+
+	/** y <- A^T x.
+	 *
+	 *  Performance will generally be best if A is in cacheOpt order,
+	 *  and rowMajor, colMajor orders are generally better than random.
+	 *
+	 */
+	template<class OutVector, class InVector>
+	OutVector & applyTranspose(OutVector &, const InVector &) const;
+
+	size_t rowdim() const;
+
+	size_t coldim() const;
+
+	const Field & field() const;
+
+	/*! Returns number of non-zero entries
+	 * @warning (some could be zero, for instance after a rebind...
+	 */
+	size_t size() const;
+
+
+	void resize( size_t row, size_t col, size_t nbnz =  0)
+	{
+		rows_ = row ;
+		cols_ = col ;
+		data_.resize(nbnz);
+	}
+
+	template<typename _Tp1, typename _Rw1 >
+	struct rebind ;
+
+
+	template<typename Tp1_, typename _Rw1 = SparseMatrixFormat::TPL>
+	struct rebind {
+		typedef SparseMatrix<Tp1_, SparseMatrixFormat::TPL> other;
+		void operator() (other & Ap, const Self_t& A)
+		{
+			Hom <typename Self_t::Field, Tp1_> hom( A.field(), Ap.field( ));
+
+			// typedef typename Tp1_::Element otherElt;
+			typedef typename other::Rep othervec;
+			typedef typename othervec::iterator otheriter;
+			otheriter vp_i;
+			typedef Rep selfvec;
+			typedef typename selfvec::const_iterator selfiter;
+			selfiter v_i;
+
+			Ap.resize(A.rowdim(),A.coldim(),A.size());
+			// Ap.data_.resize(A.data.size()); !!! this is protected
+
+			for (v_i = A.refDataConst().begin(), vp_i = Ap.refData().begin();
+			     v_i != A.refDataConst().end(); ++ v_i, ++ vp_i)
+				hom.image (vp_i->elt, v_i->elt);
+		}
+	};
+
+	template<typename _Tp1, typename _Rw1>
+	SparseMatrix (const SparseMatrix<_Tp1, _Rw1> &S, const Field& F) :
+		MD_(F), data_(), rows_(0), cols_(0), sort_(unsorted)
+	  {
+		  typename SparseMatrix<_Tp1,_Rw1>::template rebind<Field,SparseMatrixFormat::TPL>()(*this, S);
+	  }
+
+
+
+	protected:
+	MatrixDomain<Field> MD_; // Contains the field and dense mat ops for applyLeft and applyRight
+
+	struct Triple { Index row; Index col; Element elt;
+		Triple(Index& r, Index& c, const Element& e)
+		{ init(r, c, e); }
+		Triple() {} ;
+		void init(Index& r, Index& c, const Element& e)
+		{ row = r; col = c; elt = e; }
+	};
+
+	// the data
+	std::vector<Triple> data_;
+
+	/// The number of rows, columns
+	Index rows_, cols_;
+
+	sortPolicy sort_;
+	// 0 = unsorted, 1 = cache optimized, 2 = row major, 3 = col major.
+	//int sort_;
+	public:
+	typedef std::vector<Triple> Rep ;
+	const std::vector<Triple> & refDataConst() const
+	{
+		return data_ ;
+	}
+	std::vector<Triple> & refData()
+	{
+		return data_ ;
+	}
+
+
+
+  }; // SparseMatrix
+
+} // namespace LinBox
+
+#include "sparse-tpl-matrix.inl"
+
+#endif // __LINBOX_matrix_sparsematrix_sparse_tpl_matrix_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/sparse-tpl-matrix.inl b/linbox/matrix/sparsematrix/sparse-tpl-matrix.inl
new file mode 100644
index 0000000..d6856a2
--- /dev/null
+++ b/linbox/matrix/sparsematrix/sparse-tpl-matrix.inl
@@ -0,0 +1,253 @@
+/* linbox/matrix/sparsematrix/sparse-tpl-matrix-omp.inl
+ * Copyright (c) LinBox
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+
+ * Written by Rich Seagraves <seagrave at cis.udel.edu>
+ * with mods by bds and Alex Stachnik
+ */
+
+/** @file matrix/sparsematrix/sparse-tpl-matrix-omp.inl
+ * @ingroup blackbox
+ * @brief A COO (vector of i,j,v triples) sparse matrix rep.
+ */
+
+#ifndef __LINBOX_triplesbb_INL
+#define __LINBOX_triplesbb_INL
+
+#include <algorithm>
+#include <iostream>
+//#include <vector>
+
+#include "linbox/util/matrix-stream.h"
+
+namespace LinBox
+{
+
+// template<class Field_> SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+// SparseMatrix() : MD_(), data_(), rows_(0), cols_(0), sort_(unsorted) {}
+
+template<class Field_>
+ SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+~SparseMatrix() {}
+
+template<class Field_>
+ SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+SparseMatrix(const Field& F, std::istream& in)
+: MD_(F), data_(), rows_(0), cols_(0), sort_(unsorted)
+{ read(in); }
+
+template<class Field_>
+SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+SparseMatrix(MatrixStream<Field_> &ms):
+	MD_(ms.field()), data_(), rows_(0), cols_(0), sort_(unsorted)
+{
+	Index r, c;
+	typename Field::Element v; field().init(v);
+	ms.getDimensions(r, c);
+	init(field(), r, c);
+	while (ms.nextTriple(r, c, v)) setEntry(r, c, v);
+	finalize();
+}
+
+
+template<class Field_>
+ std::istream& SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+read(std::istream& in){
+	Index r, c;
+	typename Field::Element v; field().init(v);
+	MatrixStream<Field> ms(field(), in);
+	ms.getDimensions(r, c);
+	init(field(), r, c);
+	while (ms.nextTriple(r, c, v)) setEntry(r, c, v);
+	finalize();
+	return in;
+}
+
+template<class Field_>
+template<class Format>
+ std::ostream& SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+write(std::ostream& out,
+      Format f ) const{
+	return write(out);
+}
+template<class Field_>
+ std::ostream& SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+write(std::ostream& out ) const{
+	// linbox_check(f == SparseFileFormat::COO());
+	//! @bug we should not support too many formats
+	out << "%%MatrixMarket matrix coordinate integer general" << std::endl;
+	out << "% written from a LinBox SparseMatrix" << std::endl;
+	out << rowdim() <<" " << coldim() << " " << size() << std::endl;
+	for (Index k = 0; k < size(); ++k) {
+		Triple t = data_[k];
+		field().write(out << t.row+1 << " " << t.col+1 << " ", t.elt) << std::endl;
+	}
+	return out;
+}
+
+template<class Field_>
+ SparseMatrix<Field_,SparseMatrixFormat::TPL>& SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+init(const Field& F, Index r, Index c)
+{ MD_.init(F), data_.clear(); rows_ = r; cols_ = c; sort_ = unsorted; return *this; }
+
+template<class Field_>
+ SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+SparseMatrix(const Field& F, Index r, Index c)
+: MD_(F), data_(), rows_(r), cols_(c), sort_(unsorted) {}
+
+template<class Field_>
+ SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+SparseMatrix(const SparseMatrix<Field_,SparseMatrixFormat::TPL> & B)
+: MD_(B.field()), data_ ( B.data_ ), rows_ ( B.rows_ ), cols_ ( B.cols_ ),
+   sort_ ( B.sort_ )
+{}
+
+ //        template<class Field_>
+//         SparseMatrix<Field_,SparseMatrixFormat::TPL>& SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+// operator=(const SparseMatrix<Field_,SparseMatrixFormat::TPL> & rhs)
+// {	if (rhs == this) return *this;
+// 	MD_.init(rhs.field_);
+// 	data_ = rhs.data_;
+// 	rows_ = rhs.rows_;
+// 	cols_ = rhs.cols_;
+// 	sort_ = rhs.sort_;
+// 	return *this;
+// }
+
+template<class Field_>
+template<class Mat1, class Mat2> Mat1& SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+// I do not like this need to templatize -bds
+//typename SparseMatrix<Field_,SparseMatrixFormat::TPL>::Matrix& SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+applyLeft // Y = AX
+	( /*typename SparseMatrix<Field_,SparseMatrixFormat::TPL>::Matrix*/Mat1 &Y,
+	  const /*typename SparseMatrix<Field_,SparseMatrixFormat::TPL>::Matrix*/Mat2 &X
+	) const
+{	Y.zero();
+	// Matrix Yc(field()) ;
+	// const Matrix Xc(field());// row submatrices
+	for (Index k = 0; k < data_.size(); ++k) {
+		Triple t = data_[k];
+		Matrix Yc (Y,t.row,0,1,Y.coldim());
+		// Yc.submatrix(Y,t.row,0,1,Y.coldim());
+		typename Matrix::constSubMatrixType Xc(X,t.col,0,1,X.coldim());
+		// Xc.submatrix(X,t.col,0,1,X.coldim());
+		MD_.saxpyin(Yc, t.elt, Xc);
+	}
+	return Y;
+}
+
+//template<class Field_> typename SparseMatrix<Field_,SparseMatrixFormat::TPL>::Matrix& SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+template<class Field_>
+template<class Mat1, class Mat2> Mat1& SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+applyRight // Y = XA
+	( /*SparseMatrix<Field_,SparseMatrixFormat::TPL>::Matrix*/Mat1 &Y,
+	  const /*typename SparseMatrix<Field_,SparseMatrixFormat::TPL>::Matrix*/Mat2 &X
+	) const
+{	Y.zero();
+	// Matrix Yr(field());
+	// const Matrix Xr(field()); // row submatrices
+	for (Index k = 0; k < data_.size(); ++k) {
+		Triple t = data_[k];
+		Matrix Yr(Y,0,t.col,Y.rowdim(),1);
+		// Yr.submatrix(Y,0,t.col,Y.rowdim(),1);
+		typename Matrix::constSubMatrixType Xr(X,0,t.row,X.rowdim(),1);
+		// Xr.submatrix(X,0,t.row,X.rowdim(),1);
+		MD_.saxpyin(Yr, t.elt, Xr);
+	}
+	return Y;
+}
+
+template<class Field_>
+template<class OutVector, class InVector>
+OutVector & SparseMatrix<Field_,SparseMatrixFormat::TPL>::apply(OutVector & y, const InVector & x) const
+{
+	linbox_check( rowdim() == y.size() );
+	linbox_check( coldim() == x.size() );
+	for (Index i = 0; i < y.size(); ++i) field().assign(y[i], field().zero);
+	for (Index k = 0; k < data_.size(); ++k) {
+		Triple t = data_[k];
+		field().axpyin(y[t.row], t.elt, x[t.col]);
+	}
+	return y;
+}
+
+template<class Field_>
+
+template<class OutVector, class InVector>
+OutVector & SparseMatrix<Field_,SparseMatrixFormat::TPL>::applyTranspose(OutVector & y, const InVector & x) const
+{
+	linbox_check( coldim() == y.size() );
+	linbox_check( rowdim() == x.size() );
+	for (Index i = 0; i < y.size(); ++i) field().assign(y[i], field().zero);
+	for (Index k = 0; k < data_.size(); ++k) {
+		const Triple& t = data_[k];
+		field().axpyin(y[t.col], t.elt, x[t.row]);
+	}
+	return y;
+}
+
+template<class Field_>
+ size_t SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+rowdim() const { return rows_; }
+
+template<class Field_>
+ size_t SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+coldim() const { return cols_; }
+
+template<class Field_>
+ const Field_& SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+field() const { return MD_.field(); }
+
+template<class Field_>
+ size_t SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+size() const { return data_.size(); }
+
+template<class Field_>
+ void SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+setEntry(Index i, Index j, const typename Field::Element & e)
+{
+	sort_ = unsorted;
+	data_.push_back(Triple(i, j, e));
+}
+
+template<class Field_>
+ void SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+finalize(sortPolicy s) { /* sort according to policy */ sort_ = s; }
+
+template<class Field_>
+ typename Field_::Element& SparseMatrix<Field_,SparseMatrixFormat::TPL>::
+getEntry(typename Field_::Element& e, Index i, Index j) const
+{
+	for (Index k = 0; k < data_.size(); ++k)
+		if (data_[k].row == i and data_[k].col == j)
+			return e = data_[k].elt;
+	return e = field().zero;
+}
+
+} // namespace LinBox
+
+#endif // __LINBOX_triplesbb_INL
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/sparsematrix/triples-coord.h b/linbox/matrix/sparsematrix/triples-coord.h
new file mode 100644
index 0000000..2d704d4
--- /dev/null
+++ b/linbox/matrix/sparsematrix/triples-coord.h
@@ -0,0 +1,200 @@
+/* Copyright (C) 2013 LinBox
+ * Written by AJS <stachnik at udel.edu>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file   linbox/matrix/sparsematrix/tripples-coord.h
+ * @brief
+ */
+
+#ifndef __LINBOX_matrix_sparsematrix_triples_coord_H
+#define __LINBOX_matrix_sparsematrix_triples_coord_H
+
+#include <stdlib.h>
+#include <fstream>
+#include <limits.h>
+
+namespace LinBox
+{
+
+//typedef size_t Index;
+    typedef uint64_t Index;
+
+union TriplesCoord {
+        Index rowCol[2];
+        Index blockIxArr[2]; // little endian
+
+        TriplesCoord() {};
+
+        TriplesCoord(Index row, Index col) {rowCol[0]=row;rowCol[1]=col;}
+
+        inline TriplesCoord operator--() {
+                linbox_check(!((blockIxArr[0]==0)&&(blockIxArr[1]==0)));
+                if (blockIxArr[0] == 0) {
+                        --blockIxArr[1];
+                }
+                --blockIxArr[0];
+                return *this;
+        }
+
+        inline TriplesCoord operator++() {
+                ++blockIxArr[0];
+                if (blockIxArr[0] == 0) {
+                        ++blockIxArr[1];
+                }
+                return *this;
+        }
+};
+
+std::ostream& operator<<(std::ostream& out, const TriplesCoord& coord)
+{
+	out << coord.rowCol[0] << "," << coord.rowCol[1];
+	return out;
+}
+
+inline TriplesCoord operator>>(const TriplesCoord& coord,unsigned int shift) {
+	TriplesCoord retVal;
+	retVal.blockIxArr[1]=coord.blockIxArr[1]>>shift;
+        retVal.blockIxArr[0]=
+                ((((1<<shift)-1)&coord.blockIxArr[1])<<(64-shift))|
+                (coord.blockIxArr[0]>>shift);
+	return retVal;
+}
+
+inline TriplesCoord operator+(const TriplesCoord& lhs,const TriplesCoord& rhs) {
+	TriplesCoord retVal;
+	retVal.blockIxArr[0]=lhs.blockIxArr[0]+rhs.blockIxArr[0];
+	retVal.blockIxArr[1]=lhs.blockIxArr[1]+rhs.blockIxArr[1];
+	if (retVal.blockIxArr[0]<lhs.blockIxArr[0]) {
+		++(retVal.blockIxArr[1]);
+	}
+	return retVal;
+}
+
+inline bool operator==(const TriplesCoord& lhs,const TriplesCoord& rhs) {
+        return (lhs.blockIxArr[1]==rhs.blockIxArr[1]) &&
+                (lhs.blockIxArr[0]==rhs.blockIxArr[0]);
+
+}
+
+inline bool operator<(const TriplesCoord& lhs,const TriplesCoord& rhs) {
+	return (lhs.blockIxArr[1]<rhs.blockIxArr[1])||
+		((!(lhs.blockIxArr[1]>rhs.blockIxArr[1])) &&
+		 (lhs.blockIxArr[0]<rhs.blockIxArr[0]));
+}
+
+inline TriplesCoord operator-(const TriplesCoord& lhs,const TriplesCoord& rhs) {
+	TriplesCoord retVal;
+	linbox_check(!(lhs<rhs));
+	retVal.blockIxArr[0]=lhs.blockIxArr[0]-rhs.blockIxArr[0];
+	retVal.blockIxArr[1]=lhs.blockIxArr[1]-rhs.blockIxArr[1];
+	if (lhs.blockIxArr[0]<rhs.blockIxArr[0]) {
+		--(retVal.blockIxArr[1]);
+	}
+	return retVal;
+}
+
+void coordFromBlock(TriplesCoord& coord)
+{
+	Index temp,final;
+	Index localRow=0,localCol=0;
+	if (coord.blockIxArr[1]!=0) {
+		final=coord.blockIxArr[1];
+		temp=(final^(final>>1))&0x2222222222222222;
+		final^=temp^(temp<<1);
+		temp=(final^(final>>2))&0x0C0C0C0C0C0C0C0C;
+		final^=temp^(temp<<2);
+		temp=(final^(final>>4))&0x00F000F000F000F0;
+		final^=temp^(temp<<4);
+		temp=(final^(final>>8))&0x0000FF000000FF00;
+		final^=temp^(temp<<8);
+		temp=(final^(final>>16))&0x00000000FFFF0000;
+		final^=temp^(temp<<16);
+		localRow=(Index)(final&(~0xFFFFFFFF));
+		localCol=(Index)((final<<32)&(~0xFFFFFFFF));
+	}
+	final=coord.blockIxArr[0];
+	temp=(final^(final>>1))&0x2222222222222222;
+	final^=temp^(temp<<1);
+	temp=(final^(final>>2))&0x0C0C0C0C0C0C0C0C;
+	final^=temp^(temp<<2);
+	temp=(final^(final>>4))&0x00F000F000F000F0;
+	final^=temp^(temp<<4);
+	temp=(final^(final>>8))&0x0000FF000000FF00;
+	final^=temp^(temp<<8);
+	temp=(final^(final>>16))&0x00000000FFFF0000;
+	final^=temp^(temp<<16);
+	localRow|=(Index)((final>>32)&0xFFFFFFFF);
+	localCol|=(Index)(final&0xFFFFFFFF);
+	coord.rowCol[0]=localRow;
+	coord.rowCol[1]=localCol;
+}
+
+void coordToBlock(TriplesCoord& coord)
+{
+	Index temp,final;
+	Index localRow=coord.rowCol[0],localCol=coord.rowCol[1];
+	Index highOrderLocalRow=localRow&(~0xFFFFFFFF);
+	Index highOrderLocalCol=localCol&(~0xFFFFFFFF);
+	Index highOrderFinal;
+	coord.blockIxArr[1]=0;
+	if ((highOrderLocalRow != 0) || (highOrderLocalCol != 0)) {
+		highOrderFinal=localRow|(localCol>>32);
+		temp=(highOrderFinal^(highOrderFinal>>16))&0x00000000FFFF0000;
+		highOrderFinal^=temp^(temp<<16);
+		temp=(highOrderFinal^(highOrderFinal>>8))&0x0000FF000000FF00;
+		highOrderFinal^=temp^(temp<<8);
+		temp=(highOrderFinal^(highOrderFinal>>4))&0x00F000F000F000F0;
+		highOrderFinal^=temp^(temp<<4);
+		temp=(highOrderFinal^(highOrderFinal>>2))&0x0C0C0C0C0C0C0C0C;
+		highOrderFinal^=temp^(temp<<2);
+		temp=(highOrderFinal^(highOrderFinal>>1))&0x2222222222222222;
+		highOrderFinal^=temp^(temp<<1);
+		coord.blockIxArr[1]=highOrderFinal;
+	}
+	localCol&=0xFFFFFFFF;
+	localRow&=0xFFFFFFFF;
+	final=(localRow<<32)|localCol;
+	temp=(final^(final>>16))&0x00000000FFFF0000;
+	final^=temp^(temp<<16);
+	temp=(final^(final>>8))&0x0000FF000000FF00;
+	final^=temp^(temp<<8);
+	temp=(final^(final>>4))&0x00F000F000F000F0;
+	final^=temp^(temp<<4);
+	temp=(final^(final>>2))&0x0C0C0C0C0C0C0C0C;
+	final^=temp^(temp<<2);
+	temp=(final^(final>>1))&0x2222222222222222;
+	final^=temp^(temp<<1);
+	coord.blockIxArr[0]=final;
+}
+
+}
+
+#endif // __LINBOX_matrix_sparsematrix_triples_coord_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/matrix/transpose-matrix.h b/linbox/matrix/transpose-matrix.h
index 2e9c89e..022f5df 100644
--- a/linbox/matrix/transpose-matrix.h
+++ b/linbox/matrix/transpose-matrix.h
@@ -35,18 +35,23 @@
 #ifndef __LINBOX_matrix_transpose_INL
 #define __LINBOX_matrix_transpose_INL
 
+#include <linbox/linbox-config.h>
 #include <iostream>
 #include <vector>
 #include <fstream>
 
-#include "linbox/vector/subiterator.h"
-#include "linbox/vector/subvector.h"
-#include "linbox/vector/stream.h"
+// #include "linbox/vector/subiterator.h" // BB: not used
+// #include "linbox/vector/subvector.h"
+#include "linbox/matrix/matrix-traits.h"
+// #include "linbox/vector/stream.h"
 #include "linbox/matrix/matrix-domain.h"
 
 namespace LinBox
 {
 
+	template<class Matrix>
+	struct MatrixTraits ;
+
 	/** @brief Matrix transpose.
 	 *
 	 * This class takes a matrix meeting the @ref BlasMatrix archetype
@@ -690,11 +695,10 @@ namespace LinBox
 #endif // __LINBOX_matrix_transpose_INL
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/randiter/Makefile.am b/linbox/randiter/Makefile.am
index 5ca624b..f43e836 100644
--- a/linbox/randiter/Makefile.am
+++ b/linbox/randiter/Makefile.am
@@ -18,11 +18,13 @@
 # ========LICENCE========
 
 
+AM_CPPFLAGS= -I$(top_srcdir)/linbox $(DEPS_CFLAGS)
+LDADD = $(DEPS_LIBS) $(LDFLAGS)
 
-AM_CPPFLAGS=-I$(top_srcdir)/linbox
 pkgincludesubdir=$(pkgincludedir)/randiter
-
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR $(GMP_CFLAGS) $(NTL_CFLAGS) $(ATLAS_CFLAGS) $(GIVARO_CFLAGS)  $(FFLAS_FFPACK_CFLAGS)
+ 
+#AM_CPPFLAGS=-I$(top_srcdir)/linbox
+#AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR $(GMP_CFLAGS) $(NTL_CFLAGS) $(ATLAS_CFLAGS)   
 
 BASIC_HDRS =            \
     abstract.h          \
@@ -30,50 +32,28 @@ BASIC_HDRS =            \
     envelope.h          \
     gmp-rational.h      \
     param-fuzzy.h       \
-    modular.h           \
     modular-balanced.h  \
     modular-crooked.h   \
-    unparametric.h      \
     gf2.h               \
-    nonzero.h           \
     mersenne-twister.h  \
-    ntl-ZZ.h            \
     random-prime.h      \
-    random-integer.h    \
     gmp-random-prime.h  \
     random-fftprime.h   \
-    multimod-randomprime.h
-
-NTL_HDRS =
+    multimod-randomprime.h \
+    givaro-poly.h
 
-GIVARO_HDRS =
-
-LIDIA_HDRS =            \
-    lidia.h             \
-    lidia-gfq.h
+NTL_HDRS = ntl-zz.h
 
 if LINBOX_HAVE_NTL
 USE_NTL_HDRS = $(NTL_HDRS)
 endif
 
-if LINBOX_HAVE_GIVARO
-USE_GIVARO_HDRS = $(GIVARO_HDRS)
-endif
-
-if LINBOX_HAVE_LIDIA
-USE_LIDIA_HDRS = $(LIDIA_HDRS)
-endif
-
 pkgincludesub_HEADERS =     \
     $(BASIC_HDRS)           \
-    $(USE_NTL_HDRS)         \
-    $(USE_GIVARO_HDRS)      \
-    $(USE_LIDIA_HDRS)
+    $(USE_NTL_HDRS)
 
 EXTRA_DIST =                \
     $(NTL_HDRS)             \
-    $(GIVARO_HDRS)          \
-    $(LIDIA_HDRS)           \
     randiter.doxy           \
     archetype.doxy          \
     randiter-wrappers.doxy
diff --git a/linbox/randiter/Makefile.in b/linbox/randiter/Makefile.in
deleted file mode 100644
index 3112567..0000000
--- a/linbox/randiter/Makefile.in
+++ /dev/null
@@ -1,672 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/randiter
-DIST_COMMON = $(am__pkgincludesub_HEADERS_DIST) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-LTLIBRARIES = $(noinst_LTLIBRARIES)
-libranditer_la_LIBADD =
-am_libranditer_la_OBJECTS = mersenne-twister.lo
-libranditer_la_OBJECTS = $(am_libranditer_la_OBJECTS)
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = $(libranditer_la_SOURCES)
-DIST_SOURCES = $(libranditer_la_SOURCES)
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__pkgincludesub_HEADERS_DIST = abstract.h archetype.h envelope.h \
-	gmp-rational.h param-fuzzy.h modular.h modular-balanced.h \
-	modular-crooked.h unparametric.h gf2.h nonzero.h \
-	mersenne-twister.h ntl-ZZ.h random-prime.h random-integer.h \
-	gmp-random-prime.h random-fftprime.h multimod-randomprime.h \
-	lidia.h lidia-gfq.h
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-AM_CPPFLAGS = -I$(top_srcdir)/linbox
-pkgincludesubdir = $(pkgincludedir)/randiter
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DDISABLE_COMMENTATOR $(GMP_CFLAGS) $(NTL_CFLAGS) $(ATLAS_CFLAGS) $(GIVARO_CFLAGS)  $(FFLAS_FFPACK_CFLAGS)
-BASIC_HDRS = \
-    abstract.h          \
-    archetype.h         \
-    envelope.h          \
-    gmp-rational.h      \
-    param-fuzzy.h       \
-    modular.h           \
-    modular-balanced.h  \
-    modular-crooked.h   \
-    unparametric.h      \
-    gf2.h               \
-    nonzero.h           \
-    mersenne-twister.h  \
-    ntl-ZZ.h            \
-    random-prime.h      \
-    random-integer.h    \
-    gmp-random-prime.h  \
-    random-fftprime.h   \
-    multimod-randomprime.h
-
-NTL_HDRS = 
-GIVARO_HDRS = 
-LIDIA_HDRS = \
-    lidia.h             \
-    lidia-gfq.h
-
- at LINBOX_HAVE_NTL_TRUE@USE_NTL_HDRS = $(NTL_HDRS)
- at LINBOX_HAVE_GIVARO_TRUE@USE_GIVARO_HDRS = $(GIVARO_HDRS)
- at LINBOX_HAVE_LIDIA_TRUE@USE_LIDIA_HDRS = $(LIDIA_HDRS)
-pkgincludesub_HEADERS = \
-    $(BASIC_HDRS)           \
-    $(USE_NTL_HDRS)         \
-    $(USE_GIVARO_HDRS)      \
-    $(USE_LIDIA_HDRS)
-
-EXTRA_DIST = \
-    $(NTL_HDRS)             \
-    $(GIVARO_HDRS)          \
-    $(LIDIA_HDRS)           \
-    randiter.doxy           \
-    archetype.doxy          \
-    randiter-wrappers.doxy
-
-noinst_LTLIBRARIES = libranditer.la
-libranditer_la_SOURCES = \
-    mersenne-twister.C
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .C .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/randiter/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps linbox/randiter/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-clean-noinstLTLIBRARIES:
-	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
-	@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" != "$$p" || dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-libranditer.la: $(libranditer_la_OBJECTS) $(libranditer_la_DEPENDENCIES) $(EXTRA_libranditer_la_DEPENDENCIES) 
-	$(CXXLINK)  $(libranditer_la_OBJECTS) $(libranditer_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-.C.o:
-	$(CXXCOMPILE) -c -o $@ $<
-
-.C.obj:
-	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.C.lo:
-	$(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
-	done
-
-uninstall-pkgincludesubHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(LTLIBRARIES) $(HEADERS)
-installdirs:
-	for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
-	mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool clean-noinstLTLIBRARIES ctags distclean \
-	distclean-compile distclean-generic distclean-libtool \
-	distclean-tags distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-pdf install-pdf-am install-pkgincludesubHEADERS \
-	install-ps install-ps-am install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/randiter/abstract.h b/linbox/randiter/abstract.h
old mode 100644
new mode 100755
index 7efc851..cb2176d
--- a/linbox/randiter/abstract.h
+++ b/linbox/randiter/abstract.h
@@ -96,7 +96,7 @@ namespace LinBox
 		 * Purely virtual.
 		 * @return reference to ElementAbstract object
 		 */
-		virtual Element &random (Element &a) const = 0;
+		virtual Element &random (Element &a) = 0;
 
 	protected:
 
diff --git a/linbox/randiter/archetype.h b/linbox/randiter/archetype.h
index e5a7e17..ea138eb 100644
--- a/linbox/randiter/archetype.h
+++ b/linbox/randiter/archetype.h
@@ -90,7 +90,7 @@ namespace LinBox
 		RandIterArchetype (const FieldArchetype &F,
 				   const integer &size = 0,
 				   const integer &seed = 0)
-		{ _randIter_ptr = F._randIter_ptr->construct (*F._field_ptr, size, seed); }
+                        {_randIter_ptr = F._randIter_ptr->construct (*(F._field_ptr), size, seed);}
 
 		/** Copy constructor.
 		 * Constructs RandIterArchetype object by copying the random field
diff --git a/linbox/randiter/envelope.h b/linbox/randiter/envelope.h
index 5e2441f..ab2590f 100644
--- a/linbox/randiter/envelope.h
+++ b/linbox/randiter/envelope.h
@@ -70,7 +70,7 @@ namespace LinBox
 		RandIterEnvelope (const FieldEnvelope<Field> &F,
 				  const integer &size = 0,
 				  const integer &seed = 0) :
-			_randIter (F._field, size, seed)
+			_randIter (F._field, seed)
 		{}
 
 		/** Constructor from random field element generator to be wrapped
@@ -129,7 +129,7 @@ namespace LinBox
 					     const integer &size = 0,
 					     const integer &seed = 0) const
 		{
-			return new RandIterEnvelope (static_cast<const FieldEnvelope<Field>&> (F)._field, size, seed);
+			return new RandIterEnvelope (static_cast<const FieldEnvelope<Field>&> (F), size, seed);
 		}
 
 		/** Virtual copy constructor.
@@ -147,7 +147,7 @@ namespace LinBox
 		 * Required by abstract base class.
 		 * @return reference to random field element
 		 */
-		ElementAbstract &random (ElementAbstract &a) const
+		ElementAbstract &random (ElementAbstract &a)
 		//{ return  _randIter.random (a); }
 		// GV Thu Apr 18 14:46:46 MEST 2002
 		// modify by P.G. 2004-07-16
diff --git a/linbox/randiter/generic.h b/linbox/randiter/generic.h
new file mode 100644
index 0000000..84a311b
--- /dev/null
+++ b/linbox/randiter/generic.h
@@ -0,0 +1,179 @@
+/* linbox/randiter/generic.h
+ * 2004 june, bds and Dan Roche starting from:
+ * Copyright (C) 1999-2001 William J Turner,
+ *               2002 Bradford Hovinen
+ *
+ * Written by William J Turner <wjturner at math.ncsu.edu>,
+ *            Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * ------------------------------------
+ * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * Changed LargeModularRandIter to ModularRandIter, parameterized on the
+ * element type. This change is for compatibility with the changes in
+ * field/modular.h
+ *
+ * Renamed from large-modular.h to modular.h
+ * ------------------------------------
+ * 2002-05-14 William J. Turner <wjturner at acm.org>
+ *
+ * Seeded random number generator in constructor.  _seed was never used
+ * before.
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file randiter/generic.h
+ * @ingroup randiter
+ * @brief Genric random iterator.
+ */
+//#error "deprecated and not tested"
+
+#ifndef __LINBOX_generic_randiter_H
+#define __LINBOX_generic_randiter_H
+
+#include <iostream>
+#include <vector>
+
+#include "time.h"
+#include "linbox/integer.h"
+#include "linbox/element/abstract.h"
+#include "linbox/element/envelope.h"
+#include "linbox/util/commentator.h"
+#include "linbox/randiter/mersenne-twister.h"
+#include "linbox/linbox-config.h"
+
+namespace LinBox
+{
+
+	/** Random field base element generator.
+	 * This is a generator of random field elements that can be used with
+	 * any field.  It initializes elements using rand().  For prime fields
+	 * with p < 2^32, a near-uniform distrubution can be expected.  For
+	 * larger fields or non-prime fields, a near-uniform distribution on an
+	 * unspecified subset of the elements can be expected.
+	 */
+	template <class Field>
+	class GenericRandIter {
+	public:
+
+		typedef typename Field::Element Element;
+
+		/** Constructor from field, sampling size, and seed.
+		 * The random field element iterator works in the field F, is seeded
+		 * by seed, and it returns any one element with probability no more
+		 * than <code>1/min (size, F.characteristic(c))</code>.
+		 * A sampling size of zero means to sample from the entire prime subfield.
+		 * A seed of zero means to use some arbitrary seed for the generator which will vary from run to run.
+		 * @param F LinBox field in which to do arithmetic
+		 * @param size constant integer reference of sample size from which to
+		 *             sample (default = modulus of field)
+		 * @param seed constant integer reference from which to seed random number
+		 *             generator (default = 0)
+		 */
+		GenericRandIter (const Field &F,
+				 const integer &size = 0,
+				 const integer &seed = 0) :
+			_field (F), _size (size), _seed (seed)
+		{
+			if (_seed == 0) _seed = time (NULL);
+
+			integer cardinality;
+
+			F.cardinality (cardinality);
+
+			if ((_size == 0) || (_size > cardinality))
+				_size = cardinality;
+
+			linbox_check(cardinality>0); // could be -1
+
+			commentator().report (10, INTERNAL_DESCRIPTION)
+			<< "Created random generator with size " << _size
+			<< " and seed " << _seed << std::endl;
+
+			// Seed random number generator
+			srand (_seed);
+		}
+
+		GenericRandIter (const GenericRandIter<Field> &R) :
+			_field (R._field), _size (R._size), _seed (R._seed)
+		{}
+
+		~GenericRandIter () {}
+
+		GenericRandIter<Field> &operator=(const GenericRandIter<Field> &R)
+		{
+			if (this != &R) { // guard against self-assignment
+				_size = R._size;
+				_seed = R._seed;
+			}
+
+			return *this;
+		}
+
+		/** Random field element creator.
+		 * This returns a random field element from the information supplied
+		 * at the creation of the generator.
+		 * Required by abstract base class.
+		 * @return reference to random field element
+		 */
+		Element &random (Element &a) const
+		{ return _field.init(a,rand()); }
+
+		/** Random field element creator.
+		 * This returns a random field element from the information supplied
+		 * at the creation of the generator.
+		 * Required by abstract base class.
+		 * @return reference to random field element
+		 */
+		ElementAbstract &random (ElementAbstract &a) const
+		{
+			Element tmp;
+
+			random (tmp);
+			return (a = ElementEnvelope <Field> (tmp));
+		}
+
+	private:
+
+		/// Field in which arithmetic is done
+		Field _field;
+
+		/// Sampling size
+		integer _size;
+
+		/// Seed
+		long _seed;
+
+	}; // class GenericRandIter
+}
+#endif //__LINBOX_generic_randiter_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/randiter/gf2.h b/linbox/randiter/gf2.h
index a4d9568..c4e44f7 100644
--- a/linbox/randiter/gf2.h
+++ b/linbox/randiter/gf2.h
@@ -66,9 +66,9 @@ namespace LinBox
 			     const integer &size  = 0 ,
 			     const integer &seed = 0)
 		{
-			long _seed = seed;
+			int32_t _seed = seed;
 
-			if (_seed == 0) _seed = time (NULL);
+			if (_seed == 0) _seed = (int32_t)time (NULL);
 			MT.setSeed ((uint32_t)_seed);
 		}
 
diff --git a/linbox/randiter/givaro-poly.h b/linbox/randiter/givaro-poly.h
new file mode 100644
index 0000000..48308c8
--- /dev/null
+++ b/linbox/randiter/givaro-poly.h
@@ -0,0 +1,75 @@
+
+/* randiter/givaro-poly.h
+ * Copyright (C) 2014 Gavin Harrison,
+ *
+ * Written by Gavin Harrison <gmh33 at drexel.edu>,
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+#include <givaro/givpoly1.h>
+#include <givaro/givranditer.h>
+
+#ifndef __LINBOX_randiter_givaro_poly_H
+#define __LINBOX_randiter_givaro_poly_H
+
+namespace LinBox
+{
+	template<class Field>
+	class GivaroPolyRandIter {
+		typedef typename Field::Domain_t Domain;
+		typedef typename Domain::Domain_t SubDomain;
+		
+		Field _pd;
+		Givaro::GIV_randIter<SubDomain,integer> _randIter;
+		
+		integer _size;
+		integer _seed;
+	public:
+		typedef typename Field::Element Element;
+		
+		GivaroPolyRandIter(Field pd, 
+                                   const integer& size = 0,
+                                   const integer& seed = 0) :
+                        _randIter(Givaro::GIV_randIter<SubDomain,integer>(pd.subdomain(), size, seed))
+		{_pd = pd;}
+		
+		GivaroPolyRandIter(const GivaroPolyRandIter &R)
+			: _pd(R._pd), _randIter(R._randIter), _size(R._size), _seed(R._seed) {}
+		
+		GivaroPolyRandIter &operator=(const GivaroPolyRandIter &R) {
+			return *this;
+		}
+		
+		Element &random(Element &a)  {
+			return _pd.domain().random(_randIter, a);
+		}
+		
+		Element &random(Element &a, Givaro::Degree d)  {
+			return _pd.domain().random(_randIter, a, d);
+		}
+		
+		Element &random(Element &a, long s) const {
+			return _pd.domain().random(_randIter, a, s);
+		}
+	};
+}
+
+#endif // __LINBOX_randiter_givaro_poly_H
diff --git a/linbox/randiter/gmp-rational.h b/linbox/randiter/gmp-rational.h
index b854f9e..8eb02ce 100644
--- a/linbox/randiter/gmp-rational.h
+++ b/linbox/randiter/gmp-rational.h
@@ -64,7 +64,7 @@ namespace LinBox
 			_field (F), _size (size), _seed (seed)
 		{
 			if (seed == 0)
-				_seed = time (NULL);
+				_seed = uint32_t(time (NULL));
 		}
 
 
@@ -98,18 +98,19 @@ namespace LinBox
 		 */
 		Element &random (Element &a)  const
 		{
-			int value = 0;
 
 			if (_size == 0) {
-			unsigned int s;
+				unsigned int s;
 				s = _seed;
 
-				value = rand_r (&s);
+				//(rand_r is obsolete)
+				 srand (s);
+				 int value = rand();
 
 				mpz_set_si (mpq_numref (a.rep), value);
 
 				do {
-					value = rand_r (&s);
+					value = rand();
 				} while (value == 0);
 
 				const_cast<integer&>(_seed) = s;
@@ -120,7 +121,8 @@ namespace LinBox
 				int num, den;
 
 				s = _seed;
-				num = rand_r (&s);
+				srand (s);
+				num =  rand();
 
 				if (_size > 0) {
 					int tmp = (int)_size;
@@ -128,7 +130,8 @@ namespace LinBox
 					den = 1L;
 				}
 				else {
-					den = rand_r (&s);
+					srand (s);
+					den =  rand();
 				}
 
 				const_cast<integer&>(_seed) = s;
@@ -156,6 +159,10 @@ namespace LinBox
 			random (tmp);
 			return (a = ElementEnvelope <GMPRationalField> (tmp));
 		}
+        
+        const GMPRationalField& ring() const { return _field; }
+        
+                
 
 	private:
 
@@ -170,11 +177,10 @@ namespace LinBox
 #endif // __LINBOX_randiter_gmp_random_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/randiter/mersenne-twister.h b/linbox/randiter/mersenne-twister.h
index 8932fc0..4687176 100644
--- a/linbox/randiter/mersenne-twister.h
+++ b/linbox/randiter/mersenne-twister.h
@@ -42,7 +42,17 @@
 
 #include <vector>
 
-#include "linbox/integer.h"
+#ifdef __LINBOX_HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS
+// else ??
+#endif
+#include <stdint.h>
+#ifndef INT32_MAX
+#error "INT32_MAX is not defined. It should at least be defined in Givaro..."
+#endif
+#endif
+
 
 namespace LinBox
 {
@@ -83,7 +93,7 @@ namespace LinBox
 
 }
 
-#ifdef LinBoxSrcOnly
+#if defined(LinBoxSrcOnly) or defined(LinBoxTestOnly)
 #include "linbox/randiter/mersenne-twister.C"
 #endif
 #endif // __LINBOX_mersenne_twister_H
diff --git a/linbox/randiter/modular-balanced.h b/linbox/randiter/modular-balanced.h
index 9b2a1f0..860ea3b 100644
--- a/linbox/randiter/modular-balanced.h
+++ b/linbox/randiter/modular-balanced.h
@@ -63,8 +63,9 @@
 namespace LinBox
 {
 
-	template <class Element>
-	class ModularBalanced;
+#if 0
+	 template <class Element>
+	 class Givaro::ModularBalanced<Element>;
 
 	/** Random field base element generator.
 	 * This encapsulated class is a generator of random field base elements for
@@ -79,7 +80,7 @@ namespace LinBox
 	 * and also returned as a reference.
 	 */
 	template <class Element>
-	class ModularBalancedRandIter {
+	class Givaro::ModularBalancedRandIter {
 	public:
 
 		/** Constructor from field, sampling size, and seed.
@@ -95,7 +96,7 @@ namespace LinBox
 		 * @param seed constant integer reference from which to seed random number
 		 *             generator (default = 0)
 		 */
-		ModularBalancedRandIter (const ModularBalanced<Element> &F,
+		Givaro::ModularBalancedRandIter (const Givaro::ModularBalanced<Element> &F,
 					 const integer &size = 0,
 					 const integer &seed = 0) :
 			_field (F), _size (size), _seed (seed)
@@ -118,30 +119,31 @@ namespace LinBox
 		}
 
 		/** Copy constructor.
-		 * Constructs ModularBalancedRandIter object by copying the random field
+		 * Constructs Givaro::ModularBalancedRandIter object by copying the random field
 		 * element generator.
 		 * This is required to allow generator objects to be passed by value
 		 * into functions.
-		 * @param  R ModularBalancedRandIter object.
+		 * @param  R Givaro::ModularBalancedRandIter object.
 		 */
-		ModularBalancedRandIter (const ModularBalancedRandIter<Element> &R) :
+		Givaro::ModularBalancedRandIter (const Givaro::ModularBalancedRandIter<Element> &R) :
 			_field (R._field), _size (R._size), _seed (R._seed)
 		{}
 
 		/** Destructor.
 		 * This destructs the random field element generator object.
 		 */
-		~ModularBalancedRandIter () {}
+		~Givaro::ModularBalancedRandIter () {}
 
 		/** Assignment operator.
-		 * Assigns ModularBalancedRandIter object R to generator.
-		 * @param  R ModularBalancedRandIter object.
+		 * Assigns Givaro::ModularBalancedRandIter object R to generator.
+		 * @param  R Givaro::ModularBalancedRandIter object.
 		 */
-		ModularBalancedRandIter<Element> &operator=(const ModularBalancedRandIter<Element> &R)
+		Givaro::ModularBalancedRandIter<Element> &operator=(const Givaro::ModularBalancedRandIter<Element> &R)
 		{
 			if (this != &R) { // guard against self-assignment
 				_size = R._size;
 				_seed = R._seed;
+				_field = R._field;
 			}
 
 			return *this;
@@ -168,12 +170,12 @@ namespace LinBox
 			Element tmp;
 
 			random (tmp);
-			return (a = ElementEnvelope <ModularBalanced<Element> > (tmp));
+			return (a = ElementEnvelope <Givaro::ModularBalanced<Element> > (tmp));
 		}
 
 	private:
 		/// Field in which arithmetic is done
-		ModularBalanced<Element> _field;
+		Givaro::ModularBalanced<Element> _field;
 
 		/// Sampling size
 		integer _size;
@@ -181,8 +183,8 @@ namespace LinBox
 		/// Seed
 		long _seed;
 
-	}; // class ModularBalancedRandIter
-
+	}; // class Givaro::ModularBalancedRandIter
+#endif
 } // namespace LinBox
 
 #endif //__LINBOX_randiter_modular_balanced_H
diff --git a/linbox/randiter/modular-crooked.h b/linbox/randiter/modular-crooked.h
index 65f861d..bc06bf2 100644
--- a/linbox/randiter/modular-crooked.h
+++ b/linbox/randiter/modular-crooked.h
@@ -3,7 +3,7 @@
  * Copyright (C) 2010 LinBox
  *
  * Adapted from randiter/modular-dense.h
- * by Brice Boyer <brice.boyer at imag.fr>
+ * by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  *
  *
  * ========LICENCE========
@@ -122,6 +122,7 @@ namespace LinBox
 			if (this != &R) { // guard against self-assignment
 				_size = R._size;
 				_seed = R._seed;
+				_field = R._field;
 			}
 
 			return *this;
diff --git a/linbox/randiter/modular.h b/linbox/randiter/modular.h
deleted file mode 100644
index 2f67e47..0000000
--- a/linbox/randiter/modular.h
+++ /dev/null
@@ -1,393 +0,0 @@
-/* linbox/randiter/modular.h
- * Copyright (C) 1999-2005 William J Turner,
- *               2002 Bradford Hovinen
- *
- * Written by William J Turner <wjturner at acm.org>,
- *            Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * ------------------------------------
- * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * Changed LargeModularRandIter to ModularRandIter, parameterized on the
- * element type. This change is for compatibility with the changes in
- * field/modular.h
- *
- * Renamed from large-modular.h to modular.h
- * ------------------------------------
- * 2002-05-14 William J. Turner <wjturner at acm.org>
- *
- * Seeded random number generator in constructor.  _seed was never used
- * before.
- * ------------------------------------
- * 2005-06-24 William J. Turner <wjturner at acm.org>
- *
- * Removed using declarations.
- * ------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_randiter_modular_H
-#define __LINBOX_randiter_modular_H
-
-#include <iostream>
-#include <vector>
-#include <cstdlib>
-
-#include "time.h"
-#include "linbox/integer.h"
-#include "linbox/field/modular.h"
-#include "linbox/element/abstract.h"
-#include "linbox/element/envelope.h"
-#include "linbox/util/commentator.h"
-#include "linbox/randiter/mersenne-twister.h"
-#include "linbox/linbox-config.h"
-
-namespace LinBox
-{
-
-	/** Random field base element generator.
-	 * This encapsulated class is a generator of random field base elements for
-	 * the encapsulating field.
-	 * It is required to contain constructors from a field object and
-	 * two integers.  The first integer being a cardinality of a set to
-	 * draw the random elements from, and the second being a seed for the
-	 * random number generator.
-	 * It is also required to contain a copy constructor, a destructor, and
-	 * an operator () which acts on a reference to a field base element.  In this
-	 * operator (), the random element is placed into the input field base element
-	 * and also returned as a reference.
-	 */
-	template <class Element>
-	class ModularRandIter {
-	public:
-
-		/** Constructor from field, sampling size, and seed.
-		 * The random field element iterator works in the field F, is seeded
-		 * by seed, and it returns any one element with probability no more
-		 * than <code>1/min (size, F.cardinality (c))</code>.
-		 * A sampling size of zero means to sample from the entire field.
-		 * A seed of zero means to use some arbitrary seed for the generator.
-		 * Purely virtual.
-		 * @param F LinBox field archetype object in which to do arithmetic
-		 * @param size constant integer reference of sample size from which to
-		 *             sample (default = modulus of field)
-		 * @param seed constant integer reference from which to seed random number
-		 *             generator (default is 0 and new seed is generated)
-		 */
-		ModularRandIter (const Modular<Element> &F,
-				 const integer &size = 0,
-				 const integer &seed = 0) :
-			_field (F), _size (size), _seed (seed)
-		{
-			if (_seed == 0) _seed = time (NULL);
-
-			integer cardinality;
-
-			F.cardinality (cardinality);
-
-			if ((_size == 0) || (_size > cardinality))
-				_size = cardinality;
-
-			/*commentator().report (10, INTERNAL_DESCRIPTION)
-			<< "Created random generator with size " << _size
-			<< " and seed " << _seed << std::endl;
-			*/
-
-			// Seed random number generator
-			srandom ((unsigned)_seed);
-		}
-
-		/** Copy constructor.
-		 * Constructs ModularRandIter object by copying the random field
-		 * element generator.
-		 * This is required to allow generator objects to be passed by value
-		 * into functions.
-		 * @param  R ModularRandIter object.
-		 */
-		ModularRandIter (const ModularRandIter<Element> &R) :
-			_field (R._field), _size (R._size), _seed (R._seed)
-		{}
-
-		/** Destructor.
-		 * This destructs the random field element generator object.
-		 */
-		~ModularRandIter () {}
-
-		/** Assignment operator.
-		 * Assigns ModularRandIter object R to generator.
-		 * @param  R ModularRandIter object.
-		 */
-		ModularRandIter<Element> &operator=(const ModularRandIter<Element> &R)
-		{
-			if (this != &R) { // guard against self-assignment
-				_size = R._size;
-				_seed = R._seed;
-			}
-
-			return *this;
-		}
-
-		/** Random field element creator.
-		 * This returns a random field element from the information supplied
-		 * at the creation of the generator.
-		 * Required by abstract base class.
-		 * @return reference to random field element
-		 */
-		Element &random (Element &a) const
-		{
-			return _field.init(a, ::random()); // need init from long int
-		}
-
-		/** Random field element creator.
-		 * This returns a random field element from the information supplied
-		 * at the creation of the generator.
-		 * Required by abstract base class.
-		 * @return reference to random field element
-		 */
-		Element &nonzerorandom (Element &a) const
-		{
-			//return a = random() % (_field.modulus -1) + 1;
-
-			// CPernet: stupidly slow, but now way to get _field.modulus without changing the interface
-			while (_field.isZero (random(a))) ;
-			return a;
-		}
-
-		/** Random field element creator.
-		 * This returns a random field element from the information supplied
-		 * at the creation of the generator.
-		 * Required by abstract base class.
-		 * @return reference to random field element
-		 */
-		ElementAbstract &random (ElementAbstract &a) const
-		{
-			Element tmp;
-
-			random (tmp);
-			return (a = ElementEnvelope <Modular<Element> > (tmp));
-		}
-
-	private:
-
-		/// Field in which arithmetic is done
-		Modular<Element> _field;
-
-		/// Sampling size
-		integer _size;
-
-		/// Seed
-		long _seed;
-
-	}; // class ModularRandIter
-
-	template <class Element>
-	class ModularBase<Element>::RandIter {
-		ModularRandIter<Element> _r;
-
-	public:
-		RandIter (const Modular<Element> &F, const integer &size = 0, const integer &seed = 0) :
-			_r (F, size, seed)
-		{}
-		RandIter (const ModularBase<Element>::RandIter &r) :
-			_r (r._r)
-		{}
-
-		~RandIter () {}
-		RandIter &operator= (const RandIter &r)
-		{
-			_r = r._r;
-			return *this;
-		}
-		Element &random (Element &a) const
-		{
-			return _r.random (a);
-		}
-		ElementAbstract &random (ElementAbstract &a) const
-		{
-			return _r.random (a);
-		}
-
-	};
-
-	template <>
-	class ModularBase<uint16_t>::RandIter {
-		MersenneTwister _r;
-		uint16_t _size;
-		time_t _seed;
-
-	public:
-		typedef uint16_t Element;
-
-		RandIter (const Modular<Element> &F, const integer &size = 0, const integer &seed = 0)
-		{
-			_seed = seed;
-			_size = size;
-
-			if (_seed == 0) _seed = time (NULL);
-
-			integer c;
-
-			F.cardinality (c);
-
-			linbox_check (c != -1);
-
-			if ((_size == 0) || (_size > double (c)))
-				_size = c;
-
-			_r.setSeed ((uint32_t)_seed);
-		}
-
-		RandIter (const ModularBase<Element>::RandIter &r) :
-			_r (r._r), _size (r._size), _seed (r._seed)
-		{}
-
-		~RandIter () {}
-		RandIter &operator= (const RandIter &r)
-		{
-			_r = r._r;
-			return *this;
-	       	}
-		Element &random (Element &a) const
-		{
-			return a = (Element)_r.randomIntRange (0, _size);
-		}
-		ElementAbstract &random (ElementAbstract &a)  const
-		{
-			return a = ElementEnvelope <Modular<Element> >
-			((Element)_r.randomIntRange (0, _size));
-		}
-
-	};
-
-	template <>
-	class ModularBase<uint32_t>::RandIter {
-		MersenneTwister _r;
-		uint32_t _size;
-		time_t _seed;
-
-	public:
-		typedef uint32_t Element;
-
-		RandIter (const Modular<Element> &F, const integer &size = 0, const integer &seed = 0)
-		{
-			_seed = seed;
-			_size = size;
-
-			if (_seed == 0) _seed = time (NULL);
-
-			integer c;
-
-			F.cardinality (c);
-
-			linbox_check (c != -1);
-
-			if ((_size == 0) || (_size > double (c)))
-				_size = c;
-
-			_r.setSeed ((uint32_t)_seed);
-		}
-
-		RandIter (const ModularBase<Element>::RandIter &r) :
-			_r (r._r), _size (r._size), _seed (r._seed)
-		{}
-
-		~RandIter () {}
-		RandIter &operator= (const RandIter &r)
-		{
-			_r = r._r;
-			return *this;
-		}
-		Element &random (Element &a) const
-		{
-			return a = _r.randomIntRange (0, _size);
-		}
-		ElementAbstract &random (ElementAbstract &a) const
-		{
-			return a = ElementEnvelope <Modular<Element> >
-			(_r.randomIntRange (0, _size));
-		}
-
-	};
-
-	template <>
-	class ModularBase<uint64_t>::RandIter {
-		MersenneTwister _r;
-		uint64_t _size;
-		time_t _seed;
-
-	public:
-		typedef uint64_t Element;
-
-		RandIter (const Modular<Element> &F, const integer &size = 0, const integer &seed = 0)
-		{
-			_seed = seed;
-			_size = size;
-
-			if (_seed == 0) _seed = time (NULL);
-
-			integer c;
-
-			F.cardinality (c);
-
-			linbox_check (c != -1);
-
-			if ((_size == 0) || (_size > double (c)))
-				_size = c;
-
-			_r.setSeed ((uint32_t)_seed);
-		}
-
-		RandIter (const ModularBase<Element>::RandIter &r) :
-			_r (r._r), _size (r._size), _seed (r._seed)
-		{}
-
-		~RandIter () {}
-		RandIter &operator= (const RandIter &r)
-		{
-			_r = r._r;
-			return *this;
-		}
-		Element &random (Element &a) const
-		{
-			return a = (Element)_r.randomIntRange (0, (uint32_t)_size);
-		}
-		ElementAbstract &random (ElementAbstract &a) const
-		{
-			return a = ElementEnvelope <Modular<Element> >
-			((Element)_r.randomIntRange (0, (uint32_t)_size));
-		}
-
-	};
-
-}// namespace LinBox
-
-#endif // __LINBOX_randiter_modular_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/randiter/multimod-randomprime.h b/linbox/randiter/multimod-randomprime.h
index 62cb6b1..af17ffb 100644
--- a/linbox/randiter/multimod-randomprime.h
+++ b/linbox/randiter/multimod-randomprime.h
@@ -5,20 +5,20 @@
  *
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -40,22 +40,22 @@ namespace LinBox
 	class MultiModRandomPrime {
 	protected:
 
-		size_t   _bits;
+		uint64_t   _bits;
 		size_t   _size;
 		integer _shift;
 
 	public:
 
 
-		MultiModRandomPrime(size_t n=1, size_t bits = 30, unsigned long seed = 0) :
+		MultiModRandomPrime(size_t n=1, uint64_t bits = 30, unsigned long seed = 0) :
 			_bits(bits), _size(n)
 		{
 			_shift = integer(1)<<_bits;
 
 			if (! seed)
-				MultiModRandomPrime::setSeed( (unsigned long) BaseTimer::seed() );
+				setSeed( (unsigned long) BaseTimer::seed() );
 			else
-				MultiModRandomPrime::setSeed( seed );
+				setSeed( seed );
 		}
 
 		// define the prime type
@@ -68,12 +68,13 @@ namespace LinBox
 		{
 			std::cout<<"ist used\n";
 			std::vector<integer> tmp(_size);
+			Givaro::IntPrimeDom IPD;
 			for (size_t i=0;i<_size; ++i){
 				do {
 					integer::random(tmp[i],_bits-1);
 					tmp[i]= _shift-tmp[i];
-					nextprime(tmp[i],tmp[i]);
-				}
+					IPD.nextprimein(tmp[i]);
+			}
 				while (std::find(tmp.begin(), tmp.begin()+(long)i, tmp[i]) != (tmp.begin()+(long)i ));
 			}
 			return tmp;
@@ -84,12 +85,13 @@ namespace LinBox
 		 */
 		inline Prime_Type randomPrime (Prime_Type& p) const
 		{
+			Givaro::IntPrimeDom IPD;
 			for (size_t i=0;i<p.size(); ++i){
 				do {
 					integer::random(p[i],_bits-1);
 					p[i]= _shift-p[i];
-					nextprime(p[i],p[i]);
-				}
+					IPD.nextprimein(p[i]);
+			}
 				while (std::find(p.begin(), p.begin()+(long)(i-1), p[i]) != (p.begin()+(long)(i-1) ));
 			}
 			return p;
@@ -109,9 +111,9 @@ namespace LinBox
 		{
 			Prime_Type tmp;
 			integer acc=1, cur=maxPrime;
-
+			Givaro::IntPrimeDom IPD;
 			do {
-				prevprime(cur, cur);
+				IPD.prevprimein(cur);
 				tmp.push_back(cur);
 				acc*=cur;
 			} while (acc < productBound);
diff --git a/linbox/randiter/nonzero.h b/linbox/randiter/nonzero.h
deleted file mode 100644
index ed122c5..0000000
--- a/linbox/randiter/nonzero.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/* linbox/randiter/nonzero.h
- * Copyright (C) 2001-2002 Bradford Hovinen
- *
- * Written by William J Turner <wjturner at math.ncsu.edu>,
- *            Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * ------------------------------------
- *
- * 
- * ========LICENCE========
- * This file is part of the library LinBox.
- * 
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This 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
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_randiter_nonzero_H
-#define __LINBOX_randiter_nonzero_H
-
-#include "linbox/field/archetype.h"
-#include "linbox/randiter/archetype.h"
-#include "linbox/element/archetype.h"
-#include "linbox/element/abstract.h"
-#include "linbox/element/envelope.h"
-#include "linbox/linbox-config.h"
-
-#include <sys/time.h>
-#include <stdlib.h>
-
-namespace LinBox
-{
-	/** Random iterator for nonzero random numbers
-	 *
-	 * Wraps around an existing random iterator and ensures that the output
-	 * is entirely nonzero numbers.
-	 **/
-	template <class Field, class RandIter = typename Field::RandIter>
-	class NonzeroRandIter {
-	public:
-
-		typedef typename Field::Element Element;
-
-		NonzeroRandIter (const Field &F, const RandIter &r) :
-			_field (F), _r (r)
-		{}
-
-		NonzeroRandIter (const NonzeroRandIter& R) :
-			_field (R._field), _r (R._r)
-		{}
-
-		~NonzeroRandIter()
-		{}
-
-		NonzeroRandIter& operator=(const NonzeroRandIter& R)
-		{
-			if (this != &R) { // guard against self-assignment
-				_field = R._field;
-				_r = R._r;
-			}
-
-			return *this;
-		}
-
-		template<class Elt>
-		Elt &random (Elt &a)  const
-		{
-			do _r.random (a); while (_field.isZero (a));
-			return a;
-		}
-
-		/** Random field element creator.
-		 * This returns a random field element from the information supplied
-		 * at the creation of the generator.
-		 * Required by abstract base class.
-		 * @return reference to random field element
-		 */
-		ElementAbstract &random (ElementAbstract &a)  const
-		{
-			Element tmp;
-
-			random (tmp);
-			return (a = ElementEnvelope <Field> (tmp));
-		}
-
-	private:
-
-		Field    _field;
-		RandIter _r;
-
-	}; // class NonzeroRandIter
-
-} // namespace LinBox
-
-#endif // __LINBOX_randiter_nonzero_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/randiter/ntl-ZZ.h b/linbox/randiter/ntl-zz.h
similarity index 100%
rename from linbox/randiter/ntl-ZZ.h
rename to linbox/randiter/ntl-zz.h
diff --git a/linbox/randiter/param-fuzzy.h b/linbox/randiter/param-fuzzy.h
index d1e0895..d79841d 100644
--- a/linbox/randiter/param-fuzzy.h
+++ b/linbox/randiter/param-fuzzy.h
@@ -50,10 +50,10 @@ namespace LinBox
 		ParamFuzzyRandIter (/*const ParamFuzzy &F, */
 				   const integer &size = 0,
 				   const integer &seed = 0) :
-		       	/*_field (F),*/ _size (size), _seed (seed)
+		       	_field (ParamFuzzy()), _size (size), _seed (seed)
 		{
 			/*if (_size == 0) F.cardinality (_size);*/
-			if (_seed == 0) _seed = time (NULL);
+			if (_seed == 0) _seed = (int64_t)time (NULL);
 		}
 
 		ParamFuzzyRandIter (const ParamFuzzy &F,
@@ -62,11 +62,11 @@ namespace LinBox
 		       	_field (F), _size (size), _seed (seed)
 		{
 			if (_size == 0) F.cardinality (_size);
-			if (_seed == 0) _seed = time (NULL);
+			if (_seed == 0) _seed = (int64_t)time (NULL);
 		}
 
 		ParamFuzzyRandIter (const ParamFuzzyRandIter &R) :
-		       	/*_field (R._field),*/ _size (R._size), _seed (R._seed)
+		       	_field (R._field), _size (R._size), _seed (R._seed)
 		{}
 
 		~ParamFuzzyRandIter () {}
@@ -76,6 +76,7 @@ namespace LinBox
 			if (this != &R) { // guard against self-assignment
 				_size = R._size;
 				_seed = R._seed;
+				_field = R._field;
 			}
 
 			return *this;
@@ -98,6 +99,8 @@ namespace LinBox
 			return (a = ElementEnvelope <ParamFuzzy> (tmp));
 		}
 
+        const ParamFuzzy& ring() { return _field; }
+
 	    private:
 
 		/// Field in which arithmetic is done
@@ -116,11 +119,10 @@ namespace LinBox
 #endif // __LINBOX_randiter_param_fuzzy_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/randiter/random-fftprime.h b/linbox/randiter/random-fftprime.h
index d3b60d0..bd4bb18 100644
--- a/linbox/randiter/random-fftprime.h
+++ b/linbox/randiter/random-fftprime.h
@@ -25,8 +25,9 @@
 
 #ifndef __LINBOX_random_fftprime_H
 #define __LINBOX_random_fftprime_H
-
+#include <vector>
 #include "linbox/integer.h"
+#include "linbox/util/debug.h"
 #include "linbox/util/timer.h"
 
 namespace LinBox
@@ -34,11 +35,14 @@ namespace LinBox
 
 	class RandomFFTPrime {
 	public:
-
-		int         _bits;
-
-		RandomFFTPrime(int bits = 20, unsigned long seed = 0) :
-			_bits(bits)
+                // define the prime type
+		typedef integer Prime_Type;
+                
+		uint64_t           _bits;
+                Prime_Type  _prime_bound;
+                
+		RandomFFTPrime(Prime_Type pbound=0x100000, unsigned long seed = 0) :
+			_bits(pbound.bitsize()), _prime_bound(pbound)
 		{
 			if (! seed)
 				RandomFFTPrime::setSeed( (unsigned long)BaseTimer::seed() );
@@ -46,46 +50,68 @@ namespace LinBox
 				RandomFFTPrime::setSeed( seed );
 		}
 
-		// define the prime type
-		typedef integer Prime_Type;
+		
+                 /** @brief randomPrime(size_t b)
+		 *  return a random FFT prime with a 2-valuation larger than b in its order
+                 *  the randomness is on the FFT primes lying in the given range
+                 *  an error is thrown if no such prime exist
+		 */
+		inline Prime_Type randomPrime (size_t b) const
+		{
+                        integer tmp;
+                        randomPrime(tmp,b);
+			return tmp;
+                }
 
-		/** @brief randomPrime()
-		 *  return a random prime
+                /** @brief randomPrime(Prime_Type& p, size_t b)
+		 *  return a random FFT prime with a 2-valuation larger than b in its order
+                 *  the randomness is on the FFT primes lying in the given range
+                 *  an error is thrown if no such prime exist
 		 */
-		inline Prime_Type randomPrime() const
+		inline Prime_Type randomPrime (Prime_Type& t, uint64_t b) const
 		{
-			integer tmp;
-			size_t cbits=5;
+                        linbox_check(b<_bits);
 			size_t tresh;
 			do {
+                                size_t cbits= (size_t)rand() %(_bits-b);
 				tresh = 1<<(cbits);
-				size_t p = 1<<((size_t)_bits-cbits);
+				uint64_t p = 1<<((size_t)_bits-cbits);
 				do {
-					integer::random(tmp,cbits);
-					tmp = tmp*p+1;
+					integer::random(t,cbits);
+					t = t*integer(p)+1;
 					tresh--;
-				} while (( Givaro::probab_prime(tmp)<2) && (tresh));
-				cbits++;
+				} while (!Givaro::Protected::probab_prime(t,25) && (tresh));
 			}
 			while(tresh==0);
+                        linbox_check(Givaro::Protected::probab_prime(t,25))
+			return t;
+		}
+
+		/** @brief generatePrime()
+		 *  return a FFT prime with the largest 2-valuation in its order
+		 */
+		inline Prime_Type generatePrime() const
+		{
+			integer tmp;
+                        generatePrime(tmp);
 			return tmp;
 		}
 
-		/** @brief randomPrime(Prime_Type& p)
-		 *  return a random prime
+		/** @brief generatePrime(Prime_Type& p)
+		 *  return a FFT prime with the largest 2-valuation in its order
 		 */
-		inline Prime_Type randomPrime (Prime_Type& t) const
+		inline Prime_Type generatePrime (Prime_Type& t) const
 		{
-			size_t cbits=5;
+			size_t cbits=1;
 			size_t tresh;
 			do {
 				tresh = 1<<(cbits);
-				size_t p = 1<<((size_t)_bits-cbits);
+				uint64_t p = 1<<((size_t)_bits-cbits);
 				do {
 					integer::random(t,cbits);
-					t = t*p+1;
+					t = t*integer(p)+1;
 					tresh--;
-				} while (!Givaro::probab_prime(t) && (tresh));
+				} while (!Givaro::Protected::probab_prime(t,25) && (tresh));
 				cbits++;
 			}
 			while(tresh==0);
@@ -93,6 +119,98 @@ namespace LinBox
 			return t;
 		}
 
+                // generate a vector of distinct FFT primes with largest 2-valuation
+                // s.t. their product is larger than a given bound
+                inline std::vector<Prime_Type> generatePrimes (const Prime_Type & bound) const {
+                        std::vector<Prime_Type> primes;
+                        Prime_Type prod=1;
+                        integer tmp;
+                        for (int64_t b = _bits - 1; b >= 0; b--)
+                                for (int64_t l = ((int64_t)1 << (_bits - b - 1)) + 1; l < (1L << (_bits - b)); l +=2) {
+                                        tmp = ((int64_t)1 << b) * l + 1;
+                                        if (Givaro::Protected::probab_prime(tmp, 25) >= 1) {
+                                                primes.push_back(tmp);
+                                                prod*=tmp;
+                                                if (prod > bound)
+                                                        return primes;
+                                        }
+                                }
+                        linbox_check(prod > bound ); // Could not find enough primes
+                        return primes;
+                }
+
+                  // generate a vector of distinct FFT primes with largest 2-valuation
+                // s.t. their product is larger than a given bound
+                inline bool generatePrimes (const Prime_Type & bound, std::vector<Prime_Type> &primes) const {
+                        primes.clear();
+                        Prime_Type prod=1;
+                        integer tmp;
+                        for (int64_t b = (int64_t)_bits - 1; b >= 0; b--)
+                                for (int64_t l = (1L << ((int64_t)_bits - b - 1)) + 1; l < (1L << ((int64_t)_bits - b)); l +=2) {
+                                        tmp = (1L << b) * l + 1;
+                                        if (Givaro::Protected::probab_prime(tmp, 25) >= 1) {
+                                                primes.push_back(tmp);
+                                                prod*=tmp;
+                                                if (prod > bound){
+                                                        return true;
+                                                }
+                                        }
+                                }
+                        return false; // false -> Could not find enough primes
+                }
+
+                size_t twoVal(integer t) const {
+                        integer x=t;
+                        size_t v=0;
+                        while(x%2 == 0) {v++;x/=2;}
+                        return v;
+                }
+
+                // generate a vector of distinct FFT primes with  2-valuation largest than val
+                // s.t. their product is larger than a given bound
+                inline bool generatePrimes ( uint64_t val, const Prime_Type & bound, std::vector<Prime_Type> &primes) const {
+                        primes.clear();
+                        Prime_Type prod=1;
+                        integer tmp;
+                        // std::cout<<"rns bound: "<<bound<<std::endl;
+                        // std::cout<<"2 valuation: "<<val<<std::endl;
+                        // std::cout<<"prime bitmax: "<<_bits<<std::endl;
+                        // std::cout<<"prime max: "<<_prime_bound<<std::endl;
+
+                        if (val > _bits) return false;
+
+#if 0
+                        for (int64_t b = (int64_t)_bits; b >= (int64_t)val; b--)
+                                // for (uint64_t l = (1ULL << ((int64_t)_bits - b - 1)) + 1; l < (1ULL << ((int64_t)_bits - b)); l +=2) {
+                                for (int64_t l = ((int64_t)1 << ((int64_t)_bits - b)) - 1; l >=1; l -=2) {
+                                        tmp = ((int64_t)1 << b) * l + 1;                                        
+                                        if (Givaro::Protected::probab_prime(tmp, 25) >= 1) {
+                                                primes.push_back(tmp);
+                                                prod*=tmp;
+                                                //std::cout<<tmp<<" -> "<<tmp.bitsize()<<" (order="<<twoVal(tmp-1)<<") "<<prod<<std::endl;
+                                                if (prod > bound){
+                                                        return true;
+                                                }
+                                        }
+                                }
+#else
+                        for (int64_t l = (_prime_bound -1) >>val ; l >=1; l -=1) {
+                                tmp = ((int64_t)1 << val) * l + 1;                                        
+                                if (Givaro::Protected::probab_prime(tmp, 25) >= 1) {
+                                        primes.push_back(tmp);
+                                        prod*=tmp;
+                                        //std::cout<<tmp<<" -> "<<tmp.bitsize()<<" (order="<<twoVal(tmp-1)<<") "<<prod<<std::endl;
+                                        if (prod > bound){
+                                                return true;
+                                        }
+                                }
+                        }
+                                
+                        
+#endif
+                        return false; // false -> Could not find enough primes
+                }
+
 		/** @brief setSeed (unsigned long ul)
 		 *  Set the random seed to be ul.
 		 */
@@ -100,8 +218,6 @@ namespace LinBox
 		{
 			integer::seeding(ul);
 		}
-
-
 	};
 }
 
diff --git a/linbox/randiter/random-integer.h b/linbox/randiter/random-integer.h
deleted file mode 100644
index e10fb96..0000000
--- a/linbox/randiter/random-integer.h
+++ /dev/null
@@ -1,205 +0,0 @@
-/* Copyright (C) 2010 LinBox
- * Written by <brice.boyer at imag.fr>
- * (adapted form random-prime.h)
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*! @file randiter/random-integer.h
- * @ingroup randiter
- * @ingroup integer
- * @brief Generates random \ref integers.
- */
-
-#ifndef __LINBOX_random_integer_iterator_H
-#define __LINBOX_random_integer_iterator_H
-
-#include "linbox/integer.h"
-#include "linbox/util/timer.h"
-#include "linbox/util/debug.h"
-
-namespace LinBox
-{
-
-	/*!@brief Random Prime Generator.
-	 * @ingroup integers
-	 * @ingroup randiter
-	 *
-	 * Generates integers of specified length.
-	 * @tparam _Unsigned if \c true, then only non negative integers
-	 * are generated, if \c false, their sign is random.
-	 */
-	template<bool _Unsigned=true>
-	class RandomIntegerIterator {
-
-		unsigned int    _bits;  //!< common lenght of all integers
-		integer      _integer;  //!< the generated integer.
-
-	public:
-		/*! Constructor.
-		 * @param bits size of integers (in bits)
-		 * @param seed if \c 0 a seed will be generated, otherwise, the
-		 * provided seed will be use.
-		 */
-		RandomIntegerIterator(unsigned int bits = 30, unsigned long seed = 0) :
-			_bits(bits)
-		{
-			linbox_check(bits>1);
-			if (! seed)
-				RandomIntegerIterator::setSeed( BaseTimer::seed() );
-			else
-				RandomIntegerIterator::setSeed( seed );
-
-			integer::random_exact<_Unsigned>(_integer,_bits);
-		}
-
-		typedef integer Integer_Type ;
-
-		/** @brief operator++()
-		 *  creates a new random integer.
-		 */
-		inline RandomIntegerIterator &operator ++ ()
-		{
-			integer::random_exact<_Unsigned>(_integer,_bits);
-			return *this;
-		}
-
-		/** @brief get the random integer.
-		 *  returns the actual integer.
-		 */
-		const Integer_Type &operator *  () const
-		{
-			return _integer;
-		}
-
-		/** @brief get the random integer.
-		 *  returns the actual integer.
-		 *  @warning a new integer is not generated.
-		 */
-		const Integer_Type & randomInteger() const
-		{
-			return _integer;
-		}
-
-		/** @brief Sets the seed.
-		 *  Set the random seed to be \p ul.
-		 *  @param ul the new seed.
-		 */
-		void static setSeed(unsigned long ul)
-		{
-			integer::seeding(ul);
-		}
-
-
-	};
-
-	/*! @brief Random Integer Iterator.
-	 * @ingroup integers
-	 * @ingroup randiter
-	 *
-	 * Generates integers of size smaller than a prescribed one.
-	 * This class is closer to the LinBox::RandIterArchetype.
-	 * @todo
-	 * one could create the same one on a LinBox::PID_double ?
-	 * @tparam _Unsigned if \c true, then only non negative integers
-	 * are generated, if \c false, their sign is random.
-	 */
-	template<bool _Unsigned=true>
-	class RandomIntegerIter {
-
-		unsigned int 	_bits;  //!< max length for all integers
-		integer         _seed;  //!< the generated integer.
-
-	public:
-		/*! Constructor.
-		 * @param bits max size of integers (in bits)
-		 * @param seed if \c 0 a seed will be generated, otherwise, the
-		 * provided seed will be use.
-		 */
-		RandomIntegerIter(unsigned int bits = 30, unsigned long seed = 0) :
-			_bits(bits)
-		{
-			linbox_check(bits>1);
-			if (! seed)
-				_seed = BaseTimer::seed() ;
-			else
-				_seed = seed ;
-
-			integer::seeding(_seed);
-		}
-
-		/// destructor.
-		~RandomIntegerIter() {}
-
-		/// copy constructor.
-		/// @param R random iterator to be copied.
-		RandomIntegerIter (const RandomIntegerIter &R) :
-			_bits(R._bits), _seed(R._seed)
-		{}
-
-		typedef integer Element ;
-
-		/// copy.
-		/// @param R random iterator to be copied.
-		RandomIntegerIter &operator=(const RandomIntegerIter &R)
-		{
-			if (this != &R) {
-				_bits = R._bits;
-				_seed = R._seed;
-			}
-			return *this;
-		}
-
-		/** @brief get the random integer.
-		 * @param[out] a the new integer number
-		 */
-		const integer & random (integer & a) const
-		{
-			integer::random_lessthan<_Unsigned>(a,_bits);
-
-			return a;
-		}
-
-		void setBits (unsigned int  bits)
-		{
-			_bits = bits;
-		}
-
-		unsigned int getBits () const
-		{
-			return _bits ;
-		}
-
-	};
-
-}
-
-#endif //__LINBOX_random_integer_iterator_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/randiter/random-prime.h b/linbox/randiter/random-prime.h
index 62534d4..fec86da 100644
--- a/linbox/randiter/random-prime.h
+++ b/linbox/randiter/random-prime.h
@@ -1,6 +1,6 @@
 /* Copyright (C) 2007,2010 LinBox
  * Written by <Jean-Guillaume.Dumas at imag.fr>
- * Modified by <brice.boyer at imag.fr> (RandomPrimeIter)
+ * Modified by Brice Boyer (briceboyer) <boyer.brice at gmail.com> (RandomPrimeIter)
  *
  *
  *
@@ -30,10 +30,13 @@
 
 #ifndef __LINBOX_random_prime_iterator_H
 #define __LINBOX_random_prime_iterator_H
-#include "linbox/integer.h"
+
+
+#include <givaro/givinteger.h>
+#include <givaro/givintprime.h>
 #include "linbox/util/timer.h"
 #include "linbox/util/debug.h"
-#include <cstdlib> // drand48, temporary
+#include "linbox/field/field-traits.h"
 
 namespace LinBox
 {
@@ -50,30 +53,32 @@ namespace LinBox
 	 */
 	//template<class Prime_Type = integer>
 	class RandomPrimeIterator {
+	private:
 
-		unsigned int 	_bits;  //!< common lenght of all primes
+		uint64_t 	_bits;  //!< common lenght of all primes
 		integer        _shift;  //!< @internal used to set proper bit size
 		integer        _prime;  //!< the generated prime.
+		Givaro::IntPrimeDom _IPD; //!< empty struct dealing with primality.
 
 	public:
 		/*! Constructor.
-		 * @param bits size of primes (in bits). Default is 30 so it
+		 * @param bits size of primes (in bits). Default is 27 so it
 		 * can fit in a <code>Linbox::Modular<double></code>.
 		 * @param seed if \c 0 a seed will be generated, otherwise, the
 		 * provided seed will be use.
 		 */
-		RandomPrimeIterator(unsigned int bits = 30, unsigned long seed = 0) :
+		RandomPrimeIterator(uint64_t bits = 27, uint64_t seed = 0) :
 			_bits(bits), _shift(integer(1)<<_bits)
 		{
 			linbox_check(bits >1);
 			if (! seed)
-				RandomPrimeIterator::setSeed( BaseTimer::seed() );
+				setSeed( BaseTimer::seed() );
 			else
-				RandomPrimeIterator::setSeed( seed );
+				setSeed( seed );
 
 			integer::random(_prime,_bits-1);
 			_prime = _shift - _prime;
-			nextprime( _prime, _prime);
+			_IPD.nextprimein(_prime);
 		}
 
 		typedef integer Prime_Type ;
@@ -85,7 +90,7 @@ namespace LinBox
 		{
 			integer::random(_prime,_bits-1);
 			_prime = _shift - _prime;
-			nextprime( _prime, _prime);
+			_IPD.nextprimein(_prime);
 			return *this;
 		}
 
@@ -110,14 +115,58 @@ namespace LinBox
 		 *  Set the random seed to be \p ul.
 		 *  @param ul the new seed.
 		 */
-		void static setSeed(unsigned long ul)
+		void static setSeed(uint64_t ul)
 		{
 			integer::seeding(ul);
 		}
 
+		void setBits(uint64_t bits) {
+			_bits = bits;
+			_shift=(integer(1)<<_bits);
+
+			linbox_check(bits >1);
+
+			integer::random(_prime,_bits-1);
+			_prime = _shift - _prime;
+			_IPD.nextprimein(_prime);
+
+		}
+
+		template<class _ModField>
+		void setBitsField()
+		{
+			// std::cout << _bits << std::endl;
+			integer k = FieldTraits<_ModField >::maxModulus();
+			// std::cout << k << std::endl;
+			uint64_t bits = (uint64_t)(k.bitsize());
+			if (!bits)
+				throw("weird");
+			--bits;
+			// std::cout << bits << std::endl;
+			if (bits < _bits)
+				setBits(bits);
+			// std::cout << _bits << std::endl;
+		}
+
+		template<class _ModField>
+		bool setBitsDelayedField(size_t n)
+		{
+			integer k = FieldTraits<_ModField >::maxModulus();
+			int bits = (int)(k.bitsize());
+	//std::cout << "maxmodbits: " << bits << std::endl;
+			if (!bits) throw("weird");
+			--bits;
+			bits -= (int)((log((double)n)/2./M_LN2));
+	//std::cout << "delcorrect: " << bits << std::endl;
+			if (bits < 0) return false;
+			if (bits < (int64_t)_bits) setBits((uint64_t)bits);
+			return true;
+		}
+
 
 	};
 
+
 	/*! @brief Random Prime Iterator.
 	 * @ingroup primes
 	 * @ingroup randiter
@@ -129,8 +178,10 @@ namespace LinBox
 	 */
 	class RandomPrimeIter {
 
-		unsigned int 	_bits;  //!< max length for all primes
+		uint64_t 	_bits;  //!< max length for all primes
 		integer         _seed;  //!< the generated prime.
+		Givaro::GivRandom _generator;
+		Givaro::IntPrimeDom _IPD;
 
 	public:
 		/*! Constructor.
@@ -139,12 +190,12 @@ namespace LinBox
 		 * @param seed if \c 0 a seed will be generated, otherwise, the
 		 * provided seed will be use.
 		 */
-		RandomPrimeIter(unsigned int bits = 30, unsigned long seed = 0) :
-			_bits(bits)
+		RandomPrimeIter(uint64_t bits = 30, uint64_t seed = 0) :
+			_bits(bits), _generator(seed)
 		{
 			linbox_check(bits >1);
 			if (! seed)
-				_seed = BaseTimer::seed() ;
+				seed = BaseTimer::seed() ;
 			else
 				_seed = seed ;
 
@@ -159,7 +210,7 @@ namespace LinBox
 		/// copy constructor.
 		/// @param R random iterator to be copied.
 		RandomPrimeIter (const RandomPrimeIter &R) :
-			_bits(R._bits), _seed(R._seed)
+			_bits(R._bits), _seed(R._seed), _generator(R._generator)
 		{}
 
 		typedef integer Element ;
@@ -182,9 +233,9 @@ namespace LinBox
 		{
 			integer::random(a,_bits);
 
-			nextprime( a, a);
+			_IPD.nextprimein(a);
 			while (a.bitsize()>_bits)
-				prevprime(a,a);
+				_IPD.prevprimein(a);
 
 			return a;
 		}
@@ -201,9 +252,9 @@ namespace LinBox
 			integer::random(a,_bits-1); //!@todo uses random_exact when givaro is released.
 			a = (integer(1)<<_bits) - a;
 
-			nextprime( a, a);
+			_IPD.nextprimein(a);
 			while (a.bitsize()>_bits)
-				prevprime(a,a);
+				_IPD.prevprimein(a);
 
 			return a;
 		}
@@ -214,25 +265,25 @@ namespace LinBox
 			return random_exact(a);
 		}
 
-		integer & random_between (integer & a, unsigned long _low_bits) const
+		integer & random_between (integer & a, uint64_t _low_bits) const
 		{
 			linbox_check(_low_bits < _bits);
 			// integer::random_exact(a,_bits);
-			unsigned long ze_bits = (unsigned long)(_low_bits+(unsigned long)(double(_bits - _low_bits)*drand48())) ;
+			uint64_t ze_bits = (_low_bits + ((_bits - _low_bits)*_generator())) ;
 			linbox_check (!(ze_bits<_low_bits) && !(ze_bits>_bits));
 			integer::random(a,ze_bits-1); //!@todo uses random_between when givaro is released.
 			a = (integer(1)<<ze_bits) - a;
 
-			nextprime( a, a);
+			_IPD.nextprimein(a);
 			while (a.bitsize()>_bits)
-				prevprime(a,a);
+				_IPD.prevprimein(a);
 
 			linbox_check(a.bitsize() >= _low_bits && a.bitsize() <= _bits) ;
 
 			return a;
 		}
 
-		integer random_between ( unsigned long _low_bits) const
+		integer random_between ( uint64_t _low_bits) const
 		{
 			// std::cout << "random between " << _low_bits << " and " << _bits << std::endl;
 			integer a ;
@@ -241,7 +292,7 @@ namespace LinBox
 			return a ;
 		}
 
-		void setBits (unsigned int  bits)
+		void setBits (uint64_t  bits)
 		{
 			_bits = bits;
 		}
@@ -253,11 +304,10 @@ namespace LinBox
 #endif //__LINBOX_random_prime_iterator_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/randiter/unparametric.h b/linbox/randiter/unparametric.h
deleted file mode 100644
index d05d9d7..0000000
--- a/linbox/randiter/unparametric.h
+++ /dev/null
@@ -1,207 +0,0 @@
-/* Copyright (C) 2010 LinBox
- * Written by William J Turner
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-#ifndef __LINBOX_randiter_unparametric_H
-#define __LINBOX_randiter_unparametric_H
-
-#include <ctime>
-#include <vector>
-#include "linbox/field/unparametric.h"
-
-// #include <fflas-ffpack/field/unparametric.h>
-
-// Namespace in which all LinBox library code resides
-namespace LinBox
-{
-    using Givaro::Caster;
-
-	// forward declarations
-	template <class K> class UnparametricField;
-	// using FFPACK::UnparametricField ;
-
-	/** Unparameterized random field element generator template.
-	 * Implements LinBox random field element generator common object interface
-	 * for unparameterized fields.
-	 * Used to generate efficient field classes for unparameterized fields.
-	 * Constructs LinBox unparameterized random field element generators from
-	 * field types K.
-	 * In particular, constructs LinBox random field element generators for
-	 * unparameterized fields from field types that
-	 * adhere to the operations for double, for
-	 * example UnparametricRandIter< float >.
-	 * Can be used as a pattern to write a particular
-	 * field interface, such as, UnparametricRandIter< SaclibQ > as
-	 * a template specialization.
-	 * This implementation uses the standard C++ random number generator.  Thus,
-	 * only one random field element generator can be used at a time since
-	 * creating a new one will re-seed the built-in generator and affect all
-	 * current LinBox generators.
-	 * @param  K unparameterized field class
-	 */
-	template <class K> class UnparametricRandIter
-	{
-	public:
-
-		/** @name Common Object Interface.
-		 * These methods are required of all LinBox random field element generators.
-		 */
-		//@{
-
-		/** Field element type.
-		 * The field element must contain a default constructor,
-		 * a copy constructor, a destructor, and an assignment operator.
-		 */
-		typedef K Element;
-
-		/** Constructor from field, sampling size, and seed.
-		 * The random field element iterator works in the field F, is seeded
-		 * by seed, and it returns any one element with probability no more
-		 * than 1/min(size, F.cardinality(c)).
-		 * A sampling size of zero means to sample from the entire field.
-		 * A seed of zero means to use some arbitrary seed for the generator.
-		 * This implementation sets the sampling size to be no more than the
-		 * cardinality of the field.
-		 * @param F LinBox field archetype object in which to do arithmetic
-		 * @param size constant integer reference of sample size from which to
-		 *             sample (default = 0)
-		 * @param seed constant integer reference from which to seed random number
-		 *             generator (default = 0)
-		 */
-		UnparametricRandIter(
-				     const UnparametricField<K>& F,
-				     const integer& size = 0,
-				     const integer& seed = 0
-				    ) :
-			_size(size), _seed(seed)
-		{
-			if (_seed == integer(0))
-				_seed = Integer::random();
-
-			integer cardinality; F.cardinality(cardinality);
-			if ( (cardinality != integer(-1)) && (_size > cardinality) )
-				_size = cardinality;
-
-#ifdef TRACE
-			cout << "created random generator with size " << _size
-			<< " and seed " << _seed << endl;
-#endif // TRACE
-
-			// Seed random number generator
-			srand((unsigned)_seed);
-
-		} // UnparametricRandIter(const UnparametricField<K>&, const integer&, const integer&)
-
-		/** Copy constructor.
-		 * Constructs UnparametricRandIter object by copying the random field
-		 * element generator.
-		 * This is required to allow generator objects to be passed by value
-		 * into functions.
-		 * In this implementation, this means copying the random field element
-		 * generator to which R._randIter_ptr points.
-		 * @param  R UnparametricRandIter object.
-		 */
-		UnparametricRandIter(const UnparametricRandIter& R) :
-			_size(R._size), _seed(R._seed)
-		{}
-
-		/** Destructor.
-		 * This destructs the random field element generator object.
-		 * In this implementation, this destroys the generator by deleting
-		 * the random generator object to which _randIter_ptr points.
-		 */
-		~UnparametricRandIter(void) {}
-
-		/** Assignment operator.
-		 * Assigns UnparametricRandIter object R to generator.
-		 * In this implementation, this means copying the generator to
-		 * which R._randIter_ptr points.
-		 * @param  R UnparametricRandIter object.
-		 */
-		UnparametricRandIter& operator=(const UnparametricRandIter& R)
-		{
-			if (this != &R) // guard against self-assignment
-			{
-				_size = R._size;
-				_seed = R._seed;
-			}
-
-			return *this;
-		}
-
-		/** Random field element creator.
-		 * This returns a random field element from the information supplied
-		 * at the creation of the generator.
-		 * @return random field element
-		 */
-		Element& random (Element& x) const
-		{
-			// Create new random elements
-			if (_size == 0)
-				return x = (Element) rand();
-			else
-				return Caster (x, (double(rand())/RAND_MAX)*double(_size));
-
-		} // element& operator() (void)
-
-		//@} Common Object Iterface
-
-		/** @name Implementation-Specific Methods.
-		 * These methods are not required of all
-		 * \ref LinBox\ Random\ field\ element\ generators
-		 * and are included only for this implementation of the archetype.
-		 */
-		//@{
-
-		/// Default constructor
-		UnparametricRandIter(void) :
-			_size(0), _seed(0)
-		{
-			time(NULL);
-		}
-
-		//@}
-
-	private:
-
-		/// Sampling size
-		integer _size;
-
-		/// Seed
-		integer _seed;
-
-	}; // template <class K> class UnparametricRandIter
-
-} // namespace LinBox
-
-#endif // __LINBOX_randiter_unparametric_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/ring/Makefile.am b/linbox/ring/Makefile.am
index db8a61f..ca571cd 100644
--- a/linbox/ring/Makefile.am
+++ b/linbox/ring/Makefile.am
@@ -21,18 +21,36 @@
 
 pkgincludesubdir=$(pkgincludedir)/ring
 
+SUBDIRS=ntl modular
+
 BASIC_HDRS =            \
     ring-interface.h    \
+    givaro-poly.h       \
     givaro-polynomial.h \
+    modular.h           \
+    local-pir-modular.h \
+    pir-modular-int32.h \
+    local2_32.h         \
     abstract.h          \
     archetype.h         \
     envelope.h          \
     poweroftwomodular.h
 
-EXTRA_DIST =            \
-    ring.doxy           \
-    polynomial.doxy
+NTL_HDRS =              \
+    ntl.h               \
+    pid-ntl-zz_p.h     \
+    pir-ntl-zz_p.h
 
-pkgincludesub_HEADERS = \
-    $(BASIC_HDRS)
+if LINBOX_HAVE_NTL
+USE_NTL_HDRS = $(NTL_HDRS)
+endif
 
+pkgincludesub_HEADERS =     \
+    $(BASIC_HDRS)           \
+    $(USE_NTL_HDRS)
+
+EXTRA_DIST =            \
+    $(NTL_HDRS)         \
+    ring.doxy           \
+    polynomial.doxy		\
+    ntl.doxy
diff --git a/linbox/ring/Makefile.in b/linbox/ring/Makefile.in
deleted file mode 100644
index b919fc5..0000000
--- a/linbox/ring/Makefile.in
+++ /dev/null
@@ -1,586 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/ring
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/ring
-BASIC_HDRS = \
-    ring-interface.h    \
-    givaro-polynomial.h \
-    abstract.h          \
-    archetype.h         \
-    envelope.h          \
-    poweroftwomodular.h
-
-EXTRA_DIST = \
-    ring.doxy           \
-    polynomial.doxy
-
-pkgincludesub_HEADERS = \
-    $(BASIC_HDRS)
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/ring/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps linbox/ring/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
-	done
-
-uninstall-pkgincludesubHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
-	for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool ctags distclean distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-pkgincludesubHEADERS install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/ring/gcd32.h b/linbox/ring/gcd32.h
new file mode 100644
index 0000000..70dbda4
--- /dev/null
+++ b/linbox/ring/gcd32.h
@@ -0,0 +1,196 @@
+/* Copyright (C) LinBox
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_ring_gcd32_H
+#define __LINBOX_ring_gcd32_H
+
+template<typename Ints> Ints GCD2E32( const Ints p)
+{
+	if( p & 65535UL) {
+		if( p & 255UL) {
+			if( p & 15UL) {
+				if( p & 3UL) {
+					if( p & 1UL) {
+						return 1UL;
+					}
+					else {
+						return 2UL;
+					}
+				}
+				else {
+					if( p & 7UL) {
+						return 4UL;
+					}
+					else {
+						return 8UL;
+					}
+				}
+			}
+			else {
+				if( p & 63UL) {
+					if( p & 31UL) {
+						return 16UL;
+					}
+					else {
+						return 32UL;
+					}
+				}
+				else {
+					if( p & 127UL) {
+						return 64UL;
+					}
+					else {
+						return 128UL;
+					}
+				}
+			}
+		}
+		else {
+			if( p & 4095UL) {
+				if( p & 1023UL) {
+					if( p & 511UL) {
+						return 256UL;
+					}
+					else {
+						return 512UL;
+					}
+				}
+				else {
+					if( p & 2047UL) {
+						return 1024UL;
+					}
+					else {
+						return 2048UL;
+					}
+				}
+			}
+			else {
+				if( p & 16383UL) {
+					if( p & 8191UL) {
+						return 4096UL;
+					}
+					else {
+						return 8192UL;
+					}
+				}
+				else {
+					if( p & 32767UL) {
+						return 16384UL;
+					}
+					else {
+						return 32768UL;
+					}
+				}
+			}
+		}
+	}
+	else {
+		if( p & 16777215UL) {
+			if( p & 1048575UL) {
+				if( p & 262143UL) {
+					if( p & 131071UL) {
+						return 65536UL;
+					}
+					else {
+						return 131072UL;
+					}
+				}
+				else {
+					if( p & 524287UL) {
+						return 262144UL;
+					}
+					else {
+						return 524288UL;
+					}
+				}
+			}
+			else {
+				if( p & 4194303UL) {
+					if( p & 2097151UL) {
+						return 1048576UL;
+					}
+					else {
+						return 2097152UL;
+					}
+				}
+				else {
+					if( p & 8388607UL) {
+						return 4194304UL;
+					}
+					else {
+						return 8388608UL;
+					}
+				}
+			}
+		}
+		else {
+			if( p & 268435455UL) {
+				if( p & 67108863UL) {
+					if( p & 33554431UL) {
+						return 16777216UL;
+					}
+					else {
+						return 33554432UL;
+					}
+				}
+				else {
+					if( p & 134217727UL) {
+						return 67108864UL;
+					}
+					else {
+						return 134217728UL;
+					}
+				}
+			}
+			else {
+				if( p & 1073741823UL) {
+					if( p & 536870911UL) {
+						return 268435456UL;
+					}
+					else {
+						return 536870912UL;
+					}
+				}
+				else {
+					if( p & 2147483647UL) {
+						return 1073741824UL;
+					}
+					else {
+						return 2147483648UL;
+					}
+				}
+			}
+		}
+	}
+}
+
+#endif //__LINBOX_ring_gcd32_H
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/gcd64.h b/linbox/ring/gcd64.h
new file mode 100644
index 0000000..543eaf9
--- /dev/null
+++ b/linbox/ring/gcd64.h
@@ -0,0 +1,356 @@
+/* Copyright (C) LinBox
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_ring_gcd64_H
+#define __LINBOX_ring_gcd64_H
+
+template<typename Ints> Ints GCD2E64( const Ints p)
+{
+	if( p & 4294967295UL) {
+		if( p & 65535UL) {
+			if( p & 255UL) {
+				if( p & 15UL) {
+					if( p & 3UL) {
+						if( p & 1UL) {
+							return 1UL;
+						}
+						else {
+							return 2UL;
+						}
+					}
+					else {
+						if( p & 7UL) {
+							return 4UL;
+						}
+						else {
+							return 8UL;
+						}
+					}
+				}
+				else {
+					if( p & 63UL) {
+						if( p & 31UL) {
+							return 16UL;
+						}
+						else {
+							return 32UL;
+						}
+					}
+					else {
+						if( p & 127UL) {
+							return 64UL;
+						}
+						else {
+							return 128UL;
+						}
+					}
+				}
+			}
+			else {
+				if( p & 4095UL) {
+					if( p & 1023UL) {
+						if( p & 511UL) {
+							return 256UL;
+						}
+						else {
+							return 512UL;
+						}
+					}
+					else {
+						if( p & 2047UL) {
+							return 1024UL;
+						}
+						else {
+							return 2048UL;
+						}
+					}
+				}
+				else {
+					if( p & 16383UL) {
+						if( p & 8191UL) {
+							return 4096UL;
+						}
+						else {
+							return 8192UL;
+						}
+					}
+					else {
+						if( p & 32767UL) {
+							return 16384UL;
+						}
+						else {
+							return 32768UL;
+						}
+					}
+				}
+			}
+		}
+		else {
+			if( p & 16777215UL) {
+				if( p & 1048575UL) {
+					if( p & 262143UL) {
+						if( p & 131071UL) {
+							return 65536UL;
+						}
+						else {
+							return 131072UL;
+						}
+					}
+					else {
+						if( p & 524287UL) {
+							return 262144UL;
+						}
+						else {
+							return 524288UL;
+						}
+					}
+				}
+				else {
+					if( p & 4194303UL) {
+						if( p & 2097151UL) {
+							return 1048576UL;
+						}
+						else {
+							return 2097152UL;
+						}
+					}
+					else {
+						if( p & 8388607UL) {
+							return 4194304UL;
+						}
+						else {
+							return 8388608UL;
+						}
+					}
+				}
+			}
+			else {
+				if( p & 268435455UL) {
+					if( p & 67108863UL) {
+						if( p & 33554431UL) {
+							return 16777216UL;
+						}
+						else {
+							return 33554432UL;
+						}
+					}
+					else {
+						if( p & 134217727UL) {
+							return 67108864UL;
+						}
+						else {
+							return 134217728UL;
+						}
+					}
+				}
+				else {
+					if( p & 1073741823UL) {
+						if( p & 536870911UL) {
+							return 268435456UL;
+						}
+						else {
+							return 536870912UL;
+						}
+					}
+					else {
+						if( p & 2147483647UL) {
+							return 1073741824UL;
+						}
+						else {
+							return 2147483648UL;
+						}
+					}
+				}
+			}
+		}
+	}
+	else {
+		if( p & 281474976710655ULL) {
+			if( p & 1099511627775ULL) {
+				if( p & 68719476735ULL) {
+					if( p & 17179869183ULL) {
+						if( p & 8589934591ULL) {
+							return 4294967296ULL;
+						}
+						else {
+							return 8589934592ULL;
+						}
+					}
+					else {
+						if( p & 34359738367ULL) {
+							return 17179869184ULL;
+						}
+						else {
+							return 34359738368ULL;
+						}
+					}
+				}
+				else {
+					if( p & 274877906943ULL) {
+						if( p & 137438953471ULL) {
+							return 68719476736ULL;
+						}
+						else {
+							return 137438953472ULL;
+						}
+					}
+					else {
+						if( p & 549755813887ULL) {
+							return 274877906944ULL;
+						}
+						else {
+							return 549755813888ULL;
+						}
+					}
+				}
+			}
+			else {
+				if( p & 17592186044415ULL) {
+					if( p & 4398046511103ULL) {
+						if( p & 2199023255551ULL) {
+							return 1099511627776ULL;
+						}
+						else {
+							return 2199023255552ULL;
+						}
+					}
+					else {
+						if( p & 8796093022207ULL) {
+							return 4398046511104ULL;
+						}
+						else {
+							return 8796093022208ULL;
+						}
+					}
+				}
+				else {
+					if( p & 70368744177663ULL) {
+						if( p & 35184372088831ULL) {
+							return 17592186044416ULL;
+						}
+						else {
+							return 35184372088832ULL;
+						}
+					}
+					else {
+						if( p & 140737488355327ULL) {
+							return 70368744177664ULL;
+						}
+						else {
+							return 140737488355328ULL;
+						}
+					}
+				}
+			}
+		}
+		else {
+			if( p & 72057594037927935ULL) {
+				if( p & 4503599627370495ULL) {
+					if( p & 1125899906842623ULL) {
+						if( p & 562949953421311ULL) {
+							return 281474976710656ULL;
+						}
+						else {
+							return 562949953421312ULL;
+						}
+					}
+					else {
+						if( p & 2251799813685247ULL) {
+							return 1125899906842624ULL;
+						}
+						else {
+							return 2251799813685248ULL;
+						}
+					}
+				}
+				else {
+					if( p & 18014398509481983ULL) {
+						if( p & 9007199254740991ULL) {
+							return 4503599627370496ULL;
+						}
+						else {
+							return 9007199254740992ULL;
+						}
+					}
+					else {
+						if( p & 36028797018963967ULL) {
+							return 18014398509481984ULL;
+						}
+						else {
+							return 36028797018963968ULL;
+						}
+					}
+				}
+			}
+			else {
+				if( p & 1152921504606846975ULL) {
+					if( p & 288230376151711743ULL) {
+						if( p & 144115188075855871ULL) {
+							return 72057594037927936ULL;
+						}
+						else {
+							return 144115188075855872ULL;
+						}
+					}
+					else {
+						if( p & 576460752303423487ULL) {
+							return 288230376151711744ULL;
+						}
+						else {
+							return 576460752303423488ULL;
+						}
+					}
+				}
+				else {
+					if( p & 4611686018427387903ULL) {
+						if( p & 2305843009213693951ULL) {
+							return 1152921504606846976ULL;
+						}
+						else {
+							return 2305843009213693952ULL;
+						}
+					}
+					else {
+						if( p & 9223372036854775807ULL) {
+							return 4611686018427387904ULL;
+						}
+						else {
+							return 9223372036854775808ULL;
+						}
+					}
+				}
+			}
+		}
+	}
+}
+
+#endif //__LINBOX_ring_gcd64_H
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/givaro-poly-mod-poly.h b/linbox/ring/givaro-poly-mod-poly.h
new file mode 100644
index 0000000..e6c752f
--- /dev/null
+++ b/linbox/ring/givaro-poly-mod-poly.h
@@ -0,0 +1,41 @@
+
+#ifndef _GIVARO_POLY_MOD_POLY_H
+#define _GIVARO_POLY_MOD_POLY_H
+
+#include <givaro/extension.h>
+#include <givaro/givindeter.h>
+//#include "linbox/field/Givaro/givaro-field.h"
+
+namespace LinBox {
+
+template <class BaseField>
+class GivaroPolyModPoly {
+public:
+	typedef Givaro::Extension<BaseField>  Parent_t;
+	typedef typename Parent_t::PolElement Element;
+
+	typedef BaseField Domain_t;
+	typedef typename BaseField::Element Type_t;
+
+	GivaroPolyModPoly(BaseField& F,Element p,Givaro::Indeter Y="Y") :
+		F_(&F),
+		FactorDom_(*F_,Y),
+		ExtensionField_(FactorDom_,BaseField(p)) {}
+
+	Parent_t* getExtension() {
+		return &ExtensionField_;
+	}
+
+private:
+
+	BaseField *F_;
+
+	Givaro::Poly1FactorDom<BaseField,Givaro::Dense> FactorDom_;
+
+	Givaro::Extension<BaseField>  ExtensionField_;
+
+};
+
+}
+
+#endif // _GIVARO_POLY_MOD_POLY_H
diff --git a/linbox/ring/givaro-poly.h b/linbox/ring/givaro-poly.h
new file mode 100644
index 0000000..211ea62
--- /dev/null
+++ b/linbox/ring/givaro-poly.h
@@ -0,0 +1,348 @@
+
+/* ring/givaro-poly.h
+ * Copyright (C) 2014 Gavin Harrison,
+ *
+ * Written by Gavin Harrison <gmh33 at drexel.edu>,
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+#include <iostream>
+
+#include "linbox/integer.h"
+#include <givaro/givpoly1.h>
+
+#ifndef LINBOX_ring_givaro_poly_H
+#define LINBOX_ring_givaro_poly_H
+
+namespace LinBox
+{
+	template<class Field>
+	class GivaroPolyRandIter;
+
+	template<class Domain>
+	class GivaroPoly {
+		Domain _pd;
+	public:
+		typedef Domain Domain_t;
+		typedef typename Domain::Element Element;
+		typedef typename Domain::Type_t Scalar_t;
+
+		typedef GivaroPolyRandIter<GivaroPoly<Domain> > RandIter;
+
+		Element zero, one, mOne;
+
+		GivaroPoly(){}
+
+		GivaroPoly(const Domain &pd) : _pd(pd) {
+			_pd.assign(zero, _pd.zero);
+			_pd.assign(one, _pd.one);
+			_pd.assign(mOne, _pd.mOne);
+		}
+
+		GivaroPoly(const GivaroPoly &P)
+			: _pd(P._pd), zero(P.zero), one(P.one), mOne(P.mOne) {}
+
+		GivaroPoly &operator=(const GivaroPoly &F) {
+			return *this;
+		}
+
+		const Domain_t domain() const {
+			return _pd;
+		}
+
+		const typename Domain_t::Domain_t &subdomain() const {
+			return _pd.subdomain();
+		}
+
+		Element &init(Element &x) const {
+			_pd.init(x, Givaro::Degree(0), 0);
+			return x;
+		}
+
+		Element &init(Element &x, const integer &y) const {
+			_pd.init(x, Givaro::Degree(0), 0);
+
+			integer q = subdomain().cardinality();
+
+			integer i = 0;
+			integer tmp = y;
+
+			while (tmp != 0)
+			{
+				Element xi;
+				_pd.init(xi, Givaro::Degree(int64_t(i)), tmp % q);
+				_pd.addin(x, xi);
+
+				i++;
+				tmp /= q;
+			}
+
+			return x;
+		}
+		
+		Element &init(Element &x, const std::vector<integer> &y) const {
+			_pd.init(x, Givaro::Degree(0), 0);
+			
+			for (int i = 0; i < y.size(); i++)
+			{
+				Element xi;
+				_pd.init(xi, Givaro::Degree(i), y[i]);
+				_pd.addin(x, xi);
+			}
+			
+			return x;
+		}
+
+		integer &convert(integer &x, const Element &y) const {
+			x = 0;
+			integer q = _pd.characteristic();
+			Givaro::Degree d = _pd.degree(y);
+
+			while (d >= 0) {
+				integer tmp;
+				Scalar_t e;
+
+				x *= q;
+				_pd.getEntry(e, d, y);
+				x += _pd.subdomain().convert(tmp, e);
+
+				d--;
+			}
+
+			return x;
+		}
+
+		Element &assign(Element &x, const Element &y) const {
+			return _pd.assign(x, y);
+		}
+
+		integer &cardinality(integer &c) const {
+			return c = -1;
+		}
+
+		integer &characteristic(integer &c) const {
+			return c = _pd.characteristic(c);
+		}
+
+		bool areEqual(const Element &x, const Element &y) const {
+			return _pd.areEqual(x, y);
+		}
+		
+		Element &normalize(Element &z, const Element &x) const {
+			Scalar_t a;
+			domain().leadcoef(a, x);
+			domain().div(z, x, a);
+			return z;
+		}
+
+		Element &normalizeIn(Element &x) const {
+			Scalar_t a;
+			domain().leadcoef(a, x);
+			domain().divin(x, a);
+			return x;
+		}
+		
+		bool areAssociates(const Element &x, const Element &y) const {
+			Scalar_t a, b;
+			Element z;
+			
+			domain().leadcoef(a, x);
+			domain().leadcoef(b, y);
+			
+			subdomain().divin(a, b);
+			
+			domain().mul(z, y, a);
+			
+			return _pd.areEqual(x, z);
+		}
+
+		bool isZero(const Element &x) const {
+			return _pd.isZero(x);
+		}
+
+		bool isOne(const Element &x) const {
+			return _pd.isOne(x);
+		}
+
+		bool isMOne(const Element &x) const {
+			return _pd.isMOne(x);
+		}
+
+		std::ostream &write(std::ostream &os) const {
+			return os << "polynomials";
+		}
+
+		std::istream &read(std::istream &is) {
+			return is;
+		}
+
+		std::ostream &write(std::ostream &os, const Element &x) const {
+			return _pd.write(os, x);
+		}
+
+		std::istream &read(std::istream &is, Element &x) const {
+			_pd.read(is, x);
+			return is;
+		}
+
+		Element &add(Element &x, const Element &y, const Element &z) const {
+			return _pd.add(x, y, z);
+		}
+
+		Element &sub(Element &x, const Element &y, const Element &z) const {
+			return _pd.sub(x, y, z);
+		}
+
+		Element &mul(Element &x, const Element &y, const Element &z) const {
+			return _pd.mul(x, y, z);
+		}
+
+		Element &div(Element &x, const Element &y, const Element &z) const {
+			return _pd.div(x, y, z);
+		}
+
+		Element &neg(Element &x, const Element &y) const {
+			return _pd.neg(x, y);
+		}
+
+		Element &inv(Element &x, const Element &y) const {
+			if (_pd.degree(y) == 0 && !_pd.isZero(y)) {
+				Scalar_t tmp;
+				_pd.subdomain().inv(tmp, _pd.getEntry(tmp, Givaro::Degree(0), y));
+				return _pd.assign(x, tmp);
+			}
+
+			return _pd.assign(x,zero);
+		}
+
+		Element &axpy(Element &r, const Element &a, const Element &x, const Element &y) const {
+			return _pd.axpy(r,a,x,y);
+		}
+
+		Element &addin(Element &x, const Element &y) const {
+			return _pd.addin(x, y);
+		}
+
+		Element &subin(Element &x, const Element &y) const {
+			return _pd.subin(x, y);
+		}
+
+		Element &mulin(Element &x, const Element &y) const {
+			return _pd.mulin(x, y);
+		}
+
+		Element &divin(Element &x, const Element &y) const {
+			return _pd.divin(x, y);
+		}
+
+		Element &negin(Element &x) const {
+			return _pd.negin(x);
+		}
+
+		Element &invin(Element &x) const {
+			Element tmp;
+			inv(tmp, x);
+			x = tmp;
+			return x;
+		}
+
+		Element &axpyin(Element &r, const Element &a, const Element &x) const {
+			return _pd.axpyin(r, a, x);
+		}
+
+		// PIR Functions
+
+		bool isDivisor(const Element &a, const Element &b) const {
+			Element tmp;
+			rem(tmp, a, b);
+			return _pd.isZero(tmp);
+		}
+		
+		// a = q b + r
+		Element &quo(Element &q, const Element &a, const Element &b) const {
+			return div(q,a,b);
+		}
+		
+		Element &rem(Element &r, const Element &a, const Element &b) const {
+			return _pd.mod(r,a,b);
+		}
+		
+		Element &divrem(Element &q, Element &r, const Element &a, const Element &b) const {
+			return _pd.divmod(q,r,a,b);
+		}
+		
+		Element &modin(Element &a, const Element &b) const {
+			return _pd.modin(a, b);
+		}
+
+		Element& normalIn(Element &x) const
+		{
+			return x;
+		}
+		
+		bool isUnit(const Element& x) const
+		{
+			return _pd.degree(x).value()==0;
+		}
+
+		// g = gcd(a,b)
+		Element& gcd(Element &g, const Element &a, const Element &b) const {
+			return _pd.gcd(g,a,b);
+		}
+		
+		// g = gcd(a,b)
+		Element& gcd(Element &g, Element &s, Element &t, const Element &a, const Element &b) const {
+			return _pd.gcd(g,s,t,a,b);
+		}
+
+		// g = gcd(a,b) = a*s + b*t
+		Element &xgcd(Element &g, Element &s, Element &t, const Element &a, const Element &b) const {
+			return _pd.gcd(g,s,t,a,b);
+		}
+
+		/**
+		 * g = gcd(a,b) = a*s + b*t
+		 * 1 = s*u + t*v
+		 * u = a/g
+		 * v = b/g
+		 */
+		Element &dxgcd(
+			Element &g,
+			Element &s,
+			Element &t,
+			Element &u,
+			Element &v,
+			const Element &a,
+			const Element &b) const
+		{
+			xgcd(g,s,t,a,b);
+
+			div(u,a,g);
+			div(v,b,g);
+
+			return g;
+		}
+	};
+}
+
+#include "linbox/randiter/givaro-poly.h"
+
+#endif // LINBOX_ring_givaro_poly_H
diff --git a/linbox/ring/givaro-polynomial.h b/linbox/ring/givaro-polynomial.h
index a3ede28..3882052 100644
--- a/linbox/ring/givaro-polynomial.h
+++ b/linbox/ring/givaro-polynomial.h
@@ -35,9 +35,9 @@
 #include <iostream>
 #include <givaro/givpoly1.h>
 #include <givaro/givpoly1factor.h>
+#include <givaro/zring.h>
+
 #include "linbox/integer.h"
-#include "linbox/field/unparametric.h"
-#include "linbox/field/givaro.h"
 //#include "linbox/element/givaro-polynomial.h"
 
 
@@ -53,26 +53,28 @@ namespace LinBox
 	 *  @tparam StorageTag
 	 */
 	template <class Domain, class StorageTag= Givaro::Dense>
-	class GivPolynomialRing : public Givaro::Poly1FactorDom< GivaroField<Domain>,StorageTag> {
+	class GivPolynomialRing : public Givaro::Poly1FactorDom< Domain,StorageTag> {
 	public:
 
 		//	using Givaro::Poly1FactorDom<Domain,StorageTag>::eval;
-        typedef typename Givaro::Poly1FactorDom<GivaroField<Domain>,StorageTag> Father_t;
+		typedef typename Givaro::Poly1FactorDom<Domain,StorageTag> Father_t;
 		typedef typename Father_t::Element Element;
 		typedef Element Polynomial;
 
-		GivPolynomialRing () {}
+		typedef Father_t Rep;
+
+		// GivPolynomialRing () {}
 
-		GivPolynomialRing (const Domain& D) : Father_t( GivaroField<Domain>(D) )
+		GivPolynomialRing (const Domain& D) : Father_t( Domain(D) )
 		{}
 
 		GivPolynomialRing (const Domain& D, const Givaro::Indeter& I) :
-                Father_t(GivaroField<Domain>(D), I)
+                Father_t(Domain(D), I)
 		{}
 
 		template<class PolyCont>
 		PolyCont& factor (PolyCont& factors,
-				  std::vector<unsigned long>& exp,
+				  std::vector<uint64_t>& exp,
 				  const Polynomial& P)
             {
 
@@ -80,9 +82,9 @@ namespace LinBox
                     // at least without pointers ...
                 std::vector<Polynomial> Lf;
                 CZfactor(Lf, exp, P); // Cantor-Zassenhaus factorization
-                factors.resize(Lf.size());
+                factors.resize((size_t)Lf.size());
                 for(size_t i=0;  i<Lf.size(); ++i)
-                    factors[i] = new Polynomial(Lf[i]);
+                    factors[(size_t)i] = new Polynomial(Lf[(size_t)i]);
 
                 return factors;
             }
@@ -93,23 +95,24 @@ namespace LinBox
 
 #ifdef __LINBOX_HAVE_NTL
 }
-#include "linbox/field/ntl.h"
+
+#include "linbox/ring/ntl.h"
 #include "NTL/ZZXFactoring.h"
 namespace LinBox
 {
-	typedef GivPolynomialRing<UnparametricField<integer>, Givaro::Dense> GivPolIntDense;
+	typedef GivPolynomialRing<Givaro::ZRing<integer>, Givaro::Dense> GivPolIntDense;
 
 	template <>
 	template <>
 	std::vector<GivPolIntDense::Element* >&
 	GivPolIntDense::factor (std::vector<GivPolIntDense::Element* >& factors,
-				std::vector<unsigned long>& exp,
+				std::vector<uint64_t>& exp,
 				const GivPolIntDense::Element &P)
 	{
 		NTL::ZZXFac_InitNumPrimes = 1;
 		NTL::ZZX f;
 		for (size_t i = 0; i < P.size(); ++i){
-			NTL::SetCoeff (f, i, NTL::to_ZZ((std::string( P[i] )).c_str()) );
+			NTL::SetCoeff (f, (long)i, NTL::to_ZZ((std::string( P[(size_t)i] )).c_str()) );
 		}
 		NTL::vec_pair_ZZX_long ntlfactors;
 		NTL::ZZ c;
@@ -117,54 +120,54 @@ namespace LinBox
 
 		NTL::ZZ t;
 		NTL_ZZ NTLIntDom;
-		factors.resize(ntlfactors.length());
-		exp.resize(ntlfactors.length());
+		factors.resize((size_t)ntlfactors.length());
+		exp.resize((size_t)ntlfactors.length());
 		for (int i= 0; i<ntlfactors.length(); ++i) {
-			factors[i] = new GivPolIntDense::Element( deg(ntlfactors[i].a)+1 );
+			factors[(size_t)i] = new GivPolIntDense::Element( (size_t)( deg(ntlfactors[i].a)+1 ));
 			for(int j = 0; j <= deg(ntlfactors[i].a); ++j) {
 				NTL::GetCoeff(t,ntlfactors[i].a,j);
-				NTLIntDom.convert( factors[i]->operator[](j), t );
+				NTLIntDom.convert( factors[(size_t)i]->operator[]((size_t)j), t );
 			}
-			exp[i] = ntlfactors[i].b;
+			exp[(size_t)i] =(unsigned long) ntlfactors[i].b;
 		}
 		return factors;
 	}
 }
 
-#include "linbox/field/PID-integer.h"
-namespace LinBox
-{
-	typedef GivPolynomialRing<PID_integer, Givaro::Dense> GivPolPIDIntDense;
-	template <>
-	template <>
-	std::vector<GivPolPIDIntDense::Element* >&
-	GivPolPIDIntDense::factor<std::vector<GivPolPIDIntDense::Element* > > (std::vector<GivPolPIDIntDense::Element* >& factors,
-			std::vector<unsigned long>& exp,
-			const GivPolPIDIntDense::Element &P)
-	{
-		NTL::ZZXFac_InitNumPrimes = 1;
-		NTL::ZZX f;
-		for (size_t i = 0; i < P.size(); ++i){
-			NTL::SetCoeff (f, i, NTL::to_ZZ((std::string( P[i] )).c_str()) );
-		}
-		NTL::vec_pair_ZZX_long ntlfactors;
-		NTL::ZZ c;
-		NTL::factor (c, ntlfactors, f);
-
-		NTL::ZZ t;
-		NTL_ZZ NTLIntDom;
-		factors.resize(ntlfactors.length());
-		exp.resize(ntlfactors.length());
-		for (int i= 0; i<ntlfactors.length(); ++i) {
-			factors[i] = new GivPolPIDIntDense::Element( deg(ntlfactors[i].a)+1 );
-			for(int j = 0; j <= deg(ntlfactors[i].a); ++j) {
-				NTL::GetCoeff(t,ntlfactors[i].a,j);
-				NTLIntDom.convert( factors[i]->operator[](j), t );
-			}
-			exp[i] = ntlfactors[i].b;
-		}
-		return factors;
-	}
+// #include "givaro/zring.h"
+ namespace LinBox
+ {
+// 	typedef GivPolynomialRing<Givaro::ZRing<Integer>, Givaro::Dense> GivPolPIDIntDense;
+// 	template <>
+// 	template <>
+// 	std::vector<GivPolPIDIntDense::Element* >&
+// 	GivPolPIDIntDense::factor<std::vector<GivPolPIDIntDense::Element* > > (std::vector<GivPolPIDIntDense::Element* >& factors,
+// 			std::vector<unsigned long>& exp,
+// 			const GivPolPIDIntDense::Element &P)
+// 	{
+// 		NTL::ZZXFac_InitNumPrimes = 1;
+// 		NTL::ZZX f;
+// 		for (size_t i = 0; i < P.size(); ++i){
+// 			NTL::SetCoeff (f, (long)i, NTL::to_ZZ((std::string( P[(size_t)i] )).c_str()) );
+// 		}
+// 		NTL::vec_pair_ZZX_long ntlfactors;
+// 		NTL::ZZ c;
+// 		NTL::factor (c, ntlfactors, f);
+
+// 		NTL::ZZ t;
+// 		NTL_ZZ NTLIntDom;
+// 		factors.resize((size_t)ntlfactors.length());
+// 		exp.resize((size_t)ntlfactors.length());
+// 		for (int i= 0; i<ntlfactors.length(); ++i) {
+// 			factors[(size_t)i] = new GivPolPIDIntDense::Element( (size_t)deg(ntlfactors[i].a)+1 );
+// 			for(int j = 0; j <= deg(ntlfactors[i].a); ++j) {
+// 				NTL::GetCoeff(t,ntlfactors[i].a,j);
+// 				NTLIntDom.convert( factors[(size_t)i]->operator[]((size_t)j), t );
+// 			}
+// 			exp[(size_t)i] = (unsigned long)ntlfactors[i].b;
+// 		}
+// 		return factors;
+// 	}
 
 	typedef GivPolynomialRing< NTL_ZZ , Givaro::Dense> GivPolZZDense;
 	template <>
@@ -172,46 +175,46 @@ namespace LinBox
 	std::vector<GivPolZZDense::Element* >&
 	GivPolZZDense::factor<std::vector<GivPolZZDense::Element* > >
 	(std::vector<GivPolZZDense::Element* >& factors,
-	 std::vector<unsigned long>& exp,
+	 std::vector<uint64_t>& exp,
 	 const GivPolZZDense::Element &P)
 	{
 		NTL::ZZXFac_InitNumPrimes = 1;
 		NTL::ZZX f;
 		for (size_t i = 0; i < P.size(); ++i){
-			NTL::SetCoeff (f, i, P[i]);
+			NTL::SetCoeff (f, (long)i, P[(size_t)i]);
 		}
 		NTL::vec_pair_ZZX_long ntlfactors;
 		NTL::ZZ c;
 		NTL::factor (c, ntlfactors, f);
 
 		NTL::ZZ t;
-		factors.resize(ntlfactors.length());
-		exp.resize(ntlfactors.length());
+		factors.resize((size_t)ntlfactors.length());
+		exp.resize((size_t)ntlfactors.length());
 		for (int i= 0; i<ntlfactors.length(); ++i) {
-			factors[i] = new GivPolZZDense::Element( deg(ntlfactors[i].a)+1 );
+			factors[(size_t)i] = new GivPolZZDense::Element((size_t) deg(ntlfactors[i].a)+1 );
 			for(int j = 0; j <= deg(ntlfactors[i].a); ++j) {
-				NTL::GetCoeff( factors[i]->operator[](j),ntlfactors[i].a,j);
+				NTL::GetCoeff( factors[(size_t)i]->operator[]((size_t)j),ntlfactors[i].a,j);
 			}
-			exp[i] = ntlfactors[i].b;
+			exp[(size_t)i] = (unsigned long)ntlfactors[i].b;
 		}
 		return factors;
 	}
 
 #endif
 
-	typedef GivPolynomialRing<Modular<double>, Givaro::Dense> GivPolMdDense;
+	typedef GivPolynomialRing<Givaro::Modular<double>, Givaro::Dense> GivPolMdDense;
 
 	template <>
 	template <>
 	std::vector<GivPolMdDense::Element *>&
 	GivPolMdDense::factor (std::vector<GivPolMdDense::Element* > & factors,
-			       std::vector<unsigned long>& exp,
+			       std::vector<uint64_t>& exp,
 			       const GivPolMdDense::Element& P)
 	{
 		integer charac;
 		_domain.characteristic(charac);
 		double p = charac;
-		typedef GivaroField<Modular<double> > GivModDouble;
+		typedef Givaro::Modular<double> GivModDouble;
 		typedef Givaro::Poly1FactorDom< GivModDouble, Givaro::Dense, GivModDouble::RandIter> PolysDouble;
 
 
@@ -220,7 +223,7 @@ namespace LinBox
 		PFD.CZfactor ( factors2, exp, static_cast<PolysDouble::Element>(P),p);
 
 		//std::cerr<<"factorization done"<<std::endl;
-		factors.resize(factors2.size());
+		factors.resize((size_t)factors2.size());
 		std::vector<GivPolMdDense::Element* >::iterator itf = factors.begin();
 		std::vector<PolysDouble::Element >::const_iterator itf2 = factors2.begin();
 		for (; itf2 != factors2.end();++itf,++itf2){
diff --git a/linbox/ring/local-pir-modular.h b/linbox/ring/local-pir-modular.h
new file mode 100644
index 0000000..64aa45e
--- /dev/null
+++ b/linbox/ring/local-pir-modular.h
@@ -0,0 +1,174 @@
+/* Copyright (C) 2010 LinBox
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+#ifndef __LINBOX_local_pir_modular_H
+#define __LINBOX_local_pir_modular_H
+
+#include <string>
+#include <givaro/modular.h>
+#include <givaro/givpower.h>
+
+#include "linbox/field/field-traits.h"
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+
+
+	template <typename intType>
+	class LocalPIRModular;
+
+	template <typename intType>
+	struct ClassifyRing<LocalPIRModular<intType> >  {
+		typedef RingCategories::ModularTag categoryTag;
+	};
+
+	/// \ingroup ring
+	template <typename intType>
+	class LocalPIRModular : public Givaro::Modular<intType>  {
+
+	public:
+
+		using Parent_t = Givaro::Modular<intType>;
+	
+		using typename Givaro::Modular<intType>::Element;
+		//typedef typename Givaro::Modular<intType>::Element Element;
+
+		using typename Givaro::Modular<intType>::RandIter;
+
+		//No default cstor
+
+		LocalPIRModular (intType value, uint32_t exp = 1) :
+			Givaro::Modular<intType>(Givaro::power(value, exp)), 
+			_irred(value), 
+			_exponent(exp)
+		{}
+        
+                ~LocalPIRModular() noexcept {};
+        
+        using Parent_t:: zero;
+        using Parent_t:: one;
+        using Parent_t:: mOne;
+
+        using Parent_t:: minElement;
+        using Parent_t:: maxElement;
+
+        using Parent_t:: characteristic;
+        using Parent_t:: cardinality;
+        
+        using Parent_t:: maxCardinality;
+        using Parent_t:: minCardinality;
+
+        // ----- Checkers
+        using Parent_t:: isZero;
+        using Parent_t:: isOne ;
+        using Parent_t:: isMOne;
+        using Parent_t:: areEqual;
+        using Parent_t:: length;
+        
+        // ----- Ring-wise operators
+        using Parent_t:: operator==;
+        using Parent_t:: operator!=;
+        using Parent_t:: operator=;
+
+        // ----- Initialisation
+        using Parent_t:: init ;
+
+        using Parent_t:: assign ;
+    
+        using Parent_t:: convert;
+
+        using Parent_t:: reduce ;
+        
+        using Parent_t:: mul;
+        using Parent_t:: div;
+        using Parent_t:: add;
+        using Parent_t:: sub;
+        using Parent_t:: neg;
+        using Parent_t:: inv;
+
+        using Parent_t:: mulin;
+        using Parent_t:: divin;
+        using Parent_t:: addin;
+        using Parent_t:: subin;
+        using Parent_t:: negin;
+        using Parent_t:: invin;
+        
+        using Parent_t:: axpy  ;
+        using Parent_t:: axpyin;
+
+        using Parent_t:: axmy;
+        using Parent_t:: axmyin;
+
+        using Parent_t:: maxpy;
+        using Parent_t:: maxpyin;
+
+        // ----- Random generators
+        using typename Parent_t:: NonZeroRandIter;
+        using Parent_t:: random;
+        using Parent_t:: nonzerorandom;
+
+        // --- IO methods
+	using Parent_t:: read ;
+	using Parent_t:: write;
+
+        std::istream& read (std::istream& is)
+	{ std::string s; return Parent_t::read(is >> s)>> s >> _irred >> s >> _exponent; }
+        std::ostream& write(std::ostream& os) const
+	{ return Parent_t::write(os<<"Local- ") << "irred: " << _irred << ", exponent: " << _exponent; }
+
+	Element& gcdin (Element& a, const Element& b) const
+                {
+			Givaro::gcd(a, a, b);
+                        Givaro::gcd(a, a, Parent_t::residu()); 
+			return reduce(a);
+                }
+
+
+	bool isUnit(const Element& a) const
+                {
+                        Element g;
+                        Givaro::gcd(g, a, _irred);
+                        return isOne(g);
+                }
+
+        
+	protected:
+		intType _irred;
+		uint32_t _exponent;
+	};
+
+}
+
+
+#endif //__LINBOX_local_pir_modular_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/ring/local2_32.h b/linbox/ring/local2_32.h
new file mode 100644
index 0000000..bdf0a83
--- /dev/null
+++ b/linbox/ring/local2_32.h
@@ -0,0 +1,262 @@
+/* Copyright (C) 2010 LinBox
+ * written by bds, wan
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+#ifndef __LINBOX_local2_32_H
+#define __LINBOX_local2_32_H
+
+#include <givaro/zring.h>
+#include "linbox/util/debug.h"
+#include "linbox/linbox-config.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/integer.h"
+
+namespace LinBox
+{
+
+	template<typename Ring>
+	struct ClassifyRing;
+
+	struct Local2_32;
+
+	template<>
+	struct ClassifyRing<Local2_32> {
+		typedef RingCategories::ModularTag categoryTag;
+	};
+
+	/** \brief Fast arithmetic mod 2^32, including gcd.
+	 *
+	 * Extend Givaro::ZRing<uint32_t> which is a representation
+	 * of Z_2^32. It is especially fast because it uses hardware arithmetic
+	 * directly.  This ring is a Local Principal Ideal Ring.
+	 *
+	 * These needed PIR functions are added:
+	 * gcdin(), isUnit(), also inv() is modified to work correctly.
+	 * The type Exponent is added: more effective rep of the powers of 2,
+	 * which are important because gcds are powers of 2).
+	 * This entails some new versions of divin(), mulin(), isUnit().
+	 *
+	 * Those are the function needed for the LocalSmith algorithm.
+	 * Further appropriate PIR functions may be added later.
+	 * \ingroup field
+	 */
+
+	struct Local2_32: public Givaro::ZRing<uint32_t>
+	{
+	public:
+
+		typedef Givaro::ZRing<uint32_t>::Element Element;
+		typedef enum {_min=0,_max=32} Exponent; // enum?
+		//Exponent& init(Exponent& a) { return a = 32; }
+
+		Local2_32 (int p=2, int exp=32) :
+			Givaro::ZRing<uint32_t>()
+		{
+			if(p != 2) throw PreconditionFailed(LB_FILE_LOC,"modulus must be 2");
+			if(exp != 32) throw PreconditionFailed(LB_FILE_LOC,"exponent must be 32");
+		}
+
+		inline Element& gcd(Element& c, const Element& a, const Element& b) const
+		{   c = a | b; 
+			if (c == 0) return c;
+			uint32_t i = 0;
+		    while (! (c & 1)) {c >>= 1; ++i;}
+			return c = 1 << i;
+		}
+
+		inline Element& gcdin(Element& b, const Element& a) const
+		{	
+			Element c = b; return gcd(b, c, a); }
+			/*
+			if (isZero(b)) return b = a;
+			Element d = b;
+			Exponent k;
+			int32_t i;
+			for ( i = 0; (i < k) && (!(d&1)); ++ i) d >>= 1;
+			k = Exponent(i);
+			gcdin(k, a);
+			return b = 1 << k;
+		}
+		*/
+		// assume k is an exponent of 2.
+		inline Exponent& gcdin(Exponent& k, const Element& b) const
+		{   
+			Element d = b;
+			int32_t i;
+			for ( i = 0; (i < k) && (!(d&1)); ++ i) d >>= 1;
+			return k = Exponent(i);
+		}
+
+		inline bool isUnit(const Element& a) const
+		{   return a & 1;   }
+
+		inline bool isUnit(const Exponent& a) const
+		{   return a == 0;   }
+
+		inline bool isZero(const Element& a) const
+		{   return a == 0;   }
+
+		inline bool isZero(const Exponent& a) const
+		{   return a >= 32;   }
+
+		//Element& div(Element& c, const Element& a, const Element& b) const
+		//{   return c = NTL::rep(a)/NTL::GCD(NTL::rep(a),NTL::rep(b));   }
+		//
+
+		inline Element& mulin(Element& a, const Exponent& k) const
+		{
+			if (k >= 32) return a = 0;
+			else return a <<= k;
+		}
+
+		inline Element& mulin(Element& a, const Element& b)  const {
+			return a *= b;
+		}
+
+		inline Element& axpyin(Element& r, const Element& x, const Element& y)  const{
+			return r += x * y;
+		}
+
+		/*
+		   static inline bool isDivisor(Element a, Element b)
+		   {   while (! (a ^ 1))
+		   {   if (b ^ 1) return false;
+		   a = a >> 1; b = b >> 1;
+		   }
+		   return true;
+		   }
+		   */
+
+		// assume k is an exponent of 2 and the power of 2 exactly divides a
+		inline Element& divin(Element& a, const Exponent& k) const
+		{   return a >>= k;   }
+
+		inline Element& inv(Element& a, const Element& b) const {
+
+			if (!isUnit(b))
+				throw PreconditionFailed(LB_FILE_LOC,"inv: not a unit");
+			else {
+
+				Element g, s, t;
+
+				xgcd(g, s, t, b, -b);
+
+				return a = s - t;
+			}
+		}
+
+		static inline integer maxCardinality()
+		{ return integer( "4294967296" ); } // 2^32
+
+	protected:
+
+		Element& xgcd(Element& d, Element& s, Element& t, const Element& a, const Element& b) const
+		{
+
+			Element  u, v, u0, v0, u1, v1, u2, v2, q, r;
+
+			u1 = 1; v1 = 0;
+			u2 = 0; v2 = 1;
+			u = a; v = b;
+
+			while (v != 0) {
+				q = u / v;
+				//r = u % v;
+				r = u - q*v;
+				u = v;
+				v = r;
+				u0 = u2;
+				v0 = v2;
+				u2 =  u1 - q*u2;
+				v2 = v1- q*v2;
+				u1 = u0;
+				v1 = v0;
+			}
+
+
+			d = u;
+			s = u1;
+			t = v1;
+			return d;
+
+		}
+
+
+		/** @brief
+		 * Half GCD
+		 * g = gcd (a, b).
+		 * exists t, such that: s * a + t * b = g.
+		 * return g.
+		 */
+		Element& HGCD (Element& g, Element& s, const Element& a, const  Element& b) const {
+
+			Element  u, v, u0, u1, u2, q, r;
+
+			u1 = 1;
+			u2 = 0;
+			u = a; v = b;
+
+			while (v != 0) {
+				q = u / v;
+				//r = u % v;
+				r = u - q*v;
+				u = v;
+				v = r;
+
+				u0 = u2;
+
+				u2 =  u1 - q*u2;
+
+				u1 = u0;
+
+			}
+
+
+			g = u;
+			s = u1;
+
+			return g;
+
+		}
+
+	};
+
+	template<>
+	bool FieldTraits< Local2_32 >::goodModulus( const integer& i ) {
+		return i == Local2_32::maxCardinality();
+	}
+
+} // namespace LinBox
+
+#endif // __LINBOX_local2_32_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/modular.h b/linbox/ring/modular.h
new file mode 100644
index 0000000..9d5badd
--- /dev/null
+++ b/linbox/ring/modular.h
@@ -0,0 +1,156 @@
+/* linbox/ring/modular.h
+ * Copyright (C) 1999-2001 William J Turner,
+ *               2001 Bradford Hovinen
+ *
+ * Written by William J Turner <wjturner at math.ncsu.edu>,
+ *            Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * ------------------------------------
+ * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * LargeGivaro::Modular is now replace by a class Givaro::Modular parameterized on the element
+ * type. So, the old LargeGivaro::Modular is equivalent to Givaro::Modular<integer>. All other
+ * interface details are exactly the same.
+ *
+ * Renamed from large-modular.h to modular.h
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file ring/modular.h
+ * @ingroup ring
+ * @brief A Givaro::Modular ring is a representations of <code>Z/mZ</code>.
+ * This file groups many implementations/specialisations of modular rings.
+ *   - Givaro::Modular arithmetic is provided in the <code>ModularXXX<T></code> classes.
+ *   - Specialisations for \ref FieldAXPY, \ref MVProductDomain, \ref DotProductDomain.
+ *   - Random Iterators
+ *   .
+ *
+ * @bug move Element& init(const Element&) to FFPACK. use using more..
+ */
+
+#ifndef __LINBOX_ring_modular_H
+#define __LINBOX_ring_modular_H
+
+#include <givaro/modular.h>
+#include <givaro/modular-balanced.h>
+#include <givaro/gfq.h>
+#include <iostream>
+#include <climits>
+#include <cmath>
+
+#include "linbox/integer.h"
+#include "linbox/field/field-interface.h"
+#include "linbox/util/field-axpy.h"
+#include "linbox/util/write-mm.h"
+#include "linbox/vector/vector-traits.h"
+#include "linbox/linbox-config.h"
+#include "linbox/field/field-traits.h"
+
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{ /* Givaro::Modular Base */
+
+	using Givaro::Caster;
+
+	template <class Ring>
+	struct ClassifyRing;
+
+	template <class Element, class Compute>
+	struct ClassifyRing<Givaro::Modular<Element,Compute> const>
+	{
+		typedef RingCategories::ModularTag categoryTag;
+	};
+
+	template <class Element, class Compute>
+	struct ClassifyRing<Givaro::Modular<Element,Compute>>
+	{
+		typedef RingCategories::ModularTag categoryTag;
+	};
+
+        template<class Element>
+        struct ClassifyRing<Givaro::ModularBalanced<Element> > {
+                typedef RingCategories::ModularTag categoryTag;
+        };
+
+        template<typename XXX>
+        struct ClassifyRing<Givaro::GFqDom<XXX>> {
+                typedef RingCategories::ModularTag categoryTag;
+        };
+
+
+
+
+
+/*
+	template <>
+	inline std::ostream& Givaro::ModularBase<Integer>::write (std::ostream &os) const
+	{
+		return os << "GMP integers mod " << _modulus;
+	}
+*/
+
+	// template <>
+	// inline integer& Givaro::Modular<integer>::init (integer& x, const double& y) const
+	// {
+	// 	integer tmp = (integer)y % _modulus;
+	// 	if (tmp<0) tmp += _modulus;
+	// 	return x = tmp;
+	// }
+
+
+
+
+
+} // namespace LinBox
+
+
+#include "linbox/vector/vector-domain.h"
+
+namespace LinBox {
+	template<class Field>
+	class MVProductDomain ;
+
+} // LinBox
+
+
+/*! Specialization of FieldAXPY and DotProducts for parameterized modular field */
+#include "linbox/ring/modular/modular-int32.h"
+#include "linbox/ring/modular/modular-int64.h"
+#include "linbox/ring/modular/modular-short.h"
+#include "linbox/ring/modular/modular-byte.h"
+#include "linbox/ring/modular/modular-double.h"
+#include "linbox/ring/modular/modular-float.h"
+#include "linbox/ring/modular/modular-unsigned.h"
+
+#endif // __LINBOX_field_modular_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+
diff --git a/linbox/ring/modular/Makefile.am b/linbox/ring/modular/Makefile.am
new file mode 100644
index 0000000..7234edb
--- /dev/null
+++ b/linbox/ring/modular/Makefile.am
@@ -0,0 +1,43 @@
+# Copyright (c) 2010 the LinBox group
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the  GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# ========LICENCE========
+
+
+
+pkgincludesubdir=$(pkgincludedir)/ring/modular
+
+BASIC_HDRS =            \
+    modular-unsigned.h  \
+    modular-unsigned.inl         \
+    modular-int32.h     \
+    modular-int64.h     \
+    modular-short.h     \
+    modular-byte.h      \
+    modular-balanced-double.h   \
+    modular-balanced-float.h    \
+    modular-balanced-int32.h    \
+    modular-balanced-int64.h    \
+    modular-double.h    \
+    modular-float.h
+
+
+pkgincludesub_HEADERS =     \
+    $(BASIC_HDRS)
+
+#  EXTRA_DIST =            \
+    #  modular.doxy
diff --git a/linbox/ring/modular/modular-balanced-double.h b/linbox/ring/modular/modular-balanced-double.h
new file mode 100644
index 0000000..b6868a6
--- /dev/null
+++ b/linbox/ring/modular/modular-balanced-double.h
@@ -0,0 +1,237 @@
+/* linbox/field/modular-balanced-double.h
+ * Copyright (C) 2003 Pascal Giorgi
+ *               2005,2008 Clement Pernet
+ * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
+ * and Clement Pernet <Clement.Pernet at imag.fr>
+ *
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file field/modular/modular-balanced-double.h
+ * @ingroup field
+ * @brief Balanced representation of <code>Z/mZ</code> over \c double .
+ */
+
+#ifndef __LINBOX_modular_balanced_double_H
+#define __LINBOX_modular_balanced_double_H
+
+#ifdef __INTEL_COMPILER
+#define FmodF fmodf
+#else
+#define FmodF fmod
+#endif
+
+#include "linbox/linbox-config.h"
+#include "linbox/ring/modular.h"
+#include "linbox/integer.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/field/field-interface.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/util/field-axpy.h"
+#include "linbox/util/debug.h"
+#include <cmath>
+#include "linbox/field/field-traits.h"
+#include "linbox/randiter/modular-balanced.h"
+
+#include <givaro/modular-balanced-double.h>
+
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+
+	class MultiModDouble;
+
+	//! Specialization  of FieldAXPY.
+	template <>
+	class FieldAXPY<Givaro::ModularBalanced<double> > {
+	public:
+
+		typedef double Element;
+		typedef double Abnormal;
+		typedef Givaro::ModularBalanced<double> Field;
+
+		FieldAXPY (const Field &F) :
+			_field (&F),
+			_y(0.) , _bound( (double) ((1ULL << 53) - (unsigned long) (field().characteristic()*field().characteristic())))
+		{}
+
+		FieldAXPY (const FieldAXPY &faxpy) :
+			_field (faxpy._field),
+			_y(faxpy._y), _bound(faxpy._bound)
+		{}
+
+		FieldAXPY<Givaro::ModularBalanced<double> > &operator = (const FieldAXPY &faxpy)
+		{
+			_field = faxpy._field;
+			_y= faxpy._y;
+			_bound= faxpy._bound;
+			return *this;
+		}
+
+		inline Element& mulacc (const Element &a, const Element &x)
+		{
+			//                 Element tmp= a*x;
+			//                 return accumulate(tmp);
+			return accumulate(a*x);
+		}
+
+		inline Element& accumulate (const Element &tmp)
+		{
+			_y += tmp;
+			if (_y > _bound)
+				return _y = fmod (_y, field().characteristic());
+			else
+				return _y;
+		}
+		inline Element& subumulate (const Element &tmp)
+		{
+			_y -= tmp;
+			if (_y < 0)
+				return _y += field().characteristic();
+			else
+				return _y;
+		}
+
+		inline Element& get (Element &y) {
+			_y = fmod (_y, field().characteristic());
+			return y=_y ;
+		}
+
+		inline FieldAXPY &assign (const Element y) {
+			_y = y;
+			return *this;
+		}
+
+		inline void reset() {
+			_y = 0.;
+		}
+
+		inline Element& set (const Element &tmp) {
+			_y = tmp;
+			if (_y > _bound)
+				return _y = fmod (_y, field().characteristic());
+			else
+				return _y;
+		}
+
+		inline const Field & field() const { return *_field; }
+	private:
+
+		const Field *_field;
+		double _y;
+		double _bound;
+	};
+
+
+	//! Specialization  of DotProductDomain.
+	template <>
+	class DotProductDomain<Givaro::ModularBalanced<double> > : public  VectorDomainBase<Givaro::ModularBalanced<double> > {
+	private:
+		double _bound;
+		size_t _nmax;
+
+	public:
+		typedef double Element;
+		DotProductDomain(){}
+		DotProductDomain (const Givaro::ModularBalanced<double> &F) :
+			VectorDomainBase<Givaro::ModularBalanced<double> > (F), _bound( (double) ( (1ULL<<53) - (unsigned long) (field().characteristic()*field().characteristic())))
+		{
+			_nmax= (size_t)floor((double(1<<26)* double(1<<26)*2.)/ (field().characteristic() * field().characteristic()));
+		}
+
+		using VectorDomainBase<Givaro::ModularBalanced<double> >::field;
+	protected:
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+
+			double y = 0.;
+			if (v1.size() < _nmax) {
+				for (size_t i = 0; i< v1.size();++i)
+					y += v1[i] * v2[i] ;
+				// y = fmod(y, field().characteristic());
+				field().init(res, y);
+			}
+			else{
+				size_t i=0;
+				double t = 0.;
+				for (;i< v1.size()- _nmax ;i=i+_nmax){
+					for (size_t j=i;j<i+_nmax;++j)
+						y += v1[j] * v2[j];
+					t+=fmod(y, field().characteristic());
+					y=0.;
+				}
+				for (;i < v1.size();++i)
+					y += v1[i] * v2[i];
+				t+=fmod(y, field().characteristic());
+				// y = fmod(t, field().characteristic());
+				field().init(res, t);
+			}
+			return res;
+		}
+
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+
+			double y = 0.;
+
+
+			if (v1.first.size() < _nmax) {
+				for (size_t i=0;i<v1.first.size();++i)
+					y+= v1.second[i] * v2[v1.first[i]];
+				// y = fmod(y, field().characteristic());
+				field().init(res, y);
+			}
+			else {
+				double t =0.;
+				size_t i=0;
+				for (;i< v1.first.size()- _nmax ;i=i+_nmax){
+					for (size_t j=i;j<i+_nmax;++j)
+						y += v1.second[j] * v2[v1.first[j]];
+					t+=fmod(y, field().characteristic());
+					y=0.;
+				}
+				for (;i < v1.first.size();++i)
+					y += v1.second[i] * v2[v1.first[i]];
+				t+= fmod(y, field().characteristic());
+				// y = fmod(t, field().characteristic());
+				field().init(res, t);
+			}
+			return res ;
+		}
+	};
+}
+
+#endif //__LINBOX_modular_balanced_double_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/modular/modular-balanced-float.h b/linbox/ring/modular/modular-balanced-float.h
new file mode 100644
index 0000000..2f63eff
--- /dev/null
+++ b/linbox/ring/modular/modular-balanced-float.h
@@ -0,0 +1,232 @@
+/* field/modular-balanced-float.h
+ * Copyright (C) 2003 Pascal Giorgi
+ *               2005,2008 Clement Pernet
+ * Written by Clement Pernet <clement.pernet at gmail.com>
+ *            Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
+ * Modified   Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file field/modular/modular-balanced-float.h
+ * @ingroup field
+ * @brief Balanced  representation of <code>Z/mZ</code> over \c float .
+ */
+
+#ifndef __LINBOX_modular_balanced_float_H
+#define __LINBOX_modular_balanced_float_H
+
+#ifdef __INTEL_COMPILER
+#define FmodF fmodf
+#else
+#define FmodF fmod
+#endif
+
+#include "linbox/linbox-config.h"
+#include "linbox/integer.h"
+#include "linbox/ring/modular.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/field/field-interface.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/util/field-axpy.h"
+#include "linbox/util/debug.h"
+#include <cmath>
+#include "linbox/field/field-traits.h"
+#include "linbox/randiter/modular-balanced.h"
+
+#include <givaro/modular-balanced-float.h>
+
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+
+	class MultiModFloat;
+
+	template <>
+	class FieldAXPY<Givaro::ModularBalanced<float> > {
+	public:
+		typedef float Element;
+		typedef float Abnormal;
+		typedef Givaro::ModularBalanced<Element> Field;
+
+		FieldAXPY (const Field &F) :
+			_field (&F),
+			_y(0.) , _bound( (Element) (((1UL << 24) - (unsigned long) (field().characteristic()*field().characteristic()))))
+		{}
+
+		FieldAXPY (const FieldAXPY &faxpy) :
+			_field (faxpy._field),
+			_y(faxpy._y), _bound(faxpy._bound)
+		{}
+
+		FieldAXPY<Givaro::ModularBalanced<Element> > &operator = (const FieldAXPY &faxpy) {
+			_field = faxpy._field;
+			_y= faxpy._y;
+			_bound= faxpy._bound;
+			return *this;
+		}
+
+		inline Element& mulacc (const Element &a, const Element &x) {
+			//                 Element tmp= a*x;
+			//                 return accumulate(tmp);
+			return accumulate(a*x);
+		}
+
+		inline Element& accumulate (const Element &tmp) {
+			_y += tmp;
+			if (_y > _bound)
+				return _y = fmodf (_y, field().characteristic());
+			else
+				return _y;
+		}
+		inline Element& subumulate (const Element &tmp) {
+			_y -= tmp;
+			if (_y < 0)
+				return _y += field().characteristic();
+			else
+				return _y;
+		}
+
+		inline Element& get (Element &y) {
+			_y =  fmodf (_y, field().characteristic());
+			return y=_y ;
+		}
+
+		inline FieldAXPY &assign (const Element y) {
+			_y = y;
+			return *this;
+		}
+
+		inline void reset() {
+			_y = 0.;
+		}
+
+		inline Element& set (const Element &tmp) {
+			_y = tmp;
+			if (_y > _bound)
+				return _y =  fmodf (_y, field().characteristic());
+			else
+				return _y;
+		}
+
+		inline const Field & field() const { return *_field; }
+
+	private:
+		const Field *_field;
+		Element _y;
+		Element _bound;
+	};
+
+
+	template <>
+	class DotProductDomain<Givaro::ModularBalanced<float> > : public  VectorDomainBase<Givaro::ModularBalanced<float> > {
+	public:
+		typedef float Element;
+		DotProductDomain(){}
+		DotProductDomain (const Givaro::ModularBalanced<Element> &F) :
+			VectorDomainBase<Givaro::ModularBalanced<Element> > (F), _bound( (Element) ( (1UL<<24) - (unsigned long) (field().characteristic()*field().characteristic())))
+		{
+			_nmax= (size_t)floor((Element(1<<11)* Element(1<<11)*2.)/ (field().characteristic() * field().characteristic()));
+		}
+
+		using VectorDomainBase<Givaro::ModularBalanced<Element> >::field;
+	protected:
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+
+			Element y = 0.;
+			if (v1.size() < _nmax) {
+				for (size_t i = 0; i< v1.size();++i)
+					y += v1[i] * v2[i] ;
+				y =  fmodf(y, field().characteristic());
+			}
+			else{
+			Element t = 0.;
+				size_t i=0;
+				for (;i< v1.size()- _nmax ;i=i+_nmax){
+					for (size_t j=i;j<i+_nmax;++j)
+						y += v1[j] * v2[j];
+					t+= fmodf(y, field().characteristic());
+					y=0.;
+				}
+				for (;i < v1.size();++i)
+					y += v1[i] * v2[i];
+				t+= fmodf(y, field().characteristic());
+				y = fmodf(t, field().characteristic());
+			}
+			//!@bug should not be neccessary (use assign)
+			return field().init(res, y);
+		}
+
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+
+			Element y = 0.;
+
+
+			if (v1.first.size() < _nmax) {
+				for (size_t i=0;i<v1.first.size();++i)
+					y+= v1.second[i] * v2[v1.first[i]];
+				y = fmodf(y, field().characteristic());
+			}
+			else {
+			Element t =0.;
+				size_t i=0;
+				for (;i< v1.first.size()- _nmax ;i=i+_nmax){
+					for (size_t j=i;j<i+_nmax;++j)
+						y += v1.second[j] * v2[v1.first[j]];
+					t+=fmodf(y, field().characteristic());
+					y=0.;
+				}
+				for (;i < v1.first.size();++i)
+					y += v1.second[i] * v2[v1.first[i]];
+				t+= fmodf(y, field().characteristic());
+				y = fmodf(t, field().characteristic());
+			}
+			//!@bug should not be neccessary (use assign)
+			return field().init(res, y);
+		}
+	private:
+		Element _bound;
+		size_t _nmax;
+
+	};
+} // Namespace LinBox
+
+#include "linbox/randiter/modular-balanced.h"
+
+#undef FmodF
+
+#endif //__LINBOX_modular_balanced_float_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/modular/modular-balanced-int32.h b/linbox/ring/modular/modular-balanced-int32.h
new file mode 100644
index 0000000..d5af755
--- /dev/null
+++ b/linbox/ring/modular/modular-balanced-int32.h
@@ -0,0 +1,265 @@
+/* Copyright (C) 2009 LinBox
+ * Written by C Pernet
+ * updated to compilable condition by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+/*! @file field/modular/modular-balanced-int32.h
+ * @ingroup field
+ * @brief Balanced representation of <code>Z/mZ</code> over \c int32_t .
+ */
+
+#ifndef __LINBOX_modular_balanced_int32_H
+#define __LINBOX_modular_balanced_int32_H
+
+
+#include "linbox/linbox-config.h"
+#include "linbox/integer.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/ring/modular.h"
+#include "linbox/field/field-interface.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/util/field-axpy.h"
+#include "linbox/util/debug.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/field/modular/modular-int32.h"
+
+#include <givaro/modular-balanced-int32.h>
+
+#ifndef LINBOX_MAX_INT /* 2147483647 */
+#define LINBOX_MAX_INT INT32_MAX
+#endif
+
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+
+	template <>
+	class FieldAXPY<Givaro::ModularBalanced<int32_t> > {
+	public:
+
+		typedef int32_t Element;
+		typedef int64_t Abnormal;
+		typedef Givaro::ModularBalanced<int32_t> Field;
+
+		FieldAXPY (const Field &F) :
+			_field (&F),_y(0),_times(0)
+		{
+		}
+
+
+		FieldAXPY (const FieldAXPY &faxpy) :
+			_field (faxpy._field), _y (0),_times(0)
+		{}
+
+		FieldAXPY<Givaro::ModularBalanced<int32_t> > &operator = (const FieldAXPY &faxpy)
+		{
+			_field = faxpy._field;
+			_y = faxpy._y;
+			_times = faxpy._times;
+			return *this;
+		}
+
+		inline int64_t& mulacc (const Element &a, const Element &x)
+		{
+			int64_t t = (int64_t) a * (int64_t)   x;
+			if (_times < blocksize) {
+				++_times;
+				return _y += t;
+			}
+
+			else {
+				_times = 1;
+				normalize();
+				return _y += t;
+			}
+		}
+
+		inline int64_t& accumulate (const Element &t)
+		{
+			if (_times < blocksize) {
+				++_times;
+				return _y += t;
+			}
+
+			else {
+				_times = 1;
+				normalize();
+				return _y += t;
+			}
+		}
+
+		inline Element& get (Element &y)
+		{
+
+			normalize();
+
+			y = Element(_y);
+
+			if (y > field().half_mod)
+				y -= field().characteristic();
+			else if (y < field().mhalf_mod)
+				y += field().characteristic();
+
+			return y;
+		}
+
+		inline FieldAXPY &assign (const Element y)
+		{
+			_y = y;
+			return *this;
+		}
+
+		inline void reset()
+		{
+			_y = 0;
+		}
+
+		inline const Field & field() const { return *_field; }
+
+	private:
+
+		const Field *_field;
+		int64_t _y;
+		int32_t _times;
+		static const int32_t blocksize = 32;
+
+		inline void normalize()
+		{
+			_y = (int32_t)_y -(int32_t)(int64_t)((double) _y * field().modulusinv) * (int32_t)field().characteristic();
+		}
+
+	};
+
+
+	template <>
+	class DotProductDomain<Givaro::ModularBalanced<int32_t> > : public  VectorDomainBase<Givaro::ModularBalanced<int32_t> > {
+
+	private:
+		int32_t blocksize;
+
+	public:
+		typedef int32_t Element;
+		DotProductDomain(){}
+		DotProductDomain (const Givaro::ModularBalanced<int32_t> &F) :
+			VectorDomainBase<Givaro::ModularBalanced<int32_t> > (F) ,blocksize(32)
+		{ }
+
+		using VectorDomainBase<Givaro::ModularBalanced<int32_t> >::field;
+	protected:
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+
+			typename Vector1::const_iterator pv1,pv1e;
+			typename Vector2::const_iterator pv2;
+
+			int64_t y = 0;
+			int64_t t;
+			// int32_t times = 0;
+
+			pv1 = pv1e = v1.begin();
+			pv2 = v2.begin();
+
+			for(size_t i = 0; i < v1.size() / (size_t)blocksize ;++i) {
+				pv1e = pv1e + blocksize;
+				for(;pv1 != pv1e;++pv1,++pv2) {
+					t = (((int64_t) *pv1 ) * ((int64_t) *pv2 ));
+					y += t;
+				}
+				normalize(y);
+			}
+
+			for(;pv1 != v1.end(); ++pv1, ++pv2) {
+				t = (((int64_t) *pv1 ) * ((int64_t) *pv2 ));
+				y += t;
+			}
+
+			normalize(y);
+			res = (Element) y;
+
+			if (res > field().half_mod) res -= field().characteristic();
+			else if(res < field().mhalf_mod) res += field().characteristic();
+
+			return res;
+
+		}
+
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+
+			typename Vector1::first_type::const_iterator i_idx, i_idxe;
+			typename Vector1::second_type::const_iterator i_elt;
+
+			int64_t y = 0;
+			int64_t t;
+
+			i_idx = i_idxe = v1.first.begin();
+			i_elt = v1.second.begin();
+
+			for(size_t i = 0; i < v1.first.size() / (size_t)blocksize ; ++i) {
+				i_idxe = i_idxe + blocksize;
+				for(;i_idx!= i_idxe;++i_idx, ++i_elt) {
+					t = ( (int64_t) *i_elt ) * ( (int64_t) v2[*i_idx] );
+					y += t;
+				}
+				normalize(y);
+			}
+
+
+			for(;i_idx!= v1.first.end();++i_idx, ++i_elt) {
+				t = ( (int64_t) *i_elt ) * ( (int64_t) v2[*i_idx] );
+				y += t;
+			}
+
+			normalize(y);
+
+			res = (Element) y;
+			if (res > field().half_mod) res -= field().characteristic();
+			else if(res < field().mhalf_mod) res += field().characteristic();
+
+			return res;
+		}
+
+		inline void normalize(int64_t& _y) const
+		{
+			_y = (int32_t)_y -(int32_t)(int64_t)((double) _y * field().modulusinv) * (int32_t)field().characteristic();
+		}
+
+	};
+}
+
+#include "linbox/randiter/modular-balanced.h"
+
+#endif //__LINBOX_modular_balanced_int32_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/ring/modular/modular-balanced-int64.h b/linbox/ring/modular/modular-balanced-int64.h
new file mode 100644
index 0000000..c5790ce
--- /dev/null
+++ b/linbox/ring/modular/modular-balanced-int64.h
@@ -0,0 +1,271 @@
+/* Copyright (C) 2010 LinBox
+ * Adapted by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ * (from other modular-balanced* files)
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+/*! @file field/modular/modular-balanced-int64.h
+ * @ingroup field
+ * @brief Balanced representation of <code>Z/mZ</code> over \c int64_t .
+ */
+
+#ifndef __LINBOX_modular_balanced_int64_H
+#define __LINBOX_modular_balanced_int64_H
+
+#include "linbox/linbox-config.h"
+#include "linbox/integer.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/ring/modular.h"
+#include "linbox/field/field-interface.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/util/field-axpy.h"
+#include "linbox/util/debug.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/field/modular/modular-int64.h"
+
+#include <givaro/modular-balanced-int64.h>
+
+#ifndef LINBOX_MAX_INT64
+#ifdef __x86_64__
+#define LINBOX_MAX_INT64 INT64_MAX
+#else
+#define LINBOX_MAX_INT64 INT64_MAX
+#endif
+#endif
+
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+
+
+	template <>
+	class FieldAXPY<Givaro::ModularBalanced<int64_t> > {
+	public:
+
+		typedef int64_t Element;
+		typedef int64_t Abnormal;
+		typedef Givaro::ModularBalanced<int64_t> Field;
+
+		FieldAXPY (const Field &F) :
+			_field (&F),_y(0),_times(0)
+		{
+		}
+
+
+		FieldAXPY (const FieldAXPY &faxpy) :
+			_field (faxpy._field), _y (0),_times(0)
+		{}
+
+		FieldAXPY<Givaro::ModularBalanced<int64_t> > &operator = (const FieldAXPY &faxpy)
+		{
+			_field = faxpy._field;
+			_y = faxpy._y;
+			_times = faxpy._times;
+			return *this;
+		}
+
+		inline int64_t& mulacc (const Element &a, const Element &x)
+		{
+			int64_t t = (int64_t) a * (int64_t)   x;
+			if (_times < blocksize) {
+				++_times;
+				return _y += t;
+			}
+
+			else {
+				_times = 1;
+				normalize();
+				return _y += t;
+			}
+		}
+
+		inline int64_t& accumulate (const Element &t)
+		{
+			if (_times < blocksize) {
+				++_times;
+				return _y += t;
+			}
+
+			else {
+				_times = 1;
+				normalize();
+				return _y += t;
+			}
+		}
+
+		inline Element& get (Element &y)
+		{
+
+			normalize();
+
+			y = Element(_y);
+
+			if (y > field().half_mod)
+				y -= field().characteristic();
+			else if (y < field().mhalf_mod)
+				y += field().characteristic();
+
+			return y;
+		}
+
+		inline FieldAXPY &assign (const Element y)
+		{
+			_y = y;
+			return *this;
+		}
+
+		inline void reset()
+		{
+			_y = 0;
+		}
+
+		inline const Field & field() const { return *_field; }
+
+	private:
+
+		const Field *_field;
+		int64_t _y;
+		int64_t _times;
+		//!@todo tune me ?
+		static const int64_t blocksize = 32;
+
+		inline void normalize()
+		{
+			_y = (int64_t)_y -(int64_t)(int64_t)((double) _y * field().modulusinv) * (int64_t)field().characteristic();
+		}
+
+	};
+
+
+	template <>
+	class DotProductDomain<Givaro::ModularBalanced<int64_t> > : public virtual VectorDomainBase<Givaro::ModularBalanced<int64_t> > {
+
+	private:
+		int64_t blocksize;
+
+	public:
+		typedef int64_t Element;
+		DotProductDomain(){}
+		DotProductDomain (const Givaro::ModularBalanced<int64_t> &F) :
+			VectorDomainBase<Givaro::ModularBalanced<int64_t> > (F) ,blocksize(32)
+		{ }
+
+		using VectorDomainBase<Givaro::ModularBalanced<int64_t> >::field;
+	protected:
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+
+			typename Vector1::const_iterator pv1,pv1e;
+			typename Vector2::const_iterator pv2;
+
+			int64_t y = 0;
+			int64_t t;
+			// int64_t times = 0;
+
+			pv1 = pv1e = v1.begin();
+			pv2 = v2.begin();
+
+			for(size_t i = 0; i < v1.size() / (size_t)blocksize ;++i) {
+				pv1e = pv1e + blocksize;
+				for(;pv1 != pv1e;++pv1,++pv2) {
+					t = (((int64_t) *pv1 ) * ((int64_t) *pv2 ));
+					y += t;
+				}
+				normalize(y);
+			}
+
+			for(;pv1 != v1.end(); ++pv1, ++pv2) {
+				t = (((int64_t) *pv1 ) * ((int64_t) *pv2 ));
+				y += t;
+			}
+
+			normalize(y);
+			res = (Element) y;
+
+			if (res > field().half_mod) res -= field().characteristic();
+			else if(res < field().mhalf_mod) res += field().characteristic();
+
+			return res;
+
+		}
+
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+
+			typename Vector1::first_type::const_iterator i_idx, i_idxe;
+			typename Vector1::second_type::const_iterator i_elt;
+
+			int64_t y = 0;
+			int64_t t;
+
+			i_idx = i_idxe = v1.first.begin();
+			i_elt = v1.second.begin();
+
+			for(size_t i = 0; i < v1.first.size() / (size_t)blocksize ; ++i) {
+				i_idxe = i_idxe + blocksize;
+				for(;i_idx!= i_idxe;++i_idx, ++i_elt) {
+					t = ( (int64_t) *i_elt ) * ( (int64_t) v2[*i_idx] );
+					y += t;
+				}
+				normalize(y);
+			}
+
+
+			for(;i_idx!= v1.first.end();++i_idx, ++i_elt) {
+				t = ( (int64_t) *i_elt ) * ( (int64_t) v2[*i_idx] );
+				y += t;
+			}
+
+			normalize(y);
+
+			res = (Element) y;
+			if (res > field().half_mod) res -= field().characteristic();
+			else if(res < field().mhalf_mod) res += field().characteristic();
+
+			return res;
+		}
+
+		inline void normalize(int64_t& _y) const
+		{
+			_y = (int64_t)_y -(int64_t)(int64_t)((double) _y * field().modulusinv) * (int64_t)field().characteristic();
+		}
+
+	};
+}
+
+#undef LINBOX_MAX_INT64
+
+#endif //__LINBOX_modular_balanced_int64_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/modular/modular-byte.h b/linbox/ring/modular/modular-byte.h
new file mode 100644
index 0000000..57a83cb
--- /dev/null
+++ b/linbox/ring/modular/modular-byte.h
@@ -0,0 +1,388 @@
+/* Copyright (C) 2010 LinBox
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file field/modular/modular-byte.h
+ * @ingroup field
+ * @brief  representation of <code>Z/mZ</code> over \c byte .
+ */
+#ifndef __LINBOX_modular_bit_H
+#define __LINBOX_modular_bit_H
+
+
+#include "linbox/linbox-config.h"
+#include "linbox/integer.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/field/field-interface.h"
+#include "linbox/ring/modular.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/util/debug.h"
+#include "linbox/field/field-traits.h"
+
+#ifndef LINBOX_MAX_INT8 /* 127 */
+#define LINBOX_MAX_INT8 INT8_MAX
+#endif
+
+#ifdef __ICC
+#pragma warning(disable:2259)
+#endif
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+
+	template<class Field>
+	class FieldAXPY;
+
+	template<class Field>
+	class DotProductDomain;
+
+	template<class Field>
+	class MVProductDomain;
+
+	template <>
+	class FieldAXPY<Givaro::Modular<int8_t> > {
+	public:
+
+		typedef int8_t Element;
+		typedef int64_t Abnormal;
+		typedef Givaro::Modular<int8_t> Field;
+
+		FieldAXPY (const Field &F) :
+			_field (&F),_y(0)
+		{
+		}
+
+		FieldAXPY (const FieldAXPY &faxpy) :
+			_field (faxpy._field), _y (0)
+		{}
+
+		FieldAXPY<Givaro::Modular<int8_t> > &operator = (const FieldAXPY &faxpy)
+		{
+			_field = faxpy._field;
+			_y = faxpy._y;
+
+			return *this;
+		}
+
+		inline uint64_t& mulacc (const Element &a, const Element &x)
+		{
+			uint64_t t = ( (uint16_t) a ) * ( (uint16_t) x );
+			return _y +=t;
+		}
+
+		inline uint64_t& accumulate (const Element &t)
+		{
+			return _y += (uint64_t)t;
+		}
+
+		inline Element& get (Element &y)
+		{
+			y = Element(_y % (uint64_t) field().characteristic());
+			return y;
+		}
+
+		inline FieldAXPY &assign (const Element y)
+		{
+			_y = (uint64_t) y;
+			return *this;
+		}
+
+		inline void reset()
+		{
+			_y = 0;
+		}
+
+		inline const Field & field() const { return *_field; }
+
+	private:
+
+		const Field *_field;
+		uint64_t _y;
+		// uint8_t _two_64; // BB : not used
+	};
+
+
+	template <>
+	class DotProductDomain<Givaro::Modular<int8_t> > : public VectorDomainBase<Givaro::Modular<int8_t> > {
+
+	public:
+		typedef int8_t Element;
+		DotProductDomain(){}
+		DotProductDomain (const Givaro::Modular<int8_t> &F) :
+			VectorDomainBase<Givaro::Modular<int8_t> > (F)
+		{ }
+
+		using VectorDomainBase<Givaro::Modular<int8_t> >::field;
+	protected:
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+
+			typename Vector1::const_iterator i;
+			typename Vector2::const_iterator j;
+
+			uint64_t y = 0;
+			// uint64_t t;
+
+			for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j) {
+				y  += ( (uint16_t) *i ) * ( (uint16_t) *j );
+			}
+
+
+			y %= (uint64_t) field().characteristic();
+
+			return res = (Element) y;
+
+		}
+
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+			typename Vector1::first_type::const_iterator i_idx;
+			typename Vector1::second_type::const_iterator i_elt;
+
+			uint64_t y = 0;
+
+			for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt) {
+				y += ( (uint16_t) *i_elt ) * ( (uint16_t) v2[*i_idx] );
+			}
+
+			y %= (uint64_t) field().characteristic();
+
+			return res = (Element)y;
+
+		}
+
+	};
+
+
+	template <>
+	class MVProductDomain<Givaro::Modular<int8_t> >
+	{
+	public:
+
+		typedef int8_t Element;
+
+	protected:
+		template <class Vector1, class Matrix, class Vector2>
+		inline Vector1 &mulColDense
+		(const VectorDomain<Givaro::Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
+		{
+			return mulColDenseSpecialized
+			(VD, w, A, v, VectorTraits<typename Matrix::Column>::VectorCategory ());
+		}
+
+	private:
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Givaro::Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::DenseVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Givaro::Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseSequenceVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Givaro::Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseAssociativeVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Givaro::Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseParallelVectorTag) const;
+
+		mutable std::vector<uint64_t> _tmp;
+	};
+
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<int8_t> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::DenseVectorTag) const
+	{
+
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::const_iterator k;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i) {
+			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+				t = ((uint16_t) *k) * ((uint16_t) *j);
+
+				*l += t;
+
+			}
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l % VD.field().characteristic();
+
+		return w;
+	}
+
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<int8_t> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseSequenceVectorTag) const
+	{
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::const_iterator k;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i) {
+			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+				t = ((uint16_t) k->second) * ((uint16_t) *j);
+
+				_tmp[k->first] += t;
+
+			}
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l % VD.field().characteristic();
+
+		return w;
+	}
+
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<int8_t> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseAssociativeVectorTag) const
+	{
+
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::const_iterator k;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i) {
+			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+				t = ((uint16_t) k->second) * ((uint16_t) *j);
+
+				_tmp[k->first] += t;
+
+			}
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l % VD.field().characteristic();
+
+		return w;
+	}
+
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<int8_t> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<int8_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseParallelVectorTag) const
+	{
+
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::first_type::const_iterator k_idx;
+		typename Matrix::Column::second_type::const_iterator k_elt;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i) {
+			for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
+			     k_idx != i->first.end ();
+			     ++k_idx, ++k_elt, ++l)
+			{
+				t = ((uint16_t) *k_elt) * ((uint16_t) *j);
+
+				_tmp[*k_idx] += t;
+
+			}
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l % VD.field().characteristic();
+
+		return w;
+	}
+
+}
+
+#ifdef __ICC
+#pragma warning(enable:2259)
+#endif
+
+
+#endif //__LINBOX_modular_bit_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/modular/modular-double.h b/linbox/ring/modular/modular-double.h
new file mode 100644
index 0000000..28add17
--- /dev/null
+++ b/linbox/ring/modular/modular-double.h
@@ -0,0 +1,242 @@
+/* linbox/field/modular-double.h
+ * Copyright (C) 2003 Pascal Giorgi
+ *
+ * Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
+ *
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file field/modular/modular-double.h
+ * @ingroup field
+ * @brief Standard representation of <code>Z/mZ</code> over \c double .
+ */
+
+#ifndef __LINBOX_modular_double_H
+#define __LINBOX_modular_double_H
+
+#include <cmath>
+#include <givaro/modular-double.h>
+
+#include "linbox/linbox-config.h"
+#include "linbox/integer.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/ring/modular.h"
+#include "linbox/field/field-interface.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/util/field-axpy.h"
+#include "linbox/util/debug.h"
+
+#include "linbox/util/write-mm.h"
+
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+	class MultiModDouble;
+	
+}
+
+
+// FieldAXPY/DotProductDomain
+namespace LinBox
+{
+	template <>
+	class FieldAXPY<Givaro::Modular<double> > {
+	public:
+
+		typedef double Element;
+		typedef double Abnormal;
+		typedef Givaro::Modular<double> Field;
+
+		FieldAXPY (const Field &F) :
+			_field (&F) , //_invmod(1./field().fcharacteristic()),
+			_y(0.) , _bound( (double) ((1_i64 << 53) - (uint64_t) (field().characteristic()*field().characteristic())))
+		{}
+
+		FieldAXPY (const FieldAXPY &faxpy) :
+			_field (faxpy._field),// _invmod(faxpy._invmod) ,
+			_y(faxpy._y), _bound(faxpy._bound)
+		{}
+
+#if 0
+		FieldAXPY<Givaro::Modular<double> > &operator = (const FieldAXPY &faxpy)
+		{
+			_field = faxpy._field;
+			//_invmod= faxpy._invmod;
+			_y= faxpy._y;
+			_bound= faxpy._bound;
+			return *this;
+		}
+#endif
+
+		 Element& mulacc (const Element &a, const Element &x)
+		{
+			//                 Element tmp= a*x;
+			//                 return accumulate(tmp);
+			return accumulate(a*x);
+		}
+
+		 Element& accumulate (const Element &tmp)
+		{
+			_y += tmp;
+			if (_y > _bound)
+				return _y = fmod (_y, field().fcharacteristic());
+			else
+				return _y;
+		}
+
+		 Element& subumulate (const Element &tmp)
+		{
+			_y -= tmp;
+			if (_y < 0)
+				return _y += field().fcharacteristic();
+			else
+				return _y;
+		}
+
+		 Element& get (Element &y)
+		{
+			_y = fmod (_y, field().fcharacteristic());
+			return y=_y ;
+		}
+
+		 FieldAXPY &assign (const Element y)
+		{
+			_y = y;
+			return *this;
+		}
+
+		 void reset()
+		{
+			_y = 0.;
+		}
+
+		 Element& set (const Element &tmp)
+		{
+			_y = tmp;
+			if (_y > _bound)
+				return _y = fmod (_y, field().fcharacteristic());
+			else
+				return _y;
+		}
+
+		inline const Field & field() const { return *_field; }
+
+	protected:
+
+		const Field *_field;
+		//double _invmod;
+		double _y;
+		double _bound;
+	};
+
+	template <>
+	class DotProductDomain<Givaro::Modular<double> > : public  VectorDomainBase<Givaro::Modular<double> > {
+	private:
+		// double _bound; // BB : not used
+		size_t _nmax;
+		//double _invmod;
+
+	public:
+		//DotProductDomain () { /*std::cerr << "DPD-Md def cstor" << std::endl;*/ }
+		typedef double Element;
+		DotProductDomain (const Givaro::Modular<double> &F) :
+			VectorDomainBase<Givaro::Modular<double> > (F)
+			// , _bound( (double) ( (1ULL<<53) - (unsigned long int) (F.characteristic()*F.characteristic())))
+			, _nmax(0)//, _invmod(1./field().characteristic())
+		{
+			_nmax= (size_t)floor((double(1<<26)* double(1<<26)*2.)/ (F.fcharacteristic() * F.fcharacteristic()));
+			_nmax = (_nmax>0?_nmax:1);
+		}
+
+		using VectorDomainBase<Givaro::Modular<double> >::field;
+
+	protected:
+		template <class Vector1, class Vector2>
+		 Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+
+			double y = 0.;
+			if (v1.size() < _nmax) {
+				for (size_t i = 0; i< v1.size();++i)
+					y += v1[i] * v2[i] ;
+				y = fmod(y, field().fcharacteristic());
+			}
+			else{
+				double t = 0.;
+				size_t i=0;
+				for (;i< v1.size()- _nmax ;i=i+_nmax){
+					for (size_t j=i;j<i+_nmax;++j)
+						y += v1[j] * v2[j];
+					t+=fmod(y, field().fcharacteristic());
+					y=0.;
+				}
+				for (;i < v1.size();++i)
+					y += v1[i] * v2[i];
+				t+=fmod(y, field().fcharacteristic());
+				y = fmod(t, field().fcharacteristic());
+			}
+			return res = y;
+		}
+
+
+		template <class Vector1, class Vector2>
+		 Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+
+			double y = 0.;
+
+			if (v1.first.size() < _nmax) {
+				for (size_t i=0;i<v1.first.size();++i)
+					y+= v1.second[i] * v2[v1.first[i]];
+				y = fmod(y, field().fcharacteristic());
+			} else {
+				double t = 0.;
+				size_t i=0;
+				for (;i< v1.first.size()- _nmax ;i=i+_nmax){
+					for (size_t j=i;j<i+_nmax;++j)
+						y += v1.second[j] * v2[v1.first[j]];
+					t+=fmod(y, field().fcharacteristic());
+					y=0.;
+				}
+				for (;i < v1.first.size();++i)
+					y += v1.second[i] * v2[v1.first[i]];
+				t+= fmod(y, field().fcharacteristic());
+				y = fmod(t, field().fcharacteristic());
+			}
+			return res = y;
+		}
+	};
+}
+
+
+#endif //__LINBOX_modular_double_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/ring/modular/modular-float.h b/linbox/ring/modular/modular-float.h
new file mode 100644
index 0000000..c18d0fe
--- /dev/null
+++ b/linbox/ring/modular/modular-float.h
@@ -0,0 +1,214 @@
+/* linbox/field/modular-float.h
+ * Copyright (C) 2003 Pascal Giorgi
+ *               2007 Clement Pernet
+ * Written by Clement Pernet <cpernet at uwaterloo.ca>
+ *
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file field/modular/modular-float.h
+ * @ingroup field
+ * @brief  representation of <code>Z/mZ</code> over \c float .
+ */
+
+#ifndef __LINBOX_modular_float_H
+#define __LINBOX_modular_float_H
+
+#ifdef __INTEL_COMPILER
+#define FmodF fmodf
+#else
+#define FmodF fmod
+#endif
+
+#include <cmath>
+#include <givaro/modular-float.h>
+
+#include "linbox/linbox-config.h"
+#include "linbox/integer.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/ring/modular.h"
+#include "linbox/field/field-interface.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/util/field-axpy.h"
+#include "linbox/util/debug.h"
+#include "linbox/field/field-traits.h"
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+	class MultiModFloat;
+
+	template <>
+	class FieldAXPY<Givaro::Modular<float> > {
+	public:
+
+		typedef float Element;
+		typedef float Abnormal;
+		typedef Givaro::Modular<float> Field;
+
+		FieldAXPY (const Field &F) :
+			_field (&F) , //_invmod(1./field().fcharacteristic()),
+			_y(0.) , _bound( (float) ( (1_i32 << 23) - (uint32_t) (field().characteristic()*field().characteristic())))
+		{}
+
+		FieldAXPY (const FieldAXPY &faxpy) :
+			_field (faxpy._field),// _invmod(faxpy._invmod) ,
+			_y(faxpy._y), _bound(faxpy._bound)
+		{}
+
+		inline Element& mulacc (const Element &a, const Element &x)
+		{
+			Element tmp= a*x;
+			return accumulate(tmp);
+		}
+
+		inline Element& accumulate (const Element &tmp)
+		{
+			_y += tmp;
+			if (_y > _bound)
+				return _y = fmodf (_y, field().fcharacteristic());
+			else
+				return _y;
+		}
+
+		inline Element& get (Element &y)
+		{
+			_y = fmodf (_y, field().fcharacteristic());
+			return y=_y ;
+		}
+
+		inline FieldAXPY &assign (const Element y)
+		{
+			_y = y;
+			return *this;
+		}
+
+		inline void reset()
+		{
+			_y = 0.;
+		}
+
+		inline const Field & field() const { return *_field; }
+
+	private:
+
+		const Field *_field;
+		//float _invmod;
+		float _y;
+		float _bound;
+	};
+
+
+	template <>
+	class DotProductDomain<Givaro::Modular<float> > : public VectorDomainBase<Givaro::Modular<float> > {
+	private:
+		float _bound;
+		size_t _nmax;
+		//float _invmod;
+
+	public:
+		typedef float Element;
+		DotProductDomain (const Givaro::Modular<float> &F) :
+			VectorDomainBase<Givaro::Modular<float> > (F)
+			, _bound( (float) ( (1<<23) - (uint32_t) (F.characteristic()*F.characteristic())))
+			//, _invmod(1./field().fcharacteristic())
+		{
+			_nmax= (size_t)floor((double(1<<11)* double(1<<12))/ double(F.fcharacteristic() * F.fcharacteristic()));
+		}
+
+		using VectorDomainBase<Givaro::Modular<float> >::field;
+	protected:
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+
+			float y = 0.;
+			if (v1.size() < _nmax) {
+				for (size_t i = 0; i< v1.size();++i)
+					y += v1[i] * v2[i] ;
+				y = fmodf(y, field().fcharacteristic());
+			}
+			else {
+				float t = 0.;
+				size_t i=0;
+				for (;i< v1.size()- _nmax ;i=i+_nmax)
+				{
+					for (size_t j=i;j<i+_nmax;++j)
+						y += v1[j] * v2[j];
+					t+=fmodf(y, field().fcharacteristic());
+					y=0.;
+				}
+				for (;i < v1.size();++i)
+					y += v1[i] * v2[i];
+				t+=fmodf(y, field().fcharacteristic());
+				y = fmodf(t, field().fcharacteristic());
+			}
+			return res = y;
+		}
+
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+
+			float y = 0.;
+
+
+			if (v1.first.size() < _nmax)
+			{
+				for (size_t i=0;i<v1.first.size();++i)
+					y+= v1.second[i] * v2[v1.first[i]];
+				y = fmodf(y, field().fcharacteristic());
+			}
+			else
+			{
+				float t =0.;
+				size_t i=0;
+				for (;i< v1.first.size()- _nmax ;i=i+_nmax)
+				{
+					for (size_t j=i;j<i+_nmax;++j)
+						y += v1.second[j] * v2[v1.first[j]];
+					t+=fmodf(y, field().fcharacteristic());
+					y=0.;
+				}
+				for (;i < v1.first.size();++i)
+					y += v1.second[i] * v2[v1.first[i]];
+				t+= fmodf(y, field().fcharacteristic());
+				y = fmodf(t, field().fcharacteristic());
+			}
+			return res = y;
+		}
+	};
+}
+
+#undef FmodF
+
+#endif //__LINBOX_modular_float_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/ring/modular/modular-int32.h b/linbox/ring/modular/modular-int32.h
new file mode 100644
index 0000000..7c02cff
--- /dev/null
+++ b/linbox/ring/modular/modular-int32.h
@@ -0,0 +1,428 @@
+/* Copyright (C) 2010 LinBox
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file field/modular/modular-int32.h
+ * @ingroup field
+ * @brief  representation of <code>Z/mZ</code> over \c int32_t .
+ */
+#ifndef __LINBOX_modular_int32_H
+#define __LINBOX_modular_int32_H
+
+
+#include <cmath>
+#include <givaro/modular-int32.h>
+
+#include "linbox/linbox-config.h"
+#include "linbox/integer.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/field/field-interface.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/ring/modular.h"
+#include "linbox/util/debug.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/util/write-mm.h"
+
+#ifndef LINBOX_MAX_INT /* 2147483647 */
+#define LINBOX_MAX_INT INT32_MAX
+#endif
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+
+	template<class Field>
+	class DotProductDomain;
+	template<class Field>
+	class FieldAXPY;
+	template<class Field>
+	class MVProductDomain;
+
+	template <>
+	template<class Compute>
+	class FieldAXPY<Givaro::Modular<int32_t,Compute> > {
+	public:
+
+		typedef int32_t Element;
+		typedef int64_t Abnormal;
+		typedef Givaro::Modular<int32_t,Compute> Field;
+
+		FieldAXPY (const Field &F) : _field (&F), _y(0)
+		{
+			_two_64 = (uint64_t(1) << 32) % uint64_t(F.characteristic());
+			_two_64 = (_two_64 * _two_64) % uint64_t(F.characteristic());
+		}
+		
+		FieldAXPY (const FieldAXPY &faxpy) :
+			_two_64 (faxpy._two_64), _field (faxpy._field), _y (0)
+		{}
+
+		FieldAXPY<Field > &operator = (const FieldAXPY &faxpy)
+		{
+			_field = faxpy._field;
+			_y = faxpy._y;
+			_two_64 = faxpy._two_64;
+			return *this;
+		}
+
+		 uint64_t& mulacc (const Element &a, const Element &x)
+		{
+			uint64_t t = (uint64_t) a * (uint64_t) x;
+			_y += t;
+			if (_y < t) {
+				 _y += _two_64;
+				 return _y ;
+			}
+			else
+				return _y;
+		}
+
+		 uint64_t& accumulate (const Element &t)
+		{
+			_y += (uint64_t) t;
+			if (_y < (uint64_t)t)
+				return _y += _two_64;
+			else
+				return _y;
+		}
+
+		 Element& get (Element &y)
+		{
+			y = Element (_y % (uint64_t) field().characteristic());
+			return y;
+		}
+
+		 FieldAXPY &assign (const Element y)
+		{
+			_y = (uint64_t) y;
+			return *this;
+		}
+
+		 void reset()
+		{
+			_y = 0;
+		}
+
+		inline const Field & field() const { return *_field; }
+
+	public:
+		uint64_t _two_64;
+
+	protected:
+		const Field * _field;
+		uint64_t _y;
+	};
+
+
+	template <>
+	template <class Compute>
+	class DotProductDomain<Givaro::Modular<int32_t,Compute> > : public VectorDomainBase<Givaro::Modular<int32_t,Compute> > {
+
+	public:
+		typedef int32_t Element;
+		typedef Givaro::Modular<int32_t,Compute> Field;
+		DotProductDomain(){}
+		DotProductDomain (const Field&F) :
+			VectorDomainBase<Field> (F)
+		{}
+
+		using VectorDomainBase<Givaro::Modular<int32_t,Compute>>::faxpy;
+		using VectorDomainBase<Givaro::Modular<int32_t,Compute>>::field;
+
+
+	protected:
+		template <class Vector1, class Vector2>
+		 Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+
+			typename Vector1::const_iterator i;
+			typename Vector2::const_iterator j;
+
+			uint64_t y = 0;
+			uint64_t t;
+
+			for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j)
+			{
+				t = ( (uint64_t) *i ) * ( (uint64_t) *j );
+				y += t;
+
+				if (y < t)
+					y += (uint64_t) faxpy()._two_64;
+			}
+
+			y %= (uint64_t) field().characteristic();
+			return res = Element(y);
+
+		}
+
+		template <class Vector1, class Vector2>
+		 Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+			typename Vector1::first_type::const_iterator i_idx;
+			typename Vector1::second_type::const_iterator i_elt;
+
+			uint64_t y = 0;
+			uint64_t t;
+
+			for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt)
+			{
+				t = ( (uint64_t) *i_elt ) * ( (uint64_t) v2[*i_idx] );
+				y += t;
+
+				if (y < t)
+					y += (uint64_t) faxpy()._two_64;
+			}
+
+
+			y %= (uint64_t) field().characteristic();
+
+			return res = (Element) y;
+		}
+	};
+
+	// Specialization of MVProductDomain for int32_t modular field
+
+	template <>
+	template <class Compute>
+	class MVProductDomain<Givaro::Modular<int32_t,Compute> > {
+	public:
+
+		typedef int32_t Element;
+		typedef Givaro::Modular<int32_t,Compute> Field;
+
+	protected:
+		template <class Vector1, class Matrix, class Vector2>
+		 Vector1 &mulColDense
+		(const VectorDomain<Field> &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
+		{
+			return mulColDenseSpecialized
+			(VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
+		}
+
+	private:
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::DenseVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseSequenceVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseAssociativeVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseParallelVectorTag) const;
+
+		mutable std::vector<uint64_t> _tmp;
+	};
+
+	template <class Compute>
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<int32_t,Compute> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<int32_t,Compute> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::DenseVectorTag) const
+	{
+
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::const_iterator k;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () +(ptrdiff_t) w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i)
+		{
+			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+			{
+				t = ((uint64_t) *k) * ((uint64_t) *j);
+
+				*l += t;
+
+				if (*l < t)
+					*l += (uint64_t) VD.faxpy ()._two_64;
+			}
+		}
+
+		typename Vector1::iterator w_j;
+		typedef typename Vector1::value_type elements ;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = elements(*l % VD.field ().characteristic());
+
+		return w;
+	}
+
+	template <class Compute>
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<int32_t,Compute> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<int32_t,Compute> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseSequenceVectorTag) const
+	{
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator       i = A.colBegin ();
+		typename Vector2::const_iterator        j;
+		typename Matrix::Column::const_iterator k;
+		std::vector<uint64_t>::iterator         l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () +(ptrdiff_t) w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i) {
+			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+				t = ((uint64_t) k->second) * ((uint64_t) *j);
+
+				_tmp[k->first] += t;
+
+				if (_tmp[k->first] < t)
+					_tmp[k->first] += (uint64_t)VD.faxpy ()._two_64;
+			}
+		}
+
+		typename Vector1::iterator w_j;
+		typedef typename Vector1::value_type val_t;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = (val_t)( (int32_t)(*l) % VD.field ().characteristic() );
+
+		return w;
+	}
+
+	template <class Compute>
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<int32_t,Compute> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<int32_t,Compute> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseAssociativeVectorTag) const
+	{
+
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::const_iterator k;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () +(ptrdiff_t) w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i)
+		{
+			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+			{
+				t = ((uint64_t) k->second) * ((uint64_t) *j);
+
+				_tmp[k->first] += t;
+
+				if (_tmp[k->first] < t)
+					_tmp[k->first] += VD.faxpy ()._two_64;
+			}
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l % VD.field ().characteristic();
+
+		return w;
+	}
+
+	template <class Compute>
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<int32_t,Compute> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<int32_t,Compute> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseParallelVectorTag) const
+	{
+
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::first_type::const_iterator k_idx;
+		typename Matrix::Column::second_type::const_iterator k_elt;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () +(ptrdiff_t) w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i)
+		{
+			for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
+			     k_idx != i->first.end ();
+			     ++k_idx, ++k_elt, ++l)
+			{
+				t = ((uint64_t) *k_elt) * ((uint64_t) *j);
+
+				_tmp[*k_idx] += t;
+
+				if (_tmp[*k_idx] < t)
+					_tmp[*k_idx] += VD.faxpy()._two_64;
+			}
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l % VD.field().characteristic();
+
+		return w;
+	}
+
+
+}
+
+#endif //__LINBOX_modular_int32_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/ring/modular/modular-int64.h b/linbox/ring/modular/modular-int64.h
new file mode 100644
index 0000000..7a860a7
--- /dev/null
+++ b/linbox/ring/modular/modular-int64.h
@@ -0,0 +1,445 @@
+/* Copyright (C) 2010 LinBox
+ * Adapted by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ * (from other modular-balanced* files)
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file field/modular/modular-int64.h
+ * @ingroup field
+ * @brief  representation of <code>Z/mZ</code> over \c int64_t .
+ */
+#ifndef __LINBOX_modular_int64_H
+#define __LINBOX_modular_int64_H
+
+
+#include <cmath>
+#include "linbox/linbox-config.h"
+#include "linbox/integer.h"
+#include "linbox/ring/modular.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/field/field-interface.h"
+#include "linbox/field/field-traits.h"
+#include "linbox/util/debug.h"
+#include "linbox/field/field-traits.h"
+
+#include <givaro/modular-int64.h>
+
+#ifndef LINBOX_MAX_INT64 /*  18446744073709551615L(L) is UINT64_MAX*/
+#ifdef __x86_64__
+#define LINBOX_MAX_INT64 INT64_MAX
+#else
+#define LINBOX_MAX_INT64 INT64_MAX
+#endif
+#endif
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+
+	template<class Field>
+	class DotProductDomain;
+	template<class Field>
+	class FieldAXPY;
+	template<class Field>
+	class MVProductDomain;
+
+	template <>
+	template <typename Compute_t>
+	class FieldAXPY<Givaro::Modular<int64_t,Compute_t> > {
+	public:
+
+		typedef int64_t Element;
+		typedef Givaro::Modular<int64_t,Compute_t> Field;
+
+		FieldAXPY (const Field &F) : _field (&F), _y(0)
+		{
+			_two_64 = (uint64_t(1) << 32) % uint64_t(F.characteristic());
+			_two_64 = (_two_64 * _two_64) % uint64_t(F.characteristic());
+		}
+
+		FieldAXPY (const FieldAXPY &faxpy) :
+			_two_64 (faxpy._two_64), _field (faxpy._field), _y (0)
+		{}
+
+		FieldAXPY<Field> &operator = (const FieldAXPY &faxpy)
+		{
+			_field = faxpy._field;
+			_y = faxpy._y;
+			_two_64 = faxpy._two_64;
+			return *this;
+		}
+
+		inline const Field & field() const { return *_field; }
+
+		inline uint64_t& mulacc (const Element &a, const Element &x)
+		{
+			uint64_t t = (uint64_t) a * (uint64_t) x;
+			_y += t;
+			if (_y < t)
+				return _y += _two_64;
+			else
+				return _y;
+		}
+
+		inline uint64_t& accumulate (const Element &t)
+		{
+			_y += (uint64_t)t;
+			if (_y < (uint64_t)t)
+				return _y += _two_64;
+			else
+				return _y;
+		}
+
+		inline Element& get (Element &y)
+		{
+			y =Element(_y % (uint64_t) field().characteristic());
+			return y;
+		}
+
+		inline FieldAXPY &assign (const Element y)
+		{
+			_y = (uint64_t)y;
+			return *this;
+		}
+
+		inline void reset()
+		{
+			_y = 0;
+		}
+
+	public:
+		uint64_t _two_64;
+
+	protected:
+		const Field *_field;
+		uint64_t _y;
+	};
+
+
+	template <>
+	template <typename Compute_t>
+	class DotProductDomain<Givaro::Modular<int64_t,Compute_t> > : public VectorDomainBase<Givaro::Modular<int64_t,Compute_t> > {
+
+	public:
+		typedef int64_t Element;
+		typedef Givaro::Modular<int64_t,Compute_t> Field;
+		using VectorDomainBase<Field>::faxpy;
+		using VectorDomainBase<Field>::field;
+		DotProductDomain(){}
+		DotProductDomain (const Field &F) :
+			VectorDomainBase<Field> (F)
+		{}
+
+
+	protected:
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+
+			typename Vector1::const_iterator i;
+			typename Vector2::const_iterator j;
+
+			uint64_t y = 0;
+			uint64_t t;
+
+			for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j)
+			{
+				t = ( (uint64_t) *i ) * ( (uint64_t) *j );
+				y += t;
+
+				if (y < t)
+					y += faxpy()._two_64;
+			}
+
+			y %= (uint64_t) field().characteristic();
+			return res = (Element)y;
+
+		}
+
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+			typename Vector1::first_type::const_iterator i_idx;
+			typename Vector1::second_type::const_iterator i_elt;
+
+			uint64_t y = 0;
+			uint64_t t;
+
+			for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt)
+			{
+				t = ( (uint64_t) *i_elt ) * ( (uint64_t) v2[*i_idx] );
+				y += t;
+
+				if (y < t)
+					y += faxpy()._two_64;
+			}
+
+
+			y %= (uint64_t) field().characteristic();
+
+			return res = (Element) y;
+		}
+	};
+
+	// Specialization of MVProductDomain for int64_t modular field
+
+	template <>
+	template <typename Compute_t>
+	class MVProductDomain<Givaro::Modular<int64_t,Compute_t> > {
+	public:
+
+		typedef int64_t Element;
+		typedef Givaro::Modular<int64_t,Compute_t> Field;
+
+	protected:
+		template <class Vector1, class Matrix, class Vector2>
+		inline Vector1 &mulColDense
+		(const VectorDomain<Field> &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
+		{
+			return mulColDenseSpecialized
+			(VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
+		}
+
+	private:
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::DenseVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseSequenceVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseAssociativeVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseParallelVectorTag) const;
+
+		mutable std::vector<uint64_t> _tmp;
+	};
+	
+	template <typename Compute_t>
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 & MVProductDomain<Givaro::Modular<int64_t,Compute_t> >::
+	mulColDenseSpecialized (const VectorDomain<Givaro::Modular<int64_t,Compute_t> > &VD,
+				Vector1 &w,
+				const Matrix &A,
+				const Vector2 &v,
+				VectorCategories::DenseVectorTag) const
+	{
+
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::const_iterator k;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i)
+		{
+			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+			{
+				t = ((uint64_t) *k) * ((uint64_t) *j);
+
+				*l += t;
+
+				if (*l < t)
+					*l += VD.faxpy()._two_64;
+			}
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l % VD.field ().characteristic();
+
+		return w;
+	}
+
+	template <typename Compute_t>
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<int64_t,Compute_t> >::
+	mulColDenseSpecialized (const VectorDomain<Givaro::Modular<int64_t,Compute_t> > &VD,
+				Vector1 &w,
+				const Matrix &A,
+				const Vector2 &v,
+				VectorCategories::SparseSequenceVectorTag) const
+	{
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::const_iterator k;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i)
+		{
+			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+			{
+				t = ((uint64_t) k->second) * ((uint64_t) *j);
+
+				_tmp[k->first] += t;
+
+				if (_tmp[k->first] < t)
+					_tmp[k->first] += VD.faxpy()._two_64;
+			}
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l % VD.field ().characteristic();
+
+		return w;
+	}
+
+	template <typename Compute_t>
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<int64_t,Compute_t> > ::
+	mulColDenseSpecialized(const VectorDomain<Givaro::Modular<int64_t,Compute_t> > &VD,
+			       Vector1 &w,
+			       const Matrix &A,
+			       const Vector2 &v,
+			       VectorCategories::SparseAssociativeVectorTag) const
+	{
+
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::const_iterator k;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i)
+		{
+			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+			{
+				t = ((uint64_t) k->second) * ((uint64_t) *j);
+
+				_tmp[k->first] += t;
+
+				if (_tmp[k->first] < t)
+					_tmp[k->first] += VD.faxpy()._two_64;
+			}
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l % VD.field ().characteristic();
+
+		return w;
+	}
+
+	template <typename Compute_t>
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<int64_t,Compute_t> > ::
+	mulColDenseSpecialized (const VectorDomain<Givaro::Modular<int64_t,Compute_t> > &VD,
+				Vector1 &w,
+				const Matrix &A,
+				const Vector2 &v,
+				VectorCategories::SparseParallelVectorTag) const
+	{
+
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::first_type::const_iterator k_idx;
+		typename Matrix::Column::second_type::const_iterator k_elt;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i)
+		{
+			for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
+			     k_idx != i->first.end ();
+			     ++k_idx, ++k_elt, ++l)
+			{
+				t = ((uint64_t) *k_elt) * ((uint64_t) *j);
+
+				_tmp[*k_idx] += t;
+
+				if (_tmp[*k_idx] < t)
+					_tmp[*k_idx] += VD.faxpy()._two_64;
+			}
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l % VD.field ().characteristic();
+
+		return w;
+	}
+
+
+}
+
+#undef LINBOX_MAX_INT64
+
+
+
+#endif //__LINBOX_modular_int64_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+
diff --git a/linbox/ring/modular/modular-short.h b/linbox/ring/modular/modular-short.h
new file mode 100644
index 0000000..189b40e
--- /dev/null
+++ b/linbox/ring/modular/modular-short.h
@@ -0,0 +1,386 @@
+/* Copyright (C) 2010 LinBox
+ * Written by <?>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file field/modular/modular-short.h
+ * @ingroup field
+ * @brief  representation of <code>Z/mZ</code> over \c short .
+ */
+#ifndef __LINBOX_modular_short_H
+#define __LINBOX_modular_short_H
+
+
+#include "cmath"
+#include "linbox/linbox-config.h"
+#include "linbox/integer.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/ring/modular.h"
+#include "linbox/field/field-interface.h"
+#include "linbox/util/debug.h"
+#include "linbox/field/field-traits.h"
+
+#ifndef LINBOX_MAX_INT16 /* 32767 */
+#define LINBOX_MAX_INT16 INT16_MAX
+#endif
+
+#ifdef __ICC /*  pas content avec x = -x par exemple */
+#pragma warning(disable:2259)
+#endif
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+
+	template<class Field>
+	class FieldAXPY;
+
+	template<class Field>
+	class DotProductDomain;
+
+	template<class Field>
+	class MVProductDomain;
+
+	template <>
+	class FieldAXPY<Givaro::Modular<int16_t> > {
+	public:
+
+		typedef int16_t Element;
+		typedef int64_t Abnormal;
+		typedef Givaro::Modular<int16_t> Field;
+
+		FieldAXPY (const Field &F) :
+			_field (&F),_y(0)
+		{
+		}
+
+		FieldAXPY (const FieldAXPY &faxpy) :
+			_field (faxpy._field), _y (0)
+		{}
+
+		FieldAXPY<Givaro::Modular<int16_t> > &operator = (const FieldAXPY &faxpy)
+		{
+			_field = faxpy._field;
+			_y = faxpy._y;
+			return *this;
+		}
+
+		inline uint64_t& mulacc (const Element &a, const Element &x)
+		{
+			uint64_t t = ( (uint32_t) a ) * ( (uint32_t) x );
+			return _y+=t;
+		}
+
+		inline uint64_t& accumulate (const Element &t)
+		{
+			return _y += (uint64_t) t;
+		}
+
+		inline Element& get (Element &y)
+		{
+			y = Element(_y % (uint64_t) field().characteristic());
+			return y;
+		}
+
+		inline FieldAXPY &assign (const Element y)
+		{
+			_y = (uint64_t) y;
+			return *this;
+		}
+
+		inline void reset()
+		{
+			_y = 0;
+		}
+
+		inline const Field & field() const { return *_field; }
+
+	private:
+
+		const Field *_field;
+		uint64_t _y;
+		// uint16_t _two_64; // bb : NOT USED
+	};
+
+
+	template <>
+	class DotProductDomain<Givaro::Modular<int16_t> > : public  VectorDomainBase<Givaro::Modular<int16_t> > {
+
+	public:
+		typedef int16_t Element;
+		DotProductDomain(){}
+		DotProductDomain (const Givaro::Modular<int16_t> &F) :
+			VectorDomainBase<Givaro::Modular<int16_t> > (F)
+		{ }
+
+		using VectorDomainBase<Givaro::Modular<int16_t> >::field;
+
+	protected:
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+
+			typename Vector1::const_iterator i;
+			typename Vector2::const_iterator j;
+
+			uint64_t y = 0;
+			// uint64_t t;
+
+			for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j) {
+				y  += ( (uint32_t) *i ) * ( (uint32_t) *j );
+			}
+
+			y %= (uint64_t) field().characteristic();
+
+			return res = (Element) y;
+
+		}
+
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+			typename Vector1::first_type::const_iterator i_idx;
+			typename Vector1::second_type::const_iterator i_elt;
+
+			uint64_t y = 0;
+
+			for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt) {
+				y += ( (uint32_t) *i_elt ) * ( (uint32_t) v2[*i_idx] );
+			}
+
+			y %= (uint64_t) field().characteristic();
+
+			return res = (Element) y;
+		}
+
+	};
+	// Specialization of MVProductDomain for int16_t modular field
+
+	template <>
+	class MVProductDomain<Givaro::Modular<int16_t> >
+	{
+	public:
+
+		typedef int16_t Element;
+
+	protected:
+		template <class Vector1, class Matrix, class Vector2>
+		inline Vector1 &mulColDense
+		(const VectorDomain<Givaro::Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
+		{
+			return mulColDenseSpecialized
+			(VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
+		}
+
+	private:
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Givaro::Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::DenseVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Givaro::Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseSequenceVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Givaro::Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseAssociativeVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Givaro::Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseParallelVectorTag) const;
+
+		mutable std::vector<uint64_t> _tmp;
+	};
+
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<int16_t> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::DenseVectorTag) const
+	{
+
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::const_iterator k;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i) {
+			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+				t = ((uint32_t) *k) * ((uint32_t) *j);
+
+				*l += t;
+
+			}
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l % VD.field().characteristic();
+
+		return w;
+	}
+
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<int16_t> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseSequenceVectorTag) const
+	{
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::const_iterator k;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i) {
+			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+				t = ((uint32_t) k->second) * ((uint32_t) *j);
+
+				_tmp[k->first] += t;
+
+			}
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l % VD.field().characteristic();
+
+		return w;
+	}
+
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<int16_t> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseAssociativeVectorTag) const
+	{
+
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::const_iterator k;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i) {
+			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+				t = ((uint32_t) k->second) * ((uint32_t) *j);
+
+				_tmp[k->first] += t;
+
+			}
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l % VD.field().characteristic();
+
+		return w;
+	}
+
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<int16_t> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<int16_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseParallelVectorTag) const
+	{
+
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::first_type::const_iterator k_idx;
+		typename Matrix::Column::second_type::const_iterator k_elt;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i) {
+			for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
+			     k_idx != i->first.end ();
+			     ++k_idx, ++k_elt, ++l)
+			{
+				t = ((uint32_t) *k_elt) * ((uint32_t) *j);
+
+				_tmp[*k_idx] += t;
+
+			}
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l % VD.field().characteristic();
+
+		return w;
+	}
+
+
+}
+
+#ifdef __ICC
+#pragma warning(enable:2259)
+#endif
+
+#endif //__LINBOX_modular_short_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/ring/modular/modular-unsigned.h b/linbox/ring/modular/modular-unsigned.h
new file mode 100755
index 0000000..ec7230a
--- /dev/null
+++ b/linbox/ring/modular/modular-unsigned.h
@@ -0,0 +1,686 @@
+/* linbox/ring/modular.h
+ * Copyright (C) 1999-2001 William J Turner,
+ *               2001 Bradford Hovinen
+ * Copyright (C) 2011 LinBox
+ *
+ * Written by William J Turner <wjturner at math.ncsu.edu>,
+ *            Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * ------------------------------------
+ * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * LargeModular is now replace by a class Givaro::Modular parameterized on the element
+ * type. So, the old LargeModular is equivalent to Givaro::Modular<integer>. All other
+ * interface details are exactly the same.
+ *
+ * Renamed from large-modular.h to modular.h
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_field_modular_unsigned_H
+#define __LINBOX_field_modular_unsigned_H
+
+namespace LinBox { /*  uint8_t */
+
+	/*! Specialization of FieldAXPY for uint8_t modular field */
+
+	template <>
+	template<class Compute_t>
+	class FieldAXPY<Givaro::Modular<uint8_t,Compute_t > > {
+	public:
+
+		typedef uint8_t Element;
+		typedef uint64_t Abnormal;
+		typedef Givaro::Modular<uint8_t, Compute_t> Field;
+
+		FieldAXPY (const Field &F) :
+			_k (((uint64_t) -1LL) / ((F.characteristic() - 1) * (F.characteristic() - 1))),
+			_field (&F),
+			_y (0),
+			i (_k)
+		{
+		}
+
+		FieldAXPY (const FieldAXPY &faxpy) :
+			_k (faxpy._k),
+			_field (faxpy._field),
+			_y (0),
+			i (_k)
+		{}
+
+		FieldAXPY<Field> &operator = (const FieldAXPY &faxpy)
+		{
+			_field = faxpy._field;
+			_y = faxpy._y;
+			_k = faxpy._k;
+			return *this;
+		}
+
+		inline uint64_t& mulacc (const Element &a, const Element &x)
+		{
+			uint32_t t = (uint32_t) a * (uint32_t) x;
+
+			if (!i--) {
+				i = int(_k);
+				return _y = _y % (uint32_t) field().characteristic() + t;
+			}
+			else
+				return _y += t;
+		}
+
+		inline uint64_t& accumulate (const Element &t)
+		{
+
+			if (!i--) {
+				i = int(_k);
+				return _y = _y % (uint32_t) field().characteristic() + t;
+			}
+			else
+				return _y += t;
+		}
+
+		inline Element &get (Element &y) const
+		{
+			const_cast<FieldAXPY<Field>*>(this)->_y %= (uint32_t) field().characteristic();
+			if ((int32_t) _y < 0) const_cast<FieldAXPY<Field>*>(this)->_y += field().characteristic();
+			y = (uint8_t) _y;
+			const_cast<FieldAXPY<Field>*>(this)->i = int(_k);
+			return y;
+		}
+
+		inline FieldAXPY &assign (const Element y)
+		{
+			_y = y;
+			i = int(_k);
+			return *this;
+		}
+
+		inline void reset()
+		{
+			_y = 0;
+		}
+
+		inline const Field & field() const { return *_field; }
+		
+	public:
+		uint64_t _k; 
+		
+	private:
+		const Field *_field;
+		uint64_t _y;
+		int64_t i;
+	};
+
+	//! Specialization of DotProductDomain for unsigned short modular field
+
+	template <>
+	template <class Compute_t>
+	class DotProductDomain<Givaro::Modular<uint8_t, Compute_t> > : public  VectorDomainBase<Givaro::Modular<uint8_t, Compute_t> > {
+	public:
+
+		typedef uint8_t Element;
+		typedef Givaro::Modular<uint8_t, Compute_t> Field;
+
+		DotProductDomain(){}
+		DotProductDomain (const Field &F) :
+			VectorDomainBase<Field> (F)
+		{}
+		using VectorDomainBase<Field>::field;
+		using VectorDomainBase<Field>::faxpy;
+
+	protected:
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const;
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const;
+        
+	};
+
+	//! Specialization of MVProductDomain for uint8_t modular field
+
+	template <>
+	template<class Compute_t>
+	class MVProductDomain<Givaro::Modular<uint8_t,Compute_t> > {
+	public:
+
+		typedef uint8_t Element;
+		typedef Givaro::Modular<uint8_t,Compute_t> Field;
+
+	protected:
+		template <class Vector1, class Matrix, class Vector2>
+		inline Vector1 &mulColDense
+		(const VectorDomain<Field> &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
+		{
+			return mulColDenseSpecialized (VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
+		}
+
+	private:
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::DenseVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseSequenceVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseAssociativeVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseParallelVectorTag) const;
+
+		mutable std::vector<uint32_t> _tmp;
+	};
+
+}
+
+namespace LinBox { /*  uint16_t */
+
+	/*! Specialization of FieldAXPY for uint16_t modular field */
+	template <>
+	template<class Compute_t>
+	class FieldAXPY<Givaro::Modular<uint16_t,Compute_t> > {
+	public:
+
+		typedef uint16_t Element;
+		typedef Givaro::Modular<uint16_t,Compute_t> Field;
+
+		FieldAXPY (const Field &F) :
+			_k (((uint64_t) -1LL) / ((F.characteristic() - 1) * (F.characteristic() - 1))),
+			_field (&F),
+			_y (0),
+			i (_k)
+		{}
+		
+		FieldAXPY (const FieldAXPY &faxpy) :
+			_k (faxpy._k), _field (faxpy._field), _y (0), i (_k)
+		{}
+
+		FieldAXPY<Field > &operator = (const FieldAXPY &faxpy)
+		{
+			_field = faxpy._field;
+			_y = faxpy._y;
+			_k = faxpy._k;
+			return *this;
+		}
+
+		inline uint64_t& mulacc (const Element &a, const Element &x)
+		{
+			uint64_t t = (uint64_t) ((long long) a * (long long) x);
+
+			if (!i--) {
+				i = (int)_k;
+				return _y = _y % (uint64_t) field().characteristic() + t;
+			}
+			else
+				return _y += t;
+		}
+
+		inline uint64_t& accumulate (const Element &t)
+		{
+			if (!i--) {
+				i = (int)_k;
+				return _y = _y % (uint64_t) field().characteristic() + t;
+			}
+			else
+				return _y += t;
+		}
+
+		inline Element &get (Element &y) const
+		{
+			const_cast<FieldAXPY<Field>*>(this)->_y %= (uint64_t) field().characteristic();
+			if ((int64_t) _y < 0) const_cast<FieldAXPY<Field>*>(this)->_y += field().characteristic();
+			y = (uint16_t) _y;
+			const_cast<FieldAXPY<Field>*>(this)->i = int(_k);
+			return y;
+		}
+
+		inline FieldAXPY &assign (const Element y)
+		{
+			_y = y;
+			i = (int)_k;
+			return *this;
+		}
+
+		inline void reset()
+		{
+			_y = 0;
+		}
+
+		inline const Field & field() const {return *_field;}
+		
+	public:
+		uint64_t _k;
+		
+	private:
+		const Field *_field;
+		uint64_t _y;
+		int64_t i;
+	};
+
+	//! Specialization of DotProductDomain for unsigned short modular field
+
+	template <>
+	template<class Compute_t>
+	class DotProductDomain<Givaro::Modular<uint16_t,Compute_t> > : public VectorDomainBase<Givaro::Modular<uint16_t,Compute_t> > {
+	public:
+
+		typedef uint16_t Element;
+                typedef Givaro::Modular<uint16_t,Compute_t> Field;
+
+		DotProductDomain () {}
+		DotProductDomain (const Field &F) :
+			VectorDomainBase<Field > (F)
+		{}
+		using VectorDomainBase<Field>::field;
+		using VectorDomainBase<Field>::faxpy;
+
+	protected:
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const;
+        
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const;
+        
+	};
+
+	//! Specialization of MVProductDomain for uint16_t modular field
+
+	template <>
+	template<class Compute_t>
+	class MVProductDomain<Givaro::Modular<uint16_t,Compute_t> > {
+	public:
+
+		typedef uint16_t Element;
+                typedef Givaro::Modular<uint16_t,Compute_t> Field;
+	protected:
+		template <class Vector1, class Matrix, class Vector2>
+		inline Vector1 &mulColDense
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
+		{
+			return mulColDenseSpecialized (VD, w, A, v, VectorTraits<typename Matrix::Column>::VectorCategory ());
+		}
+
+	private:
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::DenseVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseSequenceVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseAssociativeVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseParallelVectorTag) const;
+
+		mutable std::vector<uint64_t> _tmp;
+	};
+
+}
+
+#include <givaro/modular-uint32.h>
+
+namespace LinBox { /*  uint32_t */
+
+	template<class Field>
+	class DotProductDomain;
+	template<class Field>
+	class FieldAXPY;
+	template<class Field>
+	class MVProductDomain;
+
+
+	/*! Specialization of FieldAXPY for unsigned short modular field */
+
+	template <>
+	template<class Compute_t>
+	class FieldAXPY<Givaro::Modular<uint32_t, Compute_t> > {
+	public:
+
+		typedef uint32_t Element;
+		typedef Givaro::Modular<uint32_t, Compute_t> Field;
+
+		FieldAXPY (const Field &F) :
+			_field (&F), _y(0)
+		{
+			_two_64 = (uint64_t(1) << 32) % uint64_t(F.characteristic());
+			_two_64 = (_two_64 * _two_64) % uint64_t(F.characteristic());
+		}
+
+		FieldAXPY (const FieldAXPY &faxpy) :
+			_two_64 (faxpy._two_64), _field (faxpy._field), _y (0)
+		{}
+
+		FieldAXPY<Field > &operator = (const FieldAXPY &faxpy)
+		{
+			_field = faxpy._field;
+			_y = faxpy._y;
+			_two_64 = faxpy._two_64;
+			return *this;
+		}
+
+		inline uint64_t& mulacc (const Element &a, const Element &x)
+		{
+			uint64_t t = (uint64_t) a * (uint64_t) x;
+			_y += t;
+
+			if (_y < t)
+				return _y += _two_64;
+			else
+				return _y;
+		}
+
+		inline uint64_t& accumulate (const Element &t)
+		{
+			_y += t;
+
+			if (_y < t)
+				return _y += _two_64;
+			else
+				return _y;
+		}
+
+		inline uint64_t& accumulate_special (const Element &t)
+		{
+			return _y += t;
+		}
+
+		inline Element &get (Element &y) const
+		{
+			const_cast<FieldAXPY<Field>*>(this)->_y %= (uint64_t) field().characteristic();
+			//if ((int64_t) _y < 0) const_cast<FieldAXPY<Field>*>(this)->_y += field().characteristic();
+			return y = (uint32_t) _y;
+		}
+
+		inline FieldAXPY &assign (const Element y)
+		{
+			_y = y;
+			return *this;
+		}
+
+		inline void reset() {
+			_y = 0;
+		}
+
+		inline const Field & field() const { return *_field; }
+		
+	public:
+	
+		uint64_t _two_64;
+		
+	private:
+
+		const Field *_field;
+		uint64_t _y;
+	};
+
+	//! Specialization of DotProductDomain for uint32_t modular field
+
+	template <>
+	template<class Compute_t>
+	class DotProductDomain<Givaro::Modular<uint32_t,Compute_t> > : public VectorDomainBase<Givaro::Modular<uint32_t,Compute_t> > {
+	public:
+
+		typedef uint32_t Element;
+		typedef Givaro::Modular<uint32_t, Compute_t> Field;
+
+		DotProductDomain () {}
+		DotProductDomain (const Field &F) :
+			VectorDomainBase<Field > (F)
+		{}
+		using VectorDomainBase<Field >::field;
+		using VectorDomainBase<Field >::faxpy;
+
+	protected:
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const;
+        
+
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const;
+        
+	};
+
+	//! Specialization of MVProductDomain for uint32_t modular field
+
+	template <>
+	template <class Compute_t>
+	class MVProductDomain<Givaro::Modular<uint32_t,Compute_t> > {
+	public:
+
+		typedef uint32_t Element;
+		typedef Givaro::Modular<uint32_t,Compute_t> Field;
+
+	protected:
+		template <class Vector1, class Matrix, class Vector2>
+		inline Vector1 &mulColDense
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
+		{
+			return mulColDenseSpecialized (VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
+		}
+
+	private:
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::DenseVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseSequenceVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseAssociativeVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseParallelVectorTag) const;
+
+		mutable std::vector<uint64_t> _tmp;
+	};
+
+}
+
+#include <givaro/modular-uint64.h>
+
+namespace LinBox { /*  uint64_t */
+
+	template<class Field>
+	class DotProductDomain;
+	template<class Field>
+	class FieldAXPY;
+	template<class Field>
+	class MVProductDomain;
+
+	/*! Specialization of FieldAXPY for unsigned short modular field */
+
+	template <>
+	template<typename Compute_t>
+	class FieldAXPY<Givaro::Modular<uint64_t,Compute_t> > {
+	public:
+
+		typedef uint64_t Element;
+		typedef Givaro::Modular<uint64_t,Compute_t> Field;
+
+		FieldAXPY (const Field &F) :
+			_field (&F), _y(0)
+		{
+			_two_64 = (uint64_t(1) << 32) % uint64_t(F.characteristic());
+			_two_64 = (_two_64 * _two_64) % uint64_t(F.characteristic());
+		}
+
+		FieldAXPY (const FieldAXPY &faxpy) :
+			_two_64 (faxpy._two_64), _field (faxpy._field), _y (0)
+		{}
+
+		FieldAXPY<Field > &operator = (const FieldAXPY &faxpy)
+		{
+			_field = faxpy._field;
+			_y = faxpy._y;
+			return *this;
+		}
+
+		inline uint64_t& mulacc (const Element &a, const Element &x)
+		{
+			uint64_t t = (uint64_t) a * (uint64_t) x;
+			_y += t;
+
+			if (_y < t)
+				return _y += _two_64;
+			else
+				return _y;
+		}
+
+		inline uint64_t& accumulate (const Element &t)
+		{
+			_y += t;
+
+			if (_y < t)
+				return _y += _two_64;
+			else
+				return _y;
+		}
+
+		inline uint64_t& accumulate_special (const Element &t)
+		{
+			return _y += t;
+		}
+
+		inline Element &get (Element &y) const
+		{
+			const_cast<FieldAXPY<Field>*>(this)->_y %= (uint64_t) field().characteristic();
+			//if ((int64_t) _y < 0) const_cast<FieldAXPY<Field>*>(this)->_y += field().characteristic();
+			return y = (uint64_t) _y;
+		}
+
+		inline FieldAXPY &assign (const Element y)
+		{
+			_y = y;
+			return *this;
+		}
+
+		inline void reset() {
+			_y = 0;
+		}
+
+		inline const Field & field() const { return *_field; }
+		
+	public:
+	
+		uint64_t _two_64;
+		
+	private:
+
+		const Field *_field;
+		uint64_t _y;
+	};
+
+	//! Specialization of DotProductDomain for uint64_t modular field
+
+	template <>
+	template <typename Compute_t>
+	class DotProductDomain<Givaro::Modular<uint64_t,Compute_t>> : public VectorDomainBase<Givaro::Modular<uint64_t,Compute_t> > {
+	public:
+
+		typedef uint64_t Element;
+		typedef Givaro::Modular<uint64_t,Compute_t> Field;
+
+		DotProductDomain () {}
+		DotProductDomain (const Field &F) :
+			VectorDomainBase<Field > (F)
+		{}
+		using VectorDomainBase<Field >::field;
+		using VectorDomainBase<Field >::faxpy;
+
+	protected:
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const;
+        
+
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const;
+        
+	};
+
+	//! Specialization of MVProductDomain for uint64_t modular field
+
+	template <>
+	template <typename Compute_t>
+	class MVProductDomain<Givaro::Modular<uint64_t,Compute_t> > {
+	public:
+
+		typedef uint64_t Element;
+		typedef Givaro::Modular<uint64_t,Compute_t> Field;
+
+	protected:
+		template <class Vector1, class Matrix, class Vector2>
+		inline Vector1 &mulColDense
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
+		{
+			return mulColDenseSpecialized (VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
+		}
+
+	private:
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::DenseVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseSequenceVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseAssociativeVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<Field > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseParallelVectorTag) const;
+
+		mutable std::vector<uint64_t> _tmp;
+	};
+
+}
+
+#include "linbox/ring/modular/modular-unsigned.inl"
+
+#endif // __LINBOX_field_modular_unsigned_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/ring/modular/modular-unsigned.inl b/linbox/ring/modular/modular-unsigned.inl
new file mode 100755
index 0000000..d50ad34
--- /dev/null
+++ b/linbox/ring/modular/modular-unsigned.inl
@@ -0,0 +1,828 @@
+/* linbox/field/modular.inl
+ * Copyright (C) 2002 Bradford Hovinen
+ * Copyright (C) 2002 Ahmet Duran
+ * Copyright (C) 2002 B. David Saunders
+ *
+ * Written by Bradford Hovinen <hovinen at cis.udel.edu>,
+ *            Ahmet Duran <duran at cis.udel.edu>,
+ *            Dave Saunders <saunders at cis.udel.edu>
+ *
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_field_modular_INL
+#define __LINBOX_field_modular_INL
+
+//Dan Roche 7-2-04
+#ifndef __LINBOX_MIN
+#define __LINBOX_MIN(a,b) ( (a) < (b) ? (a) : (b) )
+#endif
+
+#include <iostream>
+
+namespace LinBox {
+
+        template<typename Compute_t>
+	template <class Vector1, class Vector2>
+	inline uint8_t &DotProductDomain<Givaro::Modular<uint8_t,Compute_t> >::dotSpecializedDD
+	(uint8_t &res, const Vector1 &v1, const Vector2 &v2) const
+	{
+		typename Vector1::const_iterator i = v1.begin ();
+		typename Vector2::const_iterator j = v2.begin ();
+
+		typename Vector1::const_iterator iterend = v1.begin () + (ptrdiff_t)(v1.size() % faxpy()._k);
+
+		uint64_t y = 0;
+
+		for (; i != iterend; ++i, ++j)
+			y += (uint64_t) *i * (uint64_t) *j;
+
+		y %= (uint64_t) field().characteristic();
+
+		for (; iterend != v1.end (); j += (ptrdiff_t)faxpy()._k) {
+			typename Vector1::const_iterator iter_i = iterend;
+			typename Vector2::const_iterator iter_j;
+
+			iterend += (ptrdiff_t)faxpy()._k;
+
+			for (iter_j = j; iter_i != iterend; ++iter_i, ++iter_j)
+				y += (uint64_t) *iter_i * (uint64_t) *j;
+
+			y %= (uint64_t) field().characteristic();
+		}
+
+		return res = (uint8_t) y;
+	}
+
+        template<typename Compute_t>
+	template <class Vector1, class Vector2>
+	inline uint8_t &DotProductDomain<Givaro::Modular<uint8_t,Compute_t> >::dotSpecializedDSP
+	(uint8_t &res, const Vector1 &v1, const Vector2 &v2) const
+	{
+		typename Vector1::first_type::const_iterator i_idx = v1.first.begin ();
+		typename Vector1::second_type::const_iterator i_elt = v1.second.begin ();
+
+		uint64_t y = 0;
+
+		if (v1.first.size () < faxpy()._k) {
+			for (; i_idx != v1.first.end (); ++i_idx, ++i_elt)
+				y += (uint64_t) *i_elt * (uint64_t) v2[*i_idx];
+
+			return res = uint8_t (y % (uint64_t) field().characteristic());
+		}
+		else {
+			typename Vector1::first_type::const_iterator iterend = v1.first.begin () +(ptrdiff_t)( v1.first.size() % faxpy()._k);
+
+			for (; i_idx != iterend; ++i_idx, ++i_elt)
+				y += (uint64_t) *i_elt * (uint64_t) v2[*i_idx];
+
+			y %= (uint64_t) field().characteristic();
+
+			while (iterend != v1.first.end ()) {
+				typename Vector1::first_type::const_iterator iter_i_idx = iterend;
+				typename Vector1::second_type::const_iterator iter_i_elt = i_elt;
+
+				iterend += (ptrdiff_t)faxpy()._k;
+				i_elt += (ptrdiff_t)faxpy()._k;
+
+				for (; iter_i_idx != iterend; ++iter_i_idx, ++iter_i_elt)
+					y += (uint64_t) *iter_i_elt * (uint64_t) v2[*iter_i_idx];
+
+				y %= (uint64_t) field().characteristic();
+			}
+
+			return res = (uint8_t) y;
+		}
+	}
+
+        template<typename Compute_t>
+	template <class Vector1, class Vector2>
+	inline uint16_t &DotProductDomain<Givaro::Modular<uint16_t,Compute_t> >::dotSpecializedDD
+	(uint16_t &res, const Vector1 &v1, const Vector2 &v2) const
+	{
+		typename Vector1::const_iterator i = v1.begin ();
+		typename Vector2::const_iterator j = v2.begin ();
+
+		typename Vector1::const_iterator iterend = v1.begin () + (ptrdiff_t)(v1.size() % faxpy()._k);
+
+		uint64_t y = 0;
+
+		for (; i != iterend; ++i, ++j)
+			y += (uint64_t) *i * (uint64_t) *j;
+
+		y %= (uint64_t) field().characteristic();
+
+		for (; iterend != v1.end (); j += faxpy()._k) {
+			typename Vector1::const_iterator iter_i = iterend;
+			typename Vector2::const_iterator iter_j;
+
+			iterend += faxpy()._k;
+
+			for (iter_j = j; iter_i != iterend; ++iter_i, ++iter_j)
+				y += (uint64_t) *iter_i * (uint64_t) *j;
+
+			y %= (uint64_t) field().characteristic();
+		}
+
+		return res = (uint16_t) y;
+	}
+
+	template<typename Compute_t> template <class Vector1, class Vector2>
+	inline uint16_t &DotProductDomain<Givaro::Modular<uint16_t,Compute_t> >::dotSpecializedDSP
+	(uint16_t &res, const Vector1 &v1, const Vector2 &v2) const
+	{
+		typename Vector1::first_type::const_iterator i_idx = v1.first.begin ();
+		typename Vector1::second_type::const_iterator i_elt = v1.second.begin ();
+
+		uint64_t y = 0;
+
+		if (v1.first.size () < faxpy()._k) {
+			for (; i_idx != v1.first.end (); ++i_idx, ++i_elt)
+				y += (uint64_t) *i_elt * (uint64_t) v2[*i_idx];
+
+			return res = (uint16_t) (y % (uint64_t) field().characteristic());
+		}
+		else {
+			typename Vector1::first_type::const_iterator iterend = v1.first.begin () +(ptrdiff_t)( v1.first.size() % faxpy()._k );
+
+			for (; i_idx != iterend; ++i_idx, ++i_elt)
+				y += (uint64_t) *i_elt * (uint64_t) v2[*i_idx];
+
+			y %= (uint64_t) field().characteristic();
+
+			while (iterend != v1.first.end ()) {
+				typename Vector1::first_type::const_iterator iter_i_idx = iterend;
+				typename Vector1::second_type::const_iterator iter_i_elt = i_elt;
+
+				iterend += faxpy()._k;
+				i_elt += faxpy()._k;
+
+				for (; iter_i_idx != iterend; ++iter_i_idx, ++iter_i_elt)
+					y += (uint64_t) *iter_i_elt * (uint64_t) v2[*iter_i_idx];
+
+				y %= (uint64_t) field().characteristic();
+			}
+
+			return res = (Element) y;
+		}
+	}
+
+	template<typename Compute_t> template <class Vector1, class Vector2>
+	inline uint32_t &DotProductDomain<Givaro::Modular<uint32_t,Compute_t> >::dotSpecializedDD
+	(uint32_t &res, const Vector1 &v1, const Vector2 &v2) const
+	{
+		typename Vector1::const_iterator i;
+		typename Vector2::const_iterator j;
+
+		uint64_t y = 0;
+		uint64_t t;
+
+		for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j) {
+			t = (uint64_t) *i * (uint64_t) *j;
+			y += t;
+
+			if (y < t)
+				y += faxpy()._two_64;
+		}
+
+		y %= (uint64_t) field().characteristic();
+
+		return res = (uint32_t) y;
+	}
+
+	template<typename Compute_t> template <class Vector1, class Vector2>
+	inline uint32_t &DotProductDomain<Givaro::Modular<uint32_t,Compute_t> >::dotSpecializedDSP
+	(uint32_t &res, const Vector1 &v1, const Vector2 &v2) const
+	{
+		typename Vector1::first_type::const_iterator i_idx;
+		typename Vector1::second_type::const_iterator i_elt;
+
+		uint64_t y = 0;
+		uint64_t t = 0;
+
+		for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt) {
+			t = (uint64_t) *i_elt * (uint64_t) v2[*i_idx];
+			y += t;
+			if (y < t)
+				y += faxpy()._two_64;
+		}
+
+		y %= (uint64_t) field().characteristic();
+
+		return res = (uint32_t)y;
+	}
+
+	template<typename Compute_t> template <class Vector1, class Vector2>
+	inline uint64_t &DotProductDomain<Givaro::Modular<uint64_t,Compute_t> >::dotSpecializedDD
+	(uint64_t &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+
+			typename Vector1::const_iterator i;
+			typename Vector2::const_iterator j;
+
+			uint64_t y = 0;
+			uint64_t t;
+
+			for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j)
+			{
+				t = ( (uint64_t) *i ) * ( (uint64_t) *j );
+				y += t;
+
+				if (y < t)
+					y += faxpy()._two_64;
+			}
+
+			y %= (uint64_t) field().characteristic();
+			return res = (Element)y;
+
+		}
+
+
+	template<typename Compute_t> template <class Vector1, class Vector2>
+	inline uint64_t &DotProductDomain<Givaro::Modular<uint64_t,Compute_t> >::dotSpecializedDSP
+	(uint64_t &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+			typename Vector1::first_type::const_iterator i_idx;
+			typename Vector1::second_type::const_iterator i_elt;
+
+			uint64_t y = 0;
+			uint64_t t;
+
+			for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt)
+			{
+				t = ( (uint64_t) *i_elt ) * ( (uint64_t) v2[*i_idx] );
+				y += t;
+
+				if (y < t)
+					y += faxpy()._two_64;
+			}
+
+
+			y %= (uint64_t) field().characteristic();
+
+			return res = (Element) y;
+		}	
+
+
+
+
+
+	template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<uint8_t,Compute_t> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<uint8_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::DenseVectorTag) const
+	{
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j, j_end;
+		typename Matrix::Column::const_iterator k;
+		std::vector<uint32_t>::iterator l, l_end;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () + (ptrdiff_t)w.size (), 0);
+
+		l_end = _tmp.begin () +(ptrdiff_t) w.size ();
+
+		do {
+			j = v.begin ();
+			j_end = j + __LINBOX_MIN (A->coldim (), VD.faxpy()._k);
+
+			for (; j != j_end; ++j, ++i)
+				for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+					*l += *k * *j;
+
+			j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.faxpy()._k);
+
+			for (l =_tmp.begin (); l != l_end; ++l)
+				*l %= VD.field ().characteristic();
+
+		} while (j_end != v.end ());
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l;
+
+		return w;
+	}
+
+	template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<uint8_t,Compute_t> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<uint8_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseSequenceVectorTag) const
+	{
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j, j_end;
+		typename Matrix::Column::const_iterator k;
+		std::vector<uint32_t>::iterator l, l_end;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () + (ptrdiff_t)w.size (), 0);
+
+		l_end = _tmp.begin () + (ptrdiff_t)w.size ();
+
+
+		do {
+			j = v.begin ();
+			j_end = j + __LINBOX_MIN (A->coldim (), VD.faxpy()._k);
+
+			for (; j != j_end; ++j, ++i)
+				for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+					_tmp[k->first] += k->second * *j;
+
+			j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.faxpy()._k);
+
+			for (l =_tmp.begin (); l != l_end; ++l)
+				*l %= VD.field ().characteristic();
+
+		} while (j_end != v.end ());
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l;
+
+		return w;
+	}
+
+	template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<uint8_t,Compute_t> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<uint8_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseAssociativeVectorTag) const
+	{
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j, j_end;
+		typename Matrix::Column::const_iterator k;
+		std::vector<uint32_t>::iterator l, l_end;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () + (ptrdiff_t)w.size (), 0);
+
+		l_end = _tmp.begin () +(ptrdiff_t) w.size ();
+
+		do {
+			j = v.begin ();
+			j_end = j + __LINBOX_MIN (A->coldim (), VD.faxpy()._k);
+
+			for (; j != j_end; ++j, ++i)
+				for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+					_tmp[k->first] += k->second * *j;
+
+			j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.faxpy()._k);
+
+			for (l =_tmp.begin (); l != l_end; ++l)
+				*l %= VD.field ().characteristic();
+
+		} while (j_end != v.end ());
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l;
+
+		return w;
+	}
+
+	template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<uint8_t,Compute_t> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<uint8_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseParallelVectorTag) const
+	{
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j, j_end;
+		typename Matrix::Column::first_type::const_iterator k_idx;
+		typename Matrix::Column::second_type::const_iterator k_elt;
+		std::vector<uint32_t>::iterator l, l_end;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () + (ptrdiff_t)w.size (), 0);
+
+		l_end = _tmp.begin () + (ptrdiff_t)w.size ();
+
+		do {
+			j = v.begin ();
+			j_end = j + (ptrdiff_t)__LINBOX_MIN (uint64_t (A.coldim ()), VD.faxpy()._k);
+
+			for (; j != j_end; ++j, ++i)
+				for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
+				     k_idx != i->first.end ();
+				     ++k_idx, ++k_elt, ++l)
+					_tmp[*k_idx] += *k_elt * *j;
+
+			j_end += (ptrdiff_t) __LINBOX_MIN (uint64_t (A.coldim () - (size_t)(j_end - v.begin ())), VD.faxpy()._k);
+
+			for (l =_tmp.begin (); l != l_end; ++l)
+				*l %= VD.field ().characteristic();
+
+		} while (j_end != v.end ());
+
+		typename Vector1::iterator w_j;
+		typedef typename Vector1::value_type val_t ;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = (val_t) *l;
+
+		return w;
+	}
+
+	template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<uint16_t,Compute_t> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<uint16_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::DenseVectorTag) const
+	{
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j = v.begin (), j_end;
+		typename Matrix::Column::const_iterator k;
+		// Dan Roche, 7-1-04
+		// std::vector<uint32_t>::iterator l, l_end;
+		std::vector<uint64_t>::iterator l, l_end;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () +(ptrdiff_t) w.size (), 0);
+
+		l_end = _tmp.begin () +(ptrdiff_t) w.size ();
+
+		do {
+			j = v.begin ();
+			j_end = j + __LINBOX_MIN (A->coldim (), VD.faxpy()._k);
+
+			for (; j != j_end; ++j, ++i)
+				for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+					*l += *k * *j;
+
+			j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.faxpy()._k);
+
+			for (l =_tmp.begin (); l != l_end; ++l)
+				*l %= VD.field ().characteristic();
+
+		} while (j_end != v.end ());
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l;
+
+		return w;
+	}
+
+	template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<uint16_t,Compute_t> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<uint16_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseSequenceVectorTag) const
+	{
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j, j_end;
+		typename Matrix::Column::const_iterator k;
+		// Dan Roche, 7-1-04
+		// std::vector<uint32_t>::iterator l, l_end;
+		std::vector<uint64_t>::iterator l, l_end;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () +(ptrdiff_t) w.size (), 0);
+
+		l_end = _tmp.begin () +(ptrdiff_t) w.size ();
+
+		do {
+			j = v.begin ();
+			j_end = j + __LINBOX_MIN (A->coldim (), VD.faxpy()._k);
+
+			for (; j != j_end; ++j, ++i)
+				for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+					_tmp[k->first] += k->second * *j;
+
+			j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.faxpy()._k);
+
+			for (l =_tmp.begin (); l != l_end; ++l)
+				*l %= VD.field ().characteristic();
+
+		} while (j_end != v.end ());
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l;
+
+		return w;
+	}
+
+	template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<uint16_t,Compute_t> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<uint16_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseAssociativeVectorTag) const
+	{
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j, j_end;
+		typename Matrix::Column::const_iterator k;
+		// Dan Roche, 7-1-04
+		// std::vector<uint32_t>::iterator l, l_end;
+		std::vector<uint64_t>::iterator l, l_end;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () +(ptrdiff_t) w.size (), 0);
+
+		l_end = _tmp.begin () +(ptrdiff_t) w.size ();
+
+		do {
+			j = v.begin ();
+			j_end = j + __LINBOX_MIN (A->coldim (), VD.faxpy()._k);
+
+			for (; j != j_end; ++j, ++i)
+				for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+					_tmp[k->first] += k->second * *j;
+
+			j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.faxpy()._k);
+
+			for (l =_tmp.begin (); l != l_end; ++l)
+				*l %= VD.field ().characteristic();
+
+		} while (j_end != v.end ());
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l;
+
+		return w;
+	}
+
+	template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<uint16_t,Compute_t> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<uint16_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseParallelVectorTag) const
+	{
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j, j_end;
+		typename Matrix::Column::first_type::const_iterator k_idx;
+		typename Matrix::Column::second_type::const_iterator k_elt;
+		// Dan Roche, 7-1-04
+		// std::vector<uint32_t>::iterator l, l_end;
+		std::vector<uint64_t>::iterator l, l_end;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () +(ptrdiff_t) w.size (), 0);
+
+		l_end = _tmp.begin () +(ptrdiff_t) w.size ();
+
+		do {
+			j = v.begin ();
+			//Dan Roche, 7-2-04
+			//j_end = j + __LINBOX_MIN (A->coldim (), VD.faxpy()._k);
+			j_end = j + __LINBOX_MIN (A.coldim (), VD.faxpy()._k);
+
+			for (; j != j_end; ++j, ++i)
+				for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
+				     k_idx != i->first.end ();
+				     ++k_idx, ++k_elt, ++l)
+					_tmp[*k_idx] += *k_elt * *j;
+
+			//j_end += __LINBOX_MIN (A->coldim () - (j_end - v.begin ()), VD.faxpy()._k);
+			j_end += __LINBOX_MIN (A.coldim () - (j_end - v.begin ()), VD.faxpy()._k);
+
+			for (l =_tmp.begin (); l != l_end; ++l)
+				*l %= VD.field ().characteristic();
+
+		} while (j_end != v.end ());
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l;
+
+		return w;
+	}
+
+	template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<uint32_t,Compute_t> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<uint32_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::DenseVectorTag) const
+	{
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::const_iterator k;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () +(ptrdiff_t) w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i) {
+			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+				t = ((uint64_t) *k) * ((uint64_t) *j);
+
+				*l += t;
+
+				if (*l < t)
+					*l += VD.faxpy()._two_64;
+			}
+		}
+
+		typename Vector1::iterator w_j;
+		typedef typename Vector1::value_type element;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = (element)(*l % VD.field ().characteristic());
+
+		return w;
+	}
+
+	template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<uint32_t,Compute_t> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<uint32_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseSequenceVectorTag) const
+	{
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::const_iterator k;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () + (ptrdiff_t) w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i) {
+			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+				t = ((uint64_t) k->second) * ((uint64_t) *j);
+
+				_tmp[k->first] += t;
+
+				if (_tmp[k->first] < t)
+					_tmp[k->first] += VD.faxpy()._two_64;
+			}
+		}
+
+		typename Vector1::iterator             w_j;
+		typedef typename Vector1::value_type val_t;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = val_t(*l % VD.field ().characteristic());
+
+		return w;
+	}
+
+	template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<uint32_t,Compute_t> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<uint32_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseAssociativeVectorTag) const
+	{
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::const_iterator k;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () +(ptrdiff_t) w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i) {
+			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+				t = ((uint64_t) k->second) * ((uint64_t) *j);
+
+				_tmp[k->first] += t;
+
+				if (_tmp[k->first] < t)
+					_tmp[k->first] += VD.faxpy()._two_64;
+			}
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = (uint32_t) (uint32_t)*l % VD.field ().characteristic();
+
+		return w;
+	}
+
+	template<typename Compute_t> template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<Givaro::Modular<uint32_t,Compute_t> >::mulColDenseSpecialized
+	(const VectorDomain<Givaro::Modular<uint32_t,Compute_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseParallelVectorTag) const
+	{
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::first_type::const_iterator k_idx;
+		typename Matrix::Column::second_type::const_iterator k_elt;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () +(ptrdiff_t) w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i) {
+			for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
+			     k_idx != i->first.end ();
+			     ++k_idx, ++k_elt, ++l)
+			{
+				t = ((uint64_t) *k_elt) * ((uint64_t) *j);
+
+				_tmp[*k_idx] += t;
+
+				if (_tmp[*k_idx] < t)
+					_tmp[*k_idx] += VD.faxpy()._two_64;
+			}
+		}
+
+		typename Vector1::iterator     w_j;
+		typedef typename Vector1::value_type val_t;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = val_t(*l % VD.field ().characteristic());
+
+		return w;
+	}
+
+}
+
+#endif // __LINBOX_field_modular_INL
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/ntl.doxy b/linbox/ring/ntl.doxy
new file mode 100644
index 0000000..5a93172
--- /dev/null
+++ b/linbox/ring/ntl.doxy
@@ -0,0 +1,30 @@
+// Copyright (C) 2010 Brice Boyer (briceboyer), part of LinBox, GNU LGPL, see COPYING
+/*
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @ingroup field
+ at defgroup NTL NTL
+
+ at brief NO DOC
+
+*/
+
+
+// vim:syntax=doxygen
diff --git a/linbox/ring/ntl.h b/linbox/ring/ntl.h
new file mode 100644
index 0000000..0e56a0d
--- /dev/null
+++ b/linbox/ring/ntl.h
@@ -0,0 +1,60 @@
+/* linbox/ring/ntl.h
+ * Copyright (C) 1999-2002 William J Turner,
+ *               2001 Bradford Hovinen
+ *
+ * Written by William J Turner <wjturner at math.ncsu.edu>,
+ *            Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * ------------------------------------
+ * Modified by William J. Turner <wjturner at acm.org>. 4 April 2002.
+ *
+ * Broke NTL ring wrappers into separate files.
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_ring_ntl_H
+#define __LINBOX_ring_ntl_H
+
+#include "linbox/ring/ntl/ntl-rr.h"
+#include "linbox/ring/ntl/ntl-zz_p.h"
+#include "linbox/ring/ntl/ntl-zz.h"
+#include "linbox/ring/ntl/ntl-zz_px.h"
+#include "linbox/ring/ntl/ntl-zz_pe.h"
+#include "linbox/ring/ntl/ntl-lzz_p.h"
+#include "linbox/ring/ntl/ntl-lzz_px.h"
+#include "linbox/ring/ntl/ntl-lzz_pe.h"
+#include "linbox/ring/ntl/ntl-lzz_pex.h"
+#include "linbox/ring/ntl/ntl-gf2e.h"
+
+
+#endif // __LINBOX_ring_ntl_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/ntl/Makefile.am b/linbox/ring/ntl/Makefile.am
new file mode 100644
index 0000000..a02b6d8
--- /dev/null
+++ b/linbox/ring/ntl/Makefile.am
@@ -0,0 +1,47 @@
+# Copyright (c) 2010 the LinBox group
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the  GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# ========LICENCE========
+
+
+
+pkgincludesubdir=$(pkgincludedir)/ring/ntl
+
+
+NTL_HDRS =              \
+    ntl-rr.h            \
+    ntl-zz_p.h          \
+    ntl-zz_pe.h         \
+    ntl-zz_px.h         \
+    ntl-zz.h            \
+    ntl-lzz_p.h         \
+    ntl-lzz_pe.h        \
+    ntl-lzz_px.h        \
+    ntl-lzz_pex.h       \
+    ntl-gf2e.h
+
+
+if LINBOX_HAVE_NTL
+USE_NTL_HDRS = $(NTL_HDRS)
+endif
+
+
+pkgincludesub_HEADERS =     \
+    $(USE_NTL_HDRS)
+
+#  EXTRA_DIST =            \
+    #  ntl.doxy
diff --git a/linbox/ring/ntl/ntl-gf2e.h b/linbox/ring/ntl/ntl-gf2e.h
new file mode 100644
index 0000000..77b0457
--- /dev/null
+++ b/linbox/ring/ntl/ntl-gf2e.h
@@ -0,0 +1,247 @@
+/* linbox/field/ntl-z_pE.h
+ * Copyright (C) 2004  Pascal Giorgi
+ * Copyright (C) 2011 LinBox
+ *
+ * Written by  Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
+ *
+ * Modified by W. J. Turner <wjturner at acm.org>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file field/ntl/ntl-GF2E.h
+ * @ingroup field
+ * @ingroup NTL
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_field_ntl_gf2e_H
+#define __LINBOX_field_ntl_gf2e_H
+
+#ifndef __LINBOX_HAVE_NTL
+#error "you need NTL here"
+#endif
+
+#include <NTL/GF2XFactoring.h>
+#include <NTL/GF2E.h>
+#include <time.h>
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+
+#include <givaro/zring.h>
+#include "linbox/field/field-traits.h"
+
+
+#include "linbox/integer.h"
+
+namespace Givaro
+{
+	template<>
+	//	NTL::GF2E& Givaro::ZRing<NTL::GF2E>::init (NTL::GF2E &x, const Integer &y) const
+	NTL::GF2E& Caster(NTL::GF2E &x, const Integer &y)
+	{
+		x=NTL::to_GF2E(static_cast<int64_t>(y));
+		return x;
+	}
+	template<>
+	//	NTL::GF2E& Givaro::ZRing<NTL::GF2E>::init (NTL::GF2E &x, const double &y) const
+	NTL::GF2E& Caster(NTL::GF2E &x, const double &y)
+	{
+		x=NTL::to_GF2E(static_cast<long>(y));
+		return x;
+	}
+
+
+	template<>
+	//	Integer& Givaro::ZRing<NTL::GF2E>::convert (Integer& x, const NTL::GF2E &y) const	{
+	Integer& Caster(Integer& x, const NTL::GF2E &y)
+	{
+		NTL::GF2X poly = rep(y);
+
+		long i;
+		x = 0;
+		for(i = deg(poly); i >= 0; --i) {
+			x <<= 1;
+			x += static_cast<int64_t>(rep(coeff(poly, i)));
+		}
+		return x;
+	}
+
+} // namespace Givaro
+
+
+
+
+// Namespace in which all LinBox library code resides
+namespace LinBox
+{
+	/// \ingroup field
+
+	class NTL_GF2E_Initialiser {
+	public :
+		NTL_GF2E_Initialiser( const Integer & p, size_t k = 1) {
+			linbox_check(p == 2);
+			// if(p != 2) throw PreconditionFailed(LB_FILE_LOC,"modulus must be 2");
+			NTL::GF2X irredPoly = NTL::BuildSparseIrred_GF2X((long) k);
+			NTL::GF2E::init(irredPoly);
+
+		}
+
+		// template <class ElementInt>
+		// NTL_GF2E_Initialiser(const ElementInt& d) {
+			// NTL::ZZ_p::init (NTL::to_ZZ(d));
+		// }
+
+		// NTL_GF2E_Initialiser (const NTL::ZZ& d) {
+			// NTL::ZZ_p::init(d);
+		// }
+
+	};
+
+
+	/*
+	 * Define a parameterized class to easily handle Givaro::ZRing<NTL::GF2E> field
+	 */
+
+	class NTL_GF2E :  public NTL_GF2E_Initialiser, public Givaro::UnparametricOperations<NTL::GF2E> {
+	public:
+		typedef NTL::GF2E Element ;
+		typedef Givaro::UnparametricOperations<Element> Father_t ;
+		typedef UnparametricRandIter<Element> RandIter;
+
+		const Element zero,one,mOne ;
+
+		NTL_GF2E (const integer &p, const integer &k) :
+			NTL_GF2E_Initialiser(p,k),Father_t ()
+			,zero( NTL::to_GF2E(0)),one( NTL::to_GF2E(1)),mOne(-one)
+		{ }
+
+		bool isZero (const Element& a) const
+		{
+			return NTL::IsZero(a);
+		}
+
+
+		bool isOne (const Element& a) const
+		{
+			return NTL::IsOne(a);
+		}
+
+		bool isMOne (const Element& x) const
+		{
+			Element y ; neg(y,x);
+			return isOne(y);
+		}
+
+		integer& characteristic (integer &c) const
+		{
+			return c = 2;
+		}
+
+		integer& cardinality(integer& c) const
+		{
+			c=1;
+			c<<= static_cast<int64_t>(Element::degree());
+			return c;
+		}
+
+		Element& inv(Element& x, const Element& y) const
+		{
+			x=NTL::to_GF2E(1)/y;
+			return x;
+		}
+
+		Element& invin(Element& x) const
+		{
+			x=NTL::to_GF2E(1)/x;
+			return x;
+		}
+
+		std::istream& read(std::istream& is, Element& x) const
+		{
+			long tmp= 0;
+			is>>tmp;
+			x=NTL::to_GF2E(tmp);
+			return is;
+		}
+	}; // end o class NTL_GF2E
+
+	template <class Ring>
+	struct ClassifyRing;
+
+	template <class Element>
+	struct ClassifyRing<UnparametricRandIter<Element> >;
+
+	template <>
+	struct ClassifyRing<UnparametricRandIter<NTL::GF2E> > {
+		typedef RingCategories::ModularTag categoryTag;
+	};
+
+	template<>
+	class UnparametricRandIter<NTL::GF2E> {
+	public:
+		typedef NTL::GF2E Element;
+		UnparametricRandIter<NTL::GF2E>(const NTL_GF2E & F,
+						const size_t& size = 0,
+						const size_t& seed = 0
+					       ) :
+			_size(size), _seed(seed)
+		{
+			if(_seed == 0)
+				NTL::SetSeed(NTL::to_ZZ(time(0)));
+			else
+				NTL::SetSeed(NTL::to_ZZ(_seed));
+		}
+
+		UnparametricRandIter<NTL::GF2E>(const UnparametricRandIter<NTL::GF2E>& R) :
+			_size(R._size), _seed(R._seed)
+
+		{
+			if(_seed == 0)
+				NTL::SetSeed(NTL::to_ZZ(time(0)));
+			else
+				NTL::SetSeed(NTL::to_ZZ(_seed));
+		}
+
+		Element& random (Element& x) const
+		{
+			NTL::random(x);
+			return x;
+		}
+
+	protected:
+		size_t _size;
+		size_t _seed;
+	};
+
+
+}
+
+#endif //__LINBOX_ntl_gf2e_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/ntl/ntl-lzz_p.h b/linbox/ring/ntl/ntl-lzz_p.h
new file mode 100644
index 0000000..c675c2b
--- /dev/null
+++ b/linbox/ring/ntl/ntl-lzz_p.h
@@ -0,0 +1,379 @@
+/* linbox/field/ntl-lzz_p.h
+ * Copyright (C) 1999-2005 W. J. Turner,
+ *               2001 Bradford Hovinen
+ * Copyright (C) 2011 LinBox
+ *
+ * Written by W. J. Turner <wjturner at acm.org>,
+ *            Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ *
+ */
+
+/*! @file field/ntl/ntl-lzz_p.h
+ * @ingroup field
+ * @ingroup NTL
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_field_ntl_lzz_p_H
+#define __LINBOX_field_ntl_lzz_p_H
+
+#ifndef __LINBOX_HAVE_NTL
+#error "you need NTL here"
+#endif
+
+#include <time.h>
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include <NTL/lzz_p.h>
+#include <NTL/ZZ.h>
+
+#include <givaro/zring.h>
+#include <givaro/unparametric-operations.h>
+#include "linbox/field/field-traits.h"
+#include "linbox/integer.h"
+
+namespace Givaro
+{
+
+	/** Initialization of field element from an integer.
+	 * This Uses NTL's <code>to_zz_p</code> function.
+	 *
+	 * @return reference to field element.
+	 * @param x field element to contain output (reference returned).
+	 * @param y Integer.
+	 */
+	template <>
+	NTL::zz_p& Caster(NTL::zz_p& x, const Integer& y)
+	{
+		return x = NTL::to_zz_p( static_cast<int64_t>(y)%NTL::zz_p::modulus() );
+	}
+	template <>
+	NTL::zz_p& Caster(NTL::zz_p& x, const double& y)
+	{
+		return x = NTL::to_zz_p(long(y)%NTL::zz_p::modulus());
+	}
+
+	/** Conversion of field element to an Integer.
+	 * This function assumes the output field element x has already been
+	 * constructed, but that it is not already initialized.
+	 * For now, this is done by converting the element type to a C++
+	 * long and then to the Integer type through the use of static cast and
+	 * NTL's to_long function.
+	 * This, of course, assumes such static casts are possible.
+	 * This function should be changed in the future to avoid using long.
+	 * @return reference to Integer.
+	 * @param x reference to Integer to contain output (reference returned).
+	 * @param y constant reference to field element.
+	 */
+ 	template <>
+	Integer& Caster(Integer& x, const NTL::zz_p& y)
+	{
+		return x = int64_t(rep(y));
+	}
+} // namespace Givaro
+
+// Namespace in which all LinBox library code resides
+namespace LinBox
+{
+
+	class NTL_zz_p_Initialiser {
+	public :
+		NTL_zz_p_Initialiser( const Integer & q, size_t e = 1) {
+			linbox_check(e == 1);
+			if ( q > 0 )
+				// NTL::zz_p::init(NTL::to_ZZ((std::string(q)).data())); // it's an error if q not prime, e not 1
+				NTL::zz_p::init(int64_t(q)); // it's an error if q not prime, e not 1
+		}
+
+		template <class ElementInt>
+		NTL_zz_p_Initialiser(const ElementInt& d) {
+			NTL::zz_p::init (NTL::to_ZZ(d));
+		}
+
+		NTL_zz_p_Initialiser () { }
+
+	};
+
+	/**
+	 * \brief long ints modulo a positive integer.
+	 *
+	 * While NTL allows any int to serve as the modulus, only prime
+	 * moduli yield fields.  The primality of the modulus will not be checked, so
+	 * it is the programmer's responsibility to supply a prime modulus if a field is
+	 * wanted.
+	 * These specializations allow the \ref Givaro::ZRing template class to be
+	 * used to wrap NTL's <code>zz_p</code> class as a LinBox field.
+	 * Uses nice trick for mod p via floating point.
+	 \ingroup field
+	 */
+	struct NTL_zz_p: public NTL_zz_p_Initialiser, public Givaro::UnparametricOperations<NTL::zz_p> {
+		typedef NTL::zz_p Element ;
+		typedef Givaro::UnparametricOperations<Element> Father_t ;
+		typedef UnparametricRandIter<NTL::zz_p> RandIter;
+
+		const Element zero,one,mOne ;
+
+
+		//public Givaro::ZRing<Element> {
+		NTL_zz_p(integer p, size_t e = 1) :
+			NTL_zz_p_Initialiser(p,e),Father_t ()
+			,zero( NTL::to_zz_p(0)),one( NTL::to_zz_p(1)),mOne(-one)
+		{}
+
+		NTL_zz_p() :
+			NTL_zz_p_Initialiser(2,1), Father_t()
+			,zero( NTL::to_zz_p(0)),one( NTL::to_zz_p(1)),mOne(-one)
+		{}
+
+		Element& init(Element& x, const double& y) const
+		{
+			double z = fmod(y,(double)Element::modulus());
+			if (z > 0) z += 0.5;
+			else z -= 0.5;
+			return x = NTL::to_zz_p(static_cast<long>(z)); //rounds towards 0
+		}
+
+		Element &init (Element &x, const integer &y=0) const
+		{
+			NTL::ZZ tmp= NTL::to_ZZ(std::string(y).data());
+			return x = NTL::to_zz_p(tmp);
+		}
+
+/*
+		template <class ANY>
+		Element& init(Element& x, const ANY& y) const
+		{
+			return x = NTL::to_zz_p((long)(y));
+		}
+*/
+
+		Element& init(Element& x, const NTL::zz_p & y) const
+		{
+			return x = y ;
+		}
+
+		template <class ANY>
+		ANY& convert(ANY& x, const Element& y) const
+		{
+			return Givaro::Caster(x,y);
+		}
+
+		static inline integer maxCardinality()
+		{
+			return integer( int64_t(NTL_SP_BOUND) );
+		}
+
+		Element& pow( Element& res, const Element& x, long exp ) const
+		{
+			NTL::power( res, x, exp );
+			return res;
+		}
+
+		Element& powin( Element& x, long exp ) const
+		{
+			return x = NTL::power(x,exp);
+		}
+		/** Cardinality.
+		 * Return integer representing cardinality of the field.
+		 * Returns the modulus of the field, which should be prime.
+		 * @return integer representing cardinality of the field
+		 */
+
+		integer& cardinality(integer& c) const
+		{
+			return characteristic(c);
+		}
+
+		integer cardinality() const
+		{
+			return characteristic();
+		}
+
+		/** Characteristic.
+		 * Return integer representing characteristic of the field.
+		 * Returns the modulus of the field, which should be prime.
+		 * @return integer representing characteristic of the field.
+		 */
+
+		integer& characteristic(integer& c) const
+		{
+			return c = static_cast<int64_t>(Element::modulus());
+		}
+
+		integer characteristic() const
+		{
+			return static_cast<int64_t>(Element::modulus());
+		}
+
+		/** Multiplicative Inverse.
+		 * x = 1 / y
+		 * This function assumes both field elements have already been
+		 * constructed and initialized.
+		 * @return reference to x.
+		 * @param  x field element (reference returned).
+		 * @param  y field element.
+		 */
+		Element&
+		inv(Element& x, const Element& y) const
+		{
+			return x = NTL::inv(y);
+		}
+
+		/** Zero equality.
+		 * Test if field element is equal to zero.
+		 * This function assumes the field element has already been
+		 * constructed and initialized.
+		 * In this specialization, NTL's IsZero function is called.
+		 * @return boolean true if equals zero, false if not.
+		 * @param  x field element.
+		 */
+		bool isZero(const Element& x) const
+		{
+			return static_cast<bool>(NTL::IsZero(x));
+		}
+
+		/** One equality.
+		 * Test if field element is equal to one.
+		 * This function assumes the field element has already been
+		 * constructed and initialized.
+		 * In this specialization, NTL's IsOne function is called.
+		 * @return boolean true if equals one, false if not.
+		 * @param  x field element.
+		 */
+		bool isOne(const Element& x) const
+		{
+			return static_cast<bool>(NTL::IsOne(x));
+		}
+
+		/** MOne equality.
+		 * Test if field element is equal to one.
+		 * This function assumes the field element has already been
+		 * constructed and initialized.
+		 * In this specialization, NTL's IsMOne function is called.
+		 * @return boolean true if equals one, false if not.
+		 * @param  x field element.
+		 */
+		bool isMOne(const Element& x) const
+		{
+			Element y = x ; negin(y);
+			return isOne(y);
+		}
+
+
+		/** Inplace Multiplicative Inverse.
+		 * x = 1 / x
+		 * This function assumes both field elements have already been
+		 * constructed and initialized.
+		 * @return reference to x.
+		 * @param  x field element (reference returned).
+		 */
+		Element& invin(Element& x) const
+		{
+			return x = NTL::inv(x);
+		}
+
+		/** Print field.
+		 * @return output stream to which field is written.
+		 * @param  os  output stream to which field is written.
+		 */
+		std::ostream& write(std::ostream& os) const
+		{
+			return os << "unparameterized field Element with p = "
+			<< Element::modulus();
+		}
+		std::ostream& write(std::ostream& os, const std::string& ) const
+		{
+			return os << "unparameterized field Element with p = "
+			<< Element::modulus();
+		}
+
+		std::ostream &write (std::ostream &os, const Element &x) const { return Givaro::UnparametricOperations<Element>::write(os,x); }
+	};
+
+	template <class Ring>
+	struct ClassifyRing;
+
+	template <>
+	struct ClassifyRing<NTL_zz_p> {
+		typedef RingCategories::ModularTag categoryTag;
+	};
+
+	template<>
+	class UnparametricRandIter<NTL::zz_p> {
+	public:
+		/// Constructor for random field element generator
+
+		UnparametricRandIter<NTL::zz_p> (const NTL_zz_p & F,
+						 const integer& size=0,
+						 const integer& seed=0) :
+                _size(size), _seed(seed), _ring(F)
+		{
+			if (_seed == integer(0)) _seed = int64_t(time(NULL));
+
+			integer cardinality;
+			F.cardinality(cardinality);
+			if (_size > cardinality)
+				_size = 0;
+
+#ifdef TRACE
+			std::cout << "created random generator with size " << _size
+			<< " and seed " << _seed << std::endl;
+#endif // TRACE
+
+			// Seed random number generator
+			std::stringstream s;
+			NTL::ZZ x;
+			s << _seed;
+			s >> x;
+			NTL::SetSeed(x);//NTL::to_ZZ(static_cast<long>(_seed)));
+		}
+
+		/// Random field element creator.
+		NTL::zz_p& random(NTL::zz_p& x) const
+		{
+			if (_size == 0) {
+				return x = NTL::random_zz_p();
+			}
+			else {
+				return x = NTL::to_zz_p(NTL::RandomBnd(static_cast<int64_t>(_size)));
+			}
+		}
+        const NTL_zz_p& ring() const { return _ring; }
+	protected :
+		integer _size,_seed ;
+        const NTL_zz_p& _ring;
+	};
+
+} // namespace LinBox
+
+#endif // __LINBOX_field_ntl_lzz_p_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/ntl/ntl-lzz_pe.h b/linbox/ring/ntl/ntl-lzz_pe.h
new file mode 100644
index 0000000..6f09b6e
--- /dev/null
+++ b/linbox/ring/ntl/ntl-lzz_pe.h
@@ -0,0 +1,313 @@
+/* linbox/field/ntl-z_pE.h
+ * Copyright (C) 2004  Pascal Giorgi
+ * Copyright (C) 2011 LinBox
+ *
+ * Written by  Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
+ *
+ * Modified by W. J. Turner <wjturner at acm.org>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file field/ntl/ntl-lzz_pE.h
+ * @ingroup field
+ * @ingroup NTL
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_field_ntl_lzz_pe_H
+#define __LINBOX_field_ntl_lzz_pe_H
+
+#ifndef __LINBOX_HAVE_NTL
+#error "you need NTL here"
+#endif
+
+#include <NTL/lzz_pXFactoring.h>
+#include <NTL/lzz_pE.h>
+#include <time.h>
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+
+#include <givaro/zring.h>
+#include "linbox/field/field-traits.h"
+
+
+
+#include "linbox/integer.h"
+
+namespace Givaro
+{
+	template<>
+	NTL::zz_pE& Caster(NTL::zz_pE &x, const Integer &y)
+	{
+		x=NTL::to_zz_pE(static_cast<int64_t>(y));
+		return x;
+	}
+	template<>
+	NTL::zz_pE& Caster(NTL::zz_pE &x, const double &y)
+	{
+		x=NTL::to_zz_pE(static_cast<long>(y));
+		return x;
+	}
+
+	template<>
+	Integer& Caster (Integer& x, const NTL::zz_pE &y) {
+		NTL::zz_pX poly = rep(y);
+		Integer base = static_cast<int64_t>(NTL::zz_p::modulus());
+		long i = deg(poly)+1;
+		x = 0;
+		for( ; i-- ; ) {
+			x *= base;
+			x +=  int64_t(NTL::to_long(rep(coeff(poly, i))));
+		}
+		return x;
+	}
+} // namespace Givaro
+
+
+
+// Namespace in which all LinBox library code resides
+namespace LinBox
+{
+
+	//! use ZZ_pEBak mechanism too ?
+	class NTL_zz_pE_Initialiser {
+	public :
+		NTL_zz_pE_Initialiser( const Integer & p, const Integer & k) {
+			NTL::zz_p::init( (int64_t) p);
+			NTL::zz_pX irredPoly = NTL::BuildIrred_zz_pX ((int64_t) k);
+			NTL::zz_pE::init(irredPoly);
+
+		}
+
+		// template <class ElementInt>
+		// NTL_zz_pE_Initialiser(const ElementInt& d) {
+			// NTL::ZZ_p::init (NTL::to_ZZ(d));
+		// }
+
+		// NTL_zz_pE_Initialiser (const NTL::ZZ& d) {
+			// NTL::ZZ_p::init(d);
+		// }
+
+	};
+
+
+
+
+
+	/*! @brief zz_pE
+	 * Define a parameterized class to easily handle Givaro::ZRing<NTL::zz_pE> field
+	 */
+
+	/// \brief for large cardinality, small prime.  \ingroup field
+	class NTL_zz_pE : public NTL_zz_pE_Initialiser, public Givaro::UnparametricOperations<NTL::zz_pE> {
+	public:
+		typedef NTL::zz_pE Element ;
+		typedef Givaro::UnparametricOperations<Element> Father_t ;
+		typedef UnparametricRandIter<Element> RandIter;
+
+		const Element zero,one,mOne ;
+
+		NTL_zz_pE (const integer &p, const integer &k) :
+			NTL_zz_pE_Initialiser(p,k),Father_t ()
+			//,zero( NTL::to_zz_pE(0)),one( NTL::to_zz_pE(1)),mOne(-one)
+
+		{	init(const_cast<Element &>(zero), 0);
+		 	init(const_cast<Element &>(one), 1);
+		 	init(const_cast<Element &>(mOne), p-1);
+
+			/*
+			NTL::clear(const_cast<Element &>(zero));
+			NTL::set(const_cast<Element &>(one));
+			init(const_cast<Element &>(mOne));
+			neg(const_cast<Element &>(mOne), one);
+			*/
+		}
+
+		Element& random (Element& x) const
+		{
+			NTL::random(x);
+			return x;
+		}
+
+
+		bool isZero (const Element& a) const
+		{
+			return NTL::IsZero(a);
+		}
+
+
+		bool isOne (const Element& a) const
+		{
+			return NTL::IsOne(a);
+		}
+
+		bool isMOne (const Element& x) const
+		{
+			Element y ; neg(y,x);
+			return isOne(y);
+		}
+
+		NTL::zz_pX & init(NTL::zz_pX & f, integer n, int e) const
+		{	integer base = characteristic();
+			NTL::zz_pX x; SetCoeff(x, 1);
+			if ( n != 0 and e > 0 )
+				f = static_cast<int64_t>(n%base) + x*init(f, n/base, e-1);
+			return f;
+		}
+
+		Element & init(Element & x, integer n = 0) const
+		{   // assumes n >= 0.
+			int e = exponent();
+			n %= cardinality();
+			init(const_cast<NTL::zz_pX &>(rep(x)), n, e);
+			//write(std::cout << "init-ed ", x) << std::endl;
+			return x;
+		}
+
+        integer & convert(integer & x, const Element & y) const
+	    {
+			NTL::zz_pX poly = rep(y);
+			integer base = characteristic();
+			long i = deg(poly)+1;
+			x = 0;
+			for( ; i-- ; ) {
+				x *= base;
+				x +=  static_cast<int64_t>(NTL::to_long(rep(coeff(poly, i))));
+			}
+			return x;
+		}
+
+		integer& characteristic (integer &c) const
+		{	return c = characteristic(); }
+		integer characteristic () const
+		{
+			return static_cast<int64_t>(NTL::zz_p::modulus());
+		}
+
+
+		integer& cardinality(integer& c) const
+		{	return c = cardinality(); }
+
+		int exponent() const
+		{
+			return (int) NTL::zz_pE::degree();
+		}
+
+		integer cardinality() const
+		{
+			int32_t e = exponent();
+			int64_t p = characteristic();
+		    integer c(1);
+			for(int32_t i = 0; i < e; ++i)
+				c *= p;
+			return c;
+		}
+
+		static inline integer maxCardinality()
+        { return NTL_zz_p::maxCardinality(); }
+
+
+		Element& inv(Element& x, const Element& y) const
+		{
+			x=one/y;
+			return x;
+		}
+
+		Element& invin(Element& x) const
+		{
+			x=one/x;
+			return x;
+		}
+
+
+
+		std::istream& read(std::istream& is, Element& x) const
+		{
+			long tmp = 0;
+			is>>tmp;
+			x=NTL::to_zz_pE(tmp);
+			return is;
+		}
+	}; // end of class NTL_zz_pE
+
+
+
+
+
+
+	template <class Ring>
+	struct ClassifyRing;
+
+	template<>
+	struct ClassifyRing<UnparametricRandIter<NTL::zz_pE> > {
+		typedef RingCategories::ModularTag categoryTag;
+	};
+
+	template<>
+	class UnparametricRandIter<NTL::zz_pE> {
+	public:
+		typedef NTL::zz_pE Element;
+		UnparametricRandIter<NTL::zz_pE>(const NTL_zz_pE & F ,
+						 const size_t& size = 0,
+						 const size_t& seed = 0
+						) :
+                _size(size), _seed(seed), _ring(F)
+		{
+			if(_seed == 0)
+				NTL::SetSeed(NTL::to_ZZ(time(0)));
+			else
+				NTL::SetSeed(NTL::to_ZZ(_seed));
+		}
+
+        const NTL_zz_pE& ring() const { return _ring; }
+		UnparametricRandIter<NTL::zz_pE>(const UnparametricRandIter<NTL::zz_pE>& R) :
+                _size(R._size), _seed(R._seed), _ring(R._ring)
+
+		{
+			if(_seed == 0)
+				NTL::SetSeed(NTL::to_ZZ(time(0)));
+			else
+				NTL::SetSeed(NTL::to_ZZ(_seed));
+		}
+
+		Element& random (Element& x) const
+		{
+			NTL::random(x);
+			return x;
+		}
+
+	protected:
+		size_t _size;
+		size_t _seed;
+        const NTL_zz_pE& _ring;
+	}; // class UnparametricRandIters
+} // LinBox
+
+#endif //__LINBOX_ntl_lzz_pe_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/ntl/ntl-lzz_pex.h b/linbox/ring/ntl/ntl-lzz_pex.h
new file mode 100644
index 0000000..a34fef5
--- /dev/null
+++ b/linbox/ring/ntl/ntl-lzz_pex.h
@@ -0,0 +1,447 @@
+/* Copyright (C) 2005 LinBox
+ * Copyright (C) 2011 LinBox
+ *
+ *
+ * Written by Daniel Roche, August 2005
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file ring/ntl/ntl-lzz_pEX.h
+ * @ingroup ring
+ * @ingroup NTL
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_field_ntl_lzz_pEX_H
+#define __LINBOX_field_ntl_lzz_pEX_H
+
+#ifndef __LINBOX_HAVE_NTL
+#error "you need NTL here"
+#endif
+
+#include <vector>
+#include <NTL/lzz_pEX.h>
+
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+
+#include <givaro/zring.h>
+#include "linbox/ring/ntl/ntl-lzz_pe.h"
+#include "linbox/integer.h"
+
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+	class NTL_zz_pEX_Initialiser {
+	public :
+		NTL_zz_pEX_Initialiser( const Integer & q, size_t e = 1) {
+			if ( q > 0 )
+				NTL::zz_p::init(static_cast<int64_t>(q)); // it's an error if q not prime
+			NTL::zz_pX irredPoly = NTL::BuildIrred_zz_pX ((long) e);
+			NTL::zz_pE::init(irredPoly);
+		}
+
+		// template <class ElementInt>
+		// NTL_zz_pEX_Initialiser(const ElementInt& d) {
+			// NTL::ZZ_p::init (NTL::to_ZZ(d));
+		// }
+
+		NTL_zz_pEX_Initialiser () { }
+
+	};
+
+	/** Ring (in fact, a unique factorization domain) of polynomial with
+	 * coefficients in class NTL_zz_p (integers mod a wordsize prime).
+	 * All the same functions as any other ring, with the addition of:
+	 * Coeff (type), CoeffField (type), getCoeffField, setCoeff, getCoeff,
+	 * leadCoeff, deg
+	 */
+	class NTL_zz_pEX :  public NTL_zz_pEX_Initialiser, public Givaro::UnparametricOperations<NTL::zz_pEX> {
+	public:
+		typedef NTL::zz_pEX Element ;
+		typedef Givaro::UnparametricOperations<Element> Father_t ;
+		typedef UnparametricRandIter<Element> RandIter;
+
+
+		typedef NTL_zz_pE CoeffField;
+		typedef NTL::zz_pE Coeff;
+		// typedef NTL::zz_pEX Element;
+
+		const Element zero,one,mOne ;
+
+
+		/** Standard LinBox field constructor.  The paramters here
+		 * (prime, exponent) are only used to initialize the coefficient field.
+		 */
+		NTL_zz_pEX( const integer& p, size_t e = 1 ) :
+			// Givaro::ZRing<NTL::zz_pEX>(p, e), _CField(p,e)
+			NTL_zz_pEX_Initialiser(p,e),Father_t ()
+			, zero( NTL::to_zz_pEX(0)),one( NTL::to_zz_pEX(1)),mOne(-one)
+			, _CField(p,e)
+		{}
+
+		/** Constructor from a coefficient field */
+		NTL_zz_pEX( CoeffField cf ) :
+			NTL_zz_pEX_Initialiser(cf.cardinality()),Father_t ()
+			,zero( NTL::to_zz_pEX(0)),one( NTL::to_zz_pEX(1)),mOne(-one)
+			,_CField(cf)
+		{}
+
+		Element& init( Element& p) const
+		{	return init(p, 0); }
+
+		Element& init( Element& p, integer n ) const
+		{
+			p = 0;
+			integer base;
+			Coeff a;
+			_CField.cardinality(base);
+			for (int i = 0; n > 0; n /= base, ++i)
+			{
+			    _CField.init(a, n%base);
+				NTL::SetCoeff( p, i, a );
+			}
+			return p;
+		}
+
+		integer& convert( integer& n, Element& p ) const
+		{
+			integer base;
+			integer d;
+			_CField.cardinality(base);
+			n = 0;
+			for (int i = (int)deg(p); i >= 0; --i)
+			{
+				n *= base;
+				n += _CField.convert(d, NTL::coeff(p, i));
+			}
+			return n;
+		}
+
+#if 0
+		/** Initialize p to the constant y (p = y*x^0) */
+		template <class ANY>
+		Element& init( Element& p, const ANY& y = 0) const
+		{
+			Coeff temp;
+			_CField.init( temp, y );
+			return p = temp;
+		}
+#endif
+
+		/** Initialize p to the constant y (p = y*x^0) */
+		Element& init( Element& p, const Coeff& y ) const
+		{
+			return p = y;
+		}
+
+		/** Initialize p from a vector of coefficients.
+		 * The vector should be ordered the same way NTL does it: the front
+		 * of the vector corresponds to the trailing coefficients, and the back
+		 * of the vector corresponds to the leading coefficients.  That is,
+		 * v[i] = coefficient of x^i.
+		 */
+		template <class ANY>
+		Element& init( Element& p, const std::vector<ANY>& v ) const
+		{
+			p = 0;
+			Coeff temp;
+			for( long i = 0; i < (long)v.size(); ++i ) {
+				_CField.init( temp, v[ (size_t) i ] );
+				if( !_CField.isZero(temp) )
+					NTL::SetCoeff( p, i, temp );
+			}
+			return p;
+		}
+		template <class ANY>
+		Element& init( Element& p, const BlasVector<ANY>& v ) const
+		{
+			p = 0;
+			Coeff temp;
+			for( long i = 0; i < (long)v.size(); ++i ) {
+				_CField.init( temp, v[ (size_t) i ] );
+				if( !_CField.isZero(temp) )
+					NTL::SetCoeff( p, i, temp );
+			}
+			return p;
+		}
+
+
+		/** Initialize p from a vector of coefficients.
+		 * The vector should be ordered the same way NTL does it: the front
+		 * of the vector corresponds to the trailing coefficients, and the back
+		 * of the vector corresponds to the leading coefficients.  That is,
+		 * v[i] = coefficient of x^i.
+		 */
+		Element& init( Element& p, const std::vector<Coeff>& v ) const
+		{
+			p = 0;
+			for( long i = 0; i < (long)v.size(); ++i )
+				NTL::SetCoeff( p, i, v[ (size_t) i ] );
+			return p;
+		}
+
+		/** Convert p to a vector of coefficients.
+		 * The vector will be ordered the same way NTL does it: the front
+		 * of the vector corresponds to the trailing coefficients, and the back
+		 * of the vector corresponds to the leading coefficients.  That is,
+		 * v[i] = coefficient of x^i.
+		 */
+		template< class ANY >
+		std::vector<ANY>& convert( std::vector<ANY>& v, const Element& p ) const
+		{
+			v.clear();
+			ANY temp;
+			for( long i = 0; i <= (long)this->deg(p); ++i ) {
+				_CField.convert( temp, NTL::coeff( p, i ) );
+				v.push_back( temp );
+			}
+			return v;
+		}
+
+		/** Convert p to a vector of coefficients.
+		 * The vector will be ordered the same way NTL does it: the front
+		 * of the vector corresponds to the trailing coefficients, and the back
+		 * of the vector corresponds to the leading coefficients.  That is,
+		 * v[i] = coefficient of x^i.
+		 */
+		std::vector<Coeff>& convert( std::vector<Coeff>& v, const Element& p ) const
+		{
+			v.clear();
+			for( long i = 0; i <= (long)this->deg(p); ++i )
+				v.push_back( NTL::coeff(p,i) );
+			return v;
+		}
+
+		/** Test if an element equals zero */
+		bool isZero( const Element& x ) const
+		{
+			return ( (this->deg(x) == 0) &&
+				 ( _CField.isZero( NTL::ConstTerm(x) ) ) );
+		}
+
+		/** Test if an element equals one */
+		bool isOne( const Element& x ) const
+		{
+			return ( (this->deg(x) == 0) &&
+				 ( _CField.isOne( NTL::ConstTerm(x) ) ) );
+		}
+
+	bool isMOne (const Element& x) const
+		{
+			return ( (this->deg(x) == 0) &&
+				 ( _CField.isMOne( NTL::ConstTerm(x) ) ) );
+
+		}
+
+		/** The LinBox field for coefficients */
+		const CoeffField& getCoeffField() const
+		{ return _CField; }
+
+		/** Get the degree of a polynomial
+		 * Unlike NTL, deg(0)=0.
+		 */
+		size_t deg( const Element& p ) const
+		{
+			long temp = NTL::deg(p);
+			if( temp == -1 ) return 0;
+			else return static_cast<size_t>(temp);
+		}
+
+		/** r will be set to the reverse of p. */
+		Element& rev( Element& r, const Element& p ) {
+			NTL::reverse(r,p);
+			return r;
+		}
+
+		/** r is itself reversed. */
+		Element& revin( Element& r ) {
+			return r = NTL::reverse(r);
+		}
+
+		/** Get the leading coefficient of this polynomial. */
+		Coeff& leadCoeff( Coeff& c, const Element& p ) const
+		{
+			c = NTL::LeadCoeff(p);
+			return c;
+		}
+
+		/** Get the coefficient of x^i in a given polynomial */
+		Coeff& getCoeff( Coeff& c, const Element& p, size_t i ) const
+		{
+			c = NTL::coeff( p, (long)i );
+			return c;
+		}
+
+		/** Set the coefficient of x^i in a given polynomial */
+		Element& setCoeff( Element& p, size_t i, const Coeff& c ) const
+		{
+			NTL::SetCoeff(p,(long)i,c);
+			return p;
+		}
+
+		/** Get the quotient of two polynomials */
+		Element& quo( Element& res, const Element& a, const Element& b ) const
+		{
+			NTL::div(res,a,b);
+			return res;
+		}
+
+		/** a = quotient of a, b */
+		Element& quoin( Element& a, const Element& b ) const
+		{
+			return a /= b;
+		}
+
+		/** Get the remainder under polynomial division */
+		Element& rem( Element& res, const Element& a, const Element& b ) const
+		{
+			NTL::rem(res,a,b);
+			return res;
+		}
+
+		/** a = remainder of a,b */
+		Element& remin( Element& a, const Element& b ) const
+		{
+			return a %= b;
+		}
+
+		/** Get the quotient and remainder under polynomial division */
+		void quorem( Element& q, Element& r,
+			     const Element& a, const Element& b ) const
+		{
+			NTL::DivRem(q,r,a,b);
+		}
+
+		Element& inv( Element& y, const Element& x ) const
+		{
+			// Element one(0, 1);
+			return quo(y,one,x);
+		}
+
+		Element& invin( Element& y ) const
+		{
+			Element x = y;
+			return inv(y, x);
+		}
+
+		/** Get characteristic of the field - same as characteristic of
+		 * coefficient field. */
+		integer& characteristic( integer& c ) const
+		{ return _CField.characteristic(c); }
+
+		/** Get the cardinality of the field.  Since the cardinality is
+		 * infinite, by convention we return -1.
+		 */
+		integer& cardinality( integer& c ) const
+		{ return c = static_cast<integer>(-1); }
+
+		static inline integer maxCardinality()
+		{ return NTL_zz_p::maxCardinality(); }
+		/** Write a description of the field */
+		// Oustide of class definition so write(ostream&,const Element&) from
+		// Givaro::ZRing still works.
+
+		std::ostream& write( std::ostream& os ) const
+		{
+			return os << "Polynomial ring using NTL::zz_pEX";
+		}
+		std::ostream& write( std::ostream& os, const Element& x) const
+		{	return Father_t::write(os, x); }
+
+		/** Conversion to scalar types doesn't make sense and should not be
+		 * used.  Use getCoeff or leadCoeff to get the scalar values of
+		 * specific coefficients, and then convert them using coeffField()
+		 * if needed.
+		 */
+		template< class ANY >
+		ANY& convert( ANY& x, const Element& y ) const
+		{ return x; }
+
+	protected:
+		CoeffField _CField;
+	}; // end of class NTL_zz_pEX
+
+
+
+
+	template <class Ring>
+	struct ClassifyRing;
+
+	template<>
+	struct ClassifyRing<UnparametricRandIter<NTL::zz_pEX> > {
+		typedef RingCategories::ModularTag categoryTag;
+	};
+
+	template<>
+	class UnparametricRandIter<NTL::zz_pEX> {
+	public:
+		typedef NTL::zz_pEX Element;
+		UnparametricRandIter<NTL::zz_pEX>(const NTL_zz_pEX & F ,
+						 const size_t& size = 0,
+						 const size_t& seed = 0
+						) :
+                _size(size), _seed(seed), _ring(F)
+		{
+			if(_seed == 0)
+				NTL::SetSeed(NTL::to_ZZ(time(0)));
+			else
+				NTL::SetSeed(NTL::to_ZZ(_seed));
+		}
+
+        const NTL_zz_pEX& ring() const { return _ring; }
+
+		UnparametricRandIter<NTL::zz_pEX>(const UnparametricRandIter<NTL::zz_pEX>& R) :
+                _size(R._size), _seed(R._seed), _ring(R._ring)
+
+		{
+			if(_seed == 0)
+				NTL::SetSeed(NTL::to_ZZ(time(0)));
+			else
+				NTL::SetSeed(NTL::to_ZZ(_seed));
+		}
+
+		Element& random (Element& x) const
+		{
+			NTL::random(x, 1);
+			return x;
+		}
+
+	protected:
+		size_t _size;
+		size_t _seed;
+        const NTL_zz_pEX& _ring;
+	}; // class UnparametricRandIters
+
+} // end of namespace LinBox
+
+#endif // __LINBOX_field_ntl_lzz_pEX_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/ntl/ntl-lzz_px.h b/linbox/ring/ntl/ntl-lzz_px.h
new file mode 100644
index 0000000..fa43878
--- /dev/null
+++ b/linbox/ring/ntl/ntl-lzz_px.h
@@ -0,0 +1,442 @@
+/* Copyright (C) 2005 LinBox
+ * Copyright (C) 2011 LinBox
+ *
+ *
+ * Written by Daniel Roche, August 2005
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file ring/ntl/ntl-lzz_pX.h
+ * @ingroup ring
+ * @ingroup NTL
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_field_ntl_lzz_px_H
+#define __LINBOX_field_ntl_lzz_px_H
+
+#ifndef __LINBOX_HAVE_NTL
+#error "you need NTL here"
+#endif
+
+#include <vector>
+#include <NTL/lzz_pX.h>
+
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+
+#include <givaro/zring.h>
+#include "linbox/ring/ntl/ntl-lzz_p.h"
+#include "linbox/integer.h"
+
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+	class NTL_zz_pX_Initialiser {
+	public :
+		NTL_zz_pX_Initialiser( const Integer & q, size_t e = 1) {
+			linbox_check(e == 1);
+			if ( q > 0 )
+				NTL::zz_p::init(int64_t(q)); // it's an error if q not prime, e not 1
+		}
+
+		// template <class ElementInt>
+		// NTL_zz_pX_Initialiser(const ElementInt& d) {
+			// NTL::ZZ_p::init (NTL::to_ZZ(d));
+		// }
+
+		NTL_zz_pX_Initialiser () { }
+
+	};
+
+	/** Ring (in fact, a unique factorization domain) of polynomial with
+	 * coefficients in class NTL_zz_p (integers mod a wordsize prime).
+	 * All the same functions as any other ring, with the addition of:
+	 * Coeff (type), CoeffField (type), getCoeffField, setCoeff, getCoeff,
+	 * leadCoeff, deg
+	 */
+	class NTL_zz_pX :  public NTL_zz_pX_Initialiser, public Givaro::UnparametricOperations<NTL::zz_pX> {
+	public:
+		typedef NTL::zz_pX Element ;
+		typedef Givaro::UnparametricOperations<Element> Father_t ;
+		typedef UnparametricRandIter<Element> RandIter;
+
+
+		typedef NTL_zz_p CoeffField;
+		typedef NTL::zz_p Coeff;
+		// typedef NTL::zz_pX Element;
+
+		const Element zero,one,mOne ;
+
+
+		/** Standard LinBox field constructor.  The paramters here
+		 * (prime, exponent) are only used to initialize the coefficient field.
+		 */
+		NTL_zz_pX( const integer& p, size_t e = 1 ) :
+			// Givaro::ZRing<NTL::zz_pX>(p, e), _CField(p,e)
+			NTL_zz_pX_Initialiser(p,e),Father_t ()
+			, zero( NTL::to_zz_pX(0)),one( NTL::to_zz_pX(1)),mOne(-one)
+			, _CField(p,e)
+		{}
+
+		/** Constructor from a coefficient field */
+		NTL_zz_pX( CoeffField cf ) :
+			NTL_zz_pX_Initialiser(cf.cardinality()),Father_t ()
+			,zero( NTL::to_zz_pX(0)),one( NTL::to_zz_pX(1)),mOne(-one)
+			,_CField(cf)
+		{}
+
+		Element& init( Element& p) const
+		{	return init(p, 0); }
+
+		Element& init( Element& p, integer n ) const
+		{
+			p = 0;
+			integer base;
+			_CField.cardinality(base);
+			for (int i = 0; n > 0; n /= base, ++i)
+				NTL::SetCoeff( p, i, int64_t(n%base) );
+			return p;
+		}
+
+		integer& convert( integer& n, Element& p ) const
+		{
+			integer base;
+			Coeff x; integer a;
+			_CField.cardinality(base);
+			n = 0;
+			for (int i = (int)deg(p); i >= 0; --i)
+			{
+				n *= base;
+				NTL::GetCoeff(x, p, i );
+				n += _CField.convert(a, x);
+			}
+			return n;
+		}
+
+#if 0
+		/** Initialize p to the constant y (p = y*x^0) */
+		template <class ANY>
+		Element& init( Element& p, const ANY& y = 0) const
+		{
+			Coeff temp;
+			_CField.init( temp, y );
+			return p = temp;
+		}
+#endif
+
+		/** Initialize p to the constant y (p = y*x^0) */
+		Element& init( Element& p, const Coeff& y ) const
+		{
+			return p = y;
+		}
+
+		/** Initialize p from a vector of coefficients.
+		 * The vector should be ordered the same way NTL does it: the front
+		 * of the vector corresponds to the trailing coefficients, and the back
+		 * of the vector corresponds to the leading coefficients.  That is,
+		 * v[i] = coefficient of x^i.
+		 */
+		template <class ANY>
+		Element& init( Element& p, const std::vector<ANY>& v ) const
+		{
+			p = 0;
+			Coeff temp;
+			for( long i = 0; i < (long)v.size(); ++i ) {
+				_CField.init( temp, v[ (size_t) i ] );
+				if( !_CField.isZero(temp) )
+					NTL::SetCoeff( p, i, temp );
+			}
+			return p;
+		}
+		template <class ANY>
+		Element& init( Element& p, const BlasVector<ANY>& v ) const
+		{
+			p = 0;
+			Coeff temp;
+			for( long i = 0; i < (long)v.size(); ++i ) {
+				_CField.init( temp, v[ (size_t) i ] );
+				if( !_CField.isZero(temp) )
+					NTL::SetCoeff( p, i, temp );
+			}
+			return p;
+		}
+
+
+		/** Initialize p from a vector of coefficients.
+		 * The vector should be ordered the same way NTL does it: the front
+		 * of the vector corresponds to the trailing coefficients, and the back
+		 * of the vector corresponds to the leading coefficients.  That is,
+		 * v[i] = coefficient of x^i.
+		 */
+		Element& init( Element& p, const std::vector<Coeff>& v ) const
+		{
+			p = 0;
+			for( long i = 0; i < (long)v.size(); ++i )
+				NTL::SetCoeff( p, i, v[ (size_t) i ] );
+			return p;
+		}
+
+		/** Convert p to a vector of coefficients.
+		 * The vector will be ordered the same way NTL does it: the front
+		 * of the vector corresponds to the trailing coefficients, and the back
+		 * of the vector corresponds to the leading coefficients.  That is,
+		 * v[i] = coefficient of x^i.
+		 */
+		template< class ANY >
+		std::vector<ANY>& convert( std::vector<ANY>& v, const Element& p ) const
+		{
+			v.clear();
+			ANY temp;
+			for( long i = 0; i <= (long)this->deg(p); ++i ) {
+				_CField.convert( temp, NTL::coeff( p, i ) );
+				v.push_back( temp );
+			}
+			return v;
+		}
+
+		/** Convert p to a vector of coefficients.
+		 * The vector will be ordered the same way NTL does it: the front
+		 * of the vector corresponds to the trailing coefficients, and the back
+		 * of the vector corresponds to the leading coefficients.  That is,
+		 * v[i] = coefficient of x^i.
+		 */
+		std::vector<Coeff>& convert( std::vector<Coeff>& v, const Element& p ) const
+		{
+			v.clear();
+			for( long i = 0; i <= (long)this->deg(p); ++i )
+				v.push_back( NTL::coeff(p,i) );
+			return v;
+		}
+
+		/** Test if an element equals zero */
+		bool isZero( const Element& x ) const
+		{
+			return ( (this->deg(x) == 0) &&
+				 ( _CField.isZero( NTL::ConstTerm(x) ) ) );
+		}
+
+		/** Test if an element equals one */
+		bool isOne( const Element& x ) const
+		{
+			return ( (this->deg(x) == 0) &&
+				 ( _CField.isOne( NTL::ConstTerm(x) ) ) );
+		}
+
+	bool isMOne (const Element& x) const
+		{
+			return ( (this->deg(x) == 0) &&
+				 ( _CField.isMOne( NTL::ConstTerm(x) ) ) );
+
+		}
+
+		/** The LinBox field for coefficients */
+		const CoeffField& getCoeffField() const
+		{ return _CField; }
+
+		/** Get the degree of a polynomial
+		 * Unlike NTL, deg(0)=0.
+		 */
+		size_t deg( const Element& p ) const
+		{
+			long temp = NTL::deg(p);
+			if( temp == -1 ) return 0;
+			else return static_cast<size_t>(temp);
+		}
+
+		/** r will be set to the reverse of p. */
+		Element& rev( Element& r, const Element& p ) {
+			NTL::reverse(r,p);
+			return r;
+		}
+
+		/** r is itself reversed. */
+		Element& revin( Element& r ) {
+			return r = NTL::reverse(r);
+		}
+
+		/** Get the leading coefficient of this polynomial. */
+		Coeff& leadCoeff( Coeff& c, const Element& p ) const
+		{
+			c = NTL::LeadCoeff(p);
+			return c;
+		}
+
+		/** Get the coefficient of x^i in a given polynomial */
+		Coeff& getCoeff( Coeff& c, const Element& p, size_t i ) const
+		{
+			c = NTL::coeff( p, (long)i );
+			return c;
+		}
+
+		/** Set the coefficient of x^i in a given polynomial */
+		Element& setCoeff( Element& p, size_t i, const Coeff& c ) const
+		{
+			NTL::SetCoeff(p,(long)i,c);
+			return p;
+		}
+
+		/** Get the quotient of two polynomials */
+		Element& quo( Element& res, const Element& a, const Element& b ) const
+		{
+			NTL::div(res,a,b);
+			return res;
+		}
+
+		/** a = quotient of a, b */
+		Element& quoin( Element& a, const Element& b ) const
+		{
+			return a /= b;
+		}
+
+		/** Get the remainder under polynomial division */
+		Element& rem( Element& res, const Element& a, const Element& b ) const
+		{
+			NTL::rem(res,a,b);
+			return res;
+		}
+
+		/** a = remainder of a,b */
+		Element& remin( Element& a, const Element& b ) const
+		{
+			return a %= b;
+		}
+
+		/** Get the quotient and remainder under polynomial division */
+		void quorem( Element& q, Element& r,
+			     const Element& a, const Element& b ) const
+		{
+			NTL::DivRem(q,r,a,b);
+		}
+
+		Element& inv( Element& y, const Element& x ) const
+		{
+			// Element one(0, 1);
+			return quo(y,one,x);
+		}
+
+		Element& invin( Element& y ) const
+		{
+			Element x = y;
+			return inv(y, x);
+		}
+
+		/** Get characteristic of the field - same as characteristic of
+		 * coefficient field. */
+		integer& characteristic( integer& c ) const
+		{ return _CField.characteristic(c); }
+
+		/** Get the cardinality of the field.  Since the cardinality is
+		 * infinite, by convention we return -1.
+		 */
+		integer& cardinality( integer& c ) const
+		{ return c = static_cast<integer>(-1); }
+
+		static inline integer maxCardinality()
+		{ return CoeffField::maxCardinality(); }
+		/** Write a description of the field */
+		// Oustide of class definition so write(ostream&,const Element&) from
+		// Givaro::ZRing still works.
+
+		std::ostream& write( std::ostream& os ) const
+		{
+			return os << "Polynomial ring using NTL::zz_pX";
+		}
+		std::ostream& write( std::ostream& os, const Element& x) const
+		{	return Father_t::write(os, x); }
+
+		/** Conversion to scalar types doesn't make sense and should not be
+		 * used.  Use getCoeff or leadCoeff to get the scalar values of
+		 * specific coefficients, and then convert them using coeffField()
+		 * if needed.
+		 */
+		template< class ANY >
+		ANY& convert( ANY& x, const Element& y ) const
+		{ return x; }
+
+	protected:
+		CoeffField _CField;
+	}; // end of class NTL_zz_pX
+
+
+
+
+	template <class Ring>
+	struct ClassifyRing;
+
+	template<>
+	struct ClassifyRing<UnparametricRandIter<NTL::zz_pX> > {
+		typedef RingCategories::ModularTag categoryTag;
+	};
+
+	template<>
+	class UnparametricRandIter<NTL::zz_pX> {
+	public:
+		typedef NTL::zz_pX Element;
+		UnparametricRandIter<NTL::zz_pX>(const NTL_zz_pX & F ,
+						 const size_t& size = 0,
+						 const size_t& seed = 0
+						) :
+                _size(size), _seed(seed), _ring(F)
+		{
+			if(_seed == 0)
+				NTL::SetSeed(NTL::to_ZZ(time(0)));
+			else
+				NTL::SetSeed(NTL::to_ZZ(_seed));
+		}
+
+        const NTL_zz_pX& ring() const { return _ring; }
+		UnparametricRandIter<NTL::zz_pX>(const UnparametricRandIter<NTL::zz_pX>& R) :
+                _size(R._size), _seed(R._seed), _ring(R._ring)
+
+		{
+			if(_seed == 0)
+				NTL::SetSeed(NTL::to_ZZ(time(0)));
+			else
+				NTL::SetSeed(NTL::to_ZZ(_seed));
+		}
+
+		Element& random (Element& x) const
+		{
+			NTL::random(x, 1);
+			return x;
+		}
+
+	protected:
+		size_t _size;
+		size_t _seed;
+        const NTL_zz_pX& _ring;
+	}; // class UnparametricRandIters
+
+} // end of namespace LinBox
+
+#endif // __LINBOX_field_ntl_lzz_px_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/ntl/ntl-rr.h b/linbox/ring/ntl/ntl-rr.h
new file mode 100644
index 0000000..c9c57b2
--- /dev/null
+++ b/linbox/ring/ntl/ntl-rr.h
@@ -0,0 +1,356 @@
+/* linbox/field/ntl-RR.h
+ * Copyright (C) 1999-2005 William J Turner,
+ *               2001 Bradford Hovinen
+ * Copyright (C) 2011 LinBox
+ *
+ * Written by W. J. Turner <wjturner at acm.org>,
+ *            Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file field/ntl/ntl-RR.h
+ * @ingroup field
+ * @ingroup NTL
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_field_ntl_rr_H
+#define __LINBOX_field_ntl_rr_H
+
+#include <sstream>
+#include "linbox/linbox-config.h"
+
+#ifndef __LINBOX_HAVE_NTL
+#error "you need NTL here"
+#endif
+
+
+#include <NTL/tools.h>
+#include <NTL/RR.h>
+
+#include "linbox/util/debug.h"
+
+#include <givaro/zring.h>
+#include <givaro/unparametric-operations.h>
+#include "linbox/field/field-traits.h"
+
+#include "linbox/integer.h"
+
+namespace Givaro
+{
+	/** Initialization of field element from an integer.
+	 * Behaves like C++ allocator construct.
+	 * This function assumes the output field element x has already been
+	 * constructed, but that it is not already initialized.
+	 * For now, this is done by converting the integer type to a C++
+	 * long and then to the element type through the use of static cast and
+	 * NTL's to_RR function.
+	 * This, of course, assumes such static casts are possible.
+	 * This function should be changed in the future to avoid using long.
+	 * @return reference to field element.
+	 * @param x field element to contain output (reference returned).
+	 * @param y integer.
+	 */
+	template <>
+	NTL::RR& Caster(NTL::RR& x, const Integer& y)
+	{
+		std::stringstream s;
+		s << y;
+		s >> x;
+		return x;
+		//return x = NTL::to_RR(static_cast<long>(y)); 
+	}
+	template <> NTL::RR& Caster(NTL::RR& x, const double& y) { return x = NTL::to_RR((long)(y)); }
+
+	template <> NTL::RR& Caster(NTL::RR& x, const int32_t& y) { return x = NTL::to_RR((long)(y)); }
+
+	template <> NTL::RR& Caster(NTL::RR& x, const int64_t& y) { return x = NTL::to_RR((long)(y)); }
+
+	template <> NTL::RR& Caster(NTL::RR& x, const uint32_t& y) { return x = NTL::to_RR((unsigned long)(y)); }
+
+	template <> NTL::RR& Caster(NTL::RR& x, const uint64_t& y) { return x = NTL::to_RR((unsigned long)(y)); }
+
+	/** Conversion of field element to an integer.
+	 * This function assumes the output field element x has already been
+	 * constructed, but that it is not already initialized.
+	 * For now, this is done by converting the element type to a C++
+	 * long and then to the integer type through the use of static cast and
+	 * NTL's to_long function.
+	 * This, of course, assumes such static casts are possible.
+	 * This function should be changed in the future to avoid using long.
+	 * @return reference to integer.
+	 * @param x reference to integer to contain output (reference returned).
+	 * @param y constant reference to field element.
+	 */
+	template <>
+	Integer& Caster(Integer& x, const NTL::RR& y)
+	{
+		std::stringstream s;
+		s << y;
+		s >> x;
+		return x;
+		//return x = static_cast<Integer>(to_long(y));
+	}
+} // namespace Givaro
+
+
+
+
+// Namespace in which all LinBox library code resides
+namespace LinBox
+{
+
+	class NTL_RR_Initialiser {
+	public :
+		NTL_RR_Initialiser () { }
+	};
+
+    template<class XXX> class UnparametricRandIter;
+
+
+	/** @name class RR.
+	  \brief
+	 * Rational number field.
+	 * This field is provided as a convenience in a few places.
+	 * Use with caution because expression swell.
+	 *
+	 * This specialization allows the \ref Givaro::ZRing template class to be
+	 * used to wrap NTL's RR class as a LinBox field.
+	 \ingroup field
+	 */
+	//@{
+
+
+	struct NTL_RR: public NTL_RR_Initialiser, public Givaro::UnparametricOperations<NTL::RR> {
+		typedef NTL::RR Element ;
+		typedef Givaro::UnparametricOperations<Element> Father_t ;
+		typedef UnparametricRandIter<Element> RandIter;
+
+		const Element zero,one,mOne ;
+
+		NTL_RR() :
+			NTL_RR_Initialiser(),Father_t ()
+			,zero( NTL::to_RR(0)),one( NTL::to_RR(1)),mOne(-one)
+		{
+			// no default - allow initialization of ZZ_p directly by user.
+		}
+
+
+		/** Multiplicative Inverse.
+		 * x = 1 / y
+		 * This function assumes both field elements have already been
+		 * constructed and initialized.
+		 * @return reference to x.
+		 * @param  x field element (reference returned).
+		 * @param  y field element.
+		 */
+		Element& inv(Element& x, const Element& y) const
+		{
+			return x = NTL::inv(y);
+		}
+
+		/** Zero equality.
+		 * Test if field element is equal to zero.
+		 * This function assumes the field element has already been
+		 * constructed and initialized.
+		 * In this specialization, NTL's IsZero function is called.
+		 * @return boolean true if equals zero, false if not.
+		 * @param  x field element.
+		 */
+		bool isZero(const Element& x) const
+		{
+			return static_cast<bool>(IsZero(x));
+		}
+
+		/** One equality.
+		 * Test if field element is equal to one.
+		 * This function assumes the field element has already been
+		 * constructed and initialized.
+		 * In this specialization, NTL's IsOne function is called.
+		 * @return boolean true if equals one, false if not.
+		 * @param  x field element.
+		 */
+		bool isOne(const Element& x) const
+		{
+			return static_cast<bool>(IsOne(x));
+		}
+		/** MOne equality.
+		 * Test if field element is equal to one.
+		 * This function assumes the field element has already been
+		 * constructed and initialized.
+		 * In this specialization, NTL's IsMOne function is called.
+		 * @return boolean true if equals one, false if not.
+		 * @param  x field element.
+		 */
+		bool isMOne(const Element& x) const
+		{
+			Element y ; neg(y,x);
+			return isOne(y);
+		}
+
+
+		/** Inplace Multiplicative Inverse.
+		 * x = 1 / x
+		 * This function assumes both field elements have already been
+		 * constructed and initialized.
+		 * @return reference to x.
+		 * @param  x field element (reference returned).
+		 */
+		Element& invin(Element& x) const
+		{
+			return x = NTL::inv(x);
+		}
+
+		/** Print field.
+		 * @return output stream to which field is written.
+		 * @param  os  output stream to which field is written.
+		 */
+		std::ostream& write(std::ostream& os) const
+		{
+			return os << "unparameterized field Element";
+		}
+
+		integer & cardinality(integer &c) const
+		{
+			return c = -1;
+		}
+
+		integer & characteristic(integer &c) const
+		{
+			return c = 0;
+		}
+
+		std::ostream &write (std::ostream &os, const Element &x) const {
+			return Givaro::UnparametricOperations<Element>::write(os,x);
+		}
+
+		Element& init (Element& x) const
+		{
+			return x;
+		}
+
+		template <typename Src>
+		Element& init (Element& x, const Src& s) const
+		{
+			return Caster (x, s);
+		}
+
+		template <typename T>
+		T& convert (T &x, const Element &y) const
+		{
+			return Caster (x,y);
+		}
+
+
+	};
+
+	template <>
+	class UnparametricRandIter<NTL::RR> {
+		typedef NTL::RR Element ;
+	protected:
+		integer _size,_seed;
+        const NTL_RR& _ring;
+	public:
+
+		UnparametricRandIter<NTL::RR> (const NTL_RR & F,
+					       const integer& size = 0,
+					       const integer& seed = 0) :
+                _size(size), _seed(seed), _ring(F)
+		{
+			if (_seed == integer(0)) _seed = int64_t(time(NULL));
+
+			// integer cardinality;
+			// F.cardinality(cardinality);
+			// if (_size > cardinality)
+				// _size = 0;
+
+#ifdef TRACE
+			std::cout << "created random generator with size " << _size
+			<< " and seed " << _seed << std::endl;
+#endif // TRACE
+
+			// Seed random number generator
+			std::stringstream s; NTL::ZZ x;
+			s << _seed;
+			s >> x;
+			NTL::SetSeed(NTL::to_ZZ(x));
+		}
+
+        const NTL_RR& ring() const { return _ring; }
+
+		/** Random field element creator.
+		 * This returns a random field element from the information supplied
+		 * at the creation of the generator.
+		 * This generator uses the built-in C++ random number generator instead of
+		 * NTL's random function because the NTL function does not allow as much
+		 * control over the sampling size as the generic LinBox template.  This
+		 * specialization is included only to allow conversion to an NTL
+		 * object.
+		 * @return random field element
+		 */
+		Element& random(Element &elt) const
+		{
+			// NTL::random(elt);
+			// Create new random elements
+			if (_size == 0)
+				elt = rand();
+			else
+				elt = static_cast<double>((double(rand())/RAND_MAX)*double(_size));
+
+#ifdef TRACE
+			double temp ;
+			NTL::conv(temp, elt);
+			std::cout << "random double = " << temp << "    random Element = " << elt << std::endl;
+#endif // TRACE
+
+			return elt;
+
+		} // element& operator() (void)
+
+	};
+
+	template <class Ring>
+	struct ClassifyRing;
+
+	template<class Element>
+	struct ClassifyRing<Givaro::ZRing<Element> >;
+
+	template<>
+	struct ClassifyRing<NTL_RR >{
+		typedef RingCategories::ModularTag categoryTag;
+	};
+	//@}
+} // namespace LinBox
+
+#endif // __LINBOX_field_ntl_rr_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/ntl/ntl-zz.h b/linbox/ring/ntl/ntl-zz.h
new file mode 100644
index 0000000..7b44bb1
--- /dev/null
+++ b/linbox/ring/ntl/ntl-zz.h
@@ -0,0 +1,782 @@
+/* Copyright (C) LinBox
+ *  Author: Zhendong Wan
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/** @file field/ntl/ntl-ZZ.h
+ * @ingroup field
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_ntl_zz_H
+#define __LINBOX_ntl_zz_H
+
+#include <NTL/ZZ.h>
+#include "linbox/integer.h"
+#include <iostream>
+#include "linbox/util/debug.h"
+#include "linbox/randiter/ntl-zz.h"
+#include "linbox/field/field-traits.h"
+
+namespace LinBox
+{
+
+	template <class Ring>
+	struct ClassifyRing ;
+
+	class NTL_ZZ;
+
+	template <>
+	struct ClassifyRing<NTL_ZZ>
+	{
+		typedef RingCategories::IntegerTag categoryTag;
+	};
+
+	template<class Field>
+	class FieldAXPY;
+
+	/// \brief the integer ring. \ingroup ring
+	class NTL_ZZ {
+
+	public:
+		typedef NTL_ZZRandIter RandIter;
+		typedef NTL_ZZ Father_t ;
+
+		typedef NTL::ZZ Element;
+		typedef NTL::ZZ Residu_t;
+		Element zero,one,mOne;
+
+		NTL_ZZ(int p = 0, int exp = 1)
+		{
+			if( p != 0 ) throw PreconditionFailed(LB_FILE_LOC,"modulus must be 0 (no modulus)");
+			if( exp != 1 ) throw PreconditionFailed(LB_FILE_LOC,"exponent must be 1");
+		}
+
+		inline integer& cardinality (integer& c) const
+		{
+			return c = -1;
+		}
+
+		inline integer& characteristic (integer& c)const
+		{
+			return c = 0;
+		}
+
+		template<class IntType>
+		inline IntType & characteristic (IntType& c)const
+		{
+			return c = 0;
+		}
+
+		std::ostream& write (std::ostream& out) const
+		{
+			return out << "NTL ZZ Ring";
+		}
+
+		std::istream& read (std::istream& in) const
+		{
+			return in;
+		}
+
+		/** @brief
+		 *  Init x from y.
+		 */
+		template<class Element2>
+		inline Element& init (Element& x,  const Element2& y) const
+		{
+
+			NTL::conv (x, y);
+
+			return x;
+		}
+
+		/** @brief
+		 *   Init from a NTL::ZZ
+		 */
+		inline Element& init (Element& x, const Element& y) const
+		{
+
+			x = y;
+
+			return x;
+		}
+
+		/** @brief
+		 *   Init from an int64_t
+		 */
+		inline Element& init (Element& x, const int64_t& y) const
+		{
+			bool isNeg = false;
+			uint64_t t;
+			if( y < 0 ) {
+				isNeg = true;
+				t = uint64_t(y * -1);
+			}
+			else t = (uint64_t) y;
+			init(x,t);
+			if( isNeg ) x *= -1;
+			return x;
+		}
+
+		/** @brief
+		 *   Init from a uint64_t
+		 */
+		inline Element& init (Element& x, const uint64_t& y) const
+		{
+			uint64_t shift = (uint64_t)1 << 32;
+			uint32_t temp = uint32_t(y % shift);
+			NTL::conv (x,temp);
+			x <<= 32;
+			temp = (uint32_t)(y / shift);
+			x += temp;
+			return x;
+		}
+
+		/** @brief
+		 *  I don't  know how to init from integer efficiently.
+		 */
+		// c_str is safer than data, Z. W and BDS
+		inline Element& init (Element& x, const integer& y) const
+		{
+
+			return x=NTL::to_ZZ((std::string(y)).c_str());
+		}
+
+		/** @brief
+		 *  Convert y to an Element.
+		 */
+		inline integer& convert (integer& x, const Element& y) const
+		{
+			bool Neg=false;
+			if (sign(y) <0)
+				Neg=true;
+			long b = NumBytes(y);
+			unsigned char* byteArray;
+			byteArray = new unsigned char[(size_t)b ];
+			BytesFromZZ(byteArray, y, b);
+
+			integer base(256);
+			x= integer(0);
+
+			for(long i = b - 1; i >= 0; --i) {
+				x *= base;
+				x += integer(byteArray[i]);
+			}
+			delete [] byteArray;
+			if (Neg)
+				x=-x;
+			return x;
+		}
+
+		inline double& convert (double& x, const Element& y) const
+		{
+			return x=NTL::to_double(y);
+		}
+
+
+
+		/** @brief
+		 *  x = y.
+		 */
+		inline Element&  assign (Element& x, const Element& y)  const
+		{
+			return x = y;
+		}
+
+		/** @brief
+		 *  Test if x == y
+		 */
+		inline bool areEqual (const Element& x ,const Element& y) const
+		{
+			return x == y;
+		}
+
+		/** @brief
+		 *  Test if x == 0
+		 */
+		inline bool isZero (const Element& x) const
+		{
+			return NTL::IsZero (x);
+		}
+
+		/** @brief
+		 *  Test if x == 1
+		 */
+		inline bool isOne (const Element& x) const
+		{
+			return NTL::IsOne (x);
+		}
+		/** @brief
+		 *  Test if x == -1
+		 */
+		inline bool isMOne (const Element& x) const
+		{
+			Element y ; neg(y,x);
+			return isOne(y);
+
+		}
+
+
+		// arithmetic
+
+		/** @brief
+		 *  return x = y + z
+		 */
+		inline Element& add (Element& x, const Element& y, const Element& z) const
+		{
+
+			NTL::add (x, y, z);
+
+			return x;
+		}
+
+		/** @brief
+		 *  return x = y - z
+		 */
+		inline Element& sub (Element& x, const Element& y, const Element& z) const
+		{
+
+			NTL::sub (x, y, z);
+
+			return x;
+		}
+
+		/** @brief
+		 *  return x = y * z
+		 */
+		template <class Int>
+		inline Element& mul (Element& x, const Element& y, const Int& z) const
+		{
+
+			NTL::mul (x, y, z);
+
+			return x;
+		}
+
+		/** @brief
+		 *  If z divides y, return x = y / z,
+		 *  otherwise, throw an exception
+		 */
+		inline Element& div (Element& x, const Element& y, const Element& z) const
+		{
+
+			Element q, r;
+
+			NTL::DivRem (q, r, y, z);
+
+			if (NTL::IsZero (r))
+				return x = q;
+
+			else
+				throw PreconditionFailed(LB_FILE_LOC,"Div: not dividable");
+		}
+
+		/** @brief
+		 *  If y is a unit, return x = 1 / y,
+		 *  otherwsie, throw an exception
+		 */
+		inline Element& inv (Element& x, const Element& y) const
+		{
+
+			if ( NTL::IsOne (y)) return x = y;
+
+			else if ( NTL::IsOne (-y)) return x = y;
+
+			else
+				throw PreconditionFailed(LB_FILE_LOC,"Inv: Not invertible");
+		}
+
+		/** @brief
+		 *  return x = -y;
+		 */
+		inline Element& neg (Element& x, const Element& y) const
+		{
+
+			NTL::negate (x, y);
+
+			return x;
+		}
+
+
+		/** @brief
+		 *  return r = a x + y
+		 */
+		template <class Int>
+		inline Element& axpy (Element& r, const Element& a, const Int& x, const Element& y) const
+		{
+
+			NTL::mul (r, a, x);
+
+			return r += y;
+		}
+
+
+		// inplace operator
+
+		/** @brief
+		 *  return x += y;
+		 */
+		inline Element& addin (Element& x, const Element& y) const
+		{
+
+			return x += y;
+		}
+
+		/** @brief
+		 *  return x -= y;
+		 */
+		inline Element& subin (Element& x, const Element& y)  const
+		{
+
+			return x -= y;
+		}
+
+		/** @brief
+		 *  return x *= y;
+		 */
+		template<class Int>
+		inline Element& mulin (Element& x, const Int& y)  const
+		{
+
+			return x *= y;
+		}
+
+		/** @brief
+		 *  If y divides x, return x /= y,
+		 *  otherwise throw an exception
+		 */
+		inline Element& divin (Element& x, const Element& y) const
+		{
+
+			div (x, x, y);
+
+			return x;
+		}
+
+		/** @brief
+		 *  If x is a unit, x = 1 / x,
+		 *  otherwise, throw an exception.
+		 */
+		inline Element& invin (Element& x) {
+
+			if (NTL::IsOne (x)) return x;
+
+			else if (NTL::IsOne (-x)) return x;
+
+			else throw PreconditionFailed(LB_FILE_LOC,"Div: not dividable");
+		}
+
+		/** @brief
+		 *  return x = -x;
+		 */
+		inline Element& negin (Element& x) const
+		{
+
+			NTL::negate (x, x);
+
+			return x;
+		}
+
+		/** @brief
+		 *  return r += a x
+		 */
+		template <class Int>
+		inline Element& axpyin (Element& r, const Element& a, const Int& x) const
+		{
+
+			return r += a * x;
+		}
+
+
+		// IO
+
+		/** @brief
+		 *  out << y;
+		 */
+		std::ostream& write(std::ostream& out,const Element& y) const
+		{
+
+			out << y;
+
+			return out;
+		}
+
+
+		/** @brief
+		 *  read x from istream in
+		 */
+		std::istream& read(std::istream& in, Element& x) const
+		{
+
+			return in >> x;
+		}
+
+
+		/** some PIR function
+		*/
+
+		/** @brief
+		 *  Test if x is a unit.
+		 */
+		inline bool isUnit (const Element& x) const
+		{
+
+			return (NTL::IsOne (x) || NTL::IsOne (-x));
+		}
+
+		/** @brief
+		 *  return g = gcd (a, b)
+		 */
+		inline Element& gcd (Element& g, const Element& a, const Element& b) const
+		{
+
+			NTL::GCD (g, a, b);
+
+			return g;
+		}
+
+		/** @brief
+		 *  return g = gcd (g, b)
+		 */
+		inline Element& gcdin (Element& g, const Element& b) const
+		{
+
+			NTL::GCD (g, g, b);
+
+			return g;
+		}
+
+		/** @brief
+		 *  g = gcd(a, b) = a*s + b*t.
+		 *  The coefficients s and t are defined according to the standard
+		 *  Euclidean algorithm applied to |a| and |b|, with the signs then
+		 *  adjusted according to the signs of a and b.
+		 */
+		inline Element& xgcd (Element& g, Element& s, Element& t, const Element& a, const Element& b)const
+		{
+
+			NTL::XGCD (g,s,t,a,b);
+
+			return g;
+		}
+
+		/** @brief
+		 *  c = lcm (a, b)
+		 */
+		inline Element& lcm (Element& c, const Element& a, const Element& b) const
+		{
+
+
+			if (NTL::IsZero (a) || NTL::IsZero (b)) return c = NTL::ZZ::zero();
+
+			else {
+				Element g;
+
+				NTL::GCD (g, a, b);
+
+				NTL::mul (c, a, b);
+
+				c /= g;
+
+				NTL::abs (c, c);
+
+				return c;
+			}
+		}
+
+		/** @brief
+		 *  l = lcm (l, b)
+		 */
+		inline Element& lcmin (Element& l, const Element& b) const
+		{
+
+			if (NTL::IsZero (l) || NTL::IsZero (b))
+
+				return l = NTL::ZZ::zero();
+
+			else {
+
+				Element g;
+
+				NTL::GCD (g, l, b);
+
+				l *= b;
+
+				l /= g;
+
+				NTL::abs (l, l);
+
+				return l;
+			}
+		}
+
+
+
+
+
+		// some specail function
+
+		/** @brief
+		 *  x = floor ( sqrt(y)).
+		 */
+
+		inline Element& sqrt (Element& x, const Element& y) const
+		{
+
+			NTL::SqrRoot(x,y);
+
+			return x;
+		}
+
+		/** @brief
+		 *  Requires 0 <= x < m, m > 2 * a_bound * b_bound,
+		 *  a_bound >= 0, b_bound > 0
+		 *   This routine either returns 0, leaving a and b unchanged,
+		 *   or returns 1 and sets a and b so that
+		 *  (1) a = b x (mod m),
+		 *  (2) |a| <= a_bound, 0 < b <= b_bound, and
+		 *  (3) gcd(m, b) = gcd(a, b).
+		 */
+
+		inline long reconstructRational (Element& a, Element& b, const Element& x, const Element& m,
+						 const Element& a_bound, const Element& b_bound) const
+		{
+
+			return NTL::ReconstructRational(a,b,x,m,a_bound,b_bound);
+		}
+
+
+		/** @brief
+		 *  q = floor (x/y);
+		 */
+		inline Element& quo (Element& q, const Element& a, const Element& b) const
+		{
+
+			NTL::div (q, a, b);
+
+			return q;
+		}
+
+		/** @brief
+		 *  r = remindar of  a / b
+		 */
+		inline Element& rem (Element& r, const Element& a, const Element& b) const
+		{
+
+			NTL::rem (r, a, b);
+
+			return r;
+		}
+
+		/** @brief
+		 *  a = quotient (a, b)
+		 */
+		inline Element& quoin (Element& a, const Element& b) const
+		{
+
+			return a /= b;
+
+		}
+
+		/** @brief
+		 *  a = quotient (a, b)
+		 */
+		inline Element& remin (Element& x, const Element& y)  const
+		{
+			return x %= y;
+		}
+
+
+		/** @brief
+		 * q = [a/b], r = a - b*q
+		 * |r| < |b|, and if r != 0, sign(r) = sign(b)
+		 */
+		inline void quoRem (Element& q, Element& r, const Element& a, const Element& b) const
+		{
+
+			NTL::DivRem(q,r,a,b);
+		}
+
+		/** @brief
+		 *  Test if b | a.
+		 */
+		inline bool isDivisor (const Element& a, const Element& b) const
+		{
+
+			if ( NTL::IsZero (a) ) return true;
+
+			else if (NTL::IsZero (b)) return false;
+
+			else {
+				Element r;
+
+				NTL::rem (r, a, b); //weird order changed, dpritcha 2004-07-19
+
+				return NTL::IsZero (r);
+			}
+		}
+
+		/** compare two elements, a and b
+		 * return 1, if a > b
+		 * return 0, if a = b;
+		 * return -1. if a < b
+		 */
+		inline long compare (const Element& a, const Element& b) const
+		{
+
+			return NTL::compare (a, b);
+		}
+
+		/** return the absolute value
+		 * x = abs (a);
+		 */
+		inline Element& abs (Element& x, const Element& a) const
+		{
+
+			NTL::abs (x, a);
+
+			return x;
+		}
+
+
+		static inline int maxCardinality()
+		{
+			return 0;
+		} // no modulus
+
+	};
+
+
+	template<>
+	class FieldAXPY<NTL_ZZ> {
+	public:
+		typedef NTL_ZZ Field;
+		typedef Field::Element Element;
+
+		/** Constructor.
+		 * A faxpy object if constructed from a Field and a field element.
+		 * Copies of this objects are stored in the faxpy object.
+		 * @param F field F in which arithmetic is done
+		 */
+		FieldAXPY (const Field &F) :
+			_field (F)
+		{
+			_y = 0;
+		}
+
+		/** Copy constructor.
+		 * @param faxpy
+		 */
+		FieldAXPY (const FieldAXPY<Field> &faxpy) :
+			_field (faxpy._field), _y (faxpy._y)
+		{}
+
+		/** Assignment operator
+		 * @param faxpy
+		 */
+		FieldAXPY<Field> &operator = (const FieldAXPY &faxpy)
+		{
+			_y = faxpy._y;
+			return *this;
+		}
+
+		/** Add a*x to y
+		 * y += a*x.
+		 * @param a constant reference to element a
+		 * @param x constant reference to element x
+		 * allow optimal multiplication, such as integer * int
+		 */
+		template<class Element1>
+		inline Element& mulacc  (const Element &a, const Element1 &x)
+		{
+			return _y += a * x;
+		}
+
+		inline Element& accumulate (const Element &t)
+		{
+			return _y += t;
+		}
+
+		/** Add a*x to y
+		 * y += a*x.
+		 * @param a constant reference to element a
+		 * @param x constant reference to element x
+		 * allow optimal multiplication, such as integer * int
+		 */
+		template<class Element1>
+		inline Element& mulacc (const Element1 &a, const Element &x)
+		{
+			return _y += a * x;
+		}
+
+		inline Element& mulacc (const Element& a, const Element& b)
+		{
+
+			return _y += a * b;
+		}
+
+
+		/** Retrieve y
+		 *
+		 * Performs the delayed modding out if necessary
+		 */
+		inline Element &get (Element &y) { y = _y; return y; }
+
+		/** Assign method.
+		 * Stores new field element for arithmetic.
+		 * @return reference to self
+		 * @param y constant reference to element a
+		 */
+		inline FieldAXPY &assign (const Element& y)
+		{
+			_y = y;
+			return *this;
+		}
+
+		inline void reset()
+		{
+			_y = 0;
+		}
+
+	private:
+
+		/// Field in which arithmetic is done
+		/// Not sure why it must be mutable, but the compiler complains otherwise
+		Field _field;
+
+		/// Field element for arithmetic
+		Element _y;
+
+	};
+}
+
+#endif //__LINBOX_ntl_zz_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/ntl/ntl-zz_p.h b/linbox/ring/ntl/ntl-zz_p.h
new file mode 100644
index 0000000..dda2dc6
--- /dev/null
+++ b/linbox/ring/ntl/ntl-zz_p.h
@@ -0,0 +1,525 @@
+/* linbox/field/ntl.h
+ * Copyright (C) 1999-2005 William J Turner,
+ *               2001 Bradford Hovinen
+ * Copyright (C) 2011 LinBox
+ *
+ * Written by W. J. Turner <wjturner at acm.org>,
+ *            Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file field/ntl/ntl-ZZ_p.h
+ * @ingroup field
+ * @ingroup NTL
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_field_ntl_zz_p_H
+#define __LINBOX_field_ntl_zz_p_H
+
+#ifndef __LINBOX_HAVE_NTL
+#error "you need NTL here"
+#endif
+
+#include <sys/time.h>
+#include <NTL/ZZ_p.h>
+#include <NTL/ZZ.h>
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+
+#include <givaro/zring.h>
+#include "linbox/field/field-traits.h"
+
+#include "linbox/vector/blas-vector.h"
+
+
+#include "linbox/integer.h"
+
+namespace Givaro
+{
+
+
+	/** Conversion of field element to an Integer.
+	 * This function assumes the output field element x has already been
+	 * constructed, but that it is not already initialized.
+	 * This done by converting to a std::string : inefficient but correct.
+	 * @return reference to Integer.
+	 * @param x reference to Integer to contain output (reference returned).
+	 * @param y constant reference to field element.
+	 */
+	template <>
+	Integer& Caster(Integer& x, const NTL::ZZ_p& y)
+	{
+		NTL::ZZ iy = y._ZZ_p__rep;
+
+		long nb = NTL::NumBytes(iy);
+		unsigned char *txt;
+		typedef unsigned char u_char;
+		txt = new u_char[nb + 68];
+		// 			   if (!txt) Error("out of memory");
+		BytesFromZZ(txt, iy, nb);
+
+		x = 0;
+		for (ptrdiff_t i = 0; i < nb; i++) {
+			x += Integer( txt[i] )<<(8*i) ;
+		}
+		delete [] txt;
+		return x;
+	}
+
+	//dpritcha
+	template<>
+	double& Caster(double& x, const NTL::ZZ_p& y)
+	{
+		x = NTL::to_double(NTL::rep(y));
+		return x;
+	}
+
+	/**\brief Initialization of field element from an Integer.
+	 * Behaves like C++ allocator construct.
+	 * This function assumes the output field element x has already been
+	 * constructed, but that it is not already initialized.
+	 * This done by converting to a std::string : inefficient but correct.
+	 * @return reference to field element.
+	 * @param x field element to contain output (reference returned).
+	 * @param y Integer.
+	 \ingroup field
+	 */
+	template <>
+	NTL::ZZ_p& Caster(NTL::ZZ_p& x, const Integer& y)
+	{
+		return x = NTL::to_ZZ_p( NTL::to_ZZ( (static_cast<const std::string>(y)).c_str() ) );
+	}
+	template <>
+	NTL::ZZ_p& Caster(NTL::ZZ_p& x, const double& y)
+	{
+		return x = NTL::to_ZZ_p( NTL::to_ZZ((long)(y) ) );
+	}
+	template <>
+	NTL::ZZ_p& Caster(NTL::ZZ_p& x, const int& y)
+	{
+		return x = NTL::to_ZZ_p( NTL::to_ZZ((long)(y) ) );
+	}
+	template <>
+	NTL::ZZ_p& Caster(NTL::ZZ_p& x, const unsigned long& y)
+	{
+		return x = NTL::to_ZZ_p( NTL::to_ZZ((long)(y) ) );
+	}
+	template <>
+	NTL::ZZ_p& Caster(NTL::ZZ_p& x, const unsigned int& y)
+	{
+		return x = NTL::to_ZZ_p( NTL::to_ZZ((long)(y) ) );
+	}
+} // namespace Givaro
+
+
+// Namespace in which all LinBox library code resides
+namespace LinBox
+{
+
+
+	class NTL_ZZ_p_Initialiser {
+	public :
+		NTL_ZZ_p_Initialiser( const Integer & q, size_t e = 1) {
+			linbox_check(e == 1);
+			if ( q > 0 )
+				NTL::ZZ_p::init(NTL::to_ZZ((std::string(q)).data())); // it's an error if q not prime, e not 1
+		}
+
+		template <class ElementInt>
+		NTL_ZZ_p_Initialiser(const ElementInt& d) {
+			NTL::ZZ_p::init (NTL::to_ZZ(d));
+		}
+
+		NTL_ZZ_p_Initialiser (const NTL::ZZ& d) {
+			NTL::ZZ_p::init(d);
+		}
+
+		NTL_ZZ_p_Initialiser () { }
+
+	};
+	
+            // CP: to be changed in to a Givaro::GeneralRingRandIter ?
+        template <class Element>
+	class UnparametricRandIter;
+        /**
+	 *
+	 * @brief Wrapper of zz_p from NTL.
+	 * Uses nice mod p via floating pt trick.
+	 *
+	 */
+	struct NTL_ZZ_p: public NTL_ZZ_p_Initialiser, public Givaro::UnparametricOperations<NTL::ZZ_p> {
+		typedef NTL::ZZ_p Element ;
+		typedef Givaro::UnparametricOperations<Element> Father_t ;
+
+		typedef UnparametricRandIter<Element> RandIter;
+
+		const Element zero,one,mOne ;
+
+		/** @name NTL_ZZ_p
+		 * @brief Arbitrary precision integers modulus a positive integer.
+
+		 * While NTL allows any integer to serve as the modulus, only prime
+		 * moduli yield fields.  Therefore, while arthmetic operations may be
+		 * valid for any modulus, only prime moduli are supported in this
+		 * implementation.  The primality of the modulus will not be checked, so
+		 * it is the programmer's responsibility to supply a prime modulus.
+		 * These specializations allow the \ref Givaro::ZRing template class to be
+		 * used to wrap NTL's <code>ZZ_p</code> class as a LinBox field.
+		 */
+		//@{
+		//! @param q,e
+		NTL_ZZ_p(integer q, size_t e = 1) :
+			NTL_ZZ_p_Initialiser(q,e),Father_t ()
+			,zero( NTL::to_ZZ_p(0)),one( NTL::to_ZZ_p(1)),mOne(-one)
+		{
+			// no default - allow initialization of ZZ_p directly by user.
+		}
+
+		//! @param d,e
+		NTL_ZZ_p( NTL::ZZ d, size_t e = 1) :
+			NTL_ZZ_p_Initialiser(d),Father_t()
+			,zero( NTL::to_ZZ_p(0)),one( NTL::to_ZZ_p(1)),mOne(-one)
+		{
+			linbox_check(e == 1);
+		}
+
+		//! NULL constructor
+		NTL_ZZ_p() :
+			NTL_ZZ_p_Initialiser(), Father_t()
+			,zero( NTL::to_ZZ_p(0)),one( NTL::to_ZZ_p(1)),mOne(-one)
+		{}
+		//@}
+
+		Element& init(Element& x, const integer& y) const
+		{
+			return Caster(x,y);
+		}
+
+		Element& init(Element& x, const double& y) const
+		{
+			double z = fmod(y,NTL::to_double(Element::modulus()));
+			if (z > 0) z += 0.5;
+			else z -= 0.5;
+			return x = NTL::to_ZZ_p(static_cast<long>(z)); //rounds towards 0
+		}
+
+		/** Specialization for NTL::ZZ
+		 *
+		 * @return reference to field element.
+		 * @param x field element to contain output (reference returned)
+		 * @param y NTL::ZZ.
+		 */
+		Element& init(Element& x, const NTL::ZZ& y) const
+		{
+			return x = NTL::to_ZZ_p( y );
+		}
+
+		Element& init(Element& x) const
+		{
+			return x = NTL::to_ZZ_p( 0L );
+		}
+
+		Element& init(Element& x, const Element& y) const
+		{
+			return x = y ;
+		}
+
+		template <class ANY> //dpritcha--FIX
+		Element& init(Element& x, const ANY& y) const
+		{
+			return x = NTL::to_ZZ_p((long)(y));
+		}
+
+		/** Specialization for NTL::ZZ.
+		 *
+		 * @return reference to  NTL::ZZ
+		 * @param x  NTL::ZZ to contain output (reference returned).
+		 * @param y constant reference to field element.
+		 */
+		NTL::ZZ& convert(NTL::ZZ& x, const Element& y) const
+		{
+			return x = y._ZZ_p__rep;
+		}
+
+		/** Conversion of field element to an integer.
+		 * This function assumes the output field element x has already been
+		 * constructed, but that it is not already initialized.
+		 * This done by converting to a std::string : inefficient but correct.
+		 * @return reference to integer.
+		 * @param x reference to integer to contain output (reference returned).
+		 * @param y constant reference to field element.
+		 */
+		integer& convert(integer& x, const Element& y) const
+		{
+			NTL::ZZ iy = y._ZZ_p__rep;
+
+			long nb = NTL::NumBytes(iy);
+			unsigned char *txt;
+			typedef unsigned char u_char;
+			txt = new u_char[nb + 68];
+			// 			   if (!txt) Error("out of memory");
+			BytesFromZZ(txt, iy, nb);
+
+			x = 0;
+			for (ptrdiff_t i = 0; i < nb; i++) {
+				x += LinBox::integer( txt[i] )<<(8*i) ;
+			}
+			delete [] txt;
+			return x;
+		};
+
+		double& convert(double& x, const Element& y) const
+		{
+			x = NTL::to_double(NTL::rep(y));
+			return x;
+		}
+
+		template <class ANY>
+		ANY& convert(ANY& x, const Element& y) const
+		{
+			return x = (ANY)(rep(y));
+		}
+
+		static inline integer maxCardinality()
+		{
+			return integer( -1 );
+		}
+
+		Element& pow( Element& res, const Element& x, long exp ) const
+		{
+			NTL::power( res, x, exp );
+			return res;
+		}
+
+		Element& powin( Element& x, long exp ) const
+		{
+			return x = NTL::power(x,exp);
+		}
+
+		/** Cardinality.
+		 * Return integer representing cardinality of the field.
+		 * Returns the modulus of the field, which should be prime.
+		 * @return integer representing cardinality of the field
+		 */
+		integer& cardinality(integer& c) const
+		{
+			return characteristic(c);
+		}
+
+		integer cardinality() const
+		{
+			return characteristic();
+		}
+
+		/** Characteristic.
+		 * Return integer representing characteristic of the field.
+		 * Returns the modulus of the field, which should be prime.
+		 * @return integer representing characteristic of the field.
+		 */
+		integer& characteristic(integer& c) const
+		//FIXME we shouldn't go thru long here as p may be larger than that.
+		// check if NTL has cast ZZp to gmp integers.
+		{
+			std::stringstream s;
+			s << Element::modulus();
+			s >> c;
+			return c; 
+			//return c = static_cast<integer>(to_long(Element::modulus()));
+		}
+
+		size_t& characteristic(size_t & c) const
+		{
+			return c = (int64_t)to_long(Element::modulus());
+		}
+
+		integer characteristic() const
+		{
+			integer c;
+			return characteristic(c); 
+		}
+
+		/** Multiplicative Inverse.
+		 * x = 1 / y
+		 * This function assumes both field elements have already been
+		 * constructed and initialized.
+		 * @return reference to x.
+		 * @param  x field element (reference returned).
+		 * @param  y field element.
+		 */
+		Element&
+		inv(Element& x, const Element& y) const
+		{
+			return x = NTL::inv(y);
+		}
+
+		/** Zero equality.
+		 * Test if field element is equal to zero.
+		 * This function assumes the field element has already been
+		 * constructed and initialized.
+		 * In this specialization, NTL's IsZero function is called.
+		 * @return boolean true if equals zero, false if not.
+		 * @param  x field element.
+		 */
+		bool isZero(const Element& x) const
+		{
+			return static_cast<bool>(IsZero(x));
+		}
+
+		/** One equality.
+		 * Test if field element is equal to one.
+		 * This function assumes the field element has already been
+		 * constructed and initialized.
+		 * In this specialization, NTL's IsOne function is called.
+		 * @return boolean true if equals one, false if not.
+		 * @param  x field element.
+		 */
+		bool isOne(const Element& x) const
+		{
+			return static_cast<bool>(IsOne(x));
+		}
+
+		/** MOne equality.
+		 * Test if field element is equal to one.
+		 * This function assumes the field element has already been
+		 * constructed and initialized.
+		 * In this specialization, NTL's IsMOne function is called.
+		 * @return boolean true if equals one, false if not.
+		 * @param  x field element.
+		 */
+		bool isMOne(const Element& x) const
+		{
+		Element y ; neg(y,x);
+			return isOne(y);
+		}
+
+		/** Inplace Multiplicative Inverse.
+		 * x = 1 / x
+		 * This function assumes both field elements have already been
+		 * constructed and initialized.
+		 * @return reference to x.
+		 * @param  x field element (reference returned).
+		 */
+		Element& invin(Element& x) const
+		{
+			return x = NTL::inv(x);
+		}
+
+		/** Print field.
+		 * @return output stream to which field is written.
+		 * @param  os  output stream to which field is written.
+		 */
+		std::ostream& write(std::ostream& os) const
+		{
+			return os << "unparameterized field Element with p = "
+			<< Element::modulus();
+		}
+
+		/** Print field.
+		 * @return output stream to which field is written.
+		 * @param os  output stream to which field is written.
+		 * @param x
+		 */
+		std::ostream &write (std::ostream &os, const Element &x) const
+		{
+		   	return Givaro::UnparametricOperations<Element>::write(os,x);
+		}
+	};
+
+	template <class Ring>
+	struct ClassifyRing;
+
+	template <>
+	struct ClassifyRing<NTL_ZZ_p > {
+		typedef RingCategories::ModularTag categoryTag;
+	};
+
+	/// Constructor for random field element generator
+	template <>
+	class UnparametricRandIter<NTL::ZZ_p> {
+	protected:
+		integer _size,_seed;
+        const NTL_ZZ_p & _ring;
+	public:
+
+		UnparametricRandIter<NTL::ZZ_p> (const NTL_ZZ_p & F,
+						 const integer& size = 0,
+						 const integer& seed = 0) :
+                _size(size), _seed(seed), _ring(F)
+		{
+			if (_seed == integer(0)) _seed = int64_t(time(NULL));
+
+			integer cardinality;
+			F.cardinality(cardinality);
+			if (_size > cardinality)
+				_size = 0;
+
+#ifdef TRACE
+			std::cout << "created random generator with size " << _size
+			<< " and seed " << _seed << std::endl;
+#endif // TRACE
+
+			// Seed random number generator
+			NTL::SetSeed(NTL::to_ZZ(static_cast<int32_t>(_seed)));
+		}
+
+        const NTL_ZZ_p& ring() const { return _ring; }
+                
+
+		// UnparametricRandIter<NTL::ZZ_p>(const NTL_ZZ_p& R) :
+			// _size(R._size), _seed(R._seed)
+		// {
+			// if(_seed == 0)
+				// NTL::SetSeed(NTL::to_ZZ(time(0)));
+			// else
+				// NTL::SetSeed(NTL::to_ZZ( static_cast<long>(_seed)) );
+		// }
+
+
+		/// Random field element creator.
+		NTL::ZZ_p& random(NTL::ZZ_p& x) const
+		{
+			if (_size == 0) {
+				return x = NTL::random_ZZ_p();
+			}
+			else {
+				return x = NTL::to_ZZ_p(NTL::RandomBnd(static_cast<int32_t>(_size)));
+			}
+		}
+
+
+	};
+
+
+} // namespace LinBox
+
+#endif // __LINBOX_field_ntl_zz_p_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/ring/ntl/ntl-zz_pe.h b/linbox/ring/ntl/ntl-zz_pe.h
new file mode 100644
index 0000000..f61d9a7
--- /dev/null
+++ b/linbox/ring/ntl/ntl-zz_pe.h
@@ -0,0 +1,434 @@
+/* Copyright (C) LinBox
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file field/ntl/ntl-ZZ_pE.h
+ * @ingroup field
+ * @ingroup NTL
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_field_ntl_zz_pe_H
+#define __LINBOX_field_ntl_zz_pe_H
+
+#ifndef __LINBOX_HAVE_NTL
+#error "you need NTL here"
+#endif
+
+#include <time.h>
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include <NTL/ZZ_pXFactoring.h>
+#include <NTL/ZZ_pE.h>
+#include <NTL/ZZ.h>
+
+#include <givaro/zring.h>
+#include "linbox/field/field-traits.h"
+
+
+#include "linbox/integer.h"
+
+namespace Givaro
+{
+
+	template<>
+	NTL::ZZ_pE& Caster(NTL::ZZ_pE &x, const Integer &y)
+	{
+		std::stringstream s;
+		s << y;
+		s >> x;
+		//x=NTL::to_ZZ_pE(static_cast<long>(y));
+		return x;
+	}
+	template<>
+	NTL::ZZ_pE& Caster(NTL::ZZ_pE &x, const double &y)
+	{
+		std::stringstream s;
+		s << y;
+		s >> x;
+		//x=NTL::to_ZZ_pE(static_cast<long>(y));
+		return x;
+	}
+
+	// Rich Seagraves, 7-15-03
+	// On the orders of Dr Saunders, I'm re-writing init & convert so that
+	// they convert a ZZpE into a padic number, ie a0 + a1x + a2x^2 +... ->
+	// a0 + a1*p + a2*p^2 + ...
+	//
+
+	Integer& Caster(Integer& c, const NTL::ZZ_pE& e)
+	{
+		NTL::ZZ_pX poly = rep(e);
+		Integer base, coef;
+		std::stringstream s;
+		s << NTL::ZZ_p::modulus();
+		s >> base;
+		//Integer base = static_cast<Integer>(to_long(NTL::ZZ_p::modulus()));
+		long i;
+
+		c = 0;
+		for(i = deg(poly); i >= 0; --i) {
+			c *= base;
+			s.clear();
+			s << rep(coeff(poly, i));
+			s >> coef;
+			c +=  coef; //NTL::to_long(rep(coeff(poly, i)));
+		}
+
+		return c;
+	}
+} // namespace Givaro
+
+// Namespace in which all LinBox library code resides
+namespace LinBox
+{
+
+	class NTL_ZZ_pE_Initialiser {
+	public :
+		NTL_ZZ_pE_Initialiser( const Integer & p, size_t k ) {
+			// linbox_check(e == 1);
+			// if ( q > 0 )
+			// NTL::ZZ_p::init(NTL::to_ZZ((std::string(q)).data())); // it's an error if q not prime, e not 1
+			NTL::ZZ_p::init(NTL::to_ZZ(std::string(p).data()));
+			NTL::ZZ_pX irredPoly = NTL::BuildIrred_ZZ_pX ((long) k);
+			NTL::ZZ_pE::init(irredPoly);
+
+		}
+
+		// template <class ElementInt>
+		// NTL_ZZ_pE_Initialiser(const ElementInt& d) {
+			// NTL::ZZ_p::init (NTL::to_ZZ(d));
+		// }
+
+		// NTL_ZZ_pE_Initialiser (const NTL::ZZ& d) {
+			// NTL::ZZ_p::init(d);
+		// }
+
+	};
+
+
+
+	/**
+	 * @brief Wrapper of ZZ_pE from NTL
+	 * Define a parameterized class to handle easily Givaro::ZRing<NTL::ZZ_pE> field
+	 */
+	class NTL_ZZ_pE : public NTL_ZZ_pE_Initialiser, public Givaro::UnparametricOperations<NTL::ZZ_pE> {
+	public:
+		typedef NTL::ZZ_pE Element ;
+		typedef Givaro::UnparametricOperations<Element> Father_t ;
+
+		const Element zero,one,mOne ;
+
+
+		NTL_ZZ_pE (const integer &p, const integer &k) :
+			NTL_ZZ_pE_Initialiser(p,k),Father_t ()
+			,zero( NTL::to_ZZ_pE(0)),one( NTL::to_ZZ_pE(1)),mOne(-one)
+
+
+		{
+
+				}
+
+
+	bool isZero (const Element& a) const
+	{
+		return NTL::IsZero(a);
+	}
+
+
+	bool isOne (const Element& a) const
+	{
+		return NTL::IsOne(a);
+	}
+
+	bool isMOne (const Element& x) const
+		{
+			Element y ; neg(y,x);
+			return isOne(y);
+		}
+
+
+	integer& characteristic (integer &c) const
+	{
+		std::stringstream s;
+		s << NTL::ZZ_p::modulus();
+		s >> c;
+		return c;
+		//return c=static_cast<integer>(to_long(NTL::ZZ_p::modulus()));
+	}
+
+
+	integer& cardinality(integer& c) const
+	{
+		std::stringstream s;
+		s << NTL::ZZ_p::modulus();
+		s >> c;
+		c=pow(c,int64_t(Element::degree()));
+		return c;
+	}
+
+	Element& inv(Element& x, const Element& y) const
+	{
+		x=NTL::to_ZZ_pE(1)/y;
+		return x;
+	}
+
+	Element& invin(Element& x) const
+	{
+		x=NTL::to_ZZ_pE(1)/x;
+		return x;
+	}
+
+
+	std::istream& read(std::istream& is, Element& x) const
+	{
+		long tmp = 0;
+		is>>tmp;
+		x=NTL::to_ZZ_pE(tmp);
+		return is;
+	}
+
+
+
+#ifdef __LINBOX_XMLENABLED
+
+
+	bool toTag(LinBox::Writer &W) const
+	{
+		std::string s;
+		NTL::ZZ_pX poly = Element::modulus();
+		long i;
+
+		W.setTagName("field");
+		W.setAttribute("implDetail", "ntl-ZZpE");
+		W.setAttribute("cardinality", LinBox::Writer::numToString(s, _card));
+
+		W.addTagChild();
+		W.setTagName("finite");
+
+		W.addTagChild();
+		W.setTagName("characteristic");
+		W.addNum(_p);
+		W.upToParent();
+
+		W.addTagChild();
+		W.setTagName("extension");
+		W.addNum(deg(poly) + 1);
+		W.upToParent();
+
+		W.addTagChild();
+		W.setTagName("polynomial");
+
+		for(i = 0; i <= deg(poly); ++i) {
+			W.addNum(coeff(poly, i));
+		}
+		W.upToParent();
+		W.upToParent();
+		W.upToParent();
+
+		return true;
+	}
+
+
+	std::ostream &write(std::ostream &os) const
+	{
+		LinBox::Writer W;
+		if( toTag(W) )
+			W.write(os);
+
+		return os;
+	}
+
+
+	// Elemnt Reading & writing functions
+	// BIG NOTE:  It was decided that for extension fields, the elements
+	// would be represented using a single number that has the following
+	// property:  for an element e in ZZp[x], with e = a0 + a1x + a2x^2 + ...,
+	// represent e as "<cn>n</cn>" where n = a0 + a1 * p + a2 * p^2 + ...
+	//
+
+
+	bool toTag(LinBox::Writer &W, const Element &e) const
+	{
+		NTL::ZZ_pX poly = rep(e);
+		NTL::ZZ accum, base = NTL::ZZ_p::modulus();
+		long i;
+		std::string s;
+
+		accum = 0;
+		for(i = deg(poly); i >= 0; --i) {
+			accum *= base;
+			accum += rep(coeff(poly, i));
+		}
+
+
+		W.setTagName("cn");
+		W.addDataChild(LinBox::Writer::numToString(s, accum));
+
+		return true;
+	}
+
+
+	std::ostream &write(std::ostream &os, const Element &e) const
+	{
+
+		LinBox::Writer W;
+		if( toTag(W, e))
+			W.write(os);
+
+		return os;
+	}
+
+
+
+
+	bool fromTag(LinBox::Reader &R, Element &e) const
+	{
+		NTL::ZZ total, base = NTL::ZZ_p::modulus(), rem;
+		std::stringstream ss;
+
+		if(!R.expectTagName("cn") || !R.expectChildTextNum(total))
+			return false;
+
+		ss << "[";
+		while(total > 0) {
+			rem = total % base;
+			total /= base;
+			ss << rem;
+			if(total > 0) ss << " ";
+		}
+
+		ss << "]";
+
+		ss >> e; // use the extraction stream operator
+
+		return true;
+	}
+
+
+	std::istream &read(std::istream &is, Element &e) const
+	{
+		LinBox::Reader R(is);
+		if( !fromTag(R, e)) {
+			is.setstate(std::istream::failbit);
+			if(!R.initalized()) {
+				is.setstate(std::istream::badbit);
+			}
+		}
+
+		return is;
+	}
+
+
+#endif
+
+
+	}; // end of class NTL_ZZ_pE
+
+
+
+
+
+
+	template <class Ring>
+	struct ClassifyRing;
+
+	template<>
+	struct ClassifyRing<UnparametricRandIter<NTL::ZZ_pE> > {
+		typedef RingCategories::ModularTag categoryTag;
+	};
+
+
+
+}
+
+namespace LinBox
+{
+
+
+	template<>
+	class UnparametricRandIter<NTL::ZZ_pE> {
+	public:
+		typedef NTL::ZZ_pE Element;
+		UnparametricRandIter<NTL::ZZ_pE>(const NTL_ZZ_pE & F ,
+						 const integer& size =0,
+						 const integer& seed =0
+						) :
+                _size(size), _seed(seed), _ring(F)
+		{
+			if(_seed == 0)
+				NTL::SetSeed(NTL::to_ZZ(time(0)));
+			else {
+				NTL::ZZ x;
+				std::stringstream s;
+				s << seed;
+				s >> x;
+				NTL::SetSeed( x ); //NTL::to_ZZ(static_cast<long>(seed)) );
+			}
+		}
+
+        const NTL_ZZ_pE& ring() const { return _ring; }
+#ifdef __LINBOX_XMLENABLED
+		UnparametricRandIter<NTL::ZZ_pE>(LinBox::Reader &R)
+		{
+			if(!R.expectTagName("randiter")) return;
+			if(!R.expectAttributeNum("seed", _seed) || !R.expectAttributeNum("size", _size)) return;
+
+			if(_seed == 0) _seed = time(NULL);
+
+			NTL::SetSeed(NTL::to_ZZ(_seed));
+		}
+#endif
+
+
+		UnparametricRandIter<NTL::ZZ_pE>(const UnparametricRandIter<NTL::ZZ_pE>& R) :
+                _size(R._size), _seed(R._seed), _ring(R._ring)
+
+		{
+			if(_seed == 0)
+				NTL::SetSeed(NTL::to_ZZ(time(0)));
+			else
+				NTL::SetSeed(NTL::to_ZZ( static_cast<long>(_seed)) );
+		}
+
+		NTL::ZZ_pE& random (NTL::ZZ_pE& x) const
+		{
+			NTL::random(x);
+			return x;
+		}
+
+	protected:
+		size_t _size;
+		size_t _seed;
+        const NTL_ZZ_pE& _ring; 
+	};
+}
+#endif //__LINBOX_field_ntl_zz_pe_H
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/ntl/ntl-zz_px.h b/linbox/ring/ntl/ntl-zz_px.h
new file mode 100644
index 0000000..58c7320
--- /dev/null
+++ b/linbox/ring/ntl/ntl-zz_px.h
@@ -0,0 +1,354 @@
+/* Copyright (C) 2005 LinBox
+ * written by Daniel Roche, August 2005
+ * Copyright (C) 2011 LinBox
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file ring/ntl/ntl-ZZ_p.h
+ * @ingroup ring
+ * @ingroup NTL
+ * @brief NO DOC
+ */
+
+#ifndef __LINBOX_field_ntl_zz_px_H
+#define __LINBOX_field_ntl_zz_px_H
+
+#ifndef __LINBOX_HAVE_NTL
+#error "you need NTL here"
+#endif
+
+#include <vector>
+#include <NTL/ZZ_pX.h>
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+
+#include <givaro/zring.h>
+#include "linbox/ring/ntl/ntl-zz_p.h"
+#include "linbox/integer.h"
+
+
+// namespace in which all LinBox code resides
+namespace LinBox
+{
+	class NTL_ZZ_pX_Initialiser {
+	public :
+		NTL_ZZ_pX_Initialiser( const Integer & q, size_t e = 1) {
+			// linbox_check(e == 1);
+			if ( q > 0 )
+				NTL::ZZ_p::init(NTL::to_ZZ((std::string(q)).data())); // it's an error if q not prime, e not 1
+		}
+
+		// template <class ElementInt>
+		// NTL_ZZ_p_Initialiser(const ElementInt& d) {
+		// NTL::ZZ_p::init (NTL::to_ZZ(d));
+		// }
+
+		// NTL_ZZ_p_Initialiser (const NTL::ZZ& d) {
+		// NTL::ZZ_p::init(d);
+		// }
+
+	};
+
+	/** Ring (in fact, a unique factorization domain) of polynomial with
+	 * coefficients in class NTL_ZZ_p (integers mod a wordsize prime).
+	 * All the same functions as any other ring, with the addition of:
+	 * Coeff (type), CoeffField (type), getCoeffField, setCoeff, getCoeff,
+	 * leadCoeff, deg
+	 */
+	class NTL_ZZ_pX : public NTL_ZZ_pX_Initialiser, public Givaro::UnparametricOperations<NTL::ZZ_pX> {
+	public:
+		typedef NTL::ZZ_pX Element ;
+		typedef Givaro::UnparametricOperations<Element> Father_t ;
+		typedef UnparametricRandIter<Element> RandIter;
+
+		const Element zero,one,mOne ;
+
+
+		typedef NTL_ZZ_p CoeffField;
+		typedef NTL::ZZ_p Coeff;
+		// typedef NTL::ZZ_pX Element;
+
+		/** Standard LinBox field constructor.  The paramters here
+		 * (prime, exponent) are only used to initialize the coefficient field.
+		 */
+		NTL_ZZ_pX( const integer& p, size_t e = 1 ) :
+			NTL_ZZ_pX_Initialiser(p,e),Father_t ()
+			, zero( NTL::to_ZZ_pX(0)),one( NTL::to_ZZ_pX(1)),mOne(-one)
+			, _CField(p,e)
+		{}
+
+		/** Constructor from a coefficient field */
+		NTL_ZZ_pX( CoeffField cf ) :
+			NTL_ZZ_pX_Initialiser(cf.cardinality()),Father_t ()
+			,zero( NTL::to_ZZ_pX(0)),one( NTL::to_ZZ_pX(1)),mOne(-one)
+			,_CField(cf)
+		{}
+
+		/** Initialize p to the constant y (p = y*x^0) */
+		template <class ANY>
+		Element& init( Element& p, const ANY& y ) const
+		{
+			Coeff temp;
+			_CField.init( temp, y );
+			return p = temp;
+		}
+
+		/** Initialize p to the constant y (p = y*x^0) */
+		Element& init( Element& p, const Coeff& y ) const
+		{
+			return p = y;
+		}
+
+		/** Initialize p from a vector of coefficients.
+		 * The vector should be ordered the same way NTL does it: the front
+		 * of the vector corresponds to the trailing coefficients, and the back
+		 * of the vector corresponds to the leading coefficients.  That is,
+		 * v[i] = coefficient of x^i.
+		 */
+		template <class ANY>
+		Element& init( Element& p, const std::vector<ANY>& v ) const
+		{
+			p = 0;
+			Coeff temp;
+			for( long i = 0; i < (long)v.size(); ++i ) {
+				_CField.init( temp, v[ (size_t) i ] );
+				if( !_CField.isZero(temp) )
+					NTL::SetCoeff( p, i, temp );
+			}
+			return p;
+		}
+
+		/** Initialize p from a vector of coefficients.
+		 * The vector should be ordered the same way NTL does it: the front
+		 * of the vector corresponds to the trailing coefficients, and the back
+		 * of the vector corresponds to the leading coefficients.  That is,
+		 * v[i] = coefficient of x^i.
+		 */
+		Element& init( Element& p, const std::vector<Coeff>& v ) const
+		{
+			p = 0;
+			for( long i = 0; i < (long)v.size(); ++i )
+				NTL::SetCoeff( p, i, v[ (size_t) i ] );
+			return p;
+		}
+
+		template<class T>
+		Element& init(Element& x, const BlasVector<T>& y) const
+		{
+			return init(x,y.getRep()) ;
+		}
+
+
+		/** Convert p to a vector of coefficients.
+		 * The vector will be ordered the same way NTL does it: the front
+		 * of the vector corresponds to the trailing coefficients, and the back
+		 * of the vector corresponds to the leading coefficients.  That is,
+		 * v[i] = coefficient of x^i.
+		 */
+		template< class ANY >
+		std::vector<ANY>& convert( std::vector<ANY>& v, const Element& p ) const
+		{
+			v.clear();
+			ANY temp;
+			for( long i = 0; i <= (long)this->deg(p); ++i ) {
+				_CField.convert( temp, NTL::coeff( p, i ) );
+				v.push_back( temp );
+			}
+			return v;
+		}
+
+		/** Convert p to a vector of coefficients.
+		 * The vector will be ordered the same way NTL does it: the front
+		 * of the vector corresponds to the trailing coefficients, and the back
+		 * of the vector corresponds to the leading coefficients.  That is,
+		 * v[i] = coefficient of x^i.
+		 */
+		std::vector<Coeff>& convert( std::vector<Coeff>& v, const Element& p ) const
+		{
+			v.clear();
+			for( long i = 0; i <= (long)this->deg(p); ++i )
+				v.push_back( NTL::coeff(p,i) );
+			return v;
+		}
+
+		/** Test if an element equals zero */
+		bool isZero( const Element& x ) const
+		{
+			return ( (this->deg(x) == 0) &&
+				 ( _CField.isZero( NTL::ConstTerm(x) ) ) );
+		}
+
+		/** Test if an element equals one */
+		bool isOne( const Element& x ) const
+		{
+			return ( (this->deg(x) == 0) &&
+				 ( _CField.isOne( NTL::ConstTerm(x) ) ) );
+		}
+
+		bool isMOne (const Element& x) const
+		{
+			return ( (this->deg(x) == 0) &&
+				 ( _CField.isMOne( NTL::ConstTerm(x) ) ) );
+		}
+
+		/** The LinBox field for coefficients */
+		const CoeffField& getCoeffField() const
+		{
+			return _CField;
+		}
+
+		/** Get the degree of a polynomial
+		 * Unlike NTL, deg(0)=0.
+		 */
+		size_t deg( const Element& p ) const
+		{
+			long temp = NTL::deg(p);
+			if( temp == -1 ) return 0;
+			else return static_cast<size_t>(temp);
+		}
+
+		/** r will be set to the reverse of p. */
+		Element& rev( Element& r, const Element& p ) {
+			NTL::reverse(r,p);
+			return r;
+		}
+
+		/** r is itself reversed. */
+		Element& revin( Element& r ) {
+			return r = NTL::reverse(r);
+		}
+
+		/** Get the leading coefficient of this polynomial. */
+		Coeff& leadCoeff( Coeff& c, const Element& p ) const
+		{
+			c = NTL::LeadCoeff(p);
+			return c;
+		}
+
+		/** Get the coefficient of x^i in a given polynomial */
+		Coeff& getCoeff( Coeff& c, const Element& p, size_t i ) const
+		{
+			c = NTL::coeff( p, (long)i );
+			return c;
+		}
+
+		/** Set the coefficient of x^i in a given polynomial */
+		Element& setCoeff( Element& p, size_t i, const Coeff& c ) const
+		{
+			NTL::SetCoeff(p,(long)i,c);
+			return p;
+		}
+
+		/** Get the quotient of two polynomials */
+		Element& quo( Element& res, const Element& a, const Element& b ) const
+		{
+			NTL::div(res,a,b);
+			return res;
+		}
+
+		/** a = quotient of a, b */
+		Element& quoin( Element& a, const Element& b ) const
+		{
+			return a /= b;
+		}
+
+		/** Get the remainder under polynomial division */
+		Element& rem( Element& res, const Element& a, const Element& b ) const
+		{
+			NTL::rem(res,a,b);
+			return res;
+		}
+
+		/** a = remainder of a,b */
+		Element& remin( Element& a, const Element& b ) const
+		{
+			return a %= b;
+		}
+
+		/** Get the quotient and remainder under polynomial division */
+		void quorem( Element& q, Element& r,
+			     const Element& a, const Element& b ) const
+		{
+			NTL::DivRem(q,r,a,b);
+		}
+
+		/** Get characteristic of the field - same as characteristic of
+		 * coefficient field. */
+		integer& characteristic( integer& c ) const
+		{
+			return _CField.characteristic(c);
+		}
+
+		/** Get the cardinality of the field.  Since the cardinality is
+		 * infinite, by convention we return -1.
+		 */
+		integer& cardinality( integer& c ) const
+		{
+			return c = static_cast<integer>(-1);
+		}
+
+		static inline integer maxCardinality()
+		{
+			return CoeffField::maxCardinality();
+		}
+
+		/** Write a description of the field */
+		// Oustide of class definition so write(ostream&,const Element&) from
+		// Givaro::ZRing still works.
+		std::ostream& write( std::ostream& os ) const
+		{
+			return os << "Polynomial ring using NTL::ZZ_pX";
+		}
+
+		std::ostream &write (std::ostream &os, const Element &x) const { return Givaro::UnparametricOperations<Element>::write(os,x); }
+
+
+	private:
+		/** Conversion to scalar types doesn't make sense and should not be
+		 * used.  Use getCoeff or leadCoeff to get the scalar values of
+		 * specific coefficients, and then convert them using coeffField()
+		 * if needed.
+		 */
+		template< class ANY >
+		ANY& convert( ANY& x, const Element& y ) const
+		{
+			return x;
+		}
+
+		CoeffField _CField;
+	}; // end of class NTL_ZZ_pX
+
+
+} // end of namespace LinBox
+
+#endif // __LINBOX_field_ntl_zz_px_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/pid-ntl-zz_p.h b/linbox/ring/pid-ntl-zz_p.h
new file mode 100644
index 0000000..d6d571d
--- /dev/null
+++ b/linbox/ring/pid-ntl-zz_p.h
@@ -0,0 +1,92 @@
+/* Copyright (C) 2010 LinBox
+ * written by bds
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+#ifndef __LINBOX_ntl_pid_zz_p_H
+#define __LINBOX_ntl_pid_zz_p_H
+
+#include "linbox/ring/ntl/ntl-lzz_p.h"
+#include "linbox/util/debug.h"
+#include "linbox/linbox-config.h"
+#include "linbox/field/field-traits.h"
+
+// Namespace in which all LinBox library code resides
+namespace LinBox
+{
+	template <class Ring>
+	struct ClassifyRing;
+
+	class NTL_PID_zz_p;
+
+	template<>
+	struct ClassifyRing<NTL_PID_zz_p> {
+		typedef RingCategories::ModularTag categoryTag;
+	};
+
+	/** \brief extend Wrapper of zz_p from NTL.  Add PID functions
+	  \ingroup ring
+	  */
+	struct NTL_PID_zz_p: public NTL_zz_p
+	{
+	protected: long _modulus;
+	public:
+		   NTL_PID_zz_p(long pp, int exp = 1) :
+			   NTL_zz_p(pp), _modulus(pp)
+		{
+			if( exp != 1 ) throw PreconditionFailed(LB_FILE_LOC,"exponent must be 1");
+		}
+
+		   Element& gcd(Element& g, const Element& a, const Element& b) const
+		   {   g = NTL::GCD(NTL::rep(a), NTL::rep(b));
+			   g = NTL::GCD(NTL::rep(g), _modulus);
+			   return g;
+		   }
+
+		   Element& gcdin(Element& a, const Element& b) const
+		   {   return gcd(a,a, b);  }
+
+		   bool isUnit(const Element& a) const
+		   {   return 1 == NTL::GCD(NTL::rep(a), _modulus);  }
+
+		   Element& div(Element& c, const Element& a, const Element& b) const
+		   {   return c = NTL::rep(a)/NTL::GCD(NTL::rep(a),NTL::rep(b));   }
+		   Element& divin(Element& a, const Element& b) const
+		   {   return div(a, a, b);   }
+
+		   static inline double maxCardinality() { return (double)NTL_SP_BOUND; }
+	};
+
+} // namespace LinBox
+
+#endif // __LINBOX_ntl_pid_zz_p_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/ring/pir-modular-int32.h b/linbox/ring/pir-modular-int32.h
new file mode 100644
index 0000000..4b7d4d3
--- /dev/null
+++ b/linbox/ring/pir-modular-int32.h
@@ -0,0 +1,713 @@
+/* Copyright (C) 2010 LinBox
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+#ifndef __LINBOX_pir_modular_int32_H
+#define __LINBOX_pir_modular_int32_H
+
+#include <givaro/modular-int32.h>
+
+//#include "linbox/ring/modular.h"
+#ifndef LINBOX_MAX_INT
+#define LINBOX_MAX_INT 2147483647
+#endif
+
+#ifndef LINBOX_MAX_MODULUS
+#define LINBOX_MAX_MODULUS 1073741824
+#endif
+#include "linbox/field/field-traits.h"
+
+// Namespace in which all LinBox code resides
+namespace LinBox
+{
+
+	template< class PIR>
+	class PIRModular;
+
+	template< class Element >
+	class ModularRandIter;
+
+	template<class Field>
+	class DotProductDomain;
+
+	template<class Field>
+	class FieldAXPY;
+
+	template<class Field>
+	class MVProductDomain;
+
+	template <class Ring>
+	struct ClassifyRing;
+
+	template <class Element>
+	struct ClassifyRing<PIRModular<Element> >;
+
+	template <>
+	struct ClassifyRing<PIRModular<int32_t> >  {
+		typedef RingCategories::ModularTag categoryTag;
+	};
+
+	/// \ingroup ring
+	template <>
+	class PIRModular<int32_t> : public Givaro::Modular<int32_t> {
+
+	public:
+
+		friend class FieldAXPY<PIRModular<int32_t> >;
+
+		friend class DotProductDomain<PIRModular<int32_t> >;
+
+		friend class MVProductDomain<PIRModular<int32_t> >;
+
+		typedef int32_t Element;
+
+		typedef Givaro::Modular<int32_t>::RandIter RandIter;
+
+                uint64_t _two_64;
+            
+
+		//default modular field,taking 65521 as default modulus
+		PIRModular () :
+			Givaro::Modular<int32_t>(65521)
+		{
+                    _two_64 = (uint64_t(1) << 32) % uint64_t(this->characteristic());
+                    _two_64 = (_two_64 * _two_64) % uint64_t(this->characteristic());
+
+		}
+
+		PIRModular (int32_t value, int32_t exp = 1) :
+			Givaro::Modular<int32_t>(value)
+		{ 
+                    _two_64 = (uint64_t(1) << 32) % uint64_t(this->characteristic());
+                    _two_64 = (_two_64 * _two_64) % uint64_t(this->characteristic());
+
+                }
+
+
+		/** PIR functions, gcd, xgcd, dxgcd */
+
+		Element& gcd (Element& g, const Element& a, const Element& b) const
+		{
+
+			GCD (g, a, b);
+
+			return g;
+
+		}
+
+		Element& xgcd (Element& g, Element& s, Element& t, const Element& a, const Element& b) const
+		{
+
+			XGCD (g, s, t, a, b);
+
+			if (s < 0)
+				s += _p;
+
+			if (t < 0)
+				t += _p;
+
+
+			return g;
+		}
+
+		Element& dxgcd (Element& g, Element& s, Element& t, Element& a1, Element& b1,
+				const Element& a, const Element& b) const
+		{
+
+
+			xgcd (g, s, t, a, b);
+
+			if (g != 0) {
+
+				a1 = a / g;
+
+				b1 = b / g;
+			}
+
+			else {
+
+				a1 = s;
+
+				b1 = t;
+			}
+
+
+			return g;
+
+		}
+
+		bool isDivisor (const Element& a, const Element& b) const
+		{
+
+			Element g;
+
+			if (a == 0) return false;
+
+			else if (b == 0) return true;
+
+			else {
+
+				gcd (g, a, _p);
+
+				return (b % g) == 0;
+			}
+
+		}
+
+		Element& div (Element& d, const Element& a, const Element& b) const
+		{
+
+			Element g, s;
+
+			HXGCD (g, s, b, _p);
+
+			Element r;
+
+			r = a % g;
+
+			if (r != 0) throw PreconditionFailed(LB_FILE_LOC,"Div: not dividable");
+
+			else {
+
+				d = a / g;
+
+				mulin (d, s);
+			}
+
+			return d;
+
+		}
+
+		Element& normal (Element& a, const Element& b) const
+		{
+
+			if (b == 0) return a = 0;
+			else {
+				GCD (a, b, _p);
+
+				return a;
+			}
+		}
+
+
+		Element& gcdin (Element& a, const Element& b) const
+		{
+
+			GCD (a, a, b);
+
+
+			return normalIn(a); // is this efficient?
+		}
+
+		Element& normalIn (Element& a) const
+		{
+			if (a == 0) return a;
+			else {
+				GCD (a, a, _p);
+
+				return a;
+			}
+
+		}
+
+
+		Element& divin (Element& a, const Element& b) const
+		{
+
+			div (a, a, b);
+
+			return a;
+		}
+
+
+		bool isUnit(const Element& a) const
+		{
+
+			Element g;
+
+			GCD (g, a, _p);
+
+
+			//	std::cout << a << " is a unit or not " << g;
+
+			//		std::cout << "modulus = " << _p <<"\n";
+
+			return g == 1;
+
+		}
+
+	private:
+		static void GCD (int32_t& g, int32_t a, int32_t b) {
+
+			int32_t  u, v, /*  q,*/ r;
+
+			if (a < 0) {
+				if (a < -LINBOX_MAX_INT) throw PreconditionFailed(LB_FILE_LOC,"XGCD: integer overflow");
+				a = -a;
+
+			}
+
+			if (b < 0) {
+				if (b < -LINBOX_MAX_INT) throw PreconditionFailed(LB_FILE_LOC,"XGCD: integer overflow");
+				b = -b;
+			}
+
+			u = a; v = b;
+
+			while (v != 0) {
+				// q = u / v;
+				r = u % v;
+				u = v;
+				v = r;
+			}
+
+			g = u;
+
+		}
+
+		static void XGCD(int32_t& d, int32_t& s, int32_t& t, int32_t a, int32_t b) {
+			int32_t  u, v, u0, v0, u1, v1, u2, v2, q, r;
+
+			int32_t aneg = 0, bneg = 0;
+
+			if (a < 0) {
+				if (a < -LINBOX_MAX_INT) throw PreconditionFailed(LB_FILE_LOC,"XGCD: integer overflow");
+				a = -a;
+				aneg = 1;
+			}
+
+			if (b < 0) {
+				if (b < -LINBOX_MAX_INT) throw PreconditionFailed(LB_FILE_LOC,"XGCD: integer overflow");
+				b = -b;
+				bneg = 1;
+			}
+
+			u1 = 1; v1 = 0;
+			u2 = 0; v2 = 1;
+			u = a; v = b;
+
+			while (v != 0) {
+				q = u / v;
+				r = u % v;
+				u = v;
+				v = r;
+				u0 = u2;
+				v0 = v2;
+				u2 =  u1 - q*u2;
+				v2 = v1- q*v2;
+				u1 = u0;
+				v1 = v0;
+			}
+
+			if (aneg)
+				u1 = -u1;
+
+			if (bneg)
+				v1 = -v1;
+
+			d = u;
+			s = u1;
+			t = v1;
+		}
+
+
+		static void HXGCD (int32_t& d, int32_t& s, int32_t a, int32_t b) {
+
+			int32_t  u, v, u0, u1, u2, q, r;
+
+			int32_t aneg = 0;
+
+			if (a < 0) {
+				if (a < -LINBOX_MAX_INT) throw PreconditionFailed(LB_FILE_LOC,"XGCD: integer overflow");
+				a = -a;
+				aneg = 1;
+			}
+
+			if (b < 0) {
+				if (b < -LINBOX_MAX_INT) throw PreconditionFailed(LB_FILE_LOC,"XGCD: integer overflow");
+				b = -b;
+			}
+
+			u1 = 1;
+			u2 = 0;
+			u = a; v = b;
+
+			while (v != 0) {
+				q = u / v;
+				r = u % v;
+				u = v;
+				v = r;
+				u0 = u2;
+
+				u2 =  u1 - q*u2;
+
+				u1 = u0;
+
+			}
+
+			if (aneg)
+				u1 = -u1;
+
+
+			d = u;
+			s = u1;
+
+		}
+
+	};
+
+	template <>
+	class FieldAXPY<PIRModular<int32_t> > {
+	public:
+
+		typedef int32_t Element;
+		typedef int64_t Abnormal;
+		typedef PIRModular<int32_t> Field;
+
+		FieldAXPY (const Field &F) :
+			_field (F),_y(0)
+		{}
+
+
+		FieldAXPY (const FieldAXPY &faxpy) :
+			_field (faxpy._field), _y (0)
+		{}
+
+// 		FieldAXPY<PIRModular<int32_t> > &operator = (const FieldAXPY &faxpy) {
+// 			_field = faxpy._field;
+// 			_y = faxpy._y;
+// 			return *this;
+// 		}
+
+		inline uint64_t& mulacc (const Element &a, const Element &x) {
+			uint64_t t = (uint64_t) a * (uint64_t) x;
+			_y += t;
+			if (_y < t)
+				return _y += field()._two_64;
+			else
+				return _y;
+		}
+
+		inline uint64_t& accumulate (const Element &t) {
+			_y += (uint64_t)t;
+			if (_y < (uint64_t)t)
+				return _y += field()._two_64;
+			else
+				return _y;
+		}
+
+		inline Element& get (Element &y) {
+			y = Element(_y % (uint64_t) field().characteristic());
+			return y;
+		}
+
+		inline FieldAXPY &assign (const Element y) {
+			_y = (uint64_t)y;
+			return *this;
+		}
+
+		inline void reset() {
+			_y = 0;
+		}
+
+		inline const Field & field() const { return _field; }
+
+	protected:
+		const Field &_field;
+		uint64_t _y;
+	};
+
+
+	template <>
+	class DotProductDomain<PIRModular<int32_t> > : public  VectorDomainBase<PIRModular<int32_t> > {
+
+	public:
+		typedef int32_t Element;
+		DotProductDomain (const PIRModular<int32_t> &F) :
+			VectorDomainBase<PIRModular<int32_t> > (F)
+		{}
+
+
+	protected:
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+
+			typename Vector1::const_iterator i;
+			typename Vector2::const_iterator j;
+
+			uint64_t y = 0;
+			uint64_t t;
+
+			for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j) {
+				t = ( (uint64_t) *i ) * ( (uint64_t) *j );
+				y += t;
+
+				if (y < t)
+					y += field()._two_64;
+			}
+
+			y %= (uint64_t) field().characteristic();
+			return res = Element(y);
+
+		}
+
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+			typename Vector1::first_type::const_iterator i_idx;
+			typename Vector1::second_type::const_iterator i_elt;
+
+			uint64_t y = 0;
+			uint64_t t;
+
+			for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt) {
+				t = ( (uint64_t) *i_elt ) * ( (uint64_t) v2[*i_idx] );
+				y += t;
+
+				if (y < t)
+					y += field()._two_64;
+			}
+
+
+			y %= (uint64_t) field().characteristic();
+
+			return res = (Element)y;
+		}
+	};
+
+
+	// Specialization of MVProductDomain for int32_t modular field
+	template <>
+	class MVProductDomain<PIRModular<int32_t> > {
+	public:
+
+		typedef int32_t Element;
+
+	protected:
+		template <class Vector1, class Matrix, class Vector2>
+		inline Vector1 &mulColDense
+		(const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
+		{
+			return mulColDenseSpecialized
+			(VD, w, A, v, typename VectorTraits<typename Matrix::Column>::VectorCategory ());
+		}
+
+	private:
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::DenseVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseSequenceVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseAssociativeVectorTag) const;
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseParallelVectorTag) const;
+
+		mutable std::vector<uint64_t> _tmp;
+	};
+
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<PIRModular<int32_t> >::mulColDenseSpecialized
+	(const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::DenseVectorTag) const
+	{
+
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::const_iterator k;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i) {
+			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+				t = ((uint64_t) *k) * ((uint64_t) *j);
+
+				*l += t;
+
+				if (*l < t)
+                                    *l += VD.faxpy().field()._two_64;
+			}
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l % VD.field().characteristic();
+
+		return w;
+	}
+
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<PIRModular<int32_t> >::mulColDenseSpecialized
+	(const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseSequenceVectorTag) const
+	{
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::const_iterator k;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i) {
+			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+				t = ((uint64_t) k->second) * ((uint64_t) *j);
+
+				_tmp[k->first] += t;
+
+				if (_tmp[k->first] < t)
+					_tmp[k->first] += VD.faxpy().field()._two_64;
+			}
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l % VD.field().characteristic();
+
+		return w;
+	}
+
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<PIRModular<int32_t> >::mulColDenseSpecialized
+	(const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseAssociativeVectorTag) const
+	{
+
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::const_iterator k;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i) {
+			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+				t = ((uint64_t) k->second) * ((uint64_t) *j);
+
+				_tmp[k->first] += t;
+
+				if (_tmp[k->first] < t)
+					_tmp[k->first] += VD.faxpy().field()._two_64;
+			}
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l % VD.field().characteristic();
+
+		return w;
+	}
+
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<PIRModular<int32_t> >::mulColDenseSpecialized
+	(const VectorDomain<PIRModular<int32_t> > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseParallelVectorTag) const
+	{
+
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::first_type::const_iterator k_idx;
+		typename Matrix::Column::second_type::const_iterator k_elt;
+		std::vector<uint64_t>::iterator l;
+
+		uint64_t t;
+
+		if (_tmp.size () < w.size ())
+			_tmp.resize (w.size ());
+
+		std::fill (_tmp.begin (), _tmp.begin () + w.size (), 0);
+
+		for (j = v.begin (); j != v.end (); ++j, ++i) {
+			for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
+			     k_idx != i->first.end ();
+			     ++k_idx, ++k_elt, ++l)
+			{
+				t = ((uint64_t) *k_elt) * ((uint64_t) *j);
+
+				_tmp[*k_idx] += t;
+
+				if (_tmp[*k_idx] < t)
+					_tmp[*k_idx] += VD.faxpy().field()._two_64;
+			}
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l)
+			*w_j = *l % VD.field().characteristic();
+
+		return w;
+	}
+
+
+}
+
+
+#endif //__LINBOX_pir_modular_int32_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/ring/pir-ntl-zz_p.h b/linbox/ring/pir-ntl-zz_p.h
new file mode 100644
index 0000000..c4bca76
--- /dev/null
+++ b/linbox/ring/pir-ntl-zz_p.h
@@ -0,0 +1,913 @@
+/* Copyright (C) 2010 LinBox
+ * written by Zhendong Wan
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+#ifndef __LINBOX_pir_ntl_zz_p_H
+#define __LINBOX_pir_ntl_zz_p_H
+
+#include <givaro/zring.h>
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include <NTL/ZZ.h>
+#include <NTL/ZZ_p.h>
+#include "linbox/ring/ntl/ntl-zz_p.h"
+#include "linbox/vector/vector-domain.h"
+#include <sstream>
+#include "linbox/integer.h"
+#include "linbox/field/field-traits.h"
+
+namespace LinBox
+{
+
+	template<class Field>
+	class FieldAXPY;
+
+	template <class Ring>
+	struct ClassifyRing;
+
+	class PIR_ntl_ZZ_p;
+
+	template <>
+	struct ClassifyRing<PIR_ntl_ZZ_p> {
+		typedef RingCategories::ModularTag categoryTag;
+	};
+
+	/** \brief extend Wrapper of ZZ_p from NTL.  Add PIR functions
+	  \ingroup field
+	  */
+
+	class PIR_ntl_ZZ_p :  public NTL_ZZ_p {
+		//public Givaro::ZRing<NTL::ZZ_p> {
+
+		// typedef Givaro::ZRing<NTL::ZZ_p> Father_t ;
+		typedef NTL_ZZ_p Father_t ;
+	public:
+		typedef Father_t::Element Element;
+
+		template <class Int_t>
+		PIR_ntl_ZZ_p(const Int_t& d) :
+			Father_t(d)
+		{
+			// NTL::ZZ_p::init (NTL::to_ZZ(d));
+		}
+
+		PIR_ntl_ZZ_p (const NTL::ZZ& d) :
+		Father_t(d)
+		{
+			// NTL::ZZ_p::init(d);
+		}
+
+		PIR_ntl_ZZ_p (const integer& d, int e = 1 )  :
+			Father_t(d,(size_t)e)
+		{
+
+			// if(e != 1) throw PreconditionFailed(LB_FILE_LOC,"exponent must be 1");
+			linbox_check(e == 1);
+
+			// NTL::ZZ_p::init (NTL::to_ZZ(((std::string)d). c_str()));
+
+		}
+
+		inline integer& cardinality (integer& c) const {
+
+			std::stringstream io;
+
+			io << NTL::ZZ_p::modulus();
+
+			io >> c;
+
+			return c;
+		}
+
+		inline NTL::ZZ& cardinality (NTL::ZZ& c) const {
+
+			return c = NTL::ZZ_p::modulus();
+		}
+
+		inline integer& characteristic (integer& c) const {
+
+			std::stringstream  io;
+
+			io << NTL::ZZ_p::modulus();
+
+			io >> c;
+
+			return c;
+		}
+
+		std::ostream& write (std::ostream& out) const {
+			return out << "PIR_NTL_ZZ_p Ring";
+		}
+
+		std::istream& read (std::istream& in)  {
+			return in;
+		}
+
+		/** @brief
+		 *  Init x from y.
+		 */
+		template<class Element2>
+		inline Element& init (Element& x,  const Element2& y) const {
+
+			NTL::conv (x, y);
+
+			return x;
+		}
+
+		/** @brief
+		 *   Init from a NTL::ZZ_p
+		 */
+		inline Element& init (Element& x, const Element& y) const {
+
+			x = y;
+
+			return x;
+		}
+
+		/** @brief
+		 *  I don't  know how to init from integer.
+		 */
+		inline Element& init (Element& x, const integer& y) const {
+
+
+			NTL::conv(x, NTL::to_ZZ( (static_cast<const std::string>(y)).c_str() ) );
+			return x;
+		}
+
+		/** @brief
+		 *  Convert y to an Element.
+		 */
+		integer& convert (integer& x, const Element& y) const {
+			bool neg=false;
+			if (NTL::sign(NTL::rep(y)) <0)
+				neg=true;
+			long b = NTL::NumBytes(NTL::rep(y));
+			unsigned char* byteArray; byteArray = new unsigned char[(size_t)b ];
+			NTL::BytesFromZZ(byteArray, NTL::rep(y), b);
+			integer base(256);
+			x= integer(0);
+			for(long i = b - 1; i >= 0; --i) {
+				x *= base;
+				x += integer(byteArray[i]);
+			}
+			delete [] byteArray;
+			if (neg)
+				x=-x;
+			return x;
+		}
+
+
+		/** @brief
+		 *  x = y.
+		 */
+		inline Element&  assign (Element& x, const Element& y) const {
+			return x = y;
+		}
+
+		/** @brief
+		 *  Test if x == y
+		 */
+		inline bool areEqual (const Element& x ,const Element& y) const {
+			return x == y;
+		}
+
+		/** @brief
+		 *  Test if x == 0
+		 */
+		inline bool isZero (const Element& x) const {
+
+			return NTL::IsZero (x);
+		}
+
+		/** @brief
+		 *  Test if x == 1
+		 */
+		inline bool isOne (const Element& x) const {
+			return NTL::IsOne (x);
+		}
+
+	bool isMOne (const Element& x) const
+		{
+			Element y ; neg(y,x);
+			return isOne(y);
+		}
+
+
+		// arithmetic
+
+		/** @brief
+		 *  return x = y + z
+		 */
+		inline Element& add (Element& x, const Element& y, const Element& z) const {
+
+			NTL::add (x, y, z);
+
+			return x;
+		}
+
+		/** @brief
+		 *  return x = y - z
+		 */
+		inline Element& sub (Element& x, const Element& y, const Element& z) const  {
+
+			NTL::sub (x, y, z);
+
+			return x;
+		}
+
+		/** @brief
+		 *  return x = y * z
+		 */
+		template <class Int>
+		inline Element& mul (Element& x, const Element& y, const Int& z) const {
+
+			NTL::mul (x, y, z);
+
+			return x;
+		}
+
+		/** @brief
+		 *  If exists a, such that a * z =y,
+		 *  return x = one of them.
+		 *  Otherwise, throw an exception
+		 */
+		inline Element& div (Element& x, const Element& y, const Element& z) const {
+
+			NTL::ZZ g, s, t;
+
+			NTL::XGCD (g, s, t, NTL::rep(z), NTL::ZZ_p::modulus());
+
+			NTL::ZZ q, r;
+
+			NTL::DivRem (q, r, NTL::rep(y), g);
+
+			if (NTL::IsZero (r)) {
+
+				Element tmp1, tmp2;
+
+				NTL::conv (tmp1, s);
+
+				NTL::conv (tmp2, q);
+
+				NTL::mul (x, tmp1, tmp2);
+
+			}
+
+			else
+				throw PreconditionFailed(LB_FILE_LOC,"Div: not dividable");
+
+
+			return x;
+
+		}
+
+		/** @brief
+		 *  If y is a unit, return x = 1 / y,
+		 *  otherwsie, throw an exception
+		 */
+		inline Element& inv (Element& x, const Element& y) const {
+
+			NTL::inv (x, y);
+
+			return x;
+		}
+
+		/** @brief
+		 *  return x = -y;
+		 */
+		inline Element& neg (Element& x, const Element& y) const {
+
+			NTL::negate (x, y);
+
+			return x;
+		}
+
+
+		/** @brief
+		 *  return r = a x + y
+		 */
+
+		template <class Int>
+		inline const Element& axpy (Element& r, const Element& a, const Int& x, const Element& y) const  {
+
+			NTL::mul (r, a, x);
+
+			return r += y;
+		}
+
+
+		// inplace operator
+
+		/** @brief
+		 *  return x += y;
+		 */
+		inline Element& addin (Element& x, const Element& y) const {
+
+			return x += y;
+		}
+
+		/** @brief
+		 *  return x -= y;
+		 */
+		inline Element& subin (Element& x, const Element& y) const {
+
+			return x -= y;
+		}
+
+		/** @brief
+		 *  return x *= y;
+		 */
+		template<class Int>
+		inline Element& mulin (Element& x, const Int& y) const {
+
+			return x *= y;
+		}
+
+		/** @brief
+		 *  If y divides x, return x /= y,
+		 *  otherwise throw an exception
+		 */
+		inline const Element& divin (Element& x, const Element& y) const {
+
+			div (x, x, y);
+
+			return x;
+		}
+
+		/** @brief
+		 *  If x is a unit, x = 1 / x,
+		 *  otherwise, throw an exception.
+		 */
+		inline Element& invin (Element& x) const {
+
+			return x = NTL::inv(x);
+		}
+
+		/** @brief
+		 *  return x = -x;
+		 */
+		inline Element& negin (Element& x) const {
+
+			NTL::negate (x, x);
+
+			return x;
+		}
+
+		/** @brief
+		 *  return r += a x
+		 */
+		template <class Int>
+		inline Element& axpyin (Element& r, const Element& a, const Int& x) const {
+
+			return r += a * x;
+		}
+
+
+		// IO
+
+		/** @brief
+		 *  out << y;
+		 */
+		static std::ostream& write(std::ostream& out,const Element& y)  {
+
+			out << y;
+
+			return out;
+		}
+
+
+		/** @brief
+		 *  read x from istream in
+		static std::istream& read(std::istream& in, Element& x) {
+
+			return in >> x;
+		}
+		 */
+		using Father_t::read;
+
+
+		/** some PIR function
+		*/
+
+		/** @brief
+		 *  Test if x is a unit.
+		 */
+		inline static bool isUnit (const Element& x) {
+
+			NTL::ZZ g;
+
+			NTL::GCD (g, NTL::rep(x), NTL::ZZ_p::modulus());
+
+			return NTL::IsOne (g);
+		}
+
+		/** @brief
+		 *  return g = gcd (a, b)
+		 */
+		inline static Element& gcd (Element& g, const Element& a, const Element& b) {
+
+			NTL::ZZ d;
+
+			NTL::GCD (d, NTL::rep(a), NTL::rep(b));
+
+			NTL::conv (g, d);
+
+			return g;
+		}
+
+		/** @brief
+		 *  return g = gcd (g, b)
+		 */
+		inline static Element& gcdin (Element& g, const Element& b) {
+
+			gcd (g, g, b);
+
+			return g;
+		}
+
+		/** @brief
+		 *  g = gcd(a, b) = a*s + b*t.
+		 *  and gcd (s, t) is a unit.
+		 */
+		inline static Element& xgcd (Element& g, Element& s, Element& t, const Element& a, const Element& b){
+
+			NTL::ZZ g1, s1, t1;
+
+			NTL::XGCD (g1, s1, t1, NTL::rep(a), NTL::rep(b));
+
+			NTL::conv (g, g1);
+
+			NTL::conv (s, s1);
+
+			NTL::conv (t, t1);
+
+			return g;
+		}
+
+		/** @brief
+		 *  g = gcd(a, b) = a*s + b*t.
+		 *  and gcd (s, t) is a unit.
+		 *  s * a1 + t * b1 = a unit.
+		 */
+		inline static Element& dxgcd (Element& g, Element& s, Element& t, Element& a1, Element& b1,
+					      const Element& a, const Element& b){
+
+			NTL::ZZ g1, s1, t1, a2, b2;
+
+			NTL::XGCD (g1, s1, t1, NTL::rep(a), NTL::rep(b));
+
+			NTL::conv (g, g1);
+
+			NTL::conv (s, s1);
+
+			NTL::conv (t, t1);
+
+			if (NTL::IsZero (g1)) {
+
+				a1 = s;
+
+				b1 = t;
+			}
+
+			else {
+
+				NTL::div (a2, NTL::rep(a), g1);
+
+				NTL::div (b2, NTL::rep(b), g1);
+
+				NTL::conv (a1, a2);
+
+				NTL::conv (b1, b2);
+			}
+
+			return g;
+		}
+
+		/** @brief
+		 *  Test if a | b.
+		 */
+		inline static bool isDivisor (const Element& a, const Element& b) {
+
+			if ( NTL::IsZero (a) ) return false;
+
+			else if (NTL::IsZero (b)) return true;
+
+			else {
+				NTL::ZZ g, r;
+
+				NTL::GCD (g, NTL::rep(a), NTL::ZZ_p::modulus());
+
+				NTL::rem (r, NTL::rep(b), g);
+
+				return NTL::IsZero (r);
+			}
+		}
+
+		/** @brief
+		 *  a = normalization of b.
+		 */
+
+		inline static Element& normal (Element& a,  const Element& b) {
+
+			NTL::ZZ a1;
+
+			NTL::GCD (a1, NTL::rep(b), NTL::ZZ_p::modulus());
+
+			NTL::conv (a, a1);
+
+			return a;
+		}
+
+		/** @brief
+		*/
+
+		inline static Element& normalIn (Element& a) {
+
+
+			NTL::ZZ a1;
+
+			NTL::GCD (a1, NTL::rep(a), NTL::ZZ_p::modulus());
+
+			NTL::conv (a, a1);
+
+			return a;
+		}
+
+		inline static integer maxCardinality()
+		{ return integer( "4294967295" ); } // 2^32 - 1
+
+	};
+
+
+
+	template <>
+	class FieldAXPY<PIR_ntl_ZZ_p>  {
+	public:
+		typedef PIR_ntl_ZZ_p Field;
+		typedef Field::Element Element;
+		typedef NTL::ZZ Abnormal;
+
+		/** Constructor.
+		 * A faxpy object if constructed from a Field.
+		 * Copies of this objects are stored in the faxpy object.
+		 * @param F field F in which arithmetic is done
+		 */
+		FieldAXPY (const Field &F) :
+		       	_field (F)
+		{ _y = NTL::ZZ::zero(); }
+
+		/** Copy constructor.
+		 * @param faxpy
+		 */
+		FieldAXPY (const FieldAXPY<Field> &faxpy) :
+		       	_field (faxpy._field), _y (faxpy._y)
+	       	{}
+
+		/** Assignment operator
+		 * @param faxpy
+		 */
+		FieldAXPY<Field> &operator = (const FieldAXPY &faxpy)
+		{ _y = faxpy._y; return *this; }
+
+		/** Add a*x to y
+		 * y += a*x.
+		 * @param a constant reference to element a
+		 * @param x constant reference to element x
+		 */
+		inline NTL::ZZ& mulacc (const Element &a, const Element &x)
+		{
+			return _y +=  NTL::rep(a) * NTL::rep(x) ;
+		}
+
+		inline NTL::ZZ& accumulate (const Element &t)
+		{
+			return _y += NTL::rep(t);
+		}
+
+		/** Retrieve y
+		 *
+		 * Performs the delayed modding out if necessary
+		 */
+		inline Element &get (Element &y) { NTL::conv (y,  _y); return y; }
+
+		/** Assign method.
+		 * Stores new field element for arithmetic.
+		 * @return reference to self
+		 * @param y constant reference to element a
+		 */
+		inline FieldAXPY &assign (const Element& y)
+		{
+			_y = NTL::rep(y);
+
+			return *this;
+		}
+
+		inline void reset() {
+			_y = NTL::ZZ::zero();
+		}
+
+		inline const Field& field() const { return _field; }
+	private:
+
+		/// Field in which arithmetic is done
+		/// Not sure why it must be mutable, but the compiler complains otherwise
+		const Field &_field;
+
+		/// Field element for arithmetic
+		NTL::ZZ _y;
+
+	};
+
+	template<class Field>
+	class DotProductDomain;
+
+	template <>
+	class DotProductDomain<PIR_ntl_ZZ_p> : private  VectorDomainBase<PIR_ntl_ZZ_p> {
+
+	public:
+		typedef PIR_ntl_ZZ_p::Element Element;
+		DotProductDomain (const PIR_ntl_ZZ_p& F) :
+			VectorDomainBase<PIR_ntl_ZZ_p> (F) {}
+
+
+	protected:
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDD (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+
+			typename Vector1::const_iterator i;
+			typename Vector2::const_iterator j;
+
+			NTL::ZZ y;
+			//NTL::ZZ t;
+
+			for (i = v1.begin (), j = v2.begin (); i < v1.end (); ++i, ++j) {
+
+				y += NTL::rep (*i) * NTL::rep(*j);
+
+			}
+
+			//NTL::rem (t, y, NTL::ZZ_p::modulus());
+
+			NTL::conv (res, y);
+
+			return res;
+
+		}
+
+		template <class Vector1, class Vector2>
+		inline Element &dotSpecializedDSP (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		{
+			typename Vector1::first_type::const_iterator i_idx;
+			typename Vector1::second_type::const_iterator i_elt;
+
+			NTL::ZZ y;
+			y = (long)0;
+			//NTL::ZZ t;
+
+			for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt) {
+
+				y += NTL::rep(*i_elt) * NTL::rep(v2[*i_idx]);
+
+			}
+
+
+			//NTL::rem (t, y, NTL::ZZ_p::modulus());
+
+			NTL::conv (res, y);
+
+			return res;
+		}
+	};
+
+	// Specialization of MVProductDomain for  PIR_ntl_ZZ_p field
+
+	template <class Field>
+	class MVProductDomain;
+
+	template <>
+	class MVProductDomain<PIR_ntl_ZZ_p>
+	{
+	public:
+
+		typedef PIR_ntl_ZZ_p::Element Element;
+
+	protected:
+		template <class Vector1, class Matrix, class Vector2>
+		inline Vector1 &mulColDense
+		(const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v) const
+		{
+			return mulColDenseSpecialized
+			(VD, w, A, v, VectorTraits<typename Matrix::Column>::VectorCategory ());
+		}
+
+	private:
+
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::DenseVectorTag) const;
+
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseSequenceVectorTag) const;
+
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseAssociativeVectorTag) const;
+
+		template <class Vector1, class Matrix, class Vector2>
+		Vector1 &mulColDenseSpecialized
+		(const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+		 VectorCategories::SparseParallelVectorTag) const;
+
+	};
+
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<PIR_ntl_ZZ_p>::mulColDenseSpecialized
+	(const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::DenseVectorTag) const
+	{
+
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::const_iterator k;
+		std::vector<NTL::ZZ>::iterator l;
+		std::vector<NTL::ZZ> _tmp(w.size());
+
+		//NTL::ZZ t;
+
+		for (j = v.begin (); j != v.end (); ++j, ++i) {
+			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l)
+
+				*l += NTL::rep (*k) + NTL::rep (*j);
+
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l) {
+
+			//NTL::rem (t, *l, NTL::ZZ_p::modulus());
+
+			NTL::conv (*w_j, *l);
+		}
+
+
+		return w;
+	}
+
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<PIR_ntl_ZZ_p>::mulColDenseSpecialized
+	(const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseSequenceVectorTag) const
+	{
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::const_iterator k;
+		std::vector<NTL::ZZ>::iterator l;
+		std::vector<NTL::ZZ> _tmp(w.size());
+
+		//NTL::ZZ t;
+
+		for (j = v.begin (); j != v.end (); ++j, ++i) {
+			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+
+				_tmp[k->first] += NTL::rep (k->second) * NTL::rep (*j);
+
+			}
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l) {
+
+			//NTL::rem (t, *l, NTL::ZZ_p::modulus());
+
+			NTL::conv (*w_j, *l);
+		}
+
+		return w;
+	}
+
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<PIR_ntl_ZZ_p >::mulColDenseSpecialized
+	(const VectorDomain<PIR_ntl_ZZ_p > &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseAssociativeVectorTag) const
+	{
+
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::const_iterator k;
+		std::vector<NTL::ZZ>::iterator l;
+
+		std::vector<NTL::ZZ> _tmp(w.size());
+
+		//NTL::ZZ t;
+
+		for (j = v.begin (); j != v.end (); ++j, ++i) {
+			for (k = i->begin (), l = _tmp.begin (); k != i->end (); ++k, ++l) {
+
+				_tmp[k->first] += NTL::rep(k -> second) * NTL::rep(*j);
+
+			}
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l) {
+
+			//NTL::rem (t, *l, NTL::ZZ_p::modulus());
+
+			NTL::conv (*w_j, *l);
+		}
+
+
+		return w;
+	}
+
+	template <class Vector1, class Matrix, class Vector2>
+	Vector1 &MVProductDomain<PIR_ntl_ZZ_p>::mulColDenseSpecialized
+	(const VectorDomain<PIR_ntl_ZZ_p> &VD, Vector1 &w, const Matrix &A, const Vector2 &v,
+	 VectorCategories::SparseParallelVectorTag) const
+	{
+
+		linbox_check (A.coldim () == v.size ());
+		linbox_check (A.rowdim () == w.size ());
+
+		typename Matrix::ConstColIterator i = A.colBegin ();
+		typename Vector2::const_iterator j;
+		typename Matrix::Column::first_type::const_iterator k_idx;
+		typename Matrix::Column::second_type::const_iterator k_elt;
+		std::vector<NTL::ZZ>::iterator l;
+
+		std::vector<NTL::ZZ> _tmp(w.size());
+		//NTL::ZZ t;
+
+		for (j = v.begin (); j != v.end (); ++j, ++i) {
+			for (k_idx = i->first.begin (), k_elt = i->second.begin (), l = _tmp.begin ();
+			     k_idx != i->first.end ();
+			     ++k_idx, ++k_elt, ++l)
+
+				_tmp[*k_idx] += NTL::rep(*k_elt) * NTL::rep(*j);
+
+		}
+
+		typename Vector1::iterator w_j;
+
+		for (w_j = w.begin (), l = _tmp.begin (); w_j != w.end (); ++w_j, ++l) {
+
+			//NTL::rem (t, *l, NTL::ZZ_p::modulus());
+
+			NTL::conv (*w_j, *l);
+		}
+
+		return w;
+	}
+
+
+
+}
+
+#endif //__LINBOX_pir_ntl_zz_p_H
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/ring/poweroftwomodular.h b/linbox/ring/poweroftwomodular.h
index 08e13a0..fff8828 100644
--- a/linbox/ring/poweroftwomodular.h
+++ b/linbox/ring/poweroftwomodular.h
@@ -34,7 +34,7 @@
 #include "linbox/integer.h"
 #include "linbox/ring/gcd32.h"
 #include "linbox/ring/gcd64.h"
-#include "linbox/randiter/unparametric.h"
+#include "linbox/randiter/zring.h"
 
 // Namespace in which all LinBox code resides
 namespace LinBox
@@ -48,7 +48,7 @@ namespace LinBox
 	 *                     should be a data type that can support integers
 	 *                     twice the length of the maximal modulus used
 	 */
-	template <class Ints> class PowerOfTwoModular
+	template <class Ints> class PowerOfTwoGivaro::Modular
 	{
 	public:
 
@@ -63,7 +63,7 @@ namespace LinBox
 		struct RandIter{
 			typedef Ints Element;
 
-			RandIter ( const PowerOfTwoModular<Ints>& F,
+			RandIter ( const PowerOfTwoGivaro::Modular<Ints>& F,
 				   const integer& size = 0, const integer& seed = 0){
 				if (_seed == integer(0)) _seed = integer(time(NULL));
 				srand(static_cast<long>(_seed));
@@ -92,7 +92,7 @@ namespace LinBox
 
 		/** Default constructor.
 		*/
-		PowerOfTwoModular (void) {
+		PowerOfTwoGivaro::Modular (void) {
 			_poweroftwo=sizeof(Ints)<<3;
 		}
 
@@ -566,14 +566,14 @@ protected:
 		/// Private (non-static) element for modulus
 		Element _poweroftwo;
 
-}; // class PowerOfTwoModular
+}; // class PowerOfTwoGivaro::Modular
 
 #if 0
 /* Specialization of gcd_poweroftwo for Int64
 */
 template<>
-PowerOfTwoModular<int64_t>::Element&
-PowerOfTwoModular<int64_t>::gcd_poweroftwo (Element &x,const Element &y) const
+PowerOfTwoGivaro::Modular<int64_t>::Element&
+PowerOfTwoGivaro::Modular<int64_t>::gcd_poweroftwo (Element &x,const Element &y) const
 {
 	return x=GCD2E64(y);
 }
@@ -582,7 +582,7 @@ PowerOfTwoModular<int64_t>::gcd_poweroftwo (Element &x,const Element &y) const
 } // namespace LinBox
 
 // #include "linbox/field/modular.inl"
-// #include "linbox/randiter/modular.h"
+// 
 
 #endif // __LINBOX_poweroftwomodular_H
 
diff --git a/linbox/ring/ring.doxy b/linbox/ring/ring.doxy
index c3469fd..1027021 100644
--- a/linbox/ring/ring.doxy
+++ b/linbox/ring/ring.doxy
@@ -25,9 +25,34 @@
 
   \brief LinBox rings, ring wrappers, ring construction tools.
 
-  LinBox rings implement the ring concept,
-  inheriting from the field concept,
-  as it is defined in the ring archetype.
+  LinBox ring classes implement the BasicRing concept,
+  which has the same members as the field concept.
+  The difference is that some functions have different semantics.  Specifically,
+  inv and div are partial functions.
+
+  Some ring classes extend BasicRing:
+
+  The PIR concept (principal ideal ring) has, beyond BasicRing,
+  \c gcd(g, a, b),  g = (a,b), greatest common divisor of a, b.
+  \c gcd(g, s, a, b),  g = (a,b) = sa modulo b. s < b/g.
+  \c gcd(g, s, t, a, b),  g = (a,b) = sa + tb, s < b/g, t < a/g.
+  \c gcd(g, s, t, u, v, a, b),  (a,b) = g = sa + tb, u = a/g, v = b/g.
+  \c gcdin(g, a), g = (g,a)
+  \c lcm(), \c isUnit(), \c isZeroDivisor().
+
+  The PID concept (principal ideal domain) has the same members as the PIR concept,
+  but it is promised that there are no zero divisors.
+
+  The LocalPIR concept has the members of PIR, but 
+  there is a unique prime ideal.  Some algorithms exploit this.
+
+  Local2_32 exploits a few additional functions and the type \c Exponent.  
+  This concept could be used for other small rings extending tiny fields as well.
+
+  Example of BasicRing: Givaro::Modular<int32_t> when the modulus may be non-prime.
+  Example of PIR: PIRModular
+  Example of PID: PIDInteger.
+  Example of LocalPIR: Local2_32.
 
  */
 
diff --git a/linbox/solutions/Makefile.am b/linbox/solutions/Makefile.am
index 5584836..c830f9a 100644
--- a/linbox/solutions/Makefile.am
+++ b/linbox/solutions/Makefile.am
@@ -23,26 +23,33 @@ AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DLinBoxSrcOnly
 pkgincludesubdir=$(pkgincludedir)/solutions
 
 pkgincludesub_HEADERS=          \
-    methods.h                   \
-    minpoly.h                   \
-    rank.h                      \
-    trace.h                     \
-    getentry.h                  \
+    charpoly.h                  \
     det.h                       \
-    solve.h                     \
+    getentry.h                  \
+    getentry.inl                \
     is-positive-definite.h      \
     is-positive-semidefinite.h  \
-    charpoly.h                  \
-    valence.h                   \
+    methods.h                   \
+    minpoly.h                   \
     nullspace.h                 \
-    smith-form.h
+    rank.h                      \
+    rank.inl                    \
+    smith-form.h                \
+    solve.h                     \
+    trace.h                     \
+    trace.inl                   \
+    valence.h			\
+    solution-tags.h
+
+#    rankin.h
+#    wiedemann-rank.h
 
 EXTRA_DIST =                \
-    solutions.doxy          \
-    systemsolving.doxy      \
-    rank.doxy               \
+    charpoly.doxy           \
     determinant.doxy        \
     minpoly.doxy            \
-    charpoly.doxy           \
+    nullspace.doxy          \
+    rank.doxy               \
     reducedforms.doxy       \
-    nullspace.doxy
+    solutions.doxy          \
+    systemsolving.doxy
diff --git a/linbox/solutions/Makefile.in b/linbox/solutions/Makefile.in
deleted file mode 100644
index bf721e0..0000000
--- a/linbox/solutions/Makefile.in
+++ /dev/null
@@ -1,599 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# This file is part of LinBox
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-#/
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/solutions
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-AM_CXXFLAGS = @DEFAULT_CFLAGS@ -DLinBoxSrcOnly
-pkgincludesubdir = $(pkgincludedir)/solutions
-pkgincludesub_HEADERS = \
-    methods.h                   \
-    minpoly.h                   \
-    rank.h                      \
-    trace.h                     \
-    getentry.h                  \
-    det.h                       \
-    solve.h                     \
-    is-positive-definite.h      \
-    is-positive-semidefinite.h  \
-    charpoly.h                  \
-    valence.h                   \
-    nullspace.h                 \
-    smith-form.h
-
-EXTRA_DIST = \
-    solutions.doxy          \
-    systemsolving.doxy      \
-    rank.doxy               \
-    determinant.doxy        \
-    minpoly.doxy            \
-    charpoly.doxy           \
-    reducedforms.doxy       \
-    nullspace.doxy
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/solutions/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps linbox/solutions/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
-	done
-
-uninstall-pkgincludesubHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
-	for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool ctags distclean distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-pkgincludesubHEADERS install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/solutions/charpoly.h b/linbox/solutions/charpoly.h
index 104e191..38a4143 100644
--- a/linbox/solutions/charpoly.h
+++ b/linbox/solutions/charpoly.h
@@ -25,18 +25,13 @@
 #ifndef __LINBOX_charpoly_H
 #define __LINBOX_charpoly_H
 
-
-
 #include "linbox/solutions/methods.h"
 #include "linbox/util/debug.h"
 #include "linbox/field/field-traits.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
-
-#ifdef __LINBOX_HAVE_GIVARO
-// BBcharpoly without givaropolynomials is not yet implemented
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/randiter/random-prime.h"
 #include "linbox/algorithms/bbcharpoly.h"
-#endif
 // Namespace in which all LinBox library code resides
 
 namespace LinBox
@@ -90,8 +85,9 @@ namespace LinBox
 	}
 
 	// The charpoly with Hybrid Method
+	//! @bug not Hybrid at all
 	template<class Polynomial, class Blackbox>
-	Polynomial &charpoly (Polynomial                       &P,
+	Polynomial &charpoly (Polynomial            &P,
 			      const Blackbox                   & A,
 			      const RingCategories::ModularTag & tag,
 			      const Method::Hybrid             & M)
@@ -102,19 +98,23 @@ namespace LinBox
 	}
 
 	// The charpoly with Hybrid Method
+	//! @bug not Hybrid at all
 	template<class Polynomial, class Domain>
-	Polynomial &charpoly (Polynomial                       &P,
+	Polynomial &charpoly (Polynomial            &P,
 			      const SparseMatrix<Domain>       & A,
 			      const RingCategories::ModularTag & tag,
 			      const Method::Hybrid             & M)
 	{
 		// not yet a hybrid
-		return charpoly(P, A, tag, Method::Blackbox(M));
+                // bb method broken, default to dense method
+		return charpoly(P, A, tag, Method::BlasElimination(M));
+//		return charpoly(P, A, tag, Method::Blackbox(M));
 	}
 
 	// The charpoly with Hybrid Method
+	//! @bug not Hybrid at all
 	template<class Polynomial, class Domain>
-	Polynomial &charpoly (Polynomial                       &P,
+	Polynomial &charpoly (Polynomial            &P,
 			      const BlasMatrix<Domain>         & A,
 			      const RingCategories::ModularTag & tag,
 			      const Method::Hybrid             & M)
@@ -145,19 +145,40 @@ namespace LinBox
 	 * @param M
 	 */
 	template < class Polynomial, class Blackbox >
+	BlasVector<typename Blackbox::Field,Polynomial >&
+	charpoly (BlasVector<typename Blackbox::Field,Polynomial > & P,
+		  const Blackbox                                   & A,
+		  const RingCategories::ModularTag                 & tag,
+		  const Method::BlasElimination                    & M)
+	{
+		if (A.coldim() != A.rowdim())
+			throw LinboxError("LinBox ERROR: matrix must be square for characteristic polynomial computation\n");
+
+		BlasMatrix< typename Blackbox::Field >     BBB (A);
+		BlasMatrixDomain< typename Blackbox::Field > BMD (BBB.field());
+		BMD.charpoly (P, static_cast<BlasMatrix<typename Blackbox::Field> >(BBB));
+		return P  ;
+	}
+	template < class Polynomial, class Blackbox >
 	Polynomial& charpoly (Polynomial                       & P,
 			      const Blackbox                   & A,
 			      const RingCategories::ModularTag & tag,
 			      const Method::BlasElimination    & M)
 	{
+
 		if (A.coldim() != A.rowdim())
 			throw LinboxError("LinBox ERROR: matrix must be square for characteristic polynomial computation\n");
 
 		BlasMatrix< typename Blackbox::Field >     BBB (A);
 		BlasMatrixDomain< typename Blackbox::Field > BMD (BBB.field());
-		return BMD.charpoly (P, static_cast<BlasMatrix<typename Blackbox::Field> >(BBB));
+		BlasVector<typename Blackbox::Field,Polynomial> P2(A.field(),P);
+		BMD.charpoly (P2, static_cast<BlasMatrix<typename Blackbox::Field> >(BBB));
+		return P = P2.getRep() ;
+
+
 	}
 
+
 }
 
 #include "linbox/algorithms/matrix-hom.h"
@@ -182,7 +203,9 @@ namespace LinBox
 		{
 			typedef typename Blackbox::template rebind<Field>::other FBlackbox;
 			FBlackbox Ap(A, F);
-			return charpoly( P, Ap, typename FieldTraits<Field>::categoryTag(), M);
+
+                        return charpoly( P, Ap, typename FieldTraits<Field>::categoryTag(), M);
+                        // std::cerr << "Charpoly(A) mod "<<F.characteristic()<<" = "<<P;
 			// 			integer p;
 			// 			F.characteristic(p);
 			//			std::cerr<<"Charpoly(A) mod "<<p<<" = "<<P;
@@ -196,18 +219,20 @@ namespace LinBox
 			      const Method::Hybrid	       & M)
 	{
 		commentator().start ("Integer Charpoly", "Icharpoly");
-		if ( (A.rowdim() < 1000) && (A.coldim() <1000) )
+                    // bb method broken, default to dense method
+		if (1/* (A.rowdim() < 1000) && (A.coldim() <1000) */)
 			charpoly(P, A, tag, Method::BlasElimination(M) );
-		else
+                else
 			charpoly(P, A, tag, Method::Blackbox(M) );
 		commentator().stop ("done", NULL, "Icharpoly");
 		return P;
 	}
 
-	//#if 0
-#if defined(__LINBOX_HAVE_NTL) && defined(__LINBOX_HAVE_GIVARO)
 }
 
+#if 0 // CIA is buggy (try with matrix(ZZ,4,[1..16]) )
+//#if defined(__LINBOX_HAVE_NTL)
+
 #include "linbox/algorithms/cia.h"
 namespace LinBox
 {
@@ -221,7 +246,9 @@ namespace LinBox
 			      const Method::Hybrid              &M)
 	{
 		// not yet a hybrid
-		return charpoly(P, A, tag, Method::Blackbox(M));
+                    // bb method broken, default to dense method
+                return charpoly(P, A, tag, Method::BlasElimination(M));
+//		return charpoly(P, A, tag, Method::Blackbox(M));
 	}
 #endif
 
@@ -270,7 +297,7 @@ namespace LinBox
 	{
 		if (A.coldim() != A.rowdim())
 			throw LinboxError("LinBox ERROR: matrix must be square for characteristic polynomial computation\n");
-		typename GivPolynomialRing<typename Blackbox::Field>::Element Pg;
+		typename Givaro::Poly1Dom<typename Blackbox::Field, Givaro::Dense>::Element Pg;
 		return P = cia (Pg, A, M);
 	}
 
@@ -290,19 +317,21 @@ namespace LinBox
 	{
 		if (A.coldim() != A.rowdim())
 			throw LinboxError("LinBox ERROR: matrix must be square for characteristic polynomial computation\n");
-		typename GivPolynomialRing<typename Blackbox::Field>::Element Pg;
-		return P = BBcharpoly::blackboxcharpoly (Pg, A, tag, M);
+// 		typename Givaro::Poly1Dom<typename Blackbox::Field>::Element Pg;
+// 		return P = BBcharpoly::blackboxcharpoly (Pg, A, tag, M);
+                    // BB method broken: default to dense method
+                return charpoly(P, A, tag, Method::BlasElimination(M) );
+                    //return BBcharpoly::blackboxcharpoly (P, A, tag, M);
 	}
 
-
-#else //  no NTL or no Givaro (??)
 }
 
-#include "linbox/field/modular.h"
+#else //  no NTL
+
+#include "linbox/ring/modular.h"
 #include "linbox/algorithms/cra-domain.h"
 #include "linbox/algorithms/cra-full-multip.h"
 #include "linbox/algorithms/cra-early-multip.h"
-#include "linbox/randiter/random-prime.h"
 #include "linbox/algorithms/matrix-hom.h"
 
 namespace LinBox
@@ -369,9 +398,9 @@ namespace LinBox
 		size_t n=A.coldim();
 		double hadamarcp = n/2.0*(log(double(n))+2*log(double(max))+0.21163275)/log(2.0);
 
-		ChineseRemainder< FullMultipCRA<Modular<double> > > cra(hadamarcp);
+		ChineseRemainder< FullMultipCRA<Givaro::Modular<double> > > cra(hadamarcp);
 #endif
-		ChineseRemainder< EarlyMultipCRA<Modular<double> > > cra(3UL);
+		ChineseRemainder< EarlyMultipCRA<Givaro::Modular<double> > > cra(3UL);
 
 		IntegerModularCharpoly<Blackbox,Method::Blackbox> iteration(A, M);
 		cra.operator() (P, iteration, genprime);
@@ -410,18 +439,21 @@ namespace LinBox
 		double hadamarcp = n/2.0*(log(double(n))+2*log(double(max))+0.21163275)/log(2.0);
 
 
-		ChineseRemainder< FullMultipCRA<Modular<double> > > cra(hadamarcp);
+		ChineseRemainder< FullMultipCRA<Givaro::Modular<double> > > cra(hadamarcp);
 #endif
-		ChineseRemainder< EarlyMultipCRA<Modular<double> > > cra(3UL);
+		ChineseRemainder< EarlyMultipCRA<Givaro::Modular<double> > > cra(3UL);
 		IntegerModularCharpoly<Blackbox,Method::BlasElimination> iteration(A, M);
 		cra(P, iteration, genprime);
 		commentator().stop ("done", NULL, "IbbCharpoly");
 		return P;
 	}
 
+}
 
 #endif
 
+namespace LinBox
+{
 	/** Compute the characteristic polynomial over \f$\mathbf{Z}_p\f$.
 	 *
 	 * Compute the characteristic polynomial of a matrix, represented via
@@ -441,12 +473,9 @@ namespace LinBox
 		if (A.coldim() != A.rowdim())
 			throw LinboxError("LinBox ERROR: matrix must be square for characteristic polynomial computation\n");
 
-#ifdef __LINBOX_HAVE_GIVARO
-		typename GivPolynomialRing<typename Blackbox::Field>::Element Pg;
-		return P = BBcharpoly::blackboxcharpoly (Pg, A, tag, M);
-#else
-		return charpoly(P, A, tag, Method::BlasElimination());
-#endif
+// 		typename Givaro::Poly1Dom<typename Blackbox::Field>::Element Pg;
+// 		return P = BBcharpoly::blackboxcharpoly (Pg, A, tag, M);
+		return BBcharpoly::blackboxcharpoly (P, A, tag, M);
 	}
 
 	template < class Blackbox, class Polynomial, class MyMethod>
@@ -455,11 +484,12 @@ namespace LinBox
 	{
 		commentator().start ("Rational Charpoly", "Rcharpoly");
 
-		RandomPrimeIterator genprime( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
-		RationalRemainder2< VarPrecEarlyMultipCRA<Modular<double> > > rra(3UL);
+		RandomPrimeIterator genprime( 26-(unsigned int)ceil(log((double)A.rowdim())*0.7213475205));
+		RationalRemainder2< VarPrecEarlyMultipCRA<Givaro::Modular<double> > > rra(3UL);
 		IntegerModularCharpoly<Blackbox,MyMethod> iteration(A, M);
 
-		std::vector<Integer> PP; // use of integer due to non genericity of cra. PG 2005-08-04
+		Givaro::ZRing<Integer> Z;
+		BlasVector<Givaro::ZRing<Integer> > PP(Z); // use of integer due to non genericity of cra. PG 2005-08-04
 		Integer den;
 		rra(PP,den, iteration, genprime);
 		size_t i =0;
@@ -476,11 +506,10 @@ namespace LinBox
 #endif // __LINBOX_charpoly_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/solutions/det.h b/linbox/solutions/det.h
index 24bea55..1b19a39 100644
--- a/linbox/solutions/det.h
+++ b/linbox/solutions/det.h
@@ -34,12 +34,13 @@
 #include "linbox/blackbox/compose.h"
 #include "linbox/solutions/methods.h"
 #include "linbox/solutions/getentry.h"
+#include "linbox/vector/blas-vector.h"
 
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
 #include "linbox/algorithms/blackbox-container.h"
 #include "linbox/algorithms/blackbox-container-symmetric.h"
 #include "linbox/algorithms/massey-domain.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
 #include "linbox/algorithms/gauss.h"
 #include "linbox/vector/vector-traits.h"
 #include "linbox/util/prime-stream.h"
@@ -207,13 +208,13 @@ namespace LinBox
 			throw LinboxError("LinBox ERROR: matrix must be square for determinant computation\n");
 
 		typedef typename Blackbox::Field Field;
-		typedef std::vector<typename Field::Element> Polynomial;
 		Field F = A.field();
+		typedef BlasVector<Field> Polynomial;
 
 		if(Meth.symmetric()) {
 			commentator().start ("Symmetric Wiedemann Determinant", "sdet");
 			linbox_check (A.coldim () == A.rowdim ());
-			Polynomial               phi;
+			Polynomial               phi(F);
 			unsigned long            deg;
 			typename Field::RandIter iter (F);
 
@@ -222,19 +223,19 @@ namespace LinBox
 			// Here there is an extra diagonal computation
 			// The probability of success is also divided by two, as
 			// diag^2 contains only squares and squares are half the total elements
-			std::vector<typename Field::Element> diag (A.coldim ());
+			BlasVector<Field> diag (A.field(),A.coldim ());
 
 			typename Field::Element pi;
 			size_t i;
 			size_t iternum = 1;
 			do {
-				F.init (pi, 1);
+				F.assign(pi, F.one);
 				for (i = 0; i < A.coldim (); i++) {
 					do iter.random (diag[i]); while (F.isZero (diag[i]));
 					F.mulin (pi, diag[i]);
 				}
 
-				Diagonal<Field> D (F, diag);
+				Diagonal<Field> D (diag);
 				Compose<Blackbox,Diagonal<Field> > B0 (&A, &D);
 				typedef Compose<Diagonal<Field>,Compose<Blackbox,Diagonal<Field> > > Blackbox1;
 				Blackbox1 B(&D, &B0);
@@ -244,14 +245,16 @@ namespace LinBox
 				MasseyDomain<Field, BlackboxContainerSymmetric<Field, Blackbox1> > WD (&TF, Meth.earlyTermThreshold ());
 
 				WD.minpoly (phi, deg);
-				//                         std::cout << "\tdet: iteration # " << iternum << "\tMinpoly deg= "
-				//                                   << phi.size() << "\n" ;
-				//                         std::cout << "[" ;
-				//                         for(typename Polynomial::const_iterator refs =  phi.begin();
-				// 			        refs != phi.end() ;
-				// 				      ++refs )
-				// 		          std::cout << (*refs) << " " ;
-				//                         std::cout << "]" << std::endl;
+#if 0
+				std::cout << "\tdet: iteration # " << iternum << "\tMinpoly deg= "
+				<< phi.size() << "\n" ;
+				std::cout << "[" ;
+				for(typename Polynomial::const_iterator refs =  phi.begin();
+				    refs != phi.end() ;
+				    ++refs )
+					std::cout << (*refs) << " " ;
+				std::cout << "]" << std::endl;
+#endif
 
 				++iternum;
 			} while ( (phi.size () < A.coldim () + 1) && ( !F.isZero (phi[0]) ) );
@@ -272,25 +275,25 @@ namespace LinBox
 			commentator().start ("Wiedemann Determinant", "wdet");
 			linbox_check (A.coldim () == A.rowdim ());
 
-			Polynomial               phi;
+			Polynomial               phi(F);
 			unsigned long            deg;
 			typename Field::RandIter iter (F);
 
 			// Precondition here to separate the eigenvalues, so that
 			// minpoly (B) = charpoly (B) with high probability
-			std::vector<typename Field::Element> diag (A.coldim ());
+			BlasVector<Field> diag (F,A.coldim ());
 
 			typename Field::Element pi;
 			size_t i;
 			size_t iternum = 1;
 			do {
-				F.init (pi, 1);
+				F.assign(pi, F.one);
 				for (i = 0; i < A.coldim (); i++) {
 					do iter.random (diag[i]); while (F.isZero (diag[i]));
 					F.mulin (pi, diag[i]);
 				}
 
-				Diagonal<Field> D (F, diag);
+				Diagonal<Field> D (diag);
 
 				Compose<Blackbox,Diagonal<Field> > B (&A, &D);
 
@@ -356,7 +359,7 @@ namespace LinBox
 		typedef typename Blackbox::Field Field;
 		commentator().start ("Sparse Elimination Determinant", "SEDet");
 		// We make a copy as these data will be destroyed
-		SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq> A1 (A.field(), A.rowdim(), A.coldim());
+		SparseMatrix<Field, SparseMatrixFormat::SparseSeq> A1 (A.field(), A.rowdim(), A.coldim());
 		typename Blackbox::Field::Element tmp;
 		for(size_t i = 0; i < A.rowdim() ; ++i)
 			for(size_t j = 0; j < A.coldim(); ++j)
@@ -379,7 +382,7 @@ namespace LinBox
 			throw LinboxError("LinBox ERROR: matrix must be square for determinant computation\n");
 		commentator().start ("Sparse Elimination Determinant", "SEDet");
 		// We make a copy as these data will be destroyed
-		SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq> A1 (A);
+		SparseMatrix<Field, SparseMatrixFormat::SparseSeq> A1 (A);
 		GaussDomain<Field> GD ( A.field() );
 		GD.detin (d, A1, Meth.strategy ());
 		commentator().stop ("done", NULL, "SEdet");
@@ -388,7 +391,7 @@ namespace LinBox
 
 	template <class Field>
 	typename Field::Element &detin (typename Field::Element         	&d,
-					SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq>  &A,
+					SparseMatrix<Field, SparseMatrixFormat::SparseSeq>  &A,
 					const RingCategories::ModularTag  	&tag,
 					const Method::SparseElimination     	&Meth)
 	{
@@ -415,7 +418,7 @@ namespace LinBox
 
 	template <class Field>
 	typename Field::Element &detin (typename Field::Element         	&d,
-					SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq>  &A,
+					SparseMatrix<Field, SparseMatrixFormat::SparseSeq>  &A,
 					const RingCategories::ModularTag  	&tag,
 					const Method::Elimination     		&Meth)
 	{
@@ -512,7 +515,7 @@ namespace LinBox
 	}
 } // end of LinBox namespace
 
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 //#include "linbox/field/givaro-zpz.h"
 
 #ifdef __LINBOX_HAVE_MPI
@@ -576,14 +579,14 @@ namespace LinBox
 
 		//  will call regular cra if C=0
 #ifdef __LINBOX_HAVE_MPI
-		MPIChineseRemainder< EarlySingleCRA< Modular<double> > > cra(4UL, C);
+		MPIChineseRemainder< EarlySingleCRA< Givaro::Modular<double> > > cra(4UL, C);
 		cra(dd, iteration, genprime);
 		if(!C || C->rank() == 0){
 			A.field().init(d, dd); // convert the result from integer to original type
 			commentator().stop ("done", NULL, "det");
 		}
 #else
-		ChineseRemainder< EarlySingleCRA< Modular<double> > > cra(4UL);
+		ChineseRemainder< EarlySingleCRA< Givaro::Modular<double> > > cra(4UL);
 		cra(dd, iteration, genprime);
 		A.field().init(d, dd); // convert the result from integer to original type
 		commentator().stop ("done", NULL, "idet");
@@ -633,8 +636,8 @@ namespace LinBox
 		Integer num,den;
 
 		IntegerModularDet<Blackbox, MyMethod> iteration(A, Meth);
-		RandomPrimeIterator genprime( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
-		RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> > > rra(4UL);
+		RandomPrimeIterator genprime( (unsigned int)( 26-(int)ceil(log((double)A.rowdim())*0.7213475205)));
+		RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> > > rra(4UL);
 
 		rra(num,den, iteration, genprime);
 
@@ -680,11 +683,10 @@ namespace LinBox
 #endif // __LINBOX_det_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/solutions/getentry.h b/linbox/solutions/getentry.h
index e2fd4c2..27c3ac7 100644
--- a/linbox/solutions/getentry.h
+++ b/linbox/solutions/getentry.h
@@ -3,20 +3,20 @@
  *  Evolved from an earlier one by Bradford Hovinen <hovinen at cis.udel.edu>
  *  -bds
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -27,128 +27,65 @@
 #ifndef __LINBOX_getentry_H
 #define __LINBOX_getentry_H
 
-#include <vector>
-
-#include "linbox/util/debug.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/blackbox/scalar-matrix.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/blackbox/compose.h"
 #include "linbox/blackbox/diagonal.h"
 #include "linbox/solutions/methods.h"
+#include "linbox/solutions/solution-tags.h"
 
 namespace LinBox
 {
 
-	/// limited doc so far.
-	namespace GetEntryTags
-	{	struct GenericBB{};
-		struct Local{};
-		struct SpecialCDB{};
-		struct SpecialCBD{};
-		struct SpecialCDD{};
-	} // namespace GetEntryTags
-
-	template<class BB> struct GetEntryCategory { typedef GetEntryTags::GenericBB Tag; };
-
 	/** \brief
 	 * Getting the i,j entry of the blackbox.
 	 */
 	template <class BB>
-	typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j)
-	{
-		typename GetEntryCategory<BB>::Tag t;
-		return getEntry(x, A, i, j, t);
-	}
+	typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j);
 
-	/// To ignore methods
-	template <class BB, class Method>
-	typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j, Method & m)
-	{ return getEntry(x, A, i, j);	}
-
-	// Generic BBs require use of apply.
-	template <class BB>
-	typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j, GetEntryTags::GenericBB t)
-	{
-		typedef typename BB::Field Field;
-		typedef typename Field::Element Elt;
-		typedef std::vector<Elt> Vector;
-
-		const Field& F = A.field();
-		Elt zero; F.init(zero, 0UL);
-		Vector v(A.coldim(), zero), w(A.rowdim(), zero);
-		for (typename Vector::iterator it = v.begin (); it != v.end (); ++it)
-			F.assign (*it, zero);
-		F.init(v[j],1UL);
-		A.apply (w, v);
-		F.assign (x, VectorWrapper::constRef<Field, Vector> (w, i));
-		return x;
-	}
-
-	// BBs that offer a local getEntry.
-	template<class A, class B> struct GetEntryCategory<SparseMatrix<A,B> > { typedef GetEntryTags::Local Tag; };
-	template<class A, class B, class C> struct GetEntryCategory<SparseMatrixBase<A,B,C> > { typedef GetEntryTags::Local Tag; };
-	template<class Field, class Trait> struct GetEntryCategory<Diagonal<Field, Trait> > { typedef GetEntryTags::Local Tag; };
-	template<class Field> struct GetEntryCategory<ScalarMatrix<Field> > { typedef GetEntryTags::Local Tag; };
-
-	template <class BB>
-	typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j, GetEntryTags::Local t )
-	{ return A.getEntry(x, i, j); }
+	// Some specializations
 
 	// Compose< Diagonal, BB > specialization
 	template <class Field, class Trait, class BB>
-	struct GetEntryCategory<Compose<Diagonal<Field, Trait>,BB> > { typedef GetEntryTags::SpecialCDB Tag; };
-
-	template <class Field, class Trait, class BB>
-	typename Field::Element& getEntry(typename Field::Element& x, const Compose<Diagonal<Field, Trait>, BB>& A, const size_t i, const size_t j, GetEntryTags::SpecialCDB t)
-	{
-		typename Field::Element y;
-		getEntry(y, *(A.getLeftPtr()), i, i);
-		getEntry(x, *(A.getRightPtr()), i, j);
-		return A.field().mulin(x, y);
-	}
+	typename Field::Element& getEntry(typename Field::Element& x, const Compose<Diagonal<Field, Trait>, BB>& A, const size_t i, const size_t j);
 
 	// Compose< BB, Diagonal > specialization
 	template <class BB, class Field, class Trait>
-	struct GetEntryCategory<Compose<BB, Diagonal<Field, Trait> > > { typedef GetEntryTags::SpecialCBD Tag; };
-
-	template <class BB, class Field, class Trait>
-	typename Field::Element& getEntry(typename Field::Element& x, const Compose<BB, Diagonal<Field, Trait> >& A, const size_t i, const size_t j, GetEntryTags::SpecialCBD t)
-	{
-		typename Field::Element y;
-		getEntry(y, *(A.getLeftPtr()), i, j);
-		getEntry(x, *(A.getRightPtr()), j, j);
-		return A.field().mulin(x, y);
-	}
+	typename Field::Element& getEntry(typename Field::Element& x, const Compose<BB, Diagonal<Field, Trait> >& A, const size_t i, const size_t j);
 
 	// Compose< Diagonal, Diagonal > specialization
 	template <class Field, class T1, class T2>
-	struct GetEntryCategory<Compose<Diagonal<Field, T1>,Diagonal<Field, T2> > > { typedef GetEntryTags::SpecialCDD Tag; };
+	typename Field::Element& getEntry(typename Field::Element& x, const Compose<Diagonal<Field,T1>, Diagonal<Field, T2> >& A, const size_t i, const size_t j);
 
-	template <class Field, class T1, class T2>
-	typename Field::Element& getEntry(typename Field::Element& x, const Compose<Diagonal<Field,T1>, Diagonal<Field, T2> >& A, const size_t i, const size_t j, GetEntryTags::SpecialCDD t)
-	{
-		if (i != j)
-			return A.field().init(x, 0UL);
-		else {
-			typename Field::Element y;
-			getEntry(y, *(A.getLeftPtr()), i, i);
-			getEntry(x, *(A.getRightPtr()), j, j);
-			return A.field().mulin(x, y);
-		}
-	}
+	/// To ignore methods
+	template <class BB, class Method>
+	typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j, Method & m);
+
+	/** GetEntryCategory is specialized for BB classes that offer a local getEntry
 
+	   This includes SparseMatrix, SparseMatrixBase, Diagonal, ScalarMatrix.
+	   It could and should include many more.
+	 */
+	template<class BB> struct GetEntryCategory;
+
+/************************** internal forms **********************/
+	// For the general case apply() will be used.
+	template <class BB>
+	typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j, SolutionTags::Generic t);
 
-}
+	// Some BBs have a local getEntry method
+	template <class BB>
+	typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j, SolutionTags::Local t );
+
+} // LinBox
+
+#include "linbox/solutions/getentry.inl"
 
 #endif // __LINBOX_getentry_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/solutions/getentry.inl b/linbox/solutions/getentry.inl
new file mode 100644
index 0000000..5ff5474
--- /dev/null
+++ b/linbox/solutions/getentry.inl
@@ -0,0 +1,127 @@
+/* linbox/solutions/getentry.inl
+ * Copyright(C) LinBox
+ *  Evolved from an earlier one by Bradford Hovinen <hovinen at cis.udel.edu>
+ *  -bds
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_getentry_INL
+#define __LINBOX_getentry_INL
+
+#include <vector>
+
+#include "linbox/util/debug.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/blackbox/scalar-matrix.h"
+#include "linbox/blackbox/compose.h"
+#include "linbox/blackbox/diagonal.h"
+#include "linbox/solutions/methods.h"
+#include "linbox/solutions/solution-tags.h"
+#include "linbox/vector/blas-vector.h"
+
+namespace LinBox
+{
+
+	template <class BB>
+	typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j)
+	{
+		typename GetEntryCategory<BB>::Tag t;
+		return getEntry(x, A, i, j, t);
+	}
+
+	// General case category of BBs requires use of apply.
+	template<class BB> struct GetEntryCategory{ typedef SolutionTags::Generic Tag; };
+	// Look for local specializations of this in blackbox/*
+
+	// To ignore methods
+	template <class BB, class Method>
+	typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j, Method & m)
+	{
+		return getEntry(x, A, i, j);
+	}
+
+	// Generic BBs require use of apply.
+	template <class BB>
+	typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j, SolutionTags::Generic t)
+	{
+		typedef typename BB::Field Field;
+		typedef BlasVector<Field> Vector ;
+
+		const Field& F = A.field();
+		Vector v(F,A.coldim(), F.zero), w(F,A.rowdim(), F.zero);
+		F.assign(v[j],F.one); // use standard basis ?
+		A.apply (w, v);
+		return F.assign(x, w[i]);
+	}
+
+	// some BBs have their own.
+	template <class BB>
+	typename BB::Field::Element& getEntry(typename BB::Field::Element& x, const BB& A, const size_t i, const size_t j, SolutionTags::Local t )
+	{
+		return A.getEntry(x, i, j);
+	}
+
+	// Compose< Diagonal, BB > specialization
+	template <class Field, class Trait, class BB>
+	typename Field::Element& getEntry(typename Field::Element& x, const Compose<Diagonal<Field, Trait>, BB>& A, const size_t i, const size_t j)
+	{
+		typename Field::Element y;
+		getEntry(y, *(A.getLeftPtr()), i, i);
+		getEntry(x, *(A.getRightPtr()), i, j);
+		return A.field().mulin(x, y);
+	}
+
+	// Compose< BB, Diagonal > specialization
+	template <class BB, class Field, class Trait>
+	typename Field::Element& getEntry(typename Field::Element& x, const Compose<BB, Diagonal<Field, Trait> >& A, const size_t i, const size_t j)
+	{
+		typename Field::Element y;
+		getEntry(y, *(A.getLeftPtr()), i, j);
+		getEntry(x, *(A.getRightPtr()), j, j);
+		return A.field().mulin(x, y);
+	}
+
+	// Compose< Diagonal, Diagonal > specialization
+	template <class Field, class T1, class T2>
+	typename Field::Element& getEntry(typename Field::Element& x, const Compose<Diagonal<Field,T1>, Diagonal<Field, T2> >& A, const size_t i, const size_t j)
+	{
+		if (i != j) return A.field().assign(x, A.field().zero);
+        typename Field::Element y;
+        getEntry(y, *(A.getLeftPtr()), i, i);
+        getEntry(x, *(A.getRightPtr()), j, j);
+        return A.field().mulin(x, y);
+	}
+
+}
+
+#endif // __LINBOX_getentry_INL
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/solutions/is-positive-definite.h b/linbox/solutions/is-positive-definite.h
index 85d4557..eb1e001 100644
--- a/linbox/solutions/is-positive-definite.h
+++ b/linbox/solutions/is-positive-definite.h
@@ -80,11 +80,14 @@ namespace LinBox
 				 const RingCategories::IntegerTag          &tag,
 				 const Method::Hybrid& M)
 	{
-		// should try a modular minpoly and decide on the degree of that...
-		if (A.rowdim() != A.coldim()) return false;
-		// this crude size check can be refined
-		if (A.coldim() > 7000) return isPositiveDefinite(A, tag, Method::Blackbox(M));
-		else return isPositiveDefinite(A, tag, Method::Elimination(M));
+		//! @bug should try a modular minpoly and decide on the degree of that...
+		if (A.rowdim() != A.coldim())
+		       	return false;
+		//! @bug this crude size check can be refined
+		if (A.coldim() > 7000)
+		       	return isPositiveDefinite(A, tag, Method::Blackbox(M));
+		else
+		       	return isPositiveDefinite(A, tag, Method::Elimination(M));
 	}
 
 	// The isPositiveDefinite with Elimination Method
@@ -132,7 +135,7 @@ namespace LinBox
 	{
 		// call BlasElimination code
 		BlasMatrix<typename Blackbox::Field> DA(A.field(), A.rowdim(), A.coldim());
-		MatrixHom::map(DA, A, A. field());
+		MatrixHom::map(DA, A); //! @bug why map (same field)? This is a copy.
 		return Signature::isPosDef(DA, Signature::BLAS_LPM_Method() );
 	}
 
diff --git a/linbox/solutions/is-positive-semidefinite.h b/linbox/solutions/is-positive-semidefinite.h
index be0df0c..1ba35dd 100644
--- a/linbox/solutions/is-positive-semidefinite.h
+++ b/linbox/solutions/is-positive-semidefinite.h
@@ -37,10 +37,10 @@ namespace LinBox
 				     const DomainCategory  &tag,
 				     const isPositiveSemiDefiniteMethod  &M);
 
-	/** Compute the isPositiveSemiDefinite of A.
+	/** Determine if A is positive semidefinite.
 	 *
-	 * The isPositiveSemiDefinite of a linear operator A, represented as a
-	 * black box, is computed over the ring or field of A.
+	 * The positive semidefiniteness of a linear operator A, represented as a
+	 * black box, is computed over the ring or field (characteristic 0) of A.
 	 *
 	 * @param A Black box of which to compute the isPositiveSemiDefinite
 	 * @param M may be a Method::Hybrid (SemiDefault), Method::Blackbox, Method::Elimination, or of other method type.
@@ -133,7 +133,7 @@ namespace LinBox
 	{
 		// call BlasElimination code
 		BlasMatrix<typename Blackbox::Field> DA(A.field(), A.rowdim(), A.coldim());
-		MatrixHom::map(DA, A, A. field());
+		MatrixHom::map(DA, A); //! @warning this is a copy
 		return Signature::isPosSemiDef(DA, Signature::BLAS_LPM_Method() );
 	}
 
diff --git a/linbox/solutions/methods.h b/linbox/solutions/methods.h
index 8b4c0e1..e71aa31 100644
--- a/linbox/solutions/methods.h
+++ b/linbox/solutions/methods.h
@@ -59,6 +59,9 @@
 #include "linbox/util/mpicpp.h"
 #endif
 
+#ifndef LINBOX_USE_BLACKBOX_THRESHOLD
+#define LINBOX_USE_BLACKBOX_THRESHOLD 1000
+#endif
 
 namespace LinBox
 {
@@ -454,7 +457,7 @@ namespace LinBox
 	};
 
 
-	///
+	/// To select algorithms that use Giorgi' algorithms/block-massey-domain.h
 	struct BlockWiedemannTraits : public Specifier {
 		BlockWiedemannTraits ( Preconditioner Precond= NO_PRECONDITIONER,
 				       size_t         Rank   = RANK_UNKNOWN)
@@ -467,32 +470,61 @@ namespace LinBox
 		{}
 	};
 
+	/// To select algorithms that use Yuhasz' algorithms/coppersmith.h
+	struct CoppersmithTraits : public Specifier {
+		CoppersmithTraits ( Preconditioner Precond= NO_PRECONDITIONER,
+				       size_t         Rank   = RANK_UNKNOWN)
+		{
+			Specifier::_preconditioner = Precond;
+			Specifier::_rank           = Rank;
+		}
+		CoppersmithTraits( const Specifier& S) :
+		       	Specifier(S)
+		{}
+	};
+
 
 	//Using Wan's numeric/symbolic method to solve linear systems.
 	//based on a preprinted article, submitted to JSC 2004
-	struct WanTraits : public Specifier
+	struct NumSymNormTraits : public Specifier
 	{
-		WanTraits ( Preconditioner Precond= NO_PRECONDITIONER,
+		NumSymNormTraits ( Preconditioner Precond= NO_PRECONDITIONER,
 			    size_t         Rank   = RANK_UNKNOWN)
 		{
 			Specifier::_preconditioner = (Precond);
 			Specifier::_rank           = (Rank) ;
 		}
-		WanTraits( const Specifier& S) :
+		NumSymNormTraits( const Specifier& S) :
 		       	Specifier(S)
 	       	{}
 	};
 
-	//Using numerical methods to symbolically solve linear systems.
-	struct NumericalTraits : public Specifier
+	//Using Youse et al numerical/symbolic method to symbolically solve linear systems.
+	// This is like Wan's but replaces a norm condition with an overlap test
+	// to confirm valid numeric iteration steps.
+	struct NumSymOverlapTraits : public Specifier
 	{
-		NumericalTraits ( Preconditioner Precond= NO_PRECONDITIONER,
+		NumSymOverlapTraits ( Preconditioner Precond= NO_PRECONDITIONER,
 				  size_t         Rank   = RANK_UNKNOWN)
 		{
 			Specifier::_preconditioner = (Precond);
 			Specifier::_rank           = (Rank) ;
 		}
-		NumericalTraits( const Specifier& S) :
+		NumSymOverlapTraits( const Specifier& S) :
+		       	Specifier(S)
+	       	{}
+	};
+
+	//Use a numerical/symbolic method if it works.  If it fails, go to a dixon style method.
+	struct AdaptiveSolverTraits : public Specifier
+	{
+		AdaptiveSolverTraits ( Preconditioner Precond= NO_PRECONDITIONER,
+				  size_t         Rank   = RANK_UNKNOWN)
+		{
+			Specifier::_preconditioner = (Precond);
+			Specifier::_rank           = (Rank) ;
+		}
+		AdaptiveSolverTraits ( const Specifier& S) :
 		       	Specifier(S)
 	       	{}
 	};
@@ -569,6 +601,7 @@ namespace LinBox
 		IMLTraits ( const IMLNonSing & imlroutine, // routine 1
 			    bool withRNS = false) :
 			_computeRNS(withRNS),
+			_reduce(false),_nullcol(10),
 			_imlroutine(1)
 		{
 			singular(NONSINGULAR);
@@ -586,6 +619,7 @@ namespace LinBox
 			    bool certify            = DONT_CERTIFY,
 			    bool reduce             = false ,
 			    unsigned int nullcolred = 10  /* IML default */) :
+			_computeRNS(false),
 			_reduce(reduce),
 			_nullcol(nullcolred),
 			_imlroutine(2)
@@ -615,11 +649,14 @@ namespace LinBox
 		typedef CRATraits                CRA ;                    //!< Use CRA for solving Integer systems.
 		typedef WiedemannTraits		 Wiedemann;               //!< Method::Wiedemann : no doc
 		typedef WiedemannExtensionTraits ExtensionWiedemann;      //!< Method::ExtensionWiedemann :  no doc
+		typedef BlockWiedemannTraits		 BlockWiedemann;  //!< Method::BlockWiedemann : no doc
+		typedef CoppersmithTraits		 Coppersmith;         //!< Method::Coppersmith : no doc
 		typedef LanczosTraits		 Lanczos;                 //!< Method::Lanczos : no doc.
 		typedef BlockLanczosTraits	 BlockLanczos;            //!< Method::BlockLanczos : no doc.
 		typedef SparseEliminationTraits	 SparseElimination;       //!< Method::SparseElimination : no doc
-		typedef NumericalTraits		 Numerical;               //!< Method::Numerical : no doc.
-		typedef WanTraits		 NumericalWan;            //!< Method::Numerical : no doc.
+		typedef NumSymOverlapTraits		 NumSymOverlap;               //!< Method::NumSymOverlap : Use Youse's overlap-based numeric/symbolic iteration for Rational solving of dense integer systems
+		typedef NumSymNormTraits		 NumSymNorm;            //!< Method::NumSymNorm : Use Wan's (older) norm-based numeric/symbolic iteration for Rational solving of dense integer systems
+		typedef AdaptiveSolverTraits		 Adaptive;            //!< Method::Adaptive: Use NumSymOverlap if it works.  If it fails, switch to IML probably.
 		typedef BlasEliminationTraits 	 BlasElimination;         //!< Method::BlasElimination : no doc
 		typedef BlasExtensionTraits      ExtensionBlasElimination;//!< Method::ExtensionBlasElimination : no doc
 		typedef NonBlasEliminationTraits NonBlasElimination;      //!< Method::NonBlasElimination : no doc.
@@ -646,15 +683,15 @@ namespace LinBox
 	template<class BB>
 	bool useBB(const BB& A)
 	{
-		return (A.coldim() > 1000) && (A.rowdim() > 1000);
+		return (A.coldim() > LINBOX_USE_BLACKBOX_THRESHOLD) && (A.rowdim() > LINBOX_USE_BLACKBOX_THRESHOLD);
 	}
 
 
-	template<class _Field>
+	template<class _Field, class _Rep>
 	class BlasMatrix ; // forward declaration...
 
-	template<class Field>
-	bool useBB(const BlasMatrix<Field>& A) { return false; }
+	template<class Field, class _Rep>
+	bool useBB(const BlasMatrix<Field,_Rep>& A) { return false; }
 
 
 	/** Solver traits.
@@ -709,11 +746,10 @@ namespace LinBox
 #endif // __LINBOX_method_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/solutions/minpoly.h b/linbox/solutions/minpoly.h
index 0a0993a..37c1a68 100644
--- a/linbox/solutions/minpoly.h
+++ b/linbox/solutions/minpoly.h
@@ -32,7 +32,7 @@
 
 #include "linbox/blackbox/squarize.h"
 
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
 #include "linbox/algorithms/wiedemann.h"
 
 #ifdef __LINBOX_HAVE_MPI
@@ -170,7 +170,9 @@ namespace LinBox
 		if (M.certificate()) {
 			// Will make a word size extension
 			// when field size is too small
-			return minpoly(P, A, tag, Method::ExtensionWiedemann (M));
+			//return minpoly(P, A, tag, Method::ExtensionWiedemann (M));
+			minpoly(P, A, tag, Method::ExtensionWiedemann (M));
+			return P;
 		}
 		else
 			return minpoly(P, A, tag, Method::Wiedemann (M));
@@ -184,7 +186,7 @@ namespace LinBox
 // Chinese Remaindering generic wrappers for integer minpoly
 // ---------------------------------------------------------
 
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 #include "linbox/algorithms/cra-domain.h"
 #include "linbox/randiter/random-prime.h"
 #include "linbox/algorithms/matrix-hom.h"
@@ -239,14 +241,14 @@ namespace LinBox
 		commentator().start ("Integer Minpoly", "Iminpoly");
 #endif
 		// 0.7213475205 is an upper approximation of 1/(2log(2))
-		RandomPrimeIterator genprime( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
+		RandomPrimeIterator genprime((uint32_t) (26-(int)ceil(log((double)A.rowdim())*0.7213475205)));
 		IntegerModularMinpoly<Blackbox,MyMethod> iteration(A, M);
 		std::vector<integer> PP; // use of integer due to non genericity of cra. PG 2005-08-04
 #ifdef __LINBOX_HAVE_MPI
-		MPIChineseRemainder< EarlyMultipCRA<Modular<double> > > cra(3UL, c);
+		MPIChineseRemainder< EarlyMultipCRA<Givaro::Modular<double> > > cra(3UL, c);
 		cra(PP, iteration, genprime);
 #else
-		ChineseRemainder< EarlyMultipCRA<Modular<double> > > cra(3UL);
+		ChineseRemainder< EarlyMultipCRA<Givaro::Modular<double> > > cra(3UL);
 		cra(PP, iteration, genprime);
 #endif
 		size_t i =0;
@@ -269,8 +271,8 @@ namespace LinBox
 	{
 		commentator().start ("Rational Minpoly", "Rminpoly");
 
-		RandomPrimeIterator genprime( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
-		RationalRemainder2< VarPrecEarlyMultipCRA<Modular<double> > > rra(3UL);
+		RandomPrimeIterator genprime((uint32_t)( 26-(int)ceil(log((double)A.rowdim())*0.7213475205)));
+		RationalRemainder2< VarPrecEarlyMultipCRA<Givaro::Modular<double> > > rra(3UL);
 		IntegerModularMinpoly<Blackbox,MyMethod> iteration(A, M);
 
 		std::vector<Integer> PP; // use of integer due to non genericity of cra. PG 2005-08-04
@@ -302,11 +304,10 @@ namespace LinBox
 #endif // __LINBOX_minpoly_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/solutions/nullspace.h b/linbox/solutions/nullspace.h
index 43df301..fc7ccbf 100644
--- a/linbox/solutions/nullspace.h
+++ b/linbox/solutions/nullspace.h
@@ -1,5 +1,5 @@
 /* Copyright (C) 2009 LinBox
- * Written by <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  *
  *
  *
diff --git a/linbox/solutions/rank.h b/linbox/solutions/rank.h
index c40addb..082a63f 100644
--- a/linbox/solutions/rank.h
+++ b/linbox/solutions/rank.h
@@ -1,20 +1,20 @@
 /* linbox/solutions/rank.h
  * Copyright(C) LinBox
  * ------------------------------------
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -25,28 +25,26 @@
 #ifndef __LINBOX_rank_H
 #define __LINBOX_rank_H
 
-//#include "linbox-config.h"
-#include "linbox/field/modular.h"
+//#include "linbox/linbox-config.h"
+#include "linbox/ring/modular.h"
 #include "linbox/randiter/random-prime.h"
 #include "linbox/algorithms/matrix-hom.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/blackbox/diagonal.h"
 #include "linbox/blackbox/diagonal-gf2.h"
 #include "linbox/blackbox/compose.h"
-#include "linbox/blackbox/permutation.h"
 #include "linbox/blackbox/transpose.h"
+#include "linbox/blackbox/butterfly.h"
 #include "linbox/algorithms/blackbox-container-symmetrize.h"
 #include "linbox/algorithms/blackbox-container-symmetric.h"
 #include "linbox/algorithms/blackbox-container.h"
 #include "linbox/algorithms/massey-domain.h"
 #include "linbox/algorithms/gauss.h"
 #include "linbox/algorithms/gauss-gf2.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
 #include "linbox/algorithms/whisart_trace.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/switch/cekstv.h"
-#include "linbox/blackbox/butterfly.h"
-
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrixdomain/blas-matrix-domain.h"
 
 #include "linbox/vector/vector-traits.h"
 #include "linbox/solutions/trace.h"
@@ -69,30 +67,17 @@ namespace LinBox
 	 * For small or dense matrices BlasElimination will be faster.
 	 * \param[out] r  output rank of A.
 	 * \param[in]  A linear transform, member of any blackbox class.
-	 * \param[in]  M may be a \p Method::Wiedemann (the default), a \p Method::BlasElimination, or a \p Method::SparseElimination..
+	 * \param[in]  M may be a \p Method::Hybrid (the default), a \p Method::Wiedemann, a  \p Method::BlasElimination, or a \p Method::SparseElimination..
 	 * \param      tag UNDOC
 	 * \return a reference to r.
 	 */
 	template <class Blackbox, class Method, class DomainCategory>
-	inline unsigned long &rank (unsigned long                   &r,
-				    const Blackbox                  &A,
-				    const DomainCategory          &tag,
-				    const Method                   &M);
-
-	// error hanlder for rational domain
-	template <class Blackbox, class Method>
-	inline unsigned long &rank (unsigned long                           &r,
-				    const Blackbox                          &A,
-				    const RingCategories::RationalTag     &tag,
-				    const Method                           &M)
-	{
-		commentator().start ("Rational Rank", "Rrank");
-		// Same mapping as the integer one
-		rank(r, A, RingCategories::IntegerTag(), M);
-		commentator().stop ("done", NULL, "Rrank");
-		return r;
-	}
+	inline unsigned long &rank (unsigned long &r, const Blackbox &A, 
+			const DomainCategory &tag, const Method &M);
 
+	template <class Blackbox, class Method, class DomainCategory>
+	inline unsigned long &rankin (unsigned long &r, const Blackbox &A, 
+			const DomainCategory &tag, const Method &M);
 
 	/**
 	 * Compute the rank of a linear transform A over a field.
@@ -104,78 +89,11 @@ namespace LinBox
 	 * \return     \p r rank of \p A.
 	  */
 	template <class Blackbox>
-	inline unsigned long &rank (unsigned long                   &r,
-				    const Blackbox                  &A)
+	inline unsigned long &rank (unsigned long &r, const Blackbox &A)
 	{
 		return rank(r, A, typename FieldTraits<typename Blackbox::Field>::categoryTag(), Method::Hybrid());
 	}
 
-	/** Rank of \p A.
-	 * \p A may be modified
-	 * @param A matrix
-	 * @param r rank
-	*/
-	template <class Matrix>
-	inline unsigned long &rankin (unsigned long                   &r,
-				      Matrix                          &A)
-	{
-		return rankin(r, A, typename FieldTraits<typename Matrix::Field>::categoryTag(), Method::Elimination());
-	}
-
-	template <class Blackbox>
-	inline unsigned long &rank (unsigned long                    &r,
-				    const Blackbox                   &A,
-				    const RingCategories::ModularTag &tag,
-				    const Method::Hybrid             &m)
-	{ // this should become a BB/Blas hybrid in the style of Duran/Saunders/Wan.
-		if (useBB(A)) return rank(r, A, tag, Method::Blackbox(m ));
-		else return rank(r, A, tag, Method::Elimination( m ));
-	}
-
-	template <class Blackbox>
-	inline unsigned long &rank (unsigned long                     &r,
-				    const Blackbox                    &A,
-				    const RingCategories::ModularTag  &tag,
-				    const Method::Elimination         &m)
-	{
-		typedef typename Blackbox::Field Field;
-		const Field& F = A.field();
-		integer a, b; F.characteristic(a); F.cardinality(b);
-		if (a == b && a < LinBox::BlasBound)
-			return rank(r, A, tag, Method::BlasElimination(m));
-		else
-			return rank(r, A, tag, Method::NonBlasElimination( m ));
-	}
-
-
-	template <class Field, class Vector>
-	inline unsigned long &rank (unsigned long                      &r,
-				    const SparseMatrix<Field, Vector>  &A,
-				    const RingCategories::ModularTag   &tag,
-				    const Method::Elimination          &m)
-	{
-		return rank(r, A, tag, Method::SparseElimination(m));
-	}
-
-
-	// specialization of NonBlas for SparseMatrix
-	template <class Blackbox>
-	inline unsigned long &rank (unsigned long                       &r,
-				    const Blackbox                      &A,
-				    const   RingCategories::ModularTag  &tag,
-				    const Method::NonBlasElimination    & m)
-	{
-		return rank(r, A, tag, Method::SparseElimination(m));
-	}
-
-
-	template <class Blackbox>
-	inline unsigned long &rank (unsigned long                     &r,
-				    const Blackbox                    &A,
-				    const  RingCategories::ModularTag &tag,
-				    const Method::Blackbox            &m);
-
-
 	/**
 	 * Compute the rank of a linear transform A over a field.
 	 * \ingroup solutions
@@ -188,536 +106,37 @@ namespace LinBox
 	 * @param M method (see ???)
 	 */
 	template <class Blackbox, class Method>
-	inline unsigned long &rank (unsigned long                   &r,
-				    const Blackbox                  &A,
-				    const Method    &M)
-	{  return rank(r, A, typename FieldTraits<typename Blackbox::Field>::categoryTag(), M);
-	}
-
-	/// M may be <code>Method::Wiedemann()</code>.
-	template <class Blackbox>
-	inline unsigned long &rank (unsigned long                     &res,
-				    const Blackbox                    &A,
-				    const RingCategories::ModularTag  &tag,
-				    const Method::Wiedemann           &M)
-	// This is too much for solutions.  It belongs in algorithms
+	inline unsigned long &rank (unsigned long &r, const Blackbox &A,
+				    const Method &M)
 	{
-
-		typedef typename Blackbox::Field Field;
-		const Field F = A.field();
-		typename Field::RandIter iter (F);
-
-		if (M.symmetric()) {
-			commentator().start ("Symmetric Rank", "srank");
-
-
-			std::vector<typename Field::Element> d1;
-			size_t i;
-
-			VectorWrapper::ensureDim (d1, A.coldim ());
-
-			for (i = 0; i < A.coldim (); i++)
-				do iter.random (d1[i]); while (F.isZero (d1[i]));
-
-
-			typedef Compose<Compose<Diagonal<Field>,Blackbox >, Diagonal<Field> > BlackBox1;
-			Diagonal<Field> D0 (F, d1);
-			Compose<Diagonal<Field>,Blackbox > B0 (&D0, &A);
-			BlackBox1 B (&B0, &D0);
-
-			BlackboxContainerSymmetric<Field, BlackBox1> TF (&B, F, iter);
-			MasseyDomain<Field, BlackboxContainerSymmetric<Field, BlackBox1> > WD (&TF, M.earlyTermThreshold ());
-			std::vector<typename Field::Element> phi;
-			WD.pseudo_minpoly (phi, res);
-			commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Pseudo Minpoly degree: " << res << std::endl;
-
-			commentator().start ("Monte Carlo certification (1)", "trace");
-			typename Field::Element t, p2; F.init(p2, 0UL);
-			trace(t, B);
-			if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
-
-			int nbperm = 0; unsigned long rk;
-			int logn = (int)(2*(unsigned long)floor( log( (double)A.rowdim() ) ));
-			bool tryagain = (! F.areEqual( t, p2 ));
-			while( tryagain ) {
-				commentator().stop ("fail", NULL, "trace");
-#if 0
-
-				Permutation<Field> P(A.rowdim(), F);
-				for (i = 0; i < A.rowdim (); ++i)
-					P.permute( rand() % A.rowdim() , rand() % A.rowdim() );
-				for (i = 0; i < A.rowdim (); ++i)
-					P.permute( rand() % A.rowdim() , rand() % A.rowdim() );
-
-				Transpose< Permutation<Field> > TP(&P);
-				typedef Compose< Permutation<Field>, Blackbox > BlackboxP;
-				typedef Compose< Compose< Permutation<Field>, Blackbox >, Transpose< Permutation<Field> > > BlackboxPAP;
-				BlackboxP PA(&P, &A);
-				BlackboxPAP BP( &PA , &TP );
-
-				for (i = 0; i < A.coldim (); i++)
-					do iter.random (d1[i]); while (F.isZero (d1[i]));
-				Diagonal<Field> D1 (F, d1);
-				Compose<Diagonal<Field>,BlackboxPAP > B1 (&D1, &BP);
-				typedef Compose<Compose<Diagonal<Field>,BlackboxPAP >, Diagonal<Field> > BlackBox2;
-				BlackBox2 B (&B1, &D1);
-#endif
-
-				for (i = 0; i < A.coldim (); i++)
-					do iter.random (d1[i]); while (F.isZero (d1[i]));
-				Diagonal<Field> D1 (F, d1);
-				Compose<Diagonal<Field>,Blackbox > B1 (&D1, &A);
-				BlackBox1 B2 (&B1, &D1);
-
-				BlackboxContainerSymmetric<Field, BlackBox1> TF1 (&B2, F, iter);
-				MasseyDomain<Field, BlackboxContainerSymmetric<Field, BlackBox1> > WD1 (&TF1, M.earlyTermThreshold ());
-
-				WD1.pseudo_minpoly (phi, rk);
-				commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Permuted pseudo Minpoly degree: " << res << std::endl;
-				commentator().start ("Monte Carlo certification (2)", "trace");
-				if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
-
-				trace(t, B2);
-
-				tryagain = (! F.areEqual( t, p2 ));
-				if (res > rk)
-					tryagain = true;
-				else
-					res = rk;
-				if( ++nbperm > logn) break;
-			}
-			commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "symm permutations : " << nbperm << std::endl;
-			nbperm = 0;
-			while(tryagain) {
-				commentator().stop ("fail", NULL, "trace");
-				//             F.write( F.write( commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION)
-				//                               << "end trace: ", t) << ", p2: ", p2) << std::endl;
-				typename Field::RandIter r (F);
-				typename CekstvSwitch<Field>::Factory factory (r);
-				typedef Butterfly<Field, CekstvSwitch<Field> > ButterflyP;
-				ButterflyP P (F, A.rowdim(), factory);
-				for (i = 0; i < A.coldim (); i++)
-					do iter.random (d1[i]); while (F.isZero (d1[i]));
-				Diagonal<Field> D1 (F, d1);
-				typedef Compose< ButterflyP, Diagonal<Field> > ButD;
-				ButD PD(&P, &D1);
-
-				Transpose< ButD > TP (&PD);
-
-				Compose< ButD, Blackbox > B1( &PD, &A);
-
-				typedef Compose< Compose< ButD, Blackbox > , Transpose< ButD > > BlackBoxBAB;
-				BlackBoxBAB PAP(&B1, &TP);
-
-				BlackboxContainerSymmetric<Field, BlackBoxBAB> TF1 (&PAP, F, iter);
-				MasseyDomain<Field, BlackboxContainerSymmetric<Field, BlackBoxBAB> > WD1 (&TF1, M.earlyTermThreshold ());
-
-				WD1.pseudo_minpoly (phi, rk);
-				commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Butterfly pseudo Minpoly degree: " << res << std::endl;
-				commentator().start ("Monte Carlo certification (3)", "trace");
-				if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
-
-				trace(t, PAP);
-
-				tryagain = (! F.areEqual( t, p2 ));
-				if (res > rk)
-					tryagain = true;
-				else
-					res = rk;
-				++nbperm;
-			}
-
-			// F.write( F.write( commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION)
-			//              << "end trace: ", t) << ", p2: ", p2) << std::endl;
-
-			commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "butterflies : " << nbperm << std::endl;
-
-			commentator().stop ("success", NULL, "trace");
-			commentator().stop ("done", NULL, "srank");
-
-			return res;
-		}
-		else {
-
-			commentator().start ("Rank", "wrank");
-
-			std::vector<typename Field::Element> d1, d2;
-			size_t i;
-
-			VectorWrapper::ensureDim (d1, A.coldim ());
-			VectorWrapper::ensureDim (d2, A.rowdim ());
-
-			for (i = 0; i < A.coldim (); i++)
-				do iter.random (d1[i]); while (F.isZero (d1[i]));
-
-			for (i = 0; i < A.rowdim (); i++)
-				do iter.random (d2[i]); while (F.isZero (d2[i]));
-
-			Diagonal<Field> D1_i (F, d1), D2_i (F, d2);
-			Transpose<Blackbox> AT_i (&A);
-
-			Compose<Diagonal<Field>,Transpose<Blackbox> > B1_i (&D1_i, &AT_i);
-			Compose<Compose<Diagonal<Field>,Transpose<Blackbox> >, Diagonal<Field> > B2_i (&B1_i, &D2_i);
-			Compose<Compose<Compose<Diagonal<Field>,Transpose<Blackbox> >, Diagonal<Field> >, Blackbox> B3_i (&B2_i, &A);
-			// Here there is an extra diagonal computation
-			// The probability of success is also divided by two, as
-			// D2_i^2 contains only squares and squares are half the total elements
-			typedef Compose<Compose<Compose<Compose<Diagonal<Field>,Transpose<Blackbox> >, Diagonal<Field> >, Blackbox>, Diagonal<Field> > Blackbox0;
-			Blackbox0 B_i (&B3_i, &D1_i);
-
-			BlackboxContainerSymmetric<Field, Blackbox0> TF_i (&B_i, F, iter);
-			MasseyDomain<Field, BlackboxContainerSymmetric<Field, Blackbox0> > WD (&TF_i, M.earlyTermThreshold ());
-
-			std::vector<typename Field::Element> phi;
-			WD.pseudo_minpoly (phi, res);
-			commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Pseudo Minpoly degree: " << res << std::endl;
-			commentator().start ("Monte Carlo certification (4)", "trace");
-
-			typename Field::Element t, p2; F.init(p2, 0UL);
-			//             trace(t, B_i);
-			WhisartTraceTranspose(t, F, D1_i, A, D2_i);
-			if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
-
-			int nbperm = 0; unsigned long rk;
-			int logn = (int)(2*(unsigned long)floor( log( (double)A.rowdim() ) ));
-			bool tryagain = (! F.areEqual( t, p2 ));
-			while( tryagain ) {
-				commentator().stop ("fail", NULL, "trace");
-				Permutation<Field> P((int)A.rowdim(), F);
-				for (i = 0; i < A.rowdim (); ++i)
-					P.permute( rand() % A.rowdim() , rand() % A.rowdim() );
-				for (i = 0; i < A.rowdim (); ++i)
-					P.permute( rand() % A.rowdim() , rand() % A.rowdim() );
-
-				typedef Compose< Permutation<Field>, Blackbox > BlackboxP;
-				BlackboxP BP(&P, &A);
-
-				for (i = 0; i < A.coldim (); i++)
-					do iter.random (d1[i]); while (F.isZero (d1[i]));
-
-				for (i = 0; i < A.rowdim (); i++)
-					do iter.random (d2[i]); while (F.isZero (d2[i]));
-
-				Diagonal<Field> D1 (F, d1), D2 (F, d2);
-				Transpose<BlackboxP> AT (&BP);
-
-				Compose<Diagonal<Field>,Transpose<BlackboxP> > B1 (&D1, &AT);
-				Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> > B2 (&B1, &D2);
-				Compose<Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> >, BlackboxP> B3 (&B2, &BP);
-				typedef Compose<Compose<Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> >, BlackboxP>, Diagonal<Field> > Blackbox1;
-				Blackbox1 B (&B3, &D1);
-
-				BlackboxContainerSymmetric<Field, Blackbox1> TF (&B, F, iter);
-				MasseyDomain<Field, BlackboxContainerSymmetric<Field, Blackbox1> > MD (&TF, M.earlyTermThreshold ());
-
-				MD.pseudo_minpoly (phi, rk);
-				commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Permuted pseudo Minpoly degree: " << rk << std::endl;
-				commentator().start ("Monte Carlo certification (5)", "trace");
-				if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
-
-				//                 trace(t, B);
-				WhisartTraceTranspose(t, F, D1, BP, D2);
-				tryagain = (! F.areEqual( t, p2 ));
-				if (res > rk)
-					tryagain = true;
-				else
-					res = rk;
-				if( ++nbperm > logn) break;
-			}
-			commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "permutations : " << nbperm << std::endl;
-			nbperm = 0;
-			while(tryagain) {
-				commentator().stop ("fail", NULL, "trace");
-				typename Field::RandIter r (F);
-				typename CekstvSwitch<Field>::Factory factory (r);
-				typedef Butterfly<Field, CekstvSwitch<Field> > ButterflyP;
-				ButterflyP P (F, A.rowdim(), factory);
-
-				typedef Compose< ButterflyP, Blackbox > BlackboxP;
-				BlackboxP BP(&P, &A);
-
-				for (i = 0; i < A.coldim (); i++)
-					do iter.random (d1[i]); while (F.isZero (d1[i]));
-
-				for (i = 0; i < A.rowdim (); i++)
-					do iter.random (d2[i]); while (F.isZero (d2[i]));
-
-				Diagonal<Field> D1 (F, d1), D2 (F, d2);
-				Transpose<BlackboxP> AT (&BP);
-
-				Compose<Diagonal<Field>,Transpose<BlackboxP> > B1 (&D1, &AT);
-				Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> > B2 (&B1, &D2);
-				Compose<Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> >, BlackboxP> B3 (&B2, &BP);
-				typedef Compose<Compose<Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> >, BlackboxP>, Diagonal<Field> > Blackbox1;
-				Blackbox1 B (&B3, &D1);
-
-				BlackboxContainerSymmetric<Field, Blackbox1> TF (&B, F, iter);
-				MasseyDomain<Field, BlackboxContainerSymmetric<Field, Blackbox1> > MD (&TF, M.earlyTermThreshold ());
-
-				MD.pseudo_minpoly (phi, rk);
-				commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Butterfly pseudo Minpoly degree: " << rk << std::endl;
-				commentator().start ("Monte Carlo certification (6)", "trace");
-				if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
-
-				//                 trace(t, B);
-				WhisartTraceTranspose(t, F, D1, BP, D2);
-				tryagain = (! F.areEqual( t, p2 ));
-				if (res > rk)
-					tryagain = true;
-				else
-					res = rk;
-				++nbperm;
-			}
-			commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "butterflies : " << nbperm << std::endl;
-			commentator().stop ("success", NULL, "trace");
-			commentator().stop ("done", NULL, "wrank");
-
-			return res;
-		}
-
-	}
-
-	/// M may be <code>Method::SparseElimination()</code>.
-	template <class Field>
-	inline unsigned long &rank (unsigned long                       &r,
-				    const SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq>  &A,
-				    const RingCategories::ModularTag    &tag,
-				    const Method::SparseElimination     &M)
-	{
-		// We make a copy as these data will be destroyed
-		SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq> A1 (A);
-		return rankin(r, A1, tag, M);
-	}
-
-	template <class Field, class Method>
-	inline unsigned long &rankin (unsigned long                   &r,
-				      SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq>  &A,
-				      const Method                    &M)
-	{
-		return rankin(r, A, typename FieldTraits<Field>::categoryTag(), M);
-	}
-
-
-	template <class Blackbox, class Ring>
-	inline unsigned long &rankin (unsigned long                       &r,
-				      Blackbox                            &A,
-				      const RingCategories::IntegerTag    &tag,
-				      const Method::SparseElimination     &M)
-	{
-		commentator().start ("Integer Rank inplace", "irank");
-		typedef Modular<double> Field;
-		integer mmodulus;
-		FieldTraits<Field>::maxModulus(mmodulus);
-		RandomPrimeIterator genprime( (long) floor (log((double)mmodulus) ) );
-		++genprime;
-		typedef typename Blackbox::template rebind< Field >::other FBlackbox;
-		Field Fp(*genprime);
-		FBlackbox Ap(A, Fp);
-		commentator().report (Commentator::LEVEL_ALWAYS,INTERNAL_WARNING) << "Integer Rank is done modulo " << *genprime << std::endl;
-		rankin(r, Ap, RingCategories::ModularTag(), M);
-		commentator().stop ("done", NULL, "irank");
-		return r;
-	}
-
-	template <class Field>
-	inline unsigned long &rankin (unsigned long                       &r,
-				      SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq>  &A,
-				      const RingCategories::ModularTag    &tag,
-				      const Method::SparseElimination     &M)
-	{
-		commentator().start ("Sparse Elimination Rank", "serank");
-		GaussDomain<Field> GD ( A.field() );
-		GD.rankin (r, A, M.strategy ());
-		commentator().stop ("done", NULL, "serank");
-		return r;
-	}
-
-	/// specialization to \f$ \mathbf{F}_2 \f$
-	inline unsigned long &rankin (unsigned long                       &r,
-				      GaussDomain<GF2>::Matrix            &A,
-				      const Method::SparseElimination     &)//M
-	{
-		commentator().start ("Sparse Elimination Rank over GF2", "serankmod2");
-		GaussDomain<GF2> GD ( A.field() );
-		GD.rankin (r, A, Specifier::PIVOT_LINEAR);
-		commentator().stop ("done", NULL, "serankmod2");
-		return r;
+		return rank(r, A, typename FieldTraits<typename Blackbox::Field>::categoryTag(), M);
 	}
 
-	/// specialization to \f$ \mathbf{F}_2 \f$
-	inline unsigned long &rankin (unsigned long                       &r,
-				      GaussDomain<GF2>::Matrix            &A,
-				      const RingCategories::ModularTag    &,//tag
-				      const Method::SparseElimination     &M)
-	{
-		return rankin(r, A, M);
-	}
-
-	// Change of representation to be able to call the sparse elimination
-	template <class Blackbox>
-	inline unsigned long &rank (unsigned long                       &r,
-				    const Blackbox                      &A,
-				    const RingCategories::ModularTag    &tag,
-				    const Method::SparseElimination     &M)
-	{
-		typedef typename Blackbox::Field Field;
-		typedef SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq> SparseBB;
-		SparseBB SpA(A.field(), A.rowdim(), A.coldim() );
-		MatrixHom::map(SpA, A, A.field());
-		return rankin(r, SpA, tag, M);
-	}
-
-	// M may be <code>Method::BlasElimination()</code>.
+	/** Rank of \p A.
+	 * \p A may be modified
+	 * @param A matrix
+	 * @param r rank
+	*/
 	template <class Blackbox>
-	inline unsigned long &rank (unsigned long                      &r,
-				    const Blackbox                     &A,
-				    const RingCategories::ModularTag   &tag,
-				    const Method::BlasElimination      &M)
+	inline unsigned long &rankin (unsigned long &r, Blackbox &A)
 	{
-
-		commentator().start ("Blas Rank", "blasrank");
-		typedef typename Blackbox::Field Field;
-		const Field F = A.field();
-		integer a, b; F.characteristic(a); F.cardinality(b);
-		linbox_check( a == b );
-		linbox_check( a < LinBox::BlasBound);
-		BlasMatrix<Field> B(A);
-		BlasMatrixDomain<Field> D(F);
-		r = D.rank(B);
-		commentator().stop ("done", NULL, "blasrank");
-		return r;
+		//! @bug there is no Elimination() method there.
+		return rankin(r, A, typename FieldTraits<typename Blackbox::Field>::categoryTag(), Method::SparseElimination());
 	}
 
 
-	// is this used?
-	// A is modified.
-	template <class Matrix>
-	inline unsigned long &rankin (unsigned long                      &r,
-				      Matrix                             &A,
-				      const RingCategories::ModularTag   &tag,
-				      const Method::SparseElimination    &M)
-	{
-		typedef typename Matrix::Field Field;
-		const Field F = A.field();
-		GaussDomain<Field> GD (F);
-		GD.rankin( r, A, M.strategy ());
-		return r;
-	}
-
-	/// A is modified.
-	template <class Field>
-	inline unsigned long &rankin (unsigned long                     &r,
-				      BlasMatrix<Field>               &A,
-				      const RingCategories::ModularTag  &tag,
-				      const Method::BlasElimination     &M)
-	{
-
-		commentator().start ("BlasBB Rank", "blasbbrank");
-		const Field F = A.field();
-		BlasMatrixDomain<Field> D(F);
-		r = D.rankin(static_cast< BlasMatrix<Field>& >(A));
-		commentator().stop ("done", NULL, "blasbbrank");
-		return r;
-	}
 
-	template <class Blackbox, class MyMethod>
-	inline unsigned long &rank (unsigned long                     &r,
-				    const Blackbox                    &A,
-				    const RingCategories::IntegerTag  &tag,
-				    const MyMethod                    &M)
-	{
-		commentator().start ("Integer Rank", "iirank");
-		typedef Modular<double> Field;
-		integer mmodulus;
-		FieldTraits<Field>::maxModulus(mmodulus);
-		RandomPrimeIterator genprime( (unsigned) floor (log((double)mmodulus) ) );
-		++genprime;
-		typedef typename Blackbox::template rebind< Field >::other FBlackbox;
-		Field Fp(*genprime);
-		FBlackbox Ap(A, Fp );
-		commentator().report (Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Integer Rank is done modulo " << *genprime << std::endl;
-
-		rank(r, Ap, RingCategories::ModularTag(), M);
-		commentator().stop ("done", NULL, "iirank");
-		return r;
-	}
 } // LinBox
 
-
-#ifdef __LINBOX_HAVE_GIVARO
-#ifndef LINBOX_EXTENSION_DEGREE_MAX
-#define LINBOX_EXTENSION_DEGREE_MAX 19
-#endif
-
-#include "linbox/field/givaro.h"
-namespace LinBox
-{
-	template <class Blackbox>
-	inline unsigned long &rank (unsigned long                     &r,
-				    const Blackbox                    &A,
-				    const RingCategories::ModularTag  &tag,
-				    const Method::Blackbox            & m)
-	{
-		commentator().start ("BB Rank", "extend");
-		if (m.certificate()) {
-			typedef typename Blackbox::Field Field;
-			const Field& F = A.field();
-			integer a,c; F.cardinality(a); F.characteristic(c);
-			if (a != c) {
-				unsigned long extend = (unsigned long)Givaro::FF_EXPONENT_MAX(a,(integer)LINBOX_EXTENSION_DEGREE_MAX);
-				if (extend > 1) {
-					commentator().report (Commentator::LEVEL_ALWAYS,INTERNAL_WARNING) << "Extension of degree " << extend << std::endl;
-					GivaroExtension<Field> EF( F, extend);
-					typedef typename Blackbox::template rebind< GivaroExtension<Field>  >::other FBlackbox;
-					FBlackbox Ap(A, EF);
-					rank(r, Ap, tag, Method::Wiedemann(m));
-				}
-				else
-					rank(r, A, tag, Method::Wiedemann(m));
-			}
-			else {
-				unsigned long extend = (unsigned long)Givaro::FF_EXPONENT_MAX(c,(integer)LINBOX_EXTENSION_DEGREE_MAX);
-				if (extend > 1) {
-					commentator().report (Commentator::LEVEL_ALWAYS,INTERNAL_WARNING) << "Word size extension : " << extend << std::endl;
-					GivaroGfq EF( (unsigned long)c, extend);
-					typedef typename Blackbox::template rebind< GivaroGfq >::other FBlackbox;
-					FBlackbox Ap(A, EF);
-					rank(r, Ap, tag, Method::Wiedemann(m));
-				}
-				else
-					rank(r, A, tag, Method::Wiedemann(m));
-			}
-		}
-		else
-			rank(r, A, tag, Method::Wiedemann(m));
-		commentator().stop ("done", NULL, "extend");
-		return r;
-	}
-}
-#else
-namespace LinBox
-{
-	template <class Blackbox>
-	inline unsigned long &rank (unsigned long                      &r,
-				    const Blackbox                     &A,
-				    const  RingCategories::ModularTag  &tag,
-				    const Method::Blackbox             & m)
-	{
-		return rank(r, A, tag, Method::Wiedemann(m));
-	}
-}
-#endif
-
-
+#include "linbox/solutions/rank.inl"
 
 #endif // __LINBOX_rank_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/solutions/rank.inl b/linbox/solutions/rank.inl
new file mode 100755
index 0000000..fad66a8
--- /dev/null
+++ b/linbox/solutions/rank.inl
@@ -0,0 +1,652 @@
+/* linbox/solutions/rank.inl
+ * Copyright(C) LinBox
+ * ------------------------------------
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_rank_INL
+#define __LINBOX_rank_INL
+
+#define __LINBOX_rank_sparse_elimination_format SparseMatrixFormat::SparseSeq
+// #define __LINBOX_rank_sparse_elimination_format SparseMatrixFormat::SparseMar
+// #define __LINBOX_rank_sparse_elimination_format SparseMatrixFormat::SparsePar
+// #define __LINBOX_rank_sparse_elimination_format SparseMatrixFormat::COO
+// #define __LINBOX_rank_sparse_elimination_format SparseMatrixFormat::CSR
+
+#include "linbox/field/field-traits.h"
+
+#include <givaro/extension.h>
+
+// Namespace in which all LinBox library code resides
+namespace LinBox
+{
+	// error hanlder for rational domain
+	template <class Blackbox, class Method>
+	inline unsigned long &rank (unsigned long                           &r,
+				    const Blackbox                          &A,
+				    const RingCategories::RationalTag     &tag,
+				    const Method                           &M)
+	{
+		commentator().start ("Rational Rank", "Rrank");
+		// Same mapping as the integer one
+		rank(r, A, RingCategories::IntegerTag(), M);
+		commentator().stop ("done", NULL, "Rrank");
+		return r;
+	}
+
+
+
+
+	template <class Blackbox>
+	inline unsigned long &rank (unsigned long                    &r,
+				    const Blackbox                   &A,
+				    const RingCategories::ModularTag &tag,
+				    const Method::Hybrid             &m)
+	{ // this should become a BB/Blas hybrid in the style of Duran/Saunders/Wan.
+		//! @bug choose (benchmark) better cuttoff (size, nbnz, sparse rep)
+		if (useBB(A)) {
+			return rank(r, A, tag, Method::Blackbox(m ));
+		}
+		else {
+			return rank(r, A, tag, Method::Elimination( m ));
+		}
+	}
+
+	template <class Blackbox>
+	inline unsigned long &rank (unsigned long                     &r,
+				    const Blackbox                    &A,
+				    const RingCategories::ModularTag  &tag,
+				    const Method::Elimination         &m)
+	{
+		typedef typename Blackbox::Field Field;
+		const Field& F = A.field();
+		integer a, b; F.characteristic(a); F.cardinality(b);
+		if (a == b && a < LinBox::BlasBound)
+			return rank(r, A, tag, Method::BlasElimination(m));
+		else
+			return rank(r, A, tag, Method::NonBlasElimination( m ));
+	}
+
+
+	template <class Field, class Vector>
+	inline unsigned long &rank (unsigned long                      &r,
+				    const SparseMatrix<Field, Vector>  &A,
+				    const RingCategories::ModularTag   &tag,
+				    const Method::Elimination          &m)
+	{
+		return rank(r, A, tag, Method::SparseElimination(m));
+	}
+
+
+	// specialization of NonBlas for SparseMatrix
+	template <class Blackbox>
+	inline unsigned long &rank (unsigned long                       &r,
+				    const Blackbox                      &A,
+				    const   RingCategories::ModularTag  &tag,
+				    const Method::NonBlasElimination    & m)
+	{
+		return rank(r, A, tag, Method::SparseElimination(m));
+	}
+
+
+	template <class Blackbox>
+	inline unsigned long &rank (unsigned long                     &r,
+				    const Blackbox                    &A,
+				    const  RingCategories::ModularTag &tag,
+				    const Method::Blackbox            &m);
+
+
+
+	/// M may be <code>Method::Wiedemann()</code>.
+	template <class Blackbox>
+	inline unsigned long &rank (unsigned long                     &res,
+				    const Blackbox                    &A,
+				    const RingCategories::ModularTag  &tag,
+				    const Method::Wiedemann           &M)
+	//! @bug This is too much for solutions.  It belongs in algorithms
+	{
+
+		typedef typename Blackbox::Field Field;
+		const Field F = A.field();
+		typename Field::RandIter iter (F);
+
+		if (M.symmetric()) {
+			commentator().start ("Symmetric Rank", "srank");
+
+
+			BlasVector<Field> d1(F);
+			size_t i;
+
+			VectorWrapper::ensureDim (d1, A.coldim ());
+
+			for (i = 0; i < A.coldim (); i++)
+				do iter.random (d1[i]); while (F.isZero (d1[i]));
+
+
+			typedef Compose<Compose<Diagonal<Field>,Blackbox >, Diagonal<Field> > BlackBox1;
+			Diagonal<Field> D0 (d1);
+			Compose<Diagonal<Field>,Blackbox > B0 (&D0, &A);
+			BlackBox1 B (&B0, &D0);
+
+			BlackboxContainerSymmetric<Field, BlackBox1> TF (&B, F, iter);
+			MasseyDomain<Field, BlackboxContainerSymmetric<Field, BlackBox1> > WD (&TF, M.earlyTermThreshold ());
+			BlasVector<Field> phi(F);
+			WD.pseudo_minpoly (phi, res);
+			commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Pseudo Minpoly degree: " << res << std::endl;
+
+			commentator().start ("Monte Carlo certification (1)", "trace");
+			typename Field::Element t, p2; F.assign(p2, F.zero);
+			trace(t, B);
+			if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
+
+			int nbperm = 0; unsigned long rk;
+			int logn = (int)(2*(unsigned long)floor( log( (double)A.rowdim() ) ));
+			bool tryagain = (! F.areEqual( t, p2 ));
+			while( tryagain ) {
+				commentator().stop ("fail", NULL, "trace");
+#if 0
+
+				Permutation<Field> P(A.rowdim(), F);
+				for (i = 0; i < A.rowdim (); ++i)
+					P.permute( rand() % A.rowdim() , rand() % A.rowdim() );
+				for (i = 0; i < A.rowdim (); ++i)
+					P.permute( rand() % A.rowdim() , rand() % A.rowdim() );
+
+				Transpose< Permutation<Field> > TP(&P);
+				typedef Compose< Permutation<Field>, Blackbox > BlackboxP;
+				typedef Compose< Compose< Permutation<Field>, Blackbox >, Transpose< Permutation<Field> > > BlackboxPAP;
+				BlackboxP PA(&P, &A);
+				BlackboxPAP BP( &PA , &TP );
+
+				for (i = 0; i < A.coldim (); i++)
+					do iter.random (d1[i]); while (F.isZero (d1[i]));
+				Diagonal<Field> D1 (F, d1);
+				Compose<Diagonal<Field>,BlackboxPAP > B1 (&D1, &BP);
+				typedef Compose<Compose<Diagonal<Field>,BlackboxPAP >, Diagonal<Field> > BlackBox2;
+				BlackBox2 B (&B1, &D1);
+#endif
+
+				for (i = 0; i < A.coldim (); i++)
+					do iter.random (d1[i]); while (F.isZero (d1[i]));
+				Diagonal<Field> D1 (d1);
+				Compose<Diagonal<Field>,Blackbox > B1 (&D1, &A);
+				BlackBox1 B2 (&B1, &D1);
+
+				BlackboxContainerSymmetric<Field, BlackBox1> TF1 (&B2, F, iter);
+				MasseyDomain<Field, BlackboxContainerSymmetric<Field, BlackBox1> > WD1 (&TF1, M.earlyTermThreshold ());
+
+				WD1.pseudo_minpoly (phi, rk);
+				commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Permuted pseudo Minpoly degree: " << res << std::endl;
+				commentator().start ("Monte Carlo certification (2)", "trace");
+				if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
+
+				trace(t, B2);
+
+				tryagain = (! F.areEqual( t, p2 ));
+				if (res > rk)
+					tryagain = true;
+				else
+					res = rk;
+				if( ++nbperm > logn) break;
+			}
+			commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "symm permutations : " << nbperm << std::endl;
+			nbperm = 0;
+			while(tryagain) {
+				commentator().stop ("fail", NULL, "trace");
+				//             F.write( F.write( commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION)
+				//                               << "end trace: ", t) << ", p2: ", p2) << std::endl;
+				typename Field::RandIter r (F);
+				typename CekstvSwitch<Field>::Factory factory (r);
+				typedef Butterfly<Field, CekstvSwitch<Field> > ButterflyP;
+				ButterflyP P (F, A.rowdim(), factory);
+				for (i = 0; i < A.coldim (); i++)
+					do iter.random (d1[i]); while (F.isZero (d1[i]));
+				Diagonal<Field> D1 (d1);
+				typedef Compose< ButterflyP, Diagonal<Field> > ButD;
+				ButD PD(&P, &D1);
+
+				Transpose< ButD > TP (&PD);
+
+				Compose< ButD, Blackbox > B1( &PD, &A);
+
+				typedef Compose< Compose< ButD, Blackbox > , Transpose< ButD > > BlackBoxBAB;
+				BlackBoxBAB PAP(&B1, &TP);
+
+				BlackboxContainerSymmetric<Field, BlackBoxBAB> TF1 (&PAP, F, iter);
+				MasseyDomain<Field, BlackboxContainerSymmetric<Field, BlackBoxBAB> > WD1 (&TF1, M.earlyTermThreshold ());
+
+				WD1.pseudo_minpoly (phi, rk);
+				commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Butterfly pseudo Minpoly degree: " << res << std::endl;
+				commentator().start ("Monte Carlo certification (3)", "trace");
+				if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
+
+				trace(t, PAP);
+
+				tryagain = (! F.areEqual( t, p2 ));
+				if (res > rk)
+					tryagain = true;
+				else
+					res = rk;
+				++nbperm;
+			}
+
+			// F.write( F.write( commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION)
+			//              << "end trace: ", t) << ", p2: ", p2) << std::endl;
+
+			commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "butterflies : " << nbperm << std::endl;
+
+			commentator().stop ("success", NULL, "trace");
+			commentator().stop ("done", NULL, "srank");
+
+			return res;
+		}
+		else {
+
+			commentator().start ("Rank", "wrank");
+
+			BlasVector<Field> d1(F), d2(F);
+			size_t i;
+
+			VectorWrapper::ensureDim (d1, A.coldim ());
+			VectorWrapper::ensureDim (d2, A.rowdim ());
+
+			for (i = 0; i < A.coldim (); i++)
+				do iter.random (d1[i]); while (F.isZero (d1[i]));
+
+			for (i = 0; i < A.rowdim (); i++)
+				do iter.random (d2[i]); while (F.isZero (d2[i]));
+
+			Diagonal<Field> D1_i (d1), D2_i (d2);
+			Transpose<Blackbox> AT_i (&A);
+
+			Compose<Diagonal<Field>,Transpose<Blackbox> > B1_i (&D1_i, &AT_i);
+			Compose<Compose<Diagonal<Field>,Transpose<Blackbox> >, Diagonal<Field> > B2_i (&B1_i, &D2_i);
+			Compose<Compose<Compose<Diagonal<Field>,Transpose<Blackbox> >, Diagonal<Field> >, Blackbox> B3_i (&B2_i, &A);
+			// Here there is an extra diagonal computation
+			// The probability of success is also divided by two, as
+			// D2_i^2 contains only squares and squares are half the total elements
+			typedef Compose<Compose<Compose<Compose<Diagonal<Field>,Transpose<Blackbox> >, Diagonal<Field> >, Blackbox>, Diagonal<Field> > Blackbox0;
+			Blackbox0 B_i (&B3_i, &D1_i);
+
+			BlackboxContainerSymmetric<Field, Blackbox0> TF_i (&B_i, F, iter);
+			MasseyDomain<Field, BlackboxContainerSymmetric<Field, Blackbox0> > WD (&TF_i, M.earlyTermThreshold ());
+
+			BlasVector<Field> phi(F);
+			WD.pseudo_minpoly (phi, res);
+			commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Pseudo Minpoly degree: " << res << std::endl;
+			commentator().start ("Monte Carlo certification (4)", "trace");
+
+			typename Field::Element t, p2; F.assign(p2, F.zero);
+			//             trace(t, B_i);
+			WhisartTraceTranspose(t, F, D1_i, A, D2_i);
+			if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
+
+			int nbperm = 0; unsigned long rk;
+			int logn = (int)(2*(unsigned long)floor( log( (double)A.rowdim() ) ));
+			bool tryagain = (! F.areEqual( t, p2 ));
+			while( tryagain ) {
+				commentator().stop ("fail", NULL, "trace");
+				Permutation<Field> P((int)A.rowdim(), F);
+				for (i = 0; i < A.rowdim (); ++i)
+					P.permute( (size_t)rand() % A.rowdim() , (size_t)rand() % A.rowdim() );
+				for (i = 0; i < A.rowdim (); ++i)
+					P.permute( (size_t)rand() % A.rowdim() , (size_t)rand() % A.rowdim() );
+
+				typedef Compose< Permutation<Field>, Blackbox > BlackboxP;
+				BlackboxP BP(&P, &A);
+
+				for (i = 0; i < A.coldim (); i++)
+					do iter.random (d1[i]); while (F.isZero (d1[i]));
+
+				for (i = 0; i < A.rowdim (); i++)
+					do iter.random (d2[i]); while (F.isZero (d2[i]));
+
+				Diagonal<Field> D1 (d1), D2 (d2);
+				Transpose<BlackboxP> AT (&BP);
+
+				Compose<Diagonal<Field>,Transpose<BlackboxP> > B1 (&D1, &AT);
+				Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> > B2 (&B1, &D2);
+				Compose<Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> >, BlackboxP> B3 (&B2, &BP);
+				typedef Compose<Compose<Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> >, BlackboxP>, Diagonal<Field> > Blackbox1;
+				Blackbox1 B (&B3, &D1);
+
+				BlackboxContainerSymmetric<Field, Blackbox1> TF (&B, F, iter);
+				MasseyDomain<Field, BlackboxContainerSymmetric<Field, Blackbox1> > MD (&TF, M.earlyTermThreshold ());
+
+				MD.pseudo_minpoly (phi, rk);
+				commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Permuted pseudo Minpoly degree: " << rk << std::endl;
+				commentator().start ("Monte Carlo certification (5)", "trace");
+				if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
+
+				//                 trace(t, B);
+				WhisartTraceTranspose(t, F, D1, BP, D2);
+				tryagain = (! F.areEqual( t, p2 ));
+				if (res > rk)
+					tryagain = true;
+				else
+					res = rk;
+				if( ++nbperm > logn) break;
+			}
+			commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "permutations : " << nbperm << std::endl;
+			nbperm = 0;
+			while(tryagain) {
+				commentator().stop ("fail", NULL, "trace");
+				typename Field::RandIter r (F);
+				typename CekstvSwitch<Field>::Factory factory (r);
+				typedef Butterfly<Field, CekstvSwitch<Field> > ButterflyP;
+				ButterflyP P (F, A.rowdim(), factory);
+
+				typedef Compose< ButterflyP, Blackbox > BlackboxP;
+				BlackboxP BP(&P, &A);
+
+				for (i = 0; i < A.coldim (); i++)
+					do iter.random (d1[i]); while (F.isZero (d1[i]));
+
+				for (i = 0; i < A.rowdim (); i++)
+					do iter.random (d2[i]); while (F.isZero (d2[i]));
+
+				Diagonal<Field> D1 (d1), D2 (d2);
+				Transpose<BlackboxP> AT (&BP);
+
+				Compose<Diagonal<Field>,Transpose<BlackboxP> > B1 (&D1, &AT);
+				Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> > B2 (&B1, &D2);
+				Compose<Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> >, BlackboxP> B3 (&B2, &BP);
+				typedef Compose<Compose<Compose<Compose<Diagonal<Field>,Transpose<BlackboxP> >, Diagonal<Field> >, BlackboxP>, Diagonal<Field> > Blackbox1;
+				Blackbox1 B (&B3, &D1);
+
+				BlackboxContainerSymmetric<Field, Blackbox1> TF (&B, F, iter);
+				MasseyDomain<Field, BlackboxContainerSymmetric<Field, Blackbox1> > MD (&TF, M.earlyTermThreshold ());
+
+				MD.pseudo_minpoly (phi, rk);
+				commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Butterfly pseudo Minpoly degree: " << rk << std::endl;
+				commentator().start ("Monte Carlo certification (6)", "trace");
+				if (phi.size() >= 2) F.neg(p2, phi[ phi.size()-2]);
+
+				//                 trace(t, B);
+				WhisartTraceTranspose(t, F, D1, BP, D2);
+				// std::cout << t << ',' << p2 << std::endl;
+				tryagain = (! F.areEqual( t, p2 ));
+				if (res > rk)
+					tryagain = true;
+				else
+					res = rk;
+				++nbperm;
+			}
+			commentator().report(Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "butterflies : " << nbperm << std::endl;
+			commentator().stop ("success", NULL, "trace");
+			commentator().stop ("done", NULL, "wrank");
+
+			return res;
+		}
+
+	}
+
+	/// M may be <code>Method::SparseElimination()</code>.
+	template <class Field>
+	inline unsigned long &rank (unsigned long                       &r,
+				    const SparseMatrix<Field, SparseMatrixFormat::SparseSeq>  &A,
+				    const RingCategories::ModularTag    &tag,
+				    const Method::SparseElimination     &M)
+	{
+		// We make a copy as these data will be destroyed
+		SparseMatrix<Field, SparseMatrixFormat::SparseSeq> A1 (A);
+		return rankin(r, A1, tag, M);
+	}
+
+	// Change of representation to be able to call the sparse elimination
+	template <class Blackbox>
+	inline unsigned long &rank (unsigned long                       &r,
+				    const Blackbox                      &A,
+				    const RingCategories::ModularTag    &tag,
+				    const Method::SparseElimination     &M)
+	{
+		typedef typename Blackbox::Field Field;
+		//! @bug choose (benchmark) best representation for Sparse Elimination
+		typedef SparseMatrix<Field, __LINBOX_rank_sparse_elimination_format > SparseBB;
+		// typedef Blackbox SparseBB;
+		SparseBB SpA(A.field(), A.rowdim(), A.coldim() );
+		MatrixHom::map(SpA, A);
+		return rankin(r, SpA, tag, M);
+	}
+
+	// M may be <code>Method::BlasElimination()</code>.
+	template <class Blackbox>
+	inline unsigned long &rank (unsigned long                      &r,
+				    const Blackbox                     &A,
+				    const RingCategories::ModularTag   &tag,
+				    const Method::BlasElimination      &M)
+	{
+
+		commentator().start ("Blas Rank", "blasrank");
+		typedef typename Blackbox::Field Field;
+		const Field F = A.field();
+		integer a, b; F.characteristic(a); F.cardinality(b);
+		linbox_check( a == b );
+		linbox_check( a < LinBox::BlasBound);
+		BlasMatrix<Field> B(A);
+		BlasMatrixDomain<Field> D(F);
+		r = D.rankin(B);
+		commentator().stop ("done", NULL, "blasrank");
+		return r;
+	}
+
+
+
+	template <class Blackbox, class MyMethod>
+	inline unsigned long &rank (unsigned long                     &r,
+				    const Blackbox                    &A,
+				    const RingCategories::IntegerTag  &tag,
+				    const MyMethod                    &M)
+	{
+		commentator().start ("Integer Rank", "iirank");
+		typedef Givaro::Modular<double> projField;
+		integer mmodulus;
+		FieldTraits<projField>::maxModulus(mmodulus);
+		RandomPrimeIterator genprime( (unsigned) floor (log((double)mmodulus) ) );
+		++genprime;
+		typedef typename Blackbox::template rebind< projField >::other FBlackbox;
+		const projField Fp(*genprime);
+		FBlackbox Ap(A, Fp );
+
+// 		FBlackbox Ap(Fp, A.rowdim(), A.coldim() );
+//         typename Blackbox::template rebind<projField>()(Ap,A);
+        
+
+		commentator().report (Commentator::LEVEL_ALWAYS,INTERNAL_DESCRIPTION) << "Integer Rank is done modulo " << *genprime << std::endl;
+
+		rank(r, Ap, RingCategories::ModularTag(), M);
+		commentator().stop ("done", NULL, "iirank");
+		return r;
+	}
+} // LinBox
+
+
+#ifndef LINBOX_EXTENSION_DEGREE_MAX
+#define LINBOX_EXTENSION_DEGREE_MAX 19
+#endif
+
+namespace LinBox
+{
+	template <class Blackbox>
+	inline unsigned long &rank (unsigned long                     &r,
+				    const Blackbox                    &A,
+				    const RingCategories::ModularTag  &tag,
+				    const Method::Blackbox            & m)
+	{
+		commentator().start ("BB Rank", "extend");
+		if (m.certificate()) {
+			typedef typename Blackbox::Field Field;
+			const Field& F = A.field();
+			integer a,c; F.cardinality(a); F.characteristic(c);
+			if (a != c) {
+				uint64_t extend = (uint64_t)Givaro::FF_EXPONENT_MAX(a,(integer)LINBOX_EXTENSION_DEGREE_MAX);
+				if (extend > 1) {
+					commentator().report (Commentator::LEVEL_ALWAYS,INTERNAL_WARNING) << "Extension of degree " << extend << std::endl;
+					Givaro::Extension<Field> EF( F, typename Givaro::Extension<Field>::Residu_t(extend));
+					typedef typename Blackbox::template rebind< Givaro::Extension<Field>  >::other FBlackbox;
+					FBlackbox Ap(A, EF);
+					rank(r, Ap, tag, Method::Wiedemann(m));
+				}
+				else
+					rank(r, A, tag, Method::Wiedemann(m));
+			}
+			else {
+				uint64_t extend = (uint64_t)Givaro::FF_EXPONENT_MAX(c,(integer)LINBOX_EXTENSION_DEGREE_MAX);
+				if (extend > 1) {
+					commentator().report (Commentator::LEVEL_ALWAYS,INTERNAL_WARNING) << "Word size extension : " << extend << std::endl;
+					const Givaro::GFqDom<int64_t> EF( (uint64_t)c, extend);
+					typedef typename Blackbox::template rebind< Givaro::GFqDom<int64_t> >::other FBlackbox;
+					FBlackbox Ap(A, EF);
+					rank(r, Ap, tag, Method::Wiedemann(m));
+				}
+				else
+					rank(r, A, tag, Method::Wiedemann(m));
+			}
+		}
+		else
+			rank(r, A, tag, Method::Wiedemann(m));
+		commentator().stop ("done", NULL, "extend");
+		return r;
+	}
+}
+
+/*namespace LinBox
+{
+	template <class Blackbox>
+	inline unsigned long &rank (unsigned long                      &r,
+				    const Blackbox                     &A,
+				    const  RingCategories::ModularTag  &tag,
+				    const Method::Blackbox             & m)
+	{
+		return rank(r, A, tag, Method::Wiedemann(m));
+	}
+}*/
+
+namespace LinBox { /*  rankin */
+
+	template <class Field, class Method>
+	inline unsigned long &rankin (unsigned long                   &r,
+				      SparseMatrix<Field, SparseMatrixFormat::SparseSeq>  &A,
+				      const Method                    &M)
+	{
+		return rankin(r, A, typename FieldTraits<Field>::categoryTag(), M);
+	}
+
+
+	template <class Blackbox, class Ring>
+	inline unsigned long &rankin (unsigned long                       &r,
+				      Blackbox                            &A,
+				      const RingCategories::IntegerTag    &tag,
+				      const Method::SparseElimination     &M)
+	{
+		commentator().start ("Integer Rank inplace", "irank");
+		typedef Givaro::Modular<double> Field;
+		integer mmodulus;
+		FieldTraits<Field>::maxModulus(mmodulus);
+		RandomPrimeIterator genprime( (unsigned int) floor (log((double)mmodulus) ) );
+		++genprime;
+		typedef typename Blackbox::template rebind< Field >::other FBlackbox;
+		const Field Fp(*genprime);
+		FBlackbox Ap(A, Fp);
+		commentator().report (Commentator::LEVEL_ALWAYS,INTERNAL_WARNING) << "Integer Rank is done modulo " << *genprime << std::endl;
+		rankin(r, Ap, RingCategories::ModularTag(), M);
+		commentator().stop ("done", NULL, "irank");
+		return r;
+	}
+
+	template <class Field>
+	inline unsigned long &rankin (unsigned long                       &r,
+				      SparseMatrix<Field, SparseMatrixFormat::SparseSeq >  &A,
+				      const RingCategories::ModularTag    &tag,
+				      const Method::SparseElimination     &M)
+	{
+		commentator().start ("Sparse Elimination Rank", "serank");
+		GaussDomain<Field> GD ( A.field() );
+		GD.rankin (r, A, M.strategy ());
+		commentator().stop ("done", NULL, "serank");
+		return r;
+	}
+
+	/// specialization to \f$ \mathbf{F}_2 \f$
+	inline unsigned long &rankin (unsigned long                       &r,
+				      GaussDomain<GF2>::Matrix            &A,
+				      const Method::SparseElimination     &)//M
+	{
+		commentator().start ("Sparse Elimination Rank over GF2", "serankmod2");
+		GaussDomain<GF2> GD ( A.field() );
+		GD.rankin (r, A, Specifier::PIVOT_LINEAR);
+		commentator().stop ("done", NULL, "serankmod2");
+		return r;
+	}
+
+	/// specialization to \f$ \mathbf{F}_2 \f$
+	inline unsigned long &rankin (unsigned long                       &r,
+				      GaussDomain<GF2>::Matrix            &A,
+				      const RingCategories::ModularTag    &,//tag
+				      const Method::SparseElimination     &M)
+	{
+		return rankin(r, A, M);
+	}
+
+
+	// is this used?
+	// A is modified.
+	template <class Matrix>
+	inline unsigned long &rankin (unsigned long                      &r,
+				      Matrix                             &A,
+				      const RingCategories::ModularTag   &tag,
+				      const Method::SparseElimination    &M)
+	{
+		typedef typename Matrix::Field Field;
+		const Field F = A.field();
+		GaussDomain<Field> GD (F);
+		GD.rankin( r, A, M.strategy ());
+		return r;
+	}
+
+	/// A is modified.
+	template <class Field>
+	inline unsigned long &rankin (unsigned long                     &r,
+				      BlasMatrix<Field>               &A,
+				      const RingCategories::ModularTag  &tag,
+				      const Method::BlasElimination     &M)
+	{
+
+		commentator().start ("BlasBB Rank", "blasbbrank");
+		const Field F = A.field();
+		BlasMatrixDomain<Field> D(F);
+		r = D.rankin(static_cast< BlasMatrix<Field>& >(A));
+		commentator().stop ("done", NULL, "blasbbrank");
+		return r;
+	}
+
+} // LinBox
+
+#endif // __LINBOX_rank_INL
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/solutions/smith-form.h b/linbox/solutions/smith-form.h
index e4d4b88..94d5a05 100644
--- a/linbox/solutions/smith-form.h
+++ b/linbox/solutions/smith-form.h
@@ -27,20 +27,23 @@
 
 #include <list>
 #include <vector>
+#include <iterator>
 #include "linbox/util/error.h"
 #include "linbox/algorithms/matrix-hom.h"
-#ifdef __LINBOX_HAVE_NTL
+//#ifdef __LINBOX_HAVE_NTL
 #include "linbox/algorithms/smith-form-adaptive.h"
-#endif
-#include "linbox/field/PID-integer.h"
+//#endif
+#include "givaro/zring.h"
 //#include "linbox/algorithms/smith-form.h"
 //#include "linbox/algorithms/smith-form-local.h"
 
 namespace LinBox
 {
+	//! no doc.
 	template<class I1, class Lp>
 	void distinct (I1 a, I1 b, Lp& c)
-	{	typename I1::value_type e;
+	{
+		typename iterator_traits<I1>::value_type e;
 		size_t count = 0;
 		if (a != b) {e = *a; ++a; count = 1;}
 		else return;
@@ -81,6 +84,7 @@ namespace LinBox
 		return S;
 	}
 
+#if 0
 	// for specialization with respect to the DomainCategory
 	template< class Output, class Blackbox, class SmithMethod, class DomainCategory>
 	Output &smithForm(Output & S,
@@ -91,6 +95,7 @@ namespace LinBox
 		throw LinBoxError( "Smith form solution implemented only for NTL.\n                 Please reconfigure LinBox with NTL enabled.");
 	}
 
+#endif
 	// The smithForm with default Method
 	template<class Output, class Blackbox>
 	Output &smithForm(Output& S,
@@ -146,23 +151,27 @@ namespace LinBox
 	}
 #endif
 
-#ifdef __LINBOX_HAVE_NTL
+//#ifdef __LINBOX_HAVE_NTL
 
-	template<>
+	/*template<>
 	std::list<std::pair<integer, size_t> > &
 	smithForm(std::list<std::pair<integer, size_t> >& S,
-		  const BlasMatrix<PID_integer> 	&A,
+	*/
+	template<class Output> Output&
+	smithForm(Output & S,
+		  const BlasMatrix<Givaro::ZRing<Integer> > 	&A,
 		  const RingCategories::IntegerTag      &tag,
 		  const Method::Hybrid			& M)
 	{
-		std::vector<integer> v (A.rowdim() < A.coldim() ? A.rowdim() : A.coldim());
+		Givaro::ZRing<Integer> Z;
+		BlasVector<Givaro::ZRing<Integer> > v (Z,A.rowdim() < A.coldim() ? A.rowdim() : A.coldim());
 		SmithFormAdaptive::smithForm(v, A);
 		distinct(v.begin(), v.end(), S);
 
 		return S;
 	}
 
-#endif
+//#endif
 
 #if 0
 	// The smithForm with BlackBox Method
@@ -181,11 +190,11 @@ namespace LinBox
 #endif // __LINBOX_smith_form_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
 
diff --git a/linbox/solutions/solution-tags.h b/linbox/solutions/solution-tags.h
new file mode 100644
index 0000000..2727413
--- /dev/null
+++ b/linbox/solutions/solution-tags.h
@@ -0,0 +1,56 @@
+/* linbox/solutions/methods.h
+ *
+ * Written by -bds
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file solutions/solution-tags.h
+ * @ingroup solutions
+ * @brief This allows files defining objects that have traits concerning several solutions
+ to get the tags and traits with one inclusion.
+ */
+
+#ifndef __LINBOX_solution_tags_H
+#define __LINBOX_solution_tags_H
+
+namespace LinBox
+{
+	namespace SolutionTags {
+		struct Generic{}; // use for the general case
+		struct Local{}; // use if the object has a local function to perform the solution.
+	} // SolutionTags
+
+	template<class BB> struct GetEntryCategory;
+	template<class BB> struct TraceCategory;
+	template<class BB> struct DetCategory;
+	template<class BB> struct RankCategory;
+}
+#endif // __LINBOX_solution_tags_H
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/solutions/solve.h b/linbox/solutions/solve.h
index a8df961..445bfef 100644
--- a/linbox/solutions/solve.h
+++ b/linbox/solutions/solve.h
@@ -32,7 +32,6 @@
  * @details NO DOC
  */
 
-#include <vector>
 #include <algorithm>
 
 // must fix this list...
@@ -50,6 +49,8 @@
 
 #include "linbox/algorithms/rational-cra2.h"
 #include "linbox/algorithms/varprec-cra-early-multip.h"
+#include "linbox/algorithms/block-wiedemann.h"
+#include "linbox/algorithms/coppersmith.h"
 
 #ifdef __LINBOX_HAVE_IML
 #include "linbox/util/iml_wrapper.h"
@@ -149,7 +150,7 @@ namespace LinBox
 
 	//! @internal inplace Sparse Elimination.
 	template <class Vector, class Field>
-	Vector& solvein(Vector& x, SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq>& A, const Vector& b, const Method::SparseElimination& m)
+	Vector& solvein(Vector& x, SparseMatrix<Field, SparseMatrixFormat::SparseSeq>& A, const Vector& b, const Method::SparseElimination& m)
 	{
 		commentator().start ("Sparse Elimination Solve In Place", "sesolvein");
 		GaussDomain<Field> GD ( A.field() );
@@ -159,7 +160,7 @@ namespace LinBox
 	}
 
 	template <class Vector, class Field, class Random>
-	Vector& solvein(Vector& x, SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq>& A, const Vector& b, const Method::SparseElimination& m, Random& generator)
+	Vector& solvein(Vector& x, SparseMatrix<Field, SparseMatrixFormat::SparseSeq>& A, const Vector& b, const Method::SparseElimination& m, Random& generator)
 	{
 		commentator().start ("Sparse Elimination Solve In Place with random solution", "sesolvein");
 		GaussDomain<Field> GD ( A.field() );
@@ -175,9 +176,9 @@ namespace LinBox
 		      const Method::SparseElimination& m)
 	{
 		typedef typename Blackbox::Field Field;
-		typedef SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq> SparseBB;
+		typedef SparseMatrix<Field,SparseMatrixFormat::SparseSeq> SparseBB;
 		SparseBB SpA(A.field(), A.rowdim(), A.coldim());
-		MatrixHom::map(SpA, A, A.field());
+		MatrixHom::map(SpA, A);
 		return solvein(x, SpA, b, m);
 	}
 
@@ -186,9 +187,9 @@ namespace LinBox
 		      const Method::SparseElimination& m, Random& generator)
 	{
 		typedef typename Blackbox::Field Field;
-		typedef SparseMatrix<Field, typename LinBox::Vector<Field>::SparseSeq> SparseBB;
+		typedef SparseMatrix<Field,SparseMatrixFormat::SparseSeq> SparseBB;
 		SparseBB SpA(A.field(), A.rowdim(), A.coldim());
-		MatrixHom::map(SpA, A, A.field());
+		MatrixHom::map(SpA, A);
 		return solvein(x, SpA, b, generator);
 	}
 
@@ -209,7 +210,7 @@ namespace LinBox
 	Vector& solvein(Vector& x,
 			GaussDomain<GF2>::Matrix    &A,
 			const Vector& b,
-			const Method::SparseElimination& m, 
+			const Method::SparseElimination& m,
             Random& generator)
 	{
 		commentator().start ("Sparse Elimination Solve In Place over GF2", "GF2sesolvein");
@@ -259,8 +260,7 @@ namespace LinBox
 
 #if 0
 		if ( ! consistent ) {  // we will return the zero vector
-			typename Field::Element zero; A.field().init(zero, 0);
-			for (typename Vector::iterator i = x.begin(); i != x.end(); ++i) *i = zero;
+			for (typename Vector::iterator i = x.begin(); i != x.end(); ++i) *i = A.field().zero;
 		}
 		return x;
 #endif
@@ -296,10 +296,8 @@ namespace LinBox
 #if 0
 		// this should be implemented directly in left_solve
 		if ( ! consistent ) {  // we will return the zero vector
-			typename Field::Element zero;
-			A.field().init(zero, 0);
 			for (typename Vector::iterator i = x.begin(); i != x.end(); ++i)
-				*i = zero;
+				*i = A.field().zero;
 		}
 #endif
 		commentator().stop ("done", NULL, "LQUP::left_solve");
@@ -349,15 +347,15 @@ namespace LinBox
 		size_t bits = 26 -(int)ceil(log((double)A.rowdim())*0.7213475205);
 		RandomPrimeIterator genprime( bits);
 
-		RationalRemainder2< VarPrecEarlyMultipCRA< Modular<double> > > rra(3UL);//using default RR method
+		RationalRemainder2< VarPrecEarlyMultipCRA< Givaro::Modular<double> > > rra(3UL);//using default RR method
 		IntegerModularSolve<BB,Vector,MethodTraits > iteration(A, b, m);
 		integer den;
-		std::vector< integer > num(A.coldim());
+		BlasVector<Givaro::ZRing<Integer> > num(A.field(),A.coldim());
 
 		rra(num, den, iteration, genprime);
 
 		typename RatVector::iterator it_x= x.begin();
-		typename std::vector<integer>::const_iterator it_num= num.begin();
+		typename BlasVector<Givaro::ZRing<Integer> >::const_iterator it_num= num.begin();
 
 		for (; it_x != x.end(); ++it_x, ++it_num){
 			integer g = gcd( *it_num, den);
@@ -448,11 +446,11 @@ namespace LinBox
 
 		Method::Dixon mDixon(m);
 		typename Ring::Element d;
-		std::vector< typename Ring::Element> num(A.coldim());
+		BlasVector<Ring> num(A.field(),A.coldim());
 		solve (num, d, A, b, tag, mDixon);
 
 		typename RatVector::iterator it_x= x.begin();
-		typename std::vector< typename Ring::Element>::const_iterator it_num= num.begin();
+		typename BlasVector<Ring>::const_iterator it_num= num.begin();
 		integer n,den;
 		A.field().convert(den,d);
 		for (; it_x != x.end(); ++it_x, ++it_num){
@@ -514,7 +512,7 @@ namespace LinBox
 	// input matrix is a SparseMatrix (no copy)
 	template <class Vect, class Ring>
 	Vect& solve(Vect& x, typename Ring::Element &d,
-		    const SparseMatrix<Ring, typename Vector<Ring>::SparseSeq>& A,
+		    const SparseMatrix<Ring, SparseMatrixFormat::SparseSeq>& A,
 		    const Vect& b,
 		    const RingCategories::IntegerTag & tag,
 		    const Method::SparseElimination& m)
@@ -536,14 +534,15 @@ namespace LinBox
 		if ((A.coldim() != x.size()) || (A.rowdim() != b.size()))
 			throw LinboxError("LinBox ERROR: dimension of data are not compatible in system solving (solving impossible)");
 
-		commentator().start ("Padic Integer Blas-based Solving", "solving");
+		commentator().start ("Padic Integer Blas-based Solving ICI", "solving");
 
-		typedef Modular<double> Field;
+		typedef Givaro::Modular<double> Field;
 		// 0.7213475205 is an upper approximation of 1/(2log(2))
-		RandomPrimeIterator genprime( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
+		RandomPrimeIterator genprime((unsigned int)( 26-(int)ceil(log((double)A.rowdim())*0.7213475205)));
 		RationalSolver<Ring, Field, RandomPrimeIterator, DixonTraits> rsolve(A.field(), genprime);
 		SolverReturnStatus status = SS_OK;
 
+
 		// if singularity unknown and matrix is square, we try nonsingular solver
 		switch ( m.singular() ) {
 		case Specifier::SINGULARITY_UNKNOWN:
@@ -615,8 +614,7 @@ namespace LinBox
 
 		if ( status == SS_INCONSISTENT ) {
 			throw LinboxMathInconsistentSystem("Linear system is inconsistent");
-			//			typename Ring::Element zero; A.field().init(zero, 0);
-			// 			for (typename Vector::iterator i = x.begin(); i != x.end(); ++i) *i = zero;
+			// 			for (typename Vector::iterator i = x.begin(); i != x.end(); ++i) *i = A.field().zero;
 		}
 		return x;
 	}
@@ -625,7 +623,7 @@ namespace LinBox
 	*/
 	template <class Vect, class Ring>
 	Vect& solve(Vect& x, typename Ring::Element &d,
-		    const SparseMatrix<Ring, typename Vector<Ring>::SparseSeq> & A,
+		    const SparseMatrix<Ring, SparseMatrixFormat::SparseSeq> & A,
 		    const Vect& b,
 		    const RingCategories::IntegerTag tag,
 		    Method::Dixon& m)
@@ -635,12 +633,11 @@ namespace LinBox
 
 		commentator().start ("Padic Integer Sparse Elimination Solving", "solving");
 
-		typedef Modular<double> Field;
+		typedef Givaro::Modular<double> Field;
 		// 0.7213475205 is an upper approximation of 1/(2log(2))
-		RandomPrimeIterator genprime( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
+		RandomPrimeIterator genprime((unsigned int) (26-(int)ceil(log((double)A.rowdim())*0.7213475205)));
 		RationalSolver<Ring, Field, RandomPrimeIterator, SparseEliminationTraits> rsolve(A.field(), genprime);
 		SolverReturnStatus status = SS_OK;
-
 		// if singularity unknown and matrix is square, we try nonsingular solver
 		switch ( m.singular() ) {
 		case Specifier::SINGULARITY_UNKNOWN:
@@ -716,8 +713,7 @@ namespace LinBox
 
 		if ( status == SS_INCONSISTENT ) {
 			throw LinboxMathInconsistentSystem("Linear system is inconsistent");
-			//			typename Ring::Element zero; A.field().init(zero, 0);
-			// 			for (typename Vect::iterator i = x.begin(); i != x.end(); ++i) *i = zero;
+			// 			for (typename Vect::iterator i = x.begin(); i != x.end(); ++i) *i = A.field().zero;
 		}
 		return x;
 	}
@@ -756,6 +752,39 @@ namespace LinBox
 		return x;
 	}
 
+	// Only for nonsingular system for now.
+	// may throw SolverFailed or InconsistentSystem
+	template <class Vector, class BB>
+	Vector& solve(Vector& x, const BB& A, const Vector& b,
+		      const RingCategories::ModularTag & tag,
+		      const Method::BlockWiedemann& m)
+	{
+		if ((A.coldim() != x.size()) || (A.rowdim() != b.size()))
+			throw LinboxError("LinBox ERROR: dimension of data are not compatible in system solving (solving impossible)");
+
+		// adapt to earlier signature of wiedemann solver
+		typedef BlasMatrixDomain<typename BB::Field> Context;
+		Context BMD(A.field());
+		BlockWiedemannSolver<Context> BWS(BMD);
+		BWS.solveNonSingular(x, A, b);
+		return x;
+	}
+
+	// Only for nonsingular system for now.
+	// may throw SolverFailed or InconsistentSystem
+	template <class Vector, class BB>
+	Vector& solve(Vector& x, const BB& A, const Vector& b,
+		      const RingCategories::ModularTag & tag,
+		      const Method::Coppersmith& m)
+	{
+		if ((A.coldim() != x.size()) || (A.rowdim() != b.size()))
+			throw LinboxError("LinBox ERROR: dimension of data are not compatible in system solving (solving impossible)");
+
+		// adapt to earlier signature of wiedemann solver
+		CoppersmithSolver<typename BB::Field> cs(A.field());
+		cs.solveNonsingular(x, A, b);
+		return x;
+	}
 
 	/* remark 1.  I used copy constructors when switching method types.
 	   But if the method types are (empty) child classes of a common  parent class containing
@@ -766,7 +795,7 @@ namespace LinBox
 
 
 
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 #include "linbox/algorithms/rational-cra.h"
 #include "linbox/algorithms/rational-cra-early-multip.h"
 #include "linbox/randiter/random-prime.h"
@@ -793,11 +822,11 @@ namespace LinBox
 		{
 			typedef typename Blackbox::template rebind<Field>::other FBlackbox;
 			FBlackbox Ap(F, A.rowdim(), A.coldim());
-			MatrixHom::map(Ap, A, F);
+			MatrixHom::map(Ap, A);
 
 			typedef typename Rebind<Vector, Field>::other FVector;
 			Hom<typename Blackbox::Field, Field> hom(A.field(), F);
-			FVector Bp(B.size());
+			FVector Bp(F,B.size());
 			typename Vector::const_iterator Bit = B.begin();
 			typename FVector::iterator      Bpit = Bp.begin();
 			for( ; Bit != B.end(); ++Bit, ++Bpit)
@@ -820,21 +849,21 @@ namespace LinBox
 
 		commentator().start ("Integer CRA Solve", "Isolve");
 
-		RandomPrimeIterator genprime( 26 -(int)ceil(log((double)A.rowdim())*0.7213475205));
-		//         RationalRemainder< Modular<double> > rra((double)
+		RandomPrimeIterator genprime((unsigned int)( 26 -(int)ceil(log((double)A.rowdim())*0.7213475205)));
+		//         RationalRemainder< Givaro::Modular<double> > rra((double)
 		//                                                  ( A.coldim()/2.0*log((double) A.coldim()) ) );
 
-		RationalRemainder< EarlyMultipRatCRA< Modular<double> > > rra(3UL);
+		RationalRemainder< EarlyMultipRatCRA< Givaro::Modular<double> > > rra(3UL);
 		IntegerModularSolve<BB,Vector,MyMethod> iteration(A, b, M);
 
 		// use of integer due to non genericity of rra (PG 2005-09-01)
 		Integer den;
-		std::vector< Integer > num(A.coldim());
+		BlasVector<Givaro::ZRing<Integer>> num(A.field(),A.coldim());
 		rra(num, den, iteration, genprime);
 		//rra(x, d, iteration, genprime);
 
 		typename Vector::iterator it_x= x.begin();
-		typename std::vector<Integer>::const_iterator it_num= num.begin();
+		typename BlasVector<Givaro::ZRing<Integer>>::const_iterator it_num= num.begin();
 
 		// convert the result
 		for (; it_x != x.end(); ++it_x, ++it_num)
@@ -852,7 +881,9 @@ namespace LinBox
 		      const RingCategories::IntegerTag & tag,
 		      const MyMethod& M)
 	{
-		return solveCRA(x,d,A,b,tag,M);
+                Method::Dixon mDixon(M);
+                return solve(x,d,A,b,tag,mDixon);
+		//return solveCRA(x,d,A,b,tag,M);
 	}
 
 
@@ -877,9 +908,9 @@ namespace LinBox
 #ifdef __LINBOX_HAVE_IML
 	//! IML wrapper.
 	//! @bug not recognised as template spec...
-	std::vector<PID_integer::Element>&
-	solveIML(std::vector<PID_integer::Element>& x, PID_integer::Element & d,
-			 const BlasMatrix<PID_integer>& B, const std::vector<PID_integer::Element>& b,
+	BlasVector<Givaro::ZRing<Integer>>&
+	solveIML(BlasVector<Givaro::ZRing<Integer>>& x, Givaro::ZRing<Integer>::Element & d,
+			 const BlasMatrix<Givaro::ZRing<Integer>>& B, const BlasVector<Givaro::ZRing<Integer>>& b,
 			 const Method::IML& m)
 	{
 		THIS_CODE_COMPILES_BUT_IS_NOT_TESTED; // NOT MUCH
@@ -887,18 +918,18 @@ namespace LinBox
 		case(1) : { /*  non singular */
 					  linbox_check(B.rowdim()==B.coldim());
 					  mpz_t * mp_A = REINTERP_IML_CONST(B.getPointer()) ;
-					  // reinterpret_cast<mpz_t*>(const_cast<PID_integer::Element*>((B.getPointer())));
+					  // reinterpret_cast<mpz_t*>(const_cast<Givaro::ZRing<Integer>::Element*>((B.getPointer())));
 					  //B.getConstPointer() ?
 					  mpz_t * mp_B = REINTERP_IML_CONST(&b[0]);
 					  mpz_t * mp_N = REINTERP_IML(&x[0]);
 					  mpz_t mp_D ;
 					  mpz_init(mp_D);
 				  if (!m.computeRNS()) {
-					  IML::nonsingSolvLlhsMM(IML::RightSolu,B.rowdim(),1,
+					  IML::nonsingSolvLlhsMM(IML::RightSolu,(long)B.rowdim(),1,
 								 mp_A, mp_B, mp_N, mp_D);
 				  }
 				  else {
-					  long n = B.coldim();
+					  long n = (long)B.coldim();
 					  long basislen = 1;
 					  mpz_t mp_alpha, mp_maxInter;
 					  IML::FiniteField qh;
@@ -914,10 +945,10 @@ namespace LinBox
 					  mpz_clear(mp_maxInter);
 					  mpz_clear(mp_alpha);
 					  /*  CRNS[i] = [A_11, A_12] mod basis[i] */
-					  ARNS = IML_XMALLOC(IML::Double *, basislen);
+					  ARNS = IML_XMALLOC(IML::Double *, (size_t)basislen);
 					  for (long i = 0; i < basislen; ++i)
 					  {
-						  ARNS[i] = IML_XMALLOC(IML::Double, n*n);
+						  ARNS[i] = IML_XMALLOC(IML::Double,(size_t)(n*n));
 						  for (long j = 0; j < n; ++j)
 							  for (long l = 0; l < n; l++)
 								  ARNS[i][j*n+l] = (IML::Double) mpz_fdiv_ui(mp_A[j * n + l], basis[i]);
@@ -934,7 +965,7 @@ namespace LinBox
 			  break;
 		case (2) : { /*  certified */
 				   mpz_t * mp_A = REINTERP_IML_CONST(B.getPointer()) ;
-				   // reinterpret_cast<mpz_t*>(const_cast<PID_integer::Element*>((B.getPointer())));
+				   // reinterpret_cast<mpz_t*>(const_cast<Givaro::ZRing<Integer>::Element*>((B.getPointer())));
 				   //B.getConstPointer() ?
 				   mpz_t * mp_b = REINTERP_IML_CONST(&b[0]);
 				   mpz_t * mp_N = REINTERP_IML(&x[0]);
@@ -949,14 +980,14 @@ namespace LinBox
 				   }
 				   if ( !m.reduced() ) {
 					   IML::certSolveMP(m.certificate(),
-							    B.rowdim(),B.coldim(),
+							   (long) B.rowdim(),(long)B.coldim(),
 							    mp_A, mp_b, mp_N, mp_D,
 							    mp_NZ, mp_DZ);
 				   }
 				   else {
 					   IML::certSolveRedMP(m.certificate(),
 							       m.nullcol() //NULLSPACE_COLUMN
-							       ,B.rowdim(),B.coldim(),
+							       ,(long)B.rowdim(),(long)B.coldim(),
 							       mp_A, mp_b, mp_N, mp_D,
 							       mp_NZ, mp_DZ);
 
@@ -982,10 +1013,10 @@ namespace LinBox
 
 		commentator().start ("Rational CRA Solve", "Rsolve");
 		typename BB::Field::Element den;
-		std::vector<typename BB::Field::Element > num(A.coldim());
+		BlasVector<typename BB::Field> num(A.field(),A.coldim());
 		solve (num, den, A, b, tag, M);
 		typename RatVector::iterator it_x= x.begin();
-		typename std::vector<typename BB::Field::Element>::const_iterator it_num= num.begin();
+		typename BlasVector<typename BB::Field>::const_iterator it_num= num.begin();
 		integer n,d;
 		A.field().convert(d,den);
 		for (; it_x != x.end(); ++it_x, ++it_num){
@@ -1004,15 +1035,16 @@ namespace LinBox
 		if ((A.coldim() != x.size()) || (A.rowdim() != b.size()))
 			throw LinboxError("LinBox ERROR: dimension of data are not compatible in system solving (solving impossible)");
 		commentator().start ("Rational CRA Solve", "Rsolve");
-		size_t bits = 26 -(int)ceil(log((double)A.rowdim())*0.7213475205);
+		size_t bits = (size_t)(26 -(int)ceil(log((double)A.rowdim())*0.7213475205));
 		RandomPrimeIterator genprime( (unsigned) bits);
-		RationalRemainder2< VarPrecEarlyMultipCRA< Modular<double> > > rra(3UL);//using default RR method
+		RationalRemainder2< VarPrecEarlyMultipCRA< Givaro::Modular<double> > > rra(3UL);//using default RR method
 		IntegerModularSolve<BB,Vector,MethodTraits > iteration(A, b, m);
 		integer den;
-		std::vector< integer > num(A.coldim());
+		Givaro::ZRing<Integer> Z ;
+		BlasVector<Givaro::ZRing<Integer>> num(Z,A.coldim());
 		rra(num, den, iteration, genprime);
 		typename RatVector::iterator it_x= x.begin();
-		typename std::vector<integer>::const_iterator it_num= num.begin();
+		typename BlasVector<Givaro::ZRing<Integer>>::const_iterator it_num= num.begin();
 		for (; it_x != x.end(); ++it_x, ++it_num){
 			integer g = gcd( *it_num, den);
 			*it_x = typename RatVector::value_type(*it_num/g, den/g);
@@ -1029,15 +1061,16 @@ namespace LinBox
 		if ((A.coldim() != x.size()) || (A.rowdim() != b.size()))
 			throw LinboxError("LinBox ERROR: dimension of data are not compatible in system solving (solving impossible)");
 		commentator().start ("Rational CRA Solve", "Rsolve");
-		size_t bits = 26 -(int)ceil(log((double)A.rowdim())*0.7213475205);
+		size_t bits = (size_t)(26 -(int)ceil(log((double)A.rowdim())*0.7213475205));
 		RandomPrimeIterator genprime((unsigned) bits);
-		RationalRemainder2< VarPrecEarlyMultipCRA< Modular<double> > > rra(3UL);//using default RR method
+		RationalRemainder2< VarPrecEarlyMultipCRA< Givaro::Modular<double> > > rra(3UL);//using default RR method
 		IntegerModularSolve<BB,RatVector,MethodTraits > iteration(A, b, m);
 		integer den;
-		std::vector< integer > num(A.coldim());
+		Givaro::ZRing<Integer> Z;
+		BlasVector<Givaro::ZRing<Integer>> num(Z,A.coldim());
 		rra(num, den, iteration, genprime);
 		typename RatVector::iterator it_x= x.begin();
-		typename std::vector<integer>::const_iterator it_num= num.begin();
+		typename BlasVector<Givaro::ZRing<Integer>>::const_iterator it_num= num.begin();
 		for (; it_x != x.end(); ++it_x, ++it_num){
 			integer g = gcd( *it_num, den);
 			*it_x = typename RatVector::value_type(*it_num/g, den/g);
@@ -1049,14 +1082,14 @@ namespace LinBox
 } // LinBox
 
 #include "linbox/config-blas.h"
-#ifdef __LINBOX_HAVE_LAPACK
+#ifdef __LINBOX_HAVE_CLAPACK
 #include "linbox/algorithms/numeric-solver-lapack.h"
 #include "linbox/algorithms/rational-solver-sn.h"
 namespace LinBox {
-	std::vector<PID_integer::Element>&
-	solveNum(std::vector<PID_integer::Element>& x, PID_integer::Element & d,
-		 const BlasMatrix<PID_integer>& B, const std::vector<PID_integer::Element>& b,
-		 const Method::Numerical & m)
+	BlasVector<Givaro::ZRing<Integer>>&
+	solveNum(BlasVector<Givaro::ZRing<Integer>>& x, Givaro::ZRing<Integer>::Element & d,
+		 const BlasMatrix<Givaro::ZRing<Integer>>& B, const BlasVector<Givaro::ZRing<Integer>>& b,
+		 const Method::NumSymOverlap & m)
 	{
 		THIS_CODE_COMPILES_BUT_IS_NOT_TESTED; // NOT MUCH
 
@@ -1066,7 +1099,8 @@ namespace LinBox {
 		typedef LPS<FMatrix > NumSolver;
 		NumSolver numSolver;
 		bool e = false ;
-		RationalSolverSN<PID_integer, NumSolver > rsolver(PID_integer(), numSolver, e);
+		Givaro::ZRing<Integer> Z;
+		RationalSolverSN<Givaro::ZRing<Integer>, NumSolver > rsolver(Z, numSolver, e);
 
 		int status = rsolver.solve(x, d, B, b);
 		if (status)
@@ -1077,21 +1111,22 @@ namespace LinBox {
 #endif
 
 namespace LinBox {
-	std::vector<PID_integer::Element>&
-	solveNum(std::vector<PID_integer::Element>& x, PID_integer::Element & d,
-		 const BlasMatrix<PID_integer>& B, const std::vector<PID_integer::Element>& b,
-		 const Method::NumericalWan & m)
+	BlasVector<Givaro::ZRing<Integer>>&
+	solveNum(BlasVector<Givaro::ZRing<Integer>>& x, Givaro::ZRing<Integer>::Element & d,
+		 const BlasMatrix<Givaro::ZRing<Integer>>& B, const BlasVector<Givaro::ZRing<Integer>>& b,
+		 const Method::NumSymNorm & m)
 	{
-		THIS_CODE_COMPILES_BUT_IS_NOT_TESTED; // NOT MUCH
+		//THIS_CODE_COMPILES_BUT_IS_NOT_TESTED; // NOT MUCH
 
-		typedef Modular<int32_t> ZField;
-		// typedef Modular<double> ZField;
-		PID_integer ZZ ;
-		RationalSolver<PID_integer, ZField, RandomPrimeIterator, WanTraits> rsolver(ZZ);
+		typedef Givaro::Modular<int32_t> ZField;
+		// typedef Givaro::Modular<double> ZField;
+		Givaro::ZRing<Integer> ZZ ;
+		RationalSolver<Givaro::ZRing<Integer>, ZField, RandomPrimeIterator, NumSymNormTraits> rsolver(ZZ);
 
 		int status = rsolver.solve(x, d, B, b);
 		if (status)
-			throw "fail" ;
+			// throw "fail" ;
+			std::cerr << "fail:" << status << std::endl;
 		return x;
 	}
 }
@@ -1100,11 +1135,10 @@ namespace LinBox {
 
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/solutions/trace.h b/linbox/solutions/trace.h
index cdf5b04..386f6f5 100644
--- a/linbox/solutions/trace.h
+++ b/linbox/solutions/trace.h
@@ -26,35 +26,11 @@
 
 #ifndef __LINBOX_trace_H
 #define __LINBOX_trace_H
-
-#include <vector>
-
-#include "linbox/blackbox/scalar-matrix.h"
-//#include "linbox/blackbox/toeplitz.h"
-#include "linbox/solutions/getentry.h"
+#include "linbox/solutions/solution-tags.h"
 
 namespace LinBox
 {
 
-	// Trait to show whether or not the BB class has a local trace function.
-	template<class BB> struct TraceCategory;
-
-	/// undocumented
-	namespace TraceTags
-	{
-		struct Generic{};
-		struct Local{};
-	}
-
-	template<class BB> struct TraceCategory		{ typedef TraceTags::Generic Tag; };
-
-	template<class Field>
-	struct TraceCategory<ScalarMatrix<Field> > 	{ typedef TraceTags::Local Tag; };
-
-	//template<class Field, class PD>
-	//struct TraceCategory<Toeplitz<Field,PD> >	{ typedef typename TraceTags::Local Tag; };
-
-	// trace
 	/** \brief Sum of the eigenvalues.
 
 	  Also it is the sum of the diagonal entries.
@@ -62,42 +38,36 @@ namespace LinBox
 	  Runtime on n by n matrix is n times the cost of getEntry().
 	  This is linear in n for those classes where getEntry is constant time
 	  (eg DenseMatrix and SparseMatrix).
-	  Trace is constant time when the diagonal is necessarily constant, eg. for ScalarMatrix and Toeplitz.
-	  Worst case time is cost of n blackbox applies (matrix vector products), and apply cost typically ranges between O(n) and O(n^2).
-
-*/
+	  Trace is constant time when the diagonal is necessarily constant, 
+	  eg. for ScalarMatrix and Toeplitz.
+	  Worst case time is cost of n blackbox applies (matrix vector products), 
+	  and apply cost typically ranges between O(n) and O(n^2).
+	*/
 	template <class BB>
-	typename BB::Field::Element& trace(typename BB::Field::Element& t, const BB& A)
-	{
-		typename TraceCategory<BB>::Tag tt;
-		return trace(t, A, tt);
-	}
+	typename BB::Field::Element & trace(typename BB::Field::Element & t, const BB& A);
 
-	/* Generic approach.  It will be efficient for BBs with efficient getEntry.
-	   If getEntry is constant time on n by n BB's, trace will be in O(n).
-	   */
-	template <class BB>
-	typename BB::Field::Element& trace(typename BB::Field::Element& t, const BB& A, TraceTags::Generic tt)
-	{
-		typename BB::Field::Element x;
-		A.field().init(x, 0);
-		A.field().init(t, 0);
-		for (size_t i = 0; i < A.coldim(); ++i)
-			A.field().addin(t, getEntry(x,A,i,i));
-		return t;
-	}
 
+/************* internal forms *******************/
+
+	template <class BB>
+	typename BB::Field::Element& trace(typename BB::Field::Element& t, const BB& A, SolutionTags::Generic tt);
 	/* Specialization for BB's with local trace function.
 	   Allows constant time trace for, eg., ScalarMatrix, Toeplitz.
-	   */
+	*/
 	template <class BB>
-	typename BB::Field::Element & trace(typename BB::Field::Element & t, const BB& A, TraceTags::Local tt)
-	{ return A.trace(t); }
+	typename BB::Field::Element & trace(typename BB::Field::Element & t, const BB& A, SolutionTags::Local tt);
+
+	/** Trait to show whether or not the BB class has a local trace function.
+
+	 ScalarMatrix<Field> and Toeplitz<Field,PD> have local trace.
+	 */
+	template<class BB> struct TraceCategory;
 
 } // namespace LinBox
 
-#endif // __LINBOX_trace_H
+#include "linbox/solutions/trace.inl"
 
+#endif // __LINBOX_trace_H
 
 // vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
diff --git a/linbox/solutions/trace.inl b/linbox/solutions/trace.inl
new file mode 100644
index 0000000..0f6a54b
--- /dev/null
+++ b/linbox/solutions/trace.inl
@@ -0,0 +1,83 @@
+/* linbox/solutions/trace.inl
+ * Copyright(C) LinBox
+ *  Evolved from an earlier one by Bradford Hovinen <hovinen at cis.udel.edu>
+ *  -bds
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+#ifndef __LINBOX_trace_INL
+#define __LINBOX_trace_INL
+
+#include <vector>
+
+#include "linbox/blackbox/scalar-matrix.h"
+#include "linbox/blackbox/toeplitz.h"
+#include "linbox/solutions/getentry.h"
+#include "linbox/solutions/solution-tags.h"
+
+namespace LinBox
+{
+
+	// the unspecialized trace category
+	template<class BB> struct TraceCategory { typedef SolutionTags::Generic Tag; };
+
+	template <class BB>
+	typename BB::Field::Element& trace(typename BB::Field::Element& t, const BB& A)
+	{
+		typename TraceCategory<BB>::Tag tt;
+		return trace(t, A, tt);
+	}
+
+	/* Generic approach.  It will be efficient for BBs with efficient getEntry.
+	   If getEntry is constant time on n by n BB's, trace will be in O(n).
+	   */
+	template <class BB>
+	typename BB::Field::Element& trace(typename BB::Field::Element& t, const BB& A, SolutionTags::Generic tt)
+	{
+		typename BB::Field::Element x;
+		A.field().assign(x, A.field().zero);
+		A.field().assign(t, A.field().zero);
+		for (size_t i = 0; i < A.coldim(); ++i)
+			A.field().addin(t, getEntry(x,A,i,i));
+		return t;
+	}
+
+	/* Specialization for BB's with local trace function.
+	   Allows constant time trace for, eg., ScalarMatrix, Toeplitz.
+	   */
+	template <class BB>
+	typename BB::Field::Element & trace(typename BB::Field::Element & t, const BB& A, SolutionTags::Local tt)
+	{ return A.trace(t); }
+
+} // namespace LinBox
+
+#endif // __LINBOX_trace_INL
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/linbox/solutions/valence.h b/linbox/solutions/valence.h
index fa55a86..961a29a 100644
--- a/linbox/solutions/valence.h
+++ b/linbox/solutions/valence.h
@@ -29,7 +29,6 @@
 #ifndef __LINBOX_valence_H
 #define __LINBOX_valence_H
 
-#include <vector>
 #include "linbox/blackbox/transpose.h"
 
 #include "linbox/solutions/minpoly.h"
@@ -82,27 +81,28 @@ namespace LinBox
 						    const RingCategories::ModularTag          &tag,
 						    const MyMethod& M)
 	{
-		typedef typename Blackbox::Field::Element Elt_t;
-		std::vector<Elt_t> minp;
+		typedef typename Blackbox::Field Field;
+		BlasVector<Field> minp(A.field());
 		minpoly(minp, A, tag, M);
-		typename std::vector<Elt_t>::const_iterator it = minp.begin();
+		typename BlasVector<Field>::const_iterator it = minp.begin();
 		for( ; it != minp.end(); ++it)
 			if (! A.field().isZero(*it)) break;
 		if (it != minp.end())
 			return v=*it;
 		else
-			return A.field().init(v,0UL);
+			return A.field().assign(v,A.field().zero);
 	}
 
 }
 
-#include "linbox/field/modular.h"
-#include "linbox/field/givaro.h"
+#include <givaro/modular.h>
+#include <typeinfo>
+
+#include "linbox/ring/modular.h"
 #include "linbox/algorithms/cra-domain.h"
 #include "linbox/algorithms/cra-early-single.h"
 #include "linbox/randiter/random-prime.h"
 #include "linbox/algorithms/matrix-hom.h"
-#include <typeinfo>
 
 namespace LinBox
 {
@@ -120,7 +120,7 @@ namespace LinBox
 		template<typename Field>
 		typename Field::Element& operator()(typename Field::Element& v, const Field& F) const
 		{
-			commentator().start ("Modular Valence", "Mvalence");
+			commentator().start ("Givaro::Modular Valence", "Mvalence");
 			std::ostream& report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
 			F.write(report) << std::endl;
 			typedef typename Blackbox::template rebind<Field>::other FBlackbox;
@@ -146,10 +146,10 @@ namespace LinBox
 		commentator().start ("Integer Valence", "Ivalence");
 #if __LINBOX_SIZEOF_LONG == 8
 		RandomPrimeIterator genprime( 31 );
-		ChineseRemainder< EarlySingleCRA< GivaroZpz< Givaro::Std64> > > cra(3UL);
+		ChineseRemainder< EarlySingleCRA< Givaro::Modular< int64_t> > > cra(3UL);
 #else
 		RandomPrimeIterator genprime( 26 );
-		ChineseRemainder< EarlySingleCRA< Modular<double> > > cra(3UL);
+		ChineseRemainder< EarlySingleCRA< Givaro::Modular<double> > > cra(3UL);
 #endif
 		IntegerModularValence<Blackbox,MyMethod> iteration(A, M);
 		cra(V, iteration, genprime);
@@ -178,8 +178,9 @@ namespace LinBox
 			typedef typename Blackbox::Field Ring;
 			_aat_diag = 0; _aat_radius = 0, _aat_radius1 = 0;
 
-			std::vector< integer > d(A. rowdim()),w(A. coldim());
-			std::vector<integer>::iterator di, wi;
+			Givaro::ZRing<Integer> ZZ;
+			BlasVector< Givaro::ZRing<Integer> > d(ZZ, A. rowdim()),w(ZZ, A. coldim());
+			BlasVector<Givaro::ZRing<Integer>>::iterator di, wi;
 			for(wi = w.begin();wi!= w.end();++wi)
 				*wi = 0;
 			for(di = d.begin();di!= d.end();++di)
@@ -196,7 +197,7 @@ namespace LinBox
 					R. convert (tmp, tmp_e);
 					if (tmp != 0) {
 						*di += tmp * tmp;
-						w [(int) i] += abs (tmp);
+						w [(size_t) i] += abs (tmp);
 					}
 
 					_aat_diag = _aat_diag >= *di ? _aat_diag : *di;
@@ -209,7 +210,7 @@ namespace LinBox
 					R. assign (tmp_e, A. getEntry (j, i));
 					R. convert (tmp, tmp_e);
 					if (tmp != 0)
-						local_radius += abs (tmp) * w[(int)i];
+						local_radius += abs (tmp) * w[(size_t)i];
 				}
 				local_radius -= *di;
 				if ( local_radius > _aat_radius1) {
@@ -231,17 +232,18 @@ namespace LinBox
 
 		// compute one valence of AAT over a field
 		template <class Blackbox>
-		static void one_valence(typename Blackbox::Element& v, unsigned long& r, const Blackbox& A)
+		static void one_valence(typename Blackbox::Element& v, size_t& r, const Blackbox& A)
 		{
 			//commentator().start ("One valence", "one valence");
-			typedef std::vector<typename Blackbox::Element> Poly; Poly poly;
+			typedef BlasVector<typename Blackbox::Field> Poly;
+			Poly poly(A.field());
 			typename Blackbox::Field F(A. field());
 			Transpose<Blackbox> AT (&A);
 			Compose<Blackbox, Transpose<Blackbox> > AAT(&A, &AT);
 			// compute the minpoly of AAT
 			minpoly(poly, AAT, Method::Wiedemann());
 			typename Poly::iterator p;
-			F. init (v, 0);
+			F. assign(v, F.zero);
 
 			for (p = poly. begin(); p != poly. end(); ++ p)
 				if (! F. isZero (*p)) {
@@ -264,12 +266,11 @@ namespace LinBox
 		static void valence(Integer& val, const Blackbox& A)
 		{
 			commentator().start ("Valence (AAT)", "Valence");
-			typedef Modular<int32_t> Field;
+			typedef Givaro::Modular<int32_t> Field;
 			typedef typename MatrixHomTrait<Blackbox, Field>::value_type FBlackbox;
-			double log_max_mod = log((double)FieldTraits<Field>::maxModulus()) ;
-			int n_bit = (int)(log_max_mod / M_LN2 - 2);
-			unsigned long d;
-			RandomPrimeIterator g(n_bit); Field::Element v;
+			size_t d;
+			RandomPrimeIterator g; g.template setBitsField<Field>();
+			Field::Element v;
 			++g;
 			Field F((int32_t)*g);
 			FBlackbox Ap(A, F);
@@ -286,25 +287,24 @@ namespace LinBox
 		// compute the valence of AAT over an integer ring
 		// d, the degree of min_poly of AAT
 		template <class Blackbox>
-		static void valence(Integer& val, unsigned long d, const Blackbox& A)
+		static void valence(Integer& val, size_t d, const Blackbox& A)
 		{
 
-			typedef Modular<int32_t> Field;
+			typedef Givaro::Modular<int32_t> Field;
 			typedef typename MatrixHomTrait<Blackbox, Field>::value_type FBlackbox;
 
-			double log_max_mod = log((double)FieldTraits<Field>::maxModulus()) ;
-			int n_bit = (int)(log_max_mod / M_LN2 - 2);
-			RandomPrimeIterator rg(n_bit);
-			std::vector<integer> Lv, Lm;
-			unsigned long d1; Field::Element v; integer im = 1;
+			RandomPrimeIterator rg; rg.template setBitsField<Field>();
+			Givaro::ZRing<Integer> Z;
+			BlasVector<Givaro::ZRing<Integer> > Lv(Z), Lm(Z);
+			size_t d1; Field::Element v; integer im = 1;
 			//compute an upper bound for val.
-			integer bound; cassini (bound, A); bound = pow (bound, d); bound *= 2;
+			integer bound; cassini (bound, A); bound = pow (bound, (uint64_t)d); bound *= 2;
 			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION)
 			<< "Bound for valence: " << bound << std::endl;
 
 			do {
 				++rg;
-				Field F((unsigned long)*rg);
+				Field F((uint64_t)*rg);
 				FBlackbox Ap(A, F);
 				one_valence(v, d1, Ap);
 				if (d1 == d) {
@@ -314,7 +314,7 @@ namespace LinBox
 			} while (im < bound);
 
 			val = 0;
-			std::vector<integer>::iterator Lv_p, Lm_p; integer tmp, a, b, g;
+			BlasVector<Givaro::ZRing<Integer> >::iterator Lv_p, Lm_p; integer tmp, a, b, g;
 			for (Lv_p = Lv. begin(), Lm_p = Lm. begin(); Lv_p != Lv. end(); ++ Lv_p, ++ Lm_p) {
 				tmp = im / *Lm_p;
 				gcd (g, *Lm_p, tmp, a, b);
@@ -335,11 +335,10 @@ namespace LinBox
 #endif //__LINBOX_valence_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/switch/Makefile.am b/linbox/switch/Makefile.am
deleted file mode 100644
index b1e7f9c..0000000
--- a/linbox/switch/Makefile.am
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-
-
-pkgincludesubdir=$(pkgincludedir)/switch
-
-pkgincludesub_HEADERS=		\
-	boolean.h		\
-	cekstv.h                \
-	cekstv-gf2.h
diff --git a/linbox/switch/Makefile.in b/linbox/switch/Makefile.in
deleted file mode 100644
index 984cfde..0000000
--- a/linbox/switch/Makefile.in
+++ /dev/null
@@ -1,576 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/switch
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/switch
-pkgincludesub_HEADERS = \
-	boolean.h		\
-	cekstv.h                \
-	cekstv-gf2.h
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/switch/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps linbox/switch/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
-	done
-
-uninstall-pkgincludesubHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
-	for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool ctags distclean distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-pkgincludesubHEADERS install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/switch/boolean.h b/linbox/switch/boolean.h
deleted file mode 100644
index a780b49..0000000
--- a/linbox/switch/boolean.h
+++ /dev/null
@@ -1,195 +0,0 @@
-/* linbox/switch/boolean.h
- * Copyright (C) 1999-2001 William J Turner
- *
- * Written by William J Turner <wjturner at math.ncsu.edu>,
- *
- * -----------------------------------------------------------
- * 2002-09-26  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
- *
- * Refactoring: The switch object now contains only the information for one 2x2
- * block. A vector of switches is maintained by the butterfly preconditioner
- * instead of the switch object. Since there will be many switch objects, they
- * should be kept very lightweight, so the field is not maintained in the object
- * itself, but instead passed to apply and applyTranspose. Since those methods
- * are inline, this does not create overhead. apply and applyTranspose now take
- * four field elements: the source elements and destination elements. This
- * eliminates the need to keep an additional temporary in the class, and
- * eliminates the need for copying in the butterfly.
- *
- * -----------------------------------------------------------
- * 2002-08-20  Bradford Hovinen  <hovinen at cis.udel.edu>
- *
- * Brought this file into the current Linbox framework:
- *   - Renamed file as boolean.h
- *   - Renamed class boolean_switch as BooleanSwitch
- *   - Reindent
- * -----------------------------------------------------------
- *
- * 
- * ========LICENCE========
- * This file is part of the library LinBox.
- * 
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This 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
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_boolean_H
-#define __LINBOX_boolean_H
-
-#include <vector>
-
-namespace LinBox
-{
-
-	class BooleanSwitchFactory;
-
-	/** Boolean switch object.
-	 * This is a switch predicate object that is applied
-	 * to two references to elements to switch them as needed
-	 * by the \ref Butterfly\ Switching\ Network\ BlackBox\ Matrix\ Object.
-	 */
-	class BooleanSwitch {
-	public:
-
-		typedef BooleanSwitch Self_t;
-		typedef BooleanSwitchFactory Factory;
-
-		/** Constructor from an STL vector of booleans.
-		 * The switch is applied using the vector of booleans.
-		 * A true value means to swap the two elements, and a false
-		 * value means not to.
-		 * The apply function starts at the beginning of the vector moving
-		 * forward through it, and applyTranspose function starts at the end
-		 * moving backwards.  Both repeat the vector after they pass through it.
-		 * @param s vector of switches
-		 */
-		BooleanSwitch (const bool s) :
-		       	_s (s)
-		{}
-
-		/** Destructor.
-		*/
-		~BooleanSwitch () {}
-
-		/** Apply switch function.
-		 * Switches the elements in references according to current boolean
-		 * value.  Swaps the elements if boolean is true, otherwise does nothing.
-		 * It is templatized by the element type to be swapped.
-		 * @return bool \c true if swapped, \c false otherwise
-		 * @param F
-		 * @param x reference to first element to be switched
-		 * @param y reference to second element to be switched
-		 */
-		template <class Field>
-		bool apply (const Field             &F,
-			    typename Field::Element &x,
-			    typename Field::Element &y) const;
-
-		/** Apply switch transpose function.
-		 * Switches the elements in references according to current boolean
-		 * value.  Swaps the elements if boolean is true, otherwise does nothing.
-		 * It is templatized by the element type to be swapped.
-		 * @return bool \c true if swapped, \c false otherwise
-		 * @param F
-		 * @param x reference to first element to be switched
-		 * @param y reference to second element to be switched
-		 */
-		template <class Field>
-		bool applyTranspose (const Field             &F,
-				     typename Field::Element &x,
-				     typename Field::Element &y) const;
-
-		template<typename _Tp1>
-		struct rebind {
-			typedef BooleanSwitch other;
-
-		};
-
-	protected:
-
-		bool _s;
-
-	}; // class boolean_switch
-
-	/** Boolean switch factory
-	 *
-	 * This class facilitates construction of boolean switch objects by the
-	 * butterfly matrix.
-	 */
-
-	class BooleanSwitchFactory {
-	public:
-		/** Constructor from an STL vector of bools
-		*/
-		BooleanSwitchFactory (const std::vector<bool> &switches) :
-		       	_switches (switches), _iter (switches.begin ())
-		{}
-
-		/** Construct and return a boolean switch object
-		 *
-		 * This function walks through the switches object given in the
-		 * constructor, advancing on each invocation. It wraps around to the
-		 * beginning of the vector when it reaches the end.
-		 */
-		BooleanSwitch makeSwitch ()
-		{
-			if (_iter == _switches.end ())
-				_iter = _switches.begin ();
-
-			return BooleanSwitch (*_iter++);
-		}
-
-	private:
-
-		const std::vector<bool> &_switches;
-		std::vector<bool>::const_iterator _iter;
-	};
-
-	template <class Field>
-	inline bool BooleanSwitch::apply (const Field             &F,
-					  typename Field::Element &x,
-					  typename Field::Element &y) const
-	{
-		if (_s)
-			std::swap (x, y);
-
-		return _s;
-	}
-
-	template <class Field>
-	inline bool BooleanSwitch::applyTranspose (const Field             &F,
-						   typename Field::Element &x,
-						   typename Field::Element &y) const
-	{
-		if (_s)
-			std::swap (x, y);
-
-		return _s;
-	}
-
-}
-
-#endif // __LINBOX_boolean_H
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/switch/cekstv-gf2.h b/linbox/switch/cekstv-gf2.h
deleted file mode 100644
index 6d35027..0000000
--- a/linbox/switch/cekstv-gf2.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/* linbox/switch/cekstv.h
- * Copyright (C) 1999-2001 William J Turner
- *
- * Written by William J Turner <wjturner at math.ncsu.edu>
- *
- * -----------------------------------------------------------
- * 2002-09-26  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
- *
- * Refactoring: The switch object now contains only the information for one 2x2
- * block. A vector of switches is maintained by the butterfly preconditioner
- * instead of the switch object. Since there will be many switch objects, they
- * should be kept very lightweight, so the field is not maintained in the object
- * itself, but instead passed to apply and applyTranspose. Since those methods
- * are inline, this does not create overhead. apply and applyTranspose now take
- * four field elements: the source elements and destination elements. This
- * eliminates the need to keep an additional temporary in the class, and
- * eliminates the need for copying in the butterfly.
- *
- * -----------------------------------------------------------
- * 2002-08-20  Bradford Hovinen  <hovinen at cis.udel.edu>
- *
- * Brought this file into the current Linbox framework:
- *   - Renamed file as cekstv.h
- *   - Renamed class cekstv_switch as CekstvSwitch
- *   - Reindent
- * -----------------------------------------------------------
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_cekstv_gf2_H
-#define __LINBOX_cekstv_gf2_H
-
-#include <vector>
-
-#include "linbox/field/gf2.h"
-#include "linbox/switch/cekstv.h"
-
-
-namespace LinBox
-{
-	// Specialization of Butterfly switch object
-	template <>
-	class CekstvSwitch<GF2>
-	{
-	public:
-		typedef GF2 Field;
-		/// Typedef
-		typedef Field::Element Element;
-		typedef CekstvSwitch<Field> Self_t;
-		typedef CekstvSwitchFactory<Field> Factory;
-
-		/** Constructor from a field and a field element.
-		 * @param F field in which arithmetic is done
-		 * @param switches vector of switches
-		 */
-		CekstvSwitch (const Field::Element &a) :
-			_a (a)
-		{}
-
-		~CekstvSwitch () {}
-
-		bool apply (const Field &F, Element &x, Element &y) const
-		{
-			F.axpyin (x, _a, y);
-			F.addin (y, x);
-			return true;
-		}
-
-		bool applyTranspose (const Field &F, Element &x, Element &y) const
-		{
-			F.addin (x, y);
-			F.axpyin (y, _a, x);
-			return true;
-		}
-
-		bool apply (const Field &F, stdBitReference x, stdBitReference y) const
-		{
-			F.axpyin (x, _a, y);
-			F.addin (y, x);
-			return true;
-		}
-
-		bool applyTranspose (const Field &F, stdBitReference x, stdBitReference y) const
-		{
-			F.addin (x, y);
-			F.axpyin (y, _a, x);
-			return true;
-		}
-
-		template<typename _Tp1>
-		struct rebind
-		{
-			typedef CekstvSwitch<_Tp1> other;
-
-			// special rebind operator() with two fields,
-			// indeed local field is not stored in the switch
-			void operator() (other *& Ap, const Self_t& A, const _Tp1& T, const Field& F) {
-				typename _Tp1::Element u;
-				Hom<Field, _Tp1>(F,T).image(u, A._a);
-				Ap = new other(u);
-			}
-		};
-
-
-	private:
-
-		// Parameter of this 2x2 block
-		Field::Element _a;
-	};
-
-
-} // namespace LinBox
-
-#endif // __LINBOX_cekstv_H
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/switch/cekstv.h b/linbox/switch/cekstv.h
deleted file mode 100644
index aa154f8..0000000
--- a/linbox/switch/cekstv.h
+++ /dev/null
@@ -1,200 +0,0 @@
-/* linbox/switch/cekstv.h
- * Copyright (C) 1999-2001 William J Turner
- *
- * Written by William J Turner <wjturner at math.ncsu.edu>
- *
- * -----------------------------------------------------------
- * 2002-09-26  Bradford Hovinen  <bghovinen at math.uwaterloo.ca>
- *
- * Refactoring: The switch object now contains only the information for one 2x2
- * block. A vector of switches is maintained by the butterfly preconditioner
- * instead of the switch object. Since there will be many switch objects, they
- * should be kept very lightweight, so the field is not maintained in the object
- * itself, but instead passed to apply and applyTranspose. Since those methods
- * are inline, this does not create overhead. apply and applyTranspose now take
- * four field elements: the source elements and destination elements. This
- * eliminates the need to keep an additional temporary in the class, and
- * eliminates the need for copying in the butterfly.
- *
- * -----------------------------------------------------------
- * 2002-08-20  Bradford Hovinen  <hovinen at cis.udel.edu>
- *
- * Brought this file into the current Linbox framework:
- *   - Renamed file as cekstv.h
- *   - Renamed class cekstv_switch as CekstvSwitch
- *   - Reindent
- * -----------------------------------------------------------
- *
- * 
- * ========LICENCE========
- * This file is part of the library LinBox.
- * 
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This 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
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-#ifndef __LINBOX_cekstv_H
-#define __LINBOX_cekstv_H
-
-#include <vector>
-
-namespace LinBox
-{
-
-	template <class Field>
-	class CekstvSwitchFactory;
-
-	/** Butterfly switch object from preconditioner paper.
-	 * This is a switch predicate object that is applied
-	 * to two references to elements to switch them as needed
-	 * by the \ref Butterfly\ Switching\ Network\ BlackBox\ Matrix\ Object
-	 * following the exchange matrix introduced in "Efficient Matrix
-	 * Preconditioners for Black Box Linear Algebra" by Chen, Eberly,
-	 * Kaltofen, Saunders, Turner, and Villard.
-	 * This class is templatized by the field in which the arithmetic
-	 * is done.
-	 */
-	template <class Field>
-	class CekstvSwitch {
-	public:
-
-		/// Typedef
-		typedef typename Field::Element Element;
-		typedef CekstvSwitch<Field> Self_t;
-		typedef CekstvSwitchFactory<Field> Factory;
-
-		CekstvSwitch () {}
-
-		/** Constructor from a field and a field element.
-		 * @param a vector of switches
-		 */
-		CekstvSwitch (const typename Field::Element &a) :
-		       	_a (a)
-		{}
-
-		/** Destructor.
-		*/
-		~CekstvSwitch () {}
-
-		/** Apply switch function.
-		 * Switches the elements in references according to the
-		 * exchange matrix introduced in "Efficient Matrix
-		 * Preconditioners for Black Box Linear Algebra" by Chen, Eberly,
-		 * Kaltofen, Saunders, Turner, and Villard and the current field element
-		 * specified in the switch object.
-		 * @return bool true if swapped, false otherwise
-		 * @param F
-		 * @param x reference to first element to be switched
-		 * @param y reference to second element to be switched
-		 */
-		bool apply (const Field &F, Element &x, Element &y) const;
-
-		/** Apply switch transpose function.
-		 * Switches the elements in references according to the
-		 * transpose of the exchange matrix introduced in "Efficient Matrix
-		 * Preconditioners for Black Box Linear Algebra" by Chen, Eberly,
-		 * Kaltofen, Saunders, Turner, and Villard and the current field element
-		 * specified in the switch object.
-		 * @return bool true if swapped, false otherwise
-		 * @param F
-		 * @param x reference to first element to be switched
-		 * @param y reference to second element to be switched
-		 */
-		bool applyTranspose (const Field &F, Element &x, Element &y) const;
-
-
-		template<typename _Tp1>
-		struct rebind
-		{
-			typedef CekstvSwitch<_Tp1> other;
-
-			// special rebind operator() with two fields,
-			// indeed local field is not stored in the switch
-			void operator() (other & Ap, const Self_t& A, const _Tp1& T, const Field& F) {
-				Hom<Field, _Tp1>(F,T).image(Ap.getData(), A.getData());
-			}
-		};
-
-		typename Field::Element& getData() { return _a; }
-		const typename Field::Element& getData() const { return _a; }
-
-
-	private:
-
-		// Parameter of this 2x2 block
-		typename Field::Element _a;
-	};
-
-	/** Cekstv switch factory
-	 *
-	 * This class facilitates construction of cekstv switch objects by the
-	 * butterfly matrix.
-	 */
-
-	template <class Field>
-	class CekstvSwitchFactory {
-	public:
-		/** Constructor from an STL vector of bools
-		*/
-		CekstvSwitchFactory (typename Field::RandIter r) :
-		       	_r (r)
-		{}
-
-		/** Construct and return a boolean switch object
-		*/
-		CekstvSwitch<Field> makeSwitch ()
-		{ typename Field::Element a; return CekstvSwitch<Field> (_r.random (a)); }
-
-	private:
-
-		typename Field::RandIter _r;
-	};
-
-	template <class Field>
-	inline bool CekstvSwitch<Field>::apply (const Field             &F,
-						typename Field::Element &x,
-						typename Field::Element &y) const
-	{
-		F.axpyin (x, _a, y);
-		F.addin (y, x);
-
-		return true;
-	}
-
-	template <class Field>
-	inline bool CekstvSwitch<Field>::applyTranspose (const Field             &F,
-							 typename Field::Element &x,
-							 typename Field::Element &y) const
-	{
-		F.addin (x, y);
-		F.axpyin (y, _a, x);
-
-		return true;
-	}
-
-}
-
-#include "linbox/switch/cekstv-gf2.h"
-#endif // __LINBOX_cekstv_H
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/linbox/util/Makefile.am b/linbox/util/Makefile.am
index 682a7ef..7feebe7 100644
--- a/linbox/util/Makefile.am
+++ b/linbox/util/Makefile.am
@@ -19,12 +19,10 @@
 
 
 
-#we now need to include givaro headers for timer ? (oupa ? plus moche que ça tu meurs)
-AM_CPPFLAGS=-I$(top_srcdir) -I$(top_srcdir)/linbox $(FFLAS_FFPACK_CFLAGS) $(GIVARO_CFLAGS)
+#we now need to include givaro headers for timer ?
 
-LIBS=$(GIVARO_LIBS)
-
-AM_CXXFLAGS=@DEFAULT_CFLAGS@
+AM_CPPFLAGS= -I$(top_srcdir)/linbox $(DEPS_CFLAGS)
+LDADD = $(DEPS_LIBS) $(LDFLAGS)
 
 SUBDIRS=formats
 
@@ -34,27 +32,29 @@ noinst_LTLIBRARIES=libutil.la
 
 
 libutil_la_SOURCES=	\
-	error.C		    \
+	error.C		\
 	debug.C
 
-libutil_la_LDFLAGS=$(GIVARO_LIBS)  $(LDFLAGS)
+libutil_la_LDFLAGS=  $(LDFLAGS)
 
 #libutil_la_LIBADD=	\
 #	gmp++/libgmpxx.la
 
-pkgincludesub_HEADERS=      \
-	debug.h				    \
-	timer.h				    \
-	error.h				    \
-	commentator.h 			\
-	commentator.inl 			\
-	contracts.h 			\
-	prime-stream.h			\
-	iml_wrapper.h           \
-	field-axpy.h			\
-	matrix-stream.h			\
-	matrix-stream.inl		\
-	mpicpp.h			    \
-	mpicpp.inl
+pkgincludesub_HEADERS=    \
+	args-parser.h     \
+	commentator.h 	  \
+	commentator.inl   \
+	contracts.h 	  \
+	debug.h		  \
+	error.h		  \
+	field-axpy.h	  \
+	iml_wrapper.h     \
+	matrix-stream.h	  \
+	matrix-stream.inl \
+	mpicpp.h	  \
+	mpicpp.inl	  \
+	prime-stream.h	  \
+	timer.h		  \
+	write-mm.h
 
 EXTRA_DIST = util.doxy
diff --git a/linbox/util/Makefile.in b/linbox/util/Makefile.in
deleted file mode 100644
index 91d5364..0000000
--- a/linbox/util/Makefile.in
+++ /dev/null
@@ -1,800 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/util
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-LTLIBRARIES = $(noinst_LTLIBRARIES)
-libutil_la_LIBADD =
-am_libutil_la_OBJECTS = error.lo debug.lo
-libutil_la_OBJECTS = $(am_libutil_la_OBJECTS)
-libutil_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(libutil_la_LDFLAGS) $(LDFLAGS) -o $@
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = $(libutil_la_SOURCES)
-DIST_SOURCES = $(libutil_la_SOURCES)
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-dvi-recursive install-exec-recursive \
-	install-html-recursive install-info-recursive \
-	install-pdf-recursive install-ps-recursive install-recursive \
-	installcheck-recursive installdirs-recursive pdf-recursive \
-	ps-recursive uninstall-recursive
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
-  distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
-	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
-	distdir
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = $(GIVARO_LIBS)
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-
-#we now need to include givaro headers for timer ? (oupa ? plus moche que ça tu meurs)
-AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/linbox $(FFLAS_FFPACK_CFLAGS) $(GIVARO_CFLAGS)
-AM_CXXFLAGS = @DEFAULT_CFLAGS@
-SUBDIRS = formats
-pkgincludesubdir = $(pkgincludedir)/util
-noinst_LTLIBRARIES = libutil.la
-libutil_la_SOURCES = \
-	error.C		    \
-	debug.C
-
-libutil_la_LDFLAGS = $(GIVARO_LIBS)  $(LDFLAGS)
-
-#libutil_la_LIBADD=	\
-#	gmp++/libgmpxx.la
-pkgincludesub_HEADERS = \
-	debug.h				    \
-	timer.h				    \
-	error.h				    \
-	commentator.h 			\
-	commentator.inl 			\
-	contracts.h 			\
-	prime-stream.h			\
-	iml_wrapper.h           \
-	field-axpy.h			\
-	matrix-stream.h			\
-	matrix-stream.inl		\
-	mpicpp.h			    \
-	mpicpp.inl
-
-EXTRA_DIST = util.doxy
-all: all-recursive
-
-.SUFFIXES:
-.SUFFIXES: .C .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/util/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps linbox/util/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-clean-noinstLTLIBRARIES:
-	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
-	@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" != "$$p" || dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-libutil.la: $(libutil_la_OBJECTS) $(libutil_la_DEPENDENCIES) $(EXTRA_libutil_la_DEPENDENCIES) 
-	$(libutil_la_LINK)  $(libutil_la_OBJECTS) $(libutil_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-.C.o:
-	$(CXXCOMPILE) -c -o $@ $<
-
-.C.obj:
-	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.C.lo:
-	$(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
-	done
-
-uninstall-pkgincludesubHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    $(am__make_dryrun) \
-	      || test -d "$(distdir)/$$subdir" \
-	      || $(MKDIR_P) "$(distdir)/$$subdir" \
-	      || exit 1; \
-	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-	    $(am__relativize); \
-	    new_distdir=$$reldir; \
-	    dir1=$$subdir; dir2="$(top_distdir)"; \
-	    $(am__relativize); \
-	    new_top_distdir=$$reldir; \
-	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-	    ($(am__cd) $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$new_top_distdir" \
-	        distdir="$$new_distdir" \
-		am__remove_distdir=: \
-		am__skip_length_check=: \
-		am__skip_mode_fix=: \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(LTLIBRARIES) $(HEADERS)
-installdirs: installdirs-recursive
-installdirs-am:
-	for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
-	mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
-	install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-	all all-am check check-am clean clean-generic clean-libtool \
-	clean-noinstLTLIBRARIES ctags ctags-recursive distclean \
-	distclean-compile distclean-generic distclean-libtool \
-	distclean-tags distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-pdf install-pdf-am install-pkgincludesubHEADERS \
-	install-ps install-ps-am install-strip installcheck \
-	installcheck-am installdirs installdirs-am maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags tags-recursive uninstall uninstall-am \
-	uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/util/args-parser.h b/linbox/util/args-parser.h
new file mode 100644
index 0000000..44fbf94
--- /dev/null
+++ b/linbox/util/args-parser.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2014 the LinBox group
+ *
+ *  Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *
+ */
+
+#ifndef __LINBOX_util_args_parser_H
+#define __LINBOX_util_args_parser_H
+
+#include <gmp++/gmp++.h>
+#include <fflas-ffpack/utils/args-parser.h>
+
+#endif // __LINBOX_util_args_parser_H
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/commentator.h b/linbox/util/commentator.h
index 2f6c941..f618e12 100644
--- a/linbox/util/commentator.h
+++ b/linbox/util/commentator.h
@@ -47,7 +47,8 @@
 #include <fstream>
 #include <cstring>
 
-#include "linbox/util/timer.h"
+//#include "linbox/util/timer.h"
+#include "givaro/givtimer.h"
 
 #ifndef MAX
 #  define MAX(a,b) (((a) > (b)) ? (a) : (b))
@@ -186,6 +187,10 @@ namespace LinBox
 		void start (const char *description,
 			    const char *fn = (const char *) 0,
 			    unsigned long len = 0);
+		void start (std::string description,
+			    const char *fn = (const char *) 0,
+			    unsigned long len = 0);
+
 
 		/** @internal
 		 * Start a new iteration.
@@ -518,6 +523,11 @@ namespace LinBox
 			report ((MessageLevel) msglevel, msgclass) << msg << std::endl;
 		}
 
+		void start (std::string id, const char *msg, long msglevel, const char *msgclass)
+		{
+			start(id.c_str(),msg,msglevel,msgclass);
+		}
+
 		/** @internal
 		 * Stop an activity.
 		 * @param msg Message to print
@@ -624,7 +634,7 @@ namespace LinBox
 			const char              *_fn;
 			unsigned long            _len;
 			unsigned long            _progress;
-		 Givaro::Timer                    _timer;
+		 Givaro::RealTimer                    _timer;
 			Estimator                _estimate;
 		};
 
@@ -838,11 +848,11 @@ namespace LinBox
 		inline void setPrintParameters (unsigned long, unsigned long , const char *)
 	       	{}
 		inline bool isPrinted (unsigned long , unsigned long , const char * = (const char *) 0)
-		{
-		       	return false;
-		}
+		{ return false; }
 	};
 
+	class ActivityState {};
+
 	class Commentator {
 	public:
 #if 0
@@ -874,7 +884,7 @@ namespace LinBox
 			LEVEL_UNIMPORTANT  =  3
 		};
 
-		inline std::ostream &report (long , const char *)
+		inline std::ostream &report (long level = LEVEL_IMPORTANT, const char *msg_class = INTERNAL_DESCRIPTION)
 		{
 		       	return cnull;
 		}
@@ -903,37 +913,23 @@ namespace LinBox
 		inline void setMaxDetailLevel (long )
 		{}
 		inline MessageClass &registerMessageClass (const char *, std::ostream &, unsigned long = 1, unsigned long = 2)
-		{
-		       	return _msgcls;
-		}
+		{ return _msgcls; }
 		inline MessageClass &cloneMessageClass (const char *, const char *)
-		{
-		       	return _msgcls;
-	       	}
+		{ return _msgcls; }
 		inline MessageClass &cloneMessageClass (const char *, const char *, std::ostream &)
-		{
-		       	return _msgcls;
-	       	}
+		{ return _msgcls; }
 		inline MessageClass &getMessageClass (const char *)
-		{
-		       	return _msgcls;
-	       	}
+		{ return _msgcls; }
 		inline void setPrintParameters (unsigned long , unsigned long , const char * = (const char *) 0)
 	       	{}
 		inline void setBriefReportParameters (OutputFormat , bool , bool , bool )
 	       	{}
 		inline bool isPrinted (unsigned long , unsigned long , const char *, const char * = (const char *) 0)
-		{
-		       	return false;
-	       	}
+		{ return false; }
 		inline bool isPrinted (unsigned long , const char *, const char * = (const char *) 0)
-		{
-		       	return false;
-		}
+		{ return false; }
 		inline bool isNullStream (const std::ostream &)
-		{
-		       	return true;
-		}
+		{ return true; }
 		inline void setBriefReportStream (std::ostream &)
 		{}
 		inline void setReportStream (std::ostream &)
@@ -951,9 +947,12 @@ namespace LinBox
 		inline void report (const char *, long , const char *)
 	       	{}
 		inline bool printed (long , const char *)
-		{
-		       	return false;
-		}
+		{ return false; }
+
+		ActivityState saveActivityState () const
+		{ return ActivityState(); }
+		void restoreActivityState (ActivityState state)
+		{}
 
 		std::ofstream cnull;
 
@@ -984,7 +983,7 @@ namespace LinBox
 #endif
 
 		MessageClass _msgcls;
-	};
+	}; // class (disabled) Commentator
 
 // 	// Default global commentator
 // 	extern Commentator commentator;
@@ -993,24 +992,24 @@ namespace LinBox
 
 #endif // DISABLE_COMMENTATOR
 
-namespace LinBox 
+namespace LinBox
 {
 	// Default static commentator
     Commentator& commentator() {
         static Commentator internal_static_commentator;
         return internal_static_commentator;
-    }   
+    }
     Commentator& commentator(std::ostream& stream) {
         static Commentator internal_static_commentator(stream);
         return internal_static_commentator;
-    }   
+    }
 }
 
 
 
 
-#include "fflas-ffpack/utils/args-parser.h"
-namespace LinBox 
+#include "linbox/util/args-parser.h"
+namespace LinBox
 {
     void parseArguments (int argc, char **argv, Argument *args, bool printDefaults = true) {
         for (int i = 1; i < argc; ++i) {
@@ -1021,8 +1020,8 @@ namespace LinBox
                 } else {
                         // Skip the argument next to "-xxx"
                         // except if next argument is a switch
-                    if ( ((i+1) < argc) && 
-                         (argv[i+1][0] != '-') ) { 
+                    if ( ((i+1) < argc) &&
+                         (argv[i+1][0] != '-') ) {
                         ++i;
                     }
                 }
@@ -1037,11 +1036,10 @@ namespace LinBox
 
 #endif // __LINBOX_commentator_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/commentator.inl b/linbox/util/commentator.inl
index fe300f8..19230bd 100644
--- a/linbox/util/commentator.inl
+++ b/linbox/util/commentator.inl
@@ -25,7 +25,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  * ========LICENCE========
  *
- * This file implements the C++ interface to commentators (for
+ * This file implements the ++C interface to commentators (for
  * providing runtime commentary to the user)
  */
 
@@ -88,10 +88,11 @@ namespace LinBox
 
 	Commentator::Commentator () :
 		// cnull (new nullstreambuf)
-// 		cnull ("/dev/null")
-		cnull (0)
+		cnull ("/dev/null")
+		// cnull (0) // this is not right (clang/valgrind complain)
 		, _estimationMethod (BEST_ESTIMATE), _format (OUTPUT_CONSOLE),
 		_show_timing (true), _show_progress (true), _show_est_time (true)
+		,_last_line_len(0)
 	{
 		//registerMessageClass (BRIEF_REPORT,         std::clog, 1, LEVEL_IMPORTANT);
 		registerMessageClass (BRIEF_REPORT,         _report, 1, LEVEL_IMPORTANT);
@@ -109,20 +110,22 @@ namespace LinBox
 		cnull (0)
 		, _estimationMethod (BEST_ESTIMATE), _format (OUTPUT_CONSOLE),
 		_show_timing (true), _show_progress (true), _show_est_time (true)
+		,_last_line_len(0)
 	{
 		//registerMessageClass (BRIEF_REPORT,         out, 1, LEVEL_IMPORTANT);
 		registerMessageClass (BRIEF_REPORT,         out, 1, LEVEL_IMPORTANT);
-		registerMessageClass (PROGRESS_REPORT,      _report);
-		registerMessageClass (TIMING_MEASURE,       _report);
-		registerMessageClass (TIMING_ESTIMATE,      _report);
-		registerMessageClass (PARTIAL_RESULT,       _report);
-		registerMessageClass (INTERNAL_WARNING,     _report, 10, LEVEL_NORMAL);
-		registerMessageClass (INTERNAL_ERROR,       _report, 10, LEVEL_NORMAL);
-		registerMessageClass (INTERNAL_DESCRIPTION, _report);
+		registerMessageClass (PROGRESS_REPORT,      out);
+		registerMessageClass (TIMING_MEASURE,       out);
+		registerMessageClass (TIMING_ESTIMATE,      out);
+		registerMessageClass (PARTIAL_RESULT,       out);
+		registerMessageClass (INTERNAL_WARNING,     out, 10, LEVEL_NORMAL);
+		registerMessageClass (INTERNAL_ERROR,       out, 10, LEVEL_NORMAL);
+		registerMessageClass (INTERNAL_DESCRIPTION, out);
 	}
 
 	Commentator::~Commentator()
 	{
+	    _report << "That's all, Folks!" << std::endl;
 		std::map <const char *, MessageClass *, C_str_Less >::iterator i;
 		for (i = _messageClasses.begin (); i != _messageClasses.end (); ++i)
 			delete i->second;
@@ -151,6 +154,11 @@ namespace LinBox
 		new_act->_timer.start ();
 	}
 
+	void Commentator::start (std::string description, const char *fn, unsigned long len)
+	{
+		start(description.c_str(),fn,len);
+	}
+
 	void Commentator::startIteration (unsigned int iter, unsigned long len)
 	{
 		std::ostringstream str;
@@ -163,7 +171,7 @@ namespace LinBox
 
 	void Commentator::stop (const char *msg, const char *long_msg, const char *fn)
 	{
-		double realtime, usertime, systime;
+		double realtime; //, usertime, systime;
 		Activity *top_act;
 
 		linbox_check (_activities.top () != (Activity *) 0);
@@ -176,13 +184,13 @@ namespace LinBox
 
 		top_act->_timer.stop ();
 
-		realtime = top_act->_timer.realtime ();
-		usertime = top_act->_timer.usertime ();
-		systime = top_act->_timer.systime ();
+		realtime = top_act->_timer.time ();
+		//usertime = top_act->_timer.usertime ();
+		//systime  = top_act->_timer.systime ();
 
 		if (realtime < 0) realtime = 0;
-		if (usertime < 0) usertime = 0;
-		if (systime < 0) systime = 0;
+		//if (usertime < 0) usertime = 0;
+		//if (systime < 0) systime = 0;
 
 		if (fn != (const char *) 0 &&
 		    _activities.size () > 0 &&
@@ -206,19 +214,19 @@ namespace LinBox
 			std::ostream &output = report (LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
 			output.precision (4);
 			output << "Finished activity (rea: " << realtime << "s, cpu: ";
-			output.precision (4);
-			output << usertime << "s, sys: ";
-			output.precision (4);
-			output << systime << "s): " << long_msg << std::endl;
+			//output.precision (4);
+			//output << usertime << "s, sys: ";
+			//output.precision (4);
+			//output << systime << "s): " << long_msg << std::endl;
 		}
 		else if (isPrinted (_activities.size (), LEVEL_IMPORTANT, INTERNAL_DESCRIPTION, fn)) {
 			std::ostream &output = report (LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
 			output.precision (4);
 			output << "Completed activity: " << top_act->_desc << " (r: " << realtime << "s, u: ";
-			output.precision (4);
-			output << usertime << "s, s: ";
-			output.precision (4);
-			output << systime << "s) " << long_msg << std::endl;
+			//output.precision (4);
+			//output << usertime << "s, s: ";
+			//output.precision (4);
+			//output << systime << "s) " << long_msg << std::endl;
 		}
 
 		delete top_act;
@@ -229,16 +237,16 @@ namespace LinBox
 		linbox_check (_activities.top () != (Activity *) 0);
 
 		Activity *act = _activities.top ();
-	 Givaro::Timer tmp = act->_timer;
+		Givaro::RealTimer tmp = act->_timer;
 		act->_timer.stop ();
 
 		if (k == -1)
-			act->_progress++;
+			++(act->_progress);
 		else
-			act->_progress = k;
+			act->_progress = (unsigned long)k;
 
 		if (len != -1)
-			act->_len = len;
+			act->_len = (unsigned long) len;
 
 		if (act->_progress > act->_len)
 			act->_len = act->_progress;
@@ -247,7 +255,7 @@ namespace LinBox
 		rep.precision (3);
 		rep.setf (std::ios::fixed);
 		rep << "Progress: " << act->_progress << " out of " << act->_len
-		<< " (" << act->_timer.realtime () << "s elapsed)" << std::endl;
+		<< " (" << act->_timer.time () << "s elapsed)" << std::endl;
 
 		if (_show_progress && isPrinted (_activities.size () - 1, LEVEL_IMPORTANT, BRIEF_REPORT, act->_fn))
 			updateActivityReport (*act);
@@ -258,20 +266,24 @@ namespace LinBox
 	{
 		linbox_check (msg_class != (const char *) 0);
 
-		if (!isPrinted (_activities.size (), level, msg_class,
-				(_activities.size () > 0) ? _activities.top ()->_fn : (const char *) 0))
-			return cnull;
+	    _report << "$$(" << _activities.size () << ", " << level << ", " << msg_class << ")";
+#if 0
+	    if (!isPrinted (_activities.size (), level, msg_class,
+				    (_activities.size () > 0) ? _activities.top ()->_fn : (const char *) 0))
+		    return cnull;
 
-		MessageClass &messageClass = getMessageClass (msg_class);
+	    MessageClass &messageClass = getMessageClass (msg_class);
 
-		return messageClass._stream;
+	    return messageClass._stream;
+#endif
+		return _report;
 	}
 
 	void Commentator::indent (std::ostream &stream) const
 	{
 		unsigned int i;
 
-		for (i = 0; i < _activities.size (); i++)
+		for (i = 0; i < _activities.size (); ++i)
 			stream << "  ";
 	}
 
@@ -390,7 +402,7 @@ namespace LinBox
 		setMessageClassStream (INTERNAL_WARNING,     stream);
 		setMessageClassStream (INTERNAL_DESCRIPTION, stream);
 
-		if (stream == getMessageClass (BRIEF_REPORT)._stream)
+		if (&stream == &(getMessageClass (BRIEF_REPORT)._stream))
 			getMessageClass (BRIEF_REPORT).setMaxDepth (0);
 	}
 
@@ -440,21 +452,21 @@ namespace LinBox
 	void Commentator::updateActivityReport (Activity &activity)
 	{
 		MessageClass &messageClass = getMessageClass (BRIEF_REPORT);
-		unsigned int i,  old_len;
 		std::ostringstream str;
 		double percent = (double) activity._progress / (double) activity._len * 100.0;
 
 		if (_format == OUTPUT_CONSOLE) {
 			if (!messageClass.isPrinted (_activities.size (), LEVEL_IMPORTANT, activity._fn)) {
 				if (_show_progress) {
-					for (i = 0; i < _last_line_len; i++)
+			unsigned int i,  old_len;
+					for (i = 0; i < _last_line_len; ++i)
 						messageClass._stream << '\b';
 					str.width (3);
-					str << floor (percent + 0.5) << '%' << std::ends;
+					str << floor (percent + 0.5) << "%" << std::ends;
 					old_len = _last_line_len;
-					_last_line_len = (int)strlen (str.str ().c_str ());
+					_last_line_len = (unsigned int)strlen (str.str ().c_str ());
 					messageClass._stream << str.str ();
-					for (int ii = 0; ii < (int) (old_len - _last_line_len); ii++)
+					for (int ii = 0; ii < (int) (old_len - _last_line_len); ++ii)
 						messageClass._stream << ' ';
 				}
 			}
@@ -494,25 +506,25 @@ namespace LinBox
 		if (_format == OUTPUT_CONSOLE) {
 			if (!messageClass.isPrinted (_activities.size () + 1, LEVEL_UNIMPORTANT, activity._fn)) {
 				if (_show_progress)
-					for (i = 0; i < _last_line_len; i++)
+					for (i = 0; i < _last_line_len; ++i)
 						messageClass._stream << '\b';
 
 				messageClass._stream << msg;
 
 				if (_show_timing)
-					messageClass._stream << " (" << activity._timer.usertime () << " s)" << std::endl;
+					messageClass._stream << " (" << activity._timer.time () << " s)" << std::endl;
 				else
 					messageClass._stream << std::endl;
 			}
 			else if (messageClass.isPrinted (_activities.size (), LEVEL_UNIMPORTANT, activity._fn)) {
-				for (i = 0; i < _activities.size (); i++)
+				for (i = 0; i < _activities.size (); ++i)
 					messageClass._stream << "  ";
 
 				messageClass._stream << msg;
 				//messageClass._stream << "Done: " << msg;
 
 				if (_show_timing)
-					messageClass._stream << " (" << activity._timer.usertime () << " s)" << std::endl;
+					messageClass._stream << " (" << activity._timer.time () << " s)" << std::endl;
 				else
 					messageClass._stream << std::endl;
 			}
@@ -520,7 +532,7 @@ namespace LinBox
 			messageClass._smart_streambuf.stream ().flush ();
 		}
 		else if (_format == OUTPUT_PIPE) {
-			for (i = 0; i < _activities.size (); i++)
+			for (i = 0; i < _activities.size (); ++i)
 				messageClass._stream << "  ";
 
 			if (((_show_progress || _show_est_time) && activity._len > 0) ||
@@ -679,10 +691,10 @@ namespace LinBox
 		Configuration::const_iterator i;
 		std::list <std::pair <unsigned long, unsigned long> >::const_iterator j;
 
-		for (i = _configuration.begin (); i != _configuration.end (); i++) {
+		for (i = _configuration.begin (); i != _configuration.end (); ++i) {
 			std::cerr << "Configuration (" << (*i).first << "):" << std::endl;
 
-			for (j = (*i).second.begin (); j != (*i).second.end (); j++)
+			for (j = (*i).second.begin (); j != (*i).second.end (); ++j)
 				std::cerr << "  Depth: " << (*j).first << ", Level: " << (*j).second << std::endl;
 
 			std::cerr << std::endl;
@@ -755,11 +767,10 @@ namespace LinBox
 }
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/debug.C b/linbox/util/debug.C
index f7a272b..a8b44da 100644
--- a/linbox/util/debug.C
+++ b/linbox/util/debug.C
@@ -1,4 +1,3 @@
-
 /* linbox/util/debug.C
  * Copyright (C) 2001 Bradford Hovinen
  *
@@ -41,11 +40,10 @@ namespace LinBox
 	std::ostream *NotImplementedYet::_errorStream ;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/debug.h b/linbox/util/debug.h
index c671abb..291d803 100644
--- a/linbox/util/debug.h
+++ b/linbox/util/debug.h
@@ -53,11 +53,11 @@
 #  ifdef __GNUC__
 #    define linbox_check(check) \
         if (!(check)) \
-                 throw LinBox::PreconditionFailed (__func__, __FILE__, __LINE__, #check); //BB : should work on non gnu compilers too
+                 throw ::LinBox::PreconditionFailed (__func__, __FILE__, __LINE__, #check); //BB : should work on non gnu compilers too
 #  else
 #    define linbox_check(check) \
         if (!(check)) \
-                 throw LinBox::PreconditionFailed (__FILE__, __LINE__, #check);
+                 throw ::LinBox::PreconditionFailed (__FILE__, __LINE__, #check);
 #  endif
 #endif
 
@@ -65,7 +65,10 @@
      std::cout << "*** Warning *** " << std::endl << __func__ << " in " << __FILE__ << ':' << __LINE__ << " is not tested" << std::endl;
 
 #define THIS_CODE_MAY_NOT_COMPILE_AND_IS_NOT_TESTED \
-" *** Warning ***  this piece of code is not compiled by default and may not work"
+throw(" *** Warning ***  this piece of code is not compiled by default and may not work")
+
+#define LB_FILE_LOC \
+	__func__,__FILE__,__LINE__
 
 namespace LinBox
 { /*  Preconditions,Error,Failure,NotImplementedYet */
@@ -164,7 +167,7 @@ namespace LinBox
 		NotImplementedYet(const char * function,
 				  const char* file,
 				  int line,
-				  const char * why='\0')
+				  const char * why="\0")
 		{
 			if (_errorStream == (std::ostream *) 0)
 				_errorStream = &std::cerr;
@@ -194,9 +197,9 @@ namespace LinBox
 		 * @param what     what happened ? should not be NULL...
 		 */
 		LinBoxFailure(const char * function,
-			      const char* file,
-			      int line,
-			      const char * what='\0')
+			      const char* file="\0",
+			      int line=-1,
+			      const char * what="\0")
 		{
 			if (_errorStream == (std::ostream *) 0)
 				_errorStream = &std::cerr;
@@ -226,8 +229,8 @@ namespace LinBox
 		 * @param what     what happened ? should not be NULL...
 		 */
 		LinBoxError(const char * what,
-			    const char * function='\0',
-			    const char* file='\0',
+			    const char * function="\0",
+			    const char* file="\0",
 			    int line=-1)
 		{
 			if (_errorStream == (std::ostream *) 0)
@@ -321,7 +324,7 @@ namespace LinBox
 
 
 
-#ifdef LinBoxSrcOnly
+#if defined(LinBoxSrcOnly) or defined(LinBoxTestOnly)
 // for all-source compilation
 #include "linbox/util/debug.C"
 #endif
@@ -331,11 +334,10 @@ namespace LinBox
 #endif // __LINBOX_util_debug_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/error.C b/linbox/util/error.C
index f0c588e..ce674d3 100644
--- a/linbox/util/error.C
+++ b/linbox/util/error.C
@@ -37,11 +37,10 @@ namespace LinBox
 }
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/error.h b/linbox/util/error.h
index 54f2492..6a8d9ae 100644
--- a/linbox/util/error.h
+++ b/linbox/util/error.h
@@ -38,7 +38,7 @@ namespace LinBox
 	class LinboxError {
 		static const size_t max_error_string = 256;
 	public:
-		LinboxError (const char* msg = '\0') {
+		LinboxError (const char* msg = "\0") {
 			std::strncpy(strg, msg, max_error_string);
 			strg[max_error_string-1] = 0;
 		};
@@ -99,11 +99,10 @@ namespace LinBox
 #endif // __LINBOX_util_error_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/field-axpy.h b/linbox/util/field-axpy.h
index 5dc9719..f2ccf1c 100644
--- a/linbox/util/field-axpy.h
+++ b/linbox/util/field-axpy.h
@@ -32,19 +32,22 @@ namespace LinBox
 {
 	/** FieldAXPY object.
 	 *
-	 * This class is used to wrap the operation <code>y = y + a * x</code>. It acts as an
-	 * accumulator for \c y.
+	 * A fieldAXPY is an accumulator, allowing to add a number of field elements or products
+	 * in an unnormalized state, delaying modular reduction as long as possible.
+	 * This class containse a value y and wraps the operations <code>y = y + a * x</code> and
+	 * <code>y = y + a</code>.
 	 *
+	 * This default instance does no optimization, no delayed modular reduction.
 	 * Through the use of template specialization, objects of this type can
-	 * be used to speed up vector dot product operations. In particular, for
-	 * finite fields, dividing by the modulus and taking the remainder is
-	 * expensive. In many cases, this can be postponed until the end of the
+	 * be used to speed up operations such as vector dot product operations.
+	 * In particular, for finite fields, dividing by the modulus and taking the remainder
+	 * is expensive. In many cases, this can be postponed until the end of the
 	 * dot product operation, thus vastly improving performance.
 	 *
-	 * This object is constructed from the field object \c F and a field
-	 * element a which it stores and thus can use several times.  The use of
-	 * an object instead of a static variable to store the element a makes
-	 * this method thread-safe.
+	 * FieldAXPY<Fld> is an assignable type.  It is constructed from a field instance.
+	 * The methods are mulacc(), accumulate(), operator=(), reset(), get(), and field().
+	 * Of a const instance you can access get() and field().
+	 * [Note: get() may renormalize the value, but it remains constant as a field element.]
 	 *
 	 * @param Field \ref LinBox @link Fields field at endlink
 	 */
@@ -54,15 +57,14 @@ namespace LinBox
 
 		/// Definition of element type
 		typedef typename Field::Element Element;
+		typedef Element Abnormal; // the type of the unnormalized values
 
 		/** Constructor.
-		 * A faxpy object if constructed from a Field and a field element.
-		 * Copies of this objects are stored in the faxpy object.
 		 * @param F field F in which arithmetic is done
 		 */
 		FieldAXPY (const Field &F) :
-		       	_field (F)
-		{ _field.init (_y, 0); }
+		       	_field (&F)
+		{ field().assign(_y, field().zero); }
 
 		/** Copy constructor.
 		 * @param faxpy
@@ -74,8 +76,12 @@ namespace LinBox
 		/** Assignment operator
 		 * @param faxpy
 		 */
-		FieldAXPY<Field> &operator = (const FieldAXPY &faxpy)
-			{ _y = faxpy._y; return *this; }
+		FieldAXPY<Field> &operator = (const FieldAXPY<Field> &faxpy)
+			{
+				_field = faxpy.field();
+				_y = faxpy._y;
+				return *this;
+			}
 
 		/** Add a*x to y
 		 * y += a*x.
@@ -83,40 +89,30 @@ namespace LinBox
 		 * @param x constant reference to element x
 		 */
             inline Element& mulacc (const Element &a, const Element &x)
-                { return _field.axpyin (_y, a, x); }
+                { return field().axpyin (_y, a, x); }
 
             inline Element& accumulate (const Element &t)
-                { return _field.addin (_y, t); }
+                { return field().addin (_y, t); }
 
 		/** Retrieve y
 		 *
 		 * Performs the delayed modding out if necessary
 		 */
-		inline Element &get (Element &y) { y = _y; return y; }
-
-		/** Assign method.
-		 * Stores new field element for arithmetic.
-		 * @return reference to self
-		 * @param y constant reference to element a
-		 */
-		inline FieldAXPY &assign (const Element y)
-		{
-			_y = y;
-			return *this;
-		}
+		inline Element &get (Element &y) const { return y = _y; }
 
+		/// reset value to zero.
 		inline void reset() {
-			_field.init(_y,0);
+			field().assign(_y,field().zero);
 		}
 
+		inline const Field& field() const { return *_field; }
 	    protected:
 
 		/// Field in which arithmetic is done
-		/// Not sure why it must be mutable, but the compiler complains otherwise
-		Field _field;
+		const Field *_field;
 
-		/// Field element for arithmetic
-		Element _y;
+		/// Accumulator, unnormalized field element.
+		Abnormal _y;
 
 	}; // class FieldAXPY
 
diff --git a/linbox/util/formats/Makefile.in b/linbox/util/formats/Makefile.in
deleted file mode 100644
index c71e2aa..0000000
--- a/linbox/util/formats/Makefile.in
+++ /dev/null
@@ -1,579 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/util/formats
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/util/formats
-pkgincludesub_HEADERS = \
-	generic-dense.h			\
-	maple.h				\
-	matrix-market.h			\
-	sms.h				\
-	matrix-stream-readers.h		\
-	sparse-row.h
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/util/formats/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps linbox/util/formats/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
-	done
-
-uninstall-pkgincludesubHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
-	for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool ctags distclean distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-pkgincludesubHEADERS install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/util/formats/maple.h b/linbox/util/formats/maple.h
index 80b3eff..e4a333b 100644
--- a/linbox/util/formats/maple.h
+++ b/linbox/util/formats/maple.h
@@ -39,10 +39,11 @@
 
 #include <string>
 #include <sstream>
+#include <cstring>
 #include "linbox/util/matrix-stream.h"
 
 #if 0
-namespace LinBox__FORMAT_MAPLE_H
+namespace LinBox__Tag::FileFormat::Maple_H
 {
 	static const char* name = "Maple Text Format";
 	static const char* shortname = "maple";
@@ -105,7 +106,7 @@ namespace LinBox
 				i = int(pastNum - cand);
 			}
 			else {
-				currentCol = i;
+				currentCol = (size_t)i;
 				return GOOD;
 			}
 
@@ -127,14 +128,14 @@ namespace LinBox
 				i = int(pastNum - cand);
 			}
 			else {
-				currentCol = i;
+				currentCol = (size_t)i;
 				return GOOD;
 			}
 
 			while( cand[i] && isspace(cand[i]) ) ++i;
 			if( !cand[i] ) return GOOD;
 			if( cand[i] != ',' ) return BAD_FORMAT;
-			currentCol = i;
+			currentCol = (size_t)i;
 			return GOOD;
 		}
 
@@ -377,11 +378,11 @@ namespace LinBox
 				candidate = strpbrk(candidate+1,"mM");
 			}
 
-			bool lineend = false;
+			// bool lineend = false;
 			int i = 0;
 
 			if( candidate ) {
-				lineend = currentCol <= 5;
+				bool lineend = (currentCol <= 5);
 				i = int(currentCol);
 				if( !lineend ) currentCol = 5;
 				while( !lineend && currentCol < 7 ) {
@@ -444,7 +445,9 @@ namespace LinBox
 		}
 
 	public:
-		MapleReader() {
+		MapleReader() :
+                        openParen(false),array(false)
+		{
 			currentCol = currentRow = 0;
 			stin = NULL;
 		}
@@ -456,10 +459,10 @@ namespace LinBox
 		bool isSparse() const { return !array; }
 
 		const char* getName() const
-		{ return "Maple Text Format"; }// LinBox__FORMAT_MAPLE_H::name; }
+		{ return "Maple Text Format"; }// LinBox__Tag::FileFormat::Maple_H::name; }
 
 		const char* shortName() const
-		{ return "maple"; }// LinBox__FORMAT_MAPLE_H::shortname;
+		{ return "maple"; }// LinBox__Tag::FileFormat::Maple_H::shortname;
 };
 
 
@@ -468,11 +471,10 @@ namespace LinBox
 #endif // __LINBOX_format_maple_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/formats/matrix-market.h b/linbox/util/formats/matrix-market.h
index 125ee81..b312b02 100644
--- a/linbox/util/formats/matrix-market.h
+++ b/linbox/util/formats/matrix-market.h
@@ -33,6 +33,7 @@
 #include <string>
 #include <sstream>
 #include "linbox/util/matrix-stream.h"
+#include "linbox/integer.h"
 
 #if 0
 namespace LinBox__FORMAT_MATRIX_MARKET_H
@@ -45,12 +46,14 @@ namespace LinBox__FORMAT_MATRIX_MARKET_H
 namespace LinBox
 {
 
+#if 0
 #ifndef __LINBOX_integer_H
 	class integer;
 #endif
+#endif
 
 #if 1 /* Unused */
-	bool equalCaseInsensitive(const std::string s1, const char* s2)
+	bool equalCaseInsensitive(const std::string &s1, const char* s2)
 	{
 		int len = int(s1.size());
 		int counter = 0;
@@ -97,8 +100,10 @@ namespace LinBox
 				this->ms->readWhiteSpace();
 			}
 
-			if( this->sin->eof() ) return END_OF_FILE;
-			if( !this->sin->good() ) return BAD_FORMAT;
+                        if (entriesLeft != 0) {
+                                if( this->sin->eof()) return END_OF_FILE;
+                                if( !this->sin->good()) return BAD_FORMAT;
+                        }
 
 			this->knowM = this->knowN = true;
 			currentCol = currentRow = 1;
@@ -143,7 +148,7 @@ namespace LinBox
 				if( !this->sin->good() ) return BAD_FORMAT;
 			}
 
-			if( pattern ) this->ms->getField().init(v,(integer)1);
+			if( pattern ) this->ms->getField().assign(v,this->ms->getField().one);
 			else {
 				this->ms->readWhiteSpace();
 				this->ms->getField().read(*(this->sin),v);
@@ -166,8 +171,13 @@ namespace LinBox
 			std::string st(firstLine);
 			std::stringstream stin(st);
 
-			if( stin.get() != '%' || stin.get() != '%' )
+			//bb: cppcheck complained.
+			// if( stin.get() != '%' || stin.get() != '%' ) return NO_FORMAT;
+			if( stin.get() != '%')
+				return NO_FORMAT;
+			else if (stin.get() != '%' )
 				return NO_FORMAT;
+
 			if( !stin.good() ) return NO_FORMAT;
 
 			std::string s;
@@ -211,6 +221,10 @@ namespace LinBox
 		{
 			entriesLeft = -1;
 			currentCol = currentRow = 0;
+			//bb : why not intialised ?
+			array     = false ;
+			pattern   = false ;
+			symmetric = false ;
 		}
 
 		bool isSparse() const
@@ -234,11 +248,10 @@ namespace LinBox
 #endif //__LINBOX_format_matrix_market_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/formats/matrix-stream-readers.h b/linbox/util/formats/matrix-stream-readers.h
index bc4381d..cfbfc4f 100644
--- a/linbox/util/formats/matrix-stream-readers.h
+++ b/linbox/util/formats/matrix-stream-readers.h
@@ -43,20 +43,21 @@
 #include "matrix-market.h"
 #include "maple.h"
 
-#define __MATRIX_STREAM_READERDEFS \
-	addReader( new SMSReader<Field>() ); \
-	addReader( new SparseRowReader<Field>() ); \
+#define __MATRIX_STREAM_READERDEFS                    \
+do {                                                  \
+	addReader( new SMSReader<Field>()          ); \
+	addReader( new SparseRowReader<Field>()    ); \
 	addReader( new MatrixMarketReader<Field>() ); \
-	addReader( new MapleReader<Field>() ); \
-	addReader( new DenseReader<Field>() );
+	addReader( new MapleReader<Field>()        ); \
+	addReader( new DenseReader<Field>()        ); \
+} while (false)
 
 #endif //__LINBOX_matrix_stream_readers_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/formats/sms.h b/linbox/util/formats/sms.h
index bc91af7..56af418 100644
--- a/linbox/util/formats/sms.h
+++ b/linbox/util/formats/sms.h
@@ -30,8 +30,8 @@
  * last line: 0 0 0
  */
 
-#ifndef __LINBOX_sms_H
-#define __LINBOX_sms_H
+#ifndef __LINBOX_util_formats_sms_H
+#define __LINBOX_util_formats_sms_H
 
 #include <cstdlib>
 
@@ -112,8 +112,8 @@ namespace LinBox
 
 			if( m == 0 && n == 0 ) return END_OF_MATRIX;
 
-			m -= _base;
-			n -= _base;
+			m -= (size_t)_base;
+			n -= (size_t) _base;
 
 			if( m >= this->_m ||
 			    n >= this->_n ) return BAD_FORMAT;
@@ -135,14 +135,13 @@ namespace LinBox
 
 }
 
-#endif // __LINBOX_sms_H
+#endif // __LINBOX_util_formats_sms_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/formats/sparse-row.h b/linbox/util/formats/sparse-row.h
index a545e1b..7c7e8ec 100644
--- a/linbox/util/formats/sparse-row.h
+++ b/linbox/util/formats/sparse-row.h
@@ -109,7 +109,7 @@ namespace LinBox
 			if( this->sin->eof() ) return END_OF_FILE;
 			if( !this->sin->good() ) return BAD_FORMAT;
 
-			n -= _base;
+			n -= (size_t)_base;
 			m = currentRow;
 			--colsLeft;
 
diff --git a/linbox/util/iml_wrapper.h b/linbox/util/iml_wrapper.h
index ac1cd48..743750f 100644
--- a/linbox/util/iml_wrapper.h
+++ b/linbox/util/iml_wrapper.h
@@ -1,6 +1,6 @@
 
 /* Copyright (C) 2011 LinBox
- * Written by BB <brice.boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  *
  *
  *
@@ -95,7 +95,7 @@ namespace IML {
 	}
 
 #define REINTERP_IML_CONST(GivMat) \
-	reinterpret_cast<mpz_t*>(const_cast<PID_integer::Element*>((GivMat)))
+	reinterpret_cast<mpz_t*>(const_cast<Givaro::ZRing<Integer>::Element*>((GivMat)))
 #define REINTERP_IML(GivMat) \
 	reinterpret_cast<mpz_t*>((GivMat))
 
diff --git a/linbox/util/matrix-stream.h b/linbox/util/matrix-stream.h
index e1d16a2..83ee927 100644
--- a/linbox/util/matrix-stream.h
+++ b/linbox/util/matrix-stream.h
@@ -22,8 +22,8 @@
  * ========LICENCE========
  */
 
-#ifndef __LINBOX_matrix_stream_H
-#define __LINBOX_matrix_stream_H
+#ifndef __LINBOX_util_matrix_stream_H
+#define __LINBOX_util_matrix_stream_H
 
 /* matrix-stream.h
  * Take a file or stream of a matrix, return (row, column, value) triples from
@@ -42,6 +42,8 @@
 #include <iostream>
 #include <queue>
 #include <vector>
+#include "linbox/linbox-config.h"
+#include "linbox/integer.h"
 
 namespace LinBox
 {
@@ -231,7 +233,7 @@ class MatrixStream {
 	const Field& f;
 
     /** To ensure no one makes a copy of an instance of this class */
-	MatrixStream( const MatrixStream<Field>& )  ;// BB si {} pbm d'initialisation
+	MatrixStream( const MatrixStream<Field>& )  ;
 
     /** Called by the constructors to get things going. */
 	void init();
@@ -239,6 +241,7 @@ class MatrixStream {
     /** Adds the given MatrixStreamReader to the readers std::vector. */
 	void addReader( MatrixStreamReader<Field>* );
 
+
     public:
 
     /** Constructor from an input stream.
@@ -250,7 +253,11 @@ class MatrixStream {
     	MatrixStream( const Field& fld, std::istream& in );
 
     /** Destructor */
-	~MatrixStream() { delete reader; }
+	~MatrixStream()
+	{
+		if (reader != NULL)
+			delete reader;
+	}
 
     /** Re initiliaze after one matrix has been read. */
 	void newmatrix();
@@ -307,6 +314,7 @@ class MatrixStream {
 
     /** Get the Field that was passed to the constructor. */
 	const Field& getField() const { return f; }
+	const Field& field() const { return f; }
 
     /** Get a brief description of the format of the matrix being read. */
 	const char* getFormat() const { return reader->getName(); }
@@ -324,14 +332,13 @@ class MatrixStream {
 
 #include "matrix-stream.inl"
 
-#endif // __LINBOX_matrix_stream_H
+#endif // __LINBOX_util_matrix_stream_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/matrix-stream.inl b/linbox/util/matrix-stream.inl
index 96759e0..bd5beec 100644
--- a/linbox/util/matrix-stream.inl
+++ b/linbox/util/matrix-stream.inl
@@ -21,8 +21,8 @@
  * ========LICENCE========
  */
 
-#ifndef __LINBOX_matrix_stream_INL
-#define __LINBOX_matrix_stream_INL
+#ifndef __LINBOX_util_matrix_stream_INL
+#define __LINBOX_util_matrix_stream_INL
 
 #include "linbox/util/formats/matrix-stream-readers.h"
 
@@ -93,7 +93,7 @@ namespace LinBox
 	(std::vector<Element> &array)
 	{
 		MatrixStreamError mse = GOOD;
-		size_t c = 0,loc,i,j;
+		size_t c = 0,i,j;
 		Element v;
 
 		while( true ) {
@@ -103,7 +103,7 @@ namespace LinBox
 				mse = getColumns(c);
 				if( mse > GOOD ) break;
 			}
-			loc = i*c+j;
+			size_t loc = i*c+j;
 			if( loc >= array.size() )
 				array.resize(c ? (i+1)*c : loc+1);
 			array[loc] = v;
@@ -137,6 +137,7 @@ namespace LinBox
 		while( !knowM ) {
 			if( atEnd ) return END_OF_MATRIX;
 			toRet = saveNext();
+			m = _m; // when no entries, it is good
 			if( toRet > GOOD ) return toRet;
 		}
 		m = _m;
@@ -150,6 +151,7 @@ namespace LinBox
 		while( !knowN ) {
 			if( atEnd ) return END_OF_MATRIX;
 			toRet = saveNext();
+			n = _n; // when no entries, it is good
 			if( toRet > GOOD ) return toRet;
 		}
 		n = _n;
@@ -184,7 +186,7 @@ namespace LinBox
 
 		//Initialize readers
 		currentError = NO_FORMAT;
-		__MATRIX_STREAM_READERDEFS
+		__MATRIX_STREAM_READERDEFS;
 		delete[] firstLine;
 
 		if( !reader ) return;
@@ -206,6 +208,8 @@ namespace LinBox
 			reader = r;
 			currentError = mse;
 		}
+		else delete r ;
+		return ;
 	}
 
 	template<class Field>
@@ -213,7 +217,12 @@ namespace LinBox
 		reader(NULL),in(i),readAnythingYet(false),f(fld)
 	{
 		init();
-		if( currentError > GOOD ) throw currentError;
+		if( currentError > GOOD ){
+#ifndef NDEBUG
+			reportError(__func__,__LINE__);
+#endif
+			throw currentError;
+		}
 	}
 
 	template<class Field>
@@ -290,7 +299,11 @@ namespace LinBox
 	template<class Field>
 	bool MatrixStream<Field>::getDimensions( size_t& m, size_t& n )
 	{
-		return( getRows(m) && getColumns(n) );
+		bool r = getRows(m);
+
+		bool c = getColumns(n); // need getColumns to be called
+
+		return( r && c );
 	}
 
 	template<class Field>
@@ -329,13 +342,12 @@ namespace LinBox
 
 } // end of namespace LinBox
 
-#endif // __LINBOX_matrix_stream_INL
+#endif // __LINBOX_util_matrix_stream_INL
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/prime-stream.h b/linbox/util/prime-stream.h
index 8a46af7..77ddd83 100644
--- a/linbox/util/prime-stream.h
+++ b/linbox/util/prime-stream.h
@@ -69,23 +69,16 @@ namespace LinBox
 		Element &next (Element &a)
 		{
 
-			/** @warning LinBox::Integer does not support prevprime */
-#if 0
 			if (_move_up == true) {
-				nextprime (_curr, _curr);
+				_IPD.nextprimein(_curr);
 				a = _curr;
 				_curr += 2L;
 			}
 			else {
-				prevprime (_curr, _curr);
+				_IPD.prevprimein(_curr);
 				a = _curr;
 				_curr -= 2L;
 			}
-#endif
-
-			nextprime (_curr, _curr);
-			a = _curr;
-			_curr += 2L;
 
 			return a;
 		}
@@ -99,6 +92,7 @@ namespace LinBox
 
 		Integer _curr;
 		bool    _move_up;
+		Givaro::IntPrimeDom _IPD; //!< empty struct dealing with primality
 
 	}; // class PrimeStream
 
diff --git a/linbox/util/timer.h b/linbox/util/timer.h
index ab71498..4532d14 100644
--- a/linbox/util/timer.h
+++ b/linbox/util/timer.h
@@ -11,20 +11,20 @@
  * get elapsed times.
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -42,6 +42,13 @@
 #define __LINBOX_timer_H
 
 #include <time.h>
+
+#ifdef __LINBOX_USE_OPENMP
+#  ifndef __GIVARO_USE_OPENMP
+#    define __GIVARO_USE_OPENMP 1
+#  endif
+#endif
+
 #include <givaro/givtimer.h>
 
 namespace LinBox {
@@ -53,11 +60,10 @@ typedef Givaro::SysTimer SysTimer ;
 
 #endif  //__LINBOX_timer_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/util/write-mm.h b/linbox/util/write-mm.h
new file mode 100644
index 0000000..2529987
--- /dev/null
+++ b/linbox/util/write-mm.h
@@ -0,0 +1,111 @@
+
+/* Copyright (C) 2012 LinBox
+ * Written by bds
+ *
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+#ifndef __LINBOX_write_mm_h
+#define __LINBOX_write_mm_h
+
+/* write-mm.h
+ * Tools to help write fields and matrices in matrix market formats.
+ *
+ */
+
+#include <iostream>
+#include <string>
+#include "linbox/integer.h"
+
+namespace LinBox
+{
+
+/// Write second line and comment part of matrix market header
+template <class Field>
+std::ostream& writeMMComment(std::ostream& os, Field& F, std::string name, std::string comment) {
+	F.write(os << "% written by LinBox::" << name << "<field>, field = ") << std::endl;
+	//F.write(os << name << "<"/*, std::string("")*/) << " >(F)" << std::endl;
+	if (comment.size() > 0)
+		os << "%" << std::endl << "% " << comment << std::endl << "%" << std::endl;
+    return os;
+}
+
+/// Write matrix market header (up to the i,j,val lines) for a sparse or structured matrix.
+template <class BB>
+std::ostream& writeMMCoordHeader(std::ostream& os, BB& A, size_t nnz, std::string name, std::string comment = "") {
+	os << "%%MatrixMarket matrix coordinate integer general" << std::endl;
+	writeMMComment(os, A.field(), name, comment);
+	os << A.rowdim() << " " << A.coldim() << " " << nnz << std::endl;
+	return os;
+}
+
+/// Write matrix market header (up to the i,j lines) for a {0,1} sparse or structured matrix.
+template <class BB>
+std::ostream& writeMMPatternHeader(std::ostream& os, BB& A, size_t nnz, std::string name, std::string comment = "") {
+	os << "%%MatrixMarket matrix coordinate pattern general" << std::endl;
+	writeMMComment(os, A.field(), name, comment);
+	os << A.rowdim() << " " << A.coldim() << " " << nnz << std::endl;
+	return os;
+}
+
+/// Write matrix market header (up to the entry lines) for a dense matrix.
+template <class BB>
+std::ostream& writeMMArrayHeader(std::ostream& os, BB& A, std::string name, std::string comment = "") {
+	os << "%%MatrixMarket matrix array integer general" << std::endl;
+	writeMMComment(os, A.field(), name, comment);
+	os << A.rowdim() << " " << A.coldim() << std::endl;
+	return os;
+}
+
+/// Generic dense matrix writer to matrix market array format (col major).
+template <class Mat>
+std::ostream& writeMMArray(std::ostream& os, Mat& A, std::string name, std::string comment = "") {
+	writeMMArrayHeader(os, A, name, comment);
+	typename Mat::Field::Element x; A.field().assign(x, A.field().zero);
+	for (size_t j = 0; j < A.coldim(); ++j)
+		for (size_t i = 0; i < A.rowdim(); ++i)
+			os << A.getEntry(x, i, j) << std::endl;
+	return os;
+}
+
+/// eltype(x) returns a string containing the name of the type of field or ring element x.
+inline std::string eltype(float x) { return "float"; }
+inline std::string eltype(double x) { return "double"; }
+inline std::string eltype(int8_t x) { return "int8_t"; }
+inline std::string eltype(int16_t x) { return "int16_t"; }
+inline std::string eltype(int32_t x) { return "int32_t"; }
+inline std::string eltype(int64_t x) { return "int64_t"; }
+inline std::string eltype(integer x) { return "integer"; }
+inline std::string eltype(uint8_t x) { return "uint8_t"; }
+inline std::string eltype(uint16_t x) { return "uint16_t"; }
+inline std::string eltype(uint32_t x) { return "uint32_t"; }
+inline std::string eltype(uint64_t x) { return "uint64_t"; }
+
+}  // end of namespace LinBox
+#endif // __write_mm_h
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/Makefile.am b/linbox/vector/Makefile.am
index afaef51..b440012 100644
--- a/linbox/vector/Makefile.am
+++ b/linbox/vector/Makefile.am
@@ -29,6 +29,7 @@ pkgincludesub_HEADERS=		\
 	light_container.h	\
 	sparse.h		\
 	vector-traits.h		\
+	vector.h		\
 	subvector.h		\
 	subiterator.h		\
 	reverse.h		\
@@ -37,6 +38,8 @@ pkgincludesub_HEADERS=		\
 	stream-gf2.h		\
 	bit-vector.h		\
 	bit-vector.inl		\
+	blas-vector.h		\
+	blas-vector.inl		\
 	vector-domain.h		\
 	vector-domain-gf2.h	\
 	vector-domain.inl       \
diff --git a/linbox/vector/Makefile.in b/linbox/vector/Makefile.in
deleted file mode 100644
index e02a917..0000000
--- a/linbox/vector/Makefile.in
+++ /dev/null
@@ -1,592 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = linbox/vector
-DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(pkgincludesubdir)"
-HEADERS = $(pkgincludesub_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-pkgincludesubdir = $(pkgincludedir)/vector
-EXTRA_DIST = \
-	vector.doxy
-
-pkgincludesub_HEADERS = \
-	pair.h			\
-	light_container.h	\
-	sparse.h		\
-	vector-traits.h		\
-	subvector.h		\
-	subiterator.h		\
-	reverse.h		\
-	random.h                \
-	stream.h		\
-	stream-gf2.h		\
-	bit-vector.h		\
-	bit-vector.inl		\
-	vector-domain.h		\
-	vector-domain-gf2.h	\
-	vector-domain.inl       \
-	vector-domain-gf2.inl
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps linbox/vector/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps linbox/vector/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgincludesubHEADERS: $(pkgincludesub_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgincludesubdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludesubdir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludesubdir)" || exit $$?; \
-	done
-
-uninstall-pkgincludesubHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgincludesub_HEADERS)'; test -n "$(pkgincludesubdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgincludesubdir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
-	for dir in "$(DESTDIR)$(pkgincludesubdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludesubHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-pkgincludesubHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool ctags distclean distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-pkgincludesubHEADERS install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-pkgincludesubHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/linbox/vector/bit-vector.h b/linbox/vector/bit-vector.h
old mode 100644
new mode 100755
index 38a8464..1e8b831
--- a/linbox/vector/bit-vector.h
+++ b/linbox/vector/bit-vector.h
@@ -1,22 +1,22 @@
 /* linbox/vector/bit-vector.h
- * Copyright (C) 2003 Bradford Hovinen
+ * Copyright (C) 2003 LinBox
  *
  * -------------------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -27,12 +27,12 @@
 #ifndef __LINBOX_bit_vector_H
 #define __LINBOX_bit_vector_H
 
+#include <linbox/linbox-config.h>
+#include "linbox/vector/vector.h"
 #include <iterator>
 #include <vector>
 #include <stdexcept>
 
-#include "linbox/vector/vector-traits.h"
-
 namespace LinBox
 {
 
@@ -72,7 +72,7 @@ namespace LinBox
 #else
 #pragma message "error SIZEOF_LONG not defined !"
 #endif
-
+ 
 	/** A vector of boolean 0-1 values, stored compactly to save space.
 	 *
 	 * BitVector provides an additional iterator, word_iterator, that gives
@@ -98,6 +98,16 @@ namespace LinBox
 		BitVector (std::vector<unsigned long> &v) :
 		       	_v (v), _size (_v.size () * __LINBOX_BITSOF_LONG) {}
 		BitVector (size_t n, bool val = false)
+		{ resize (n, val);
+	std::cerr << "bV: " << _size << ", _v: " << _v.size() << std::endl;
+		}
+
+                
+		template <class F2Field> BitVector (const F2Field&, std::vector<bool> &v)
+		{ *this = v; }
+		template <class F2Field> BitVector (const F2Field&, std::vector<unsigned long> &v) :
+		       	_v (v), _size (_v.size () * __LINBOX_BITSOF_LONG) {}
+		template <class F2Field> BitVector (const F2Field&, size_t n, bool val = false)
 		{ resize (n, val); }
 
 		// Copy constructor
@@ -173,6 +183,15 @@ namespace LinBox
 
 	}; // template <class Vector> class ReverseVector
 
+
+} // namespace LinBox
+
+#include "linbox/vector/bit-vector.inl"
+#include "linbox/vector/vector-traits.h"
+
+// RawVector for GF2
+namespace LinBox
+{
 	// Vector traits for BitVector wrapper
 	template <>
 	struct VectorTraits<BitVector>
@@ -181,11 +200,6 @@ namespace LinBox
 		typedef VectorCategories::DenseZeroOneVectorTag VectorCategory;
 	};
 
-} // namespace LinBox
-
-// RawVector for GF2
-namespace LinBox
-{
 	template <>
 	struct RawVector<bool> {
 	public:
@@ -197,16 +211,14 @@ namespace LinBox
 	};
 
 }
-#include "linbox/vector/bit-vector.inl"
 
 #endif // __LINBOX_bit_vector_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/bit-vector.inl b/linbox/vector/bit-vector.inl
old mode 100644
new mode 100755
index 8100ba8..3d7761e
--- a/linbox/vector/bit-vector.inl
+++ b/linbox/vector/bit-vector.inl
@@ -3,20 +3,20 @@
  *
  * -------------------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -83,6 +83,9 @@ namespace LinBox
 			return *this;
 		}
 
+		// fake, to satisfy compiler, can't be used.
+		std::iterator_traits<BitVector::iterator>::pointer operator & () const { return 0; }
+
 		reference &operator &= (reference &a)
 		{
 			*_word &= ~(1UL << _pos) | (a.get_bit () << (_pos - a._pos));
@@ -129,10 +132,13 @@ namespace LinBox
 		friend class const_iterator;
 		friend class const_reference;
 
+#if 0 /*  unused */
 		unsigned long neg_mask_word (void)
 		{
 			return *_word & ~(1UL << _pos);
 		}
+#endif
+
 		unsigned long get_bit ()
 		{
 			return *_word & (1UL << _pos);
@@ -144,7 +150,7 @@ namespace LinBox
 
 	inline std::istream &operator >> (std::istream &is, BitVector::reference &a)
 	{
-		bool v;
+		bool v = true;
 		is >> v;
 		a = v;
 		return is;
@@ -173,6 +179,9 @@ namespace LinBox
 
 		~const_reference () {}
 
+		// fake, to satisfy compiler, can't be used.
+		std::iterator_traits<BitVector::iterator>::pointer operator & () const { return 0; }
+
 		operator bool (void) const
 		{
 			return (*_word >> _pos) & 1UL;
@@ -207,10 +216,13 @@ namespace LinBox
 		{}
 		iterator (std::vector<unsigned long>::iterator word, uint8_t position) :
 			_ref (word, position)
-		{}
+		{} 
 		iterator (const iterator &i) :
 			std::vector<bool>::iterator(),_ref (i._ref._word, i._ref._pos)
 		{}
+		iterator (const pointer i) :
+			_ref (std::vector<unsigned long>::iterator (), 0UL)
+		{}
 
 		iterator &operator = (const iterator &i)
 		{
@@ -218,6 +230,9 @@ namespace LinBox
 			_ref._pos = i._ref._pos;
 			return *this;
 		}
+		// fakes to please compiler.  Not to be used.
+		iterator &operator = (const reference* i) { return *this; }
+		iterator &operator = (const bool* i) { return *this; }
 
 		iterator &operator ++ ()
 		{
@@ -239,13 +254,7 @@ namespace LinBox
 		iterator operator + (difference_type i) const
 		{
 			std::vector<unsigned long>::iterator new_word = _ref._word + (i >> __LINBOX_LOGOF_SIZE);
-// #ifdef __INTEL_COMPILER
-// #pragma warning(disable:2259)
-// #endif
 			uint8_t new_pos = (uint8_t) ((int)_ref._pos + (i & __LINBOX_POS_ALL_ONES));
-// #ifdef __INTEL_COMPILER
-// #pragma warning(enable:2259)
-// #endif
 
 			new_word += new_pos >> __LINBOX_LOGOF_SIZE;
 			new_pos &= __LINBOX_POS_ALL_ONES;
@@ -384,13 +393,7 @@ namespace LinBox
 		const_iterator operator + (long i) const
 		{
 			std::vector<unsigned long>::const_iterator new_word = _ref._word + (i >> __LINBOX_LOGOF_SIZE);
-// #ifdef __INTEL_COMPILER
-// #pragma warning(disable:2259)
-// #endif
 			uint8_t new_pos = (uint8_t) ((int)_ref._pos +  (i & __LINBOX_POS_ALL_ONES));
-// #ifdef __INTEL_COMPILER
-// #pragma warning(enable:2259)
-// #endif
 			new_word += new_pos >> __LINBOX_LOGOF_SIZE;
 			new_pos &= __LINBOX_POS_ALL_ONES;
 
@@ -400,13 +403,7 @@ namespace LinBox
 		const_iterator &operator += (long i)
 		{
 			_ref._word += i >> __LINBOX_LOGOF_SIZE;
-// #ifdef __INTEL_COMPILER
-// #pragma warning(disable:2259)
-// #endif
 			_ref._pos  = (uint8_t) ((int) _ref._pos + (i & __LINBOX_POS_ALL_ONES));
-// #ifdef __INTEL_COMPILER
-// #pragma warning(enable:2259)
-// #endif
 			_ref._word += _ref._pos >> __LINBOX_LOGOF_SIZE;
 			_ref._pos  &= __LINBOX_POS_ALL_ONES;
 			return *this;
@@ -494,7 +491,7 @@ namespace LinBox
 		if ((_size & __LINBOX_POS_ALL_ONES) == 0UL)
 			return iterator (_v.end (), 0UL);
 		else
-			return iterator (_v.end () - 1UL, _size & __LINBOX_POS_ALL_ONES);
+			return iterator (_v.end () - 1UL, (uint8_t)(_size & __LINBOX_POS_ALL_ONES));
 	}
 
 	inline BitVector::const_iterator BitVector::end (void) const
@@ -502,7 +499,7 @@ namespace LinBox
 		if ((_size & __LINBOX_POS_ALL_ONES) == 0UL)
 			return const_iterator (_v.end (), 0UL);
 		else
-			return const_iterator (_v.end () - 1UL, _size & __LINBOX_POS_ALL_ONES);
+			return const_iterator (_v.end () - 1UL, (uint8_t)(_size & __LINBOX_POS_ALL_ONES));
 	}
 
 	inline BitVector::reverse_iterator BitVector::rbegin (void)
@@ -566,7 +563,7 @@ namespace LinBox
 		if ( (_size & __LINBOX_POS_ALL_ONES) == 0UL)
 			return reference (_v.end (), 0UL);
 		else
-			return reference (_v.end () - 1UL, _size & __LINBOX_POS_ALL_ONES);
+			return reference (_v.end () - 1UL, (uint8_t)(_size & __LINBOX_POS_ALL_ONES));
 	}
 
 	inline BitVector::const_reference BitVector::back (void) const
@@ -574,7 +571,7 @@ namespace LinBox
 		if ( (_size & __LINBOX_POS_ALL_ONES) == 0UL)
 			return const_reference (_v.end (), 0UL);
 		else
-			return const_reference (_v.end () - 1UL, _size & __LINBOX_POS_ALL_ONES);
+			return const_reference (_v.end () - 1UL, (uint8_t)(_size & __LINBOX_POS_ALL_ONES));
 	}
 
 	template<class Container>
@@ -659,11 +656,10 @@ namespace LinBox
 #endif // __LINBOX_bit_vector_INL
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/blas-vector.h b/linbox/vector/blas-vector.h
new file mode 100644
index 0000000..8dcdef5
--- /dev/null
+++ b/linbox/vector/blas-vector.h
@@ -0,0 +1,992 @@
+/* linbox/matrix/blas-vector.h
+ * Copyright (C) 2013 the LinBox group
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+/*! @file vector/blas-vector.h
+ * @ingroup vector
+ * A \c BlasVector<\c _Field > represents a vector as an array of
+ * <code>_Field::Element</code>s.
+ *
+ */
+
+#ifndef __LINBOX_vector_blas_vector_H
+#define __LINBOX_vector_blas_vector_H
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/debug.h"
+#include "linbox/linbox-tags.h"
+#include "linbox/field/hom.h"
+#include "linbox/vector/vector.h"
+#include "linbox/vector/subvector.h"
+#include "linbox/vector/subiterator.h"
+
+namespace LinBox { /* BlasVector */
+
+	template<class _Field, class _Rep>
+	class BlasMatrix ;
+
+	template<class _Matrix>
+	class BlasSubmatrix ;
+
+
+	template<class _Field, class _blasRep>
+	class BlasVector : public Subvector<Subiterator<typename _blasRep::iterator > > {
+
+	public:
+		typedef _Field                                Field;
+		typedef typename Field::Element             Element;    //!< Element type
+		typedef _blasRep                                Rep;    //!< Actually a <code>std::vector<Element></code> (or alike.)
+		typedef typename Rep::pointer               pointer;    //!< pointer type to elements
+		typedef const pointer                 const_pointer;    //!< const pointer type
+		typedef BlasVector<_Field,_blasRep>          Self_t;    //!< Self type
+		typedef BlasSubvector<Self_t>         subVectorType;    //!< Submatrix type
+		typedef BlasVector<_Field,_blasRep>      vectorType;    //!< matrix type
+		typedef BlasVector<_Field,_blasRep>        blasType;    //!< blas type
+
+	public: /* iterators */
+		typedef Subvector<Subiterator<typename _blasRep::iterator > > Father_t;
+		typedef typename Father_t::iterator             iterator;
+		typedef iterator Iterator ;
+		typedef typename Father_t::const_iterator const_iterator;
+		// typedef typename Father_t::size_type size_type;
+
+
+
+	protected:
+		size_t			       _size;
+		size_t                       _1stride;
+		Rep			        _rep;
+		pointer			        _ptr;
+		const Field		    * _field;
+	private:
+		void createBlasVector(const BlasVector<_Field,_blasRep> & V)
+		{
+			//! use std::copy somehow ?
+			for (size_t i = 0 ; i < _size ; ++i)
+				setEntry(i,V.getEntry(i));
+		}
+
+		void createBlasVector(const BlasVector<_Field,_blasRep> & V
+				      , const size_t i0, const size_t str)
+		{
+			for (size_t i = 0 ; i < _size ; ++i)
+				setEntry(i,V.getEntry(i0+i*str));
+		}
+
+		template<class _Vector>
+		void createBlasVector(const BlasSubvector<_Vector> & V)
+		{
+			//! use std::copy somehow ?
+			for (size_t i = 0 ; i < _size ; ++i)
+				setEntry(i,V.getEntry(i));
+		}
+
+		void createBlasVector ( const Element * V)
+		{
+			//! use std::copy somehow ?
+			for (size_t i = 0 ; i < _size ; ++i)
+				setEntry(i,V[i]);
+		}
+
+		void createBlasVector ( const Element * V
+					, const size_t i0, const size_t str)
+		{
+			for (size_t i = 0 ; i < _size ; ++i)
+				setEntry(i,V[i0+i*str]);
+		}
+
+		void createBlasVector ( const std::vector<Element> & V)
+		{
+			createBlasVector(&V[0]);
+		}
+
+		template<class OtherVector>
+		void createBlasVector( const OtherVector &V)
+		{
+			iterator it = _rep.begin();
+			typename OtherVector::const_iterator jt = V.begin();
+			for ( ; it != _rep.end(); ++it, ++jt)
+				_field->init(*it, *jt) ;
+
+		}
+
+		void createBlasVector ( const std::vector<Element> & V
+					, const size_t i0, const size_t str)
+		{
+			createBlasVector(&V[0],i0,str);
+		}
+
+		/** Gets a vector from data in a BlasMatrix.
+		 * Vector starts at \c (i0,j0) and next element is \p stride away.
+		 * For instance, row \c i correpsonds to args \c (i,0,1) and col \c j is \c (0,j,lda)
+		 * It is possible to get vectors that extend over multiple rows/columns
+		 * and \p stride need not be equal to \c 1 or \c lda.
+		 */
+		void createBlasVector ( const BlasMatrix<Field,Rep> & A, size_t i0, size_t j0, size_t str)
+		{
+			if ((str == 1) && (i0+_size*str<A.coldim())){
+				for (size_t i = 0 ; i < _size ; ++i)
+					setEntry(i,A.getEntry(i0+i,j0));
+			}
+			else if ((str == A.coldim()) && j0+_size*str<A.rowdim()) {
+				for (size_t i = 0 ; i < _size ; ++i)
+					setEntry(i,A.getEntry(i0,j0+i));
+			}
+			else{ /* is this always faster ? */
+				Element * Aptr = A.getPointer(i0,j0);
+				for (size_t i = 0 ; i < _size ; ++i)
+					setEntry(i,Aptr[i*str]);
+			}
+		}
+
+		template<class _Matrix>
+		void createBlasVector ( const BlasSubmatrix<_Matrix> & A, size_t i0, size_t j0, size_t str)
+		{
+			Element * Aptr = A.getPointer(i0,j0);
+			for (size_t i = 0 ; i < _size ; ++i)
+				setEntry(i,Aptr[i*str]);
+		}
+
+
+	public:
+		BlasVector () {} ;
+
+		BlasVector (const _Field &F)  :
+			Father_t(),
+			_size(0),_1stride(1),_rep(0),_ptr(&_rep[0]), _field(&F)
+		{
+			// Father_t is garbage until then:
+			setIterators();
+			// linbox_check(_ptr != NULL);
+		}
+
+#if 0
+		void init(const _Field & F, size_t n = 0)
+		{
+			_field = &F;
+			_size = n;
+			_1stride=1 ;
+			_rep.resize(n, F.zero);
+			_ptr = &_rep[0];
+		}
+#endif
+
+#ifdef __GNUC__
+#ifndef __x86_64__
+#if (__GNUC__ == 4 && __GNUC_MINOR__ ==4 && __GNUC_PATCHLEVEL__==5)
+		BlasVector (const _Field &F, const long &m, const Element e=Element()) :
+			Father_t(),
+			_size((size_t)m),_1stride(1),_rep((size_t)_size, e),_ptr(&_rep[0]),_field(&F)
+		{
+			// Father_t is garbage until then:
+			setIterators();
+
+			linbox_check(_size==0 || _ptr != NULL);
+		}
+#endif
+#endif
+#endif
+
+#if defined(__APPLE__) || (defined(__s390__) && !defined(__s390x__))
+		BlasVector (const _Field &F, const unsigned long &m, const Element e=Element())  :
+			Father_t(),
+			_size((size_t)m),_1stride(1),_rep((size_t)_size, e),_ptr(&_rep[0]),_field(&F)
+		{
+			// Father_t is garbage until then:
+			setIterators();
+
+			linbox_check(_size==0 || _ptr != NULL);
+			linbox_check(_size >= this->begin()->_stride);
+		}
+
+#endif
+
+		BlasVector (const _Field &F, const uint64_t &m, const Element e=Element())  :
+			Father_t(),
+			_size((size_t)m),_1stride(1),_rep((size_t)_size, e),_ptr(&_rep[0]),_field(&F)
+		{
+			// Father_t is garbage until then:
+			setIterators();
+			// linbox_check(_ptr != NULL);
+		}
+
+
+		BlasVector (const _Field &F, const int64_t &m, const Element e=Element())  :
+			Father_t(),
+			_size((size_t)m),_1stride(1),_rep((size_t)_size, e),_ptr(&_rep[0]),_field(&F)
+		{
+	// Father_t is garbage until then:
+			setIterators();
+
+
+			linbox_check(_size==0 || _ptr != NULL);
+		}
+
+
+		BlasVector (const _Field &F, const uint32_t &m, const Element e=Element())  :
+			Father_t(),
+			_size((size_t)m),
+			_1stride(1),
+			_rep((size_t)_size, e),
+			_ptr(&_rep[0]),
+			_field(&F)
+		{
+	// Father_t is garbage until then:
+			setIterators();
+
+
+			linbox_check(_size==0 || _ptr != NULL);
+		}
+
+		BlasVector (const _Field &F, const int32_t &m, const Element e=Element())  :
+			Father_t(),
+			_size((size_t)m),_1stride(1),_rep((size_t)_size, e),_ptr(&_rep[0]),_field(&F)
+		{
+	// Father_t is garbage until then:
+			setIterators();
+
+
+			linbox_check(_size==0 || _ptr != NULL);
+		}
+
+		BlasVector (const _Field &F, const Integer & m, const Element e=Element())  :
+			Father_t(),
+			_size((size_t)m),_1stride(1),_rep((size_t)_size, e),_ptr(&_rep[0]),_field(&F)
+		{
+	// Father_t is garbage until then:
+			setIterators();
+
+
+			linbox_check(_size==0 || _ptr != NULL);
+		}
+
+		//! @bug be careful with copy constructor. We should ban them and provide copy.
+		BlasVector (const BlasVector<_Field,_blasRep> &V)  :
+			Father_t(), // will be created afterwards...
+			_size(V.size())
+			,_1stride(1)
+			,_rep(V.size()/*, V.field().zero*/) //!@bug segfault in cra otherwise (test-rat-solve eg)
+			,_ptr(&_rep[0])
+			,_field(&(V.field()))
+		{
+			// Father_t is garbage until then:
+			setIterators();
+
+			createBlasVector(V);
+
+			linbox_check(_size==0 || _ptr != NULL);
+		}
+
+		//! @bug F is last for matrix
+		template<class VectorBase>
+		BlasVector (const _Field & F, const VectorBase & V)  :
+			Father_t(), // will be created afterwards...
+			_size(V.size()),_1stride(1),_rep(V.size(), F.zero),_ptr(&_rep[0]),_field(&F)
+		{
+			// Father_t is garbage until then:
+			setIterators();
+
+			createBlasVector(V);
+
+			linbox_check(_size==0 || _ptr != NULL);
+		}
+
+
+		template<class _Vector>
+		BlasVector (const BlasSubvector<_Vector> &V)  :
+			Father_t(),
+			_size(V.size()),_1stride(1),_rep(V.size(), V.field().zero),_ptr(&_rep[0]),_field(&(V.field()))
+		{
+	// Father_t is garbage until then:
+			setIterators();
+
+
+			createBlasVector(V);
+			linbox_check(_size==0 || _ptr != NULL);
+		}
+
+		BlasVector (const BlasMatrix<Field,Rep> &A, size_t k, LINBOX_enum (Tag::Direction) f )  :
+			Father_t(),
+			_size((f == Tag::Direction::Row)?(A.rowdim()):(A.coldim())),_1stride(1),_rep(_size, A.field().zero),_ptr(&_rep[0]),_field(&(A.field()))
+			{
+	// Father_t is garbage until then:
+			setIterators();
+
+
+				if (f==Tag::Direction::Row)
+					createBlasVector(A,k,0,1);
+				else // Tag::Col
+					createBlasVector(A,0,k,A.coldim());
+			linbox_check(_size==0 || _ptr != NULL);
+
+			}
+
+		template<class _Matrix>
+		BlasVector (const BlasSubmatrix<_Matrix> &A, size_t k, LINBOX_enum (Tag::Direction) f )  :
+			Father_t(),
+			_size((f==Tag::Direction::Row)?(A.rowdim()):(A.coldim())),_1stride(1),_rep(_size, A.field().zero),_ptr(&_rep[0]),_field(&(A.field()))
+			{
+	// Father_t is garbage until then:
+			setIterators();
+
+
+				if (f==Tag::Direction::Row)
+					createBlasVector(A,k,0,1);
+				else // Tag::Col
+					createBlasVector(A,0,k,A.stride());
+			linbox_check(_size==0 || _ptr != NULL);
+			}
+
+		BlasVector (const BlasMatrix<Field,Rep> &A, size_t n, size_t i0, size_t j0, size_t str )  :
+			Father_t(),
+			_size(n),_1stride(1),_rep(_size, A.field().zero),_ptr(&_rep[0]),_field(&(A.field()))
+		{
+	// Father_t is garbage until then:
+			setIterators();
+
+
+			createBlasVector(A,i0,j0,str);
+			linbox_check(_size==0 || _ptr != NULL);
+		}
+
+		BlasVector(const _Field & F, const typename _Field::Element * v, const size_t l) :
+			Father_t(),
+			_size(l),_1stride(1),_rep(l, F.zero),_ptr(&_rep[0]),_field(&F)
+		{
+			setIterators();
+			createBlasVector(v);
+			linbox_check(_size==0 || _ptr != NULL);
+		}
+
+		// ~BlasVector () ;
+
+		BlasVector<_Field,_blasRep>& operator= (const BlasVector<_Field,_blasRep>& V)
+		{
+			if ( &V == this)
+				return *this;
+
+			_size = V.size();
+			_1stride = 1;
+			_rep = Rep(_size);
+			_ptr = &_rep[0] ;
+
+			// linbox_check(field().characteristic() == V.field().characteristic());
+			_field = &V.field();
+
+			createBlasVector(V);
+			linbox_check(_size==0 || _ptr != NULL);
+
+			// Father_t is garbage until then:
+			setIterators();
+
+
+
+			return *this;
+		}
+
+		//! this should not exist.
+		BlasVector<_Field,_blasRep>& operator= (const std::vector<Element>& V)
+		{
+			_size = V.size();
+			_1stride = 1;
+			_rep = Rep(_size);
+			_ptr = &_rep[0] ;
+			createBlasVector(V);
+			linbox_check(_size==0 || _ptr != NULL);
+
+			// Father_t is garbage until then:
+			setIterators();
+
+
+
+			return *this;
+		}
+
+		template<class OtherBase>
+		BlasVector<_Field,_blasRep>& operator= (const OtherBase & V)
+		{
+			_size = V.size();
+			_1stride = 1;
+			_rep = Rep(_size);
+			_ptr = &_rep[0] ;
+			createBlasVector(V);
+			linbox_check(_size==0 || _ptr != NULL);
+
+			// Father_t is garbage until then:
+			setIterators();
+
+			return *this;
+		}
+
+		template<typename _Tp1>
+		struct rebind {
+			typedef BlasVector<_Tp1> other;
+
+			void operator() (other & Ap, const Self_t& A) {
+				typedef typename Self_t::ConstIterator ConstSelfIterator ;
+				typedef typename other::Iterator OtherIterator ;
+				OtherIterator    Ap_i = Ap.Begin();
+				ConstSelfIterator A_i = A.Begin();
+				Hom<Field, _Tp1> hom(A. field(), Ap. field()) ;
+				for ( ; A_i != A. End(); ++ A_i, ++ Ap_i)
+					hom.image (*Ap_i, *A_i);
+			}
+		};
+
+
+		// write
+		std::ostream &write ( std::ostream &os, LINBOX_enum(Tag::FileFormat) fmt = Tag::FileFormat::Pretty ) const
+		{
+			switch(fmt) {
+			case (Tag::FileFormat::Pretty) :
+				{
+					os << '[' ;
+					for(const_iterator it= this->begin();it != this->end(); ++it)
+						field().write(os, *it) << " ";
+					return	os << ']' ;
+				}
+			case (Tag::FileFormat::Maple) :
+				{
+					os << '<' ;
+					for(const_iterator it=this->begin();it != this->end(); ) {
+						field().write(os, *it);
+						++it ;
+						if (it != this->end())
+							os << ',' ;
+					}
+					return	os << '>' ;
+				}
+
+			default :
+				return os << "not implemented" ;
+			}
+		}
+
+
+
+		// read
+
+			size_t size() const
+		{
+			return _size;
+		}
+
+		//!should never ever be used
+		size_t getStride() const
+		{
+			return _1stride;
+		}
+
+		size_t stride() const { return getStride() ;}
+
+		//!should never ever be used
+		size_t& getWriteStride()
+		{
+			return _1stride;
+		}
+
+		void resize (size_t n, const Element& val = Element())
+		{
+			_size = n;
+			_rep.resize (n, val);
+			_ptr=&_rep[0];
+
+			// iterators are changed
+			setIterators();
+
+		}
+		// should use this->insert(this->end(),e)
+		void push_back(const Element & e) {
+			_rep.push_back(e);
+
+			_size = _rep.size() ; // back to normal :-)
+			_ptr=&_rep[0];
+			setIterators();
+
+		}
+
+		void clear(void) {
+			_rep.clear();
+			_size = 0 ;
+			_ptr=&_rep[0]; // probably NULL
+			setIterators();
+
+		}
+
+		void reserve(const size_t &m) {
+			_rep.reserve(m);
+			// _size = _rep.size() ;
+			_ptr=&_rep[0]; // do we need those ?
+			setIterators();
+
+		}
+
+
+
+		Rep & refRep() { return _rep ; }
+
+		const Rep &getRep() const { return _rep ; }
+
+		pointer getPointer() const
+		{
+			return _ptr;
+		}
+
+		const_pointer &getConstPointer() const
+		{
+			return (const_pointer)_ptr;
+		}
+
+		pointer& getWritePointer()  //! @bug should be called refPointer()
+		{
+			return _ptr;
+		}
+
+		void setEntry (size_t i, const Element &a_i)
+		{
+			_ptr[i] = a_i;
+		}
+
+		Element &refEntry (size_t i)
+		{
+			return _ptr[i];
+		}
+
+		const Element &getEntry (size_t i) const
+		{
+			return _ptr[i];
+		}
+
+		Element &getEntry (Element &x, size_t i) const
+		{
+			x = _ptr[i];
+			return x;
+		}
+
+		void random()
+		{
+			typename _Field::Element x; field().init(x);
+			typename _Field::RandIter r(field());
+			for (size_t i = 0; i < size(); ++i)
+				setEntry(i, r.random(x));
+		}
+
+		template<class RandIter>
+		void random( RandIter r)
+		{
+			typename _Field::Element x; field().init(x);
+			for (size_t i = 0; i < size(); ++i)
+				setEntry(i, r.random(x));
+		}
+
+		const _Field& field() const { return const_cast<Field&>( *_field );}
+
+		void changeField(const Field & G)
+		{
+			_field = const_cast<Field*>(&G) ;
+		}
+
+		Element magnitude() const ;
+
+		iterator Begin() { return _rep.begin() ; }
+	private:
+		void setIterators()
+		{
+			Father_t::_begin = iterator (_rep.begin() , 1);
+			Father_t::_end   = iterator (_rep.begin()+(ptrdiff_t)_size , 1);
+		}
+
+
+	};// BlasVector
+
+	template <class Field, class _Rep>
+	struct VectorTraits< BlasVector<Field,_Rep> > {
+		typedef typename VectorCategories::DenseVectorTag VectorCategory;
+		typedef BlasVector<Field,_Rep>                          VectorType;
+	};
+
+
+        template <typename Field, typename Rep>
+        bool operator==(const BlasVector<Field,Rep>& v1, const BlasVector<Field,Rep>& v2)
+        {
+                if (v1.size() != v2.size()) return false;
+                auto i1=v1.begin();
+                auto i2=v2.begin();
+                for( ; i1 != v1.end(); ++i1, ++i2)
+                        if (*i1 != *i2) return false;
+                return true;
+        }
+
+
+	template<>
+	Integer BlasVector<Givaro::ZRing<Integer> >::magnitude() const
+	{
+		Integer max_elt(0);
+		for (size_t i = 0 ; i < size() ; ++i)
+			if (max_elt < Givaro::abs(_ptr[i]))
+				max_elt = Givaro::abs(_ptr[i]) ;
+		return max_elt ;
+	}
+
+
+	template<class T>
+	std::ostream& operator<< (std::ostream & o, const BlasVector<T> & Mat)
+	{
+		return Mat.write(o);
+	}
+
+} // LinBox
+
+namespace LinBox { /*  BlasSubvector */
+
+
+
+
+	template <class _Vector > // inherit that from owner ?
+	class BlasSubvector :
+		public Subvector<Subiterator<typename _Vector::Rep::iterator > >
+		/* public  BlasVector<typename _Vector::Field, typename _Vector::Rep> */ {
+	public :
+		typedef typename _Vector::Field                   Field;
+		typedef typename Field::Element                 Element;      //!< Element type
+		typedef typename _Vector::Rep                       Rep;    //!< Actually a <code>std::vector<Element></code> (or alike.)
+		typedef BlasSubvector<_Vector>                   Self_t;       //!< Self type
+		typedef typename Rep::pointer                   pointer;    //!< pointer type to elements
+		typedef const pointer                     const_pointer;    //!< const pointer type
+		typedef Self_t                            subVectorType;    //!< Subvector type
+		typedef BlasVector<Field,Rep>                vectorType;    //!< vector type
+		typedef BlasVector<Field,Rep>                  blasType;    //!< blas type
+
+
+	protected:
+		Rep &_Vec;                     //!< Parent raw vector
+		size_t _size;                   //!< size of Subvector
+		size_t _i0;                    //!< beginning of Subvector in \p _Vec
+		size_t _1stride ;               //!< number of columns in \p _Vec (or stride of \p _Vec)
+		const Field & _field;
+
+	public:
+		typedef Subvector<Subiterator<typename Rep::iterator > > Father_t;
+		typedef typename Father_t::iterator             iterator;
+		typedef typename Father_t::const_iterator const_iterator;
+
+
+		//////////////////
+		// CONSTRUCTORS //
+		//////////////////
+
+
+		/*  constructors */
+
+		/** NULL constructor.  */
+		// BlasSubvector () ;
+
+		BlasSubvector (BlasVector<Field,Rep> &V,
+			       size_t ibeg,
+			       size_t Stride,
+			       size_t Size
+			      ) :
+			Father_t(),
+			_Vec ((V.refRep())),
+			_size(Size),_i0 (ibeg),_1stride(Stride)
+			,_field(V.field())
+		{
+			setIterators();
+		}
+
+
+		BlasSubvector (const Field & F, std::vector<Element> &V) :
+			Father_t(),
+			_Vec (V),
+			_size(V.size()),_i0 (0),_1stride(1)
+			,_field(F)
+		{
+			// not tested
+			setIterators();
+		}
+
+#if 0 /* impossible */
+		BlasSubvector (const Field & F, Subvector<typename Rep::iterator, typename Rep::const_iterator> &V) :
+			Father_t(),
+			_Vec (V),
+			_size(V.size()),_i0 (0),_1stride(1)
+			,_field(F)
+		{
+			// not tested
+			setIterators();
+		}
+#endif
+
+		BlasSubvector (const Field & F, const std::vector<Element> &V) :
+			Father_t(),
+			_Vec (V),
+			_size(V.size()),_i0 (0),_1stride(1)
+			,_field(F)
+		{
+			std::cout << "oops, copy (?)" << std::endl;
+			// not tested
+			setIterators();
+		}
+
+
+		BlasSubvector (const Field & F, const std::vector<Element> &V
+			       , const size_t ibeg, const size_t Stride, const size_t Size) :
+			Father_t(),
+			_Vec (V),
+			_size(Size),_i0 (ibeg),_1stride(Stride)
+			// could have _i0 = 0 and start at V+ibeg
+			,_field(F)
+		{
+			// not tested
+			setIterators();
+		}
+
+		//! @todo subvector of ptr
+
+
+		BlasSubvector (const BlasSubvector<_Vector> &SV,
+			       size_t ibeg,
+			       size_t Stride,
+			       size_t Size
+			      ) :
+			Father_t(),
+			_Vec (SV._Vec),
+			_size(Size),_i0 (SV._i0+SV._1stride*ibeg)
+			,_1stride(SV._1stride*Stride)
+			,_field(SV.field())
+		{
+			// not tested
+			setIterators();
+		}
+
+		/** Copy constructor.
+		 * @param SM Subvector to copy
+		 */
+		BlasSubvector (const BlasSubvector<_Vector> &SV) :
+			Father_t(),
+			_Vec (SV._Vec),
+			_size(SV._size),_i0 (SV._i0)
+			,_1stride(SV._1stride)
+			,_field(SV.field())
+		{
+			// not tested
+			setIterators();
+		}
+
+#if 0 /*  from BlasMatrix (should be a Row/Col in BlasMatrix, not here... */
+		BlasSubvector (const BlasMatrix<Field,Rep> &M
+			       , size_t ibeg
+			       , LINBOX_enum (Tag::Direction) f ) :
+			Father_t(),
+			_Vec (const_cast<Rep&>(M.refRep()))
+			,_size((f==Tag::Direction::Row)?(M.coldim()):(M.rowdim()))
+			,_i0 ((f==Tag::Direction::Row)?(ibeg*M.coldim()):(ibeg))
+			,_1stride((f==Tag::Direction::Row)?(1):(M.coldim()))
+			,_field(M.field())
+		{
+			setIterators();
+		}
+
+		template<class _Matrix>
+		BlasSubvector (const BlasSubmatrix<_Matrix> &M
+			       , size_t ibeg
+			       , LINBOX_enum (Tag::Direction) f ) :
+			Father_t(),
+			_Vec (const_cast<Rep&>(M.refRep()))
+			,_size((f==Tag::Direction::Row)?(M.coldim()):(M.rowdim()))
+			,_i0 ((f==Tag::Direction::Row)?(M.offset()+ibeg*M.stride()):(M.offset()+ibeg))
+			,_1stride((f==Tag::Direction::Row)?(1):(M.stride()))
+			,_field(M.field())
+		{
+			setIterators();
+		}
+#endif
+
+
+		//! @todo more general subvectors
+
+		/*  Members  */
+
+		BlasSubvector &operator = (const BlasSubvector<_Vector> &SV)
+		{
+			if ( &SV == this)
+				return *this ;
+			_Vec=SV._Vec ; //!@todo use functions, not =
+			_size = SV.size();
+			_i0=SV._i0;
+			_1stride = SV.stride();
+			// _field = SV.field();
+			linbox_check(field().characteristic() == SV.field().characteristic());
+			setIterators();
+			return *this ;
+
+		}
+
+		// template<typename _Tp1>
+		// struct rebind ;
+
+		//////////////////
+		//  DIMENSIONS  //
+		//////////////////
+
+		size_t size() const {return _size;}
+
+		size_t getStride() const {return _1stride ; }
+		size_t stride() const { return getStride() ;}
+
+
+		///////////////////
+		//      I/O      //
+		///////////////////
+
+		// std::ostream &write (std::ostream &os) const;
+
+		//////////////////
+		//   ELEMENTS   //
+		//////////////////
+
+		pointer getPointer() const { return &(_Vec[_i0]); }
+
+		const_pointer &getConstPointer() const { return &(_Vec[_i0]); }
+
+
+		pointer& getWritePointer() { return &(_Vec[_i0]); }
+
+
+		void setEntry (size_t i, const Element &a_i)
+		{
+			_Vec[_i0+i*_1stride] = a_i;
+		}
+
+		Element &refEntry (size_t i)
+		{
+			return _Vec[_i0+i*_1stride] ;
+		}
+
+		const Element &getEntry (size_t i) const
+		{
+			return _Vec[_i0+i*_1stride] ;
+		}
+
+		Element &getEntry (Element &x, size_t i)
+		{
+			x = _Vec[_i0+i*_1stride] ;
+			return x;
+		}
+
+
+#if 0 /* using Father_t */
+		///////////////////
+		//   ITERATORS   //
+		///////////////////
+
+		class Iterator  ;
+		class ConstIterator ;
+
+		class IndexedIterator ;
+		class ConstIndexedIterator ;
+#endif
+
+
+		const Field& field() const { return _field ;}
+		// Field & field() { return _field; }
+
+		// write (same as BlasVector)
+		std::ostream &write ( std::ostream &os, LINBOX_enum(Tag::FileFormat) fmt = Tag::FileFormat::Pretty ) const
+		{
+			switch(fmt) {
+			case (Tag::FileFormat::Pretty) :
+				{
+					os << '[' ;
+					for(const_iterator it= this->begin();it != this->end(); ++it)
+						field().write(os, *it) << " ";
+					return	os << ']' ;
+				}
+			case (Tag::FileFormat::Maple) :
+				{
+					os << '<' ;
+					for(const_iterator it=this->begin();it != this->end(); ) {
+						field().write(os, *it);
+						++it ;
+						if (it != this->end())
+							os << ',' ;
+					}
+					return	os << '>' ;
+				}
+
+			default :
+				return os << "not implemented" ;
+			}
+		}
+
+	private:
+		void setIterators()
+		{
+			Father_t::_begin = iterator (_Vec.begin()+(ptrdiff_t)_i0 , (ptrdiff_t)_1stride);
+			Father_t::_end   = iterator (_Vec.begin()+(ptrdiff_t)(_i0 + _size*_1stride) , (ptrdiff_t)_1stride);
+		}
+
+	};
+
+	template<class T>
+	std::ostream& operator<< (std::ostream & o, const BlasSubvector<T> & Mat)
+	{
+		return Mat.write(o);
+	}
+
+} // LinBox
+
+namespace LinBox { /*  traits */
+
+	// this could also be a member of BlasVector
+	template<class _Field, class _Rep>
+	struct ContainerTraits<BlasVector<_Field,_Rep> > {
+		typedef ContainerCategories::Vector ContainerCategory ;
+	};
+
+	//! @todo remove vectors
+	template<class _Rep>
+	struct ContainerTraits<std::vector<_Rep> > {
+		typedef ContainerCategories::Vector ContainerCategory ;
+	};
+
+	template<class _Vector>
+	struct ContainerTraits<BlasSubvector<_Vector> > {
+		typedef ContainerCategories::Vector ContainerCategory ;
+	};
+
+}
+
+#include "blas-vector.inl"
+
+#endif // __LINBOX_vector_blas_vector_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/blas-vector.inl b/linbox/vector/blas-vector.inl
new file mode 100644
index 0000000..037e72d
--- /dev/null
+++ b/linbox/vector/blas-vector.inl
@@ -0,0 +1,47 @@
+/* linbox/matrix/blas-vector.inl
+ * Copyright (C) 2013 the LinBox group
+ *
+ * Written by :
+ * Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @internal
+ * @file vector/blas-vector.inl
+ * @ingroup vector
+ *
+ */
+
+#ifndef __LINBOX_vector_blas_vector_INL
+#define __LINBOX_vector_blas_vector_INL
+
+// TODO from vector.h
+
+#endif // __LINBOX_vector_blas_vector_INL
+
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/reverse.h b/linbox/vector/reverse.h
index 94394f8..33df390 100644
--- a/linbox/vector/reverse.h
+++ b/linbox/vector/reverse.h
@@ -3,20 +3,20 @@
  *
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -80,8 +80,8 @@ namespace LinBox
 
 		// Element access
 
-		inline reference       operator[] (size_type n)       { return (begin ())[n]; }
-		inline const_reference operator[] (size_type n) const { return (begin ())[n]; }
+		inline reference       operator[] (size_type n)       { return ((begin ())[(ptrdiff_t)n]); }
+		inline const_reference operator[] (size_type n) const { return ((begin ())[(ptrdiff_t)n]); }
 
 		// the method "at" does appear to be implemented
 		// in the gnu implementation of the STL
diff --git a/linbox/vector/slicedpolynomialvector/SlicedPolynomialMatrixVectorMulKaratsuba.h b/linbox/vector/slicedpolynomialvector/SlicedPolynomialMatrixVectorMulKaratsuba.h
new file mode 100644
index 0000000..56bacc2
--- /dev/null
+++ b/linbox/vector/slicedpolynomialvector/SlicedPolynomialMatrixVectorMulKaratsuba.h
@@ -0,0 +1,27 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixVectorMulKaratsuba_H
+#define __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixVectorMulKaratsuba_H
+
+#include "linbox/matrix/slicedpolynomialmatrix/SlicedPolynomialMatrix.h"
+#include "linbox/vector/slicedpolynomialvector/SlicedPolynomialVector.h"
+
+namespace LinBox
+{ 
+	template< class Field, class Operand1, class Operand2, class Operand3>
+	class SlicedPolynomialMatrixVectorMulKaratsuba
+	{
+	private:
+		typedef Operand1::IntField IntField;
+		typedef BlasMatrix<IntField> Matrix;
+		typedef BlasVector<IntField> Vector;
+		typedef std::vector<Matrix> vecM;
+		typedef std::vector<Vector> vecV;
+		typedef Operand1::polynomial polynomial;
+		vec& karatsuba(IntField& F, vecV& C, vecM& A, vecV& B);
+	public:
+		Operand1 &operator() (const Field &GF, Operand1 &C, const Operand2 &A, const Operand3 &B) const;
+	}; 
+} /* end of namespace LinBox */
+
+#include "SlicedPolynomialMatrixVectorMulKaratsuba.inl"
+
+#endif
diff --git a/linbox/vector/slicedpolynomialvector/SlicedPolynomialMatrixVectorMulKaratsuba.inl b/linbox/vector/slicedpolynomialvector/SlicedPolynomialMatrixVectorMulKaratsuba.inl
new file mode 100644
index 0000000..72b25cb
--- /dev/null
+++ b/linbox/vector/slicedpolynomialvector/SlicedPolynomialMatrixVectorMulKaratsuba.inl
@@ -0,0 +1,245 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixMulKaratsuba_INL
+#define __LINBOX_matrix_SlicedPolynomialMatrix_SlicedPolynomialMatrixMulKaratsuba_INL
+
+#include <givaro/givpoly1dense.h>
+#include <givaro/givpoly1denseops.inl>
+#include "linbox/matrix/matrixdomain/blas-matrix-domain.h"
+#include "linbox/vector/vector-domain.h"
+#include "fflas-ffpack/fflas/fflas.h"
+
+namespace LinBox
+{
+	template<class Field, class Vector3, class Vector1, class Vector2>
+	SlicedPolynomialMatrixMulKaratsuba<Field, Vector3, Vector1, Vector2 >::vec&
+		SlicedPolynomialMatrixMulKaratsuba<Field, Vector3, Vector1, Vector2 >::karatsuba(IntField& F, VectorDomain<Vector3::IntField>& VD, 
+		                                                                     vecV& C, vecM& A, vecV& B, size_t rd, size_t cd)
+	{
+		if (A.size() == 1)
+		{
+			for (int i = 0; i <B.size(); i++)
+			{
+				FFLAS::fgemv(F, FflasNoTrans, rd, cd, F.one, A[0].getPointer(), cd, B[i].getPointer(), 1, F.zero, C[i].getWritePointer(), 1);
+			}
+			return C;
+		}
+		if (B.size() == 1)
+		{
+			for (int i = 0; i < A.size(); i++)
+			{
+				FFLAS::fgemv(F, FflasNoTrans, rd, cd, F.one, A[i].getPointer(), cd, B[0].getPointer(), 1, F.zero, C[i].getWritePointer(), 1);
+			}
+			return C;
+		}
+		int m = (A.size() < B.size()) ? (B.size() / 2) : (A.size() / 2);
+		if ((m < A.size()) && (m < B.size()))
+		{
+			vecM A1(A.begin(), A.begin() + m);
+			vecM A2(A.begin() + m, A.end());
+			vecV B1(B.begin(), B.begin() + m);
+			vecV B2(B.begin() + m, B.end());
+			vecM A3;
+			int minlength_a = (A1.size() < A2.size()) ? A1.size() : A2.size();
+			int minlength_a = (A1.size() < A2.size()) ? A2.size() : A1.size();
+			for (int i = 0; i < minlength_a; i++)
+			{
+				Matrix AA(F, rd, cd);
+				A3.push_back(BlasMatrixDomainAdd<IntField, Matrix, Matrix, Matrix>()(F, AA, A1[i], A2[i]));
+			}
+			if (maxlength_a == A1.size())
+			{
+				for (int i = minlength_a; i < maxlength_a; i++)
+				{
+					A3.push_back(A1[i]);
+				}
+			}
+			else
+			{
+				for (int i = minlength_a; i < maxlength_a; i++)
+				{
+					A3.push_back(A2[i]);
+				}
+			}
+			vecV B3;
+			int minlength_b = (B1.size() < B2.size()) ? B1.size() : B2.size();
+			int maxlength_b = (B1.size() < B2.size()) ? B2.size() : B1.size();
+			for (int i = 0; i < minlength_b; i++)
+			{
+				Vector BB(F, cd);
+				B3.push_back(VD.add<Vector, Vector, Vector>(BB, B1[i], B2[i]));
+			}
+			if (maxlength_b == B1.size())
+			{
+				for (int i = minlength_b; i < maxlength_b; i++)
+				{
+					B3.push_back(B1[i]);
+				}
+			}
+			else
+			{
+				for (int i = minlength_b; i < maxlength_b; i++)
+				{
+					B3.push_back(B1[i]);
+				}
+			}
+			vecV C1;
+			vecV C2;
+			vecV C3;
+			Matrix CC(F, rd);
+			int xx;
+			xx = A1.size() + B1.size() - 1;
+			for (int i = 0; i < xx; i++)
+			{
+				C1.push_back(CC);
+			}
+			xx = A2.size() + B2.size() - 1;
+			for (int i = 0; i < xx; i++)
+			{
+				C2.push_back(CC);
+			}
+			xx = A3.size() + B3.size() - 1;
+			for (int i = 0; i < xx; i++)
+			{
+				C3.push_back(CC);
+			}
+			karatsuba(F, VD, C1, A1, B1);
+			karatsuba(F, VD, C2, A2, B2);
+			karatsuba(F, VD, C3, A3, B3);
+			for (int i = 0; i < C1.size(); i++)
+			{
+				VD.addin<Vector, Vector>(C[i], C1[i]);
+			}
+			int mm = 2 * m;
+			for (int i = 0; i < C2.size(); i++)
+			{
+				VD.addin<Vector, Vector>(C[mm + i], C2[i]);
+			}
+			for (int i = 0; i < C3.size(); i++)
+			{
+				VD.addin<Vector, Vector>(C[m + i], C3[i]);
+			}
+			for (int i = 0; i < C1.size(); i++)
+			{
+				VD.subin<Vector, Vector>(C[m + i], C1[i]);
+			}
+			for (int i = 0; i < C2.size(); i++)
+			{
+				VD.subin<Vector, Vector>(C[m + i], C2[i]);
+			}
+			return C;
+		}
+		if (A.size() <= m)
+		{
+			vecV B1(B.begin(), B.begin() + m);
+			vecV B2(B.begin() + m, B.end());
+			vecV C1;
+			vecV C2;
+			Vector CC(F, rd);
+			int xx;
+			xx = A.size() + B1.size() - 1;
+			for (int i = 0; i < xx; i++)
+			{
+				C1.push_back(CC);
+			}
+			xx = A.size() + B2.size() - 1;
+			for (int i = 0; i < xx; i++)
+			{
+				C2.push_back(CC);
+			}
+			karatsuba(F, VD, C1, A, B1);
+			karatsuba(F, VD, C2, A, B2);
+			for (int i = 0; i < C1.size(); i++)
+			{
+				VD.addin<Vector, Vector>(C[i], C1[i]);
+			}
+			for (int i = 0; i < C2.size(); i++)
+			{
+				VD.addin<Vector, Vector>(C[m + i], C2[i]);
+			}
+			return C;
+		}
+		if (B.size() <= m)
+		{
+			vecM A1(A.begin(), A.begin() + m);
+			vecM A2(A.begin() + m, A.end());
+			vecV C1;
+			vecV C2;
+			Matrix CC(F, rd);
+			int xx;
+			xx = A1.size() + B.size() - 1;
+			for (int i = 0; i < xx; i++)
+			{
+				C1.push_back(CC);
+			}
+			xx = A2.size() + B.size() - 1;
+			for (int i = 0; i < xx; i++)
+			{
+				C2.push_back(CC);
+			}
+			karatsuba(F, VD, C1, A1, B);
+			karatsuba(F, VD, C2, A2, B);
+			for (int i = 0; i < C1.size(); i++)
+			{
+				VD.addin<Vector, Vector>(C[i], C1[i]);
+			}
+			for (int i = 0; i < C2.size(); i++)
+			{
+				VD.addin<Vector, Vector>(C[m + i], C2[i]);
+			}
+			return C;
+		}
+		return C;
+	}
+
+	template<class Field, class Vector3, class Vector1, class Vector2>
+	Vector1& SlicedPolynomialMatrixMulKaratsuba<Field, Vector3, Vector1, Vector2 >::operator()(const Field& GF,
+									   Vector3& C,
+									   const Vector1& A,
+									   const Vector2& B) const
+	{
+		//check dimensions
+		int xx;
+		vecV A1;
+		vecM B1;
+		xx = A.length();
+		for (int m = 0; m < xx; m++)
+		{
+			A1.push_back(A.getMatrixCoefficient(m));
+		}
+		xx = B.length();
+		for (int m = 0; m < xx; m++)
+		{
+			B1.push_back(B.getVectorCoefficient(m));
+		}
+		vecV C1;
+		xx = A1.size() + B1.size() - 1;
+		Vector CC(C.fieldF(), A.rowdim());
+		for (int i = 0; i < xx; i++)
+		{
+			C1.push_back(CC);
+		}
+		VectorDomain<IntField> VD(F);
+		karatsuba(C.fieldF(), VD, C1, A1, B1);
+		int mk = C1.size();
+		int mi = C1[0].rowdim();
+		int n = C.size();
+		Poly1Dom<IntField, Dense> PD(F);
+		for (int i = 0; i < mi; i++)
+		{
+			
+				polynomial entry;
+				for (int k = 0; k < mk; k++)
+				{
+					entry.push_back(C1[k].getEntry(i));
+				}
+				PD.modin(entry, C.irreducible);
+				for (int k = 0; k < n; k++)
+				{
+					C[k].setEntry(i, w1[k]);
+				}
+			
+		}
+		return C;
+	}
+} // LinBox
+
+#endif
diff --git a/linbox/vector/slicedpolynomialvector/SlicedPolynomialVector.h b/linbox/vector/slicedpolynomialvector/SlicedPolynomialVector.h
new file mode 100644
index 0000000..21f1613
--- /dev/null
+++ b/linbox/vector/slicedpolynomialvector/SlicedPolynomialVector.h
@@ -0,0 +1,173 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialVector_SlicedPolynomialVector_H
+#define __LINBOX_matrix_SlicedPolynomialVector_SlicedPolynomialVector_H
+
+#include <vector>
+#include "linbox/vector/blas-vector.h"
+#include <givaro/modular.h>
+#include <givaro/givpoly1dense.h>
+#include <givaro/givpoly1denseops.inl>
+
+namespace Linbox
+{
+	template <class _Field, class _Storage, class _VectorElement = double>
+	class SlicedPolynomialVector
+	/*Requirement: variable class _Field must be a representation of a field of order p^n
+	 *and have functions that return p (characteristic()) and p^n(cardinality()).
+	 *For example, GivaroGfq or LidiaGfq can be used.
+	 */
+
+        /*Description: this class implements representation of a vector over GF
+	 *as a vector of length n of vectors over F (BlasVectors),
+	 *which corresponds to representation of this vector as a polynomial of degree n-1 with vector-coefficients.
+	 */
+	{
+	public:
+		typedef _Field Field;
+		typedef typename Field::Element Element;
+		typedef _Storage Rep;
+		typedef _VectorElement VectorElement;
+		typedef Givaro::Modular<VectorElement, VectorElement> IntField;
+		typedef SlicedPolynomialVector<Field, Rep, VectorElement> Self_t;
+		typedef Givaro::Poly1Dom<IntField, Dense>::Rep polynomial;
+	private:
+		Field GF;
+		IntField F;
+	private:
+		int n; //GF.cardinality() == p^n
+		std::vector<BlasVector<IntField>> V;
+	public:
+		polynomial irreducible;
+	private:
+		polynomial& modulo(polynomial& g, polynomial&h, polynomial& f);
+		bool rabin(int n, int q, int a, int b);
+		void setIrreduciblePlynomial(int max_steps = 1000000);
+
+						////////////////
+		        			//Constructors//
+						////////////////
+
+	public:
+		/*! Allocates a vector of new zero vectors of size 0 (shaped and ready). Irreducible polynomial is chosen randomly.
+		 */
+		SlicedPolynomialVector (const Field &BF);
+
+		/*Allocates a vector of new vectors of size m (shaped and ready). Irreducible polynomial is chosen randomly.
+		 */
+		SlicedPolynomialVector (const Field &BF, const size_t &m);
+		
+		/*! Allocates a vector of new zero vectors of size 0 (shaped and ready).
+		 */
+		SlicedPolynomialVector (const Field &BF, polynomial& pp);
+
+		/*Allocates a vector of new vectors of size m (shaped and ready).
+		 */
+		SlicedPolynomialVector (const Field &BF, const size_t &m, polynomial& pp);
+
+						///////////////
+						// Destructor//
+						///////////////
+
+	public:
+		~SlicedPolynomialVector();
+
+						////////////////////////
+	          				//dimensions of vector//
+						////////////////////////
+
+	public:
+		/*Get length of V.
+		 * @returns length of V
+		 */
+		size_t length() const;
+		
+		/*Get the number of rows in a vector.
+		 * @returns Number of rows in a vector
+		 */
+		size_t rowdim() const;
+		
+	                    			/////////////////
+	                    			//return fields//
+	                    			/////////////////
+	
+	public:
+		const Field& fieldGF() const;
+
+		const IntField& fieldF() const;
+
+						/////////////////////////
+		        			//functions for entries//
+						/////////////////////////
+
+	public:
+		/* Set the entry of the m-th matrix-coefficient at the (k) position to a_mk.
+		 * @param m matrix-coefficient number, 0...length() - 1
+		 * @param k Row number 0...rowdim () - 1
+		 * @param a_mk Element to set
+		 */
+		void setEntry (size_t m, size_t k, const MatrixElement &a_mk);
+		
+	private:
+		/* Get a writeable reference to the m-th matrix-coefficient at the (k) position.
+		 * @param m matrix-coefficient number, 0...length() - 1
+		 * @param k Row number 0...rowdim () - 1
+		 * @returns Reference to matrix entry
+		 */
+		MatrixElement &refEntry (size_t m, size_t k);
+
+	public:
+		/* Get a read-only reference to the m-th matrix-coefficient at the (k) position.
+		 * @param m matrix-coefficient number, 0...length() - 1
+		 * @param k Row number 0...rowdim () - 1
+		 * @returns Const reference to matrix entry
+		 */
+		MatrixElement &getEntry (size_t m, size_t k);
+		
+						/////////////////////////////////////
+		                		//functions for matrix-coefficients//
+						/////////////////////////////////////
+						
+	public:
+		/* Set the m-th vector-coefficient to V_m.
+		 * @param m vector-coefficient number, 0...length() - 1
+		 * @param V_m matrix to set
+		 */
+		void setVectorCoefficient (size_t m, const BlasVector<IntField> &V_m) ;
+
+	private:
+		/* Get a writeable reference to the m-th matrix-coefficient.
+		 * @param m matrix-coefficient number, 0...length() - 1
+		 * @returns Reference to matrix-coefficent
+		 */
+		BlasVector<IntField> &refVectorCoefficient (size_t m) ;
+
+	public:
+		/** Get a read-only reference to the m-th matrix-coefficient
+		 * @param m matrix-coefficient number, 0...length() - 1
+		 * @returns Const reference to matrix-coefficent
+		 */
+		const BlasVector<IntField> &getVectorCoefficient (size_t m) const ;
+
+						/////////
+		                		//swaps//
+						/////////
+
+	public:
+		/* Swap i1-th and i2-th rows of matrices.
+		 * This is done inplace.
+		 */
+		void swapRows(size_t k1, size_t k2);
+		
+								//////////////////
+		                				//input / output//
+								//////////////////
+	
+	public:
+		std::istream &read (std::istream &file);
+
+		std::ostream &write (std::ostream &os) const;
+	};
+}
+
+#include "SlicedPolynomialVector.inl"
+
+#endif
\ No newline at end of file
diff --git a/linbox/vector/slicedpolynomialvector/SlicedPolynomialVector.inl b/linbox/vector/slicedpolynomialvector/SlicedPolynomialVector.inl
new file mode 100644
index 0000000..cda9456
--- /dev/null
+++ b/linbox/vector/slicedpolynomialvector/SlicedPolynomialVector.inl
@@ -0,0 +1,329 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialVector_SlicedPolynomialVector_INL
+#define __LINBOX_matrix_SlicedPolynomialVector_SlicedPolynomialVector_INL
+
+namespace Linbox
+{
+						//////////////////////////
+		        			//irreducible polynomial//
+						//////////////////////////
+
+	template < class _Field, class _Rep, class _VectorElement >
+	polynomial& SlicedPolynomialVector< _Field, _Rep, _VectorElement >::modulo(polynomial& g, polynomial&h, polynomial& f)
+	{
+		polynomial w1;
+		Poly1Dom<Domain,Dense>::div(w1, h, f);
+		polynomial w2;
+		Poly1Dom<Domain,Dense>::mul(w2, w1, f);
+		Poly1Dom<Domain,Dense>::sub(g, h, w2);
+		return g;
+	}
+	
+	/*
+	algorithm description
+	http://en.wikipedia.org/wiki/Factorization_of_polynomials_over_finite_fields#Rabin.27s_test_of_irreducibility
+	Algorithm Rabin Irreducibility Test
+	 Input: A monic polynomial f in Fq[x] of degree n, 
+	        p1, ..., pk all distinct prime divisors of n.
+	 Output: Either "f is irreducible" or "f is reducible".
+	 Begin
+	     for j = 1 to k do 
+	        n_j=n/p_j;
+	     for i = 1 to k do 
+	        h:=x^{q^{n_i}}-x \bmod f;
+	        g := gcd(f, h);
+	        if g ? 1, then return 'f is reducible' and STOP;
+	     end for;
+	     h:= x^{q^{n}}-x \bmod f;
+	     if h = 0, then return "f is irreducible", 
+	         else return "f is reducible"
+	 end.
+	 */
+	/*
+	function description
+	 Fq[x], f = x^n + bx + a
+	 returns true if f is irreducible and false if f is reducible
+	 */
+	template < class _Field, class _Rep, class _VectorElement >
+	bool SlicedPolynomialVector< _Field, _Rep, _VectorElement >::rabin(int n, int q, int a, int b)
+	{
+		polynomial f(n + 1);
+		f[0] = a;
+		f[1] = b;
+		for (int i = 2; i < n; i++)
+		{
+			f[i] = 0;
+		}
+		f[n] = 1;
+		std::vector<int> pd;
+		factorize(n, pd); //factorizes n into primes 
+		//n = pd[0]^alpha[0] * ... * pd[k - 1]^alpha[k - 1]
+		int k = pd.size();
+		std::vector<int> nd(k);
+		for (int j = 0; j < k; j++)
+		{
+			nd[j] = n / pd[j];
+		}
+		polynomial vector_zero();
+		assign(vector_zero, 0);
+		polynomial vector_one();
+		assign(vector_one, 1);
+		for (int j = 0; j < k; j++)
+		{
+			int h_size = pow(q, nd[j]) + 1;
+			polynomial h(h_size);
+			h[0] = 0;
+			h[1] = -1;
+			for (int i = 2; i < h_size - 1; i++)
+			{
+				h[i] = 0;
+			}
+			h[h_size - 1] = 1;
+			polynomial g;
+			Poly1Dom<IntField, Dense>::gcd (g, f, h);
+			bool g_equals_1 = g.areEqual(vector_one);
+			if (! g_equals_1)
+			{
+				return true; //f is irreducible
+			}
+		}
+		int h_size = pow(q, n) + 1;
+		polynomial h(h_size);
+		h[0] = 0;
+		h[1] = -1;
+		for (int i = 2; i < h_size - 1; i++)
+		{
+			h[i] = 0;
+		}
+		h[h_size - 1] = 1;
+		polynomial g;
+		modulo(g, h, f);//!!!
+		bool g_equals_0 = g.areEqual(vector_zero);
+		return g_equals_0; //if g = 0, then return "f is irreducible", else return "f is reducible" 
+	}
+	
+	template < class _Field, class _Rep, class _VectorElement >
+	void SlicedPolynomialVector< _Field, _Rep, _VectorElement >::setIrreduciblePlynomial(int max_steps)
+	{
+		bool found = false;
+		int w = F.characteristic();
+		for (int step = 0; (step < max_steps) && (!found); step++)
+		{
+			int a = rand() % w;
+			int b = rand() % w;
+			if (a + b > 0)
+			{
+				found = rabin(n, w, a, b);
+			}
+		}
+		irreducible.push_back(a);
+		irreducible.push_back(b);
+		for (int i = 1; i < n; i++)
+		{
+			irreducible.push_back(0);
+		}
+		irreducible.push_back(1);
+		return;
+	}
+	
+						////////////////
+		        			//Constructors//
+						////////////////
+
+	template < class _Field, class _Rep, class _VectorElement >
+	SlicedPolynomialVector< _Field, _Rep, _VectorElement >::SlicedPolynomialVector (const _Field &BF)
+	{
+		GF = BF;
+		F_temp = IntField(GF.characteristic());
+		F = F_temp;
+		n = GF.exponent(); //GF = GF(p^n)
+		for (size_t r = 0; r < n; r++)
+		{
+			V.emplace_back(BlasVector<IntField>(F));
+		}
+		setIrreduciblePolynomial();
+	}
+
+	template < class _Field, class _Rep, class _VectorElement >
+	SlicedPolynomialVector< _Field, _Rep, _VectorElement >::SlicedPolynomialVector (const _Field &BF, const size_t &m)
+	{
+		GF = BF;
+		F_temp = IntField(GF.characteristic()); //public function to set characteristic?
+		F = F_temp;
+		n = GF.exponent(); //GF = GF(p^n)
+		for (size_t r = 0; r < n; r++)
+		{
+			V.emplace_back(BlasVector<IntField>(F, m));
+		}
+		setIrreduciblePolynomial();
+	}
+	
+	template < class _Field, class _Rep, class _VectorElement >
+	SlicedPolynomialVector< _Field, _Rep, _VectorElement >::SlicedPolynomialVector (const _Field &BF, polynomial& pp)
+	{
+		GF = BF;
+		F_temp = IntField(GF.characteristic()); //public function to set characteristic?
+		F = F_temp;
+		n = GF.exponent(); //GF = GF(p^n)
+		for (size_t r = 0; r < n; r++)
+		{
+			V.emplace_back(BlasVector<IntField>(F));
+		}
+		irreducible = pp;
+	}
+
+	template < class _Field, class _Rep, class _VectorElement >
+	SlicedPolynomialVector< _Field, _Rep, _VectorElement >::SlicedPolynomialVector (const _Field &BF, const size_t &m, polynomial& pp)
+	{
+		GF = BF;
+		F_temp = IntField(GF.characteristic()); //public function to set characteristic?
+		F = F_temp;
+		n = GF.exponent(); //GF = GF(p^n)
+		for (size_t r = 0; r < n; r++)
+		{
+			V.emplace_back(BlasVector<IntField>(F, m));
+		}
+		irreducible = pp;
+	}
+
+						///////////////
+						// Destructor//
+						///////////////
+
+	template < class _Field, class _Rep, class _VectorElement >
+	SlicedPolynomialVector< _Field, _Rep, _VectorElement >::~SlicedPolynomialVector()
+	{
+		//LidiaGfq has a destructor, GivaroGfq doesn't, so currently field type members GF and F are not destroyed
+		V.~vector();
+		//if some members are added, delete them			
+	}
+						////////////////////////
+		        			//dimensions of vector//
+						////////////////////////
+
+        template < class _Field, class _Rep, class _VectorElement >
+	size_t SlicedPolynomialVector< _Field, _Rep, _VectorElement >::length() const
+	{
+		return V.size();				
+	}
+
+	template < class _Field, class _Rep, class _VectorElement >
+	size_t SlicedPolynomialVector< _Field, _Rep, _VectorElement >::rowdim() const
+	{
+		return V[0].size();				
+	}
+	
+	                    			/////////////////
+	                    			//return fields//
+	                    			/////////////////
+
+	template < class _Field, class _Rep, class _VectorElement >
+	const Field& SlicedPolynomialVector< _Field, _Rep, _VectorElement >::fieldGF() const
+	{
+		return GF;
+	}
+
+	template < class _Field, class _Rep, class _VectorElement >
+	const IntField& SlicedPolynomialVector< _Field, _Rep, _VectorElement >::fieldF() const
+	{
+		return F;
+	}
+
+						/////////////////////////
+		        			//functions for entries//
+						/////////////////////////
+		
+        template < class _Field, class _Rep, class _VectorElement >
+	void SlicedPolynomialVector< _Field, _Rep, _VectorElement >::setEntry (size_t m, size_t k, const VectorElement &a_mk)
+	{
+		V[m].setEntry(k, a_mk);
+	}
+
+	template < class _Field, class _Rep, class _VectorElement >
+	_VectorElement & SlicedPolynomialVector< _Field, _Rep, _VectorElement >::refEntry (size_t m, size_t k)
+	{
+		return V[m].refEntry(k);
+
+	}
+
+	template < class _Field, class _Rep, class _VectorElement >
+	_VectorElement & SlicedPolynomialVector< _Field, _Rep, _VectorElement >::getEntry (size_t m, size_t k)
+	{
+		return V[m].getEntry(k);
+
+	}
+	
+						/////////////////////////////////////
+		                		//functions for matrix-coefficients//
+						/////////////////////////////////////
+
+	template < class _Field, class _Rep, class _VectorElement >
+	void SlicedPolynomialVector< _Field, _Rep, _VectorElement >::setMatrixCoefficient (size_t m, const BlasVector<IntField> &V_m)
+	{
+		V[m] = V_m;
+	}
+
+	template < class _Field, class _Rep, class _VectorElement >
+	BlasVector<IntField> &SlicedPolynomialVector< _Field, _Rep, _VectorElement >::refMatrixCoefficient (size_t m)
+	{
+		return V[m];
+	}
+
+	template < class _Field, class _Rep, class _VectorElement >
+	const BlasVector<IntField> &SlicedPolynomialVector< _Field, _Rep, _VectorElement >::getMatrixCoefficient (size_t m) const
+	{
+		return V[m];
+	}
+
+						/////////
+		                		//swaps//
+						/////////
+
+	template < class _Field, class _Rep, class _VectorElement >
+	void SlicedPolynomialVector< _Field, _Rep, _VectorElement >::swapRows(size_t k1, size_t k2)
+	{
+		for (size_t m = 0; m < this->length(); m++)
+		{
+			VectorElement c = this->getEntry(m, k1);
+			this->setEntry(m, k1, this->getEntry(m, k2));
+			this->setEntry(m, k2, c);
+		}
+	}
+	
+						//////////////////
+		                		//input / output//
+						//////////////////	
+	template < class _Field, class _Rep, class _VectorElement >
+	std::istream& SlicedPolynomialVector< _Field, _Rep, _VectorElement >::read (std::istream &file)
+	{
+		int M = this->length();
+		int K = this->rowdim();
+		VectorElement c;
+		for (int m = 0; m < M; m++)
+		{
+			for (int k = 0; k < K; k++)
+			{
+				file >> c;
+				this->setEntry(m, k, c);
+			}
+		}
+		return file;
+	}
+	
+	template < class _Field, class _Rep, class _VectorElement >
+	std::ostream& SlicedPolynomialVector< _Field, _Rep, _VectorElement >::write (std::ostream &file)
+	{
+		int M = this->length();
+		int K = this->rowdim();
+		for (int m = 0; m < M; m++)
+		{
+			for (int k = 0; k < K; k++)
+			{
+					file << this->getEntry(m, k) << std::endl;
+			}
+			file << std::endl;
+		}
+		return file;
+	}
+}
+
+#endif
\ No newline at end of file
diff --git a/linbox/vector/slicedpolynomialvector/SlicedPolynomialVectorAddSub.h b/linbox/vector/slicedpolynomialvector/SlicedPolynomialVectorAddSub.h
new file mode 100644
index 0000000..69d5479
--- /dev/null
+++ b/linbox/vector/slicedpolynomialvector/SlicedPolynomialVectorAddSub.h
@@ -0,0 +1,53 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialVector_SlicedPolynomialVectorAddSub_H
+#define __LINBOX_matrix_SlicedPolynomialVector_SlicedPolynomialVectorAddSub_H
+
+#include <vector>
+#include "linbox/matrix/matrixdomain/vector-domain.h"
+#include "linbox/matrix/slicedpolynomialvector/SlicedPolynomialVector.h"
+
+namespace LinBox
+{
+	/* internal
+	 * Adding two vectors
+	 */
+	template< class Field, class Operand1, class Operand2, class Operand3>
+	class SlicedPolynomialVectorAdd
+	{
+	public:
+		Operand1 &operator() (const Field &F, Operand1 &C, const Operand2 &A, const Operand3 &B) const;
+
+	};
+
+	/* internal
+	 * Substracting two vectors
+	 */
+	template< class Field, class Operand1, class Operand2, class Operand3>
+	class SlicedPolynomialVectorSub
+	{
+	public:
+		Operand1 &operator() (const Field &F, Operand1 &C, const Operand2 &A, const Operand3 &B) const;
+
+	};
+
+	//! C += A
+	template< class Field, class Operand1, class Operand2>
+	class SlicedPolynomialVectorAddin
+	{
+	public:
+		Operand1 &operator() (const Field &F, Operand1 &C, const Operand2 &A) const;
+
+	};
+
+	//! C -= A
+	template< class Field, class Operand1, class Operand2>
+	class SlicedPolynomialVectorSubin
+	{
+	public:
+		Operand1 &operator() (const Field &F, Operand1 &C, const Operand2 &A) const;
+
+	};
+} /* end of namespace LinBox */
+
+#include "SlicedPolynomialVectorAddSub.inl"
+
+#endif
diff --git a/linbox/vector/slicedpolynomialvector/SlicedPolynomialVectorAddSub.inl b/linbox/vector/slicedpolynomialvector/SlicedPolynomialVectorAddSub.inl
new file mode 100644
index 0000000..2dadae8
--- /dev/null
+++ b/linbox/vector/slicedpolynomialvector/SlicedPolynomialVectorAddSub.inl
@@ -0,0 +1,75 @@
+#ifndef __LINBOX_matrix_SlicedPolynomialVector_SlicedPolynomialVectorAddSub_INL
+#define __LINBOX_matrix_SlicedPolynomialVector_SlicedPolynomialVectorAddSub_INL
+
+namespace LinBox
+{
+	template<class Field, class Vector1, class Vector2, class Vector3>
+	Vector1& SlicedPolynomialVectorAdd<Field, Vector1, Vector2, Vector3 >::operator()(const Field& F,
+									   Vector1& C,
+									   const Vector2& A,
+									   const Vector3& B) const
+	{
+		//check dimensions
+		BlasVector<Vector1::IntField> M(C.fieldF(), C.rowdim());
+		for (int m = 0; m < C.length(); m++)
+		{
+			VectorDomain<Vector1::IntField>.add(C.fieldF(),
+				M, A.getVectorCoefficient(m), B.getVectorCoefficient(m));
+			C.setVectorCoefficient(m, M);
+		}
+		return C;
+	}
+
+	template<class Field, class Vector1, class Vector2, class Vector3>
+	Vecto1r& SlicedPolynomialVectorSub<Field, Vector1, Vector2, Vector3 >::operator()(const Field& F,
+									   Vector1& C,
+									   const Vector2& A,
+									   const Vector3& B) const
+	{
+		//check dimensions
+		BlasVector<Vector1::IntField> M(C.fieldF(), C.rowdim());
+		for (int m = 0; m < C.length(); m++)
+		{
+			VectorDomain<Vector1::IntField>.sub(C.fieldF(),
+				M, A.getVectorCoefficient(m), B.getVectorCoefficient(m));
+			C.setVectorCoefficient(m, M);
+		}
+		return C;
+	}
+
+	template<class Field, class Vector1, class Vector3>
+	Vector1& SlicedPolynomialVectorAddin<Field, Vector1, Vector3 >::operator()(const Field& F,
+									   Vector1& C,
+									   const Vector3& B) const
+	{
+		//check dimensions
+		BlasVector<Vector1::IntField> M(C.fieldF(), C.rowdim());
+		for (int m = 0; m < C.length(); m++)
+		{
+			M = C.getVectorCoefficient(m);
+			VectorDomain<Vector1::IntField>.addin(C.fieldF(),
+				M, A.getVectorCoefficient(m), B.getVectorCoefficient(m));
+			C.setVectorCoefficient(m, M);
+		}
+		return C;
+	}
+
+	template<class Field, class Vector1, class Vector3>
+	Vector1& SlicedPolynomialVectorSubin<Field, Vector1, Vector3 >::operator()(const Field& F,
+									   Vector1& C,
+									   const Vector3& B) const
+	{
+		//check dimensions
+		BlasVector<Vector1::IntField> M(C.fieldF(), C.rowdim());
+		for (int m = 0; m < C.length(); m++)
+		{
+			M = C.getVectorCoefficient(m);
+			VectorDomain<Vector1::IntField>.add(C.fieldF(),
+				M, A.getVectorCoefficient(m), B.getVectorCoefficient(m));
+			C.setVectorCoefficient(m, M);
+		}
+		return C;
+	}
+} // LinBox
+
+#endif
\ No newline at end of file
diff --git a/linbox/vector/stream-gf2.h b/linbox/vector/stream-gf2.h
index 9d16a01..3e4141c 100644
--- a/linbox/vector/stream-gf2.h
+++ b/linbox/vector/stream-gf2.h
@@ -39,20 +39,20 @@
  *
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -171,15 +171,16 @@ namespace LinBox
 	_Vector &RandomSparseStreamGF2<_Vector>::get (_Vector &v)
 	{
 		size_t i = (size_t) -1;
-		double val;
-		int skip;
-
-		if (_m > 0 && _j++ >= _m)
+			if (_m > 0 && _j++ >= _m)
 			return v;
 
 		v.clear ();
 
 		while (1) {
+	double val;
+		int skip;
+
+
 			val = (double) MT.randomDouble ();
 			skip = (int) (ceil (log (val) * _1_log_1mp));
 
diff --git a/linbox/vector/stream.h b/linbox/vector/stream.h
index 76d1fa7..579dc5c 100644
--- a/linbox/vector/stream.h
+++ b/linbox/vector/stream.h
@@ -39,20 +39,20 @@
  *
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -71,13 +71,13 @@
 #ifndef __LINBOX_vector_stream_H
 #define __LINBOX_vector_stream_H
 
-#include <vector>
-#include <cmath>
 
+#include <givaro/givranditer.h>
 #include "linbox/util/debug.h"
-#include "linbox/vector/vector-traits.h"
-#include "linbox/randiter/nonzero.h"
 #include "linbox/randiter/mersenne-twister.h"
+#include "linbox/vector/vector-traits.h"
+#include <vector>
+#include <cmath>
 
 
 // stream
@@ -172,7 +172,15 @@ namespace LinBox
 		 * @param v Vector to use
 		 */
 		Vector &get (Vector &v)
-		{ if (_m == 0 || _j < _m) copy (_v.begin (), _v.end (), v.begin ()); return v; }
+		{
+			if (_m == 0 || _j < _m)
+				std::copy (_v.begin (), _v.end (), v.begin ());
+#ifdef _LB_DEBUG
+			else {
+				std::cerr << "Vector stream: nothing to get" << std::endl;
+			}
+#endif
+			return v; }
 
 		/** Extraction operator form
 		*/
@@ -205,26 +213,24 @@ namespace LinBox
 	};
 }
 
+
+// #include "linbox/vector/blas-vector.h"
 // Dense
 namespace LinBox
 {
+	template<class _Field, class _Rep> class BlasVector ;
+
 	/** @brief Random dense vector stream.
 	 * Generates a sequence of random dense vectors over a given field
 	 */
-	template <class Field, class _Vector = typename LinBox::Vector<Field>::Dense, class RandIter = typename Field::RandIter, class Trait = typename VectorTraits<_Vector>::VectorCategory>
+	template <typename Field, typename _Vector = BlasVector<Field, typename Vector<Field>::Dense>,
+              class RandIter = typename Field::RandIter,
+              class Trait = typename VectorTraits<_Vector>::VectorCategory>
 	class RandomDenseStream : public VectorStream<_Vector> {
 	public:
 		typedef _Vector Vector;
 		typedef RandomDenseStream<Field, Vector, RandIter, Trait> Self_t;
 
-		/** Constructor
-		 * Construct a new stream with the given field and vector size.
-		 * @param F Field over which to create random vectors
-		 * @param n Size of vectors
-		 * @param m Number of vectors to return (0 for unlimited)
-		 */
-		RandomDenseStream (const Field &F, size_t n, size_t m = 0);
-
 		/** Constructor.
 		 * Construct a new stream with the given field and vector size.
 		 * @param F Field over which to create random vectors
@@ -232,7 +238,7 @@ namespace LinBox
 		 * @param n Size of vectors
 		 * @param m Number of vectors to return (0 for unlimited)
 		 */
-		RandomDenseStream (const Field &F, const RandIter &r, size_t n, size_t m = 0);
+		RandomDenseStream (const Field &F, RandIter &r, size_t n, size_t m = 0);
 
 		/** Get next element
 		 * @param v Vector into which to generate random vector
@@ -272,11 +278,7 @@ namespace LinBox
 		typedef _Vector Vector;
 		typedef RandomDenseStream<Field, Vector, RandIter, VectorCategories::DenseVectorTag > Self_t;
 
-		RandomDenseStream (const Field &F, size_t nn, size_t mm = 0) :
-			_field (F), _r (F), _n (nn), _m (mm), _j (0)
-		{}
-
-		RandomDenseStream (const Field &F, const RandIter &r, size_t nn, size_t mm = 0) :
+		RandomDenseStream (const Field &F, RandIter &r, size_t nn, size_t mm = 0) :
 			_field (F), _r (r), _n (nn), _m (mm), _j (0)
 		{}
 
@@ -287,7 +289,7 @@ namespace LinBox
 			if ( (_m > 0) && (_j++ >= _m) )
 				return v;
 
-			for (i = v.begin (); i != v.end (); i++)
+			for (i = v.begin (); i != v.end (); ++i)
 				_r.random (*i);
 
 			return v;
@@ -305,7 +307,7 @@ namespace LinBox
 
 	private:
 		const Field &_field;
-		RandIter     _r;
+		RandIter     & _r;
 		size_t       _n;
 		size_t       _m;
 		size_t       _j;
@@ -313,27 +315,19 @@ namespace LinBox
 
 }
 
+#include "linbox/vector/sparse.h"
 //Sparse
 namespace LinBox
 {
 	/** @brief Random sparse vector stream.
 	 * Generates a sequence of random sparse vectors over a given field
 	 */
-	template <class Field, class _Vector = typename LinBox::Vector<Field>::Sparse, class RandIter = typename Field::RandIter, class Trait = typename VectorTraits<_Vector>::VectorCategory>
+	template <class Field, class _Vector = Sparse_Vector<typename Field::Element>, class RandIter = typename Field::RandIter, class Trait = typename VectorTraits<_Vector>::VectorCategory>
 	class RandomSparseStream : public VectorStream<_Vector> {
 	public:
 		typedef _Vector Vector;
 		typedef RandomSparseStream<Field, Vector, RandIter, Trait > Self_t;
 
-		/** Constructor
-		 * Construct a new stream with the given field and vector size.
-		 * @param F Field over which to create random vectors
-		 * @param p Proportion of nonzero entries
-		 * @param n Size of vectors
-		 * @param m Number of vectors to return (0 for unlimited)
-		 */
-		RandomSparseStream (const Field &F, double p, size_t n, size_t m = 0);
-
 		/** Constructor.
 		 * Construct a new stream with the given field and vector size.
 		 * @param F Field over which to create random vectors
@@ -343,7 +337,7 @@ namespace LinBox
 		 * @param m Number of vectors to return (0 for unlimited)
 		 * @param seed
 		 */
-		RandomSparseStream (const Field &F, const RandIter &r, double p, size_t n, size_t m = 0, int seed=(int)time (NULL));
+		RandomSparseStream (const Field &F, RandIter &r, double p, size_t n, size_t m = 0, int seed=(int)time (NULL));
 
 		/** Get next element
 		 * @param v Vector into which to generate random vector
@@ -387,37 +381,27 @@ namespace LinBox
 		typedef _Vector Vector;
 		typedef RandomSparseStream<Field, Vector, RandIter, VectorCategories::DenseVectorTag > Self_t;
 
-		RandomSparseStream (const Field &F, double p, size_t N, size_t M = 0) :
-			_field (F), _r1 (F), _r (F, _r1),
-			_n (N), _p (p), _m (M), _j (0),
-			MT ((uint32_t)time (NULL))
-		{
-			linbox_check ((p >= 0.0) && (p <= 1.0));
-			_field.init (_zero, 0);
-		}
-
-		RandomSparseStream (const Field &F, const RandIter &r, double p, size_t n, size_t m = 0, int seed=(int)time (NULL)) :
-			_field (F), _r1 (r), _r (F, _r1), _n (n), _p (p), _m (m), _j (0),
+		RandomSparseStream (const Field &F, RandIter &r, double p, size_t n, size_t m = 0, int seed=(int)time (NULL)) :
+			_field (F), _r1 (r), _r (_r1), _n (n), _p (p), _m (m), _j (0),
 			MT ((uint32_t)seed)
 		{
 			linbox_check ((p >= 0.0) && (p <= 1.0));
-			_field.init (_zero, 0);
 		}
 
 		Vector &get (Vector &v)
 		{
-			double val;
 
 			if (_m > 0 && _j++ >= _m)
 				return v;
 
 			for (typename Vector::iterator i = v.begin (); i != v.end (); ++i) {
+				double val;
 				val = MT.randomDouble ();
 
 				if (val < _p)
 					_r.random (*i);
 				else
-					_field.assign (*i, _zero);
+					_field.assign (*i, _field.zero);
 			}
 
 			return v;
@@ -436,9 +420,8 @@ namespace LinBox
 
 	private:
 		const Field                      &_field;
-		typename Field::Element           _zero;
-		RandIter                          _r1;
-		NonzeroRandIter<Field, RandIter>  _r;
+		RandIter                         & _r1;
+        Givaro::GeneralRingNonZeroRandIter<Field, RandIter>  _r;
 		size_t                            _n;
 		double                            _p;
 		size_t                            _m;
@@ -450,26 +433,25 @@ namespace LinBox
 	template <class Field, class _Vector, class RandIter>
 	class RandomSparseStream<Field, _Vector, RandIter, VectorCategories::SparseSequenceVectorTag > : public VectorStream<_Vector> {
 	public:
+		typedef RandomSparseStream<Field, _Vector, RandIter, VectorCategories::SparseSequenceVectorTag > Self_t;
 		typedef _Vector Vector;
-		typedef RandomSparseStream<Field, Vector, RandIter, VectorCategories::SparseSequenceVectorTag > Self_t;
-
-		RandomSparseStream (const Field &F, double p, size_t N, size_t M = 0) :
-			_field (F), _r1 (F), _r (F, _r1), _n (N), _m (M), _j (0),
-			MT ((uint32_t)time (NULL))
-		{ setP (p); }
 
-		RandomSparseStream (const Field &F, const RandIter &r, double p,
+		RandomSparseStream (const Field &F, RandIter &r, double p,
 				    size_t N, size_t M = 0, int seed=(int)time (NULL)) :
-			_field (F), _r1 (r), _r (F, _r1), _n (N), _p (p), _m (M), _j (0),
-			MT ((uint32_t)seed)
+                _field (F), 
+                _r1 (r), 
+                _r (r), 
+                _n (N), 
+                _p (p), 
+                _m (M), 
+                _j (0),
+                MT ((uint32_t)seed)
 		{ setP (p); }
 
 		Vector &get (Vector &v)
 		{
 			typename Field::Element x;
 			size_t i = (size_t) -1;
-			double val;
-			int skip;
 
 			if (_m > 0 && _j++ >= _m)
 				return v;
@@ -477,6 +459,10 @@ namespace LinBox
 			v.clear ();
 
 			while (1) {
+
+				double val;
+				int skip;
+
 				val = MT.randomDouble ();
 				skip = (int) (ceil (log (val) * _1_log_1mp));
 
@@ -513,8 +499,8 @@ namespace LinBox
 
 	private:
 		const Field                      &_field;
-		RandIter                          _r1;
-		NonzeroRandIter<Field, RandIter>  _r;
+		RandIter                         & _r1;
+		Givaro::GeneralRingNonZeroRandIter<Field, RandIter>  _r;
 		size_t                            _n;
 		double                            _p;
 		double                            _1_log_1mp;
@@ -530,29 +516,24 @@ namespace LinBox
 		typedef _Vector Vector;
 		typedef RandomSparseStream<Field, Vector, RandIter, VectorCategories::SparseAssociativeVectorTag > Self_t;
 
-		RandomSparseStream (const Field &F, double p, size_t N, size_t M = 0) :
-			_field (F), _r1 (F), _r (F, _r1),
-			_n (N), _k ((long) (p * (double)N)), _j (0), _m (M),
-			MT ((uint32_t)time (NULL))
-		{}
-
-		RandomSparseStream (const Field &F, const RandIter &r, double p, size_t N,
+		RandomSparseStream (const Field &F, RandIter &r, double p, size_t N,
 				    size_t M = 0, int seed=(int)time (NULL)) :
-			_field (F), _r1 (F), _r (F, _r1), _n (N), _k ((long) (p * N)), _j (0), _m (M),
+			_field (F), _r1 (r), _r (_r1), _n (N), _k ((long) (p * N)), _j (0), _m (M),
 			MT ((uint32_t) seed)
 		{}
 
 		Vector &get (Vector &v)
 		{
 			typename Field::Element x;
-			int i, idx;
+			int i;
 
 			if (_m > 0 && _j++ >= _m)
 				return v;
 
 			v.clear ();
 
-			for (i = 0; i < _k; i++) {
+			for (i = 0; i < _k; ++i) {
+				size_t idx;
 				_r.random (x);
 				while (!_field.isZero (v[idx = MT.randomIntRange (0, (uint32_t)_n)])) ;
 				v[idx] = x;
@@ -574,8 +555,8 @@ namespace LinBox
 
 	private:
 		const Field                      &_field;
-		RandIter                          _r1;
-		NonzeroRandIter<Field, RandIter>  _r;
+		RandIter                         & _r1;
+		Givaro::GeneralRingNonZeroRandIter<Field, RandIter> _r;
 		size_t                            _n;
 		long                              _k;
 		size_t                            _j;
@@ -590,13 +571,8 @@ namespace LinBox
 		typedef _Vector Vector;
 		typedef RandomSparseStream<Field, Vector, RandIter, VectorCategories::SparseParallelVectorTag > Self_t;
 
-		RandomSparseStream (const Field &F, double p, size_t nn, size_t mm = 0) :
-			_field (F), _r1 (F), _r (F, _r1), _n (nn), _m (mm), _j (0),
-			MT ((uint32_t)time (NULL))
-		{ setP (p); }
-
-		RandomSparseStream (const Field &F, const RandIter &r, double p, size_t nn, size_t mm = 0, int seed=(int)time (NULL)) :
-			_field (F), _r1 (r), _r (F, _r1), _n (nn), _m (mm), _j (0),
+		RandomSparseStream (const Field &F, RandIter &r, double p, size_t nn, size_t mm = 0, int seed=(int)time (NULL)) :
+			_field (F), _r1 (r), _r (_r1), _n (nn), _m (mm), _j (0),
 			MT ((uint32_t)seed)
 		{ setP (p); }
 
@@ -604,8 +580,6 @@ namespace LinBox
 		{
 			typename Field::Element x;
 			size_t i = (size_t) -1;
-			double val;
-			int skip;
 
 			if (_m > 0 && _j++ >= _m)
 				return v;
@@ -614,11 +588,15 @@ namespace LinBox
 			v.second.clear ();
 
 			while (1) {
+
+				double val;
+			int skip;
+
 				val = MT.randomDouble ();
 				skip = (int) (ceil (log (val) * _1_log_1mp));
 
 				if (skip <= 0)
-					i++;
+					++i;
 				else
 					i += (size_t) skip;
 
@@ -652,8 +630,8 @@ namespace LinBox
 
 	private:
 		const Field                      &_field;
-		RandIter                          _r1;
-		NonzeroRandIter<Field, RandIter>  _r;
+		RandIter                         & _r1;
+        Givaro::GeneralRingNonZeroRandIter<Field, RandIter>  _r;
 		size_t                            _n;
 		double                            _p;
 		double                            _1_log_1mp;
@@ -734,18 +712,17 @@ namespace LinBox
 
 		Vector &get (Vector &v)
 		{
-			static typename Field::Element zero;
 			typename Vector::iterator i;
-			size_t idx;
 
-			for (i = v.begin (), idx = 0; i != v.end (); i++, idx++) {
+			size_t idx;
+			for (i = v.begin (), idx = 0; i != v.end (); ++i, ++idx) {
 				if (idx == _j)
-					_field.init (*i, 1);
+					_field.assign(*i, _field.one);
 				else
-					_field.assign (*i, zero);
+					_field.assign (*i, _field.zero);
 			}
 
-			_j++;
+			++_j;
 
 			return v;
 		}
@@ -753,11 +730,19 @@ namespace LinBox
 		/** Extraction operator form
 		*/
 		Self_t &operator >> (Vector &v)
-		{ get (v); return *this; }
+		{
+			get (v);
+			return *this;
+		}
+
 		size_t size () const { return _n; }
+
 		size_t pos () const { return _j; }
+
 		size_t dim () const { return _n; }
+
 		operator bool () const { return _j < _n; }
+
 		void reset () { _j = 0; }
 
 	private:
@@ -775,14 +760,15 @@ namespace LinBox
 
 		StandardBasisStream (Field &F, size_t N) :
 			_field (F), _n (N), _j (0)
-		{ _field.init (_one, 1); }
+		{
+		}
 
 		Vector &get (Vector &v)
 		{
 			v.clear ();
 
 			if (_j < _n)
-				v.push_back (std::pair <size_t, typename Field::Element> (_j++, _one));
+				v.push_back (std::pair <size_t, typename Field::Element> (_j++, _field.one));
 
 			return v;
 		}
@@ -801,7 +787,6 @@ namespace LinBox
 		const Field              &_field;
 		size_t                    _n;
 		size_t                    _j;
-		typename Field::Element   _one;
 	};
 
 	//! Specialization of standard basis stream for sparse associative vectors
@@ -813,14 +798,15 @@ namespace LinBox
 
 		StandardBasisStream (Field &F, size_t N) :
 			_field (F), _n (N), _j (0)
-		{ _field.init (_one, 1); }
+		{
+		}
 
 		Vector &get (Vector &v)
 		{
 			v.clear ();
 
 			if (_j < _n)
-				v.insert (std::pair <size_t, typename Field::Element> (_j++, _one));
+				v.insert (std::pair <size_t, typename Field::Element> (_j++, _field.one));
 
 			return v;
 		}
@@ -839,7 +825,6 @@ namespace LinBox
 		const Field              &_field;
 		size_t                    _n;
 		size_t                    _j;
-		typename Field::Element   _one;
 	};
 
 	//! Specialization of standard basis stream for sparse parallel vectors
@@ -851,7 +836,7 @@ namespace LinBox
 
 		StandardBasisStream (Field &F, size_t N) :
 			_field (F), _n (N), _j (0)
-		{ _field.init (_one, 1); }
+		{  }
 
 		Vector &get (Vector &v)
 		{
@@ -860,7 +845,7 @@ namespace LinBox
 
 			if (_j < _n) {
 				v.first.push_back (_j++);
-				v.second.push_back (_one);
+				v.second.push_back (_field.one);
 			}
 
 			return v;
@@ -880,7 +865,6 @@ namespace LinBox
 		const Field              &_field;
 		size_t                    _n;
 		size_t                    _j;
-		typename Field::Element   _one;
 	};
 
 } // namespace LinBox
@@ -891,11 +875,10 @@ namespace LinBox
 
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/subiterator.h b/linbox/vector/subiterator.h
old mode 100644
new mode 100755
index 483544b..1362925
--- a/linbox/vector/subiterator.h
+++ b/linbox/vector/subiterator.h
@@ -5,20 +5,20 @@
  * Mods by -bds
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -57,11 +57,16 @@ namespace LinBox
 		typedef typename std::iterator_traits<Iterator>::pointer		pointer;
 		typedef typename std::iterator_traits<Iterator>::reference		reference;
 
-		// Constructors
 
-		Subiterator () {}
+		// Basic constructors
 
-		/** Subiterator p (pp, 3) provides an iterator which initially  has
+		Subiterator ()
+		{
+		}
+
+		/** Constructors.
+		 *
+		 *  Subiterator p (pp, 3) provides an iterator which initially  has
 		 *  the same reference, but for which increments and offsets step by
 		 *  the amount stride rather than 1.
 		 *  Thus p+k is equivalent to pp+(stride*k).
@@ -71,87 +76,189 @@ namespace LinBox
 		 *  iterator only when it has a valid reference.
 		 */
 		Subiterator (const Iterator &iter, const difference_type& stride = 1) :
-		       	_iter (iter), _stride (stride) {}
+			_iter (iter), _stride (stride)
+		{
+		}
 
+		// copy-constructor
+		Subiterator (const Subiterator & iter) :
+			_iter (iter._iter), _stride (iter._stride)
+		{
+		}
+
+		Subiterator (Iterator & iter) :
+			_iter (iter._iter), _stride (iter._stride)
+		{
+		}
+
+		// constructor
 		template<class Iterator2>
 		Subiterator (const Subiterator<Iterator2>& iter) :
-		       	_iter (iter._iter), _stride (iter._stride) {}
+			_iter (iter._iter), _stride (iter._stride)
+		{
+		}
+
+		template<class Iterator2>
+		Subiterator (Subiterator<Iterator2>& iter) :
+			_iter (iter._iter), _stride (iter._stride)
+		{
+		}
 
+		// copy-assign
 
 		template<class Iterator2>
 		Subiterator& operator = (const Subiterator<Iterator2>& sub)
 		{
-			_iter=sub._iter;
-			_stride=sub._stride;
+			_iter  =sub.showIterator();
+			_stride=sub.showStride();
+			return *this;
+		}
+
+		Subiterator& operator = (const Subiterator& sub)
+		{
+			_iter  =sub.showIterator();
+			_stride=sub.showStride();
 			return *this;
 		}
 
 		// Access operations
-		reference operator * () const
-		{ return *_iter; }
+		const reference operator * () const
+		{
+			return *_iter;
+		}
+
+		reference operator * ()
+		{
+			return *_iter;
+		}
 
 		Iterator operator -> () const
-		{ return _iter; }
+		{
+			return _iter;
+		}
 
-		reference operator [] (difference_type n) const
-		{ return _iter[n * _stride]; }
+		reference operator [] (difference_type n) 
+		{
+			return _iter[n * _stride];
+		}
+
+		const reference operator [] (difference_type n) const
+		{
+			return _iter[n * _stride];
+		}
 
 		// Iteration operations
 
 		Subiterator& operator ++ ()
-		{ _iter += _stride; return *this; }
+		{ 
+			_iter += _stride;
+			return *this;
+		}
 
 		Subiterator operator ++ (int)
-		{ Subiterator tmp = *this; _iter += _stride; return tmp; }
+		{
+			Subiterator tmp = *this;
+			_iter += _stride;
+			return tmp;
+		}
 
 		Subiterator& operator -- ()
-		{ _iter -= _stride; return *this; }
+		{
+			_iter -= _stride;
+			return *this;
+		}
 
 		Subiterator operator -- (int)
-		{ Subiterator tmp = *this; _iter -= _stride; return tmp; }
+		{
+			Subiterator tmp = *this;
+			_iter -= _stride;
+			return tmp;
+		}
 
 		Subiterator operator + (difference_type n) const
-		{ return Subiterator (_iter + (n * _stride), _stride); }
+		{
+			return Subiterator (_iter + (n * _stride), _stride);
+		}
 
 		Subiterator& operator += (difference_type n)
-		{ _iter += (n * _stride); return *this; }
+		{
+			_iter += (n * _stride);
+			return *this;
+		}
 
 		Subiterator operator - (difference_type n) const
-		{ return Subiterator (_iter - (n * _stride), _stride); }
+		{
+			return Subiterator (_iter - (n * _stride), _stride);
+		}
 
 		difference_type operator - (const Subiterator& x) const
-		{ return (_iter - x._iter)/_stride; }
+		{
+			return (_iter - x._iter)/_stride;
+		}
 
 		Subiterator& operator -= (difference_type n)
-		{ _iter -= (n * _stride); return *this; }
+		{
+			_iter -= (n * _stride);
+			return *this;
+		}
 
 		// Comparison operations
 
 		bool operator == (const Subiterator& i) const
-		{ return ( (this->_stride == i._stride) && (this->_iter == i._iter) ); }
+		{
+			return ( (this->_stride == i._stride) && (this->_iter == i._iter) );
+		}
 
 		bool operator != (const Subiterator& i) const
-		{ return !(*this == i); }
+		{
+			return !(*this == i);
+		}
 
 		bool operator < (const Subiterator& i) const
-		{ return (this->_iter < i._iter); }
+		{
+			return (this->_iter < i._iter);
+		}
 
 		bool operator > (const Subiterator& i) const
-		{ return (this->_iter > i._iter); }
+		{
+			return (this->_iter > i._iter);
+		}
 
 		bool operator <= (const Subiterator& i) const
-		{ return (this->_iter <= i._iter); }
+		{
+			return (this->_iter <= i._iter);
+		}
 
 		bool operator >= (const Subiterator& i) const
-		{ return (this->_iter >= i._iter); }
+		{
+			return (this->_iter >= i._iter);
+		}
+
+		// swap
 
 		void swap (Subiterator& x)
-		{ std::swap (_iter, x._iter); std::swap (_stride, x._stride); }
+		{
+			std::swap (_iter, x._iter); std::swap (_stride, x._stride);
+		}
+
+		// view protected members
+
+		difference_type showStride() const
+		{
+			return this->_stride ;
+		}
+
+		const Iterator & showIterator() const
+		{
+			return this->_iter ;
+		}
+
 
 	protected:
 
-		Iterator	_iter;		// wrapped iterator
-		difference_type	_stride;	// length between iterations
+		Iterator          _iter;	//!< @internal wrapped iterator
+
+		difference_type	_stride;	//!< @internal length between iterations
 
 	}; // template <class Iterator> class Subiterator
 
@@ -160,11 +267,10 @@ namespace LinBox
 #endif // __LINBOX_subiterator_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/subvector.h b/linbox/vector/subvector.h
old mode 100644
new mode 100755
index 141d131..0d0d9c9
--- a/linbox/vector/subvector.h
+++ b/linbox/vector/subvector.h
@@ -32,10 +32,10 @@
 #ifndef __LINBOX_subvector_H
 #define __LINBOX_subvector_H
 
-#include "linbox/vector/subiterator.h"
+//#include "linbox/vector/subiterator.h" BB:not used here
 #include <iterator>
-#include "linbox/vector/vector-traits.h"
 #include <stdexcept>
+#include "linbox/vector/vector-traits.h"
 
 namespace LinBox
 {
@@ -82,9 +82,18 @@ namespace LinBox
 
 		template<class Vector>
 		Subvector (Vector& v, size_type start, size_type stride, size_type length) :
-			_begin (iterator (v.begin() + start, stride)),
-			_end   (iterator (v.begin() + start + (stride * length), stride))
+			_begin (iterator (v.begin() + (ptrdiff_t)start, (ptrdiff_t)stride)),
+			_end   (iterator (v.begin() + (ptrdiff_t)start + (ptrdiff_t)(stride * length), (ptrdiff_t)stride))
+		{
+		}
+
+#if 0
+		template<lass otherIterator>
+		Subvector (otheriterator Begin, size_type start, size_type stride, size_type length) :
+			_begin (iterator (Begin + (ptrdiff_t)start, (ptrdiff_t)stride)),
+			_end   (iterator (Begin + (ptrdiff_t)start + (ptrdiff_t)(stride * length), (ptrdiff_t)stride))
 		{}
+#endif
 
 		Subvector(iterator Begin, iterator End) :
 			_begin(Begin), _end(End)
@@ -115,8 +124,8 @@ namespace LinBox
 
 		// Element access
 
-		reference       operator[] (size_type n)       { return _begin[n]; }
-		const_reference operator[] (size_type n) const { return _begin[n]; }
+		reference       operator[] (size_type n)       { return _begin[(ptrdiff_t)n]; }
+		const_reference operator[] (size_type n) const { return const_cast<iterator*>(&_begin)->operator[]((ptrdiff_t)n); }
 
 		// the method "at" does appear to be implemented
 		// in the gnu implementation of the STL
@@ -131,6 +140,8 @@ namespace LinBox
 
 		const_reference at(size_type n) const
 		{
+std::cerr << "n: " << n << std::endl;
+std::cerr << "_end-_begin: " << (int)(_end-_begin) << std::endl;
 			const_iterator p = _begin + n;
 			if ( _begin <= p && p < _end)
 				return *p;
@@ -184,10 +195,10 @@ namespace LinBox
 		Subvector& operator=(const Subvector& sub)
 		{ _begin = sub._begin; _end = sub._end; return *this; }
 
-		size_type size      (void) const { return _end - _begin; }
-		bool      empty     (void) const { return _end == _begin; }
-		size_type max_size  (void) const { return _end - _begin; }
-		//size_type capacity(void) const { return _end - _begin; }
+		size_type size      (void) const { return (size_t)(_end -  _begin); }
+		bool      empty     (void) const { return (size_t)(_end == _begin); }
+		size_type max_size  (void) const { return (size_t)(_end -  _begin); }
+		//size_type capacity(void) const { return (size_t)(_end -  _begin); }
 
 		// Swap
 		void swap (Subvector& x)
@@ -231,9 +242,11 @@ namespace LinBox
 } // namespace LinBox
 
 
+//! @warning why do we need this ?
 namespace std
 {
 
+#if 0
 	template<class _Tp>
 	void swap (_Tp&, _Tp&)
 #ifdef __GNUC__
@@ -245,6 +258,7 @@ namespace std
 #endif
 #endif
 	    ;
+#endif
 
 
 
@@ -263,11 +277,10 @@ namespace std
 #endif //__LINBOX_subvector_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/vector-domain-gf2.h b/linbox/vector/vector-domain-gf2.h
index 0743951..01ad2b5 100644
--- a/linbox/vector/vector-domain-gf2.h
+++ b/linbox/vector/vector-domain-gf2.h
@@ -32,20 +32,20 @@
  *
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -66,7 +66,7 @@ namespace LinBox
 
 
 	template<>
-	class DotProductDomain<GF2> : private virtual VectorDomainBase<GF2> {
+	class DotProductDomain<GF2> : public  VectorDomainBase<GF2> {
 	public:
 
 		typedef bool Element;
@@ -98,19 +98,21 @@ namespace LinBox
 {
 
 	template <>
-	class VectorDomain<GF2> : private virtual VectorDomainBase<GF2>, private virtual DotProductDomain<GF2> {
+	//class VectorDomain<GF2> : private virtual VectorDomainBase<GF2> , private virtual DotProductDomain<GF2> {
+        class VectorDomain<GF2> : public DotProductDomain<GF2> {
 	public:
 		typedef bool Element;
 
 		VectorDomain (const VectorDomain &VD) :
-			VectorDomainBase<GF2> (VD._field), DotProductDomain<GF2> (VD._field)
+			//VectorDomainBase<GF2> (VD.field()), DotProductDomain<GF2> (VD.field())
+                        DotProductDomain<GF2> (VD.field())
 		{}
 
 		VectorDomain &operator = (const VectorDomain &) { return *this; }
 
 		const GF2 &field () const
 		{
-			return _field;
+			return DotProductDomain<GF2>::field();
 		}
 
 		template <class Vector>
@@ -254,7 +256,8 @@ namespace LinBox
 		}
 
 		VectorDomain (const GF2 &F) :
-			VectorDomainBase<GF2> (F), DotProductDomain<GF2> (F)
+			//VectorDomainBase<GF2> (F), DotProductDomain<GF2> (F)
+                        DotProductDomain<GF2> (F)
 		{}
 
 
@@ -508,7 +511,7 @@ namespace LinBox
 			add (u, w, v);
 			copy (res, u);
 
-			return u;
+			return res;
 		}
 
 		template <class Vector1, class Vector2, class Vector3>
@@ -526,7 +529,7 @@ namespace LinBox
 			sub (u, w, v);
 			copy (res, u);
 
-			return u;
+			return res;
 		}
 	};
 
@@ -538,11 +541,11 @@ namespace LinBox
 
 #endif // __LINBOX_field_vector_domain_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
 
diff --git a/linbox/vector/vector-domain.h b/linbox/vector/vector-domain.h
index 06767dc..a39943f 100644
--- a/linbox/vector/vector-domain.h
+++ b/linbox/vector/vector-domain.h
@@ -31,21 +31,25 @@
  * Added methods add, addin, sub, subin, areEqual, isZero, and copy.
  *
  * ------------------------------------
+ * 2012Aug -bds
+ * VectorDomain<F> inherits from DotProductDomain<F>, which inherits from VectorDomainBase<F>.
+ * DotProductDomain<> has a generic definition here and
+ * has specializations in field/Modular/ and field/Givaro/.
+ * ------------------------------------
  *
- * 
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -75,19 +79,17 @@ namespace LinBox
 	template <class Field>
 	class VectorDomainBase {
 	public:
-		VectorDomainBase (const Field &F) :
-			_field (F), accu(F)
-		{}
-
-		VectorDomainBase& operator= (const VectorDomainBase& VD)
-		{	_field = VD._field;
-			accu = VD.accu;
-			return *this;
-		}
-
+		VectorDomainBase () : _faxpy(nullptr) {std::cout<<"CST DEFAULT VDB"<<std::endl;}
+		VectorDomainBase (const Field &F) :  _faxpy(new FieldAXPY<Field>(F))
+                { /*std::cerr << "VDD cstor " << this << std::endl;*/}
+                ~VectorDomainBase()	{ if (_faxpy != nullptr) delete _faxpy; }
+
+		void init(const Field &F) { if (_faxpy != nullptr) delete _faxpy; _faxpy = new FieldAXPY<Field>(F); }
+		inline const Field & field() const { return _faxpy->field(); }
+		inline const FieldAXPY<Field>& faxpy() const { return *_faxpy; }
+	
 	protected:
-		Field _field;
-		mutable FieldAXPY<Field> accu;
+		const FieldAXPY<Field> * _faxpy;
 	};
 }
 
@@ -104,15 +106,22 @@ namespace LinBox
 	 * critical for performance, so their implementations are in the derived
 	 * class VectorDomain.
 	 */
-	template <class Field>
-	class DotProductDomain : public virtual VectorDomainBase<Field> {
+	template <class Field_>
+        //	class DotProductDomain : public virtual VectorDomainBase<Field_> {
+        class DotProductDomain : public VectorDomainBase<Field_> {
 	public:
+		//DotProductDomain () { /*std::cerr << "DPD def cstor" << std::endl;*/ }// no def cstor allowed
 
+		typedef Field_ Field;
 		typedef typename Field::Element Element;
 
 		DotProductDomain (const Field &F) :
 			VectorDomainBase<Field> (F)
-		{}
+		{  /*std::cerr << "DPD cstor " << this << std::endl; */}
+
+		using VectorDomainBase<Field>::field;
+		using VectorDomainBase<Field>::init;
+
 
 	protected:
 		template <class Vector1, class Vector2>
@@ -127,6 +136,35 @@ namespace LinBox
 
 namespace LinBox
 { /*  Vector Domain */
+/* public members
+VectorDomain<F>()
+VectorDomain<F>(VD)
+VectorDomain (F)
+VD1 = VD2
+VD.field()
+VD.write<V>(os, v)
+VD.read<V>(os, v)
+VD.copy<V1,V2>(v1,v2)
+VD.copy<V1,V2>(v1,v2,i,n)
+VD.areEqual<V1,V2>(v1,v2)
+VD.isZero<V>(v)
+VD.dot<V1,V2>(e,v1,v2) aka dotprod
+VD.add<V1,V2,V3>(v1,v2,v3)
+VD.addin<V1,V2>(v1,v2)
+VD.sub<V1,V2,V3>(v1,v2,v3)
+VD.subin<V1,V2>(v1,v2)
+VD.neg<V1,V2>(v1,v2)
+VD.negin<V>(v)
+VD.mul<V1,V2>(v1,v2,e)
+VD.mulin<V>(v,e)
+VD.axpy<V1,V2,V3>(v1,e,v2,v3)
+VD.axpyin<V1,V2>(v1,e,v2)
+VD.swap<V1,V2>(v1,v2)
+VD.random<V>(v)
+class Transposition;
+class Permutation;
+VD.permute<V,PI>(v1,pb,pe)
+*/
 
 	/** @name Vector Domain
 	 * @brief Vector arithmetic
@@ -144,12 +182,21 @@ namespace LinBox
 	 */
 	// JGD 01.10.2003 : Why inherit twice from VectorDomainBase<Field> ???
 	// bds 2004Apr25 : well, g++ 3.4.3 wants explicit base domains on everything - eases that.
-	template <class Field>
-	class VectorDomain : public virtual DotProductDomain<Field>, public virtual VectorDomainBase<Field> {
+	template <class Field_>
+        //	class VectorDomain : public virtual DotProductDomain<Field_> , public virtual VectorDomainBase<Field_> {
+        class VectorDomain : public  DotProductDomain<Field_> {
 	public:
 
+		typedef Field_ Field;
+
 		typedef typename Field::Element         Element;
 
+		// VectorDomain(): DotProductDomain<Field>() { /*std::cerr << "VD def cstor" << std::endl;*/ }
+		//VectorDomain():DotProductDomain<Field>() {}
+
+                //using VectorDomainBase<Field>::init;
+                using DotProductDomain<Field>::init;
+
 		/** Copy constructor.
 		 * Constructs VectorDomain object by copying the domain.
 		 * This is required to allow vector domain objects to be passed
@@ -157,17 +204,29 @@ namespace LinBox
 		 * @param  VD VectorDomain object.
 		 */
 		VectorDomain (const VectorDomain &VD) :
-			VectorDomainBase<Field> (VD._field), DotProductDomain<Field> (VD._field)
+                        //VectorDomainBase<Field> (VD.field()),
+                        DotProductDomain<Field> (VD.field())
 		{}
 
+                /** Construct from a field.
+		 * @param F Field or ring
+		 */
+		VectorDomain (const Field &F) :
+			//VectorDomainBase<Field> (F), DotProductDomain<Field> (F)
+                        DotProductDomain<Field> (F)
+		{/* std::cerr << "VD cstor " << this << std::endl;*/}
+
+
+
 		/** Assignment operator.
 		 * Assigns VectorDomain object MD to field.
 		 * @param  VD VectorDomain object.
 		 */
 		VectorDomain &operator = (const VectorDomain &VD)
 		{
-			VectorDomainBase<Field>:: _field = VD._field;
-			VectorDomainBase<Field>:: accu = VD.accu;
+			this->init(VD.field());
+			//this->_field = VD._field;
+			//VectorDomainBase<Field>:: accu = VD.accu;
 			return *this;
 		}
 
@@ -177,10 +236,8 @@ namespace LinBox
 		 * @return reference to field
 		 */
 
-		const Field &field () const
-		{
-			return VectorDomainBase<Field>:: _field;
-		}
+		//using VectorDomainBase<Field>::field;
+                using DotProductDomain<Field>::field;
 
 		/** Vector input/output operations
 		 * These routines are useful for reading and writing vectors to
@@ -482,21 +539,7 @@ namespace LinBox
 
 		//@}
 
-		/** @name Implementation-Specific Methods.
-		 * These methods are not required of all \ref LinBox\ Fields
-		 * and are included only for this implementation of the archetype.
-		 */
-		//@{
-
-		/** Construct from a field.
-		 * @param F Field from which to construct
-		 */
-		VectorDomain (const Field &F) :
-			VectorDomainBase<Field> (F),DotProductDomain<Field> (F)
-		{}
-
-		//@} Implementation-Specific Methods
-
+	
 		/*! Random vector.
 		 * @param v vector to be randomized.
 		 */
@@ -741,7 +784,7 @@ namespace LinBox
 						VectorCategories::DenseVectorTag,
 						VectorCategories::DenseVectorTag) const
 		{
-			return DotProductDomain<Field>::dotSpecializedDD (res, v1, v2);
+			return DotProductDomain<Field>:: dotSpecializedDD (res, v1, v2);
 		}
 
 		template <class Vector1, class Vector2>
@@ -1070,7 +1113,7 @@ namespace LinBox
 			add (u, w, v);
 			copy (res, u);
 
-			return u;
+			return res;
 		}
 
 		template <class Vector1, class Vector2>
@@ -1160,7 +1203,7 @@ namespace LinBox
 			sub (u, w, v);
 			copy (res, u);
 
-			return u;
+			return res;
 		}
 
 		template <class Vector1, class Vector2>
@@ -1293,11 +1336,10 @@ namespace LinBox
 #include "linbox/vector/vector-domain-gf2.h"
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/vector-domain.inl b/linbox/vector/vector-domain.inl
index b1fad43..1c93dea 100644
--- a/linbox/vector/vector-domain.inl
+++ b/linbox/vector/vector-domain.inl
@@ -23,20 +23,20 @@
  * dot product, tag1 and tag2) that allows specialization by vector type.
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -48,11 +48,10 @@
 #define __LINBOX_field_vector_domain_INL
 
 
-#include <iostream>
-#include <cctype>
 
 namespace LinBox
 { /*  VectorDomain */
+
 	template <class Field>
 	template <class Vector>
 	std::ostream &VectorDomain<Field>::writeSpecialized (std::ostream &os, const Vector &x,
@@ -63,7 +62,7 @@ namespace LinBox
 		os << '[';
 
 		for (i = x.begin (); i != x.end ();) {
-			VectorDomainBase<Field>::_field.write (os, *i);
+			this->field().write (os, *i);
 
 			if (++i != x.end ())
 				os << ", ";
@@ -85,10 +84,10 @@ namespace LinBox
 		os << '[';
 
 		for (i = x.begin (), idx = 0; i != x.end ();) {
-			while (idx++ < i->first)
+			while (++idx < i->first)
 				os << "0, ";
 
-			VectorDomainBase<Field>::_field.write (os, i->second);
+			field().write (os, i->second);
 
 			if (++i != x.end ())
 				os << ", ";
@@ -110,10 +109,10 @@ namespace LinBox
 		os << '[';
 
 		for (i = x.begin (), idx = 0; i != x.end ();) {
-			while (idx++ < i->first)
+			while (++idx < i->first)
 				os << "0, ";
 
-			VectorDomainBase<Field>::_field.write (os, i->second);
+			field().write (os, i->second);
 
 			if (++i != x.end ())
 				os << ", ";
@@ -136,10 +135,10 @@ namespace LinBox
 		os << '[';
 
 		for (i = x.first.begin (), j = x.second.begin (), idx = 0; i != x.first.end ();) {
-			while (idx++ < *i)
+			while (++idx < *i)
 				os << "0, ";
 
-			VectorDomainBase<Field>::_field.write (os, *j);
+			field().write (os, *j);
 
 			if (++i != x.first.end ())
 				os << ", ";
@@ -169,9 +168,7 @@ namespace LinBox
 		while (i != x.end() && is) {
 			do is >> c; while (!isdigit(c) && c != '-');
 			is.unget ();
-			VectorDomainBase<Field>::_field.read (is, *i++);
-			//std::cerr << std::endl << "just read this: ";
-			//VectorDomainBase<Field>::_field.write(cerr, *(i-1)) << " at index " << (i-x.begin());
+			field().read (is, *++i);
 		}
 		if (seekrightbracket) do is >> c; while (is && c != ']');
 
@@ -197,11 +194,11 @@ namespace LinBox
 		while (is && c == ',') {
 			do is >> c; while (is && isspace (c));
 			is.unget ();
-			VectorDomainBase<Field>::_field.read (is, tmp);
-			if (!VectorDomainBase<Field>::_field.isZero (tmp))
+			field().read (is, tmp);
+			if (!field().isZero (tmp))
 				x.push_back (std::pair <size_t, typename Field::Element> (idx, tmp));
 			is >> c;
-			idx++;
+			++idx;
 		}
 
 		return is;
@@ -226,11 +223,11 @@ namespace LinBox
 		while (is && c == ',') {
 			do is >> c; while (is && isspace (c));
 			is.unget ();
-			VectorDomainBase<Field>::_field.read (is, tmp);
-			if (!VectorDomainBase<Field>::_field.isZero (tmp))
+			field().read (is, tmp);
+			if (!field().isZero (tmp))
 				x[idx] = tmp;
 			is >> c;
-			idx++;
+			++idx;
 		}
 
 		return is;
@@ -255,15 +252,15 @@ namespace LinBox
 		while (is && c == ',') {
 			do is >> c; while (is && isspace (c));
 			is.unget ();
-			VectorDomainBase<Field>::_field.read (is, tmp);
+			field().read (is, tmp);
 
-			if (!VectorDomainBase<Field>::_field.isZero (tmp)) {
+			if (!field().isZero (tmp)) {
 				x.first.push_back (idx);
 				x.second.push_back (tmp);
 			}
 
 			is >> c;
-			idx++;
+			++idx;
 		}
 
 		return is;
@@ -280,8 +277,8 @@ namespace LinBox
 
 		if (v1.size () != v2.size ()) return false;
 
-		for (i = v1.begin (), j = v2.begin (); i != v1.end (); i++, j++)
-			if (!VectorDomainBase<Field>::_field.areEqual (*i, *j))
+		for (i = v1.begin (), j = v2.begin (); i != v1.end (); ++i, ++j)
+			if (!field().areEqual (*i, *j))
 				return false;
 
 		return true;
@@ -297,13 +294,13 @@ namespace LinBox
 		typename Vector2::const_iterator j;
 		size_t idx;
 
-		for (i = v1.begin (), j = v2.begin (), idx = 0; i != v1.end () && j != v2.end (); j++, idx++) {
+		for (i = v1.begin (), j = v2.begin (), idx = 0; i != v1.end () && j != v2.end (); ++j, ++idx) {
 			if (i->first == idx) {
-				if (!VectorDomainBase<Field>::_field.areEqual (i->second, *j))
+				if (!field().areEqual (i->second, *j))
 					return false;
-				i++;
+				++i;
 			}
-			else if (!VectorDomainBase<Field>::_field.isZero (*j))
+			else if (!field().isZero (*j))
 				return false;
 		}
 
@@ -320,13 +317,13 @@ namespace LinBox
 		typename Vector2::const_iterator j;
 		size_t idx;
 
-		for (i = v1.begin (), j = v2.begin (), idx = 0; i != v1.end () && j != v2.end (); j++, idx++) {
+		for (i = v1.begin (), j = v2.begin (), idx = 0; i != v1.end () && j != v2.end (); ++j, ++idx) {
 			if (i->first == idx) {
-				if (!VectorDomainBase<Field>::_field.areEqual (i->second, *j))
+				if (!field().areEqual (i->second, *j))
 					return false;
-				i++;
+				++i;
 			}
-			else if (!VectorDomainBase<Field>::_field.isZero (*j))
+			else if (!field().isZero (*j))
 				return false;
 		}
 
@@ -346,16 +343,16 @@ namespace LinBox
 
 		for (i_idx = v1.first.begin (), i_elt = v1.second.begin (), j = v2.begin (), idx = 0;
 		     i_idx != v1.first.end () && j != v2.end ();
-		     j++, idx++)
+		     ++j, ++idx)
 		{
 			if (*i_idx == idx) {
-				if (!VectorDomainBase<Field>::_field.areEqual (*i_elt, *j))
+				if (!field().areEqual (*i_elt, *j))
 					return false;
 				++i_idx;
 				++i_elt;
 			}
 
-			else if (!VectorDomainBase<Field>::_field.isZero (*j))
+			else if (!field().isZero (*j))
 				return false;
 		}
 
@@ -373,22 +370,22 @@ namespace LinBox
 
 		for (i = v1.begin (), j = v2.begin (); i != v1.end () || j != v2.end ();) {
 			while (i != v1.end () && (j == v2.end () || i->first < j->first)) {
-				if (!VectorDomainBase<Field>::_field.isZero (i->second))
+				if (!field().isZero (i->second))
 					return false;
-				i++;
+				++i;
 			}
 
 			while (j != v2.end () && (i == v1.end () || j->first < i->first)) {
-				if (!VectorDomainBase<Field>::_field.isZero (j->second))
+				if (!field().isZero (j->second))
 					return false;
-				j++;
+				++j;
 			}
 
 			if (i != v1.end () && j != v2.end () && i->first == j->first) {
-				if (!VectorDomainBase<Field>::_field.areEqual (i->second, j->second))
+				if (!field().areEqual (i->second, j->second))
 					return false;
 
-				i++; j++;
+				++i; ++j;
 			}
 		}
 
@@ -406,22 +403,22 @@ namespace LinBox
 
 		for (i = v1.begin (), j = v2.begin (); i != v1.end () || j != v2.end ();) {
 			while (i != v1.end () && (j == v2.end () || i->first < j->first)) {
-				if (!VectorDomainBase<Field>::_field.isZero (i->second))
+				if (!field().isZero (i->second))
 					return false;
-				i++;
+				++i;
 			}
 
 			while (j != v2.end () && (i == v1.end () || j->first < i->first)) {
-				if (!VectorDomainBase<Field>::_field.isZero (j->second))
+				if (!field().isZero (j->second))
 					return false;
-				j++;
+				++j;
 			}
 
 			if (i != v1.end () && j != v2.end () && i->first == j->first) {
-				if (!VectorDomainBase<Field>::_field.areEqual (i->second, j->second))
+				if (!field().areEqual (i->second, j->second))
 					return false;
 
-				i++; j++;
+				++i; ++j;
 			}
 		}
 
@@ -442,23 +439,23 @@ namespace LinBox
 		     i_idx != v1.first.end () || j != v2.end ();)
 		{
 			while (i_idx != v1.first.end () && (j == v2.end () || *i_idx < j->first)) {
-				if (!VectorDomainBase<Field>::_field.isZero (*i_elt))
+				if (!field().isZero (*i_elt))
 					return false;
-				i_idx++;
-				i_elt++;
+				++i_idx;
+				++i_elt;
 			}
 
 			while (j != v2.end () && (i_idx == v1.first.end () || j->first < *i_idx)) {
-				if (!VectorDomainBase<Field>::_field.isZero (j->second))
+				if (!field().isZero (j->second))
 					return false;
-				j++;
+				++j;
 			}
 
 			if (i_idx != v1.first.end () && j != v2.end () && *i_idx == j->first) {
-				if (!VectorDomainBase<Field>::_field.areEqual (*i_elt, j->second))
+				if (!field().areEqual (*i_elt, j->second))
 					return false;
 
-				i_idx++; i_elt++; j++;
+				++i_idx; ++i_elt; ++j;
 			}
 		}
 
@@ -476,22 +473,22 @@ namespace LinBox
 
 		for (i = v1.begin (), j = v2.begin (); i != v1.end () || j != v2.end ();) {
 			while (i != v1.end () && (j == v2.end () || i->first < j->first)) {
-				if (!VectorDomainBase<Field>::_field.isZero (i->second))
+				if (!field().isZero (i->second))
 					return false;
-				i++;
+				++i;
 			}
 
 			while (j != v2.end () && (i == v1.end () || j->first < i->first)) {
-				if (!VectorDomainBase<Field>::_field.isZero (j->second))
+				if (!field().isZero (j->second))
 					return false;
-				j++;
+				++j;
 			}
 
 			if (i != v1.end () && j != v2.end () && i->first == j->first) {
-				if (!VectorDomainBase<Field>::_field.areEqual (i->second, j->second))
+				if (!field().areEqual (i->second, j->second))
 					return false;
 
-				i++; j++;
+				++i; ++j;
 			}
 		}
 
@@ -510,23 +507,23 @@ namespace LinBox
 
 		while (i_idx != v1.first.end () || j != v2.end ()) {
 			while (i_idx != v1.first.end () && (j == v2.end () || *i_idx < j->first)) {
-				if (!VectorDomainBase<Field>::_field.isZero (*i_elt))
+				if (!field().isZero (*i_elt))
 					return false;
-				i_idx++;
-				i_elt++;
+				++i_idx;
+				++i_elt;
 			}
 
 			while (j != v2.end () && (i_idx == v1.first.end () || j->first < *i_idx)) {
-				if (!VectorDomainBase<Field>::_field.isZero (j->second))
+				if (!field().isZero (j->second))
 					return false;
-				j++;
+				++j;
 			}
 
 			if (i_idx != v1.first.end () && j != v2.end () && *i_idx == j->first) {
-				if (!VectorDomainBase<Field>::_field.areEqual (*i_elt, j->second))
+				if (!field().areEqual (*i_elt, j->second))
 					return false;
 
-				i_idx++; i_elt++; j++;
+				++i_idx; ++i_elt; ++j;
 			}
 		}
 
@@ -546,24 +543,24 @@ namespace LinBox
 
 		while (i_idx != v1.first.end () || j_idx != v2.first.end ()) {
 			while (i_idx != v1.first.end () && (j_idx == v2.first.end () || *i_idx < *j_idx)) {
-				if (!VectorDomainBase<Field>::_field.isZero (*i_elt))
+				if (!field().isZero (*i_elt))
 					return false;
-				i_idx++;
-				i_elt++;
+				++i_idx;
+				++i_elt;
 			}
 
 			while (j_idx != v2.first.end () && (i_idx == v1.first.end () || *j_idx < *i_idx)) {
-				if (!VectorDomainBase<Field>::_field.isZero (*j_elt))
+				if (!field().isZero (*j_elt))
 					return false;
-				j_idx++;
-				j_elt++;
+				++j_idx;
+				++j_elt;
 			}
 
 			if (i_idx != v1.first.end () && j_idx != v2.first.end () && *i_idx == *j_idx) {
-				if (!VectorDomainBase<Field>::_field.areEqual (*i_elt, *j_elt))
+				if (!field().areEqual (*i_elt, *j_elt))
 					return false;
 
-				i_idx++; i_elt++; j_idx++; j_elt++;
+				++i_idx; ++i_elt; ++j_idx; ++j_elt;
 			}
 		}
 
@@ -576,8 +573,8 @@ namespace LinBox
 	{
 		typename Vector::const_iterator i;
 
-		for (i = v.begin (); i != v.end (); i++)
-			if (!VectorDomainBase<Field>::_field.isZero (*i))
+		for (i = v.begin (); i != v.end (); ++i)
+			if (!field().isZero (*i))
 				return false;
 
 		return true;
@@ -589,8 +586,8 @@ namespace LinBox
 	{
 		typename Vector::const_iterator i;
 
-		for (i = v.begin (); i != v.end (); i++)
-			if (!VectorDomainBase<Field>::_field.isZero (i->second))
+		for (i = v.begin (); i != v.end (); ++i)
+			if (!field().isZero (i->second))
 				return false;
 
 		return true;
@@ -602,8 +599,8 @@ namespace LinBox
 	{
 		typename Vector::const_iterator i;
 
-		for (i = v.begin (); i != v.end (); i++)
-			if (!VectorDomainBase<Field>::_field.isZero (i->second))
+		for (i = v.begin (); i != v.end (); ++i)
+			if (!field().isZero (i->second))
 				return false;
 
 		return true;
@@ -615,8 +612,8 @@ namespace LinBox
 	{
 		typename Vector::second_type::const_iterator i;
 
-		for (i = v.second.begin (); i != v.second.end (); i++)
-			if (!VectorDomainBase<Field>::_field.isZero (*i))
+		for (i = v.second.begin (); i != v.second.end (); ++i)
+			if (!field().isZero (*i))
 				return false;
 
 		return true;
@@ -633,8 +630,8 @@ namespace LinBox
 
 		res.clear ();
 
-		for (i = v.begin (), idx = 0; i != v.end (); i++, idx++)
-			if (!VectorDomainBase<Field>::_field.isZero (*i))
+		for (i = v.begin (), idx = 0; i != v.end (); ++i, ++idx)
+			if (!field().isZero (*i))
 				res.push_back (std::pair <size_t, typename Field::Element> (idx, *i));
 
 		return res;
@@ -651,8 +648,8 @@ namespace LinBox
 
 		res.clear ();
 
-		for (i = v.begin (), idx = 0; i != v.end (); i++, idx++)
-			if (!VectorDomainBase<Field>::_field.isZero (*i))
+		for (i = v.begin (), idx = 0; i != v.end (); ++i, ++idx)
+			if (!field().isZero (*i))
 				res[idx] = *i;
 
 		return res;
@@ -670,9 +667,9 @@ namespace LinBox
 		res.first.clear ();
 		res.second.clear ();
 
-		for (i = v.begin (), idx = 0; i != v.end (); i++, idx++) {
-			if (!VectorDomainBase<Field>::_field.isZero (*i)) {
-				res.first.push_back (idx);
+		for (i = v.begin (), idx = 0; i != v.end (); ++i, ++idx) {
+			if (!field().isZero (*i)) {
+				res.first.push_back ((size_t)idx);
 				res.second.push_back (*i);
 			}
 		}
@@ -690,10 +687,10 @@ namespace LinBox
 		typename Vector2::const_iterator j;
 		size_t idx;
 
-		for (i = res.begin (), j = v.begin (), idx = 0; j != v.end (); i++, j++, idx++) {
+		for (i = res.begin (), j = v.begin (), idx = 0; j != v.end (); ++i, ++j, ++idx) {
 			while (idx < j->first) {
-				VectorDomainBase<Field>::_field.init (*i, 0);
-				i++; idx++;
+				field().assign(*i, field().zero);
+				++i; ++idx;
 			}
 
 			*i = j->second;
@@ -712,7 +709,7 @@ namespace LinBox
 
 		res.clear ();
 
-		for (i = v.begin (); i != v.end (); i++)
+		for (i = v.begin (); i != v.end (); ++i)
 			res[i->first] = i->second;
 
 		return res;
@@ -729,7 +726,7 @@ namespace LinBox
 		res.first.clear ();
 		res.second.clear ();
 
-		for (i = v.begin (); i != v.end (); i++) {
+		for (i = v.begin (); i != v.end (); ++i) {
 			res.first.push_back (i->first);
 			res.second.push_back (i->second);
 		}
@@ -747,10 +744,10 @@ namespace LinBox
 		typename Vector2::const_iterator j;
 		size_t idx;
 
-		for (i = res.begin (), j = v.begin (), idx = 0; j != v.end (); i++, j++, idx++) {
+		for (i = res.begin (), j = v.begin (), idx = 0; j != v.end (); ++i, ++j, ++idx) {
 			while (idx < j->first) {
-				VectorDomainBase<Field>::_field.init (*i, 0);
-				i++; idx++;
+				field().assign(*i, field.zero);
+				++i; ++idx;
 			}
 
 			*i = j->second;
@@ -769,7 +766,7 @@ namespace LinBox
 
 		res.clear ();
 
-		for (i = v.begin (); i != v.end (); i++)
+		for (i = v.begin (); i != v.end (); ++i)
 			res.push_back (*i);
 
 		return res;
@@ -785,7 +782,7 @@ namespace LinBox
 
 		res.clear ();
 
-		for (i = v.begin (); i != v.end (); i++)
+		for (i = v.begin (); i != v.end (); ++i)
 			res[i->first] = i->second;
 
 		return res;
@@ -802,7 +799,7 @@ namespace LinBox
 		res.first.clear ();
 		res.second.clear ();
 
-		for (i = v.begin (); i != v.end (); i++) {
+		for (i = v.begin (); i != v.end (); ++i) {
 			res.first.push_back (i->first);
 			res.second.push_back (i->second);
 		}
@@ -816,6 +813,7 @@ namespace LinBox
 						       VectorCategories::DenseVectorTag,
 						       VectorCategories::SparseParallelVectorTag) const
 	{
+		//! @bug check sizes ??
 		typename Vector1::iterator i = res.begin ();
 		typename Vector2::first_type::const_iterator j_idx = v.first.begin ();
 		typename Vector2::second_type::const_iterator j_elt = v.second.begin ();
@@ -823,7 +821,7 @@ namespace LinBox
 
 		while (j_idx != v.first.end ()) {
 			while (idx < *j_idx) {
-				VectorDomainBase<Field>::_field.init (*i, 0);
+				field().assign(*i, field().zero);
 				++i; ++idx;
 			}
 
@@ -863,7 +861,7 @@ namespace LinBox
 
 		res.clear ();
 
-		for (; i_idx != v.first.end (); i_idx++, i_elt++)
+		for (; i_idx != v.first.end (); ++i_idx, ++i_elt)
 			res[*i_idx] = *i_elt;
 
 		return res;
@@ -895,7 +893,7 @@ namespace LinBox
 
 			copy (res_part, v);
 
-			std::copy (res_part.begin (), (len == 0) ? res_part.end () : res_part.begin () + len, res.begin () + i);
+			std::copy (res_part.begin (), (len == 0) ? res_part.end () : res_part.begin () + (ptrdiff_t)len, res.begin () + (ptrdiff_t)i);
 		}
 
 		return res;
@@ -920,7 +918,7 @@ namespace LinBox
 			part_end = std::lower_bound (res_part.begin (), res_part.end (), len,
 						     VectorWrapper::CompareSparseEntries<Element> ());
 
-		for (iter = res_part.begin (); iter != part_end; iter++)
+		for (iter = res_part.begin (); iter != part_end; ++iter)
 			iter->first += i;
 
 		r_begin = std::lower_bound (res.begin (), res.end (), i, VectorWrapper::CompareSparseEntries<Element> ());
@@ -951,7 +949,7 @@ namespace LinBox
 		r_end = (len == 0) ? res.end () : res.find (i + len);
 		res.erase (r_begin, r_end);
 
-		for (iter = res_part.begin (); iter != part_end; iter++)
+		for (iter = res_part.begin (); iter != part_end; ++iter)
 			res[iter->first + i] = iter->second;
 
 		return res;
@@ -977,16 +975,16 @@ namespace LinBox
 		}
 		else {
 			part_idx_end = std::lower_bound (res_part.first.begin (), res_part.first.end (), len);
-			part_elt_end = res_part.second.begin () + (part_idx_end - res_part.first.begin ());
+			part_elt_end = res_part.second.begin () +(ptrdiff_t) (part_idx_end - res_part.first.begin ());
 		}
 
-		for (iter = res_part.first.begin (); iter != part_idx_end; iter++)
+		for (iter = res_part.first.begin (); iter != part_idx_end; ++iter)
 			*iter += i;
 
 		r_idx_begin = std::lower_bound (res.first.begin (), res.first.end (), i);
-		r_elt_begin = res.second.begin () + (r_idx_begin - res.first.begin ());
+		r_elt_begin = res.second.begin () +(ptrdiff_t) (r_idx_begin - res.first.begin ());
 		r_idx_end = (len == 0) ? res.first.end () : std::lower_bound (r_idx_begin, res.first.end (), i + len);
-		r_idx_end = res.second.begin () + (r_idx_end - res.first.begin ());
+		r_idx_end = res.second.begin () +(ptrdiff_t) (r_idx_end - res.first.begin ());
 
 		r_idx_begin = res.first.erase (r_idx_begin, r_idx_end);
 		r_elt_begin = res.second.erase (r_elt_begin, r_elt_end);
@@ -1001,7 +999,7 @@ namespace LinBox
 	Vector &VectorDomain<Field>::copySpecialized (Vector &res, const Vector &v, size_t i, size_t len,
 						      VectorCategories::DenseVectorTag) const
 	{
-		std::copy (v.begin (), (len == 0) ? v.end () : v.begin () + len, res.begin () + i);
+		std::copy (v.begin (), (len == 0) ? v.end () : v.begin () + (ptrdiff_t)len, res.begin () +(ptrdiff_t) i);
 		return res;
 	}
 
@@ -1026,10 +1024,10 @@ namespace LinBox
 		r_begin = res.erase (r_begin, r_end);
 		offset = r_begin - res.begin ();
 		res.insert (r_begin, v.begin (), v_end);
-		r_begin = res.begin () + offset;
-		r_end = r_begin + (v_end - v.begin ());
+		r_begin = res.begin () +(ptrdiff_t) offset;
+		r_end = r_begin +(ptrdiff_t) (v_end - v.begin ());
 
-		for (iter = r_begin; iter != r_end; iter++)
+		for (iter = r_begin; iter != r_end; ++iter)
 			iter->first += i;
 
 		return res;
@@ -1049,7 +1047,7 @@ namespace LinBox
 		r_end = (len == 0) ? res.end () : res.find (i + len);
 		res.erase (r_begin, r_end);
 
-		for (iter = v.begin (); iter != v_end; iter++)
+		for (iter = v.begin (); iter != v_end; ++iter)
 			res[iter->first + i] = iter->second;
 
 		return res;
@@ -1072,13 +1070,13 @@ namespace LinBox
 		}
 		else {
 			v_idx_end = std::lower_bound (v.first.begin (), v.first.end (), len);
-			v_elt_end = v.second.begin () + (v_idx_end - v.first.begin ());
+			v_elt_end = v.second.begin () +(ptrdiff_t) (v_idx_end - v.first.begin ());
 		}
 
 		r_idx_begin = std::lower_bound (res.first.begin (), res.first.end (), i);
-		r_elt_begin = res.second.begin () + (r_idx_begin - res.first.begin ());
+		r_elt_begin = res.second.begin () +(ptrdiff_t) (r_idx_begin - res.first.begin ());
 		r_idx_end = (len == 0) ? res.first.end () : std::lower_bound (r_idx_begin, res.first.end (), i + len);
-		r_elt_end = res.second.begin () + (r_idx_end - res.first.begin ());
+		r_elt_end = res.second.begin () +(ptrdiff_t) (r_idx_end - res.first.begin ());
 
 		r_idx_begin = res.first.erase (r_idx_begin, r_idx_end);
 		r_elt_begin = res.second.erase (r_elt_begin, r_elt_end);
@@ -1087,10 +1085,10 @@ namespace LinBox
 		res.first.insert (r_idx_begin, v.first.begin (), v_idx_end);
 		res.second.insert (r_elt_begin, v.second.begin (), v_elt_end);
 
-		r_idx_begin = res.first.begin () + offset;
-		r_idx_end = r_idx_begin + (v_idx_end - v.first.begin ());
+		r_idx_begin = res.first.begin () +(ptrdiff_t) offset;
+		r_idx_end = r_idx_begin +(ptrdiff_t) (v_idx_end - v.first.begin ());
 
-		for (iter = r_idx_begin; iter != r_idx_end; iter++)
+		for (iter = r_idx_begin; iter != r_idx_end; ++iter)
 			*iter += i;
 
 		return res;
@@ -1110,8 +1108,8 @@ namespace LinBox
 		linbox_check (y.size () == x.size ());
 		linbox_check (res.size () == x.size ());
 
-		for (i = y.begin (), j = x.begin (), k = res.begin (); i != y.end (); i++, j++, k++)
-			VectorDomainBase<Field>::_field.add (*k, *i, *j);
+		for (i = y.begin (), j = x.begin (), k = res.begin (); i != y.end (); ++i, ++j, ++k)
+			field().add (*k, *i, *j);
 
 		return res;
 	}
@@ -1129,17 +1127,17 @@ namespace LinBox
 
 		res.clear ();
 
-		for (j = x.begin (), i = y.begin (); j != x.end (); j++) {
+		for (j = x.begin (), i = y.begin (); j != x.end (); ++j) {
 			while (i != y.end () && i->first < j->first) {
 				res.push_back (*i);
-				i++;
+				++i;
 			}
 
 			if (i != y.end () && i->first == j->first) {
-				VectorDomainBase<Field>::_field.add (tmp, i->second, j->second);
-				if (!VectorDomainBase<Field>::_field.isZero (tmp))
+				field().add (tmp, i->second, j->second);
+				if (!field().isZero (tmp))
 					res.push_back (std::pair <size_t, Element> (j->first, tmp));
-				i++;
+				++i;
 			}
 			else {
 				res.push_back (*j);
@@ -1148,7 +1146,7 @@ namespace LinBox
 
 		while (i != y.end ()) {
 			res.push_back (*i);
-			i++;
+			++i;
 		}
 
 		return res;
@@ -1167,15 +1165,15 @@ namespace LinBox
 
 		res.clear ();
 
-		for (j = x.begin (), i = y.begin (); j != x.end (); j++) {
+		for (j = x.begin (), i = y.begin (); j != x.end (); ++j) {
 			while (i != y.end () && i->first < j->first) {
 				res[i->first] = i->second;
-				i++;
+				++i;
 			}
 
 			if (i != y.end () && i->first == j->first) {
-				res[j->first] = VectorDomainBase<Field>::_field.add (tmp, i->second, j->second);
-				i++;
+				res[j->first] = field().add (tmp, i->second, j->second);
+				++i;
 			}
 			else {
 				res[j->first] = j->second;
@@ -1184,7 +1182,7 @@ namespace LinBox
 
 		while (i != y.end ()) {
 			res[i->first] = i->second;
-			i++;
+			++i;
 		}
 
 		return res;
@@ -1214,8 +1212,8 @@ namespace LinBox
 			}
 
 			if (i_idx != y.first.end () && *i_idx == *j_idx) {
-				VectorDomainBase<Field>::_field.add (tmp, *i_elt, *j_elt);
-				if (!VectorDomainBase<Field>::_field.isZero (tmp)) {
+				field().add (tmp, *i_elt, *j_elt);
+				if (!field().isZero (tmp)) {
 					res.first.push_back (*j_idx);
 					res.second.push_back (tmp);
 				}
@@ -1247,8 +1245,8 @@ namespace LinBox
 
 		linbox_check (y.size () == x.size ());
 
-		for (i = y.begin (), j = x.begin (); i != y.end (); i++, j++)
-			VectorDomainBase<Field>::_field.addin (*i, *j);
+		for (i = y.begin (), j = x.begin (); i != y.end (); ++i, ++j)
+			field().addin (*i, *j);
 
 		return y;
 	}
@@ -1275,11 +1273,11 @@ namespace LinBox
 		typename Vector1::iterator i;
 		typename Vector2::const_iterator j;
 
-		for (i = y.begin (), j = x.begin (); j != x.end (); j++) {
-			while (i != y.end () && i->first < j->first) i++;
+		for (i = y.begin (), j = x.begin (); j != x.end (); ++j) {
+			while (i != y.end () && i->first < j->first) ++i;
 
 			if (i != y.end () && i->first == j->first)
-				VectorDomainBase<Field>::_field.addin (i->second, j->second);
+				field().addin (i->second, j->second);
 			else
 				y[j->first] = j->second;
 		}
@@ -1314,8 +1312,8 @@ namespace LinBox
 		linbox_check (y.size () == x.size ());
 		linbox_check (res.size () == x.size ());
 
-		for (i = y.begin (), j = x.begin (), k = res.begin (); i != y.end (); i++, j++, k++)
-			VectorDomainBase<Field>::_field.sub (*k, *i, *j);
+		for (i = y.begin (), j = x.begin (), k = res.begin (); i != y.end (); ++i, ++j, ++k)
+			field().sub (*k, *i, *j);
 
 		return res;
 	}
@@ -1333,26 +1331,26 @@ namespace LinBox
 
 		res.clear ();
 
-		for (j = x.begin (), i = y.begin (); j != x.end (); j++) {
+		for (j = x.begin (), i = y.begin (); j != x.end (); ++j) {
 			while (i != y.end () && i->first < j->first) {
 				res.push_back (*i);
-				i++;
+				++i;
 			}
 
 			if (i != y.end () && i->first == j->first) {
-				VectorDomainBase<Field>::_field.sub (tmp, i->second, j->second);
-				if (!VectorDomainBase<Field>::_field.isZero (tmp))
+				field().sub (tmp, i->second, j->second);
+				if (!field().isZero (tmp))
 					res.push_back (std::pair <size_t, Element> (j->first, tmp));
-				i++;
+				++i;
 			}
 			else {
-				res.push_back (std::pair <size_t, Element> (j->first, VectorDomainBase<Field>::_field.neg (tmp, j->second)));
+				res.push_back (std::pair <size_t, Element> (j->first, field().neg (tmp, j->second)));
 			}
 		}
 
 		while (i != y.end ()) {
 			res.push_back (*i);
-			i++;
+			++i;
 		}
 
 		return res;
@@ -1371,24 +1369,24 @@ namespace LinBox
 
 		res.clear ();
 
-		for (j = x.begin (), i = y.begin (); j != x.end (); j++) {
+		for (j = x.begin (), i = y.begin (); j != x.end (); ++j) {
 			while (i != y.end () && i->first < j->first) {
 				res[i->first] = i->second;
-				i++;
+				++i;
 			}
 
 			if (i != y.end () && i->first == j->first) {
-				res[j->first] = VectorDomainBase<Field>::_field.sub (tmp, i->second, j->second);
-				i++;
+				res[j->first] = field().sub (tmp, i->second, j->second);
+				++i;
 			}
 			else {
-				res[j->first] = VectorDomainBase<Field>::_field.neg (tmp, j->second);
+				res[j->first] = field().neg (tmp, j->second);
 			}
 		}
 
 		while (i != y.end ()) {
 			res[i->first] = i->second;
-			i++;
+			++i;
 		}
 
 		return res;
@@ -1418,8 +1416,8 @@ namespace LinBox
 			}
 
 			if (i_idx != y.first.end () && *i_idx == *j_idx) {
-				VectorDomainBase<Field>::_field.sub (tmp, *i_elt, *j_elt);
-				if (!VectorDomainBase<Field>::_field.isZero (tmp)) {
+				field().sub (tmp, *i_elt, *j_elt);
+				if (!field().isZero (tmp)) {
 					res.first.push_back (*j_idx);
 					res.second.push_back (tmp);
 				}
@@ -1427,7 +1425,7 @@ namespace LinBox
 			}
 			else {
 				res.first.push_back (*j_idx);
-				res.second.push_back (VectorDomainBase<Field>::_field.neg (tmp, *j_elt));
+				res.second.push_back (field().neg (tmp, *j_elt));
 			}
 		}
 
@@ -1451,8 +1449,8 @@ namespace LinBox
 
 		linbox_check (y.size () == x.size ());
 
-		for (i = y.begin (), j = x.begin (); i != y.end (); i++, j++)
-			VectorDomainBase<Field>::_field.subin (*i, *j);
+		for (i = y.begin (), j = x.begin (); i != y.end (); ++i, ++j)
+			field().subin (*i, *j);
 
 		return y;
 	}
@@ -1480,13 +1478,13 @@ namespace LinBox
 		typename Vector2::const_iterator j;
 		Element tmp;
 
-		for (i = y.begin (), j = x.begin (); j != x.end (); j++) {
-			while (i != y.end () && i->first < j->first) i++;
+		for (i = y.begin (), j = x.begin (); j != x.end (); ++j) {
+			while (i != y.end () && i->first < j->first) ++i;
 
 			if (i != y.end () && i->first == j->first)
-				VectorDomainBase<Field>::_field.subin (i->second, j->second);
+				field().subin (i->second, j->second);
 			else
-				y[j->first] = VectorDomainBase<Field>::_field.neg (tmp, j->second);
+				y[j->first] = field().neg (tmp, j->second);
 		}
 
 		return y;
@@ -1517,7 +1515,7 @@ namespace LinBox
 		linbox_check (res.size () == x.size ());
 
 		for (j = x.begin (), k = res.begin (); j != x.end (); ++j, ++k)
-			VectorDomainBase<Field>::_field.neg (*k, *j);
+			field().neg (*k, *j);
 
 		return res;
 	}
@@ -1534,7 +1532,7 @@ namespace LinBox
 		res.clear ();
 
 		for (j = x.begin (); j != x.end (); ++j)
-			res.push_back (std::pair <size_t, Element> (j->first, VectorDomainBase<Field>::_field.neg (tmp, j->second)));
+			res.push_back (std::pair <size_t, Element> (j->first, field().neg (tmp, j->second)));
 
 		return res;
 	}
@@ -1551,7 +1549,7 @@ namespace LinBox
 		res.clear ();
 
 		for (j = x.begin (); j != x.end (); ++j)
-			res[j->first] = VectorDomainBase<Field>::_field.neg (tmp, j->second);
+			res[j->first] = field().neg (tmp, j->second);
 
 		return res;
 	}
@@ -1571,7 +1569,7 @@ namespace LinBox
 		std::copy (x.first.begin (), x.first.end (), res.first.begin ());
 
 		for (j = x.second.begin (); j != x.second.end (); ++j)
-			res.second.push_back (VectorDomainBase<Field>::_field.neg (tmp, *j));
+			res.second.push_back (field().neg (tmp, *j));
 
 		return res;
 	}
@@ -1584,7 +1582,7 @@ namespace LinBox
 		typename Vector::iterator i;
 
 		for (i = y.begin (); i != y.end (); ++i)
-			VectorDomainBase<Field>::_field.negin (*i);
+			field().negin (*i);
 
 		return y;
 	}
@@ -1597,7 +1595,7 @@ namespace LinBox
 		typename Vector::iterator i;
 
 		for (i = y.begin (); i != y.end (); ++i)
-			VectorDomainBase<Field>::_field.negin (i->second);
+			field().negin (i->second);
 
 		return y;
 	}
@@ -1610,7 +1608,7 @@ namespace LinBox
 		typename Vector::iterator i;
 
 		for (i = y.begin (); i != y.end (); ++i)
-			VectorDomainBase<Field>::_field.negin (i->second);
+			field().negin (i->second);
 
 		return y;
 	}
@@ -1623,7 +1621,7 @@ namespace LinBox
 		typename Vector::second_type::iterator i;
 
 		for (i = y.second.begin (); i != y.second.end (); ++i)
-			VectorDomainBase<Field>::_field.negin (*i);
+			field().negin (*i);
 
 		return y;
 	}
@@ -1642,7 +1640,7 @@ namespace LinBox
 		linbox_check (res.size () == x.size ());
 
 		for (i = x.begin (), j = res.begin (); i != x.end (); ++i, ++j)
-			VectorDomainBase<Field>::_field.mul (*j, *i, a);
+			field().mul (*j, *i, a);
 
 		return res;
 	}
@@ -1660,11 +1658,11 @@ namespace LinBox
 
 		res.clear ();
 
-		if (VectorDomainBase<Field>::_field.isZero (a))
+		if (field().isZero (a))
 			return res;
 
-		for (i = x.begin (); i != x.end (); i++)
-			res.push_back (std::pair <size_t, Element> (i->first, VectorDomainBase<Field>::_field.mul (tmp, i->second, a)));
+		for (i = x.begin (); i != x.end (); ++i)
+			res.push_back (std::pair <size_t, Element> (i->first, field().mul (tmp, i->second, a)));
 
 		return res;
 	}
@@ -1682,11 +1680,11 @@ namespace LinBox
 
 		res.clear ();
 
-		if (VectorDomainBase<Field>::_field.isZero (a))
+		if (field().isZero (a))
 			return res;
 
-		for (i = x.begin (); i != x.end (); i++)
-			res[i->first] = VectorDomainBase<Field>::_field.mul (tmp, i->second, a);
+		for (i = x.begin (); i != x.end (); ++i)
+			res[i->first] = field().mul (tmp, i->second, a);
 
 		return res;
 	}
@@ -1706,14 +1704,14 @@ namespace LinBox
 		res.first.clear ();
 		res.second.clear ();
 
-		if (VectorDomainBase<Field>::_field.isZero (a))
+		if (field().isZero (a))
 			return res;
 
 		for (i_idx = x.first.begin (); i_idx != x.first.end (); ++i_idx)
 			res.first.push_back (*i_idx);
 
 		for (i_elt = x.second.begin (); i_elt != x.second.end (); ++i_elt)
-			res.second.push_back (VectorDomainBase<Field>::_field.mul (tmp, *i_elt, a));
+			res.second.push_back (field().mul (tmp, *i_elt, a));
 
 		return res;
 	}
@@ -1727,8 +1725,8 @@ namespace LinBox
 	{
 		typename Vector::iterator i;
 
-		for (i = x.begin (); i != x.end (); i++)
-			VectorDomainBase<Field>::_field.mulin (*i, a);
+		for (i = x.begin (); i != x.end (); ++i)
+			field().mulin (*i, a);
 
 		return x;
 	}
@@ -1742,13 +1740,13 @@ namespace LinBox
 	{
 		typename Vector::iterator i;
 
-		if (VectorDomainBase<Field>::_field.isZero (a)) {
+		if (field().isZero (a)) {
 			x.clear ();
 			return x;
 		}
 
-		for (i = x.begin (); i != x.end (); i++)
-			VectorDomainBase<Field>::_field.mulin (i->second, a);
+		for (i = x.begin (); i != x.end (); ++i)
+			field().mulin (i->second, a);
 
 		return x;
 	}
@@ -1762,13 +1760,13 @@ namespace LinBox
 	{
 		typename Vector::iterator i;
 
-		if (VectorDomainBase<Field>::_field.isZero (a)) {
+		if (field().isZero (a)) {
 			x.clear ();
 			return x;
 		}
 
-		for (i = x.begin (); i != x.end (); i++)
-			VectorDomainBase<Field>::_field.mulin (i->second, a);
+		for (i = x.begin (); i != x.end (); ++i)
+			field().mulin (i->second, a);
 
 		return x;
 	}
@@ -1782,14 +1780,14 @@ namespace LinBox
 	{
 		typename Vector::second_type::iterator i;
 
-		if (VectorDomainBase<Field>::_field.isZero (a)) {
+		if (field().isZero (a)) {
 			x.first.clear ();
 			x.second.clear ();
 			return x;
 		}
 
-		for (i = x.second.begin (); i != x.second.end (); i++)
-			VectorDomainBase<Field>::_field.mulin (*i, a);
+		for (i = x.second.begin (); i != x.second.end (); ++i)
+			field().mulin (*i, a);
 
 		return x;
 	}
@@ -1810,8 +1808,8 @@ namespace LinBox
 		linbox_check (y.size () == x.size ());
 		linbox_check (res.size () == x.size ());
 
-		for (i = y.begin (), j = x.begin (), k = res.begin (); i != y.end (); i++, j++, k++)
-			VectorDomainBase<Field>::_field.axpy (*k, a, *j, *i);
+		for (i = y.begin (), j = x.begin (), k = res.begin (); i != y.end (); ++i, ++j, ++k)
+			field().axpy (*k, a, *j, *i);
 
 		return res;
 	}
@@ -1831,26 +1829,26 @@ namespace LinBox
 
 		res.clear ();
 
-		for (j = x.begin (), i = y.begin (); j != x.end (); j++) {
+		for (j = x.begin (), i = y.begin (); j != x.end (); ++j) {
 			while (i != y.end () && i->first < j->first) {
 				res.push_back (*i);
-				i++;
+				++i;
 			}
 
 			if (i != y.end () && i->first == j->first) {
-				VectorDomainBase<Field>::_field.axpy (tmp, a, j->second, i->second);
-				i++;
+				field().axpy (tmp, a, j->second, i->second);
+				++i;
 			}
 			else
-				VectorDomainBase<Field>::_field.mul (tmp, a, j->second);
+				field().mul (tmp, a, j->second);
 
-			if (!VectorDomainBase<Field>::_field.isZero (tmp))
+			if (!field().isZero (tmp))
 				res.push_back (std::pair <size_t, Element> (j->first, tmp));
 		}
 
 		while (i != y.end ()) {
 			res.push_back (*i);
-			i++;
+			++i;
 		}
 
 		return res;
@@ -1870,23 +1868,23 @@ namespace LinBox
 
 		res.clear ();
 
-		for (j = x.begin (), i = y.begin (); j != x.end (); j++) {
+		for (j = x.begin (), i = y.begin (); j != x.end (); ++j) {
 			while (i != y.end () && i->first < j->first) {
 				res[i->first] = i->second;
-				i++;
+				++i;
 			}
 
 			if (i != y.end () && i->first == j->first) {
-				VectorDomainBase<Field>::_field.axpy (res[j->first], a, j->second, i->second);
-				i++;
+				field().axpy (res[j->first], a, j->second, i->second);
+				++i;
 			}
 			else
-				VectorDomainBase<Field>::_field.mul (res[j->first], a, j->second);
+				field().mul (res[j->first], a, j->second);
 		}
 
 		while (i != y.end ()) {
 			res[i->first] = i->second;
-			i++;
+			++i;
 		}
 
 		return res;
@@ -1918,8 +1916,8 @@ namespace LinBox
 			}
 
 			if (i_idx != y.first.end () && *i_idx == *j_idx) {
-				VectorDomainBase<Field>::_field.axpy (tmp, a, *j_elt, *i_elt);
-				if (!VectorDomainBase<Field>::_field.isZero (tmp)) {
+				field().axpy (tmp, a, *j_elt, *i_elt);
+				if (!field().isZero (tmp)) {
 					res.first.push_back (*j_idx);
 					res.second.push_back (tmp);
 				}
@@ -1927,7 +1925,7 @@ namespace LinBox
 			}
 			else {
 				res.first.push_back (*j_idx);
-				res.second.push_back (VectorDomainBase<Field>::_field.mul (tmp, *j_elt, a));
+				res.second.push_back (field().mul (tmp, *j_elt, a));
 			}
 		}
 
@@ -1955,7 +1953,7 @@ namespace LinBox
 		linbox_check (y.size () == x.size ());
 
 		for (i = y.begin (), j = x.begin (); i != y.end (); ++i, ++j)
-			VectorDomainBase<Field>::_field.axpyin (*i, a, *j);
+			field().axpyin (*i, a, *j);
 
 		return y;
 	}
@@ -1972,7 +1970,7 @@ namespace LinBox
 		typename Vector2::const_iterator j;
 
 		for (j = x.begin (); j != x.end (); ++j)
-			VectorDomainBase<Field>::_field.axpyin (y[j->first], a, j->second);
+			field().axpyin (y[j->first], a, j->second);
 
 		return y;
 	}
@@ -1989,7 +1987,7 @@ namespace LinBox
 		typename Vector2::const_iterator j;
 
 		for (j = x.begin (); j != x.end (); ++j)
-			VectorDomainBase<Field>::_field.axpyin (y[j->first], a, j->second);
+			field().axpyin (y[j->first], a, j->second);
 
 		return y;
 	}
@@ -2007,7 +2005,7 @@ namespace LinBox
 		typename Vector2::second_type::const_iterator j_elt = x.second.begin ();
 
 		for (; j_idx != x.first.end (); ++j_idx, ++j_elt)
-			VectorDomainBase<Field>::_field.axpyin (y[*j_idx], a, *j_elt);
+			field().axpyin (y[*j_idx], a, *j_elt);
 
 		return y;
 	}
@@ -2041,18 +2039,18 @@ namespace LinBox
 		typename Vector2::const_iterator j;
 		Element tmp;
 
-		if (VectorDomainBase<Field>::_field.isZero (a)) {
+		if (field().isZero (a)) {
 			y.clear ();
 			return y;
 		}
 
-		for (i = y.begin (), j = x.begin (); j != x.end (); j++) {
-			while (i != y.end () && i->first != j->first) i++;
+		for (i = y.begin (), j = x.begin (); j != x.end (); ++j) {
+			while (i != y.end () && i->first != j->first) ++i;
 
 			if (i != y.end () && i->first == j->first)
-				VectorDomainBase<Field>::_field.axpyin (i->second, a, j->second);
-			else if (!VectorDomainBase<Field>::_field.isZero (j->second))
-				y[j->first] = VectorDomainBase<Field>::_field.mul (tmp, a, j->second);
+				field().axpyin (i->second, a, j->second);
+			else if (!field().isZero (j->second))
+				y[j->first] = field().mul (tmp, a, j->second);
 		}
 
 		return y;
@@ -2076,21 +2074,22 @@ namespace LinBox
 
 	template <class Field>
 	template <class Vector1, class Vector2>
-	inline typename Field::Element &DotProductDomain<Field>::dotSpecializedDD
-	(Element                                  &res,
+	inline typename Field::Element &DotProductDomain<Field>:: dotSpecializedDD
+	(typename Field::Element                  &res,
 	 const Vector1                            &v1,
 	 const Vector2                            &v2) const
 	{
 		typename Vector1::const_iterator i;
 		typename Vector2::const_iterator j;
-		VectorDomainBase<Field>::accu.reset();
+		FieldAXPY<Field> accu(this->field());
+		//VectorDomainBase<Field>::accu.reset();
 
 		linbox_check (v1.size () == v2.size ());
 
-		for (i = v1.begin (), j = v2.begin (); i != v1.end (); i++, j++)
-			VectorDomainBase<Field>::accu.mulacc (*i, *j);
+		for (i = v1.begin (), j = v2.begin (); i != v1.end (); ++i, ++j)
+			/*VectorDomainBase<Field>::*/accu.mulacc (*i, *j);
 
-		return VectorDomainBase<Field>::accu.get (res);
+		return /*VectorDomainBase<Field>::*/accu.get (res);
 	}
 
 	template <class Field>
@@ -2104,12 +2103,13 @@ namespace LinBox
 	{
 		typename Vector1::const_iterator i;
 
-		VectorDomainBase<Field>::accu.reset();
+		FieldAXPY<Field> accu(field());
+		//VectorDomainBase<Field>::accu.reset();
 
-		for (i = v1.begin (); i != v1.end (); i++)
-			VectorDomainBase<Field>::accu.mulacc (i->second, v2[i->first]);
+		for (i = v1.begin (); i != v1.end (); ++i)
+			/*VectorDomainBase<Field>::*/accu.mulacc (i->second, v2[i->first]);
 
-		return VectorDomainBase<Field>::accu.get (res);
+		return /*VectorDomainBase<Field>::*/accu.get (res);
 	}
 
 	template <class Field>
@@ -2122,12 +2122,13 @@ namespace LinBox
 	 VectorCategories::DenseVectorTag              ) const
 	{
 		typename Vector1::const_iterator i;
-		VectorDomainBase<Field>::accu.reset();
+		FieldAXPY<Field> accu(field());
+		//VectorDomainBase<Field>::accu.reset();
 
-		for (i = v1.begin (); i != v1.end (); i++)
-			VectorDomainBase<Field>::accu.mulacc (i->second, v2[i->first]);
+		for (i = v1.begin (); i != v1.end (); ++i)
+			/*VectorDomainBase<Field>::*/accu.mulacc (i->second, v2[i->first]);
 
-		return VectorDomainBase<Field>::accu.get (res);
+		return /*VectorDomainBase<Field>::*/accu.get (res);
 	}
 
 	template <class Field>
@@ -2139,12 +2140,13 @@ namespace LinBox
 	{
 		typename Vector1::first_type::const_iterator i_idx;
 		typename Vector1::second_type::const_iterator i_elt;
-		VectorDomainBase<Field>::accu.reset();
+		FieldAXPY<Field> accu(this->field());
+		//VectorDomainBase<Field>::accu.reset();
 
 		for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt)
-			VectorDomainBase<Field>::accu.mulacc (*i_elt, v2[*i_idx]);
+			/*VectorDomainBase<Field>::*/accu.mulacc (*i_elt, v2[*i_idx]);
 
-		return VectorDomainBase<Field>::accu.get (res);
+		return /*VectorDomainBase<Field>::*/accu.get (res);
 	}
 
 	template <class Field>
@@ -2158,16 +2160,17 @@ namespace LinBox
 	{
 		typename Vector1::const_iterator i;
 		typename Vector2::const_iterator j;
-		VectorDomainBase<Field>::accu.reset();
+		FieldAXPY<Field> accu(field());
+		//VectorDomainBase<Field>::accu.reset();
 
-		for (i = v1.begin (), j = v2.begin (); i != v1.end () && j != v2.end (); i++) {
-			while (j != v2.end () && j->first < i->first) j++;
+		for (i = v1.begin (), j = v2.begin (); i != v1.end () && j != v2.end (); ++i) {
+			while (j != v2.end () && j->first < i->first) ++j;
 
 			if (j != v2.end () && j->first == i->first)
-				VectorDomainBase<Field>::accu.mulacc (i->second, j->second);
+				/*VectorDomainBase<Field>::*/accu.mulacc (i->second, j->second);
 		}
 
-		return VectorDomainBase<Field>::accu.get (res);
+		return /*VectorDomainBase<Field>::*/accu.get (res);
 	}
 
 	template <class Field>
@@ -2181,16 +2184,17 @@ namespace LinBox
 	{
 		typename Vector1::const_iterator i;
 		typename Vector2::const_iterator j;
-		VectorDomainBase<Field>::accu.reset();
+		FieldAXPY<Field> accu(field());
+		//VectorDomainBase<Field>::accu.reset();
 
-		for (i = v1.begin (), j = v2.begin (); i != v1.end () && j != v2.end (); i++) {
-			while (j != v2.end () && j->first < i->first) j++;
+		for (i = v1.begin (), j = v2.begin (); i != v1.end () && j != v2.end (); ++i) {
+			while (j != v2.end () && j->first < i->first) ++j;
 
 			if (j != v2.end () && j->first == i->first)
-				VectorDomainBase<Field>::accu.mulacc (i->second, j->second);
+				/*VectorDomainBase<Field>::*/accu.mulacc (i->second, j->second);
 		}
 
-		return VectorDomainBase<Field>::accu.get (res);
+		return /*VectorDomainBase<Field>::*/accu.get (res);
 	}
 
 	template <class Field>
@@ -2205,16 +2209,17 @@ namespace LinBox
 		typename Vector1::first_type::const_iterator i_idx = v1.first.begin ();
 		typename Vector1::second_type::const_iterator i_elt = v1.second.begin ();
 		typename Vector2::const_iterator j = v2.begin ();
-		VectorDomainBase<Field>::accu.reset();
+		FieldAXPY<Field> accu(field());
+		//VectorDomainBase<Field>::accu.reset();
 
 		for (; i_idx != v1.first.end () && j != v2.end (); ++i_idx, ++i_elt) {
-			while (j != v2.end () && j->first < *i_idx) j++;
+			while (j != v2.end () && j->first < *i_idx) ++j;
 
 			if (j != v2.end () && j->first == *i_idx)
-				VectorDomainBase<Field>::accu.mulacc (*i_elt, j->second);
+				/*VectorDomainBase<Field>::*/accu.mulacc (*i_elt, j->second);
 		}
 
-		return VectorDomainBase<Field>::accu.get (res);
+		return /*VectorDomainBase<Field>::*/accu.get (res);
 	}
 
 	template <class Field>
@@ -2228,16 +2233,17 @@ namespace LinBox
 	{
 		typename Vector1::const_iterator i;
 		typename Vector2::const_iterator j;
-		VectorDomainBase<Field>::accu.reset();
+		FieldAXPY<Field> accu(field());
+		//VectorDomainBase<Field>::accu.reset();
 
-		for (i = v1.begin (), j = v2.begin (); i != v1.end () && j != v2.end (); i++) {
-			while (j != v2.end () && j->first < i->first) j++;
+		for (i = v1.begin (), j = v2.begin (); i != v1.end () && j != v2.end (); ++i) {
+			while (j != v2.end () && j->first < i->first) ++j;
 
 			if (j != v2.end () && j->first == i->first)
-				VectorDomainBase<Field>::accu.mulacc (i->second, j->second);
+				/*VectorDomainBase<Field>::*/accu.mulacc (i->second, j->second);
 		}
 
-		return VectorDomainBase<Field>::accu.get (res);
+		return /*VectorDomainBase<Field>::*/accu.get (res);
 	}
 
 	template <class Field>
@@ -2252,16 +2258,17 @@ namespace LinBox
 		typename Vector1::first_type::const_iterator i_idx = v1.first.begin ();
 		typename Vector1::second_type::const_iterator i_elt = v1.second.begin ();
 		typename Vector2::const_iterator j = v2.begin ();
-		VectorDomainBase<Field>::accu.reset();
+		FieldAXPY<Field> accu(field());
+		//VectorDomainBase<Field>::accu.reset();
 
 		for (; i_idx != v1.first.end () && j != v2.end (); ++i_idx, ++i_elt) {
-			while (j != v2.end () && j->first < *i_idx) j++;
+			while (j != v2.end () && j->first < *i_idx) ++j;
 
 			if (j != v2.end () && j->first == *i_idx)
-				VectorDomainBase<Field>::accu.mulacc (*i_elt, j->second);
+				/*VectorDomainBase<Field>::*/accu.mulacc (*i_elt, j->second);
 		}
 
-		return VectorDomainBase<Field>::accu.get (res);
+		return /*VectorDomainBase<Field>::*/accu.get (res);
 	}
 
 	template <class Field>
@@ -2277,18 +2284,20 @@ namespace LinBox
 		typename Vector1::second_type::const_iterator i_elt = v1.second.begin ();
 		typename Vector2::first_type::const_iterator j_idx = v2.first.begin ();
 		typename Vector2::second_type::const_iterator j_elt = v2.second.begin ();
-		VectorDomainBase<Field>::accu.reset();
+		FieldAXPY<Field> accu(field());
+		//VectorDomainBase<Field>::accu.reset();
+
 
 		for (; i_idx != v1.first.end () && j_idx != v2.first.end (); ++i_idx, ++i_elt) {
 			while (j_idx != v2.first.end () && *j_idx < *i_idx) {
-				j_idx++; j_elt++;
+				++j_idx; ++j_elt;
 			}
 
 			if (j_idx != v2.first.end () && *j_idx == *i_idx)
-				VectorDomainBase<Field>::accu.mulacc (*i_elt, *j_elt);
+				/*VectorDomainBase<Field>::*/accu.mulacc (*i_elt, *j_elt);
 		}
 
-		return VectorDomainBase<Field>::accu.get (res);
+		return /*VectorDomainBase<Field>::*/accu.get (res);
 	}
 
 	template <class Field>
@@ -2385,11 +2394,10 @@ namespace LinBox
 
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/vector-traits.h b/linbox/vector/vector-traits.h
old mode 100644
new mode 100755
index d21d974..b7bb3da
--- a/linbox/vector/vector-traits.h
+++ b/linbox/vector/vector-traits.h
@@ -56,6 +56,7 @@
 
 #include "linbox/field/archetype.h"
 #include "linbox/field/rebind.h"
+#include "linbox/matrix/sparse-formats.h"
 
 namespace LinBox
 {
@@ -151,7 +152,7 @@ namespace LinBox
 	struct SparseSequenceVectorPairLessThan :
 		public std::binary_function<const std::pair<size_t, Element>&, const std::pair<size_t, Element>&, bool > {
 		bool operator() (const std::pair<size_t, Element>& p1, const std::pair<size_t, Element>& p2)
-		{
+	{
 			return p1.first < p2.first;
 		}
 	};
@@ -180,11 +181,14 @@ namespace LinBox
 		typedef std::vector<Element>                          VectorType;
 	};
 
+
+
 	// Specialization for STL vectors of pairs of size_t and elements
 	template <class Element>
 	struct VectorTraits< std::vector< std::pair<size_t, Element> > > {
 		typedef typename VectorCategories::SparseSequenceVectorTag VectorCategory;
 		typedef std::vector< std::pair<size_t, Element> >              VectorType;
+		typedef SparseMatrixFormat::SparseSeq               SparseFormat;
 
 		static void sort (VectorType& v) { std::stable_sort(v.begin(), v.end(), SparseSequenceVectorPairLessThan<Element>()); }
 	};
@@ -214,6 +218,7 @@ namespace LinBox
 	{
 		typedef typename VectorCategories::SparseAssociativeVectorTag VectorCategory;
 		typedef std::map<size_t, Element>                                 VectorType;
+		typedef SparseMatrixFormat::SparseMap                  SparseFormat;
 	};
 
 	// Specialization for an STL pair of an STL vector of size_t's and an STL vector of elements
@@ -222,6 +227,7 @@ namespace LinBox
 	{
 		typedef typename VectorCategories::SparseParallelVectorTag VectorCategory;
 		typedef std::pair<std::vector<size_t>, std::vector<Element> >  VectorType;
+		typedef SparseMatrixFormat::SparsePar               SparseFormat;
 	};
 
 	// Namespace containing some useful generic functions
@@ -247,6 +253,7 @@ namespace LinBox
 		       	return v[i];
 		}
 
+		//! @bug who is zero ?
 		template <class Field, class Vector>
 		inline typename Field::Element &
 		refSpecialized (Vector &v, size_t i,
@@ -276,6 +283,7 @@ namespace LinBox
 			return v[i];
 		}
 
+		//! @bug who is zero ?
 		template <class Field, class Vector>
 		inline typename Field::Element &
 		refSpecialized (Vector &v, size_t i,
@@ -316,6 +324,7 @@ namespace LinBox
 			return v[i];
 		}
 
+		//! @bug who is zero ?
 		template <class Field, class Vector>
 		inline const typename Field::Element &
 		constRefSpecialized (Vector &v, size_t i,
@@ -343,6 +352,7 @@ namespace LinBox
 			return v[i];
 		}
 
+		//! @bug who is zero ?
 		template <class Field, class Vector>
 		inline typename Field::Element &
 		constRefSpecialized (Vector &v, size_t i,
@@ -424,13 +434,15 @@ namespace LinBox
 	 * a sparse vector.
 	 */
 
+	//! @todo template by Field
 	template <class Element>
 	struct RawVector {
-		typedef std::vector<Element>                                      Dense;
-		typedef std::pair<std::vector<size_t>, std::vector<Element> >    Sparse;
-		typedef std::vector<std::pair<size_t, Element> >              SparseSeq;
-		typedef std::map<size_t, Element>                             SparseMap;
-		typedef std::pair<std::vector<size_t>, std::vector<Element> > SparsePar;
+		typedef std::vector<Element> Dense;
+		typedef std::vector<std::pair<size_t, Element> > SparseSeq;
+		typedef std::list<std::pair<size_t, Element> >   SparseSeq2;
+		typedef std::map<size_t, Element>                SparseMap;
+		typedef std::pair<std::vector<size_t>, Dense >   SparsePar;
+		typedef SparsePar Sparse;
 
 		template<class VType> static size_t size(const VType& d)
 		{
@@ -534,11 +546,10 @@ namespace LinBox
 #endif // __LINBOX_vector_traits_H
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/linbox/vector/vector.h b/linbox/vector/vector.h
new file mode 100644
index 0000000..16d8e67
--- /dev/null
+++ b/linbox/vector/vector.h
@@ -0,0 +1,58 @@
+/* linbox/vector/vector.h
+ * Copyright (C) 2015 the LinBox group
+ *
+ * Written by :
+ * Jean-Guillaume Dumas
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+/*! @file vector/vector.h
+ * @ingroup vector
+ * A \c DenseVector<\c _Field >  is default dense vector of 
+ * <code>_Field::Element</code>s.
+ *
+ */
+
+#ifndef __LINBOX_vector_dense_vector_H
+#define __LINBOX_vector_dense_vector_H
+
+#include "linbox/linbox-config.h"
+#include "linbox/vector/vector-traits.h"
+
+namespace LinBox { /* BlasVector */
+
+    template<class _Vector>
+    class BlasSubvector ;
+
+    template<class _Field, class _Rep=typename RawVector<typename _Field::Element>::Dense>
+    class BlasVector ;
+
+    template <typename _Field> struct DenseVectorChooser { typedef BlasVector<_Field> type; }; // to allow specialization of using DenseVector
+    template <typename _Field> using DenseVector = typename DenseVectorChooser<_Field>::type;
+
+    template <typename _Field> struct DenseSubVectorChooser { typedef BlasSubvector<DenseVector<_Field>> type; }; // to allow specialization of using DenseVector
+    template <class _Field> using DenseSubvector = typename DenseSubVectorChooser<_Field>::type; 
+
+}
+
+#endif // __LINBOX_vector_dense_vector_H
+
+
diff --git a/macros/Makefile.am b/macros/Makefile.am
index 4ac6d1e..f4dbd16 100644
--- a/macros/Makefile.am
+++ b/macros/Makefile.am
@@ -21,12 +21,11 @@
 
 EXTRA_DIST=\
 	   aclocal-include.m4      \
+	   ax_cxx_compile_stdcxx_11.m4 \
 	   config-header.m4        \
 	   debug.m4                \
 	   expat-check.m4          \
 	   fflas-ffpack-check.m4   \
-	   givaro-check.m4         \
-	   gmp-check.m4            \
 	   iml-check.m4            \
 	   lidia-check.m4          \
 	   linbox-benchmark.m4     \
@@ -41,4 +40,5 @@ EXTRA_DIST=\
 	   fplll-check.m4          \
 	   m4rie-check.m4          \
 	   m4ri-check.m4           \
+	   tinyxml2-check.m4        \
 	   sage-check.m4
diff --git a/macros/Makefile.in b/macros/Makefile.in
deleted file mode 100644
index 9e64738..0000000
--- a/macros/Makefile.in
+++ /dev/null
@@ -1,490 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-#
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = macros
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-EXTRA_DIST = \
-	   aclocal-include.m4      \
-	   config-header.m4        \
-	   debug.m4                \
-	   expat-check.m4          \
-	   fflas-ffpack-check.m4   \
-	   givaro-check.m4         \
-	   gmp-check.m4            \
-	   iml-check.m4            \
-	   lidia-check.m4          \
-	   linbox-benchmark.m4     \
-	   linbox-doc.m4           \
-	   linbox-misc.m4          \
-	   linbox-opt.m4           \
-	   maple-check-version.mpl \
-	   maple-check.m4          \
-	   ntl-check.m4            \
-	   saclib-check.m4         \
-	   mpfr-check.m4           \
-	   fplll-check.m4          \
-	   m4rie-check.m4          \
-	   m4ri-check.m4           \
-	   sage-check.m4
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps macros/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps macros/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-	distclean distclean-generic distclean-libtool distdir dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-man install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/macros/ax_cxx_compile_stdcxx_11.m4 b/macros/ax_cxx_compile_stdcxx_11.m4
new file mode 100644
index 0000000..af37acd
--- /dev/null
+++ b/macros/ax_cxx_compile_stdcxx_11.m4
@@ -0,0 +1,133 @@
+# ============================================================================
+#  http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html
+# ============================================================================
+#
+# SYNOPSIS
+#
+#   AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional])
+#
+# DESCRIPTION
+#
+#   Check for baseline language coverage in the compiler for the C++11
+#   standard; if necessary, add switches to CXXFLAGS to enable support.
+#
+#   The first argument, if specified, indicates whether you insist on an
+#   extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
+#   -std=c++11).  If neither is specified, you get whatever works, with
+#   preference for an extended mode.
+#
+#   The second argument, if specified 'mandatory' or if left unspecified,
+#   indicates that baseline C++11 support is required and that the macro
+#   should error out if no mode with that support is found.  If specified
+#   'optional', then configuration proceeds regardless, after defining
+#   HAVE_CXX11 if and only if a supporting mode is found.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Benjamin Kosnik <bkoz at redhat.com>
+#   Copyright (c) 2012 Zack Weinberg <zackw at panix.com>
+#   Copyright (c) 2013 Roy Stogner <roystgnr at ices.utexas.edu>
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved. This file is offered as-is, without any
+#   warranty.
+
+#serial 3
+
+m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [
+  template <typename T>
+    struct check
+    {
+      static_assert(sizeof(int) <= sizeof(T), "not big enough");
+    };
+
+    typedef check<check<bool>> right_angle_brackets;
+
+    int a;
+    decltype(a) b;
+
+    typedef check<int> check_type;
+    check_type c;
+    check_type&& cr = static_cast<check_type&&>(c);
+
+    auto d = a;
+])
+
+AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl
+  m4_if([$1], [], [],
+        [$1], [ext], [],
+        [$1], [noext], [],
+        [m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl
+  m4_if([$2], [], [ax_cxx_compile_cxx11_required=true],
+        [$2], [mandatory], [ax_cxx_compile_cxx11_required=true],
+        [$2], [optional], [ax_cxx_compile_cxx11_required=false],
+        [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_11])])dnl
+  AC_LANG_PUSH([C++])dnl
+  ac_success=no
+  AC_CACHE_CHECK(whether $CXX supports C++11 features by default,
+  ax_cv_cxx_compile_cxx11,
+  [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
+    [ax_cv_cxx_compile_cxx11=yes],
+    [ax_cv_cxx_compile_cxx11=no])])
+  if test x$ax_cv_cxx_compile_cxx11 = xyes; then
+    ac_success=yes
+  fi
+
+  m4_if([$1], [noext], [], [dnl
+  if test x$ac_success = xno; then
+    for switch in -std=gnu++11 -std=gnu++0x; do
+      cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
+      AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
+                     $cachevar,
+        [ac_save_CXXFLAGS="$CXXFLAGS"
+         CXXFLAGS="$CXXFLAGS $switch"
+         AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
+          [eval $cachevar=yes],
+          [eval $cachevar=no])
+         CXXFLAGS="$ac_save_CXXFLAGS"])
+      if eval test x\$$cachevar = xyes; then
+        CXXFLAGS="$CXXFLAGS $switch"
+        ac_success=yes
+        break
+      fi
+    done
+  fi])
+
+  m4_if([$1], [ext], [], [dnl
+  if test x$ac_success = xno; then
+    for switch in -std=c++11 -std=c++0x; do
+      cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
+      AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
+                     $cachevar,
+        [ac_save_CXXFLAGS="$CXXFLAGS"
+         CXXFLAGS="$CXXFLAGS $switch"
+         AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
+          [eval $cachevar=yes],
+          [eval $cachevar=no])
+         CXXFLAGS="$ac_save_CXXFLAGS"])
+      if eval test x\$$cachevar = xyes; then
+        CXXFLAGS="$CXXFLAGS $switch"
+        ac_success=yes
+        break
+      fi
+    done
+  fi])
+  AC_LANG_POP([C++])
+  if test x$ax_cxx_compile_cxx11_required = xtrue; then
+    if test x$ac_success = xno; then
+      AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.])
+    fi
+  else
+    if test x$ac_success = xno; then
+      HAVE_CXX11=0
+      AC_MSG_NOTICE([No compiler with C++11 support was found])
+    else
+      HAVE_CXX11=1
+      AC_DEFINE(HAVE_CXX11,1,
+                [define if the compiler supports basic C++11 syntax])
+    fi
+
+    AC_SUBST(HAVE_CXX11)
+  fi
+])
diff --git a/macros/debug.m4 b/macros/debug.m4
index 9eaea20..44a0da8 100644
--- a/macros/debug.m4
+++ b/macros/debug.m4
@@ -1,20 +1,20 @@
 dnl Copyright(c)'2011 LinBox
-dnl Written by BB <bboyer at imag.fr>
+dnl Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
 dnl This file is part of LinBox.
 
  dnl ========LICENCE========
  dnl This file is part of the library LinBox.
- dnl 
+ dnl
  dnl LinBox is free software: you can redistribute it and/or modify
  dnl it under the terms of the  GNU Lesser General Public
  dnl License as published by the Free Software Foundation; either
  dnl version 2.1 of the License, or (at your option) any later version.
- dnl 
+ dnl
  dnl This library is distributed in the hope that it will be useful,
  dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
  dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  dnl Lesser General Public License for more details.
- dnl 
+ dnl
  dnl You should have received a copy of the GNU Lesser General Public
  dnl License along with this library; if not, write to the Free Software
  dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -25,11 +25,11 @@ dnl enable basic debug mode.
 AC_DEFUN([AC_DEBUG],
 [AC_MSG_CHECKING([whether to enable debugging options in the library])
   AC_ARG_ENABLE(debug,
-[AC_HELP_STRING([--enable-debug], [enable debugging options in library])],
+[AC_HELP_STRING([--enable-debug=yes|no], [enable debugging options in library])],
       USE_DEBUG=$enableval,
       USE_DEBUG=no)
   AC_MSG_RESULT([$USE_DEBUG])
-  AM_CONDITIONAL(DEBUG, [test $USE_DEBUG = yes])
+  AM_CONDITIONAL(DEBUG, [test x$USE_DEBUG = xyes])
   DBG=$USE_DEBUG
   AC_SUBST(DBG)dnl
 ]
@@ -38,7 +38,7 @@ AC_DEFUN([AC_DEBUG],
 AC_DEFUN([AC_PROFILE],
 [AC_MSG_CHECKING([whether to enable profiling everything in the library])
   AC_ARG_ENABLE(profile,
-[AC_HELP_STRING([--enable-profile], [enable profiling options in library])],
+[AC_HELP_STRING([--enable-profile=yes|no], [enable profiling options in library])],
       USE_PROFILE=$enableval,
       USE_PROFILE=no)
   AC_MSG_RESULT([$USE_PROFILE])
@@ -82,7 +82,7 @@ AC_DEFUN([AC_COMPILER_NAME], [
 		AC_SUBST(CCNAM)
 		])
 
-dnl PATHSCALE ?
+dnl PATHSCALE > 4 ?
 		AS_IF([ test -z "${CCNAM}"], [
 			AC_TRY_RUN( [
 				#ifdef __PATHSCALE__
@@ -95,24 +95,68 @@ dnl PATHSCALE ?
 		AC_SUBST(CCNAM) ])
 		])
 
-dnl CLANG ?
+dnl CLANG > 3.1 ?
 		AS_IF([ test -z "${CCNAM}"], [
 			AC_TRY_RUN( [
 				#ifdef __clang__
-				   int main() { return !(__clang_major >=3) ; }
+				   int main() { return !(__clang_major__  >=3 && __clang_minor__ >=1) ; }
 			   #else
 				   pas clang non plus.
 				#endif], [
-		AC_MSG_RESULT(clang)
+		AC_MSG_RESULT(clang31)
+		CCNAM=clang31
+		AC_SUBST(CCNAM) ])
+		])
+
+dnl CLANG > 3 ?
+		AS_IF([ test -z "${CCNAM}"], [
+			AC_TRY_RUN( [
+				#ifdef __clang__
+				   int main() { return !(__clang_major__  >=3) ; }
+			   #else
+				   pas clang non plus.
+				#endif], [
+		AC_MSG_RESULT(clang31)
 		CCNAM=clang
 		AC_SUBST(CCNAM) ])
 		])
 
-dnl GCC ?
+
+dnl GCC >= 4.8 ?
+		AS_IF([ test -z "${CCNAM}"], [
+			AC_TRY_RUN( [
+				#ifdef __GNUC__
+				   int main() { return !(__GNUC__ >= 5 || (__GNUC__ == 4  && __GNUC_MINOR__ > 7 )) ; }
+				#else
+				   pas gcc non plus ???
+				#endif], [
+		CCNOM=gcc
+		AS_IF([ test -n "${CC}" ], [CCNOM="`$CC --version 2>&1|  awk 'NR<2{print $1}'`"])
+		CCNAM=gcc48
+		AC_SUBST(CCNAM)
+		AC_MSG_RESULT($CCNOM)
+		])
+		])
+dnl GCC > 4.4 ?
+		AS_IF([ test -z "${CCNAM}"], [
+			AC_TRY_RUN( [
+				#ifdef __GNUC__
+				   int main() { return !( __GNUC__ == 4 && __GNUC_MINOR__ == 4 ) ; }
+				#else
+				   pas gcc non plus ???
+				#endif], [
+		CCNOM=gcc
+		AS_IF([ test -n "${CC}" ], [CCNOM="`$CC --version 2>&1|  awk 'NR<2{print $1}'`"])
+		CCNAM=gcc44
+		AC_SUBST(CCNAM)
+		AC_MSG_RESULT($CCNOM)
+		])
+		])
+dnl GCC > 4.2 ?
 		AS_IF([ test -z "${CCNAM}"], [
 			AC_TRY_RUN( [
 				#ifdef __GNUC__
-				   int main() { return !(__GNUC__ >= 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)) ; }
+				   int main() { return !(__GNUC__ == 4 && __GNUC_MINOR__ > 2) ; }
 				#else
 				   pas gcc non plus ???
 				#endif], [
diff --git a/macros/expat-check.m4 b/macros/expat-check.m4
index 18741a6..24140d3 100644
--- a/macros/expat-check.m4
+++ b/macros/expat-check.m4
@@ -75,8 +75,8 @@ if test -r "$EXPAT_HOME/include/expat.h"; then
 		EXPAT_LIBS="-lexpat"
 	fi
 
-	CXXFLAGS="${BACKUP_CXXFLAGS} ${EXPAT_CFLAGS} ${GMP_CFLAGS}"
-	LIBS="${BACKUP_LIBS} ${EXPAT_LIBS} ${GMP_LIBS}"
+	CXXFLAGS="${BACKUP_CXXFLAGS} ${EXPAT_CFLAGS} ${FFLAS_FFPACK_CFLAGS}"
+	LIBS="${BACKUP_LIBS} ${EXPAT_LIBS} ${FFLAS_FFPACK_LIBS}"
 	AC_TRY_LINK(
 	[#include <expat.h>],
 	[XML_Content_Type a;],
diff --git a/macros/fflas-ffpack-check.m4 b/macros/fflas-ffpack-check.m4
index 99411d4..ec18e85 100644
--- a/macros/fflas-ffpack-check.m4
+++ b/macros/fflas-ffpack-check.m4
@@ -53,14 +53,12 @@ AC_ARG_WITH(fflas-ffpack,
         fi],
     [FFLAS_FFPACK_HOME_PATH="${DEFAULT_CHECKING_PATH}"])
 
-dnl  min_iml_version=ifelse([$1], ,1.0.3,$1)
-
 dnl -------------------- dnl
 dnl FFLAS-FFPACK VERSION dnl
 dnl -------------------- dnl
 
-version_min=10600
-version_max=10700
+version_min=20200
+version_max=20202
 
 
 dnl Check for existence
@@ -73,18 +71,12 @@ for FFLAS_FFPACK_HOME in ${FFLAS_FFPACK_HOME_PATH}
   do
     if test -r "$FFLAS_FFPACK_HOME/include/fflas-ffpack/fflas-ffpack.h" -a -x "$FFLAS_FFPACK_HOME/bin/fflas-ffpack-config"; then
 
-		BLAS_LIBS=`$FFLAS_FFPACK_HOME/bin/fflas-ffpack-config --blas-libs`
-		BLAS_CFLAGS=`$FFLAS_FFPACK_HOME/bin/fflas-ffpack-config --cflags`
-
-
-       if test "x$FFLAS_FFPACK_HOME" != "x/usr" -a "x$FFLAS_FFPACK_HOME" != "x/usr/local"; then
-           FFLAS_FFPACK_CFLAGS="-I${FFLAS_FFPACK_HOME}/include"
-       else
-           FFLAS_FFPACK_CFLAGS=
-       fi
+	# FFLAS-FFPACK Libs + CFlags contains GMP/Givaro/BLAS infos - AB 2014-12-12
+	FFLAS_FFPACK_LIBS=`$FFLAS_FFPACK_HOME/bin/fflas-ffpack-config --libs`
+	FFLAS_FFPACK_CFLAGS=`$FFLAS_FFPACK_HOME/bin/fflas-ffpack-config --cflags`
 
-       CXXFLAGS="${BACKUP_CXXFLAGS} ${FFLAS_FFPACK_CFLAGS} ${BLAS_CFLAGS}"
-       LIBS="${BACKUP_LIBS} ${BLAS_LIBS}"
+       CXXFLAGS="${BACKUP_CXXFLAGS} ${FFLAS_FFPACK_CFLAGS}"
+       LIBS="${BACKUP_LIBS} ${FFLAS_FFPACK_LIBS}"
 
        AC_TRY_LINK(
        [#include "fflas-ffpack/fflas-ffpack.h"],
@@ -105,11 +97,10 @@ for FFLAS_FFPACK_HOME in ${FFLAS_FFPACK_HOME_PATH}
 	],
        [
        ffflasffpack_found="no"
-       ffflasffpack_checked="$checked $FFLAS_FFPACK_HOME"
+       dnl  ffflasffpack_checked="$checked $FFLAS_FFPACK_HOME"
        unset FFLAS_FFPACK_CFLAGS
+       unset FFLAS_FFPACK_LIBS
 	   unset FFLAS_FFPACK_LOC
-	   unset BLAS_LIBS
-	   unset BLAS_CFLAGS
        ])
 	   dnl  AC_MSG_RESULT(found in $ffflasffpack_checked ? $ffflasffpack_found)
     else
@@ -121,13 +112,12 @@ done
 if test "x$ffflasffpack_found" = "xyes" ; then
     AC_SUBST(FFLAS_FFPACK_CFLAGS)
     AC_SUBST(FFLAS_FFPACK_LIBS)
-	AC_SUBST(FFLAS_FFPACK_LOC)
-	AC_SUBST(BLAS_LIBS)
-	AC_SUBST(BLAS_CFLAGS)
+    
+	HAVE_FFLAS_FFPACK=yes
     AC_DEFINE(HAVE_FFLAS_FFPACK,1,[Define if FFLAS-FFPACK is installed])
 	FF_VER=`$FFLAS_FFPACK_LOC/bin/fflas-ffpack-config --decimal-version`
 	AC_DEFINE_UNQUOTED(FFLAS_FFPACK_VERSION, $FF_VER ,[what version of FFLAS-FFPACK is installed])
-	HAVE_FFLAS_FFPACK=yes
+	
     if test "x$fflasflas_cross" != "xyes"; then
         AC_MSG_RESULT(found)
     else
@@ -135,13 +125,16 @@ if test "x$ffflasffpack_found" = "xyes" ; then
         echo "WARNING: You appear to be cross compiling, so there is no way to determine"
         echo "whether your FFLAS-FFPACK version is new enough. I am assuming it is."
     fi
+    
     ifelse([$2], , :, [$2])
+    
 elif test -n "$fflasflas_problem"; then
     AC_MSG_RESULT(problem)
     echo "Sorry, your FFLAS-FFPACK version is too old. Disabling."
     ifelse([$3], , :, [$3])
+
 elif test "x$fflasflas_found" = "xno" ; then
-    AC_MSG_RESULT(not found)
+    AC_MSG_RESULT(not found: bad version $FF_VER)
     ifelse([$3], , :, [$3])
 fi
 
@@ -149,6 +142,5 @@ AM_CONDITIONAL(LINBOX_HAVE_FFLAS_FFPACK, test "x$HAVE_FFLAS_FFPACK" = "xyes")
 
 CXXFLAGS=${BACKUP_CXXFLAGS}
 LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
 
 ])
diff --git a/macros/flint-check.m4 b/macros/flint-check.m4
new file mode 100644
index 0000000..e5198d9
--- /dev/null
+++ b/macros/flint-check.m4
@@ -0,0 +1,147 @@
+dnl Check for FLINT
+dnl Copyright (c) the LinBox group
+dnl This file is part of LinBox
+
+ dnl ========LICENCE========
+ dnl This file is part of the library LinBox.
+ dnl
+ dnl LinBox is free software: you can redistribute it and/or modify
+ dnl it under the terms of the  GNU Lesser General Public
+ dnl License as published by the Free Software Foundation; either
+ dnl version 2.1 of the License, or (at your option) any later version.
+ dnl
+ dnl This library is distributed in the hope that it will be useful,
+ dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+ dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ dnl Lesser General Public License for more details.
+ dnl
+ dnl You should have received a copy of the GNU Lesser General Public
+ dnl License along with this library; if not, write to the Free Software
+ dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ dnl ========LICENCE========
+ dnl
+dnl Boyer Brice 8/6/12
+dnl Bradford Hovinen, 2001-06-13
+dnl Modified by Pascal Giorgi, 2003-12-03
+dnl Inspired by gnome-bonobo-check.m4 by Miguel de Icaza, 99-04-12
+dnl Stolen from Chris Lahey       99-2-5
+dnl stolen from Manish Singh again
+dnl stolen back from Frank Belew
+dnl stolen from Manish Singh
+dnl Shamelessly stolen from Owen Taylor
+
+dnl LB_CHECK_FLINT ([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl
+dnl Test for FLINT and define FLINT_CFLAGS and FLINT_LIBS
+
+AC_DEFUN([LB_CHECK_FLINT],
+[
+
+AC_ARG_WITH(flint,
+[AC_HELP_STRING([--with-flint=<path>|yes], [Use FLINT library. This library is (not yet) mandatory for
+    LinBox compilation. If argument is yes or <empty> or <bad>
+    that means the library is reachable with the standard
+    search path (/usr or /usr/local). Otherwise you give
+    the <path> to the directory which contains the
+	library.  ])
+])
+
+AS_IF([test "$withval" = yes ],
+	[ FLINT_HOME_PATH="${DEFAULT_CHECKING_PATH}" ],
+	[ test "$withval" != no ],
+	[ FLINT_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}" ],
+	[ FLINT_HOME_PATH="${DEFAULT_CHECKING_PATH}"])
+
+dnl  min_flint_version=ifelse([$1], ,1.0.3,$1)
+
+
+dnl Check for existence
+BACKUP_CXXFLAGS=${CXXFLAGS}
+BACKUP_LIBS=${LIBS}
+
+AC_MSG_CHECKING(for FLINT)
+
+for FLINT_HOME in ${FLINT_HOME_PATH}
+  do
+    AS_IF([test -r "$FLINT_HOME/include/flint/flint.h"],[
+
+       AS_IF([ test "x$FLINT_HOME" != "x/usr" -a "x$FLINT_HOME" != "x/usr/local"],[
+           FLINT_CFLAGS="-I${FLINT_HOME}/include"
+           FLINT_LIBS="-L${FLINT_HOME}/lib -lflint"], [
+		   FLINT_CFLAGS=
+		   FLINT_LIBS="-lflint" ])
+
+       CXXFLAGS="${BACKUP_CXXFLAGS} ${FFLAS_FFPACK_CFLAGS} ${MPFR_CFLAGS} ${FLINT_CFLAGS}"
+       LIBS="${BACKUP_LIBS} ${FFLAS_FFPACK_LIBS} ${MPFR_LIBS} ${FLINT_LIBS}"
+
+       AC_TRY_LINK(
+       [ //extern "C" {
+      #define __GMP_BITS_PER_MP_LIMB GMP_LIMB_BITS
+       #include <flint/flint.h>
+       #include <flint/fmpz_mat.h>
+       //}
+       ],
+       [fmpz_mat_t a;],
+       [
+	   AC_TRY_RUN(
+	   [
+	   #include "flint/flint.h"
+	   int main () {
+	   if ( (__FLINT_VERSION < 2) || ( (__FLINT_VERSION ==2) && (__FLINT_VERSION_MINOR < 4) ) )
+	     return 1 ;
+	   else
+	     return 0;
+	   }
+	   ],[
+	   flint_found="yes"
+	   break
+	   ],[
+	   flint_problem="$problem $FLINT_HOME"
+	   unset FLINT_CFLAGS
+	   unset FLINT_LIBS
+	   ],[
+	   flint_found="yes"
+	   flint_cross="yes"
+	   break
+	   ])
+	   ],
+       [
+       flint_found="no"
+       flint_checked="$checked $FLINT_HOME"
+       unset FLINT_CFLAGS
+       unset FLINT_LIBS
+       ])
+	   dnl  AC_MSG_RESULT(found in $flint_checked ? $flint_found)
+    ],[
+       flint_found="no"
+	   dnl  AC_MSG_RESULT(not found at all $FLINT_HOME : $flint_found)
+    ])
+done
+
+AS_IF([test "x$flint_found" = "xyes"],[
+		AC_SUBST(FLINT_CFLAGS)
+		AC_SUBST(FLINT_LIBS)
+		AC_DEFINE(HAVE_FLINT,1,[Define if FLINT is installed])
+		HAVE_FLINT=yes
+		AS_IF([test "x$flint_cross" != "xyes"],
+			[AC_MSG_RESULT(found)],
+			[AC_MSG_RESULT(unknown)
+			echo "WARNING: You appear to be cross compiling, so there is no way to determine"
+			echo "whether your FLINT version is new enough. I am assuming it is."
+			])
+		ifelse([$2], , :, [$2])],
+		[ test -n "$flint_problem" ],
+		[ AC_MSG_RESULT(problem)
+		echo "Sorry, your FLINT version is too old. Disabling."
+		ifelse([$3], , :, [$3]) ],
+		[ test "x$flint_found" = "xno" ],
+		[ AC_MSG_RESULT(>=2.4 not found )
+		ifelse([$3], , :, [$3])])
+
+AM_CONDITIONAL(LINBOX_HAVE_FLINT, test "x$HAVE_FLINT" = "xyes")
+
+CXXFLAGS=${BACKUP_CXXFLAGS}
+LIBS=${BACKUP_LIBS}
+#unset LD_LIBRARY_PATH
+
+])
diff --git a/macros/fplll-check.m4 b/macros/fplll-check.m4
index ccdb17a..16facba 100644
--- a/macros/fplll-check.m4
+++ b/macros/fplll-check.m4
@@ -39,7 +39,7 @@ AC_DEFUN([LB_CHECK_FPLLL],
 
 AC_ARG_WITH(fplll,
 [AC_HELP_STRING([--with-fplll=<path>|yes], [Use FPLLL library. This library is (not yet) mandatory for
-    LinBox compilation. If argument is yes or <empty> or <bad> :)
+    LinBox compilation. If argument is yes or <empty>
     that means the library is reachable with the standard
     search path (/usr or /usr/local). Otherwise you give
     the <path> to the directory which contains the
@@ -59,7 +59,9 @@ dnl Check for existence
 BACKUP_CXXFLAGS=${CXXFLAGS}
 BACKUP_LIBS=${LIBS}
 
-AC_MSG_CHECKING(for FPLLL)
+version_min=4.0.1
+AC_MSG_CHECKING(for FPLLL >= $version_min)
+
 
 for FPLLL_HOME in ${FPLLL_HOME_PATH}
   do
@@ -73,15 +75,14 @@ for FPLLL_HOME in ${FPLLL_HOME_PATH}
            FPLLL_LIBS="-lfplll"
        ])
 
-       CXXFLAGS="${BACKUP_CXXFLAGS} ${MPFR_CFLAGS} ${FPLLL_CFLAGS} ${GMP_CFLAGS}"
-       LIBS="${BACKUP_LIBS} ${GMP_LIBS} ${MPFR_LIBS} ${FPLLL_LIBS} "
+       CXXFLAGS="${BACKUP_CXXFLAGS} ${MPFR_CFLAGS} ${FPLLL_CFLAGS} ${FFLAS_FFPACK_CFLAGS}"
+       LIBS="${BACKUP_LIBS} ${FFLAS_FFPACK_LIBS} ${MPFR_LIBS} ${FPLLL_LIBS} "
 
        AC_TRY_LINK(
        [
 	   #include <fplll/fplll.h>
-	   #include <fplll/solver.h>
 	   ],
-       [enum EvaluatorType a ;],
+       [enum fplll::MatPrintMode a ;],
        [
 	   AC_TRY_RUN(
 	   [
diff --git a/macros/givaro-check.m4 b/macros/givaro-check.m4
deleted file mode 100644
index f4f2901..0000000
--- a/macros/givaro-check.m4
+++ /dev/null
@@ -1,144 +0,0 @@
-dnl Check for GIVARO
-dnl Copyright (c) the LinBox group
-dnl This file is part of LinBox
-
- dnl ========LICENCE========
- dnl This file is part of the library LinBox.
- dnl
- dnl LinBox is free software: you can redistribute it and/or modify
- dnl it under the terms of the  GNU Lesser General Public
- dnl License as published by the Free Software Foundation; either
- dnl version 2.1 of the License, or (at your option) any later version.
- dnl
- dnl This library is distributed in the hope that it will be useful,
- dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
- dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- dnl Lesser General Public License for more details.
- dnl
- dnl You should have received a copy of the GNU Lesser General Public
- dnl License along with this library; if not, write to the Free Software
- dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- dnl ========LICENCE========
- dnl
-dnl Bradford Hovinen, 2001-06-13
-dnl Modified by Pascal Giorgi, 2003-12-03
-dnl Inspired by gnome-bonobo-check.m4 by Miguel de Icaza, 99-04-12
-dnl Stolen from Chris Lahey       99-2-5
-dnl stolen from Manish Singh again
-dnl stolen back from Frank Belew
-dnl stolen from Manish Singh
-dnl Shamelessly stolen from Owen Taylor
-
-dnl LB_CHECK_GIVARO ([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
-dnl
-dnl Test for Givaro and define GIVARO_CFLAGS and GIVARO_LIBS
-
-AC_DEFUN([LB_CHECK_GIVARO],
-[
-
-AC_ARG_WITH(givaro,
-[AC_HELP_STRING([--with-givaro=<path>|yes], [Use Givaro library. This library is mandatory for
-                           LinBox compilation. If argument is yes or <empty>
-			   that means the library is reachable with the standard
-			   search path (/usr or /usr/local). Otherwise you give
-			   the <path> to the directory which contains the
-			   library.
-])],
-	     [if test "$withval" = yes ; then
-			GIVARO_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-	      elif test "$withval" != no ; then
-			GIVARO_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}"
-	     fi],
-	     [GIVARO_HOME_PATH="${DEFAULT_CHECKING_PATH}"])
-
-dnl -------------- dnl
-dnl GIVARO VERSION dnl
-dnl -------------- dnl
-
-version_min=30700
-version_max=30800
-
-dnl Check for existence
-
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-AC_MSG_CHECKING(for GIVARO >= $version_min and < $version_max)
-
-for GIVARO_HOME in ${GIVARO_HOME_PATH}
- do
-if test -r "$GIVARO_HOME/include/givaro/givconfig.h"; then
-
-	if test "x$GIVARO_HOME" != "x/usr" -a "x$GIVARO_HOME" != "x/usr/local"; then
-		GIVARO_CFLAGS="-I${GIVARO_HOME}/include"
-		GIVARO_LIBS="-L${GIVARO_HOME}/lib -lgivaro"
-	else
-		GIVARO_CFLAGS=
-		GIVARO_LIBS="-lgivaro"
-	fi
-	CXXFLAGS="${BACKUP_CXXFLAGS} ${GIVARO_CFLAGS} ${GMP_CFLAGS}"
-	LIBS="${BACKUP_LIBS} ${GIVARO_LIBS} ${GMP_LIBS}"
-
-	AC_TRY_LINK(
-	[#include <givaro/givinteger.h>],
-	[Givaro::Integer a;],
-	[
-	AC_TRY_RUN(
-	[#include <givaro/givconfig.h>
-	 int main () { if (GIVARO_VERSION < $version_min || GIVARO_VERSION >= $version_max || GIVARO_VERSION>0x030000) return -1; else return 0; /* old version of Givaro are defined as hexa 0x03yyzz*/ }
-	],[
-	givaro_found="yes"
-	break
-	],[
-	givaro_problem="$problem $GIVARO_HOME"
-	unset GIVARO_CFLAGS
-	unset GIVARO_LIBS
-	],[
-	givaro_found="yes"
-	givaro_cross="yes"
-
-	break
-	])
-	],
-	[
-	givaro_found="no"
-	givaro_checked="$checked $GIVARO_HOME"
-	unset GIVARO_CFLAGS
-	unset GIVARO_LIBS
-
-	])
-else
-	givaro_found="no"
-fi
-done
-
-if test "x$givaro_found" = "xyes" ; then
-	AC_SUBST(GIVARO_CFLAGS)
-	AC_SUBST(GIVARO_LIBS)
-	dnl  echo $GIVARO_CFLAGS $GIVARO_LIBS
-	AC_DEFINE(HAVE_GIVARO,1,[Define if GIVARO is installed])
-	HAVE_GIVARO=yes
-	if test "x$givaro_cross" != "xyes"; then
-		AC_MSG_RESULT(found)
-	else
-		AC_MSG_RESULT(unknown)
-		echo "WARNING: You appear to be cross compiling, so there is no way to determine"
-		echo "whether your GIVARO version is new enough. I am assuming it is."
-	fi
-	ifelse([$2], , :, [$2])
-elif test -n "$givaro_problem"; then
-	AC_MSG_RESULT(problem)
-	echo "Sorry, your GIVARO version is too old. Disabling."
-	ifelse([$3], , :, [$3])
-elif test "x$givaro_found" = "xno" ; then
-	AC_MSG_RESULT(not found)
-	ifelse([$3], , :, [$3])
-fi
-
-AM_CONDITIONAL(LINBOX_HAVE_GIVARO, test "x$HAVE_GIVARO" = "xyes")
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-])
diff --git a/macros/gmp-check.m4 b/macros/gmp-check.m4
deleted file mode 100644
index ce9b2b6..0000000
--- a/macros/gmp-check.m4
+++ /dev/null
@@ -1,175 +0,0 @@
-dnl Check for GMP
-dnl Copyright (c) the LinBox group
-dnl This file is part of LinBox
-
- dnl ========LICENCE========
- dnl This file is part of the library LinBox.
- dnl 
- dnl LinBox is free software: you can redistribute it and/or modify
- dnl it under the terms of the  GNU Lesser General Public
- dnl License as published by the Free Software Foundation; either
- dnl version 2.1 of the License, or (at your option) any later version.
- dnl 
- dnl This library is distributed in the hope that it will be useful,
- dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
- dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- dnl Lesser General Public License for more details.
- dnl 
- dnl You should have received a copy of the GNU Lesser General Public
- dnl License along with this library; if not, write to the Free Software
- dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- dnl ========LICENCE========
- dnl
-dnl Modified by Pascal Giorgi, 2003-12-03
-
-dnl LB_CHECK_GMP ([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
-dnl
-dnl Test for the GNU Multiprecision library and define GMP_CFLAGS and GMP_LIBS
-
-AC_DEFUN([LB_CHECK_GMP],
-[
-AC_ARG_WITH(gmp,
-[AC_HELP_STRING([--with-gmp= <path>|yes], [Use GMP library. This library is mandatory for LinBox
-	                 compilation. If argument is yes or <empty> that means
-   	       		 the library is reachable with the standard search path
-			 "/usr" or "/usr/local" (set as default). Otherwise you
-			 give the <path> to the directory which contain the
-			 library.
-])],
-		[if test "$withval" = yes ; then
-			GMP_HOME_PATH="${DEFAULT_CHECKING_PATH}"
-	         elif test "$withval" != no ; then
-			GMP_HOME_PATH="$withval ${DEFAULT_CHECKING_PATH}"
-	        fi],
-		[GMP_HOME_PATH="${DEFAULT_CHECKING_PATH}"])
-
-min_gmp_version=ifelse([$1], ,3.1.1,$1)
-
-dnl Check for existence
-BACKUP_CXXFLAGS=${CXXFLAGS}
-BACKUP_LIBS=${LIBS}
-
-AC_MSG_CHECKING(for GMP >= $min_gmp_version)
-
-for GMP_HOME in ${GMP_HOME_PATH}
-  do
-	if test -r "$GMP_HOME/include/gmp.h"; then
-
-		if test "x$GMP_HOME" != "x/usr" -a "x$GMP_HOME" != "x/usr/local"; then
-			GMP_CFLAGS="-I${GMP_HOME}/include"
-			GMP_LIBS="-L${GMP_HOME}/lib -lgmpxx -lgmp"
-		else
-			GMP_CFLAGS=
-			GMP_LIBS="-lgmpxx -lgmp"
-		fi
-
-		CXXFLAGS="${CXXFLAGS} ${GMP_CFLAGS}"
-		LIBS="${LIBS} ${GMP_LIBS}"
-
-		AC_TRY_LINK(
-		[
-#ifdef __PATHCC__
-#include <rw/_defs.h>
-#include <ansi/_cstddef.h>
-#endif
-#include "stddef.h"
-		#include <gmp.h>
-		],
-		[mpz_t a; mpz_init (a);],
-		[
-        		AC_TRY_RUN(
- 			[
-#ifdef __PATHCC__
-#include <rw/_defs.h>
-		#include <ansi/_cstddef.h>
-		#include "stddef.h"
-#endif
-		#include <gmp.h>
-			 int main () {  if (__GNU_MP_VERSION < 3) return -1; else return 0; }
-		  	],[
-				AC_MSG_RESULT(found)
-				AC_SUBST(GMP_CFLAGS)
-		  		AC_SUBST(GMP_LIBS)
-				AC_DEFINE(HAVE_GMP,1,[Define if GMP is installed])
-				# See if we are running GMP 4.0
-	   			AC_MSG_CHECKING(whether GMP is 4.0 or greater)
-		   		AC_TRY_RUN(
-		   		[
-#ifdef __PATHCC__
-#include <rw/_defs.h>
-		#include <ansi/_cstddef.h>
-		#include "stddef.h"
-#endif
-#include <gmp.h>
-	    			int main () { if (__GNU_MP_VERSION < 4) return -1; else return 0; }
-	   			],[
-					gmp_found="yes"
-					AC_MSG_RESULT(yes)
-					# See if GMP was compiled with --enable-cxx
-					AC_MSG_CHECKING(whether GMP was compiled with --enable-cxx)
-					AC_TRY_RUN(
-					[#include <gmpxx.h>
-					int main () { mpz_class a(2),b(3),c(5); if ( a+b == c ) return 0; else return -1; }
-					],[
-						AC_MSG_RESULT(yes)
-						GMP_VERSION=""
-						AC_SUBST(GMP_VERSION)
-					],[
-						gmp_found="no"
-						AC_MSG_RESULT(no)
-					],[
-						dnl This should never happen
-						AC_MSG_RESULT(no)
-					])
-				],[
-					AC_MSG_RESULT(no)
-					AC_DEFINE(GMP_VERSION_3,1,[Define if GMP is version 3.xxx])
-					GMP_VERSION="-DGMP_VERSION_3"
-					AC_SUBST(GMP_VERSION)
-				],[
-					dnl This should never happen
-					AC_MSG_RESULT(no)
-				])
-				ifelse([$2], , :, [$2])
-				break
-			],[
-				gmp_problem="$gmp_problem $GMP_HOME"
-				unset GMP_CFLAGS
-				unset GMP_LIBS
-			],[
-				AC_MSG_RESULT(unknown)
-				echo "WARNING: You appear to be cross compiling, so there is no way to determine"
-				echo "whether your GMP version is new enough. I am assuming it is."
-				AC_SUBST(GMP_CFLAGS)
-				AC_SUBST(GMP_LIBS)
-				AC_DEFINE(HAVE_GMP,1,[Define if GMP is installed])
-				ifelse([$2], , :, [$2])
-				break
-			])
-		],[
-		gmp_found="no"
-		unset GMP_CFLAGS
-		unset GMP_LIBS
-		])
-
-	else
-		gmp_found="no"
-	fi
-done
-
-if test "x$gmp_found" != "xyes"; then
-	if test -n "$gmp_problem"; then
-		AC_MSG_RESULT(problem)
-		echo "Sorry, your GMP version is too old. Disabling."
-	elif test "x$gmp_found" != "xno"; then
-		AC_MSG_RESULT(not found)
-	fi
-	ifelse($3, , :, $3)
-fi
-
-
-CXXFLAGS=${BACKUP_CXXFLAGS}
-LIBS=${BACKUP_LIBS}
-#unset LD_LIBRARY_PATH
-
-])
diff --git a/macros/iml-check.m4 b/macros/iml-check.m4
index 14c4dc4..da4e6bc 100644
--- a/macros/iml-check.m4
+++ b/macros/iml-check.m4
@@ -73,8 +73,8 @@ for IML_HOME in ${IML_HOME_PATH}
            IML_LIBS="-liml"
        fi
 
-       CXXFLAGS="${BACKUP_CXXFLAGS} ${IML_CFLAGS} ${GMP_CFLAGS}"
-       LIBS="${BACKUP_LIBS} ${IML_LIBS} ${GMP_LIBS}"
+       CXXFLAGS="${BACKUP_CXXFLAGS} ${IML_CFLAGS} ${FFLAS_FFPACK_CFLAGS}"
+       LIBS="${BACKUP_LIBS} ${IML_LIBS} ${FFLAS_FFPACK_LIBS}"
 
        AC_TRY_LINK(
        [#include <gmp.h>
diff --git a/macros/lapack-check.m4 b/macros/lapack-check.m4
index 9d28a73..8b17078 100644
--- a/macros/lapack-check.m4
+++ b/macros/lapack-check.m4
@@ -1,7 +1,7 @@
 dnl Check for LAPACK in fflas-ffpack
 dnl
 dnl Copyright (c) 2011 the LinBox group
-dnl Written by BB <bboyer at imag.fr>
+dnl Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
 dnl This file is part of LinBox
 
 dnl ========LICENCE========
@@ -33,12 +33,12 @@ AC_MSG_CHECKING(for LAPACK in fflas-ffpack)
 BACKUP_CXXFLAGS=${CXXFLAGS}
 BACKUP_LIBS=${LIBS}
 
-CXXFLAGS="${BACKUP_CXXFLAGS} ${FFLAS_FFPACK_CFLAGS} ${BLAS_CFLAGS}"
-LIBS="${BACKUP_LIBS} ${BLAS_LIBS}"
+CXXFLAGS="${BACKUP_CXXFLAGS} ${FFLAS_FFPACK_CFLAGS}"
+LIBS="${BACKUP_LIBS} ${FFLAS_FFPACK_LIBS}"
 
 AC_TRY_RUN(dnl ICC ?
 [   #include "fflas-ffpack/fflas-ffpack-config.h"
-	#ifdef __FFLAS_FFPACK_HAVE_LAPACK
+	#ifdef __FFLASFFPACK_HAVE_LAPACK
 	   int main() { return 0 ; }
    #else
    a pas lapack
diff --git a/macros/libtool.m4 b/macros/libtool.m4
deleted file mode 100644
index bc28ccc..0000000
--- a/macros/libtool.m4
+++ /dev/null
@@ -1,7995 +0,0 @@
-# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
-#
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-m4_define([_LT_COPYING], [dnl
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool 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 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool 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 General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-])
-
-# serial 57 LT_INIT
-
-
-# LT_PREREQ(VERSION)
-# ------------------
-# Complain and exit if this libtool version is less that VERSION.
-m4_defun([LT_PREREQ],
-[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
-       [m4_default([$3],
-		   [m4_fatal([Libtool version $1 or higher is required],
-		             63)])],
-       [$2])])
-
-
-# _LT_CHECK_BUILDDIR
-# ------------------
-# Complain if the absolute build directory name contains unusual characters
-m4_defun([_LT_CHECK_BUILDDIR],
-[case `pwd` in
-  *\ * | *\	*)
-    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
-esac
-])
-
-
-# LT_INIT([OPTIONS])
-# ------------------
-AC_DEFUN([LT_INIT],
-[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
-AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
-AC_BEFORE([$0], [LT_LANG])dnl
-AC_BEFORE([$0], [LT_OUTPUT])dnl
-AC_BEFORE([$0], [LTDL_INIT])dnl
-m4_require([_LT_CHECK_BUILDDIR])dnl
-
-dnl Autoconf doesn't catch unexpanded LT_ macros by default:
-m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
-m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
-dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
-dnl unless we require an AC_DEFUNed macro:
-AC_REQUIRE([LTOPTIONS_VERSION])dnl
-AC_REQUIRE([LTSUGAR_VERSION])dnl
-AC_REQUIRE([LTVERSION_VERSION])dnl
-AC_REQUIRE([LTOBSOLETE_VERSION])dnl
-m4_require([_LT_PROG_LTMAIN])dnl
-
-_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
-
-dnl Parse OPTIONS
-_LT_SET_OPTIONS([$0], [$1])
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-AC_SUBST(LIBTOOL)dnl
-
-_LT_SETUP
-
-# Only expand once:
-m4_define([LT_INIT])
-])# LT_INIT
-
-# Old names:
-AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
-AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
-dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
-
-
-# _LT_CC_BASENAME(CC)
-# -------------------
-# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
-m4_defun([_LT_CC_BASENAME],
-[for cc_temp in $1""; do
-  case $cc_temp in
-    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
-    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-])
-
-
-# _LT_FILEUTILS_DEFAULTS
-# ----------------------
-# It is okay to use these file commands and assume they have been set
-# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
-m4_defun([_LT_FILEUTILS_DEFAULTS],
-[: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-])# _LT_FILEUTILS_DEFAULTS
-
-
-# _LT_SETUP
-# ---------
-m4_defun([_LT_SETUP],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
-AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
-
-_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
-dnl
-_LT_DECL([], [host_alias], [0], [The host system])dnl
-_LT_DECL([], [host], [0])dnl
-_LT_DECL([], [host_os], [0])dnl
-dnl
-_LT_DECL([], [build_alias], [0], [The build system])dnl
-_LT_DECL([], [build], [0])dnl
-_LT_DECL([], [build_os], [0])dnl
-dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([LT_PATH_LD])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-dnl
-AC_REQUIRE([AC_PROG_LN_S])dnl
-test -z "$LN_S" && LN_S="ln -s"
-_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
-dnl
-AC_REQUIRE([LT_CMD_MAX_LEN])dnl
-_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
-_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
-dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_CHECK_SHELL_FEATURES])dnl
-m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
-m4_require([_LT_CMD_RELOAD])dnl
-m4_require([_LT_CHECK_MAGIC_METHOD])dnl
-m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
-m4_require([_LT_CMD_OLD_ARCHIVE])dnl
-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-m4_require([_LT_WITH_SYSROOT])dnl
-
-_LT_CONFIG_LIBTOOL_INIT([
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-])
-if test -n "${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-_LT_CHECK_OBJDIR
-
-m4_require([_LT_TAG_COMPILER])dnl
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-_LT_CC_BASENAME([$compiler])
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    _LT_PATH_MAGIC
-  fi
-  ;;
-esac
-
-# Use C for the default configuration in the libtool script
-LT_SUPPORTED_TAG([CC])
-_LT_LANG_C_CONFIG
-_LT_LANG_DEFAULT_CONFIG
-_LT_CONFIG_COMMANDS
-])# _LT_SETUP
-
-
-# _LT_PREPARE_SED_QUOTE_VARS
-# --------------------------
-# Define a few sed substitution that help us do robust quoting.
-m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
-[# Backslashify metacharacters that are still active within
-# double-quoted strings.
-sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\([["`\\]]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-])
-
-# _LT_PROG_LTMAIN
-# ---------------
-# Note that this code is called both from `configure', and `config.status'
-# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
-# `config.status' has no value for ac_aux_dir unless we are using Automake,
-# so we pass a copy along to make sure it has a sensible value anyway.
-m4_defun([_LT_PROG_LTMAIN],
-[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
-_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
-ltmain="$ac_aux_dir/ltmain.sh"
-])# _LT_PROG_LTMAIN
-
-
-## ------------------------------------- ##
-## Accumulate code for creating libtool. ##
-## ------------------------------------- ##
-
-# So that we can recreate a full libtool script including additional
-# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
-# in macros and then make a single call at the end using the `libtool'
-# label.
-
-
-# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
-# ----------------------------------------
-# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-m4_define([_LT_CONFIG_LIBTOOL_INIT],
-[m4_ifval([$1],
-          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
-                     [$1
-])])])
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_INIT])
-
-
-# _LT_CONFIG_LIBTOOL([COMMANDS])
-# ------------------------------
-# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-m4_define([_LT_CONFIG_LIBTOOL],
-[m4_ifval([$1],
-          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
-                     [$1
-])])])
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
-
-
-# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
-# -----------------------------------------------------
-m4_defun([_LT_CONFIG_SAVE_COMMANDS],
-[_LT_CONFIG_LIBTOOL([$1])
-_LT_CONFIG_LIBTOOL_INIT([$2])
-])
-
-
-# _LT_FORMAT_COMMENT([COMMENT])
-# -----------------------------
-# Add leading comment marks to the start of each line, and a trailing
-# full-stop to the whole comment if one is not present already.
-m4_define([_LT_FORMAT_COMMENT],
-[m4_ifval([$1], [
-m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
-              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
-)])
-
-
-
-## ------------------------ ##
-## FIXME: Eliminate VARNAME ##
-## ------------------------ ##
-
-
-# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
-# -------------------------------------------------------------------
-# CONFIGNAME is the name given to the value in the libtool script.
-# VARNAME is the (base) name used in the configure script.
-# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
-# VARNAME.  Any other value will be used directly.
-m4_define([_LT_DECL],
-[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
-    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
-	[m4_ifval([$1], [$1], [$2])])
-    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
-    m4_ifval([$4],
-	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
-    lt_dict_add_subkey([lt_decl_dict], [$2],
-	[tagged?], [m4_ifval([$5], [yes], [no])])])
-])
-
-
-# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
-# --------------------------------------------------------
-m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
-
-
-# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
-# ------------------------------------------------
-m4_define([lt_decl_tag_varnames],
-[_lt_decl_filter([tagged?], [yes], $@)])
-
-
-# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
-# ---------------------------------------------------------
-m4_define([_lt_decl_filter],
-[m4_case([$#],
-  [0], [m4_fatal([$0: too few arguments: $#])],
-  [1], [m4_fatal([$0: too few arguments: $#: $1])],
-  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
-  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
-  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
-])
-
-
-# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
-# --------------------------------------------------
-m4_define([lt_decl_quote_varnames],
-[_lt_decl_filter([value], [1], $@)])
-
-
-# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
-# ---------------------------------------------------
-m4_define([lt_decl_dquote_varnames],
-[_lt_decl_filter([value], [2], $@)])
-
-
-# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
-# ---------------------------------------------------
-m4_define([lt_decl_varnames_tagged],
-[m4_assert([$# <= 2])dnl
-_$0(m4_quote(m4_default([$1], [[, ]])),
-    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
-    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
-m4_define([_lt_decl_varnames_tagged],
-[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
-
-
-# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
-# ------------------------------------------------
-m4_define([lt_decl_all_varnames],
-[_$0(m4_quote(m4_default([$1], [[, ]])),
-     m4_if([$2], [],
-	   m4_quote(lt_decl_varnames),
-	m4_quote(m4_shift($@))))[]dnl
-])
-m4_define([_lt_decl_all_varnames],
-[lt_join($@, lt_decl_varnames_tagged([$1],
-			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
-])
-
-
-# _LT_CONFIG_STATUS_DECLARE([VARNAME])
-# ------------------------------------
-# Quote a variable value, and forward it to `config.status' so that its
-# declaration there will have the same value as in `configure'.  VARNAME
-# must have a single quote delimited value for this to work.
-m4_define([_LT_CONFIG_STATUS_DECLARE],
-[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
-
-
-# _LT_CONFIG_STATUS_DECLARATIONS
-# ------------------------------
-# We delimit libtool config variables with single quotes, so when
-# we write them to config.status, we have to be sure to quote all
-# embedded single quotes properly.  In configure, this macro expands
-# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
-#
-#    <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
-m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
-[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
-    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
-
-
-# _LT_LIBTOOL_TAGS
-# ----------------
-# Output comment and list of tags supported by the script
-m4_defun([_LT_LIBTOOL_TAGS],
-[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
-available_tags="_LT_TAGS"dnl
-])
-
-
-# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
-# -----------------------------------
-# Extract the dictionary values for VARNAME (optionally with TAG) and
-# expand to a commented shell variable setting:
-#
-#    # Some comment about what VAR is for.
-#    visible_name=$lt_internal_name
-m4_define([_LT_LIBTOOL_DECLARE],
-[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
-					   [description])))[]dnl
-m4_pushdef([_libtool_name],
-    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
-m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
-    [0], [_libtool_name=[$]$1],
-    [1], [_libtool_name=$lt_[]$1],
-    [2], [_libtool_name=$lt_[]$1],
-    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
-m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
-])
-
-
-# _LT_LIBTOOL_CONFIG_VARS
-# -----------------------
-# Produce commented declarations of non-tagged libtool config variables
-# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
-# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
-# section) are produced by _LT_LIBTOOL_TAG_VARS.
-m4_defun([_LT_LIBTOOL_CONFIG_VARS],
-[m4_foreach([_lt_var],
-    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
-    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
-
-
-# _LT_LIBTOOL_TAG_VARS(TAG)
-# -------------------------
-m4_define([_LT_LIBTOOL_TAG_VARS],
-[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
-    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
-
-
-# _LT_TAGVAR(VARNAME, [TAGNAME])
-# ------------------------------
-m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
-
-
-# _LT_CONFIG_COMMANDS
-# -------------------
-# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
-# variables for single and double quote escaping we saved from calls
-# to _LT_DECL, we can put quote escaped variables declarations
-# into `config.status', and then the shell code to quote escape them in
-# for loops in `config.status'.  Finally, any additional code accumulated
-# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
-m4_defun([_LT_CONFIG_COMMANDS],
-[AC_PROVIDE_IFELSE([LT_OUTPUT],
-	dnl If the libtool generation code has been placed in $CONFIG_LT,
-	dnl instead of duplicating it all over again into config.status,
-	dnl then we will have config.status run $CONFIG_LT later, so it
-	dnl needs to know what name is stored there:
-        [AC_CONFIG_COMMANDS([libtool],
-            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
-    dnl If the libtool generation code is destined for config.status,
-    dnl expand the accumulated commands and init code now:
-    [AC_CONFIG_COMMANDS([libtool],
-        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
-])#_LT_CONFIG_COMMANDS
-
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
-[
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-_LT_CONFIG_STATUS_DECLARATIONS
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-\$[]1
-_LTECHO_EOF'
-}
-
-# Quote evaled strings.
-for var in lt_decl_all_varnames([[ \
-]], lt_decl_quote_varnames); do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Double-quote double-evaled strings.
-for var in lt_decl_all_varnames([[ \
-]], lt_decl_dquote_varnames); do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-_LT_OUTPUT_LIBTOOL_INIT
-])
-
-# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
-# ------------------------------------
-# Generate a child script FILE with all initialization necessary to
-# reuse the environment learned by the parent script, and make the
-# file executable.  If COMMENT is supplied, it is inserted after the
-# `#!' sequence but before initialization text begins.  After this
-# macro, additional text can be appended to FILE to form the body of
-# the child script.  The macro ends with non-zero status if the
-# file could not be fully written (such as if the disk is full).
-m4_ifdef([AS_INIT_GENERATED],
-[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
-[m4_defun([_LT_GENERATED_FILE_INIT],
-[m4_require([AS_PREPARE])]dnl
-[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
-[lt_write_fail=0
-cat >$1 <<_ASEOF || lt_write_fail=1
-#! $SHELL
-# Generated by $as_me.
-$2
-SHELL=\${CONFIG_SHELL-$SHELL}
-export SHELL
-_ASEOF
-cat >>$1 <<\_ASEOF || lt_write_fail=1
-AS_SHELL_SANITIZE
-_AS_PREPARE
-exec AS_MESSAGE_FD>&1
-_ASEOF
-test $lt_write_fail = 0 && chmod +x $1[]dnl
-m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
-
-# LT_OUTPUT
-# ---------
-# This macro allows early generation of the libtool script (before
-# AC_OUTPUT is called), incase it is used in configure for compilation
-# tests.
-AC_DEFUN([LT_OUTPUT],
-[: ${CONFIG_LT=./config.lt}
-AC_MSG_NOTICE([creating $CONFIG_LT])
-_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
-[# Run this file to recreate a libtool stub with the current configuration.])
-
-cat >>"$CONFIG_LT" <<\_LTEOF
-lt_cl_silent=false
-exec AS_MESSAGE_LOG_FD>>config.log
-{
-  echo
-  AS_BOX([Running $as_me.])
-} >&AS_MESSAGE_LOG_FD
-
-lt_cl_help="\
-\`$as_me' creates a local libtool stub from the current configuration,
-for use in further configure time tests before the real libtool is
-generated.
-
-Usage: $[0] [[OPTIONS]]
-
-  -h, --help      print this help, then exit
-  -V, --version   print version number, then exit
-  -q, --quiet     do not print progress messages
-  -d, --debug     don't remove temporary files
-
-Report bugs to <bug-libtool at gnu.org>."
-
-lt_cl_version="\
-m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
-m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
-configured by $[0], generated by m4_PACKAGE_STRING.
-
-Copyright (C) 2011 Free Software Foundation, Inc.
-This config.lt script is free software; the Free Software Foundation
-gives unlimited permision to copy, distribute and modify it."
-
-while test $[#] != 0
-do
-  case $[1] in
-    --version | --v* | -V )
-      echo "$lt_cl_version"; exit 0 ;;
-    --help | --h* | -h )
-      echo "$lt_cl_help"; exit 0 ;;
-    --debug | --d* | -d )
-      debug=: ;;
-    --quiet | --q* | --silent | --s* | -q )
-      lt_cl_silent=: ;;
-
-    -*) AC_MSG_ERROR([unrecognized option: $[1]
-Try \`$[0] --help' for more information.]) ;;
-
-    *) AC_MSG_ERROR([unrecognized argument: $[1]
-Try \`$[0] --help' for more information.]) ;;
-  esac
-  shift
-done
-
-if $lt_cl_silent; then
-  exec AS_MESSAGE_FD>/dev/null
-fi
-_LTEOF
-
-cat >>"$CONFIG_LT" <<_LTEOF
-_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
-_LTEOF
-
-cat >>"$CONFIG_LT" <<\_LTEOF
-AC_MSG_NOTICE([creating $ofile])
-_LT_OUTPUT_LIBTOOL_COMMANDS
-AS_EXIT(0)
-_LTEOF
-chmod +x "$CONFIG_LT"
-
-# configure is writing to config.log, but config.lt does its own redirection,
-# appending to config.log, which fails on DOS, as config.log is still kept
-# open by configure.  Here we exec the FD to /dev/null, effectively closing
-# config.log, so it can be properly (re)opened and appended to by config.lt.
-lt_cl_success=:
-test "$silent" = yes &&
-  lt_config_lt_args="$lt_config_lt_args --quiet"
-exec AS_MESSAGE_LOG_FD>/dev/null
-$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
-exec AS_MESSAGE_LOG_FD>>config.log
-$lt_cl_success || AS_EXIT(1)
-])# LT_OUTPUT
-
-
-# _LT_CONFIG(TAG)
-# ---------------
-# If TAG is the built-in tag, create an initial libtool script with a
-# default configuration from the untagged config vars.  Otherwise add code
-# to config.status for appending the configuration named by TAG from the
-# matching tagged config vars.
-m4_defun([_LT_CONFIG],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-_LT_CONFIG_SAVE_COMMANDS([
-  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
-  m4_if(_LT_TAG, [C], [
-    # See if we are running on zsh, and set the options which allow our
-    # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
-      setopt NO_GLOB_SUBST
-    fi
-
-    cfgfile="${ofile}T"
-    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
-    $RM "$cfgfile"
-
-    cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
-_LT_COPYING
-_LT_LIBTOOL_TAGS
-
-# ### BEGIN LIBTOOL CONFIG
-_LT_LIBTOOL_CONFIG_VARS
-_LT_LIBTOOL_TAG_VARS
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
-  case $host_os in
-  aix3*)
-    cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-_LT_EOF
-    ;;
-  esac
-
-  _LT_PROG_LTMAIN
-
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '$q' "$ltmain" >> "$cfgfile" \
-     || (rm -f "$cfgfile"; exit 1)
-
-  _LT_PROG_REPLACE_SHELLFNS
-
-   mv -f "$cfgfile" "$ofile" ||
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
-],
-[cat <<_LT_EOF >> "$ofile"
-
-dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
-dnl in a comment (ie after a #).
-# ### BEGIN LIBTOOL TAG CONFIG: $1
-_LT_LIBTOOL_TAG_VARS(_LT_TAG)
-# ### END LIBTOOL TAG CONFIG: $1
-_LT_EOF
-])dnl /m4_if
-],
-[m4_if([$1], [], [
-    PACKAGE='$PACKAGE'
-    VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
-    RM='$RM'
-    ofile='$ofile'], [])
-])dnl /_LT_CONFIG_SAVE_COMMANDS
-])# _LT_CONFIG
-
-
-# LT_SUPPORTED_TAG(TAG)
-# ---------------------
-# Trace this macro to discover what tags are supported by the libtool
-# --tag option, using:
-#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
-AC_DEFUN([LT_SUPPORTED_TAG], [])
-
-
-# C support is built-in for now
-m4_define([_LT_LANG_C_enabled], [])
-m4_define([_LT_TAGS], [])
-
-
-# LT_LANG(LANG)
-# -------------
-# Enable libtool support for the given language if not already enabled.
-AC_DEFUN([LT_LANG],
-[AC_BEFORE([$0], [LT_OUTPUT])dnl
-m4_case([$1],
-  [C],			[_LT_LANG(C)],
-  [C++],		[_LT_LANG(CXX)],
-  [Go],			[_LT_LANG(GO)],
-  [Java],		[_LT_LANG(GCJ)],
-  [Fortran 77],		[_LT_LANG(F77)],
-  [Fortran],		[_LT_LANG(FC)],
-  [Windows Resource],	[_LT_LANG(RC)],
-  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
-    [_LT_LANG($1)],
-    [m4_fatal([$0: unsupported language: "$1"])])])dnl
-])# LT_LANG
-
-
-# _LT_LANG(LANGNAME)
-# ------------------
-m4_defun([_LT_LANG],
-[m4_ifdef([_LT_LANG_]$1[_enabled], [],
-  [LT_SUPPORTED_TAG([$1])dnl
-  m4_append([_LT_TAGS], [$1 ])dnl
-  m4_define([_LT_LANG_]$1[_enabled], [])dnl
-  _LT_LANG_$1_CONFIG($1)])dnl
-])# _LT_LANG
-
-
-m4_ifndef([AC_PROG_GO], [
-############################################################
-# NOTE: This macro has been submitted for inclusion into   #
-#  GNU Autoconf as AC_PROG_GO.  When it is available in    #
-#  a released version of Autoconf we should remove this    #
-#  macro and use it instead.                               #
-############################################################
-m4_defun([AC_PROG_GO],
-[AC_LANG_PUSH(Go)dnl
-AC_ARG_VAR([GOC],     [Go compiler command])dnl
-AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
-_AC_ARG_VAR_LDFLAGS()dnl
-AC_CHECK_TOOL(GOC, gccgo)
-if test -z "$GOC"; then
-  if test -n "$ac_tool_prefix"; then
-    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
-  fi
-fi
-if test -z "$GOC"; then
-  AC_CHECK_PROG(GOC, gccgo, gccgo, false)
-fi
-])#m4_defun
-])#m4_ifndef
-
-
-# _LT_LANG_DEFAULT_CONFIG
-# -----------------------
-m4_defun([_LT_LANG_DEFAULT_CONFIG],
-[AC_PROVIDE_IFELSE([AC_PROG_CXX],
-  [LT_LANG(CXX)],
-  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
-
-AC_PROVIDE_IFELSE([AC_PROG_F77],
-  [LT_LANG(F77)],
-  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
-
-AC_PROVIDE_IFELSE([AC_PROG_FC],
-  [LT_LANG(FC)],
-  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
-
-dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
-dnl pulling things in needlessly.
-AC_PROVIDE_IFELSE([AC_PROG_GCJ],
-  [LT_LANG(GCJ)],
-  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
-    [LT_LANG(GCJ)],
-    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
-      [LT_LANG(GCJ)],
-      [m4_ifdef([AC_PROG_GCJ],
-	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
-       m4_ifdef([A][M_PROG_GCJ],
-	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
-       m4_ifdef([LT_PROG_GCJ],
-	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
-
-AC_PROVIDE_IFELSE([AC_PROG_GO],
-  [LT_LANG(GO)],
-  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
-
-AC_PROVIDE_IFELSE([LT_PROG_RC],
-  [LT_LANG(RC)],
-  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
-])# _LT_LANG_DEFAULT_CONFIG
-
-# Obsolete macros:
-AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
-AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
-AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
-AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
-AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
-dnl AC_DEFUN([AC_LIBTOOL_F77], [])
-dnl AC_DEFUN([AC_LIBTOOL_FC], [])
-dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
-dnl AC_DEFUN([AC_LIBTOOL_RC], [])
-
-
-# _LT_TAG_COMPILER
-# ----------------
-m4_defun([_LT_TAG_COMPILER],
-[AC_REQUIRE([AC_PROG_CC])dnl
-
-_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
-_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
-_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
-_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-])# _LT_TAG_COMPILER
-
-
-# _LT_COMPILER_BOILERPLATE
-# ------------------------
-# Check for compiler boilerplate output or warnings with
-# the simple compiler test code.
-m4_defun([_LT_COMPILER_BOILERPLATE],
-[m4_require([_LT_DECL_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-])# _LT_COMPILER_BOILERPLATE
-
-
-# _LT_LINKER_BOILERPLATE
-# ----------------------
-# Check for linker boilerplate output or warnings with
-# the simple link test code.
-m4_defun([_LT_LINKER_BOILERPLATE],
-[m4_require([_LT_DECL_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-])# _LT_LINKER_BOILERPLATE
-
-# _LT_REQUIRED_DARWIN_CHECKS
-# -------------------------
-m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
-  case $host_os in
-    rhapsody* | darwin*)
-    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
-    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
-    AC_CHECK_TOOL([LIPO], [lipo], [:])
-    AC_CHECK_TOOL([OTOOL], [otool], [:])
-    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
-    _LT_DECL([], [DSYMUTIL], [1],
-      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
-    _LT_DECL([], [NMEDIT], [1],
-      [Tool to change global to local symbols on Mac OS X])
-    _LT_DECL([], [LIPO], [1],
-      [Tool to manipulate fat objects and archives on Mac OS X])
-    _LT_DECL([], [OTOOL], [1],
-      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
-    _LT_DECL([], [OTOOL64], [1],
-      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
-
-    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
-      [lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
-	# By default we will add the -single_module flag. You can override
-	# by either setting the environment variable LT_MULTI_MODULE
-	# non-empty at configure time, or by adding -multi_module to the
-	# link flags.
-	rm -rf libconftest.dylib*
-	echo "int foo(void){return 1;}" > conftest.c
-	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
-	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
-        _lt_result=$?
-	# If there is a non-empty error log, and "single_module"
-	# appears in it, assume the flag caused a linker warning
-        if test -s conftest.err && $GREP single_module conftest.err; then
-	  cat conftest.err >&AS_MESSAGE_LOG_FD
-	# Otherwise, if the output was created with a 0 exit code from
-	# the compiler, it worked.
-	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
-	  lt_cv_apple_cc_single_mod=yes
-	else
-	  cat conftest.err >&AS_MESSAGE_LOG_FD
-	fi
-	rm -rf libconftest.dylib*
-	rm -f conftest.*
-      fi])
-
-    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
-      [lt_cv_ld_exported_symbols_list],
-      [lt_cv_ld_exported_symbols_list=no
-      save_LDFLAGS=$LDFLAGS
-      echo "_main" > conftest.sym
-      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
-	[lt_cv_ld_exported_symbols_list=yes],
-	[lt_cv_ld_exported_symbols_list=no])
-	LDFLAGS="$save_LDFLAGS"
-    ])
-
-    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
-      [lt_cv_ld_force_load=no
-      cat > conftest.c << _LT_EOF
-int forced_loaded() { return 2;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
-      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
-      echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
-      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
-      echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
-      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
-      cat > conftest.c << _LT_EOF
-int main() { return 0;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
-      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
-      _lt_result=$?
-      if test -s conftest.err && $GREP force_load conftest.err; then
-	cat conftest.err >&AS_MESSAGE_LOG_FD
-      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
-	lt_cv_ld_force_load=yes
-      else
-	cat conftest.err >&AS_MESSAGE_LOG_FD
-      fi
-        rm -f conftest.err libconftest.a conftest conftest.c
-        rm -rf conftest.dSYM
-    ])
-    case $host_os in
-    rhapsody* | darwin1.[[012]])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-    darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-    darwin*) # darwin 5.x on
-      # if running on 10.5 or later, the deployment target defaults
-      # to the OS version, if on x86, and 10.4, the deployment
-      # target defaults to 10.4. Don't you love it?
-      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[[012]]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-      esac
-    ;;
-  esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-      _lt_dar_single_mod='$single_module'
-    fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-    else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
-      _lt_dsymutil='~$DSYMUTIL $lib || :'
-    else
-      _lt_dsymutil=
-    fi
-    ;;
-  esac
-])
-
-
-# _LT_DARWIN_LINKER_FEATURES([TAG])
-# ---------------------------------
-# Checks for linker and compiler features on darwin
-m4_defun([_LT_DARWIN_LINKER_FEATURES],
-[
-  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
-  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-  _LT_TAGVAR(hardcode_direct, $1)=no
-  _LT_TAGVAR(hardcode_automatic, $1)=yes
-  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
-                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
-  else
-    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
-  fi
-  _LT_TAGVAR(link_all_deplibs, $1)=yes
-  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=func_echo_all
-    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-    m4_if([$1], [CXX],
-[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
-    fi
-],[])
-  else
-  _LT_TAGVAR(ld_shlibs, $1)=no
-  fi
-])
-
-# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
-# ----------------------------------
-# Links a minimal program and checks the executable
-# for the system default hardcoded library path. In most cases,
-# this is /usr/lib:/lib, but when the MPI compilers are used
-# the location of the communication and MPI libs are included too.
-# If we don't find anything, use the default library path according
-# to the aix ld manual.
-# Store the results from the different compilers for each TAGNAME.
-# Allow to override them for all tags through lt_cv_aix_libpath.
-m4_defun([_LT_SYS_MODULE_PATH_AIX],
-[m4_require([_LT_DECL_SED])dnl
-if test "${lt_cv_aix_libpath+set}" = set; then
-  aix_libpath=$lt_cv_aix_libpath
-else
-  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
-  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
-  lt_aix_libpath_sed='[
-      /Import File Strings/,/^$/ {
-	  /^0/ {
-	      s/^0  *\([^ ]*\) *$/\1/
-	      p
-	  }
-      }]'
-  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  # Check for a 64-bit object if we didn't find anything.
-  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
-    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  fi],[])
-  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
-    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
-  fi
-  ])
-  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
-fi
-])# _LT_SYS_MODULE_PATH_AIX
-
-
-# _LT_SHELL_INIT(ARG)
-# -------------------
-m4_define([_LT_SHELL_INIT],
-[m4_divert_text([M4SH-INIT], [$1
-])])# _LT_SHELL_INIT
-
-
-
-# _LT_PROG_ECHO_BACKSLASH
-# -----------------------
-# Find how we can fake an echo command that does not interpret backslash.
-# In particular, with Autoconf 2.60 or later we add some code to the start
-# of the generated configure script which will find a shell with a builtin
-# printf (which we can use as an echo command).
-m4_defun([_LT_PROG_ECHO_BACKSLASH],
-[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-
-AC_MSG_CHECKING([how to print strings])
-# Test print first, because it will be a builtin if present.
-if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
-   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='print -r --'
-elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='printf %s\n'
-else
-  # Use this function as a fallback that always works.
-  func_fallback_echo ()
-  {
-    eval 'cat <<_LTECHO_EOF
-$[]1
-_LTECHO_EOF'
-  }
-  ECHO='func_fallback_echo'
-fi
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO "$*" 
-}
-
-case "$ECHO" in
-  printf*) AC_MSG_RESULT([printf]) ;;
-  print*) AC_MSG_RESULT([print -r]) ;;
-  *) AC_MSG_RESULT([cat]) ;;
-esac
-
-m4_ifdef([_AS_DETECT_SUGGESTED],
-[_AS_DETECT_SUGGESTED([
-  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
-    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-    PATH=/empty FPATH=/empty; export PATH FPATH
-    test "X`printf %s $ECHO`" = "X$ECHO" \
-      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
-
-_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
-_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
-])# _LT_PROG_ECHO_BACKSLASH
-
-
-# _LT_WITH_SYSROOT
-# ----------------
-AC_DEFUN([_LT_WITH_SYSROOT],
-[AC_MSG_CHECKING([for sysroot])
-AC_ARG_WITH([sysroot],
-[  --with-sysroot[=DIR] Search for dependent libraries within DIR
-                        (or the compiler's sysroot if not specified).],
-[], [with_sysroot=no])
-
-dnl lt_sysroot will always be passed unquoted.  We quote it here
-dnl in case the user passed a directory name.
-lt_sysroot=
-case ${with_sysroot} in #(
- yes)
-   if test "$GCC" = yes; then
-     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
-   fi
-   ;; #(
- /*)
-   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
-   ;; #(
- no|'')
-   ;; #(
- *)
-   AC_MSG_RESULT([${with_sysroot}])
-   AC_MSG_ERROR([The sysroot must be an absolute path.])
-   ;;
-esac
-
- AC_MSG_RESULT([${lt_sysroot:-no}])
-_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
-[dependent libraries, and in which our libraries should be installed.])])
-
-# _LT_ENABLE_LOCK
-# ---------------
-m4_defun([_LT_ENABLE_LOCK],
-[AC_ARG_ENABLE([libtool-lock],
-  [AS_HELP_STRING([--disable-libtool-lock],
-    [avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.$ac_objext` in
-      *ELF-32*)
-	HPUX_IA64_MODE="32"
-	;;
-      *ELF-64*)
-	HPUX_IA64_MODE="64"
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -melf32bsmip"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -melf32bmipn32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -melf64bmip"
-	;;
-      esac
-    else
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -32"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -n32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -64"
-	  ;;
-      esac
-    fi
-  fi
-  rm -rf conftest*
-  ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-      *32-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_i386_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_i386"
-	    ;;
-	  ppc64-*linux*|powerpc64-*linux*)
-	    LD="${LD-ld} -m elf32ppclinux"
-	    ;;
-	  s390x-*linux*)
-	    LD="${LD-ld} -m elf_s390"
-	    ;;
-	  sparc64-*linux*)
-	    LD="${LD-ld} -m elf32_sparc"
-	    ;;
-	esac
-	;;
-      *64-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_x86_64_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_x86_64"
-	    ;;
-	  ppc*-*linux*|powerpc*-*linux*)
-	    LD="${LD-ld} -m elf64ppc"
-	    ;;
-	  s390*-*linux*|s390*-*tpf*)
-	    LD="${LD-ld} -m elf64_s390"
-	    ;;
-	  sparc*-*linux*)
-	    LD="${LD-ld} -m elf64_sparc"
-	    ;;
-	esac
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
-    [AC_LANG_PUSH(C)
-     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
-     AC_LANG_POP])
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*)
-        case $host in
-        i?86-*-solaris*)
-          LD="${LD-ld} -m elf_x86_64"
-          ;;
-        sparc*-*-solaris*)
-          LD="${LD-ld} -m elf64_sparc"
-          ;;
-        esac
-        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
-        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
-          LD="${LD-ld}_sol2"
-        fi
-        ;;
-      *)
-	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
-	  LD="${LD-ld} -64"
-	fi
-	;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-esac
-
-need_locks="$enable_libtool_lock"
-])# _LT_ENABLE_LOCK
-
-
-# _LT_PROG_AR
-# -----------
-m4_defun([_LT_PROG_AR],
-[AC_CHECK_TOOLS(AR, [ar], false)
-: ${AR=ar}
-: ${AR_FLAGS=cru}
-_LT_DECL([], [AR], [1], [The archiver])
-_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
-
-AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
-  [lt_cv_ar_at_file=no
-   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
-     [echo conftest.$ac_objext > conftest.lst
-      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
-      AC_TRY_EVAL([lt_ar_try])
-      if test "$ac_status" -eq 0; then
-	# Ensure the archiver fails upon bogus file names.
-	rm -f conftest.$ac_objext libconftest.a
-	AC_TRY_EVAL([lt_ar_try])
-	if test "$ac_status" -ne 0; then
-          lt_cv_ar_at_file=@
-        fi
-      fi
-      rm -f conftest.* libconftest.a
-     ])
-  ])
-
-if test "x$lt_cv_ar_at_file" = xno; then
-  archiver_list_spec=
-else
-  archiver_list_spec=$lt_cv_ar_at_file
-fi
-_LT_DECL([], [archiver_list_spec], [1],
-  [How to feed a file listing to the archiver])
-])# _LT_PROG_AR
-
-
-# _LT_CMD_OLD_ARCHIVE
-# -------------------
-m4_defun([_LT_CMD_OLD_ARCHIVE],
-[_LT_PROG_AR
-
-AC_CHECK_TOOL(STRIP, strip, :)
-test -z "$STRIP" && STRIP=:
-_LT_DECL([], [STRIP], [1], [A symbol stripping program])
-
-AC_CHECK_TOOL(RANLIB, ranlib, :)
-test -z "$RANLIB" && RANLIB=:
-_LT_DECL([], [RANLIB], [1],
-    [Commands used to install an old-style archive])
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
-fi
-
-case $host_os in
-  darwin*)
-    lock_old_archive_extraction=yes ;;
-  *)
-    lock_old_archive_extraction=no ;;
-esac
-_LT_DECL([], [old_postinstall_cmds], [2])
-_LT_DECL([], [old_postuninstall_cmds], [2])
-_LT_TAGDECL([], [old_archive_cmds], [2],
-    [Commands used to build an old-style archive])
-_LT_DECL([], [lock_old_archive_extraction], [0],
-    [Whether to use a lock for old archive extraction])
-])# _LT_CMD_OLD_ARCHIVE
-
-
-# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------------------
-# Check whether the given compiler option works
-AC_DEFUN([_LT_COMPILER_OPTION],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$3"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       $2=yes
-     fi
-   fi
-   $RM conftest*
-])
-
-if test x"[$]$2" = xyes; then
-    m4_if([$5], , :, [$5])
-else
-    m4_if([$6], , :, [$6])
-fi
-])# _LT_COMPILER_OPTION
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
-
-
-# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#                  [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------
-# Check whether the given linker option works
-AC_DEFUN([_LT_LINKER_OPTION],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $3"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&AS_MESSAGE_LOG_FD
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         $2=yes
-       fi
-     else
-       $2=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-])
-
-if test x"[$]$2" = xyes; then
-    m4_if([$4], , :, [$4])
-else
-    m4_if([$5], , :, [$5])
-fi
-])# _LT_LINKER_OPTION
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
-
-
-# LT_CMD_MAX_LEN
-#---------------
-AC_DEFUN([LT_CMD_MAX_LEN],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-# find the maximum length of command line arguments
-AC_MSG_CHECKING([the maximum length of command line arguments])
-AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
-  i=0
-  teststring="ABCD"
-
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
-
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
-
-  cygwin* | mingw* | cegcc*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  mint*)
-    # On MiNT this can take a long time and run out of memory.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
-
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
-
-  os2*)
-    # The test takes a long time on OS/2.
-    lt_cv_sys_max_cmd_len=8192
-    ;;
-
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    else
-      # Make teststring a little bigger before we do anything with it.
-      # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
-        teststring=$teststring$teststring
-      done
-      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-      # If test is not a shell built-in, we'll probably end up computing a
-      # maximum length that is only half of the actual maximum length, but
-      # we can't tell.
-      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
-	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
-      do
-        i=`expr $i + 1`
-        teststring=$teststring$teststring
-      done
-      # Only check the string length outside the loop.
-      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
-      teststring=
-      # Add a significant safety factor because C++ compilers can tack on
-      # massive amounts of additional arguments before passing them to the
-      # linker.  It appears as though 1/2 is a usable value.
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    fi
-    ;;
-  esac
-])
-if test -n $lt_cv_sys_max_cmd_len ; then
-  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
-else
-  AC_MSG_RESULT(none)
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-_LT_DECL([], [max_cmd_len], [0],
-    [What is the maximum length of a command?])
-])# LT_CMD_MAX_LEN
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
-
-
-# _LT_HEADER_DLFCN
-# ----------------
-m4_defun([_LT_HEADER_DLFCN],
-[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
-])# _LT_HEADER_DLFCN
-
-
-# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
-#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
-# ----------------------------------------------------------------
-m4_defun([_LT_TRY_DLOPEN_SELF],
-[m4_require([_LT_HEADER_DLFCN])dnl
-if test "$cross_compiling" = yes; then :
-  [$4]
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-[#line $LINENO "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
-   correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-int fnord () __attribute__((visibility("default")));
-#endif
-
-int fnord () { return 42; }
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else
-        {
-	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
-          else puts (dlerror ());
-	}
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}]
-_LT_EOF
-  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) $1 ;;
-      x$lt_dlneed_uscore) $2 ;;
-      x$lt_dlunknown|x*) $3 ;;
-    esac
-  else :
-    # compilation failed
-    $3
-  fi
-fi
-rm -fr conftest*
-])# _LT_TRY_DLOPEN_SELF
-
-
-# LT_SYS_DLOPEN_SELF
-# ------------------
-AC_DEFUN([LT_SYS_DLOPEN_SELF],
-[m4_require([_LT_HEADER_DLFCN])dnl
-if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-    ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-    ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ])
-    ;;
-
-  *)
-    AC_CHECK_FUNC([shl_load],
-	  [lt_cv_dlopen="shl_load"],
-      [AC_CHECK_LIB([dld], [shl_load],
-	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
-	[AC_CHECK_FUNC([dlopen],
-	      [lt_cv_dlopen="dlopen"],
-	  [AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
-	    [AC_CHECK_LIB([svld], [dlopen],
-		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
-	      [AC_CHECK_LIB([dld], [dld_link],
-		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
-	      ])
-	    ])
-	  ])
-	])
-      ])
-    ;;
-  esac
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    AC_CACHE_CHECK([whether a program can dlopen itself],
-	  lt_cv_dlopen_self, [dnl
-	  _LT_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
-	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
-    ])
-
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
-	  lt_cv_dlopen_self_static, [dnl
-	  _LT_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
-	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
-      ])
-    fi
-
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
-
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-_LT_DECL([dlopen_support], [enable_dlopen], [0],
-	 [Whether dlopen is supported])
-_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
-	 [Whether dlopen of programs is supported])
-_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
-	 [Whether dlopen of statically linked programs is supported])
-])# LT_SYS_DLOPEN_SELF
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
-
-
-# _LT_COMPILER_C_O([TAGNAME])
-# ---------------------------
-# Check to see if options -c and -o are simultaneously supported by compiler.
-# This macro does not hard code the compiler like AC_PROG_CC_C_O.
-m4_defun([_LT_COMPILER_C_O],
-[m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
-  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
-  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-     fi
-   fi
-   chmod u+w . 2>&AS_MESSAGE_LOG_FD
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-])
-_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
-	[Does compiler simultaneously support -c and -o options?])
-])# _LT_COMPILER_C_O
-
-
-# _LT_COMPILER_FILE_LOCKS([TAGNAME])
-# ----------------------------------
-# Check to see if we can do hard links to lock some files if needed
-m4_defun([_LT_COMPILER_FILE_LOCKS],
-[m4_require([_LT_ENABLE_LOCK])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-_LT_COMPILER_C_O([$1])
-
-hard_links="nottested"
-if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  AC_MSG_CHECKING([if we can lock with hard links])
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  AC_MSG_RESULT([$hard_links])
-  if test "$hard_links" = no; then
-    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
-])# _LT_COMPILER_FILE_LOCKS
-
-
-# _LT_CHECK_OBJDIR
-# ----------------
-m4_defun([_LT_CHECK_OBJDIR],
-[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
-[rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null])
-objdir=$lt_cv_objdir
-_LT_DECL([], [objdir], [0],
-         [The name of the directory that contains temporary libtool files])dnl
-m4_pattern_allow([LT_OBJDIR])dnl
-AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
-  [Define to the sub-directory in which libtool stores uninstalled libraries.])
-])# _LT_CHECK_OBJDIR
-
-
-# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
-# --------------------------------------
-# Check hardcoding attributes.
-m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
-[AC_MSG_CHECKING([how to hardcode library paths into programs])
-_LT_TAGVAR(hardcode_action, $1)=
-if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
-   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
-   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
-     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
-    # Linking always hardcodes the temporary library directory.
-    _LT_TAGVAR(hardcode_action, $1)=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    _LT_TAGVAR(hardcode_action, $1)=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  _LT_TAGVAR(hardcode_action, $1)=unsupported
-fi
-AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
-
-if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
-   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-_LT_TAGDECL([], [hardcode_action], [0],
-    [How to hardcode a shared library path into an executable])
-])# _LT_LINKER_HARDCODE_LIBPATH
-
-
-# _LT_CMD_STRIPLIB
-# ----------------
-m4_defun([_LT_CMD_STRIPLIB],
-[m4_require([_LT_DECL_EGREP])
-striplib=
-old_striplib=
-AC_MSG_CHECKING([whether stripping libraries is possible])
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  AC_MSG_RESULT([yes])
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-  darwin*)
-    if test -n "$STRIP" ; then
-      striplib="$STRIP -x"
-      old_striplib="$STRIP -S"
-      AC_MSG_RESULT([yes])
-    else
-      AC_MSG_RESULT([no])
-    fi
-    ;;
-  *)
-    AC_MSG_RESULT([no])
-    ;;
-  esac
-fi
-_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
-_LT_DECL([], [striplib], [1])
-])# _LT_CMD_STRIPLIB
-
-
-# _LT_SYS_DYNAMIC_LINKER([TAG])
-# -----------------------------
-# PORTME Fill in your ld.so characteristics
-m4_defun([_LT_SYS_DYNAMIC_LINKER],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_OBJDUMP])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_CHECK_SHELL_FEATURES])dnl
-AC_MSG_CHECKING([dynamic linker characteristics])
-m4_if([$1],
-	[], [
-if test "$GCC" = yes; then
-  case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
-  esac
-  case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
-  esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
-  case $lt_search_path_spec in
-  *\;*)
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
-    ;;
-  *)
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
-    ;;
-  esac
-  # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
-  lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
-  for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
-      test -d "$lt_sys_path" && \
-	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
-    fi
-  done
-  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
-  for (lt_i = NF; lt_i > 0; lt_i--) {
-    if ($lt_i != "" && $lt_i != ".") {
-      if ($lt_i == "..") {
-        lt_count++;
-      } else {
-        if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
-        } else {
-          lt_count--;
-        }
-      }
-    }
-  }
-  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
-  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
-}'`
-  # AWK program above erroneously prepends '/' to C:/dos/paths
-  # for these hosts.
-  case $host_os in
-    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
-  esac
-  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi])
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[[4-9]]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[[01]] | aix4.[[01]].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[[45]]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$cc_basename in
-  yes,*)
-    # gcc
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-m4_if([$1], [],[
-      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    dynamic_linker='Win32 ld.exe'
-    ;;
-
-  *,cl*)
-    # Native MSVC
-    libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
-
-    case $build_os in
-    mingw*)
-      sys_lib_search_path_spec=
-      lt_save_ifs=$IFS
-      IFS=';'
-      for lt_path in $LIB
-      do
-        IFS=$lt_save_ifs
-        # Let DOS variable expansion print the short 8.3 style file name.
-        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
-        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
-      done
-      IFS=$lt_save_ifs
-      # Convert to MSYS style.
-      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
-      ;;
-    cygwin*)
-      # Convert to unix form, then to dos form, then back to unix form
-      # but this time dos style (no spaces!) so that the unix form looks
-      # like /cygdrive/c/PROGRA~1:/cygdr...
-      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
-      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
-      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
-      ;;
-    *)
-      sys_lib_search_path_spec="$LIB"
-      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
-        # It is most probably a Windows format PATH.
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      # FIXME: find the short name or the path components, as spaces are
-      # common. (e.g. "Program Files" -> "PROGRA~1")
-      ;;
-    esac
-
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-    dynamic_linker='Win32 link.exe'
-    ;;
-
-  *)
-    # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    dynamic_linker='Win32 ld.exe'
-    ;;
-  esac
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-m4_if([$1], [],[
-  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[[23]].*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  # Handle Gentoo/FreeBSD as it was Linux
-  case $host_vendor in
-    gentoo)
-      version_type=linux ;;
-    *)
-      version_type=freebsd-$objformat ;;
-  esac
-
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-    linux)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-      soname_spec='${libname}${release}${shared_ext}$major'
-      need_lib_prefix=no
-      need_version=no
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2.*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
-  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-haiku*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
-  postinstall_cmds='chmod 555 $lib'
-  # or fails outright, so override atomically:
-  install_override_mode=555
-  ;;
-
-interix[[3-9]]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux # correct to gnu/linux during the next big refactor
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-
-  # Some binutils ld are patched to set DT_RUNPATH
-  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
-    [lt_cv_shlibpath_overrides_runpath=no
-    save_LDFLAGS=$LDFLAGS
-    save_libdir=$libdir
-    eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
-	 LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
-    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
-      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
-	 [lt_cv_shlibpath_overrides_runpath=yes])])
-    LDFLAGS=$save_LDFLAGS
-    libdir=$save_libdir
-    ])
-  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[[89]] | openbsd2.[[89]].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-AC_MSG_RESULT([$dynamic_linker])
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-_LT_DECL([], [variables_saved_for_relink], [1],
-    [Variables whose values should be saved in libtool wrapper scripts and
-    restored at link time])
-_LT_DECL([], [need_lib_prefix], [0],
-    [Do we need the "lib" prefix for modules?])
-_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
-_LT_DECL([], [version_type], [0], [Library versioning type])
-_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
-_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
-_LT_DECL([], [shlibpath_overrides_runpath], [0],
-    [Is shlibpath searched before the hard-coded library search path?])
-_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
-_LT_DECL([], [library_names_spec], [1],
-    [[List of archive names.  First name is the real one, the rest are links.
-    The last name is the one that the linker finds with -lNAME]])
-_LT_DECL([], [soname_spec], [1],
-    [[The coded name of the library, if different from the real name]])
-_LT_DECL([], [install_override_mode], [1],
-    [Permission mode override for installation of shared libraries])
-_LT_DECL([], [postinstall_cmds], [2],
-    [Command to use after installation of a shared archive])
-_LT_DECL([], [postuninstall_cmds], [2],
-    [Command to use after uninstallation of a shared archive])
-_LT_DECL([], [finish_cmds], [2],
-    [Commands used to finish a libtool library installation in a directory])
-_LT_DECL([], [finish_eval], [1],
-    [[As "finish_cmds", except a single script fragment to be evaled but
-    not shown]])
-_LT_DECL([], [hardcode_into_libs], [0],
-    [Whether we should hardcode library paths into libraries])
-_LT_DECL([], [sys_lib_search_path_spec], [2],
-    [Compile-time system search path for libraries])
-_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
-    [Run-time system search path for libraries])
-])# _LT_SYS_DYNAMIC_LINKER
-
-
-# _LT_PATH_TOOL_PREFIX(TOOL)
-# --------------------------
-# find a file program which can recognize shared library
-AC_DEFUN([_LT_PATH_TOOL_PREFIX],
-[m4_require([_LT_DECL_EGREP])dnl
-AC_MSG_CHECKING([for $1])
-AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
-[case $MAGIC_CMD in
-[[\\/*] |  ?:[\\/]*])
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-dnl $ac_dummy forces splitting on constant user-supplied paths.
-dnl POSIX.2 word splitting is done only on the output of word expansions,
-dnl not every word.  This closes a longstanding sh security hole.
-  ac_dummy="m4_if([$2], , $PATH, [$2])"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$1; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool at gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac])
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  AC_MSG_RESULT($MAGIC_CMD)
-else
-  AC_MSG_RESULT(no)
-fi
-_LT_DECL([], [MAGIC_CMD], [0],
-	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
-])# _LT_PATH_TOOL_PREFIX
-
-# Old name:
-AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
-
-
-# _LT_PATH_MAGIC
-# --------------
-# find a file program which can recognize a shared library
-m4_defun([_LT_PATH_MAGIC],
-[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
-  else
-    MAGIC_CMD=:
-  fi
-fi
-])# _LT_PATH_MAGIC
-
-
-# LT_PATH_LD
-# ----------
-# find the pathname to the GNU or non-GNU linker
-AC_DEFUN([LT_PATH_LD],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
-
-AC_ARG_WITH([gnu-ld],
-    [AS_HELP_STRING([--with-gnu-ld],
-	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
-    [test "$withval" = no || with_gnu_ld=yes],
-    [with_gnu_ld=no])dnl
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  AC_MSG_CHECKING([for ld used by $CC])
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [[\\/]]* | ?:[[\\/]]*)
-      re_direlt='/[[^/]][[^/]]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  AC_MSG_CHECKING([for GNU ld])
-else
-  AC_MSG_CHECKING([for non-GNU ld])
-fi
-AC_CACHE_VAL(lt_cv_path_LD,
-[if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi])
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  AC_MSG_RESULT($LD)
-else
-  AC_MSG_RESULT(no)
-fi
-test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
-_LT_PATH_LD_GNU
-AC_SUBST([LD])
-
-_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
-])# LT_PATH_LD
-
-# Old names:
-AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
-AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_PROG_LD], [])
-dnl AC_DEFUN([AC_PROG_LD], [])
-
-
-# _LT_PATH_LD_GNU
-#- --------------
-m4_defun([_LT_PATH_LD_GNU],
-[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
-[# I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac])
-with_gnu_ld=$lt_cv_prog_gnu_ld
-])# _LT_PATH_LD_GNU
-
-
-# _LT_CMD_RELOAD
-# --------------
-# find reload flag for linker
-#   -- PORTME Some linkers may need a different reload flag.
-m4_defun([_LT_CMD_RELOAD],
-[AC_CACHE_CHECK([for $LD option to reload object files],
-  lt_cv_ld_reload_flag,
-  [lt_cv_ld_reload_flag='-r'])
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    if test "$GCC" != yes; then
-      reload_cmds=false
-    fi
-    ;;
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
-_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
-_LT_TAGDECL([], [reload_cmds], [2])dnl
-])# _LT_CMD_RELOAD
-
-
-# _LT_CHECK_MAGIC_METHOD
-# ----------------------
-# how to check for library dependencies
-#  -- PORTME fill in with the dynamic library characteristics
-m4_defun([_LT_CHECK_MAGIC_METHOD],
-[m4_require([_LT_DECL_EGREP])
-m4_require([_LT_DECL_OBJDUMP])
-AC_CACHE_CHECK([how to recognize dependent libraries],
-lt_cv_deplibs_check_method,
-[lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[[4-9]]*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[[45]]*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump',
-  # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
-    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-    lt_cv_file_magic_cmd='func_win32_libid'
-  else
-    # Keep this pattern in sync with the one in func_win32_libid.
-    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
-    lt_cv_file_magic_cmd='$OBJDUMP -f'
-  fi
-  ;;
-
-cegcc*)
-  # use the weaker test based on 'objdump'. See mingw*.
-  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
-
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-freebsd* | dragonfly*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
-
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-haiku*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
-
-interix[[3-9]]*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
-  fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-*nto* | *qnx*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-rdos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-tpf*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-])
-
-file_magic_glob=
-want_nocaseglob=no
-if test "$build" = "$host"; then
-  case $host_os in
-  mingw* | pw32*)
-    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
-      want_nocaseglob=yes
-    else
-      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
-    fi
-    ;;
-  esac
-fi
-
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-_LT_DECL([], [deplibs_check_method], [1],
-    [Method to check whether dependent libraries are shared objects])
-_LT_DECL([], [file_magic_cmd], [1],
-    [Command to use when deplibs_check_method = "file_magic"])
-_LT_DECL([], [file_magic_glob], [1],
-    [How to find potential files when deplibs_check_method = "file_magic"])
-_LT_DECL([], [want_nocaseglob], [1],
-    [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
-])# _LT_CHECK_MAGIC_METHOD
-
-
-# LT_PATH_NM
-# ----------
-# find the pathname to a BSD- or MS-compatible name lister
-AC_DEFUN([LT_PATH_NM],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
-[if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  : ${lt_cv_path_NM=no}
-fi])
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
-else
-  # Didn't find any BSD compatible name lister, look for dumpbin.
-  if test -n "$DUMPBIN"; then :
-    # Let the user override the test.
-  else
-    AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
-    *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
-      ;;
-    *)
-      DUMPBIN=:
-      ;;
-    esac
-  fi
-  AC_SUBST([DUMPBIN])
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
-  fi
-fi
-test -z "$NM" && NM=nm
-AC_SUBST([NM])
-_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
-
-AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
-  [lt_cv_nm_interface="BSD nm"
-  echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
-  (eval "$ac_compile" 2>conftest.err)
-  cat conftest.err >&AS_MESSAGE_LOG_FD
-  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
-  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
-  cat conftest.err >&AS_MESSAGE_LOG_FD
-  (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
-  cat conftest.out >&AS_MESSAGE_LOG_FD
-  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
-    lt_cv_nm_interface="MS dumpbin"
-  fi
-  rm -f conftest*])
-])# LT_PATH_NM
-
-# Old names:
-AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
-AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_PROG_NM], [])
-dnl AC_DEFUN([AC_PROG_NM], [])
-
-# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
-# --------------------------------
-# how to determine the name of the shared library
-# associated with a specific link library.
-#  -- PORTME fill in with the dynamic library characteristics
-m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
-[m4_require([_LT_DECL_EGREP])
-m4_require([_LT_DECL_OBJDUMP])
-m4_require([_LT_DECL_DLLTOOL])
-AC_CACHE_CHECK([how to associate runtime and link libraries],
-lt_cv_sharedlib_from_linklib_cmd,
-[lt_cv_sharedlib_from_linklib_cmd='unknown'
-
-case $host_os in
-cygwin* | mingw* | pw32* | cegcc*)
-  # two different shell functions defined in ltmain.sh
-  # decide which to use based on capabilities of $DLLTOOL
-  case `$DLLTOOL --help 2>&1` in
-  *--identify-strict*)
-    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
-    ;;
-  *)
-    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
-    ;;
-  esac
-  ;;
-*)
-  # fallback: assume linklib IS sharedlib
-  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
-  ;;
-esac
-])
-sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
-test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
-
-_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
-    [Command to associate shared and link libraries])
-])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
-
-
-# _LT_PATH_MANIFEST_TOOL
-# ----------------------
-# locate the manifest tool
-m4_defun([_LT_PATH_MANIFEST_TOOL],
-[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
-test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
-AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
-  [lt_cv_path_mainfest_tool=no
-  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
-  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
-  cat conftest.err >&AS_MESSAGE_LOG_FD
-  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
-    lt_cv_path_mainfest_tool=yes
-  fi
-  rm -f conftest*])
-if test "x$lt_cv_path_mainfest_tool" != xyes; then
-  MANIFEST_TOOL=:
-fi
-_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
-])# _LT_PATH_MANIFEST_TOOL
-
-
-# LT_LIB_M
-# --------
-# check for math library
-AC_DEFUN([LT_LIB_M],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-LIBM=
-case $host in
-*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
-  # These system don't have libm, or don't need it
-  ;;
-*-ncr-sysv4.3*)
-  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
-  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
-  ;;
-*)
-  AC_CHECK_LIB(m, cos, LIBM="-lm")
-  ;;
-esac
-AC_SUBST([LIBM])
-])# LT_LIB_M
-
-# Old name:
-AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_CHECK_LIBM], [])
-
-
-# _LT_COMPILER_NO_RTTI([TAGNAME])
-# -------------------------------
-m4_defun([_LT_COMPILER_NO_RTTI],
-[m4_require([_LT_TAG_COMPILER])dnl
-
-_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-
-if test "$GCC" = yes; then
-  case $cc_basename in
-  nvcc*)
-    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
-  *)
-    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
-  esac
-
-  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
-    lt_cv_prog_compiler_rtti_exceptions,
-    [-fno-rtti -fno-exceptions], [],
-    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
-fi
-_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
-	[Compiler flag to turn off builtin functions])
-])# _LT_COMPILER_NO_RTTI
-
-
-# _LT_CMD_GLOBAL_SYMBOLS
-# ----------------------
-m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-AC_REQUIRE([LT_PATH_LD])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-AC_MSG_CHECKING([command to parse $NM output from $compiler object])
-AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
-[
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[[BCDEGRST]]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[[BCDT]]'
-  ;;
-cygwin* | mingw* | pw32* | cegcc*)
-  symcode='[[ABCDGISTW]]'
-  ;;
-hpux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[[ABCDEGRST]]'
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[[BCDEGRST]]'
-  ;;
-osf*)
-  symcode='[[BCDEGQRST]]'
-  ;;
-solaris*)
-  symcode='[[BDRT]]'
-  ;;
-sco3.2v5*)
-  symcode='[[DT]]'
-  ;;
-sysv4.2uw2*)
-  symcode='[[DT]]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[[ABDT]]'
-  ;;
-sysv4)
-  symcode='[[DFNSTU]]'
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[[ABCDGIRSTW]]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
-    # Also find C++ and __fastcall symbols from MSVC++,
-    # which start with @ or ?.
-    lt_cv_sys_global_symbol_pipe="$AWK ['"\
-"     {last_section=section; section=\$ 3};"\
-"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
-"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-"     \$ 0!~/External *\|/{next};"\
-"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-"     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-"     ' prfx=^$ac_symprfx]"
-  else
-    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-  fi
-  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
-  if AC_TRY_EVAL(ac_compile); then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
-	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<_LT_EOF > conftest.$ac_ext
-/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
-   relocations are performed -- see ld's documentation on pseudo-relocs.  */
-# define LT@&t at _DLSYM_CONST
-#elif defined(__osf__)
-/* This system does not cope well with relocations in const data.  */
-# define LT@&t at _DLSYM_CONST
-#else
-# define LT@&t at _DLSYM_CONST const
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
-	  cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols.  */
-LT@&t at _DLSYM_CONST struct {
-  const char *name;
-  void       *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[[]] =
-{
-  { "@PROGRAM@", (void *) 0 },
-_LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
-	  cat <<\_LT_EOF >> conftest.$ac_ext
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_globsym_save_LIBS=$LIBS
-	  lt_globsym_save_CFLAGS=$CFLAGS
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
-	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS=$lt_globsym_save_LIBS
-	  CFLAGS=$lt_globsym_save_CFLAGS
-	else
-	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
-    fi
-  else
-    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
-    cat conftest.$ac_ext >&5
-  fi
-  rm -rf conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-])
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  AC_MSG_RESULT(failed)
-else
-  AC_MSG_RESULT(ok)
-fi
-
-# Response file support.
-if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-  nm_file_list_spec='@'
-elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
-  nm_file_list_spec='@'
-fi
-
-_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
-    [Take the output of nm and produce a listing of raw symbols and C names])
-_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
-    [Transform the output of nm in a proper C declaration])
-_LT_DECL([global_symbol_to_c_name_address],
-    [lt_cv_sys_global_symbol_to_c_name_address], [1],
-    [Transform the output of nm in a C name address pair])
-_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
-    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
-    [Transform the output of nm in a C name address pair when lib prefix is needed])
-_LT_DECL([], [nm_file_list_spec], [1],
-    [Specify filename containing input files for $NM])
-]) # _LT_CMD_GLOBAL_SYMBOLS
-
-
-# _LT_COMPILER_PIC([TAGNAME])
-# ---------------------------
-m4_defun([_LT_COMPILER_PIC],
-[m4_require([_LT_TAG_COMPILER])dnl
-_LT_TAGVAR(lt_prog_compiler_wl, $1)=
-_LT_TAGVAR(lt_prog_compiler_pic, $1)=
-_LT_TAGVAR(lt_prog_compiler_static, $1)=
-
-m4_if([$1], [CXX], [
-  # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
-    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-    aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-    mingw* | cygwin* | os2* | pw32* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-    *djgpp*)
-      # DJGPP does not support shared libraries at all
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-      ;;
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)=
-      ;;
-    interix[[3-9]]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-    *qnx* | *nto*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-    *)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-  else
-    case $host_os in
-      aix[[4-9]]*)
-	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
-	  # AIX 5 now supports IA64 processor
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	else
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-	fi
-	;;
-      chorus*)
-	case $cc_basename in
-	cxch68*)
-	  # Green Hills C++ Compiler
-	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
-	  ;;
-	esac
-	;;
-      mingw* | cygwin* | os2* | pw32* | cegcc*)
-	# This hack is so that the source file can tell whether it is being
-	# built for inclusion in a dll (and should export symbols for example).
-	m4_if([$1], [GCJ], [],
-	  [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-	;;
-      dgux*)
-	case $cc_basename in
-	  ec++*)
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  ghcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      freebsd* | dragonfly*)
-	# FreeBSD uses GNU C++
-	;;
-      hpux9* | hpux10* | hpux11*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	    fi
-	    ;;
-	  aCC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    case $host_cpu in
-	    hppa*64*|ia64*)
-	      # +Z the default
-	      ;;
-	    *)
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	      ;;
-	    esac
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      interix*)
-	# This is c89, which is MS Visual C++ (no shared libs)
-	# Anyone wants to do a port?
-	;;
-      irix5* | irix6* | nonstopux*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    # CC pic flag -KPIC is the default.
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-	case $cc_basename in
-	  KCC*)
-	    # KAI C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	    ;;
-	  ecpc* )
-	    # old Intel C++ for x86_64 which still supported -KPIC.
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	    ;;
-	  icpc* )
-	    # Intel C++, used to be incompatible with GCC.
-	    # ICC 10 doesn't accept -KPIC any more.
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	    ;;
-	  pgCC* | pgcpp*)
-	    # Portland Group C++ compiler
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  cxx*)
-	    # Compaq C++
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
-	    # IBM XL 8.0, 9.0 on PPC and BlueGene
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-      lynxos*)
-	;;
-      m88k*)
-	;;
-      mvs*)
-	case $cc_basename in
-	  cxx*)
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      netbsd*)
-	;;
-      *qnx* | *nto*)
-        # QNX uses GNU C++, but need to define -shared option too, otherwise
-        # it will coredump.
-        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-        ;;
-      osf3* | osf4* | osf5*)
-	case $cc_basename in
-	  KCC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    ;;
-	  RCC*)
-	    # Rational C++ 2.4.1
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  cxx*)
-	    # Digital/Compaq C++
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      psos*)
-	;;
-      solaris*)
-	case $cc_basename in
-	  CC* | sunCC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	    ;;
-	  gcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sunos4*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.x
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  lcc*)
-	    # Lucid
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	esac
-	;;
-      tandem*)
-	case $cc_basename in
-	  NCC*)
-	    # NonStop-UX NCC 3.20
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      vxworks*)
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-	;;
-    esac
-  fi
-],
-[
-  if test "$GCC" = yes; then
-    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)=
-      ;;
-
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	# +Z the default
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-
-    interix[[3-9]]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      enable_shared=no
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-
-    *)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-
-    case $cc_basename in
-    nvcc*) # Cuda Compiler Driver 2.2
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
-      if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
-        _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
-      fi
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      else
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC (with -KPIC) is the default.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
-      case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
-      ecc*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-        ;;
-      # icc used to be incompatible with GCC.
-      # ICC 10 doesn't accept -KPIC any more.
-      icc* | ifort*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-        ;;
-      # Lahey Fortran 8.1.
-      lf95*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
-	;;
-      nagfor*)
-	# NAG Fortran compiler
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	;;
-      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-        ;;
-      ccc*)
-        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-        # All Alpha code is PIC.
-        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-        ;;
-      xl* | bgxl* | bgf* | mpixl*)
-	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
-	;;
-      *)
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
-	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
-	  ;;
-	*Sun\ F* | *Sun*Fortran*)
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	  ;;
-	*Sun\ C*)
-	  # Sun C 5.9
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	  ;;
-        *Intel*\ [[CF]]*Compiler*)
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	  ;;
-	*Portland\ Group*)
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  ;;
-	esac
-	;;
-      esac
-      ;;
-
-    newsos6)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-
-    osf3* | osf4* | osf5*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # All OSF/1 code is PIC.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    rdos*)
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    solaris*)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    unicos*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-
-    uts4*)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    *)
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-    esac
-  fi
-])
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-    ;;
-  *)
-    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
-    ;;
-esac
-
-AC_CACHE_CHECK([for $compiler option to produce PIC],
-  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
-  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
-_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
-  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
-    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
-    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
-    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
-     "" | " "*) ;;
-     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
-     esac],
-    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
-     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
-fi
-_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
-	[Additional compiler flags for building library objects])
-
-_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
-	[How to pass a linker flag through the compiler])
-#
-# Check to make sure the static flag actually works.
-#
-wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
-_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
-  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
-  $lt_tmp_static_flag,
-  [],
-  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
-_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
-	[Compiler flag to prevent dynamic linking])
-])# _LT_COMPILER_PIC
-
-
-# _LT_LINKER_SHLIBS([TAGNAME])
-# ----------------------------
-# See if the linker supports building shared libraries.
-m4_defun([_LT_LINKER_SHLIBS],
-[AC_REQUIRE([LT_PATH_LD])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-m4_require([_LT_PATH_MANIFEST_TOOL])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-m4_if([$1], [CXX], [
-  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
-  case $host_os in
-  aix[[4-9]]*)
-    # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    # Also, AIX nm treats weak defined symbols like other global defined
-    # symbols, whereas GNU nm marks them as "W".
-    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    else
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    fi
-    ;;
-  pw32*)
-    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
-    ;;
-  cygwin* | mingw* | cegcc*)
-    case $cc_basename in
-    cl*)
-      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
-      ;;
-    *)
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
-      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
-      ;;
-    esac
-    ;;
-  *)
-    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-    ;;
-  esac
-], [
-  runpath_var=
-  _LT_TAGVAR(allow_undefined_flag, $1)=
-  _LT_TAGVAR(always_export_symbols, $1)=no
-  _LT_TAGVAR(archive_cmds, $1)=
-  _LT_TAGVAR(archive_expsym_cmds, $1)=
-  _LT_TAGVAR(compiler_needs_object, $1)=no
-  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
-  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  _LT_TAGVAR(hardcode_automatic, $1)=no
-  _LT_TAGVAR(hardcode_direct, $1)=no
-  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
-  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-  _LT_TAGVAR(hardcode_libdir_separator, $1)=
-  _LT_TAGVAR(hardcode_minus_L, $1)=no
-  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  _LT_TAGVAR(inherit_rpath, $1)=no
-  _LT_TAGVAR(link_all_deplibs, $1)=unknown
-  _LT_TAGVAR(module_cmds, $1)=
-  _LT_TAGVAR(module_expsym_cmds, $1)=
-  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
-  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
-  _LT_TAGVAR(thread_safe_flag_spec, $1)=
-  _LT_TAGVAR(whole_archive_flag_spec, $1)=
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  _LT_TAGVAR(include_expsyms, $1)=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  # Exclude shared library initialization/finalization symbols.
-dnl Note also adjust exclude_expsyms for C++ above.
-  extract_expsyms_cmds=
-
-  case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  esac
-
-  _LT_TAGVAR(ld_shlibs, $1)=yes
-
-  # On some targets, GNU ld is compatible enough with the native linker
-  # that we're better off using the native interface for both.
-  lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
-    case $host_os in
-      aix*)
-	# The AIX port of GNU ld has always aspired to compatibility
-	# with the native linker.  However, as the warning in the GNU ld
-	# block says, versions before 2.19.5* couldn't really create working
-	# shared libraries, regardless of the interface used.
-	case `$LD -v 2>&1` in
-	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
-	  *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
-	  *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
-	  *)
-	    lt_use_gnu_ld_interface=yes
-	    ;;
-	esac
-	;;
-      *)
-	lt_use_gnu_ld_interface=yes
-	;;
-    esac
-  fi
-
-  if test "$lt_use_gnu_ld_interface" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      _LT_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>&1` in
-      *GNU\ gold*) supports_anon_versioning=yes ;;
-      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[[3-9]]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.19, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to install binutils
-*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
-*** You will then need to restart the configuration process.
-
-_LT_EOF
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            _LT_TAGVAR(archive_expsym_cmds, $1)=''
-        ;;
-      m68k)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes
-        ;;
-      esac
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-      # as there is no search path for DLLs.
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(always_export_symbols, $1)=no
-      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
-      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
-
-      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    haiku*)
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    interix[[3-9]]*)
-      _LT_TAGVAR(hardcode_direct, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
-	case $cc_basename in
-	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
-	esac
-      fi
-      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
-      then
-	tmp_addflag=' $pic_flag'
-	tmp_sharedflag='-shared'
-	case $cc_basename,$host_cpu in
-        pgcc*)				# Portland Group C compiler
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95* | pgfortran*)
-					# Portland Group f77 and f90 compilers
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	lf95*)				# Lahey Fortran 8.1
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
-	  tmp_sharedflag='--shared' ;;
-	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
-	  tmp_sharedflag='-qmkshrobj'
-	  tmp_addflag= ;;
-	nvcc*)	# Cuda Compiler Driver 2.2
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  _LT_TAGVAR(compiler_needs_object, $1)=yes
-	  ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  _LT_TAGVAR(compiler_needs_object, $1)=yes
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	esac
-	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-        if test "x$supports_anon_versioning" = xyes; then
-          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-        fi
-
-	case $cc_basename in
-	xlf* | bgf* | bgxlf* | mpixlf*)
-	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
-	  fi
-	  ;;
-	esac
-      else
-        _LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  # For security reasons, it is highly recommended that you always
-	  # use absolute paths for naming shared libraries, and exclude the
-	  # DT_RUNPATH tag from executables and libraries.  But doing so
-	  # requires that you compile everything twice, which is a pain.
-	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  else
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-    esac
-
-    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
-      runpath_var=
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
-      _LT_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(always_export_symbols, $1)=yes
-      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	_LT_TAGVAR(hardcode_direct, $1)=unsupported
-      fi
-      ;;
-
-    aix[[4-9]]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
-	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	else
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
-	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-	    aix_use_runtimelinking=yes
-	    break
-	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      _LT_TAGVAR(archive_cmds, $1)=''
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[[012]]|aix4.[[012]].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	  # We have reworked collect2
-	  :
-	  else
-	  # We have old collect2
-	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      _LT_TAGVAR(always_export_symbols, $1)=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
-        # Determine the default libpath from the value encoded in an
-        # empty executable.
-        _LT_SYS_MODULE_PATH_AIX([$1])
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-      else
-	if test "$host_cpu" = ia64; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an
-	 # empty executable.
-	 _LT_SYS_MODULE_PATH_AIX([$1])
-	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
-	    # We only use this code for GNU lds that support --whole-archive.
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	  else
-	    # Exported symbols can be pulled into shared objects from archives
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	  fi
-	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            _LT_TAGVAR(archive_expsym_cmds, $1)=''
-        ;;
-      m68k)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes
-        ;;
-      esac
-      ;;
-
-    bsdi[[45]]*)
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      case $cc_basename in
-      cl*)
-	# Native MSVC
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
-	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	_LT_TAGVAR(always_export_symbols, $1)=yes
-	_LT_TAGVAR(file_list_spec, $1)='@'
-	# Tell ltmain to make .lib files, not .a files.
-	libext=lib
-	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
-	# FIXME: Setting linknames here is a bad hack.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	  else
-	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	  fi~
-	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	  linknames='
-	# The linker will not automatically build a static lib if we build a DLL.
-	# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
-	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-	_LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
-	_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
-	# Don't use ranlib
-	_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
-	_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
-	  lt_tool_outputfile="@TOOL_OUTPUT@"~
-	  case $lt_outputfile in
-	    *.exe|*.EXE) ;;
-	    *)
-	      lt_outputfile="$lt_outputfile.exe"
-	      lt_tool_outputfile="$lt_tool_outputfile.exe"
-	      ;;
-	  esac~
-	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	    $RM "$lt_outputfile.manifest";
-	  fi'
-	;;
-      *)
-	# Assume MSVC wrapper
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
-	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	# Tell ltmain to make .lib files, not .a files.
-	libext=lib
-	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
-	# FIXME: Setting linknames here is a bad hack.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
-	# The linker will automatically build a .lib file if we build a DLL.
-	_LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
-	# FIXME: Should let the user specify the lib program.
-	_LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
-	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-	;;
-      esac
-      ;;
-
-    darwin* | rhapsody*)
-      _LT_DARWIN_LINKER_FEATURES($1)
-      ;;
-
-    dgux*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2.*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
-	_LT_TAGVAR(hardcode_direct, $1)=yes
-	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	_LT_TAGVAR(hardcode_minus_L, $1)=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	m4_if($1, [], [
-	  # Older versions of the 11.00 compiler do not understand -b yet
-	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
-	  _LT_LINKER_OPTION([if $CC understands -b],
-	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
-	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
-	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
-	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  _LT_TAGVAR(hardcode_direct, $1)=no
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	  ;;
-	*)
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	# Try to use the -exported_symbol ld option, if it does not
-	# work, assume that -exports_file does not work either and
-	# implicitly export all symbols.
-	# This should be the same for all languages, so no per-tag cache variable.
-	AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
-	  [lt_cv_irix_exported_symbol],
-	  [save_LDFLAGS="$LDFLAGS"
-	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-	   AC_LINK_IFELSE(
-	     [AC_LANG_SOURCE(
-	        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
-			      [C++], [[int foo (void) { return 0; }]],
-			      [Fortran 77], [[
-      subroutine foo
-      end]],
-			      [Fortran], [[
-      subroutine foo
-      end]])])],
-	      [lt_cv_irix_exported_symbol=yes],
-	      [lt_cv_irix_exported_symbol=no])
-           LDFLAGS="$save_LDFLAGS"])
-	if test "$lt_cv_irix_exported_symbol" = yes; then
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-	fi
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(inherit_rpath, $1)=yes
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    newsos6)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *nto* | *qnx*)
-      ;;
-
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	_LT_TAGVAR(hardcode_direct, $1)=yes
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	else
-	  case $host_os in
-	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
-	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	     ;;
-	   *)
-	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-	fi
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    os2*)
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      else
-	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    solaris*)
-      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-      else
-	case `$CC -V 2>&1` in
-	*"Compilers 5.0"*)
-	  wlarc=''
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
-	  ;;
-	*)
-	  wlarc='${wl}'
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-	  ;;
-	esac
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      case $host_os in
-      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
-	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
-	  _LT_TAGVAR(hardcode_direct, $1)=no
-        ;;
-	motorola)
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4.3*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	_LT_TAGVAR(ld_shlibs, $1)=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      _LT_TAGVAR(ld_shlibs, $1)=no
-      ;;
-    esac
-
-    if test x$host_vendor = xsni; then
-      case $host in
-      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
-	;;
-      esac
-    fi
-  fi
-])
-AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
-
-_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
-_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
-_LT_DECL([], [extract_expsyms_cmds], [2],
-    [The commands to extract the exported symbol list from a shared archive])
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
-x|xyes)
-  # Assume -lc should be added
-  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $_LT_TAGVAR(archive_cmds, $1) in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      AC_CACHE_CHECK([whether -lc should be explicitly linked in],
-	[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
-	[$RM conftest*
-	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-	if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
-	  soname=conftest
-	  lib=conftest
-	  libobjs=conftest.$ac_objext
-	  deplibs=
-	  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
-	  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
-	  compiler_flags=-v
-	  linker_flags=-v
-	  verstring=
-	  output_objdir=.
-	  libname=conftest
-	  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
-	  _LT_TAGVAR(allow_undefined_flag, $1)=
-	  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
-	  then
-	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	  else
-	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	  fi
-	  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
-	else
-	  cat conftest.err 1>&5
-	fi
-	$RM conftest*
-	])
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
-    [Whether or not to add -lc for building shared libraries])
-_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
-    [enable_shared_with_static_runtimes], [0],
-    [Whether or not to disallow shared libs when runtime libs are static])
-_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
-    [Compiler flag to allow reflexive dlopens])
-_LT_TAGDECL([], [whole_archive_flag_spec], [1],
-    [Compiler flag to generate shared objects directly from archives])
-_LT_TAGDECL([], [compiler_needs_object], [1],
-    [Whether the compiler copes with passing no objects directly])
-_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
-    [Create an old-style archive from a shared archive])
-_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
-    [Create a temporary old-style archive to link instead of a shared archive])
-_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
-_LT_TAGDECL([], [archive_expsym_cmds], [2])
-_LT_TAGDECL([], [module_cmds], [2],
-    [Commands used to build a loadable module if different from building
-    a shared archive.])
-_LT_TAGDECL([], [module_expsym_cmds], [2])
-_LT_TAGDECL([], [with_gnu_ld], [1],
-    [Whether we are building with GNU ld or not])
-_LT_TAGDECL([], [allow_undefined_flag], [1],
-    [Flag that allows shared libraries with undefined symbols to be built])
-_LT_TAGDECL([], [no_undefined_flag], [1],
-    [Flag that enforces no undefined symbols])
-_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
-    [Flag to hardcode $libdir into a binary during linking.
-    This must work even if $libdir does not exist])
-_LT_TAGDECL([], [hardcode_libdir_separator], [1],
-    [Whether we need a single "-rpath" flag with a separated argument])
-_LT_TAGDECL([], [hardcode_direct], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
-    DIR into the resulting binary])
-_LT_TAGDECL([], [hardcode_direct_absolute], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
-    DIR into the resulting binary and the resulting library dependency is
-    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
-    library is relocated])
-_LT_TAGDECL([], [hardcode_minus_L], [0],
-    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-    into the resulting binary])
-_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
-    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-    into the resulting binary])
-_LT_TAGDECL([], [hardcode_automatic], [0],
-    [Set to "yes" if building a shared library automatically hardcodes DIR
-    into the library and all subsequent libraries and executables linked
-    against it])
-_LT_TAGDECL([], [inherit_rpath], [0],
-    [Set to yes if linker adds runtime paths of dependent libraries
-    to runtime path list])
-_LT_TAGDECL([], [link_all_deplibs], [0],
-    [Whether libtool must link a program against all its dependency libraries])
-_LT_TAGDECL([], [always_export_symbols], [0],
-    [Set to "yes" if exported symbols are required])
-_LT_TAGDECL([], [export_symbols_cmds], [2],
-    [The commands to list exported symbols])
-_LT_TAGDECL([], [exclude_expsyms], [1],
-    [Symbols that should not be listed in the preloaded symbols])
-_LT_TAGDECL([], [include_expsyms], [1],
-    [Symbols that must always be exported])
-_LT_TAGDECL([], [prelink_cmds], [2],
-    [Commands necessary for linking programs (against libraries) with templates])
-_LT_TAGDECL([], [postlink_cmds], [2],
-    [Commands necessary for finishing linking programs])
-_LT_TAGDECL([], [file_list_spec], [1],
-    [Specify filename containing input files])
-dnl FIXME: Not yet implemented
-dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
-dnl    [Compiler flag to generate thread safe objects])
-])# _LT_LINKER_SHLIBS
-
-
-# _LT_LANG_C_CONFIG([TAG])
-# ------------------------
-# Ensure that the configuration variables for a C compiler are suitably
-# defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_C_CONFIG],
-[m4_require([_LT_DECL_EGREP])dnl
-lt_save_CC="$CC"
-AC_LANG_PUSH(C)
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-_LT_TAG_COMPILER
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-  _LT_COMPILER_NO_RTTI($1)
-  _LT_COMPILER_PIC($1)
-  _LT_COMPILER_C_O($1)
-  _LT_COMPILER_FILE_LOCKS($1)
-  _LT_LINKER_SHLIBS($1)
-  _LT_SYS_DYNAMIC_LINKER($1)
-  _LT_LINKER_HARDCODE_LIBPATH($1)
-  LT_SYS_DLOPEN_SELF
-  _LT_CMD_STRIPLIB
-
-  # Report which library types will actually be built
-  AC_MSG_CHECKING([if libtool supports shared libraries])
-  AC_MSG_RESULT([$can_build_shared])
-
-  AC_MSG_CHECKING([whether to build shared libraries])
-  test "$can_build_shared" = "no" && enable_shared=no
-
-  # On AIX, shared libraries and static libraries use the same namespace, and
-  # are all built from PIC.
-  case $host_os in
-  aix3*)
-    test "$enable_shared" = yes && enable_static=no
-    if test -n "$RANLIB"; then
-      archive_cmds="$archive_cmds~\$RANLIB \$lib"
-      postinstall_cmds='$RANLIB $lib'
-    fi
-    ;;
-
-  aix[[4-9]]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
-    fi
-    ;;
-  esac
-  AC_MSG_RESULT([$enable_shared])
-
-  AC_MSG_CHECKING([whether to build static libraries])
-  # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
-  AC_MSG_RESULT([$enable_static])
-
-  _LT_CONFIG($1)
-fi
-AC_LANG_POP
-CC="$lt_save_CC"
-])# _LT_LANG_C_CONFIG
-
-
-# _LT_LANG_CXX_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for a C++ compiler are suitably
-# defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_CXX_CONFIG],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_PATH_MANIFEST_TOOL])dnl
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
-  AC_PROG_CXXCPP
-else
-  _lt_caught_CXX_error=yes
-fi
-
-AC_LANG_PUSH(C++)
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(compiler_needs_object, $1)=no
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for C++ test sources.
-ac_ext=cpp
-
-# Object file extension for compiled C++ test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the CXX compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="int some_variable = 0;"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC=$CC
-  lt_save_CFLAGS=$CFLAGS
-  lt_save_LD=$LD
-  lt_save_GCC=$GCC
-  GCC=$GXX
-  lt_save_with_gnu_ld=$with_gnu_ld
-  lt_save_path_LD=$lt_cv_path_LD
-  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
-    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
-  else
-    $as_unset lt_cv_prog_gnu_ld
-  fi
-  if test -n "${lt_cv_path_LDCXX+set}"; then
-    lt_cv_path_LD=$lt_cv_path_LDCXX
-  else
-    $as_unset lt_cv_path_LD
-  fi
-  test -z "${LDCXX+set}" || LD=$LDCXX
-  CC=${CXX-"c++"}
-  CFLAGS=$CXXFLAGS
-  compiler=$CC
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-
-  if test -n "$compiler"; then
-    # We don't want -fno-exception when compiling C++ code, so set the
-    # no_builtin_flag separately
-    if test "$GXX" = yes; then
-      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
-    else
-      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-    fi
-
-    if test "$GXX" = yes; then
-      # Set up default GNU C++ configuration
-
-      LT_PATH_LD
-
-      # Check if GNU C++ uses GNU ld as the underlying linker, since the
-      # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-        # If archive_cmds runs LD, not CC, wlarc should be empty
-        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
-        #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
-
-        # ancient GNU ld didn't support --whole-archive et. al.
-        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
-	  $GREP 'no-whole-archive' > /dev/null; then
-          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-        else
-          _LT_TAGVAR(whole_archive_flag_spec, $1)=
-        fi
-      else
-        with_gnu_ld=no
-        wlarc=
-
-        # A generic and very simple default shared library creation
-        # command for GNU C++ for the case where it uses the native
-        # linker, instead of GNU ld.  If possible, this setting should
-        # overridden to take advantage of the native linker features on
-        # the platform it is being used on.
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-      fi
-
-      # Commands to make compiler produce verbose output that lists
-      # what "hidden" libraries, object files and flags are used when
-      # linking a shared library.
-      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
-    else
-      GXX=no
-      with_gnu_ld=no
-      wlarc=
-    fi
-
-    # PORTME: fill in a description of your system's C++ link characteristics
-    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-    _LT_TAGVAR(ld_shlibs, $1)=yes
-    case $host_os in
-      aix3*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-      aix[[4-9]]*)
-        if test "$host_cpu" = ia64; then
-          # On IA64, the linker does run time linking by default, so we don't
-          # have to do anything special.
-          aix_use_runtimelinking=no
-          exp_sym_flag='-Bexport'
-          no_entry_flag=""
-        else
-          aix_use_runtimelinking=no
-
-          # Test if we are trying to use run time linking or normal
-          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
-          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
-	    for ld_flag in $LDFLAGS; do
-	      case $ld_flag in
-	      *-brtl*)
-	        aix_use_runtimelinking=yes
-	        break
-	        ;;
-	      esac
-	    done
-	    ;;
-          esac
-
-          exp_sym_flag='-bexport'
-          no_entry_flag='-bnoentry'
-        fi
-
-        # When large executables or shared objects are built, AIX ld can
-        # have problems creating the table of contents.  If linking a library
-        # or program results in "error TOC overflow" add -mminimal-toc to
-        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-        _LT_TAGVAR(archive_cmds, $1)=''
-        _LT_TAGVAR(hardcode_direct, $1)=yes
-        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-        _LT_TAGVAR(link_all_deplibs, $1)=yes
-        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
-
-        if test "$GXX" = yes; then
-          case $host_os in aix4.[[012]]|aix4.[[012]].*)
-          # We only want to do this on AIX 4.2 and lower, the check
-          # below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	    # We have reworked collect2
-	    :
-	  else
-	    # We have old collect2
-	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
-	    # It fails to find uninstalled libraries when the uninstalled
-	    # path is not listed in the libpath.  Setting hardcode_minus_L
-	    # to unsupported forces relinking
-	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
-	  fi
-          esac
-          shared_flag='-shared'
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag="$shared_flag "'${wl}-G'
-	  fi
-        else
-          # not using gcc
-          if test "$host_cpu" = ia64; then
-	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	  # chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-          else
-	    if test "$aix_use_runtimelinking" = yes; then
-	      shared_flag='${wl}-G'
-	    else
-	      shared_flag='${wl}-bM:SRE'
-	    fi
-          fi
-        fi
-
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
-        # It seems that -bexpall does not export symbols beginning with
-        # underscore (_), so it is better to generate a list of symbols to
-	# export.
-        _LT_TAGVAR(always_export_symbols, $1)=yes
-        if test "$aix_use_runtimelinking" = yes; then
-          # Warning - without using the other runtime loading flags (-brtl),
-          # -berok will link without error, but may produce a broken library.
-          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
-          # Determine the default libpath from the value encoded in an empty
-          # executable.
-          _LT_SYS_MODULE_PATH_AIX([$1])
-          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-        else
-          if test "$host_cpu" = ia64; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-          else
-	    # Determine the default libpath from the value encoded in an
-	    # empty executable.
-	    _LT_SYS_MODULE_PATH_AIX([$1])
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	    # Warning - without using the other run time loading flags,
-	    # -berok will link without error, but may produce a broken library.
-	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	    if test "$with_gnu_ld" = yes; then
-	      # We only use this code for GNU lds that support --whole-archive.
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    else
-	      # Exported symbols can be pulled into shared objects from archives
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	    fi
-	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	    # This is similar to how AIX traditionally builds its shared
-	    # libraries.
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-          fi
-        fi
-        ;;
-
-      beos*)
-	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-	  # support --undefined.  This deserves some investigation.  FIXME
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	else
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-
-      chorus*)
-        case $cc_basename in
-          *)
-	  # FIXME: insert proper C++ library support
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	  ;;
-        esac
-        ;;
-
-      cygwin* | mingw* | pw32* | cegcc*)
-	case $GXX,$cc_basename in
-	,cl* | no,cl*)
-	  # Native MSVC
-	  # hardcode_libdir_flag_spec is actually meaningless, as there is
-	  # no search path for DLLs.
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
-	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	  _LT_TAGVAR(always_export_symbols, $1)=yes
-	  _LT_TAGVAR(file_list_spec, $1)='@'
-	  # Tell ltmain to make .lib files, not .a files.
-	  libext=lib
-	  # Tell ltmain to make .dll files, not .so files.
-	  shrext_cmds=".dll"
-	  # FIXME: Setting linknames here is a bad hack.
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	    else
-	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	    fi~
-	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	    linknames='
-	  # The linker will not automatically build a static lib if we build a DLL.
-	  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
-	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-	  # Don't use ranlib
-	  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
-	  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
-	    lt_tool_outputfile="@TOOL_OUTPUT@"~
-	    case $lt_outputfile in
-	      *.exe|*.EXE) ;;
-	      *)
-		lt_outputfile="$lt_outputfile.exe"
-		lt_tool_outputfile="$lt_tool_outputfile.exe"
-		;;
-	    esac~
-	    func_to_tool_file "$lt_outputfile"~
-	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	      $RM "$lt_outputfile.manifest";
-	    fi'
-	  ;;
-	*)
-	  # g++
-	  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-	  # as there is no search path for DLLs.
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
-	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	  _LT_TAGVAR(always_export_symbols, $1)=no
-	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-
-	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	    # If the export-symbols file already is a .def file (1st line
-	    # is EXPORTS), use it as is; otherwise, prepend...
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      cp $export_symbols $output_objdir/$soname.def;
-	    else
-	      echo EXPORTS > $output_objdir/$soname.def;
-	      cat $export_symbols >> $output_objdir/$soname.def;
-	    fi~
-	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	  else
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	  fi
-	  ;;
-	esac
-	;;
-      darwin* | rhapsody*)
-        _LT_DARWIN_LINKER_FEATURES($1)
-	;;
-
-      dgux*)
-        case $cc_basename in
-          ec++*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          ghcx*)
-	    # Green Hills C++ Compiler
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      freebsd2.*)
-        # C++ shared libraries reported to be fairly broken before
-	# switch to ELF
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      freebsd-elf*)
-        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-        ;;
-
-      freebsd* | dragonfly*)
-        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
-        # conventions
-        _LT_TAGVAR(ld_shlibs, $1)=yes
-        ;;
-
-      gnu*)
-        ;;
-
-      haiku*)
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        _LT_TAGVAR(link_all_deplibs, $1)=yes
-        ;;
-
-      hpux9*)
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-        _LT_TAGVAR(hardcode_direct, $1)=yes
-        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-				             # but as the default
-				             # location of the library.
-
-        case $cc_basename in
-          CC*)
-            # FIXME: insert proper C++ library support
-            _LT_TAGVAR(ld_shlibs, $1)=no
-            ;;
-          aCC*)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            # Commands to make compiler produce verbose output that lists
-            # what "hidden" libraries, object files and flags are used when
-            # linking a shared library.
-            #
-            # There doesn't appear to be a way to prevent this compiler from
-            # explicitly linking system object files so we need to strip them
-            # from the output so that they don't get included in the library
-            # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-            ;;
-          *)
-            if test "$GXX" = yes; then
-              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            else
-              # FIXME: insert proper C++ library support
-              _LT_TAGVAR(ld_shlibs, $1)=no
-            fi
-            ;;
-        esac
-        ;;
-
-      hpux10*|hpux11*)
-        if test $with_gnu_ld = no; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-          case $host_cpu in
-            hppa*64*|ia64*)
-              ;;
-            *)
-	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-              ;;
-          esac
-        fi
-        case $host_cpu in
-          hppa*64*|ia64*)
-            _LT_TAGVAR(hardcode_direct, $1)=no
-            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-            ;;
-          *)
-            _LT_TAGVAR(hardcode_direct, $1)=yes
-            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-					         # but as the default
-					         # location of the library.
-            ;;
-        esac
-
-        case $cc_basename in
-          CC*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          aCC*)
-	    case $host_cpu in
-	      hppa*64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      ia64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      *)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	    esac
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test $with_gnu_ld = no; then
-	        case $host_cpu in
-	          hppa*64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          ia64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          *)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	        esac
-	      fi
-	    else
-	      # FIXME: insert proper C++ library support
-	      _LT_TAGVAR(ld_shlibs, $1)=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      interix[[3-9]]*)
-	_LT_TAGVAR(hardcode_direct, $1)=no
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-	# Instead, shared libraries are loaded at an image base (0x10000000 by
-	# default) and relocated if they conflict, which is a slow very memory
-	# consuming and fragmenting process.  To avoid this, we pick a random,
-	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	;;
-      irix5* | irix6*)
-        case $cc_basename in
-          CC*)
-	    # SGI C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test "$with_gnu_ld" = no; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	      else
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
-	      fi
-	    fi
-	    _LT_TAGVAR(link_all_deplibs, $1)=yes
-	    ;;
-        esac
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(inherit_rpath, $1)=yes
-        ;;
-
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
-	    ;;
-	  icpc* | ecpc* )
-	    # Intel C++
-	    with_gnu_ld=yes
-	    # version 8.0 and above of icpc choke on multiply defined symbols
-	    # if we add $predep_objects and $postdep_objects, however 7.1 and
-	    # earlier do not add the objects themselves.
-	    case `$CC -V 2>&1` in
-	      *"Version 7."*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	      *)  # Version 8.0 or newer
-	        tmp_idyn=
-	        case $host_cpu in
-		  ia64*) tmp_idyn=' -i_dynamic';;
-		esac
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	    esac
-	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    ;;
-          pgCC* | pgcpp*)
-            # Portland Group C++ compiler
-	    case `$CC -V` in
-	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
-	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
-	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
-		$RANLIB $oldlib'
-	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    *) # Version 6 and above use weak symbols
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    esac
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-            ;;
-	  cxx*)
-	    # Compaq C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
-
-	    runpath_var=LD_RUN_PATH
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
-	    ;;
-	  xl* | mpixl* | bgxl*)
-	    # IBM XL 8.0 on PPC, with GNU ld
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    if test "x$supports_anon_versioning" = xyes; then
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-		echo "local: *; };" >> $output_objdir/$libname.ver~
-		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-	    fi
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	      _LT_TAGVAR(compiler_needs_object, $1)=yes
-
-	      # Not sure whether something based on
-	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
-	      # would be better.
-	      output_verbose_link_cmd='func_echo_all'
-
-	      # Archives containing C++ object files must be created using
-	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	      # necessary to make sure instantiated templates are included
-	      # in the archive.
-	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-
-      lynxos*)
-        # FIXME: insert proper C++ library support
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      m88k*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      mvs*)
-        case $cc_basename in
-          cxx*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-	  *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-	esac
-	;;
-
-      netbsd*)
-        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
-	  wlarc=
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	fi
-	# Workaround some broken pre-1.5 toolchains
-	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
-	;;
-
-      *nto* | *qnx*)
-        _LT_TAGVAR(ld_shlibs, $1)=yes
-	;;
-
-      openbsd2*)
-        # C++ shared libraries are fairly broken
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      openbsd*)
-	if test -f /usr/libexec/ld.so; then
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-	  fi
-	  output_verbose_link_cmd=func_echo_all
-	else
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-
-      osf3* | osf4* | osf5*)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Archives containing C++ object files must be created using
-	    # the KAI C++ compiler.
-	    case $host in
-	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
-	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
-	    esac
-	    ;;
-          RCC*)
-	    # Rational C++ 2.4.1
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          cxx*)
-	    case $host in
-	      osf3*)
-	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-		;;
-	      *)
-	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	          echo "-hidden">> $lib.exp~
-	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
-	          $RM $lib.exp'
-	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-		;;
-	    esac
-
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-	    ;;
-	  *)
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	      case $host in
-	        osf3*)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	        *)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	      esac
-
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	      # Commands to make compiler produce verbose output that lists
-	      # what "hidden" libraries, object files and flags are used when
-	      # linking a shared library.
-	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
-	    else
-	      # FIXME: insert proper C++ library support
-	      _LT_TAGVAR(ld_shlibs, $1)=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      psos*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      sunos4*)
-        case $cc_basename in
-          CC*)
-	    # Sun C++ 4.x
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          lcc*)
-	    # Lucid
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      solaris*)
-        case $cc_basename in
-          CC* | sunCC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
-	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	    case $host_os in
-	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-	      *)
-		# The compiler driver will combine and reorder linker options,
-		# but understands `-z linker_flag'.
-	        # Supported since Solaris 2.6 (maybe 2.5.1?)
-		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
-	        ;;
-	    esac
-	    _LT_TAGVAR(link_all_deplibs, $1)=yes
-
-	    output_verbose_link_cmd='func_echo_all'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
-	    ;;
-          gcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-
-	    # The C++ compiler must be used to create the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    # GNU C++ compiler with Solaris linker
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
-	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-	      else
-	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
-	        # platform.
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-	      fi
-
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
-	      case $host_os in
-		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-		*)
-		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-		  ;;
-	      esac
-	    fi
-	    ;;
-        esac
-        ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      runpath_var='LD_RUN_PATH'
-
-      case $cc_basename in
-        CC*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-      esac
-      ;;
-
-      sysv5* | sco3.2v5* | sco5v6*)
-	# Note: We can NOT use -z defs as we might desire, because we do not
-	# link with -lc, and that would cause any symbols used from libc to
-	# always be unresolved, which means just about no library would
-	# ever link correctly.  If we're not using GNU ld we use -z text
-	# though, which does catch some bad symbols but isn't as heavy-handed
-	# as -z defs.
-	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-	_LT_TAGVAR(link_all_deplibs, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-	runpath_var='LD_RUN_PATH'
-
-	case $cc_basename in
-          CC*)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
-	      '"$_LT_TAGVAR(old_archive_cmds, $1)"
-	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
-	      '"$_LT_TAGVAR(reload_cmds, $1)"
-	    ;;
-	  *)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    ;;
-	esac
-      ;;
-
-      tandem*)
-        case $cc_basename in
-          NCC*)
-	    # NonStop-UX NCC 3.20
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      vxworks*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      *)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-    esac
-
-    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-    _LT_TAGVAR(GCC, $1)="$GXX"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_SYS_HIDDEN_LIBDEPS($1)
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  CC=$lt_save_CC
-  CFLAGS=$lt_save_CFLAGS
-  LDCXX=$LD
-  LD=$lt_save_LD
-  GCC=$lt_save_GCC
-  with_gnu_ld=$lt_save_with_gnu_ld
-  lt_cv_path_LDCXX=$lt_cv_path_LD
-  lt_cv_path_LD=$lt_save_path_LD
-  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
-  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
-
-AC_LANG_POP
-])# _LT_LANG_CXX_CONFIG
-
-
-# _LT_FUNC_STRIPNAME_CNF
-# ----------------------
-# func_stripname_cnf prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-#
-# This function is identical to the (non-XSI) version of func_stripname,
-# except this one can be used by m4 code that may be executed by configure,
-# rather than the libtool script.
-m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
-AC_REQUIRE([_LT_DECL_SED])
-AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
-func_stripname_cnf ()
-{
-  case ${2} in
-  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
-  esac
-} # func_stripname_cnf
-])# _LT_FUNC_STRIPNAME_CNF
-
-# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
-# ---------------------------------
-# Figure out "hidden" library dependencies from verbose
-# compiler output when linking a shared library.
-# Parse the compiler output and extract the necessary
-# objects, libraries and library flags.
-m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
-# Dependencies to place before and after the object being linked:
-_LT_TAGVAR(predep_objects, $1)=
-_LT_TAGVAR(postdep_objects, $1)=
-_LT_TAGVAR(predeps, $1)=
-_LT_TAGVAR(postdeps, $1)=
-_LT_TAGVAR(compiler_lib_search_path, $1)=
-
-dnl we can't use the lt_simple_compile_test_code here,
-dnl because it contains code intended for an executable,
-dnl not a library.  It's possible we should let each
-dnl tag define a new lt_????_link_test_code variable,
-dnl but it's only used here...
-m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
-int a;
-void foo (void) { a = 0; }
-_LT_EOF
-], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
-class Foo
-{
-public:
-  Foo (void) { a = 0; }
-private:
-  int a;
-};
-_LT_EOF
-], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
-      subroutine foo
-      implicit none
-      integer*4 a
-      a=0
-      return
-      end
-_LT_EOF
-], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
-      subroutine foo
-      implicit none
-      integer a
-      a=0
-      return
-      end
-_LT_EOF
-], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
-public class foo {
-  private int a;
-  public void bar (void) {
-    a = 0;
-  }
-};
-_LT_EOF
-], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
-package foo
-func foo() {
-}
-_LT_EOF
-])
-
-_lt_libdeps_save_CFLAGS=$CFLAGS
-case "$CC $CFLAGS " in #(
-*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
-*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
-*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
-esac
-
-dnl Parse the compiler output and extract the necessary
-dnl objects, libraries and library flags.
-if AC_TRY_EVAL(ac_compile); then
-  # Parse the compiler output and extract the necessary
-  # objects, libraries and library flags.
-
-  # Sentinel used to keep track of whether or not we are before
-  # the conftest object file.
-  pre_test_object_deps_done=no
-
-  for p in `eval "$output_verbose_link_cmd"`; do
-    case ${prev}${p} in
-
-    -L* | -R* | -l*)
-       # Some compilers place space between "-{L,R}" and the path.
-       # Remove the space.
-       if test $p = "-L" ||
-          test $p = "-R"; then
-	 prev=$p
-	 continue
-       fi
-
-       # Expand the sysroot to ease extracting the directories later.
-       if test -z "$prev"; then
-         case $p in
-         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
-         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
-         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
-         esac
-       fi
-       case $p in
-       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
-       esac
-       if test "$pre_test_object_deps_done" = no; then
-	 case ${prev} in
-	 -L | -R)
-	   # Internal compiler library paths should come after those
-	   # provided the user.  The postdeps already come after the
-	   # user supplied libs so there is no need to process them.
-	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
-	   else
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
-	   fi
-	   ;;
-	 # The "-l" case would never come before the object being
-	 # linked, so don't bother handling this case.
-	 esac
-       else
-	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
-	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
-	 else
-	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
-	 fi
-       fi
-       prev=
-       ;;
-
-    *.lto.$objext) ;; # Ignore GCC LTO objects
-    *.$objext)
-       # This assumes that the test object file only shows up
-       # once in the compiler output.
-       if test "$p" = "conftest.$objext"; then
-	 pre_test_object_deps_done=yes
-	 continue
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
-	   _LT_TAGVAR(predep_objects, $1)="$p"
-	 else
-	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
-	 fi
-       else
-	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
-	   _LT_TAGVAR(postdep_objects, $1)="$p"
-	 else
-	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
-	 fi
-       fi
-       ;;
-
-    *) ;; # Ignore the rest.
-
-    esac
-  done
-
-  # Clean up.
-  rm -f a.out a.exe
-else
-  echo "libtool.m4: error: problem compiling $1 test program"
-fi
-
-$RM -f confest.$objext
-CFLAGS=$_lt_libdeps_save_CFLAGS
-
-# PORTME: override above test on systems where it is broken
-m4_if([$1], [CXX],
-[case $host_os in
-interix[[3-9]]*)
-  # Interix 3.5 installs completely hosed .la files for C++, so rather than
-  # hack all around it, let's just trust "g++" to DTRT.
-  _LT_TAGVAR(predep_objects,$1)=
-  _LT_TAGVAR(postdep_objects,$1)=
-  _LT_TAGVAR(postdeps,$1)=
-  ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC* | sunCC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-esac
-])
-
-case " $_LT_TAGVAR(postdeps, $1) " in
-*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
-esac
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=
-if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
-fi
-_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
-    [The directories searched by this compiler when creating a shared library])
-_LT_TAGDECL([], [predep_objects], [1],
-    [Dependencies to place before and after the objects being linked to
-    create a shared library])
-_LT_TAGDECL([], [postdep_objects], [1])
-_LT_TAGDECL([], [predeps], [1])
-_LT_TAGDECL([], [postdeps], [1])
-_LT_TAGDECL([], [compiler_lib_search_path], [1],
-    [The library search path used internally by the compiler when linking
-    a shared library])
-])# _LT_SYS_HIDDEN_LIBDEPS
-
-
-# _LT_LANG_F77_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for a Fortran 77 compiler are
-# suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_F77_CONFIG],
-[AC_LANG_PUSH(Fortran 77)
-if test -z "$F77" || test "X$F77" = "Xno"; then
-  _lt_disable_F77=yes
-fi
-
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for f77 test sources.
-ac_ext=f
-
-# Object file extension for compiled f77 test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the F77 compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_F77" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="\
-      subroutine t
-      return
-      end
-"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code="\
-      program t
-      end
-"
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
-  lt_save_GCC=$GCC
-  lt_save_CFLAGS=$CFLAGS
-  CC=${F77-"f77"}
-  CFLAGS=$FFLAGS
-  compiler=$CC
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-  GCC=$G77
-  if test -n "$compiler"; then
-    AC_MSG_CHECKING([if libtool supports shared libraries])
-    AC_MSG_RESULT([$can_build_shared])
-
-    AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
-
-    # On AIX, shared libraries and static libraries use the same namespace, and
-    # are all built from PIC.
-    case $host_os in
-      aix3*)
-        test "$enable_shared" = yes && enable_static=no
-        if test -n "$RANLIB"; then
-          archive_cmds="$archive_cmds~\$RANLIB \$lib"
-          postinstall_cmds='$RANLIB $lib'
-        fi
-        ;;
-      aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
-	fi
-        ;;
-    esac
-    AC_MSG_RESULT([$enable_shared])
-
-    AC_MSG_CHECKING([whether to build static libraries])
-    # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
-    AC_MSG_RESULT([$enable_static])
-
-    _LT_TAGVAR(GCC, $1)="$G77"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  GCC=$lt_save_GCC
-  CC="$lt_save_CC"
-  CFLAGS="$lt_save_CFLAGS"
-fi # test "$_lt_disable_F77" != yes
-
-AC_LANG_POP
-])# _LT_LANG_F77_CONFIG
-
-
-# _LT_LANG_FC_CONFIG([TAG])
-# -------------------------
-# Ensure that the configuration variables for a Fortran compiler are
-# suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_FC_CONFIG],
-[AC_LANG_PUSH(Fortran)
-
-if test -z "$FC" || test "X$FC" = "Xno"; then
-  _lt_disable_FC=yes
-fi
-
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for fc test sources.
-ac_ext=${ac_fc_srcext-f}
-
-# Object file extension for compiled fc test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the FC compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_FC" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="\
-      subroutine t
-      return
-      end
-"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code="\
-      program t
-      end
-"
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
-  lt_save_GCC=$GCC
-  lt_save_CFLAGS=$CFLAGS
-  CC=${FC-"f95"}
-  CFLAGS=$FCFLAGS
-  compiler=$CC
-  GCC=$ac_cv_fc_compiler_gnu
-
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-
-  if test -n "$compiler"; then
-    AC_MSG_CHECKING([if libtool supports shared libraries])
-    AC_MSG_RESULT([$can_build_shared])
-
-    AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
-
-    # On AIX, shared libraries and static libraries use the same namespace, and
-    # are all built from PIC.
-    case $host_os in
-      aix3*)
-        test "$enable_shared" = yes && enable_static=no
-        if test -n "$RANLIB"; then
-          archive_cmds="$archive_cmds~\$RANLIB \$lib"
-          postinstall_cmds='$RANLIB $lib'
-        fi
-        ;;
-      aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
-	fi
-        ;;
-    esac
-    AC_MSG_RESULT([$enable_shared])
-
-    AC_MSG_CHECKING([whether to build static libraries])
-    # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
-    AC_MSG_RESULT([$enable_static])
-
-    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_SYS_HIDDEN_LIBDEPS($1)
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  GCC=$lt_save_GCC
-  CC=$lt_save_CC
-  CFLAGS=$lt_save_CFLAGS
-fi # test "$_lt_disable_FC" != yes
-
-AC_LANG_POP
-])# _LT_LANG_FC_CONFIG
-
-
-# _LT_LANG_GCJ_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for the GNU Java Compiler compiler
-# are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_GCJ_CONFIG],
-[AC_REQUIRE([LT_PROG_GCJ])dnl
-AC_LANG_SAVE
-
-# Source file extension for Java test sources.
-ac_ext=java
-
-# Object file extension for compiled Java test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="class foo {}"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC=$CC
-lt_save_CFLAGS=$CFLAGS
-lt_save_GCC=$GCC
-GCC=yes
-CC=${GCJ-"gcj"}
-CFLAGS=$GCJFLAGS
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
-_LT_CC_BASENAME([$compiler])
-
-# GCJ did not exist at the time GCC didn't implicitly link libc in.
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-  _LT_COMPILER_NO_RTTI($1)
-  _LT_COMPILER_PIC($1)
-  _LT_COMPILER_C_O($1)
-  _LT_COMPILER_FILE_LOCKS($1)
-  _LT_LINKER_SHLIBS($1)
-  _LT_LINKER_HARDCODE_LIBPATH($1)
-
-  _LT_CONFIG($1)
-fi
-
-AC_LANG_RESTORE
-
-GCC=$lt_save_GCC
-CC=$lt_save_CC
-CFLAGS=$lt_save_CFLAGS
-])# _LT_LANG_GCJ_CONFIG
-
-
-# _LT_LANG_GO_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for the GNU Go compiler
-# are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_GO_CONFIG],
-[AC_REQUIRE([LT_PROG_GO])dnl
-AC_LANG_SAVE
-
-# Source file extension for Go test sources.
-ac_ext=go
-
-# Object file extension for compiled Go test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="package main; func main() { }"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='package main; func main() { }'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC=$CC
-lt_save_CFLAGS=$CFLAGS
-lt_save_GCC=$GCC
-GCC=yes
-CC=${GOC-"gccgo"}
-CFLAGS=$GOFLAGS
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
-_LT_CC_BASENAME([$compiler])
-
-# Go did not exist at the time GCC didn't implicitly link libc in.
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-  _LT_COMPILER_NO_RTTI($1)
-  _LT_COMPILER_PIC($1)
-  _LT_COMPILER_C_O($1)
-  _LT_COMPILER_FILE_LOCKS($1)
-  _LT_LINKER_SHLIBS($1)
-  _LT_LINKER_HARDCODE_LIBPATH($1)
-
-  _LT_CONFIG($1)
-fi
-
-AC_LANG_RESTORE
-
-GCC=$lt_save_GCC
-CC=$lt_save_CC
-CFLAGS=$lt_save_CFLAGS
-])# _LT_LANG_GO_CONFIG
-
-
-# _LT_LANG_RC_CONFIG([TAG])
-# -------------------------
-# Ensure that the configuration variables for the Windows resource compiler
-# are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_RC_CONFIG],
-[AC_REQUIRE([LT_PROG_RC])dnl
-AC_LANG_SAVE
-
-# Source file extension for RC test sources.
-ac_ext=rc
-
-# Object file extension for compiled RC test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
-
-# Code to be used in simple link tests
-lt_simple_link_test_code="$lt_simple_compile_test_code"
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-lt_save_CFLAGS=$CFLAGS
-lt_save_GCC=$GCC
-GCC=
-CC=${RC-"windres"}
-CFLAGS=
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-
-if test -n "$compiler"; then
-  :
-  _LT_CONFIG($1)
-fi
-
-GCC=$lt_save_GCC
-AC_LANG_RESTORE
-CC=$lt_save_CC
-CFLAGS=$lt_save_CFLAGS
-])# _LT_LANG_RC_CONFIG
-
-
-# LT_PROG_GCJ
-# -----------
-AC_DEFUN([LT_PROG_GCJ],
-[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
-  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
-    [AC_CHECK_TOOL(GCJ, gcj,)
-      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
-      AC_SUBST(GCJFLAGS)])])[]dnl
-])
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
-
-
-# LT_PROG_GO
-# ----------
-AC_DEFUN([LT_PROG_GO],
-[AC_CHECK_TOOL(GOC, gccgo,)
-])
-
-
-# LT_PROG_RC
-# ----------
-AC_DEFUN([LT_PROG_RC],
-[AC_CHECK_TOOL(RC, windres,)
-])
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_RC], [])
-
-
-# _LT_DECL_EGREP
-# --------------
-# If we don't have a new enough Autoconf to choose the best grep
-# available, choose the one first in the user's PATH.
-m4_defun([_LT_DECL_EGREP],
-[AC_REQUIRE([AC_PROG_EGREP])dnl
-AC_REQUIRE([AC_PROG_FGREP])dnl
-test -z "$GREP" && GREP=grep
-_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
-_LT_DECL([], [EGREP], [1], [An ERE matcher])
-_LT_DECL([], [FGREP], [1], [A literal string matcher])
-dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
-AC_SUBST([GREP])
-])
-
-
-# _LT_DECL_OBJDUMP
-# --------------
-# If we don't have a new enough Autoconf to choose the best objdump
-# available, choose the one first in the user's PATH.
-m4_defun([_LT_DECL_OBJDUMP],
-[AC_CHECK_TOOL(OBJDUMP, objdump, false)
-test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
-AC_SUBST([OBJDUMP])
-])
-
-# _LT_DECL_DLLTOOL
-# ----------------
-# Ensure DLLTOOL variable is set.
-m4_defun([_LT_DECL_DLLTOOL],
-[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
-AC_SUBST([DLLTOOL])
-])
-
-# _LT_DECL_SED
-# ------------
-# Check for a fully-functional sed program, that truncates
-# as few characters as possible.  Prefer GNU sed if found.
-m4_defun([_LT_DECL_SED],
-[AC_PROG_SED
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
-_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
-    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
-])# _LT_DECL_SED
-
-m4_ifndef([AC_PROG_SED], [
-############################################################
-# NOTE: This macro has been submitted for inclusion into   #
-#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
-#  a released version of Autoconf we should remove this    #
-#  macro and use it instead.                               #
-############################################################
-
-m4_defun([AC_PROG_SED],
-[AC_MSG_CHECKING([for a sed that does not truncate output])
-AC_CACHE_VAL(lt_cv_path_SED,
-[# Loop through the user's path and test for sed and gsed.
-# Then use that list of sed's as ones to test for truncation.
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for lt_ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
-        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
-      fi
-    done
-  done
-done
-IFS=$as_save_IFS
-lt_ac_max=0
-lt_ac_count=0
-# Add /usr/xpg4/bin/sed as it is typically found on Solaris
-# along with /bin/sed that truncates output.
-for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
-  test ! -f $lt_ac_sed && continue
-  cat /dev/null > conftest.in
-  lt_ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
-  # Check for GNU sed and select it if it is found.
-  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
-    lt_cv_path_SED=$lt_ac_sed
-    break
-  fi
-  while true; do
-    cat conftest.in conftest.in >conftest.tmp
-    mv conftest.tmp conftest.in
-    cp conftest.in conftest.nl
-    echo >>conftest.nl
-    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
-    cmp -s conftest.out conftest.nl || break
-    # 10000 chars as input seems more than enough
-    test $lt_ac_count -gt 10 && break
-    lt_ac_count=`expr $lt_ac_count + 1`
-    if test $lt_ac_count -gt $lt_ac_max; then
-      lt_ac_max=$lt_ac_count
-      lt_cv_path_SED=$lt_ac_sed
-    fi
-  done
-done
-])
-SED=$lt_cv_path_SED
-AC_SUBST([SED])
-AC_MSG_RESULT([$SED])
-])#AC_PROG_SED
-])#m4_ifndef
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_SED], [])
-
-
-# _LT_CHECK_SHELL_FEATURES
-# ------------------------
-# Find out whether the shell is Bourne or XSI compatible,
-# or has some other useful features.
-m4_defun([_LT_CHECK_SHELL_FEATURES],
-[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,b/c, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-AC_MSG_RESULT([$xsi_shell])
-_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
-
-AC_MSG_CHECKING([whether the shell understands "+="])
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-AC_MSG_RESULT([$lt_shell_append])
-_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  lt_unset=unset
-else
-  lt_unset=false
-fi
-_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  lt_SP2NL='tr \040 \012'
-  lt_NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  lt_SP2NL='tr \100 \n'
-  lt_NL2SP='tr \r\n \100\100'
-  ;;
-esac
-_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
-_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
-])# _LT_CHECK_SHELL_FEATURES
-
-
-# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
-# ------------------------------------------------------
-# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
-# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
-m4_defun([_LT_PROG_FUNCTION_REPLACE],
-[dnl {
-sed -e '/^$1 ()$/,/^} # $1 /c\
-$1 ()\
-{\
-m4_bpatsubsts([$2], [$], [\\], [^\([	 ]\)], [\\\1])
-} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-])
-
-
-# _LT_PROG_REPLACE_SHELLFNS
-# -------------------------
-# Replace existing portable implementations of several shell functions with
-# equivalent extended shell implementations where those features are available..
-m4_defun([_LT_PROG_REPLACE_SHELLFNS],
-[if test x"$xsi_shell" = xyes; then
-  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
-    case ${1} in
-      */*) func_dirname_result="${1%/*}${2}" ;;
-      *  ) func_dirname_result="${3}" ;;
-    esac])
-
-  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
-    func_basename_result="${1##*/}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
-    case ${1} in
-      */*) func_dirname_result="${1%/*}${2}" ;;
-      *  ) func_dirname_result="${3}" ;;
-    esac
-    func_basename_result="${1##*/}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
-    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-    # positional parameters, so assign one to ordinary parameter first.
-    func_stripname_result=${3}
-    func_stripname_result=${func_stripname_result#"${1}"}
-    func_stripname_result=${func_stripname_result%"${2}"}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
-    func_split_long_opt_name=${1%%=*}
-    func_split_long_opt_arg=${1#*=}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
-    func_split_short_opt_arg=${1#??}
-    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
-    case ${1} in
-      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-      *)    func_lo2o_result=${1} ;;
-    esac])
-
-  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])
-
-  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])
-
-  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])
-fi
-
-if test x"$lt_shell_append" = xyes; then
-  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval "${1}+=\\${2}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
-    func_quote_for_eval "${2}"
-dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
-    eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
-
-  # Save a `func_append' function call where possible by direct use of '+='
-  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-else
-  # Save a `func_append' function call even when '+=' is not available
-  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-fi
-
-if test x"$_lt_function_replace_fail" = x":"; then
-  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
-fi
-])
-
-# _LT_PATH_CONVERSION_FUNCTIONS
-# -----------------------------
-# Determine which file name conversion functions should be used by
-# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
-# for certain cross-compile configurations and native mingw.
-m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-AC_MSG_CHECKING([how to convert $build file names to $host format])
-AC_CACHE_VAL(lt_cv_to_host_file_cmd,
-[case $host in
-  *-*-mingw* )
-    case $build in
-      *-*-mingw* ) # actually msys
-        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
-        ;;
-      *-*-cygwin* )
-        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
-        ;;
-      * ) # otherwise, assume *nix
-        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
-        ;;
-    esac
-    ;;
-  *-*-cygwin* )
-    case $build in
-      *-*-mingw* ) # actually msys
-        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
-        ;;
-      *-*-cygwin* )
-        lt_cv_to_host_file_cmd=func_convert_file_noop
-        ;;
-      * ) # otherwise, assume *nix
-        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
-        ;;
-    esac
-    ;;
-  * ) # unhandled hosts (and "normal" native builds)
-    lt_cv_to_host_file_cmd=func_convert_file_noop
-    ;;
-esac
-])
-to_host_file_cmd=$lt_cv_to_host_file_cmd
-AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
-_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
-         [0], [convert $build file names to $host format])dnl
-
-AC_MSG_CHECKING([how to convert $build file names to toolchain format])
-AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
-[#assume ordinary cross tools, or native build.
-lt_cv_to_tool_file_cmd=func_convert_file_noop
-case $host in
-  *-*-mingw* )
-    case $build in
-      *-*-mingw* ) # actually msys
-        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
-        ;;
-    esac
-    ;;
-esac
-])
-to_tool_file_cmd=$lt_cv_to_tool_file_cmd
-AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
-_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
-         [0], [convert $build files to toolchain format])dnl
-])# _LT_PATH_CONVERSION_FUNCTIONS
diff --git a/macros/lidia-check.m4 b/macros/lidia-check.m4
index 4e46435..f14700e 100644
--- a/macros/lidia-check.m4
+++ b/macros/lidia-check.m4
@@ -74,8 +74,8 @@ if test -r "$LIDIA_HOME/include/LiDIA/LiDIA.h"; then
 		LIDIA_CFLAGS=
 		LIDIA_LIBS="-lLiDIA"
 	fi
-	CXXFLAGS="${BACKUP_CXXFLAGS} ${LIDIA_CFLAGS} ${GMP_CFLAGS}"
-	LIBS="${BACKUP_LIBS} ${LIDIA_LIBS} ${GMP_LIBS}"
+	CXXFLAGS="${BACKUP_CXXFLAGS} ${LIDIA_CFLAGS} ${FFLAS_FFPACK_CFLAGS}"
+	LIBS="${BACKUP_LIBS} ${LIDIA_LIBS} ${FFLAS_FFPACK_LIBS}"
 
 	AC_TRY_LINK(
 	[#include <LiDIA/bigint.h>],
diff --git a/macros/linbox-benchmark.m4 b/macros/linbox-benchmark.m4
index a5eff42..5100bf6 100644
--- a/macros/linbox-benchmark.m4
+++ b/macros/linbox-benchmark.m4
@@ -1,21 +1,21 @@
 dnl Copyright (c) 2011 the LinBox group
-dnl Brice Boyer <bboyer at imag.fr>
+dnl Brice Boyer (briceboyer) <boyer.brice at gmail.com>
 dnl Adapted from linbox-doc.m4
 dnl This file is part of LinBox
 
  dnl ========LICENCE========
  dnl This file is part of the library LinBox.
- dnl 
+ dnl
  dnl LinBox is free software: you can redistribute it and/or modify
  dnl it under the terms of the  GNU Lesser General Public
  dnl License as published by the Free Software Foundation; either
  dnl version 2.1 of the License, or (at your option) any later version.
- dnl 
+ dnl
  dnl This library is distributed in the hope that it will be useful,
  dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
  dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  dnl Lesser General Public License for more details.
- dnl 
+ dnl
  dnl You should have received a copy of the GNU Lesser General Public
  dnl License along with this library; if not, write to the Free Software
  dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
diff --git a/macros/ltoptions.m4 b/macros/ltoptions.m4
deleted file mode 100644
index 5d9acd8..0000000
--- a/macros/ltoptions.m4
+++ /dev/null
@@ -1,384 +0,0 @@
-# Helper functions for option handling.                    -*- Autoconf -*-
-#
-#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
-#   Inc.
-#   Written by Gary V. Vaughan, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 7 ltoptions.m4
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
-
-
-# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
-# ------------------------------------------
-m4_define([_LT_MANGLE_OPTION],
-[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
-
-
-# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
-# ---------------------------------------
-# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
-# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
-# saved as a flag.
-m4_define([_LT_SET_OPTION],
-[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
-m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
-        _LT_MANGLE_DEFUN([$1], [$2]),
-    [m4_warning([Unknown $1 option `$2'])])[]dnl
-])
-
-
-# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
-# ------------------------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-m4_define([_LT_IF_OPTION],
-[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
-
-
-# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
-# -------------------------------------------------------
-# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
-# are set.
-m4_define([_LT_UNLESS_OPTIONS],
-[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
-	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
-		      [m4_define([$0_found])])])[]dnl
-m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
-])[]dnl
-])
-
-
-# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
-# ----------------------------------------
-# OPTION-LIST is a space-separated list of Libtool options associated
-# with MACRO-NAME.  If any OPTION has a matching handler declared with
-# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
-# the unknown option and exit.
-m4_defun([_LT_SET_OPTIONS],
-[# Set options
-m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
-    [_LT_SET_OPTION([$1], _LT_Option)])
-
-m4_if([$1],[LT_INIT],[
-  dnl
-  dnl Simply set some default values (i.e off) if boolean options were not
-  dnl specified:
-  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
-  ])
-  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
-  ])
-  dnl
-  dnl If no reference was made to various pairs of opposing options, then
-  dnl we run the default mode handler for the pair.  For example, if neither
-  dnl `shared' nor `disable-shared' was passed, we enable building of shared
-  dnl archives by default:
-  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
-  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
-  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
-  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
-  		   [_LT_ENABLE_FAST_INSTALL])
-  ])
-])# _LT_SET_OPTIONS
-
-
-## --------------------------------- ##
-## Macros to handle LT_INIT options. ##
-## --------------------------------- ##
-
-# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
-# -----------------------------------------
-m4_define([_LT_MANGLE_DEFUN],
-[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
-
-
-# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
-# -----------------------------------------------
-m4_define([LT_OPTION_DEFINE],
-[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
-])# LT_OPTION_DEFINE
-
-
-# dlopen
-# ------
-LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
-])
-
-AU_DEFUN([AC_LIBTOOL_DLOPEN],
-[_LT_SET_OPTION([LT_INIT], [dlopen])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `dlopen' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
-
-
-# win32-dll
-# ---------
-# Declare package support for building win32 dll's.
-LT_OPTION_DEFINE([LT_INIT], [win32-dll],
-[enable_win32_dll=yes
-
-case $host in
-*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
-  AC_CHECK_TOOL(AS, as, false)
-  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
-  AC_CHECK_TOOL(OBJDUMP, objdump, false)
-  ;;
-esac
-
-test -z "$AS" && AS=as
-_LT_DECL([], [AS],      [1], [Assembler program])dnl
-
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
-])# win32-dll
-
-AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-_LT_SET_OPTION([LT_INIT], [win32-dll])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `win32-dll' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
-
-
-# _LT_ENABLE_SHARED([DEFAULT])
-# ----------------------------
-# implement the --enable-shared flag, and supports the `shared' and
-# `disable-shared' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_SHARED],
-[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([shared],
-    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
-	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
-
-    _LT_DECL([build_libtool_libs], [enable_shared], [0],
-	[Whether or not to build shared libraries])
-])# _LT_ENABLE_SHARED
-
-LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
-
-# Old names:
-AC_DEFUN([AC_ENABLE_SHARED],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
-])
-
-AC_DEFUN([AC_DISABLE_SHARED],
-[_LT_SET_OPTION([LT_INIT], [disable-shared])
-])
-
-AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
-AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_ENABLE_SHARED], [])
-dnl AC_DEFUN([AM_DISABLE_SHARED], [])
-
-
-
-# _LT_ENABLE_STATIC([DEFAULT])
-# ----------------------------
-# implement the --enable-static flag, and support the `static' and
-# `disable-static' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_STATIC],
-[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([static],
-    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
-	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
-
-    _LT_DECL([build_old_libs], [enable_static], [0],
-	[Whether or not to build static libraries])
-])# _LT_ENABLE_STATIC
-
-LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
-
-# Old names:
-AC_DEFUN([AC_ENABLE_STATIC],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
-])
-
-AC_DEFUN([AC_DISABLE_STATIC],
-[_LT_SET_OPTION([LT_INIT], [disable-static])
-])
-
-AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
-AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_ENABLE_STATIC], [])
-dnl AC_DEFUN([AM_DISABLE_STATIC], [])
-
-
-
-# _LT_ENABLE_FAST_INSTALL([DEFAULT])
-# ----------------------------------
-# implement the --enable-fast-install flag, and support the `fast-install'
-# and `disable-fast-install' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_FAST_INSTALL],
-[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([fast-install],
-    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
-    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
-
-_LT_DECL([fast_install], [enable_fast_install], [0],
-	 [Whether or not to optimize for fast installation])dnl
-])# _LT_ENABLE_FAST_INSTALL
-
-LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
-
-# Old names:
-AU_DEFUN([AC_ENABLE_FAST_INSTALL],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `fast-install' option into LT_INIT's first parameter.])
-])
-
-AU_DEFUN([AC_DISABLE_FAST_INSTALL],
-[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `disable-fast-install' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
-dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
-
-
-# _LT_WITH_PIC([MODE])
-# --------------------
-# implement the --with-pic flag, and support the `pic-only' and `no-pic'
-# LT_INIT options.
-# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
-m4_define([_LT_WITH_PIC],
-[AC_ARG_WITH([pic],
-    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
-	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
-    [lt_p=${PACKAGE-default}
-    case $withval in
-    yes|no) pic_mode=$withval ;;
-    *)
-      pic_mode=default
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for lt_pkg in $withval; do
-	IFS="$lt_save_ifs"
-	if test "X$lt_pkg" = "X$lt_p"; then
-	  pic_mode=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [pic_mode=default])
-
-test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
-
-_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
-])# _LT_WITH_PIC
-
-LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
-LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
-
-# Old name:
-AU_DEFUN([AC_LIBTOOL_PICMODE],
-[_LT_SET_OPTION([LT_INIT], [pic-only])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `pic-only' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
-
-## ----------------- ##
-## LTDL_INIT Options ##
-## ----------------- ##
-
-m4_define([_LTDL_MODE], [])
-LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
-		 [m4_define([_LTDL_MODE], [nonrecursive])])
-LT_OPTION_DEFINE([LTDL_INIT], [recursive],
-		 [m4_define([_LTDL_MODE], [recursive])])
-LT_OPTION_DEFINE([LTDL_INIT], [subproject],
-		 [m4_define([_LTDL_MODE], [subproject])])
-
-m4_define([_LTDL_TYPE], [])
-LT_OPTION_DEFINE([LTDL_INIT], [installable],
-		 [m4_define([_LTDL_TYPE], [installable])])
-LT_OPTION_DEFINE([LTDL_INIT], [convenience],
-		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/macros/ltsugar.m4 b/macros/ltsugar.m4
deleted file mode 100644
index 9000a05..0000000
--- a/macros/ltsugar.m4
+++ /dev/null
@@ -1,123 +0,0 @@
-# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
-#
-# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
-# Written by Gary V. Vaughan, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 6 ltsugar.m4
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
-
-
-# lt_join(SEP, ARG1, [ARG2...])
-# -----------------------------
-# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
-# associated separator.
-# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
-# versions in m4sugar had bugs.
-m4_define([lt_join],
-[m4_if([$#], [1], [],
-       [$#], [2], [[$2]],
-       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
-m4_define([_lt_join],
-[m4_if([$#$2], [2], [],
-       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
-
-
-# lt_car(LIST)
-# lt_cdr(LIST)
-# ------------
-# Manipulate m4 lists.
-# These macros are necessary as long as will still need to support
-# Autoconf-2.59 which quotes differently.
-m4_define([lt_car], [[$1]])
-m4_define([lt_cdr],
-[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
-       [$#], 1, [],
-       [m4_dquote(m4_shift($@))])])
-m4_define([lt_unquote], $1)
-
-
-# lt_append(MACRO-NAME, STRING, [SEPARATOR])
-# ------------------------------------------
-# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
-# Note that neither SEPARATOR nor STRING are expanded; they are appended
-# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
-# No SEPARATOR is output if MACRO-NAME was previously undefined (different
-# than defined and empty).
-#
-# This macro is needed until we can rely on Autoconf 2.62, since earlier
-# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
-m4_define([lt_append],
-[m4_define([$1],
-	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
-
-
-
-# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
-# ----------------------------------------------------------
-# Produce a SEP delimited list of all paired combinations of elements of
-# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
-# has the form PREFIXmINFIXSUFFIXn.
-# Needed until we can rely on m4_combine added in Autoconf 2.62.
-m4_define([lt_combine],
-[m4_if(m4_eval([$# > 3]), [1],
-       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
-[[m4_foreach([_Lt_prefix], [$2],
-	     [m4_foreach([_Lt_suffix],
-		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
-	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
-
-
-# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
-# -----------------------------------------------------------------------
-# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
-# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
-m4_define([lt_if_append_uniq],
-[m4_ifdef([$1],
-	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
-		 [lt_append([$1], [$2], [$3])$4],
-		 [$5])],
-	  [lt_append([$1], [$2], [$3])$4])])
-
-
-# lt_dict_add(DICT, KEY, VALUE)
-# -----------------------------
-m4_define([lt_dict_add],
-[m4_define([$1($2)], [$3])])
-
-
-# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
-# --------------------------------------------
-m4_define([lt_dict_add_subkey],
-[m4_define([$1($2:$3)], [$4])])
-
-
-# lt_dict_fetch(DICT, KEY, [SUBKEY])
-# ----------------------------------
-m4_define([lt_dict_fetch],
-[m4_ifval([$3],
-	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
-    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
-
-
-# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
-# -----------------------------------------------------------------
-m4_define([lt_if_dict_fetch],
-[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
-	[$5],
-    [$6])])
-
-
-# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
-# --------------------------------------------------------------
-m4_define([lt_dict_filter],
-[m4_if([$5], [], [],
-  [lt_join(m4_quote(m4_default([$4], [[, ]])),
-           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
-		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
-])
diff --git a/macros/ltversion.m4 b/macros/ltversion.m4
deleted file mode 100644
index 07a8602..0000000
--- a/macros/ltversion.m4
+++ /dev/null
@@ -1,23 +0,0 @@
-# ltversion.m4 -- version numbers			-*- Autoconf -*-
-#
-#   Copyright (C) 2004 Free Software Foundation, Inc.
-#   Written by Scott James Remnant, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# @configure_input@
-
-# serial 3337 ltversion.m4
-# This file is part of GNU Libtool
-
-m4_define([LT_PACKAGE_VERSION], [2.4.2])
-m4_define([LT_PACKAGE_REVISION], [1.3337])
-
-AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.4.2'
-macro_revision='1.3337'
-_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
-_LT_DECL(, macro_revision, 0)
-])
diff --git a/macros/lt~obsolete.m4 b/macros/lt~obsolete.m4
deleted file mode 100644
index c573da9..0000000
--- a/macros/lt~obsolete.m4
+++ /dev/null
@@ -1,98 +0,0 @@
-# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
-#
-#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
-#   Written by Scott James Remnant, 2004.
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 5 lt~obsolete.m4
-
-# These exist entirely to fool aclocal when bootstrapping libtool.
-#
-# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
-# which have later been changed to m4_define as they aren't part of the
-# exported API, or moved to Autoconf or Automake where they belong.
-#
-# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
-# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
-# using a macro with the same name in our local m4/libtool.m4 it'll
-# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
-# and doesn't know about Autoconf macros at all.)
-#
-# So we provide this file, which has a silly filename so it's always
-# included after everything else.  This provides aclocal with the
-# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
-# because those macros already exist, or will be overwritten later.
-# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
-#
-# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
-# Yes, that means every name once taken will need to remain here until
-# we give up compatibility with versions before 1.7, at which point
-# we need to keep only those names which we still refer to.
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
-
-m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
-m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
-m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
-m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
-m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
-m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
-m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
-m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
-m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
-m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
-m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
-m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
-m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
-m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
-m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
-m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
-m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
-m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
-m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
-m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
-m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
-m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
-m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
-m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
-m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
-m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
-m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
-m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
-m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
-m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
-m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
-m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
-m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
-m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
-m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
-m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
-m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
-m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
-m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
-m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
-m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
-m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
-m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
-m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
-m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
-m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
-m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
-m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
-m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],	[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
-m4_ifndef([_LT_AC_PROG_CXXCPP],		[AC_DEFUN([_LT_AC_PROG_CXXCPP])])
-m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],	[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
-m4_ifndef([_LT_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
-m4_ifndef([_LT_PROG_F77],		[AC_DEFUN([_LT_PROG_F77])])
-m4_ifndef([_LT_PROG_FC],		[AC_DEFUN([_LT_PROG_FC])])
-m4_ifndef([_LT_PROG_CXX],		[AC_DEFUN([_LT_PROG_CXX])])
diff --git a/macros/m4ri-check.m4 b/macros/m4ri-check.m4
index d1827a4..21cff0b 100644
--- a/macros/m4ri-check.m4
+++ b/macros/m4ri-check.m4
@@ -71,8 +71,8 @@ for M4RI_HOME in ${M4RI_HOME_PATH}
 		   M4RI_CFLAGS=
 		   M4RI_LIBS="-lm4ri" ])
 
-       CXXFLAGS="${BACKUP_CXXFLAGS} ${M4RI_CFLAGS} ${GMP_CFLAGS}"
-       LIBS="${BACKUP_LIBS} ${M4RI_LIBS} ${GMP_LIBS}"
+       CXXFLAGS="${BACKUP_CXXFLAGS} ${M4RI_CFLAGS} ${FFLAS_FFPACK_CFLAGS}"
+       LIBS="${BACKUP_LIBS} ${M4RI_LIBS} ${FFLAS_FFPACK_LIBS}"
 
        AC_TRY_LINK(
        [#include <m4ri/m4ri.h> ],
diff --git a/macros/m4rie-check.m4 b/macros/m4rie-check.m4
index c11c747..5cc1505 100644
--- a/macros/m4rie-check.m4
+++ b/macros/m4rie-check.m4
@@ -71,8 +71,8 @@ for M4RIE_HOME in ${M4RIE_HOME_PATH}
 		   M4RIE_CFLAGS=
 		   M4RIE_LIBS="-lm4rie" ])
 
-       CXXFLAGS="${BACKUP_CXXFLAGS} ${M4RIE_CFLAGS} ${GMP_CFLAGS}"
-       LIBS="${BACKUP_LIBS} ${M4RIE_LIBS} ${GMP_LIBS}"
+       CXXFLAGS="${BACKUP_CXXFLAGS} ${M4RIE_CFLAGS} ${FFLAS_FFPACK_CFLAGS}"
+       LIBS="${BACKUP_LIBS} ${M4RIE_LIBS} ${FFLAS_FFPACK_LIBS}"
 
        AC_TRY_LINK(
        [#include <m4rie/m4rie.h> ],
diff --git a/macros/mpfr-check.m4 b/macros/mpfr-check.m4
index 748e7ec..3857a05 100644
--- a/macros/mpfr-check.m4
+++ b/macros/mpfr-check.m4
@@ -73,8 +73,8 @@ for MPFR_HOME in ${MPFR_HOME_PATH}
            MPFR_LIBS="-lmpfr"
        ])
 
-       CXXFLAGS="${BACKUP_CXXFLAGS} ${MPFR_CFLAGS} ${GMP_CFLAGS}"
-       LIBS="${BACKUP_LIBS} ${GMP_LIBS} ${MPFR_LIBS} "
+       CXXFLAGS="${BACKUP_CXXFLAGS} ${MPFR_CFLAGS} ${FFLAS_FFPACK_CFLAGS}"
+       LIBS="${BACKUP_LIBS} ${FFLAS_FFPACK_LIBS} ${MPFR_LIBS} "
 
        AC_TRY_LINK(
        [
diff --git a/macros/ntl-check.m4 b/macros/ntl-check.m4
index 35981c2..c549ab9 100644
--- a/macros/ntl-check.m4
+++ b/macros/ntl-check.m4
@@ -75,8 +75,8 @@ if test -r "$NTL_HOME/include/NTL/ZZ.h"; then
 		NTL_CFLAGS=
 		NTL_LIBS="-lntl"
 	fi
-	CXXFLAGS="${BACKUP_CXXFLAGS} ${NTL_CFLAGS} ${GMP_CFLAGS}"
-	LIBS="${BACKUP_LIBS} ${NTL_LIBS} ${GMP_LIBS}"
+	CXXFLAGS="${BACKUP_CXXFLAGS} ${NTL_CFLAGS} ${FFLAS_FFPACK_CFLAGS}"
+	LIBS="${BACKUP_LIBS} ${NTL_LIBS} ${FFLAS_FFPACK_LIBS}"
 
 	AC_TRY_LINK(
 	[#include <NTL/ZZ.h>],
diff --git a/macros/ocl-check.m4 b/macros/ocl-check.m4
new file mode 100644
index 0000000..f8fae6c
--- /dev/null
+++ b/macros/ocl-check.m4
@@ -0,0 +1,95 @@
+dnl Check for OpenCL
+dnl Copyright (c) the LinBox group
+dnl This file is part of LinBox
+
+ dnl ========LICENCE========
+ dnl This file is part of the library LinBox.
+ dnl
+ dnl LinBox is free software: you can redistribute it and/or modify
+ dnl it under the terms of the  GNU Lesser General Public
+ dnl License as published by the Free Software Foundation; either
+ dnl version 2.1 of the License, or (at your option) any later version.
+ dnl
+ dnl This library is distributed in the hope that it will be useful,
+ dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+ dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ dnl Lesser General Public License for more details.
+ dnl
+ dnl You should have received a copy of the GNU Lesser General Public
+ dnl License along with this library; if not, write to the Free Software
+ dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ dnl ========LICENCE========
+ dnl
+
+dnl LB_CHECK_OCL([MINIMUM-VERSION [, ACTION_IF_FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl
+dnl Test for an OpenCL
+
+AC_DEFUN([LB_CHECK_OCL],[
+	AC_ARG_WITH(ocl,
+	[AC_HELP_STRING([--with-ocl=<path>|yes|no],
+	[Use OpenCL. This library is optional for LinBox compilation.
+	 If argument is yes or <empty> that means the library is reachable
+	 with the standard search path "/usr" or "/usr/local" (set as default).
+	 Otherwise you give the <path> to the directory which contains the library.])],
+
+	[if test "$withval" = yes; then
+		OCL_HOME_PATH="/opt/AMDAPP ${DEFAULT_CHECKING_PATH}"
+	elif test "$withval" != no; then
+		OCL_HOME_PATH="$withval /opt/AMDAPP ${DEFAULT_CHECKING_PATH}"
+	fi],
+
+	[OCL_HOME_PATH="/opt/AMDAPP $DEFAULT_CHECKING_PATH}"])
+
+	BACKUP_CXXFLAGS=${CXXFLAGS}
+	BACKUP_LIBS=${LIBS}
+
+	if test -n "$OCL_HOME_PATH"; then
+		AC_MSG_CHECKING(for OpenCL >= 1.0)
+	fi
+
+	for OCL_HOME in ${OCL_HOME_PATH}
+	do
+		if test -r "$OCL_HOME/include/CL/cl.h"; then
+			if test "x$OCL_HOME" != "x/usr" -a "x$OCL_HOME" != "x/usr/local"; then
+				OCL_CFLAGS="-I${OCL_HOME}/include"
+				if test "x$OCL_HOME" != "x/opt/AMDAPP"; then
+					OCL_LIBS="-L${OCL_HOME}/lib64 -L${OCL_HOME}/lib -lOpenCL -lpthread"
+				else
+					OCL_LIBS="-L${OCL_HOME}/lib/x86_64 -L${OCL_HOME}/lib/x86 -lOpenCL -lpthread"
+				fi
+			else
+				OCL_CFLAGS=
+				OCL_LIBS="-lOpenCL -lpthread"
+			fi
+
+			CXXFLAGS="${CXXFLAGS} ${OCL_CFLAGS}"
+			LIBS="${LIBS} ${OCL_LIBS}"
+
+			ocl_found="yes"
+			break
+
+		else
+			ocl_found="no"
+		fi
+	done
+
+	AS_IF([ test "x$ocl_found" = "xyes" ],
+	[
+		AC_SUBST(OCL_CFLAGS)
+		AC_SUBST(OCL_LIBS)
+		AC_DEFINE(HAVE_OCL,1,[Define if OpenCL is installed])
+		HAVE_OCL=yes
+
+		AC_MSG_RESULT(found)
+	],[
+		unset OCL_CFLAGS
+		unset OCL_LIBS
+		AC_MSG_RESULT(not found)
+	])
+
+	AM_CONDITIONAL(LINBOX_HAVE_OCL, test "x$HAVE_OCL" = "xyes")
+
+	CXXFLAGS=${BACKUP_CXXFLAGS}
+	LIBS=${BACKUP_LIBS}
+])
diff --git a/macros/omp-check.m4 b/macros/omp-check.m4
new file mode 100644
index 0000000..1589c3b
--- /dev/null
+++ b/macros/omp-check.m4
@@ -0,0 +1,77 @@
+dnl turn on OPENMP
+dnl Copyright (c) the LinBox group
+dnl This file is part of LinBox
+
+ dnl ========LICENCE========
+ dnl This file is part of the library LinBox.
+ dnl
+ dnl LinBox is free software: you can redistribute it and/or modify
+ dnl it under the terms of the  GNU Lesser General Public
+ dnl License as published by the Free Software Foundation; either
+ dnl version 2.1 of the License, or (at your option) any later version.
+ dnl
+ dnl This library is distributed in the hope that it will be useful,
+ dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+ dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ dnl Lesser General Public License for more details.
+ dnl
+ dnl You should have received a copy of the GNU Lesser General Public
+ dnl License along with this library; if not, write to the Free Software
+ dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ dnl ========LICENCE========
+ dnl
+
+dnl LB_CHECK_OMP()
+dnl
+dnl turn on OpenMP
+
+AC_DEFUN([LB_OMP],[
+	AC_MSG_CHECKING(enabling OpenMP)
+
+	AC_ARG_ENABLE(openmp,
+		[AC_HELP_STRING([--enable-openmp],
+		[ Use OpenMP ])
+		],
+		[ with_omp=$enable_openmp],
+		[ with_omp=yes ]
+	)
+
+	AS_IF([ test "x$with_omp" != "xno" ],
+		[
+			BACKUP_CXXFLAGS=${CXXFLAGS}
+			OMPFLAGS="-fopenmp"
+			CXXFLAGS="${BACKUP_CXXFLAGS} ${OMPFLAGS}"
+                AC_TRY_RUN([
+#include <omp.h>
+                        int main() {
+                        int p = omp_get_num_threads();
+                        return 0;
+                        }
+                ],
+                [ omp_found="yes" ],
+                [ omp_found="no" ],
+                [
+                        echo "cross compiling...disabling"
+                        omp_found="no"
+                ])
+                AS_IF(  [ test "x$omp_found" = "xyes" ],
+                        [
+                                AC_DEFINE(USE_OPENMP,1,[Define if OMP is available])
+                                AC_SUBST(OMPFLAGS)
+                                AC_MSG_RESULT(yes)
+                                HAVE_OMP=yes
+                        ],
+                        [
+                                OMPFLAGS=
+                                AC_SUBST(OMPFLAGS)
+                                AC_MSG_RESULT(no)
+                        ]
+                )
+                CXXFLAGS=${BACKUP_CXXFLAGS}
+	],[
+	AC_MSG_RESULT(no)
+	])
+AM_CONDITIONAL(LINBOX_HAVE_OMP, test "x$HAVE_OMP" = "xyes")
+]
+)
+
diff --git a/macros/saclib-check.m4 b/macros/saclib-check.m4
index 36b17f3..8e8269c 100644
--- a/macros/saclib-check.m4
+++ b/macros/saclib-check.m4
@@ -77,7 +77,8 @@ if test -r "$SACLIB_HOME/include/saclib.h"; then
 		SACLIB_LIBS="-lsaclib"
 	fi
 
-	CXXFLAGS="${BACKUP_CXXFLAGS} ${SACLIB_CFLAGS} ${GMP_CFLAGS}" 	LIBS="${BACKUP_LIBS} ${SACLIB_LIBS} ${GMP_LIBS}"
+	CXXFLAGS="${BACKUP_CXXFLAGS} ${SACLIB_CFLAGS} ${FFLAS_FFPACK_CFLAGS}"
+	LIBS="${BACKUP_LIBS} ${SACLIB_LIBS} ${FFLAS_FFPACK_LIBS}"
 
 	AC_TRY_LINK(
 	[#include <saclib.h>],
diff --git a/macros/sage-check.m4 b/macros/sage-check.m4
index 5e2a2ae..1652f6d 100644
--- a/macros/sage-check.m4
+++ b/macros/sage-check.m4
@@ -28,10 +28,12 @@ AC_MSG_CHECKING([whether to compile the SAGE interface])
 AC_ARG_ENABLE(sage,
 [AC_HELP_STRING([--enable-sage], [Enable the compilation of the SAGE interface])])
 AM_CONDITIONAL(LINBOX_HAVE_SAGE, test "x$enable_sage" = "xyes")
+
 AS_IF([test "x$enable_sage" = "xyes"],
 [
 AC_MSG_RESULT(yes)
-
+AC_DEFINE(HAVE_SAGE,1,[Define if SageMath interface is built])
+LINBOXSAGE_LIBS="-llinboxsage"
 dnl  if test "x$HAVE_NTL" = "xyes" ; then
 	dnl  AC_CHECK_TOOL(OBJDUMP, objdump, false)
 	dnl  AC_MSG_CHECKING([whether NTL was built with -fPIC])
@@ -57,5 +59,7 @@ dnl  fi
 
 ],[
 AC_MSG_RESULT(no)
+LINBOXSAGE_LIBS=""
 ])
 ])
+AC_SUBST(LINBOXSAGE_LIBS)
diff --git a/macros/tinyxml2-check.m4 b/macros/tinyxml2-check.m4
new file mode 100644
index 0000000..f549d04
--- /dev/null
+++ b/macros/tinyxml2-check.m4
@@ -0,0 +1,46 @@
+dnl Check for FPLLL
+dnl Copyright (c) the LinBox group
+dnl Brice Boyer (briceboyer) <boyer.brice at gmail.com> 10/09/13
+dnl This file is part of LinBox
+
+ dnl ========LICENCE========
+ dnl This file is part of the library LinBox.
+ dnl
+ dnl LinBox is free software: you can redistribute it and/or modify
+ dnl it under the terms of the  GNU Lesser General Public
+ dnl License as published by the Free Software Foundation; either
+ dnl version 2.1 of the License, or (at your option) any later version.
+ dnl
+ dnl This library is distributed in the hope that it will be useful,
+ dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+ dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ dnl Lesser General Public License for more details.
+ dnl
+ dnl You should have received a copy of the GNU Lesser General Public
+ dnl License along with this library; if not, write to the Free Software
+ dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ dnl ========LICENCE========
+ dnl
+
+AC_DEFUN([LB_CHECK_XML],
+[
+AC_MSG_CHECKING(if tinyxml2 is available)
+SAVED_LIBS=$LIBS
+    LIBS="$LIBS -ltinyxml2"
+    AC_TRY_LINK(
+      [#include <tinyxml2.h>],
+      [
+      using namespace tinyxml2 ;
+      XMLDocument doc;
+      ],
+      [
+AC_MSG_RESULT(yes)
+AC_DEFINE(HAVE_TINYXML2,1,[Define if tinyxml2 is installed])
+XML_LIBS="-ltinyxml2"
+AC_SUBST(XML_LIBS)
+],
+      [AC_MSG_RESULT(no)
+      AC_MSG_WARN([tinyxml2 is not installed (no import/export of benchmarks).])]
+    )
+    LIBS=$SAVED_LIBS
+])
diff --git a/template.h b/template.h
new file mode 100644
index 0000000..9c3ab98
--- /dev/null
+++ b/template.h
@@ -0,0 +1,131 @@
+/* Copyright (C) <+years+> the members of the LinBox group
+ * Written by <+someone+> < <+her mail+> >
+ *
+ * This file is part of the LinBox library.
+ *
+ * ========LICENCE========
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * LinBox 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *
+ * other mentions
+ */
+
+#ifndef __LINBOX_<+directory_file_name+>_H
+#define __LINBOX_<+directory_file_name+>_H
+
+/** @file <+directory/file-name.h+>
+ * @brief desc
+ * long doxy desc
+ * @bib bibliography
+ */
+
+#include "<++>"
+
+#if 0 // better than commenting out code with big /*   */
+// (it shows this code is not really mature yet...)
+
+#define LB_VAR  10  /* local var */
+#define LB_DEF      /* local define */
+#define LB_MACRO () /* local macro */
+
+#ifdef _LINBOX_DEF   // linbox global define
+#ifdef _LINBOX_MACRO // linbox global macro
+#if _LINBOX_VAR // linbox global variable
+#endif
+#endif
+#endif
+
+#endif
+
+namespace LinBox
+{
+	/**  @brief this function is about...
+	 * this important function has comments  !!!
+	 */
+	template<++>
+	void my_func(T & toto)
+	{
+		toto() ;
+		if (a) {
+			b();
+		}
+		else {
+			c() ;
+		}
+	}
+
+	template<class A,
+	class B>
+	void foo() ;
+
+	switch(a) {
+	case toto:
+		a() ;
+		break;
+	case titi:
+		{
+			b() ;
+			break;
+		}
+	default :
+		{
+			b() ;
+		}
+	}
+
+	class A {
+	private :
+		int _p ;
+		int _q ;
+	public :
+		A() :
+			_p(0), _q(0)
+		{} ;
+
+		A(int q) : _p(1), _q(q)
+		{} ;
+
+		A(int p, int q)
+		: _p(p), _q(q)
+		{} ;
+
+
+		~A() {} ;
+	};
+#if 0
+	int old_code()  // but maybe usefull later
+	{
+		prinf("comment out code !");
+	}
+#endif
+
+} //LinBox
+
+#include "<+file-name.inl+>" // implementation here
+
+#undef LB_VAR    // environmentalists love us
+#undef LB_DEF    // really !
+#undef LB_MACRO
+
+#endif //__LINBOX_<+directory_file_name+>_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+
diff --git a/tests/.gitignore b/tests/.gitignore
new file mode 100644
index 0000000..8158140
--- /dev/null
+++ b/tests/.gitignore
@@ -0,0 +1,64 @@
+checker
+test-bitonic-sort
+test-blackbox-block-container
+test-blas-domain
+test-butterfly
+test-companion
+test-dense
+test-diagonal
+test-dif
+test-direct-sum
+test-echelon-form
+test-ffpack
+test-fibb
+test-getentry
+test-gf2
+test-givaropoly
+test-gmp-rational
+test-hilbert
+test-hom
+test-inverse
+test-last-invariant-factor
+test-matrix-domain
+test-matrix-stream
+test-minpoly
+test-modular-balanced-float
+test-modular-double
+test-modular-float
+test-modular-int
+test-ntl-hankel
+test-ntl-lzz_p
+test-ntl-lzz_pe
+test-ntl-lzz_pex
+test-ntl-lzz_px
+test-ntl-rr
+test-ntl-sylvester
+test-ntl-toeplitz
+test-ntl-zz_p
+test-nullspace
+test-order-basis
+test-param-fuzzy
+test-permutation
+test-plain-domain
+test-qlup
+test-randiter-nonzero
+test-random-matrix
+test-rational-matrix-factory
+test-scalar-matrix
+test-smith-form
+test-smith-form-adaptive
+test-smith-form-iliopoulos
+test-smith-form-local
+test-sparse2
+test-subiterator
+test-submatrix
+test-subvector
+test-sum
+test-toeplitz-det
+test-toom-cook
+test-trace
+test-transpose
+test-triplesbb
+test-triplesbb-omp
+test-vector-domain
+test-zero-one
diff --git a/tests/Makefile.am b/tests/Makefile.am
index cd4aafe..dc14423 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -17,652 +17,341 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 # ========LICENCE========
 
+# All tests should appear in one of the lists of this makefile (and sources given). 
+# Tests not used for target "check" can be in the FULLCHECK_TESTS list.
+# All tests will be processed by checker.C (target fullcheck), 
+# where skips can be specified, warnings issued, package dependency handled.
 
-
-
-AM_CPPFLAGS=-I$(top_srcdir) -I$(top_srcdir)/linbox
+#AM_CPPFLAGS=-I$(top_srcdir) -I$(top_srcdir)/linbox -I${PREFIX}/include
 # AM_LDFLAGS = -llapack -lcblas -latlas
-AM_LDFLAGS = $(top_srcdir)/linbox/.libs/liblinbox.a
+#  AM_LDFLAGS = $(top_srcdir)/linbox/.libs/liblinbox.a
+#AM_LDFLAGS = $(top_srcdir)/linbox/liblinbox.la
 #  SAFER_FLAGS = -g -Wall -Wextra -Wno-unused-parameter
 # bds: no need to optimize for unit/regression tests, and opt adds a lot to compilation time
-#AM_CXXFLAGS = @TESTS_CFLAGS@ -DLinBoxSrcOnly
-#  AM_CXXFLAGS = $(SAFER_FLAGS) -DLinBoxSrcOnly
-#AM_CXXFLAGS = $(SAFER_FLAGS) -DLinBoxSrcOnly -O2
-#  AM_CXXFLAGS = -g -DLinBoxSrcOnly -Wall -DDEBUG -O0
-AM_CXXFLAGS = -DLinBoxSrcOnly  @TESTS_CFLAGS@ @DEBUG_CFLAGS@
-# AM_CXXFLAGS = -g -DLinBoxSrcOnly -Wall -D__LINBOX_HAVE_DGETRF -D__LINBOX_HAVE_DGETRI
+#AM_CXXFLAGS = @TESTS_CFLAGS@ -DLinBoxTestOnly
+#  AM_CXXFLAGS = $(SAFER_FLAGS) -DLinBoxTestOnly
+#AM_CXXFLAGS = $(SAFER_FLAGS) -DLinBoxTestOnly -O2
+#  AM_CXXFLAGS = -g -DLinBoxTestOnly -Wall -DDEBUG -O0
+
+AM_CPPFLAGS = -DLinBoxTestOnly @TESTS_CFLAGS@ @DEBUG_CFLAGS@
+
+# AM_CXXFLAGS = -g -DLinBoxTestOnly -Wall -D__LINBOX_HAVE_DGETRF -D__LINBOX_HAVE_DGETRI
 # AM_CFLAGS = -g -Wall
 
 SUBDIRS = data matrix
 
-AM_CPPFLAGS+= $(CBLAS_FLAG) $(FFLAS_FFPACK_CFLAGS) $(GMP_CFLAGS) $(NTL_CFLAGS) $(GIVARO_CFLAGS) $(LIDIA_CFLAGS) $(IML_CFLAGS)
-LDADD = $(GIVARO_LIBS) $(BLAS_LIBS) $(NTL_LIBS)  $(GMP_LIBS) $(LIDIA_LIBS) $(MPFR_LIBS) $(FPLLL_LIBS)  $(IML_LIBS) $(LDFLAGS)
-#  AM_LDFLAGS+=-static -Wl,-rpath -Wl,$(GIVARO_LIBS)
+AM_CPPFLAGS+= -I$(top_srcdir)/linbox $(DEPS_CFLAGS)
+LDADD = $(DEPS_LIBS) $(LDFLAGS)
+AM_LDFLAGS = $(top_builddir)/linbox/liblinbox.la
+#  AM_LDFLAGS+=-static -Wl,-rpath -Wl,
+
+EXTRA_DIST =					\
+		test-blackbox.h			\
+		test-common.h			\
+		test-common.inl			\
+		test-field.h			\
+		test-generic.h			\
+		test-matrix-utils.h		\
+		test-matrix-domain.h	\
+		test-rank.h				\
+		test-vector-domain.h	\
+		tests.doxy				\
+		checker.C				
 
-EXTRA_DIST=            \
-		test-common.C  \
-		tests.doxy     \
-		checker.C
+PERFPUBLISHERFILE = tests-report.xml
 
-#  test-generic-for-quad.h
+#  tutorial-1: tutorial-1.C
 
-# Put an entry for your test-mycomponent.C here (or in one of the other test groups).
+#  test-tutorial$(EXEEXT): test-tutorial.C tutorial-1
+
+# Put an entry for your test-mycomponent.C in one of the test groups.
 # Don't forget to add a test_mycomponent_SOURCES entry below.
 #
 # Once present, tests should remain present, being moved from one group to another.
-# Note that among the available groups are NONCOMPILING_TESTS and FAILING_TESTS, which
-# will be ignored by "make check" and can be temporary storage for problematic tests.
-BASIC_TESTS =  \
-        test-commentator              \
-        test-det                      \
-        test-frobenius                \
-        test-rank                     \
-        test-solve                    \
-        test-nullspace                \
-        test-smith-form-binary        \
-        test-rational-solver          \
-        test-rational-solver-adaptive \
-        test-charpoly                 \
-        test-cra
-
-FULLCHECK_TESTS =                 \
-        test-bitonic-sort             \
+BASIC_TESTS =					\
+	test-commentator			\
+	test-det					\
+	test-frobenius              \
+	test-solve                  \
+	test-rational-solver        \
+	test-rational-solver-adaptive \
+	test-rank-u32				\
+	test-rank-md				\
+	test-rank-Int				\
+	test-cra					\
+	test-blas-matrix			\
+	test-charpoly			\
+	test-regression
+
+# All other tests.  
+# The checker.C determines which of these are built and run in "make fullcheck".
+FULLCHECK_TESTS =               \
+	test-bitonic-sort           \
 	test-blackbox-block-container \
-        test-blas-domain              \
-        test-butterfly                \
-        test-companion                \
-        test-dense                    \
-        test-diagonal                 \
-        test-dif                      \
-        test-direct-sum               \
-        test-echelon-form             \
-        test-ffpack                   \
-        test-getentry                 \
-        test-gf2                      \
-        test-gmp-rational             \
-        test-hilbert                  \
-        test-hom                      \
-        test-inverse                  \
-        test-isposdef                 \
-        test-ispossemidef             \
-        test-matrix-domain            \
-        test-matrix-stream            \
-        test-minpoly                  \
-        test-modular                  \
-        test-modular-balanced-int     \
-        test-modular-balanced-float   \
-        test-modular-balanced-double  \
-        test-modular-byte             \
-        test-modular-double           \
-        test-modular-float            \
-        test-modular-int              \
-        test-modular-short            \
-        test-block-ring               \
-        test-PID-integer              \
-        test-moore-penrose            \
-        test-randiter-nonzero         \
-        test-rational-matrix-factory  \
-        test-scalar-matrix            \
-	test-solve-nonsingular        \
-        test-sparse                   \
-        test-subiterator              \
-        test-submatrix                \
-        test-subvector                \
-        test-sum                      \
-        test-trace                    \
-        test-triplesbb                \
-        test-vector-domain            \
-        test-qlup                     \
-        test-zero-one                 \
-        test-last-invariant-factor    \
-        test-cradomain                \
-		test-rational-reconstruction-base
-
-#  test-integer-tools
-
-# tests of components not adhering to LinBox requirements.
-NONCOMPLIANT_TESTS =                   \
-        test-ntl-RR                    \
-        test-param-fuzzy
-
-#These need clapack
-#test-rational-solver-adaptive
-
-DUBIOUS_TESTS =                 \
-	test-unparametric-field       \
-	test-bmseq		\
-		test-zo
-#  test-quad-matrix
-
-NONCOMPILING_TESTS =           \
-        test-dense-zero-one
-
-FAILING_TESTS =                  \
-        test-rat-charpoly        \
-		test-rat-solve           \
-		test-rat-minpoly         \
-		test-smith-form-local    \
-		test-smith-form-adaptive \
-		test-dyadic-to-rational  \
-		test-mg-block-lanczos    \
-		test-ftrmm               \
-        test-la-block-lanczos
-
-USE_NONCOMPILING_TESTS =
-USE_FAILING_TESTS =
-# comment out these two lines to avoid facing reality
-#USE_NONCOMPILING_TESTS += $(NONCOMPILING_TESTS)
-#USE_FAILING_TESTS += $(FAILING_TESTS)
-
-# a benchmarker, not to be included in check.
-BENCHMARKS =                    \
-        benchmark-fields        \
-        benchmark-blas-domain
-
-# historical tests, no longer in use
-#        test-nag-sparse                  replaced by tripplesbb
-#       test-lsp         lsp.h superceded by factorized-matrix.h
-# removed test
-#        test-nag-sparse
-#        test-image-field       replaced by hom
-#       test-lsp
-# I put test-gssv_rank in hmrg:~saunders/gen_superlu.  It is not linbox until and unless it is made to work
-# test-gssv is an ntl test
-
-
-# no explicit test needed, I guess...
-#        Transpose is tested in test-triplesbb
-#        Compose is tested in test-butterfly
-
-GIVARO_TESTS =                        \
-        test-givaro-fields
-
-NTL_TESTS =                           \
-        test-smith-form               \
-        test-ntl-lzz_p                \
-        test-ntl-ZZ_p                 \
-        test-ntl-toeplitz             \
-        test-ntl-hankel               \
-        test-ntl-sylvester            \
-        test-smith-form-iliopoulos    \
-        test-toeplitz-det
-
-LIDIA_TESTS =                         \
-        test-lidia-gfq
-
-ATLAS_TESTS =                         \
-        test-optimization
-
-BLAS3_UNIT_TESTS = \
-		   test-toom-cook
+	test-blas-domain            \
+	test-block-ring				\
+	test-block-wiedemann		\
+	test-butterfly				\
+	test-companion				\
+	test-cradomain				\
+	test-dense					\
+	test-dense-zero-one      	\
+	test-diagonal				\
+	test-dif					\
+	test-direct-sum				\
+	test-dyadic-to-rational  	\
+	test-echelon-form			\
+	test-ffpack					\
+	test-fibb					\
+	test-ftrmm					\
+	test-getentry				\
+	test-gf2					\
+	test-givaropoly				\
+	test-givaro-zpz				\
+	test-givaro-zpzuns				\
+	test-gmp-rational			\
+	test-hilbert				\
+	test-hom					\
+	test-image-field			\
+	test-inverse				\
+	test-isposdef				\
+	test-ispossemidef			\
+	test-la-block-lanczos		\
+	test-last-invariant-factor  \
+	test-matrix-domain			\
+	test-matrix-stream			\
+	test-mg-block-lanczos    	\
+	test-minpoly				\
+	test-modular				\
+	test-modular-balanced-double \
+	test-modular-balanced-float  \
+	test-modular-balanced-int   \
+	test-modular-byte			\
+	test-modular-double			\
+	test-modular-float			\
+	test-modular-int			\
+	test-modular-short			\
+	test-moore-penrose			\
+	test-ntl-hankel             \
+	test-ntl-lzz_p              \
+	test-ntl-lzz_pe             \
+	test-ntl-lzz_pex            \
+	test-ntl-lzz_px             \
+	test-ntl-rr					\
+	test-ntl-sylvester          \
+	test-ntl-toeplitz           \
+	test-ntl-zz_p               \
+	test-nullspace				\
+	test-optimization			\
+	test-order-basis			\
+	test-param-fuzzy			\
+	test-permutation			\
+	test-plain-domain			\
+	test-poly-det				\
+	test-qlup					\
+	test-quad-matrix			\
+	test-randiter-nonzero		\
+	test-random-matrix			\
+	test-rat-charpoly			\
+	test-rational-matrix-factory \
+	test-rational-reconstruction-base \
+	test-rat-minpoly			\
+	test-rat-solve				\
+	test-scalar-matrix			\
+	test-smith-form             \
+	test-smith-form-adaptive 	\
+	test-smith-form-binary      \
+	test-smith-form-iliopoulos  \
+	test-smith-form-local    	\
+	test-solve-nonsingular		\
+	test-sparse					\
+	test-subiterator			\
+	test-submatrix				\
+	test-subvector				\
+	test-sum					\
+	test-toom-cook				\
+	test-trace					\
+	test-transpose				\
+	test-triplesbb				\
+	test-triplesbb-omp			\
+	test-tutorial				\
+	test-vector-domain			\
+	test-zero-one				
+
+# Really just one or two of these would be enough for target check.
+# The rest can be in target fullcheck.
+NTL_TESTS =                     \
+	test-smith-form             \
+	test-ntl-lzz_p              \
+	test-ntl-lzz_pe             \
+	test-ntl-lzz_px             \
+	test-ntl-lzz_pex            \
+	test-ntl-zz_p               \
+	test-ntl-toeplitz           \
+	test-ntl-hankel             \
+	test-ntl-sylvester          \
+	test-smith-form-iliopoulos  \
+	test-toeplitz-det					
 
 if LINBOX_HAVE_NTL
-USE_NTL_TESTS = $(NTL_TESTS)
-endif
-
-if LINBOX_HAVE_GIVARO
-USE_GIVARO_TESTS = $(GIVARO_TESTS)
-endif
-
-if LINBOX_HAVE_LIDIA
-USE_LIDIA_TESTS = $(LIDIA_TESTS)
+#USE_NTL_TESTS = $(NTL_TESTS)
+USE_NTL_TESTS = \
+	test-ntl-lzz_pex            \
+	test-toeplitz-det					
 endif
 
+# if LINBOX_HAVE_SAGE
+# SAGE_LIBS = -L at libdir@ -llinboxsage
+# test_regression_LDFLAGS = $(SAGE_LIBS)
+# endif
 
-USE_ATLAS_TESTS = $(ATLAS_TESTS)
-
-
-TESTS =                               \
-        $(BASIC_TESTS)                \
-        $(USE_GIVARO_TESTS)           \
-        $(USE_NTL_TESTS)              \
-        $(USE_LIDIA_TESTS)            \
-        $(USE_NONCOMPILING_TESTS)     \
-        $(USE_FAILING_TESTS)          \
-        $(USE_ATLAS_TESTS)
-
-
-
-EXTRA_PROGRAMS = \
-        $(BASIC_TESTS)                \
-        $(GIVARO_TESTS)               \
-        $(NTL_TESTS)                  \
-        $(ATLAS_TESTS)                \
-        $(LIDIA_TESTS)                \
-        $(BENCHMARKS)                 \
-        $(NONEXISTING_TESTS)          \
-        $(NONCOMPILING_TESTS)         \
-        $(NONCOMPLIANT_TESTS)         \
-        $(DUBIOUS_TESTS)              \
-        $(FULLCHECK_TESTS)              \
-        $(FAILING_TESTS) \
-	$(BLAS3_UNIT_TESTS)
-
-
-test_commentator_SOURCES =                \
-        test-commentator.C                \
-        test-common.h
-
-test_modular_SOURCES =                        \
-        test-modular.C                        \
-        test-generic.h                        \
-        test-common.h
-
-test_blackbox_block_container_SOURCES =   \
-	test-blackbox-block-container.C    \
-	test-common.h
-
-test_solve_nonsingular_SOURCES =   \
-	test-solve-nonsingular.C   \
-	test-common.h
-
-test_block_ring_SOURCES =                 \
-        test-block-ring.C                 \
-        test-field.h                      \
-        test-common.h
-
-test_PID_integer_SOURCES =                 \
-        test-PID-integer.C                 \
-        test-field.h                      \
-        test-common.h
-
-test_hom_SOURCES =                        \
-        test-hom.C                        \
-        test-generic.h                    \
-        test-common.h
-
-test_gf2_SOURCES =                        \
-        test-gf2.C                        \
-        test-generic.h                    \
-        test-common.h
-
-test_gmp_rational_SOURCES =               \
-        test-gmp-rational.C               \
-        test-generic.h                    \
-        test-common.h
-
-test_unparametric_field_SOURCES =        \
-        test-unparametric-field.C        \
-        test-generic.h                   \
-        test-common.h
-
-test_randiter_nonzero_SOURCES =          \
-        test-randiter-nonzero.C          \
-        test-common.h
-
-test_rational_matrix_factory_SOURCES =  \
-        test-rational-matrix-factory.C  \
-        test-common.h
-
-test_rational_reconstruction_base_SOURCES =  \
-	  test-rational-reconstruction-base.C  \
-	  test-common.h
-
-test_rat_solve_SOURCES =                \
-        test-rat-solve.C                \
-        test-common.h
-
-test_rat_charpoly_SOURCES =             \
-        test-rat-charpoly.C             \
-        test-common.h
-
-test_rat_minpoly_SOURCES =              \
-        test-rat-minpoly.C              \
-        test-common.h
-
-test_subiterator_SOURCES =              \
-        test-subiterator.C              \
-        test-common.h
-
-test_subvector_SOURCES =                \
-        test-subvector.C                \
-        test-common.h
-
-test_vector_domain_SOURCES =            \
-        test-vector-domain.C            \
-        test-vector-domain.h
-
-test_matrix_domain_SOURCES =            \
-        test-matrix-domain.C            \
-        test-common.h
-
-test_dense_SOURCES =                    \
-        test-dense.C                    \
-        test-common.h
-
-test_sparse_SOURCES =                   \
-        test-sparse.C                   \
-        test-common.h
-
-test_submatrix_SOURCES =                \
-        test-submatrix.C                \
-        test-common.h
-
-test_scalar_matrix_SOURCES =            \
-        test-scalar-matrix.C            \
-        test-generic.h                  \
-        test-common.h
-
-test_bmseq_SOURCES =            \
-        test-bmseq.C            \
-        test-common.h
-
-test_butterfly_SOURCES =                \
-        test-vector-domain.h            \
-        test-blackbox.h                 \
-        test-butterfly.C                \
-        test-generic.h                  \
-        test-common.h
-
-test_charpoly_SOURCES =                 \
-        test-charpoly.C                 \
-        test-common.h
-
-test_diagonal_SOURCES =                 \
-        test-diagonal.C                 \
-        test-generic.h                  \
-        test-common.h
-
-test_sum_SOURCES =                      \
-        test-sum.C                      \
-        test-generic.h                  \
-        test-common.h
-
-test_dif_SOURCES =                          \
-        test-dif.C        test-generic.h    \
-        test-common.h
-
-test_triplesbb_SOURCES =                \
-        test-triplesbb.C                \
-        test-generic.h                  \
-        test-common.h
-
-test_hilbert_SOURCES =                        \
-        test-hilbert.C        test-generic.h        \
-        test-common.h
-
-test_ntl_toeplitz_SOURCES =                \
-        test-ntl-toeplitz.C                \
-        test-common.h
-
-test_ntl_hankel_SOURCES =                \
-        test-ntl-hankel.C                \
-        test-common.h
-
-
-test_ntl_sylvester_SOURCES =                \
-        test-ntl-sylvester.C                \
-        test-common.h
+OCL_TESTS = test-opencl-domain
 
-test_toeplitz_det_SOURCES =                \
-        test-toeplitz-det.C
-
-test_trace_SOURCES =                         \
-        test-trace.C                         \
-        test-common.h
-
-test_getentry_SOURCES =                         \
-        test-getentry.C                         \
-        test-common.h
-
-test_minpoly_SOURCES =                         \
-        test-minpoly.C                         \
-        test-common.h
-
-test_det_SOURCES =                        \
-        test-det.C                        \
-        test-common.h
-
-test_rank_SOURCES =                        \
-        test-rank.C                        \
-        test-common.h
-
-test_qlup_SOURCES =                        \
-        test-qlup.C                        \
-        test-common.h
-
-test_solve_SOURCES =                        \
-        test-solve.C                        \
-        test-common.h
-
-test_direct_sum_SOURCES =                \
-        test-direct-sum.C                \
-        test-generic.h                   \
-        test-common.h
-
-test_echelon_form_SOURCES =                \
-        test-echelon-form.C                \
-        test-common.h
-
-test_frobenius_SOURCES =                \
-        test-frobenius.C                \
-        test-generic.h                  \
-        test-common.h
-
-test_companion_SOURCES =                \
-        test-companion.C                \
-        test-generic.h                  \
-        test-common.h
-
-test_inverse_SOURCES =                        \
-        test-inverse.C                        \
-        test-common.h
-
-test_moore_penrose_SOURCES =                \
-        test-moore-penrose.C                \
-        test-common.h
-
-test_ntl_RR_SOURCES =                        \
-        test-ntl-RR.C                        \
-        test-generic.h                       \
-        test-common.h
-
-test_ntl_ZZ_p_SOURCES =                        \
-        test-ntl-ZZ_p.C                        \
-        test-generic.h                         \
-        test-common.h
-
-test_ntl_lzz_p_SOURCES =                \
-        test-ntl-lzz_p.C                \
-        test-generic.h                  \
-        test-common.h
-
-test_givaro_fields_SOURCES =                \
-        test-givaro-fields.C                \
-        test-generic.h                   \
-        test-common.h
-
-test_lidia_gfq_SOURCES =                \
-        test-lidia-gfq.C                \
-        test-generic.h                  \
-        test-common.h
-
-test_param_fuzzy_SOURCES =                \
-        test-param-fuzzy.C                \
-        test-generic.h                    \
-        test-common.h
-
-#  test_quad_matrix_SOURCES =                \
-#  test-quad-matrix.C                \
-#  test-generic-for-quad.h           \
-#  test-generic.h                    \
-#  test-common.h
-
-test_zo_SOURCES =                        \
-        test-zo.C                        \
-        test-generic.h                   \
-        test-common.h
-
-test_zero_one_SOURCES =                       \
-        test-zero-one.C                       \
-        test-generic.h                        \
-        test-common.h
-
-test_modular_int_SOURCES =                \
-        test-modular-int.C                \
-        test-common.h
-
-test_modular_short_SOURCES =                \
-        test-modular-short.C                \
-        test-generic.h                      \
-        test-common.h
-
-test_modular_double_SOURCES =                \
-        test-modular-double.C                \
-        test-generic.h                       \
-        test-common.h
-
-test_modular_float_SOURCES =                \
-        test-modular-float.C                \
-        test-generic.h                       \
-        test-common.h
-
-
-test_modular_byte_SOURCES =          \
-        test-modular-byte.C          \
-        test-generic.h               \
-        test-common.h
-
-test_modular_balanced_int_SOURCES =  \
-        test-modular-balanced-int.C  \
-        test-generic.h               \
-        test-common.h
-
-test_modular_balanced_double_SOURCES =  \
-        test-modular-balanced-double.C  \
-        test-generic.h               \
-        test-common.h
-
-test_modular_balanced_float_SOURCES =  \
-        test-modular-balanced-float.C  \
-        test-generic.h               \
-        test-common.h
-
-test_smith_form_iliopoulos_SOURCES=  \
-        test-common.h                \
-        test-smith-form-iliopoulos.C
-
-test_smith_form_binary_SOURCES=  \
-        test-common.h            \
-        test-smith-form-binary.C
-
-test_smith_form_SOURCES=    \
-        test-common.h       \
-        test-smith-form.C
-
-test_last_invariant_factor_SOURCES=    \
-        test-common.h                  \
-        test-last-invariant-factor.C
-
-test_smith_form_local_SOURCES=    \
-        test-common.h             \
-        test-smith-form-local.C
-
-test_optimization_SOURCES=    \
-        test-common.h         \
-        test-optimization.C
-
-test_nullspace_SOURCES=    \
-        test-common.h      \
-        test-nullspace.C
-
-test_bitonic_sort_SOURCES=              \
-        test-common.h                   \
-        test-bitonic-sort.C
-
-test_rational_solver_SOURCES =          \
-        test-common.h                   \
-        test-rational-solver.C
-
-test_blas_domain_SOURCES=               \
-        test-common.h                   \
-        test-blas-domain.C
-
-test_ffpack_SOURCES=                    \
-        test-common.h                   \
-        test-ffpack.C
-
-test_matrix_stream_SOURCES =            \
-        test-matrix-stream.C
-
-test_la_block_lanczos_SOURCES =         \
-        test-la-block-lanczos.C
-
-test_mg_block_lanczos_SOURCES =         \
-        test-mg-block-lanczos.C
-
-test_rational_solver_adaptive_SOURCES = \
-        test-rational-solver-adaptive.C \
-        test-common.h
-
-test_dyadic_to_rational_SOURCES = \
-        test-dyadic-to-rational.C \
-        test-common.h
-
-test_cra_SOURCES =                      \
-        test-cra.C                      \
-        test-common.h
-
-test_cradomain_SOURCES =                \
-        test-cradomain.C                \
-        test-common.h
-
-
-# NTL test
-
-test_smith_form_adaptive_SOURCES=      \
-        test-common.h                  \
-        test-smith-form-adaptive.C
-
-benchmark_fields_SOURCES=              \
-        test-common.h                  \
-        benchmark-fields.C
-
-benchmark_blas_domain_SOURCES=         \
-        test-common.h                  \
-        benchmark-blas-domain.C
-
-test_isposdef_SOURCES=                 \
-        test-common.h                  \
-        test-isposdef.C
-
-test_dense_zero_one_SOURCES=           \
-        test-blackbox.h                \
-        test-dense-zero-one.C
-
-test_ispossemidef_SOURCES=            \
-        test-common.h                 \
-        test-ispossemidef.C
-
-test_ftrmm_SOURCES =                  \
-		test-ftrmm.C
-
-test_toom_cook_SOURCES = test-toom-cook.C
+if LINBOX_HAVE_OCL
+USE_OCL_TESTS = $(OCL_TESTS)
+#AM_CPPFLAGS += $(OCL_CFLAGS)
+#LDADD += $(OCL_LIBS)
+endif
 
-#  test_integer_tools_SOURCES =          \
-#  test-integer-tools.C
+# check builds and runs these
+TESTS =                 \
+    $(BASIC_TESTS)        \
+    $(USE_NTL_TESTS)    \
+    $(USE_OCL_TESTS)
 
+# alternate definition of check target
 #check: checker
 #	checker -c
 
-# for compilation of new non-enumerated tests
-%:%.C
-	$(CXX) $(CXXFLAGS) $(AM_CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.C -o $@ $(LDADD)
-
-fullcheck: checker
-	./checker
-
-checker: checker.C
+EXTRA_PROGRAMS =		\
+	$(BASIC_TESTS)		\
+	$(NTL_TESTS)		\
+	$(FULLCHECK_TESTS) 	\
+	$(OCL_TESTS)
 
 CLEANFILES= checker               \
 			$(TESTS)              \
 			$(BASIC_TESTS)        \
-			$(FAILING_TESTS)      \
-			$(NONCOMPLIANT_TESTS) \
-			$(BENCHMARKS)         \
-			$(DUBIOUS_TESTS)      \
 			$(FULLCHECK_TESTS)      \
 			$(NTL_TESTS)          \
-			$(GIVARO_TESTS)       \
-			$(ATLAS_TESTS)
+			$(OCL_TESTS)          \
+			$(PERFPUBLISHERFILE)
+
+test_bitonic_sort_SOURCES =             test-bitonic-sort.C
+test_blackbox_block_container_SOURCES = test-blackbox-block-container.C
+test_blas_domain_SOURCES =              test-blas-domain.C
+test_blas_matrix_SOURCES =              test-blas-matrix.C
+test_block_ring_SOURCES =               test-block-ring.C
+test_block_wiedemann_SOURCES =          test-block-wiedemann.C
+test_butterfly_SOURCES = test-butterfly.C test-vector-domain.h test-blackbox.h
+test_charpoly_SOURCES =                 test-charpoly.C
+test_commentator_SOURCES =              test-commentator.C
+test_companion_SOURCES =                test-companion.C
+test_cradomain_SOURCES =                test-cradomain.C test-common.h
+test_cra_SOURCES =                      test-cra.C test-common.h
+test_dense_SOURCES =                    test-dense.C test-common.h
+test_dense_zero_one_SOURCES =           test-dense-zero-one.C
+test_det_SOURCES =                      test-det.C
+test_diagonal_SOURCES =                 test-diagonal.C
+test_dif_SOURCES =                      test-dif.C
+test_direct_sum_SOURCES =               test-direct-sum.C
+test_dyadic_to_rational_SOURCES =       test-dyadic-to-rational.C
+test_echelon_form_SOURCES =             test-echelon-form.C
+test_ffpack_SOURCES =                   test-ffpack.C
+test_fibb_SOURCES =                     test-fibb.C
+test_frobenius_SOURCES =                test-frobenius.C
+test_ftrmm_SOURCES =                    test-ftrmm.C
+test_getentry_SOURCES =                 test-getentry.C
+test_gf2_SOURCES =                      test-gf2.C
+test_givaropoly_SOURCES =               test-givaropoly.C
+test_givaro_zpz_SOURCES =               test-givaro-zpz.C
+test_givaro_zpzuns_SOURCES =            test-givaro-zpzuns.C
+test_gmp_rational_SOURCES =             test-gmp-rational.C
+test_hilbert_SOURCES =                  test-hilbert.C
+test_hom_SOURCES =                      test-hom.C
+test_image_field_SOURCES =              test-image-field.C
+test_inverse_SOURCES =                  test-inverse.C
+test_isposdef_SOURCES =                 test-isposdef.C
+test_ispossemidef_SOURCES =             test-ispossemidef.C
+test_la_block_lanczos_SOURCES =         test-la-block-lanczos.C
+test_last_invariant_factor_SOURCES =    test-last-invariant-factor.C
+test_matrix_domain_SOURCES =            test-matrix-domain.C test-common.h
+test_matrix_stream_SOURCES =            test-matrix-stream.C
+test_mg_block_lanczos_SOURCES =         test-mg-block-lanczos.C
+test_minpoly_SOURCES =                  test-minpoly.C
+test_modular_balanced_double_SOURCES =  test-modular-balanced-double.C
+test_modular_balanced_float_SOURCES =   test-modular-balanced-float.C
+test_modular_balanced_int_SOURCES =     test-modular-balanced-int.C
+test_modular_byte_SOURCES =             test-modular-byte.C
+test_modular_double_SOURCES =           test-modular-double.C
+test_modular_float_SOURCES =            test-modular-float.C
+test_modular_int_SOURCES =              test-modular-int.C
+test_modular_short_SOURCES =            test-modular-short.C
+test_modular_SOURCES =                  test-modular.C
+test_moore_penrose_SOURCES =            test-moore-penrose.C
+test_ntl_hankel_SOURCES =               test-ntl-hankel.C
+test_ntl_lzz_pe_SOURCES =               test-ntl-lzz_pe.C test-field.h
+test_ntl_lzz_pex_SOURCES =              test-ntl-lzz_pex.C test-field.h
+test_ntl_lzz_p_SOURCES =                test-ntl-lzz_p.C test-field.h
+test_ntl_lzz_px_SOURCES =               test-ntl-lzz_px.C test-field.h
+test_ntl_rr_SOURCES =                   test-ntl-rr.C
+test_ntl_sylvester_SOURCES =            test-ntl-sylvester.C
+test_ntl_toeplitz_SOURCES =             test-ntl-toeplitz.C
+test_ntl_zz_p_SOURCES =                 test-ntl-zz_p.C
+test_nullspace_SOURCES =                test-nullspace.C
+test_opencl_domain_SOURCES =            test-opencl-domain.C
+test_optimization_SOURCES =             test-optimization.C
+test_order_basis_SOURCES =              test-order-basis.C
+test_param_fuzzy_SOURCES =              test-param-fuzzy.C
+test_permutation_SOURCES =              test-permutation.C
+test_plain_domain_SOURCES =             test-plain-domain.C
+test_poly_det_SOURCES =                 test-poly-det.C
+test_qlup_SOURCES =                     test-qlup.C
+test_quad_matrix_SOURCES =              test-quad-matrix.C
+test_randiter_nonzero_SOURCES =         test-randiter-nonzero.C
+test_random_matrix_SOURCES =            test-random-matrix.C
+test_rank_Int_SOURCES =                 test-rank-Int.C test-rank.h
+test_rank_md_SOURCES =                  test-rank-md.C test-rank.h
+test_rank_u32_SOURCES =                 test-rank-u32.C test-rank.h
+test_rat_charpoly_SOURCES =             test-rat-charpoly.C test-common.h
+test_rational_matrix_factory_SOURCES =  test-rational-matrix-factory.C
+test_rational_reconstruction_base_SOURCES =  test-rational-reconstruction-base.C
+test_rational_solver_adaptive_SOURCES = test-rational-solver-adaptive.C test-common.h
+test_rational_solver_SOURCES =          test-rational-solver.C
+test_rat_minpoly_SOURCES =              test-rat-minpoly.C test-common.h
+test_rat_solve_SOURCES =                test-rat-solve.C test-common.h
+test_regression_SOURCES =               test-regression.C
+test_scalar_matrix_SOURCES =            test-scalar-matrix.C
+test_smith_form_adaptive_SOURCES =      test-smith-form-adaptive.C test-common.h
+test_smith_form_binary_SOURCES =        test-smith-form-binary.C
+test_smith_form_iliopoulos_SOURCES =    test-smith-form-iliopoulos.C
+test_smith_form_local_SOURCES =         test-smith-form-local.C
+test_smith_form_SOURCES =               test-smith-form.C
+test_solve_nonsingular_SOURCES =        test-solve-nonsingular.C
+test_solve_SOURCES =                    test-solve.C
+test_sparse_SOURCES =                   test-sparse.C test-common.h
+test_subiterator_SOURCES =              test-subiterator.C test-common.h
+test_submatrix_SOURCES =                test-submatrix.C test-common.h
+test_subvector_SOURCES =                test-subvector.C test-common.h
+test_sum_SOURCES =                      test-sum.C
+test_toeplitz_det_SOURCES =             test-toeplitz-det.C
+test_toom_cook_SOURCES =                test-toom-cook.C
+test_trace_SOURCES =                    test-trace.C
+test_transpose_SOURCES =                test-transpose.C
+test_triplesbb_omp_SOURCES =            test-triplesbb-omp.C
+test_triplesbb_SOURCES =                test-triplesbb.C
+test_tutorial_SOURCES =                 test-tutorial.C
+test_vector_domain_SOURCES =            test-vector-domain.C test-vector-domain.h
+test_zero_one_SOURCES =                 test-zero-one.C
+
+# Perfpublisher script interaction - AB 2014/12/11
+perfpublisher:
+	+./perfpublisher.sh "$(PERFPUBLISHERFILE)" "$(TESTS)" "$(CXX)"
+
+# for compilation of non-enumerated programs
+%:%.C
+	$(CXX) $(CXXFLAGS) $(AM_CPPFLAGS)  ${INCLUDES} $(AM_CPPFLAGS) $*.C -o $@ $(LDADD)
+
+fullcheck: checker
+	./checker
 
diff --git a/tests/Makefile.in b/tests/Makefile.in
deleted file mode 100644
index bd15b96..0000000
--- a/tests/Makefile.in
+++ /dev/null
@@ -1,2599 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010-2011 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-TESTS = $(am__EXEEXT_1) $(am__EXEEXT_13) $(am__EXEEXT_14) \
-	$(am__EXEEXT_15) $(am__EXEEXT_16) $(am__EXEEXT_16) \
-	$(am__EXEEXT_17)
-EXTRA_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
-	$(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6) \
-	$(am__EXEEXT_7) $(am__EXEEXT_8) $(am__EXEEXT_9) \
-	$(am__EXEEXT_10) $(am__EXEEXT_11) $(am__EXEEXT_12)
-subdir = tests
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in TODO
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am__EXEEXT_1 = test-commentator$(EXEEXT) test-det$(EXEEXT) \
-	test-frobenius$(EXEEXT) test-rank$(EXEEXT) test-solve$(EXEEXT) \
-	test-nullspace$(EXEEXT) test-smith-form-binary$(EXEEXT) \
-	test-rational-solver$(EXEEXT) \
-	test-rational-solver-adaptive$(EXEEXT) test-charpoly$(EXEEXT) \
-	test-cra$(EXEEXT)
-am__EXEEXT_2 = test-givaro-fields$(EXEEXT)
-am__EXEEXT_3 = test-smith-form$(EXEEXT) test-ntl-lzz_p$(EXEEXT) \
-	test-ntl-ZZ_p$(EXEEXT) test-ntl-toeplitz$(EXEEXT) \
-	test-ntl-hankel$(EXEEXT) test-ntl-sylvester$(EXEEXT) \
-	test-smith-form-iliopoulos$(EXEEXT) test-toeplitz-det$(EXEEXT)
-am__EXEEXT_4 = test-optimization$(EXEEXT)
-am__EXEEXT_5 = test-lidia-gfq$(EXEEXT)
-am__EXEEXT_6 = benchmark-fields$(EXEEXT) \
-	benchmark-blas-domain$(EXEEXT)
-am__EXEEXT_7 = test-dense-zero-one$(EXEEXT)
-am__EXEEXT_8 = test-ntl-RR$(EXEEXT) test-param-fuzzy$(EXEEXT)
-am__EXEEXT_9 = test-unparametric-field$(EXEEXT) test-bmseq$(EXEEXT) \
-	test-zo$(EXEEXT)
-am__EXEEXT_10 = test-bitonic-sort$(EXEEXT) \
-	test-blackbox-block-container$(EXEEXT) \
-	test-blas-domain$(EXEEXT) test-butterfly$(EXEEXT) \
-	test-companion$(EXEEXT) test-dense$(EXEEXT) \
-	test-diagonal$(EXEEXT) test-dif$(EXEEXT) \
-	test-direct-sum$(EXEEXT) test-echelon-form$(EXEEXT) \
-	test-ffpack$(EXEEXT) test-getentry$(EXEEXT) test-gf2$(EXEEXT) \
-	test-gmp-rational$(EXEEXT) test-hilbert$(EXEEXT) \
-	test-hom$(EXEEXT) test-inverse$(EXEEXT) test-isposdef$(EXEEXT) \
-	test-ispossemidef$(EXEEXT) test-matrix-domain$(EXEEXT) \
-	test-matrix-stream$(EXEEXT) test-minpoly$(EXEEXT) \
-	test-modular$(EXEEXT) test-modular-balanced-int$(EXEEXT) \
-	test-modular-balanced-float$(EXEEXT) \
-	test-modular-balanced-double$(EXEEXT) \
-	test-modular-byte$(EXEEXT) test-modular-double$(EXEEXT) \
-	test-modular-float$(EXEEXT) test-modular-int$(EXEEXT) \
-	test-modular-short$(EXEEXT) test-block-ring$(EXEEXT) \
-	test-PID-integer$(EXEEXT) test-moore-penrose$(EXEEXT) \
-	test-randiter-nonzero$(EXEEXT) \
-	test-rational-matrix-factory$(EXEEXT) \
-	test-scalar-matrix$(EXEEXT) test-solve-nonsingular$(EXEEXT) \
-	test-sparse$(EXEEXT) test-subiterator$(EXEEXT) \
-	test-submatrix$(EXEEXT) test-subvector$(EXEEXT) \
-	test-sum$(EXEEXT) test-trace$(EXEEXT) test-triplesbb$(EXEEXT) \
-	test-vector-domain$(EXEEXT) test-qlup$(EXEEXT) \
-	test-zero-one$(EXEEXT) test-last-invariant-factor$(EXEEXT) \
-	test-cradomain$(EXEEXT) \
-	test-rational-reconstruction-base$(EXEEXT)
-am__EXEEXT_11 = test-rat-charpoly$(EXEEXT) test-rat-solve$(EXEEXT) \
-	test-rat-minpoly$(EXEEXT) test-smith-form-local$(EXEEXT) \
-	test-smith-form-adaptive$(EXEEXT) \
-	test-dyadic-to-rational$(EXEEXT) \
-	test-mg-block-lanczos$(EXEEXT) test-ftrmm$(EXEEXT) \
-	test-la-block-lanczos$(EXEEXT)
-am__EXEEXT_12 = test-toom-cook$(EXEEXT)
-am_benchmark_blas_domain_OBJECTS = benchmark-blas-domain.$(OBJEXT)
-benchmark_blas_domain_OBJECTS = $(am_benchmark_blas_domain_OBJECTS)
-benchmark_blas_domain_LDADD = $(LDADD)
-am__DEPENDENCIES_1 =
-benchmark_blas_domain_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_benchmark_fields_OBJECTS = benchmark-fields.$(OBJEXT)
-benchmark_fields_OBJECTS = $(am_benchmark_fields_OBJECTS)
-benchmark_fields_LDADD = $(LDADD)
-benchmark_fields_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_PID_integer_OBJECTS = test-PID-integer.$(OBJEXT)
-test_PID_integer_OBJECTS = $(am_test_PID_integer_OBJECTS)
-test_PID_integer_LDADD = $(LDADD)
-test_PID_integer_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_bitonic_sort_OBJECTS = test-bitonic-sort.$(OBJEXT)
-test_bitonic_sort_OBJECTS = $(am_test_bitonic_sort_OBJECTS)
-test_bitonic_sort_LDADD = $(LDADD)
-test_bitonic_sort_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_blackbox_block_container_OBJECTS =  \
-	test-blackbox-block-container.$(OBJEXT)
-test_blackbox_block_container_OBJECTS =  \
-	$(am_test_blackbox_block_container_OBJECTS)
-test_blackbox_block_container_LDADD = $(LDADD)
-test_blackbox_block_container_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_blas_domain_OBJECTS = test-blas-domain.$(OBJEXT)
-test_blas_domain_OBJECTS = $(am_test_blas_domain_OBJECTS)
-test_blas_domain_LDADD = $(LDADD)
-test_blas_domain_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_block_ring_OBJECTS = test-block-ring.$(OBJEXT)
-test_block_ring_OBJECTS = $(am_test_block_ring_OBJECTS)
-test_block_ring_LDADD = $(LDADD)
-test_block_ring_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_bmseq_OBJECTS = test-bmseq.$(OBJEXT)
-test_bmseq_OBJECTS = $(am_test_bmseq_OBJECTS)
-test_bmseq_LDADD = $(LDADD)
-test_bmseq_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_test_butterfly_OBJECTS = test-butterfly.$(OBJEXT)
-test_butterfly_OBJECTS = $(am_test_butterfly_OBJECTS)
-test_butterfly_LDADD = $(LDADD)
-test_butterfly_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_charpoly_OBJECTS = test-charpoly.$(OBJEXT)
-test_charpoly_OBJECTS = $(am_test_charpoly_OBJECTS)
-test_charpoly_LDADD = $(LDADD)
-test_charpoly_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_commentator_OBJECTS = test-commentator.$(OBJEXT)
-test_commentator_OBJECTS = $(am_test_commentator_OBJECTS)
-test_commentator_LDADD = $(LDADD)
-test_commentator_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_companion_OBJECTS = test-companion.$(OBJEXT)
-test_companion_OBJECTS = $(am_test_companion_OBJECTS)
-test_companion_LDADD = $(LDADD)
-test_companion_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_cra_OBJECTS = test-cra.$(OBJEXT)
-test_cra_OBJECTS = $(am_test_cra_OBJECTS)
-test_cra_LDADD = $(LDADD)
-test_cra_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_test_cradomain_OBJECTS = test-cradomain.$(OBJEXT)
-test_cradomain_OBJECTS = $(am_test_cradomain_OBJECTS)
-test_cradomain_LDADD = $(LDADD)
-test_cradomain_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_dense_OBJECTS = test-dense.$(OBJEXT)
-test_dense_OBJECTS = $(am_test_dense_OBJECTS)
-test_dense_LDADD = $(LDADD)
-test_dense_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_test_dense_zero_one_OBJECTS = test-dense-zero-one.$(OBJEXT)
-test_dense_zero_one_OBJECTS = $(am_test_dense_zero_one_OBJECTS)
-test_dense_zero_one_LDADD = $(LDADD)
-test_dense_zero_one_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_det_OBJECTS = test-det.$(OBJEXT)
-test_det_OBJECTS = $(am_test_det_OBJECTS)
-test_det_LDADD = $(LDADD)
-test_det_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_test_diagonal_OBJECTS = test-diagonal.$(OBJEXT)
-test_diagonal_OBJECTS = $(am_test_diagonal_OBJECTS)
-test_diagonal_LDADD = $(LDADD)
-test_diagonal_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_dif_OBJECTS = test-dif.$(OBJEXT)
-test_dif_OBJECTS = $(am_test_dif_OBJECTS)
-test_dif_LDADD = $(LDADD)
-test_dif_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_test_direct_sum_OBJECTS = test-direct-sum.$(OBJEXT)
-test_direct_sum_OBJECTS = $(am_test_direct_sum_OBJECTS)
-test_direct_sum_LDADD = $(LDADD)
-test_direct_sum_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_dyadic_to_rational_OBJECTS =  \
-	test-dyadic-to-rational.$(OBJEXT)
-test_dyadic_to_rational_OBJECTS =  \
-	$(am_test_dyadic_to_rational_OBJECTS)
-test_dyadic_to_rational_LDADD = $(LDADD)
-test_dyadic_to_rational_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_echelon_form_OBJECTS = test-echelon-form.$(OBJEXT)
-test_echelon_form_OBJECTS = $(am_test_echelon_form_OBJECTS)
-test_echelon_form_LDADD = $(LDADD)
-test_echelon_form_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_ffpack_OBJECTS = test-ffpack.$(OBJEXT)
-test_ffpack_OBJECTS = $(am_test_ffpack_OBJECTS)
-test_ffpack_LDADD = $(LDADD)
-test_ffpack_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_test_frobenius_OBJECTS = test-frobenius.$(OBJEXT)
-test_frobenius_OBJECTS = $(am_test_frobenius_OBJECTS)
-test_frobenius_LDADD = $(LDADD)
-test_frobenius_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_ftrmm_OBJECTS = test-ftrmm.$(OBJEXT)
-test_ftrmm_OBJECTS = $(am_test_ftrmm_OBJECTS)
-test_ftrmm_LDADD = $(LDADD)
-test_ftrmm_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_test_getentry_OBJECTS = test-getentry.$(OBJEXT)
-test_getentry_OBJECTS = $(am_test_getentry_OBJECTS)
-test_getentry_LDADD = $(LDADD)
-test_getentry_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_gf2_OBJECTS = test-gf2.$(OBJEXT)
-test_gf2_OBJECTS = $(am_test_gf2_OBJECTS)
-test_gf2_LDADD = $(LDADD)
-test_gf2_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_test_givaro_fields_OBJECTS = test-givaro-fields.$(OBJEXT)
-test_givaro_fields_OBJECTS = $(am_test_givaro_fields_OBJECTS)
-test_givaro_fields_LDADD = $(LDADD)
-test_givaro_fields_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_gmp_rational_OBJECTS = test-gmp-rational.$(OBJEXT)
-test_gmp_rational_OBJECTS = $(am_test_gmp_rational_OBJECTS)
-test_gmp_rational_LDADD = $(LDADD)
-test_gmp_rational_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_hilbert_OBJECTS = test-hilbert.$(OBJEXT)
-test_hilbert_OBJECTS = $(am_test_hilbert_OBJECTS)
-test_hilbert_LDADD = $(LDADD)
-test_hilbert_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_hom_OBJECTS = test-hom.$(OBJEXT)
-test_hom_OBJECTS = $(am_test_hom_OBJECTS)
-test_hom_LDADD = $(LDADD)
-test_hom_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_test_inverse_OBJECTS = test-inverse.$(OBJEXT)
-test_inverse_OBJECTS = $(am_test_inverse_OBJECTS)
-test_inverse_LDADD = $(LDADD)
-test_inverse_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_isposdef_OBJECTS = test-isposdef.$(OBJEXT)
-test_isposdef_OBJECTS = $(am_test_isposdef_OBJECTS)
-test_isposdef_LDADD = $(LDADD)
-test_isposdef_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_ispossemidef_OBJECTS = test-ispossemidef.$(OBJEXT)
-test_ispossemidef_OBJECTS = $(am_test_ispossemidef_OBJECTS)
-test_ispossemidef_LDADD = $(LDADD)
-test_ispossemidef_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_la_block_lanczos_OBJECTS = test-la-block-lanczos.$(OBJEXT)
-test_la_block_lanczos_OBJECTS = $(am_test_la_block_lanczos_OBJECTS)
-test_la_block_lanczos_LDADD = $(LDADD)
-test_la_block_lanczos_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_last_invariant_factor_OBJECTS =  \
-	test-last-invariant-factor.$(OBJEXT)
-test_last_invariant_factor_OBJECTS =  \
-	$(am_test_last_invariant_factor_OBJECTS)
-test_last_invariant_factor_LDADD = $(LDADD)
-test_last_invariant_factor_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_lidia_gfq_OBJECTS = test-lidia-gfq.$(OBJEXT)
-test_lidia_gfq_OBJECTS = $(am_test_lidia_gfq_OBJECTS)
-test_lidia_gfq_LDADD = $(LDADD)
-test_lidia_gfq_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_matrix_domain_OBJECTS = test-matrix-domain.$(OBJEXT)
-test_matrix_domain_OBJECTS = $(am_test_matrix_domain_OBJECTS)
-test_matrix_domain_LDADD = $(LDADD)
-test_matrix_domain_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_matrix_stream_OBJECTS = test-matrix-stream.$(OBJEXT)
-test_matrix_stream_OBJECTS = $(am_test_matrix_stream_OBJECTS)
-test_matrix_stream_LDADD = $(LDADD)
-test_matrix_stream_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_mg_block_lanczos_OBJECTS = test-mg-block-lanczos.$(OBJEXT)
-test_mg_block_lanczos_OBJECTS = $(am_test_mg_block_lanczos_OBJECTS)
-test_mg_block_lanczos_LDADD = $(LDADD)
-test_mg_block_lanczos_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_minpoly_OBJECTS = test-minpoly.$(OBJEXT)
-test_minpoly_OBJECTS = $(am_test_minpoly_OBJECTS)
-test_minpoly_LDADD = $(LDADD)
-test_minpoly_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_modular_OBJECTS = test-modular.$(OBJEXT)
-test_modular_OBJECTS = $(am_test_modular_OBJECTS)
-test_modular_LDADD = $(LDADD)
-test_modular_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_modular_balanced_double_OBJECTS =  \
-	test-modular-balanced-double.$(OBJEXT)
-test_modular_balanced_double_OBJECTS =  \
-	$(am_test_modular_balanced_double_OBJECTS)
-test_modular_balanced_double_LDADD = $(LDADD)
-test_modular_balanced_double_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_modular_balanced_float_OBJECTS =  \
-	test-modular-balanced-float.$(OBJEXT)
-test_modular_balanced_float_OBJECTS =  \
-	$(am_test_modular_balanced_float_OBJECTS)
-test_modular_balanced_float_LDADD = $(LDADD)
-test_modular_balanced_float_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_modular_balanced_int_OBJECTS =  \
-	test-modular-balanced-int.$(OBJEXT)
-test_modular_balanced_int_OBJECTS =  \
-	$(am_test_modular_balanced_int_OBJECTS)
-test_modular_balanced_int_LDADD = $(LDADD)
-test_modular_balanced_int_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_modular_byte_OBJECTS = test-modular-byte.$(OBJEXT)
-test_modular_byte_OBJECTS = $(am_test_modular_byte_OBJECTS)
-test_modular_byte_LDADD = $(LDADD)
-test_modular_byte_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_modular_double_OBJECTS = test-modular-double.$(OBJEXT)
-test_modular_double_OBJECTS = $(am_test_modular_double_OBJECTS)
-test_modular_double_LDADD = $(LDADD)
-test_modular_double_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_modular_float_OBJECTS = test-modular-float.$(OBJEXT)
-test_modular_float_OBJECTS = $(am_test_modular_float_OBJECTS)
-test_modular_float_LDADD = $(LDADD)
-test_modular_float_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_modular_int_OBJECTS = test-modular-int.$(OBJEXT)
-test_modular_int_OBJECTS = $(am_test_modular_int_OBJECTS)
-test_modular_int_LDADD = $(LDADD)
-test_modular_int_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_modular_short_OBJECTS = test-modular-short.$(OBJEXT)
-test_modular_short_OBJECTS = $(am_test_modular_short_OBJECTS)
-test_modular_short_LDADD = $(LDADD)
-test_modular_short_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_moore_penrose_OBJECTS = test-moore-penrose.$(OBJEXT)
-test_moore_penrose_OBJECTS = $(am_test_moore_penrose_OBJECTS)
-test_moore_penrose_LDADD = $(LDADD)
-test_moore_penrose_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_ntl_RR_OBJECTS = test-ntl-RR.$(OBJEXT)
-test_ntl_RR_OBJECTS = $(am_test_ntl_RR_OBJECTS)
-test_ntl_RR_LDADD = $(LDADD)
-test_ntl_RR_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_test_ntl_ZZ_p_OBJECTS = test-ntl-ZZ_p.$(OBJEXT)
-test_ntl_ZZ_p_OBJECTS = $(am_test_ntl_ZZ_p_OBJECTS)
-test_ntl_ZZ_p_LDADD = $(LDADD)
-test_ntl_ZZ_p_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_ntl_hankel_OBJECTS = test-ntl-hankel.$(OBJEXT)
-test_ntl_hankel_OBJECTS = $(am_test_ntl_hankel_OBJECTS)
-test_ntl_hankel_LDADD = $(LDADD)
-test_ntl_hankel_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_ntl_lzz_p_OBJECTS = test-ntl-lzz_p.$(OBJEXT)
-test_ntl_lzz_p_OBJECTS = $(am_test_ntl_lzz_p_OBJECTS)
-test_ntl_lzz_p_LDADD = $(LDADD)
-test_ntl_lzz_p_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_ntl_sylvester_OBJECTS = test-ntl-sylvester.$(OBJEXT)
-test_ntl_sylvester_OBJECTS = $(am_test_ntl_sylvester_OBJECTS)
-test_ntl_sylvester_LDADD = $(LDADD)
-test_ntl_sylvester_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_ntl_toeplitz_OBJECTS = test-ntl-toeplitz.$(OBJEXT)
-test_ntl_toeplitz_OBJECTS = $(am_test_ntl_toeplitz_OBJECTS)
-test_ntl_toeplitz_LDADD = $(LDADD)
-test_ntl_toeplitz_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_nullspace_OBJECTS = test-nullspace.$(OBJEXT)
-test_nullspace_OBJECTS = $(am_test_nullspace_OBJECTS)
-test_nullspace_LDADD = $(LDADD)
-test_nullspace_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_optimization_OBJECTS = test-optimization.$(OBJEXT)
-test_optimization_OBJECTS = $(am_test_optimization_OBJECTS)
-test_optimization_LDADD = $(LDADD)
-test_optimization_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_param_fuzzy_OBJECTS = test-param-fuzzy.$(OBJEXT)
-test_param_fuzzy_OBJECTS = $(am_test_param_fuzzy_OBJECTS)
-test_param_fuzzy_LDADD = $(LDADD)
-test_param_fuzzy_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_qlup_OBJECTS = test-qlup.$(OBJEXT)
-test_qlup_OBJECTS = $(am_test_qlup_OBJECTS)
-test_qlup_LDADD = $(LDADD)
-test_qlup_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_test_randiter_nonzero_OBJECTS = test-randiter-nonzero.$(OBJEXT)
-test_randiter_nonzero_OBJECTS = $(am_test_randiter_nonzero_OBJECTS)
-test_randiter_nonzero_LDADD = $(LDADD)
-test_randiter_nonzero_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_rank_OBJECTS = test-rank.$(OBJEXT)
-test_rank_OBJECTS = $(am_test_rank_OBJECTS)
-test_rank_LDADD = $(LDADD)
-test_rank_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_test_rat_charpoly_OBJECTS = test-rat-charpoly.$(OBJEXT)
-test_rat_charpoly_OBJECTS = $(am_test_rat_charpoly_OBJECTS)
-test_rat_charpoly_LDADD = $(LDADD)
-test_rat_charpoly_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_rat_minpoly_OBJECTS = test-rat-minpoly.$(OBJEXT)
-test_rat_minpoly_OBJECTS = $(am_test_rat_minpoly_OBJECTS)
-test_rat_minpoly_LDADD = $(LDADD)
-test_rat_minpoly_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_rat_solve_OBJECTS = test-rat-solve.$(OBJEXT)
-test_rat_solve_OBJECTS = $(am_test_rat_solve_OBJECTS)
-test_rat_solve_LDADD = $(LDADD)
-test_rat_solve_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_rational_matrix_factory_OBJECTS =  \
-	test-rational-matrix-factory.$(OBJEXT)
-test_rational_matrix_factory_OBJECTS =  \
-	$(am_test_rational_matrix_factory_OBJECTS)
-test_rational_matrix_factory_LDADD = $(LDADD)
-test_rational_matrix_factory_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_rational_reconstruction_base_OBJECTS =  \
-	test-rational-reconstruction-base.$(OBJEXT)
-test_rational_reconstruction_base_OBJECTS =  \
-	$(am_test_rational_reconstruction_base_OBJECTS)
-test_rational_reconstruction_base_LDADD = $(LDADD)
-test_rational_reconstruction_base_DEPENDENCIES =  \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_test_rational_solver_OBJECTS = test-rational-solver.$(OBJEXT)
-test_rational_solver_OBJECTS = $(am_test_rational_solver_OBJECTS)
-test_rational_solver_LDADD = $(LDADD)
-test_rational_solver_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_rational_solver_adaptive_OBJECTS =  \
-	test-rational-solver-adaptive.$(OBJEXT)
-test_rational_solver_adaptive_OBJECTS =  \
-	$(am_test_rational_solver_adaptive_OBJECTS)
-test_rational_solver_adaptive_LDADD = $(LDADD)
-test_rational_solver_adaptive_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_scalar_matrix_OBJECTS = test-scalar-matrix.$(OBJEXT)
-test_scalar_matrix_OBJECTS = $(am_test_scalar_matrix_OBJECTS)
-test_scalar_matrix_LDADD = $(LDADD)
-test_scalar_matrix_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_smith_form_OBJECTS = test-smith-form.$(OBJEXT)
-test_smith_form_OBJECTS = $(am_test_smith_form_OBJECTS)
-test_smith_form_LDADD = $(LDADD)
-test_smith_form_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_smith_form_adaptive_OBJECTS =  \
-	test-smith-form-adaptive.$(OBJEXT)
-test_smith_form_adaptive_OBJECTS =  \
-	$(am_test_smith_form_adaptive_OBJECTS)
-test_smith_form_adaptive_LDADD = $(LDADD)
-test_smith_form_adaptive_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_smith_form_binary_OBJECTS = test-smith-form-binary.$(OBJEXT)
-test_smith_form_binary_OBJECTS = $(am_test_smith_form_binary_OBJECTS)
-test_smith_form_binary_LDADD = $(LDADD)
-test_smith_form_binary_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_smith_form_iliopoulos_OBJECTS =  \
-	test-smith-form-iliopoulos.$(OBJEXT)
-test_smith_form_iliopoulos_OBJECTS =  \
-	$(am_test_smith_form_iliopoulos_OBJECTS)
-test_smith_form_iliopoulos_LDADD = $(LDADD)
-test_smith_form_iliopoulos_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_smith_form_local_OBJECTS = test-smith-form-local.$(OBJEXT)
-test_smith_form_local_OBJECTS = $(am_test_smith_form_local_OBJECTS)
-test_smith_form_local_LDADD = $(LDADD)
-test_smith_form_local_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_solve_OBJECTS = test-solve.$(OBJEXT)
-test_solve_OBJECTS = $(am_test_solve_OBJECTS)
-test_solve_LDADD = $(LDADD)
-test_solve_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_test_solve_nonsingular_OBJECTS = test-solve-nonsingular.$(OBJEXT)
-test_solve_nonsingular_OBJECTS = $(am_test_solve_nonsingular_OBJECTS)
-test_solve_nonsingular_LDADD = $(LDADD)
-test_solve_nonsingular_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_sparse_OBJECTS = test-sparse.$(OBJEXT)
-test_sparse_OBJECTS = $(am_test_sparse_OBJECTS)
-test_sparse_LDADD = $(LDADD)
-test_sparse_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_test_subiterator_OBJECTS = test-subiterator.$(OBJEXT)
-test_subiterator_OBJECTS = $(am_test_subiterator_OBJECTS)
-test_subiterator_LDADD = $(LDADD)
-test_subiterator_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_submatrix_OBJECTS = test-submatrix.$(OBJEXT)
-test_submatrix_OBJECTS = $(am_test_submatrix_OBJECTS)
-test_submatrix_LDADD = $(LDADD)
-test_submatrix_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_subvector_OBJECTS = test-subvector.$(OBJEXT)
-test_subvector_OBJECTS = $(am_test_subvector_OBJECTS)
-test_subvector_LDADD = $(LDADD)
-test_subvector_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_sum_OBJECTS = test-sum.$(OBJEXT)
-test_sum_OBJECTS = $(am_test_sum_OBJECTS)
-test_sum_LDADD = $(LDADD)
-test_sum_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_test_toeplitz_det_OBJECTS = test-toeplitz-det.$(OBJEXT)
-test_toeplitz_det_OBJECTS = $(am_test_toeplitz_det_OBJECTS)
-test_toeplitz_det_LDADD = $(LDADD)
-test_toeplitz_det_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_toom_cook_OBJECTS = test-toom-cook.$(OBJEXT)
-test_toom_cook_OBJECTS = $(am_test_toom_cook_OBJECTS)
-test_toom_cook_LDADD = $(LDADD)
-test_toom_cook_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_trace_OBJECTS = test-trace.$(OBJEXT)
-test_trace_OBJECTS = $(am_test_trace_OBJECTS)
-test_trace_LDADD = $(LDADD)
-test_trace_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-am_test_triplesbb_OBJECTS = test-triplesbb.$(OBJEXT)
-test_triplesbb_OBJECTS = $(am_test_triplesbb_OBJECTS)
-test_triplesbb_LDADD = $(LDADD)
-test_triplesbb_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_unparametric_field_OBJECTS =  \
-	test-unparametric-field.$(OBJEXT)
-test_unparametric_field_OBJECTS =  \
-	$(am_test_unparametric_field_OBJECTS)
-test_unparametric_field_LDADD = $(LDADD)
-test_unparametric_field_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_vector_domain_OBJECTS = test-vector-domain.$(OBJEXT)
-test_vector_domain_OBJECTS = $(am_test_vector_domain_OBJECTS)
-test_vector_domain_LDADD = $(LDADD)
-test_vector_domain_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_zero_one_OBJECTS = test-zero-one.$(OBJEXT)
-test_zero_one_OBJECTS = $(am_test_zero_one_OBJECTS)
-test_zero_one_LDADD = $(LDADD)
-test_zero_one_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_test_zo_OBJECTS = test-zo.$(OBJEXT)
-test_zo_OBJECTS = $(am_test_zo_OBJECTS)
-test_zo_LDADD = $(LDADD)
-test_zo_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
-depcomp =
-am__depfiles_maybe =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = $(benchmark_blas_domain_SOURCES) $(benchmark_fields_SOURCES) \
-	$(test_PID_integer_SOURCES) $(test_bitonic_sort_SOURCES) \
-	$(test_blackbox_block_container_SOURCES) \
-	$(test_blas_domain_SOURCES) $(test_block_ring_SOURCES) \
-	$(test_bmseq_SOURCES) $(test_butterfly_SOURCES) \
-	$(test_charpoly_SOURCES) $(test_commentator_SOURCES) \
-	$(test_companion_SOURCES) $(test_cra_SOURCES) \
-	$(test_cradomain_SOURCES) $(test_dense_SOURCES) \
-	$(test_dense_zero_one_SOURCES) $(test_det_SOURCES) \
-	$(test_diagonal_SOURCES) $(test_dif_SOURCES) \
-	$(test_direct_sum_SOURCES) $(test_dyadic_to_rational_SOURCES) \
-	$(test_echelon_form_SOURCES) $(test_ffpack_SOURCES) \
-	$(test_frobenius_SOURCES) $(test_ftrmm_SOURCES) \
-	$(test_getentry_SOURCES) $(test_gf2_SOURCES) \
-	$(test_givaro_fields_SOURCES) $(test_gmp_rational_SOURCES) \
-	$(test_hilbert_SOURCES) $(test_hom_SOURCES) \
-	$(test_inverse_SOURCES) $(test_isposdef_SOURCES) \
-	$(test_ispossemidef_SOURCES) $(test_la_block_lanczos_SOURCES) \
-	$(test_last_invariant_factor_SOURCES) \
-	$(test_lidia_gfq_SOURCES) $(test_matrix_domain_SOURCES) \
-	$(test_matrix_stream_SOURCES) $(test_mg_block_lanczos_SOURCES) \
-	$(test_minpoly_SOURCES) $(test_modular_SOURCES) \
-	$(test_modular_balanced_double_SOURCES) \
-	$(test_modular_balanced_float_SOURCES) \
-	$(test_modular_balanced_int_SOURCES) \
-	$(test_modular_byte_SOURCES) $(test_modular_double_SOURCES) \
-	$(test_modular_float_SOURCES) $(test_modular_int_SOURCES) \
-	$(test_modular_short_SOURCES) $(test_moore_penrose_SOURCES) \
-	$(test_ntl_RR_SOURCES) $(test_ntl_ZZ_p_SOURCES) \
-	$(test_ntl_hankel_SOURCES) $(test_ntl_lzz_p_SOURCES) \
-	$(test_ntl_sylvester_SOURCES) $(test_ntl_toeplitz_SOURCES) \
-	$(test_nullspace_SOURCES) $(test_optimization_SOURCES) \
-	$(test_param_fuzzy_SOURCES) $(test_qlup_SOURCES) \
-	$(test_randiter_nonzero_SOURCES) $(test_rank_SOURCES) \
-	$(test_rat_charpoly_SOURCES) $(test_rat_minpoly_SOURCES) \
-	$(test_rat_solve_SOURCES) \
-	$(test_rational_matrix_factory_SOURCES) \
-	$(test_rational_reconstruction_base_SOURCES) \
-	$(test_rational_solver_SOURCES) \
-	$(test_rational_solver_adaptive_SOURCES) \
-	$(test_scalar_matrix_SOURCES) $(test_smith_form_SOURCES) \
-	$(test_smith_form_adaptive_SOURCES) \
-	$(test_smith_form_binary_SOURCES) \
-	$(test_smith_form_iliopoulos_SOURCES) \
-	$(test_smith_form_local_SOURCES) $(test_solve_SOURCES) \
-	$(test_solve_nonsingular_SOURCES) $(test_sparse_SOURCES) \
-	$(test_subiterator_SOURCES) $(test_submatrix_SOURCES) \
-	$(test_subvector_SOURCES) $(test_sum_SOURCES) \
-	$(test_toeplitz_det_SOURCES) $(test_toom_cook_SOURCES) \
-	$(test_trace_SOURCES) $(test_triplesbb_SOURCES) \
-	$(test_unparametric_field_SOURCES) \
-	$(test_vector_domain_SOURCES) $(test_zero_one_SOURCES) \
-	$(test_zo_SOURCES)
-DIST_SOURCES = $(benchmark_blas_domain_SOURCES) \
-	$(benchmark_fields_SOURCES) $(test_PID_integer_SOURCES) \
-	$(test_bitonic_sort_SOURCES) \
-	$(test_blackbox_block_container_SOURCES) \
-	$(test_blas_domain_SOURCES) $(test_block_ring_SOURCES) \
-	$(test_bmseq_SOURCES) $(test_butterfly_SOURCES) \
-	$(test_charpoly_SOURCES) $(test_commentator_SOURCES) \
-	$(test_companion_SOURCES) $(test_cra_SOURCES) \
-	$(test_cradomain_SOURCES) $(test_dense_SOURCES) \
-	$(test_dense_zero_one_SOURCES) $(test_det_SOURCES) \
-	$(test_diagonal_SOURCES) $(test_dif_SOURCES) \
-	$(test_direct_sum_SOURCES) $(test_dyadic_to_rational_SOURCES) \
-	$(test_echelon_form_SOURCES) $(test_ffpack_SOURCES) \
-	$(test_frobenius_SOURCES) $(test_ftrmm_SOURCES) \
-	$(test_getentry_SOURCES) $(test_gf2_SOURCES) \
-	$(test_givaro_fields_SOURCES) $(test_gmp_rational_SOURCES) \
-	$(test_hilbert_SOURCES) $(test_hom_SOURCES) \
-	$(test_inverse_SOURCES) $(test_isposdef_SOURCES) \
-	$(test_ispossemidef_SOURCES) $(test_la_block_lanczos_SOURCES) \
-	$(test_last_invariant_factor_SOURCES) \
-	$(test_lidia_gfq_SOURCES) $(test_matrix_domain_SOURCES) \
-	$(test_matrix_stream_SOURCES) $(test_mg_block_lanczos_SOURCES) \
-	$(test_minpoly_SOURCES) $(test_modular_SOURCES) \
-	$(test_modular_balanced_double_SOURCES) \
-	$(test_modular_balanced_float_SOURCES) \
-	$(test_modular_balanced_int_SOURCES) \
-	$(test_modular_byte_SOURCES) $(test_modular_double_SOURCES) \
-	$(test_modular_float_SOURCES) $(test_modular_int_SOURCES) \
-	$(test_modular_short_SOURCES) $(test_moore_penrose_SOURCES) \
-	$(test_ntl_RR_SOURCES) $(test_ntl_ZZ_p_SOURCES) \
-	$(test_ntl_hankel_SOURCES) $(test_ntl_lzz_p_SOURCES) \
-	$(test_ntl_sylvester_SOURCES) $(test_ntl_toeplitz_SOURCES) \
-	$(test_nullspace_SOURCES) $(test_optimization_SOURCES) \
-	$(test_param_fuzzy_SOURCES) $(test_qlup_SOURCES) \
-	$(test_randiter_nonzero_SOURCES) $(test_rank_SOURCES) \
-	$(test_rat_charpoly_SOURCES) $(test_rat_minpoly_SOURCES) \
-	$(test_rat_solve_SOURCES) \
-	$(test_rational_matrix_factory_SOURCES) \
-	$(test_rational_reconstruction_base_SOURCES) \
-	$(test_rational_solver_SOURCES) \
-	$(test_rational_solver_adaptive_SOURCES) \
-	$(test_scalar_matrix_SOURCES) $(test_smith_form_SOURCES) \
-	$(test_smith_form_adaptive_SOURCES) \
-	$(test_smith_form_binary_SOURCES) \
-	$(test_smith_form_iliopoulos_SOURCES) \
-	$(test_smith_form_local_SOURCES) $(test_solve_SOURCES) \
-	$(test_solve_nonsingular_SOURCES) $(test_sparse_SOURCES) \
-	$(test_subiterator_SOURCES) $(test_submatrix_SOURCES) \
-	$(test_subvector_SOURCES) $(test_sum_SOURCES) \
-	$(test_toeplitz_det_SOURCES) $(test_toom_cook_SOURCES) \
-	$(test_trace_SOURCES) $(test_triplesbb_SOURCES) \
-	$(test_unparametric_field_SOURCES) \
-	$(test_vector_domain_SOURCES) $(test_zero_one_SOURCES) \
-	$(test_zo_SOURCES)
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-dvi-recursive install-exec-recursive \
-	install-html-recursive install-info-recursive \
-	install-pdf-recursive install-ps-recursive install-recursive \
-	installcheck-recursive installdirs-recursive pdf-recursive \
-	ps-recursive uninstall-recursive
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
-  distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
-	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
-	distdir
-ETAGS = etags
-CTAGS = ctags
-am__tty_colors = \
-red=; grn=; lgn=; blu=; std=
- at LINBOX_HAVE_GIVARO_TRUE@am__EXEEXT_13 = $(am__EXEEXT_2)
- at LINBOX_HAVE_NTL_TRUE@am__EXEEXT_14 = $(am__EXEEXT_3)
- at LINBOX_HAVE_LIDIA_TRUE@am__EXEEXT_15 = $(am__EXEEXT_5)
-am__EXEEXT_16 =
-am__EXEEXT_17 = $(am__EXEEXT_4)
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/linbox $(CBLAS_FLAG) \
-	$(FFLAS_FFPACK_CFLAGS) $(GMP_CFLAGS) $(NTL_CFLAGS) \
-	$(GIVARO_CFLAGS) $(LIDIA_CFLAGS) $(IML_CFLAGS)
-# AM_LDFLAGS = -llapack -lcblas -latlas
-AM_LDFLAGS = $(top_srcdir)/linbox/.libs/liblinbox.a
-#  SAFER_FLAGS = -g -Wall -Wextra -Wno-unused-parameter
-# bds: no need to optimize for unit/regression tests, and opt adds a lot to compilation time
-#AM_CXXFLAGS = @TESTS_CFLAGS@ -DLinBoxSrcOnly
-#  AM_CXXFLAGS = $(SAFER_FLAGS) -DLinBoxSrcOnly
-#AM_CXXFLAGS = $(SAFER_FLAGS) -DLinBoxSrcOnly -O2
-#  AM_CXXFLAGS = -g -DLinBoxSrcOnly -Wall -DDEBUG -O0
-AM_CXXFLAGS = -DLinBoxSrcOnly  @TESTS_CFLAGS@ @DEBUG_CFLAGS@
-# AM_CXXFLAGS = -g -DLinBoxSrcOnly -Wall -D__LINBOX_HAVE_DGETRF -D__LINBOX_HAVE_DGETRI
-# AM_CFLAGS = -g -Wall
-SUBDIRS = data matrix
-LDADD = $(GIVARO_LIBS) $(BLAS_LIBS) $(NTL_LIBS)  $(GMP_LIBS) $(LIDIA_LIBS) $(MPFR_LIBS) $(FPLLL_LIBS)  $(IML_LIBS) $(LDFLAGS)
-#  AM_LDFLAGS+=-static -Wl,-rpath -Wl,$(GIVARO_LIBS)
-EXTRA_DIST = \
-		test-common.C  \
-		tests.doxy     \
-		checker.C
-
-
-#  test-generic-for-quad.h
-
-# Put an entry for your test-mycomponent.C here (or in one of the other test groups).
-# Don't forget to add a test_mycomponent_SOURCES entry below.
-#
-# Once present, tests should remain present, being moved from one group to another.
-# Note that among the available groups are NONCOMPILING_TESTS and FAILING_TESTS, which
-# will be ignored by "make check" and can be temporary storage for problematic tests.
-BASIC_TESTS = \
-        test-commentator              \
-        test-det                      \
-        test-frobenius                \
-        test-rank                     \
-        test-solve                    \
-        test-nullspace                \
-        test-smith-form-binary        \
-        test-rational-solver          \
-        test-rational-solver-adaptive \
-        test-charpoly                 \
-        test-cra
-
-FULLCHECK_TESTS = \
-        test-bitonic-sort             \
-	test-blackbox-block-container \
-        test-blas-domain              \
-        test-butterfly                \
-        test-companion                \
-        test-dense                    \
-        test-diagonal                 \
-        test-dif                      \
-        test-direct-sum               \
-        test-echelon-form             \
-        test-ffpack                   \
-        test-getentry                 \
-        test-gf2                      \
-        test-gmp-rational             \
-        test-hilbert                  \
-        test-hom                      \
-        test-inverse                  \
-        test-isposdef                 \
-        test-ispossemidef             \
-        test-matrix-domain            \
-        test-matrix-stream            \
-        test-minpoly                  \
-        test-modular                  \
-        test-modular-balanced-int     \
-        test-modular-balanced-float   \
-        test-modular-balanced-double  \
-        test-modular-byte             \
-        test-modular-double           \
-        test-modular-float            \
-        test-modular-int              \
-        test-modular-short            \
-        test-block-ring               \
-        test-PID-integer              \
-        test-moore-penrose            \
-        test-randiter-nonzero         \
-        test-rational-matrix-factory  \
-        test-scalar-matrix            \
-	test-solve-nonsingular        \
-        test-sparse                   \
-        test-subiterator              \
-        test-submatrix                \
-        test-subvector                \
-        test-sum                      \
-        test-trace                    \
-        test-triplesbb                \
-        test-vector-domain            \
-        test-qlup                     \
-        test-zero-one                 \
-        test-last-invariant-factor    \
-        test-cradomain                \
-		test-rational-reconstruction-base
-
-
-#  test-integer-tools
-
-# tests of components not adhering to LinBox requirements.
-NONCOMPLIANT_TESTS = \
-        test-ntl-RR                    \
-        test-param-fuzzy
-
-
-#These need clapack
-#test-rational-solver-adaptive
-DUBIOUS_TESTS = \
-	test-unparametric-field       \
-	test-bmseq		\
-		test-zo
-
-#  test-quad-matrix
-NONCOMPILING_TESTS = \
-        test-dense-zero-one
-
-FAILING_TESTS = \
-        test-rat-charpoly        \
-		test-rat-solve           \
-		test-rat-minpoly         \
-		test-smith-form-local    \
-		test-smith-form-adaptive \
-		test-dyadic-to-rational  \
-		test-mg-block-lanczos    \
-		test-ftrmm               \
-        test-la-block-lanczos
-
-USE_NONCOMPILING_TESTS = 
-USE_FAILING_TESTS = 
-# comment out these two lines to avoid facing reality
-#USE_NONCOMPILING_TESTS += $(NONCOMPILING_TESTS)
-#USE_FAILING_TESTS += $(FAILING_TESTS)
-
-# a benchmarker, not to be included in check.
-BENCHMARKS = \
-        benchmark-fields        \
-        benchmark-blas-domain
-
-
-# historical tests, no longer in use
-#        test-nag-sparse                  replaced by tripplesbb
-#       test-lsp         lsp.h superceded by factorized-matrix.h
-# removed test
-#        test-nag-sparse
-#        test-image-field       replaced by hom
-#       test-lsp
-# I put test-gssv_rank in hmrg:~saunders/gen_superlu.  It is not linbox until and unless it is made to work
-# test-gssv is an ntl test
-
-# no explicit test needed, I guess...
-#        Transpose is tested in test-triplesbb
-#        Compose is tested in test-butterfly
-GIVARO_TESTS = \
-        test-givaro-fields
-
-NTL_TESTS = \
-        test-smith-form               \
-        test-ntl-lzz_p                \
-        test-ntl-ZZ_p                 \
-        test-ntl-toeplitz             \
-        test-ntl-hankel               \
-        test-ntl-sylvester            \
-        test-smith-form-iliopoulos    \
-        test-toeplitz-det
-
-LIDIA_TESTS = \
-        test-lidia-gfq
-
-ATLAS_TESTS = \
-        test-optimization
-
-BLAS3_UNIT_TESTS = \
-		   test-toom-cook
-
- at LINBOX_HAVE_NTL_TRUE@USE_NTL_TESTS = $(NTL_TESTS)
- at LINBOX_HAVE_GIVARO_TRUE@USE_GIVARO_TESTS = $(GIVARO_TESTS)
- at LINBOX_HAVE_LIDIA_TRUE@USE_LIDIA_TESTS = $(LIDIA_TESTS)
-USE_ATLAS_TESTS = $(ATLAS_TESTS)
-test_commentator_SOURCES = \
-        test-commentator.C                \
-        test-common.h
-
-test_modular_SOURCES = \
-        test-modular.C                        \
-        test-generic.h                        \
-        test-common.h
-
-test_blackbox_block_container_SOURCES = \
-	test-blackbox-block-container.C    \
-	test-common.h
-
-test_solve_nonsingular_SOURCES = \
-	test-solve-nonsingular.C   \
-	test-common.h
-
-test_block_ring_SOURCES = \
-        test-block-ring.C                 \
-        test-field.h                      \
-        test-common.h
-
-test_PID_integer_SOURCES = \
-        test-PID-integer.C                 \
-        test-field.h                      \
-        test-common.h
-
-test_hom_SOURCES = \
-        test-hom.C                        \
-        test-generic.h                    \
-        test-common.h
-
-test_gf2_SOURCES = \
-        test-gf2.C                        \
-        test-generic.h                    \
-        test-common.h
-
-test_gmp_rational_SOURCES = \
-        test-gmp-rational.C               \
-        test-generic.h                    \
-        test-common.h
-
-test_unparametric_field_SOURCES = \
-        test-unparametric-field.C        \
-        test-generic.h                   \
-        test-common.h
-
-test_randiter_nonzero_SOURCES = \
-        test-randiter-nonzero.C          \
-        test-common.h
-
-test_rational_matrix_factory_SOURCES = \
-        test-rational-matrix-factory.C  \
-        test-common.h
-
-test_rational_reconstruction_base_SOURCES = \
-	  test-rational-reconstruction-base.C  \
-	  test-common.h
-
-test_rat_solve_SOURCES = \
-        test-rat-solve.C                \
-        test-common.h
-
-test_rat_charpoly_SOURCES = \
-        test-rat-charpoly.C             \
-        test-common.h
-
-test_rat_minpoly_SOURCES = \
-        test-rat-minpoly.C              \
-        test-common.h
-
-test_subiterator_SOURCES = \
-        test-subiterator.C              \
-        test-common.h
-
-test_subvector_SOURCES = \
-        test-subvector.C                \
-        test-common.h
-
-test_vector_domain_SOURCES = \
-        test-vector-domain.C            \
-        test-vector-domain.h
-
-test_matrix_domain_SOURCES = \
-        test-matrix-domain.C            \
-        test-common.h
-
-test_dense_SOURCES = \
-        test-dense.C                    \
-        test-common.h
-
-test_sparse_SOURCES = \
-        test-sparse.C                   \
-        test-common.h
-
-test_submatrix_SOURCES = \
-        test-submatrix.C                \
-        test-common.h
-
-test_scalar_matrix_SOURCES = \
-        test-scalar-matrix.C            \
-        test-generic.h                  \
-        test-common.h
-
-test_bmseq_SOURCES = \
-        test-bmseq.C            \
-        test-common.h
-
-test_butterfly_SOURCES = \
-        test-vector-domain.h            \
-        test-blackbox.h                 \
-        test-butterfly.C                \
-        test-generic.h                  \
-        test-common.h
-
-test_charpoly_SOURCES = \
-        test-charpoly.C                 \
-        test-common.h
-
-test_diagonal_SOURCES = \
-        test-diagonal.C                 \
-        test-generic.h                  \
-        test-common.h
-
-test_sum_SOURCES = \
-        test-sum.C                      \
-        test-generic.h                  \
-        test-common.h
-
-test_dif_SOURCES = \
-        test-dif.C        test-generic.h    \
-        test-common.h
-
-test_triplesbb_SOURCES = \
-        test-triplesbb.C                \
-        test-generic.h                  \
-        test-common.h
-
-test_hilbert_SOURCES = \
-        test-hilbert.C        test-generic.h        \
-        test-common.h
-
-test_ntl_toeplitz_SOURCES = \
-        test-ntl-toeplitz.C                \
-        test-common.h
-
-test_ntl_hankel_SOURCES = \
-        test-ntl-hankel.C                \
-        test-common.h
-
-test_ntl_sylvester_SOURCES = \
-        test-ntl-sylvester.C                \
-        test-common.h
-
-test_toeplitz_det_SOURCES = \
-        test-toeplitz-det.C
-
-test_trace_SOURCES = \
-        test-trace.C                         \
-        test-common.h
-
-test_getentry_SOURCES = \
-        test-getentry.C                         \
-        test-common.h
-
-test_minpoly_SOURCES = \
-        test-minpoly.C                         \
-        test-common.h
-
-test_det_SOURCES = \
-        test-det.C                        \
-        test-common.h
-
-test_rank_SOURCES = \
-        test-rank.C                        \
-        test-common.h
-
-test_qlup_SOURCES = \
-        test-qlup.C                        \
-        test-common.h
-
-test_solve_SOURCES = \
-        test-solve.C                        \
-        test-common.h
-
-test_direct_sum_SOURCES = \
-        test-direct-sum.C                \
-        test-generic.h                   \
-        test-common.h
-
-test_echelon_form_SOURCES = \
-        test-echelon-form.C                \
-        test-common.h
-
-test_frobenius_SOURCES = \
-        test-frobenius.C                \
-        test-generic.h                  \
-        test-common.h
-
-test_companion_SOURCES = \
-        test-companion.C                \
-        test-generic.h                  \
-        test-common.h
-
-test_inverse_SOURCES = \
-        test-inverse.C                        \
-        test-common.h
-
-test_moore_penrose_SOURCES = \
-        test-moore-penrose.C                \
-        test-common.h
-
-test_ntl_RR_SOURCES = \
-        test-ntl-RR.C                        \
-        test-generic.h                       \
-        test-common.h
-
-test_ntl_ZZ_p_SOURCES = \
-        test-ntl-ZZ_p.C                        \
-        test-generic.h                         \
-        test-common.h
-
-test_ntl_lzz_p_SOURCES = \
-        test-ntl-lzz_p.C                \
-        test-generic.h                  \
-        test-common.h
-
-test_givaro_fields_SOURCES = \
-        test-givaro-fields.C                \
-        test-generic.h                   \
-        test-common.h
-
-test_lidia_gfq_SOURCES = \
-        test-lidia-gfq.C                \
-        test-generic.h                  \
-        test-common.h
-
-test_param_fuzzy_SOURCES = \
-        test-param-fuzzy.C                \
-        test-generic.h                    \
-        test-common.h
-
-
-#  test_quad_matrix_SOURCES =                \
-#  test-quad-matrix.C                \
-#  test-generic-for-quad.h           \
-#  test-generic.h                    \
-#  test-common.h
-test_zo_SOURCES = \
-        test-zo.C                        \
-        test-generic.h                   \
-        test-common.h
-
-test_zero_one_SOURCES = \
-        test-zero-one.C                       \
-        test-generic.h                        \
-        test-common.h
-
-test_modular_int_SOURCES = \
-        test-modular-int.C                \
-        test-common.h
-
-test_modular_short_SOURCES = \
-        test-modular-short.C                \
-        test-generic.h                      \
-        test-common.h
-
-test_modular_double_SOURCES = \
-        test-modular-double.C                \
-        test-generic.h                       \
-        test-common.h
-
-test_modular_float_SOURCES = \
-        test-modular-float.C                \
-        test-generic.h                       \
-        test-common.h
-
-test_modular_byte_SOURCES = \
-        test-modular-byte.C          \
-        test-generic.h               \
-        test-common.h
-
-test_modular_balanced_int_SOURCES = \
-        test-modular-balanced-int.C  \
-        test-generic.h               \
-        test-common.h
-
-test_modular_balanced_double_SOURCES = \
-        test-modular-balanced-double.C  \
-        test-generic.h               \
-        test-common.h
-
-test_modular_balanced_float_SOURCES = \
-        test-modular-balanced-float.C  \
-        test-generic.h               \
-        test-common.h
-
-test_smith_form_iliopoulos_SOURCES = \
-        test-common.h                \
-        test-smith-form-iliopoulos.C
-
-test_smith_form_binary_SOURCES = \
-        test-common.h            \
-        test-smith-form-binary.C
-
-test_smith_form_SOURCES = \
-        test-common.h       \
-        test-smith-form.C
-
-test_last_invariant_factor_SOURCES = \
-        test-common.h                  \
-        test-last-invariant-factor.C
-
-test_smith_form_local_SOURCES = \
-        test-common.h             \
-        test-smith-form-local.C
-
-test_optimization_SOURCES = \
-        test-common.h         \
-        test-optimization.C
-
-test_nullspace_SOURCES = \
-        test-common.h      \
-        test-nullspace.C
-
-test_bitonic_sort_SOURCES = \
-        test-common.h                   \
-        test-bitonic-sort.C
-
-test_rational_solver_SOURCES = \
-        test-common.h                   \
-        test-rational-solver.C
-
-test_blas_domain_SOURCES = \
-        test-common.h                   \
-        test-blas-domain.C
-
-test_ffpack_SOURCES = \
-        test-common.h                   \
-        test-ffpack.C
-
-test_matrix_stream_SOURCES = \
-        test-matrix-stream.C
-
-test_la_block_lanczos_SOURCES = \
-        test-la-block-lanczos.C
-
-test_mg_block_lanczos_SOURCES = \
-        test-mg-block-lanczos.C
-
-test_rational_solver_adaptive_SOURCES = \
-        test-rational-solver-adaptive.C \
-        test-common.h
-
-test_dyadic_to_rational_SOURCES = \
-        test-dyadic-to-rational.C \
-        test-common.h
-
-test_cra_SOURCES = \
-        test-cra.C                      \
-        test-common.h
-
-test_cradomain_SOURCES = \
-        test-cradomain.C                \
-        test-common.h
-
-
-# NTL test
-test_smith_form_adaptive_SOURCES = \
-        test-common.h                  \
-        test-smith-form-adaptive.C
-
-benchmark_fields_SOURCES = \
-        test-common.h                  \
-        benchmark-fields.C
-
-benchmark_blas_domain_SOURCES = \
-        test-common.h                  \
-        benchmark-blas-domain.C
-
-test_isposdef_SOURCES = \
-        test-common.h                  \
-        test-isposdef.C
-
-test_dense_zero_one_SOURCES = \
-        test-blackbox.h                \
-        test-dense-zero-one.C
-
-test_ispossemidef_SOURCES = \
-        test-common.h                 \
-        test-ispossemidef.C
-
-test_ftrmm_SOURCES = \
-		test-ftrmm.C
-
-test_toom_cook_SOURCES = test-toom-cook.C
-CLEANFILES = checker               \
-			$(TESTS)              \
-			$(BASIC_TESTS)        \
-			$(FAILING_TESTS)      \
-			$(NONCOMPLIANT_TESTS) \
-			$(BENCHMARKS)         \
-			$(DUBIOUS_TESTS)      \
-			$(FULLCHECK_TESTS)      \
-			$(NTL_TESTS)          \
-			$(GIVARO_TESTS)       \
-			$(ATLAS_TESTS)
-
-all: all-recursive
-
-.SUFFIXES:
-.SUFFIXES: .C .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps tests/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps tests/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-benchmark-blas-domain$(EXEEXT): $(benchmark_blas_domain_OBJECTS) $(benchmark_blas_domain_DEPENDENCIES) $(EXTRA_benchmark_blas_domain_DEPENDENCIES) 
-	@rm -f benchmark-blas-domain$(EXEEXT)
-	$(CXXLINK) $(benchmark_blas_domain_OBJECTS) $(benchmark_blas_domain_LDADD) $(LIBS)
-benchmark-fields$(EXEEXT): $(benchmark_fields_OBJECTS) $(benchmark_fields_DEPENDENCIES) $(EXTRA_benchmark_fields_DEPENDENCIES) 
-	@rm -f benchmark-fields$(EXEEXT)
-	$(CXXLINK) $(benchmark_fields_OBJECTS) $(benchmark_fields_LDADD) $(LIBS)
-test-PID-integer$(EXEEXT): $(test_PID_integer_OBJECTS) $(test_PID_integer_DEPENDENCIES) $(EXTRA_test_PID_integer_DEPENDENCIES) 
-	@rm -f test-PID-integer$(EXEEXT)
-	$(CXXLINK) $(test_PID_integer_OBJECTS) $(test_PID_integer_LDADD) $(LIBS)
-test-bitonic-sort$(EXEEXT): $(test_bitonic_sort_OBJECTS) $(test_bitonic_sort_DEPENDENCIES) $(EXTRA_test_bitonic_sort_DEPENDENCIES) 
-	@rm -f test-bitonic-sort$(EXEEXT)
-	$(CXXLINK) $(test_bitonic_sort_OBJECTS) $(test_bitonic_sort_LDADD) $(LIBS)
-test-blackbox-block-container$(EXEEXT): $(test_blackbox_block_container_OBJECTS) $(test_blackbox_block_container_DEPENDENCIES) $(EXTRA_test_blackbox_block_container_DEPENDENCIES) 
-	@rm -f test-blackbox-block-container$(EXEEXT)
-	$(CXXLINK) $(test_blackbox_block_container_OBJECTS) $(test_blackbox_block_container_LDADD) $(LIBS)
-test-blas-domain$(EXEEXT): $(test_blas_domain_OBJECTS) $(test_blas_domain_DEPENDENCIES) $(EXTRA_test_blas_domain_DEPENDENCIES) 
-	@rm -f test-blas-domain$(EXEEXT)
-	$(CXXLINK) $(test_blas_domain_OBJECTS) $(test_blas_domain_LDADD) $(LIBS)
-test-block-ring$(EXEEXT): $(test_block_ring_OBJECTS) $(test_block_ring_DEPENDENCIES) $(EXTRA_test_block_ring_DEPENDENCIES) 
-	@rm -f test-block-ring$(EXEEXT)
-	$(CXXLINK) $(test_block_ring_OBJECTS) $(test_block_ring_LDADD) $(LIBS)
-test-bmseq$(EXEEXT): $(test_bmseq_OBJECTS) $(test_bmseq_DEPENDENCIES) $(EXTRA_test_bmseq_DEPENDENCIES) 
-	@rm -f test-bmseq$(EXEEXT)
-	$(CXXLINK) $(test_bmseq_OBJECTS) $(test_bmseq_LDADD) $(LIBS)
-test-butterfly$(EXEEXT): $(test_butterfly_OBJECTS) $(test_butterfly_DEPENDENCIES) $(EXTRA_test_butterfly_DEPENDENCIES) 
-	@rm -f test-butterfly$(EXEEXT)
-	$(CXXLINK) $(test_butterfly_OBJECTS) $(test_butterfly_LDADD) $(LIBS)
-test-charpoly$(EXEEXT): $(test_charpoly_OBJECTS) $(test_charpoly_DEPENDENCIES) $(EXTRA_test_charpoly_DEPENDENCIES) 
-	@rm -f test-charpoly$(EXEEXT)
-	$(CXXLINK) $(test_charpoly_OBJECTS) $(test_charpoly_LDADD) $(LIBS)
-test-commentator$(EXEEXT): $(test_commentator_OBJECTS) $(test_commentator_DEPENDENCIES) $(EXTRA_test_commentator_DEPENDENCIES) 
-	@rm -f test-commentator$(EXEEXT)
-	$(CXXLINK) $(test_commentator_OBJECTS) $(test_commentator_LDADD) $(LIBS)
-test-companion$(EXEEXT): $(test_companion_OBJECTS) $(test_companion_DEPENDENCIES) $(EXTRA_test_companion_DEPENDENCIES) 
-	@rm -f test-companion$(EXEEXT)
-	$(CXXLINK) $(test_companion_OBJECTS) $(test_companion_LDADD) $(LIBS)
-test-cra$(EXEEXT): $(test_cra_OBJECTS) $(test_cra_DEPENDENCIES) $(EXTRA_test_cra_DEPENDENCIES) 
-	@rm -f test-cra$(EXEEXT)
-	$(CXXLINK) $(test_cra_OBJECTS) $(test_cra_LDADD) $(LIBS)
-test-cradomain$(EXEEXT): $(test_cradomain_OBJECTS) $(test_cradomain_DEPENDENCIES) $(EXTRA_test_cradomain_DEPENDENCIES) 
-	@rm -f test-cradomain$(EXEEXT)
-	$(CXXLINK) $(test_cradomain_OBJECTS) $(test_cradomain_LDADD) $(LIBS)
-test-dense$(EXEEXT): $(test_dense_OBJECTS) $(test_dense_DEPENDENCIES) $(EXTRA_test_dense_DEPENDENCIES) 
-	@rm -f test-dense$(EXEEXT)
-	$(CXXLINK) $(test_dense_OBJECTS) $(test_dense_LDADD) $(LIBS)
-test-dense-zero-one$(EXEEXT): $(test_dense_zero_one_OBJECTS) $(test_dense_zero_one_DEPENDENCIES) $(EXTRA_test_dense_zero_one_DEPENDENCIES) 
-	@rm -f test-dense-zero-one$(EXEEXT)
-	$(CXXLINK) $(test_dense_zero_one_OBJECTS) $(test_dense_zero_one_LDADD) $(LIBS)
-test-det$(EXEEXT): $(test_det_OBJECTS) $(test_det_DEPENDENCIES) $(EXTRA_test_det_DEPENDENCIES) 
-	@rm -f test-det$(EXEEXT)
-	$(CXXLINK) $(test_det_OBJECTS) $(test_det_LDADD) $(LIBS)
-test-diagonal$(EXEEXT): $(test_diagonal_OBJECTS) $(test_diagonal_DEPENDENCIES) $(EXTRA_test_diagonal_DEPENDENCIES) 
-	@rm -f test-diagonal$(EXEEXT)
-	$(CXXLINK) $(test_diagonal_OBJECTS) $(test_diagonal_LDADD) $(LIBS)
-test-dif$(EXEEXT): $(test_dif_OBJECTS) $(test_dif_DEPENDENCIES) $(EXTRA_test_dif_DEPENDENCIES) 
-	@rm -f test-dif$(EXEEXT)
-	$(CXXLINK) $(test_dif_OBJECTS) $(test_dif_LDADD) $(LIBS)
-test-direct-sum$(EXEEXT): $(test_direct_sum_OBJECTS) $(test_direct_sum_DEPENDENCIES) $(EXTRA_test_direct_sum_DEPENDENCIES) 
-	@rm -f test-direct-sum$(EXEEXT)
-	$(CXXLINK) $(test_direct_sum_OBJECTS) $(test_direct_sum_LDADD) $(LIBS)
-test-dyadic-to-rational$(EXEEXT): $(test_dyadic_to_rational_OBJECTS) $(test_dyadic_to_rational_DEPENDENCIES) $(EXTRA_test_dyadic_to_rational_DEPENDENCIES) 
-	@rm -f test-dyadic-to-rational$(EXEEXT)
-	$(CXXLINK) $(test_dyadic_to_rational_OBJECTS) $(test_dyadic_to_rational_LDADD) $(LIBS)
-test-echelon-form$(EXEEXT): $(test_echelon_form_OBJECTS) $(test_echelon_form_DEPENDENCIES) $(EXTRA_test_echelon_form_DEPENDENCIES) 
-	@rm -f test-echelon-form$(EXEEXT)
-	$(CXXLINK) $(test_echelon_form_OBJECTS) $(test_echelon_form_LDADD) $(LIBS)
-test-ffpack$(EXEEXT): $(test_ffpack_OBJECTS) $(test_ffpack_DEPENDENCIES) $(EXTRA_test_ffpack_DEPENDENCIES) 
-	@rm -f test-ffpack$(EXEEXT)
-	$(CXXLINK) $(test_ffpack_OBJECTS) $(test_ffpack_LDADD) $(LIBS)
-test-frobenius$(EXEEXT): $(test_frobenius_OBJECTS) $(test_frobenius_DEPENDENCIES) $(EXTRA_test_frobenius_DEPENDENCIES) 
-	@rm -f test-frobenius$(EXEEXT)
-	$(CXXLINK) $(test_frobenius_OBJECTS) $(test_frobenius_LDADD) $(LIBS)
-test-ftrmm$(EXEEXT): $(test_ftrmm_OBJECTS) $(test_ftrmm_DEPENDENCIES) $(EXTRA_test_ftrmm_DEPENDENCIES) 
-	@rm -f test-ftrmm$(EXEEXT)
-	$(CXXLINK) $(test_ftrmm_OBJECTS) $(test_ftrmm_LDADD) $(LIBS)
-test-getentry$(EXEEXT): $(test_getentry_OBJECTS) $(test_getentry_DEPENDENCIES) $(EXTRA_test_getentry_DEPENDENCIES) 
-	@rm -f test-getentry$(EXEEXT)
-	$(CXXLINK) $(test_getentry_OBJECTS) $(test_getentry_LDADD) $(LIBS)
-test-gf2$(EXEEXT): $(test_gf2_OBJECTS) $(test_gf2_DEPENDENCIES) $(EXTRA_test_gf2_DEPENDENCIES) 
-	@rm -f test-gf2$(EXEEXT)
-	$(CXXLINK) $(test_gf2_OBJECTS) $(test_gf2_LDADD) $(LIBS)
-test-givaro-fields$(EXEEXT): $(test_givaro_fields_OBJECTS) $(test_givaro_fields_DEPENDENCIES) $(EXTRA_test_givaro_fields_DEPENDENCIES) 
-	@rm -f test-givaro-fields$(EXEEXT)
-	$(CXXLINK) $(test_givaro_fields_OBJECTS) $(test_givaro_fields_LDADD) $(LIBS)
-test-gmp-rational$(EXEEXT): $(test_gmp_rational_OBJECTS) $(test_gmp_rational_DEPENDENCIES) $(EXTRA_test_gmp_rational_DEPENDENCIES) 
-	@rm -f test-gmp-rational$(EXEEXT)
-	$(CXXLINK) $(test_gmp_rational_OBJECTS) $(test_gmp_rational_LDADD) $(LIBS)
-test-hilbert$(EXEEXT): $(test_hilbert_OBJECTS) $(test_hilbert_DEPENDENCIES) $(EXTRA_test_hilbert_DEPENDENCIES) 
-	@rm -f test-hilbert$(EXEEXT)
-	$(CXXLINK) $(test_hilbert_OBJECTS) $(test_hilbert_LDADD) $(LIBS)
-test-hom$(EXEEXT): $(test_hom_OBJECTS) $(test_hom_DEPENDENCIES) $(EXTRA_test_hom_DEPENDENCIES) 
-	@rm -f test-hom$(EXEEXT)
-	$(CXXLINK) $(test_hom_OBJECTS) $(test_hom_LDADD) $(LIBS)
-test-inverse$(EXEEXT): $(test_inverse_OBJECTS) $(test_inverse_DEPENDENCIES) $(EXTRA_test_inverse_DEPENDENCIES) 
-	@rm -f test-inverse$(EXEEXT)
-	$(CXXLINK) $(test_inverse_OBJECTS) $(test_inverse_LDADD) $(LIBS)
-test-isposdef$(EXEEXT): $(test_isposdef_OBJECTS) $(test_isposdef_DEPENDENCIES) $(EXTRA_test_isposdef_DEPENDENCIES) 
-	@rm -f test-isposdef$(EXEEXT)
-	$(CXXLINK) $(test_isposdef_OBJECTS) $(test_isposdef_LDADD) $(LIBS)
-test-ispossemidef$(EXEEXT): $(test_ispossemidef_OBJECTS) $(test_ispossemidef_DEPENDENCIES) $(EXTRA_test_ispossemidef_DEPENDENCIES) 
-	@rm -f test-ispossemidef$(EXEEXT)
-	$(CXXLINK) $(test_ispossemidef_OBJECTS) $(test_ispossemidef_LDADD) $(LIBS)
-test-la-block-lanczos$(EXEEXT): $(test_la_block_lanczos_OBJECTS) $(test_la_block_lanczos_DEPENDENCIES) $(EXTRA_test_la_block_lanczos_DEPENDENCIES) 
-	@rm -f test-la-block-lanczos$(EXEEXT)
-	$(CXXLINK) $(test_la_block_lanczos_OBJECTS) $(test_la_block_lanczos_LDADD) $(LIBS)
-test-last-invariant-factor$(EXEEXT): $(test_last_invariant_factor_OBJECTS) $(test_last_invariant_factor_DEPENDENCIES) $(EXTRA_test_last_invariant_factor_DEPENDENCIES) 
-	@rm -f test-last-invariant-factor$(EXEEXT)
-	$(CXXLINK) $(test_last_invariant_factor_OBJECTS) $(test_last_invariant_factor_LDADD) $(LIBS)
-test-lidia-gfq$(EXEEXT): $(test_lidia_gfq_OBJECTS) $(test_lidia_gfq_DEPENDENCIES) $(EXTRA_test_lidia_gfq_DEPENDENCIES) 
-	@rm -f test-lidia-gfq$(EXEEXT)
-	$(CXXLINK) $(test_lidia_gfq_OBJECTS) $(test_lidia_gfq_LDADD) $(LIBS)
-test-matrix-domain$(EXEEXT): $(test_matrix_domain_OBJECTS) $(test_matrix_domain_DEPENDENCIES) $(EXTRA_test_matrix_domain_DEPENDENCIES) 
-	@rm -f test-matrix-domain$(EXEEXT)
-	$(CXXLINK) $(test_matrix_domain_OBJECTS) $(test_matrix_domain_LDADD) $(LIBS)
-test-matrix-stream$(EXEEXT): $(test_matrix_stream_OBJECTS) $(test_matrix_stream_DEPENDENCIES) $(EXTRA_test_matrix_stream_DEPENDENCIES) 
-	@rm -f test-matrix-stream$(EXEEXT)
-	$(CXXLINK) $(test_matrix_stream_OBJECTS) $(test_matrix_stream_LDADD) $(LIBS)
-test-mg-block-lanczos$(EXEEXT): $(test_mg_block_lanczos_OBJECTS) $(test_mg_block_lanczos_DEPENDENCIES) $(EXTRA_test_mg_block_lanczos_DEPENDENCIES) 
-	@rm -f test-mg-block-lanczos$(EXEEXT)
-	$(CXXLINK) $(test_mg_block_lanczos_OBJECTS) $(test_mg_block_lanczos_LDADD) $(LIBS)
-test-minpoly$(EXEEXT): $(test_minpoly_OBJECTS) $(test_minpoly_DEPENDENCIES) $(EXTRA_test_minpoly_DEPENDENCIES) 
-	@rm -f test-minpoly$(EXEEXT)
-	$(CXXLINK) $(test_minpoly_OBJECTS) $(test_minpoly_LDADD) $(LIBS)
-test-modular$(EXEEXT): $(test_modular_OBJECTS) $(test_modular_DEPENDENCIES) $(EXTRA_test_modular_DEPENDENCIES) 
-	@rm -f test-modular$(EXEEXT)
-	$(CXXLINK) $(test_modular_OBJECTS) $(test_modular_LDADD) $(LIBS)
-test-modular-balanced-double$(EXEEXT): $(test_modular_balanced_double_OBJECTS) $(test_modular_balanced_double_DEPENDENCIES) $(EXTRA_test_modular_balanced_double_DEPENDENCIES) 
-	@rm -f test-modular-balanced-double$(EXEEXT)
-	$(CXXLINK) $(test_modular_balanced_double_OBJECTS) $(test_modular_balanced_double_LDADD) $(LIBS)
-test-modular-balanced-float$(EXEEXT): $(test_modular_balanced_float_OBJECTS) $(test_modular_balanced_float_DEPENDENCIES) $(EXTRA_test_modular_balanced_float_DEPENDENCIES) 
-	@rm -f test-modular-balanced-float$(EXEEXT)
-	$(CXXLINK) $(test_modular_balanced_float_OBJECTS) $(test_modular_balanced_float_LDADD) $(LIBS)
-test-modular-balanced-int$(EXEEXT): $(test_modular_balanced_int_OBJECTS) $(test_modular_balanced_int_DEPENDENCIES) $(EXTRA_test_modular_balanced_int_DEPENDENCIES) 
-	@rm -f test-modular-balanced-int$(EXEEXT)
-	$(CXXLINK) $(test_modular_balanced_int_OBJECTS) $(test_modular_balanced_int_LDADD) $(LIBS)
-test-modular-byte$(EXEEXT): $(test_modular_byte_OBJECTS) $(test_modular_byte_DEPENDENCIES) $(EXTRA_test_modular_byte_DEPENDENCIES) 
-	@rm -f test-modular-byte$(EXEEXT)
-	$(CXXLINK) $(test_modular_byte_OBJECTS) $(test_modular_byte_LDADD) $(LIBS)
-test-modular-double$(EXEEXT): $(test_modular_double_OBJECTS) $(test_modular_double_DEPENDENCIES) $(EXTRA_test_modular_double_DEPENDENCIES) 
-	@rm -f test-modular-double$(EXEEXT)
-	$(CXXLINK) $(test_modular_double_OBJECTS) $(test_modular_double_LDADD) $(LIBS)
-test-modular-float$(EXEEXT): $(test_modular_float_OBJECTS) $(test_modular_float_DEPENDENCIES) $(EXTRA_test_modular_float_DEPENDENCIES) 
-	@rm -f test-modular-float$(EXEEXT)
-	$(CXXLINK) $(test_modular_float_OBJECTS) $(test_modular_float_LDADD) $(LIBS)
-test-modular-int$(EXEEXT): $(test_modular_int_OBJECTS) $(test_modular_int_DEPENDENCIES) $(EXTRA_test_modular_int_DEPENDENCIES) 
-	@rm -f test-modular-int$(EXEEXT)
-	$(CXXLINK) $(test_modular_int_OBJECTS) $(test_modular_int_LDADD) $(LIBS)
-test-modular-short$(EXEEXT): $(test_modular_short_OBJECTS) $(test_modular_short_DEPENDENCIES) $(EXTRA_test_modular_short_DEPENDENCIES) 
-	@rm -f test-modular-short$(EXEEXT)
-	$(CXXLINK) $(test_modular_short_OBJECTS) $(test_modular_short_LDADD) $(LIBS)
-test-moore-penrose$(EXEEXT): $(test_moore_penrose_OBJECTS) $(test_moore_penrose_DEPENDENCIES) $(EXTRA_test_moore_penrose_DEPENDENCIES) 
-	@rm -f test-moore-penrose$(EXEEXT)
-	$(CXXLINK) $(test_moore_penrose_OBJECTS) $(test_moore_penrose_LDADD) $(LIBS)
-test-ntl-RR$(EXEEXT): $(test_ntl_RR_OBJECTS) $(test_ntl_RR_DEPENDENCIES) $(EXTRA_test_ntl_RR_DEPENDENCIES) 
-	@rm -f test-ntl-RR$(EXEEXT)
-	$(CXXLINK) $(test_ntl_RR_OBJECTS) $(test_ntl_RR_LDADD) $(LIBS)
-test-ntl-ZZ_p$(EXEEXT): $(test_ntl_ZZ_p_OBJECTS) $(test_ntl_ZZ_p_DEPENDENCIES) $(EXTRA_test_ntl_ZZ_p_DEPENDENCIES) 
-	@rm -f test-ntl-ZZ_p$(EXEEXT)
-	$(CXXLINK) $(test_ntl_ZZ_p_OBJECTS) $(test_ntl_ZZ_p_LDADD) $(LIBS)
-test-ntl-hankel$(EXEEXT): $(test_ntl_hankel_OBJECTS) $(test_ntl_hankel_DEPENDENCIES) $(EXTRA_test_ntl_hankel_DEPENDENCIES) 
-	@rm -f test-ntl-hankel$(EXEEXT)
-	$(CXXLINK) $(test_ntl_hankel_OBJECTS) $(test_ntl_hankel_LDADD) $(LIBS)
-test-ntl-lzz_p$(EXEEXT): $(test_ntl_lzz_p_OBJECTS) $(test_ntl_lzz_p_DEPENDENCIES) $(EXTRA_test_ntl_lzz_p_DEPENDENCIES) 
-	@rm -f test-ntl-lzz_p$(EXEEXT)
-	$(CXXLINK) $(test_ntl_lzz_p_OBJECTS) $(test_ntl_lzz_p_LDADD) $(LIBS)
-test-ntl-sylvester$(EXEEXT): $(test_ntl_sylvester_OBJECTS) $(test_ntl_sylvester_DEPENDENCIES) $(EXTRA_test_ntl_sylvester_DEPENDENCIES) 
-	@rm -f test-ntl-sylvester$(EXEEXT)
-	$(CXXLINK) $(test_ntl_sylvester_OBJECTS) $(test_ntl_sylvester_LDADD) $(LIBS)
-test-ntl-toeplitz$(EXEEXT): $(test_ntl_toeplitz_OBJECTS) $(test_ntl_toeplitz_DEPENDENCIES) $(EXTRA_test_ntl_toeplitz_DEPENDENCIES) 
-	@rm -f test-ntl-toeplitz$(EXEEXT)
-	$(CXXLINK) $(test_ntl_toeplitz_OBJECTS) $(test_ntl_toeplitz_LDADD) $(LIBS)
-test-nullspace$(EXEEXT): $(test_nullspace_OBJECTS) $(test_nullspace_DEPENDENCIES) $(EXTRA_test_nullspace_DEPENDENCIES) 
-	@rm -f test-nullspace$(EXEEXT)
-	$(CXXLINK) $(test_nullspace_OBJECTS) $(test_nullspace_LDADD) $(LIBS)
-test-optimization$(EXEEXT): $(test_optimization_OBJECTS) $(test_optimization_DEPENDENCIES) $(EXTRA_test_optimization_DEPENDENCIES) 
-	@rm -f test-optimization$(EXEEXT)
-	$(CXXLINK) $(test_optimization_OBJECTS) $(test_optimization_LDADD) $(LIBS)
-test-param-fuzzy$(EXEEXT): $(test_param_fuzzy_OBJECTS) $(test_param_fuzzy_DEPENDENCIES) $(EXTRA_test_param_fuzzy_DEPENDENCIES) 
-	@rm -f test-param-fuzzy$(EXEEXT)
-	$(CXXLINK) $(test_param_fuzzy_OBJECTS) $(test_param_fuzzy_LDADD) $(LIBS)
-test-qlup$(EXEEXT): $(test_qlup_OBJECTS) $(test_qlup_DEPENDENCIES) $(EXTRA_test_qlup_DEPENDENCIES) 
-	@rm -f test-qlup$(EXEEXT)
-	$(CXXLINK) $(test_qlup_OBJECTS) $(test_qlup_LDADD) $(LIBS)
-test-randiter-nonzero$(EXEEXT): $(test_randiter_nonzero_OBJECTS) $(test_randiter_nonzero_DEPENDENCIES) $(EXTRA_test_randiter_nonzero_DEPENDENCIES) 
-	@rm -f test-randiter-nonzero$(EXEEXT)
-	$(CXXLINK) $(test_randiter_nonzero_OBJECTS) $(test_randiter_nonzero_LDADD) $(LIBS)
-test-rank$(EXEEXT): $(test_rank_OBJECTS) $(test_rank_DEPENDENCIES) $(EXTRA_test_rank_DEPENDENCIES) 
-	@rm -f test-rank$(EXEEXT)
-	$(CXXLINK) $(test_rank_OBJECTS) $(test_rank_LDADD) $(LIBS)
-test-rat-charpoly$(EXEEXT): $(test_rat_charpoly_OBJECTS) $(test_rat_charpoly_DEPENDENCIES) $(EXTRA_test_rat_charpoly_DEPENDENCIES) 
-	@rm -f test-rat-charpoly$(EXEEXT)
-	$(CXXLINK) $(test_rat_charpoly_OBJECTS) $(test_rat_charpoly_LDADD) $(LIBS)
-test-rat-minpoly$(EXEEXT): $(test_rat_minpoly_OBJECTS) $(test_rat_minpoly_DEPENDENCIES) $(EXTRA_test_rat_minpoly_DEPENDENCIES) 
-	@rm -f test-rat-minpoly$(EXEEXT)
-	$(CXXLINK) $(test_rat_minpoly_OBJECTS) $(test_rat_minpoly_LDADD) $(LIBS)
-test-rat-solve$(EXEEXT): $(test_rat_solve_OBJECTS) $(test_rat_solve_DEPENDENCIES) $(EXTRA_test_rat_solve_DEPENDENCIES) 
-	@rm -f test-rat-solve$(EXEEXT)
-	$(CXXLINK) $(test_rat_solve_OBJECTS) $(test_rat_solve_LDADD) $(LIBS)
-test-rational-matrix-factory$(EXEEXT): $(test_rational_matrix_factory_OBJECTS) $(test_rational_matrix_factory_DEPENDENCIES) $(EXTRA_test_rational_matrix_factory_DEPENDENCIES) 
-	@rm -f test-rational-matrix-factory$(EXEEXT)
-	$(CXXLINK) $(test_rational_matrix_factory_OBJECTS) $(test_rational_matrix_factory_LDADD) $(LIBS)
-test-rational-reconstruction-base$(EXEEXT): $(test_rational_reconstruction_base_OBJECTS) $(test_rational_reconstruction_base_DEPENDENCIES) $(EXTRA_test_rational_reconstruction_base_DEPENDENCIES) 
-	@rm -f test-rational-reconstruction-base$(EXEEXT)
-	$(CXXLINK) $(test_rational_reconstruction_base_OBJECTS) $(test_rational_reconstruction_base_LDADD) $(LIBS)
-test-rational-solver$(EXEEXT): $(test_rational_solver_OBJECTS) $(test_rational_solver_DEPENDENCIES) $(EXTRA_test_rational_solver_DEPENDENCIES) 
-	@rm -f test-rational-solver$(EXEEXT)
-	$(CXXLINK) $(test_rational_solver_OBJECTS) $(test_rational_solver_LDADD) $(LIBS)
-test-rational-solver-adaptive$(EXEEXT): $(test_rational_solver_adaptive_OBJECTS) $(test_rational_solver_adaptive_DEPENDENCIES) $(EXTRA_test_rational_solver_adaptive_DEPENDENCIES) 
-	@rm -f test-rational-solver-adaptive$(EXEEXT)
-	$(CXXLINK) $(test_rational_solver_adaptive_OBJECTS) $(test_rational_solver_adaptive_LDADD) $(LIBS)
-test-scalar-matrix$(EXEEXT): $(test_scalar_matrix_OBJECTS) $(test_scalar_matrix_DEPENDENCIES) $(EXTRA_test_scalar_matrix_DEPENDENCIES) 
-	@rm -f test-scalar-matrix$(EXEEXT)
-	$(CXXLINK) $(test_scalar_matrix_OBJECTS) $(test_scalar_matrix_LDADD) $(LIBS)
-test-smith-form$(EXEEXT): $(test_smith_form_OBJECTS) $(test_smith_form_DEPENDENCIES) $(EXTRA_test_smith_form_DEPENDENCIES) 
-	@rm -f test-smith-form$(EXEEXT)
-	$(CXXLINK) $(test_smith_form_OBJECTS) $(test_smith_form_LDADD) $(LIBS)
-test-smith-form-adaptive$(EXEEXT): $(test_smith_form_adaptive_OBJECTS) $(test_smith_form_adaptive_DEPENDENCIES) $(EXTRA_test_smith_form_adaptive_DEPENDENCIES) 
-	@rm -f test-smith-form-adaptive$(EXEEXT)
-	$(CXXLINK) $(test_smith_form_adaptive_OBJECTS) $(test_smith_form_adaptive_LDADD) $(LIBS)
-test-smith-form-binary$(EXEEXT): $(test_smith_form_binary_OBJECTS) $(test_smith_form_binary_DEPENDENCIES) $(EXTRA_test_smith_form_binary_DEPENDENCIES) 
-	@rm -f test-smith-form-binary$(EXEEXT)
-	$(CXXLINK) $(test_smith_form_binary_OBJECTS) $(test_smith_form_binary_LDADD) $(LIBS)
-test-smith-form-iliopoulos$(EXEEXT): $(test_smith_form_iliopoulos_OBJECTS) $(test_smith_form_iliopoulos_DEPENDENCIES) $(EXTRA_test_smith_form_iliopoulos_DEPENDENCIES) 
-	@rm -f test-smith-form-iliopoulos$(EXEEXT)
-	$(CXXLINK) $(test_smith_form_iliopoulos_OBJECTS) $(test_smith_form_iliopoulos_LDADD) $(LIBS)
-test-smith-form-local$(EXEEXT): $(test_smith_form_local_OBJECTS) $(test_smith_form_local_DEPENDENCIES) $(EXTRA_test_smith_form_local_DEPENDENCIES) 
-	@rm -f test-smith-form-local$(EXEEXT)
-	$(CXXLINK) $(test_smith_form_local_OBJECTS) $(test_smith_form_local_LDADD) $(LIBS)
-test-solve$(EXEEXT): $(test_solve_OBJECTS) $(test_solve_DEPENDENCIES) $(EXTRA_test_solve_DEPENDENCIES) 
-	@rm -f test-solve$(EXEEXT)
-	$(CXXLINK) $(test_solve_OBJECTS) $(test_solve_LDADD) $(LIBS)
-test-solve-nonsingular$(EXEEXT): $(test_solve_nonsingular_OBJECTS) $(test_solve_nonsingular_DEPENDENCIES) $(EXTRA_test_solve_nonsingular_DEPENDENCIES) 
-	@rm -f test-solve-nonsingular$(EXEEXT)
-	$(CXXLINK) $(test_solve_nonsingular_OBJECTS) $(test_solve_nonsingular_LDADD) $(LIBS)
-test-sparse$(EXEEXT): $(test_sparse_OBJECTS) $(test_sparse_DEPENDENCIES) $(EXTRA_test_sparse_DEPENDENCIES) 
-	@rm -f test-sparse$(EXEEXT)
-	$(CXXLINK) $(test_sparse_OBJECTS) $(test_sparse_LDADD) $(LIBS)
-test-subiterator$(EXEEXT): $(test_subiterator_OBJECTS) $(test_subiterator_DEPENDENCIES) $(EXTRA_test_subiterator_DEPENDENCIES) 
-	@rm -f test-subiterator$(EXEEXT)
-	$(CXXLINK) $(test_subiterator_OBJECTS) $(test_subiterator_LDADD) $(LIBS)
-test-submatrix$(EXEEXT): $(test_submatrix_OBJECTS) $(test_submatrix_DEPENDENCIES) $(EXTRA_test_submatrix_DEPENDENCIES) 
-	@rm -f test-submatrix$(EXEEXT)
-	$(CXXLINK) $(test_submatrix_OBJECTS) $(test_submatrix_LDADD) $(LIBS)
-test-subvector$(EXEEXT): $(test_subvector_OBJECTS) $(test_subvector_DEPENDENCIES) $(EXTRA_test_subvector_DEPENDENCIES) 
-	@rm -f test-subvector$(EXEEXT)
-	$(CXXLINK) $(test_subvector_OBJECTS) $(test_subvector_LDADD) $(LIBS)
-test-sum$(EXEEXT): $(test_sum_OBJECTS) $(test_sum_DEPENDENCIES) $(EXTRA_test_sum_DEPENDENCIES) 
-	@rm -f test-sum$(EXEEXT)
-	$(CXXLINK) $(test_sum_OBJECTS) $(test_sum_LDADD) $(LIBS)
-test-toeplitz-det$(EXEEXT): $(test_toeplitz_det_OBJECTS) $(test_toeplitz_det_DEPENDENCIES) $(EXTRA_test_toeplitz_det_DEPENDENCIES) 
-	@rm -f test-toeplitz-det$(EXEEXT)
-	$(CXXLINK) $(test_toeplitz_det_OBJECTS) $(test_toeplitz_det_LDADD) $(LIBS)
-test-toom-cook$(EXEEXT): $(test_toom_cook_OBJECTS) $(test_toom_cook_DEPENDENCIES) $(EXTRA_test_toom_cook_DEPENDENCIES) 
-	@rm -f test-toom-cook$(EXEEXT)
-	$(CXXLINK) $(test_toom_cook_OBJECTS) $(test_toom_cook_LDADD) $(LIBS)
-test-trace$(EXEEXT): $(test_trace_OBJECTS) $(test_trace_DEPENDENCIES) $(EXTRA_test_trace_DEPENDENCIES) 
-	@rm -f test-trace$(EXEEXT)
-	$(CXXLINK) $(test_trace_OBJECTS) $(test_trace_LDADD) $(LIBS)
-test-triplesbb$(EXEEXT): $(test_triplesbb_OBJECTS) $(test_triplesbb_DEPENDENCIES) $(EXTRA_test_triplesbb_DEPENDENCIES) 
-	@rm -f test-triplesbb$(EXEEXT)
-	$(CXXLINK) $(test_triplesbb_OBJECTS) $(test_triplesbb_LDADD) $(LIBS)
-test-unparametric-field$(EXEEXT): $(test_unparametric_field_OBJECTS) $(test_unparametric_field_DEPENDENCIES) $(EXTRA_test_unparametric_field_DEPENDENCIES) 
-	@rm -f test-unparametric-field$(EXEEXT)
-	$(CXXLINK) $(test_unparametric_field_OBJECTS) $(test_unparametric_field_LDADD) $(LIBS)
-test-vector-domain$(EXEEXT): $(test_vector_domain_OBJECTS) $(test_vector_domain_DEPENDENCIES) $(EXTRA_test_vector_domain_DEPENDENCIES) 
-	@rm -f test-vector-domain$(EXEEXT)
-	$(CXXLINK) $(test_vector_domain_OBJECTS) $(test_vector_domain_LDADD) $(LIBS)
-test-zero-one$(EXEEXT): $(test_zero_one_OBJECTS) $(test_zero_one_DEPENDENCIES) $(EXTRA_test_zero_one_DEPENDENCIES) 
-	@rm -f test-zero-one$(EXEEXT)
-	$(CXXLINK) $(test_zero_one_OBJECTS) $(test_zero_one_LDADD) $(LIBS)
-test-zo$(EXEEXT): $(test_zo_OBJECTS) $(test_zo_DEPENDENCIES) $(EXTRA_test_zo_DEPENDENCIES) 
-	@rm -f test-zo$(EXEEXT)
-	$(CXXLINK) $(test_zo_OBJECTS) $(test_zo_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-.C.o:
-	$(CXXCOMPILE) -c -o $@ $<
-
-.C.obj:
-	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.C.lo:
-	$(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-check-TESTS: $(TESTS)
-	@failed=0; all=0; xfail=0; xpass=0; skip=0; \
-	srcdir=$(srcdir); export srcdir; \
-	list=' $(TESTS) '; \
-	$(am__tty_colors); \
-	if test -n "$$list"; then \
-	  for tst in $$list; do \
-	    if test -f ./$$tst; then dir=./; \
-	    elif test -f $$tst; then dir=; \
-	    else dir="$(srcdir)/"; fi; \
-	    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
-	      all=`expr $$all + 1`; \
-	      case " $(XFAIL_TESTS) " in \
-	      *[\ \	]$$tst[\ \	]*) \
-		xpass=`expr $$xpass + 1`; \
-		failed=`expr $$failed + 1`; \
-		col=$$red; res=XPASS; \
-	      ;; \
-	      *) \
-		col=$$grn; res=PASS; \
-	      ;; \
-	      esac; \
-	    elif test $$? -ne 77; then \
-	      all=`expr $$all + 1`; \
-	      case " $(XFAIL_TESTS) " in \
-	      *[\ \	]$$tst[\ \	]*) \
-		xfail=`expr $$xfail + 1`; \
-		col=$$lgn; res=XFAIL; \
-	      ;; \
-	      *) \
-		failed=`expr $$failed + 1`; \
-		col=$$red; res=FAIL; \
-	      ;; \
-	      esac; \
-	    else \
-	      skip=`expr $$skip + 1`; \
-	      col=$$blu; res=SKIP; \
-	    fi; \
-	    echo "$${col}$$res$${std}: $$tst"; \
-	  done; \
-	  if test "$$all" -eq 1; then \
-	    tests="test"; \
-	    All=""; \
-	  else \
-	    tests="tests"; \
-	    All="All "; \
-	  fi; \
-	  if test "$$failed" -eq 0; then \
-	    if test "$$xfail" -eq 0; then \
-	      banner="$$All$$all $$tests passed"; \
-	    else \
-	      if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
-	      banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
-	    fi; \
-	  else \
-	    if test "$$xpass" -eq 0; then \
-	      banner="$$failed of $$all $$tests failed"; \
-	    else \
-	      if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
-	      banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
-	    fi; \
-	  fi; \
-	  dashes="$$banner"; \
-	  skipped=""; \
-	  if test "$$skip" -ne 0; then \
-	    if test "$$skip" -eq 1; then \
-	      skipped="($$skip test was not run)"; \
-	    else \
-	      skipped="($$skip tests were not run)"; \
-	    fi; \
-	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
-	      dashes="$$skipped"; \
-	  fi; \
-	  report=""; \
-	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
-	    report="Please report to $(PACKAGE_BUGREPORT)"; \
-	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
-	      dashes="$$report"; \
-	  fi; \
-	  dashes=`echo "$$dashes" | sed s/./=/g`; \
-	  if test "$$failed" -eq 0; then \
-	    col="$$grn"; \
-	  else \
-	    col="$$red"; \
-	  fi; \
-	  echo "$${col}$$dashes$${std}"; \
-	  echo "$${col}$$banner$${std}"; \
-	  test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
-	  test -z "$$report" || echo "$${col}$$report$${std}"; \
-	  echo "$${col}$$dashes$${std}"; \
-	  test "$$failed" -eq 0; \
-	else :; fi
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    $(am__make_dryrun) \
-	      || test -d "$(distdir)/$$subdir" \
-	      || $(MKDIR_P) "$(distdir)/$$subdir" \
-	      || exit 1; \
-	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-	    $(am__relativize); \
-	    new_distdir=$$reldir; \
-	    dir1=$$subdir; dir2="$(top_distdir)"; \
-	    $(am__relativize); \
-	    new_top_distdir=$$reldir; \
-	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-	    ($(am__cd) $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$new_top_distdir" \
-	        distdir="$$new_distdir" \
-		am__remove_distdir=: \
-		am__skip_length_check=: \
-		am__skip_mode_fix=: \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
-check: check-recursive
-all-am: Makefile
-installdirs: installdirs-recursive
-installdirs-am:
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) check-am \
-	ctags-recursive install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-	all all-am check check-TESTS check-am clean clean-generic \
-	clean-libtool ctags ctags-recursive distclean \
-	distclean-compile distclean-generic distclean-libtool \
-	distclean-tags distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	installdirs-am maintainer-clean maintainer-clean-generic \
-	mostlyclean mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
-	uninstall uninstall-am
-
-
-#  test_integer_tools_SOURCES =          \
-#  test-integer-tools.C
-
-#check: checker
-#	checker -c
-
-# for compilation of new non-enumerated tests
-%:%.C
-	$(CXX) $(CXXFLAGS) $(AM_CXXFLAGS) $(OPTFLAGS) ${INCLUDES} $(AM_CPPFLAGS) $*.C -o $@ $(LDADD)
-
-fullcheck: checker
-	./checker
-
-checker: checker.C
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/tests/benchmark-fields.C b/tests/benchmark-fields.C
index b364144..b1fdee3 100644
--- a/tests/benchmark-fields.C
+++ b/tests/benchmark-fields.C
@@ -33,21 +33,21 @@
 // #include "linbox/field/givaro-gfq.h"
 
 #ifdef __LINBOX_HAVE_NTL
-#include "linbox/field/ntl.h"
-#include "linbox/field/PID-ntl-zz_p.h"
-#include "linbox/field/PIR-ntl-ZZ_p.h"
+#include "linbox/ring/ntl.h"
+#include "linbox/ring/pid-ntl-lzz_p.h"
+#include "linbox/ring/pir-ntl-zz_p.h"
 #endif
 
 #include "linbox/field/modular.h"
-#include "linbox/field/modular-balanced.h"
+#include <givaro/modular-balanced.h>
 #include "linbox/field/Modular/modular-crooked-double.h"
 #include "linbox/field/field-traits.h"
 #include "linbox/vector/stream.h"
 #include "linbox/integer.h"
-#include "linbox/field/PIR-modular-int32.h"
+#include "linbox/ring/pir-modular-int32.h"
 // #include "linbox/field/gf2.h"
 #include "linbox/field/gmp-rational.h"
-#include "linbox/field/local2_32.h"
+#include "linbox/ring/local2_32.h"
 
 #ifdef __LINBOX_HAVE_LIDIA
 #include "linbox/field/lidia.h"
@@ -55,7 +55,7 @@
 
 #include <iostream>
 #include <iomanip>
-#include <vector>
+
 
 using namespace LinBox;
 
@@ -72,46 +72,45 @@ template< class Field >
 void fieldTest( const Field& f, double* array, long iter = 1000000, bool fulltest = false )
 {
 
-	long vectorSize = 10000;
+	size_t vectorSize = 10000;
 	float sparsity = .01f;
-	long sparsity_inv = 100;
 	int i;
 
 	// initialize a few field elements,
 	typedef typename Field::Element Element;
-	Element returnValue; f.init(returnValue, 1);
-	Element s; f.init(s, 0);
+	Element returnValue; f.assign(returnValue, f.one);
+	Element s; f.assign(s, f.zero);
 
 	Element a, b, c;
 	typename Field::RandIter r(f);
 	r.random( a ); r.random( b ); r.random( c );
-	std::vector<Element> dv1( vectorSize ), dv2( vectorSize );
-	for (i = 0; i < vectorSize; ++i ) {
-		r.random( dv1[i] );
-		r.random( dv2[i] );
+	BlasVector<Field> dv1( f,  vectorSize ), dv2( f, vectorSize );
+	for (i = 0; i <(int) vectorSize; ++i ) {
+		r.random( dv1[(size_t)i] );
+		r.random( dv2[(size_t)i] );
 	}
 	RandomSparseStream<Field> sparse( f, sparsity, vectorSize );
 	typename RandomSparseStream<Field>::Vector sv; sparse.get( sv );
 
 #if 0
 	// initialize and fill array of random elements.
-	typename Field::RandIter r(f);
+	typename Field::RandIter gen(f);
 	typename Field::Element *elements;
 	elements = new typename Field::Element[ iter * 3 ];
 	for( int i = 0; i < iter*3; i++ ) {
-		do { r.random( elements[i] ); }
-		while( f.isZero( elements[i] ) );
+		do { r.random( elements[(size_t)i] ); }
+		while( f.isZero( elements[(size_t)i] ) );
 	}
 
 	// initialize random vector streams
-	RandomDenseStream<Field> dense( f, vectorSize, 2);
+	RandomDenseStream<Field> dense( f, gen, vectorSize, 2);
 	typename RandomDenseStream<Field>::Vector dv1; dense.get( dv1 );
 	typename RandomDenseStream<Field>::Vector dv2; dense.get( dv2 );
-	RandomSparseStream<Field> sparse( f, sparsity, vectorSize );
+	RandomSparseStream<Field> sparse( f, gen, sparsity, vectorSize );
 	typename RandomSparseStream<Field>::Vector sv; sparse.get( sv );
 
-	RandomDenseStream<Field> dense1( f, vectorSize, iter/vectorSize );
-	RandomDenseStream<Field> dense2( f, vectorSize, iter/vectorSize );
+	RandomDenseStream<Field> dense1( f, gen, vectorSize, iter/vectorSize );
+	RandomDenseStream<Field> dense2( f, gen, vectorSize, iter/vectorSize );
 	RandomSparseStream<Field> sparse( f, sparsity, vectorSize );
 
 	// initialize individual vectors to hold results
@@ -130,7 +129,7 @@ void fieldTest( const Field& f, double* array, long iter = 1000000, bool fulltes
 	double overHeadTime;
 
 	timer.clear(); timer.start();
-	f.init(s, 0);
+	f.assign(s, f.zero);
 	for( i = 0; i < iter; i++ ) { f.init(returnValue, i); f.addin(s, returnValue); }
 	timer.stop(); overHeadTime = timer.time();
 
@@ -178,7 +177,7 @@ void fieldTest( const Field& f, double* array, long iter = 1000000, bool fulltes
 		// inv
 		timer.clear(); timer.start();
 		for( i = 0; i < iter; i++ ) {
-			f.init(a, i);  if (f.isZero(a)) f.init(a, 1);
+			f.init(a, i);  if (f.isZero(a)) f.assign(a, f.one);
 			f.inv( returnValue, a);
 			f.addin(s, returnValue);
 		}
@@ -206,7 +205,7 @@ void fieldTest( const Field& f, double* array, long iter = 1000000, bool fulltes
 
 	// DotProduct1 ( dense * dense )
 	timer.clear(); timer.start();
-	for( i = 0; i < iter/vectorSize; i++ ) {
+	for( i = 0; i < iter/(int)vectorSize; i++ ) {
 		f.init(dv1.back(), i);
 		VD.dot( returnValue, dv1, dv2 );
 		f.addin(s, returnValue);
@@ -217,9 +216,10 @@ void fieldTest( const Field& f, double* array, long iter = 1000000, bool fulltes
 	if (fulltest) {
 		// DotProduct2 ( dense * sparse )
 		timer.clear(); timer.start();
-		for( i = 0; i < iter/vectorSize; i++ ) {
+		for( i = 0; i < iter/(int)vectorSize; i++ ) {
 			f.init(dv1.back(), i);
-			for ( int j = 0; j < sparsity_inv; ++ j ) {
+			long sparsity_inv = 100;
+			for ( int j = 0; j < (int)sparsity_inv; ++ j ) {
 				f.init(dv1.front(), j);
 				VD.dot( returnValue, dv1, sv );
 				f.addin(s, returnValue);
@@ -231,8 +231,8 @@ void fieldTest( const Field& f, double* array, long iter = 1000000, bool fulltes
 
 	// Convert timings to mops (million operations per second)
 	for( i = 0; i < 9; i++ ) {
-		double t = array[i];
-		array[i] = (double)iter / (t > 0 ? (t * 1000000) : 0) ;
+		double t = array[(size_t)i];
+		array[(size_t)i] = (double)iter / (t > 0 ? (t * 1000000) : 0) ;
 	}
 	// use s (just in case compiler cares)
 	if (f.isZero(s)) std::cout << "zero sum" << std::endl;
@@ -252,8 +252,8 @@ int64_t getOps(int unit)
 	double b = 1.3;
 	UserTimer opsClock;
 	opsClock.clear();
-	long double c;
 	while( opsClock.time() < unit ) {
+		// long double c;
 		ops *= 2;
 		i = 0;
 		opsClock.start();
@@ -267,7 +267,7 @@ int64_t getOps(int unit)
 			b=a;
 		else
 			b = 2*a;
-		c = a+b;
+		// c = a+b;
 
 	}
 	return ops;
@@ -294,9 +294,9 @@ void printTimings( double* timings, bool fulltest = false )
 template <class Field>
 void doTest(const char* name, integer& p, integer& exp, int64_t& iter, bool fulltest = false)
 {
-	static double mops[11];
 	if( FieldTraits<Field>::goodModulus( p ) &&
 	    FieldTraits<Field>::goodExponent( exp ) ) {
+		static double mops[11];
 		Field fld( p, exp );
 		fieldTest( fld, mops, iter, fulltest);
 		// print name
@@ -348,18 +348,18 @@ int main(int argc, char** argv)
 	<< std::setw(12) << "axpy/(mul+add)"
 	<< std::endl;
 
-	doTest< Modular<int8_t> >( "Modular<int8_t>", prime, exp, iterations, fulltest );
-	doTest< Modular<int16_t> >( "Modular<int16_t>", prime, exp, iterations, fulltest );
-	doTest< Modular<int32_t> >( "Modular<int32_t>", prime, exp, iterations, fulltest );
-	//doTest< Modular<int> >( "Modular<int>", prime, exp, iterations, fulltest );
-	doTest< Modular<double> >( "Modular<double>", prime, exp, iterations, fulltest );
-	doTest< Modular<float> >( "Modular<float>", prime, exp, iterations, fulltest );
-
-	//doTest< ModularBalanced<int8_t> >( "ModularBalanced<int8_t>", prime, exp, iterations, fulltest );
-	//doTest< ModularBalanced<int16_t> >( "ModularBalanced<int16_t>", prime, exp, iterations, fulltest );
-	doTest< ModularBalanced<int32_t> >( "ModularBalanced<int32_t>", prime, exp, iterations, fulltest );
-	doTest< ModularBalanced<double> >( "ModularBalanced<double>", prime, exp, iterations, fulltest );
-	doTest< ModularBalanced<float> >( "ModularBalanced<float>", prime, exp, iterations, fulltest );
+	doTest< Givaro::Modular<int8_t> >( "Givaro::Modular<int8_t>", prime, exp, iterations, fulltest );
+	doTest< Givaro::Modular<int16_t> >( "Givaro::Modular<int16_t>", prime, exp, iterations, fulltest );
+	doTest< Givaro::Modular<int32_t> >( "Givaro::Modular<int32_t>", prime, exp, iterations, fulltest );
+	//doTest< Givaro::Modular<int> >( "Givaro::Modular<int>", prime, exp, iterations, fulltest );
+	doTest< Givaro::Modular<double> >( "Givaro::Modular<double>", prime, exp, iterations, fulltest );
+	doTest< Givaro::Modular<float> >( "Givaro::Modular<float>", prime, exp, iterations, fulltest );
+
+	//doTest< Givaro::ModularBalanced<int8_t> >( "Givaro::ModularBalanced<int8_t>", prime, exp, iterations, fulltest );
+	//doTest< Givaro::ModularBalanced<int16_t> >( "Givaro::ModularBalanced<int16_t>", prime, exp, iterations, fulltest );
+	doTest< Givaro::ModularBalanced<int32_t> >( "Givaro::ModularBalanced<int32_t>", prime, exp, iterations, fulltest );
+	doTest< Givaro::ModularBalanced<double> >( "Givaro::ModularBalanced<double>", prime, exp, iterations, fulltest );
+	doTest< Givaro::ModularBalanced<float> >( "Givaro::ModularBalanced<float>", prime, exp, iterations, fulltest );
 
 	doTest< ModularCrooked<double> >( "ModularCrooked<double>", prime, exp, iterations, fulltest );
 
diff --git a/tests/checker.C b/tests/checker.C
index 36a5f32..04d5124 100644
--- a/tests/checker.C
+++ b/tests/checker.C
@@ -1,414 +1,215 @@
 
 /*
- * Copyright (c) 2011 LinBox
+ * Copyright (c) 2015 LinBox
+ * This file is part of the library LinBox. See COPYING for license info.
  * Written by bds.
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
-
  */
 /** @file tests/checker.C
 @brief script to run LinBox tests
 
 Checker is compiled and run by the check macro invoked by "make fullcheck" in the top source dir or in tests/.
 
-Run without args, checker prints an explanation of command line options, then proceeds with default test behaviour.  "checker -h" just prints the options.
-
-Each LinBox test gets a line below.  A LinBox unit/regresssion test has a default behaviour -- when there are no command line file names -- in which nothing is written to any output stream and the return value is 0 for a passing test, nonzero for any failure.
+Run without args, 
+each test is build and run, with a one line report of success or failure.
+A summary at the end reports number of test failing to compile, failing at runtime, and skipped.
+There should be a 1-1 correspondence between files tests/test-*.C and report lines
 
-The current convention is that (1) linbox' check macro, checker.C, runs the tests with no command line parameters at all, and (2) if there is a command line file name, verbose diagnostic output is written to that file and more terse output may be written to standard output streams.  The second feature is intended to assist debugging with individual tests.
+A LinBox unit/regresssion test has a default behaviour -- when there are no command line file names -- in which nothing is written to any output stream and the return value is 0 for a passing test, nonzero for any failure.
 
-In future, command line arguments could be used in checking to vary matrix sizes and other parameters in check runs.
+The current convention is that (1) linbox' checker.C, runs the tests with no command line parameters at all, and (2) if there is a command line file name, verbose diagnostic output is written to that file and more terse output may be written to standard output streams.  The second feature is intended to assist debugging with individual tests.
 
-There should be a 1-1 correspondence between files tests/test-*.C and calls
-here to build_n_run() or no_build_n_run() (possibly commented out).
 */
 
 #include <cstdlib>
 #include <iostream>
 #include <fstream>
 #include <sstream>
+#include <map>
+#include <set>
+#include <vector>
 //#include <iomanip>
 using namespace std;
-
-#include "fflas-ffpack/fflas-ffpack-config.h"
-#include "../linbox/linbox-config.h"
-
-struct counts {
-	int      pass;
-       	int buildfail;
-	int   runfail;
-	int   skipped;
-	counts() :
-		pass(0), buildfail(0), runfail(0), skipped(0)
-	{}
-	int total()
-	{
-	       	return pass + buildfail + runfail;
-       	}
-};
-
-void build_n_run(string s, counts& cnt, int flag = 2, string r = "") ;
-void no_build_n_run(string s, counts& cnt, int flag = 2, string r = "") ;
-
-int main(int argc, char* argv[])
-{
-	int f = 0; // f = 1 ==> force recompile all tests.
-	int flag = 1; // verbosity flag.
-
-	bool check = false;// true for install time check
+#include "linbox/linbox-config.h"
+//#include "fflas-ffpack/fflas-ffpack.h"
+
+// globals
+//map< string, string> skip_note;
+map< string, string> warn_note;
+set< string> skips;
+set< string> hides;
+void warn(const string& t, const string& w) { warn_note[t] = w; }
+void skip(const string& t, const string& w) { warn_note[t] = w; skips.insert(t); }
+void hide(const string& t, const string& w) { warn_note[t] = w; hides.insert(t); }
+
+int main(int argc, char* argv[]) {
 	int arg;
-	for (arg = 1; arg < argc && argv[arg][0] == '-'; ++ arg)
-		switch (argv[arg][1]) {
-			case 'r': f = 1; break;
-			case 'f': flag = atoi(argv[++arg]); break;
-			case 'c': check = true; break;
-			default:
-		cout << "usage: " << argv[0] << " [-r] [-f n] [-c] [test]*" << endl;
-		cout << "  -f 0 for a summary: only 4 lines printed." << endl;
-		cout << "  -f 1 for default: also one line per test." << endl;
-		cout << "  -f 2 for warnings: shows subtest failures." << endl;
-		cout << "  -f 3 for errors: also any build and run output for error cases." << endl;
-		cout << "  -f 4 for verbose: also any build and run output for each test." << endl;
-		cout << "  -r forces rebuild of all tests." << endl;
-		cout << "  -c conducts an install time check (a few selected tests only)." << endl;
-		cout << "  if any [test] is present, it is built and run, otherwise all tests are processed." << endl;
+	bool force_build = false, reporting = true, honor_skips = true;
+	for (arg = 1; arg < argc; ++arg)
+		for (char * i = argv[arg]; *i != 0; ++i){
+			if (*i == 'r') force_build = true;
+			if (*i == 's') reporting = false;
+			if (*i == 'a') honor_skips = false;
+		}
+    if (argc > 1 and not force_build and reporting and honor_skips){ // bogus arg
+		cout << "usage: " << argv[0] << " [-][r][s][a]" << endl;
+		cout << "  -r Force recompilation of each test."<< endl;
+		cout << "  -s Summary only: 3 lines printed. (Default is one line per test.)" << endl;
+		cout << "  -a Build and run all. (Ignore skip and hide commands.)" << endl;
 		return 0;
 	}
-	flag = flag+5*f; // clean up later
-#if 0
-       	else {
-		if (argv[1][0] == 's') flag = 0; // summary
-		if (argv[1][0] == 'd') flag = 1; // default
-		if (argv[1][0] == 'w') flag = 2; // warnings
-		if (argv[1][0] == 'e') flag = 3; // errors
-		if (argv[1][0] == 'v') flag = 3; // verbose
-		if (argc > 2 && argv[2] == "rebuild") flag += 5; // force rebuilds
-	}
-#endif
-	// the setup
-	system("rm -f checkdata");
-#if 0
-	string compiler;
-	//system("make -n ");
-	system("make -n checkerdata > checkdata");
-	ifstream fin("checkdata", ifstream::in);
-	do {getline(fin, compiler);}
-	while (fin && compiler.find("something") == compiler.npos);
-	cout << compiler << endl << endl;
-	system("rm -f checkdata");
-#endif
-
-	// the tests
-	counts counter;
-
-	// if only specific test(s) specified
-	if (arg < argc) {
-		for (; arg < argc; ++arg)
-			build_n_run(argv[arg], counter , flag);
-		return counter.buildfail || counter.runfail ? -1 : 0;
-	}
-
-/*
-Each test gets a line below.  A LinBox unit/regresssion test has a default behaviour -- when there are no command line file names -- in which nothing is written to any output stream and the return value is 0 for a passing test, nonzero for any failure.
-
-The current convention is that (1) linbox' check macro, checker.C, runs the tests with no command line parameters at all, and (2) if there is a command line file name, verbose diagnostic output is written to that file and more terse output may be written to standard output streams.  The second feature is intended to assist debugging with individual tests.
-
-In future, command line arguments could be used in checking to vary matrix sizes and other parameters in check runs.
-
-There should be a 1-1 correspondence between files tests/test-*.C and calls
-here to build_n_run or no_build_n_run (possibly commented out).
-Thus "ls test-*.C |wc" and "grep test- checker.C |grep \
-build |wc" should yield the same number of lines.
-*/
-
-  if (check) {
-	build_n_run("test-charpoly",                     counter , flag);//, "intermittent inf loop, bb or cp responsible?");
-	build_n_run("test-cra",                          counter , flag);
-	build_n_run("test-det",                          counter , flag);
-	build_n_run("test-frobenius",                    counter , flag);
-	build_n_run("test-rank",                         counter , flag);
-	build_n_run("test-qlup",                         counter , flag);
-	build_n_run("test-solve",                        counter , flag);
-	build_n_run("test-nullspace",                    counter , flag);
-	build_n_run("test-rat-solve",     counter , flag); // "infinite loop");
-	build_n_run("test-rat-minpoly",   counter , flag); // "intermittent failures");
-	build_n_run("test-rational-solver",              counter , flag);
-	build_n_run("test-smith-form",            counter , flag);
-	build_n_run("test-smith-form-adaptive",   counter , flag);
-	build_n_run("test-smith-form-iliopoulos", counter , flag);
-	build_n_run("test-smith-form-binary",            counter , flag);
-	return counter.buildfail || counter.runfail ? -1 : 0;
-  } else {
-//BASIC_TESTS
-	build_n_run("test-bitonic-sort",                 counter , flag);
-	build_n_run("test-blackbox-block-container",     counter , flag);
-	build_n_run("test-blas-domain",                  counter , flag);
-	build_n_run("test-block-ring",                   counter , flag);
-	no_build_n_run("test-block-wiedemann",              counter , flag, "bds tracking down BlasMatrix bug");
-	no_build_n_run("test-bmseq",                     counter , flag, "under development by George Yuhasz");
-	build_n_run("test-butterfly",                    counter , flag);
-	build_n_run("test-charpoly",                     counter , flag);//, "intermittent inf loop, bb or cp responsible?");
-	build_n_run("test-commentator",                  counter , flag);
-	build_n_run("test-companion",                    counter , flag);
-	build_n_run("test-cra",                          counter , flag);
-	build_n_run("test-cradomain",                    counter , flag,"intermittent failure, as in 1 every 10-20");
-	build_n_run("test-dense",                        counter , flag);
-	build_n_run("test-det",                          counter , flag);
-	build_n_run("test-diagonal",                     counter , flag);
-	build_n_run("test-dif",                          counter , flag);
-	build_n_run("test-direct-sum",                   counter , flag);
-	build_n_run("test-dyadic-to-rational",           counter , flag, "bds responsible");
-	build_n_run("test-ffpack",                       counter , flag);
-	build_n_run("test-frobenius",                    counter , flag);
-	build_n_run("test-getentry",                     counter , flag);
-	build_n_run("test-gf2",                          counter , flag);
-	build_n_run("test-gmp-rational",                 counter , flag);
-	build_n_run("test-hilbert",                      counter , flag);
-	build_n_run("test-hom",                          counter , flag);
-	build_n_run("test-inverse",                      counter , flag);
-	build_n_run("test-isposdef",                     counter , flag);
-	build_n_run("test-ispossemidef",                 counter , flag);
-	build_n_run("test-last-invariant-factor",        counter , flag);
-	build_n_run("test-matrix-domain",                counter , flag);
-	build_n_run("test-matrix-stream",                counter , flag);
-	no_build_n_run("test-mg-block-lanczos",             counter , flag, "fails");
-	build_n_run("test-minpoly",                      counter , flag);
-	build_n_run("test-modular",                      counter , flag);
-	build_n_run("test-modular-balanced-int",         counter , flag);
-	build_n_run("test-modular-balanced-float",       counter , flag);
-	build_n_run("test-modular-balanced-double",      counter , flag);
-	build_n_run("test-modular-byte",                 counter , flag);
-	build_n_run("test-modular-double",               counter , flag);
-	build_n_run("test-modular-float",                counter , flag);
-	build_n_run("test-modular-int",                  counter , flag);
-	build_n_run("test-modular-short",                counter , flag);
-	build_n_run("test-moore-penrose",                counter , flag);
-	build_n_run("test-nullspace",                    counter , flag);
-	build_n_run("test-PID-integer",                  counter , flag);
-	build_n_run("test-qlup",                         counter , flag);
-	build_n_run("test-randiter-nonzero",             counter , flag);
-	build_n_run("test-rank",                         counter , flag);
-	build_n_run("test-rational-matrix-factory ",     counter , flag);
-	build_n_run("test-rational-reconstruction-base", counter , flag);
-	build_n_run("test-rat-charpoly",                 counter , flag);//, "infinite loop, cp responsible?");
-	build_n_run("test-scalar-matrix",                counter , flag);
-	build_n_run("test-smith-form-binary",            counter , flag);
-	build_n_run("test-solve",                        counter , flag);
-	build_n_run("test-sparse",                       counter , flag);
-	build_n_run("test-subiterator",                  counter , flag);
-	build_n_run("test-submatrix",                    counter , flag);
-	build_n_run("test-subvector",                    counter , flag);
-	build_n_run("test-sum",                          counter , flag);
-	build_n_run("test-rational-solver",              counter , flag);
-	build_n_run("test-trace",                        counter , flag);
-	build_n_run("test-triplesbb",                    counter , flag);
-	build_n_run("test-unparametric-field",           counter , flag); //has been useful in num/sym.
-	build_n_run("test-vector-domain",                counter , flag);
-	build_n_run("test-zero-one",                     counter , flag);
-
-#if __LINBOX_HAVE_GIVARO
-//	if (flag > 0) cout << "	Givaro tests" << endl;
-	build_n_run("test-givaro-fields",    counter , flag, "may fail on small fields because of supposed non-randomness or failure to find a non trivial element");
-	//build_n_run("test-givaro-zpz", counter , flag, "superceded by test-givaro-fields");
-	//build_n_run("test-givaro-zpzuns", counter , flag, "superceded by test-givaro-fields");
-	build_n_run("test-rat-solve",     counter , flag); // "infinite loop");
-	build_n_run("test-rat-minpoly",   counter , flag); // "intermittent failures");
-#else
-	if (flag > 0) cout << "	not doing Givaro dependent tests" << endl;
-	cout << "Configuration problem?  __LINBOX_HAVE_GIVARO is not set, but LinBox requires Givaro" << endl;
-	counter.skipped += 4;
-#endif
-
-#if __FFLASFFPACK_HAVE_LAPACK
-	if (flag > 0) cout << "	Lapack dependent tests" << endl;
-	build_n_run("test-rational-solver-adaptive", counter, flag);
-	// needs output cleanup.  Resolve whether a benchmark or a test.
-	build_n_run("test-solve-nonsingular", counter, flag, "BY responsible");
-#else
-	if (flag > 0) cout << "	not doing Lapack dependent tests" << endl;
-	no_build_n_run("test-rational-solver-adaptive", counter, flag);
-	// needs output cleanup.  Resolve whether a benchmark or a test.
-	no_build_n_run("test-solve-nonsingular", counter, flag, "BY responsible");
-#endif
-
-#if __LINBOX_HAVE_NTL
-	if (flag > 0) cout << "	NTL dependent tests" << endl;
-	build_n_run("test-ntl-hankel",            counter , flag);
-	build_n_run("test-ntl-lzz_p",             counter , flag);
-	build_n_run("test-ntl-toeplitz",          counter , flag);
-	build_n_run("test-ntl-sylvester",         counter , flag);
-	no_build_n_run("test-ntl-RR",                counter , flag, "floating point equality");
-	build_n_run("test-ntl-ZZ_p",              counter , flag);
-	build_n_run("test-toeplitz-det",          counter , flag);
-	build_n_run("test-smith-form",            counter , flag);
-	build_n_run("test-smith-form-adaptive",   counter , flag);
-	build_n_run("test-smith-form-iliopoulos", counter , flag);
-#else
-	if (flag > 0) cout << "	not doing NTL dependent tests" << endl;
-	no_build_n_run("test-ntl-hankel",            counter , flag);
-	no_build_n_run("test-ntl-lzz_p",             counter , flag);
-	no_build_n_run("test-ntl-toeplitz",          counter , flag);
-	no_build_n_run("test-ntl-RR",                counter , flag, "floating point equality");
-	no_build_n_run("test-ntl-sylvester",         counter , flag);
-	no_build_n_run("test-ntl-ZZ_p",              counter , flag);
-	no_build_n_run("test-toeplitz-det",          counter , flag, "can we have non NTL version?");
-	no_build_n_run("test-smith-form",            counter , flag);
-	no_build_n_run("test-smith-form-adaptive",   counter , flag);
-	no_build_n_run("test-smith-form-iliopoulos", counter , flag);
-#endif
-
-#if __LINBOX_HAVE_LIDIA
-	if (flag > 0) cout << "	Lidia dependent tests" << endl;
-	build_n_run("./test-lidia-gfq", counter, flag);
-#else
-	if (flag > 0) cout << "	not doing Lidia dependent test" << endl;
-	no_build_n_run("test-lidia-gfq", counter, flag);
-#endif
-
-#if __LINBOX_HAVE_ATLAS
-	if (flag > 0) cout << "	Atlas dependent tests" << endl;
-	no_build_n_run("./test-optimization", counter, flag, "not a test");
-#else
-	if (flag > 0) cout << "	not doing Atlas dependent test" << endl;
-	no_build_n_run("test-optimization", counter, flag, "not a test");
-#endif
 
-	// tests of "doubles as a field" which doesn't adhere to LinBox field or ring specs.
-	if (flag > 0) cout << "	Noncompliant tests" << endl;
-	build_n_run("test-param-fuzzy", counter, flag);
-
-#if 1
-	if (flag > 0) cout << "	Tests requiring further development" << endl;
-	build_n_run("test-smith-form-local", counter, flag, "bds"); //"intermittent failures");
-	no_build_n_run("test-ftrmm", counter, flag, "bb/cp");
-
-	if (flag > 0) cout << "	Immature tests" << endl;
-	no_build_n_run("test-quad-matrix", counter, flag, "half baked, bds responsible"); no_build_n_run("test-dense-zero-one", counter, flag, "half baked, bds responsible"); build_n_run("test-zo", counter, flag, "half baked, BY responsible");
-	// test-integer-tools -- there is no test-integer-tools.C file
-	// no one has taken these on.
-	no_build_n_run("test-la-block-lanczos",counter,flag,"segfaults");
-#endif
-
-#if 0
-	if (flag > 0) cout << "	Non tests" << endl;
-	no_build_n_run("test-template", counter, flag, "yup, model for tests, not an actual test");
-	// test-common.C is included in test-common.h,
-	//  but could be separately compiled (no templates).
-	no_build_n_run("test-common", counter, flag, "not a test");
-	no_build_n_run("test-fields", counter, flag, "deprecated");
-	no_build_n_run("test-matrix", counter, flag, "deprecated?");
-	no_build_n_run("test-image-field", counter, flag, "deprecated");
-
-//BENCHMARKS =
-	build_n_run("benchmark-fields", counter, flag, "not a test");
-	build_n_run("benchmark-blas-domain", counter, flag, "not a test");
-
-# I put test-gssv_rank in hmrg:~saunders/gen_superlu.  It is not linbox until and unless it is made to work
-# test-gssv is an ntl test
+// fullcheck customization: warnings, skips, hides, optional package dependencies
+
+//// notes section (customize fullcheck here) ////
+
+if (honor_skips) {
+hide("test-block-ring", "non commutative rings not supported");
+//hide("test-ffpack", "testTURBO fails, move to ffpack tests?");
+hide("test-ftrmm", "should move to attic");
+skip("test-givaro-fields", "may fail on small fields because of supposed non-randomness or failure to find a non trivial element");
+hide("test-image-field", "deprecated");
+//skip("test-isposdef", "intermittent inf loop");
+//skip("test-ispossemidef", "intermittent inf loop");
+hide("test-la-block-lanczos", "not maintained. operator >> missing");
+hide("test-mg-block-lanczos", "not maintained");
+hide("test-modular", "deprecated");
+hide("test-modular-byte",  "deprecated");
+hide("test-modular-short",  "deprecated");
+//skip("test-modular-balanced-int",  "test and modular-balanced disagree on init/convert");
+//skip("test-modular-balanced-double",  "test and modular-balanced disagree on init/convert");
+//skip("test-moore-penrose", "inf loop");
+skip("test-optimization", "not in test form");
+skip("test-quad-matrix", "depends on out-of-date blackbox/zo.h");
+//skip("test-rational-reconstruction-base", "inf loop");
+skip("test-rat-charpoly", "inf loop");
+skip("test-rat-minpoly", "stale test. solns over QQ need fresh tests"); // "intermittent failures")
+skip("test-rat-solve", "stale test. solns over QQ need fresh tests"); // "infinite loop")
+skip("test-poly-det", "incomplete test (if still relevant)");
+skip("test-sparse-map-map", "const issue in givranditer, curious use of nonexistant next() in Extension");
+//Tests requiring further development
+skip("test-tutorial", "incomplete test");
+skip("test-dense-zero-one", "half baked, bds responsible");
+}
 
-# no explicit test needed, I guess...
-#        Transpose is tested in test-triplesbb
-#        Compose is tested in test-butterfly
+//warn("test-echelon-form", "new");
+warn("test-fibb",  "incomplete");
+//warn("test-matrix-domain", "intermittent row permutation failure");
+warn("test-param-fuzzy", "Noncompliant field");
+//		template <class F2Field> BitVector (const F2Field&) {}
+//warn("test-qlup", "GF2 fails to compile");
+//warn("test-rank-u32", "intermittent failure"/*, "vector (bb) responsible"*/);
+warn("test-rat-charpoly", "stale test. solns over QQ need fresh tests");//, "infinite loop, cp responsible?")
+warn("test-rat-solve", "infinite loop");
+//warn("test-smith-form-local", "bds, intermittent failures");
+warn("test-solve", "most of the tests are commented out");
+warn("test-toom-cook", "one method does not work");
+//warn("test-transpose", "sometimes fails on Sparsematrix/getEntry");
+warn("test-quad-matrix", "half baked, bds responsible");
+
+
+//// optional package dependency section ////
+	set< string> ntl_tests;
+	ntl_tests.insert("test-ntl-hankel");
+	ntl_tests.insert("test-ntl-lzz_p");
+	ntl_tests.insert("test-ntl-lzz_pe");
+	ntl_tests.insert("test-ntl-lzz_px");
+	ntl_tests.insert("test-ntl-lzz_pex");
+	warn("test-toeplitz-det", "we should have a non NTL version.");
+	ntl_tests.insert("test-toeplitz-det");
+	warn("test-ntl-rr", "floating point equality");
+	ntl_tests.insert("test-ntl-rr");
+	ntl_tests.insert("test-ntl-sylvester");
+	ntl_tests.insert("test-ntl-toeplitz");
+	ntl_tests.insert("test-ntl-zz_p");
+
+	// are these really ntl dependent?
+	ntl_tests.insert("test-smith-form");
+	ntl_tests.insert("test-smith-form-adaptive");
+	ntl_tests.insert("test-smith-form-iliopoulos");
+	set< string> ocl_tests;
+	ocl_tests.insert("test-opencl-domain");
+
+//// Things are automatic from here onward. ////
+
+	// process optional dependencies 
+	#ifndef LINBOX_HAVE_OCL
+    for (set< string>::iterator i = ocl_tests.begin(); i != ocl_tests.end(); ++i) 
+		skip(*i, "OpenCL not present");
+	#endif
+	#ifndef __LINBOX_HAVE_NTL
+    for (set< string>::iterator i = ntl_tests.begin(); i != ntl_tests.end(); ++i) 
+		skip(*i, "NTL not present");
+	#endif
+// build and run the tests section
+	string t, cmd;
+	system("ls test-*C >.tmp-tests");
+	ifstream tests(".tmp-tests");
+	int buildfail = 0, runfail = 0, skipped = 0, pass = 0; // counts
+	vector<string> all_tests;
+	while (tests >> t) {t.resize(t.size()-2); all_tests.push_back(t);}
+//#ifdef LINBOX_HAVE_OPENMP
+//#pragma omp parallel for 
+//PARFOR1D(i, 0, all_tests.size(), SPLITTER(),
+//#endif
+	for (size_t i = 0; i < all_tests.size(); ++i) 
+	{
+		t = all_tests[i];
+		if (hides.count(t) > 0) continue; // ignore entirely
+		stringstream report;
+		report.width(35);
+		report << left << t;
+		if (skips.count(t) > 0) { // print skip message
+			report << "skipped, " + warn_note[t];
+			skipped++;
+		} else { // do build
+			if (force_build) {
+				cmd = "touch " + t + ".C";
+				system(cmd.c_str());
+			}
+			// build
+			cmd = "make " + t + " 2> /dev/null > /dev/null";
+			report << "build ";
+			int status = system(cmd.c_str());
+//			#ifndef LINBOX_HAVE_OPENMP
+//			if (status == 2) break; 
+//			#endif
+			if (status != 0) { // build failure
+				buildfail++;
+				report << "FAIL ";
+			} else {// do run
+				report << "OK, run ";
+				std::ostringstream prog ;
+				prog << "./" << t ;
+				status = system(prog.str().c_str());
+//				#ifndef LINBOX_HAVE_OPENMP
+//				if (status == 2) break;
+//				#endif
+				if (status == 0) {
+					report << "OK.  " + warn_note[t];
+					pass++;
+				} else {
+					runfail++;
+					report << "FAIL" + warn_note[t];
+				}
+			}
+		}
+		if (reporting) cout << report.str() << endl;
+	} // for i
+	//); // parfor
 
-#endif
-  }
-	// the summary
+	//// summary ////
 	cout << "--------------------------------------------------------------------" << endl;
-	if (counter.buildfail || counter.runfail)
-		cout << "Of " << counter.total() << " tests, "
-			<< counter.buildfail << " failed to compile and "
-			<< counter.runfail << " failed at runtime."
-			<< "  (" << counter.skipped << " skipped tests.)" << endl;
+	int total = pass + buildfail + runfail + skipped;
+	if (buildfail || runfail)
+		cout << "Of " << total << " tests, "
+		    << pass << " passed, "
+			<< buildfail << " failed to compile, "
+			<< runfail << " failed at runtime, " 
+			<< " and " << skipped << " were skipped." << endl;
 	else
-		cout << endl << "All " << counter.total() << " tests pass."
-			<< "  (" << counter.skipped << " skipped tests.)" << endl;
-	cout << "  File tests/checkdata contains any output from the builds and runs." << endl;
+		cout << endl << "All " << total - skipped << " tests pass."
+			<< "  (There were " << skipped << " skipped tests.)" << endl;
 	cout << "--------------------------------------------------------------------" << endl;
 
-	return counter.buildfail || counter.runfail ? -1 : 0;
-}
-
-void no_build_n_run(string s, counts& cnt, int flag, string r)
-{
-	if (flag >= 5) flag -= 5;
-	if (flag > 0) {
-		cout.width(35); cout << left << s;
-		if (r.length() > 0) cout << "skipped, " << r << "." << endl;
-		else cout << "skipped." << endl;
-	}
-	cnt.skipped++;
-}
-
-void build_n_run(string s, counts& cnt, int flag, string r)
-{
-// ignore r.
-	string cmd;
-	if (flag >= 5) { // force build
-		flag -= 5;
-		cmd = "touch " + s + ".C";
-		system(cmd.c_str());
-	}
-	if (flag >= 1) {
-		cout.width(35); cout << left << s;
-		cout << "build"; cout.flush();
-	}
-	cmd = "make " + s + " 2>> checkdata >> checkdata";
-	int status = system(cmd.c_str());
-	if (status == 2) goto abort; // valid on at least one platform.
-	if (status != 0) { // build failure
-		if (flag >= 1) cout << " FAILS" << endl;
-		if (flag >= 3) system ("cat checkdata; rm checkdata");
-		cnt.buildfail++;
-		// if (flag == 2) could grep for first "error" in compiler output
-
-	}
-       	else { // build success
-		if (flag >= 1) { cout << "\b\b\b\b\b  run"; cout.flush(); }
-		std::ostringstream prog ;
-		prog << "./" << s ;
-		status = system(prog.str().c_str());
-		if (status == 2) goto abort; // valid on at least one platform.
-		if (status != 0) {
-			if (flag >= 1) cout << " FAILS" << endl;
-			if (flag >= 3) system ("cat checkdata; rm checkdata");
-			cnt.runfail++;
-		}
-	       	else {
-			if (flag >= 1) cout << "\b\b\b\bOK  " << endl;
-			if (flag >= 2) system ("grep \"warn\" checkdata; rm checkdata");
-			cnt.pass++;
-			//cerr << "ok" << endl;
-		}
-	}
-	if (flag >= 3) system("rm -f checkdata");
-	return;
-abort:
-	cout << endl << "Interrupted, aborting." << endl;
-	exit(-1);
-}
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
+	return buildfail || runfail ? -1 : 0;
+} // main
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index a0fd89f..de774b0 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -20,7 +20,6 @@
 
 
 EXTRA_DIST = \
-	test.matrix			\
 	sms.matrix			\
 	matrix-market-array.matrix	\
 	maple-sparse1.matrix		\
@@ -28,3 +27,6 @@ EXTRA_DIST = \
 	generic-dense.matrix		\
 	sparse-row.matrix		\
 	matrix-market-coordinate.matrix
+
+#  test.matrix			\
+	#
diff --git a/tests/data/Makefile.in b/tests/data/Makefile.in
deleted file mode 100644
index 0cbfb2d..0000000
--- a/tests/data/Makefile.in
+++ /dev/null
@@ -1,475 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2010 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = tests/data
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-EXTRA_DIST = \
-	test.matrix			\
-	sms.matrix			\
-	matrix-market-array.matrix	\
-	maple-sparse1.matrix		\
-	maple-dense1.matrix		\
-	generic-dense.matrix		\
-	sparse-row.matrix		\
-	matrix-market-coordinate.matrix
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps tests/data/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps tests/data/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-	distclean distclean-generic distclean-libtool distdir dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-man install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/tests/data/matrix-market-coordinate.matrix b/tests/data/matrix-market-coordinate.matrix
index d7902d0..738c6bd 100644
--- a/tests/data/matrix-market-coordinate.matrix
+++ b/tests/data/matrix-market-coordinate.matrix
@@ -1,4 +1,5 @@
 %%MatrixMarket  maTRIX   	COORDINATE inteGER   gENERal
+%
 11 11 33
 1 3 2
 1 4 3
diff --git a/tests/data/test.matrix b/tests/data/test.matrix
deleted file mode 100644
index 6455a6e..0000000
--- a/tests/data/test.matrix
+++ /dev/null
@@ -1,10 +0,0 @@
-0 0 2
-1 1 2
-2 2 2
-3 3 2
-4 4 2
-5 5 2
-6 6 2
-7 7 2
-8 8 2
-9 9 2
\ No newline at end of file
diff --git a/tests/matrix/Makefile.in b/tests/matrix/Makefile.in
deleted file mode 100644
index 262b374..0000000
--- a/tests/matrix/Makefile.in
+++ /dev/null
@@ -1,474 +0,0 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-# Copyright (c) 2011 the LinBox group
-# ========LICENCE========
-# This file is part of the library LinBox.
-#
-# LinBox is free software: you can redistribute it and/or modify
-# it under the terms of the  GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-# ========LICENCE========
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = tests/matrix
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/macros/aclocal-include.m4 \
-	$(top_srcdir)/macros/config-header.m4 \
-	$(top_srcdir)/macros/debug.m4 \
-	$(top_srcdir)/macros/expat-check.m4 \
-	$(top_srcdir)/macros/fflas-ffpack-check.m4 \
-	$(top_srcdir)/macros/fplll-check.m4 \
-	$(top_srcdir)/macros/givaro-check.m4 \
-	$(top_srcdir)/macros/gmp-check.m4 \
-	$(top_srcdir)/macros/iml-check.m4 \
-	$(top_srcdir)/macros/lapack-check.m4 \
-	$(top_srcdir)/macros/libtool.m4 \
-	$(top_srcdir)/macros/lidia-check.m4 \
-	$(top_srcdir)/macros/linbox-benchmark.m4 \
-	$(top_srcdir)/macros/linbox-doc.m4 \
-	$(top_srcdir)/macros/linbox-misc.m4 \
-	$(top_srcdir)/macros/linbox-opt.m4 \
-	$(top_srcdir)/macros/ltoptions.m4 \
-	$(top_srcdir)/macros/ltsugar.m4 \
-	$(top_srcdir)/macros/ltversion.m4 \
-	$(top_srcdir)/macros/lt~obsolete.m4 \
-	$(top_srcdir)/macros/m4ri-check.m4 \
-	$(top_srcdir)/macros/m4rie-check.m4 \
-	$(top_srcdir)/macros/maple-check.m4 \
-	$(top_srcdir)/macros/mpfr-check.m4 \
-	$(top_srcdir)/macros/ntl-check.m4 \
-	$(top_srcdir)/macros/saclib-check.m4 \
-	$(top_srcdir)/macros/sage-check.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-depcomp =
-am__depfiles_maybe =
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BLAS_CFLAGS = @BLAS_CFLAGS@
-BLAS_LIBS = @BLAS_LIBS@
-CC = @CC@
-CCNAM = @CCNAM@
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DBG = @DBG@
-DEBUG_CFLAGS = @DEBUG_CFLAGS@
-DEFAULT_CFLAGS = @DEFAULT_CFLAGS@
-DEFS = @DEFS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXPAT_CFLAGS = @EXPAT_CFLAGS@
-EXPAT_LIBS = @EXPAT_LIBS@
-FFLAS_FFPACK_CFLAGS = @FFLAS_FFPACK_CFLAGS@
-FFLAS_FFPACK_LIBS = @FFLAS_FFPACK_LIBS@
-FFLAS_FFPACK_LOC = @FFLAS_FFPACK_LOC@
-FGREP = @FGREP@
-FPLLL_CFLAGS = @FPLLL_CFLAGS@
-FPLLL_LIBS = @FPLLL_LIBS@
-GIVARO_CFLAGS = @GIVARO_CFLAGS@
-GIVARO_LIBS = @GIVARO_LIBS@
-GMP_CFLAGS = @GMP_CFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GMP_VERSION = @GMP_VERSION@
-GREP = @GREP@
-IML_CFLAGS = @IML_CFLAGS@
-IML_LIBS = @IML_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIDIA_CFLAGS = @LIDIA_CFLAGS@
-LIDIA_LIBS = @LIDIA_LIBS@
-LINBOX_BENCH_PATH = @LINBOX_BENCH_PATH@
-LINBOX_DOC_PATH = @LINBOX_DOC_PATH@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-M4RIE_CFLAGS = @M4RIE_CFLAGS@
-M4RIE_LIBS = @M4RIE_LIBS@
-M4RI_CFLAGS = @M4RI_CFLAGS@
-M4RI_LIBS = @M4RI_LIBS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MAPLE_CFLAGS = @MAPLE_CFLAGS@
-MAPLE_HOME = @MAPLE_HOME@
-MAPLE_LIBS = @MAPLE_LIBS@
-MAPLE_VERSION = @MAPLE_VERSION@
-MKDIR_P = @MKDIR_P@
-MPFR_CFLAGS = @MPFR_CFLAGS@
-MPFR_LIBS = @MPFR_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-NTL_CFLAGS = @NTL_CFLAGS@
-NTL_LIBS = @NTL_LIBS@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PROF = @PROF@
-RANLIB = @RANLIB@
-RM = @RM@
-SACLIB_CFLAGS = @SACLIB_CFLAGS@
-SACLIB_LIBS = @SACLIB_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTS_CFLAGS = @TESTS_CFLAGS@
-VERSION = @VERSION@
-WARN = @WARN@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-EXTRA_DIST = \
-	 coin.h     \
-	 hadamard.h \
-	 invhilb.h  \
-	 jmat.h     \
-	 minmax.h   \
-	 randomans.h\
-   	 randommat.h
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps tests/matrix/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu --ignore-deps tests/matrix/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-	distclean distclean-generic distclean-libtool distdir dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-man install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/tests/matrix/invhilb.h b/tests/matrix/invhilb.h
index 1d7eccb..78e45c5 100644
--- a/tests/matrix/invhilb.h
+++ b/tests/matrix/invhilb.h
@@ -41,12 +41,12 @@ Matrix& invhilb(const Ring& R, Matrix& Mat, int n){
 		if(i>1) p = ((n-i+1)*p*(n+i-1))/((i-1)*(i-1));
 		r = p*p;
 		R.init(val, (r/(2*i-1)));
-		Mat.setEntry(i_ind, i_ind, val);
+		Mat.setEntry((size_t)i_ind,(size_t) i_ind, val);
 		for(j_ind=i, j = i+1; j <= n; j++, j_ind++){
 			r = -1*((n-j+1)*r*(n+j-1))/((j-1)*(j-1));
 			R.init(val, (r/(i+j-1)));
-			Mat.setEntry(i_ind, j_ind, val);
-			Mat.setEntry(j_ind, i_ind, val);
+			Mat.setEntry((size_t)i_ind, (size_t)j_ind, val);
+			Mat.setEntry((size_t)j_ind, (size_t)i_ind, val);
 		}
 	}
 
diff --git a/tests/matrix/minmax.h b/tests/matrix/minmax.h
index 4502f2e..8c15dc7 100644
--- a/tests/matrix/minmax.h
+++ b/tests/matrix/minmax.h
@@ -58,13 +58,15 @@ Matrix& maxmat(const Ring& R, Matrix& Mat, size_t n){
 template<class Ring, class Matrix>
 Matrix& qlehmer(const Ring& R, Matrix& Mat, size_t n){
 	size_t val;
-	typename Ring::Element tmp;
+	typename Ring::Element tmp, tmp2;
 
 	for(size_t i = 0; i < n; ++i){
 		for(size_t j = 0; j < n; ++j){
 			val = i > j ? i : j;
 			val++;
-			R.init(tmp, val*val);
+			R.init(tmp, val);
+			R.init(tmp2, val);
+			R.mulin(tmp, tmp2);
 			Mat.setEntry(i, j, tmp);
 		}
 	}
diff --git a/tests/matrix/randomans.h b/tests/matrix/randomans.h
index fcf0d58..cb7bf3e 100644
--- a/tests/matrix/randomans.h
+++ b/tests/matrix/randomans.h
@@ -57,21 +57,22 @@ Matrix& randomAns(const Ring& R, Matrix& Mat, size_t n, size_t epr){
 			val = neg*(rand()%CEILING);
 			//  choose random location for value
 			do{
-				pos = int(rand()%n);  // pos in [0, n)
+				pos = int((size_t)rand()%n);  // pos in [0, n)
 			}
 			while(used(usedV, pos));
 			usedV[k] = pos;  //  record location
 
 			//std::cerr << "\t set value " << val << " in pos " << pos << std::endl;
 			//  finally, set entry
-			Mat.setEntry(i, pos, R.init(tmp, val));
+			Mat.setEntry((size_t)i, (size_t)pos, R.init(tmp, val));
 		}
 	}
 
+	//! @bug use BlasVector.
 	//  to store each element in our final row
 	vector<typename Ring::Element> tmps(n);
 	for(size_t i=0; i<n; ++i)
-		R.init(tmps[i], 0);
+		R.assign(tmps[i], R.zero);
 
 	//  build last row incorporate every row
 	for(size_t i = 0; i < n-1; ++i){
@@ -80,17 +81,17 @@ Matrix& randomAns(const Ring& R, Matrix& Mat, size_t n, size_t epr){
 		val = neg*(rand()%COMB_CEILING);
 		//  val is the multiplier for this row
 		for(size_t j = 0; j < n; ++j){
-			R.axpyin(tmps[j], val, Mat.getEntry(i, j));
+			R.axpyin(tmps[j], val, Mat.getEntry((size_t)i, (size_t)j));
 		}
 	}
 	for(size_t i=0; i<n; ++i)
-		Mat.setEntry(n-1, i, tmps[i]);
+		Mat.setEntry((size_t)n-1, (size_t)i, tmps[i]);
 
 	//  add one to random value
-	size_t wildcard = rand()%n;
-	R.init(tmp, Mat.getEntry(n-1, wildcard));
+	size_t wildcard = (size_t)rand()%n;
+	R.init(tmp, Mat.getEntry((size_t)n-1, (size_t)wildcard));
 	R.addin(tmp, 1);
-	Mat.setEntry(n-1, wildcard, tmp);
+	Mat.setEntry((size_t)n-1, (size_t)wildcard, tmp);
 
 	return Mat;
 }
diff --git a/tests/matrix/randommat.h b/tests/matrix/randommat.h
index e0ac291..ff22052 100644
--- a/tests/matrix/randommat.h
+++ b/tests/matrix/randommat.h
@@ -62,15 +62,15 @@ Matrix& randomMat(const Ring& R, Matrix& Mat, size_t n, size_t epr){
 			val = neg*(rand()%CEILING);
 			//  choose random location for value
 			do{
-				pos = int(rand()%n);  // pos in [0, n)
+				pos = int((size_t)rand()%n);  // pos in [0, n)
 			}
 			while(used(usedV, pos));
 			usedV[k] = pos;  //  record location
 
 			//std::cerr << "\t set value " << val << " in pos " << pos << std::endl;
 			//  finally, set entry
-			//Mat.setEntry(i, pos, R.init(tmp, 1));
-			Mat.setEntry(i, pos, R.init(tmp, val));
+			//Mat.setEntry(i, pos, R.assign(tmp, R.one));
+			Mat.setEntry((size_t)i, (size_t)pos, R.init(tmp, val));
 		}
 	}
 
diff --git a/tests/perfpublisher.sh b/tests/perfpublisher.sh
new file mode 100755
index 0000000..2c3c452
--- /dev/null
+++ b/tests/perfpublisher.sh
@@ -0,0 +1,158 @@
+#!/bin/bash
+# Script to format tests results into a single xml file.
+# See https://wiki.jenkins-ci.org/display/JENKINS/PerfPublisher+Plugin
+# -----
+# 2014/11/17 - Written by AB <Alexis.Breust at imag.fr>
+
+XMLFILE=$1
+tests=$2
+COMPILER=$3
+
+#=================#
+# Plateform infos #
+#=================#
+
+COMPILERVERSION=$($COMPILER --version 2>&1 | head -1)
+CPUFREQ=$(lscpu | grep "MHz" | rev | cut -f1 -d' ' | rev)
+ARCH=$(uname -m)
+OSNAME=$(uname -s)
+OSVERSION=$(uname -r)
+
+if hash lsb_release 2>/dev/null
+	then DISTRIB=$(lsb_release -ds)
+	else DISTRIB='Unknown distribution'
+fi
+
+#==========#
+# Prologue #
+#==========#
+
+if [[ -f $XMLFILE ]]
+then
+	echo '----> WARNING: File '$XMLFILE' is not empty.'
+	echo '---->          Results will be added to its end.'
+fi
+
+#========#
+# Header #
+#========#
+
+echo '<?xml version="1.0" encoding="UTF-8"?>' >> $XMLFILE
+echo '<report name="tests-report" categ="tests">' >> $XMLFILE
+
+#=======#
+# Start #
+#=======#
+
+echo '<start>' >> $XMLFILE
+echo '<date format="YYYYMMDD" val="'$(date +%Y%m%d)'" />' >> $XMLFILE
+echo '<time format="HHMMSS" val="'$(date +%H%M%S)'" />' >> $XMLFILE
+echo '</start>' >> $XMLFILE
+
+#=======#
+# Tests #
+#=======#
+
+for test in $tests
+do
+	if [[ ! -f $test ]]
+	then
+		#File does not exist: compile it
+		echo '[Compiling]' $test
+		COMPILESTART=$(date +%s%3N)
+		COMPILELOG=$(make $test 2>&1; echo 'Returned state: '$?)
+		COMPILEEND=$(date +%s%3N)
+		COMPILETIME=$(($COMPILEEND - $COMPILESTART))
+		COMPILECHECK=$(echo $COMPILELOG | grep -o '[^ ]*$')
+		COMPILETIMERELEVANT='true'
+	else
+		#File does exist
+		echo '[Already compiled]' $benchmark
+		COMPILELOG='(Previously compiled)'
+		COMPILETIME='0.0'
+		COMPILECHECK='0'
+		COMPILETIMERELEVANT='false'
+	fi
+	
+	if [[ $COMPILECHECK -ne 0 ]]
+	then
+		#Compilation failure
+		# EXECUTED='no' - keep it to yes so that Jenkins
+		# uses it within its results
+		EXECUTED='yes'
+		PASSED='no'
+		STATE='0'
+		EXECUTIONLOG='(Not executed)'
+		EXECUTIONTIME='0.0'
+		COMPILETIMERELEVANT='false'
+		EXECUTIONTIMERELEVANT='false'
+		ERRORLOG='Does not compile.'
+		echo '-> Does not compile.'
+	else
+		#Compilation success
+		echo '[Executing]' $test
+		EXECUTED='yes'
+		EXECUTIONSTART=$(date +%s%3N)
+		EXECUTIONLOG=$(./$test  2>&1; echo 'Returned state: '$?)
+		EXECUTIONEND=$(date +%s%3N)
+		EXECUTIONTIME=$(($EXECUTIONEND - $EXECUTIONSTART))
+		EXECUTIONCHECK=$(echo $EXECUTIONLOG | grep -o '[^ ]*$')
+		
+		if [[ $EXECUTIONCHECK -ne 0 ]]
+		then
+			#Execution failure
+			PASSED='no'
+			STATE='0'
+			EXECUTIONTIMERELEVANT='false'
+			ERRORLOG='Execution failure.'
+			echo '-> Execution failure.'
+		else
+			#Execution success
+			PASSED='yes'
+			STATE='100'
+			EXECUTIONTIMERELEVANT='true'
+			ERRORLOG=''
+		fi
+	fi
+
+	echo '<test name="'$test'" executed="'$EXECUTED'">' >> $XMLFILE
+	echo '<targets><target>TEST</target></targets>' >> $XMLFILE
+	echo '<platform>' >> $XMLFILE
+	echo '<os>' >> $XMLFILE
+	echo '<name><![CDATA['$OSNAME']]></name>' >> $XMLFILE
+	echo '<version><![CDATA['$OSVERSION']]></version>' >> $XMLFILE
+	echo '<distribution><![CDATA['$DISTRIB']]></distribution>' >> $XMLFILE
+	echo '</os>' >> $XMLFILE
+	echo '<processor arch="'$ARCH'">' >> $XMLFILE
+	echo '<frequency unit="MHz" cpufreq="'$CPUFREQ'" />' >> $XMLFILE
+	echo '</processor>' >> $XMLFILE
+	echo '<compiler name="'$COMPILER'" version="'$COMPILERVERSION'" />' >> $XMLFILE
+	echo '</platform>' >> $XMLFILE
+	echo '<result>' >> $XMLFILE
+	
+	# Logs
+	echo '<success passed="'$PASSED'" state="'$STATE'" />' >> $XMLFILE
+	echo '<errorlog><![CDATA['$ERRORLOG']]></errorlog>' >> $XMLFILE
+	echo '<log name="Compile output"><![CDATA['"$COMPILELOG"']]></log>' >> $XMLFILE
+	echo '<log name="Execution output"><![CDATA['"$test $EXECUTIONLOG"']]></log>' >> $XMLFILE
+	
+	# Times
+	echo '<compiletime unit="ms" mesure="'$COMPILETIME'" isRelevant="'$COMPILETIMERELEVANT'" />' >> $XMLFILE
+	echo '<executiontime unit="ms" mesure="'$EXECUTIONTIME'" isRelevant="'$EXECUTIONTIMERELEVANT'" />' >> $XMLFILE
+	
+	echo '</result>' >> $XMLFILE
+	echo '</test>' >> $XMLFILE
+done
+
+#========#
+# Footer #
+#========#
+
+echo '</report>' >> $XMLFILE
+
+#==========#
+# Epilogue #
+#==========#
+
+echo 'Results correctly exported to' $XMLFILE
+
diff --git a/tests/test-PID-integer.C b/tests/test-PID-integer.C
deleted file mode 100644
index d765b95..0000000
--- a/tests/test-PID-integer.C
+++ /dev/null
@@ -1,91 +0,0 @@
-
-/* tests/test-PID-integer.C
- * Copyright (C) 2011 Dave Saunders
- *
- * morphed from another test by Dave Saunders <saunders at cis.udel.edu>
- *
- * 
- * ========LICENCE========
- * This file is part of the library LinBox.
- * 
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This 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
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-/*! @file  tests/test-PID-integer.C
- * @ingroup tests
- * @brief run runFieldTests testRandomIterator tests on PID_integer
- * @test run runFieldTests testRandomIterator tests on PID_integer
- */
-
-
-#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <sstream>
-#include <vector>
-#include <queue>
-
-#include "test-common.h"
-#include "test-field.h"
-
-#include "linbox/field/PID-integer.h"
-
-using namespace LinBox;
-
-int main (int argc, char **argv)
-{
-	static size_t n = 10000;
-	static int iterations = 1;
-	static int trials = 100000;
-	static int categories = 100;
-	static int hist_level = 1;
-
-	static Argument args[] = {
-		{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT,     &n },
-		{ 't', "-t T", "Number of trials for the random iterator test.", TYPE_INT, &trials },
-		{ 'c', "-c C", "Number of categories for the random iterator test.", TYPE_INT, &categories },
-		{ 'H', "-H H", "History level for random iterator test.", TYPE_INT, &hist_level },
-		END_OF_ARGUMENTS
-	};
-
-	parseArguments (argc, argv, args);
-
-	commentator().start("PID-integer ring test suite", "PID-integer");
-	bool pass = true;
-
-	PID_integer ZZ;
-
-	// Make sure some more detailed messages get printed
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
-
-	if (!runBasicRingTests (ZZ,  "PID-integer",  iterations, false)) pass = false;
-//	if (!testRandomIterator (ZZ,  "PID-integer", trials, categories, hist_level)) pass = false;
-
-	commentator().stop("PID-integer, field test suite");
-	return pass ? 0 : -1;
-}
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/tests/test-bitonic-sort.C b/tests/test-bitonic-sort.C
index 3563e9f..1f24904 100644
--- a/tests/test-bitonic-sort.C
+++ b/tests/test-bitonic-sort.C
@@ -36,6 +36,8 @@
 #include "linbox/util/commentator.h"
 #include "linbox/vector/stream.h"
 #include "test-common.h"
+#include "linbox/vector/blas-vector.h"
+//#include "linbox/field/unparametric.h"
 
 using namespace LinBox;
 
@@ -62,8 +64,11 @@ bool testRandom (std::ostream& report, size_t s)
 
 	Comparator comp;
 
-	std::vector<int> v(s), d(s);
-	std::vector<int>::iterator p1, p2;
+	typedef Givaro::ZRing<int> Ints ;
+	Ints	I ;
+
+	BlasVector<Ints> v(I,s), d(I,s);
+	BlasVector<Ints>::iterator p1, p2;
 
 	for (p1 = v. begin(), p2 = d.begin(); p1 != v.end(); ++ p1, ++p2)
 		*p1 = *p2 = rand();
diff --git a/tests/test-blackbox-block-container.C b/tests/test-blackbox-block-container.C
index 1e925f7..e92c688 100644
--- a/tests/test-blackbox-block-container.C
+++ b/tests/test-blackbox-block-container.C
@@ -1,5 +1,4 @@
 
-
 /* tests/test-blackbox-block-container.C
  *
  * Written by bds
@@ -35,20 +34,20 @@
  * @brief  no doc
  * @test no doc.
  */
-
+#if 0
 
 
 #include "linbox/linbox-config.h"
 
 #include <iostream>
 #include <fstream>
-#include <vector>
+
 #include <cstdio>
 
 #include "linbox/algorithms/blackbox-block-container.h"
 
 #include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 
 #include "test-common.h"
 
@@ -75,11 +74,11 @@ int main (int argc, char **argv)
 
 	commentator().start("block container test", "bbbc");
 	ostream& report = commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION);
-	report << "over Modular<double>" << endl;
-	typedef Modular<double> Field;
+	report << "over Givaro::Modular<double>" << std::endl;
+	typedef Givaro::Modular<double> Field;
 	typedef BlasMatrix<Field> Block;
 	typedef BlasMatrix<Field> Blackbox;
-	Modular<double> F (q);
+	Givaro::Modular<double> F (q);
 
 	Blackbox A(F, n, n);
 	Block U(F, k, n);
@@ -90,12 +89,171 @@ int main (int argc, char **argv)
 	BlackboxBlockContainer<Field, Blackbox> B(&A, F, U, V);
 
 	// A more thorough test should be constructed.
+#endif
 
+ /*
+ * Written by George Yuhasz <yuhasz at gmail.com>
+ *
+ * --------------------------------------------------------
+ *
+ */
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <givaro/modular.h>
+
+#include "linbox/util/commentator.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/algorithms/blackbox-block-container.h"
+
+#include "test-common.h"
+#include "test-generic.h"
+
+using namespace LinBox;
+// using namespace std;
+
+template<class Blackbox>
+bool testContainer (const Blackbox& A, size_t r, size_t c);
+
+int main (int argc, char **argv)
+{
+	bool pass = true;
+
+	static size_t n = 4;
+	static size_t r = 2;
+	static size_t c = 2;
+	static size_t q = 5;
+
+	static Argument args[] = {
+		{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT,     &n },
+		{ 'r', "-r R", "Set rowdim of blocks R.", TYPE_INT,     &r },
+		{ 'c', "-c C", "Set coldim of blocks to C.", TYPE_INT,     &c },
+		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INT, &q },
+		END_OF_ARGUMENTS
+	};
+
+	typedef Givaro::Modular<uint64_t> Field;
+
+	parseArguments (argc, argv, args);
+	Field F ((uint32_t)q);
+
+	commentator().start("bmseq test suite", "BlasMatrix");
+
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (5);
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
+	// ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+
+	commentator().start("SparseMatrix test");
+	SparseMatrix<Field> A(F, n, n);
+	/*
+	if (n > 2) {
+		A.setEntry(0,1,F.one);
+		A.setEntry(1,2,F.one);
+		A.setEntry(2,0,F.one);
+	}
+	for(size_t i=(n > 2 ? 3 : 0); i<n;i++)
+	*/
+	for(size_t i=0; i<n;i++)
+			A.setEntry(i,n-1-i,F.one);
+ 	pass = pass and	testContainer(A, r, c);
+	commentator().stop("SparseMatrix test");
+
+#if 0 // BlackboxBlockContainer<BlasMatrix<..> > is not working.
+	commentator().start("BlasMatrix<Givaro::Modular<int> > test");
+	BlasMatrix<Field> B(F, n, n);
+	for(size_t i=0; i<n;i++)
+			B.setEntry(i,i,F.one);
+	 	pass = pass and testContainer(B, r, c);
+	commentator().stop("BlasMatrix<Givaro::Modular<int> > test");
+
+	commentator().start("BlasMatrix<Givaro::Modular<double> > test");
+	Givaro::Modular<double> G(q);
+	BlasMatrix<Givaro::Modular<double> > C(G, n, n);
+	for(size_t i=0; i<n;i++)
+			C.setEntry(i,i,G.one);
+	 	pass = pass and testContainer(C, r, c);
+	commentator().stop("BlasMatrix<Givaro::Modular<double> > test");
+#endif
+
+	// A more thorough test should be constructed.
 	if (pass) commentator().stop("block container test pass");
 	else commentator().stop("block container test FAIL");
 	return pass ? 0 : -1;
 }
 
+template<class Blackbox>
+bool testContainer (const Blackbox& A, size_t r, size_t c) {
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+	bool pass = true;
+	typedef typename Blackbox::Field Field;
+	MatrixDomain<Field> MD(A.field());
+	size_t n = A.rowdim(); // = A.coldim()
+	BlasMatrix<Field> U(A.field(),r,n);
+	BlasMatrix<Field> V(A.field(),n,c);
+	BlasMatrix<Field> AV(A.field(),n,c);
+	BlasMatrix<Field> UAV(A.field(),r,c);
+	typename Field::RandIter rand(A.field());
+	/*
+	for(size_t i=0; i<r;i++)
+		for(size_t j=0; j<n; j++)
+			U.setEntry(i,j, A.field().zero);
+	for(size_t i=0; i<r;i++)
+		U.setEntry(i,i, A.field().one);
+	*/
+	for(size_t i=0; i<r;i++)
+		for(size_t j=0; j<n; j++)
+			rand.random(U.refEntry(i,j));
+
+	/*
+	for(size_t i=0; i<n;i++)
+		for(size_t j=0; j<c; j++)
+			V.setEntry(i,j, A.field().zero);
+	for(size_t i=0; i<c;i++)
+		V.setEntry(i,i, A.field().one);
+		*/
+	for(size_t i=0; i<n;i++)
+		for(size_t j=0; j<c; j++){
+			rand.random(V.refEntry(i,j));
+		}
+	MD.copy(AV, V);
+	report << std::endl << "A" << std::endl;
+	A.write(report);
+	report << std::endl << "U" << std::endl;
+	U.write(report);
+	report << std::endl << "V" << std::endl;
+	V.write(report);
+	report << std::endl << "AV" << std::endl;
+	AV.write(report);
+	BlackboxBlockContainer<Field, Blackbox > blockseq(&A,A.field(),U,V);
+	MD.mul(UAV,U,AV);
+	typename BlackboxBlockContainer<Field, Blackbox >::const_iterator contiter(blockseq.begin());
+	report << std::endl << "container size is " << blockseq.size() << std::endl;
+	report << std::endl;
+	bool pass1 = MD.areEqual(UAV, *contiter);
+	if (not pass1) report << "sequences differ at index 0" << std::endl;
+	else report << "sequences agree at index 0" << std::endl;
+	report << "My UA^0V";
+	UAV.write(report) << std::endl;
+	report << "Container UA^0V";
+	(*contiter).write(report ) << std::endl << std::endl;
+	for (size_t i=1; i<10; i++){
+		MD.leftMulin(A,AV);
+		MD.mul(UAV,U,AV);
+		++contiter;
+		pass1 = MD.areEqual(UAV, *contiter);
+		if (not pass1) report << "sequences differ at index " << i << std::endl;
+		else report << "sequences agree at index " << i << std::endl;
+		report << "My UA^" << i << "V ";
+		UAV.write(report) << std::endl;
+		report << "Container UA^" << i << "V ";
+		(*contiter).write(report) << std::endl << std::endl;
+		pass = pass and pass1;
+	}
+	return pass;
+}
+
 // vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
diff --git a/tests/test-blackbox.h b/tests/test-blackbox.h
index 5ca3e7d..e40c593 100644
--- a/tests/test-blackbox.h
+++ b/tests/test-blackbox.h
@@ -11,20 +11,20 @@
  * ------------------------------------
  * fix testLinearity for rectangular matrices.  2006-02-17 Hui Wang
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -42,18 +42,29 @@
 #include "linbox/util/commentator.h"
 #include "linbox/util/field-axpy.h"
 #include "linbox/vector/stream.h"
-#include "linbox/vector/vector-domain.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/util/matrix-stream.h"
 
 #include "test-common.h"
 
 using namespace std;
+/*
+Generic tests for black boxes
+
+For field F, BB A, vector streams s, t:
+testTranspose (F, A, s, t)
+testLinearity (A, s, t)
+testReadWrite(A)
 
-// Generic tests for black boxes
-/// testBlackbox combines testTranspose and testLinearity
+testBlackboxNoRW(A) // calls testTranspose and testLinearity.
+testBlackbox(A) // calls all three generic tests.
 
-/** Random check that (u^T A) v = u^T (A v).
+testBB(F) has been deleted. It assumed a BB could be built from a single size param (this is never true?!).
+*/
+
+/** Generic Blackbox test 1: Random check that (u^T A) v = u^T (A v).
  *
- * Take the given black box and compute u^T A v via <A^T u, v> and <u, Av> for
+ * Take the given black box and compute u^T A v via <code><A^T u, v></code> and <code><u, Av></code> for
  * randomly chosen u and v. Check whether the results are equal. In theory, this
  * should guarantee that tranpose is working correctly if apply and dot product
  * are also working correctly. Apply and dot product should, of course, be
@@ -68,14 +79,14 @@ using namespace std;
 
 template <class Field, class Blackbox, class Vector>
 static bool
-testTranspose (Field                             &F,
-	       Blackbox							 &A,
-	       LinBox::VectorStream<Vector>      &stream1,
-	       LinBox::VectorStream<Vector>      &stream2)
+testTranspose (const Field                      &F,
+	       Blackbox				&A,
+	       LinBox::VectorStream<Vector>     &stream1,
+	       LinBox::VectorStream<Vector>     &stream2)
 {
 	bool ret = true;
 
-	Vector u, v, uA, Av;
+	Vector u(F), v(F), uA(F), Av(F);
 
 	LinBox::VectorWrapper::ensureDim (u, A.rowdim ());
 	LinBox::VectorWrapper::ensureDim (uA, A.coldim ());
@@ -94,8 +105,9 @@ testTranspose (Field                             &F,
 		stream1.next (u);
 		stream2.next (v);
 
-		//ostream &report = LinBox::commentator().report (LinBox::Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
+                    //ostream &report = LinBox::commentator().report (LinBox::Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
 
+                    //A.write( report << "A is ");
 		VD.write( report << "Input vector u:            ", u) << endl;
 		VD.write( report << "Input vector v:            ", v) << endl;
 
@@ -104,6 +116,7 @@ testTranspose (Field                             &F,
 		VD.write( report << "Result of apply:           ", Av) << endl;
 
 		VD.dot (r1, u, Av);
+
 		A.applyTranspose (uA, u);
 
 		VD.write( report << "Result of transpose apply: ", uA) << endl;
@@ -120,8 +133,11 @@ testTranspose (Field                             &F,
 			<< "ERROR: Values are not equal" << endl;
 		}
 
-		LinBox::commentator().stop ("done");
-		LinBox::commentator().progress ();
+		if (ret)
+			LinBox::commentator().stop ("testTranspose pass");
+		else
+			LinBox::commentator().stop ("testTranspose FAIL");
+		//LinBox::commentator().progress ();
 	}
 
 	return ret;
@@ -139,21 +155,23 @@ testTranspose (Field                             &F,
  * Return true on success and false on failure
  */
 
-template <class Field, class BB, class Vector>
+template <class BB, class Vector>
 static bool
-testLinearity (Field                             &F,
+testLinearity (//const Field                             &F,
 	       BB 				 &A,
 	       LinBox::VectorStream<Vector>      &stream1,
 	       LinBox::VectorStream<Vector>      &stream2)
 {
-	bool ret = true, iter_passed;
+	bool ret = true;
 
 	size_t n = A.rowdim ();
 	size_t m = A.coldim ();
 
-	Vector x, y, xpay, Axpay, Ax, Ay, AxpaAy;
-	LinBox::VectorDomain <Field> VD (F);
-	typename Field::RandIter r (F);
+	typedef typename BB::Field Field;
+	Field F( A.field() );
+	Vector x(F), y(F), xpay(F), Axpay(F), Ax(F), Ay(F), AxpaAy(F);
+	LinBox::VectorDomain <Field> VD (A.field());
+	typename Field::RandIter r (A.field());
 	typename Field::Element alpha;
 
 	LinBox::VectorWrapper::ensureDim (x, m);
@@ -170,19 +188,18 @@ testLinearity (Field                             &F,
 	while (stream1 && stream2) {
 		LinBox::commentator().startIteration ((unsigned int) stream1.j ());
 
-		iter_passed = true;
+		bool iter_passed = true;
 
 		stream1.next (x);
 		stream2.next (y);
 
 		r.random (alpha);
 
-		//ostream &report = LinBox::commentator().report (LinBox::Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
 		VD.write( report << "Input vector x: ", x) << endl;
 
 		VD.write( report << "Input vector y: ", y) << endl;
 
-		F.write( report << "Input alpha: ", alpha) << endl;
+		A.field().write( report << "Input alpha: ", alpha) << endl;
 
 		VD.axpy ( xpay, alpha, y, x);
 		A.apply ( Axpay, xpay);
@@ -207,39 +224,126 @@ testLinearity (Field                             &F,
 		if (!iter_passed)
 			LinBox::commentator().report (LinBox::Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
 			<< "ERROR: Vectors are not equal" << endl;
-
-		LinBox::commentator().stop ("done");
-		LinBox::commentator().progress ();
+		if (iter_passed)
+			LinBox::commentator().stop ("testLinearity pass");
+		else
+			LinBox::commentator().stop ("testLinearity FAIL");
+		//LinBox::commentator().progress ();
 	}
 
 	return ret;
 }
 
-/** Generic blackbox test 4: combination of tests
+/** Generic Blackbox test 3: black box read/write.
+ *
+ * write the black box A, read it back and check equality.
+ *
+ * F - Field over which to perform computations
+ * A - Black box
+ *
+ * Return true on success and false on failure
+ */
+
+template <class BB>
+static bool
+testReadWrite(BB &A)
+{
+	typedef typename BB::Field Field;
+	bool pass = true;
+	ostream &report = LinBox::commentator().report (LinBox::Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+	report << "Blackbox Read/Write test: write then read back" << std::endl;
+
+	ofstream out("temp2");
+	if (not out) {
+		pass = false;
+		report << "failure to open file for writing" << std::endl;
+	}
+	A.write(out) << std::endl;
+	{
+		BB B(A.field());
+		ifstream in("temp2");
+		if (not in) {
+			pass = false;
+			report << "failure to open file for reading" << std::endl;
+		}
+		B.read(in);
+		LinBox::MatrixDomain<Field> MD(A.field());
+		if (not MD.areEqual(A, B)) {
+			pass = false;
+			report << "failure to get same matrix back from write/read" << std::endl;
+			B.write(report << "B is ") << std::endl;
+		}
+	}
+
+/*  A constructor from a matrix stream is not a required member of a blackbox. -bds
+	{
+		ifstream in("temp2");
+		if (not in) {
+			pass = false;
+			report << "failure to open file for reading" << std::endl;
+		}
+
+
+		LinBox::MatrixStream<Field> ms (A.field(), in);
+		BB B( ms );
+		LinBox::MatrixDomain<Field> MD(A.field());
+		if (not MD.areEqual(A, B)) {
+			pass = false;
+			report << "failure to get same matrix back from write/read" << std::endl;
+			B.write(report << "B is ") << std::endl;
+		}
+	}
+*/
+	if (pass) report << "PASS: successful write/read" << std::endl;
+	return pass;
+}
+
+
+template <class BB, class Vector>
+static bool
+LooksLikeZero(BB &A, LinBox::VectorStream<Vector> &stream)
+{	typedef typename BB::Field Field;
+	LinBox::VectorDomain<Field> VD(A.field());
+	LinBox::BlasVector<Field> x(A.field(), A.coldim()),
+				  y(A.field(), A.rowdim());
+	while (stream)
+	{	stream.next(x);
+		A.apply(y, x);
+		if (not VD.isZero(y)) return false;
+	}
+	ostream &report = LinBox::commentator().report (LinBox::Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+	report << "BB looks like zero:" << std::endl;
+	VD.write(report << "x: ", x) << std::endl;
+	VD.write(report << "Ax: ", y) << std::endl;
+	return true;
+}
+/** Generic blackbox test 3: combination of tests
  *
- * Call testTranspose and testLinearity.
  * If large, time apply and applyTranspose.
- * if small, call testSmallBlackbox.
+ * Call testTranspose and testLinearity.
  */
+
 template <class BB>
 static bool
-testBlackbox(BB &A)
+testBlackboxNoRW(BB &A, bool zeroCheck=true)
 {
-	size_t largeThresh = 2000; // Above it do timing of apply and applyTr.
 	typedef typename BB::Field Field;
-	typedef std::vector<typename Field::Element> DenseVector;
+	typedef LinBox::BlasVector<Field> DenseVector;
 	std::ostream &report = LinBox::commentator().report (LinBox::Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
 	report << "testBlackbox on " << A.rowdim() << " by " << A.coldim() << " matrix." << endl;
+	//if (std::max(A.rowdim(),A.coldim())<15)
+	 //   A.write(report << "Blackbox = ");
 
 	LinBox::commentator().setMaxDepth(-1);
 	bool ret = true;
-	Field F = A.field();
+	const Field& F = A.field();
 
-	/* timing tests */   // I changed the order of all tests. Timing now is the first set of tests and then linearity and transpose
+	/* timing tests */
 	{
-		DenseVector x(A.coldim()), y(A.rowdim());
-		for(size_t i = 0; i < A.coldim(); ++i) F.init(x[i], i);
-		for(size_t i = 0; i < A.rowdim(); ++i) F.init(y[i], i);
+		size_t largeThresh = 2000; // Above it do timing of apply and applyTr.
+		DenseVector x(F,A.coldim()), y(F,A.rowdim());
+		for(size_t i = 0; i < A.coldim(); ++i) F.init(x[i], (double)i);
+		for(size_t i = 0; i < A.rowdim(); ++i) F.init(y[i], (double)i);
 		//A.apply(y, x);
 
 		if (A.coldim() >= largeThresh)
@@ -259,65 +363,44 @@ testBlackbox(BB &A)
 
 	} // timing test block
 
-#if 1
 	size_t iterations = 1;
 	typename Field::RandIter r(F);
-	LinBox::RandomDenseStream<Field, DenseVector> stream1 (F, r, A.rowdim(), iterations);
-	typename Field::Element x;
-	r.random(x);
-	LinBox::RandomDenseStream<Field, DenseVector> stream2 (F, r, A.coldim(), iterations);
-
-	LinBox::commentator().start ("\t--Testing A(ax+y) = a(Ax) + (Ay)", "testLinearity", 1);
-	ret = ret && testLinearity (F, A, stream1, stream2);
-
-	LinBox::commentator().stop (MSG_STATUS (ret),
-				  (const char *) 0, "testLinearity");
-
-	LinBox::commentator().start ("\t--Testing u^T(Av) = (u^T A)v",
-				   "testTranspose", 1);
-
-	LinBox::RandomDenseStream<Field, DenseVector> stream3 (F, r, A.rowdim(), iterations);
-	LinBox::RandomDenseStream<Field, DenseVector> stream4 (F, r, A.coldim(), iterations);
-
+	LinBox::RandomSparseStream<Field, DenseVector> stream1 (F, r, 1.0, A.rowdim(), iterations, 11);
+	//typename Field::Element x;
+	//r.random(x);
+	LinBox::RandomSparseStream<Field, DenseVector> stream2 (F, r, 1.0, A.coldim(), iterations);
+	ret = ret && testLinearity (A, stream1, stream2);
+
+	LinBox::RandomSparseStream<Field, DenseVector> stream3 (F, r, 1.0, A.rowdim(), iterations);
+	LinBox::RandomSparseStream<Field, DenseVector> stream4 (F, r, 1.0, A.coldim(), iterations);
 	ret = ret && testTranspose (F, A, stream3, stream4);
-	LinBox::commentator().stop (MSG_STATUS (ret),
-				  (const char *) 0, "testTranspose");
 
-#endif
+	DenseVector x(F,A.coldim()), y(F,A.rowdim());
+	if (zeroCheck) {
+		LinBox::RandomSparseStream<Field, DenseVector> stream5 (F, r, 1.0, A.coldim(), 10);
+		ret = ret & not LooksLikeZero(A, stream5);
+	}
 
 	return ret;
 }
 
-/** Generic blackbox test 5: test several sizes
- *
- * Call testTranspose and testLinearity.
- * If large, time apply and applyTranspose.
- * if small, call test
- SmallBlackbox.
- */
-template <class Field, class Blackbox>
+template <class BB>
 static bool
-testBB(Field& F)
+testBlackbox(BB &A, bool read_write=true, bool zero_check = true)
 {
-	bool pass = true;
-
-	Blackbox A(10);
-	if (!testBlackbox<Field, vector<typename Field::Element> >(F, A, 1))
-		pass = false;
-	Blackbox B(10000);
-	if (!testBlackbox<Field, vector<typename Field::Element> >(F, B, 1))
-		pass = false;
+	bool ok = testBlackboxNoRW(A,zero_check);
+	if (ok && read_write)
+			return testReadWrite(A);
+	return ok ;
 
-	return pass;
+	// return testBlackboxNoRW(A) and testReadWrite(A);
 }
-
 #endif // __LINBOX_test_blackbox_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-blas-domain.C b/tests/test-blas-domain.C
index 2653a48..192ff70 100644
--- a/tests/test-blas-domain.C
+++ b/tests/test-blas-domain.C
@@ -6,20 +6,20 @@
  *
  * ---------------------------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -37,31 +37,38 @@
  */
 
 
- // where is this used?
-#define __MINP_CONSTRUCT
-#include "linbox/linbox-config.h"
+#include <linbox/linbox-config.h>
 #include <iostream>
 #include <string>
+
 #include "linbox/integer.h"
-#include "linbox/field/gf2.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/modular-balanced.h"
-#include "linbox/field/givaro.h"
+//#include "linbox/field/gf2.h"
+//#include "linbox/domain/blas_matrix_domain_gf2.h"
+// defines template<> class BlasMatrixDomain<GF2> { ... };
+// ... and template<> BlasMatrix<GF2> {}
+#if 0
+#include "linbox/field/gf3.h"
+//#include "linbox/domain/blas_matrix_domain_gf3.h"
+// defines template<> class BlasMatrixDomain<GF3> { ... };
+// ... and template<> BlasMatrix<GF3> {}
+#endif
+#include "linbox/ring/modular.h"
+#include <givaro/modular-balanced.h>
+
 #ifdef __LINBOX_HAVE_NTL
-#include "linbox/field/ntl.h"
+#include "linbox/ring/ntl.h"
 #endif
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
 #include "linbox/matrix/matrix-domain.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/randiter/nonzero.h"
+#include <givaro/givranditer.h>
 #include "linbox/util/commentator.h"
-#include "linbox/algorithms/blas-domain.h"
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
 // #include "linbox/algorithms/matrix-hom.h"
 
 #include "linbox/matrix/random-matrix.h"
+#include "linbox/blackbox/scalar-matrix.h"
+
 
-#include <vector>
 
 #include "test-common.h"
 
@@ -72,6 +79,128 @@ const int maxpretty = 35;
 string blank;
 
 const char* pretty(string a)
+;
+
+template <class Vector>
+bool localAreEqual(
+	const Vector& a,
+	const Vector& b)
+;
+
+template <class Field>
+static bool testMulAdd (const Field& F, size_t n, int iterations)
+;
+template <class Field>
+static bool testMulAddAgain (const Field& Zp, size_t n, int iterations)
+;
+template <class Field>
+static bool testMulAddShapeTrans (const Field &F, size_t m, size_t n, size_t k, int iterations)
+;
+template<class Field, bool LeftSide, bool UnitDiag>
+static bool testTriangMulShapeTrans (const Field &F, size_t m, size_t n, int iterations)
+;
+template <class Field>
+static bool testRank (const Field& F,size_t n, int iterations)
+;
+template <class Field>
+static bool testDet (const Field& F,size_t n, int iterations)
+;
+template <class Field>
+static bool testInv (const Field& F,size_t n, int iterations)
+;
+template <class Field>
+static bool testTriangularSolve (const Field& F, size_t m, size_t n, int iterations)
+;
+template <class Field>
+static bool testSolve (const Field& F, size_t m, size_t n, int iterations)
+;
+template <class Field>
+static bool testPermutation (const Field& F, size_t m, int iterations)
+;
+template <class Field>
+static bool testLQUP (const Field& F, size_t m, size_t n, int iterations)
+;
+template <class Field>
+static bool testMinPoly (const Field& F, size_t n, int iterations)
+;
+template <class Field>
+static bool testCharPoly (const Field& F, size_t n, int iterations)
+;
+template<class Field>
+static bool testBlasMatrixConstructors(const Field& Fld, size_t m, size_t n)
+;
+template<class Field>
+int launch_tests(Field & F, size_t n, int iterations)
+;
+bool launch_gf2_tests(GF2 & F, size_t n)
+;
+#if 0
+bool launch_gf3_tests(GF3 & F, size_t n)
+;
+#endif
+
+// test BlasMatrixDomain<Field> for various fields
+int main(int argc, char **argv)
+{
+
+	static size_t n = 3;
+	//static integer q = 1000003U;
+	static integer q = 65521;
+	static int iterations = 1;
+
+    static Argument args[] = {
+        { 'n', "-n N", "Set dimension of test matrices to NxN", TYPE_INT,     &n },
+        { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1]",  TYPE_INTEGER, &q },
+        { 'i', "-i I", "Perform each test for I iterations",    TYPE_INT,     &iterations },
+	END_OF_ARGUMENTS
+    };
+
+	parseArguments (argc, argv, args);
+
+	// BB. (Blas)MatrixDomain are not very generic...
+
+	bool pass = true;
+	srand ((unsigned)time (NULL));
+
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
+	commentator().start("BlasMatrixDomain test suite", "BlasMatrixDomain");
+
+	Givaro::Modular<double> F1 (q);
+	GF2 F2 ;
+	//GF3 F3 ;
+	Givaro::ModularBalanced<double> F4(q);
+	Givaro::Modular<float> F5(2011);
+	Givaro::Modular<uint32_t> F6(1009); // (2011);
+
+	pass &= launch_tests(F1,n,iterations);
+
+        pass &= launch_gf2_tests(F2,n);
+
+#pragma message "#warning GF3 -> working on sliced wrapper"
+	//pass &= launch_gf3_tests(F3,n);
+
+	pass &= launch_tests(F4,n,iterations);
+
+	pass &= launch_tests(F5,n,iterations);
+
+        pass &= launch_tests(F6,n,iterations);
+
+//#pragma message "#warning Givaro::Modular<bool> is not working"
+	//pass &= launch_tests(F7,n,iterations);
+
+#ifdef __LINBOX_HAVE_NTL
+#pragma message "#warning NTL_ZZp is not working at all"
+	NTL::ZZ_p::init(NTL::to_ZZ((size_t)q));
+	NTL_ZZ_p F8;
+	// pass &= launch_tests(F8,n,iterations);
+#endif
+
+	commentator().stop(MSG_STATUS (pass), (const char *) 0,"BlasMatrixDomain test suite");
+	return pass ? 0 : -1;
+}
+
+const char* pretty(string a)
 {
 
 	blank = "     " + a;
@@ -82,7 +211,25 @@ const char* pretty(string a)
 	 return blank.c_str();
 }
 #define mycommentator commentator
+ostream & report = mycommentator().report();
 
+template<class Vector>
+ bool localAreEqual(
+	const Vector& a,
+	const Vector& b)
+{
+	if ( a.size() != b.size() )
+		return false;
+
+	const typename Vector::Field & F = a.field();
+
+	typename Vector::const_iterator it = a.begin();
+	typename Vector::const_iterator jt = b.begin();
+	for ( ; it != a.end(); ++it, ++jt)
+		if (! F.areEqual(*it,*jt))
+			return false;
+	return true;
+}
 
 template <class Field>
 static bool testMulAdd (const Field& F, size_t n, int iterations)
@@ -93,32 +240,29 @@ static bool testMulAdd (const Field& F, size_t n, int iterations)
 	typedef BlasMatrix<Field>          Matrix;
 
 	//Commentator mycommentator;
-	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
-	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	mycommentator().start (pretty("Testing muladd"),"testMulAdd",iterations);
+	//mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
+	//mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
+	mycommentator().start (pretty("Testing muladd"),"testMulAdd",(unsigned int)iterations);
 
 	RandIter G(F);
 	bool ret = true;
 	BlasMatrixDomain<Field> BMD(F);
-	MatrixDomain<Field>      MD(F);
-	VectorDomain<Field>      VD(F);
 
+	Matrix A(F,n,n);
 	for (int k=0;k<iterations; ++k) {
 
 		mycommentator().progress(k);
-		Matrix A(F, n,n),B(F, n,n),C(F, n,n),D(F, n,n),T(F, n,n),R(F, n,n);
-		std::vector<Element> x(n),y(n),z(n),t(n);
+		// A.init(F, n, n);
+		Matrix /*A(F, n,n),*/B(F, n,n),C(F, n,n),D(F, n,n),T(F, n,n),R(F, n,n);
+		BlasVector<Field> x(F,n),y(F,n),z(F,n),t(F,n);
 
-		Element alpha, beta,malpha,tmp;
+		Element alpha, beta,malpha;
 
 
 		// Create 3 random n*n matrices
-		for (size_t i=0;i<n;++i)
-			for (size_t j=0;j<n;++j){
-				A.setEntry(i,j,G.random(tmp));
-				B.setEntry(i,j,G.random(tmp));
-				C.setEntry(i,j,G.random(tmp));
-			}
+		A.random();
+		B.random();
+		C.random();
 
 		// Create 2 random vectors
 		for (size_t i=0;i<n;++i) {
@@ -136,26 +280,40 @@ static bool testMulAdd (const Field& F, size_t n, int iterations)
 
 		BMD.mul(D,A,C);
 		BMD.mul(T,B,C);
-		MD.addin(D,T);
+		BMD.addin(D,T);
 
-		MD.add(T,A,B);
+		BMD.add(T,A,B);
 		BMD.muladd(R,malpha,D,alpha,T,C);
 
-		if (!MD.isZero(R))
+		if (!BMD.isZero(R)) {
 			ret=false;
+		}
 
 		// compute z = beta.y + alpha.A*x
+		// report << "beta := " << beta <<  ";"  << std::endl;
+		// report << "y := " <<y <<  ";" << std::endl;
+		// report << "alpha := " << alpha <<  ";" << std::endl;
+		// A.write(report << "A :=",Tag::FileFormat::Maple) << ";" << std::endl;
+		// report << "x := " << x << std::endl;
 
 		BMD.muladd(z,beta,y,alpha,A,x);
+		// report << "z := "<< z << std::endl;
 
-		MD.vectorMul(t,A,x);
+		// report << "#apply" <<std::endl;
+		A.apply(t, x);
+		//MD.vectorMul(t,A,x);
 		for (size_t i=0;i<n;++i){
-		  F.mulin(t[i],alpha);
-		  F.axpyin(t[i],beta,y[i]);
+			F.mulin(t[i],alpha);
+			F.axpyin(t[i],beta,y[i]);
 		}
+		// report << "t := "<< t << std::endl;
 
-		if (!VD.areEqual(t,z))
+		if (!localAreEqual(t,z)){
+			exit(-1);
+			report << "2 alpha = " << alpha << "mod " << F.characteristic() << std::endl;
+			//report << "2 alpha = " << alpha << "mod " << F.characteristic() << std::endl;
 			ret=false;
+		}
 	}
 
 	mycommentator().stop(MSG_STATUS (ret), (const char *) 0, "testMulAdd");
@@ -165,30 +323,33 @@ static bool testMulAdd (const Field& F, size_t n, int iterations)
 
 // computes D = alpha A B + beta C on integers and check the result is ok mod p.
 // actually we check the mod p muladd here...
-bool CheckMulAdd( const Integer & alpha ,
-		  const BlasMatrix<PID_integer> & A ,
-		  const BlasMatrix<PID_integer> & B ,
+template <class Field>
+bool CheckMulAdd(const Field& Zp, const Integer & alpha ,
+		  const BlasMatrix<Givaro::ZRing<Integer> > & A ,
+		  const BlasMatrix<Givaro::ZRing<Integer> > & B ,
 		  const Integer & beta ,
-		  const BlasMatrix<PID_integer> & C)
+		  const BlasMatrix<Givaro::ZRing<Integer> > & C)
 {
 
 	size_t M = C.rowdim();
 	size_t N = C.coldim();
 
-	typedef Modular<double>       Field ;
-	typedef Field::Element      Element ;
+	//typedef Givaro::Modular<double>       Field ;
+	typedef typename Field::Element      Element ;
 
-	PID_integer ZZ ;
-	MatrixDomain<PID_integer> ZMD(ZZ);
+	Givaro::ZRing<Integer> ZZ ;
+	// compiles, but wrong if BlasMatrixDomain is used
+	MatrixDomain<Givaro::ZRing<Integer> > ZMD(ZZ);
 
-	BlasMatrix<PID_integer> D(ZZ,M,N);
+	BlasMatrix<Givaro::ZRing<Integer> > D(ZZ,M,N);
 
+/*
 	Integer p = Integer::random_between(10,12) ;
 	nextprime(p,p); //!@bug si p n'est pas premier, fgemm fait n'importe quoi (division par alpha)
 	Field Zp (p);
+*/
 
 	BlasMatrixDomain<Field> BMD (Zp);
-	MatrixDomain<Field>      MD (Zp);
 
 	// Ep = b C + a A B
 	ZMD.muladd(D,beta,C,alpha,A,B);
@@ -212,31 +373,31 @@ bool CheckMulAdd( const Integer & alpha ,
 	// Ep = bp Cp + ap Ap Bp mod p
 	BMD.muladd(Ep,bp,Cp,ap,Ap,Bp);
 
-	bool pass = MD.areEqual(Ep,Dp);
+	bool pass = BMD.areEqual(Ep,Dp);
 	if (!pass) {
 #if 0 /*  maple check on stdout */
-		std::cout << "#########################################" << std::endl;
-		std::cout << "p := " << p << ';' << std::endl;
-		std::cout << "ap,bp := " << ap << ',' << bp << ';' << std::endl;
-		Ap.write(std::cout << "Ap :=", LinBoxTag::FormatMaple) << ";" << std::endl;
-		Bp.write(std::cout << "Bp :=", LinBoxTag::FormatMaple) << ";" << std::endl;
-		Cp.write(std::cout << "Cp :=", LinBoxTag::FormatMaple) << ";" << std::endl;
-		Dp.write(std::cout << "Dp :=", LinBoxTag::FormatMaple) << ";" << std::endl;
-		Ep.write(std::cout << "Ep :=", LinBoxTag::FormatMaple) << ";" << std::endl;
-		std::cout << "alpha,beta := " << alpha << ',' << beta << ';' << std::endl;
-		A.write(std::cout << "A :=",LinBoxTag::FormatMaple) << ';' << std::endl;
-		B.write(std::cout << "B :=",LinBoxTag::FormatMaple) << ';' << std::endl;
-		C.write(std::cout << "C :=",LinBoxTag::FormatMaple) << ';' << std::endl;
-		D.write(std::cout << "E :=",LinBoxTag::FormatMaple) << ';' << std::endl;
-		std::cout << "evalm(E-alpha*A.B-beta*C);" << std::endl;
-		std::cout << "#########################################" << std::endl;
+		report << "#########################################" << std::endl;
+		report << "p := " << p << ';' << std::endl;
+		report << "ap,bp := " << ap << ',' << bp << ';' << std::endl;
+		Ap.write(report << "Ap :=", Tag::FileFormat::Maple) << ";" << std::endl;
+		Bp.write(report << "Bp :=", Tag::FileFormat::Maple) << ";" << std::endl;
+		Cp.write(report << "Cp :=", Tag::FileFormat::Maple) << ";" << std::endl;
+		Dp.write(report << "Dp :=", Tag::FileFormat::Maple) << ";" << std::endl;
+		Ep.write(report << "Ep :=", Tag::FileFormat::Maple) << ";" << std::endl;
+		report << "alpha,beta := " << alpha << ',' << beta << ';' << std::endl;
+		A.write(report << "A :=",Tag::FileFormat::Maple) << ';' << std::endl;
+		B.write(report << "B :=",Tag::FileFormat::Maple) << ';' << std::endl;
+		C.write(report << "C :=",Tag::FileFormat::Maple) << ';' << std::endl;
+		D.write(report << "E :=",Tag::FileFormat::Maple) << ';' << std::endl;
+		report << "evalm(E-alpha*A.B-beta*C);" << std::endl;
+		report << "#########################################" << std::endl;
 #endif
 		mycommentator().report() << " *** BMD ERROR (" << alpha << ',' << beta << ") *** " << std::endl;
 	}
 
 	// Ep = bp Cp + ap Ap Bp mod p
-	MD.muladd(Ep,bp,Cp,ap,Ap,Bp);
-	bool all = MD.areEqual(Ep,Dp);
+	BMD.muladd(Ep,bp,Cp,ap,Ap,Bp);
+	bool all = BMD.areEqual(Ep,Dp);
 	if (!all) {
 		mycommentator().report() << " *** MD ERROR *** " << std::endl;
 	}
@@ -246,17 +407,20 @@ bool CheckMulAdd( const Integer & alpha ,
 }
 
 // tests MulAdd for various parameters alpha and beta.
+// This test ignores Field F.  It tests only integer matrices.  
+// It should not really be included in launch_tests<Field>.
+// For now we'll call it when characteristic is zero.
 template <class Field>
-static bool testMulAddAgain (const Field& , size_t n, int iterations)
+static bool testMulAddAgain (const Field& F, size_t n, int iterations)
 {
 
-	PID_integer ZZ ;
-	typedef BlasMatrix<PID_integer>         IMatrix;
+	Givaro::ZRing<Integer> ZZ ;
+	typedef BlasMatrix<Givaro::ZRing<Integer> >         IMatrix;
 
 	//Commentator mycommentator;
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	mycommentator().start (pretty("Testing muladd again"),"testMulAddAgain",iterations);
+	mycommentator().start (pretty("Testing muladd again"),"testMulAddAgain",(unsigned int)iterations);
 
 	bool ret = true;
 
@@ -267,14 +431,14 @@ static bool testMulAddAgain (const Field& , size_t n, int iterations)
 	size_t lB = 18 ;
 	size_t lC = 19 ;
 
-	PID_integer ZZ ;
+	Givaro::ZRing<Integer> ZZ ;
 
-	typedef RandomIntegerIter<>                       IntRandIter ;
-	typedef RandomDenseMatrix<IntRandIter, PID_integer > IntRand_t;
+	typedef RandomIntegerIterator<>                       IntRandIter ;
+	typedef RandomDenseMatrix<IntRandIter, Givaro::ZRing<Integer> > IntRand_t;
 
-	IntRandIter RA(lA);
-	IntRandIter RB(lB);
-	IntRandIter RC(lC);
+	IntRandIter RA(ZZ,lA);
+	IntRandIter RB(ZZ,lB);
+	IntRandIter RC(ZZ,lC);
 
 	IntRand_t Arand (ZZ,RA);
 	IntRand_t Brand (ZZ,RB);
@@ -300,35 +464,35 @@ static bool testMulAddAgain (const Field& , size_t n, int iterations)
 			}
 
 		a = 1 ; b = 1 ;
-		if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+		if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
 		a = 1 ; b = -1 ;
-		if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+		if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
 		a = -1 ; b = 1 ;
-		if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+		if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
 		a = -1 ; b = -1 ;
-		if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+		if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
 		a = 0 ; b = 1 ;
-		if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+		if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
 		a = 1 ; b = 0 ;
-		if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+		if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
 		a = 0 ; b = -1 ;
-		if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+		if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
 		a = -1 ; b = 0 ;
-		if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+		if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
 		a = Integer::random<false>(ll) ; b = 1 ;
-		if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+		if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
 		a =Integer::random<false>(ll) ; b = -1 ;
-		if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+		if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
 		a =  1 ; b = Integer::random<false>(ll) ;
-		if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+		if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
 		a = -1 ; b = Integer::random<false>(ll) ;
-		if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+		if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
 		a = 0 ; b = Integer::random<false>(ll) ;
-		if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+		if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
 		a = Integer::random<false>(ll) ; b = 0 ;
-		if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+		if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
 		a = Integer::random<false>(ll) ; b = Integer::random<false>(ll) ;
-		if (!CheckMulAdd(a,A,B,b,C)) ret = false ;
+		if (!CheckMulAdd(F,a,A,B,b,C)) ret = false ;
 
 	}
 
@@ -345,7 +509,7 @@ static bool testMulAddShapeTrans (const Field &F, size_t m, size_t n, size_t k,
 	bool ret = true ;
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	mycommentator().start (pretty("Testing muladd for shapes and transposition"),"testMulAddShapeTrans",iterations);
+	mycommentator().start (pretty("Testing muladd for shapes and transposition"),"testMulAddShapeTrans",(unsigned long)iterations);
 
 
 	typedef typename Field::Element Element;
@@ -356,7 +520,6 @@ static bool testMulAddShapeTrans (const Field &F, size_t m, size_t n, size_t k,
 	RandomDenseMatrix<Randiter,Field> RandMat(F,R);
 
 	BlasMatrixDomain<Field> BMD (F);
-	MatrixDomain<Field>      MD (F);
 
 	// input matrix
 	Matrix A(F, m,k);
@@ -387,29 +550,29 @@ static bool testMulAddShapeTrans (const Field &F, size_t m, size_t n, size_t k,
 	R.random(beta);
 
 	// témoin.
-	MD.muladd(D,beta,C,alpha,A,B);
+	BMD.muladd(D,beta,C,alpha,A,B);
 
 	// A,B
 	BMD.muladd(E,beta,C,alpha,A,B);
-	if (!MD.areEqual(E,D)) {
+	if (!BMD.areEqual(E,D)) {
 		ret = false ;
 		mycommentator().report() << " *** BMD ERROR (" << alpha << ',' << beta << ") (noTrans, noTrans) *** " << std::endl;
 	}
 
 	BMD.muladd(E,beta,C,alpha,A,tB);
-	if (!MD.areEqual(E,D))  {
+	if (!BMD.areEqual(E,D))  {
 		ret = false ;
 		mycommentator().report() << " *** BMD ERROR (" << alpha << ',' << beta << ") (noTrans, Trans) *** " << std::endl;
 	}
 
 	BMD.muladd(E,beta,C,alpha,tA,B);
-	if (!MD.areEqual(E,D)) {
+	if (!BMD.areEqual(E,D)) {
 		ret = false ;
 		mycommentator().report() << " *** BMD ERROR (" << alpha << ',' << beta << ") (Trans, noTrans) *** " << std::endl;
 	}
 
 	BMD.muladd(E,beta,C,alpha,tA,tB);
-	if (!MD.areEqual(E,D)) {
+	if (!BMD.areEqual(E,D)) {
 		ret = false ;
 		mycommentator().report() << " *** BMD ERROR (" << alpha << ',' << beta << ") (Trans, Trans) *** " << std::endl;
 	}
@@ -426,23 +589,20 @@ static bool testTriangMulShapeTrans (const Field &F, size_t m, size_t n, int ite
 	bool ret = true ;
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	mycommentator().start (pretty("Testing triangular matmul for shapes and transposition"),"testTriangMulShapeTrans",iterations);
+	mycommentator().start (pretty("Testing triangular matmul for shapes and transposition"),"testTriangMulShapeTrans",(unsigned int)iterations);
 
 
-	typedef typename Field::Element                               Element;
+	// typedef typename Field::Element                               Element;
 	typedef BlasMatrix<Field>                                   Matrix ;
 	typedef TriangularBlasMatrix<Field>               TriangularMatrix ;
-	typedef TransposedBlasMatrix<Matrix>                TransposedMatrix ;
+	// typedef TransposedBlasMatrix<Matrix>                TransposedMatrix ;
 	typedef TransposedBlasMatrix<TriangularMatrix > TransposedTriangular ;
 	typedef typename Field::RandIter                            Randiter ;
 	Randiter R(F) ;
 	RandomDenseMatrix<Randiter,Field> RandMat(F,R);
 
-	Element one ;
-	F.init(one,1);
 
 	BlasMatrixDomain<Field> BMD (F);
-	MatrixDomain<Field>      MD (F);
 
 	int k =(int) (LeftSide?m:n) ;
 	// input matrix
@@ -464,19 +624,19 @@ static bool testTriangMulShapeTrans (const Field &F, size_t m, size_t n, int ite
 
 	/*  test (L+U-I) B+B = LB+UB */
 	if (LeftSide)
-		BMD.muladd(D,one,B,one,A,B);
+		BMD.muladd(D,F.one,B,F.one,A,B);
 	else
-		BMD.muladd(D,one,B,one,B,A);
+		BMD.muladd(D,F.one,B,F.one,B,A);
 
 	/****  DIRECT ****/
 	{
 		/*  L */
-		TriangularMatrix L (A, LinBoxTag::Lower,
-				    (UnitDiag?LinBoxTag::Unit:LinBoxTag::NonUnit));
+		TriangularMatrix L (A, Tag::Shape::Lower,
+				    (UnitDiag?Tag::Diag::Unit:Tag::Diag::NonUnit));
 
 		/*  U */
-		TriangularMatrix U (A, LinBoxTag::Upper,
-				    (!UnitDiag?LinBoxTag::Unit:LinBoxTag::NonUnit));
+		TriangularMatrix U (A, Tag::Shape::Upper,
+				    (!UnitDiag?Tag::Diag::Unit:Tag::Diag::NonUnit));
 
 		/*  make product */
 		E = B ;
@@ -494,7 +654,7 @@ static bool testTriangMulShapeTrans (const Field &F, size_t m, size_t n, int ite
 		BMD.addin(E,G);
 
 		/*  check equality */
-		if (!MD.areEqual(E,D)) {
+		if (!BMD.areEqual(E,D)) {
 			ret = false ;
 			mycommentator().report() << " *** BMD ERROR (" << (LeftSide?"left":"right") << ',' << (UnitDiag?" L":" U") << " is unit) *** " << std::endl;
 		}
@@ -505,12 +665,12 @@ static bool testTriangMulShapeTrans (const Field &F, size_t m, size_t n, int ite
 	/****  Transpose ****/
 	{
 		/*  L */
-		TriangularMatrix L1 (A1, LinBoxTag::Lower,
-				    (UnitDiag?LinBoxTag::Unit:LinBoxTag::NonUnit));
+		TriangularMatrix L1 (A1, Tag::Shape::Lower,
+				    (UnitDiag?Tag::Diag::Unit:Tag::Diag::NonUnit));
 
 		/*  U */
-		TriangularMatrix U1 (A1, LinBoxTag::Upper,
-				    (!UnitDiag?LinBoxTag::Unit:LinBoxTag::NonUnit));
+		TriangularMatrix U1 (A1, Tag::Shape::Upper,
+				    (!UnitDiag?Tag::Diag::Unit:Tag::Diag::NonUnit));
 
 		TransposedTriangular L(L1);
 		TransposedTriangular U(U1);
@@ -530,7 +690,7 @@ static bool testTriangMulShapeTrans (const Field &F, size_t m, size_t n, int ite
 		BMD.addin(E,G);
 
 		/*  check equality */
-		if (!MD.areEqual(E,D)) {
+		if (!BMD.areEqual(E,D)) {
 			ret = false ;
 			mycommentator().report() << " *** BMD ERROR Transpose (" << (LeftSide?"left":"right") << ',' << (UnitDiag?" L":" U") << " is unit) *** " << std::endl;
 		}
@@ -558,21 +718,21 @@ static bool testRank (const Field& F,size_t n, int iterations)
 	//Commentator mycommentator;
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	mycommentator().start (pretty("Testing rank"),"testRank",iterations);
+	mycommentator().start (pretty("Testing rank"),"testRank",(unsigned int)iterations);
 
 	RandIter G(F);
-	NonzeroRandIter<Field> Gn(F,G);
+	Givaro::GeneralRingNonZeroRandIter<Field> Gn(G);
 	Element tmp;
-	unsigned int r;
 	bool ret = true;
 	BlasMatrixDomain<Field> BMD(F);
 
 	for (int k=0;k<iterations; ++k) {
+	unsigned int r;
 
 		mycommentator().progress(k);
 		BlasMatrix<Field> A(F,n,n),S(F,n,n), L(F,n,n);
 
-		r = (unsigned int)(random() % n);
+		r = (unsigned int)((size_t)random() % n);
 		// create S as an upper triangular matrix with r nonzero rows
 		for (size_t i=0;i<r;++i){
 			S.setEntry(i,i,Gn.random(tmp));
@@ -622,12 +782,11 @@ static bool testDet (const Field& F,size_t n, int iterations)
 	//Commentator mycommentator;
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	mycommentator().start (pretty("Testing determinant"),"testDet",iterations);
+	mycommentator().start (pretty("Testing determinant"),"testDet",(unsigned int)iterations);
 
 	RandIter G(F);
-	NonzeroRandIter<Field> Gn(F,G);
-	Element tmp,One,d;
-	F.init(One,1UL);
+	Givaro::GeneralRingNonZeroRandIter<Field> Gn(G);
+	Element tmp,d;
 
 	bool ret = true;
 	BlasMatrixDomain<Field> BMD(F);
@@ -643,7 +802,7 @@ static bool testDet (const Field& F,size_t n, int iterations)
 		// create S as an upper triangular matrix of full rank
 		// with diagonal's element equal to 1 except the first entry wich equals to d
 		for (size_t i=0;i<n;++i){
-			S.setEntry(i,i,One);
+			S.setEntry(i,i,F.one);
 			for (size_t j=i+1;j<n;++j)
 				S.setEntry(i,j,G.random(tmp));
 		}
@@ -653,7 +812,7 @@ static bool testDet (const Field& F,size_t n, int iterations)
 		for (size_t i=0;i<n;++i){
 			for (size_t j=0;j<i;++j)
 				L.setEntry(i,j,G.random(tmp));
-			L.setEntry(i,i,One);
+			L.setEntry(i,i,F.one);
 		}
 
 
@@ -687,27 +846,27 @@ static bool testInv (const Field& F,size_t n, int iterations)
 	//Commentator mycommentator;
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	mycommentator().start (pretty("Testing inverse"),"testInv",iterations);
+	mycommentator().start (pretty("Testing inverse"),"testInv",(unsigned int)iterations);
 
 	RandIter G(F);
-	NonzeroRandIter<Field> Gn(F,G);
-	Element One,tmp;
-	F.init(One,1UL);
+	Givaro::GeneralRingNonZeroRandIter<Field> Gn(G);
+	Element tmp;
 
 	bool ret = true;
-	MatrixDomain<Field> MD(F);
 	BlasMatrixDomain<Field> BMD(F);
 
 	Matrix Id(F, n,n);
 	for (size_t i=0;i<n;++i)
-		Id.setEntry(i,i,One);
+		Id.setEntry(i,i,F.one);
 
+	if (n < 10) 
+		Id.write(mycommentator().report() << "Id" << std::endl) << std::endl;
 	for (int k=0;k<iterations;++k) {
 
 		mycommentator().progress(k);
 
 
-		Matrix A(F, n,n),S(F, n,n), L(F, n,n), invA(F, n,n);
+		Matrix A(F, n,n),S(F, n,n), L(F, n,n); // , invA(F, n,n);
 
 		// create S as an upper triangular matrix of full rank
 		// with nonzero random diagonal's element
@@ -722,20 +881,36 @@ static bool testInv (const Field& F,size_t n, int iterations)
 		for (size_t i=0;i<n;++i){
 			for (size_t j=0;j<i;++j)
 				L.setEntry(i,j,G.random(tmp));
-			L.setEntry(i,i,One);
+			L.setEntry(i,i,F.one);
 		}
 
 		//  compute A=LS
 		BMD.mul(A,L,S);
+		//for (size_t i=0;i<n;++i){A.setEntry(i,i,F.one); }
+		//A.setEntry(0, n-1, F.mOne);
+
+	if (n < 10) 
+		A.write(mycommentator().report() << "A") << std::endl;
 
 		// compute the inverse of A
-		BMD.inv(invA,A);
+		Matrix invA(A);
+	if (n < 10) 
+		invA.write(mycommentator().report() << "before inversion, invA") << std::endl;
+	//int nullity;
+	//FFPACK::Invert2 (F, invA.rowdim(), A.getPointer(), A.getStride(), invA.getPointer(), invA.getStride(), nullity);
+		BMD.invin(invA);
+	if (n < 10) 
+		invA.write(mycommentator().report() << "invA") << std::endl;
 
 		// compute Ainv*A and A*Ainv
 		BMD.mul(L,invA,A);
+	if (n < 10) 
+		L.write(mycommentator().report() << "invA*A") << std::endl;
 		BMD.mul(S,A,invA);
+	if (n < 10) 
+		S.write(mycommentator().report() << "A*invA") << std::endl;
 
-		if (!MD.areEqual(L,Id) || !MD.areEqual(S,Id))
+		if (!BMD.areEqual(L,Id) || !BMD.areEqual(S,Id))
 			ret=false;
 	}
 
@@ -760,16 +935,13 @@ static bool testTriangularSolve (const Field& F, size_t m, size_t n, int iterati
 	//Commentator mycommentator;
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	mycommentator().start (pretty("Testing triangular solver"),"testTriangularSolve",iterations);
+	mycommentator().start (pretty("Testing triangular solver"),"testTriangularSolve",(unsigned int)iterations);
 
 	RandIter G(F);
-	NonzeroRandIter<Field> Gn(F,G);
-	Element One,tmp;
-	F.init(One,1UL);
+	Givaro::GeneralRingNonZeroRandIter<Field> Gn(G);
+	Element tmp;
 
 	bool ret = true;
-	MatrixDomain<Field> MD(F);
-	VectorDomain<Field>  VD(F);
 	BlasMatrixDomain<Field> BMD(F);
 
 	for (int k=0;k<iterations;++k) {
@@ -779,7 +951,7 @@ static bool testTriangularSolve (const Field& F, size_t m, size_t n, int iterati
 		Matrix Al(F, m,m),Au(F, m,m);
 		Matrix X(F, m,n), B(F, m,n), C(F, m,n);
 
-		std::vector<Element> b(m),x(m),c(m);
+		BlasVector<Field> b(F,m),x(F,m),c(F,m);
 
 		// Create B a random matrix
 		for (size_t i=0;i<m;++i)
@@ -805,53 +977,52 @@ static bool testTriangularSolve (const Field& F, size_t m, size_t n, int iterati
 		}
 
 		// Create 2 trinagular matrix as view of matrix
-		TriangularMatrix TAl(Al,LinBoxTag::Lower,LinBoxTag::NonUnit), TAu(Au,LinBoxTag::Upper,LinBoxTag::NonUnit);
+		TriangularMatrix TAl(Al,Tag::Shape::Lower,Tag::Diag::NonUnit), TAu(Au,Tag::Shape::Upper,Tag::Diag::NonUnit);
 
 		// testing solver with matrix right hand side
 		BMD.left_solve(X,TAl,B);
 		BMD.mul(C,Al,X);
-		if (!MD.areEqual(C,B))
+		if (!BMD.areEqual(C,B))
 			ret=false;
 
 		BMD.left_solve(X,TAu,B);
 		BMD.mul(C,Au,X);
-		if (!MD.areEqual(C,B))
+		if (!BMD.areEqual(C,B))
 			ret=false;
 
 		// testing solver with matrix left hand side
 		BMD.right_solve(X,TAl,B);
 		BMD.mul(C,X,Al);
-		if (!MD.areEqual(C,B))
+		if (!BMD.areEqual(C,B))
 			ret=false;
 
 		BMD.right_solve(X,TAu,B);
 		BMD.mul(C,X,Au);
-		if (!MD.areEqual(C,B))
+		if (!BMD.areEqual(C,B))
 			ret=false;
 
 
 		// testing solver with vector right hand side
 		BMD.left_solve(x,TAl,b);
 		BMD.mul(c,Al,x);
-		if (!VD.areEqual(c,b))
+		if (!localAreEqual(c,b))
 			ret=false;
 
 		BMD.left_solve(x,TAu,b);
 		BMD.mul(c,Au,x);
-		if (!VD.areEqual(c,b))
+		if (!localAreEqual(c,b))
 			ret=false;
 
 		// testing solver with vector left hand side
 		BMD.right_solve(x,TAl,b);
 		BMD.mul(c,x,Al);
-		if (!VD.areEqual(c,b))
+		if (!localAreEqual(c,b))
 			ret=false;
 
 		BMD.right_solve(x,TAu,b);
 		BMD.mul(c,x,Au);
-		if (!VD.areEqual(c,b))
+		if (!localAreEqual(c,b))
 			ret=false;
-
 	}
 
 	mycommentator().stop(MSG_STATUS (ret), (const char *) 0, "testTriangularSolve");
@@ -873,16 +1044,13 @@ static bool testSolve (const Field& F, size_t m, size_t n, int iterations)
 	//Commentator mycommentator;
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	mycommentator().start (pretty("Testing solver"),"testTriangularSolve",iterations);
+	mycommentator().start (pretty("Testing solver"),"testTriangularSolve",(unsigned int)iterations);
 
 	RandIter G(F);
-	NonzeroRandIter<Field> Gn(F,G);
-	Element One,tmp;
-	F.init(One,1UL);
+	Givaro::GeneralRingNonZeroRandIter<Field> Gn(G);
+	Element tmp;
 
 	bool ret = true;
-	MatrixDomain<Field> MD(F);
-	VectorDomain<Field>  VD(F);
 	BlasMatrixDomain<Field> BMD(F);
 
 	for (int k=0;k<iterations;++k) {
@@ -892,7 +1060,7 @@ static bool testSolve (const Field& F, size_t m, size_t n, int iterations)
 		Matrix A(F, m,m),L(F, m,m),S(F, m,m);
 		Matrix X(F, m,n), B(F, m,n), C(F, m,n);
 
-		std::vector<Element> b(m),x(m),c(m);
+		BlasVector<Field> b(F,m),x(F,m),c(F,m);
 
 		// Create B a random matrix
 		for (size_t i=0;i<m;++i)
@@ -917,7 +1085,7 @@ static bool testSolve (const Field& F, size_t m, size_t n, int iterations)
 		for (size_t i=0;i<m;++i){
 			for (size_t j=0;j<i;++j)
 				L.setEntry(i,j,G.random(tmp));
-			L.setEntry(i,i,One);
+			L.setEntry(i,i,F.one);
 		}
 
 		//  compute A=LS
@@ -927,46 +1095,46 @@ static bool testSolve (const Field& F, size_t m, size_t n, int iterations)
 		// testing solver with matrix right hand side
 		BMD.left_solve(X,A,B);
 		BMD.mul(C,A,X);
-		if (!MD.areEqual(C,B))
+		if (!BMD.areEqual(C,B))
 			ret=false;
 
 		BMD.left_solve(X,A,B);
 		BMD.mul(C,A,X);
-		if (!MD.areEqual(C,B))
+		if (!BMD.areEqual(C,B))
 			ret=false;
 
 		// testing solver with matrix left hand side
 		BMD.right_solve(X,A,B);
 		BMD.mul(C,X,A);
-		if (!MD.areEqual(C,B))
+		if (!BMD.areEqual(C,B))
 			ret=false;
 
 		BMD.right_solve(X,A,B);
 		BMD.mul(C,X,A);
-		if (!MD.areEqual(C,B))
+		if (!BMD.areEqual(C,B))
 			ret=false;
 
 
 		// testing solver with vector right hand side
 		BMD.left_solve(x,A,b);
 		BMD.mul(c,A,x);
-		if (!VD.areEqual(c,b))
+		if (!localAreEqual(c,b))
 			ret=false;
 
 		BMD.left_solve(x,A,b);
 		BMD.mul(c,A,x);
-		if (!VD.areEqual(c,b))
+		if (!localAreEqual(c,b))
 			ret=false;
 
 		// testing solver with vector left hand side
 		BMD.right_solve(x,A,b);
 		BMD.mul(c,x,A);
-		if (!VD.areEqual(c,b))
+		if (!localAreEqual(c,b))
 			ret=false;
 
 		BMD.right_solve(x,A,b);
 		BMD.mul(c,x,A);
-		if (!VD.areEqual(c,b))
+		if (!localAreEqual(c,b))
 			ret=false;
 
 	}
@@ -990,27 +1158,23 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
 	//Commentator mycommentator;
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	mycommentator().start (pretty("Testing permutations"),"testPermutation",iterations);
+	mycommentator().start (pretty("Testing permutations"),"testPermutation",(unsigned int)iterations);
 
 	RandIter G(F);
-	NonzeroRandIter<Field> Gn(F,G);
-	Element One,zero,tmp;
-	F.init(One,1UL);
-	F.init(zero,0UL);
+	Givaro::GeneralRingNonZeroRandIter<Field> Gn(G);
+	Element tmp;
 
 	bool ret = true;
-	MatrixDomain<Field> MD(F);
-	VectorDomain<Field>  VD(F);
 	BlasMatrixDomain<Field> BMD(F);
 
 	for (int k=0;k<iterations;++k) {
 
 		mycommentator().progress(k);
 
-		std::vector<size_t> P(m);
+		// std::vector<size_t> P(m);
 
-		Field Z2(2);
-		RandIter G2(Z2);
+		// Field Z2(2);
+		// RandIter G2(Z2);
 
 		// for (size_t i=0; i<m; ++i){
 			// G.random(tmp);
@@ -1020,9 +1184,9 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
 				// P[i] = i;
 		// }
 
-		//std::cerr<<P<<std::endl;
+		//report<<P<<std::endl;
 		Matrix A(F, m,m), Abis(F, m,m), B(F, m,m), C(F, m,m), D(F, m,m);
-		std::vector<Element> a(m),abis(m),b(m),c(m), d(m);
+		BlasVector<Field> a(F,m),abis(F,m),b(F,m),c(F,m), d(F,m);
 		BlasPermutation<size_t>  Perm(m);
 		RandomBlasPermutation(Perm);
 
@@ -1043,7 +1207,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
 		// C = B.P^t
 		BMD.mul( C, B, TransposedBlasMatrix<BlasPermutation<size_t> >(Perm) );
 		// Test C==A
-		if (!MD.areEqual(A,C))
+		if (!BMD.areEqual(A,C))
 			ret=false;
 		/*
 		 * Test A.P^t.P == A
@@ -1054,7 +1218,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
 		// C = B.P
 		BMD.mul( C, B, Perm );
 		// Test C==A
-		if (!MD.areEqual(A,C))
+		if (!BMD.areEqual(A,C))
 			ret=false;
 		/*
 		 * Test P.P^t.A == A
@@ -1065,7 +1229,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
 		// C = P^t.B
 		BMD.mul( C, TransposedBlasMatrix<BlasPermutation<size_t> >(Perm) , B);
 		// Test C==A
-		if (!MD.areEqual(A,C))
+		if (!BMD.areEqual(A,C))
 			ret=false;
 		/*
 		 * Test P^t.P.A == A
@@ -1076,7 +1240,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
 		// C = P.B
 		BMD.mul( C, Perm, B);
 		// Test C==A
-		if (!MD.areEqual(A,C))
+		if (!BMD.areEqual(A,C))
 			ret=false;
 
 		/*
@@ -1088,7 +1252,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
 		// c = b.P^t
 		BMD.mul( c, b, TransposedBlasMatrix<BlasPermutation<size_t> >(Perm) );
 		// Test c==a
-		if (!VD.areEqual(a,c))
+		if (!localAreEqual(a,c))
 			ret=false;
 
 		/*
@@ -1100,7 +1264,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
 		// c = B.P
 		BMD.mul( c, b, Perm );
 		// Test c==a
-		if (!VD.areEqual(a,c))
+		if (!localAreEqual(a,c))
 			ret=false;
 		/*
 		 * Test P.P^t.a == a
@@ -1111,7 +1275,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
 		// c = P^t.b
 		BMD.mul( c, TransposedBlasMatrix<BlasPermutation<size_t> >(Perm) , b);
 		// Test c==a
-		if (!VD.areEqual(a,c))
+		if (!localAreEqual(a,c))
 			ret=false;
 
 		/*
@@ -1123,7 +1287,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
 		// c = P.b
 		BMD.mul( c, Perm, b);
 		// Test c==a
-		if (!VD.areEqual(a,c))
+		if (!localAreEqual(a,c))
 			ret=false;
 
 
@@ -1143,7 +1307,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
 		BMD.mul(D, A, C);
 		// D = P.D
 		BMD.mulin_right( Perm,D);
-		if (!MD.areEqual(D,B))
+		if (!BMD.areEqual(D,B))
 			ret=false;
 		/*
 		 * Test A.P^t.(A.P)^-1.B == B
@@ -1162,7 +1326,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
 		// D = A.C (= P^-1.B)
 		BMD.mul(D, A, C);
 
-		if (!MD.areEqual(D,B))
+		if (!BMD.areEqual(D,B))
 			ret=false;
 		/*
 		 * Test B.P^t.A.(P.A)^-1 == B
@@ -1180,7 +1344,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
 		BMD.mulin_left( C,Perm);
 		// D = C.A (=B)
 		BMD.mul(D, C, A);
-		if (!MD.areEqual(D,B))
+		if (!BMD.areEqual(D,B))
 		  ret=false;
 
 		/*
@@ -1200,7 +1364,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
 		// C = C.P
 		BMD.mulin_left( D, Perm);
 
-		if (!MD.areEqual(D,B))
+		if (!BMD.areEqual(D,B))
 			ret=false;
 		/*
 		 * Test P.A.(P^t.A)^-1.B == B
@@ -1218,7 +1382,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
 		BMD.mul(D, A, C);
 		// D = P^t.D
 		BMD.mulin_right( TransposedBlasMatrix<BlasPermutation<size_t> >(Perm),D);
-		if (!MD.areEqual(D,B))
+		if (!BMD.areEqual(D,B))
 			ret=false;
 		/*
 		 * Test A.P.(A.P^t)^-1.B == B
@@ -1237,7 +1401,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
 		// D = A.C (= P.B)
 		BMD.mul(D, A, C);
 
-		if (!MD.areEqual(D,B))
+		if (!BMD.areEqual(D,B))
 			ret=false;
 		/*
 		 * Test B.P.A.(P^t.A)^-1 == B
@@ -1255,7 +1419,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
 		BMD.mulin_left( C,TransposedBlasMatrix<BlasPermutation<size_t> >(Perm));
 		// D = C.A (=B)
 		BMD.mul(D, C, A);
-		if (!MD.areEqual(D,B))
+		if (!BMD.areEqual(D,B))
 		  ret=false;
 
 		/*
@@ -1275,7 +1439,7 @@ static bool testPermutation (const Field& F, size_t m, int iterations)
 		// C = C.P^t
 		BMD.mulin_left( D, TransposedBlasMatrix<BlasPermutation<size_t> >(Perm));
 
-		if (!MD.areEqual(D,B))
+		if (!BMD.areEqual(D,B))
 			ret=false;
 	}
 	mycommentator().stop(MSG_STATUS (ret), (const char *) 0, "testLQUP");
@@ -1297,16 +1461,13 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations)
 	//Commentator mycommentator;
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	mycommentator().start (pretty("Testing LQUP factorization"),"testLQUP",iterations);
+	mycommentator().start (pretty("Testing LQUP factorization"),"testLQUP",(unsigned int)iterations);
 
 	RandIter G(F);
-	NonzeroRandIter<Field> Gn(F,G);
-	Element One,zero,tmp;
-	F.init(One,1UL);
-	F.init(zero,0UL);
+	Givaro::GeneralRingNonZeroRandIter<Field> Gn(G);
+	Element tmp;
 
 	bool ret = true;
-	MatrixDomain<Field> MD(F);
 	BlasMatrixDomain<Field> BMD(F);
 
 	for (int k=0;k<iterations;++k) {
@@ -1323,7 +1484,7 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations)
 				  B.setEntry(i,j,G.random(tmp));
 			else
 			  for (size_t i=0;i<m;++i)
-			    B.setEntry(i,j,zero);
+			    B.setEntry(i,j,F.zero);
 		// Create C a random matrix of rank n/2
 		for (size_t i=0;i<m;++i)
 			if ( i % 2 )
@@ -1331,7 +1492,7 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations)
 					C.setEntry(i,j,G.random(tmp));
 			else
 				for (size_t j=0;j<n;++j)
-					C.setEntry(i,j,zero);
+					C.setEntry(i,j,F.zero);
 
 		// A = B*C
 		BMD.mul(A, B, C);
@@ -1341,8 +1502,8 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations)
 		BlasPermutation<size_t>  P(A.coldim()),Q(A.rowdim());
 		LQUPMatrix<Field> X(A,P,Q);
 
-		TriangularBlasMatrix<Field> L(F,m,m,LinBoxTag::Lower,LinBoxTag::Unit);
-		TriangularBlasMatrix<Field> U(F,m,n,LinBoxTag::Upper,LinBoxTag::NonUnit);
+		TriangularBlasMatrix<Field> L(F,m,m,Tag::Shape::Lower,Tag::Diag::Unit);
+		TriangularBlasMatrix<Field> U(F,m,n,Tag::Shape::Upper,Tag::Diag::NonUnit);
 		X.getL(L);
 		X.getU(U);
 		P=X.getP();
@@ -1356,7 +1517,7 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations)
 		// A = L*C
 		BMD.mul( A, L, C);
 
-		if (!MD.areEqual(A,Abis))
+		if (!BMD.areEqual(A,Abis))
 			ret=false;
 
 		// Second pass
@@ -1367,8 +1528,8 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations)
 
 		LQUPMatrix<Field> Y(A,P,Q);
 
-		TriangularBlasMatrix<Field> L2(F,m,m,LinBoxTag::Lower,LinBoxTag::Unit);
-		TriangularBlasMatrix<Field> U2(F,m,n,LinBoxTag::Upper,LinBoxTag::NonUnit);
+		TriangularBlasMatrix<Field> L2(F,m,m,Tag::Shape::Lower,Tag::Diag::Unit);
+		TriangularBlasMatrix<Field> U2(F,m,n,Tag::Shape::Upper,Tag::Diag::NonUnit);
 		Y.getL(L2);
 		Y.getU(U2);
 		P=Y.getP();
@@ -1382,7 +1543,7 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations)
 		// A = L*C
 		BMD.mul( A, L2, C);
 
-		if (!MD.areEqual(A,Abis))
+		if (!BMD.areEqual(A,Abis))
 			ret=false;
 	}
 
@@ -1397,18 +1558,14 @@ static bool testMinPoly (const Field& F, size_t n, int iterations)
 	typedef typename Field::Element                  Element;
 	typedef BlasMatrix<Field>                       Matrix;
 	typedef typename Field::RandIter                RandIter;
-	typedef vector<Element>                       Polynomial;
+	typedef BlasVector<Field>                       Polynomial;
 	//Commentator mycommentator;
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	mycommentator().start (pretty("Testing minpoly"),"testMinPoly",iterations);
-	Element tmp, one, zero,mOne;
+	mycommentator().start (pretty("Testing minpoly"),"testMinPoly",(unsigned int)iterations);
+	Element tmp  ;
 	RandIter G(F);
-	NonzeroRandIter<Field> Gn(F,G);
-	F.init(one, 1UL);
-	F.init(zero, 0UL);
-	F.neg(mOne, one);
-	//F.neg( mOne, one);
+	Givaro::GeneralRingNonZeroRandIter<Field> Gn(G);
 	bool ret = true;
 	BlasMatrixDomain<Field> BMD(F);
 
@@ -1417,18 +1574,18 @@ static bool testMinPoly (const Field& F, size_t n, int iterations)
 		mycommentator().progress(k);
 
 		Matrix A(F,n,n);
-		Polynomial P;
+		Polynomial P(F);
 		// Test MinPoly(In) = X-1
 		for (size_t i=0;i<n;++i)
-			A.setEntry(i,i,one);
+			A.setEntry(i,i,F.one);
 
 		BMD.minpoly( P, A );
 
 		if ( P.size() !=2 )
 			ret = false;
-		if ( !F.areEqual(P[0], mOne) )
+		if ( !F.areEqual(P[0], F.mOne) )
 			ret = false;
-		if ( !F.areEqual(P[1], one) )
+		if ( !F.areEqual(P[1], F.one) )
 			ret = false;
 
 		// Test MinPoly(a*In) = X-a
@@ -1442,27 +1599,27 @@ static bool testMinPoly (const Field& F, size_t n, int iterations)
 			ret = false;
 		if ( !F.areEqual(P[0], tmp) )
 			ret = false;
-		if ( !F.areEqual(P[1], one) )
+		if ( !F.areEqual(P[1], F.one) )
 			ret = false;
 
 		for (size_t i=0;i<n-1;++i){
 			for (size_t j=0; j<i+1; ++j)
-				A.setEntry(i,j,zero);
-			A.setEntry(i,i+1,one);
+				A.setEntry(i,j,F.zero);
+			A.setEntry(i,i+1,F.one);
 			if (i<n-2)
 				for (size_t j=i+2; j<n; ++j)
-					A.setEntry(i,j,zero);
+					A.setEntry(i,j,F.zero);
 		}
 		for (size_t j=0;j<n;++j)
-			A.setEntry(n-1,j,zero);
+			A.setEntry(n-1,j,F.zero);
 
 		BMD.minpoly( P, A );
 		if ( P.size() !=n+1 )
 			ret = false;
 		for (size_t i=0; i<n;++i)
-			if ( !F.areEqual(P[i], zero) )
+			if ( !F.areEqual(P[i], F.zero) )
 				ret = false;
-		if ( !F.areEqual(P[n], one) )
+		if ( !F.areEqual(P[n], F.one) )
 			ret = false;
 
 	}
@@ -1478,18 +1635,15 @@ static bool testCharPoly (const Field& F, size_t n, int iterations)
 	typedef typename Field::Element                  Element;
 	typedef BlasMatrix<Field>                       Matrix;
 	typedef typename Field::RandIter                RandIter;
+	// typedef BlasVector<Field>                       Polynomial;
 	typedef vector<Element>                       Polynomial;
 	//Commentator mycommentator;
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	mycommentator().start (pretty("Testing charpoly"),"testCharPoly",iterations);
-	Element tmp, one, zero,mOne;
+	mycommentator().start (pretty("Testing charpoly"),"testCharPoly",(unsigned int)iterations);
+	Element tmp ;
 	RandIter G(F);
-	NonzeroRandIter<Field> Gn(F,G);
-	F.init(one, 1UL);
-	F.init(zero, 0UL);
-	F.neg(mOne, one);
-	//F.neg( mOne, one);
+	Givaro::GeneralRingNonZeroRandIter<Field> Gn(G);
 	bool ret = true;
 	BlasMatrixDomain<Field> BMD(F);
 
@@ -1502,10 +1656,10 @@ static bool testCharPoly (const Field& F, size_t n, int iterations)
 		// Test CharPoly(In) = (X-1)^n
 		for (size_t i=0;i<n;++i){
 			for (size_t j=0;j<i;++j)
-				A.setEntry(i,j,zero);
-			A.setEntry(i,i,one);
+				A.setEntry(i,j,F.zero);
+			A.setEntry(i,i,F.one);
 			for (size_t j=i+1;j<n;++j)
-				A.setEntry(i,j,zero);
+				A.setEntry(i,j,F.zero);
 		}
 		P.clear();
 		BMD.charpoly( P, A );
@@ -1514,12 +1668,12 @@ static bool testCharPoly (const Field& F, size_t n, int iterations)
 		while (P_it != P.end()){
 			if ( P_it->size() !=2 )
 				ret = false;
-			if ( !F.areEqual(P_it->operator[](0), mOne) )
+			if ( !F.areEqual(P_it->operator[](0), F.mOne) )
 				ret = false;
-			if ( !F.areEqual(P_it->operator[](1), one) )
+			if ( !F.areEqual(P_it->operator[](1), F.one) )
 				ret = false;
 
-			P_it++;
+			++P_it;
 		}
 
 		// Test CharPoly(a*In) = X-a
@@ -1536,9 +1690,9 @@ static bool testCharPoly (const Field& F, size_t n, int iterations)
 				ret = false;
 			if ( !F.areEqual(P_it->operator[](0), tmp) )
 				ret = false;
-			if ( !F.areEqual(P_it->operator[](1), one) )
+			if ( !F.areEqual(P_it->operator[](1), F.one) )
 			ret = false;
-			P_it++;
+			++P_it;
 		}
 	}
 
@@ -1547,18 +1701,64 @@ static bool testCharPoly (const Field& F, size_t n, int iterations)
 	return ret;
 }
 
+template<class Field>
+static bool testBlasMatrixConstructors(const Field& Fld, size_t m, size_t n)
+{
+	bool pass = true;
+	// typedef typename Field::Element Element;
+	BlasMatrixDomain<Field> BMD(Fld);
+	//BlasMatrix<Field> A; // nowhere to go
+
+	BlasMatrix<Field> B(Fld);
+	B.resize(m, n, Fld.zero);
+	// don't understand the variations on integer types for the indices...
+
+	BlasMatrix<Field> C(Fld,m,n);
+	pass = pass and BMD.areEqual(B, C);
+
+//	MatrixStream<Field> ms; ...
+//	BlasMatrix<Field> D(ms);
+//	pass = pass and BMD.areEqual(B, D);
 
+	ScalarMatrix<Field> Eo(Fld, n, n, Fld.zero);
+	BlasMatrix<Field> E(Eo); // copy a bb
+	pass = pass and BMD.areEqual(B, E);
+
+#if 0
+	ScalarMatrix<Field> Fo(Fld, 2*m, 2*m, Fld.zero);
+        BlasMatrix F(Fo, m, 0, m, n) ; // copy subm of a bb
+	pass = pass and BMD.areEqual(B, F);
+
+	BlasMatrix<Field> G(Eo, Fld); // other field?
+	pass = pass and BMD.areEqual(B, G);
+
+	BlasMatrix<Field> H(B); // copy cstor
+	pass = pass and BMD.areEqual(B, H);
+
+	BlasVector<Field> v(Fld,m*n, Fld.zero);
+	BlasMatrix<Field> I(Fld,v,m,n);
+	pass = pass and BMD.areEqual(B, I);
+
+	Element *p = &v[0];
+	BlasMatrix<Field> J(Fld,p,m,n);
+	pass = pass and BMD.areEqual(B, J);
+#endif
+
+	return pass;
+}
 
 // returns true if ok, false if not.
 template<class Field>
-int launch_tests(Field & F, int n, int iterations)
+int launch_tests(Field & F, size_t n, int iterations)
 {
 	bool pass = true ;
-	//std::cout << "no blas tests for now" << std::endl;
+	//report << "no blas tests for now" << std::endl;
 	// no slow test while I work on io
+	if (!testBlasMatrixConstructors(F, n, n))             pass=false;
 	if (!testMulAdd (F,n,iterations))                     pass=false;
-	if (!testMulAddAgain (F,n,iterations))                pass=false;
-	int m = n+n/2 ; int k = 2*n+1 ;
+	if (0==F.characteristic()) if
+	    (!testMulAddAgain (F,n,iterations))                pass=false;
+	size_t m = n+n/2 ; size_t k = 2*n+1 ;
 	if (!testMulAddShapeTrans (F,n,m,k,iterations))       pass=false;
 	if (!testMulAddShapeTrans (F,n,k,m,iterations))       pass=false;
 	if (!testMulAddShapeTrans (F,m,n,k,iterations))       pass=false;
@@ -1584,70 +1784,29 @@ int launch_tests(Field & F, int n, int iterations)
 	if (!testCharPoly (F,n,iterations))                   pass=false;
 	//
 	//
+	if (not pass) F.write(report) << endl;
 	return pass ;
 
 }
 
-int main(int argc, char **argv)
+bool launch_gf2_tests(GF2 & F, size_t n)
 {
-
-	static size_t n = 40;
-	static integer q = 1000003U;
-	static int iterations = 2;
-
-    static Argument args[] = {
-        { 'n', "-n N", "Set dimension of test matrices to NxN", TYPE_INT,     &n },
-        { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1]",  TYPE_INTEGER, &q },
-        { 'i', "-i I", "Perform each test for I iterations",    TYPE_INT,     &iterations },
-	END_OF_ARGUMENTS
-    };
-
-	parseArguments (argc, argv, args);
-
-	typedef Modular<double> Field;
-	//typedef Modular<int> Field;
-	//typedef Modular<float> Field;
-
-	Field F1 (q);
-	ModularBalanced<double> F2(q);
-	Modular<float> F3(2011);
-	GF2 F4 ;
-	GivaroZpz<Givaro::Unsigned32> F5(2001);
-	Modular<bool> F6 ;
-	// BB. (Blas)MatrixDomain are not very generic...
-#ifdef __LINBOX_HAVE_NTL
-	NTL::ZZ_p::init(NTL::to_ZZ((size_t)q));
-	NTL_ZZ_p F7;
-#endif
-
-
 	bool pass = true;
-
-	srand ((unsigned)time (NULL));
-
-
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-
-	commentator().start("BlasMatrixDomain test suite", "BlasMatrixDomain");
-
-	pass &= launch_tests(F1,(int)n,iterations);
-	pass &= launch_tests(F2,(int)n,iterations);
-	pass &= launch_tests(F3,(int)n,iterations);
-#pragma message "#warning GF2 is not working at all -> working on m4ri"
-	// pass &= launch_tests(F4,(int)n,iterations);
-	// pass &= launch_tests(F6,(int)n,iterations);
-#pragma message "#warning GivaroZpz is not working at all"
-	// pass &= launch_tests(F5,(int)n,iterations);
-#ifdef __LINBOX_HAVE_NTL
-#pragma message "#warning NTL_ZZp is not working at all"
-	// pass &= launch_tests(F7,(int)n,iterations);
-#endif
-
-	commentator().stop(MSG_STATUS (pass), (const char *) 0,"BlasMatrixDomain test suite");
-	return pass ? 0 : -1;
+	//pass = pass and testRank(F, n, 1);
+	//pass = pass and testDet(F, n, 1);
+	//pass = pass and testMulAdd(F, n, 1);
+	return pass ;
 }
 
+#if 0
+bool launch_gf3_tests(GF3 & F, size_t n)
+{
+	bool pass = true;
+	//pass = pass and testRank(F, n, 1);
+	//pass = pass and launch_tests(F, n, 1); // fails with std BlasMatrixDomain
+	return pass ;
+}
+#endif
 
 
 // vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
diff --git a/tests/test-blas-matrix.C b/tests/test-blas-matrix.C
new file mode 100644
index 0000000..232c8f4
--- /dev/null
+++ b/tests/test-blas-matrix.C
@@ -0,0 +1,356 @@
+/*
+ * Copyright (C) 2014 the LinBox group
+ *
+ * Written by :
+ *          Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * --------------------------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+ 
+#include "linbox/linbox-config.h"
+#include <givaro/modular.h>
+#include <givaro/modular-balanced.h>
+
+#include "linbox/integer.h"
+#include "givaro/zring.h"
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/dense-matrix.h"
+
+#include "test-common.h"
+#include "test-blackbox.h"
+
+using namespace LinBox ;
+
+//! @bug remove NoRW
+template<class Matrix>
+bool testMatrix(const typename Matrix::Field & F, size_t m, size_t n, bool rw = true) {
+	bool pass = true;
+	Matrix A(F, m, n);
+	A.random();
+	pass = pass && testBlackbox(A,rw);
+
+	if (std::min(m,n)>1) {
+		BlasSubmatrix<Matrix> B(A,1,1,m/2,n/2);
+		pass = pass && testBlackboxNoRW(B);
+	}
+
+	return pass ;
+}
+
+int main (int argc, char **argv)
+{
+	// ofstream report;
+
+	bool pass = true;
+
+	static size_t m = 4;
+	static size_t n = 10;
+	// static size_t nnz = 0;
+	static integer q = 101 ;
+
+	static Argument args[] = {
+		{ 'm', "-m M", "Set row dimension of test matrix to M.", TYPE_INT,     &m },
+		{ 'n', "-n N", "Set col dimension of test matrix to N.", TYPE_INT,     &n },
+		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+		END_OF_ARGUMENTS
+	};
+
+	parseArguments (argc, argv, args);
+
+	srand ((unsigned)time (NULL));
+
+	commentator().start("BlasMatrix black box test suite", "triplesbb");
+
+	{ /* Givaro::Modular<float> */
+		//Field
+		typedef Givaro::Modular<float> Field;
+
+		Field F (q);
+		commentator().start("Givaro::Modular<float>");
+
+		typedef 	BlasMatrix<Field,Vector<Field>::Dense>  Matrix ;
+
+		pass = pass && testMatrix<Matrix>(F,m,n);
+
+		commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::Modular<float>");
+	}
+
+	{ /* Givaro::ModularBalanced<float> */
+		//Field
+		typedef Givaro::ModularBalanced<float> Field;
+
+		Field F (q);
+		commentator().start("Givaro::ModularBalanced<float>");
+
+		typedef 	BlasMatrix<Field,Vector<Field>::Dense>  Matrix ;
+
+		pass = pass && testMatrix<Matrix>(F,m,n);
+		commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::ModularBalanced<float>");
+	}
+
+	{ /* Givaro::Modular<double> */
+		//Field
+		typedef Givaro::Modular<double> Field;
+
+		Field F (q);
+		commentator().start("Givaro::Modular<double>");
+
+		typedef 	BlasMatrix<Field,Vector<Field>::Dense>  Matrix ;
+
+		pass = pass && testMatrix<Matrix>(F,m,n);
+
+		commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::Modular<double>");
+	}
+
+	{ /* Givaro::ModularBalanced<double> */
+		//Field
+		typedef Givaro::ModularBalanced<double> Field;
+
+		Field F (q);
+		commentator().start("Givaro::ModularBalanced<double>");
+
+		typedef 	BlasMatrix<Field,Vector<Field>::Dense>  Matrix ;
+
+		pass = pass && testMatrix<Matrix>(F,m,n);
+		commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::ModularBalanced<double>");
+	}
+
+	{ /* Givaro::Modular<int64_t> */
+		//Field
+		typedef Givaro::Modular<int64_t> Field;
+
+		Field F (q);
+		commentator().start("Givaro::Modular<int64_t>");
+
+		typedef 	BlasMatrix<Field,Vector<Field>::Dense>  Matrix ;
+
+		pass = pass && testMatrix<Matrix>(F,m,n);
+		commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::Modular<int64_t>");
+	}
+
+	{ /* Givaro::ModularBalanced<int64_t> */
+		//Field
+		typedef Givaro::ModularBalanced<int64_t> Field;
+
+		Field F (q);
+		commentator().start("Givaro::ModularBalanced<int64_t>");
+
+		typedef 	BlasMatrix<Field,Vector<Field>::Dense>  Matrix ;
+
+		pass = pass && testMatrix<Matrix>(F,m,n);
+		commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::ModularBalanced<int64_t>");
+	}
+	{ /* Givaro::Modular<uint64_t> */
+#if 0
+		//Field
+		typedef Givaro::Modular<uint64_t> Field;
+
+		Field F (q);
+		commentator().start("Givaro::Modular<uint64_t>");
+
+		typedef 	BlasMatrix<Field,Vector<Field>::Dense>  Matrix ;
+
+		pass = pass && testMatrix<Matrix>(F,m,n);
+		commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::Modular<uint64_t>");
+#endif
+	}
+	{ /* Givaro::Modular<int32_t> */
+		//Field
+		typedef Givaro::Modular<int32_t> Field;
+
+		Field F (q);
+		commentator().start("Givaro::Modular<int32_t>");
+
+		typedef 	BlasMatrix<Field,Vector<Field>::Dense>  Matrix ;
+
+		pass = pass && testMatrix<Matrix>(F,m,n);
+		commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::Modular<int32_t>");
+	}
+
+	{ /* Givaro::ModularBalanced<int32_t> */
+		//Field
+		typedef Givaro::ModularBalanced<int32_t> Field;
+
+		Field F (q);
+		commentator().start("Givaro::ModularBalanced<int32_t>");
+
+		typedef 	BlasMatrix<Field,Vector<Field>::Dense>  Matrix ;
+
+		pass = pass && testMatrix<Matrix>(F,m,n);
+		commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::ModularBalanced<int32_t>");
+	}
+
+	{ /* Givaro::Modular<uint32_t> */
+		//Field
+		typedef Givaro::Modular<uint32_t> Field;
+
+		Field F (q);
+		commentator().start("Givaro::Modular<uint32_t>");
+
+		typedef 	BlasMatrix<Field,Vector<Field>::Dense>  Matrix ;
+
+		pass = pass && testMatrix<Matrix>(F,m,n);
+		commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::Modular<uint32_t>");
+	}
+
+	{ /* Givaro::Modular<int16_t> */
+#if 0 /* not working */
+		//Field
+		typedef Givaro::Modular<int16_t> Field;
+
+		Field F (q);
+		commentator().start("Givaro::Modular<int16_t>");
+
+		typedef 	BlasMatrix<Field,Vector<Field>::Dense>  Matrix ;
+
+		pass = pass && testMatrix<Matrix>(F,m,n);
+		commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::Modular<int16_t>");
+#endif
+	}
+
+	{ /* Givaro::ModularBalanced<int16_t> */
+#if 0 /* not working */
+		//Field
+		typedef Givaro::ModularBalanced<int16_t> Field;
+
+		Field F (q);
+		commentator().start("Givaro::ModularBalanced<int16_t>");
+
+		typedef 	BlasMatrix<Field,Vector<Field>::Dense>  Matrix ;
+
+		pass = pass && testMatrix<Matrix>(F,m,n);
+		commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::ModularBalanced<int16_t>");
+#endif
+	}
+
+	{ /* Givaro::Modular<uint16_t> */
+#if 0 /* not working */
+		//Field
+		typedef Givaro::Modular<uint16_t> Field;
+
+		Field F (q);
+		commentator().start("Givaro::Modular<uint16_t>");
+
+		typedef 	BlasMatrix<Field,Vector<Field>::Dense>  Matrix ;
+
+		pass = pass && testMatrix<Matrix>(F,m,n);
+		commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::Modular<uint16_t>");
+#endif
+	}
+
+	{ /* Givaro::Modular<char> */
+#if 0 /* not working */
+		//Field
+		typedef Givaro::Modular<char> Field;
+
+		Field F (q);
+
+		typedef 	BlasMatrix<Field,Vector<Field>::Dense>  Matrix ;
+
+		pass = pass && testMatrix<Matrix>(F,m,n);
+#endif
+	}
+
+	{ /* Givaro::ModularBalanced<char> */
+#if 0 /* not working */
+		//Field
+		typedef Givaro::ModularBalanced<char> Field;
+
+		Field F (q);
+
+		typedef 	BlasMatrix<Field,Vector<Field>::Dense>  Matrix ;
+
+		pass = pass && testMatrix<Matrix>(F,m,n);
+#endif
+	}
+
+	{ /* Givaro::Modular<uint32_t> */
+#if 0 /*  bug somewhere */
+		//Field
+		typedef Givaro::Modular<uint32_t> Field;
+
+		Field F (q);
+
+		typedef 	BlasMatrix<Field,Vector<Field>::Dense>  Matrix ;
+
+		pass = pass && testMatrix<Matrix>(F,m,n);
+#endif
+	}
+
+	{ /* Givaro::Modular<integer> */
+#if 0 /*  bug somewhere */
+		//Field
+		typedef Givaro::Modular<integer> Field;
+
+		Field F (123456789124);
+		commentator().start("Givaro::Modular<integer>");
+
+		typedef 	BlasMatrix<Field,Vector<Field>::Dense>  Matrix ;
+
+		pass = pass && testMatrix<Matrix>(F,m,n);
+		commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::Modular<integer>");
+#endif
+	}
+
+	{ /* Givaro::ZRing<Integer> */
+#if 0 /*  bug somewhere */
+		//Field
+		typedef Givaro::ZRing<Integer> Field;
+
+		Field F ;
+		commentator().start("Givaro::ZRing<Integer>");
+
+		typedef 	BlasMatrix<Field,Vector<Field>::Dense>  Matrix ;
+
+		pass = pass && testMatrix<Matrix>(F,m,n);
+		commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::ZRing<Integer>");
+#endif
+	}
+
+	{ /* Givaro::Extension<> */
+#if 0 /*  bug somewhere */
+		//Field
+		typedef Givaro::Extension<> Field;
+
+		Field F(103,4) ;
+		commentator().start("Givaro::Extension<>");
+
+		typedef 	BlasMatrix<Field,Vector<Field>::Dense>  Matrix ;
+
+		pass = pass && testMatrix<Matrix>(F,m,n, false);
+		commentator().stop(MSG_STATUS (pass), (const char *) 0,"Givaro::Extension<>");
+#endif
+	}
+
+	commentator().stop(MSG_STATUS(pass),(const char *) 0,"BlasMatrix BB test suite");
+	return pass ? 0 : -1;
+}
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-block-ring.C b/tests/test-block-ring.C
index 0f11d18..a04b38a 100644
--- a/tests/test-block-ring.C
+++ b/tests/test-block-ring.C
@@ -35,10 +35,10 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
 
 
-#include "linbox/field/modular.h"
+
+#include "linbox/ring/modular.h"
 #include "linbox/field/block-ring.h"
 
 #include "test-common.h"
@@ -64,8 +64,8 @@ int main (int argc, char **argv)
 	commentator().start("block-ring test suite", "block-ring");
 	bool pass = true;
 
-	typedef Modular<int> Field1;
-	typedef Modular<double> Field2;
+	typedef Givaro::Modular<int> Field1;
+	typedef Givaro::Modular<double> Field2;
 
 	Field1 F1(q, 1);
 	BlockRing<Field1> R1(F1, n);
@@ -79,8 +79,8 @@ int main (int argc, char **argv)
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
 
 
-	if (!runBasicRingTests(R1, "BlockRing of Modular<int>", iterations)) pass = false;
-	if (!runBasicRingTests(R2, "BlockRing of Modular<double>", iterations)) pass = false;
+	if (!runBasicRingTests(R1, "BlockRing of Givaro::Modular<int>", (unsigned int)iterations)) pass = false;
+	if (!runBasicRingTests(R2, "BlockRing of Givaro::Modular<double>", (unsigned int)iterations)) pass = false;
 
 	commentator().stop("block-ring test suite");
 	return pass ? 0 : -1;
diff --git a/tests/test-block-wiedemann.C b/tests/test-block-wiedemann.C
new file mode 100644
index 0000000..e5d173e
--- /dev/null
+++ b/tests/test-block-wiedemann.C
@@ -0,0 +1,190 @@
+/* tests/test-block-wiedemann.C
+ * evolved by -bds from test-solve.C
+ *
+ * --------------------------------------------------------
+ *
+ * Copyright (c) LinBox
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *
+ */
+
+/*! @file   tests/test-block-wiedemann.C
+ * @ingroup tests
+ * @brief no doc.
+ * @test no doc.
+ */
+
+
+#include "linbox/linbox-config.h"
+#include <iostream>
+
+#include "linbox/util/commentator.h"
+#include "linbox/ring/modular.h"
+#include "linbox/vector/stream.h"
+#include "linbox/matrix/matrix-domain.h"
+
+#include "linbox/algorithms/block-wiedemann.h"
+#include "linbox/algorithms/coppersmith.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/blackbox/diagonal.h"
+#include "linbox/blackbox/scalar-matrix.h"
+
+#include "test-common.h"
+
+using namespace LinBox;
+
+/* Tests nonsingular solving for a random right-hand side.
+ *
+ * Solver - a block Wiedemann solver (see coppersmith.h or block-wiedemann.h).
+ * Blackbox - nonsingular matrix (rhs will be a random vector).
+ *
+ * Checks the result, returning true on success and false on failure
+ */
+template <class Solver, class Blackbox>
+bool testBlockSolver(Solver & S, Blackbox & M, string desc){
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+
+	typedef typename Blackbox::Field Field;
+	typedef BlasVector<Field> Vector;
+	bool pass = true;
+	size_t n = M.coldim();
+	Vector b(M.field(),n), x(M.field(),n), y(M.field(),n);
+    typename Field::RandIter gen(M.field());
+	RandomDenseStream<Field> s (M.field(), gen, n, 1);
+	s.next (b);
+	VectorDomain<Field> VD (M.field());
+	VD.write (report << "Right-hand side: b =  ", b) << endl;
+
+	S.solveNonSingular(x, M, b);
+
+	VD.write (report << desc << " solution:  ", x) << endl;
+	M.apply (y, x);
+	VD.write ( report << "Output:           ", y) << endl;
+
+	if (!VD.areEqual (y, b)) {
+		pass = false;
+		report << "ERROR: " << desc << " solution is incorrect" << endl;
+	}
+	return pass;
+}
+
+int main (int argc, char **argv)
+{
+	bool pass = true;
+
+	static size_t n = 9;
+//	static size_t N = 16;
+	static size_t q = 65521U;
+	static size_t blocking = 0;
+
+	static Argument args[] = {
+		{ 'n', "-n N", "Set dimension of test matrices to n.", TYPE_INT,     &n },
+//		{ 'N', "-N N", "Set blocking factor to N.", TYPE_INT,     &N },
+		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INT, &q },
+		{ 'b', "-b N", "Set the blocking size", TYPE_INT, &blocking },
+		END_OF_ARGUMENTS
+	};
+
+	parseArguments (argc, argv, args);
+
+	typedef Givaro::Modular<double> Field;
+	//typedef Givaro::Modular<uint32_t> Field;
+	typedef BlasVector<Field> Vector;
+
+	Field F ( (uint32_t) q); Field::RandIter gen(F);
+	MatrixDomain<Field> MD(F);
+
+	commentator().start("block wiedemann test suite", "block-wiedemann");
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+
+	RandomDenseStream<Field> s(F, gen, n, 2);
+	Vector d(F,n);
+	s.next (d);
+	for (size_t i = 0; i < d.size(); ++i) 
+		if (F.isZero(d[i])) report << "Warning: zero in vector" << endl;
+
+	// some matrices
+	ScalarMatrix<Field> SC (F, n, n, F.one); // identity
+
+	Diagonal <Field> D (d); // random nonsingular diagonal
+
+	SparseMatrix<Field, SparseMatrixFormat::TPL> S (F, n, n);
+	for (size_t i = 1; i < n; ++i) S.setEntry(i, i-1, F.one); // subdiag
+	for (size_t i = 0; i < n; ++i) S.setEntry(i, n-1, d[i]); // last col
+	S.finalize(); // companion matrix of d
+
+// RCS is Yuhasz' Matrix Berlekamp Massey method.
+	CoppersmithSolver< MatrixDomain<Field> > RCS(MD,blocking);
+
+/*
+	commentator().start("Ident, CoppersmithSolver", "I-Coppersmith");
+	pass = pass and testBlockSolver(RCS, SC, "ScalarMatrix(I), Matrix Berlekamp Massey");
+	commentator().stop("Ident, CoppersmithSolver");
+*/
+
+	commentator().start("Diag, CoppersmithSolver", "D-Coppersmith");
+	pass = pass and testBlockSolver(RCS, D, "Diagonal, Matrix Berlekamp Massey");
+	commentator().stop("Diag, CoppersmithSolver");
+
+	commentator().start("Companion, CoppersmithSolver", "C-Coppersmith");
+	pass = pass and testBlockSolver(RCS, S, "Companion, Matrix Berlekamp Massey");
+	commentator().stop("Companion, CoppersmithSolver");
+
+#if 1
+// LBWS is Giorgi's block method, SigmaBasis based.
+
+#ifdef __LINBOX_HAVE_OCL
+// using this as a test of the opencl matrix domain
+	typedef OpenCLMatrixDomain<Field> Context;
+// but note, shouldn't need the ifdef.  OpenCLMatrixDomain defaults to BlasMatrixDomain calls.
+#else
+	typedef BlasMatrixDomain<Field> Context;
+#endif
+	Context BMD(F);
+	BlockWiedemannSolver<Context> LBWS(BMD);
+
+/*
+	commentator().start("Ident, BlockWiedemannSolver", "I-Sigma Basis");
+	pass = pass and testBlockSolver(LBWS, SC, "ScalarMatrix(I), Sigma Basis");
+	commentator().stop("Ident, BlockWiedemannSolver");
+*/
+
+	commentator().start("Diag, BlockWiedemannSolver", "D-Sigma Basis");
+	pass = pass and testBlockSolver(LBWS, D, "Diagonal, Sigma Basis");
+	commentator().stop("Diag, BlockWiedemannSolver");
+
+	commentator().start("Companion, BlockWiedemannSolver", "C-Sigma Basis");
+	pass = pass and testBlockSolver(LBWS, S, "Companion, Sigma Basis");
+	commentator().stop("Companion, BlockWiedemannSolver");
+#endif
+
+	commentator().stop("block wiedemann test suite");
+    //std::cout << (pass ? "passed" : "FAILED" ) << std::endl;
+
+	return pass ? 0 : -1;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-bmseq.C b/tests/test-bmseq.C
deleted file mode 100644
index dbcc75a..0000000
--- a/tests/test-bmseq.C
+++ /dev/null
@@ -1,233 +0,0 @@
-
-/* tests/test-dense.C
- * Copyright (C) 2001, 2002 Bradford Hovinen
- *
- * Written by George Yuhasz <yuhasz at gmail.com>
- *
- * --------------------------------------------------------
- *
- * 
- * ========LICENCE========
- * This file is part of the library LinBox.
- * 
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This 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
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *
- */
-
-#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <vector>
-#include <cstdio>
-#include <algorithm>
-#include <set>
-#include <list>
-
-#include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/algorithms/bm-seq.h"
-
-#include "test-common.h"
-#include "test-generic.h"
-
-using namespace LinBox;
-using namespace std;
-
-/* Test 1: Identity matrix in dense representation
- *
- * Construct a dense representation of an n x n identity matrix and check
- * whether the output of its application to a series of random vectors is equal
- * to the input.
- *
- * F - Field over which to perform computations
- * n - Dimension to which to make matrix
- * iterations - Number of random vectors to which to apply identity inverse
- *
- * Return true on success and false on failure
- */
-
-template <class Field>
-static bool testIdentity (Field &F, long n, int iterations)
-{
-	typedef typename Vector<Field>::Dense Vector;
-	typedef BlasMatrix <Field> Blackbox;
-
-	commentator().start ("Testing identity apply", "testIdentity", iterations);
-	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
-
-	bool ret = true;
-	bool iter_passed = true;
-
-	int i, j;
-
-	Blackbox I (F, n, n);
-	typename Field::Element one;
-
-	F.init (one, 1);
-
-	for (i = 0; i < n; i++)
-		I.setEntry (i, i, one);
-
-	Vector v(n), w(n);
-	typename Field::RandIter r (F);
-
-	for (i = 0; i < iterations; i++) {
-		char buf[80];
-		snprintf (buf, 80, "Iteration %d", i);
-		commentator().start (buf);
-
-		iter_passed = true;
-
-		for (j = 0; j < n; j++)
-			r.random (v[j]);
-
-		report << "Input vector: ";
-		printVector<Field> (F, report, v);
-
-		I.apply (w, v);
-
-		report << "Output vector: ";
-		printVector<Field> (F, report, w);
-
-		for (j = 0; j < n; j++)
-			if (!F.areEqual (w[j], v[j]))
-				ret = iter_passed = false;
-
-		if (!iter_passed)
-			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-				<< "ERROR: Vectors are not equal" << endl;
-
-		commentator().stop ("done");
-		commentator().progress ();
-	}
-
-	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testIdentity");
-
-	return ret;
-}
-
-
-int main (int argc, char **argv)
-{
-	bool pass = true;
-
-	static size_t n = 10;
-	static integer q = 101;
-	static int iterations = 2; // was 100
-	//static int N = 1;
-
-	static Argument args[] = {
-		{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT,     &n },
-		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
-		{ 'i', "-i I", "Perform each test for I iterations.",   TYPE_INT,     &iterations },
-		END_OF_ARGUMENTS
-	};
-
-	typedef Modular<uint32_t> Field;
-
-	parseArguments (argc, argv, args);
-	Field F (q);
-
-	commentator().start("Dense matrix black box test suite", "BlasMatrix");
-
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (5);
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
-	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
-
-
-
-	Field::Element one, zero;
-	F.init(one,1);
-	F.init(zero,0);
-	BlasMatrix<Field> D(F,2,2);
-	BlasMatrix<Field> zero24(F,2,4);
-	for(size_t i=0; i<2; i++)
-		D.setEntry(i,i,one);
-	D.setEntry(1,0,one);
-	BM_Seq<Field> seq(2,D);
-	BlasMatrix<Field> S2(F,2,2);
-	MatrixDomain<Field> MD(F);
-	BM_Seq<Field>::BM_iterator bmit(seq, 0), bmit2(seq.BM_begin());
-	bmit.setDelta(4);
-	BM_Seq<Field>::BM_iterator::TerminationState check = bmit.state();
-	while(!check.IsGeneratorFound() && !check.IsSequenceExceeded()){
-					bmit++;
-					check = bmit.state();
-	}
-	for(list<BlasMatrix<Field> >::iterator it = bmit->begin(); it != bmit->end(); it++)
-					(*it).write(report);
-	if(check.IsSequenceExceeded())
-					report << "Sequence Exceeded" << endl;
-	bmit++;
-	check = bmit.state();
-	if(check.IsSequenceExceeded())
-					report << "Sequence Exceeded" << endl;
-	for(list<BlasMatrix<Field> >::iterator it = bmit->begin(); it != bmit->end(); it++)
-					(*it).write(report);
-	MD.add(S2,D,D);
-	seq.push_back(S2);
-	bmit++;
-	check = bmit.state();
-	if(check.IsSequenceExceeded())
-					report << "Sequence Exceeded" << endl;
-	for(list<BlasMatrix<Field> >::iterator it = bmit->begin(); it != bmit->end(); it++)
-					(*it).write(report);
-	MD.addin(S2,D);
-	seq.push_back(S2);
-	bmit++;
-	check = bmit.state();
-	if(check.IsSequenceExceeded())
-					report << "Sequence Exceeded" << endl;
-	for(list<BlasMatrix<Field> >::iterator it = bmit->begin(); it != bmit->end(); it++)
-					(*it).write(report);
-	if(check.IsGeneratorFound())
-					report << "Generator Found" << endl;
-	report << "mu = " << bmit.get_mu() << endl;
-	report << "sigma = " << bmit.get_sigma() << endl;
-	report << "beta = " << bmit.get_beta() << endl;
-	BM_Seq<Field>::BM_iterator::TerminationState check2 = bmit2.state();
-	while(!check2.IsGeneratorFound() && !check2.IsSequenceExceeded()){
-					++bmit2;
-					check2 = bmit2.state();
-	}
-	if(bmit==bmit2)
-					report << "Iterators are equal" << endl;
-	if(bmit2==seq.BM_end())
-					report << "bmit2 is equal to end" << endl;
-	for(list<BlasMatrix<Field> >::iterator it = bmit2->begin(); it != bmit2->end(); it++)
-					(*it).write(report);
-	BM_Seq<Field>::BM_iterator bmit3 = seq.BM_begin();
-	bmit3 = bmit;
-	if(bmit==bmit3)
-					report << "Iterators are equal" << endl;
-	vector<BlasMatrix<Field> >gen(bmit.GetGenerator());
-	int d = bmit.get_mu();
-	for(int j = 0; j <= d; j++)
-					gen[j].write(report);
-
-	commentator().stop("dense matrix black box test suite");
-	return pass ? 0 : -1;
-}
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/tests/test-butterfly.C b/tests/test-butterfly.C
index 0e99744..2b27828 100644
--- a/tests/test-butterfly.C
+++ b/tests/test-butterfly.C
@@ -6,20 +6,20 @@
  *
  * --------------------------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -40,24 +40,21 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
 
-#include "linbox/field/modular.h"
+
+#include "linbox/ring/modular.h"
 #include "linbox/vector/vector-domain.h"
-#include "linbox/randiter/nonzero.h"
+#include <givaro/givranditer.h>
 #include "linbox/util/commentator.h"
 #include "linbox/vector/stream.h"
-#include "linbox/blackbox/butterfly.h"
 #include "linbox/blackbox/compose.h"
 #include "linbox/blackbox/diagonal.h"
-#include "linbox/blackbox/sparse.h"
+//#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/blackbox/submatrix.h"
 #include "linbox/solutions/det.h"
-#include "linbox/switch/boolean.h"
-#include "linbox/switch/cekstv.h"
+#include "linbox/blackbox/butterfly.h"
 
-#include "test-common.h"
-#include "test-generic.h"
+#include "test-blackbox.h"
 
 using namespace LinBox;
 using namespace std;
@@ -72,22 +69,22 @@ static bool testSetButterfly (const Field &F, VectorStream<Vector> &stream, size
 {
 	commentator().start ("Testing setButterfly", "testSetButterfly", stream.size ());
 
-	bool ret = true, iter_passed;
+	bool ret = true;
 
-	unsigned long real_k;
+	// unsigned long real_k;
 
 	Vector v_p;
-	typename LinBox::Vector<Field>::Dense w (stream.dim ()), v1 (stream.dim ());
+	BlasVector<Field> w (F,stream.dim ()), v1 (F,stream.dim ());
 	VectorDomain<Field> VD (F);
 
 	while (stream) {
 		commentator().startIteration ((unsigned int)stream.j ());
 
 		stream >> v_p;
-		typename LinBox::Vector<Field>::Dense v (stream.n ());
+		BlasVector<Field> v (F,stream.n ());
 		VD.copy (v, v_p);
 
-		real_k = v_p.first.size ();
+		unsigned long real_k = v_p.first.size ();
 
 		ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
 		report << "Input vector: ";
@@ -100,7 +97,7 @@ static bool testSetButterfly (const Field &F, VectorStream<Vector> &stream, size
 
 		vector<bool> z_vec = setButterfly (z);
 
-		BooleanSwitchFactory factory (z_vec);
+		LinBox::BooleanSwitchFactory factory (z_vec);
 		Butterfly<Field, BooleanSwitch> P (F, stream.dim (), factory);
 
 		P.apply (w, v);
@@ -113,7 +110,7 @@ static bool testSetButterfly (const Field &F, VectorStream<Vector> &stream, size
 		report << "Result of applyTranspose: ";
 		VD.write (report, v1) << endl;
 
-		iter_passed = true;
+		bool iter_passed = true;
 
 		for (size_t i = 0; i < real_k; ++i)
 			if (F.isZero (w[i]))
@@ -165,30 +162,27 @@ static bool testCekstvSwitch (const Field &F, unsigned int iterations, size_t n,
 	unsigned int failures = 0;
 
 	typename Vector<Field>::SparsePar d1;
-
-	RandomSparseStream<Field, typename Vector<Field>::SparsePar> stream (F, (double) r / (double) n, n, iterations);
+    typename Field::RandIter gen(F);
+	RandomSparseStream<Field, typename Vector<Field>::SparsePar> stream (F, gen, (double) r / (double) n, n, iterations);
 	VectorDomain<Field> VD (F);
 
-	unsigned long real_r;
+	// unsigned long real_r;
 	typename Field::Element det_Ap;
 
-	typename Field::Element one;
-
-	F.init (one, 1);
 
 	while (stream) {
 		commentator().startIteration ((unsigned int)stream.pos ());
 
 		stream >> d1;
 
-		typename Vector<Field>::Dense d (n);
+		BlasVector<Field> d (F,n);
 		VD.copy (d, d1);
 
 		ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
 		report << "Input vector: ";
 		VD.write (report, d) << endl;
 
-		real_r = d1.first.size ();
+		unsigned long real_r = d1.first.size ();
 
 		report << "Real rank: " << real_r << endl;
 
@@ -198,14 +192,14 @@ static bool testCekstvSwitch (const Field &F, unsigned int iterations, size_t n,
 		Butterfly<Field, CekstvSwitch<Field> > Q (F, n, factory);
 		typedef Butterfly<Field, CekstvSwitch<Field> > Blackbox1;
 
-		Diagonal<Field> D (F, d);
-		typedef Diagonal<Field> Blackbox2;
+		Diagonal<Field> D (d);
+		// typedef Diagonal<Field> Blackbox2;
 
 		Compose<Blackbox1>  DQ (&P, &Q);
 		typedef Compose<Blackbox1, Blackbox1> Blackbox3;
 		Compose<Blackbox1, Blackbox3> A (P, DQ);
 		typedef Compose<Blackbox1, Blackbox3> Blackbox4;
-		//Compose<typename Vector<Field>::Dense> A (&P, &DQ);
+		//Compose<BlasVector<Field> > A (&P, &DQ);
 
 		Submatrix<Blackbox4> Ap (&A, 0, 0, real_r, real_r);
 
@@ -254,8 +248,8 @@ static bool testCekstvSwitch (const Field &F, unsigned int iterations, size_t n,
 
 template <class Field>
 static bool testRandomLinearity (const Field                                 &F,
-				 VectorStream<typename Vector<Field>::Dense> &v1_stream,
-				 VectorStream<typename Vector<Field>::Dense> &v2_stream)
+				 VectorStream<BlasVector<Field> > &v1_stream,
+				 VectorStream<BlasVector<Field> > &v2_stream)
 {
 	commentator().start ("Testing random linearity", "testRandomLinearity", v1_stream.size ());
 
@@ -263,7 +257,7 @@ static bool testRandomLinearity (const Field                                 &F,
 	typename CekstvSwitch<Field>::Factory factory (r);
 	Butterfly<Field, CekstvSwitch<Field> > A (F, v1_stream.dim (), factory);
 
-	bool ret = testLinearity (F, A, v1_stream, v2_stream);
+	bool ret = testLinearity (A, v1_stream, v2_stream);
 
 	v1_stream.reset ();
 	v2_stream.reset ();
@@ -288,8 +282,8 @@ static bool testRandomLinearity (const Field                                 &F,
 
 template <class Field>
 static bool testRandomTranspose (const Field                                 &F,
-				 VectorStream<typename Vector<Field>::Dense> &v1_stream,
-				 VectorStream<typename Vector<Field>::Dense> &v2_stream)
+				 VectorStream<BlasVector<Field> > &v1_stream,
+				 VectorStream<BlasVector<Field> > &v2_stream)
 {
 	commentator().start ("Testing random transpose", "testRandomTranspose", v1_stream.size ());
 
@@ -311,10 +305,10 @@ int main (int argc, char **argv)
 {
 	bool pass = true;
 
-	static size_t n = 100;
-	static integer q = 2147483647U;
-	static int iterations = 1; // was 10
-	static int k = 10;
+	static int32_t n = 100;
+	static integer q = 65521U;
+	static unsigned int iterations = 1; // was 10
+	static unsigned int k = 10;
 
 	static Argument args[] = {
 		{ 'n', "-n N", "Set dimension of test matrices to NxN.",      TYPE_INT,     &n },
@@ -324,37 +318,41 @@ int main (int argc, char **argv)
 		END_OF_ARGUMENTS
 	};
 
-	typedef Modular<uint32_t> Field;
+	typedef Givaro::Modular<uint32_t, uint64_t> Field;
 
 	parseArguments (argc, argv, args);
-	Field F (q);
+	srand ((unsigned int) time (NULL));
 
-	commentator().getMessageClass (TIMING_MEASURE).setMaxDepth (3);
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
+	commentator().setMaxDepth (-1);
+	commentator().setMaxDetailLevel (-1);
 
 	commentator().start("Butterfly preconditioner test suite", "butterfly preconditioner");
 
-	RandomSparseStream<Field, Vector<Field>::Sparse, NonzeroRandIter<Field> >
-		stream (F, NonzeroRandIter<Field> (F, Field::RandIter (F)),
-			(double) k / (double) n, n, iterations);
-	RandomDenseStream<Field> v1_stream (F, n, iterations);
-	RandomDenseStream<Field> v2_stream (F, n, iterations);
+	Field F (q);
 
+	// SetButterfly
+        Field::RandIter Gen(F);
+        typedef Givaro::GeneralRingNonZeroRandIter<Field> NZRand;
+        NZRand NZGen(Gen);
+	RandomSparseStream<Field, Vector<Field>::Sparse, NZRand>
+            stream (F, NZGen, (double) k / (double) n, n, iterations);
 	if (!testSetButterfly  (F, stream, k)) pass = false;
+
+	// Cekstv
 	if (!testCekstvSwitch  (F, iterations, n, k)) pass = false;
-	if (!testRandomLinearity (F, v1_stream, v2_stream)) pass = false;
-	if (!testRandomTranspose (F, v1_stream, v2_stream)) pass = false;
+
+	// Blackbox
+	Butterfly<Field> P(F, n);
+	if (!testBlackboxNoRW(P)) pass = false;
 
 	commentator().stop("butterfly preconditioner test suite");
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-charpoly.C b/tests/test-charpoly.C
index b8f8856..348b470 100644
--- a/tests/test-charpoly.C
+++ b/tests/test-charpoly.C
@@ -1,21 +1,21 @@
 /* tests/test-charpoly.C
  * Copyright (C) LinBox
- * Written by bds (starting from test-charpoly.C)
+ * Written by bds ++
+ *
  *
- * 
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -38,14 +38,14 @@
 #include <iostream>
 #include <iomanip>
 #include <fstream>
-#include <vector>
+
 #include <cstdio>
 
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/blackbox/scalar-matrix.h"
 #include "linbox/solutions/charpoly.h"
 #include "linbox/util/commentator.h"
-//#include "linbox/ring/givaro-polynomial.h"
+#include "linbox/ring/givaro-polynomial.h"
 #include "linbox/vector/stream.h"
 
 #include "test-common.h"
@@ -72,7 +72,7 @@ typename Dom::Element eval (const Dom& D,
 	typename Dom::Element tmp = P[P.size()-1];
 	for (int i = (int)P.size()-2; i >= 0; --i){
 		D.mulin (tmp, x);
-		D.addin (tmp, P[i]);
+		D.addin (tmp, P[(size_t)i]);
 	}
 	return value = tmp;
 }
@@ -80,24 +80,23 @@ typename Dom::Element eval (const Dom& D,
 template <class Dom>
 static bool testIdentityCharpoly (Dom &Z, size_t n, bool symmetrizing=false)
 {
-	typedef typename Dom::Element                Element;
-	typedef vector<Element>                       Vector;
-	typedef ScalarMatrix<Dom>                   Blackbox;
-	typedef GivPolynomialRing<Dom, Givaro::Dense> PolDom;
-	typedef typename PolDom::Element          Polynomial;
-	//typedef Vector Polynomial;
+	typedef typename Dom::Element Element;
+	typedef ScalarMatrix<Dom> Blackbox;
+// 	typedef GivPolynomialRing<Dom, Givaro::Dense> PolDom;
+//  typedef BlasVector<Dom,GivPolynomialRing<Dom, Givaro::Dense> > PolDom;
+// 	typedef typename PolDom::Element Polynomial;
+	typedef BlasVector <Dom> Vector;
+	typedef Vector Polynomial;
 
 	LinBox::commentator().start ("Testing identity Charpoly", "testIdentityCharpoly");
 
 	bool ret = true;
-	Element one; Z.init(one, 1);
-	Element negone; Z.init(negone, -1);
 
 	//PolDom IPD(Z);
 
-	Blackbox A (Z, n, one);
+	Blackbox A (Z, n, n, Z.one);
 
-	Polynomial phi;
+	Polynomial phi(Z);
 
 	charpoly (phi, A);
 
@@ -108,14 +107,14 @@ static bool testIdentityCharpoly (Dom &Z, size_t n, bool symmetrizing=false)
 	// partial check - just that charpoly has right values at 0, 1, -1.
 	Element val, val2, neg2, pow2;
 	// value at 1 should be zero
-	eval(Z, val, phi, one);
+	eval(Z, val, phi, Z.one);
 	if (! Z.isZero(val) ) ret = false;
 	// value at zero should be (-1)^n
-	val = (n % 2 == 0) ? one : negone;
+	val = (n % 2 == 0) ? Z.one : Z.mOne;
 	if (! Z.areEqual(val, phi[0])) ret = false;
 	// value at -1 should be (-2)^n
-	eval(Z, val2, phi, negone);
-	Z.init(neg2, -2); Z.init(pow2, 1);
+	eval(Z, val2, phi, Z.mOne);
+	Z.init(neg2, -2_i64); Z.assign(pow2, Z.one);
 	for (size_t i = 0; i < n; ++i) Z.mulin(pow2, neg2);
 	if (! Z.areEqual(val2, pow2)) ret = false;
 
@@ -142,12 +141,12 @@ static bool testIdentityCharpoly (Dom &Z, size_t n, bool symmetrizing=false)
 template <class Field>
 static bool testNilpotentCharpoly (Field &F, size_t n)
 {
-	typedef vector <typename Field::Element> Vector;
+	typedef BlasVector <Field> Vector;
 // 	typedef GivPolynomialRing<Field, Givaro::Dense> PolDom;
 // 	typedef typename PolDom::Element Polynomial;
 	typedef Vector Polynomial;
-	typedef pair <vector <size_t>, vector <typename Field::Element> > Row;
-	typedef SparseMatrix <Field> Blackbox;
+	typedef std::pair <std::vector <size_t>, std::vector <typename Field::Element> > Row;
+	typedef SparseMatrix<Field, typename VectorTraits<Row>::SparseFormat> Blackbox;
 
 	LinBox::commentator().start ("Testing nilpotent charpoly", "testNilpotentCharpoly");
 
@@ -163,11 +162,11 @@ static bool testNilpotentCharpoly (Field &F, size_t n)
 
 	ostream &who = LinBox::commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
 	who << "Matrix:" << endl;
-	A.write (who, FORMAT_PRETTY);
+	A.write (who, Tag::FileFormat::Pretty);
 
 
 
-	Polynomial phi;
+	Polynomial phi(A.field());
 
 	charpoly (phi, A);
 
@@ -177,7 +176,7 @@ static bool testNilpotentCharpoly (Field &F, size_t n)
 
 	linbox_check(n);
 	for (i = 0; i < n - 1; i++)
-		if (!F.isZero (phi[i]))
+		if (!F.isZero (phi[(size_t)i]))
 			lowerTermsCorrect = false;
 
 	if (phi.size () != n + 1 || !F.isOne (phi[n]) || !lowerTermsCorrect) {
@@ -191,6 +190,25 @@ static bool testNilpotentCharpoly (Field &F, size_t n)
 	return ret;
 }
 
+static bool testSageBug(){
+
+        Givaro::ZRing<Givaro::Integer> Z;
+        DenseMatrix<Givaro::ZRing<Givaro::Integer> > A(Z,4,4);
+        for (size_t i=0; i<4; ++i)
+                for (size_t j=0; j<4; ++j)
+                        A.setEntry(i,j, i*4+j+1);
+        typedef BlasVector <Givaro::ZRing<Givaro::Integer> > Polynomial;
+        Polynomial phi(Z);
+        charpoly(phi,A);
+        if (Z.areEqual(phi[0],0) &&
+            Z.areEqual(phi[1],0) &&
+            Z.areEqual(phi[2],-80) &&
+            Z.areEqual(phi[3],-34) &&
+            Z.areEqual(phi[4],1) )
+            return true;
+        else return false;
+}
+
 #if 1
 /* Test 3: Random charpoly of sparse matrix
  *
@@ -211,17 +229,17 @@ bool testRandomCharpoly (Field                 &F,
 			VectorStream<Row>    &A_stream,
 			VectorStream<Vector> &v_stream)
 {
-	//typedef GivPolynomialRing<Field, Givaro::Dense> PolDom;
-	//typedef typename PolDom::Element Polynomial;
-	typedef std::vector<typename Field::Element> Polynomial;
-	typedef SparseMatrix <Field> Blackbox;
+//     typedef GivPolynomialRing<Field, Givaro::Dense> PolDom;
+//     typedef typename PolDom::Element Polynomial;
+	typedef BlasVector<Field> Polynomial;
+	typedef SparseMatrix<Field> Blackbox;
 
 	LinBox::commentator().start ("Testing sparse random charpoly", "testRandomCharpoly", 1);
 
 	bool ret = true;
 
 	VectorDomain<Field> VD (F);
-	Vector w, v;
+	Vector w(F), v(F);
 	VectorWrapper::ensureDim (v, v_stream.n ());
 	VectorWrapper::ensureDim (w, v_stream.n ());
 
@@ -230,9 +248,9 @@ bool testRandomCharpoly (Field                 &F,
 
 	ostream &report = LinBox::commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
 	report << "Matrix:" << endl;
-	A.write (report, FORMAT_PRETTY);
+	A.write (report, Tag::FileFormat::Pretty);
 
-	Polynomial phi;
+    Polynomial phi(F);
 
 	charpoly (phi, A);
 
@@ -251,7 +269,6 @@ bool testRandomCharpoly (Field                 &F,
 		applyPoly (F, w, A, phi, v);
 		VD.write (report << "Output vector " << v_stream.j () << ": ", w) << endl;
 
-		//bds: VD.isZero fails to work right when -O2 using gcc 4.2
 		if (!VD.isZero (w)) { ret = false; break; }
 	}
 
@@ -287,25 +304,27 @@ int main (int argc, char **argv)
 
 	parseArguments (argc, argv, args);
 
-	// Temporarily, only Modular<double> is enabled for the givaro/ntl factorization based charpoly
-	typedef Modular<double> Field;
-	typedef vector<Field::Element> DenseVector;
-	typedef SparseMatrix<Field>::Row SparseVector;
-	//typedef pair<vector<size_t>, vector<Field::Element> > SparseVector;
-	Field F (q);
-	srand ((unsigned)time (NULL));
-
 	LinBox::commentator().getMessageClass (TIMING_MEASURE).setMaxDepth (10);
 	LinBox::commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (10);
 	LinBox::commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
-
 	ostream &report = LinBox::commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
-	report << endl << "Black box characteristic polynomial of a matrix over a prime field test suite" << endl;
+	srand ((unsigned)time (NULL));
 
-	RandomDenseStream<Field, DenseVector, NonzeroRandIter<Field> >
-		v_stream (F, NonzeroRandIter<Field> (F, Field::RandIter (F)), n, numVectors);
-	RandomSparseStream<Field, SparseVector, NonzeroRandIter<Field> >
-		A_stream (F, NonzeroRandIter<Field> (F, Field::RandIter (F)), (double) k / (double) n, n, n);
+/**************/
+	report << endl << "Black box characteristic polynomial over a prime field test suite" << endl;
+
+	// Temporarily, only Givaro::Modular<double> is enabled for the givaro/ntl factorization based charpoly
+	typedef Givaro::Modular<double> Field;
+	typedef BlasVector<Field> DenseVector;
+	typedef SparseMatrix<Field>::Row SparseVector;
+	Field F (q);
+	Field::RandIter mygen(F);
+        Givaro::GeneralRingNonZeroRandIter<Field> myNZgen(mygen);
+
+	RandomDenseStream<Field, DenseVector, Givaro::GeneralRingNonZeroRandIter<Field> >
+        v_stream (F, myNZgen, n, (size_t)numVectors);
+	RandomSparseStream<Field, SparseVector, Givaro::GeneralRingNonZeroRandIter<Field> >
+	A_stream (F, myNZgen, (double) k / (double) n, n, n);
 
 	if (!testNilpotentCharpoly (F, n)) pass = false;
 	if (!testRandomCharpoly    (F, A_stream, v_stream)) pass = false;
@@ -314,42 +333,41 @@ int main (int argc, char **argv)
 	if (!testIdentityCharpoly  (F, n, true)) pass = false;
 	//need other tests...
 
-	typedef vector<PID_integer::Element> ZDenseVector;
-	typedef SparseMatrix<PID_integer>::Row ZSparseVector;
-	typedef pair<vector<size_t>, vector<Field::Element> > SparseVector;
-	PID_integer  Z;
-	srand ((unsigned)time (NULL));
+/**************/
+	report << endl << "Black box characteristic polynomial over Z test suite" << endl;
 
-	LinBox::commentator().getMessageClass (TIMING_MEASURE).setMaxDepth (10);
-	LinBox::commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (10);
-	LinBox::commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
+	Givaro::ZRing<integer>  Z ;
+	typedef BlasVector<Givaro::ZRing<integer>> ZDenseVector;
 
-	report << endl << "Black box characteristic polynomial of an integer matrix test suite" << endl;
-
-	RandomDenseStream<PID_integer, ZDenseVector, NonzeroRandIter<PID_integer> >
-		zv_stream (Z, NonzeroRandIter<PID_integer> (Z, PID_integer::RandIter (Z)), n, numVectors);
-	RandomSparseStream<PID_integer, SparseVector, NonzeroRandIter<PID_integer> >
-		zA_stream (Z, NonzeroRandIter<PID_integer> (Z, PID_integer::RandIter (Z)), (double) k / (double) n, n, n);
+	Givaro::ZRing<integer>::RandIter myZgen(Z);
+        Givaro::GeneralRingNonZeroRandIter<Givaro::ZRing<integer>> myNzZgen(myZgen);
+ 
+	RandomDenseStream<Givaro::ZRing<integer>, ZDenseVector, Givaro::GeneralRingNonZeroRandIter<Givaro::ZRing<integer>> >
+        zv_stream (Z, myNzZgen, n, (size_t)numVectors);
+	RandomSparseStream<Givaro::ZRing<integer>, SparseVector, Givaro::GeneralRingNonZeroRandIter<Givaro::ZRing<integer>> >
+	zA_stream (Z, myNzZgen, (double) k / (double) n, n, n);
 
 	//no symmetrizing
 	if (!testIdentityCharpoly  (Z, n)) pass = false;
 	if (!testNilpotentCharpoly (Z, n)) pass = false;
-
+        
 	//Comment by Z. Wan. Stream doesn't work here
-	//if (!testRandomCharpoly    (Z, zA_stream, zv_stream)) pass = false;
+//	if (!testRandomCharpoly    (Z, zA_stream, zv_stream)) pass = false;
 
 	// symmetrizing
 	if (!testIdentityCharpoly  (Z, n, true)) pass = false;
 	//need other tests...
 
+	if (not testSageBug()) pass = false;
+
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
 
diff --git a/tests/test-commentator.C b/tests/test-commentator.C
index c5878a5..95f1233 100644
--- a/tests/test-commentator.C
+++ b/tests/test-commentator.C
@@ -6,20 +6,20 @@
  *
  * --------------------------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -78,7 +78,7 @@ void runTestActivity (bool reportStrings)
 	if (reportStrings) outputReportStrings ();
 
 	for (int i = 0; i < 2; ++i) {
-		commentator().startIteration (i);
+		commentator().startIteration ((unsigned int)i);
 		if (reportStrings) outputReportStrings ();
 
 		commentator().start ("Special function 1", "function1");
diff --git a/tests/test-common.C b/tests/test-common.C
deleted file mode 100644
index bbb3f45..0000000
--- a/tests/test-common.C
+++ /dev/null
@@ -1,93 +0,0 @@
-/* linbox/tests/test-common.C
- * Copyright (C) 2001, 2002 Bradford Hovinen
- *
- * Written by Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-
-/*! @file  tests/test-common.C
- * @ingroup tests
- * @brief  no doc
- */
-
-
-
-#ifndef __LINBOX_test_common_C
-#define __LINBOX_test_common_C
-
-
-#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <vector>
-#include <cmath>
-#include <cstdlib>
-#include <cstring>
-#include <cmath>
-#include <list>
-
-#include "linbox/util/commentator.h"
-#include "linbox/field/archetype.h"
-
-#include "test-common.h"
-
-bool isPower (LinBox::integer n, LinBox::integer m)
-{
-	return (n == 1) || (((n % m) == 0) && isPower (n/m, m));
-}
-
-inline double incompleteGamma (double a, double x, double tol)
-{
-	double xa_ex = pow (x, a) * exp (-x);
-	double pi = 1.0;
-	double xn = 1.0;
-	double sigma = 0.0;
-	double last_sigma;
-
-	int n = 0;
-
-	do {
-		pi *= a + n;
-		last_sigma = sigma;
-		sigma += xn / pi;
-		xn *= x;
-		++n;
-	} while (abs (sigma - last_sigma) >= tol) ;
-
-	return sigma * xa_ex;
-}
-
-double chiSquaredCDF (double chi_sqr, double df)
-{
-	return incompleteGamma (df / 2.0, chi_sqr / 2.0, 1e-10) / exp (gamma (df / 2.0));
-}
-#endif // __LINBOX_test_common_C
-
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/tests/test-common.h b/tests/test-common.h
index ff9eff1..31752a5 100644
--- a/tests/test-common.h
+++ b/tests/test-common.h
@@ -12,20 +12,20 @@
  *
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -38,16 +38,17 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
+// #include <vector>
 
 #include "linbox/linbox-config.h"
 #include "linbox/field/archetype.h"
-#include "linbox/vector/vector-domain.h"
 #include "linbox/integer.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/vector/blas-vector.h"
 
 using namespace std;
 #include "linbox/util/commentator.h"
-#include "fflas-ffpack/utils/args-parser.h"
+#include "linbox/util/args-parser.h"
 
 
 template <class Field, class Vector>
@@ -62,7 +63,7 @@ void printVectorSpecialized(
 
 	output << '(';
 	for (i = 0; i < v.size (); i++) {
-		F.write (output, v[i]);
+		F.write (output, v[(size_t)i]);
 		if (i < v.size () - 1)
 			output << ", ";
 	}
@@ -144,7 +145,7 @@ bool areVectorsEqualSpecialized(
 	if (v.size() != w.size()) return false;
 
 	for (size_t i = 0; i < v.size(); i++)
-		if (!F.areEqual (w[i], v[i]))
+		if (!F.areEqual (w[(size_t)i], v[(size_t)i]))
 			return false;
 
 	return true;
@@ -163,7 +164,7 @@ bool areVectorsEqualSpecialized(
 	typename Vector::const_iterator v_iter, w_iter;
 	w_iter = w.begin();
 
-	for ( v_iter = v.begin(); v_iter != v.end(); v_iter++, w_iter++)
+	for ( v_iter = v.begin(); v_iter != v.end(); ++v_iter, ++w_iter)
 		if ( (w_iter->first != v_iter->first)
 		     || (!F.areEqual (w_iter->second, v_iter->second)) )
 			return false;
@@ -184,7 +185,7 @@ bool areVectorsEqualSpecialized(
 	typename Vector::const_iterator v_iter, w_iter;
 	w_iter = w.begin();
 
-	for ( v_iter = v.begin(); v_iter != v.end(); v_iter++, w_iter++)
+	for ( v_iter = v.begin(); v_iter != v.end(); ++v_iter, ++w_iter)
 		if ( (w_iter->first != v_iter->first)
 		     || (!F.areEqual (w_iter->second, v_iter->second)) )
 			return false;
@@ -206,7 +207,7 @@ bool allZeroSpecialized(
 		       )
 {
 	for (size_t i = 0; i < v.size(); i++)
-		if (!F.isZero (v[i]))
+		if (!F.isZero (v[(size_t)i]))
 			return false;
 
 	return true;
@@ -237,11 +238,11 @@ void printPolynomial (Field &F, ostream &output, const Polynomial &v)
 		output << "0";
 
 	for (i = (int)v.size () - 1; i >= 0; i--) {
-		if (F.isZero (v[i]))
+		if (F.isZero (v[(size_t)i]))
 			continue;
 
-		if (!F.isOne (v[i]) || i == 0)
-			F.write (output, v[i]);
+		if (!F.isOne (v[(size_t)i]) || i == 0)
+			F.write (output, v[(size_t)i]);
 
 		if (i > 0)
 			output << " x^" << i;
@@ -254,7 +255,7 @@ void printPolynomial (Field &F, ostream &output, const Polynomial &v)
 }
 
 template <class Field, class Blackbox, class Polynomial, class Vector>
-vector <typename Field::Element> &
+LinBox::BlasVector <Field> &
 applyPoly (const Field                             &F,
 	   Vector                                  &w,
 	   const Blackbox			   &A,
@@ -262,7 +263,7 @@ applyPoly (const Field                             &F,
 	   const Vector                            &v)
 {
 	LinBox::VectorDomain <Field> VD (F);
-	Vector z;
+	Vector z(F);
 	int i;
 
 	LinBox::VectorWrapper::ensureDim (z, A.rowdim ());
@@ -271,7 +272,7 @@ applyPoly (const Field                             &F,
 
 	for (i = (int)phi.size () - 2; i >= 0; i--) {
 		A.apply (z, w);
-		VD.axpy (w, phi[i], v, z);
+		VD.axpy (w, phi[(size_t)i], v, z);
 	}
 
 	return w;
@@ -279,14 +280,13 @@ applyPoly (const Field                             &F,
 
 /* Evaluate polynomial at a whole vector of points */
 
-template <class Field, class Polynomial>
-vector <typename Field::Element> &
-multiEvalPoly (const Field                            &F,
-	       vector <typename Field::Element>       &w,
-	       const Polynomial                       &phi,
-	       const vector <typename Field::Element> &v)
+template <class Field, class Polynomial, class Vector>
+Vector &
+multiEvalPoly (const Field        &F,
+	       Vector             &w,
+	       const Polynomial   &phi,
+	       const Vector       &v)
 {
-	typedef vector <typename Field::Element> Vector;
 
 	typename Field::Element tmp;
 	int i;
@@ -295,12 +295,12 @@ multiEvalPoly (const Field                            &F,
 	w.resize (v.size ());
 
 	for (j = 0; j < v.size (); j++)
-		w[j] = phi[phi.size () - 1];
+		w[(size_t)j] = phi[phi.size () - 1];
 
 	for (i = (int)phi.size () - 2; i >= 0; i--) {
 		for (j = 0; j < v.size (); j++) {
-			F.axpy (tmp, w[j], v[j], phi[i]);
-			w[j] = tmp;
+			F.axpy (tmp, w[(size_t)j], v[(size_t)j], phi[(size_t)i]);
+			w[(size_t)j] = tmp;
 		}
 	}
 
@@ -312,32 +312,32 @@ multiEvalPoly (const Field                            &F,
 
 template <class Field, class Polynomial>
 Polynomial &
-interpolatePoly (const Field                            &F,
-		 Polynomial                             &f,
-		 const vector <typename Field::Element> &x,
-		 const vector <typename Field::Element> &y)
+interpolatePoly (const Field             &F,
+		 Polynomial              &f,
+		 const LinBox::BlasVector<Field> &x,
+		 const LinBox::BlasVector<Field> &y)
 {
-	typedef vector <typename Field::Element> Vector;
+	typedef LinBox::BlasVector<Field> Vector;
 
-	int n = x.size ();
+	int n = (int)x.size ();
 
 	// NB I leave one element in g always initialized to 0 as the ficticious
 	// negative-first coefficient. This streamlines some of the code.
 	static const int g_FUDGE = 1;
-	Vector g(n + g_FUDGE);
-	F.init (g[0], 0);
+	Vector g(F,(size_t)(n + g_FUDGE));
+	F.assign (g[0], F.zero);
 
 	typename Field::Element gk, c1, c2;
 
 	int i, j, k, d;
 
-	f.resize (n);
+	f.resize ((size_t)n);
 
 	for (i = 0; i < n; i++)
-		F.init (f[i], 0);
+		F.assign(f[(size_t)i], F.zero);
 
 	for (j = 0; j < n; j++) {
-		F.init (g[0 + g_FUDGE], 1);
+		F.assign (g[0 + g_FUDGE], F.one);
 
 		// d is the current degree of the Lagrange interpolant. i is the
 		// current index in the array of x-coordonites
@@ -345,24 +345,24 @@ interpolatePoly (const Field                            &F,
 			if (i == j) i++;
 
 			// Compute coefficients of this factor.
-			F.sub (c1, x[j], x[i]);
+			F.sub (c1, x[(size_t)j], x[(size_t)i]);
 			F.invin (c1);
-			F.mul (c2, c1, x[i]);
+			F.mul (c2, c1, x[(size_t)i]);
 			F.negin (c2);
 
 			// Initialize the next element of the Lagrange interpolant
-			F.init (g[d + 1 + g_FUDGE], 0);
+			F.assign (g[(size_t)(d + 1 + g_FUDGE)], F.zero);
 
 			// Multiply this factor by the existing partial product
 			for (k = d + 1 + g_FUDGE; k >= g_FUDGE; k--) {
-				F.mul (gk, g[k - 1], c1);
-				F.axpyin (gk, g[k], c2);
-				g[k] = gk;
+				F.mul (gk, g[(size_t)k - 1], c1);
+				F.axpyin (gk, g[(size_t)k], c2);
+				g[(size_t)k] = gk;
 			}
 		}
 
 		for (i = 0; i < n; i++)
-			F.axpyin (f[i], y[j], g[i + g_FUDGE]);
+			F.axpyin (f[(size_t)i], y[(size_t)j], g[(size_t)i + g_FUDGE]);
 	}
 
 	return f;
@@ -381,16 +381,15 @@ extern inline double incompleteGamma (double a, double x, double tol);
 
 double chiSquaredCDF (double chi_sqr, double df);
 
-#ifdef LinBoxSrcOnly
-#include "test-common.C"
+#ifdef LinBoxTestOnly
+#include "test-common.inl"
 #endif
 #endif // __LINBOX_test_common_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-common.inl b/tests/test-common.inl
new file mode 100644
index 0000000..8da49dd
--- /dev/null
+++ b/tests/test-common.inl
@@ -0,0 +1,93 @@
+/* linbox/tests/test-common.inl
+ * Copyright (C) 2001, 2002 Bradford Hovinen
+ *
+ * Written by Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+/*! @file  tests/test-common.inl
+ * @ingroup tests
+ * @brief  no doc
+ */
+
+
+
+#ifndef __LINBOX_test_common_inl
+#define __LINBOX_test_common_inl
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+#include <cmath>
+#include <cstdlib>
+#include <cstring>
+#include <cmath>
+#include <list>
+
+#include "linbox/util/commentator.h"
+#include "linbox/field/archetype.h"
+
+#include "test-common.h"
+
+bool isPower (LinBox::integer n, LinBox::integer m)
+{
+	return (n == 1) || (((n % m) == 0) && isPower (n/m, m));
+}
+
+inline double incompleteGamma (double a, double x, double tol)
+{
+	double xa_ex = pow (x, a) * exp (-x);
+	double pi = 1.0;
+	double xn = 1.0;
+	double sigma = 0.0;
+	double last_sigma;
+
+	int n = 0;
+
+	do {
+		pi *= a + n;
+		last_sigma = sigma;
+		sigma += xn / pi;
+		xn *= x;
+		++n;
+	} while (abs (sigma - last_sigma) >= tol) ;
+
+	return sigma * xa_ex;
+}
+
+double chiSquaredCDF (double chi_sqr, double df)
+{
+	return incompleteGamma (df / 2.0, chi_sqr / 2.0, 1e-10) / exp (lgamma (df / 2.0));
+}
+#endif // __LINBOX_test_common_inl
+
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/tests/test-companion.C b/tests/test-companion.C
index 625d36f..286c862 100644
--- a/tests/test-companion.C
+++ b/tests/test-companion.C
@@ -36,13 +36,13 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
 
-#include "linbox/field/modular.h"
+
+#include "linbox/ring/modular.h"
 #include "linbox/blackbox/companion.h"
+#include "linbox/matrix/matrix-domain.h"
 
-#include "test-common.h"
-#include "test-generic.h"
+#include "test-blackbox.h"
 
 using namespace LinBox;
 
@@ -51,12 +51,12 @@ int main (int argc, char **argv)
 	bool pass = true;
 
 	static size_t n = 10;
-	static integer q = 2147483647U;
+	static size_t q = 101;
 	static int iterations = 1; // was 10
 
 	static Argument args[] = {
 		{ 'n', "-n N", "Set dimension of test matrices to NxN.",        TYPE_INT,     &n },
-		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INT, &q },
 		{ 'i', "-i I", "Perform each test for I iterations.",          TYPE_INT,     &iterations },
 		END_OF_ARGUMENTS
 	};
@@ -67,24 +67,33 @@ int main (int argc, char **argv)
 
 	commentator().start("Companion matrix black box test suite", "companion");
 
-	typedef Modular<uint32_t> Field;
-	typedef vector <Field::Element> Vector;
+	typedef Givaro::Modular<int32_t> Field;
+	// typedef vector <Field::Element> Vector;
 	typedef vector <Field::Element> Polynomial;
 	typedef Companion<Field> Blackbox;
 
 	Field F (q);
+	//Field F ((int32_t)q);
+	// no fail at q = 50000, intermitent at q = 55000
+	if (q > Field::maxCardinality()) {std::cout<<"NO NO"<<std::endl; exit(-1);}
 	Field::Element d;
-	F.init (d, -1);
+	F.assign(d, F.mOne);
 	Polynomial p(n+1, d);
-	F.init (d, 1); F.assign(p[n], d);
+	F.assign (d, F.one); F.assign(p[n], d);
 
+	// cstor from poly
 	Blackbox A (F, p);
+	pass = pass && testBlackboxNoRW(A); // no RW yet
 
-	pass = pass && testBlackbox(A);
-
+	// cstor using own randiter
 	Blackbox B (F, n);
+	pass = pass && testBlackboxNoRW(B); // no RW yet
+
+	Field::RandIter r(F);
 
-	pass = pass && testBlackbox(B);
+	// cstor from randiter
+	Blackbox C (F, n, r);
+	pass = pass && testBlackboxNoRW(C); // no RW yet
 
 	commentator().stop("companion matrix black box test suite");
 
diff --git a/tests/test-cra.C b/tests/test-cra.C
index d3210c7..192fc16 100644
--- a/tests/test-cra.C
+++ b/tests/test-cra.C
@@ -1,6 +1,6 @@
 /* Copyright (C) LinBox
  *
- *  Written by Brice Boyer <brice.boyer at imag.fr>
+ *  Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  *
  *
  * ========LICENCE========
@@ -29,17 +29,18 @@
  * @test cra algorithms
  */
 
+#include "linbox/linbox-config.h"
+#include <givaro/zring.h>
 #include "linbox/integer.h"
 #include "linbox/randiter/random-prime.h"
 #include "linbox/algorithms/cra-domain.h"
 #include "linbox/algorithms/cra-early-single.h"
 #include "linbox/algorithms/cra-early-multip.h"
 
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
 #include "linbox/algorithms/cra-full-multip.h"
 #include "linbox/algorithms/cra-full-multip-fixed.h"
 
-#include "linbox/field/unparametric.h"
 
 #define _LB_REPEAT(command) \
 do { for (size_t i = 0 ; pass && i < iters ; ++i) {  command } } while(0)
@@ -67,7 +68,7 @@ int test_early_single(std::ostream & report, size_t PrimeSize, size_t Size)
 	for (size_t i = 0 ; i < Size ; ++i)
 		residues[i] = Integer::random(PrimeSize-1);
 
-	typedef LinBox::Modular<double> ModularField ;
+	typedef Givaro::Modular<double> ModularField ;
 
 	Iterator genprime = primes.begin()  ; // prime iterator
 	Iterator residu = residues.begin()  ; // residu iterator
@@ -125,7 +126,7 @@ int test_early_multip(std::ostream & report, size_t PrimeSize, size_t Taille, si
 	typedef typename std::vector<T>                     Vect ;
 	typedef typename Vect::iterator                  Iterator;
 	typedef typename std::vector<Vect>::iterator VectIterator;
-	typedef LinBox::Modular<double>             ModularField ;
+	typedef Givaro::Modular<double>             ModularField ;
 	typedef ModularField::Element                     Element;
 	typedef std::vector<Integer>                      IntVect;
 	typedef std::vector<Element>                        pVect;
@@ -204,19 +205,19 @@ int test_full_multip_matrix(std::ostream & report, size_t PrimeSize,
 			    size_t Size, std::pair<size_t, size_t> dims)
 {
 
-	typedef typename LinBox::UnparametricField<T>        Unparam ;
+	typedef typename Givaro::ZRing<T>        Unparam ;
 	typedef typename std::vector<T>                         Vect ;
 	typedef typename LinBox::BlasMatrix<Unparam>          Matrix ;
 	typedef typename std::vector<Matrix>                 MatVect ;
 	typedef typename Vect::iterator                      Iterator;
 	typedef typename MatVect::iterator                MatIterator;
-	typedef typename LinBox::BlasMatrix<PID_integer>   IntMatrix ;
+	typedef typename LinBox::BlasMatrix<Givaro::ZRing<Integer> >  IntMatrix ;
 
-	typedef LinBox::Modular<double>                        Field ;
+	typedef Givaro::Modular<double>                        Field ;
 	typedef Field::Element                                Element;
 	typedef typename LinBox::BlasMatrix<Field>           pMatrix ;
 
-	PID_integer Z ;
+	Givaro::ZRing<Integer> Z ;
 
 	Vect primes(Size) ;
 	/*  probably not all coprime... */
@@ -240,7 +241,7 @@ int test_full_multip_matrix(std::ostream & report, size_t PrimeSize,
 	Iterator  genprime =   primes.begin()  ; // prime iterator
 	MatIterator residu = residues.begin()  ; // residu iterator
 
-	double LogIntSize = (double)(PrimeSize+1)*std::log(2)+std::log((double)Size)+1 ;
+	double LogIntSize = (double)(PrimeSize+1)*std::log(2.)+std::log((double)Size)+1 ;
 
 	std::pair<size_t,double> my_pair(dims.first*dims.second,LogIntSize)  ;
 
@@ -311,7 +312,7 @@ int test_full_multip(std::ostream & report, size_t PrimeSize, size_t Size, size_
 	typedef typename Vect::iterator                 Iterator;
 	typedef typename VectVect::iterator         VectIterator;
 
-	typedef LinBox::Modular<double >           ModularField ;
+	typedef Givaro::Modular<double >           ModularField ;
 	typedef ModularField::Element                    Element;
 	typedef typename std::vector<Element>             pVect ;
 
@@ -335,7 +336,7 @@ int test_full_multip(std::ostream & report, size_t PrimeSize, size_t Size, size_
 	Iterator   genprime =   primes.begin()  ; // prime iterator
 	VectIterator residu = residues.begin()  ; // residu iterator
 
-	double LogIntSize = (double)PrimeSize*std::log(2)+std::log((double)Size)+1 ;
+	double LogIntSize = (double)PrimeSize*std::log(2.)+std::log((double)Size)+1 ;
 
 	report << "FullMultipCRA (" <<  LogIntSize << ')' << std::endl;
 	FullMultipCRA<ModularField> cra( LogIntSize ) ;
@@ -400,7 +401,7 @@ int test_full_multip_fixed(std::ostream & report, size_t PrimeSize, size_t Size,
 	typedef typename Vect::iterator                 Iterator;
 	typedef typename VectVect::iterator         VectIterator;
 
-	typedef LinBox::Modular<double >           ModularField ;
+	typedef Givaro::Modular<double >           ModularField ;
 	typedef ModularField::Element                    Element;
 	typedef typename std::vector<Element>             pVect ;
 	typedef typename pVect::iterator          pVectIterator ;
@@ -424,7 +425,7 @@ int test_full_multip_fixed(std::ostream & report, size_t PrimeSize, size_t Size,
 	Iterator   genprime =   primes.begin()  ; // prime iterator
 	VectIterator residu = residues.begin()  ; // residu iterator
 
-	double LogIntSize = (double)PrimeSize*std::log(2)+std::log((double)Size) ;
+	double LogIntSize = (double)PrimeSize*std::log(2.)+std::log((double)Size) ;
 
 	std::pair<size_t,double> my_pair(Taille,LogIntSize)  ;
 
@@ -544,10 +545,10 @@ int main(int ac, char ** av)
 
 	/*  Argument parsing/setting */
 
-	static size_t       n = 50;    /*  Taille */
+	static size_t       n = 30;    /*  Taille */
 	static size_t       p = 22;    /*  PrimeSize */
 	// static size_t    seed =  0;    /*  ! unused */
-	static size_t   iters = 20;    /* _LB_REPEAT */
+	static size_t   iters = 2;    /* _LB_REPEAT */
 
         static Argument as[] = {
                 { 'n', "-n N", "Set number of primes.", TYPE_INT , &n },
@@ -558,7 +559,7 @@ int main(int ac, char ** av)
 
 	parseArguments (ac, av, as);
 
-	bool pass = true ;
+	bool pass ;
 
 	srand((unsigned)time(NULL));             // seeding
 	size_t PrimeSize   =  p;       // size of the residues/primes
diff --git a/tests/test-cradomain.C b/tests/test-cradomain.C
index d181635..586123d 100644
--- a/tests/test-cradomain.C
+++ b/tests/test-cradomain.C
@@ -29,9 +29,10 @@
  */
 
 
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
 #include "linbox/algorithms/cra-domain.h"
-#include "linbox/field/modular.h"
-#include "linbox/algorithms/blas-domain.h"
 #include "linbox/algorithms/cra-early-multip.h"
 #include "linbox/algorithms/cra-full-multip.h"
 #include "linbox/algorithms/cra-full-multip-fixed.h"
@@ -42,23 +43,24 @@
 using namespace LinBox;
 
 struct Interator {
-	std::vector<integer> _v;
+	BlasVector<Givaro::ZRing<Integer> > _v;
 	double maxsize;
 
-	Interator(const std::vector<integer>& v) :
+	Interator(const BlasVector<Givaro::ZRing<Integer> >& v) :
 		_v(v), maxsize(0.0)
 	{
-		for(std::vector<integer>::const_iterator it=_v.begin();
+		for(BlasVector<Givaro::ZRing<Integer> > ::const_iterator it=_v.begin();
 		    it != _v.end(); ++it) {
+			//!@bug bb: *it < 0 ?
 			double ds = Givaro::naturallog(*it);
 			maxsize = (maxsize<ds?ds:maxsize);
 		}
 	}
 
 	Interator(int n, int s) :
-		_v(n), maxsize(0.0)
+		_v(Givaro::ZRing<Integer>(),(size_t)n), maxsize(0.0)
 	{
-		for(std::vector<integer>::iterator it=_v.begin();
+		for(BlasVector<Givaro::ZRing<Integer> >::iterator it=_v.begin();
 		    it != _v.end(); ++it) {
 			Integer::random<false>(*it, s);
 			double ds = Givaro::naturallog(*it);
@@ -66,7 +68,7 @@ struct Interator {
 		}
 	}
 
-	const std::vector<integer>& getVector()
+	const BlasVector<Givaro::ZRing<Integer> >& getVector()
 	{
 	       	return _v;
        	}
@@ -76,12 +78,12 @@ struct Interator {
 	}
 
 	template<typename Field>
-	std::vector<typename Field::Element>& operator()(std::vector<typename Field::Element>& v,
-							 const Field& F) const
+	BlasVector<Field>& operator()(BlasVector<Field>& v,
+				      const Field& F) const
 	{
 		v.resize(_v.size());
-		std::vector<integer>::const_iterator vit=_v.begin();
-		typename std::vector<typename Field::Element>::iterator eit=v.begin();
+		BlasVector<Givaro::ZRing<Integer> >::const_iterator vit=_v.begin();
+		typename BlasVector<Field>::iterator eit=v.begin();
 		for( ; vit != _v.end(); ++vit, ++eit){
 			F.init(*eit, *vit);
 		}
@@ -93,26 +95,28 @@ struct Interator {
 struct InteratorIt;
 namespace LinBox
 {
-	template<class Element> struct CRATemporaryVectorTrait<InteratorIt , Element> {
-		typedef typename std::vector<double>::iterator Type_t;
+	template<class Field>
+	struct CRATemporaryVectorTrait<InteratorIt , Field> {
+		typedef typename BlasVector<Field>::iterator Type_t;
 	};
 }
 
 struct InteratorIt : public Interator {
 
+	// could use BlasVector and changeField
 	mutable std::vector<double> _vectC;
 
-	InteratorIt(const std::vector<integer>& v) :
+	InteratorIt(const BlasVector<Givaro::ZRing<Integer> >& v) :
 		Interator(v), _vectC(v.size())
 	{}
 	InteratorIt(int n, int s) :
-		Interator(n,s), _vectC(n)
+		Interator(n,s), _vectC((size_t)n)
 	{}
 
 	template<typename Iterator, typename Field>
 	Iterator& operator()(Iterator& res, const Field& F) const
 	{
-		std::vector<integer>::const_iterator vit=this->_v.begin();
+		BlasVector<Givaro::ZRing<Integer> >::const_iterator vit=this->_v.begin();
 		std::vector<double>::iterator eit=_vectC.begin();
 		for( ; vit != _v.end(); ++vit, ++eit) {
 			F.init(*eit, *vit);
@@ -124,9 +128,11 @@ struct InteratorIt : public Interator {
 };
 
 template<typename Field> struct InteratorBlas;
+
 namespace LinBox
 {
-	template<class Element,class Field> struct CRATemporaryVectorTrait<InteratorBlas<Field> , Element> {
+	template<class Field>
+	struct CRATemporaryVectorTrait<InteratorBlas<Field>, Field > {
 		typedef typename LinBox::BlasMatrix<Field>::pointer Type_t;
 	};
 }
@@ -134,17 +140,25 @@ namespace LinBox
 template<typename Field>
 struct InteratorBlas : public Interator {
 	typedef typename Field::Element Element;
-	typedef LinBox::BlasMatrix<LinBox::UnparametricField<Element> > Matrix;
+	typedef LinBox::BlasMatrix<Givaro::ZRing<Element> > Matrix;
 	typedef typename Matrix::pointer Pointer;
-	typename LinBox::UnparametricField<Element> _field;
+	typename Givaro::ZRing<Element> _field;
 	mutable Matrix _vectC;
 
-	InteratorBlas(const std::vector<integer>& v) : Interator(v),_field(), _vectC(_field,(int)v.size(), (int)1) {}
-	InteratorBlas(int n, int s) : Interator(n,s), _field(),_vectC(_field,n,1) {}
+	InteratorBlas(const BlasVector<Givaro::ZRing<Integer> >& v) :
+		Interator(v),
+		_field(),
+		_vectC(_field,(int)v.size(), (int)1)
+	{}
+
+	InteratorBlas(int n, int s) :
+		Interator(n,s),
+		_field(),
+		_vectC(_field,n,1) {}
 
 	Pointer& operator()(Pointer& res, const Field& F) const
 	{
-		std::vector<integer>::const_iterator vit=this->_v.begin();
+		BlasVector<Givaro::ZRing<Integer> >::const_iterator vit=this->_v.begin();
 		res = _vectC.getWritePointer();
 		for( ; vit != _v.end(); ++vit, ++res)
 			F.init(*res, *vit);
@@ -162,14 +176,15 @@ bool TestOneCRA(std::ostream& report, Iter& iteration, RandGen& genprime, size_t
 {
 	report << "ChineseRemainder<" << typeid(Builder).name() << ">(" << bound << ')' << std::endl;
 	LinBox::ChineseRemainder< Builder > cra( bound );
-	std::vector<integer> Res(N);
+	Givaro::ZRing<Integer> Z;
+	BlasVector<Givaro::ZRing<Integer> > Res(Z,N);
 	cra( Res, iteration, genprime);
 	bool locpass = std::equal( Res.begin(), Res.end(), iteration.getVector().begin() );
 	if (locpass) report << "ChineseRemainder<" << typeid(Builder).name() << ">(" << iteration.getLogSize() << ')' << ", passed."  << std::endl;
 	else {
 		report << "***ERROR***: ChineseRemainder<" << typeid(Builder).name() << ">(" << iteration.getLogSize() << ')' << "***ERROR***"  << std::endl;
-		std::vector<integer>::const_iterator Rit=Res.begin();
-		std::vector<integer>::const_iterator Oit=iteration.getVector().begin();
+		BlasVector<Givaro::ZRing<Integer> >::const_iterator Rit=Res.begin();
+		BlasVector<Givaro::ZRing<Integer> >::const_iterator Oit=iteration.getVector().begin();
 		for( ; Rit!=Res.end(); ++Rit, ++Oit)
 			if (*Rit != *Oit)
 				report << *Rit <<  " != " << * Oit << std::endl;
@@ -181,17 +196,18 @@ bool TestOneCRA(std::ostream& report, Iter& iteration, RandGen& genprime, size_t
 template<typename Builder, typename Iter, typename RandGen, typename BoundType>
 bool TestOneCRAbegin(std::ostream& report, Iter& iteration, RandGen& genprime, size_t N, const BoundType& bound)
 {
+	Givaro::ZRing<Integer> Z;
 	report << "ChineseRemainder<" << typeid(Builder).name() << ">(" << bound << ')' << std::endl;
 	LinBox::ChineseRemainder< Builder > cra( bound );
-	std::vector<integer> Res(N);
-	std::vector<integer>::iterator ResIT= Res.begin();
+	BlasVector<Givaro::ZRing<Integer> > Res(Z,N);
+	BlasVector<Givaro::ZRing<Integer> >::iterator ResIT= Res.begin();
 	cra( ResIT, iteration, genprime);
 	bool locpass = std::equal( Res.begin(), Res.end(), iteration.getVector().begin() );
 	if (locpass) report << "ChineseRemainder<" << typeid(Builder).name() << ">(" << iteration.getLogSize() << ')' << ", passed."  << std::endl;
 	else {
 		report << "***ERROR***: ChineseRemainder<" << typeid(Builder).name() << ">(" << iteration.getLogSize() << ')' << "***ERROR***"  << std::endl;
-		std::vector<integer>::const_iterator Rit=Res.begin();
-		std::vector<integer>::const_iterator Oit=iteration.getVector().begin();
+		BlasVector<Givaro::ZRing<Integer> >::const_iterator Rit=Res.begin();
+		BlasVector<Givaro::ZRing<Integer> >::const_iterator Oit=iteration.getVector().begin();
 		for( ; Rit!=Res.end(); ++Rit, ++Oit)
 			if (*Rit != *Oit)
 				report << *Rit <<  " != " << * Oit << std::endl;
@@ -205,8 +221,8 @@ bool TestOneCRAWritePointer(std::ostream& report, Iter& iteration, RandGen& genp
 {
 	report << "ChineseRemainder<" << typeid(Builder).name() << ">(" << bound << ')' << std::endl;
 	LinBox::ChineseRemainder< Builder > cra( bound );
-	PID_integer Z ;
-	LinBox::BlasMatrix<PID_integer> Res(Z, (int)N, (int)N);
+	Givaro::ZRing<Integer> Z ;
+	LinBox::BlasMatrix<Givaro::ZRing<Integer> > Res(Z, (int)N, (int)N);
 	cra( Res.getWritePointer(), iteration, genprime);
 	bool locpass = std::equal( iteration.getVector().begin(), iteration.getVector().end(), Res.getWritePointer() );
 
@@ -220,84 +236,87 @@ bool TestOneCRAWritePointer(std::ostream& report, Iter& iteration, RandGen& genp
 }
 
 
-bool TestCra(int N, int S, size_t seed)
+bool TestCra(size_t N, int S, size_t seed)
 {
 
 	std::ostream &report = LinBox::commentator().report (LinBox::Commentator::LEVEL_IMPORTANT,
 							   INTERNAL_DESCRIPTION);
 	// std::ostream &report = std::cout;
+	Givaro::ZRing<Integer> Z;
 
-	size_t new_seed = (seed?(seed):(BaseTimer::seed())) ;
+	size_t new_seed = (seed?(seed):((size_t)BaseTimer::seed())) ;
 	report << "TestCra(" << N << ',' << S << ',' << new_seed << ')' << std::endl;
 	Integer::seeding(new_seed);
 
-	Interator iteration(N, S);
+	Interator iteration((int)N, S);
 	InteratorIt iterationIt(iteration.getVector());
-	InteratorBlas<LinBox::Modular<double> > iterationBlas(iteration.getVector());
+	InteratorBlas<Givaro::Modular<double> > iterationBlas(iteration.getVector());
 	LinBox::RandomPrimeIterator genprime( 24, new_seed );
 
 	bool pass = true;
 
-	pass &= TestOneCRA< LinBox::EarlyMultipCRA< LinBox::Modular<double> >,
+	pass &= TestOneCRA< LinBox::EarlyMultipCRA< Givaro::Modular<double> >,
 	     Interator, LinBox::RandomPrimeIterator>(
 						     report, iteration, genprime, N, 5);
 
-	pass &= TestOneCRA< LinBox::EarlyMultipCRA< LinBox::Modular<double> >,
+	pass &= TestOneCRA< LinBox::EarlyMultipCRA< Givaro::Modular<double> >,
 	     Interator, LinBox::RandomPrimeIterator>(
 						     report, iteration, genprime, N, 15);
 
-	pass &= TestOneCRA< LinBox::FullMultipCRA< LinBox::Modular<double> >,
+	pass &= TestOneCRA< LinBox::FullMultipCRA< Givaro::Modular<double> >,
 	     Interator, LinBox::RandomPrimeIterator>(
 						     report, iteration, genprime, N, iteration.getLogSize()+1);
 
-	pass &= TestOneCRA< LinBox::FullMultipCRA< LinBox::Modular<double> >,
+	pass &= TestOneCRA< LinBox::FullMultipCRA< Givaro::Modular<double> >,
 	     Interator, LinBox::RandomPrimeIterator>(
 						     report, iteration, genprime, N, 3*iteration.getLogSize()+15);
 
-	pass &= TestOneCRAbegin<LinBox::FullMultipFixedCRA< LinBox::Modular<double> >,
+#if 0
+	pass &= TestOneCRAbegin<LinBox::FullMultipFixedCRA< Givaro::Modular<double> >,
 	     InteratorIt, LinBox::RandomPrimeIterator>(
 						       report, iterationIt, genprime, N, std::pair<size_t,double>(N,iteration.getLogSize()+1));
 
-	pass &= TestOneCRAbegin<LinBox::FullMultipFixedCRA< LinBox::Modular<double> >,
+	pass &= TestOneCRAbegin<LinBox::FullMultipFixedCRA< Givaro::Modular<double> >,
 	     InteratorIt, LinBox::RandomPrimeIterator>(
 						       report, iterationIt, genprime, N, std::pair<size_t,double>(N,3*iteration.getLogSize()+15));
 
 
-	pass &= TestOneCRAWritePointer<LinBox::FullMultipFixedCRA< LinBox::Modular<double> >,
+	pass &= TestOneCRAWritePointer<LinBox::FullMultipFixedCRA< Givaro::Modular<double> >,
 	     InteratorIt, LinBox::RandomPrimeIterator>(
 						       report, iterationIt, genprime, N, std::pair<size_t,double>(N,iterationIt.getLogSize()+1) );
 
-	pass &= TestOneCRAWritePointer<LinBox::FullMultipFixedCRA< LinBox::Modular<double> >,
+	pass &= TestOneCRAWritePointer<LinBox::FullMultipFixedCRA< Givaro::Modular<double> >,
 	     InteratorIt, LinBox::RandomPrimeIterator>(
 						       report, iterationIt, genprime, N, std::pair<size_t,double>(N,3*iterationIt.getLogSize()+15) );
 
-	pass &= TestOneCRAWritePointer<LinBox::FullMultipFixedCRA< LinBox::Modular<double> >,
-	     InteratorBlas< LinBox::Modular<double> >,
+	pass &= TestOneCRAWritePointer<LinBox::FullMultipFixedCRA< Givaro::Modular<double> >,
+	     InteratorBlas< Givaro::Modular<double> >,
 	     LinBox::RandomPrimeIterator>(
 					  report, iterationBlas, genprime, N, std::pair<size_t,double>(N,iterationIt.getLogSize()+1) );
 
-	pass &= TestOneCRAWritePointer<LinBox::FullMultipFixedCRA< LinBox::Modular<double> >,
-	     InteratorBlas< LinBox::Modular<double> >,
+	pass &= TestOneCRAWritePointer<LinBox::FullMultipFixedCRA< Givaro::Modular<double> >,
+	     InteratorBlas< Givaro::Modular<double> >,
 	     LinBox::RandomPrimeIterator>(
 					  report, iterationBlas, genprime, N, std::pair<size_t,double>(N,3*iterationIt.getLogSize()+15) );
+#endif
 
 
-        std::vector<integer> PrimeSet;
+        BlasVector<Givaro::ZRing<Integer> >  PrimeSet(Z);
         double PrimeSize = 0.0;
         for( ; PrimeSize < (iterationIt.getLogSize()+1); ++genprime ) {
-            if (find(PrimeSet.begin(), PrimeSet.end(), *genprime) == PrimeSet.end()) {
+            if (std::find(PrimeSet.begin(), PrimeSet.end(), *genprime) == PrimeSet.end()) {
                 PrimeSet.push_back( *genprime );
                 PrimeSize += Givaro::naturallog(*genprime);
             }
         }
 
-        std::vector<integer>::iterator psit = PrimeSet.begin();
+        BlasVector<Givaro::ZRing<Integer> > ::iterator psit = PrimeSet.begin();
 
 	pass &= TestOneCRA<
-            LinBox::GivaroRnsFixedCRA< LinBox::Modular<double> >,
+            LinBox::GivaroRnsFixedCRA< Givaro::Modular<double> >,
             Interator,
-            std::vector<integer>::iterator,
-            std::vector<integer> >(
+            BlasVector<Givaro::ZRing<Integer> > ::iterator,
+            BlasVector<Givaro::ZRing<Integer> >  >(
                  report, iteration, psit, N, PrimeSet);
 
 
@@ -332,17 +351,16 @@ int main (int argc, char **argv)
 	bool pass = true;
 
 	for(int i=0; pass && i<iterations; ++i)
-		pass &= TestCra((int)n,(int)s,seed);
+		pass &= TestCra((size_t)n,(int)s,seed);
 
 	LinBox::commentator().stop(MSG_STATUS (pass), "CRA-Domain test suite");
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-dense-zero-one.C b/tests/test-dense-zero-one.C
index d56c0b0..ed8ce42 100644
--- a/tests/test-dense-zero-one.C
+++ b/tests/test-dense-zero-one.C
@@ -32,14 +32,14 @@
 
 
 
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/dense-matrix.h"
 #include "linbox/matrix/matrix-domain.h"
-#include "linbox/field/modular.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/ring/modular.h"
 
 #include "linbox/blackbox/dense-zero-one.h"
 
-#include <vector>
+
 #include "linbox/util/timer.h"
 #include "test-common.h"
 
@@ -126,15 +126,15 @@ bool testAssociativity(Blackbox& A)
 	Dom MD = A.domain();
 	size_t m = A.rowdim(), n = A.coldim() - 100;
 	size_t k = (m + n)/2;
-	typename Dom::Block B(k,m), C(m,n);
+	typename Dom::Block B(A.field(),k,m), C(A.field(),m,n);
 	MD.random(B); MD.random(C);
 
-	typename Dom::Block D(m,n), E(k,n);
+	typename Dom::Block D(A.field(),m,n), E(A.field(),k,n);
 
 	A.apply(D, C); // D = AC
 	MD.mul(E,B,D); // E = B(AC)
 
-	typename Dom::Block F(k,m), G(k,n);
+	typename Dom::Block F(A.field(),k,m), G(A.field(),k,n);
 
 	A.unpackingApplyTranspose(F,B); // F = BA
 	MD.mul(G,F,C); // G = (BA)C
@@ -308,8 +308,8 @@ int main (int argc, char* argv[])
         parseArguments (argc, argv, args);
 
 	// create a dense-zero-one
-	typedef Modular<float> FieldF;
-	typedef Modular<double> FieldD;
+	typedef Givaro::Modular<float> FieldF;
+	typedef Givaro::Modular<double> FieldD;
 
 	BlackboxDomain<FieldF> F(f);
 	FieldF::RandIter r1(F);
@@ -319,39 +319,35 @@ int main (int argc, char* argv[])
 
 	DenseZeroOne<BlackboxDomain<FieldF> > A(F, n, n);
 	DenseZeroOne<BlackboxDomain<FieldD> > B(D, n, n);
-	FieldF::Element zeroF, oneF;
-	FieldD::Element zeroD, oneD;
-	F.init(oneF, 1); F.init(zeroF, 0);
-	D.init(oneD, 1); D.init(zeroD, 0);
 
 	for (size_t i = 0; i < n; ++i)
 		for (size_t j = 0; j < n; ++j) {
 			if (rand()%2){
-				A.setEntry(i, j, oneF);
-				B.setEntry(i, j, oneD);
+				A.setEntry(i, j, F.one);
+				B.setEntry(i, j, D.one);
 			}
 
 			else {
-				A.setEntry(i, j, zeroF);
-				B.setEntry(i, j, zeroD);
+				A.setEntry(i, j, F.zero);
+				B.setEntry(i, j, D.zero);
 			}
 		}
 
 	//A.write(cout) << endl << endl;
 	//B.write(cout) << endl << endl;
 
-	/* basic everyday test
+#if 0
+	/* basic everyday test */
 	cout << endl;
-	cout << "Domain: Modular<float>, GF(" << f << ")" << endl;
+	cout << "Domain: Givaro::Modular<float>, GF(" << f << ")" << endl;
 	testTiming(A);
 
-	cout << "Domain: Modular<double>, GF(" << d << ")" << endl;
+	cout << "Domain: Givaro::Modular<double>, GF(" << d << ")" << endl;
 	testTiming(B);
-	*/
 
-	/* block size tests
+	/* block size tests */
 	cout << endl;
-	cout << "Domain: Modular<double>, GF(" << d << ")" << endl << endl;
+	cout << "Domain: Givaro::Modular<double>, GF(" << d << ")" << endl << endl;
 	cout << "block Size     n     unpackingApply   unpackingApplyTranspose    Domain mul" << endl << endl;
 	for (size_t sizeU = 256; sizeU != 4096; sizeU *= 2)
 		for (int count = 500; count != 4500; count += 500){
@@ -360,53 +356,48 @@ int main (int argc, char* argv[])
 			for (size_t i = 0; i < count; ++i)
 				for (size_t j = 0; j < count; ++j) {
 					if (rand()%2)
-						C.setEntry(i, j, oneD);
+						C.setEntry(i, j, D.one);
 					else
-						C.setEntry(i, j, zeroD);
+						C.setEntry(i, j, D.zero);
 				}
 
 				blockSizeTimingTest(C, sizeU);
 		}
-	*/
 
+#endif
 
-	/* stress test
-	cout << "Domain: Modular<double>, GF(" << d << ")" << endl;
+#if 0
+	/* stress test */
+	cout << "Domain: Givaro::Modular<double>, GF(" << d << ")" << endl;
 	DenseZeroOne<BlackboxDomain<FieldD> > C(D, 30000, 30000);
 	for (size_t i = 0; i != 30000; ++i)
 		for (size_t j = 0; j != 30000; ++j) {
 			if (rand()%2)
-				C.setEntry(i, j, oneD);
+				C.setEntry(i, j, D.one);
 			else
-				C.setEntry(i, j, zeroD);
+				C.setEntry(i, j, D.zero);
 		}
 	stressTest(C);
-	*/
 
-	/* large tests
-	cout << "Domain: Modular<double>, GF(" << d << ")" << endl;
+	/* large tests */
+	cout << "Domain: Givaro::Modular<double>, GF(" << d << ")" << endl;
 	for (size_t dim = 120000; dim < 150000; dim *= 2){
 		DenseZeroOne<BlackboxDomain<FieldD> > C(D, dim, dim);
 		for (size_t i = 0; i != dim; ++i)
 			for (size_t j = 0; j != dim; ++j) {
 				if (rand()%2)
-					C.setEntry(i, j, oneD);
+					C.setEntry(i, j, D.one);
 				else
-					C.setEntry(i, j, zeroD);
+					C.setEntry(i, j, D.zero);
 			}
 		cout << "blackbox created\n";
 		largeTest(C);
 	}
-	*/
+#endif
 
+	std::cout << "most test is commented out" << std::endl;
 	if (!t){
 		bool pass = testAssociativity(B);
-		/*
-		if (pass)
-			cout << "passes" << endl;
-		else
-			cout << "fails" << endl;
-		*/
 
 		return pass ? 0 : -1;
 	}
diff --git a/tests/test-dense.C b/tests/test-dense.C
index 1a781b5..7ac5244 100644
--- a/tests/test-dense.C
+++ b/tests/test-dense.C
@@ -7,20 +7,20 @@
  *
  * --------------------------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -42,12 +42,12 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
+
 #include <cstdio>
 
 #include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/dense-matrix.h"
 
 #include "test-common.h"
 #include "test-generic.h"
@@ -67,32 +67,29 @@ using namespace LinBox;
  * Return true on success and false on failure
  */
 
-// using long on purpose
 template <class Field>
-static bool testIdentity (Field &F, size_t n, int iterations)
+static bool testIdentity (Field &F, size_t n, int iterations = 1)
 {
-	typedef typename Vector<Field>::Dense Vector;
-	typedef BlasMatrix<Field>               Base;
-	typedef BlasMatrix<Field>           Blackbox;
+	typedef DenseVector<Field> Vector;
+	typedef DenseMatrix<Field> Base;
+	typedef DenseMatrix<Field>           Blackbox;
 
-	commentator().start ("Testing identity apply", "testIdentity", iterations);
+	commentator().start ("Testing identity apply", "testIdentity", (unsigned int)iterations);
 
 	bool ret = true;
-	bool iter_passed = true;
+	// bool iter_passed = true;
 
 	Blackbox I(F, n, n);
 	// Matrix K(I);
 	//typename Field::Element x; F.init(x);
 	//F.write(std::cout, K.getEntry(x, i, j)) << std::endl;
 	//Matrix L(K);
-	typename Field::Element one;
 
-	F.init (one, 1);
 
 	for (size_t i = 0; i < n; i++)
-		I.setEntry (i, i, one);
+		I.setEntry (i, i, F.one);
 
-	Vector v(n), w(n);
+	Vector v(F,n), w(F,n);
 	typename Field::RandIter r (F);
 
 	for (int i = 0; i < iterations; i++) {
@@ -100,10 +97,10 @@ static bool testIdentity (Field &F, size_t n, int iterations)
 		snprintf (buf, 80, "Iteration %d", i);
 		commentator().start (buf);
 
-		iter_passed = true;
+		bool iter_passed = true;
 
 		for (size_t j = 0; j < n; j++)
-			r.random (v[j]);
+			r.random (v[(size_t)j]);
 
 		ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
 		report << "Input vector: ";
@@ -119,7 +116,7 @@ static bool testIdentity (Field &F, size_t n, int iterations)
 		printVector<Field> (F, report, w);
 
 		for (size_t j = 0; j < (size_t)n; j++)
-			if (!F.areEqual (w[j], v[j]))
+			if (!F.areEqual (w[(size_t)j], v[(size_t)j]))
 				ret = iter_passed = false;
 
 		if (!iter_passed)
@@ -154,22 +151,22 @@ static bool testIdentity (Field &F, size_t n, int iterations)
  */
 
 template <class Field>
-static bool testVandermonde (Field &F, size_t n, int iterations, int N)
+static bool testVandermonde (Field &F, size_t n, int iterations = 1, int N = 1)
 {
-	typedef typename Vector<Field>::Dense Vector;
-	typedef vector <typename Field::Element> Polynomial;
-	typedef BlasMatrix <Field> Blackbox;
+	typedef DenseVector<Field> Vector;
+	typedef DenseVector <Field> Polynomial;
+	typedef DenseMatrix <Field> Blackbox;
 
-	commentator().start ("Testing Vandermonde apply", "testVandermonde", iterations);
+	commentator().start ("Testing Vandermonde apply", "testVandermonde", (unsigned int)iterations);
 
 	bool ret = true;
 	bool inner_iter_passed;
 
 	int i, j, k;
 
-	Blackbox V (F, n, n);
+	Blackbox V(F, n, n); 
 
-	Vector x(n), v(n), y(n), f(n);
+	Vector x(F,n), v(F,n), y(F,n), f(F,n);
 	typename Field::RandIter r (F);
 	typename Field::Element t;
 
@@ -179,15 +176,15 @@ static bool testVandermonde (Field &F, size_t n, int iterations, int N)
 		commentator().start (buf);
 
 		/* Evaluation points */
-		for (j = 0; j < n; j++) {
+		for (j = 0; j < (int) n; j++) {
 			bool flag = true;
 
 			// Make sure points are all distinct
 			while (flag) {
-				r.random (x[j]);
+				r.random (x[(size_t)j]);
 				flag = false;
 				for (k = 0; k < j; k++)
-					if (F.areEqual (x[j], x[k]))
+					if (F.areEqual (x[(size_t)j], x[(size_t)k]))
 						flag = true;
 			}
 		}
@@ -197,21 +194,21 @@ static bool testVandermonde (Field &F, size_t n, int iterations, int N)
 		printVector<Field> (F, report, x);
 
 		/* Build the Vandermonde matrix */
-		for (j = 0; j < n; j++) {
-			F.init (t, 1);
+		for (j = 0; j < (int) n; j++) {
+			F.assign(t, F.one);
 
-			for (k = 0; k < n; k++) {
-				V.setEntry (j, k, t);
-				F.mulin (t, x[j]);
+			for (k = 0; k < (int) n; k++) {
+				V.setEntry ((size_t)j,(size_t) k, t);
+				F.mulin (t, x[(size_t)j]);
 			}
 		}
 
-		for (j = 0; j < N; j++) {
+		for (j = 0; j < (int) N; j++) {
 			inner_iter_passed = true;
 
 			/* Random vector of evaluation results */
-			for (k = 0; k < n; k++)
-				r.random (v[k]);
+			for (k = 0; k < (int)n; k++)
+				r.random (v[(size_t)k]);
 
 			report << "Input vector: ";
 			printVector<Field> (F, report, v);
@@ -228,8 +225,8 @@ static bool testVandermonde (Field &F, size_t n, int iterations, int N)
 			report << "Interpolation results: ";
 			printVector<Field> (F, report, f);
 
-			for (k = 0; k < n; k++)
-				if (!F.areEqual (f[k], v[k]))
+			for (k = 0; k < (int) n; k++)
+				if (!F.areEqual (f[(size_t)k], v[(size_t)k]))
 					ret = inner_iter_passed = false;
 
 			if (!inner_iter_passed)
@@ -260,16 +257,16 @@ static bool testVandermonde (Field &F, size_t n, int iterations, int N)
  */
 
 template <class Field>
-static bool testRandomLinearity (const Field                                 &F,
-				 VectorStream<typename Vector<Field>::Dense> &A_stream,
-				 VectorStream<typename Vector<Field>::Dense> &v1_stream,
-				 VectorStream<typename Vector<Field>::Dense> &v2_stream)
+static bool testRandomLinearity ( const Field & F,
+				 VectorStream<DenseVector<Field> > &A_stream,
+				 VectorStream<DenseVector<Field> > &v1_stream,
+				 VectorStream<DenseVector<Field> > &v2_stream)
 {
 	commentator().start ("Testing random linearity", "testRandomLinearity", v1_stream.size ());
 
-	BlasMatrix<Field> A (F, A_stream);
+	DenseMatrix<Field> A (F, A_stream);
 
-	bool ret = testLinearity (F, A, v1_stream, v2_stream);
+	bool ret = testLinearity (A, v1_stream, v2_stream);
 
 	A_stream.reset ();
 	v1_stream.reset ();
@@ -295,13 +292,13 @@ static bool testRandomLinearity (const Field                                 &F,
 
 template <class Field>
 static bool testRandomTranspose (const Field                                 &F,
-				 VectorStream<typename Vector<Field>::Dense> &A_stream,
-				 VectorStream<typename Vector<Field>::Dense> &v1_stream,
-				 VectorStream<typename Vector<Field>::Dense> &v2_stream)
+				 VectorStream<DenseVector<Field> > &A_stream,
+				 VectorStream<DenseVector<Field> > &v1_stream,
+				 VectorStream<DenseVector<Field> > &v2_stream)
 {
 	commentator().start ("Testing random transpose", "testRandomTranspose", v1_stream.size ());
 
-	BlasMatrix<Field> A (F, A_stream);
+	DenseMatrix<Field> A (F, A_stream);
 
 	bool ret = testTranspose (F, A, v1_stream, v2_stream);
 
@@ -331,22 +328,24 @@ int main (int argc, char **argv)
 		END_OF_ARGUMENTS
 	};
 
-	typedef Modular<uint32_t> Field;
+	typedef Givaro::Modular<uint32_t> Field;
 
 	parseArguments (argc, argv, args);
-	Field F (q);
+	Field F (q); Field::RandIter gen(F);
 
-	commentator().start("Dense matrix black box test suite", "BlasMatrix");
+	commentator().start("Dense matrix black box test suite", "DenseMatrix");
 
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (5);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
 
-	RandomDenseStream<Field> A_stream (F, n, n);
-	RandomDenseStream<Field> v1_stream (F, n, iterations);
-	RandomDenseStream<Field> v2_stream (F, n, iterations);
+	RandomDenseStream<Field> A_stream (F, gen, n, n);
+	RandomDenseStream<Field> v1_stream (F, gen, n, (unsigned int)iterations);
+	RandomDenseStream<Field> v2_stream (F, gen, n, (unsigned int)iterations);
 
-	if (!testIdentity    (F, n, iterations)) pass = false;
-	//if (!testVandermonde (F, n, iterations, N)) pass = false;
+	if (!testIdentity    (F, n)) pass = false;
+	if (!testVandermonde (F, n)) pass = false;
+	DenseMatrix<Field> A(F, A_stream);
+	if (!testBlackbox(A)) pass = false;
 	//if (!testRandomLinearity (F, A_stream, v1_stream, v2_stream)) pass = false;
 	//if (!testRandomTranspose (F, A_stream, v1_stream, v2_stream)) pass = false;
 
@@ -354,11 +353,10 @@ int main (int argc, char **argv)
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-det.C b/tests/test-det.C
index b652324..e445cdf 100644
--- a/tests/test-det.C
+++ b/tests/test-det.C
@@ -6,20 +6,20 @@
  *
  * --------------------------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -36,19 +36,16 @@
 
 
 
+#include "linbox/linbox-config.h"
 #include <iostream>
 #include <fstream>
-#include <vector>
 #include <cstdio>
-
-#include "linbox/linbox-config.h"
-
+#include <givaro/givrational.h>
 #include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/PID-integer.h"
-#include "linbox/field/gmp-rational.h"
+#include "givaro/modular.h"
+#include "linbox/vector/blas-vector.h"
 #include "linbox/blackbox/diagonal.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/solutions/det.h"
 #include "linbox/solutions/methods.h"
 
@@ -71,12 +68,10 @@ using namespace LinBox;
 template <class Field>
 static bool testDiagonalDet1 (Field &F, size_t n, int iterations)
 {
-	typedef vector <typename Field::Element> Vector;
-	typedef vector <typename Field::Element> Polynomial;
-	typedef vector <pair <size_t, typename Field::Element> > Row;
+	typedef BlasVector<Field> Vector;
 	typedef Diagonal <Field> Blackbox;
 
-	commentator().start ("Testing nonsingular diagonal determinant (1)", "testDiagonalDet1", iterations);
+	commentator().start ("Testing nonsingular diagonal determinant (1)", "testDiagonalDet1", (unsigned int) iterations);
 
 	bool ret = true;
 	bool done;
@@ -85,14 +80,14 @@ static bool testDiagonalDet1 (Field &F, size_t n, int iterations)
 
 	VectorDomain<Field> VD (F);
 
-	Vector d(n);
+	Vector d(F,n);
 	typename Field::Element pi, phi_wiedemann, phi_symm_wied, phi_blas_elimination, phi_sparseelim;
 	typename Field::RandIter r (F);
 
 	for (i = 0; i < iterations; i++) {
-		commentator().startIteration (i);
+		commentator().startIteration ((unsigned int) i);
 
-		F.init (pi, 1);
+		F.assign(pi, F.one);
 
 		for (j = 0; j < n; j++) {
 			do {
@@ -119,7 +114,7 @@ static bool testDiagonalDet1 (Field &F, size_t n, int iterations)
 		F.write (report, pi);
 		report << endl;
 
-		Blackbox D (F, d);
+		Blackbox D (d);
 
                 Method::Wiedemann WiedemannChoice;
 		det (phi_wiedemann, D,  WiedemannChoice);
@@ -165,25 +160,23 @@ static bool testDiagonalDet1 (Field &F, size_t n, int iterations)
 template <class Field>
 static bool testDiagonalDet2 (Field &F, size_t n, int iterations)
 {
-	typedef vector <typename Field::Element> Vector;
-	typedef vector <typename Field::Element> Polynomial;
-	typedef vector <pair <size_t, typename Field::Element> > Row;
+	typedef BlasVector<Field> Vector;
 	typedef Diagonal <Field> Blackbox;
 
-	commentator().start ("Testing nonsingular diagonal determinant (2)", "testDiagonalDet2", iterations);
+	commentator().start ("Testing nonsingular diagonal determinant (2)", "testDiagonalDet2", (unsigned int) iterations);
 
 	bool ret = true;
 	int i, k;
 	size_t j;
 
-	Vector d(n);
+	Vector d(F,n);
 	typename Field::Element pi, phi_wiedemann, phi_symm_wied, phi_blas_elimination, phi_sparseelim;
 	typename Field::RandIter r (F);
 
 	for (i = 0; i < iterations; i++) {
-		commentator().startIteration (i);
+		commentator().startIteration ((unsigned int)i);
 
-		F.init (pi, 1);
+		F.assign(pi, F.one);
 
 		for (j = 0; j < n / 2; j++) {
 			do r.random (d[j]); while (F.isZero (d[j]));
@@ -191,9 +184,9 @@ static bool testDiagonalDet2 (Field &F, size_t n, int iterations)
 		}
 
 		for (j = n / 2; j < n; j++) {
-			k =int( rand () % (n / 2) );
-			d[j] = d[k];
-			F.mulin (pi, d[j]);
+			k =int( (size_t)rand () % (n / 2) );
+			d[j] = d[(size_t)k];
+			F.mulin (pi, d[(size_t)j]);
 		}
 
 		//ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
@@ -205,7 +198,7 @@ static bool testDiagonalDet2 (Field &F, size_t n, int iterations)
 		F.write (report, pi);
 		report << endl;
 
-		Blackbox D (F, d);
+		Blackbox D (d);
 		Method::Wiedemann WiedemannChoice;
 		det (phi_wiedemann, D,  WiedemannChoice);
                 WiedemannChoice.symmetric(Specifier::SYMMETRIC);
@@ -257,36 +250,34 @@ static bool testDiagonalDet2 (Field &F, size_t n, int iterations)
 template <class Field>
 static bool testSingularDiagonalDet (Field &F, size_t n, int iterations)
 {
-	typedef vector <typename Field::Element> Vector;
-	typedef vector <typename Field::Element> Polynomial;
-	typedef vector <pair <size_t, typename Field::Element> > Row;
+	typedef BlasVector <Field> Vector;
 	typedef Diagonal <Field> Blackbox;
 
-	commentator().start ("Testing singular diagonal determinant", "testSingularDiagonalDet", iterations);
+	commentator().start ("Testing singular diagonal determinant", "testSingularDiagonalDet",(size_t) iterations);
 
 	bool ret = true;
 	int i;
 	size_t j;
 
-	Vector d(n);
+	Vector d(F,n);
 	typename Field::Element phi_wiedemann, phi_symm_wied, phi_blas_elimination, phi_sparseelim;
 	typename Field::RandIter r (F);
 
 	for (i = 0; i < iterations; i++) {
-		commentator().startIteration (i);
+		commentator().startIteration ((unsigned int)i);
 
 		for (j = 0; j < n; j++)
 			r.random (d[j]);
 
 		// until bug about the upper left entry being zero is fixed:
-		F.init (d[1+ rand () % (n-1)], 0);
-		//F.init (d[rand () % n], 0);
+		F.assign(d[1+ (size_t)rand () % (n-1)], F.zero);
+		//F.assign(d[rand () % n], zero);
 
 		ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
 		report << "Diagonal entries: ";
 		printVector<Field> (F, report, d);
 
-		Blackbox D (F, d);
+		Blackbox D (d);
 
                  Method::Wiedemann WiedemannChoice;
 		det (phi_wiedemann, D,  WiedemannChoice);
@@ -338,16 +329,16 @@ static bool testSingularDiagonalDet (Field &F, size_t n, int iterations)
 
 bool testIntegerDet (size_t n, int iterations)
 {
- 	commentator().start ("Testing integer determinant", "testIntegerDet", iterations);
+ 	commentator().start ("Testing integer determinant", "testIntegerDet", (unsigned int)iterations);
 
 	bool ret = true;
 
 	for (int i = 0; i < iterations; ++i) {
-		commentator().startIteration (i);
-		PID_integer R;
-		SparseMatrix<PID_integer> A (R, n, n);
+		commentator().startIteration ((unsigned int)i);
+		Givaro::IntegerDom R;
+		SparseMatrix<Givaro::IntegerDom> A (R, n, n);
 
-	 	integer pi = 1L;
+	 	integer pi = 1;
  		integer det_A_wiedemann, det_A_symm_wied, det_A_blas_elimination;
 
  		for (unsigned int j = 0; j < n; ++j) {
@@ -416,16 +407,16 @@ bool testIntegerDet (size_t n, int iterations)
 
 bool testIntegerDetGen (size_t n, int iterations)
 {
- 	commentator().start ("Testing integer determinant, generic methods", "testIntegerDeterminantGeneric", iterations);
+ 	commentator().start ("Testing integer determinant, generic methods", "testIntegerDeterminantGeneric", (unsigned int) iterations);
 
 	bool ret = true;
 
 	for (int i = 0; i < iterations; ++i) {
-		commentator().startIteration (i);
-		PID_integer R;
-		SparseMatrix<PID_integer> A (R, n, n);
+		commentator().startIteration ((unsigned int)i);
+		Givaro::IntegerDom R;
+		SparseMatrix<Givaro::IntegerDom> A (R, n, n);
 
-	 	integer pi = 1L;
+	 	integer pi = 1;
  		integer det_A, det_A_H, det_A_B, det_A_E;
 
  		for (unsigned int j = 0; j < n; ++j) {
@@ -499,25 +490,25 @@ bool testIntegerDetGen (size_t n, int iterations)
 
 bool testRationalDetGen (size_t n, int iterations)
 {
- 	commentator().start ("Testing rational determinant, generic methods", "testRationalDeterminantGeneric", iterations);
+ 	commentator().start ("Testing rational determinant, generic methods", "testRationalDeterminantGeneric", (unsigned int) iterations);
 
 	bool ret = true;
 
 	for (int i = 0; i < iterations; ++i) {
-		commentator().startIteration (i);
-		GMPRationalField Q;
-		SparseMatrix<GMPRationalField > A (Q, n, n);
-		BlasMatrix <GMPRationalField > BB(Q, n, n);
+		commentator().startIteration ((unsigned int)i);
+		Givaro::QField<Givaro::Rational> Q;
+		SparseMatrix<Givaro::QField<Givaro::Rational> > A (Q, n, n);
+		BlasMatrix <Givaro::QField<Givaro::Rational> > BB(Q, n, n);
 
-	 	GMPRationalField::Element pi(1,1);
- 		GMPRationalField::Element det_A, det_B,det_A_H, det_B_H, det_A_B, det_B_B, det_A_E, det_B_E;
+	 	Givaro::QField<Givaro::Rational>::Element pi(1,1);
+ 		Givaro::QField<Givaro::Rational>::Element det_A, det_B,det_A_H, det_B_H, det_A_B, det_B_B, det_A_E, det_B_E;
 
  		for (unsigned int j = 0; j < n; ++j) {
 			integer tmp_n;
 	 		integer tmp_d;
 			integer::nonzerorandom (tmp_n, 20*i + 1);
  			integer::nonzerorandom (tmp_d, 20*i + 1);
-			GMPRationalField::Element tmp;
+			Givaro::QField<Givaro::Rational>::Element tmp;
 			Q.init(tmp,tmp_n,tmp_d);
 			A.setEntry(j,j,tmp);
 			BB.setEntry(j,j,tmp);
@@ -613,9 +604,9 @@ int main (int argc, char **argv)
 {
 	bool pass = true;
 
-	static size_t n = 10;
+	static size_t n = 4;
 	static integer q = 4093U;
-	static int iterations = 2;
+	static int iterations = 1;
 
 	static Argument args[] = {
 		{ 'n', "-n N", "Set dimension of test matrices to NxN", TYPE_INT,     &n },
@@ -625,7 +616,7 @@ int main (int argc, char **argv)
 	};
 
 	parseArguments (argc, argv, args);
-	Modular<int> F (q);
+	Givaro::Modular<int32_t> F (q);
 
 	commentator().start("Determinant test suite", "det");
 
@@ -637,18 +628,19 @@ int main (int argc, char **argv)
 	if (!testDiagonalDet2        (F, n, iterations)) pass = false;
 	if (!testSingularDiagonalDet (F, n, iterations)) pass = false;
 	if (!testIntegerDet          (n, iterations)) pass = false;
+/*
 	if (!testIntegerDetGen          (n, iterations)) pass = false;
 	if (!testRationalDetGen          (n, iterations)) pass = false;
+*/
 
 	commentator().stop("determinant test suite");
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-diagonal.C b/tests/test-diagonal.C
index e3c7931..94dad14 100644
--- a/tests/test-diagonal.C
+++ b/tests/test-diagonal.C
@@ -4,23 +4,23 @@
  *
  * Written by Bradford Hovinen <hovinen at cis.udel.edu>
  *
- * Time-stamp: <22 Jun 10 15:59:39 Jean-Guillaume.Dumas at imag.fr>
+ * Time-stamp: <02 Dec 15 11:45:00 Jean-Guillaume.Dumas at imag.fr>
  * --------------------------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -41,23 +41,24 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
+
 #include <cstdio>
 
 #include "linbox/blackbox/diagonal.h"
 #include "linbox/util/commentator.h"
-#include "linbox/field/archetype.h"
-#include "linbox/field/modular.h"
-#include "linbox/randiter/nonzero.h"
-#include "linbox/solutions/minpoly.h"
-#include "linbox/solutions/rank.h"
-#include "linbox/vector/stream.h"
+//#include "linbox/field/archetype.h"
+#include "linbox/ring/modular.h"
+#include <givaro/givranditer.h>
+//#include "linbox/solutions/minpoly.h"
+//#include "linbox/solutions/rank.h"
+//#include "linbox/vector/stream.h"
 
-#include "test-common.h"
-#include "test-generic.h"
+#include "test-blackbox.h"
+//#include "test-generic.h"
 
 using namespace LinBox;
 
+#if 0
 /* Test 1: Application of identity matrix onto random vectors
  *
  * Construct the identity matrix and a series of randomly-generated
@@ -78,21 +79,21 @@ static bool testIdentityApply (Field &F, VectorStream<Vector> &stream)
 	commentator().start ("Testing identity apply", "testIdentityApply", stream.m ());
 
 	bool ret = true;
-	bool iter_passed = true;
+	// bool iter_passed = true;
 
 	VectorDomain<Field> VD (F);
-	Vector d;
+	Vector d(F);
 
 	size_t i;
 
 	VectorWrapper::ensureDim (d, stream.n ());
 
 	for (i = 0; i < stream.n (); i++)
-		F.init (VectorWrapper::ref<Field> (d, i), 1);
+		F.assign(VectorWrapper::ref<Field> (d, i), F.one);
 
-	Blackbox D (F, d);
+	Blackbox D (d);
 
-	Vector v, w;
+	Vector v(F), w(F);
 
 	VectorWrapper::ensureDim (v, stream.n ());
 	VectorWrapper::ensureDim (w, stream.n ());
@@ -100,7 +101,7 @@ static bool testIdentityApply (Field &F, VectorStream<Vector> &stream)
 	while (stream) {
 		commentator().startIteration ((unsigned)i);
 
-		iter_passed = true;
+		bool iter_passed = true;
 
 		stream.next (v);
 
@@ -149,7 +150,7 @@ static bool testIdentityApply (Field &F, VectorStream<Vector> &stream)
 template <class Field, class Vector>
 static bool testRandomMinpoly (Field &F, VectorStream<Vector> &stream)
 {
-	typedef vector <typename Field::Element> Polynomial;
+	typedef BlasVector<Field> Polynomial;
 	typedef LinBox::Diagonal <Field> Blackbox;
 
 	commentator().start ("Testing random minpoly", "testRandomMinpoly", stream.m ());
@@ -158,17 +159,17 @@ static bool testRandomMinpoly (Field &F, VectorStream<Vector> &stream)
 
 	size_t j;
 	typename Field::Element pi;
-	Polynomial m_D;
+	Polynomial m_D(F);
 	VectorDomain<Field> VD (F);
 
-	Vector d;
+	Vector d(F);
 
 	VectorWrapper::ensureDim (d, stream.n ());
 
 	while (stream) {
 		commentator().startIteration ((unsigned)stream.j ());
 
-		F.init (pi, 1);
+		F.assign(pi, F.one);
 
 		stream.next (d);
 
@@ -184,7 +185,7 @@ static bool testRandomMinpoly (Field &F, VectorStream<Vector> &stream)
 		F.write (report, pi);
 		report << endl;
 
-		Blackbox D (F, d);
+		Blackbox D (d);
 		minpoly (m_D, D);
 
 		report << "Minimal polynomial: ";
@@ -231,7 +232,7 @@ static bool testRandomMinpoly (Field &F, VectorStream<Vector> &stream)
 
 template <class Field, class Vector>
 static bool testRandomLinearity (Field &F,
-				 VectorStream<std::vector<typename Field::Element> > &d_stream,
+				 VectorStream<BlasVector<Field> > &d_stream,
 				 VectorStream<Vector> &stream1,
 				 VectorStream<Vector> &stream2)
 {
@@ -241,18 +242,18 @@ static bool testRandomLinearity (Field &F,
 
 	VectorDomain<Field> VD (F);
 
-	std::vector<typename Field::Element> d;
+	BlasVector<Field> d(F);
 	VectorWrapper::ensureDim (d, stream1.n ());
 
 	d_stream.next (d);
-	Blackbox D (F, d);
+	Blackbox D (d);
 
 	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
 
 	report << "Diagonal vector: ";
 	VD.write (report, d) << endl;
 
-	bool ret = testLinearity (F, D, stream1, stream2);
+	bool ret = testLinearity (D, stream1, stream2);
 
 	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testRandomLinearity");
 
@@ -273,7 +274,7 @@ static bool testRandomLinearity (Field &F,
 
 template <class Field, class Vector>
 static bool testRandomTranspose (Field &F,
-				 VectorStream<std::vector<typename Field::Element> > &d_stream,
+				 VectorStream<BlasVector<Field> > &d_stream,
 				 VectorStream<Vector> &stream1,
 				 VectorStream<Vector> &stream2)
 {
@@ -283,11 +284,11 @@ static bool testRandomTranspose (Field &F,
 
 	VectorDomain<Field> VD (F);
 
-	std::vector<typename Field::Element> d;
+	BlasVector<Field> d(F);
 	VectorWrapper::ensureDim (d, stream1.n ());
 
 	d_stream.next (d);
-	Blackbox D (F, d);
+	Blackbox D (d);
 
 	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
 
@@ -300,13 +301,14 @@ static bool testRandomTranspose (Field &F,
 
 	return ret;
 }
+#endif
 
 int main (int argc, char **argv)
 {
 	bool pass = true;
 
 	static size_t n = 10;
-	static integer q = 2147483647U;
+	static integer q = 65521U;
 	static int iterations = 2; // was 100
 
 	static Argument args[] = {
@@ -316,8 +318,8 @@ int main (int argc, char **argv)
 		END_OF_ARGUMENTS
 	};
 
-	typedef Modular<uint32_t> Field; //C.Pernet: avoids confusion with givaro::uint32_t
-	typedef vector<Field::Element> Vector;
+	typedef Givaro::Modular<uint32_t> Field; //C.Pernet: avoids confusion with givaro::uint32_t
+//	typedef BlasVector<Field> Vector;
 
 	parseArguments (argc, argv, args);
 	Field F (q);
@@ -330,17 +332,20 @@ int main (int argc, char **argv)
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
 
-	RandomDenseStream<Field, Vector> stream1 (F, n, iterations), stream2 (F, n, iterations), d_stream (F, n, 1);
-	RandomDenseStream<Field, Vector, NonzeroRandIter<Field> >
-		stream3 (F, NonzeroRandIter<Field> (F, Field::RandIter (F)), n, iterations);
+#if 0
+    Field::RandIter gen(F);
+	RandomDenseStream<Field, Vector> stream1 (F, gen, n, (unsigned int)iterations), stream2 (F, gen, n, (unsigned int)iterations), d_stream (F, gen, n, 1);
+	RandomDenseStream<Field, Vector, Givaro::GeneralRingNonZeroRandIter<Field> >
+		stream3 (F, Givaro::GeneralRingNonZeroRandIter<Field> (Field::RandIter (F)), n, (unsigned int)iterations);
 
 	if (!testIdentityApply    (F, stream1)) pass = false;
 	if (!testRandomMinpoly    (F, stream3)) pass = false;
 	if (!testRandomLinearity  (F, d_stream, stream1, stream2)) pass = false;
 	if (!testRandomTranspose  (F, d_stream, stream1, stream2)) pass = false;
+#endif
 
         Field::RandIter iter(F);
-	LinBox::Diagonal<Field> D(F, 10, iter);
+	LinBox::Diagonal<Field> D(F, n, iter);
 	pass = pass && testBlackbox(D);
 
 	commentator().stop (MSG_STATUS (pass));
@@ -348,11 +353,10 @@ int main (int argc, char **argv)
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-dif.C b/tests/test-dif.C
index 7768f4c..c8d2fdc 100644
--- a/tests/test-dif.C
+++ b/tests/test-dif.C
@@ -6,20 +6,20 @@
  * It will be desirable to keep test-sum and test-dif in sync.
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -40,12 +40,12 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
+
 
 #include "linbox/util/commentator.h"
 #include "linbox/vector/stream.h"
 #include "linbox/field/archetype.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 #include "linbox/vector/vector-domain.h"
 #include "linbox/blackbox/diagonal.h"
 #include "linbox/blackbox/dif.h"
@@ -75,9 +75,9 @@ static bool testZeroApply (Field &F, VectorStream<Vector> &stream1, VectorStream
 	commentator().start ("Testing zero apply", "testZeroApply", stream1.m ());
 
 	bool ret = true;
-	bool iter_passed = true;
+	// bool iter_passed = true;
 
-	Vector d1, d2, v, w, zero;
+	Vector d1(F), d2(F), v(F), w(F), zero(F);
 	VectorDomain<Field> VD (F);
 
 	VectorWrapper::ensureDim (zero, stream1.dim ());
@@ -85,16 +85,15 @@ static bool testZeroApply (Field &F, VectorStream<Vector> &stream1, VectorStream
 	VectorWrapper::ensureDim (d2, stream1.dim ());
 	VectorWrapper::ensureDim (v, stream1.dim ());
 	VectorWrapper::ensureDim (w, stream2.dim ());
-	//F.init (neg_one, -1);
 
 	while (stream1) {
 		commentator().startIteration ((unsigned)stream1.j ());
-		iter_passed = true;
+		bool iter_passed = true;
 
 		stream1.next (d1);
 		//VD.mul (d2, d1, neg_one);
 
-		Blackbox D1 (F, d1); // , D2 (F, d2);
+		Blackbox D1 (d1); // , D2 (d2);
 		Dif <Blackbox, Blackbox> A (D1, D1);
 
 		ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
@@ -199,7 +198,7 @@ int main (int argc, char **argv)
 		END_OF_ARGUMENTS
 	};
 
-	typedef Modular<int32_t> Field;
+	typedef Givaro::Modular<int32_t> Field;
 
 	parseArguments (argc, argv, args);
 	Field F (101);
@@ -209,7 +208,9 @@ int main (int argc, char **argv)
 	// Make sure some more detailed messages get printed
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
 
-	RandomDenseStream<Field> stream1 (F, n, iterations1), stream2 (F, n, iterations2);
+    Field::RandIter gen(F);
+    
+	RandomDenseStream<Field> stream1 (F, gen, n, (unsigned int)iterations1), stream2 (F, gen, n, (unsigned int)iterations2);
 
 	if (!testZeroApply (F, stream1, stream2)) pass = false;
 
@@ -217,11 +218,10 @@ int main (int argc, char **argv)
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-direct-sum.C b/tests/test-direct-sum.C
index 0eb4dfc..11bcc91 100644
--- a/tests/test-direct-sum.C
+++ b/tests/test-direct-sum.C
@@ -2,20 +2,20 @@
  * Copyright (C) LinBox
  * Written by David Saunders
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -34,10 +34,10 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
+
 
 #include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 #include "linbox/blackbox/scalar-matrix.h"
 #include "linbox/blackbox/direct-sum.h"
 
@@ -62,8 +62,8 @@ int main (int argc, char **argv)
 		END_OF_ARGUMENTS
 	};
 
-	typedef Modular<uint32_t> Field;
-	typedef vector<Field::Element> Vector;
+	typedef Givaro::Modular<uint32_t> Field;
+	// typedef vector<Field::Element> Vector;
 
 	parseArguments (argc, argv, args);
 	Field F (q);
@@ -74,14 +74,14 @@ int main (int argc, char **argv)
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
 
 	F.init(k, 5);
-	ScalarMatrix<Field> B(F, 10, k);
+	ScalarMatrix<Field> B(F, 10, 10, k);
 	F.init(k, 2);
-	ScalarMatrix<Field> C(F, 5, k);
+	ScalarMatrix<Field> C(F, 5, 5, k);
 
 	DirectSum<ScalarMatrix<Field>, ScalarMatrix<Field> > A(&B, &C);
-	pass = pass && testBlackbox(A);
+	pass = pass && testBlackboxNoRW(A);
 	DirectSum<ScalarMatrix<Field>, ScalarMatrix<Field> > D(B, C);
-	pass = pass && testBlackbox(D);
+	pass = pass && testBlackboxNoRW(D);
 
 	commentator().stop("DirectSum black box test suite");
 	return pass ? 0 : -1;
diff --git a/tests/test-dyadic-to-rational.C b/tests/test-dyadic-to-rational.C
index 873573e..525977c 100644
--- a/tests/test-dyadic-to-rational.C
+++ b/tests/test-dyadic-to-rational.C
@@ -31,9 +31,9 @@
 
 using namespace LinBox;
 
-#include <vector>
+
 #include <cmath>
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
 #include "linbox/util/timer.h"
 #include "linbox/util/commentator.h"
 
@@ -45,7 +45,8 @@ by something over dxa and when the denominator bound (for k) is denBs.
 Values of numerator i from -k-2 to k+2 are checked.
 When dxa^2 <= denBs, 2 should be returned.
 */
-	typedef PID_integer Ring; Ring Z;
+	typedef Givaro::ZRing<Integer> Ring;
+	Ring Z;
 	typedef Ring::Element Int;
 
 //std::cout << "test1(k " << k << ", dxa " << dxa << ", denBs " << denBs << ")" << std::endl;
@@ -54,33 +55,33 @@ When dxa^2 <= denBs, 2 should be returned.
 	// approximate(i*k^2)/k for i = 0..k-1
 	size_t kp = k+2;
 	size_t kp2 = 2*kp;
-	std::vector<Int> nx(kp2);
+	BlasVector<Ring> nx(Z,kp2);
 	for (size_t i = 0; i < kp2 ; ++i)
 		Z.init(nx[i],floor(((double(i)-double(kp))*(double)dxa)/(double)k + 0.5));
 	// |nx[i]/dxa - (i-kp)/k| <= 1/2dxa
-	std::vector<Int> n(kp2);
+	BlasVector<Ring> n(Z,kp2);
 	Int d;
-	bool pass = true;
+	// bool pass = true;
 	bool claim;
 	int ret = 2;
 
 	// check of individual reconstructions
-	Int dx; Z.init(dx, dxa);
+	Int dx; Z.init(dx, uint64_t(dxa));
 	int c;
 	// individual reconstructions
 	for (size_t i = 0; i < kp2 ; ++i) {
-	    bool loopclaim = true;
+	    // bool loopclaim = true;
 //std::cout << nx[i] << " " << dx << " " << denB << std::endl;
 		c = dyadicToRational(Z, n[i], d, nx[i], dx, denB);
 //std::cout << " c " << c << " n " << n[i] << " d " << d << " nx " << nx[i] << " dx " << dx << " denB " << denB << std::endl;
-		loopclaim = ((c > 0)  && (n[i]*k == ((int(i)-int(kp))*d)));
+		bool loopclaim = ((c > 0)  && (n[i]*k == ((int(i)-int(kp))*d)));
 		if ( c == 2 ) loopclaim = loopclaim && d*denB < dx;
 		if (c < ret) ret = c;
 		if (! loopclaim) ret = 0;
 //if (! claim) std::cout << "F " << pass << claim << ret << std::endl;
 		//if (! loopclaim)
 //std::cout << "F2 " << loopclaim << " i " << i << " nx/dx " << nx[i] << "/" << dx << ", n/d " << n[i] << "/" << d << std::endl;
-		pass = pass && loopclaim;
+		// pass = pass && loopclaim;
 	}
 //std::cout << "result, pass " << pass << " ret " << ret << std::endl;
 
@@ -92,7 +93,7 @@ When dxa^2 <= denBs, 2 should be returned.
 	if (claim) {
 		for (size_t i = 0; i < k ; ++i) claim = claim && (n[i] == (int(i)-int(kp)));
 	}
-	pass = pass && claim;
+	// pass = pass && claim;
 	if (!claim) {
 		commentator().report() << "first example fails" << std::endl;
 		commentator().report() << "data for first example" << std::endl;
@@ -107,7 +108,7 @@ When dxa^2 <= denBs, 2 should be returned.
 
 	if (c < ret) ret = c;
 	if (! claim) ret = 0;
-	pass = pass && claim;
+	// pass = pass && claim;
 //std::cout << "v " << pass << claim << ret << std::endl;
 #endif
 
@@ -117,10 +118,11 @@ When dxa^2 <= denBs, 2 should be returned.
 
 bool testDyadicToRational(size_t k = 10, bool benchmarking = false)
 {
-	typedef PID_integer Ring; Ring Z;
+	typedef Givaro::ZRing<Integer> Ring;
+	Ring Z;
 	typedef Ring::Element Int;
 	bool pass = true;
-	bool claim = false;
+	int claim = 1 ; /* a bool produces warnings and looks weird when compared to 2 */
 	size_t pow2 = 1; // upperbound for k.
 	for (size_t i = k; i > 0; i >>= 1) pow2 *= 2;
 
@@ -141,15 +143,15 @@ bool testDyadicToRational(size_t k = 10, bool benchmarking = false)
 
 #if 1
 // special case 1
-	Int B; Z.init(B, 1000000000);
+	Int B; Z.init(B, int64_t(1000000000));
 	Int B2; Z.init(B2); B2 = B*B;
 	Int denB = 4*B+294967296; // 2^32
 
 	Int d;
 	Int dxs = denB*denB; // 2^64
 	size_t k2 = 10;
-	std::vector<Int> nx;
-	std::vector<Int> n;
+	BlasVector<Ring> nx(Z);
+	BlasVector<Ring> n(Z);
 	nx.resize(k2);
 	n.resize(k2);
 
@@ -170,7 +172,7 @@ bool testDyadicToRational(size_t k = 10, bool benchmarking = false)
 
 	pass = pass && claim;
 
-	std::vector<Int> ntrue(k2);
+	BlasVector<Ring> ntrue(Z,k2);
 	Int dentrue = 691617936;
     ntrue[0] = -5*B-372642434;
 	ntrue[1] =  8*B+965263534;
@@ -224,7 +226,7 @@ bool testDyadicToRational(size_t k = 10, bool benchmarking = false)
 	claim = dyadicToRational(Z, n, d, nx, dxs, denB);
 //std::cout << "d " << d << " dxs " << dxs << " denB " << denB << std::endl;
 
-    pass = pass && (claim < 2);
+    pass = pass  && (claim < 2)   ;
 	if (claim == 2) commentator().report() << "third ratrecon in test falsely claims success" << std::endl;
 	if (claim == 1) commentator().report() << "third ratrecon in test (designed to fail) claims speculative success" << std::endl;
 #endif
@@ -281,11 +283,10 @@ int main (int argc, char **argv)
 
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-echelon-form.C b/tests/test-echelon-form.C
index e43c3b6..14c42df 100644
--- a/tests/test-echelon-form.C
+++ b/tests/test-echelon-form.C
@@ -1,7 +1,7 @@
 /* Copyright (C) 2012 bds
  * tests/test-echelon-form.C
  *
- * adapted by bds from test-blas-domain Written by Pascal Giorgi <pascal.giorgi at ens-lyon.fr>
+ * Adapted by bds from test-blas-domain written by Pascal Giorgi 
  *
  * ---------------------------------------------------------
  *
@@ -36,21 +36,19 @@
  */
 
 
- // where is this used?
-//#define __MINP_CONSTRUCT
+#include "linbox/linbox-config.h"
+#include "test-common.h"
 #include <iostream>
 #include <string>
-#include <vector>
 
-//#include "linbox/linbox-config.h"
-#include "test-common.h"
 
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 //#include "linbox/field/givaro.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
 #include "linbox/util/commentator.h"
-#include "linbox/algorithms/blas-domain.h"
+#include "linbox/matrix/matrix-domain.h"
 #include "linbox/algorithms/echelon-form.h"
+#include "givaro/givranditer.h"
 
 using namespace LinBox;
 
@@ -79,23 +77,22 @@ static bool testRank (const Field& F, size_t m, size_t n, int iterations = 1)
 {
 
 	typedef typename Field::Element Element;
-	typedef typename Field::RandIter RandIter;
 
 	//Commentator mycommentator;
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	mycommentator().start (pretty("Testing rank"),"testRank",iterations);
+	mycommentator().start (pretty("Testing rank"),"testRank",(unsigned int)iterations);
 
-	RandIter G(F);
-	NonzeroRandIter<Field> Gn(F,G);
+	typename Field::RandIter G(F);
+	typename Field::NonZeroRandIter Gn(G);
 	Element tmp;
-	unsigned int r;
 	bool ret = true;
 	BlasMatrixDomain<Field> BMD(F);
 	EchelonFormDomain<Field> EFD(F);
 
 	for (int k=0;k<iterations; ++k) {
 
+	unsigned int r;
 		mycommentator().progress(k);
 		BlasMatrix<Field> A(F,m,n),S(F,m,n), L(F,m,m);
 
@@ -124,22 +121,22 @@ static bool testRank (const Field& F, size_t m, size_t n, int iterations = 1)
 
 		// compute the rank of A
 		BlasMatrix<Field> E1(F,m,n), E2(F,m,n), E3(F,m,n), E4(F,m,n);
-		unsigned int rank1= EFD.rowEchelon(E1, A);
+		unsigned int rank1= (unsigned int)EFD.rowEchelon(E1, A);
                 BMD.write(commentator().report(), E1) << " = rowEchelon(E1, A)" << std::endl;
 
-		unsigned int rank2= EFD.rowReducedEchelon(E2, A);
+		unsigned int rank2=(unsigned int) EFD.rowReducedEchelon(E2, A);
                 BMD.write(commentator().report(), E2) << " = rowReducedEchelon(E2, A)" << std::endl;
 
-		unsigned int rank3= EFD.columnEchelon(E3, A);
+		unsigned int rank3=(unsigned int) EFD.columnEchelon(E3, A);
                 BMD.write(commentator().report(), E3) << " = columnEchelon(E3, A)" << std::endl;
 
-		unsigned int rank4= EFD.columnReducedEchelon(E4, A);
+		unsigned int rank4=(unsigned int) EFD.columnReducedEchelon(E4, A);
                 BMD.write(commentator().report(), E4) << " = columnReducedEchelon(E4, A)" << std::endl;
 
-		unsigned int rank5= EFD.columnEchelon(A);
+		unsigned int rank5=(unsigned int) EFD.columnEchelon(A);
                 BMD.write(commentator().report(), A) << " = columnEchelon(A)" << std::endl;
 
-		unsigned int rank6= EFD.columnReducedEchelon(E1);
+		unsigned int rank6=(unsigned int) EFD.columnReducedEchelon(E1);
                 BMD.write(commentator().report(), E1) << " = columnReducedEchelon(E1)" << std::endl;
 
 		commentator().report() << "Ranks " << rank1 << " " << rank2 << " " << rank3 << " " << rank4 << " " << rank5 << " " << rank6 << " should be " << r << std::endl;
@@ -163,21 +160,20 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations = 1)
 	typedef typename Field::Element                  Element;
 	typedef BlasMatrix<Field>                       Matrix;
 	typedef typename Field::RandIter                RandIter;
+	typedef typename Field::NonZeroRandIter         NonZeroRandIter;
 
 	//Commentator mycommentator;
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	mycommentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	mycommentator().start (pretty("Testing LQUP factorization"),"testLQUP",iterations);
+	mycommentator().start (pretty("Testing LQUP factorization"),"testLQUP",(unsigned int)iterations);
 
 	RandIter G(F);
-	NonzeroRandIter<Field> Gn(F,G);
-	Element One,zero,tmp;
-	F.init(One,1UL);
-	F.init(zero,0UL);
+	NonZeroRandIter Gn(G);
 
 	bool ret = true;
 	MatrixDomain<Field> MD(F);
 	BlasMatrixDomain<Field> BMD(F);
+	Element tmp; F.init(tmp);
 
 	for (int k=0;k<iterations;++k) {
 
@@ -193,7 +189,7 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations = 1)
 				  B.setEntry(i,j,G.random(tmp));
 			else
 			  for (size_t i=0;i<m;++i)
-			    B.setEntry(i,j,zero);
+			    B.setEntry(i,j,F.zero);
 		// Create C a random matrix of rank n/2
 		for (size_t i=0;i<m;++i)
 			if ( i % 2 )
@@ -201,7 +197,7 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations = 1)
 					C.setEntry(i,j,G.random(tmp));
 			else
 				for (size_t j=0;j<n;++j)
-					C.setEntry(i,j,zero);
+					C.setEntry(i,j,F.zero);
 
 		// A = B*C
 		BMD.mul(A, B, C);
@@ -211,8 +207,8 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations = 1)
 		BlasPermutation<size_t>  P(A.coldim()),Q(A.rowdim());
 		LQUPMatrix<Field> X(A,P,Q);
 
-		TriangularBlasMatrix<Field> L(F,m,m,LinBoxTag::Lower,LinBoxTag::Unit);
-		TriangularBlasMatrix<Field> U(F,m,n,LinBoxTag::Upper,LinBoxTag::NonUnit);
+		TriangularBlasMatrix<Field> L(F,m,m,Tag::Shape::Lower,Tag::Diag::Unit);
+		TriangularBlasMatrix<Field> U(F,m,n,Tag::Shape::Upper,Tag::Diag::NonUnit);
 		X.getL(L);
 		X.getU(U);
 		P=X.getP();
@@ -237,8 +233,8 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations = 1)
 
 		LQUPMatrix<Field> Y(A,P,Q);
 
-		TriangularBlasMatrix<Field> L2(F,m,m,LinBoxTag::Lower,LinBoxTag::Unit);
-		TriangularBlasMatrix<Field> U2(F,m,n,LinBoxTag::Upper,LinBoxTag::NonUnit);
+		TriangularBlasMatrix<Field> L2(F,m,m,Tag::Shape::Lower,Tag::Diag::Unit);
+		TriangularBlasMatrix<Field> U2(F,m,n,Tag::Shape::Upper,Tag::Diag::NonUnit);
 		Y.getL(L2);
 		Y.getU(U2);
 		P=Y.getP();
@@ -263,10 +259,10 @@ static bool testLQUP (const Field& F, size_t m, size_t n, int iterations = 1)
 
 // returns true if ok, false if not.
 template<class Field>
-int launch_tests(Field & F, int m, int n, int iterations = 1)
+int launch_tests(Field & F, size_t m, size_t n, int iterations = 1)
 {
 	bool pass = true ;
-	int mn = (m < n) ? n : m;
+	size_t mn = (m < n) ? n : m;
  	if (!testRank (F, mn, mn, iterations))     pass=false;
 	if (m != n) {
  		if (!testRank (F, n, m, iterations))   pass=false;
@@ -295,9 +291,9 @@ int main(int argc, char **argv)
 
 	parseArguments (argc, argv, args);
 
-	typedef Modular<double> Field;
-	//typedef Modular<int> Field;
-	//typedef Modular<float> Field;
+	typedef Givaro::Modular<double> Field;
+	//typedef Givaro::Modular<int> Field;
+	//typedef Givaro::Modular<float> Field;
 
 	Field F1 (q);
 	bool pass = true;
@@ -310,7 +306,7 @@ int main(int argc, char **argv)
 
 	commentator().start("BlasMatrixDomain test suite", "BlasMatrixDomain");
 
-	pass &= launch_tests(F1,(int)m, (int)n,iterations);
+	pass &= launch_tests(F1,m, n, iterations);
 	commentator().stop(MSG_STATUS (pass), (const char *) 0,"BlasMatrixDomain test suite");
 	return pass ? 0 : -1;
 }
diff --git a/tests/test-ffpack.C b/tests/test-ffpack.C
index b04e46d..2f60a5e 100644
--- a/tests/test-ffpack.C
+++ b/tests/test-ffpack.C
@@ -34,13 +34,13 @@
 #include "linbox/linbox-config.h"
 
 #include <iostream>
-#include <vector>
+
 
 #include "linbox/integer.h"
 #include "linbox/matrix/matrix-domain.h"
-#include "linbox/field/givaro.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/modular-balanced.h"
+//#include "linbox/field/givaro.h"
+#include "linbox/ring/modular.h"
+#include <givaro/modular-balanced.h>
 #include "fflas-ffpack/ffpack/ffpack.h"
 #include "linbox/util/commentator.h"
 
@@ -74,40 +74,38 @@ static bool testRank (const Field& F,size_t n, int iterations)
 
 	typedef typename Field::Element Element;
 	typedef typename Field::RandIter RandIter;
+	typedef typename Field::NonZeroRandIter NonZeroRandIter;
 
 	//Commentator commentator;
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	commentator().start (pretty("Testing rank"),"testRank",iterations);
+	commentator().start (pretty("Testing rank"),"testRank",(unsigned int)iterations);
 
-	Element one, zero;
-	F.init( one, 1UL);
-	F.init( zero, 0UL);
 	RandIter G(F);
-	NonzeroRandIter<Field> Gn(F,G);
+	NonZeroRandIter Gn(G);
 
-	unsigned int r;
 	bool ret = true;
 
 	for (int k=0;k<iterations; ++k) {
+		unsigned int r;
 
 		commentator().progress(k);
 		Element * A = new Element[n*n];
 		Element * S = new Element[n*n];
 		Element * L = new Element[n*n];
 
-		r = (unsigned)( rand() % n );
+		r = (unsigned)( (size_t)rand() % n );
 		// create S as an upper triangular matrix with r nonzero rows
 		for (size_t i=0;i<r;++i){
 			for (size_t j=0;j<i;++j)
-				F.assign(*(S+j+i*n),zero);
+				F.assign(*(S+j+i*n),F.zero);
 			Gn.random(*(S+i*n+i));
 			for (size_t j=i+1;j<n;++j)
 				G.random(*(S+i*n+j));
 		}
 		for (size_t i=r;i<n;++i){
 			for (size_t j=0;j<n;++j)
-				F.assign(*(S+j+i*n),zero);
+				F.assign(*(S+j+i*n),F.zero);
 		}
 		// create L as a lower triangular matrix with nonzero elements on the diagonal
 		for (size_t i=0;i<n;++i){
@@ -115,13 +113,13 @@ static bool testRank (const Field& F,size_t n, int iterations)
 				G.random(*(L+i*n+j));
 			Gn.random(*(L+i*n+i));
 			for (size_t j=i+1;j<n;++j)
-				F.assign(*(L+j+i*n),zero);
+				F.assign(*(L+j+i*n),F.zero);
 
 		}
 
 		//  compute A=LS
 		FFLAS::fgemm( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, n, n, n,
-			      one, L, n, S, n, zero, A, n );
+			      F.one, L, n, S, n, F.zero, A, n );
 		delete[] L;
 		delete[] S;
 
@@ -137,87 +135,6 @@ static bool testRank (const Field& F,size_t n, int iterations)
 	return ret;
 }
 
-/*
- *  Testing the rank of dense matrices using TURBO algorithm
- *  construct a n*n matrices of rank r and compute the rank
- */
-template <class Field>
-static bool testTURBO (const Field& F,size_t n, int iterations)
-{
-
-	typedef typename Field::Element Element;
-	typedef typename Field::RandIter RandIter;
-
-	//Commentator commentator;
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	commentator().start (pretty("Testing TURBO"),"testTURBO",iterations);
-
-	Element one, zero;
-	F.init( one, 1UL);
-	F.init( zero, 0UL);
-	RandIter G(F);
-	NonzeroRandIter<Field> Gn(F,G);
-
-	unsigned int r;
-	bool ret = true;
-
-	for (int k=0;k<iterations; ++k) {
-
-		commentator().progress(k);
-		Element * A = new Element[n*n];
-		Element * S = new Element[n*n];
-		Element * L = new Element[n*n];
-
-		r = (unsigned)(rand() % n);
-		// create S as an upper triangular matrix with r nonzero rows
-		for (size_t i=0;i<r;++i){
-			for (size_t j=0;j<i;++j)
-				F.assign(*(S+j+i*n),zero);
-			Gn.random(*(S+i*n+i));
-			for (size_t j=i+1;j<n;++j)
-				G.random(*(S+i*n+j));
-		}
-		for (size_t i=r; i<n; ++i)
-			for (size_t j=0;j<n;++j)
-				F.assign( *(S+i*n+j),zero);
-		// create L as a lower triangular matrix with nonzero elements on the diagonal
-		for (size_t i=0;i<n;++i){
-			for (size_t j=0;j<i;++j)
-				G.random(*(L+i*n+j));
-			Gn.random(*(L+i*n+i));
-			for (size_t j=i+1;j<n;++j)
-				F.assign(*(L+j+i*n),zero);
-		}
-
-
-		//  compute A=LS
-		FFLAS::fgemm( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, n, n, n,
-			      one, L, n, S, n, zero, A, n );
-
-		delete[] L;
-		delete[] S;
-		// compute the rank of A
-		size_t * P = new size_t[n];
-		size_t * Q = new size_t[n];
-		unsigned int rank= (unsigned)FFPACK::TURBO( F, n, n,
-						  A,n, P, Q, 100);
-// 						  A, n, A+no2,n,
-// 						    A+no2*n, n, A+no2*(n+1), n );
-
-		delete[] P;
-		delete[] Q;
-		delete[] A;
-
-		if (rank!=r)
-			ret=false;
-	}
-
-	commentator().stop(MSG_STATUS (ret), (const char *) 0, "testTURBO");
-
-	return ret;
-}
-
 
 /*
  *  Testing the determinant of dense matrices using BlasDomain
@@ -229,17 +146,16 @@ static bool testDet (const Field& F,size_t n, int iterations)
 
 	typedef typename Field::Element Element;
 	typedef typename Field::RandIter RandIter;
+	typedef typename Field::NonZeroRandIter NonZeroRandIter;
 
 	//Commentator commentator;
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	commentator().start (pretty("Testing determinant"),"testDet",iterations);
+	commentator().start (pretty("Testing determinant"),"testDet",(unsigned int)iterations);
 
+	Element d;
 	RandIter G(F);
-	NonzeroRandIter<Field> Gn(F,G);
-	Element one,zero,d;
-	F.init(one,1UL);
-	F.init(zero,0UL);
+	NonZeroRandIter Gn(G);
 
 	bool ret = true;
 
@@ -259,8 +175,8 @@ static bool testDet (const Field& F,size_t n, int iterations)
 		// with diagonal's element equal to 1 except the first entry wich equals to d
 		for (size_t i=0;i<n;++i){
 			for (size_t j=0;j<i;++j)
-				F.assign(*(S+j+i*n),zero);
-			F.assign(*(S+i*n+i), one);
+				F.assign(*(S+j+i*n),F.zero);
+			F.assign(*(S+i*n+i), F.one);
 			for (size_t j=i+1;j<n;++j)
 				G.random(*(S+i*n+j));
 		}
@@ -270,15 +186,15 @@ static bool testDet (const Field& F,size_t n, int iterations)
 		for (size_t i=0;i<n;++i){
 			for (size_t j=0;j<i;++j)
 				G.random(*(L+i*n+j));
-			F.assign(*(L+i*n+i),one);
+			F.assign(*(L+i*n+i),F.one);
 			for (size_t j=i+1;j<n;++j)
-				F.assign(*(L+j+i*n),zero);
+				F.assign(*(L+j+i*n),F.zero);
 		}
 
 
 		//  compute A=LS
 		FFLAS::fgemm( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, n, n, n,
-			      one, L, n, S, n, zero, A, n );
+			      F.one, L, n, S, n, F.zero, A, n );
 		delete[] L;
 		delete[] S;
 
@@ -306,17 +222,15 @@ static bool testLUdivine (const Field& F, size_t m, size_t n, int iterations)
 
 	typedef typename Field::Element                  Element;
 	typedef typename Field::RandIter                RandIter;
+	typedef typename Field::NonZeroRandIter                NonZeroRandIter;
 
 	//Commentator commentator;
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	commentator().start (pretty("Testing LQUP factorization"),"testLQUP",iterations);
+	commentator().start (pretty("Testing LQUP factorization"),"testLQUP",(unsigned int)iterations);
 
 	RandIter G(F);
-	NonzeroRandIter<Field> Gn(F,G);
-	Element one,zero;
-	F.init(one,1UL);
-	F.init(zero,0UL);
+	NonZeroRandIter Gn(G);
 
 	bool ret = true;
 
@@ -334,28 +248,28 @@ static bool testLUdivine (const Field& F, size_t m, size_t n, int iterations)
 		for (size_t j=0;j<m;++j)
 			if ( j % 2 ){
 				for (size_t i=0;i<j;++i)
-					F.assign (*(B+i*m+j),zero);
+					F.assign (*(B+i*m+j),F.zero);
 				for (size_t i=j;i<m;++i)
 					Gn.random (*(B+i*m+j));
 			}
 			else
 				for (size_t i=0;i<m;++i)
-					F.assign (*(B+i*m+j), zero);
+					F.assign (*(B+i*m+j), F.zero);
 		// Create C a random matrix of rank n/2
 		for (size_t i = 0; i < m; ++i)
 			if ( i % 2 ){
 				for (size_t j = 0; j < i; ++j)
-					F.assign (*(C+i*n+j),zero);
+					F.assign (*(C+i*n+j),F.zero);
 				for (size_t j = i; j < n; ++j)
 					Gn.random (*(C+i*n+j));
 			}
 			else
 				for (size_t j = 0; j < n; ++j)
-					F.assign (*(C+i*n+j),zero);
+					F.assign (*(C+i*n+j),F.zero);
 
 		// A = B*C
 		FFLAS::fgemm( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, m, n, m,
-			      one, B, m, C, n, zero, A, n );
+			      F.one, B, m, C, n, F.zero, A, n );
 		delete[] B;
 		delete[] C;
 
@@ -368,7 +282,8 @@ static bool testLUdivine (const Field& F, size_t m, size_t n, int iterations)
 
 // 		write_field (F, cerr<<"A="<<endl, A, m, n, n);
 		size_t r = FFPACK::LUdivine( F, FFLAS::FflasNonUnit, FFLAS::FflasNoTrans,
-					     m, n, A, n, P, Q, FFPACK::FfpackLQUP);
+					     m, n, A, n, P, Q);
+					     //m, n, A, n, P, Q, FFPACK::FfpackLQUP);
 // 		write_field (F, cerr<<"LQUP(A)="<<endl, A, m, n, n);
 
 		Element * L = new Element[m*m];
@@ -379,19 +294,19 @@ static bool testLUdivine (const Field& F, size_t m, size_t n, int iterations)
 				if (j<n)
 					F.assign (*(L+i*m+j), *(A+i*n+j) );
 				else
-					F.assign (*(L+i*m+j), zero );
+					F.assign (*(L+i*m+j), F.zero );
 
 			for (size_t j = i; j < m; ++j)
-				F.assign (*(L+i*m+j), zero );
+				F.assign (*(L+i*m+j), F.zero );
 		}
 		FFPACK::applyP( F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
 				m, 0,(int) r, L, m, Q);
 		for (size_t i=0; i<m; ++i)
-			F.assign( *(L+i*m+i), one);
+			F.assign( *(L+i*m+i), F.one);
 		for (size_t i=0; i<m; ++i){
 			for (size_t j=0; j<i; ++j)
 				if (j<n)
-					F.assign( *(U+i*n+j), zero );
+					F.assign( *(U+i*n+j), F.zero );
 			for (size_t j=i; j<n; ++j)
 				F.assign( *(U+i*n+j), *(A+i*n+j) );
 		}
@@ -410,7 +325,7 @@ static bool testLUdivine (const Field& F, size_t m, size_t n, int iterations)
 		delete[] Q;
 		// A = L*C
 		FFLAS::fgemm( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, m, n, m,
-			      one, L, m, U, n, zero, A, n );
+			      F.one, L, m, U, n, F.zero, A, n );
 		delete[] L;
 		delete[] U;
 
@@ -441,18 +356,15 @@ static bool testMinPoly (const Field& F, size_t n, int iterations)
 {
 	typedef typename Field::Element                  Element;
 	typedef typename Field::RandIter                RandIter;
+	typedef typename Field::NonZeroRandIter                NonZeroRandIter;
 	typedef vector<Element>                       Polynomial;
 	//Commentator commentator;
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	commentator().start (pretty("Testing minpoly"),"testMinPoly",iterations);
-	Element tmp, one, zero,mOne;
+	commentator().start (pretty("Testing minpoly"),"testMinPoly",(unsigned int)iterations);
+	Element tmp ;
 	RandIter G(F);
-	NonzeroRandIter<Field> Gn(F,G);
-	F.init(one, 1UL);
-	F.init(zero, 0UL);
-	F.neg(mOne, one);
-	//F.neg( mOne, one);
+	NonZeroRandIter Gn(G);
 	bool ret = true;
 
 	for (int k=0;k<iterations;++k) {
@@ -467,17 +379,17 @@ static bool testMinPoly (const Field& F, size_t n, int iterations)
 		// Test MinPoly(In) = X-1
 		for (size_t i=0;i<n;++i){
 			for (size_t j=0;j<n;++j)
-				F.assign(*(A+j+i*n),zero);
-			F.assign(*(A+i*(n+1)),one);
+				F.assign(*(A+j+i*n),F.zero);
+			F.assign(*(A+i*(n+1)),F.one);
 		}
 
-		FFPACK::MinPoly( F, P, n, A, n, X, n, Perm );
+		FFPACK::MinPoly(  F, P, n, A, n, X, n, Perm );
 
 		if ( P.size() !=2 )
 			ret = false;
-		if ( !F.areEqual(P[0], mOne) )
+		if ( !F.areEqual(P[0], F.mOne) )
 			ret = false;
-		if ( !F.areEqual(P[1], one) )
+		if ( !F.areEqual(P[1], F.one) )
 			ret = false;
 		if(!ret) cerr<<"MinP(In)!=X-1"<<endl;
 		// Test MinPoly(a*In) = X-a
@@ -485,7 +397,7 @@ static bool testMinPoly (const Field& F, size_t n, int iterations)
 
 		for (size_t i=0;i<n;++i){
 			for (size_t j=0;j<n;++j)
-				F.assign(*(A+j+i*n),zero);
+				F.assign(*(A+j+i*n),F.zero);
 
 			F.assign(*(A+i*(n+1)),tmp);
 		}
@@ -502,7 +414,7 @@ static bool testMinPoly (const Field& F, size_t n, int iterations)
 			cerr<<"P[0]="<<P[0]<<"tmp="<<tmp<<endl;
 			ret = false;
 		}
-		if ( !F.areEqual(P[1], one) ){
+		if ( !F.areEqual(P[1], F.one) ){
 			cerr<<"P[1]="<<P[1]<<endl;
 
 			ret = false;
@@ -512,11 +424,11 @@ static bool testMinPoly (const Field& F, size_t n, int iterations)
 #if 1 /*  ??? */
 		for (size_t i=0;i<n-1;++i){
 			for (size_t j=0; j<n; ++j)
-				F.assign(*(A+i*n+j),zero);
-			F.assign(*(A+i*n+i+1),one);
+				F.assign(*(A+i*n+j),F.zero);
+			F.assign(*(A+i*n+i+1),F.one);
 		}
 		for (size_t j=0;j<n;++j)
-			F.assign(*(A+(n-1)*n+j),zero);
+			F.assign(*(A+(n-1)*n+j),F.zero);
 
 		for (size_t i=0; i<n ;++i)
 			Perm[i]=0;
@@ -525,9 +437,9 @@ static bool testMinPoly (const Field& F, size_t n, int iterations)
 		if ( P.size() !=n+1 )
 			ret = false;
 		for (size_t i=0; i<n;++i)
-			if ( !F.areEqual(P[i], zero) )
+			if ( !F.areEqual(P[i], F.zero) )
 				ret = false;
-		if ( !F.areEqual(P[n], one) )
+		if ( !F.areEqual(P[n], F.one) )
 			ret = false;
 		if(!ret) cerr<<"MinP(J)!=X^n"<<endl;
 #endif
@@ -547,17 +459,15 @@ static bool testCharPoly (const Field& F, size_t n, int iterations)
 {
 	typedef typename Field::Element                  Element;
 	typedef typename Field::RandIter                RandIter;
+	typedef typename Field::NonZeroRandIter         NonZeroRandIter;
 	typedef vector<Element>                       Polynomial;
 	//Commentator commentator;
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	commentator().start (pretty("Testing charpoly"),"testCharPoly",iterations);
-	Element tmp, one, zero,mOne;
+	commentator().start (pretty("Testing charpoly"),"testCharPoly",(unsigned int)iterations);
+	Element tmp;
 	RandIter G(F);
-	NonzeroRandIter<Field> Gn(F,G);
-	F.init(one, 1UL);
-	F.init(zero, 0UL);
-	F.neg(mOne, one);
+	NonZeroRandIter Gn(G);
 	bool ret = true;
 
 	for (int k=0;k<iterations;++k) {
@@ -570,10 +480,10 @@ static bool testCharPoly (const Field& F, size_t n, int iterations)
 		// Test CharPoly(In) = (X-1)^n
 		for (size_t i=0;i<n;++i){
 			for (size_t j=0;j<i;++j)
-				F.assign(*(A+i*n+j),zero);
-			F.assign(*(A+i*(n+1)),one);
+				F.assign(*(A+i*n+j),F.zero);
+			F.assign(*(A+i*(n+1)),F.one);
 			for (size_t j=i+1;j<n;++j)
-				 F.assign(*(A+i*n+j),zero);
+				 F.assign(*(A+i*n+j),F.zero);
 		}
 		P.clear();
 
@@ -585,14 +495,14 @@ static bool testCharPoly (const Field& F, size_t n, int iterations)
 			if ( P_it->size() !=2 ){
 				ret = false;
 			}
-			if ( !F.areEqual(P_it->operator[](0), mOne) ){
+			if ( !F.areEqual(P_it->operator[](0), F.mOne) ){
 				ret = false;
 			}
-			if ( !F.areEqual(P_it->operator[](1), one) ){
+			if ( !F.areEqual(P_it->operator[](1), F.one) ){
 				ret = false;
 			}
 
-			P_it++;
+			++P_it;
 		}
 
 		// Test CharPoly(a*In) = X-a
@@ -612,9 +522,9 @@ static bool testCharPoly (const Field& F, size_t n, int iterations)
 				ret = false;
 			if ( !F.areEqual(P_it->operator[](0), tmp) )
 				ret = false;
-			if ( !F.areEqual(P_it->operator[](1), one) )
+			if ( !F.areEqual(P_it->operator[](1), F.one) )
 			ret = false;
-			P_it++;
+			++P_it;
 		}
 		delete[] A;
 	}
@@ -630,25 +540,23 @@ static bool testInv (const Field& F,size_t n, int iterations)
 
 	typedef typename Field::Element Element;
 	typedef typename Field::RandIter RandIter;
+	typedef typename Field::NonZeroRandIter NonZeroRandIter;
 
 	//Commentator commentator;
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	commentator().start (pretty("Testing inverse"),"testInv",iterations);
+	commentator().start (pretty("Testing inverse"),"testInv",(unsigned int)iterations);
 
 	RandIter G(F);
-	NonzeroRandIter<Field> Gn(F,G);
-	Element zero,one;
-	F.init(one,1UL);
-	F.init(zero,0UL);
+	NonZeroRandIter Gn(G);
 
 	bool ret = true;
 
 	Element * Id = new Element[n*n];
 	for (size_t i=0;i<n;++i){
 		for (size_t j=0;j<n;++j)
-			F.assign(*(Id+j+i*n),zero);
-		F.assign( *(Id+i*(n+1)),one);
+			F.assign(*(Id+j+i*n),F.zero);
+		F.assign( *(Id+i*(n+1)),F.one);
 	}
 	for (int k=0;k<iterations;++k) {
 
@@ -665,7 +573,7 @@ static bool testInv (const Field& F,size_t n, int iterations)
 		// with nonzero random diagonal's element
 		for (size_t i=0;i<n;++i){
 			for (size_t j=0;j<i;++j)
-				F.assign(*(S+i*n+j),zero);
+				F.assign(*(S+i*n+j),F.zero);
 			Gn.random(*(S+i*(n+1)));
 			for (size_t j=i+1;j<n;++j)
 				G.random(*(S+i*n+j));
@@ -676,16 +584,16 @@ static bool testInv (const Field& F,size_t n, int iterations)
 		for (size_t i=0;i<n;++i){
 			for (size_t j=0;j<i;++j)
 				G.random(*(L+i*n+j));
-			F.assign(*(L+i*(n+1)),one);
+			F.assign(*(L+i*(n+1)),F.one);
 			for (size_t j=i+1;j<n;++j)
-				F.assign(*(L+i*n+j),zero);
+				F.assign(*(L+i*n+j),F.zero);
 
 		}
 
 		//  compute A=LS
 
 		FFLAS::fgemm( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, n, n, n,
-			      one, L, n, S, n, zero, A, n );
+			      F.one, L, n, S, n, F.zero, A, n );
 
 		Element * Ab = new Element[n*n];
 		Element * invA = new Element[n*n];
@@ -698,10 +606,10 @@ static bool testInv (const Field& F,size_t n, int iterations)
 		// compute Ainv*A and A*Ainv
 
 		FFLAS::fgemm( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, n, n, n,
-			      one, Ab, n, invA, n, zero, L, n );
+			      F.one, Ab, n, invA, n, F.zero, L, n );
 
 		FFLAS::fgemm( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, n, n, n,
-			      one, invA, n, Ab, n, zero, S, n );
+			      F.one, invA, n, Ab, n, F.zero, S, n );
 
 		for (size_t i=0;i<n*n;++i)
 			if ( !F.areEqual(*(L+i),*(Id+i)) || !F.areEqual(*(S+i),*(Id+i)) )
@@ -734,16 +642,15 @@ static bool testapplyP (const Field& F,size_t n, int iterations)
 	//Commentator commentator;
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	commentator().start (pretty("Testing applyP"),"testapplyP",iterations);
+	commentator().start (pretty("Testing applyP"),"testapplyP",(unsigned int)iterations);
 
 	RandIter G(F);
-	Element zero,one,tmp,tmp2;
-	F.init(one,1UL);
-	F.init(zero,0UL);
+	Element tmp;
 
 	bool ret = true;
-	Field Z2(2);
-	RandIter G2(Z2);
+	Givaro::Modular<double> Z2(2);
+	typename Givaro::Modular<double>::RandIter G2(Z2);
+	Givaro::Modular<double>::Element tmp2;
 
 	for (int k=0;k<iterations;++k) {
 
@@ -823,9 +730,9 @@ int main(int argc, char** argv)
 	commentator().start("ffpack test suite", "ffpack");
 
 
-	/* Modular Double */
+	/* Givaro::Modular Double */
 	{
-		typedef Modular<double> Field;
+		typedef Givaro::Modular<double> Field;
 
 		Field F (q);
 		F.write(report << "Field : " ) << std::endl;
@@ -837,11 +744,10 @@ int main(int argc, char** argv)
 		if (!testLUdivine (F, m,n, iterations)) locpass = false;
 		if (!testRank (F, n, iterations))       locpass = false;
 		if (!testDet (F, n, iterations))        locpass = false;
-		if (!testTURBO (F, n, iterations))      locpass = false;
 		if (!testapplyP  (F, n, iterations))    locpass = false;
 		if (!testInv  (F, n, iterations))       locpass = false;
-		if (!testMinPoly (F,n,iterations))      locpass = false;
-		if (!testCharPoly (F,n,iterations))     locpass = false;
+		if (!testMinPoly (F,n, iterations))      locpass = false;
+		if (!testCharPoly (F,n, iterations))     locpass = false;
 
 		(!locpass)?(report << "FAIL" << std::endl):(report << "OK"<<std::endl);
 
@@ -849,9 +755,9 @@ int main(int argc, char** argv)
 	}
 
 #ifdef _LB_FULL_TEST
-	/* Modular Float */
+	/* Givaro::Modular Float */
 	{
-		typedef Modular<float> Field;
+		typedef Givaro::Modular<float> Field;
 
 		Field F (q);
 		F.write(report << "Field : " ) << std::endl;
@@ -863,19 +769,18 @@ int main(int argc, char** argv)
 		if (!testLUdivine (F, m,n, iterations)) locpass = false;
 		if (!testRank (F, n, iterations))       locpass = false;
 		if (!testDet (F, n, iterations))        locpass = false;
-		if (!testTURBO (F, n, iterations))      locpass = false;
 		if (!testapplyP  (F, n, iterations))    locpass = false;
 		if (!testInv  (F, n, iterations))       locpass = false;
-		if (!testMinPoly (F,n,iterations))      locpass = false;
-		if (!testCharPoly (F,n,iterations))     locpass = false;
+		if (!testMinPoly (F,n, iterations))      locpass = false;
+		if (!testCharPoly (F,n, iterations))     locpass = false;
 
 		(!locpass)?(report << "FAIL" << std::endl):(report << "OK"<<std::endl);
 		pass &= locpass ;
 	}
 
-	/* Modular Balanced Double */
+	/* Givaro::Modular Balanced Double */
 	{
-		typedef LinBox::ModularBalanced<double> Field;
+		typedef Givaro::ModularBalanced<double> Field;
 
 		Field F (q);
 		F.write(report << "Field : " ) << std::endl;
@@ -887,19 +792,18 @@ int main(int argc, char** argv)
 		if (!testLUdivine (F, m,n, iterations)) locpass = false;
 		if (!testRank (F, n, iterations))       locpass = false;
 		if (!testDet (F, n, iterations))        locpass = false;
-		if (!testTURBO (F, n, iterations))      locpass = false;
 		if (!testapplyP  (F, n, iterations))    locpass = false;
 		if (!testInv  (F, n, iterations))       locpass = false;
-		if (!testMinPoly (F,n,iterations))      locpass = false;
-		if (!testCharPoly (F,n,iterations))     locpass = false;
+		if (!testMinPoly (F,n, iterations))      locpass = false;
+		if (!testCharPoly (F,n, iterations))     locpass = false;
 
 		(!locpass)?(report << "FAIL" << std::endl):(report << "OK"<<std::endl);
 		pass &= locpass ;
 	}
 
-	/* Modular Balanced Float */
+	/* Givaro::Modular Balanced Float */
 	{
-		typedef ModularBalanced<float> Field;
+		typedef Givaro::ModularBalanced<float> Field;
 
 		Field F (q);
 		F.write(report << "Field : " ) << std::endl;
@@ -911,19 +815,17 @@ int main(int argc, char** argv)
 		if (!testLUdivine (F, m,n, iterations)) locpass = false;
 		if (!testRank (F, n, iterations))       locpass = false;
 		if (!testDet (F, n, iterations))        locpass = false;
-		if (!testTURBO (F, n, iterations))      locpass = false;
 		if (!testapplyP  (F, n, iterations))    locpass = false;
 		if (!testInv  (F, n, iterations))       locpass = false;
-		if (!testMinPoly (F,n,iterations))      locpass = false;
-		if (!testCharPoly (F,n,iterations))     locpass = false;
+		if (!testMinPoly (F,n, iterations))      locpass = false;
+		if (!testCharPoly (F,n, iterations))     locpass = false;
 
 		(!locpass)?(report << "FAIL" << std::endl):(report << "OK"<<std::endl);
 		pass &= locpass ;
 	}
-#pragma message "#warning some tests don't compile or fail"
-	/* Modular int32_t */
+	/* Givaro::Modular int32_t */
 	{
-		typedef Modular<int32_t> Field;
+		typedef Givaro::Modular<int32_t> Field;
 
 		Field F (q);
 		F.write(report << "Field : " ) << std::endl;
@@ -935,21 +837,19 @@ int main(int argc, char** argv)
 		if (!testLUdivine (F, m,n, iterations)) locpass = false;
 		if (!testRank (F, n, iterations))       locpass = false;
 		if (!testDet (F, n, iterations))        locpass = false;
-		if (!testTURBO (F, n, iterations))      locpass = false;
 		if (!testapplyP  (F, n, iterations))    locpass = false;
 		if (!testInv  (F, n, iterations))       locpass = false;
-		if (!testMinPoly (F,n,iterations))      locpass = false;
-		if (!testCharPoly (F,n,iterations))     locpass = false;
+		if (!testMinPoly (F,n, iterations))      locpass = false;
+		if (!testCharPoly (F,n, iterations))     locpass = false;
 
 		(!locpass)?(report << "FAIL" << std::endl):(report << "OK"<<std::endl);
 		pass &= locpass ;
 
 	}
 
-#if 0 // fails
-	/* Modular Balanced int32_t */
+	/* Givaro::Modular Balanced int32_t */
 	{
-		typedef ModularBalanced<int32_t > Field ;
+		typedef Givaro::ModularBalanced<int32_t > Field ;
 
 		Field F (q);
 		F.write(report << "Field : " ) << std::endl;
@@ -961,19 +861,17 @@ int main(int argc, char** argv)
 		if (!testLUdivine (F, m,n, iterations)) locpass = false;
 		if (!testRank (F, n, iterations))       locpass = false;
 		if (!testDet (F, n, iterations))        locpass = false;
-		if (!testTURBO (F, n, iterations))      locpass = false;
 		if (!testapplyP  (F, n, iterations))    locpass = false;
 		if (!testInv  (F, n, iterations))       locpass = false;
-		if (!testMinPoly (F,n,iterations))      locpass = false;
-		if (!testCharPoly (F,n,iterations))     locpass = false;
+		if (!testMinPoly (F,n, iterations))      locpass = false;
+		if (!testCharPoly (F,n, iterations))     locpass = false;
 		(!locpass)?(report << "FAIL" << std::endl):(report << "OK"<<std::endl);
 		pass &= locpass ;
 	}
-#endif
 
-	/* Modular uint32_t */
+	/* Givaro::Modular uint32_t */
 	{
-		typedef Modular<uint32_t> Field;
+		typedef Givaro::Modular<uint32_t> Field;
 
 		Field F (q);
 		F.write(report << "Field : " ) << std::endl;
@@ -985,18 +883,18 @@ int main(int argc, char** argv)
 		if (!testLUdivine (F, m,n, iterations)) locpass = false;
 		if (!testRank (F, n, iterations))   locpass     = false;
 		if (!testDet (F, n, iterations))   locpass      = false;
-		if (!testTURBO (F, n, iterations))   locpass    = false;
 		if (!testapplyP  (F, n, iterations)) locpass    = false;
 		if (!testInv  (F, n, iterations)) locpass       = false;
-		if (!testMinPoly (F,n,iterations)) locpass      = false;
-		if (!testCharPoly (F,n,iterations)) locpass     = false;
+		if (!testMinPoly (F,n, iterations)) locpass      = false;
+		if (!testCharPoly (F,n, iterations)) locpass     = false;
 		(!locpass)?(report << "FAIL" << std::endl):(report << "OK"<<std::endl);
 		pass &= locpass ;
 	}
 
-	/* GivaroZpz int32_t */
+	/* Givaro::Modular int32_t */
+#if 0
 	{
-		typedef GivaroZpz<Givaro::Std32> Field;
+		typedef Givaro::Modular<int32_t> Field;
 
 		Field F (q);
 		F.write(report << "Field : " ) << std::endl;
@@ -1008,15 +906,15 @@ int main(int argc, char** argv)
 		if (!testLUdivine (F, m,n, iterations)) locpass = false;
 		if (!testRank (F, n, iterations))   locpass     = false;
 		if (!testDet (F, n, iterations))   locpass      = false;
-		if (!testTURBO (F, n, iterations))   locpass    = false;
 		if (!testapplyP  (F, n, iterations)) locpass    = false;
 		if (!testInv  (F, n, iterations)) locpass       = false;
-		if (!testMinPoly (F,n,iterations)) locpass      = false;
-		if (!testCharPoly (F,n,iterations)) locpass     = false;
+		if (!testMinPoly (F,n, iterations)) locpass      = false;
+		if (!testCharPoly (F,n, iterations)) locpass     = false;
 		(!locpass)?(report << "FAIL" << std::endl):(report << "OK"<<std::endl);
 		pass &= locpass ;
 	}
 #endif
+#endif
 	commentator().stop(MSG_STATUS(pass),"ffpack test suite");
 
 	return pass ? 0 : -1;
diff --git a/tests/test-fibb.C b/tests/test-fibb.C
new file mode 100644
index 0000000..5cb5fde
--- /dev/null
+++ b/tests/test-fibb.C
@@ -0,0 +1,313 @@
+
+/* tests/test-fibb.C
+ * -bds
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *
+ */
+
+
+/*! @file  tests/test-fibb.C
+ * @ingroup tests
+ * @brief  no doc
+ * @test NO DOC
+ */
+
+#include "linbox/linbox-config.h"
+#include <iostream>
+#include "linbox/util/commentator.h"
+#include "givaro/modular-double.h"
+#include "test-blackbox.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/blackbox/fibb.h"
+#include "linbox/blackbox/fibb-product.h"
+#include "linbox/blackbox/diagonal.h"
+//#include "linbox/matrix/permutation-matrix.h"
+#include "linbox/blackbox/permutation.h"
+#include "linbox/blackbox/triangular-fibb.h"
+
+using namespace LinBox;
+
+/*
+check rk = rank(A), dt = det(A)
+Neg rk argument means we don't know rank, 
+Zero dt with full rank  means we don't know det.
+In these cases the test passes without checking rank,det.
+
+Verify solve with apply (first provide consistent RHS).
+check NSR in NS (no check of randomness) and NSB 
+*/
+template<class Field>
+bool testFibb(FIBB<Field>& A, string title, const typename Field::Element& dt, int64_t rk = -1) 
+{
+	typedef typename Field::Element Element;
+	commentator().start(title.c_str(), "fibb");
+	ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
+	bool pass = true, trial;
+	typedef DenseMatrix<Field> Matrix;
+	const Field& F(A.field());
+	BlasMatrixDomain<Field> MD(F);
+	size_t m = A.rowdim();
+	report << "rowdim " << m << std::endl;
+	size_t n = A.coldim();
+	report << "coldim " << n << std::endl;
+	size_t r = A.rank(r);
+	if (rk >= 0) pass = pass and r == rk;
+	if (m < 8  and n < 8) A.write(report << "A: " << std::endl) << std::endl;
+	report << "rank " << r << ", expected " << rk << std::endl;
+
+	Element d; F.init(d);
+	A.det(d);
+	if (rk == n and rk == m and F.isZero(dt))
+		F.write(report << "det ", d) << ", unchecked" << std::endl;
+	else 
+		F.write(F.write(report << "det ", d) << ", expected ", dt) << std::endl;
+	if (rk == n and not F.isZero(dt)) pass = pass and F.areEqual(d, dt);
+	if (m == n)
+	{	typename Field::Element d; F.init(d);
+		if (r < m and not F.isZero(A.det(d))) 
+		{	report << "problem in rank or det" << std::endl;
+			pass = false;
+		}
+	}
+	if (pass) report << "dims, rank, and det run fine (values partially checked)" << std::endl;
+
+/* right side stuff */
+{
+#if 1
+	// Solve consistent  
+	size_t b = (n/2 > 5) ? 5 : n/2;
+	Matrix B(F,m,b), X(F, n, b), Y(F, m, b), Z(F, n, b);
+	X.random();
+	A.applyRight(B, X); // B: B = AX
+	if (not F.isZero(dt)) { // check for zero apply
+		if (MD.isZero(X)) { 
+			X.write(report << "unlucky X" << std::endl, Tag::FileFormat::Plain) << std::endl;
+			pass = false;
+		}
+		if (MD.isZero(B)) { 
+			B.write(report << "bad apply, B" << std::endl, Tag::FileFormat::Plain) << std::endl;
+			pass = false;
+		}
+	}
+	A.solveRight(Z, B); // Z: AZ = B = AX
+	A.applyRight(Y, Z); // Y: Y = AZ = B
+	trial = MD.areEqual(Y, B);
+	if (m == n and m == r) trial = trial and MD.areEqual(Z,X); // nonsing case
+	pass = pass and trial;
+	if (not trial) report << "problem in solve Right" << std::endl;
+	if (trial) report << " no problem in solve Right" << std::endl;
+	// NSR
+	A.nullspaceRandomRight(Y);
+	A.applyRight(Z, Y);
+	trial = MD.isZero(Z);
+	// no check of randomness of cols of Y
+	pass = pass and trial;
+	if (not trial) report << "problem in NSR Right" << std::endl;
+	if (trial) report << " no problem in NSR Right" << std::endl;
+	// NSB
+	Matrix N(F);
+	A.nullspaceBasisRight(N);
+	trial = N.rowdim() == n and N.coldim() == n-r; // proper num of cols.
+	if (n != r)
+	{	trial = trial and n-r == MD.rank(N); // indep cols.
+		Matrix Nim(F, N.rowdim(), N.coldim()); 
+		A.applyRight(Nim, N);
+		trial = trial and MD.isZero(Nim); // in nullsp.
+		if (n < 8) Nim.write(report << "Nim " << std::endl, Tag::FileFormat::Plain) << std::endl;
+	}
+	if (n < 8) N.write(report << "N " << std::endl, Tag::FileFormat::Plain) << std::endl;
+	pass = pass and trial;
+	if (not trial) report << "problem in NSB Right " << m << " " << n << " " << r << " " << N.rowdim() << " " << N.coldim() << std::endl;
+	if (trial) report << " no problem in NSB Right" << std::endl;
+#endif
+} // right side 
+	report << " done with right side" << std::endl;
+
+/* left side stuff */
+{
+	// Solve consistent
+	size_t b = (n/2 > 6) ? 6 : n/2;
+	Matrix B(F,b,n), X(F, b, m), Y(F, b, n), Z(F, b, m);
+	X.random();
+	A.applyLeft(B, X); // B: B = XA
+#if 1
+	if (not F.isZero(dt)) { // check for zero apply
+		if (MD.isZero(X)) { 
+			X.write(report << "unlucky X" << std::endl, Tag::FileFormat::Plain) << std::endl;
+			pass = false;
+		}
+		if (MD.isZero(B)) { 
+			B.write(report << "bad apply, B" << std::endl, Tag::FileFormat::Plain) << std::endl;
+			pass = false;
+		}
+	}
+	A.solveLeft(Z, B); // Z: ZA = B = XA
+	A.applyLeft(Y, Z); // Y: Y = ZA
+	trial = MD.areEqual(Y, B);
+	if (m == n and m == r) trial = trial and MD.areEqual(Z,X); // nonsing case
+	pass = pass and trial;
+	if (not trial) 
+	{	report << "problem in solve Left" << std::endl;
+	 	A.write(report << "FIBB A: " << std::endl) << std::endl;
+	 	X.write(report << "X: random " << std::endl, Tag::FileFormat::Plain) << std::endl;
+	 	B.write(report << "B: XA" << std::endl, Tag::FileFormat::Plain) << std::endl;
+	 	Z.write(report << "Z: solve ZA = B " << std::endl, Tag::FileFormat::Plain) << std::endl;
+	 	Y.write(report << "Y: ZA " << std::endl, Tag::FileFormat::Plain) << std::endl;
+	}
+	if (trial) report << " no problem in solve Left" << std::endl;
+	// NSR
+	A.nullspaceRandomLeft(X); // X:  XA = 0 
+	A.applyLeft(Y, X); // Y: Y = XA
+	trial = MD.isZero(Y);
+	pass = pass and trial;
+	if (not trial) report << "problem in NSR Left" << std::endl;
+	if (trial) report << " no problem in NSR Left" << std::endl;
+	// NSB
+	Matrix N(F);
+	A.nullspaceBasisLeft(N);
+	trial = (N.rowdim() == m-r and N.coldim() == m); // proper num of rows.
+	// todo: this rank should work on empty matrix, but doesn't
+	if (m != r)
+	{	trial = (trial and m-r == MD.rank(N)); // indep cols.
+		Matrix Nim(F, N.rowdim(), N.coldim()); 
+		A.applyLeft(Nim, N);
+		trial = trial and MD.isZero(Nim); // in nullsp.
+		if (n < 8) Nim.write(report<< "Nim " << std::endl, Tag::FileFormat::Plain);
+	}
+	if (n < 8) N.write(report << "N " << std::endl, Tag::FileFormat::Plain) << std::endl;
+	pass = pass and trial;
+	if (not trial) report << "problem in NSB Left" << std::endl;
+	if (trial) report << " no problem in NSB Left" << std::endl;
+#endif
+} // left side
+	report << " done with left side" << std::endl;
+
+	commentator().stop (MSG_STATUS (pass));
+	return pass;
+}
+
+int main (int argc, char **argv)
+{
+	bool pass = true;
+	//srand(time(NULL));
+
+	static size_t n = 10;
+	static int32_t q = 101;
+	//static uint32_t q = 2147483647U;
+
+	static Argument args[] = {
+		{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT,     &n },
+		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INT, &q },
+		END_OF_ARGUMENTS
+	};
+	parseArguments (argc, argv, args);
+
+	commentator().start("FIBB test suite", "fibb");
+	ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
+
+	typedef Givaro::Modular<double> Field; 
+	Field F (q);
+	//MatrixDomain<Field> MD(F);
+
+	Diagonal<Field> D1(F, n); // random nonsing
+	Diagonal<Field> D2(F, n); 
+	for (size_t i = 0; i < n/2; ++i) D2.setEntry(i,i,F.zero); // rank half
+	Diagonal<Field> D3(F, n); 
+	for (size_t i = 0; i < n; ++i) D3.setEntry(i,i,F.zero); // zero matrix
+
+	pass = pass and testFibb(D1, "D1 nonsing", F.zero, n); // nonsing
+	pass = pass and testFibb(D2, "D2 sing", F.zero, n-n/2); // sing
+	pass = pass and testFibb(D3, "D3 zero", F.zero, 0); // zero
+
+	FIBBProduct<Field> Pr1(D1, D1); // nonsing product
+	FIBBProduct<Field> Pr2(D1, D2); // sing product
+	FIBBProduct<Field> Pr3(D3, D1); // zero product
+
+	pass = pass and testFibb(Pr1, "Pr1 nonsing product", F.zero, n); // nonsing product
+	pass = pass and testFibb(Pr2, "Pr2 sing product", F.zero, n-n/2); // sing product
+	pass = pass and testFibb(Pr3, "Pr3 zero product", F.zero, 0); // zero product
+
+	Permutation<Field> P1(F, n, n); // ident
+	Permutation<Field> P2(F, n, n); P2.random(); 
+
+	pass = pass and testFibb(P1, "P1 ident", F.one, n); // ident
+	pass = pass and testFibb(P2, "P2 random perm", F.zero, n); // random perm
+
+	FIBBProduct<Field> Pr4(P1, D1, P2); // nonsing product
+	FIBBProduct<Field> Pr5(P1, D2, P2); // sing product
+	FIBBProduct<Field> Pr6(P1, D3, P2); // zero product 
+
+	pass = pass and testFibb(Pr4, "Pr4 nonsing product", F.zero, n); // nonsing product
+	pass = pass and testFibb(Pr5, "Pr5 sing product", F.zero, n-n/2); // sing product
+	pass = pass and testFibb(Pr6, "Pr6 zero product", F.zero, 0); // zero product
+
+	report << "Done with diag and permutation products" << std::endl;
+#if 1
+	typedef DenseMatrix<Field> Matrix;
+	typedef TriangularBlasMatrix<Field> TriangularMatrix;
+	Matrix M(F, n, n); 
+	//M.random();
+	for (size_t i = 0; i < n; ++i)
+	for (size_t j = 0; j < n; ++j)
+	if ( i == 0 or i == j) M.setEntry(i, j, F.one);
+	M.write(report << "base matrix " << std::endl) << std::endl;
+	BlasMatrixDomain<Field> BMD(F);
+	/*
+	size_t r; 
+	Matrix SM(M);
+	r = BMD.rank(SM);
+	report << "underlying rank " << r << std::endl;
+	*/
+	TriangularMatrix U(M, Tag::Shape::Upper, Tag::Diag::NonUnit); 
+	TriangularMatrix L(M, Tag::Shape::Lower, Tag::Diag::Unit); 
+	report << "Upper " << (int)Tag::Shape::Upper << ", Lower " << (int)Tag::Shape::Lower << std::endl;
+	report << "Unit " << (int)Tag::Diag::Unit << ", NonUnit " << (int)Tag::Diag::NonUnit << std::endl;
+	TriangularFIBB<Field> UU(U);
+	TriangularFIBB<Field> LL(L);
+	FIBBProduct<Field> Pr7(LL, UU); // nonsing product
+	FIBBProduct<Field> Pr8(P1, LL, UU, P2); // nonsing product
+	FIBBProduct<Field> Pr9(LL, P1, UU, P2); // nonsing product
+
+	report << "Triangular, " << (int)U.getDiag() << " " << (int)U.getUpLo() << std::endl;
+	pass = pass and testFibb(UU, "UU nonU", F.one, n); // Upper NonUnit
+	report << "Triangular, " << (int)L.getDiag() << " " << (int)L.getUpLo() << std::endl;
+	pass = pass and testFibb(LL, "LL unit", F.one, n); // Lower Unit
+	report << "LU pattern nonsing" << std::endl;
+	pass = pass and testFibb(Pr7, "Pr7 LU", F.one, n); // LU pattern nonsing
+	report << "PLUQ pattern nonsing" << std::endl;
+	pass = pass and testFibb(Pr8, "Pr8 PLUQ", F.one, n); // PLUQ pattern nonsing
+	report << "LQUP pattern nonsing" << std::endl;
+	pass = pass and testFibb(Pr9, "Pr9 LQUP", F.one, n); // LQUP pattern nonsing
+#endif
+	report << "Done with triangular and permutation products" << std::endl;
+	//FactorizedMatrix<Field> F(...);
+
+	commentator().stop (MSG_STATUS (pass));
+
+	return pass ? 0 : -1;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-field.h b/tests/test-field.h
old mode 100644
new mode 100755
index fa19e6a..b5189b7
--- a/tests/test-field.h
+++ b/tests/test-field.h
@@ -1,5 +1,5 @@
 /* linbox/tests/test-field.h
- * Copyright (C) 2001, 2002 Bradford Hovinen
+ * Extracted and evolved by bds from test-generic.h, written by Bradford Hovinen <hovinen at cis.udel.edu>
  *
  * ========LICENCE========
  * This file is part of the library LinBox.
@@ -15,46 +15,46 @@
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
+ * License along with this library; if not, write to tthe Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  * ========LICENCE========
- *.
- *
- * Extracted by bds from test-generic.h, written by Bradford Hovinen <hovinen at cis.udel.edu>
  */
 
 /*! @file tests/test-field.h
  * @ingroup tests
- * @brief tests field operations
- * @test  tests field operations
+ * @brief tests ring and field operations
+ * @test  tests ring and field operations
  */
 
 /*
-// top level test that doesn't use subtests.
+// top level test that doesn't use field_subtests.
+bool testRing
 bool testField
 
 // top level test that uses subtest testRandomIteratorStep.
 bool testRandomIterator
 
-// top level runBasicRingTests calls these subtests.
+// top level runBasicRingTests calls these field_subtests.
 bool testFieldNegation
 bool testFieldDistributivity
 bool testFieldAssociativity
 bool testFieldCharacteristic
 bool testGeometricSummation
-bool testArithmeticConsistency
+bool testRingArithmeticConsistency
 bool testAxpyConsistency
 bool testRanditerBasic
 
-// top level runFieldTests calls these subtests after runBasicRingTests.
+// top level runPIRTests calls these field_subtests after runBasicRingTests.
+bool testFieldCommutativity
+...
+
+// top level runFieldTests calls these field_subtests after runBasicRingTests.
 bool testFieldInversion
 bool testFieldCommutativity
+bool testInvDivConsistency
 bool testFreshmansDream
 bool testRingTrivia
 
-//called in subtest testArithmeticConsistency
-bool testRingArithmeticConsistency
-bool testInvDivConsistency
 */
 
 #ifndef __LINBOX_test_field_H
@@ -68,30 +68,28 @@ bool testInvDivConsistency
 
 #include "linbox/util/commentator.h"
 #include "linbox/util/field-axpy.h"
-#include "linbox/randiter/nonzero.h"
+#include <givaro/givranditer.h>
 //#include "linbox/vector/stream.h"
 #include "linbox/integer.h"
+// #include "linbox/field/givaro.h"
 
 #include "test-common.h"
 
-/* Modular exponentiation */
+/* Givaro::Modular exponentiation */
 using namespace std;
 
-// LinBox::Commentator commentator(std::cout);
-
 using LinBox::commentator ;
 
-
 template <class Field>
 typename Field::Element& expt (const Field &F, typename Field::Element &res, const typename Field::Element &a, LinBox::integer &n)
 {
 	if (n == 0) {
-		F.init (res, 1);
+		F.init (res);
 	}
 	else if (n == 1) {
 		F.assign (res, a);
 	}
-	else if (n[0] & 1) {
+	else if (Givaro::isOdd(n)) {
 		n -= 1;
 		expt (F, res, a, n);
 		F.mulin (res, a);
@@ -100,7 +98,7 @@ typename Field::Element& expt (const Field &F, typename Field::Element &res, con
 		n /= 2;
 		expt (F, res, a, n);
 		typename Field::Element tmp;
-		F.init(tmp,0);
+		F.init(tmp);
 		res = F.mul (tmp, res, res);
 	}
 
@@ -126,34 +124,41 @@ bool reportError(string rep, bool& flag)
  * Return true on success and false on failure
  */
 
-template<class Field>
-bool testField (Field &F, const char *title, bool fieldp = true)
+template<class Ring>
+bool testRing (Ring &F, const char *title, bool fieldp = true, bool runInitConvertIdentity=true)
 {
-	commentator().start (title, "testField", 5);
-	// ostream &report = std::cout ;
+	commentator().start (title, "testRing", 5);
 	ostream &report = commentator().report (LinBox::Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
 
-	typename Field::Element zero, one, mOne, two, three;
-	F.init(zero, 0); F.init(one, 1); F.init(two, 2); F.init(three, 3);
-	F.init(mOne);
-	F.neg(mOne,one);
-
-	typename Field::Element a, b, c, d, e, f;
-	F.init(a,0); F.init(b,0); F.init(c,0); F.init(d,0); F.init(e,0); F.init(f,0);
-
-
-	report << "Field self description: " << F.write (report) << endl;
-	//	report << "field Element 2: " << F.write (report, two) << endl;
+	typedef typename Ring::Element Element;
+	LinBox::integer p, q;
+	F.characteristic(p);
+	
+	Element zero, one, mOne, two, mTwo, three, five, six, eight;
+	F.init(zero); F.assign(zero, F.zero);
+	F.init(one); F.assign(one, F.one);
+	F.init(mOne); F.assign(mOne, F.mOne);
+
+	F.init(two); F.add(two, one, one);
+	F.init(mTwo); F.add(mTwo, mOne, F.mOne);
+	F.init(three); F.add(three, two, one);
+	F.init(five); F.add(five, three, one); F.addin(five, one);
+	F.init(six); F.add(six, five, one);
+	F.init(eight); F.add(eight, six, one); F.addin(eight, one);
+
+	Element a, b, c, d, e, f;
+	int64_t z = 0;
+	F.init(a,z); F.init(b,z); F.init(c,z); F.init(d,z); F.init(e,z); F.init(f,z);
+
+	F.write(report << " (Ring self description: ") << ')' << endl;
+	report << "Ring characteristic: " << p << endl;
 
 	LinBox::integer n, m;
 	bool pass = true, part_pass = true;
 
 	commentator().start ("\t--Testing characteristic/cardinality match");
 
-	F.characteristic (n);
-	F.cardinality (m);
-
-	if (n > 0 && !isPower (m, n)) part_pass = reportError("Characteristic, cardinality mismatch", pass);
+	if (p > 0 && q > 0 && !isPower (q, p)) part_pass = reportError("Characteristic, cardinality mismatch", pass);
 
 	commentator().stop (MSG_STATUS (part_pass));
 	commentator().progress ();
@@ -164,82 +169,87 @@ bool testField (Field &F, const char *title, bool fieldp = true)
 	commentator().start ("\t--Testing correctness of 0 and 1");
 	part_pass = true;
 
-	if (!F.isZero (zero)) {
+	if ( not F.isZero (zero) or not F.isZero(F.zero) ) 
 		part_pass = reportError( "isZero (0) is false", pass);
-	}
-	if (F.isZero (one)) part_pass = reportError( "isZero (1) is true", pass);
-	if (F.isOne (zero)) part_pass = reportError( "isOne (0) is true", pass);
-	if (!F.isOne (one)) {
+	
+	if ( F.isZero (one) or F.isZero(F.one) ) 
+		part_pass = reportError( "isZero (1) is true", pass);
+	if ( F.isOne (zero) or F.isOne(F.zero) ) 
+		part_pass = reportError( "isOne (0) is true", pass);
+	if ( not F.isOne (one) or not F.isOne(F.one) ) 
 		part_pass = reportError( "isOne (1) is false", pass);
-	}
-
-	if (!F.isZero (F.zero)) {
-		part_pass = reportError( "isZero (0) is false", pass);
-	}
-	if (F.isZero (F.one)) part_pass = reportError( "isZero (1) is true", pass);
-	if (F.isOne (F.zero)) part_pass = reportError( "isOne (0) is true", pass);
-	if (!F.isOne (F.one)) {
-		part_pass = reportError( "isOne (1) is false", pass);
-	}
-
-	if ( !F.areEqual(F.mOne,mOne))
+	if ( !F.areEqual(F.mOne,mOne)) {
 		part_pass = reportError( "isMOne (-One) is false", pass);
+	}
 
-	typename Field::Element mOneFromCst;
-    F.init(mOneFromCst, -1);
+/* this is not required of init
+	if (p > 0) {
+		Element mOneFromCst;
+		F.init(mOneFromCst, (LinBox::integer)(p-1));
 
-    if ( !F.areEqual(F.mOne,mOneFromCst))
-		part_pass = reportError( "isMOne (-1) is false", pass);
+		if ( !F.areEqual(F.mOne,mOneFromCst)) {
+			part_pass = reportError( "isMOne (p-1) is false", pass);
+		}
+	}
+*/
 
 
 	commentator().stop (MSG_STATUS (part_pass));
 	commentator().progress ();
 
+    if (runInitConvertIdentity) {
+                
 	commentator().start ("\t--Testing init/convert");
 	part_pass = true;
 
-	if (F.cardinality (m) <= 0)
-		n = 49193295;   // Just using some odd value
+	// test of 0..card-1 bijection
+	typename Ring::RandIter r (F);
+        r.random(a);
+	F.convert(n, a);
+	F.write(report, a) << " --(convert)--> " << n << endl;
+	F.init(b, n);
+	F.write(report << n << " --(init)--> ", b) << endl;
+	if (not F.areEqual(a, b)) part_pass = reportError( "F.init (b, F.convert(n, a)) != a", pass);
+
+#if 0
+	// test of prime subring bijection
+	if (p <= 0)
+		n = 0;
 	else
-		n = n/2-1;
-	if (!n) ++n;
-
-
+		n = rand()%p;
 	report << "Initial integer: " << n << endl;
-	F.init (a, n);  F.write ( report << "Result of init: ", a) << endl;
 
-	F.convert (m, a);
-	report << "Result of convert: " << m << endl;
+	F.init (a, (int64_t)n);  F.write ( report << "Result of init: ", a) << endl;
+	F.convert (m, a); report << "Result of convert: " << m << endl;
 
 	if (m != n) part_pass = reportError( "F.convert (m, F.init (a, n)) != n", pass);
+#endif
 
 	commentator().stop (MSG_STATUS (part_pass));
 	commentator().progress ();
-
-	commentator().start ("\t--Testing field arithmetic");
+        }
+        
+	commentator().start ("\t--Testing ring arithmetic");
 	part_pass = true;
 
-	F.init (b, n-2);
-	F.init (d, n-2);
-	F.init (e, 3);
-
 	F.add (a, three, two); F.write (report << "Result of 2 + 3: ", a) << endl;
 	F.assign (d, three);
 	F.addin (d, two); F.write (report << "Result of 2 + 3 (inplace): ", d) << endl;
 
-	if (!F.areEqual (a, F.init (f, 5)) || !F.areEqual (d, a))
+	if (!F.areEqual (a, F.assign (f, five)) || !F.areEqual (d, a))
 		part_pass = reportError( "Results of add are incorrect", pass);
 
 	F.neg (a, two); F.write (report << "Result of -2: ", a) << endl;
 	F.assign (d, two);
 	F.negin (d); F.write (report << "Result of -2 (inplace): ", d) << endl;
-	F.init (f, -2); F.write( report << "-2 via init: ", f) << endl;
+//F.write( report << "-2 mTwo: ", mTwo) << endl;
+	F.assign (f, mTwo); F.write( report << "-2 via init: ", f) << endl;
 
 	if (!F.areEqual (a, f) || !F.areEqual (d, a))
 		part_pass = reportError( "Results of neg are incorrect", pass);
 
 	F.sub (a, three, two); F.write (report << "Result of 3 - 2: ", a) << endl;
-	F.init (d, 3);
+	F.assign (d, three);
 	F.subin (d, two); F.write (report << "Result of 3 - 2 (inplace): ", d) << endl;
 
 	if (!F.areEqual (a, one) || !F.areEqual (d, a))
@@ -248,30 +258,15 @@ bool testField (Field &F, const char *title, bool fieldp = true)
 	F.mul (a, two, three); F.write (report << "Result of 2 * 3: ", a) << endl;
 	F.assign (d, two);
 	F.mulin (d, three); F.write (report << "Result of 2 * 3 (inplace): ", d) << endl;
-	F.init (f, 6);
+	F.assign (f, six);
 
 	if (!F.areEqual (a, f) || !F.areEqual (d, a))
 		part_pass = reportError( "Results of mul incorrect", pass);
 
-	F.inv (a, one); F.write (report << "Result of inverting 1: ", a) << endl;
-	F.assign (d, one);
-	F.invin (d); F.write (report << "Result of inverting 1 (inplace): ", d) << endl;
-
-	if (!F.areEqual (a, one) || !F.areEqual (d, a))
-		part_pass = reportError( "Results of inv incorrect", pass);
-
-	if ( F.isZero(two) ) F.assign(f, three); else F.assign(f, two);
-	F.div (a, f, f); F.write ( report << "Result of f/f: ", a) << endl;
-	F.assign(d, f);
-	F.divin (d, f); F.write ( report << "Result of f/f (inplace): ", d) << endl;
-
-	if (!F.areEqual (a, one) || !F.areEqual (d, a))
-		part_pass = reportError( "Results of div incorrect", pass);
-
 	F.axpy (a, two, three, two); F.write ( report << "Result of axpy 2*3 + 2: ", a) << endl;
 	F.assign (d, two);
 	F.axpyin (d, two, three); F.write ( report << "Result of axpy 2*3 + 2 (inplace): ", d) << endl;
-	F.init (f, 8);
+	F.assign (f, eight);
 
 	if ( !F.areEqual (a, f) || !F.areEqual (d, a) )
 		part_pass = reportError( "Results of axpy incorrect", pass);
@@ -284,26 +279,27 @@ bool testField (Field &F, const char *title, bool fieldp = true)
 	//,..
 	// 2^101 - 1 vs 1 + 2 + 4 + ... + 2^100
 
-	F.init (a, 1);
-	F.init (b, 1);
-	F.init (c, 0);
-
 	n = 101;
 	expt(F, a, two, n);
-	F.subin (a, one); F.write( report << "using expt, 2^101 - 1: ", a) << endl;
+	F.subin (a, one);
+	F.write( report << "using expt, 2^101 - 1: ", a) << endl;
 
-	for (int i = 1; i <= 101; ++i) {
-		F.addin (c, b);
-		F.mulin (b, two);
+	for (int i = 0; i < 101; ++i) {
+		F.mulin(c, two);
+		F.addin (c, one);
 	}
 
+	F.write( report << "using sum, 1 + 2 + .. + 2^100: ", c) << endl;
+
 	if (!F.areEqual (a, c))
 		part_pass = reportError( "2^101 - 1 != 1 + 2 + .. + 2^100", pass);
 
 	// 1 + 2*(1 + 2*( ... (1) ... )), 100 times.
 	F.assign (d, one);
-	for (int i = 1; i < 101; ++i)
-	{	F.axpy (b, two, d, one); F.assign(d, b); }
+	for (int i = 1; i < 101; ++i) {
+		F.axpy (b, two, d, one);
+		F.assign(d, b);
+	}
 	F.write( report << "using axpy, 1 + 2(1 + ... + 2(1)...), with 100 '+'s: ", d) << endl;
 
 	if (!F.areEqual (a, d))
@@ -321,15 +317,59 @@ bool testField (Field &F, const char *title, bool fieldp = true)
 	 * .
 	 */
 
-	commentator().stop (MSG_STATUS (pass), (const char *) 0, "testField");
+	commentator().stop (MSG_STATUS (pass), (const char *) 0, "testRing");
 
 	return pass;
 }
 
+template<class Field>
+bool testField (Field &F, const char *title, bool fieldp = true, bool runInitConvertIdentity=true)
+{
+	commentator().start (title, "testField", 5);
+	ostream &report = commentator().report (LinBox::Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
+
+	LinBox::integer p, q;
+	F.characteristic(p);
+	F.cardinality (q);
+
+    typename Field::Element two, three;
+	F.init(two); F.add(two, F.one, F.one);
+	F.init(three); F.add(three, two, F.one);
+
+    typename Field::Element a, b, c, d, e, f;
+	F.init(a);F.init(b);F.init(c);F.init(d);F.init(e);F.init(f);
+        
+	commentator().start ("\t--Testing field arithmetic");
+	bool part_pass = true;
+
+	F.inv (a, F.one); F.write (report << "Result of inverting 1: ", a) << endl;
+	F.assign (d, F.one);
+	F.invin (d); F.write (report << "Result of inverting 1 (inplace): ", d) << endl;
 
-/** Tests of algebraic properties of fields */
+	if (!F.areEqual (a, F.one) || !F.areEqual (d, a))
+		part_pass = reportError( "Results of inv incorrect", part_pass);
 
-namespace subtests {
+	if ( F.isZero(two) ) F.assign(f, three); else F.assign(f, two);
+	F.div (a, f, f); F.write ( report << "Result of f/f: ", a) << endl;
+	F.assign(d, f);
+	F.divin (d, f); F.write ( report << "Result of f/f (inplace): ", d) << endl;
+
+	if (!F.areEqual (a, F.one) || !F.areEqual (d, a))
+		part_pass = reportError( "Results of div incorrect", part_pass);
+	
+	commentator().stop (MSG_STATUS (part_pass));
+	commentator().progress ();
+
+
+	commentator().stop (MSG_STATUS (part_pass), (const char *) 0, "testField");
+
+        return part_pass & testRing(F,title,fieldp,runInitConvertIdentity);
+        
+}
+
+/** Tests of algebraic properties of rings and fields */
+
+namespace field_subtests {
 	/* Generic test 6: Negation of elements
 	 *
 	 * Negates random elements and checks that they are true negatives
@@ -345,7 +385,8 @@ namespace subtests {
 		commentator().start (st, "testFieldNegation", iterations);
 
 		typename Field::Element a, neg_a, neg_a_a, zero;
-		F.init(a,0); F.init(neg_a,0); F.init(neg_a_a,0); F.init (zero, 0);
+		int64_t z = 0;
+		F.init(a,z); F.init(neg_a,z); F.init(neg_a_a,z); F.init (zero, z);
 		typename Field::RandIter r (F);
 
 		bool ret = true;
@@ -394,11 +435,10 @@ namespace subtests {
 		strcpy (st, str.str().c_str());
 		commentator().start (st, "testFieldInversion", iterations);
 
-		typename Field::Element a, ainv, aainv, one;
-		F.init (a,0);
-		F.init (ainv,0);
-		F.init (aainv,0);
-		F.init (one, 1);
+		typename Field::Element a, ainv, aainv;
+		F.init (a,(int64_t)0);
+		F.init (ainv,(int64_t)0);
+		F.init (aainv,(int64_t)0);
 		typename Field::RandIter r (F);
 
 		bool ret = true;
@@ -421,7 +461,7 @@ namespace subtests {
 
 			report << "a a^{-1} = ";  F.write (report, aainv) << endl;
 
-			if (!F.areEqual (aainv, one)) reportError("a a^-1 != 1", ret);
+			if (!F.areEqual (aainv, F.one)) reportError("a a^-1 != 1", ret);
 
 			commentator().stop ("done");
 			commentator().progress ();
@@ -449,10 +489,11 @@ namespace subtests {
 		commentator().start (st, "testFieldDistributivity", iterations);
 
 		typename Field::Element a, b, c, a_b, a_bc, ac, bc, ac_bc, ca_b, ca, cb, ca_cb;
-		F.init (a,0); F.init (b,0); F.init (c,0);
-		F.init (a_b,0); F.init (a_bc,0); F.init (ac,0); F.init (bc,0);
-		F.init (ac_bc,0);
-		F.init (ca_b,0); F.init (ca,0); F.init (cb,0); F.init (ca_cb,0);
+		int64_t z = 0;
+		F.init (a,z); F.init (b,z); F.init (c,z);
+		F.init (a_b,z); F.init (a_bc,z); F.init (ac,z); F.init (bc,z);
+		F.init (ac_bc,z);
+		F.init (ca_b,z); F.init (ca,z); F.init (cb,z); F.init (ca_cb,z);
 
 		typename Field::RandIter r (F);
 
@@ -523,9 +564,9 @@ namespace subtests {
 		commentator().start (st, "testFieldCommutativity", iterations);
 
 		typename Field::Element a, b, ab, ba, a_b, b_a;
-		F.init (a,0); F.init (b,0);
-		F.init (ab,0); F.init (ba,0);
-		F.init (a_b,0); F.init (b_a,0);
+		F.init (a,(int64_t)0); F.init (b,(int64_t)0);
+		F.init (ab,(int64_t)0); F.init (ba,(int64_t)0);
+		F.init (a_b,(int64_t)0); F.init (b_a,(int64_t)0);
 
 
 		typename Field::RandIter r (F);
@@ -596,8 +637,8 @@ namespace subtests {
 		commentator().start (st, "testFieldAssociativity", iterations);
 
 		typename Field::Element a, b, c, a_b, b_c, a_bc, ab_c;
-		F.init (a,0); F.init (b,0); F.init (c,0);
-		F.init (a_b,0); F.init (b_c,0); F.init (a_bc,0); F.init (ab_c,0);
+		F.init (a,(int64_t)0); F.init (b,(int64_t)0); F.init (c,(int64_t)0);
+		F.init (a_b,(int64_t)0); F.init (b_c,(int64_t)0); F.init (a_bc,(int64_t)0); F.init (ab_c,(int64_t)0);
 		typename Field::RandIter r (F);
 
 		bool ret = true;
@@ -666,33 +707,29 @@ namespace subtests {
 		strcpy (st, str.str().c_str());
 		commentator().start (st, "testGeometricSummation", iterations);
 
-		typename Field::Element a, a_n, k, zero, one;
+		typename Field::Element a, a_n, k;
 		typename Field::RandIter r (F);
-		typename LinBox::NonzeroRandIter<Field> z(F,r);
+//		typename Givaro::GeneralRingNonZeroRandIter<Field> z(r);
 
-		F.init (zero, 0);
-		F.init (one, 1);
-		F.init (a,0); F.init (a_n,0); F.init (k,0);
+		F.init (a,(int64_t)0); F.init (a_n,(int64_t)0); F.init (k,(int64_t)0);
 
 		bool ret = true;
 		LinBox::Integer card; F.cardinality(card);
-
 		for (unsigned int i = 0; i < iterations; i++) {
 			commentator().startIteration (i);
 
-			size_t no_bad_loop = card+10 ;
-			do z.random (a); while (F.areEqual (a, one) && --no_bad_loop);
-			if (!no_bad_loop) {
-				reportError(" *** ERROR *** could not find an element different form 1...",ret);
-				break;
-			}
+//			size_t no_bad_loop = card+10 ;
+//			do z.random (a); while (F.areEqual (a, F.one) && --no_bad_loop);
+//			if (!no_bad_loop) {
+//				reportError(" *** ERROR *** could not find an element different from 1...",ret);
+//				break;
 
 			ostream &report = commentator().report (LinBox::Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
 			report << "Random element a: ";
 			F.write (report, a) << endl;
 
-			F.assign (k, one);
-			F.assign (a_n, a);
+			F.assign (k, F.zero);
+			F.assign (a_n, F.one);
 
 			for (unsigned int j = 0; j < n; ++j) {
 				F.addin (k, a_n);
@@ -707,15 +744,18 @@ namespace subtests {
 			report << "sum(a^i, i = 0..n-1) = ";
 			F.write (report, k) << endl;
 
-			F.subin (a_n, one);
+			F.subin (a_n, F.one);
 			report << "(a^n - 1) = ";
 			F.write (report, a_n) << endl;
 
-			F.subin (a, one);
+			F.subin (a, F.one);
 			report << "(a - 1) = ";
 			F.write (report, a) << endl;
 
-			F.divin (a_n, a);
+			if (not F.isZero(a))
+				F.divin (a_n, a);
+			else
+				F.mulin(k, a);
 
 			report << "(a^n - 1) / (a - 1) = ";
 			F.write (report, a_n) << endl;
@@ -749,12 +789,11 @@ namespace subtests {
 		commentator().start (string(str.str()).c_str(), "testFieldCharacteristic", iterations);
 
 		LinBox::integer p, j;
-		typename Field::Element a, sigma, zero;
+		typename Field::Element a, sigma;
 		typename Field::RandIter r (F);
 
 		F.characteristic (p);
-		F.init (zero, 0);
-		F.init (a,0); F.init (sigma,0);
+		F.init (a,(int64_t)0); F.init (sigma,(int64_t)0);
 
 		bool ret = true;
 
@@ -770,7 +809,7 @@ namespace subtests {
 			Report << "Random element a: ";
 			F.write (Report, a) << endl;
 
-			F.assign (sigma, zero);
+			F.assign (sigma, F.zero);
 
 			// suggestion: make this run in time O(lg(p)), then take the conditional out of the run...Tests
 			for (j = 0; j < p; j += 1)
@@ -821,8 +860,8 @@ namespace subtests {
 		typename Field::RandIter r (F);
 		typename Field::Element a, b, a_b, a_b_p, a_p, b_p, a_p_b_p;
 
-		F.init (a,0); F.init (b,0); F.init (a_b,0);
-		F.init (a_b_p,0); F.init (a_p,0); F.init (b_p,0); F.init (a_p_b_p,0);
+		F.init (a,(int64_t)0); F.init (b,(int64_t)0); F.init (a_b,(int64_t)0);
+		F.init (a_b_p,(int64_t)0); F.init (a_p,(int64_t)0); F.init (b_p,(int64_t)0); F.init (a_p_b_p,(int64_t)0);
 
 		for (unsigned int i = 0; i < iterations; i++) {
 			commentator().startIteration (i);
@@ -896,7 +935,7 @@ namespace subtests {
 
 		typename Field::RandIter r (F);
 		typename Field::Element a, b, c1, c2;
-		F.init (a,0); F.init (b,0); F.init (c1,0); F.init (c2,0);
+		F.init (a,(int64_t)0); F.init (b,(int64_t)0); F.init (c1,(int64_t)0); F.init (c2,(int64_t)0);
 
 		for (unsigned int i = 0; i < iterations; i++) {
 			commentator().startIteration (i);
@@ -975,7 +1014,8 @@ namespace subtests {
 
 		typename Field::RandIter r (F);
 		typename Field::Element a, b, c1, c2;
-		F.init (a,0); F.init (b,0); F.init (c1,0); F.init (c2,0);
+		uint64_t zero = 0;
+		F.init (a,zero); F.init (b,zero); F.init (c1,zero); F.init (c2,zero);
 
 		for (unsigned int i = 0; i < iterations; i++) {
 			commentator().startIteration (i);
@@ -1023,17 +1063,18 @@ namespace subtests {
 		return ret;
 	}
 
-
+/*
 	template <class Field>
 	bool testArithmeticConsistency (const Field &F, const char *name, unsigned int iterations)
 	{
 		bool ret = true ;
 
-		ret &= subtests::testRingArithmeticConsistency(F, name, iterations) ;
-		ret &= subtests::testInvDivConsistency(F, name, iterations);
+		ret &= field_subtests::testRingArithmeticConsistency(F, name, iterations) ;
+		ret &= field_subtests::testInvDivConsistency(F, name, iterations);
 
 		return ret;
 	}
+	*/
 
 
 	template <class Field>
@@ -1054,42 +1095,41 @@ namespace subtests {
 		ostream &rapport = commentator().report (LinBox::Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
 
 		//!@todo enable init with 1UL et -1L pour GMPRationalElement
-		typename Field::Element one, mOne, zero ;
-		LinBox::integer pun = 1 ;
-		LinBox::integer mun = -1 ;
-		LinBox::integer zer = 0 ;
-		F.init(one,pun);
-		F.init(mOne,mun);
-		F.neg(mOne,one);
-		// F.init(mOne,-1L);
-		F.init(zero,zer);
+		//typename Field::Element one, mOne, zero ;
+		//LinBox::integer pun = 1 ;
+		//LinBox::integer zer = 0 ;
+		//F.init(one,pun);
+		//F.neg(mOne,one);
+		//F.init(zero,zer);
 
 		rapport << "1 - 1 = " ;
 		typename Field::Element nil ;
+		F.init(nil);
 
-		F.add(nil,one,mOne);
+		F.add(nil,F.one,F.mOne);
 
 		F.write(rapport,nil) << std::endl ;
 
-		if ( !F.areEqual(nil,zero) ) {
-			reportError("1+1!=0", ret);
+		if ( !F.areEqual(nil,F.zero) ) {
+			reportError("1+-1!=0", ret);
 		}
 
 		typename Field::Element un ;
+		F.init(un);
 		rapport << "-1 * -1 = " ;
-		F.mul(un,mOne,mOne);
+		F.mul(un,F.mOne,F.mOne);
 		F.write(rapport,un) << std::endl ;
 
-		if ( !F.areEqual(un,one) ) {
+		if ( !F.areEqual(un,F.one) ) {
 			reportError("-1 * -1 != 1", ret);
 		}
 
-		F.init(nil,pun);
+		//F.init(nil,pun);
 		rapport << "-1 +  -1 * -1 = " ;
-		F.axpy(nil,mOne,mOne,mOne) ;
+		F.axpy(nil,F.mOne,F.mOne,F.mOne) ;
 		F.write(rapport,nil) << std::endl ;
 
-		if ( !F.areEqual(nil,zero) ) {
+		if ( !F.areEqual(nil,F.zero) ) {
 			reportError("-1+(-1*-1)!=0", ret);
 		}
 
@@ -1120,8 +1160,8 @@ namespace subtests {
 
 		typename Field::RandIter r (F);
 		typename Field::Element a, x, y, c1, c2, c3;
-		F.init (a,0); F.init (x,0); F.init (y,0);
-		F.init (c1,0); F.init (c2,0); F.init (c3,0);
+		F.init (a,(int64_t)0); F.init (x,(int64_t)0); F.init (y,(int64_t)0);
+		F.init (c1,(int64_t)0); F.init (c2,(int64_t)0); F.init (c3,(int64_t)0);
 
 		for (unsigned int i = 0; i < iterations; i++) {
 			commentator().startIteration (i);
@@ -1175,7 +1215,7 @@ namespace subtests {
 
 		typename Field::RandIter r (F);
 		typename Field::Element a;
-		F.init (a,0);
+		F.init (a,(int64_t)0);
 
 		if (iterations < 20) iterations = 20;
 		for (unsigned int i = 0; i < iterations; i++) {
@@ -1188,54 +1228,54 @@ namespace subtests {
 		delete[] st;
 		return ret;
 	}
-} // namespace subtests
-
-	/* Convenience function to run all of the field tests on a given field */
-	template <class Field>
-	bool runBasicRingTests (const Field &F, const char *desc, unsigned int iterations, bool runCharacteristicTest = true)
-	{
-		bool pass = true;
-		ostringstream str;
-
-		str << "\t--Testing " << desc << " ring" << ends;
-		char * st = new char[str.str().size()];
-		strcpy (st, str.str().c_str());
+} // namespace field_subtests
 
-		commentator().start (st, "runBasicRingTests", runCharacteristicTest ? 11 : 10);
+/* Convenience function to run all of the basic ring tests */
+template <class Ring>
+bool runBasicRingTests (const Ring &F, const char *desc, unsigned int iterations, bool runCharacteristicTest = true, bool runInitConvertIdentity=true)
+{
+	bool pass = true;
+	ostringstream str;
 
-		if (!testField                     (F, string(str.str()).c_str()))           pass = false;
-		commentator().progress ();
-		if (!subtests::testFieldNegation             (F, desc, iterations))                    pass = false;
-		commentator().progress ();
-		if (!subtests::testFieldDistributivity       (F, desc, iterations))                    pass = false;
-		commentator().progress ();
-		if (!subtests::testFieldAssociativity        (F, desc, iterations))                    pass = false;
-		commentator().progress ();
+	str << "\t--Testing " << desc << " ring" << ends;
+	char * st = new char[str.str().size()];
+	strcpy (st, str.str().c_str());
 
-		if (runCharacteristicTest) {
-			if (!subtests::testFieldCharacteristic (F, desc, iterations))                  pass = false;
-			commentator().progress ();
-		}
-		LinBox::integer card;
+	commentator().start (st, "runBasicRingTests", runCharacteristicTest ? 11 : 10);
 
-		if (F.cardinality(card) != 2) { // otherwise it is not very interesting to find a element not zero and not one !
-			if (!subtests::testGeometricSummation        (F, desc, iterations, 100))               pass = false;
-			commentator().progress ();
-		}
+	if (!testField                     (F, string(str.str()).c_str(),true,runInitConvertIdentity))           pass = false;
+	commentator().progress ();
+	if (!field_subtests::testFieldNegation             (F, desc, iterations))                    pass = false;
+	commentator().progress ();
+	if (!field_subtests::testFieldDistributivity       (F, desc, iterations))                    pass = false;
+	commentator().progress ();
+	if (!field_subtests::testFieldAssociativity        (F, desc, iterations))                    pass = false;
+	commentator().progress ();
 
-		if (!subtests::testArithmeticConsistency (F, desc, iterations))                    pass = false;
-		commentator().progress ();
-		if (!subtests::testAxpyConsistency           (F, desc, iterations))                    pass = false;
-		commentator().progress ();
-		if (!subtests::testRanditerBasic             (F, desc, iterations))                    pass = false;
+	if (runCharacteristicTest) {
+		if (!field_subtests::testFieldCharacteristic (F, desc, iterations))                  pass = false;
 		commentator().progress ();
+	}
+	LinBox::integer card;
 
-		commentator().stop (MSG_STATUS (pass), (const char *) 0, "runBasicRingTests");
-		delete[] st;
-		return pass;
+	if (F.cardinality(card) != 2) { // otherwise it is not very interesting to find a element not zero and not one !
+		if (!field_subtests::testGeometricSummation        (F, desc, iterations, 100))               pass = false;
+		commentator().progress ();
 	}
 
-namespace subtests {
+	if (!field_subtests::testRingArithmeticConsistency (F, desc, iterations))                    pass = false;
+	commentator().progress ();
+	if (!field_subtests::testAxpyConsistency           (F, desc, iterations))                    pass = false;
+	commentator().progress ();
+	if (!field_subtests::testRanditerBasic             (F, desc, iterations))                    pass = false;
+	commentator().progress ();
+
+	commentator().stop (MSG_STATUS (pass), (const char *) 0, "runBasicRingTests");
+	delete[] st;
+	return pass;
+}
+
+namespace field_subtests {
 	/* Random number test
 	 *
 	 * Test that the random iterator over the given field works
@@ -1261,6 +1301,7 @@ namespace subtests {
 
 		LinBox::integer card;
 		unsigned int i;
+//                std::cerr<<"num_categories = "<<num_categories<<std::endl;
 		std::vector<int> categories1 (num_categories, 0);
 		std::vector<int> categories2 (num_categories, 0);
 		std::list<std::vector<int> > diff_categories;
@@ -1282,17 +1323,21 @@ namespace subtests {
 		for (i = 0; i < num_trials; ++i) {
 			LinBox::integer ix, id;
 			F.convert(ix, iter.random (x));
-
-
-			categories1[ix % num_categories]++;
-			categories2[(unsigned int) (double (ix) / double (card) * num_categories)]++;
+                        
+                        LinBox::Integer ix2 = ix % num_categories;
+                        if (ix2<0) ix2+=num_categories;
+			categories1[ix2]++;
+			categories2[(unsigned int) (double (ix2) / double (card) * num_categories) %num_categories]++;
 
 			typename std::list<typename Field::Element>::iterator x_queue_iter = x_queue.begin ();
 			diff_cat_iter = diff_categories.begin ();
 
+//                        std::cerr<<x_queue.size()<<" "<<diff_categories.size()<<std::endl;
 			for (; x_queue_iter != x_queue.end (); ++x_queue_iter, ++diff_cat_iter) {
 				F.convert(id, F.sub (d, *x_queue_iter, x));
-				(*diff_cat_iter)[id % num_categories]++;
+                                id %= num_categories;
+                                if (id<0) id += num_categories;
+				(*diff_cat_iter)[(size_t) id]++;
 			}
 
 			x_queue.push_front (x);
@@ -1356,10 +1401,10 @@ namespace subtests {
 		//commentator().stop (MSG_STATUS (ret), (const char *) 0, "testRandomIteratorStep");
 		return ret;
 	}
-}
+}// namespace field_subtests
 
 template <class Field>
-bool runFieldTests (const Field &F, const char *desc, unsigned int iterations, size_t n, bool runCharacteristicTest = true)
+bool runFieldTests (const Field &F, const char *desc, unsigned int iterations, size_t n, bool runCharacteristicTest = true, bool runInitConvertIdentity=true)
 	// n is not used.
 {
 	ostringstream str;
@@ -1368,12 +1413,12 @@ bool runFieldTests (const Field &F, const char *desc, unsigned int iterations, s
 	char * st = new char[str.str().size()];
 	strcpy (st, str.str().c_str());
 	commentator().start (st, "runFieldTests");
-	bool ret =  runBasicRingTests(F, desc, iterations, runCharacteristicTest) ;
-	//ret &= subtests::testInvDivConsistency(F, desc, iterations) ; // it's called in runBasicRingTests
-	ret &= subtests::testFieldInversion (F, desc, iterations) ;
-	ret &= subtests::testFieldCommutativity (F, desc, iterations) ;
-	ret &= subtests::testFreshmansDream(F, desc, iterations);
-	ret &= subtests::testRingTrivia(F,desc);
+	bool ret =  runBasicRingTests(F, desc, iterations, runCharacteristicTest, runInitConvertIdentity) ;
+	ret &= field_subtests::testInvDivConsistency(F, desc, iterations) ;
+	ret &= field_subtests::testFieldInversion (F, desc, iterations) ;
+	ret &= field_subtests::testFieldCommutativity (F, desc, iterations) ;
+	ret &= field_subtests::testFreshmansDream(F, desc, iterations);
+	ret &= field_subtests::testRingTrivia(F,desc);
 
 	commentator().stop (MSG_STATUS (ret));
 	delete[] st;
@@ -1408,7 +1453,7 @@ bool testRandomIterator (const Field &F, const char *text,
 
 	/* This test either passes or runs a lot of times */
 	for (int i = 1;
-	     (!  subtests::testRandomIteratorStep (F, text, num_trials, num_categories, hist_len)) && (i <= 2) ;
+	     (!  field_subtests::testRandomIteratorStep (F, text, num_trials, num_categories, hist_len)) && (i <= 2) ;
 	     ++i ){
 		//if (0 == i % 5)
 			//std::ostream &report = commentator().report (LinBox::Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION) << "Warning! Probable failure of uniformity" << std::endl;
@@ -1425,11 +1470,11 @@ bool testRandomIterator (const Field &F, const char *text,
 //@}
 #endif // __LINBOX_test_field_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
 
diff --git a/tests/test-frobenius.C b/tests/test-frobenius.C
index 67a7b8e..eb11b27 100644
--- a/tests/test-frobenius.C
+++ b/tests/test-frobenius.C
@@ -2,20 +2,20 @@
  * Copyright (C) LinBox
  * Written by Austin Lobo, David Saunders
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -34,10 +34,10 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
+
 
 #include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 #include "linbox/blackbox/scalar-matrix.h"
 #include "linbox/blackbox/frobenius.h"
 
@@ -58,7 +58,7 @@ int main (int argc, char **argv)
 		END_OF_ARGUMENTS
 	};
 
-	typedef Modular<uint32_t> Field;
+	typedef Givaro::Modular<uint32_t> Field;
 	typedef vector<Field::Element> Vector;
 	typedef Vector Polynomial;
 	typedef vector<Polynomial> Plist;
@@ -72,22 +72,22 @@ int main (int argc, char **argv)
 	size_t  pdeg = 10;
 	plist[0].resize(pdeg+1);
 	for ( size_t i=0; i < pdeg; ++i) r.random(plist[0][i]);
-	F.init(plist[0][pdeg],1);
+	F.assign(plist[0][pdeg],F.one);
 
 	pdeg = 6;
 	plist[1].resize(pdeg+1);
 	for ( size_t i=0; i < pdeg; ++i) r.random(plist[1][i]);
-	F.init(plist[1][pdeg],1);
+	F.assign(plist[1][pdeg],F.one);
 
 	pdeg = 4;
 	plist[2].resize(pdeg+1);
 	for ( size_t i=0; i < pdeg; ++i) r.random(plist[2][i]);
-	F.init(plist[2][pdeg],1);
+	F.assign(plist[2][pdeg],F.one);
 
 	commentator().start("Frobenius form black box test suite", "frobenius");
 	Frobenius<Field>  A(F, plist.begin(), plist.end());
 
-	pass = pass && testBlackbox(A);
+	pass = pass && testBlackboxNoRW(A);
 
 	commentator().stop("Frobenius form black box test suite");
 	return pass ? 0 : -1;
diff --git a/tests/test-ftrmm.C b/tests/test-ftrmm.C
index 8389228..b9964cc 100644
--- a/tests/test-ftrmm.C
+++ b/tests/test-ftrmm.C
@@ -1,22 +1,22 @@
 /* fflas/test-ftrmm.inl
  * Copyright (C) 2010 LinBox
  *
- * Written by Brice Boyer <Brice.Boyer at imag.fr>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
  *
- * 
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -38,7 +38,7 @@
 //#define DEBUG
 
 #include <cassert>
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 #include "linbox/linbox-config.h"
 #include "fflas-ffpack/fflas/fflas.h"
 #include "fflas-ffpack/ffpack/ffpack.h"
@@ -48,14 +48,13 @@
 //#define __LINBOX_HAVE_INT64
 
 
-#include "linbox/field/modular-balanced.h"
-#include "linbox/field/modular.h"
+#include <givaro/modular-balanced.h>
 #include "fflas-ffpack/utils/Matio.h"
 #include "test-common.h"
 
 //#define _LB_TIME
 #define _LB_MAX_SZ 50
-#define _LB_ITERS 3
+#define _LB_ITERS 1
 //#define _LB_DEBUG
 
 
@@ -102,30 +101,30 @@ int test_ftrmm(std::ostream & report, const Field & F)
 	assert(D);
 
 	typedef typename Field::RandIter RandIter;
+	typedef typename Field::NonZeroRandIter NonZeroRandIter;
 	report << '#' ;
 	RandIter G(F);
-	NonzeroRandIter<Field> Gn(F,G);
+	NonZeroRandIter Gn(F,G);
 
 	/* init A,B,C and more...*/
 	for (size_t i = 0 ; i < rows*lda ; ++i) G.random( *(A+i) ) ;
 #ifdef _LB_DEBUG
 	Element * E = new Element[rows*lda]; // copy of A
 	assert(E);
-	FFLAS::fcopy(F,rows*lda,E,1,A,1);
+	FFLAS::fassign(F,rows*lda,A,1,E,1);
 	// for (size_t i = 0 ; i < rows*lda ; ++i) *(E+i) = *(A+i);
 #endif
 
 	for (size_t i = 0 ; i < rows*ldb  ; ++i) G.random( *(B+i) ) ;
 
-	Element zero ; F.init(zero,0UL);
-	for (size_t i = 0 ; i < M*N ; ++i) *(C+i) = zero;
+	for (size_t i = 0 ; i < M*N ; ++i) *(C+i) = F.zero;
 	// for (size_t i = 0 ; i < rows*ldb ; ++i) *(D+i) = *(B+i);
-	FFLAS::fcopy(F,rows*ldb,D,1,B,1);
+	FFLAS::fassign(F,rows*ldb,B,1,D,1);
 	Element alpha ;
 	//! @todo F.isInvertible()
 	//! @todo InvertibleRandomIter
 	Element invalpha ;
-	F.init(invalpha,0UL);
+	F.assign(invalpha,F.zero);
 	Gn.random(alpha);
 	// F.init(alpha,1UL);
 	F.inv(invalpha,alpha);
@@ -205,6 +204,7 @@ int test_ftrmm(std::ostream & report, const Field & F)
 				else // C = M * L^t
 					for (size_t i = 0 ; i < M ; ++i)
 						for (size_t j = 0 ; j < N ; ++j)
+							//! @bug same code as above ?
 							F.addin(*(C+i*N+j),*(B+i*ldb+j));
 			else
 				if (Trans == FFLAS::FflasNoTrans) // C = M * U
@@ -214,6 +214,7 @@ int test_ftrmm(std::ostream & report, const Field & F)
 				else // C = M * U^t
 					for (size_t i = 0 ; i < M ; ++i)
 						for (size_t j = 0 ; j < N ; ++j)
+							//! @bug same code as above ?
 							F.addin(*(C+i*N+j),*(B+i*ldb+j));
 		}
 		else // left
@@ -248,6 +249,7 @@ int test_ftrmm(std::ostream & report, const Field & F)
 				else // C = M * L^t
 					for (size_t i = 0 ; i < M ; ++i)
 						for (size_t j = 0 ; j < N ; ++j)
+							//! @bug same code as above ?
 							F.axpyin(*(C+i*N+j),*(B+i*ldb+j),*(A+j*lda+j));
 			else
 				if (Trans == FFLAS::FflasNoTrans) // C = M * U
@@ -257,6 +259,7 @@ int test_ftrmm(std::ostream & report, const Field & F)
 				else // C = M * U^t
 					for (size_t i = 0 ; i < M ; ++i)
 						for (size_t j = 0 ; j < N ; ++j)
+							//! @bug same code as above ?
 							F.axpyin(*(C+i*N+j),*(B+i*ldb+j),*(A+j*lda+j));
 		}
 		else // left
@@ -269,6 +272,7 @@ int test_ftrmm(std::ostream & report, const Field & F)
 				else // C = L^t * M
 					for (size_t i = 0 ; i < M ; ++i)
 						for (size_t j = 0 ; j < N ; ++j)
+							//! @bug same code as above ?
 							F.axpyin(*(C+i*N+j),*(A+i*lda+i),*(B+i*ldb+j));
 			else
 				if (Trans == FFLAS::FflasNoTrans) // C = U * M
@@ -278,6 +282,7 @@ int test_ftrmm(std::ostream & report, const Field & F)
 				else // C = M * U^t
 					for (size_t i = 0 ; i < M ; ++i)
 						for (size_t j = 0 ; j < N ; ++j)
+							//! @bug same code as above ?
 							F.axpyin(*(C+i*N+j),*(A+i*lda+i),*(B+i*ldb+j));
 		}
 
@@ -311,7 +316,7 @@ int test_ftrmm(std::ostream & report, const Field & F)
 		{
 			report<<"#-------------T-------------" <<std::endl;
 			report << "T :=" ;
-			write_field(F,report,UpLo,Diag,E,rows,lda,lda,true);
+			// write_field(F,report,UpLo,Diag,E,rows,lda,lda,true);
 			report << ':' << std::endl;
 			report<<"#------------TT--------------" <<std::endl;
 			report << "TT := " ; write_field(F,report,E,rows,lda,lda,true);
@@ -319,15 +324,15 @@ int test_ftrmm(std::ostream & report, const Field & F)
 
 			report<<"#-------------M-------------" <<std::endl;
 			report << "M :=" ;
-			write_field(F,report,D,M,N,ldb,true);
+			// write_field(F,report,D,M,N,ldb,true);
 			report << ':' << std::endl;
 			report<<"#------------a--------------" <<std::endl;
 			report << "alpha := " << alpha << ':' << std::endl;
 			report<<"#------------C--------------" <<std::endl;
-			report << "C := " ; write_field(F,report,C,M,N,N,true);
+			// report << "C := " ; write_field(F,report,C,M,N,N,true);
 			report << ':' << std::endl;
 			report << "#------------B--------------" << std::endl;
-			report << "B := " ; write_field(F,report,B,M,N,ldb,true);
+			// report << "B := " ; write_field(F,report,B,M,N,ldb,true);
 			report << ':' << std::endl;
 			report << "N := alpha * " ;
 			if (Side == FFLAS::FflasRight)
@@ -373,7 +378,7 @@ int test_ftrmm(std::ostream & report, const Field & F)
 	int eur = 0 ;
 
 	// for (size_t i = 0 ; i < rows*ldb ; ++i) *(B+i) = *(D+i);
-	FFLAS::fcopy(F,rows*ldb,B,1,D,1);
+	FFLAS::fassign(F,rows*ldb,D,1,B,1);
 	if (Diag == FFLAS::FflasNonUnit)
 		for (size_t i = 0 ; i < K ; ++i) Gn.random(*(A+i*(lda+1))) ; // invertible diag !
 	FFLAS::ftrmm(F, Side, UpLo, Trans, Diag, M, N, alpha,    A, lda, B, ldb);
@@ -427,9 +432,10 @@ int test_applyP(std::ostream & report, const Field & F)
 	assert(B);
 
 	typedef typename Field::RandIter RandIter;
+	typedef typename Field::NonZeroRandIter NonZeroRandIter;
 	report << '#' ;
 	RandIter G(F);
-	NonzeroRandIter<Field> Gn(F,G);
+	NonZeroRandIter Gn(F,G);
 
 	/* init A,B,C and more...*/
 	for (size_t i = 0 ; i < M*lda ; ++i) G.random( *(A+i) ) ;
@@ -438,19 +444,19 @@ int test_applyP(std::ostream & report, const Field & F)
 	report << "# testing row applyP" << std::endl;
 	size_t * P = new size_t[M] ;
 
-	size_t r = random()%M ;
+	size_t r = (size_t)random()%M ;
 	for (size_t i = 0 ; i < r ; ++i){
-		P[i] = i + (size_t)(M-i)*( (std::max(0.,drand48()-1e-6)) ); // histoire de pas tomber sur 1...
+		P[i] = i + (size_t)((double)(M-i)*( (std::max(0.,drand48()-1e-6)))); // histoire de pas tomber sur 1...
 		//                if (P[i] == M) P[i]-- ;
 		assert(P[i] < M);
 	}
 
 	FFPACK::applyP(F,FFLAS::FflasLeft,FFLAS::FflasNoTrans,
-		       N, 0,r,
+		       N, 0,(int)r,
 		       A,lda,P);
 
 	FFPACK::applyP(F,FFLAS::FflasLeft,FFLAS::FflasTrans,
-		       N, 0,r,
+		       N, 0,(int)r,
 		       A,lda,P);
 	delete[] P ;
 	int err = 0 ;
@@ -466,19 +472,19 @@ int test_applyP(std::ostream & report, const Field & F)
 	report << "# testing col applyP" << std::endl;
 	size_t * Q = new size_t[N] ;
 
-	r = random()%N ;
+	r = (size_t)random()%N ;
 	for (size_t i = 0 ; i < r ; ++i){
-		Q[i] = i + (size_t)(N-i)*( std::max(0.,drand48()-1e-6)) ;
+		Q[i] = i + (size_t)((double)(N-i)*( std::max(0.,drand48()-1e-6)) );
 		//                if (Q[i] == N) P[i]-- ;
 		assert(Q[i] < N);
 	}
 
 	FFPACK::applyP(F,FFLAS::FflasRight,FFLAS::FflasNoTrans,
-		       M, 0,r,
+		       M, 0,(int)r,
 		       A,lda,Q);
 
 	FFPACK::applyP(F,FFLAS::FflasRight,FFLAS::FflasTrans,
-		       M, 0,r,
+		       M, 0,(int)r,
 		       A,lda,Q);
 	delete[] Q ;
 
@@ -528,15 +534,16 @@ int test_fgemm(std::ostream & report, const Field & F)
 #endif
 
 	typedef typename Field::RandIter RandIter;
+	typedef typename Field::NonZeroRandIter NonZeroRandIter;
 	report << "#" ;
 	RandIter G(F);
-	NonzeroRandIter<Field> Gn(F,G);
+	NonZeroRandIter Gn(F,G);
 	typedef typename Field::Element Element;
 
 	Element alpha, beta ;
 	// G.random(alpha);
 	// G.random(beta);
-	alpha = Integer::random<false>(2);
+	alpha = (Element)Integer::random<false>(2);
 	if (abs(alpha) > 1.5 ) G.random(alpha);
 	//!@bug needs p prime.
 	beta  = Integer::random<false>(2);
@@ -566,7 +573,7 @@ int test_fgemm(std::ostream & report, const Field & F)
 			for (size_t i = 0 ; i < M ; ++i)
 				for (size_t j = 0 ; j < N ; ++j) {
 					Element temp;
-					F.init(temp,0UL);
+					F.assign(temp,F.zero);
 					for (size_t k = 0 ; k < K ; ++k)
 						F.axpyin(temp,A[i*lda+k],B[k*ldb+j]);
 					F.mulin(C[i*ldc+j],beta);
@@ -576,7 +583,7 @@ int test_fgemm(std::ostream & report, const Field & F)
 			for (size_t i = 0 ; i < M ; ++i)
 				for (size_t j = 0 ; j < N ; ++j) {
 					Element temp;
-					F.init(temp,0UL);
+					F.assign(temp,F.zero);
 					for (size_t k = 0 ; k < K ; ++k)
 						F.axpyin(temp,A[i*lda+k],B[j*ldb+k]);
 					F.mulin(C[i*ldc+j],beta);
@@ -587,7 +594,7 @@ int test_fgemm(std::ostream & report, const Field & F)
 			for (size_t i = 0 ; i < M ; ++i)
 				for (size_t j = 0 ; j < N ; ++j) {
 					Element temp;
-					F.init(temp,0UL);
+					F.assign(temp,F.zero);
 					for (size_t k = 0 ; k < K ; ++k)
 						F.axpyin(temp,A[k*lda+i],B[k*ldb+j]);
 					F.mulin(C[i*ldc+j],beta);
@@ -597,7 +604,7 @@ int test_fgemm(std::ostream & report, const Field & F)
 			for (size_t i = 0 ; i < M ; ++i)
 				for (size_t j = 0 ; j < N ; ++j) {
 					Element temp;
-					F.init(temp,0UL);
+					F.assign(temp,F.zero);
 					for (size_t k = 0 ; k < K ; ++k)
 						F.axpyin(temp,A[k*lda+i],B[j*ldb+k]);
 					F.mulin(C[i*ldc+j],beta);
@@ -629,14 +636,14 @@ int test_fgemm(std::ostream & report, const Field & F)
 
 int main(int ac, char ** av)
 {
-	//typedef ModularBalanced<float>  FieldF;
-	typedef Modular<float>          FieldF;
-	//typedef ModularBalanced<double> FieldD;
-	typedef Modular<double>         FieldD;
-	//typedef ModularBalanced<int32_t>  FieldI;
-	typedef Modular<int32_t>          FieldI;
+	//typedef Givaro::ModularBalanced<float>  FieldF;
+	typedef Givaro::Modular<float>          FieldF;
+	//typedef Givaro::ModularBalanced<double> FieldD;
+	typedef Givaro::Modular<double>         FieldD;
+	//typedef Givaro::ModularBalanced<int32_t>  FieldI;
+	typedef Givaro::Modular<int32_t>          FieldI;
 	//!@bug : this one completely fails :
-	//typedef Modular<Integer>          FieldI;
+	//typedef Givaro::Modular<Integer>          FieldI;
 
        	static Argument as[] = {
 		END_OF_ARGUMENTS
@@ -644,7 +651,7 @@ int main(int ac, char ** av)
 
 	parseArguments (ac, av, as);
 
-	srand(time(NULL));
+	srand((unsigned int)time(NULL));
 	bool fail = false ;
 
 	LinBox::commentator().start("ftrmm and consorts full test suite", "ftrmm et al");
@@ -658,11 +665,11 @@ int main(int ac, char ** av)
 	FieldF FF(13);
 	FieldF FF2(1069);
 	FieldI FI(13);
-	FieldI FI2(106739);
+	FieldI FI2(10687);
 	int tot = 6;
 #ifdef __LINBOX_HAVE_INT64
-	//        typedef ModularBalanced<int64_t>  FieldU;
-	typedef Modular<int64_t>          FieldU;
+	//        typedef Givaro::ModularBalanced<int64_t>  FieldU;
+	typedef Givaro::Modular<int64_t>          FieldU;
 	FieldU FU(13);
 	FieldU FU2(13132153);
 	tot += 2 ;
@@ -847,9 +854,11 @@ int main(int ac, char ** av)
 	if (fail)
 		report << "# \033[1;31m>\033[0m ftr(s/m)m failed" << std::endl;
 #endif
-	int our = tot = 6*_LB_ITERS*2 ;
+
 #ifdef __LINBOX_HAVE_INT64
-	our = tot = tot+2*_LB_ITERS*2 ;
+	int our = tot = tot+2*_LB_ITERS*2 ;
+#else
+	int our = tot = 6*_LB_ITERS*2 ;
 #endif
 
 	//-------//
@@ -872,16 +881,18 @@ int main(int ac, char ** av)
 #ifdef DEBUG
 	report << "# \033[1;33m>\033[0m applyP  passed " << our << "/" << tot << "tests" <<std::endl;
 #endif
-	if (our != tot) fail = true;
+	if (our != tot) {
+		fail = true;
 #ifdef DEBUG
-	if (our != tot)
 		report << "# \033[1;31m>\033[0m applyP failed" << std::endl;
 #endif
+	}
 
 
-	our = tot = 4*_LB_ITERS*6 ;
 #ifdef __LINBOX_HAVE_INT64
 	our = tot = tot+4*_LB_ITERS*2 ;
+#else
+	our = tot = 4*_LB_ITERS*6 ;
 #endif
 
 	//-------//
diff --git a/tests/test-generic.h b/tests/test-generic.h
index 6a49bb6..c4611cf 100644
--- a/tests/test-generic.h
+++ b/tests/test-generic.h
@@ -1,19 +1,19 @@
 /* linbox/tests/test-generic.h
  * Copyright (C) 2001, 2002 Bradford Hovinen
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -45,11 +45,10 @@
 
 #endif // __LINBOX_test_generic_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-getentry.C b/tests/test-getentry.C
index f03d9b1..7a7446e 100644
--- a/tests/test-getentry.C
+++ b/tests/test-getentry.C
@@ -6,20 +6,20 @@
  *
  * --------------------------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -40,18 +40,18 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
+
 #include <cstdio>
 
 #include "test-common.h"
 
 #include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 #include "linbox/solutions/getentry.h"
 #include "linbox/blackbox/compose.h"
 #include "linbox/blackbox/diagonal.h"
 #include "linbox/blackbox/scalar-matrix.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/vector/stream.h"
 
 using namespace LinBox;
@@ -63,11 +63,11 @@ bool testGenericBBgetEntry (const Field &F, size_t n)
 	bool ret = true;
     typename Field::Element s, x, z;
 	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
-	F.init(x, 0);
+	F.assign(x, F.zero);
 	F.init(s, 2);
-	F.init(z, 0);
-	ScalarMatrix<Field> B(F, n, s);
-	typename GetEntryTags::GenericBB t;
+	F.assign(z, F.zero);
+	ScalarMatrix<Field> B(F, n, n, s);
+	SolutionTags::Generic t;
 	//getEntry(x, B, 0, n-1, t);
 	if (n > 1 && !F.isZero(x)) ret = false;
 	getEntry(x, B, 0, 0, t);
@@ -84,10 +84,10 @@ bool testScalarMatrixgetEntry (const Field &F, size_t n)
 	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
 	report << "scalarmatrix getEntry test (using specialization)" << endl;
     typename Field::Element s, t, r, th;
-	F.init(r, 0);
+	F.assign(r, F.zero);
 	F.init(s, 2);
 	F.init(th, 2);
-	ScalarMatrix<Field> B(F, n, s);
+	ScalarMatrix<Field> B(F, n, n, s);
 	getEntry(t, B, 0, n-1); F.assign(r,t);
 		report << "0xn-1" << t << endl;
   	getEntry(t, B, n-1, 0); F.addin(r,t);
@@ -198,10 +198,9 @@ static bool testDenseMatrixgetEntry (const Field &F, size_t n)
 }
 
 /* getEntry of diagonal matrix */
-template <class Field>
-static bool testDiagonalgetEntry (const Field &F, VectorStream<vector<typename Field::Element> > &stream)
+template <class Field,class Vector>
+static bool testDiagonalgetEntry (const Field &F, VectorStream<Vector > &stream)
 {
-	typedef vector <typename Field::Element> Vector;
 	typedef Diagonal <Field> Blackbox;
 
 	commentator().start ("Testing diagonal getEntry", "testDiagonalgetEntry", stream.m ());
@@ -212,7 +211,7 @@ static bool testDiagonalgetEntry (const Field &F, VectorStream<vector<typename F
 	bool ret = true;
 	size_t i;
 
-	Vector d;
+	Vector d(F);
 	typename Field::Element sigma, res, ge;
 
 	VectorWrapper::ensureDim (d, stream.dim ());
@@ -226,7 +225,7 @@ static bool testDiagonalgetEntry (const Field &F, VectorStream<vector<typename F
 		VD.write (report, d);
 		report << endl;
 
-		F.init (sigma, 0);
+		F.assign(sigma, F.zero);
 		for (i = 0; i < stream.n (); i++)
 			F.addin (sigma, VectorWrapper::constRef<Field, Vector> (d, i));
 
@@ -234,10 +233,10 @@ static bool testDiagonalgetEntry (const Field &F, VectorStream<vector<typename F
 		F.write (report, sigma);
 		report << endl;
 
-		Blackbox D (F, d);
+		Blackbox D (d);
 
 
-		F.init (res, 0);
+		F.assign(res, F.zero);
 		for (i = 0; i < stream.n (); i++)
 			F.addin (res, getEntry (ge, D, i, i));
                 F.addin(res, getEntry (ge, D, 0,stream.n ()-1));
@@ -270,16 +269,16 @@ bool testSpecialCDgetEntry (const Field &F, size_t n)
 	typedef typename Field::Element Elt;
 	typedef ScalarMatrix<Field> BB;
 	typedef Diagonal<Field> DD;
-    Elt s, x, t, u;
+	Elt s, x, t, u;
 	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
-	F.init(x, 0);
+	F.assign(x, F.zero);
 	F.init(s, 2);
-	F.init(t, 0);
-	F.init(u, 0);
+	F.assign(t, F.zero);
+	F.assign(u, F.zero);
 	F.mul(u, s, t);
-	BB B(F, n, s);
-	vector<Elt> d(n, t);
-	DD D(F, d);
+	BB B(F, n, n, s);
+	BlasVector<Field> d(F,n, t);
+	DD D(d);
 	Compose<DD, BB> CDB (D, B);
 	Compose<BB, DD> CBD (B, D);
 	Compose<DD, DD> CDD (D, D);
@@ -314,16 +313,16 @@ int main (int argc, char **argv)
 		END_OF_ARGUMENTS
 	};
 
-	typedef Modular<int32_t> Field;
-	typedef vector<Field::Element> Vector;
+	typedef Givaro::Modular<int32_t> Field;
+	typedef BlasVector<Field> Vector;
 
 	parseArguments (argc, argv, args);
-	Field F (q);
+	Field F (q); Field::RandIter gen(F);
 
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	commentator().start("getEntry solution test suite", "getEntry");
 
-	RandomDenseStream<Field, Vector> stream (F, n, iterations);
+	RandomDenseStream<Field, Vector> stream (F, gen, n, (unsigned int)iterations);
 
 	if (!testGenericBBgetEntry (F, n)) pass = false;
 	if (!testScalarMatrixgetEntry (F, n)) pass = false;
@@ -336,11 +335,10 @@ int main (int argc, char **argv)
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-gf2.C b/tests/test-gf2.C
index 4ac790d..9dfd747 100644
--- a/tests/test-gf2.C
+++ b/tests/test-gf2.C
@@ -3,28 +3,28 @@
  * Copyright (C) 2003 Bradford Hovinen,
  *
  * Written by Bradford Hovinen <hovinen at cis.udel.edu>,
- *
+ * Updated Mar2016 -bds
  * ------------------------------------
  * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
  *
  * Rename from test-large-modular.C to test-modular.C; made other updates in
- * accordance with changes to Modular interace.
+ * accordance with changes to Givaro::Modular interace.
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -32,275 +32,34 @@
  *.
  */
 
-
 /*! @file  tests/test-gf2.C
  * @ingroup tests
- * @brief  no doc
- * @test NO DOC
+ * @brief  basic field functionality check
  */
 
-
-
 #include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <sstream>
-#include <vector>
-#include <queue>
-
 #include "linbox/field/gf2.h"
-#include "linbox/field/modular.h"
-
 #include "test-field.h"
-// #include "test-generic.h"
-// #include "test-vector-domain.h"
 
 using namespace LinBox;
-//using uint16_t;
-//using uint32_t;
-
-#pragma message "#warning much of the code is dead here"
-
-#if 0 /*  dead code */
-static bool testDotProductGF2 (const GF2 &F, const char *, //desc,
-			       VectorStream<Vector<GF2>::Dense> &stream1,
-			       VectorStream<Vector<GF2>::Dense> &stream2)
-{
-	LinBox::commentator().start ("Testing GF2 dot product (dense/dense)", "testDotProduct", stream1.size ());
-
-	bool ret = true;
-
-	Vector<GF2>::Dense v1, v2;
-
-	Modular<uint16_t> MF (2);
-	VectorDomain<Modular<uint16_t> > MF_VD (MF);
-
-	LinBox::Vector<Modular<uint16_t> >::Dense w1 (stream1.dim ()), w2 (stream1.dim ());
-
-	uint16_t sigma;
-	bool rho;
-
-	LinBox::VectorDomain<GF2> VD (F);
-
-	v1.resize (stream1.dim ());
-	v2.resize (stream2.dim ());
-
-	Vector<GF2>::Dense::const_iterator i1;
-	Vector<GF2>::Dense::const_iterator i2;
-	Vector<Modular<uint16_t> >::Dense::iterator j1, j2;
-
-	Timer timer;
-	double totaltime = 0.0;
-
-	while (stream1 && stream2) {
-		LinBox::commentator().startIteration ((unsigned int)stream1.j ());
-
-		stream1.next (v1);
-		stream2.next (v2);
-
-		// Copy v1 and v2 into w1 and w2
-		for (i1 = v1.begin (), j1 = w1.begin (); i1 != v1.end (); ++i1, ++j1) {
-			if (*i1)
-				*j1 = 1;
-			else
-				*j1 = 0;
-		}
-
-		for (i2 = v2.begin (), j2 = w2.begin (); i2 != v2.end (); ++i2, ++j2) {
-			if (*i2)
-				*j2 = 1;
-			else
-				*j2 = 0;
-		}
-
-		std::ostream &report = LinBox::commentator().report (LinBox::Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
-		report << "Input vector 1:  ";
-		VD.write (report, v1) << std::endl;
-
-		report << "Input vector 2:  ";
-		VD.write (report, v2) << std::endl;
-
-		timer.start ();
-		VD.dot (rho, v1, v2);
-		timer.stop ();
-		totaltime += timer.realtime ();
-
-		MF_VD.dot (sigma, w1, w2);
-		sigma &= 1;
-
-		report << "True dot product: ";
-		F.write (report, sigma) << std::endl;
-
-		report << "Dot product from vector domain: ";
-		F.write (report, rho) << std::endl;
-
-		if ((sigma && !rho) || (rho && !sigma)) {
-			ret = false;
-			LinBox::commentator().report (LinBox::Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-				<< "ERROR: Dot products are not equal" << std::endl;
-		}
-
-		LinBox::commentator().stop ("done");
-		LinBox::commentator().progress ();
-	}
-
-	LinBox::commentator().report (LinBox::Commentator::LEVEL_IMPORTANT, TIMING_MEASURE)
-		<< "Average time for dot product: " << totaltime / (double)stream1.m () << std::endl;
-
-	LinBox::commentator().stop (MSG_STATUS (ret), (const char *) 0, "testDotProduct");
-
-	stream1.reset ();
-	stream2.reset ();
-
-	return ret;
-}
-
-static bool testDotProductGF2 (const GF2 &F, const char *, //desc,
-			       VectorStream<Vector<GF2>::Dense> &stream1,
-			       VectorStream<Vector<GF2>::Sparse> &stream2)
-{
-	LinBox::commentator().start ("Testing GF2 dot product (dense/sparse)", "testDotProduct", stream1.size ());
-
-	bool ret = true;
-
-	Vector<GF2>::Dense v1;
-	Vector<GF2>::Sparse v2;
-
-	Modular<uint16_t> MF (2);
-	VectorDomain<Modular<uint16_t> > MF_VD (MF);
-
-	LinBox::Vector<Modular<uint16_t> >::Dense w1 (stream1.dim ());
-	LinBox::Vector<Modular<uint16_t> >::SparseSeq w2;
-
-	uint16_t sigma;
-	bool rho;
-
-	LinBox::VectorDomain<GF2> VD (F);
-
-	v1.resize (stream1.dim ());
-
-	Vector<GF2>::Dense::const_iterator i1;
-	Vector<GF2>::Sparse::const_iterator i2;
-	Vector<Modular<uint16_t> >::Dense::iterator j1;
-
-	Timer timer;
-	double totaltime = 0.0;
-
-	while (stream1 && stream2) {
-		LinBox::commentator().startIteration ((unsigned int)stream1.j ());
-
-		stream1.next (v1);
-		stream2.next (v2);
-
-		// Copy v1 and v2 into w1 and w2
-		for (i1 = v1.begin (), j1 = w1.begin (); i1 != v1.end (); ++i1, ++j1) {
-			if (*i1)
-				*j1 = 1;
-			else
-				*j1 = 0;
-		}
-
-		w2.clear ();
-
-		for (i2 = v2.begin (); i2 != v2.end (); ++i2)
-			w2.push_back (std::pair<size_t, uint16_t> (*i2, 1));
-
-		std::ostream &report = LinBox::commentator().report (LinBox::Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
-		report << "Input vector 1:  ";
-		VD.write (report, v1) << std::endl;
-
-		report << "Input vector 2:  ";
-		VD.write (report, v2) << std::endl;
-
-		timer.start ();
-		VD.dot (rho, v1, v2);
-		timer.stop ();
-		totaltime += timer.realtime ();
-
-		MF_VD.dot (sigma, w1, w2);
-		sigma &= 1;
-
-		report << "True dot product: ";
-		F.write (report, sigma) << std::endl;
-
-		report << "Dot product from vector domain: ";
-		F.write (report, rho) << std::endl;
-
-		if ((sigma && !rho) || (rho && !sigma)) {
-			ret = false;
-			LinBox::commentator().report (LinBox::Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-				<< "ERROR: Dot products are not equal" << std::endl;
-		}
-
-		LinBox::commentator().stop ("done");
-		LinBox::commentator().progress ();
-	}
-
-	LinBox::commentator().report (LinBox::Commentator::LEVEL_IMPORTANT, TIMING_MEASURE)
-		<< "Average time for dot product: " << totaltime / (double)stream1.m () << std::endl;
-
-	LinBox::commentator().stop (MSG_STATUS (ret), (const char *) 0, "testDotProduct");
-
-	stream1.reset ();
-	stream2.reset ();
-
-	return ret;
-}
-#endif
 
 int main (int argc, char **argv)
 {
-	static unsigned int n = 1000;
-	static int iterations = 2;
-	static int trials = 100000;
-	static int categories = 100;
-	static int hist_level = 1;
+	static unsigned int n = 100;
 
 	static Argument args[] = {
 		{ 'n', "-n N", "Set dimension of test vectors to NxN.",      TYPE_INT,     &n },
-		{ 'i', "-i I", "Perform each test for I iterations.",           TYPE_INT,     &iterations },
-		{ 't', "-t T", "Number of trials for the random iterator test.", TYPE_INT, &trials },
-		{ 'c', "-c C", "Number of categories for the random iterator test.", TYPE_INT, &categories },
-		{ 'H', "-H H", "History level for random iterator test.", TYPE_INT, &hist_level },
 		END_OF_ARGUMENTS
 	};
-
 	parseArguments (argc, argv, args);
 
-	commentator().start("GF2 field test suite", "GF2");
 	bool pass = true;
+	commentator().start("GF2 field test suite", "GF2");
 
 	GF2 F;
 
-	uint32_t seed = (unsigned)time (NULL);
-
-	RandomDenseStreamGF2 stream1 (F, seed, n, iterations), stream2 (F, seed ^ 0xdeadbeef, n, iterations);
-	RandomSparseStreamGF2<Vector<GF2>::Sparse>
-		stream3 (F, seed + 2, 0.1, n, iterations),
-		stream4 (F, seed + 3, 0.1, n, iterations);
-
-	// Make sure some more detailed messages get printed
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
-
-	commentator().start ("Testing GF2", "main", 10);
-
-
-	if ( not testField (F, "GF2"))
-		pass = false;
-	commentator().progress ();
-
-/*
-	if ( not testDotProductGF2 (F, "Testing dot prod", stream1, stream3))
-		pass = false;
-	commentator().progress ();
-*/
-#if 0
-	FieldArchetype K(new LargeModular(101));
-	if (!testField<FieldArchetype> (K, "Testing archetype with envelope of Modular field"))
-		pass = false;
-#endif
+	pass = pass and testField (F, "GF2");
+	pass = pass and runFieldTests (F, "GF2", 1, n, false);
 
 	commentator().stop("GF2 field test suite");
 	return pass ? 0 : -1;
diff --git a/tests/test-givaro-fields.C b/tests/test-givaro-fields.C
deleted file mode 100644
index f0c5be4..0000000
--- a/tests/test-givaro-fields.C
+++ /dev/null
@@ -1,180 +0,0 @@
-/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
-
-/* tests/test-givaro-fields.C
- * -bds 2012.
- * Merger of test-givaro-zpz.C and test-givaro-zpzuns.C
- * written by Pascal Giorgi  <pascal.giorgi at ens-lyon.fr>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-
-/*! @file  tests/test-givaro-fields.C
- * @ingroup tests
- * @brief  test fields build on Givaro
- * @test NO DOC
- */
-
-
-
-#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <vector>
-
-#include "linbox/field/givaro.h"
-
-#include "test-common.h"
-#include "test-field.h"
-
-#ifndef TEST_ARCHETYPES
-#define TEST_ARCHETYPES 1
-#endif
-
-using namespace LinBox;
-
-int main (int argc, char **argv)
-{
-        static integer q = 10733;
-	static size_t n = 10000;
-	static int iterations = 10;
-	static int e = 3;
-	static int trials = 10000;
-	static int categories = 1000;
-	static int hist_level = 10;
-
-
-        static Argument args[] = {
-                { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
-                { 'e', "-e E", "Use GF(q^e) for the extension field [1].",  TYPE_INT,     &e },
-		{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT,     &n },
-		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
-		{ 't', "-t T", "Number of trials for the random iterator test.", TYPE_INT, &trials },
-		{ 'c', "-c C", "Number of categories for the random iterator test.", TYPE_INT, &categories },
-		{ 'H', "-H H", "History level for random iterator test.", TYPE_INT, &hist_level },
-		END_OF_ARGUMENTS
-        };
-
-        parseArguments (argc, argv, args);
-
-	//cout << endl << "GivaroZpz< Givaro::Std16> field test suite" << endl;
-	//cout.flush ();
-	bool pass = true;
-
-        GivaroZpz< Givaro::Std16> F1 ( (q<256?q:integer(101)) ); // Does not work with q > 256
-	GivaroZpz< Givaro::Std32> F2 (q);
-	GivaroMontg F3 (39989);
-	GivaroGfq F4 (q, 1);
-	GivaroGfq F5 (11, e);
- 	GivaroExtension<GivaroGfq> F6 (F5, e );
- 	GivaroExtension<> F7 (103, 4 );
-        GivaroZpz< Givaro::Log16> F8 ( (q<256?q:integer(101)) ); // Does not work with q > 256
-
-	GivaroZpz< Givaro::Unsigned32> F1u (2);
-	GivaroZpz< Givaro::Unsigned32> F2u (q);
-	GivaroZpz< Givaro::Unsigned32> F3u (3);
-	GivaroZpz< Givaro::Unsigned32> F4u (32749);
-	GivaroZpz< Givaro::Unsigned32> F5u (65521);
-
-
-	LinBox::commentator().start("Givaro-zpz test suite", "GivZpz");
-	// Make sure some more detailed messages get printed
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
-
-	if (!runFieldTests (F1, "GivaroZpz< Givaro::Std16>", iterations, n, false)) pass = false;
-	if (!runFieldTests (F2, "GivaroZpz< Givaro::Std32>", iterations, n, false)) pass = false;
-	if (!runFieldTests (F3, "GivaroMontg", iterations, n, false)) pass = false;
-	if (!runFieldTests (F4, "GivaroGfq (prime)", iterations, n, false)) pass = false;
-	if (!runFieldTests (F5, "GivaroGfq (simple extension)", iterations, n, false)) pass = false;
-	if (!runFieldTests (F6, "GivaroExtension (small polynomial extension)", iterations, n, false)) pass = false;
-	if (!runFieldTests (F7, "GivaroExtension (large polynomial extension)", iterations, n, false)) pass = false;
-	if (!runFieldTests (F8, "GivaroLog13", iterations, n, false)) pass = false;
-	if (!runFieldTests (F1u, "Unsigned32-2",     iterations, n, false)) pass = false;
-	if (!runFieldTests (F2u, "Unsigned32-q", iterations, n, false)) pass = false;
-	if (!runFieldTests (F3u, "Unsigned32-3",     iterations, n, false)) pass = false;
-	if (!runFieldTests (F4u, "Unsigned32-32749", iterations, n, false)) pass = false;
-	if (!runFieldTests (F5u, "Unsigned32-65521", iterations, n, false)) pass = false;
-
-
-	if (!testRandomIterator (F1,  "GivaroZpz< Givaro::Std16>", trials, categories, hist_level)) pass = false;
-	if (!testRandomIterator (F2,  "GivaroZpz< Givaro::Std32>", trials, categories, hist_level)) pass = false;
-	if (!testRandomIterator (F3,  "GivaroMontgomery", trials, categories, hist_level)) pass = false;
-	if (!testRandomIterator (F4,  "GivaroGfq (prime)", trials, categories, hist_level)) pass = false;
-	if (!testRandomIterator (F5,  "GivaroGfq (simple extension)", trials, categories, hist_level)) pass = false;
-	if (!testRandomIterator (F6,  "GivaroExtension (small polynomial extension)", trials, categories, hist_level)) pass = false;
-	if (!testRandomIterator (F7,  "GivaroExtension (large polynomial extension)", trials, categories, hist_level)) pass = false;
-	if (!testRandomIterator (F1u,  "GivaroZpz< Givaro::Unsigned32>(2)", trials, categories, hist_level)) pass = false;
-	if (!testRandomIterator (F2u,  "GivaroZpz< Givaro::Unsigned32>(q)", trials, categories, hist_level)) pass = false;
-	if (!testRandomIterator (F3u,  "GivaroZpz< Givaro::Unsigned32>(3)", trials, categories, hist_level)) pass = false;
-	if (!testRandomIterator (F4u,  "GivaroZpz< Givaro::Unsigned32>(32749)", trials, categories, hist_level)) pass = false;
-	if (!testRandomIterator (F5u,  "GivaroZpz< Givaro::Unsigned32>(65521)", trials, categories, hist_level)) pass = false;
-
-
-
-
-#if TEST_ARCHETYPES
-
-	GivaroZpz< Givaro::Std16> * K1g = new GivaroZpz< Givaro::Std16> (101);
-	FieldArchetype K1(K1g);
-	if (!testField<FieldArchetype> (K1, "Testing archetype with envelope of GivaroZpz< Givaro::Std16> field"))
-		pass = false;
-	delete K1g;
-#endif
-
-#if TEST_ARCHETYPES
-	GivaroZpz< Givaro::Std32> * K2g = new GivaroZpz< Givaro::Std32>(101);
-	FieldArchetype K2(K2g);
-
-	if (!testField<FieldArchetype> (K2, "Testing archetype with envelope of GivaroZpz< Givaro::Std32> field"))
-		pass = false;
-	delete K2g;
-#endif
-
-#if TEST_ARCHETYPES
-	GivaroZpz< Givaro::Log16> * K3g = new GivaroZpz< Givaro::Log16>(101);
-	FieldArchetype K3(K3g);
-
-	if (!testField<FieldArchetype> (K3, "Testing archetype with envelope of GivaroZpz< Givaro::Log16> field"))
-		pass = false;
-	delete K3g;
-#endif
-
-#if TEST_ARCHETYPES
-	GivaroZpz< Givaro::Unsigned32> * K2gu = new GivaroZpz< Givaro::Unsigned32> (101);
-	FieldArchetype K2u(K2gu);
-	if (!testField<FieldArchetype> (K2u, "Testing archetype with envelope of GivaroZpz< Givaro::Unsigned32> field"))
-		pass = false;
-	delete K2gu;
-#endif
-
-#if TEST_ARCHETYPES
-	GivaroGfq * K4g = new GivaroGfq (101,1);
-	FieldArchetype K4(K4g);
-
-	if (!testField<FieldArchetype> (K4, "Testing archetype with envelope of GivaroGfq prime field"))
-		pass = false;
-	delete K4g;
-#endif
-
-
-	LinBox::commentator().stop(MSG_STATUS (pass), "GivaroZpz test suite");
-	return pass ? 0 : -1;
-}
-
-
diff --git a/tests/test-givaro-zpz.C b/tests/test-givaro-zpz.C
new file mode 100644
index 0000000..f6d1801
--- /dev/null
+++ b/tests/test-givaro-zpz.C
@@ -0,0 +1,190 @@
+
+/* tests/test-givaro-zpz.C
+ * Copyright (C) 2002 Pascal Giorgi
+ *
+ * Written by Pascal Giorgi  <pascal.giorgi at ens-lyon.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+/*! @file  tests/test-givaro-zpz.C
+ * @ingroup tests
+ * @brief  no doc
+ * @test NO DOC
+ */
+
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+
+#include "givaro/modular.h"
+#include "givaro/montgomery.h"
+#include "givaro/gfq.h"
+
+#include "test-common.h"
+#include "test-field.h"
+
+#ifndef TEST_ARCHETYPES
+#define TEST_ARCHETYPES 1
+#endif
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+        static integer q = 10733;
+	static size_t n = 10000;
+	static int iterations = 10;
+	static int e = 3;
+	static int trials = 10000;
+	static int categories = 1000;
+	static int hist_level = 10;
+
+
+        static Argument args[] = {
+                { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+                { 'e', "-e E", "Use GF(q^e) for the extension field [1].",  TYPE_INT,     &e },
+		{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT,     &n },
+		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
+		{ 't', "-t T", "Number of trials for the random iterator test.", TYPE_INT, &trials },
+		{ 'c', "-c C", "Number of categories for the random iterator test.", TYPE_INT, &categories },
+		{ 'H', "-H H", "History level for random iterator test.", TYPE_INT, &hist_level },
+		END_OF_ARGUMENTS
+        };
+
+        parseArguments (argc, argv, args);
+
+	//cout << endl << "Givaro::Modular< int16_t> field test suite" << endl;
+	//cout.flush ();
+	bool pass = true;
+
+        Givaro::Modular< int16_t> F1 ( (q<256?q:integer(101)) ); // Does not work with q > 256
+	Givaro::Modular< int32_t> F2 (q);
+	Givaro::Montgomery< int32_t > F3 (39989);
+	Givaro::GFqDom<int64_t> F4 (q, 1);
+	Givaro::GFqDom<int64_t> F5 (11, e);
+ 	Givaro::Extension<Givaro::GFqDom<int64_t>> F6 (F5, e );
+ 	Givaro::Extension<> F7 (103, 4 );
+        Givaro::Modular< Givaro::Log16> F8 ( (q<256?q:integer(101)) ); // Does not work with q > 256
+
+	Givaro::Modular< uint32_t> F1u (2);
+	Givaro::Modular< uint32_t> F2u (q);
+	Givaro::Modular< uint32_t> F3u (3);
+	Givaro::Modular< uint32_t> F4u (32749);
+	Givaro::Modular< uint32_t> F5u (65521);
+
+
+	LinBox::commentator().start("Givaro-zpz test suite", "GivZpz");
+	// Make sure some more detailed messages get printed
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
+
+	if (!runFieldTests (F1, "Givaro::Modular< int16_t>", (unsigned int)iterations, n, false)) pass = false;
+	if (!runFieldTests (F2, "Givaro::Modular< int32_t>", (unsigned int)iterations, n, false)) pass = false;
+	if (!runFieldTests (F3, "Givaro::Montgomery< int32_t >", (unsigned int)iterations, n, false)) pass = false;
+	if (!runFieldTests (F4, "Givaro::GFqDom<int64_t> (prime)", (unsigned int)iterations, n, false)) pass = false;
+	if (!runFieldTests (F5, "Givaro::GFqDom<int64_t> (simple extension)", (unsigned int)iterations, n, false)) pass = false;
+	if (!runFieldTests (F6, "Givaro::Extension (small polynomial extension)", (unsigned int)iterations, n, false)) pass = false;
+	if (!runFieldTests (F7, "Givaro::Extension (large polynomial extension)", (unsigned int)iterations, n, false)) pass = false;
+	if (!runFieldTests (F8, "GivaroLog13", (unsigned int)iterations, n, false)) pass = false;
+	if (!runFieldTests (F1u, "Unsigned32-2",     (unsigned int)iterations, n, false)) pass = false;
+	if (!runFieldTests (F2u, "Unsigned32-q", (unsigned int)iterations, n, false)) pass = false;
+	if (!runFieldTests (F3u, "Unsigned32-3",     (unsigned int)iterations, n, false)) pass = false;
+	if (!runFieldTests (F4u, "Unsigned32-32749", (unsigned int)iterations, n, false)) pass = false;
+	if (!runFieldTests (F5u, "Unsigned32-65521", (unsigned int)iterations, n, false)) pass = false;
+
+
+	if (!testRandomIterator (F1,  "Givaro::Modular< int16_t>", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+	if (!testRandomIterator (F2,  "Givaro::Modular< int32_t>", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+	if (!testRandomIterator (F3,  "Givaro::Montgomery< int32_t >", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+	if (!testRandomIterator (F4,  "Givaro::GFqDom<int64_t> (prime)", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+	if (!testRandomIterator (F5,  "Givaro::GFqDom<int64_t> (simple extension)", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+	if (!testRandomIterator (F6,  "Givaro::Extension (small polynomial extension)", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+	if (!testRandomIterator (F7,  "Givaro::Extension (large polynomial extension)", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+	if (!testRandomIterator (F1u,  "Givaro::Modular< uint32_t>(2)", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+	if (!testRandomIterator (F2u,  "Givaro::Modular< uint32_t>(q)", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+	if (!testRandomIterator (F3u,  "Givaro::Modular< uint32_t>(3)", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+	if (!testRandomIterator (F4u,  "Givaro::Modular< uint32_t>(32749)", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+	if (!testRandomIterator (F5u,  "Givaro::Modular< uint32_t>(65521)", (unsigned int)trials, (unsigned int)categories, (unsigned int)hist_level)) pass = false;
+
+
+
+
+#if TEST_ARCHETYPES
+
+	Givaro::Modular< int16_t> * K1g = new Givaro::Modular< int16_t> (101);
+	FieldArchetype K1(K1g);
+	if (!testField<FieldArchetype> (K1, "Testing archetype with envelope of Givaro::Modular< int16_t> field"))
+		pass = false;
+	delete K1g;
+#endif
+
+#if TEST_ARCHETYPES
+	Givaro::Modular< int32_t> * K2g = new Givaro::Modular< int32_t>(101);
+	FieldArchetype K2(K2g);
+
+	if (!testField<FieldArchetype> (K2, "Testing archetype with envelope of Givaro::Modular< int32_t> field"))
+		pass = false;
+	delete K2g;
+#endif
+
+#if TEST_ARCHETYPES
+	Givaro::Modular< Givaro::Log16> * K3g = new Givaro::Modular< Givaro::Log16>(101);
+	FieldArchetype K3(K3g);
+
+	if (!testField<FieldArchetype> (K3, "Testing archetype with envelope of Givaro::Modular< Givaro::Log16> field"))
+		pass = false;
+	delete K3g;
+#endif
+
+#if TEST_ARCHETYPES
+	Givaro::Modular< uint32_t> * K2gu = new Givaro::Modular< uint32_t> (101);
+	FieldArchetype K2u(K2gu);
+	if (!testField<FieldArchetype> (K2u, "Testing archetype with envelope of Givaro::Modular< uint32_t> field"))
+		pass = false;
+	delete K2gu;
+#endif
+
+#if TEST_ARCHETYPES
+	Givaro::GFqDom<int64_t> * K4g = new Givaro::GFqDom<int64_t> (101,1);
+	FieldArchetype K4(K4g);
+
+	if (!testField<FieldArchetype> (K4, "Testing archetype with envelope of Givaro::GFqDom<int64_t> prime field"))
+		pass = false;
+	delete K4g;
+#endif
+
+
+	LinBox::commentator().stop(MSG_STATUS (pass), "Givaro::Modular test suite");
+	return pass ? 0 : -1;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/tests/test-givaro-zpzuns.C b/tests/test-givaro-zpzuns.C
new file mode 100644
index 0000000..bb501f7
--- /dev/null
+++ b/tests/test-givaro-zpzuns.C
@@ -0,0 +1,150 @@
+
+/* tests/test-givaro-zpz.C
+ * Copyright (C) 2002 Pascal Giorgi
+ *
+ * Written by Pascal Giorgi  <pascal.giorgi at ens-lyon.fr>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+/*! @file  tests/test-givaro-zpzuns.C
+ * @ingroup tests
+ * @brief  no doc
+ * @test NO DOC
+ */
+
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+
+#include "givaro/modular.h"
+
+#include "test-common.h"
+#include "test-field.h"
+
+#ifndef TEST_ARCHETYPES
+#define TEST_ARCHETYPES 1
+#endif
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+        static integer q = 10733;
+	static size_t n = 10000;
+	static unsigned int iterations = 10;
+	static int e;
+	static unsigned int trials = 10000;
+	static unsigned int categories = 1000;
+	static unsigned int hist_level = 10;
+
+
+        static Argument args[] = {
+                { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+                { 'e', "-e E", "Use GF(q^e) for the extension field [1].", TYPE_INT,     &e },
+		{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT,     &n },
+		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
+		{ 't', "-t T", "Number of trials for the random iterator test.", TYPE_INT, &trials },
+		{ 'c', "-c C", "Number of categories for the random iterator test.", TYPE_INT, &categories },
+		{ 'H', "-H H", "History level for random iterator test.", TYPE_INT, &hist_level },
+		END_OF_ARGUMENTS
+        };
+
+        parseArguments (argc, argv, args);
+
+	//cout << endl << "Givaro::Modular< uint32_t> field test suite" << endl;
+	//cout.flush ();
+	bool pass = true;
+
+	Givaro::Modular< uint32_t> F1 (2);
+	Givaro::Modular< uint32_t> F2 (q);
+	Givaro::Modular< uint32_t> F3 (3);
+	Givaro::Modular< uint32_t> F4 (32749);
+	Givaro::Modular< uint32_t> F5 (65521);
+
+	LinBox::commentator().start("Givaro-zpzuns test suite", "GivZpzu");
+	// Make sure some more detailed messages get printed
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
+
+	if (!runFieldTests (F1, "2",     iterations, n, false)) pass = false;
+	if (!runFieldTests (F2, "10733", iterations, n, false)) pass = false;
+	if (!runFieldTests (F3, "3",     iterations, n, false)) pass = false;
+	if (!runFieldTests (F4, "32749", iterations, n, false)) pass = false;
+	if (!runFieldTests (F5, "65521", iterations, n, false)) pass = false;
+
+	if (!testRandomIterator (F1,  "Givaro::Modular< uint32_t>(2)", trials, categories, hist_level)) pass = false;
+	if (!testRandomIterator (F2,  "Givaro::Modular< uint32_t>(10733)", trials, categories, hist_level)) pass = false;
+	if (!testRandomIterator (F3,  "Givaro::Modular< uint32_t>(3)", trials, categories, hist_level)) pass = false;
+	if (!testRandomIterator (F4,  "Givaro::Modular< uint32_t>(32749)", trials, categories, hist_level)) pass = false;
+	if (!testRandomIterator (F5,  "Givaro::Modular< uint32_t>(65521)", trials, categories, hist_level)) pass = false;
+
+#if TEST_ARCHETYPES
+
+	Givaro::Modular< int16_t> * K1g = new Givaro::Modular< int16_t> (101);
+	FieldArchetype K1(K1g);
+	if (!testField<FieldArchetype> (K1, "Testing archetype with envelope of Givaro::Modular< int16_t> field"))
+		pass = false;
+	delete K1g;
+#endif
+
+#if TEST_ARCHETYPES
+	Givaro::Modular< uint32_t> * K2g = new Givaro::Modular< uint32_t> (101);
+	FieldArchetype K2(K2g);
+	if (!testField<FieldArchetype> (K2, "Testing archetype with envelope of Givaro::Modular< uint32_t> field"))
+		pass = false;
+	delete K2g;
+#endif
+
+#if TEST_ARCHETYPES
+	Givaro::Modular< Givaro::Log16> * K3g = new Givaro::Modular< Givaro::Log16>(101);
+	FieldArchetype K3(K3g);
+
+	if (!testField<FieldArchetype> (K3, "Testing archetype with envelope of Givaro::Modular< Givaro::Log16> field"))
+		pass = false;
+	delete K3g;
+#endif
+
+#if TEST_ARCHETYPES
+	Givaro::GFqDom<int64_t> * K4g = new Givaro::GFqDom<int64_t>(101,1);
+	FieldArchetype K4(K4g);
+
+	if (!testField<FieldArchetype> (K4, "Testing archetype with envelope of Givaro::GFqDom<int64_t> prime field"))
+		pass = false;
+	delete K4g;
+#endif
+
+
+	LinBox::commentator().stop(MSG_STATUS (pass), "Givaro::Modularuns test suite");
+	return pass ? 0 : -1;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/tests/test-givaropoly.C b/tests/test-givaropoly.C
new file mode 100644
index 0000000..79c2479
--- /dev/null
+++ b/tests/test-givaropoly.C
@@ -0,0 +1,96 @@
+
+/* tests/test-givaropoly.C
+ * Copyright (C) 2014 Gavin Harrison,
+ *
+ * Written by Gavin Harrison <gmh33 at drexel.edu>,
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+
+/*! @file  tests/test-gf2.C
+ * @ingroup tests
+ * @brief  no doc
+ * @test NO DOC
+ */
+
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+
+#include <queue>
+
+#include "givaro/givpoly1.h"
+#include "givaro/gfq.h"
+
+#include "test-field.h"
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+	static int p = 13;
+	static int e = 1;
+
+	static Argument args[] = {
+		{ 'p', "-p P", "Set the base field prime.", TYPE_INT, &p },
+		{ 'e', "-e E", "Set the base field exponent.", TYPE_INT, &e },
+		END_OF_ARGUMENTS
+	};
+
+	parseArguments (argc, argv, args);
+
+	commentator().start("GivaroPoly field test suite", "GivaroPoly");
+	bool pass = true;
+
+	typedef Givaro::GFqDom<int64_t> BaseDom;
+	typedef typename Givaro::Poly1Dom<BaseDom, Givaro::Dense> PolyDom;
+	typedef typename Givaro::Poly1Dom<PolyDom, Givaro::Dense> Bivariate;
+	
+	BaseDom GFq(p, e);
+	PolyDom Poly(GFq);
+	Bivariate F(Poly);
+
+	// Make sure some more detailed messages get printed
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
+
+	commentator().start ("Testing GivaroPoly", "main", 10);
+	
+	if ( not testRing (F, "GivaroPoly"))
+		pass = false;
+	commentator().progress ();
+	
+	commentator().stop("GivaroPoly field test suite");
+	return pass ? 0 : -1;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/tests/test-gmp-rational.C b/tests/test-gmp-rational.C
old mode 100644
new mode 100755
index f02bb6f..5c7e96a
--- a/tests/test-gmp-rational.C
+++ b/tests/test-gmp-rational.C
@@ -8,20 +8,20 @@
  *
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -40,12 +40,13 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
+
 
 #include "linbox/field/gmp-rational.h"
 
 #include "test-common.h"
-#include "test-generic.h"
+//#include "test-generic.h"
+#include "test-field.h"
 
 using namespace LinBox;
 
@@ -71,17 +72,16 @@ int main (int argc, char **argv)
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
 
-	if (!runFieldTests (F,  "GMP Rational",  iterations, n, false)) pass = false;
+	if (!runFieldTests (F,  "GMP Rational",  (unsigned int)iterations, n, false,false)) pass = false;
 
 	commentator().stop("GMP rational field test suite");
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-hilbert.C b/tests/test-hilbert.C
index 2cba3dd..ae2d4e5 100644
--- a/tests/test-hilbert.C
+++ b/tests/test-hilbert.C
@@ -35,9 +35,9 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
 
-#include "linbox/field/modular.h"
+
+#include "linbox/ring/modular.h"
 #include "linbox/blackbox/hilbert.h"
 
 #include "test-common.h"
@@ -51,7 +51,7 @@ int main (int argc, char **argv)
 	bool pass = true;
 
 	static size_t n = 10;
-	static integer q = 2147483647U;
+	static integer q = 65521U;
 	static int iterations = 10;
 
 	static Argument args[] = {
@@ -62,18 +62,17 @@ int main (int argc, char **argv)
 	};
 
 	parseArguments (argc, argv, args);
-	typedef Modular<uint32_t> Field;
+	typedef Givaro::Modular<uint32_t> Field;
 	Field F (q);
 
 	srand ((unsigned)time (NULL));
 
 	commentator().start("Hilbert matrix blackbox test suite", "Hilbert");
 
-	typedef vector<Field::Element> Vector;
 	typedef Hilbert<Field> BB;
 	BB A (F, n);
 
-	pass = pass && testBlackbox (A);
+	pass = pass && testBlackboxNoRW (A);
 
 	commentator().stop("Hilbert matrix blackbox test suite");
 	return pass ? 0 : -1;
diff --git a/tests/test-hom.C b/tests/test-hom.C
index 2dd48c6..85719be 100644
--- a/tests/test-hom.C
+++ b/tests/test-hom.C
@@ -39,7 +39,7 @@
 #include <fstream>
 #include <sstream>
 
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 #include "linbox/field/hom.h"
 
 #include "test-common.h"
@@ -71,9 +71,9 @@ int main (int argc, char **argv)
 	commentator().start("Hom test suite", "Hom");
 	bool pass = true;
 
-	Modular<uint32_t> F_uint32_t ((uint32_t) q);
-	Modular<uint16_t> F_uint16_t ((uint16_t) q);
-	Hom<Modular<uint16_t>, Modular<uint32_t> > iso(F_uint16_t, F_uint32_t);
+	Givaro::Modular<uint32_t> F_uint32_t ((uint32_t) q);
+	Givaro::Modular<uint16_t> F_uint16_t ((uint16_t) q);
+	Hom<Givaro::Modular<uint16_t>, Givaro::Modular<uint32_t> > iso(F_uint16_t, F_uint32_t);
 
 	uint16_t x=2, y;
 	uint32_t z=2, w;
diff --git a/tests/test-image-field.C b/tests/test-image-field.C
new file mode 100644
index 0000000..276e2a7
--- /dev/null
+++ b/tests/test-image-field.C
@@ -0,0 +1,117 @@
+/* tests/test-hom.C
+ * Copyright (C) LinBox
+ *
+ * Written by Dave Saunders <saunders at cis.udel.edu>
+ *
+ * 
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ * 
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This 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
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+
+/*! @file  tests/test-image-field.C
+ * @ingroup tests
+ * @brief  no doc
+ * @test NO DOC
+ */
+
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+
+#include "linbox/ring/modular.h"
+#include "linbox/field/image-field.h"
+
+#include "test-common.h"
+#include "test-generic.h"
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+	static integer q = 65521U;
+	static size_t n = 10000;
+	static int iterations = 10;
+	static int trials = 100000;
+	static int categories = 100;
+	static int hist_level = 1;
+
+	static Argument args[] = {
+		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1] for uint16_t modulus.", TYPE_INTEGER, &q },
+		{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT,     &n },
+		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
+		{ 't', "-t T", "Number of trials for the random iterator test.", TYPE_INT, &trials },
+		{ 'c', "-c C", "Number of categories for the random iterator test.", TYPE_INT, &categories },
+		{ 'H', "-H H", "History level for random iterator test.", TYPE_INT, &hist_level },
+		END_OF_ARGUMENTS
+	};
+
+	parseArguments (argc, argv, args);
+
+	cout << endl << "ImageField test suite" << endl;
+	cout.flush ();
+	bool pass = true;
+
+	// need to test generic def, test nonsense attempts, etc.
+
+	Givaro::Modular<uint32_t> F_uint32_t ((uint32_t) q);
+	Givaro::Modular<uint16_t> F_uint16_t ((uint16_t) q);
+	ImageField<Givaro::Modular<uint16_t>, Givaro::Modular<uint32_t> > IF32(F_uint16_t, F_uint32_t);
+
+	uint16_t a=2, b;
+	uint32_t z=2, w;
+	IF32.image(w, a);
+	pass = pass && IF32.areEqual(z, w);
+	IF32.preimage(b, z);
+	pass = pass && F_uint16_t.areEqual(a, b);
+
+	uint32_t x, y;
+	IF32.smul(x, 2, 3);
+	IF32.mul(y, 2, 3);
+	pass = pass && IF32.areEqual(x, y);
+	IF32.smulin(x, 5);
+	IF32.mulin(y, 5);
+	pass = pass && IF32.areEqual(x, y);
+
+	IF32.saxpy(z, 7, x, 11);
+	IF32.axpy(w, 7, x, 11);
+	pass = pass && IF32.areEqual(z, w);
+	IF32.saxpyin(z, 7, x);
+	IF32.axpyin(w, 7, x);
+	pass = pass && IF32.areEqual(z, w);
+	/*
+	*/
+
+	cout << endl << "ImageField " << (pass ? "pass" : "FAIL") << endl;
+	cout.flush ();
+	return pass ? 0 : -1;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/tests/test-inverse.C b/tests/test-inverse.C
index ba153b3..14116c4 100644
--- a/tests/test-inverse.C
+++ b/tests/test-inverse.C
@@ -6,20 +6,20 @@
  *
  * --------------------------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -38,11 +38,11 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
+
 #include <cstdio>
 
 #include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 #include "linbox/blackbox/diagonal.h"
 #include "linbox/blackbox/hilbert.h"
 #include "linbox/blackbox/inverse.h"
@@ -75,9 +75,8 @@ static bool testIdentityInverse (const Field &F, VectorStream<Vector> &stream)
 	commentator().start ("Testing identity inverse", "testIdentityInverse", stream.m ());
 
 	bool ret = true;
-	bool iter_passed = true;
 
-	Vector d;
+	Vector d(F);
 	VectorDomain<Field> VD (F);
 
 	size_t i;
@@ -85,12 +84,12 @@ static bool testIdentityInverse (const Field &F, VectorStream<Vector> &stream)
 	VectorWrapper::ensureDim (d, stream.n ());
 
 	for (i = 0; i < stream.n (); i++)
-		F.init (VectorWrapper::ref<Field> (d, i), 1);
+		F.assign(VectorWrapper::ref<Field> (d, i), F.one);
 
-	Blackbox D (F, d);
+	Blackbox D (d);
 	Inverse<Blackbox> DT (&D);
 
-	Vector v, w;
+	Vector v(F), w(F);
 
 	VectorWrapper::ensureDim (v, stream.n ());
 	VectorWrapper::ensureDim (w, stream.n ());
@@ -98,7 +97,7 @@ static bool testIdentityInverse (const Field &F, VectorStream<Vector> &stream)
 	while (stream) {
 		commentator().startIteration ((unsigned)stream.j ());
 
-		iter_passed = true;
+		bool iter_passed = true;
 
 		stream.next (v);
 
@@ -151,14 +150,13 @@ static bool testHilbertInverse (const Field &F, VectorStream<Vector> &stream)
 	commentator().start ("Testing Hilbert inverse", "testHilbertInverse", stream.m ());
 
 	bool ret = true;
-	bool iter_passed;
 
 	VectorDomain<Field> VD (F);
 
 	Blackbox H (F, stream.n ());
 	Inverse<Blackbox> HT (&H);
 
-	Vector v, w, z;
+	Vector v(F), w(F), z(F);
 
 	VectorWrapper::ensureDim (v, stream.n ());
 	VectorWrapper::ensureDim (w, stream.n ());
@@ -167,7 +165,7 @@ static bool testHilbertInverse (const Field &F, VectorStream<Vector> &stream)
 	while (stream) {
 		commentator().startIteration (stream.j ());
 
-		iter_passed = true;
+		bool iter_passed = true;
 
 		stream.next (v);
 
@@ -228,14 +226,13 @@ static bool testVandermondeInverse (const Field           &F,
 	commentator().start ("Testing Vandermonde inverse", "testVandermondeInverse", x_stream.m ());
 
 	bool ret = true;
-	bool inner_iter_passed;
 
 	VectorDomain<Field> VD (F);
 	size_t j, k;
 
 	Blackbox V (F, x_stream.n (), x_stream.n ());
 
-	Vector x, v, w, z;
+	Vector x(F), v(F), w(F), z(F);
 	typename Field::Element t;
 
 	VectorWrapper::ensureDim (x, x_stream.n ());
@@ -257,7 +254,7 @@ static bool testVandermondeInverse (const Field           &F,
 
 		/* Build the Vandermonde matrix */
 		for (j = 0; j < x_stream.n (); j++) {
-			F.init (t, 1);
+			F.assign(t, F.one);
 
 			for (k = 0; k < x_stream.n (); k++) {
 				V.setEntry (j, k, t);
@@ -269,7 +266,9 @@ static bool testVandermondeInverse (const Field           &F,
 
 		v_stream.reset ();
 
+
 		while (v_stream) {
+			bool inner_iter_passed;
 			inner_iter_passed = true;
 
 			/* Random vector of evaluation results */
@@ -335,11 +334,10 @@ static bool testDiagonalInverse (const Field &F, VectorStream<Vector> &stream)
 	VectorDomain<Field> VD (F);
 
 	bool ret = true;
-	bool iter_passed;
 
 	size_t j;
 
-	Vector d, di, dt, e, DTe;
+	Vector d(F), di(F), dt(F), e(F), DTe(F);
 
 	VectorWrapper::ensureDim (d, stream.n ());
 	VectorWrapper::ensureDim (di, stream.n ());
@@ -350,7 +348,7 @@ static bool testDiagonalInverse (const Field &F, VectorStream<Vector> &stream)
 	while (stream) {
 		commentator().startIteration ((unsigned)stream.j ());
 
-		iter_passed = true;
+		bool iter_passed = true;
 
 		stream.next (d);
 
@@ -366,11 +364,11 @@ static bool testDiagonalInverse (const Field &F, VectorStream<Vector> &stream)
 		VD.write (report, di);
 		report << endl;
 
-		Blackbox D (F, d);
+		Blackbox D (d);
 		Inverse <Blackbox> DT (&D);
 
 		for (j = 0; j < stream.n (); j++) {
-			F.init (VectorWrapper::ref<Field> (e, j), 1);
+			F.assign(VectorWrapper::ref<Field> (e, j), F.one);
 			DT.apply (DTe, e);
 		}
 
@@ -446,8 +444,8 @@ int main (int argc, char **argv)
 	bool pass = true;
 
 	static size_t n = 10;
-	static integer q = 2147483647U;
-	static int iterations = 100;
+	static integer q = 65521U;
+	static unsigned int iterations = 2; // 100;
 	static int N = 1;
 
 	static Argument args[] = {
@@ -458,11 +456,12 @@ int main (int argc, char **argv)
 		END_OF_ARGUMENTS
 	};
 
-	typedef Modular<uint32_t> Field; //C.Pernet: avoids confusion with givaro::uint32_t
-	typedef vector<Field::Element> Vector;
+	//typedef Givaro::Modular<uint32_t> Field; //C.Pernet: avoids confusion with givaro::uint32_t
+	typedef Givaro::Modular<double> Field; 
+	typedef BlasVector<Field> Vector;
 
 	parseArguments (argc, argv, args);
-	Field F (q);
+	Field F (q); Field::RandIter gen(F);
 
 	srand ((unsigned)time (NULL));
 
@@ -470,8 +469,9 @@ int main (int argc, char **argv)
 
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 
-	RandomDenseStream<Field, Vector> stream1 (F, n, iterations), stream2 (F, n, iterations);
-	RandomDenseStream<Field, Vector> stream3 (F, n, N);
+	RandomDenseStream<Field, Vector> stream1 (F, gen, n, iterations), 
+        							 stream2 (F, gen, n, iterations);
+	RandomDenseStream<Field, Vector> stream3 (F, gen, n, (size_t)N);
 
 	if (!testIdentityInverse    (F, stream1)) pass = false;
 	if (!testVandermondeInverse (F, stream1, stream3)) pass = false;
@@ -482,11 +482,10 @@ int main (int argc, char **argv)
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-isposdef.C b/tests/test-isposdef.C
index 8d1c6de..9d40de8 100644
--- a/tests/test-isposdef.C
+++ b/tests/test-isposdef.C
@@ -29,31 +29,25 @@
  * @test NO DOC
  */
 
-
-
 #include "linbox/linbox-config.h"
 
 #include <iostream>
-#include <fstream>
-#include <vector>
-#include <cstdio>
 
 #include "linbox/util/commentator.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/solutions/is-positive-definite.h"
 
-#include "test-common.h"
-
 using namespace LinBox;
 
-/* Test 1: positive definiteness of a random sparse matrix
+/* Positive definiteness check on two specific matrices
  *
- * Constructs a random sparse matrix and computes its rank using Gaussian
- * elimination (direct and blas) and Wiedemann's algorithm. Checks that the results match.
+ * Checks that I is found to be pos def and that a slight modification of I (to be singular and have a negative eigenvallue) is found to be not pos def.
+ *
+ * Sparsity is not (yet) used.
  */
 
-template <class Ring>
-bool testIsPosDef(const Ring &Z, size_t n, unsigned int iterations, double sparsity = 0.05)
+template <class Ring, class Method>
+bool testIsPosDef(const Ring &Z, size_t n, unsigned int iterations, Method &M, std::string methodName, double sparsity = 0.05)
 {
 	typedef SparseMatrix<Ring> Blackbox;
 
@@ -62,35 +56,34 @@ bool testIsPosDef(const Ring &Z, size_t n, unsigned int iterations, double spars
 	bool ret = true;
 	unsigned int i;
 
-	typename Ring::RandIter ri (Z);
-
+	// iterations since there is randomness in the alg (though none in this test).
 	for (i = 0; i < iterations; ++i) {
 		commentator().startIteration (i);
 
 		Blackbox A (Z, n, n);
-		typename Ring::Element e; Z.init(e, 1);
+		typename Ring::Element e; Z.assign(e, Z.one);
 		for (size_t j = 0; j < n; ++j)
 			A.setEntry(j, j, e);
 
 		std::ostream & report =
 		commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION);
 
-		Z.write( report ) << endl;
-		A.write( report ) << endl;
+		Z.write( report ) << std::endl;
+		A.write( report ) << std::endl;
 		bool p;
-		p = isPositiveDefinite(A);
-		report << "Positivedefiniteness on I computed by default (Hybrid) method: " << p << endl;
-		if (!p) {report << "ERROR: should be pos def" << endl; ret = false;}
+		p = isPositiveDefinite(A,M);
+		report << "Positivedefiniteness on I computed by " << methodName << ", " << p << std::endl;
+		if (!p) {report << "ERROR: should be pos def" << std::endl; ret = false;}
 
 		Z.negin(e);
 		Z. assign(A. refEntry(n/2, n/2), e);
 		A.setEntry(1, 2, e);
 		A.setEntry(2, 1, e);
-		p = isPositiveDefinite(A);
+		p = isPositiveDefinite(A,M);
 		report << "Matrix:\n";
-		A.write( report ) << endl;
-		report << "Positivedefiniteness on indefinite example computed by default (Hybrid) method: " << p << endl;
-		if (p) {report << "ERROR: should not be pos def" << endl; ret = false;}
+		A.write( report ) << std::endl;
+		report << "Positivedefiniteness on indefinite example computed by " << methodName << ", " << p << std::endl;
+		if (p) {report << "ERROR: should not be pos def" << std::endl; ret = false;}
 
 		commentator().stop ("done");
 		commentator().progress ();
@@ -112,14 +105,11 @@ int main (int argc, char **argv)
 	bool pass = true;
 
 	static size_t n = 80;
-	static integer q = 65519U;
-	//static integer q = 1000003U;
-	static int iterations = 2;
+	static unsigned int iterations = 2;
         static double sparsity = 0.05;
 
 	static Argument args[] = {
 		{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT,     &n },
-		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
 		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
 		{ 's', "-s S", "Sparse matrices with density S.", TYPE_DOUBLE,     &sparsity },
 		END_OF_ARGUMENTS
@@ -133,9 +123,14 @@ int main (int argc, char **argv)
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
 
-    PID_integer R;
+	Givaro::ZRing<Integer> R;
 
-	if (!testIsPosDef(R, n, iterations, sparsity)) pass = false;
+	Method::Hybrid MH;
+	pass = pass and testIsPosDef(R, n, iterations, MH, "Method::Hybrid", sparsity);
+	Method::Elimination ME;
+	pass = pass and testIsPosDef(R, n, iterations, MH, "Method::Elimination", sparsity);
+	Method::Blackbox MB;
+	pass = pass and testIsPosDef(R, n, iterations, MB, "Method::Blackbox", sparsity);
 
 	commentator().stop("IsPositiveDefinite solution test suite");
 	return pass ? 0 : -1;
diff --git a/tests/test-ispossemidef.C b/tests/test-ispossemidef.C
index 5ac6ee8..a3e90b1 100644
--- a/tests/test-ispossemidef.C
+++ b/tests/test-ispossemidef.C
@@ -1,4 +1,4 @@
-/* tests/test-isposdef.C
+/* tests/test-ispossemidef.C
  * Copyright (C) LinBox
  *
  * -----------------------------------------------------
@@ -36,40 +36,42 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
+
 #include <cstdio>
 
 #include "linbox/util/commentator.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/solutions/is-positive-semidefinite.h"
 
 #include "test-common.h"
 
 using namespace LinBox;
 
-/* Test 1: positive definiteness of a random sparse matrix
+/* Positive semidefiniteness check on two specific matrices
+ *
+ * Checks that a slight mod of I (to make it singular) is found to be pos semidef and that a slight modification (to have a negative eigenvalue) is found to be not pos semidef.
  *
- * Constructs a random sparse matrix and computes its rank using Gaussian
- * elimination (direct and blas) and Wiedemann's algorithm. Checks that the results match.
+ * Sparsity is not (yet) used.
  */
 
-template <class Ring>
-bool testIsPosDef(const Ring &Z, size_t n, unsigned int iterations, double sparsity = 0.05)
+template <class Ring, class Method>
+bool testIsPosSemidef(const Ring &Z, size_t n, unsigned int iterations, Method &M, double sparsity = 0.05)
 {
 	typedef SparseMatrix<Ring> Blackbox;
 
-	commentator().start ("Testing isPositiveDefinite", "testIsPosDef", iterations);
+	commentator().start ("Testing isPositiveDefinite", "testIsPosSemidef", iterations);
 
 	bool ret = true;
 	unsigned int i;
 
-	typename Ring::RandIter ri (Z);
+//	typename Ring::RandIter ri (Z);
 
+	// several iterations since there is randomness in the alg (though none in this test)
 	for (i = 0; i < iterations; ++i) {
 		commentator().startIteration (i);
 
 		Blackbox A (Z, n, n);
-		typename Ring::Element e; Z.init(e, 1);
+		typename Ring::Element e; Z.assign(e, Z.one);
 		for (size_t j = 0; j < n; ++j)
 			A.setEntry(j, j, e);
 
@@ -81,15 +83,15 @@ bool testIsPosDef(const Ring &Z, size_t n, unsigned int iterations, double spars
 		Z.write( report ) << endl;
 		A.write( report ) << endl;
 		bool p;
-		p = isPositiveSemiDefinite(A);
-		report << "PositiveSemidefiniteness on I computed by default (Hybrid) method: " << p << endl;
+		p = isPositiveSemiDefinite(A, M);
+		report << "PositiveSemidefiniteness on I+(1,2) computed by default (Hybrid) method: " << p << endl;
 		if (!p) {report << "ERROR: should be pos semidef" << endl; ret = false;}
 
 		Z.negin(e);
 		Z. assign(A. refEntry(n/2, n/2), e);
 		//A.setEntry(1, 2, e);
 		//A.setEntry(2, 1, e);
-		p = isPositiveSemiDefinite(A);
+		p = isPositiveSemiDefinite(A, M);
 		report << "Matrix:\n";
 		A.write( report ) << endl;
 		report << "PositiveSemidefiniteness on indefinite example computed by default (Hybrid) method: " << p << endl;
@@ -109,20 +111,14 @@ bool testIsPosDef(const Ring &Z, size_t n, unsigned int iterations, double spars
 int main (int argc, char **argv)
 {
 
-//     commentator().setMaxDetailLevel( 100000 );
-//     commentator().setMaxDepth( 100000 );
-
 	bool pass = true;
 
-	static size_t n = 80;
-	static integer q = 65519U;
-	//static integer q = 1000003U;
-	static int iterations = 2;
+	static size_t n = 20;
+	static unsigned int iterations = 2;
         static double sparsity = 0.05;
 
 	static Argument args[] = {
 		{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT,     &n },
-		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
 		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
                 { 's', "-s S", "Sparse matrices with density S.", TYPE_DOUBLE,     &sparsity },
 		END_OF_ARGUMENTS
@@ -136,11 +132,12 @@ int main (int argc, char **argv)
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
 
-//	commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
-
-    PID_integer R;
+        Givaro::ZRing<Integer> R;
 
-	if (!testIsPosDef(R, n, iterations, sparsity)) pass = false;
+	Method::Blackbox MB;
+	Method::Elimination ME;
+//	pass = pass and testIsPosSemidef(R, n, iterations, MB, sparsity);
+	pass = pass and testIsPosSemidef(R, n, iterations, ME, sparsity);
 
 	commentator().stop("isPositiveSemiDefinite solution test suite");
 	return pass ? 0 : -1;
diff --git a/tests/test-la-block-lanczos.C b/tests/test-la-block-lanczos.C
index 67e7da5..a70b8ab 100644
--- a/tests/test-la-block-lanczos.C
+++ b/tests/test-la-block-lanczos.C
@@ -6,20 +6,20 @@
  *
  * --------------------------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -40,11 +40,11 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
+
 
 #include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/vector/stream.h"
 #include "linbox/algorithms/la-block-lanczos.h"
 
@@ -144,11 +144,10 @@ static bool testSampleNullspace (const Field           &F,
 	std::ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
 
 	bool ret = true;
-	unsigned int number;
 
 	MatrixDomain<Field> MD (F);
 
-	Matrix x (A_stream.dim (), N);
+	Matrix x (F,A_stream.dim (), N);
 
 	SparseMatrix<Field> A (F, A_stream);
 
@@ -170,6 +169,7 @@ static bool testSampleNullspace (const Field           &F,
 	for (unsigned int i = 0; i < num_iter; ++i) {
 		commentator().startIteration (i);
 
+		unsigned int number;
 		number = lablsolver.sampleNullspace (A, x);
 
 		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION)
@@ -204,7 +204,6 @@ static bool testRank (const Field           &F,
 	std::ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
 
 	bool ret = true;
-	unsigned int rank;
 
 	MatrixDomain<Field> MD (F);
 
@@ -228,6 +227,7 @@ static bool testRank (const Field           &F,
 	for (unsigned int i = 0; i < num_iter; ++i) {
 		commentator().startIteration (i);
 
+		unsigned int rank;
 		rank = lablsolver.rank (A);
 
 		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION)
@@ -246,11 +246,11 @@ static bool testRank (const Field           &F,
 
 int main (int argc, char **argv)
 {
-	static int i = 5;
-	static int n = 10; // because it shows the problem
+	static unsigned int i = 5;
+	static unsigned int n = 10; // because it shows the problem
 	static int k = 5;
-	static int q = 2;
-	static int N = 16;
+	static unsigned int q = 2;
+	static unsigned int N = 16;
 
 	static Argument args[] = {
 		{ 'i', "-i I", "Number of iterations.", TYPE_INT, &i },
@@ -263,10 +263,10 @@ int main (int argc, char **argv)
 
 	bool fail = false ;
 
-	typedef Modular<uint8_t> Field;
+	typedef Givaro::Modular<uint8_t> Field;
 
 	parseArguments (argc, argv, args);
-	Field F (q);
+	Field F (q); Field::RandIter gen(F);
 
 	std::cout << "Lookahead-based block Lanczos test suite" << std::endl << std::endl;
 
@@ -276,8 +276,8 @@ int main (int argc, char **argv)
 	commentator().getMessageClass (TIMING_MEASURE).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
 	commentator().getMessageClass (PROGRESS_REPORT).setMaxDepth (0);
 
-	RandomSparseStream<Field> A_stream (F, (double) k / (double) n, n, n);
-	RandomDenseStream<Field> y_stream (F, n, i);
+	RandomSparseStream<Field> A_stream (F, gen, (double) k / (double) n, n, n);
+	RandomDenseStream<Field> y_stream (F, gen, n, i);
 
 	fail |= testRandomSolve (F, A_stream, y_stream, N);
 	fail |= testSampleNullspace (F, A_stream, N, i);
diff --git a/tests/test-last-invariant-factor.C b/tests/test-last-invariant-factor.C
index e14856b..dc52dd5 100644
--- a/tests/test-last-invariant-factor.C
+++ b/tests/test-last-invariant-factor.C
@@ -32,9 +32,10 @@
 
 
 
-#include "linbox/field/PID-integer.h"
+#include <linbox/linbox-config.h>
+#include "givaro/zring.h"
 #include "linbox/randiter/random-prime.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 #include "linbox/algorithms/matrix-rank.h"
 #include "linbox/algorithms/last-invariant-factor.h"
 #include "linbox/blackbox/scompose.h"
@@ -42,10 +43,10 @@
 #include "linbox/algorithms/rational-solver.h"
 #include <time.h>
 
-
 #include "linbox/util/commentator.h"
 #include "linbox/vector/stream.h"
 #include "test-common.h"
+
 using namespace LinBox;
 
 template <class Ring, class LIF, class Vector>
@@ -61,11 +62,10 @@ bool testRandom(const Ring& R,
         commentator().start (str.str ().c_str (), "testRandom", stream1.m ());
 
         bool ret = true;
-        bool iter_passed = true;
 
         VectorDomain<Ring> VD (R);
 
-	Vector d;
+	Vector d(R);
 
 	typename Ring::Element x;
 
@@ -79,7 +79,7 @@ bool testRandom(const Ring& R,
 
 		 std::ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
 
-                iter_passed = true;
+                bool iter_passed = true;
 
 		stream1.next (d);
 
@@ -92,21 +92,21 @@ bool testRandom(const Ring& R,
 		int i, j;
 
 		for(i = 0; i < n; ++i) {
-			R. assign (D[i][i], d[i]);
-			R. init (L[i][i], 1);
-			R. init (U[i][i], 1);}
+			R. assign (D[(size_t)i][(size_t)i], d[(size_t)i]);
+			R. assign (L[(size_t)i][(size_t)i], R.one);
+			R. assign (U[(size_t)i][(size_t)i], R.one);}
 
 		for (i = 0; i < n; ++ i)
 
 			for (j = 0; j < i; ++ j) {
 
-				R.init(L[i][j], rand() % 10);
+				R.init(L[(size_t)i][(size_t)j], int64_t(rand() % 10));
 
-				R.init(U[j][i], rand() % 10);
+				R.init(U[(size_t)j][(size_t)i], int64_t(rand() % 10));
 			}
 
 
-		std::vector<typename Ring::Element> tmp1(n), tmp2(n), e(n);
+		BlasVector<Ring> tmp1(R,(size_t)n), tmp2(R,(size_t)n), e(R,(size_t)n);
 
 		typename BlasMatrix<Ring>::ColIterator col_p;
 
@@ -114,11 +114,13 @@ bool testRandom(const Ring& R,
 		for (col_p = A.colBegin();
 		     col_p != A.colEnd(); ++ col_p, ++ i) {
 
-			R.init(e[i],1);
+			R.assign(e[(size_t)i],R.one);
 			U.apply(tmp1, e);
 			D.apply(tmp2, tmp1);
+			// LinBox::BlasSubvector<BlasVector<Ring> > col_p_v(R,*col_p);
+			// L.apply(col_p_v, tmp2);
 			L.apply(*col_p, tmp2);
-			R.init(e[i],0);
+			R.assign(e[(size_t)i],R.zero);
 		}
 
 
@@ -133,11 +135,11 @@ bool testRandom(const Ring& R,
 		report << '\n';
 
 
-		typename std::vector<typename Ring::Element>::iterator p1;
+		typename BlasVector<Ring>::iterator p1;
 
 		typename Ring::Element l;
 
-		R. init (l , 1);
+		R. assign(l , R.one);
 
 		for (p1 = d.begin(); p1 != d.end(); ++ p1)
 
@@ -184,7 +186,7 @@ int main(int argc, char** argv)
 
         static size_t n = 10;
 
-	static int iterations = 1;
+	static unsigned int iterations = 1;
 
         static Argument args[] = {
                 { 'n', "-n N", "Set order of test matrices to N.", TYPE_INT,     &n },
@@ -195,18 +197,18 @@ int main(int argc, char** argv)
 
 	parseArguments (argc, argv, args);
 
-        typedef PID_integer      Ring;
+        typedef Givaro::ZRing<Integer>      Ring;
 
-        Ring R;
+        Ring R; Ring::RandIter gen(R);
 
 	commentator().start("Last invariant factor test suite", "LIF");
 
         commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (5);
 
-        RandomDenseStream<Ring> s1 (R, n, iterations);
+        RandomDenseStream<Ring> s1 (R, gen, n, iterations);
 
-	typedef RationalSolver<Ring, Modular<int32_t>, LinBox::RandomPrimeIterator> Solver;
-	// typedef RationalSolver<Ring, Modular<double>, LinBox::RandomPrimeIterator> Solver;
+	typedef RationalSolver<Ring, Givaro::Modular<int32_t>, LinBox::RandomPrimeIterator> Solver;
+	// typedef RationalSolver<Ring, Givaro::Modular<double>, LinBox::RandomPrimeIterator> Solver;
 
 	typedef LastInvariantFactor<Ring, Solver> LIF;
 
@@ -220,11 +222,10 @@ int main(int argc, char** argv)
         return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-lidia-gfq.C b/tests/test-lidia-gfq.C
deleted file mode 100644
index ad5f5b2..0000000
--- a/tests/test-lidia-gfq.C
+++ /dev/null
@@ -1,93 +0,0 @@
-
-/* tests/test-lidia-gfq.C
- * Copyright (C) 2002 Pascal Giorgi
- *
- * Written by Pascal Giorgi  <pascal.giorgi at ens-lyon.fr>
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-
-/*! @file  tests/test-lidia-gfq.C
- * @ingroup tests
- * @brief  no doc
- * @test NO DOC
- */
-
-
-
-#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <vector>
-
-
-#include "linbox/field/lidia-gfq.h"
-
-#include "test-common.h"
-#include "test-generic.h"
-
-using namespace LinBox;
-
-int main (int argc, char **argv)
-{
-        static integer q = 10733;
-	static size_t n = 10000;
-	static int iterations = 10;
-
-        static Argument args[] = {
-                { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
-		{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT,     &n },
-		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
-		END_OF_ARGUMENTS
-        };
-
-        parseArguments (argc, argv, args);
-
-	cout << endl << "LiDIAGfq field test suite" << endl;
-	cout.flush ();
-	bool pass = true;
-
-	LidiaGfq F (q, 1);
-
-	// Make sure some more detailed messages get printed
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
-
-	if (!runFieldTests (F, "LidiaGfq (prime)", iterations, n, false)) pass = false;
-
-#if 0
-	FieldArchetype K(new LidiaGfq(101,1));
-
-	if (!testField<FieldArchetype> (K, "Testing archetype with envelope of LidiaGfq prime field"))
-		pass = false;
-#endif
-
-
-	return pass ? 0 : -1;
-}
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/tests/test-matrix-domain.C b/tests/test-matrix-domain.C
index 085089d..4ca6053 100644
--- a/tests/test-matrix-domain.C
+++ b/tests/test-matrix-domain.C
@@ -6,20 +6,20 @@
  *
  * ---------------------------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -51,17 +51,17 @@
 #include <iostream>
 #include <fstream>
 #include <sstream>
-#include <vector>
+
 
 #include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/modular-balanced.h"
-#include "linbox/field/givaro.h"
+#include "linbox/ring/modular.h"
+//#include "givaro/modular-balanced.h"
+//#include "linbox/field/givaro.h"
 #include "linbox/vector/vector-domain.h"
 #include "linbox/matrix/matrix-domain.h"
 #include "linbox/vector/stream.h"
-#include "linbox/matrix/blas-matrix.h"
-#include "linbox/matrix/sparse.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/blackbox/matrix-blackbox.h"
 
 #include "linbox/solutions/det.h"
@@ -124,18 +124,18 @@ Matrix1 &inv (MatrixDomain<Field> &MD, Matrix1 &res, const Matrix2 &A)
 			typename BlasMatrix<typename Matrix1::Field>::Col::iterator i;
 			unsigned int c_idx = idx + 1;
 
-			col = M.colBegin () + idx;
-			i = col->begin () + idx + 1;
+			col = M.colBegin () + (int)idx;
+			i = col->begin () + (int)(idx + 1);
 
-			while (MD.field ().isZero (*i) && i != col->end ()) ++i, ++c_idx;
+			while ( i != col->end () && MD.field ().isZero (*i)) ++i, ++c_idx;
 
 			if (i == col->end ())
 				throw SingularMatrix ();
 			else {
 				typename BlasMatrix<typename Matrix1::Field>::RowIterator row1, row2;
 
-				row1 = M.rowBegin () + idx;
-				row2 = M.rowBegin () + c_idx;
+				row1 = M.rowBegin () + (int)idx;
+				row2 = M.rowBegin () + (int)c_idx;
 
 				std::swap_ranges (row1->begin () + idx, row1->end (), row2->begin () + idx);
 			}
@@ -1102,9 +1102,7 @@ static bool testMVAxpy (Field &F, const char *text, const Matrix &M)
 	report << "Output vector w:" << endl;
 	VD.write (report, w);
 
-	typename Field::Element one;
-	F.init (one, 1);
-	typename LinBox::Vector<Field>::Dense z (M.coldim (), one), w1 (M.rowdim ());
+	typename LinBox::Vector<Field>::Dense z (M.coldim (), F.one), w1 (M.rowdim ());
 
 	MD.vectorMul (w1, M, z);
 
@@ -1189,6 +1187,7 @@ static bool testRightBlackboxMul (Field &F, const char *text, const Blackbox &A,
 
 	str << "Testing " << text << " matrix-black box right mul" << ends;
 	commentator().start (str.str ().c_str (), "testRightBlackboxMul");
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
 
 	bool ret = true;
 
@@ -1205,9 +1204,15 @@ static bool testRightBlackboxMul (Field &F, const char *text, const Blackbox &A,
 		Istream >> *i;
 
 	MD.blackboxMulRight (IA, I, A);
+	report << "blackboxMulRight Output matrix IA:" << endl;
+	MD.write (report, IA);
 
-	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
-	report << "Output matrix IA:" << endl;
+	MD.mul (IA, I, A);
+	report << "mul Output matrix IA:" << endl;
+	MD.write (report, IA);
+
+	MD.mul (IA, A, I);
+	report << "mul Output matrix AI:" << endl;
 	MD.write (report, IA);
 
 	typename LinBox::Vector<Field>::Dense v (A.coldim ()), w1 (A.rowdim ()), w2 (A.rowdim ());
@@ -1342,7 +1347,7 @@ bool testPermutation (const Field &F, const char *text, const Matrix &M)
 }
 
 template <class Field, class Blackbox, class Matrix>
-bool testMatrixDomain (const Field &F, const char *text,
+bool testMatrixDomain (const Field &F, typename Field::RandIter& gen, const char *text,
 		       Matrix &M1, Matrix &M2, Matrix &M3,
 		       const Blackbox &A,
 		       unsigned int iterations,
@@ -1354,7 +1359,7 @@ bool testMatrixDomain (const Field &F, const char *text,
 
 	bool pass = true;
 
-	RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, A.coldim (), iterations);
+	RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, gen, A.coldim (), iterations);
 
 	if (!testCopyEqual (F, text, M1))               pass = false;
 	if (!testSubinIsZero (F, text, M1))             pass = false;
@@ -1390,7 +1395,7 @@ bool testMatrixDomain (const Field &F, const char *text,
 }
 
 template <class Field, class Blackbox, class Matrix>
-bool testMatrixDomain (const Field &F, const char *text,
+bool testMatrixDomain (const Field &F, typename Field::RandIter& gen, const char *text,
 		       Matrix &M1, Matrix &M2, Matrix &M3,
 		       const Blackbox &A,
 		       unsigned int iterations,
@@ -1402,7 +1407,7 @@ bool testMatrixDomain (const Field &F, const char *text,
 
 	bool pass = true;
 
-	RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, A.coldim (), iterations);
+	RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, gen, A.coldim (), iterations);
 
 	if (!testCopyEqual (F, text, M1))              pass = false;
 	if (!testSubinIsZero (F, text, M1))            pass = false;
@@ -1430,7 +1435,7 @@ bool testMatrixDomain (const Field &F, const char *text,
 }
 
 template <class Field, class Blackbox, class Matrix>
-bool testMatrixDomain (const Field &F, const char *text,
+bool testMatrixDomain (const Field &F, typename Field::RandIter& gen, const char *text,
 		       Matrix &M1, Matrix &M2, Matrix &M3,
 		       const Blackbox &A,
 		       unsigned int iterations,
@@ -1442,7 +1447,7 @@ bool testMatrixDomain (const Field &F, const char *text,
 
 	bool pass = true;
 
-	RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, A.coldim (), iterations);
+	RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, gen, A.coldim (), iterations);
 
 	if (!testCopyEqual (F, text, M1))               pass = false;
 	if (!testSubinIsZero (F, text, M1))             pass = false;
@@ -1468,18 +1473,42 @@ bool testMatrixDomain (const Field &F, const char *text,
 	return pass;
 }
 
+template <class Field, class Blackbox, class Matrix>
+bool testMatrixDomain (const Field &F, typename Field::RandIter& gen, const char *text,
+		       Matrix &M1, Matrix &M2, Matrix &M3,
+		       const Blackbox &A,
+		       unsigned int iterations,
+		       MatrixCategories::BlackboxTag)
+{
+	ostringstream str;
+	str << "Testing MatrixDomain with " << text << " matrices" << ends;
+	commentator().start (str.str ().c_str ());
+
+	bool pass = true;
+
+	RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, gen, A.coldim (), iterations);
+
+	if (!testRightBlackboxMul (F, text, A, stream)) pass = false;
+
+	commentator().stop (MSG_STATUS (pass));
+
+	return pass;
+}
+
 template <class Field>
-bool launchTestMatrixDomain(const Field &F, size_t m, size_t n, size_t k, int iterations)
+bool launchTestMatrixDomain(const Field &F, size_t m, size_t n, size_t k, unsigned int iterations)
 {
 
 	bool pass = true ;
-	typedef typename Field::Element Element ;
+	// typedef typename Field::Element Element ;
 	BlasMatrix<Field> M1 (F, n, m);
 	BlasMatrix<Field> M2 (F, n, m);
 	BlasMatrix<Field> M3 (F, m, m);
 	MatrixBlackbox<Field, BlasMatrix<Field> > A1 (F, n, m);
 
-	RandomDenseStream<Field, typename BlasMatrix<Field>::Row> stream1 (F, m);
+    typename Field::RandIter gen(F);
+
+	RandomDenseStream<Field, typename BlasMatrix<Field>::Row> stream1 (F, gen, m);
 
 	typename BlasMatrix<Field>::RowIterator i;
 
@@ -1495,18 +1524,22 @@ bool launchTestMatrixDomain(const Field &F, size_t m, size_t n, size_t k, int it
 	for (i = A1.rep ().rowBegin (); i != A1.rep ().rowEnd (); ++i)
 		stream1 >> *i;
 
-	if (!testMatrixDomain (F, "dense", M1, M2, M3, A1, iterations,
+	if (!testMatrixDomain (F, gen, "dense", M1, M2, M3, A1, iterations,
 			       typename MatrixTraits<BlasMatrix<Field> >::MatrixCategory ()))
 		pass = false;
+	Diagonal<Field> A1b (F, n, true); // random, nonsingular
+	if (!testMatrixDomain (F, gen, "blackbox", M1, M2, M3, A1b, iterations,
+			       typename MatrixTraits<Diagonal<Field> >::MatrixCategory ()))
+		pass = false;
 
-	SparseMatrixBase<Element> M4 (n, m);
-	SparseMatrixBase<Element> M5 (n, m);
-	SparseMatrixBase<Element> M6 (m, m);
-	MatrixBlackbox<Field, SparseMatrixBase<Element> > A2 (F, n, m);
+	SparseMatrix<Field> M4 (F,n, m);
+	SparseMatrix<Field> M5 (F,n, m);
+	SparseMatrix<Field> M6 (F,m, m);
+	MatrixBlackbox<Field, SparseMatrix<Field> > A2 (F, n, m);
 
-	RandomSparseStream<Field, typename SparseMatrixBase<Element>::Row> stream2 (F, (double) k / (double) n, m);
+	RandomSparseStream<Field, typename SparseMatrix<Field>::Row> stream2 (F, gen, (double) k / (double) n, m);
 
-	typename SparseMatrixBase<Element>::RowIterator i2;
+	typename SparseMatrix<Field>::RowIterator i2;
 
 	for (i2 = M4.rowBegin (); i2 != M4.rowEnd (); ++i2)
 		stream2 >> *i2;
@@ -1520,16 +1553,16 @@ bool launchTestMatrixDomain(const Field &F, size_t m, size_t n, size_t k, int it
 	for (i2 = A2.rep ().rowBegin (); i2 != A2.rep ().rowEnd (); ++i2)
 		stream2 >> *i2;
 
-	if (!testMatrixDomain (F, "sparse row-wise", M4, M5, M6, A2, iterations,
-			       typename MatrixTraits<SparseMatrixBase<Element> >::MatrixCategory ()))
+	if (!testMatrixDomain (F, gen, "sparse row-wise", M4, M5, M6, A2, iterations,
+			       typename MatrixTraits<SparseMatrix<Field> >::MatrixCategory ()))
 		pass = false;
 
-	TransposeMatrix<SparseMatrixBase<Element> > M7 (M4);
-	TransposeMatrix<SparseMatrixBase<Element> > M8 (M5);
-	TransposeMatrix<SparseMatrixBase<Element> > M9 (M6);
+	TransposeMatrix<SparseMatrix<Field> > M7 (M4);
+	TransposeMatrix<SparseMatrix<Field> > M8 (M5);
+	TransposeMatrix<SparseMatrix<Field> > M9 (M6);
 
-	if (!testMatrixDomain (F, "sparse column-wise", M7, M8, M9, A2, iterations,
-			       typename MatrixTraits<TransposeMatrix<SparseMatrixBase<Element> > >::MatrixCategory ()))
+	if (!testMatrixDomain (F, gen, "sparse column-wise", M7, M8, M9, A2, iterations,
+			       typename MatrixTraits<TransposeMatrix<SparseMatrix<Field> > >::MatrixCategory ()))
 		pass = false;
 
 	return pass ;
@@ -1539,11 +1572,14 @@ int main (int argc, char **argv)
 {
 	bool pass = true;
 
-	static size_t n = 50;
-	static size_t m = 50;
-	static size_t k = 10;
-	static integer q = 2147483647U;
-	static int iterations = 1;
+	static size_t n = 5;
+	static size_t m = n;
+	static size_t k = 2;
+	static integer q = 65521U;
+	static integer q2 =  FieldTraits<Givaro::ModularBalanced<int32_t> >::maxModulus() ;
+	Givaro::IntPrimeDom IPD;
+	IPD.prevprime(q2,q2);
+	static unsigned int iterations = 1;
 
 	static Argument args[] = {
 		{ 'n', "-n N", "Set row of test matrices to N.", TYPE_INT,     &n },
@@ -1557,10 +1593,16 @@ int main (int argc, char **argv)
 	parseArguments (argc, argv, args);
 	if (k >= m) k = m/2+1 ;
 
-
-	Modular<uint32_t>                F1 (q);
-	ModularBalanced<int32_t>         F2 (q);
-	GivaroZpz<Givaro::Unsigned32>    F3(q);
+	Givaro::Modular<uint32_t>                F1 (101);
+	Givaro::ModularBalanced<int32_t>         F2 (q2);
+	Givaro::Modular<double>    F3(q);
+	/*
+	if (q2 < q/2)
+		std::cerr <<"...étrange..." << std::endl;
+	This is in the modular-balanced maxModulus
+	// (p-1)(p+1)/4 < 2^{31}
+	92681;
+	*/
 
 	commentator().start("Matrix domain test suite", "MatrixDomain");
 
@@ -1570,19 +1612,18 @@ int main (int argc, char **argv)
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
 	commentator().getMessageClass (TIMING_MEASURE).setMaxDepth (3);
 
-	pass &= launchTestMatrixDomain(F1,m,n,k,iterations);
-	pass &= launchTestMatrixDomain(F2,m,n,k,iterations);
-	pass &= launchTestMatrixDomain(F3,m,n,k,iterations);
+	pass = pass and launchTestMatrixDomain(F1,m,n,k,iterations);
+	pass = pass and launchTestMatrixDomain(F2,m,n,k,iterations);
+	pass = pass and launchTestMatrixDomain(F3,m,n,k,iterations);
 
 	commentator().stop (MSG_STATUS (pass), "Matrix domain test suite");
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-matrix-domain.h b/tests/test-matrix-domain.h
new file mode 100644
index 0000000..7b7dbb8
--- /dev/null
+++ b/tests/test-matrix-domain.h
@@ -0,0 +1,191 @@
+/*
+   Examples of domains
+BlasMatrixDomain<Field>
+PlainDomain<Field>
+Sliced3Domain<F3_rep>
+M4riDomain
+...
+
+   classes: Index Scalar Vector Matrix Fibb Field Polynomial
+Index i,j,k
+Scalar a,b,c
+Vector u,v,w // Subvector
+Matrix A,B,C // Submatrix
+Fibb F,G
+Field K
+MatrixDomain MD
+Polynomial P
+
+   Functions to test:
+MatrixDomain()
+MatrixDomain(K)
+MatrixDomain(MD)
+MatrixDomain(p,e) // future
+field()
+   vector arith:
+add(z,x,y) z = x + y
+addin(x,y) x += y
+sub(z,x,y) z = x - y
+subin(x,y) x -= y
+neg(z,x) z = -x
+negin(x) x = -x
+axpy(z,a,x,y) z = a*x + y
+axpyin(a,x,y) y += a*x
+mulladd(z,a,x,b,y) z = ax + by
+mulladdin(a,x,b,y) x = ax + by
+copy(x,y) x <-- y
+swap(x,y) x <--> y
+   matrix arith
+add(C,A,B) C = A + B
+addin(A,B) A += B
+sub(C,A,B) C = A - B
+subin(A,B) A -= B
+neg(C,A) C = -A
+negin(A) A = -A
+mul(C,A,B) C = A*B
+mulin_left(A,B) A = A*B (square)
+mulin_right(A,B) B = A*B (square)
+axpy(D,A,B,C) D = A*B + C
+axpyin(C,A,B) C += A*B
+axpy(D,a,B,C) D = a*B + C
+axpyin(a,B,C) C += a*B
+mulladd(D,b,C,a,A,B) D = bC + aAB
+mulladdin(b,C,a,A,B) C = bC + aAB
+inv(F,A) F = A^{dagger}
+invin(F,A) F = A^{dagger}, A modified
+inv(B,A) B = A^{dagger}
+invin(B,A) B = A^{dagger}, A modified
+ nullity?
+div_left(C,A,B) C = A^{dagger}*B (if consistent, AC = B)
+divin_left(A,B) B = A^{dagger}*B, and A modified
+div_right(C,A,B) C = A*B^{dagger} (if consistent, CB = A)
+divin_right(A,B) A = A*B^{dagger}, and B modified
+
+areEqual(A, B)
+copy(B,A) B <-- A
+swap(B,A) B <--> A
+
+left_solve(X,A,B) = div_left(X,A,B) X = A^{dagger}*B
+right_solve(X,A,B) = div_right(X,A,B) = X = A*B^{dagger}
+		Operand& left_solve (const Matrix& A, Operand& B) const
+		Operand& right_solve (const Matrix& A, Operand& B) const
+
+Matrix<MatrixDomain> could do the rest
+rank(i,A)
+rankin(i,A)
+
+det(d,A)
+detin(d,A)
+
+minpoly(P,A)
+charpoly(P,A)
+charpoly(Plist,A) // factored form(?)
+
+isZero(A)
+	(? isIdentity, isUnit, isZeroDivisor)
+
+
+	matrices set themselves, read and write themselves
+		void setIdentity(Matrix & I)
+		random: void setRandom(Matrix & I, opt args)
+		void setZero(Matrix & I)
+		inline std::ostream &write (std::ostream &os, const Matrix &A) const
+		inline std::istream &read (std::istream &is, Matrix &A) const
+
+
+*/
+/*
+
+	class VectorDomain : public virtual DotProductDomain<Field> {//, public virtual VectorDomainBase<Field> {
+	propose types
+		VectorDomain()
+		void init(const Field& F) { this->_field = &F; }
+		VectorDomain (const VectorDomain &VD) :
+		VectorDomain &operator = (const VectorDomain &VD)
+		using VectorDomainBase<Field>::field;
+		inline std::ostream &write (std::ostream &os, const Vector &x) const
+		inline std::istream &read (std::istream &is, Vector &x) const
+		inline Vector1 &copy (Vector1 &res, const Vector2 &v) const
+	x	inline Vector1 &copy (Vector1 &res, const Vector2 &v, size_t i, size_t len = 0) const
+	propose subvector()
+
+		inline bool areEqual (const Vector1 &v1, const Vector2 &v2) const
+		inline bool isZero (const Vector &v) const
+		inline Element &dot (Element &res, const Vector1 &v1, const Vector2 &v2) const
+		inline Vector1 &add (Vector1 &res, const Vector2 &y, const Vector3 &x) const
+		inline Vector1 &addin (Vector1 &y, const Vector2 &x) const
+		inline Vector1 &sub (Vector1 &res, const Vector2 &y, const Vector3 &x) const
+		inline Vector1 &subin (Vector1 &y, const Vector2 &x) const
+		inline Vector1 &neg (Vector1 &res, const Vector2 &x) const
+		inline Vector &negin (Vector &y) const
+	?	inline Vector1 &mul (Vector1 &res, const Vector2 &x, const Element &a) const
+	?	inline Vector &mulin (Vector &x, const Element &a) const
+	propose smul, smulin
+		inline Vector1 &axpy (Vector1 &res, const Element &a, const Vector2 &x, const Vector3 &y) const
+		inline Vector1 &axpyin (Vector1 &y, const Element &a, const Vector2 &x) const
+	propose muladd, muladdin
+
+		inline void swap (Vector &v1, Vector &v2) const
+	?	inline Vector &permute (Vector   &v, Iterator  P_start, Iterator  P_end) const
+		VectorDomain (const Field &F) :
+		Vector& random(Vector& v)
+*/
+/*
+proposed categories
+Field/Ring
+VectorDomain
+  class Vector
+  class NewVector
+MatrixDomain inherits from VectorDomain, thus contains vector functions
+  class Matrix
+  class NewMatrix
+BlackBox<MatrixDomain>
+  uses MatrixDomain::Matrix and MatrixDomain::Vector
+Matrix<MatrixDomain>
+  domain() returns the MatrixDomain
+    domain().mul
+  field() returns MD().field()
+SparseMatrix<MatrixDomain>
+
+ Those matrix classes know basic matrix functions rank, det, minpoly, etc
+ as well as
+*/
+
+#ifndef LinBox_test_matrix_domain_h
+#define LinBox_test_matrix_domain_h
+#include "test-field.h"
+
+template <class MDom>
+bool testMatrixDomain(const MDom& MD, int n) {
+	bool pass = true;
+
+	typename MDom::Matrix A(MD,n,n), B(MD,n,n), C(MD,n,n), D(MD, n, n);
+	A.random(); B.random();
+	C.zero();
+	typename MDom::Scalar a,b,c,d;
+	MD.init(a); MD.init(b); MD.init(c); MD.init(d);
+
+	MD.add(C, A, B);
+	MD.sub(C, A, B);
+	MD.neg(C, A);
+	MD.smul(C, a, B);
+	MD.saxpy(C, a, A, B);
+	MD.mul(C, A, B);
+	MD.axpy(D, A, B, C);
+
+	MD.addin(A, B);
+	MD.subin(A, B);
+	MD.negin(A);
+	MD.smulin(B, a);
+	MD.saxpyin(B, a, A);
+	MD.mulin_left(A, B);
+	MD.mulin_right(A, B);
+	MD.axpyin(C, A, B);
+	MD.cardinality();
+	MD.characteristic();
+
+	pass = pass and runBasicRingTests(MD, "matrix domain", 1, false);
+	pass = pass and runFieldTests<MDom>(MD, "matrix domain", 1,0, false);
+	return pass;
+}
+#endif //LinBox_test_matrix_domain_h
diff --git a/tests/test-matrix-stream.C b/tests/test-matrix-stream.C
index 8451a3b..3222fb1 100644
--- a/tests/test-matrix-stream.C
+++ b/tests/test-matrix-stream.C
@@ -32,15 +32,15 @@
 
 
 
+#include <linbox/linbox-config.h>
 #include <iostream>
 #include <fstream>
 #include <string>
-#include <vector>
+
 #include "test-common.h"
-#include "linbox/field/unparametric.h"
 #include "linbox/util/matrix-stream.h"
 #include "linbox/integer.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 
 using namespace LinBox;
 
@@ -72,11 +72,12 @@ integer matrix[rowDim][colDim] = {
 				{1, 0, 0, -13, 0, 1, 0, 300, 0, 10, 1},
 				{0, 0, 6, 0, 0, 0, 0, 200, 0, 1, 0} };
 
-typedef UnparametricField<integer> TestField;
+typedef Givaro::ZRing<integer> TestField;
 TestField ff;
 
 template <class BB>
 bool testMatrix( std::ostream& out, const char* filename, const char* BBName ) ;
+
 bool testMatrixStream(const string& matfile)
 {
 
diff --git a/tests/test-matrix-utils.h b/tests/test-matrix-utils.h
new file mode 100644
index 0000000..fc4ec96
--- /dev/null
+++ b/tests/test-matrix-utils.h
@@ -0,0 +1,322 @@
+/* Copyright (C) 2013 LinBox
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *
+ * Function definitions for block Lanczos iteration
+ */
+
+/** \file tests/test-matrix-utils.h
+ * \brief Utilities for tests on matrices
+ * @ingroup tests
+ * @warning this should better written and shared among the tests
+ * @bug put in \c matrix/random-matrix.h
+ */
+
+
+#ifndef __LINBOX_tests_test_matrix_utils_H
+#define __LINBOX_tests_test_matrix_utils_H
+
+
+#include "fflas-ffpack/utils/Matio.h"
+
+#define RAPPORT(a) \
+	if (pass) {   \
+		commentator().report() << "\t \033[1;36m<<<\033[0;m \t" << (a) << " passed :)" << std::endl;  \
+	} \
+        else { \
+		commentator().report() << "\t \033[1;    31m!!!\033[0;m \t " << (a) << " failed :(" << std::endl ;  \
+		exit(-1); \
+	}
+
+#define TESTE(a) \
+	commentator().report() << "\t \033[1;35m>>>\033[0;m \t testing " << (a) << " :" << std::endl ;
+
+
+#define element_t(Field) \
+typename Field ::Element
+
+
+namespace LinBox { // namespace tests
+/** @brief gives a random number such that \f$0 \leq RIII < s\f$.
+ * @details basic..
+ * @param [in]  s sup
+ * \param [in]  seed seed. If \p 0 (default) we create a new one.
+ * @param [out] RIII random integer in the interval  \f$[[0, s-1]]\f$.
+ * @return a reference to \p RIII
+ */
+size_t & RandIntInInt ( const size_t & s, size_t & RIII, const int & seed = 0 )
+{
+	/*
+	 * if (seed == 0)
+	 *	srandom( (unsigned) time(NULL) );
+	 *else
+	 *	srandom ( seed );
+	 */
+	double alea = rand();
+	RIII          = (size_t) ((double)s * (alea/(RAND_MAX+1.0)));
+	assert(RIII<s);
+	return RIII ;
+}
+
+/*!
+ * Creates a random Lapack style Permutation \p P of size \p len.
+ */
+void RandomPermutation ( size_t * P, const size_t & len)
+{
+	size_t alea = 0 ;
+	for (size_t i = 0 ; i < len ; ++i) {
+		RandIntInInt(len-i, alea);
+		*(P+i) = i + alea ;
+	}
+	return;
+}
+
+int permutationDet(size_t *P, const size_t len) {
+	int d = 1 ;
+	for(size_t i = 0 ; i < len ; ++i)
+		if (P[i] != i) d = -d;
+	return d;
+}
+
+/**
+ * @brief Checks we got the right rank.
+ *
+ * @param F field
+ * @param A matrix
+ * @param m rows
+ * @param n cols
+ * @param lda leadin dimmension
+ * @param alledged_rank supposedly correct rank.
+ *
+ * @return \c alledged_rank==rank(A)
+ */
+template <class Field>
+bool CheckRank( const Field & F,
+		const element_t(Field) * A,
+		const size_t & m,
+		const size_t & n,
+		const size_t & lda, //!@bug not used
+		const size_t & alledged_rank)
+{
+	//  std::cout << " is rank truely " << alledged_rank << " ?" << std::endl;
+	element_t(Field) * Acopy = new element_t(Field)[m*lda] ;
+	FFLAS::fassign(F,m*lda,A,1,Acopy,1);
+	size_t true_rank = FFPACK::Rank(F,m,n,Acopy,lda);
+	delete[] Acopy ;
+	//                std::cout << "It is " << true_rank << "." << std::endl;
+	return (alledged_rank == true_rank);
+}
+
+template <class Field>
+bool CheckRank( const Field & F,
+		const BlasMatrix<Field> & A,
+		const size_t & alledged_rank)
+{
+	return CheckRank(F,A.getPointer(),A.rowdim(),A.coldim(),A.stride(),alledged_rank);
+}
+template <class Field>
+bool CheckRank( const Field & F,
+		const BlasSubmatrix<Field> & A,
+		const size_t & alledged_rank)
+{
+	return CheckRank(F,A.getPointer(),A.rowdim(),A.coldim(),A.stride(),alledged_rank);
+}
+
+
+template <class Field>
+bool CheckDet( const Field & F,
+	       const element_t(Field) * A,
+	       const size_t & m,
+	       const size_t & lda,
+	       const element_t(Field) & alledged_det)
+{
+	 // std::cout << " is det truely " << alledged_det << " ?" << std::endl;
+	element_t(Field) * Acopy = new element_t(Field)[m*m] ;
+	FFLAS::fassign(F,m*m,A,1,Acopy,1);
+	element_t(Field) true_det = FFPACK::Det(F,m,m,Acopy,lda);
+	delete[] Acopy ;
+	// std::cout << "It is " << true_det << "." << std::endl;
+	return (alledged_det == true_det);
+}
+
+/*!
+ * Builds a \p m x \p n random matrix of rank \p rank over field \p F.
+ */
+template <class Field >
+void RandomMatrixWithRank(const Field & F,
+			  element_t(Field) * A,
+			  const size_t & m,
+			  const size_t & n,
+			  const size_t & lda,
+			  const size_t & rank)
+{
+	assert(rank <= m);
+	assert(rank <= n);
+
+	//                srandom( (unsigned) time(NULL)  ) ; // on met une nouvelle graine.
+	typename Field::RandIter G(F);
+	typename Field::NonZeroRandIter Gn(G);
+	typedef element_t(Field) Element;
+
+	Element * B = new Element[m*m];
+	Element * C = new Element[m*n];
+	// Create B a random invertible matrix (m x m format)
+	for (size_t j=0 ; j<m ; ++j){
+		size_t i= 0;
+		for ( ; i<j ; ++i)
+			F.assign (*(B+i*m+j),F.zero); // triangulaire
+		assert(i==j);
+		Gn.random(*(B+j*m+j));
+		for (++i; i<m;++i)
+			G.random (*(B+i*m+j));
+	}
+	// Create C a random matrix of rank \p ( m x n format)
+	for (size_t i = 0; i < rank; ++i){
+		size_t j = 0;
+		for ( ; j < std::min(i,n) ; ++j)
+			F.assign (*(C+i*n+j),F.zero);
+		for ( ; j < n ; ++j)
+			Gn.random (*(C+i*n+j));
+	}
+	for (size_t i = n*rank; i < n*m; ++i){
+		F.assign (*(C+i),F.zero);
+	}
+	linbox_check(CheckRank(F,C,m,n,n,rank));
+	// create P a random permutation of size \p n
+	size_t *P = new size_t[n];
+	RandomPermutation(P,n);
+	// create Q a random permutation of size \p m
+	size_t *Q = new size_t[m];
+	RandomPermutation(Q,m);
+	FFPACK::applyP(F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
+		       n, 0, (int)m, C, n, Q );
+	FFPACK::applyP(F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
+		       m, 0, (int)n, C, n, P );
+	FFLAS::fgemm( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, m, n, m,
+		      F.one, B, m, C, n, F.zero, A, lda );
+	delete[] B;
+	delete[] C;
+	delete[] P;
+	delete[] Q;
+	linbox_check(CheckRank(F,A,m,n,lda,rank));
+	return;
+
+}
+
+/*!
+ * Builds a \p m x \p m random matrix of determinant \p det over field \p F.
+ */
+template <class Field >
+void RandomMatrixWithDet(const Field & F,
+			 element_t(Field) * A,
+			 const size_t & m,
+			 const size_t & lda, //!@bug not used
+			 const element_t(Field) & det)
+{
+	typename Field::RandIter G(F);
+	typename Field::NonZeroRandIter Gn(G);
+	typedef element_t(Field) Element;
+
+	Element * B = new Element[m*m];
+	Element * C = new Element[m*m];
+
+	size_t *P = new size_t[m];
+	//srandom( (unsigned) time(NULL) ) ; // on met une nouvelle graine.
+	RandomPermutation(P,m);
+	// create Q a random permutation of size \p m
+	size_t *Q = new size_t[m];
+	RandomPermutation(Q,m);
+
+	int sgn = permutationDet(P,m);
+	sgn *= permutationDet(Q,m);
+
+
+	// Create B a random invertible matrix (m x m format) of determinant \p det
+	for (size_t j=0 ; j<m ; ++j){
+		for (size_t i = 0 ; i<j ; ++i)
+			F.assign (*(B+i*m+j),F.zero); // triangulaire
+		Gn.random(*(B+j*m+j) );
+		for (size_t i=j+1; i<m;++i)
+			G.random (*(B+i*m+j));
+	}
+	{
+		Element dx = F.one;
+		size_t j=0;
+		for ( ; j<m-1 ; ++j){
+			F.mulin(dx,B[j*m+j]);
+		}
+		F.invin(dx);
+		F.mulin(dx,det);
+		if (sgn < 0)
+			F.negin(dx);
+		B[j*m+j]=dx;
+	}
+	// write_field(F,std::cout << "L:=",B,m,m,m,true) << ';'<<std::endl;
+	Element mdet ; F.neg(mdet,det);
+	assert(CheckDet(F,B,m,m,(sgn<0)?mdet:det));
+
+	// Create C a random matrix of rank \p ( m x m format)
+	// for (size_t i = 0; i < std::min(rank,m); ++i)
+	for (size_t i = 0; i < m; ++i){
+		size_t j = 0;
+		for ( ; j < i ; ++j)
+			F.assign (*(C+i*m+j),F.zero);
+		assert(i==j);
+		F.assign (*(C+i*m+j),F.one);
+		for ( ++j ; j < m ; ++j)
+			G.random (*(C+i*m+j));
+	}
+	assert(CheckDet(F,C,m,m,F.one));
+	// write_field(F,std::cout << "U:=",C,m,m,m,true) << ';'<<std::endl;
+	// create P a random permutation of size \p m
+	FFPACK::applyP(F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
+		       m, 0, (int)m, C, m, Q );
+	//PrintLapackPermutation(P,m,std::cout << "P == ");
+	// write_field (F, std::cout<<"C_perm1="<<std::endl, C, m, m, m);
+	FFPACK::applyP(F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
+		       m, 0, (int)m, C, m, P );
+	//PrintLapackPermutation(Q,m,std::cout << "Q == ");
+	//write_field (F, std::cout<<"C_perm2="<<std::endl, C, m, m, m);
+	// A = B*C (m x m format), of rank \p rank
+	FFLAS::fgemm( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, m, m, m,
+		      F.one, B, m, C, m, F.zero, A, m );
+	delete[] B;
+	delete[] C;
+	delete[] Q;
+	delete[] P;
+
+	// write_field(F,std::cout << "A:=",A,m,m,m,true) << ';'<<std::endl;
+	assert(CheckDet(F,A,m,m,det));
+	return;
+
+}
+
+} // LinBox
+
+
+#endif // __LINBOX_tests_test_matrix_utils_H
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-mg-block-lanczos.C b/tests/test-mg-block-lanczos.C
index baf0d46..14579fd 100644
--- a/tests/test-mg-block-lanczos.C
+++ b/tests/test-mg-block-lanczos.C
@@ -6,20 +6,20 @@
  *
  * --------------------------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -40,11 +40,11 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
+
 
 #include "linbox/util/commentator.h"
 #include "linbox/field/modular.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/vector/stream.h"
 #include "linbox/algorithms/mg-block-lanczos.h"
 
@@ -62,7 +62,7 @@ static bool testRandomSolve (const Field           &F,
 			     VectorStream<Vector2> &y_stream,
 			     size_t                 N)
 {
-	typedef MGBlockLanczosSolver<Field, BlasMatrix<Field> > MGBLSolver;
+	typedef MGBlockLanczosSolver<Field, BlasMatrix<Field,typename RawVector<typename Field::Element >::Dense> > MGBLSolver;
 
 	commentator().start ("Testing random solve (Block Lanczos)", "testRandomSolve", y_stream.size ());
 
@@ -74,7 +74,7 @@ static bool testRandomSolve (const Field           &F,
 	VectorDomain<Field> VD (F);
 	MatrixDomain<Field> MD (F);
 
-	Vector2 y, b, x1, x2;
+	Vector2 y(F), b(F), x1(F), x2(F);
 
 	VectorWrapper::ensureDim (b, y_stream.dim ());
 	VectorWrapper::ensureDim (y, y_stream.dim ());
@@ -135,7 +135,7 @@ static bool testSampleNullspace (const Field           &F,
 				 size_t                 N,
 				 unsigned int           num_iter)
 {
-	typedef BlasMatrix<Field> Matrix;
+	typedef BlasMatrix<Field,typename RawVector<typename Field::Element >::Dense> Matrix;
 	typedef MGBlockLanczosSolver<Field, Matrix> MGBLSolver;
 
 	commentator().start ("Testing sampling from nullspace (Block Lanczos)", "testSampleNullspace", num_iter);
@@ -144,7 +144,6 @@ static bool testSampleNullspace (const Field           &F,
 	std::ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
 
 	bool ret = true;
-	unsigned int number;
 
 	MatrixDomain<Field> MD (F);
 
@@ -170,6 +169,7 @@ static bool testSampleNullspace (const Field           &F,
 	for (unsigned int i = 0; i < num_iter; ++i) {
 		commentator().startIteration (i);
 
+	unsigned int number;
 		number = mgblsolver.sampleNullspace (A, x);
 
 		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION)
@@ -205,10 +205,10 @@ int main (int argc, char **argv)
 		END_OF_ARGUMENTS
 	};
 
-	typedef Modular<uint8_t> Field;
+	typedef Givaro::Modular<uint8_t> Field;
 
 	parseArguments (argc, argv, args);
-	Field F (q);
+	Field F ((uint32_t)q); Field::RandIter gen(F);
 
 	commentator().start("Montgomery block Lanczos test suite");
 
@@ -218,10 +218,10 @@ int main (int argc, char **argv)
 	commentator().getMessageClass (TIMING_MEASURE).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
 	commentator().getMessageClass (PROGRESS_REPORT).setMaxDepth (0);
 
-	RandomSparseStream<Field> A_stream (F, (double) k / (double) n, n, n);
-	RandomDenseStream<Field> y_stream (F, n, i);
+	RandomSparseStream<Field> A_stream (F, gen, (double) k / (double) n, (size_t)n, (size_t)n);
+	RandomDenseStream<Field> y_stream (F, gen, (size_t)n, (size_t)i);
 
-	if (!testRandomSolve (F, A_stream, y_stream, N)) pass=false;;
+	if (!testRandomSolve (F, A_stream, y_stream, (size_t)N)) pass=false;;
 	commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION)
 		<< "	Skipping Sample Nullspace test (which has mem problems)" << std::endl;
 	//if (!testSampleNullspace (F, A_stream, N, i)) pass=false;;
@@ -230,11 +230,10 @@ int main (int argc, char **argv)
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-minpoly.C b/tests/test-minpoly.C
index 4752ed8..30a202a 100644
--- a/tests/test-minpoly.C
+++ b/tests/test-minpoly.C
@@ -11,20 +11,20 @@
  *
  * --------------------------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -45,16 +45,19 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
+
 #include <cstdio>
 
-#include "linbox/field/modular.h"
-#include "linbox/field/givaro.h"
-#include "linbox/blackbox/sparse.h"
+#include "givaro/modular.h"
+#include "givaro/gfq.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/blackbox/scalar-matrix.h"
 #include "linbox/util/commentator.h"
 #include "linbox/solutions/minpoly.h"
 #include "linbox/vector/stream.h"
 
+#include "linbox/vector/blas-vector.h"
+
 #include "test-common.h"
 
 using namespace LinBox;
@@ -62,16 +65,16 @@ using namespace LinBox;
 /* Test 0: Minimal polynomial of the zero matrix
 */
 template <class Field, class Meth>
-static bool testZeroMinpoly (Field &F, size_t n, bool symmetrizing, const Meth& M)
+static bool testZeroMinpoly (Field &F, size_t n, const Meth& M)
 {
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
 	commentator().start ("Testing zero minpoly", "testZeroMinpoly");
-	typedef vector <typename Field::Element> Polynomial;
-	Polynomial phi;
+	typedef BlasVector<Field> Polynomial;
+	Polynomial phi(F);
 	SparseMatrix<Field> A(F, n, n);
 	minpoly(phi, A, M);
 
-	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
-        A.write(report, FORMAT_MAPLE);
+        A.write(report, Tag::FileFormat::Maple);
 	report << "Minimal polynomial is: ";
 
 	printPolynomial<Field, Polynomial> (F, report, phi);
@@ -81,8 +84,7 @@ static bool testZeroMinpoly (Field &F, size_t n, bool symmetrizing, const Meth&
 		ret = true;
 	else
 	{
-		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-			<< "ERROR: A = 0, should get x, got ";
+		report << "ERROR: A = 0, should get x, got ";
 		printPolynomial<Field, Polynomial> (F, report, phi);
 		report << endl;
 		ret = false;
@@ -90,11 +92,6 @@ static bool testZeroMinpoly (Field &F, size_t n, bool symmetrizing, const Meth&
 	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testZeroMinpoly");
 	return ret;
 }
-template <class Field>
-static bool testZeroMinpoly (Field &F, size_t n)
-{
-	return testZeroMinpoly(F, n, false, Method::Blackbox());
-}
 
 /* Test 1: Minimal polynomial of the identity matrix
  *
@@ -108,24 +105,20 @@ static bool testZeroMinpoly (Field &F, size_t n)
  */
 
 template <class Field, class Meth>
-static bool testIdentityMinpoly (Field &F, size_t n, bool symmetrizing, const Meth& M)
+static bool testIdentityMinpoly (Field &F, size_t n, const Meth& M)
 {
-	typedef vector <typename Field::Element> Vector;
-	typedef vector <typename Field::Element> Polynomial;
-	typedef SparseMatrix<Field> Blackbox;
-	typedef typename Blackbox::Row Row;
+	typedef BlasVector<Field> Polynomial;
+	typedef ScalarMatrix<Field> Blackbox;
 
 	commentator().start ("Testing identity minpoly", "testIdentityMinpoly");
 
 	typename Field::Element c0, c1;
 
-	StandardBasisStream<Field, Row> stream (F, n);
-	Blackbox A (F, stream);
+	//StandardBasisStream<Field, Row> stream (F, n);
+	Blackbox A (F, n, n, F.one);
 
-	Polynomial phi;
+	Polynomial phi(F);
 
-	//if (symmetrizing) minpolySymmetric (phi, A);
-	//else minpoly (phi, A);
 	minpoly (phi, A, M );
 
 	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
@@ -134,8 +127,8 @@ static bool testIdentityMinpoly (Field &F, size_t n, bool symmetrizing, const Me
 
 	bool ret;
 
-	F.init (c0, -1);
-	F.init (c1, 1);
+	F.assign(c0, F.mOne);
+	F.assign(c1, F.one);
 
 	if (phi.size () == 2 && F.areEqual (phi[0], c0) && F.areEqual (phi[1], c1))
 		ret = true;
@@ -151,12 +144,6 @@ static bool testIdentityMinpoly (Field &F, size_t n, bool symmetrizing, const Me
 	return ret;
 }
 
-template <class Field>
-static bool testIdentityMinpoly (Field &F, size_t n, bool symmetrizing=false)
-{
-    return testIdentityMinpoly(F, n, symmetrizing, Method::Blackbox());
-}
-
 /* Test 2: Minimal polynomial of a nilpotent matrix
  *
  * Construct an index-n nilpotent matrix and compute its minimal
@@ -171,9 +158,8 @@ static bool testIdentityMinpoly (Field &F, size_t n, bool symmetrizing=false)
 template <class Field, class Meth>
 static bool testNilpotentMinpoly (Field &F, size_t n, const Meth& M)
 {
-	typedef vector <typename Field::Element> Vector;
-	typedef vector <typename Field::Element> Polynomial;
-	typedef SparseMatrix <Field> Blackbox;
+	typedef BlasVector<Field> Polynomial;
+	typedef SparseMatrix<Field> Blackbox;
 	typedef typename Blackbox::Row Row;
 
 	commentator().start ("Testing nilpotent minpoly", "testNilpotentMinpoly");
@@ -188,12 +174,12 @@ static bool testNilpotentMinpoly (Field &F, size_t n, const Meth& M)
 	stream.next (v);
 	Blackbox A (F, stream); // first subdiagonal is 1's.
 
-	Polynomial phi(n+1);
+	Polynomial phi(F,n+1);
 
 	minpoly (phi, A, M);
 
 	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
-        A.write (report, FORMAT_MAPLE);
+        A.write (report, Tag::FileFormat::Maple);
 	report << "Minimal polynomial is: ";
 	printPolynomial (F, report, phi);
 
@@ -214,11 +200,6 @@ static bool testNilpotentMinpoly (Field &F, size_t n, const Meth& M)
 
 	return ret;
 }
-template <class Field>
-static bool testNilpotentMinpoly (Field &F, size_t n)
-{
-    return testNilpotentMinpoly(F, n, Method::Blackbox());
-}
 
 /* Test 3: Random minpoly of sparse matrix
  *
@@ -241,14 +222,13 @@ bool testRandomMinpoly (Field                 &F,
 			VectStream &v_stream,
                         const Meth& M)
 {
-	typedef std::vector <typename Field::Element> Polynomial;
-	typedef SparseMatrix <Field> Blackbox;
+	typedef BlasVector<Field> Polynomial;
+	typedef SparseMatrix<Field> Blackbox;
         typedef typename VectStream::Vector Vector;
 
-        commentator().start ("Testing sparse random minpoly", "testRandomMinpoly", iterations);
+        commentator().start ("Testing sparse random minpoly", "testRandomMinpoly", (unsigned int)iterations);
 
 	bool ret = true;
-	bool iter_passed;
 
 	VectorDomain<Field> VD (F);
 
@@ -258,18 +238,18 @@ bool testRandomMinpoly (Field                 &F,
 	VectorWrapper::ensureDim (w, v_stream.n ());
 
 	for (int i = 0; i < iterations; i++) {
-		commentator().startIteration (i);
+		commentator().startIteration ((unsigned int)i);
 
-		iter_passed = true;
+		bool iter_passed = true;
 
 		A_stream.reset ();
 		Blackbox A (F, A_stream);
 
 		ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
 		report << "Matrix:" << endl;
-		A.write (report, FORMAT_MAPLE);
+		A.write (report, Tag::FileFormat::Maple);
 
-		Polynomial phi;
+		Polynomial phi(F);
 
 		minpoly (phi, A, M );
 
@@ -309,14 +289,6 @@ bool testRandomMinpoly (Field                 &F,
 
 	return ret;
 }
-template <class Field, class BBStream, class VectStream>
-bool testRandomMinpoly (Field                 &F,
-			int                    iterations,
-			BBStream    &A_stream,
-			VectStream &v_stream)
-{
-    return testRandomMinpoly(F, iterations, A_stream, v_stream, Method::Blackbox());
-}
 
 /* Test 4: test gram matrix.
      A test of behaviour with self-orthogonal rows and cols.
@@ -329,18 +301,17 @@ bool testRandomMinpoly (Field                 &F,
 	 if p is large, size is 2 and minpoly is x^2 -1.
 */
 template <class Field, class Meth>
-static bool testGramMinpoly (Field &F, size_t m, bool symmetrizing, const Meth& M)
+static bool testGramMinpoly (Field &F, size_t m, const Meth& M)
 {
 	commentator().start ("Testing gram minpoly", "testGramMinpoly");
-	typedef vector <typename Field::Element> Polynomial;
+	typedef BlasVector<Field> Polynomial;
 	integer n;
 	F.characteristic(n); n += 1;
 	if (n > 30) n = 2;
-	Polynomial phi;
-	typename Field::Element one, zero, neg1; F.init(one, 1); F.init(zero, 0); F.init(neg1); F.neg(neg1, one);
+	Polynomial phi(F);
 	BlasMatrix<Field> A(F, n, n);
-	for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) A.setEntry(i, j, one);
-	for (int i = 0; i < n; ++i) A.setEntry(i, i, zero);
+	for (size_t i = 0; i < n; ++i) for (size_t j = 0; j < n; ++j) A.setEntry(i, j, F.one);
+	for (size_t i = 0; i < n; ++i) A.setEntry(i, i, F.zero);
 	minpoly(phi, A, M);
 
 	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
@@ -350,7 +321,7 @@ static bool testGramMinpoly (Field &F, size_t m, bool symmetrizing, const Meth&
 
 	bool ret;
 	if (n == 2)
-		if ( phi.size() == 3 && F.areEqual(phi[0], neg1) && F.isZero(phi[1]) && F.isOne(phi[2]))
+		if ( phi.size() == 3 && F.areEqual(phi[0], F.mOne) && F.isZero(phi[1]) && F.isOne(phi[2]))
 			ret = true;
 		else
 		{
@@ -373,13 +344,6 @@ static bool testGramMinpoly (Field &F, size_t m, bool symmetrizing, const Meth&
 		return ret;
 }
 
-template <class Field>
-static bool testGramMinpoly (Field &F, size_t n)
-{
-	return testGramMinpoly(F, n, false, Method::Blackbox());
-}
-
-
 int main (int argc, char **argv)
 {
 	commentator().setMaxDetailLevel (-1);
@@ -388,15 +352,17 @@ int main (int argc, char **argv)
 	bool pass = true;
 
 	static size_t n = 10;
-	//static integer q = 2147483647U;
-	static integer q = 1000003; // ok for both Modular<int> and Modular<double>
+	//static integer q = 65521U;
+	static integer q = 1000003; // ok for both Givaro::Modular<int> and Givaro::Modular<double>
+	static int e = 1; // exponent for field characteristic
 	static int iterations = 1;
 	static int numVectors = 1;
 	static int k = 3;
 
 	static Argument args[] = {
 		{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT,     &n },
-		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+		{ 'q', "-q Q", "Operate over the \"field\" GF(Q^E) [1].", TYPE_INTEGER, &q },
+		{ 'e', "-e E", "Operate over the \"field\" GF(Q^E) [1].", TYPE_INT, &e },
 		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
 		{ 'v', "-v V", "Use V test vectors for the random minpoly tests.", TYPE_INT,     &numVectors },
 		{ 'k', "-k K", "K nonzero Elements per row in sparse random apply test.", TYPE_INT,     &k },
@@ -409,77 +375,83 @@ int main (int argc, char **argv)
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (10);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
 
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
 	// /////////////// finite field part //////////////////
-	if (q > 5 && q % 2 != 0 && q % 3 != 0 && q % 5 != 0 )
+	Method::Blackbox MB;
+	//if (e == 1)
 	{
-		//typedef Modular<uint32_t> Field;
-		//typedef Modular<int> Field;
-		typedef Modular<double> Field;
+		//typedef Givaro::Modular<uint32_t> Field;
+		//typedef Givaro::Modular<int> Field;
+		typedef Givaro::Modular<double> Field;
 		Field F (q);
 		srand ((unsigned)time (NULL));
 
 		commentator().start("Blackbox prime field minpoly test suite", "Wminpoly");
 
-		//no symmetrizing
-		if (!testZeroMinpoly  	  (F, n)) pass = false;
-		if (!testIdentityMinpoly  (F, n)) pass = false;
-		if (!testNilpotentMinpoly (F, n)) pass = false;
+		if (!testZeroMinpoly  	  (F, n, MB)) pass = false;
+		if (!testIdentityMinpoly  (F, n, MB)) pass = false;
+		if (!testNilpotentMinpoly (F, n, MB)) pass = false;
 		//if (!testRandomMinpoly    (F, n)) pass = false;
-		if (!testGramMinpoly      (F, n)) pass = false;
-
-		// symmetrizing
-		//if (!testZeroMinpoly  	  (F, n, true)) pass = false;
-		if (!testIdentityMinpoly  (F, n, true)) pass = false;
-		//if (!testNilpotentMinpoly (F, n, true)) pass = false;
-		//if (!testRandomMinpoly    (F, n, true)) pass = false;
-		//if (!testGramMinpoly      (F, n, true)) pass = false;
+		if (!testGramMinpoly      (F, n, MB)) pass = false;
 		//need other tests...
 
 		commentator().stop("Blackbox prime field minpoly test suite");
 	}
-	else{
-
-		int p;
-		if (q % 2 == 0) p = 2;
-		if (q % 3 == 0) p = 3;
-		if (q % 5 == 0) p = 5;
-		int e = 0;  do {++e; q = q/p; } while (q > 1);
-		typedef GivaroGfq Field;
-		Field F (p, e);
+	//else
+	{	q = 3; e = 10;
+
+		typedef Givaro::GFqDom<int64_t> Field;
+		Field F (q, e);
 		srand ((unsigned)time (NULL));
 
-		commentator().start("Blackbox non-prime field minpoly test suite", "Wminpoly");
-		ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+		commentator().start("Blackbox gfq field minpoly test suite", "Wminpoly");
 		F.write(report);
 
-		//no symmetrizing
-		if (!testZeroMinpoly  	  (F, n)) pass = false;
-		if (!testIdentityMinpoly  (F, n)) pass = false;
-		if (!testNilpotentMinpoly (F, n)) pass = false;
+		if (!testZeroMinpoly  	  (F, n, MB)) pass = false;
+		if (!testIdentityMinpoly  (F, n, MB)) pass = false;
+		if (!testNilpotentMinpoly (F, n, MB)) pass = false;
 		//if (!testRandomMinpoly    (F, n)) pass = false;
-		if (!testGramMinpoly      (F, n)) pass = false;
-
-		// symmetrizing
-		//if (!testZeroMinpoly  	  (F, n, true)) pass = false;
-		if (!testIdentityMinpoly  (F, n, true)) pass = false;
-		//if (!testNilpotentMinpoly (F, n, true)) pass = false;
-		//if (!testRandomMinpoly    (F, n, true)) pass = false;
-		//if (!testGramMinpoly      (F, n, true)) pass = false;
+		if (!testGramMinpoly      (F, n, MB)) pass = false;
 		//need other tests...
 
-		commentator().stop("Blackbox non-prime field minpoly test suite");
+		commentator().stop("Blackbox gfq minpoly test suite");
 	}
 
 #if 0
+// this test can only work if Extension of Extension is compiling. -bds
 
-	Modular<uint32_t> F (q);
+	{	q = 3; e = 2;
+		typedef Givaro::Modular<int32_t> GroundField;
+		typedef Givaro::Extension<GroundField> Field;
+		GroundField K(q);
+		Field F (K, e);
+		srand ((unsigned)time (NULL));
+		MB.certificate(false);
+
+		commentator().start("Blackbox givaro extension field minpoly test suite", "Wminpoly");
+		F.write(report);
+
+		if (!testZeroMinpoly  	  (F, n, MB)) pass = false;
+		if (!testIdentityMinpoly  (F, n, MB)) pass = false;
+		if (!testNilpotentMinpoly (F, n, MB)) pass = false;
+		//if (!testRandomMinpoly    (F, n)) pass = false;
+		if (!testGramMinpoly      (F, n, MB)) pass = false;
+		//need other tests...
+
+		commentator().stop("Blackbox givaro extension field minpoly test suite");
+	}
+#endif
+
+#if 1
+
+	Givaro::Modular<uint32_t> F (q);
 
 
 	commentator().start("Hybrid prime field minpoly test suite", "Hminpoly");
-	if (!testIdentityMinpoly  (F, n, false,  Method::Hybrid())) pass = false;
+	if (!testIdentityMinpoly  (F, n, Method::Hybrid())) pass = false;
 	if (!testNilpotentMinpoly (F, n, Method::Hybrid())) pass = false;
 	commentator().stop("Hybrid prime field minpoly test suite");
-
+#elif 0
 	commentator().start("Blackbox prime field minpoly test suite", "Bminpoly");
 	if (!testIdentityMinpoly  (F, n, false,  Method::Blackbox())) pass = false;
 	if (!testNilpotentMinpoly (F, n, Method::Blackbox())) pass = false;
@@ -491,10 +463,10 @@ int main (int argc, char **argv)
 	commentator().stop("Elimination prime field minpoly test suite");
 
 	// /////////////// integer part //////////////////
-	typedef vector<PID_integer::Element> ZDenseVector;
-	typedef SparseMatrix<PID_integer>::Row ZSparseVector;
+	typedef vector<Givaro::ZRing<Integer>::Element> ZDenseVector;
+	typedef SparseMatrix<Givaro::ZRing<Integer> >::Row ZSparseVector;
 	//typedef pair<vector<size_t>, vector<Field::Element> > SparseVector;
-	PID_integer Z;
+	Givaro::ZRing<Integer> Z;
 	srand ((unsigned)time (NULL));
 
 	commentator().getMessageClass (TIMING_MEASURE).setMaxDepth (10);
@@ -503,35 +475,30 @@ int main (int argc, char **argv)
 
 	commentator().start("Blackbox integer minpoly test suite", "WIminpoly");
 
-	RandomDenseStream<PID_integer, ZDenseVector, NonzeroRandIter<PID_integer> >
-	zv_stream (Z, NonzeroRandIter<PID_integer> (Z, PID_integer::RandIter (Z)), n, numVectors);
-	RandomSparseStream<PID_integer, ZSparseVector, NonzeroRandIter<PID_integer> >
-	zA_stream (Z, NonzeroRandIter<PID_integer> (Z, PID_integer::RandIter (Z)), (double) k / (double) n, n, n);
+	RandomDenseStream<Givaro::ZRing<Integer>, ZDenseVector, NonzeroRandIter<Givaro::ZRing<Integer> > >
+	zv_stream (Z, NonzeroRandIter<Givaro::ZRing<Integer> > (Z, Givaro::ZRing<Integer>::RandIter (Z)), n, numVectors);
+	RandomSparseStream<Givaro::ZRing<Integer>, ZSparseVector, NonzeroRandIter<Givaro::ZRing<Integer> > >
+	zA_stream (Z, NonzeroRandIter<Givaro::ZRing<Integer> > (Z, Givaro::ZRing<Integer>::RandIter (Z)), (double) k / (double) n, n, n);
 
-	// Hybrid
-	//no symmetrizing
-	if (!testIdentityMinpoly  (Z, n)) pass = false;
-	if (!testNilpotentMinpoly (Z, n)) pass = false;
+	if (!testIdentityMinpoly  (Z, n, MB)) pass = false;
+	if (!testNilpotentMinpoly (Z, n, MB)) pass = false;
 
 	if (!testRandomMinpoly    (Z, iterations, zA_stream, zv_stream)) pass = false;
 
-	// symmetrizing
-	if (!testIdentityMinpoly  (Z, n, true)) pass = false;
-
 	commentator().stop("Blackbox integer minpoly test suite");
 
 	commentator().start("Hybrid integer minpoly test suite", "HIminpoly");
-	if (!testIdentityMinpoly  (Z, n, false,  Method::Hybrid())) pass = false;
+	if (!testIdentityMinpoly  (Z, n, Method::Hybrid())) pass = false;
 	if (!testNilpotentMinpoly (Z, n, Method::Hybrid())) pass = false;
 	commentator().stop("Hybrid integer minpoly test suite");
 
 	commentator().start("Blackbox integer minpoly test suite", "BIminpoly");
-	if (!testIdentityMinpoly  (Z, n, false,  Method::Blackbox())) pass = false;
+	if (!testIdentityMinpoly  (Z, n, Method::Blackbox())) pass = false;
 	if (!testNilpotentMinpoly (Z, n, Method::Blackbox())) pass = false;
 	commentator().stop("Blackbox integer minpoly test suite");
 
 	commentator().start("Elimination integer minpoly test suite", "EIminpoly");
-	if (!testIdentityMinpoly  (Z, n, false,  Method::Elimination())) pass = false;
+	if (!testIdentityMinpoly  (Z, n, Method::Elimination())) pass = false;
 	if (!testNilpotentMinpoly (Z, n, Method::Elimination())) pass = false;
 	commentator().stop("Elimination integer minpoly test suite");
 
@@ -539,11 +506,10 @@ int main (int argc, char **argv)
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-modular-balanced-double.C b/tests/test-modular-balanced-double.C
index 7bda7fe..bb9ac02 100644
--- a/tests/test-modular-balanced-double.C
+++ b/tests/test-modular-balanced-double.C
@@ -28,24 +28,16 @@
  * @test   tests only runFieldTests on modular-balanced-double
  */
 
-
+#include <linbox/linbox-config.h>
+#include <givaro/modular-balanced.h>
+#include <givaro/givintprime.h>
 
 #include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <sstream>
-#include <vector>
-#include <queue>
-
-#include "linbox/field/modular-balanced.h"
-
 #include "linbox/util/commentator.h"
 #include "linbox/util/debug.h"
 
 
-#include "test-common.h"
-#include "test-generic.h"
+#include "test-field.h"
 
 using namespace LinBox;
 
@@ -54,7 +46,7 @@ using namespace LinBox;
 int main (int argc, char **argv)
 {
 	static size_t n = 1000;
-	static int iterations = 1;
+	static unsigned int iterations = 1;
 	static int trials = 10000;
 	static int categories = 1000;
 	static int hist_level = 10;
@@ -70,35 +62,48 @@ int main (int argc, char **argv)
 
 	parseArguments (argc, argv, args);
 
-	commentator().start("ModularBalanced<double> field test suite", "ModularBalanced<double>");
+	commentator().start("Givaro::ModularBalanced<double> field test suite", "Givaro::ModularBalanced<double>");
 	bool pass = true;
 
-	ModularBalanced<double> F_int (67108859);
-	ModularBalanced<double> G_int (2011);
-	ModularBalanced<double> H_int (3);
+	Givaro::IntPrimeDom IPD;
+	integer k; 
+	IPD.nextprime(k,Givaro::ModularBalanced<double>::minCardinality()-1);
+	Givaro::ModularBalanced<double> Fmin (k);
+	Givaro::ModularBalanced<double> F5 (5);
+	Givaro::ModularBalanced<double> F7 (7);
 
-	integer k = FieldTraits<ModularBalanced<double> >::maxModulus() ;
-	prevprime(k,k);
-	ModularBalanced<double> I_int(k);
+	IPD.prevprime(k,Givaro::ModularBalanced<double>::maxCardinality()+1);
+	Givaro::ModularBalanced<double> Fmax(k);
+	IPD.prevprime(k,k/2);
+	Givaro::ModularBalanced<double> Fmid(k);
 
 	// Make sure some more detailed messages get printed
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
 
-	if (!runFieldTests (F_int,  "ModularBalanced<double>",  iterations, n, false)) pass = false;
-	// if (!testRandomIterator (F_int,  "ModularBalanced<double>", trials, categories, hist_level)) pass = false;
+	commentator().report() << "Fmin modulus is " << Fmin.cardinality() << std::endl;
+	if (!runFieldTests (Fmin,  "Givaro::ModularBalanced<double> Fmin",  iterations, n, false)) pass = false;
+	// if (!testRandomIterator (Fmin,  "Givaro::ModularBalanced<double>", trials, categories, hist_level)) pass = false;
+
+	commentator().report() << "F5 modulus is " << F5.cardinality() << std::endl;
+	if (!runFieldTests (F5,  "Givaro::ModularBalanced<double> F5",  iterations, n, false)) pass = false;
+	// if (!testRandomIterator (F5,  "Givaro::ModularBalanced<double>", trials, categories, hist_level)) pass = false;
 
-	if (!runFieldTests (G_int,  "ModularBalanced<double>",  iterations, n, false)) pass = false;
-	// if (!testRandomIterator (G_int,  "ModularBalanced<double>", trials, categories, hist_level)) pass = false;
+	commentator().report() << "F7 modulus is " << F7.cardinality() << std::endl;
+	if (!runFieldTests (F7,  "Givaro::ModularBalanced<double> F7",  iterations, n, false)) pass = false;
+	// if (!testRandomIterator (F7,  "Givaro::ModularBalanced<double>", trials, categories, hist_level)) pass = false;
 
-	if (!runFieldTests (H_int,  "ModularBalanced<double>",  iterations, n, false)) pass = false;
-	// if (!testRandomIterator (H_int,  "ModularBalanced<double>", trials, categories, hist_level)) pass = false;
+	commentator().report() << "Fmax modulus is " << Fmax.cardinality() << std::endl;
+	commentator().report() << "maxCardinality is " << Givaro::ModularBalanced<double>::maxCardinality() << std::endl;
+	if (!runFieldTests (Fmax,  "Givaro::ModularBalanced<double> Fmax",  iterations, n, false)) pass = false;
+	// if (!testRandomIterator (Fmax,  "Givaro::ModularBalanced<double>", trials, categories, hist_level)) pass = false;
 
-	if (!runFieldTests (I_int,  "ModularBalanced<double>",  iterations, n, false)) pass = false;
-	// if (!testRandomIterator (I_int,  "ModularBalanced<double>", trials, categories, hist_level)) pass = false;
+	commentator().report() << "Fmid modulus is " << Fmid.cardinality() << std::endl;
+	if (!runFieldTests (Fmid,  "Givaro::ModularBalanced<double> Fmid",  iterations, n, false)) pass = false;
+	// if (!testRandomIterator (Fmid,  "Givaro::ModularBalanced<double>", trials, categories, hist_level)) pass = false;
 
 
-	commentator().stop("ModularBalanced<double> field test suite");
+	commentator().stop("Givaro::ModularBalanced<double> field test suite");
 	return pass ? 0 : -1;
 }
 
diff --git a/tests/test-modular-balanced-float.C b/tests/test-modular-balanced-float.C
index 2c426dd..0b5af84 100644
--- a/tests/test-modular-balanced-float.C
+++ b/tests/test-modular-balanced-float.C
@@ -28,17 +28,14 @@
  * @test   tests only runFieldTests on modular-balanced-float
  */
 
-
+#include <linbox/linbox-config.h>
+#include <givaro/modular-balanced.h>
+#include <givaro/givintprime.h>
 
 #include "linbox/linbox-config.h"
+#include "linbox/util/commentator.h"
+#include "linbox/util/debug.h"
 
-#include <iostream>
-#include <fstream>
-#include <sstream>
-#include <vector>
-#include <queue>
-
-#include "linbox/field/modular-balanced.h"
 
 #include "test-common.h"
 #include "test-generic.h"
@@ -50,7 +47,7 @@ using namespace LinBox;
 int main (int argc, char **argv)
 {
 	static size_t n = 1000;
-	static int iterations = 1;
+	static unsigned int iterations = 1;
 	static int trials = 10000;
 	static int categories = 1000;
 	static int hist_level = 10;
@@ -66,36 +63,48 @@ int main (int argc, char **argv)
 
 	parseArguments (argc, argv, args);
 
-	commentator().start("ModularBalanced<float> field test suite", "ModularBalanced<float>");
+	commentator().start("Givaro::ModularBalanced<float> field test suite", "Givaro::ModularBalanced<float>");
 	bool pass = true;
 
-	ModularBalanced<float> F_int (4093);//(2147483629);//(2147483647);
-	ModularBalanced<float> G_int (2011);
-	ModularBalanced<float> H_int (3);
-	integer k = FieldTraits<ModularBalanced<float> >::maxModulus() ;
-	prevprime(k,k);
-	ModularBalanced<float> I_int(k);
+	Givaro::IntPrimeDom IPD;
+	integer k; 
+	IPD.nextprime(k,Givaro::ModularBalanced<float>::minCardinality()-1);
+	Givaro::ModularBalanced<float> Fmin (k);
+	Givaro::ModularBalanced<float> F5 (5);
+	Givaro::ModularBalanced<float> F7 (7);
+
+	IPD.prevprime(k,Givaro::ModularBalanced<float>::maxCardinality()+1);
+	Givaro::ModularBalanced<float> Fmax(k);
+	IPD.prevprime(k,k/2);
+	Givaro::ModularBalanced<float> Fmid(k);
 
 	// Make sure some more detailed messages get printed
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
 
-	if (!runFieldTests (F_int,  "ModularBalanced<float>",  iterations, n, false)) pass = false;
-	// if (!testRandomIterator (F_int,  "ModularBalanced<float>", trials, categories, hist_level)) pass = false;
-
-	if (!runFieldTests (G_int,  "ModularBalanced<float>",  iterations, n, false)) pass = false;
-	// if (!testRandomIterator (G_int,  "ModularBalanced<float>", trials, categories, hist_level)) pass = false;
+	commentator().report() << "Fmin modulus is " << Fmin.cardinality() << std::endl;
+	if (!runFieldTests (Fmin,  "Givaro::ModularBalanced<float> Fmin",  iterations, n, false)) pass = false;
+	// if (!testRandomIterator (Fmin,  "Givaro::ModularBalanced<float>", trials, categories, hist_level)) pass = false;
 
-	if (!runFieldTests (H_int,  "ModularBalanced<float>",  iterations, n, false)) pass = false;
-	// if (!testRandomIterator (H_int,  "ModularBalanced<float>", trials, categories, hist_level)) pass = false;
+	commentator().report() << "F5 modulus is " << F5.cardinality() << std::endl;
+	if (!runFieldTests (F5,  "Givaro::ModularBalanced<float> F5",  iterations, n, false)) pass = false;
+	// if (!testRandomIterator (F5,  "Givaro::ModularBalanced<float>", trials, categories, hist_level)) pass = false;
 
-	if (!runFieldTests (I_int,  "ModularBalanced<float>",  iterations, n, false)) pass = false;
-	// if (!testRandomIterator (I_int,  "ModularBalanced<float>", trials, categories, hist_level)) pass = false;
+	commentator().report() << "F7 modulus is " << F7.cardinality() << std::endl;
+	if (!runFieldTests (F7,  "Givaro::ModularBalanced<float> F7",  iterations, n, false)) pass = false;
+	// if (!testRandomIterator (F7,  "Givaro::ModularBalanced<float>", trials, categories, hist_level)) pass = false;
 
+	commentator().report() << "Fmax modulus is " << Fmax.cardinality() << std::endl;
+	commentator().report() << "maxCardinality is " << Givaro::ModularBalanced<float>::maxCardinality() << std::endl;
+	if (!runFieldTests (Fmax,  "Givaro::ModularBalanced<float> Fmax",  iterations, n, false)) pass = false;
+	// if (!testRandomIterator (Fmax,  "Givaro::ModularBalanced<float>", trials, categories, hist_level)) pass = false;
 
+	commentator().report() << "Fmid modulus is " << Fmid.cardinality() << std::endl;
+	if (!runFieldTests (Fmid,  "Givaro::ModularBalanced<float> Fmid",  iterations, n, false)) pass = false;
+	// if (!testRandomIterator (Fmid,  "Givaro::ModularBalanced<float>", trials, categories, hist_level)) pass = false;
 
 
-	commentator().stop("ModularBalanced<float> field test suite");
+	commentator().stop("Givaro::ModularBalanced<float> field test suite");
 	return pass ? 0 : -1;
 }
 
diff --git a/tests/test-modular-balanced-int.C b/tests/test-modular-balanced-int.C
index 968e88a..9f65339 100644
--- a/tests/test-modular-balanced-int.C
+++ b/tests/test-modular-balanced-int.C
@@ -1,71 +1,101 @@
-/* Copyright (C) LinBox
+/* tests/test-modular-balanced-int.C
+ * Copyright (C) 2001, 2002 Bradford Hovinen,
+ * Copyright (C) 2002, 2015 Dave Saunders
  *
+ * Written by Bradford Hovinen <hovinen at cis.udel.edu>,
+ *            Dave Saunders <saunders at cis.udel.edu>
+ *
+ * ------------------------------------
+ * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * Rename from test-large-modular.C to test-modular.C; made other updates in
+ * accordance with changes to Givaro::ModularBalanced interace.
+ * ------------------------------------
  *
  *
  * ========LICENCE========
  * This file is part of the library LinBox.
  *
-  * LinBox is free software: you can redistribute it and/or modify
+ * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
  *
  * This 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
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  * ========LICENCE========
+ *.
  */
 
-
-/*! @file  tests/test-modular-balanced-int.C
+/*! @file   tests/test-modular-balanced-int.C
  * @ingroup tests
- * @brief  tests only runFieldTests on modular-balanced-int32_t
- * @test   tests only runFieldTests on modular-balanced-int32_t
+ * @brief For each integer type T, Givaro::ModularBalanced<T> is tested with a small primm and with a large prime using runFieldTests and testRandomIterator.
  */
 
+#include <linbox/linbox-config.h>
 
+#include "givaro/modular-balanced.h"
+#include "givaro/givintprime.h"
 
-#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <sstream>
-#include <vector>
-#include <queue>
-
-#include "linbox/field/modular-balanced.h"
-
-#include "test-common.h"
-#include "test-generic.h"
-
+#include "test-field.h"
 using namespace LinBox;
 
-/*! @bug the arguments are meaningless
- */
+template<class int_type>
+bool launchTests(string int_type_name, integer q, size_t n, uint32_t trials, uint32_t categories, uint32_t hist_level) 
+	{ 
+		using Field = Givaro::ModularBalanced<int_type>;
+		bool pass = true ;
+
+		string field_name = "Givaro::ModularBalanced<" + int_type_name + ">";
+		string title = field_name + " field test suite";
+
+		commentator().start(title.c_str(), field_name.c_str());
+		// Make sure some more detailed messages get printed
+		commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
+		commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
+
+		commentator().report() << field_name << " range: [" << Field::minCardinality() << "," << Field::maxCardinality() << "]" << std::endl;
+
+		Field FS(q);
+		pass &= runFieldTests (FS,  field_name.c_str(), 1, n, false);
+		pass &= testRandomIterator (FS, field_name.c_str(), trials, categories, hist_level);
+
+		Givaro::IntPrimeDom IPD;
+		integer k = Field::maxCardinality();
+		if (k > 0) {
+			IPD.prevprime(k,k + 1);
+		} else {
+			static integer qi("18446744073709551557");
+			k = qi;
+		}
+		Field FL(k);
+		pass &= runFieldTests (FL,  field_name.c_str(), 1, n, false);
+		pass &= testRandomIterator (FL, field_name.c_str(), trials, categories, hist_level);
+
+		commentator().stop(MSG_STATUS(pass), "field test-suite");
+		return pass;
+	}
+
 int main (int argc, char **argv)
 {
-	static integer q1("18446744073709551557");
-	static integer q2 = 2147483647;
-	static integer q3 = 65521U;
-	static int q4 = 101;
-	static size_t n = 1000;
-	static int iterations = 1;
-	static int trials = 10000;
-	static int categories = 1000;
-	static int hist_level = 10;
+	// for field testing
+	static integer q = 5; // small prime valid for all int types.
+
+	// for randiter testing
+	static size_t n = 10000;
+	static unsigned int trials = 10000;
+	static unsigned int categories = 1000;
+	static unsigned int hist_level = 10;
 
 	static Argument args[] = {
-		{ 'K', "-K Q", "Operate over the \"field\" GF(Q) [1] for integer modulus.", TYPE_INTEGER, &q1 },
-		{ 'Q', "-Q Q", "Operate over the \"field\" GF(Q) [1] for uint32_t modulus.", TYPE_INTEGER, &q2 },
-		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1] for uint16_t modulus.", TYPE_INTEGER, &q3 },
-		{ 'p', "-p P", "Operate over the \"field\" GF(Q) [1] for uint8_t modulus.", TYPE_INT, &q4 },
+		{ 'K', "-K Q", "to use ModularBalanced<T> F(q). Must be valid for all int types T. (A large prime is also used.)", TYPE_INTEGER, &q },
 		{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT,     &n },
-		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
 		{ 't', "-t T", "Number of trials for the random iterator test.", TYPE_INT, &trials },
 		{ 'c', "-c C", "Number of categories for the random iterator test.", TYPE_INT, &categories },
 		{ 'H', "-H H", "History level for random iterator test.", TYPE_INT, &hist_level },
@@ -74,43 +104,30 @@ int main (int argc, char **argv)
 
 	parseArguments (argc, argv, args);
 
-	commentator().start("ModularBalanced<int32_t> field test suite", "ModularBalanced<int32_t>");
 	bool pass = true;
 
-	ModularBalanced<int32_t> F_int (1073741789);//(2147483629);//(2147483647);
-	ModularBalanced<int32_t> G_int (2147483647);
-	ModularBalanced<int32_t> H_int (3);
-	integer k = FieldTraits<ModularBalanced<int32_t> >::maxModulus() ;
-	prevprime(k,k);
-	ModularBalanced<int32_t> I_int(k);
-
-	// Make sure some more detailed messages get printed
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
-
-	if (!runFieldTests (F_int,  "ModularBalanced<int32_t>",  iterations, n, false)) pass = false;
-	if (!testRandomIterator (F_int,  "ModularBalanced<int32_t>", trials, categories, hist_level)) pass = false;
-
-	if (!runFieldTests (G_int,  "ModularBalanced<int32_t>",  iterations, n, false)) pass = false;
-	if (!testRandomIterator (G_int,  "ModularBalanced<int32_t>", trials, categories, hist_level)) pass = false;
-
-	if (!runFieldTests (H_int,  "ModularBalanced<int32_t>",  iterations, n, false)) pass = false;
-	if (!testRandomIterator (H_int,  "ModularBalanced<int32_t>", trials, categories, hist_level)) pass = false;
-
 
-	if (!runFieldTests (I_int,  "ModularBalanced<int32_t>",  iterations, n, false)) pass = false;
-	// if (!testRandomIterator (I_int,  "ModularBalanced<int32_t>", trials, categories, hist_level)) pass = false;
+	pass &= launchTests<int64_t>("int64_t",q,n,trials,categories,hist_level);
+	pass &= launchTests<int32_t>("int32_t",q,n,trials,categories,hist_level);
 
+/*  these are not in givaro/modular-balanced.h
+	pass &= launchTests<integer>("integer",q,n,trials,categories,hist_level);
+	pass &= launchTests<uint64_t>("uint64_t",q,n,trials,categories,hist_level);
+	pass &= launchTests<uint32_t>("uint32_t",q,n,trials,categories,hist_level);
+	pass &= launchTests<int16_t>("int16_t",q,n,trials,categories,hist_level);
+	pass &= launchTests<int8_t>("int8_t",q,n,trials,categories,hist_level);
+	pass &= launchTests<uint16_t>("uint16_t",q,n,trials,categories,hist_level);
+	pass &= launchTests<uint8_t>("uint8_t",q,n,trials,categories,hist_level);
+*/
 
-	commentator().stop("ModularBalanced<int32_t> field test suite");
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
 
diff --git a/tests/test-modular-byte.C b/tests/test-modular-byte.C
index 61ef15f..5497959 100644
--- a/tests/test-modular-byte.C
+++ b/tests/test-modular-byte.C
@@ -10,23 +10,23 @@
  * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
  *
  * Rename from test-large-modular.C to test-modular.C; made other updates in
- * accordance with changes to Modular interace.
+ * accordance with changes to Givaro::Modular interace.
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -48,10 +48,10 @@
 #include <iostream>
 #include <fstream>
 #include <sstream>
-#include <vector>
+
 #include <queue>
 
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 
 #include "test-common.h"
 #include "test-generic.h"
@@ -62,10 +62,10 @@ int main (int argc, char **argv)
 {
 	static integer q = 127;
 	static size_t n = 300;
-	static int iterations = 1;
-	static int trials = 10000;
-	static int categories = 1000;
-	static int hist_level = 10;
+	static unsigned int iterations = 1;
+	static unsigned int trials = 10000;
+	static unsigned int categories = 1000;
+	static unsigned int hist_level = 10;
 
 	static Argument args[] = {
 		{ 'p', "-p Q", "Operate over the \"field\" GF(Q) [1] for integer modulus.", TYPE_INTEGER, &q },
@@ -79,13 +79,13 @@ int main (int argc, char **argv)
 
 	parseArguments (argc, argv, args);
 
-	commentator().start("Modular<int8_t> field test suite", "Modular<int8_t>");
+	commentator().start("Givaro::Modular<int8_t> field test suite", "Givaro::Modular<int8_t>");
 	bool pass = true;
-	Modular<int8_t> F(q);
+	Givaro::Modular<int8_t> F(q);
 
-	integer k = FieldTraits<Modular<int8_t> >::maxModulus() ;
+	integer k = FieldTraits<Givaro::Modular<int8_t> >::maxModulus() ;
 	prevprime(k,k);
-	Modular<int8_t> I_int(k);
+	Givaro::Modular<int8_t> I_int(k);
 
 
 
@@ -93,14 +93,14 @@ int main (int argc, char **argv)
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
 
-	if (!runFieldTests (F,  "Modular<byte>",  iterations, n, false)) pass = false;
-	if (!testRandomIterator (F,  "Modular<byte>", trials, categories, hist_level)) pass = false;
+	if (!runFieldTests (F,  "Givaro::Modular<byte>",  iterations, n, false)) pass = false;
+	if (!testRandomIterator (F,  "Givaro::Modular<byte>", trials, categories, hist_level)) pass = false;
 
-	if (!runFieldTests (I_int,  "Modular<int8_t>",  iterations, n, false)) pass = false;
-	if (!testRandomIterator (I_int,  "Modular<int8_t>", trials, categories, hist_level)) pass = false;
+	if (!runFieldTests (I_int,  "Givaro::Modular<int8_t>",  iterations, n, false)) pass = false;
+	if (!testRandomIterator (I_int,  "Givaro::Modular<int8_t>", trials, categories, hist_level)) pass = false;
 
 
-	commentator().stop("Modular<int8_t> field test suite");
+	commentator().stop("Givaro::Modular<int8_t> field test suite");
 	return pass ? 0 : -1;
 }
 
diff --git a/tests/test-modular-double.C b/tests/test-modular-double.C
index 1a501b6..3caf888 100644
--- a/tests/test-modular-double.C
+++ b/tests/test-modular-double.C
@@ -14,23 +14,23 @@
  * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
  *
  * Rename from test-large-modular.C to test-modular.C; made other updates in
- * accordance with changes to Modular interace.
+ * accordance with changes to Givaro::Modular interace.
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -44,26 +44,16 @@
  * @test  tests only runFieldTests for modular-double.
  */
 
-
+#include "givaro/givintprime.h"
 #include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <sstream>
-#include <vector>
-#include <queue>
-
-#include "linbox/field/modular.h"
-
-#include "test-common.h"
-#include "test-generic.h"
-
+#include "linbox/ring/modular.h"
+#include "test-field.h"
 using namespace LinBox;
 
 int main (int argc, char **argv)
 {
 	static size_t n = 10000;
-	static int iterations = 1;
+	static unsigned int iterations = 1;
 
 	static Argument args[] = {
 		{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT,     &n },
@@ -73,20 +63,18 @@ int main (int argc, char **argv)
 
 	parseArguments (argc, argv, args);
 
-	commentator().start("Modular<double> field test suite", "Modular<double>");
+	commentator().start("Givaro::Modular<double> field test suite", "Givaro::Modular<double>");
 	bool pass = true;
 
-	//Modular<double> F2 (2);
-	Modular<double> F3 (3);
-	Modular<double> F5 (5);
-	Modular<double> F7 (7);
-	Modular<double> F11 (11);
-	Modular<double> F (32749);
-	Modular<double> G (65521);
-	//Modular<double> H (1099511627689);
-	integer k = FieldTraits<Modular<double> >::maxModulus() ;
-	prevprime(k,k);
-	Modular<double> I_int(k);
+	Givaro::Modular<double> F2 (2);
+	Givaro::Modular<double> F5 (5);
+	Givaro::Modular<double> F7 (7);
+	Givaro::IntPrimeDom IPD;
+	integer k = Givaro::Modular<double>::maxCardinality()+1;
+	IPD.prevprime(k, k);
+	Givaro::Modular<double> Fmax(k);
+	IPD.prevprime(k, k/2);
+	Givaro::Modular<double> Fmid(k);
 
 
 	// Make sure some more detailed messages get printed
@@ -94,23 +82,17 @@ int main (int argc, char **argv)
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
 	std::ostream& report = commentator().report();
 	report << "Field F2" << std::endl;
-	//if (!runFieldTests (F2,  "Modular<double>",  iterations, n, false)) pass = false;
-	report << "Field F3" << std::endl;
-	if (!runFieldTests (F3,  "Modular<double>",  iterations, n, false)) pass = false;
+	if (!runFieldTests (F2,  "Givaro::Modular<double>",  iterations, n, false)) pass = false;
 	report << "Field F5" << std::endl;
-	if (!runFieldTests (F5,  "Modular<double>",  iterations, n, false)) pass = false;
+	if (!runFieldTests (F5,  "Givaro::Modular<double>",  iterations, n, false)) pass = false;
 	report << "Field F7" << std::endl;
-	if (!runFieldTests (F7,  "Modular<double>",  iterations, n, false)) pass = false;
-	report << "Field F11" << std::endl;
-	if (!runFieldTests (F11,  "Modular<double>",  iterations, n, false)) pass = false;
-	report << "Field F" << std::endl;
-	if (!runFieldTests (F,  "Modular<double>",  iterations, n, false)) pass = false;
-	report << "Field G" << std::endl;
-	if (!runFieldTests (G,  "Modular<double>",  iterations, n, false)) pass = false;
-
-	if (!runFieldTests (I_int,  "Modular<double>",  iterations, n, false)) pass = false;
+	if (!runFieldTests (F7,  "Givaro::Modular<double>",  iterations, n, false)) pass = false;
+	report << "Field Fmax" << std::endl;
+	if (!runFieldTests (Fmax,  "Givaro::Modular<double>",  iterations, n, false)) pass = false;
+	report << "Field Fmid" << std::endl;
+	if (!runFieldTests (Fmid,  "Givaro::Modular<double>",  iterations, n, false)) pass = false;
 
-	commentator().stop("Modular<double> field test suite");
+	commentator().stop("Givaro::Modular<double> field test suite");
 	return pass ? 0 : -1;
 }
 
diff --git a/tests/test-modular-float.C b/tests/test-modular-float.C
index aa4a79f..ed28496 100644
--- a/tests/test-modular-float.C
+++ b/tests/test-modular-float.C
@@ -14,23 +14,23 @@
  * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
  *
  * Rename from test-large-modular.C to test-modular.C; made other updates in
- * accordance with changes to Modular interace.
+ * accordance with changes to Givaro::Modular interace.
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -40,29 +40,20 @@
 
 /*! @file  tests/test-modular-float.C
  * @ingroup tests
- * @warning F2 not tested
+ * @brief tests only runFieldTests for modular-float.
+ * @test  tests only runFieldTests for modular-float.
  */
 
-
+#include "givaro/givintprime.h"
 #include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <sstream>
-#include <vector>
-#include <queue>
-
-#include "linbox/field/modular.h"
-
-#include "test-generic.h"
-#include "test-common.h"
-
+#include "linbox/ring/modular.h"
+#include "test-field.h"
 using namespace LinBox;
 
 int main (int argc, char **argv)
 {
 	static size_t n = 10000;
-	static int iterations = 1;
+	static unsigned int iterations = 1;
 
 	static Argument args[] = {
 		{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT,     &n },
@@ -72,44 +63,36 @@ int main (int argc, char **argv)
 
 	parseArguments (argc, argv, args);
 
-	commentator().start("Modular<float> field test suite", "Modular<float>");
+	commentator().start("Givaro::Modular<float> field test suite", "Givaro::Modular<float>");
 	bool pass = true;
 
-	//Modular<float> F2 (2);
-	Modular<float> F3 (3);
-	Modular<float> F5 (5);
-	Modular<float> F7 (7);
-	Modular<float> F11 (11);
-	// Modular<float> F (2011);
-	// Modular<float> G (4093);
-	//Modular<float> H (1099511627689);
-	integer k = FieldTraits<Modular<float> >::maxModulus() ;
-	prevprime(k,k);
-	Modular<float> I_int(k);
+	Givaro::Modular<float> F2 (2);
+	Givaro::Modular<float> F5 (5);
+	Givaro::Modular<float> F7 (7);
+	Givaro::IntPrimeDom IPD;
+	integer k = Givaro::Modular<float>::maxCardinality()+1;
+	IPD.prevprime(k, k);
+	Givaro::Modular<float> Fmax(k);
+	IPD.prevprime(k, k/2);
+	Givaro::Modular<float> Fmid(k);
 
 
 	// Make sure some more detailed messages get printed
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
 	std::ostream& report = commentator().report();
-	// report << "Field F2" << std::endl;
-	//if (!runFieldTests (F2,  "Modular<float>",  iterations, n, false)) pass = false;
-	report << "Field F3" << std::endl;
-	if (!runFieldTests (F3,  "Modular<float>",  iterations, n, false)) pass = false;
+	report << "Field F2" << std::endl;
+	if (!runFieldTests (F2,  "Givaro::Modular<float>",  iterations, n, false)) pass = false;
 	report << "Field F5" << std::endl;
-	if (!runFieldTests (F5,  "Modular<float>",  iterations, n, false)) pass = false;
+	if (!runFieldTests (F5,  "Givaro::Modular<float>",  iterations, n, false)) pass = false;
 	report << "Field F7" << std::endl;
-	if (!runFieldTests (F7,  "Modular<float>",  iterations, n, false)) pass = false;
-	report << "Field F11" << std::endl;
-	if (!runFieldTests (F11, "Modular<float>",  iterations, n, false)) pass = false;
-	// report << "Field F" << std::endl;
-	// if (!runFieldTests (F,   "Modular<float>",  iterations, n, false)) pass = false;
-	// report << "Field G" << std::endl;
-	// if (!runFieldTests (G,   "Modular<float>",  iterations, n, false)) pass = false;
-
-	if (!runFieldTests (I_int,  "Modular<float>",  iterations, n, false)) pass = false;
+	if (!runFieldTests (F7,  "Givaro::Modular<float>",  iterations, n, false)) pass = false;
+	report << "Field Fmax" << std::endl;
+	if (!runFieldTests (Fmax,  "Givaro::Modular<float>",  iterations, n, false)) pass = false;
+	report << "Field Fmid" << std::endl;
+	if (!runFieldTests (Fmid,  "Givaro::Modular<float>",  iterations, n, false)) pass = false;
 
-	commentator().stop("Modular<float> field test suite");
+	commentator().stop("Givaro::Modular<float> field test suite");
 	return pass ? 0 : -1;
 }
 
diff --git a/tests/test-modular-int.C b/tests/test-modular-int.C
index 0224a98..cc0b8af 100644
--- a/tests/test-modular-int.C
+++ b/tests/test-modular-int.C
@@ -1,7 +1,6 @@
-
 /* tests/test-modular.C
  * Copyright (C) 2001, 2002 Bradford Hovinen,
- * Copyright (C) 2002 Dave Saunders
+ * Copyright (C) 2002, 2015 Dave Saunders
  *
  * Written by Bradford Hovinen <hovinen at cis.udel.edu>,
  *            Dave Saunders <saunders at cis.udel.edu>
@@ -10,23 +9,23 @@
  * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
  *
  * Rename from test-large-modular.C to test-modular.C; made other updates in
- * accordance with changes to Modular interace.
+ * accordance with changes to Givaro::Modular interace.
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -36,45 +35,65 @@
 
 /*! @file   tests/test-modular-int.C
  * @ingroup tests
- * @brief run runFieldTests testRandomIterator tests on modular-int32_t
- * @test run runFieldTests testRandomIterator tests on modular-int32_t
+ * @brief For each integer type T, Givaro::Modular<T> is tested with a small primm and with a large prime using runFieldTests and testRandomIterator.
  */
 
-
+#include "givaro/givintprime.h"
 #include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <sstream>
-#include <vector>
-#include <queue>
-
-#include "linbox/field/modular.h"
-
-#include "test-common.h"
-#include "test-generic.h"
-
+#include "linbox/ring/modular.h"
+#include "test-field.h"
 using namespace LinBox;
 
+template<class int_type>
+bool launchTests(string int_type_name, integer q, size_t n, uint32_t trials, uint32_t categories, uint32_t hist_level) 
+	{ 
+		using Field = Givaro::Modular<int_type>;
+		bool pass = true ;
+
+		string field_name = "Givaro::Modular<" + int_type_name + ">";
+		string title = field_name + " field test suite";
+
+		commentator().start(title.c_str(), field_name.c_str());
+		// Make sure some more detailed messages get printed
+		commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
+		commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
+
+		commentator().report() << field_name << " range: [" << Field::minCardinality() << "," << Field::maxCardinality() << "]" << std::endl;
+
+		Field FS(q);
+		pass &= runFieldTests (FS,  field_name.c_str(), 1, n, false);
+		pass &= testRandomIterator (FS, field_name.c_str(), trials, categories, hist_level);
+
+		Givaro::IntPrimeDom IPD;
+		integer k = Field::maxCardinality();
+		if (k > 0) {
+			IPD.prevprime(k,k);
+		} else {
+			static integer qi("18446744073709551557");
+			k = qi;
+		}
+		Field FL(k);
+		pass &= runFieldTests (FL,  field_name.c_str(), 1, n, false);
+		pass &= testRandomIterator (FL, field_name.c_str(), trials, categories, hist_level);
+
+		commentator().stop(MSG_STATUS(pass), "field test-suite");
+		return pass;
+	}
+
 int main (int argc, char **argv)
 {
-	static integer q1("18446744073709551557");
-	static integer q2 = 2147483647;
-	static integer q3 = 65521U;
-	static int q4 = 101;
+	// for field testing
+	static integer q = 5; // small prime valid for for all int types.
+
+	// for randiter testing
 	static size_t n = 10000;
-	static int iterations = 1;
-	static int trials = 10000;
-	static int categories = 1000;
-	static int hist_level = 10;
+	static unsigned int trials = 10000;
+	static unsigned int categories = 1000;
+	static unsigned int hist_level = 10;
 
 	static Argument args[] = {
-		{ 'K', "-K Q", "Operate over the \"field\" GF(Q) [1] for integer modulus.", TYPE_INTEGER, &q1 },
-		{ 'Q', "-Q Q", "Operate over the \"field\" GF(Q) [1] for uint32_t modulus.", TYPE_INTEGER, &q2 },
-		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1] for uint16_t modulus.", TYPE_INTEGER, &q3 },
-		{ 'p', "-p P", "Operate over the \"field\" GF(Q) [1] for uint8_t modulus.", TYPE_INT, &q4 },
+		{ 'K', "-K Q", "to use Modular<T> F(q). Must be valid for all int types T. (A large prime is also used.)", TYPE_INTEGER, &q },
 		{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT,     &n },
-		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
 		{ 't', "-t T", "Number of trials for the random iterator test.", TYPE_INT, &trials },
 		{ 'c', "-c C", "Number of categories for the random iterator test.", TYPE_INT, &categories },
 		{ 'H', "-H H", "History level for random iterator test.", TYPE_INT, &hist_level },
@@ -83,35 +102,28 @@ int main (int argc, char **argv)
 
 	parseArguments (argc, argv, args);
 
-	commentator().start("Modular<int32_t> field test suite", "Modular<int32_t>");
 	bool pass = true;
 
-	Modular<int32_t> F_int (1073741789);//(2147483629);//(2147483647);
-	integer k = FieldTraits<Modular<int32_t> >::maxModulus() ;
-	prevprime(k,k);
-	Modular<int32_t> I_int(k);
-
-
-	// Make sure some more detailed messages get printed
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
-
-	if (!runFieldTests (F_int,  "Modular<int32_t>",  iterations, n, false)) pass = false;
-	if (!testRandomIterator (F_int,  "Modular<int32_t>", trials, categories, hist_level)) pass = false;
+	pass &= launchTests<integer>("integer",q,n,trials,categories,hist_level);
 
-	if (!runFieldTests (I_int,  "Modular<int32_t>",  iterations, n, false)) pass = false;
-	if (!testRandomIterator (I_int,  "Modular<int32_t>", trials, categories, hist_level)) pass = false;
+	pass &= launchTests<int64_t>("int64_t",q,n,trials,categories,hist_level);
+	pass &= launchTests<int32_t>("int32_t",q,n,trials,categories,hist_level);
+	pass &= launchTests<uint64_t>("uint64_t",q,n,trials,categories,hist_level);
+	pass &= launchTests<uint32_t>("uint32_t",q,n,trials,categories,hist_level);
 
+	pass &= launchTests<int16_t>("int16_t",q,n,trials,categories,hist_level);
+	pass &= launchTests<int8_t>("int8_t",q,n,trials,categories,hist_level);
+	pass &= launchTests<uint16_t>("uint16_t",q,n,trials,categories,hist_level);
+	pass &= launchTests<uint8_t>("uint8_t",q,n,trials,categories,hist_level);
 
-	commentator().stop("Modular<int32_t> field test suite");
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
 
diff --git a/tests/test-modular-short.C b/tests/test-modular-short.C
index ef36030..41141ee 100644
--- a/tests/test-modular-short.C
+++ b/tests/test-modular-short.C
@@ -10,23 +10,23 @@
  * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
  *
  * Rename from test-large-modular.C to test-modular.C; made other updates in
- * accordance with changes to Modular interace.
+ * accordance with changes to Givaro::Modular interace.
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -47,10 +47,10 @@
 #include <iostream>
 #include <fstream>
 #include <sstream>
-#include <vector>
+
 #include <queue>
 
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 
 #include "test-common.h"
 #include "test-field.h"
@@ -60,14 +60,14 @@ using namespace LinBox;
 int main (int argc, char **argv)
 {
 	static integer q1("18446744073709551557");
-	static integer q2 = 2147483647;
+	static integer q2 = 65521;
 	static integer q3 = 65521U;
 	static int q4 = 101;
 	static size_t n = 10000;
-	static int iterations = 1;
-	static int trials = 10000;
-	static int categories = 1000;
-	static int hist_level = 10;
+	static unsigned int iterations = 1;
+	static unsigned int trials = 10000;
+	static unsigned int categories = 1000;
+	static unsigned int hist_level = 10;
 
 	static Argument args[] = {
 		{ 'K', "-K Q", "Operate over the \"field\" GF(Q) [1] for integer modulus.", TYPE_INTEGER, &q1 },
@@ -84,28 +84,28 @@ int main (int argc, char **argv)
 
 	parseArguments (argc, argv, args);
 
-	commentator().start("Modular<short> field test suite", "Modular<short>");
+	commentator().start("Givaro::Modular<short> field test suite", "Givaro::Modular<short>");
 	bool pass = true;
 
-	Modular<short> F_int (32749);
-	// Modular<short> F_int (101);
-	integer k = FieldTraits<Modular<short> >::maxModulus() ;
+	Givaro::Modular<short> F_int (32749);
+	// Givaro::Modular<short> F_int (101);
+	integer k = FieldTraits<Givaro::Modular<short> >::maxModulus() ;
 	prevprime(k,k);
-	Modular<short> G_int(k);
+	Givaro::Modular<short> G_int(k);
 
 	// Make sure some more detailed messages get printed
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
 
-	if (!runFieldTests (F_int,  "Modular<short>",  iterations, n, false)) pass = false;
-	if (!testRandomIterator (F_int,  "Modular<short>", trials, categories, hist_level)) pass = false;
+	if (!runFieldTests (F_int,  "Givaro::Modular<short>",  iterations, n, false)) pass = false;
+	if (!testRandomIterator (F_int,  "Givaro::Modular<short>", trials, categories, hist_level)) pass = false;
 
-	if (!runFieldTests (G_int,  "Modular<short>",  iterations, n, false)) pass = false;
-	if (!testRandomIterator (G_int,  "Modular<short>", trials, categories, hist_level)) pass = false;
+	if (!runFieldTests (G_int,  "Givaro::Modular<short>",  iterations, n, false)) pass = false;
+	if (!testRandomIterator (G_int,  "Givaro::Modular<short>", trials, categories, hist_level)) pass = false;
 
 
 
-	commentator().stop("Modular<short> field test suite");
+	commentator().stop("Givaro::Modular<short> field test suite");
 	return pass ? 0 : -1;
 }
 
diff --git a/tests/test-modular.C b/tests/test-modular.C
index 9b5240c..efc5fcf 100644
--- a/tests/test-modular.C
+++ b/tests/test-modular.C
@@ -9,23 +9,23 @@
  * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
  *
  * Rename from test-large-modular.C to test-modular.C; made other updates in
- * accordance with changes to Modular interace.
+ * accordance with changes to Givaro::Modular interace.
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -37,8 +37,8 @@
 /*! @file  tests/test-modular.C
  * @ingroup tests
  *
- * @brief  runFieldTests on various <code>Modular<XXX></code> fields.
- * @test   runFieldTests on various <code>Modular<XXX></code> fields.
+ * @brief  runFieldTests on various <code>Givaro::Modular<XXX></code> fields.
+ * @test   runFieldTests on various <code>Givaro::Modular<XXX></code> fields.
  */
 
 
@@ -48,13 +48,13 @@
 #include <iostream>
 #include <fstream>
 #include <sstream>
-#include <vector>
+
 #include <queue>
 
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 
 #include "test-common.h"
-#include "test-generic.h"
+#include "test-field.h"
 
 using namespace LinBox;
 using namespace std;
@@ -62,14 +62,14 @@ using namespace std;
 int main (int argc, char **argv)
 {
 	static integer q1("18446744073709551557");
-	static integer q2 = 2147483647U;
+	static integer q2 = 65521U;
 	static integer q3 = 65521U;
 	static int q4 = 101;
 	static size_t n = 500;
-	static int iterations = 1;
-	static int trials = 10000;
-	static int categories = 1000;
-	static int hist_level = 10;
+	static unsigned int iterations = 1;
+	static unsigned int trials = 10000;
+	static unsigned int categories = 1000;
+	static unsigned int hist_level = 10;
 
 	static Argument args[] = {
 		{ 'K', "-K Q", "Operate over the \"field\" GF(Q) [1] for integer modulus.", TYPE_INTEGER, &q1 },
@@ -86,40 +86,39 @@ int main (int argc, char **argv)
 
 	parseArguments (argc, argv, args);
 
-	commentator().start("Modular test suite", "Modular ");
+	commentator().start("Givaro::Modular test suite", "Givaro::Modular ");
 	bool pass = true;
 
-	Modular<integer> F_integer (q1);
-	Modular<uint32_t> F_uint32_t ((uint32_t) q2);
-	Modular<uint16_t> F_uint16_t ((uint16_t) q3);
-	Modular<uint8_t> F_uint8_t ((uint8_t) q4);
-	Modular<float> F_float ((float) q4);
+	Givaro::Modular<integer> F_integer (q1);
+	Givaro::Modular<uint32_t> F_uint32_t ((uint32_t) q2);
+	Givaro::Modular<uint16_t> F_uint16_t ((uint16_t) q3);
+	Givaro::Modular<uint8_t> F_uint8_t ((uint8_t) q4);
+	Givaro::Modular<float> F_float ((float) q4);
 
 
 	// Make sure some more detailed messages get printed
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
 
-	if (!runFieldTests (F_integer,"Modular<integer>", iterations, n, false)) pass = false;
-	if (!runFieldTests (F_uint32_t, "Modular<uint32_t>",  iterations, n, false)) pass = false;
-	if (!runFieldTests (F_uint16_t, "Modular<uint16_t>",  iterations, n, false)) pass = false;
-	if (!runFieldTests (F_uint8_t,  "Modular<uint8_t>",   iterations, n, false)) pass = false;
-	if (!runFieldTests (F_float,  "Modular<float>",   iterations, n, false)) pass = false;
+	if (!runFieldTests (F_integer,"Givaro::Modular<integer>", iterations, n, false)) pass = false;
+	if (!runFieldTests (F_uint32_t, "Givaro::Modular<uint32_t>",  iterations, n, false)) pass = false;
+	if (!runFieldTests (F_uint16_t, "Givaro::Modular<uint16_t>",  iterations, n, false)) pass = false;
+	if (!runFieldTests (F_uint8_t,  "Givaro::Modular<uint8_t>",   iterations, n, false)) pass = false;
+	if (!runFieldTests (F_float,  "Givaro::Modular<float>",   iterations, n, false)) pass = false;
 
-	if (!testRandomIterator (F_integer, "Modular<integer>", trials, categories, hist_level)) pass = false;
-	if (!testRandomIterator (F_uint32_t,  "Modular<uint32_t>",  trials, categories, hist_level)) pass = false;
-	if (!testRandomIterator (F_uint16_t,  "Modular<uint16_t>",  trials, categories, hist_level)) pass = false;
-	if (!testRandomIterator (F_uint8_t,    "Modular<uint8_t>",  trials, categories, hist_level)) pass = false;
+	if (!testRandomIterator (F_integer, "Givaro::Modular<integer>", trials, categories, hist_level)) pass = false;
+	if (!testRandomIterator (F_uint32_t,  "Givaro::Modular<uint32_t>",  trials, categories, hist_level)) pass = false;
+	if (!testRandomIterator (F_uint16_t,  "Givaro::Modular<uint16_t>",  trials, categories, hist_level)) pass = false;
+	if (!testRandomIterator (F_uint8_t,    "Givaro::Modular<uint8_t>",  trials, categories, hist_level)) pass = false;
 
-	commentator().stop(MSG_STATUS (pass), "Modular test suite");
+	commentator().stop(MSG_STATUS (pass), "Givaro::Modular test suite");
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-moore-penrose.C b/tests/test-moore-penrose.C
index 794ee80..222e405 100644
--- a/tests/test-moore-penrose.C
+++ b/tests/test-moore-penrose.C
@@ -33,14 +33,14 @@
 #include "linbox/linbox-config.h"
 
 #include <iostream>
-#include <vector>
+
 
 #include "linbox/util/commentator.h"
 #include "linbox/field/archetype.h"
-#include "linbox/field/modular.h"
-#include "linbox/randiter/nonzero.h"
+#include "linbox/ring/modular.h"
+#include <givaro/givranditer.h>
 #include "linbox/blackbox/submatrix.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/blackbox/moore-penrose.h"
 #include "linbox/solutions/rank.h"
 #include "linbox/vector/stream.h"
@@ -52,8 +52,10 @@ using namespace LinBox;
 
 /* Build a random sparse n x m matrix of rank r with a nonsingular leading principal minor */
 
+#define STOR_T typename VectorTraits<Row>::SparseFormat
+
 template <class Vector, class Field, class Row>
-static SparseMatrix<Field,  Row>
+static SparseMatrix<Field,  STOR_T>
 *buildRandomSparseMatrix (Field                           &F,
 			  size_t                           n,
 			  size_t                           m,
@@ -63,11 +65,11 @@ static SparseMatrix<Field,  Row>
 			  VectorStream<Row>               &top_right_stream,
 			  VectorStream<Row>               &bottom_left_stream)
 {
-	typedef SparseMatrix<Field, Row> Blackbox;
+	typedef SparseMatrix<Field, STOR_T> Blackbox;
 
 	Blackbox *A = new Blackbox (F, n, m);
 	typename Field::RandIter rnd_p (F);
-	NonzeroRandIter<Field> rnd (F, rnd_p);
+	Givaro::GeneralRingNonZeroRandIter<Field> rnd (rnd_p);
 	typename Field::Element factor;
 	vector<Row> bottom_left_data (n - r);
 	vector<Row> top_right_data (r);
@@ -81,13 +83,13 @@ static SparseMatrix<Field,  Row>
 	}
 
 	// Build top right part
-	for (typename vector<Row>::iterator i = top_right_data.begin (); i != top_right_data.end (); i++) {
+	for (typename vector<Row>::iterator i = top_right_data.begin (); i != top_right_data.end (); ++i) {
 		top_right_stream.next (*i);
 		VD.copy (A->getRow (top_right_stream.j () - 1), *i, r);
 	}
 
 	// Build bottom left part
-	for (typename vector<Row>::iterator i = bottom_left_data.begin (); i != bottom_left_data.end (); i++) {
+	for (typename vector<Row>::iterator i = bottom_left_data.begin (); i != bottom_left_data.end (); ++i) {
 		bottom_left_stream.next (*i);
 		VD.copy (A->getRow (r + bottom_left_stream.j () - 1), *i);
 	}
@@ -135,12 +137,11 @@ static bool testIdentityApply (Field                                           &
 {
 	typedef vector <typename Field::Element> Vector;
 	typedef vector <pair <size_t, typename Field::Element> > Row;
-	typedef SparseMatrix <Field, Row> Blackbox;
+	typedef SparseMatrix<Field, STOR_T> Blackbox;
 
 	commentator().start ("Testing identity apply", "testIdentityApply", stream.m ());
 
 	bool ret = true;
-	bool iter_passed;
 
 	Vector v, w;
 
@@ -153,7 +154,7 @@ static bool testIdentityApply (Field                                           &
 
 	typename Field::Element x;
 
-	F.init (x, 1);
+	F.assign (x, F.one);
 
 	for (i = 0; i < r; i++)
 		A.setEntry (i, i, x);
@@ -163,7 +164,7 @@ static bool testIdentityApply (Field                                           &
 	while (stream) {
 		commentator().startIteration ((unsigned)i);
 
-		iter_passed = true;
+		bool iter_passed = true;
 
 		stream.next (v);
 
@@ -226,12 +227,11 @@ static bool testRandomApply1 (Field                 &F,
 			      VectorStream<Row>    &M_stream2,
 			      VectorStream<Vector> &stream)
 {
-	typedef SparseMatrix <Field, Row> Blackbox;
+	typedef SparseMatrix<Field, STOR_T> Blackbox;
 
 	commentator().start ("Testing random apply", "testRandomApply1", iterations);
 
 	bool ret = true;
-	bool iter_passed;
 
 	unsigned long rank_A;
 
@@ -251,7 +251,7 @@ static bool testRandomApply1 (Field                 &F,
 
 	for (i = 0; i < iterations; i++) {
 		commentator().startIteration ((unsigned)i);
-		iter_passed = true;
+		bool iter_passed = true;
 
 		commentator().start ("Building requisite random sparse matrix");
 		Blackbox *A = buildRandomSparseMatrix<Vector> (F, n, m, r, K, dinv, M_stream1, M_stream2);
@@ -264,7 +264,7 @@ static bool testRandomApply1 (Field                 &F,
 		{
 			ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
 			report << "Input matrix" << endl;
-			A->write (report, FORMAT_PRETTY);
+			A->write (report, Tag::FileFormat::Pretty);
 		}
 
 		Submatrix<Blackbox> Aprime (A, 0, 0, MIN (n, m), MIN (n, m));
@@ -336,9 +336,9 @@ int main (int argc, char **argv)
 	static size_t n = 100;
 	static size_t m = 100;
 	static size_t r = 10;
-	static integer q = 2147483647U;
-	static int iterations = 100;
-	static int k = 1;
+	static integer q = 65521U;
+	static unsigned int iterations = 100;
+	static unsigned int k = 1;
 
 	static Argument args[] = {
 		{ 'n', "-n N", "Set row dimension of test matrices to N.", TYPE_INT,     &n },
@@ -350,12 +350,12 @@ int main (int argc, char **argv)
 		END_OF_ARGUMENTS
 	};
 
-	typedef Modular<uint32_t> Field;  //C.Pernet: avoids confusion with givaro::uint32_t
+	typedef Givaro::Modular<uint32_t> Field;  //C.Pernet: avoids confusion with givaro::uint32_t
 	typedef vector<Field::Element> DenseVector;
 	typedef pair<vector<size_t>, vector<Field::Element> > SparseVector;
 
 	parseArguments (argc, argv, args);
-	Field F (q);
+	Field F (q); Field::RandIter gen(F);
 
 	srand ((unsigned)time (NULL));
 
@@ -364,11 +364,11 @@ int main (int argc, char **argv)
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_IMPORTANT);
 
-	RandomDenseStream<Field, DenseVector> stream1 (F, n, iterations);
-	RandomDenseStream<Field, DenseVector> stream2 (F, n, k);
+	RandomDenseStream<Field, DenseVector> stream1 (F, gen, n, iterations);
+	RandomDenseStream<Field, DenseVector> stream2 (F, gen, n, k);
 
-	RandomSparseStream<Field, SparseVector> M_stream1 (F, 0.1, n - r, r);
-	RandomSparseStream<Field, SparseVector> M_stream2 (F, 0.1, r, m - r);
+	RandomSparseStream<Field, SparseVector> M_stream1 (F, gen, 0.1, n - r, r);
+	RandomSparseStream<Field, SparseVector> M_stream2 (F, gen, 0.1, r, m - r);
 
 	if (!testIdentityApply (F, n, m, r, stream1)) pass = false;
 	if (!testRandomApply1 (F, n, m, r, iterations, 1.0 / (double) r, M_stream1, M_stream2, stream2)) pass = false;
diff --git a/tests/test-ntl-RR.C b/tests/test-ntl-RR.C
deleted file mode 100644
index d18e455..0000000
--- a/tests/test-ntl-RR.C
+++ /dev/null
@@ -1,98 +0,0 @@
-/* tests/test-ntl-zz_p.cpp
- * Copyright (C) 2002 William J. Turner
- * Copyright (C) LinBox
- *
- * Written by William J. Turner <wjturner at math.ncsu.edu>
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *
- * Function definitions for block Lanczos iteration
- *
- */
-
-
-/*! @file  tests/test-ntl-RR.C
- * @ingroup tests
- * @brief  no doc
- * @test no doc
- */
-
-
-
-#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <vector>
-
-#include "linbox/field/ntl.h"
-
-#include "test-common.h"
-#include "test-generic.h"
-
-using namespace LinBox;
-
-int main (int argc, char **argv)
-{
-
-	static size_t n = 10000;
-	static int iterations = 1;
-
-        static Argument args[] = {
-		{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT,     &n },
-		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
-		END_OF_ARGUMENTS
-        };
-
-        parseArguments (argc, argv, args);
-
-	commentator().start("NTL_RR field test suite", "NTL_RR");
-	bool pass = true;
-
-	NTL_RR F;
-
-	// Make sure some more detailed messages get printed
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
-
-	if (!runFieldTests (F, "NTL_RR", iterations, n, false)) pass = false;
-
-#if 0
-	FieldArchetype K(new NTL_RR);
-
-	if (!testField<FieldArchetype> (K, "Testing archetype with envelope of UnField<NTL::RR> field"))
-		pass = false;
-#endif
-
-	commentator().stop("NTL_RR field test suite");
-	// We're going to allow failed tests here because the floating-point
-	// approximation tends to screw things up anyway.
-
-	// -bds:  Well, compilation is checked at least.  Work needed: A meaningful test is falsifyable.
-
-	return !pass;
-}
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/tests/test-ntl-ZZ_p.C b/tests/test-ntl-ZZ_p.C
deleted file mode 100644
index 4b64ef0..0000000
--- a/tests/test-ntl-ZZ_p.C
+++ /dev/null
@@ -1,118 +0,0 @@
-
-/* tests/test-ntl-ZZ_p.C
- * Copyright (C) 2002 William J. Turner
- *
- * Written by William J. Turner <wjturner at math.ncsu.edu>
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-
-/*! @file  tests/test-ntl-ZZ_p.C
- * @ingroup tests
- * @brief  no doc
- * @test no doc
- */
-
-
-
-#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <vector>
-
-#include "linbox/field/ntl.h"
-
-#include "test-common.h"
-#include "test-generic.h"
-
-using namespace LinBox;
-
-int main (int argc, char **argv)
-{
-        static long q = 1073741789;
-	static size_t n = 10000;
-	static int iterations = 1;
-
-        static Argument args[] = {
-                { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
-		{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT,     &n },
-		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
-		END_OF_ARGUMENTS
-        };
-
-        parseArguments (argc, argv, args);
-
-	commentator().start("NTL_ZZ_p field test suite", "NTL_ZZ_p");
-	bool pass = true;
-
-	NTL::ZZ_p::init(NTL::to_ZZ(q));
-	// UnparametricField<NTL::ZZ_p> F;
-	// NTL_ZZ_p F(q); // XXX is there a q ?
-	NTL_ZZ_p F;
-
-	if (F.characteristic() != q)
-		return false ;
-
-
-	// Make sure some more detailed messages get printed
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
-
-	if (!runFieldTests (F, "NTL_ZZ_p", iterations, n, false)) pass = false;
-
-#if 0
-	FieldArchetype K(new NTL_ZZ_p(101));
-
-	if (!testField<FieldArchetype> (K, "Testing archetype with envelope of UnField<NTL::ZZ_p> field"))
-		pass = false;
-#endif
-
-	// Testing big ints
-	//
-        commentator().start ("\t--Testing init/convert match");
-        bool part_pass = true;
-	// UnparametricField<NTL::ZZ_p> G;
-	// NTL_ZZ_p G(q);
-	NTL_ZZ_p G;
-	NTL::ZZ_p::init(NTL::to_ZZ("1234567890123456789012345678901234568123"));
-	NTL_ZZ_p::Element a;
-	LinBox::integer b, c("123456789012345678901234567890");
-	// LinBox::integer b, c("34");
-	G.init(a, c );
-	G.convert(b, a);
-	if ( c != b ) {
-		part_pass = false;
-                commentator().report (LinBox::Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION) << "Error : " << b << " != " << c << std::endl;
-	}
-        commentator().stop(MSG_STATUS (part_pass));
-        pass &= part_pass;
-
-	commentator().stop("NTL_ZZ_p field test suite");
-	return pass ? 0 : -1;
-}
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/tests/test-ntl-hankel.C b/tests/test-ntl-hankel.C
index 035e8b0..da46e78 100644
--- a/tests/test-ntl-hankel.C
+++ b/tests/test-ntl-hankel.C
@@ -34,10 +34,9 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
-#include "linbox/field/ntl.h"
 
-#include "linbox/field/ntl.h"
+#include "linbox/ring/ntl.h"
+
 #include "linbox/integer.h"
 #include "linbox/blackbox/ntl-hankel.h"
 
@@ -56,8 +55,7 @@ int main(int argc, char* argv[])
 	bool pass = true;
 
 	static size_t n = 1000;
-	static long q = 2147483647;
-
+	static int64_t q = 65521;
 
 	static int iterations = 1;
 
@@ -84,22 +82,20 @@ int main(int argc, char* argv[])
 	LinBox::commentator().start("Hankel black box test test suite", "Hankel");
 	report << "\tn= " <<  n << " \tq= " << q <<   endl ;
 
-	// typedef LinBox::UnparametricField<NTL::ZZ_p> Field;
+	// typedef Givaro::ZRing<NTL::ZZ_p> Field;
 	typedef LinBox::NTL_ZZ_p Field;
-	typedef Field::Element element;
-	typedef std::vector<element> Vector;
+	// typedef Field::Element element;
+	typedef LinBox::BlasVector<Field> Vector;
 
 	// Now we are using the NTL wrapper as the field, call the instance F
 	Field F(q); //!@bug q or not q ?
-	element zero;
-	F.init(zero, 0);
 
 	// Use the default constructor to create a matrix
-	LinBox::Hankel<Field> T;
+	// LinBox::Hankel<Field> T(F);
 
 	// Use a special constructor to construct a matrix of dim TSIZE
-	int TSIZE = 2*int(n)-1;
-	Vector tdata(TSIZE);
+	size_t TSIZE = 2*(n)-1;
+	Vector tdata(F, TSIZE);
 	report << "The random vector is:" << std::endl;
 	for (unsigned int i=0; i < tdata.size(); i++) {
 		tdata[i] = NTL::random_ZZ_p() ;
@@ -107,10 +103,12 @@ int main(int argc, char* argv[])
 	}
 	report << std::endl;
 
-	LinBox::Hankel<Field> TT(F,tdata);
+	LinBox::Hankel<Field> TT(tdata);
+	// LinBox::Hankel<Field> TT(F,tdata);
 	report << "The matrix is: " << std::endl;
 	TT.print(report);
 
+#if 0
 	// Create an interesting input vector called idata
 	Vector idata((TSIZE+2)/2), odata((TSIZE+2)/2);
 	report << "A random col vector:\t" << std::endl;
@@ -131,31 +129,34 @@ int main(int argc, char* argv[])
 
 
 	TT.apply(odata, idata);
-	report << "\n\nTesting  apply :--------------------- \nResult is[";
+	report << "\n\nTesting apply :--------------------- \nResult is[";
 	for (unsigned int i = 0; i < odata.size(); i++)
 		report << odata[i] << " ";
 	report << "]\n";
 
-	report << "Setting the matrix to UniModular Lower Triangular";
+/*
+	report << "Setting the matrix to UniGivaro::Modular Lower Triangular";
 	TT.setToUniModLT();
 	TT.print(report);
-	report << "\nSetting the matrix to UniModular Upper Triangular";
+	report << "\nSetting the matrix to UniGivaro::Modular Upper Triangular";
 	TT.setToUniModUT();
 	TT.print(report);
+*/
 
-	pass = testBlackbox(TT);
+	report << "\n\nCalling testBlackbox:--------------------- \n";
+#endif
+	pass = testBlackboxNoRW(TT);
 
-	LinBox::commentator().stop("Hankel black box test test suite");
+	LinBox::commentator().stop(MSG_STATUS (pass),"Hankel black box test test suite");
 	return pass ? 0 : -1;
 
 }
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-ntl-lzz_p.C b/tests/test-ntl-lzz_p.C
index b1a6c2d..75475cd 100644
--- a/tests/test-ntl-lzz_p.C
+++ b/tests/test-ntl-lzz_p.C
@@ -34,12 +34,10 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
 
-#include "linbox/field/ntl.h"
+#include "linbox/ring/ntl.h"
 
-#include "test-common.h"
-#include "test-generic.h"
+#include "test-field.h"
 
 using namespace LinBox;
 
@@ -62,17 +60,17 @@ int main (int argc, char **argv)
 	bool pass = true;
 
 	//NTL::zz_p::init(q);
-	//UnparametricField<NTL::zz_p> F(q);
+	//Givaro::ZRing<NTL::zz_p> F(q);
 	// NTL_zz_p F(q);
-	NTL_zz_p F;
+	NTL_zz_p F(q);
 
 	if (F.characteristic() != q)
-		return false ;
+		exit(-1);
 
 	// Make sure some more detailed messages get printed
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
 
-	if (!runFieldTests (F, "NTL_zz_p", iterations, n, false)) pass = false;
+	if (!runFieldTests (F, "NTL_zz_p", (unsigned int)iterations, n, false)) pass = false;
 
 #if 0
 	FieldArchetype K(new NTL_zz_p(101));
diff --git a/tests/test-ntl-lzz_pe.C b/tests/test-ntl-lzz_pe.C
new file mode 100644
index 0000000..b0b007b
--- /dev/null
+++ b/tests/test-ntl-lzz_pe.C
@@ -0,0 +1,94 @@
+/* tests/test-ntl-lzz_pE.C
+ * evolved by bds from tests/test-ntl-lzz_p.C
+ * Copyright (C) 2002 William J. Turner
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file  tests/test-ntl-lzz_pE.C
+ * @ingroup tests
+ * @brief no doc.
+ * @test no doc.
+ */
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+
+#include "linbox/ring/ntl.h"
+
+#include "test-field.h"
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+        static integer q = 3;
+		int exponent = 3; 
+	static size_t n = 10000;
+	static int iterations = 1;
+
+        static Argument args[] = {
+                { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+		{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT,     &n },
+		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
+		END_OF_ARGUMENTS
+        };
+
+        parseArguments (argc, argv, args);
+
+	commentator().start("NTL_zz_pE field test suite", "NTL_zz_p");
+	bool pass = true;
+
+	//NTL::zz_p::init(q);
+	//Givaro::ZRing<NTL::zz_pE> F(q);
+	// NTL_zz_p F(q);
+	NTL_zz_pE F(q, exponent);
+
+    integer ch;
+	if (F.characteristic(ch) != q)
+		exit(-1);
+
+	// Make sure some more detailed messages get printed
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
+
+	if (!runFieldTests (F, "NTL_zz_pE", (unsigned int)iterations, n, false)) pass = false;
+
+#if 0
+	FieldArchetype K(new NTL_zz_pE(101));
+
+	if (!testField<FieldArchetype> (K, "Testing archetype with envelope of UnField<NTL::zz_pE> field"))
+		pass = false;
+#endif
+
+	commentator().stop("NTL_zz_pE field test suite");
+	return pass ? 0 : -1;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/tests/test-ntl-lzz_pex.C b/tests/test-ntl-lzz_pex.C
new file mode 100644
index 0000000..12b190c
--- /dev/null
+++ b/tests/test-ntl-lzz_pex.C
@@ -0,0 +1,90 @@
+/* tests/test-ntl-lzz_pEX.C
+ * evolved by bds from tests/test-ntl-lzz_pX.C
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file  tests/test-ntl-lzz_pEX.C
+ * @ingroup tests
+ * @brief no doc.
+ * @test no doc.
+ */
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+
+#include "linbox/ring/ntl.h"
+
+#include "test-field.h"
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+	static integer q = 3;
+	static size_t n = 10000;
+	static int iterations = 1;
+
+	static Argument args[] = {
+   		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+		{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT,     &n },
+		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
+		END_OF_ARGUMENTS
+   	};
+
+   	parseArguments (argc, argv, args);
+
+	commentator().start("NTL_zz_pEX field test suite", "NTL_zz_pEX");
+	bool pass = true;
+
+	NTL_zz_pEX R(q,3);
+
+    integer ch;
+	if (R.characteristic(ch) != q)
+		exit(-1);
+
+	// Make sure some more detailed messages get printed
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
+
+	if (!runBasicRingTests (R, "NTL_zz_pEX", (unsigned int)iterations, false)) pass = false;
+	// needs PID tests as well...
+
+#if 0
+	FieldArchetype K(new NTL_zz_pEX(101));
+
+	if (!testField<FieldArchetype> (K, "Testing archetype with envelope of UnField<NTL::zz_pEX> field"))
+		pass = false;
+#endif
+
+	commentator().stop("NTL_zz_pEX field test suite");
+	return pass ? 0 : -1;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/tests/test-ntl-lzz_px.C b/tests/test-ntl-lzz_px.C
new file mode 100644
index 0000000..f02cb3f
--- /dev/null
+++ b/tests/test-ntl-lzz_px.C
@@ -0,0 +1,90 @@
+/* tests/test-ntl-lzz_pX.C
+ * evolved by bds from tests/test-ntl-lzz_pE.C
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file  tests/test-ntl-lzz_pX.C
+ * @ingroup tests
+ * @brief no doc.
+ * @test no doc.
+ */
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+
+#include "linbox/ring/ntl.h"
+
+#include "test-field.h"
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+	static integer q = 3;
+	static size_t n = 10000;
+	static int iterations = 1;
+
+	static Argument args[] = {
+   		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+		{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT,     &n },
+		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
+		END_OF_ARGUMENTS
+   	};
+
+   	parseArguments (argc, argv, args);
+
+	commentator().start("NTL_zz_pX field test suite", "NTL_zz_p");
+	bool pass = true;
+
+	NTL_zz_pX R(q);
+
+    integer ch;
+	if (R.characteristic(ch) != q)
+		exit(-1);
+
+	// Make sure some more detailed messages get printed
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
+
+	if (!runBasicRingTests (R, "NTL_zz_pX", (unsigned int)iterations, false)) pass = false;
+	// needs PID tests as well...
+
+#if 0
+	FieldArchetype K(new NTL_zz_pX(101));
+
+	if (!testField<FieldArchetype> (K, "Testing archetype with envelope of UnField<NTL::zz_pX> field"))
+		pass = false;
+#endif
+
+	commentator().stop("NTL_zz_pX field test suite");
+	return pass ? 0 : -1;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/tests/test-ntl-rr.C b/tests/test-ntl-rr.C
new file mode 100644
index 0000000..6d4ab52
--- /dev/null
+++ b/tests/test-ntl-rr.C
@@ -0,0 +1,96 @@
+/* tests/test-ntl-zz_p.cpp
+ * Copyright (C) 2002 William J. Turner
+ * Copyright (C) LinBox
+ *
+ * Written by William J. Turner <wjturner at math.ncsu.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *
+ * Function definitions for block Lanczos iteration
+ *
+ */
+
+
+/*! @file  tests/test-ntl-RR.C
+ * @ingroup tests
+ * @brief  no doc
+ * @test no doc
+ */
+
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+
+#include "linbox/ring/ntl.h"
+
+#include "test-common.h"
+#include "test-generic.h"
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+
+	static size_t n = 10000;
+	static unsigned int iterations = 1;
+
+        static Argument args[] = {
+		{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT,     &n },
+		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
+		END_OF_ARGUMENTS
+        };
+
+        parseArguments (argc, argv, args);
+
+	commentator().start("NTL_RR field test suite", "NTL_RR");
+	bool pass = true;
+
+	NTL_RR F;
+
+	// Make sure some more detailed messages get printed
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
+
+	if (!runFieldTests (F, "NTL_RR", iterations, n, false)) pass = false;
+
+	if (pass) 
+		commentator().report() << "Compilation of interface pass, lucky exactness pass" << std::endl;
+    else 
+		commentator().report() << "Compilation of interface pass, exactness failure" << std::endl;
+
+	commentator().stop("NTL_RR field test suite");
+	// We're going to allow failed tests here because the floating-point
+	// approximation tends to screw things up anyway.
+
+	// -bds:  Well, compilation is checked at least.  Work needed: A meaningful test is falsifyable.
+
+	return 0;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/tests/test-ntl-sylvester.C b/tests/test-ntl-sylvester.C
index 06b7594..868ef63 100644
--- a/tests/test-ntl-sylvester.C
+++ b/tests/test-ntl-sylvester.C
@@ -35,12 +35,12 @@
  */
 
 
+#include <linbox/linbox-config.h>
 #include <iostream>
 #include <fstream>
-#include <vector>
-#include "linbox/field/ntl.h"
 
-#include "linbox/field/ntl.h"
+#include "linbox/ring/ntl.h"
+
 #include "linbox/integer.h"
 #include "linbox/blackbox/ntl-sylvester.h"
 #include "test-generic.h"
@@ -48,6 +48,7 @@
 
 
 using namespace std;
+using namespace LinBox;
 
 int main(int argc, char* argv[])
 {
@@ -58,14 +59,14 @@ int main(int argc, char* argv[])
 	bool pass = true;
 
 	static size_t n = 1000;
-	static long q = 134217689;
+	static int64_t q = 134217689;
 	//   q = 101;
 	static int iterations = 1;
 
 	static Argument args[] = {
 		{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT, &n },
-		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].",
-			TYPE_INT, &q },
+//		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].",
+//			TYPE_INT, &q },
 		{ 'i', "-i I", "Perform each test for I iterations.",
 			TYPE_INT, &iterations },
 		END_OF_ARGUMENTS
@@ -89,22 +90,20 @@ int main(int argc, char* argv[])
 	LinBox::commentator().start("Sylvester black box test suite", "Sylvester");
 	report <<"Dimension(m+n)= " << m+n << "\t modulus= " << q << endl;
 
-	// typedef LinBox::UnparametricField<NTL::ZZ_p> Field;
+	// typedef Givaro::ZRing<NTL::ZZ_p> Field;
 	typedef LinBox::NTL_ZZ_p Field;
-	typedef Field::Element element;
-	typedef std::vector<element> Vector;
+	// typedef Field::Element element;
+	typedef LinBox::BlasVector<Field> Vector;
 
 	// Now we are using the NTL wrapper as the field, call the instance F
 	Field F(q); // XXX same bug ?
-	element zero;
-	F.init(zero, 0);
 
 	// Use the default constructor to create a matrix
-	LinBox::Sylvester<Field> T;
+	// LinBox::Sylvester<Field> T(F);
 
 	// Use a special constructor to construct a matrix of dim TSIZE
 
-	Vector pdata(n), qdata(m);
+	Vector pdata(F,n), qdata(F,m);
 
 	report << "\n\tpx:=";
 
@@ -128,8 +127,12 @@ int main(int argc, char* argv[])
 	report << std::endl;
 
 
-	LinBox::Sylvester<Field> TT(F,pdata,qdata);
+	// LinBox::Sylvester<Field> TT(F,pdata,qdata);
+	LinBox::Sylvester<Field> TT(pdata,qdata);
 	report << "The matrix is: " << std::endl;
+	TT.print(report);
+
+#if 0 /* this is not a test */
 	//  TT.printcp( "cpout.txt");
 	//  TT.print(report);
 
@@ -137,7 +140,7 @@ int main(int argc, char* argv[])
 
 
 	// Create an interesting input vector called idata
-	Vector idata( TT.sysdim() ), odata( TT.sysdim() );
+	Vector idata(F, TT.sysdim() ), odata( F, TT.sysdim() );
 	report << "A random col vector:\npx:=[" << std::endl;
 
 	for (unsigned int i=0; i < idata.size(); i++) {
@@ -164,12 +167,13 @@ int main(int argc, char* argv[])
 
 	for (unsigned int i = 0; i < odata.size(); i++)
 		report << odata[i] << " ";
+#endif
 
-	pass = testBlackbox(TT);
+	pass = testBlackboxNoRW(TT);
 	report <<"<====\tDone Sylvester matrix black box test suite" << endl;
 
 
-	LinBox::commentator().stop("Sylvester black box test suite");
+	LinBox::commentator().stop(MSG_STATUS (pass),"Sylvester black box test suite");
 	return pass ? 0 : -1;
 
 }
diff --git a/tests/test-ntl-toeplitz.C b/tests/test-ntl-toeplitz.C
index b4ba98c..94aea69 100644
--- a/tests/test-ntl-toeplitz.C
+++ b/tests/test-ntl-toeplitz.C
@@ -31,13 +31,14 @@
 
 
 
+#include <linbox/linbox-config.h>
 #include <iostream>
 #include <fstream>
-#include <vector>
-#include "linbox/field/ntl.h"
 
-#include "linbox/field/ntl.h"
+#include "linbox/ring/ntl.h"
+
 #include "linbox/integer.h"
+#include "linbox/vector/blas-vector.h"
 //#include "linbox/blackbox/ntl-toeplitz.h"
 #include "linbox/blackbox/toeplitz.h"
 
@@ -56,7 +57,7 @@ int main(int argc, char* argv[])
 	bool pass = true;
 
 	static size_t n = 1000;
-	static long q = 2147483647;
+	static int64_t q = 65521;
 	static int iterations = 1;
 
 	static Argument args[] = {
@@ -84,20 +85,18 @@ int main(int argc, char* argv[])
 	report  <<"     \tDimension= " << n << "\t modulus= " << q << endl;
 
 	typedef LinBox::NTL_ZZ_p Field;
-	typedef Field::Element element;
-	typedef std::vector<element> Vector;
+	// typedef Field::Element element;
+	typedef LinBox::BlasVector<Field> Vector;
 
 	// Now we are using the NTL wrapper as the field, call the instance F
 	Field F(q);
-	element zero;
-	F.init(zero, 0);
 
 	// Use the default constructor to create a matrix
 	LinBox::Toeplitz<Field> T(F);
 
 	// Use a special constructor to construct a matrix of dim TSIZE
-	int TSIZE = 2*int(n)-1;
-	Vector tdata(TSIZE);
+	size_t TSIZE = 2*(n)-1;
+	Vector tdata(F,TSIZE);
 	report << "The random vector is:" << std::endl;
 	for (unsigned int i=0; i < tdata.size(); i++) {
 		tdata[i] = NTL::random_ZZ_p() ;
@@ -107,10 +106,10 @@ int main(int argc, char* argv[])
 
 	LinBox::Toeplitz<Field> TT(F,tdata);
 	report << "The matrix is: " << std::endl;
-	TT.print(report);
+	TT.write(report);
 
 	// Create an interesting input vector called idata
-	Vector idata((TSIZE+2)/2), odata((TSIZE+2)/2);
+	Vector idata(F,(TSIZE+2)/2), odata(F,(TSIZE+2)/2);
 	report << "A random col vector:\t" << std::endl;
 	for (unsigned int i=0; i < idata.size(); i++) {
 		idata[i] = NTL::random_ZZ_p() ;
@@ -135,22 +134,21 @@ int main(int argc, char* argv[])
 	report << "]\n";
 
 	// TT.setToUniModLT();
-	//  report << "Setting the matrix to UniModular Upper Triangular";
+	//  report << "Setting the matrix to UniGivaro::Modular Upper Triangular";
 	//  TT.setToUniModUT();
 	//  report << "The Upper Triangular matrix is: " << std::endl;
-	//TT.print();
+	//TT.write();
 
-	pass = testBlackbox(TT);
+	pass = testBlackboxNoRW(TT);
 	LinBox::commentator().stop("Toeplitz black box test suite");
 	return pass ? 0 : -1;
 }
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-ntl-zz_p.C b/tests/test-ntl-zz_p.C
new file mode 100644
index 0000000..de4f1a1
--- /dev/null
+++ b/tests/test-ntl-zz_p.C
@@ -0,0 +1,118 @@
+
+/* tests/test-ntl-ZZ_p.C
+ * Copyright (C) 2002 William J. Turner
+ *
+ * Written by William J. Turner <wjturner at math.ncsu.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+/*! @file  tests/test-ntl-ZZ_p.C
+ * @ingroup tests
+ * @brief  no doc
+ * @test no doc
+ */
+
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+
+#include "linbox/ring/ntl.h"
+
+#include "test-common.h"
+#include "test-generic.h"
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+        static integer q = 1073741789;
+	static size_t n = 10000;
+	static int iterations = 1;
+
+        static Argument args[] = {
+                { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+		{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT,     &n },
+		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
+		END_OF_ARGUMENTS
+        };
+
+        parseArguments (argc, argv, args);
+
+	commentator().start("NTL_ZZ_p field test suite", "NTL_ZZ_p");
+	bool pass = true;
+
+	NTL::ZZ_p::init(NTL::to_ZZ(long(int64_t(q))));
+	// Givaro::ZRing<NTL::ZZ_p> F;
+	// NTL_ZZ_p F(q); // XXX is there a q ?
+	NTL_ZZ_p F;
+
+	if (F.characteristic() != q)
+		return false ;
+
+
+	// Make sure some more detailed messages get printed
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
+
+	if (!runFieldTests (F, "NTL_ZZ_p", (unsigned int)iterations, n, false)) pass = false;
+
+#if 0
+	FieldArchetype K(new NTL_ZZ_p(101));
+
+	if (!testField<FieldArchetype> (K, "Testing archetype with envelope of UnField<NTL::ZZ_p> field"))
+		pass = false;
+#endif
+
+	// Testing big ints
+	//
+        commentator().start ("\t--Testing init/convert match");
+        bool part_pass = true;
+	// Givaro::ZRing<NTL::ZZ_p> G;
+	// NTL_ZZ_p G(q);
+	NTL_ZZ_p G;
+	NTL::ZZ_p::init(NTL::to_ZZ("1234567890123456789012345678901234568123"));
+	NTL_ZZ_p::Element a;
+	LinBox::integer b, c("123456789012345678901234567890");
+	// LinBox::integer b, c("34");
+	G.init(a, c );
+	G.convert(b, a);
+	if ( c != b ) {
+		part_pass = false;
+                commentator().report (LinBox::Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION) << "Error : " << b << " != " << c << std::endl;
+	}
+        commentator().stop(MSG_STATUS (part_pass));
+        pass &= part_pass;
+
+	commentator().stop("NTL_ZZ_p field test suite");
+	return pass ? 0 : -1;
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+
diff --git a/tests/test-nullspace.C b/tests/test-nullspace.C
index 6e1f445..eaeea11 100644
--- a/tests/test-nullspace.C
+++ b/tests/test-nullspace.C
@@ -1,5 +1,5 @@
 /* Copyright (C) 2009 LinBox
- * Written by <boyer.brice at gmail.com>
+ * Written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  * Inspired and adapted from test-ffpack.C
  *
  * ========LICENCE========
@@ -27,6 +27,9 @@
  * \brief Tests the dense nullspace functions for Zp
  * @ingroup tests
  * @test dense nullspace
+ *  @todo test non dense nullspace
+ *  @todo test for submatrices
+ *  @todo make sure this is faster than FFPACK ?
  */
 
 #include "linbox/linbox-config.h"
@@ -34,150 +37,18 @@
 #include "linbox/integer.h"
 #include "linbox/matrix/matrix-domain.h"
 //#include "linbox/field/givaro-zpz.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 //#include "fflas-ffpack/ffpack/ffpack.h"
 #include "linbox/algorithms/dense-nullspace.h"
-#include <vector>
-#include "./test-common.h"
-// #include "fflas-ffpack/utils/Matio.h"
-#include "linbox/algorithms/linbox-tags.h"
-
-using namespace LinBox;
 
+#include "./test-common.h"
+#include "fflas-ffpack/utils/Matio.h"
+#include "linbox/linbox-tags.h"
 
-/** @brief gives a random number such that \f$0 \leq RIII < s\f$.
- * @details basic..
- * @param [in]  s sup
- * \param [in]  seed seed. If \p 0 (default) we create a new one.
- * @param [out] RIII random integer in the interval  \f$[[0, s-1]]\f$.
- * @return a reference to \p RIII
- */
-size_t & RandIntInInt ( const size_t & s, size_t & RIII, const int & seed = 0 )
-{
-	/*
-	 * if (seed == 0)
-	 *	srandom( (unsigned) time(NULL) );
-	 *else
-	 *	srandom ( seed );
-	 */
-	double alea = rand();
-	RIII          = (size_t) ((double)s * (alea/(RAND_MAX+1.0)));
-	assert(RIII<s);
-	return RIII ;
-}
-
-/*!
- * Creates a random Lapack style Permutation \p P of size \p len.
- */
-void RandomPermutation ( size_t * P, const size_t & len)
-{
-	size_t alea = 0 ;
-	for (size_t i = 0 ; i < len ; ++i) {
-		RandIntInInt(len-i, alea);
-		*(P+i) = i + alea ;
-	}
-	return;
-}
-
-/**
- * @brief Checks we got the right rank.
- *
- * @param F field
- * @param A matrix
- * @param m rows
- * @param n cols
- * @param lda leadin dimmension
- * @param alledged_rank supposedly correct rank.
- *
- * @return \c alledged_rank==rank(A)
- */
-template <class Field>
-bool CheckRank( const Field & F,
-		const typename Field::Element * A,
-		const size_t & m,
-		const size_t & n,
-		const size_t & lda,
-		const size_t & alledged_rank)
-{
-	//                std::cout << " is rank truely " << alledged_rank << " ?" << std::endl;
-	typename Field::Element * Acopy = new typename Field::Element[m*n] ;
-	FFLAS::fcopy(F,m*n,Acopy,1,A,1);
-	size_t true_rank = FFPACK::Rank(F,m,n,Acopy,lda);
-	delete[] Acopy ;
-	//                std::cout << "It is " << true_rank << "." << std::endl;
-	return (alledged_rank == true_rank);
-}
-
+#include "test-matrix-utils.h"
 
-/*!
- * Builds a \p m x \p n random matrix of rank \p rank over field \p F.
- */
-template <class Field >
-void RandomMatrixWithRank(const Field & F,
-			  typename Field::Element * A,
-			  const size_t & m,
-			  const size_t & n,
-			  const size_t & rank)
-{
-	assert(rank <= m);
-	assert(rank <= n);
-
-	//                srandom( (unsigned) time(NULL)  ) ; // on met une nouvelle graine.
-	typename Field::RandIter G(F);
-	NonzeroRandIter<Field> Gn(F,G);
-	typename Field::Element one,zero;
-	F.init(one,1UL);
-	F.init(zero,0UL);
-
-	typename Field::Element * B = new typename Field::Element[m*m];
-	typename Field::Element * C = new typename Field::Element[m*n];
-	// Create B a random invertible matrix (m x m format)
-	for (size_t j=0 ; j<m ; ++j){
-		for (size_t i = 0 ; i<j ; ++i)
-			F.assign (*(B+i*m+j),zero); // triangulaire
-		F.assign(*(B+j*m+j),one  );
-		for (size_t i=j+1; i<m;++i)
-			Gn.random (*(B+i*m+j)); // random mais pas nul.. euh... et sur Z/2 ?? :/
-	}
-	// Create C a random matrix of rank \p ( m x n format)
-	// for (size_t i = 0; i < std::min(rank,m); ++i)
-	for (size_t i = 0; i < rank; ++i){
-		size_t j = 0;
-		for ( ; j < std::min(i,n) ; ++j)
-			F.assign (*(C+i*n+j),zero);
-		for ( ; j < n ; ++j)
-			Gn.random (*(C+i*n+j));
-	}
-	for (size_t i = n*rank; i < n*m; ++i){
-		F.assign (*(C+i),zero);
-	}
-	assert(CheckRank(F,C,m,n,n,rank));
-	// create P a random permutation of size \p n
-	size_t *P = new size_t[n];
-	//srandom( (unsigned) time(NULL) ) ; // on met une nouvelle graine.
-	RandomPermutation(P,n);
-	// create Q a random permutation of size \p m
-	size_t *Q = new size_t[m];
-	RandomPermutation(Q,m);
-	FFPACK::applyP(F, FFLAS::FflasLeft, FFLAS::FflasNoTrans,
-		       n, 0, (int)m, C, n, Q );
-	//PrintLapackPermutation(P,n,std::cout << "P == ");
-	//write_field (F, std::cout<<"C_perm1="<<std::endl, C, m, n, n);
-	FFPACK::applyP(F, FFLAS::FflasRight, FFLAS::FflasNoTrans,
-		       m, 0, (int)n, C, n, P );
-	//PrintLapackPermutation(Q,m,std::cout << "Q == ");
-	//write_field (F, std::cout<<"C_perm2="<<std::endl, C, m, n, n);
-	// A = B*C (m x n format), of rank \p rank
-	FFLAS::fgemm( F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, m, n, m,
-		      one, B, m, C, n, zero, A, n );
-	delete[] B;
-	delete[] C;
-	delete[] P;
-	delete[] Q;
-	assert(CheckRank(F,A,m,n,n,rank));
-	return;
+using namespace LinBox;
 
-}
 
 
 
@@ -194,15 +65,11 @@ void RandomMatrixWithRank(const Field & F,
 template <class Field >
 static bool testNullSpaceBasis (const Field& F, size_t m, size_t n, size_t rank, int iterations, bool a_droite)
 {
-	typedef typename Field::Element			Element;
 
 	//Commentator commentator;
 	//commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
 	//commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-	//commentator().start (pretty("Testing NullSpace Decomposition"),"testNullSpace",iterations);
-	typename Field::Element one,zero;
-	F.init(one,1UL);
-	F.init(zero,0UL);
+	commentator().start ("Testing NullSpace Decomposition","testNullSpace",(unsigned int)iterations);
 
 	bool ret = true;
 	{
@@ -213,102 +80,72 @@ static bool testNullSpaceBasis (const Field& F, size_t m, size_t n, size_t rank,
 	}
 	for (int k=0; k<iterations; ++k) {
 
-		//commentator().progress(k);
-		Element * A = new Element[m*n];
-		size_t ld_a =  n ;
-		size_t wd_a =  m ;
-		RandomMatrixWithRank(F,A,m,n,rank);
-
-		Element * Abis = new Element[m*n]; // copie de A
-		for (size_t i=0; i<m*n; ++i)
-			*(Abis+i) = *(A+i);
-		size_t ker_dim = 0 ; // or coker_dim
-		Element * Kern  = NULL;
-		size_t ld_k = 0 ;
+		commentator().progress(k);
+		BlasMatrix<Field> A(F,m,n+5);
+		BlasMatrix<Field> Aref(A,0,0,m,n);
+		RandomMatrixWithRank(F,A.getWritePointer(),m,n,n+5,rank);
+
+		//tests on a submatrix (more general/prone to errors)
+		BlasSubmatrix<BlasMatrix<Field> > Abis(A,0,0,m,n);
+		BlasMatrix<Field> Kern(F);
+		size_t ker_dim;
 		if (a_droite) {
-			NullSpaceBasis (F, LinBoxTag::Right,m,n,A,ld_a,Kern,ld_k,ker_dim);
-			if (ker_dim != (ld_a - rank)) {
+			NullSpaceBasis (Tag::Side::Right,Abis,Kern,ker_dim);
+			if (ker_dim != (Abis.coldim() - rank)) {
 				ret = false;
-				cout << "faux : (1) mauvaises dim : " << ker_dim << " != " << (ld_a - rank) << endl;
-				delete[] Kern;
-				delete[] A;
-				delete[] Abis;
+				cout << "wrong: (1) bad dim : " << ker_dim << " != " << (Abis.coldim() - rank) << endl;
 				break ;
 			}
 		}
 		else {
-			NullSpaceBasis (F, LinBoxTag::Left,m,n,A,ld_a,Kern,ld_k,ker_dim);
-			if (ker_dim != (wd_a - rank) ) {
+			NullSpaceBasis ( Tag::Side::Left,Abis,Kern,ker_dim);
+			if (ker_dim != (Abis.rowdim() - rank) ) {
 				ret = false;
-				cout << "faux : (1) mauvaises dim " << ker_dim << " != " << (wd_a - rank)  << endl;
-				delete[] Kern;
-				delete[] A;
-				delete[] Abis;
+				cout << "wrong : (1) bad dim " << ker_dim << " != " << (Abis.rowdim() - rank)  << endl;
 				break ;
 			}
 		}
-		size_t ld_ker = (a_droite)?ker_dim:m ;
-		size_t wd_ker = (a_droite)?n:ker_dim ;
-		assert(ld_ker == ld_k) ;
-		size_t ld_n = (a_droite)?ker_dim:ld_a;
-		size_t wd_n = (a_droite)?wd_a:ker_dim;
-		assert(CheckRank(F,Kern,wd_ker,ld_ker,ld_ker,ker_dim)); // ...il est bien de rang plein...
-		Element * NullMat = new Element[ld_n*wd_n] ;// ...et on s'attend à ce que ça soit nul !
+
+		assert(CheckRank(F,Kern,ker_dim));
+		BlasMatrix<Field> NullMat(F,(a_droite)?m:ker_dim,(a_droite)?ker_dim:n);
+		BlasMatrixDomain<Field> BMD(F);
+
 		if ( a_droite){
-			FFLAS::fgemm(F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, wd_a, ld_ker, ld_a,
-				     one, Abis, ld_a, Kern, ld_ker , zero, NullMat, ld_n);
+			BMD.mul(NullMat,Aref,Kern);
 		}
 		else{
-			FFLAS::fgemm(F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, wd_ker,ld_a, ld_ker,
-				     one,  Kern, ld_ker , Abis, ld_a, zero, NullMat, ld_n);
+			BMD.mul(NullMat,Kern,Aref);
 		}
 
-		//write_field (F, std::cout<<"A="<<endl, A, m, n, n,true);
-		//write_field (F, std::cout<<"Abis="<<endl, Abis, m, n, n, true);
-		delete[] Abis ;
-		delete[] A ;
-		delete[] Kern ;
-		for (size_t i = 0 ; i < wd_n ; ++i ){
-			for (size_t j = 0 ; j < ld_n ; ++j ) {
-				if (!F.isZero(*(NullMat + j+i*ld_n)) ){
-					    //	write_field (F, std::cout<<"faux : (3) NullMat pas nulle. "<<std::endl, NullMat, wd_n, ld_n, ld_n, true);
-					delete[] NullMat ;
-					ret = false;
-					break;
-				}
-			}
-			if (!ret)
-				break;
+		if (!BMD.isZero(NullMat)) {
+			std::cout << "wrong (3) NullMat non zero :" << NullMat << std::endl;
+			ret = false;
+			break;
 		}
-		if (ret) delete[] NullMat ;
-		else break;
 
-		//delete[] Kern ;
 	}
 
-	//commentator().stop(MSG_STATUS (ret), (const char *) 0, "testNullSpace");
-
+	commentator().stop(MSG_STATUS (ret), (const char *) 0, "testNullSpace");
 	return ret;
 }
 
-
 int main(int argc, char** argv)
 {
 	//-----------------------------------------------------------------------
 	// Choice of the finite field representation
-	//typedef GivaroZpz<Std32> Field;
-	typedef Modular<double> Field;
-	//typedef Modular<float> Field;
-	//typedef Modular<uint32_t> Field;
+	//typedef Givaro::Modular<int32_t> Field;
+	typedef Givaro::Modular<double> Field;
+	//typedef Givaro::Modular<float> Field;
+	//typedef Givaro::Modular<uint32_t> Field;
 	//------------------------------------------------------------------------
 
 	bool pass = true;
 
-	static size_t n = 5;
-	static size_t m = 4;
-	static size_t r = 2;
-	static integer q = 11;
-	static int iterations =2;
+	static size_t n = 15;
+	static size_t m = 8;
+	static size_t r = 3;
+	static integer q = 101;
+	static int iterations =4;
 
 	static Argument args[] = {
 		{ 'n', "-n N", "Set width of test matrices.",			TYPE_INT,     &n },
@@ -331,30 +168,76 @@ int main(int argc, char** argv)
 
 	std::ostream& report = commentator().report();
 
-	report << "\t \033[1;35m>>>\033[0;m \t testing left kernel" << endl ;
+
+	TESTE("left kernel");
 	if (!testNullSpaceBasis (F, m,n,r, iterations, false))
 		pass=false;
-	if (pass) report << "\t \033[1;36m<<<\033[0;m \t left kernel passed :)" << endl; else {report << "\t \033[1;31m!!!\033[0;m \t left kernel failed :(" << endl ; exit(-1);}
-	report << "\t \033[1;35m>>>\033[0;m \t testing right kernel" << endl ;
+	RAPPORT("left kernel");
+
+	TESTE("left kernel");
+	if (!testNullSpaceBasis (F, n,m,r, iterations, false))
+		pass=false;
+	RAPPORT("left kernel");
+
+	TESTE("left kernel");
+	if (!testNullSpaceBasis (F, m,n,0, iterations, false))
+		pass=false;
+	RAPPORT("left kernel");
+
+
+	TESTE("left kernel");
+	if (!testNullSpaceBasis (F, n,m,0, iterations, false))
+		pass=false;
+	RAPPORT("left kernel");
+
+	TESTE("left kernel");
+	if (!testNullSpaceBasis (F, m,n,std::min(m,n), iterations, false))
+		pass=false;
+	RAPPORT("left kernel");
+
+
+
+
+
+	TESTE("right kernel");
 	if (!testNullSpaceBasis (F, m,n,r, iterations, true))
 		pass=false;
-	if (pass) report << "\t \033[1;36m<<<\033[0;m \t right kernel passed :)" << endl; else {report << "\t \033[1;31m!!!\033[0;m \t right kernel failed :(" << endl ; exit(-1);}
+	RAPPORT("right kernel");
 
-	report << "\033[1;32m +++ ALL MY TESTS PASSED +++\033[0;m" << endl;
+	TESTE("right kernel");
+	if (!testNullSpaceBasis (F, n,m,r, iterations, true))
+		pass=false;
+	RAPPORT("right kernel");
 
+	TESTE("right kernel");
+	if (!testNullSpaceBasis (F, m,n,0, iterations, true))
+		pass=false;
+	RAPPORT("right kernel");
 
-	commentator().stop("NullSpace test suite");
-	return (pass ? 0 : -1);
-}
+	TESTE("right kernel");
+	if (!testNullSpaceBasis (F, n,m,0, iterations, true))
+		pass=false;
+	RAPPORT("right kernel");
 
+	TESTE("right kernel");
+	if (!testNullSpaceBasis (F, n,m,std::min(m,n), iterations, true))
+		pass=false;
+	RAPPORT("right kernel");
+
+
+
+	// if we are here, no RAPPORT exited
+	report << "\033[1;32m +++ ALL MY TESTS PASSED +++\033[0;m" << endl;
 
 
+	commentator().stop(MSG_STATUS (pass),"NullSpace test suite");
+	return (pass ? 0 : -1);
+}
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-opencl-domain.C b/tests/test-opencl-domain.C
new file mode 100644
index 0000000..73e9c9e
--- /dev/null
+++ b/tests/test-opencl-domain.C
@@ -0,0 +1,891 @@
+/* tests/test-blas-domain.C
+ * Copyright (C) 2011 Matthew Wezowicz
+ *
+ * Written by Matthew Wezowicz <mwezz at udel.edu>
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file  tests/test-blas-domain.C
+ * @ingroup tests
+ * @brief  no doc
+ * @test NO DOC
+ */
+
+#include <string>
+#include <iostream>
+
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/util/commentator.h"
+
+#include "test-common.h"
+
+#ifndef _OPENCL_TIMER_
+#define _OPENCL_TIMER_
+
+#include <stack>
+
+#include <sys/time.h>
+
+class OpenCLTimer{
+
+private:
+	std::stack<struct timeval, std::vector<struct timeval> > timerStack;
+
+public:
+	OpenCLTimer(){}
+
+	~OpenCLTimer(){}
+
+	void tic(){
+		struct timeval tempTimeVal;
+		gettimeofday(&tempTimeVal, NULL);
+
+		timerStack.push(tempTimeVal);
+	}
+
+	double toc(){
+		double returnValue;
+		struct timeval now;
+		struct timeval then;
+
+		gettimeofday(&now, NULL);
+
+		then = timerStack.top();
+		timerStack.pop();
+
+		returnValue = ((double)(now.tv_sec - then.tv_sec) +
+		              ((double)(now.tv_usec - then.tv_usec) * 1e-6));
+
+		return returnValue;
+	}
+
+};
+
+#endif
+
+using namespace LinBox;
+
+const int maxpretty = 35;
+
+std::string pretty(std::string a) {
+	std::string blank;
+	blank = a;
+	int msgsize= maxpretty - (int)blank.size();
+	std::string dot(".");
+	for(int i=0;i<msgsize ;++i){
+		blank += dot;
+	}
+	return blank;
+}
+
+template <class Field>
+static bool testMul(const Field& F, size_t n, int iterations){
+	typedef typename Field::Element Element;
+	typedef typename Field::RandIter RandIter;
+	typedef BlasMatrix<Field> Matrix;
+
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+	commentator().start(pretty("Testing mul"),"testMul",(size_t)iterations);
+
+	RandIter G(F);
+	bool ret = true;
+	BlasMatrixDomain<Field> BMD(F);
+	OpenCLMatrixDomain<Field> OMD(F);
+
+	for(int i = 0; i < iterations; i++){
+		commentator().progress(i);
+		Matrix A(F,n,n);
+		Matrix B(F,n,n);
+		Matrix C_b(F,n,n);
+		Matrix C_o(F,n,n);
+
+		Element tmp;
+
+		for(size_t k = 0; k < n; k++){
+			for(size_t j = 0; j < n; j++){
+				A.setEntry(k,j,G.random(tmp));
+				B.setEntry(k,j,G.random(tmp));
+			}
+		}
+
+		OpenCLTimer timer;
+		timer.tic();
+		BMD.mul(C_b,A,B);
+		commentator().report() << "Blas mul() execution time: "
+		                       << timer.toc() << std::endl;
+		timer.tic();
+		OMD.mul(C_o,A,B);
+		commentator().report() << "OpenCL mul() execution time: "
+		                       << timer.toc() << std::endl;
+
+		if(!OMD.areEqual(C_b,C_o)){
+			ret = false;
+		}
+	}
+
+	commentator().stop(MSG_STATUS(ret), (const char*)0, "testMul");
+
+	return ret;
+}
+
+template <class Field>
+static bool testMulinLeft(const Field& F, size_t n, int iterations){
+	typedef typename Field::Element Element;
+	typedef typename Field::RandIter RandIter;
+	typedef BlasMatrix<Field> Matrix;
+
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+	commentator().start(pretty("Testing mulin_left"),"testMulinLeft",(size_t)iterations);
+
+	RandIter G(F);
+	bool ret = true;
+	BlasMatrixDomain<Field> BMD(F);
+	OpenCLMatrixDomain<Field> OMD(F);
+
+	for(int i = 0; i < iterations; i++){
+		commentator().progress(i);
+		Matrix A_b(F,n,n);
+		Matrix A_o(F,n,n);
+		Matrix B(F,n,n);
+
+		Element tmp;
+
+		for(size_t k = 0; k < n; k++){
+			for(size_t j = 0; j < n; j++){
+				A_b.setEntry(k,j,G.random(tmp));
+				B.setEntry(k,j,G.random(tmp));
+			}
+		}
+
+		A_o = A_b;
+
+		OpenCLTimer timer;
+		timer.tic();
+		BMD.mulin_left(A_b,B);
+		commentator().report() << "Blas mulin_left() execution time: "
+		                       << timer.toc() << std::endl;
+		timer.tic();
+		OMD.mulin_left(A_o,B);
+		commentator().report() << "OpenCL mulin_left() execution time: "
+		                       << timer.toc() << std::endl;
+
+		if(!OMD.areEqual(A_b,A_o)){
+			ret = false;
+		}
+	}
+
+	commentator().stop(MSG_STATUS(ret), (const char*)0, "testMulinLeft");
+
+	return ret;
+}
+
+template <class Field>
+static bool testMulinRight(const Field& F, size_t n, int iterations){
+	typedef typename Field::Element Element;
+	typedef typename Field::RandIter RandIter;
+	typedef BlasMatrix<Field> Matrix;
+
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+	commentator().start(pretty("Testing mulin_right"),"testMulinRight",(size_t)iterations);
+
+	RandIter G(F);
+	bool ret = true;
+	BlasMatrixDomain<Field> BMD(F);
+	OpenCLMatrixDomain<Field> OMD(F);
+
+	for(int i = 0; i < iterations; i++){
+		commentator().progress(i);
+		Matrix A(F,n,n);
+		Matrix B_b(F,n,n);
+		Matrix B_o(F,n,n);
+
+		Element tmp;
+
+		for(size_t k = 0; k < n; k++){
+			for(size_t j = 0; j < n; j++){
+				A.setEntry(k,j,G.random(tmp));
+				B_b.setEntry(k,j,G.random(tmp));
+			}
+		}
+
+		B_o = B_b;
+
+		OpenCLTimer timer;
+		timer.tic();
+		BMD.mulin_right(A,B_b);
+		commentator().report() << "Blas mulin_right() execution time: "
+		                       << timer.toc() << std::endl;
+		timer.tic();
+		OMD.mulin_right(A,B_o);
+		commentator().report() << "OpenCL mulin_right() execution time: "
+		                       << timer.toc() << std::endl;
+
+		if(!OMD.areEqual(B_b,B_o)){
+			ret = false;
+		}
+	}
+
+	commentator().stop(MSG_STATUS(ret), (const char*)0, "testMulinRight");
+
+	return ret;
+}
+
+template <class Field>
+static bool testAxpy(const Field& F, size_t n, int iterations){
+	typedef typename Field::Element Element;
+	typedef typename Field::RandIter RandIter;
+	typedef BlasMatrix<Field> Matrix;
+
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+	commentator().start(pretty("Testing axpy"),"testAxpy",(size_t)iterations);
+
+	RandIter G(F);
+	bool ret = true;
+	BlasMatrixDomain<Field> BMD(F);
+	OpenCLMatrixDomain<Field> OMD(F);
+
+	for(int i = 0; i < iterations; i++){
+		commentator().progress(i);
+		Matrix A(F,n,n);
+		Matrix B(F,n,n);
+		Matrix C(F,n,n);
+		Matrix D_b(F,n,n);
+		Matrix D_o(F,n,n);
+
+		Element tmp;
+
+		for(size_t k = 0; k < n; k++){
+			for(size_t j = 0; j < n; j++){
+				A.setEntry(k,j,G.random(tmp));
+				B.setEntry(k,j,G.random(tmp));
+				C.setEntry(k,j,G.random(tmp));
+			}
+		}
+
+		OpenCLTimer timer;
+		timer.tic();
+		BMD.axpy(D_b,A,B,C);
+		commentator().report() << "Blas axpy() execution time: "
+		                       << timer.toc() << std::endl;
+		timer.tic();
+		OMD.axpy(D_o,A,B,C);
+		commentator().report() << "OpenCL axpy() execution time: "
+		                       << timer.toc() << std::endl;
+
+		if(!OMD.areEqual(D_b,D_o)){
+			ret = false;
+		}
+	}
+
+	commentator().stop(MSG_STATUS(ret), (const char*)0, "testAxpy");
+
+	return ret;
+}
+
+template <class Field>
+static bool testAxpyin(const Field& F, size_t n, int iterations){
+	typedef typename Field::Element Element;
+	typedef typename Field::RandIter RandIter;
+	typedef BlasMatrix<Field> Matrix;
+
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+	commentator().start(pretty("Testing axpyin"),"testAxpyin",(size_t)iterations);
+
+	RandIter G(F);
+	bool ret = true;
+	BlasMatrixDomain<Field> BMD(F);
+	OpenCLMatrixDomain<Field> OMD(F);
+
+	for(int i = 0; i < iterations; i++){
+		commentator().progress(i);
+		Matrix A(F,n,n);
+		Matrix B(F,n,n);
+		Matrix C_b(F,n,n);
+		Matrix C_o(F,n,n);
+
+		Element tmp;
+
+		for(size_t k = 0; k < n; k++){
+			for(size_t j = 0; j < n; j++){
+				A.setEntry(k,j,G.random(tmp));
+				B.setEntry(k,j,G.random(tmp));
+				C_b.setEntry(k,j,G.random(tmp));
+			}
+		}
+
+		C_o = C_b;
+
+		OpenCLTimer timer;
+		timer.tic();
+		BMD.axpyin(C_b,A,B);
+		commentator().report() << "Blas axpyin() execution time: "
+		                       << timer.toc() << std::endl;
+		timer.tic();
+		OMD.axpyin(C_o,A,B);
+		commentator().report() << "OpenCL axpyin() execution time: "
+		                       << timer.toc() << std::endl;
+
+		if(!OMD.areEqual(C_b,C_o)){
+			ret = false;
+		}
+	}
+
+	commentator().stop(MSG_STATUS(ret), (const char*)0, "testAxpyin");
+
+	return ret;
+}
+
+template <class Field>
+static bool testMaxpy(const Field& F, size_t n, int iterations){
+	typedef typename Field::Element Element;
+	typedef typename Field::RandIter RandIter;
+	typedef BlasMatrix<Field> Matrix;
+
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+	commentator().start(pretty("Testing maxpy"),"testMaxpy",(size_t)iterations);
+
+	RandIter G(F);
+	bool ret = true;
+	BlasMatrixDomain<Field> BMD(F);
+	OpenCLMatrixDomain<Field> OMD(F);
+
+	for(int i = 0; i < iterations; i++){
+		commentator().progress(i);
+		Matrix A(F,n,n);
+		Matrix B(F,n,n);
+		Matrix C(F,n,n);
+		Matrix D_b(F,n,n);
+		Matrix D_o(F,n,n);
+
+		Element tmp;
+
+		for(size_t k = 0; k < n; k++){
+			for(size_t j = 0; j < n; j++){
+				A.setEntry(k,j,G.random(tmp));
+				B.setEntry(k,j,G.random(tmp));
+				C.setEntry(k,j,G.random(tmp));
+			}
+		}
+
+		OpenCLTimer timer;
+		timer.tic();
+		BMD.maxpy(D_b,A,B,C);
+		commentator().report() << "Blas maxpy() execution time: "
+		                       << timer.toc() << std::endl;
+		timer.tic();
+		OMD.maxpy(D_o,A,B,C);
+		commentator().report() << "OpenCL maxpy() execution time: "
+		                       << timer.toc() << std::endl;
+
+		if(!OMD.areEqual(D_b,D_o)){
+			ret = false;
+		}
+	}
+
+	commentator().stop(MSG_STATUS(ret), (const char*)0, "testMaxpy");
+
+	return ret;
+}
+
+template <class Field>
+static bool testMaxpyin(const Field& F, size_t n, int iterations){
+	typedef typename Field::Element Element;
+	typedef typename Field::RandIter RandIter;
+	typedef BlasMatrix<Field> Matrix;
+
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+	commentator().start(pretty("Testing maxpyin"),"testMaxpyin",(size_t)iterations);
+
+	RandIter G(F);
+	bool ret = true;
+	BlasMatrixDomain<Field> BMD(F);
+	OpenCLMatrixDomain<Field> OMD(F);
+
+	for(int i = 0; i < iterations; i++){
+		commentator().progress(i);
+		Matrix A(F,n,n);
+		Matrix B(F,n,n);
+		Matrix C_b(F,n,n);
+		Matrix C_o(F,n,n);
+
+		Element tmp;
+
+		for(size_t k = 0; k < n; k++){
+			for(size_t j = 0; j < n; j++){
+				A.setEntry(k,j,G.random(tmp));
+				B.setEntry(k,j,G.random(tmp));
+				C_b.setEntry(k,j,G.random(tmp));
+			}
+		}
+
+		C_o = C_b;
+
+		OpenCLTimer timer;
+		timer.tic();
+		BMD.maxpyin(C_b,A,B);
+		commentator().report() << "Blas maxpyin() execution time: "
+		                       << timer.toc() << std::endl;
+		timer.tic();
+		OMD.maxpyin(C_o,A,B);
+		commentator().report() << "OpenCL maxpyin() execution time: "
+		                       << timer.toc() << std::endl;
+
+		if(!OMD.areEqual(C_b,C_o)){
+			ret = false;
+		}
+	}
+
+	commentator().stop(MSG_STATUS(ret), (const char*)0, "testMaxpyin");
+
+	return ret;
+}
+
+template <class Field>
+static bool testAxmy(const Field& F, size_t n, int iterations){
+	typedef typename Field::Element Element;
+	typedef typename Field::RandIter RandIter;
+	typedef BlasMatrix<Field> Matrix;
+
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+	commentator().start(pretty("Testing axmy"),"testAxmy",(size_t)iterations);
+
+	RandIter G(F);
+	bool ret = true;
+	BlasMatrixDomain<Field> BMD(F);
+	OpenCLMatrixDomain<Field> OMD(F);
+
+	for(int i = 0; i < iterations; i++){
+		commentator().progress(i);
+		Matrix A(F,n,n);
+		Matrix B(F,n,n);
+		Matrix C(F,n,n);
+		Matrix D_b(F,n,n);
+		Matrix D_o(F,n,n);
+
+		Element tmp;
+
+		for(size_t k = 0; k < n; k++){
+			for(size_t j = 0; j < n; j++){
+				A.setEntry(k,j,G.random(tmp));
+				B.setEntry(k,j,G.random(tmp));
+				C.setEntry(k,j,G.random(tmp));
+			}
+		}
+
+		OpenCLTimer timer;
+		timer.tic();
+		BMD.axmy(D_b,A,B,C);
+		commentator().report() << "Blas axmy() execution time: "
+		                       << timer.toc() << std::endl;
+		timer.tic();
+		OMD.axmy(D_o,A,B,C);
+		commentator().report() << "OpenCL axmy() execution time: "
+		                       << timer.toc() << std::endl;
+
+		if(!OMD.areEqual(D_b,D_o)){
+			ret = false;
+		}
+	}
+
+	commentator().stop(MSG_STATUS(ret), (const char*)0, "testAxmy");
+
+	return ret;
+}
+
+template <class Field>
+static bool testAxmyin(const Field& F, size_t n, int iterations){
+	typedef typename Field::Element Element;
+	typedef typename Field::RandIter RandIter;
+	typedef BlasMatrix<Field> Matrix;
+
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+	commentator().start(pretty("Testing axmyin"),"testAxmyin",(size_t)iterations);
+
+	RandIter G(F);
+	bool ret = true;
+	BlasMatrixDomain<Field> BMD(F);
+	OpenCLMatrixDomain<Field> OMD(F);
+
+	for(int i = 0; i < iterations; i++){
+		commentator().progress(i);
+		Matrix A(F,n,n);
+		Matrix B(F,n,n);
+		Matrix C_b(F,n,n);
+		Matrix C_o(F,n,n);
+
+		Element tmp;
+
+		for(size_t k = 0; k < n; k++){
+			for(size_t j = 0; j < n; j++){
+				A.setEntry(k,j,G.random(tmp));
+				B.setEntry(k,j,G.random(tmp));
+				C_b.setEntry(k,j,G.random(tmp));
+			}
+		}
+
+		C_o = C_b;
+
+		OpenCLTimer timer;
+		timer.tic();
+		BMD.axmyin(C_b,A,B);
+		commentator().report() << "Blas axmyin() execution time: "
+		                       << timer.toc() << std::endl;
+		timer.tic();
+		OMD.axmyin(C_o,A,B);
+		commentator().report() << "OpenCL axmyin() execution time: "
+		                       << timer.toc() << std::endl;
+
+		if(!OMD.areEqual(C_b,C_o)){
+			ret = false;
+		}
+	}
+
+	commentator().stop(MSG_STATUS(ret), (const char*)0, "testAxmyin");
+
+	return ret;
+}
+
+template <class Field>
+static bool testMuladd(const Field& F, size_t n, int iterations){
+	typedef typename Field::Element Element;
+	typedef typename Field::RandIter RandIter;
+	typedef BlasMatrix<Field> Matrix;
+
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+	commentator().start(pretty("Testing muladd"),"testMuladd",(size_t)iterations);
+
+	RandIter G(F);
+	bool ret = true;
+	BlasMatrixDomain<Field> BMD(F);
+	OpenCLMatrixDomain<Field> OMD(F);
+
+	for(int i = 0; i < iterations; i++){
+		commentator().progress(i);
+		Matrix A(F,n,n);
+		Matrix B(F,n,n);
+		Matrix C(F,n,n);
+		Matrix D_b(F,n,n);
+		Matrix D_o(F,n,n);
+
+		Element tmp;
+
+		for(size_t k = 0; k < n; k++){
+			for(size_t j = 0; j < n; j++){
+				A.setEntry(k,j,G.random(tmp));
+				B.setEntry(k,j,G.random(tmp));
+				C.setEntry(k,j,G.random(tmp));
+			}
+		}
+
+		OpenCLTimer timer;
+		timer.tic();
+		BMD.muladd(D_b,1.0,C,2.0,A,B);
+		commentator().report() << "Blas muladd() execution time: "
+		                       << timer.toc() << std::endl;
+		timer.tic();
+		OMD.muladd(D_o,1.0,C,2.0,A,B);
+		commentator().report() << "OpenCL muladd() execution time: "
+		                       << timer.toc() << std::endl;
+
+		if(!OMD.areEqual(D_b,D_o)){
+			ret = false;
+		}
+
+		/*
+		BMD.muladd(D_b,-1.0,C,2.0,A,B);
+		OMD.muladd(D_o,-1.0,C,2.0,A,B);
+
+		if(!OMD.areEqual(D_b,D_o)){
+			ret = false;
+		}
+
+		BMD.muladd(D_b,1.0,C,-2.0,A,B);
+		OMD.muladd(D_o,1.0,C,-2.0,A,B);
+
+		if(!OMD.areEqual(D_b,D_o)){
+			ret = false;
+		}
+
+		BMD.muladd(D_b,-1.0,C,-2.0,A,B);
+		OMD.muladd(D_o,-1.0,C,-2.0,A,B);
+
+		if(!OMD.areEqual(D_b,D_o)){
+			ret = false;
+		}
+		*/
+	}
+
+	commentator().stop(MSG_STATUS(ret), (const char*)0, "testMuladd");
+
+	return ret;
+}
+
+template <class Field>
+static bool testMuladdin(const Field& F, size_t n, int iterations){
+	typedef typename Field::Element Element;
+	typedef typename Field::RandIter RandIter;
+	typedef BlasMatrix<Field> Matrix;
+
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+	commentator().start(pretty("Testing muladdin"),"testMuladdin",(size_t)iterations);
+
+	RandIter G(F);
+	bool ret = true;
+	BlasMatrixDomain<Field> BMD(F);
+	OpenCLMatrixDomain<Field> OMD(F);
+
+	for(int i = 0; i < iterations; i++){
+		commentator().progress(i);
+		Matrix A(F,n,n);
+		Matrix B(F,n,n);
+		Matrix C_b(F,n,n);
+		Matrix C_o(F,n,n);
+
+		Element tmp;
+
+		for(size_t k = 0; k < n; k++){
+			for(size_t j = 0; j < n; j++){
+				A.setEntry(k,j,G.random(tmp));
+				B.setEntry(k,j,G.random(tmp));
+				C_b.setEntry(k,j,G.random(tmp));
+			}
+		}
+
+		C_o = C_b;
+
+		OpenCLTimer timer;
+		timer.tic();
+		BMD.muladdin(1.0,C_b,2.0,A,B);
+		commentator().report() << "Blas muladdin() execution time: "
+		                       << timer.toc() << std::endl;
+		timer.tic();
+		OMD.muladdin(1.0,C_o,2.0,A,B);
+		commentator().report() << "OpenCL muladdin() execution time: "
+		                       << timer.toc() << std::endl;
+
+		if(!OMD.areEqual(C_b,C_o)){
+			ret = false;
+		}
+	}
+
+	commentator().stop(MSG_STATUS(ret), (const char*)0, "testMuladdin");
+
+	return ret;
+}
+
+template <class Field>
+static bool testMulscale(const Field& F, size_t n, int iterations){
+	typedef typename Field::Element Element;
+	typedef typename Field::RandIter RandIter;
+	typedef BlasMatrix<Field> Matrix;
+
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+	commentator().start(pretty("Testing mulscale"),"testMulscale",(size_t)iterations);
+
+	RandIter G(F);
+	bool ret = true;
+	BlasMatrixDomain<Field> BMD(F);
+	OpenCLMatrixDomain<Field> OMD(F);
+
+	for(int i = 0; i < iterations; i++){
+		commentator().progress(i);
+		Matrix A(F,n,n);
+		Matrix B(F,n,n);
+		Matrix C_b(F,n,n);
+		Matrix C_o(F,n,n);
+
+		Element tmp;
+
+		for(size_t k = 0; k < n; k++){
+			for(size_t j = 0; j < n; j++){
+				A.setEntry(k,j,G.random(tmp));
+				B.setEntry(k,j,G.random(tmp));
+			}
+		}
+
+		OpenCLTimer timer;
+		timer.tic();
+		BMD.mul(C_b,2.0,A,B);
+		commentator().report() << "Blas mulscale() execution time: "
+		                       << timer.toc() << std::endl;
+		timer.tic();
+		OMD.mul(C_o,2.0,A,B);
+		commentator().report() << "OpenCL mulscale() execution time: "
+		                       << timer.toc() << std::endl;
+
+		if(!OMD.areEqual(C_b,C_o)){
+			ret = false;
+		}
+	}
+
+	commentator().stop(MSG_STATUS(ret), (const char*)0, "testMulscale");
+
+	return ret;
+}
+
+template <class Field>
+int launch_tests(Field& F, int n, int iterations){
+	bool pass = true;
+
+	if(!testMul(F, (size_t)n, iterations)){
+		pass = false;
+	}
+	// if(!testMulinLeft(F, n, iterations)){
+		// pass = false;
+	// }
+	// if(!testMulinRight(F, n, iterations)){
+		// pass = false;
+	// }
+	if(!testAxpy(F, (size_t)n, iterations)){
+		pass = false;
+	}
+	// if(!testAxpyin(F, n, iterations)){
+		// pass = false;
+	// }
+	if(!testMaxpy(F, (size_t)n, iterations)){
+		pass = false;
+	}
+	// if(!testMaxpyin(F, n, iterations)){
+		// pass = false;
+	// }
+	if(!testAxmy(F, (size_t)n, iterations)){
+		pass = false;
+	}
+	// if(!testAxmyin(F, n, iterations)){
+		// pass = false;
+	// }
+	if(!testMuladd(F, (size_t)n, iterations)){
+		pass = false;
+	}
+	// if(!testMuladdin(F, n, iterations)){
+		// pass = false;
+	// }
+	// if(!testMulscale(F, n, iterations)){
+		// pass = false;
+	// }
+
+	return pass;
+}
+
+/*
+void* performOpenCL_mul(void* t){
+	Givaro::Modular<double> F(1000003U);
+
+	OpenCLMatrixDomain<Givaro::Modular<double> > OMD(F);
+
+	Givaro::Modular<double>::RandIter G(F);
+
+	BlasMatrix<Givaro::Modular<double> > A(F,500,500);
+	BlasMatrix<Givaro::Modular<double> > B(F,500,500);
+	BlasMatrix<Givaro::Modular<double> > C(F,500,500);
+
+	double temp;
+
+	for(size_t k = 0; k < 500; k++){
+		for(size_t j = 0; j < 500; j++){
+			A.setEntry(k,j,G.random(temp));
+			B.setEntry(k,j,G.random(temp));
+		}
+	}
+
+	OMD.mul(C,A,B);
+
+	pthread_exit(NULL);
+}
+
+void testThreadSafe(int iterations){
+	pthread_t* pthreads = (pthread_t*)operator new(iterations * sizeof(pthread_t));
+
+	for(int i = 0; i < iterations; i++){
+		pthread_create(&pthreads[i], NULL, performOpenCL_mul, NULL);
+	}
+
+	for(int i = 0; i < iterations; i++){
+		pthread_join(pthreads[i], NULL);
+	}
+}
+*/
+
+int main(int argc, char** argv){
+	static size_t n = 500;
+	static int q = 1000003U;
+	static int iterations = 3;
+
+	static Argument args[] = {
+		{'n', "-n N", "Set dimension of test matrices to NxN", TYPE_INT, &n},
+		{'q', "-q Q", "Operate over the \"field\" GF(Q) [1]", TYPE_INT, &q},
+		{ 'i', "-i I", "Perform each test for I iterations", TYPE_INT, &iterations},
+		END_OF_ARGUMENTS};
+
+	parseArguments (argc, argv, args);
+
+	Givaro::Modular<double> F(1000003U);
+	Givaro::Modular<float> H(3);
+
+	bool pass = true;
+
+	srand((unsigned)time(NULL));
+
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDepth(3);
+	commentator().getMessageClass(INTERNAL_DESCRIPTION).setMaxDetailLevel(Commentator::LEVEL_NORMAL);
+
+	commentator().start("OpenCLMatrixDomain test suite", "OpenCLMatrixDomain");
+
+	//For warmup of OpenCLMatrixDomainFactory
+	OpenCLMatrixDomain<Givaro::Modular<double> > OMD(F);
+	commentator().report() << "Number of OpenCL Devices: "
+#ifdef __LINBOX_HAVE_OCL
+	                       << OpenCLMatrixDomainFactory::oclGetNumberOfDevices()
+#else
+	                       << 0
+#endif
+	                       << std::endl;
+
+	//testThreadSafe(iterations * 5);
+
+	pass &= launch_tests(F, (int)n, iterations);
+	pass &= launch_tests(H, (int)n, iterations);
+
+	commentator().stop(MSG_STATUS(pass), (const char*)0, "OpenCLMatrixDomain test suite");
+	return (pass ? 0 : -1);
+}
+
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
diff --git a/tests/test-optimization.C b/tests/test-optimization.C
index 1c8fdb2..6943d0f 100644
--- a/tests/test-optimization.C
+++ b/tests/test-optimization.C
@@ -33,7 +33,7 @@
 
 #include <iostream>
 #include <fstream>
-#include "linbox/field/modular.h" /* WHY ?? */
+#include "linbox/ring/modular.h" /* WHY ?? */
 /*   otherwise the compiler says :
  *   /usr/bin/ld: test-optimization.o: undefined reference to symbol 'dtrmm_'
  *   /usr/bin/ld: note: 'dtrmm_' is defined in DSO  /usr/lib64/libblas.so.3gf so try adding it to the linker command line
@@ -63,7 +63,8 @@ int main (int argc, char ** argv)
 	commentator().start("Optimization suite", "Optim");
 	std::ostream& report = commentator().report();
 
-	Modular<double> F(17);
+	typedef Givaro::Modular<double> Field;
+	Field F(17);
 	Timer chrono;
 
 	double *A, *C;
@@ -79,7 +80,7 @@ int main (int argc, char ** argv)
 			     n, n, n, 1., A, n, A, n, 0., C, n);
 		chrono.stop();
 		report << std::endl
-		<< "fgemm " << FFLAS::WinoSteps(n) << "Wino: " << n << "x" << n << ": "
+		<< "fgemm " << FFLAS::Protected::WinogradSteps(F,n) << "Wino: " << n << "x" << n << ": "
 		<< chrono.usertime() << " s, "
 		<< (2.0/chrono.usertime()*(double)n/100.0*(double)n/100.0*(double)n/100.0) << " Mffops"
 		<< std::endl;
diff --git a/tests/test-order-basis.C b/tests/test-order-basis.C
new file mode 100644
index 0000000..18e0d0a
--- /dev/null
+++ b/tests/test-order-basis.C
@@ -0,0 +1,157 @@
+/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+#include <iostream>
+#include "linbox/matrix/polynomial-matrix.h"
+#include "linbox/randiter/random-fftprime.h"
+#include "linbox/randiter/random-prime.h"
+#include "linbox/ring/modular.h"
+
+#include "linbox/algorithms/polynomial-matrix/polynomial-matrix-domain.h"
+#include "linbox/algorithms/polynomial-matrix/order-basis.h"
+#include "linbox/algorithms/block-coppersmith-domain.h"
+
+using namespace LinBox;
+using namespace std;
+
+ostream& report = commentator().report();
+//ostream& report = std::cout;
+
+template<typename Field, typename Mat>
+string check_sigma(const Field& F, const Mat& sigma,  Mat& serie, size_t ord){
+	Mat T(F,sigma.rowdim(),serie.coldim(),sigma.size()+serie.size()-1);
+	PolynomialMatrixMulDomain<Field> PMD(F);
+	PMD.mul(T,sigma,serie);
+	MatrixDomain<Field> MD(F);
+	size_t i=0;
+	string msg(".....");
+	bool nul_sigma=true;
+	while(i<ord && MD.isZero(T[i])){
+		if (!MD.isZero(sigma[i])) nul_sigma=false;		
+		i++;
+	}
+	if (i<ord){
+		cout<<"error at degree="<<i<<endl;
+		T[i].write(report, Tag::FileFormat::Plain);
+		cout<<"***"<<endl;
+		cout<<serie<<endl;
+		cout<<sigma<<endl;	
+	}
+	
+	
+	if (i==ord && !nul_sigma)
+		msg+="done";
+	else
+		msg+="error";
+	return msg;
+}
+
+template<typename MatPol>
+bool operator==(const MatPol& A, const MatPol& B){
+	MatrixDomain<typename MatPol::Field> MD(A.field());
+	if (A.real_degree()!=B.real_degree()|| A.rowdim()!= B.rowdim() || A.coldim()!=B.coldim()){
+		cout<<A.size()<<"("<<A.rowdim()<<"x"<<A.coldim()<<") <> "
+		    <<B.size()<<"("<<B.rowdim()<<"x"<<B.coldim()<<") <> "<<endl;
+		return false;
+	}
+	size_t i=0;
+	while (i<=A.real_degree() && MD.areEqual(A[i],B[i]))
+		i++;
+
+	if (i<=A.real_degree() && A.rowdim()<10 && A.coldim()<10){
+		cout<<"first:"<<endl<<A<<endl;
+		cout<<"second:"<<endl<<B<<endl;
+	}
+
+	return i>A.real_degree();
+}
+ 
+
+template<typename Field, typename RandIter>
+void check_sigma(const Field& F, RandIter& Gen, size_t m, size_t n, size_t d) {
+	//typedef typename Field::Element Element;
+	typedef PolynomialMatrix<PMType::matfirst,PMStorage::plain,Field> MatrixP;
+	//typedef PolynomialMatrix<PMType::polfirst,PMStorage::plain,Field> MatrixP;
+	MatrixP Serie(F, m, n,  d);
+	MatrixP Sigma1(F, m, m, d+1),Sigma2(F, m, m, d+1),Sigma3(F, m, m, d+1);
+
+	// set the Serie at random
+	for (size_t k=0;k<d;++k)
+		for (size_t i=0;i<m;++i)
+			for (size_t j=0;j<n;++j)
+				Gen.random(Serie.ref(i,j,k));
+
+	//report<<"Serie:="<<Serie<<std::endl;
+	
+	// define the shift
+	vector<size_t> shift(m,0);
+	vector<size_t> shift2(shift),shift3(shift);
+
+	OrderBasis<Field> SB(F);
+
+	SB.M_Basis(Sigma3, Serie, d, shift3);
+	report << "M-Basis       : " <<check_sigma(F,Sigma3,Serie,d)<<endl;
+	SB.PM_Basis2(Sigma1,Serie, d, shift);
+	report << "PM-Basis      : " <<check_sigma(F,Sigma1,Serie,d)<<endl;
+	//SB.oPM_Basis(Sigma2, Serie, d, shift2);
+	//report << "PM-Basis iter : " <<check_sigma(F,Sigma2,Serie,d)<<endl;
+
+	// if (!(Sigma1==Sigma2)){
+	// cout<<"---> different basis for PM-Basis and PM-Basis iter"<<endl;
+	// cout<<Sigma1<<endl;
+	// cout<<Sigma2<<endl;
+	// }
+	cout<<endl;
+}
+
+int main(int argc, char** argv){
+	static size_t  m = 64; // matrix dimension
+	static size_t  n = 32; // matrix dimension
+	static size_t  b = 20; // entries bitsize
+	static size_t  d = 32;  // matrix degree
+	static long    seed = time(NULL);
+
+	static Argument args[] = {
+		{ 'm', "-m M", "Set row dimension of matrix series to M.", TYPE_INT,     &m },
+		{ 'n', "-n N", "Set column dimension of matrix series to N.", TYPE_INT,     &n },
+		{ 'd', "-d D", "Set degree of  matrix series to D.", TYPE_INT,     &d },
+		{ 'b', "-b B", "Set bitsize of the matrix entries", TYPE_INT, &b },
+		{ 's', "-s s", "Set the random seed to a specific value", TYPE_INT, &seed},
+		END_OF_ARGUMENTS
+	};
+
+	parseArguments (argc, argv, args);
+
+	typedef Givaro::Modular<double>              SmallField;	
+	typedef Givaro::Modular<Givaro::Integer>      LargeField;
+
+	size_t logd=integer((uint64_t)d).bitsize();
+	
+	report<<"###  matrix series is of size "<<m<<" x "<<n<<" of degree "<<d<<std::endl;
+	if (b < 26){
+		if (logd>b-2){
+			report<<"degree is to large for field bitsize: "<<b<<std::endl;
+			exit(0);
+		}
+		RandomFFTPrime Rd(1<<b,seed);	
+		integer p = Rd.randomPrime(logd+1);
+		report<<"# starting sigma basis computation over SmallField [x] with p="<<p<<endl;;		
+		SmallField F(p);
+		typename SmallField::RandIter G(F,0,seed);
+		check_sigma(F,G,m,n,d);
+	}
+	else {
+		RandomPrimeIterator Rd(b,seed);	
+		integer p = Rd.randomPrime();
+		report<<"# starting sigma basis computation over LargeField Fp[x] with p="<<p<<endl;;		
+
+		LargeField F(p);
+		typename LargeField::RandIter G(F,0,seed);
+		check_sigma(F,G,m,n,d);
+	}
+
+
+	
+	return 0;
+}
+
+ 
diff --git a/tests/test-param-fuzzy.C b/tests/test-param-fuzzy.C
index 732a274..bd87708 100644
--- a/tests/test-param-fuzzy.C
+++ b/tests/test-param-fuzzy.C
@@ -3,20 +3,20 @@
  * Copyright (C) 2002 David Saunders
  * shamelessly mutated from one of the other field tests.
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -37,7 +37,7 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
+
 
 #include "linbox/field/param-fuzzy.h"
 
@@ -48,9 +48,9 @@ using namespace LinBox;
 
 int main (int argc, char **argv)
 {
-	//static integer q = 2147483647U;
+	//static integer q = 65521U;
 	static size_t n = 10000;
-	static int iterations = 10;
+	static unsigned int iterations = 10;
 
 	static Argument args[] = {
 		{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT,     &n },
@@ -87,7 +87,9 @@ int main (int argc, char **argv)
 	if (!testField<DoubleRealApproximation > (F, "Testing DoubleRealApproximation field"))
 		pass = false;
 
-	return pass ? 0 : -1;
+	// Can't meet field spec (e.g. init/convert from/to integer),
+	// so we accept if field test compiles.
+	return pass ? 0 : 0; //-1;
 
 }
 
diff --git a/tests/test-permutation.C b/tests/test-permutation.C
new file mode 100644
index 0000000..2535c3a
--- /dev/null
+++ b/tests/test-permutation.C
@@ -0,0 +1,137 @@
+
+/* tests/test-permutation.C
+ * bds
+ * adapted from test-diagonal by Bradford Hovinen <hovinen at cis.udel.edu>
+ *
+ * Time-stamp: <01 Dec 15 18:50:35 Jean-Guillaume.Dumas at imag.fr>
+ * --------------------------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *
+ */
+
+
+/*! @file  tests/test-diagonal.C
+ * @ingroup tests
+ * @brief  no doc
+ * @test NO DOC
+ */
+
+
+
+#include "linbox/linbox-config.h"
+
+
+#include <cstdio>
+
+#include "linbox/blackbox/permutation.h"
+#include "linbox/blackbox/transpose.h"
+#include "linbox/util/commentator.h"
+#include "linbox/ring/modular.h"
+#include "linbox/vector/stream.h"
+
+#include "test-common.h"
+#include "test-generic.h"
+
+using namespace LinBox;
+
+// Test 1: PP^T should = I.
+template <class Blackbox>
+static bool testInvEqTrans (Blackbox & P)
+{
+	typedef typename Blackbox::Field Field;
+	const Field & F = P.field();
+	typedef BlasVector<Field> Vector;
+
+	Transpose<Blackbox> PT(P);
+
+    typename Field::RandIter gen(F);
+    
+	RandomDenseStream<Field, Vector> stream1 (F, gen, P.rowdim(), 3);
+	commentator().start ("Testing PP^T = I", "testInvEqTrans", stream1.m ());
+
+	Vector u(F), v(F), w(F);
+	VectorWrapper::ensureDim (u, stream1.n ());
+	VectorWrapper::ensureDim (v, stream1.n ());
+	VectorWrapper::ensureDim (w, stream1.n ());
+	stream1.next (u);
+
+	PT.apply(v, u);
+	P.apply(w, v);
+
+	VectorDomain<Field> VD (F);
+	bool pass = VD.areEqual(w, u);
+	if (! pass || (pass && P.rowdim() <= 20)) {
+		ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+		VD.write (report << "u = ", u) << endl;
+		//PT.write(report << "PT = ") << endl; //transpose has no write!
+		VD.write (report << "v = P^Tu = ", v) << endl;
+		P.write(report << "P = ") << endl;
+		VD.write (report << "w = Pv = ", w) << endl;
+	}
+
+	commentator().stop (MSG_STATUS (pass), (const char *) 0, "testInvEqTrans");
+
+	return pass;
+}
+
+int main (int argc, char **argv)
+{
+	bool pass = true;
+
+	static size_t n = 10;
+	static integer q = 65521U;
+
+	static Argument args[] = {
+		{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT,     &n },
+		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+		END_OF_ARGUMENTS
+	};
+
+	typedef Givaro::Modular<uint32_t> Field;
+
+	parseArguments (argc, argv, args);
+	Field F (q);
+
+	srand ((unsigned)time (NULL));
+
+	commentator().start("Permutation matrix black box test suite", "permutation");
+
+	// Make sure some more detailed messages get printed
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
+
+	LinBox::Permutation<Field> P(F,n);
+	P.random();
+	pass = pass && testBlackboxNoRW(P);
+	pass = pass && testInvEqTrans(P);
+
+	commentator().stop (MSG_STATUS (pass));
+
+	return pass ? 0 : -1;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-plain-domain.C b/tests/test-plain-domain.C
new file mode 100644
index 0000000..2147953
--- /dev/null
+++ b/tests/test-plain-domain.C
@@ -0,0 +1,1632 @@
+
+/* tests/test-plain-domain.C
+ * -bds
+ *
+ * ---------------------------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ *
+ * Test suite for PlainDomain. This also tests PlainMatrix,
+ * ...SparseMatrixBase, and TransposeMatrix
+ */
+
+
+
+/*! @file  tests/test-plain-domain.C
+ * @ingroup tests
+ * @brief  no real doc.
+ *
+ * \par ERRORS:
+ *
+ * X- Ambiguous specializations with RolColMatrixTag
+ *  - Can't use leftMulin or rightMulin on some tests
+ *  - VectorDomain needs subin, addin, etc. with multiple vector representations
+ * @test NO DOC
+ */
+
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+
+
+#include "linbox/util/commentator.h"
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/matrix-domain.h"
+
+#include "test-matrix-domain.h"
+
+
+
+using namespace std;
+using namespace LinBox;
+
+#if 0
+class SingularMatrix {};
+
+template <class Matrix>
+TransposeMatrix<Matrix> transpose (Matrix &M)
+{
+	return TransposeMatrix<Matrix> (M);
+}
+
+template <class Field, class Matrix1, class Matrix2>
+void eliminate (MatrixDomain<Field> &MD, Matrix1 &M, Matrix2 &pivotRow,
+		size_t row, size_t col, size_t rowdim, size_t coldim)
+{
+	BlasMatrix<typename Matrix1::Field> pivotCol (M.field(),rowdim, 1);
+	BlasMatrix<typename Matrix1::Field> realPivotCol (M, row, col, rowdim, 1);
+	BlasMatrix<typename Matrix1::Field> block (M, row, col, rowdim, coldim);
+
+	MD.neg (pivotCol, realPivotCol);
+	MD.axpyin (block, pivotCol, pivotRow);
+}
+
+/* Dumb elimination code
+ *
+ * This computes the inverse of a nonsingular matrix. It throws SingularMatrix
+ * in the case that no inverse exists
+ */
+
+template <class Field, class Matrix1, class Matrix2>
+Matrix1 &inv (MatrixDomain<Field> &MD, Matrix1 &res, const Matrix2 &A)
+{
+	linbox_check (res.coldim () == A.coldim ());
+	linbox_check (res.rowdim () == A.rowdim ());
+
+	BlasMatrix<typename Matrix1::Field> M (MD.field(), res.rowdim (), res.coldim () * 2);
+	BlasMatrix<typename Matrix1::Field> M1 (M, 0, 0, res.rowdim (), res.coldim ());
+	BlasMatrix<typename Matrix1::Field> M2 (M, 0, res.coldim (), res.rowdim (), res.coldim ());
+
+	StandardBasisStream<Field, typename BlasMatrix<typename Matrix1::Field>::Row> stream (MD.field (), res.coldim ());
+	typename BlasMatrix<typename Matrix1::Field>::RowIterator ip = M2.rowBegin ();
+
+	for (; ip != M2.rowEnd (); ++ip)
+		stream >> *ip;
+
+	MD.copy (M1, A);
+
+	unsigned int idx;
+	typename Field::Element Mjj_inv;
+
+	for (idx = 0; idx < M.rowdim (); ++idx) {
+		if (MD.field ().isZero (M.getEntry (idx, idx))) {
+			typename BlasMatrix<typename Matrix1::Field>::ColIterator col;
+			typename BlasMatrix<typename Matrix1::Field>::Col::iterator i;
+			unsigned int c_idx = idx + 1;
+
+			col = M.colBegin () + (int)idx;
+			i = col->begin () + (int)(idx + 1);
+
+			while ( i != col->end () && MD.field ().isZero (*i)) ++i, ++c_idx;
+
+			if (i == col->end ())
+				throw SingularMatrix ();
+			else {
+				typename BlasMatrix<typename Matrix1::Field>::RowIterator row1, row2;
+
+				row1 = M.rowBegin () + (int)idx;
+				row2 = M.rowBegin () + (int)c_idx;
+
+				std::swap_ranges (row1->begin () + idx, row1->end (), row2->begin () + idx);
+			}
+		}
+
+		MD.field ().inv (Mjj_inv, M.getEntry (idx, idx));
+		BlasMatrix<typename Matrix1::Field> realPivotRow (M, idx, idx, 1, M.coldim () - idx);
+		MD.mulin (realPivotRow, Mjj_inv);
+
+		if (idx > 0)
+			eliminate (MD, M, realPivotRow, 0, idx, idx, M.coldim () - idx);
+
+		if (idx < M.rowdim () - 1)
+			eliminate (MD, M, realPivotRow, idx + 1, idx,
+				   M.rowdim () - idx - 1, M.coldim () - idx);
+	}
+
+	MD.copy (res, M2);
+	return res;
+}
+
+/* Test 1: Copy and areEqual
+ *
+ * Return true on success and false on failure
+ */
+
+template <class Field, class Matrix>
+static bool testCopyEqual (Field &F, const char *text, const Matrix &M)
+{
+	ostringstream str;
+
+	str << "Testing " << text << " matrix copy, areEqual" << ends;
+	commentator().start (str.str ().c_str (), "testCopyEqual");
+
+	bool ret = true;
+
+	MatrixDomain<Field> MD (F);
+
+	BlasMatrix<Field> M1 (F,M.rowdim (), M.coldim ());
+
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+	report << "Input matrix M:" << endl;
+	MD.write (report, M);
+
+	MD.copy (M1, M);
+
+	report << "Output matrix M1:" << endl;
+	MD.write (report, M1);
+
+	if (!MD.areEqual (M1, M)) {
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "ERROR: MatrixDomain reported matrices M and M1 are not equal" << endl;
+		ret = false;
+	}
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testCopyEqual");
+
+	return ret;
+}
+
+/* Test 2: subin and isZero
+ *
+ * Return true on success and false on failure
+ */
+
+template <class Field, class Matrix>
+static bool testSubinIsZero (Field &F, const char *text, const Matrix &M)
+{
+	ostringstream str;
+
+	str << "Testing " << text << " matrix subin, isZero" << ends;
+	commentator().start (str.str ().c_str (), "testSubinIsZero");
+
+	bool ret = true;
+
+	MatrixDomain<Field> MD (F);
+
+	BlasMatrix<Field> M1 (F,M.rowdim (), M.coldim ());
+
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+	report << "Input matrix M:" << endl;
+	MD.write (report, M);
+
+	MD.copy (M1, M);
+	MD.subin (M1, M);
+
+	report << "Output matrix M1:" << endl;
+	MD.write (report, M1);
+
+	if (!MD.isZero (M1)) {
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "ERROR: MatrixDomain reported matrix M1 is not zero" << endl;
+		ret = false;
+	}
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testSubinIsZero");
+
+	return ret;
+}
+
+/* Test 3: add-neg and sub
+ *
+ * Return true on success and false on failure
+ */
+
+template <class Field, class Matrix>
+static bool testAddNegSub (Field &F, const char *text, const Matrix &M1, const Matrix &M2)
+{
+	ostringstream str;
+
+	str << "Testing " << text << " matrix add-neg, sub" << ends;
+	commentator().start (str.str ().c_str (), "testAddNegSub");
+
+	bool ret = true;
+
+	MatrixDomain<Field> MD (F);
+
+	BlasMatrix<Field> M3 (F,M1.rowdim (), M1.coldim ());
+	BlasMatrix<Field> M4 (F,M1.rowdim (), M1.coldim ());
+	BlasMatrix<Field> M5 (F,M1.rowdim (), M1.coldim ());
+
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+	report << "Input matrix M1:" << endl;
+	MD.write (report, M1);
+
+	report << "Input matrix M2:" << endl;
+	MD.write (report, M2);
+
+	MD.neg (M3, M2);
+	MD.add (M4, M1, M3);
+	MD.sub (M5, M1, M2);
+
+	report << "Output matrix M3 = -M2:" << endl;
+	MD.write (report, M3);
+
+	report << "Output matrix M4 = M1 + -M2:" << endl;
+	MD.write (report, M4);
+
+	report << "Output matrix M5 = M1 - M2:" << endl;
+	MD.write (report, M5);
+
+	if (!MD.areEqual (M4, M5)) {
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "ERROR: MatrixDomain reported matrices M4 and M5 are not equal" << endl;
+		ret = false;
+	}
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testAddNegSub");
+
+	return ret;
+}
+
+/* Test 4: addin-negin and sub
+ *
+ * Return true on success and false on failure
+ */
+
+template <class Field, class Matrix>
+static bool testAddinNeginSub (Field &F, const char *text, const Matrix &M1, const Matrix &M2)
+{
+	ostringstream str;
+
+	str << "Testing " << text << " matrix addin-negin, sub" << ends;
+	commentator().start (str.str ().c_str (), "testAddinNeginSub");
+
+	bool ret = true;
+
+	MatrixDomain<Field> MD (F);
+
+	BlasMatrix<Field> M3 (F,M1.rowdim (), M1.coldim ());
+	BlasMatrix<Field> M4 (F,M1.rowdim (), M1.coldim ());
+
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+	report << "Input matrix M1:" << endl;
+	MD.write (report, M1);
+
+	report << "Input matrix M2:" << endl;
+	MD.write (report, M2);
+
+	MD.copy (M3, M2);
+	MD.negin (M3);
+
+	report << "Output matrix M3 = -M2:" << endl;
+	MD.write (report, M3);
+
+	MD.addin (M3, M1);
+
+	report << "Output matrix M3 = M1 + -M2:" << endl;
+	MD.write (report, M3);
+
+	MD.sub (M4, M1, M2);
+
+	report << "Output matrix M4 = M1 - M2:" << endl;
+	MD.write (report, M4);
+
+	if (!MD.areEqual (M3, M4)) {
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "ERROR: MatrixDomain reported matrices M3 and M4 are not equal" << endl;
+		ret = false;
+	}
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testAddinNeginSub");
+
+	return ret;
+}
+
+/* Test 5: inv and mul
+ *
+ * Return true on success and false on failure
+ */
+
+// Version for square matrices
+
+template <class Field, class Matrix>
+static bool testInvMulSquare (Field &F, const char *text, const Matrix &M)
+{
+	linbox_check (M.rowdim () == M.coldim ());
+
+	ostringstream str;
+
+	str << "Testing " << text << " matrix multiplication (square)" << ends;
+	commentator().start (str.str ().c_str (), "testInvMulSquare");
+
+	bool ret = true;
+
+	MatrixDomain<Field> MD (F);
+
+	BlasMatrix<Field> Minv (F, M.rowdim (), M.rowdim ());
+	BlasMatrix<Field> M2 (F, M.rowdim (), M.rowdim ());
+
+	StandardBasisStream<Field, typename BlasMatrix<Field>::Row> stream (F, M.rowdim ());
+
+	BlasMatrix<Field> I (F, M.rowdim (), M.rowdim ());
+	typename BlasMatrix<Field>::RowIterator i = I.rowBegin ();
+
+	while (i != I.rowEnd ())
+		stream >> *i++;
+
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+	report << "Input matrix M:" << endl;
+	MD.write (report, M);
+
+	try {
+		inv (MD, Minv, M);
+	}
+	catch (SingularMatrix) {
+		commentator().stop ("ok", (const char *) 0, "testInvMul");
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_WARNING)
+			<< "WARNING: Matrix was found singular" << endl;
+		return true;
+	}
+
+	report << "Computed inverse Minv:" << endl;
+	MD.write (report, Minv);
+
+	MD.mul (M2, M, Minv);
+
+	report << "Computed product M Minv:" << endl;
+	MD.write (report, M2);
+
+	if (!MD.areEqual (M2, I)) {
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "ERROR: MatrixDomain reported matrix M Minv is not the identity" << endl;
+		ret = false;
+	}
+
+	MD.mul (M2, Minv, M);
+
+	report << "Computed product Minv M:" << endl;
+	MD.write (report, M2);
+
+	if (!MD.areEqual (M2, I)) {
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "ERROR: MatrixDomain reported matrix Minv M is not the identity" << endl;
+		ret = false;
+	}
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testInvMulSquare");
+
+	return ret;
+}
+
+// Version for over-determined matrices
+
+template <class Field, class Matrix>
+static bool testInvMulOver (Field &F, const char *text, Matrix &M)
+{
+	linbox_check (M.coldim () <= M.rowdim ());
+
+	ostringstream str;
+
+	str << "Testing " << text << " matrix multiplication (over-determined)" << ends;
+	commentator().start (str.str ().c_str (), "testInvMulOver");
+
+	bool ret = true;
+
+	MatrixDomain<Field> MD (F);
+
+	BlasMatrix<Field> Minv (F, M.coldim (), M.coldim ());
+	BlasMatrix<Field> M2 (F, M.coldim (), M.coldim ());
+	BlasMatrix<Field> M3 (F, M.coldim (), M.coldim ());
+
+	BlasMatrix<Field> MTM (F, M.coldim (), M.coldim ());
+
+	StandardBasisStream<Field, typename BlasMatrix<Field>::Row>
+		stream (F, M.coldim ());
+
+	BlasMatrix<Field> I (F, M.coldim (), M.coldim ());
+	typename BlasMatrix<Field>::RowIterator i = I.rowBegin ();
+
+	while (i != I.rowEnd ())
+		stream >> *i++;
+
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+	report << "Input matrix M:" << endl;
+	MD.write (report, M);
+
+	MD.mul (MTM, transpose (M), M);
+
+	try {
+		inv (MD, Minv, MTM);
+	}
+	catch (SingularMatrix) {
+		commentator().stop ("ok", (const char *) 0, "testInvMul");
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_WARNING)
+			<< "WARNING: Matrix was found singular" << endl;
+		return true;
+	}
+
+	report << "Computed inverse Minv:" << endl;
+	MD.write (report, Minv);
+
+	MD.mul (M2, transpose(M), M);
+	MD.mul (M3, M2, Minv);
+
+	report << "Computed product M^T M Minv:" << endl;
+	MD.write (report, M3);
+
+	if (!MD.areEqual (M3, I)) {
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "ERROR: MatrixDomain reported matrix M^T M Minv is not the identity" << endl;
+		ret = false;
+	}
+
+	M2.resize (M.coldim (), M.rowdim ());
+
+	MD.mul (M2, Minv, transpose (M));
+	MD.mul (M3, M2, M);
+
+	report << "Computed product Minv M^T M:" << endl;
+	MD.write (report, M3);
+
+	if (!MD.areEqual (M3, I)) {
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "ERROR: MatrixDomain reported matrix Minv M^T M is not the identity" << endl;
+		ret = false;
+	}
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testInvMulOver");
+
+	return ret;
+}
+
+// Version for under-determined matrices
+
+template <class Field, class Matrix>
+static bool testInvMulUnder (Field &F, const char *text, Matrix &M)
+{
+	linbox_check (M.rowdim () <= M.coldim ());
+
+	ostringstream str;
+
+	str << "Testing " << text << " matrix multiplication (under-determined)" << ends;
+	commentator().start (str.str ().c_str (), "testInvMulUnder");
+
+	bool ret = true;
+
+	MatrixDomain<Field> MD (F);
+
+	BlasMatrix<Field> Minv (F, M.rowdim (), M.rowdim ());
+	BlasMatrix<Field> M2 (F, M.rowdim (), M.rowdim ());
+	BlasMatrix<Field> M3 (F, M.rowdim (), M.rowdim ());
+
+	BlasMatrix<Field> MMT (F, M.rowdim (), M.rowdim ());
+
+	StandardBasisStream<Field, typename BlasMatrix<Field>::Row> stream (F, M.rowdim ());
+
+	BlasMatrix<Field> I (F, M.rowdim (), M.rowdim ());
+	typename BlasMatrix<Field>::RowIterator i = I.rowBegin ();
+
+	while (i != I.rowEnd ())
+		stream >> *i++;
+
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+	report << "Input matrix M:" << endl;
+	MD.write (report, M);
+
+	MD.mul (MMT, M, transpose (M));
+
+	try {
+		inv (MD, Minv, MMT);
+	}
+	catch (SingularMatrix) {
+		commentator().stop ("ok", (const char *) 0, "testInvMul");
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_WARNING)
+			<< "WARNING: Matrix was found singular" << endl;
+		return true;
+	}
+
+	report << "Computed inverse Minv:" << endl;
+	MD.write (report, Minv);
+
+	MD.mul (M2, M, transpose (M));
+	MD.mul (M3, M2, Minv);
+
+	report << "Computed product M M^T Minv:" << endl;
+	MD.write (report, M3);
+
+	if (!MD.areEqual (M3, I)) {
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "ERROR: MatrixDomain reported matrix M M^T Minv is not the identity" << endl;
+		ret = false;
+	}
+
+	M2.resize (M.rowdim (), M.coldim ());
+
+	MD.mul (M2, Minv, M);
+	MD.mul (M3, M2, transpose (M));
+
+	report << "Computed product Minv M M^T:" << endl;
+	MD.write (report, M3);
+
+	if (!MD.areEqual (M3, I)) {
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "ERROR: MatrixDomain reported matrix Minv M M^T is not the identity" << endl;
+		ret = false;
+	}
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testInvMulUnder");
+
+	return ret;
+}
+
+/* Test 6: inv and leftMulin
+ *
+ * Return true on success and false on failure
+ */
+
+// Version for square matrices
+
+template <class Field, class Matrix>
+static bool testInvLeftMulinSquare (Field &F, const char *text, const Matrix &M)
+{
+	linbox_check (M.rowdim () == M.coldim ());
+
+	ostringstream str;
+
+	str << "Testing " << text << " left in-place matrix multiplication (square)" << ends;
+	commentator().start (str.str ().c_str (), "testInvLeftMulinSquare");
+
+	bool ret = true;
+
+	MatrixDomain<Field> MD (F);
+
+	BlasMatrix<Field> Minv (F, M.rowdim (), M.rowdim ());
+
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+	report << "Input matrix M:" << endl;
+	MD.write (report, M);
+
+	StandardBasisStream<Field, typename BlasMatrix<Field>::Row> stream (F, M.rowdim ());
+
+	BlasMatrix<Field> I (F, M.rowdim (), M.rowdim ());
+	typename BlasMatrix<Field>::RowIterator i = I.rowBegin ();
+
+	while (i != I.rowEnd ())
+		stream >> *i++;
+
+	try {
+		inv (MD, Minv, M);
+	}
+	catch (SingularMatrix) {
+		commentator().stop ("ok", (const char *) 0, "testInvLeftMulin");
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_WARNING)
+			<< "WARNING: Matrix was found singular" << endl;
+		//! @bug we should check it is singular indeed
+		return true;
+	}
+
+	report << "Computed inverse Minv:" << endl;
+	MD.write (report, Minv);
+
+	MD.leftMulin (M, Minv);
+
+	report << "Computed product M Minv:" << endl;
+	MD.write (report, Minv);
+
+	if (!MD.areEqual (Minv, I)) {
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "ERROR: MatrixDomain reported matrix Minv M is not the identity" << endl;
+		ret = false;
+	}
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testInvLeftMulinSquare");
+
+	return ret;
+}
+
+// Version for over-determined matrices
+
+template <class Field, class Matrix>
+static bool testInvLeftMulinOver (Field &F, const char *text, Matrix &M)
+{
+	linbox_check (M.coldim () <= M.rowdim ());
+
+	ostringstream str;
+
+	str << "Testing " << text << " left in-place matrix multiplication (over-determined)" << ends;
+	commentator().start (str.str ().c_str (), "testInvLeftMulinOver");
+
+	bool ret = true;
+
+	MatrixDomain<Field> MD (F);
+
+	BlasMatrix<Field> Minv (F, M.coldim (), M.coldim ());
+	BlasMatrix<Field> MTM (F, M.coldim (), M.coldim ());
+
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+	report << "Input matrix M:" << endl;
+	MD.write (report, M);
+
+	StandardBasisStream<Field, typename BlasMatrix<Field>::Row> stream (F, M.coldim ());
+
+	BlasMatrix<Field> I (F, M.coldim (), M.coldim ());
+	typename BlasMatrix<Field>::RowIterator i = I.rowBegin ();
+
+	while (i != I.rowEnd ())
+		stream >> *i++;
+
+	MD.mul (MTM, transpose (M), M);
+
+	try {
+		inv (MD, Minv, MTM);
+	}
+	catch (SingularMatrix) {
+		commentator().stop ("ok", (const char *) 0, "testInvLeftMulin");
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_WARNING)
+			<< "WARNING: Matrix was found singular" << endl;
+		//! @bug we should check it is singular indeed
+		return true;
+	}
+
+	report << "Computed inverse Minv:" << endl;
+	MD.write (report, Minv);
+
+	MD.leftMulin (Minv, MTM);
+
+	report << "Computed product Minv M^T M:" << endl;
+	MD.write (report, MTM);
+
+	if (!MD.areEqual (MTM, I)) {
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "ERROR: MatrixDomain reported matrix Minv M^T M is not the identity" << endl;
+		ret = false;
+	}
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testInvLeftMulinOver");
+
+	return ret;
+}
+
+// Version for under-determined matrices
+
+template <class Field, class Matrix>
+static bool testInvLeftMulinUnder (Field &F, const char *text, Matrix &M)
+{
+	linbox_check (M.rowdim () <= M.coldim ());
+
+	ostringstream str;
+
+	str << "Testing " << text << " left in-place matrix multiplication (under-determined)" << ends;
+	commentator().start (str.str ().c_str (), "testInvLeftMulinUnder");
+
+	bool ret = true;
+
+	MatrixDomain<Field> MD (F);
+
+	BlasMatrix<Field> Minv (F, M.rowdim (), M.rowdim ());
+	BlasMatrix<Field> MMT (F, M.rowdim (), M.rowdim ());
+
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+	report << "Input matrix M:" << endl;
+	MD.write (report, M);
+
+	StandardBasisStream<Field, typename BlasMatrix<Field>::Row> stream (F, M.rowdim ());
+
+	BlasMatrix<Field> I (F, M.rowdim (), M.rowdim ());
+	typename BlasMatrix<Field>::RowIterator i = I.rowBegin ();
+
+	while (i != I.rowEnd ())
+		stream >> *i++;
+
+	MD.mul (MMT, M, transpose (M));
+
+	try {
+		inv (MD, Minv, MMT);
+	}
+	catch (SingularMatrix) {
+		commentator().stop ("ok", (const char *) 0, "testInvLeftMulin");
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_WARNING)
+			<< "WARNING: Matrix was found singular" << endl;
+		// BlasMatrix<Field> N(F,MMT) ;
+		// typename Field::Element d;
+		// det(d,N);
+		// if (d != 0) {
+		//! @bug we should check it is singular indeed
+			return true ;
+		// }
+	}
+
+	report << "Computed inverse Minv:" << endl;
+	MD.write (report, Minv);
+
+	MD.leftMulin (Minv, MMT);
+
+	report << "Computed product Minv M M^T:" << endl;
+	MD.write (report, MMT);
+
+	if (!MD.areEqual (MMT, I)) {
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "ERROR: MatrixDomain reported matrix Minv M M^T is not the identity" << endl;
+	}
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testInvLeftMulinUnder");
+
+	return ret;
+}
+
+/* Test 7: inv and rightMulin
+ *
+ * Return true on success and false on failure
+ */
+
+// Version for square matrices
+
+template <class Field, class Matrix>
+static bool testInvRightMulinSquare (Field &F, const char *text, const Matrix &M)
+{
+	linbox_check (M.rowdim () == M.coldim ());
+
+	ostringstream str;
+
+	str << "Testing " << text << " right in-place matrix multiplication (square)" << ends;
+	commentator().start (str.str ().c_str (), "testInvRightMulinSquare");
+
+	bool ret = true;
+
+	MatrixDomain<Field> MD (F);
+
+	BlasMatrix<Field> Minv (F, M.rowdim (), M.rowdim ());
+
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+	report << "Input matrix M:" << endl;
+	MD.write (report, M);
+
+	StandardBasisStream<Field, typename BlasMatrix<Field>::Row> stream (F, M.rowdim ());
+
+	BlasMatrix<Field> I (F, M.rowdim (), M.rowdim ());
+	typename BlasMatrix<Field>::RowIterator i = I.rowBegin ();
+
+	while (i != I.rowEnd ())
+		stream >> *i++;
+
+	try {
+		inv (MD, Minv, M);
+	}
+	catch (SingularMatrix) {
+		commentator().stop ("ok", (const char *) 0, "testInvRightMulin");
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_WARNING)
+			<< "WARNING: Matrix was found singular" << endl;
+		return true;
+	}
+
+	report << "Computed inverse Minv:" << endl;
+	MD.write (report, Minv);
+
+	MD.rightMulin (Minv, M);
+
+	report << "Computed product Minv M:" << endl;
+	MD.write (report, Minv);
+
+	if (!MD.areEqual (Minv, I)) {
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "ERROR: MatrixDomain reported matrix Minv M is not the identity" << endl;
+		ret = false;
+	}
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testInvRightMulinSquare");
+
+	return ret;
+}
+
+// Version for over-determined matrices
+
+template <class Field, class Matrix>
+static bool testInvRightMulinOver (Field &F, const char *text, Matrix &M)
+{
+	linbox_check (M.coldim () <= M.rowdim ());
+
+	ostringstream str;
+
+	str << "Testing " << text << " right in-place matrix multiplication (over-determined)" << ends;
+	commentator().start (str.str ().c_str (), "testInvRightMulinOver");
+
+	bool ret = true;
+
+	MatrixDomain<Field> MD (F);
+
+	BlasMatrix<Field> Minv (F, M.coldim (), M.coldim ());
+	BlasMatrix<Field> MTM (F, M.coldim (), M.coldim ());
+
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+	report << "Input matrix M:" << endl;
+	MD.write (report, M);
+
+	StandardBasisStream<Field, typename BlasMatrix<Field>::Row> stream (F, M.coldim ());
+
+	BlasMatrix<Field> I (F, M.coldim (), M.coldim ());
+	typename BlasMatrix<Field>::RowIterator i = I.rowBegin ();
+
+	while (i != I.rowEnd ())
+		stream >> *i++;
+
+	MD.mul (MTM, transpose (M), M);
+
+	try {
+		inv (MD, Minv, MTM);
+	}
+	catch (SingularMatrix) {
+		commentator().stop ("ok", (const char *) 0, "testInvRightMulin");
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_WARNING)
+			<< "WARNING: Matrix was found singular" << endl;
+		return true;
+	}
+
+	report << "Computed inverse Minv:" << endl;
+	MD.write (report, Minv);
+
+	MD.rightMulin (MTM, Minv);
+
+	report << "Computed product M^T M Minv:" << endl;
+	MD.write (report, MTM);
+
+	if (!MD.areEqual (MTM, I)) {
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "ERROR: MatrixDomain reported matrix M^T M Minv is not the identity" << endl;
+		ret = false;
+	}
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testInvRightMulinOver");
+
+	return ret;
+}
+
+// Version for under-determined matrices
+
+template <class Field, class Matrix>
+static bool testInvRightMulinUnder (Field &F, const char *text, Matrix &M)
+{
+	linbox_check (M.rowdim () <= M.coldim ());
+
+	ostringstream str;
+
+	str << "Testing " << text << " right in-place matrix multiplication (under-determined)" << ends;
+	commentator().start (str.str ().c_str (), "testInvRightMulinUnder");
+
+	bool ret = true;
+
+	MatrixDomain<Field> MD (F);
+
+	BlasMatrix<Field> Minv (F, M.rowdim (), M.rowdim ());
+	BlasMatrix<Field> MMT (F, M.rowdim (), M.rowdim ());
+
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+	report << "Input matrix M:" << endl;
+	MD.write (report, M);
+
+	StandardBasisStream<Field, typename BlasMatrix<Field>::Row> stream (F, M.rowdim ());
+
+	BlasMatrix<Field> I (F, M.rowdim (), M.rowdim ());
+	typename BlasMatrix<Field>::RowIterator i = I.rowBegin ();
+
+	while (i != I.rowEnd ())
+		stream >> *i++;
+
+	MD.mul (MMT, M, transpose (M));
+
+	try {
+		inv (MD, Minv, MMT);
+	}
+	catch (SingularMatrix) {
+		commentator().stop ("ok", (const char *) 0, "testInvRightMulin");
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_WARNING)
+			<< "WARNING: Matrix was found singular" << endl;
+		return true;
+	}
+
+	report << "Computed inverse Minv:" << endl;
+	MD.write (report, Minv);
+
+	MD.rightMulin (MMT, Minv);
+
+	report << "Computed product M M^T Minv:" << endl;
+	MD.write (report, MMT);
+
+	if (!MD.areEqual (MMT, I)) {
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "ERROR: MatrixDomain reported matrix M M^T Minv is not the identity" << endl;
+		ret = false;
+	}
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testInvRightMulinUnder");
+
+	return ret;
+}
+
+/* Test 8: add-mul and axpyin
+ *
+ * Return true on success and false on failure
+ */
+
+template <class Field, class Matrix>
+static bool testAddMulAxpyin (Field &F, const char *text, Matrix &M1, Matrix &M2, Matrix &M3)
+{
+	ostringstream str;
+
+	str << "Testing " << text << " matrix add-mul, axpyin" << ends;
+	commentator().start (str.str ().c_str (), "testAddMulAxpyin");
+
+	bool ret = true;
+
+	MatrixDomain<Field> MD (F);
+
+	BlasMatrix<Field> M4 (F, M2.rowdim (), M3.coldim ());
+	BlasMatrix<Field> M5 (F, M1.rowdim (), M1.coldim ());
+	BlasMatrix<Field> M6 (F, M1.rowdim (), M1.coldim ());
+
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+	report << "Input matrix M1:" << endl;
+	MD.write (report, M1);
+
+	report << "Input matrix M2:" << endl;
+	MD.write (report, M2);
+
+	report << "Input matrix M3:" << endl;
+	MD.write (report, M3);
+
+	MD.mul (M4, M2, M3);
+	MD.add (M5, M1, M4);
+
+	report << "Computed matrix M5 = M1 + M2 * M3 (add-mul):" << endl;
+	MD.write (report, M5);
+
+	MD.copy (M6, M1);
+	MD.axpyin (M6, M2, M3);
+
+	report << "Computed matrix M6 = M1 + M2 * M3 (axpyin):" << endl;
+	MD.write (report, M6);
+
+	if (!MD.areEqual (M5, M6)) {
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "ERROR: MatrixDomain reported matrices M5 and M6 are not equal" << endl;
+		ret = false;
+	}
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testAddMulAxpyin");
+
+	return ret;
+}
+
+/* Test 9: m-v mul by e_i and sub
+ *
+ * Return true on success and false on failure
+ */
+
+template <class Field, class Matrix>
+static bool testMVMulSub (Field &F, const char *text, const Matrix &M)
+{
+	ostringstream str;
+
+	str << "Testing " << text << " matrix-vector mul" << ends;
+	commentator().start (str.str ().c_str (), "testMVMulSub");
+
+	bool ret = true;
+
+	MatrixDomain<Field> MD (F);
+
+	BlasMatrix<Field> M1 (F, M.rowdim (), M.coldim ());
+
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+	report << "Input matrix M:" << endl;
+	MD.write (report, M);
+
+	StandardBasisStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, M.rowdim ());
+	typename LinBox::Vector<Field>::Dense v (M.coldim ());
+	typename BlasMatrix<Field>::ColIterator i = M1.colBegin ();
+
+	for (; i != M1.colEnd (); ++i) {
+		stream >> v;
+		MD.vectorMul (*i, M, v);
+	}
+
+	report << "Output matrix M1:" << endl;
+	MD.write (report, M1);
+
+	MD.subin (M1, M);
+
+	if (!MD.isZero (M1)) {
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "ERROR: MatrixDomain reported matrices M and M1 are not equal" << endl;
+		ret = false;
+	}
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testMVMulSub");
+
+	return ret;
+}
+
+/* Test 10: m-v axpy by e_i
+ *
+ * Return true on success and false on failure
+ */
+
+template <class Field, class Matrix>
+static bool testMVAxpy (Field &F, const char *text, const Matrix &M)
+{
+	ostringstream str;
+
+	str << "Testing " << text << " matrix-vector axpy" << ends;
+	commentator().start (str.str ().c_str (), "testMVAxpy");
+
+	bool ret = true;
+
+	VectorDomain<Field> VD (F);
+	MatrixDomain<Field> MD (F);
+
+	BlasMatrix<Field> M1 (F, M.rowdim (), M.coldim ());
+
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+	report << "Input matrix M1:" << endl;
+	MD.write (report, M1);
+
+	StandardBasisStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, M.rowdim ());
+	typename LinBox::Vector<Field>::Dense v (M.coldim ()), w (M.rowdim ());
+	typename BlasMatrix<Field>::RowIterator i = M1.rowBegin ();
+
+	VD.subin (w, w);
+
+	for (; i != M1.rowEnd (); ++i) {
+		stream >> v;
+		MD.vectorAxpyin (w, M, v);
+	}
+
+	report << "Output vector w:" << endl;
+	VD.write (report, w);
+
+	typename LinBox::Vector<Field>::Dense z (M.coldim (), F.one), w1 (M.rowdim ());
+
+	MD.vectorMul (w1, M, z);
+
+	report << "Output vector w1:" << endl;
+	VD.write (report, w1);
+
+	if (!VD.areEqual (w, w1)) {
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "ERROR: VectorDomain reported vectors w and w1 are not equal" << endl;
+		ret = false;
+	}
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testMVAxpy");
+
+	return ret;
+}
+
+/* Test 11: black box multiply by I on the left, test on random vectors
+ *
+ * Return true on success and false on failure
+ */
+
+template <class Field, class Vector, class Blackbox>
+static bool testLeftBlackboxMul (Field &F, const char *text, const Blackbox &A,
+				 VectorStream<Vector> &stream)
+{
+	ostringstream str;
+
+	str << "Testing " << text << " matrix-black box left mul" << ends;
+	commentator().start (str.str ().c_str (), "testLeftBlackboxMul");
+
+	bool ret = true;
+
+	VectorDomain<Field> VD (F);
+	MatrixDomain<Field> MD (F);
+
+	BlasMatrix<Field> I (F, A.coldim (), A.coldim ());
+	BlasMatrix<Field> AI (F, A.rowdim (), A.coldim ());
+
+	StandardBasisStream<Field, typename BlasMatrix<Field>::Row> Istream (F, A.coldim ());
+	typename BlasMatrix<Field>::RowIterator i;
+
+	for (i = I.rowBegin (); i != I.rowEnd (); ++i)
+		Istream >> *i;
+
+	MD.blackboxMulLeft (AI, A, I);
+
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+	report << "Output matrix AI:" << endl;
+	MD.write (report, AI);
+
+	typename LinBox::Vector<Field>::Dense v (A.coldim ()), w1 (A.rowdim ()), w2 (A.rowdim ());
+
+	while (stream) {
+		stream >> v;
+
+		A.apply (w1, v);
+		MD.vectorMul (w2, AI, v);
+
+		if (!VD.areEqual (w1, w2)) {
+			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+				<< "ERROR: Av != AIv" << endl;
+			ret = false;
+		}
+	}
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testLeftBlackboxMul");
+
+	return ret;
+}
+
+/* Test 12: black box multiply by I on the right, test on random vectors
+ *
+ * Return true on success and false on failure
+ */
+
+template <class Field, class Vector, class Blackbox>
+static bool testRightBlackboxMul (Field &F, const char *text, const Blackbox &A,
+				  VectorStream<Vector> &stream)
+{
+	ostringstream str;
+
+	str << "Testing " << text << " matrix-black box right mul" << ends;
+	commentator().start (str.str ().c_str (), "testRightBlackboxMul");
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+
+	bool ret = true;
+
+	VectorDomain<Field> VD (F);
+	MatrixDomain<Field> MD (F);
+
+	BlasMatrix<Field> I (F, A.rowdim (), A.rowdim ());
+	BlasMatrix<Field> IA (F, A.rowdim (), A.coldim ());
+
+	StandardBasisStream<Field, typename BlasMatrix<Field>::Row> Istream (F, A.rowdim ());
+	typename BlasMatrix<Field>::RowIterator i;
+
+	for (i = I.rowBegin (); i != I.rowEnd (); ++i)
+		Istream >> *i;
+
+	MD.blackboxMulRight (IA, I, A);
+	report << "blackboxMulRight Output matrix IA:" << endl;
+	MD.write (report, IA);
+
+	MD.mul (IA, I, A);
+	report << "mul Output matrix IA:" << endl;
+	MD.write (report, IA);
+
+	MD.mul (IA, A, I);
+	report << "mul Output matrix AI:" << endl;
+	MD.write (report, IA);
+
+	typename LinBox::Vector<Field>::Dense v (A.coldim ()), w1 (A.rowdim ()), w2 (A.rowdim ());
+
+	while (stream) {
+		stream >> v;
+
+		A.apply (w1, v);
+		MD.vectorMul (w2, IA, v);
+
+		if (!VD.areEqual (w1, w2)) {
+			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+				<< "ERROR: Av != IAv" << endl;
+			ret = false;
+		}
+	}
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testRightBlackboxMul");
+
+	return ret;
+}
+
+std::ostream &reportPermutation
+	(std::ostream &out,
+	 const std::vector<std::pair<unsigned int, unsigned int> > &P)
+{
+	std::vector<std::pair<unsigned int, unsigned int> >::const_iterator i;
+
+	for (i = P.begin (); i != P.end (); ++i)
+		out << "(" << i->first << " " << i->second << ")";
+
+	return out;
+}
+
+template <class Field, class Matrix>
+bool testPermutation (const Field &F, const char *text, const Matrix &M)
+{
+	ostringstream str;
+
+	str << "Testing " << text << " permutations" << ends;
+	commentator().start (str.str ().c_str (), "testPermutation");
+
+	bool ret = true;
+
+	MatrixDomain<Field> MD (F);
+	MersenneTwister MT ((unsigned)time (NULL));
+
+	typename MatrixDomain<Field>::Permutation P, Pinv;
+
+	// Create a random row permutation
+	for (unsigned int i = 0; i < M.rowdim (); ++i) {
+		unsigned int row1, row2;
+
+		do {
+			row1 = (unsigned)(MT.randomInt () % M.rowdim ());
+			row2 = (unsigned)(MT.randomInt () % M.rowdim ());
+		} while (row1 == row2);
+
+		P.push_back (typename MatrixDomain<Field>::Transposition (row1, row2));
+	}
+
+	// Construct the inverse of this transposition
+	Pinv.resize (P.size ());
+	std::copy (P.begin (), P.end (), Pinv.begin ());
+	std::reverse (Pinv.begin (), Pinv.end ());
+
+	ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
+	report << "Permutation P:    ";
+	reportPermutation (report, P) << endl;
+	report << "Permutation P^-1: ";
+	reportPermutation (report, Pinv) << endl;
+
+	// Apply the permutation and then its inverse to a copy of M
+	Matrix M1 (M);
+
+	MD.permuteRows (M1, P.begin (), P.end ());
+ 	MD.permuteRows (M1, Pinv.begin (), Pinv.end ());
+
+	report << "Output matrix P^-1 PM:" << endl;
+	MD.write (report, M1);
+
+	// Compare M and M1
+	if (!MD.areEqual (M, M1)) {
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "ERROR: M != P^-1 PM" << endl;
+		ret = false;
+	}
+
+	// Now we do exactly the same thing with columns
+	P.clear ();
+	Pinv.clear ();
+
+	// Create a random column permutation
+	for (unsigned int i = 0; i < M.coldim (); ++i) {
+		unsigned int col1, col2;
+
+		do {
+			col1 = (unsigned)(MT.randomInt () % M.coldim ());
+			col2 = (unsigned)(MT.randomInt () % M.coldim ());
+		} while (col1 == col2);
+
+		P.push_back (typename MatrixDomain<Field>::Transposition (col1, col2));
+	}
+
+	// Construct the inverse of this transposition
+	Pinv.resize (P.size ());
+	std::copy (P.begin (), P.end (), Pinv.begin ());
+	std::reverse (Pinv.begin (), Pinv.end ());
+
+	report << "Permutation P:    ";
+	reportPermutation (report, P) << endl;
+	report << "Permutation P^-1: ";
+	reportPermutation (report, Pinv) << endl;
+
+	// Apply the permutation and then its inverse to a copy of M
+	MD.permuteColumns (M1, P.begin (), P.end ());
+	MD.permuteColumns (M1, Pinv.begin (), Pinv.end ());
+
+	report << "Output matrix MPP^-1:" << endl;
+	MD.write (report, M1);
+
+	// Compare M and M1
+	if (!MD.areEqual (M, M1)) {
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "ERROR: M != MPP^-1" << endl;
+		ret = false;
+	}
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testPermutation");
+
+	return ret;
+}
+
+template <class Field, class Blackbox, class Matrix>
+bool testMatrixDomain (const Field &F, typename Field::RandIter& gen, const char *text,
+		       Matrix &M1, Matrix &M2, Matrix &M3,
+		       const Blackbox &A,
+		       unsigned int iterations,
+		       MatrixCategories::RowColMatrixTag)
+{
+	ostringstream str;
+	str << "Testing MatrixDomain with " << text << " matrices" << ends;
+	commentator().start (str.str ().c_str ());
+
+	bool pass = true;
+
+	RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, gen, A.coldim (), iterations);
+
+	if (!testCopyEqual (F, text, M1))               pass = false;
+	if (!testSubinIsZero (F, text, M1))             pass = false;
+	if (!testAddNegSub (F, text, M1, M2))           pass = false;
+	if (!testAddinNeginSub (F, text, M1, M2))       pass = false;
+
+	if (M1.rowdim () == M1.coldim ()) {
+	if (!testInvMulSquare (F, text, M1))            pass = false;
+	if (!testInvLeftMulinSquare (F, text, M1))      pass = false;
+	if (!testInvRightMulinSquare (F, text, M1))     pass = false;
+	}
+	else if (M1.coldim () < M1.rowdim ()) {
+	if (!testInvMulOver (F, text, M1))              pass = false;
+	if (!testInvLeftMulinOver (F, text, M1))        pass = false;
+	if (!testInvRightMulinOver (F, text, M1))       pass = false;
+	}
+	else if (M1.rowdim () < M1.coldim ()) {
+	if (!testInvMulUnder (F, text, M1))             pass = false;
+	if (!testInvLeftMulinUnder (F, text, M1))       pass = false;
+	if (!testInvRightMulinUnder (F, text, M1))      pass = false;
+	}
+
+	if (!testAddMulAxpyin (F, text, M1, M2, M3))    pass = false;
+	if (!testMVMulSub (F, text, M1))                pass = false;
+	if (!testMVAxpy (F, text, M1))                  pass = false;
+	if (!testLeftBlackboxMul (F, text, A, stream))  pass = false;
+	if (!testRightBlackboxMul (F, text, A, stream)) pass = false;
+	if (!testPermutation (F, text, M1))             pass = false;
+
+	commentator().stop (MSG_STATUS (pass));
+
+	return pass;
+}
+
+template <class Field, class Blackbox, class Matrix>
+bool testMatrixDomain (const Field &F, ctypename Field::RandIter& gen, onst char *text,
+		       Matrix &M1, Matrix &M2, Matrix &M3,
+		       const Blackbox &A,
+		       unsigned int iterations,
+		       MatrixCategories::RowMatrixTag)
+{
+	ostringstream str;
+	str << "Testing MatrixDomain with " << text << " matrices" << ends;
+	commentator().start (str.str ().c_str ());
+
+	bool pass = true;
+
+	RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, gen, A.coldim (), iterations);
+
+	if (!testCopyEqual (F, text, M1))              pass = false;
+	if (!testSubinIsZero (F, text, M1))            pass = false;
+	if (!testAddNegSub (F, text, M1, M2))          pass = false;
+	if (!testAddinNeginSub (F, text, M1, M2))      pass = false;
+
+	if (M1.rowdim () == M1.coldim ()) {
+	if (!testInvMulSquare (F, text, M1))           pass = false;
+	if (!testInvLeftMulinSquare (F, text, M1))     pass = false;
+	}
+	else if (M1.rowdim () < M1.coldim ()) {
+	if (!testInvMulUnder (F, text, M1))            pass = false;
+	if (!testInvLeftMulinUnder (F, text, M1))      pass = false;
+	}
+
+	if (!testAddMulAxpyin (F, text, M1, M2, M3))   pass = false;
+	if (!testMVMulSub (F, text, M1))               pass = false;
+	if (!testMVAxpy (F, text, M1))                 pass = false;
+	if (!testLeftBlackboxMul (F, text, A, stream)) pass = false;
+	if (!testPermutation (F, text, M1))            pass = false;
+
+	commentator().stop (MSG_STATUS (pass));
+
+	return pass;
+}
+
+template <class Field, class Blackbox, class Matrix>
+bool testMatrixDomain (const Field &F, typename Field::RandIter& gen, const char *text,
+		       Matrix &M1, Matrix &M2, Matrix &M3,
+		       const Blackbox &A,
+		       unsigned int iterations,
+		       MatrixCategories::ColMatrixTag)
+{
+	ostringstream str;
+	str << "Testing MatrixDomain with " << text << " matrices" << ends;
+	commentator().start (str.str ().c_str ());
+
+	bool pass = true;
+
+	RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, gen, A.coldim (), iterations);
+
+	if (!testCopyEqual (F, text, M1))               pass = false;
+	if (!testSubinIsZero (F, text, M1))             pass = false;
+	if (!testAddNegSub (F, text, M1, M2))           pass = false;
+	if (!testAddinNeginSub (F, text, M1, M2))       pass = false;
+
+	if (M1.rowdim () == M1.coldim ()) {
+	if (!testInvMulSquare (F, text, M1))            pass = false;
+	if (!testInvRightMulinSquare (F, text, M1))     pass = false;
+	}
+	else if (M1.coldim () < M1.rowdim ()) {
+	if (!testInvMulOver (F, text, M1))              pass = false;
+	if (!testInvRightMulinOver (F, text, M1))       pass = false;
+	}
+
+	if (!testAddMulAxpyin (F, text, M1, M2, M3))    pass = false;
+	if (!testMVMulSub (F, text, M1))                pass = false;
+	if (!testMVAxpy (F, text, M1))                  pass = false;
+	if (!testRightBlackboxMul (F, text, A, stream)) pass = false;
+
+	commentator().stop (MSG_STATUS (pass));
+
+	return pass;
+}
+
+template <class Field, class Blackbox, class Matrix>
+bool testMatrixDomain (const Field &F, typename Field::RandIter& gen, const char *text,
+		       Matrix &M1, Matrix &M2, Matrix &M3,
+		       const Blackbox &A,
+		       unsigned int iterations,
+		       MatrixCategories::BlackboxTag)
+{
+	ostringstream str;
+	str << "Testing MatrixDomain with " << text << " matrices" << ends;
+	commentator().start (str.str ().c_str ());
+
+	bool pass = true;
+
+	RandomDenseStream<Field, typename LinBox::Vector<Field>::Dense> stream (F, gen, A.coldim (), iterations);
+
+	if (!testRightBlackboxMul (F, text, A, stream)) pass = false;
+
+	commentator().stop (MSG_STATUS (pass));
+
+	return pass;
+}
+
+template <class MatDomain>
+bool launchTestMatrixDomain(const MatDomain& MD, size_t m, size_t n, size_t k)
+{
+
+	bool pass = true ;
+	typename MatDomain::NewMatrix A(MD, m, m);
+	typename MatDomain::NewMatrix B(MD, m, m);
+	typename MatDomain::NewMatrix C(MD, m, m);
+	MD.add(C, A, B);
+	MD.inv(C,A);
+	MD.sub(C, A, B);
+	MD.mul(C, A, B);
+	MD.axpyin(C, A, B);
+	typename MatDomain::Matrix S;
+	S.submatrix(A, 0, 0, m, n);
+	MD.areEqual(A,S);
+#if 0
+	typedef typename Field::Element Element ;
+	BlasMatrix<Field> M1 (F, n, m);
+	BlasMatrix<Field> M2 (F, n, m);
+	BlasMatrix<Field> M3 (F, m, m);
+	MatrixBlackbox<Field, BlasMatrix<Field> > A1 (F, n, m);
+    typename Field::RandIter gen(F);
+    
+	RandomDenseStream<Field, typename BlasMatrix<Field>::Row> stream1 (F, gen, m);
+
+	typename BlasMatrix<Field>::RowIterator i;
+
+	for (i = M1.rowBegin (); i != M1.rowEnd (); ++i)
+		stream1 >> *i;
+
+	for (i = M2.rowBegin (); i != M2.rowEnd (); ++i)
+		stream1 >> *i;
+
+	for (i = M3.rowBegin (); i != M3.rowEnd (); ++i)
+		stream1 >> *i;
+
+	for (i = A1.rep ().rowBegin (); i != A1.rep ().rowEnd (); ++i)
+		stream1 >> *i;
+
+	if (!testMatrixDomain (F, gen, "dense", M1, M2, M3, A1, iterations,
+			       typename MatrixTraits<BlasMatrix<Field> >::MatrixCategory ()))
+		pass = false;
+	Diagonal<Field> A1b (F, n, true); // random, nonsingular
+	if (!testMatrixDomain (F, gen, "blackbox", M1, M2, M3, A1b, iterations,
+			       typename MatrixTraits<Diagonal<Field> >::MatrixCategory ()))
+		pass = false;
+
+	SparseMatrix<Field> M4 (F,n, m);
+	SparseMatrix<Field> M5 (F,n, m);
+	SparseMatrix<Field> M6 (F,m, m);
+	MatrixBlackbox<Field, SparseMatrix<Field> > A2 (F, n, m);
+
+	RandomSparseStream<Field, typename SparseMatrix<Field>::Row> stream2 (F, gen, (double) k / (double) n, m);
+
+	typename SparseMatrix<Field>::RowIterator i2;
+
+	for (i2 = M4.rowBegin (); i2 != M4.rowEnd (); ++i2)
+		stream2 >> *i2;
+
+	for (i2 = M5.rowBegin (); i2 != M5.rowEnd (); ++i2)
+		stream2 >> *i2;
+
+	for (i2 = M6.rowBegin (); i2 != M6.rowEnd (); ++i2)
+		stream2 >> *i2;
+
+	for (i2 = A2.rep ().rowBegin (); i2 != A2.rep ().rowEnd (); ++i2)
+		stream2 >> *i2;
+
+	if (!testMatrixDomain (F, gen, "sparse row-wise", M4, M5, M6, A2, iterations,
+			       typename MatrixTraits<SparseMatrix<Field> >::MatrixCategory ()))
+		pass = false;
+
+	TransposeMatrix<SparseMatrix<Field> > M7 (M4);
+	TransposeMatrix<SparseMatrix<Field> > M8 (M5);
+	TransposeMatrix<SparseMatrix<Field> > M9 (M6);
+
+	if (!testMatrixDomain (F, gen, "sparse column-wise", M7, M8, M9, A2, iterations,
+			       typename MatrixTraits<TransposeMatrix<SparseMatrix<Field> > >::MatrixCategory ()))
+		pass = false;
+
+#endif
+
+	return pass ;
+}
+#endif
+
+int main (int argc, char **argv)
+{
+	bool pass = true;
+
+	static size_t n = 6;
+	static size_t m = n;
+	static size_t k = 2;
+	static integer q = 65521U;
+	//static integer q2 =  FieldTraits<Givaro::ModularBalanced<int32_t> >::maxModulus() ;
+	//Givaro::prevprime(q2,q2);
+	static unsigned int iterations = 1;
+
+	static Argument args[] = {
+		{ 'n', "-n N", "Set row of test matrices to N.", TYPE_INT,     &n },
+		{ 'm', "-m M", "Set column of test vectors to M.", TYPE_INT,     &m },
+		{ 'k', "-k K", "K nonzero elements per row/column in sparse matrices.", TYPE_INT,     &k },
+		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1] for uint32_t modulus.", TYPE_INTEGER, &q },
+		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
+		END_OF_ARGUMENTS
+	};
+
+	parseArguments (argc, argv, args);
+	if (k >= m) k = m/2+1 ;
+
+
+	typedef Givaro::Modular<uint32_t>   Field;
+	Field F1 (q); Field::RandIter gen(F1);
+
+	//Givaro::ModularBalanced<int32_t>         F2 (q2);
+	//Givaro::Modular<uint32_t>    F3(q);
+	//if (q2 < q/2)
+	//	std::cerr <<"...étrange..." << std::endl;
+
+	commentator().start("Plain matrix domain test suite", "PlainDomain");
+
+	commentator().setBriefReportParameters (Commentator::OUTPUT_CONSOLE, false, false, false);
+
+	LinBox::PlainDomain<Field> PD(F1);
+    LinBox::PlainDomain<Field>::RandIter Pgen(PD);
+	pass &= testMatrixDomain(PD, n);
+// 	pass &= launchTestMatrixDomain(F1, gen,m,n,k);
+// 	pass &= launchTestMatrixDomain(PD, Pgen,m,n,k);
+	//pass &= launchTestMatrixDomain(PD, gen,m,n,k);
+	//pass &= launchTestMatrixDomain(F2,m,n,k,iterations);
+	//pass &= launchTestMatrixDomain(F3,m,n,k,iterations);
+
+	commentator().stop (MSG_STATUS (pass), "Plain matrix domain test suite");
+	return pass ? 0 : -1;
+}
+
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-poly-det.C b/tests/test-poly-det.C
new file mode 100644
index 0000000..52c15a9
--- /dev/null
+++ b/tests/test-poly-det.C
@@ -0,0 +1,117 @@
+
+#include "linbox/linbox-config.h"
+
+#include <omp.h>
+
+#define __LINBOX_USE_OPENMP 1
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+
+#include "linbox/algorithms/poly-interpolation.h"
+#include "linbox/algorithms/poly-det.h"
+
+#include <givaro/givpoly1.h>
+#include <givaro/modular.h>
+
+using namespace LinBox;
+
+typedef Givaro::Modular<double> Field;
+typedef typename Field::Element FieldElt;
+typedef Givaro::Poly1Dom<Field,Givaro::Dense> PolyDom;
+typedef GivaroPoly<PolyDom> Ring;
+typedef typename Ring::Element RingElt;
+typedef MatrixDomain<PolyDom> PolyMatDom;
+typedef PolyMatDom::OwnMatrix PolyMat;
+
+
+
+int main(int argc, char** argv)
+{
+	static Argument args[] = {
+		END_OF_ARGUMENTS
+	};
+	parseArguments (argc, argv, args);
+
+
+	bool pass=true;
+
+	std::vector<integer> x,y;
+	x.push_back(1);
+	x.push_back(2);
+	x.push_back(3);
+	x.push_back(4);
+	x.push_back(5);
+	y.push_back(0);
+	y.push_back(2);
+	
+	int q=101;
+	RingElt P1,P2,P4;
+	Field F(q);
+	PolyDom PD(F,"x");
+	Ring R(PD);
+	R.init(P1,x);
+	R.init(P4,y);
+
+
+	std::vector<FieldElt> vals,pts;
+	pts.push_back(1);
+	pts.push_back(2);
+	pts.push_back(3);
+	pts.push_back(4);
+	pts.push_back(5);
+	pts.push_back(6);
+	pts.push_back(7);
+	pts.push_back(8);
+
+
+	FieldElt d;
+	PolyInterpolation<Field,PolyDom> PO(pts,F,PD);
+	PO.evaluate(vals,P1,PD,F);
+	for (size_t i=0;i<vals.size();++i) {
+		PD.eval(d,P1,pts[i]);
+		pass=pass&&F.areEqual(d,vals[i]);
+	}
+	PO.interpolate(P2,pts,vals,PD,F);
+
+	int n=3,m=3;
+	typename MatrixDomain<PolyDom>::OwnMatrix A(PD,m,n);
+	for (int i=0;i<m;++i) {
+		for (int j=0;j<n;++j) {
+			if (i==j) {
+				A.setEntry(i,j,P4);
+			} else {
+				A.setEntry(i,j,R.zero);
+			}
+		}
+	}
+	A.setEntry(0,1,P4);
+
+
+	//A.setEntry(0,0,P1);
+	for (int i=0;i<m;++i) {
+		for (int j=0;j<n;++j) {
+			PolyDom::Element tempP;
+			A.getEntry(tempP,i,j);
+			PD.write(std::cout,tempP);
+			std::cout << " ";
+		}
+		std::cout << std::endl;
+	}
+	PolyDom::Element P3;
+	computePolyDetExtension(P3,F,A);
+	R.write(std::cout,P3);
+	std::cout << std::endl;
+
+
+
+
+	R.write(std::cout,P1);
+	std::cout << std::endl;
+	R.write(std::cout,P2);
+	std::cout << std::endl;
+
+	return pass?0:-1;
+}
+
diff --git a/tests/test-qlup.C b/tests/test-qlup.C
old mode 100644
new mode 100755
index 35b16c2..42e9ac8
--- a/tests/test-qlup.C
+++ b/tests/test-qlup.C
@@ -1,9 +1,9 @@
 /* tests/test-qlup.C
  * Copyright (C) The LinBox group
  *
- * Time-stamp: <22 Jun 10 15:59:56 Jean-Guillaume.Dumas at imag.fr>
+ * Time-stamp: <29 Oct 15 19:13:28 Jean-Guillaume.Dumas at imag.fr>
  * -----------------------------------------------------
-  *
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
  *
@@ -36,19 +36,16 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
+
 #include <cstdio>
 
-#include "linbox/vector/sparse.h"
+#include <linbox/matrix/sparse-matrix.h>
 #include "linbox/algorithms/gauss.h"
 #include "linbox/algorithms/gauss-gf2.h"
 #include "linbox/blackbox/permutation.h"
 #include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/PID-integer.h"
-#include "linbox/field/givaro.h"
+#include <givaro/modular.h>
 #include "linbox/blackbox/diagonal.h"
-#include "linbox/blackbox/sparse.h"
 #include "linbox/blackbox/scalar-matrix.h"
 #include "linbox/blackbox/direct-sum.h"
 #include "linbox/solutions/rank.h"
@@ -69,9 +66,9 @@ bool testQLUP(const Field &F, size_t n, unsigned int iterations, int rseed, doub
 
 	commentator().start ("Testing Sparse elimination qlup", "testQLUP", iterations);
 
-	unsigned long Ni = n;
-	unsigned long Nj = n;
-        integer card; F.cardinality(card);
+	size_t Ni = n;
+	size_t Nj = n;
+	integer card; F.cardinality(card);
 	typename Field::RandIter generator (F,card,rseed);
 	RandStream stream (F, generator, sparsity, n, n);
 
@@ -86,12 +83,13 @@ bool testQLUP(const Field &F, size_t n, unsigned int iterations, int rseed, doub
 		std::ostream & report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
 
 		F.write( report ) << endl;
-		A.write( report,FORMAT_MAPLE ) << endl;
+		A.write( report,Tag::FileFormat::Maple ) << endl;
 
-		std::vector<typename Field::Element> u(Nj), v(Ni), w1(Nj), w2(Ni), w3(Ni), w(Ni);
-		for(typename std::vector<typename Field::Element>::iterator it=u.begin();it!=u.end();++it)
+		DenseVector<Field> u(F,Nj), v(F,Ni), w1(F,Nj), w2(F,Ni), w3(F,Ni), w(F,Ni);
+		for(auto it=u.begin();it!=u.end();++it)
 			generator.random (*it);
 
+
 		A.apply(v,u);
 
 
@@ -112,8 +110,8 @@ bool testQLUP(const Field &F, size_t n, unsigned int iterations, int rseed, doub
 		Q.apply(w, L.apply(w3, A.apply(w2, P.apply(w1,u) ) ) );
 
 		bool error = false;
-		typename std::vector<typename Field::Element>::const_iterator itv=v.begin();
-		typename std::vector<typename Field::Element>::const_iterator itw=w.begin();
+		auto itv=v.begin();
+		auto itw=w.begin();
 		for( ; itw!=w.end();++itw,++itv) {
 			if (! F.areEqual(*itw,*itv) ) {
 				error = true;
@@ -124,27 +122,27 @@ bool testQLUP(const Field &F, size_t n, unsigned int iterations, int rseed, doub
 			res = false;
 
 			report << "ERROR : matrix(" << u.size() << ",1,[";
-			for(typename std::vector<typename Field::Element>::const_iterator itu=u.begin(); itu!=u.end();++itu)
+			for(auto itu=u.begin(); itu!=u.end();++itu)
 				report << *itu << ',';
 			report << "]);\n[";
-			for(typename std::vector<typename Field::Element>::const_iterator itv2=v.begin(); itv2!=v.end();++itv2)
+			for(auto itv2=v.begin(); itv2!=v.end();++itv2)
 				report << *itv2 << ' ';
 			report << "]  !=  [";
-			for(typename std::vector<typename Field::Element>::const_iterator itw2=w.begin(); itw2!=w.end();++itw2)
+			for(auto itw2=w.begin(); itw2!=w.end();++itw2)
 				report << *itw2 << ' ';
 			report << "]" << std::endl;
 
 
 			report << "w1: [";
-			for(typename std::vector<typename Field::Element>::const_iterator itw2=w1.begin(); itw2!=w1.end();++itw2)
+			for(auto itw2=w1.begin(); itw2!=w1.end();++itw2)
 				report << *itw2 << ' ';
 			report << "]" << std::endl;
 			report << "w2: [";
-			for(typename std::vector<typename Field::Element>::const_iterator itw2=w2.begin(); itw2!=w2.end();++itw2)
+			for(auto itw2=w2.begin(); itw2!=w2.end();++itw2)
 				report << *itw2 << ' ';
 			report << "]" << std::endl;
 			report << "w3: [";
-			for(typename std::vector<typename Field::Element>::const_iterator itw2=w3.begin(); itw2!=w3.end();++itw2)
+			for(auto itw2=w3.begin(); itw2!=w3.end();++itw2)
 				report << *itw2 << ' ';
 			report << "]" << std::endl;
 		}
@@ -171,13 +169,13 @@ bool testQLUPsolve(const Field &F, size_t n, unsigned int iterations, int rseed,
 
 	commentator().start ("Testing Sparse elimination qlup solve", "testQLUPsolve", iterations);
 
-	unsigned long Ni = n;
-	unsigned long Nj = n;
-        integer card; F.cardinality(card);
+	size_t Ni = n;
+	size_t Nj = n;
+	integer card; F.cardinality(card);
 	typename Field::RandIter generator (F,card,rseed);
 	RandStream stream (F, generator, sparsity, n, n);
 
-        GF2 F2;
+	GF2 F2;
 	GF2::RandIter bitgenerator(F2,2,rseed);
 	// GF2::Element randomsolve;
 
@@ -190,10 +188,10 @@ bool testQLUPsolve(const Field &F, size_t n, unsigned int iterations, int rseed,
 		std::ostream & report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
 
 		F.write( report ) << endl;
-		A.write( report, FORMAT_MAPLE ) << endl;
+		A.write( report, Tag::FileFormat::Maple ) << endl;
 
-		std::vector<typename Field::Element> u(Nj), v(Ni), x(Nj), y(Ni);
-		for(typename std::vector<typename Field::Element>::iterator it=u.begin();it!=u.end();++it)
+		DenseVector<Field> u(F,Nj), v(F,Ni), x(F,Nj), y(F,Ni);
+		for(auto it=u.begin();it!=u.end();++it)
 			generator.random (*it);
 
 		A.apply(v,u);
@@ -215,20 +213,20 @@ bool testQLUPsolve(const Field &F, size_t n, unsigned int iterations, int rseed,
 
 		if (! VD.areEqual(v,y)) {
 			res=false;
-                        A.write( report, FORMAT_MAPLE ) << endl;
+			A.write( report, Tag::FileFormat::Maple ) << endl;
 
 			report << "ERROR v: matrix(" << v.size() << ",1,[";
-			for(typename std::vector<typename Field::Element>::const_iterator itu=v.begin(); itu!=v.end();++itu)
+			for(auto itu=v.begin(); itu!=v.end();++itu)
 				report << *itu << ',';
 			report << "]);\n[";
 			report << "ERROR y: matrix(" << y.size() << ",1,[";
-			for(typename std::vector<typename Field::Element>::const_iterator itu=y.begin(); itu!=y.end();++itu)
+			for(auto itu=y.begin(); itu!=y.end();++itu)
 				report << *itu << ',';
 			report << "]);\n[";
-			for(typename std::vector<typename Field::Element>::const_iterator itv=x.begin(); itv!=x.end();++itv)
+			for(auto itv=x.begin(); itv!=x.end();++itv)
 				report << *itv << ' ';
 			report << "]  !=  [";
-			for(typename std::vector<typename Field::Element>::const_iterator itw=y.begin(); itw!=y.end();++itw)
+			for(auto itw=y.begin(); itw!=y.end();++itw)
 				report << *itw << ' ';
 			report << "]" << std::endl;
 
@@ -256,9 +254,9 @@ bool testQLUPnullspace(const Field &F, size_t n, unsigned int iterations, int rs
 
 	commentator().start ("Testing Sparse elimination qlup nullspacebasis", "testQLUPnullspace", iterations);
 
-	unsigned long Ni = n;
-	unsigned long Nj = n;
-        integer card; F.cardinality(card);
+	size_t Ni = n;
+	size_t Nj = n;
+	integer card; F.cardinality(card);
 	typename Field::RandIter generator (F,card,rseed);
 	RandStream stream (F, generator, sparsity, n, n, rseed);
 
@@ -271,7 +269,7 @@ bool testQLUPnullspace(const Field &F, size_t n, unsigned int iterations, int rs
 		std::ostream & report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
 
 		F.write( report ) << endl;
-		A.write( report, FORMAT_MAPLE ) << endl;
+		A.write( report, Tag::FileFormat::Maple ) << endl;
 
 
 		Method::SparseElimination SE;
@@ -279,37 +277,37 @@ bool testQLUPnullspace(const Field &F, size_t n, unsigned int iterations, int rs
 		GaussDomain<Field> GD ( F );
 
 		Blackbox CopyA ( A );
-                Blackbox X(F, A.coldim(), A.coldim() );
+		Blackbox X(F, A.coldim(), A.coldim() );
 
 		GD.nullspacebasisin(X, CopyA );
 
-                unsigned long nullity = X.coldim();
+		size_t nullity = X.coldim();
 
-                std::vector<typename Field::Element> u(nullity);
-                for(typename std::vector<typename Field::Element>::iterator it=u.begin();it!=u.end();++it)
+		DenseVector<Field> u(F,nullity);
+		for(auto it=u.begin();it!=u.end();++it)
 			generator.random (*it);
-                std::vector<typename Field::Element> v(Nj);
-                X.apply(v,u);
-                report << "Random combination of the rows of the NullSpace basis" << std::endl;
+		DenseVector<Field> v(F,Nj);
+		X.apply(v,u);
+		report << "Random combination of the rows of the NullSpace basis" << std::endl;
 
-		std::vector<typename Field::Element> w(Ni);
-                A.apply(w, v);
+		DenseVector<Field> w(F,Ni);
+		A.apply(w, v);
 
 		VectorDomain<Field> VD(F);
 
 		if (! VD.isZero(w)) {
 			res=false;
-                        A.write( report, FORMAT_MAPLE ) << endl;
+			A.write( report, Tag::FileFormat::Maple ) << endl;
 
 			report << "ERROR u: matrix(" << u.size() << ",1,[";
-			for(typename std::vector<typename Field::Element>::const_iterator itu=u.begin(); itu!=u.end();++itu)
+			for(auto itu=u.begin(); itu!=u.end();++itu)
 				report << *itu << ',';
 			report << "]);\n[";
 			report << "ERROR v: matrix(" << v.size() << ",1,[";
-			for(typename std::vector<typename Field::Element>::const_iterator itu=v.begin(); itu!=v.end();++itu)
+			for(auto itu=v.begin(); itu!=v.end();++itu)
 				report << *itu << ',';
 			report << "]);\n[";
-			for(typename std::vector<typename Field::Element>::const_iterator itv=w.begin(); itv!=w.end();++itv)
+			for(auto itv=w.begin(); itv!=w.end();++itv)
 				report << *itv << ' ';
 			report << "]  !=  0" << std::endl;
 
@@ -324,108 +322,114 @@ bool testQLUPnullspace(const Field &F, size_t n, unsigned int iterations, int rs
 	return res;
 }
 
+#define STOR_T SparseMatrixFormat::SparseSeq
+// #define STOR_T Vector<Field>::SparseSeq
+// #define STOR_T Sparse_Vector<Field::Element>
 int main (int argc, char **argv)
 {
 
 	commentator().setMaxDepth (-1);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-// 	commentator().setMaxDetailLevel( 100000 );
-// 	commentator().setMaxDepth( 100000 );
+	// 	commentator().setMaxDetailLevel( 100000 );
+	// 	commentator().setMaxDepth( 100000 );
 
 	bool pass = true;
 
 	static size_t n = 80;
 	static integer q = 65519U;
-        static integer bigQ("1234567890123456789012345678901234568123");
+	static integer bigQ("1234567890123456789012345678901234568123");
 	//static integer q = 1000003U;
-	static int iterations = 2;
-        static double sparsity = 0.05;
-        static int rseed = (unsigned)time(NULL);
+	static unsigned int iterations = 2;
+	static double sparsity = 0.05;
+	static int rseed = (int)time(NULL);
 
 	static Argument args[] = {
 		{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT,     &n },
 		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
 		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
-                { 's', "-s S", "Sparse matrices with density S.", TYPE_DOUBLE,     &sparsity },
-                { 'r', "-r R", "Random generator seed.", TYPE_INT,     &rseed },
+		{ 's', "-s S", "Sparse matrices with density S.", TYPE_DOUBLE,     &sparsity },
+		{ 'r', "-r R", "Random generator seed.", TYPE_INT,     &rseed },
 		END_OF_ARGUMENTS
 	};
 
 	parseArguments (argc, argv, args);
-	srand (rseed);
+	srand ((unsigned int)rseed);
 
 	commentator().start("QLUP  test suite", "qlup");
-        commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
-            << "Seed: " << rseed << endl;
-
-        {
-            commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
-                << "over Modular<uint32_t>" << endl;
-            typedef Modular<uint32_t> Field;
-            Field F (q);
-            typedef SparseMatrix<Field, Sparse_Vector<Field::Element> > Blackbox;
-            typedef RandomSparseStream<Field, Sparse_Vector<Field::Element> > RandStream;
-            if (!testQLUP<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
-		    pass = false;
-            if (!testQLUPsolve<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
-		    pass = false;
-            if (!testQLUPnullspace<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
-		    pass = false;
-        }
-
-        {
-            commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
-                << "over Modular<double>" << endl;
-            typedef Modular<double> Field;
-            Field F (q);
-            typedef SparseMatrix<Field, Sparse_Vector<Field::Element> > Blackbox;
-            typedef RandomSparseStream<Field, Sparse_Vector<Field::Element> > RandStream;
-            if (!testQLUP<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
-		    pass = false;
-            if (!testQLUPsolve<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
-		    pass = false;
-            if (!testQLUPnullspace<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
-		    pass = false;
-        }
-
-        {
-
-            commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
-                << "over GivaroZpz<Integer>" << endl;
-            typedef GivaroZpz<Integer> Field;
-            Field F (bigQ);
-            typedef SparseMatrix<Field, Sparse_Vector<Field::Element> > Blackbox;
-            typedef RandomSparseStream<Field, Sparse_Vector<Field::Element> > RandStream;
-            if (!testQLUP<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
-		    pass = false;
-            if (!testQLUPsolve<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
-		    pass = false;
-            if (!testQLUPnullspace<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
-		    pass = false;
-        }
-
-        {
-            commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
-                << "specialized over GF2>" << endl;
-            typedef GF2 Field;
-            Field F2;
-            typedef LinBox::GaussDomain<LinBox::GF2>::Matrix Blackbox;
-            typedef RandomSparseStreamGF2<Blackbox::Row_t> RandStream;
-            if (!testQLUP<Field, Blackbox, RandStream> (F2, n, iterations, rseed, sparsity))
-		    pass = false;
-            if (!testQLUPsolve<Field, Blackbox, RandStream> (F2, n, iterations, rseed, sparsity))
-		    pass = false;
-        }
+	commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
+	<< "Seed: " << rseed << endl;
+
+	{
+		commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
+		<< "over Givaro::Modular<uint32_t,uint64_t>" << endl;
+		typedef Givaro::Modular<uint32_t,uint64_t> Field;
+		Field F (q);
+		typedef SparseMatrix<Field, STOR_T > Blackbox;
+		typedef RandomSparseStream<Field, Blackbox::Row   > RandStream;
+		if (!testQLUP<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
+			pass = false;
+		if (!testQLUPsolve<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
+			pass = false;
+		if (!testQLUPnullspace<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
+			pass = false;
+	}
+
+	{
+		commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
+		<< "over Givaro::Modular<double>" << endl;
+		typedef Givaro::Modular<double> Field;
+		Field F (q);
+		typedef SparseMatrix<Field, STOR_T > Blackbox;
+		typedef RandomSparseStream<Field, Blackbox::Row   > RandStream;
+
+		if (!testQLUP<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
+			pass = false;
+		if (!testQLUPsolve<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
+			pass = false;
+		if (!testQLUPnullspace<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
+			pass = false;
+	}
+
+// 	{
+
+// 		commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
+// 		<< "over Givaro::Modular<Integer>" << endl;
+// 		typedef Givaro::Modular<Integer> Field;
+// 		Field F (bigQ);
+// 		typedef SparseMatrix<Field, STOR_T > Blackbox;
+// 		typedef RandomSparseStream<Field, Blackbox::Row   > RandStream;
+
+// 		if (!testQLUP<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
+// 			pass = false;
+// 		if (!testQLUPsolve<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
+// 			pass = false;
+// 		if (!testQLUPnullspace<Field, Blackbox, RandStream> (F, n, iterations, rseed, sparsity))
+// 			pass = false;
+// 	}
+
+#if 1
+	{
+		commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
+		<< "specialized over GF2>" << endl;
+		typedef GF2 Field;
+		Field F2;
+		typedef LinBox::GaussDomain<LinBox::GF2>::Matrix Blackbox;
+		typedef RandomSparseStreamGF2<Blackbox::Row_t> RandStream;
+		if (!testQLUP<Field, Blackbox, RandStream> (F2, n, iterations, rseed, sparsity))
+			pass = false;
+		if (!testQLUPsolve<Field, Blackbox, RandStream> (F2, n, iterations, rseed, sparsity))
+			pass = false;
+	}
+#endif
 
 	commentator().stop(MSG_STATUS (pass),"QLUP test suite");
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-quad-matrix.C b/tests/test-quad-matrix.C
new file mode 100644
index 0000000..4028306
--- /dev/null
+++ b/tests/test-quad-matrix.C
@@ -0,0 +1,139 @@
+/* Copyright (C) LinBox
+ *
+ * using generic testBlackbox  -bds
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file  tests/test-quad-matrix.C
+ * @ingroup tests
+ * @brief no doc.
+ * @test no doc.
+ */
+
+
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+#include <set>
+
+#include "linbox/ring/modular.h"
+#include "linbox/blackbox/quad-matrix.h"
+
+#include "test-blackbox.h"
+
+using namespace LinBox;
+
+int main (int argc, char **argv)
+{
+	// ofstream report;
+
+	bool pass = true;
+
+	static size_t n = 100000;
+	static integer q = 101;
+	static int iterations = 1;
+
+	static Argument args[] = {
+		{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT,     &n },
+		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
+		END_OF_ARGUMENTS
+	};
+
+	parseArguments (argc, argv, args);
+
+	srand ((unsigned int)time (NULL));
+
+	typedef Givaro::Modular<uint32_t> Field;
+	typedef ZOQuad <Field> BlackBox;
+
+	Field F (q);
+	Field::Element d;
+	F.assign(d, F.one);
+
+       	//ScalarMatrix<Field> A (F, n, d); // a small identity.
+        //BlackBox AA(A);
+	//pass = pass && testBlackbox(AA);
+
+	size_t *rows, *cols, i;
+	const size_t npr = n / 10000;
+	rows = new size_t[npr * n];
+	cols = new size_t[npr * n];
+
+	/*
+	// "arrow" matrix
+	for(i = 0; i < n; i++) { rows[i] = 0; cols[i] = i; }
+	for(i = 0; i < n - 1; i++) { rows[n+2*i] = i + 1; cols[n+2*i] = 0; rows[n+2*i+1] = i + 1; cols[n+2*i+1] = i + 1; }
+	ZeroOne<Field> B(F, rows, cols, n, n, 3 * n - 2);
+	*/
+
+	// random 3 per row matrix
+	for(i = 0; i < n; i++)
+		{
+			set<size_t> a;
+			while( a.size() < npr )
+				a.insert((size_t)rand()%n);
+			size_t j = 0;
+			for(set<size_t>::iterator iter = a.begin(); j < npr; ++j, ++iter)
+				{
+					rows[npr*i+j] = i;
+					cols[npr*i+j] = *iter;
+					//std::cout << rows[npr*i+j] << ", ";
+				}
+			//std::cout << std::endl;
+		}
+	ZeroOne<Field> B(F, rows, cols, n, n, npr * n );
+
+	/*
+	ZeroOne<Field> B(F);
+	//ifstream mat_in("data/m133.b3.200200x200200.sms");
+	//ifstream mat_in("data/n4c6.b9.186558x198895.sms");
+	//ifstream mat_in("data/small21x21.sms");
+	//ifstream mat_in("data/iso333");
+	ifstream mat_in("../examples/iso334");
+	B.read(mat_in);
+	*/
+
+	//std::cout << " -- main: " << B.rowdim() << " " << B.coldim() << " " << B.nnz() << std::endl;
+	//std::cout << " -- main: ZOQuad matrix blackbox test suite" << std::endl;
+
+	BlackBox BB(B);
+
+	//BB.write(cout) << endl; //just writes the sizes of the strips.
+
+	std::cout << " *** Warning ***, no read-write test" << std::endl;
+	pass = pass && testBlackbox(BB, false);
+
+	return pass ? 0 : -1;
+}
+
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-randiter-nonzero.C b/tests/test-randiter-nonzero.C
index dab05f7..7c09b19 100644
--- a/tests/test-randiter-nonzero.C
+++ b/tests/test-randiter-nonzero.C
@@ -6,20 +6,20 @@
  *
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -37,15 +37,14 @@
 
 
 #include "linbox/linbox-config.h"
+#include <givaro/givranditer.h>
 
 #include <iostream>
 #include <fstream>
-#include <vector>
+
 
 #include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/randiter/modular.h"
-#include "linbox/randiter/nonzero.h"
+#include "linbox/ring/modular.h"
 
 #include "test-common.h"
 
@@ -64,7 +63,7 @@ using namespace LinBox;
  */
 
 template <class Field>
-static bool testNonzeroRandom (Field &F, int iterations)
+static bool testNonzeroRandom (Field &F, unsigned int iterations)
 {
 	int i;
 
@@ -76,10 +75,10 @@ static bool testNonzeroRandom (Field &F, int iterations)
 	typename Field::RandIter r (F);
 
 	//NonzeroRandIter <Field, typename Field::RandIter> rp (F, r);
-	NonzeroRandIter <Field> rp (F, r);
+	Givaro::GeneralRingNonZeroRandIter <Field> rp (r);
 
-	for (i = 0; i < iterations; i++) {
-		commentator().startIteration (i);
+	for (i = 0; i <(int) iterations; i++) {
+		commentator().startIteration ((unsigned int)i);
 
 		rp.random (x);
 
@@ -108,7 +107,7 @@ int main (int argc, char **argv)
 	bool pass = true;
 
 	static integer q = 101;
-	static int iterations = 1000;
+	static unsigned int iterations = 1000;
 
 	static Argument args[] = {
 		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
@@ -117,11 +116,11 @@ int main (int argc, char **argv)
 	};
 
 	parseArguments (argc, argv, args);
-	Modular<uint32_t> F (q);
+	Givaro::Modular<uint32_t> F (q);
 
 	srand ((unsigned)time (NULL));
 
-	commentator().start("Nonzero random iterator test suite", "NonzeroRandIter");
+	commentator().start("Nonzero random iterator test suite", "Givaro::GeneralRingNonZeroRandIter");
 
 	commentator().setBriefReportParameters (Commentator::OUTPUT_CONSOLE, false, false, false);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
diff --git a/tests/test-random-matrix.C b/tests/test-random-matrix.C
new file mode 100644
index 0000000..40c3eb8
--- /dev/null
+++ b/tests/test-random-matrix.C
@@ -0,0 +1,44 @@
+
+#include "linbox/linbox-config.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/solutions/rank.h"
+#include "linbox/matrix/random-matrix.h"
+
+using namespace LinBox;
+
+
+bool testPrimeField(int p, int n, int m)
+{
+	typedef Givaro::Modular<double> Field;
+	typedef MatrixDomain<Field> Domain;
+	typedef typename Domain::OwnMatrix Matrix;
+	typedef typename Field::RandIter RandIter;
+
+	Field F(p);
+	Matrix M(F,n,m);
+	RandIter RI(F);
+	RandomDenseMatrix<RandIter,Field> RDM(F,RI);
+	long unsigned r;
+
+	RDM.randomFullRank(M);
+	rank(r,M,Method::BlasElimination());
+
+	return r==(long unsigned)(n<m?n:m);
+}
+
+int main(int argc, char** argv)
+{
+	bool pass=true;
+
+	static Argument args[] = {
+		END_OF_ARGUMENTS
+	};
+	parseArguments (argc, argv, args);
+
+	pass=pass&& testPrimeField(101,10,10);
+	pass=pass&& testPrimeField(101,2,10);
+	pass=pass&& testPrimeField(101,10,2);
+	pass=pass&& testPrimeField(101,1,10);
+
+	return pass?0:-1;
+}
diff --git a/tests/test-rank-Int.C b/tests/test-rank-Int.C
new file mode 100644
index 0000000..510fe5e
--- /dev/null
+++ b/tests/test-rank-Int.C
@@ -0,0 +1,76 @@
+/* tests/test-rank-Int.c
+ * Time-stamp: <08 Aug 14 07:51:49 Jean-Guillaume.Dumas at imag.fr>
+ * -----------------------------------------------------
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+/*! @file  tests/test-rank.C
+ * @ingroup tests
+ * @brief  no doc
+ * @test no doc.
+ */
+
+#include "linbox/linbox-config.h"
+#include <givaro/modular-integer.h>
+#include "test-rank.h"
+
+int main (int argc, char **argv)
+{
+
+	bool pass = true;
+
+	static size_t n = 40;
+	static integer bigQ("12345678901234567890123456789012345678901234568119");
+	static int iterations = 1;
+        static double sparsity = 0.05;
+
+	static Argument args[] = {
+		{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT,     &n },
+		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
+		{ 's', "-s S", "Sparse matrices with density S.", TYPE_DOUBLE,     &sparsity },
+		END_OF_ARGUMENTS
+	};
+
+	parseArguments (argc, argv, args);
+
+	srand ((unsigned)time (NULL));
+	// srand48 ((unsigned)time (NULL));
+
+	commentator().start("Integer sparse matrix rank test suite", "rank");
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
+
+	// Givaro::Modular<Integer> Gq(bigQ);
+	Givaro::Modular<integer> Gq(bigQ);
+	pass = pass && testSparseRank(Gq,n,n+1,(size_t)iterations,sparsity);
+	pass = pass && testSparseRank(Gq,LINBOX_USE_BLACKBOX_THRESHOLD+n,LINBOX_USE_BLACKBOX_THRESHOLD+n-1,(size_t)iterations,sparsity);
+
+	commentator().stop("Integer sparse matrix rank TEST suite");
+	return pass ? 0 : -1;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-rank-md.C b/tests/test-rank-md.C
new file mode 100644
index 0000000..3d0f8eb
--- /dev/null
+++ b/tests/test-rank-md.C
@@ -0,0 +1,83 @@
+/* tests/test-rank-md.C
+ * Time-stamp: <08 Aug 14 07:40:04 Jean-Guillaume.Dumas at imag.fr>
+ * -----------------------------------------------------
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+/*! @file  tests/test-rank-md.C
+ * @ingroup tests
+ * @brief  no doc
+ * @test no doc.
+ */
+
+#include "linbox/linbox-config.h"
+//#include <givaro/modular.h>
+#include "linbox/ring/modular/modular-double.h"
+#include "test-rank.h"
+
+int main (int argc, char **argv)
+{
+
+//     commentator().setMaxDetailLevel( 100000 );
+//     commentator().setMaxDepth( 100000 );
+
+	bool pass = true;
+
+	static size_t n = 20;
+        //static integer q = 65519U;
+        //static integer q = 1000003U;
+        static integer q = 67108859; // = prevprime(maxCardinality())
+	static int iterations = 1;
+        static double sparsity = 0.05;
+
+	static Argument args[] = {
+		{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT,     &n },
+		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
+		{ 's', "-s S", "Sparse matrices with density S.", TYPE_DOUBLE,     &sparsity },
+		END_OF_ARGUMENTS
+	};
+
+	parseArguments (argc, argv, args);
+
+	srand ((unsigned)time (NULL));
+	// srand48 ((unsigned)time (NULL));
+
+	commentator().start("Givaro::Modular<double> sparse rank test suite", "rank");
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
+
+	Givaro::Modular<double> G (q);
+    pass = pass && testSparseRank(G,n,n+1,(size_t)iterations,sparsity);
+	// the 2nd and 3rd args are matrix size, so this parameter usage seems very odd. ? -bds
+    // pass = pass && testSparseRank(G,LINBOX_USE_BLACKBOX_THRESHOLD+n,LINBOX_USE_BLACKBOX_THRESHOLD+n-1,(size_t)iterations,sparsity);
+
+	commentator().stop("Givaro::Modular<double> sparse rank test suite");
+	return pass ? 0 : -1;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-rank-u32.C b/tests/test-rank-u32.C
new file mode 100644
index 0000000..60124b0
--- /dev/null
+++ b/tests/test-rank-u32.C
@@ -0,0 +1,80 @@
+/* tests/test-rank-u32.C
+ * Time-stamp: <08 Aug 14 07:40:22 Jean-Guillaume.Dumas at imag.fr>
+ * -----------------------------------------------------
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+/*! @file  tests/test-rank-u32.C
+ * @ingroup tests
+ * @brief  no doc
+ * @test no doc.
+ */
+
+#include "linbox/linbox-config.h"
+#include "test-rank.h"
+#include "linbox/ring/modular/modular-unsigned.h"
+
+int main (int argc, char **argv)
+{
+
+	bool pass = true;
+
+	static size_t n = 20;
+	//static integer q = 65519; problem
+	//static integer q = 1009;
+	//static integer q = 1000003;
+	static integer q = 46337;
+	static int iterations = 1;
+        static double sparsity = 0.05;
+
+	static Argument args[] = {
+		{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT,     &n },
+		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
+		{ 's', "-s S", "Sparse matrices with density S.", TYPE_DOUBLE,     &sparsity },
+		END_OF_ARGUMENTS
+	};
+
+	parseArguments (argc, argv, args);
+
+	srand ((unsigned)time (NULL));
+	// srand48 ((unsigned)time (NULL));
+
+	commentator().start("Givaro::Modular<uint32_t,uint64_t> sparse rank test suite", "rank");
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
+
+	Givaro::Modular<uint32_t,uint64_t> F (q);
+	pass = pass && testSparseRank(F,n,n+1,(size_t)iterations,sparsity);
+	pass = pass && testSparseRank(F,LINBOX_USE_BLACKBOX_THRESHOLD+n,LINBOX_USE_BLACKBOX_THRESHOLD+n-1,(size_t)iterations,sparsity);
+
+
+	commentator().stop("Givaro::Modular<uint32_t,uint64_t> sparse rank test suite");
+	return pass ? 0 : -1;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-rank.C b/tests/test-rank.C
deleted file mode 100644
index aa24470..0000000
--- a/tests/test-rank.C
+++ /dev/null
@@ -1,345 +0,0 @@
-
-
-/* tests/test-rank.C
- * Copyright (C) 2002 Bradford Hovinen
- *
- * Written by Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * -----------------------------------------------------
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-
-/*! @file  tests/test-rank.C
- * @ingroup tests
- * @brief  no doc
- * @test no doc.
- */
-
-
-
-#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <vector>
-#include <cstdio>
-
-#include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/PID-integer.h"
-#include "linbox/field/gf2.h"
-#include "linbox/field/givaro.h"
-#include "linbox/blackbox/diagonal.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/blackbox/scalar-matrix.h"
-#include "linbox/blackbox/direct-sum.h"
-#include "linbox/algorithms/gauss.h"
-#include "linbox/algorithms/gauss-gf2.h"
-#include "linbox/solutions/rank.h"
-
-#include "test-common.h"
-
-using namespace LinBox;
-
-// tests 1 and 2 were certain diagonals - now deemed unnecessary.  -bds 2005Mar15
-/* Test 3: Rank of a random sparse matrix
- *
- * Constructs a random sparse matrix and computes its rank using Gaussian
- * elimination (direct and blas) and Wiedemann's algorithm. Checks that the results match.
- */
-
-
-template <class Field>
-bool testRankMethods(const Field &F, size_t n, unsigned int iterations, double sparsity = 0.05)
-{
-	typedef SparseMatrix<Field,typename Vector<Field>::SparseSeq> Blackbox;
-
-	commentator().start ("Testing elimination-based and blackbox rank", "testRankMethods", iterations);
-
-	bool ret = true;
-	unsigned int i;
-
-	unsigned long rank_blackbox, rank_elimination, rank_hybrid;
-	//unsigned long rank_Wiedemann, rank_elimination, rank_blas_elimination;
-
-	typename Field::RandIter ri (F);
-
-	for (i = 0; i < iterations; ++i) {
-		commentator().startIteration (i);
-
-		RandomSparseStream<Field, typename Vector<Field>::SparseSeq> stream (F, ri, sparsity, n, n);
-		Blackbox A (F, stream);
-
-		F.write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)) << endl;
-		A.write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION),FORMAT_MAPLE ) << endl;
-
-		LinBox::rank (rank_blackbox, A, Method::Blackbox ());
-			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-				<< "blackbox rank " << rank_blackbox << endl;
-		LinBox::rank (rank_elimination, A, Method::Elimination());
-		if (rank_blackbox != rank_elimination) {
-			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-				<< "ERROR: blackbox rank != elimination rank " << rank_elimination << endl;
-			ret = false;
-		}
-		LinBox::rank (rank_hybrid, A, Method::Hybrid());
-		if (rank_blackbox != rank_hybrid) {
-			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-				<< "ERROR: blackbox rank != hybrid rank " << rank_hybrid << endl;
-			ret = false;
-		}
-
-#if 0 /*  not working */
-		rank (rank_Wiedemann, A, Method::Wiedemann ());
-		//rank (rank_elimination, B, Method::SparseElimination());
-		rank_elimination = rank_Wiedemann;
-		rank (rank_blas_elimination, A, Method::BlasElimination ());
-
-		commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
-			<< "Rank computed by Wiedemann: " << rank_Wiedemann << endl
-			<< "Rank computed by sparse elimination: " << rank_elimination << endl
-			<< "Rank computed by blas_elimination: " << rank_blas_elimination << endl;
-
-		if (rank_Wiedemann != rank_elimination || rank_elimination != rank_blas_elimination) {
-			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-				<< "ERROR: Ranks are not equal" << endl;
-			ret = false;
-		}
-#endif
-
-		commentator().stop ("done");
-		commentator().progress ();
-	}
-
-	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testEliminationRank");
-
-	return ret;
-}
-
-bool testRankMethodsGF2(const GF2& F2, size_t n, unsigned int iterations, double sparsity = 0.05)
-{
-	typedef ZeroOne<GF2> Blackbox;
-	typedef SparseMatrix<Modular<double>,Vector<Modular<double> >::SparseSeq> MdBlackbox;
-	Modular<double> MdF2(2);
-	GF2::Element one; Modular<double>::Element mdone;
-	F2.init(one,true);
-	MdF2.init(mdone,1UL);
-
-
-	commentator().start ("Testing elimination-based and blackbox rank over GF2", "testRankMethodsGF2", iterations);
-
-	bool ret = true;
-	unsigned int i;
-
-	unsigned long rank_blackbox, rank_elimination, rank_sparselimination, rank_sparse;
-	//unsigned long rank_Wiedemann, rank_elimination, rank_blas_elimination;
-
-	GF2::RandIter ri (F2);
-
-	for (i = 0; i < iterations; ++i) {
-		commentator().startIteration (i);
-
-		Blackbox A(F2,n,n);
-		MdBlackbox B(MdF2,n,n);
-		for(size_t ii=0; ii<n;++ii) {
-			for(size_t jj=0; jj<n; ++jj) {
-				if (drand48()<sparsity) {
-					A.setEntry(ii,jj,one);
-					B.setEntry(ii,jj,mdone);
-				}
-			}
-		}
-
-		F2.write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)) << endl;
-		B.write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION),FORMAT_GUILLAUME ) << endl;
-		A.write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION),FORMAT_GUILLAUME ) << endl;
-
-
-		LinBox::rank (rank_blackbox, A, Method::Blackbox ());
-			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-				<< "blackbox rank " << rank_blackbox << endl;
-
-			LinBox::rank (rank_elimination, B, Method::BlasElimination());
-		if (rank_blackbox != rank_elimination) {
-			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-				<< "ERROR: blackbox rank != BLAS elimination rank " << rank_elimination << endl;
-			ret = false;
-		}
-
-		rankin (rank_sparselimination, A, Method::SparseElimination());
-		if (rank_blackbox != rank_sparselimination) {
-			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-				<< "ERROR: blackbox rank != sparse elimination GF2 rank " << rank_elimination << endl;
-			ret = false;
-		}
-
-
-		rankin (rank_sparse, B, Method::SparseElimination());
-
-		if (rank_sparselimination != rank_sparse) {
-			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-				<< "ERROR: rank sparse elimination GF2 != sparse rank " << rank_sparse << endl;
-			ret = false;
-		}
-
-		commentator().stop ("done");
-		commentator().progress ();
-	}
-
-	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testEliminationRank");
-
-	return ret;
-}
-/* Test 4: Rank of zero and identity matrices by Wiedemann variants
- *
- */
-
-template <class Field>
-bool testZeroAndIdentRank (const Field &F, size_t n, unsigned int iterations)
-{
-	typedef ScalarMatrix<Field> Blackbox;
-
-	commentator().start ("Testing rank of zero and Identity and half/half matrices", "testZeroAndIdentRank", iterations);
-
-	bool ret = true;
-	unsigned int i;
-
-	unsigned long r; // rank
-
-	for (i = 0; i < iterations; ++i) {
-		commentator().startIteration (i);
-
-		typename Field::Element zero, one;
-
-		F.init(zero, 0);
-		Blackbox A (F, n, zero);
-		LinBox::rank (r, A, Method::Wiedemann ());
-		if (r != 0) {
-			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-				<< "ERROR: Wiedemann Rank of 0 is not 0, but is " << r << endl;
-			ret = false;
-		}
-
-		F.init(one, 1);
-		Blackbox I (F, n, one);
-		LinBox::rank (r, I, Method::Wiedemann ());
-		if (r != n) {
-			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-				<< "ERROR: Wiedemann Rank of I is " << r << ", should be " << n << endl;
-			ret = false;
-		}
-
-		DirectSum<Blackbox> B(A, I);
-		LinBox::rank (r, B, Method::Wiedemann ());
-		if (r != n) {
-			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-				<< "ERROR: Wiedemann Rank of I+0 is " << r << ", should be " << n << endl;
-			ret = false;
-		}
-
-		LinBox::rank (r, B, Method::Wiedemann(Method::Wiedemann::SYMMETRIC));
-		if (r != n) {
-			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-				<< "ERROR: Symmetric Wiedemann Rank of I+0 is " << r << ", should be " << n << endl;
-			ret = false;
-		}
-		commentator().stop ("done");
-		commentator().progress ();
-	}
-
-	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testZeroAndIdentRank");
-
-	return ret;
-}
-
-int main (int argc, char **argv)
-{
-
-//     commentator().setMaxDetailLevel( 100000 );
-//     commentator().setMaxDepth( 100000 );
-
-	bool pass = true;
-
-	static size_t n = 40;
-	static integer q = 65519U;
-	//static integer q = 1000003U;
-	static integer bigQ("12345678901234567890123456789012345678901234568119");
-	static int iterations = 1;
-        static double sparsity = 0.05;
-
-	static Argument args[] = {
-		{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT,     &n },
-		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
-		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
-		{ 's', "-s S", "Sparse matrices with density S.", TYPE_DOUBLE,     &sparsity },
-		END_OF_ARGUMENTS
-	};
-
-	parseArguments (argc, argv, args);
-
-	srand ((unsigned)time (NULL));
-	// srand48 ((unsigned)time (NULL));
-
-	commentator().start("rank solution test suite", "rank");
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_NORMAL);
-
-	commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
-	<< "over Modular<uint32_t>" << endl;
-	Modular<uint32_t> F (q);
-	if (!testRankMethods (F, n, iterations, sparsity)) pass = false;
-	if (!testZeroAndIdentRank (F, n, 1)) pass = false;
-
-	commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
-	<< "over Modular<int>" << endl;
-	Modular<double> G (q);
-    	if (!testRankMethods (G, n, iterations, sparsity)) pass = false;
-	if (!testZeroAndIdentRank (G, n, 1)) pass = false;
-
-	commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
-	<< "over PID_integer" << endl;
-	PID_integer R;
-	if (!testRankMethods (R, n, iterations, sparsity)) pass = false;
-
-	commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
-	<< "over GivaroZpz<Integer>" << endl;
-        GivaroZpz<Integer> Gq(bigQ);
-	if (!testRankMethods (Gq, n, iterations, sparsity)) pass = false;
-	if (!testZeroAndIdentRank (Gq, n, 1)) pass = false;
-
-	commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
-	<< "over GF2" << endl;
-        GF2 F2;
-	if (!testRankMethodsGF2 (F2, n, iterations, sparsity)) pass = false;
-
-
-	commentator().stop("rank solution test suite");
-	return pass ? 0 : -1;
-}
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/tests/test-rank.h b/tests/test-rank.h
new file mode 100644
index 0000000..74def8c
--- /dev/null
+++ b/tests/test-rank.h
@@ -0,0 +1,384 @@
+/* tests/test-rank.h
+ * Time-stamp: <08 Aug 14 07:36:49 Jean-Guillaume.Dumas at imag.fr>
+ * -----------------------------------------------------
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+
+/*! @file  tests/test-rank.h
+ * @ingroup tests
+ * @brief  no doc
+ * @test 
+bool testSparseRank(const Field &F, const size_t & n, size_t m, const size_t & iterations, const double & sparsity)
+ * @test 
+bool testRankMethods(const typename BlackBox::Field & F, size_t n, size_t m, unsigned int iterations, double sparsity = 0.05)
+ * @test 
+//bool testRankMethodsGF2(const GF2& F2, size_t n, unsigned int iterations, double sparsity = 0.05)
+ * @test 
+bool testZeroAndIdentRank (const Field &F, size_t n, unsigned int iterations = 1)
+ */
+
+
+
+#include "linbox/linbox-config.h"
+
+#define LINBOX_USE_BLACKBOX_THRESHOLD 100
+#define LINBOX_COO_TRANSPOSE 100 /*  this is supposed to be triggerd half the time */
+#define LINBOX_CSR_TRANSPOSE 100 /*  this is supposed to be triggerd half the time */
+#define LINBOX_ELL_TRANSPOSE 100 /*  this is supposed to be triggerd half the time */
+#define LINBOX_ELLR_TRANSPOSE 100 /*  this is supposed to be triggerd half the time */
+
+#include <iostream>
+#include <fstream>
+#include <cstdio>
+#include <givaro/modular.h>
+
+#include "linbox/util/commentator.h"
+#include "linbox/ring/modular.h"
+#include "linbox/field/gf2.h"
+#include "linbox/blackbox/diagonal.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/blackbox/scalar-matrix.h"
+#include "linbox/blackbox/direct-sum.h"
+#include "linbox/algorithms/gauss.h"
+#include "linbox/algorithms/gauss-gf2.h"
+#include "linbox/solutions/rank.h"
+
+#include "test-common.h"
+
+using namespace LinBox;
+
+
+// tests 1 and 2 were certain diagonals - now deemed unnecessary.  -bds 2005Mar15
+
+/* Test 3: Rank of a random sparse matrix
+ *
+ * Constructs a random sparse matrix and computes its rank using Gaussian
+ * elimination (direct and blas) and Wiedemann's algorithm. Checks that the results match.
+ */
+template <class BlackBox>
+bool testRankMethods(const typename BlackBox::Field & F, size_t n, size_t m, unsigned int iterations, double sparsity = 0.05)
+{
+	typedef typename BlackBox::Field Field ;
+	commentator().start ("Testing elimination-based and blackbox rank", "testRankMethods", (unsigned int)iterations);
+
+	bool ret = true, equalRank = true;
+	unsigned int i;
+
+	unsigned long rank_blackbox, rank_elimination;
+
+	typename Field::RandIter ri (F);
+
+	for (i = 0; i < iterations; ++i) {
+		commentator().startIteration (i);
+
+		RandomSparseStream<Field, typename BlackBox::Row> stream (F, ri, sparsity, n, m);
+		BlackBox A (F, stream);
+		// std::cout << A.rowdim() << ',' << A.coldim() << std::endl;
+
+		A.write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION) << endl, Tag::FileFormat::Maple ) << endl;
+
+
+		Method::Elimination ME; // will this be sparse elim?
+		LinBox::rank (rank_elimination, A, ME);
+		commentator().report ()
+			<< endl << "elimination rank " << rank_elimination << endl;
+
+#if 1
+		Method::Blackbox MB;
+		LinBox::rank (rank_blackbox, A, MB);
+		commentator().report ()//Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< endl << "blackbox rank " << rank_blackbox << endl;
+		equalRank = equalRank and rank_blackbox == rank_elimination;
+#endif
+
+#if 0
+		Method::Hybrid MH;
+		LinBox::rank (rank_hybrid, A, MH);
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "hybrid rank " << rank_hybrid << endl;
+		equalRank = equalRank and rank_hybrid == rank_elimination;
+#endif
+#if 0
+		unsigned long rank_Wiedemann;
+		Method::Wiedemann MW;  // rank soln needs fixing for this.
+		LinBox::rank (rank_Wiedemann, A, MW);
+		commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+			<< "Wiedemann rank " << rank_Wiedemann << endl;
+		equalRank = equalRank and rank_Wiedemann == rank_elimination;
+#endif
+
+		unsigned long rank_blas_elimination ;
+		if (F.characteristic() < LinBox::BlasBound 
+				and
+			F.characteristic() == F.cardinality()
+				and
+			numeric_limits<typename Field::Element>::is_signed
+		   )
+		{
+			Method::BlasElimination MBE;
+			LinBox::rank (rank_blas_elimination, A, MBE);
+			commentator().report ()//Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)
+			<< endl << "Blas elimination rank " << rank_blas_elimination << endl;
+			equalRank = equalRank and rank_blas_elimination == rank_elimination;
+		}
+
+
+		if	( not equalRank )
+		{
+			commentator().report ()//Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+				<< "ERROR: Ranks are not equal" << endl;
+			ret = false;
+		}
+
+		commentator().stop ("done");
+		commentator().progress ();
+	}
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testEliminationRank");
+
+	return ret;
+}
+
+// this test just doesn't work/compile
+#if 0
+bool testRankMethodsGF2(const GF2& F2, size_t n, unsigned int iterations, double sparsity = 0.05)
+{
+	typedef ZeroOne<GF2> Blackbox;
+	typedef SparseMatrix<Givaro::Modular<double>,Vector<Givaro::Modular<double> >::SparseSeq> MdBlackbox;
+	Givaro::Modular<double> MdF2(2);
+	GF2::Element one; Givaro::Modular<double>::Element mdone;
+	MdF2.assign(mdone,MdF2.one);
+
+
+	commentator().start ("Testing elimination-based and blackbox rank over GF2", "testRankMethodsGF2", (unsigned int)iterations);
+
+	bool ret = true;
+	unsigned int i;
+
+	unsigned long rank_blackbox, rank_elimination, rank_sparselimination, rank_sparse;
+
+	GF2::RandIter ri (F2);
+
+	for (i = 0; i < iterations; ++i) {
+		commentator().startIteration (i);
+
+		Blackbox A(F2,n,n);
+		MdBlackbox B(MdF2,n,n);
+		for(size_t ii=0; ii<n;++ii) {
+			for(size_t jj=0; jj<n; ++jj) {
+				if (drand48()<sparsity) {
+					A.setEntry(ii,jj,F2.one);
+					B.setEntry(ii,jj,mdone);
+				}
+			}
+		}
+
+		F2.write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION)) << endl;
+		B.write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION),Tag::FileFormat::Guillaume ) << endl;
+		A.write( commentator().report (Commentator::LEVEL_NORMAL, INTERNAL_DESCRIPTION),Tag::FileFormat::Guillaume ) << endl;
+
+
+		LinBox::rank (rank_blackbox, A, Method::Blackbox ());
+			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+				<< "blackbox rank " << rank_blackbox << endl;
+
+			LinBox::rank (rank_elimination, B, Method::BlasElimination());
+		if (rank_blackbox != rank_elimination) {
+			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+				<< "ERROR: blackbox rank != BLAS elimination rank " << rank_elimination << endl;
+			ret = false;
+		}
+
+		rankin (rank_sparselimination, A, Method::SparseElimination());
+		if (rank_blackbox != rank_sparselimination) {
+			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+				<< "ERROR: blackbox rank != sparse elimination GF2 rank " << rank_elimination << endl;
+			ret = false;
+		}
+
+
+		rankin (rank_sparse, B, Method::SparseElimination());
+
+		if (rank_sparselimination != rank_sparse) {
+			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+				<< "ERROR: rank sparse elimination GF2 != sparse rank " << rank_sparse << endl;
+			ret = false;
+		}
+
+		commentator().stop ("done");
+		commentator().progress ();
+	}
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testEliminationRank");
+
+	return ret;
+}
+#endif
+
+/* Test 4: Rank of zero and identity matrices by Wiedemann variants
+ *
+ */
+template <class Field>
+bool testZeroAndIdentRank (const Field &F, size_t n, unsigned int iterations = 1)
+{
+	typedef ScalarMatrix<Field> Blackbox;
+
+	commentator().start ("Testing rank of zero and Identity and half/half matrices", "testZeroAndIdentRank", (unsigned int)iterations);
+
+	bool ret = true;
+	unsigned int i;
+
+	unsigned long r; // rank
+
+	for (i = 0; i < iterations; ++i) {
+		commentator().startIteration (i);
+
+
+		Blackbox A (F, n, n, F.zero);
+		Method::Wiedemann MW;
+		LinBox::rank (r, A, MW);
+		if (r != 0) {
+			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+				<< "ERROR: Wiedemann Rank of 0 is not 0, but is " << r << endl;
+			ret = false;
+		}
+
+		Blackbox I (F, n, n, F.one);
+//		LinBox::rank (r, I, MW);
+r = n;
+		if (r != n) {
+			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+				<< "ERROR: Wiedemann Rank of I is " << r << ", should be " << n << endl;
+			ret = false;
+		}
+
+		DirectSum<Blackbox> B(A, I);
+//		LinBox::rank (r, B, MW);
+r = n;
+		if (r != n) {
+			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+				<< "ERROR: Wiedemann Rank of I+0 is " << r << ", should be " << n << endl;
+			ret = false;
+		}
+
+		Method::Wiedemann MWS(Method::Wiedemann::SYMMETRIC);
+//		LinBox::rank (r, B, MWS);
+r = n;
+		if (r != n) {
+			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+				<< "ERROR: Symmetric Wiedemann Rank of I+0 is " << r << ", should be " << n << endl;
+			ret = false;
+		}
+		commentator().stop ("done");
+		commentator().progress ();
+	}
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testZeroAndIdentRank");
+
+	return ret;
+}
+
+// Test the rank methods on each of several storage schemes for sparse matrices.
+template <class Field>
+bool testSparseRank(const Field &F, const size_t & n, size_t m, const size_t & iterations, const double & sparsity)
+{
+	bool pass = true ;
+#if 0 //
+	{
+		commentator().report() << "SparseSeq " << endl;
+		typedef SparseMatrix<Field,SparseMatrixFormat::SparseSeq > Blackbox;
+		if (!testRankMethods<Blackbox> (F, n, m, (unsigned int)iterations, sparsity)) pass = false;
+	}
+	{
+		commentator().report() << "SparsePar " << endl;
+		typedef SparseMatrix<Field,SparseMatrixFormat::SparsePar > Blackbox;
+		if (!testRankMethods<Blackbox> (F, n, m, (unsigned int)iterations, sparsity)) pass = false;
+	}
+#endif //
+#if 0
+	{
+		commentator().report() << "SparseMap " << endl;
+		typedef SparseMatrix<Field,SparseMatrixFormat::SparseMap > Blackbox;
+		typedef Protected::SparseMatrixGeneric<Field,typename Vector<Field>::SparseMap > Blackbox;
+		if (!testRankMethods<Blackbox> (F, n, m, (unsigned int)iterations, sparsity)) pass = false;
+	}
+#endif
+#if 0 //
+	{
+		commentator().report() << "COO " << endl;
+		typedef SparseMatrix<Field,SparseMatrixFormat::COO> Blackbox;
+		if (!testRankMethods<Blackbox> (F, n, m, (unsigned int)iterations, sparsity)) pass = false;
+	}
+#endif //
+#if 1 // 
+	{
+		commentator().report() << "CSR " << endl;
+		typedef SparseMatrix<Field,SparseMatrixFormat::CSR> Blackbox; // inf loop
+		if (!testRankMethods<Blackbox> (F, n, m, (unsigned int)iterations, sparsity)) pass = false;
+	}
+#endif //
+#if 0 //
+	{
+		commentator().report() << "ELL " << endl;
+		typedef SparseMatrix<Field,SparseMatrixFormat::ELL> Blackbox;
+		if (!testRankMethods<Blackbox> (F, n, m, (unsigned int)iterations, sparsity)) pass = false;
+	}
+#endif //
+#if 0
+	{
+		commentator().report() << "ELL_R " << endl;
+		typedef SparseMatrix<Field,SparseMatrixFormat::ELL_R> Blackbox;
+		if (!testRankMethods<Blackbox> (F, n, m, (unsigned int)iterations, sparsity)) pass = false;
+	}
+#endif
+#if 0
+	{
+		commentator().report() << "HYB " << endl;
+		typedef SparseMatrix<Field,SparseMatrixFormat::HYB> Blackbox;
+		if (!testRankMethods<Blackbox> (F, n, m, (unsigned int)iterations, sparsity)) pass = false;
+	}
+#endif
+#if 0
+	{	
+		commentator().report() << "TPL " << endl;
+		typedef SparseMatrix<Field,SparseMatrixFormat::TPL> Blackbox;
+		if (!testRankMethods<Blackbox> (F, n, m, (unsigned int)iterations, sparsity)) pass = false;
+	}
+#endif
+
+
+#if 0 //
+	commentator().report() << "Scalar mats " << endl;
+	if (!testZeroAndIdentRank (F, n, 1)) pass = false;
+#endif //
+
+	return pass ;
+
+
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-rat-charpoly.C b/tests/test-rat-charpoly.C
index d4ce026..06c3b91 100644
--- a/tests/test-rat-charpoly.C
+++ b/tests/test-rat-charpoly.C
@@ -6,20 +6,20 @@
  *
  * --------------------------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -40,11 +40,11 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
+
 #include <cstdio>
 
 #include "linbox/util/commentator.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/solutions/charpoly.h"
 
 #include "test-common.h"
@@ -62,7 +62,7 @@ using namespace LinBox;
 
 static bool testDiagRatCharpoly (size_t n, int iterations)
 {
-	commentator().start ("Testing rational charpoly of diagonal matrix ", "testNonsingularRatIntSolve", iterations);
+	commentator().start ("Testing rational charpoly of diagonal matrix ", "testNonsingularRatIntSolve", (unsigned int)iterations);
 
 	bool ret = true;
 	int i;
@@ -71,7 +71,7 @@ static bool testDiagRatCharpoly (size_t n, int iterations)
 	GMPRationalField Q;
 	SparseMatrix<GMPRationalField > A(Q,n,n);
 	BlasMatrix <GMPRationalField > B(Q,n,n);
-	std::vector<GMPRationalField::Element> c;
+	BlasVector<GMPRationalField> c(Q);
 
 	for (i=0; i < iterations; i++) {
         	GMPRationalField::Element c0,cn;
@@ -79,7 +79,7 @@ static bool testDiagRatCharpoly (size_t n, int iterations)
 	        Q.init(cn,0,1);
 
 
-		commentator().startIteration (i);
+		commentator().startIteration ((unsigned int)i);
 
 		for (j=0; j < n; ++j) {
 			integer tmp_n, tmp_d;
@@ -153,11 +153,10 @@ int main (int argc, char **argv)
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-rat-minpoly.C b/tests/test-rat-minpoly.C
index e014fc9..155699d 100644
--- a/tests/test-rat-minpoly.C
+++ b/tests/test-rat-minpoly.C
@@ -6,20 +6,20 @@
  *
  * --------------------------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -35,16 +35,21 @@
  */
 
 
+#ifdef HAVE_CXX11
+#include <stdexcept>
+#include <type_traits>
+#endif
+
 
 #include "linbox/linbox-config.h"
 
 #include <iostream>
 #include <fstream>
-#include <vector>
+
 #include <cstdio>
 
 #include "linbox/util/commentator.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/solutions/charpoly.h"
 
 #include "test-common.h"
@@ -60,7 +65,7 @@ using namespace LinBox;
  * Return true on success and false on failure
  */
 
-static bool testDiagRatCharpoly (size_t n, int iterations)
+static bool testDiagRatCharpoly (size_t n, unsigned int iterations)
 {
 	commentator().start ("Testing rational charpoly of diagonal matrix ", "testNonsingularRatIntSolve", iterations);
 
@@ -71,14 +76,14 @@ static bool testDiagRatCharpoly (size_t n, int iterations)
 	GMPRationalField Q;
 	SparseMatrix<GMPRationalField > A(Q,n,n);
 	BlasMatrix <GMPRationalField > B(Q,n,n);
-	std::vector<GMPRationalField::Element> c;
+	BlasVector<GMPRationalField> c(Q);
 
-	for (i=0; i < iterations; i++) {
+	for (i=0; i < (int)iterations; i++) {
         	GMPRationalField::Element c0,cn;
 	        Q.init(c0,1,1);
 	        Q.init(cn,0,1);
 
-		commentator().startIteration (i);
+		commentator().startIteration ((unsigned int)i);
 
 		size_t k = (size_t)ceil((double)n/2);
 		for (j=0; j < k; ++j) {
@@ -135,7 +140,7 @@ int main (int argc, char **argv)
 	bool pass = true;
 
 	static size_t n = 10;
-	static int iterations = 2;
+	static unsigned int iterations = 2;
 
 	static Argument args[] = {
 		{ 'n', "-n N", "Set column dimension of test matrices to N.", TYPE_INT,     &n },
diff --git a/tests/test-rat-solve.C b/tests/test-rat-solve.C
index 1d607c1..a825dcf 100644
--- a/tests/test-rat-solve.C
+++ b/tests/test-rat-solve.C
@@ -6,20 +6,20 @@
  *
  * --------------------------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -40,11 +40,11 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
+
 #include <cstdio>
 
 #include "linbox/util/commentator.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/solutions/solve.h"
 
 #include "test-common.h"
@@ -59,7 +59,7 @@ using namespace LinBox;
  * Return true on success and false on failure
  */
 
-static bool testNonsingularRatIntSolve (size_t n, int iterations)
+static bool testNonsingularRatIntSolve (size_t n, unsigned int iterations)
 {
 	commentator().start ("Testing nonsingular solve with integer vector", "testNonsingularRatIntSolve", iterations);
 
@@ -70,12 +70,12 @@ static bool testNonsingularRatIntSolve (size_t n, int iterations)
 	GMPRationalField Q;
 	SparseMatrix<GMPRationalField > A(Q,n,n);
 
-	PID_integer Z;
-	std::vector<PID_integer::Element> b(n);
-	std::vector<GMPRationalField::Element> true_x(n),x(n);
+	Givaro::ZRing<Integer> Z;
+	BlasVector<Givaro::ZRing<Integer> > b(Z,n);
+	BlasVector<GMPRationalField> true_x(Q,n),x(Q,n);
 
-	for (i=0; i < iterations; i++) {
-		commentator().startIteration (i);
+	for (i=0; i < (int)iterations; i++) {
+		commentator().startIteration ((unsigned int)i);
 
 		for (j=0; j < n; ++j) {
 			integer tmp_n, tmp_d, tmp_b;
@@ -116,7 +116,7 @@ static bool testNonsingularRatIntSolve (size_t n, int iterations)
  * Return true on success and false on failure
  */
 
-static bool testNonsingularRatRatSolve (size_t n, int iterations)
+static bool testNonsingularRatRatSolve (size_t n, unsigned int iterations)
 {
 	commentator().start ("Testing nonsingular solve with rational vector", "testNonsingularRatRatSolve", iterations);
 
@@ -127,12 +127,12 @@ static bool testNonsingularRatRatSolve (size_t n, int iterations)
 	GMPRationalField Q;
 	SparseMatrix<GMPRationalField > A(Q,n,n);
 
-	PID_integer Z;
-	std::vector<GMPRationalField::Element> b(n);
-	std::vector<GMPRationalField::Element> true_x(n),x(n);
+	Givaro::ZRing<Integer> Z;
+	BlasVector<GMPRationalField> b(Q,n);
+	BlasVector<GMPRationalField> true_x(Q,n),x(Q,n);
 
-	for (i=0; i < iterations; i++) {
-		commentator().startIteration (i);
+	for (i=0; i < (int)iterations; i++) {
+		commentator().startIteration ((unsigned int)i);
 
 		for (j=0; j < n; ++j) {
 			integer tmp_n, tmp_d, tmp_bn, tmp_bd;
@@ -179,7 +179,7 @@ int main (int argc, char **argv)
 	bool pass = true;
 
 	static size_t n = 10;
-	static int iterations = 1;
+	static unsigned int iterations = 1;
 
 	static Argument args[] = {
 		{ 'n', "-n N", "Set column dimension of test matrices to N.", TYPE_INT,     &n },
@@ -206,11 +206,10 @@ int main (int argc, char **argv)
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-rational-matrix-factory.C b/tests/test-rational-matrix-factory.C
index 8c59a64..6e1b327 100644
--- a/tests/test-rational-matrix-factory.C
+++ b/tests/test-rational-matrix-factory.C
@@ -34,17 +34,19 @@
  */
 
 
+#include <linbox/linbox-config.h>
+
 #include <iostream>
 #include <fstream>
-#include <vector>
+
 #include <cstdio>
 
 #include "linbox/linbox-config.h"
 
 #include "linbox/util/commentator.h"
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
 #include "linbox/field/gmp-rational.h"
-#include "linbox/matrix/blas-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
 #include "linbox/blackbox/rational-matrix-factory.h"
 
 #include "test-common.h"
@@ -84,7 +86,7 @@ static bool testDiagonalMatrix (size_t n)
 		lcm(lcm_n,lcm_n,j+1);
 	}
 
-	RationalMatrixFactory<PID_integer, GMPRationalField, BlasMatrix<GMPRationalField > > FA(&A);
+	RationalMatrixFactory<Givaro::ZRing<Integer>, GMPRationalField, BlasMatrix<GMPRationalField > > FA(&A);
 
 	integer ratnorm,aprimnorm,atildenorm;
 	FA.getNorms(ratnorm,aprimnorm,atildenorm);
@@ -144,9 +146,9 @@ static bool testDiagonalMatrix (size_t n)
 		}
 	}
 
-	PID_integer Z;
-	BlasMatrix<PID_integer> Aprim(Z,n,n);
-	BlasMatrix<PID_integer> Atilde(Z,n,n);
+	Givaro::ZRing<Integer> Z;
+	BlasMatrix<Givaro::ZRing<Integer> > Aprim(Z,n,n);
+	BlasMatrix<Givaro::ZRing<Integer> > Atilde(Z,n,n);
 
 	FA.makeAprim(Aprim);
 	FA.makeAtilde(Atilde);
diff --git a/tests/test-rational-reconstruction-base.C b/tests/test-rational-reconstruction-base.C
index eab7772..ba946c3 100644
--- a/tests/test-rational-reconstruction-base.C
+++ b/tests/test-rational-reconstruction-base.C
@@ -6,20 +6,20 @@
  *
  * --------------------------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -39,15 +39,14 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
+
 #include <cstdio>
 
 #include "linbox/linbox-config.h"
 
 #include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/PID-integer.h"
-#include "linbox/field/gmp-rational.h"
+#include "linbox/ring/modular.h"
+//#include "linbox/field/gmp-rational.h"
 
 #include "linbox/algorithms/rational-cra2.h"
 #include "linbox/algorithms/varprec-cra-early-single.h"
@@ -88,7 +87,7 @@ struct ModularFraction {
 
 static bool testRandomFraction (size_t n, size_t d, int iterations)
 {
-	commentator().start ("Testing rational reconstruction on random fractions", "testRandFrac", iterations);
+	commentator().start ("Testing rational reconstruction on random fractions", "testRandFrac", (unsigned int)iterations);
 
 	bool ret = true;
 	// bool done;
@@ -98,7 +97,7 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
 	integer num,den;
 
 	for (i = 0; i < iterations; i++) {
-		commentator().startIteration (i);
+		commentator().startIteration ((unsigned int)i);
 
 		integer::nonzerorandom(num, n);
 		integer::nonzerorandom(den, d);
@@ -112,20 +111,20 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
 
 		ModularFraction iteration(num,den);
 		int bits = 26;
-		RandomPrimeIterator genprime( bits);
+		RandomPrimeIterator genprime((unsigned int) bits);
 
-		PID_integer Z;
-		ClassicRationalReconstruction<PID_integer> RRB1(Z,false,false);
-		ClassicMaxQRationalReconstruction<PID_integer> RRB2(Z,false,false);
+		Givaro::ZRing<Integer> Z;
+		ClassicRationalReconstruction<Givaro::ZRing<Integer> > RRB1(Z,false,false);
+		ClassicMaxQRationalReconstruction<Givaro::ZRing<Integer> > RRB2(Z,false,false);
 
 		integer a1_1, b1_1, a2_1, b2_1, a3_1, b3_1, a4_1, b4_1;
 		integer a1_2, b1_2, a2_2, b2_2, a3_2, b3_2, a4_2, b4_2;
 		integer a1_3, b1_3, a2_3, b2_3, a3_3, b3_3, a4_3, b4_3;
 		integer a1_4, b1_4, a2_4, b2_4, a3_4, b3_4, a4_4, b4_4;
 
-		RReconstruction<PID_integer, FastRationalReconstruction<PID_integer> > RR1_1(Z,INCREMENTAL,5);
-		RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
-		RReconstruction<PID_integer, FastRationalReconstruction<PID_integer> > > cra1_1(4UL, RR1_1);
+		RReconstruction<Givaro::ZRing<Integer>, FastRationalReconstruction<Givaro::ZRing<Integer> > > RR1_1(Z,INCREMENTAL,5);
+		RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+		RReconstruction<Givaro::ZRing<Integer>, FastRationalReconstruction<Givaro::ZRing<Integer> > > > cra1_1(4UL, RR1_1);
 		cra1_1(a1_1,b1_1,iteration,genprime);
 		if ((a1_1 != num)  || (b1_1 != den) ) {
 			ret = false;
@@ -133,9 +132,9 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
 			<< "ERROR: rational reconstruction (Wang, incremental, fast) failed" << endl;
 		}
 
-		RReconstruction<PID_integer, FastMaxQRationalReconstruction<PID_integer> > RR2_1(Z,INCREMENTAL,5);
-		RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
-		RReconstruction<PID_integer, FastMaxQRationalReconstruction<PID_integer> > > cra2_1(4UL, RR2_1);
+		RReconstruction<Givaro::ZRing<Integer>, FastMaxQRationalReconstruction<Givaro::ZRing<Integer> > > RR2_1(Z,INCREMENTAL,5);
+		RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+		RReconstruction<Givaro::ZRing<Integer>, FastMaxQRationalReconstruction<Givaro::ZRing<Integer> > > > cra2_1(4UL, RR2_1);
 		cra2_1(a2_1,b2_1,iteration,genprime);
 		if ((a2_1 != num)  || (b2_1 != den) ) {
 			ret = false;
@@ -143,9 +142,9 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
 			<< "ERROR: rational reconstruction (MaxQ, incremental, fast) failed" << endl;
 		}
 
-		RReconstruction<PID_integer, ClassicRationalReconstruction<PID_integer> > RR3_1(RRB1,INCREMENTAL,5);
-		RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
-		RReconstruction<PID_integer, ClassicRationalReconstruction<PID_integer> > > cra3_1(4UL, RR3_1);
+		RReconstruction<Givaro::ZRing<Integer>, ClassicRationalReconstruction<Givaro::ZRing<Integer> > > RR3_1(RRB1,INCREMENTAL,5);
+		RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+		RReconstruction<Givaro::ZRing<Integer>, ClassicRationalReconstruction<Givaro::ZRing<Integer> > > > cra3_1(4UL, RR3_1);
 		cra3_1(a3_1,b3_1,iteration,genprime);
 		if ((a3_1 != num)  || (b3_1 != den) ) {
 			ret = false;
@@ -153,9 +152,9 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
 			<< "ERROR: rational reconstruction (Wang, incremental, classic) failed" << endl;
 		}
 
-		RReconstruction<PID_integer, ClassicMaxQRationalReconstruction<PID_integer> > RR4_1(RRB2,INCREMENTAL,5);
-		RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
-		RReconstruction<PID_integer, ClassicMaxQRationalReconstruction<PID_integer> > > cra4_1(4UL, RR4_1);
+		RReconstruction<Givaro::ZRing<Integer>, ClassicMaxQRationalReconstruction<Givaro::ZRing<Integer> > > RR4_1(RRB2,INCREMENTAL,5);
+		RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+		RReconstruction<Givaro::ZRing<Integer>, ClassicMaxQRationalReconstruction<Givaro::ZRing<Integer> > > > cra4_1(4UL, RR4_1);
 		cra4_1(a4_1,b4_1,iteration,genprime);
 		if ((a4_1 != num)  || (b4_1 != den) ) {
 			ret = false;
@@ -163,9 +162,9 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
 			<< "ERROR: rational reconstruction (MaxQ, incremental, classic) failed" << endl;
 		}
 
-		RReconstruction<PID_integer, FastRationalReconstruction<PID_integer> > RR1_2(Z,QUADRATIC,0,10);
-		RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
-		RReconstruction<PID_integer, FastRationalReconstruction<PID_integer> > > cra1_2(4UL, RR1_2);
+		RReconstruction<Givaro::ZRing<Integer>, FastRationalReconstruction<Givaro::ZRing<Integer> > > RR1_2(Z,QUADRATIC,0,10);
+		RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+		RReconstruction<Givaro::ZRing<Integer>, FastRationalReconstruction<Givaro::ZRing<Integer> > > > cra1_2(4UL, RR1_2);
 		cra1_2(a1_2,b1_2,iteration,genprime);
 		if ((a1_2 != num)  || (b1_2 != den) ) {
 			ret = false;
@@ -173,9 +172,9 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
 			<< "ERROR: rational reconstruction (Wang, quadratic, fast) failed" << endl;
 		}
 
-		RReconstruction<PID_integer, FastMaxQRationalReconstruction<PID_integer> > RR2_2(Z,QUADRATIC,0,10);
-		RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
-		RReconstruction<PID_integer, FastMaxQRationalReconstruction<PID_integer> > > cra2_2(4UL, RR2_2);
+		RReconstruction<Givaro::ZRing<Integer>, FastMaxQRationalReconstruction<Givaro::ZRing<Integer> > > RR2_2(Z,QUADRATIC,0,10);
+		RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+		RReconstruction<Givaro::ZRing<Integer>, FastMaxQRationalReconstruction<Givaro::ZRing<Integer> > > > cra2_2(4UL, RR2_2);
 		cra2_2(a2_2,b2_2,iteration,genprime);
 		if ((a2_2 != num)  || (b2_2 != den) ) {
 			ret = false;
@@ -183,9 +182,9 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
 			<< "ERROR: rational reconstruction (MaxQ, quadratic, fast) failed" << endl;
 		}
 
-		RReconstruction<PID_integer, ClassicRationalReconstruction<PID_integer> > RR3_2(RRB1,QUADRATIC,0,10);
-		RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
-		RReconstruction<PID_integer, ClassicRationalReconstruction<PID_integer> > > cra3_2(4UL, RR3_2);
+		RReconstruction<Givaro::ZRing<Integer>, ClassicRationalReconstruction<Givaro::ZRing<Integer> > > RR3_2(RRB1,QUADRATIC,0,10);
+		RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+		RReconstruction<Givaro::ZRing<Integer>, ClassicRationalReconstruction<Givaro::ZRing<Integer> > > > cra3_2(4UL, RR3_2);
 		cra3_2(a3_2,b3_2,iteration,genprime);
 		if ((a3_2 != num)  || (b3_2 != den) ) {
 			ret = false;
@@ -193,9 +192,9 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
 			<< "ERROR: rational reconstruction (Wang, quadratic, classic) failed" << endl;
 		}
 
-		RReconstruction<PID_integer, ClassicMaxQRationalReconstruction<PID_integer> > RR4_2(RRB2,QUADRATIC,0,10);
-		RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
-		RReconstruction<PID_integer, ClassicMaxQRationalReconstruction<PID_integer> > > cra4_2(4UL, RR4_2);
+		RReconstruction<Givaro::ZRing<Integer>, ClassicMaxQRationalReconstruction<Givaro::ZRing<Integer> > > RR4_2(RRB2,QUADRATIC,0,10);
+		RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+		RReconstruction<Givaro::ZRing<Integer>, ClassicMaxQRationalReconstruction<Givaro::ZRing<Integer> > > > cra4_2(4UL, RR4_2);
 		cra4_2(a4_2,b4_2,iteration,genprime);
 		if ((a4_2 != num)  || (b4_2 != den) ) {
 			ret = false;
@@ -204,9 +203,9 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
 		}
 
 
-		RReconstruction<PID_integer, FastRationalReconstruction<PID_integer> > RR1_3(Z,GEOMETRIC,0,5);
-		RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
-		RReconstruction<PID_integer, FastRationalReconstruction<PID_integer> > > cra1_3(4UL, RR1_3);
+		RReconstruction<Givaro::ZRing<Integer>, FastRationalReconstruction<Givaro::ZRing<Integer> > > RR1_3(Z,GEOMETRIC,0,5);
+		RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+		RReconstruction<Givaro::ZRing<Integer>, FastRationalReconstruction<Givaro::ZRing<Integer> > > > cra1_3(4UL, RR1_3);
 		cra1_3(a1_3,b1_3,iteration,genprime);
 		if ((a1_3 != num)  || (b1_3 != den) ) {
 			ret = false;
@@ -214,9 +213,9 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
 			<< "ERROR: rational reconstruction (Wang, geometric, fast) failed" << endl;
 		}
 
-		RReconstruction<PID_integer, FastMaxQRationalReconstruction<PID_integer> > RR2_3(Z,GEOMETRIC,0,5);
-		RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
-		RReconstruction<PID_integer, FastMaxQRationalReconstruction<PID_integer> > > cra2_3(4UL, RR2_3);
+		RReconstruction<Givaro::ZRing<Integer>, FastMaxQRationalReconstruction<Givaro::ZRing<Integer> > > RR2_3(Z,GEOMETRIC,0,5);
+		RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+		RReconstruction<Givaro::ZRing<Integer>, FastMaxQRationalReconstruction<Givaro::ZRing<Integer> > > > cra2_3(4UL, RR2_3);
 		cra2_3(a2_3,b2_3,iteration,genprime);
 		if ((a2_3 != num)  || (b2_3 != den) ) {
 			ret = false;
@@ -224,9 +223,9 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
 			<< "ERROR: rational reconstruction (MaxQ, geometric, fast) failed" << endl;
 		}
 
-		RReconstruction<PID_integer, ClassicRationalReconstruction<PID_integer> > RR3_3(RRB1,GEOMETRIC,0,5);
-		RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
-		RReconstruction<PID_integer, ClassicRationalReconstruction<PID_integer> > > cra3_3(4UL, RR3_3);
+		RReconstruction<Givaro::ZRing<Integer>, ClassicRationalReconstruction<Givaro::ZRing<Integer> > > RR3_3(RRB1,GEOMETRIC,0,5);
+		RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+		RReconstruction<Givaro::ZRing<Integer>, ClassicRationalReconstruction<Givaro::ZRing<Integer> > > > cra3_3(4UL, RR3_3);
 		cra3_3(a3_3,b3_3,iteration,genprime);
 		if ((a3_3 != num)  || (b3_3 != den) ) {
 			ret = false;
@@ -234,9 +233,9 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
 			<< "ERROR: rational reconstruction (Wang, geometric, classic) failed" << endl;
 		}
 
-		RReconstruction<PID_integer, ClassicMaxQRationalReconstruction<PID_integer> > RR4_3(RRB2,GEOMETRIC,0,5);
-		RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
-		RReconstruction<PID_integer, ClassicMaxQRationalReconstruction<PID_integer> > > cra4_3(4UL, RR4_3);
+		RReconstruction<Givaro::ZRing<Integer>, ClassicMaxQRationalReconstruction<Givaro::ZRing<Integer> > > RR4_3(RRB2,GEOMETRIC,0,5);
+		RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+		RReconstruction<Givaro::ZRing<Integer>, ClassicMaxQRationalReconstruction<Givaro::ZRing<Integer> > > > cra4_3(4UL, RR4_3);
 		cra4_3(a4_3,b4_3,iteration,genprime);
 		if ((a4_3 != num)  || (b4_3 != den) ) {
 			ret = false;
@@ -245,13 +244,13 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
 		}
 
 		size_t H = (n > d) ? n : d;
-		H /= bits;
+		H /= (size_t)bits;
 		++H;
 		H *=2;
 		++H;
-		RReconstruction<PID_integer, FastRationalReconstruction<PID_integer> > RR1_4(Z,CERTIFIED,0,H);
-		RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
-		RReconstruction<PID_integer, FastRationalReconstruction<PID_integer> > > cra1_4(4UL, RR1_4);
+		RReconstruction<Givaro::ZRing<Integer>, FastRationalReconstruction<Givaro::ZRing<Integer> > > RR1_4(Z,CERTIFIED,0,H);
+		RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+		RReconstruction<Givaro::ZRing<Integer>, FastRationalReconstruction<Givaro::ZRing<Integer> > > > cra1_4(4UL, RR1_4);
 		cra1_4(a1_4,b1_4,iteration,genprime);
 		if ((a1_4 != num)  || (b1_4 != den) ) {
 			ret = false;
@@ -259,10 +258,10 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
 			<< "ERROR: rational reconstruction (Wang, certified, fast) failed" << endl;
 		}
 
-		//RReconstruction<PID_integer, FastMaxQRationalReconstruction<PID_integer> > RR2_4(Z,CERTIFIED);
-		RReconstruction<PID_integer, ClassicRationalReconstruction<PID_integer> > RR3_4(RRB1,CERTIFIED,0,H);
-		RationalRemainder2< VarPrecEarlySingleCRA< Modular<double> >,
-		RReconstruction<PID_integer, ClassicRationalReconstruction<PID_integer> > > cra3_4(4UL, RR3_4);
+		//RReconstruction<Givaro::ZRing<Integer>, FastMaxQRationalReconstruction<Givaro::ZRing<Integer> > > RR2_4(Z,CERTIFIED);
+		RReconstruction<Givaro::ZRing<Integer>, ClassicRationalReconstruction<Givaro::ZRing<Integer> > > RR3_4(RRB1,CERTIFIED,0,H);
+		RationalRemainder2< VarPrecEarlySingleCRA< Givaro::Modular<double> >,
+		RReconstruction<Givaro::ZRing<Integer>, ClassicRationalReconstruction<Givaro::ZRing<Integer> > > > cra3_4(4UL, RR3_4);
 		cra3_4(a3_4,b3_4,iteration,genprime);
 		if ((a3_4 != num)  || (b3_4 != den) ) {
 			ret = false;
@@ -270,7 +269,7 @@ static bool testRandomFraction (size_t n, size_t d, int iterations)
 			<< "ERROR: rational reconstruction (Wang, certified, classic) failed" << endl;
 		}
 
-		//RReconstruction<PID_integer, ClassicMaxQRationalReconstruction<PID_integer> > RR4_4(RRB2,CERTIFIED);
+		//RReconstruction<Givaro::ZRing<Integer>, ClassicMaxQRationalReconstruction<Givaro::ZRing<Integer> > > RR4_4(RRB2,CERTIFIED);
 
 		commentator().stop ("done");
 		commentator().progress ();
@@ -298,7 +297,7 @@ int main (int argc, char **argv)
 	};
 
 	parseArguments (argc, argv, args);
-	//Modular<int> F (q);
+	//Givaro::Modular<int> F (q);
 
 	commentator().start("Rational reconstruction test suite", "rr");
 
diff --git a/tests/test-rational-solver-adaptive.C b/tests/test-rational-solver-adaptive.C
index 106e41b..e6f9f28 100644
--- a/tests/test-rational-solver-adaptive.C
+++ b/tests/test-rational-solver-adaptive.C
@@ -32,8 +32,10 @@
 
 
 
-#include "linbox/field/PID-integer.h"
+#include "linbox/linbox-config.h"
+#include "givaro/zring.h"
 #include "linbox/blackbox/diagonal.h"
+#include "linbox/vector/blas-vector.h"
 #include "linbox/algorithms/rational-solver-adaptive.h"
 #include <iostream>
 #include "test-common.h"
@@ -50,7 +52,7 @@ bool testRandomSolve (const Ring& R,
 {
 
 
-	std::ostringstream str;
+	// std::ostringstream str;
 
 
 
@@ -58,18 +60,17 @@ bool testRandomSolve (const Ring& R,
 
 	bool ret = true;
 
-        bool iter_passed = true;
 
 	VectorDomain<Ring> VD (R);
 
-	Vector d, b, x, y;
+	int n = (int)stream1.n();
+	Vector d(R,n), b(R,n), X(R,n), y(R,n);
 
-	VectorWrapper::ensureDim (d, stream1.n ());
-        VectorWrapper::ensureDim (b, stream1.n ());
-        VectorWrapper::ensureDim (x, stream1.n ());
-        VectorWrapper::ensureDim (y, stream1.n ());
+	// VectorWrapper::ensureDim (d, stream1.n ());
+	// VectorWrapper::ensureDim (b, stream1.n ());
+	// VectorWrapper::ensureDim (X, stream1.n ());
+	// VectorWrapper::ensureDim (y, stream1.n ());
 
-	int n = (int)d. size();
 
 	while (stream1 && stream2) {
 
@@ -77,46 +78,55 @@ bool testRandomSolve (const Ring& R,
 
                 //ActivityState state = commentator().saveActivityState ();
 
-                iter_passed = true;
+                bool iter_passed = true;
 
 		bool zeroEntry;
 		do {
 		  stream1.next (d);
 		  zeroEntry = false;
 		  for (size_t i=0; i<stream1.n(); i++)
-		    zeroEntry |= R.isZero(d[i]);
+		    zeroEntry |= R.isZero(d[(size_t)i]);
 		} while (zeroEntry);
 
-                stream2.next (b);
+        stream2.next (b);
 
-                std::ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
-                report << "Diagonal entries: ";
-                VD.write (report, d);
-                report << endl;
+        std::ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+        report << "Diagonal entries: ";
+        VD.write (report, d);
+        report << endl;
 
-                report << "Right-hand side:  ";
-                VD.write (report, b);
-                report << endl;
+        report << "Right-hand side:  ";
+        VD.write (report, b);
+        report << endl;
 
-                //Diagonal<Ring> D(R, d);
+        //Diagonal<Ring> D(R, d);
 
-		BlasMatrix<Ring> D(R, n, n);
+		BlasMatrix<Ring> D(R, (size_t) n, (size_t) n);
 
-		for(int i = 0; i < n; ++i) R.init (D[i][i],  d[i]);
+		for(size_t i = 0; i < (size_t)n; ++i) {
+			typename Ring::Element x; R.init(x, d[i]);
+			D.setEntry(i, i, x);
+			//for(size_t j = 0; j < n; ++j) 
+			//	if (j != i) D.setEntry(i,j,R.zero);
+		}
+
+		D.write(report<<"Matrix: \n");	
 
 		typedef RationalSolverAdaptive RSolver;
 		RSolver rsolver;
 
-		//std::vector<std::pair<typename Ring::Element, typename Ring::Element> > answer(n);
-		std::vector<typename Ring::Element> num(n);
+		BlasVector<Ring> num(R,(size_t)n);
 		typename Ring::Element den;
 
 		SolverReturnStatus solveResult = rsolver.solveNonsingular(num, den, D, b); //often 5 primes are not enough
 
+        report << "Solution numerator: ";
+        VD.write (report, num);
+        report << ", denominator: " << den << endl;
 #if 0
 		typename Ring::Element lden;
 
-		R. init (lden, 1);
+		R. assign (lden, R.one);
 
 		typename std::vector<std::pair<typename Ring::Element, typename Ring::Element> >::iterator p;
 
@@ -128,7 +138,7 @@ bool testRandomSolve (const Ring& R,
 
 		if (solveResult == SS_OK) {
 #if 0
-		  for (p = answer.begin(), p_x = x. begin();
+		  for (p = answer.begin(), p_x = X. begin();
 		       p != answer.end();
 		       ++ p, ++ p_x) {
 
@@ -138,7 +148,7 @@ bool testRandomSolve (const Ring& R,
 
 		  }
 
-		  D. apply (y, x);
+		  D. apply (y, X);
 #endif
 		  D. apply (y, num);
 
@@ -188,16 +198,16 @@ int main(int argc, char** argv)
 
 	parseArguments (argc, argv, args);
 
-	typedef Modular<int32_t> Field;
-	// typedef Modular<double> Field;
+	typedef Givaro::Modular<int32_t> Field;
+	// typedef Givaro::Modular<double> Field;
 
-	typedef PID_integer     Ring;
+	typedef Givaro::ZRing<Integer>     Ring;
 
-	Ring R;
+	Ring R; Ring::RandIter gen(R);
 
 	Field F(101);
 
-	RandomDenseStream<Ring> s1 (R, n, iterations), s2 (R, n, iterations);
+	RandomDenseStream<Ring,BlasVector<Ring> > s1 (R, gen, n, (unsigned int)iterations), s2 (R, gen, n, (unsigned int)iterations);
 
 
 
diff --git a/tests/test-rational-solver.C b/tests/test-rational-solver.C
index b166bb5..7a90c73 100644
--- a/tests/test-rational-solver.C
+++ b/tests/test-rational-solver.C
@@ -13,7 +13,7 @@
  *
  * This 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
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
@@ -22,186 +22,134 @@
  * ========LICENCE========
  */
 
-
 /*! @file  tests/test-rational-solver.C
  * @ingroup tests
  * @brief no doc.
  * @test no doc.
  */
 
-
-
-#include "linbox/field/PID-integer.h"
-#include "linbox/field/modular.h"
+#include "linbox/linbox-config.h"
+#include "linbox/ring/modular.h"
 #include "linbox/blackbox/diagonal.h"
 #include "linbox/algorithms/rational-solver.h"
 #include "linbox/randiter/random-prime.h"
-#include <iostream>
-#include "test-common.h"
 #include "linbox/vector/stream.h"
 #include "linbox/util/commentator.h"
+
+#include "test-common.h"
+
+#include <iostream>
+
 using namespace LinBox;
 
 /// Testing Nonsingular Random Diagonal solve.
 template <class Ring, class Field, class Vector>
 bool testRandomSolve (const Ring& R,
-		      const Field& f,
-		      LinBox::VectorStream<Vector>& stream1,
-		      LinBox::VectorStream<Vector>& stream2)
+              const Field& f,
+              LinBox::VectorStream<Vector>& stream1,
+              LinBox::VectorStream<Vector>& stream2)
 {
+    commentator().start("Testing Nonsingular Random Diagonal solve ",
+                        "testNonsingularRandomDiagonalSolve",
+                        stream1.size());
 
-	std::ostringstream str;
-
-	commentator().start ("Testing Nonsingular Random Diagonal solve ","testNonsingularRandomDiagonalSolve", stream1.size());// "testNonsingularRandomMatrixSolve", stream1.m ());
-
-	bool ret = true;
-
-        bool iter_passed = true;
-
-	VectorDomain<Ring> VD (R);
-
-	Vector d, b, x, y;
-
-	VectorWrapper::ensureDim (d, stream1.n ());
-        VectorWrapper::ensureDim (b, stream1.n ());
-        VectorWrapper::ensureDim (x, stream1.n ());
-        VectorWrapper::ensureDim (y, stream1.n ());
-
-	int n = (int)d. size();
-
-	while (stream1 && stream2) {
-
-		commentator().startIteration ((unsigned)stream1.j ());
-
-                //ActivityState state = commentator().saveActivityState ();
+    bool ret = true;
 
-                iter_passed = true;
+    VectorDomain<Ring> VD(R);
+    Vector d(R), b(R), x(R), y(R);
 
-		bool zeroEntry;
-		do {
-		  stream1.next (d);
-		  zeroEntry = false;
-		  for (size_t i=0; i<stream1.n(); i++)
-		    zeroEntry |= R.isZero(d[i]);
-		} while (zeroEntry);
+    VectorWrapper::ensureDim (d, stream1.n ());
+    VectorWrapper::ensureDim (b, stream1.n ());
+    VectorWrapper::ensureDim (x, stream1.n ());
+    VectorWrapper::ensureDim (y, stream1.n ());
 
-                stream2.next (b);
+    int n = (int)d.size();
 
-                std::ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
-                report << "Diagonal entries: ";
-                VD.write (report, d);
-                report << endl;
-
-                report << "Right-hand side:  ";
-                VD.write (report, b);
-                report << endl;
-
-                //Diagonal<Ring> D(R, d);
-
-		BlasMatrix<Ring> D(R, n, n);
-
-		for(int i = 0; i < n; ++i) R.init (D[i][i],  d[i]);
-
-		typedef RationalSolver<Ring, Field, LinBox::RandomPrimeIterator> RSolver;
-		RSolver rsolver;
-
-		//std::vector<std::pair<typename Ring::Element, typename Ring::Element> > answer(n);
-		std::vector<typename Ring::Element> num(n);
-		typename Ring::Element den;
-
-		SolverReturnStatus solveResult = rsolver.solve(num, den, D, b, 30); //often 5 primes are not enough
+    while (stream1 && stream2) {
+        commentator().startIteration ((unsigned)stream1.j ());
+        bool iter_passed = true;
 
-#if 0
-		typename Ring::Element lden;
+        bool zeroEntry;
+        do {
+            stream1.next (d);
+            zeroEntry = false;
+            for (size_t i=0; i<stream1.n(); i++)
+            zeroEntry |= R.isZero(d[(size_t)i]);
+        } while (zeroEntry);
 
-		R. init (lden, 1);
+        stream2.next (b);
 
-		typename std::vector<std::pair<typename Ring::Element, typename Ring::Element> >::iterator p;
+        std::ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+        report << "Diagonal entries: ";
+        VD.write (report, d);
+        report << endl;
 
-		for (p = answer.begin(); p != answer.end(); ++ p)
-			R. lcm (lden, lden, p->second);
-		typename Vector::iterator p_x;
-		//typename Vector::iterator p_y;
-#endif
+        report << "Right-hand side:  ";
+        VD.write (report, b);
+        report << endl;
 
-		if (solveResult == SS_OK) {
-#if 0
-		  for (p = answer.begin(), p_x = x. begin();
-		       p != answer.end();
-		       ++ p, ++ p_x) {
+        //Diagonal<Ring> D(R, d);
+        BlasMatrix<Ring> D(R, n, n);
 
-		    R. mul (*p_x, p->first, lden);
+        for(int i = 0; i < n; ++i) R.init (D[(size_t)i][(size_t)i],  d[(size_t)i]);
 
-		    R. divin (*p_x, p->second);
+        typedef RationalSolver<Ring, Field, LinBox::RandomPrimeIterator> RSolver;
+        RSolver rsolver;
 
-		  }
+        BlasVector<Ring> num(R,(size_t)n);
+        typename Ring::Element den;
 
-		  D. apply (y, x);
-#endif
-		  D. apply (y, num);
+        auto solveResult = rsolver.solve(num, den, D, b, 30); // often 5 primes are not enough
 
-		  VD. mulin(b, den);
+        if (solveResult == SS_OK) {
+          D. apply (y, num);
+          VD. mulin(b, den);
 
-		  if (!VD.areEqual (y, b)) {
-		    ret = iter_passed = false;
-		    commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-		      << "ERROR: Computed solution is incorrect" << endl;
-		  }
-		}
-		else {
-		    ret = iter_passed = false;
-		    commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-		      << "ERROR: Did not return OK solving status" << endl;
-		}
+          if (!VD.areEqual (y, b)) {
+            ret = iter_passed = false;
+            commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+              << "ERROR: Computed solution is incorrect" << endl;
+          }
+        }
+        else {
+            ret = iter_passed = false;
+            commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+              << "ERROR: Did not return OK solving status" << endl;
+        }
 
-		commentator().stop ("done");
+        commentator().stop ("done");
                 commentator().progress ();
+    }
 
-	}
-
-
-	stream1.reset ();
-        stream2.reset ();
-
-        commentator().stop (MSG_STATUS (ret), (const char *) 0, "testNonsingularRandomDiagonalSolve");
+    stream1.reset ();
+    stream2.reset ();
+    commentator().stop (MSG_STATUS (ret), (const char *) 0, "testNonsingularRandomDiagonalSolve");
 
-	return ret;
+    return ret;
 }
 
 int main(int argc, char** argv)
 {
+    bool pass = true;
+    static size_t n = 10;
+    static int iterations = 1;
+    static Argument args[] = {
+        { 'n', "-n N", "Set order of test matrices to N.", TYPE_INT, &n},
+        { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
+        END_OF_ARGUMENTS };
 
+    parseArguments (argc, argv, args);
 
-	bool pass = true;
-
-        static size_t n = 10;
-
-	static int iterations = 1;
-
-        static Argument args[] = {
-                { 'n', "-n N", "Set order of test matrices to N.", TYPE_INT, &n},
-		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
-		END_OF_ARGUMENTS
-        };
-
-
-	parseArguments (argc, argv, args);
-
-	typedef Modular<int32_t> Field;
-	// typedef Modular<double> Field;
-
-	typedef PID_integer     Ring;
-
-	Ring R;
-
-	Field F(101);
-
-	RandomDenseStream<Ring> s1 (R, n, iterations), s2 (R, n, iterations);
+    using Field = Givaro::Modular<int32_t>;
+    using Ring  = Givaro::IntegerDom;
 
-	if (!testRandomSolve(R, F, s1, s2)) pass = false;
+    Ring R; Ring::RandIter gen(R);
+    Field F(101); 
 
-	return pass ? 0 : -1;
+    RandomDenseStream<Ring> s1 (R, gen, n, (unsigned int)iterations), s2 (R, gen, n, (unsigned int)iterations);
+    if (!testRandomSolve(R, F, s1, s2)) pass = false;
 
+    return pass ? 0 : -1;
 }
 
 
diff --git a/tests/test-regression.C b/tests/test-regression.C
new file mode 100644
index 0000000..3ff9f6a
--- /dev/null
+++ b/tests/test-regression.C
@@ -0,0 +1,125 @@
+/* tests/test-regression.C
+ * Copyright (C) LinBox
+ * Written by Clement Pernet
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file  tests/test-regression.C
+ * @ingroup tests
+ * @brief tests former bugs to check that no regression made them show up again.
+ */
+#include "linbox-config.h"
+#include "givaro/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/vector/blas-vector.h"
+#include "solutions/solve.h"
+using namespace LinBox;
+
+bool testSolveSparse(){
+
+    typedef Givaro::Modular<unsigned int> Field;
+    typedef std::vector <std::pair <size_t, Field::Element> > SparseSeqVectorGFp;
+    typedef SparseMatrix<Field, VectorTraits<SparseSeqVectorGFp>::SparseFormat> Matrix;
+    Field F(127);
+    Matrix A(F, 3, 3);
+    DenseVector<Field> x(F, 3);
+    DenseVector<Field> b(F, 3);
+    A.setEntry(0,0, 1);
+    A.setEntry(0,1, 2);
+    A.setEntry(0,2, 3);
+    A.setEntry(1,0, 126);
+    A.setEntry(1,1, 2);
+    A.setEntry(1,2, 5);
+    A.setEntry(2,0, 2);
+    A.setEntry(2,1, 3);
+    A.setEntry(2,2, 1);
+    for (int i=0;i<3;i++)
+        F.assign(b[i],i+1);
+    
+    Matrix B(A);
+    
+    solve(x,B,b,  Method::BlasElimination());
+
+    if (!F.areEqual (x[0],73)) return false;
+    if (!F.areEqual (x[1],76)) return false;
+    if (!F.areEqual (x[2],10)) return false;
+    return true;
+}
+
+#if __LINBOX_HAVE_SAGE
+// CP: Include the .C file instead of linking to the linboxsage lib: 
+// avoid requiring to make install before make check.
+#include "interfaces/sage/linbox-sage.C" 
+bool testSolveSparseSage(){
+    size_t p = 127;
+    c_vector_modint_linbox * A = new c_vector_modint_linbox[3];
+    c_vector_modint_linbox  b;
+    for (int i=0;i<3;++i){
+        A[i].entries = new int[3];
+        A[i].positions = new size_t[3];
+        A[i].num_nonzero=3;
+        for (int j=0;j<3;j++)
+            A[i].positions[j]=j;
+        A[i].p = p;
+    }        
+    b.entries = new int[3];
+    b.positions = new size_t[3];
+    for (int j=0;j<3;j++)
+        b.positions[j]=j;
+    b.num_nonzero=3;
+    b.p = p;
+    for (int i=0;i<3;i++)
+        b.entries[i]=i+1;
+
+    std::vector<unsigned int> x;
+
+    A[0].entries[0]=1;
+    A[0].entries[1]=2;
+    A[0].entries[2]=3;
+    A[1].entries[0]=126;
+    A[1].entries[1]=2;
+    A[1].entries[2]=5;
+    A[2].entries[0]=2;
+    A[2].entries[1]=3;
+    A[2].entries[2]=1;
+
+    x = linbox_modn_sparse_matrix_solve(p,3,3,A,&b,1);
+
+    if (x[0] != 73) return false;
+    if (x[1] != 76) return false;
+    if (x[2] != 10) return false;
+    
+    return true;
+}
+#else
+bool testSolveSparseSage(){return true;}
+#endif
+
+int main (int argc, char **argv)
+{
+    bool pass = true;
+
+    if (!testSolveSparse  ()) pass = false;
+    if (!testSolveSparseSage  ()) pass = false;
+
+    return pass ? 0 : -1;
+}
diff --git a/tests/test-scalar-matrix.C b/tests/test-scalar-matrix.C
index 10c2cab..7ca4b87 100644
--- a/tests/test-scalar-matrix.C
+++ b/tests/test-scalar-matrix.C
@@ -36,9 +36,9 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
 
-#include "linbox/field/modular.h"
+
+#include "linbox/ring/modular.h"
 #include "linbox/blackbox/scalar-matrix.h"
 
 #include "test-blackbox.h"
@@ -50,7 +50,7 @@ int main (int argc, char **argv)
 	bool pass = true;
 
 	static size_t n = 20;
-	static integer q = 2147483647U;
+	static integer q = 65521U;
 	static int iterations = 1;
 
 	static Argument args[] = {
@@ -66,18 +66,18 @@ int main (int argc, char **argv)
 
 	commentator().start("Scalar black box test suite", "Scalar");
 
-	typedef Modular<uint32_t> Field;
+	typedef Givaro::Modular<uint32_t> Field;
 
 	Field F (q);
 	Field::Element d;
-	F.init (d, -1);
+	F.assign(d, F.mOne);
 
 	typedef ScalarMatrix <Field> Blackbox;
 	// C Pernet: why is the default constructor even public?
 	// Blackbox A; // Test the default constructor
 	//pass = pass && testBlackbox(A);
 
-	Blackbox B (F, n, d); // Test a small one.
+	Blackbox B (F, n, n, d); // Test a small one.
 	pass = pass && testBlackbox(B);
 
 	//Blackbox C (F, 100000, d); // Test a large one.
diff --git a/tests/test-smith-form-adaptive.C b/tests/test-smith-form-adaptive.C
index fc7d23f..f7f1aee 100644
--- a/tests/test-smith-form-adaptive.C
+++ b/tests/test-smith-form-adaptive.C
@@ -32,8 +32,9 @@
 
 
 
-//#include "linbox/field/ntl-ZZ.h"
-#include "linbox/field/PID-integer.h"
+#include <linbox/linbox-config.h>
+
+#include "givaro/zring.h"
 #include <time.h>
 #include "linbox/randiter/random-prime.h"
 #include "linbox/util/commentator.h"
@@ -57,11 +58,10 @@ bool testRandom(const Ring& R,
 	commentator().start (str.str ().c_str (), "testRandom");//, stream1.m ());
 
 	bool ret = true;
-	bool iter_passed = true;
 
 	VectorDomain<Ring> VD (R);
 
-	Vector d, x;
+	Vector d(R), x(R);
 
 	VectorWrapper::ensureDim (d, stream1.n ());
 
@@ -76,7 +76,7 @@ bool testRandom(const Ring& R,
 
 		std::ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
 
-		iter_passed = true;
+		bool iter_passed = true;
 
 		stream1.next (d);
 
@@ -89,21 +89,21 @@ bool testRandom(const Ring& R,
 		int i, j;
 
 		for(i = 0; i < n; ++i) {
-			R. assign (D[i][i], d[i]);
-			R. init (L[i][i], 1);
-			R. init (U[i][i], 1);}
+			R. assign (D[(size_t)i][(size_t)i], d[(size_t)i]);
+			R. assign(L[(size_t)i][(size_t)i], R.one);
+			R. assign (U[(size_t)i][(size_t)i], R.one);}
 
 			for (i = 0; i < n; ++ i)
 
 				for (j = 0; j < i; ++ j) {
 
-					R.init(L[i][j], rand() % 10);
+					R.init(L[(size_t)i][(size_t)j], rand() % 10);
 
-					R.init(U[j][i], rand() % 10);
+					R.init(U[(size_t)j][(size_t)i], rand() % 10);
 				}
 
 
-			std::vector<typename Ring::Element> tmp1(n), tmp2(n), e(n);
+			BlasVector<Ring> tmp1(R,(size_t)n), tmp2(R,(size_t)n), e(R,(size_t)n);
 
 			typename BlasMatrix<Ring>::ColIterator col_p;
 
@@ -111,19 +111,23 @@ bool testRandom(const Ring& R,
 			for (col_p = A.colBegin();
 			     col_p != A.colEnd(); ++ col_p, ++ i) {
 
-				R.init(e[i],1);
+				R.assign(e[(size_t)i],R.one);
 				U.apply(tmp1, e);
 				D.apply(tmp2, tmp1);
+				// LinBox::BlasSubvector<BlasVector<Ring> > col_p_v (R, *col_p);
+				// L.apply(col_p_v, tmp2);
 				L.apply(*col_p, tmp2);
-				R.init(e[i],0);
+				R.assign(e[(size_t)i],R.zero);
 			}
 
 
 
-			std::vector<integer> xi(A. rowdim());
+			Givaro::ZRing<Integer> Z; //! why switch from Ring ????
+			BlasVector<Givaro::ZRing<Integer> > xi(Z,A. rowdim());
 
 			SF.smithForm (xi, A);
-			typename Vector::iterator x_p; std::vector<integer>::iterator xi_p;
+			typename Vector::iterator x_p;
+			BlasVector<Givaro::ZRing<Integer> >::iterator xi_p;
 			for (x_p = x. begin(), xi_p = xi. begin(); x_p != x. end(); ++ x_p, ++ xi_p)
 				A. field (). init (*x_p, *xi_p);
 
@@ -135,7 +139,7 @@ bool testRandom(const Ring& R,
 			report << '\n';
 
 
-			typename std::vector<typename Ring::Element>::iterator p1, p2;
+			typename BlasVector<Ring>::iterator p1, p2;
 			typename Ring::Element g;
 
 
@@ -200,7 +204,7 @@ int main(int argc, char** argv)
 
 	bool pass = true;
 	static size_t n = 35;
-	static int iterations = 1;
+	static unsigned int iterations = 1;
 	static Argument args[] = {
 		{ 'n', "-n N", "Set order of test matrices to N.", TYPE_INT,  &n },
 		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT, &iterations },
@@ -214,12 +218,12 @@ int main(int argc, char** argv)
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (5);
 
 	//typedef NTL_ZZ Ring; Ring R;
-	typedef PID_integer Ring; Ring R;
-	RandomDenseStream<Ring> s1 (R, n, iterations);
+	typedef Givaro::ZRing<Integer> Ring; Ring R; Ring::RandIter gen(R);
+	RandomDenseStream<Ring> s1 (R, gen, n, iterations);
 	pass = testRandom(R, sf, s1);
 
-	typedef PID_integer Ring2; Ring2 S;
-	RandomDenseStream<Ring2> s2 (S, n, iterations);
+	typedef Givaro::ZRing<Integer> Ring2; Ring2 S;Ring2::RandIter gen2(S);
+	RandomDenseStream<Ring2> s2 (S, gen2, n, iterations);
 	pass = pass && testRandom(S, sf, s2);
 
 	commentator().stop(MSG_STATUS(pass));
@@ -227,11 +231,10 @@ int main(int argc, char** argv)
 
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-smith-form-binary.C b/tests/test-smith-form-binary.C
index 505b3f9..b2f75d9 100644
--- a/tests/test-smith-form-binary.C
+++ b/tests/test-smith-form-binary.C
@@ -31,12 +31,12 @@
 
 
 
+#include "linbox/linbox-config.h"
 
-#include "linbox/field/PID-integer.h"
 #ifdef __LINBOX_HAVE_NTL
-#include "linbox/field/ntl.h"
+#include "linbox/ring/ntl.h"
 #endif
-#include "linbox/field/modular.h"
+//#include "linbox/ring/modular.h"
 #include "linbox/randiter/random-prime.h"
 #include "linbox/algorithms/matrix-rank.h"
 #include "linbox/algorithms/last-invariant-factor.h"
@@ -46,6 +46,7 @@
 #include "linbox/blackbox/random-matrix.h"
 #include "linbox/algorithms/rational-solver.h"
 #include <time.h>
+#include <givaro/modular.h>
 
 #include "linbox/util/commentator.h"
 #include "linbox/vector/stream.h"
@@ -65,26 +66,24 @@ bool testRandom(const Ring& R,
         commentator().start (str.str ().c_str (), "testSmithform");//, stream1.m ());
 
         bool ret = true;
-        bool iter_passed = true;
 
         LinBox::VectorDomain<Ring> VD (R);
 
-	Vector d, x;
+	int n = (int) stream1.n();
+	Vector d(R,n), x(R,n);
 
-	VectorWrapper::ensureDim (d, stream1.n ());
+	// VectorWrapper::ensureDim (d, stream1.n ());
+	// VectorWrapper::ensureDim (x, stream1.n ());
 
-	VectorWrapper::ensureDim (x, stream1.n ());
 
 
-	int n = (int)d. size();
-
 	 while (stream1) {
 
                 commentator().startIteration ((unsigned)stream1.j ());
 
 		std::ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
 
-                iter_passed = true;
+                bool iter_passed = true;
 
                 stream1.next (d);
 
@@ -92,38 +91,40 @@ bool testRandom(const Ring& R,
 		VD.write (report, d);
                 report << endl;
 
-		BlasMatrix<Ring> D(R, n, n), L(R, n, n), U(R, n, n), A(R,n,n);
+		DenseMatrix<Ring> D(R, n, n), L(R, n, n), U(R, n, n), A(R,n,n);
 
 		int i, j;
 
 		for(i = 0; i < n; ++i) {
-			R. assign (D[i][i], d[i]);
-			R. init (L[i][i], 1);
-			R. init (U[i][i], 1);}
+			R. assign (D[(size_t)i][(size_t)i], d[(size_t)i]);
+			R. assign (L[(size_t)i][(size_t)i], R.one);
+			R. assign (U[(size_t)i][(size_t)i], R.one);}
 
 		for (i = 0; i < n; ++ i)
 
 			for (j = 0; j < i; ++ j) {
 
-				R.init(L[i][j], rand() % 10);
+				R.init(L[(size_t)i][(size_t)j], (uint64_t)(rand() % 10));
 
-				R.init(U[j][i], rand() % 10);
+				R.init(U[(size_t)j][(size_t)i], (uint64_t)(rand() % 10));
 			}
 
 
-		std::vector<typename Ring::Element> tmp1(n), tmp2(n), e(n);
+		BlasVector<Ring> tmp1(R,(size_t)n), tmp2(R,(size_t)n), e(R,(size_t)n);
 
-		typename BlasMatrix<Ring>::ColIterator col_p;
+		typename DenseMatrix<Ring>::ColIterator col_p;
 
 		i = 0;
 		for (col_p = A.colBegin();
 		     col_p != A.colEnd(); ++ col_p, ++ i) {
 
-			R.init(e[i],1);
+			R.assign (e[(size_t)i],R.one);
 			U.apply(tmp1, e);
 			D.apply(tmp2, tmp1);
+			// LinBox::BlasSubvector<BlasVector<Ring> > col_p_v (R, *col_p);
+			// L.apply(col_p_v, tmp2);
 			L.apply(*col_p, tmp2);
-			R.init(e[i],0);
+			R.assign(e[(size_t)i],R.zero);
 		}
 
 
@@ -138,7 +139,7 @@ bool testRandom(const Ring& R,
 		report << '\n';
 
 
-		typename std::vector<typename Ring::Element>::iterator p1, p2;
+		typename BlasVector<Ring>::iterator p1, p2;
 		typename Ring::Element g;
 
 
@@ -146,7 +147,8 @@ bool testRandom(const Ring& R,
 
 			for ( p2 = p1 + 1; p2 != d.end(); ++ p2) {
 
-				if (R. isUnit(*p1))  break;
+                                    // CP: changed isUnit to isOne || isMOne as it is only called with ZRing<Integer>.
+				if (R. isOne (*p1) || R. isMOne(*p1))  break;
 
 				else if (R. isZero (*p2)) continue;
 
@@ -165,28 +167,21 @@ bool testRandom(const Ring& R,
 				}
 			}
 		}
+		// normalize to positive
+		for (p1 = d.begin(); p1 != d.end(); ++ p1) if (*p1 < 0) R.negin(*p1);
 
-
-		report << "Expected smith form:\n";
-
-		VD.write (report, d);
-
-		report << '\n';
+		VD.write (report << "Expected smith form:\n", d) << '\n';
 
 		if (!VD.areEqual (d, x))
-
 			ret = iter_passed = false;
 
-                if (!iter_passed)
-
-                        commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
+        if (!iter_passed)
+            commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
 				<< "ERROR: Computed Smith form is incorrect" << endl;
 
+        commentator().stop ("done");
 
-
-                commentator().stop ("done");
-
-                commentator().progress ();
+        commentator().progress ();
 
 	 }
 
@@ -219,17 +214,18 @@ int main(int argc, char** argv)
 	std::ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
 
 	{
-		typedef PID_integer Ring;
+//		typedef Givaro::IntegerDom Ring;
+		typedef Givaro::ZRing<Integer> Ring;
 
-		Ring R;
+		Ring R; Ring::RandIter gen(R);
 
 		report << std::endl << "EGV++ algorithm test suite with LinBox/Givaro PID:\n";
 
 		commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (5);
 
-		RandomDenseStream<Ring> s1 (R, n, iterations);
+		RandomDenseStream<Ring> s1 (R, gen, n, (unsigned int) iterations);
 
-		typedef Modular<int32_t> Field;
+		typedef Givaro::Modular<int32_t> Field;
 		typedef RationalSolver<Ring, Field, LinBox::RandomPrimeIterator> Solver;
 		typedef LastInvariantFactor<Ring, Solver> LIF;
 		typedef OneInvariantFactor<Ring, LIF, SCompose, RandomMatrix>  OIF;
@@ -248,14 +244,14 @@ int main(int argc, char** argv)
 	{
 		typedef NTL_ZZ Ring;
 
-		Ring R;
+		Ring R; Ring::RandIter gen(R);
 
 		report << std::endl << "EGV++ algorithm test suite with NTL_ZZ :\n";
 		commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (5);
 
-		RandomDenseStream<Ring> s1 (R, n, iterations);
+		RandomDenseStream<Ring> s1 (R, gen, n, (unsigned int)iterations);
 
-		typedef Modular<int32_t> Field;
+		typedef Givaro::Modular<int32_t> Field;
 		typedef RationalSolver<Ring, Field, LinBox::RandomPrimeIterator> Solver;
 		typedef LastInvariantFactor<Ring, Solver> LIF;
 		typedef OneInvariantFactor<Ring, LIF, SCompose, RandomMatrix>  OIF;
@@ -273,11 +269,10 @@ int main(int argc, char** argv)
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-smith-form-iliopoulos.C b/tests/test-smith-form-iliopoulos.C
index 079a3cb..50314a8 100644
--- a/tests/test-smith-form-iliopoulos.C
+++ b/tests/test-smith-form-iliopoulos.C
@@ -31,20 +31,19 @@
 
 
 
-#include "linbox/field/ntl.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/PIR-ntl-ZZ_p.h"
-#include "linbox/field/PIR-modular-int32.h"
-#include "linbox/integer.h"
+#include <linbox/linbox-config.h>
+
+#include "givaro/zring.h"
+//#include "linbox/ring/pir-ntl-zz_p.h"
+#include "linbox/ring/pir-modular-int32.h"
 #include "linbox/randiter/random-prime.h"
-#include "linbox/algorithms/last-invariant-factor.h"
 #include "linbox/algorithms/smith-form-iliopoulos.h"
-#include "linbox/algorithms/rational-solver.h"
-#include <time.h>
+#include "linbox/matrix/matrix-domain.h"
 #include "linbox/util/commentator.h"
-#include "linbox/vector/stream.h"
 #include "test-common.h"
 #include "linbox/algorithms/matrix-hom.h"
+#include "linbox/solutions/det.h"
+#include <iostream>
 
 #ifndef __LINBOX_HAVE_NTL
 #error "you can't compile this test without NTL enabled. Please make sure you configured Linbox with --with-ntl=path/to/ntl"
@@ -54,222 +53,99 @@
 
 using namespace LinBox;
 
-template <class Ring, class Vector>
-bool testRandom(const Ring& R,
-		LinBox::VectorStream<Vector>& stream1)
+template <class Ring>
+bool testRead(const Ring& R, string file) {
+	BlasMatrix<Ring> A(R);
+	BlasMatrixDomain<Ring> BMD(R);
+	std::ifstream data(file);
+	A.read(data);
+	size_t m = A.rowdim();
+	size_t n = A.coldim();
+	BlasMatrix<Ring> U(R, m, m), V(R, n, n), B(R, m, n);
+	/* random unimodular
+	BMD.randomNonsingular(U);
+	BMD.randomNonsingular(V);
+	*/
+	for (size_t i = 0; i < m; ++i)
+	{	for (size_t j = 0; j < m; ++j)
+			U.setEntry(i, j, R.zero);
+		U.setEntry(i, i, R.one);
+	}
+	for (size_t i = 0; i < n; ++i)
+	{	for (size_t j = 0; j < n; ++j)
+			V.setEntry(i, j, R.zero);
+		V.setEntry(i, i, R.one);
+	}
+	BMD.copy(B, A);
+	BMD.mulin_left(B,V);
+	BMD.mulin_right(U,B);
+	SmithFormIliopoulos::smithFormIn (B);
+	return BMD.areEqual(A, B);
+}
+
+template <class Ring>
+bool testRandom(const Ring& R, size_t n)
 {
+        bool pass = true;
 
+        commentator().start ("Testing Iloipoulos elimination:", "testRandom");
 	using namespace std;
-
-	ostringstream str;
-
-	str << "Testing Iloipoulos elimination:";
-
-        commentator().start (str.str ().c_str (), "testRandom", stream1.m ());
-
-        bool ret = true;
-
-        bool iter_passed = true;
-
-        VectorDomain<Ring> VD (R);
-
-	Vector d, x;
-
-	VectorWrapper::ensureDim (d, stream1.n ());
-
-	VectorWrapper::ensureDim (x, stream1.n ());
-
-	int n = (int)d. size();
-
-	 while (stream1) {
-
-                commentator().startIteration ((unsigned)stream1.j ());
-
-		ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
-
-                iter_passed = true;
-
-                stream1.next (d);
-
-		report << "Input vector:  ";
-		VD.write (report, d);
-                report << endl;
-
-		BlasMatrix<Ring> D(R, n, n), L(R, n, n), U(R, n, n), A(R,n,n);
-
-		int i, j;
-
-		for(i = 0; i < n; ++i) { R. assign (D[i][i], d[i]); R. init (L[i][i], 1); R. init (U[i][i], 1);}
-
-		for (i = 0; i < n; ++ i)
-
-			for (j = 0; j < i; ++ j) {
-
-				R.init(L[i][j], rand() % 10);
-
-				R.init(U[j][i], rand() % 10);
-			}
-
-
-		std::vector<typename Ring::Element> tmp1(n), tmp2(n), e(n);
-
-		typename BlasMatrix<Ring>::ColIterator col_p;
-
-		i = 0;
-		for (col_p = A.colBegin(); col_p != A.colEnd(); ++ col_p, ++ i) {
-
-			R.init(e[i],1);
-			U.apply(tmp1, e);
-			D.apply(tmp2, tmp1);
-			L.apply(*col_p, tmp2);
-			R.init(e[i],0);
-		}
-
-
-
-		typename Ring::Element s;
-
-		R. init (s, 1);
-
-		typename Vector::iterator d_p;
-
-		for(d_p = d.begin(); d_p!= d.end(); ++ d_p)
-
-			R. lcm (s, s, *d_p);
-
-		report << "Last Invariant factor: " ;
-
-		R. write (report, s);
-
-		report << '\n';
-
-
-		if (s >= LINBOX_MAX_MODULUS) {
-
-			report << "Using PIR_ntl_ZZ_p\n";
-
-			PIR_ntl_ZZ_p PIR(s);
-
-			BlasMatrix<PIR_ntl_ZZ_p> Ap(PIR, A.rowdim(), A.coldim());
-
-			MatrixHom::map (Ap, A, PIR);
-
-			SmithFormIliopoulos::smithFormIn (Ap);
-
-			report << "Computed Smith form: \n";
-
-			for ( unsigned int ii = 0; ii < A. rowdim(); ++ ii)
-				report << Ap[ii][ii] << " ";
-
-			report << '\n';
-
-			int ii = 0;
-
-			typename std::vector<typename Ring::Element>::iterator p1;
-
-
-			for (p1 = x. begin(); p1 != x. end(); ++ p1, ++ ii) {
-
-				if (PIR.isZero(Ap[ii][ii]))
-
-					R.assign (*p1, s);
-
-				else
-
-					R.assign (*p1, NTL::rep(Ap[ii][ii]));
-			}
-		}
-
-		else {
-
-			report << "Using PIRModular<int32_t>\n";
-
-			PIRModular<int32_t> PIR( (int32_t)(s % LINBOX_MAX_MODULUS));
-
-			BlasMatrix<PIRModular<int32_t> > Ap(PIR, A.rowdim(), A.coldim());
-
-			MatrixHom::map (Ap, A, PIR);
-
-			SmithFormIliopoulos::smithFormIn (Ap);
-
-
-			report << "Computed Smith form: \n";
-
-			for ( unsigned int ii = 0; ii < A. rowdim(); ++ ii)
-				report << Ap[ii][ii] << " ";
-
-			report << '\n';
-
-
-			typename std::vector<typename Ring::Element>::iterator p1;
-			int ii = 0;
-
-			for (p1 = x. begin(); p1 != x. end(); ++ p1, ++ ii) {
-				if (PIR.isZero(Ap[ii][ii]))
-					R.assign (*p1, s);
-				else
-					R.init (*p1, Ap[ii][ii]);
-			}
-		}
-
-		typename std::vector<typename Ring::Element>::iterator p1, p2;
-
-		typename Ring::Element g;
-
-		for (p1 = d.begin(); p1 != d.end(); ++ p1) {
-
-			for ( p2 = p1 + 1; p2 != d.end(); ++ p2) {
-
-				if (R. isUnit(*p1))  break;
-
-				else if (R. isZero (*p2)) continue;
-
-				else if (R. isZero (*p1)) {
-                                                std::swap (*p1, *p2);
-				}
-
-				else {
-					R. gcd (g, *p1, *p2);
-
-					R. divin (*p2, g);
-
-					R. mulin (*p2, *p1);
-
-					R. assign (*p1, g);
-				}
-			}
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+
+	BlasMatrixDomain<Ring> BMD(R);
+	BlasMatrix<Ring> D(R, n, n), L(R, n, n), U(R, n, n), A(R,n,n);
+
+	// D is Smith Form
+	const int m = 16;
+	int p[m] = {1,1,1,1,1,1,2, 2, 2, 4, 3, 3, 3, 5, 7, 101};
+	typename Ring::Element x, y;
+	R.assign(x, R.one);
+	if (n > 0) D.setEntry(0,0,x);
+	for(size_t i = 1; i < n; ++i){
+		R.init(y, p[rand()%m]);
+		D.setEntry(i,i, R.mulin(x, y));
+	}
+	if (n > 0) D.setEntry(n-1,n-1, R.zero);
+
+	// L and U are random unit triangular.
+	for (size_t i = 0; i < n; ++ i) {
+		for (size_t j = 0; j < i; ++ j) {
+			L.setEntry(i,j, R.init(x, rand() % 10));
+			U.setEntry(j,i, R.init(x, rand() % 10));
 		}
-
-
-		report << "Expected smith form:\n";
-
-		for (p1 = d.begin(); p1 != d.end(); ++ p1)
-			report << * p1 << " ";
-
-		report << '\n';
-
-		if (!VD.areEqual (d, x))
-
-			ret = iter_passed = false;
-
-                if (!iter_passed)
-
-                        commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-				<< "ERROR: Computed Smith form is incorrect" << endl;
-
-
-
-                commentator().stop ("done");
-
-                commentator().progress ();
-
-	 }
-
-	 //stream1.reset ();
-
-	  commentator().stop (MSG_STATUS (ret), (const char *) 0, "testRandom");
-
-	  return ret;
+		L.setEntry(i,i, R.one);
+		U.setEntry(i,i, R.one);
+	}
+
+	// A is ULDU
+	BMD.mul(A, U, L);
+	BMD.mulin_left(A, D);
+	BMD.mulin_left(A, U);
+
+	D.write( report << "Smith form matrix:\n  " ) << endl;
+	A.write( report << "input matrix:\n " ) << endl;
+//	SmithFormIliopoulos::smithFormIn (A);
+//	A.write( report << "smith of input matrix direct:\n " ) << endl;
+
+	report << "Using PIRModular<int32_t>\n";
+	typename Ring::Element d; R.init(d,16*101);//16*101*5*7*9);
+	for (size_t i = 0; i < n-1; ++i) R.mulin(d, D.getEntry(x, i, i));
+	R.write(report << "modulus: ", d) << endl;
+	//det(d, D);
+	//PIRModular<int32_t> Rd( (int32_t)(s % LINBOX_MAX_MODULUS));
+	PIRModular<int32_t> Rp( (int32_t)d);
+	BlasMatrix<PIRModular<int32_t> > Ap(Rp, n, n), Dp(Rp, n, n);
+	MatrixHom::map (Ap, A);
+
+	SmithFormIliopoulos::smithFormIn (Ap);
+
+	Ap.write( report << "Computed Smith form: \n") << endl;
+	MatrixHom::map (Dp, D);
+	BlasMatrixDomain<PIRModular<int32_t> > BMDp(Rp);
+	pass = pass and BMDp.areEqual(Dp, Ap);
+
+	commentator().stop (MSG_STATUS (pass), (const char *) 0, "testRandom");
+	return pass;
 
 }
 
@@ -279,31 +155,21 @@ int main(int argc, char** argv)
         using namespace LinBox;
 
         bool pass = true;
-
-        static size_t n = 20;
-
-        static int iterations = 1;
-
+        static size_t n = 2;
         static Argument args[] = {
                 { 'n', "-n N", "Set order of test matrices to N.", TYPE_INT,     &n },
-                { 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
 		END_OF_ARGUMENTS
         };
-
-
         parseArguments (argc, argv, args);
 
-        typedef NTL_ZZ      Ring;
-
-        Ring R;
-
 	commentator().start("Ilioloulos Smith Form test suite", "Ilioloulos");
-
         commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (5);
 
-        RandomDenseStream<Ring> s1 (R, n, iterations);
+        Givaro::ZRing<Integer> R; // Ring of integers
+        //NTL_ZZ R;
 
-        if (!testRandom(R, s1)) pass = false;
+        if (!testRandom(R, n)) pass = false;
+//        if (!testRead(R, "data/Ismith.mat")) pass = false;
 
 	commentator().stop("Ilioloulos Smith Form test suite");
         return pass ? 0 : -1;
@@ -311,11 +177,10 @@ int main(int argc, char** argv)
 }
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-smith-form-kannan-bachem.C b/tests/test-smith-form-kannan-bachem.C
new file mode 100644
index 0000000..48461a4
--- /dev/null
+++ b/tests/test-smith-form-kannan-bachem.C
@@ -0,0 +1,74 @@
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <vector>
+//#include <omp.h>
+
+//#define LINBOX_USES_OMP 1
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+
+#include "givaro/givpoly1.h"
+#include "linbox/ring/givaro-poly.h"
+#include "linbox/algorithms/smith-form-kannan-bachem.h"
+
+using namespace std;
+using namespace LinBox;
+
+int main(int argc, char **argv) {
+	typedef Givaro::Modular<double> Field;
+	typedef Givaro::Poly1Dom<Field,Givaro::Dense> PolyDom;
+	typedef GivaroPoly<PolyDom> PolyRing;
+	typedef PolyRing::Element Element;
+	typedef DenseVector<PolyRing> PolyVector;
+	typedef MatrixDomain<PolyRing> PolyMatDom;
+	typedef typename PolyMatDom::OwnMatrix Matrix;
+	
+	int p = 3;
+	int n = 3;
+	
+	Field F(p);
+	PolyDom PD(F,"x");
+	PolyRing R(PD);
+	PolyMatDom PMD(R);
+	
+	Matrix M(R, n, n);
+	
+	Element a; // x + 2
+	R.init(a, 5);
+	
+	Element b; // 2
+	R.init(b, 2);
+	
+	Element c; // x
+	R.init(c, 3);
+	
+	M.setEntry(0,0,a);
+	M.setEntry(0,1,b);
+	M.setEntry(0,2,b);
+	
+	M.setEntry(1,1,c);
+	
+	M.setEntry(2,2,c);
+	
+	SmithFormKannanBachemDomain<PolyMatDom> SFKB(PMD);
+	
+	PolyVector factors(R);
+	factors.resize(n);
+	
+	SFKB.solve(factors, M);
+	
+	R.init(a, 1);
+	R.init(b, 3);
+	R.init(c, 15);
+	
+	bool pass = true;
+	
+	pass = pass && R.areEqual(a, factors[0]);
+	pass = pass && R.areEqual(b, factors[1]);
+	pass = pass && R.areEqual(c, factors[2]);
+	
+	return pass ? 0 : -1;
+}
\ No newline at end of file
diff --git a/tests/test-smith-form-local.C b/tests/test-smith-form-local.C
index a9fd850..c582ee1 100644
--- a/tests/test-smith-form-local.C
+++ b/tests/test-smith-form-local.C
@@ -4,20 +4,20 @@
  * Written by David Saunders
  *
  * --------------------------------------------------------
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -36,15 +36,16 @@
 
 #include "linbox/linbox-config.h"
 
-#include <vector>
+
 #include <functional>
 
 #include "test-common.h"
+#include "test-field.h"
 
 #include "linbox/util/commentator.h"
-#include "linbox/field/PIR-modular-int32.h"
-//#include "linbox/field/PIR-modular-double.h"
-#include "linbox/field/local2_32.h"
+#include "linbox/ring/local-pir-modular.h"
+#include "linbox/ring/pir-modular-int32.h"
+#include "linbox/ring/local2_32.h"
 #include "linbox/algorithms/smith-form-local.h"
 #include "linbox/matrix/matrix-domain.h"
 #include "linbox/util/timer.h"
@@ -63,39 +64,11 @@ using namespace LinBox;
  */
 
 template <class LocalPIR>
-class foobar {
-public:
-	typedef typename LocalPIR::Element first_argument_type;
-	typedef LocalPIR second_argument_type;
-	typedef void result_type;
-	void operator()(typename LocalPIR::Element& d, const LocalPIR& R) const
-	{
-		typename LocalPIR::Element x; R.init(x, 2);  R.mulin(x, d);
-		if (R.isUnit(d)) R.divin(d, d);
-		else R.gcd(d, d, x);
-	}
-};
-
-template<>
-class foobar<LinBox::Local2_32> {
-public:
-	typedef LinBox::Local2_32 LocalPIR;
-
-	typedef LocalPIR::Element first_argument_type;
-	typedef LocalPIR second_argument_type;
-	typedef void result_type;
-	void operator()(LocalPIR::Element& d, const LocalPIR& R) const
-	{
-		if(d != 0)    {
-			int r = 1;
-			while ( !(d & 1) ) {
-				d >>= 1;
-				r <<= 1;
-			}
-			d = r;
-		}
-	}
-};
+typename LocalPIR::Element &
+normal(typename LocalPIR::Element &d, LocalPIR & R)
+{	typename LocalPIR::Element x; R.init(x, 2);  R.mulin(x, d);
+	return R.gcdin(d, x);
+}
 
 template <class LocalPIR>
 class pplt { // prime power less than
@@ -111,24 +84,6 @@ public:
 	LocalPIR _R_;
 };
 
-#if 0
-template<>
-class pplt<LinBox::NTL_PID_zz_p> {
-public:
-	typedef LinBox::NTL_PID_zz_p LocalPIR;
-
-	pplt(LocalPIR R) : _R_(R){}
-	bool operator() (LocalPIR::Element a, LocalPIR::Element b)
-	{
-		if ( b == 0 ) return true;
-		else if ( a == 0 ) return false;
-		else return NTL::rep(a) <= NTL::rep(b);
-	}
-	//protected:
-	LocalPIR _R_;
-};
-#endif
-
 template <class LocalPIR>
 static bool testLocalSmith (const LocalPIR &R, vector<typename LocalPIR::Element>& d, string s)
 {
@@ -152,15 +107,16 @@ static bool testLocalSmith (const LocalPIR &R, vector<typename LocalPIR::Element
 	// set up A equiv diag d.
 	Blackbox L (R, n, n), D (R, n, n), U (R, n, n), A (R, n, n);
 	for( i = 0; i < n; ++i )
-		{ D[i][i] = d[i]; L[i][i]=U[i][i]=1; }
+		{ R.assign(D[i][i], d[i]); L[i][i]=U[i][i]=R.one; }
 	for (i = 0; i < n; ++ i)
 		for ( j = 0; j < i; ++ j) {
-			D[i][j] = D[j][i] = 0;
-			L[i][j] = rand() % 10;
-			L[j][i] = 0;
-			U[j][i] = rand() % 10;
-			U[i][j] = 0;
+			R.assign(D[i][j], R.assign(D[j][i], 0));
+			R.assign(L[i][j], rand() % 10);
+			R.assign(L[j][i], 0);
+			R.assign(U[j][i], rand() % 10);
+			R.assign(U[i][j], 0);
 		}
+		
 	MR.mul(A,L,D);
 	MR.mulin(A,U);
 
@@ -181,7 +137,7 @@ static bool testLocalSmith (const LocalPIR &R, vector<typename LocalPIR::Element
 
 	// figure true invariants
 	pplt<LocalPIR> lt(R);
-	for_each(d.begin(), d.end(), bind2nd(foobar<LocalPIR>(), R));
+	for (size_t i = 0; i < d.size(); ++i) normal(d[i], R);
 	stable_sort(d.begin(), d.end(), lt);
 	report << "True invariants: ";
 	VD.write (report, d) << endl; report.flush();
@@ -194,23 +150,24 @@ static bool testLocalSmith (const LocalPIR &R, vector<typename LocalPIR::Element
 			report << "ERROR: Computed invariants incorrect" << endl;
 			ret = false;
 		}
-		commentator().progress();
+		//commentator().progress();
 	}
 	return ret;
 }
 
 int main (int argc, char **argv)
 {
-	bool pass = true, pass1 = true;
+	bool pass1 = true, pass2 = true;
 
-	static size_t n = 6;
-	static integer q = 101;
-	static int iterations = 1;
+	static int64_t n = 6;
+	static size_t q = 3; 
+	static int32_t e = 4;
+	//static integer q = 10201; // 101^2
 
 	static Argument args[] = {
 		{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT,     &n },
-		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
-		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
+		{ 'q', "-q Q", "Operate over the ring Z/q^eZ.", TYPE_INT, &q },
+		//{ 'q', "-q Q", "Operate over the ring Z/qZ.", TYPE_INTEGER, &q },
 		END_OF_ARGUMENTS
 	};
 
@@ -219,58 +176,78 @@ int main (int argc, char **argv)
 	commentator().start("Local Smith Form test suite", "LocalSmith");
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (5);
 	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+	report << "q = " << q << std::endl;
+#if 1
+  { // zero-th local ring type: modulus p^e as integer.
+	typedef LocalPIRModular<integer> Ring;
+	Ring R (q, e);
+	vector<Ring::Element> d(n);
+
+	commentator().start ("Testing local smith over LocalPIRModular<integer>", "local smith");
+	for( int32_t i = 0; i < n; ++i ) R.init(d[i],i);
+	pass1 = testLocalSmith<Ring> (R, d, "LocalPIRModular<integer>");
+	commentator().stop ("local smith");
+	if (not pass1) report << "LocalPIRModular smith FAIL" << std::endl;
 
-#if 0
-//PIRModular does not currently support the local ring interface -bds Mar2011
-  { // first local ring type
-	typedef PIRModular<int32_t> LocalPID;
-	LocalPID R (536870912); // 2^32
-	//typedef PIRModular<dense> LocalPID;
-	//LocalPID R (32768);
-	vector<LocalPID::Element> d(n);
+  }
+#endif
+  { // first local ring type: modulus p^e as int32_t.
+	typedef PIRModular<int32_t> LocalPIR;
+	//typedef PIRModular<dense> LocalPIR;
+	//LocalPIR R (81); 
+	LocalPIR R (q, e);
+	vector<LocalPIR::Element> d(n);
 
 	commentator().start ("Testing local smith on singular dense mat over PIRModular", "testSingular");
-	for( size_t i = 0; i < n; ++i ) d[i] = i;
-	if (!testLocalSmith<LocalPID> (R, d, "PIRModular<int32_t>")) pass1 = false;
+	for( int32_t i = 0; i < n; ++i ) R.init(d[i],i);
+	pass1 = testLocalSmith<LocalPIR> (R, d, "PIRModular<int32_t>");
 	commentator().stop ("testSingular");
+	if (not pass1) report << "PIRModular sing FAIL" << std::endl;
 
 	commentator().start ("Testing local smith on nonsingular dense mat over PIRModular", "testNonsingular");
-	for( size_t i = 0; i < n; ++i ) d[i] = i+1;
-	if (!testLocalSmith<LocalPID> (R, d, "PIRModular<int32_t>")) pass1 = false;
+	LocalPIR::RandIter r(R);
+	LocalPIR::Element e; R.init(e);
+	for( int32_t i = 0; i < n; ++i ) {	
+		r.random(e);
+		do { r.random(e); } while (R.isZero(e));
+		R.assign(d[i], e);
+	}
+	bool p = testLocalSmith<LocalPIR> (R, d, "PIRModular<int32_t>");
+	if (not p) report << "PIRModular nonsing FAIL" << std::endl;
 	commentator().stop ("testNonsingular");
+	pass1 = pass1 and p;
+	if (not pass1) report << "PIRModular FAIL" << std::endl;
   }
-  if (not pass1) report << "PIRModular FAIL" << std::endl;
-#endif
 
-  { // second local ring type
-	typedef Local2_32 LocalPID;
-	LocalPID R;
-	vector<LocalPID::Element> d(n);
+  { // second local ring type: m = 2^32
+	typedef Local2_32 LocalPIR;
+	LocalPIR R;
+	vector<LocalPIR::Element> d(n);
 
 	commentator().start ("Testing local smith on singular dense mat over Local2_32", "testSingular");
-	for( size_t i = 0; i < n; ++i )
-		d[i] = (LocalPID::Element) i;
-	if (!testLocalSmith<LocalPID> (R, d, "Local2_32")) pass = false;
+	for( int64_t i = 0; i < n; ++i )
+		d[i] = (LocalPIR::Element) i;
+	if (!testLocalSmith<LocalPIR> (R, d, "Local2_32")) pass2 = false;
 	commentator().stop ("testSingular");
 
 	commentator().start ("Testing local smith on nonsingular dense mat over Local2_32", "testNonsingular");
-	for( size_t i = 0; i < n; ++i )
-		d[i] = (LocalPID::Element) i+1;
-	if (!testLocalSmith<LocalPID> (R, d, "Local2_32")) pass = false;
+	for( int64_t i = 0; i < n; ++i )
+		d[i] = (LocalPIR::Element) i+1;
+	if (!testLocalSmith<LocalPIR> (R, d, "Local2_32")) pass2 = false;
 	commentator().stop ("testNonsingular");
+	if (not pass2) report << "Local2_32 FAIL" << std::endl;
   }
-  if (not pass) report << "PIRModular FAIL" << std::endl;
 
 	commentator().stop("Local Smith Form test suite");
-	return pass and pass1 ? 0 : -1;
+	return pass1 and pass2 ? 0 : -1;
 }
 
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
 
diff --git a/tests/test-smith-form.C b/tests/test-smith-form.C
index 6fcfa96..a986fe2 100644
--- a/tests/test-smith-form.C
+++ b/tests/test-smith-form.C
@@ -26,23 +26,27 @@
  * @ingroup tests
  * @brief no doc.
  * @test no doc.
+	//!@bug should work for NTL Integers too
  */
 
 
+#include <linbox/linbox-config.h>
+
 #include <time.h>
-//#ifdef __LINBOX_HAVE_NTL
-//#include "linbox/field/ntl-ZZ.h"
-//#endif
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
+#include "givaro/givinteger.h"
 #include "linbox/util/commentator.h"
 #include "linbox/vector/stream.h"
 #include "test-common.h"
+#include "linbox/vector/blas-vector.h"
 #include "linbox/solutions/smith-form.h"
 using LinBox::parseArguments;
 using LinBox::commentator;
 using LinBox::Commentator;
-using LinBox::integer;
+using Givaro::Integer;
+using Givaro::ZRing;
 using LinBox::BlasMatrix;
+using LinBox::BlasVector;
 
 template <class Ring, class Vector>
 bool testRandom(const Ring& R,
@@ -56,11 +60,10 @@ bool testRandom(const Ring& R,
         commentator().start (str.str ().c_str (), "testRandom");//, stream1.m ());
 
         bool ret = true;
-        bool iter_passed = true;
 
         LinBox::VectorDomain<Ring> VD (R);
 
-	Vector d, x;
+	Vector d(R), x(R);
 
 	LinBox::VectorWrapper::ensureDim (d, stream1.n ());
 
@@ -75,7 +78,7 @@ bool testRandom(const Ring& R,
 
 		std::ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
 
-                iter_passed = true;
+                bool iter_passed = true;
 
                 stream1.next (d);
 
@@ -83,26 +86,26 @@ bool testRandom(const Ring& R,
 		VD.write (report, d);
                 report << endl;
 
-		BlasMatrix<Ring> D(R, n, n), L(R, n, n), U(R, n, n), A(R,n,n);
+		BlasMatrix<Ring> D(R, (size_t)n, (size_t)n), L(R, (size_t)n, (size_t)n), U(R, (size_t)n, (size_t)n), A(R,(size_t)n,(size_t)n);
 
 		int i, j;
 
 		for(i = 0; i < n; ++i) {
-			R. assign (D[i][i], d[i]);
-			R. init (L[i][i], 1);
-			R. init (U[i][i], 1);}
+			R. assign (D[(size_t)i][(size_t)i], d[(size_t)i]);
+			R. assign(L[(size_t)i][(size_t)i], R.one);
+			R. assign(U[(size_t)i][(size_t)i], R.one);}
 
 		for (i = 0; i < n; ++ i)
 
 			for (j = 0; j < i; ++ j) {
 
-				R.init(L[i][j], rand() % 10);
+				R.init(L[(size_t)i][(size_t)j], rand() % 10);
 
-				R.init(U[j][i], rand() % 10);
+				R.init(U[(size_t)j][(size_t)i], rand() % 10);
 			}
 
 
-		std::vector<typename Ring::Element> tmp1(n), tmp2(n), e(n);
+		BlasVector<Ring> tmp1(R,(size_t)n), tmp2(R,(size_t)n), e(R,(size_t)n);
 
 		typename BlasMatrix<Ring>::ColIterator col_p;
 
@@ -110,19 +113,22 @@ bool testRandom(const Ring& R,
 		for (col_p = A.colBegin();
 		     col_p != A.colEnd(); ++ col_p, ++ i) {
 
-			R.init(e[i],1);
+			R.assign(e[(size_t)i],R.one);
 			U.apply(tmp1, e);
 			D.apply(tmp2, tmp1);
-			L.apply(*col_p, tmp2);
-			R.init(e[i],0);
+			// LinBox::BlasSubvector<BlasVector<Ring> > col_p_v (R, *col_p);
+			// L.apply(col_p_v, tmp2);
+			L.apply(*col_p, tmp2); //! @internal @bug  should use Triangular apply ? We are doing this many times, factor somewhere in test-utils.h ? why not some ftrtr routine for that ?
+			R.assign(e[(size_t)i],R.zero);
 		}
 
 		typename Vector::iterator x_p;
-		std::vector<integer> xi(A. rowdim());
-		std::vector<integer>::iterator xi_p;
-		std::list<std::pair<integer, size_t> > cpt;
+		Givaro::ZRing<Integer> Z;
+		BlasVector<Givaro::ZRing<Integer> > xi(Z,A. rowdim());
+		BlasVector<Givaro::ZRing<Integer> >::iterator xi_p;
+		std::list<std::pair<Integer, size_t> > cpt;
 		smithForm (cpt, A);
-		std::list<std::pair<integer, size_t> >::iterator cpt_p;
+		std::list<std::pair<Integer, size_t> >::iterator cpt_p;
 
 		xi_p = xi. begin();
 		for (cpt_p = cpt.begin(); cpt_p != cpt.end(); ++ cpt_p) {
@@ -138,7 +144,7 @@ bool testRandom(const Ring& R,
 
 		report << '\n';
 
-		typename std::vector<typename Ring::Element>::iterator p1, p2;
+		typename BlasVector<Ring>::iterator p1, p2;
 		typename Ring::Element g;
 
 		for (p1 = d.begin(); p1 != d.end(); ++ p1) {
@@ -189,29 +195,39 @@ int main(int argc, char** argv)
 	};
 
 	parseArguments (argc, argv, args);
-//#ifdef __LINBOX_HAVE_NTL
-//	typedef LinBox::NTL_ZZ      Ring;
-//#else
-	typedef LinBox::PID_integer      Ring;
-//#endif
-	Ring R;
+	//!@bug should be tried on NTZ_LL too
+	typedef Givaro::ZRing<Integer>      Ring;
+
+	Ring R; Ring::RandIter gen(R);
+    
 
 	commentator().start("Smith form test suite", "Smith");
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (5);
 
-	LinBox::RandomDenseStream<Ring> s1 (R, n, iterations);
+	LinBox::RandomDenseStream<Ring> s1 (R, gen, n, (unsigned int)iterations);
 	if (!testRandom(R, s1)) pass = false;
 
+#if 0
+#ifdef __LINBOX_HAVE_NTL
+	typedef LinBox::NTL_ZZ      Ring2; 
+	Ring2 R2;Ring2::RandIter gen2(R2);
+
+	LinBox::RandomDenseStream<Ring2> s2 (R2, gen2, n, (unsigned int)iterations);
+	if (!testRandom(R2, s2)) pass = false;
+
+#endif
+#endif
+
 	commentator().stop("Smith form test suite");
 	return pass ? 0 : -1;
 
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
 
diff --git a/tests/test-solve-nonsingular.C b/tests/test-solve-nonsingular.C
index 59d7a93..53ed65c 100644
--- a/tests/test-solve-nonsingular.C
+++ b/tests/test-solve-nonsingular.C
@@ -24,6 +24,8 @@
 /* File: solve-nonsigular.C
 	This file was used to generate solver comparison data for the paper "Symbolic-Numeric Exact Rational Linear System Solver" submitted to ISSAC'11
 */
+#include <linbox/linbox-config.h>
+
 
 #include <iostream>
 #include <fstream>
@@ -34,7 +36,7 @@
 #include "linbox/algorithms/rational-solver.h"
 #include "linbox/randiter/random-prime.h"
 
-#include "linbox/field/PID-integer.h"
+#include "givaro/zring.h"
 #include "linbox/field/param-fuzzy.h"
 #include "tests/test-common.h"
 #include "linbox/vector/stream.h"
@@ -96,7 +98,7 @@ void generateProblem(const Ring& R, Matrix &D, Vector &b,
 		int k = 10)
 {
 
-	Vector d, x, y;
+	Vector d(R), x(R), y(R);
 	VectorWrapper::ensureDim (d, stream1.n ());
 	VectorWrapper::ensureDim (b, stream1.n ());
 	VectorWrapper::ensureDim (x, stream1.n ());
@@ -104,14 +106,14 @@ void generateProblem(const Ring& R, Matrix &D, Vector &b,
 
 	std::ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
 
-	int n =(int) d.size();
+	size_t n = d.size();
 
 	bool zeroEntry;
 	do {
 		stream1.next (d);
 		zeroEntry = false;
 		for (size_t i=0; i<stream1.n(); i++)
-			zeroEntry |= R.isZero(d[i]);
+			zeroEntry |= R.isZero(d[(size_t)i]);
 	} while (zeroEntry);
 
 	//  set up RHS
@@ -124,8 +126,8 @@ void generateProblem(const Ring& R, Matrix &D, Vector &b,
 		case I:
 		case diag: stream2.next (b);
 			//  special case?
-			if (n == 4) for (size_t i = 0; i < b.size(); ++i) b[i] = 2*(i+1);
-			for (size_t i = 0; i < b.size(); ++i) b[i] %= randLim;
+			if (n == 4) for (size_t i = 0; i < b.size(); ++i) b[(size_t)i] = 2*(i+1);
+			for (size_t i = 0; i < b.size(); ++i) b[(size_t)i] %= randLim;
 			break;
 		//  RHS with just first element 1
 		//case zo:
@@ -148,7 +150,7 @@ void generateProblem(const Ring& R, Matrix &D, Vector &b,
 	typename Ring::Element tmp;
  	switch (mt) {
 		case rand_near_sing: randomAns(R, D, n, n); break;
-		case hilb: invhilb(R, D, n); break;
+		case hilb: invhilb(R, D, (int)n); break;
 		case Hadamard: hadamard(R, D, n); break;
 		case minIJ: minmat(R, D, n); break;
 		case maxIJ: maxmat(R, D, n); break;
@@ -156,7 +158,7 @@ void generateProblem(const Ring& R, Matrix &D, Vector &b,
 		case je1:
 		case je2: jordanform(R, D, n); break;
 		case rand_sp:
-			randomMat(R, D, n, k); break;
+			randomMat(R, D, n, (size_t)k); break;
 			//  modified for steffy's random model
 			/*
 			randomMat(R, D, n, n);
@@ -168,42 +170,42 @@ void generateProblem(const Ring& R, Matrix &D, Vector &b,
 		case diag:
 		  {
 		  //typename Ring::Element product;
-		  //R.init(product, 1);
+		  //R.assign(product, R.one);
 		  randLim = 100000;
-		  for(int i = 0; i < n; ++i) {
-		    int xx = d[i]%randLim;
+		  for(int i = 0; i < (int)n; ++i) {
+		    int xx = d[(size_t)i]%randLim;
 			if (xx == 0) xx = 1;
 			R.init (tmp,  xx);
 			//R.mulin(product, tmp);
 			//if (n == 4) tmp = i+1;
 			//if (tmp == 4) tmp = -4;
-			D.setEntry(i, i, tmp);
+			D.setEntry((size_t)i, (size_t)i, tmp);
 		  }
 		  }
 		  break;
 		case tref: //trefethen(R, D, n); break;
 		case I:
-			R.init(tmp, 1);
-			for(int i = 0; i < n; ++i)
-				D.setEntry(i, i, tmp);
+			R.assign(tmp, R.one);
+			for(int i = 0; i < (int)n; ++i)
+				D.setEntry((size_t)i, (size_t)i, tmp);
 			break;
 		case jordan2:
 			//randomMat(R, D, n, n);
-			for(int i = 0; i < n; ++i){
-				R.init(tmp, 1);
-				D.setEntry(i, i, tmp);
-				R.init(tmp, 0);
-				for(int j = i+1; j < n; ++j)
-					D.setEntry(i, j, tmp);
+			for(int i = 0; i < (int)n; ++i){
+				R.assign(tmp, R.one);
+				D.setEntry((size_t)i, (size_t)i, tmp);
+				R.assign(tmp, R.zero);
+				for(int j = i+1; j < (int)n; ++j)
+					D.setEntry((size_t)i,(size_t) j, tmp);
 				R.init(tmp, 2);
-				if (i > 0) D.setEntry(i, i-1, tmp);
+				if (i > 0) D.setEntry((size_t)i, (size_t)i-1, tmp);
 			}
 			break;
 		case zo:
-			for(int i = 0; i < n; ++i)
-				for(int j = 0; j < n; ++j){
+			for(int i = 0; i < (int)n; ++i)
+				for(int j = 0; j < (int)n; ++j){
 					R.init(tmp, rand()%2);
-					D.setEntry(i, j, tmp);
+					D.setEntry((size_t)i, (size_t)j, tmp);
 				}
 			break;
 	}
@@ -217,15 +219,15 @@ void generateProblem(const Ring& R, Matrix &D, Vector &b,
 template <class Ring, class RSolver, class Matrix, class Vector>
 bool testRandomSolve (const Ring& R, RSolver& rsolver, Matrix& D, Vector &b) {
 
-	int n = (int) b.size();
-	Vector d, tmpb, x, y;
+	size_t n = (size_t) b.size();
+	Vector d(R), tmpb(R), x(R), y(R);
 	VectorWrapper::ensureDim (d, n);
 	VectorWrapper::ensureDim (x, n);
 	VectorWrapper::ensureDim (y, n);
 	VectorWrapper::ensureDim (tmpb, n);
 	VectorDomain<Ring> VD (R);
 
-	for(int i=0; i<n; ++i) tmpb[i] = b[i];
+	for(int i=0; i<(int)n; ++i) tmpb[(size_t)i] = b[(size_t)i];
 
 	//std::ostringstream str;
 	//std::ostream &report = cerr;
@@ -237,7 +239,7 @@ bool testRandomSolve (const Ring& R, RSolver& rsolver, Matrix& D, Vector &b) {
 		VD.write (report << "Right-hand side:  ", b) << endl;
 	}
 
-	std::vector<typename Ring::Element> num(n);
+	BlasVector<Ring> num(R,n);
 	typename Ring::Element den;
 	Timer timer;
 
@@ -318,28 +320,29 @@ int main(int argc, char** argv) {
 
 	std::ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
 
-	typedef PID_integer	Ring;  		Ring R;
+	typedef Givaro::ZRing<Integer>	Ring;  		
+    Ring R; Ring::RandIter gen(R);
 
 	typedef ParamFuzzy Field;
-	typedef Modular<int32_t> ZField;
-	typedef Modular<double> DField;
+	typedef Givaro::Modular<int64_t> ZField;
+	typedef Givaro::Modular<double> DField;
 
 	typedef BlasMatrix<Field> Matrix;
 	typedef BlasMatrix<Ring> CommonMatrix;
-	typedef vector<Ring::Element> Vector;
+	typedef BlasVector<Ring> Vector;
 
 	if(mt == Hadamard)
 		n = nextPower2(n);
 
-	RandomDenseStream<Ring> s1 (R, n, 1), s2 (R, n, 1);
+	RandomDenseStream<Ring> s1 (R, gen, n, 1), s2 (R, gen, n, 1);
 
 	CommonMatrix A(R, n, n);
-	Vector b(n);
+	Vector b(R,n);
 	generateProblem(R, A, b, s1, s2, mt, (int) k);
 
 	if(run & 1){
 	  if (sizeof(int) < 8) {
-	  	
+
 		report << "numsym: not done.  Requires 64 bit architecture." << std::endl << std::endl;
 	  } else {
 		/*  choose your numerical solver */
@@ -381,13 +384,18 @@ int main(int argc, char** argv) {
 	}
 	pass = pass && part_pass;
 	if(run & 2){
-		RationalSolver<Ring, ZField, RandomPrimeIterator, WanTraits> rsolver(R);
+	  if (sizeof(int) < 8) {
+
+		report << "zw: not done.  Requires 64 bit architecture (maybe, needs checking -bds)." << std::endl << std::endl;
+	  } else {
+		RationalSolver<Ring, ZField, RandomPrimeIterator, NumSymNormTraits> rsolver(R);
 		part_pass = testRandomSolve(R, rsolver, A, b);
 		report << "zw: " << (part_pass ? "pass" : "fail") << std::endl << std::endl;
+	  }
 	}
 	pass = pass && part_pass;
 	if(run & 4){
-		RandomPrimeIterator genprime( 26-(int)ceil(log((double)n)*0.7213475205) );
+		RandomPrimeIterator genprime((unsigned int)( 26-(int)ceil(log((double)n)*0.7213475205) ));
 		RationalSolver<Ring, DField, RandomPrimeIterator, DixonTraits> rsolver(R, genprime);
 		part_pass = testRandomSolve(R, rsolver, A, b);
 		report << "dixon: " << (part_pass ? "pass" : "fail") << std::endl << std::endl;
diff --git a/tests/test-solve.C b/tests/test-solve.C
index d09d143..da555d2 100644
--- a/tests/test-solve.C
+++ b/tests/test-solve.C
@@ -6,20 +6,20 @@
  *
  * --------------------------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -38,12 +38,11 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
 #include <cstdio>
 
 #include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/blackbox/sparse.h"
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
 #include "linbox/blackbox/scalar-matrix.h"
 #include "linbox/blackbox/direct-sum.h"
 //#include "linbox/blackbox/diagonal.h"
@@ -85,25 +84,25 @@ static bool testIdentitySolve (const Field          &F,
 	commentator().start (str.str ().c_str (), "testIdentitySolve", stream.m ());
 
 	bool ret = true;
-	bool iter_passed = true;
 
 	VectorDomain<Field> VD (F);
 
 	typename Field::Element s;
-	F.init (s, 1);
-	Blackbox I (F, stream.n (), s);
+	F.assign (s, F.one);
+	Blackbox I (F, stream.n (), stream.n(), s);
 
-	Vector v, w;
+	size_t n = stream.n();
+	Vector v(F,n), w(F,n);
 
-	VectorWrapper::ensureDim (v, stream.n ());
-	VectorWrapper::ensureDim (w, stream.n ());
+	// VectorWrapper::ensureDim (v, stream.n ());
+	// VectorWrapper::ensureDim (w, stream.n ());
 
 	MethodTraits traits (method);
 
 	while (stream) {
 		commentator().startIteration ((unsigned)stream.j ());
 
-		iter_passed = true;
+		bool iter_passed = true;
 
 		stream.next (v);
 
@@ -113,7 +112,8 @@ static bool testIdentitySolve (const Field          &F,
 		report << endl;
 
 		try {
-			solve (I, w, v, F, traits);
+			solve (w, I, v, method);
+			//solve (I, w, v, F, traits);
 		}
 		catch (SolveFailed) {
 			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
@@ -181,14 +181,14 @@ static bool testNonsingularSolve (const Field          &F,
 	VectorDomain<Field> VD (F);
 
 	bool ret = true;
-	bool iter_passed;
 
-	Vector d, b, x, y;
+	size_t n= stream1.n ();
+	Vector d(F,n), b(F,n), x(F,n), y(F,n);
 
-	VectorWrapper::ensureDim (d, stream1.n ());
-	VectorWrapper::ensureDim (b, stream1.n ());
-	VectorWrapper::ensureDim (x, stream1.n ());
-	VectorWrapper::ensureDim (y, stream1.n ());
+	// VectorWrapper::ensureDim (d, stream1.n ());
+	// VectorWrapper::ensureDim (b, stream1.n ());
+	// VectorWrapper::ensureDim (x, stream1.n ());
+	// VectorWrapper::ensureDim (y, stream1.n ());
 
 	MethodTraits traits (method);
 
@@ -197,7 +197,7 @@ static bool testNonsingularSolve (const Field          &F,
 
 		ActivityState state = commentator().saveActivityState ();
 
-		iter_passed = true;
+		bool iter_passed = true;
 
 		stream1.next (d);
 		stream2.next (b);
@@ -211,10 +211,11 @@ static bool testNonsingularSolve (const Field          &F,
 		VD.write (report, b);
 		report << endl;
 
-		Blackbox D (F, d);
+		BlasVector<Field> dd(F,d);
+		Blackbox D (dd);
 
 		try {
-			solve (D, x, b, F, traits);
+			solve (x, D, b, method);
 		}
 		catch (SolveFailed) {
 			commentator().restoreActivityState (state);
@@ -294,7 +295,6 @@ static bool testSingularConsistentSolve (const Field          &F,
 	VectorDomain<Field> VD (F);
 
 	bool ret = true;
-	bool iter_passed;
 
 	Vector d1, b1, d, b, x, y;
 
@@ -313,7 +313,6 @@ static bool testSingularConsistentSolve (const Field          &F,
 
 		ActivityState state = commentator().saveActivityState ();
 
-		iter_passed = true;
 
 		stream1.next (d1);
 		stream2.next (b1);
@@ -330,9 +329,12 @@ static bool testSingularConsistentSolve (const Field          &F,
 		VD.write (report, b);
 		report << endl;
 
-		Blackbox D (F, d);
+		BlasVector<Field> dd(F,d);
+		Blackbox D (dd);
+		//Blackbox D (d);
 
 		try {
+			bool iter_passed = true;
 			solve (D, x, b, F, traits);
 
 			report << "System solution:  ";
@@ -446,7 +448,9 @@ static bool testSingularInconsistentSolve (const Field          &F,
 		VD.write (report, b);
 		report << endl;
 
-		Blackbox D (F, d);
+		BlasVector<Field> dd(F,d);
+		Blackbox D (dd);
+		//Blackbox D (d);
 
 		status = solve (D, x, b, u, F, traits);
 
@@ -523,8 +527,6 @@ static bool testSingularPreconditionedSolve (const Field                  &F,
 					     const char                   *text,
 					     Method::Wiedemann::Preconditioner preconditioner)
 {
-	typedef SparseMatrix <Field> Blackbox;
-
 	ostringstream str;
 	str << "Testing singular preconditioned solve (" << text << ")";
 
@@ -545,9 +547,7 @@ static bool testSingularPreconditionedSolve (const Field                  &F,
 	VectorWrapper::ensureDim (x, stream2.dim ());
 	VectorWrapper::ensureDim (y, stream2.dim ());
 
-	typename Field::Element one;
 
-	F.init (one, 1);
 
 	Method::Wiedemann traits;
 	traits.preconditioner (preconditioner);
@@ -569,7 +569,9 @@ static bool testSingularPreconditionedSolve (const Field                  &F,
 		VD.write (report, b);
 		report << endl;
 
-		Diagonal<Field> A (F, d);
+		BlasVector<Field> dd(F,d);
+		Diagonal<Field> A (dd);
+		//Diagonal<Field> A (F, d);
 
 		status = solve (A, x, b, u, F, traits);
 
@@ -640,7 +642,6 @@ static bool testRandomSolve (const Field                  &F,
 	commentator().start (str.str ().c_str (), "testRandomSolve", b_stream.size ());
 
 	bool ret = true;
-	bool iter_passed = true;
 
 	VectorDomain<Field> VD (F);
 	MatrixDomain<Field> MD (F);
@@ -653,7 +654,7 @@ static bool testRandomSolve (const Field                  &F,
 	VectorWrapper::ensureDim (ATb, A_stream.dim ());
 
 	SparseMatrix<Field> A (F, A_stream);
-	SparseMatrixBase<typename Field::Element> AT (A.coldim (), A.rowdim ());
+	SparseMatrix<Field> AT (F,A.coldim (), A.rowdim ());
 	BlasMatrix<Field> ATA (A.coldim (), A.coldim ());
 
 	A.transpose (AT);
@@ -672,7 +673,7 @@ static bool testRandomSolve (const Field                  &F,
 	while (b_stream) {
 		commentator().startIteration ((unsigned)b_stream.pos ());
 
-		iter_passed = true;
+		bool iter_passed = true;
 
 		b_stream >> b;
 
@@ -729,12 +730,10 @@ static bool testBasicMethodsSolve (const Field &F, size_t n)
 	commentator().start ("Testing Basic Methods Solve");
 	ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
 
-	typedef typename Field::Element Elt;
-	Elt one, zero; F.init(one, 1); F.init(zero, 0);
-	vector<Elt> xd(n), xh(n), xb(n), xe(n), b(n, zero);
-	for(size_t i = 0; i < n/2; ++i) b[i] = one;
-	//ScalarMatrix<Field> I(F, n/2, one), Z(F, n/2, zero);
-	ScalarMatrix<Field> I(F, n, one), Z(F, 0, zero);
+	BlasVector<Field> xd(F,n), xh(F,n), xb(F,n), xe(F,n), b(F,n, F.zero);
+	for(size_t i = 0; i < n/2; ++i) b[i] = F.one;
+	//ScalarMatrix<Field> I(F, n/2, F.one), Z(F, n/2, F.zero);
+	ScalarMatrix<Field> I(F, n, n, F.one), Z(F, 0, 0, F.zero);
 	DirectSum<ScalarMatrix<Field>, ScalarMatrix<Field> > A(I, Z);
 
 	VectorDomain<Field> VD(F);
@@ -765,7 +764,7 @@ int main (int argc, char **argv)
 	static size_t m = 100;
 	static size_t r = 20;
 	static size_t N = 16;
-	static integer q = 2147483647U;
+	static integer q = 65521U;
 	static int iterations = 1;
 
 	static Argument args[] = {
@@ -778,10 +777,10 @@ int main (int argc, char **argv)
 		END_OF_ARGUMENTS
 	};
 
-	typedef Modular<uint32_t> Field;
+	typedef Givaro::Modular<int64_t> Field;
 
 	parseArguments (argc, argv, args);
-	Field F (q);
+	Field F (q); Field::RandIter gen(F);
 
 	commentator().start("Solve test suite", "solve");
 
@@ -792,18 +791,24 @@ int main (int argc, char **argv)
 	commentator().getMessageClass (PROGRESS_REPORT).setMaxDepth (5);
 	//commentator().getMessageClass (BRIEF_REPORT).setMaxDepth (4);
 
-	RandomDenseStream<Field> stream1 (F, n, iterations), stream2 (F, n, iterations);
-	RandomDenseStream<Field> stream3 (F, r, iterations), stream4 (F, r, iterations);
-	RandomSparseStream<Field> stream6 (F, (double) r / (double) n, n, iterations);
-	RandomSparseStream<Field> A_stream (F, (double) r / (double) n, n, m);
+	RandomDenseStream<Field> stream1 (F, gen, n, (unsigned int)iterations), stream2 (F, gen, n, (unsigned int)iterations);
+	RandomDenseStream<Field> stream3 (F, gen, r, (unsigned int)iterations), stream4 (F, gen, r, (unsigned int)iterations);
+	RandomSparseStream<Field> stream6 (F, gen, (double) r / (double) n, n, (unsigned int)iterations);
+	RandomSparseStream<Field> A_stream (F, gen, (double) r / (double) n, n, m);
 
-	if (!testIdentitySolve               (F, stream1,
-// 					      "BlockLanczos", Method::BlockLanczos()))
-					      "Wiedemann", Method::Wiedemann ()))
+	Method::Wiedemann WM;
+	if (!testIdentitySolve               (F, stream1, "Wiedemann", WM))
 		pass = false;
-	if (!testNonsingularSolve            (F, stream1, stream2,
-					      "Wiedemann", Method::Wiedemann ()))
+	if (!testNonsingularSolve            (F, stream1, stream2, "Wiedemann", WM))
+		pass = false;
+#if 1
+	Method::BlockWiedemann BWM;
+	if (!testIdentitySolve               (F, stream1, "BlockWiedemann", BWM))
+		pass = false;
+	if (!testNonsingularSolve            (F, stream1, stream2, "BlockWiedemann", BWM))
 		pass = false;
+#endif
+
 #if 0
 	if (!testSingularConsistentSolve     (F, n, stream3, stream4,
 					      "Wiedemann", Method::Wiedemann ()))
@@ -811,9 +816,15 @@ int main (int argc, char **argv)
 	if (!testSingularInconsistentSolve   (F, stream3, stream2,
 					      "Wiedemann", Method::Wiedemann ()))
 		pass = false;
+#endif
+
+#if 0
 	if (!testSingularPreconditionedSolve (F, stream6, stream2,
 					      "Sparse preconditioner", Method::Wiedemann::SPARSE))
 		pass = false;
+#endif
+
+#if 0
 	if (!testIdentitySolve               (F, stream1,
 					      "Lanczos", Method::Lanczos ()))
 		pass = false;
@@ -829,8 +840,9 @@ int main (int argc, char **argv)
 
 	if (!testRandomSolve (F, A_stream, stream1, "Lanczos", traits1))
 		pass = false;
+#endif
 
-
+#if 0
 	Method::BlockLanczos traits2;
 	traits2.preconditioner (Method::BlockLanczos::FULL_DIAGONAL);
 	traits2.blockingFactor (N);
@@ -847,11 +859,10 @@ int main (int argc, char **argv)
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-sparse-map-map.C b/tests/test-sparse-map-map.C
new file mode 100644
index 0000000..c10d92d
--- /dev/null
+++ b/tests/test-sparse-map-map.C
@@ -0,0 +1,261 @@
+
+#include "linbox/linbox-config.h"
+#include "linbox/util/commentator.h"
+
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "linbox/matrix/sparsematrix/sparse-map-map-matrix.h"
+#include "linbox/solutions/charpoly.h"
+#include "linbox/algorithms/coppersmith-invariant-factors.h"
+#include "linbox/vector/blas-vector.h"
+
+#include "tests/test-blackbox.h"
+
+#include <fflas-ffpack/ffpack/ffpack.h>
+
+using namespace LinBox;
+
+template <class Field>
+class SMMTests {
+public:
+	typedef typename Field::Element Element;
+	typedef SparseMatrix<Field,SparseMatrixFormat::SMM> SparseMat;
+
+	static bool runBasicTests(Field& F, int n, int m)
+	{
+		bool pass=true;
+		stringstream ss;
+		ss << "Running basic tests with n=" << n << " m=" << m;
+		commentator().start(ss.str().c_str(),0,3);
+		pass=pass&&testNNZ(F,n,m);
+		pass=pass&&testPattern(F,n,m);
+		pass=pass&&testSMMBlackbox(F,n,m);
+		commentator().stop(MSG_STATUS(pass));
+		return pass;
+	}
+
+	static void setMatPattern(SparseMat& M, const Element& startVal)
+	{
+		Field F=M.field();
+		int m=M.rowdim(),n=M.coldim();
+		Element d;
+		F.assign(d,startVal);
+		for (int i=0;i<m;++i) {
+			for (int j=0;j<n;++j) {
+				F.addin(d,F.one);
+				M.setEntry(i,j,d);
+				if (j==i-1) {
+					// test overwriting
+					M.setEntry(i,j,F.zero);
+				}
+			}
+		}
+	}
+
+	static bool testMatPattern(SparseMat& M, const Element& startVal)
+	{
+		Field F=M.field();
+		int m=M.rowdim(),n=M.coldim();
+		Element d,e;
+		F.assign(d,startVal);
+		for (int i=0;i<m;++i) {
+			for (int j=0;j<n;++j) {
+				F.addin(d,F.one);
+				M.getEntry(e,i,j);
+				if (j==i-1) {
+					if (!F.isZero(e)) {
+						return false;
+					}
+				} else {
+					if (!F.areEqual(d,e)) {
+						return false;
+					}
+				}
+			}
+		}
+		return true;
+	}
+
+	static bool testNNZ(Field& F,int n, int m)
+	{
+		commentator().start("Testing nnz()");
+		SparseMat M(F,n,m);
+		size_t nnz=0;
+		if (M.nnz() != 0) {
+			commentator().stop(MSG_FAILED);
+			return false;
+		}
+		for (int i=0;i<m;++i) {
+			for (int j=0;j<n;++j) {
+				M.setEntry(i,j,F.one);
+				++nnz;
+				if (M.nnz() != nnz) {
+					commentator().stop(MSG_FAILED);
+					return false;
+				}
+			}
+		}
+		for (int i=0;i<m;++i) {
+			for (int j=0;j<n;++j) {
+				M.setEntry(i,j,F.zero);
+				--nnz;
+				if (M.nnz() != nnz) {
+					commentator().stop(MSG_FAILED);
+					return false;
+				}
+			}
+		}
+		if (!M.verify()) {
+			commentator().stop(MSG_FAILED);
+			return false;
+		}
+		commentator().stop(MSG_PASSED);
+		return true;
+	}
+
+	static bool testPattern(Field& F, int n, int m)
+	{
+		commentator().start("Testing matrix overwrites");
+		SparseMat M(F,n,m);
+		bool pass=true;
+
+		setMatPattern(M,F.zero);
+		pass=pass&&testMatPattern(M,F.zero);
+		pass=pass&&M.verify();
+
+		//Write over old matrix with values offset by 1
+		setMatPattern(M,F.one);
+		pass=pass&&testMatPattern(M,F.one);
+		pass=pass&&M.verify();
+
+		commentator().stop(MSG_STATUS(pass));
+		return pass;
+	}
+
+	static bool testSMMBlackbox(Field& F, int n, int m)
+	{
+		commentator().start("Running testBlackbox()");
+		SparseMat M(F,m,n);
+		setMatPattern(M,F.zero);
+		bool pass=testBlackbox(M,true);
+		commentator().stop(MSG_STATUS(pass));
+		return pass;
+	}
+
+	static bool testSim(Field& F, int n, int b)
+	{
+		stringstream ss;
+		ss << "Testing randomSim() with n=" << n << " b=" << b;
+		commentator().start(ss.str().c_str());
+
+		SparseMat M(F,n,n);
+		Element d;
+		F.init(d,0);
+		for (int i=0;i<n;++i) {
+			F.addin(d,F.one);
+			M.setEntry(i,i,d);
+		}
+	
+		typedef CoppersmithInvariantFactors<Field,SparseMat> FactorDomain;
+		typedef typename FactorDomain::PolyDom PolyDom;
+		typedef typename FactorDomain::PolyRing PolyRing;
+		typedef BlasVector<PolyRing> FactorVector;
+		PolyDom PD(F,"x");
+		PolyRing R(PD);
+
+		FactorVector MFactors(R);
+		FactorDomain MCFD(F,M,b);
+		int numMFactors=MCFD.computeFactors(MFactors);
+
+		linbox_check(n>=2);
+		M.randomSim(2*n);
+
+		FactorVector QFactors(R);
+		FactorDomain QCFD(F,M,b);
+		int numQFactors=QCFD.computeFactors(QFactors);
+
+		if (numMFactors != numQFactors) {
+			commentator().stop(MSG_FAILED);
+			return false;
+		}
+
+		for (int i=0;i<numQFactors;++i) {
+			if (!R.areEqual(QFactors[i],MFactors[i])) {
+				commentator().stop(MSG_FAILED);
+				return false;
+			}
+		}
+		commentator().stop(MSG_PASSED);
+		return true;
+	}
+};
+
+template <class Field>
+bool basicTestSuite(Field& F)
+{
+	bool pass=true;
+	commentator().start("Basic tests",0,5);
+	pass=pass&&SMMTests<Field>::runBasicTests(F,10,10);
+	pass=pass&&SMMTests<Field>::runBasicTests(F,1,10);
+	pass=pass&&SMMTests<Field>::runBasicTests(F,2,10);
+	pass=pass&&SMMTests<Field>::runBasicTests(F,10,2);
+	pass=pass&&SMMTests<Field>::runBasicTests(F,10,1);
+	commentator().stop(MSG_STATUS(pass));
+	return pass;
+}
+
+template <class Field>
+bool matGenTestSuite(Field& F)
+{
+	bool pass=true;
+	commentator().start("Testing randomSim()");
+	pass=pass&&SMMTests<Field>::testSim(F,10,10);
+	commentator().stop(MSG_STATUS(pass));
+	return pass;
+}
+
+template <class Field>
+bool fieldTestSuite(Field& F)
+{
+	bool pass=true;
+	stringstream ss;
+	ss << "Testing SMM with Field ";
+	F.write(ss);
+	commentator().start(ss.str().c_str());
+	pass=pass&&basicTestSuite(F);
+	pass=pass&&matGenTestSuite(F);
+	commentator().stop(MSG_STATUS(pass));
+	return pass;
+}
+
+bool testSuite()
+{
+	bool pass=true;
+	Givaro::Modular<double> DoubleSmallField(3),DoubleLargeField(67108859);
+	pass=pass&&fieldTestSuite(DoubleSmallField);
+	pass=pass&&fieldTestSuite(DoubleLargeField);
+
+	Givaro::Extension<Givaro::Modular<double> > ExtField(DoubleSmallField,3);
+	pass=pass&&fieldTestSuite(ExtField);
+	return pass;
+}
+
+int main(int argc, char** argv) 
+{
+	static Argument args[] = {
+		END_OF_ARGUMENTS
+	};
+	parseArguments (argc, argv, args);
+
+	commentator().start("Testing sparse-map-map-matrix");
+
+	bool pass=testSuite();
+
+	commentator().stop(MSG_STATUS(pass));
+
+	return pass?0:-1;
+}
+
+
+
diff --git a/tests/test-sparse.C b/tests/test-sparse.C
index eab10e3..9595387 100644
--- a/tests/test-sparse.C
+++ b/tests/test-sparse.C
@@ -1,25 +1,25 @@
-
 /* tests/test-sparse.C
- * Copyright (C) 2001, 2002 Bradford Hovinen
+ * Copyright (C) 2014 the LinBox group
  *
- * Written by Bradford Hovinen <hovinen at cis.udel.edu>
+ * Written by bds <saunders at udel.edu>
+ *            Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  *
  * --------------------------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -40,526 +40,76 @@
 #include <iostream>
 #include <fstream>
 #include <sstream>
-#include <vector>
+
 
 #include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/blackbox/sparse.h"
-#include "linbox/vector/vector-traits.h"
-#include "linbox/vector/stream.h"
-#include "linbox/vector/vector-domain.h"
-#include "linbox/randiter/nonzero.h"
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
 
-#include "test-common.h"
-#include "test-generic.h"
+
+#include "test-blackbox.h"
 
 using namespace LinBox;
 
-/* Test 1: Application of identity matrix onto random vectors
- *
- * Construct the identity matrix and a series of randomly-generated
- * vectors. Apply the identity to each vector and test whether the input and
- * output are equal.
- *
- * F - Field over which to perform computations
- * n - Dimension to which to make matrix
- *
- * Return true on success and false on failure
- */
+template <class SM, class SM2>
+bool buildBySetGetEntry(SM & A, const SM2 &B);
 
-template <class Row, class Field, class Vector>
-static bool testIdentityApply (Field &F, const char *text, VectorStream<Vector> &stream)
+template <class Field, class SMF>
+bool testSparseFormat(string format, const SparseMatrix<Field> & S1)
 {
-	typedef SparseMatrix <Field, Row> Blackbox;
-
-	ostringstream str;
-	str << "Testing identity apply (" << text << ")" << ends;
-	commentator().start (str.str ().c_str (), "testIdentityApply", stream.m ());
-
-	bool ret = true;
-	bool iter_passed = true;
-
-	VectorDomain<Field> VD (F);
-	StandardBasisStream<Field, Row> f1 (F, stream.n ());
-	Blackbox A (F, f1);
-
-	ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
-	report << "Matrix:" << endl;
-	A.write (report, FORMAT_PRETTY);
-
-	Vector v, w;
-
-	VectorWrapper::ensureDim (v, stream.n ());
-	VectorWrapper::ensureDim (w, stream.n ());
-
-	while (stream) {
-		commentator().startIteration ((unsigned)stream.j ());
-
-		iter_passed = true;
-
-		stream.next (v);
-
-		ostream &Report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
-		Report << "Input vector:  ";
-		VD.write (Report, v);
-		Report << endl;
-
-		A.apply (w, v);
-
-		Report << "Output vector: ";
-		VD.write (Report, w);
-		Report << endl;
-
-		if (!VD.areEqual (v, w))
-			ret = iter_passed = false;
-
-		if (!iter_passed)
-			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-				<< "ERROR: Vectors are not equal" << endl;
-
-		commentator().stop ("done");
-		commentator().progress ();
+	typedef SparseMatrix<Field, SMF> SM;
+	bool pass=true;
+	string msg = "SparseMatrix<Field, SparseMatrixFormat::" + format + ">";
+	commentator().start(msg.c_str(), format.c_str());
+	const typename SM::Field& F = S1.field();
+	MatrixDomain<typename SM::Field> MD(F);
+	SM S2(F,S1.rowdim(),S1.coldim());
+	SM S3(F,S1.rowdim(),S1.coldim());
+	buildBySetGetEntry(S2, S1);
+	buildBySetGetEntry(S3, S2);
+	// behaves as a blackbox should
+	if ( ! testBlackbox(S2,true) ) {
+		msg = format + " FAIL(testBlackbox)";
+		commentator().stop(msg.c_str());
+		pass = false;
 	}
-
-	stream.reset ();
-
-	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testIdentityApply");
-
-	return ret;
-}
-
-/* Test 2: Application of nilpotent linear map to random vectors
- *
- * Generates an index-n nilpotent linear map and applies it to randomly
- * generated vectors n times. Generates the vectors so that they are guaranteed
- * to be outside the matrix's index- n-1 subspace; tests to make sure the
- * vectors do not prematurely reach zero.
- *
- * F - Field over which to perform computations
- * n - Dimension to which to make matrix
- *
- * Return true on success and false on failure
- */
-
-template <class Row, class Field, class Vector>
-static bool testNilpotentApply (Field &F, const char *text, VectorStream<Vector> &stream)
-{
-	typedef SparseMatrix <Field, Row> Blackbox;
-
-	ostringstream str;
-	str << "Testing nilpotent apply (" << text << ")" << ends;
-	commentator().start (str.str ().c_str (), "testNilpotentApply", stream.m ());
-
-	bool ret = true;
-	bool even, iter_passed;
-
-	StandardBasisStream<Field, Row> f1 (F, stream.n ());
-	Row tmp;
-	f1.next (tmp);  // Small trick: pull the first vector out to shift elements up one row
-	Blackbox A (F, f1);
-
-	ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
-	report << "Matrix:" << endl;
-	A.write (report, FORMAT_PRETTY);
-
-	size_t j;
-	NonzeroRandIter<Field> r (F, typename Field::RandIter (F));
-
-	VectorDomain<Field> VD (F);
-	Vector v, w;
-
-	VectorWrapper::ensureDim (v, stream.n ());
-	VectorWrapper::ensureDim (w, stream.n ());
-
-	while (stream) {
-		commentator().startIteration ((unsigned)stream.j ());
-
-		iter_passed = true;
-		even = false;
-
-		stream.next (v);
-
-		// Make sure last element is nonzero
-		r.random (VectorWrapper::ref<Field> (v, stream.n () - 1));
-
-		ostream &Report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
-		Report << "Input vector:  ";
-		VD.write (Report, v);
-		Report << endl;
-
-		commentator().start ("Applying vectors");
-
-		for (j = 0; j < stream.n () - 1; j++, even = !even)
-			if (even)
-				A.apply (v, w);
-			else
-				A.apply (w, v);
-
-		commentator().stop ("Done");
-
-		Report << "A^(n-1) v:     ";
-		VD.write (Report, even ? w : v);
-		Report << endl;
-
-		if (VD.isZero (even ? w : v)) {
-			ret = false;
-			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-				<< "ERROR: A^(n-1) v is prematurely zero" << endl;
-		}
-
-		if (even)
-			A.apply (v, w);
-		else
-			A.apply (w, v);
-
-		Report << "A^n v:         ";
-		VD.write (Report, even ? v : w);
-		Report << endl;
-
-		if (!VD.isZero (even ? v : w))
-			ret = iter_passed = false;
-
-		if (!iter_passed)
-			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-				<< "ERROR: A^n v is non-zero" << endl;
-
-		commentator().stop ("done");
-		commentator().progress ();
+	// equal behaviour when representing same mat
+	else if ( ! MD.areEqual(S1,S2) ) { 
+		msg = format + " FAIL(areEqual)";
+		commentator().stop(msg.c_str());
+		pass = false;
 	}
-
-	stream.reset ();
-
-	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testNilpotentApply");
-
-	return ret;
-}
-
-/* Test 3: Random apply to sparse matrix of K nonzero elements per row
- *
- * Generates a random sparse matrix with K nonzero elements per row and applies
- * it to the vectors {e_i | i=1..n} to test whether the output matches the ith
- * column of the matrix.
- *
- * F - Field over which to perform computations
- * n - Dimension to which to make matrix
- * K - Number of nonzero elements per row
- *
- * Return true on success and false on failure
- */
-
-template <class Vector, class Row, class Field>
-bool testRandomApply1 (Field &F, const char *text, unsigned int iterations, VectorStream<Row> &A_stream)
-{
-	typedef SparseMatrix <Field, Row> Blackbox;
-
-	ostringstream str;
-	str << "Testing sparse random apply (1, " << text << ")" << ends;
-	commentator().start (str.str ().c_str (), "testRandomApply1", iterations);
-
-	bool ret = true;
-	bool iter_passed;
-
-	size_t i, k;
-
-	VectorDomain<Field> VD (F);
-
-	StandardBasisStream<Field, Vector> stream (F, A_stream.n ());
-	Vector e_j, w;
-
-	VectorWrapper::ensureDim (e_j, A_stream.n ());
-	VectorWrapper::ensureDim (w, A_stream.m ());
-
-	for (i = 0; i < iterations; i++) {
-		commentator().startIteration ((unsigned)i);
-
-		iter_passed = true;
-
-		Blackbox A (F, A_stream);
-		A_stream.reset ();
-
-		ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
-		report << "Matrix:" << endl;
-		A.write (report, FORMAT_PRETTY);
-
-		stream.reset ();
-
-		while (stream) {
-			stream.next (e_j);
-
-			A.apply (w, e_j);
-
-			for (k = 0; k < A_stream.m (); k++)
-				if (!F.areEqual (A.getEntry (k, stream.j () - 1), VectorWrapper::constRef<Field> (w, k)))
-					ret = iter_passed = false;
-
-			report << "Output vector " << stream.j () << ": ";
-			VD.write (report, w) << endl;
-		}
-
-		if (!iter_passed)
-			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-				<< "ERROR: Output vectors were incorrect" << endl;
-
-		commentator().stop ("done");
-		commentator().progress ();
+	// just a check of S2 getEntry
+	else if ( ! MD.areEqual(S3,S2) ) { 
+		msg = format + " FAIL(getEntry)";
+		commentator().stop(msg.c_str());
+		pass = false;
 	}
-
-	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testRandomApply1");
-
-	return ret;
-}
-
-/* Test 5: Random apply to sparse matrix of K nonzero elements per row
- *
- * Generates a random sparse matrix with K nonzero elements per row and applies
- * it to the vectors (1,1,...,1) to test whether the output matches the sum of
- * the input's columns
- *
- * F - Field over which to perform computations
- * n - Dimension to which to make matrix
- * K - Number of nonzero elements per row
- *
- * Return true on success and false on failure
- */
-
-template <class Vector, class Row, class Field>
-bool testRandomApply2 (Field &F, const char *text, unsigned int iterations, VectorStream<Row> &A_stream)
-{
-	typedef SparseMatrix <Field, Row> Blackbox;
-
-	ostringstream str;
-	str << "Testing sparse random apply (2, " << text << ")" << ends;
-	commentator().start (str.str ().c_str (), "testRandomApply2", iterations);
-
-	bool ret = true;
-	bool iter_passed;
-
-	size_t i, j, k;
-
-	VectorDomain<Field> VD (F);
-	typename Field::RandIter r (F);
-	typename Field::Element sum;
-
-	integer c;
-	// long width;
-
-	F.characteristic (c);
-	// width = logp (c, 10) + 1;
-
-	Vector v, w;
-
-	VectorWrapper::ensureDim (v, A_stream.n ());
-	VectorWrapper::ensureDim (w, A_stream.m ());
-
-	for (k = 0; k < A_stream.n (); k++)
-		F.init (VectorWrapper::ref<Field> (v, k), 1);
-
-	for (i = 0; i < iterations; i++) {
-		commentator().startIteration ((unsigned)i);
-
-		iter_passed = true;
-
-		Blackbox A (F, A_stream);
-		A_stream.reset ();
-
-		ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
-		report << "Matrix:" << endl;
-		A.write (report, FORMAT_PRETTY);
-
-		A.apply (w, v);
-
-		for (j = 0; j < A_stream.m (); j++) {
-			F.init (sum, 0);
-
-			for (k = 0; k < A_stream.n (); k++)
-				F.addin (sum, A.getEntry (j, k));
-
-			if (!F.areEqual (sum, VectorWrapper::constRef<Field> (w, j)))
-				ret = iter_passed = false;
-		}
-
-		report << "Output vector: ";
-		VD.write (report, w) << endl;
-
-		if (!iter_passed)
-			commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_ERROR)
-				<< "ERROR: Output vector was incorrect" << endl;
-
-		commentator().stop ("done");
-		commentator().progress ();
+	else {
+		msg = format + " pass";
+		commentator().stop(msg.c_str());
 	}
-
-	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testRandomApply2");
-
-	return ret;
-}
-
-/* Test 6: Random transpose
- *
- * Construct a random sparse matrix and check that the output of applyTranspose
- * is consistent with the output of apply
- *
- * F - Field over which to perform computations
- * n - Dimension to which to make matrix
- * iterations - Number of random vectors to which to apply matrix
- *
- * Return true on success and false on failure
- */
-
-template <class Row, class Field, class Vector>
-static bool testRandomTranspose (Field                &F,
-				 const char           *text,
-				 VectorStream<Row>    &A_stream,
-				 VectorStream<Vector> &stream1,
-				 VectorStream<Vector> &stream2)
-{
-	typedef SparseMatrix <Field, Row> Blackbox;
-
-	ostringstream str;
-	str << "Testing random transpose (" << text << ")" << ends;
-	commentator().start (str.str ().c_str (), "testRandomTranspose", stream1.m ());
-
-	Blackbox A (F, A_stream);
-	A_stream.reset ();
-
-	ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
-	report << "Input matrix:" << endl;
-	A.write (report, FORMAT_PRETTY);
-
-	bool ret = testTranspose (F, A, stream1, stream2);
-
-	stream1.reset ();
-	stream2.reset ();
-
-	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testRandomTranspose");
-
-	return ret;
-}
-
-/* Test 7: Linearity
- *
- * Compute a random sparse matrix and check its linearity
- *
- * F - Field over which to perform computations
- * n - Dimension to which to make matrix
- * iterations - Number of random vectors to which to apply matrix
- *
- * Return true on success and false on failure
- */
-
-template <class Row, class Field, class Vector>
-static bool testRandomLinearity (Field                 &F,
-				 const char            *text,
-				 VectorStream<Row>    &A_stream,
-				 VectorStream<Vector> &stream1,
-				 VectorStream<Vector> &stream2)
-{
-	typedef SparseMatrix <Field, Row> Blackbox;
-
-	ostringstream str;
-	str << "Testing linearity (" << text << ")" << ends;
-	commentator().start (str.str ().c_str (), "testRandomLinearity", stream1.m ());
-
-	Blackbox A (F, A_stream);
-	A_stream.reset ();
-
-	ostream &report = commentator().report (Commentator::LEVEL_UNIMPORTANT, INTERNAL_DESCRIPTION);
-	report << "Input matrix:" << endl;
-	A.write (report, FORMAT_PRETTY);
-
-	bool ret = testLinearity (F, A, stream1, stream2);
-
-	stream1.reset ();
-	stream2.reset ();
-
-	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testRandomLinearity");
-
-	return ret;
-}
-
-template <class Field, class Vector, class Row>
-bool runSparseMatrixTestsByVector (const Field           &F,
-				   const char            *desc,
-				   unsigned int           iterations,
-				   VectorStream<Vector> &v_stream1,
-				   VectorStream<Vector> &v_stream2,
-				   VectorStream<Row>    &A_stream)
-{
-	bool pass = true;
-
-	ostringstream str;
-
-	str << "Testing " << desc << " sparse matrix" << ends;
-	commentator().start (str.str ().c_str (), "runSparseMatrixTestsByVector", 6);
-
-	if (!testIdentityApply<Row>   (F, desc, v_stream1))                        pass = false; commentator().progress ();
-	if (!testNilpotentApply<Row>  (F, desc, v_stream1))                        pass = false; commentator().progress ();
-	if (!testRandomApply1<Vector> (F, desc, iterations, A_stream))             pass = false; commentator().progress ();
-	if (!testRandomApply2<Vector> (F, desc, iterations, A_stream))             pass = false; commentator().progress ();
-	if (!testRandomTranspose      (F, desc, A_stream, v_stream1, v_stream2)) pass = false; commentator().progress ();
-	if (!testRandomLinearity      (F, desc, A_stream, v_stream1, v_stream2)) pass = false; commentator().progress ();
-
-	commentator().stop (MSG_STATUS (pass), (const char *) 0, "runSparseMatrixTests");
-
 	return pass;
 }
 
-template <class Field, class Row>
-bool runSparseMatrixTests (const Field       &F,
-			   const char        *desc,
-			   int                iterations,
-			   VectorStream<Row> &A_stream)
+template <class SM, class SM2>
+bool buildBySetGetEntry(SM & A, const SM2 &B)
 {
-	typedef std::vector <typename Field::Element> DenseVector;
-	typedef std::vector <pair <size_t, typename Field::Element> > SparseSeqVector;
-	typedef std::map <size_t, typename Field::Element> SparseMapVector;
-	typedef std::pair <std::vector<size_t>, std::vector<typename Field::Element> > SparseParVector;
-
-	bool pass = true;
 
-	ostringstream str1, str2, str3, str4, str5;
-
-	str1 << "Testing sparse matrix with " << desc << " row type" << ends;
-	commentator().start (str1.str ().c_str (), "runSparseMatrixTests", 4);
-
-	str2 << desc << "/dense" << ends;
-	str3 << desc << "/sparse sequence" << ends;
-	str4 << desc << "/sparse associative" << ends;
-	str5 << desc << "/sparse parallel" << ends;
-
-	RandomDenseStream<Field, DenseVector>     dense_stream1 (F, A_stream.n (), iterations);
-	RandomDenseStream<Field, DenseVector>     dense_stream2 (F, A_stream.m (), iterations);
-#if 0
-	RandomSparseStream<Field, SparseSeqVector> sparse_seq_stream1 (F, 0.1, A_stream.n (), iterations);
-	RandomSparseStream<Field, SparseSeqVector> sparse_seq_stream2 (F, 0.1, A_stream.m (), iterations);
-	RandomSparseStream<Field, SparseMapVector> sparse_map_stream1 (F, 0.1, A_stream.n (), iterations);
-	RandomSparseStream<Field, SparseMapVector> sparse_map_stream2 (F, 0.1, A_stream.m (), iterations);
-	RandomSparseStream<Field, SparseParVector> sparse_par_stream1 (F, 0.1, A_stream.n (), iterations);
-	RandomSparseStream<Field, SparseParVector> sparse_par_stream2 (F, 0.1, A_stream.m (), iterations);
-#endif
+	A.resize(B.rowdim(),B.coldim());
 
-	if (!runSparseMatrixTestsByVector (F, str2.str ().c_str (), iterations,
-					   dense_stream1, dense_stream2, A_stream))
-		pass = false;
-#if 0
-	commentator().progress ();
-	if (!runSparseMatrixTestsByVector (F, str2.str ().c_str (), iterations,
-					   sparse_seq_stream1, sparse_seq_stream2, A_stream))
-		pass = false;
-	commentator().progress ();
-	if (!runSparseMatrixTestsByVector (F, str2.str ().c_str (), iterations,
-					   sparse_map_stream1, sparse_map_stream2, A_stream))
-		pass = false;
-	commentator().progress ();
-	if (!runSparseMatrixTestsByVector (F, str2.str ().c_str (), iterations,
-					   sparse_par_stream1, sparse_par_stream2, A_stream))
-		pass = false;
-	commentator().progress ();
-#endif
+	for (size_t i = 0; i < B.rowdim(); ++i)
+		for (size_t j = 0; j < B.coldim(); ++j)
+		{
+			typename SM::Field::Element x = B.getEntry(i,j);
+			if (not A.field().isZero(x))
+			A.setEntry(i,j,x);
+		}
+	A.finalize();
 
-	commentator().stop (MSG_STATUS (pass), (const char *) 0, "runSparseMatrixTests");
+	MatrixDomain<typename SM::Field> MD(B.field()) ;
 
-	return pass;
+	return MD.areEqual(A,B);
 }
 
 int main (int argc, char **argv)
@@ -568,29 +118,20 @@ int main (int argc, char **argv)
 
 	static size_t n = 10;
 	static size_t m = 10;
-	static integer q = 101;
-	static int iterations = 1;
-	static int k = 3;
-	static int N = 20;
+	static integer q = 11;
+	static size_t N = m+n;
 
 	static Argument args[] = {
-		{ 'n', "-n N", "Set column dimension of test matrices to N.", TYPE_INT,     &n },
-		{ 'm', "-m M", "Set row dimension of test matrices to M.", TYPE_INT,     &m },
+		{ 'm', "-m m", "Set row dimension of test matrices to m.", TYPE_INT,     &m },
+		{ 'n', "-n n", "Set column dimension of test matrices to n.", TYPE_INT,     &n },
+		{ 'N', "-N N", "Set number of nonzeros in test matrices.", TYPE_INT,     &N },
 		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
-		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
-		{ 'k', "-k K", "K nonzero Elements per row in sparse random apply test.", TYPE_INT,     &k },
-		{ 'N', "-N N", "N nonzero Elements in sparse random apply test.", TYPE_INT,     &N },
 		END_OF_ARGUMENTS
 	};
 	parseArguments (argc, argv, args);
 
-	typedef	Modular<uint32_t> Field;
-	typedef Field::Element  Element;
-
-	typedef std::vector <Element> DenseVector;
-	typedef std::vector <pair <size_t, Element> > SparseSeqVector;
-	typedef std::map <size_t, Element> SparseMapVector;
-	typedef std::pair <std::vector<size_t>, std::vector<Element> > SparseParVector;
+	//typedef	Givaro::Modular<uint32_t> Field;
+	typedef	Givaro::Modular<double> Field;
 
 	Field F (q);
 
@@ -598,19 +139,77 @@ int main (int argc, char **argv)
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
 
 	commentator().start("Sparse matrix black box test suite", "Sparse");
+	MatrixDomain<Field> MD(F) ;
+	typename Field::RandIter r(F,0,1);
+	srand(0);
+
+	 /*  default case */
+	commentator().start("SparseMatrix<Field>", "Field");
+
+	SparseMatrix<Field> S1(F, m, n);
+	typename Field::Element x;
+	for (size_t k = 0; k < N; ++k)
+	{
+		size_t i = rand() % m;
+		size_t j = rand() % n;
+		while (S1.field().isZero(r.random(x)));
+		S1.setEntry(i,j,x);
+	}
+	S1.finalize();
+
+	//if ( testBlackbox(S1, true, N != 0))
+	if ( testBlackbox(S1, false, N != 0))
+		commentator().stop("SparseMatrix<Field> pass");
+	else {
+		commentator().stop("SparseMatrix<Field> FAIL");
+		pass = false;
+	}
+
+	/* other formats */
+	pass = pass and 
+		testSparseFormat<Field, SparseMatrixFormat::COO>("COO",S1);
+	pass = pass and 
+		testSparseFormat<Field, SparseMatrixFormat::CSR>("CSR",S1);
+	pass = pass and 
+		testSparseFormat<Field, SparseMatrixFormat::ELL>("ELL",S1);
+	pass = pass and 
+		testSparseFormat<Field, SparseMatrixFormat::ELL_R>("ELL_R",S1);
+	pass = pass and 
+		testSparseFormat<Field, SparseMatrixFormat::TPL>("TPL",S1);
+	pass = pass and 
+		testSparseFormat<Field, SparseMatrixFormat::SparseSeq>("SparseSeq",S1);
+	pass = pass and 
+		testSparseFormat<Field, SparseMatrixFormat::SparsePar>("SparsePar",S1);
+	pass = pass and 
+		testSparseFormat<Field, SparseMatrixFormat::SparseMap>("SparseMap",S1);
+#if 0 // doesn't compile
+	commentator().start("SparseMatrix<Field, SparseMatrixFormat::HYB>", "HYB");
+	SparseMatrix<Field, SparseMatrixFormat::HYB> S6(F, m, n);
+	buildBySetGetEntry(S6, S1);
+	S6.optimise();
+	if ( testBlackbox(S6,false)  && MD.areEqual(S1,S6))
+		commentator().stop("Format HYB pass");
+	else {
+		commentator().stop("Format HYB FAIL");
+		pass = false;
+	}
+#endif
+
+	{ /*  Default OLD */
+		commentator().start("SparseMatrix<Field>", "Field");
+		Protected::SparseMatrixGeneric<Field> S11(F, m, n);
+		buildBySetGetEntry(S11, S1);
+		if ( testBlackbox(S11,true)  && MD.areEqual(S1,S11))
+			commentator().stop("SparseMatrix<Field> pass");
+		else {
+			commentator().stop("SparseMatrix<Field> FAIL");
+			pass = false;
+		}
+	}
 
-	RandomSparseStream<Field, SparseSeqVector>
-		stream1 (F, (double) k / (double) n, n, m);
-	RandomSparseStream<Field, SparseMapVector>
-		stream2 (F, (double) k / (double) n, n, m);
-	RandomSparseStream<Field, SparseParVector>
-		stream3 (F, (double) k / (double) n, n, m);
+	commentator().stop( MSG_STATUS(pass), "Sparse matrix black box test suite pass");
 
-	if (!runSparseMatrixTests (F, "sparse sequence",    iterations, stream1)) pass = false;
-	if (!runSparseMatrixTests (F, "sparse associative", iterations, stream2)) pass = false;
-	if (!runSparseMatrixTests (F, "sparse parallel",    iterations, stream3)) pass = false;
 
-	commentator().stop("Sparse matrix black box test suite");
 	return pass ? 0 : -1;
 }
 
diff --git a/tests/test-subiterator.C b/tests/test-subiterator.C
index b368371..6d24fd4 100644
--- a/tests/test-subiterator.C
+++ b/tests/test-subiterator.C
@@ -35,8 +35,12 @@
 #include "linbox/util/commentator.h"
 #include "test-common.h"
 #include "linbox/vector/subiterator.h"
+
+#include "linbox/vector/blas-vector.h"
+
 using namespace LinBox;
-bool test() ;
+bool test1() ;
+bool test2() ;
 int main(int argc, char** argv)
 {
    static Argument args[] = {
@@ -45,12 +49,13 @@ int main(int argc, char** argv)
    parseArguments (argc, argv, args);
 	commentator().start("Subiterator test suite", "Subiterator");
 
-   bool pass = test();
-	commentator().stop("Subiterator test suite");
+   bool pass = test1();
+   pass &= test2();
+   commentator().stop("Subiterator test suite");
    return pass? 0 : -1;
 }
 
-bool test()
+bool test1()
 {
 	const char* title = "Subiterator test";
 	commentator().start(title, title, 1);
@@ -96,6 +101,54 @@ bool test()
 	return res;
 }
 
+bool test2()
+{
+	const char* title = "Subiterator test";
+	commentator().start(title, title, 1);
+	ostream &report = commentator().report
+		(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+
+	typedef Givaro::ZRing<int> Ints ;
+	Ints I ;
+	BlasVector<Ints> v(I);
+	for (int i = 1; i <= 10; ++i) v.push_back(i);
+
+	Subiterator<BlasVector<Ints>::iterator> s(v.begin()+2, 2);
+	Subiterator<BlasVector<Ints>::iterator> t(v.end()+2, 2);
+	bool res = true;
+	if (*s != 3) {report << 1 << endl; res=false;}
+	if (*(++s) != 5) {report << 2 << endl; res=false;}
+	if (*(s++) != 5) {report << 3 << endl; res=false;}
+	if (*(s) != 7) {report << 4 << endl; res=false;}
+	if (*(--s) != 5) {report << 5 << endl; res=false;}
+	if (*(s--) != 5) {report << 6 << endl; res=false;}
+	if (*(s) != 3) {report << 7 << endl; res=false;}
+	if (*(s+1) != 5) {report << 8 << endl; res=false;}
+	if (*(s-1) != 1) {report << 9 << endl; res=false;}
+	if ((t-s) != 5) {report << 10 << endl; res=false;}
+	//	report << "10 " << t-s << endl;
+	if ((s[1]) != 5) {report << 11 << endl; res=false;}
+
+	if (s == t) {report << 12 << endl; res=false;}
+	if (!(s != t)) {report << 13 << endl; res=false;}
+	if (!(s <= t)) {report << 14 << endl; res=false;}
+	if (s >= t) {report << 15 << endl; res=false;}
+	if (!(s < t)) {report << 16 << endl; res=false;}
+	if (s > t) {report << 17 << endl; res=false;}
+
+	*s = 0;
+	if (v[2] != 0) {report << 18 << endl; res=false;}
+	s[3]=0;
+	if (v[8] != 0) {report << 19 << endl; res=false;}
+	std::swap(s, t);
+	if (s < t) {report << 20 << endl; res=false;}
+	s.swap(t);
+	if (s > t) {report << 21 << endl; res=false;}
+
+
+	commentator().stop (MSG_STATUS (res), (const char *) 0, title);
+	return res;
+}
 
 // vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
diff --git a/tests/test-submatrix.C b/tests/test-submatrix.C
index 74b3d9f..29bcc93 100644
--- a/tests/test-submatrix.C
+++ b/tests/test-submatrix.C
@@ -33,11 +33,11 @@
 #include "linbox/linbox-config.h"
 
 #include <iostream>
-#include <vector>
+
 
 #include "linbox/util/commentator.h"
 #include "linbox/field/archetype.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 #include "linbox/blackbox/submatrix.h"
 #include "linbox/vector/stream.h"
 
@@ -64,16 +64,15 @@ template <class Field>
 static bool testRandomApply (Field                                       &F,
 			     unsigned int                                 iterations,
 			     size_t                                       n,
-			     VectorStream<typename Vector<Field>::Dense> &stream)
+			     VectorStream<BlasVector<Field> > &stream)
 {
 	typedef BlasMatrix <Field> Blackbox;
 
 	commentator().start ("Testing random apply", "testRandomApply", iterations);
 
 	bool ret = true;
-	bool iter_passed;
 
-	typename Vector<Field>::Dense v, w1(n), w2(n);
+	BlasVector<Field>  v, w1(n), w2(n);
 
 	size_t i, j, k, l;
 
@@ -89,7 +88,7 @@ static bool testRandomApply (Field                                       &F,
 	for (i = 0; i < iterations; i++) {
 		commentator().startIteration (i);
 
-		iter_passed = true;
+		bool iter_passed = true;
 
 		for (j = 0; j < 9; j++) {
 			for (k = 0; k < n; k++) {
@@ -161,16 +160,16 @@ static bool testRandomApply (Field                                       &F,
 
 template <class Field>
 static bool testRandomLinearity (const Field                                 &F,
-				 VectorStream<typename Vector<Field>::Dense> &A_stream,
-				 VectorStream<typename Vector<Field>::Dense> &v1_stream,
-				 VectorStream<typename Vector<Field>::Dense> &v2_stream)
+				 VectorStream<BlasVector<Field> > &A_stream,
+				 VectorStream<BlasVector<Field> > &v1_stream,
+				 VectorStream<BlasVector<Field> > &v2_stream)
 {
 	commentator().start ("Testing random linearity", "testRandomLinearity", v1_stream.size ());
 
 	BlasMatrix<Field> A (F, A_stream);
 	Submatrix<BlasMatrix<Field> > Ap (&A, 0, 0, v1_stream.dim (), v2_stream.dim ());
 
-	bool ret = testLinearity (F, Ap, v1_stream, v2_stream);
+	bool ret = testLinearity (Ap, v1_stream, v2_stream);
 
 	A_stream.reset ();
 	v1_stream.reset ();
@@ -196,9 +195,9 @@ static bool testRandomLinearity (const Field                                 &F,
 
 template <class Field>
 static bool testRandomTranspose (const Field                                 &F,
-				 VectorStream<typename Vector<Field>::Dense> &A_stream,
-				 VectorStream<typename Vector<Field>::Dense> &v1_stream,
-				 VectorStream<typename Vector<Field>::Dense> &v2_stream)
+				 VectorStream<BlasVector<Field> > &A_stream,
+				 VectorStream<BlasVector<Field> > &v1_stream,
+				 VectorStream<BlasVector<Field> > &v2_stream)
 {
 	commentator().start ("Testing random transpose", "testRandomTranspose", v1_stream.size ());
 
@@ -216,6 +215,29 @@ static bool testRandomTranspose (const Field                                 &F,
 	return ret;
 }
 
+template<class Field>
+bool testBasics(const Field & F)
+{
+	{
+	BlasMatrix<Field> Container(F,2,2);
+	BlasSubmatrix<BlasMatrix<Field> > subContainer(Container,0,0,1,1);
+	if (Container.getPointer() != subContainer.getPointer()) {
+		return false ;
+	}
+	}
+
+	{
+	const BlasMatrix<Field> Container(F,2,2);
+	BlasSubmatrix<const BlasMatrix<Field> > subContainer(Container,0,0,1,1);
+	if (Container.getPointer() != subContainer.getPointer()) {
+		return false ;
+	}
+	}
+
+	return true ;
+
+}
+
 int main (int argc, char **argv)
 {
 	bool pass = true;
@@ -233,26 +255,28 @@ int main (int argc, char **argv)
 		END_OF_ARGUMENTS
 	};
 
-	typedef Modular<uint32_t> Field;
+	typedef Givaro::Modular<uint32_t> Field;
 
 	parseArguments (argc, argv, args);
-	Field F (q);
+	Field F (q); Field::RandIter gen(F);
+    
 
 	commentator().start("Submatrix black box test suite", "Submatrix");
 
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (5);
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
 
-	RandomDenseStream<Field> stream (F, n, N);
-	RandomDenseStream<Field> A_stream (F, n, n);
-	RandomDenseStream<Field> v1_stream (F, n / 2, iterations);
-	RandomDenseStream<Field> v2_stream (F, n / 2, iterations);
+	RandomDenseStream<Field> stream (F, gen, n, N);
+	RandomDenseStream<Field> A_stream (F, gen, n, n);
+	RandomDenseStream<Field> v1_stream (F, gen, n / 2, iterations);
+	RandomDenseStream<Field> v2_stream (F, gen, n / 2, iterations);
 
 #if 0
 	if (!testRandomApply (F, iterations, n, stream)) pass = false;
 #endif
 	if (!testRandomLinearity (F, A_stream, v1_stream, v2_stream)) pass = false;
 	if (!testRandomTranspose (F, A_stream, v1_stream, v2_stream)) pass = false;
+	if (!testBasics(F) ) pass = false;
 
 	commentator().stop("Submatrix black box test suite");
 	return pass ? 0 : -1;
diff --git a/tests/test-subvector.C b/tests/test-subvector.C
index 23ac578..1a608b3 100644
--- a/tests/test-subvector.C
+++ b/tests/test-subvector.C
@@ -34,16 +34,29 @@
 #include "linbox/linbox-config.h"
 
 #include "linbox/util/commentator.h"
-#include "linbox/field/unparametric.h"
 #include "linbox/vector/subvector.h"
 
+#include "linbox/vector/blas-vector.h"
+
 #include "test-common.h"
 
 using namespace LinBox;
 
+//! test with Vector=std::vector<Element>
 template <class Field>
 static bool testSubvector(Field &F, size_t n);
 
+//! test with Vector=BlasVector<Field>
+template <class Field>
+static bool testSubvector2(Field &F, size_t n);
+
+//! test with Vector=BlasVector<Field>
+//! test with subVector=BlasSubvector<Field>
+template <class Field>
+static bool testSubvector3(Field &F, size_t n);
+
+
+
 int main(int argc, char** argv)
 {
     // set up command line options
@@ -57,13 +70,17 @@ int main(int argc, char** argv)
 
     // start testing
 	commentator().start("Subvector test suite", "Subvector");
-    bool pass = true;
+    bool pass ;
 
     // call tests
-    typedef LinBox::UnparametricField<int> Field;
+    typedef Givaro::ZRing<int> Field;
     Field F;
     pass = testSubvector<Field> (F, n);
 
+    pass &= testSubvector2<Field> (F, n);
+
+    pass &= testSubvector3<Field> (F, n);
+
     // finish
 	commentator().stop("Subvector test suite");
     return pass? 0 : -1;
@@ -76,6 +93,7 @@ int main(int argc, char** argv)
 
 using namespace LinBox;
 
+
 template <class Field>
 static bool testSubvector(Field &F, size_t n)
 {
@@ -90,13 +108,13 @@ static bool testSubvector(Field &F, size_t n)
 
 	typedef typename Field::Element Element;
 	typedef std::vector<Element>	Vector;
-	typedef typename Vector::iterator       Iter;
+	// typedef typename Vector::iterator       Iter;
 	typedef Subiterator<typename Vector::iterator>	Subiter;
 	typedef typename LinBox::Subvector<Subiter>	Subvect;
 	//typedef typename LinBox::Subvector<Vector, Subiter>	Subvect;
-	typedef typename Subvect::const_iterator	ConstSubiterator;
+	// typedef typename Subvect::const_iterator	ConstSubiterator;
 
-	typedef typename Subvect::reverse_iterator	ReverseIterator;
+	// typedef typename Subvect::reverse_iterator	ReverseIterator;
 	typedef typename Subvect::reverse_iterator	ReverseSubiterator;
 
 	Vector v(n);
@@ -107,12 +125,233 @@ static bool testSubvector(Field &F, size_t n)
 
 	int start = 1;
 	int stride = 2;
-	int length = 3;
+	int Length = 3;
+
 	Subiter sb(v.begin()+start, stride);
-	Subiter se(sb+length);
+	Subiter se(sb+Length);
+	Subvect w(sb, se);
+
+	// implicit (not stored) stride of 1
+	Subvector<typename Vector::iterator>
+		z(v.begin(), v.end());
+	// fixme: at least constructor compiles.
+
+	// explicit (stored) stride of 1
+	Subvect zz(v.begin(), v.end());
+	// fixme: at least constructor compiles.
+
+	report << endl << "*** Testing forward iterator" << endl << endl;
+
+	Subiter j = w.begin();
+
+
+	report << "*j = 1 = " << *j << endl;
+	ret = ret && 1 == *j;
+
+	report << "*j++ = 1 = " << *j++ << endl;
+	j--;
+	ret = ret && 1 == *j++;
+
+	report << "*j = 3 = " << *j << endl;
+	ret = ret && 3 == *j;
+
+	report << "*++j = 5 = " << *++j << endl;
+	--j;
+	ret = ret && 5 == *++j;
+
+	report << "*j = 5 = " << *j << endl;
+	ret = ret && 5 == *j;
+
+	report << "*j-- = 5 = " << *j-- << endl;
+	++j;
+	ret = ret && 5 == *j--;
+
+	report << "*j = 3 = " << *j << endl;
+	ret = ret && 3 == *j;
+
+	report << "*--j = 1 = " << *--j << endl;
+	++j;
+	ret = ret && 1 == *--j;
+
+	report << "*j = 1 = " << *j << endl;
+	ret = ret && 1 == *j;
+
+	ret = ret && (j == w.begin());
+	if (j != w.begin())
+		report << "not at beginning" << endl;
+        //j = j + 3;
+        j += 3;
+	if (j != w.end())
+		report << "not at end" << endl;
+
+	report << "Iterating through vector: (";
+	for (j = w.begin(); j != w.end(); j++)
+	{
+		report << *j;
+		if ( j < (w.end() - 1) ) report << ", ";
+	}
+	report << ')' << endl;
+
+	j = w.begin();
+	report << "Random access through vector: (";
+	for (unsigned long i = 0; i < w.size(); i++)
+	{
+		report << j[(int)i];
+		if ( i < (w.size() - 1) ) report << ", ";
+	}
+	report << ')' << endl;
+
+#if 1
+	report << endl << "*** Testing reverse iterator" << endl << endl;
+
+	ReverseSubiterator jr(w.rbegin());
+
+	report << "*jr = 5 = " << *jr << endl;
+	ret = ret && 5 == *jr;
+
+	report << "*jr++ = 5 = " << *jr++ << endl;
+	--jr;
+	ret = ret && 5 == *jr++;
+
+	report << "*jr = 3 = " << *jr << endl;
+	ret = ret && 3 == *jr;
+
+	report << "*++jr = 1 = " << *++jr << endl;
+	--jr;
+	ret = ret && 1 == *++jr;
+
+	report << "*jr = 1 = " << *jr << endl;
+	ret = ret && 1 == *jr;
+
+	report << "*jr-- = 1 = " << *jr-- << endl;
+	++jr;
+	ret = ret && 1 == *jr--;
+
+	report << "*jr = 3 = " << *jr << endl;
+	ret = ret && 3 == *jr;
+
+	report << "*--jr 5 = = " << *--jr << endl;
+	++jr;
+	ret = ret && 5 == *--jr;
+
+	report << "*jr = 5 = " << *jr << endl;
+	ret = ret && 5 == *jr;
+
+	if (jr != w.rbegin())
+		report << "not at beginning" << endl;
+	ret = ret && 5 == *jr;
+
+	report << "Iterating through vector: (";
+	for (jr = w.rbegin(); jr != w.rend(); jr++)
+	{
+		report << *jr;
+		if ( jr < (w.rend() - 1) ) report << ", ";
+	}
+	report << ')' << endl;
+	ret = ret && jr == w.rend();
+
+	jr = w.rbegin();
+	report << "Random access through vector: (";
+	for (unsigned long i = 0; i < w.size(); i++)
+	{
+		report << jr[(int)i];
+		if ( i < (w.size() - 1) ) report << ", ";
+	}
+	report << ')' << endl;
+
+#endif
+
+	report << endl << "*** Testing vector" << endl << endl;
+
+	// Need to check on const_iterator variants of functions.
+
+	report << "w.size() = 3 = " << w.size() << endl;
+	ret = ret && w.size() == 3;
+	report << "w.max_size() = 3 = " << w.max_size() << endl;
+	ret = ret && w.max_size() == 3;
+
+	report << "w.front() = 1 = " << w.front() << endl;
+	ret = ret && w.front() == 1;
+	report << "w.back() = 5 = " << w.back() << endl;
+	ret = ret && w.back() == 5;
+
+	report << "w.empty() = false = " << w.empty() << endl;
+	ret = ret && !w.empty();
+
+	printVector(F, report, w);
+
+	report << "Printing using operator[]: (";
+	for (unsigned long i = 0; i < w.size(); i++)
+	{
+		report << w[(size_t)i];
+		if ( i < (w.size() - 1) ) report << ", ";
+	}
+	report << ')' << endl;
+
+#if 0
+	report << "Printing using at(): (";
+	for (unsigned long i = 0; i < w.size(); i++)
+	{
+		report << w.at(i);
+		if ( i < (w.size() - 1) ) report << ", ";
+	}
+	report << ')' << endl;
+#endif
+
+	report << "Assigning subvector: ";
+	Vector vv(n);
+	Subvect ww(vv, 0, 1, 3);
+	//vector<int> ww(3, 77);
+	w = ww;
+	printVector(F, report, ww);
+#if 0
+	report << "Constructing subvector from iterators: ";
+	Subvect www(w.begin(), w.end());
+	printVector(F, report, www);
+#endif
+
+	// finish
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, title);
+	return ret;
+}
+
+
+
+template <class Field>
+static bool testSubvector2(Field &F, size_t n)
+{
+	// commentator setup
+	const char *  title = "Subvector test";
+	commentator().start(title, title, 1);
+	ostream &report = commentator().report
+		(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+
+	report << "This test currently neglects several members including constructors." << endl;
+	bool ret = true;
+
+	typedef typename Field::Element Element;
+	typedef BlasVector<Field>	Vector;
+	// typedef typename Vector::iterator       Iter;
+	typedef Subiterator<typename Vector::iterator>	Subiter;
+	typedef typename LinBox::Subvector<Subiter>	Subvect;
+	//typedef typename LinBox::Subvector<Vector, Subiter>	Subvect;
+	// typedef typename Subvect::const_iterator	ConstSubiterator;
+
+	// typedef typename Subvect::reverse_iterator	ReverseIterator;
+	typedef typename Subvect::reverse_iterator	ReverseSubiterator;
+
+	Vector v(F,n);
+	for (size_t z = 0; z < n; z++)
+		v[z] = (Element)z;
+
+	printVector(F, report, v);
+
+	int start = 1;
+	int stride = 2;
+	int Length = 3;
+	Subiter sb(v.begin()+start, stride);
+	Subiter se(sb+Length);
 
-//	Subvect w(v, start, stride, length);
-//	Subvect w(sb, length);
 	Subvect w(sb, se);
 
 	// implicit (not stored) stride of 1
@@ -124,15 +363,11 @@ static bool testSubvector(Field &F, size_t n)
 	Subvect zz(v.begin(), v.end());
 	// fixme: at least constructor compiles.
 
-	//report << "start = " << w._start << endl;
-	//report << "stride = " << w._stride << endl;
-	//report << "length = " << w._length << endl;
 
 	report << endl << "*** Testing forward iterator" << endl << endl;
 
 	Subiter j = w.begin();
 
-//	report << "stride = " << j._stride << endl;
 
 	report << "*j = 1 = " << *j << endl;
 	ret = ret && 1 == *j;
@@ -185,7 +420,7 @@ static bool testSubvector(Field &F, size_t n)
 	report << "Random access through vector: (";
 	for (unsigned long i = 0; i < w.size(); i++)
 	{
-		report << j[i];
+		report << j[(int)i];
 		if ( i < (w.size() - 1) ) report << ", ";
 	}
 	report << ')' << endl;
@@ -243,7 +478,7 @@ static bool testSubvector(Field &F, size_t n)
 	report << "Random access through vector: (";
 	for (unsigned long i = 0; i < w.size(); i++)
 	{
-		report << jr[i];
+		report << jr[(int)i];
 		if ( i < (w.size() - 1) ) report << ", ";
 	}
 	report << ')' << endl;
@@ -272,7 +507,7 @@ static bool testSubvector(Field &F, size_t n)
 	report << "Printing using operator[]: (";
 	for (unsigned long i = 0; i < w.size(); i++)
 	{
-		report << w[i];
+		report << w[(size_t)i];
 		if ( i < (w.size() - 1) ) report << ", ";
 	}
 	report << ')' << endl;
@@ -288,7 +523,7 @@ static bool testSubvector(Field &F, size_t n)
 #endif
 
 	report << "Assigning subvector: ";
-	Vector vv(n);
+	Vector vv(F,n);
 	Subvect ww(vv, 0, 1, 3);
 	//vector<int> ww(3, 77);
 	w = ww;
@@ -304,6 +539,229 @@ static bool testSubvector(Field &F, size_t n)
 	return ret;
 }
 
+template <class Field>
+static bool testSubvector3(Field &F, size_t n)
+{
+	// commentator setup
+	const char *  title = "Subvector test";
+	commentator().start(title, title, 1);
+	ostream &report = commentator().report
+		(Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+
+	report << "This test currently neglects several members including constructors." << endl;
+	bool ret = true;
+
+	typedef typename Field::Element Element;
+	typedef BlasVector<Field>	Vector;
+	typedef BlasSubvector<Vector>	subVector;
+	// typedef typename Vector::iterator       Iter;
+	typedef typename subVector::iterator 	Subiter;
+	typedef typename LinBox::Subvector<Subiter>	Subvect;
+	//typedef typename LinBox::Subvector<Vector, Subiter>	Subvect;
+	// typedef typename Subvect::const_iterator	ConstSubiterator;
+
+	// typedef typename Subvect::reverse_iterator	ReverseIterator;
+	typedef typename Subvect::reverse_iterator	ReverseSubiterator;
+
+	Vector v(F,n);
+	for (size_t z = 0; z < n; z++)
+		v[z] = (Element)z;
+
+	report << v << std::endl;
+
+	size_t start = 1;
+	size_t stride = 2;
+	size_t Length = 3;
+	// Subiter sb(v.begin()+start, stride);
+	// Subiter se(sb+Length);
+
+	subVector w(v, start, stride, Length);
+
+	// implicit (not stored) stride of 1
+	Subvector<typename Vector::iterator>
+		z(v.begin(), v.end());
+	// fixme: at least constructor compiles.
+
+	// explicit (stored) stride of 1
+	Subvect zz(v.begin(), v.end());
+	// fixme: at least constructor compiles.
+
+
+	report << endl << "*** Testing forward iterator" << endl << endl;
+
+	Subiter j = w.begin();
+
+
+	report << "*j = 1 = " << *j << endl;
+	ret = ret && 1 == *j;
+
+	report << "*j++ = 1 = " << *j++ << endl;
+	j--;
+	ret = ret && 1 == *j++;
+
+	report << "*j = 3 = " << *j << endl;
+	ret = ret && 3 == *j;
+
+	report << "*++j = 5 = " << *++j << endl;
+	--j;
+	ret = ret && 5 == *++j;
+
+	report << "*j = 5 = " << *j << endl;
+	ret = ret && 5 == *j;
+
+	report << "*j-- = 5 = " << *j-- << endl;
+	++j;
+	ret = ret && 5 == *j--;
+
+	report << "*j = 3 = " << *j << endl;
+	ret = ret && 3 == *j;
+
+	report << "*--j = 1 = " << *--j << endl;
+	++j;
+	ret = ret && 1 == *--j;
+
+	report << "*j = 1 = " << *j << endl;
+	ret = ret && 1 == *j;
+
+	ret = ret && (j == w.begin());
+	if (j != w.begin())
+		report << "not at beginning" << endl;
+        //j = j + 3;
+        j += 3;
+	if (j != w.end())
+		report << "not at end" << endl;
+
+	report << "Iterating through vector: (";
+	for (j = w.begin(); j != w.end(); j++)
+	{
+		report << *j;
+		if ( j < (w.end() - 1) ) report << ", ";
+	}
+	report << ')' << endl;
+
+	j = w.begin();
+	report << "Random access through vector: (";
+	for (unsigned long i = 0; i < w.size(); i++)
+	{
+		report << j[(int)i];
+		if ( i < (w.size() - 1) ) report << ", ";
+	}
+	report << ')' << endl;
+
+#if 1
+	report << endl << "*** Testing reverse iterator" << endl << endl;
+
+	ReverseSubiterator jr(w.rbegin());
+
+	report << "*jr = 5 = " << *jr << endl;
+	ret = ret && 5 == *jr;
+
+	report << "*jr++ = 5 = " << *jr++ << endl;
+	--jr;
+	ret = ret && 5 == *jr++;
+
+	report << "*jr = 3 = " << *jr << endl;
+	ret = ret && 3 == *jr;
+
+	report << "*++jr = 1 = " << *++jr << endl;
+	--jr;
+	ret = ret && 1 == *++jr;
+
+	report << "*jr = 1 = " << *jr << endl;
+	ret = ret && 1 == *jr;
+
+	report << "*jr-- = 1 = " << *jr-- << endl;
+	++jr;
+	ret = ret && 1 == *jr--;
+
+	report << "*jr = 3 = " << *jr << endl;
+	ret = ret && 3 == *jr;
+
+	report << "*--jr 5 = = " << *--jr << endl;
+	++jr;
+	ret = ret && 5 == *--jr;
+
+	report << "*jr = 5 = " << *jr << endl;
+	ret = ret && 5 == *jr;
+
+	if (jr != w.rbegin())
+		report << "not at beginning" << endl;
+	ret = ret && 5 == *jr;
+
+	report << "Iterating through vector: (";
+	for (jr = w.rbegin(); jr != w.rend(); jr++)
+	{
+		report << *jr;
+		if ( jr < (w.rend() - 1) ) report << ", ";
+	}
+	report << ')' << endl;
+	ret = ret && jr == w.rend();
+
+	jr = w.rbegin();
+	report << "Random access through vector: (";
+	for (unsigned long i = 0; i < w.size(); i++)
+	{
+		report << jr[(int)i];
+		if ( i < (w.size() - 1) ) report << ", ";
+	}
+	report << ')' << endl;
+
+#endif
+
+	report << endl << "*** Testing vector" << endl << endl;
+
+	// Need to check on const_iterator variants of functions.
+
+	report << "w.size() = 3 = " << w.size() << endl;
+	ret = ret && w.size() == 3;
+	report << "w.max_size() = 3 = " << w.max_size() << endl;
+	ret = ret && w.max_size() == 3;
+
+	report << "w.front() = 1 = " << w.front() << endl;
+	ret = ret && w.front() == 1;
+	report << "w.back() = 5 = " << w.back() << endl;
+	ret = ret && w.back() == 5;
+
+	report << "w.empty() = false = " << w.empty() << endl;
+	ret = ret && !w.empty();
+
+	report << w << std::endl;
+
+	report << "Printing using operator[]: (";
+	for (unsigned long i = 0; i < w.size(); i++)
+	{
+		report << w[(size_t)i];
+		if ( i < (w.size() - 1) ) report << ", ";
+	}
+	report << ')' << endl;
+
+#if 0
+	report << "Printing using at(): (";
+	for (unsigned long i = 0; i < w.size(); i++)
+	{
+		report << w.at(i);
+		if ( i < (w.size() - 1) ) report << ", ";
+	}
+	report << ')' << endl;
+#endif
+
+	report << "Assigning subvector: ";
+	Vector vv(F,n);
+	subVector ww(vv, 0, 1, 3);
+	//vector<int> ww(3, 77);
+	w = ww;
+	report << ww << std::endl;
+#if 0
+	report << "Constructing subvector from iterators: ";
+	Subvect www(w.begin(), w.end());
+	report << www << std::endl;
+#endif
+
+	// finish
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, title);
+	return ret;
+}
+
 // vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
diff --git a/tests/test-sum.C b/tests/test-sum.C
index cba563f..8bea9e2 100644
--- a/tests/test-sum.C
+++ b/tests/test-sum.C
@@ -6,20 +6,20 @@
  *
  * ------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -40,15 +40,15 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
+
 
 #include "linbox/util/commentator.h"
 #include "linbox/vector/stream.h"
 #include "linbox/field/archetype.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/givaro.h"
+#include "linbox/ring/modular.h"
+//#include "linbox/field/givaro.h"
 #ifdef __LINBOX_HAVE_NTL
-#include "linbox/field/ntl.h"
+#include "linbox/ring/ntl.h"
 #endif
 #include "linbox/vector/vector-domain.h"
 #include "linbox/blackbox/diagonal.h"
@@ -69,7 +69,7 @@ static bool testBBrebind (const Field2 &F2, const Blackbox& B)
 
     FBlackbox A(B, F2);
 
-    return testBlackbox(A);
+    return testBlackboxNoRW(A);
 }
 
 
@@ -91,29 +91,27 @@ static bool testZeroApply (Field1 &F1, Field2 &F2, VectorStream<Vector> &stream1
 	commentator().start ("Testing zero apply", "testZeroApply", stream1.m ());
 
 	bool ret = true;
-	bool iter_passed = true;
 
-	Vector d1, d2, v, w, zero;
+	Vector d1(F1), d2(F1), v(F1), w(F1)
+		// , zero
+		;
 	VectorDomain<Field1> VD (F1);
-	typename Field1::Element neg_one;
 
-	VectorWrapper::ensureDim (zero, stream1.dim ());
+	// VectorWrapper::ensureDim (zero, stream1.dim ());
 	VectorWrapper::ensureDim (d1, stream1.dim ());
 	VectorWrapper::ensureDim (d2, stream1.dim ());
 	VectorWrapper::ensureDim (v, stream1.dim ());
 	VectorWrapper::ensureDim (w, stream2.dim ());
-// 	F.init (neg_one, 1);
-// 	F.negin (neg_one);
-	F1.init (neg_one, -1);
+
 
 	while (stream1) {
 		commentator().startIteration ((unsigned)stream1.j ());
-		iter_passed = true;
+		bool iter_passed = true;
 
 		stream1.next (d1);
-		VD.mul (d2, d1, neg_one);
+		VD.mul (d2, d1, F1.mOne);
 
-		Diagonal <Field1> D1 (F1, d1), D2 (F1, d2);
+		Diagonal <Field1> D1 (d1), D2 (d2);
 
 		Sum <Diagonal<Field1>,Diagonal <Field1> > A (&D1, &D2);
 
@@ -224,17 +222,20 @@ int main (int argc, char **argv)
 	};
 
 #ifdef __LINBOX_HAVE_NTL
-//        typedef UnparametricField<NTL::zz_p> Field;
+//        typedef Givaro::ZRing<NTL::zz_p> Field;
         typedef NTL_zz_p Field;
 // 	NTL::zz_p::init(q1); // Done in the constructor
 #else
-	typedef Modular<int32_t> Field ;
+	typedef Givaro::Modular<double> Field ;
+	//typedef Givaro::Modular<int32_t> Field ;
 #endif
-	Field F1(q1);
+	Field F1(q1); Field::RandIter gen(F1);
+    
 
-        GivaroZpz< Givaro::Std32> F2(q2);
+        Givaro::Modular<double> F2(q2);
+        //Givaro::Modular<int32_t> F2(q2);
 
-	typedef vector<Field::Element> Vector;
+	// typedef BlasVector<Field> Vector;
 
 	parseArguments (argc, argv, args);
 
@@ -243,39 +244,38 @@ int main (int argc, char **argv)
 	// Make sure some more detailed messages get printed
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
 
-	RandomDenseStream<Field> stream1 (F1, n, iterations1), stream2 (F1, n, iterations2);
+	RandomDenseStream<Field> stream1 (F1, gen, n, iterations1), stream2 (F1, gen, n, iterations2);
 
 	if (!testZeroApply (F1, F2, stream1, stream2)) pass = false;
 
 	n = 10;
-	RandomDenseStream<Field> stream3 (F1, n, iterations1), stream4 (F1, n, iterations2);
+	RandomDenseStream<Field> stream3 (F1, gen, n, iterations1), stream4 (F1, gen, n, iterations2);
 
-	Vector d1(n), d2(n);
-	stream3.next (d1);
-	stream4.next (d2);
+	// Vector d1(n), d2(n);
+	// stream3.next (d1);
+	// stream4.next (d2);
 
 //	Diagonal <Field, Vector> D1 (F, d1), D2 (F, d2);
 
 	Field::Element d; F1.init(d, 5);
-	ScalarMatrix<Field> D1(F1, 10, d), D2(F1, 10, d);
+	ScalarMatrix<Field> D1(F1, 10, 10, d), D2(F1, 10, 10, d);
 	typedef ScalarMatrix<Field> Blackbox;
 
 	Sum <Blackbox, Blackbox> A (D1, D2);
-	pass = pass && testBlackbox(A) && testBBrebind(F2, A);
+	pass = pass && testBlackboxNoRW(A) && testBBrebind(F2, A);
 
 
         Sum <Blackbox, Blackbox> Aref (&D1, &D2);
-	pass = pass && testBlackbox(Aref) && testBBrebind(F2, A);
+	pass = pass && testBlackboxNoRW(Aref) && testBBrebind(F2, A);
 
 	commentator().stop("Sum black box test suite");
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-toeplitz-det.C b/tests/test-toeplitz-det.C
index 4f42cc4..c3a7ec9 100644
--- a/tests/test-toeplitz-det.C
+++ b/tests/test-toeplitz-det.C
@@ -31,11 +31,13 @@
 
 
 
+#include <linbox/linbox-config.h>
+
 #include <iostream>
-#include <vector>
+
 #include "linbox/blackbox/toeplitz.h"
 #ifdef __LINBOX_HAVE_NTL
-#include "linbox/field/ntl.h"
+#include "linbox/ring/ntl.h"
 #endif
 #include "linbox/solutions/det.h"
 #include "linbox/randiter/random-prime.h"
@@ -67,25 +69,25 @@ int main(int argc, char* argv[])
 #ifdef __LINBOX_HAVE_NTL
 	srand((unsigned)time(0));
 	RandomPrimeIterator rp;
-	NTL_zz_p::RandIter randit;
+	NTL_zz_p CF( *rp ); NTL_zz_p::RandIter randit(CF);
+	NTL_zz_pX PF(CF);
+	
 	report << "\tUsing random primes and square matrices of size 2 to " << N_BOUND << endl;
 	//for( int i = 0; pass && i < 2; ++i ) {
 	size_t n;
-	do { n = rand() % N_BOUND; } while( n < 2 );
-
-	NTL_zz_p CF( *rp );
-	NTL_zz_pX PF(CF);
+	do { n = (size_t)rand() % N_BOUND; } while( n < 2 );
 
 	BlasMatrix<NTL_zz_p> A(CF,n,n);
 
 	NTL_zz_p::Element temp;
 	NTL_zz_pX::Element poly;
-	PF.init(poly,0);
-	size_t r,c;
+	PF.assign(poly,PF.zero);
 
 	for( int diff = 1 - ((int)n); diff <= ((int)n) - 1; ++diff ) {
+		size_t c;
+		size_t r ;
 		randit.random(temp);
-		PF.setCoeff(poly,(size_t)(diff + n - 1), temp );
+		PF.setCoeff(poly,(size_t)(diff + (int)n - 1), temp );
 		r = c = 0;
 		if( diff < 0 ) c = (size_t)(diff*-1);
 		else r = (size_t)diff;
@@ -114,7 +116,7 @@ int main(int argc, char* argv[])
 #if 0
 	NTL_ZZ_pX F( 65521 );
 	NTL_ZZ_pX::Element a,b;
-	F.init(a,1);
+	F.assign(a,F.one);
 	F.init(b,4);
 	F.mulin(a,b);
 	F.write(cout,a) << endl;
diff --git a/tests/test-toom-cook.C b/tests/test-toom-cook.C
index 7ef0a31..c3415bd 100644
--- a/tests/test-toom-cook.C
+++ b/tests/test-toom-cook.C
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 2012 the LinBox group
  *
- * written by BB <bboyer at imag.fr>
+ * written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
  *
  *
  * ========LICENCE========
@@ -30,23 +30,177 @@
  * @test toom-cook multiplication routine
  */
 
+#include <linbox/linbox-config.h>
+
 
+#include "linbox-config.h"
 #include <iostream>
-#include <linbox/linbox-config.h>
-#include <linbox/field/modular.h>
-#include <linbox/matrix/blas-matrix.h>
-#include <linbox/matrix/random-matrix.h>
+#include "linbox/integer.h"
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/random-matrix.h"
 // #include <fflas-ffpack/fflas/fflas.h>
-#include <linbox/field/givaro.h>
-#include <linbox/util/timer.h>
+#include "givaro/modular.h"
+#include "linbox/util/timer.h"
 
 #include "linbox/algorithms/matrix-blas3/mul.h"
 
 #include "test-common.h"
+
+
+
+namespace LinBox { namespace Protected {
+	struct IntegerSparseCraMatMul {
+
+
+		typedef SparseMatrixFormat::CSR spfmt ;
+		typedef Givaro::Modular<double>         Field;
+		typedef Field::Element          Element;
+		typedef SparseMatrix<Field,spfmt>       ModularMatrix ;
+		typedef BlasVector<Field>               ModularVector;
+		typedef BlasVector<Givaro::ZRing<Integer> >         IntegerVector;
+		typedef SparseMatrix<Givaro::ZRing<Integer>,spfmt> IntegerMatrix ;
+
+#ifdef _LB_MM_TIMING
+#ifdef _OPENMP
+		typedef LinBox::OMPTimer Mytime;
+#else
+		typedef LinBox::Timer    Mytime;
+#endif
+#endif
+
+		const IntegerMatrix &_A_ ;
+		const IntegerVector &_B_ ;
+
+#ifdef _LB_MM_TIMING
+		mutable Mytime chrono;
+#endif
+
+		IntegerSparseCraMatMul(const IntegerMatrix& A, const IntegerVector& B) :
+			_A_(A), _B_(B)
+		{
+#ifdef _LB_MM_TIMING
+			chrono.clear();
+#endif
+			// linbox_check(A.getPointer() == _A_.getPointer());
+		}
+
+		IntegerSparseCraMatMul(IntegerMatrix& A, IntegerVector& B) :
+			_A_(A), _B_(B)
+		{
+#ifdef _LB_MM_TIMING
+			chrono.clear();
+#endif
+			// linbox_check(A.getPointer() == _A_.getPointer());
+		}
+
+		ModularVector& operator()(ModularVector& Cp, const Field& F) const
+		{
+			// BlasMatrixDomain<Field>   BMD(F);
+
+			/*  intialisation */
+			// ModularMatrix Cpp(_A_.rowdim(),_B_.coldim());
+			// Cp = Cpp ;
+			ModularMatrix Ap(_A_, F);
+			ModularVector Bp(F, _B_);
+			Cp.resize(Ap.rowdim());
+
+			/*  multiplication mod p */
+
+#ifdef _LB_MM_TIMING
+			Mytime matmul; matmul.clear(); matmul.start();
+#endif
+			// BMD.mul(Cp,Ap,Bp);
+			Ap.apply(Cp,Bp);
+			// BMD.axpyin(Cp,Ap,Bp);
+#if 0
+			// BMD.mul( static_cast<BlasMatrix<double>&>(Cp),Ap,Bp);
+			if (FAM_TYPE == _axpy)
+				BMD.axpyin(Cp,Ap,Bp);
+			else if (FAM_TYPE == _axmy)
+				BMD.axmyin(Cp,Ap,Bp);
+			else if (FAM_TYPE == _maxpy)
+				BMD.maxpyin(Cp,Ap,Bp);
+#endif
+#ifdef _LB_MM_TIMING
+			matmul.stop();
+			this->chrono+=matmul;
+#endif
+#if 0
+			if (Ap.rowdim() <= 20 && Ap.coldim() <= 20) {
+				Integer chara;
+				F.characteristic(chara);
+				F.write(cout) << endl;
+				cout << "p:=" << chara << ';' << std::endl;
+				A.write(cout<< "A:=",true) << ';' << std::endl;
+				Ap.write(cout << "Ap:=", F, true) << ';' << endl;
+				Bp.write(cout << "Bp:=", F, true) << ';' << endl;
+				Cp.write(cout<< "Cp:=", F, true) << ';' << endl;
+			}
+#endif
+			return Cp;
+		}
+
+
+
+	};
+} // Protected
+} // LinBox
+
+namespace LinBox { namespace BLAS2 {
+
+	template<class _anyVector>
+	_anyVector & mul (_anyVector& C,
+			  const SparseMatrix<typename _anyVector::Field, SparseMatrixFormat::CSR> & A,
+			  const _anyVector& B,
+			  const BLAS3::mulMethod::CRA &)
+	{
+
+		size_t PrimeSize = 22; //! @todo pourqoi ?
+
+		integer mA, mB ;
+		mA = A.magnitude();
+		mB = B.magnitude();
+		integer cA = (integer) A.maxrow();
+		double logC = Givaro::naturallog(mA*mB*cA);
+
+		typedef Givaro::Modular<double> ModularField ;
+		ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+
+
+		{
+
+                        RandomPrimeIterator genprime( (unsigned int)PrimeSize );
+			ChineseRemainder< FullMultipBlasMatCRA< ModularField > > cra( std::pair<size_t,double>(C.size(), logC) );
+			Protected::IntegerSparseCraMatMul iteration(A,B);
+
+			cra(C, iteration, genprime);
+
+#ifdef _LB_DEBUG
+#ifdef _LB_MM_TIMING
+#endif
+
+			Integer mC;
+			mC = C.magnitude();
+			report << "C max: " << logtwo(mC) <<  " (" << LinBox::naturallog(mC) << ')' << std::endl;
+#endif
+
+		}
+
+		report << mA << ',' << mB << ',' <<  C.magnitude() << std::endl;
+
+		return C;
+
+	}
+} // BLAS2
+} // LinBox
+
+using namespace LinBox;
 int main(int ac, char ** av) {
 	static int p = 1009;
 	static int e = 3 ;
 	static size_t m = 10, n = 10 , k = 10;
+	static size_t b = 10 ;
 
 	static Argument as[] = {
 		{ 'n', "-n N", "Set cols of C .",                 TYPE_INT,     &n },
@@ -54,99 +208,204 @@ int main(int ac, char ** av) {
 		{ 'k', "-k N", "Set rows of B .",                 TYPE_INT,     &k },
 		{ 'p', "-p N", "Set characteristic.",                 TYPE_INT,     &p },
 		{ 'e', "-e N", "Set degree.",                 TYPE_INT,     &e },
+		{ 'b', "-b N", "Set length of integers.",                 TYPE_INT,     &b },
 		END_OF_ARGUMENTS
 	};
 
 
-	LinBox::parseArguments (ac, av, as);
+	parseArguments (ac, av, as);
+	commentator().start("toom-cook suite", "toom");
+	ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
 
-	if (e < 2) {
-		std::cout << " e > 1 please ! " << std::endl;
-		return 0 ;
-	}
 
+	Timer Tim ;
+	{ /* Toom Cook over GivarorExtension */
+		//typedef Givaro::Modular<int64_t> Zpz;
+		typedef Givaro::Modular<double> Zpz;
+		typedef Givaro::Extension< Zpz > GFpe ;
 
-	typedef LinBox::Modular<double> Zpz;
-	typedef LinBox::GivaroExtension< Zpz > GFpe ;
+		// Z/pZ
+		Zpz F(p);
+		// GF(p^e) ;
+		GFpe GF (F, 2);
+		MatrixDomain<GFpe> MD(GF);
 
-	// Z/pZ
-	Zpz F(p);
-	// GF(p^e) ;
-	GFpe GF (F, 2);
+		GF.write(report << "This is the field with " << (Integer)pow((Integer)p,e) << " elements: ") << ", using: "   << GF.irreducible() << " as irreducible polynomial" << std::endl;
+		report << "matrices are " << m << 'x' << k << " and " << k << 'x' << n <<  std::endl;
 
-	GF.write(std::cout << "This is the field with " << (LinBox::Integer)pow((LinBox::Integer)p,e) << " elements: ") << ", using: "   << GF.irreducible() << " as irreducible polynomial" << std::endl;
+		BlasMatrix<GFpe> A(GF,m,k);
+		BlasMatrix<GFpe> B(GF,k,n);
+		BlasMatrix<GFpe> C(GF,m,n);
 
-	LinBox::BlasMatrix<GFpe> A(GF,m,k);
-	LinBox::BlasMatrix<GFpe> B(GF,k,n);
-	LinBox::BlasMatrix<GFpe> C(GF,m,n);
+		typedef GFpe::RandIter Randiter;
+		Randiter R(GF);
+		RandomDenseMatrix<Randiter,GFpe> randomizer(GF,R) ;
+		randomizer.random(A);
+		// report << "A[0,0] = " << A.getEntry(0,0) << std::endl;
+		randomizer.random(B);
 
-	typedef typename GFpe::RandIter Randiter;
-	Randiter R(GF);
-	LinBox::RandomDenseMatrix<Randiter,GFpe> randomizer(GF,R) ;
-	randomizer.random(A);
-	// std::cout << "A[0,0] = " << A.getEntry(0,0) << std::endl;
-	randomizer.random(B);
+		report << "naive over GFq" << std::endl;
+		Tim.clear(); Tim.start();
+		BLAS3::mul(C,A,B,BLAS3::mulMethod::naive());
+		Tim.stop();
+		report << Tim << '(' << C.getEntry(0,0) << ')' << std::endl;
 
-	LinBox::Timer Tim ;
-	std::cout << "naive over GFq" << std::endl;
-	Tim.clear(); Tim.start();
-	LinBox::BLAS3::mul(C,A,B,LinBox::BLAS3::mulMethod::naive());
-	Tim.stop();
-	std::cout << Tim << '(' << C.getEntry(0,0) << ')' << std::endl;
+		{
+			report << "ToomCook low mem" << std::endl;
+			BlasMatrix<GFpe> D(GF,m,n);
+			Tim.clear(); Tim.start();
+			BLAS3::mul(D,A,B,BLAS3::mulMethod::ToomCook<GFpe>(GF,false));
+			Tim.stop();
+			report << Tim << '(' << D.getEntry(0,0) << ')' << std::endl;
 
-	// for (size_t i = 0 ; i< m ; ++i)
-		// for (size_t j = 0 ; j< n ; ++j)
-			// C.setEntry(i,j,GF.zero);
+			if (!MD.areEqual(D,C)) {
+				report << "low mem error" << std::endl;
+//				return 1;
+			}
+		}
 
-	// std::cout << "A[0,0] = " << A.getEntry(0,0) << std::endl;
-	{
-		std::cout << "ToomCook low mem" << std::endl;
-		LinBox::BlasMatrix<GFpe> D(GF,m,n);
-		Tim.clear(); Tim.start();
-		LinBox::BLAS3::mul(D,A,B,LinBox::BLAS3::mulMethod::ToomCook<GFpe>(GF,false));
-		Tim.stop();
-		std::cout << Tim << '(' << D.getEntry(0,0) << ')' << std::endl;
-		if (m*n < 100) {
-			for (size_t i = 0 ; i < m ; ++i)
-				for (size_t j = 0 ; j < n ; ++j)
-					if (!(GF.areEqual(D.getEntry(0,0),C.getEntry(0,0))))
-						return 1;
+		{
+			report << "ToomCook high mem" << std::endl;
+			BlasMatrix<GFpe> D(GF,m,n);
+			Tim.clear(); Tim.start();
+			BLAS3::mul(D,A,B,BLAS3::mulMethod::ToomCook<GFpe>(GF,true));
+			Tim.stop();
+			report << Tim << '(' << D.getEntry(0,0) << ')' << std::endl;
+
+			if (!MD.areEqual(D,C)) {
+				report << "high mem error" << std::endl;
+//				return 1;
+			}
 		}
-		else {
-			int r =100 ;
-			while (--r)  {
-				size_t i = rand()%m;
-				size_t j = rand()%n;
-				if (!(GF.areEqual(D.getEntry(i,j),C.getEntry(i,j))))
-					return 1;
+
+		{
+			report << "Matrix Domain" << std::endl;
+			BlasMatrix<GFpe> D(GF,m,n);
+			Tim.clear(); Tim.start();
+			MD.mul(D,A,B);
+			Tim.stop();
+			report << Tim << '(' << D.getEntry(0,0) << ')' << std::endl;
+
+			if (!MD.areEqual(D,C)) {
+				report << "Matrix Domain error" << std::endl;
+//				return 1;
 			}
-			// TODO check with apply !
 		}
 	}
 
-	{
-		std::cout << "ToomCook high mem" << std::endl;
-		LinBox::BlasMatrix<GFpe> D(GF,m,n);
-		Tim.clear(); Tim.start();
-		LinBox::BLAS3::mul(D,A,B,LinBox::BLAS3::mulMethod::ToomCook<GFpe>(GF,true));
+	{ /* ZZ mat mul */
+
+            Givaro::ZRing<Integer> ZZ ;
+		MatrixDomain<Givaro::ZRing<Integer> > MD(ZZ);
+		BlasMatrix<Givaro::ZRing<Integer> > A(ZZ,m,k) ;
+		BlasMatrix<Givaro::ZRing<Integer> > B(ZZ,k,n) ;
+		BlasMatrix<Givaro::ZRing<Integer> > C(ZZ,m,n) ;
+
+		A.random((unsigned)b);
+		B.random((unsigned)b);
+
+		report << "Naïve " << std::endl ;
+		Tim.clear() ; Tim.start() ;
+		BLAS3::mul(C,A,B,BLAS3::mulMethod::naive());
 		Tim.stop();
-		std::cout << Tim << '(' << D.getEntry(0,0) << ')' << std::endl;
-		if (m*n < 100) {
-			for (size_t i = 0 ; i < m ; ++i)
-				for (size_t j = 0 ; j < n ; ++j)
-					if (!(GF.areEqual(D.getEntry(0,0),C.getEntry(0,0))))
-						return 1;
+		report << Tim << '(' << C.getEntry(0,0) << ')' << std::endl;
+
+#ifdef __LINBOX_HAVE_FLINT
+		{
+			report << "FLINT " << std::endl;
+			BlasMatrix<Givaro::ZRing<Integer> > D(ZZ,m,n);
+			Tim.clear(); Tim.start();
+			BLAS3::mul(D,A,B,BLAS3::mulMethod::FLINT());
+			Tim.stop();
+			report << Tim << '(' << D.getEntry(0,0) << ')' << std::endl;
+
+			if (!MD.areEqual(D,C)) {
+				report << "FLINT error" << std::endl;
+				return 1;
+			}
+		}
+#endif // __LINBOX_HAVE_FLINT
+
+		{
+			report << "Matrix Domain" << std::endl;
+			BlasMatrix<Givaro::ZRing<Integer> > D(ZZ,m,n);
+			Tim.clear(); Tim.start();
+			MD.mul(D,A,B);
+			Tim.stop();
+			report << Tim << '(' << D.getEntry(0,0) << ')' << std::endl;
+
+			if (!MD.areEqual(D,C)) {
+				report << "Matrix Domain error" << std::endl;
+//				return 1;
+			}
+		}
+
+		{
+			report << "CRA " << std::endl;
+			BlasMatrix<Givaro::ZRing<Integer> > D(ZZ,m,n);
+			Tim.clear(); Tim.start();
+			BLAS3::mul(D,A,B,BLAS3::mulMethod::CRA());
+			Tim.stop();
+			report << Tim << '(' << D.getEntry(0,0) << ')' << std::endl;
+
+			if (!MD.areEqual(D,C)) {
+				// report << D << std::endl;
+				// report << C << std::endl;
+				report << "CRA error" << std::endl;
+//				return 1;
+			}
 		}
-		else {
-			int r =100 ;
-			while (--r)  {
-				size_t i = rand()%m;
-				size_t j = rand()%n;
-				if (!(GF.areEqual(D.getEntry(i,j),C.getEntry(i,j))))
-					return 1;
+	}
+
+	{ /* ZZ spmat mul */
+
+		typedef Givaro::ZRing<Integer> Field;
+		typedef SparseMatrix<Field,SparseMatrixFormat::CSR> BlackBox;
+		Field ZZ ;
+
+		VectorDomain<Givaro::ZRing<Integer> > MD(ZZ);
+
+		// typename Field::RandIter ri (ZZ,b);
+                Givaro::RandomIntegerIterator<false> ri(ZZ,(size_t)b);
+		double sparsity = 0.05;
+		RandomSparseStream<Field, typename BlackBox::Row, Givaro::RandomIntegerIterator<false> > stream (ZZ, ri, sparsity, k, m);
+
+		BlackBox A (ZZ, stream);
+
+		typedef BlasVector<Field> Vector ;
+		Vector x(ZZ,k);
+		Vector y(ZZ,m);
+
+		// size_t iter = 1 ;
+		// RandomDenseStream<Field, Vector> vs (ZZ, ri, k, iter);
+		x.random(ri);
+
+		report << "Naïve " << std::endl ;
+		Tim.clear() ; Tim.start() ;
+		A.apply(y,x);
+		Tim.stop();
+		report << Tim << '(' << y[0] << ')' << std::endl;
+
+
+		report << "CRA " << std::endl;
+		{
+
+
+			BlasVector<Givaro::ZRing<Integer> > z(ZZ,m);
+			Tim.clear(); Tim.start();
+			BLAS2::mul(z,A,x,BLAS3::mulMethod::CRA());
+			Tim.stop();
+			report << Tim << '(' << z[0] << ')' << std::endl;
+
+			if (!MD.areEqual(y,z)) {
+				// report << D << std::endl;
+				// report << C << std::endl;
+				report << "CRA error" << std::endl;
+//				return 1;
 			}
-			// TODO check with apply !
 		}
 	}
+	commentator().stop("toom-cook suite");
+
 	return 0;
 }
diff --git a/tests/test-trace.C b/tests/test-trace.C
index 7595f9b..80c60ed 100644
--- a/tests/test-trace.C
+++ b/tests/test-trace.C
@@ -6,20 +6,20 @@
  *
  * --------------------------------------------------------
  *
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -39,11 +39,11 @@
 #include "linbox/linbox-config.h"
 
 #include <iostream>
-#include <vector>
+
 
 #include "test-common.h"
 
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 #include "linbox/solutions/trace.h"
 
 using namespace LinBox;
@@ -65,35 +65,70 @@ int main (int argc, char **argv)
 
 	commentator().start("Trace test suite", "Trace");
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (3);
+#ifdef __LINBOX_HAVE_NTL
+	ostream& report = commentator().report();
+#endif
 
-	typedef Modular<int> Field;
+	typedef Givaro::Modular<int> Field;
 	typedef Field::Element Element;
-	typedef vector<Element> Vector;
+	// typedef vector<Element> Vector;
 	Field F (q);
 	Element t, t1, t2, t3;
-	F.init(t, 0); F.init(t1, 0); F.init(t2, 0); F.init(t3, 0);
+	F.assign(t, F.zero); F.assign(t1, F.zero); F.assign(t2, F.zero); F.assign(t3, F.zero);
 
+// scalar matrix
 	Element s; F.init(s, 3);
-	ScalarMatrix<Field> A(F, n, s);
+	ScalarMatrix<Field> A(F, n, n, s);
 	F.init(t, n*3);
+
 	trace(t1, A);
 	if (! F.areEqual(t1, t) ) pass = false;
-	trace(t2, A, TraceTags::Local() );
-	if (! F.areEqual(t1, t) ) pass = false;
-	trace(t3, A, TraceTags::Generic() );
-	if (! F.areEqual(t1, t) ) pass = false;
 
-/*
-	Vector v(2*n-1, s);
-	for (int i = 0; i < 2*n-1; ++i) if (i != n-1) F.init(v[i], i);
-	Toeplitz<Field> B(F, n, v);
-	trace(t1, B);
-	if (! F.areEqual(t1, t) pass = false;
-	trace(t2, B, TraceTags::Local() );
-	if (! F.areEqual(t1, t) pass = false;
-	trace(t3, B, TraceTags::Generic() );
-	if (! F.areEqual(t1, t) pass = false;
-*/
+	SolutionTags::Local L;
+	trace(t2, A, L );
+	if (! F.areEqual(t2, t) ) pass = false;
+
+	SolutionTags::Generic G;
+	trace(t3, A, G );
+	if (! F.areEqual(t3, t) ) pass = false;
+
+#ifdef __LINBOX_HAVE_NTL
+// Toeplitz matrix
+
+	NTL_zz_p CF( q );
+	NTL_zz_p::Element u, u1, u2, u3;
+	CF.assign(u, CF.zero); CF.assign(u1, CF.zero); CF.assign(u2, CF.zero); CF.assign(u3, CF.zero);
+    NTL_zz_pX PF(CF);
+
+    NTL_zz_p::Element temp;
+    NTL_zz_pX::Element poly;
+    PF.assign(poly,PF.zero);
+
+    for( int diff = 1 - ((int)n); diff <= ((int)n) - 1; ++diff ) {
+		PF.setCoeff(poly,(size_t)((size_t)diff + n - 1), CF.init(temp,diff) );
+	}
+
+	Toeplitz<NTL_zz_p,NTL_zz_pX> B( PF, poly, n );
+
+	CF.assign(u, CF.zero);
+	trace(u1, B);
+	if (! CF.areEqual(u1, u)) {
+		pass = false;
+		report << "u and u1: " << u << " " << u1 << endl;
+	}
+
+	trace(u2, B, SolutionTags::Local() );
+	if (! CF.areEqual(u2, u)) {
+		pass = false;
+		report << "u and u2: " << u << " " << u2 << endl;
+	}
+
+	trace(u3, B, SolutionTags::Generic() );
+	if (! CF.areEqual(u3, u)) {
+		pass = false;
+		report << "u and u3: " << u << " " << u3 << endl;
+	}
+#endif // __LINBOX_HAVE_NTL
 
 	commentator().stop("Trace solution test suite");
 	return pass ? 0 : -1;
diff --git a/tests/test-transpose.C b/tests/test-transpose.C
new file mode 100644
index 0000000..7600a82
--- /dev/null
+++ b/tests/test-transpose.C
@@ -0,0 +1,224 @@
+
+/* tests/test-transpose.C
+ *
+ * ------------------------------------
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+ * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ *.
+ */
+
+/*! @file  tests/test-transpose.C
+ * @ingroup tests
+ *
+ * @brief no doc
+ *
+ * @test no doc.
+ */
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+
+#include "linbox/util/commentator.h"
+#include "linbox/ring/modular.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/blackbox/scalar-matrix.h"
+#include "linbox/blackbox/transpose.h"
+#include "linbox/matrix/dense-matrix.h"
+#include "linbox/matrix/sparse-matrix.h"
+
+#include "test-common.h"
+#include "test-blackbox.h"
+
+using namespace LinBox;
+
+
+
+#if 0
+template <class Field2, class Blackbox>
+static bool testBBrebind (const Field2 &F2, const Blackbox& B)
+{
+    typedef typename Blackbox::template rebind<Field2>::other FBlackbox;
+
+    FBlackbox A(B, F2);
+
+    return testBlackbox(A);
+}
+#endif
+
+/* Test Transpose:
+ * Check that Transpose<Blackbox> meets blackbox interface and behaves
+ * as transpose.
+ *
+ * Return true on success and false on failure
+ */
+template <class Blackbox>
+static bool testTransposeBlackbox(Blackbox & A)
+{
+	typedef typename Blackbox::Field Field;
+	commentator().start ("Testing Transpose", "testTranspose", 1);
+
+	Transpose<Blackbox> B(A);
+
+	bool ret = true, ret1;
+
+	size_t m = A.rowdim(), n = A.coldim();
+	const Field & F = A.field();
+	VectorDomain<Field> VD (F);
+	BlasVector<Field> x(F,n), y(F,m), z(F,n), w(F,m);
+
+	VD.random(x);
+	A.apply(y, x);
+	B.applyTranspose(w, x);
+	ret1 = VD.areEqual(y, w);
+	if (not ret1) commentator().report() << "A and B^T disagree, FAIL" << std::endl;
+	ret = ret and ret1;
+
+	VD.random(y);
+	A.applyTranspose(x, y);
+	B.apply(z, y);
+	ret1 = VD.areEqual(x, z);
+	if (not ret1) commentator().report() << "A^T and B disagree, FAIL" << std::endl;
+	ret = ret and ret1;
+
+	ret1 = testBlackboxNoRW(B);
+	if (not ret1) commentator().report() << "testBlackbox A^T FAIL" << std::endl;
+	ret = ret and ret1;
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testTranspose");
+
+	return ret;
+}
+
+
+/* Test getEntry and setEntry of a Transpose<BB>.
+ *
+ * this test template can be instantiated only if the underlying class BB
+ * has getEntry and setEntry (as dense and sparse matrix types should).
+ *
+ * For such matrices, A and A^T should share memory, so that results of
+ * setEntry on one are reflected by getEntry on the other.
+ */
+template <class Matrix>
+bool testTransposeMatrix(Matrix& A) {
+	commentator().start ("Testing Transpose", "testTranspose", 1);
+	bool ret = true, ret1;
+	typedef typename Matrix::Field Field;
+	typename Field::Element x, y;
+	const Field & F = A.field();
+	F.init(x);
+	F.init(y);
+	Transpose<Matrix> B(A);
+	size_t m = A.rowdim(), n = A.coldim();
+
+	size_t i = (size_t)rand()%m, j = (size_t)rand()%n;
+	A.getEntry(x, i, j);
+	B.getEntry(y, j, i);
+	ret = ret and (ret1 = F.areEqual(x, y));
+	if (not ret1) commentator().report() << "A, A^T same getentry FAIL" << std::endl;
+
+	i = (size_t)rand()%m, j = (size_t)rand()%n;
+	A.setEntry(i, j, x);
+	B.getEntry(y, j, i);
+	ret = ret and (ret1 = F.areEqual(x, y));
+	if (not ret1) commentator().report() << "A set, A^T getEntry FAIL" << std::endl;
+
+	i = (size_t)rand()%m, j = (size_t)rand()%n;
+	B.setEntry(j, i, x);
+	A.getEntry(y, i, j);
+	ret = ret and (ret1 = F.areEqual(x, y));
+	if (not ret1) commentator().report() << "A^T set, A getEntry FAIL" << std::endl;
+
+	commentator().stop (MSG_STATUS (ret), (const char *) 0, "testTranspose");
+	return ret;
+}
+
+int main (int argc, char **argv)
+{
+	bool pass = true;
+
+	static size_t m = 8;
+	static size_t n = 10;
+	static integer q = 101;
+
+	static Argument args[] = {
+		{ 'm', "-m M", "Set dimension of test matrices to NxN.", TYPE_INT,     &m },
+		{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT,     &n },
+		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+		END_OF_ARGUMENTS
+	};
+
+	typedef Givaro::Modular<int32_t> Field ;
+	Field F(q);
+
+	// typedef vector<Field::Element> Vector;
+
+	parseArguments (argc, argv, args);
+
+	commentator().start("transpose black box test suite", "transpose");
+
+	// Make sure some more detailed messages get printed
+	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (2);
+
+	commentator().start("test on ScalarMatrix");
+	Field::Element s; F.init(s, 5);
+	ScalarMatrix<Field> A(F, n, n, s);
+	pass = pass and testTransposeBlackbox(A);
+	commentator().stop(MSG_STATUS (pass), (const char *) 0, "test on ScalarMatrix");
+
+	commentator().start("test on BlasMatrix");
+	BlasMatrix<Field> B(F, m, n);
+	for (size_t i = 0; i < m; ++i)
+		for (size_t j = 0; j < n; ++j)
+			B.setEntry(i, j, F.init(s, i*j));
+	pass = pass and testTransposeBlackbox(B);
+	pass = pass and testTransposeMatrix(B);
+	commentator().stop(MSG_STATUS (pass), (const char *) 0, "test on BlasMatrix");
+
+	commentator().start("test on TriplesBB");
+#if 0 /* fails because setEntry(?,?,0) fails. */
+	SparseMatrix<Field,SparseMatrixFormat::TPL> C(F, m, n);
+	for (size_t i = 0; i < min(m, n); ++i) C.setEntry(i, i, F.init(s, i+1));
+	pass = pass and testTransposeBlackbox(C);
+	pass = pass and testTransposeMatrix(C);
+#endif
+	commentator().stop(MSG_STATUS (pass), (const char *) 0, "test on TriplesBB");
+
+	commentator().start("test on COO");
+	SparseMatrix<Field,SparseMatrixFormat::COO> C(F, m, n);
+	for (size_t i = 0; i < min(m, n); ++i) C.setEntry(i, i, F.init(s, i+1));
+	pass = pass and testTransposeBlackbox(C);
+	pass = pass and testTransposeMatrix(C);
+	commentator().stop(MSG_STATUS (pass), (const char *) 0, "test on TriplesBB");
+
+	commentator().stop(MSG_STATUS (pass), (const char *) 0, "transpose black box test suite");
+	return pass ? 0 : -1;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-triplesbb-omp.C b/tests/test-triplesbb-omp.C
new file mode 100644
index 0000000..7cdfa00
--- /dev/null
+++ b/tests/test-triplesbb-omp.C
@@ -0,0 +1,414 @@
+/* Copyright (C) LinBox
+ *
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file  tests/test-triplesbb-omp.C
+ * @ingroup tests
+ *
+ * @brief no doc
+ *
+ * @test no doc.
+ */
+
+
+#include "linbox/linbox-config.h"
+
+#include <iostream>
+#include <fstream>
+
+#include <omp.h>
+#include <set>
+#include <utility>
+#include <sstream>
+
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+// #include "linbox/blackbox/triplesbb-omp.h"
+// #include "linbox/blackbox/triplesbb.h"
+#include "linbox/blackbox/transpose.h"
+#include "linbox/vector/vector-domain.h"
+#include "linbox/matrix/dense-matrix.h"
+
+#include "examples/map-sparse.h"
+
+#include "test-common.h"
+#include "test-generic.h"
+
+using namespace LinBox;
+
+int randRange(int start, int end)
+{
+        double rval = rand();
+        static const double NORMALIZING_CONSTANT = 1.0/(1.0+RAND_MAX);
+        double normedRVal = rval*NORMALIZING_CONSTANT;
+        double rangeSize = end-start;
+        int offset = (int)(rangeSize*normedRVal);
+        return start+offset;
+}
+
+template<class Field>
+void varyMatMatPair(MapSparse<Field>& leftMat, MapSparse<Field>& rightMat, int q)
+{
+        typedef typename Field::Element Element;
+
+        Field F(q);
+        Element d;
+
+        int m=(int)leftMat.rowdim();
+        int n=(int)leftMat.coldim();
+        int p=(int)rightMat.coldim();
+
+        int leftRow=randRange(0,m);
+        int leftCol=randRange(0,n);
+        int rightCol=randRange(0,p);
+
+        if (F.isZero(rightMat.getEntry(leftCol,rightCol))) {
+                F.init(d,randRange(1,q));
+                rightMat.setEntry(leftCol,rightCol,d);
+                F.init(d,randRange(1,q));
+                leftMat.setEntry(leftRow,leftCol,d);
+        } else {
+                do {
+                        F.init(d,randRange(0,q));
+                } while (F.areEqual(d,leftMat.getEntry(leftRow,leftCol)));
+                leftMat.setEntry(leftRow,leftCol,d);
+        }
+}
+
+template<class Field,class Blackbox>
+void computeAnswer(const MapSparse<Field>& A,
+                   const MapSparse<Field>& X,
+                   MapSparse<Field>& Y,
+                   const Field& F,
+                   bool isRight,
+                   bool useVector)
+{
+	typedef BlasVector<Field> Vector ;
+        typedef typename MatrixDomain<Field>::OwnMatrix OwnMatrix;
+
+        LinBox::MatrixDomain<Field> MD(F);
+
+        if (useVector) {
+                if (isRight) {
+                        Vector vecX(F,X.coldim()),vecY(F,A.coldim());
+                        X.toVector(vecX);
+                        Blackbox matA(F);
+                        A.copy(matA);
+                        matA.applyTranspose(vecY,vecX);
+                        Y.fromVector(vecY,1,A.coldim());
+                } else {
+                        Vector vecX(F,X.rowdim()),vecY(F,A.rowdim());
+                        X.toVector(vecX);
+                        Blackbox matA(F);
+                        A.copy(matA);
+                        matA.apply(vecY,vecX);
+                        Y.fromVector(vecY,A.rowdim(),1);
+                }
+        } else {
+                OwnMatrix matX(F,X.rowdim(),X.coldim());
+                if (isRight) {
+                        OwnMatrix matY(F,X.rowdim(),A.coldim());
+                        X.copy(matX);
+                        Blackbox matA(F);
+                        A.copy(matA);
+                        matA.applyRight(matY,matX);
+                        Y.copyFrom(matY);
+                } else {
+                        OwnMatrix matY(F,A.rowdim(),X.coldim());
+                        X.copy(matX);
+                        Blackbox matA(F);
+                        A.copy(matA);
+                        matA.applyLeft(matY,matX);
+                        Y.copyFrom(matY);
+                }
+        }
+}
+
+bool outputResult(std::string testName,
+                  bool expected,
+                  bool actual,
+                  int m, int n, int p, int nnz, int numThreads, int q,
+                  ostream& report)
+{
+        report << "Testing " << testName << " using: " <<
+                "m=" << m << " n=" << n << " p=" << p << " nnz=" << nnz << " numthreads=" << numThreads << " q=" << q << std::endl;
+
+        if (expected==actual) {
+                report << "PASS: ";
+        } else {
+                report << "FAILURE: ";
+        }
+        report << testName << " expected " << expected << " got " << actual << std::endl;
+
+        return expected==actual;
+}
+
+template<class Field>
+void reshapeAndScale(MapSparse<Field>& matOut,
+                     MapSparse<Field>& matIn,
+                     int m, int n, int alpha)
+{
+        typedef typename Field::Element Element;
+
+        matOut.shape(m,n);
+        m=(m<(int)matIn.rowdim())?m:(int)matIn.rowdim();
+        n=(n<(int)matIn.coldim())?n:(int)matIn.coldim();
+        Element d,a,t;
+        matIn.field().init(a,alpha);
+        for (int i=0;i<m;++i) {
+                for (int j=0;j<n;++j) {
+                        d=matIn.getEntry(i,j);
+                        matIn.field().mul(t,d,a);
+                        matOut.setEntry(i,j,t);
+                }
+        }
+}
+
+template <class Field>
+bool runIdentTest(int n,
+                  int m,
+                  int p,
+                  int q,
+                  int numThreads,
+                  bool shouldFail,
+                  bool isRight,
+                  bool useVector,
+                  ostream& report)
+{
+        typedef SparseMatrix<Field,SparseMatrixFormat::TPL_omp> OMPBlackbox;
+
+        omp_set_num_threads(numThreads);
+
+        Field F(q);
+        MapSparse<Field> A(F,n,m),X,YTest,YRef;
+        if (isRight) {
+                X.init(F,p,n);
+                YTest.init(F,p,m);
+                YRef.init(F,p,m);
+        } else {
+                X.init(F,m,p);
+                YTest.init(F,n,p);
+                YRef.init(F,n,p);
+        }
+        int alpha=randRange(1,q);
+        MapSparse<Field>::generateScaledIdent(A,alpha);
+        MapSparse<Field>::generateDenseRandMat(X,q);
+        if (isRight) {
+                reshapeAndScale<Field>(YRef,X,p,m,alpha);
+        } else {
+                reshapeAndScale<Field>(YRef,X,n,p,alpha);
+        }
+
+        if (isRight && shouldFail) {
+                varyMatMatPair<Field>(X,A,q);
+        } else if ((!isRight) && shouldFail) {
+                varyMatMatPair<Field>(A,X,q);
+        }
+
+        computeAnswer<Field,OMPBlackbox>(A,X,YTest,F,isRight,useVector);
+        std::string testName;
+        if ((!isRight) && useVector) {
+                testName="ident apply()";
+        } else if (isRight && (!useVector)) {
+                testName="ident applyRight()";
+        } else if (isRight && useVector) {
+                testName="ident applyTranspose()";
+        } else {
+                testName="ident applyLeft()";
+        }
+        int nnz=(n<m)?n:m;
+        return outputResult(testName,!shouldFail,YRef.areEqual(YTest),m,n,p,nnz,numThreads,q,report);
+}
+
+template <class Field>
+bool runRandTest(int n,
+                 int m,
+                 int p,
+                 double density,
+                 int q,
+                 int numThreads,
+                 bool shouldFail,
+                 bool isRight,
+                 bool useVector,
+                 ostream& report)
+{
+        typedef SparseMatrix<Field,SparseMatrixFormat::TPL_omp> OMPBlackbox;
+        typedef SparseMatrix<Field,SparseMatrixFormat::TPL> SeqBlackbox;
+
+        omp_set_num_threads(numThreads);
+
+        double matSize=n*m;
+        int nnz=(int) (density*matSize);
+
+        Field F(q);
+        MapSparse<Field> A(F,n,m),X,YTest,YRef;
+        if (isRight) {
+                X.init(F,p,n);
+                YTest.init(F,p,m);
+                YRef.init(F,p,m);
+        } else {
+                X.init(F,m,p);
+                YTest.init(F,n,p);
+                YRef.init(F,n,p);
+        }
+        MapSparse<Field>::generateRandMat(A,nnz,q);
+        MapSparse<Field>::generateDenseRandMat(X,q);
+
+        computeAnswer<Field,SeqBlackbox>(A,X,YRef,F,isRight,useVector);
+
+        if (isRight && shouldFail) {
+                varyMatMatPair<Field>(X,A,q);
+        } else if ((!isRight) && shouldFail) {
+                varyMatMatPair<Field>(A,X,q);
+        }
+
+        computeAnswer<Field,OMPBlackbox>(A,X,YTest,F,isRight,useVector);
+
+        std::string testName;
+        if ((!isRight) && useVector) {
+                testName="rand apply()";
+        } else if (isRight && (!useVector)) {
+                testName="rand applyRight()";
+        } else if (isRight && useVector) {
+                testName="rand applyTranspose()";
+        } else {
+                testName="rand applyLeft()";
+        }
+        return outputResult(testName,!shouldFail,YRef.areEqual(YTest),m,n,p,nnz,numThreads,q,report);
+}
+
+
+template<class Field>
+bool runSizeSuite(int n, int m, int p,
+                  double density,
+                  std::vector<int>& qs,
+                  std::vector<int>& numThreads,
+                  bool shouldFail, bool isRight,
+                  ostream& report)
+{
+        bool pass=true;
+        for (size_t i=0;i<qs.size();++i) {
+                for (size_t j=0;j<numThreads.size();++j) {
+                        if (p==1) {
+                                bool useVector=true;
+                                pass = pass && runRandTest<Field>
+                                        (n,m,p,density,qs[i],numThreads[j],
+                                         shouldFail,isRight,useVector,report);
+                                pass = pass && runIdentTest<Field>
+                                        (n,m,p,qs[i],numThreads[j],
+                                        shouldFail,isRight,useVector,report);
+                        }
+                        pass = pass && runRandTest<Field>
+                                (n,m,p,density,qs[i],numThreads[j],
+                                 shouldFail,isRight,false,report);
+                        pass = pass && runIdentTest<Field>
+                                (n,m,p,qs[i],numThreads[j],
+                                 shouldFail,isRight,false,report);
+                }
+        }
+        return pass;
+}
+
+template<class Field>
+bool testSuite(std::vector<int>& qs, ostream &report, bool extensive)
+{
+        bool pass=true;
+
+        std::vector<int> numThreads;
+        numThreads.push_back(1);
+        numThreads.push_back(2);
+        numThreads.push_back(3);
+        numThreads.push_back(4);
+        bool shouldFail=false,isRight=false;
+        do {
+			if (extensive){
+                pass=pass&&runSizeSuite<Field>(10000,10,1,0.01,qs,numThreads,shouldFail,isRight,report);
+                pass=pass&&runSizeSuite<Field>(10000,10,10,0.01,qs,numThreads,shouldFail,isRight,report);
+                pass=pass&&runSizeSuite<Field>(10,10000,1,0.01,qs,numThreads,shouldFail,isRight,report);
+                pass=pass&&runSizeSuite<Field>(10,10000,10,0.01,qs,numThreads,shouldFail,isRight,report);
+                pass=pass&&runSizeSuite<Field>(1,10000,1,0.1,qs,numThreads,shouldFail,isRight,report);
+
+                pass=pass&&runSizeSuite<Field>(10000,10000,1,0.0,qs,numThreads,shouldFail,isRight,report);
+			}
+
+                pass=pass&&runSizeSuite<Field>(2,2,1,1.0,qs,numThreads,shouldFail,isRight,report);
+                pass=pass&&runSizeSuite<Field>(2,2,10000,1.0,qs,numThreads,shouldFail,isRight,report);
+
+			if (extensive) {
+                pass=pass&&runSizeSuite<Field>(10000,10000,1,0.0001,qs,numThreads,shouldFail,isRight,report);
+                pass=pass&&runSizeSuite<Field>(10000,10000,10,0.0001,qs,numThreads,shouldFail,isRight,report);
+			}
+
+            shouldFail^=isRight;
+            isRight=!isRight;
+        } while (shouldFail || isRight);
+
+        return pass;
+}
+
+int main (int argc, char **argv)
+{
+	bool pass = true;
+
+	static size_t m = 400;
+	static size_t n = 200;
+        static size_t nnz = m*(n/100);
+	static integer q = 101;
+
+        // TODO: Remove this, it's no longer used
+	static Argument args[] = {
+		{ 'm', "-m M", "Temporary: set m > 999 for fuller test. was: Set row dimension of test matrix to M.", TYPE_INT,     &m },
+		{ 'n', "-n N", "Set col dimension of test matrix to N.", TYPE_INT,     &n },
+		{ 'z', "-z NNZ", "Set number of nonzero entries in test matrix.", TYPE_INT,     &nnz },
+		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
+		END_OF_ARGUMENTS
+	};
+
+	parseArguments (argc, argv, args);
+
+        if (nnz > m*n) {
+                nnz=m*(n/100);
+        }
+
+	srand ((unsigned)time (NULL));
+
+	commentator().start("TriplesBBOMP black box test suite", "triplesbbomp");
+
+	ostream &report = LinBox::commentator().report (LinBox::Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
+
+        std::vector<int> qs;
+        qs.push_back(2);
+        qs.push_back(65537);
+
+		pass = testSuite<Givaro::Modular<double> >(qs,report, m > 999);
+
+	commentator().stop("TriplesBBOMP black box test suite");
+	return pass ? 0 : -1;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+
diff --git a/tests/test-triplesbb.C b/tests/test-triplesbb.C
index 9ce8d93..32c0fdb 100644
--- a/tests/test-triplesbb.C
+++ b/tests/test-triplesbb.C
@@ -34,110 +34,138 @@
 
 #include <iostream>
 #include <fstream>
-#include <vector>
 
-#include "linbox/field/modular.h"
-#include "linbox/blackbox/triplesbb.h"
-#include "linbox/blackbox/transpose.h"
 
+#include "linbox/ring/modular.h"
+#include "linbox/matrix/sparse-matrix.h"
+#include "linbox/matrix/matrix-domain.h"
+#include "test-blackbox.h"
 #include "test-common.h"
-#include "test-generic.h"
 
+using namespace LinBox;
 
-/*! Check vector equality.
- *
- * @param a a vector
- * @param b another one
- * @todo factorize somewhere!
- *
- */
-template<class Vec>
-bool eqVec(const Vec& a, const Vec& b)
-{
-	bool good = true;
-	if (a.size() != b.size())
-		return !good;
-	for (typename Vec::size_type i = 0; i < a.size(); ++i) good = good && (a[i] == b[i]);
-	return good;
+template<class BB>
+void randBuild(BB & A, size_t nnz){
+	for(size_t i = 0; i < nnz; ++i)
+	{	typename BB::Field::Element d; A.field().init(d, rand());
+		size_t ii = rand()%A.rowdim();
+		size_t jj = rand()%A.coldim();
+		A.setEntry(ii,jj, d);
+	}
 }
 
-using namespace LinBox;
+template<class BB>
+void bidiag(BB & A){
+	typename BB::Field::Element d; A.field().assign(d, A.field().one);
+	A.setEntry(0,0, d);
+	size_t n = A.coldim() > A.rowdim() ? A.rowdim() : A.coldim();
+	for(size_t i = 1; i < n; ++i)
+	{	A.setEntry(i,i, d);
+		A.setEntry(i,i-1, d);
+	}
+}
 
 int main (int argc, char **argv)
 {
-	ofstream report;
+	// ofstream report;
 
 	bool pass = true;
 
-	static size_t n = 200;
-	static integer q = 2147483647U;
-	static int iterations = 10;
+	static size_t m = 4;
+	static size_t n = 20;
+	static size_t nnz = 0;
+	static integer q = 65521U;
+	q = 101;
 
 	static Argument args[] = {
-		{ 'n', "-n N", "Set dimension of test matrices to NxN.", TYPE_INT,     &n },
+		{ 'm', "-m M", "Set row dimension of test matrix to M.", TYPE_INT,     &m },
+		{ 'n', "-n N", "Set col dimension of test matrix to N.", TYPE_INT,     &n },
+		{ 'z', "-n NNZ", "Set number of nonzero entries in test matrix.", TYPE_INT,     &nnz },
 		{ 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INTEGER, &q },
-		{ 'i', "-i I", "Perform each test for I iterations.", TYPE_INT,     &iterations },
 		END_OF_ARGUMENTS
 	};
 
 	parseArguments (argc, argv, args);
 
+	if (nnz == 0) nnz = m*n/10;
+
 	srand ((unsigned)time (NULL));
 
-	commentator().start("triplesbb black box test suite", "triplesbb");
+	commentator().start("TriplesBB black box test suite", "triplesbb");
 
-	typedef Modular<uint32_t> Field;
+	//Field
+	typedef Givaro::Modular<double> Field;
 	typedef Field::Element Element;
-	typedef vector <Element> Vector;
-	typedef TriplesBB<Field> Blackbox;
-
 	Field F (q);
-	Element d;
-	F.init (d, -1);
-
-	// set up the matrix
-	std::vector<Element> values;
-	std::vector<size_t> rowP;
-	std::vector<size_t> colP;
-	for(int i = 1; i < 12; ++i)
-	{
-		values.push_back(i);
-		rowP.push_back(i%n + 1);
-		colP.push_back(i/n + 1);
-	}
-
-	Blackbox A(F, values, rowP, colP, n, n);
-
+	MatrixDomain<Field> MD(F);
+	typedef MatrixDomain<Field>::OwnMatrix OwnMatrix;
+	//Vectors
+	VectorDomain<Field> VD(F);
+	BlasVector<Field> x(F,n), y(F,m), z(F,m);
+	for (size_t i = 0; i < n; ++i) F.init(x[i], i+1);
+
+	// TriplesBB<Field> A(F, m, n);
+	SparseMatrix<Field,SparseMatrixFormat::TPL> A(F, m, n);
+	randBuild(A, nnz);
 	pass = pass && testBlackbox(A);
-
-	Transpose<Blackbox> B(&A);
-
+	// just see if it compiles
+	size_t b = 10;
+	OwnMatrix X(F,n,b), Y(F,m,b), Z(F,b,m), W(F,b,n);
+	X.random(); Z.random();
+	A.applyLeft(Y, X);
+	A.applyRight(W, Z);
+
+	// standard constructor
+	// TriplesBB<Field> B(F, m, n);
+	SparseMatrix<Field,SparseMatrixFormat::TPL> B(F, m, n);
+	bidiag(B);
 	pass = pass && testBlackbox(B);
-
-	Vector x(n), y(n), z(n);
-	for(int i = 0; i < 5; ++i) x[i] = i;
-
-	A.apply(y, x);
-	B.applyTranspose(z, x);
-	pass = pass && eqVec(y, z);
-
 	B.apply(y, x);
-	A.applyTranspose(z, x);
-	pass = pass && eqVec(y, z);
-
-	Blackbox C(F, n, n);
-	for(size_t i = 0; i < rowP.size(); ++i) C.addEntry(values[i], rowP[i], colP[i]);
+	// default cstor plus init
+	// TriplesBB<Field> C(F);
+	SparseMatrix<Field,SparseMatrixFormat::TPL> C(F);
+      	C.init(F, m, n);
+	bidiag(C);
 	pass = pass && testBlackbox(C);
+	// check B == C
+	C.apply(z, x);
+	if (not VD.areEqual(y, z)) {
+		pass = false;
+		LinBox::commentator().report() << "fail: cstor and init disagree" << std::endl;
+	}
+	// copy construction
+	// TriplesBB<Field> D(B);
+	SparseMatrix<Field,SparseMatrixFormat::TPL> D(B);
+	pass = pass && testBlackbox(D);
+	// check B == D
+	D.apply(z, x);
+	if (not VD.areEqual(y, z)) {
+		pass = false;
+		LinBox::commentator().report() << "copy cstor failure" << std::endl;
+	}
+
+	// check that it's deep copy
+	Element a;
+	B.getEntry(a,0,0);
+	F.addin(a, F.one);
+	D.setEntry(0,0,a);
+	D.apply(z, x);
+	if (VD.areEqual(y, z)) {
+		pass = false;
+		LinBox::commentator().report() << "fail changed copy cstor and original agree" << std::endl;
+		VD.write(commentator().report() << "y ", y) << std::endl;
+		VD.write(commentator().report() << "z ", z) << std::endl;
+	}
 
-	commentator().stop("triplesbb black box test suite");
+	commentator().stop("TriplesBB black box test suite");
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
 
diff --git a/tests/test-tutorial.C b/tests/test-tutorial.C
new file mode 100644
index 0000000..c9c2442
--- /dev/null
+++ b/tests/test-tutorial.C
@@ -0,0 +1,64 @@
+/* Copyright 2013 (C) the LinBox group
+ *
+ * Written by :
+ *
+ * ========LICENCE========
+ * This file is part of the library LinBox.
+ *
+  * LinBox is free software: you can redistribute it and/or modify
+ * it under the terms of the  GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * ========LICENCE========
+ */
+
+/*! @file  tests/test-tutorial.C
+ * @ingroup tests
+ *
+ * @brief no doc
+ *
+ * @test no doc.
+ */
+
+
+#include <cstdlib>
+#include <stdio.h>
+
+int main(){
+	bool pass = true;
+	int d;
+	FILE * infile = fopen("tutorial-1.in", "w");
+	fprintf(infile, "2 2\n");
+	fprintf(infile, "3 1\n");
+	fprintf(infile, "1 2\n");
+	fclose(infile);
+
+	system("./tutorial-1 <tutorial-1.in >tutorial-1.out");
+
+	FILE * outfile = fopen("tutorial-1.out", "r");
+	fscanf(outfile, "the determinant is %d", &d);
+	fclose(outfile);
+
+	system("rm tutorial-1.in tutorial-1.out");
+
+	pass = pass and d == 5;
+	return pass? 0 : -1;
+}
+
+// Local Variables:
+// mode: C++
+// tab-width: 8
+// indent-tabs-mode: nil
+// c-basic-offset: 8
+// End:
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
+
diff --git a/tests/test-unparametric-field.C b/tests/test-unparametric-field.C
deleted file mode 100644
index d72244d..0000000
--- a/tests/test-unparametric-field.C
+++ /dev/null
@@ -1,98 +0,0 @@
-
-/* tests/test-unparametric-field.C
- * Copyright (C) 2002 William J. Turner
- *
- * Written by William J. Turner <wjturner at math.ncsu.edu>
- *
- * ------------------------------------
- * 2002-04-10 Bradford Hovinen <hovinen at cis.udel.edu>
- *
- * Renamed from test-unparametric-field.cpp to test-unparametric-field.C, so
- * that we are using the same file naming conventions thoughout the library.
- * ------------------------------------
- *
- * 
- * ========LICENCE========
- * This file is part of the library LinBox.
- * 
- * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- * 
- * This 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
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- *.
- */
-
-/*! @file  tests/test-unparametric-field.C
- * @ingroup tests
- * @brief no doc.
- * @test no doc.
- */
-
-
-#include "linbox/linbox-config.h"
-
-#include <iostream>
-#include <fstream>
-#include <vector>
-
-#include "linbox/field/unparametric.h"
-
-#include "test-common.h"
-#include "test-generic.h"
-
-using namespace LinBox;
-
-int main (int argc, char **argv)
-{
-	static size_t n = 10000;
-
-	static Argument args[] = {
-		{ 'n', "-n N", "Set dimension of test vectors to NxN.", TYPE_INT,     &n },
-		END_OF_ARGUMENTS
-	};
-
-	parseArguments (argc, argv, args);
-
-	cout.flush ();
-	bool pass = true;
-
-	UnparametricField<double> F;
-
-	// Make sure some more detailed messages get printed
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDepth (4);
-	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
-
-ostream &report = commentator().report (Commentator::LEVEL_IMPORTANT, INTERNAL_DESCRIPTION);
-        report << endl << "Unparametrix<double> field test suite" << endl;
-
-	if (!runFieldTests (F, "UnparametricField<double>", 1, n, false)) pass = false;
-
-	FieldArchetype K(new UnparametricField<double>(F));
-
-	if (!testField<FieldArchetype> (K, "Testing archetype with envelope of UnField field"))
-		pass = false;
-	// We're going to allow failed tests here. 
-	// UnparametricField is a tool for building fields and does not of itself produce a LinBox conforming field.
-	// However compilation serves some limited testing value and data is gleaned when the test is run with a report file argument.
-	//return pass ? 0 : -1;
-	return 0;
-}
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/tests/test-vector-domain.C b/tests/test-vector-domain.C
index 6bfb90a..9a05e14 100644
--- a/tests/test-vector-domain.C
+++ b/tests/test-vector-domain.C
@@ -33,12 +33,14 @@
 #include "linbox/linbox-config.h"
 
 #include <iostream>
-#include <vector>
+
 
 #include "linbox/util/commentator.h"
-#include "linbox/field/modular.h"
-#include "linbox/field/PID-integer.h"
+#include "linbox/ring/modular.h"
+#include "linbox/field/gf2.h"
+#include "linbox/vector/blas-vector.h"
 #include "linbox/vector/vector-domain.h"
+#include "linbox/vector/vector-domain-gf2.h"
 #include "linbox/vector/stream.h"
 
 #include "test-vector-domain.h"
@@ -49,21 +51,22 @@ using namespace LinBox;
 template <class Field>
 bool testVectorDomain (const Field &F, const char *text, size_t n, unsigned int iterations)
 {
-	typedef std::vector<typename Field::Element> DenseVector;
-	typedef std::vector<typename Field::Element> SparseSeqVector;
-	typedef std::vector<typename Field::Element> SparseMapVector;
-	typedef std::vector<typename Field::Element> SparseParVector;
-
+	typedef BlasVector<Field> DenseVector;
+	typedef BlasVector<Field> SparseSeqVector;
+	typedef BlasVector<Field> SparseMapVector;
+	typedef BlasVector<Field> SparseParVector;
+    
 	ostringstream str;
 	str << "Testing VectorDomain <" << text << ">" << ends;
 	commentator().start (str.str ().c_str ());
 
 	bool pass = true;
+    typename Field::RandIter gen(F);
 
-	RandomDenseStream<Field, DenseVector> stream1 (F, n, iterations), stream2 (F, n, iterations);
-	RandomSparseStream<Field, SparseSeqVector> stream3 (F, 0.1, n, iterations), stream4 (F, 0.1, n, iterations);
-	RandomSparseStream<Field, SparseMapVector> stream5 (F, 0.1, n, iterations), stream6 (F, 0.1, n, iterations);
-	RandomSparseStream<Field, SparseParVector> stream7 (F, 0.1, n, iterations), stream8 (F, 0.1, n, iterations);
+	RandomDenseStream<Field, DenseVector> stream1 (F, gen, n, iterations), stream2 (F, gen, n, iterations);
+	RandomSparseStream<Field, SparseSeqVector> stream3 (F, gen, 0.1, n, iterations), stream4 (F, gen, 0.1, n, iterations);
+	RandomSparseStream<Field, SparseMapVector> stream5 (F, gen, 0.1, n, iterations), stream6 (F, gen, 0.1, n, iterations);
+	RandomSparseStream<Field, SparseParVector> stream7 (F, gen, 0.1, n, iterations), stream8 (F, gen, 0.1, n, iterations);
 
 	if (!testDotProduct (F, "dense/dense", stream1, stream2)) pass = false;
 	if (!testDotProduct (F, "sparse sequence/dense", stream3, stream1)) pass = false;
@@ -117,12 +120,12 @@ int main (int argc, char **argv)
 {
 	bool pass = true;
 
-	static long n = 100;
+	static unsigned int n = 100;
 	static integer q1("18446744073709551557");
-	static integer q2 = 2147483647U;
-	static integer q3 = 65521U;
+	static integer q2 = 65521;
+	static integer q3 = 1009;
 	static int q4 = 101;
-	static int iterations = 2;
+	static unsigned int iterations = 2;
 
 	static Argument args[] = {
 		{ 'n', "-n N", "Set dimension of test vectors to N.", TYPE_INT,     &n },
@@ -136,10 +139,11 @@ int main (int argc, char **argv)
 
 	parseArguments (argc, argv, args);
 
-	Modular<integer> F_integer (q1);
-	Modular<uint32_t> F_uint32_t ((uint32_t) q2);
-	Modular<uint16_t> F_uint16_t ((uint16_t) q3);
-	Modular<uint8_t> F_uint8_t ((uint8_t) q4);
+	Givaro::Modular<integer> F_integer (q1);
+	Givaro::Modular<uint32_t> F_uint32_t ((uint32_t) q2);
+	Givaro::Modular<uint16_t> F_uint16_t ((uint16_t) q3);
+	Givaro::Modular<uint8_t> F_uint8_t ((uint8_t) q4);
+	GF2 gf2(2);
 
 	commentator().start("Vector domain test suite", "VectorDomain");
 
@@ -148,20 +152,20 @@ int main (int argc, char **argv)
 	commentator().getMessageClass (INTERNAL_DESCRIPTION).setMaxDetailLevel (Commentator::LEVEL_UNIMPORTANT);
 	commentator().getMessageClass (TIMING_MEASURE).setMaxDepth (3);
 
-	if (!testVectorDomain (F_integer, "Modular <integer>", n, iterations)) pass = false;
-	if (!testVectorDomain (F_uint32_t, "Modular <uint32_t>", n, iterations)) pass = false;
-	if (!testVectorDomain (F_uint16_t, "Modular <uint16_t>", n, iterations)) pass = false;
-	if (!testVectorDomain (F_uint8_t, "Modular <uint8_t>", n, iterations)) pass = false;
+	if (!testVectorDomain (F_integer, "Givaro::Modular <integer>", n, iterations)) pass = false;
+	if (!testVectorDomain (F_uint32_t, "Givaro::Modular <uint32_t>", n, iterations)) pass = false;
+	if (!testVectorDomain (F_uint16_t, "Givaro::Modular <uint16_t>", n, iterations)) pass = false;
+	if (!testVectorDomain (F_uint8_t, "Givaro::Modular <uint8_t>", n, iterations)) pass = false;
+//	if (!testVectorDomain (gf2, "GF2", n, iterations)) pass = false;
 
 	commentator().stop("Vector domain test suite");
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-vector-domain.h b/tests/test-vector-domain.h
index d4f7e3a..62795ff 100644
--- a/tests/test-vector-domain.h
+++ b/tests/test-vector-domain.h
@@ -1,19 +1,19 @@
 /* linbox/tests/test-vector-domain.h
  * Copyright (C) 2001, 2002 Bradford Hovinen
- * 
+ *
  * ========LICENCE========
  * This file is part of the library LinBox.
- * 
+ *
  * LinBox is free software: you can redistribute it and/or modify
  * it under the terms of the  GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
- * 
+ *
  * This 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
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -64,24 +64,24 @@ static bool testDotProduct (Field &F, const char *text, LinBox::VectorStream<Vec
 
 	bool ret = true;
 
-	Vector1 v1;
-	Vector2 v2;
+	Vector1 v1(F,stream1.n());
+	Vector2 v2(F,stream2.n());
 	typename Field::Element sigma, rho;
 
 	LinBox::VectorDomain<Field> VD (F);
 
 	size_t j;
 
-	LinBox::VectorWrapper::ensureDim (v1, stream1.n ());
-	LinBox::VectorWrapper::ensureDim (v2, stream2.n ());
+	// LinBox::VectorWrapper::ensureDim (v1, stream1.n ());
+	// LinBox::VectorWrapper::ensureDim (v2, stream2.n ());
 
- Givaro::Timer timer;
+	Givaro::Timer timer;
 	double totaltime = 0.0;
 
 	while (stream1 && stream2) {
 		LinBox::commentator().startIteration ((unsigned)stream1.j ());
 
-		F.init (sigma, 0);
+		F.assign (sigma, F.zero);
 
 		stream1.next (v1);
 		stream2.next (v2);
@@ -152,25 +152,24 @@ static bool testAddMul (Field &F, const char *text, LinBox::VectorStream<Vector>
 	LinBox::commentator().start (str.str ().c_str (), "testAddMul", stream1.m ());
 
 	bool ret = true;
-	bool iter_passed;
 
-	Vector v1, v2, v3, v4;
+	Vector v1(F,stream1.n()), v2(F,stream2.n()), v3(F,stream1.n()), v4(F,stream1.n());
 	typename Field::Element a;
 	typename Field::Element ainv;
 	typename Field::Element aneg;
 	typename Field::RandIter r (F);
 
-	LinBox::VectorWrapper::ensureDim (v1, stream1.n ());
-	LinBox::VectorWrapper::ensureDim (v2, stream2.n ());
-	LinBox::VectorWrapper::ensureDim (v3, stream1.n ());
-	LinBox::VectorWrapper::ensureDim (v4, stream1.n ());
+	// LinBox::VectorWrapper::ensureDim (v1, stream1.n ());
+	// LinBox::VectorWrapper::ensureDim (v2, stream2.n ());
+	// LinBox::VectorWrapper::ensureDim (v3, stream1.n ());
+	// LinBox::VectorWrapper::ensureDim (v4, stream1.n ());
 
 	LinBox::VectorDomain<Field> VD (F);
 
 	while (stream1 && stream2) {
 		LinBox::commentator().startIteration ((unsigned)stream1.j ());
 
-		iter_passed = true;
+		bool iter_passed = true;
 
 		stream1.next (v1);
 		stream2.next (v2);
@@ -255,25 +254,24 @@ static bool testSubMul (Field &F, const char *text, LinBox::VectorStream<Vector>
 	LinBox::commentator().start (str.str ().c_str (), "testSubMul", stream1.m ());
 
 	bool ret = true;
-	bool iter_passed;
 
-	Vector v1, v2, v3, v4;
+	Vector v1(F,stream1.n()), v2(F,stream2.n()), v3(F,stream1.n()), v4(F,stream1.n());
 	typename Field::Element a;
 	typename Field::Element ainv;
 	typename Field::Element aneg;
 	typename Field::RandIter r (F);
 
-	LinBox::VectorWrapper::ensureDim (v1, stream1.n ());
-	LinBox::VectorWrapper::ensureDim (v2, stream2.n ());
-	LinBox::VectorWrapper::ensureDim (v3, stream1.n ());
-	LinBox::VectorWrapper::ensureDim (v4, stream1.n ());
+	// LinBox::VectorWrapper::ensureDim (v1, stream1.n ());
+	// LinBox::VectorWrapper::ensureDim (v2, stream2.n ());
+	// LinBox::VectorWrapper::ensureDim (v3, stream1.n ());
+	// LinBox::VectorWrapper::ensureDim (v4, stream1.n ());
 
 	LinBox::VectorDomain<Field> VD (F);
 
 	while (stream1 && stream2) {
 		LinBox::commentator().startIteration ((unsigned)stream1.j ());
 
-		iter_passed = true;
+		bool iter_passed = true;
 
 		stream1.next (v1);
 		stream2.next (v2);
@@ -356,25 +354,24 @@ static bool testAXPY (Field &F, const char *text, LinBox::VectorStream<Vector> &
 	LinBox::commentator().start (str.str ().c_str (), "testAXPY", stream1.m ());
 
 	bool ret = true;
-	bool iter_passed;
 
-	Vector v1, v2, v3, v4;
+	Vector v1(F,stream1.n()), v2(F,stream2.n()), v3(F,stream1.n()), v4(F,stream1.n());
 	typename Field::Element a;
 	typename Field::Element ainv;
 	typename Field::Element aneg;
 	typename Field::RandIter r (F);
 
-	LinBox::VectorWrapper::ensureDim (v1, stream1.n ());
-	LinBox::VectorWrapper::ensureDim (v2, stream2.n ());
-	LinBox::VectorWrapper::ensureDim (v3, stream1.n ());
-	LinBox::VectorWrapper::ensureDim (v4, stream1.n ());
+	// LinBox::VectorWrapper::ensureDim (v1, stream1.n ());
+	// LinBox::VectorWrapper::ensureDim (v2, stream2.n ());
+	// LinBox::VectorWrapper::ensureDim (v3, stream1.n ());
+	// LinBox::VectorWrapper::ensureDim (v4, stream1.n ());
 
 	LinBox::VectorDomain<Field> VD (F);
 
 	while (stream1 && stream2) {
 		LinBox::commentator().startIteration ((unsigned)stream1.j ());
 
-		iter_passed = true;
+		bool iter_passed = true;
 
 		stream1.next (v1);
 		stream2.next (v2);
@@ -439,20 +436,19 @@ static bool testCopyEqual (Field &F, const char *text, LinBox::VectorStream<Vect
 	LinBox::commentator().start (str.str ().c_str (), "testCopyEqual", stream.m ());
 
 	bool ret = true;
-	bool iter_passed;
 
-	Vector1 v;
-	Vector2 w;
+	Vector1 v(F,stream.n());
+	Vector2 w(F,stream.n());
 
-	LinBox::VectorWrapper::ensureDim (v, stream.n ());
-	LinBox::VectorWrapper::ensureDim (w, stream.n ());
+	// LinBox::VectorWrapper::ensureDim (v, stream.n ());
+	// LinBox::VectorWrapper::ensureDim (w, stream.n ());
 
 	LinBox::VectorDomain<Field> VD (F);
 
 	while (stream) {
 		LinBox::commentator().startIteration ((unsigned)stream.j ());
 
-		iter_passed = true;
+		bool iter_passed = true;
 
 		stream.next (v);
 		VD.copy (w, v);
@@ -485,11 +481,10 @@ static bool testCopyEqual (Field &F, const char *text, LinBox::VectorStream<Vect
 
 #endif // __LINBOX_test_vector_domain_H
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-zero-one.C b/tests/test-zero-one.C
index 77d6f9f..bc1e51c 100644
--- a/tests/test-zero-one.C
+++ b/tests/test-zero-one.C
@@ -28,13 +28,13 @@
  */
 
 
+#include <linbox/linbox-config.h>
 
 #include <iostream>
-#include <vector>
 #include <utility>
 
 #include "linbox/blackbox/zero-one.h"
-#include "linbox/field/modular.h"
+#include "linbox/ring/modular.h"
 
 #include "test-common.h"
 #include "test-generic.h"
@@ -57,9 +57,9 @@ int main(int argc, char **argv)
 
 	parseArguments(argc, argv, args);
 
-	typedef LinBox::ZeroOne<LinBox::Modular<uint32_t> > Matrix;
+	typedef LinBox::ZeroOne<Givaro::Modular<uint32_t> > Matrix;
 
-	LinBox::Modular<uint32_t> afield(prime);
+	Givaro::Modular<uint32_t> afield(prime);
 
 	rows = new size_t[3 * n];
 	cols = new size_t[3 * n];
@@ -70,21 +70,22 @@ int main(int argc, char **argv)
 	for(i = 0; i < n; i++) { rows[2*n+i] = i; cols[2*n+i] = i; } // diag
 	Matrix testMatrix(afield, rows, cols, n, n, 3*n - 2);
 
-	/*
+#if 0
 	   for(i = 0; i < n; i++) { rows[i] = i; cols[i] = i; } // diag
 	   Matrix testMatrix(afield, rows, cols, n, n, n);
-	   */
-	/*
+#endif
+
+#if 0
 	   Matrix testMatrix(afield);
 	   ifstream mat_in("data/n4c6.b9.186558x198895.sms");
 	   testMatrix.read(mat_in);
 	   std::cout << testMatrix.rowdim() << " " << testMatrix.coldim() << " " << testMatrix.nnz() << std::endl;
-	   */
+#endif
 
 
 	commentator().start("ZeroOne matrix blackbox test suite", "ZeroOne");
 
-	pass = pass && testBlackbox(testMatrix);
+	pass = pass && testBlackboxNoRW(testMatrix);
 
 	delete [] rows;
 	delete [] cols;
@@ -93,11 +94,10 @@ int main(int argc, char **argv)
 	return pass ? 0 : -1;
 }
 
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
 // Local Variables:
 // mode: C++
 // tab-width: 8
 // indent-tabs-mode: nil
 // c-basic-offset: 8
 // End:
-
+// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,\:0,t0,+0,=s
diff --git a/tests/test-zo.C b/tests/test-zo.C
deleted file mode 100644
index 858e93a..0000000
--- a/tests/test-zo.C
+++ /dev/null
@@ -1,137 +0,0 @@
-/* Copyright (C) LinBox
- *
- *
- *
- * ========LICENCE========
- * This file is part of the library LinBox.
- *
-  * LinBox is free software: you can redistribute it and/or modify
- * it under the terms of the  GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * ========LICENCE========
- */
-
-/*! @file  tests/test-zo.C
- * @ingroup tests
- *
- * @brief no doc
- *
- * @test no doc.
- */
-
-
-
-#include <fstream>
-#include <iostream>
-#include <vector>
-#include <set>
-#include <utility>
-
-#include "linbox/blackbox/zo.h"
-#include "linbox/blackbox/transpose.h"
-#include "linbox/field/modular.h"
-#include "linbox/util/commentator.h"
-
-
-#include "test-common.h"
-#include "test-blackbox.h"
-
-int main(int argc, char **argv)
-{
-  bool pass = true;
-  uint32_t prime = 31337;
-  static size_t n = 100000;
-
-  static Argument args[] =
-  {
-	  { 'n', "-n N", "Set dimension of test matrix to NxN.", TYPE_INT, &n },
-	  { 'q', "-q Q", "Operate over the \"field\" GF(Q) [1].", TYPE_INT, &prime },
-	  END_OF_ARGUMENTS
-  };
-
-  LinBox::parseArguments(argc, argv, args);
-
-  typedef LinBox::Modular<uint32_t> Field;
-  //typedef LinBox::Modular<uint32_t> Field;
-  typedef LinBox::ZeroOne<Field> Matrix;
-
-  Field afield(prime);
-
-  /*
-  // "arrow" matrix
-  size_t *rows, *cols, i;
-  rows = new size_t[3 * n + 1 - 2];
-  cols = new size_t[3 * n + 1 - 2];
-
-  for(i = 0; i < n; i++) { rows[i] = 0; cols[i] = i; } // first row
-  for(i = 0; i < n - 1; i++)
-    { rows[n+2*i] = i + 1; cols[n+2*i] = 0; rows[n+2*i+1] = i + 1; cols[n+2*i+1] = i + 1; } // first col and the diag
-  Matrix testMatrix(afield, rows, cols, n, n, 3 * n - 2);
-  */
-
-// random 3 per row matrix
-	size_t *rows, *cols, i;
-	const size_t npr = n / 10000;
-	rows = new size_t[npr * n];
-	cols = new size_t[npr * n];
-
-    for(i = 0; i < n; i++)
-        {
-            set<size_t> a;
-            while( a.size() < npr )
-                a.insert(rand()%n);
-            size_t j = 0;
-            for(set<size_t>::iterator iter = a.begin(); j < npr; ++j, ++iter)
-                {
-                    rows[npr*i+j] = i;
-                    cols[npr*i+j] = *iter;
-                    //std::cout << rows[npr*i+j] << ", ";
-                }
-            //std::cout << std::endl;
-        }
-    Matrix testMatrix(afield, rows, cols, n, n, npr * n );
-
-  /*
-  Matrix testMatrix(afield);
-  //ifstream mat_in("data/m133.b3.200200x200200.sms");
-  ifstream mat_in("data/n4c6.b9.186558x198895.sms");
-  //ifstream mat_in("data/small21x21.sms");
-  //testMatrix.read(mat_in);
-  testMatrix.read(cin);
-  //LinBox::Transpose<Matrix> testMat(testMatrix);
-  */
-
-  //print out the dimensions and the number of non-zero entries of the matrix
-  //std::cout << testMatrix.rowdim() << " " << testMatrix.coldim() << " " << testMatrix.nnz() << std::endl;
-
-
-  //std::cout << std::endl << "ZeroOne matrix blackbox test suite" << std::endl;
-
-  pass = pass && testBlackbox(testMatrix);
-  //bool pass2 = testBlackbox(testMat);
-
-  //delete [] rows;
-  //delete [] cols;
-
-  //return pass&&pass2 ? 0 : -1;
-  return pass ? 0 : -1;
-}
-
-// vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
-// Local Variables:
-// mode: C++
-// tab-width: 8
-// indent-tabs-mode: nil
-// c-basic-offset: 8
-// End:
-
diff --git a/tests/test_leak.sh b/tests/test_leak.sh
new file mode 100644
index 0000000..89782a4
--- /dev/null
+++ b/tests/test_leak.sh
@@ -0,0 +1,61 @@
+#!/bin/bash - 
+
+# Copyright (c) 2010 the LinBox group
+# written by Brice Boyer (briceboyer) <boyer.brice at gmail.com>
+# This file is part of LinBox
+# ========LICENCE========
+# This file is part of the library LinBox.
+#
+# LinBox is free software: you can redistribute it and/or modify
+# it under the terms of the  GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+# ========LICENCE========
+#/
+
+
+
+
+# fast check (pwd = linbox/tests ; make check )
+# for i in `find ./ -executable -type f | grep -v benchmark` ; do  valgrind $i ; done 2>&1 | less
+
+# doc :
+# recompiles a test-* and valgrinds it.
+
+if [ $# -ne 1 ]
+then
+	echo "Usage: `basename $0` prog"
+	exit -1
+fi
+
+if [ ! -f "${1}.C" ] 
+then
+	echo "not a test"
+	exit -2
+fi
+
+if [ -f "${1}.o" ] 
+then
+	/bin/rm $1.o
+else
+	echo "pas de $1.o"
+fi	
+
+make $1 CXXFLAGS+="-O0 -g -DDEBUG" 
+
+valgrind --leak-check=full --show-reachable=yes ./$1
+
+exit 0
+
+set -o nounset                              # Treat unset variables as an error
+
+
diff --git a/tests/tests.doxy b/tests/tests.doxy
index 1198179..7de3324 100644
--- a/tests/tests.doxy
+++ b/tests/tests.doxy
@@ -27,9 +27,9 @@
  *  \brief Correctness tests for LinBox components.
  *
  *  These tests are to aid development and serve for unit and regression testing.
- *  Some contain useful timing measurements.
+ *  Some contain useful timing measurements.  
  *
- *  Do <code>make tests</code> to try the lot.
+ *  Do <code>make fullcheck</code> to try the lot.
  *  See checker.C for more information on LinBox tests.
  *
  *  There are some benchmarks.  For instance benchmark-fields is intended to help

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/linbox.git



More information about the debian-science-commits mailing list